@devflow-tools/devflow 0.17.8 → 0.18.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.
Files changed (203) hide show
  1. package/LICENSE +21 -0
  2. package/acceptance-manifest.json +3 -3
  3. package/dist/cli.js +75 -75
  4. package/dist/dashboard/404.html +1 -1
  5. package/dist/dashboard/__next.__PAGE__.txt +22 -0
  6. package/dist/dashboard/__next._full.txt +17 -0
  7. package/dist/dashboard/__next._tree.txt +2 -0
  8. package/dist/dashboard/_next/static/chunks/136-c55134e877048a37.js +1 -0
  9. package/dist/dashboard/_next/static/chunks/240-8f45a6db4f75278b.js +1 -0
  10. package/dist/dashboard/_next/static/chunks/426-5d356f119312b4e9.js +1 -0
  11. package/dist/dashboard/_next/static/chunks/567-65014d15b90b623c.js +1 -0
  12. package/dist/dashboard/_next/static/chunks/6b3bb038-e03941413841e57b.js +2 -0
  13. package/dist/dashboard/_next/static/chunks/722-001c96b6723e043d.js +1 -0
  14. package/dist/dashboard/_next/static/chunks/73-0fe34a8ce87c82ea.js +1 -0
  15. package/dist/dashboard/_next/static/chunks/820-9606b69ff6f7f9b9.js +1 -0
  16. package/dist/dashboard/_next/static/chunks/87c73c54-5c63d5698583b654.js +1 -0
  17. package/dist/dashboard/_next/static/chunks/90-63c7687fddbb45ce.js +1 -0
  18. package/dist/dashboard/_next/static/chunks/914-7e538089692b7d1b.js +1 -0
  19. package/dist/dashboard/_next/static/chunks/968-13e9b4b491d5e8de.js +52 -0
  20. package/dist/dashboard/_next/static/chunks/993-01834e67bc353d44.js +1 -0
  21. package/dist/dashboard/_next/static/chunks/app/_global-error/page-d786ba6306178164.js +1 -0
  22. package/dist/dashboard/_next/static/chunks/app/_not-found/page-d0b590a9f2ad206d.js +1 -0
  23. package/dist/dashboard/_next/static/chunks/app/accuracy/page-72ef9620a52e345e.js +1 -0
  24. package/dist/dashboard/_next/static/chunks/app/benchmark/page-a6005345a1d9a286.js +1 -0
  25. package/dist/dashboard/_next/static/chunks/app/context/page-070c5ebfffb71f1b.js +1 -0
  26. package/dist/dashboard/_next/static/chunks/app/doctor/page-973e0f84ace610ac.js +1 -0
  27. package/dist/dashboard/_next/static/chunks/app/executions/page-52f9a045f91548cc.js +1 -0
  28. package/dist/dashboard/_next/static/chunks/app/graph/page-c3487fe2482e734e.js +1 -0
  29. package/dist/dashboard/_next/static/chunks/app/knowledge/page-e184866ed2e92ef1.js +1 -0
  30. package/dist/dashboard/_next/static/chunks/app/layout-a28c30513212e363.js +1 -0
  31. package/dist/dashboard/_next/static/chunks/app/memory/page-36e047153bedfce2.js +1 -0
  32. package/dist/dashboard/_next/static/chunks/app/page-1daa0024f1e5dd18.js +1 -0
  33. package/dist/dashboard/_next/static/chunks/app/replay/page-7a6293c77eafe8b4.js +1 -0
  34. package/dist/dashboard/_next/static/chunks/app/runs/[id]/page-7a92db57d7fb2265.js +1 -0
  35. package/dist/dashboard/_next/static/chunks/app/runs/page-36baf64267e36b28.js +1 -0
  36. package/dist/dashboard/_next/static/chunks/app/settings/page-90b4b80e939f76e3.js +1 -0
  37. package/dist/dashboard/_next/static/chunks/app/timeline/page-c1f1b6c081532456.js +1 -0
  38. package/dist/dashboard/_next/static/chunks/app/tool-metrics/page-1c5ddf6239cf1734.js +1 -0
  39. package/dist/dashboard/_next/static/chunks/app/workflows/page-e2ed74df546c3568.js +1 -0
  40. package/dist/dashboard/_next/static/chunks/framework-3b2aca1ee87fa7ee.js +1 -0
  41. package/dist/dashboard/_next/static/chunks/main-9bbdbe1dbba0ab29.js +5 -0
  42. package/dist/dashboard/_next/static/chunks/main-app-44f3d55a6e6befbb.js +1 -0
  43. package/dist/dashboard/_next/static/chunks/next/dist/client/components/builtin/app-error-d786ba6306178164.js +1 -0
  44. package/dist/dashboard/_next/static/chunks/next/dist/client/components/builtin/forbidden-d786ba6306178164.js +1 -0
  45. package/dist/dashboard/_next/static/chunks/next/dist/client/components/builtin/global-error-39f976c070691d89.js +1 -0
  46. package/dist/dashboard/_next/static/chunks/next/dist/client/components/builtin/not-found-d786ba6306178164.js +1 -0
  47. package/dist/dashboard/_next/static/chunks/next/dist/client/components/builtin/unauthorized-d786ba6306178164.js +1 -0
  48. package/dist/dashboard/_next/static/chunks/webpack-5f4649c40b052b9f.js +1 -0
  49. package/dist/dashboard/_next/static/css/6912a202a7d0c151.css +3 -0
  50. package/dist/dashboard/_next/static/css/e07f2bf4fa519943.css +31 -0
  51. package/dist/dashboard/_next/static/vYfa_ZByuhX4CBoOEYkDT/_buildManifest.js +1 -0
  52. package/dist/dashboard/_not-found/__next._full.txt +18 -0
  53. package/dist/dashboard/_not-found/__next._not-found.__PAGE__.txt +24 -0
  54. package/dist/dashboard/_not-found/__next._tree.txt +2 -0
  55. package/dist/dashboard/_not-found.html +1 -0
  56. package/dist/dashboard/_not-found.txt +18 -0
  57. package/dist/dashboard/accuracy/__next._full.txt +19 -0
  58. package/dist/dashboard/accuracy/__next._tree.txt +2 -0
  59. package/dist/dashboard/accuracy/__next.accuracy.__PAGE__.txt +25 -0
  60. package/dist/dashboard/accuracy.html +1 -1
  61. package/dist/dashboard/accuracy.txt +19 -7
  62. package/dist/dashboard/benchmark/__next._full.txt +19 -0
  63. package/dist/dashboard/benchmark/__next._tree.txt +2 -0
  64. package/dist/dashboard/benchmark/__next.benchmark.__PAGE__.txt +25 -0
  65. package/dist/dashboard/benchmark.html +1 -1
  66. package/dist/dashboard/benchmark.txt +19 -7
  67. package/dist/dashboard/context/__next._full.txt +19 -0
  68. package/dist/dashboard/context/__next._tree.txt +2 -0
  69. package/dist/dashboard/context/__next.context.__PAGE__.txt +25 -0
  70. package/dist/dashboard/context.html +1 -1
  71. package/dist/dashboard/context.txt +19 -7
  72. package/dist/dashboard/doctor/__next._full.txt +19 -0
  73. package/dist/dashboard/doctor/__next._tree.txt +2 -0
  74. package/dist/dashboard/doctor/__next.doctor.__PAGE__.txt +25 -0
  75. package/dist/dashboard/doctor.html +1 -1
  76. package/dist/dashboard/doctor.txt +19 -7
  77. package/dist/dashboard/executions/__next._full.txt +19 -0
  78. package/dist/dashboard/executions/__next._tree.txt +2 -0
  79. package/dist/dashboard/executions/__next.executions.__PAGE__.txt +25 -0
  80. package/dist/dashboard/executions.html +1 -1
  81. package/dist/dashboard/executions.txt +19 -7
  82. package/dist/dashboard/graph/__next._full.txt +20 -0
  83. package/dist/dashboard/graph/__next._tree.txt +3 -0
  84. package/dist/dashboard/graph/__next.graph.__PAGE__.txt +26 -0
  85. package/dist/dashboard/graph.html +1 -1
  86. package/dist/dashboard/graph.txt +20 -7
  87. package/dist/dashboard/index.html +1 -1
  88. package/dist/dashboard/index.txt +17 -7
  89. package/dist/dashboard/knowledge/__next._full.txt +19 -0
  90. package/dist/dashboard/knowledge/__next._tree.txt +2 -0
  91. package/dist/dashboard/knowledge/__next.knowledge.__PAGE__.txt +25 -0
  92. package/dist/dashboard/knowledge.html +1 -1
  93. package/dist/dashboard/knowledge.txt +19 -7
  94. package/dist/dashboard/memory/__next._full.txt +19 -0
  95. package/dist/dashboard/memory/__next._tree.txt +2 -0
  96. package/dist/dashboard/memory/__next.memory.__PAGE__.txt +25 -0
  97. package/dist/dashboard/memory.html +1 -1
  98. package/dist/dashboard/memory.txt +19 -7
  99. package/dist/dashboard/replay/__next._full.txt +19 -0
  100. package/dist/dashboard/replay/__next._tree.txt +2 -0
  101. package/dist/dashboard/replay/__next.replay.__PAGE__.txt +25 -0
  102. package/dist/dashboard/replay.html +1 -1
  103. package/dist/dashboard/replay.txt +19 -7
  104. package/dist/dashboard/runs/_/__next._full.txt +19 -0
  105. package/dist/dashboard/runs/_/__next._tree.txt +2 -0
  106. package/dist/dashboard/runs/_/__next.runs.$d$id.__PAGE__.txt +26 -0
  107. package/dist/dashboard/runs/_.html +1 -1
  108. package/dist/dashboard/runs/_.txt +19 -8
  109. package/dist/dashboard/runs/__next._full.txt +19 -0
  110. package/dist/dashboard/runs/__next._tree.txt +2 -0
  111. package/dist/dashboard/runs/__next.runs.__PAGE__.txt +25 -0
  112. package/dist/dashboard/runs.html +1 -1
  113. package/dist/dashboard/runs.txt +19 -7
  114. package/dist/dashboard/settings/__next._full.txt +19 -0
  115. package/dist/dashboard/settings/__next._tree.txt +2 -0
  116. package/dist/dashboard/settings/__next.settings.__PAGE__.txt +25 -0
  117. package/dist/dashboard/settings.html +1 -1
  118. package/dist/dashboard/settings.txt +19 -7
  119. package/dist/dashboard/timeline/__next._full.txt +19 -0
  120. package/dist/dashboard/timeline/__next._tree.txt +2 -0
  121. package/dist/dashboard/timeline/__next.timeline.__PAGE__.txt +25 -0
  122. package/dist/dashboard/timeline.html +1 -1
  123. package/dist/dashboard/timeline.txt +19 -7
  124. package/dist/dashboard/tool-metrics/__next._full.txt +19 -0
  125. package/dist/dashboard/tool-metrics/__next._tree.txt +2 -0
  126. package/dist/dashboard/tool-metrics/__next.tool-metrics.__PAGE__.txt +25 -0
  127. package/dist/dashboard/tool-metrics.html +1 -1
  128. package/dist/dashboard/tool-metrics.txt +19 -7
  129. package/dist/dashboard/workflows/__next._full.txt +19 -0
  130. package/dist/dashboard/workflows/__next._tree.txt +2 -0
  131. package/dist/dashboard/workflows/__next.workflows.__PAGE__.txt +25 -0
  132. package/dist/dashboard/workflows.html +1 -1
  133. package/dist/dashboard/workflows.txt +19 -7
  134. package/dist/hooks/enforcer-summary.js +3 -3
  135. package/dist/hooks/hook-client.js +3 -3
  136. package/dist/hooks/hook-daemon.js +27 -25
  137. package/dist/hooks/post-tool-use-failure.js +2 -2
  138. package/dist/hooks/post-tool-use.js +6 -6
  139. package/dist/hooks/pre-compact.js +2 -2
  140. package/dist/hooks/pre-tool-use.js +4 -4
  141. package/dist/hooks/server-bootstrap.js +22 -22
  142. package/dist/hooks/session-end.js +6 -6
  143. package/dist/hooks/stop.js +10 -10
  144. package/dist/hooks/user-prompt-submit.js +11 -9
  145. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  146. package/dist/plugin/dist/command-registry.json +5 -5
  147. package/dist/plugin/dist/hooks/enforcer-summary.js +3 -3
  148. package/dist/plugin/dist/hooks/hook-client.js +3 -3
  149. package/dist/plugin/dist/hooks/hook-daemon.js +27 -25
  150. package/dist/plugin/dist/hooks/post-tool-use-failure.js +2 -2
  151. package/dist/plugin/dist/hooks/post-tool-use.js +6 -6
  152. package/dist/plugin/dist/hooks/pre-compact.js +2 -2
  153. package/dist/plugin/dist/hooks/pre-tool-use.js +4 -4
  154. package/dist/plugin/dist/hooks/server-bootstrap.js +22 -22
  155. package/dist/plugin/dist/hooks/session-end.js +6 -6
  156. package/dist/plugin/dist/hooks/stop.js +10 -10
  157. package/dist/plugin/dist/hooks/user-prompt-submit.js +11 -9
  158. package/dist/plugin/package.json +28 -19
  159. package/dist/scripts/audit-session-data.js +5 -5
  160. package/dist/scripts/semantic-reliability-maintenance.js +3 -3
  161. package/package.json +31 -22
  162. package/plugin-registry.json +57 -57
  163. package/dist/dashboard/_next/static/TCuEOFM92HCewQsicwfte/_buildManifest.js +0 -1
  164. package/dist/dashboard/_next/static/chunks/1dd3208c-f3e84932bdc53383.js +0 -1
  165. package/dist/dashboard/_next/static/chunks/221-893fab1a7d7d9317.js +0 -1
  166. package/dist/dashboard/_next/static/chunks/249-e04c1de6240fd78a.js +0 -1
  167. package/dist/dashboard/_next/static/chunks/343-09a7e255220705c5.js +0 -1
  168. package/dist/dashboard/_next/static/chunks/402-a2e4eb98bb6a524c.js +0 -1
  169. package/dist/dashboard/_next/static/chunks/429-39f42ebb1ac959d6.js +0 -1
  170. package/dist/dashboard/_next/static/chunks/458-75822399a849befa.js +0 -1
  171. package/dist/dashboard/_next/static/chunks/528-7d4fc14903647f1e.js +0 -2
  172. package/dist/dashboard/_next/static/chunks/568-50487ea5e93fe11f.js +0 -1
  173. package/dist/dashboard/_next/static/chunks/697-05cf55b6c667773f.js +0 -1
  174. package/dist/dashboard/_next/static/chunks/6b3bb038-34d5cf36bd0210d6.js +0 -1
  175. package/dist/dashboard/_next/static/chunks/736-db1a009357c222d2.js +0 -1
  176. package/dist/dashboard/_next/static/chunks/806-195d4d5cc6c28f6c.js +0 -1
  177. package/dist/dashboard/_next/static/chunks/app/_not-found/page-5252c260804ee1ce.js +0 -1
  178. package/dist/dashboard/_next/static/chunks/app/accuracy/page-7b4f3c728a0e880f.js +0 -1
  179. package/dist/dashboard/_next/static/chunks/app/benchmark/page-6c6d0acbcde4eb85.js +0 -1
  180. package/dist/dashboard/_next/static/chunks/app/context/page-1874ae1050524cb6.js +0 -1
  181. package/dist/dashboard/_next/static/chunks/app/doctor/page-d542f2ab8d6a1c59.js +0 -1
  182. package/dist/dashboard/_next/static/chunks/app/executions/page-9c836597c951abbb.js +0 -1
  183. package/dist/dashboard/_next/static/chunks/app/graph/page-f0e7e15288791e9c.js +0 -1
  184. package/dist/dashboard/_next/static/chunks/app/knowledge/page-86808abd0d47c026.js +0 -1
  185. package/dist/dashboard/_next/static/chunks/app/layout-4b78776412bd4fee.js +0 -1
  186. package/dist/dashboard/_next/static/chunks/app/memory/page-e05a76b696041097.js +0 -1
  187. package/dist/dashboard/_next/static/chunks/app/page-c3e980fb2621470c.js +0 -1
  188. package/dist/dashboard/_next/static/chunks/app/replay/page-a8a465ed885df0cf.js +0 -1
  189. package/dist/dashboard/_next/static/chunks/app/runs/[id]/page-cc1d5182707fca5b.js +0 -1
  190. package/dist/dashboard/_next/static/chunks/app/runs/page-bbf0a58abd70430c.js +0 -1
  191. package/dist/dashboard/_next/static/chunks/app/settings/page-9602ff45892e7910.js +0 -1
  192. package/dist/dashboard/_next/static/chunks/app/timeline/page-44541ee3e74cee0e.js +0 -1
  193. package/dist/dashboard/_next/static/chunks/app/tool-metrics/page-ece550f2f4328dfe.js +0 -1
  194. package/dist/dashboard/_next/static/chunks/app/workflows/page-228bcb475c39c1ec.js +0 -1
  195. package/dist/dashboard/_next/static/chunks/framework-58c3457e28c4602f.js +0 -1
  196. package/dist/dashboard/_next/static/chunks/main-3175faffdbfc3051.js +0 -1
  197. package/dist/dashboard/_next/static/chunks/main-app-202a5f91ead17fa7.js +0 -1
  198. package/dist/dashboard/_next/static/chunks/pages/_app-58c3f1a8a070bd35.js +0 -1
  199. package/dist/dashboard/_next/static/chunks/pages/_error-312a564ec7e2663f.js +0 -1
  200. package/dist/dashboard/_next/static/chunks/webpack-d6388c5dcd85b0c5.js +0 -1
  201. package/dist/dashboard/_next/static/css/322e14d06135256b.css +0 -31
  202. package/dist/dashboard/_next/static/css/7d4d1db5aa137b5a.css +0 -3
  203. /package/dist/dashboard/_next/static/{TCuEOFM92HCewQsicwfte → vYfa_ZByuhX4CBoOEYkDT}/_ssgManifest.js +0 -0
package/dist/cli.js CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,readdirSync,rmSync,cpSync,lstatSync,writeFileSync as writeFileSync$1,statSync as statSync$1,realpathSync,mkdtempSync,rmdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {randomUUID,createHash,createHmac}from'node:crypto';import {homedir as homedir$1}from'node:os';import {join as join$1,resolve,basename,dirname,relative,sep,isAbsolute,extname}from'node:path';import {fileURLToPath}from'node:url';import {loadPlugins,getPluginInstallRoot,resolveProjectCapabilityProfile,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,readPersistedClaudeHookNode,resolveClaudeHookRuntime,verifyClaudeHookNativeRuntime,redactMcpInventory,readMcpInventory,checkMcpHealth,readCachedMcpHealth,writeRuntimeEndpointState,updateRuntimeEndpointStatus,readRuntimeEndpointState,resolveRuntimeEndpoint,DEFAULT_DEVFLOW_SERVER_PORT,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,createDefaultHostAdapterRegistry,acquireRuntimeHttpCircuit,DevFlowApiClient,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,selectHostAdapter,loadPluginsWithDiagnostics,listRuntimeHttpCircuits,readPluginInstallState,runNpmWithClaudeHookRuntime,persistClaudeHookRuntime,getLocalApiKey,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import Gs,{existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import Hd,{join,dirname as dirname$1}from'path';import {homedir}from'os';import {createRequire}from'module';import So from'@colbymchenry/codegraph';import {createEngines,OnboardingPackBuilder,getProjectContextResult,getMemoryResult,getKnowledgeResult}from'@devflow-tools/context-engine';import {checkbox}from'@inquirer/prompts';import {MemoryGate,inspectEmbeddingModel,prepareEmbeddingModel,runMemoryMaintenance,EmbeddingProvider,MEMORY_MAINTENANCE_ACTIONS}from'@devflow-tools/memory-engine';import {fileURLToPath as fileURLToPath$1}from'url';import _ from'chalk';import {spawn,execSync,execFileSync as execFileSync$1}from'child_process';import {createRequire as createRequire$1,isBuiltin}from'node:module';import {DatabaseSync}from'node:sqlite';import {getGlobalDevFlowDbPath,DevFlowDatabase,openGlobalDevFlowDatabase}from'@devflow-tools/database';import {connect,listAdapters}from'@devflow-tools/adapters';import fc from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {execFileSync,spawnSync}from'node:child_process';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport,createTrialReceipt,aggregateRepeatedTrials,renderRepeatedTrialReport}from'@devflow-tools/benchmark';import {Command}from'commander';var ni=Object.defineProperty;var O=(e,t)=>()=>(e&&(t=e(e=0)),t);var A=(e,t)=>{for(var n in t)ni(e,n,{get:t[n],enumerable:true});};function Ct(){let e=dirname(fileURLToPath(import.meta.url)),t=[join$1(e,"..","plugin-files"),join$1(e,"plugin"),join$1(e,"..","..","dist","plugin-files"),join$1(e,"..","..","..","..","plugins","claude-code")];for(let n of t)if(existsSync$1(join$1(n,".claude-plugin","plugin.json")))return n;throw new Error("Plugin files not found. Run `npm run build` first.")}function Ce(e=homedir$1(),t={}){let n=t.installedPluginsPath??join$1(e,".claude","plugins","installed_plugins.json"),o=t.pluginCachePath??join$1(e,".claude","plugins","cache");for(let i of pi)try{let c=JSON.parse(readFileSync$1(n,"utf-8")).plugins?.[i];if(!Array.isArray(c))continue;for(let l of c){if(!de(l)||typeof l.installPath!="string"||!existsSync$1(l.installPath)||!statSync$1(l.installPath).isDirectory())continue;let u=typeof l.version=="string"?l.version:po(l.installPath);return {root:l.installPath,version:u??null}}}catch{}let r=[];for(let i of ["devflow-local","devflow"]){let a=join$1(o,i,nn);try{for(let c of readdirSync(a,{withFileTypes:!0})){if(!c.isDirectory())continue;let l=join$1(a,c.name);existsSync$1(join$1(l,"skills"))&&r.push({root:l,version:po(l)??c.name,mtimeMs:statSync$1(l).mtimeMs});}}catch{}}r.sort((i,a)=>a.mtimeMs-i.mtimeMs);let s=r[0];return s?{root:s.root,version:s.version}:{root:null,version:null}}function Xe(e,t){let n=hi(join$1(t,"skills"));if(n.size===0)return [];let o=join$1(e,".claude","skills"),r=[],s;try{s=readdirSync(o,{withFileTypes:!0});}catch{return []}for(let i of s){if(!i.isDirectory())continue;let a=join$1(o,i.name,"SKILL.md"),c=vo(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=tn(c.content),d=readFileSync$1(l,"utf-8"),g=tn(d);r.push({skillName:c.name,globalPath:a,pluginPath:l,globalHash:u,pluginHash:g,isKnownDevFlowArtifact:u===g});}return r.sort((i,a)=>i.skillName.localeCompare(a.skillName))}function yo(e,t,n,o=Date.now,r={}){let s=Xe(e,t).filter(c=>c.isKnownDevFlowArtifact||r.includeModified===true);if(s.length===0)return [];let i=join$1(e,".devflow","backups","global-skills",new Date(o()).toISOString().replace(/[:.]/g,"-")),a=[];for(let c of s){if(!existsSync$1(c.globalPath)||!lstatSync(c.globalPath).isFile()||tn(readFileSync$1(c.globalPath,"utf-8"))!==c.globalHash)continue;let l=join$1(i,c.skillName.replaceAll("/","_"),"SKILL.md");mkdirSync$1(dirname(l),{recursive:true});try{renameSync(c.globalPath,l);}catch{continue}try{rmSync(dirname(c.globalPath),{recursive:!1,force:!1});}catch{}a.push({skillName:c.skillName,originalPath:c.globalPath,backupPath:l,hash:c.globalHash,pluginHash:c.pluginHash,contentChanged:!c.isKnownDevFlowArtifact,version:n});}return a.length>0&&writeFileSync$1(join$1(i,"manifest.json"),`${JSON.stringify({version:1,migratedAt:new Date(o()).toISOString(),skills:a},null,2)}
3
- `,"utf-8"),a}function hi(e){let t=new Map,n;try{n=readdirSync(e,{withFileTypes:!0});}catch{return t}for(let o of n){if(!o.isDirectory())continue;let r=join$1(e,o.name,"SKILL.md"),s=vo(r);s&&t.set(s.name,r);}return t}function vo(e){try{if(!lstatSync(e).isFile())return null;let t=readFileSync$1(e,"utf-8"),n=t.match(/^name:\s*([^\s]+)\s*$/m);return n?.[1]?{name:n[1],content:t}:null}catch{return null}}function tn(e){return createHash("sha256").update(e).digest("hex")}function po(e){try{let t=JSON.parse(readFileSync$1(join$1(e,"package.json"),"utf-8"));return typeof t.version=="string"?t.version:null}catch{return null}}function ko(e){let t={};if(existsSync$1(e))try{t=JSON.parse(readFileSync$1(e,"utf-8"));}catch{console.warn("Warning: Could not parse settings.json, skipping plugin enablement");return}else mkdirSync$1(dirname(e),{recursive:true});let n=de(t.enabledPlugins)?t.enabledPlugins:{};n[St]=true,t.enabledPlugins=n;let o=join$1(dirname(e),"plugins","marketplaces",He),r=de(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};r[He]={source:{source:"directory",path:o}},t.extraKnownMarketplaces=r,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
4
- `);}function wo(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 Dt(e,t,n){let o=join$1(t,He,nn,n);rmSync(o,{recursive:true,force:true}),mkdirSync$1(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&Et(r,join$1(o,"hooks"));for(let c of ["CLAUDE.md","package.json"]){let l=join$1(e,c);existsSync$1(l)&&cpSync(l,join$1(o,c),{force:true});}let s=join$1(e,".claude-plugin","plugin.json");existsSync$1(s)&&(mkdirSync$1(join$1(o,".claude-plugin"),{recursive:true}),cpSync(s,join$1(o,".claude-plugin","plugin.json"),{force:true}));let i=join$1(e,"dist");existsSync$1(i)&&Et(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&Et(a,join$1(o,"skills")),ki(o,e),wi(o),yi(t,o),vi(t,o,n);}function yi(e,t){let n=join$1(e,".."),o=join$1(n,"marketplaces",He),r=join$1(o,".claude-plugin");mkdirSync$1(r,{recursive:true});let s=relative(o,t).replaceAll("\\","/");s.startsWith(".")||(s=`./${s}`),writeFileSync$1(join$1(r,"marketplace.json"),`${JSON.stringify({name:He,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:nn,source:s}]},null,2)}
2
+ import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,readdirSync,rmSync,cpSync,lstatSync,writeFileSync as writeFileSync$1,statSync as statSync$1,realpathSync,mkdtempSync,rmdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {randomUUID,createHash,createHmac}from'node:crypto';import {homedir as homedir$1}from'node:os';import {join as join$1,resolve,basename,dirname,relative,sep,isAbsolute,extname}from'node:path';import {fileURLToPath}from'node:url';import {loadPlugins,getPluginInstallRoot,resolveProjectCapabilityProfile,stableRuntimeHash,readPersistedClaudeHookNode,resolveClaudeHookRuntime,verifyClaudeHookNativeRuntime,redactMcpInventory,readMcpInventory,checkMcpHealth,readCachedMcpHealth,writeRuntimeEndpointState,updateRuntimeEndpointStatus,readRuntimeEndpointState,resolveRuntimeEndpoint,DEFAULT_DEVFLOW_SERVER_PORT,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,createDefaultHostAdapterRegistry,acquireRuntimeHttpCircuit,DevFlowApiClient,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,resolveStableProjectIdentity,selectHostAdapter,loadPluginsWithDiagnostics,listRuntimeHttpCircuits,getProjectHash,getDaemonSocketPath,getDaemonRegistryPath,getDevFlowStateRoot,getProjectStateDir,readPluginInstallState,runNpmWithClaudeHookRuntime,persistClaudeHookRuntime,getLocalApiKey,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import Zs,{existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import Kd,{join,dirname as dirname$1}from'path';import {homedir}from'os';import {createRequire}from'module';import Eo from'@colbymchenry/codegraph';import {OnboardingPackBuilder}from'@devflow-tools/context-engine';import {createEngines}from'@devflow-tools/mcp-server/composition';import {checkbox}from'@inquirer/prompts';import {MemoryGate,inspectEmbeddingModel,prepareEmbeddingModel,runMemoryMaintenance,EmbeddingProvider,MEMORY_MAINTENANCE_ACTIONS}from'@devflow-tools/memory-engine';import {fileURLToPath as fileURLToPath$1}from'url';import _ from'chalk';import {spawn,execSync,execFileSync as execFileSync$1}from'child_process';import {createRequire as createRequire$1,isBuiltin}from'node:module';import {DatabaseSync}from'node:sqlite';import {getGlobalDevFlowDbPath,DevFlowDatabase,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,openGlobalDevFlowDatabase}from'@devflow-tools/database';import {connect,listAdapters}from'@devflow-tools/adapters';import {projectDiagnosticCodeResult,getDiagnosticMemoryResult,getDiagnosticKnowledgeResult}from'@devflow-tools/mcp-server/retrieval';import hc from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {execFileSync,spawnSync}from'node:child_process';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport,createTrialReceipt,aggregateRepeatedTrials,renderRepeatedTrialReport}from'@devflow-tools/benchmark';import {Command}from'commander';var ri=Object.defineProperty;var $=(e,t)=>()=>(e&&(t=e(e=0)),t);var A=(e,t)=>{for(var n in t)ri(e,n,{get:t[n],enumerable:true});};function Dt(){let e=dirname(fileURLToPath(import.meta.url)),t=[join$1(e,"..","plugin-files"),join$1(e,"plugin"),join$1(e,"..","..","dist","plugin-files"),join$1(e,"..","..","..","..","plugins","claude-code")];for(let n of t)if(existsSync$1(join$1(n,".claude-plugin","plugin.json")))return n;throw new Error("Plugin files not found. Run `npm run build` first.")}function Ce(e=homedir$1(),t={}){let n=t.installedPluginsPath??join$1(e,".claude","plugins","installed_plugins.json"),o=t.pluginCachePath??join$1(e,".claude","plugins","cache");for(let i of yi)try{let c=JSON.parse(readFileSync$1(n,"utf-8")).plugins?.[i];if(!Array.isArray(c))continue;for(let l of c){if(!de(l)||typeof l.installPath!="string"||!existsSync$1(l.installPath)||!statSync$1(l.installPath).isDirectory())continue;let u=typeof l.version=="string"?l.version:ho(l.installPath);return {root:l.installPath,version:u??null}}}catch{}let r=[];for(let i of ["devflow-local","devflow"]){let a=join$1(o,i,tn);try{for(let c of readdirSync(a,{withFileTypes:!0})){if(!c.isDirectory())continue;let l=join$1(a,c.name);existsSync$1(join$1(l,"skills"))&&r.push({root:l,version:ho(l)??c.name,mtimeMs:statSync$1(l).mtimeMs});}}catch{}}r.sort((i,a)=>a.mtimeMs-i.mtimeMs);let s=r[0];return s?{root:s.root,version:s.version}:{root:null,version:null}}function et(e,t){let n=vi(join$1(t,"skills"));if(n.size===0)return [];let o=join$1(e,".claude","skills"),r=[],s;try{s=readdirSync(o,{withFileTypes:!0});}catch{return []}for(let i of s){if(!i.isDirectory())continue;let a=join$1(o,i.name,"SKILL.md"),c=ko(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=en(c.content),g=readFileSync$1(l,"utf-8"),d=en(g);r.push({skillName:c.name,globalPath:a,pluginPath:l,globalHash:u,pluginHash:d,isKnownDevFlowArtifact:u===d});}return r.sort((i,a)=>i.skillName.localeCompare(a.skillName))}function vo(e,t,n,o=Date.now,r={}){let s=et(e,t).filter(c=>c.isKnownDevFlowArtifact||r.includeModified===true);if(s.length===0)return [];let i=join$1(e,".devflow","backups","global-skills",new Date(o()).toISOString().replace(/[:.]/g,"-")),a=[];for(let c of s){if(!existsSync$1(c.globalPath)||!lstatSync(c.globalPath).isFile()||en(readFileSync$1(c.globalPath,"utf-8"))!==c.globalHash)continue;let l=join$1(i,c.skillName.replaceAll("/","_"),"SKILL.md");mkdirSync$1(dirname(l),{recursive:true});try{renameSync(c.globalPath,l);}catch{continue}try{rmSync(dirname(c.globalPath),{recursive:!1,force:!1});}catch{}a.push({skillName:c.skillName,originalPath:c.globalPath,backupPath:l,hash:c.globalHash,pluginHash:c.pluginHash,contentChanged:!c.isKnownDevFlowArtifact,version:n});}return a.length>0&&writeFileSync$1(join$1(i,"manifest.json"),`${JSON.stringify({version:1,migratedAt:new Date(o()).toISOString(),skills:a},null,2)}
3
+ `,"utf-8"),a}function vi(e){let t=new Map,n;try{n=readdirSync(e,{withFileTypes:!0});}catch{return t}for(let o of n){if(!o.isDirectory())continue;let r=join$1(e,o.name,"SKILL.md"),s=ko(r);s&&t.set(s.name,r);}return t}function ko(e){try{if(!lstatSync(e).isFile())return null;let t=readFileSync$1(e,"utf-8"),n=t.match(/^name:\s*([^\s]+)\s*$/m);return n?.[1]?{name:n[1],content:t}:null}catch{return null}}function en(e){return createHash("sha256").update(e).digest("hex")}function ho(e){try{let t=JSON.parse(readFileSync$1(join$1(e,"package.json"),"utf-8"));return typeof t.version=="string"?t.version:null}catch{return null}}function wo(e){let t={};if(existsSync$1(e))try{t=JSON.parse(readFileSync$1(e,"utf-8"));}catch{console.warn("Warning: Could not parse settings.json, skipping plugin enablement");return}else mkdirSync$1(dirname(e),{recursive:true});let n=de(t.enabledPlugins)?t.enabledPlugins:{};n[Et]=true,t.enabledPlugins=n;let o=join$1(dirname(e),"plugins","marketplaces",He),r=de(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};r[He]={source:{source:"directory",path:o}},t.extraKnownMarketplaces=r,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
4
+ `);}function bo(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 Ot(e,t,n){let o=join$1(t,He,tn,n);rmSync(o,{recursive:true,force:true}),mkdirSync$1(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&Rt(r,join$1(o,"hooks"));for(let c of ["CLAUDE.md","package.json"]){let l=join$1(e,c);existsSync$1(l)&&cpSync(l,join$1(o,c),{force:true});}let s=join$1(e,".claude-plugin","plugin.json");existsSync$1(s)&&(mkdirSync$1(join$1(o,".claude-plugin"),{recursive:true}),cpSync(s,join$1(o,".claude-plugin","plugin.json"),{force:true}));let i=join$1(e,"dist");existsSync$1(i)&&Rt(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&Rt(a,join$1(o,"skills")),bi(o,e),_i(o),ki(t,o),wi(t,o,n);}function ki(e,t){let n=join$1(e,".."),o=join$1(n,"marketplaces",He),r=join$1(o,".claude-plugin");mkdirSync$1(r,{recursive:true});let s=relative(o,t).replaceAll("\\","/");s.startsWith(".")||(s=`./${s}`),writeFileSync$1(join$1(r,"marketplace.json"),`${JSON.stringify({name:He,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:tn,source:s}]},null,2)}
5
5
  `);let i=join$1(n,"known_marketplaces.json"),a={};if(existsSync$1(i)){let c;try{c=JSON.parse(readFileSync$1(i,"utf-8"));}catch{throw new Error(`Could not parse Claude marketplace registry: ${i}`)}if(!de(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[He]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
6
- `);}function vi(e,t,n){let o=join$1(e,"..","installed_plugins.json"),r={version:2,plugins:{}};if(existsSync$1(o)){let f;try{f=JSON.parse(readFileSync$1(o,"utf-8"));}catch{throw new Error(`Could not parse Claude plugin registry: ${o}`)}if(!de(f))throw new Error(`Invalid Claude plugin registry: ${o}`);r=f;}else mkdirSync$1(dirname(o),{recursive:true});let s=r.plugins;if(s!==void 0&&!de(s))throw new Error(`Invalid Claude plugin registry plugins: ${o}`);let i=s??{},a=i[St];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${St}`);let c=a??[],l=c.find(f=>de(f)&&f.scope==="user"),u=new Date().toISOString(),d=de(l)&&typeof l.installedAt=="string"?l.installedAt:u,g=c.filter(f=>!de(f)||f.scope!=="user");i[St]=[...g,{scope:"user",installPath:t,version:n,installedAt:d,lastUpdated:u}],r.version=2,r.plugins=i,writeFileSync$1(o,`${JSON.stringify(r,null,2)}
7
- `);}function de(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ki(e,t){let n=join$1(e,"package.json");if(!existsSync$1(n))return;let o=JSON.parse(readFileSync$1(n,"utf-8")),r=Object.keys(o.dependencies??{});if(r.length===0)return;let s={...process.env};delete s.npm_config_allow_scripts,delete s.NPM_CONFIG_ALLOW_SCRIPTS;let i=r.filter(u=>u.startsWith("@devflow-tools/")),a=i.map(u=>join$1(t,"../../packages",u.slice(15))).filter(u=>existsSync$1(join$1(u,"package.json"))),c=["install","--omit=dev","--no-audit","--no-fund","--package-lock=false"];if(i.length>0&&a.length===i.length){c.push("--no-save","--install-links",...a);for(let u of i)rmSync(join$1(e,"node_modules",...u.split("/")),{recursive:true,force:true});}let l=resolveClaudeHookRuntime();runNpmWithClaudeHookRuntime(l,c,{cwd:e,env:s,stdio:"inherit",timeout:1800*1e3}),verifyClaudeHookNativeRuntime(e,l),persistClaudeHookRuntime(e,l);}function Et(e,t){mkdirSync$1(t,{recursive:true});for(let n of readdirSync(e)){let o=join$1(e,n),r=join$1(t,n);statSync$1(o).isDirectory()?Et(o,r):cpSync(o,r,{force:true});}}function wi(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 St,He,nn,pi,Be=O(()=>{St="devflow@devflow-local",He="devflow-local",nn="devflow",pi=["devflow@devflow-local","devflow@devflow"];});var Po={};A(Po,{initProject:()=>Ci,renderInitReport:()=>Ro});async function Ci(e,t={}){let n=join(e,".devflow"),o=[];existsSync(n)||(mkdirSync(n,{recursive:true}),o.push(".devflow/"));let r=join(n,"config.json");(!existsSync(r)||t.force)&&(writeFileSync(r,JSON.stringify({version:"0.1.0",initialized:new Date().toISOString()},null,2),"utf-8"),o.push(".devflow/config.json"));let s={created:o,pluginDeployed:false,pluginEnabled:false,mcpConfigured:false,migratedLegacySkills:[]};if(Eo.isInitialized(e)||await Eo.init(e,{index:t.scan!==false}),t.scan!==false)try{let{indexer:i,graph:a}=await createEngines(e),{files:c,symbols:l,imports:u}=await i.indexAll(e),d=await a.build(l,u);s.indexed={files:c.length,symbols:l.length,graphNodes:d.nodes.length};}catch{s.indexed={files:0,symbols:0,graphNodes:0};}if(t.scan!==false)try{let i=await new OnboardingPackBuilder().build(e);o.push(".devflow/onboarding-pack.json");let a=join(n,"init-report.md");writeFileSync(a,Ro(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=Ct(),a=homedir(),c=join(a,".claude","plugins","cache"),l=join(i,"package.json"),u=existsSync(l)?JSON.parse(readFileSync(l,"utf-8")).version:"0.0.0";Dt(i,c,u),s.pluginDeployed=!0;let d=join(c,"devflow-local","devflow",u);try{s.migratedLegacySkills=yo(a,d,u,Date.now,{includeModified:t.migrateLegacySkills}).map(g=>g.skillName);}catch(g){console.warn(`Warning: Legacy skill migration skipped \u2014 ${g.message}`);}}catch(i){console.warn(`Warning: Plugin deployment skipped \u2014 ${i.message}`);}try{let i=homedir(),a=join(i,".claude","settings.json");ko(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=Pi.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}wo(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function Ro(e){return [`# ${e.projectName} \u2014 DevFlow Onboarding Report`,`Generated: ${e.createdAt}`,"","## Project Stats",`- Files: ${e.stats.files}`,`- Symbols: ${e.stats.symbols}`,`- Graph Nodes: ${e.stats.graphNodes}`,"","## Tech Stack",`- Languages: ${e.stack.languages.join(", ")||"unknown"}`,`- Frameworks: ${e.stack.frameworks.join(", ")||"none detected"}`,`- Build Tools: ${e.stack.buildTools.join(", ")||"none detected"}`,`- Test Tools: ${e.stack.testTools.join(", ")||"none detected"}`,"","## Architecture Layers",...e.architectureLayers.map(n=>`- **${n.name}**: ${n.files} files`),"","## Key Modules",...e.keyModules.slice(0,10).map(n=>`- \`${n.name}\` \u2014 ${n.reason}`),"","## Key Symbols",...e.keySymbols.slice(0,20).map(n=>`- \`${n.name}\` (${n.kind}) in \`${n.file}\``),"","## Recommended Next Steps",...e.recommendedPlugins.map(n=>`- Install plugin: \`${n}\``),...e.recommendedWorkflows.map(n=>`- Run workflow: \`devflow workflow ${n}\``),`- Try: \`devflow context "${e.recommendedQueries[0]??"\u9879\u76EE\u67B6\u6784"}"\``].join(`
8
- `)}var Eo,Pi,Co=O(()=>{Be();Eo=So.default??So,Pi=createRequire(import.meta.url);});var Do={};A(Do,{reviewPluginMemoryHints:()=>Ai});async function Ai(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(xi).filter(Boolean));if(!o||r.size===0)return {available:0,selected:0};let s=await(n.load??loadPlugins)(),i=[];for(let u of r){let d=s.get(u);for(let g of d?.memory?.project?.conventions??[])i.push({id:`${u}:${g.key}`,pluginName:u,convention:g});}if(i.length===0)return {available:0,selected:0};let a=i.map(u=>({name:`${u.pluginName}: ${u.convention.value}`,value:u.id,checked:false})),c=await(n.select??(u=>checkbox({message:"Select optional plugin memory hints to save",choices:u})))(a),l=i.filter(u=>c.includes(u.id));return l.length>0&&await(n.write??Ni)(e,l),{available:i.length,selected:l.length}}function xi(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function Ni(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 Oo=O(()=>{});function Oe(){let e=[join(process.cwd(),"plugin-registry.json"),join(Fi,"../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 $o(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var Li,Fi,Ot=O(()=>{Li=fileURLToPath$1(import.meta.url),Fi=dirname$1(Li);});async function x(e,t,n,o={}){let r=o.serverUrl??resolveRuntimeEndpoint().url,s=zi(r);if(o.skipServer)return n();let i=false,a=xo.get(r);if(a&&Date.now()-a.ts<Ji?i=a.result:acquireRuntimeHttpCircuit(r,"/api/health").allowed&&(i=await new DevFlowApiClient({baseUrl:r,projectRoot:e,apiKey:s}).ping(),i?registerRuntimeHttpSuccess(r,"/api/health"):registerRuntimeHttpFailure(r,"/api/health","cli_local_engine_fallback"),xo.set(r,{result:i,ts:Date.now()})),i){let c=new DevFlowApiClient({baseUrl:r,projectRoot:e,apiKey:s});return t(c)}return console.error(_.dim(" (server not running, using local engine \u2014 telemetry disabled)")),n()}function zi(e){let t=process.env.DEVFLOW_API_KEY?.trim();if(t)return t;try{let n=new URL(e).hostname.toLocaleLowerCase("en-US");if(n==="localhost"||n==="127.0.0.1"||n==="::1"||n==="[::1]")return getLocalApiKey()}catch{}}var xo,Ji,we=O(()=>{xo=new Map,Ji=3e4;});var jo=O(()=>{});var tt={};A(tt,{installSkill:()=>$e,listSkills:()=>Ho,listSkillsSync:()=>Xi,searchSkills:()=>ea,uninstallSkill:()=>ln});async function Ho(e){return x(process.cwd(),async t=>(await t.listPlugins()).map(o=>({name:o.name,version:o.version,description:o.description,icon:o.icon,tags:o.tags??[],installed:true})),async()=>{let t=await loadPlugins();return Array.from(t.values()).map(n=>({name:n.meta.name,version:n.meta.version,description:n.meta.description,icon:n.meta.icon,tags:n.meta.tags,installed:true}))},{skipServer:true})}function Xi(){return []}async function ea(e,t){let n=await Ho(),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=e.trim().replace(/^@devflow-tools\/(?:plugin-)?/,"");if(!/^[a-z0-9-]+$/.test(t))throw new Error(`Invalid plugin name: ${e}`);return `@devflow-tools/plugin-${t}`}function Uo(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function Bo(e,t){let n=join(e,".devflow","config.json");mkdirSync(join(e,".devflow"),{recursive:true});let o=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync(o,`${JSON.stringify(t,null,2)}
9
- `,"utf-8"),renameSync$1(o,n);}async function $e(e,t=process.cwd(),n){return x(t,async o=>await o.installPlugin(e),async()=>{let o=Wo(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(et,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync$1("npm",["install","--prefix",et,o],{stdio:"pipe",timeout:6e4});let a=Uo(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),Bo(t,a));let c=[],l="0.0.0",u=join(et,"node_modules",...o.split("/"));try{let d=JSON.parse(readFileSync(join(u,"package.json"),"utf-8"));c=d?.devflow?.templates??[],l=typeof d.version=="string"?d.version:l;}catch{throw new Error(`Installed plugin metadata is unreadable: ${u}`)}if(upsertPluginInstallRecord({packageName:o,pluginName:r,version:l,installPath:u,source:"npm",installedAt:i?.installedAt??new Date().toISOString(),updatedAt:new Date().toISOString(),projects:[...new Set([...i?.projects??[],t])]}),!i||i.version!==l)try{let d=extractPlugin(await importPluginModule({packageName:o,modulePath:u,source:"npm",installPath:u}),o);if(d){let g={projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}};i&&d.onUpdate?await d.onUpdate(g,i.version):!i&&d.onInstall&&await d.onInstall(g);}}catch(d){let f=readPluginInstallState().plugins[o];throw f&&(f.lastLoad={status:"failed",checkedAt:new Date().toISOString(),reason:d.message},upsertPluginInstallRecord(f)),new Error(`Plugin lifecycle failed: ${d.message}`)}return {name:r,version:l,templates:c}},{skipServer:true})}async function ln(e,t=process.cwd(),n){return x(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=Wo(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=Uo(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),Bo(t,s));let a=readPluginInstallState().plugins[o],c=a?.projects.filter(l=>l!==t)??[];if(a&&c.length===0){let l=existsSync(a.installPath)?extractPlugin(await importPluginModule({packageName:o,modulePath:a.installPath,source:a.source,installPath:a.installPath}),o):null;l?.onUninstall&&await l.onUninstall({projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}});}if(!a||c.length===0)try{execFileSync$1("npm",["uninstall","--prefix",et,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(et,"node_modules",o);existsSync(l)&&rmSync$1(l,{recursive:true,force:true});}a&&(c.length>0?(a.projects=c,upsertPluginInstallRecord(a)):removePluginInstallRecord(o));},{skipServer:true})}var et,be=O(()=>{we();jo();et=getPluginInstallRoot();});var un={};A(un,{detectTechStack:()=>na,guidePluginInstallation:()=>ra,installPluginsFromList:()=>oa,resolvePluginName:()=>Ko});function na(e){let t=Oe();return resolveProjectCapabilityProfile(e,{registry:t}).detectedStacks}function Ko(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function oa(e){let t=e.split(",").map(Ko).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await $e(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function ra(e){let t=Oe();if(t.plugins.length===0)return console.log(`
6
+ `);}function wi(e,t,n){let o=join$1(e,"..","installed_plugins.json"),r={version:2,plugins:{}};if(existsSync$1(o)){let m;try{m=JSON.parse(readFileSync$1(o,"utf-8"));}catch{throw new Error(`Could not parse Claude plugin registry: ${o}`)}if(!de(m))throw new Error(`Invalid Claude plugin registry: ${o}`);r=m;}else mkdirSync$1(dirname(o),{recursive:true});let s=r.plugins;if(s!==void 0&&!de(s))throw new Error(`Invalid Claude plugin registry plugins: ${o}`);let i=s??{},a=i[Et];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${Et}`);let c=a??[],l=c.find(m=>de(m)&&m.scope==="user"),u=new Date().toISOString(),g=de(l)&&typeof l.installedAt=="string"?l.installedAt:u,d=c.filter(m=>!de(m)||m.scope!=="user");i[Et]=[...d,{scope:"user",installPath:t,version:n,installedAt:g,lastUpdated:u}],r.version=2,r.plugins=i,writeFileSync$1(o,`${JSON.stringify(r,null,2)}
7
+ `);}function de(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function bi(e,t){let n=join$1(e,"package.json");if(!existsSync$1(n))return;let o=JSON.parse(readFileSync$1(n,"utf-8")),r=Object.keys(o.dependencies??{});if(r.length===0)return;let s={...process.env};delete s.npm_config_allow_scripts,delete s.NPM_CONFIG_ALLOW_SCRIPTS;let i=r.filter(u=>u.startsWith("@devflow-tools/")),a=i.map(u=>join$1(t,"../../packages",u.slice(15))).filter(u=>existsSync$1(join$1(u,"package.json"))),c=["install","--omit=dev","--no-audit","--no-fund","--package-lock=false"];if(i.length>0&&a.length===i.length){c.push("--no-save","--install-links",...a);for(let u of i)rmSync(join$1(e,"node_modules",...u.split("/")),{recursive:true,force:true});}let l=resolveClaudeHookRuntime();runNpmWithClaudeHookRuntime(l,c,{cwd:e,env:s,stdio:"inherit",timeout:1800*1e3}),verifyClaudeHookNativeRuntime(e,l),persistClaudeHookRuntime(e,l);}function Rt(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()?Rt(o,r):cpSync(o,r,{force:true});}}function _i(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 Et,He,tn,yi,qe=$(()=>{Et="devflow@devflow-local",He="devflow-local",tn="devflow",yi=["devflow@devflow-local","devflow@devflow"];});var Co={};A(Co,{initProject:()=>Oi,renderInitReport:()=>Po});async function Oi(e,t={}){let n=join(e,".devflow"),o=[];existsSync(n)||(mkdirSync(n,{recursive:true}),o.push(".devflow/"));let r=join(n,"config.json");(!existsSync(r)||t.force)&&(writeFileSync(r,JSON.stringify({version:"0.1.0",initialized:new Date().toISOString()},null,2),"utf-8"),o.push(".devflow/config.json"));let s={created:o,pluginDeployed:false,pluginEnabled:false,mcpConfigured:false,migratedLegacySkills:[]};if(Ro.isInitialized(e)||await Ro.init(e,{index:t.scan!==false}),t.scan!==false)try{let{indexer:i,graph:a}=await createEngines(e),{files:c,symbols:l,imports:u}=await i.indexAll(e),g=await a.build(l,u);s.indexed={files:c.length,symbols:l.length,graphNodes:g.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,Po(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=Dt(),a=homedir(),c=join(a,".claude","plugins","cache"),l=join(i,"package.json"),u=existsSync(l)?JSON.parse(readFileSync(l,"utf-8")).version:"0.0.0";Ot(i,c,u),s.pluginDeployed=!0;let g=join(c,"devflow-local","devflow",u);try{s.migratedLegacySkills=vo(a,g,u,Date.now,{includeModified:t.migrateLegacySkills}).map(d=>d.skillName);}catch(d){console.warn(`Warning: Legacy skill migration skipped \u2014 ${d.message}`);}}catch(i){console.warn(`Warning: Plugin deployment skipped \u2014 ${i.message}`);}try{let i=homedir(),a=join(i,".claude","settings.json");wo(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=Di.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}bo(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function Po(e){return [`# ${e.projectName} \u2014 DevFlow Onboarding Report`,`Generated: ${e.createdAt}`,"","## Project Stats",`- Files: ${e.stats.files}`,`- Symbols: ${e.stats.symbols}`,`- Graph Nodes: ${e.stats.graphNodes}`,"","## Tech Stack",`- Languages: ${e.stack.languages.join(", ")||"unknown"}`,`- Frameworks: ${e.stack.frameworks.join(", ")||"none detected"}`,`- Build Tools: ${e.stack.buildTools.join(", ")||"none detected"}`,`- Test Tools: ${e.stack.testTools.join(", ")||"none detected"}`,"","## Architecture Layers",...e.architectureLayers.map(n=>`- **${n.name}**: ${n.files} files`),"","## Key Modules",...e.keyModules.slice(0,10).map(n=>`- \`${n.name}\` \u2014 ${n.reason}`),"","## Key Symbols",...e.keySymbols.slice(0,20).map(n=>`- \`${n.name}\` (${n.kind}) in \`${n.file}\``),"","## Recommended Next Steps",...e.recommendedPlugins.map(n=>`- Install plugin: \`${n}\``),...e.recommendedWorkflows.map(n=>`- Run workflow: \`devflow workflow ${n}\``),`- Try: \`devflow context "${e.recommendedQueries[0]??"\u9879\u76EE\u67B6\u6784"}"\``].join(`
8
+ `)}var Ro,Di,Do=$(()=>{qe();Ro=Eo.default??Eo,Di=createRequire(import.meta.url);});var Oo={};A(Oo,{reviewPluginMemoryHints:()=>Ni});async function Ni(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(ji).filter(Boolean));if(!o||r.size===0)return {available:0,selected:0};let s=await(n.load??loadPlugins)(),i=[];for(let u of r){let g=s.get(u);for(let d of g?.memory?.project?.conventions??[])i.push({id:`${u}:${d.key}`,pluginName:u,convention:d});}if(i.length===0)return {available:0,selected:0};let a=i.map(u=>({name:`${u.pluginName}: ${u.convention.value}`,value:u.id,checked:false})),c=await(n.select??(u=>checkbox({message:"Select optional plugin memory hints to save",choices:u})))(a),l=i.filter(u=>c.includes(u.id));return l.length>0&&await(n.write??Ti)(e,l),{available:i.length,selected:l.length}}function ji(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function Ti(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}`},{actorId:"actor:devflow-cli",sessionId:"session:plugin-memory-hints"});}finally{n.close();}}var $o=$(()=>{});function Oe(){let e=[join(process.cwd(),"plugin-registry.json"),join(Wi,"../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 Ao(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var Hi,Wi,$t=$(()=>{Hi=fileURLToPath$1(import.meta.url),Wi=dirname$1(Hi);});async function j(e,t,n,o={}){let r=o.serverUrl??resolveRuntimeEndpoint().url,s=Gi(r);if(o.skipServer)return n();let i=false,a=No.get(r);if(a&&Date.now()-a.ts<Vi?i=a.result:acquireRuntimeHttpCircuit(r,"/api/health").allowed&&(i=await new DevFlowApiClient({baseUrl:r,projectRoot:e,apiKey:s}).ping(),i?registerRuntimeHttpSuccess(r,"/api/health"):registerRuntimeHttpFailure(r,"/api/health","cli_local_engine_fallback"),No.set(r,{result:i,ts:Date.now()})),i){let c=new DevFlowApiClient({baseUrl:r,projectRoot:e,apiKey:s});return t(c)}return console.error(_.dim(" (server not running, using local engine \u2014 telemetry disabled)")),n()}function Gi(e){let t=process.env.DEVFLOW_API_KEY?.trim();if(t)return t;try{let n=new URL(e).hostname.toLocaleLowerCase("en-US");if(n==="localhost"||n==="127.0.0.1"||n==="::1"||n==="[::1]")return getLocalApiKey()}catch{}}var No,Vi,we=$(()=>{No=new Map,Vi=3e4;});var To=$(()=>{});var nt={};A(nt,{installSkill:()=>$e,listSkills:()=>Wo,listSkillsSync:()=>ta,searchSkills:()=>na,uninstallSkill:()=>cn});async function Wo(e){return j(process.cwd(),async t=>(await t.listPlugins()).map(o=>({name:o.name,version:o.version,description:o.description,icon:o.icon,tags:o.tags??[],installed:true})),async()=>{let t=await loadPlugins();return Array.from(t.values()).map(n=>({name:n.meta.name,version:n.meta.version,description:n.meta.description,icon:n.meta.icon,tags:n.meta.tags,installed:true}))},{skipServer:true})}function ta(){return []}async function na(e,t){let n=await Wo(),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 Uo(e){let t=e.trim().replace(/^@devflow-tools\/(?:plugin-)?/,"");if(!/^[a-z0-9-]+$/.test(t))throw new Error(`Invalid plugin name: ${e}`);return `@devflow-tools/plugin-${t}`}function qo(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function Bo(e,t){let n=join(e,".devflow","config.json");mkdirSync(join(e,".devflow"),{recursive:true});let o=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync(o,`${JSON.stringify(t,null,2)}
9
+ `,"utf-8"),renameSync$1(o,n);}async function $e(e,t=process.cwd(),n){return j(t,async o=>await o.installPlugin(e),async()=>{let o=Uo(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(tt,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync$1("npm",["install","--prefix",tt,o],{stdio:"pipe",timeout:6e4});let a=qo(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),Bo(t,a));let c=[],l="0.0.0",u=join(tt,"node_modules",...o.split("/"));try{let g=JSON.parse(readFileSync(join(u,"package.json"),"utf-8"));c=g?.devflow?.templates??[],l=typeof g.version=="string"?g.version:l;}catch{throw new Error(`Installed plugin metadata is unreadable: ${u}`)}if(upsertPluginInstallRecord({packageName:o,pluginName:r,version:l,installPath:u,source:"npm",installedAt:i?.installedAt??new Date().toISOString(),updatedAt:new Date().toISOString(),projects:[...new Set([...i?.projects??[],t])]}),!i||i.version!==l)try{let g=extractPlugin(await importPluginModule({packageName:o,modulePath:u,source:"npm",installPath:u}),o);if(g){let d={projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}};i&&g.onUpdate?await g.onUpdate(d,i.version):!i&&g.onInstall&&await g.onInstall(d);}}catch(g){let m=readPluginInstallState().plugins[o];throw m&&(m.lastLoad={status:"failed",checkedAt:new Date().toISOString(),reason:g.message},upsertPluginInstallRecord(m)),new Error(`Plugin lifecycle failed: ${g.message}`)}return {name:r,version:l,templates:c}},{skipServer:true})}async function cn(e,t=process.cwd(),n){return j(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=Uo(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=qo(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),Bo(t,s));let a=readPluginInstallState().plugins[o],c=a?.projects.filter(l=>l!==t)??[];if(a&&c.length===0){let l=existsSync(a.installPath)?extractPlugin(await importPluginModule({packageName:o,modulePath:a.installPath,source:a.source,installPath:a.installPath}),o):null;l?.onUninstall&&await l.onUninstall({projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}});}if(!a||c.length===0)try{execFileSync$1("npm",["uninstall","--prefix",tt,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(tt,"node_modules",o);existsSync(l)&&rmSync$1(l,{recursive:true,force:true});}a&&(c.length>0?(a.projects=c,upsertPluginInstallRecord(a)):removePluginInstallRecord(o));},{skipServer:true})}var tt,be=$(()=>{we();To();tt=getPluginInstallRoot();});var ln={};A(ln,{detectTechStack:()=>ra,guidePluginInstallation:()=>ia,installPluginsFromList:()=>sa,resolvePluginName:()=>Jo});function ra(e){let t=Oe();return resolveProjectCapabilityProfile(e,{registry:t}).detectedStacks}function Jo(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function sa(e){let t=e.split(",").map(Jo).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await $e(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function ia(e){let t=Oe();if(t.plugins.length===0)return console.log(`
10
10
  No plugins available. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
11
11
  `),[];console.log(`
12
12
  \u{1F50C} Plugin Installation Guide
@@ -20,34 +20,34 @@ Installing selected plugins...
20
20
  `);}catch{console.error(`\u2717 Failed to install ${a}
21
21
  `);}}else console.log(`
22
22
  Skipping plugin installation. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
23
- `);return i}var dn=O(()=>{Ot();be();});var nr={};A(nr,{ResetExecutionError:()=>nt,executeResetCommand:()=>Pa,formatResetResult:()=>hn,runReset:()=>tr});function ya(){if($t)return $t;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return $t=e.DatabaseSync,$t}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function hn(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function va(e){return e==="all"||Zo.includes(e)}function ie(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function fn(e){let t=resolve(e),n=[];for(;!ie(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 yn(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function ka(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 Qo(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=ie(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(ie(t)){let o=realpathSync(t);if(!yn(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function wa(e,t){return (e==="all"?Zo:[e]).map(o=>({scope:o,path:join$1(t,...Yo[o])}))}function Xo(e,t){let n=ie(t);if(n)return Qo(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function er(e,t){let n=Xo(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 ba(e){let t=ie(e);if(!t?.isFile()||t.size<gn.length)return false;let n=Buffer.alloc(gn.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(gn)}finally{closeSync(o);}}function _a(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}ba(o)&&t.push(o);}}return n(e),t}function Sa(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(ya())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function Ea(e,t,n){let o=_a(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));Sa(s,i);}}function Ra(e,t,n,o,r){let s=!!ie(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),Ea(c.path,join$1(i,c.scope),()=>er(e,c));for(let c of n){let l=join$1(i,c.scope),u=join$1(t,c.scope);if(ie(u))throw new Error(`Backup destination already exists: ${u}`);r.renamePath(l,u),a.push(u),o.backedUp.push({source:c.path,destination:u});}}catch(c){for(let l of a.reverse())rmSync(l,{recursive:true,force:true});throw new Error(`Failed to prepare reset backup: ${c.message}`)}finally{if(i&&rmSync(i,{recursive:true,force:true}),!s&&ie(t))try{rmdirSync(t);}catch{}}}function tr(e,t={}){if(!va(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=ka(e.project??process.cwd()),o=wa(e.scope,n);for(let c of o)Qo(n,c.path);if(!e.backupTo&&!e.force)throw new Error("Refusing to reset without a backup. Provide --backup-to <dir> or use --force.");let r=o.flatMap(c=>{let l=Xo(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?fn(e.backupTo):void 0;if(s){let c=ie(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let l of r){let u=fn(l.path),d=join$1(s,l.scope),g=fn(d);if(yn(u,g)||yn(g,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${g}`);if(ie(d))throw new Error(`Backup destination already exists: ${d}`)}}let i={backedUp:[],removed:[]},a={beforeBackup:()=>{},beforeRemoval:()=>{},renamePath:(c,l)=>renameSync(c,l),removePath:c=>rmSync(c,{recursive:true,force:true}),...t};s&&r.length>0&&Ra(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),er(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new nt(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function Pa(e,t={},n=console){try{let o=tr(e,t),r=hn(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof nt)for(let r of hn(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var $t,nt,Yo,Zo,gn,or=O(()=>{nt=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Yo={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},Zo=Object.keys(Yo),gn=Buffer.from("SQLite format 3\0","binary");});var gr={};A(gr,{consolidateDatabases:()=>$a,formatConsolidateResult:()=>Aa});function $a(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=[sr("project",o,s?n:void 0),sr("codegraph",r,s?n:void 0)],a={dryRun:!!e.dryRun,targetPath:n,sources:i,inserted:{},retired:[]};if(e.dryRun)return a;let c=i.filter(f=>f.exists&&Object.keys(f.tables).length>0),l=new Date(e.now??Date.now()).toISOString().replace(/[:.]/g,"-"),u=basename(dirname(n))==="global"?join$1(dirname(dirname(n)),"backup"):join$1(dirname(n),"backup"),d=join$1(e.backupRoot??u,l);mkdirSync$1(d,{recursive:true}),a.backupDir=d;let g=c.some(f=>f.kind==="project")?xa(o):null;try{let f=new Map;for(let y of c){let k=join$1(d,`${y.kind}-${basename(y.path)}.snapshot`);ir(y.path,k),f.set(y.kind,k);}s&&ir(n,join$1(d,"global-devflow.db.before"));let p=f.has("project")?ja(o,d):[];a.retired.push(...p.map(y=>y.destination));let m=null,h=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),m=new DatabaseSync(n),m.exec("PRAGMA busy_timeout = 10000"),m.exec(DEVFLOW_SCHEMA_SQL),f.has("project")&&m.prepare("ATTACH DATABASE ? AS project_source").run(f.get("project")),f.has("codegraph")&&m.prepare("ATTACH DATABASE ? AS codegraph_source").run(r),m.exec("BEGIN IMMEDIATE"),h=!0,f.has("project")&&ar(m,"project_source",void 0,a.inserted),f.has("codegraph")){ar(m,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let k of st(m,"codegraph_source").filter(C=>C.startsWith("devflow_")))m.exec(`DROP TABLE codegraph_source.${H(k)}`);}m.exec("COMMIT"),h=!1;}catch(y){if(h)try{m?.exec("ROLLBACK");}catch{}throw dr(p),y}finally{m?.close();}return a}finally{Na(g);}}function Aa(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 sr(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 st(r).filter(c=>!i||i.has(c)))o.tables[a]=bn(r,a),o.conflicts[a]=s&&st(s).includes(a)?Ta(r,s,a):0;}finally{r.close(),s?.close();}return o}function ir(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 xa(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 Na(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function ja(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 dr(n),o}return n}function dr(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function ar(e,t,n,o){let r=new Set(st(e)),s=st(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=xt(e,"main",i),c=new Set(xt(e,t,i).map(p=>p.name)),l=a.filter(p=>c.has(p.name));if(wn.has(i)&&(l=l.filter(p=>p.pk===0)),l.length===0)continue;let u=bn(e,i),d=l.map(p=>H(p.name)).join(", "),g=l.map(p=>`s.${H(p.name)}`).join(", ");if(l.filter(p=>p.pk>0).length>0&&!wn.has(i))e.exec(`INSERT OR IGNORE INTO main.${H(i)} (${d}) SELECT ${g} FROM ${H(t)}.${H(i)} s`);else {let p=l.map(m=>`t.${H(m.name)} IS s.${H(m.name)}`).join(" AND ");e.exec(`
24
- INSERT INTO main.${H(i)} (${d})
25
- SELECT ${g} FROM ${H(t)}.${H(i)} s
26
- WHERE NOT EXISTS (SELECT 1 FROM main.${H(i)} t WHERE ${p})
27
- `);}o[i]=(o[i]??0)+(bn(e,i)-u);}}function Ta(e,t,n){let o=new Set(xt(t,"main",n).map(l=>l.name)),r=xt(e,"main",n).filter(l=>l.pk>0&&o.has(l.name));if(r.length===0||wn.has(n))return 0;let s=r.map(l=>H(l.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${H(n)}`).all(),a=r.map(l=>`${H(l.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${H(n)} WHERE ${a} LIMIT 1`);return i.reduce((l,u)=>l+(c.get(...r.map(d=>u[d.name]))?1:0),0)}function st(e,t="main"){return e.prepare(`SELECT name FROM ${H(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(o=>o.name)}function xt(e,t,n){return e.prepare(`PRAGMA ${H(t)}.table_info(${H(n)})`).all()}function bn(e,t){let n=e.prepare(`SELECT COUNT(*) count FROM ${H(t)}`).get();return Number(n.count)}function H(e){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsafe SQLite identifier: ${e}`);return `"${e}"`}var wn,fr=O(()=>{wn=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var mr={};A(mr,{connectAgent:()=>La,getAvailableAgents:()=>Fa});async function La(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 Fa(){return listAdapters()}var pr=O(()=>{});var yr={};A(yr,{getIndexStatus:()=>Ha,refreshIndex:()=>Wa});async function Ha(e){return x(process.cwd(),t=>t.getIndexStatus(),async()=>{let{codegraph:t}=await createEngines(process.cwd()),n=t.getStats();return {totalFiles:n.fileCount,totalSymbols:n.nodeCount,lastIndexTime:n.lastUpdated,indexing:t.isIndexing()}},{skipServer:e})}async function Wa(e){return x(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var vr=O(()=>{we();});var kr={};A(kr,{getGraph:()=>Ba});async function Ba(e={}){let t=e.target??"all",n=e.depth??2;return x(process.cwd(),o=>o.getGraph(t,n),async()=>{let{graph:o}=await createEngines(process.cwd());if(t==="all")return o.export();let r=o.getSubGraph(t,n);return {nodes:r.nodes,edges:r.edges}},{skipServer:e.skipServer})}var wr=O(()=>{we();});var _n={};A(_n,{getContext:()=>Ka,getTaskContext:()=>Ja});async function Ka(e){return x(process.cwd(),t=>t.buildContext(e.query,e.mode??"fast",e.maxTokens),async()=>{let{context:t}=await createEngines(process.cwd());return t.build({query:e.query,mode:e.mode??"fast",maxTokens:e.maxTokens??8e3})},{skipServer:e.skipServer})}async function Ja(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return x(t,o=>o.buildTaskContext(e.query,t,n),async()=>{let{context:o,codegraph:r}=await createEngines(t),s=r.getStats().lastUpdated,i=s>0?Date.now()-s:0;return getProjectContextResult(o,{query:e.query,...n},i)},{skipServer:e.skipServer})}var Sn=O(()=>{we();});var it={};A(it,{getWorkflowRuns:()=>_r,getWorkflowStatus:()=>Ga,listWorkflows:()=>za,runWorkflow:()=>Va});async function za(e){return x(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function Va(e,t,n){return x(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function Ga(e){return _r(e)}async function _r(e){return x(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var at=O(()=>{we();});var Ve={};A(Ve,{cancelWorker:()=>nc,listWorkers:()=>ec,retryWorkerCleanup:()=>oc,showWorker:()=>tc,workerMergeStatus:()=>rc});function ec(e){return ct(e,t=>ze(e.json,{projectRoot:Je(e.projectRoot),workers:t.listWorkflowWorkers(Je(e.projectRoot))}))}function tc(e,t){return ct(t,n=>{let o=Je(t.projectRoot),r=Nt(n,o,e);return ze(t.json,{worker:r,events:n.listWorkflowWorkerEvents(o,e),merge:n.getWorkflowMergeByWorker(o,e)})})}function nc(e,t){return ct(t,n=>{let o=Je(t.projectRoot),r=Nt(n,o,e);if(["merged","failed","cancelled"].includes(r.state))throw new Error(`Worker ${e} is terminal (${r.state})`);let s=n.transitionWorkflowWorker({projectRoot:o,workerId:e,target:"cancelled",leaseOwner:r.leaseOwner,reason:"operator_cancelled"});return n.enqueueWork({idempotencyKey:`workflow-worker-cleanup:${e}:cancelled`,kind:"workflow.worker_cleanup",projectRoot:o,payload:{workerId:e,reason:"cancelled"}}),ze(t.json,s)})}function oc(e,t){return ct(t,n=>{let o=Je(t.projectRoot),r=Nt(n,o,e);if(!["merged","hold","cancelled","failed"].includes(r.state))throw new Error(`Worker ${e} is not eligible for cleanup retry (${r.state})`);let s=n.enqueueWork({idempotencyKey:`workflow-worker-cleanup:${e}:operator:${Date.now()}`,kind:"workflow.worker_cleanup",projectRoot:o,payload:{workerId:e,registeredPath:r.worktreePath,branch:r.branch,operatorApproved:!0},maxAttempts:10});return ze(t.json,s)})}function rc(e,t){return ct(t,n=>{let o=Je(t.projectRoot);Nt(n,o,e);let r=n.getWorkflowMergeByWorker(o,e);return ze(t.json,r??{workerId:e,state:"not_queued"})})}function Nt(e,t,n){let o=e.getWorkflowWorker(t,n);if(!o)throw new Error(`Worker ${n} was not found in project ${t}`);return o}function Je(e){let t=resolve(e);return existsSync$1(t)?realpathSync(t):t}function ct(e,t){let n=e.database??openGlobalDevFlowDatabase();try{return t(n)}finally{e.database||n.close();}}function ze(e,t){if(e)return JSON.stringify(t,null,2);if(sc(t))return `${t.workerId} ${t.state} ${t.stepId} ${t.host} ${t.worktreePath}`;if(ic(t))return `${t.workerId} ${t.state} ${t.candidateRevision}`;if(t&&typeof t=="object"&&Array.isArray(t.workers)){let n=t.workers;return n.length===0?"No workers.":n.map(o=>ze(false,o)).join(`
28
- `)}return JSON.stringify(t,null,2)}function sc(e){return !!(e&&typeof e=="object"&&"workerId"in e&&"stepId"in e&&"worktreePath"in e)}function ic(e){return !!(e&&typeof e=="object"&&"mergeId"in e&&"candidateRevision"in e)}var Ge=O(()=>{});var Rn={};A(Rn,{getEmbeddingStatus:()=>lc,prepareEmbeddings:()=>uc,renderEmbeddingStatus:()=>dc});async function lc(){return inspectEmbeddingModel()}async function uc(e={}){return prepareEmbeddingModel({endpoints:e.endpoints,timeoutMs:e.timeoutMs})}function dc(e){let t=[`Embedding model: ${e.state}`,` model: ${e.modelId}`,` revision: ${e.revision}`,` cache: ${e.cacheRoot}`];return e.missingFiles.length>0&&t.push(` missing: ${e.missingFiles.join(", ")}`),e.corruptFiles.length>0&&t.push(` corrupt: ${e.corruptFiles.join(", ")}`),t.join(`
29
- `)}var Pn=O(()=>{});var Ae={};A(Ae,{backfillObservationVectors:()=>vc,queryMemory:()=>pc,reviewCandidates:()=>yc,reviewMemories:()=>wc,setMemory:()=>hc,showMemory:()=>mc});async function mc(e,t){let n=await x(process.cwd(),r=>r.getMemory(t),async()=>{let{memory:r}=await createEngines(process.cwd());return r.getAll()},{skipServer:e});if(!t||!n||typeof n!="object")return n;let o=n;return Array.isArray(o.memories)?{...o,memories:o.memories.filter(r=>r?.source===t)}:n}async function pc(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return x(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getMemoryResult(r,o)},{skipServer:n})}async function hc(e,t,n){return x(process.cwd(),async o=>{await o.setMemory("project",e,t);},async()=>{let{memory:o}=await createEngines(process.cwd());await o.updateUserPreference(e,t);},{skipServer:n})}async function yc(e){return x(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function vc(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function kc(e){let t=fc.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function wc(){let t=await x(process.cwd(),async r=>(await r.getMemory()).memories?.filter(i=>i.status==="pending")??[],async()=>{let{memory:r}=await createEngines(process.cwd());return r.getPendingMemories()},{skipServer:false});if(t.length===0){console.log("No pending memories to review.");return}let n=[...t].sort((r,s)=>r.category==="failure_lesson"&&s.category!=="failure_lesson"?-1:s.category==="failure_lesson"&&r.category!=="failure_lesson"?1:0),o=0;for(let r of n){console.log(`
30
- [${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await kc(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await x(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await x(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
31
- Reviewed ${o}/${t.length} pending memories.`);}var xe=O(()=>{we();});var Er={};A(Er,{getDocsStatus:()=>Sc,queryKnowledge:()=>Sr,searchKnowledge:()=>_c,syncDocs:()=>Ec});async function Sr(e,t,n,o){return x(process.cwd(),r=>r.queryKnowledge(e,{scope:t,budgetTokens:n}),()=>{let r=new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider});return getKnowledgeResult(r,{query:e,scope:t,budgetTokens:n})},{skipServer:o})}async function _c(e,t,n){return (await Sr(e,t,void 0,n)).results}async function Sc(e){return x(process.cwd(),t=>t.getKnowledgeSources(),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).getSources(),{skipServer:e})}async function Ec(e,t){return x(process.cwd(),n=>n.syncDocs(e),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).syncDocs(e),{skipServer:t})}var Rr=O(()=>{we();});var $n={};A($n,{backfillKnowledgeVectors:()=>Oc,resyncKnowledgeDocs:()=>Dc});function Pr(e){return new KnowledgeEngine({projectRoot:e,embedder:new EmbeddingProvider})}async function Dc(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=Pr(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Oc(e={}){let t=e.projectRoot??process.cwd(),n=Date.now(),o=Pr(t);On(t,{phase:"started",source:e.source??"all",batchSize:e.batchSize??32});try{let r=await o.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress});return On(t,{phase:"completed",source:e.source??"all",processed:r.processed,remaining:r.remaining},Date.now()-n),r}catch(r){throw On(t,{phase:"failed",source:e.source??"all",errorCategory:$c(r),error:r instanceof Error?r.message.slice(0,500):String(r).slice(0,500),success:false},Date.now()-n),r}finally{o.close();}}function On(e,t,n){try{let o=openGlobalDevFlowDatabase();try{o.insertEvent({kind:"knowledge_vector_backfill",timestamp:Date.now(),duration:n,success:t.success!==!1,metadata:{projectRoot:e,...t}});}finally{o.close();}}catch{}}function $c(e){let t=e instanceof Error?e.message:String(e);return /warmup|model|embedding provider/iu.test(t)?"embedding_provider_unavailable":/dimension|vector|shape/iu.test(t)?"embedding_contract_mismatch":/sqlite|database|locked|busy/iu.test(t)?"storage_unavailable":"unexpected_backfill_failure"}var An=O(()=>{});var Cr={};A(Cr,{inspectSkillHealth:()=>jt,showSkillHealth:()=>Lc});function Ic(e){let t=readFileSync$1(e,"utf8"),n=/^---\r?\n([\s\S]*?)\r?\n---/.exec(t);if(!n)return {};let o={};for(let r of n[1].split(/\r?\n/)){let s=r.indexOf(":");if(s<1)continue;let i=r.slice(0,s).trim(),a=r.slice(s+1).trim();(i==="name"||i==="description")&&(o[i]=a);}return o}function jt(e){let t=e===void 0?Ce(homedir$1()).root:e;if(!t)return {pluginRoot:null,registryVersion:null,skills:0,commands:0,healthy:false,issues:[{category:"missing",reason:"No active DevFlow Claude plugin found"}]};let n=[];Mc(t,n);let o=[join$1(t,"dist","command-registry.json"),join$1(t,"command-registry.json")].find(existsSync$1),r=null,s={};if(!o)n.push({category:"missing",reason:"command-registry.json is missing"});else try{let c=JSON.parse(readFileSync$1(o,"utf8"));r=typeof c.version=="number"?c.version:null,r!==1&&r!==2&&n.push({category:"unsupported",path:o,reason:`unsupported registry version ${String(c.version)}`}),c.commands&&typeof c.commands=="object"?s=c.commands:n.push({category:"malformed",path:o,reason:"commands object is missing"});}catch(c){n.push({category:"malformed",path:o,reason:c.message});}let i=join$1(t,"skills"),a=new Map;if(!existsSync$1(i))n.push({category:"missing",path:i,reason:"skills directory is missing"});else for(let c of readdirSync(i,{withFileTypes:true})){if(!c.isDirectory())continue;let l=join$1(i,c.name,"SKILL.md");if(!existsSync$1(l))continue;let u=Ic(l);if(!u.name||!u.description){n.push({category:"malformed",skill:c.name,path:l,reason:"frontmatter name and description are required"});continue}/^devflow(?::[a-z0-9-]+)?$/.test(u.name)||n.push({category:"unsupported",skill:u.name,path:l,reason:"skill name is outside the canonical DevFlow namespace"});let d=u.name.startsWith("devflow:")?u.name.slice(8):u.name;u.name!==c.name&&d!==c.name&&n.push({category:"stale",skill:u.name,path:l,reason:`directory name ${c.name} does not match frontmatter`});let g=a.get(u.name)??[];g.push(l),a.set(u.name,g);}for(let[c,l]of a)l.length>1&&n.push({category:"duplicate",skill:c,reason:l.join(", ")}),c!=="devflow"&&!s[c]&&!["devflow:doctor","devflow:start"].includes(c)&&n.push({category:"unbound",skill:c,path:l[0],reason:"skill has no command registry entry"});for(let[c,l]of Object.entries(s))if(a.has(c)||n.push({category:"missing",skill:c,reason:"registry command has no installed SKILL.md"}),(!Array.isArray(l.mcpTools)||l.mcpTools.some(u=>typeof u!="string"))&&n.push({category:"malformed",skill:c,reason:"mcpTools must be a string array"}),r===2&&typeof l.skillPath=="string"){let u=join$1(t,l.skillPath),d=join$1(t,l.skillPath.replace(/^skills\/devflow:/,"skills/"));!existsSync$1(u)&&!existsSync$1(d)&&n.push({category:"stale",skill:c,path:l.skillPath,reason:"registry skillPath does not exist"});}return {pluginRoot:t,registryVersion:r,skills:a.size,commands:Object.keys(s).length,issues:n,healthy:n.length===0}}function Mc(e,t){try{if(!JSON.parse(readFileSync$1(join$1(e,"package.json"),"utf8")).dependencies?.["@devflow-tools/memory-engine"])return;let o=readPersistedClaudeHookNode(e);if(!o){t.push({category:"runtime",path:e,reason:"Claude Hook Node identity is missing; redeploy the plugin to bind and verify native dependencies."});return}let r=resolveClaudeHookRuntime({env:{...process.env,DEVFLOW_HOOK_NODE:o}});verifyClaudeHookNativeRuntime(e,r);}catch(n){t.push({category:"runtime",path:e,reason:n instanceof Error?n.message:String(n)});}}function Lc(e={}){let t=jt(e.root);if(e.json)console.log(JSON.stringify(t,null,2));else {console.log(`Skills: ${t.skills}, registry commands: ${t.commands}, version: ${t.registryVersion??"missing"}`);for(let n of t.issues)console.log(`${n.category.toUpperCase()} ${n.skill??"runtime"}: ${n.reason}`);}return t.healthy?0:1}var Nn=O(()=>{Be();});var jn={};A(jn,{showMcpHealth:()=>qc,showMcpInventory:()=>Bc});async function Bc(e={}){let t=redactMcpInventory(readMcpInventory(e.project??process.cwd()));if(e.json){console.log(JSON.stringify(t,null,2));return}for(let n of t.servers){let o=n.drift?.length?` [${n.drift.join(", ")}]`:"";console.log(`${n.name} ${n.transport} ${n.enabled?"enabled":"disabled"}${o}`),console.log(` sources: ${n.sourcePaths.join(", ")}`),console.log(` fingerprint: ${n.fingerprint}`);}t.duplicates.length&&console.log(`duplicates: ${t.duplicates.map(n=>n.name).join(", ")}`),t.unreadable.length&&console.error(`unreadable: ${t.unreadable.map(n=>n.path).join(", ")}`);}async function qc(e={}){let t=e.refresh?await checkMcpHealth(readMcpInventory(e.project??process.cwd())):readCachedMcpHealth(homedir$1());if(e.json){console.log(JSON.stringify(t,null,2));return}for(let n of t.records){let o=n.failureCategory?` ${n.failureCategory}: ${n.lastError??""}`:"";console.log(`${n.status.toUpperCase()} ${n.name} failures=${n.failureCount}${o}`);}}var Tn=O(()=>{});var It={};A(It,{DEFAULT_SERVER_PORT:()=>Fn,readPidFromFile:()=>ut,readPortFromFile:()=>xr,serverStatus:()=>ft,startServer:()=>Hn,stopServer:()=>gt});function Ln(e){let t=join(e,".devflow");return existsSync(t)||mkdirSync(t,{recursive:true}),join(t,"server.pid")}function Xc(){try{return $r.resolve("./server.js")}catch{try{return $r.resolve("@devflow-tools/server/dist/main.js")}catch{return join(process.cwd(),"apps","server","dist","main.js")}}}function xr(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
32
- `);if(t.length>=2){let n=parseInt(t[0],10);if(!isNaN(n))return n}return null}function ut(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
33
- `),n=t.length>=2?t[1]:t[0],o=parseInt(n,10);return isNaN(o)?null:o}async function Hn(e){let t=Xc(),n=Ln(process.cwd()),o=randomUUID(),r=spawn(process.execPath,[t,"--devflow-instance-token",o],{env:{...process.env,PORT:String(e.port)},stdio:"ignore",detached:true});writeFileSync(n,`${e.port}
34
- ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e.port,pid:r.pid??0,ownerToken:o,status:"launching"}),r.unref();let s=await el(`http://127.0.0.1:${e.port}`,5e3);return updateRuntimeEndpointStatus(s?"healthy":"degraded"),{pid:r.pid??0}}async function gt(){let e=Ln(process.cwd()),t=ut(e);if(t===null)return false;try{return process.kill(t),unlinkSync(e),readRuntimeEndpointState()?.pid===t&&updateRuntimeEndpointStatus("stopped"),!0}catch{return unlinkSync(e),readRuntimeEndpointState()?.pid===t&&updateRuntimeEndpointStatus("stopped"),false}}async function ft(){let e=Ln(process.cwd()),t=resolveRuntimeEndpoint(),n=xr(e)??t.port,{DevFlowApiClient:o}=await import('@devflow-tools/sdk');if(await new o({baseUrl:`http://127.0.0.1:${n}`,projectRoot:process.cwd()}).ping()){let a=ut(e)??void 0,c=readRuntimeEndpointState();return c&&(!a||c.pid===a)&&updateRuntimeEndpointStatus("healthy"),{running:true,pid:a,port:n}}let i=readRuntimeEndpointState();return i&&(!ut(e)||i.pid===ut(e))&&updateRuntimeEndpointStatus("degraded"),{running:false,port:n}}async function el(e,t){let n=Date.now()+t;for(;Date.now()<n;){try{if((await fetch(new URL("/api/health",e),{signal:AbortSignal.timeout(500)})).ok)return !0}catch{}await new Promise(o=>setTimeout(o,100));}return false}var $r,Fn,Se=O(()=>{$r=createRequire(import.meta.url);Fn=DEFAULT_DEVFLOW_SERVER_PORT;});var hs={};A(hs,{renderDoctorText:()=>ms,runDoctor:()=>Tu,runDoctorAudit:()=>Mu,runDoctorAuditFix:()=>Lu,runDoctorCommand:()=>Iu,runDoctorReceipts:()=>Hu,runDoctorViolations:()=>Fu,runLegacyDoctorReport:()=>ps,runStructuredDoctor:()=>oo});function Jt(e){return createHash("sha256").update(e).digest("hex").slice(0,16)}function Nr(e){return join$1(homedir$1(),".devflow","daemons",`${Jt(e)}.sock`)}function ml(){return join$1(homedir$1(),".devflow","daemons.json")}function es(){if(Lt)return Lt;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Lt=e.DatabaseSync,Lt}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function N(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}async function pl(e,t){let n=t.homePath??homedir$1(),o=[],r=await selectHostAdapter({projectRoot:e,homeDir:n,env:t.env??process.env,explicitHost:(t.env??process.env).DEVFLOW_HOST_ADAPTER});if(o.push({key:"host_adapter",value:r.status==="selected"?{id:r.adapter.id,candidates:r.candidates,explicit:r.explicit}:{status:"failed",code:r.code,candidates:r.candidates,reason:r.reason,action:r.action},target:"one explicitly selected or uniquely detected host",ok:r.status==="selected",severity:"warning"}),r.status==="selected"){let p=await r.adapter.capabilities({projectRoot:e,homeDir:n,env:t.env??process.env});o.push({key:"host_capabilities",value:p,target:"unsupported capabilities have explicit degradation",ok:p.every(m=>m.status==="supported"||!!(m.reason&&m.fallback)),severity:"error"});}let s=await loadPluginsWithDiagnostics({projectRoot:e,homeDir:n}),i=s.diagnostics.filter(p=>p.status==="failed");o.push({key:"plugin_runtime",value:s.diagnostics,target:"configured plugins loadable with diagnostics",ok:i.length===0,severity:"warning"});let a=redactMcpInventory(readMcpInventory(e,n,{env:t.env??process.env}));o.push({key:"mcp_inventory",value:{servers:a.servers.length,duplicates:a.duplicates.length,unreadable:a.unreadable.length},target:{duplicates:0,unreadable:0},ok:a.unreadable.length===0,severity:a.unreadable.length>0?"error":"info"}),o.push({key:"mcp_configuration_drift",value:a.duplicates.filter(p=>p.fingerprints.length>1).map(p=>p.name),target:[],ok:a.duplicates.every(p=>p.fingerprints.length===1),severity:"warning"});let c=await checkMcpHealth(a,n),l=c.records.filter(p=>p.status==="unhealthy");o.push({key:"mcp_health",value:c.records,target:"no unhealthy enabled servers",ok:l.length===0,severity:"warning"});let u=t.activePluginRoot??Ce(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(u){let p=jt(u);o.push({key:"skill_health",value:{root:p.pluginRoot,skills:p.skills,commands:p.commands,issues:p.issues},target:"valid and fully bound installed skills",ok:p.healthy,severity:"warning"});}let d=readRuntimeEndpointState(n);o.push({key:"runtime_endpoint_registry",value:d??"not registered",target:"healthy while active, stopped or absent while idle",ok:!d||d.status==="healthy"||d.status==="stopped",severity:d?.status==="degraded"?"error":"warning"});let g=(t.now??Date.now)(),f=listRuntimeHttpCircuits(n).filter(p=>p.status==="open"&&(p.openUntil??0)>g);return o.push({key:"runtime_http_circuits",value:f,target:[],ok:f.length===0,severity:f.some(p=>p.failures>=2)?"error":"warning"}),{name:"Contract",status:N(o),metrics:o}}function Vn(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function hl(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!==Jt(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function yl(e,t){let n=Vn(e),o=Jt(n.path),r=Nr(n.path),s=[{key:"canonical_project",value:n.path,target:"existing canonical path",ok:n.error===void 0,severity:n.error?"error":"info"},{key:"project_hash",value:o,ok:true,severity:"info"},{key:"daemon_socket_path",value:r,target:`path containing ${o}`,ok:r.includes(o),severity:"error"}],i=t.registryPath??ml();if(!existsSync$1(i))s.push({key:"daemon_registry",value:"not found",target:"valid JSON when present",ok:true,severity:"info"}),s.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:0},target:"0 when idle or 1 while active",ok:true,severity:"info"});else try{let a=JSON.parse(readFileSync$1(i,"utf8"));if(!Array.isArray(a))throw new Error("registry must be an array");let c=a.filter(g=>hl(g).length>0);s.push({key:"daemon_registry",value:c.length===0?"valid":"malformed",target:"valid daemon entry array",ok:c.length===0,severity:c.length===0?"info":"warning"}),s.push({key:"invalid_daemon_registry_entries",value:c.length,target:0,ok:c.length===0,severity:"warning"});let l=a.filter(g=>{if(typeof g!="object"||g===null)return !1;let f=g;return typeof f.rootPath!="string"||f.rootPath.length===0?!1:Vn(f.rootPath).path===n.path});s.push({key:"project_daemon_registrations",value:l.length,ok:!0,severity:"info"}),s.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:l.length},target:"0 when idle or 1 while active",ok:l.length<=1,severity:"warning"});let u=l.map(g=>Nr(g.rootPath));s.push({key:"registered_daemon_socket_paths",value:u,target:[r],ok:!0,severity:"info"});let d=l.filter((g,f)=>g.projectHash!==o||u[f]!==r).length;s.push({key:"daemon_identity_mismatches",value:d,target:0,ok:d===0,severity:"warning"});}catch{s.push({key:"daemon_registry",value:"malformed",target:"valid daemon entry array",ok:false,severity:"warning"}),s.push({key:"invalid_daemon_registry_entries",value:1,target:0,ok:false,severity:"warning"}),s.push({key:"hook_daemon_registration",value:"unreadable daemon registry",target:"valid project registration",ok:false,severity:"warning"});}return {name:"Isolation",status:N(s),metrics:s}}function kl(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(vl)){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 ts(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 wl(e){let t=ts(e);return t&&t.length>0?t:null}function Un(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 bl(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function jr(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function Sl(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:`initialize ${o} with devflow init`,ok:false,severity:"error"}),{name:"Distill",status:N(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(es())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=kl(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:N(n),metrics:n};let c=(t.now??Date.now)(),l=i.prepare(`
23
+ `);return i}var un=$(()=>{$t();be();});var or={};A(or,{ResetExecutionError:()=>ot,executeResetCommand:()=>Da,formatResetResult:()=>pn,runReset:()=>nr});function ka(){if(At)return At;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return At=e.DatabaseSync,At}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function pn(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function wa(e){return e==="all"||Qo.includes(e)}function se(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function gn(e){let t=resolve(e),n=[];for(;!se(t);){let o=dirname(t);if(o===t)throw new Error(`Cannot resolve path: ${e}`);n.unshift(basename(t)),t=o;}return resolve(realpathSync(t),...n)}function hn(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function ba(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 Xo(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=se(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(se(t)){let o=realpathSync(t);if(!hn(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function _a(e,t){return (e==="all"?Qo:[e]).map(o=>({scope:o,path:join$1(t,...Zo[o])}))}function er(e,t){let n=se(t);if(n)return Xo(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function tr(e,t){let n=er(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 Sa(e){let t=se(e);if(!t?.isFile()||t.size<dn.length)return false;let n=Buffer.alloc(dn.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(dn)}finally{closeSync(o);}}function Ea(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}Sa(o)&&t.push(o);}}return n(e),t}function Ra(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(ka())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function Pa(e,t,n){let o=Ea(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));Ra(s,i);}}function Ca(e,t,n,o,r){let s=!!se(t),i,a=[];try{mkdirSync$1(t,{recursive:!0}),i=mkdtempSync(join$1(t,".devflow-reset-"));for(let c of n)r.beforeBackup(c.path),Pa(c.path,join$1(i,c.scope),()=>tr(e,c));for(let c of n){let l=join$1(i,c.scope),u=join$1(t,c.scope);if(se(u))throw new Error(`Backup destination already exists: ${u}`);r.renamePath(l,u),a.push(u),o.backedUp.push({source:c.path,destination:u});}}catch(c){for(let l of a.reverse())rmSync(l,{recursive:true,force:true});throw new Error(`Failed to prepare reset backup: ${c.message}`)}finally{if(i&&rmSync(i,{recursive:true,force:true}),!s&&se(t))try{rmdirSync(t);}catch{}}}function nr(e,t={}){if(!wa(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=ba(e.project??process.cwd()),o=_a(e.scope,n);for(let c of o)Xo(n,c.path);if(!e.backupTo&&!e.force)throw new Error("Refusing to reset without a backup. Provide --backup-to <dir> or use --force.");let r=o.flatMap(c=>{let l=er(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?gn(e.backupTo):void 0;if(s){let c=se(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let l of r){let u=gn(l.path),g=join$1(s,l.scope),d=gn(g);if(hn(u,d)||hn(d,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${d}`);if(se(g))throw new Error(`Backup destination already exists: ${g}`)}}let i={backedUp:[],removed:[]},a={beforeBackup:()=>{},beforeRemoval:()=>{},renamePath:(c,l)=>renameSync(c,l),removePath:c=>rmSync(c,{recursive:true,force:true}),...t};s&&r.length>0&&Ca(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),tr(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new ot(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function Da(e,t={},n=console){try{let o=nr(e,t),r=pn(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof ot)for(let r of pn(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var At,ot,Zo,Qo,dn,rr=$(()=>{ot=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Zo={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},Qo=Object.keys(Zo),dn=Buffer.from("SQLite format 3\0","binary");});var fr={};A(fr,{consolidateDatabases:()=>xa,formatConsolidateResult:()=>Na});function xa(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=[ir("project",o,s?n:void 0),ir("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(m=>m.exists&&Object.keys(m.tables).length>0),l=new Date(e.now??Date.now()).toISOString().replace(/[:.]/g,"-"),u=basename(dirname(n))==="global"?join$1(dirname(dirname(n)),"backup"):join$1(dirname(n),"backup"),g=join$1(e.backupRoot??u,l);mkdirSync$1(g,{recursive:true}),a.backupDir=g;let d=c.some(m=>m.kind==="project")?ja(o):null;try{let m=new Map;for(let y of c){let v=join$1(g,`${y.kind}-${basename(y.path)}.snapshot`);ar(y.path,v),m.set(y.kind,v);}s&&ar(n,join$1(g,"global-devflow.db.before"));let f=m.has("project")?Ia(o,g):[];a.retired.push(...f.map(y=>y.destination));let p=null,h=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),p=new DatabaseSync(n),p.exec("PRAGMA busy_timeout = 10000"),p.exec(DEVFLOW_SCHEMA_SQL),m.has("project")&&p.prepare("ATTACH DATABASE ? AS project_source").run(m.get("project")),m.has("codegraph")&&p.prepare("ATTACH DATABASE ? AS codegraph_source").run(r),p.exec("BEGIN IMMEDIATE"),h=!0,m.has("project")&&cr(p,"project_source",void 0,a.inserted),m.has("codegraph")){cr(p,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let v of it(p,"codegraph_source").filter(E=>E.startsWith("devflow_")))p.exec(`DROP TABLE codegraph_source.${H(v)}`);}p.exec("COMMIT"),h=!1;}catch(y){if(h)try{p?.exec("ROLLBACK");}catch{}throw gr(f),y}finally{p?.close();}return a}finally{Ta(d);}}function Na(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 ir(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 it(r).filter(c=>!i||i.has(c)))o.tables[a]=wn(r,a),o.conflicts[a]=s&&it(s).includes(a)?Ma(r,s,a):0;}finally{r.close(),s?.close();}return o}function ar(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 ja(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 Ta(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function Ia(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 gr(n),o}return n}function gr(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function cr(e,t,n,o){let r=new Set(it(e)),s=it(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=Nt(e,"main",i),c=new Set(Nt(e,t,i).map(f=>f.name)),l=a.filter(f=>c.has(f.name));if(kn.has(i)&&(l=l.filter(f=>f.pk===0)),l.length===0)continue;let u=wn(e,i),g=l.map(f=>H(f.name)).join(", "),d=l.map(f=>`s.${H(f.name)}`).join(", ");if(l.filter(f=>f.pk>0).length>0&&!kn.has(i))e.exec(`INSERT OR IGNORE INTO main.${H(i)} (${g}) SELECT ${d} FROM ${H(t)}.${H(i)} s`);else {let f=l.map(p=>`t.${H(p.name)} IS s.${H(p.name)}`).join(" AND ");e.exec(`
24
+ INSERT INTO main.${H(i)} (${g})
25
+ SELECT ${d} FROM ${H(t)}.${H(i)} s
26
+ WHERE NOT EXISTS (SELECT 1 FROM main.${H(i)} t WHERE ${f})
27
+ `);}o[i]=(o[i]??0)+(wn(e,i)-u);}}function Ma(e,t,n){let o=new Set(Nt(t,"main",n).map(l=>l.name)),r=Nt(e,"main",n).filter(l=>l.pk>0&&o.has(l.name));if(r.length===0||kn.has(n))return 0;let s=r.map(l=>H(l.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${H(n)}`).all(),a=r.map(l=>`${H(l.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${H(n)} WHERE ${a} LIMIT 1`);return i.reduce((l,u)=>l+(c.get(...r.map(g=>u[g.name]))?1:0),0)}function it(e,t="main"){return e.prepare(`SELECT name FROM ${H(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(o=>o.name)}function Nt(e,t,n){return e.prepare(`PRAGMA ${H(t)}.table_info(${H(n)})`).all()}function wn(e,t){let n=e.prepare(`SELECT COUNT(*) count FROM ${H(t)}`).get();return Number(n.count)}function H(e){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsafe SQLite identifier: ${e}`);return `"${e}"`}var kn,mr=$(()=>{kn=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var pr={};A(pr,{connectAgent:()=>Ha,getAvailableAgents:()=>Wa});async function Ha(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 Wa(){return listAdapters()}var hr=$(()=>{});var vr={};A(vr,{getIndexStatus:()=>Ua,refreshIndex:()=>qa});async function Ua(e){return j(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 qa(e){return j(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var kr=$(()=>{we();});var wr={};A(wr,{getGraph:()=>Ka});async function Ka(e={}){let t=e.target??"all",n=e.depth??2;return j(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 br=$(()=>{we();});var bn={};A(bn,{getContext:()=>Va,getTaskContext:()=>Ga});async function Va(e){return j(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 Ga(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return j(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,a=`diagnostic:${stableRuntimeHash({rootPath:t,query:e.query,taskOptions:n})}`;return projectDiagnosticCodeResult(await o.buildTaskContext(e.query,n),i,{projectRoot:t,query:e.query,host:"cli",sessionId:a,executionId:a,requestId:a,turnId:a})},{skipServer:e.skipServer})}var _n=$(()=>{we();});var at={};A(at,{getWorkflowRuns:()=>Sr,getWorkflowStatus:()=>Qa,listWorkflows:()=>Ya,runWorkflow:()=>Za});async function Ya(e){return j(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function Za(e,t,n){return j(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function Qa(e){return Sr(e)}async function Sr(e){return j(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var ct=$(()=>{we();});var Ve={};A(Ve,{cancelWorker:()=>sc,listWorkers:()=>oc,retryWorkerCleanup:()=>ic,showWorker:()=>rc,workerMergeStatus:()=>ac});function oc(e){return lt(e,t=>ze(e.json,{projectRoot:Je(e.projectRoot),workers:t.listWorkflowWorkers(Je(e.projectRoot))}))}function rc(e,t){return lt(t,n=>{let o=Je(t.projectRoot),r=jt(n,o,e);return ze(t.json,{worker:r,events:n.listWorkflowWorkerEvents(o,e),merge:n.getWorkflowMergeByWorker(o,e)})})}function sc(e,t){return lt(t,n=>{let o=Je(t.projectRoot),r=jt(n,o,e);if(["merged","failed","cancelled"].includes(r.state))throw new Error(`Worker ${e} is terminal (${r.state})`);let s=n.transitionWorkflowWorker({projectRoot:o,workerId:e,target:"cancelled",leaseOwner:r.leaseOwner,reason:"operator_cancelled"});return n.enqueueWork({idempotencyKey:`workflow-worker-cleanup:${e}:cancelled`,kind:"workflow.worker_cleanup",projectRoot:o,payload:{workerId:e,reason:"cancelled"}}),ze(t.json,s)})}function ic(e,t){return lt(t,n=>{let o=Je(t.projectRoot),r=jt(n,o,e);if(!["merged","hold","cancelled","failed"].includes(r.state))throw new Error(`Worker ${e} is not eligible for cleanup retry (${r.state})`);let s=n.enqueueWork({idempotencyKey:`workflow-worker-cleanup:${e}:operator:${Date.now()}`,kind:"workflow.worker_cleanup",projectRoot:o,payload:{workerId:e,registeredPath:r.worktreePath,branch:r.branch,operatorApproved:!0},maxAttempts:10});return ze(t.json,s)})}function ac(e,t){return lt(t,n=>{let o=Je(t.projectRoot);jt(n,o,e);let r=n.getWorkflowMergeByWorker(o,e);return ze(t.json,r??{workerId:e,state:"not_queued"})})}function jt(e,t,n){let o=e.getWorkflowWorker(t,n);if(!o)throw new Error(`Worker ${n} was not found in project ${t}`);return o}function Je(e){let t=resolve(e);return existsSync$1(t)?realpathSync(t):t}function lt(e,t){let n=e.database??openGlobalDevFlowDatabase();try{return t(n)}finally{e.database||n.close();}}function ze(e,t){if(e)return JSON.stringify(t,null,2);if(cc(t))return `${t.workerId} ${t.state} ${t.stepId} ${t.host} ${t.worktreePath}`;if(lc(t))return `${t.workerId} ${t.state} ${t.candidateRevision}`;if(t&&typeof t=="object"&&Array.isArray(t.workers)){let n=t.workers;return n.length===0?"No workers.":n.map(o=>ze(false,o)).join(`
28
+ `)}return JSON.stringify(t,null,2)}function cc(e){return !!(e&&typeof e=="object"&&"workerId"in e&&"stepId"in e&&"worktreePath"in e)}function lc(e){return !!(e&&typeof e=="object"&&"mergeId"in e&&"candidateRevision"in e)}var Ge=$(()=>{});var En={};A(En,{getEmbeddingStatus:()=>gc,prepareEmbeddings:()=>fc,renderEmbeddingStatus:()=>mc});async function gc(){return inspectEmbeddingModel()}async function fc(e={}){return prepareEmbeddingModel({endpoints:e.endpoints,timeoutMs:e.timeoutMs})}function mc(e){let t=[`Embedding model: ${e.state}`,` model: ${e.modelId}`,` revision: ${e.revision}`,` cache: ${e.cacheRoot}`];return e.missingFiles.length>0&&t.push(` missing: ${e.missingFiles.join(", ")}`),e.corruptFiles.length>0&&t.push(` corrupt: ${e.corruptFiles.join(", ")}`),t.join(`
29
+ `)}var Rn=$(()=>{});var Ae={};A(Ae,{backfillObservationVectors:()=>bc,queryMemory:()=>vc,reviewCandidates:()=>wc,reviewMemories:()=>Sc,setMemory:()=>kc,showMemory:()=>yc});async function yc(e,t){let n=await j(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 vc(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return j(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getDiagnosticMemoryResult(r,o,{projectRoot:t,adapter:"cli"})},{skipServer:n})}async function kc(e,t,n){return j(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 wc(e){return j(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function bc(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function _c(e){let t=hc.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function Sc(){let t=await j(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(`
30
+ [${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await _c(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await j(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await j(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
31
+ Reviewed ${o}/${t.length} pending memories.`);}var xe=$(()=>{we();});var Rr={};A(Rr,{getDocsStatus:()=>Pc,queryKnowledge:()=>Er,searchKnowledge:()=>Rc,syncDocs:()=>Cc});async function Er(e,t,n,o){return j(process.cwd(),r=>r.queryKnowledge(e,{scope:t,budgetTokens:n}),()=>{let r=process.cwd(),s=new KnowledgeEngine({projectRoot:r,projectId:resolveStableProjectIdentity(r).projectId,embedder:new EmbeddingProvider});return getDiagnosticKnowledgeResult(s,{query:e,scope:t,budgetTokens:n},{projectRoot:process.cwd(),adapter:"cli"})},{skipServer:o})}async function Rc(e,t,n){return (await Er(e,t,void 0,n)).results}async function Pc(e){return j(process.cwd(),t=>t.getKnowledgeSources(),()=>{let t=process.cwd();return new KnowledgeEngine({projectRoot:t,projectId:resolveStableProjectIdentity(t).projectId,embedder:new EmbeddingProvider}).getSources()},{skipServer:e})}async function Cc(e,t){return j(process.cwd(),n=>n.syncDocs(e),()=>{let n=process.cwd();return new KnowledgeEngine({projectRoot:n,projectId:resolveStableProjectIdentity(n).projectId,embedder:new EmbeddingProvider}).syncDocs(e)},{skipServer:t})}var Pr=$(()=>{we();});var $n={};A($n,{backfillKnowledgeVectors:()=>Nc,resyncKnowledgeDocs:()=>xc});function Cr(e){return new KnowledgeEngine({projectRoot:e,projectId:resolveStableProjectIdentity(e).projectId,embedder:new EmbeddingProvider})}async function xc(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=Cr(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Nc(e={}){let t=e.projectRoot??process.cwd(),n=Date.now(),o=Cr(t);On(t,{phase:"started",source:e.source??"all",batchSize:e.batchSize??32});try{let r=await o.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress});return On(t,{phase:"completed",source:e.source??"all",processed:r.processed,remaining:r.remaining},Date.now()-n),r}catch(r){throw On(t,{phase:"failed",source:e.source??"all",errorCategory:jc(r),error:r instanceof Error?r.message.slice(0,500):String(r).slice(0,500),success:false},Date.now()-n),r}finally{o.close();}}function On(e,t,n){try{let o=openGlobalDevFlowDatabase();try{o.insertEvent({kind:"knowledge_vector_backfill",timestamp:Date.now(),duration:n,success:t.success!==!1,metadata:{projectRoot:e,...t}});}finally{o.close();}}catch{}}function jc(e){let t=e instanceof Error?e.message:String(e);return /warmup|model|embedding provider/iu.test(t)?"embedding_provider_unavailable":/dimension|vector|shape/iu.test(t)?"embedding_contract_mismatch":/sqlite|database|locked|busy/iu.test(t)?"storage_unavailable":"unexpected_backfill_failure"}var An=$(()=>{});var Dr={};A(Dr,{inspectSkillHealth:()=>Tt,showSkillHealth:()=>Uc});function Hc(e){let t=readFileSync$1(e,"utf8"),n=/^---\r?\n([\s\S]*?)\r?\n---/.exec(t);if(!n)return {};let o={};for(let r of n[1].split(/\r?\n/)){let s=r.indexOf(":");if(s<1)continue;let i=r.slice(0,s).trim(),a=r.slice(s+1).trim();(i==="name"||i==="description")&&(o[i]=a);}return o}function Tt(e){let t=e===void 0?Ce(homedir$1()).root:e;if(!t)return {pluginRoot:null,registryVersion:null,skills:0,commands:0,healthy:false,issues:[{category:"missing",reason:"No active DevFlow Claude plugin found"}]};let n=[];Wc(t,n);let o=[join$1(t,"dist","command-registry.json"),join$1(t,"command-registry.json")].find(existsSync$1),r=null,s={};if(!o)n.push({category:"missing",reason:"command-registry.json is missing"});else try{let c=JSON.parse(readFileSync$1(o,"utf8"));r=typeof c.version=="number"?c.version:null,r!==1&&r!==2&&n.push({category:"unsupported",path:o,reason:`unsupported registry version ${String(c.version)}`}),c.commands&&typeof c.commands=="object"?s=c.commands:n.push({category:"malformed",path:o,reason:"commands object is missing"});}catch(c){n.push({category:"malformed",path:o,reason:c.message});}let i=join$1(t,"skills"),a=new Map;if(!existsSync$1(i))n.push({category:"missing",path:i,reason:"skills directory is missing"});else for(let c of readdirSync(i,{withFileTypes:true})){if(!c.isDirectory())continue;let l=join$1(i,c.name,"SKILL.md");if(!existsSync$1(l))continue;let u=Hc(l);if(!u.name||!u.description){n.push({category:"malformed",skill:c.name,path:l,reason:"frontmatter name and description are required"});continue}/^devflow(?::[a-z0-9-]+)?$/.test(u.name)||n.push({category:"unsupported",skill:u.name,path:l,reason:"skill name is outside the canonical DevFlow namespace"});let g=u.name.startsWith("devflow:")?u.name.slice(8):u.name;u.name!==c.name&&g!==c.name&&n.push({category:"stale",skill:u.name,path:l,reason:`directory name ${c.name} does not match frontmatter`});let d=a.get(u.name)??[];d.push(l),a.set(u.name,d);}for(let[c,l]of a)l.length>1&&n.push({category:"duplicate",skill:c,reason:l.join(", ")}),c!=="devflow"&&!s[c]&&!["devflow:doctor","devflow:start"].includes(c)&&n.push({category:"unbound",skill:c,path:l[0],reason:"skill has no command registry entry"});for(let[c,l]of Object.entries(s))if(a.has(c)||n.push({category:"missing",skill:c,reason:"registry command has no installed SKILL.md"}),(!Array.isArray(l.mcpTools)||l.mcpTools.some(u=>typeof u!="string"))&&n.push({category:"malformed",skill:c,reason:"mcpTools must be a string array"}),r===2&&typeof l.skillPath=="string"){let u=join$1(t,l.skillPath),g=join$1(t,l.skillPath.replace(/^skills\/devflow:/,"skills/"));!existsSync$1(u)&&!existsSync$1(g)&&n.push({category:"stale",skill:c,path:l.skillPath,reason:"registry skillPath does not exist"});}return {pluginRoot:t,registryVersion:r,skills:a.size,commands:Object.keys(s).length,issues:n,healthy:n.length===0}}function Wc(e,t){try{if(!JSON.parse(readFileSync$1(join$1(e,"package.json"),"utf8")).dependencies?.["@devflow-tools/memory-engine"])return;let o=readPersistedClaudeHookNode(e);if(!o){t.push({category:"runtime",path:e,reason:"Claude Hook Node identity is missing; redeploy the plugin to bind and verify native dependencies."});return}let r=resolveClaudeHookRuntime({env:{...process.env,DEVFLOW_HOOK_NODE:o}});verifyClaudeHookNativeRuntime(e,r);}catch(n){t.push({category:"runtime",path:e,reason:n instanceof Error?n.message:String(n)});}}function Uc(e={}){let t=Tt(e.root);if(e.json)console.log(JSON.stringify(t,null,2));else {console.log(`Skills: ${t.skills}, registry commands: ${t.commands}, version: ${t.registryVersion??"missing"}`);for(let n of t.issues)console.log(`${n.category.toUpperCase()} ${n.skill??"runtime"}: ${n.reason}`);}return t.healthy?0:1}var Nn=$(()=>{qe();});var jn={};A(jn,{showMcpHealth:()=>Vc,showMcpInventory:()=>zc});async function zc(e={}){let t=redactMcpInventory(readMcpInventory(e.project??process.cwd()));if(e.json){console.log(JSON.stringify(t,null,2));return}for(let n of t.servers){let o=n.drift?.length?` [${n.drift.join(", ")}]`:"";console.log(`${n.name} ${n.transport} ${n.enabled?"enabled":"disabled"}${o}`),console.log(` sources: ${n.sourcePaths.join(", ")}`),console.log(` fingerprint: ${n.fingerprint}`);}t.duplicates.length&&console.log(`duplicates: ${t.duplicates.map(n=>n.name).join(", ")}`),t.unreadable.length&&console.error(`unreadable: ${t.unreadable.map(n=>n.path).join(", ")}`);}async function Vc(e={}){let t=e.refresh?await checkMcpHealth(readMcpInventory(e.project??process.cwd())):readCachedMcpHealth(homedir$1());if(e.json){console.log(JSON.stringify(t,null,2));return}for(let n of t.records){let o=n.failureCategory?` ${n.failureCategory}: ${n.lastError??""}`:"";console.log(`${n.status.toUpperCase()} ${n.name} failures=${n.failureCount}${o}`);}}var Tn=$(()=>{});var Mt={};A(Mt,{DEFAULT_SERVER_PORT:()=>Fn,readPidFromFile:()=>dt,readPortFromFile:()=>Nr,serverStatus:()=>mt,startServer:()=>Hn,stopServer:()=>ft});function Ln(e){let t=join(e,".devflow");return existsSync(t)||mkdirSync(t,{recursive:true}),join(t,"server.pid")}function ol(){try{return Ar.resolve("./server.js")}catch{try{return Ar.resolve("@devflow-tools/server/dist/main.js")}catch{return join(process.cwd(),"apps","server","dist","main.js")}}}function Nr(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
32
+ `);if(t.length>=2){let n=parseInt(t[0],10);if(!isNaN(n))return n}return null}function dt(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
33
+ `),n=t.length>=2?t[1]:t[0],o=parseInt(n,10);return isNaN(o)?null:o}async function Hn(e){let t=ol(),n=Ln(process.cwd()),o=randomUUID(),r=spawn(process.execPath,[t,"--devflow-instance-token",o],{env:{...process.env,PORT:String(e.port)},stdio:"ignore",detached:true});writeFileSync(n,`${e.port}
34
+ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e.port,pid:r.pid??0,ownerToken:o,status:"launching"}),r.unref();let s=await rl(`http://127.0.0.1:${e.port}`,5e3);return updateRuntimeEndpointStatus(s?"healthy":"degraded"),{pid:r.pid??0}}async function ft(){let e=Ln(process.cwd()),t=dt(e);if(t===null)return false;try{return process.kill(t),unlinkSync(e),readRuntimeEndpointState()?.pid===t&&updateRuntimeEndpointStatus("stopped"),!0}catch{return unlinkSync(e),readRuntimeEndpointState()?.pid===t&&updateRuntimeEndpointStatus("stopped"),false}}async function mt(){let e=Ln(process.cwd()),t=resolveRuntimeEndpoint(),n=Nr(e)??t.port,{DevFlowApiClient:o}=await import('@devflow-tools/sdk');if(await new o({baseUrl:`http://127.0.0.1:${n}`,projectRoot:process.cwd()}).ping()){let a=dt(e)??void 0,c=readRuntimeEndpointState();return c&&(!a||c.pid===a)&&updateRuntimeEndpointStatus("healthy"),{running:true,pid:a,port:n}}let i=readRuntimeEndpointState();return i&&(!dt(e)||i.pid===dt(e))&&updateRuntimeEndpointStatus("degraded"),{running:false,port:n}}async function rl(e,t){let n=Date.now()+t;for(;Date.now()<n;){try{if((await fetch(new URL("/api/health",e),{signal:AbortSignal.timeout(500)})).ok)return !0}catch{}await new Promise(o=>setTimeout(o,100));}return false}var Ar,Fn,Se=$(()=>{Ar=createRequire(import.meta.url);Fn=DEFAULT_DEVFLOW_SERVER_PORT;});var vs={};A(vs,{renderDoctorText:()=>hs,runDoctor:()=>Hu,runDoctorAudit:()=>Uu,runDoctorAuditFix:()=>qu,runDoctorCommand:()=>Wu,runDoctorReceipts:()=>Ku,runDoctorViolations:()=>Bu,runLegacyDoctorReport:()=>ys,runStructuredDoctor:()=>ro});function ns(){if(Ft)return Ft;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Ft=e.DatabaseSync,Ft}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function ie(e){return {homeDir:e.homePath,env:e.env??process.env}}function Kt(e){return join$1(getDevFlowStateRoot(ie(e)),"global","devflow.db")}function T(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}async function wl(e,t){let n=t.homePath??homedir$1(),o=ie(t),r=[],s=await selectHostAdapter({projectRoot:e,homeDir:n,env:t.env??process.env,explicitHost:(t.env??process.env).DEVFLOW_HOST_ADAPTER});if(r.push({key:"host_adapter",value:s.status==="selected"?{id:s.adapter.id,candidates:s.candidates,explicit:s.explicit}:{status:"failed",code:s.code,candidates:s.candidates,reason:s.reason,action:s.action},target:"one explicitly selected or uniquely detected host",ok:s.status==="selected",severity:"warning"}),s.status==="selected"){let p=await s.adapter.capabilities({projectRoot:e,homeDir:n,env:t.env??process.env});r.push({key:"host_capabilities",value:p,target:"unsupported capabilities have explicit degradation",ok:p.every(h=>h.status==="supported"||!!(h.reason&&h.fallback)),severity:"error"});}let i=await loadPluginsWithDiagnostics({projectRoot:e,homeDir:n}),a=i.diagnostics.filter(p=>p.status==="failed");r.push({key:"plugin_runtime",value:i.diagnostics,target:"configured plugins loadable with diagnostics",ok:a.length===0,severity:"warning"});let c=redactMcpInventory(readMcpInventory(e,n,{env:t.env??process.env}));r.push({key:"mcp_inventory",value:{servers:c.servers.length,duplicates:c.duplicates.length,unreadable:c.unreadable.length},target:{duplicates:0,unreadable:0},ok:c.unreadable.length===0,severity:c.unreadable.length>0?"error":"info"}),r.push({key:"mcp_configuration_drift",value:c.duplicates.filter(p=>p.fingerprints.length>1).map(p=>p.name),target:[],ok:c.duplicates.every(p=>p.fingerprints.length===1),severity:"warning"});let l=await checkMcpHealth(c,n),u=l.records.filter(p=>p.status==="unhealthy");r.push({key:"mcp_health",value:l.records,target:"no unhealthy enabled servers",ok:u.length===0,severity:"warning"});let g=t.activePluginRoot??Ce(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(g){let p=Tt(g);r.push({key:"skill_health",value:{root:p.pluginRoot,skills:p.skills,commands:p.commands,issues:p.issues},target:"valid and fully bound installed skills",ok:p.healthy,severity:"warning"});}let d=readRuntimeEndpointState(o);r.push({key:"runtime_endpoint_registry",value:d??"not registered",target:"healthy while active, stopped or absent while idle",ok:!d||d.status==="healthy"||d.status==="stopped",severity:d?.status==="degraded"?"error":"warning"});let m=(t.now??Date.now)(),f=listRuntimeHttpCircuits(o).filter(p=>p.status==="open"&&(p.openUntil??0)>m);return r.push({key:"runtime_http_circuits",value:f,target:[],ok:f.length===0,severity:f.some(p=>p.failures>=2)?"error":"warning"}),{name:"Contract",status:T(r),metrics:r}}function Vn(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function bl(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!==getProjectHash(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function _l(e,t){let n=Vn(e),o=ie(t),r=getProjectHash(n.path),s=getDaemonSocketPath(n.path,o),i=[{key:"canonical_project",value:n.path,target:"existing canonical path",ok:n.error===void 0,severity:n.error?"error":"info"},{key:"project_hash",value:r,ok:true,severity:"info"},{key:"daemon_socket_path",value:s,target:`path containing ${r}`,ok:s.includes(r),severity:"error"}],a=t.registryPath??getDaemonRegistryPath(o);if(!existsSync$1(a))i.push({key:"daemon_registry",value:"not found",target:"valid JSON when present",ok:true,severity:"info"}),i.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:0},target:"0 when idle or 1 while active",ok:true,severity:"info"});else try{let c=JSON.parse(readFileSync$1(a,"utf8"));if(!Array.isArray(c))throw new Error("registry must be an array");let l=c.filter(m=>bl(m).length>0);i.push({key:"daemon_registry",value:l.length===0?"valid":"malformed",target:"valid daemon entry array",ok:l.length===0,severity:l.length===0?"info":"warning"}),i.push({key:"invalid_daemon_registry_entries",value:l.length,target:0,ok:l.length===0,severity:"warning"});let u=c.filter(m=>{if(typeof m!="object"||m===null)return !1;let f=m;return typeof f.rootPath!="string"||f.rootPath.length===0?!1:Vn(f.rootPath).path===n.path});i.push({key:"project_daemon_registrations",value:u.length,ok:!0,severity:"info"}),i.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:u.length},target:"0 when idle or 1 while active",ok:u.length<=1,severity:"warning"});let g=u.map(m=>getDaemonSocketPath(m.rootPath,o));i.push({key:"registered_daemon_socket_paths",value:g,target:[s],ok:!0,severity:"info"});let d=u.filter((m,f)=>m.projectHash!==r||g[f]!==s).length;i.push({key:"daemon_identity_mismatches",value:d,target:0,ok:d===0,severity:"warning"});}catch{i.push({key:"daemon_registry",value:"malformed",target:"valid daemon entry array",ok:false,severity:"warning"}),i.push({key:"invalid_daemon_registry_entries",value:1,target:0,ok:false,severity:"warning"}),i.push({key:"hook_daemon_registration",value:"unreadable daemon registry",target:"valid project registration",ok:false,severity:"warning"});}return {name:"Isolation",status:T(i),metrics:i}}function El(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(Sl)){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 os(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 Rl(e){let t=os(e);return t&&t.length>0?t:null}function Un(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 Pl(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function Tr(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function Dl(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:`initialize ${o} with devflow init`,ok:false,severity:"error"}),{name:"Distill",status:T(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(ns())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=El(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:T(n),metrics:n};let c=(t.now??Date.now)(),l=i.prepare(`
35
35
  SELECT batch_id, event_ids, session_ids, event_count, created_at, expires_at, status
36
36
  FROM distill_leases
37
- `);l.setReadBigInts?.(!0);let u=l.all(),d=new Set,g=0,f=0;for(let S of u){let T=wl(S.event_ids),z=ts(S.session_ids),oe=Un(S.event_count),$=Un(S.created_at),U=Un(S.expires_at),X=typeof S.status=="string"&&_l.has(S.status)?S.status:null,D=typeof S.batch_id=="string"&&S.batch_id.trim().length>0,I=T!==null&&oe!==null&&bl(oe,T.length);if(!D||!T||!z||!I||$===null||U===null||X===null){g+=1,S.status==="pending"&&(U===null||jr(U,c))&&(f+=1);continue}if(!(X!=="pending"||!jr(U,c)))for(let F of T)d.add(F);}n.push({key:"malformed_distill_leases",value:g,target:0,ok:g===0,severity:f>0?"error":"warning"});let m=i.prepare(`
37
+ `);l.setReadBigInts?.(!0);let u=l.all(),g=new Set,d=0,m=0;for(let S of u){let I=Rl(S.event_ids),z=os(S.session_ids),Z=Un(S.event_count),O=Un(S.created_at),K=Un(S.expires_at),D=typeof S.status=="string"&&Cl.has(S.status)?S.status:null,x=typeof S.batch_id=="string"&&S.batch_id.trim().length>0,F=I!==null&&Z!==null&&Pl(Z,I.length);if(!x||!I||!z||!F||O===null||K===null||D===null){d+=1,S.status==="pending"&&(K===null||Tr(K,c))&&(m+=1);continue}if(!(D!=="pending"||!Tr(K,c)))for(let N of I)g.add(N);}n.push({key:"malformed_distill_leases",value:d,target:0,ok:d===0,severity:m>0?"error":"warning"});let p=i.prepare(`
38
38
  SELECT id
39
39
  FROM session_events
40
40
  WHERE processed = 0 AND created_at < ?
41
- `).all(c-300*1e3).filter(S=>!d.has(S.id)).length;n.push({key:"unprocessed_stale_events",value:m,target:0,ok:m===0,severity:"error"});let h=J(i,"SELECT COUNT(*) count FROM session_events WHERE processed = 0");n.push({key:"pending_memory_events",value:h,target:"actively leased or younger than 5 minutes",ok:m===0,severity:"error"});let y=i.prepare("SELECT MIN(created_at) oldest FROM session_events WHERE processed = 0").get(),k=y?.oldest==null?null:Number(y.oldest);n.push({key:"pending_memory_oldest_age_ms",value:k===null?0:Math.max(0,c-k),target:"<= 300000 when no active lease is present",ok:k===null||m===0,severity:"warning"});let C=J(i,`
41
+ `).all(c-300*1e3).filter(S=>!g.has(S.id)).length;n.push({key:"unprocessed_stale_events",value:p,target:0,ok:p===0,severity:"error"});let h=B(i,"SELECT COUNT(*) count FROM session_events WHERE processed = 0");n.push({key:"pending_memory_events",value:h,target:"actively leased or younger than 5 minutes",ok:p===0,severity:"error"});let y=i.prepare("SELECT MIN(created_at) oldest FROM session_events WHERE processed = 0").get(),v=y?.oldest==null?null:Number(y.oldest);n.push({key:"pending_memory_oldest_age_ms",value:v===null?0:Math.max(0,c-v),target:"<= 300000 when no active lease is present",ok:v===null||p===0,severity:"warning"});let E=B(i,`
42
42
  SELECT COUNT(*) count
43
43
  FROM session_events event
44
44
  LEFT JOIN sessions session ON session.id = event.session_id
45
45
  WHERE TRIM(event.session_id) = '' OR session.id IS NULL
46
- `);n.push({key:"orphan_memory_events",value:C,target:0,ok:C===0,severity:"error"});let v=J(i,`
46
+ `);n.push({key:"orphan_memory_events",value:E,target:0,ok:E===0,severity:"error"});let k=B(i,`
47
47
  SELECT COUNT(*) count
48
48
  FROM sessions
49
49
  WHERE status = 'active' AND created_at < ?
50
- `,c-Gn);n.push({key:"stale_memory_sessions",value:v,target:0,ok:v===0,severity:"error"});let b=i.prepare(`
50
+ `,c-Gn);n.push({key:"stale_memory_sessions",value:k,target:0,ok:k===0,severity:"error"});let w=i.prepare(`
51
51
  SELECT COUNT(*) AS group_count, COALESCE(SUM(title_count), 0) AS row_count
52
52
  FROM (
53
53
  SELECT project, session_id, title, COUNT(*) AS title_count
@@ -55,18 +55,18 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
55
55
  GROUP BY project, session_id, title
56
56
  HAVING COUNT(*) > 1
57
57
  )
58
- `).get();n.push({key:"duplicate_observation_title_groups",value:Number(b.group_count),target:0,ok:Number(b.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(b.row_count),target:0,ok:Number(b.row_count)===0,severity:"error"});}catch(i){n.push({key:"database_read",value:i.message,target:"readable Task 2 memory schema",ok:false,severity:"error"});}finally{s?.close();}return {name:"Distill",status:N(n),metrics:n}}function te(e,t){return (t.openDatabase??(o=>new(es())(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 fe(e,t){return M(e,t)?new Set(e.prepare(`PRAGMA table_info(${t})`).all().map(n=>n.name).filter(n=>typeof n=="string")):new Set}function J(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function ns(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function Yn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function El(e){let t=Yn(ns(e.output)),n=Yn(t?.data),o=typeof t?.status=="string"?t.status:void 0,r=typeof e.metric_status=="string"?e.metric_status:void 0,i=!(!!e.blocked&&typeof e.block_reason=="string"&&e.block_reason.startsWith("DEVFLOW_"))&&(!!e.error||!!e.failure_category||t?.ok===false||t?.success===false||t?.isError===true||!!t?.error||o==="failed"||o==="rejected"||r==="error"),a=!i&&(t?.degraded===true||!!t?.degradation||n?.degraded===true||o==="degraded"||r==="degraded");return {failed:i,degraded:a}}function Rl(e){let t=ns(e);if(typeof t=="string"&&t.trim())return [t.trim()];if(Array.isArray(t))return t.filter(o=>typeof o=="string"&&o.trim().length>0).map(o=>o.trim());let n=Yn(t);return n?Object.entries(n).filter(([,o])=>typeof o=="number"&&o>0).map(([o])=>o):[]}function Tr(e,t){return t===0?0:e/t}function Bn(e,t){return e===0?1:t/e}async function Pl(e,t){let n=[],o=null,r=null,s=join$1(e,".codegraph","codegraph.db");if(!existsSync$1(s))n.push({key:"codegraph_db",value:"missing",target:s,ok:false,severity:"warning"});else {let g;try{g=te(s,t),M(g,"nodes")?(o=J(g,"SELECT COUNT(*) count FROM nodes"),n.push({key:"codegraph_nodes",value:o,ok:!0,severity:"info"})):n.push({key:"codegraph_nodes",value:"nodes table missing",target:">= 0",ok:!1,severity:"warning"});let f=Math.max(0,(t.now??Date.now)()-statSync$1(s).mtimeMs);n.push({key:"index_freshness_ms",value:f,target:"recently updated codegraph database",ok:!0,severity:"info"});}catch(f){n.push({key:"codegraph_db_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let i=join$1(e,".devflow","symbols-vec.db");if(!existsSync$1(i))n.push({key:"symbols_vectors_db",value:"missing",target:i,ok:false,severity:"warning"});else {let g;try{g=te(i,t);let f=M(g,"symbols_vec_rowids")?"symbols_vec_rowids":M(g,"symbol_sources")?"symbol_sources":null;f?(r=J(g,`SELECT COUNT(*) count FROM ${f}`),n.push({key:"symbols_vectors",value:r,ok:!0,severity:"info"})):n.push({key:"symbols_vectors",value:"vector metadata missing",target:">= 0",ok:!1,severity:"warning"});}catch(f){n.push({key:"symbols_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}if(o!==null&&r!==null){let g=Bn(o,r);n.push({key:"symbols_vector_coverage",value:g,target:">= 0.90",ok:g>=.9,severity:"warning"});}let a=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(a))n.push({key:"knowledge_vectors_db",value:"missing",target:a,ok:false,severity:"warning"});else {let g;try{g=te(a,t);let p=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(m=>!M(g,m));if(p.length>0)n.push({key:"knowledge_vector_schema",value:p,target:[],ok:!1,severity:"warning"});else {let h=fe(g,"knowledge_docs").has("status")?"AND d.status = 'active'":"",y=J(g,`
58
+ `).get();n.push({key:"duplicate_observation_title_groups",value:Number(w.group_count),target:0,ok:Number(w.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(w.row_count),target:0,ok:Number(w.row_count)===0,severity:"error"});}catch(i){n.push({key:"database_read",value:i.message,target:"readable Task 2 memory schema",ok:false,severity:"error"});}finally{s?.close();}return {name:"Distill",status:T(n),metrics:n}}function ee(e,t){return (t.openDatabase??(o=>new(ns())(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 fe(e,t){return M(e,t)?new Set(e.prepare(`PRAGMA table_info(${t})`).all().map(n=>n.name).filter(n=>typeof n=="string")):new Set}function B(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function rs(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function Yn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Ol(e){let t=Yn(rs(e.output)),n=Yn(t?.data),o=typeof t?.status=="string"?t.status:void 0,r=typeof e.metric_status=="string"?e.metric_status:void 0,i=!(!!e.blocked&&typeof e.block_reason=="string"&&e.block_reason.startsWith("DEVFLOW_"))&&(!!e.error||!!e.failure_category||t?.ok===false||t?.success===false||t?.isError===true||!!t?.error||o==="failed"||o==="rejected"||r==="error"),a=!i&&(t?.degraded===true||!!t?.degradation||n?.degraded===true||o==="degraded"||r==="degraded");return {failed:i,degraded:a}}function $l(e){let t=rs(e);if(typeof t=="string"&&t.trim())return [t.trim()];if(Array.isArray(t))return t.filter(o=>typeof o=="string"&&o.trim().length>0).map(o=>o.trim());let n=Yn(t);return n?Object.entries(n).filter(([,o])=>typeof o=="number"&&o>0).map(([o])=>o):[]}function Ir(e,t){return t===0?0:e/t}function qn(e,t){return e===0?1:t/e}async function Al(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 d;try{d=ee(s,t),M(d,"nodes")?(o=B(d,"SELECT COUNT(*) count FROM nodes"),n.push({key:"codegraph_nodes",value:o,ok:!0,severity:"info"})):n.push({key:"codegraph_nodes",value:"nodes table missing",target:">= 0",ok:!1,severity:"warning"});let m=Math.max(0,(t.now??Date.now)()-statSync$1(s).mtimeMs);n.push({key:"index_freshness_ms",value:m,target:"recently updated codegraph database",ok:!0,severity:"info"});}catch(m){n.push({key:"codegraph_db_read",value:m.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{d?.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 d;try{d=ee(i,t);let m=M(d,"symbols_vec_rowids")?"symbols_vec_rowids":M(d,"symbol_sources")?"symbol_sources":null;m?(r=B(d,`SELECT COUNT(*) count FROM ${m}`),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(m){n.push({key:"symbols_vectors_read",value:m.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{d?.close();}}if(o!==null&&r!==null){let d=qn(o,r);n.push({key:"symbols_vector_coverage",value:d,target:">= 0.90",ok:d>=.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 d;try{d=ee(a,t);let f=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(p=>!M(d,p));if(f.length>0)n.push({key:"knowledge_vector_schema",value:f,target:[],ok:!1,severity:"warning"});else {let h=fe(d,"knowledge_docs").has("status")?"AND d.status = 'active'":"",y=B(d,`
59
59
  SELECT COUNT(*) count
60
60
  FROM knowledge_chunks c
61
61
  JOIN knowledge_docs d ON d.id = c.doc_id
62
62
  WHERE 1 = 1 ${h}
63
- `),k=J(g,`
63
+ `),v=B(d,`
64
64
  SELECT COUNT(*) count
65
65
  FROM knowledge_vec_rowids v
66
66
  JOIN knowledge_chunks c ON c.id = v.id
67
67
  JOIN knowledge_docs d ON d.id = c.doc_id
68
68
  WHERE 1 = 1 ${h}
69
- `),C=Bn(y,k),b=g.prepare(`
69
+ `),E=qn(y,v),w=d.prepare(`
70
70
  SELECT d.source source, COUNT(c.id) chunks,
71
71
  SUM(CASE WHEN v.id IS NOT NULL THEN 1 ELSE 0 END) vectors
72
72
  FROM knowledge_docs d
@@ -74,43 +74,43 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
74
74
  LEFT JOIN knowledge_vec_rowids v ON v.id = c.id
75
75
  WHERE 1 = 1 ${h}
76
76
  GROUP BY d.source ORDER BY d.source
77
- `).all().map(S=>{let T=Number(S.chunks),z=Number(S.vectors);return {source:S.source,chunks:T,vectors:z,coverage:Bn(T,z)}});n.push({key:"knowledge_chunks",value:y,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:k,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:C,target:">= 0.95",ok:C>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:b,target:"every source >= 0.95",ok:b.every(S=>S.coverage>=.95),severity:"warning"});}}catch(f){n.push({key:"knowledge_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let c=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(c))n.push({key:"observation_vectors_db",value:"missing",target:c,ok:false,severity:"warning"});else {let g;try{if(g=te(c,t),!M(g,"observations")||!M(g,"embeddings"))n.push({key:"observation_vector_schema",value:"observations/embeddings missing",target:"Batch 2 vector schema",ok:!1,severity:"warning"});else {let f=fe(g,"observations"),p=f.has("quality_status")&&f.has("resolution_state"),h=J(g,`SELECT COUNT(*) count FROM observations ${p?"WHERE quality_status = 'accepted' AND resolution_state <> 'superseded'":""}`),y=J(g,`
77
+ `).all().map(S=>{let I=Number(S.chunks),z=Number(S.vectors);return {source:S.source,chunks:I,vectors:z,coverage:qn(I,z)}});n.push({key:"knowledge_chunks",value:y,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:v,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:E,target:">= 0.95",ok:E>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:w,target:"every source >= 0.95",ok:w.every(S=>S.coverage>=.95),severity:"warning"});}}catch(m){n.push({key:"knowledge_vectors_read",value:m.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{d?.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 d;try{if(d=ee(c,t),!M(d,"observations")||!M(d,"embeddings"))n.push({key:"observation_vector_schema",value:"observations/embeddings missing",target:"Batch 2 vector schema",ok:!1,severity:"warning"});else {let m=fe(d,"observations"),f=m.has("quality_status")&&m.has("resolution_state"),h=B(d,`SELECT COUNT(*) count FROM observations ${f?"WHERE quality_status = 'accepted' AND resolution_state <> 'superseded'":""}`),y=B(d,`
78
78
  SELECT COUNT(DISTINCT e.source_id) count
79
79
  FROM embeddings e JOIN observations o ON o.id = e.source_id
80
80
  WHERE e.source_type = 'observation'
81
- ${p?"AND o.quality_status = 'accepted' AND o.resolution_state <> 'superseded'":""}
82
- `),k=Math.max(0,h-y);n.push({key:"observations",value:h,ok:!0,severity:"info"}),n.push({key:"observation_vectors",value:y,ok:!0,severity:"info"}),n.push({key:"observation_vectors_missing",value:k,target:0,ok:k===0,severity:"warning"});}}catch(f){n.push({key:"observation_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let l=(t.now??Date.now)(),u=join$1(t.homePath??homedir$1(),".devflow","errors","embedder.log"),d=0;if(existsSync$1(u))try{let g=l-864e5;d=readFileSync$1(u,"utf8").split(`
83
- `).filter(f=>{let p=/^\[([^\]]+)\]/.exec(f);return p?Date.parse(p[1])>=g:!1}).length;}catch(g){n.push({key:"embedder_error_log_read",value:g.message,target:"readable error log",ok:false,severity:"error"});}n.push({key:"embedder_errors_24h",value:d,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let g=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:g.state,modelId:g.modelId,revision:g.revision},target:{state:"ready"},ok:g.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:g.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:g.missingFiles,corruptFiles:g.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:g.missingFiles.length===0&&g.corruptFiles.length===0,severity:"warning"});}catch(g){n.push({key:"embedding_model_inspection",value:g.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:N(n),metrics:n}}function Cl(e,t,n){let o=[],r=n.homePath??homedir$1(),s=n.homePath?join$1(r,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(r),i=(n.now??Date.now)()-1440*60*1e3,a=(n.now??Date.now)(),c=t?"error":"warning";if(!existsSync$1(s))o.push({key:"global_telemetry_db",value:"missing",target:s,ok:false,severity:"warning"});else {let m;try{m=te(s,n),o.push({key:"global_telemetry_db",value:s,ok:!0,severity:"info"});for(let[D,I]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let F=M(m,I)?J(m,`SELECT COUNT(*) count FROM ${I} WHERE created_at >= ?`,i):0;o.push({key:D,value:F,ok:!0,severity:"info"});}let h=M(m,"telemetry_failures")?J(m,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",i):0;o.push({key:"telemetry_failures_24h",value:h,target:0,ok:h===0,severity:c});let y=fe(m,"sessions"),k=fe(m,"tool_call_events"),C=fe(m,"skill_executions"),v=["id","project_root","started_at","status"].every(D=>y.has(D));if(o.push({key:"telemetry_session_schema",value:v?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:v,severity:"error"}),v){let D=J(m,`
81
+ ${f?"AND o.quality_status = 'accepted' AND o.resolution_state <> 'superseded'":""}
82
+ `),v=Math.max(0,h-y);n.push({key:"observations",value:h,ok:!0,severity:"info"}),n.push({key:"observation_vectors",value:y,ok:!0,severity:"info"}),n.push({key:"observation_vectors_missing",value:v,target:0,ok:v===0,severity:"warning"});}}catch(m){n.push({key:"observation_vectors_read",value:m.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{d?.close();}}let l=(t.now??Date.now)(),u=join$1(getDevFlowStateRoot(ie(t)),"errors","embedder.log"),g=0;if(existsSync$1(u))try{let d=l-864e5;g=readFileSync$1(u,"utf8").split(`
83
+ `).filter(m=>{let f=/^\[([^\]]+)\]/.exec(m);return f?Date.parse(f[1])>=d:!1}).length;}catch(d){n.push({key:"embedder_error_log_read",value:d.message,target:"readable error log",ok:false,severity:"error"});}n.push({key:"embedder_errors_24h",value:g,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let d=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:d.state,modelId:d.modelId,revision:d.revision},target:{state:"ready"},ok:d.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:d.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:d.missingFiles,corruptFiles:d.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:d.missingFiles.length===0&&d.corruptFiles.length===0,severity:"warning"});}catch(d){n.push({key:"embedding_model_inspection",value:d.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:T(n),metrics:n}}function xl(e,t,n){let o=[],r=Kt(n),s=(n.now??Date.now)()-1440*60*1e3,i=(n.now??Date.now)(),a=t?"error":"warning";if(!existsSync$1(r))o.push({key:"global_telemetry_db",value:"missing",target:r,ok:false,severity:"warning"});else {let f;try{f=ee(r,n),o.push({key:"global_telemetry_db",value:r,ok:!0,severity:"info"});for(let[D,x]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let F=M(f,x)?B(f,`SELECT COUNT(*) count FROM ${x} WHERE created_at >= ?`,s):0;o.push({key:D,value:F,ok:!0,severity:"info"});}let p=M(f,"telemetry_failures")?B(f,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",s):0;o.push({key:"telemetry_failures_24h",value:p,target:0,ok:p===0,severity:a});let h=fe(f,"sessions"),y=fe(f,"tool_call_events"),v=fe(f,"skill_executions"),E=["id","project_root","started_at","status"].every(D=>h.has(D));if(o.push({key:"telemetry_session_schema",value:E?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:E,severity:"error"}),E){let D=B(f,`
84
84
  SELECT COUNT(*) count FROM sessions
85
85
  WHERE project_root = ? AND started_at >= ?
86
- `,e,i);o.push({key:"session_start_evidence_24h",value:D,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let I=J(m,`
86
+ `,e,s);o.push({key:"session_start_evidence_24h",value:D,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let x=B(f,`
87
87
  SELECT COUNT(*) count FROM sessions
88
88
  WHERE project_root = ? AND status = 'running' AND started_at < ?
89
- `,e,(n.now??Date.now)()-Gn);o.push({key:"stale_telemetry_sessions",value:I,target:0,ok:I===0,severity:"error"});let F=m.prepare(`
89
+ `,e,(n.now??Date.now)()-Gn);o.push({key:"stale_telemetry_sessions",value:x,target:0,ok:x===0,severity:"error"});let F=f.prepare(`
90
90
  SELECT status, COUNT(*) count
91
91
  FROM sessions
92
92
  WHERE project_root = ?
93
93
  GROUP BY status
94
- `).all(e),j={running:0,completed:0,failed:0};for(let L of F)L.status in j&&(j[L.status]=Number(L.count));let G=j.running+j.completed+j.failed,ee=j.completed+j.failed;if(o.push({key:"project_session_closure_state",value:{total:G,...j,closed:ee,closureRate:G===0?1:ee/G},target:"running sessions close through SessionEnd",ok:!0,severity:"info"}),M(m,"devflow_session_closures")){let L=m.prepare(`
94
+ `).all(e),N={running:0,completed:0,failed:0};for(let L of F)L.status in N&&(N[L.status]=Number(L.count));let V=N.running+N.completed+N.failed,X=N.completed+N.failed;if(o.push({key:"project_session_closure_state",value:{total:V,...N,closed:X,closureRate:V===0?1:X/V},target:"running sessions close through SessionEnd",ok:!0,severity:"info"}),M(f,"devflow_session_closures")){let L=f.prepare(`
95
95
  SELECT state, COUNT(*) count
96
96
  FROM devflow_session_closures
97
97
  WHERE project_root = ?
98
98
  GROUP BY state
99
- `).all(e),K={active:0,closing:0,closed:0,closed_with_pending_work:0};for(let Fe of L)Fe.state in K&&(K[Fe.state]=Number(Fe.count));let le=J(m,`
99
+ `).all(e),q={active:0,closing:0,closed:0,closed_with_pending_work:0};for(let Fe of L)Fe.state in q&&(q[Fe.state]=Number(Fe.count));let le=B(f,`
100
100
  SELECT COUNT(*) count
101
101
  FROM devflow_session_closures
102
102
  WHERE project_root = ? AND state = 'closing' AND updated_at < ?
103
- `,e,a-Gn);o.push({key:"durable_session_closure_state",value:{...K,staleClosing:le},target:{active:0,closing:0,staleClosing:0},ok:K.active===0&&K.closing===0&&le===0,severity:c});}else o.push({key:"durable_session_closure_state",value:"closure table missing",target:"active -> closing -> closed | closed_with_pending_work",ok:!1,severity:c});let ye=0;k.has("session_id")&&(ye=J(m,`
103
+ `,e,i-Gn);o.push({key:"durable_session_closure_state",value:{...q,staleClosing:le},target:{active:0,closing:0,staleClosing:0},ok:q.active===0&&q.closing===0&&le===0,severity:a});}else o.push({key:"durable_session_closure_state",value:"closure table missing",target:"active -> closing -> closed | closed_with_pending_work",ok:!1,severity:a});let ye=0;y.has("session_id")&&(ye=B(f,`
104
104
  SELECT COUNT(*) count
105
105
  FROM tool_call_events event
106
106
  LEFT JOIN sessions session ON session.id = event.session_id
107
107
  WHERE TRIM(COALESCE(event.session_id, '')) = '' OR session.id IS NULL
108
- `));let ce=0;if(C.has("session_id")&&(ce=J(m,`
108
+ `));let ce=0;if(v.has("session_id")&&(ce=B(f,`
109
109
  SELECT COUNT(*) count
110
110
  FROM skill_executions execution
111
111
  LEFT JOIN sessions session ON session.id = execution.session_id
112
112
  WHERE TRIM(COALESCE(execution.session_id, '')) = '' OR session.id IS NULL
113
- `)),o.push({key:"orphan_telemetry_events",value:{toolCalls:ye,skillExecutions:ce},target:{toolCalls:0,skillExecutions:0},ok:ye===0&&ce===0,severity:"error"}),["session_id","status","started_at"].every(L=>C.has(L))){let L=a-18e5,K=m.prepare(`
113
+ `)),o.push({key:"orphan_telemetry_events",value:{toolCalls:ye,skillExecutions:ce},target:{toolCalls:0,skillExecutions:0},ok:ye===0&&ce===0,severity:"error"}),["session_id","status","started_at"].every(L=>v.has(L))){let L=i-18e5,q=f.prepare(`
114
114
  SELECT
115
115
  COUNT(*) total,
116
116
  COALESCE(SUM(CASE WHEN execution.started_at < ? THEN 1 ELSE 0 END), 0) older_than_30m,
@@ -120,7 +120,7 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
120
120
  WHERE session.project_root = ?
121
121
  AND execution.status = 'running'
122
122
  AND (execution.started_at < ? OR session.status <> 'running')
123
- `).get(L,e,L),le=Number(K?.total??0);o.push({key:"stale_skill_executions",value:{total:le,olderThan30m:Number(K?.older_than_30m??0),attachedToNonRunningSession:Number(K?.non_running_session??0)},target:{total:0},ok:le===0,severity:"error"});}else o.push({key:"skill_execution_schema",value:"status, started_at, or session_id column missing",target:"canonical Skill execution lifecycle schema",ok:!1,severity:"warning"});}if(!M(m,"devflow_work_items"))o.push({key:"work_queue_schema",value:"devflow_work_items table missing; queue diagnostics degraded",target:"canonical global work queue schema",ok:!1,severity:"error"});else {let D=fe(m,"devflow_work_items"),F=["project_root","state","lease_expires_at","created_at","completed_at"].filter(j=>!D.has(j));if(F.length>0)o.push({key:"work_queue_schema",value:{missingColumns:F,diagnostic:"queue diagnostics degraded"},target:"canonical global work queue schema",ok:!1,severity:"error"});else {let j=m.prepare(`
123
+ `).get(L,e,L),le=Number(q?.total??0);o.push({key:"stale_skill_executions",value:{total:le,olderThan30m:Number(q?.older_than_30m??0),attachedToNonRunningSession:Number(q?.non_running_session??0)},target:{total:0},ok:le===0,severity:"error"});}else o.push({key:"skill_execution_schema",value:"status, started_at, or session_id column missing",target:"canonical Skill execution lifecycle schema",ok:!1,severity:"warning"});}if(!M(f,"devflow_work_items"))o.push({key:"work_queue_schema",value:"devflow_work_items table missing; queue diagnostics degraded",target:"canonical global work queue schema",ok:!1,severity:"error"});else {let D=fe(f,"devflow_work_items"),F=["project_root","state","lease_expires_at","created_at","completed_at"].filter(N=>!D.has(N));if(F.length>0)o.push({key:"work_queue_schema",value:{missingColumns:F,diagnostic:"queue diagnostics degraded"},target:"canonical global work queue schema",ok:!1,severity:"error"});else {let N=f.prepare(`
124
124
  SELECT
125
125
  COALESCE(SUM(CASE WHEN state IN ('pending', 'leased', 'failed') THEN 1 ELSE 0 END), 0) queue_depth,
126
126
  COALESCE(SUM(CASE WHEN state = 'pending' THEN 1 ELSE 0 END), 0) pending,
@@ -132,7 +132,7 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
132
132
  MAX(CASE WHEN state = 'completed' THEN completed_at END) last_successful_drain_at
133
133
  FROM devflow_work_items
134
134
  WHERE project_root = ?
135
- `).get(a,e),G=Number(j?.queue_depth??0),ee=Number(j?.pending??0),ye=Number(j?.leased??0),ce=Number(j?.failed??0),ve=Number(j?.dead_letters??0),L=Number(j?.expired_leases??0),K=j?.oldest_pending_at==null?void 0:Number(j.oldest_pending_at),le=j?.last_successful_drain_at==null?void 0:Number(j.last_successful_drain_at);o.push({key:"work_queue_schema",value:"canonical",target:"canonical global work queue schema",ok:!0,severity:"info"}),o.push({key:"work_queue_depth",value:G,ok:!0,severity:"info"}),o.push({key:"work_queue_pending",value:ee,ok:!0,severity:"info"}),o.push({key:"work_queue_leased",value:ye,ok:!0,severity:"info"}),o.push({key:"work_queue_failed",value:ce,target:0,ok:ce===0,severity:"warning"}),o.push({key:"work_queue_oldest_pending_age_ms",value:K===void 0?0:Math.max(0,a-K),ok:!0,severity:"info"}),o.push({key:"work_queue_dead_letters",value:ve,target:0,ok:ve===0,severity:"error"}),o.push({key:"work_queue_expired_leases",value:L,target:0,ok:L===0,severity:"error"}),o.push({key:"work_queue_last_successful_drain_at",value:le??null,ok:!0,severity:"info"});}}if(!M(m,"devflow_workflow_workers")||!M(m,"devflow_merge_queue"))o.push({key:"workflow_worker_schema",value:"worker or merge queue table missing",target:"canonical isolated worker lifecycle schema",ok:!1,severity:"warning"});else {let D=m.prepare(`
135
+ `).get(i,e),V=Number(N?.queue_depth??0),X=Number(N?.pending??0),ye=Number(N?.leased??0),ce=Number(N?.failed??0),ve=Number(N?.dead_letters??0),L=Number(N?.expired_leases??0),q=N?.oldest_pending_at==null?void 0:Number(N.oldest_pending_at),le=N?.last_successful_drain_at==null?void 0:Number(N.last_successful_drain_at);o.push({key:"work_queue_schema",value:"canonical",target:"canonical global work queue schema",ok:!0,severity:"info"}),o.push({key:"work_queue_depth",value:V,ok:!0,severity:"info"}),o.push({key:"work_queue_pending",value:X,ok:!0,severity:"info"}),o.push({key:"work_queue_leased",value:ye,ok:!0,severity:"info"}),o.push({key:"work_queue_failed",value:ce,target:0,ok:ce===0,severity:"warning"}),o.push({key:"work_queue_oldest_pending_age_ms",value:q===void 0?0:Math.max(0,i-q),ok:!0,severity:"info"}),o.push({key:"work_queue_dead_letters",value:ve,target:0,ok:ve===0,severity:"error"}),o.push({key:"work_queue_expired_leases",value:L,target:0,ok:L===0,severity:"error"}),o.push({key:"work_queue_last_successful_drain_at",value:le??null,ok:!0,severity:"info"});}}if(!M(f,"devflow_workflow_workers")||!M(f,"devflow_merge_queue"))o.push({key:"workflow_worker_schema",value:"worker or merge queue table missing",target:"canonical isolated worker lifecycle schema",ok:!1,severity:"warning"});else {let D=f.prepare(`
136
136
  SELECT
137
137
  COUNT(*) total,
138
138
  COALESCE(SUM(CASE WHEN state IN ('leased','starting','running','reported','verifying','merge_ready') THEN 1 ELSE 0 END), 0) active,
@@ -140,62 +140,62 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
140
140
  COALESCE(SUM(CASE WHEN lease_expires_at IS NOT NULL AND lease_expires_at <= ?
141
141
  AND state IN ('leased','starting','running','reported','verifying','merge_ready') THEN 1 ELSE 0 END), 0) lost_heartbeats
142
142
  FROM devflow_workflow_workers WHERE project_root = ?
143
- `).get(a,e),I=J(m,`
143
+ `).get(i,e),x=B(f,`
144
144
  SELECT COUNT(*) count FROM devflow_merge_queue
145
145
  WHERE project_root = ? AND state = 'conflict'
146
- `,e),F=m.prepare(`
146
+ `,e),F=f.prepare(`
147
147
  SELECT MIN(created_at) oldest FROM devflow_merge_queue
148
148
  WHERE project_root = ? AND state IN ('waiting','ready')
149
- `).get(e),j=Number(D?.active??0),G=Number(D?.held??0),ee=Number(D?.lost_heartbeats??0);o.push({key:"workflow_workers_active",value:j,ok:!0,severity:"info"}),o.push({key:"workflow_workers_held",value:G,target:0,ok:G===0,severity:"warning"}),o.push({key:"workflow_workers_lost_heartbeats",value:ee,target:0,ok:ee===0,severity:"error"}),o.push({key:"workflow_merge_conflicts",value:I,target:0,ok:I===0,severity:"warning"}),o.push({key:"workflow_merge_queue_oldest_age_ms",value:F?.oldest==null?0:Math.max(0,a-Number(F.oldest)),target:"bounded while workers are active",ok:!0,severity:"info"});}let b=n.env?.DEVFLOW_STATE_DIR??join$1(r,".devflow","state",Jt(e)),T=Object.fromEntries(["session-start-pending","memory-turn-pending","session-finalize-pending"].map(D=>{let I=join$1(b,D),F=existsSync$1(I)?readdirSync(I).filter(j=>j.includes(".json")).length:0;return [D,F]})),z=Object.values(T).reduce((D,I)=>D+I,0);if(o.push({key:"hook_spool_backlog",value:{total:z,...T},target:{total:0},ok:z===0,severity:c}),M(m,"tool_call_events")){let D=v&&k.has("session_id"),I=fe(m,"tool_metrics"),F=k.has("event_id")&&I.has("tool_call_event_id")&&I.has("status"),j=[k.has("error")?"event.error":"NULL error",k.has("failure_category")?"event.failure_category":"NULL failure_category",k.has("output")?"event.output":"NULL output",k.has("blocked")?"event.blocked":"0 blocked",k.has("block_reason")?"event.block_reason":"NULL block_reason",D?"event_session.status session_status":"NULL session_status",F?"metric.status metric_status":"NULL metric_status"].join(", "),G=m.prepare(`
150
- SELECT ${j}
149
+ `).get(e),N=Number(D?.active??0),V=Number(D?.held??0),X=Number(D?.lost_heartbeats??0);o.push({key:"workflow_workers_active",value:N,ok:!0,severity:"info"}),o.push({key:"workflow_workers_held",value:V,target:0,ok:V===0,severity:"warning"}),o.push({key:"workflow_workers_lost_heartbeats",value:X,target:0,ok:X===0,severity:"error"}),o.push({key:"workflow_merge_conflicts",value:x,target:0,ok:x===0,severity:"warning"}),o.push({key:"workflow_merge_queue_oldest_age_ms",value:F?.oldest==null?0:Math.max(0,i-Number(F.oldest)),target:"bounded while workers are active",ok:!0,severity:"info"});}let k=getProjectStateDir(e,ie(n)),S=Object.fromEntries(["session-start-pending","memory-turn-pending","session-finalize-pending"].map(D=>{let x=join$1(k,D),F=existsSync$1(x)?readdirSync(x).filter(N=>N.includes(".json")).length:0;return [D,F]})),I=Object.values(S).reduce((D,x)=>D+x,0);if(o.push({key:"hook_spool_backlog",value:{total:I,...S},target:{total:0},ok:I===0,severity:a}),M(f,"tool_call_events")){let D=E&&y.has("session_id"),x=fe(f,"tool_metrics"),F=y.has("event_id")&&x.has("tool_call_event_id")&&x.has("status"),N=[y.has("error")?"event.error":"NULL error",y.has("failure_category")?"event.failure_category":"NULL failure_category",y.has("output")?"event.output":"NULL output",y.has("blocked")?"event.blocked":"0 blocked",y.has("block_reason")?"event.block_reason":"NULL block_reason",D?"event_session.status session_status":"NULL session_status",F?"metric.status metric_status":"NULL metric_status"].join(", "),V=f.prepare(`
150
+ SELECT ${N}
151
151
  FROM tool_call_events event
152
152
  ${F?"LEFT JOIN tool_metrics metric ON metric.tool_call_event_id = event.event_id":""}
153
153
  ${D?"JOIN sessions event_session ON event_session.id = event.session_id":""}
154
154
  WHERE event.timestamp >= ?
155
155
  ${D?"AND event_session.project_root = ?":""}
156
- `).all(...D?[i,e]:[i]),ee=G.map(El),ye=ee.filter(L=>L.failed).length,ce=ee.filter((L,K)=>L.failed&&G[K]?.session_status!=="completed").length,ve=ee.filter(L=>L.degraded).length;if(o.push({key:"semantic_tool_calls_24h",value:G.length,ok:!0,severity:"info"}),o.push({key:"semantic_tool_failures_24h",value:ye,target:"trend",ok:!0,severity:"info"}),o.push({key:"unresolved_semantic_tool_failures_24h",value:ce,target:0,ok:ce===0,severity:c}),o.push({key:"semantic_tool_degradations_24h",value:ve,target:0,ok:ve===0,severity:c}),o.push({key:"semantic_tool_failure_rate_24h",value:Tr(ye,G.length),target:"trend",ok:!0,severity:"info"}),o.push({key:"semantic_tool_degradation_rate_24h",value:Tr(ve,G.length),target:0,ok:ve===0,severity:c}),o.push({key:"semantic_tool_project_scope",value:D?"project":"global fallback; session identity unavailable",target:"project",ok:D,severity:"warning"}),k.has("failure_category")){let L={};for(let ue of G)typeof ue.failure_category!="string"||!ue.failure_category.trim()||(L[ue.failure_category]=(L[ue.failure_category]??0)+1);let K=G.filter((ue,ti)=>ee[ti]?.failed&&ue.session_status!=="completed"),le=K.filter(ue=>typeof ue.failure_category=="string"&&ue.failure_category.trim().length>0).length,Fe=K.length===0?1:le/K.length;o.push({key:"failure_categories_24h",value:L,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:Fe,target:">= 0.80",ok:Fe>=.8,severity:c});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:c});}let oe=v&&["session_id","started_at","fallback_count","fallback_reasons"].every(D=>C.has(D)),$=0,U={};if(oe){let D=m.prepare(`
156
+ `).all(...D?[s,e]:[s]),X=V.map(Ol),ye=X.filter(L=>L.failed).length,ce=X.filter((L,q)=>L.failed&&V[q]?.session_status!=="completed").length,ve=X.filter(L=>L.degraded).length;if(o.push({key:"semantic_tool_calls_24h",value:V.length,ok:!0,severity:"info"}),o.push({key:"semantic_tool_failures_24h",value:ye,target:"trend",ok:!0,severity:"info"}),o.push({key:"unresolved_semantic_tool_failures_24h",value:ce,target:0,ok:ce===0,severity:a}),o.push({key:"semantic_tool_degradations_24h",value:ve,target:0,ok:ve===0,severity:a}),o.push({key:"semantic_tool_failure_rate_24h",value:Ir(ye,V.length),target:"trend",ok:!0,severity:"info"}),o.push({key:"semantic_tool_degradation_rate_24h",value:Ir(ve,V.length),target:0,ok:ve===0,severity:a}),o.push({key:"semantic_tool_project_scope",value:D?"project":"global fallback; session identity unavailable",target:"project",ok:D,severity:"warning"}),y.has("failure_category")){let L={};for(let ue of V)typeof ue.failure_category!="string"||!ue.failure_category.trim()||(L[ue.failure_category]=(L[ue.failure_category]??0)+1);let q=V.filter((ue,oi)=>X[oi]?.failed&&ue.session_status!=="completed"),le=q.filter(ue=>typeof ue.failure_category=="string"&&ue.failure_category.trim().length>0).length,Fe=q.length===0?1:le/q.length;o.push({key:"failure_categories_24h",value:L,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:Fe,target:">= 0.80",ok:Fe>=.8,severity:a});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:a});}let z=E&&["session_id","started_at","fallback_count","fallback_reasons"].every(D=>v.has(D)),Z=0,O={};if(z){let D=f.prepare(`
157
157
  SELECT execution.fallback_count, execution.fallback_reasons
158
158
  FROM skill_executions execution
159
159
  JOIN sessions session ON session.id = execution.session_id
160
160
  WHERE session.project_root = ? AND execution.started_at >= ?
161
- `).all(e,i);for(let I of D){$+=Number(I.fallback_count??0);for(let F of Rl(I.fallback_reasons))U[F]=(U[F]??0)+1;}}let X=0;if(M(m,"devflow_hook_fallbacks")){let D=m.prepare(`
161
+ `).all(e,s);for(let x of D){Z+=Number(x.fallback_count??0);for(let F of $l(x.fallback_reasons))O[F]=(O[F]??0)+1;}}let K=0;if(M(f,"devflow_hook_fallbacks")){let D=f.prepare(`
162
162
  SELECT reason, COUNT(*) count
163
163
  FROM devflow_hook_fallbacks
164
164
  WHERE project_root = ? AND created_at >= ?
165
165
  GROUP BY reason ORDER BY reason
166
- `).all(e,i);for(let I of D){let F=Number(I.count);X+=F,U[`hook:${I.reason}`]=F;}}o.push({key:"skill_fallbacks_24h",value:$,target:0,ok:$===0,severity:"warning"}),o.push({key:"hook_fallbacks_24h",value:X,target:0,ok:X===0,severity:"warning"}),o.push({key:"fallback_reasons_24h",value:U,target:{},ok:Object.keys(U).length===0,severity:"warning"});}catch(h){o.push({key:"global_telemetry_db_read",value:h.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}let l=[...new Set([join$1(dirname(s),"telemetry-cache"),join$1(r,".devflow","telemetry-cache")])],u=0;try{u=l.reduce((m,h)=>m+(existsSync$1(h)?readdirSync(h).filter(y=>y.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:u,target:0,ok:u===0,severity:c});}catch(m){o.push({key:"telemetry_cache_read",value:m.message,target:"readable cache directory",ok:false,severity:"error"});}let d=join$1(e,".devflow","devflow.db"),g=existsSync$1(d);o.push({key:"project_local_telemetry_db",value:g?d:"absent",target:"absent",ok:!g,severity:c});let f=join$1(e,".codegraph","codegraph.db"),p=[];if(existsSync$1(f)){let m;try{m=te(f,n),p=m.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(h=>h.name);}catch(h){o.push({key:"codegraph_telemetry_read",value:h.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}return o.push({key:"codegraph_devflow_tables",value:p,target:[],ok:p.length===0,severity:c}),{name:"Telemetry",status:N(o),metrics:o}}function Mr(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function os(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 Dl(e){let t=[],n=e.homePath??homedir$1(),o=e.env??process.env,r=join$1(n,".devflow","keys"),s=[["local_api_key","DEVFLOW_API_KEY","local.key"],["local_hmac_secret","DEVFLOW_HMAC_SECRET","hmac.key"]];if(!s.some(([,u])=>!o[u]?.trim())&&!existsSync$1(r))t.push({key:"key_directory",value:"not required (environment overrides active)",ok:true,severity:"info"});else if(!existsSync$1(r))t.push({key:"key_directory",value:"missing",target:r,ok:false,severity:"warning"});else try{let u=lstatSync(r),d=Mr(r),g=u.isDirectory()&&!u.isSymbolicLink(),f=process.platform==="win32"||d==="700";t.push({key:"key_directory",value:{path:r,mode:d},target:{type:"directory",mode:"700"},ok:g&&f,severity:g?"warning":"error"});}catch(u){t.push({key:"key_directory",value:u.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[u,d,g]of s){if(o[d]?.trim()){t.push({key:`${u}_source`,value:d,target:"environment override or generated key file",ok:true,severity:"info"});continue}let f=join$1(r,g);if(!existsSync$1(f)){t.push({key:`${u}_source`,value:"missing",target:f,ok:false,severity:"warning"});continue}try{let p=lstatSync(f),m=Mr(f),h=readFileSync$1(f,"utf8").trim(),y=p.isFile()&&!p.isSymbolicLink();t.push({key:`${u}_source`,value:{path:f,mode:m,bytes:Buffer.byteLength(h)},target:{type:"regular file",mode:"400",nonempty:!0},ok:y&&h.length>0&&(process.platform==="win32"||m==="400"),severity:!y||h.length===0?"error":"warning"});}catch(p){t.push({key:`${u}_source`,value:p.message,target:"readable nonempty key file with mode 400",ok:false,severity:"error"});}}let a=join$1(n,".devflow","errors","compressor.log"),c=0,l=0;if(existsSync$1(a))try{let u=(e.now??Date.now)()-Ze;for(let d of readFileSync$1(a,"utf8").split(`
167
- `))if(d.trim())try{let g=JSON.parse(d),f=os(g.ts);f===null?l+=1:f>=u&&(c+=1);}catch{l+=1;}}catch(u){t.push({key:"compressor_error_log_read",value:u.message,target:"readable JSONL diagnostics",ok:false,severity:"error"});}return t.push({key:"compressor_errors_24h",value:c,target:0,ok:c===0,severity:"warning"}),t.push({key:"malformed_compressor_records",value:l,target:0,ok:l===0,severity:"error"}),{name:"Runtime security",status:N(t),metrics:t}}function Ol(e){let t=[],n=e.homePath??homedir$1(),o=getGlobalDevFlowDbPath(n);if(!existsSync$1(o))return t.push({key:"latest_benchmark",value:"missing global database",target:"completed baseline within 30 days",ok:false,severity:"warning"}),{name:"Benchmark",status:N(t),metrics:t};let r;try{if(r=te(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:N(t),metrics:t};let s=r.prepare(`
166
+ `).all(e,s);for(let x of D){let F=Number(x.count);K+=F,O[`hook:${x.reason}`]=F;}}o.push({key:"skill_fallbacks_24h",value:Z,target:0,ok:Z===0,severity:"warning"}),o.push({key:"hook_fallbacks_24h",value:K,target:0,ok:K===0,severity:"warning"}),o.push({key:"fallback_reasons_24h",value:O,target:{},ok:Object.keys(O).length===0,severity:"warning"});}catch(p){o.push({key:"global_telemetry_db_read",value:p.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{f?.close();}}let c=[join$1(dirname(r),"telemetry-cache")],l=0;try{l=c.reduce((f,p)=>f+(existsSync$1(p)?readdirSync(p).filter(h=>h.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:l,target:0,ok:l===0,severity:a});}catch(f){o.push({key:"telemetry_cache_read",value:f.message,target:"readable cache directory",ok:false,severity:"error"});}let u=join$1(e,".devflow","devflow.db"),g=existsSync$1(u);o.push({key:"project_local_telemetry_db",value:g?u:"absent",target:"absent",ok:!g,severity:a});let d=join$1(e,".codegraph","codegraph.db"),m=[];if(existsSync$1(d)){let f;try{f=ee(d,n),m=f.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{f?.close();}}return o.push({key:"codegraph_devflow_tables",value:m,target:[],ok:m.length===0,severity:a}),{name:"Telemetry",status:T(o),metrics:o}}function Lr(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function ss(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 Nl(e){let t=[],n=e.env??process.env,o=join$1(getDevFlowStateRoot(ie(e)),"keys"),r=[["local_api_key","DEVFLOW_API_KEY","local.key"],["local_hmac_secret","DEVFLOW_HMAC_SECRET","hmac.key"]];if(!r.some(([,l])=>!n[l]?.trim())&&!existsSync$1(o))t.push({key:"key_directory",value:"not required (environment overrides active)",ok:true,severity:"info"});else if(!existsSync$1(o))t.push({key:"key_directory",value:"missing",target:o,ok:false,severity:"warning"});else try{let l=lstatSync(o),u=Lr(o),g=l.isDirectory()&&!l.isSymbolicLink(),d=process.platform==="win32"||u==="700";t.push({key:"key_directory",value:{path:o,mode:u},target:{type:"directory",mode:"700"},ok:g&&d,severity:g?"warning":"error"});}catch(l){t.push({key:"key_directory",value:l.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[l,u,g]of r){if(n[u]?.trim()){t.push({key:`${l}_source`,value:u,target:"environment override or generated key file",ok:true,severity:"info"});continue}let d=join$1(o,g);if(!existsSync$1(d)){t.push({key:`${l}_source`,value:"missing",target:d,ok:false,severity:"warning"});continue}try{let m=lstatSync(d),f=Lr(d),p=readFileSync$1(d,"utf8").trim(),h=m.isFile()&&!m.isSymbolicLink();t.push({key:`${l}_source`,value:{path:d,mode:f,bytes:Buffer.byteLength(p)},target:{type:"regular file",mode:"400",nonempty:!0},ok:h&&p.length>0&&(process.platform==="win32"||f==="400"),severity:!h||p.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 i=join$1(getDevFlowStateRoot(ie(e)),"errors","compressor.log"),a=0,c=0;if(existsSync$1(i))try{let l=(e.now??Date.now)()-Qe;for(let u of readFileSync$1(i,"utf8").split(`
167
+ `))if(u.trim())try{let g=JSON.parse(u),d=ss(g.ts);d===null?c+=1:d>=l&&(a+=1);}catch{c+=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:a,target:0,ok:a===0,severity:"warning"}),t.push({key:"malformed_compressor_records",value:c,target:0,ok:c===0,severity:"error"}),{name:"Runtime security",status:T(t),metrics:t}}function jl(e){let t=[],n=Kt(e);if(!existsSync$1(n))return t.push({key:"latest_benchmark",value:"missing global database",target:"completed baseline within 30 days",ok:false,severity:"warning"}),{name:"Benchmark",status:T(t),metrics:t};let o;try{if(o=ee(n,e),!M(o,"benchmark_reports"))return t.push({key:"latest_benchmark",value:"benchmark_reports table missing",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:T(t),metrics:t};let r=o.prepare(`
168
168
  SELECT run_id, suite_id, suite_version, task_count, status, report_json, created_at
169
169
  FROM benchmark_reports
170
170
  ORDER BY created_at DESC
171
171
  LIMIT 1
172
- `).get();if(!s)return t.push({key:"latest_benchmark",value:"no reports",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:N(t),metrics:t};let i=null;try{if(typeof s.report_json!="string")throw new Error("report_json is not text");let u=JSON.parse(s.report_json);if(!Array.isArray(u.tasks))throw new Error("report tasks are missing");i=u.tasks.length;}catch(u){t.push({key:"benchmark_report_json",value:u.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let a=Number(s.task_count),c=Number(s.created_at),l=(e.now??Date.now)()-c;t.push({key:"latest_benchmark",value:{runId:s.run_id,suiteId:s.suite_id,suiteVersion:s.suite_version,status:s.status,createdAt:c},ok:s.status==="completed"&&Number.isFinite(c),severity:"error"}),t.push({key:"benchmark_task_count",value:a,target:">= 5",ok:Number.isInteger(a)&&a>=5&&i===a,severity:i===null?"error":"warning"}),t.push({key:"benchmark_age_days",value:Number.isFinite(l)?Number((l/Ze).toFixed(2)):null,target:"0-30",ok:Number.isFinite(l)&&l>=0&&l<=Zn,severity:l<0||!Number.isFinite(l)?"error":"warning"});}catch(s){t.push({key:"benchmark_database_read",value:s.message,target:"readable canonical benchmark database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Benchmark",status:N(t),metrics:t}}function $l(e,t){let n=[],o=t.homePath??homedir$1(),r=getGlobalDevFlowDbPath(o);if(!existsSync$1(r))return n.push({key:"retrieval_quality_report",value:"missing global database",target:"passing retrieval-quality report",ok:false,severity:"warning"}),{name:"Retrieval quality",status:N(n),metrics:n};let s;try{if(s=te(r,t),!M(s,"benchmark_reports"))throw new Error("benchmark_reports table missing");let i=s.prepare(`
172
+ `).get();if(!r)return t.push({key:"latest_benchmark",value:"no reports",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:T(t),metrics:t};let s=null;try{if(typeof r.report_json!="string")throw new Error("report_json is not text");let l=JSON.parse(r.report_json);if(!Array.isArray(l.tasks))throw new Error("report tasks are missing");s=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 i=Number(r.task_count),a=Number(r.created_at),c=(e.now??Date.now)()-a;t.push({key:"latest_benchmark",value:{runId:r.run_id,suiteId:r.suite_id,suiteVersion:r.suite_version,status:r.status,createdAt:a},ok:r.status==="completed"&&Number.isFinite(a),severity:"error"}),t.push({key:"benchmark_task_count",value:i,target:">= 5",ok:Number.isInteger(i)&&i>=5&&s===i,severity:s===null?"error":"warning"}),t.push({key:"benchmark_age_days",value:Number.isFinite(c)?Number((c/Qe).toFixed(2)):null,target:"0-30",ok:Number.isFinite(c)&&c>=0&&c<=Zn,severity:c<0||!Number.isFinite(c)?"error":"warning"});}catch(r){t.push({key:"benchmark_database_read",value:r.message,target:"readable canonical benchmark database",ok:false,severity:"error"});}finally{o?.close();}return {name:"Benchmark",status:T(t),metrics:t}}function Tl(e,t){let n=[],o=Kt(t);if(!existsSync$1(o))return n.push({key:"retrieval_quality_report",value:"missing global database",target:"passing retrieval-quality report",ok:false,severity:"warning"}),{name:"Retrieval quality",status:T(n),metrics:n};let r;try{if(r=ee(o,t),!M(r,"benchmark_reports"))throw new Error("benchmark_reports table missing");let s=r.prepare(`
173
173
  SELECT report_json, created_at
174
174
  FROM benchmark_reports
175
175
  WHERE suite_id = 'retrieval-quality' AND project_root = ?
176
176
  ORDER BY created_at DESC
177
177
  LIMIT 1
178
- `).get(e);if(!i?.report_json)return n.push({key:"retrieval_quality_report",value:"no project report",target:"run retrieval-quality benchmark for this project",ok:!1,severity:"warning"}),{name:"Retrieval quality",status:N(n),metrics:n};let a=JSON.parse(i.report_json),c=(t.now??Date.now)()-Number(i.created_at??0);n.push({key:"retrieval_quality_report",value:{status:a.qualityStatus,ageMs:c,diagnostics:a.diagnostics??[]},target:{status:"passed",maxAgeMs:Zn},ok:a.qualityStatus==="passed"&&c<=Zn,severity:a.qualityStatus==="failed"?"error":"warning"});for(let[l,u]of Object.entries(a.gates??{}))n.push({key:`retrieval_${l}`,value:a.metrics?.[l],target:a.thresholds?.[l],ok:u,severity:"error"});}catch(i){n.push({key:"retrieval_quality_read",value:i.message,target:"readable retrieval quality report",ok:false,severity:"error"});}finally{s?.close();}return {name:"Retrieval quality",status:N(n),metrics:n}}function Al(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 xl(e){let t=[],n=e.homePath??homedir$1(),o=[join$1(n,".devflow","errors","hook-fallback.log")],r=join$1(n,".devflow","logs","hook-fallback");if(existsSync$1(r))try{for(let y of readdirSync(r))y.endsWith(".log")&&o.push(join$1(r,y));}catch(y){t.push({key:"hook_fallback_directory_read",value:y.message,target:"readable fallback directory",ok:false,severity:"error"});}let s=(e.now??Date.now)()-Ze,i=0,a=0;for(let y of [...new Set(o)])if(existsSync$1(y))try{for(let k of readFileSync$1(y,"utf8").split(`
179
- `))if(k.trim())try{let C=JSON.parse(k),v=os(C.ts);v===null||typeof C.reason!="string"?a+=1:v>=s&&(i+=1);}catch{a+=1;}}catch(k){t.push({key:"hook_fallback_log_read",value:{path:y,error:k.message},target:"readable JSONL diagnostics",ok:false,severity:"error"});}t.push({key:"hook_fallback_events_24h",value:i,target:0,ok:i===0,severity:"warning"}),t.push({key:"malformed_hook_fallback_records",value:a,target:0,ok:a===0,severity:"error"});let c=e.homePath?join$1(n,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(n),l=0,u=0,d=null;if(existsSync$1(c)){let y;try{if(y=te(c,e),M(y,"telemetry_events")){let k=y.prepare(`
178
+ `).get(e);if(!s?.report_json)return n.push({key:"retrieval_quality_report",value:"no project report",target:"run retrieval-quality benchmark for this project",ok:!1,severity:"warning"}),{name:"Retrieval quality",status:T(n),metrics:n};let i=JSON.parse(s.report_json),a=(t.now??Date.now)()-Number(s.created_at??0);n.push({key:"retrieval_quality_report",value:{status:i.qualityStatus,ageMs:a,diagnostics:i.diagnostics??[]},target:{status:"passed",maxAgeMs:Zn},ok:i.qualityStatus==="passed"&&a<=Zn,severity:i.qualityStatus==="failed"?"error":"warning"});for(let[c,l]of Object.entries(i.gates??{}))n.push({key:`retrieval_${c}`,value:i.metrics?.[c],target:i.thresholds?.[c],ok:l,severity:"error"});}catch(s){n.push({key:"retrieval_quality_read",value:s.message,target:"readable retrieval quality report",ok:false,severity:"error"});}finally{r?.close();}return {name:"Retrieval quality",status:T(n),metrics:n}}function Il(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 Ml(e){let t=[];e.homePath??homedir$1();let o=getDevFlowStateRoot(ie(e)),r=[join$1(o,"errors","hook-fallback.log")],s=join$1(o,"logs","hook-fallback");if(existsSync$1(s))try{for(let v of readdirSync(s))v.endsWith(".log")&&r.push(join$1(s,v));}catch(v){t.push({key:"hook_fallback_directory_read",value:v.message,target:"readable fallback directory",ok:false,severity:"error"});}let i=(e.now??Date.now)()-Qe,a=0,c=0;for(let v of [...new Set(r)])if(existsSync$1(v))try{for(let E of readFileSync$1(v,"utf8").split(`
179
+ `))if(E.trim())try{let k=JSON.parse(E),w=ss(k.ts);w===null||typeof k.reason!="string"?c+=1:w>=i&&(a+=1);}catch{c+=1;}}catch(E){t.push({key:"hook_fallback_log_read",value:{path:v,error:E.message},target:"readable JSONL diagnostics",ok:false,severity:"error"});}t.push({key:"hook_fallback_events_24h",value:a,target:0,ok:a===0,severity:"warning"}),t.push({key:"malformed_hook_fallback_records",value:c,target:0,ok:c===0,severity:"error"});let l=Kt(e),u=0,g=0,d=null;if(existsSync$1(l)){let v;try{if(v=ee(l,e),M(v,"telemetry_events")){let E=v.prepare(`
180
180
  SELECT COUNT(*) total,
181
181
  SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) failures,
182
182
  AVG(CASE WHEN success = 1 THEN duration END) average_duration
183
183
  FROM telemetry_events
184
184
  WHERE kind = 'hook_daemon_request' AND timestamp >= ?
185
- `).get(s);l=Number(k?.total??0),u=Number(k?.failures??0),d=k?.average_duration==null?null:Math.round(Number(k.average_duration)*100)/100;}}catch(k){t.push({key:"hook_daemon_metrics_read",value:k.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{y?.close();}}let g=Math.max(i,u),f=Math.max(l,g),p=f===0?0:g/f;t.push({key:"hook_daemon_requests_24h",value:f,ok:true,severity:"info"}),t.push({key:"hook_fallback_rate_24h",value:Math.round(p*1e4)/1e4,target:0,ok:g===0,severity:"warning"}),t.push({key:"hook_daemon_response_ms_avg",value:d??"no successful requests",target:"<= 1000",ok:d===null||d<=1e3,severity:"warning"});let m=g>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:m,target:[],ok:m.length===0,severity:"warning"});let h=join$1(n,".devflow","logs","hook-debug");try{let y=Al(h);t.push({key:"hook_debug_log_bytes",value:y.bytes,target:`<= ${Ir}`,ok:y.bytes<=Ir,severity:"warning"}),t.push({key:"hook_debug_log_files",value:y.files,target:"rotated per project",ok:!0,severity:"info"});}catch(y){t.push({key:"hook_debug_log_read",value:y.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:N(t),metrics:t}}function Pe(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function Me(e){return JSON.parse(readFileSync$1(e,"utf8"))}function B(e){return typeof e=="object"&&e!==null?e:null}function as(e,t){return Tl.has(e)&&!(t.tolerateControlSyntax&&Il.has(e))}function kt(e,t={}){if(Buffer.byteLength(e)>is)return {segments:[],malformed:true};let n=[],o=[],r="",s=null,i=false,a=false,c=()=>{r.length>0&&o.push(r),r="";},l=()=>{c(),o.length>0&&n.push(o),o=[];};for(let u=0;u<e.length;u+=1){let d=e[u];if(i){r+=d,i=false;continue}if(s==="'"){d==="'"?s=null:r+=d;continue}if(d==="\\"){if(e[u+1]===`
185
+ `).get(i);u=Number(E?.total??0),g=Number(E?.failures??0),d=E?.average_duration==null?null:Math.round(Number(E.average_duration)*100)/100;}}catch(E){t.push({key:"hook_daemon_metrics_read",value:E.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{v?.close();}}let m=Math.max(a,g),f=Math.max(u,m),p=f===0?0:m/f;t.push({key:"hook_daemon_requests_24h",value:f,ok:true,severity:"info"}),t.push({key:"hook_fallback_rate_24h",value:Math.round(p*1e4)/1e4,target:0,ok:m===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 h=m>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:h,target:[],ok:h.length===0,severity:"warning"});let y=join$1(getDevFlowStateRoot(ie(e)),"logs","hook-debug");try{let v=Il(y);t.push({key:"hook_debug_log_bytes",value:v.bytes,target:`<= ${Mr}`,ok:v.bytes<=Mr,severity:"warning"}),t.push({key:"hook_debug_log_files",value:v.files,target:"rotated per project",ok:!0,severity:"info"});}catch(v){t.push({key:"hook_debug_log_read",value:v.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:T(t),metrics:t}}function Pe(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function Me(e){return JSON.parse(readFileSync$1(e,"utf8"))}function U(e){return typeof e=="object"&&e!==null?e:null}function ls(e,t){return Hl.has(e)&&!(t.tolerateControlSyntax&&Wl.has(e))}function wt(e,t={}){if(Buffer.byteLength(e)>cs)return {segments:[],malformed:true};let n=[],o=[],r="",s=null,i=false,a=false,c=()=>{r.length>0&&o.push(r),r="";},l=()=>{c(),o.length>0&&n.push(o),o=[];};for(let u=0;u<e.length;u+=1){let g=e[u];if(i){r+=g,i=false;continue}if(s==="'"){g==="'"?s=null:r+=g;continue}if(g==="\\"){if(e[u+1]===`
186
186
  `){u+=1;continue}if(e[u+1]==="\r"&&e[u+2]===`
187
- `){u+=2;continue}i=true;continue}if(s==='"'){d==='"'?s=null:((d==="`"||d==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax&&(a=true),r+=d);continue}if(d==="'"||d==='"'){s=d;continue}if((d==="`"||d==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax){a=true,r+=d;continue}let g=e.slice(u,u+2);if(d==="#"&&r.length===0){for(;u<e.length&&e[u]!==`
188
- `;)u+=1;l();continue}g==="<<"&&!t.tolerateControlSyntax&&(a=true);let f=d==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||d==="}"&&Ml.test(`${r}}`);if(["(",")","{","}"].includes(d)&&!f&&!t.tolerateControlSyntax&&(a=true),g==="&&"||g==="||"){l(),u+=1;continue}if([";","|","&",`
189
- `].includes(d)){l();continue}if(/\s/.test(d)){c();continue}r+=d;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let d=u.find(g=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(g));return d!==void 0&&as(d,t)})&&(a=true),{segments:n,malformed:a}}function Ll(e){return kt(e).segments.flat().join(" ")}function Fl(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 cs(e,t){return Fl(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 Hl(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]===`
187
+ `){u+=2;continue}i=true;continue}if(s==='"'){g==='"'?s=null:((g==="`"||g==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax&&(a=true),r+=g);continue}if(g==="'"||g==='"'){s=g;continue}if((g==="`"||g==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax){a=true,r+=g;continue}let d=e.slice(u,u+2);if(g==="#"&&r.length===0){for(;u<e.length&&e[u]!==`
188
+ `;)u+=1;l();continue}d==="<<"&&!t.tolerateControlSyntax&&(a=true);let m=g==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||g==="}"&&Ul.test(`${r}}`);if(["(",")","{","}"].includes(g)&&!m&&!t.tolerateControlSyntax&&(a=true),d==="&&"||d==="||"){l(),u+=1;continue}if([";","|","&",`
189
+ `].includes(g)){l();continue}if(/\s/.test(g)){c();continue}r+=g;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let g=u.find(d=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(d));return g!==void 0&&ls(g,t)})&&(a=true),{segments:n,malformed:a}}function ql(e){return wt(e).segments.flat().join(" ")}function Bl(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 us(e,t){return Bl(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 Kl(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]===`
190
190
  `){o-=1;break}e[o]!==`
191
- `&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function Wl(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]!==`
191
+ `&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function Jl(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]!==`
192
192
  `;)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]===`
193
- `||e[n]==="\r"))break;n+=1;}}return t.join("")}function me(e,t,n="infer"){let o=t?Ll(e):n==="node"?Hl(e):n==="python"?Wl(e):e;return [...new Set(o.match(Nl)??[])]}function Ul(e){return kt(e).segments.flat()}function pe(e,t,n=false,o="infer"){let r=[[/^\$\{CLAUDE_PROJECT_DIR\}(?:\/(.*))?$/,t.project],[/^\$CLAUDE_PROJECT_DIR(?:\/(.*))?$/,t.project],[/^\$\{HOME\}(?:\/(.*))?$/,t.homePath],[/^\$HOME(?:\/(.*))?$/,t.homePath],[/^~(?:\/(.*))?$/,t.homePath]];for(let[i,a]of r){let c=e.match(i);if(c)return {path:resolve(a,c[1]??""),containmentRoot:a,cwd:t.cwd,parserKind:o}}if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(e)||e.startsWith("node:"))return null;if(isAbsolute(e)){let i=resolve(e),a=resolve(t.project),c=resolve(t.homePath),l=Re(a,i)?a:Re(c,i)?c:dirname(i);return {path:i,containmentRoot:l,cwd:t.cwd,parserKind:o}}return n?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:e.startsWith("-")||e.startsWith("#")?null:/^[A-Za-z0-9._/-]+$/.test(e)&&(e.startsWith("./")||e.startsWith("../")||e.includes("/")||/\.(?:bash|cjs|js|mjs|py|sh|ts|zsh)$/.test(e))?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:null}function Bl(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>is||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function no(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=Bl(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:Ht(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:pe(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||Ie(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=Kl(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:pe(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:pe(n,r,true,e.parserKind)??void 0,malformed:false}}if(e.nodeResolutionKind==="esm")return {malformed:true};try{let s=e.issuerPath??join$1(e.cwd,"package.json"),i=createRequire$1(s).resolve(n);return isBuiltin(i)?{malformed:!1}:{reference:pe(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function ql(e){let t=[e];extname(e)===""&&t.push(...Lr.map(n=>`${e}${n}`),...Lr.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function Kl(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 ql(o)??o}function Jl(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]!==`
193
+ `||e[n]==="\r"))break;n+=1;}}return t.join("")}function me(e,t,n="infer"){let o=t?ql(e):n==="node"?Kl(e):n==="python"?Jl(e):e;return [...new Set(o.match(Ll)??[])]}function zl(e){return wt(e).segments.flat()}function pe(e,t,n=false,o="infer"){let r=[[/^\$\{CLAUDE_PROJECT_DIR\}(?:\/(.*))?$/,t.project],[/^\$CLAUDE_PROJECT_DIR(?:\/(.*))?$/,t.project],[/^\$\{HOME\}(?:\/(.*))?$/,t.homePath],[/^\$HOME(?:\/(.*))?$/,t.homePath],[/^~(?:\/(.*))?$/,t.homePath]];for(let[i,a]of r){let c=e.match(i);if(c)return {path:resolve(a,c[1]??""),containmentRoot:a,cwd:t.cwd,parserKind:o}}if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(e)||e.startsWith("node:"))return null;if(isAbsolute(e)){let i=resolve(e),a=resolve(t.project),c=resolve(t.homePath),l=Re(a,i)?a:Re(c,i)?c:dirname(i);return {path:i,containmentRoot:l,cwd:t.cwd,parserKind:o}}return n?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:e.startsWith("-")||e.startsWith("#")?null:/^[A-Za-z0-9._/-]+$/.test(e)&&(e.startsWith("./")||e.startsWith("../")||e.includes("/")||/\.(?:bash|cjs|js|mjs|py|sh|ts|zsh)$/.test(e))?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:null}function Vl(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>cs||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function oo(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=Vl(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:Wt(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:pe(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||Ie(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=Yl(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:pe(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:pe(n,r,true,e.parserKind)??void 0,malformed:false}}if(e.nodeResolutionKind==="esm")return {malformed:true};try{let s=e.issuerPath??join$1(e.cwd,"package.json"),i=createRequire$1(s).resolve(n);return isBuiltin(i)?{malformed:!1}:{reference:pe(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function Gl(e){let t=[e];extname(e)===""&&t.push(...Fr.map(n=>`${e}${n}`),...Fr.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function Yl(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 Gl(o)??o}function Zl(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]!==`
194
194
  `;)o+=1;continue}if(r==="/"&&e[o+1]==="*"){let s=e.indexOf("*/",o+2);if(s<0){n=true;break}o=s+2;continue}if(r==="'"||r==='"'){let s=r,i="",a=true;o+=1;let c=false;for(;o<e.length;){let l=e[o];if(l===s){c=true,o+=1;break}if(l==="\\"){if(a=false,o+1>=e.length)break;i+=e[o+1],o+=2;continue}if(l===`
195
- `||l==="\r"){a=false;break}i+=l,o+=1;}n||=!c,t.push({kind:"string",value:i,valid:a&&c});continue}if(r==="`"){let s=false,i=false;for(o+=1;o<e.length;){let a=e[o];if(!s&&a==="`"){i=true,o+=1;break}s=!s&&a==="\\",a!=="\\"&&(s=false),o+=1;}n||=!i,t.push({kind:"template",value:"",valid:i});continue}if(/[A-Za-z_$]/.test(r)){let s=o+1;for(;s<e.length&&/[A-Za-z0-9_$]/.test(e[s]);)s+=1;t.push({kind:"identifier",value:e.slice(o,s),valid:true}),o=s;continue}t.push({kind:"punctuation",value:r,valid:true}),o+=1;}return {tokens:t,malformed:n}}function zl(e,t,n,o=true){let r=Jl(t),s=[],i=r.malformed,a=(d,g)=>{if(!d||d.kind!=="string"||!d.valid||d.value.length===0){i=true;return}s.push({value:d.value,cwd:dirname(e),project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:g,issuerPath:e});},{tokens:c}=r;for(let d=0;d<c.length;d+=1){let g=c[d],f=c[d-1];if(g.kind!=="identifier")continue;if(g.value==="eval"&&f?.value!=="."&&c[d+1]?.value==="("){i=true;continue}if(g.value==="require"){if(f?.value==="."){c[d-2]?.value==="module"&&c[d+1]?.value==="("&&(i=true);continue}if(c[d+1]?.value==="("){let m=c[d+2];c[d+3]?.value===")"||(i=true),a(m,"cjs");continue}i=true;continue}if(f?.value==="."||!["export","import"].includes(g.value))continue;if(g.value==="import"&&c[d+1]?.value==="("){let m=c[d+2];c[d+3]?.value===")"||(i=true),a(m,"esm");continue}if(g.value==="import"&&c[d+1]?.kind==="string"){a(c[d+1],"esm");continue}if(g.value==="import"&&c[d+1]?.value===".")continue;let p=-1;for(let m=d+1;m<Math.min(c.length,d+32)&&c[m].value!==";";m+=1)if(c[m].value==="from"){p=m;break}p>=0?a(c[p+1],"esm"):g.value==="import"&&(i=true);}let l=[],u=[];for(let d of s){let g=no(d,o);g.reference&&l.push(g.reference),g.inlineContent&&u.push(g.inlineContent),i||=g.malformed;}return {references:l,inlineContents:u,malformed:i}}function Vl(e){let t=e.split(""),n=false;for(let o=0;o<e.length;){let r=e[o];if(r==="#"){for(;o<e.length&&e[o]!==`
196
- `;)t[o]=" ",o+=1;continue}if(r!=="'"&&r!=='"'){o+=1;continue}let s=o;for(;s>0&&/[A-Za-z]/.test(e[s-1]);)s-=1;let i=e.slice(s,o),a=/^(?:f|fr|rf)$/i.test(i),c=r,l=e.slice(o,o+3)===c.repeat(3),u=l?3:1,d=o;for(let f=0;f<u;f+=1)t[d+f]=" ";d+=u;let g=false;for(;d<e.length;){if(e[d]==="\\"){t[d]=" ",d+1<e.length&&(t[d+1]=" "),d+=2;continue}if(e.slice(d,d+u)===c.repeat(u)){for(let f=0;f<u;f+=1)t[d+f]=" ";d+=u,g=true;break}if(!l&&(e[d]===`
197
- `||e[d]==="\r"))break;e[d]!==`
198
- `&&e[d]!=="\r"&&(t[d]=" "),d+=1;}if(a){let f=e.slice(o+u,d-u);for(let p=0;p<f.length;p+=1)if(f[p]==="{"){if(f[p+1]==="{"){p+=1;continue}n=true;break}}n||=!g,o=d;}return {content:t.join(""),malformed:n}}function Fr(e,t){let n=t.split(".");if(n.length>to)return {paths:[],resolved:false};let o=[],r=e;for(let s=0;s<n.length;s+=1){r=join$1(r,n[s]);let i=join$1(r,"__init__.py");try{if(statSync$1(i).isFile()){o.push(i);continue}}catch{}if(s===n.length-1){let c=`${r}.py`;try{if(statSync$1(c).isFile())return o.push(c),{paths:o,resolved:!0}}catch{return {paths:o,resolved:false}}return {paths:o,resolved:false}}try{if(!statSync$1(r).isDirectory())return {paths:o,resolved:!1}}catch{return {paths:o,resolved:false}}}return {paths:o,resolved:o.length>0}}function Gl(e,t,n){let o=Vl(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=d=>{let g=dirname(e);for(let f=1;f<d;f+=1)g=dirname(g);return g},a=d=>{let g=pe(d,{...n,cwd:dirname(e)},true,"python");g?r.push(g):s=true;},c=(d,g=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(d))return s=true,null;let f=i(g),p=Fr(f,d);s||=!p.resolved;for(let h of p.paths)a(h);let m=p.paths.at(-1);return m&&basename(m)==="__init__.py"?dirname(m):null},l=d=>{let g=[];for(let f of d.split(",")){let p=f.trim().split(/\s+as\s+/)[0];if(p==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(p)){s=true;continue}g.push(p);}return g},u=(d,g)=>{for(let f of l(g))d&&Fr(d,f).resolved&&(s=true);};for(let d of o.content.split(/\r?\n/))for(let g of d.split(/[;:]/)){let f=g.trim();if(f.startsWith("import ")){let v=f.slice(7).split(",");for(let b of v)c(b.trim().split(/\s+as\s+/)[0]);continue}let p=f.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!p)continue;let m=p[1].length,h=p[2];if(h){let v=c(h,m);u(v,p[3]);continue}if(m===0){s=true;continue}let y=i(m),k=join$1(y,"__init__.py"),C=false;try{C=statSync$1(k).isFile();}catch{}if(C){a(k),u(y,p[3]);continue}for(let v of l(p[3]))c(v,m);}return {references:[...new Map(r.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function ls(e,t,n,o,r=true){return n==="node"?zl(e,t,o,r):n==="python"?Gl(e,t,o):{references:[],inlineContents:[],malformed:false}}function Hr(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=Ut(e,0,r),i=new Set((s.artifacts??[]).map(g=>g.value)),a=s.tokens.filter(g=>!i.has(g)).map(g=>pe(g,r)).filter(g=>g!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let g of s.artifacts??[]){if(g.nodeResolutionKind){let p=no(g);p.reference&&c.push(p.reference),p.inlineContent&&l.push(p.inlineContent),u||=p.malformed;continue}let f=pe(g.value,{...r,cwd:g.cwd},true,g.parserKind);f?c.push(f):u=true;}let d=[...a,...c];return {references:[...new Map(d.map(g=>[`${g.path}:${g.parserKind}`,g])).values()],inlineContents:l,malformed:u}}function us(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function Ie(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 Ht(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function mt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function eu(e,t,n){let o=[],r=[],s=false,i=(u,d)=>{o.push(u),r.push({value:u,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:d}),s||=Ie(u);},a=(u=s)=>({tokens:o,artifacts:r,malformed:u}),c=t,l=false;for(;c<e.length;){let u=e[c];if(u==="--"){let h=e[c+1];return h&&!l&&i(h),h?a():a(true)}if(!u.startsWith("-"))return l||i(u),a();if(Xl.has(u))return a();if(Ql.has(u)){l=true,c+=1;continue}let d=Wr.has(u)?"cjs":Ur.has(u)?"esm":null;if(d){let h=e[c+1];if(!h)return a(true);i(h,d),c+=2;continue}let g=mt(u,Wr),f=mt(u,Ur),p=g??f;if(p!==null){if(!p)return a(true);i(p,g!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(Br.has(u)){let h=e[c+1];return a(h===void 0?true:s||Ht(h))}let m=mt(u,Br);if(m!==null)return a(s||Ht(m));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||Ht(u.slice(2)));if(qr.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(mt(u,qr)!==null){c+=1;continue}if(Zl.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function ru(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:Ie(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?Ut(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(tu.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:Ie(i)}}return {tokens:[],malformed:true}}function su(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:Ie(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:Ie(r)};if(ou.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Kr.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(mt(r,Kr)!==null){o+=1;continue}if(nu.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function qn(e,t){let n=pe(e,t,true);if(!n)return null;let o=Pe(n.path),r=Pe(t.project);return !o||!r||!Re(r,o)?null:o}function cu(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(us(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=kt(c,r);return l.malformed||l.segments.length!==1?{index:s,malformed:true}:{index:s,malformed:false,replacement:[...l.segments[0],...t.slice(s+2)],context:i}}else if(["-C","--chdir"].includes(a)){let c=t[s+1],l=c?qn(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=qn(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=qn(a.slice(2),i);if(!c)return {index:s,malformed:true};i={...i,cwd:c},s+=1;}else if(["-u","--unset"].includes(a)){if(!t[s+1])return {index:s,malformed:true};s+=2;}else if(a.startsWith("--unset=")||a.startsWith("-u")&&a.length>2)s+=1;else if(["--","-i","--ignore-environment","--null"].includes(a))s+=1;else {if(a.startsWith("-"))return {index:s,malformed:true};break}}return {index:s,malformed:s>=t.length,context:i}}for(;t[s]?.startsWith("-");){let i=t[s];["-k","--kill-after","-s","--signal"].includes(i)?s+=2:s+=1;}return s>=t.length?{index:s,malformed:true}:(s+=1,{index:s,malformed:s>=t.length})}function Ut(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>ss)return {tokens:[],malformed:true};let r=kt(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=ds(l,t,n,o);s.push(...u.tokens),i.push(...u.artifacts??[]),a.push(...u.inlineContents??[]),c||=u.malformed;}return {tokens:s,artifacts:i,inlineContents:a,malformed:c}}function ds(e,t,n,o){let r=0;for(;us(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;iu.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>ss)return {tokens:i,malformed:true};let m=cu(basename(s),e,r+1,n,o);if(m.malformed)return {tokens:i,malformed:true};if(n=m.context??n,m.replacement){let h=ds(m.replacement,a,m.context??n,o);return i.push(...h.tokens),{tokens:i,artifacts:h.artifacts,inlineContents:h.inlineContents,malformed:h.malformed}}if(r=m.index,s=e[r],!s)return {tokens:i,malformed:false}}let l=basename(s),u=!s.includes(sep)&&as(l,o),d=c&&!au.has(l);if(u||d)return {tokens:i,malformed:true};let g=Ie(s);i.push(s);let f=l;if(!Yl.has(f))return {tokens:i,malformed:g};let p=["node","tsx"].includes(f)?eu(e,r+1,n):["bash","sh","zsh"].includes(f)?ru(e,r+1,a,n,o):su(e,r+1,n);return i.push(...p.tokens),{tokens:i,artifacts:p.artifacts,inlineContents:p.inlineContents,malformed:g||p.malformed}}function gs(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:Pe(t.slice(0,o))}function lu(e,t){let n=new Map;for(let o of t)for(let r of Ul(o)){let s=gs(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 uu(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function du(e){return e.slice(e.lastIndexOf("@")+1)}function Jr(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=Pe(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function gu(e,t,n){let o=du(e),r=B(t.extraKnownMarketplaces),s=B(r?.[o]);if(s){let i=B(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?Jr(i.path):null}}try{let i=B(Me(n)),a=B(i?.[o]);if(a){let c=B(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Jr(c.path):null}}}catch{}return {configured:false,root:null}}function zr(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 fu(e,t){let n=B(e.entry),o=B(t.entry),r=zr(n),s=zr(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?Bt(n.version):null,a=typeof o?.version=="string"?Bt(o.version):null;if(i&&a){let c=fs(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function mu(e,t){try{let n=B(Me(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=B(n.plugins);if(!o)throw new Error("installed plugin manifest plugins must be an object");let r=o?.[e];if(r===void 0)return {configured:!1,root:null};if(!Array.isArray(r)||r.length===0)return {configured:!0,malformed:!0,root:null};let s=r.map((a,c)=>({entry:a,index:c})).sort(fu)[0],i=B(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:Pe(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function Bt(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 fs(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 pu(e,t){let n=e.lastIndexOf("@");if(n<=0||n===e.length-1)return null;let o=e.slice(0,n),r=e.slice(n+1),s=join$1(t,r,o),i;try{i=readdirSync(s,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>{let c=join$1(s,a.name),l=a.name;try{let u=B(Me(join$1(c,"package.json")));typeof u?.version=="string"&&(l=u.version);}catch{}return {name:a.name,path:c,version:l,mtimeMs:statSync$1(c).mtimeMs}});}catch{return null}return i.sort((a,c)=>{let l=Bt(a.version),u=Bt(c.version);if(l&&u){let d=fs(u,l);if(d!==0)return d}else if(l||u)return l?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?Pe(i[0].path):null}function hu(e,t){if(t.legacyArtifactRoots!==void 0){let v=t.legacyArtifactRoots.map(b=>Pe(b)).filter(b=>b!==null).map(b=>({root:b,inspectPluginConfig:true}));return {targets:v,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:v.length>0}}let n=t.claudeSettingsPath??join$1(t.homePath??homedir$1(),".claude","settings.json"),o=t.installedPluginsPath??join$1(t.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),r=t.knownMarketplacesPath??join$1(t.homePath??homedir$1(),".claude","plugins","known_marketplaces.json"),s=t.pluginCachePath??join$1(t.homePath??homedir$1(),".claude","plugins","cache"),i=[],a=[],c=[],l=[...new Set([n,join$1(e,".claude","settings.json"),join$1(e,".claude","settings.local.json")])];for(let v of l)if(existsSync$1(v))try{let b=B(Me(v));if(!b)throw new Error("settings must be an object");i.push({path:v,settings:b});}catch{a.push(v);}if(i.reduce((v,b)=>typeof b.settings.disableAllHooks=="boolean"?b.settings.disableAllHooks:v,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let d=i.map(v=>{let b=[];return yt(v.settings.hooks,b),{path:v.path,commands:b}}),g=d.flatMap(v=>v.commands),f=d.flatMap(v=>lu(v.path,v.commands)),m=[...i.reduce((v,b)=>{let S=b.settings.enabledPlugins;if(typeof S!="object"||S===null)return v;for(let[T,z]of Object.entries(S))uu(T)&&typeof z=="boolean"&&v.set(T,z);return v},new Map)].filter(([,v])=>v).map(([v])=>v).sort(),h=[...f],y=false;for(let v of m){let b=mu(v,o);b.malformed&&c.push(o);let S=b.root;if(!b.configured){let T=i.map(oe=>gu(v,oe.settings,r)).filter(oe=>oe.configured),z=T[T.length-1];z?S=z.root:S=pu(v,s);}S?h.push({root:S,inspectPluginConfig:true}):y=true;}let k=[...h.reduce((v,b)=>{let S=v.get(b.root);return S?(v.set(b.root,{root:b.root,configPath:S.configPath??b.configPath,commands:[...new Set([...S.commands??[],...b.commands??[]])],inspectPluginConfig:!!(S.inspectPluginConfig||b.inspectPluginConfig)}),v):(v.set(b.root,b),v)},new Map).values()],C=[g.length>0?"settings-hooks":null,m.length>0?"enabled-plugin":null].filter(v=>v!==null);return {targets:k,configCommands:d.filter(v=>v.commands.length>0),hooksDisabled:false,method:C.length>0?`${C.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(k.length>0||g.length>0)&&!y&&a.length===0&&c.length===0}}function yu(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 yt(e,t){if(Array.isArray(e)){for(let n of e)yt(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):yt(o,t);}function Kn(e){return [...e.matchAll(jl)].map(t=>t[1])}function vu(e){let t=new Map,n=kt(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 ku(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 wu(e){if(![".cjs",".js",".mjs"].includes(extname(e)))return false;let t=spawnSync(process.execPath,["--check",e],{encoding:"utf8",env:{PATH:process.env.PATH??"",HOME:process.env.HOME??""},timeout:2e3});return t.error!==void 0||t.status!==0}function Jn(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function Re(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Qn(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>Ft)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>Ft)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,Ft+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>Ft)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 Xn(e,t){return `${e} (${t})`}function bu(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>to){o.traversalLimitRoots.push(e);return}let u=resolve(c.path),d=resolve(c.containmentRoot),g;try{g=realpathSync.native(d);}catch{g=d;}if(!existsSync$1(u)){Re(d,u)?o.missing.push(u):o.escapedArtifacts.push(u);return}let f;try{f=realpathSync.native(u);}catch{o.missing.push(u);return}if(!Re(g,f)){o.escapedArtifacts.push(u);return}let p=`${f}:${c.parserKind}:${c.cwd}`;s.has(p)||(s.add(p),r.push({...c,path:f,depth:l}));};for(let c of n){let l=Hr(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let d of me(u.content,false,"node"))o.findings.push({artifact:u.source,endpoint:d});for(let u of l.references)a(u);}for(;r.length>0;){if(i>=rs){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=Qn(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(Xn(l,u.reason));continue}let{content:d}=u;o.inspected.push(l);let g=c.parserKind==="infer"?cs(l,d):c.parserKind,f=g==="shell";for(let p of me(d,f,g))o.findings.push({artifact:l,endpoint:p});if(f){let p=Hr(d,e,t,c.cwd);p.malformed&&o.malformedCommands.push(l);for(let m of p.inlineContents)for(let h of me(m.content,false,"node"))o.findings.push({artifact:m.source,endpoint:h});for(let m of p.references)a(m,c.depth+1);}else if(g==="node"||g==="python"){let p=ls(l,d,g,{project:e,homePath:t,cwd:dirname(l)});p.malformed&&o.malformedCommands.push(l);for(let m of p.inlineContents)for(let h of me(m.content,false,"node"))o.findings.push({artifact:m.source,endpoint:h});for(let m of p.references)a(m,c.depth+1);}}}function _u(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=yu(r),c=0,l=(f,p=false,m=r,h="infer",y=e,k=0)=>{if(k>to){o.traversalLimitRoots.push(r);return}let C=realpathSync.native(m),v=resolve(f);if(!existsSync$1(v)){if(!Re(C,v)){o.escapedArtifacts.push(v);return}p&&o.missing.push(v);return}let b;try{b=realpathSync.native(v);}catch{p&&o.missing.push(v);return}if(!Re(C,b)){o.escapedArtifacts.push(v);return}let S=`${b}:${h}:${y}`;i.has(S)||(i.add(S),s.push({path:b,parserKind:h,cwd:y,depth:k}));},u=(f,p,m,h=0)=>{for(let y of Kn(f)){let k=Jn(r,y);if(!k)continue;let C=(p.artifacts??[]).find(v=>v.value.includes("PLUGIN_ROOT")&&v.value.endsWith(y));l(k,true,r,C?.parserKind??"infer",C?.cwd??m,h);}},d=(f,p,m=0,h=false)=>{for(let y of f.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let k=y.nodeResolutionKind?no(y,!h):{reference:pe(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(k.malformed){o.malformedCommands.push(y.value);continue}if(k.inlineContent)for(let C of me(k.inlineContent.content,false,"node"))o.findings.push({artifact:k.inlineContent.source,endpoint:C});k.reference&&l(k.reference.path,true,h?r:k.reference.containmentRoot,k.reference.parserKind,k.reference.cwd??p,m);}},g=f=>{for(let m of me(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:m});let p=Ut(f,0,{project:e,homePath:t,cwd:e});p.malformed&&o.malformedCommands.push(f),u(f,p,e),d(p,e);for(let m of p.tokens){if(!isAbsolute(m))continue;let h=gs(m),y=(p.artifacts??[]).find(k=>k.value===m);h===r&&l(m,true,r,y?.parserKind??"infer",y?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let f of n.commands)g(f);}if(n.inspectPluginConfig||!n.commands){let f=join$1(r,"hooks","hooks.json"),p=join$1(r,"hooks.json"),m=existsSync$1(p)?p:f;if(!existsSync$1(m))o.missing.push(m),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(m);let h;try{h=realpathSync.native(m);}catch{o.missing.push(m),l(join$1(r,"hooks","session-start")),h="";}if(h&&!Re(r,h)&&(o.escapedArtifacts.push(m),l(join$1(r,"hooks","session-start")),h=""),h){let y=Qn(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(Xn(m,y.reason)),l(join$1(r,"hooks","session-start"));else if(y.kind==="missing")o.missing.push(m),l(join$1(r,"hooks","session-start"));else try{let k=JSON.parse(y.content),C=[];yt(k,C);for(let v of C)g(v);}catch{o.malformedConfigs.push(m),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=rs){o.traversalLimitRoots.push(r);break}let f=s.shift(),p=f.path;c+=1;let m=Qn(p);if(m.kind==="missing"){o.missing.push(p);continue}if(m.kind==="unsafe"){o.unsafeArtifacts.push(Xn(p,m.reason));continue}let{content:h}=m;o.inspected.push(p);let y=f.parserKind==="infer"?cs(p,h):f.parserKind,k=y==="shell";for(let b of me(h,k,y))o.findings.push({artifact:p,endpoint:b});if(k){let b=vu(h),S=Ut(b,0,{project:e,homePath:t,cwd:dirname(p)},{tolerateControlSyntax:true});ku(h)&&o.malformedCommands.push(p),u(b,S,dirname(p),f.depth+1),d(S,dirname(p),f.depth+1,true);}else if(y==="node"||y==="python"){let b=ls(p,h,y,{project:e,homePath:t,cwd:dirname(p)},false);(y==="node"?wu(p):b.malformed)&&o.malformedCommands.push(p);for(let S of b.inlineContents)for(let T of me(S.content,false,"node"))o.findings.push({artifact:S.source,endpoint:T});for(let S of b.references){let T=relative(r,resolve(S.path));!T.startsWith(`..${sep}`)&&T.split(sep).includes("node_modules")||l(S.path,true,r,S.parserKind,S.cwd,f.depth+1);}for(let S of Kn(h)){let T=Jn(r,S);T&&l(T,true,r,y,f.cwd,f.depth+1);}}else for(let b of Kn(h)){let S=Jn(r,b);S&&l(S,true,r,y,f.cwd,f.depth+1);}let C=p.startsWith(`${r}/`)?p.slice(r.length+1):"",v=basename(C).replace(/\.js$/,"");a&&(C.startsWith("hooks/")||C.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${v}.ts`),false,a),C.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${v}.js`));}}function Su(e){let t=e.installedPluginsPath??join$1(e.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),n=new Map;if(!existsSync$1(t))return new Map;try{let o=B(Me(t)),r=B(o?.plugins);if(!r)return new Map;for(let s of Object.values(r))if(Array.isArray(s))for(let i of s){let a=B(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=Pe(a.installPath);if(!c)continue;let l=n.get(c)??new Set;l.add(a.version),n.set(c,l);}}catch{return new Map}return new Map([...n].map(([o,r])=>[o,[...r].sort()]))}function Vr(e){try{let t=B(Me(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Eu(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=Su(t);for(let r of e){let s=r.root,i=join$1(s,"package.json"),a=join$1(s,".claude-plugin","plugin.json");if(!(existsSync$1(i)||existsSync$1(a)))continue;let l=join$1(s,"hooks","hooks.json"),u=join$1(s,"hooks.json");existsSync$1(l)||n.layoutIssues.push({root:s,issue:"missing hooks/hooks.json"}),existsSync$1(u)&&n.layoutIssues.push({root:s,issue:"retired root hooks.json is present"});let d=existsSync$1(l)?l:u;try{let k=B(Me(d)),C=B(k?.hooks),v=[];yt(C?.SessionStart,v),v.some(b=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(b))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let g=Vr(i),f=Vr(a),p=o.get(s)??[],m={root:s,packageVersion:g,manifestVersion:f,registryVersions:p};n.versionRecords.push(m),(!g||!f||g!==f||p.some(k=>k!==g))&&n.versionIssues.push(m);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let k=readFileSync$1(h,"utf8");(!existsSync$1(y)||!k.includes("hook-daemon.js"))&&n.daemonIssues.push({root:s,issue:"SessionStart does not register the packaged hook daemon"});}catch{n.daemonIssues.push({root:s,issue:"SessionStart wrapper or hook daemon is missing"});}}return n}function Ru(e,t){let n=hu(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let $ of n.configCommands){o.configsInspected.push($.path);for(let U of $.commands){o.commandsInspected.push({configPath:$.path,command:U});for(let X of me(U,true))o.findings.push({artifact:$.path,endpoint:X});}}bu(e,t.homePath??homedir$1(),n.configCommands.flatMap($=>$.commands).filter($=>!n.targets.some(U=>U.commands?.includes($))),o);for(let $ of n.targets)_u(e,t.homePath??homedir$1(),$,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter(($,U,X)=>X.findIndex(D=>D.configPath===$.configPath&&D.command===$.command)===U),a=[...new Set(o.missing)],c=[...new Set(o.malformedConfigs)],l=[...new Set(o.malformedCommands)],u=[...new Set(o.unsafeArtifacts)],d=[...new Set(o.traversalLimitRoots)],g=[...new Set(o.escapedArtifacts)],f=o.findings.filter(($,U,X)=>X.findIndex(D=>D.artifact===$.artifact&&D.endpoint===$.endpoint)===U),p=a.length>0||g.length>0||u.length>0,m=p&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=Eu(n.targets,t),y=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,k=t.homePath??(y&&basename(y)===".claude"?dirname(y):y)??homedir$1(),C=n.targets.map($=>$.root).find($=>existsSync$1(join$1($,"skills")))??null,v=t.activePluginRoot?{root:existsSync$1(t.activePluginRoot)?t.activePluginRoot:null,version:null}:C?{root:C,version:null}:Ce(k,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),b=v.root,S=b?Xe(k,b):[],T=S.filter($=>!$.isKnownDevFlowArtifact).map($=>({skillName:$.skillName,path:$.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),z=[{key:"active_plugin_resolution",value:m,target:"resolved active DevFlow hook configuration",ok:n.ok&&!p,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map($=>$.root),ok:true,severity:"info"},{key:"hooks_disabled",value:n.hooksDisabled,ok:true,severity:"info"},{key:"plugin_hook_layout",value:h.layoutIssues,target:"hooks/hooks.json present and root hooks.json absent",ok:h.layoutIssues.length===0,severity:"error"},{key:"plugin_version_parity",value:h.versionRecords,target:"manifest, package, and installed registry versions match",ok:h.versionIssues.length===0,severity:"error"},{key:"session_start_hook_registration",value:h.sessionStartIssues,target:[],ok:h.sessionStartIssues.length===0,severity:"error"},{key:"hook_daemon_artifact_registration",value:h.daemonIssues,target:[],ok:h.daemonIssues.length===0,severity:"error"},{key:"malformed_active_settings",value:n.malformedSettings,target:[],ok:n.malformedSettings.length===0,severity:"warning"},{key:"malformed_plugin_metadata",value:n.malformedPluginMetadata,target:[],ok:n.malformedPluginMetadata.length===0,severity:"warning"},{key:"hook_configs_inspected",value:r.length,target:n.hooksDisabled?"hooks disabled":">= 1 hook config file",ok:n.hooksDisabled||r.length>0,severity:"warning"},{key:"legacy_artifacts_inspected",value:s.length+i.length,target:n.hooksDisabled?"hooks disabled":">= 1 active hook artifact",ok:n.hooksDisabled||s.length+i.length>0,severity:"warning"},{key:"missing_legacy_artifacts",value:a,target:[],ok:a.length===0,severity:"warning"},{key:"malformed_hook_configs",value:c,target:[],ok:c.length===0,severity:"warning"},{key:"malformed_hook_commands",value:l,target:[],ok:l.length===0,severity:"warning"},{key:"unsafe_legacy_artifacts",value:u,target:[],ok:u.length===0,severity:"warning"},{key:"legacy_artifact_traversal_limit",value:d,target:[],ok:d.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:g.length,target:0,ok:g.length===0,severity:"warning"},{key:"retired_producer_paths",value:f.length,target:0,ok:f.length===0,severity:"error"},{key:"retired_producer_path_findings",value:f,ok:true,severity:"info"},{key:"skill_shadowing_count",value:S.length,target:0,ok:S.length===0,severity:"error"},{key:"shadowed_skills",value:S,target:[],ok:S.length===0,severity:"error"},{key:"active_skill_source",value:b,target:"existing plugin cache path",ok:true,severity:"info"},{key:"skill_shadowing_remediation",value:T,target:[],ok:true,severity:"info"}],oe=v.version??h.versionRecords.find($=>$.root===b)?.packageVersion;return oe&&z.push({key:"active_plugin_version",value:oe,ok:true,severity:"info"}),{name:"Legacy paths",status:N(z),metrics:z}}function Pu(e){let t=dirname(fileURLToPath(import.meta.url)),n=[...new Set([e.acceptanceManifestPath,e.env?.DEVFLOW_ACCEPTANCE_MANIFEST,process.env.DEVFLOW_ACCEPTANCE_MANIFEST,join$1(t,"..","acceptance-manifest.json"),join$1(t,"..","..","..","..","packages","devflow","acceptance-manifest.json"),join$1(process.cwd(),"packages","devflow","acceptance-manifest.json")].filter(o=>!!o))];for(let o of n)if(existsSync$1(o))try{return {path:o,manifest:JSON.parse(readFileSync$1(o,"utf8"))}}catch(r){return {path:o,error:r.message}}return {error:`not found (${n.join(", ")})`}}function zt(e){let t=Pu(e);if(!t.manifest)return {metrics:[{key:"batch4_acceptance_manifest",value:t.error??"missing",target:"readable acceptance-manifest.json",ok:false,severity:"warning"}]};let n=Date.parse(t.manifest.verifiedAt),o=Number.isFinite(n)?((e.now??Date.now)()-n)/Ze:Number.POSITIVE_INFINITY;return {manifest:t.manifest,metrics:[{key:"batch4_acceptance_manifest",value:t.path,target:"schemaVersion 1",ok:t.manifest.schemaVersion===1,severity:"error"},{key:"acceptance_evidence_age_days",value:Number.isFinite(o)?Number(o.toFixed(2)):"invalid timestamp",target:"0-30",ok:o>=0&&o<=30,severity:"warning"}]}}function Cu(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=te(i,t);let l=(M(a,"observations")?a.prepare("PRAGMA table_info(observations)").all().map(u=>u.name):[]).includes("source");n.push({key:"explicit_memory_channel",value:l?"explicit_intent source available":"source column missing",target:"explicit_intent source available",ok:l,severity:"warning"}),l&&n.push({key:"explicit_memory_observations",value:J(a,"SELECT COUNT(*) count FROM observations WHERE source = 'explicit_intent'"),ok:!0,severity:"info"});}catch(c){n.push({key:"explicit_memory_channel_read",value:c.message,target:"readable memory database",ok:false,severity:"error"});}finally{a?.close();}}return {name:"Injection",status:N(n),metrics:n}}function Du(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Memory quality",status:N(n),metrics:n};let r;try{if(r=te(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*Ze,i=r.prepare(`
195
+ `||l==="\r"){a=false;break}i+=l,o+=1;}n||=!c,t.push({kind:"string",value:i,valid:a&&c});continue}if(r==="`"){let s=false,i=false;for(o+=1;o<e.length;){let a=e[o];if(!s&&a==="`"){i=true,o+=1;break}s=!s&&a==="\\",a!=="\\"&&(s=false),o+=1;}n||=!i,t.push({kind:"template",value:"",valid:i});continue}if(/[A-Za-z_$]/.test(r)){let s=o+1;for(;s<e.length&&/[A-Za-z0-9_$]/.test(e[s]);)s+=1;t.push({kind:"identifier",value:e.slice(o,s),valid:true}),o=s;continue}t.push({kind:"punctuation",value:r,valid:true}),o+=1;}return {tokens:t,malformed:n}}function Ql(e,t,n,o=true){let r=Zl(t),s=[],i=r.malformed,a=(g,d)=>{if(!g||g.kind!=="string"||!g.valid||g.value.length===0){i=true;return}s.push({value:g.value,cwd:dirname(e),project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:d,issuerPath:e});},{tokens:c}=r;for(let g=0;g<c.length;g+=1){let d=c[g],m=c[g-1];if(d.kind!=="identifier")continue;if(d.value==="eval"&&m?.value!=="."&&c[g+1]?.value==="("){i=true;continue}if(d.value==="require"){if(m?.value==="."){c[g-2]?.value==="module"&&c[g+1]?.value==="("&&(i=true);continue}if(c[g+1]?.value==="("){let p=c[g+2];c[g+3]?.value===")"||(i=true),a(p,"cjs");continue}i=true;continue}if(m?.value==="."||!["export","import"].includes(d.value))continue;if(d.value==="import"&&c[g+1]?.value==="("){let p=c[g+2];c[g+3]?.value===")"||(i=true),a(p,"esm");continue}if(d.value==="import"&&c[g+1]?.kind==="string"){a(c[g+1],"esm");continue}if(d.value==="import"&&c[g+1]?.value===".")continue;let f=-1;for(let p=g+1;p<Math.min(c.length,g+32)&&c[p].value!==";";p+=1)if(c[p].value==="from"){f=p;break}f>=0?a(c[f+1],"esm"):d.value==="import"&&(i=true);}let l=[],u=[];for(let g of s){let d=oo(g,o);d.reference&&l.push(d.reference),d.inlineContent&&u.push(d.inlineContent),i||=d.malformed;}return {references:l,inlineContents:u,malformed:i}}function Xl(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]!==`
196
+ `;)t[o]=" ",o+=1;continue}if(r!=="'"&&r!=='"'){o+=1;continue}let s=o;for(;s>0&&/[A-Za-z]/.test(e[s-1]);)s-=1;let i=e.slice(s,o),a=/^(?:f|fr|rf)$/i.test(i),c=r,l=e.slice(o,o+3)===c.repeat(3),u=l?3:1,g=o;for(let m=0;m<u;m+=1)t[g+m]=" ";g+=u;let d=false;for(;g<e.length;){if(e[g]==="\\"){t[g]=" ",g+1<e.length&&(t[g+1]=" "),g+=2;continue}if(e.slice(g,g+u)===c.repeat(u)){for(let m=0;m<u;m+=1)t[g+m]=" ";g+=u,d=true;break}if(!l&&(e[g]===`
197
+ `||e[g]==="\r"))break;e[g]!==`
198
+ `&&e[g]!=="\r"&&(t[g]=" "),g+=1;}if(a){let m=e.slice(o+u,g-u);for(let f=0;f<m.length;f+=1)if(m[f]==="{"){if(m[f+1]==="{"){f+=1;continue}n=true;break}}n||=!d,o=g;}return {content:t.join(""),malformed:n}}function Hr(e,t){let n=t.split(".");if(n.length>no)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 eu(e,t,n){let o=Xl(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=g=>{let d=dirname(e);for(let m=1;m<g;m+=1)d=dirname(d);return d},a=g=>{let d=pe(g,{...n,cwd:dirname(e)},true,"python");d?r.push(d):s=true;},c=(g,d=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(g))return s=true,null;let m=i(d),f=Hr(m,g);s||=!f.resolved;for(let h of f.paths)a(h);let p=f.paths.at(-1);return p&&basename(p)==="__init__.py"?dirname(p):null},l=g=>{let d=[];for(let m of g.split(",")){let f=m.trim().split(/\s+as\s+/)[0];if(f==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(f)){s=true;continue}d.push(f);}return d},u=(g,d)=>{for(let m of l(d))g&&Hr(g,m).resolved&&(s=true);};for(let g of o.content.split(/\r?\n/))for(let d of g.split(/[;:]/)){let m=d.trim();if(m.startsWith("import ")){let k=m.slice(7).split(",");for(let w of k)c(w.trim().split(/\s+as\s+/)[0]);continue}let f=m.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!f)continue;let p=f[1].length,h=f[2];if(h){let k=c(h,p);u(k,f[3]);continue}if(p===0){s=true;continue}let y=i(p),v=join$1(y,"__init__.py"),E=false;try{E=statSync$1(v).isFile();}catch{}if(E){a(v),u(y,f[3]);continue}for(let k of l(f[3]))c(k,p);}return {references:[...new Map(r.map(g=>[g.path,g])).values()],inlineContents:[],malformed:s}}function ds(e,t,n,o,r=true){return n==="node"?Ql(e,t,o,r):n==="python"?eu(e,t,o):{references:[],inlineContents:[],malformed:false}}function Wr(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=qt(e,0,r),i=new Set((s.artifacts??[]).map(d=>d.value)),a=s.tokens.filter(d=>!i.has(d)).map(d=>pe(d,r)).filter(d=>d!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let d of s.artifacts??[]){if(d.nodeResolutionKind){let f=oo(d);f.reference&&c.push(f.reference),f.inlineContent&&l.push(f.inlineContent),u||=f.malformed;continue}let m=pe(d.value,{...r,cwd:d.cwd},true,d.parserKind);m?c.push(m):u=true;}let g=[...a,...c];return {references:[...new Map(g.map(d=>[`${d.path}:${d.parserKind}`,d])).values()],inlineContents:l,malformed:u}}function gs(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function Ie(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 Wt(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function pt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function su(e,t,n){let o=[],r=[],s=false,i=(u,g)=>{o.push(u),r.push({value:u,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:g}),s||=Ie(u);},a=(u=s)=>({tokens:o,artifacts:r,malformed:u}),c=t,l=false;for(;c<e.length;){let u=e[c];if(u==="--"){let h=e[c+1];return h&&!l&&i(h),h?a():a(true)}if(!u.startsWith("-"))return l||i(u),a();if(ru.has(u))return a();if(ou.has(u)){l=true,c+=1;continue}let g=Ur.has(u)?"cjs":qr.has(u)?"esm":null;if(g){let h=e[c+1];if(!h)return a(true);i(h,g),c+=2;continue}let d=pt(u,Ur),m=pt(u,qr),f=d??m;if(f!==null){if(!f)return a(true);i(f,d!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(Br.has(u)){let h=e[c+1];return a(h===void 0?true:s||Wt(h))}let p=pt(u,Br);if(p!==null)return a(s||Wt(p));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||Wt(u.slice(2)));if(Kr.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(pt(u,Kr)!==null){c+=1;continue}if(nu.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function lu(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:Ie(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?qt(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(iu.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:Ie(i)}}return {tokens:[],malformed:true}}function uu(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:Ie(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:Ie(r)};if(cu.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Jr.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(pt(r,Jr)!==null){o+=1;continue}if(au.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function Bn(e,t){let n=pe(e,t,true);if(!n)return null;let o=Pe(n.path),r=Pe(t.project);return !o||!r||!Re(r,o)?null:o}function fu(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(gs(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=wt(c,r);return l.malformed||l.segments.length!==1?{index:s,malformed:true}:{index:s,malformed:false,replacement:[...l.segments[0],...t.slice(s+2)],context:i}}else if(["-C","--chdir"].includes(a)){let c=t[s+1],l=c?Bn(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=Bn(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=Bn(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 qt(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>as)return {tokens:[],malformed:true};let r=wt(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=fs(l,t,n,o);s.push(...u.tokens),i.push(...u.artifacts??[]),a.push(...u.inlineContents??[]),c||=u.malformed;}return {tokens:s,artifacts:i,inlineContents:a,malformed:c}}function fs(e,t,n,o){let r=0;for(;gs(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;du.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>as)return {tokens:i,malformed:true};let p=fu(basename(s),e,r+1,n,o);if(p.malformed)return {tokens:i,malformed:true};if(n=p.context??n,p.replacement){let h=fs(p.replacement,a,p.context??n,o);return i.push(...h.tokens),{tokens:i,artifacts:h.artifacts,inlineContents:h.inlineContents,malformed:h.malformed}}if(r=p.index,s=e[r],!s)return {tokens:i,malformed:false}}let l=basename(s),u=!s.includes(sep)&&ls(l,o),g=c&&!gu.has(l);if(u||g)return {tokens:i,malformed:true};let d=Ie(s);i.push(s);let m=l;if(!tu.has(m))return {tokens:i,malformed:d};let f=["node","tsx"].includes(m)?su(e,r+1,n):["bash","sh","zsh"].includes(m)?lu(e,r+1,a,n,o):uu(e,r+1,n);return i.push(...f.tokens),{tokens:i,artifacts:f.artifacts,inlineContents:f.inlineContents,malformed:d||f.malformed}}function ms(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:Pe(t.slice(0,o))}function mu(e,t){let n=new Map;for(let o of t)for(let r of zl(o)){let s=ms(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 pu(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function hu(e){return e.slice(e.lastIndexOf("@")+1)}function zr(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=Pe(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function yu(e,t,n){let o=hu(e),r=U(t.extraKnownMarketplaces),s=U(r?.[o]);if(s){let i=U(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?zr(i.path):null}}try{let i=U(Me(n)),a=U(i?.[o]);if(a){let c=U(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?zr(c.path):null}}}catch{}return {configured:false,root:null}}function Vr(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 vu(e,t){let n=U(e.entry),o=U(t.entry),r=Vr(n),s=Vr(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?Bt(n.version):null,a=typeof o?.version=="string"?Bt(o.version):null;if(i&&a){let c=ps(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function ku(e,t){try{let n=U(Me(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=U(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(vu)[0],i=U(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:Pe(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function Bt(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 ps(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 wu(e,t){let n=e.lastIndexOf("@");if(n<=0||n===e.length-1)return null;let o=e.slice(0,n),r=e.slice(n+1),s=join$1(t,r,o),i;try{i=readdirSync(s,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>{let c=join$1(s,a.name),l=a.name;try{let u=U(Me(join$1(c,"package.json")));typeof u?.version=="string"&&(l=u.version);}catch{}return {name:a.name,path:c,version:l,mtimeMs:statSync$1(c).mtimeMs}});}catch{return null}return i.sort((a,c)=>{let l=Bt(a.version),u=Bt(c.version);if(l&&u){let g=ps(u,l);if(g!==0)return g}else if(l||u)return l?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?Pe(i[0].path):null}function bu(e,t){if(t.legacyArtifactRoots!==void 0){let k=t.legacyArtifactRoots.map(w=>Pe(w)).filter(w=>w!==null).map(w=>({root:w,inspectPluginConfig:true}));return {targets:k,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:k.length>0}}let n=t.claudeSettingsPath??join$1(t.homePath??homedir$1(),".claude","settings.json"),o=t.installedPluginsPath??join$1(t.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),r=t.knownMarketplacesPath??join$1(t.homePath??homedir$1(),".claude","plugins","known_marketplaces.json"),s=t.pluginCachePath??join$1(t.homePath??homedir$1(),".claude","plugins","cache"),i=[],a=[],c=[],l=[...new Set([n,join$1(e,".claude","settings.json"),join$1(e,".claude","settings.local.json")])];for(let k of l)if(existsSync$1(k))try{let w=U(Me(k));if(!w)throw new Error("settings must be an object");i.push({path:k,settings:w});}catch{a.push(k);}if(i.reduce((k,w)=>typeof w.settings.disableAllHooks=="boolean"?w.settings.disableAllHooks:k,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let g=i.map(k=>{let w=[];return vt(k.settings.hooks,w),{path:k.path,commands:w}}),d=g.flatMap(k=>k.commands),m=g.flatMap(k=>mu(k.path,k.commands)),p=[...i.reduce((k,w)=>{let S=w.settings.enabledPlugins;if(typeof S!="object"||S===null)return k;for(let[I,z]of Object.entries(S))pu(I)&&typeof z=="boolean"&&k.set(I,z);return k},new Map)].filter(([,k])=>k).map(([k])=>k).sort(),h=[...m],y=false;for(let k of p){let w=ku(k,o);w.malformed&&c.push(o);let S=w.root;if(!w.configured){let I=i.map(Z=>yu(k,Z.settings,r)).filter(Z=>Z.configured),z=I[I.length-1];z?S=z.root:S=wu(k,s);}S?h.push({root:S,inspectPluginConfig:true}):y=true;}let v=[...h.reduce((k,w)=>{let S=k.get(w.root);return S?(k.set(w.root,{root:w.root,configPath:S.configPath??w.configPath,commands:[...new Set([...S.commands??[],...w.commands??[]])],inspectPluginConfig:!!(S.inspectPluginConfig||w.inspectPluginConfig)}),k):(k.set(w.root,w),k)},new Map).values()],E=[d.length>0?"settings-hooks":null,p.length>0?"enabled-plugin":null].filter(k=>k!==null);return {targets:v,configCommands:g.filter(k=>k.commands.length>0),hooksDisabled:false,method:E.length>0?`${E.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(v.length>0||d.length>0)&&!y&&a.length===0&&c.length===0}}function _u(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 vt(e,t){if(Array.isArray(e)){for(let n of e)vt(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):vt(o,t);}function Kn(e){return [...e.matchAll(Fl)].map(t=>t[1])}function Su(e){let t=new Map,n=wt(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 Eu(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 Ru(e){if(![".cjs",".js",".mjs"].includes(extname(e)))return false;let t=spawnSync(process.execPath,["--check",e],{encoding:"utf8",env:{PATH:process.env.PATH??"",HOME:process.env.HOME??""},timeout:2e3});return t.error!==void 0||t.status!==0}function Jn(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function Re(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Qn(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>Ht)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>Ht)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,Ht+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>Ht)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 Xn(e,t){return `${e} (${t})`}function Pu(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>no){o.traversalLimitRoots.push(e);return}let u=resolve(c.path),g=resolve(c.containmentRoot),d;try{d=realpathSync.native(g);}catch{d=g;}if(!existsSync$1(u)){Re(g,u)?o.missing.push(u):o.escapedArtifacts.push(u);return}let m;try{m=realpathSync.native(u);}catch{o.missing.push(u);return}if(!Re(d,m)){o.escapedArtifacts.push(u);return}let f=`${m}:${c.parserKind}:${c.cwd}`;s.has(f)||(s.add(f),r.push({...c,path:m,depth:l}));};for(let c of n){let l=Wr(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let g of me(u.content,false,"node"))o.findings.push({artifact:u.source,endpoint:g});for(let u of l.references)a(u);}for(;r.length>0;){if(i>=is){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=Qn(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(Xn(l,u.reason));continue}let{content:g}=u;o.inspected.push(l);let d=c.parserKind==="infer"?us(l,g):c.parserKind,m=d==="shell";for(let f of me(g,m,d))o.findings.push({artifact:l,endpoint:f});if(m){let f=Wr(g,e,t,c.cwd);f.malformed&&o.malformedCommands.push(l);for(let p of f.inlineContents)for(let h of me(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:h});for(let p of f.references)a(p,c.depth+1);}else if(d==="node"||d==="python"){let f=ds(l,g,d,{project:e,homePath:t,cwd:dirname(l)});f.malformed&&o.malformedCommands.push(l);for(let p of f.inlineContents)for(let h of me(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:h});for(let p of f.references)a(p,c.depth+1);}}}function Cu(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=_u(r),c=0,l=(m,f=false,p=r,h="infer",y=e,v=0)=>{if(v>no){o.traversalLimitRoots.push(r);return}let E=realpathSync.native(p),k=resolve(m);if(!existsSync$1(k)){if(!Re(E,k)){o.escapedArtifacts.push(k);return}f&&o.missing.push(k);return}let w;try{w=realpathSync.native(k);}catch{f&&o.missing.push(k);return}if(!Re(E,w)){o.escapedArtifacts.push(k);return}let S=`${w}:${h}:${y}`;i.has(S)||(i.add(S),s.push({path:w,parserKind:h,cwd:y,depth:v}));},u=(m,f,p,h=0)=>{for(let y of Kn(m)){let v=Jn(r,y);if(!v)continue;let E=(f.artifacts??[]).find(k=>k.value.includes("PLUGIN_ROOT")&&k.value.endsWith(y));l(v,true,r,E?.parserKind??"infer",E?.cwd??p,h);}},g=(m,f,p=0,h=false)=>{for(let y of m.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let v=y.nodeResolutionKind?oo(y,!h):{reference:pe(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(v.malformed){o.malformedCommands.push(y.value);continue}if(v.inlineContent)for(let E of me(v.inlineContent.content,false,"node"))o.findings.push({artifact:v.inlineContent.source,endpoint:E});v.reference&&l(v.reference.path,true,h?r:v.reference.containmentRoot,v.reference.parserKind,v.reference.cwd??f,p);}},d=m=>{for(let p of me(m,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:p});let f=qt(m,0,{project:e,homePath:t,cwd:e});f.malformed&&o.malformedCommands.push(m),u(m,f,e),g(f,e);for(let p of f.tokens){if(!isAbsolute(p))continue;let h=ms(p),y=(f.artifacts??[]).find(v=>v.value===p);h===r&&l(p,true,r,y?.parserKind??"infer",y?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let m of n.commands)d(m);}if(n.inspectPluginConfig||!n.commands){let m=join$1(r,"hooks","hooks.json"),f=join$1(r,"hooks.json"),p=existsSync$1(f)?f:m;if(!existsSync$1(p))o.missing.push(p),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(p);let h;try{h=realpathSync.native(p);}catch{o.missing.push(p),l(join$1(r,"hooks","session-start")),h="";}if(h&&!Re(r,h)&&(o.escapedArtifacts.push(p),l(join$1(r,"hooks","session-start")),h=""),h){let y=Qn(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(Xn(p,y.reason)),l(join$1(r,"hooks","session-start"));else if(y.kind==="missing")o.missing.push(p),l(join$1(r,"hooks","session-start"));else try{let v=JSON.parse(y.content),E=[];vt(v,E);for(let k of E)d(k);}catch{o.malformedConfigs.push(p),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=is){o.traversalLimitRoots.push(r);break}let m=s.shift(),f=m.path;c+=1;let p=Qn(f);if(p.kind==="missing"){o.missing.push(f);continue}if(p.kind==="unsafe"){o.unsafeArtifacts.push(Xn(f,p.reason));continue}let{content:h}=p;o.inspected.push(f);let y=m.parserKind==="infer"?us(f,h):m.parserKind,v=y==="shell";for(let w of me(h,v,y))o.findings.push({artifact:f,endpoint:w});if(v){let w=Su(h),S=qt(w,0,{project:e,homePath:t,cwd:dirname(f)},{tolerateControlSyntax:true});Eu(h)&&o.malformedCommands.push(f),u(w,S,dirname(f),m.depth+1),g(S,dirname(f),m.depth+1,true);}else if(y==="node"||y==="python"){let w=ds(f,h,y,{project:e,homePath:t,cwd:dirname(f)},false);(y==="node"?Ru(f):w.malformed)&&o.malformedCommands.push(f);for(let S of w.inlineContents)for(let I of me(S.content,false,"node"))o.findings.push({artifact:S.source,endpoint:I});for(let S of w.references){let I=relative(r,resolve(S.path));!I.startsWith(`..${sep}`)&&I.split(sep).includes("node_modules")||l(S.path,true,r,S.parserKind,S.cwd,m.depth+1);}for(let S of Kn(h)){let I=Jn(r,S);I&&l(I,true,r,y,m.cwd,m.depth+1);}}else for(let w of Kn(h)){let S=Jn(r,w);S&&l(S,true,r,y,m.cwd,m.depth+1);}let E=f.startsWith(`${r}/`)?f.slice(r.length+1):"",k=basename(E).replace(/\.js$/,"");a&&(E.startsWith("hooks/")||E.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${k}.ts`),false,a),E.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${k}.js`));}}function Du(e){let t=e.installedPluginsPath??join$1(e.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),n=new Map;if(!existsSync$1(t))return new Map;try{let o=U(Me(t)),r=U(o?.plugins);if(!r)return new Map;for(let s of Object.values(r))if(Array.isArray(s))for(let i of s){let a=U(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=Pe(a.installPath);if(!c)continue;let l=n.get(c)??new Set;l.add(a.version),n.set(c,l);}}catch{return new Map}return new Map([...n].map(([o,r])=>[o,[...r].sort()]))}function Gr(e){try{let t=U(Me(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Ou(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=Du(t);for(let r of e){let s=r.root,i=join$1(s,"package.json"),a=join$1(s,".claude-plugin","plugin.json");if(!(existsSync$1(i)||existsSync$1(a)))continue;let l=join$1(s,"hooks","hooks.json"),u=join$1(s,"hooks.json");existsSync$1(l)||n.layoutIssues.push({root:s,issue:"missing hooks/hooks.json"}),existsSync$1(u)&&n.layoutIssues.push({root:s,issue:"retired root hooks.json is present"});let g=existsSync$1(l)?l:u;try{let v=U(Me(g)),E=U(v?.hooks),k=[];vt(E?.SessionStart,k),k.some(w=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(w))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let d=Gr(i),m=Gr(a),f=o.get(s)??[],p={root:s,packageVersion:d,manifestVersion:m,registryVersions:f};n.versionRecords.push(p),(!d||!m||d!==m||f.some(v=>v!==d))&&n.versionIssues.push(p);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let v=readFileSync$1(h,"utf8");(!existsSync$1(y)||!v.includes("hook-daemon.js"))&&n.daemonIssues.push({root:s,issue:"SessionStart does not register the packaged hook daemon"});}catch{n.daemonIssues.push({root:s,issue:"SessionStart wrapper or hook daemon is missing"});}}return n}function $u(e,t){let n=bu(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let O of n.configCommands){o.configsInspected.push(O.path);for(let K of O.commands){o.commandsInspected.push({configPath:O.path,command:K});for(let D of me(K,true))o.findings.push({artifact:O.path,endpoint:D});}}Pu(e,t.homePath??homedir$1(),n.configCommands.flatMap(O=>O.commands).filter(O=>!n.targets.some(K=>K.commands?.includes(O))),o);for(let O of n.targets)Cu(e,t.homePath??homedir$1(),O,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((O,K,D)=>D.findIndex(x=>x.configPath===O.configPath&&x.command===O.command)===K),a=[...new Set(o.missing)],c=[...new Set(o.malformedConfigs)],l=[...new Set(o.malformedCommands)],u=[...new Set(o.unsafeArtifacts)],g=[...new Set(o.traversalLimitRoots)],d=[...new Set(o.escapedArtifacts)],m=o.findings.filter((O,K,D)=>D.findIndex(x=>x.artifact===O.artifact&&x.endpoint===O.endpoint)===K),f=a.length>0||d.length>0||u.length>0,p=f&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=Ou(n.targets,t),y=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,v=t.homePath??(y&&basename(y)===".claude"?dirname(y):y)??homedir$1(),E=n.targets.map(O=>O.root).find(O=>existsSync$1(join$1(O,"skills")))??null,k=t.activePluginRoot?{root:existsSync$1(t.activePluginRoot)?t.activePluginRoot:null,version:null}:E?{root:E,version:null}:Ce(v,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),w=k.root,S=w?et(v,w):[],I=S.filter(O=>!O.isKnownDevFlowArtifact).map(O=>({skillName:O.skillName,path:O.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),z=[{key:"active_plugin_resolution",value:p,target:"resolved active DevFlow hook configuration",ok:n.ok&&!f,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(O=>O.root),ok:true,severity:"info"},{key:"hooks_disabled",value:n.hooksDisabled,ok:true,severity:"info"},{key:"plugin_hook_layout",value:h.layoutIssues,target:"hooks/hooks.json present and root hooks.json absent",ok:h.layoutIssues.length===0,severity:"error"},{key:"plugin_version_parity",value:h.versionRecords,target:"manifest, package, and installed registry versions match",ok:h.versionIssues.length===0,severity:"error"},{key:"session_start_hook_registration",value:h.sessionStartIssues,target:[],ok:h.sessionStartIssues.length===0,severity:"error"},{key:"hook_daemon_artifact_registration",value:h.daemonIssues,target:[],ok:h.daemonIssues.length===0,severity:"error"},{key:"malformed_active_settings",value:n.malformedSettings,target:[],ok:n.malformedSettings.length===0,severity:"warning"},{key:"malformed_plugin_metadata",value:n.malformedPluginMetadata,target:[],ok:n.malformedPluginMetadata.length===0,severity:"warning"},{key:"hook_configs_inspected",value:r.length,target:n.hooksDisabled?"hooks disabled":">= 1 hook config file",ok:n.hooksDisabled||r.length>0,severity:"warning"},{key:"legacy_artifacts_inspected",value:s.length+i.length,target:n.hooksDisabled?"hooks disabled":">= 1 active hook artifact",ok:n.hooksDisabled||s.length+i.length>0,severity:"warning"},{key:"missing_legacy_artifacts",value:a,target:[],ok:a.length===0,severity:"warning"},{key:"malformed_hook_configs",value:c,target:[],ok:c.length===0,severity:"warning"},{key:"malformed_hook_commands",value:l,target:[],ok:l.length===0,severity:"warning"},{key:"unsafe_legacy_artifacts",value:u,target:[],ok:u.length===0,severity:"warning"},{key:"legacy_artifact_traversal_limit",value:g,target:[],ok:g.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:d.length,target:0,ok:d.length===0,severity:"warning"},{key:"retired_producer_paths",value:m.length,target:0,ok:m.length===0,severity:"error"},{key:"retired_producer_path_findings",value:m,ok:true,severity:"info"},{key:"skill_shadowing_count",value:S.length,target:0,ok:S.length===0,severity:"error"},{key:"shadowed_skills",value:S,target:[],ok:S.length===0,severity:"error"},{key:"active_skill_source",value:w,target:"existing plugin cache path",ok:true,severity:"info"},{key:"skill_shadowing_remediation",value:I,target:[],ok:true,severity:"info"}],Z=k.version??h.versionRecords.find(O=>O.root===w)?.packageVersion;return Z&&z.push({key:"active_plugin_version",value:Z,ok:true,severity:"info"}),{name:"Legacy paths",status:T(z),metrics:z}}function Au(e){let t=dirname(fileURLToPath(import.meta.url)),n=[...new Set([e.acceptanceManifestPath,e.env?.DEVFLOW_ACCEPTANCE_MANIFEST,process.env.DEVFLOW_ACCEPTANCE_MANIFEST,join$1(t,"..","acceptance-manifest.json"),join$1(t,"..","..","..","..","packages","devflow","acceptance-manifest.json"),join$1(process.cwd(),"packages","devflow","acceptance-manifest.json")].filter(o=>!!o))];for(let o of n)if(existsSync$1(o))try{return {path:o,manifest:JSON.parse(readFileSync$1(o,"utf8"))}}catch(r){return {path:o,error:r.message}}return {error:`not found (${n.join(", ")})`}}function Jt(e){let t=Au(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)/Qe: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 xu(e,t){let n=[],o=join$1(e,".devflow","config.json"),r="default-enabled";if(existsSync$1(o))try{r=JSON.parse(readFileSync$1(o,"utf8")).sessionStart?.injectMemories??"default-enabled";}catch(a){n.push({key:"session_start_config",value:a.message,target:"valid .devflow/config.json",ok:false,severity:"error"});}let s=r!==false;n.push({key:"session_start_memory_injection",value:r,target:"enabled or configured budget",ok:s,severity:"warning"});let i=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(i))n.push({key:"explicit_memory_channel",value:"memory database missing",target:"observations.source supports explicit_intent",ok:false,severity:"warning"});else {let a;try{a=ee(i,t);let l=(M(a,"observations")?a.prepare("PRAGMA table_info(observations)").all().map(u=>u.name):[]).includes("source");n.push({key:"explicit_memory_channel",value:l?"explicit_intent source available":"source column missing",target:"explicit_intent source available",ok:l,severity:"warning"}),l&&n.push({key:"explicit_memory_observations",value:B(a,"SELECT COUNT(*) count FROM observations WHERE source = 'explicit_intent'"),ok:!0,severity:"info"});}catch(c){n.push({key:"explicit_memory_channel_read",value:c.message,target:"readable memory database",ok:false,severity:"error"});}finally{a?.close();}}return {name:"Injection",status:T(n),metrics:n}}function Nu(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Memory quality",status:T(n),metrics:n};let r;try{if(r=ee(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*Qe,i=r.prepare(`
199
199
  SELECT source, COUNT(*) count FROM memories
200
200
  WHERE created_at >= ? GROUP BY source ORDER BY source
201
201
  `).all(s),a=r.prepare(`
@@ -207,20 +207,20 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
207
207
  SELECT access_type, COUNT(*) count
208
208
  FROM retrieval_access_log
209
209
  GROUP BY access_type
210
- `).all();n.push({key:"memory_retrieval_attribution",value:Object.fromEntries(c.map(l=>[l.access_type,Number(l.count)])),target:"selected/exposed are distinct from adopted",ok:!0,severity:"info"});}if(M(r,"observations"))if(!fe(r,"observations").has("evidence_status"))n.push({key:"explicit_memory_evidence_schema",value:"evidence_status missing",target:"memory schema v8+",ok:!1,severity:"error"});else {let l=r.prepare(`
210
+ `).all();n.push({key:"memory_retrieval_attribution",value:Object.fromEntries(c.map(l=>[l.access_type,Number(l.count)])),target:"selected, consumed, verified, and outcome stages remain distinct",ok:!0,severity:"info"});}if(M(r,"observations"))if(!fe(r,"observations").has("evidence_status"))n.push({key:"explicit_memory_evidence_schema",value:"evidence_status missing",target:"memory schema v8+",ok:!1,severity:"error"});else {let l=r.prepare(`
211
211
  SELECT
212
212
  COUNT(*) total,
213
213
  SUM(CASE WHEN evidence_status = 'verified' THEN 1 ELSE 0 END) verified
214
214
  FROM observations
215
215
  WHERE source = 'explicit_intent' AND quality_status = 'accepted'
216
- `).get(),u=Number(l?.total??0),d=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?d/u:1,target:1,ok:u===0||d===u,severity:"warning"});}n.push({key:"memory_access_distribution",value:{neverAccessed:Number(a?.never_accessed??0),accessed:Number(a?.accessed??0)},ok:!0,severity:"info"});}}catch(s){n.push({key:"memory_quality_read",value:s.message,target:"readable memory database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Memory quality",status:N(n),metrics:n}}function Ou(e,t){let n=[],o=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(o))return n.push({key:"knowledge_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Knowledge quality",status:N(n),metrics:n};let r;try{if(r=te(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 i=fe(r,"knowledge_chunks").has("token_count")?"COALESCE(token_count, CAST((length(content) + 3) / 4 AS INTEGER))":"CAST((length(content) + 3) / 4 AS INTEGER)",a=r.prepare(`SELECT ${i} length FROM knowledge_chunks ORDER BY ${i}`).all().map(g=>Number(g.length)),c=Math.max(0,Math.ceil(a.length*.95)-1),l=a.length===0?0:a[c];n.push({key:"knowledge_chunk_length_p95",value:l,target:"<= 3000 tokens",ok:l<=3e3,severity:"error"});let u=r.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'knowledge_fts'").get(),d=/tokenize\s*=\s*['\"]?trigram/i.test(u?.sql??"");if(n.push({key:"knowledge_fts_tokenizer",value:d?"trigram":"missing/non-trigram",target:"trigram",ok:d,severity:"warning"}),M(r,"knowledge_source_readiness")){let g=r.prepare(`
216
+ `).get(),u=Number(l?.total??0),g=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?g/u:1,target:1,ok:u===0||g===u,severity:"warning"});}n.push({key:"memory_access_distribution",value:{neverAccessed:Number(a?.never_accessed??0),accessed:Number(a?.accessed??0)},ok:!0,severity:"info"});}}catch(s){n.push({key:"memory_quality_read",value:s.message,target:"readable memory database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Memory quality",status:T(n),metrics:n}}function ju(e,t){let n=[],o=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(o))return n.push({key:"knowledge_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Knowledge quality",status:T(n),metrics:n};let r;try{if(r=ee(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 i=fe(r,"knowledge_chunks").has("token_count")?"COALESCE(token_count, CAST((length(content) + 3) / 4 AS INTEGER))":"CAST((length(content) + 3) / 4 AS INTEGER)",a=r.prepare(`SELECT ${i} length FROM knowledge_chunks ORDER BY ${i}`).all().map(d=>Number(d.length)),c=Math.max(0,Math.ceil(a.length*.95)-1),l=a.length===0?0:a[c];n.push({key:"knowledge_chunk_length_p95",value:l,target:"<= 3000 tokens",ok:l<=3e3,severity:"error"});let u=r.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'knowledge_fts'").get(),g=/tokenize\s*=\s*['\"]?trigram/i.test(u?.sql??"");if(n.push({key:"knowledge_fts_tokenizer",value:g?"trigram":"missing/non-trigram",target:"trigram",ok:g,severity:"warning"}),M(r,"knowledge_source_readiness")){let d=r.prepare(`
217
217
  SELECT source, expected_version, documents, chunks, vectors, coverage, status, failure_category
218
218
  FROM knowledge_source_readiness ORDER BY source
219
- `).all(),f=g.filter(m=>Number(m.documents??0)>0||Number(m.chunks??0)>0),p=f.length>0?Math.min(...f.map(m=>Number(m.coverage??0))):0;n.push({key:"knowledge_source_readiness",value:g,target:"all active sources current with >=95% vector coverage",ok:f.length>0&&f.every(m=>m.status==="ready"&&Number(m.coverage??0)>=.95),severity:"error"}),n.push({key:"knowledge_vector_coverage",value:p,target:">= 0.95",ok:f.length>0&&p>=.95,severity:"error"});}}}catch(s){n.push({key:"knowledge_quality_read",value:s.message,target:"readable knowledge database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Knowledge quality",status:N(n),metrics:n}}function $u(e){let{manifest:t,metrics:n}=zt(e),o=t?.contract?.surfaces??[];return n.push({key:"contract_surfaces",value:o,target:["cli","http","mcp","hook"],ok:t?.contract?.status==="green"&&o.length===4,severity:"error"}),n.push({key:"contract_test_files",value:t?.contract?.tests?.length??0,target:4,ok:t?.contract?.tests?.length===4,severity:"warning"}),{name:"Contract",status:N(n),metrics:n}}function Au(e){let{manifest:t,metrics:n}=zt(e),o=t?.deadcode?.actionableExports;return n.push({key:"ts_prune_actionable_exports",value:o??"missing",target:0,ok:t?.deadcode?.status==="green"&&o===0,severity:"error"}),n.push({key:"ts_prune_allowlisted_exports",value:t?.deadcode?.allowlistedExports??"missing",ok:true,severity:"info"}),{name:"Deadcode",status:N(n),metrics:n}}function xu(e){let{manifest:t,metrics:n}=zt(e),o=t?.dataFace?.sharedAdapters??[];return n.push({key:"shared_retrieval_adapters",value:o,target:["getProjectContextResult","getMemoryResult","getKnowledgeResult"],ok:t?.dataFace?.status==="green"&&o.length===3,severity:"error"}),{name:"Data face",status:N(n),metrics:n}}async function Nu(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 ju(e){let{manifest:t,metrics:n}=zt(e),o=t?.ui?.routes??[];n.push({key:"dashboard_routes",value:o.length,target:">= 13",ok:t?.ui?.status==="green"&&o.length>=13,severity:"warning"});let r=readRuntimeEndpointState(e.homePath??homedir$1());if((!r||r.status==="stopped")&&!e.httpGet)return n.push({key:"dashboard_server_health",value:"inactive",target:"HTTP 200 when the runtime endpoint is active",ok:true,severity:"info"}),{name:"UI reachability",status:N(n),metrics:n};let s=e.env?.PORT??process.env.PORT??"13337",i=`${r?.url??`http://127.0.0.1:${s}`}/api/health`;try{let a=await(e.httpGet??Nu)(i);n.push({key:"dashboard_server_health",value:{url:i,status:a.status},target:"HTTP 200",ok:a.status===200,severity:"warning"});}catch(a){n.push({key:"dashboard_server_health",value:a.message,target:"HTTP 200",ok:false,severity:"warning"});}return {name:"UI reachability",status:N(n),metrics:n}}async function oo(e={},t={}){let n=e.project??process.cwd(),o=Vn(n),r=$u(t),s=await pl(o.path,t);r.metrics.push(...s.metrics),r.status=N(r.metrics);let i=[yl(n,t),Sl(o.path,t),Ru(o.path,t),await Pl(o.path,t),Cl(o.path,!!e.strict,t),Cu(o.path,t),Du(o.path,t),Ou(o.path,t),r,Au(t),Ol(t),$l(o.path,t),xu(t),Dl(t),await ju(t),xl(t)],a=i.some(c=>c.status==="red"||e.strict&&c.status==="yellow")?1:0;return {schemaVersion:DOCTOR_SCHEMA_VERSION,sections:i,exitCode:a}}function Tu(e,t={}){return e===void 0?ps():oo(e,t)}function Gr(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function ms(e){let t=[];for(let n of e.sections){let o=`[${n.status.toUpperCase()}]`,r=n.status==="green"?_.green:n.status==="yellow"?_.yellow:_.red;t.push(`${r(o)} ${_.bold(n.name)}`);for(let s of n.metrics){let i=s.target===void 0?"":` (target: ${Gr(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${Gr(s.value)}${i}`);}}return t.join(`
220
- `)}async function Iu(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await oo(e,n);return t.stdout(e.json?JSON.stringify(o):ms(o)),o.exitCode}async function Vt(e){let{createEngines:t}=await import('@devflow-tools/context-engine');return t(e)}async function ps(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await Vt(e),a=t.getStats(),c=n.export(),l=0;try{l=(await s.list()).length;}catch{}let u=false,d=0;try{let h=await o.getAll();u=!!h?.project,d=Object.keys(h?.user??{}).length;}catch{}let g=0;try{g=(await r.getSources()).length;}catch{}let f={total:0,byTool:{}};try{f=await i.getToolCallStats();}catch{}let p=await ft(),m=0;return a.fileCount>0&&(m+=25),a.nodeCount>0&&(m+=15),c.nodes.length>0&&(m+=20),u&&(m+=15),g>0&&(m+=10),l>0&&(m+=5),p.running&&(m+=10),f.total>0&&(m+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:u,userPrefs:d},knowledge:{sources:g},plugins:{installed:0,names:[]},workflows:{registered:l},server:{running:p.running},toolCalls:f,readyScore:m}}async function Mu(){let{data:e}=await Vt(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 Lu(){let{data:e}=await Vt(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 Fu(e){let{data:t}=await Vt(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 Hu(){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 Lt,vl,Gn,_l,Ze,Zn,Ir,Nl,jl,rs,Ft,to,ss,is,Tl,Il,Ml,Lr,Yl,Wr,Ur,Br,qr,Zl,Ql,Xl,tu,nu,Kr,ou,iu,au,ys=O(()=>{Be();Se();Nn();vl={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},Gn=3600*1e3;_l=new Set(["pending","committed","expired"]);Ze=1440*60*1e3,Zn=30*Ze,Ir=60*1024*1024;Nl=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,jl=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,rs=64,Ft=1024*1024,to=8,ss=8,is=64*1024;Tl=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),Il=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),Ml=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;Lr=[".cjs",".js",".mjs",".ts",".tsx"];Yl=new Set(["bash","node","python","python3","sh","tsx","zsh"]);Wr=new Set(["-r","--require"]),Ur=new Set(["--experimental-loader","--import","--loader"]),Br=new Set(["-e","--eval","-p","--print"]),qr=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),Zl=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),Ql=new Set(["--check","-c"]),Xl=new Set(["--help","--version","-h","-v"]);tu=new Set(["-e","-eu","-o","-u","-ue"]),nu=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Kr=new Set(["-W","-X","--check-hash-based-pycs"]),ou=new Set(["--help","--version","-h","-V"]);iu=new Set(["builtin","command","env","exec","nohup","timeout"]),au=new Set([":","[","echo","false","printf","pwd","test","true"]);});var vs={};A(vs,{runMemoryMaintainCommand:()=>qu});function Bu(e){if(!e)return;let t=e.split(",").map(o=>o.trim()).filter(Boolean),n=t.filter(o=>!MEMORY_MAINTENANCE_ACTIONS.includes(o));if(n.length>0)throw new Error(`Unknown memory maintenance action(s): ${n.join(", ")}`);return [...new Set(t)]}async function qu(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:Bu(e.actions),apply:e.apply===true,dryRun:e.apply!==true,batchSize:e.batchSize});if(e.json)return JSON.stringify(t,null,2);let{before:n,after:o,changes:r}=t;return [`Memory maintenance: ${t.mode}`,`Pending events: ${n.pendingEvents.count} -> ${o.pendingEvents.count}`,`Eligible observation vectors: ${n.observationVectors.coverage.toFixed(3)} -> ${o.observationVectors.coverage.toFixed(3)}`,`Duplicate groups: ${n.duplicates.groups} -> ${o.duplicates.groups}`,`Changes: events=${r.duplicateEventsDeleted}, low-value=${r.lowValueEventsDiscarded}, observations=${r.observationsQuarantined}, vectors=${r.vectorsBackfilled}, leases=${r.staleLeasesReleased}`,t.backupPath?`Backup: ${t.backupPath}`:"Backup: none (dry-run)"].join(`
221
- `)}var ks=O(()=>{});var ws={};A(ws,{generateToken:()=>zu});async function zu(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 bs=O(()=>{});var ro={};A(ro,{reportBenchmarkCommand:()=>Qu,runBenchmarkCommand:()=>Zu});async function Zu(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}
219
+ `).all(),m=d.filter(p=>Number(p.documents??0)>0||Number(p.chunks??0)>0),f=m.length>0?Math.min(...m.map(p=>Number(p.coverage??0))):0;n.push({key:"knowledge_source_readiness",value:d,target:"all active sources current with >=95% vector coverage",ok:m.length>0&&m.every(p=>p.status==="ready"&&Number(p.coverage??0)>=.95),severity:"error"}),n.push({key:"knowledge_vector_coverage",value:f,target:">= 0.95",ok:m.length>0&&f>=.95,severity:"error"});}}}catch(s){n.push({key:"knowledge_quality_read",value:s.message,target:"readable knowledge database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Knowledge quality",status:T(n),metrics:n}}function Tu(e){let{manifest:t,metrics:n}=Jt(e),o=t?.contract?.surfaces??[];return n.push({key:"contract_surfaces",value:o,target:["cli","http","mcp","hook"],ok:t?.contract?.status==="green"&&o.length===4,severity:"error"}),n.push({key:"contract_test_files",value:t?.contract?.tests?.length??0,target:4,ok:t?.contract?.tests?.length===4,severity:"warning"}),{name:"Contract",status:T(n),metrics:n}}function Iu(e){let{manifest:t,metrics:n}=Jt(e),o=t?.deadcode?.actionableExports;return n.push({key:"ts_prune_actionable_exports",value:o??"missing",target:0,ok:t?.deadcode?.status==="green"&&o===0,severity:"error"}),n.push({key:"ts_prune_allowlisted_exports",value:t?.deadcode?.allowlistedExports??"missing",ok:true,severity:"info"}),{name:"Deadcode",status:T(n),metrics:n}}function Mu(e){let{manifest:t,metrics:n}=Jt(e),o=t?.dataFace?.sharedAdapters??[];return n.push({key:"shared_retrieval_adapters",value:o,target:["projectDiagnosticCodeResult","getDiagnosticMemoryResult","getDiagnosticKnowledgeResult"],ok:t?.dataFace?.status==="green"&&o.length===3,severity:"error"}),{name:"Data face",status:T(n),metrics:n}}async function Lu(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 Fu(e){let{manifest:t,metrics:n}=Jt(e),o=t?.ui?.routes??[];n.push({key:"dashboard_routes",value:o.length,target:">= 13",ok:t?.ui?.status==="green"&&o.length>=13,severity:"warning"});let r=readRuntimeEndpointState(ie(e));if((!r||r.status==="stopped")&&!e.httpGet)return n.push({key:"dashboard_server_health",value:"inactive",target:"HTTP 200 when the runtime endpoint is active",ok:true,severity:"info"}),{name:"UI reachability",status:T(n),metrics:n};let s=e.env?.PORT??process.env.PORT??"13337",i=`${r?.url??`http://127.0.0.1:${s}`}/api/health`;try{let a=await(e.httpGet??Lu)(i);n.push({key:"dashboard_server_health",value:{url:i,status:a.status},target:"HTTP 200",ok:a.status===200,severity:"warning"});}catch(a){n.push({key:"dashboard_server_health",value:a.message,target:"HTTP 200",ok:false,severity:"warning"});}return {name:"UI reachability",status:T(n),metrics:n}}async function ro(e={},t={}){let n=e.project??process.cwd(),o=Vn(n),r=Tu(t),s=await wl(o.path,t);r.metrics.push(...s.metrics),r.status=T(r.metrics);let i=[_l(n,t),Dl(o.path,t),$u(o.path,t),await Al(o.path,t),xl(o.path,!!e.strict,t),xu(o.path,t),Nu(o.path,t),ju(o.path,t),r,Iu(t),jl(t),Tl(o.path,t),Mu(t),Nl(t),await Fu(t),Ml(t)],a=i.some(c=>c.status==="red"||e.strict&&c.status==="yellow")?1:0;return {schemaVersion:DOCTOR_SCHEMA_VERSION,sections:i,exitCode:a}}function Hu(e,t={}){return e===void 0?ys():ro(e,t)}function Yr(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function hs(e){let t=[];for(let n of e.sections){let o=`[${n.status.toUpperCase()}]`,r=n.status==="green"?_.green:n.status==="yellow"?_.yellow:_.red;t.push(`${r(o)} ${_.bold(n.name)}`);for(let s of n.metrics){let i=s.target===void 0?"":` (target: ${Yr(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${Yr(s.value)}${i}`);}}return t.join(`
220
+ `)}async function Wu(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await ro(e,n);return t.stdout(e.json?JSON.stringify(o):hs(o)),o.exitCode}async function zt(e){let{createEngines:t}=await import('@devflow-tools/mcp-server/composition');return t(e)}async function ys(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await zt(e),a=t.getStats(),c=n.export(),l=0;try{l=(await s.list()).length;}catch{}let u=false,g=0;try{let h=await o.getAll();u=!!h?.project,g=Object.keys(h?.user??{}).length;}catch{}let d=0;try{d=(await r.getSources()).length;}catch{}let m={total:0,byTool:{}};try{m=await i.getToolCallStats();}catch{}let f=await mt(),p=0;return a.fileCount>0&&(p+=25),a.nodeCount>0&&(p+=15),c.nodes.length>0&&(p+=20),u&&(p+=15),d>0&&(p+=10),l>0&&(p+=5),f.running&&(p+=10),m.total>0&&(p+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:u,userPrefs:g},knowledge:{sources:d},plugins:{installed:0,names:[]},workflows:{registered:l},server:{running:f.running},toolCalls:m,readyScore:p}}async function Uu(){let{data:e}=await zt(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 qu(){let{data:e}=await zt(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 Bu(e){let{data:t}=await zt(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 Ku(){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 Ft,Sl,Gn,Cl,Qe,Zn,Mr,Ll,Fl,is,Ht,no,as,cs,Hl,Wl,Ul,Fr,tu,Ur,qr,Br,Kr,nu,ou,ru,iu,au,Jr,cu,du,gu,ks=$(()=>{qe();Se();Nn();Sl={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},Gn=3600*1e3;Cl=new Set(["pending","committed","expired"]);Qe=1440*60*1e3,Zn=30*Qe,Mr=60*1024*1024;Ll=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,Fl=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,is=64,Ht=1024*1024,no=8,as=8,cs=64*1024;Hl=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),Wl=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),Ul=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;Fr=[".cjs",".js",".mjs",".ts",".tsx"];tu=new Set(["bash","node","python","python3","sh","tsx","zsh"]);Ur=new Set(["-r","--require"]),qr=new Set(["--experimental-loader","--import","--loader"]),Br=new Set(["-e","--eval","-p","--print"]),Kr=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),nu=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),ou=new Set(["--check","-c"]),ru=new Set(["--help","--version","-h","-v"]);iu=new Set(["-e","-eu","-o","-u","-ue"]),au=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Jr=new Set(["-W","-X","--check-hash-based-pycs"]),cu=new Set(["--help","--version","-h","-V"]);du=new Set(["builtin","command","env","exec","nohup","timeout"]),gu=new Set([":","[","echo","false","printf","pwd","test","true"]);});var ws={};A(ws,{runMemoryMaintainCommand:()=>Gu});function Vu(e){if(!e)return;let t=e.split(",").map(o=>o.trim()).filter(Boolean),n=t.filter(o=>!MEMORY_MAINTENANCE_ACTIONS.includes(o));if(n.length>0)throw new Error(`Unknown memory maintenance action(s): ${n.join(", ")}`);return [...new Set(t)]}async function Gu(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:Vu(e.actions),apply:e.apply===true,dryRun:e.apply!==true,batchSize:e.batchSize});if(e.json)return JSON.stringify(t,null,2);let{before:n,after:o,changes:r}=t;return [`Memory maintenance: ${t.mode}`,`Pending events: ${n.pendingEvents.count} -> ${o.pendingEvents.count}`,`Eligible observation vectors: ${n.observationVectors.coverage.toFixed(3)} -> ${o.observationVectors.coverage.toFixed(3)}`,`Duplicate groups: ${n.duplicates.groups} -> ${o.duplicates.groups}`,`Changes: events=${r.duplicateEventsDeleted}, low-value=${r.lowValueEventsDiscarded}, observations=${r.observationsQuarantined}, vectors=${r.vectorsBackfilled}, leases=${r.staleLeasesReleased}`,t.backupPath?`Backup: ${t.backupPath}`:"Backup: none (dry-run)"].join(`
221
+ `)}var bs=$(()=>{});var _s={};A(_s,{generateToken:()=>Qu});async function Qu(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 Ss=$(()=>{});var so={};A(so,{reportBenchmarkCommand:()=>od,runBenchmarkCommand:()=>nd});async function nd(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}
222
222
 
223
- Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function Qu(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=Xu(o,n);return r==="markdown"?`${s}
223
+ Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function od(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=rd(o,n);return r==="markdown"?`${s}
224
224
  ## Change From Prior Baseline
225
225
 
226
226
  ${i.map(a=>`- ${a}`).join(`
@@ -229,20 +229,20 @@ ${i.map(a=>`- ${a}`).join(`
229
229
 
230
230
  Change from ${o.runId}:
231
231
  ${i.map(a=>`- ${a}`).join(`
232
- `)}`}function Xu(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [Gt("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),Gt("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),Gt("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),Gt("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function Gt(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 so=O(()=>{});var ao={};A(ao,{reportEvaluationCommand:()=>ad,runEvaluationCommand:()=>id});async function id(e){let t=getBenchmarkSuite(e.suite);if(!t)throw new Error(`Unknown evaluation suite "${e.suite}"`);let n=e.database??openGlobalDevFlowDatabase();try{if(e.suite.startsWith("agent:")){let i=`eval-waiting:${Date.now()}:${randomUUID().slice(0,8)}`,a=t.tasks.flatMap(c=>Array.from({length:e.trials},(l,u)=>n.requestHostAction({runId:i,engineRunId:i,stepId:`${c.id}:trial-${u+1}`,projectRoot:e.projectRoot})));return JSON.stringify({status:"waiting",runId:i,actionIds:a.map(c=>c.actionId)},null,2)}let o=cd(e.projectRoot),r=[];for(let i=0;i<e.trials;i+=1){let a=await new BenchmarkEngine().runSuite(e.projectRoot,t,{rounds:1});for(let c of a.tasks){let l=c.devflow.correctnessScore>=1,u={graderId:"retrieval_correctness",kind:"deterministic",status:l?"passed":"failed",score:c.devflow.correctnessScore,threshold:1,evidence:[{type:"matched_files",value:JSON.stringify(c.devflow.matchedFiles)},{type:"matched_symbols",value:JSON.stringify(c.devflow.matchedSymbols)}],reason:l?"All expected retrieval targets were selected.":"Expected retrieval targets were missing.",durationMs:c.devflow.durationMs,receipt:`grader:${Yt(JSON.stringify(c)).slice(0,24)}`},d={trialId:`trial:${randomUUID()}`,executionId:`eval-exec:${randomUUID()}`,taskId:c.taskId,projectRevision:o,fixtureVersion:t.version,taskInputHash:Yt(c.prompt),toolProfileHash:Yt("benchmark-context-deep:r3.v1"),acceptanceHash:Yt(JSON.stringify(t.tasks.find(g=>g.id===c.taskId))),status:u.status,graderResults:[u],durationMs:c.devflow.durationMs,tokensUsed:c.devflow.tokensUsed,fallbackCount:0,failureCategory:l?void 0:"retrieval_correctness",simulated:!1};r.push({...d,evidenceReceipt:createTrialReceipt(d)});}}let s=aggregateRepeatedTrials({suiteId:t.id,suiteVersion:t.version,projectRoot:e.projectRoot,commit:o,k:e.trials,trials:r});return n.insertBenchmarkReport(s),renderRepeatedTrialReport(s,e.output??"text")}finally{e.database||n.close();}}function ad(e){let t=e.database??openGlobalDevFlowDatabase();try{let n=t.getBenchmarkReport(e.runId);if(!n||!("k"in n)||!Array.isArray(n.trials))throw new Error(`Evaluation report "${e.runId}" not found`);return renderRepeatedTrialReport(n,e.output??"text")}finally{e.database||t.close();}}function cd(e){try{return execFileSync("git",["rev-parse","HEAD"],{cwd:e,encoding:"utf8"}).trim()}catch{return "unknown"}}function Yt(e){return createHash("sha256").update(e).digest("hex")}var co=O(()=>{});var Cs={};A(Cs,{runReview:()=>ld});async function ld(e){let t,n;if(e.prUrl){let u=e.prUrl.match(/pull\/(\d+)/);n=`PR: ${u?`#${u[1]}`:e.prUrl}`;try{t=execSync(`gh pr diff ${e.prUrl}`,{encoding:"utf-8",maxBuffer:10*1024*1024});}catch{t=`Could not fetch PR diff from ${e.prUrl}. Ensure 'gh' CLI is installed and authenticated.`;}}else {n="Current branch vs main";try{t=execSync("git diff main...HEAD",{encoding:"utf-8",maxBuffer:10*1024*1024});}catch{t="Could not compute diff. Ensure you're on a feature branch.";}}let o=(t.match(/^diff --git/gm)??[]).length,r=(t.match(/^\+[^+]/gm)??[]).length,s=(t.match(/^-[^-]/gm)??[]).length,i=[],a=[],c=[];return t.includes("console.log")&&a.push("Contains console.log statements \u2014 remove before merge"),(t.includes(".only(")||t.includes("it.only"))&&i.push("Contains .only() test filters \u2014 remove before merge"),(t.includes("TODO")||t.includes("FIXME"))&&a.push("Contains TODO/FIXME comments \u2014 track or resolve"),(t.match(/^\+.*TODO/gm)||t.match(/^\+.*FIXME/gm))&&a.push("New code introduces TODO/FIXME comments"),t.includes("process.exit")&&a.push("Contains process.exit() \u2014 consider throwing instead"),t.includes(": any")&&t.match(/^\+.*: any/gm)&&c.push("New code uses `any` type \u2014 use explicit types instead"),[_.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?_.red(`Critical (${i.length})`):"",...i.map(u=>` ${_.red("\u25CF")} ${u}`),"",a.length>0?_.yellow(`Warning (${a.length})`):"",...a.map(u=>` ${_.yellow("\u25CB")} ${u}`),"",c.length>0?_.green(`Suggestion (${c.length})`):"",...c.map(u=>` ${_.green("\u25CB")} ${u}`),"",i.length>0?_.red("Overall: Need changes"):a.length>0?_.yellow("Overall: Approve with comments"):_.green("Overall: LGTM")].join(`
233
- `)}var Ds=O(()=>{});var Os={};A(Os,{startAll:()=>dd});async function ud(e,t=15e3){let n=Date.now();for(;Date.now()-n<t;){try{if((await fetch(`http://127.0.0.1:${e}/api/health`)).ok)return !0}catch{}await new Promise(o=>setTimeout(o,500));}return false}async function dd(e){console.log(_.blue("Starting DevFlow server..."));let{pid:t}=await Hn({port:e.port});console.log(_.green(` Server started (PID: ${t})`)),console.log(_.blue(" Waiting for server..."));let n=await ud(e.port);console.log(n?_.green(" Server ready"):_.yellow(" Server started but health check timed out")),console.log(""),console.log(_.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(_.green("\u2551")+" DevFlow Started! "+_.green("\u2551")),console.log(_.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(_.green("\u2551")+` Server + Dashboard: http://localhost:${e.port}`.padEnd(57)+_.green("\u2551")),console.log(_.green("\u2551")+` API: http://localhost:${e.port}/api`.padEnd(57)+_.green("\u2551")),console.log(_.green("\u2551")+" "+_.green("\u2551")),console.log(_.green("\u2551")+" Press Ctrl+C to stop "+_.green("\u2551")),console.log(_.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(_.blue(`
234
- Shutting down...`)),await gt(),console.log(_.green("Server stopped.")),o());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var $s=O(()=>{Se();});var xs={};A(xs,{stopAll:()=>gd});async function gd(){let e=await gt();console.log(e?_.green("Server stopped"):_.dim("No DevFlow services running"));}var Ns=O(()=>{Se();});var Ts={};A(Ts,{showStatus:()=>vd});function yd(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 vd(){console.log(_.blue("DevFlow Status")),console.log(_.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let e=await ft(),t=e.port??Fn;e.running?(console.log(`Server: ${_.green("\u2713")} running (port ${t}${e.pid?`, PID ${e.pid}`:""})`),console.log(`Dashboard: ${_.green("\u2713")} served at http://localhost:${t}`)):(console.log(`Server: ${_.yellow("\u25CB")} not running`),console.log(`Dashboard: ${_.yellow("\u25CB")} not running`));let n=homedir$1(),o=Ce(n),r=o.root?Xe(n,o.root):[];o.root?console.log(`Plugin: ${_.green("\u2713")} v${o.version??"unknown"} (${o.root})`):console.log(`Plugin: ${_.yellow("\u25CB")} active cache not resolved`),console.log(`Skills: ${r.length===0?_.green("\u2713"):_.red("!")} ${r.length} shadowed`);let s=getGlobalDevFlowDbPath();if(existsSync(s)){let u=(statSync(s).size/1024/1024).toFixed(1);console.log(`Data: ${s} (${u} MB)`);}else console.log(`Data: ${_.dim(`no global database (${s})`)}`);let i=join(process.cwd(),".devflow","devflow.db"),a=join(process.cwd(),".codegraph","codegraph.db"),c=[...existsSync(i)?[i]:[],...yd(a)?[`${a} (devflow_* tables)`]:[]];c.length>0?console.log(`Legacy: ${_.yellow(c.join(", "))}`):console.log(`Legacy: ${_.green("none")}`);}var Is=O(()=>{Se();Be();});var Ms={};A(Ms,{setupCommand:()=>Od});function Rd(){try{return Ct()}catch{return}}function Pd(e){try{return Ed.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs")}catch{let t=join$1(e,"node_modules","@devflow-tools","mcp-server","bin","devflow-mcp.cjs");return existsSync$1(t)?t:void 0}}function Cd(e){let t=JSON.parse(readFileSync$1(join$1(e,"package.json"),"utf8"));if(typeof t.version!="string"||!t.version.trim())throw new Error(`Claude plugin version is missing from ${e}`);return t.version}function Dd(e){let t=e.path?`${e.message} (${e.path})`:e.message;e.status==="failed"?console.log(_.red(` x ${e.artifact}: ${t}`)):e.status==="degraded"||e.status==="skipped"?console.log(_.yellow(` ! ${e.artifact}: ${t}`)):console.log(_.green(` + ${e.artifact}: ${t}`));}async function Od(e){console.log(_.blue("DevFlow Setup")),console.log(_.dim("--------------"));let t=createDefaultHostAdapterRegistry(),n={projectRoot:process.cwd(),homeDir:homedir$1(),env:process.env,explicitHost:e.agent},o=await t.select(n);if(o.status==="failed")return console.log(_.red(` x Host selection failed: ${o.reason}`)),console.log(_.dim(` ${o.action}`)),process.exitCode=1,{status:"failed",failure:o,projections:[]};let r=o.adapter,s=[];if(console.log(_.dim(` Host: ${r.id}${o.explicit?" (explicit)":" (detected)"}`)),!e.skipMcp){let l=Pd(n.projectRoot);l?s.push(r.mcp.project(n,{command:l,args:["--mode","stdio"],env:{CLAUDE_PROJECT_DIR:n.projectRoot,DEVFLOW_PROJECT_ROOT:n.projectRoot}})):s.push({artifact:"mcp",status:"failed",changed:false,message:"The @devflow-tools/mcp-server launcher could not be resolved. Install it in the project and retry setup."});}if(!e.skipPlugin){let l=Rd();if(r.id==="claude-code"&&l)try{let u=Cd(l),d=join$1(n.homeDir,".claude","plugins","cache");Dt(l,d,u),l=join$1(d,"devflow-local","devflow",u);}catch(u){s.push({artifact:"plugin",status:"failed",changed:false,path:l,message:u instanceof Error?u.message:String(u)}),l=void 0;}l?s.push(...r.skills.project(n,{pluginRoot:l,skillsDirectory:join$1(l,"skills")})):s.some(u=>u.artifact==="plugin"&&u.status==="failed")||s.push({artifact:"plugin",status:"failed",changed:false,message:"Claude plugin files could not be resolved."});}for(let l of s)Dd(l);let i=s.filter(l=>l.status==="failed");if(i.length>0){let l={status:"failed",code:"projection_failed",candidates:o.candidates,availableHosts:t.list().map(u=>u.id).sort(),reason:i.map(u=>`${u.artifact}: ${u.message}`).join("; "),action:"Fix the reported config or artifact path and re-run setup for the selected host."};return console.log(""),console.log(_.red("Setup failed before all selected-host artifacts were projected.")),process.exitCode=1,{status:"failed",failure:l,projections:s}}let c=(await r.capabilities(n)).filter(l=>l.status!=="supported");return c.length>0&&console.log(_.yellow(` ! ${c.length} host capabilities are degraded or unavailable; run devflow doctor for details.`)),console.log(""),console.log(_.green(`Setup complete for ${r.id}.`)),console.log(_.dim("Restart the configured host to load DevFlow MCP and projected artifacts.")),{status:"configured",hostId:r.id,projections:s}}var Ed,Ls=O(()=>{Be();Ed=createRequire$1(import.meta.url);});var Fs={};A(Fs,{pluginListCommand:()=>Ad});var Ad,Hs=O(()=>{Ot();Ad=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=Oe();if(e.installed){let n=$o();if(n.length===0){console.log("No plugins installed."),console.log(`
232
+ `)}`}function rd(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [Vt("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),Vt("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),Vt("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),Vt("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function Vt(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 io=$(()=>{});var co={};A(co,{reportEvaluationCommand:()=>gd,runEvaluationCommand:()=>dd});async function dd(e){let t=getBenchmarkSuite(e.suite);if(!t)throw new Error(`Unknown evaluation suite "${e.suite}"`);let n=e.database??openGlobalDevFlowDatabase();try{if(e.suite.startsWith("agent:")){let i=`eval-waiting:${Date.now()}:${randomUUID().slice(0,8)}`,a=t.tasks.flatMap(c=>Array.from({length:e.trials},(l,u)=>n.requestHostAction({runId:i,engineRunId:i,stepId:`${c.id}:trial-${u+1}`,projectRoot:e.projectRoot})));return JSON.stringify({status:"waiting",runId:i,actionIds:a.map(c=>c.actionId)},null,2)}let o=fd(e.projectRoot),r=[];for(let i=0;i<e.trials;i+=1){let a=await new BenchmarkEngine().runSuite(e.projectRoot,t,{rounds:1});for(let c of a.tasks){let l=c.devflow.correctnessScore>=1,u={graderId:"retrieval_correctness",kind:"deterministic",status:l?"passed":"failed",score:c.devflow.correctnessScore,threshold:1,evidence:[{type:"matched_files",value:JSON.stringify(c.devflow.matchedFiles)},{type:"matched_symbols",value:JSON.stringify(c.devflow.matchedSymbols)}],reason:l?"All expected retrieval targets were selected.":"Expected retrieval targets were missing.",durationMs:c.devflow.durationMs,receipt:`grader:${Gt(JSON.stringify(c)).slice(0,24)}`},g={trialId:`trial:${randomUUID()}`,executionId:`eval-exec:${randomUUID()}`,taskId:c.taskId,projectRevision:o,fixtureVersion:t.version,taskInputHash:Gt(c.prompt),toolProfileHash:Gt("benchmark-context-deep:r3.v1"),acceptanceHash:Gt(JSON.stringify(t.tasks.find(d=>d.id===c.taskId))),status:u.status,graderResults:[u],durationMs:c.devflow.durationMs,tokensUsed:c.devflow.tokensUsed,fallbackCount:0,failureCategory:l?void 0:"retrieval_correctness",simulated:!1};r.push({...g,evidenceReceipt:createTrialReceipt(g)});}}let s=aggregateRepeatedTrials({suiteId:t.id,suiteVersion:t.version,projectRoot:e.projectRoot,commit:o,k:e.trials,trials:r});return n.insertBenchmarkReport(s),renderRepeatedTrialReport(s,e.output??"text")}finally{e.database||n.close();}}function gd(e){let t=e.database??openGlobalDevFlowDatabase();try{let n=t.getBenchmarkReport(e.runId);if(!n||!("k"in n)||!Array.isArray(n.trials))throw new Error(`Evaluation report "${e.runId}" not found`);return renderRepeatedTrialReport(n,e.output??"text")}finally{e.database||t.close();}}function fd(e){try{return execFileSync("git",["rev-parse","HEAD"],{cwd:e,encoding:"utf8"}).trim()}catch{return "unknown"}}function Gt(e){return createHash("sha256").update(e).digest("hex")}var lo=$(()=>{});var Os={};A(Os,{runReview:()=>md});async function md(e){let t,n;if(e.prUrl){let u=e.prUrl.match(/pull\/(\d+)/);n=`PR: ${u?`#${u[1]}`:e.prUrl}`;try{t=execSync(`gh pr diff ${e.prUrl}`,{encoding:"utf-8",maxBuffer:10*1024*1024});}catch{t=`Could not fetch PR diff from ${e.prUrl}. Ensure 'gh' CLI is installed and authenticated.`;}}else {n="Current branch vs main";try{t=execSync("git diff main...HEAD",{encoding:"utf-8",maxBuffer:10*1024*1024});}catch{t="Could not compute diff. Ensure you're on a feature branch.";}}let o=(t.match(/^diff --git/gm)??[]).length,r=(t.match(/^\+[^+]/gm)??[]).length,s=(t.match(/^-[^-]/gm)??[]).length,i=[],a=[],c=[];return t.includes("console.log")&&a.push("Contains console.log statements \u2014 remove before merge"),(t.includes(".only(")||t.includes("it.only"))&&i.push("Contains .only() test filters \u2014 remove before merge"),(t.includes("TODO")||t.includes("FIXME"))&&a.push("Contains TODO/FIXME comments \u2014 track or resolve"),(t.match(/^\+.*TODO/gm)||t.match(/^\+.*FIXME/gm))&&a.push("New code introduces TODO/FIXME comments"),t.includes("process.exit")&&a.push("Contains process.exit() \u2014 consider throwing instead"),t.includes(": any")&&t.match(/^\+.*: any/gm)&&c.push("New code uses `any` type \u2014 use explicit types instead"),[_.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?_.red(`Critical (${i.length})`):"",...i.map(u=>` ${_.red("\u25CF")} ${u}`),"",a.length>0?_.yellow(`Warning (${a.length})`):"",...a.map(u=>` ${_.yellow("\u25CB")} ${u}`),"",c.length>0?_.green(`Suggestion (${c.length})`):"",...c.map(u=>` ${_.green("\u25CB")} ${u}`),"",i.length>0?_.red("Overall: Need changes"):a.length>0?_.yellow("Overall: Approve with comments"):_.green("Overall: LGTM")].join(`
233
+ `)}var $s=$(()=>{});var As={};A(As,{startAll:()=>hd});async function pd(e,t=15e3){let n=Date.now();for(;Date.now()-n<t;){try{if((await fetch(`http://127.0.0.1:${e}/api/health`)).ok)return !0}catch{}await new Promise(o=>setTimeout(o,500));}return false}async function hd(e){console.log(_.blue("Starting DevFlow server..."));let{pid:t}=await Hn({port:e.port});console.log(_.green(` Server started (PID: ${t})`)),console.log(_.blue(" Waiting for server..."));let n=await pd(e.port);console.log(n?_.green(" Server ready"):_.yellow(" Server started but health check timed out")),console.log(""),console.log(_.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(_.green("\u2551")+" DevFlow Started! "+_.green("\u2551")),console.log(_.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(_.green("\u2551")+` Server + Dashboard: http://localhost:${e.port}`.padEnd(57)+_.green("\u2551")),console.log(_.green("\u2551")+` API: http://localhost:${e.port}/api`.padEnd(57)+_.green("\u2551")),console.log(_.green("\u2551")+" "+_.green("\u2551")),console.log(_.green("\u2551")+" Press Ctrl+C to stop "+_.green("\u2551")),console.log(_.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(_.blue(`
234
+ Shutting down...`)),await ft(),console.log(_.green("Server stopped.")),o());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var xs=$(()=>{Se();});var js={};A(js,{stopAll:()=>yd});async function yd(){let e=await ft();console.log(e?_.green("Server stopped"):_.dim("No DevFlow services running"));}var Ts=$(()=>{Se();});var Ms={};A(Ms,{showStatus:()=>Sd});function _d(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 Sd(){console.log(_.blue("DevFlow Status")),console.log(_.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let e=await mt(),t=e.port??Fn;e.running?(console.log(`Server: ${_.green("\u2713")} running (port ${t}${e.pid?`, PID ${e.pid}`:""})`),console.log(`Dashboard: ${_.green("\u2713")} served at http://localhost:${t}`)):(console.log(`Server: ${_.yellow("\u25CB")} not running`),console.log(`Dashboard: ${_.yellow("\u25CB")} not running`));let n=homedir$1(),o=Ce(n),r=o.root?et(n,o.root):[];o.root?console.log(`Plugin: ${_.green("\u2713")} v${o.version??"unknown"} (${o.root})`):console.log(`Plugin: ${_.yellow("\u25CB")} active cache not resolved`),console.log(`Skills: ${r.length===0?_.green("\u2713"):_.red("!")} ${r.length} shadowed`);let s=getGlobalDevFlowDbPath();if(existsSync(s)){let u=(statSync(s).size/1024/1024).toFixed(1);console.log(`Data: ${s} (${u} MB)`);}else console.log(`Data: ${_.dim(`no global database (${s})`)}`);let i=join(process.cwd(),".devflow","devflow.db"),a=join(process.cwd(),".codegraph","codegraph.db"),c=[...existsSync(i)?[i]:[],..._d(a)?[`${a} (devflow_* tables)`]:[]];c.length>0?console.log(`Legacy: ${_.yellow(c.join(", "))}`):console.log(`Legacy: ${_.green("none")}`);}var Ls=$(()=>{Se();qe();});var Fs={};A(Fs,{setupCommand:()=>jd});function $d(){try{return Dt()}catch{return}}function Ad(e){try{return Od.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs")}catch{let t=join$1(e,"node_modules","@devflow-tools","mcp-server","bin","devflow-mcp.cjs");return existsSync$1(t)?t:void 0}}function xd(e){let t=JSON.parse(readFileSync$1(join$1(e,"package.json"),"utf8"));if(typeof t.version!="string"||!t.version.trim())throw new Error(`Claude plugin version is missing from ${e}`);return t.version}function Nd(e){let t=e.path?`${e.message} (${e.path})`:e.message;e.status==="failed"?console.log(_.red(` x ${e.artifact}: ${t}`)):e.status==="degraded"||e.status==="skipped"?console.log(_.yellow(` ! ${e.artifact}: ${t}`)):console.log(_.green(` + ${e.artifact}: ${t}`));}async function jd(e){console.log(_.blue("DevFlow Setup")),console.log(_.dim("--------------"));let t=createDefaultHostAdapterRegistry(),n={projectRoot:process.cwd(),homeDir:homedir$1(),env:process.env,explicitHost:e.agent},o=await t.select(n);if(o.status==="failed")return console.log(_.red(` x Host selection failed: ${o.reason}`)),console.log(_.dim(` ${o.action}`)),process.exitCode=1,{status:"failed",failure:o,projections:[]};let r=o.adapter,s=[];if(console.log(_.dim(` Host: ${r.id}${o.explicit?" (explicit)":" (detected)"}`)),!e.skipMcp){let l=Ad(n.projectRoot);l?s.push(r.mcp.project(n,{command:l,args:["--mode","stdio"],env:{CLAUDE_PROJECT_DIR:n.projectRoot,DEVFLOW_PROJECT_ROOT:n.projectRoot}})):s.push({artifact:"mcp",status:"failed",changed:false,message:"The @devflow-tools/mcp-server launcher could not be resolved. Install it in the project and retry setup."});}if(!e.skipPlugin){let l=$d();if(r.id==="claude-code"&&l)try{let u=xd(l),g=join$1(n.homeDir,".claude","plugins","cache");Ot(l,g,u),l=join$1(g,"devflow-local","devflow",u);}catch(u){s.push({artifact:"plugin",status:"failed",changed:false,path:l,message:u instanceof Error?u.message:String(u)}),l=void 0;}l?s.push(...r.skills.project(n,{pluginRoot:l,skillsDirectory:join$1(l,"skills")})):s.some(u=>u.artifact==="plugin"&&u.status==="failed")||s.push({artifact:"plugin",status:"failed",changed:false,message:"Claude plugin files could not be resolved."});}for(let l of s)Nd(l);let i=s.filter(l=>l.status==="failed");if(i.length>0){let l={status:"failed",code:"projection_failed",candidates:o.candidates,availableHosts:t.list().map(u=>u.id).sort(),reason:i.map(u=>`${u.artifact}: ${u.message}`).join("; "),action:"Fix the reported config or artifact path and re-run setup for the selected host."};return console.log(""),console.log(_.red("Setup failed before all selected-host artifacts were projected.")),process.exitCode=1,{status:"failed",failure:l,projections:s}}let c=(await r.capabilities(n)).filter(l=>l.status!=="supported");return c.length>0&&console.log(_.yellow(` ! ${c.length} host capabilities are degraded or unavailable; run devflow doctor for details.`)),console.log(""),console.log(_.green(`Setup complete for ${r.id}.`)),console.log(_.dim("Restart the configured host to load DevFlow MCP and projected artifacts.")),{status:"configured",hostId:r.id,projections:s}}var Od,Hs=$(()=>{qe();Od=createRequire$1(import.meta.url);});var Ws={};A(Ws,{pluginListCommand:()=>Id});var Id,Us=$(()=>{$t();Id=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=Oe();if(e.installed){let n=Ao();if(n.length===0){console.log("No plugins installed."),console.log(`
235
235
  Run "devflow plugin list" to see available plugins.`);return}console.log(`Installed plugins:
236
236
  `),n.forEach(o=>{let r=t.plugins.find(s=>s.name===o);r?(console.log(` ${_.green(r.name)}@${r.version}`),console.log(` ${r.description}`)):console.log(` ${_.green(o)}`);});}else {if(t.plugins.length===0){console.log("No plugins available.");return}console.log(`Available plugins (${t.plugins.length}):
237
237
  `);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(` ${_.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(`
238
- Install a plugin: devflow plugin install <name>`);}});});var Ws={};A(Ws,{pluginSearchCommand:()=>jd});var jd,Us=O(()=>{Ot();jd=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=Oe(),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(`
238
+ Install a plugin: devflow plugin install <name>`);}});});var qs={};A(qs,{pluginSearchCommand:()=>Fd});var Fd,Bs=$(()=>{$t();Fd=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=Oe(),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(`
239
239
  Try: devflow plugin list`);return}console.log(`Found ${o.length} plugin(s) matching "${e}":
240
- `),o.forEach(r=>{console.log(` ${_.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 qs={};A(qs,{pluginInstallCommand:()=>Id});var Id,Ks=O(()=>{be();Id=new Command("install").description("Install a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Installing ${n}...`);try{let o=await $e(n,process.cwd(),!0);console.log(`
240
+ `),o.forEach(r=>{console.log(` ${_.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 Js={};A(Js,{pluginInstallCommand:()=>Wd});var Wd,zs=$(()=>{be();Wd=new Command("install").description("Install a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Installing ${n}...`);try{let o=await $e(n,process.cwd(),!0);console.log(`
241
241
  ${_.green("\u2713")} ${n}@${o.version} installed and activated`),console.log(`
242
242
  Run "devflow plugin list --installed" to verify.`);}catch(o){console.error(`
243
- ${_.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var zs={};A(zs,{pluginUninstallCommand:()=>Ld});var Ld,Vs=O(()=>{be();Ld=new Command("uninstall").description("Uninstall a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Uninstalling ${n}...`);try{await ln(n,process.cwd(),!0),console.log(`
243
+ ${_.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var Gs={};A(Gs,{pluginUninstallCommand:()=>qd});var qd,Ys=$(()=>{be();qd=new Command("uninstall").description("Uninstall a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Uninstalling ${n}...`);try{await cn(n,process.cwd(),!0),console.log(`
244
244
  ${_.green("\u2713")} ${n} deactivated and uninstalled`);}catch(o){console.error(`
245
- ${_.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function Xt(e){let t=join(e,".devflow","config.json");if(existsSync(t))try{let n=readFileSync(t,"utf-8");if(JSON.parse(n).serverUrl)return "server"}catch{}return "local"}var Ys=createRequire(import.meta.url),go="0.0.0";try{go=Ys("../package.json").version;}catch{try{go=Ys("../../package.json").version;}catch{}}var E=new Command;E.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(go).option("--local","Force local engine, skip server");E.command("init").description("Initialize .devflow/ in the current project").option("--force","Overwrite existing config").option("--abort","Force delete .codegraph and .devflow directories before reinitializing").option("--report","Output onboarding markdown report to stdout").option("--json","Output onboarding pack as JSON to stdout").option("--plugins <names>","Comma-separated list of plugins to install (non-interactive)").option("--with-plugin <names>","Interactively review optional memory hints from installed plugins").option("--no-plugins","Skip plugin installation guide").option("--migrate-legacy-skills","Back up and remove global devflow:* skill shadows").action(async e=>{let t=process.cwd();if(e.abort){console.log(_.yellow("\u{1F5D1}\uFE0F --abort flag detected, removing existing directories..."));let i=[".codegraph",".devflow"];for(let a of i){let c=Hd.join(t,a);Gs.existsSync(c)&&(console.log(_.dim(` Removing ${a}/...`)),Gs.rmSync(c,{recursive:true,force:true}));}console.log(_.green(`\u2705 Existing directories removed
246
- `));}let n=Xt(t);console.error(_.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(Co(),Po)),s=await o(t,{force:e.force,migrateLegacySkills:e.migrateLegacySkills});if(e.json&&s.onboardingPack)console.log(JSON.stringify(s.onboardingPack,null,2));else if(e.report&&s.onboardingPack)console.log(r(s.onboardingPack));else {if(s.created.length>0){console.log(_.green("Created:"));for(let i of s.created)console.log(` ${_.dim("+")} ${i}`);}else console.log(_.dim("Already initialized. Use --force to overwrite config."));if(s.indexed&&console.log(_.green(`\u2705 CodeGraph initialized (${s.indexed.files} files, ${s.indexed.symbols} symbols)`)),s.onboardingPack){let i=s.onboardingPack;console.log(_.green("\u2705 Onboarding pack generated")),console.log(_.dim(` ${i.stats.files} files, ${i.stack.frameworks.join(", ")||"no framework"}`));}if(s.pluginDeployed&&console.log(_.green("\u2705 Plugin deployed to ~/.claude/plugins/cache/")),s.pluginEnabled&&console.log(_.green("\u2705 Plugin enabled in ~/.claude/settings.json")),s.mcpConfigured&&console.log(_.green("\u2705 MCP config written to .claude/mcp.json")),s.pluginDeployed&&s.pluginEnabled&&s.mcpConfigured&&console.log(_.green("\nDevFlow is ready! Run `claude` to start.")),typeof e.withPlugin=="string"){let{reviewPluginMemoryHints:i}=await Promise.resolve().then(()=>(Oo(),Do)),a=await i(t,e.withPlugin);console.log(_.dim(`Plugin memory hints: ${a.selected}/${a.available} selected`));}if(typeof e.plugins=="string"){let{installPluginsFromList:i}=await Promise.resolve().then(()=>(dn(),un));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(dn(),un));await i(t);}}});E.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(()=>(or(),nr));t(e,{},{log:o=>console.log(o),error:o=>console.error(_.red(o))})||(process.exitCode=1);});var Ud=E.command("db").description("Manage DevFlow databases");Ud.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(()=>(fr(),gr)),o=t(e);for(let r of n(o))console.log(r);});E.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=Xt(n);console.log(_.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(pr(),mr));if(e){let i=s();i.includes(e)||(console.log(_.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(_.green(`\u2713 ${a}`));}catch(i){console.error(_.red(`Error: ${i.message}`)),process.exit(1);}});E.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(()=>(vr(),yr)),o=e.backfillVectors?await n(E.opts().local):await t(E.opts().local);console.log(_.blue("Index Status")),console.log(` Files: ${o.totalFiles}`),console.log(` Symbols: ${o.totalSymbols}`),console.log(` Indexing: ${o.indexing?"active":"idle"}`),e.watch&&console.log(_.dim(" (watch mode not yet implemented)"));});E.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(wr(),kr)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:E.opts().local});console.log(_.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});E.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(()=>(Sn(),_n)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:E.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(()=>(Sn(),_n)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:E.opts().local});console.log(_.blue(`Context: "${e}"`)),console.log(` Files: ${o.files.length}`),console.log(` Confidence: ${(o.confidence*100).toFixed(0)}%`),console.log(` Tokens: ${o.tokenCount}`);}});var Qt=E.command("workflow").description("Workflow management");Qt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(at(),it)),t=await e(E.opts().local);if(t.length===0){console.log(_.dim("No workflows registered."));return}for(let n of t)console.log(`${_.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});var bt=E.command("workers").description("Inspect and safely control isolated workflow workers").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON");bt.command("list").description("List project workers").action(async(e,t)=>{let n=t.parent?.opts()??{},{listWorkers:o}=await Promise.resolve().then(()=>(Ge(),Ve));console.log(o({projectRoot:n.project,json:n.json}));});bt.command("show <id>").description("Show worker lifecycle and merge evidence").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{showWorker:r}=await Promise.resolve().then(()=>(Ge(),Ve));console.log(r(e,{projectRoot:o.project,json:o.json}));});bt.command("cancel <id>").description("Request bounded worker cancellation").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{cancelWorker:r}=await Promise.resolve().then(()=>(Ge(),Ve));console.log(r(e,{projectRoot:o.project,json:o.json}));});bt.command("retry-cleanup <id>").description("Retry conservative cleanup for a terminal or held worker").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{retryWorkerCleanup:r}=await Promise.resolve().then(()=>(Ge(),Ve));console.log(r(e,{projectRoot:o.project,json:o.json}));});bt.command("merge-status <id>").description("Show the worker merge gate state").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{workerMergeStatus:r}=await Promise.resolve().then(()=>(Ge(),Ve));console.log(r(e,{projectRoot:o.project,json:o.json}));});Qt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(at(),it)),o=await n(e,{input:t??""},E.opts().local);console.log(`Run: ${o.runId}`),console.log(`Status: ${o.status}`),console.log(`Duration: ${o.duration}ms`);});Qt.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(at(),it)),t=await e(E.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});Qt.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(at(),it)),t=await e(E.opts().local);if(t.length===0){console.log(_.dim("No runs yet."));return}for(let n of t){let o=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${_.yellow(n.status)} ${o}`);}});var Zs=E.command("embeddings").description("Manage the shared verified embedding model");Zs.command("status").description("Inspect the shared embedding model without network access").option("--json","Output JSON").action(async e=>{let{getEmbeddingStatus:t,renderEmbeddingStatus:n}=await Promise.resolve().then(()=>(Pn(),Rn)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});Zs.command("prepare").description("Prepare and verify the shared embedding model").option("--endpoint <url>","Preferred model endpoint (repeatable)",(e,t)=>[...t,e],[]).option("--timeout-ms <milliseconds>","Per-file download timeout","60000").option("--json","Output JSON").action(async e=>{try{let{prepareEmbeddings:t,renderEmbeddingStatus:n}=await Promise.resolve().then(()=>(Pn(),Rn)),o=Number(e.timeoutMs);if(!Number.isSafeInteger(o)||o<=0)throw new Error("--timeout-ms must be a positive integer");let r=await t({endpoints:e.endpoint,timeoutMs:o});e.json?console.log(JSON.stringify(r,null,2)):(console.log(n(r)),console.log(` source: ${r.source}`),r.migratedFrom&&console.log(` migrated from: ${r.migratedFrom}`),r.attemptedEndpoints.length>0&&console.log(` endpoints: ${r.attemptedEndpoints.join(", ")}`));}catch(t){console.error(_.red(`Embedding model preparation failed: ${t.message}`)),process.exitCode=1;}});var Le=E.command("memory").description("Memory management");Le.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(xe(),Ae)),n=await t(E.opts().local,e.source);console.log(JSON.stringify(n,null,2));});Le.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(xe(),Ae));console.log(JSON.stringify(await t(E.opts().local,e.source),null,2));});Le.command("query [query]").description("Retrieve ranked project memory with a token budget").option("--purpose <purpose>","Retrieval purpose","task_context").option("--budget-tokens <count>","Maximum response tokens","2000").option("--scope <scope>","Memory scope to include (repeatable)",(e,t)=>[...t,e],[]).action(async(e,t)=>{let{queryMemory:n}=await Promise.resolve().then(()=>(xe(),Ae)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:E.opts().local});console.log(JSON.stringify(o,null,2));});Le.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(xe(),Ae));await n(e,t,E.opts().local),console.log(_.green(`Memory set: ${e} = ${t}`));});Le.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(xe(),Ae)),t=await e(E.opts().local);console.log(JSON.stringify(t,null,2));});Le.command("backfill-obs-vectors").description("Backfill missing observation vectors").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillObservationVectors:t}=await Promise.resolve().then(()=>(xe(),Ae)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(_.green(`Observation vectors ready: ${n.processed} added, ${n.remaining} remaining`));});E.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(Rr(),Er)),o=(await t(e,void 0,void 0,E.opts().local)).results;console.log(_.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var fo=E.command("docs").description("Documentation index management");fo.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(_.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(` ${_.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${_.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(_.green(`
245
+ ${_.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function Qt(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 Qs=createRequire(import.meta.url),fo="0.0.0";try{fo=Qs("../package.json").version;}catch{try{fo=Qs("../../package.json").version;}catch{}}var R=new Command;R.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(fo).option("--local","Force local engine, skip server");R.command("init").description("Initialize .devflow/ in the current project").option("--force","Overwrite existing config").option("--abort","Force delete .codegraph and .devflow directories before reinitializing").option("--report","Output onboarding markdown report to stdout").option("--json","Output onboarding pack as JSON to stdout").option("--plugins <names>","Comma-separated list of plugins to install (non-interactive)").option("--with-plugin <names>","Interactively review optional memory hints from installed plugins").option("--no-plugins","Skip plugin installation guide").option("--migrate-legacy-skills","Back up and remove global devflow:* skill shadows").action(async e=>{let t=process.cwd();if(e.abort){console.log(_.yellow("\u{1F5D1}\uFE0F --abort flag detected, removing existing directories..."));let i=[".codegraph",".devflow"];for(let a of i){let c=Kd.join(t,a);Zs.existsSync(c)&&(console.log(_.dim(` Removing ${a}/...`)),Zs.rmSync(c,{recursive:true,force:true}));}console.log(_.green(`\u2705 Existing directories removed
246
+ `));}let n=Qt(t);console.error(_.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(Do(),Co)),s=await o(t,{force:e.force,migrateLegacySkills:e.migrateLegacySkills});if(e.json&&s.onboardingPack)console.log(JSON.stringify(s.onboardingPack,null,2));else if(e.report&&s.onboardingPack)console.log(r(s.onboardingPack));else {if(s.created.length>0){console.log(_.green("Created:"));for(let i of s.created)console.log(` ${_.dim("+")} ${i}`);}else console.log(_.dim("Already initialized. Use --force to overwrite config."));if(s.indexed&&console.log(_.green(`\u2705 CodeGraph initialized (${s.indexed.files} files, ${s.indexed.symbols} symbols)`)),s.onboardingPack){let i=s.onboardingPack;console.log(_.green("\u2705 Onboarding pack generated")),console.log(_.dim(` ${i.stats.files} files, ${i.stack.frameworks.join(", ")||"no framework"}`));}if(s.pluginDeployed&&console.log(_.green("\u2705 Plugin deployed to ~/.claude/plugins/cache/")),s.pluginEnabled&&console.log(_.green("\u2705 Plugin enabled in ~/.claude/settings.json")),s.mcpConfigured&&console.log(_.green("\u2705 MCP config written to .claude/mcp.json")),s.pluginDeployed&&s.pluginEnabled&&s.mcpConfigured&&console.log(_.green("\nDevFlow is ready! Run `claude` to start.")),typeof e.withPlugin=="string"){let{reviewPluginMemoryHints:i}=await Promise.resolve().then(()=>($o(),Oo)),a=await i(t,e.withPlugin);console.log(_.dim(`Plugin memory hints: ${a.selected}/${a.available} selected`));}if(typeof e.plugins=="string"){let{installPluginsFromList:i}=await Promise.resolve().then(()=>(un(),ln));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(un(),ln));await i(t);}}});R.command("reset").description("Reset generated DevFlow project data").requiredOption("--scope <scope>","memory | knowledge | codegraph | all").option("--backup-to <dir>","Back up selected data before resetting").option("--force","Reset without creating a backup").option("--project <path>","Project directory",process.cwd()).action(async e=>{let{executeResetCommand:t}=await Promise.resolve().then(()=>(rr(),or));t(e,{},{log:o=>console.log(o),error:o=>console.error(_.red(o))})||(process.exitCode=1);});var zd=R.command("db").description("Manage DevFlow databases");zd.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(()=>(mr(),fr)),o=t(e);for(let r of n(o))console.log(r);});R.command("connect [agent]").description("Configure the Claude Code MCP connection").option("--command <cmd>","MCP server command","devflow-mcp").action(async(e,t)=>{let n=process.cwd(),o=Qt(n);console.log(_.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(hr(),pr));if(e){let i=s();i.includes(e)||(console.log(_.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(_.green(`\u2713 ${a}`));}catch(i){console.error(_.red(`Error: ${i.message}`)),process.exit(1);}});R.command("index").description("Show index status").option("--backfill-vectors","Reconcile the index and wait for symbol vectors").option("--watch","Start file watcher for hot updates (stub)").action(async e=>{let{getIndexStatus:t,refreshIndex:n}=await Promise.resolve().then(()=>(kr(),vr)),o=e.backfillVectors?await n(R.opts().local):await t(R.opts().local);console.log(_.blue("Index Status")),console.log(` Files: ${o.totalFiles}`),console.log(` Symbols: ${o.totalSymbols}`),console.log(` Indexing: ${o.indexing?"active":"idle"}`),e.watch&&console.log(_.dim(" (watch mode not yet implemented)"));});R.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(br(),wr)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:R.opts().local});console.log(_.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});R.command("context <query>").description("Retrieve project context for a query").option("--mode <mode>","fast | deep","fast").option("--max-tokens <n>","Max token budget","4000").option("--task","Use task-oriented mode with risk hints and next actions").option("--why","Show reasoning for file selection").action(async(e,t)=>{if(t.task){let{getTaskContext:n}=await Promise.resolve().then(()=>(_n(),bn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:R.opts().local});console.log(JSON.stringify({requiredFiles:o.requiredFiles,optionalFiles:o.optionalFiles,riskHints:o.riskHints,nextActions:o.nextActions,reasoning:t.why?o.reasoning:void 0},null,2));}else {let{getContext:n}=await Promise.resolve().then(()=>(_n(),bn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:R.opts().local});console.log(_.blue(`Context: "${e}"`)),console.log(` Files: ${o.files.length}`),console.log(` Confidence: ${(o.confidence*100).toFixed(0)}%`),console.log(` Tokens: ${o.tokenCount}`);}});var Zt=R.command("workflow").description("Workflow management");Zt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(ct(),at)),t=await e(R.opts().local);if(t.length===0){console.log(_.dim("No workflows registered."));return}for(let n of t)console.log(`${_.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});var _t=R.command("workers").description("Inspect and safely control isolated workflow workers").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON");_t.command("list").description("List project workers").action(async(e,t)=>{let n=t.parent?.opts()??{},{listWorkers:o}=await Promise.resolve().then(()=>(Ge(),Ve));console.log(o({projectRoot:n.project,json:n.json}));});_t.command("show <id>").description("Show worker lifecycle and merge evidence").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{showWorker:r}=await Promise.resolve().then(()=>(Ge(),Ve));console.log(r(e,{projectRoot:o.project,json:o.json}));});_t.command("cancel <id>").description("Request bounded worker cancellation").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{cancelWorker:r}=await Promise.resolve().then(()=>(Ge(),Ve));console.log(r(e,{projectRoot:o.project,json:o.json}));});_t.command("retry-cleanup <id>").description("Retry conservative cleanup for a terminal or held worker").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{retryWorkerCleanup:r}=await Promise.resolve().then(()=>(Ge(),Ve));console.log(r(e,{projectRoot:o.project,json:o.json}));});_t.command("merge-status <id>").description("Show the worker merge gate state").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{workerMergeStatus:r}=await Promise.resolve().then(()=>(Ge(),Ve));console.log(r(e,{projectRoot:o.project,json:o.json}));});Zt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(ct(),at)),o=await n(e,{input:t??""},R.opts().local);console.log(`Run: ${o.runId}`),console.log(`Status: ${o.status}`),console.log(`Duration: ${o.duration}ms`);});Zt.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(ct(),at)),t=await e(R.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});Zt.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(ct(),at)),t=await e(R.opts().local);if(t.length===0){console.log(_.dim("No runs yet."));return}for(let n of t){let o=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${_.yellow(n.status)} ${o}`);}});var Xs=R.command("embeddings").description("Manage the shared verified embedding model");Xs.command("status").description("Inspect the shared embedding model without network access").option("--json","Output JSON").action(async e=>{let{getEmbeddingStatus:t,renderEmbeddingStatus:n}=await Promise.resolve().then(()=>(Rn(),En)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});Xs.command("prepare").description("Prepare and verify the shared embedding model").option("--endpoint <url>","Preferred model endpoint (repeatable)",(e,t)=>[...t,e],[]).option("--timeout-ms <milliseconds>","Per-file download timeout","60000").option("--json","Output JSON").action(async e=>{try{let{prepareEmbeddings:t,renderEmbeddingStatus:n}=await Promise.resolve().then(()=>(Rn(),En)),o=Number(e.timeoutMs);if(!Number.isSafeInteger(o)||o<=0)throw new Error("--timeout-ms must be a positive integer");let r=await t({endpoints:e.endpoint,timeoutMs:o});e.json?console.log(JSON.stringify(r,null,2)):(console.log(n(r)),console.log(` source: ${r.source}`),r.attemptedEndpoints.length>0&&console.log(` endpoints: ${r.attemptedEndpoints.join(", ")}`));}catch(t){console.error(_.red(`Embedding model preparation failed: ${t.message}`)),process.exitCode=1;}});var Le=R.command("memory").description("Memory management");Le.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(xe(),Ae)),n=await t(R.opts().local,e.source);console.log(JSON.stringify(n,null,2));});Le.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(xe(),Ae));console.log(JSON.stringify(await t(R.opts().local,e.source),null,2));});Le.command("query [query]").description("Retrieve ranked project memory with a token budget").option("--purpose <purpose>","Retrieval purpose","task_context").option("--budget-tokens <count>","Maximum response tokens","2000").option("--scope <scope>","Memory scope to include (repeatable)",(e,t)=>[...t,e],[]).action(async(e,t)=>{let{queryMemory:n}=await Promise.resolve().then(()=>(xe(),Ae)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:R.opts().local});console.log(JSON.stringify(o,null,2));});Le.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(xe(),Ae));await n(e,t,R.opts().local),console.log(_.green(`Memory set: ${e} = ${t}`));});Le.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(xe(),Ae)),t=await e(R.opts().local);console.log(JSON.stringify(t,null,2));});Le.command("backfill-obs-vectors").description("Backfill missing observation vectors").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillObservationVectors:t}=await Promise.resolve().then(()=>(xe(),Ae)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(_.green(`Observation vectors ready: ${n.processed} added, ${n.remaining} remaining`));});R.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(Pr(),Rr)),o=(await t(e,void 0,void 0,R.opts().local)).results;console.log(_.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var mo=R.command("docs").description("Documentation index management");mo.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(_.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(),projectId:(await import('@devflow-tools/sdk')).resolveStableProjectIdentity(process.cwd()).projectId,embedder:new n});if(e){let r=await o.syncDocs(e);for(let s of r)s.added>0?console.log(` ${_.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${_.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(_.green(`
247
247
  ${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(` ${_.green("\u2713")} ${a.source} \u2192 ${a.added} chunks`):console.log(` ${_.red("\u2717")} ${a.source} \u2014 ${a.errors.join(", ")||"no content"}`);}console.log(_.green(`
248
- All docs synced.`));}});fo.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(()=>(An(),$n)),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(_.green(`Knowledge vectors ready: ${n.processed} added, ${n.remaining} remaining`));});fo.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(()=>(An(),$n));console.log(_.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(` ${_.green("\u2713")} ${r.source} \u2192 ${r.added} chunks`):console.log(` ${_.red("\u2717")} ${r.source} \u2014 ${r.errors.join(", ")||"no content"}`);console.log(_.green("Docs resynced. Run `devflow docs backfill-vectors` to rebuild vectors."));});var _t=E.command("skill").description("Plugin/Skill management");_t.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(be(),tt)),t=await e(E.opts().local);if(t.length===0){console.log(_.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${_.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});_t.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(be(),tt)),n=await t(e,E.opts().local);if(console.log(_.blue(`Search: "${e}"`)),n.length===0){console.log(_.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${_.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});_t.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(be(),tt)),n=await t(e,process.cwd(),E.opts().local);console.log(_.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(_.red(`Error: ${t.message}`)),process.exit(1);}});_t.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(be(),tt));await t(e,process.cwd(),E.opts().local),console.log(_.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(_.red(`Error: ${t.message}`)),process.exit(1);}});_t.command("health").description("Validate installed DevFlow skill artifacts").option("--root <path>","Claude plugin root").option("--json","Output JSON").action(async e=>{let{showSkillHealth:t}=await Promise.resolve().then(()=>(Nn(),Cr));process.exitCode=t(e);});var Qs=E.command("mcp").description("Inspect MCP configuration and health");Qs.command("inventory").description("Show normalized MCP server inventory").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON").action(async e=>{let{showMcpInventory:t}=await Promise.resolve().then(()=>(Tn(),jn));await t(e);});Qs.command("health").description("Check or show cached MCP server health").option("--project <path>","Project directory",process.cwd()).option("--refresh","Refresh health checks").option("--json","Output JSON").action(async e=>{let{showMcpHealth:t}=await Promise.resolve().then(()=>(Tn(),jn));await t(e);});E.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(()=>(ys(),hs));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;});Le.command("maintain").description("Audit or repair Memory data; defaults to a read-only dry-run").option("--project <path>","Project directory",process.cwd()).option("--actions <names>","Comma-separated actions").option("--apply","Apply changes after creating a SQLite backup").option("--json","Output the audit manifest as JSON").option("--batch-size <n>","Embedding backfill batch size","32").action(async e=>{try{let{runMemoryMaintainCommand:t}=await Promise.resolve().then(()=>(ks(),vs));console.log(await t({projectRoot:e.project,actions:e.actions,apply:e.apply,json:e.json,batchSize:Number(e.batchSize)}));}catch(t){console.error(_.red(`Memory maintenance failed: ${t.message}`)),process.exitCode=1;}});E.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(()=>(bs(),ws)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var Xs=E.command("benchmark").description("Run and inspect reproducible A/B benchmarks");Xs.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(()=>(so(),ro));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});var ei=E.command("eval").description("Run and inspect evidence-bound repeated evaluations");ei.command("run").requiredOption("--suite <id>","Evaluation suite").option("--project <root>","Initialized project root",process.cwd()).option("--trials <count>","Independent trials: 1 or 3","3").option("--output <format>","text | json","text").action(async e=>{let t=Number.parseInt(e.trials,10);if(t!==1&&t!==3)throw new Error("Evaluation trials must be 1 or 3");let{runEvaluationCommand:n}=await Promise.resolve().then(()=>(co(),ao));console.log(await n({projectRoot:e.project,suite:e.suite,trials:t,output:e.output}));});ei.command("report").requiredOption("--run <id>","Evaluation run ID").option("--json","Render JSON").action(async e=>{let{reportEvaluationCommand:t}=await Promise.resolve().then(()=>(co(),ao));console.log(t({runId:e.run,output:e.json?"json":"text"}));});Xs.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(()=>(so(),ro));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});E.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(()=>(Ds(),Cs)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var mo=E.command("server").description("Manage DevFlow server");mo.command("start").description("Start the DevFlow REST server").option("--port <n>","Port number","13337").action(async e=>{console.log(_.blue("Starting DevFlow server..."));let{startServer:t}=await Promise.resolve().then(()=>(Se(),It)),n=await t({port:parseInt(e.port,10)});console.log(_.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});mo.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(Se(),It)),t=await e();console.log(t?_.green("Server stopped"):_.dim("No server running"));});mo.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(Se(),It)),t=await e();t.running?console.log(_.green(`Running (pid: ${t.pid})`)):console.log(_.yellow("Not running"));});E.command("dashboard").description("Open DevFlow Dashboard").action(async()=>{let{resolveRuntimeEndpoint:e}=await import('@devflow-tools/sdk');console.log(_.blue("The Dashboard is served by the DevFlow server.")),console.log(_.dim("Run: devflow start")),console.log(_.dim(`Then open: ${e().url}`));});E.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(()=>($s(),Os));await t({port:parseInt(e.port,10),background:!!e.background});});E.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(Ns(),xs));await e();});E.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(Is(),Ts));await e();});E.command("setup").description("Configure DevFlow for a supported agent host").option("--agent <agent>","Target host (claude-code/codex/generic-mcp)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>(Ls(),Ms));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var Zt=E.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(()=>(Hs(),Fs)),Promise.resolve().then(()=>(Us(),Ws)),Promise.resolve().then(()=>(Ks(),qs)),Promise.resolve().then(()=>(Vs(),zs))]);Zt.addCommand(e),Zt.addCommand(t),Zt.addCommand(n),Zt.addCommand(o);}await E.parseAsync();
248
+ All docs synced.`));}});mo.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(()=>(An(),$n)),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(_.green(`Knowledge vectors ready: ${n.processed} added, ${n.remaining} remaining`));});mo.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(()=>(An(),$n));console.log(_.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(` ${_.green("\u2713")} ${r.source} \u2192 ${r.added} chunks`):console.log(` ${_.red("\u2717")} ${r.source} \u2014 ${r.errors.join(", ")||"no content"}`);console.log(_.green("Docs resynced. Run `devflow docs backfill-vectors` to rebuild vectors."));});var St=R.command("skill").description("Plugin/Skill management");St.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(be(),nt)),t=await e(R.opts().local);if(t.length===0){console.log(_.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${_.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});St.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(be(),nt)),n=await t(e,R.opts().local);if(console.log(_.blue(`Search: "${e}"`)),n.length===0){console.log(_.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${_.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});St.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(be(),nt)),n=await t(e,process.cwd(),R.opts().local);console.log(_.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(_.red(`Error: ${t.message}`)),process.exit(1);}});St.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(be(),nt));await t(e,process.cwd(),R.opts().local),console.log(_.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(_.red(`Error: ${t.message}`)),process.exit(1);}});St.command("health").description("Validate installed DevFlow skill artifacts").option("--root <path>","Claude plugin root").option("--json","Output JSON").action(async e=>{let{showSkillHealth:t}=await Promise.resolve().then(()=>(Nn(),Dr));process.exitCode=t(e);});var ei=R.command("mcp").description("Inspect MCP configuration and health");ei.command("inventory").description("Show normalized MCP server inventory").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON").action(async e=>{let{showMcpInventory:t}=await Promise.resolve().then(()=>(Tn(),jn));await t(e);});ei.command("health").description("Check or show cached MCP server health").option("--project <path>","Project directory",process.cwd()).option("--refresh","Refresh health checks").option("--json","Output JSON").action(async e=>{let{showMcpHealth:t}=await Promise.resolve().then(()=>(Tn(),jn));await t(e);});R.command("doctor").description("Run project health check").option("--json","Output as JSON").option("--strict","Exit with status 1 when any health section has warnings or errors").option("--project <path>","Project directory",process.cwd()).option("--audit","Verify audit chain integrity").option("--audit-fix","Rebuild audit chain signatures").option("--violations","Show violation records").option("--last <period>","Filter violations by time (e.g. 7d, 24h)").option("--receipts","Show current session receipt status").action(async e=>{let{runDoctorCommand:t,runDoctorAudit:n,runDoctorAuditFix:o,runDoctorViolations:r,runDoctorReceipts:s}=await Promise.resolve().then(()=>(ks(),vs));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;});Le.command("maintain").description("Audit or repair Memory data; defaults to a read-only dry-run").option("--project <path>","Project directory",process.cwd()).option("--actions <names>","Comma-separated actions").option("--apply","Apply changes after creating a SQLite backup").option("--json","Output the audit manifest as JSON").option("--batch-size <n>","Embedding backfill batch size","32").action(async e=>{try{let{runMemoryMaintainCommand:t}=await Promise.resolve().then(()=>(bs(),ws));console.log(await t({projectRoot:e.project,actions:e.actions,apply:e.apply,json:e.json,batchSize:Number(e.batchSize)}));}catch(t){console.error(_.red(`Memory maintenance failed: ${t.message}`)),process.exitCode=1;}});R.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let{generateToken:t}=await Promise.resolve().then(()=>(Ss(),_s)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var ti=R.command("benchmark").description("Run and inspect reproducible A/B benchmarks");ti.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(()=>(io(),so));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});var ni=R.command("eval").description("Run and inspect evidence-bound repeated evaluations");ni.command("run").requiredOption("--suite <id>","Evaluation suite").option("--project <root>","Initialized project root",process.cwd()).option("--trials <count>","Independent trials: 1 or 3","3").option("--output <format>","text | json","text").action(async e=>{let t=Number.parseInt(e.trials,10);if(t!==1&&t!==3)throw new Error("Evaluation trials must be 1 or 3");let{runEvaluationCommand:n}=await Promise.resolve().then(()=>(lo(),co));console.log(await n({projectRoot:e.project,suite:e.suite,trials:t,output:e.output}));});ni.command("report").requiredOption("--run <id>","Evaluation run ID").option("--json","Render JSON").action(async e=>{let{reportEvaluationCommand:t}=await Promise.resolve().then(()=>(lo(),co));console.log(t({runId:e.run,output:e.json?"json":"text"}));});ti.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(()=>(io(),so));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});R.command("review [pr-url]").description("Review a PR or current branch diff").option("--agent <agent>","AI agent to use","claude").action(async(e,t)=>{let{runReview:n}=await Promise.resolve().then(()=>($s(),Os)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var po=R.command("server").description("Manage DevFlow server");po.command("start").description("Start the DevFlow REST server").option("--port <n>","Port number","13337").action(async e=>{console.log(_.blue("Starting DevFlow server..."));let{startServer:t}=await Promise.resolve().then(()=>(Se(),Mt)),n=await t({port:parseInt(e.port,10)});console.log(_.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});po.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(Se(),Mt)),t=await e();console.log(t?_.green("Server stopped"):_.dim("No server running"));});po.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(Se(),Mt)),t=await e();t.running?console.log(_.green(`Running (pid: ${t.pid})`)):console.log(_.yellow("Not running"));});R.command("dashboard").description("Open DevFlow Dashboard").action(async()=>{let{resolveRuntimeEndpoint:e}=await import('@devflow-tools/sdk');console.log(_.blue("The Dashboard is served by the DevFlow server.")),console.log(_.dim("Run: devflow start")),console.log(_.dim(`Then open: ${e().url}`));});R.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async e=>{let{startAll:t}=await Promise.resolve().then(()=>(xs(),As));await t({port:parseInt(e.port,10),background:!!e.background});});R.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(Ts(),js));await e();});R.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(Ls(),Ms));await e();});R.command("setup").description("Configure DevFlow for a supported agent host").option("--agent <agent>","Target host (claude-code/codex/generic-mcp)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>(Hs(),Fs));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var Yt=R.command("plugin").description("Manage DevFlow plugins");if(process.argv.includes("plugin")){let[{pluginListCommand:e},{pluginSearchCommand:t},{pluginInstallCommand:n},{pluginUninstallCommand:o}]=await Promise.all([Promise.resolve().then(()=>(Us(),Ws)),Promise.resolve().then(()=>(Bs(),qs)),Promise.resolve().then(()=>(zs(),Js)),Promise.resolve().then(()=>(Ys(),Gs))]);Yt.addCommand(e),Yt.addCommand(t),Yt.addCommand(n),Yt.addCommand(o);}await R.parseAsync();