workspai 0.72.1 → 0.73.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 (79) hide show
  1. package/dist/analyze-WC2TY5AT.js +1 -0
  2. package/dist/autopilot-release-LJDRECFW.js +1 -0
  3. package/dist/{chunk-I7P6XQJI.js → chunk-2BCECNIW.js} +1 -1
  4. package/dist/{chunk-U3RX7KDY.js → chunk-3GO7BJ5J.js} +1 -1
  5. package/dist/{chunk-QVUVJU56.js → chunk-3SNP6M4M.js} +1 -1
  6. package/dist/chunk-4HQU2GQM.js +1 -0
  7. package/dist/{chunk-T6KHOIEY.js → chunk-4JAURS76.js} +1 -1
  8. package/dist/chunk-7O7P4MRD.js +1 -0
  9. package/dist/{chunk-L5ZD2GD3.js → chunk-AQNU5RXV.js} +1 -1
  10. package/dist/{chunk-TDQ2PRHV.js → chunk-D3N2WFDV.js} +1 -1
  11. package/dist/{chunk-FYIPYGMW.js → chunk-DNKELRK6.js} +1 -1
  12. package/dist/{chunk-T6LCDLJ7.js → chunk-EDDGQ6LM.js} +1 -1
  13. package/dist/{chunk-LLEKVSMX.js → chunk-F6CTGVJA.js} +1 -1
  14. package/dist/{chunk-JPPZDLY3.js → chunk-FRH7AIGY.js} +2 -2
  15. package/dist/{chunk-KVPTZMEV.js → chunk-HAZGSAKP.js} +1 -1
  16. package/dist/{chunk-ISGLADQI.js → chunk-IPZT6WKM.js} +1 -1
  17. package/dist/{chunk-4PDEWMOG.js → chunk-J44PN2FX.js} +1 -1
  18. package/dist/{chunk-4AW5QP5J.js → chunk-K3O3HENC.js} +1 -1
  19. package/dist/{chunk-SS7X2YF5.js → chunk-LDJAUIAG.js} +1 -1
  20. package/dist/{chunk-SATPH22S.js → chunk-LGC4CRUF.js} +1 -1
  21. package/dist/{chunk-IX5Z6EK6.js → chunk-ND5YAC4T.js} +1 -1
  22. package/dist/{chunk-WPZUKU2B.js → chunk-NNQE4DS2.js} +1 -1
  23. package/dist/chunk-NSMRQOWP.js +157 -0
  24. package/dist/{chunk-WMC2H7MJ.js → chunk-OIGI7MP6.js} +1 -1
  25. package/dist/{chunk-S66NO5BX.js → chunk-R5OJD5K2.js} +1 -1
  26. package/dist/{chunk-L4WG3NI7.js → chunk-SO4CGS35.js} +1 -1
  27. package/dist/{chunk-RQKDJVX3.js → chunk-T5NBSCVX.js} +2 -2
  28. package/dist/{chunk-2RF75G5T.js → chunk-TIZCESKY.js} +1 -1
  29. package/dist/{chunk-62YBFWHY.js → chunk-TSYDTKXO.js} +1 -1
  30. package/dist/{chunk-N2PAAQKI.js → chunk-TZK2R6RD.js} +1 -1
  31. package/dist/{chunk-JQINCVK5.js → chunk-UCNIXOTL.js} +1 -1
  32. package/dist/{chunk-5NL53T5C.js → chunk-VBMWFT7Q.js} +1 -1
  33. package/dist/chunk-YYELANJO.js +7 -0
  34. package/dist/{chunk-QYXX6G5O.js → chunk-ZZWGD3X3.js} +1 -1
  35. package/dist/{create-FOPYAWAR.js → create-XYKXS3JB.js} +1 -1
  36. package/dist/{doctor-Z3Z5L67W.js → doctor-LQ7FT6AZ.js} +1 -1
  37. package/dist/{goal-lifecycle-ZH7AQIOX.js → goal-lifecycle-BIX2JVNO.js} +1 -1
  38. package/dist/{goal-pack-OP453Q6U.js → goal-pack-SUWH6K7U.js} +1 -1
  39. package/dist/index.js +22 -22
  40. package/dist/{pipeline-LPZHMO7S.js → pipeline-NSPPWD7U.js} +1 -1
  41. package/dist/{project-agent-entry-QGPM7CU7.js → project-agent-entry-Y3NEHZED.js} +1 -1
  42. package/dist/{project-intelligence-lens-U7PLWYXX.js → project-intelligence-lens-6Q6XSUDJ.js} +1 -1
  43. package/dist/{project-test-coverage-4BGDDBBL.js → project-test-coverage-5PXAHBYQ.js} +1 -1
  44. package/dist/{proof-carrying-change-6LQ6JO5J.js → proof-carrying-change-456TYEDW.js} +1 -1
  45. package/dist/{verified-goal-JIRVX7KO.js → verified-goal-GRH5UOJR.js} +1 -1
  46. package/dist/{workspace-3K2YGPU7.js → workspace-ROUEA3RT.js} +1 -1
  47. package/dist/{workspace-agent-sync-TFQNKRD3.js → workspace-agent-sync-6UYG33EQ.js} +1 -1
  48. package/dist/{workspace-context-ZDXF6S7S.js → workspace-context-H7ZXR6VI.js} +1 -1
  49. package/dist/{workspace-contract-E7GVWM7W.js → workspace-contract-2V2BI6A3.js} +1 -1
  50. package/dist/{workspace-explain-YB66UFAS.js → workspace-explain-IBMTRUSF.js} +1 -1
  51. package/dist/{workspace-foundation-J62BMOQS.js → workspace-foundation-H5B3TTZD.js} +1 -1
  52. package/dist/{workspace-graph-stream-SJUCBPS4.js → workspace-graph-stream-YDEET5LK.js} +1 -1
  53. package/dist/workspace-graph-token-efficiency-XM3LYFUC.js +1 -0
  54. package/dist/{workspace-intelligence-3IAAM3H3.js → workspace-intelligence-DXKQXTTM.js} +1 -1
  55. package/dist/{workspace-intelligence-benchmark-UCGDKMDF.js → workspace-intelligence-benchmark-L46EGZZM.js} +1 -1
  56. package/dist/{workspace-intelligence-runner-OELXKX3D.js → workspace-intelligence-runner-SCB44IXU.js} +1 -1
  57. package/dist/{workspace-knowledge-graph-WNQMNAVL.js → workspace-knowledge-graph-BNEVFEOW.js} +1 -1
  58. package/dist/{workspace-knowledge-graph-query-3GPXGWYN.js → workspace-knowledge-graph-query-GOC365ZR.js} +1 -1
  59. package/dist/workspace-knowledge-graph-snapshot-2NMV7LEJ.js +1 -0
  60. package/dist/{workspace-mcp-serve-X7ZYJA3X.js → workspace-mcp-serve-JLZTTEVG.js} +1 -1
  61. package/dist/{workspace-model-5FA2636K.js → workspace-model-XSNLDUI2.js} +1 -1
  62. package/dist/{workspace-onboarding-CZSQDNKO.js → workspace-onboarding-IRBVZTT4.js} +1 -1
  63. package/dist/{workspace-registry-summary-WKENOFEA.js → workspace-registry-summary-CBZDSG6I.js} +1 -1
  64. package/dist/{workspace-repair-engine-RXHJX4CQ.js → workspace-repair-engine-TDUNQSFJ.js} +1 -1
  65. package/dist/workspace-run-I2W5PIPK.js +1 -0
  66. package/dist/{workspace-verify-37QL2JYE.js → workspace-verify-QTRY7WW3.js} +1 -1
  67. package/dist/{workspace-watch-P5X6TAFK.js → workspace-watch-PDQKYBYQ.js} +1 -1
  68. package/docs/SECURITY.md +16 -59
  69. package/docs/ci-workflows.md +43 -11
  70. package/package.json +2 -2
  71. package/dist/analyze-5ENZTHOT.js +0 -1
  72. package/dist/autopilot-release-QMZSHOLF.js +0 -1
  73. package/dist/chunk-6WOFOOM7.js +0 -7
  74. package/dist/chunk-BVWDG66W.js +0 -1
  75. package/dist/chunk-LLSY6L7E.js +0 -157
  76. package/dist/chunk-X5ZNFXFI.js +0 -1
  77. package/dist/workspace-graph-token-efficiency-BTIS6JXL.js +0 -1
  78. package/dist/workspace-knowledge-graph-snapshot-MTFTCVFF.js +0 -1
  79. package/dist/workspace-run-IDRHBKEB.js +0 -1
@@ -1,4 +1,4 @@
1
- import {b}from'./chunk-B6FJ6RG6.js';import {a as a$3}from'./chunk-7Q7X4X5I.js';import {j,g as g$1}from'./chunk-XVTN5DDV.js';import {d as d$1}from'./chunk-X5ZNFXFI.js';import {a as a$a}from'./chunk-JK6XEF7K.js';import {c as c$3,a as a$8,d,b as b$4}from'./chunk-N4B2M44I.js';import {a,c as c$4,h as h$1,g as g$3,k as k$1,f as f$2,d as d$3,e as e$3,i as i$1,j as j$3}from'./chunk-AO2ZI42U.js';import {f as f$1,e as e$1,g as g$2}from'./chunk-NSH7TTSV.js';import {a as a$1,b as b$1}from'./chunk-MGL6DBOR.js';import {c as c$2}from'./chunk-2RF75G5T.js';import {a as a$7,b as b$2}from'./chunk-QYXX6G5O.js';import {a as a$e}from'./chunk-CQBM6BBP.js';import {b as b$3}from'./chunk-IX5Z6EK6.js';import {a as a$5}from'./chunk-NMXGSVMD.js';import {a as a$4}from'./chunk-WPZUKU2B.js';import {z}from'./chunk-SATPH22S.js';import {j as j$2,l,m as m$1,d as d$2,e as e$2,b as b$6,a as a$d}from'./chunk-6WOFOOM7.js';import {a as a$c}from'./chunk-GR6442P7.js';import {g,h,i}from'./chunk-FE5R6EUV.js';import {a as a$6}from'./chunk-AFIFZTOY.js';import {a as a$2}from'./chunk-2LIVMG5C.js';import {s,p,t as t$1}from'./chunk-ODK4LCEL.js';import {e}from'./chunk-PKKSRXUS.js';import {a as a$b}from'./chunk-TQEMLBAG.js';import {c}from'./chunk-25AWHAB5.js';import {c as c$1,j as j$1,b as b$5,t as t$2,n,p as p$1,m as m$2}from'./chunk-RGNCL5OB.js';import {a as a$9}from'./chunk-2FIX2MDC.js';import {t,k,u as u$1}from'./chunk-VQZ5PI5J.js';import f from'chalk';import {createHash}from'crypto';import {execa}from'execa';import m from'fs-extra';import u from'path';import {existsSync}from'fs';var Xi=[".eslintrc.js",".eslintrc.cjs",".eslintrc.json",".eslintrc.yaml",".eslintrc.yml","eslint.config.js","eslint.config.mjs","eslint.config.cjs"],Qi=["tests","test","src/test","__tests__","e2e","playwright","cypress"],eo=["vitest.config.ts","vitest.config.js","vitest.config.mjs","jest.config.js","jest.config.ts","jest.config.mjs","playwright.config.ts","playwright.config.js","cypress.config.js","cypress.config.ts"],to=["src","app","pages"],no=["dev","build","test","lint"];function Xn(e){let t=e?.scripts;if(!t||typeof t!="object"||Array.isArray(t))return {};let i={};for(let[n,o]of Object.entries(t))typeof o=="string"&&o.trim().length>0&&(i[n]=o);return i}async function Qn(e,t){for(let o of Xi)if(await m.pathExists(u.join(e,o)))return true;let i=t??(await m.pathExists(u.join(e,"package.json"))?await m.readJson(u.join(e,"package.json")):null);if(!i)return false;if(i.eslintConfig)return true;let n={...i.dependencies??{},...i.devDependencies??{}};return !!(n.eslint||n["@eslint/js"]||n["@eslint/eslintrc"])}async function ei(e,t){for(let o of Qi)if(await m.pathExists(u.join(e,o)))return true;for(let o of eo)if(await m.pathExists(u.join(e,o)))return true;let i=Xn(t);if(i.test||i["test:unit"]||i["test:e2e"]||i["test:ci"]||i["test:watch"])return true;let n={...t?.dependencies??{},...t?.devDependencies??{}};return n.vitest||n.jest||n["@playwright/test"]||n.cypress?true:await io(e)}async function io(e){let t=["src","app","pages","components"],i=/\.(test|spec)\.(tsx?|jsx?|vue|svelte)$/i,o=new Set(["node_modules",".git","dist","build",".next","coverage",".turbo"]);for(let s of t){let r=u.join(e,s);if(!await m.pathExists(r))continue;let c=[{dir:r,depth:0}];for(;c.length>0;){let a=c.shift();if(!a)break;let l=[];try{l=await m.readdir(a.dir);}catch{continue}for(let d of l){let p=u.join(a.dir,d);if(i.test(d))return true;if(!(a.depth>=3||o.has(d)||d.startsWith(".")))try{(await m.stat(p)).isDirectory()&&c.push({dir:p,depth:a.depth+1});}catch{continue}}}}return false}async function Ut(e){for(let t of to){let i=u.join(e,t);if(await m.pathExists(i))try{if((await m.readdir(i)).some(o=>!o.startsWith(".")))return true}catch{continue}}return false}function oo(e){let t=e.key;return b$6(t).key}function ro(e,t,i){return a$d(t,i).some(o=>!!e[o])}async function ti(e){let{projectPath:t,detection:i,packageJsonData:n}=e,o=oo(i),s=b$6(o),r=Xn(n),c=[],a=await m.pathExists(u.join(t,"package-lock.json"))||await m.pathExists(u.join(t,"pnpm-lock.yaml"))||await m.pathExists(u.join(t,"yarn.lock"))||await m.pathExists(u.join(t,"bun.lockb"));c.push({id:"frontend-lockfile-integrity",label:"Frontend lockfile integrity",status:a?"pass":"warn",severity:"warn",scope:"project-scoped",reason:a?"Node lockfile detected for deterministic dependency restore.":"No Node lockfile detected (package-lock/yarn.lock/pnpm-lock.yaml/bun.lockb).",recommendation:a?void 0:"Commit a lockfile for deterministic installs and CI parity."});let l=await m.pathExists(u.join(t,"tsconfig.json")),d=await m.pathExists(u.join(t,"jsconfig.json")),p=l||d;c.push({id:"frontend-typescript-surface",label:"TypeScript project surface",status:p?"pass":"warn",severity:"warn",scope:"project-scoped",reason:p?l?"tsconfig.json detected.":"jsconfig.json detected.":"No tsconfig.json or jsconfig.json detected.",recommendation:p?void 0:"Add tsconfig.json (or jsconfig.json) for typed frontend builds and IDE parity."});let y=s.fileHints.length>0&&s.fileHints.some(v=>existsSync(u.join(t,v)));c.push({id:"frontend-framework-config",label:`${s.displayName} config surface`,status:y?"pass":"warn",severity:"warn",scope:"project-scoped",reason:y?`${s.displayName} configuration artifacts detected.`:`No ${s.displayName} config markers detected (${s.fileHints.join(", ")||"n/a"}).`,recommendation:y?void 0:"Keep framework config files in-repo for reproducible dev/build behavior."});for(let v of no){let C=ro(r,o,v),h=v==="dev"||v==="build",w=!C&&v==="test"?h$1({projectPath:t,frameworkDisplayName:s.displayName,scriptName:v,scriptValue:g$3(r)}):void 0;c.push({id:`frontend-script-${v}`,label:`${v} script surface`,status:C?"pass":h?"fail":"warn",severity:h?"error":"warn",scope:"project-scoped",reason:C?`package.json exposes a ${v} script for ${s.displayName}.`:`No ${v} script detected for ${s.displayName}.`,recommendation:C?void 0:`Add a "${a$d(o,v)[0]??v}" script to package.json.`,repairCapability:w});}let b=await Ut(t);return c.push({id:"frontend-source-tree",label:"Frontend source tree",status:b?"pass":"warn",severity:"warn",scope:"project-scoped",reason:b?"Application source directories detected (src/app/pages).":"No frontend source directories detected under src/, app/, or pages/.",recommendation:b?void 0:"Ensure the scaffolded application tree exists before running lifecycle commands."}),c}var so=s.doctorFixResult.schemaVersion,Ce="npx workspai workspace verify --from-impact .workspai/reports/workspace-impact-last-run.json --json";function Me(e){return {schemaVersion:so,generatedAt:new Date().toISOString(),appliedFixes:e.appliedFixes,remainingBlockers:e.remainingBlockers,verifyRecommended:e.verifyRecommended??Ce}}var ao=["python","node","go","java","rust","elixir","clojure","deno","bun","php","ruby","dotnet","scala","kotlin","c","cpp","unknown"],ni={node:["package-lock.json","pnpm-lock.yaml","yarn.lock","bun.lock","bun.lockb"],deno:["deno.lock"],bun:["bun.lock","bun.lockb"],python:["uv.lock","poetry.lock","requirements.txt","requirements.lock"],go:["go.sum"],java:["gradle.lockfile","gradle/libs.versions.toml"],rust:["Cargo.lock"],elixir:["mix.lock"],clojure:["deps.edn","project.clj"],php:["composer.lock"],ruby:["Gemfile.lock"],dotnet:["packages.lock.json","Directory.Packages.props"],scala:["project/build.properties","project/plugins.sbt"],kotlin:["gradle.lockfile","gradle/libs.versions.toml"],c:["conan.lock","vcpkg-lock.json","MODULE.bazel.lock","requirements.bazel.lock"],cpp:["conan.lock","vcpkg-lock.json","MODULE.bazel.lock","requirements.bazel.lock"],unknown:[]},ii={node:["package.json"],deno:["deno.json","deno.jsonc"],bun:["package.json","bunfig.toml",".bunfig.toml"],python:["pyproject.toml","requirements.txt","setup.py"],go:["go.mod"],java:["pom.xml","build.gradle","build.gradle.kts"],rust:["Cargo.toml"],elixir:["mix.exs"],clojure:["deps.edn","project.clj"],php:["composer.json"],ruby:["Gemfile"],dotnet:["*.csproj","*.sln"],scala:["build.sbt"],kotlin:["build.gradle","build.gradle.kts","pom.xml"],c:["CMakeLists.txt","meson.build","Makefile","MODULE.bazel","WORKSPACE"],cpp:["CMakeLists.txt","meson.build","Makefile","MODULE.bazel","WORKSPACE"],unknown:[]},co=["node_modules",".git",".workspai/reports",".venv","dist","build","coverage",".env",".env.*","!.env.example"].join(`
1
+ import {b}from'./chunk-B6FJ6RG6.js';import {a as a$3}from'./chunk-7Q7X4X5I.js';import {j,g as g$1}from'./chunk-XVTN5DDV.js';import {d as d$1}from'./chunk-7O7P4MRD.js';import {a as a$a}from'./chunk-JK6XEF7K.js';import {c as c$3,a as a$8,d,b as b$4}from'./chunk-N4B2M44I.js';import {a,c as c$4,h as h$1,g as g$3,k as k$1,f as f$2,d as d$3,e as e$3,i as i$1,j as j$3}from'./chunk-AO2ZI42U.js';import {f as f$1,e as e$1,g as g$2}from'./chunk-NSH7TTSV.js';import {a as a$1,b as b$1}from'./chunk-MGL6DBOR.js';import {c as c$2}from'./chunk-TIZCESKY.js';import {a as a$7,b as b$2}from'./chunk-ZZWGD3X3.js';import {a as a$e}from'./chunk-CQBM6BBP.js';import {b as b$3}from'./chunk-ND5YAC4T.js';import {a as a$5}from'./chunk-NMXGSVMD.js';import {a as a$4}from'./chunk-NNQE4DS2.js';import {z}from'./chunk-LGC4CRUF.js';import {j as j$2,l,m as m$1,d as d$2,e as e$2,b as b$6,a as a$d}from'./chunk-YYELANJO.js';import {a as a$c}from'./chunk-GR6442P7.js';import {g,h,i}from'./chunk-FE5R6EUV.js';import {a as a$6}from'./chunk-AFIFZTOY.js';import {a as a$2}from'./chunk-2LIVMG5C.js';import {s,p,t as t$1}from'./chunk-ODK4LCEL.js';import {e}from'./chunk-PKKSRXUS.js';import {a as a$b}from'./chunk-TQEMLBAG.js';import {c}from'./chunk-25AWHAB5.js';import {c as c$1,j as j$1,b as b$5,t as t$2,n,p as p$1,m as m$2}from'./chunk-RGNCL5OB.js';import {a as a$9}from'./chunk-2FIX2MDC.js';import {t,k,u as u$1}from'./chunk-VQZ5PI5J.js';import f from'chalk';import {createHash}from'crypto';import {execa}from'execa';import m from'fs-extra';import u from'path';import {existsSync}from'fs';var Xi=[".eslintrc.js",".eslintrc.cjs",".eslintrc.json",".eslintrc.yaml",".eslintrc.yml","eslint.config.js","eslint.config.mjs","eslint.config.cjs"],Qi=["tests","test","src/test","__tests__","e2e","playwright","cypress"],eo=["vitest.config.ts","vitest.config.js","vitest.config.mjs","jest.config.js","jest.config.ts","jest.config.mjs","playwright.config.ts","playwright.config.js","cypress.config.js","cypress.config.ts"],to=["src","app","pages"],no=["dev","build","test","lint"];function Xn(e){let t=e?.scripts;if(!t||typeof t!="object"||Array.isArray(t))return {};let i={};for(let[n,o]of Object.entries(t))typeof o=="string"&&o.trim().length>0&&(i[n]=o);return i}async function Qn(e,t){for(let o of Xi)if(await m.pathExists(u.join(e,o)))return true;let i=t??(await m.pathExists(u.join(e,"package.json"))?await m.readJson(u.join(e,"package.json")):null);if(!i)return false;if(i.eslintConfig)return true;let n={...i.dependencies??{},...i.devDependencies??{}};return !!(n.eslint||n["@eslint/js"]||n["@eslint/eslintrc"])}async function ei(e,t){for(let o of Qi)if(await m.pathExists(u.join(e,o)))return true;for(let o of eo)if(await m.pathExists(u.join(e,o)))return true;let i=Xn(t);if(i.test||i["test:unit"]||i["test:e2e"]||i["test:ci"]||i["test:watch"])return true;let n={...t?.dependencies??{},...t?.devDependencies??{}};return n.vitest||n.jest||n["@playwright/test"]||n.cypress?true:await io(e)}async function io(e){let t=["src","app","pages","components"],i=/\.(test|spec)\.(tsx?|jsx?|vue|svelte)$/i,o=new Set(["node_modules",".git","dist","build",".next","coverage",".turbo"]);for(let s of t){let r=u.join(e,s);if(!await m.pathExists(r))continue;let c=[{dir:r,depth:0}];for(;c.length>0;){let a=c.shift();if(!a)break;let l=[];try{l=await m.readdir(a.dir);}catch{continue}for(let d of l){let p=u.join(a.dir,d);if(i.test(d))return true;if(!(a.depth>=3||o.has(d)||d.startsWith(".")))try{(await m.stat(p)).isDirectory()&&c.push({dir:p,depth:a.depth+1});}catch{continue}}}}return false}async function Ut(e){for(let t of to){let i=u.join(e,t);if(await m.pathExists(i))try{if((await m.readdir(i)).some(o=>!o.startsWith(".")))return true}catch{continue}}return false}function oo(e){let t=e.key;return b$6(t).key}function ro(e,t,i){return a$d(t,i).some(o=>!!e[o])}async function ti(e){let{projectPath:t,detection:i,packageJsonData:n}=e,o=oo(i),s=b$6(o),r=Xn(n),c=[],a=await m.pathExists(u.join(t,"package-lock.json"))||await m.pathExists(u.join(t,"pnpm-lock.yaml"))||await m.pathExists(u.join(t,"yarn.lock"))||await m.pathExists(u.join(t,"bun.lockb"));c.push({id:"frontend-lockfile-integrity",label:"Frontend lockfile integrity",status:a?"pass":"warn",severity:"warn",scope:"project-scoped",reason:a?"Node lockfile detected for deterministic dependency restore.":"No Node lockfile detected (package-lock/yarn.lock/pnpm-lock.yaml/bun.lockb).",recommendation:a?void 0:"Commit a lockfile for deterministic installs and CI parity."});let l=await m.pathExists(u.join(t,"tsconfig.json")),d=await m.pathExists(u.join(t,"jsconfig.json")),p=l||d;c.push({id:"frontend-typescript-surface",label:"TypeScript project surface",status:p?"pass":"warn",severity:"warn",scope:"project-scoped",reason:p?l?"tsconfig.json detected.":"jsconfig.json detected.":"No tsconfig.json or jsconfig.json detected.",recommendation:p?void 0:"Add tsconfig.json (or jsconfig.json) for typed frontend builds and IDE parity."});let y=s.fileHints.length>0&&s.fileHints.some(v=>existsSync(u.join(t,v)));c.push({id:"frontend-framework-config",label:`${s.displayName} config surface`,status:y?"pass":"warn",severity:"warn",scope:"project-scoped",reason:y?`${s.displayName} configuration artifacts detected.`:`No ${s.displayName} config markers detected (${s.fileHints.join(", ")||"n/a"}).`,recommendation:y?void 0:"Keep framework config files in-repo for reproducible dev/build behavior."});for(let v of no){let C=ro(r,o,v),h=v==="dev"||v==="build",w=!C&&v==="test"?h$1({projectPath:t,frameworkDisplayName:s.displayName,scriptName:v,scriptValue:g$3(r)}):void 0;c.push({id:`frontend-script-${v}`,label:`${v} script surface`,status:C?"pass":h?"fail":"warn",severity:h?"error":"warn",scope:"project-scoped",reason:C?`package.json exposes a ${v} script for ${s.displayName}.`:`No ${v} script detected for ${s.displayName}.`,recommendation:C?void 0:`Add a "${a$d(o,v)[0]??v}" script to package.json.`,repairCapability:w});}let b=await Ut(t);return c.push({id:"frontend-source-tree",label:"Frontend source tree",status:b?"pass":"warn",severity:"warn",scope:"project-scoped",reason:b?"Application source directories detected (src/app/pages).":"No frontend source directories detected under src/, app/, or pages/.",recommendation:b?void 0:"Ensure the scaffolded application tree exists before running lifecycle commands."}),c}var so=s.doctorFixResult.schemaVersion,Ce="npx workspai workspace verify --from-impact .workspai/reports/workspace-impact-last-run.json --json";function Me(e){return {schemaVersion:so,generatedAt:new Date().toISOString(),appliedFixes:e.appliedFixes,remainingBlockers:e.remainingBlockers,verifyRecommended:e.verifyRecommended??Ce}}var ao=["python","node","go","java","rust","elixir","clojure","deno","bun","php","ruby","dotnet","scala","kotlin","c","cpp","unknown"],ni={node:["package-lock.json","pnpm-lock.yaml","yarn.lock","bun.lock","bun.lockb"],deno:["deno.lock"],bun:["bun.lock","bun.lockb"],python:["uv.lock","poetry.lock","requirements.txt","requirements.lock"],go:["go.sum"],java:["gradle.lockfile","gradle/libs.versions.toml"],rust:["Cargo.lock"],elixir:["mix.lock"],clojure:["deps.edn","project.clj"],php:["composer.lock"],ruby:["Gemfile.lock"],dotnet:["packages.lock.json","Directory.Packages.props"],scala:["project/build.properties","project/plugins.sbt"],kotlin:["gradle.lockfile","gradle/libs.versions.toml"],c:["conan.lock","vcpkg-lock.json","MODULE.bazel.lock","requirements.bazel.lock"],cpp:["conan.lock","vcpkg-lock.json","MODULE.bazel.lock","requirements.bazel.lock"],unknown:[]},ii={node:["package.json"],deno:["deno.json","deno.jsonc"],bun:["package.json","bunfig.toml",".bunfig.toml"],python:["pyproject.toml","requirements.txt","setup.py"],go:["go.mod"],java:["pom.xml","build.gradle","build.gradle.kts"],rust:["Cargo.toml"],elixir:["mix.exs"],clojure:["deps.edn","project.clj"],php:["composer.json"],ruby:["Gemfile"],dotnet:["*.csproj","*.sln"],scala:["build.sbt"],kotlin:["build.gradle","build.gradle.kts","pom.xml"],c:["CMakeLists.txt","meson.build","Makefile","MODULE.bazel","WORKSPACE"],cpp:["CMakeLists.txt","meson.build","Makefile","MODULE.bazel","WORKSPACE"],unknown:[]},co=["node_modules",".git",".workspai/reports",".venv","dist","build","coverage",".env",".env.*","!.env.example"].join(`
2
2
  `),Yt=[".env",".env.*","!.env.example"];function We(e){return e&&ao.includes(e)?e:"unknown"}async function Pe(e,t){for(let i of t){if(i.includes("*")){let n=i.replace("*","");if(await lo(e,n,2))return true;continue}if(await m.pathExists(u.join(e,i)))return true}return false}async function lo(e,t,i){let n=[{dir:e,depth:0}],o=new Set(["node_modules",".git",".workspai",".rapidkit","dist","build","coverage"]);for(;n.length>0;){let s=n.shift();if(!s)break;let r=[];try{r=await m.readdir(s.dir,{withFileTypes:true});}catch{continue}for(let c of r){if(o.has(c.name))continue;let a=u.join(s.dir,c.name);if(c.isFile()&&c.name.endsWith(t))return true;c.isDirectory()&&s.depth<i&&!c.name.startsWith(".")&&n.push({dir:a,depth:s.depth+1});}}return false}async function Zt(e,t=6){let i=await m.pathExists(u.join(e,"Dockerfile")),n=false,o=false,s=new Set(["docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml"]),r=new Set(["node_modules",".git",".workspai",".rapidkit","dist","build","coverage","target","vendor"]),c=[{dir:e,depth:0}];for(;c.length>0&&(!n||!o);){let a=c.shift();if(!a)break;let l=[];try{l=await m.readdir(a.dir,{withFileTypes:true});}catch{continue}for(let d of l)r.has(d.name)||(d.isFile()?(a.depth>0&&d.name==="Dockerfile"&&(n=true),s.has(d.name)&&(o=true)):d.isDirectory()&&a.depth<t&&!d.name.startsWith(".")&&c.push({dir:u.join(a.dir,d.name),depth:a.depth+1}));}return {rootDockerfile:i,nestedDockerfile:n,compose:o}}async function et(e){try{return await m.pathExists(e)?await m.readFile(e,"utf8"):""}catch{return ""}}async function Dt(e,t){let i=[];for(let n of t){let o=await et(u.join(e,n));o&&i.push(o);}return i.join(`
3
3
  `)}async function po(e){let t=u.join(e,".github","workflows"),i=[];try{i=await m.readdir(t,{withFileTypes:true});}catch{return ""}let n=[],o=0;for(let s of i.filter(r=>r.isFile()&&/\.(?:ya?ml)$/i.test(r.name)).sort((r,c)=>r.name.localeCompare(c.name)).slice(0,64)){let r=u.join(t,s.name);try{let c=await m.stat(r);if(c.size>512*1024||o+c.size>1024*1024)continue;n.push(await m.readFile(r,"utf8")),o+=c.size;}catch{}}return n.join(`
4
4
  `)}var uo=new Set([".c",".cc",".clj",".cljs",".cpp",".cs",".ex",".exs",".go",".h",".hpp",".java",".js",".jsx",".kt",".kts",".mjs",".cjs",".php",".py",".rb",".rs",".scala",".svelte",".ts",".tsx",".vue"]),mo=[/\bprocess\.env(?:\.([A-Z][A-Z0-9_]*)|\[['"]([A-Z][A-Z0-9_]*)['"]\])/g,/\bimport\.meta\.env\.([A-Z][A-Z0-9_]*)/g,/\b(?:Deno\.env\.get|os\.getenv|os\.Getenv|os\.LookupEnv|System\.getenv|std::env::var|env!|option_env!|getenv|Environment\.GetEnvironmentVariable)\(\s*['"]([A-Z][A-Z0-9_]*)['"]/g,/\bos\.environ(?:\.get\(\s*['"]([A-Z][A-Z0-9_]*)['"]|\[\s*['"]([A-Z][A-Z0-9_]*)['"]\s*\])/g,/\bENV(?:\.fetch\(\s*['"]([A-Z][A-Z0-9_]*)['"]|\[\s*['"]([A-Z][A-Z0-9_]*)['"]\s*\])/g,/\$_ENV\[\s*['"]([A-Z][A-Z0-9_]*)['"]\s*\]/g,/@Value\(\s*['"]\$\{([A-Z][A-Z0-9_]*)(?::[^}]*)?\}['"]\s*\)/g],fo=new Set(["BROWSER","CI","GITHUB_WORKSPACE","HOME","HOMEDRIVE","HOMEPATH","LOCALAPPDATA","PAGER","PATH","PROCESSOR_ARCHITEW6432","SSH_CLIENT","SSH_TTY","SYSTEMROOT","TEMP","TMP","TMPDIR","XDG_CACHE_HOME"]);async function go(e){let t=new Set,i=new Set([".git",".next",".nuxt",".output",".rapidkit",".svelte-kit",".venv",".workspai","build","coverage","dist","node_modules","target","vendor"]),n=[{dir:e,depth:0}],o=0;for(;n.length>0&&o<300;){let r=n.shift();if(!r)break;let c=[];try{c=await m.readdir(r.dir,{withFileTypes:true});}catch{continue}for(let a of c){if(i.has(a.name))continue;let l=u.join(r.dir,a.name);if(a.isDirectory()){r.depth<6&&!a.name.startsWith(".")&&n.push({dir:l,depth:r.depth+1});continue}if(!a.isFile()||!uo.has(u.extname(a.name).toLowerCase()))continue;o+=1;let d="";try{if((await m.stat(l)).size>512*1024)continue;d=await m.readFile(l,"utf8");}catch{continue}for(let p of mo){p.lastIndex=0;for(let y of d.matchAll(p)){let b=y.slice(1).find(v=>typeof v=="string"&&v.length>0);b&&!fo.has(b)&&t.add(b);}}}}let s=await et(u.join(e,".env"));for(let r of s.split(/\r?\n/)){let c=r.match(/^\s*(?:export\s+)?([A-Z][A-Z0-9_]*)\s*=/);c?.[1]&&t.add(c[1]);}return [...t].sort((r,c)=>r.localeCompare(c))}async function yo(e){if(e.runtime==="node"){let t=typeof e.packageJsonData?.packageManager=="string"?e.packageJsonData.packageManager.split("@")[0]:null;return {command:t==="pnpm"?"pnpm install":t==="yarn"?"yarn install":t==="bun"?"bun install":"npm install",title:"Generate Node dependency lockfile",files:["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","bun.lock"],limitations:["Review dependency and lockfile changes before committing."]}}if(e.runtime==="go"&&await m.pathExists(u.join(e.projectPath,"go.mod")))return {command:"go mod tidy",title:"Reconcile Go module graph",files:["go.mod","go.sum"],limitations:["Review go.mod/go.sum changes before committing."]};if(e.runtime==="java"){let t=await m.pathExists(u.join(e.projectPath,"pom.xml")),i=await m.pathExists(u.join(e.projectPath,"mvnw"))||await m.pathExists(u.join(e.projectPath,"mvnw.cmd")),n=await m.pathExists(u.join(e.projectPath,"gradlew"))||await m.pathExists(u.join(e.projectPath,"gradlew.bat")),o=t?i?process.platform==="win32"?".\\mvnw.cmd -B -DskipTests -Dmaven.repo.local=.workspai/cache/java/m2 dependency:go-offline":"./mvnw -B -DskipTests -Dmaven.repo.local=.workspai/cache/java/m2 dependency:go-offline":"mvn -B -DskipTests -Dmaven.repo.local=.workspai/cache/java/m2 dependency:go-offline":n?process.platform==="win32"?".\\gradlew.bat --project-cache-dir .workspai/cache/java/gradle dependencies":"./gradlew --project-cache-dir .workspai/cache/java/gradle dependencies":"gradle --project-cache-dir .workspai/cache/java/gradle dependencies";return t?{command:o,title:"Warm Maven dependency graph",files:["pom.xml"],limitations:["Maven does not provide a native transitive lockfile; dependency:go-offline warms dependencies but does not create reproducibility evidence."]}:{command:o,title:"Prepare Gradle dependency baseline",files:["build.gradle","build.gradle.kts","gradle.lockfile"],limitations:["Review resolved dependency and lockfile changes before committing."]}}if(e.runtime==="scala")return {command:"sbt update",title:"Prepare Scala dependency baseline",files:["build.sbt","project/build.properties","project/plugins.sbt"],limitations:["Review resolved dependency and plugin changes before committing."]};if(e.runtime==="kotlin")return {command:process.platform==="win32"?".\\gradlew.bat dependencies":"./gradlew dependencies",title:"Prepare Kotlin dependency baseline",files:["build.gradle","build.gradle.kts","gradle.lockfile"],limitations:["Review resolved dependency and lockfile changes before committing."]};if(e.runtime==="rust")return {command:"cargo fetch",title:"Generate Rust dependency baseline",files:["Cargo.toml","Cargo.lock"],limitations:["Review Cargo.lock changes before committing."]};if(e.runtime==="php")return {command:"composer install",title:"Generate Composer lockfile",files:["composer.json","composer.lock"],limitations:["Review composer.lock changes before committing."]};if(e.runtime==="ruby")return {command:"bundle install",title:"Generate Bundler lockfile",files:["Gemfile","Gemfile.lock"],limitations:["Review Gemfile.lock changes before committing."]};if(e.runtime==="dotnet")return {command:"dotnet restore",title:".NET dependency restore",files:["*.sln","*.csproj","packages.lock.json","Directory.Packages.props"],limitations:["Enable NuGet lock files in the project when release policy requires deterministic restore."]};if(e.runtime==="elixir")return {command:"mix deps.get",title:"Generate Elixir dependency lockfile",files:["mix.exs","mix.lock"],limitations:["Review mix.lock changes before committing."]};if(e.runtime==="clojure")return {command:"clojure -P",title:"Prepare Clojure dependency baseline",files:["deps.edn","project.clj"],limitations:["Review dependency cache and CI restore policy before release."]};if(e.runtime==="python"){let t=await et(u.join(e.projectPath,"pyproject.toml"));if(/\[tool\.poetry\]/.test(t))return {command:"poetry install --no-root",title:"Install Poetry dependency baseline",files:["pyproject.toml","poetry.lock"],limitations:["Review poetry.lock changes before committing when Poetry resolves or updates the lockfile."]};if(/\[tool\.uv\]|\[project\]/.test(t))return {command:"uv lock",title:"Generate uv lockfile",files:["pyproject.toml","uv.lock"],limitations:["Review uv.lock changes before committing."]}}return null}function tt(e){let t=e?.scripts;if(!t||typeof t!="object"||Array.isArray(t))return {};let i={};for(let[n,o]of Object.entries(t))typeof o=="string"&&o.trim().length>0&&(i[n]=o);return i}function ho(e){if(e.runtime==="node"){let i=tt(e.packageJsonData);if(!e.packageJsonData)return null;if(e.kind==="test"){let n=i.lint?"npm run lint":i.build?"npm run build":null;return n?{command:n,title:"Define Node test script",targetName:"test",files:["package.json"],limitations:["Replace this fallback with real tests when product coverage is required."]}:null}if(e.kind==="security"){let n=a$e(e.projectPath);return {command:n==="pnpm"?"pnpm audit --audit-level=moderate":n==="yarn"?m.existsSync(u.join(e.projectPath,".yarnrc.yml"))?"yarn npm audit --severity moderate":"yarn audit --level moderate":n==="bun"?"bun audit":"npm audit --audit-level=moderate",title:"Define Node security audit script",targetName:"audit",files:["package.json"]}}return null}return {deno:{test:{command:"deno test --allow-none",title:"Define Deno test command",targetName:"test",files:["Makefile","deno.json","deno.jsonc"]},quality:{command:"deno fmt --check && deno lint",title:"Define Deno quality command",targetName:"quality",files:["Makefile","deno.json","deno.jsonc"]},security:{command:"deno info --json",title:"Define Deno dependency inspection command",targetName:"security",files:["Makefile","deno.json","deno.jsonc","deno.lock"],limitations:["Pair dependency inspection with the organization vulnerability service used by CI."]}},bun:{test:{command:"bun test",title:"Define Bun test script",targetName:"test",files:["package.json","bun.lock","bun.lockb"]},quality:{command:"bunx eslint .",title:"Define Bun quality script",targetName:"quality",files:["package.json"],limitations:["Ensure ESLint is declared before enforcing this command in CI."]},security:{command:"bun audit",title:"Define Bun security audit script",targetName:"audit",files:["package.json","bun.lock","bun.lockb"]}},python:{test:{command:"python -m pytest",title:"Define Python test command",targetName:"test",files:["Makefile","pyproject.toml"]},quality:{command:"python -m ruff check .",title:"Define Python quality command",targetName:"quality",files:["Makefile","pyproject.toml"],limitations:["Ensure ruff is declared in project dev dependencies before enforcing in CI."]},security:{command:"python -m pip_audit",title:"Define Python security audit command",targetName:"security",files:["Makefile","pyproject.toml"],limitations:["Ensure pip-audit is available in the project toolchain before enforcing in CI."]}},go:{test:{command:"go test ./...",title:"Define Go test command",targetName:"test",files:["Makefile","go.mod"]},quality:{command:"gofmt -w .",title:"Define Go formatting command",targetName:"quality",files:["Makefile","go.mod"],limitations:["Use CI-specific check mode if formatting should not mutate files in pipelines."]},security:{command:"govulncheck ./...",title:"Define Go vulnerability scan command",targetName:"security",files:["Makefile","go.mod"],limitations:["Ensure govulncheck is installed or provisioned by CI before enforcing."]}},rust:{test:{command:"cargo test",title:"Define Rust test command",targetName:"test",files:["Makefile","Cargo.toml"]},quality:{command:"cargo fmt -- --check && cargo clippy --all-targets -- -D warnings",title:"Define Rust quality command",targetName:"quality",files:["Makefile","Cargo.toml"]},security:{command:"cargo audit",title:"Define Rust security audit command",targetName:"security",files:["Makefile","Cargo.toml"],limitations:["Ensure cargo-audit is installed or provisioned by CI before enforcing."]}},php:{test:{command:"vendor/bin/phpunit",title:"Define PHP test command",targetName:"test",files:["Makefile","composer.json"]},quality:{command:"vendor/bin/phpstan analyse",title:"Define PHP static analysis command",targetName:"quality",files:["Makefile","composer.json"],limitations:["Ensure phpstan is declared in require-dev before enforcing in CI."]},security:{command:"composer audit",title:"Define Composer security audit command",targetName:"security",files:["Makefile","composer.json"]}},ruby:{test:{command:"bundle exec rspec",title:"Define Ruby test command",targetName:"test",files:["Makefile","Gemfile"],limitations:["Use bundle exec ruby -Itest when the project uses minitest instead of RSpec."]},quality:{command:"bundle exec rubocop",title:"Define Ruby quality command",targetName:"quality",files:["Makefile","Gemfile"]},security:{command:"bundle exec bundler-audit check",title:"Define Ruby security audit command",targetName:"security",files:["Makefile","Gemfile"],limitations:["Ensure bundler-audit is installed or provisioned by CI before enforcing."]}},dotnet:{test:{command:"dotnet test",title:"Define .NET test command",targetName:"test",files:["Makefile","*.sln","*.csproj"]},quality:{command:"dotnet format --verify-no-changes",title:"Define .NET formatting gate",targetName:"quality",files:["Makefile","*.sln","*.csproj"]},security:{command:"dotnet list package --vulnerable",title:"Define .NET package vulnerability check",targetName:"security",files:["Makefile","*.sln","*.csproj"]}},java:{test:{command:"mvn test",title:"Define Java test command",targetName:"test",files:["Makefile","pom.xml","build.gradle","build.gradle.kts"],limitations:["Use ./gradlew test when the project is Gradle-first."]},quality:{command:"mvn verify",title:"Define Java verification command",targetName:"quality",files:["Makefile","pom.xml","build.gradle","build.gradle.kts"],limitations:["Use ./gradlew check when the project is Gradle-first."]},security:{command:"mvn org.owasp:dependency-check-maven:check",title:"Define Java dependency vulnerability check",targetName:"security",files:["Makefile","pom.xml"],limitations:["Review OWASP dependency-check policy and cache behavior before enforcing in CI."]}},elixir:{test:{command:"mix test",title:"Define Elixir test command",targetName:"test",files:["Makefile","mix.exs"]},quality:{command:"mix format --check-formatted && mix credo --strict",title:"Define Elixir quality command",targetName:"quality",files:["Makefile","mix.exs",".formatter.exs","credo.exs"],limitations:["Ensure Credo is declared before enforcing the strict quality command."]},security:{command:"mix hex.audit",title:"Define Hex dependency audit command",targetName:"security",files:["Makefile","mix.exs","mix.lock"]}},clojure:{test:{command:"clojure -M:test",title:"Define Clojure test command",targetName:"test",files:["Makefile","deps.edn","project.clj"],limitations:["Align the alias with the test runner declared by the project."]},quality:{command:"clj-kondo --lint src test",title:"Define Clojure quality command",targetName:"quality",files:["Makefile","deps.edn","project.clj"],limitations:["Ensure clj-kondo is provisioned before enforcing this command in CI."]},security:{command:"clojure -Stree",title:"Define Clojure dependency inspection command",targetName:"security",files:["Makefile","deps.edn","project.clj"],limitations:["Pair dependency-tree inspection with the vulnerability scanner selected by the organization."]}},scala:{test:{command:"sbt test",title:"Define Scala test command",targetName:"test",files:["Makefile","build.sbt"]},quality:{command:"sbt scalafmtCheckAll scalafixAll",title:"Define Scala quality command",targetName:"quality",files:["Makefile","build.sbt",".scalafmt.conf"],limitations:["Declare Scalafmt and Scalafix plugins before enforcing this command."]},security:{command:"sbt dependencyTree",title:"Define Scala dependency inspection command",targetName:"security",files:["Makefile","build.sbt"],limitations:["Pair dependency inspection with the organization vulnerability scanner."]}},kotlin:{test:{command:"./gradlew test",title:"Define Kotlin test command",targetName:"test",files:["Makefile","build.gradle","build.gradle.kts"]},quality:{command:"./gradlew check",title:"Define Kotlin quality command",targetName:"quality",files:["Makefile","build.gradle","build.gradle.kts"]},security:{command:"./gradlew dependencies",title:"Define Kotlin dependency inspection command",targetName:"security",files:["Makefile","build.gradle","build.gradle.kts"],limitations:["Pair dependency inspection with the organization vulnerability scanner."]}},c:{test:{command:"ctest --test-dir build --output-on-failure",title:"Define C test command",targetName:"test",files:["Makefile","CMakeLists.txt"]},quality:{command:"clang-tidy src/**/*.c --",title:"Define C quality command",targetName:"quality",files:["Makefile","CMakeLists.txt",".clang-tidy"],limitations:["Align source globs and compile database with the project build."]},security:{command:"cmake --build build --target sbom",title:"Define C dependency evidence command",targetName:"security",files:["Makefile","CMakeLists.txt"],limitations:["Declare the SBOM target or replace it with the organization scanner."]}},cpp:{test:{command:"ctest --test-dir build --output-on-failure",title:"Define C++ test command",targetName:"test",files:["Makefile","CMakeLists.txt"]},quality:{command:"clang-tidy src/**/*.cpp --",title:"Define C++ quality command",targetName:"quality",files:["Makefile","CMakeLists.txt",".clang-tidy"],limitations:["Align source globs and compile database with the project build."]},security:{command:"cmake --build build --target sbom",title:"Define C++ dependency evidence command",targetName:"security",files:["Makefile","CMakeLists.txt"],limitations:["Declare the SBOM target or replace it with the organization scanner."]}}}[e.runtime]?.[e.kind]??null}async function bo(e){return j$3({issueId:e.issueId,title:e.contract.title,projectPath:e.projectPath,targetName:e.contract.targetName,command:e.contract.command,reason:e.reason,risk:"guarded",requiresReview:true,limitations:e.contract.limitations})}async function Xt(e){let t=ho({runtime:e.runtime,kind:e.kind,projectPath:e.projectPath,packageJsonData:e.packageJsonData});if(t)return (e.runtime==="node"||e.runtime==="bun")&&e.packageJsonData?i$1({issueId:e.issueId,title:t.title,projectPath:e.projectPath,scriptName:t.targetName,scriptValue:t.command,reason:e.reason,risk:"guarded",limitations:t.limitations}):await m.pathExists(u.join(e.projectPath,"Makefile"))?bo({issueId:e.issueId,projectPath:e.projectPath,contract:t,reason:e.reason}):De({issueId:e.issueId,title:t.title,projectPath:e.projectPath,files:t.files.filter(i=>i!=="Makefile"),reason:`${e.reason} The repository does not expose a Makefile, so Doctor will not invent a new command surface.`,limitations:t.limitations})}function De(e){return {id:`${e.issueId}.manual`,issueId:e.issueId,title:e.title,status:"manual",fixKind:"manual",risk:"guarded",canAutoFix:false,canEditFiles:false,requiresApproval:true,requiresReview:true,files:e.files.map(t=>u.join(e.projectPath,t)),refreshCommands:["npx workspai doctor project --json","npx workspai workspace verify --json"],reason:e.reason,limitations:e.limitations}}function ko(e){return d$3({issueId:"surface-dockerignore",title:"Create .dockerignore",projectPath:e,relativePath:".dockerignore",content:`${co}
@@ -14,7 +14,7 @@ ${r}`)||c,l=a?void 0:await Xt({issueId:"runtime-quality-tooling",projectPath:e.p
14
14
  `),s=/npm audit|pnpm audit|yarn audit|bun audit|pip[-_]audit|safety|bandit|govulncheck|gosec|dependency-check|dependency-review-action|codeql-action|zizmor|owasp|cargo audit|mix hex.audit|composer audit|bundler-audit|brakeman|NuGetAudit|dotnet list package --vulnerable|dependencyCheck|dependency-check|snyk|trivy|osv-scanner|cyclonedx|sbom/i.test(o),r=s?void 0:await Xt({issueId:"runtime-security-tooling",projectPath:e.projectPath,runtime:t,kind:"security",packageJsonData:e.packageJsonData,reason:"Create a deterministic runtime-native security audit command contract so CI and Studio can verify dependency risk consistently."});return {id:"runtime-security-tooling",label:"Runtime-native security tooling",status:s?"pass":"warn",severity:"warn",scope:"project-scoped",reason:s?"Runtime-native security audit tooling marker detected.":"No runtime-native security audit tooling marker detected.",recommendation:s?void 0:"Expose a runtime-native dependency/security audit command for CI and Studio verification.",repairCapability:s?void 0:r||De({issueId:"runtime-security-tooling",title:"Define runtime security audit command",projectPath:e.projectPath,files:["package.json","pyproject.toml","Makefile","pom.xml","Cargo.toml"],reason:"Security tooling differs by runtime and organization policy; Doctor records the missing contract for review."})}}async function oi(e){let t=We(e.runtimeFamily),i=[],n=await wo({projectPath:e.projectPath,runtime:t,packageJsonData:e.packageJsonData});n&&i.push(n),i.push(await jo(e)),i.push(await xo(e)),i.push(await Co(e)),i.push(await Po(e)),i.push(await Do(e)),i.push(await Ro(e)),(t==="node"||t==="bun")&&i.push(Eo(e));let o=await Promise.all([Ao(e),Fo(e),$o(e)]);for(let s of o)s&&i.push(s);return i}var ke={low:0,moderate:0,high:0,critical:0,unknown:0};function Mo(e){let t=String(e??"unknown").toLowerCase();return t==="medium"?"moderate":t==="low"||t==="moderate"||t==="high"||t==="critical"?t:"unknown"}function be(e){let t=typeof e.name=="string"?e.name.trim():"";return t?{name:t,...typeof e.version=="string"&&e.version.trim()?{version:e.version.trim()}:{},...typeof e.direct=="boolean"?{direct:e.direct}:{},advisoryIds:[...new Set((e.advisoryIds??[]).map(i=>typeof i=="string"||typeof i=="number"?String(i).trim():"").filter(Boolean))].sort(),severities:[...new Set((e.severities??[]).map(i=>Mo(i)))].sort()}:null}function he(e){let t=new Map;for(let i of e){if(!i)continue;let n=i.name.toLowerCase(),o=t.get(n);if(!o){t.set(n,i);continue}t.set(n,{name:o.name,...o.version||i.version?{version:o.version??i.version}:{},...o.direct!==void 0||i.direct!==void 0?{direct:o.direct??i.direct}:{},advisoryIds:[...new Set([...o.advisoryIds,...i.advisoryIds])].sort(),severities:[...new Set([...o.severities,...i.severities])].sort()});}return [...t.values()].sort((i,n)=>i.name.localeCompare(n.name))}function ri(e){return e.map(t=>{let i=t.direct===true?"direct":t.direct===false?"transitive":"unknown";return {packageName:t.name,relationship:i,strategies:i==="direct"?["direct-upgrade","constraint-update","replacement","policy-exception","upstream-wait"]:["owner-upgrade","constraint-update","replacement","policy-exception","upstream-wait"],risk:"guarded",autoExecutable:false,requiresCompatibilityVerification:true,...t.version?{currentVersion:t.version}:{},ownerPackages:[],advisoryIds:[...t.advisoryIds],reason:"Resolve the advisory through the runtime-native dependency manifest and lock/baseline, then prove compatibility with audit, tests, build, and canonical verification."}})}var Te=new Map,To=256,Oo=["package.json","package-lock.json","npm-shrinkwrap.json","pnpm-lock.yaml","yarn.lock",".yarnrc.yml","bun.lock","bun.lockb","deno.lock","pyproject.toml","requirements.txt","uv.lock","poetry.lock","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","Cargo.lock","composer.json","composer.lock","Gemfile","Gemfile.lock","mix.exs","mix.lock","deps.edn","project.clj","Directory.Packages.props","packages.lock.json"];function _o(){let e=Number(process.env.RAPIDKIT_DOCTOR_AUDIT_TIMEOUT_MS);return Number.isFinite(e)&&e>0?Math.trunc(e):15e3}async function Bo(e,t){let i=[];for(let n of Oo){let o=u.join(e,n);try{let s=await m.readFile(o);i.push(`${n}:${s.byteLength}:${createHash("sha256").update(s).digest("hex")}`);}catch{}}return `${u.resolve(e)}\0${t}\0${i.join("|")}`}function Re(e){let t=e.trim();if(!t)return null;try{let i=JSON.parse(t);return i&&typeof i=="object"&&!Array.isArray(i)?i:null}catch{return null}}function nt(e){return typeof e=="number"&&Number.isFinite(e)?Math.max(0,e):0}function si(e){let t=e&&typeof e=="object"&&!Array.isArray(e)?e:{};return {low:nt(t.low),moderate:nt(t.moderate??t.medium),high:nt(t.high),critical:nt(t.critical),unknown:nt(t.unknown)}}function it(e){return e.low+e.moderate+e.high+e.critical+e.unknown}function Go(e){if(typeof e!="string")return;let t=e.trim(),i=t.match(/^<\s*(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)$/);if(i)return `>=${i[1]}`;let n=t.match(/^<=\s*(\d+)\.(\d+)\.(\d+)$/);if(n)return `>=${n[1]}.${n[2]}.${Number(n[3])+1}`}async function Ko(e){let t=new Map;try{let i=await m.readJSON(u.join(e,"package.json"));for(let n of ["dependencies","devDependencies","optionalDependencies","peerDependencies"]){let o=i[n];if(!(!o||typeof o!="object"||Array.isArray(o)))for(let[s,r]of Object.entries(o))typeof r=="string"&&r.trim()&&t.set(s.toLowerCase(),r.trim());}}catch{}return t}async function Wo(e,t){let i=Re(t),n=i?.vulnerabilities&&typeof i.vulnerabilities=="object"&&!Array.isArray(i.vulnerabilities)?i.vulnerabilities:void 0;if(!n)return [];let[o,s]=await Promise.all([li(e),Ko(e)]),r=new Map;for(let[c,a]of Object.entries(n)){let l=a&&typeof a=="object"?a:{},d=typeof l.name=="string"&&l.name.trim()?l.name.trim():c.trim();if(!d)continue;let p=l.isDirect===true?"direct":l.isDirect===false?"transitive":"unknown",y=Array.isArray(l.effects)?[...new Set(l.effects.filter(x=>typeof x=="string").map(x=>x.trim()).filter(Boolean))].sort():[],b=Array.isArray(l.via)?l.via:[],v=[...new Set(b.flatMap(x=>{let g=x&&typeof x=="object"?x:{};return [g.source,g.url].filter(D=>typeof D=="string"||typeof D=="number").map(String)}))].sort(),C=typeof l.range=="string"?l.range.trim():void 0,h=Go(C),w=s.get(d.toLowerCase()),P=o.get(d.toLowerCase()),R=p==="direct"?["direct-upgrade","constraint-update","replacement","policy-exception","upstream-wait"]:[...y.length>0?["owner-upgrade"]:[],"transitive-override","replacement","policy-exception","upstream-wait"];r.set(d.toLowerCase(),{packageName:d,relationship:p,strategies:R,risk:"guarded",autoExecutable:false,requiresCompatibilityVerification:true,...P?{currentVersion:P}:{},...w?{currentRange:w}:{},...C?{vulnerableRange:C}:{},...h?{safeVersionConstraint:h}:{},ownerPackages:y,advisoryIds:v,reason:p==="direct"?"Resolve the direct dependency inside its declared compatibility boundary, then reconcile and verify the complete dependency transaction.":"Resolve the vulnerable transitive path through a compatible owner upgrade or a guarded package-manager constraint; never infer safety from an audit downgrade."});}return [...r.values()].sort((c,a)=>c.packageName.localeCompare(a.packageName))}function Le(e,t,i=1){let n=String(t??"unknown").toLowerCase();n==="low"?e.low+=i:n==="moderate"||n==="medium"?e.moderate+=i:n==="high"?e.high+=i:n==="critical"?e.critical+=i:e.unknown+=i;}function ot(e,t){if(Array.isArray(e)){for(let n of e)ot(n,t);return}if(!e||typeof e!="object")return;let i=e;t(i);for(let n of Object.values(i))ot(n,t);}function Ho(e,t){if(t===0)return {disposition:"not-needed",compatibleFixAvailable:false,breakingFixAvailable:false,candidates:[]};let i=false,n=false,o=false,s=[];for(let[c,a]of e){let l=a&&typeof a=="object"?a:{};if(!Object.prototype.hasOwnProperty.call(l,"fixAvailable"))continue;i=true;let d=l.fixAvailable;if(d===true){n=true,s.push({packageName:c,breaking:false});continue}if(!d||typeof d!="object"||Array.isArray(d))continue;let p=d,y=typeof p.name=="string"&&p.name.trim()?p.name.trim():c,b=p.isSemVerMajor===true;n||=!b,o||=b,s.push({packageName:y,...typeof p.version=="string"&&p.version.trim()?{version:p.version.trim()}:{},breaking:b});}return {disposition:n?o?"mixed":"compatible":o?"breaking-only":i?"none":"unknown",compatibleFixAvailable:n,breakingFixAvailable:o,candidates:s.sort((c,a)=>`${c.packageName}@${c.version??""}`.localeCompare(`${a.packageName}@${a.version??""}`))}}function Lo(e,t){let i=s=>{let r=s.trim().match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([^+]+))?(?:\+.+)?$/);return r?[Number(r[1]),Number(r[2]),Number(r[3]),r[4]??""]:null},n=i(e),o=i(t);if(!n||!o)return null;for(let s=0;s<3;s+=1)if(n[s]!==o[s])return Number(n[s])>Number(o[s])?1:-1;return n[3]===o[3]?0:n[3]?o[3]?n[3].localeCompare(o[3]):-1:1}async function li(e){let t=new Map;try{let i=await m.readJSON(u.join(e,"package-lock.json")),n=i.packages&&typeof i.packages=="object"&&!Array.isArray(i.packages)?i.packages:{};for(let[s,r]of Object.entries(n)){if(!s.startsWith("node_modules/"))continue;let c=s.replace(/^node_modules\//,"").split("/node_modules/").at(-1)?.trim()??"";if(!c)continue;let a=r&&typeof r=="object"?r:{};!t.has(c.toLowerCase())&&typeof a.version=="string"&&a.version.trim()&&t.set(c.toLowerCase(),a.version.trim());}let o=i.dependencies&&typeof i.dependencies=="object"&&!Array.isArray(i.dependencies)?i.dependencies:{};for(let[s,r]of Object.entries(o)){if(t.has(s.toLowerCase()))continue;let c=r&&typeof r=="object"?r:{};typeof c.version=="string"&&c.version.trim()&&t.set(s.toLowerCase(),c.version.trim());}}catch{}return t}async function qo(e,t){if(t.disposition==="not-needed")return t;let i=await li(e),n=new Map;for(let a of t.candidates){let l=i.get(a.packageName.toLowerCase());if(a.version&&l){let y=Lo(a.version,l);if(y!==null&&y<=0)continue}let d=`${a.packageName.toLowerCase()}\0${a.version??""}`,p=n.get(d);n.set(d,{packageName:p?.packageName??a.packageName,...a.version?{version:a.version}:{},breaking:!!(p?.breaking||a.breaking)});}let o=[...n.values()].sort((a,l)=>`${a.packageName}@${a.version??""}`.localeCompare(`${l.packageName}@${l.version??""}`)),s=o.some(a=>!a.breaking),r=o.some(a=>a.breaking);return {disposition:s?r?"mixed":"compatible":r?"breaking-only":"none",compatibleFixAvailable:s,breakingFixAvailable:r,candidates:o}}function Vo(e){let t=Re(e);if(!t){let l={...ke},d=[],p=0,y=false;for(let b of e.split(/\r?\n/)){let v=Re(b);if(!v)continue;let C=v.data&&typeof v.data=="object"?v.data:{};if(v.type==="auditAdvisory"){let h=C.advisory&&typeof C.advisory=="object"?C.advisory:{};p+=1,Le(l,h.severity);let w=be({name:h.module_name??h.name,advisoryIds:[h.id,h.github_advisory_id,h.url],severities:[h.severity]});w&&d.push(w);}if(v.type==="auditSummary"){y=true;let h=si(C.vulnerabilities);if(it(h)>=p)return {findingCount:it(h),severityCounts:h,subjects:he(d)}}}return p>0||y?{findingCount:p,severityCounts:l,subjects:he(d)}:null}let i=t.metadata&&typeof t.metadata=="object"?t.metadata:null,n=si(i?.vulnerabilities),o=t.vulnerabilities&&typeof t.vulnerabilities=="object"?Object.entries(t.vulnerabilities):[],s=he(o.map(([l,d])=>{let p=d&&typeof d=="object"?d:{},y=Array.isArray(p.via)?p.via:[];return be({name:p.name??l,direct:p.isDirect,advisoryIds:y.flatMap(b=>{let v=b&&typeof b=="object"?b:{};return [v.source,v.url]}),severities:[p.severity]})}));if(it(n)>0||i?.vulnerabilities){let l=it(n);return {findingCount:l,severityCounts:n,subjects:s,remediation:Ho(o,l)}}let r=t.advisories&&typeof t.advisories=="object"?Object.entries(t.advisories):[];if(!(t.advisories!==null&&typeof t.advisories=="object"&&!Array.isArray(t.advisories)))return null;let a=[];for(let[l,d]of r){let p=d&&typeof d=="object"?d:{};Le(n,p.severity);let y=be({name:p.module_name??p.name,advisoryIds:[p.id,p.github_advisory_id,p.url,l],severities:[p.severity]});y&&a.push(y);}return {findingCount:r.length,severityCounts:n,subjects:he([...s,...a])}}function zo(e){let t=(()=>{try{return JSON.parse(e.trim())}catch{return null}})(),i=Array.isArray(t)?t:t&&typeof t=="object"?t.dependencies:null;if(!Array.isArray(i))return null;let n={...ke},o=[],s=0;for(let r of i){let c=r&&typeof r=="object"?r:{},a=Array.isArray(c.vulns)?c.vulns:[];if(s+=a.length,n.unknown+=a.length,a.length>0){let l=be({name:c.name,version:c.version,advisoryIds:a.flatMap(d=>{let p=d&&typeof d=="object"?d:{};return [p.id,p.aliases].flatMap(y=>Array.isArray(y)?y:[y])}),severities:a.map(()=>"unknown")});l&&o.push(l);}}return {findingCount:s,severityCounts:n,subjects:he(o)}}function Jo(e){if(!e.trim())return null;let t=new Set,i=new Map;for(let n of e.split(/\r?\n/)){let o=Re(n),s=o?.osv&&typeof o.osv=="object"?o.osv:null;typeof s?.id=="string"&&t.add(s.id);let r=o?.finding&&typeof o.finding=="object"?o.finding:null;typeof r?.osv=="string"&&t.add(r.osv);let c=Array.isArray(r?.trace)?r.trace:[];for(let a of c){let l=a&&typeof a=="object"?a:{},d=typeof l.module=="string"?l.module:typeof l.package=="string"?l.package:"";if(!d)continue;let p=i.get(d)??{advisoryIds:new Set};typeof l.version=="string"&&(p.version=l.version),typeof r?.osv=="string"&&p.advisoryIds.add(r.osv),i.set(d,p);}}return {findingCount:t.size,severityCounts:{...ke,unknown:t.size},subjects:[...i.entries()].map(([n,o])=>be({name:n,version:o.version,advisoryIds:[...o.advisoryIds],severities:["unknown"]})).filter(n=>!!n)}}function Uo(e){let t=Re(e);if(!t)return null;let i=t.vulnerabilities&&typeof t.vulnerabilities=="object"?t.vulnerabilities:{},n=Array.isArray(i.list)?i.list:[],o={...ke},s=[];for(let r of n){let c=r&&typeof r=="object"?r:{},a=c.advisory&&typeof c.advisory=="object"?c.advisory:{};Le(o,a.severity);let l=c.package&&typeof c.package=="object"?c.package:{},d=be({name:l.name,version:l.version,advisoryIds:[a.id,a.url],severities:[a.severity]});d&&s.push(d);}return {findingCount:n.length,severityCounts:o,subjects:he(s)}}function Yo(e){let t=Re(e);if(!t)return null;let i=t.advisories&&typeof t.advisories=="object"?t.advisories:{},n={...ke},o=0,s=[];for(let[r,c]of Object.entries(i)){let a=Array.isArray(c)?c:[c],l=be({name:r,advisoryIds:a.flatMap(d=>{let p=d&&typeof d=="object"?d:{};return [p.advisoryId,p.cve,p.link]}),severities:a.map(d=>(d&&typeof d=="object"?d:{}).severity)});l&&s.push(l);}return ot(i,r=>{(typeof r.advisoryId=="string"||typeof r.cve=="string")&&(o+=1,Le(n,r.severity));}),{findingCount:o,severityCounts:n,subjects:he(s)}}function Zo(e){let t=Re(e);if(!t)return null;let i={...ke},n=0,o=[];return ot(t,s=>{if(!Array.isArray(s.vulnerabilities))return;for(let c of s.vulnerabilities){let a=c&&typeof c=="object"?c:{};n+=1,Le(i,a.severity);}let r=be({name:s.id??s.name??s.packageId,version:s.resolvedVersion??s.version,direct:s.isTransitive===false,advisoryIds:s.vulnerabilities.flatMap(c=>{let a=c&&typeof c=="object"?c:{};return [a.advisoryurl,a.advisoryUrl,a.url]}),severities:s.vulnerabilities.map(c=>(c&&typeof c=="object"?c:{}).severity)});r&&o.push(r);}),{findingCount:n,severityCounts:i,subjects:he(o)}}function Xo(e){let t=Re(e);if(!t)return null;let i={...ke},n=new Set,o=[];return ot(t,s=>{let r=s.id??s.cve??s.advisory??s.url;if(typeof r!="string")return;n.add(r),Le(i,s.severity??s.criticality);let c=s.gem&&typeof s.gem=="object"?s.gem:{},a=be({name:c.name??s.gemName??s.name,version:c.version??s.version,advisoryIds:[r],severities:[s.severity??s.criticality]});a&&o.push(a);}),{findingCount:n.size,severityCounts:n.size>0&&it(i)===0?{...i,unknown:n.size}:i,subjects:he(o)}}function ai(e,t){let i=`${e}
15
15
  ${t}`.trim();if(!i)return null;let n=i.match(/(?:found|total:?)\s+(\d+)\s+vulnerabilit/i),o=/no (?:known )?vulnerabilit|no retired packages found|no insecure dependencies found/i.test(i);if(!n&&!o)return null;let s=n?Number(n[1]):0;return {findingCount:s,severityCounts:{...ke,unknown:s},subjects:[]}}function Qo(e,t,i){return e==="node"||e==="bun"?Vo(t):e==="python"?zo(t):e==="go"?Jo(t):e==="rust"?Uo(t):e==="php"?Yo(t):e==="dotnet"?Zo(t):e==="ruby"?Xo(t)??ai(t,i):e==="deno"||e==="elixir"?ai(t,i):null}async function er(e,t){return m.pathExists(u.join(e,t))}async function tr(e,t){if(t==="bun")return {ecosystem:"npm",tool:"bun audit",invocation:{cwd:e,executable:"bun",args:["audit","--json"]}};if(t==="node"){let i=a$e(e);if(i==="bun")return {ecosystem:"npm",tool:"bun audit",invocation:{cwd:e,executable:"bun",args:["audit","--json"]}};if(i==="pnpm")return {ecosystem:"npm",tool:"pnpm audit",invocation:{cwd:e,executable:"pnpm",args:["audit","--json"]}};if(i==="yarn"){let n=await er(e,".yarnrc.yml");return {ecosystem:"npm",tool:"yarn audit",invocation:{cwd:e,executable:"yarn",args:n?["npm","audit","--json","--severity","moderate"]:["audit","--json","--level","moderate"]}}}return {ecosystem:"npm",tool:"npm audit",invocation:{cwd:e,executable:"npm",args:["audit","--json"]}}}if(t==="deno")return {ecosystem:"deno",tool:"deno audit",invocation:{cwd:e,executable:"deno",args:["audit"]}};if(t==="python"){let i=u.join(e,".venv",process.platform==="win32"?"Scripts/python.exe":"bin/python");return {ecosystem:"PyPI",tool:"pip-audit",invocation:{cwd:e,executable:await m.pathExists(i)?i:process.platform==="win32"?"python":"python3",args:["-m","pip_audit","--format","json"]}}}return t==="go"?{ecosystem:"Go modules",tool:"govulncheck",invocation:{cwd:e,executable:"govulncheck",args:["-json","./..."]}}:t==="rust"?{ecosystem:"crates.io",tool:"cargo-audit",invocation:{cwd:e,executable:"cargo",args:["audit","--json"]}}:t==="php"?{ecosystem:"Packagist",tool:"Composer audit",invocation:{cwd:e,executable:"composer",args:["audit","--format=json"]}}:t==="ruby"?{ecosystem:"RubyGems",tool:"bundler-audit",invocation:{cwd:e,executable:"bundle-audit",args:["check","--format","json"]}}:t==="dotnet"?{ecosystem:"NuGet",tool:".NET package audit",invocation:{cwd:e,executable:"dotnet",args:["package","list","--vulnerable","--include-transitive","--format","json"]}}:t==="elixir"?{ecosystem:"Hex",tool:"mix hex.audit",invocation:{cwd:e,executable:"mix",args:["hex.audit"]}}:t==="java"?{ecosystem:"Maven/Gradle",tool:"OWASP Dependency-Check",unsupportedReason:"No universal zero-configuration Java vulnerability scanner is safe to invoke. Declare OWASP Dependency-Check or an organization-approved equivalent in the build."}:t==="scala"||t==="kotlin"?{ecosystem:"Maven/JVM",tool:"organization-selected JVM dependency scanner",unsupportedReason:"No universal zero-configuration JVM vulnerability scanner is safe to invoke. Declare an organization-approved scanner in the project build."}:t==="c"||t==="cpp"?{ecosystem:t==="c"?"C/native":"C++/native",tool:"organization-selected native dependency scanner",unsupportedReason:"Native dependency provenance depends on the build and package manager. Declare an organization-approved SBOM or vulnerability scanner in the project command contract."}:t==="clojure"?{ecosystem:"Clojars/Maven",tool:"organization-selected Clojure audit",unsupportedReason:"No portable Clojure vulnerability command is declared. Configure an organization-approved scanner and expose it through the project command contract."}:{ecosystem:"unknown",tool:"none",unsupportedReason:"Doctor could not determine a supported dependency ecosystem."}}function ci(e){let t=e&&typeof e=="object"?e:void 0,i=String(t?.code??""),n=String(t?.message??"");return i==="ENOENT"||/not found|is not recognized|no module named pip_audit/i.test(n)}async function nr(e){let t=new Date().toISOString(),i=await tr(e.projectPath,e.runtime),n={schemaVersion:"doctor-dependency-audit-v1",runtime:e.runtime,ecosystem:i.ecosystem,tool:i.tool,generatedAt:t,findingCount:null,blockingFindingCount:null,severityCounts:{...ke},subjects:[],limitations:["A clean result covers known advisories available to the selected runtime-native audit tool at execution time.","Doctor never treats a missing scanner, malformed output, registry failure, or timeout as a clean audit."]};if(!i.invocation)return {...n,status:"unsupported",reason:i.unsupportedReason??"No supported audit invocation is available."};try{let o=await execa(i.invocation.executable,i.invocation.args,{cwd:i.invocation.cwd,timeout:_o(),reject:false}),s=Qo(e.runtime,o.stdout,o.stderr);if(!s){let a=String(o.code??"")==="ENOENT"||/not found|no such (?:command|subcommand)|script not found|no module named pip_audit|unknown command|unrecognized (?:command|option)/i.test(`${o.stdout}
16
16
  ${o.stderr}
17
- ${o.shortMessage??""}`);return {...n,invocation:i.invocation,exitCode:o.exitCode,status:a?"tool-unavailable":"failed",reason:a?`${i.tool} is not installed or not supported by the detected runtime version.`:`${i.tool} did not produce parseable vulnerability evidence.`}}if(s.findingCount===0&&o.exitCode!==0)return {...n,invocation:i.invocation,exitCode:o.exitCode,status:"failed",reason:`${i.tool} emitted a clean-looking payload but exited with ${o.exitCode}; Doctor refuses to treat contradictory audit execution as healthy.`};if((e.runtime==="node"||e.runtime==="bun")&&s.remediation&&(s.remediation=await qo(e.projectPath,s.remediation),s.findingCount>0&&!s.remediation.compatibleFixAvailable)){let a=await Wo(e.projectPath,o.stdout);s.remediation.resolutionCandidates=a.length>0?a:ri(s.subjects);}let r=s.severityCounts.moderate+s.severityCounts.high+s.severityCounts.critical+s.severityCounts.unknown,c=s.remediation??(s.findingCount===0?{disposition:"not-needed",compatibleFixAvailable:false,breakingFixAvailable:false,candidates:[]}:{disposition:"unknown",compatibleFixAvailable:false,breakingFixAvailable:false,candidates:[],resolutionCandidates:ri(s.subjects)});return {...n,invocation:i.invocation,exitCode:o.exitCode,findingCount:s.findingCount,blockingFindingCount:r,severityCounts:s.severityCounts,subjects:s.subjects,remediation:c,status:s.findingCount>0?"vulnerable":"clean",reason:s.findingCount>0?`${i.tool} reported ${s.findingCount} known dependency vulnerability finding(s).`:`${i.tool} completed without known dependency vulnerability findings.`}}catch(o){return {...n,invocation:i.invocation,status:ci(o)?"tool-unavailable":"failed",reason:ci(o)?`${i.tool} is not installed or cannot be resolved from this project environment.`:`${i.tool} could not complete: ${o instanceof Error?o.message:String(o)}`}}}async function di(e){let t=await Bo(e.projectPath,e.runtime);e.fresh&&Te.delete(t);let i=Te.get(t);if(i)return i;let n=nr(e);for(Te.set(t,n);Te.size>To;){let o=Te.keys().next().value;if(!o)break;Te.delete(o);}try{return await n}catch(o){throw Te.delete(t),o}}var Qt="doctor-graph-diagnosis.v1";var fi="Graph paths identify evidence-backed structural reachability and verification candidates; they do not prove runtime causality or that every affected surface has been discovered.",pi={dependency:["package","module"],security:["package","module"],test:["test-suite"],quality:["file","symbol","module"],container:["container"],deployment:["deployment","container","environment"],environment:["environment"],configuration:["environment","file"],runtime:["service","container","deployment"],"workspace-contract":["project","service","api","endpoint"],"source-tree":["file","module","symbol"],framework:["service","project","package"],custom:["project"],unknown:["project"]},ir=new Set(["project","service","api","endpoint","schema","database","queue","container","deployment","pipeline","environment","document","decision","test-suite","owner"]),or=new Set(["test-suite","pipeline"]),st=new Map;async function rr(e,t){let[i,n]=await Promise.all([m.stat(e),m.stat(t)]),o=[e,i.size,i.mtimeMs,t,n.size,n.mtimeMs].join(":"),s=st.get(o);if(s)return s;st.size>=4&&st.clear();let r=(async()=>{let[c,a]=await Promise.all([m.readJSON(e),m.readJSON(t)]);a$6(c,"contracts/workspace-intelligence/workspace-knowledge-graph.v1.json","Doctor graph diagnosis source"),a$6(a,"contracts/workspace-intelligence/workspace-model.v1.json","Doctor graph diagnosis model");let l=c;return {graph:l,model:a,entitiesById:new Map(l.entities.map(d=>[d.id,d])),edges:cr(l)}})();st.set(o,r);try{return await r}catch(c){throw st.delete(o),c}}function Rt(e,t){if(!e)return ".";let i=u.relative(e,t).split(u.sep).join("/");return i&&!i.startsWith("../")?i:"."}function en(e){return {id:e.id,kind:e.kind,label:e.label,...e.projectId?{projectId:e.projectId}:{}}}function qe(e,t,i,n={artifact:a$7}){return {schemaVersion:Qt,generatedAt:(e.now??new Date).toISOString(),status:t,claimBoundary:fi,graph:n,project:{name:e.projectName,path:Rt(e.workspacePath,e.projectPath)},summary:{findingCount:0,rootEntityCount:0,affectedEntityCount:0,verificationTargetCount:0,proofPathCount:0,subjectCount:0,unresolvedSubjectCount:0,unknownCount:1},findings:[],diagnostics:[i]}}function sr(e,t){let i=Rt(t.workspacePath,t.projectPath).toLowerCase(),n=new Set([t.projectName,u.basename(t.projectPath),i].map(o=>o.trim().toLowerCase()).filter(Boolean));return e.entities.filter(o=>o.kind==="project").find(o=>[o.projectId,o.label,o.identity.key,...o.identity.aliases,typeof o.attributes.path=="string"?o.attributes.path:void 0].filter(r=>typeof r=="string").map(r=>r.toLowerCase()).some(r=>n.has(r)||n.has(u.basename(r))))}function ar(e,t){let i=t.projectId??t.label,n=e.entities.filter(r=>r.id===t.id||r.projectId===i||r.projectId===t.projectId),o=new Set(n.map(r=>r.id)),s=new Set;for(let r of e.relations)o.has(r.from)&&s.add(r.to),o.has(r.to)&&s.add(r.from);return e.entities.filter(r=>o.has(r.id)||s.has(r.id))}function cr(e){let t=new Map,i=(n,o)=>{let s=t.get(n)??[];s.push(o),t.set(n,s);};for(let n of e.relations)i(n.from,n.to),i(n.to,n.from);for(let n of t.values())n.sort();return t}function lr(e,t,i){let n=new Set(t),o=t.map(s=>({id:s,depth:0}));for(let s=0;s<o.length;s+=1){let r=o[s];if(!(!r||r.depth>=i))for(let c of e.get(r.id)??[])n.has(c)||(n.add(c),o.push({id:c,depth:r.depth+1}));}return [...n]}function ui(e){let t=["name","specifier","package","module"].flatMap(i=>{let n=e.attributes[i];return Array.isArray(n)?n:[n]});return new Set([e.label,...e.identity.aliases,...t].filter(i=>typeof i=="string").map(i=>i.trim().toLowerCase()).filter(Boolean))}function mi(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g," ").replace(/\s+/g," ").trim()}function dr(e,t){let i=mi(e);return i?t.some(n=>{let o=mi(n.reason);return o===i||o.includes(i)||i.includes(o)}):true}function pr(e,t,i,n){let o=pi[i]??pi.unknown,s=[...new Set(n.map(c=>c.trim().toLowerCase()).filter(Boolean))];if(s.length>0){let c=t.filter(l=>o?.includes(l.kind)&&s.some(d=>ui(l).has(d))),a=new Set(s.filter(l=>c.some(d=>ui(d).has(l))));return {roots:c.length>0?c.slice(0,4):[e],unresolvedSubjects:n.filter(l=>!a.has(l.trim().toLowerCase()))}}let r=t.filter(c=>o?.includes(c.kind)).slice(0,4);return {roots:r.length>0?r:[e],unresolvedSubjects:[]}}function ur(e,t,i,n){let o=n.issueClass??"unknown",s=[...new Set((n.subjects??[]).map(h=>h.trim()).filter(Boolean))],{roots:r,unresolvedSubjects:c}=pr(t,i.scoped,o,s),a=lr(i.edges,r.map(h=>h.id),3).map(h=>i.entitiesById.get(h)).filter(h=>!!h),l=a.filter(h=>i.scopedIds.has(h.id)&&!r.some(w=>w.id===h.id)&&ir.has(h.kind)).slice(0,6),d=a.filter(h=>i.scopedIds.has(h.id)&&or.has(h.kind)).slice(0,2),y=[...l,...d].filter((h,w,P)=>P.findIndex(R=>R.id===h.id)===w).slice(0,3).flatMap(h=>{let P=r.map(R=>d$1(e,R.id,h.id)).filter(R=>R.found).sort((R,x)=>R.hops.length-x.hops.length)[0];return P?[{from:P.resolvedFrom??P.from,to:P.resolvedTo??P.to,entityPath:P.entityPath,hops:P.hops,proofIds:P.proofs.map(R=>R.id)}]:[]}),b=new Set([...r.flatMap(h=>h.proofIds),...y.flatMap(h=>h.proofIds)]),v=e.proofs.filter(h=>b.has(h.id)).map(h=>h.artifact).filter(h=>i.projectRelativePath==="."?true:h.split(u.sep).join("/").replace(/^\.\//,"").startsWith(`${i.projectRelativePath}/`)).filter((h,w,P)=>P.indexOf(h)===w).sort().slice(0,4),C=[];return l.length===0&&C.push("No affected surface is structurally reachable from the selected root evidence."),d.length===0&&C.push("No graph-connected test suite or pipeline is available as a verification target."),v.length===0&&C.push("The selected graph entities do not carry portable source evidence."),c.length>0&&C.push(`No canonical graph entity resolved for ${c.length} reported subject(s): ${c.join(", ")}.`),{issueId:n.id,issueClass:o,status:n.status==="fail"?"fail":"warn",reason:n.reason,scope:"structural-impact-candidates",subjects:s,unresolvedSubjects:c,rootEntities:r.map(en),affectedEntities:l.map(en),verificationTargets:d.map(en),proofPaths:y,sourceArtifacts:v,unknowns:C}}async function tn(e){if(!e.workspacePath)return qe(e,"graph-missing","Project is not attached to a Workspai workspace; no workspace graph can be consulted.");let t=u.join(e.workspacePath,a$7),i=u.join(e.workspacePath,p.model);if(!await m.pathExists(t))return qe(e,"graph-missing","Workspace knowledge graph is missing. Run workspace model before relying on graph-aware diagnosis.");if(!await m.pathExists(i))return qe(e,"model-missing","Canonical workspace model is missing, so graph source binding cannot be verified.");let n,o,s,r;try{({graph:n,model:o,entitiesById:s,edges:r}=await rr(t,i));}catch(b){return qe(e,"invalid",`Graph-aware diagnosis rejected invalid evidence: ${b instanceof Error?b.message:String(b)}`)}let c={artifact:a$7,schemaVersion:n.schemaVersion,sourceArtifact:n.source.artifact,sourceHash:n.source.hash,entityCount:n.entities.length,relationCount:n.relations.length,proofCount:n.proofs.length};try{b$2(n,o);}catch(b){return qe(e,"stale",b instanceof Error?b.message:String(b),c)}let a=sr(n,e);if(!a)return qe(e,"project-unresolved","The current project could not be resolved to one canonical project entity.",c);let l=ar(n,a),d={scoped:l,scopedIds:new Set(l.map(b=>b.id)),entitiesById:s,edges:r,projectRelativePath:Rt(e.workspacePath,e.projectPath)},p$1=(e.probes??[]).filter(b=>b.status!=="pass"),y=[...p$1,...(e.issues??[]).filter(b=>!dr(b,p$1)).map((b,v)=>({id:`legacy-project-issue-${v+1}`,status:"fail",reason:b,issueClass:"runtime"}))].map(b=>ur(n,a,d,b));return {schemaVersion:Qt,generatedAt:(e.now??new Date).toISOString(),status:"available",claimBoundary:fi,graph:c,project:{name:e.projectName,path:Rt(e.workspacePath,e.projectPath),entityId:a.id},summary:{findingCount:y.length,rootEntityCount:new Set(y.flatMap(b=>b.rootEntities.map(v=>v.id))).size,affectedEntityCount:new Set(y.flatMap(b=>b.affectedEntities.map(v=>v.id))).size,verificationTargetCount:new Set(y.flatMap(b=>b.verificationTargets.map(v=>v.id))).size,proofPathCount:y.reduce((b,v)=>b+v.proofPaths.length,0),subjectCount:new Set(y.flatMap(b=>b.subjects)).size,unresolvedSubjectCount:new Set(y.flatMap(b=>b.unresolvedSubjects)).size,unknownCount:y.reduce((b,v)=>b+v.unknowns.length,0)},findings:y,diagnostics:[]}}var St="workspai.doctor-summary.v1";function yi(e){let t=e.trim().match(/^(?:Python\s+)?(\d+(?:\.\d+){0,3})/i);return t?{raw:t[1],parts:t[1].split(".").map(i=>Number.parseInt(i,10))}:null}function gi(e,t){let i=Math.max(e.length,t.length);for(let n=0;n<i;n+=1){let o=(e[n]??0)-(t[n]??0);if(o!==0)return o<0?-1:1}return 0}function mr(e,t){return t.replace(/\.\*$/u,"").split(".").map(n=>Number.parseInt(n,10)).every((n,o)=>e[o]===n)}function fr(e){if(e.length<=2)return [(e[0]??0)+1];let t=e.slice(0,-1);return t[t.length-1]=(t[t.length-1]??0)+1,t}function gr(e,t){let i=t.trim().match(/^(===|~=|==|!=|>=|<=|>|<)\s*(.+)$/u);if(!i)return null;let[,n,o]=i;if((n==="=="||n==="!=")&&/\.\*$/u.test(o)){let c=mr(e.parts,o);return n==="=="?c:!c}let s=yi(o);if(!s)return null;let r=gi(e.parts,s.parts);return n==="==="?e.raw===s.raw:n==="=="?r===0:n==="!="?r!==0:n===">="?r>=0:n==="<="?r<=0:n===">"?r>0:n==="<"?r<0:n==="~="?r>=0&&gi(e.parts,fr(s.parts))<0:null}function hi(e,t){let i=yi(e),n=t.trim(),o=n.replace(/^\(|\)$/gu,"").split(",").map(c=>c.trim()).filter(Boolean);if(!i||o.length===0)return {version:i?.raw??e.trim(),specifier:n,satisfied:null,unsupportedSpecifiers:o.length===0?[n]:o};let s=o.map(c=>({clause:c,result:gr(i,c)})),r=s.filter(c=>c.result===null).map(c=>c.clause);return {version:i.raw,specifier:n,satisfied:r.length>0?null:s.every(c=>c.result===true),unsupportedSpecifiers:r}}function bi(e){return u.win32.normalize(e.trim()).replace(/\\/g,"/").toLowerCase()}function ki(e,t){return bi(u.win32.dirname(e))===bi(t)&&/^workspai(?:\.cmd|\.exe|\.ps1)?$/i.test(u.win32.basename(e))}async function yr(){let e=await execa("where.exe",["workspai"],{reject:false,timeout:5e3,windowsHide:true});return e.exitCode!==0?[]:e.stdout.split(/\r?\n/).map(t=>t.trim()).filter(Boolean)}async function hr(){let e=process.env.npm_config_prefix?.trim();if(e)return e;let t=await execa("npm",["prefix","--global"],{reject:false,timeout:5e3,windowsHide:true});if(t.exitCode===0)return t.stdout.trim()||void 0}async function wi(e={}){if((e.platform??process.platform)!=="win32")return {status:"ok",applicability:"not-applicable",command:"workspai",resolutionStatus:"not-applicable",candidates:[],message:"Windows PATH resolution check is not applicable on this host."};let[i,n]=await Promise.allSettled([(e.resolveCandidates??yr)(),(e.resolveNpmGlobalPrefix??hr)()]);if(i.status==="rejected")return {status:"warn",applicability:"applicable",command:"workspai",resolutionStatus:"unverified",candidates:[],message:"Windows PATH resolution could not be inspected.",details:"The bounded `where.exe workspai` probe failed. Retry Doctor from a standard Windows shell or use `npx --yes workspai <command>`."};let o=i.value,s=n.status==="fulfilled"?n.value:void 0,r=[...new Set(o.map(d=>d.trim()).filter(Boolean))],c=r.map((d,p)=>({location:p===0?"Active PATH match":"Additional PATH match",path:d}));if(r.length===0)return {status:"warn",applicability:"applicable",command:"workspai",resolutionStatus:"unresolved",candidates:r,...s?{npmGlobalPrefix:s}:{},message:"`workspai` is not resolvable from Windows PATH.",details:"Add the npm global prefix to PATH, or use `npx --yes workspai <command>` while repairing the host configuration."};let a=r[0];if(!s)return {status:"warn",applicability:"applicable",command:"workspai",resolutionStatus:"unverified",activePath:a,candidates:r,paths:c,message:"The active `workspai` PATH target could not be verified against npm.",details:"Run `npm prefix --global`, then ensure that directory precedes conflicting command locations in PATH."};let l=r.find(d=>ki(d,s));return ki(a,s)?{status:"ok",applicability:"applicable",command:"workspai",resolutionStatus:"canonical",activePath:a,npmGlobalPrefix:s,candidates:r,paths:c,message:"`workspai` resolves to the npm global shim.",...r.length>1?{details:"Additional PATH matches exist, but the npm global shim has precedence."}:{}}:{status:"warn",applicability:"applicable",command:"workspai",resolutionStatus:"shadowed",activePath:a,npmGlobalPrefix:s,candidates:r,paths:c,message:"Another executable shadows the npm global `workspai` shim.",details:l?`Move ${s} before ${u.win32.dirname(a)} in PATH. Until then, use \`npx --yes workspai <command>\`.`:`Add ${s} to PATH before ${u.win32.dirname(a)}. Until then, use \`npx --yes workspai <command>\`.`}}var sn=p.doctor;function Ii(e){return [...new Set(e.filter(t=>t&&t.trim().length>0))]}function ji(e){return [...new Set(e.filter(t=>t&&t.trim().length>0))]}function Ni(){let e=t$2().map(n=>u.join(n,b$5()?"poetry.exe":"poetry")),t=b$5()?[u.join(process.env.APPDATA||"","Python","Scripts","poetry.exe"),u.join(process.env.USERPROFILE||"","AppData","Roaming","Python","Scripts","poetry.exe")]:[],i=b$5()?[]:["/usr/local/bin/poetry","/usr/bin/poetry"];return Ii([...e,...t,...i])}function br(e,t=process.cwd()){let i=t$2().map(l=>({location:"Global (user-local)",path:u.join(l,b$5()?"rapidkit.exe":"rapidkit")})),n$1=[{location:"Global (pipx)",path:u.join(e,".local","bin","rapidkit")},{location:"Global (pipx)",path:u.join(e,"AppData","Roaming","Python","Scripts","rapidkit.exe")},{location:"Global (pyenv)",path:u.join(e,".pyenv","shims","rapidkit")},{location:"Global (system)",path:"/usr/local/bin/rapidkit"},{location:"Global (system)",path:"/usr/bin/rapidkit"}],o=n(u.join(t,".venv")),s=p$1(t),r=[{location:"Workspace (.venv)",path:o},...s.map(l=>({location:"Workspace (launcher)",path:l}))],c=[...i,...n$1,...r],a=new Set;return c.filter(l=>a.has(l.path)?false:(a.add(l.path),true))}function kr(e){let t=new Map([["Workspace (.venv)",0],["Global (user-local)",1],["Global (pipx)",2],["Global (pyenv)",3],["Global (system)",4]]);return [...e].sort((i,n)=>{let o=t.get(i.location)??Number.MAX_SAFE_INTEGER,s=t.get(n.location)??Number.MAX_SAFE_INTEGER;return o!==s?o-s:i.path.localeCompare(n.path)})}function ct(e,t){let i=[e.details,t].filter(n=>typeof n=="string"&&n.trim().length>0).join(" ");return {...e,status:e.status==="error"?"warn":e.status,applicability:"not-applicable",...i?{details:i}:{}}}function Mi(e,t){let i=t.some(c=>c.runtimeFamily==="python"),n=t.some(c=>c.runtimeFamily==="go"),o=t.find(c=>c.pythonRequirement?.satisfied===false),s=t.find(c=>c.pythonRequirement?.satisfied===null),r=o?.pythonRequirement?{...e.python,status:"error",message:`Python ${o.pythonRequirement.detectedVersion??"unknown"} does not satisfy ${o.pythonRequirement.specifier}`,details:`Project ${o.name} declares requires-python ${o.pythonRequirement.specifier}.`}:s?.pythonRequirement?{...e.python,status:e.python.status==="error"?"error":"warn",details:`Project ${s.name} declares requires-python ${s.pythonRequirement.specifier}, but compatibility could not be evaluated.`}:e.python;return {...e,python:i?r:ct(e.python,"Python is optional because this scope has no detected Python project."),poetry:i?e.poetry:ct(e.poetry,"Poetry is not applicable to this project scope."),pipx:i?e.pipx:ct(e.pipx,"pipx is not applicable to this project scope."),go:n?e.go:ct(e.go,"Go is not applicable to this project scope."),rapidkitCore:/not installed/i.test(e.rapidkitCore.message)||!i&&e.rapidkitCore.status!=="error"?ct(e.rapidkitCore,"RapidKit Core is an optional engine for Python-backed kits and modules; Workspai CLI diagnostics remain available without it."):e.rapidkitCore}}function vr(e){let i=(e.probes??[]).filter(r=>r.status==="warn").length,n=e.issues.some(r=>r.toLowerCase().includes("environment file missing")),o=(e.probes??[]).some(r=>r.id==="surface-env-contract"),s=(e.probes??[]).some(r=>r.id==="surface-security-hygiene");return e.hasEnvFile===false&&!n&&!o&&(i+=1),typeof e.vulnerabilities=="number"&&e.vulnerabilities>0&&!s&&(i+=1),i}function wr(e){let t=e.coreVersion?.split(".")[0],i=e.npmVersion?.split(".")[0];return !t||!i?false:t!==i}var jr="doctor-project-scan-v2",xr="doctor-project-scan-policy-v4",Ti=s.doctorWorkspaceCache.schemaVersion,Cr=Object.freeze({version:"doctor-evidence-v1",scoringPolicyVersion:"doctor-score-policy-v2",generatedBy:"workspai",deterministicScoreBreakdown:true,scopeModel:"workspace-aggregate-or-project-scoped"}),lt=Object.freeze({local:{name:"local",exitOnErrors:true,exitOnWarnings:false,warningExitCode:0,advisoryWarningsBlockRelease:false,description:"Local diagnostics: report warnings without blocking the developer loop."},ci:{name:"ci",exitOnErrors:true,exitOnWarnings:true,warningExitCode:2,advisoryWarningsBlockRelease:false,description:"CI diagnostics: errors fail, warnings return a distinct warning exit code."},release:{name:"release",exitOnErrors:true,exitOnWarnings:true,warningExitCode:1,advisoryWarningsBlockRelease:true,description:"Release gate: any warning/error blocks release readiness."},"enterprise-strict":{name:"enterprise-strict",exitOnErrors:true,exitOnWarnings:true,warningExitCode:1,advisoryWarningsBlockRelease:true,description:"Enterprise strict gate: all warnings/errors block release and must carry evidence or repair guidance."}});function Ue(){return {...Cr}}function Nt(e){let t=e.profile?.trim();return t&&t in lt?{...lt[t]}:e.strict?{...lt.release}:e.ci?{...lt.ci}:{...lt.local}}function Ft(e){return !e||e.total<=0?null:Math.round(e.passed/e.total*100)}function Pr(e){return e.id==="surface-security-hygiene"&&/vulnerabilit/i.test(`${e.reason} ${e.recommendation??""}`)?{category:"state",ttlSeconds:300,reason:"Dependency vulnerability evidence is live state and must be refreshed before release use."}:e.id.includes("script")||e.id.includes("test")||e.id.includes("quality")||e.id.includes("format")||e.id.includes("runtime")||e.id.includes("lockfile")?{category:"verification",ttlSeconds:1440*60,reason:"Verification/tooling evidence can drift with dependency and config changes; refresh daily or before release."}:e.id.includes("dependency")||e.id.includes("env")||e.id.includes("container")||e.id.includes("docker")||e.id.includes("deploy")||e.id.includes("kubernetes")||e.id.includes("source-tree")||e.id.includes("framework")||e.id.includes("typescript")?{category:"structure",ttlSeconds:10080*60,reason:"Structural workspace/project evidence is durable but should be refreshed when files or manifests change."}:{category:"verification",ttlSeconds:1440*60,reason:"Default Doctor evidence freshness contract for project-scoped verification."}}function Dr(e,t){let i=Pr(e),n=Date.parse(t),o=typeof i.ttlSeconds=="number"?i.ttlSeconds*1e3:null,s=o!==null&&Number.isFinite(n)?new Date(n+o).toISOString():void 0,r=!Number.isFinite(n)||o!==null&&!s?"unknown":o!==null&&Date.now()>n+o?"stale":"fresh";return {category:i.category,generatedAt:t,ttlSeconds:i.ttlSeconds,...s?{expiresAt:s}:{},status:r,verifyBeforeUse:i.category!=="structure"||r!=="fresh",reason:i.reason}}function Rr(e){let t=e.id.toLowerCase(),i=`${e.label} ${e.reason} ${e.recommendation??""}`.toLowerCase();return t.includes("dependency")||t.includes("lockfile")||i.includes("lockfile")?"dependency":t.includes("security")||i.includes("vulnerabilit")||i.includes("audit")?"security":t.includes("env")||i.includes(".env")||i.includes("environment")?"environment":t.includes("test")?"test":t.includes("quality")||t.includes("format")||t.includes("lint")?"quality":t.includes("docker")||t.includes("container")?"container":t.includes("deploy")||t.includes("kubernetes")?"deployment":t.includes("migration")||t.includes("database")?"configuration":t.includes("runtime")?"runtime":t.includes("contract")?"workspace-contract":t.includes("source-tree")?"source-tree":t.includes("framework")||t.includes("typescript")?"framework":t.includes("custom")?"custom":t.includes("script")||t.includes("config")?"configuration":"unknown"}function Oi(e){let t=e.dependencyAudit?.subjects.map(i=>i.name)??[];return (e.probes??[]).map(i=>({...i,...i.id==="surface-security-hygiene"&&t.length>0?{subjects:t}:{}}))}function Sr(e,t){return e.status==="pass"?"none":t==="security"?"security-risk":t==="deployment"||t==="runtime"?"runtime-risk":t==="dependency"||t==="test"||t==="quality"||t==="workspace-contract"?e.severity==="error"||e.status==="fail"?"release-risk":"ci-risk":t==="container"||t==="environment"?"release-risk":"developer-friction"}function Er(e){let{probe:t,freshness:i}=e,n=t.repairCapability;if(t.status==="pass")return {mode:"none",confidence:"high",primaryActionLabel:"No action required",requiresApproval:false,requiresFreshEvidence:false,reason:"Probe is passing.",relatedCommands:[]};if(i.status!=="fresh")return {mode:"refresh-evidence",confidence:"high",primaryActionLabel:"Refresh evidence",requiresApproval:false,requiresFreshEvidence:true,reason:`Evidence is ${i.status}; refresh Doctor before applying repairs.`,relatedCommands:["npx workspai doctor project --json"]};if(n?.status==="manual"||n?.requiresReview)return {mode:"review-required",confidence:"medium",primaryActionLabel:"Review fix path",requiresApproval:true,requiresFreshEvidence:i.verifyBeforeUse,reason:n?.reason??t.recommendation??t.reason,relatedCommands:ji(n?.refreshCommands??["npx workspai doctor project --json"])};if(i.verifyBeforeUse&&i.category==="state")return {mode:"verify-before-fix",confidence:"high",primaryActionLabel:"Verify live state",requiresApproval:false,requiresFreshEvidence:true,reason:"Live state evidence must be re-read before Studio claims a fix path.",relatedCommands:["npx workspai doctor project --json"]};if(n?.status==="available"&&n.canAutoFix){let o=n.canEditFiles;return {mode:o?"edit-file":"run-command",confidence:"high",primaryActionLabel:o?"Apply file fix":"Run fix command",requiresApproval:n.requiresApproval,requiresFreshEvidence:i.verifyBeforeUse,reason:n.reason,relatedCommands:ji([...n.command?[n.command]:[],...n.verifyCommand?[n.verifyCommand]:[],...n.refreshCommands])}}return t.recommendation?{mode:"manual-guidance",confidence:"medium",primaryActionLabel:"Inspect guidance",requiresApproval:false,requiresFreshEvidence:i.verifyBeforeUse,reason:t.recommendation,relatedCommands:["npx workspai doctor project --json"]}:{mode:"manual-guidance",confidence:"low",primaryActionLabel:"Inspect issue",requiresApproval:false,requiresFreshEvidence:i.verifyBeforeUse,reason:"Doctor classified the issue but does not have a deterministic repair path yet.",relatedCommands:["npx workspai doctor project --json"]}}function ln(e,t){let i=Dr(e,e.freshness?.generatedAt??t),n=e.issueClass??Rr(e),o=e.operationalImpact??Sr(e,n),s=Er({probe:e,freshness:i});return {...e,freshness:i,issueClass:n,operationalImpact:o,repairIntent:s}}function Ar(e,t){Array.isArray(e.probes)&&(e.probes=e.probes.map(i=>ln(i,t)));}function Fr(e){e.diagnosis=a$a({projectName:e.name,projectPath:e.path,runtimeFamily:e.runtimeFamily,runtimeFamilies:e.runtimeFamilies,framework:e.framework,projectKind:e.projectKind,projectArchetype:e.projectArchetype,probes:e.probes??[],legacyIssues:e.issues,dependencySubjects:e.dependencyAudit?.subjects});}function $t(e,t=new Date().toISOString()){Ar(e,t),Gr(e,e.path),Fr(e);}function _i(e){if(!e.diagnosis||e.graphDiagnosis?.status!=="available")return;let t=new Map(e.graphDiagnosis.findings.map(i=>[i.issueId,i]));for(let i of e.diagnosis.findings){let n=t.get(i.probeId);if(!n)continue;let o=[{kind:"graph",role:"impact",ref:`doctor-graph:${e.name}:${n.issueId}`,claim:`Canonical graph diagnosis retained ${n.proofPaths.length} bounded proof path(s), ${n.affectedEntities.length} affected candidate(s), and ${n.verificationTargets.length} verification target(s); structural reachability is not runtime causality.`}],s=new Set(i.proofs.map(r=>`${r.kind}:${r.role}:${r.ref}`));for(let r of o){let c=`${r.kind}:${r.role}:${r.ref}`;s.has(c)||i.proofs.push(r);}}}function dn(e,t){let i=e.flatMap(a=>Array.isArray(a.probes)?a.probes.map(l=>l.freshness).filter(l=>!!l):[]),n=i.filter(a=>a.status==="stale").length,o=i.filter(a=>a.status==="unknown").length,s=i.filter(a=>a.category==="state").length,r=i.filter(a=>a.verifyBeforeUse).length,c=i.map(a=>a.generatedAt).filter(Boolean).sort()[0];return {generatedAt:t,status:n>0?"stale":o>0?"unknown":"fresh",staleProbeCount:n,unknownProbeCount:o,liveStateProbeCount:s,verifyBeforeUseProbeCount:r,...c?{oldestProbeGeneratedAt:c}:{}}}function Bi(e){return typeof e=="number"?e:Array.isArray(e)?e.length:0}async function Gi(e,t){try{if(!await m.pathExists(e))return null;let i=await m.readJSON(e);return c$3(i,t)?i:null}catch{return null}}function Ki(e,t){if(!e?.system)return [];let i=[{id:"python",current:t.python},{id:"poetry",current:t.poetry},{id:"pipx",current:t.pipx},{id:"go",current:t.go},{id:"rapidkitCore",current:t.rapidkitCore},{id:"cliResolution",current:t.cliResolution}],n=[];for(let o of i){let s=e.system?.[o.id]?.status;!s||s===o.current.status||n.push({id:o.id,from:s,to:o.current.status});}return n}function $r(e,t){let i=new Map;for(let y of t.projects)i.set(y.path||y.name,y.issues.length);if(!e)return {baselineAvailable:false,newIssueCount:0,resolvedIssueCount:0,netIssueDelta:0,scoreDeltaPercent:null,systemStatusChanges:[],regressedProjects:[],improvedProjects:[]};let n=Array.isArray(e.projects)?e.projects:[],o=new Map;for(let y of n){let b=y.path||y.name;b&&o.set(b,Bi(y.issues));}let s=0,r=0,c=new Set,a=new Set,l=new Set([...Array.from(o.keys()),...Array.from(i.keys())]);for(let y of l){let b=o.get(y)??0,v=i.get(y)??0;v>b?(s+=v-b,c.add(y)):v<b&&(r+=b-v,a.add(y));}let d=Ft(e.healthScore),p=Ft(t.healthScore);return {baselineAvailable:true,previousGeneratedAt:e.generatedAt,newIssueCount:s,resolvedIssueCount:r,netIssueDelta:s-r,scoreDeltaPercent:d===null||p===null?null:p-d,systemStatusChanges:Ki(e,{python:t.python,poetry:t.poetry,pipx:t.pipx,go:t.go,rapidkitCore:t.rapidkitCore,cliResolution:t.cliResolution}),regressedProjects:Array.from(c).sort(),improvedProjects:Array.from(a).sort()}}function Ir(e,t){if(!e)return {baselineAvailable:false,newIssueCount:0,resolvedIssueCount:0,netIssueDelta:0,scoreDeltaPercent:null,systemStatusChanges:[],regressedProjects:[],improvedProjects:[]};let i=Bi(e.project?.issues),n=t.project.issues.length,o=Math.max(n-i,0),s=Math.max(i-n,0),r=Ft(e.healthScore),c=Ft(t.healthScore),a=t.project.path||t.project.name;return {baselineAvailable:true,previousGeneratedAt:e.generatedAt,newIssueCount:o,resolvedIssueCount:s,netIssueDelta:o-s,scoreDeltaPercent:r===null||c===null?null:c-r,systemStatusChanges:Ki(e,{python:t.python,poetry:t.poetry,pipx:t.pipx,go:t.go,rapidkitCore:t.rapidkitCore,cliResolution:t.cliResolution}),regressedProjects:o>0?[a]:[],improvedProjects:s>0?[a]:[]}}function Wi(e){let t=e??[],i=0,n=0;for(let r of t){if(r.scope==="project-scoped"){i+=1;continue}(r.scope==="workspace-aggregate"||r.scope==="host-system")&&(n+=1);}let o=i>0&&n>0?1:0,s=o>0?"mixed":i>0?"scoped":n>0?"aggregated":"unknown";return {scopedCount:i,aggregatedCount:n,mixedCount:o,dominantScope:s}}function Q(e,t){return b$5()?`Set-Location -LiteralPath "${e.replace(/"/g,'`"')}"; ${t}`:`cd '${e.replace(/'/g,`'"'"'`)}' && ${t}`}function Nr(e){return e.manager==="project-script"&&e.projectScript?Q(e.projectPath,e.projectScript):e.manager==="poetry"?Q(e.projectPath,"poetry install --no-root"):e.manager==="uv"?Q(e.projectPath,"uv sync"):Q(e.projectPath,b$5()?"py -3 -m venv .venv":"python3 -m venv .venv")}async function Mr(e){let t=b$5()?["script/setup.cmd","script/setup.ps1","scripts/setup.cmd","scripts/setup.ps1","script/setup","scripts/setup","bin/setup"]:["script/setup","scripts/setup","bin/setup"];for(let i of t)if(await m.pathExists(u.join(e,i)))return i}async function Tr(e){let t=e?[e]:j$1();for(let i of t)try{let o=await execa(i,i==="py"?["-3","--version"]:["--version"],{timeout:3e3,reject:false}),s=`${o.stdout??""}
17
+ ${o.shortMessage??""}`);return {...n,invocation:i.invocation,exitCode:o.exitCode,status:a?"tool-unavailable":"failed",reason:a?`${i.tool} is not installed or not supported by the detected runtime version.`:`${i.tool} did not produce parseable vulnerability evidence.`}}if(s.findingCount===0&&o.exitCode!==0)return {...n,invocation:i.invocation,exitCode:o.exitCode,status:"failed",reason:`${i.tool} emitted a clean-looking payload but exited with ${o.exitCode}; Doctor refuses to treat contradictory audit execution as healthy.`};if((e.runtime==="node"||e.runtime==="bun")&&s.remediation&&(s.remediation=await qo(e.projectPath,s.remediation),s.findingCount>0&&!s.remediation.compatibleFixAvailable)){let a=await Wo(e.projectPath,o.stdout);s.remediation.resolutionCandidates=a.length>0?a:ri(s.subjects);}let r=s.severityCounts.moderate+s.severityCounts.high+s.severityCounts.critical+s.severityCounts.unknown,c=s.remediation??(s.findingCount===0?{disposition:"not-needed",compatibleFixAvailable:false,breakingFixAvailable:false,candidates:[]}:{disposition:"unknown",compatibleFixAvailable:false,breakingFixAvailable:false,candidates:[],resolutionCandidates:ri(s.subjects)});return {...n,invocation:i.invocation,exitCode:o.exitCode,findingCount:s.findingCount,blockingFindingCount:r,severityCounts:s.severityCounts,subjects:s.subjects,remediation:c,status:s.findingCount>0?"vulnerable":"clean",reason:s.findingCount>0?`${i.tool} reported ${s.findingCount} known dependency vulnerability finding(s).`:`${i.tool} completed without known dependency vulnerability findings.`}}catch(o){return {...n,invocation:i.invocation,status:ci(o)?"tool-unavailable":"failed",reason:ci(o)?`${i.tool} is not installed or cannot be resolved from this project environment.`:`${i.tool} could not complete: ${o instanceof Error?o.message:String(o)}`}}}async function di(e){let t=await Bo(e.projectPath,e.runtime);e.fresh&&Te.delete(t);let i=Te.get(t);if(i)return i;let n=nr(e);for(Te.set(t,n);Te.size>To;){let o=Te.keys().next().value;if(!o)break;Te.delete(o);}try{return await n}catch(o){throw Te.delete(t),o}}var Qt="doctor-graph-diagnosis.v1";var fi="Graph paths identify evidence-backed structural reachability and verification candidates; they do not prove runtime causality or that every affected surface has been discovered.",pi={dependency:["package","module"],security:["package","module"],test:["test-suite"],quality:["file","symbol","module"],container:["container"],deployment:["deployment","container","environment"],environment:["environment"],configuration:["environment","file"],runtime:["service","container","deployment"],"workspace-contract":["project","service","api","endpoint"],"source-tree":["file","module","symbol"],framework:["service","project","package"],custom:["project"],unknown:["project"]},ir=new Set(["project","service","api","endpoint","schema","database","queue","container","deployment","pipeline","environment","document","decision","test-suite","owner"]),or=new Set(["test-suite","pipeline"]),st=new Map;async function rr(e,t){let[i,n]=await Promise.all([m.stat(e),m.stat(t)]),o=[e,i.size,i.mtimeMs,t,n.size,n.mtimeMs].join(":"),s=st.get(o);if(s)return s;st.size>=4&&st.clear();let r=(async()=>{let[c,a]=await Promise.all([m.readJSON(e),m.readJSON(t)]);a$6(c,"contracts/workspace-intelligence/workspace-knowledge-graph.v1.json","Doctor graph diagnosis source"),a$6(a,"contracts/workspace-intelligence/workspace-model.v1.json","Doctor graph diagnosis model");let l=c;return {graph:l,model:a,entitiesById:new Map(l.entities.map(d=>[d.id,d])),edges:cr(l)}})();st.set(o,r);try{return await r}catch(c){throw st.delete(o),c}}function Rt(e,t){if(!e)return ".";let i=u.relative(e,t).split(u.sep).join("/");return i&&!i.startsWith("../")?i:"."}function en(e){return {id:e.id,kind:e.kind,label:e.label,...e.projectId?{projectId:e.projectId}:{}}}function qe(e,t,i,n={artifact:a$7}){return {schemaVersion:Qt,generatedAt:(e.now??new Date).toISOString(),status:t,claimBoundary:fi,graph:n,project:{name:e.projectName,path:Rt(e.workspacePath,e.projectPath)},summary:{findingCount:0,rootEntityCount:0,affectedEntityCount:0,verificationTargetCount:0,proofPathCount:0,subjectCount:0,unresolvedSubjectCount:0,unknownCount:1},findings:[],diagnostics:[i]}}function sr(e,t){let i=Rt(t.workspacePath,t.projectPath).toLowerCase(),n=new Set([t.projectName,u.basename(t.projectPath),i].map(o=>o.trim().toLowerCase()).filter(Boolean));return e.entities.filter(o=>o.kind==="project").find(o=>[o.projectId,o.label,o.identity.key,...o.identity.aliases,typeof o.attributes.path=="string"?o.attributes.path:void 0].filter(r=>typeof r=="string").map(r=>r.toLowerCase()).some(r=>n.has(r)||n.has(u.basename(r))))}function ar(e,t){let i=t.projectId??t.label,n=e.entities.filter(r=>r.id===t.id||r.projectId===i||r.projectId===t.projectId),o=new Set(n.map(r=>r.id)),s=new Set;for(let r of e.relations)o.has(r.from)&&s.add(r.to),o.has(r.to)&&s.add(r.from);return e.entities.filter(r=>o.has(r.id)||s.has(r.id))}function cr(e){let t=new Map,i=(n,o)=>{let s=t.get(n)??[];s.push(o),t.set(n,s);};for(let n of e.relations)i(n.from,n.to),i(n.to,n.from);for(let n of t.values())n.sort();return t}function lr(e,t,i){let n=new Set(t),o=t.map(s=>({id:s,depth:0}));for(let s=0;s<o.length;s+=1){let r=o[s];if(!(!r||r.depth>=i))for(let c of e.get(r.id)??[])n.has(c)||(n.add(c),o.push({id:c,depth:r.depth+1}));}return [...n]}function ui(e){let t=["name","specifier","package","module"].flatMap(i=>{let n=e.attributes[i];return Array.isArray(n)?n:[n]});return new Set([e.label,...e.identity.aliases,...t].filter(i=>typeof i=="string").map(i=>i.trim().toLowerCase()).filter(Boolean))}function mi(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g," ").replace(/\s+/g," ").trim()}function dr(e,t){let i=mi(e);return i?t.some(n=>{let o=mi(n.reason);return o===i||o.includes(i)||i.includes(o)}):true}function pr(e,t,i,n){let o=pi[i]??pi.unknown,s=[...new Set(n.map(c=>c.trim().toLowerCase()).filter(Boolean))];if(s.length>0){let c=t.filter(l=>o?.includes(l.kind)&&s.some(d=>ui(l).has(d))),a=new Set(s.filter(l=>c.some(d=>ui(d).has(l))));return {roots:c.length>0?c.slice(0,4):[e],unresolvedSubjects:n.filter(l=>!a.has(l.trim().toLowerCase()))}}let r=t.filter(c=>o?.includes(c.kind)).slice(0,4);return {roots:r.length>0?r:[e],unresolvedSubjects:[]}}function ur(e,t,i,n){let o=n.issueClass??"unknown",s=[...new Set((n.subjects??[]).map(h=>h.trim()).filter(Boolean))],{roots:r,unresolvedSubjects:c}=pr(t,i.scoped,o,s),a=lr(i.edges,r.map(h=>h.id),3).map(h=>i.entitiesById.get(h)).filter(h=>!!h),l=a.filter(h=>i.scopedIds.has(h.id)&&!r.some(w=>w.id===h.id)&&ir.has(h.kind)).slice(0,6),d=a.filter(h=>i.scopedIds.has(h.id)&&or.has(h.kind)).slice(0,2),y=[...l,...d].filter((h,w,P)=>P.findIndex(R=>R.id===h.id)===w).slice(0,3).flatMap(h=>{let P=r.map(R=>d$1(e,R.id,h.id)).filter(R=>R.found).sort((R,x)=>R.hops.length-x.hops.length)[0];return P?[{from:P.resolvedFrom??P.from,to:P.resolvedTo??P.to,entityPath:P.entityPath,hops:P.hops,proofIds:P.proofs.map(R=>R.id)}]:[]}),b=new Set([...r.flatMap(h=>h.proofIds),...y.flatMap(h=>h.proofIds)]),v=e.proofs.filter(h=>b.has(h.id)).map(h=>h.artifact).filter(h=>i.projectRelativePath==="."?true:h.split(u.sep).join("/").replace(/^\.\//,"").startsWith(`${i.projectRelativePath}/`)).filter((h,w,P)=>P.indexOf(h)===w).sort().slice(0,4),C=[];return l.length===0&&C.push("No affected surface is structurally reachable from the selected root evidence."),d.length===0&&C.push("No graph-connected test suite or pipeline is available as a verification target."),v.length===0&&C.push("The selected graph entities do not carry portable source evidence."),c.length>0&&C.push(`No canonical graph entity resolved for ${c.length} reported subject(s): ${c.join(", ")}.`),{issueId:n.id,issueClass:o,status:n.status==="fail"?"fail":"warn",reason:n.reason,scope:"structural-impact-candidates",subjects:s,unresolvedSubjects:c,rootEntities:r.map(en),affectedEntities:l.map(en),verificationTargets:d.map(en),proofPaths:y,sourceArtifacts:v,unknowns:C}}async function tn(e){if(!e.workspacePath)return qe(e,"graph-missing","Project is not attached to a Workspai workspace; no workspace graph can be consulted.");let t=u.join(e.workspacePath,a$7),i=u.join(e.workspacePath,p.model);if(!await m.pathExists(t))return qe(e,"graph-missing","Workspace knowledge graph is missing. Run workspace model before relying on graph-aware diagnosis.");if(!await m.pathExists(i))return qe(e,"model-missing","Canonical workspace model is missing, so graph source binding cannot be verified.");let n,o,s,r;try{({graph:n,model:o,entitiesById:s,edges:r}=await rr(t,i));}catch(b){return qe(e,"invalid",`Graph-aware diagnosis rejected invalid evidence: ${b instanceof Error?b.message:String(b)}`)}let c={artifact:a$7,schemaVersion:n.schemaVersion,sourceArtifact:n.source.artifact,sourceHash:n.source.hash,entityCount:n.entities.length,relationCount:n.relations.length,proofCount:n.proofs.length};try{b$2(n,o);}catch(b){return qe(e,"stale",b instanceof Error?b.message:String(b),c)}let a=sr(n,e);if(!a)return qe(e,"project-unresolved","The current project could not be resolved to one canonical project entity.",c);let l=ar(n,a),d={scoped:l,scopedIds:new Set(l.map(b=>b.id)),entitiesById:s,edges:r,projectRelativePath:Rt(e.workspacePath,e.projectPath)},p$1=(e.probes??[]).filter(b=>b.status!=="pass"),y=[...p$1,...(e.issues??[]).filter(b=>!dr(b,p$1)).map((b,v)=>({id:`legacy-project-issue-${v+1}`,status:"fail",reason:b,issueClass:"runtime"}))].map(b=>ur(n,a,d,b));return {schemaVersion:Qt,generatedAt:(e.now??new Date).toISOString(),status:"available",claimBoundary:fi,graph:c,project:{name:e.projectName,path:Rt(e.workspacePath,e.projectPath),entityId:a.id},summary:{findingCount:y.length,rootEntityCount:new Set(y.flatMap(b=>b.rootEntities.map(v=>v.id))).size,affectedEntityCount:new Set(y.flatMap(b=>b.affectedEntities.map(v=>v.id))).size,verificationTargetCount:new Set(y.flatMap(b=>b.verificationTargets.map(v=>v.id))).size,proofPathCount:y.reduce((b,v)=>b+v.proofPaths.length,0),subjectCount:new Set(y.flatMap(b=>b.subjects)).size,unresolvedSubjectCount:new Set(y.flatMap(b=>b.unresolvedSubjects)).size,unknownCount:y.reduce((b,v)=>b+v.unknowns.length,0)},findings:y,diagnostics:[]}}var St="workspai.doctor-summary.v1";function yi(e){let t=e.trim().match(/^(?:Python\s+)?(\d+(?:\.\d+){0,3})/i);return t?{raw:t[1],parts:t[1].split(".").map(i=>Number.parseInt(i,10))}:null}function gi(e,t){let i=Math.max(e.length,t.length);for(let n=0;n<i;n+=1){let o=(e[n]??0)-(t[n]??0);if(o!==0)return o<0?-1:1}return 0}function mr(e,t){return t.replace(/\.\*$/u,"").split(".").map(n=>Number.parseInt(n,10)).every((n,o)=>e[o]===n)}function fr(e){if(e.length<=2)return [(e[0]??0)+1];let t=e.slice(0,-1);return t[t.length-1]=(t[t.length-1]??0)+1,t}function gr(e,t){let i=t.trim().match(/^(===|~=|==|!=|>=|<=|>|<)\s*(.+)$/u);if(!i)return null;let[,n,o]=i;if((n==="=="||n==="!=")&&/\.\*$/u.test(o)){let c=mr(e.parts,o);return n==="=="?c:!c}let s=yi(o);if(!s)return null;let r=gi(e.parts,s.parts);return n==="==="?e.raw===s.raw:n==="=="?r===0:n==="!="?r!==0:n===">="?r>=0:n==="<="?r<=0:n===">"?r>0:n==="<"?r<0:n==="~="?r>=0&&gi(e.parts,fr(s.parts))<0:null}function hi(e,t){let i=yi(e),n=t.trim(),o=n.replace(/^\(|\)$/gu,"").split(",").map(c=>c.trim()).filter(Boolean);if(!i||o.length===0)return {version:i?.raw??e.trim(),specifier:n,satisfied:null,unsupportedSpecifiers:o.length===0?[n]:o};let s=o.map(c=>({clause:c,result:gr(i,c)})),r=s.filter(c=>c.result===null).map(c=>c.clause);return {version:i.raw,specifier:n,satisfied:r.length>0?null:s.every(c=>c.result===true),unsupportedSpecifiers:r}}function bi(e){return u.win32.normalize(e.trim()).replace(/\\/g,"/").toLowerCase()}function ki(e,t){return bi(u.win32.dirname(e))===bi(t)&&/^workspai(?:\.cmd|\.exe|\.ps1)?$/i.test(u.win32.basename(e))}async function yr(){let e=await execa("where.exe",["workspai"],{reject:false,timeout:5e3,windowsHide:true});return e.exitCode!==0?[]:e.stdout.split(/\r?\n/).map(t=>t.trim()).filter(Boolean)}async function hr(){let e=process.env.npm_config_prefix?.trim();if(e)return e;let t=await execa("npm",["prefix","--global"],{reject:false,timeout:5e3,windowsHide:true});if(t.exitCode===0)return t.stdout.trim()||void 0}async function wi(e={}){if((e.platform??process.platform)!=="win32")return {status:"ok",applicability:"not-applicable",command:"workspai",resolutionStatus:"not-applicable",candidates:[],message:"Windows PATH resolution check is not applicable on this host."};let[i,n]=await Promise.allSettled([(e.resolveCandidates??yr)(),(e.resolveNpmGlobalPrefix??hr)()]);if(i.status==="rejected")return {status:"warn",applicability:"applicable",command:"workspai",resolutionStatus:"unverified",candidates:[],message:"Windows PATH resolution could not be inspected.",details:"The bounded `where.exe workspai` probe failed. Retry Doctor from a standard Windows shell or use `npx --yes workspai <command>`."};let o=i.value,s=n.status==="fulfilled"?n.value:void 0,r=[...new Set(o.map(d=>d.trim()).filter(Boolean))],c=r.map((d,p)=>({location:p===0?"Active PATH match":"Additional PATH match",path:d}));if(r.length===0)return {status:"warn",applicability:"applicable",command:"workspai",resolutionStatus:"unresolved",candidates:r,...s?{npmGlobalPrefix:s}:{},message:"`workspai` is not resolvable from Windows PATH.",details:"Add the npm global prefix to PATH, or use `npx --yes workspai <command>` while repairing the host configuration."};let a=r[0];if(!s)return {status:"warn",applicability:"applicable",command:"workspai",resolutionStatus:"unverified",activePath:a,candidates:r,paths:c,message:"The active `workspai` PATH target could not be verified against npm.",details:"Run `npm prefix --global`, then ensure that directory precedes conflicting command locations in PATH."};let l=r.find(d=>ki(d,s));return ki(a,s)?{status:"ok",applicability:"applicable",command:"workspai",resolutionStatus:"canonical",activePath:a,npmGlobalPrefix:s,candidates:r,paths:c,message:"`workspai` resolves to the npm global shim.",...r.length>1?{details:"Additional PATH matches exist, but the npm global shim has precedence."}:{}}:{status:"warn",applicability:"applicable",command:"workspai",resolutionStatus:"shadowed",activePath:a,npmGlobalPrefix:s,candidates:r,paths:c,message:"Another executable shadows the npm global `workspai` shim.",details:l?`Move ${s} before ${u.win32.dirname(a)} in PATH. Until then, use \`npx --yes workspai <command>\`.`:`Add ${s} to PATH before ${u.win32.dirname(a)}. Until then, use \`npx --yes workspai <command>\`.`}}var sn=p.doctor;function Ii(e){return [...new Set(e.filter(t=>t&&t.trim().length>0))]}function ji(e){return [...new Set(e.filter(t=>t&&t.trim().length>0))]}function Ni(){let e=t$2().map(n=>u.join(n,b$5()?"poetry.exe":"poetry")),t=b$5()?[u.join(process.env.APPDATA||"","Python","Scripts","poetry.exe"),u.join(process.env.USERPROFILE||"","AppData","Roaming","Python","Scripts","poetry.exe")]:[],i=b$5()?[]:["/usr/local/bin/poetry","/usr/bin/poetry"];return Ii([...e,...t,...i])}function br(e,t=process.cwd()){let i=t$2().map(l=>({location:"Global (user-local)",path:u.join(l,b$5()?"rapidkit.exe":"rapidkit")})),n$1=[{location:"Global (pipx)",path:u.join(e,".local","bin","rapidkit")},{location:"Global (pipx)",path:u.join(e,"AppData","Roaming","Python","Scripts","rapidkit.exe")},{location:"Global (pyenv)",path:u.join(e,".pyenv","shims","rapidkit")},{location:"Global (system)",path:"/usr/local/bin/rapidkit"},{location:"Global (system)",path:"/usr/bin/rapidkit"}],o=n(u.join(t,".venv")),s=p$1(t),r=[{location:"Workspace (.venv)",path:o},...s.map(l=>({location:"Workspace (launcher)",path:l}))],c=[...i,...n$1,...r],a=new Set;return c.filter(l=>a.has(l.path)?false:(a.add(l.path),true))}function kr(e){let t=new Map([["Workspace (.venv)",0],["Global (user-local)",1],["Global (pipx)",2],["Global (pyenv)",3],["Global (system)",4]]);return [...e].sort((i,n)=>{let o=t.get(i.location)??Number.MAX_SAFE_INTEGER,s=t.get(n.location)??Number.MAX_SAFE_INTEGER;return o!==s?o-s:i.path.localeCompare(n.path)})}function ct(e,t){let i=[e.details,t].filter(n=>typeof n=="string"&&n.trim().length>0).join(" ");return {...e,status:e.status==="error"?"warn":e.status,applicability:"not-applicable",...i?{details:i}:{}}}function Mi(e,t){let i=t.some(c=>c.runtimeFamily==="python"),n=t.some(c=>c.runtimeFamily==="go"),o=t.find(c=>c.pythonRequirement?.satisfied===false),s=t.find(c=>c.pythonRequirement?.satisfied===null),r=o?.pythonRequirement?{...e.python,status:"error",message:`Python ${o.pythonRequirement.detectedVersion??"unknown"} does not satisfy ${o.pythonRequirement.specifier}`,details:`Project ${o.name} declares requires-python ${o.pythonRequirement.specifier}.`}:s?.pythonRequirement?{...e.python,status:e.python.status==="error"?"error":"warn",details:`Project ${s.name} declares requires-python ${s.pythonRequirement.specifier}, but compatibility could not be evaluated.`}:e.python;return {...e,python:i?r:ct(e.python,"Python is optional because this scope has no detected Python project."),poetry:i?e.poetry:ct(e.poetry,"Poetry is not applicable to this project scope."),pipx:i?e.pipx:ct(e.pipx,"pipx is not applicable to this project scope."),go:n?e.go:ct(e.go,"Go is not applicable to this project scope."),rapidkitCore:/not installed/i.test(e.rapidkitCore.message)||!i&&e.rapidkitCore.status!=="error"?ct(e.rapidkitCore,"RapidKit Core is an optional engine for Python-backed kits and modules; Workspai CLI diagnostics remain available without it."):e.rapidkitCore}}function vr(e){let i=(e.probes??[]).filter(r=>r.status==="warn").length,n=e.issues.some(r=>r.toLowerCase().includes("environment file missing")),o=(e.probes??[]).some(r=>r.id==="surface-env-contract"),s=(e.probes??[]).some(r=>r.id==="surface-security-hygiene");return e.hasEnvFile===false&&!n&&!o&&(i+=1),typeof e.vulnerabilities=="number"&&e.vulnerabilities>0&&!s&&(i+=1),i}function wr(e){let t=e.coreVersion?.split(".")[0],i=e.npmVersion?.split(".")[0];return !t||!i?false:t!==i}var jr="doctor-project-scan-v2",xr="doctor-project-scan-policy-v5",Ti=s.doctorWorkspaceCache.schemaVersion,Cr=Object.freeze({version:"doctor-evidence-v1",scoringPolicyVersion:"doctor-score-policy-v2",generatedBy:"workspai",deterministicScoreBreakdown:true,scopeModel:"workspace-aggregate-or-project-scoped"}),lt=Object.freeze({local:{name:"local",exitOnErrors:true,exitOnWarnings:false,warningExitCode:0,advisoryWarningsBlockRelease:false,description:"Local diagnostics: report warnings without blocking the developer loop."},ci:{name:"ci",exitOnErrors:true,exitOnWarnings:true,warningExitCode:2,advisoryWarningsBlockRelease:false,description:"CI diagnostics: errors fail, warnings return a distinct warning exit code."},release:{name:"release",exitOnErrors:true,exitOnWarnings:true,warningExitCode:1,advisoryWarningsBlockRelease:true,description:"Release gate: any warning/error blocks release readiness."},"enterprise-strict":{name:"enterprise-strict",exitOnErrors:true,exitOnWarnings:true,warningExitCode:1,advisoryWarningsBlockRelease:true,description:"Enterprise strict gate: all warnings/errors block release and must carry evidence or repair guidance."}});function Ue(){return {...Cr}}function Nt(e){let t=e.profile?.trim();return t&&t in lt?{...lt[t]}:e.strict?{...lt.release}:e.ci?{...lt.ci}:{...lt.local}}function Ft(e){return !e||e.total<=0?null:Math.round(e.passed/e.total*100)}function Pr(e){return e.id==="surface-security-hygiene"&&/vulnerabilit/i.test(`${e.reason} ${e.recommendation??""}`)?{category:"state",ttlSeconds:300,reason:"Dependency vulnerability evidence is live state and must be refreshed before release use."}:e.id.includes("script")||e.id.includes("test")||e.id.includes("quality")||e.id.includes("format")||e.id.includes("runtime")||e.id.includes("lockfile")?{category:"verification",ttlSeconds:1440*60,reason:"Verification/tooling evidence can drift with dependency and config changes; refresh daily or before release."}:e.id.includes("dependency")||e.id.includes("env")||e.id.includes("container")||e.id.includes("docker")||e.id.includes("deploy")||e.id.includes("kubernetes")||e.id.includes("source-tree")||e.id.includes("framework")||e.id.includes("typescript")?{category:"structure",ttlSeconds:10080*60,reason:"Structural workspace/project evidence is durable but should be refreshed when files or manifests change."}:{category:"verification",ttlSeconds:1440*60,reason:"Default Doctor evidence freshness contract for project-scoped verification."}}function Dr(e,t){let i=Pr(e),n=Date.parse(t),o=typeof i.ttlSeconds=="number"?i.ttlSeconds*1e3:null,s=o!==null&&Number.isFinite(n)?new Date(n+o).toISOString():void 0,r=!Number.isFinite(n)||o!==null&&!s?"unknown":o!==null&&Date.now()>n+o?"stale":"fresh";return {category:i.category,generatedAt:t,ttlSeconds:i.ttlSeconds,...s?{expiresAt:s}:{},status:r,verifyBeforeUse:i.category!=="structure"||r!=="fresh",reason:i.reason}}function Rr(e){let t=e.id.toLowerCase(),i=`${e.label} ${e.reason} ${e.recommendation??""}`.toLowerCase();return t.includes("dependency")||t.includes("lockfile")||i.includes("lockfile")?"dependency":t.includes("security")||i.includes("vulnerabilit")||i.includes("audit")?"security":t.includes("env")||i.includes(".env")||i.includes("environment")?"environment":t.includes("test")?"test":t.includes("quality")||t.includes("format")||t.includes("lint")?"quality":t.includes("docker")||t.includes("container")?"container":t.includes("deploy")||t.includes("kubernetes")?"deployment":t.includes("migration")||t.includes("database")?"configuration":t.includes("runtime")?"runtime":t.includes("contract")?"workspace-contract":t.includes("source-tree")?"source-tree":t.includes("framework")||t.includes("typescript")?"framework":t.includes("custom")?"custom":t.includes("script")||t.includes("config")?"configuration":"unknown"}function Oi(e){let t=e.dependencyAudit?.subjects.map(i=>i.name)??[];return (e.probes??[]).map(i=>({...i,...i.id==="surface-security-hygiene"&&t.length>0?{subjects:t}:{}}))}function Sr(e,t){return e.status==="pass"?"none":t==="security"?"security-risk":t==="deployment"||t==="runtime"?"runtime-risk":t==="dependency"||t==="test"||t==="quality"||t==="workspace-contract"?e.severity==="error"||e.status==="fail"?"release-risk":"ci-risk":t==="container"||t==="environment"?"release-risk":"developer-friction"}function Er(e){let{probe:t,freshness:i}=e,n=t.repairCapability;if(t.status==="pass")return {mode:"none",confidence:"high",primaryActionLabel:"No action required",requiresApproval:false,requiresFreshEvidence:false,reason:"Probe is passing.",relatedCommands:[]};if(i.status!=="fresh")return {mode:"refresh-evidence",confidence:"high",primaryActionLabel:"Refresh evidence",requiresApproval:false,requiresFreshEvidence:true,reason:`Evidence is ${i.status}; refresh Doctor before applying repairs.`,relatedCommands:["npx workspai doctor project --json"]};if(n?.status==="manual"||n?.requiresReview)return {mode:"review-required",confidence:"medium",primaryActionLabel:"Review fix path",requiresApproval:true,requiresFreshEvidence:i.verifyBeforeUse,reason:n?.reason??t.recommendation??t.reason,relatedCommands:ji(n?.refreshCommands??["npx workspai doctor project --json"])};if(i.verifyBeforeUse&&i.category==="state")return {mode:"verify-before-fix",confidence:"high",primaryActionLabel:"Verify live state",requiresApproval:false,requiresFreshEvidence:true,reason:"Live state evidence must be re-read before Studio claims a fix path.",relatedCommands:["npx workspai doctor project --json"]};if(n?.status==="available"&&n.canAutoFix){let o=n.canEditFiles;return {mode:o?"edit-file":"run-command",confidence:"high",primaryActionLabel:o?"Apply file fix":"Run fix command",requiresApproval:n.requiresApproval,requiresFreshEvidence:i.verifyBeforeUse,reason:n.reason,relatedCommands:ji([...n.command?[n.command]:[],...n.verifyCommand?[n.verifyCommand]:[],...n.refreshCommands])}}return t.recommendation?{mode:"manual-guidance",confidence:"medium",primaryActionLabel:"Inspect guidance",requiresApproval:false,requiresFreshEvidence:i.verifyBeforeUse,reason:t.recommendation,relatedCommands:["npx workspai doctor project --json"]}:{mode:"manual-guidance",confidence:"low",primaryActionLabel:"Inspect issue",requiresApproval:false,requiresFreshEvidence:i.verifyBeforeUse,reason:"Doctor classified the issue but does not have a deterministic repair path yet.",relatedCommands:["npx workspai doctor project --json"]}}function ln(e,t){let i=Dr(e,e.freshness?.generatedAt??t),n=e.issueClass??Rr(e),o=e.operationalImpact??Sr(e,n),s=Er({probe:e,freshness:i});return {...e,freshness:i,issueClass:n,operationalImpact:o,repairIntent:s}}function Ar(e,t){Array.isArray(e.probes)&&(e.probes=e.probes.map(i=>ln(i,t)));}function Fr(e){e.diagnosis=a$a({projectName:e.name,projectPath:e.path,runtimeFamily:e.runtimeFamily,runtimeFamilies:e.runtimeFamilies,framework:e.framework,projectKind:e.projectKind,projectArchetype:e.projectArchetype,probes:e.probes??[],legacyIssues:e.issues,dependencySubjects:e.dependencyAudit?.subjects});}function $t(e,t=new Date().toISOString()){Ar(e,t),Gr(e,e.path),Fr(e);}function _i(e){if(!e.diagnosis||e.graphDiagnosis?.status!=="available")return;let t=new Map(e.graphDiagnosis.findings.map(i=>[i.issueId,i]));for(let i of e.diagnosis.findings){let n=t.get(i.probeId);if(!n)continue;let o=[{kind:"graph",role:"impact",ref:`doctor-graph:${e.name}:${n.issueId}`,claim:`Canonical graph diagnosis retained ${n.proofPaths.length} bounded proof path(s), ${n.affectedEntities.length} affected candidate(s), and ${n.verificationTargets.length} verification target(s); structural reachability is not runtime causality.`}],s=new Set(i.proofs.map(r=>`${r.kind}:${r.role}:${r.ref}`));for(let r of o){let c=`${r.kind}:${r.role}:${r.ref}`;s.has(c)||i.proofs.push(r);}}}function dn(e,t){let i=e.flatMap(a=>Array.isArray(a.probes)?a.probes.map(l=>l.freshness).filter(l=>!!l):[]),n=i.filter(a=>a.status==="stale").length,o=i.filter(a=>a.status==="unknown").length,s=i.filter(a=>a.category==="state").length,r=i.filter(a=>a.verifyBeforeUse).length,c=i.map(a=>a.generatedAt).filter(Boolean).sort()[0];return {generatedAt:t,status:n>0?"stale":o>0?"unknown":"fresh",staleProbeCount:n,unknownProbeCount:o,liveStateProbeCount:s,verifyBeforeUseProbeCount:r,...c?{oldestProbeGeneratedAt:c}:{}}}function Bi(e){return typeof e=="number"?e:Array.isArray(e)?e.length:0}async function Gi(e,t){try{if(!await m.pathExists(e))return null;let i=await m.readJSON(e);return c$3(i,t)?i:null}catch{return null}}function Ki(e,t){if(!e?.system)return [];let i=[{id:"python",current:t.python},{id:"poetry",current:t.poetry},{id:"pipx",current:t.pipx},{id:"go",current:t.go},{id:"rapidkitCore",current:t.rapidkitCore},{id:"cliResolution",current:t.cliResolution}],n=[];for(let o of i){let s=e.system?.[o.id]?.status;!s||s===o.current.status||n.push({id:o.id,from:s,to:o.current.status});}return n}function $r(e,t){let i=new Map;for(let y of t.projects)i.set(y.path||y.name,y.issues.length);if(!e)return {baselineAvailable:false,newIssueCount:0,resolvedIssueCount:0,netIssueDelta:0,scoreDeltaPercent:null,systemStatusChanges:[],regressedProjects:[],improvedProjects:[]};let n=Array.isArray(e.projects)?e.projects:[],o=new Map;for(let y of n){let b=y.path||y.name;b&&o.set(b,Bi(y.issues));}let s=0,r=0,c=new Set,a=new Set,l=new Set([...Array.from(o.keys()),...Array.from(i.keys())]);for(let y of l){let b=o.get(y)??0,v=i.get(y)??0;v>b?(s+=v-b,c.add(y)):v<b&&(r+=b-v,a.add(y));}let d=Ft(e.healthScore),p=Ft(t.healthScore);return {baselineAvailable:true,previousGeneratedAt:e.generatedAt,newIssueCount:s,resolvedIssueCount:r,netIssueDelta:s-r,scoreDeltaPercent:d===null||p===null?null:p-d,systemStatusChanges:Ki(e,{python:t.python,poetry:t.poetry,pipx:t.pipx,go:t.go,rapidkitCore:t.rapidkitCore,cliResolution:t.cliResolution}),regressedProjects:Array.from(c).sort(),improvedProjects:Array.from(a).sort()}}function Ir(e,t){if(!e)return {baselineAvailable:false,newIssueCount:0,resolvedIssueCount:0,netIssueDelta:0,scoreDeltaPercent:null,systemStatusChanges:[],regressedProjects:[],improvedProjects:[]};let i=Bi(e.project?.issues),n=t.project.issues.length,o=Math.max(n-i,0),s=Math.max(i-n,0),r=Ft(e.healthScore),c=Ft(t.healthScore),a=t.project.path||t.project.name;return {baselineAvailable:true,previousGeneratedAt:e.generatedAt,newIssueCount:o,resolvedIssueCount:s,netIssueDelta:o-s,scoreDeltaPercent:r===null||c===null?null:c-r,systemStatusChanges:Ki(e,{python:t.python,poetry:t.poetry,pipx:t.pipx,go:t.go,rapidkitCore:t.rapidkitCore,cliResolution:t.cliResolution}),regressedProjects:o>0?[a]:[],improvedProjects:s>0?[a]:[]}}function Wi(e){let t=e??[],i=0,n=0;for(let r of t){if(r.scope==="project-scoped"){i+=1;continue}(r.scope==="workspace-aggregate"||r.scope==="host-system")&&(n+=1);}let o=i>0&&n>0?1:0,s=o>0?"mixed":i>0?"scoped":n>0?"aggregated":"unknown";return {scopedCount:i,aggregatedCount:n,mixedCount:o,dominantScope:s}}function Q(e,t){return b$5()?`Set-Location -LiteralPath "${e.replace(/"/g,'`"')}"; ${t}`:`cd '${e.replace(/'/g,`'"'"'`)}' && ${t}`}function Nr(e){return e.manager==="project-script"&&e.projectScript?Q(e.projectPath,e.projectScript):e.manager==="poetry"?Q(e.projectPath,"poetry install --no-root"):e.manager==="uv"?Q(e.projectPath,"uv sync"):Q(e.projectPath,b$5()?"py -3 -m venv .venv":"python3 -m venv .venv")}async function Mr(e){let t=b$5()?["script/setup.cmd","script/setup.ps1","scripts/setup.cmd","scripts/setup.ps1","script/setup","scripts/setup","bin/setup"]:["script/setup","scripts/setup","bin/setup"];for(let i of t)if(await m.pathExists(u.join(e,i)))return i}async function Tr(e){let t=e?[e]:j$1();for(let i of t)try{let o=await execa(i,i==="py"?["-3","--version"]:["--version"],{timeout:3e3,reject:false}),s=`${o.stdout??""}
18
18
  ${o.stderr??""}`.match(/Python\s+(\d+\.\d+(?:\.\d+)?)/i);if(s)return s[1]}catch{}}function Or(e){return e==="FastAPI"||e==="NestJS"?"first-class":e==="Django"||e==="Flask"||e==="Express"||e==="Fastify"||e==="Koa"||e==="Go/Fiber"||e==="Go/Gin"||e==="Spring Boot"||e==="Rust"||e==="Phoenix"||e==="Elixir"||e==="Clojure"||e==="Scala"||e==="Kotlin"||e==="C"||e==="C++"||e==="Deno"||e==="Bun"||e==="PHP"||e==="Laravel"||e==="Ruby"||e==="Ruby on Rails"||e==="ASP.NET"?"extended":"observed"}function _r(e){return e==="Tauri"||e==="Electron"?"desktop":e==="VS Code Extension"?"extension":e==="Next.js"||e==="Remix"||e==="Nuxt"||e==="React"||e==="Vue"||e==="Angular"||e==="SvelteKit"||e==="Svelte"||e==="Vite"||e==="Astro"||e==="Solid"?"frontend":e==="Unknown"||e==="Node.js"||e==="Python"||e==="Go"||e==="Java"||e==="Scala"||e==="Kotlin"||e==="C"||e==="C++"?"generic":"backend"}function Br(e){return e==="NestJS"||e==="Next.js"||e==="Remix"||e==="Nuxt"||e==="React"||e==="Vue"||e==="Angular"||e==="SvelteKit"||e==="Svelte"||e==="Vite"||e==="Astro"||e==="Solid"||e==="Express"||e==="Fastify"||e==="Koa"||e==="Tauri"||e==="Electron"||e==="VS Code Extension"||e==="Node.js"?"node":e==="Bun"?"bun":e==="FastAPI"||e==="Django"||e==="Flask"||e==="Python"?"python":e==="Go/Fiber"||e==="Go/Gin"||e==="Go"||e==="Echo"?"go":e==="Spring Boot"||e==="Java"?"java":e==="Rust"?"rust":e==="Elixir"||e==="Phoenix"?"elixir":e==="Clojure"?"clojure":e==="Deno"?"deno":e==="Laravel"||e==="PHP"?"php":e==="Ruby on Rails"||e==="Ruby"?"ruby":e==="ASP.NET"?"dotnet":e==="Scala"?"scala":e==="Kotlin"?"kotlin":e==="C"?"c":e==="C++"?"cpp":"unknown"}function Gr(e,t){let i=z(t);e.commandCapabilities=i,e.supportTier=i.frameworkSupportTier;}function dt(e,t,i,n){e.framework=t,e.frameworkConfidence=i,e.supportTier=Or(t),e.projectKind=_r(t),e.runtimeFamily=Br(t);}function Hi(e){return e==="python"?"python":e==="node"?"node":e==="bun"?"bun":e==="go"?"go":e==="java"?"java":e==="rust"?"rust":e==="elixir"?"elixir":e==="clojure"?"clojure":e==="deno"?"deno":e==="php"?"php":e==="ruby"?"ruby":e==="dotnet"?"dotnet":e==="scala"?"scala":e==="kotlin"?"kotlin":e==="c"?"c":e==="cpp"?"cpp":"unknown"}function pn(e){switch(e.key){case "fastapi":return "FastAPI";case "django":return "Django";case "flask":return "Flask";case "python":return "Python";case "nestjs":return "NestJS";case "nextjs":return "Next.js";case "remix":return "Remix";case "nuxt":return "Nuxt";case "react":return "React";case "vite":return "Vite";case "vue":return "Vue";case "sveltekit":return "SvelteKit";case "svelte":return "Svelte";case "angular":return "Angular";case "astro":return "Astro";case "solid":return "Solid";case "express":return "Express";case "fastify":return "Fastify";case "koa":return "Koa";case "tauri":return "Tauri";case "electron":return "Electron";case "vscode-extension":return "VS Code Extension";case "node":return "Node.js";case "gofiber":return "Go/Fiber";case "gogin":return "Go/Gin";case "echo":return "Echo";case "go":return "Go";case "springboot":return "Spring Boot";case "java":return "Java";case "laravel":return "Laravel";case "php":return "PHP";case "rails":return "Ruby on Rails";case "ruby":return "Ruby";case "dotnet":return "ASP.NET";case "phoenix":return "Phoenix";case "elixir":return "Elixir";case "clojure":return "Clojure";case "scala":return "Scala";case "kotlin":return "Kotlin";case "deno":return "Deno";case "bun":return "Bun";case "actix":case "axum":case "rocket":case "rust":return "Rust";case "sinatra":case "symfony":return e.key==="sinatra"?"Ruby":"PHP";case "c":return "C";case "cpp":return "C++";case "unknown":return "Unknown";default:return "Unknown"}}function Kr(e){return e.key==="python"||e.key==="node"||e.key==="go"||e.key==="java"||e.key==="php"||e.key==="ruby"||e.key==="dotnet"||e.key==="rust"||e.key==="elixir"||e.key==="clojure"||e.key==="scala"||e.key==="kotlin"||e.key==="deno"||e.key==="bun"||e.key==="unknown"}function Wr(e,t){e.framework=pn(t),e.frameworkKey=t.key,e.importStack=t.importStack,e.frameworkConfidence=t.confidence,e.supportTier=t.supportTier,e.projectKind="frontend",e.runtimeFamily=Hi(t.runtime);}function ie(e,t){e.framework=pn(t),e.frameworkKey=t.key,e.importStack=t.importStack,e.frameworkConfidence=t.confidence,e.supportTier=t.supportTier,e.projectKind=t.key==="tauri"||t.key==="electron"?"desktop":t.key==="vscode-extension"?"extension":Kr(t)?"generic":"backend",e.runtimeFamily=Hi(t.runtime);}function Hr(e){let t=e.dependencies,i=e.scripts??{},n=(e.kitName??"").toLowerCase(),o=r=>!!t[r],s=Object.values(i).filter(r=>typeof r=="string").join(" ").toLowerCase();return o("next")||s.includes("next ")?{framework:"Next.js",confidence:"high"}:o("nuxt")||s.includes("nuxt ")?{framework:"Nuxt",confidence:"high"}:o("@nestjs/core")||n.startsWith("nestjs.")?{framework:"NestJS",confidence:"high"}:o("express")?{framework:"Express",confidence:"high"}:o("fastify")?{framework:"Fastify",confidence:"high"}:o("koa")?{framework:"Koa",confidence:"high"}:o("@angular/core")?{framework:"Angular",confidence:"high"}:o("@sveltejs/kit")||s.includes("svelte-kit")?{framework:"SvelteKit",confidence:"high"}:o("vue")?{framework:"Vue",confidence:"medium"}:o("react")&&o("react-dom")?{framework:"React",confidence:"medium"}:{framework:"Node.js",confidence:"low"}}async function Lr(e,t){let i=m$1(e,t??null);return i.runtime!=="python"?{framework:"Python",confidence:"low"}:{framework:pn(i),confidence:i.confidence}}async function xi(e){try{let t=await m.stat(e);if(t.isFile()&&t.size<=1048576){let i=await m.readFile(e);return `${u.basename(e)}:f:${t.size}:${createHash("sha256").update(i).digest("hex")}`}if(t.isDirectory()){if(["node_modules",".venv"].includes(u.basename(e))){let l=await m.readdir(e).catch(()=>[]);return `${u.basename(e)}:materialized:${l.length}:${t.mtimeMs}`}let i=createHash("sha256"),n=[e],o=new Set([".git",".workspai",".rapidkit",".venv","node_modules","dist","build","coverage","target","bin","obj","__pycache__"]),s=0,r=0,c=2e4,a=32*1024*1024;for(;n.length>0&&s<c;){let l=n.shift();if(!l)break;let d=await m.readdir(l,{withFileTypes:true}).catch(()=>[]);d.sort((p,y)=>p.name.localeCompare(y.name));for(let p of d){if(o.has(p.name))continue;let y=u.join(l,p.name),b=u.relative(e,y).split(u.sep).join("/");if(p.isDirectory()){i.update(`d:${b}\0`),n.push(y);continue}if(!p.isFile())continue;let v=await m.stat(y).catch(()=>null);if(v){if(s+=1,i.update(`f:${b}:${v.size}:${v.mtimeMs}\0`),v.size<=262144&&r+v.size<=a){let C=await m.readFile(y).catch(()=>null);C&&(r+=C.length,i.update(C));}if(s>=c)break}}}return i.update(`files:${s}:bytes:${r}:remaining:${n.length}`),`${u.basename(e)}:d:${i.digest("hex")}`}return `${u.basename(e)}:other:${t.size}:${t.mtimeMs}`}catch{return `${u.basename(e)}:missing`}}async function qr(e){try{let t=new Set([".git",".venv","node_modules",".workspai",".rapidkit","dist","build","coverage","__pycache__"]),i=new Set,n=new Set,o=async a=>{if(await ut(a))return true;let l=["package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","*.csproj","Cargo.toml","composer.json","Gemfile","mix.exs","deps.edn","project.clj","build.sbt","deno.json","deno.jsonc","CMakeLists.txt","meson.build"];for(let d of l){if(d==="*.csproj"){if((await m.readdir(a).catch(()=>[])).some(y=>y.endsWith(".csproj")))return true;continue}if(await m.pathExists(u.join(a,d)))return true}return false};await ut(e)&&i.add(e);let s=await c$2(e);for(let a of s.summary.projects){let l=u.resolve(e,a.relativePath);await o(l)&&(i.add(l),n.add(l));}let r=await a$4(e);for(let a of r){let l=u.isAbsolute(a.path)?a.path:u.join(e,a.path);if(await o(l)){let d=u.resolve(l);i.add(d),n.add(d);}}return (await a$5(e,{skipDirs:t,descendIntoMatchedProjects:true,isProjectDir:async(a,l)=>u.resolve(a)===u.resolve(l)?ut(a):o(a)})).forEach(a=>{let l=u.resolve(a);(![...n].some(p=>l!==p&&l.startsWith(`${p}${u.sep}`))||n.has(l))&&i.add(l);}),i.size===0&&(await ys(e,3,t)).forEach(l=>i.add(l)),i.size===0&&!await b$1(e)&&await o(e)&&i.add(e),Array.from(i).sort((a,l)=>a.localeCompare(l))}catch{return []}}async function Vr(e,t){let i=[u.join(e,".workspai-workspace"),u.join(e,".workspai","workspace.json"),u.join(e,".workspai","imported-projects.json"),u.join(e,".workspai","policies.yml"),u.join(e,".workspai","toolchain.lock"),u.join(e,".workspai","cache-config.yml"),u.join(e,".rapidkit-workspace"),u.join(e,".rapidkit","workspace.json"),u.join(e,".rapidkit","imported-projects.json"),u.join(e,".rapidkit","policies.yml"),u.join(e,".rapidkit","toolchain.lock"),u.join(e,".rapidkit","cache-config.yml")],n=[".",".workspai/project.json",".workspai/context.json",".workspai/file-hashes.json",".rapidkit/project.json",".rapidkit/context.json",".rapidkit/file-hashes.json","package.json","pyproject.toml","composer.json","Gemfile","Gemfile.lock","go.mod","go.sum","pom.xml","requirements.txt","Dockerfile","Makefile",".env",".env.example","src","modules","tests","test",".venv","node_modules"],o=await Promise.all(i.map(xi)),s=await Promise.all(t.map(async r=>{let c=await Promise.all(n.map(a=>xi(u.join(r,a))));return `${r}::${c.join("|")}`}));return [jr,xr,...o,...s].join("||")}async function zr(e,t){try{if(!await m.pathExists(e))return null;let i=await m.readJSON(e);a$6(i,"contracts/doctor-workspace-cache.v2.json",`Doctor workspace cache ${e}`);let n=i;if(!n||n.signature!==t||!Array.isArray(n.projects)||typeof n.schemaVersion=="string"&&n.schemaVersion!==Ti)return null;let o=Date.parse(n.generatedAt),s=Number(process.env.WORKSPAI_DOCTOR_CACHE_MAX_AGE_SECONDS),r=Number.isFinite(s)&&s>=0?s:300;return !Number.isFinite(o)||Date.now()-o>r*1e3?null:n}catch{return null}}async function Jr(e,t){try{a$6(t,"contracts/doctor-workspace-cache.v2.json",`Doctor workspace cache ${e}`),await h(e,t$1.doctorWorkspaceCache,t);}catch{}}async function Ur(e,t){let i=Number.parseInt(process.env.RAPIDKIT_DOCTOR_SCAN_CONCURRENCY??"4",10),n=Number.isFinite(i)?Math.min(32,Math.max(1,i)):4,o=new Array(e.length),s=0,r=Array.from({length:Math.min(n,e.length)},async()=>{for(;s<e.length;){let c=s;s+=1;let a=e[c];if(a===void 0)break;o[c]=await t(a);}});return await Promise.all(r),o}async function Yr(e,t,i){let n=u.join(e,sn);try{let o=[];for(let d of t.projects)if(d.diagnosis)for(let p of d.diagnosis.findings)p.status==="blocking"&&p.symptom.trim()&&o.push(`${d.name}: ${p.symptom.trim()}`);else {for(let p of d.issues??[])typeof p=="string"&&p.trim()&&o.push(`${d.name}: ${p.trim()}`);for(let p of d.probes??[])p.status==="fail"&&p.reason.trim()&&o.push(`${d.name}: ${p.reason.trim()}`);}for(let[d,p]of [["python",t.python],["rapidkitCore",t.rapidkitCore]])if(p?.status==="error"){let y=typeof p.message=="string"?p.message:`${d} check failed`;o.push(`${d}: ${y}`);}let s=t.projects.map(ee),r=s.reduce((d,p)=>d+p.blockingFindings,0),c=s.reduce((d,p)=>d+p.advisoryFindings,0),a=Ee(t.projects,[t.python,t.poetry,t.pipx,t.go,t.rapidkitCore,t.cliResolution]),l=f$1({schemaVersion:a$8,evidenceType:"workspace",contract:Ue(),policyProfile:t.policyProfile,workspacePath:e,workspaceName:t.workspaceName,projectScanCached:t.projectScanCached??false,projectScanSignature:t.projectScanSignature,cachePath:i,healthScore:t.healthScore,evidenceFreshness:t.evidenceFreshness,system:{python:t.python,poetry:t.poetry,pipx:t.pipx,go:t.go,rapidkitCore:t.rapidkitCore,cliResolution:t.cliResolution,versions:{core:t.coreVersion,npm:t.npmVersion}},projects:t.projects,summary:{counts:a,totalProjects:t.projects.length,totalIssues:t.projects.reduce((d,p)=>d+p.issues.length,0),verdict:t.healthScore?.verdict??"passed",blockingFindings:r,advisoryFindings:c,projectAdvisoryWarningProjects:s.filter(d=>d.advisoryFindings>0).length,projectAdvisoryWarnings:c,hasSystemErrors:[t.python,t.rapidkitCore].some(d=>d.status==="error"),scopeProvenance:t.scopeProvenance},driftDelta:t.driftDelta,scoreBreakdown:t.scoreBreakdown??[]},{commandId:"checkWorkspaceHealth",exitCode:ft(t.healthScore,{profile:t.policyProfile?.name}),generatedAt:new Date().toISOString(),blockers:o.slice(0,12),runId:e$1()});return d(l),await h(e,sn,l),n}catch(o){throw o}}async function un(e=process.cwd()){let[t,i,n,o,s,r]=await Promise.all([Zr(),Xr(),Qr(),es(),ts(e),wi()]);return {python:t,poetry:i,pipx:n,go:o,rapidkitCore:s,cliResolution:r}}async function Zr(){let e=j$1(),t;for(let i of e)try{let n=i==="py"?["-3","--version"]:["--version"],{stdout:o,stderr:s}=await execa(i,n,{timeout:3e3,reject:false}),c=`${o??""}
19
19
  ${s??""}`.match(/Python\s+(\d+\.\d+(?:\.\d+)?)/i);if(c){let a=c[1],[l,d]=a.split(".").map(Number);if(l<3||l===3&&d<10){t??={version:a,command:[i,...n.slice(0,-1)].join(" ")};continue}return {status:"ok",message:`Python ${a}`,details:`Using ${[i,...n.slice(0,-1)].join(" ")}`}}}catch{continue}return t?{status:"warn",message:`Python ${t.version} (requires 3.10+)`,details:`${t.command} found but version is below minimum requirement`}:{status:"error",message:"Python not found",details:"Install Python 3.10+ and ensure it's in PATH"}}async function Xr(){try{let{stdout:e}=await execa("poetry",["--version"],{timeout:3e3}),t=e.match(/Poetry .*version ([\d.]+)/);return t?{status:"ok",message:`Poetry ${t[1]}`,details:"Available for dependency management"}:{status:"warn",message:"Poetry version unknown"}}catch{let e=j$1().map(t=>({cmd:t,args:t==="py"?["-3","-m","poetry","--version"]:["-m","poetry","--version"]}));for(let t of e)try{let{stdout:i}=await execa(t.cmd,t.args,{timeout:3e3,shell:c$1()}),n=i.match(/Poetry .*version ([\d.]+)/)||i.match(/([\d.]+)/);return {status:"ok",message:n?.[1]?`Poetry ${n[1]}`:"Poetry detected",details:`Available via ${t.cmd} ${t.args.join(" ")}`}}catch{continue}for(let t of Ni())try{if(!await m.pathExists(t))continue;let{stdout:i}=await execa(t,["--version"],{timeout:3e3,shell:c$1()}),n=i.match(/Poetry .*version ([\d.]+)/)||i.match(/([\d.]+)/);return {status:"ok",message:n?.[1]?`Poetry ${n[1]}`:"Poetry detected",details:`Available at ${t}`}}catch{continue}return {status:"warn",message:"Poetry not installed",details:"Optional: Install for better dependency management"}}}async function Qr(){try{let{stdout:e}=await execa("pipx",["--version"],{timeout:3e3});return {status:"ok",message:`pipx ${e.trim()}`,details:"Available for global tool installation"}}catch{let e=j$1();for(let t of e)try{let i=t==="py"?["-3","-m","pipx","--version"]:["-m","pipx","--version"],{stdout:n}=await execa(t,i,{timeout:3e3,shell:c$1()});return {status:"ok",message:`pipx ${n.trim()}`,details:`Available via ${t} ${i.join(" ")}`}}catch{continue}return {status:"warn",message:"pipx not installed",details:"Optional: Install for isolated Python tools"}}}async function es(){try{let{stdout:e}=await execa("go",["version"],{timeout:3e3}),t=e.match(/go version go(\d+\.\d+(?:\.\d+)?)/);return t?{status:"ok",message:`Go ${t[1]}`,details:"Available for Go/Fiber and Go/Gin projects"}:{status:"ok",message:"Go (version unknown)",details:"go found in PATH"}}catch{return {status:"warn",message:"Go not installed",details:"Optional: Required only for gofiber.standard / gogin.standard projects \u2014 https://go.dev/dl/"}}}async function ts(e=process.cwd()){let t=process.env.HOME||process.env.USERPROFILE||"",i=[],n=[],o=br(t,e);for(let{location:r,path:c}of o)try{if(await m.pathExists(c)){let{stdout:a,exitCode:l}=await execa(c,["--version"],{timeout:3e3,reject:false});if(l===0&&(a.includes("RapidKit Version")||a.includes("RapidKit"))){let d=a.match(/v?([\d.]+(?:rc\d+)?(?:a\d+)?(?:b\d+)?)/);if(d){let p=await execa(c,["list","--json"],{timeout:5e3,reject:false});p.exitCode===0?i.push({location:r,path:c,version:d[1]}):n.push({location:r,path:c,version:d[1],reason:pt(p.stderr||p.stdout)});}}}}catch(a){await m.pathExists(c)&&n.push({location:r,path:c,reason:pt(a instanceof Error?a.message:String(a))});continue}if(i.length>0){let r=i.filter(a=>a.location!=="Workspace (launcher)");if(r.length>0){let a=kr(r),l=a[0].version,d=a.some(b=>b.location==="Workspace (.venv)"),p=a.some(b=>b.location.startsWith("Global (")),y=!d&&p?"Workspace (.venv): not installed (optional). For RapidKit Core module-enabled projects, run npx workspai workspace run init inside this workspace to install the local Python engine.":void 0;return {status:"ok",message:`RapidKit Core ${l}`,details:y,paths:a.map(b=>({location:b.location,path:b.path,version:b.version}))}}return {status:"ok",message:`RapidKit Core ${i[0].version}`,details:"Detected via workspace launcher"}}try{let{stdout:r,exitCode:c}=await execa("rapidkit",["--version"],{timeout:3e3,reject:false});if(c===0&&(r.includes("RapidKit Version")||r.includes("RapidKit"))){let a=r.match(/v?([\d.]+(?:rc\d+)?(?:a\d+)?(?:b\d+)?)/);if(a){let l=await execa("rapidkit",["list","--json"],{timeout:5e3,reject:false});if(l.exitCode===0)return {status:"ok",message:`RapidKit Core ${a[1]}`,details:"Available via PATH"};n.push({location:"PATH",path:"rapidkit",version:a[1],reason:pt(l.stderr||l.stdout)});}}}catch{}try{let{stdout:r,exitCode:c}=await execa("poetry",["run","rapidkit","--version"],{timeout:3e3,reject:false});if(c===0&&(r.includes("RapidKit Version")||r.includes("RapidKit"))){let a=r.match(/v?([\d.]+(?:rc\d+)?(?:a\d+)?(?:b\d+)?)/);if(a){let l=await execa("poetry",["run","rapidkit","list","--json"],{timeout:5e3,reject:false});if(l.exitCode===0)return {status:"ok",message:`RapidKit Core ${a[1]}`,details:"Available via Poetry"};n.push({location:"Poetry",path:"poetry run rapidkit",version:a[1],reason:pt(l.stderr||l.stdout)});}}}catch{}let s=j$1();for(let r of s)try{let c=r==="py"?["-3","-c","import rapidkit_core; print(rapidkit_core.__version__)"]:["-c","import rapidkit_core; print(rapidkit_core.__version__)"],{stdout:a,exitCode:l}=await execa(r,c,{timeout:3e3,reject:false});if(l===0&&a&&!a.includes("Traceback")&&!a.includes("ModuleNotFoundError")){let d=a.trim();if(d){let y=await execa(r,r==="py"?["-3","-m","rapidkit","list","--json"]:["-m","rapidkit","list","--json"],{timeout:5e3,reject:false});if(y.exitCode===0)return {status:"ok",message:`RapidKit Core ${d}`,details:`Available in ${r} environment`};n.push({location:`${r} environment`,path:`${r} -m rapidkit`,version:d,reason:pt(y.stderr||y.stdout)});}}}catch{continue}if(n.length>0){let r=n[0];return {status:"error",message:r.version?`RapidKit Core ${r.version} installed but unusable`:"RapidKit Core installed but unusable",details:`${r.reason} Reinstall or repair this Python environment before running Core-backed commands.`,paths:n.map(({location:c,path:a,version:l})=>({location:c,path:a,...l?{version:l}:{}}))}}return {status:"error",message:"RapidKit Core not installed",details:"Install with: pipx install rapidkit-core"}}function pt(e){let t=e.replace(/\x1b\[[0-9;]*m/g,"").replace(/\s+/g," ").trim();return t?t.length>240?`${t.slice(0,237)}...`:t:"A real Core catalog command failed without diagnostics."}async function Y(e,t,i){let n=await Zt(e);t.hasDocker=n.rootDockerfile||n.nestedDockerfile||n.compose;let o=u.join(e,"tests"),s=u.join(e,"test"),r=u.join(e,"src","test"),c=await m.pathExists(o)||await m.pathExists(s)||await m.pathExists(r),a=false;if(t.framework==="Go/Fiber"||t.framework==="Go/Gin")try{let d=[{dir:e,depth:0}],p=4,y=new Set([".git",".venv","node_modules","dist","build","vendor"]);for(;d.length>0&&!a;){let b=d.shift();if(!b)break;let v=[];try{v=await m.readdir(b.dir);}catch{continue}for(let C of v){let h=u.join(b.dir,C),w;try{w=await m.stat(h);}catch{continue}if(w.isFile()&&C.endsWith("_test.go")){a=true;break}w.isDirectory()&&b.depth<p&&!y.has(C)&&!C.startsWith(".")&&d.push({dir:h,depth:b.depth+1});}}}catch{}let l=await g$2(e);if(t.hasTests=c||a||l.detected,(t.runtimeFamily==="node"||t.runtimeFamily==="bun")&&!t.hasTests&&(t.hasTests=await ei(e,i)),t.runtimeFamily==="python"&&!t.hasTests&&(t.hasTests=await ss(e)),t.runtimeFamily==="node"||t.runtimeFamily==="bun")t.hasCodeQuality=await Qn(e,i);else if(t.framework==="Go/Fiber"||t.framework==="Go/Gin"){let d=u.join(e,".golangci.yml"),p=u.join(e,".golangci.yaml"),y=u.join(e,"Makefile"),b=await m.pathExists(y)&&(await m.readFile(y,"utf8")).includes("golangci-lint");t.hasCodeQuality=await m.pathExists(d)||await m.pathExists(p)||b;}else if(t.runtimeFamily==="python"){let d=u.join(e,"ruff.toml"),p=u.join(e,"pyproject.toml");if(await m.pathExists(p))try{let y=await m.readFile(p,"utf8");t.hasCodeQuality=y.includes("[tool.ruff]")||await m.pathExists(d);}catch{t.hasCodeQuality=await m.pathExists(d);}}else if(t.framework==="Spring Boot"){let d=u.join(e,"pom.xml");if(await m.pathExists(d))try{let p=await m.readFile(d,"utf8");t.hasCodeQuality=p.includes("spotless")||p.includes("checkstyle")||p.includes("pmd")||p.includes("maven-enforcer-plugin");}catch{t.hasCodeQuality=false;}}t.dependencyAudit=await di({projectPath:e,runtime:t.runtimeFamily??"unknown",fresh:t._freshDependencyAudit===true}),t.vulnerabilities=t.dependencyAudit.status==="vulnerable"?t.dependencyAudit.blockingFindingCount??t.dependencyAudit.findingCount??0:void 0;}function ns(e){return Ii([m$2(e),u.join(e,"Scripts","python.exe"),u.join(e,"Scripts","python"),u.join(e,"bin","python"),u.join(e,"bin","python3")])}function is(e){let t=e.indexOf("["),i=e.lastIndexOf("]");if(t<0||i<t)return null;try{let n=JSON.parse(e.slice(t,i+1));return Array.isArray(n)?n:null}catch{return null}}async function Ci(e){for(let t of ns(e.environmentPath)){if(!await m.pathExists(t))continue;let i;try{let n=await execa(t,["-c","import rapidkit_core; print(rapidkit_core.__version__)"],{timeout:2e3,reject:false});n.exitCode===0&&n.stdout.trim()&&(i=n.stdout.trim());}catch{}if(e.frameworkImport)try{if((await execa(t,["-c",`import ${e.frameworkImport}`],{timeout:2e3,reject:false})).exitCode===0)return {interpreter:t,coreVersion:i,dependenciesInstalled:true}}catch{}try{let n=await execa(t,["-m","pip","list","--format=json"],{timeout:5e3,reject:false}),o=is(`${n.stdout??""}
20
20
  ${n.stderr??""}`),s=new Set(["pip","setuptools","wheel"]),r=o?.some(c=>typeof c.name=="string"&&!s.has(c.name.toLowerCase()))??false;return {interpreter:t,coreVersion:i,dependenciesInstalled:r}}catch{return {interpreter:t,coreVersion:i,dependenciesInstalled:false}}}return {dependenciesInstalled:false}}async function os(e){let t=["env","info","--path"],i=[{executable:"poetry",args:t},...j$1().map(o=>({executable:o,args:o==="py"?["-3","-m","poetry",...t]:["-m","poetry",...t]})),...Ni().map(o=>({executable:o,args:t}))],n=new Set;for(let o of i){let s=`${o.executable}\0${o.args.join("\0")}`;if(!n.has(s)&&(n.add(s),!(u.isAbsolute(o.executable)&&!await m.pathExists(o.executable))))try{let r=await execa(o.executable,o.args,{cwd:e,timeout:Math.max(a$9(),15e3),reject:false,shell:c$1()}),c=r.stdout.trim();if(r.exitCode===0&&c&&await m.pathExists(c))return c}catch{}}}async function rs(e,t,i){let n=u.join(e,".venv");if(await m.pathExists(n))return {environmentPath:n,...await Ci({environmentPath:n,frameworkImport:t})};if(i){let o=await os(e);if(o)return {environmentPath:o,...await Ci({environmentPath:o,frameworkImport:t})}}return {dependenciesInstalled:false}}function _(e,t){e.probes||(e.probes=[]);let i=ln(t,new Date().toISOString()),n=i.status==="pass"&&i.repairCapability?{...i,repairCapability:void 0}:i;e.probes.push(n),n.repairCapability&&(e.repairCapabilities||(e.repairCapabilities=[]),e.repairCapabilities.push(n.repairCapability),n.status!=="pass"&&n.repairCapability.status==="available"&&n.repairCapability.canAutoFix&&n.repairCapability.command&&(e.fixCommands=e.fixCommands??[],e.fixCommands.includes(n.repairCapability.command)||e.fixCommands.push(n.repairCapability.command)));}async function ve(e,t){return (await Promise.all(t.map(i=>m.pathExists(u.join(e,i))))).some(Boolean)}async function Li(e){let t=["pyproject.toml","requirements.txt","package.json","go.mod","Cargo.toml","pom.xml","build.gradle","build.gradle.kts","composer.json","Gemfile"],i=[];for(let n of t)try{let o=await m.readFile(u.join(e,n),"utf8");i.push(o.slice(0,256e3));}catch{}return i.join(`
@@ -1 +1 @@
1
- import {a as a$1}from'./chunk-A5FBGRJA.js';import {g as g$1,p}from'./chunk-WPZUKU2B.js';import {g,h}from'./chunk-FE5R6EUV.js';import {t,s}from'./chunk-ODK4LCEL.js';import {s as s$1,q}from'./chunk-RGNCL5OB.js';import {t as t$1}from'./chunk-VQZ5PI5J.js';import a from'path';import {existsSync}from'fs';import m from'fs-extra';var f=t.workspaceRegistry,w=s.workspaceRegistry.schemaVersion;function E(r){return {slug:r.slug,relativePath:r.relativePath,framework:r.framework,kit:r.kit,source:r.source}}async function b(r){let e=t$1(r,"workspace.json").find(t=>existsSync(t));if(!e)return {exists:false,legacyProjectCount:0};try{let t=await m.readJson(e),c=Array.isArray(t.projects)?t.projects.length:0,o=typeof t.workspace_name=="string"&&t.workspace_name.trim()||typeof t.name=="string"&&t.name.trim()||a.basename(r);return {exists:true,manifestPath:e,workspaceName:o,profile:typeof t.profile=="string"?t.profile:void 0,legacyProjectCount:c}}catch{return {exists:true,manifestPath:e,legacyProjectCount:0,workspaceName:a.basename(r)}}}async function _(r){let e=a$1(r);for(let t of s$1())if(await m.pathExists(t))try{let o=((await m.readJson(t)).workspaces||[]).find(s=>a$1(s.path)===e);if(o)return {exists:true,projectCount:Array.isArray(o.projects)?o.projects.length:0,registryPath:t}}catch{continue}return {exists:false,projectCount:0,registryPath:a.join(q(),"workspaces.json")}}async function T(r,e){let t=a.resolve(r),c=await g(t,g$1),o=await b(t),s=await _(t),i=e?.contract!==void 0||!!c,n=[];if(e?.contract)n=e.contract.projects||[];else if(i)try{let{contract:A}=await p({workspacePath:t});n=A.projects||[];}catch{n=[];}let d={contract:{exists:i,projectCount:n.length,path:g$1},globalRegistry:{exists:s.exists,projectCount:s.projectCount,path:s.registryPath},legacyWorkspaceJson:{exists:o.exists,projectCount:o.legacyProjectCount,path:o.manifestPath?a.relative(t,o.manifestPath):void 0}},p$1="none",u=[],y=0;return i?(p$1="workspace.contract.json",u=n.map(E),y=u.length):s.projectCount>0?(p$1="global-registry",y=s.projectCount):o.legacyProjectCount>0&&(p$1="legacy-workspace.json",y=o.legacyProjectCount),{contractExists:i,summary:{schemaVersion:w,kind:"rapidkit.workspace.registry",workspacePath:t,workspaceName:o.workspaceName||a.basename(t),profile:o.profile,projectCount:y,authority:p$1,contractPath:g$1,projects:u,sources:d}}}async function U(r){let e=await g(r,f);if(!e)return null;try{let t=await m.readJson(e);return t?.schemaVersion!==w?null:t}catch{return null}}async function D(r,e){let t=await M(r,e);return await h(r,f,t),t}async function M(r,e){return {...(await T(r,{contract:e?.contract})).summary,generatedAt:(e?.now??new Date).toISOString(),registrySummaryPath:f}}function F(r,e=""){return r.projectCount>0?r.authority==="workspace.contract.json"?`${r.projectCount} project(s) registered in workspace contract${e}.`:r.authority==="global-registry"?`${r.projectCount} project(s) registered in global workspace registry${e}.`:`${r.projectCount} project(s) registered in legacy workspace manifest${e}.`:`Workspace state exists, but no projects are registered yet${e}.`}export{f as a,w as b,T as c,U as d,D as e,M as f,F as g};
1
+ import {a as a$1}from'./chunk-A5FBGRJA.js';import {g as g$1,p}from'./chunk-NNQE4DS2.js';import {g,h}from'./chunk-FE5R6EUV.js';import {t,s}from'./chunk-ODK4LCEL.js';import {s as s$1,q}from'./chunk-RGNCL5OB.js';import {t as t$1}from'./chunk-VQZ5PI5J.js';import a from'path';import {existsSync}from'fs';import m from'fs-extra';var f=t.workspaceRegistry,w=s.workspaceRegistry.schemaVersion;function E(r){return {slug:r.slug,relativePath:r.relativePath,framework:r.framework,kit:r.kit,source:r.source}}async function b(r){let e=t$1(r,"workspace.json").find(t=>existsSync(t));if(!e)return {exists:false,legacyProjectCount:0};try{let t=await m.readJson(e),c=Array.isArray(t.projects)?t.projects.length:0,o=typeof t.workspace_name=="string"&&t.workspace_name.trim()||typeof t.name=="string"&&t.name.trim()||a.basename(r);return {exists:true,manifestPath:e,workspaceName:o,profile:typeof t.profile=="string"?t.profile:void 0,legacyProjectCount:c}}catch{return {exists:true,manifestPath:e,legacyProjectCount:0,workspaceName:a.basename(r)}}}async function _(r){let e=a$1(r);for(let t of s$1())if(await m.pathExists(t))try{let o=((await m.readJson(t)).workspaces||[]).find(s=>a$1(s.path)===e);if(o)return {exists:true,projectCount:Array.isArray(o.projects)?o.projects.length:0,registryPath:t}}catch{continue}return {exists:false,projectCount:0,registryPath:a.join(q(),"workspaces.json")}}async function T(r,e){let t=a.resolve(r),c=await g(t,g$1),o=await b(t),s=await _(t),i=e?.contract!==void 0||!!c,n=[];if(e?.contract)n=e.contract.projects||[];else if(i)try{let{contract:A}=await p({workspacePath:t});n=A.projects||[];}catch{n=[];}let d={contract:{exists:i,projectCount:n.length,path:g$1},globalRegistry:{exists:s.exists,projectCount:s.projectCount,path:s.registryPath},legacyWorkspaceJson:{exists:o.exists,projectCount:o.legacyProjectCount,path:o.manifestPath?a.relative(t,o.manifestPath):void 0}},p$1="none",u=[],y=0;return i?(p$1="workspace.contract.json",u=n.map(E),y=u.length):s.projectCount>0?(p$1="global-registry",y=s.projectCount):o.legacyProjectCount>0&&(p$1="legacy-workspace.json",y=o.legacyProjectCount),{contractExists:i,summary:{schemaVersion:w,kind:"rapidkit.workspace.registry",workspacePath:t,workspaceName:o.workspaceName||a.basename(t),profile:o.profile,projectCount:y,authority:p$1,contractPath:g$1,projects:u,sources:d}}}async function U(r){let e=await g(r,f);if(!e)return null;try{let t=await m.readJson(e);return t?.schemaVersion!==w?null:t}catch{return null}}async function D(r,e){let t=await M(r,e);return await h(r,f,t),t}async function M(r,e){return {...(await T(r,{contract:e?.contract})).summary,generatedAt:(e?.now??new Date).toISOString(),registrySummaryPath:f}}function F(r,e=""){return r.projectCount>0?r.authority==="workspace.contract.json"?`${r.projectCount} project(s) registered in workspace contract${e}.`:r.authority==="global-registry"?`${r.projectCount} project(s) registered in global workspace registry${e}.`:`${r.projectCount} project(s) registered in legacy workspace manifest${e}.`:`Workspace state exists, but no projects are registered yet${e}.`}export{f as a,w as b,T as c,U as d,D as e,M as f,F as g};
@@ -1 +1 @@
1
- import {f}from'./chunk-X5ZNFXFI.js';import a from'path';import d from'fs-extra';var b=4,C="workspace-graph-token-efficiency.v1";function k(e){return Math.ceil(e/b)}function y(e,o){let n=a.resolve(e,o),t=a.relative(e,n);return !t||t.startsWith("..")||a.isAbsolute(t)?null:n}async function P(e){let o=new Map,n=[a.join(e,".workspai","workspace.contract.json"),a.join(e,".rapidkit","workspace.contract.json")];for(let t of n)if(await d.pathExists(t))try{let s=await d.readJson(t);for(let r of s.projects??[])typeof r.relativePath=="string"&&typeof r.externalPath=="string"&&a.isAbsolute(r.externalPath)&&o.set(r.relativePath.replace(/\\/g,"/").replace(/\/$/,""),r.externalPath);break}catch{}return o}function A(e,o,n){if(!o||a.isAbsolute(o))return null;let t=a.resolve(e),s=o.replace(/\\/g,"/");for(let[r,c]of [...n.entries()].sort(([u],[l])=>l.length-u.length))if(s.startsWith(`${r}/`))return y(c,s.slice(r.length+1));return y(t,s)}async function S(e){let o=a.resolve(e.workspacePath),n=f(e.graph,{query:e.query,...e.kind?{kind:e.kind}:{},...e.projectId?{projectId:e.projectId}:{},limit:e.limit,projection:"agent"}),t=e.corpus;if(!t){let l=[...new Set(e.graph.proofs.map(i=>i.artifact))].sort(),p=[],v=await P(o),h=0,g=0;for(let i of l){let f=A(o,i,v);if(!f){p.push(i);continue}try{let w=await d.readFile(f,"utf8");h+=w.length,g+=1;}catch{p.push(i);}}t={artifactCount:g,characterCount:h,estimatedTokens:k(h),unreadableArtifacts:p};}let s=JSON.stringify(n).length,r=t.estimatedTokens,c=k(s),u=Math.max(0,r-c);return {schemaVersion:C,generatedAt:(e.now??new Date).toISOString(),workspacePath:o,query:e.query,graph:{schemaVersion:e.graph.schemaVersion,sourceArtifact:e.graph.source.artifact,sourceHash:e.graph.source.hash,entityCount:e.graph.entities.length,relationCount:e.graph.relations.length,proofCount:e.graph.proofs.length},methodology:{id:"indexed-corpus-vs-bounded-retrieval.v1",estimated:true,charsPerToken:b,claimBoundary:"Measures retrieval payload reduction against readable proof-source text; it does not claim equivalent answer quality or model-specific billing savings."},corpus:t,retrieval:{matchCount:n.entities.length,characterCount:s,estimatedTokens:c,truncated:n.truncated,payload:n},savings:{estimatedTokensAvoided:u,reductionRatio:c===0?0:Number((r/c).toFixed(2)),reductionPercent:r===0?0:Number((u/r*100).toFixed(2))}}}export{C as a,S as b};
1
+ import {f}from'./chunk-7O7P4MRD.js';import a from'path';import d from'fs-extra';var b=4,C="workspace-graph-token-efficiency.v1";function k(e){return Math.ceil(e/b)}function y(e,o){let n=a.resolve(e,o),t=a.relative(e,n);return !t||t.startsWith("..")||a.isAbsolute(t)?null:n}async function P(e){let o=new Map,n=[a.join(e,".workspai","workspace.contract.json"),a.join(e,".rapidkit","workspace.contract.json")];for(let t of n)if(await d.pathExists(t))try{let s=await d.readJson(t);for(let r of s.projects??[])typeof r.relativePath=="string"&&typeof r.externalPath=="string"&&a.isAbsolute(r.externalPath)&&o.set(r.relativePath.replace(/\\/g,"/").replace(/\/$/,""),r.externalPath);break}catch{}return o}function A(e,o,n){if(!o||a.isAbsolute(o))return null;let t=a.resolve(e),s=o.replace(/\\/g,"/");for(let[r,c]of [...n.entries()].sort(([u],[l])=>l.length-u.length))if(s.startsWith(`${r}/`))return y(c,s.slice(r.length+1));return y(t,s)}async function S(e){let o=a.resolve(e.workspacePath),n=f(e.graph,{query:e.query,...e.kind?{kind:e.kind}:{},...e.projectId?{projectId:e.projectId}:{},limit:e.limit,projection:"agent"}),t=e.corpus;if(!t){let l=[...new Set(e.graph.proofs.map(i=>i.artifact))].sort(),p=[],v=await P(o),h=0,g=0;for(let i of l){let f=A(o,i,v);if(!f){p.push(i);continue}try{let w=await d.readFile(f,"utf8");h+=w.length,g+=1;}catch{p.push(i);}}t={artifactCount:g,characterCount:h,estimatedTokens:k(h),unreadableArtifacts:p};}let s=JSON.stringify(n).length,r=t.estimatedTokens,c=k(s),u=Math.max(0,r-c);return {schemaVersion:C,generatedAt:(e.now??new Date).toISOString(),workspacePath:o,query:e.query,graph:{schemaVersion:e.graph.schemaVersion,sourceArtifact:e.graph.source.artifact,sourceHash:e.graph.source.hash,entityCount:e.graph.entities.length,relationCount:e.graph.relations.length,proofCount:e.graph.proofs.length},methodology:{id:"indexed-corpus-vs-bounded-retrieval.v1",estimated:true,charsPerToken:b,claimBoundary:"Measures retrieval payload reduction against readable proof-source text; it does not claim equivalent answer quality or model-specific billing savings."},corpus:t,retrieval:{matchCount:n.entities.length,characterCount:s,estimatedTokens:c,truncated:n.truncated,payload:n},savings:{estimatedTokensAvoided:u,reductionRatio:c===0?0:Number((r/c).toFixed(2)),reductionPercent:r===0?0:Number((u/r*100).toFixed(2))}}}export{C as a,S as b};
@@ -1,4 +1,4 @@
1
- import {a as a$1,b as b$2}from'./chunk-X7FYEKLI.js';import {c,d as d$1}from'./chunk-N4B2M44I.js';import {f as f$1,e}from'./chunk-NSH7TTSV.js';import {a,b}from'./chunk-MGL6DBOR.js';import {j as j$1,i}from'./chunk-SATPH22S.js';import {a as a$2,h}from'./chunk-FE5R6EUV.js';import {b as b$1}from'./chunk-K33JJVQZ.js';import {q as q$1,p as p$1}from'./chunk-ODK4LCEL.js';import {t}from'./chunk-VQZ5PI5J.js';import p from'chalk';import d from'fs';import f from'path';var K=p$1.readiness;function H(n){return n.vulnerableDependencies>0?`${n.vulnerableDependencies} known dependency vulnerability finding(s) reported`:`${n.blockingFindings} blocking dependency/security finding(s) reported`}var U=q$1.readiness;function q(n){let e=j(n,"workspace.contract.json");if(!d.existsSync(e))return [];try{let t=JSON.parse(d.readFileSync(e,"utf-8"));return (Array.isArray(t.projects)?t.projects:[]).map(i=>{let c=v(i),o=typeof c.externalPath=="string"?c.externalPath.trim():"",s=typeof c.relativePath=="string"?c.relativePath.trim():"",r=o||s;return r?f.resolve(n,r):""}).filter(Boolean)}catch{return []}}function B(n,e){let t=f.resolve(n);if(!b(t))return t;let a=j(e,"workspace.contract.json");if(d.existsSync(a))try{let o=JSON.parse(d.readFileSync(a,"utf-8")),s=Array.isArray(o.projects)?o.projects:[];for(let r of s){let y=v(r),m=typeof y.externalPath=="string"?y.externalPath.trim():"";if(m)return f.resolve(e,m);let g=typeof y.relativePath=="string"?y.relativePath.trim():"";if(g)return f.join(e,g)}}catch{}let i=M(e),c=Array.isArray(i.payload?.projects)?i.payload.projects:[];for(let o of c){let s=v(o),r=typeof s.path=="string"?s.path.trim():"";if(r)return f.resolve(r)}return t}function z(n){let e=j$1(n);return i(e,n)}function _(n,e){if(!d.existsSync(n))return null;let t=d.readdirSync(n).filter(a=>a.endsWith(".json")&&e.some(i=>i.test(a))).map(a=>f.join(n,a));return t.length===0?null:(t.sort((a,i)=>d.statSync(i).mtimeMs-d.statSync(a).mtimeMs),t[0])}function v(n){return n&&typeof n=="object"&&!Array.isArray(n)?n:{}}function J(n){for(let e of n)if(d.existsSync(e))return e;return null}function j(n,...e){let t$1=t(n,...e);return J(t$1)??t$1[0]}function A(n,e){let t=a$2(n,`.workspai/reports/${e}`);return J([t,f.join(n,".rapidkit","reports",e)])??t}async function Q(n){let{readWorkspaceRegistrySummary:e,resolveWorkspaceRegisteredProjects:t}=await import('./workspace-registry-summary-WKENOFEA.js'),a=await e(n);return a?a.projectCount:(await t(n)).summary.projectCount}function X(n,e,t){let a=j(n,"toolchain.lock");if(!d.existsSync(a))return {gate:"env",status:"fail",summary:"toolchain.lock is missing",details:["Run workspai bootstrap to pin runtime versions and generate a reproducible toolchain."],evidencePath:a};try{let i=JSON.parse(d.readFileSync(a,"utf-8")),c=v(i.runtime),o=["python","node","go","java","dotnet","rust","php"],s=o.filter(l=>{let u=v(c[l]);return typeof u.version=="string"&&u.version.trim().length>0});if(s.length===0)return {gate:"env",status:"fail",summary:"No runtime versions are pinned in toolchain.lock",details:["Pin at least one runtime version via workspai setup <runtime> and re-run bootstrap."],evidencePath:a};let r=[...new Set((Array.isArray(e)?e:[e]).filter(l=>l!=="unknown"))],y=r.filter(l=>o.includes(l)),m=r.filter(l=>!o.includes(l)),g=y.filter(l=>{let u=v(c[l]);return typeof u.version!="string"||u.version.trim().length===0});return g.length>0?{gate:"env",status:"fail",summary:`${t?.hasRegisteredProjects?"Project runtime":"Workspace"}${g.length===1?"":"s"} (${g.join(", ")}) ${g.length===1?"is":"are"} not pinned in toolchain.lock`,details:g.map(u=>`Run workspai setup ${u} and workspai bootstrap to lock ${u} for this workspace.`),evidencePath:a}:m.length>0?{gate:"env",status:"warn",summary:`${t?.hasRegisteredProjects?"Project runtime":"Workspace"}${m.length===1?"":"s"} (${m.join(", ")}) cannot be verified by toolchain.lock`,details:[`Pinned Workspai runtimes (${s.join(", ")}) do not prove the ${m.join(", ")} compiler or runtime toolchain.`,"Declare and verify this runtime or toolchain through the project command contract or organization CI policy."],evidencePath:a}:{gate:"env",status:"pass",summary:`Pinned runtimes: ${s.join(", ")}`,details:[],evidencePath:a}}catch{return {gate:"env",status:"fail",summary:"toolchain.lock is invalid JSON",details:["Regenerate lockfile with workspai bootstrap."],evidencePath:a}}}function M(n){let e=A(n,"doctor-last-run.json");if(!d.existsSync(e))return {payload:null,path:e};try{let t=JSON.parse(d.readFileSync(e,"utf-8"));return c(t,"workspace")?(d$1(t),{payload:t,path:e}):{payload:null,path:e}}catch{return {payload:null,path:e}}}function Y(n){let e=M(n);if(!e.payload)return {gate:{gate:"doctor",status:"fail",summary:"Doctor evidence is missing",details:["Run workspai doctor workspace --json before release readiness checks."],evidencePath:e.path},payload:null};let t=a$1(e.payload);if(t.hasSystemErrors)return {gate:{gate:"doctor",status:"fail",summary:"Doctor reported system errors",details:["Resolve system-level doctor errors before proceeding."],evidencePath:e.path},payload:e.payload};if(t.blockingFindings>0)return {gate:{gate:"doctor",status:"fail",summary:`Doctor reported ${t.blockingFindings} blocking finding(s)`,details:["Resolve the canonical Doctor findings and regenerate fresh Doctor evidence."],evidencePath:e.path},payload:e.payload};let a=[...t.advisoryFindings>0?[`${t.advisoryFindings} advisory finding(s)`]:[],...t.unknownFindings>0?[`${t.unknownFindings} unknown finding(s)`]:[],...t.contradictionCount>0?[`${t.contradictionCount} evidence contradiction(s)`]:[],...t.missingDiagnosisProjects>0?[`${t.missingDiagnosisProjects} project(s) without canonical diagnosis`]:[],...t.staleEvidence?["stale Doctor evidence"]:[],...t.unknownFreshness?["unknown Doctor evidence freshness"]:[],...t.minimumDiagnosisCompleteness<100?[`diagnosis completeness ${t.minimumDiagnosisCompleteness}%`]:[]];return a.length>0?{gate:{gate:"doctor",status:"warn",summary:"Doctor evidence requires attention",details:a,evidencePath:e.path},payload:e.payload}:{gate:{gate:"doctor",status:"pass",summary:"Doctor checks passed without issues",details:[],evidencePath:e.path},payload:e.payload}}function Z(n){let e=A(n,"analyze-last-run.json");if(!d.existsSync(e))return {gate:"analyze",status:"fail",summary:"Analyze evidence is missing",details:["Run workspai analyze --json before release readiness checks."],evidencePath:e};try{let t=JSON.parse(d.readFileSync(e,"utf-8"));b$1(p$1.analyze,t,e);let a=v(t.summary),i=String(a.verdict??"").toLowerCase(),c=Number(a.score??0),o=v(a.findings),s=Number(o.fail??0);return i==="blocked"||s>0?{gate:"analyze",status:"fail",summary:`Analyze verdict is blocked (score ${c}/100)`,details:["Resolve analyze findings and regenerate analyze-last-run.json."],evidencePath:e}:i==="needs-attention"?{gate:"analyze",status:"warn",summary:`Analyze needs attention (score ${c}/100)`,details:["Review analyze warnings before release."],evidencePath:e}:{gate:"analyze",status:"pass",summary:`Analyze passed (score ${c}/100)`,details:[],evidencePath:e}}catch{return {gate:"analyze",status:"fail",summary:"Analyze evidence is invalid or violates its contract",details:["Re-run workspai analyze --json to regenerate evidence."],evidencePath:e}}}function ee(n){try{let e=JSON.parse(d.readFileSync(n,"utf-8")),t=String(e.status??"").toLowerCase(),a=v(e.summary),i=Number(a.failedChecks??0);return t==="fail"||i>0?{gate:"verify",status:"fail",summary:"Verify-pack contract reports failed checks",details:["Fix failed verify checks and regenerate verify-pack contract evidence."],evidencePath:n}:t==="pass"?{gate:"verify",status:"pass",summary:"Verify-pack contract passed",details:[],evidencePath:n}:{gate:"verify",status:"warn",summary:"Verify-pack contract status is not explicit",details:["Ensure contract status is pass/fail and keep schema aligned with v1 contract."],evidencePath:n}}catch{return {gate:"verify",status:"fail",summary:"Verify-pack contract is invalid JSON",details:["Regenerate verify-pack contract artifact."],evidencePath:n}}}async function te(n,e){if(e.skipVerify)return {gate:"verify",status:"pass",summary:"Verify gate skipped (--skip-verify)",details:["Verification was explicitly skipped for this readiness run."]};let t=[a$2(n,".workspai/reports"),f.join(n,".rapidkit","reports")],a=t[0],i=t.map(s=>_(s,[/verify-pack-contract/i,/^verify.*\.json$/i])).find(s=>typeof s=="string")??null;if(i)return ee(i);let c=a$2(n,p$1.contractVerify),o=t.map(s=>_(s,[/workspace-contract-verify-last-run/i,/workspace-contract-verify/i])).find(s=>typeof s=="string")??null;if(o)try{let s=JSON.parse(d.readFileSync(o,"utf-8")),r=String(s.status??"").toLowerCase();if(r==="passed"||r==="pass")return {gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI cache)",details:[],evidencePath:o};if(r==="failed"||r==="fail")return {gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI cache)",details:(Array.isArray(s.violations)?s.violations:[]).slice(0,5),evidencePath:o}}catch{}try{let{verifyWorkspaceContract:s}=await import('./workspace-contract-E7GVWM7W.js'),r=await s({workspacePath:n}),y={schemaVersion:"v1",source:"cli",generatedAt:new Date().toISOString(),status:r.status,contractPath:r.contractPath,projectCount:r.projectCount,checks:r.checks,violations:r.violations};return await h(n,p$1.contractVerify,y),r.status==="failed"?{gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI)",details:r.violations.slice(0,5),evidencePath:c}:{gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI)",details:[],evidencePath:c}}catch(s){return {gate:"verify",status:"fail",summary:"No verify evidence and workspace contract verification unavailable",details:["Run workspai workspace contract verify --json or export verify-pack contract from CI.",s instanceof Error?s.message:String(s)],evidencePath:f.join(a,"*verify*.json")}}}function ne(n,e){let t=A(e,"doctor-last-run.json");if(!n)return {gate:"dependency",status:"warn",summary:"Dependency risk check skipped (doctor evidence missing)",details:["Run workspai doctor workspace --json to include dependency findings."],evidencePath:t};let a=b$2(n);return a.blockingFindings>0||a.vulnerableDependencies>0?{gate:"dependency",status:"fail",summary:H(a),details:["Resolve the typed dependency/security findings and regenerate focused audit evidence."],evidencePath:t}:a.auditFailed>0?{gate:"dependency",status:"fail",summary:`${a.auditFailed} dependency audit(s) failed`,details:["Repair the audit runner or dependency environment; failed audits are not clean."],evidencePath:t}:a.missingDependencies>0||a.auditUnavailable>0||a.unknownFindings>0||a.advisoryFindings>0?{gate:"dependency",status:"warn",summary:"Dependency evidence is incomplete or requires attention",details:[...a.missingDependencies>0?[`${a.missingDependencies} project(s) have no materialized dependency tree.`]:[],...a.auditUnavailable>0?[`${a.auditUnavailable} audit provider(s) are unavailable or unsupported.`]:[],...a.unknownFindings>0?[`${a.unknownFindings} dependency/security finding(s) remain unknown.`]:[],...a.advisoryFindings>0?[`${a.advisoryFindings} dependency/security advisory finding(s) remain.`]:[]],evidencePath:t}:{gate:"dependency",status:"pass",summary:"No dependency vulnerabilities reported",details:[],evidencePath:t}}function ae(n){return n.some(e=>e.status==="fail")?"fail":n.some(e=>e.status==="warn")?"warn":"pass"}async function se(n,e){return h(n,K,e)}async function re(n={}){let e$1=f.resolve(n.startPath??process.cwd()),t=a(e$1)??e$1,a$1=await Q(t)>0,i=a$1&&b(e$1)?t:B(e$1,t),c=i===t?"unknown":z(i),o=a$1?c:"unknown";if(a$1&&i===t){let{resolveWorkspaceRegisteredProjects:h}=await import('./workspace-registry-summary-WKENOFEA.js'),T=await h(t),E=q(t);o=(E.length>0?E:T.summary.projects.map(w=>f.resolve(t,w.relativePath))).map(w=>z(w));}let s=X(t,o,{hasRegisteredProjects:a$1}),r=Y(t),y=Z(t),m=await te(t,{skipVerify:n.skipVerify}),g=ne(r.payload,t),l=[s,r.gate,y,m,g],u=ae(l),k={schemaVersion:U,generatedAt:new Date().toISOString(),workspacePath:t,projectPath:i,action:n.action,overallStatus:u,blocking:u==="fail",blockingReasons:l.filter(h=>h.status==="fail").map(h=>`${h.gate}: ${h.summary}`),gates:l};if(n.writeReport!==false){let h=f$1(k,{commandId:"workspaceReadiness",exitCode:u==="fail"?2:u==="warn"?1:0,generatedAt:k.generatedAt,blockers:k.blockingReasons,runId:e()});k.evidencePath=await se(t,h);}return k}function ie(n){return n==="pass"?p.green("PASS"):n==="warn"?p.yellow("WARN"):p.red("FAIL")}function oe(n){return n==="pass"?p.green("PASS"):n==="warn"?p.yellow("WARN"):p.red("FAIL")}async function Se(n){let e=await re({startPath:n.workspace,writeReport:true,skipVerify:n.skipVerify===true});if(n.json)console.log(JSON.stringify(e,null,2));else {console.log(p.bold.cyan(`
1
+ import {a as a$1,b as b$2}from'./chunk-X7FYEKLI.js';import {c,d as d$1}from'./chunk-N4B2M44I.js';import {f as f$1,e}from'./chunk-NSH7TTSV.js';import {a,b}from'./chunk-MGL6DBOR.js';import {j as j$1,i}from'./chunk-LGC4CRUF.js';import {a as a$2,h}from'./chunk-FE5R6EUV.js';import {b as b$1}from'./chunk-K33JJVQZ.js';import {q as q$1,p as p$1}from'./chunk-ODK4LCEL.js';import {t}from'./chunk-VQZ5PI5J.js';import p from'chalk';import d from'fs';import f from'path';var K=p$1.readiness;function H(n){return n.vulnerableDependencies>0?`${n.vulnerableDependencies} known dependency vulnerability finding(s) reported`:`${n.blockingFindings} blocking dependency/security finding(s) reported`}var U=q$1.readiness;function q(n){let e=j(n,"workspace.contract.json");if(!d.existsSync(e))return [];try{let t=JSON.parse(d.readFileSync(e,"utf-8"));return (Array.isArray(t.projects)?t.projects:[]).map(i=>{let c=v(i),o=typeof c.externalPath=="string"?c.externalPath.trim():"",s=typeof c.relativePath=="string"?c.relativePath.trim():"",r=o||s;return r?f.resolve(n,r):""}).filter(Boolean)}catch{return []}}function B(n,e){let t=f.resolve(n);if(!b(t))return t;let a=j(e,"workspace.contract.json");if(d.existsSync(a))try{let o=JSON.parse(d.readFileSync(a,"utf-8")),s=Array.isArray(o.projects)?o.projects:[];for(let r of s){let y=v(r),m=typeof y.externalPath=="string"?y.externalPath.trim():"";if(m)return f.resolve(e,m);let g=typeof y.relativePath=="string"?y.relativePath.trim():"";if(g)return f.join(e,g)}}catch{}let i=M(e),c=Array.isArray(i.payload?.projects)?i.payload.projects:[];for(let o of c){let s=v(o),r=typeof s.path=="string"?s.path.trim():"";if(r)return f.resolve(r)}return t}function z(n){let e=j$1(n);return i(e,n)}function _(n,e){if(!d.existsSync(n))return null;let t=d.readdirSync(n).filter(a=>a.endsWith(".json")&&e.some(i=>i.test(a))).map(a=>f.join(n,a));return t.length===0?null:(t.sort((a,i)=>d.statSync(i).mtimeMs-d.statSync(a).mtimeMs),t[0])}function v(n){return n&&typeof n=="object"&&!Array.isArray(n)?n:{}}function J(n){for(let e of n)if(d.existsSync(e))return e;return null}function j(n,...e){let t$1=t(n,...e);return J(t$1)??t$1[0]}function A(n,e){let t=a$2(n,`.workspai/reports/${e}`);return J([t,f.join(n,".rapidkit","reports",e)])??t}async function Q(n){let{readWorkspaceRegistrySummary:e,resolveWorkspaceRegisteredProjects:t}=await import('./workspace-registry-summary-CBZDSG6I.js'),a=await e(n);return a?a.projectCount:(await t(n)).summary.projectCount}function X(n,e,t){let a=j(n,"toolchain.lock");if(!d.existsSync(a))return {gate:"env",status:"fail",summary:"toolchain.lock is missing",details:["Run workspai bootstrap to pin runtime versions and generate a reproducible toolchain."],evidencePath:a};try{let i=JSON.parse(d.readFileSync(a,"utf-8")),c=v(i.runtime),o=["python","node","go","java","dotnet","rust","php"],s=o.filter(l=>{let u=v(c[l]);return typeof u.version=="string"&&u.version.trim().length>0});if(s.length===0)return {gate:"env",status:"fail",summary:"No runtime versions are pinned in toolchain.lock",details:["Pin at least one runtime version via workspai setup <runtime> and re-run bootstrap."],evidencePath:a};let r=[...new Set((Array.isArray(e)?e:[e]).filter(l=>l!=="unknown"))],y=r.filter(l=>o.includes(l)),m=r.filter(l=>!o.includes(l)),g=y.filter(l=>{let u=v(c[l]);return typeof u.version!="string"||u.version.trim().length===0});return g.length>0?{gate:"env",status:"fail",summary:`${t?.hasRegisteredProjects?"Project runtime":"Workspace"}${g.length===1?"":"s"} (${g.join(", ")}) ${g.length===1?"is":"are"} not pinned in toolchain.lock`,details:g.map(u=>`Run workspai setup ${u} and workspai bootstrap to lock ${u} for this workspace.`),evidencePath:a}:m.length>0?{gate:"env",status:"warn",summary:`${t?.hasRegisteredProjects?"Project runtime":"Workspace"}${m.length===1?"":"s"} (${m.join(", ")}) cannot be verified by toolchain.lock`,details:[`Pinned Workspai runtimes (${s.join(", ")}) do not prove the ${m.join(", ")} compiler or runtime toolchain.`,"Declare and verify this runtime or toolchain through the project command contract or organization CI policy."],evidencePath:a}:{gate:"env",status:"pass",summary:`Pinned runtimes: ${s.join(", ")}`,details:[],evidencePath:a}}catch{return {gate:"env",status:"fail",summary:"toolchain.lock is invalid JSON",details:["Regenerate lockfile with workspai bootstrap."],evidencePath:a}}}function M(n){let e=A(n,"doctor-last-run.json");if(!d.existsSync(e))return {payload:null,path:e};try{let t=JSON.parse(d.readFileSync(e,"utf-8"));return c(t,"workspace")?(d$1(t),{payload:t,path:e}):{payload:null,path:e}}catch{return {payload:null,path:e}}}function Y(n){let e=M(n);if(!e.payload)return {gate:{gate:"doctor",status:"fail",summary:"Doctor evidence is missing",details:["Run workspai doctor workspace --json before release readiness checks."],evidencePath:e.path},payload:null};let t=a$1(e.payload);if(t.hasSystemErrors)return {gate:{gate:"doctor",status:"fail",summary:"Doctor reported system errors",details:["Resolve system-level doctor errors before proceeding."],evidencePath:e.path},payload:e.payload};if(t.blockingFindings>0)return {gate:{gate:"doctor",status:"fail",summary:`Doctor reported ${t.blockingFindings} blocking finding(s)`,details:["Resolve the canonical Doctor findings and regenerate fresh Doctor evidence."],evidencePath:e.path},payload:e.payload};let a=[...t.advisoryFindings>0?[`${t.advisoryFindings} advisory finding(s)`]:[],...t.unknownFindings>0?[`${t.unknownFindings} unknown finding(s)`]:[],...t.contradictionCount>0?[`${t.contradictionCount} evidence contradiction(s)`]:[],...t.missingDiagnosisProjects>0?[`${t.missingDiagnosisProjects} project(s) without canonical diagnosis`]:[],...t.staleEvidence?["stale Doctor evidence"]:[],...t.unknownFreshness?["unknown Doctor evidence freshness"]:[],...t.minimumDiagnosisCompleteness<100?[`diagnosis completeness ${t.minimumDiagnosisCompleteness}%`]:[]];return a.length>0?{gate:{gate:"doctor",status:"warn",summary:"Doctor evidence requires attention",details:a,evidencePath:e.path},payload:e.payload}:{gate:{gate:"doctor",status:"pass",summary:"Doctor checks passed without issues",details:[],evidencePath:e.path},payload:e.payload}}function Z(n){let e=A(n,"analyze-last-run.json");if(!d.existsSync(e))return {gate:"analyze",status:"fail",summary:"Analyze evidence is missing",details:["Run workspai analyze --json before release readiness checks."],evidencePath:e};try{let t=JSON.parse(d.readFileSync(e,"utf-8"));b$1(p$1.analyze,t,e);let a=v(t.summary),i=String(a.verdict??"").toLowerCase(),c=Number(a.score??0),o=v(a.findings),s=Number(o.fail??0);return i==="blocked"||s>0?{gate:"analyze",status:"fail",summary:`Analyze verdict is blocked (score ${c}/100)`,details:["Resolve analyze findings and regenerate analyze-last-run.json."],evidencePath:e}:i==="needs-attention"?{gate:"analyze",status:"warn",summary:`Analyze needs attention (score ${c}/100)`,details:["Review analyze warnings before release."],evidencePath:e}:{gate:"analyze",status:"pass",summary:`Analyze passed (score ${c}/100)`,details:[],evidencePath:e}}catch{return {gate:"analyze",status:"fail",summary:"Analyze evidence is invalid or violates its contract",details:["Re-run workspai analyze --json to regenerate evidence."],evidencePath:e}}}function ee(n){try{let e=JSON.parse(d.readFileSync(n,"utf-8")),t=String(e.status??"").toLowerCase(),a=v(e.summary),i=Number(a.failedChecks??0);return t==="fail"||i>0?{gate:"verify",status:"fail",summary:"Verify-pack contract reports failed checks",details:["Fix failed verify checks and regenerate verify-pack contract evidence."],evidencePath:n}:t==="pass"?{gate:"verify",status:"pass",summary:"Verify-pack contract passed",details:[],evidencePath:n}:{gate:"verify",status:"warn",summary:"Verify-pack contract status is not explicit",details:["Ensure contract status is pass/fail and keep schema aligned with v1 contract."],evidencePath:n}}catch{return {gate:"verify",status:"fail",summary:"Verify-pack contract is invalid JSON",details:["Regenerate verify-pack contract artifact."],evidencePath:n}}}async function te(n,e){if(e.skipVerify)return {gate:"verify",status:"pass",summary:"Verify gate skipped (--skip-verify)",details:["Verification was explicitly skipped for this readiness run."]};let t=[a$2(n,".workspai/reports"),f.join(n,".rapidkit","reports")],a=t[0],i=t.map(s=>_(s,[/verify-pack-contract/i,/^verify.*\.json$/i])).find(s=>typeof s=="string")??null;if(i)return ee(i);let c=a$2(n,p$1.contractVerify),o=t.map(s=>_(s,[/workspace-contract-verify-last-run/i,/workspace-contract-verify/i])).find(s=>typeof s=="string")??null;if(o)try{let s=JSON.parse(d.readFileSync(o,"utf-8")),r=String(s.status??"").toLowerCase();if(r==="passed"||r==="pass")return {gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI cache)",details:[],evidencePath:o};if(r==="failed"||r==="fail")return {gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI cache)",details:(Array.isArray(s.violations)?s.violations:[]).slice(0,5),evidencePath:o}}catch{}try{let{verifyWorkspaceContract:s}=await import('./workspace-contract-2V2BI6A3.js'),r=await s({workspacePath:n}),y={schemaVersion:"v1",source:"cli",generatedAt:new Date().toISOString(),status:r.status,contractPath:r.contractPath,projectCount:r.projectCount,checks:r.checks,violations:r.violations};return await h(n,p$1.contractVerify,y),r.status==="failed"?{gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI)",details:r.violations.slice(0,5),evidencePath:c}:{gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI)",details:[],evidencePath:c}}catch(s){return {gate:"verify",status:"fail",summary:"No verify evidence and workspace contract verification unavailable",details:["Run workspai workspace contract verify --json or export verify-pack contract from CI.",s instanceof Error?s.message:String(s)],evidencePath:f.join(a,"*verify*.json")}}}function ne(n,e){let t=A(e,"doctor-last-run.json");if(!n)return {gate:"dependency",status:"warn",summary:"Dependency risk check skipped (doctor evidence missing)",details:["Run workspai doctor workspace --json to include dependency findings."],evidencePath:t};let a=b$2(n);return a.blockingFindings>0||a.vulnerableDependencies>0?{gate:"dependency",status:"fail",summary:H(a),details:["Resolve the typed dependency/security findings and regenerate focused audit evidence."],evidencePath:t}:a.auditFailed>0?{gate:"dependency",status:"fail",summary:`${a.auditFailed} dependency audit(s) failed`,details:["Repair the audit runner or dependency environment; failed audits are not clean."],evidencePath:t}:a.missingDependencies>0||a.auditUnavailable>0||a.unknownFindings>0||a.advisoryFindings>0?{gate:"dependency",status:"warn",summary:"Dependency evidence is incomplete or requires attention",details:[...a.missingDependencies>0?[`${a.missingDependencies} project(s) have no materialized dependency tree.`]:[],...a.auditUnavailable>0?[`${a.auditUnavailable} audit provider(s) are unavailable or unsupported.`]:[],...a.unknownFindings>0?[`${a.unknownFindings} dependency/security finding(s) remain unknown.`]:[],...a.advisoryFindings>0?[`${a.advisoryFindings} dependency/security advisory finding(s) remain.`]:[]],evidencePath:t}:{gate:"dependency",status:"pass",summary:"No dependency vulnerabilities reported",details:[],evidencePath:t}}function ae(n){return n.some(e=>e.status==="fail")?"fail":n.some(e=>e.status==="warn")?"warn":"pass"}async function se(n,e){return h(n,K,e)}async function re(n={}){let e$1=f.resolve(n.startPath??process.cwd()),t=a(e$1)??e$1,a$1=await Q(t)>0,i=a$1&&b(e$1)?t:B(e$1,t),c=i===t?"unknown":z(i),o=a$1?c:"unknown";if(a$1&&i===t){let{resolveWorkspaceRegisteredProjects:h}=await import('./workspace-registry-summary-CBZDSG6I.js'),T=await h(t),E=q(t);o=(E.length>0?E:T.summary.projects.map(w=>f.resolve(t,w.relativePath))).map(w=>z(w));}let s=X(t,o,{hasRegisteredProjects:a$1}),r=Y(t),y=Z(t),m=await te(t,{skipVerify:n.skipVerify}),g=ne(r.payload,t),l=[s,r.gate,y,m,g],u=ae(l),k={schemaVersion:U,generatedAt:new Date().toISOString(),workspacePath:t,projectPath:i,action:n.action,overallStatus:u,blocking:u==="fail",blockingReasons:l.filter(h=>h.status==="fail").map(h=>`${h.gate}: ${h.summary}`),gates:l};if(n.writeReport!==false){let h=f$1(k,{commandId:"workspaceReadiness",exitCode:u==="fail"?2:u==="warn"?1:0,generatedAt:k.generatedAt,blockers:k.blockingReasons,runId:e()});k.evidencePath=await se(t,h);}return k}function ie(n){return n==="pass"?p.green("PASS"):n==="warn"?p.yellow("WARN"):p.red("FAIL")}function oe(n){return n==="pass"?p.green("PASS"):n==="warn"?p.yellow("WARN"):p.red("FAIL")}async function Se(n){let e=await re({startPath:n.workspace,writeReport:true,skipVerify:n.skipVerify===true});if(n.json)console.log(JSON.stringify(e,null,2));else {console.log(p.bold.cyan(`
2
2
  \u{1F6A6} Workspai Release Readiness
3
3
  `)),console.log(p.bold(`Workspace: ${p.cyan(f.basename(e.workspacePath))}`)),console.log(p.gray(`Path: ${e.workspacePath}`)),console.log(`Overall: ${oe(e.overallStatus)}`);for(let t of e.gates){console.log(` - ${t.gate}: ${ie(t.status)} ${t.summary}`);for(let a of t.details)console.log(p.gray(` ${a}`));t.evidencePath&&console.log(p.gray(` evidence: ${t.evidencePath}`));}e.evidencePath&&console.log(p.gray(`
4
4
  Evidence saved: ${e.evidencePath}`));}n.strict&&e.overallStatus!=="pass"&&process.exit(1);}export{re as a,Se as b};
@@ -1,2 +1,2 @@
1
- import {b as b$1}from'./chunk-COICGD62.js';import {b}from'./chunk-QYXX6G5O.js';import {q as q$1,f,g}from'./chunk-BVWDG66W.js';import {d}from'./chunk-WPZUKU2B.js';import {h,g as g$1}from'./chunk-FE5R6EUV.js';import {q,p}from'./chunk-ODK4LCEL.js';import E from'path';import A from'fs-extra';var re=q.agentContext,se=p.agentContext;function ne(e){if(typeof e!="string"||!e.trim()||e==="true")return "generic";let t=e.trim().toLowerCase();return t==="codex"||t==="claude"||t==="cursor"||t==="gemini"||t==="qwen"||t==="kimi"||t==="grok"||t==="copilot"||t==="windsurf"||t==="amazon-q"||t==="orca"?t:"generic"}function G(e){return `npx --yes --package workspai workspai ${e}`.trim()}function x(e){return `npx workspai ${e}`.trim()}async function C(e,t,i){let s=E.join(e,t);if(!await A.pathExists(s))return null;try{let n=await A.readJson(s);return typeof n!="object"||n===null||!("schemaVersion"in n)||n.schemaVersion!==i?null:n}catch{return null}}function m(e){return {id:e.id,scope:e.scope,display:x(e.args),execute:G(e.args),description:e.description,...e.project?{project:e.project}:{},freshness:f({id:`command.${e.id}`,label:`${e.id} command`,scope:"command",value:{display:x(e.args),execute:G(e.args)},...e.project?{project:e.project}:{},freshness:{kind:"derived",category:"structure",generatedAt:e.generatedAt,now:e.now,sourceArtifact:p.model,sourcePath:`safeCommands.${e.id}`,reason:"Safe command surfaces are derived from workspace model command capabilities."}}).freshness}}function L(e,t){return `workspace run ${t} --scope project:${e.name}`}function ae(e){return (e.startsWith("project:")?e.slice(8):e).trim().toLowerCase()}function oe(e){return [e.name,e.path,E.basename(e.path),e.absolutePath].filter(t=>typeof t=="string"&&t.trim().length>0).map(t=>t.trim().toLowerCase())}function ie(e,t,i){let s={generatedAt:e.generatedAt,now:i},n=[m({id:"workspace.model",scope:"workspace",args:"workspace model --json",description:"Read the canonical workspace intelligence model.",...s}),m({id:"workspace.graph.entities",scope:"workspace",args:"workspace graph entities --json",description:"Query proof-backed workspace entities without loading the full graph.",...s}),m({id:"workspace.graph.evidence",scope:"workspace",args:"workspace graph evidence <entity-or-relation> --json",description:"Resolve portable evidence for a graph entity or relation.",...s}),m({id:"workspace.graph.path",scope:"workspace",args:"workspace graph path <from> <to> --json",description:"Find a shortest proof-carrying path between workspace entities.",...s}),m({id:"workspace.doctor",scope:"workspace",args:"doctor workspace --json",description:"Check workspace health before claiming verification.",...s}),m({id:"workspace.pipeline",scope:"workspace",args:"pipeline --json",description:"Run the governed sync, doctor, analyze, readiness, and autopilot loop.",...s}),m({id:"workspace.contract.verify",scope:"workspace",args:"workspace contract verify --json",description:"Verify workspace contract and dependency edges.",...s}),m({id:"workspace.verify",scope:"workspace",args:"workspace verify --json",description:"Evaluate evidence freshness and verification gates before release decisions.",...s})],c=t?[t]:e.projects;for(let a of c)a.commands.fleetStages.includes("test")&&n.push(m({id:`project.${a.name}.test`,scope:"project",project:a.name,args:L(a,"test"),description:`Run tests for ${a.name} through workspace orchestration.`,...s})),a.commands.fleetStages.includes("build")&&n.push(m({id:`project.${a.name}.build`,scope:"project",project:a.name,args:L(a,"build"),description:`Build ${a.name} through workspace orchestration.`,...s}));return n}function ce(e){return e.commands.fleetStages.filter(t=>t==="test"||t==="build").map(t=>`workspace run ${t}`)}function pe(e,t){if(!t?.startsWith("project:"))return;let i=ae(t);if(i)return e.projects.find(s=>oe(s).includes(i))}function de(e,t,i){let s=[...e.validation?.issues??[]];t?.startsWith("project:")&&!i&&s.push({severity:"error",code:"context.scope.project.missing",message:`Requested project scope was not found: ${t}`,target:t});let n=s.filter(a=>a.severity==="error").length,c=s.filter(a=>a.severity==="warning").length;return {status:n>0?"failed":c>0?"warning":"passed",errors:n,warnings:c,issues:s}}async function me(e,t){let i=[],s=[];for(let[n,c]of Object.entries(e.evidence))c&&await g$1(t,c.path)!==null?i.push(`${n}: ${c.path}`):s.push(n);return {available:i.sort(),missing:s.sort()}}function le(e){let t=e.summary.projectCount,i=e.summary.runtimes.length?`${e.summary.runtimes.join(", ")} runtime coverage`:"no runtime coverage",s=e.identity.surfaces.length?e.identity.surfaces.join(", "):"no detected surfaces";return `${e.workspace.name} is a ${e.identity.workspaceType} with ${t} project${t===1?"":"s"}, ${i}, and ${s}.`}function ge(e){let t=["Do not claim a command passed unless a report or command output proves it.","Do not infer secrets or environment values from file names.","Do not change project scope without checking the selected project."];return e.contracts.exists||t.push("Workspace contract is missing; dependency and API edges may be incomplete."),((e.summary.extendedProjects??0)>0||e.summary.observedProjects>0)&&t.push("Some projects use extended or observed support tiers; command coverage may be partial."),t}async function We(e){let t=e.model??await q$1({workspacePath:e.workspacePath,includeEvidence:e.includeEvidence===true,observableScanDepth:e.observableScanDepth,now:e.now}),i=ne(e.agent),s=pe(t,e.scope),n=de(t,e.scope,s);if(e.strict===true&&n.status!=="passed"){let r=n.issues.map(g=>`${g.severity}:${g.code}:${g.target}`).join(", ");throw new Error(`Workspace context strict validation failed: ${r}`)}let c=e.now??new Date,a=t.facts??[],K=new Set((s?[s]:t.projects).map(r=>r.name)),R=a.filter(r=>r.project?K.has(r.project):true),H=(s?[s]:t.projects).map(r=>{let g=R.filter(p=>p.project===r.name);return {name:r.name,path:r.path,kind:r.kind,category:r.category,runtime:r.runtime,framework:r.frameworkDisplayName,...r.generator?{generator:r.generator}:{},createCapability:r.createCapability,supportTier:r.supportTier,...r.governance?{governance:r.governance}:{},safeCommands:ce(r),importantFiles:r.importantFiles,facts:g}}),S=await me(t,e.workspacePath),F=E.join(e.workspacePath,p.knowledgeGraph),u=await A.pathExists(F)?await A.readJson(F).catch(()=>null):null,N=false;if(u?.schemaVersion===q.knowledgeGraph)try{b(u,t),N=true;}catch{}let $=le(t),M=ie(t,s,c),b$2=await C(e.workspacePath,p.impact,q.impact),l=await C(e.workspacePath,p.doctor,q.doctor),v=await C(e.workspacePath,p.analyze,q.analyze),k=await C(e.workspacePath,p.readiness,q.readiness),h=await C(e.workspacePath,p.verify,q.verify),w=await C(e.workspacePath,p.explain,q.explain),f$1=await C(e.workspacePath,p.diff,q.diff),B=b$2?.summary?{changed:b$2.summary.changed,risk:b$2.summary.risk,affectedProjects:b$2.summary.affectedProjects,blastRadius:b$2.summary.blastRadius,recommendedCommands:b$2.summary.recommendedCommands}:void 0,U=l?.summary?{verdict:l.summary.verdict,totalIssues:l.summary.totalIssues,advisoryFindings:l.summary.advisoryFindings,blockingFindings:l.summary.blockingFindings,unknownFindings:l.summary.unknownFindings,hasSystemErrors:l.summary.hasSystemErrors,topSignals:(()=>{let r=Array.isArray(l.projects)?l.projects:[],g=[];for(let p of r.slice(0,6)){let te=Array.isArray(p.probes)?p.probes:[];for(let y of te.slice(0,10))(y?.status==="fail"||y?.severity==="error")&&g.push({label:y.label,scope:y.scope,issueClass:y.issueClass,status:y.status,severity:y.severity,recommendation:y.recommendation});}return g.slice(0,8)})()}:void 0,J=v?.summary?{score:v.summary.score,verdict:v.summary.verdict,findingCounts:v.summary.findings,topFindings:(Array.isArray(v.findings)?v.findings:[]).filter(p=>p?.severity==="fail"||p?.severity==="warn").slice(0,8).map(p=>({severity:p.severity,title:p.title,target:p.target,remediation:p.remediation}))}:void 0,X=k?{overallStatus:k.overallStatus,blocking:k.blocking,blockingReasons:k.blockingReasons,evidencePath:k.evidencePath,gates:Array.isArray(k.gates)?k.gates.slice(0,6).map(r=>({gate:r.gate,status:r.status,summary:r.summary})):void 0}:void 0,Q=h?.summary?{verdict:h.summary.verdict,exitCode:h.summary.exitCode,stepsFailed:h.summary.stepsFailed,stepsMissing:h.summary.stepsMissing,blockingReasons:h.blockingReasons,missingEvidence:h.missingEvidence}:void 0,Y=w?{summary:w.summary,blockingReasons:w.blockingReasons,releaseVerdict:w.releaseVerdict,evidenceFreshness:w.evidenceFreshness,sections:Array.isArray(w.sections)?w.sections.slice(0,4).map(r=>({id:r.id,title:r.title,body:r.body})):void 0}:void 0,Z=f$1?.summary?{changed:f$1.summary.changed,addedProjects:f$1.summary.addedProjects,removedProjects:f$1.summary.removedProjects,changedProjects:f$1.summary.changedProjects,workspaceChanges:f$1.summary.workspaceChanges,validationChanges:f$1.summary.validationChanges,gitChangedFiles:f$1.summary.gitChangedFiles}:void 0,ee=M.map(r=>f({id:`context.command.${r.id}`,label:`${r.id} safe command`,scope:"command",value:{display:r.display,execute:r.execute,scope:r.scope},...r.project?{project:r.project}:{},freshness:{kind:"derived",category:"structure",generatedAt:t.generatedAt,now:c,sourceArtifact:p.agentContext,sourcePath:`safeCommands.${r.id}`,reason:"Context safe commands are derived from workspace model command capabilities."}})),I=[...R,...ee],W=g({facts:I,generatedAt:c.toISOString(),now:c}),j=b$1();return {schemaVersion:re,generatedAt:c.toISOString(),agent:i,workspaceSummary:$,modelRef:p.model,knowledgeGraph:{artifact:p.knowledgeGraph,schemaVersion:q.knowledgeGraph,available:N,...typeof u?.quality?.entityCount=="number"?{entityCount:u.quality.entityCount}:{},...typeof u?.quality?.relationCount=="number"?{relationCount:u.quality.relationCount}:{},...typeof u?.quality?.proofCount=="number"?{proofCount:u.quality.proofCount}:{},queryCommands:[x("workspace graph search <query> --limit 12 --json"),x("workspace graph entities [kind] --json"),x("workspace graph evidence <entity-or-relation> --json"),x("workspace graph path <from> <to> --json")]},intelligenceChain:{schemaVersion:j.schemaVersion,contractPath:j.contractPath,currentStep:"context",canonicalReadOrder:[...j.consumers.agents.canonicalReadOrder]},workspace:{name:t.workspace.name,root:`workspace:${t.workspace.name}`,type:t.identity.workspaceType,...t.workspace.profile?{profile:t.workspace.profile}:{}},scope:{requested:e.scope??"workspace",...s?{activeProject:s.name}:{}},projects:H,safeCommands:M,facts:I,factFreshness:W,evidence:S,policies:{mode:t.policies.mode,source:t.policies.source},contracts:{exists:t.contracts.exists,path:t.contracts.workspaceContractPath},validation:n,agentInstructions:[`Read \`${p.agentIndex}\` first, then this context pack and linked evidence reports.`,"Use `workspace graph search <query> --limit 12 --json` for bounded, proof-backed retrieval before loading the full graph.",`Load \`${p.knowledgeGraph}\` only when a complete graph export is explicitly required.`,"Use this context as the workspace source of truth before inspecting random files.","Prefer workspace-level evidence over generic framework assumptions.","Use `display` commands when explaining steps to a human.","Use `execute` commands when launching commands from automation or tooling.","Treat `facts[].freshness.verifyBeforeUse` as a hard refresh requirement before using that fact in advice, fixes, or release decisions.","Do not carry extracted facts beyond their freshness contract; re-read or regenerate evidence when the contract says stale, unknown, live, or verify-before-use.","Keep project-scoped advice tied to the active project scope.","Regenerate stale grounding with `npx workspai workspace agent-sync --write --refresh-context`."],unsafeAssumptions:[...ge(t),...W.verifyBeforeUseFacts>0?[`${W.verifyBeforeUseFacts} fact(s) require verification before use; do not treat them as durable workspace structure.`]:[]],humanSummary:[$,`Evidence available: ${S.available.length}. Missing evidence groups: ${S.missing.join(", ")||"none"}.`,s?`Active project scope: ${s.name} (${s.frameworkDisplayName}).`:"Scope: whole workspace."].join(`
1
+ import {b as b$1}from'./chunk-COICGD62.js';import {b}from'./chunk-ZZWGD3X3.js';import {q as q$1,f,g}from'./chunk-4HQU2GQM.js';import {d}from'./chunk-NNQE4DS2.js';import {h,g as g$1}from'./chunk-FE5R6EUV.js';import {q,p}from'./chunk-ODK4LCEL.js';import E from'path';import A from'fs-extra';var re=q.agentContext,se=p.agentContext;function ne(e){if(typeof e!="string"||!e.trim()||e==="true")return "generic";let t=e.trim().toLowerCase();return t==="codex"||t==="claude"||t==="cursor"||t==="gemini"||t==="qwen"||t==="kimi"||t==="grok"||t==="copilot"||t==="windsurf"||t==="amazon-q"||t==="orca"?t:"generic"}function G(e){return `npx --yes --package workspai workspai ${e}`.trim()}function x(e){return `npx workspai ${e}`.trim()}async function C(e,t,i){let s=E.join(e,t);if(!await A.pathExists(s))return null;try{let n=await A.readJson(s);return typeof n!="object"||n===null||!("schemaVersion"in n)||n.schemaVersion!==i?null:n}catch{return null}}function m(e){return {id:e.id,scope:e.scope,display:x(e.args),execute:G(e.args),description:e.description,...e.project?{project:e.project}:{},freshness:f({id:`command.${e.id}`,label:`${e.id} command`,scope:"command",value:{display:x(e.args),execute:G(e.args)},...e.project?{project:e.project}:{},freshness:{kind:"derived",category:"structure",generatedAt:e.generatedAt,now:e.now,sourceArtifact:p.model,sourcePath:`safeCommands.${e.id}`,reason:"Safe command surfaces are derived from workspace model command capabilities."}}).freshness}}function L(e,t){return `workspace run ${t} --scope project:${e.name}`}function ae(e){return (e.startsWith("project:")?e.slice(8):e).trim().toLowerCase()}function oe(e){return [e.name,e.path,E.basename(e.path),e.absolutePath].filter(t=>typeof t=="string"&&t.trim().length>0).map(t=>t.trim().toLowerCase())}function ie(e,t,i){let s={generatedAt:e.generatedAt,now:i},n=[m({id:"workspace.model",scope:"workspace",args:"workspace model --json",description:"Read the canonical workspace intelligence model.",...s}),m({id:"workspace.graph.entities",scope:"workspace",args:"workspace graph entities --json",description:"Query proof-backed workspace entities without loading the full graph.",...s}),m({id:"workspace.graph.evidence",scope:"workspace",args:"workspace graph evidence <entity-or-relation> --json",description:"Resolve portable evidence for a graph entity or relation.",...s}),m({id:"workspace.graph.path",scope:"workspace",args:"workspace graph path <from> <to> --json",description:"Find a shortest proof-carrying path between workspace entities.",...s}),m({id:"workspace.doctor",scope:"workspace",args:"doctor workspace --json",description:"Check workspace health before claiming verification.",...s}),m({id:"workspace.pipeline",scope:"workspace",args:"pipeline --json",description:"Run the governed sync, doctor, analyze, readiness, and autopilot loop.",...s}),m({id:"workspace.contract.verify",scope:"workspace",args:"workspace contract verify --json",description:"Verify workspace contract and dependency edges.",...s}),m({id:"workspace.verify",scope:"workspace",args:"workspace verify --json",description:"Evaluate evidence freshness and verification gates before release decisions.",...s})],c=t?[t]:e.projects;for(let a of c)a.commands.fleetStages.includes("test")&&n.push(m({id:`project.${a.name}.test`,scope:"project",project:a.name,args:L(a,"test"),description:`Run tests for ${a.name} through workspace orchestration.`,...s})),a.commands.fleetStages.includes("build")&&n.push(m({id:`project.${a.name}.build`,scope:"project",project:a.name,args:L(a,"build"),description:`Build ${a.name} through workspace orchestration.`,...s}));return n}function ce(e){return e.commands.fleetStages.filter(t=>t==="test"||t==="build").map(t=>`workspace run ${t}`)}function pe(e,t){if(!t?.startsWith("project:"))return;let i=ae(t);if(i)return e.projects.find(s=>oe(s).includes(i))}function de(e,t,i){let s=[...e.validation?.issues??[]];t?.startsWith("project:")&&!i&&s.push({severity:"error",code:"context.scope.project.missing",message:`Requested project scope was not found: ${t}`,target:t});let n=s.filter(a=>a.severity==="error").length,c=s.filter(a=>a.severity==="warning").length;return {status:n>0?"failed":c>0?"warning":"passed",errors:n,warnings:c,issues:s}}async function me(e,t){let i=[],s=[];for(let[n,c]of Object.entries(e.evidence))c&&await g$1(t,c.path)!==null?i.push(`${n}: ${c.path}`):s.push(n);return {available:i.sort(),missing:s.sort()}}function le(e){let t=e.summary.projectCount,i=e.summary.runtimes.length?`${e.summary.runtimes.join(", ")} runtime coverage`:"no runtime coverage",s=e.identity.surfaces.length?e.identity.surfaces.join(", "):"no detected surfaces";return `${e.workspace.name} is a ${e.identity.workspaceType} with ${t} project${t===1?"":"s"}, ${i}, and ${s}.`}function ge(e){let t=["Do not claim a command passed unless a report or command output proves it.","Do not infer secrets or environment values from file names.","Do not change project scope without checking the selected project."];return e.contracts.exists||t.push("Workspace contract is missing; dependency and API edges may be incomplete."),((e.summary.extendedProjects??0)>0||e.summary.observedProjects>0)&&t.push("Some projects use extended or observed support tiers; command coverage may be partial."),t}async function We(e){let t=e.model??await q$1({workspacePath:e.workspacePath,includeEvidence:e.includeEvidence===true,observableScanDepth:e.observableScanDepth,now:e.now}),i=ne(e.agent),s=pe(t,e.scope),n=de(t,e.scope,s);if(e.strict===true&&n.status!=="passed"){let r=n.issues.map(g=>`${g.severity}:${g.code}:${g.target}`).join(", ");throw new Error(`Workspace context strict validation failed: ${r}`)}let c=e.now??new Date,a=t.facts??[],K=new Set((s?[s]:t.projects).map(r=>r.name)),R=a.filter(r=>r.project?K.has(r.project):true),H=(s?[s]:t.projects).map(r=>{let g=R.filter(p=>p.project===r.name);return {name:r.name,path:r.path,kind:r.kind,category:r.category,runtime:r.runtime,framework:r.frameworkDisplayName,...r.generator?{generator:r.generator}:{},createCapability:r.createCapability,supportTier:r.supportTier,...r.governance?{governance:r.governance}:{},safeCommands:ce(r),importantFiles:r.importantFiles,facts:g}}),S=await me(t,e.workspacePath),F=E.join(e.workspacePath,p.knowledgeGraph),u=await A.pathExists(F)?await A.readJson(F).catch(()=>null):null,N=false;if(u?.schemaVersion===q.knowledgeGraph)try{b(u,t),N=true;}catch{}let $=le(t),M=ie(t,s,c),b$2=await C(e.workspacePath,p.impact,q.impact),l=await C(e.workspacePath,p.doctor,q.doctor),v=await C(e.workspacePath,p.analyze,q.analyze),k=await C(e.workspacePath,p.readiness,q.readiness),h=await C(e.workspacePath,p.verify,q.verify),w=await C(e.workspacePath,p.explain,q.explain),f$1=await C(e.workspacePath,p.diff,q.diff),B=b$2?.summary?{changed:b$2.summary.changed,risk:b$2.summary.risk,affectedProjects:b$2.summary.affectedProjects,blastRadius:b$2.summary.blastRadius,recommendedCommands:b$2.summary.recommendedCommands}:void 0,U=l?.summary?{verdict:l.summary.verdict,totalIssues:l.summary.totalIssues,advisoryFindings:l.summary.advisoryFindings,blockingFindings:l.summary.blockingFindings,unknownFindings:l.summary.unknownFindings,hasSystemErrors:l.summary.hasSystemErrors,topSignals:(()=>{let r=Array.isArray(l.projects)?l.projects:[],g=[];for(let p of r.slice(0,6)){let te=Array.isArray(p.probes)?p.probes:[];for(let y of te.slice(0,10))(y?.status==="fail"||y?.severity==="error")&&g.push({label:y.label,scope:y.scope,issueClass:y.issueClass,status:y.status,severity:y.severity,recommendation:y.recommendation});}return g.slice(0,8)})()}:void 0,J=v?.summary?{score:v.summary.score,verdict:v.summary.verdict,findingCounts:v.summary.findings,topFindings:(Array.isArray(v.findings)?v.findings:[]).filter(p=>p?.severity==="fail"||p?.severity==="warn").slice(0,8).map(p=>({severity:p.severity,title:p.title,target:p.target,remediation:p.remediation}))}:void 0,X=k?{overallStatus:k.overallStatus,blocking:k.blocking,blockingReasons:k.blockingReasons,evidencePath:k.evidencePath,gates:Array.isArray(k.gates)?k.gates.slice(0,6).map(r=>({gate:r.gate,status:r.status,summary:r.summary})):void 0}:void 0,Q=h?.summary?{verdict:h.summary.verdict,exitCode:h.summary.exitCode,stepsFailed:h.summary.stepsFailed,stepsMissing:h.summary.stepsMissing,blockingReasons:h.blockingReasons,missingEvidence:h.missingEvidence}:void 0,Y=w?{summary:w.summary,blockingReasons:w.blockingReasons,releaseVerdict:w.releaseVerdict,evidenceFreshness:w.evidenceFreshness,sections:Array.isArray(w.sections)?w.sections.slice(0,4).map(r=>({id:r.id,title:r.title,body:r.body})):void 0}:void 0,Z=f$1?.summary?{changed:f$1.summary.changed,addedProjects:f$1.summary.addedProjects,removedProjects:f$1.summary.removedProjects,changedProjects:f$1.summary.changedProjects,workspaceChanges:f$1.summary.workspaceChanges,validationChanges:f$1.summary.validationChanges,gitChangedFiles:f$1.summary.gitChangedFiles}:void 0,ee=M.map(r=>f({id:`context.command.${r.id}`,label:`${r.id} safe command`,scope:"command",value:{display:r.display,execute:r.execute,scope:r.scope},...r.project?{project:r.project}:{},freshness:{kind:"derived",category:"structure",generatedAt:t.generatedAt,now:c,sourceArtifact:p.agentContext,sourcePath:`safeCommands.${r.id}`,reason:"Context safe commands are derived from workspace model command capabilities."}})),I=[...R,...ee],W=g({facts:I,generatedAt:c.toISOString(),now:c}),j=b$1();return {schemaVersion:re,generatedAt:c.toISOString(),agent:i,workspaceSummary:$,modelRef:p.model,knowledgeGraph:{artifact:p.knowledgeGraph,schemaVersion:q.knowledgeGraph,available:N,...typeof u?.quality?.entityCount=="number"?{entityCount:u.quality.entityCount}:{},...typeof u?.quality?.relationCount=="number"?{relationCount:u.quality.relationCount}:{},...typeof u?.quality?.proofCount=="number"?{proofCount:u.quality.proofCount}:{},queryCommands:[x("workspace graph search <query> --limit 12 --json"),x("workspace graph entities [kind] --json"),x("workspace graph evidence <entity-or-relation> --json"),x("workspace graph path <from> <to> --json")]},intelligenceChain:{schemaVersion:j.schemaVersion,contractPath:j.contractPath,currentStep:"context",canonicalReadOrder:[...j.consumers.agents.canonicalReadOrder]},workspace:{name:t.workspace.name,root:`workspace:${t.workspace.name}`,type:t.identity.workspaceType,...t.workspace.profile?{profile:t.workspace.profile}:{}},scope:{requested:e.scope??"workspace",...s?{activeProject:s.name}:{}},projects:H,safeCommands:M,facts:I,factFreshness:W,evidence:S,policies:{mode:t.policies.mode,source:t.policies.source},contracts:{exists:t.contracts.exists,path:t.contracts.workspaceContractPath},validation:n,agentInstructions:[`Read \`${p.agentIndex}\` first, then this context pack and linked evidence reports.`,"Use `workspace graph search <query> --limit 12 --json` for bounded, proof-backed retrieval before loading the full graph.",`Load \`${p.knowledgeGraph}\` only when a complete graph export is explicitly required.`,"Use this context as the workspace source of truth before inspecting random files.","Prefer workspace-level evidence over generic framework assumptions.","Use `display` commands when explaining steps to a human.","Use `execute` commands when launching commands from automation or tooling.","Treat `facts[].freshness.verifyBeforeUse` as a hard refresh requirement before using that fact in advice, fixes, or release decisions.","Do not carry extracted facts beyond their freshness contract; re-read or regenerate evidence when the contract says stale, unknown, live, or verify-before-use.","Keep project-scoped advice tied to the active project scope.","Regenerate stale grounding with `npx workspai workspace agent-sync --write --refresh-context`."],unsafeAssumptions:[...ge(t),...W.verifyBeforeUseFacts>0?[`${W.verifyBeforeUseFacts} fact(s) require verification before use; do not treat them as durable workspace structure.`]:[]],humanSummary:[$,`Evidence available: ${S.available.length}. Missing evidence groups: ${S.missing.join(", ")||"none"}.`,s?`Active project scope: ${s.name} (${s.frameworkDisplayName}).`:"Scope: whole workspace."].join(`
2
2
  `),impactSummary:B,doctorSummary:U,analyzeSummary:J,readinessSummary:X,verifySummary:Q,explainSummary:Y,diffSummary:Z}}async function je(e,t){return h(t,se,d(e))}export{re as a,se as b,We as c,je as d};