@devflow-tools/devflow 0.14.4 → 0.16.0
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/acceptance-manifest.json +35 -0
- package/dist/cli.js +111 -28
- package/dist/dashboard/404.html +1 -0
- package/dist/dashboard/_next/static/chunks/1dd3208c-f3e84932bdc53383.js +1 -0
- package/dist/dashboard/_next/static/chunks/221-893fab1a7d7d9317.js +1 -0
- package/dist/dashboard/_next/static/chunks/249-e04c1de6240fd78a.js +1 -0
- package/dist/dashboard/_next/static/chunks/343-09a7e255220705c5.js +1 -0
- package/dist/dashboard/_next/static/chunks/402-a2e4eb98bb6a524c.js +1 -0
- package/dist/dashboard/_next/static/chunks/429-eac85fdc49353ed8.js +1 -0
- package/dist/dashboard/_next/static/chunks/458-75822399a849befa.js +1 -0
- package/dist/dashboard/_next/static/chunks/528-7d4fc14903647f1e.js +2 -0
- package/dist/dashboard/_next/static/chunks/568-50487ea5e93fe11f.js +1 -0
- package/dist/dashboard/_next/static/chunks/697-05cf55b6c667773f.js +1 -0
- package/dist/dashboard/_next/static/chunks/6b3bb038-34d5cf36bd0210d6.js +1 -0
- package/dist/dashboard/_next/static/chunks/736-db1a009357c222d2.js +1 -0
- package/dist/dashboard/_next/static/chunks/806-195d4d5cc6c28f6c.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/_not-found/page-5252c260804ee1ce.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/accuracy/page-ca6a419d8b29eb4f.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/benchmark/page-6c6d0acbcde4eb85.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/context/page-1874ae1050524cb6.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/doctor/page-d542f2ab8d6a1c59.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/executions/page-b98ec834dcda8d93.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/graph/page-f0e7e15288791e9c.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/knowledge/page-86808abd0d47c026.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/layout-4b78776412bd4fee.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/memory/page-e169762426ac7a23.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/page-c3e980fb2621470c.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/replay/page-a8a465ed885df0cf.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/runs/[id]/page-cc1d5182707fca5b.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/runs/page-bbf0a58abd70430c.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/settings/page-9602ff45892e7910.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/timeline/page-a8eb3caf23be8a86.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/tool-metrics/page-1f86f62b187f2b5e.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/workflows/page-551939c9e86b26c6.js +1 -0
- package/dist/dashboard/_next/static/chunks/framework-58c3457e28c4602f.js +1 -0
- package/dist/dashboard/_next/static/chunks/main-3175faffdbfc3051.js +1 -0
- package/dist/dashboard/_next/static/chunks/main-app-202a5f91ead17fa7.js +1 -0
- package/dist/dashboard/_next/static/chunks/pages/_app-58c3f1a8a070bd35.js +1 -0
- package/dist/dashboard/_next/static/chunks/pages/_error-312a564ec7e2663f.js +1 -0
- package/dist/dashboard/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dist/dashboard/_next/static/chunks/webpack-d6388c5dcd85b0c5.js +1 -0
- package/dist/dashboard/_next/static/css/322e14d06135256b.css +31 -0
- package/dist/dashboard/_next/static/css/7d4d1db5aa137b5a.css +3 -0
- package/dist/dashboard/_next/static/n_2t1_63toasXsidAssD9/_buildManifest.js +1 -0
- package/dist/dashboard/_next/static/n_2t1_63toasXsidAssD9/_ssgManifest.js +1 -0
- package/dist/dashboard/accuracy.html +1 -0
- package/dist/dashboard/accuracy.txt +7 -0
- package/dist/dashboard/benchmark.html +1 -0
- package/dist/dashboard/benchmark.txt +7 -0
- package/dist/dashboard/context.html +1 -0
- package/dist/dashboard/context.txt +7 -0
- package/dist/dashboard/doctor.html +1 -0
- package/dist/dashboard/doctor.txt +7 -0
- package/dist/dashboard/executions.html +1 -0
- package/dist/dashboard/executions.txt +7 -0
- package/dist/dashboard/graph.html +1 -0
- package/dist/dashboard/graph.txt +7 -0
- package/dist/dashboard/index.html +1 -0
- package/dist/dashboard/index.txt +7 -0
- package/dist/dashboard/knowledge.html +1 -0
- package/dist/dashboard/knowledge.txt +7 -0
- package/dist/dashboard/locales/en.json +335 -0
- package/dist/dashboard/locales/zh.json +335 -0
- package/dist/dashboard/memory.html +1 -0
- package/dist/dashboard/memory.txt +7 -0
- package/dist/dashboard/replay.html +1 -0
- package/dist/dashboard/replay.txt +7 -0
- package/dist/dashboard/runs/_.html +1 -0
- package/dist/dashboard/runs/_.txt +8 -0
- package/dist/dashboard/runs.html +1 -0
- package/dist/dashboard/runs.txt +7 -0
- package/dist/dashboard/settings.html +1 -0
- package/dist/dashboard/settings.txt +7 -0
- package/dist/dashboard/timeline.html +1 -0
- package/dist/dashboard/timeline.txt +7 -0
- package/dist/dashboard/tool-metrics.html +1 -0
- package/dist/dashboard/tool-metrics.txt +7 -0
- package/dist/dashboard/workflows.html +1 -0
- package/dist/dashboard/workflows.txt +7 -0
- package/dist/fallback.html +1 -3
- package/dist/hooks/enforcer-summary.js +6 -0
- package/dist/hooks/hook-client.js +6 -8
- package/dist/hooks/hook-daemon.js +13 -7
- package/dist/hooks/post-tool-use-failure.js +2 -2
- package/dist/hooks/post-tool-use.js +3 -2
- package/dist/hooks/pre-compact.js +3 -2
- package/dist/hooks/pre-tool-use.js +2 -2
- package/dist/hooks/server-bootstrap.js +109 -0
- package/dist/hooks/session-end.js +2 -2
- package/dist/hooks/stop.js +2 -2
- package/dist/hooks/user-prompt-submit.js +2 -2
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/dist/hooks/enforcer-summary.js +6 -0
- package/dist/plugin/dist/hooks/hook-client.js +6 -0
- package/dist/plugin/dist/hooks/hook-daemon.js +14 -0
- package/dist/plugin/dist/hooks/post-tool-use-failure.js +2 -0
- package/dist/plugin/dist/hooks/post-tool-use.js +3 -0
- package/dist/plugin/dist/hooks/pre-compact.js +3 -0
- package/dist/plugin/dist/hooks/pre-tool-use.js +2 -0
- package/dist/plugin/dist/hooks/server-bootstrap.js +109 -0
- package/dist/plugin/dist/hooks/session-end.js +2 -0
- package/dist/plugin/dist/hooks/stop.js +2 -0
- package/dist/plugin/dist/hooks/user-prompt-submit.js +2 -0
- package/dist/plugin/skills/devflow:animation/SKILL.md +7 -38
- package/dist/plugin/skills/devflow:css/SKILL.md +7 -38
- package/dist/plugin/skills/devflow:docker/SKILL.md +8 -38
- package/dist/plugin/skills/devflow:electron/SKILL.md +8 -38
- package/dist/plugin/skills/devflow:git/SKILL.md +8 -38
- package/dist/plugin/skills/devflow:graphql/SKILL.md +8 -39
- package/dist/plugin/skills/devflow:nest/SKILL.md +8 -39
- package/dist/plugin/skills/devflow:nextjs/SKILL.md +7 -39
- package/dist/plugin/skills/devflow:performance/SKILL.md +8 -38
- package/dist/plugin/skills/devflow:react/SKILL.md +12 -16
- package/dist/plugin/skills/devflow:tailwind/SKILL.md +7 -38
- package/dist/plugin/skills/devflow:taro/SKILL.md +8 -38
- package/dist/plugin/skills/devflow:ui-layout/SKILL.md +7 -38
- package/dist/plugin/skills/devflow:vue/SKILL.md +9 -40
- package/package.json +14 -13
- package/plugin-registry.json +174 -0
package/dist/cli.js
CHANGED
|
@@ -1,38 +1,121 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
3
|
-
`)}var
|
|
2
|
+
import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,cpSync,writeFileSync as writeFileSync$1,rmSync,statSync as statSync$1,realpathSync,lstatSync,mkdtempSync,rmdirSync,readdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {join as join$1,resolve,basename,dirname,relative,sep,isAbsolute,extname}from'node:path';import {execFileSync,spawnSync}from'node:child_process';import Nr,{existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,statSync,rmSync as rmSync$1}from'fs';import Xc,{join,dirname as dirname$1,resolve as resolve$1}from'path';import {homedir}from'os';import {createRequire}from'module';import bn 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}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 b from'chalk';import di 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 {fileURLToPath as fileURLToPath$1}from'node:url';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport}from'@devflow-tools/benchmark';import {Command}from'commander';var Lr=Object.defineProperty;var C=(e,t)=>()=>(e&&(t=e(e=0)),t);var x=(e,t)=>{for(var n in t)Lr(e,n,{get:t[n],enumerable:true});};function gn(){let e=join$1(dirname(new URL(import.meta.url).pathname),"../../plugin-files");if(existsSync$1(e))return e;let t=join$1(dirname(new URL(import.meta.url).pathname),"../../../../plugins/claude-code");if(existsSync$1(t))return t;throw new Error("Plugin files not found. Run `npm run build` first.")}function mn(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=t.enabledPlugins??{};n[cn]!==true&&(n[cn]=true,t.enabledPlugins=n,writeFileSync$1(e,JSON.stringify(t,null,2)));}function pn(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 hn(e,t,n,o){let r=join$1(t,Hr,qr,n);mkdirSync$1(r,{recursive:true});let s=join$1(e,"hooks");existsSync$1(s)&&Te(s,join$1(r,"hooks"));for(let c of ["hooks.json","CLAUDE.md","package.json"]){let u=join$1(e,c);existsSync$1(u)&&cpSync(u,join$1(r,c),{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");if(existsSync$1(a)&&Te(a,join$1(r,"dist")),Kr(r,e),o){let c=join$1(e,"dist","skills");existsSync$1(c)&&Te(c,o);}Gr(r);}function Kr(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 Te(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()?Te(o,r):cpSync(o,r,{force:true});}}function Gr(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 cn,Hr,qr,yn=C(()=>{cn="devflow@devflow-local",Hr="devflow-local",qr="devflow";});var _n={};x(_n,{initProject:()=>Xr,renderInitReport:()=>Sn});async function Xr(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(kn.isInitialized(e)||await kn.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,Sn(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=gn(),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";hn(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");mn(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=Qr.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}pn(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function Sn(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(`
|
|
3
|
+
`)}var kn,Qr,Pn=C(()=>{yn();kn=bn.default??bn,Qr=createRequire(import.meta.url);});var Rn={};x(Rn,{reviewPluginMemoryHints:()=>os});async function os(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(rs).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 f of d?.memory?.project?.conventions??[])i.push({id:`${l}:${f.key}`,pluginName:l,convention:f});}if(i.length===0)return {available:0,selected:0};let a=i.map(l=>({name:`${l.pluginName}: ${l.convention.value}`,value:l.id,checked:false})),c=await(n.select??(l=>checkbox({message:"Select optional plugin memory hints to save",choices:l})))(a),u=i.filter(l=>c.includes(l.id));return u.length>0&&await(n.write??ss)(e,u),{available:i.length,selected:u.length}}function rs(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function ss(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 Dn=C(()=>{});function ue(){let e=[join(process.cwd(),"plugin-registry.json"),join(ds,"../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 Cn(){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 us,ds,Ne=C(()=>{us=fileURLToPath(import.meta.url),ds=dirname$1(us);});var dt={};x(dt,{detectTechStack:()=>En,guidePluginInstallation:()=>hs,installPluginsFromList:()=>ps,resolvePluginName:()=>xn});function En(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 xn(e){let t=e.trim();return t.startsWith("@devflow-tools/")?t:`@devflow-tools/${t}`}async function ps(e){let t=e.split(",").map(xn).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 hs(e){let t=ue();if(t.plugins.length===0)return console.log(`
|
|
4
4
|
No plugins available. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
|
|
5
5
|
`),[];console.log(`
|
|
6
6
|
\u{1F50C} Plugin Installation Guide
|
|
7
|
-
`);let n=
|
|
8
|
-
`);let
|
|
9
|
-
`);let
|
|
7
|
+
`);let n=En(e);n.length>0&&console.log(`Detected tech stack: ${n.join(", ")}
|
|
8
|
+
`);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
|
+
`);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
10
|
Plugin installation cancelled.
|
|
11
|
-
`),[]}if(
|
|
11
|
+
`),[]}if(s.length>0){console.log(`
|
|
12
12
|
Installing selected plugins...
|
|
13
|
-
`);for(let
|
|
14
|
-
`);}catch{console.error(`\u2717 Failed to install ${
|
|
13
|
+
`);for(let i of s)try{execSync(`npm install -g ${i}`,{stdio:"inherit"}),console.log(`\u2713 ${i}
|
|
14
|
+
`);}catch{console.error(`\u2717 Failed to install ${i}
|
|
15
15
|
`);}}else console.log(`
|
|
16
16
|
Skipping plugin installation. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
|
|
17
|
-
`);return
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
`)}
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
`);return s}var ft=C(()=>{Ne();});var Un={};x(Un,{ResetExecutionError:()=>we,executeResetCommand:()=>Ls,formatResetResult:()=>yt,runReset:()=>Fn});function xs(){if(Ie)return Ie;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Ie=e.DatabaseSync,Ie}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function yt(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function $s(e){return e==="all"||In.includes(e)}function B(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function mt(e){let t=resolve(e),n=[];for(;!B(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 wt(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function As(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 jn(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=B(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(B(t)){let o=realpathSync(t);if(!wt(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function Os(e,t){return (e==="all"?In:[e]).map(o=>({scope:o,path:join$1(t,...Nn[o])}))}function Mn(e,t){let n=B(t);if(n)return jn(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function Ln(e,t){let n=Mn(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 Ts(e){let t=B(e);if(!t?.isFile()||t.size<gt.length)return false;let n=Buffer.alloc(gt.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(gt)}finally{closeSync(o);}}function Ns(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}Ts(o)&&t.push(o);}}return n(e),t}function Is(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(xs())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function js(e,t,n){let o=Ns(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));Is(s,i);}}function Ms(e,t,n,o,r){let s=!!B(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),js(c.path,join$1(i,c.scope),()=>Ln(e,c));for(let c of n){let u=join$1(i,c.scope),l=join$1(t,c.scope);if(B(l))throw new Error(`Backup destination already exists: ${l}`);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&&B(t))try{rmdirSync(t);}catch{}}}function Fn(e,t={}){if(!$s(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=As(e.project??process.cwd()),o=Os(e.scope,n);for(let c of o)jn(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=Mn(n,c.path);return u?[{...c,identity:u}]:[]}),s=e.backupTo?mt(e.backupTo):void 0;if(s){let c=B(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let u of r){let l=mt(u.path),d=join$1(s,u.scope),f=mt(d);if(wt(l,f)||wt(f,l))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${f}`);if(B(d))throw new Error(`Backup destination already exists: ${d}`)}}let i={backedUp:[],removed:[]},a={beforeBackup:()=>{},beforeRemoval:()=>{},renamePath:(c,u)=>renameSync(c,u),removePath:c=>rmSync(c,{recursive:true,force:true}),...t};s&&r.length>0&&Ms(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),Ln(n,c),a.removePath(c.path);}catch(u){let l=u instanceof Error?`: ${u.message}`:"";throw new we(`Failed to remove reset target: ${c.path}${l}`,i,u)}i.removed.push(c.path);}return i}function Ls(e,t={},n=console){try{let o=Fn(e,t),r=yt(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof we)for(let r of yt(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var Ie,we,Nn,In,gt,Wn=C(()=>{we=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Nn={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},In=Object.keys(Nn),gt=Buffer.from("SQLite format 3\0","binary");});var Yn={};x(Yn,{consolidateDatabases:()=>Bs,formatConsolidateResult:()=>Hs});function Bs(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=[Hn("project",o,s?n:void 0),Hn("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(g=>g.exists&&Object.keys(g.tables).length>0),u=new Date(e.now??Date.now()).toISOString().replace(/[:.]/g,"-"),l=basename(dirname(n))==="global"?join$1(dirname(dirname(n)),"backup"):join$1(dirname(n),"backup"),d=join$1(e.backupRoot??l,u);mkdirSync$1(d,{recursive:true}),a.backupDir=d;let f=c.some(g=>g.kind==="project")?qs(o):null;try{let g=new Map;for(let h of c){let v=join$1(d,`${h.kind}-${basename(h.path)}.snapshot`);qn(h.path,v),g.set(h.kind,v);}s&&qn(n,join$1(d,"global-devflow.db.before"));let m=g.has("project")?Gs(o,d):[];a.retired.push(...m.map(h=>h.destination));let p=null,w=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),p=new DatabaseSync(n),p.exec("PRAGMA busy_timeout = 10000"),p.exec(DEVFLOW_SCHEMA_SQL),g.has("project")&&p.prepare("ATTACH DATABASE ? AS project_source").run(g.get("project")),g.has("codegraph")&&p.prepare("ATTACH DATABASE ? AS codegraph_source").run(r),p.exec("BEGIN IMMEDIATE"),w=!0,g.has("project")&&Kn(p,"project_source",void 0,a.inserted),g.has("codegraph")){Kn(p,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let v of ke(p,"codegraph_source").filter(R=>R.startsWith("devflow_")))p.exec(`DROP TABLE codegraph_source.${O(v)}`);}p.exec("COMMIT"),w=!1;}catch(h){if(w)try{p?.exec("ROLLBACK");}catch{}throw Vn(m),h}finally{p?.close();}return a}finally{Ks(f);}}function Hs(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 Hn(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 ke(r).filter(c=>!i||i.has(c)))o.tables[a]=St(r,a),o.conflicts[a]=s&&ke(s).includes(a)?zs(r,s,a):0;}finally{r.close(),s?.close();}return o}function qn(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 qs(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 Ks(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function Gs(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 Vn(n),o}return n}function Vn(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function Kn(e,t,n,o){let r=new Set(ke(e)),s=ke(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=Me(e,"main",i),c=new Set(Me(e,t,i).map(m=>m.name)),u=a.filter(m=>c.has(m.name));if(kt.has(i)&&(u=u.filter(m=>m.pk===0)),u.length===0)continue;let l=St(e,i),d=u.map(m=>O(m.name)).join(", "),f=u.map(m=>`s.${O(m.name)}`).join(", ");if(u.filter(m=>m.pk>0).length>0&&!kt.has(i))e.exec(`INSERT OR IGNORE INTO main.${O(i)} (${d}) SELECT ${f} FROM ${O(t)}.${O(i)} s`);else {let m=u.map(p=>`t.${O(p.name)} IS s.${O(p.name)}`).join(" AND ");e.exec(`
|
|
18
|
+
INSERT INTO main.${O(i)} (${d})
|
|
19
|
+
SELECT ${f} FROM ${O(t)}.${O(i)} s
|
|
20
|
+
WHERE NOT EXISTS (SELECT 1 FROM main.${O(i)} t WHERE ${m})
|
|
21
|
+
`);}o[i]=(o[i]??0)+(St(e,i)-l);}}function zs(e,t,n){let o=new Set(Me(t,"main",n).map(u=>u.name)),r=Me(e,"main",n).filter(u=>u.pk>0&&o.has(u.name));if(r.length===0||kt.has(n))return 0;let s=r.map(u=>O(u.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${O(n)}`).all(),a=r.map(u=>`${O(u.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${O(n)} WHERE ${a} LIMIT 1`);return i.reduce((u,l)=>u+(c.get(...r.map(d=>l[d.name]))?1:0),0)}function ke(e,t="main"){return e.prepare(`SELECT name FROM ${O(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(o=>o.name)}function Me(e,t,n){return e.prepare(`PRAGMA ${O(t)}.table_info(${O(n)})`).all()}function St(e,t){let n=e.prepare(`SELECT COUNT(*) count FROM ${O(t)}`).get();return Number(n.count)}function O(e){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsafe SQLite identifier: ${e}`);return `"${e}"`}var kt,Zn=C(()=>{kt=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var Qn={};x(Qn,{connectAgent:()=>_t,getAvailableAgents:()=>Ys});async function _t(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 Ys(){return listAdapters()}var Pt=C(()=>{});async function E(e,t,n,o={}){let r=o.serverUrl??Qs;if(o.skipServer)return n();let s=false,i=eo.get(r);if(i&&Date.now()-i.ts<Xs?s=i.result:(s=await new DevFlowApiClient({baseUrl:r,projectRoot:e}).ping(),eo.set(r,{result:s,ts:Date.now()})),s){let a=new DevFlowApiClient({baseUrl:r,projectRoot:e});return t(a)}return console.error(b.dim(" (server not running, using local engine \u2014 telemetry disabled)")),n()}var Qs,eo,Xs,Q=C(()=>{Qs=process.env.DEVFLOW_SERVER_URL??"http://localhost:13337",eo=new Map,Xs=3e4;});var no={};x(no,{getIndexStatus:()=>ei,refreshIndex:()=>ti});async function ei(e){return E(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 ti(e){return E(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var oo=C(()=>{Q();});var ro={};x(ro,{getGraph:()=>oi});async function oi(e={}){let t=e.target??"all",n=e.depth??2;return E(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 so=C(()=>{Q();});var Rt={};x(Rt,{getContext:()=>si,getTaskContext:()=>ii});async function si(e){return E(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 ii(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return E(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 Dt=C(()=>{Q();});var Se={};x(Se,{getWorkflowRuns:()=>ao,getWorkflowStatus:()=>li,listWorkflows:()=>ai,runWorkflow:()=>ci});async function ai(e){return E(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function ci(e,t,n){return E(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function li(e){return ao(e)}async function ao(e){return E(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var _e=C(()=>{Q();});var se={};x(se,{backfillObservationVectors:()=>hi,queryMemory:()=>gi,reviewCandidates:()=>pi,reviewMemories:()=>wi,setMemory:()=>mi,showMemory:()=>fi});async function fi(e,t){let n=await E(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 gi(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return E(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getMemoryResult(r,o)},{skipServer:n})}async function mi(e,t,n){return E(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 pi(e){return E(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function hi(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function yi(e){let t=di.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function wi(){let t=await E(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(`
|
|
22
|
+
[${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await yi(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await E(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await E(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
|
|
23
|
+
Reviewed ${o}/${t.length} pending memories.`);}var ie=C(()=>{Q();});var lo={};x(lo,{getDocsStatus:()=>ki,queryKnowledge:()=>co,searchKnowledge:()=>bi,syncDocs:()=>Si});async function co(e,t,n,o){return E(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 bi(e,t,n){return (await co(e,t,void 0,n)).results}async function ki(e){return E(process.cwd(),t=>t.getKnowledgeSources(),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).getSources(),{skipServer:e})}async function Si(e,t){return E(process.cwd(),n=>n.syncDocs(e),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).syncDocs(e),{skipServer:t})}var uo=C(()=>{Q();});var $t={};x($t,{backfillKnowledgeVectors:()=>Di,resyncKnowledgeDocs:()=>Ri});function fo(e){return new KnowledgeEngine({projectRoot:e,embedder:new EmbeddingProvider})}async function Ri(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=fo(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Di(e={}){let t=fo(e.projectRoot??process.cwd());try{return await t.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress})}finally{t.close();}}var At=C(()=>{});var mo=C(()=>{});var Re={};x(Re,{installSkill:()=>Ti,listSkills:()=>yo,listSkillsSync:()=>Ai,searchSkills:()=>Oi,uninstallSkill:()=>Ni});async function yo(e){return E(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 Ai(){return []}async function Oi(e,t){let n=await yo(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 wo(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function vo(e,t){let n=join(e,".devflow","config.json");writeFileSync(n,JSON.stringify(t,null,2),"utf-8");}async function Ti(e,t=process.cwd(),n){return E(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(Le,{recursive:true});try{execSync(`npm install --prefix "${Le}" ${o}`,{stdio:"pipe",timeout:6e4});}catch{}let s=wo(t);s.plugins||(s.plugins=[]),s.plugins.includes(r)||(s.plugins.push(r),vo(t,s));let i=[];try{i=JSON.parse(readFileSync(join(Le,"node_modules",o,"package.json"),"utf-8"))?.devflow?.templates??[];}catch{}return {name:r,version:"0.1.0",templates:i}},{skipServer:n})}async function Ni(e,t=process.cwd(),n){return E(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=e.replace(/^@devflow-tools\/plugin-/,""),r=wo(t);r.plugins&&(r.plugins=r.plugins.filter(i=>i!==o),vo(t,r));let s=e.startsWith("@devflow-tools/plugin-")?e:`@devflow-tools/plugin-${e}`;try{let i=join(Le,"node_modules",s);existsSync(i)&&rmSync$1(i,{recursive:!0,force:!0});}catch{}},{skipServer:n})}var Le,De=C(()=>{Q();mo();Le=join(process.env.HOME??"~",".devflow","skills");});var Ue={};x(Ue,{DEFAULT_SERVER_PORT:()=>Fe,readPidFromFile:()=>It,readPortFromFile:()=>_o,serverStatus:()=>Ee,startServer:()=>jt,stopServer:()=>Ce});function Nt(e){let t=join(e,".devflow");return existsSync(t)||mkdirSync(t,{recursive:true}),join(t,"server.pid")}function Fi(){try{return ko.resolve("./server.js")}catch{try{return ko.resolve("@devflow-tools/server/dist/main.js")}catch{return join(process.cwd(),"apps","server","dist","main.js")}}}function _o(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
|
|
24
|
+
`);if(t.length>=2){let n=parseInt(t[0],10);if(!isNaN(n))return n}return null}function It(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
|
|
25
|
+
`),n=t.length>=2?t[1]:t[0],o=parseInt(n,10);return isNaN(o)?null:o}async function jt(e){let t=Fi(),n=Nt(process.cwd()),o=spawn("node",[t],{env:{...process.env,PORT:String(e.port)},stdio:"ignore",detached:true});return writeFileSync(n,`${e.port}
|
|
26
|
+
${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function Ce(){let e=Nt(process.cwd()),t=It(e);if(t===null)return false;try{return process.kill(t),unlinkSync(e),!0}catch{return unlinkSync(e),false}}async function Ee(){let e=Nt(process.cwd()),t=_o(e)??Fe,{DevFlowApiClient:n}=await import('@devflow-tools/sdk');return await new n({baseUrl:`http://localhost:${t}`,projectRoot:process.cwd()}).ping()?{running:true,pid:It(e)??void 0,port:t}:{running:false,port:t}}var ko,Fe,X=C(()=>{ko=createRequire(import.meta.url);Fe=13337;});var or={};x(or,{renderDoctorText:()=>tr,runDoctor:()=>ac,runDoctorAudit:()=>lc,runDoctorAuditFix:()=>uc,runDoctorCommand:()=>cc,runDoctorReceipts:()=>fc,runDoctorViolations:()=>dc,runLegacyDoctorReport:()=>nr,runStructuredDoctor:()=>Qt});function Vt(e){return createHash("sha256").update(e).digest("hex").slice(0,16)}function Po(e){return join$1(homedir$1(),".devflow","daemons",`${Vt(e)}.sock`)}function Ki(){return join$1(homedir$1(),".devflow","daemons.json")}function Bo(){if(Be)return Be;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Be=e.DatabaseSync,Be}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function A(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}function qt(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function Gi(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!==Vt(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function zi(e,t){let n=qt(e),o=Vt(n.path),r=Po(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??Ki();if(!existsSync$1(i))s.push({key:"daemon_registry",value:"not found",target:"valid JSON when present",ok:true,severity:"info"});else try{let a=JSON.parse(readFileSync$1(i,"utf8"));if(!Array.isArray(a))throw new Error("registry must be an array");let c=a.filter(f=>Gi(f).length>0);s.push({key:"daemon_registry",value:c.length===0?"valid":"malformed",target:"valid daemon entry array",ok:c.length===0,severity:c.length===0?"info":"warning"}),s.push({key:"invalid_daemon_registry_entries",value:c.length,target:0,ok:c.length===0,severity:"warning"});let u=a.filter(f=>{if(typeof f!="object"||f===null)return !1;let g=f;return typeof g.rootPath!="string"||g.rootPath.length===0?!1:qt(g.rootPath).path===n.path});s.push({key:"project_daemon_registrations",value:u.length,ok:!0,severity:"info"});let l=u.map(f=>Po(f.rootPath));s.push({key:"registered_daemon_socket_paths",value:l,target:[r],ok:!0,severity:"info"});let d=u.filter((f,g)=>f.projectHash!==o||l[g]!==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"});}return {name:"Isolation",status:A(s),metrics:s}}function Vi(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(Ji)){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 Ho(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 Yi(e){let t=Ho(e);return t&&t.length>0?t:null}function Lt(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 Zi(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function Ro(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function Xi(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:A(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(Bo())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=Vi(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:A(n),metrics:n};let c=(t.now??Date.now)(),u=i.prepare(`
|
|
27
|
+
SELECT batch_id, event_ids, session_ids, event_count, created_at, expires_at, status
|
|
28
|
+
FROM distill_leases
|
|
29
|
+
`);u.setReadBigInts?.(!0);let l=u.all(),d=new Set,f=0,g=0;for(let h of l){let v=Yi(h.event_ids),R=Ho(h.session_ids),y=Lt(h.event_count),S=Lt(h.created_at),_=Lt(h.expires_at),N=typeof h.status=="string"&&Qi.has(h.status)?h.status:null,oe=typeof h.batch_id=="string"&&h.batch_id.trim().length>0,he=v!==null&&y!==null&&Zi(y,v.length);if(!oe||!v||!R||!he||S===null||_===null||N===null){f+=1,h.status==="pending"&&(_===null||Ro(_,c))&&(g+=1);continue}if(!(N!=="pending"||!Ro(_,c)))for(let Mr of v)d.add(Mr);}n.push({key:"malformed_distill_leases",value:f,target:0,ok:f===0,severity:g>0?"error":"warning"});let p=i.prepare(`
|
|
30
|
+
SELECT id
|
|
31
|
+
FROM session_events
|
|
32
|
+
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 w=i.prepare(`
|
|
34
|
+
SELECT COUNT(*) AS group_count, COALESCE(SUM(title_count), 0) AS row_count
|
|
35
|
+
FROM (
|
|
36
|
+
SELECT project, session_id, title, COUNT(*) AS title_count
|
|
37
|
+
FROM observations
|
|
38
|
+
GROUP BY project, session_id, title
|
|
39
|
+
HAVING COUNT(*) > 1
|
|
40
|
+
)
|
|
41
|
+
`).get();n.push({key:"duplicate_observation_title_groups",value:Number(w.group_count),target:0,ok:Number(w.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(w.row_count),target:0,ok:Number(w.row_count)===0,severity:"error"});}catch(i){n.push({key:"database_read",value:i.message,target:"readable Task 2 memory schema",ok:false,severity:"error"});}finally{s?.close();}return {name:"Distill",status:A(n),metrics:n}}function W(e,t){return (t.openDatabase??(o=>new(Bo())(o,{readOnly:true})))(e)}function M(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function H(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function Ft(e,t){return e===0?1:t/e}function ea(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 f;try{f=W(s,t),M(f,"nodes")?(o=H(f,"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(g){n.push({key:"codegraph_db_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{f?.close();}}let i=join$1(e,".devflow","symbols-vec.db");if(!existsSync$1(i))n.push({key:"symbols_vectors_db",value:"missing",target:i,ok:false,severity:"warning"});else {let f;try{f=W(i,t);let g=M(f,"symbols_vec_rowids")?"symbols_vec_rowids":M(f,"symbol_sources")?"symbol_sources":null;g?(r=H(f,`SELECT COUNT(*) count FROM ${g}`),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(g){n.push({key:"symbols_vectors_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{f?.close();}}if(o!==null&&r!==null){let f=Ft(o,r);n.push({key:"symbols_vector_coverage",value:f,target:">= 0.90",ok:f>=.9,severity:"warning"});}let a=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(a))n.push({key:"knowledge_vectors_db",value:"missing",target:a,ok:false,severity:"warning"});else {let f;try{f=W(a,t);let m=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(p=>!M(f,p));if(m.length>0)n.push({key:"knowledge_vector_schema",value:m,target:[],ok:!1,severity:"warning"});else {let p=H(f,"SELECT COUNT(*) count FROM knowledge_chunks"),w=H(f,"SELECT COUNT(*) count FROM knowledge_vec_rowids"),h=Ft(p,w),R=f.prepare(`
|
|
42
|
+
SELECT d.source source, COUNT(c.id) chunks,
|
|
43
|
+
SUM(CASE WHEN v.id IS NOT NULL THEN 1 ELSE 0 END) vectors
|
|
44
|
+
FROM knowledge_docs d
|
|
45
|
+
LEFT JOIN knowledge_chunks c ON c.doc_id = d.id
|
|
46
|
+
LEFT JOIN knowledge_vec_rowids v ON v.id = c.id
|
|
47
|
+
GROUP BY d.source ORDER BY d.source
|
|
48
|
+
`).all().map(y=>{let S=Number(y.chunks),_=Number(y.vectors);return {source:y.source,chunks:S,vectors:_,coverage:Ft(S,_)}});n.push({key:"knowledge_chunks",value:p,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:w,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:h,target:">= 0.95",ok:h>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:R,target:"every source >= 0.95",ok:R.every(y=>y.coverage>=.95),severity:"warning"});}}catch(g){n.push({key:"knowledge_vectors_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{f?.close();}}let c=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(c))n.push({key:"observation_vectors_db",value:"missing",target:c,ok:false,severity:"warning"});else {let f;try{if(f=W(c,t),!M(f,"observations")||!M(f,"embeddings"))n.push({key:"observation_vector_schema",value:"observations/embeddings missing",target:"Batch 2 vector schema",ok:!1,severity:"warning"});else {let g=H(f,"SELECT COUNT(*) count FROM observations"),m=H(f,`
|
|
49
|
+
SELECT COUNT(DISTINCT e.source_id) count
|
|
50
|
+
FROM embeddings e JOIN observations o ON o.id = e.source_id
|
|
51
|
+
WHERE e.source_type = 'observation'
|
|
52
|
+
`),p=Math.max(0,g-m);n.push({key:"observations",value:g,ok:!0,severity:"info"}),n.push({key:"observation_vectors",value:m,ok:!0,severity:"info"}),n.push({key:"observation_vectors_missing",value:p,target:0,ok:p===0,severity:"warning"});}}catch(g){n.push({key:"observation_vectors_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{f?.close();}}let u=(t.now??Date.now)(),l=join$1(t.homePath??homedir$1(),".devflow","errors","embedder.log"),d=0;if(existsSync$1(l))try{let f=u-864e5;d=readFileSync$1(l,"utf8").split(`
|
|
53
|
+
`).filter(g=>{let m=/^\[([^\]]+)\]/.exec(g);return m?Date.parse(m[1])>=f:!1}).length;}catch(f){n.push({key:"embedder_error_log_read",value:f.message,target:"readable error log",ok:false,severity:"error"});}return n.push({key:"embedder_errors_24h",value:d,target:0,ok:d===0,severity:"warning"}),{name:"Vectors",status:A(n),metrics:n}}function ta(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=W(s,n),o.push({key:"global_telemetry_db",value:s,ok:!0,severity:"info"});for(let[w,h]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let v=M(m,h)?H(m,`SELECT COUNT(*) count FROM ${h} WHERE created_at >= ?`,i):0;o.push({key:w,value:v,ok:!0,severity:"info"});}let p=M(m,"telemetry_failures")?H(m,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",i):0;if(o.push({key:"telemetry_failures_24h",value:p,target:0,ok:p===0,severity:a}),M(m,"tool_call_events"))if(m.prepare("PRAGMA table_info(tool_call_events)").all().map(h=>h.name).includes("failure_category")){let h=m.prepare(`
|
|
54
|
+
SELECT failure_category category, COUNT(*) count
|
|
55
|
+
FROM tool_call_events
|
|
56
|
+
WHERE timestamp >= ? AND failure_category IS NOT NULL
|
|
57
|
+
GROUP BY failure_category
|
|
58
|
+
ORDER BY failure_category
|
|
59
|
+
`).all(i),v=Object.fromEntries(h.map(_=>[_.category,Number(_.count)])),R=H(m,"SELECT COUNT(*) count FROM tool_call_events WHERE timestamp >= ? AND error IS NOT NULL",i),y=h.reduce((_,N)=>_+Number(N.count),0),S=R===0?1:y/R;o.push({key:"failure_categories_24h",value:v,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:S,target:">= 0.80",ok:S>=.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(w=>w.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 f=join$1(e,".codegraph","codegraph.db"),g=[];if(existsSync$1(f)){let m;try{m=W(f,n),g=m.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(p=>p.name);}catch(p){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:g,target:[],ok:g.length===0,severity:a}),{name:"Telemetry",status:A(o),metrics:o}}function Co(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function qo(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 oa(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=Co(r),f=l.isDirectory()&&!l.isSymbolicLink(),g=process.platform==="win32"||d==="700";t.push({key:"key_directory",value:{path:r,mode:d},target:{type:"directory",mode:"700"},ok:f&&g,severity:f?"warning":"error"});}catch(l){t.push({key:"key_directory",value:l.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[l,d,f]of s){if(o[d]?.trim()){t.push({key:`${l}_source`,value:d,target:"environment override or generated key file",ok:true,severity:"info"});continue}let g=join$1(r,f);if(!existsSync$1(g)){t.push({key:`${l}_source`,value:"missing",target:g,ok:false,severity:"warning"});continue}try{let m=lstatSync(g),p=Co(g),w=readFileSync$1(g,"utf8").trim(),h=m.isFile()&&!m.isSymbolicLink();t.push({key:`${l}_source`,value:{path:g,mode:p,bytes:Buffer.byteLength(w)},target:{type:"regular file",mode:"400",nonempty:!0},ok:h&&w.length>0&&(process.platform==="win32"||p==="400"),severity:!h||w.length===0?"error":"warning"});}catch(m){t.push({key:`${l}_source`,value:m.message,target:"readable nonempty key file with mode 400",ok:false,severity:"error"});}}let a=join$1(n,".devflow","errors","compressor.log"),c=0,u=0;if(existsSync$1(a))try{let l=(e.now??Date.now)()-me;for(let d of readFileSync$1(a,"utf8").split(`
|
|
60
|
+
`))if(d.trim())try{let f=JSON.parse(d),g=qo(f.ts);g===null?u+=1:g>=l&&(c+=1);}catch{u+=1;}}catch(l){t.push({key:"compressor_error_log_read",value:l.message,target:"readable JSONL diagnostics",ok:false,severity:"error"});}return t.push({key:"compressor_errors_24h",value:c,target:0,ok:c===0,severity:"warning"}),t.push({key:"malformed_compressor_records",value:u,target:0,ok:u===0,severity:"error"}),{name:"Runtime security",status:A(t),metrics:t}}function ra(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:A(t),metrics:t};let r;try{if(r=W(o,e),!M(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:A(t),metrics:t};let s=r.prepare(`
|
|
61
|
+
SELECT run_id, suite_id, suite_version, task_count, status, report_json, created_at
|
|
62
|
+
FROM benchmark_reports
|
|
63
|
+
ORDER BY created_at DESC
|
|
64
|
+
LIMIT 1
|
|
65
|
+
`).get();if(!s)return t.push({key:"latest_benchmark",value:"no reports",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:A(t),metrics:t};let i=null;try{if(typeof s.report_json!="string")throw new Error("report_json is not text");let l=JSON.parse(s.report_json);if(!Array.isArray(l.tasks))throw new Error("report tasks are missing");i=l.tasks.length;}catch(l){t.push({key:"benchmark_report_json",value:l.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let a=Number(s.task_count),c=Number(s.created_at),u=(e.now??Date.now)()-c;t.push({key:"latest_benchmark",value:{runId:s.run_id,suiteId:s.suite_id,suiteVersion:s.suite_version,status:s.status,createdAt:c},ok:s.status==="completed"&&Number.isFinite(c),severity:"error"}),t.push({key:"benchmark_task_count",value:a,target:">= 5",ok:Number.isInteger(a)&&a>=5&&i===a,severity:i===null?"error":"warning"}),t.push({key:"benchmark_age_days",value:Number.isFinite(u)?Number((u/me).toFixed(2)):null,target:"0-30",ok:Number.isFinite(u)&&u>=0&&u<=na,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:A(t),metrics:t}}function sa(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 ia(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 h of readdirSync(r))h.endsWith(".log")&&o.push(join$1(r,h));}catch(h){t.push({key:"hook_fallback_directory_read",value:h.message,target:"readable fallback directory",ok:false,severity:"error"});}let s=(e.now??Date.now)()-me,i=0,a=0;for(let h of [...new Set(o)])if(existsSync$1(h))try{for(let v of readFileSync$1(h,"utf8").split(`
|
|
66
|
+
`))if(v.trim())try{let R=JSON.parse(v),y=qo(R.ts);y===null||typeof R.reason!="string"?a+=1:y>=s&&(i+=1);}catch{a+=1;}}catch(v){t.push({key:"hook_fallback_log_read",value:{path:h,error:v.message},target:"readable JSONL diagnostics",ok:false,severity:"error"});}t.push({key:"hook_fallback_events_24h",value:i,target:0,ok:i===0,severity:"warning"}),t.push({key:"malformed_hook_fallback_records",value:a,target:0,ok:a===0,severity:"error"});let c=e.homePath?join$1(n,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(n),u=0,l=0,d=null;if(existsSync$1(c)){let h;try{if(h=W(c,e),M(h,"telemetry_events")){let v=h.prepare(`
|
|
67
|
+
SELECT COUNT(*) total,
|
|
68
|
+
SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) failures,
|
|
69
|
+
AVG(CASE WHEN success = 1 THEN duration END) average_duration
|
|
70
|
+
FROM telemetry_events
|
|
71
|
+
WHERE kind = 'hook_daemon_request' AND timestamp >= ?
|
|
72
|
+
`).get(s);u=Number(v?.total??0),l=Number(v?.failures??0),d=v?.average_duration==null?null:Math.round(Number(v.average_duration)*100)/100;}}catch(v){t.push({key:"hook_daemon_metrics_read",value:v.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{h?.close();}}let f=Math.max(i,l),g=Math.max(u,f),m=g===0?0:f/g;t.push({key:"hook_daemon_requests_24h",value:g,ok:true,severity:"info"}),t.push({key:"hook_fallback_rate_24h",value:Math.round(m*1e4)/1e4,target:0,ok:f===0,severity:"warning"}),t.push({key:"hook_daemon_response_ms_avg",value:d??"no successful requests",target:"<= 1000",ok:d===null||d<=1e3,severity:"warning"});let p=f>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:p,target:[],ok:p.length===0,severity:"warning"});let w=join$1(n,".devflow","logs","hook-debug");try{let h=sa(w);t.push({key:"hook_debug_log_bytes",value:h.bytes,target:`<= ${Do}`,ok:h.bytes<=Do,severity:"warning"}),t.push({key:"hook_debug_log_files",value:h.files,target:"rotated per project",ok:!0,severity:"info"});}catch(h){t.push({key:"hook_debug_log_read",value:h.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:A(t),metrics:t}}function ce(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function Ze(e){return JSON.parse(readFileSync$1(e,"utf8"))}function F(e){return typeof e=="object"&&e!==null?e:null}function Jo(e,t){return la.has(e)&&!(t.tolerateControlSyntax&&ua.has(e))}function Oe(e,t={}){if(Buffer.byteLength(e)>zo)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
|
+
`){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 f=e.slice(l,l+2);if(d==="#"&&r.length===0){for(;l<e.length&&e[l]!==`
|
|
75
|
+
`;)l+=1;u();continue}f==="<<"&&!t.tolerateControlSyntax&&(a=true);let g=d==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(l))||d==="}"&&da.test(`${r}}`);if(["(",")","{","}"].includes(d)&&!g&&!t.tolerateControlSyntax&&(a=true),f==="&&"||f==="||"){u(),l+=1;continue}if([";","|","&",`
|
|
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(f=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(f));return d!==void 0&&Jo(d,t)})&&(a=true),{segments:n,malformed:a}}function fa(e){return Oe(e).segments.flat().join(" ")}function ga(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 Vo(e,t){return ga(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 ma(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
|
+
`){o-=1;break}e[o]!==`
|
|
78
|
+
`&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function pa(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
|
+
`;)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 J(e,t,n="infer"){let o=t?fa(e):n==="node"?ma(e):n==="python"?pa(e):e;return [...new Set(o.match(aa)??[])]}function ha(e){return Oe(e).segments.flat()}function V(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=ne(a,i)?a:ne(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 ya(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>zo||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function Zt(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=ya(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:qe(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath$1(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:V(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||le(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=va(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:V(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:V(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:V(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function wa(e){let t=[e];extname(e)===""&&t.push(...Eo.map(n=>`${e}${n}`),...Eo.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function va(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 wa(o)??o}function ba(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
|
+
`;)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 ka(e,t,n,o=true){let r=ba(t),s=[],i=r.malformed,a=(d,f)=>{if(!d||d.kind!=="string"||!d.valid||d.value.length===0){i=true;return}s.push({value:d.value,cwd:dirname(e),project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:f,issuerPath:e});},{tokens:c}=r;for(let d=0;d<c.length;d+=1){let f=c[d],g=c[d-1];if(f.kind!=="identifier")continue;if(f.value==="eval"&&g?.value!=="."&&c[d+1]?.value==="("){i=true;continue}if(f.value==="require"){if(g?.value==="."){c[d-2]?.value==="module"&&c[d+1]?.value==="("&&(i=true);continue}if(c[d+1]?.value==="("){let p=c[d+2];c[d+3]?.value===")"||(i=true),a(p,"cjs");continue}i=true;continue}if(g?.value==="."||!["export","import"].includes(f.value))continue;if(f.value==="import"&&c[d+1]?.value==="("){let p=c[d+2];c[d+3]?.value===")"||(i=true),a(p,"esm");continue}if(f.value==="import"&&c[d+1]?.kind==="string"){a(c[d+1],"esm");continue}if(f.value==="import"&&c[d+1]?.value===".")continue;let m=-1;for(let p=d+1;p<Math.min(c.length,d+32)&&c[p].value!==";";p+=1)if(c[p].value==="from"){m=p;break}m>=0?a(c[m+1],"esm"):f.value==="import"&&(i=true);}let u=[],l=[];for(let d of s){let f=Zt(d,o);f.reference&&u.push(f.reference),f.inlineContent&&l.push(f.inlineContent),i||=f.malformed;}return {references:u,inlineContents:l,malformed:i}}function Sa(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]!==`
|
|
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 g=0;g<l;g+=1)t[d+g]=" ";d+=l;let f=false;for(;d<e.length;){if(e[d]==="\\"){t[d]=" ",d+1<e.length&&(t[d+1]=" "),d+=2;continue}if(e.slice(d,d+l)===c.repeat(l)){for(let g=0;g<l;g+=1)t[d+g]=" ";d+=l,f=true;break}if(!u&&(e[d]===`
|
|
84
|
+
`||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(`
|
|
86
|
+
SELECT source, COUNT(*) count FROM memories
|
|
87
|
+
WHERE created_at >= ? GROUP BY source ORDER BY source
|
|
88
|
+
`).all(s),a=r.prepare(`
|
|
89
|
+
SELECT
|
|
90
|
+
SUM(CASE WHEN access_count = 0 THEN 1 ELSE 0 END) never_accessed,
|
|
91
|
+
SUM(CASE WHEN access_count > 0 THEN 1 ELSE 0 END) accessed
|
|
92
|
+
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:A(n),metrics:n}}function tc(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:A(n),metrics:n};let r;try{if(r=W(o,t),!M(r,"knowledge_chunks"))n.push({key:"knowledge_schema",value:"knowledge_chunks missing",target:"Batch 3 knowledge schema",ok:!1,severity:"warning"});else {let 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:A(n),metrics:n}}function nc(e){let{manifest:t,metrics:n}=Qe(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:A(n),metrics:n}}function oc(e){let{manifest:t,metrics:n}=Qe(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:A(n),metrics:n}}function rc(e){let{manifest:t,metrics:n}=Qe(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:A(n),metrics:n}}async function sc(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 ic(e){let{manifest:t,metrics:n}=Qe(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??sc)(s);n.push({key:"dashboard_server_health",value:{url:s,status:i.status},target:"HTTP 200",ok:i.status===200,severity:"warning"});}catch(i){n.push({key:"dashboard_server_health",value:i.message,target:"HTTP 200",ok:false,severity:"warning"});}return {name:"UI reachability",status:A(n),metrics:n}}async function Qt(e={},t={}){let n=e.project??process.cwd(),o=qt(n),r=[zi(n,t),Xi(o.path,t),Za(o.path,t),ea(o.path,t),ta(o.path,!!e.strict,t),Xa(o.path,t),ec(o.path,t),tc(o.path,t),nc(t),oc(t),ra(t),rc(t),oa(t),await ic(t),ia(t)],s=e.strict&&r.some(i=>i.status!=="green")?1:0;return {sections:r,exitCode:s}}function ac(e,t={}){return e===void 0?nr():Qt(e,t)}function Lo(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function tr(e){let t=[];for(let n of e.sections){let o=`[${n.status.toUpperCase()}]`,r=n.status==="green"?b.green:n.status==="yellow"?b.yellow:b.red;t.push(`${r(o)} ${b.bold(n.name)}`);for(let s of n.metrics){let i=s.target===void 0?"":` (target: ${Lo(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${Lo(s.value)}${i}`);}}return t.join(`
|
|
94
|
+
`)}async function cc(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await Qt(e,n);return t.stdout(e.json?JSON.stringify(o):tr(o)),o.exitCode}async function Xe(e){let{createEngines:t}=await import('@devflow-tools/context-engine');return t(e)}async function nr(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await Xe(e),a=t.getStats(),c=n.export(),u=0;try{u=(await s.list()).length;}catch{}let l=false,d=0;try{let w=await o.getAll();l=!!w?.project,d=Object.keys(w?.user??{}).length;}catch{}let f=0;try{f=(await r.getSources()).length;}catch{}let g={total:0,byTool:{}};try{g=await i.getToolCallStats();}catch{}let m=await Ee(),p=0;return a.fileCount>0&&(p+=25),a.nodeCount>0&&(p+=15),c.nodes.length>0&&(p+=20),l&&(p+=15),f>0&&(p+=10),u>0&&(p+=5),m.running&&(p+=10),g.total>0&&(p+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:l,userPrefs:d},knowledge:{sources:f},plugins:{installed:0,names:[]},workflows:{registered:u},server:{running:m.running},toolCalls:g,readyScore:p}}async function lc(){let{data:e}=await Xe(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 uc(){let{data:e}=await Xe(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 dc(e){let{data:t}=await Xe(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 fc(){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 Be,Ji,Qi,me,na,Do,aa,ca,Ko,He,Yt,Go,zo,la,ua,da,Eo,Pa,Ao,Oo,To,No,Ra,Da,Ca,xa,$a,Io,Aa,Na,Ia,rr=C(()=>{X();Ji={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"]};Qi=new Set(["pending","committed","expired"]);me=1440*60*1e3,na=30*me,Do=60*1024*1024;aa=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,ca=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,Ko=64,He=1024*1024,Yt=8,Go=8,zo=64*1024;la=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),ua=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),da=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;Eo=[".cjs",".js",".mjs",".ts",".tsx"];Pa=new Set(["bash","node","python","python3","sh","tsx","zsh"]);Ao=new Set(["-r","--require"]),Oo=new Set(["--experimental-loader","--import","--loader"]),To=new Set(["-e","--eval","-p","--print"]),No=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),Ra=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),Da=new Set(["--check","-c"]),Ca=new Set(["--help","--version","-h","-v"]);xa=new Set(["-e","-eu","-o","-u","-ue"]),$a=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Io=new Set(["-W","-X","--check-hash-based-pycs"]),Aa=new Set(["--help","--version","-h","-V"]);Na=new Set(["builtin","command","env","exec","nohup","timeout"]),Ia=new Set([":","[","echo","false","printf","pwd","test","true"]);});var sr={};x(sr,{generateToken:()=>pc});async function pc(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 ir=C(()=>{});var Xt={};x(Xt,{reportBenchmarkCommand:()=>bc,runBenchmarkCommand:()=>vc});async function vc(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
|
+
|
|
96
|
+
Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function bc(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=kc(o,n);return r==="markdown"?`${s}
|
|
97
|
+
## Change From Prior Baseline
|
|
98
|
+
|
|
99
|
+
${i.map(a=>`- ${a}`).join(`
|
|
100
|
+
`)}
|
|
101
|
+
`:`${s}
|
|
102
|
+
|
|
103
|
+
Change from ${o.runId}:
|
|
104
|
+
${i.map(a=>`- ${a}`).join(`
|
|
105
|
+
`)}`}function kc(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [et("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),et("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),et("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),et("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function et(e,t,n,o){let r=t>0?(n-t)/t:0,s=o?r<-0.1:r>.1,i=r>0?"+":"";return `${e}: ${i}${(r*100).toFixed(1)}%${s?" (regression >10%)":""}`}var en=C(()=>{});var ur={};x(ur,{runReview:()=>Sc});async function Sc(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"),[b.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?b.red(`Critical (${i.length})`):"",...i.map(l=>` ${b.red("\u25CF")} ${l}`),"",a.length>0?b.yellow(`Warning (${a.length})`):"",...a.map(l=>` ${b.yellow("\u25CB")} ${l}`),"",c.length>0?b.green(`Suggestion (${c.length})`):"",...c.map(l=>` ${b.green("\u25CB")} ${l}`),"",i.length>0?b.red("Overall: Need changes"):a.length>0?b.yellow("Overall: Approve with comments"):b.green("Overall: LGTM")].join(`
|
|
106
|
+
`)}var dr=C(()=>{});var fr={};x(fr,{startAll:()=>Pc});async function _c(e,t=15e3){let n=Date.now();for(;Date.now()-n<t;){try{if((await fetch(`http://localhost:${e}/api/health`)).ok)return !0}catch{}await new Promise(o=>setTimeout(o,500));}return false}async function Pc(e){console.log(b.blue("Starting DevFlow server..."));let{pid:t}=await jt({port:e.port});console.log(b.green(` Server started (PID: ${t})`)),console.log(b.blue(" Waiting for server..."));let n=await _c(e.port);console.log(n?b.green(" Server ready"):b.yellow(" Server started but health check timed out")),console.log(""),console.log(b.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(b.green("\u2551")+" DevFlow Started! "+b.green("\u2551")),console.log(b.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(b.green("\u2551")+` Server + Dashboard: http://localhost:${e.port}`.padEnd(57)+b.green("\u2551")),console.log(b.green("\u2551")+` API: http://localhost:${e.port}/api`.padEnd(57)+b.green("\u2551")),console.log(b.green("\u2551")+" "+b.green("\u2551")),console.log(b.green("\u2551")+" Press Ctrl+C to stop "+b.green("\u2551")),console.log(b.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(b.blue(`
|
|
107
|
+
Shutting down...`)),await Ce(),console.log(b.green("Server stopped.")),o());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var gr=C(()=>{X();});var pr={};x(pr,{stopAll:()=>Rc});async function Rc(){let e=await Ce();console.log(e?b.green("Server stopped"):b.dim("No DevFlow services running"));}var hr=C(()=>{X();});var wr={};x(wr,{showStatus:()=>$c});function xc(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 $c(){console.log(b.blue("DevFlow Status")),console.log(b.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let e=await Ee(),t=e.port??Fe;e.running?(console.log(`Server: ${b.green("\u2713")} running (port ${t}${e.pid?`, PID ${e.pid}`:""})`),console.log(`Dashboard: ${b.green("\u2713")} served at http://localhost:${t}`)):(console.log(`Server: ${b.yellow("\u25CB")} not running`),console.log(`Dashboard: ${b.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: ${b.dim(`no global database (${n})`)}`);let o=join(process.cwd(),".devflow","devflow.db"),r=join(process.cwd(),".codegraph","codegraph.db"),s=[...existsSync(o)?[o]:[],...xc(r)?[`${r} (devflow_* tables)`]:[]];s.length>0?console.log(`Legacy: ${b.yellow(s.join(", "))}`):console.log(`Legacy: ${b.green("none")}`);}var vr=C(()=>{X();});var Sr={};x(Sr,{setupCommand:()=>Uc});function Lc(){let e=[resolve$1(dirname$1(Mc.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 Fc(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 Uc(e){if(console.log(b.blue("DevFlow Setup")),console.log(b.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),!e.skipMcp)try{let t=await _t({agent:e.agent,command:"devflow-mcp"});for(let n of t)console.log(b.green(` \u2713 MCP: ${n}`));}catch(t){console.log(b.yellow(` \u26A0 MCP setup failed: ${t.message}`)),console.log(b.dim(" You can configure MCP manually with: devflow connect"));}if(!e.skipPlugin){let t=Lc();if(t){let n=join(homedir(),".claude","plugins");mkdirSync(n,{recursive:true});let o=join(n,"known_marketplaces.json");Fc(o,{devflow:{source:{directory:t}}}),console.log(b.green(` \u2713 Plugin registered: ${t}`));}else console.log(b.yellow(" \u26A0 Plugin directory not found")),console.log(b.dim(" The Claude Code plugin may not be available."));}console.log(""),console.log(b.green("Setup complete!")),console.log(b.dim("Restart Claude Code to use /devflow:* commands"));}var Mc,_r=C(()=>{Pt();Mc=createRequire(import.meta.url);});var Pr={};x(Pr,{pluginListCommand:()=>Bc});var Bc,Rr=C(()=>{Ne();Bc=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=ue();if(e.installed){let n=Cn();if(n.length===0){console.log("No plugins installed."),console.log(`
|
|
24
108
|
Run "devflow plugin list" to see available plugins.`);return}console.log(`Installed plugins:
|
|
25
|
-
`),n.forEach(
|
|
26
|
-
`);let n=Math.max(...
|
|
27
|
-
Install a plugin: devflow plugin install <name>`);}});var
|
|
28
|
-
Try: devflow plugin list`);return}console.log(`Found ${
|
|
29
|
-
`),
|
|
30
|
-
${
|
|
109
|
+
`),n.forEach(o=>{let r=t.plugins.find(s=>s.name===o);r?(console.log(` ${b.green(r.name)}@${r.version}`),console.log(` ${r.description}`)):console.log(` ${b.green(o)}`);});}else {if(t.plugins.length===0){console.log("No plugins available.");return}console.log(`Available plugins (${t.plugins.length}):
|
|
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(` ${b.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(`
|
|
111
|
+
Install a plugin: devflow plugin install <name>`);}});});var Dr={};x(Dr,{pluginSearchCommand:()=>Kc});var Kc,Cr=C(()=>{Ne();Kc=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=ue(),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
|
+
Try: devflow plugin list`);return}console.log(`Found ${o.length} plugin(s) matching "${e}":
|
|
113
|
+
`),o.forEach(r=>{console.log(` ${b.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 xr={};x(xr,{pluginInstallCommand:()=>Jc});var Jc,$r=C(()=>{Jc=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(`
|
|
114
|
+
${b.green("\u2713")} ${t} installed successfully`),console.log(`
|
|
31
115
|
Run "devflow plugin list --installed" to verify.`);}catch(n){console.error(`
|
|
32
|
-
${
|
|
33
|
-
${
|
|
34
|
-
${
|
|
35
|
-
`));}let n=
|
|
36
|
-
${e} docs synced to .devflow/knowledge/${e}/`));}else {let
|
|
37
|
-
All docs synced.`));}});var
|
|
38
|
-
`)),console.log(l.bold("\u25C9 Index Status")),console.log(` Files ${o.index.totalFiles.toLocaleString()}`),console.log(` Symbols ${o.index.totalSymbols.toLocaleString()}`),console.log(` Graph (${o.graph.edges.toLocaleString()} edges)`),console.log(` Status ${o.index.indexing?"indexing":"idle"}`),console.log(),console.log(l.bold("\u25C9 Memory")),console.log(` Project ${o.memory.projectReady?"ready":"not set"}`),console.log(` Preferences ${o.memory.userPrefs} set`),console.log(),console.log(l.bold("\u25C9 Knowledge")),console.log(` Sources ${o.knowledge.sources}`),console.log(),console.log(l.bold("\u25C9 Server")),o.server.running?console.log(` ${l.green("\u2714")} Running on http://localhost:13337`):console.log(` ${l.yellow("\u25CB")} Not running \u2014 run \`devflow server start\` for telemetry`),console.log(),console.log(l.bold("\u25C9 Plugins")),o.plugins.installed===0)console.log(` ${l.dim("No plugins installed")}`);else for(let t of o.plugins.names)console.log(` ${t}`);console.log(),console.log(l.bold("\u25C9 Workflows")),console.log(` Registered ${o.workflows.registered}`),console.log();let n=o.readyScore>=70?l.green:o.readyScore>=40?l.yellow:l.red;console.log(`AI Ready: ${n(o.readyScore+"%")}`);});a.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let o=await ao(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(o,null,2));});a.command("benchmark [target]").description("Run benchmark on engines").option("--iterations <n>","Number of iterations","5").option("--output <format>","json | text","text").action(async(e,o)=>{let n=await co(e??"all",{iterations:parseInt(o.iterations,10),output:o.output});console.log(n);});a.command("review [pr-url]").description("Review a PR or current branch diff").option("--agent <agent>","AI agent to use","claude").action(async(e,o)=>{let n=await uo({prUrl:e,agent:o.agent});console.log(n);});var ae=a.command("server").description("Manage DevFlow server");ae.command("start").description("Start the DevFlow REST server").option("--port <n>","Port number","13337").action(async e=>{console.log(l.blue("Starting DevFlow server..."));let o=await F({port:parseInt(e.port,10)});console.log(l.green(`Server started (pid: ${o.pid}) on port ${e.port}`));});ae.command("stop").description("Stop the DevFlow REST server").action(async()=>{let e=await x();console.log(e?l.green("Server stopped"):l.dim("No server running"));});ae.command("status").description("Show server status").action(async()=>{let e=await P();e.running?console.log(l.green(`Running (pid: ${e.pid})`)):console.log(l.yellow("Not running"));});a.addCommand(Co);a.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async e=>{await po({port:parseInt(e.port,10),background:!!e.background});});a.command("stop").description("Stop DevFlow server").action(async()=>{await fo();});a.command("status").description("Show DevFlow services status").action(async()=>{await wo();});a.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=>{await vo({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var M=a.command("plugin").description("Manage DevFlow plugins");M.addCommand(So);M.addCommand(ko);M.addCommand($o);M.addCommand(Po);a.parse();
|
|
116
|
+
${b.red("\u2717")} Installation failed: ${n.message}`),process.exit(1);}});});var Or={};x(Or,{pluginUninstallCommand:()=>Zc});var Zc,Tr=C(()=>{Zc=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(`
|
|
117
|
+
${b.green("\u2713")} ${t} uninstalled successfully`);}catch(n){console.error(`
|
|
118
|
+
${b.red("\u2717")} Uninstallation failed: ${n.message}`),process.exit(1);}});});function rt(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 Ir=createRequire(import.meta.url),rn="0.0.0";try{rn=Ir("../package.json").version;}catch{try{rn=Ir("../../package.json").version;}catch{}}var P=new Command;P.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(rn).option("--local","Force local engine, skip server");P.command("init").description("Initialize .devflow/ in the current project").option("--force","Overwrite existing config").option("--abort","Force delete .codegraph and .devflow directories before reinitializing").option("--report","Output onboarding markdown report to stdout").option("--json","Output onboarding pack as JSON to stdout").option("--plugins <names>","Comma-separated list of plugins to install (non-interactive)").option("--with-plugin <names>","Interactively review optional memory hints from installed plugins").option("--no-plugins","Skip plugin installation guide").action(async e=>{let t=process.cwd();if(e.abort){console.log(b.yellow("\u{1F5D1}\uFE0F --abort flag detected, removing existing directories..."));let i=[".codegraph",".devflow"];for(let a of i){let c=Xc.join(t,a);Nr.existsSync(c)&&(console.log(b.dim(` Removing ${a}/...`)),Nr.rmSync(c,{recursive:true,force:true}));}console.log(b.green(`\u2705 Existing directories removed
|
|
119
|
+
`));}let n=rt(t);console.error(b.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(Pn(),_n)),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(b.green("Created:"));for(let i of s.created)console.log(` ${b.dim("+")} ${i}`);}else console.log(b.dim("Already initialized. Use --force to overwrite config."));if(s.indexed&&console.log(b.green(`\u2705 CodeGraph initialized (${s.indexed.files} files, ${s.indexed.symbols} symbols)`)),s.onboardingPack){let i=s.onboardingPack;console.log(b.green("\u2705 Onboarding pack generated")),console.log(b.dim(` ${i.stats.files} files, ${i.stack.frameworks.join(", ")||"no framework"}`));}if(s.pluginDeployed&&console.log(b.green("\u2705 Plugin deployed to ~/.claude/plugins/cache/")),s.pluginEnabled&&console.log(b.green("\u2705 Plugin enabled in ~/.claude/settings.json")),s.mcpConfigured&&console.log(b.green("\u2705 MCP config written to .claude/mcp.json")),s.pluginDeployed&&s.pluginEnabled&&s.mcpConfigured&&console.log(b.green("\nDevFlow is ready! Run `claude` to start.")),typeof e.withPlugin=="string"){let{reviewPluginMemoryHints:i}=await Promise.resolve().then(()=>(Dn(),Rn)),a=await i(t,e.withPlugin);console.log(b.dim(`Plugin memory hints: ${a.selected}/${a.available} selected`));}if(typeof e.plugins=="string"){let{installPluginsFromList:i}=await Promise.resolve().then(()=>(ft(),dt));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(ft(),dt));await i(t);}}});P.command("reset").description("Reset generated DevFlow project data").requiredOption("--scope <scope>","memory | knowledge | codegraph | all").option("--backup-to <dir>","Back up selected data before resetting").option("--force","Reset without creating a backup").option("--project <path>","Project directory",process.cwd()).action(async e=>{let{executeResetCommand:t}=await Promise.resolve().then(()=>(Wn(),Un));t(e,{},{log:o=>console.log(o),error:o=>console.error(b.red(o))})||(process.exitCode=1);});var tl=P.command("db").description("Manage DevFlow databases");tl.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(()=>(Zn(),Yn)),o=t(e);for(let r of n(o))console.log(r);});P.command("connect [agent]").description("Configure the Claude Code MCP connection").option("--command <cmd>","MCP server command","devflow-mcp").action(async(e,t)=>{let n=process.cwd(),o=rt(n);console.log(b.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(Pt(),Qn));if(e){let i=s();i.includes(e)||(console.log(b.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(b.green(`\u2713 ${a}`));}catch(i){console.error(b.red(`Error: ${i.message}`)),process.exit(1);}});P.command("index").description("Show index status").option("--backfill-vectors","Reconcile the index and wait for symbol vectors").option("--watch","Start file watcher for hot updates (stub)").action(async e=>{let{getIndexStatus:t,refreshIndex:n}=await Promise.resolve().then(()=>(oo(),no)),o=e.backfillVectors?await n(P.opts().local):await t(P.opts().local);console.log(b.blue("Index Status")),console.log(` Files: ${o.totalFiles}`),console.log(` Symbols: ${o.totalSymbols}`),console.log(` Indexing: ${o.indexing?"active":"idle"}`),e.watch&&console.log(b.dim(" (watch mode not yet implemented)"));});P.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(so(),ro)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:P.opts().local});console.log(b.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});P.command("context <query>").description("Retrieve project context for a query").option("--mode <mode>","fast | deep","fast").option("--max-tokens <n>","Max token budget","4000").option("--task","Use task-oriented mode with risk hints and next actions").option("--why","Show reasoning for file selection").action(async(e,t)=>{if(t.task){let{getTaskContext:n}=await Promise.resolve().then(()=>(Dt(),Rt)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:P.opts().local});console.log(JSON.stringify({requiredFiles:o.requiredFiles,optionalFiles:o.optionalFiles,riskHints:o.riskHints,nextActions:o.nextActions,reasoning:t.why?o.reasoning:void 0},null,2));}else {let{getContext:n}=await Promise.resolve().then(()=>(Dt(),Rt)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:P.opts().local});console.log(b.blue(`Context: "${e}"`)),console.log(` Files: ${o.files.length}`),console.log(` Confidence: ${(o.confidence*100).toFixed(0)}%`),console.log(` Tokens: ${o.tokenCount}`);}});var nt=P.command("workflow").description("Workflow management");nt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(_e(),Se)),t=await e(P.opts().local);if(t.length===0){console.log(b.dim("No workflows registered."));return}for(let n of t)console.log(`${b.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});nt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(_e(),Se)),o=await n(e,{input:t??""},P.opts().local);console.log(`Run: ${o.runId}`),console.log(`Status: ${o.status}`),console.log(`Duration: ${o.duration}ms`);});nt.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(_e(),Se)),t=await e(P.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});nt.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(_e(),Se)),t=await e(P.opts().local);if(t.length===0){console.log(b.dim("No runs yet."));return}for(let n of t){let o=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${b.yellow(n.status)} ${o}`);}});var pe=P.command("memory").description("Memory management");pe.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(ie(),se)),n=await t(P.opts().local,e.source);console.log(JSON.stringify(n,null,2));});pe.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(ie(),se));console.log(JSON.stringify(await t(P.opts().local,e.source),null,2));});pe.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(()=>(ie(),se)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:P.opts().local});console.log(JSON.stringify(o,null,2));});pe.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(ie(),se));await n(e,t,P.opts().local),console.log(b.green(`Memory set: ${e} = ${t}`));});pe.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(ie(),se)),t=await e(P.opts().local);console.log(JSON.stringify(t,null,2));});pe.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(()=>(ie(),se)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(b.green(`Observation vectors ready: ${n.processed} added, ${n.remaining} remaining`));});P.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(uo(),lo)),o=(await t(e,void 0,void 0,P.opts().local)).results;console.log(b.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var sn=P.command("docs").description("Documentation index management");sn.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(b.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(` ${b.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${b.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(b.green(`
|
|
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(` ${b.green("\u2713")} ${a.source} \u2192 ${a.added} chunks`):console.log(` ${b.red("\u2717")} ${a.source} \u2014 ${a.errors.join(", ")||"no content"}`);}console.log(b.green(`
|
|
121
|
+
All docs synced.`));}});sn.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(()=>(At(),$t)),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(b.green(`Knowledge vectors ready: ${n.processed} added, ${n.remaining} remaining`));});sn.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(()=>(At(),$t));console.log(b.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(` ${b.green("\u2713")} ${r.source} \u2192 ${r.added} chunks`):console.log(` ${b.red("\u2717")} ${r.source} \u2014 ${r.errors.join(", ")||"no content"}`);console.log(b.green("Docs resynced. Run `devflow docs backfill-vectors` to rebuild vectors."));});var ot=P.command("skill").description("Plugin/Skill management");ot.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(De(),Re)),t=await e(P.opts().local);if(t.length===0){console.log(b.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${b.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});ot.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(De(),Re)),n=await t(e,P.opts().local);if(console.log(b.blue(`Search: "${e}"`)),n.length===0){console.log(b.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${b.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});ot.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(De(),Re)),n=await t(e,process.cwd(),P.opts().local);console.log(b.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(b.red(`Error: ${t.message}`)),process.exit(1);}});ot.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(De(),Re));await t(e,process.cwd(),P.opts().local),console.log(b.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(b.red(`Error: ${t.message}`)),process.exit(1);}});P.command("doctor").description("Run project health check").option("--json","Output as JSON").option("--strict","Exit with status 1 when any health section has warnings or errors").option("--project <path>","Project directory",process.cwd()).option("--audit","Verify audit chain integrity").option("--audit-fix","Rebuild audit chain signatures").option("--violations","Show violation records").option("--last <period>","Filter violations by time (e.g. 7d, 24h)").option("--receipts","Show current session receipt status").action(async e=>{let{runDoctorCommand:t,runDoctorAudit:n,runDoctorAuditFix:o,runDoctorViolations:r,runDoctorReceipts:s}=await Promise.resolve().then(()=>(rr(),or));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;});P.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let{generateToken:t}=await Promise.resolve().then(()=>(ir(),sr)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var jr=P.command("benchmark").description("Run and inspect reproducible A/B benchmarks");jr.command("run").description("Run a benchmark suite and persist the report").option("--suite <id>","Benchmark suite","default").option("--project <root>","Initialized project root",process.cwd()).option("--rounds <n>","Rounds per task","1").option("--output <format>","text | json","text").action(async e=>{let{runBenchmarkCommand:t}=await Promise.resolve().then(()=>(en(),Xt));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});jr.command("report").description("Render a persisted benchmark report").option("--run-id <id>","Specific report; defaults to latest").option("--baseline <id>","Prior report used for regression comparison").option("--output <format>","text | json | markdown","text").action(async e=>{let{reportBenchmarkCommand:t}=await Promise.resolve().then(()=>(en(),Xt));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});P.command("review [pr-url]").description("Review a PR or current branch diff").option("--agent <agent>","AI agent to use","claude").action(async(e,t)=>{let{runReview:n}=await Promise.resolve().then(()=>(dr(),ur)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var an=P.command("server").description("Manage DevFlow server");an.command("start").description("Start the DevFlow REST server").option("--port <n>","Port number","13337").action(async e=>{console.log(b.blue("Starting DevFlow server..."));let{startServer:t}=await Promise.resolve().then(()=>(X(),Ue)),n=await t({port:parseInt(e.port,10)});console.log(b.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});an.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(X(),Ue)),t=await e();console.log(t?b.green("Server stopped"):b.dim("No server running"));});an.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(X(),Ue)),t=await e();t.running?console.log(b.green(`Running (pid: ${t.pid})`)):console.log(b.yellow("Not running"));});P.command("dashboard").description("Open DevFlow Dashboard").action(()=>{console.log(b.blue("The Dashboard is served by the DevFlow server.")),console.log(b.dim("Run: devflow start")),console.log(b.dim("Then open: http://localhost:13337"));});P.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async e=>{let{startAll:t}=await Promise.resolve().then(()=>(gr(),fr));await t({port:parseInt(e.port,10),background:!!e.background});});P.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(hr(),pr));await e();});P.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(vr(),wr));await e();});P.command("setup").description("Configure Claude Code integration (MCP + plugin)").option("--agent <agent>","Target agent (claude/cursor/cline)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>(_r(),Sr));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var tt=P.command("plugin").description("Manage DevFlow plugins");if(process.argv.includes("plugin")){let[{pluginListCommand:e},{pluginSearchCommand:t},{pluginInstallCommand:n},{pluginUninstallCommand:o}]=await Promise.all([Promise.resolve().then(()=>(Rr(),Pr)),Promise.resolve().then(()=>(Cr(),Dr)),Promise.resolve().then(()=>($r(),xr)),Promise.resolve().then(()=>(Tr(),Or))]);tt.addCommand(e),tt.addCommand(t),tt.addCommand(n),tt.addCommand(o);}await P.parseAsync();
|