@devflow-tools/devflow 0.16.0 → 0.16.2
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 +78 -49
- package/dist/dashboard/404.html +1 -1
- package/dist/dashboard/_next/static/chunks/{736-db1a009357c222d2.js → 384-484184f146e1b764.js} +1 -1
- package/dist/dashboard/_next/static/chunks/{429-eac85fdc49353ed8.js → 429-3a8e078af4ea04bd.js} +1 -1
- package/dist/dashboard/_next/static/chunks/app/accuracy/{page-ca6a419d8b29eb4f.js → page-3b8b7448c9c7aeee.js} +1 -1
- package/dist/dashboard/_next/static/chunks/app/benchmark/page-d8f3f089f1d15cc7.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/context/{page-1874ae1050524cb6.js → page-480f7324dee9cf74.js} +1 -1
- package/dist/dashboard/_next/static/chunks/app/doctor/{page-d542f2ab8d6a1c59.js → page-c32c81c69968099f.js} +1 -1
- package/dist/dashboard/_next/static/chunks/app/executions/{page-b98ec834dcda8d93.js → page-bee250062acc03a8.js} +1 -1
- package/dist/dashboard/_next/static/chunks/app/graph/{page-f0e7e15288791e9c.js → page-75947209e5b7741c.js} +1 -1
- package/dist/dashboard/_next/static/chunks/app/knowledge/{page-86808abd0d47c026.js → page-61a2d663940fb04b.js} +1 -1
- package/dist/dashboard/_next/static/chunks/app/{layout-4b78776412bd4fee.js → layout-572650e435947896.js} +1 -1
- package/dist/dashboard/_next/static/chunks/app/memory/{page-e169762426ac7a23.js → page-71d7c8926179b065.js} +1 -1
- package/dist/dashboard/_next/static/chunks/app/{page-c3e980fb2621470c.js → page-10dcf844701d7903.js} +1 -1
- package/dist/dashboard/_next/static/chunks/app/replay/{page-a8a465ed885df0cf.js → page-f354eb8ed0bfbb11.js} +1 -1
- package/dist/dashboard/_next/static/chunks/app/runs/[id]/{page-cc1d5182707fca5b.js → page-ffc0fda72263722c.js} +1 -1
- package/dist/dashboard/_next/static/chunks/app/runs/{page-bbf0a58abd70430c.js → page-4da6997bddcfeb45.js} +1 -1
- package/dist/dashboard/_next/static/chunks/app/settings/{page-9602ff45892e7910.js → page-0fa1d3b02152a97c.js} +1 -1
- package/dist/dashboard/_next/static/chunks/app/timeline/{page-a8eb3caf23be8a86.js → page-b676878a19561da3.js} +1 -1
- package/dist/dashboard/_next/static/chunks/app/tool-metrics/{page-1f86f62b187f2b5e.js → page-6452423bc1f543ec.js} +1 -1
- package/dist/dashboard/_next/static/chunks/app/workflows/{page-551939c9e86b26c6.js → page-0ff0044616ac56aa.js} +1 -1
- package/dist/dashboard/_next/static/chunks/main-app-cf693a9b955f073e.js +1 -0
- package/dist/dashboard/accuracy.html +1 -1
- package/dist/dashboard/accuracy.txt +3 -3
- package/dist/dashboard/benchmark.html +1 -1
- package/dist/dashboard/benchmark.txt +3 -3
- package/dist/dashboard/context.html +1 -1
- package/dist/dashboard/context.txt +3 -3
- package/dist/dashboard/doctor.html +1 -1
- package/dist/dashboard/doctor.txt +3 -3
- package/dist/dashboard/executions.html +1 -1
- package/dist/dashboard/executions.txt +3 -3
- package/dist/dashboard/graph.html +1 -1
- package/dist/dashboard/graph.txt +3 -3
- package/dist/dashboard/index.html +1 -1
- package/dist/dashboard/index.txt +3 -3
- package/dist/dashboard/knowledge.html +1 -1
- package/dist/dashboard/knowledge.txt +3 -3
- package/dist/dashboard/memory.html +1 -1
- package/dist/dashboard/memory.txt +3 -3
- package/dist/dashboard/replay.html +1 -1
- package/dist/dashboard/replay.txt +3 -3
- package/dist/dashboard/runs/_.html +1 -1
- package/dist/dashboard/runs/_.txt +3 -3
- package/dist/dashboard/runs.html +1 -1
- package/dist/dashboard/runs.txt +3 -3
- package/dist/dashboard/settings.html +1 -1
- package/dist/dashboard/settings.txt +3 -3
- package/dist/dashboard/timeline.html +1 -1
- package/dist/dashboard/timeline.txt +3 -3
- package/dist/dashboard/tool-metrics.html +1 -1
- package/dist/dashboard/tool-metrics.txt +3 -3
- package/dist/dashboard/workflows.html +1 -1
- package/dist/dashboard/workflows.txt +3 -3
- package/dist/hooks/hook-client.js +5 -5
- package/dist/hooks/hook-daemon.js +11 -11
- package/dist/hooks/post-tool-use-failure.js +2 -2
- package/dist/hooks/post-tool-use.js +3 -3
- package/dist/hooks/pre-compact.js +2 -2
- package/dist/hooks/pre-tool-use.js +2 -2
- package/dist/hooks/session-end.js +2 -2
- package/dist/hooks/stop.js +2 -2
- package/dist/hooks/user-prompt-submit.js +3 -2
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/CLAUDE.md +34 -0
- package/dist/plugin/dist/command-registry.json +297 -0
- package/dist/plugin/dist/hooks/hook-client.js +5 -5
- package/dist/plugin/dist/hooks/hook-daemon.js +11 -11
- package/dist/plugin/dist/hooks/post-tool-use-failure.js +2 -2
- package/dist/plugin/dist/hooks/post-tool-use.js +3 -3
- package/dist/plugin/dist/hooks/pre-compact.js +2 -2
- package/dist/plugin/dist/hooks/pre-tool-use.js +2 -2
- package/dist/plugin/dist/hooks/session-end.js +2 -2
- package/dist/plugin/dist/hooks/stop.js +2 -2
- package/dist/plugin/dist/hooks/user-prompt-submit.js +3 -2
- 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 +96 -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 +249 -0
- package/dist/plugin/hooks/stop +27 -0
- package/dist/plugin/hooks/user-prompt-submit +19 -0
- package/dist/plugin/package.json +43 -0
- package/dist/plugin/skills/{devflow:react → react}/SKILL.md +16 -3
- package/package.json +13 -13
- package/plugin-registry.json +29 -29
- package/dist/dashboard/_next/static/chunks/app/benchmark/page-6c6d0acbcde4eb85.js +0 -1
- package/dist/dashboard/_next/static/chunks/main-app-202a5f91ead17fa7.js +0 -1
- /package/dist/dashboard/_next/static/{n_2t1_63toasXsidAssD9 → ZaapgyqOj6AXHY5zdw6_X}/_buildManifest.js +0 -0
- /package/dist/dashboard/_next/static/{n_2t1_63toasXsidAssD9 → ZaapgyqOj6AXHY5zdw6_X}/_ssgManifest.js +0 -0
- /package/dist/plugin/{hooks.json → hooks/hooks.json} +0 -0
- /package/dist/plugin/skills/{devflow:animation → animation}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:context → context}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:css → css}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:docker → docker}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:doctor → doctor}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:electron → electron}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:git → git}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:graph → graph}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:graphql → graphql}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:knowledge → knowledge}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:memory → memory}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:nest → nest}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:nextjs → nextjs}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:performance → performance}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:start → start}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:tailwind → tailwind}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:taro → taro}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:ui-layout → ui-layout}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:vue → vue}/SKILL.md +0 -0
- /package/dist/plugin/skills/{devflow:workflow → workflow}/SKILL.md +0 -0
package/dist/cli.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
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,
|
|
3
|
-
`)}
|
|
2
|
+
import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,rmSync,cpSync,writeFileSync as writeFileSync$1,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 Wr,{existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,statSync,rmSync as rmSync$1}from'fs';import gl,{join,dirname as dirname$1,resolve as resolve$1}from'path';import {homedir}from'os';import {createRequire}from'module';import Rn 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 S from'chalk';import Si 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 zr=Object.defineProperty;var C=(e,t)=>()=>(e&&(t=e(e=0)),t);var $=(e,t)=>{for(var n in t)zr(e,n,{get:t[n],enumerable:true});};function wn(){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 vn(e){let t={};if(existsSync$1(e))try{t=JSON.parse(readFileSync$1(e,"utf-8"));}catch{console.warn("Warning: Could not parse settings.json, skipping plugin enablement");return}else mkdirSync$1(dirname(e),{recursive:true});let n=X(t.enabledPlugins)?t.enabledPlugins:{};n[Ue]=true,t.enabledPlugins=n;let o=join$1(dirname(e),"plugins","marketplaces",me),r=X(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};r[me]={source:{source:"directory",path:o}},t.extraKnownMarketplaces=r,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
|
|
3
|
+
`);}function kn(e,t){let n=join$1(e,".claude"),o=join$1(n,"mcp.json"),r={};if(existsSync$1(o))try{r=JSON.parse(readFileSync$1(o,"utf-8"));}catch{console.warn("Warning: Could not parse existing mcp.json, skipping MCP config");return}else mkdirSync$1(n,{recursive:true});let s=r.mcpServers??{};s.devflow||(s.devflow={command:t,args:[],env:{}},r.mcpServers=s,writeFileSync$1(o,JSON.stringify(r,null,2)));}function bn(e,t,n,o){let r=join$1(t,me,yn,n);rmSync(r,{recursive:true,force:true}),mkdirSync$1(r,{recursive:true});let s=join$1(e,"hooks");existsSync$1(s)&&We(s,join$1(r,"hooks"));for(let u of ["CLAUDE.md","package.json"]){let l=join$1(e,u);existsSync$1(l)&&cpSync(l,join$1(r,u),{force:true});}let i=join$1(e,".claude-plugin","plugin.json");existsSync$1(i)&&(mkdirSync$1(join$1(r,".claude-plugin"),{recursive:true}),cpSync(i,join$1(r,".claude-plugin","plugin.json"),{force:true}));let a=join$1(e,"dist");existsSync$1(a)&&We(a,join$1(r,"dist"));let c=join$1(e,"skills");existsSync$1(c)&&We(c,join$1(r,"skills")),ns(r,e),os(r),es(t,r),ts(t,r,n);}function es(e,t){let n=join$1(e,".."),o=join$1(n,"marketplaces",me),r=join$1(o,".claude-plugin");mkdirSync$1(r,{recursive:true});let s=relative(o,t).replaceAll("\\","/");s.startsWith(".")||(s=`./${s}`),writeFileSync$1(join$1(r,"marketplace.json"),`${JSON.stringify({name:me,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:yn,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(!X(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[me]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
|
|
5
|
+
`);}function ts(e,t,n){let o=join$1(e,"..","installed_plugins.json"),r={version:2,plugins:{}};if(existsSync$1(o)){let f;try{f=JSON.parse(readFileSync$1(o,"utf-8"));}catch{throw new Error(`Could not parse Claude plugin registry: ${o}`)}if(!X(f))throw new Error(`Invalid Claude plugin registry: ${o}`);r=f;}else mkdirSync$1(dirname(o),{recursive:true});let s=r.plugins;if(s!==void 0&&!X(s))throw new Error(`Invalid Claude plugin registry plugins: ${o}`);let i=s??{},a=i[Ue];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${Ue}`);let c=a??[],u=c.find(f=>X(f)&&f.scope==="user"),l=new Date().toISOString(),d=X(u)&&typeof u.installedAt=="string"?u.installedAt:l,g=c.filter(f=>!X(f)||f.scope!=="user");i[Ue]=[...g,{scope:"user",installPath:t,version:n,installedAt:d,lastUpdated:l}],r.version=2,r.plugins=i,writeFileSync$1(o,`${JSON.stringify(r,null,2)}
|
|
6
|
+
`);}function X(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ns(e,t){let n=join$1(e,"package.json");if(!existsSync$1(n))return;let o=JSON.parse(readFileSync$1(n,"utf-8")),r=Object.keys(o.dependencies??{});if(r.length===0)return;let s={...process.env};delete s.npm_config_allow_scripts,delete s.NPM_CONFIG_ALLOW_SCRIPTS;let i=r.filter(u=>u.startsWith("@devflow-tools/")),a=i.map(u=>join$1(t,"../../packages",u.slice(15))).filter(u=>existsSync$1(join$1(u,"package.json"))),c=["install","--omit=dev","--no-audit","--no-fund","--package-lock=false"];if(i.length>0&&a.length===i.length){c.push("--no-save","--install-links",...a);for(let u of i)rmSync(join$1(e,"node_modules",...u.split("/")),{recursive:true,force:true});}execFileSync("npm",c,{cwd:e,env:s,stdio:"inherit",timeout:1800*1e3});}function We(e,t){mkdirSync$1(t,{recursive:true});for(let n of readdirSync(e)){let o=join$1(e,n),r=join$1(t,n);statSync$1(o).isDirectory()?We(o,r):cpSync(o,r,{force:true});}}function os(e){let t=join$1(e,"..");if(!existsSync$1(t))return;let n=e.split("/").pop()??"";for(let o of readdirSync(t))if(o!==n){let r=join$1(t,o);statSync$1(r).isDirectory()&&rmSync(r,{recursive:true,force:true});}}var Ue,me,yn,Sn=C(()=>{Ue="devflow@devflow-local",me="devflow-local",yn="devflow";});var Cn={};$(Cn,{initProject:()=>us,renderInitReport:()=>Dn});async function us(e,t={}){let n=join(e,".devflow"),o=[];existsSync(n)||(mkdirSync(n,{recursive:true}),o.push(".devflow/"));let r=join(n,"config.json");(!existsSync(r)||t.force)&&(writeFileSync(r,JSON.stringify({version:"0.1.0",initialized:new Date().toISOString()},null,2),"utf-8"),o.push(".devflow/config.json"));let s={created:o,pluginDeployed:false,pluginEnabled:false,mcpConfigured:false};if(En.isInitialized(e)||await En.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);o.push(".devflow/onboarding-pack.json");let a=join(n,"init-report.md");writeFileSync(a,Dn(i),"utf-8"),o.push(".devflow/init-report.md"),s.onboardingPack=i;}catch(i){console.warn(`Warning: Onboarding pack generation skipped \u2014 ${i.message}`);}try{let i=wn(),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";bn(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");vn(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=ls.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}kn(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function Dn(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 En,ls,xn=C(()=>{Sn();En=Rn.default??Rn,ls=createRequire(import.meta.url);});var $n={};$($n,{reviewPluginMemoryHints:()=>ms});async function ms(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(ps).filter(Boolean));if(!o||r.size===0)return {available:0,selected:0};let s=await(n.load??loadPlugins)(),i=[];for(let l of r){let d=s.get(l);for(let g of d?.memory?.project?.conventions??[])i.push({id:`${l}:${g.key}`,pluginName:l,convention:g});}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??hs)(e,u),{available:i.length,selected:u.length}}function ps(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function hs(e,t){let n=new MemoryGate(e);try{for(let o of t)await n.addMemory({category:"project_knowledge",content:`${o.convention.key}: ${o.convention.value}`,originalText:o.convention.value,source:"manual",confidence:o.convention.confidence,scope:`plugin:${o.pluginName}`});}finally{n.close();}}var An=C(()=>{});function pe(){let e=[join(process.cwd(),"plugin-registry.json"),join(Ss,"../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 On(){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 bs,Ss,He=C(()=>{bs=fileURLToPath$1(import.meta.url),Ss=dirname$1(bs);});var yt={};$(yt,{detectTechStack:()=>Tn,guidePluginInstallation:()=>Ds,installPluginsFromList:()=>Es,resolvePluginName:()=>In});function Tn(e){let t=[];try{let n=JSON.parse(readFileSync(join(e,"package.json"),"utf-8")),o={...n.dependencies??{},...n.devDependencies??{}};o.react&&t.push("react"),o.next&&t.push("nextjs"),o.vue&&t.push("vue"),o.tailwindcss&&t.push("tailwind"),(o.nest||o["@nestjs/core"])&&t.push("nest"),o.express&&t.push("express"),o.typescript&&t.push("typescript");}catch{}return t}function In(e){let t=e.trim();return t.startsWith("@devflow-tools/")?t:`@devflow-tools/${t}`}async function Es(e){let t=e.split(",").map(In).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 Ds(e){let t=pe();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=
|
|
11
|
+
`);let n=Tn(e);n.length>0&&console.log(`Detected tech stack: ${n.join(", ")}
|
|
8
12
|
`);let o=new Set(t.plugins.filter(i=>i.compatibleStacks.some(a=>n.includes(a))).map(i=>i.name));if(!process.stdout.isTTY){console.log(`Non-interactive terminal detected. Installing recommended plugins...
|
|
9
13
|
`);let i=[...o];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 r=t.plugins.map(i=>({name:`${i.name.replace("@devflow-tools/","")} - ${i.description.substring(0,50)}`,value:i.name,checked:o.has(i.name)})),s;try{s=await checkbox({message:"Select plugins to install (space to select, enter to confirm):",choices:r});}catch{return console.log(`
|
|
10
14
|
Plugin installation cancelled.
|
|
@@ -14,23 +18,32 @@ 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
|
|
18
|
-
INSERT INTO main.${
|
|
19
|
-
SELECT ${
|
|
20
|
-
WHERE NOT EXISTS (SELECT 1 FROM main.${
|
|
21
|
-
`);}o[i]=(o[i]??0)+(
|
|
22
|
-
[${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await
|
|
23
|
-
Reviewed ${o}/${t.length} pending memories.`);}var
|
|
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],o=parseInt(n,10);return isNaN(o)?null:o}async function
|
|
26
|
-
${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function
|
|
21
|
+
`);return s}var wt=C(()=>{He();});var qn={};$(qn,{ResetExecutionError:()=>_e,executeResetCommand:()=>Vs,formatResetResult:()=>_t,runReset:()=>Kn});function Us(){if(Ke)return Ke;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Ke=e.DatabaseSync,Ke}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function _t(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function Ws(e){return e==="all"||Un.includes(e)}function G(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function kt(e){let t=resolve(e),n=[];for(;!G(t);){let o=dirname(t);if(o===t)throw new Error(`Cannot resolve path: ${e}`);n.unshift(basename(t)),t=o;}return resolve(realpathSync(t),...n)}function Pt(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function Bs(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 Wn(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=G(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(G(t)){let o=realpathSync(t);if(!Pt(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function Hs(e,t){return (e==="all"?Un:[e]).map(o=>({scope:o,path:join$1(t,...Fn[o])}))}function Bn(e,t){let n=G(t);if(n)return Wn(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function Hn(e,t){let n=Bn(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 Ks(e){let t=G(e);if(!t?.isFile()||t.size<vt.length)return false;let n=Buffer.alloc(vt.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(vt)}finally{closeSync(o);}}function qs(e){let t=[];function n(o){let r=lstatSync(o);if(!r.isSymbolicLink()){if(r.isDirectory()){for(let s of readdirSync(o).sort())n(join$1(o,s));return}Ks(o)&&t.push(o);}}return n(e),t}function Gs(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(Us())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function zs(e,t,n){let o=qs(e),r=new Set;for(let s of o)r.add(s),r.add(`${s}-journal`),r.add(`${s}-shm`),r.add(`${s}-wal`);n(),cpSync(e,t,{recursive:true,filter:s=>!r.has(s)});for(let s of o){n();let i=join$1(t,relative(e,s));Gs(s,i);}}function Js(e,t,n,o,r){let s=!!G(t),i,a=[];try{mkdirSync$1(t,{recursive:!0}),i=mkdtempSync(join$1(t,".devflow-reset-"));for(let c of n)r.beforeBackup(c.path),zs(c.path,join$1(i,c.scope),()=>Hn(e,c));for(let c of n){let u=join$1(i,c.scope),l=join$1(t,c.scope);if(G(l))throw new Error(`Backup destination already exists: ${l}`);r.renamePath(u,l),a.push(l),o.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&&G(t))try{rmdirSync(t);}catch{}}}function Kn(e,t={}){if(!Ws(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=Bs(e.project??process.cwd()),o=Hs(e.scope,n);for(let c of o)Wn(n,c.path);if(!e.backupTo&&!e.force)throw new Error("Refusing to reset without a backup. Provide --backup-to <dir> or use --force.");let r=o.flatMap(c=>{let u=Bn(n,c.path);return u?[{...c,identity:u}]:[]}),s=e.backupTo?kt(e.backupTo):void 0;if(s){let c=G(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let u of r){let l=kt(u.path),d=join$1(s,u.scope),g=kt(d);if(Pt(l,g)||Pt(g,l))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${g}`);if(G(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&&r.length>0&&Js(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),Hn(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 Vs(e,t={},n=console){try{let o=Kn(e,t),r=_t(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof _e)for(let r of _t(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var Ke,_e,Fn,Un,vt,Gn=C(()=>{_e=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Fn={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},Un=Object.keys(Fn),vt=Buffer.from("SQLite format 3\0","binary");});var to={};$(to,{consolidateDatabases:()=>Xs,formatConsolidateResult:()=>ei});function Xs(e){let t=resolve(e.project),n=e.globalDbPath??getGlobalDevFlowDbPath(),o=join$1(t,".devflow","devflow.db"),r=join$1(t,".codegraph","codegraph.db");if(resolve(n)===resolve(o))throw new Error("The global target database cannot be the project-local legacy database");let s=existsSync$1(n),i=[Jn("project",o,s?n:void 0),Jn("codegraph",r,s?n:void 0)],a={dryRun:!!e.dryRun,targetPath:n,sources:i,inserted:{},retired:[]};if(e.dryRun)return a;let c=i.filter(f=>f.exists&&Object.keys(f.tables).length>0),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 g=c.some(f=>f.kind==="project")?ti(o):null;try{let f=new Map;for(let w of c){let v=join$1(d,`${w.kind}-${basename(w.path)}.snapshot`);Vn(w.path,v),f.set(w.kind,v);}s&&Vn(n,join$1(d,"global-devflow.db.before"));let m=f.has("project")?oi(o,d):[];a.retired.push(...m.map(w=>w.destination));let p=null,y=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),p=new DatabaseSync(n),p.exec("PRAGMA busy_timeout = 10000"),p.exec(DEVFLOW_SCHEMA_SQL),f.has("project")&&p.prepare("ATTACH DATABASE ? AS project_source").run(f.get("project")),f.has("codegraph")&&p.prepare("ATTACH DATABASE ? AS codegraph_source").run(r),p.exec("BEGIN IMMEDIATE"),y=!0,f.has("project")&&Yn(p,"project_source",void 0,a.inserted),f.has("codegraph")){Yn(p,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let v of Ee(p,"codegraph_source").filter(_=>_.startsWith("devflow_")))p.exec(`DROP TABLE codegraph_source.${T(v)}`);}p.exec("COMMIT"),y=!1;}catch(w){if(y)try{p?.exec("ROLLBACK");}catch{}throw eo(m),w}finally{p?.close();}return a}finally{ni(g);}}function ei(e){let t=[`${e.dryRun?"Dry run":"Consolidated"} target: ${e.targetPath}`];for(let n of e.sources){let o=Object.values(n.tables).reduce((s,i)=>s+i,0),r=Object.values(n.conflicts).reduce((s,i)=>s+i,0);t.push(`${n.kind}: ${n.exists?`${o} rows, ${r} conflicts`:"not found"} (${n.path})`);}if(!e.dryRun){let n=Object.values(e.inserted).reduce((o,r)=>o+r,0);t.push(`Inserted: ${n} rows`),e.backupDir&&t.push(`Backup: ${e.backupDir}`);}return t}function Jn(e,t,n){let o={kind:e,path:t,exists:existsSync$1(t),tables:{},conflicts:{}};if(!o.exists)return o;let r=new DatabaseSync(t,{readOnly:true}),s=n&&existsSync$1(n)?new DatabaseSync(n,{readOnly:true}):null;try{let i=e==="codegraph"?new Set(DEVFLOW_TABLE_NAMES):null;for(let a of Ee(r).filter(c=>!i||i.has(c)))o.tables[a]=Ct(r,a),o.conflicts[a]=s&&Ee(s).includes(a)?ri(r,s,a):0;}finally{r.close(),s?.close();}return o}function Vn(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 ti(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 ni(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function oi(e,t){let n=[];try{for(let o of ["","-wal","-shm"]){let r=`${e}${o}`;if(!existsSync$1(r))continue;let s=join$1(t,`project-devflow.db.retired${o}`);renameSync(r,s),n.push({source:r,destination:s});}}catch(o){throw eo(n),o}return n}function eo(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function Yn(e,t,n,o){let r=new Set(Ee(e)),s=Ee(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=Ge(e,"main",i),c=new Set(Ge(e,t,i).map(m=>m.name)),u=a.filter(m=>c.has(m.name));if(Dt.has(i)&&(u=u.filter(m=>m.pk===0)),u.length===0)continue;let l=Ct(e,i),d=u.map(m=>T(m.name)).join(", "),g=u.map(m=>`s.${T(m.name)}`).join(", ");if(u.filter(m=>m.pk>0).length>0&&!Dt.has(i))e.exec(`INSERT OR IGNORE INTO main.${T(i)} (${d}) SELECT ${g} FROM ${T(t)}.${T(i)} s`);else {let m=u.map(p=>`t.${T(p.name)} IS s.${T(p.name)}`).join(" AND ");e.exec(`
|
|
22
|
+
INSERT INTO main.${T(i)} (${d})
|
|
23
|
+
SELECT ${g} FROM ${T(t)}.${T(i)} s
|
|
24
|
+
WHERE NOT EXISTS (SELECT 1 FROM main.${T(i)} t WHERE ${m})
|
|
25
|
+
`);}o[i]=(o[i]??0)+(Ct(e,i)-l);}}function ri(e,t,n){let o=new Set(Ge(t,"main",n).map(u=>u.name)),r=Ge(e,"main",n).filter(u=>u.pk>0&&o.has(u.name));if(r.length===0||Dt.has(n))return 0;let s=r.map(u=>T(u.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${T(n)}`).all(),a=r.map(u=>`${T(u.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${T(n)} WHERE ${a} LIMIT 1`);return i.reduce((u,l)=>u+(c.get(...r.map(d=>l[d.name]))?1:0),0)}function Ee(e,t="main"){return e.prepare(`SELECT name FROM ${T(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(o=>o.name)}function Ge(e,t,n){return e.prepare(`PRAGMA ${T(t)}.table_info(${T(n)})`).all()}function Ct(e,t){let n=e.prepare(`SELECT COUNT(*) count FROM ${T(t)}`).get();return Number(n.count)}function T(e){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsafe SQLite identifier: ${e}`);return `"${e}"`}var Dt,no=C(()=>{Dt=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var oo={};$(oo,{connectAgent:()=>xt,getAvailableAgents:()=>ai});async function xt(e){let t=[],n={command:e.command??"devflow-mcp",args:["--mode","stdio"]},o=e.agent?[e.agent]:await import('@devflow-tools/adapters').then(r=>r.detectAll());for(let r of o){let s=await connect(r,n);t.push(`${r}: ${s.configPath} (${s.written?"written":"skipped"})`);}return t}function ai(){return listAdapters()}var $t=C(()=>{});async function x(e,t,n,o={}){let r=o.serverUrl??li;if(o.skipServer)return n();let s=false,i=so.get(r);if(i&&Date.now()-i.ts<ui?s=i.result:(s=await new DevFlowApiClient({baseUrl:r,projectRoot:e}).ping(),so.set(r,{result:s,ts:Date.now()})),s){let a=new DevFlowApiClient({baseUrl:r,projectRoot:e});return t(a)}return console.error(S.dim(" (server not running, using local engine \u2014 telemetry disabled)")),n()}var li,so,ui,te=C(()=>{li=process.env.DEVFLOW_SERVER_URL??"http://127.0.0.1:13337",so=new Map,ui=3e4;});var ao={};$(ao,{getIndexStatus:()=>di,refreshIndex:()=>gi});async function di(e){return x(process.cwd(),t=>t.getIndexStatus(),async()=>{let{codegraph:t}=await createEngines(process.cwd()),n=t.getStats();return {totalFiles:n.fileCount,totalSymbols:n.nodeCount,lastIndexTime:n.lastUpdated,indexing:t.isIndexing()}},{skipServer:e})}async function gi(e){return x(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var co=C(()=>{te();});var lo={};$(lo,{getGraph:()=>mi});async function mi(e={}){let t=e.target??"all",n=e.depth??2;return x(process.cwd(),o=>o.getGraph(t,n),async()=>{let{graph:o}=await createEngines(process.cwd());if(t==="all")return o.export();let r=o.getSubGraph(t,n);return {nodes:r.nodes,edges:r.edges}},{skipServer:e.skipServer})}var uo=C(()=>{te();});var At={};$(At,{getContext:()=>hi,getTaskContext:()=>yi});async function hi(e){return x(process.cwd(),t=>t.buildContext(e.query,e.mode??"fast",e.maxTokens),async()=>{let{context:t}=await createEngines(process.cwd());return t.build({query:e.query,mode:e.mode??"fast",maxTokens:e.maxTokens??8e3})},{skipServer:e.skipServer})}async function yi(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return x(t,o=>o.buildTaskContext(e.query,t,n),async()=>{let{context:o,codegraph:r}=await createEngines(t),s=r.getStats().lastUpdated,i=s>0?Date.now()-s:0;return getProjectContextResult(o,{query:e.query,...n},i)},{skipServer:e.skipServer})}var Ot=C(()=>{te();});var De={};$(De,{getWorkflowRuns:()=>fo,getWorkflowStatus:()=>ki,listWorkflows:()=>wi,runWorkflow:()=>vi});async function wi(e){return x(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function vi(e,t,n){return x(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function ki(e){return fo(e)}async function fo(e){return x(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var Ce=C(()=>{te();});var le={};$(le,{backfillObservationVectors:()=>Di,queryMemory:()=>Pi,reviewCandidates:()=>Ei,reviewMemories:()=>xi,setMemory:()=>Ri,showMemory:()=>_i});async function _i(e,t){let n=await x(process.cwd(),r=>r.getMemory(t),async()=>{let{memory:r}=await createEngines(process.cwd());return r.getAll()},{skipServer:e});if(!t||!n||typeof n!="object")return n;let o=n;return Array.isArray(o.memories)?{...o,memories:o.memories.filter(r=>r?.source===t)}:n}async function Pi(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return x(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getMemoryResult(r,o)},{skipServer:n})}async function Ri(e,t,n){return x(process.cwd(),async o=>{await o.setMemory("project",e,t);},async()=>{let{memory:o}=await createEngines(process.cwd());await o.updateUserPreference(e,t);},{skipServer:n})}async function Ei(e){return x(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function Di(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function Ci(e){let t=Si.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function xi(){let t=await x(process.cwd(),async r=>(await r.getMemory()).memories?.filter(i=>i.status==="pending")??[],async()=>{let{memory:r}=await createEngines(process.cwd());return r.getPendingMemories()},{skipServer:false});if(t.length===0){console.log("No pending memories to review.");return}let n=[...t].sort((r,s)=>r.category==="failure_lesson"&&s.category!=="failure_lesson"?-1:s.category==="failure_lesson"&&r.category!=="failure_lesson"?1:0),o=0;for(let r of n){console.log(`
|
|
26
|
+
[${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await Ci(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await x(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await x(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
|
|
27
|
+
Reviewed ${o}/${t.length} pending memories.`);}var ue=C(()=>{te();});var po={};$(po,{getDocsStatus:()=>Oi,queryKnowledge:()=>mo,searchKnowledge:()=>Ai,syncDocs:()=>Ti});async function mo(e,t,n,o){return x(process.cwd(),r=>r.queryKnowledge(e,{scope:t,budgetTokens:n}),()=>{let r=new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider});return getKnowledgeResult(r,{query:e,scope:t,budgetTokens:n})},{skipServer:o})}async function Ai(e,t,n){return (await mo(e,t,void 0,n)).results}async function Oi(e){return x(process.cwd(),t=>t.getKnowledgeSources(),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).getSources(),{skipServer:e})}async function Ti(e,t){return x(process.cwd(),n=>n.syncDocs(e),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).syncDocs(e),{skipServer:t})}var ho=C(()=>{te();});var jt={};$(jt,{backfillKnowledgeVectors:()=>Mi,resyncKnowledgeDocs:()=>ji});function yo(e){return new KnowledgeEngine({projectRoot:e,embedder:new EmbeddingProvider})}async function ji(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=yo(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Mi(e={}){let t=yo(e.projectRoot??process.cwd());try{return await t.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress})}finally{t.close();}}var Mt=C(()=>{});var vo=C(()=>{});var $e={};$($e,{installSkill:()=>Ki,listSkills:()=>So,listSkillsSync:()=>Bi,searchSkills:()=>Hi,uninstallSkill:()=>qi});async function So(e){return x(process.cwd(),async t=>(await t.listPlugins()).map(o=>({name:o.name,version:o.version,description:o.description,icon:o.icon,tags:o.tags??[],installed:true})),async()=>{let t=await loadPlugins();return Array.from(t.values()).map(n=>({name:n.meta.name,version:n.meta.version,description:n.meta.description,icon:n.meta.icon,tags:n.meta.tags,installed:true}))},{skipServer:e})}function Bi(){return []}async function Hi(e,t){let n=await So(t),o=e.toLowerCase();return n.filter(r=>r.name.toLowerCase().includes(o)||r.description.toLowerCase().includes(o)||r.tags.some(s=>s.toLowerCase().includes(o)))}function _o(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function Po(e,t){let n=join(e,".devflow","config.json");writeFileSync(n,JSON.stringify(t,null,2),"utf-8");}async function Ki(e,t=process.cwd(),n){return x(t,async o=>await o.installPlugin(e),async()=>{let o=e.startsWith("@devflow-tools/plugin-")?e:`@devflow-tools/plugin-${e}`,r=e.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(ze,{recursive:true});try{execSync(`npm install --prefix "${ze}" ${o}`,{stdio:"pipe",timeout:6e4});}catch{}let s=_o(t);s.plugins||(s.plugins=[]),s.plugins.includes(r)||(s.plugins.push(r),Po(t,s));let i=[];try{i=JSON.parse(readFileSync(join(ze,"node_modules",o,"package.json"),"utf-8"))?.devflow?.templates??[];}catch{}return {name:r,version:"0.1.0",templates:i}},{skipServer:n})}async function qi(e,t=process.cwd(),n){return x(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=e.replace(/^@devflow-tools\/plugin-/,""),r=_o(t);r.plugins&&(r.plugins=r.plugins.filter(i=>i!==o),Po(t,r));let s=e.startsWith("@devflow-tools/plugin-")?e:`@devflow-tools/plugin-${e}`;try{let i=join(ze,"node_modules",s);existsSync(i)&&rmSync$1(i,{recursive:!0,force:!0});}catch{}},{skipServer:n})}var ze,Ae=C(()=>{te();vo();ze=join(process.env.HOME??"~",".devflow","skills");});var Ve={};$(Ve,{DEFAULT_SERVER_PORT:()=>Je,readPidFromFile:()=>Wt,readPortFromFile:()=>Co,serverStatus:()=>Te,startServer:()=>Bt,stopServer:()=>Oe});function Ut(e){let t=join(e,".devflow");return existsSync(t)||mkdirSync(t,{recursive:true}),join(t,"server.pid")}function Yi(){try{return Eo.resolve("./server.js")}catch{try{return Eo.resolve("@devflow-tools/server/dist/main.js")}catch{return join(process.cwd(),"apps","server","dist","main.js")}}}function Co(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 Wt(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
|
|
29
|
+
`),n=t.length>=2?t[1]:t[0],o=parseInt(n,10);return isNaN(o)?null:o}async function Bt(e){let t=Yi(),n=Ut(process.cwd()),o=spawn("node",[t],{env:{...process.env,PORT:String(e.port)},stdio:"ignore",detached:true});return writeFileSync(n,`${e.port}
|
|
30
|
+
${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function Oe(){let e=Ut(process.cwd()),t=Wt(e);if(t===null)return false;try{return process.kill(t),unlinkSync(e),!0}catch{return unlinkSync(e),false}}async function Te(){let e=Ut(process.cwd()),t=Co(e)??Je,{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:Wt(e)??void 0,port:t}:{running:false,port:t}}var Eo,Je,ne=C(()=>{Eo=createRequire(import.meta.url);Je=13337;});var ur={};$(ur,{renderDoctorText:()=>cr,runDoctor:()=>kc,runDoctorAudit:()=>Sc,runDoctorAuditFix:()=>_c,runDoctorCommand:()=>bc,runDoctorReceipts:()=>Rc,runDoctorViolations:()=>Pc,runLegacyDoctorReport:()=>lr,runStructuredDoctor:()=>sn});function nn(e){return createHash("sha256").update(e).digest("hex").slice(0,16)}function xo(e){return join$1(homedir$1(),".devflow","daemons",`${nn(e)}.sock`)}function na(){return join$1(homedir$1(),".devflow","daemons.json")}function Jo(){if(Ze)return Ze;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Ze=e.DatabaseSync,Ze}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function O(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}function Zt(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function oa(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!==nn(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function ra(e,t){let n=Zt(e),o=nn(n.path),r=xo(n.path),s=[{key:"canonical_project",value:n.path,target:"existing canonical path",ok:n.error===void 0,severity:n.error?"error":"info"},{key:"project_hash",value:o,ok:true,severity:"info"},{key:"daemon_socket_path",value:r,target:`path containing ${o}`,ok:r.includes(o),severity:"error"}],i=t.registryPath??na();if(!existsSync$1(i))s.push({key:"daemon_registry",value:"not found",target:"valid JSON when present",ok:true,severity:"info"}),s.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:0},target:"0 when idle or 1 while active",ok:true,severity:"info"});else try{let a=JSON.parse(readFileSync$1(i,"utf8"));if(!Array.isArray(a))throw new Error("registry must be an array");let c=a.filter(g=>oa(g).length>0);s.push({key:"daemon_registry",value:c.length===0?"valid":"malformed",target:"valid daemon entry array",ok:c.length===0,severity:c.length===0?"info":"warning"}),s.push({key:"invalid_daemon_registry_entries",value:c.length,target:0,ok:c.length===0,severity:"warning"});let u=a.filter(g=>{if(typeof g!="object"||g===null)return !1;let f=g;return typeof f.rootPath!="string"||f.rootPath.length===0?!1:Zt(f.rootPath).path===n.path});s.push({key:"project_daemon_registrations",value:u.length,ok:!0,severity:"info"}),s.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:u.length},target:"0 when idle or 1 while active",ok:u.length<=1,severity:"warning"});let l=u.map(g=>xo(g.rootPath));s.push({key:"registered_daemon_socket_paths",value:l,target:[r],ok:!0,severity:"info"});let d=u.filter((g,f)=>g.projectHash!==o||l[f]!==r).length;s.push({key:"daemon_identity_mismatches",value:d,target:0,ok:d===0,severity:"warning"});}catch{s.push({key:"daemon_registry",value:"malformed",target:"valid daemon entry array",ok:false,severity:"warning"}),s.push({key:"invalid_daemon_registry_entries",value:1,target:0,ok:false,severity:"warning"}),s.push({key:"hook_daemon_registration",value:"unreadable daemon registry",target:"valid project registration",ok:false,severity:"warning"});}return {name:"Isolation",status:O(s),metrics:s}}function ia(e){let t=e.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all(),n=new Set(t.map(r=>r.name)),o=[];for(let[r,s]of Object.entries(sa)){if(!n.has(r)){o.push(r);continue}let i=new Set(e.prepare(`PRAGMA table_info(${r})`).all().map(a=>a.name));for(let a of s)i.has(a)||o.push(`${r}.${a}`);}return o.sort()}function Yo(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 aa(e){let t=Yo(e);return t&&t.length>0?t:null}function Kt(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 ca(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function $o(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function ua(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:`initialize ${o} with devflow init`,ok:false,severity:"error"}),{name:"Distill",status:O(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(Jo())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=ia(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:O(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,
|
|
33
|
+
`);u.setReadBigInts?.(!0);let l=u.all(),d=new Set,g=0,f=0;for(let h of l){let k=aa(h.event_ids),P=Yo(h.session_ids),A=Kt(h.event_count),q=Kt(h.created_at),W=Kt(h.expires_at),Fe=typeof h.status=="string"&&la.has(h.status)?h.status:null,Kr=typeof h.batch_id=="string"&&h.batch_id.trim().length>0,qr=k!==null&&A!==null&&ca(A,k.length);if(!Kr||!k||!P||!qr||q===null||W===null||Fe===null){g+=1,h.status==="pending"&&(W===null||$o(W,c))&&(f+=1);continue}if(!(Fe!=="pending"||!$o(W,c)))for(let Gr of k)d.add(Gr);}n.push({key:"malformed_distill_leases",value:g,target:0,ok:g===0,severity:f>0?"error":"warning"});let p=i.prepare(`
|
|
30
34
|
SELECT id
|
|
31
35
|
FROM session_events
|
|
32
36
|
WHERE processed = 0 AND created_at < ?
|
|
33
|
-
`).all(c-300*1e3).filter(h=>!d.has(h.id)).length;n.push({key:"unprocessed_stale_events",value:p,target:0,ok:p===0,severity:"error"});let
|
|
37
|
+
`).all(c-300*1e3).filter(h=>!d.has(h.id)).length;n.push({key:"unprocessed_stale_events",value:p,target:0,ok:p===0,severity:"error"});let y=j(i,"SELECT COUNT(*) count FROM session_events WHERE processed = 0");n.push({key:"pending_memory_events",value:y,target:"actively leased or younger than 5 minutes",ok:p===0,severity:"error"});let w=j(i,`
|
|
38
|
+
SELECT COUNT(*) count
|
|
39
|
+
FROM session_events event
|
|
40
|
+
LEFT JOIN sessions session ON session.id = event.session_id
|
|
41
|
+
WHERE TRIM(event.session_id) = '' OR session.id IS NULL
|
|
42
|
+
`);n.push({key:"orphan_memory_events",value:w,target:0,ok:w===0,severity:"error"});let v=j(i,`
|
|
43
|
+
SELECT COUNT(*) count
|
|
44
|
+
FROM sessions
|
|
45
|
+
WHERE status = 'active' AND created_at < ?
|
|
46
|
+
`,c-Vo);n.push({key:"stale_memory_sessions",value:v,target:0,ok:v===0,severity:"error"});let _=i.prepare(`
|
|
34
47
|
SELECT COUNT(*) AS group_count, COALESCE(SUM(title_count), 0) AS row_count
|
|
35
48
|
FROM (
|
|
36
49
|
SELECT project, session_id, title, COUNT(*) AS title_count
|
|
@@ -38,51 +51,67 @@ ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function Ce(){let e=Nt(process.cwd(
|
|
|
38
51
|
GROUP BY project, session_id, title
|
|
39
52
|
HAVING COUNT(*) > 1
|
|
40
53
|
)
|
|
41
|
-
`).get();n.push({key:"duplicate_observation_title_groups",value:Number(
|
|
54
|
+
`).get();n.push({key:"duplicate_observation_title_groups",value:Number(_.group_count),target:0,ok:Number(_.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(_.row_count),target:0,ok:Number(_.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:O(n),metrics:n}}function H(e,t){return (t.openDatabase??(o=>new(Jo())(o,{readOnly:true})))(e)}function L(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function qt(e,t){return L(e,t)?new Set(e.prepare(`PRAGMA table_info(${t})`).all().map(n=>n.name).filter(n=>typeof n=="string")):new Set}function j(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function Gt(e,t){return e===0?1:t/e}function da(e,t){let n=[],o=null,r=null,s=join$1(e,".codegraph","codegraph.db");if(!existsSync$1(s))n.push({key:"codegraph_db",value:"missing",target:s,ok:false,severity:"warning"});else {let g;try{g=H(s,t),L(g,"nodes")?(o=j(g,"SELECT COUNT(*) count FROM nodes"),n.push({key:"codegraph_nodes",value:o,ok:!0,severity:"info"})):n.push({key:"codegraph_nodes",value:"nodes table missing",target:">= 0",ok:!1,severity:"warning"});}catch(f){n.push({key:"codegraph_db_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let i=join$1(e,".devflow","symbols-vec.db");if(!existsSync$1(i))n.push({key:"symbols_vectors_db",value:"missing",target:i,ok:false,severity:"warning"});else {let g;try{g=H(i,t);let f=L(g,"symbols_vec_rowids")?"symbols_vec_rowids":L(g,"symbol_sources")?"symbol_sources":null;f?(r=j(g,`SELECT COUNT(*) count FROM ${f}`),n.push({key:"symbols_vectors",value:r,ok:!0,severity:"info"})):n.push({key:"symbols_vectors",value:"vector metadata missing",target:">= 0",ok:!1,severity:"warning"});}catch(f){n.push({key:"symbols_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}if(o!==null&&r!==null){let g=Gt(o,r);n.push({key:"symbols_vector_coverage",value:g,target:">= 0.90",ok:g>=.9,severity:"warning"});}let a=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(a))n.push({key:"knowledge_vectors_db",value:"missing",target:a,ok:false,severity:"warning"});else {let g;try{g=H(a,t);let m=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(p=>!L(g,p));if(m.length>0)n.push({key:"knowledge_vector_schema",value:m,target:[],ok:!1,severity:"warning"});else {let p=j(g,"SELECT COUNT(*) count FROM knowledge_chunks"),y=j(g,"SELECT COUNT(*) count FROM knowledge_vec_rowids"),w=Gt(p,y),_=g.prepare(`
|
|
42
55
|
SELECT d.source source, COUNT(c.id) chunks,
|
|
43
56
|
SUM(CASE WHEN v.id IS NOT NULL THEN 1 ELSE 0 END) vectors
|
|
44
57
|
FROM knowledge_docs d
|
|
45
58
|
LEFT JOIN knowledge_chunks c ON c.doc_id = d.id
|
|
46
59
|
LEFT JOIN knowledge_vec_rowids v ON v.id = c.id
|
|
47
60
|
GROUP BY d.source ORDER BY d.source
|
|
48
|
-
`).all().map(
|
|
61
|
+
`).all().map(h=>{let k=Number(h.chunks),P=Number(h.vectors);return {source:h.source,chunks:k,vectors:P,coverage:Gt(k,P)}});n.push({key:"knowledge_chunks",value:p,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:y,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:w,target:">= 0.95",ok:w>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:_,target:"every source >= 0.95",ok:_.every(h=>h.coverage>=.95),severity:"warning"});}}catch(f){n.push({key:"knowledge_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let c=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(c))n.push({key:"observation_vectors_db",value:"missing",target:c,ok:false,severity:"warning"});else {let g;try{if(g=H(c,t),!L(g,"observations")||!L(g,"embeddings"))n.push({key:"observation_vector_schema",value:"observations/embeddings missing",target:"Batch 2 vector schema",ok:!1,severity:"warning"});else {let f=j(g,"SELECT COUNT(*) count FROM observations"),m=j(g,`
|
|
49
62
|
SELECT COUNT(DISTINCT e.source_id) count
|
|
50
63
|
FROM embeddings e JOIN observations o ON o.id = e.source_id
|
|
51
64
|
WHERE e.source_type = 'observation'
|
|
52
|
-
`),p=Math.max(0,
|
|
53
|
-
`).filter(
|
|
65
|
+
`),p=Math.max(0,f-m);n.push({key:"observations",value:f,ok:!0,severity:"info"}),n.push({key:"observation_vectors",value:m,ok:!0,severity:"info"}),n.push({key:"observation_vectors_missing",value:p,target:0,ok:p===0,severity:"warning"});}}catch(f){n.push({key:"observation_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let u=(t.now??Date.now)(),l=join$1(t.homePath??homedir$1(),".devflow","errors","embedder.log"),d=0;if(existsSync$1(l))try{let g=u-864e5;d=readFileSync$1(l,"utf8").split(`
|
|
66
|
+
`).filter(f=>{let m=/^\[([^\]]+)\]/.exec(f);return m?Date.parse(m[1])>=g:!1}).length;}catch(g){n.push({key:"embedder_error_log_read",value:g.message,target:"readable error log",ok:false,severity:"error"});}return n.push({key:"embedder_errors_24h",value:d,target:0,ok:d===0,severity:"warning"}),{name:"Vectors",status:O(n),metrics:n}}function ga(e,t,n){let o=[],r=n.homePath??homedir$1(),s=n.homePath?join$1(r,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(r),i=(n.now??Date.now)()-1440*60*1e3,a=t?"error":"warning";if(!existsSync$1(s))o.push({key:"global_telemetry_db",value:"missing",target:s,ok:false,severity:"warning"});else {let m;try{m=H(s,n),o.push({key:"global_telemetry_db",value:s,ok:!0,severity:"info"});for(let[h,k]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let P=L(m,k)?j(m,`SELECT COUNT(*) count FROM ${k} WHERE created_at >= ?`,i):0;o.push({key:h,value:P,ok:!0,severity:"info"});}let p=L(m,"telemetry_failures")?j(m,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",i):0;o.push({key:"telemetry_failures_24h",value:p,target:0,ok:p===0,severity:a});let y=qt(m,"sessions"),w=qt(m,"tool_call_events"),v=qt(m,"skill_executions"),_=["id","project_root","started_at","status"].every(h=>y.has(h));if(o.push({key:"telemetry_session_schema",value:_?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:_,severity:"error"}),_){let h=j(m,`
|
|
67
|
+
SELECT COUNT(*) count FROM sessions
|
|
68
|
+
WHERE project_root = ? AND started_at >= ?
|
|
69
|
+
`,e,i);o.push({key:"session_start_evidence_24h",value:h,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let k=j(m,`
|
|
70
|
+
SELECT COUNT(*) count FROM sessions
|
|
71
|
+
WHERE project_root = ? AND status = 'running' AND started_at < ?
|
|
72
|
+
`,e,(n.now??Date.now)()-Vo);o.push({key:"stale_telemetry_sessions",value:k,target:0,ok:k===0,severity:"error"});let P=0;w.has("session_id")&&(P=j(m,`
|
|
73
|
+
SELECT COUNT(*) count
|
|
74
|
+
FROM tool_call_events event
|
|
75
|
+
LEFT JOIN sessions session ON session.id = event.session_id
|
|
76
|
+
WHERE TRIM(COALESCE(event.session_id, '')) = '' OR session.id IS NULL
|
|
77
|
+
`));let A=0;v.has("session_id")&&(A=j(m,`
|
|
78
|
+
SELECT COUNT(*) count
|
|
79
|
+
FROM skill_executions execution
|
|
80
|
+
LEFT JOIN sessions session ON session.id = execution.session_id
|
|
81
|
+
WHERE TRIM(COALESCE(execution.session_id, '')) = '' OR session.id IS NULL
|
|
82
|
+
`)),o.push({key:"orphan_telemetry_events",value:{toolCalls:P,skillExecutions:A},target:{toolCalls:0,skillExecutions:0},ok:P===0&&A===0,severity:"error"});}if(L(m,"tool_call_events"))if(w.has("failure_category")){let h=m.prepare(`
|
|
54
83
|
SELECT failure_category category, COUNT(*) count
|
|
55
84
|
FROM tool_call_events
|
|
56
85
|
WHERE timestamp >= ? AND failure_category IS NOT NULL
|
|
57
86
|
GROUP BY failure_category
|
|
58
87
|
ORDER BY failure_category
|
|
59
|
-
`).all(i),
|
|
60
|
-
`))if(d.trim())try{let
|
|
88
|
+
`).all(i),k=Object.fromEntries(h.map(W=>[W.category,Number(W.count)])),P=j(m,"SELECT COUNT(*) count FROM tool_call_events WHERE timestamp >= ? AND error IS NOT NULL",i),A=h.reduce((W,Fe)=>W+Number(Fe.count),0),q=P===0?1:A/P;o.push({key:"failure_categories_24h",value:k,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:q,target:">= 0.80",ok:q>=.8,severity:a});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:a});}catch(p){o.push({key:"global_telemetry_db_read",value:p.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}let c=[...new Set([join$1(dirname(s),"telemetry-cache"),join$1(r,".devflow","telemetry-cache")])],u=0;try{u=c.reduce((m,p)=>m+(existsSync$1(p)?readdirSync(p).filter(y=>y.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:u,target:0,ok:u===0,severity:a});}catch(m){o.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);o.push({key:"project_local_telemetry_db",value:d?l:"absent",target:"absent",ok:!d,severity:a});let g=join$1(e,".codegraph","codegraph.db"),f=[];if(existsSync$1(g)){let m;try{m=H(g,n),f=m.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(p=>p.name);}catch(p){o.push({key:"codegraph_telemetry_read",value:p.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}return o.push({key:"codegraph_devflow_tables",value:f,target:[],ok:f.length===0,severity:a}),{name:"Telemetry",status:O(o),metrics:o}}function Oo(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function Zo(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 ma(e){let t=[],n=e.homePath??homedir$1(),o=e.env??process.env,r=join$1(n,".devflow","keys"),s=[["local_api_key","DEVFLOW_API_KEY","local.key"],["local_hmac_secret","DEVFLOW_HMAC_SECRET","hmac.key"]];if(!s.some(([,l])=>!o[l]?.trim())&&!existsSync$1(r))t.push({key:"key_directory",value:"not required (environment overrides active)",ok:true,severity:"info"});else if(!existsSync$1(r))t.push({key:"key_directory",value:"missing",target:r,ok:false,severity:"warning"});else try{let l=lstatSync(r),d=Oo(r),g=l.isDirectory()&&!l.isSymbolicLink(),f=process.platform==="win32"||d==="700";t.push({key:"key_directory",value:{path:r,mode:d},target:{type:"directory",mode:"700"},ok:g&&f,severity:g?"warning":"error"});}catch(l){t.push({key:"key_directory",value:l.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[l,d,g]of s){if(o[d]?.trim()){t.push({key:`${l}_source`,value:d,target:"environment override or generated key file",ok:true,severity:"info"});continue}let f=join$1(r,g);if(!existsSync$1(f)){t.push({key:`${l}_source`,value:"missing",target:f,ok:false,severity:"warning"});continue}try{let m=lstatSync(f),p=Oo(f),y=readFileSync$1(f,"utf8").trim(),w=m.isFile()&&!m.isSymbolicLink();t.push({key:`${l}_source`,value:{path:f,mode:p,bytes:Buffer.byteLength(y)},target:{type:"regular file",mode:"400",nonempty:!0},ok:w&&y.length>0&&(process.platform==="win32"||p==="400"),severity:!w||y.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)()-ve;for(let d of readFileSync$1(a,"utf8").split(`
|
|
89
|
+
`))if(d.trim())try{let g=JSON.parse(d),f=Zo(g.ts);f===null?u+=1:f>=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:O(t),metrics:t}}function pa(e){let t=[],n=e.homePath??homedir$1(),o=getGlobalDevFlowDbPath(n);if(!existsSync$1(o))return t.push({key:"latest_benchmark",value:"missing global database",target:"completed baseline within 30 days",ok:false,severity:"warning"}),{name:"Benchmark",status:O(t),metrics:t};let r;try{if(r=H(o,e),!L(r,"benchmark_reports"))return t.push({key:"latest_benchmark",value:"benchmark_reports table missing",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:O(t),metrics:t};let s=r.prepare(`
|
|
61
90
|
SELECT run_id, suite_id, suite_version, task_count, status, report_json, created_at
|
|
62
91
|
FROM benchmark_reports
|
|
63
92
|
ORDER BY created_at DESC
|
|
64
93
|
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:
|
|
66
|
-
`))if(v.trim())try{let
|
|
94
|
+
`).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:O(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/ve).toFixed(2)):null,target:"0-30",ok:Number.isFinite(u)&&u>=0&&u<=fa,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{r?.close();}return {name:"Benchmark",status:O(t),metrics:t}}function ha(e){if(!existsSync$1(e))return {bytes:0,files:0};let t=[e],n=0,o=0;for(;t.length>0;){let r=t.pop(),s=lstatSync(r);if(!s.isSymbolicLink()){if(s.isDirectory()){for(let i of readdirSync(r))t.push(join$1(r,i));continue}s.isFile()&&(n+=s.size,o+=1);}}return {bytes:n,files:o}}function ya(e){let t=[],n=e.homePath??homedir$1(),o=[join$1(n,".devflow","errors","hook-fallback.log")],r=join$1(n,".devflow","logs","hook-fallback");if(existsSync$1(r))try{for(let w of readdirSync(r))w.endsWith(".log")&&o.push(join$1(r,w));}catch(w){t.push({key:"hook_fallback_directory_read",value:w.message,target:"readable fallback directory",ok:false,severity:"error"});}let s=(e.now??Date.now)()-ve,i=0,a=0;for(let w of [...new Set(o)])if(existsSync$1(w))try{for(let v of readFileSync$1(w,"utf8").split(`
|
|
95
|
+
`))if(v.trim())try{let _=JSON.parse(v),h=Zo(_.ts);h===null||typeof _.reason!="string"?a+=1:h>=s&&(i+=1);}catch{a+=1;}}catch(v){t.push({key:"hook_fallback_log_read",value:{path:w,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 w;try{if(w=H(c,e),L(w,"telemetry_events")){let v=w.prepare(`
|
|
67
96
|
SELECT COUNT(*) total,
|
|
68
97
|
SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) failures,
|
|
69
98
|
AVG(CASE WHEN success = 1 THEN duration END) average_duration
|
|
70
99
|
FROM telemetry_events
|
|
71
100
|
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{
|
|
101
|
+
`).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{w?.close();}}let g=Math.max(i,l),f=Math.max(u,g),m=f===0?0:g/f;t.push({key:"hook_daemon_requests_24h",value:f,ok:true,severity:"info"}),t.push({key:"hook_fallback_rate_24h",value:Math.round(m*1e4)/1e4,target:0,ok:g===0,severity:"warning"}),t.push({key:"hook_daemon_response_ms_avg",value:d??"no successful requests",target:"<= 1000",ok:d===null||d<=1e3,severity:"warning"});let p=g>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:p,target:[],ok:p.length===0,severity:"warning"});let y=join$1(n,".devflow","logs","hook-debug");try{let w=ha(y);t.push({key:"hook_debug_log_bytes",value:w.bytes,target:`<= ${Ao}`,ok:w.bytes<=Ao,severity:"warning"}),t.push({key:"hook_debug_log_files",value:w.files,target:"rotated per project",ok:!0,severity:"info"});}catch(w){t.push({key:"hook_debug_log_read",value:w.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:O(t),metrics:t}}function ie(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function fe(e){return JSON.parse(readFileSync$1(e,"utf8"))}function N(e){return typeof e=="object"&&e!==null?e:null}function tr(e,t){return ka.has(e)&&!(t.tolerateControlSyntax&&ba.has(e))}function Le(e,t={}){if(Buffer.byteLength(e)>er)return {segments:[],malformed:true};let n=[],o=[],r="",s=null,i=false,a=false,c=()=>{r.length>0&&o.push(r),r="";},u=()=>{c(),o.length>0&&n.push(o),o=[];};for(let l=0;l<e.length;l+=1){let d=e[l];if(i){r+=d,i=false;continue}if(s==="'"){d==="'"?s=null:r+=d;continue}if(d==="\\"){if(e[l+1]===`
|
|
73
102
|
`){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),r+=d);continue}if(d==="'"||d==='"'){s=d;continue}if((d==="`"||d==="$"&&e[l+1]==="(")&&!t.tolerateControlSyntax){a=true,r+=d;continue}let
|
|
75
|
-
`;)l+=1;u();continue}
|
|
76
|
-
`].includes(d)){u();continue}if(/\s/.test(d)){c();continue}r+=d;}return (s!==null||i)&&(a=true),u(),n.some(l=>{let d=l.find(
|
|
103
|
+
`){l+=2;continue}i=true;continue}if(s==='"'){d==='"'?s=null:((d==="`"||d==="$"&&e[l+1]==="(")&&!t.tolerateControlSyntax&&(a=true),r+=d);continue}if(d==="'"||d==='"'){s=d;continue}if((d==="`"||d==="$"&&e[l+1]==="(")&&!t.tolerateControlSyntax){a=true,r+=d;continue}let g=e.slice(l,l+2);if(d==="#"&&r.length===0){for(;l<e.length&&e[l]!==`
|
|
104
|
+
`;)l+=1;u();continue}g==="<<"&&!t.tolerateControlSyntax&&(a=true);let f=d==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(l))||d==="}"&&Sa.test(`${r}}`);if(["(",")","{","}"].includes(d)&&!f&&!t.tolerateControlSyntax&&(a=true),g==="&&"||g==="||"){u(),l+=1;continue}if([";","|","&",`
|
|
105
|
+
`].includes(d)){u();continue}if(/\s/.test(d)){c();continue}r+=d;}return (s!==null||i)&&(a=true),u(),n.some(l=>{let d=l.find(g=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(g));return d!==void 0&&tr(d,t)})&&(a=true),{segments:n,malformed:a}}function _a(e){return Le(e).segments.flat().join(" ")}function Pa(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 nr(e,t){return Pa(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 Ra(e){let t=e.split(""),n=null;for(let o=0;o<e.length;o+=1){let r=e[o];if(n!==null){r==="\\"?o+=1:r===n&&(n=null);continue}if(r==="'"||r==='"'||r==="`"){n=r;continue}if(r!=="/"||!["/","*"].includes(e[o+1]??""))continue;let s=e[o+1]==="*";for(t[o]=" ",t[o+1]=" ",o+=2;o<e.length;){if(s&&e[o]==="*"&&e[o+1]==="/"){t[o]=" ",t[o+1]=" ",o+=1;break}if(!s&&e[o]===`
|
|
77
106
|
`){o-=1;break}e[o]!==`
|
|
78
|
-
`&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function
|
|
107
|
+
`&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function Ea(e){let t=e.split("");for(let n=0;n<e.length;n+=1){let o=e[n];if(o==="#"){for(;n<e.length&&e[n]!==`
|
|
79
108
|
`;)t[n]=" ",n+=1;continue}if(o!=="'"&&o!=='"')continue;let r=o,s=e.slice(n,n+3)===r.repeat(3)?3:1;for(n+=s;n<e.length;){if(e[n]==="\\"){n+=2;continue}if(e.slice(n,n+s)===r.repeat(s)){n+=s-1;break}if(s===1&&(e[n]===`
|
|
80
|
-
`||e[n]==="\r"))break;n+=1;}}return t.join("")}function
|
|
109
|
+
`||e[n]==="\r"))break;n+=1;}}return t.join("")}function Y(e,t,n="infer"){let o=t?_a(e):n==="node"?Ra(e):n==="python"?Ea(e):e;return [...new Set(o.match(wa)??[])]}function Da(e){return Le(e).segments.flat()}function Z(e,t,n=false,o="infer"){let r=[[/^\$\{CLAUDE_PROJECT_DIR\}(?:\/(.*))?$/,t.project],[/^\$CLAUDE_PROJECT_DIR(?:\/(.*))?$/,t.project],[/^\$\{HOME\}(?:\/(.*))?$/,t.homePath],[/^\$HOME(?:\/(.*))?$/,t.homePath],[/^~(?:\/(.*))?$/,t.homePath]];for(let[i,a]of r){let c=e.match(i);if(c)return {path:resolve(a,c[1]??""),containmentRoot:a,cwd:t.cwd,parserKind:o}}if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(e)||e.startsWith("node:"))return null;if(isAbsolute(e)){let i=resolve(e),a=resolve(t.project),c=resolve(t.homePath),u=se(a,i)?a:se(c,i)?c:dirname(i);return {path:i,containmentRoot:u,cwd:t.cwd,parserKind:o}}return n?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:e.startsWith("-")||e.startsWith("#")?null:/^[A-Za-z0-9._/-]+$/.test(e)&&(e.startsWith("./")||e.startsWith("../")||e.includes("/")||/\.(?:bash|cjs|js|mjs|py|sh|ts|zsh)$/.test(e))?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:null}function Ca(e){let t=e.indexOf(",");if(t<0)return null;try{let n=e.slice(5,t),o=e.slice(t+1),r=n.split(";").includes("base64")?Buffer.from(o,"base64"):Buffer.from(decodeURIComponent(o),"utf8");if(r.length>er||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function rn(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=Ca(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:Xe(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:Z(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||ge(n))return {malformed:true};let o=isAbsolute(n)||n.startsWith("./")||n.startsWith("../")||n.startsWith("~")||n.startsWith("$");if(!t&&!o)return {malformed:false};let r={project:e.project,homePath:e.homePath,cwd:e.cwd};if(o){if(e.issuerPath&&!n.startsWith("~")&&!n.startsWith("$")){let s=$a(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:Z(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:Z(n,r,true,e.parserKind)??void 0,malformed:false}}if(e.nodeResolutionKind==="esm")return {malformed:true};try{let s=e.issuerPath??join$1(e.cwd,"package.json"),i=createRequire$1(s).resolve(n);return isBuiltin(i)?{malformed:!1}:{reference:Z(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function xa(e){let t=[e];extname(e)===""&&t.push(...To.map(n=>`${e}${n}`),...To.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function $a(e,t,n){if(n==="cjs")try{let r=createRequire$1(t).resolve(e);return isBuiltin(r)?null:r}catch{}let o=isAbsolute(e)?resolve(e):resolve(dirname(t),e);return xa(o)??o}function Aa(e){let t=[],n=false;for(let o=0;o<e.length;){let r=e[o];if(/\s/.test(r)){o+=1;continue}if(r==="/"&&e[o+1]==="/"){for(o+=2;o<e.length&&e[o]!==`
|
|
81
110
|
`;)o+=1;continue}if(r==="/"&&e[o+1]==="*"){let s=e.indexOf("*/",o+2);if(s<0){n=true;break}o=s+2;continue}if(r==="'"||r==='"'){let s=r,i="",a=true;o+=1;let c=false;for(;o<e.length;){let u=e[o];if(u===s){c=true,o+=1;break}if(u==="\\"){if(a=false,o+1>=e.length)break;i+=e[o+1],o+=2;continue}if(u===`
|
|
82
|
-
`||u==="\r"){a=false;break}i+=u,o+=1;}n||=!c,t.push({kind:"string",value:i,valid:a&&c});continue}if(r==="`"){let s=false,i=false;for(o+=1;o<e.length;){let a=e[o];if(!s&&a==="`"){i=true,o+=1;break}s=!s&&a==="\\",a!=="\\"&&(s=false),o+=1;}n||=!i,t.push({kind:"template",value:"",valid:i});continue}if(/[A-Za-z_$]/.test(r)){let s=o+1;for(;s<e.length&&/[A-Za-z0-9_$]/.test(e[s]);)s+=1;t.push({kind:"identifier",value:e.slice(o,s),valid:true}),o=s;continue}t.push({kind:"punctuation",value:r,valid:true}),o+=1;}return {tokens:t,malformed:n}}function
|
|
83
|
-
`;)t[o]=" ",o+=1;continue}if(r!=="'"&&r!=='"'){o+=1;continue}let s=o;for(;s>0&&/[A-Za-z]/.test(e[s-1]);)s-=1;let i=e.slice(s,o),a=/^(?:f|fr|rf)$/i.test(i),c=r,u=e.slice(o,o+3)===c.repeat(3),l=u?3:1,d=o;for(let
|
|
111
|
+
`||u==="\r"){a=false;break}i+=u,o+=1;}n||=!c,t.push({kind:"string",value:i,valid:a&&c});continue}if(r==="`"){let s=false,i=false;for(o+=1;o<e.length;){let a=e[o];if(!s&&a==="`"){i=true,o+=1;break}s=!s&&a==="\\",a!=="\\"&&(s=false),o+=1;}n||=!i,t.push({kind:"template",value:"",valid:i});continue}if(/[A-Za-z_$]/.test(r)){let s=o+1;for(;s<e.length&&/[A-Za-z0-9_$]/.test(e[s]);)s+=1;t.push({kind:"identifier",value:e.slice(o,s),valid:true}),o=s;continue}t.push({kind:"punctuation",value:r,valid:true}),o+=1;}return {tokens:t,malformed:n}}function Oa(e,t,n,o=true){let r=Aa(t),s=[],i=r.malformed,a=(d,g)=>{if(!d||d.kind!=="string"||!d.valid||d.value.length===0){i=true;return}s.push({value:d.value,cwd:dirname(e),project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:g,issuerPath:e});},{tokens:c}=r;for(let d=0;d<c.length;d+=1){let g=c[d],f=c[d-1];if(g.kind!=="identifier")continue;if(g.value==="eval"&&f?.value!=="."&&c[d+1]?.value==="("){i=true;continue}if(g.value==="require"){if(f?.value==="."){c[d-2]?.value==="module"&&c[d+1]?.value==="("&&(i=true);continue}if(c[d+1]?.value==="("){let p=c[d+2];c[d+3]?.value===")"||(i=true),a(p,"cjs");continue}i=true;continue}if(f?.value==="."||!["export","import"].includes(g.value))continue;if(g.value==="import"&&c[d+1]?.value==="("){let p=c[d+2];c[d+3]?.value===")"||(i=true),a(p,"esm");continue}if(g.value==="import"&&c[d+1]?.kind==="string"){a(c[d+1],"esm");continue}if(g.value==="import"&&c[d+1]?.value===".")continue;let m=-1;for(let p=d+1;p<Math.min(c.length,d+32)&&c[p].value!==";";p+=1)if(c[p].value==="from"){m=p;break}m>=0?a(c[m+1],"esm"):g.value==="import"&&(i=true);}let u=[],l=[];for(let d of s){let g=rn(d,o);g.reference&&u.push(g.reference),g.inlineContent&&l.push(g.inlineContent),i||=g.malformed;}return {references:u,inlineContents:l,malformed:i}}function Ta(e){let t=e.split(""),n=false;for(let o=0;o<e.length;){let r=e[o];if(r==="#"){for(;o<e.length&&e[o]!==`
|
|
112
|
+
`;)t[o]=" ",o+=1;continue}if(r!=="'"&&r!=='"'){o+=1;continue}let s=o;for(;s>0&&/[A-Za-z]/.test(e[s-1]);)s-=1;let i=e.slice(s,o),a=/^(?:f|fr|rf)$/i.test(i),c=r,u=e.slice(o,o+3)===c.repeat(3),l=u?3:1,d=o;for(let f=0;f<l;f+=1)t[d+f]=" ";d+=l;let g=false;for(;d<e.length;){if(e[d]==="\\"){t[d]=" ",d+1<e.length&&(t[d+1]=" "),d+=2;continue}if(e.slice(d,d+l)===c.repeat(l)){for(let f=0;f<l;f+=1)t[d+f]=" ";d+=l,g=true;break}if(!u&&(e[d]===`
|
|
84
113
|
`||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(`
|
|
114
|
+
`&&e[d]!=="\r"&&(t[d]=" "),d+=1;}if(a){let f=e.slice(o+l,d-l);for(let m=0;m<f.length;m+=1)if(f[m]==="{"){if(f[m+1]==="{"){m+=1;continue}n=true;break}}n||=!g,o=d;}return {content:t.join(""),malformed:n}}function Io(e,t){let n=t.split(".");if(n.length>on)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 Ia(e,t,n){let o=Ta(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=d=>{let g=dirname(e);for(let f=1;f<d;f+=1)g=dirname(g);return g},a=d=>{let g=Z(d,{...n,cwd:dirname(e)},true,"python");g?r.push(g):s=true;},c=(d,g=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(d))return s=true,null;let f=i(g),m=Io(f,d);s||=!m.resolved;for(let y of m.paths)a(y);let p=m.paths.at(-1);return p&&basename(p)==="__init__.py"?dirname(p):null},u=d=>{let g=[];for(let f of d.split(",")){let m=f.trim().split(/\s+as\s+/)[0];if(m==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(m)){s=true;continue}g.push(m);}return g},l=(d,g)=>{for(let f of u(g))d&&Io(d,f).resolved&&(s=true);};for(let d of o.content.split(/\r?\n/))for(let g of d.split(/[;:]/)){let f=g.trim();if(f.startsWith("import ")){let h=f.slice(7).split(",");for(let k of h)c(k.trim().split(/\s+as\s+/)[0]);continue}let m=f.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!m)continue;let p=m[1].length,y=m[2];if(y){let h=c(y,p);l(h,m[3]);continue}if(p===0){s=true;continue}let w=i(p),v=join$1(w,"__init__.py"),_=false;try{_=statSync$1(v).isFile();}catch{}if(_){a(v),l(w,m[3]);continue}for(let h of u(m[3]))c(h,p);}return {references:[...new Map(r.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function or(e,t,n,o,r=true){return n==="node"?Oa(e,t,o,r):n==="python"?Ia(e,t,o):{references:[],inlineContents:[],malformed:false}}function No(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=tt(e,0,r),i=new Set((s.artifacts??[]).map(g=>g.value)),a=s.tokens.filter(g=>!i.has(g)).map(g=>Z(g,r)).filter(g=>g!==null),c=[],u=[...s.inlineContents??[]],l=s.malformed;for(let g of s.artifacts??[]){if(g.nodeResolutionKind){let m=rn(g);m.reference&&c.push(m.reference),m.inlineContent&&u.push(m.inlineContent),l||=m.malformed;continue}let f=Z(g.value,{...r,cwd:g.cwd},true,g.parserKind);f?c.push(f):l=true;}let d=[...a,...c];return {references:[...new Map(d.map(g=>[`${g.path}:${g.parserKind}`,g])).values()],inlineContents:u,malformed:l}}function rr(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function ge(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 Xe(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function Ie(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function Fa(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||=ge(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 y=e[c+1];return y&&!u&&i(y),y?a():a(true)}if(!l.startsWith("-"))return u||i(l),a();if(La.has(l))return a();if(Ma.has(l)){u=true,c+=1;continue}let d=jo.has(l)?"cjs":Mo.has(l)?"esm":null;if(d){let y=e[c+1];if(!y)return a(true);i(y,d),c+=2;continue}let g=Ie(l,jo),f=Ie(l,Mo),m=g??f;if(m!==null){if(!m)return a(true);i(m,g!==null?"cjs":"esm"),c+=1;continue}if(l.startsWith("-r")&&l.length>2){i(l.slice(2),"cjs"),c+=1;continue}if(Lo.has(l)){let y=e[c+1];return a(y===void 0?true:s||Xe(y))}let p=Ie(l,Lo);if(p!==null)return a(s||Xe(p));if((l.startsWith("-e")||l.startsWith("-p"))&&l.length>2)return a(s||Xe(l.slice(2)));if(Fo.has(l)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(Ie(l,Fo)!==null){c+=1;continue}if(ja.has(l)){c+=1;continue}return a(true)}return u?a():a(true)}function Ha(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:ge(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?tt(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(Ua.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:ge(i)}}return {tokens:[],malformed:true}}function Ka(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:ge(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:ge(r)};if(Ba.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Uo.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(Ie(r,Uo)!==null){o+=1;continue}if(Wa.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function zt(e,t){let n=Z(e,t,true);if(!n)return null;let o=ie(n.path),r=ie(t.project);return !o||!r||!se(r,o)?null:o}function za(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(rr(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let u=Le(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?zt(c,i):null;if(!u)return {index:s,malformed:true};i={...i,cwd:u},s+=2;}else if(a.startsWith("--chdir=")){let c=zt(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=zt(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 tt(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>Xo)return {tokens:[],malformed:true};let r=Le(e,o),s=[],i=[],a=[],c=r.malformed;for(let u of r.segments){let l=sr(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 sr(e,t,n,o){let r=0;for(;rr(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;qa.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>Xo)return {tokens:i,malformed:true};let p=za(basename(s),e,r+1,n,o);if(p.malformed)return {tokens:i,malformed:true};if(n=p.context??n,p.replacement){let y=sr(p.replacement,a,p.context??n,o);return i.push(...y.tokens),{tokens:i,artifacts:y.artifacts,inlineContents:y.inlineContents,malformed:y.malformed}}if(r=p.index,s=e[r],!s)return {tokens:i,malformed:false}}let u=basename(s),l=!s.includes(sep)&&tr(u,o),d=c&&!Ga.has(u);if(l||d)return {tokens:i,malformed:true};let g=ge(s);i.push(s);let f=u;if(!Na.has(f))return {tokens:i,malformed:g};let m=["node","tsx"].includes(f)?Fa(e,r+1,n):["bash","sh","zsh"].includes(f)?Ha(e,r+1,a,n,o):Ka(e,r+1,n);return i.push(...m.tokens),{tokens:i,artifacts:m.artifacts,inlineContents:m.inlineContents,malformed:g||m.malformed}}function ir(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:ie(t.slice(0,o))}function Ja(e,t){let n=new Map;for(let o of t)for(let r of Da(o)){let s=ir(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 Va(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function Ya(e){return e.slice(e.lastIndexOf("@")+1)}function Wo(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=ie(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function Za(e,t,n){let o=Ya(e),r=N(t.extraKnownMarketplaces),s=N(r?.[o]);if(s){let i=N(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?Wo(i.path):null}}try{let i=N(fe(n)),a=N(i?.[o]);if(a){let c=N(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Wo(c.path):null}}}catch{}return {configured:false,root:null}}function Bo(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 Qa(e,t){let n=N(e.entry),o=N(t.entry),r=Bo(n),s=Bo(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?nt(n.version):null,a=typeof o?.version=="string"?nt(o.version):null;if(i&&a){let c=ar(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function Xa(e,t){try{let n=N(fe(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=N(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(Qa)[0],i=N(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:ie(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function nt(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 ar(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 ec(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=N(fe(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=nt(a.version),l=nt(c.version);if(u&&l){let d=ar(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]?ie(i[0].path):null}function tc(e,t){if(t.legacyArtifactRoots!==void 0){let h=t.legacyArtifactRoots.map(k=>ie(k)).filter(k=>k!==null).map(k=>({root:k,inspectPluginConfig:true}));return {targets:h,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:h.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 h of u)if(existsSync$1(h))try{let k=N(fe(h));if(!k)throw new Error("settings must be an object");i.push({path:h,settings:k});}catch{a.push(h);}if(i.reduce((h,k)=>typeof k.settings.disableAllHooks=="boolean"?k.settings.disableAllHooks:h,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let d=i.map(h=>{let k=[];return je(h.settings.hooks,k),{path:h.path,commands:k}}),g=d.flatMap(h=>h.commands),f=d.flatMap(h=>Ja(h.path,h.commands)),p=[...i.reduce((h,k)=>{let P=k.settings.enabledPlugins;if(typeof P!="object"||P===null)return h;for(let[A,q]of Object.entries(P))Va(A)&&typeof q=="boolean"&&h.set(A,q);return h},new Map)].filter(([,h])=>h).map(([h])=>h).sort(),y=[...f],w=false;for(let h of p){let k=Xa(h,o);k.malformed&&c.push(o);let P=k.root;if(!k.configured){let A=i.map(W=>Za(h,W.settings,r)).filter(W=>W.configured),q=A[A.length-1];q?P=q.root:P=ec(h,s);}P?y.push({root:P,inspectPluginConfig:true}):w=true;}let v=[...y.reduce((h,k)=>{let P=h.get(k.root);return P?(h.set(k.root,{root:k.root,configPath:P.configPath??k.configPath,commands:[...new Set([...P.commands??[],...k.commands??[]])],inspectPluginConfig:!!(P.inspectPluginConfig||k.inspectPluginConfig)}),h):(h.set(k.root,k),h)},new Map).values()],_=[g.length>0?"settings-hooks":null,p.length>0?"enabled-plugin":null].filter(h=>h!==null);return {targets:v,configCommands:d.filter(h=>h.commands.length>0),hooksDisabled:false,method:_.length>0?`${_.join("+")}${w?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(v.length>0||g.length>0)&&!w&&a.length===0&&c.length===0}}function nc(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 Jt(e){return [...e.matchAll(va)].map(t=>t[1])}function oc(e){let t=new Map,n=Le(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 rc(e){let t=spawnSync("bash",["--noprofile","--norc","-n"],{encoding:"utf8",env:{PATH:process.env.PATH??"",HOME:process.env.HOME??"",BASH_ENV:"",ENV:""},input:e,timeout:2e3});return t.error!==void 0||t.status!==0}function sc(e){if(![".cjs",".js",".mjs"].includes(extname(e)))return false;let t=spawnSync(process.execPath,["--check",e],{encoding:"utf8",env:{PATH:process.env.PATH??"",HOME:process.env.HOME??""},timeout:2e3});return t.error!==void 0||t.status!==0}function Vt(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function se(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Qt(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>Qe)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>Qe)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,Qe+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>Qe)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 Xt(e,t){return `${e} (${t})`}function ic(e,t,n,o){let r=[],s=new Set,i=0,a=(c,u=0)=>{if(u>on){o.traversalLimitRoots.push(e);return}let l=resolve(c.path),d=resolve(c.containmentRoot),g;try{g=realpathSync.native(d);}catch{g=d;}if(!existsSync$1(l)){se(d,l)?o.missing.push(l):o.escapedArtifacts.push(l);return}let f;try{f=realpathSync.native(l);}catch{o.missing.push(l);return}if(!se(g,f)){o.escapedArtifacts.push(l);return}let m=`${f}:${c.parserKind}:${c.cwd}`;s.has(m)||(s.add(m),r.push({...c,path:f,depth:u}));};for(let c of n){let u=No(c,e,t);u.malformed&&o.malformedCommands.push(c);for(let l of u.inlineContents)for(let d of Y(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>=Qo){o.traversalLimitRoots.push(e);break}let c=r.shift(),u=c.path;i+=1;let l=Qt(u);if(l.kind==="missing"){o.missing.push(u);continue}if(l.kind==="unsafe"){l.reason!=="binary"&&o.unsafeArtifacts.push(Xt(u,l.reason));continue}let{content:d}=l;o.inspected.push(u);let g=c.parserKind==="infer"?nr(u,d):c.parserKind,f=g==="shell";for(let m of Y(d,f,g))o.findings.push({artifact:u,endpoint:m});if(f){let m=No(d,e,t,c.cwd);m.malformed&&o.malformedCommands.push(u);for(let p of m.inlineContents)for(let y of Y(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:y});for(let p of m.references)a(p,c.depth+1);}else if(g==="node"||g==="python"){let m=or(u,d,g,{project:e,homePath:t,cwd:dirname(u)});m.malformed&&o.malformedCommands.push(u);for(let p of m.inlineContents)for(let y of Y(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:y});for(let p of m.references)a(p,c.depth+1);}}}function ac(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=nc(r),c=0,u=(f,m=false,p=r,y="infer",w=e,v=0)=>{if(v>on){o.traversalLimitRoots.push(r);return}let _=realpathSync.native(p),h=resolve(f);if(!existsSync$1(h)){if(!se(_,h)){o.escapedArtifacts.push(h);return}m&&o.missing.push(h);return}let k;try{k=realpathSync.native(h);}catch{m&&o.missing.push(h);return}if(!se(_,k)){o.escapedArtifacts.push(h);return}let P=`${k}:${y}:${w}`;i.has(P)||(i.add(P),s.push({path:k,parserKind:y,cwd:w,depth:v}));},l=(f,m,p,y=0)=>{for(let w of Jt(f)){let v=Vt(r,w);if(!v)continue;let _=(m.artifacts??[]).find(h=>h.value.includes("PLUGIN_ROOT")&&h.value.endsWith(w));u(v,true,r,_?.parserKind??"infer",_?.cwd??p,y);}},d=(f,m,p=0,y=false)=>{for(let w of f.artifacts??[]){if(w.value.includes("PLUGIN_ROOT"))continue;let v=w.nodeResolutionKind?rn(w,!y):{reference:Z(w.value,{project:w.project,homePath:w.homePath,cwd:w.cwd},true,w.parserKind)??void 0,malformed:false};if(v.malformed){o.malformedCommands.push(w.value);continue}if(v.inlineContent)for(let _ of Y(v.inlineContent.content,false,"node"))o.findings.push({artifact:v.inlineContent.source,endpoint:_});v.reference&&u(v.reference.path,true,y?r:v.reference.containmentRoot,v.reference.parserKind,v.reference.cwd??m,p);}},g=f=>{for(let p of Y(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:p});let m=tt(f,0,{project:e,homePath:t,cwd:e});m.malformed&&o.malformedCommands.push(f),l(f,m,e),d(m,e);for(let p of m.tokens){if(!isAbsolute(p))continue;let y=ir(p),w=(m.artifacts??[]).find(v=>v.value===p);y===r&&u(p,true,r,w?.parserKind??"infer",w?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let f of n.commands)g(f);}if(n.inspectPluginConfig||!n.commands){let f=join$1(r,"hooks","hooks.json"),m=join$1(r,"hooks.json"),p=existsSync$1(m)?m:f;if(!existsSync$1(p))o.missing.push(p),u(join$1(r,"hooks","session-start"));else {o.configsInspected.push(p);let y;try{y=realpathSync.native(p);}catch{o.missing.push(p),u(join$1(r,"hooks","session-start")),y="";}if(y&&!se(r,y)&&(o.escapedArtifacts.push(p),u(join$1(r,"hooks","session-start")),y=""),y){let w=Qt(y);if(w.kind==="unsafe")o.unsafeArtifacts.push(Xt(p,w.reason)),u(join$1(r,"hooks","session-start"));else if(w.kind==="missing")o.missing.push(p),u(join$1(r,"hooks","session-start"));else try{let v=JSON.parse(w.content),_=[];je(v,_);for(let h of _)g(h);}catch{o.malformedConfigs.push(p),u(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=Qo){o.traversalLimitRoots.push(r);break}let f=s.shift(),m=f.path;c+=1;let p=Qt(m);if(p.kind==="missing"){o.missing.push(m);continue}if(p.kind==="unsafe"){o.unsafeArtifacts.push(Xt(m,p.reason));continue}let{content:y}=p;o.inspected.push(m);let w=f.parserKind==="infer"?nr(m,y):f.parserKind,v=w==="shell";for(let k of Y(y,v,w))o.findings.push({artifact:m,endpoint:k});if(v){let k=oc(y),P=tt(k,0,{project:e,homePath:t,cwd:dirname(m)},{tolerateControlSyntax:true});rc(y)&&o.malformedCommands.push(m),l(k,P,dirname(m),f.depth+1),d(P,dirname(m),f.depth+1,true);}else if(w==="node"||w==="python"){let k=or(m,y,w,{project:e,homePath:t,cwd:dirname(m)},false);(w==="node"?sc(m):k.malformed)&&o.malformedCommands.push(m);for(let P of k.inlineContents)for(let A of Y(P.content,false,"node"))o.findings.push({artifact:P.source,endpoint:A});for(let P of k.references){let A=relative(r,resolve(P.path));!A.startsWith(`..${sep}`)&&A.split(sep).includes("node_modules")||u(P.path,true,r,P.parserKind,P.cwd,f.depth+1);}for(let P of Jt(y)){let A=Vt(r,P);A&&u(A,true,r,w,f.cwd,f.depth+1);}}else for(let k of Jt(y)){let P=Vt(r,k);P&&u(P,true,r,w,f.cwd,f.depth+1);}let _=m.startsWith(`${r}/`)?m.slice(r.length+1):"",h=basename(_).replace(/\.js$/,"");a&&(_.startsWith("hooks/")||_.startsWith("dist/hooks/"))&&u(join$1(a,"packages","devflow","src","hooks",`${h}.ts`),false,a),_.startsWith("hooks/")&&u(join$1(r,"dist","hooks",`${h}.js`));}}function cc(e){let t=e.installedPluginsPath??join$1(e.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),n=new Map;if(!existsSync$1(t))return new Map;try{let o=N(fe(t)),r=N(o?.plugins);if(!r)return new Map;for(let s of Object.values(r))if(Array.isArray(s))for(let i of s){let a=N(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=ie(a.installPath);if(!c)continue;let u=n.get(c)??new Set;u.add(a.version),n.set(c,u);}}catch{return new Map}return new Map([...n].map(([o,r])=>[o,[...r].sort()]))}function Ho(e){try{let t=N(fe(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function lc(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=cc(t);for(let r of e){let s=r.root,i=join$1(s,"package.json"),a=join$1(s,".claude-plugin","plugin.json");if(!(existsSync$1(i)||existsSync$1(a)))continue;let u=join$1(s,"hooks","hooks.json"),l=join$1(s,"hooks.json");existsSync$1(u)||n.layoutIssues.push({root:s,issue:"missing hooks/hooks.json"}),existsSync$1(l)&&n.layoutIssues.push({root:s,issue:"retired root hooks.json is present"});let d=existsSync$1(u)?u:l;try{let v=N(fe(d)),_=N(v?.hooks),h=[];je(_?.SessionStart,h),h.some(k=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(k))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let g=Ho(i),f=Ho(a),m=o.get(s)??[],p={root:s,packageVersion:g,manifestVersion:f,registryVersions:m};n.versionRecords.push(p),(!g||!f||g!==f||m.some(v=>v!==g))&&n.versionIssues.push(p);let y=join$1(s,"hooks","session-start"),w=join$1(s,"dist","hooks","hook-daemon.js");try{let v=readFileSync$1(y,"utf8");(!existsSync$1(w)||!v.includes("hook-daemon.js"))&&n.daemonIssues.push({root:s,issue:"SessionStart does not register the packaged hook daemon"});}catch{n.daemonIssues.push({root:s,issue:"SessionStart wrapper or hook daemon is missing"});}}return n}function uc(e,t){let n=tc(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let v of n.configCommands){o.configsInspected.push(v.path);for(let _ of v.commands){o.commandsInspected.push({configPath:v.path,command:_});for(let h of Y(_,true))o.findings.push({artifact:v.path,endpoint:h});}}ic(e,t.homePath??homedir$1(),n.configCommands.flatMap(v=>v.commands).filter(v=>!n.targets.some(_=>_.commands?.includes(v))),o);for(let v of n.targets)ac(e,t.homePath??homedir$1(),v,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((v,_,h)=>h.findIndex(k=>k.configPath===v.configPath&&k.command===v.command)===_),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)],g=[...new Set(o.escapedArtifacts)],f=o.findings.filter((v,_,h)=>h.findIndex(k=>k.artifact===v.artifact&&k.endpoint===v.endpoint)===_),m=a.length>0||g.length>0||l.length>0,p=m&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,y=lc(n.targets,t),w=[{key:"active_plugin_resolution",value:p,target:"resolved active DevFlow hook configuration",ok:n.ok&&!m,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(v=>v.root),ok:true,severity:"info"},{key:"hooks_disabled",value:n.hooksDisabled,ok:true,severity:"info"},{key:"plugin_hook_layout",value:y.layoutIssues,target:"hooks/hooks.json present and root hooks.json absent",ok:y.layoutIssues.length===0,severity:"error"},{key:"plugin_version_parity",value:y.versionRecords,target:"manifest, package, and installed registry versions match",ok:y.versionIssues.length===0,severity:"error"},{key:"session_start_hook_registration",value:y.sessionStartIssues,target:[],ok:y.sessionStartIssues.length===0,severity:"error"},{key:"hook_daemon_artifact_registration",value:y.daemonIssues,target:[],ok:y.daemonIssues.length===0,severity:"error"},{key:"malformed_active_settings",value:n.malformedSettings,target:[],ok:n.malformedSettings.length===0,severity:"warning"},{key:"malformed_plugin_metadata",value:n.malformedPluginMetadata,target:[],ok:n.malformedPluginMetadata.length===0,severity:"warning"},{key:"hook_configs_inspected",value:r.length,target:n.hooksDisabled?"hooks disabled":">= 1 hook config file",ok:n.hooksDisabled||r.length>0,severity:"warning"},{key:"legacy_artifacts_inspected",value:s.length+i.length,target:n.hooksDisabled?"hooks disabled":">= 1 active hook artifact",ok:n.hooksDisabled||s.length+i.length>0,severity:"warning"},{key:"missing_legacy_artifacts",value:a,target:[],ok:a.length===0,severity:"warning"},{key:"malformed_hook_configs",value:c,target:[],ok:c.length===0,severity:"warning"},{key:"malformed_hook_commands",value: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:g.length,target:0,ok:g.length===0,severity:"warning"},{key:"retired_producer_paths",value:f.length,target:0,ok:f.length===0,severity:"error"},{key:"retired_producer_path_findings",value:f,ok:true,severity:"info"}];return {name:"Legacy paths",status:O(w),metrics:w}}function dc(e){let t=dirname(fileURLToPath(import.meta.url)),n=[...new Set([e.acceptanceManifestPath,e.env?.DEVFLOW_ACCEPTANCE_MANIFEST,process.env.DEVFLOW_ACCEPTANCE_MANIFEST,join$1(t,"..","acceptance-manifest.json"),join$1(t,"..","..","..","..","packages","devflow","acceptance-manifest.json"),join$1(process.cwd(),"packages","devflow","acceptance-manifest.json")].filter(o=>!!o))];for(let o of n)if(existsSync$1(o))try{return {path:o,manifest:JSON.parse(readFileSync$1(o,"utf8"))}}catch(r){return {path:o,error:r.message}}return {error:`not found (${n.join(", ")})`}}function st(e){let t=dc(e);if(!t.manifest)return {metrics:[{key:"batch4_acceptance_manifest",value:t.error??"missing",target:"readable acceptance-manifest.json",ok:false,severity:"warning"}]};let n=Date.parse(t.manifest.verifiedAt),o=Number.isFinite(n)?((e.now??Date.now)()-n)/ve: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 gc(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=H(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:j(a,"SELECT COUNT(*) count FROM observations WHERE source = 'explicit_intent'"),ok:!0,severity:"info"});}catch(c){n.push({key:"explicit_memory_channel_read",value:c.message,target:"readable memory database",ok:false,severity:"error"});}finally{a?.close();}}return {name:"Injection",status:O(n),metrics:n}}function fc(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:O(n),metrics:n};let r;try{if(r=H(o,t),!L(r,"memories"))n.push({key:"memories_schema",value:"memories table missing",target:"Batch 3 memory schema",ok:!1,severity:"warning"});else {let s=(t.now??Date.now)()-7*ve,i=r.prepare(`
|
|
86
115
|
SELECT source, COUNT(*) count FROM memories
|
|
87
116
|
WHERE created_at >= ? GROUP BY source ORDER BY source
|
|
88
117
|
`).all(s),a=r.prepare(`
|
|
@@ -90,10 +119,10 @@ ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function Ce(){let e=Nt(process.cwd(
|
|
|
90
119
|
SUM(CASE WHEN access_count = 0 THEN 1 ELSE 0 END) never_accessed,
|
|
91
120
|
SUM(CASE WHEN access_count > 0 THEN 1 ELSE 0 END) accessed
|
|
92
121
|
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{r?.close();}return {name:"Memory quality",status:
|
|
94
|
-
`)}async function
|
|
122
|
+
`).get();n.push({key:"memory_sources_7d",value:Object.fromEntries(i.map(c=>[c.source,Number(c.count)])),ok:!0,severity:"info"}),n.push({key:"memory_access_distribution",value:{neverAccessed:Number(a?.never_accessed??0),accessed:Number(a?.accessed??0)},ok:!0,severity:"info"});}}catch(s){n.push({key:"memory_quality_read",value:s.message,target:"readable memory database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Memory quality",status:O(n),metrics:n}}function mc(e,t){let n=[],o=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(o))return n.push({key:"knowledge_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Knowledge quality",status:O(n),metrics:n};let r;try{if(r=H(o,t),!L(r,"knowledge_chunks"))n.push({key:"knowledge_schema",value:"knowledge_chunks missing",target:"Batch 3 knowledge schema",ok:!1,severity:"warning"});else {let s=r.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=r.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{r?.close();}return {name:"Knowledge quality",status:O(n),metrics:n}}function pc(e){let{manifest:t,metrics:n}=st(e),o=t?.contract?.surfaces??[];return n.push({key:"contract_surfaces",value:o,target:["cli","http","mcp","hook"],ok:t?.contract?.status==="green"&&o.length===4,severity:"error"}),n.push({key:"contract_test_files",value:t?.contract?.tests?.length??0,target:4,ok:t?.contract?.tests?.length===4,severity:"warning"}),{name:"Contract",status:O(n),metrics:n}}function hc(e){let{manifest:t,metrics:n}=st(e),o=t?.deadcode?.actionableExports;return n.push({key:"ts_prune_actionable_exports",value:o??"missing",target:0,ok:t?.deadcode?.status==="green"&&o===0,severity:"error"}),n.push({key:"ts_prune_allowlisted_exports",value:t?.deadcode?.allowlistedExports??"missing",ok:true,severity:"info"}),{name:"Deadcode",status:O(n),metrics:n}}function yc(e){let{manifest:t,metrics:n}=st(e),o=t?.dataFace?.sharedAdapters??[];return n.push({key:"shared_retrieval_adapters",value:o,target:["getProjectContextResult","getMemoryResult","getKnowledgeResult"],ok:t?.dataFace?.status==="green"&&o.length===3,severity:"error"}),{name:"Data face",status:O(n),metrics:n}}async function wc(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 vc(e){let{manifest:t,metrics:n}=st(e),o=t?.ui?.routes??[];n.push({key:"dashboard_routes",value:o.length,target:">= 13",ok:t?.ui?.status==="green"&&o.length>=13,severity:"warning"});let s=`http://127.0.0.1:${e.env?.PORT??process.env.PORT??"13337"}/api/health`;try{let i=await(e.httpGet??wc)(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:O(n),metrics:n}}async function sn(e={},t={}){let n=e.project??process.cwd(),o=Zt(n),r=[ra(n,t),ua(o.path,t),uc(o.path,t),da(o.path,t),ga(o.path,!!e.strict,t),gc(o.path,t),fc(o.path,t),mc(o.path,t),pc(t),hc(t),pa(t),yc(t),ma(t),await vc(t),ya(t)],s=e.strict&&r.some(i=>i.status!=="green")?1:0;return {sections:r,exitCode:s}}function kc(e,t={}){return e===void 0?lr():sn(e,t)}function Ko(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function cr(e){let t=[];for(let n of e.sections){let o=`[${n.status.toUpperCase()}]`,r=n.status==="green"?S.green:n.status==="yellow"?S.yellow:S.red;t.push(`${r(o)} ${S.bold(n.name)}`);for(let s of n.metrics){let i=s.target===void 0?"":` (target: ${Ko(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${Ko(s.value)}${i}`);}}return t.join(`
|
|
123
|
+
`)}async function bc(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await sn(e,n);return t.stdout(e.json?JSON.stringify(o):cr(o)),o.exitCode}async function it(e){let{createEngines:t}=await import('@devflow-tools/context-engine');return t(e)}async function lr(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await it(e),a=t.getStats(),c=n.export(),u=0;try{u=(await s.list()).length;}catch{}let l=false,d=0;try{let y=await o.getAll();l=!!y?.project,d=Object.keys(y?.user??{}).length;}catch{}let g=0;try{g=(await r.getSources()).length;}catch{}let f={total:0,byTool:{}};try{f=await i.getToolCallStats();}catch{}let m=await Te(),p=0;return a.fileCount>0&&(p+=25),a.nodeCount>0&&(p+=15),c.nodes.length>0&&(p+=20),l&&(p+=15),g>0&&(p+=10),u>0&&(p+=5),m.running&&(p+=10),f.total>0&&(p+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:l,userPrefs:d},knowledge:{sources:g},plugins:{installed:0,names:[]},workflows:{registered:u},server:{running:m.running},toolCalls:f,readyScore:p}}async function Sc(){let{data:e}=await it(process.cwd()),t=await e.auditGetSecret(),n=await e.auditGetAll(),o=createHash("sha256").update("genesis").digest("hex");for(let r of n){if(r.prevHash!==o)return {valid:false,brokenAt:r.seq,entryCount:n.length};let s=`${r.seq}|${r.ts}|${r.tool}|${r.argsHash}|${r.decision}|${r.ruleId??""}|${r.sessionId}|${o}`,i=createHmac("sha256",t).update(s).digest("hex");if(r.signature!==i)return {valid:false,brokenAt:r.seq,entryCount:n.length};o=r.signature;}return {valid:true,brokenAt:null,entryCount:n.length}}async function _c(){let{data:e}=await it(process.cwd()),t=await e.auditGetSecret(),n=await e.auditGetAll(),o=createHash("sha256").update("genesis").digest("hex");for(let r of n){let s=`${r.seq}|${r.ts}|${r.tool}|${r.argsHash}|${r.decision}|${r.ruleId??""}|${r.sessionId}|${o}`,i=createHmac("sha256",t).update(s).digest("hex");await e.sqlExecute("UPDATE devflow_audit_chain SET prev_hash = ?, signature = ? WHERE seq = ?",[o,i,r.seq]),o=i;}return {rebuilt:true}}async function Pc(e){let{data:t}=await it(process.cwd()),o=(await t.auditGetAll()).filter(r=>r.decision!=="allow");if(e){let r=e.match(/^(\d+)([dh])$/);if(r){let s=Number.parseInt(r[1],10),i=r[2]==="d"?s*864e5:s*36e5,a=Date.now()-i;o=o.filter(c=>c.ts>a);}}return {violations:o.map(r=>({tool:r.tool,decision:r.decision,ruleId:r.ruleId,ts:r.ts,sessionId:r.sessionId}))}}function Rc(){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 Ze,sa,Vo,la,ve,fa,Ao,wa,va,Qo,Qe,on,Xo,er,ka,ba,Sa,To,Na,jo,Mo,Lo,Fo,ja,Ma,La,Ua,Wa,Uo,Ba,qa,Ga,dr=C(()=>{ne();sa={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},Vo=3600*1e3;la=new Set(["pending","committed","expired"]);ve=1440*60*1e3,fa=30*ve,Ao=60*1024*1024;wa=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,va=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,Qo=64,Qe=1024*1024,on=8,Xo=8,er=64*1024;ka=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),ba=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),Sa=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;To=[".cjs",".js",".mjs",".ts",".tsx"];Na=new Set(["bash","node","python","python3","sh","tsx","zsh"]);jo=new Set(["-r","--require"]),Mo=new Set(["--experimental-loader","--import","--loader"]),Lo=new Set(["-e","--eval","-p","--print"]),Fo=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),ja=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),Ma=new Set(["--check","-c"]),La=new Set(["--help","--version","-h","-v"]);Ua=new Set(["-e","-eu","-o","-u","-ue"]),Wa=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Uo=new Set(["-W","-X","--check-hash-based-pycs"]),Ba=new Set(["--help","--version","-h","-V"]);qa=new Set(["builtin","command","env","exec","nohup","timeout"]),Ga=new Set([":","[","echo","false","printf","pwd","test","true"]);});var gr={};$(gr,{generateToken:()=>Cc});async function Cc(e,t=3600){let n=Buffer.from(JSON.stringify({alg:"HS256",typ:"JWT"})).toString("base64url"),o=Math.floor(Date.now()/1e3),r={sub:`devflow-session-${Date.now().toString(36)}`,project:e.split("/").pop()??"unknown",iat:o,exp:o+t,scope:["context","knowledge","memory","workflow","graph"]},s=Buffer.from(JSON.stringify(r)).toString("base64url"),i=getLocalHmacSecret(),a=createHmac("sha256",i).update(`${n}.${s}`).digest("base64url");return {token:`${n}.${s}.${a}`,expiresAt:r.exp,scope:r.scope}}var fr=C(()=>{});var an={};$(an,{reportBenchmarkCommand:()=>Tc,runBenchmarkCommand:()=>Oc});async function Oc(e){let t=e.suite??"default",n=getBenchmarkSuite(t);if(!n)throw new Error(`Unknown benchmark suite "${t}"`);let r=await new BenchmarkEngine().runSuite(e.projectRoot,n,{rounds:e.rounds}),s=e.database??openGlobalDevFlowDatabase();try{s.insertBenchmarkReport(r);}finally{e.database||s.close();}let i=renderBenchmarkReport(r,e.output??"text");return e.output==="json"?i:`${i}
|
|
95
124
|
|
|
96
|
-
Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function
|
|
125
|
+
Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function Tc(e={}){let t=e.database??openGlobalDevFlowDatabase(),n,o=null;try{n=e.runId?t.getBenchmarkReport(e.runId):t.getLatestBenchmarkReport(),e.baselineRunId&&(o=t.getBenchmarkReport(e.baselineRunId));}finally{e.database||t.close();}if(!n)throw new Error(e.runId?`Benchmark report "${e.runId}" not found`:"No benchmark reports found. Run `devflow benchmark run` first.");if(e.baselineRunId&&!o)throw new Error(`Benchmark baseline "${e.baselineRunId}" not found`);let r=e.output??"text",s=renderBenchmarkReport(n,r);if(!o||r==="json")return s;let i=Ic(o,n);return r==="markdown"?`${s}
|
|
97
126
|
## Change From Prior Baseline
|
|
98
127
|
|
|
99
128
|
${i.map(a=>`- ${a}`).join(`
|
|
@@ -102,20 +131,20 @@ ${i.map(a=>`- ${a}`).join(`
|
|
|
102
131
|
|
|
103
132
|
Change from ${o.runId}:
|
|
104
133
|
${i.map(a=>`- ${a}`).join(`
|
|
105
|
-
`)}`}function
|
|
106
|
-
`)}var
|
|
107
|
-
Shutting down...`)),await
|
|
134
|
+
`)}`}function Ic(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [at("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),at("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),at("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),at("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function at(e,t,n,o){let r=t>0?(n-t)/t:0,s=o?r<-0.1:r>.1,i=r>0?"+":"";return `${e}: ${i}${(r*100).toFixed(1)}%${s?" (regression >10%)":""}`}var cn=C(()=>{});var yr={};$(yr,{runReview:()=>Nc});async function Nc(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 o=(t.match(/^diff --git/gm)??[]).length,r=(t.match(/^\+[^+]/gm)??[]).length,s=(t.match(/^-[^-]/gm)??[]).length,i=[],a=[],c=[];return t.includes("console.log")&&a.push("Contains console.log statements \u2014 remove before merge"),(t.includes(".only(")||t.includes("it.only"))&&i.push("Contains .only() test filters \u2014 remove before merge"),(t.includes("TODO")||t.includes("FIXME"))&&a.push("Contains TODO/FIXME comments \u2014 track or resolve"),(t.match(/^\+.*TODO/gm)||t.match(/^\+.*FIXME/gm))&&a.push("New code introduces TODO/FIXME comments"),t.includes("process.exit")&&a.push("Contains process.exit() \u2014 consider throwing instead"),t.includes(": any")&&t.match(/^\+.*: any/gm)&&c.push("New code uses `any` type \u2014 use explicit types instead"),[S.blue("\u25C9 Code Review"),"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",n,`Files changed: ${o}`,`+${r} / -${s}`,"",i.length>0?S.red(`Critical (${i.length})`):"",...i.map(l=>` ${S.red("\u25CF")} ${l}`),"",a.length>0?S.yellow(`Warning (${a.length})`):"",...a.map(l=>` ${S.yellow("\u25CB")} ${l}`),"",c.length>0?S.green(`Suggestion (${c.length})`):"",...c.map(l=>` ${S.green("\u25CB")} ${l}`),"",i.length>0?S.red("Overall: Need changes"):a.length>0?S.yellow("Overall: Approve with comments"):S.green("Overall: LGTM")].join(`
|
|
135
|
+
`)}var wr=C(()=>{});var vr={};$(vr,{startAll:()=>Mc});async function jc(e,t=15e3){let n=Date.now();for(;Date.now()-n<t;){try{if((await fetch(`http://127.0.0.1:${e}/api/health`)).ok)return !0}catch{}await new Promise(o=>setTimeout(o,500));}return false}async function Mc(e){console.log(S.blue("Starting DevFlow server..."));let{pid:t}=await Bt({port:e.port});console.log(S.green(` Server started (PID: ${t})`)),console.log(S.blue(" Waiting for server..."));let n=await jc(e.port);console.log(n?S.green(" Server ready"):S.yellow(" Server started but health check timed out")),console.log(""),console.log(S.green("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557")),console.log(S.green("\u2551")+" DevFlow Started! "+S.green("\u2551")),console.log(S.green("\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563")),console.log(S.green("\u2551")+` Server + Dashboard: http://localhost:${e.port}`.padEnd(57)+S.green("\u2551")),console.log(S.green("\u2551")+` API: http://localhost:${e.port}/api`.padEnd(57)+S.green("\u2551")),console.log(S.green("\u2551")+" "+S.green("\u2551")),console.log(S.green("\u2551")+" Press Ctrl+C to stop "+S.green("\u2551")),console.log(S.green("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D")),e.background||await new Promise(o=>{let r=false,s=async()=>{r||(r=true,console.log(S.blue(`
|
|
136
|
+
Shutting down...`)),await Oe(),console.log(S.green("Server stopped.")),o());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var kr=C(()=>{ne();});var Sr={};$(Sr,{stopAll:()=>Lc});async function Lc(){let e=await Oe();console.log(e?S.green("Server stopped"):S.dim("No DevFlow services running"));}var _r=C(()=>{ne();});var Rr={};$(Rr,{showStatus:()=>Hc});function Bc(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 Hc(){console.log(S.blue("DevFlow Status")),console.log(S.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let e=await Te(),t=e.port??Je;e.running?(console.log(`Server: ${S.green("\u2713")} running (port ${t}${e.pid?`, PID ${e.pid}`:""})`),console.log(`Dashboard: ${S.green("\u2713")} served at http://localhost:${t}`)):(console.log(`Server: ${S.yellow("\u25CB")} not running`),console.log(`Dashboard: ${S.yellow("\u25CB")} not running`));let n=getGlobalDevFlowDbPath();if(existsSync(n)){let a=(statSync(n).size/1024/1024).toFixed(1);console.log(`Data: ${n} (${a} MB)`);}else console.log(`Data: ${S.dim(`no global database (${n})`)}`);let o=join(process.cwd(),".devflow","devflow.db"),r=join(process.cwd(),".codegraph","codegraph.db"),s=[...existsSync(o)?[o]:[],...Bc(r)?[`${r} (devflow_* tables)`]:[]];s.length>0?console.log(`Legacy: ${S.yellow(s.join(", "))}`):console.log(`Legacy: ${S.green("none")}`);}var Er=C(()=>{ne();});var xr={};$(xr,{setupCommand:()=>Xc});function Zc(){let e=[resolve$1(dirname$1(Yc.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 Qc(e,t){let n={};if(existsSync(e))try{n=JSON.parse(readFileSync(e,"utf-8"));}catch{n={};}let o={...n,...t};writeFileSync(e,JSON.stringify(o,null,2));}async function Xc(e){if(console.log(S.blue("DevFlow Setup")),console.log(S.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),!e.skipMcp)try{let t=await xt({agent:e.agent,command:"devflow-mcp"});for(let n of t)console.log(S.green(` \u2713 MCP: ${n}`));}catch(t){console.log(S.yellow(` \u26A0 MCP setup failed: ${t.message}`)),console.log(S.dim(" You can configure MCP manually with: devflow connect"));}if(!e.skipPlugin){let t=Zc();if(t){let n=join(homedir(),".claude","plugins");mkdirSync(n,{recursive:true});let o=join(n,"known_marketplaces.json");Qc(o,{devflow:{source:{directory:t}}}),console.log(S.green(` \u2713 Plugin registered: ${t}`));}else console.log(S.yellow(" \u26A0 Plugin directory not found")),console.log(S.dim(" The Claude Code plugin may not be available."));}console.log(""),console.log(S.green("Setup complete!")),console.log(S.dim("Restart Claude Code to use /devflow:* commands"));}var Yc,$r=C(()=>{$t();Yc=createRequire(import.meta.url);});var Ar={};$(Ar,{pluginListCommand:()=>tl});var tl,Or=C(()=>{He();tl=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=pe();if(e.installed){let n=On();if(n.length===0){console.log("No plugins installed."),console.log(`
|
|
108
137
|
Run "devflow plugin list" to see available plugins.`);return}console.log(`Installed plugins:
|
|
109
|
-
`),n.forEach(o=>{let r=t.plugins.find(s=>s.name===o);r?(console.log(` ${
|
|
110
|
-
`);let n=Math.max(...t.plugins.map(o=>o.name.length));t.plugins.forEach(o=>{let r=" ".repeat(n-o.name.length+2);console.log(` ${
|
|
111
|
-
Install a plugin: devflow plugin install <name>`);}});});var
|
|
138
|
+
`),n.forEach(o=>{let r=t.plugins.find(s=>s.name===o);r?(console.log(` ${S.green(r.name)}@${r.version}`),console.log(` ${r.description}`)):console.log(` ${S.green(o)}`);});}else {if(t.plugins.length===0){console.log("No plugins available.");return}console.log(`Available plugins (${t.plugins.length}):
|
|
139
|
+
`);let n=Math.max(...t.plugins.map(o=>o.name.length));t.plugins.forEach(o=>{let r=" ".repeat(n-o.name.length+2);console.log(` ${S.green(o.name)}${r}v${o.version}`),console.log(` ${" ".repeat(n)}${o.description.substring(0,60)}`),o.tags.length>0&&console.log(` ${" ".repeat(n)}Tags: ${o.tags.join(", ")}`),console.log("");}),console.log(`
|
|
140
|
+
Install a plugin: devflow plugin install <name>`);}});});var Tr={};$(Tr,{pluginSearchCommand:()=>rl});var rl,Ir=C(()=>{He();rl=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=pe(),n=e.toLowerCase(),o=t.plugins.filter(r=>r.name.toLowerCase().includes(n)||r.description.toLowerCase().includes(n)||r.tags.some(s=>s.toLowerCase().includes(n)));if(o.length===0){console.log(`No plugins found matching "${e}"`),console.log(`
|
|
112
141
|
Try: devflow plugin list`);return}console.log(`Found ${o.length} plugin(s) matching "${e}":
|
|
113
|
-
`),o.forEach(r=>{console.log(` ${
|
|
114
|
-
${
|
|
142
|
+
`),o.forEach(r=>{console.log(` ${S.green(r.name)}@${r.version}`),console.log(` ${r.description}`),r.tags.length>0&&console.log(` Tags: ${r.tags.join(", ")}`),console.log(` Size: ${r.size}`),console.log("");});});});var jr={};$(jr,{pluginInstallCommand:()=>al});var al,Mr=C(()=>{al=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(`
|
|
143
|
+
${S.green("\u2713")} ${t} installed successfully`),console.log(`
|
|
115
144
|
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 r=await o.getSources();for(let s of r){let i=await o.syncDocs(s.source.name);for(let a of i)a.added>0?console.log(` ${
|
|
121
|
-
All docs synced.`));}});
|
|
145
|
+
${S.red("\u2717")} Installation failed: ${n.message}`),process.exit(1);}});});var Fr={};$(Fr,{pluginUninstallCommand:()=>ul});var ul,Ur=C(()=>{ul=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(`
|
|
146
|
+
${S.green("\u2713")} ${t} uninstalled successfully`);}catch(n){console.error(`
|
|
147
|
+
${S.red("\u2717")} Uninstallation failed: ${n.message}`),process.exit(1);}});});function dt(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 Br=createRequire(import.meta.url),gn="0.0.0";try{gn=Br("../package.json").version;}catch{try{gn=Br("../../package.json").version;}catch{}}var R=new Command;R.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(gn).option("--local","Force local engine, skip server");R.command("init").description("Initialize .devflow/ in the current project").option("--force","Overwrite existing config").option("--abort","Force delete .codegraph and .devflow directories before reinitializing").option("--report","Output onboarding markdown report to stdout").option("--json","Output onboarding pack as JSON to stdout").option("--plugins <names>","Comma-separated list of plugins to install (non-interactive)").option("--with-plugin <names>","Interactively review optional memory hints from installed plugins").option("--no-plugins","Skip plugin installation guide").action(async e=>{let t=process.cwd();if(e.abort){console.log(S.yellow("\u{1F5D1}\uFE0F --abort flag detected, removing existing directories..."));let i=[".codegraph",".devflow"];for(let a of i){let c=gl.join(t,a);Wr.existsSync(c)&&(console.log(S.dim(` Removing ${a}/...`)),Wr.rmSync(c,{recursive:true,force:true}));}console.log(S.green(`\u2705 Existing directories removed
|
|
148
|
+
`));}let n=dt(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(xn(),Cn)),s=await o(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(r(s.onboardingPack));else {if(s.created.length>0){console.log(S.green("Created:"));for(let i of s.created)console.log(` ${S.dim("+")} ${i}`);}else console.log(S.dim("Already initialized. Use --force to overwrite config."));if(s.indexed&&console.log(S.green(`\u2705 CodeGraph initialized (${s.indexed.files} files, ${s.indexed.symbols} symbols)`)),s.onboardingPack){let i=s.onboardingPack;console.log(S.green("\u2705 Onboarding pack generated")),console.log(S.dim(` ${i.stats.files} files, ${i.stack.frameworks.join(", ")||"no framework"}`));}if(s.pluginDeployed&&console.log(S.green("\u2705 Plugin deployed to ~/.claude/plugins/cache/")),s.pluginEnabled&&console.log(S.green("\u2705 Plugin enabled in ~/.claude/settings.json")),s.mcpConfigured&&console.log(S.green("\u2705 MCP config written to .claude/mcp.json")),s.pluginDeployed&&s.pluginEnabled&&s.mcpConfigured&&console.log(S.green("\nDevFlow is ready! Run `claude` to start.")),typeof e.withPlugin=="string"){let{reviewPluginMemoryHints:i}=await Promise.resolve().then(()=>(An(),$n)),a=await i(t,e.withPlugin);console.log(S.dim(`Plugin memory hints: ${a.selected}/${a.available} selected`));}if(typeof e.plugins=="string"){let{installPluginsFromList:i}=await Promise.resolve().then(()=>(wt(),yt));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(wt(),yt));await i(t);}}});R.command("reset").description("Reset generated DevFlow project data").requiredOption("--scope <scope>","memory | knowledge | codegraph | all").option("--backup-to <dir>","Back up selected data before resetting").option("--force","Reset without creating a backup").option("--project <path>","Project directory",process.cwd()).action(async e=>{let{executeResetCommand:t}=await Promise.resolve().then(()=>(Gn(),qn));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.red(o))})||(process.exitCode=1);});var ml=R.command("db").description("Manage DevFlow databases");ml.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(()=>(no(),to)),o=t(e);for(let r of n(o))console.log(r);});R.command("connect [agent]").description("Configure the Claude Code MCP connection").option("--command <cmd>","MCP server command","devflow-mcp").action(async(e,t)=>{let n=process.cwd(),o=dt(n);console.log(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>($t(),oo));if(e){let i=s();i.includes(e)||(console.log(S.red(`Unknown agent: ${e}`)),console.log(`Available: ${i.join(", ")}`),process.exit(1));}try{let i=await r({agent:e,command:t.command});for(let a of i)console.log(S.green(`\u2713 ${a}`));}catch(i){console.error(S.red(`Error: ${i.message}`)),process.exit(1);}});R.command("index").description("Show index status").option("--backfill-vectors","Reconcile the index and wait for symbol vectors").option("--watch","Start file watcher for hot updates (stub)").action(async e=>{let{getIndexStatus:t,refreshIndex:n}=await Promise.resolve().then(()=>(co(),ao)),o=e.backfillVectors?await n(R.opts().local):await t(R.opts().local);console.log(S.blue("Index Status")),console.log(` Files: ${o.totalFiles}`),console.log(` Symbols: ${o.totalSymbols}`),console.log(` Indexing: ${o.indexing?"active":"idle"}`),e.watch&&console.log(S.dim(" (watch mode not yet implemented)"));});R.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(uo(),lo)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:R.opts().local});console.log(S.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});R.command("context <query>").description("Retrieve project context for a query").option("--mode <mode>","fast | deep","fast").option("--max-tokens <n>","Max token budget","4000").option("--task","Use task-oriented mode with risk hints and next actions").option("--why","Show reasoning for file selection").action(async(e,t)=>{if(t.task){let{getTaskContext:n}=await Promise.resolve().then(()=>(Ot(),At)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:R.opts().local});console.log(JSON.stringify({requiredFiles:o.requiredFiles,optionalFiles:o.optionalFiles,riskHints:o.riskHints,nextActions:o.nextActions,reasoning:t.why?o.reasoning:void 0},null,2));}else {let{getContext:n}=await Promise.resolve().then(()=>(Ot(),At)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:R.opts().local});console.log(S.blue(`Context: "${e}"`)),console.log(` Files: ${o.files.length}`),console.log(` Confidence: ${(o.confidence*100).toFixed(0)}%`),console.log(` Tokens: ${o.tokenCount}`);}});var lt=R.command("workflow").description("Workflow management");lt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(Ce(),De)),t=await e(R.opts().local);if(t.length===0){console.log(S.dim("No workflows registered."));return}for(let n of t)console.log(`${S.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});lt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(Ce(),De)),o=await n(e,{input:t??""},R.opts().local);console.log(`Run: ${o.runId}`),console.log(`Status: ${o.status}`),console.log(`Duration: ${o.duration}ms`);});lt.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(Ce(),De)),t=await e(R.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});lt.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(Ce(),De)),t=await e(R.opts().local);if(t.length===0){console.log(S.dim("No runs yet."));return}for(let n of t){let o=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${S.yellow(n.status)} ${o}`);}});var ke=R.command("memory").description("Memory management");ke.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(ue(),le)),n=await t(R.opts().local,e.source);console.log(JSON.stringify(n,null,2));});ke.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(ue(),le));console.log(JSON.stringify(await t(R.opts().local,e.source),null,2));});ke.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(()=>(ue(),le)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:R.opts().local});console.log(JSON.stringify(o,null,2));});ke.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(ue(),le));await n(e,t,R.opts().local),console.log(S.green(`Memory set: ${e} = ${t}`));});ke.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(ue(),le)),t=await e(R.opts().local);console.log(JSON.stringify(t,null,2));});ke.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(()=>(ue(),le)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(S.green(`Observation vectors ready: ${n.processed} added, ${n.remaining} remaining`));});R.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(ho(),po)),o=(await t(e,void 0,void 0,R.opts().local)).results;console.log(S.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var fn=R.command("docs").description("Documentation index management");fn.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(S.blue(`\u25C9 Syncing docs${e?` for ${e} plugin`:""}`));let[{KnowledgeEngine:t},{EmbeddingProvider:n}]=await Promise.all([import('@devflow-tools/knowledge-engine'),import('@devflow-tools/memory-engine')]),o=new t({projectRoot:process.cwd(),embedder:new n});if(e){let r=await o.syncDocs(e);for(let s of r)s.added>0?console.log(` ${S.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${S.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(S.green(`
|
|
149
|
+
${e} docs synced to .devflow/knowledge/${e}/`));}else {let r=await o.getSources();for(let s of r){let i=await o.syncDocs(s.source.name);for(let a of i)a.added>0?console.log(` ${S.green("\u2713")} ${a.source} \u2192 ${a.added} chunks`):console.log(` ${S.red("\u2717")} ${a.source} \u2014 ${a.errors.join(", ")||"no content"}`);}console.log(S.green(`
|
|
150
|
+
All docs synced.`));}});fn.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(()=>(Mt(),jt)),n=await t({source:e.source,batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(S.green(`Knowledge vectors ready: ${n.processed} added, ${n.remaining} remaining`));});fn.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(()=>(Mt(),jt));console.log(S.blue(`Resyncing docs${e?` for ${e}`:""} with headings`));let o=await n({source:e,withHeadings:t.withHeadings});for(let r of o)r.added>0?console.log(` ${S.green("\u2713")} ${r.source} \u2192 ${r.added} chunks`):console.log(` ${S.red("\u2717")} ${r.source} \u2014 ${r.errors.join(", ")||"no content"}`);console.log(S.green("Docs resynced. Run `devflow docs backfill-vectors` to rebuild vectors."));});var ut=R.command("skill").description("Plugin/Skill management");ut.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(Ae(),$e)),t=await e(R.opts().local);if(t.length===0){console.log(S.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${S.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});ut.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(Ae(),$e)),n=await t(e,R.opts().local);if(console.log(S.blue(`Search: "${e}"`)),n.length===0){console.log(S.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${S.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});ut.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(Ae(),$e)),n=await t(e,process.cwd(),R.opts().local);console.log(S.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});ut.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(Ae(),$e));await t(e,process.cwd(),R.opts().local),console.log(S.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});R.command("doctor").description("Run project health check").option("--json","Output as JSON").option("--strict","Exit with status 1 when any health section has warnings or errors").option("--project <path>","Project directory",process.cwd()).option("--audit","Verify audit chain integrity").option("--audit-fix","Rebuild audit chain signatures").option("--violations","Show violation records").option("--last <period>","Filter violations by time (e.g. 7d, 24h)").option("--receipts","Show current session receipt status").action(async e=>{let{runDoctorCommand:t,runDoctorAudit:n,runDoctorAuditFix:o,runDoctorViolations:r,runDoctorReceipts:s}=await Promise.resolve().then(()=>(dr(),ur));if(e.audit){let a=await n();console.log(e.json?JSON.stringify(a):`Audit chain: ${a.valid?"VALID":`BROKEN at seq ${a.brokenAt}`} (${a.entryCount} entries)`);return}if(e.auditFix){let a=await o();console.log(e.json?JSON.stringify(a):"Audit chain rebuilt.");return}if(e.violations){let a=await r(e.last);console.log(e.json?JSON.stringify(a):JSON.stringify(a,null,2));return}if(e.receipts){let a=s();e.json?console.log(JSON.stringify(a)):a.data?console.log(JSON.stringify(a.data,null,2)):console.log(`No active receipt found for session ${a.sessionId}.`);return}let i=await t({project:e.project,json:e.json,strict:e.strict});process.exitCode=i;});R.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let{generateToken:t}=await Promise.resolve().then(()=>(fr(),gr)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var Hr=R.command("benchmark").description("Run and inspect reproducible A/B benchmarks");Hr.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(()=>(cn(),an));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});Hr.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(()=>(cn(),an));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});R.command("review [pr-url]").description("Review a PR or current branch diff").option("--agent <agent>","AI agent to use","claude").action(async(e,t)=>{let{runReview:n}=await Promise.resolve().then(()=>(wr(),yr)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var mn=R.command("server").description("Manage DevFlow server");mn.command("start").description("Start the DevFlow REST server").option("--port <n>","Port number","13337").action(async e=>{console.log(S.blue("Starting DevFlow server..."));let{startServer:t}=await Promise.resolve().then(()=>(ne(),Ve)),n=await t({port:parseInt(e.port,10)});console.log(S.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});mn.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(ne(),Ve)),t=await e();console.log(t?S.green("Server stopped"):S.dim("No server running"));});mn.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(ne(),Ve)),t=await e();t.running?console.log(S.green(`Running (pid: ${t.pid})`)):console.log(S.yellow("Not running"));});R.command("dashboard").description("Open DevFlow Dashboard").action(()=>{console.log(S.blue("The Dashboard is served by the DevFlow server.")),console.log(S.dim("Run: devflow start")),console.log(S.dim("Then open: http://localhost:13337"));});R.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async e=>{let{startAll:t}=await Promise.resolve().then(()=>(kr(),vr));await t({port:parseInt(e.port,10),background:!!e.background});});R.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(_r(),Sr));await e();});R.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(Er(),Rr));await e();});R.command("setup").description("Configure Claude Code integration (MCP + plugin)").option("--agent <agent>","Target agent (claude/cursor/cline)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>($r(),xr));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var ct=R.command("plugin").description("Manage DevFlow plugins");if(process.argv.includes("plugin")){let[{pluginListCommand:e},{pluginSearchCommand:t},{pluginInstallCommand:n},{pluginUninstallCommand:o}]=await Promise.all([Promise.resolve().then(()=>(Or(),Ar)),Promise.resolve().then(()=>(Ir(),Tr)),Promise.resolve().then(()=>(Mr(),jr)),Promise.resolve().then(()=>(Ur(),Fr))]);ct.addCommand(e),ct.addCommand(t),ct.addCommand(n),ct.addCommand(o);}await R.parseAsync();
|