workspai 0.73.0 → 0.75.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 (163) hide show
  1. package/contracts/agent-framework-capabilities.v1.json +454 -0
  2. package/contracts/cli-runtime-command-inventory.v1.snapshot.json +166 -0
  3. package/contracts/create-planner-capabilities.v1.json +24 -0
  4. package/contracts/extension-cli-compatibility.v1.json +6 -0
  5. package/contracts/published-contract-catalog.v1.json +30 -0
  6. package/contracts/runtime-command-surface.v1.json +78 -4
  7. package/contracts/workspace-intelligence/agent-framework-adapter-manifest.v1.json +2127 -0
  8. package/contracts/workspace-intelligence/agent-framework-admission-candidate.v1.json +193 -0
  9. package/contracts/workspace-intelligence/agent-framework-change-plan.v1.json +280 -0
  10. package/contracts/workspace-intelligence/agent-framework-conformance-report.v1.json +269 -0
  11. package/contracts/workspace-intelligence/agent-framework-ownership-receipt.v1.json +147 -0
  12. package/contracts/workspace-intelligence/workspace-model.v1.json +4 -0
  13. package/contracts/workspace-intelligence-architecture.v1.json +28 -2
  14. package/dist/analyze-FRQVJ3VJ.js +1 -0
  15. package/dist/{artifact-remediation-plan-WDK5ISRU.js → artifact-remediation-plan-HD5K52UJ.js} +1 -1
  16. package/dist/autopilot-release-D3UES53H.js +1 -0
  17. package/dist/capabilities-command-VK3LQLP2.js +1 -0
  18. package/dist/chunk-252EKOR6.js +2 -0
  19. package/dist/chunk-36VNERGC.js +1 -0
  20. package/dist/{chunk-TZK2R6RD.js → chunk-4DX4HBG3.js} +1 -1
  21. package/dist/chunk-4KEZQLBU.js +2 -0
  22. package/dist/{chunk-PKKSRXUS.js → chunk-6B7L4NZE.js} +1 -1
  23. package/dist/chunk-7NKM6EHE.js +7 -0
  24. package/dist/{chunk-FE5R6EUV.js → chunk-BLEIUQL6.js} +1 -1
  25. package/dist/{chunk-37SWTS2B.js → chunk-BR6QIYQS.js} +1 -1
  26. package/dist/chunk-CGNMS32W.js +97 -0
  27. package/dist/{chunk-3GO7BJ5J.js → chunk-CK73SQFF.js} +1 -1
  28. package/dist/chunk-CMLLERGG.js +418 -0
  29. package/dist/{chunk-MGL6DBOR.js → chunk-COOVCORC.js} +1 -1
  30. package/dist/chunk-D4AMCZJU.js +7 -0
  31. package/dist/chunk-DFREJHG7.js +1 -0
  32. package/dist/{chunk-OIGI7MP6.js → chunk-DJH2CH42.js} +1 -1
  33. package/dist/chunk-DT3LRKZQ.js +1 -0
  34. package/dist/{chunk-D3N2WFDV.js → chunk-FS3WLRQ4.js} +1 -1
  35. package/dist/chunk-G3ZC5W4U.js +1 -0
  36. package/dist/{chunk-TIZCESKY.js → chunk-GE46XKD2.js} +1 -1
  37. package/dist/chunk-GIFAGOMK.js +2 -0
  38. package/dist/{chunk-FRH7AIGY.js → chunk-HLSOZOL3.js} +3 -3
  39. package/dist/chunk-J4J3RYCL.js +4 -0
  40. package/dist/{chunk-JK6XEF7K.js → chunk-JKAAKE4Z.js} +1 -1
  41. package/dist/chunk-LMOTDLJF.js +2 -0
  42. package/dist/{chunk-DNKELRK6.js → chunk-MXI2DWLL.js} +1 -1
  43. package/dist/chunk-NFWUAEVQ.js +12 -0
  44. package/dist/chunk-NGU7RYXA.js +9 -0
  45. package/dist/{chunk-3WHE7V4M.js → chunk-NLRZFIC6.js} +1 -1
  46. package/dist/chunk-O2CFT2A3.js +1 -0
  47. package/dist/{chunk-EBQS5T7Q.js → chunk-OA2YJN22.js} +1 -1
  48. package/dist/chunk-OH6LV5JP.js +6 -0
  49. package/dist/{chunk-J44PN2FX.js → chunk-P5RZO5BY.js} +18 -18
  50. package/dist/{chunk-TSYDTKXO.js → chunk-RPM67N7A.js} +1 -1
  51. package/dist/{chunk-XVTN5DDV.js → chunk-RU3UT7GJ.js} +1 -1
  52. package/dist/{chunk-IPZT6WKM.js → chunk-RX3U7JKF.js} +4 -4
  53. package/dist/chunk-SRCZX2KC.js +13 -0
  54. package/dist/chunk-TXVMHEJS.js +1 -0
  55. package/dist/chunk-V5WVGPOP.js +1 -0
  56. package/dist/{chunk-FY4X2VOE.js → chunk-VHMDWRDG.js} +2 -2
  57. package/dist/chunk-W7I65IXY.js +3 -0
  58. package/dist/chunk-WOPZX56J.js +2 -0
  59. package/dist/chunk-XF65LQ6M.js +1 -0
  60. package/dist/chunk-YP436V7Q.js +2 -0
  61. package/dist/{chunk-HAZGSAKP.js → chunk-ZI54C2AO.js} +1 -1
  62. package/dist/chunk-ZKYH44ER.js +1 -0
  63. package/dist/chunk-ZS7JHATN.js +1 -0
  64. package/dist/{chunk-NSMRQOWP.js → chunk-ZW4QV6SB.js} +1 -1
  65. package/dist/{create-XYKXS3JB.js → create-7UENFCJK.js} +1 -1
  66. package/dist/{demo-kit-RKTHTXHJ.js → demo-kit-ALW6OSQV.js} +1 -1
  67. package/dist/doctor-KGADT4PI.js +1 -0
  68. package/dist/{dotnet-webapi-clean-VJX6SGGP.js → dotnet-webapi-clean-6Z4EXEJY.js} +1 -1
  69. package/dist/{goal-lifecycle-BIX2JVNO.js → goal-lifecycle-HIQGDEEP.js} +1 -1
  70. package/dist/goal-pack-63PEP2ND.js +1 -0
  71. package/dist/{gofiber-standard-I6ASLOEE.js → gofiber-standard-TDJQIVQZ.js} +1 -1
  72. package/dist/{gogin-standard-U2LSRLIP.js → gogin-standard-UEF3IHSJ.js} +1 -1
  73. package/dist/index.d.ts +18 -0
  74. package/dist/index.js +266 -248
  75. package/dist/pipeline-VFI35PR4.js +5 -0
  76. package/dist/{project-agent-entry-Y3NEHZED.js → project-agent-entry-Z3OY3S7T.js} +1 -1
  77. package/dist/{project-intelligence-lens-6Q6XSUDJ.js → project-intelligence-lens-YWICXW6P.js} +1 -1
  78. package/dist/{project-test-coverage-5PXAHBYQ.js → project-test-coverage-3P5FH6E5.js} +1 -1
  79. package/dist/proof-carrying-change-BAP2C3KV.js +1 -0
  80. package/dist/{pythonRapidkitExec-44ORGQ4R.js → pythonRapidkitExec-UMFLDIYR.js} +1 -1
  81. package/dist/{rust-axum-JMV7UPO7.js → rust-axum-4TRVPFMB.js} +1 -1
  82. package/dist/{springboot-standard-OC2RS3KC.js → springboot-standard-COWL75GT.js} +1 -1
  83. package/dist/verified-goal-A6WOMNTU.js +1 -0
  84. package/dist/{workspace-ROUEA3RT.js → workspace-PAXTJCMH.js} +1 -1
  85. package/dist/{workspace-agent-sync-6UYG33EQ.js → workspace-agent-sync-MGCEF4ON.js} +1 -1
  86. package/dist/{workspace-archive-OSMU3CK6.js → workspace-archive-3AURTMYA.js} +1 -1
  87. package/dist/{workspace-context-H7ZXR6VI.js → workspace-context-2G6QZ6D3.js} +1 -1
  88. package/dist/{workspace-contract-2V2BI6A3.js → workspace-contract-VWPOIYHJ.js} +1 -1
  89. package/dist/{workspace-explain-IBMTRUSF.js → workspace-explain-HLEBUK4K.js} +1 -1
  90. package/dist/{workspace-feedback-D6HJLKBQ.js → workspace-feedback-FF34CSJE.js} +1 -1
  91. package/dist/{workspace-foundation-H5B3TTZD.js → workspace-foundation-X7LOGTS3.js} +1 -1
  92. package/dist/{workspace-graph-stream-YDEET5LK.js → workspace-graph-stream-XGSRDRLI.js} +1 -1
  93. package/dist/workspace-graph-token-efficiency-YHXFGH3Z.js +1 -0
  94. package/dist/{workspace-history-WWPS4U7H.js → workspace-history-EQG5UBKW.js} +1 -1
  95. package/dist/{workspace-intelligence-DXKQXTTM.js → workspace-intelligence-GFJKIWBX.js} +1 -1
  96. package/dist/{workspace-intelligence-benchmark-L46EGZZM.js → workspace-intelligence-benchmark-R5MEGJQS.js} +1 -1
  97. package/dist/{workspace-intelligence-evaluation-QDSOOUHH.js → workspace-intelligence-evaluation-4AB4BBRP.js} +1 -1
  98. package/dist/{workspace-intelligence-runner-SCB44IXU.js → workspace-intelligence-runner-BU6JKNUD.js} +1 -1
  99. package/dist/{workspace-knowledge-graph-BNEVFEOW.js → workspace-knowledge-graph-OUTCLYS2.js} +1 -1
  100. package/dist/{workspace-knowledge-graph-query-GOC365ZR.js → workspace-knowledge-graph-query-TT2KK3SF.js} +1 -1
  101. package/dist/workspace-knowledge-graph-snapshot-XWJRUMAC.js +1 -0
  102. package/dist/workspace-marker-7U3NYRPJ.js +1 -0
  103. package/dist/workspace-mcp-serve-JYUKX3YS.js +3 -0
  104. package/dist/workspace-model-DUGPW5IB.js +1 -0
  105. package/dist/{workspace-onboarding-IRBVZTT4.js → workspace-onboarding-C4CKWTJ3.js} +1 -1
  106. package/dist/{workspace-python-engine-state-BE4A3BL5.js → workspace-python-engine-state-VCOLSEWV.js} +2 -2
  107. package/dist/{workspace-readme-HA6XLDME.js → workspace-readme-4FCKAQME.js} +1 -1
  108. package/dist/{workspace-registry-summary-CBZDSG6I.js → workspace-registry-summary-4KX4QD55.js} +1 -1
  109. package/dist/workspace-repair-engine-OVW4J3DI.js +3 -0
  110. package/dist/workspace-run-NVQGRZYO.js +1 -0
  111. package/dist/{workspace-verify-QTRY7WW3.js → workspace-verify-B7HEFYO6.js} +1 -1
  112. package/dist/workspace-watch-TQYAMLIV.js +1 -0
  113. package/docs/README.md +4 -1
  114. package/docs/agent-framework-adapters.md +279 -0
  115. package/docs/ci-workflows.md +1 -1
  116. package/docs/commands-reference.md +16 -0
  117. package/docs/contracts/COMMAND_OWNERSHIP_MATRIX.md +5 -0
  118. package/docs/creating-workspaces-and-projects.md +18 -4
  119. package/package.json +7 -1
  120. package/scripts/enterprise-package-smoke.mjs +98 -0
  121. package/dist/analyze-WC2TY5AT.js +0 -1
  122. package/dist/autopilot-release-LJDRECFW.js +0 -1
  123. package/dist/capabilities-command-NFGX42CH.js +0 -1
  124. package/dist/chunk-2BCECNIW.js +0 -1
  125. package/dist/chunk-2LIVMG5C.js +0 -2
  126. package/dist/chunk-3SNP6M4M.js +0 -2
  127. package/dist/chunk-46QH3ZVI.js +0 -105
  128. package/dist/chunk-4HQU2GQM.js +0 -1
  129. package/dist/chunk-4JAURS76.js +0 -13
  130. package/dist/chunk-7O7P4MRD.js +0 -1
  131. package/dist/chunk-AQNU5RXV.js +0 -2
  132. package/dist/chunk-CQBM6BBP.js +0 -2
  133. package/dist/chunk-CY4QZ3PE.js +0 -3
  134. package/dist/chunk-EDDGQ6LM.js +0 -2
  135. package/dist/chunk-F6CTGVJA.js +0 -9
  136. package/dist/chunk-K3O3HENC.js +0 -5
  137. package/dist/chunk-LDJAUIAG.js +0 -1
  138. package/dist/chunk-LGC4CRUF.js +0 -3
  139. package/dist/chunk-ND5YAC4T.js +0 -1
  140. package/dist/chunk-NNQE4DS2.js +0 -2
  141. package/dist/chunk-NSH7TTSV.js +0 -1
  142. package/dist/chunk-R5OJD5K2.js +0 -1
  143. package/dist/chunk-SO4CGS35.js +0 -4
  144. package/dist/chunk-T5NBSCVX.js +0 -97
  145. package/dist/chunk-UCNIXOTL.js +0 -2
  146. package/dist/chunk-UNXG3ZFV.js +0 -1
  147. package/dist/chunk-VBMWFT7Q.js +0 -1
  148. package/dist/chunk-YYELANJO.js +0 -7
  149. package/dist/chunk-ZZWGD3X3.js +0 -12
  150. package/dist/doctor-LQ7FT6AZ.js +0 -1
  151. package/dist/goal-pack-SUWH6K7U.js +0 -1
  152. package/dist/pipeline-NSPPWD7U.js +0 -5
  153. package/dist/proof-carrying-change-456TYEDW.js +0 -1
  154. package/dist/verified-goal-GRH5UOJR.js +0 -1
  155. package/dist/workspace-graph-token-efficiency-XM3LYFUC.js +0 -1
  156. package/dist/workspace-knowledge-graph-snapshot-2NMV7LEJ.js +0 -1
  157. package/dist/workspace-marker-XGAWZZDX.js +0 -1
  158. package/dist/workspace-mcp-serve-JLZTTEVG.js +0 -3
  159. package/dist/workspace-model-XSNLDUI2.js +0 -1
  160. package/dist/workspace-repair-engine-TDUNQSFJ.js +0 -3
  161. package/dist/workspace-run-I2W5PIPK.js +0 -1
  162. package/dist/workspace-watch-PDQKYBYQ.js +0 -1
  163. /package/dist/{chunk-K33JJVQZ.js → chunk-VN2MKTQO.js} +0 -0
@@ -0,0 +1,13 @@
1
+ import {a as a$1}from'./chunk-JEI6BTZI.js';import {a}from'./chunk-IVYPC36J.js';import {c,e,d}from'./chunk-QYEQVNBF.js';import {d as d$1,b}from'./chunk-G3ZC5W4U.js';import {g}from'./chunk-WOPZX56J.js';import {r,n}from'./chunk-O2CFT2A3.js';import {p,d as d$2}from'./chunk-LMOTDLJF.js';import {h}from'./chunk-BLEIUQL6.js';import {b as b$1}from'./chunk-VN2MKTQO.js';import {a as a$2}from'./chunk-AFIFZTOY.js';import j from'path';import P from'fs-extra';function Y(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Q(e$1){switch(e$1){case "why":return d;case "trace":return e;default:return c}}async function E(e,n,o){try{if(!await P.pathExists(e))return null;let r=await P.readJson(e);return n?b$1(n,r,e):o&&a$2(r,o,e),r}catch(r){if((n||o)&&await P.pathExists(e))throw r;return null}}function q(e,n){if(!e)return null;let o=n.trim().toLowerCase();return e.projects.find(r=>r.slug.toLowerCase()===o||r.relativePath.toLowerCase()===o)??null}function U(e,n$1,o){let r=o.trim().toLowerCase(),t=(n(e)?.nodes.map(a=>a.id)??e.projects.map(a=>a.name)).find(a=>a.toLowerCase()===r);if(t)return t;let m=e.projects.find(a=>[a.name,a.path,j.basename(a.path)].filter(u=>u.trim().length>0).some(u=>u.toLowerCase()===r));if(m)return m.name;let p=q(n$1,o);if(p){let a=e.projects.find(u=>u.path===p.relativePath||u.path.endsWith(`/${p.relativePath}`));if(a)return a.name}return o}function Z(e,n){if(!e)return [];let o=n.trim().toLowerCase(),r=new Set;for(let d of e.projects){d.contracts.dependsOn?.some(t=>t.toLowerCase()===o)&&r.add(d.slug);for(let t of d.contracts.consumes??[])for(let m of e.projects)m.contracts.publishes?.includes(t)&&m.slug===o&&r.add(d.slug);}return [...r].sort()}function ee(e,n){if(!e)return [];let o=n.trim().toLowerCase();return e.steps.filter(r=>r.scope==="project"&&r.project?.toLowerCase()===o&&r.command?.display).map(r=>r.command.display).slice(0,8)}function l(e,n,o){return {id:e,title:n,body:o.trim()}}async function he(e){let n$1=j.resolve(e.workspacePath),o=(e.now??new Date).toISOString(),r$1=e.model??await r({workspacePath:n$1,includeEvidence:true}),d=e.contract;if(d===void 0)try{d=(await p({workspacePath:n$1})).contract;}catch{d=null;}let t=e.verify;t===void 0&&(t=await E(j.join(n$1,d$1),d$1));let m=e.impact;if(m===void 0&&(m=await E(j.join(n$1,g),g)),e.target.kind==="release-blocked"){let s=t?.blockingReasons??[],c=(r$1.summary?.projectCount??r$1.projects.length)===0,g=[l("verdict",c?"Workspace scaffold posture":"Release verdict",t?c?`Scaffold posture: **${t.summary.verdict}** (exit ${t.summary.exitCode}). Freshness: **${t.freshness.verdict}**. No registered projects yet \u2014 release gates apply after the first project is added.`:`Verdict: **${t.summary.verdict}** (exit ${t.summary.exitCode}). Risk: **${t.impact.risk}**. Freshness: **${t.freshness.verdict}**.`:"No workspace verify report found. Run `npx workspai workspace verify --json --write` first."),l("blockers",c?"Pre-project signals":"Blocking reasons",s.length?s.map(h=>`- ${h}`).join(`
2
+ `):c?"No pre-project signals in the latest verify report.":"No blocking reasons in the latest verify report.")];return t?.resolutionHints?.length&&g.push(l("resolution","Resolution hints",t.resolutionHints.map(h=>`- **${h.blockerId}** (${h.resolutionClass}): ${h.commandRetryHint??h.fixHints[0]?.detail??"See fix hints"}`).join(`
3
+ `))),{schemaVersion:a,generatedAt:o,workspacePath:n$1,target:e.target,summary:t?c?b(s.length,t.summary.verdict):s.length>0||t.summary.verdict==="blocked"?`Release blocked: ${t.summary.verdict} with ${s.length} blocking reason(s).`:t.summary.verdict==="needs-attention"?"Release needs attention: advisory or incomplete verification evidence remains; no blocking reason was reported.":`Release posture: ${t.summary.verdict}; no blocking reason was reported.`:"Release posture unknown \u2014 verify report missing.",sections:g,releaseVerdict:t?.summary.verdict,evidenceFreshness:t?.freshness.verdict,blocking:!!(t&&(t.summary.verdict==="blocked"||s.length>0)),releaseRisk:t?.impact.risk,blockingReasons:s,resolutionHints:t?.resolutionHints}}if(e.target.kind==="blocker"){let s=e.target,f=t?.resolutionHints?.find(g=>g.blockerId===s.blockerId),c=t?.blockingReasons.find(g=>g.includes(s.blockerId))??t?.blockingReasons[0];return {schemaVersion:a,generatedAt:o,workspacePath:n$1,target:s,summary:f?`Blocker ${s.blockerId}: ${f.resolutionClass}`:`Blocker ${s.blockerId} (no structured hint)`,sections:[l("reason","Blocking signal",c??"No matching blocking reason in verify."),l("hint","Resolution class",f?`${f.resolutionClass}
4
+
5
+ ${f.commandRetryHint??""}
6
+
7
+ ${f.fixHints.map(g=>`- ${g.detail}`).join(`
8
+ `)}`:"Run workspace verify to emit resolutionHints for this blocker.")],blockingReasons:c?[c]:[],resolutionHints:f?[f]:[]}}if(e.target.kind==="trace"){let s=j.isAbsolute(e.target.diffRef)?e.target.diffRef:j.join(n$1,e.target.diffRef),f=await E(s,void 0,"contracts/workspace-intelligence/workspace-model-diff.v1.json"),c=[...new Set((f?.changes??[]).filter(i=>i.type?.startsWith("project.")).map(i=>{let H=Y(i.after),L=Y(i.before);return typeof H.name=="string"&&H.name.trim()||typeof L.name=="string"&&L.name.trim()||i.project?.trim()||i.target?.trim()||""}).filter(Boolean))],h=(r$1.summary?.projectCount??r$1.projects.length)===0,O=m?.transitiveImpact?.map(i=>`${i.project?.name??i.target} (d${i.distance??0}, via ${i.via??"\u2014"})`)??[],y=t?.affectedSubgraph,b=i=>i&&i.length>0?i.join(", "):"none";return {schemaVersion:a,generatedAt:o,workspacePath:n$1,target:e.target,summary:c?.length?`Trace from ${c.length} changed project(s) through blast radius to gate coverage.`:h?"Trace: workspace scaffold baseline \u2014 no project changes in the latest diff.":"Trace: diff baseline present with no project changes.",sections:[l("origin","Change origin",c?.length?c.map(i=>`- ${i}`).join(`
9
+ `):"No changed projects in diff."),l("blast-radius","Transitive impact",O.length?O.map(i=>`- ${i}`).join(`
10
+ `):"No transitive impact report."),l("gate","Subgraph gate",y?`Directly changed: ${b(y.directlyChanged)}; transitive dependents: ${b(y.transitiveDependents)}; covered: ${b(y.covered)}; uncovered: ${b(y.uncovered)}; unverifiable: ${b(y.unverifiable)}.`:"No verify subgraph coverage available.")],releaseRisk:m?.summary?.risk??t?.impact.risk,blockingReasons:t?.blockingReasons}}let p$1=e.target.project,a$2=U(r$1,d,p$1),u=n(r$1),k=u?a$1(u,a$2):{found:false,centrality:null,directDependents:[],transitiveDependents:[]},w=q(d,p$1),x=Z(d,p$1),A=ee(t,p$1),v=r$1.projects.find(s=>s.name.toLowerCase()===p$1.toLowerCase()),I=[l("overview","Project overview",v?`${v.name} (${v.frameworkDisplayName}, ${v.runtime}) at \`${v.path}\`.`:`Project **${p$1}** ${k.found?"exists in graph":"not found in workspace model"}.`),l("consumers","Consumers / dependents",[`Direct dependents: ${k.directDependents.join(", ")||"none"}`,`Contract consumers: ${x.join(", ")||"none"}`,`Transitive dependents (blast radius): ${k.transitiveDependents.length}`].join(`
11
+ `)),l("contracts","Critical contracts",w?[`Owns: ${w.contracts?.owns?.join(", ")||"none"}`,`Publishes: ${w.contracts.publishes.join(", ")||"none"}`,`Consumes: ${w.contracts.consumes.join(", ")||"none"}`,`APIs: ${w.contracts.apis.map(s=>s.name).join(", ")||"none"}`].join(`
12
+ `):"No workspace.contract.json entry for this project."),l("verification","Required verification",A.length?A.map(s=>`- ${s}`).join(`
13
+ `):"- `npx workspai workspace verify --json`\n- Project test/build via `workspace run` when configured")];k.centrality&&I.push(l("centrality","Graph centrality",`fanIn ${k.centrality.fanIn}, fanOut ${k.centrality.fanOut}, reach ${k.centrality.reach}, hotspot ${k.centrality.isHotspot?"yes":"no"}.`));let T=p$1.trim().toLowerCase(),S=s=>s.project?.name?.toLowerCase()===T||s.target.toLowerCase()===T,_=m?.affectedProjects?.find(S)?.risk??m?.transitiveImpact?.find(S)?.risk??t?.impact.risk??"unknown";return {schemaVersion:a,generatedAt:o,workspacePath:n$1,target:e.target,summary:`${p$1}: ${x.length} consumer(s), release risk **${_}**.`,sections:I,releaseRisk:String(_)}}async function ye(e,n,o="explain"){let r=Q(o);return await h(n,r,d$2(e)),r}export{Q as a,he as b,ye as c};
@@ -0,0 +1 @@
1
+ import {c}from'./chunk-DT3LRKZQ.js';import {j,i,d as d$1,f as f$1,c as c$2,e,h}from'./chunk-36VNERGC.js';import {f as f$2}from'./chunk-ZKYH44ER.js';import {a as a$1}from'./chunk-FS3WLRQ4.js';import {c as c$3}from'./chunk-ZI54C2AO.js';import {b}from'./chunk-OA2YJN22.js';import {b as b$1}from'./chunk-NFWUAEVQ.js';import {f,i as i$1}from'./chunk-BLEIUQL6.js';import {a}from'./chunk-AFIFZTOY.js';import {d,c as c$1}from'./chunk-EWZZUQBR.js';import {q,p}from'./chunk-ODK4LCEL.js';import C from'path';import _ from'fs-extra';var be=/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/,we=/(?:^|\s)(?:\/(?:home|Users|private|var|tmp|mnt|opt|srv|root|workspace|workspaces|data|Volumes|etc|usr|run|dev|proc|sys)\/[^\s]+|[A-Za-z]:[\\/][^\s]+|\\\\[^\\\s]+\\[^\s]+)/,ke=/(?:-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----|\b(?:github_pat_|gh[pousr]_|glpat-|npm_|xox[baprs]-|sk-(?:proj-)?)[A-Za-z0-9_-]{12,}|\b(?:AKIA|ASIA)[A-Z0-9]{16}\b|\bAIza[A-Za-z0-9_-]{20,}|\bBearer\s+[A-Za-z0-9._~+/-]{16,}|[a-z][a-z0-9+.-]*:\/\/[^\s:/]+:[^\s@/]+@|\b(?:password|passwd|secret|token|api[_-]?key)\s*[:=]\s*[^\s]{6,})/i,ve=[{category:"test-coverage",patterns:[/\b(?:test\s+)?coverage\b/i,/\bcoverage\s+(?:to|above|at least)\b/i]},{category:"dependency-security",patterns:[/\b(?:dependency|dependencies|package|packages)\b.*\b(?:security|vulnerab|audit)\b/i,/\b(?:security|vulnerab|audit)\b.*\b(?:dependency|dependencies|package|packages)\b/i]},{category:"release-readiness",patterns:[/\brelease[ -]readiness\b/i,/\bready (?:this |the )?(?:workspace|project) for release\b/i,/\bprepare (?:this |the )?(?:workspace|project) for release\b/i,/\bprepare\b[^\n]{0,80}\bfor release\b/i]},{category:"defect-repair",patterns:[/\b(?:fix|repair|resolve|debug)\b.*\b(?:bug|error|failure|issue|regression)\b/i]},{category:"performance",patterns:[/\b(?:performance|latency|throughput|cpu|optimi[sz]e|faster|slower)\b/i,/\b(?:memory\s+(?:allocation|consumption|footprint|leak|pressure|usage)|out[ -]of[ -]memory|heap|ram)\b/i]},{category:"refactor",patterns:[/\b(?:refactor|restructure|decouple|extract|simplify|cleanup|clean up)\b/i]},{category:"documentation",patterns:[/\b(?:document|documentation|readme|guide|tutorial|docs)\b/i]},{category:"feature-change",patterns:[/\b(?:add|build|create|enforce|enhance|harden|implement|improve|introduce|support)\b/i]},{category:"system-understanding",patterns:[/\b(?:understand|explain|map|find|where|how|architecture|analy[sz]e|search)\b/i]}];function ye(e){if(typeof e!="string")throw new Error("Goal intent must be text.");let t=e.trim().replace(/\s+/g," ");if(!t)throw new Error("Goal intent cannot be empty.");if(t.length>2e3)throw new Error("Goal intent exceeds the 2000 character safety limit.");if(be.test(t))throw new Error("Goal intent contains unsupported control characters.");if(we.test(t))throw new Error("Goal intent contains a machine-local absolute path. Use a workspace-relative path or project scope.");if(ke.test(t))throw new Error("Goal intent appears to contain secret material and was not persisted.");return t}function Pe(e){let t=e.match(/\b(?:coverage\D{0,24})?((?:100(?:\.0+)?|\d{1,2}(?:\.\d+)?))\s*(?:%|percent(?:age)?(?:\s+points?)?)/i);if(!t||!/coverage/i.test(e))return null;let r=Number(t[1]);return Number.isFinite(r)&&r>=0&&r<=100?r:null}var re=[{runtime:"cpp",patterns:[/\bc\+\+/i,/\bcpp\b/i]},{runtime:"dotnet",patterns:[/\.net\b/i,/\bdotnet\b/i,/\bc#/i,/\bcsharp\b/i]},{runtime:"node",patterns:[/\bnode(?:\.js)?\b/i,/\btypescript\b/i,/\bjavascript\b/i,/\b(?:js|ts)\b/i]},{runtime:"python",patterns:[/\bpython\b/i,/\bpytest\b/i]},{runtime:"go",patterns:[/\bgolang\b/i,/\bgo(?:\s+(?:test|coverage|tests))\b/i]},{runtime:"java",patterns:[/\bjava\b/i,/\bjunit\b/i,/\bjacoco\b/i]},{runtime:"rust",patterns:[/\brust\b/i,/\bcargo\b/i]},{runtime:"php",patterns:[/\bphp\b/i,/\bphpunit\b/i]},{runtime:"ruby",patterns:[/\bruby\b/i,/\brspec\b/i]},{runtime:"kotlin",patterns:[/\bkotlin\b/i]},{runtime:"scala",patterns:[/\bscala\b/i]},{runtime:"clojure",patterns:[/\bclojure\b/i]},{runtime:"elixir",patterns:[/\belixir\b/i]},{runtime:"deno",patterns:[/\bdeno\b/i]},{runtime:"bun",patterns:[/\bbun\b/i]},{runtime:"c",patterns:[/\bc(?:\s+(?:test|coverage|tests|code))\b/i]}];function je(e){return re.filter(t=>t.patterns.some(r=>r.test(e))).map(t=>t.runtime)}function K(e,t={}){let r=ye(e),n=ve.filter(u=>u.patterns.some(j=>j.test(r))).map(u=>u.category),a=n.some(u=>u!=="feature-change")?n.filter(u=>u!=="feature-change"):n,s=a[0]??"feature-change",l=Pe(r),d=je(r),p=d.length===0&&t.selectedCoverageRuntime?[t.selectedCoverageRuntime]:d,m=[...new Set((t.availableCoverageRuntimes??[]).filter(u=>re.some(j=>j.runtime===u)))].sort(),b=[];return a.length>1&&a[0]!=="test-coverage"&&b.push(`The intent also contains signals for: ${a.slice(1).join(", ")}.`),s==="test-coverage"&&l===null&&b.push("A numeric test coverage target is required for machine verification."),s==="test-coverage"&&p.length>1&&b.push(`The Goal names multiple coverage runtimes: ${p.join(", ")}. Select one runtime per Goal.`),s==="test-coverage"&&p.length===0&&m.length>1&&b.push(`Coverage scope is ambiguous across detected runtimes: ${m.join(", ")}. Name one runtime or language in the Goal.`),s==="test-coverage"&&p.length===1&&m.length>0&&!m.includes(p[0])&&b.push(`The requested ${p[0]} coverage runtime is not present in the selected scope. Detected runtimes: ${m.join(", ")}.`),{original:r,normalized:r.toLocaleLowerCase("en-US"),statement:r.replace(/[.!?]+$/,""),category:s,confidence:a.length===1?"high":a.length>1?"medium":"low",ambiguities:b,...l===null?{}:{requestedTarget:{metric:"test-coverage-percent",operator:"at-least",value:l,...p.length===1?{runtime:p[0]}:{}}}}}function oe(e){let t={"test-coverage":["test suite coverage configuration instrumentation","CI tests LCOV Cobertura JaCoCo LLVM coverage"],"dependency-security":["dependency manifest lockfile security audit vulnerability"],"release-readiness":["release pipeline readiness gates build test deploy"],"defect-repair":["failure error test implementation call path"],"feature-change":["API implementation module dependency tests"],refactor:["module dependency ownership implementation tests"],performance:["performance benchmark latency throughput runtime"],documentation:["documentation README guide architecture decision"],"system-understanding":["architecture service API dependency ownership"]};return [...new Set([e.statement,...t[e.category]])].slice(0,3)}var ae="contracts/workspace-intelligence/goal-pack.v1.json",se="contracts/workspace-intelligence/goal-agent-handoff.v1.json",Ge="contracts/workspace-intelligence/goal-plan-result.v1.json",pe="contracts/workspace-intelligence/goal-index.v1.json",ue=new Set(["node","bun","deno","python","go","java","dotnet","rust","php","ruby","elixir","clojure","scala","kotlin","c","cpp"]);function Ce(e,t){let r=e.match(/[A-Za-z0-9][A-Za-z0-9+#.%_-]*/g)??[],n=new Set(t.map(m=>m.toLocaleLowerCase("en-US").replace(/[^a-z0-9]/g,"")).filter(Boolean)),a=[];for(let m=0;m<r.length;){let b=0;for(let u=Math.min(4,r.length-m);u>=1;u-=1){let j=r.slice(m,m+u).join("").toLocaleLowerCase("en-US").replace(/[^a-z0-9]/g,"");if(n.has(j)){b=u;break}}if(b>0){m+=b;continue}a.push(r[m]),m+=1;}let s=a.findIndex((m,b)=>{let u=m.toLocaleLowerCase("en-US"),j=a[b+1]?.toLocaleLowerCase("en-US");return u==="without"&&["breaking","changing","modifying","removing"].includes(j??"")||u==="while"&&["keeping","maintaining","preserving"].includes(j??"")}),l=s>=2?a.slice(0,s):a,d=l.length>=2?l.join(" "):e;if(s<2)return [d];let p=a.slice(s).filter(m=>!["without","while","breaking","changing","modifying","removing","keeping","maintaining","preserving"].includes(m.toLocaleLowerCase("en-US")));return p.length>0?[d,p.join(" ")]:[d]}function ie(e){return e.split(C.sep).join("/")}function V(e,t){return C.resolve(t.absolutePath??C.join(e,t.path))}function ce(e){let t=e.requested.trim().replace(/^project:/,"");if(!t)throw new Error("Project goal scope must name a project.");let r=C.isAbsolute(t)?C.resolve(t):null,n=e.model.projects.filter(a=>a.name===t||ie(a.path)===ie(t)||r!==null&&V(e.workspacePath,a)===r);if(n.length!==1)throw new Error(n.length===0?`Project goal scope was not found in the canonical model: ${t}`:`Project goal scope is ambiguous in the canonical model: ${t}`);return n[0]}async function Ae(e){let t=await a$1(e);if(t.status==="miss")throw new Error(`Canonical model and live graph evidence are required (${t.reason}). Run \`workspai workspace intelligence run --for-agent generic --strict --json\` or retry with --refresh.`);let{model:r,graph:n}=t;return a(r,"contracts/workspace-intelligence/workspace-model.v1.json","Goal source model"),a(n,"contracts/workspace-intelligence/workspace-knowledge-graph.v1.json","Goal source graph"),b$1(n,r),{model:r,graph:n}}function le(e){let t=e.scope.trim();if(t==="workspace")return {kind:"workspace",projects:e.model.projects.map(n=>n.name).sort(),selectionSource:e.selectionSource,resolution:"selected"};let r=t.startsWith("projects:")?"projects:":t.startsWith("project:")&&t.slice(8).includes(",")?"project:":null;if(r){let n=t.slice(r.length).split(",").map(l=>l.trim()).filter(Boolean);if(n.length<2)throw new Error("A project-set Goal scope must name at least two projects.");let a=n.map(l=>ce({workspacePath:e.workspacePath,model:e.model,requested:l})),s=[...new Set(a.map(l=>l.name))].sort();if(s.length!==n.length)throw new Error("A project-set Goal scope must not contain duplicate projects.");return {kind:"project-set",projects:s,selectionSource:e.selectionSource,resolution:"selected"}}if(t)return {kind:"project",projects:[ce({workspacePath:e.workspacePath,model:e.model,requested:t}).name],selectionSource:e.selectionSource,resolution:"selected"};throw new Error("Goal scope cannot be empty.")}async function Re(e){if(e.explicitScope?.trim())return {scope:le({workspacePath:e.workspacePath,model:e.model,scope:e.explicitScope,selectionSource:"explicit"}),selectionRequired:false};if(e.invocationProjectPath){let t=C.resolve(e.invocationProjectPath),r=e.model.projects.filter(n=>V(e.workspacePath,n)===t);if(r.length!==1)throw new Error("The invocation project is not represented uniquely in the canonical workspace model. Refresh intelligence or pass --scope explicitly.");return {scope:{kind:"project",projects:[r[0].name],selectionSource:"invocation-project",resolution:"selected"},selectionRequired:false}}if(e.model.projects.length===1)return {scope:{kind:"project",projects:[e.model.projects[0].name],selectionSource:"single-project-workspace",resolution:"selected"},selectionRequired:false};if(e.selectScope){let t=await e.selectScope({workspaceName:e.model.workspace.name,projects:e.model.projects.map(n=>({name:n.name,runtime:n.runtime,runtimeCandidates:[...n.runtimeCandidates].sort(),framework:n.framework})).sort((n,a)=>n.name.localeCompare(a.name))}),r=t.kind==="workspace"?"workspace":t.projects.length===1?`project:${t.projects[0]}`:`projects:${t.projects.join(",")}`;return {scope:le({workspacePath:e.workspacePath,model:e.model,scope:r,selectionSource:"interactive"}),selectionRequired:false}}return {scope:{kind:"workspace",projects:e.model.projects.map(t=>t.name).sort(),selectionSource:"workspace",resolution:"selection-required"},selectionRequired:true}}function Se(e,t){if(t.kind==="workspace")return {entities:e.quality.entityCount,relationships:e.quality.relationCount,proofs:e.quality.proofCount,unresolved:e.quality.unknownCount,proofCoveragePercent:Number((e.quality.relationProofCoverageRatio*100).toFixed(2))};let r=new Set(t.projects),n=e.entities.filter(p=>p.projectId!==void 0&&r.has(p.projectId)),a=new Set(n.map(p=>p.id)),s=e.relations.filter(p=>a.has(p.from)||a.has(p.to)),l=new Set([...n.flatMap(p=>p.proofIds),...s.flatMap(p=>p.proofIds)]),d=s.filter(p=>p.proofIds.length>0).length;return {entities:n.length,relationships:s.length,proofs:l.size,unresolved:s.length-d,proofCoveragePercent:s.length===0?100:Number((d/s.length*100).toFixed(2))}}function Ee(e){let t=new Map;for(let n of e){let a=t.get(n.kind)??[];a.push(n),t.set(n.kind,a);}let r=[];for(let n=0;[...t.values()].some(a=>n<a.length);n+=1)for(let a of t.values()){let s=a[n];s&&r.push(s);}return r}async function Ie(e){let t=C.join(e.workspacePath,p.intelligenceRun),r=await _.readJson(t).catch(()=>null),a=(Array.isArray(r?.stages)?r.stages:[]).filter(o=>o.status==="blocked"||o.status==="failed").map(o=>String(o.id??"unknown")).sort(),s=r?.status,l={status:s==="passed"?"passed":s==="blocked"||s==="failed"?"blocked":"unknown",artifact:p.intelligenceRun,blockedStages:a},d={status:"not-applicable",runtime:null,runtimeChoices:[],runner:null,existingEvidence:[],prerequisites:[]};if(e.intent.category==="test-coverage"){let o=e.intent.requestedTarget?.runtime;if(e.intent.ambiguities.some(P=>P.startsWith("Coverage scope is ambiguous")||P.startsWith("The Goal names multiple coverage runtimes")||P.startsWith("The selected projects do not share a common canonical coverage runtime")||P.startsWith("The requested ")))d={status:"requires-setup",runtime:o??null,runtimeChoices:e.coverageRuntimeChoices,runner:null,existingEvidence:[],prerequisites:["Select exactly one detected runtime or language for this coverage Goal."]};else {let P=o?e.projects.filter(c=>c.runtimeCandidates.includes(o)):e.projects,i=await Promise.all(P.map(async c=>({project:c,capability:await c$3(V(e.workspacePath,c),o??(ue.has(c.runtime)?c.runtime:"unknown"))}))),h=i.map(c=>c.capability.status);d={status:h.includes("unsupported")?"unsupported":h.includes("requires-setup")?"requires-setup":"available",runtime:i.length===1?i[0].capability.runtime:[...new Set(i.map(c=>c.capability.runtime))].join(","),runtimeChoices:e.coverageRuntimeChoices,runner:i.length===1?i[0].capability.runner:[...new Set(i.flatMap(c=>c.capability.runner?[c.capability.runner]:[]))].join(",")||null,existingEvidence:i.flatMap(c=>c.capability.existingEvidence.map(A=>({project:c.project.name,...A}))).filter((c,A,w)=>w.findIndex(k=>k.project===c.project&&k.path===c.path&&k.sha256===c.sha256)===A).sort((c,A)=>c.project.localeCompare(A.project)||c.path.localeCompare(A.path)),prerequisites:[...new Set(i.flatMap(c=>c.capability.prerequisites))].sort()};}}let p$1=oe(e.intent),m=[...Ce(p$1[0],e.projects.map(o=>o.name)),...p$1.slice(1)].filter((o,y,P)=>P.indexOf(o)===y).slice(0,3),b=m.map((o,y)=>{let P=o.match(/[A-Za-z0-9][A-Za-z0-9+#.%_-]*/g)?.length??0,i=y===0&&P>=4?2:1,h=e.projects.map(w=>{let k=G=>f$2(e.graph,{query:o,projectId:w.name,...G?{kind:G}:{},limit:60,relationsPerEntity:0,minimumTermMatches:i}).entities,S=k(),de=[...new Set(e.graph.entities.filter(G=>G.projectId===w.name||G.projectId===void 0&&G.identity.scope==="workspace").map(G=>G.kind))].flatMap(G=>k(G).slice(0,8)),U=[...S,...de];return U.filter((G,me)=>U.findIndex(ge=>ge.id===G.id)===me)}),c=[],A=new Set;for(let w=0;h.some(k=>w<k.length);w+=1)for(let k of h){let S=k[w];!S||A.has(S.id)||(A.add(S.id),c.push(S));}return Ee(c)}),u={"test-coverage":["test-suite"],"dependency-security":["package","module"],"release-readiness":["pipeline","deployment","lifecycle-stage"],"defect-repair":["test-suite","lifecycle-stage"],"feature-change":["project","runtime-unit","api","package","module","test-suite"],refactor:["package","module","api","test-suite"],performance:["lifecycle-stage","test-suite","pipeline"],documentation:["document","decision"],"system-understanding":["project","service","api","package","protocol"]},j=new Set(e.projects.map(o=>o.name)),v=e.graph.entities.filter(o=>o.proofIds.length>0&&(!o.projectId||j.has(o.projectId))&&u[e.intent.category].includes(o.kind)).sort((o,y)=>u[e.intent.category].indexOf(o.kind)-u[e.intent.category].indexOf(y.kind)||o.label.localeCompare(y.label)),f=[],M=new Set,E=o=>{!o||f.length>=20||M.has(o.id)||(M.add(o.id),f.push(o));},I=(e.intent.statement.match(/[A-Za-z][A-Za-z0-9+#.-]{1,}/g)??[]).length>=2,g=I?b[0]??[]:[];for(let o of g.slice(0,12))E(o);if(!I)for(let o of v)E(o);for(let o=0;f.length<20&&b.slice(1).some(y=>o<y.length);o+=1)for(let y of b.slice(1))E(y[o]);if(I)for(let o of v)E(o);for(let o of g.slice(12))E(o);let T=f.map(o=>({entityId:o.id,kind:o.kind,label:o.label,proofIds:o.proofIds.slice(0,12)})),L=b[0]?.length??0;return {workspaceIntelligence:l,measurement:d,retrieval:{status:I&&L>=3?"grounded":T.length>0?"partial":"empty",strategy:"deterministic-category-v1",queries:m,anchors:T}}}async function Te(e$1){let t=C.join(e$1,f$1);if(!await _.pathExists(t))return {schemaVersion:e,generatedAt:new Date(0).toISOString(),activeGoalId:null,goals:[]};let r=await _.readJson(t);a(r,pe,"Goal index");try{i(r);}catch(n){let a=h(r);if(!(a!==null&&n instanceof Error&&n.message==="Goal index is inconsistent: activeGoalId must identify the only selected actionable lifecycle entry.")||!a)throw n;return a}return r}function xe(e$1,t,r){let n=e$1.goals.find(l=>l.id===t.id),a=t.state==="ready-to-plan",s={id:t.id,fingerprint:t.fingerprint,objective:t.intent.statement,category:t.intent.category,state:t.state,lifecycle:n?.lifecycle==="cancelled"?"cancelled":a?"active":"planned",scope:t.scope,createdAt:n?.createdAt??t.generatedAt,updatedAt:r,goalPack:t.artifacts.goalPack,agentHandoff:t.artifacts.agentHandoff,...n?.verifiedGoalId?{verifiedGoalId:n.verifiedGoalId}:{},...n?.repairTransactionId?{repairTransactionId:n.repairTransactionId}:{},...n?.repairTransactionIds?{repairTransactionIds:n.repairTransactionIds}:{},...n?.changeTransactionId?{changeTransactionId:n.changeTransactionId}:{},...n?.changeTransactionIds?{changeTransactionIds:n.changeTransactionIds}:{},...n?.verificationReceipt?{verificationReceipt:n.verificationReceipt}:{}};return {schemaVersion:e,generatedAt:r,activeGoalId:s.lifecycle==="active"?t.id:e$1.activeGoalId===t.id?null:e$1.activeGoalId,goals:[...e$1.goals.filter(l=>l.id!==t.id).map(l=>s.lifecycle==="active"&&l.lifecycle==="active"?{...l,lifecycle:"planned",updatedAt:r}:l),s].sort((l,d)=>l.id.localeCompare(d.id))}}async function et(e){let t=b({startPath:C.resolve(e.startPath),explicitWorkspacePath:e.workspacePath,strict:true,requireProjectMembership:!e.scope?.trim()});if(!t)throw new Error("No canonical Workspai workspace could be resolved.");let r=C.resolve(t.workspacePath);e.refresh&&await c({workspacePath:r,strict:false,agent:"generic"});let{model:n,graph:a$1}=await Ae(r),s=await Re({workspacePath:r,invocationProjectPath:t.projectPath,model:n,explicitScope:e.scope,selectScope:e.selectScope}),l=s.scope,d$2=n.projects.filter(i=>l.projects.includes(i.name));if(d$2.length===0)throw new Error("A Goal Pack requires at least one registered project in its selected scope.");let p$1=e.maxAttempts??5;if(!Number.isInteger(p$1)||p$1<1||p$1>25)throw new Error("--max-attempts must be an integer from 1 to 25.");let m=new Date().toISOString(),b$1=d(n),u=d$2.map(i=>({name:i.name,runtimes:[...new Set(i.runtimeCandidates.filter(h=>ue.has(h)))].sort()})),j$1=[...new Set(u.flatMap(i=>i.runtimes))].sort(),v=u.length<=1?j$1:u[0].runtimes.filter(i=>u.every(h=>h.runtimes.includes(i))),f$2=K(e.intent,{availableCoverageRuntimes:v,...e.runtime?{selectedCoverageRuntime:e.runtime}:v.length===1?{selectedCoverageRuntime:v[0]}:{}});if(e.runtime&&!v.includes(e.runtime)){let i=e.runtime,h=u.filter(c=>!c.runtimes.includes(i)).map(c=>c.name);throw new Error(d$2.length>1&&h.length>0?`--runtime ${e.runtime} is not canonical for every project in the selected Goal scope. Missing from: ${h.join(", ")}. Split the projects into runtime-compatible Goal scopes.`:`--runtime ${e.runtime} is not present in the canonical Workspace Model for the selected Goal scope. Available runtimes: ${v.join(", ")||"none"}.`)}if(e.runtime&&f$2.category!=="test-coverage")throw new Error("--runtime is valid only for a test-coverage Goal.");if(e.runtime&&f$2.requestedTarget?.runtime&&f$2.requestedTarget.runtime!==e.runtime)throw new Error(`--runtime ${e.runtime} conflicts with the ${f$2.requestedTarget.runtime} runtime named in the Goal intent.`);if(!s.selectionRequired&&f$2.category==="test-coverage"&&f$2.requestedTarget&&!f$2.requestedTarget.runtime&&v.length>1&&!e.runtime&&e.selectCoverageRuntime){let i=await e.selectCoverageRuntime({workspaceName:n.workspace.name,scope:l,projects:d$2.map(h=>({name:h.name,runtime:h.runtime,runtimeCandidates:[...h.runtimeCandidates].sort()})),runtimes:v});if(!v.includes(i))throw new Error("The selected coverage runtime is outside the canonical Goal scope.");f$2=K(e.intent,{availableCoverageRuntimes:v,selectedCoverageRuntime:i});}!s.selectionRequired&&f$2.category==="test-coverage"&&d$2.length>1&&v.length===0&&(f$2={...f$2,ambiguities:[`The selected projects do not share a common canonical coverage runtime: ${u.map(i=>`${i.name} (${i.runtimes.join(", ")||"none"})`).join("; ")}. Split them into runtime-compatible Goal scopes so every selected project is verified.`,...f$2.ambiguities]}),s.selectionRequired&&(f$2={...f$2,ambiguities:[`Goal scope is unresolved across ${l.projects.length} registered projects: ${l.projects.join(", ")}. Select one project, multiple projects, or the entire workspace.`,...f$2.ambiguities]});let M=await Ie({workspacePath:r,projects:d$2,graph:a$1,intent:f$2,coverageRuntimeChoices:v}),E={generatedAt:m,intent:f$2,workspaceName:n.workspace.name,scope:l,sourceBinding:{model:{artifact:p.model,schemaVersion:q.model,hashAlgorithm:"sha256",hashSemantics:"workspace-model-structural-v1",hash:b$1,generatedAt:n.generatedAt},graph:{artifact:p.knowledgeGraph,schemaVersion:q.knowledgeGraph,hashAlgorithm:"sha256",hashSemantics:"canonical-json-v1",hash:c$1(a$1),generatedAt:a$1.generatedAt,modelHash:a$1.source.hash,...a$1.source.inputs?.hash?{inputHash:a$1.source.inputs.hash}:{}}},preflight:M,baseline:{projectCount:d$2.length,runtimes:[...new Set(d$2.flatMap(i=>i.runtimeCandidates))].sort(),frameworks:[...new Set(d$2.map(i=>i.framework))].sort(),graph:Se(a$1,l)},maxAttempts:p$1,consumer:e.consumer??"generic"},I={digestCanonical:c$1},{goalPack:g,handoff:T}=j(E,I);a(g,ae,"Goal Pack"),a(T,se,"Goal agent handoff");let L=false,o=async()=>{let i=C.join(r,g.artifacts.goalPack),h=C.join(r,g.artifacts.agentHandoff),[c,A]=await Promise.all([_.pathExists(i),_.pathExists(h)]);if(c!==A)throw new Error(`Goal Pack instance is incomplete and cannot be resumed: ${g.id}`);if(!c)return;let[w,k]=await Promise.all([_.readJson(i),_.readJson(h)]);a(w,ae,"Persisted Goal Pack"),a(k,se,"Persisted goal agent handoff");let S=j({...E,generatedAt:w.generatedAt,sourceBinding:w.sourceBinding},I);if(w.id!==g.id||k.goalId!==g.id||c$1(w)!==c$1(S.goalPack)||c$1(k)!==c$1(S.handoff))throw new Error(`Goal Pack instance failed immutable integrity validation: ${g.id}`);g=w,T=k,L=true;};if(e.dryRun)await o();else {let i$2=`.workspai/goals/${g.id}/publication`;await f(r,i$2,async()=>{await o();let h=xe(await Te(r),g,new Date().toISOString());a(h,pe,"Goal index"),i(h),await i$1(r,d$1,L?[{relativePath:d$1,payload:g},{relativePath:f$1,payload:h}]:[{relativePath:g.artifacts.goalPack,payload:g},{relativePath:g.artifacts.agentHandoff,payload:T},{relativePath:d$1,payload:g},{relativePath:f$1,payload:h}]);});}let y=[g.artifacts.goalPack,g.artifacts.agentHandoff,d$1,f$1],P={schemaVersion:c$2,result:g.state==="needs-confirmation"?"needs-confirmation":g.state==="blocked"?"blocked":g.state==="needs-evidence"?"needs-evidence":"planned",resolution:{source:t.source,invocationScope:t.projectPath?"project":"workspace"},goalPack:g,agentHandoff:T,writtenArtifacts:e.dryRun?[]:L?[d$1,f$1]:y,dryRun:e.dryRun===true,resumed:L};return a(P,Ge,"Goal plan result"),P}export{et as a};
@@ -0,0 +1 @@
1
+ import {d,n}from'./chunk-O2CFT2A3.js';import {a,b}from'./chunk-S5KTATOU.js';function u(r){let s=new Map;for(let n of r.projects)s.has(n.name)||s.set(n.name,d(n));return s}function w(r){let s=u(r),n$1=n(r)??{nodes:r.projects.map(t=>({id:t.name,path:t.path})),edges:[]},a$1=a(n$1),o=new Map;for(let t of n$1.nodes){let e=s.get(t.id)??d({missing:t.id}),l=[...b(a$1,[t.id],{direction:"dependencies"}).keys()].filter(c=>c!==t.id).sort((c,f)=>c.localeCompare(f)).map(c=>({id:c,hash:s.get(c)??"<unknown>"}));o.set(t.id,{id:t.id,ownHash:e,transitiveInputsHash:d({own:e,dependencies:l})});}return o}function y(r,s){if(!s||Object.keys(s).length===0)return {verdict:"unknown",baseline:"none",changed:[],added:[],removed:[]};let n=[],a=[];for(let[e,i]of r.entries())e in s?s[e]!==i.transitiveInputsHash&&n.push(e):a.push(e);let o=[];for(let e of Object.keys(s))r.has(e)||o.push(e);return n.sort((e,i)=>e.localeCompare(i)),a.sort((e,i)=>e.localeCompare(i)),o.sort((e,i)=>e.localeCompare(i)),{verdict:n.length>0||a.length>0||o.length>0?"stale":"fresh",baseline:"recorded",changed:n,added:a,removed:o}}function M(r){let s={};for(let[n,a]of [...r.entries()].sort((o,t)=>o[0].localeCompare(t[0])))s[n]=a.transitiveInputsHash;return s}export{u as a,w as b,y as c,M as d};
@@ -28,8 +28,8 @@ ${A}`:`${m} ${g.join(" ")}`;throw new Error(gt)},b=async(m,g,P)=>{let f=0;for(;;
28
28
  `)?d:`${d}
29
29
  `),typeof s.exitCode=="number"?s.exitCode:1}let c=await execa(r,i,{cwd:e?.cwd,env:{...process.env,...e?.env},reject:false,stdio:"inherit"});return typeof c.exitCode=="number"?c.exitCode:1}catch(n){return process.stderr.write(`${O(n)}
30
30
  `),1}}var jt=[{pattern:/RapidKitError:\s*Directory '([^']+)' exists and force is not set/,message:t=>`\u274C Directory "${l.basename(t[1])}" already exists.
31
- \u{1F4A1} Choose a different name, or remove the existing directory first:
32
- rm -rf ${t[1]}`},{pattern:/RapidKitError:\s*Project name '([^']+)' is (invalid|not allowed)/i,message:t=>`\u274C Invalid project name: "${t[1]}"
31
+ Target: ${t[1]}
32
+ \u{1F4A1} Choose a different name, or inspect and move/remove the existing directory first.`},{pattern:/RapidKitError:\s*Project name '([^']+)' is (invalid|not allowed)/i,message:t=>`\u274C Invalid project name: "${t[1]}"
33
33
  \u{1F4A1} Use lowercase letters, numbers, and hyphens only (e.g. my-api).`},{pattern:/RapidKitError:\s*Kit '([^']+)' not found/i,message:t=>`\u274C Unknown kit: "${t[1]}"
34
34
  \u{1F4A1} Run "npx workspai list" to see available kits.`},{pattern:/RapidKitError:\s*(.+)/,message:t=>`\u274C ${t[1].trim()}`}];async function zt(t,e){let{spawn:n}=await import('child_process');try{let r=await H(e?.cwd),i=r.cmd,o=[...r.baseArgs,...t];return await new Promise(c=>{let s=n(i,o,{cwd:e?.cwd,env:{...process.env,...e?.env},stdio:["inherit","inherit","pipe"]}),a=[];s.stderr?.on("data",d=>{a.push(d);}),s.on("close",d=>{let E=d??1;if(E!==0&&a.length>0){let k=Buffer.concat(a).toString("utf8");for(let{pattern:b,message:m}of jt){let g=k.match(b);if(g){process.stderr.write(m(g)+`
35
35
  `),c(E);return}}process.stderr.write(k);}c(E);}),s.on("error",d=>{process.stderr.write(`${O(d)}
@@ -0,0 +1,3 @@
1
+ import {a as a$1,b as b$1}from'./chunk-O5XQP5E7.js';import {a as a$2}from'./chunk-7Q7X4X5I.js';import {b as b$2}from'./chunk-AO2ZI42U.js';import {a,h,e}from'./chunk-BLEIUQL6.js';import {b}from'./chunk-252EKOR6.js';import {t,s}from'./chunk-ODK4LCEL.js';import y from'path';import {existsSync}from'fs';import ie from'fs-extra';var oe=[{artifactKind:"bootstrap-compliance",cardId:"bootstrap",fileNames:["bootstrap-compliance.latest.json"]},{artifactKind:"doctor-workspace",cardId:"doctor",fileNames:["doctor-remediation-plan-last-run.json","doctor-last-run.json"]},{artifactKind:"analyze",cardId:"analyze",fileNames:["analyze-last-run.json"]},{artifactKind:"readiness",cardId:"readiness",fileNames:["release-readiness-last-run.json"]},{artifactKind:"pipeline",cardId:"pipeline",fileNames:["pipeline-last-run.json"]},{artifactKind:"workspace-run",cardId:"workspaceRun",fileNames:["workspace-run-last.json"]},{artifactKind:"workspace-verify",cardId:"workspaceVerify",fileNames:["workspace-verify-last-run.json"]}];function f(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function w(e){return Array.isArray(e)?e.filter(i=>typeof i=="string"&&i.trim().length>0):[]}function P(e){return [...new Set(e.map(i=>i.trim()).filter(Boolean))]}function J(e){return (e.notes.includes("Doctor finding status: blocking")?16:0)+(e.transaction?8:0)+(e.operation?4:0)+(e.invocation?2:0)+(e.strategy?.length?1:0)}function ne(e){let i=J(e.incoming)>J(e.existing),r=structuredClone(i?e.incoming:e.existing),o=i?e.existing:e.incoming,t=o.sourceStepId;return r.order=e.existing.order,r.files=P([...r.files,...o.files]),r.notes=P([...r.notes,...o.notes.filter(n=>!n.startsWith("Source Doctor capability:")&&!n.startsWith("Doctor finding status:")),...t?[`Also satisfies Doctor capability: ${t}`]:[]]),r}function ae(e,i,r){return r?i:y.relative(e,i).split(y.sep).join("/")}function D(e){return e.includeAbsolutePaths?e.projectPath:b$1({workspacePath:e.workspacePath,projectPath:e.projectPath,projectName:e.projectName}).contractRelativePath}function Z(e){let i=y.isAbsolute(e.filePath)?y.resolve(e.filePath):y.resolve(e.projectPath,e.filePath);if(e.includeAbsolutePaths)return i;let r=y.relative(e.projectPath,i);return !r||r===".."||r.startsWith(`..${y.sep}`)||y.isAbsolute(r)?void 0:`${D(e)}/${r.split(y.sep).join("/")}`}function se(e){let i=e?.trim()||"npx workspai bootstrap";if(!/(?:^|\s)--ci(?:\s|$)/.test(i)&&/(?:^|\s)--json(?:\s|$)/.test(i))return i.replace(/(?:^|\s)--json(?:\s|$)/,o=>{let t=o.startsWith(" ")?" ":"",n=o.endsWith(" ")?" ":"";return `${t}--ci --json${n}`}).trim();let r=/(?:^|\s)--ci(?:\s|$)/.test(i)?i:`${i} --ci`;return /(?:^|\s)--json(?:\s|$)/.test(r)?r:`${r} --json`}function M(e,i){return y.basename(e).toLowerCase().replace(/\.cmd$/,"")==="npx"&&i[0]==="workspai"&&!i.includes("--no-install")?["--no-install",...i]:i}function U(e){return {cwd:".",executable:"npx",args:M("npx",["workspai",...e])}}function ce(e){return `${JSON.stringify({schemaVersion:s.compatibilityMatrix.schemaVersion,generatedAt:e,source:"workspai workspace remediation-plan",runtimes:{},notes:["Minimal enterprise baseline. Add runtime and toolchain entries as governance matures."]},null,2)}
2
+ `}function de(e){return `${JSON.stringify({schema_version:"1.0",enabled:false,strategy:"on-demand",artifacts:[],created_at:e,note:"Minimal enterprise baseline. Set enabled: true and add artifact entries to activate mirroring."},null,2)}
3
+ `}function le(e){let i=e.payload,r=w(i.blockers),o=w(i.blockingReasons),t=w(i.failures),n=w(i.reasons),d=w(i.policyViolations),c=f(i.summary),l=w(c?.blockers);if(e.artifactKind==="analyze"){let k=(Array.isArray(i.findings)?i.findings:[]).map(b=>f(b)).filter(b=>!!b).map(b=>String(b.message??b.title??b.id??"").trim()).filter(Boolean);return P([...r,...k,...o])}if(e.artifactKind==="workspace-run"){let p=f(i.stages),k=Object.entries(p??{}).flatMap(([b,s])=>{let a=f(s);return (Array.isArray(a?.projects)?a.projects:[]).map(u=>f(u)).filter(u=>!!u).filter(u=>u.status==="failed"||u.ok===false).map(u=>`${b}: ${String(u.project??u.name??"project")} failed`)});return P([...r,...k,...o])}return P([...r,...o,...t,...n,...d,...l])}function v(e){let i=e.findingId?.trim()||e.sourceStepId?.trim()||e.id,r=e.findingStatus??"blocking",o=e.causalKey?.trim()||[e.cardId,e.projectName??e.scope??"workspace",i].map(t=>String(t).trim().toLowerCase()).join(":");return {id:e.id,artifactKind:e.artifactKind,cardId:e.cardId,title:e.title,order:e.order,phase:e.phase,scope:e.scope??"workspace",...e.projectName?{projectName:e.projectName}:{},...e.projectPath?{projectPath:e.projectPath}:{},...e.sourceStepId?{sourceStepId:e.sourceStepId}:{},findingId:i,findingStatus:r,causalKey:o,...e.dependsOn?{dependsOn:e.dependsOn}:{},...e.strategy?{strategy:structuredClone(e.strategy)}:{},...e.transaction?{transaction:structuredClone(e.transaction)}:{},...e.requirements?{requirements:structuredClone(e.requirements)}:{},...e.retryPolicy?{retryPolicy:structuredClone(e.retryPolicy)}:{},status:e.status??"ready",mode:e.mode,risk:e.risk,requiresApproval:true,blocker:e.blocker,summary:e.summary,...e.command?{command:e.command}:{},...e.invocation?{invocation:structuredClone(e.invocation)}:{},verifyCommand:e.verifyCommand,cwd:e.cwd??"workspace",files:e.files??[],...e.operation?{operation:e.operation}:{},rollback:e.rollback??(e.operation?{available:true,strategy:"idempotent"}:{available:false,strategy:"none"}),notes:e.notes??[]}}function pe(e){return (Array.isArray(e.report.payload.steps)?e.report.payload.steps:[]).flatMap((r,o)=>{let t=f(r),n=typeof t?.id=="string"?t.id.trim():"",d=typeof t?.projectName=="string"?t.projectName.trim():"",c=typeof t?.projectPath=="string"?t.projectPath.trim():"",l=typeof t?.originalCommand=="string"?t.originalCommand.trim():"";if(!t||!n||!d||!c)return [];let p=f(t.studioStatus),k=p?.state==="ready"||p?.state==="review-required"||p?.state==="blocked"||p?.state==="guidance-only"?p.state:"guidance-only",b=t.risk==="safe"||t.risk==="guarded"||t.risk==="invasive"?t.risk:"guarded",s=f(t.preview),a=D({workspacePath:e.workspacePath,projectPath:c,projectName:d,includeAbsolutePaths:e.includeAbsolutePaths}),g=H({capability:{...t,command:l},absoluteProjectPath:c,includeAbsolutePaths:e.includeAbsolutePaths}),u=X({capability:t,absoluteProjectPath:c,includeAbsolutePaths:e.includeAbsolutePaths}),R=E({operation:t.operation,absoluteProjectPath:c}),h=t.findingStatus==="blocking"||t.findingStatus==="advisory"||t.findingStatus==="informational"?t.findingStatus:"unknown",j=typeof t.diagnosisFindingId=="string"&&t.diagnosisFindingId.trim()?t.diagnosisFindingId.trim():typeof t.issueId=="string"&&t.issueId.trim()?t.issueId.trim():n,x=typeof t.causalKey=="string"&&t.causalKey.trim()?t.causalKey.trim():void 0,m=!!g&&(t.executable===true||t.executableInCurrentEnvironment===true),A=Q({strategy:t.strategy,includeAbsolutePaths:e.includeAbsolutePaths}),I=f(t.transaction),C=I?.schemaVersion==="workspai.doctor-dependency-repair-transaction.v1"?structuredClone(I):void 0;return C&&(C.projectPath=a),[v({id:`doctor.${n}`,artifactKind:e.report.artifactKind,cardId:e.report.cardId,title:typeof s?.title=="string"&&s.title.trim()?s.title.trim():`Repair ${d}`,order:e.startOrder+o,phase:typeof t.phase=="string"?t.phase:"doctor-remediation",blocker:typeof s?.summary=="string"&&s.summary.trim()?s.summary.trim():`Doctor remediation is pending for ${d}.`,summary:typeof s?.summary=="string"&&s.summary.trim()?s.summary.trim():`Execute the CLI-authored Doctor step for ${d}.`,mode:m?"run-command":"manual-guidance",risk:b,status:k,...m&&g?{command:g}:{},...m&&u?{invocation:u}:{},...R?{operation:R}:{},verifyCommand:typeof t.verifyCommand=="string"&&t.verifyCommand.trim()?t.verifyCommand.trim():"npx workspai doctor project --json",files:w(t.files).map($=>Z({workspacePath:e.workspacePath,projectPath:c,projectName:d,filePath:$,includeAbsolutePaths:e.includeAbsolutePaths})).filter($=>!!$),notes:[`Source Doctor step: ${n}`,`Doctor finding id: ${j}`,`Doctor finding status: ${h}`,...typeof p?.reason=="string"?[p.reason]:[]],scope:"project",projectName:d,projectPath:a,sourceStepId:n,findingId:j,findingStatus:h,causalKey:x,dependsOn:w(t.dependsOn).map($=>`doctor.${$}`),strategy:A,transaction:C,cwd:"project",...f(t.rollback)?.available===true?{rollback:{available:true,strategy:"manual"}}:{}})]})}function H(e){let i=typeof e.capability.command=="string"?e.capability.command.trim():"";if(e.includeAbsolutePaths&&i)return i;let r=E({operation:e.capability.operation,absoluteProjectPath:e.absoluteProjectPath});if(r)return b$2(r);let o=f(e.capability.invocation),t=typeof o?.executable=="string"?o.executable.trim():"",n=M(t,w(o?.args));if(t)return [t,...n].map(c=>/^[a-zA-Z0-9_./:@=+-]+$/.test(c)?c:JSON.stringify(c)).join(" ");if(!i)return;let d=e.absoluteProjectPath.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return i.replace(new RegExp(`^cd\\s+["']?${d}["']?\\s*&&\\s*`,"i"),"").replaceAll(e.absoluteProjectPath,".")}function X(e){let i=f(e.capability.invocation),r=typeof i?.executable=="string"?i.executable.trim():"",o=w(i?.args);if(!(!r||o.length!==(Array.isArray(i?.args)?i.args.length:0)))return {cwd:e.includeAbsolutePaths?e.absoluteProjectPath:".",executable:r,args:M(r,o)}}function E(e){let i=f(e.operation);if(!i||typeof i.type!="string")return;let r=structuredClone(i);for(let o of ["path","sourcePath"]){let t=r[o];if(typeof t!="string")continue;let n=y.isAbsolute(t)?y.relative(e.absoluteProjectPath,t):t;if(!n||n===".."||n.startsWith(`..${y.sep}`)||y.isAbsolute(n))return;r[o]=n.split(y.sep).join("/");}return r}function Q(e){if(!Array.isArray(e.strategy))return;let i=structuredClone(e.strategy);if(!e.includeAbsolutePaths)for(let r of i)r.invocation&&(r.invocation.cwd=".");return i}function me(e){let i=Array.isArray(e.report.payload.projects)?e.report.payload.projects:e.report.payload.project?[e.report.payload.project]:[],r=new Set,o=[];for(let t of i){let n=f(t);if(!n)continue;let d=typeof n.name=="string"?n.name.trim():"",c=typeof n.path=="string"?n.path.trim():"";if(!d||!c)continue;let l=Array.isArray(n.repairCapabilities)?n.repairCapabilities:Array.isArray(n.probes)?n.probes.map(s=>f(s)?.repairCapability).filter(s=>s!==void 0):[],p=new Map,k=new Map,b=f(n.diagnosis);for(let s of Array.isArray(b?.findings)?b.findings:[]){let a=f(s),g=f(a?.repair),u=typeof g?.capabilityId=="string"?g.capabilityId.trim():"",R=typeof a?.id=="string"?a.id.trim():"",h=typeof a?.causalKey=="string"?a.causalKey.trim():"",j=a?.status==="blocking"||a?.status==="advisory"||a?.status==="informational"||a?.status==="unknown"?a.status:"unknown";u&&R&&h&&k.set(u,{findingId:R,causalKey:h,findingStatus:j});}for(let s of Array.isArray(n.probes)?n.probes:[]){let a=f(s),g=f(a?.repairCapability),u=typeof g?.id=="string"?g.id.trim():"";u&&p.set(u,a?.status==="fail"?"blocking":"advisory");}for(let s of l){let a=f(s),g=typeof a?.id=="string"?a.id.trim():"";if(!a||!g)continue;let u=`${d}:${g}`;if(r.has(u))continue;r.add(u);let R=a.risk==="safe"||a.risk==="guarded"||a.risk==="invasive"?a.risk:"guarded",h=H({capability:a,absoluteProjectPath:c,includeAbsolutePaths:e.includeAbsolutePaths}),j=X({capability:a,absoluteProjectPath:c,includeAbsolutePaths:e.includeAbsolutePaths}),x=E({operation:a.operation,absoluteProjectPath:c}),m=a.status==="available"&&!!h,A=f(a.transaction),I=A?.schemaVersion==="workspai.doctor-dependency-repair-transaction.v1"?structuredClone(A):void 0,C=k.get(g),$=C?.findingStatus??p.get(g)??(I?"blocking":"advisory");I&&(I.projectPath=D({workspacePath:e.workspacePath,projectPath:c,projectName:d,includeAbsolutePaths:e.includeAbsolutePaths}));let ee=Q({strategy:a.strategy,includeAbsolutePaths:e.includeAbsolutePaths}),te=w(a.files).map(S=>Z({workspacePath:e.workspacePath,projectPath:c,projectName:d,filePath:S,includeAbsolutePaths:e.includeAbsolutePaths})).filter(S=>!!S),W=v({id:`doctor.${d}.${g}`,artifactKind:e.report.artifactKind,cardId:e.report.cardId,title:typeof a.title=="string"&&a.title.trim()?a.title.trim():`Repair ${d}`,order:e.startOrder+o.length,phase:I?"dependency-remediation":"doctor-remediation",blocker:typeof a.reason=="string"&&a.reason.trim()?a.reason.trim():`Doctor remediation is pending for ${d}.`,summary:typeof a.reason=="string"&&a.reason.trim()?a.reason.trim():`Execute the Doctor-authored repair capability for ${d}.`,mode:m?a.canEditFiles===true?"edit-file":"run-command":"manual-guidance",risk:R,status:m?"ready":a.status==="manual"?"guidance-only":"blocked",...h?{command:h}:{},...j?{invocation:j}:{},verifyCommand:typeof a.verifyCommand=="string"&&a.verifyCommand.trim()?a.verifyCommand.trim():"npx workspai doctor project --json",files:te,notes:[`Source Doctor capability: ${g}`,`Doctor finding status: ${$}`,...w(a.limitations)],scope:"project",projectName:d,projectPath:D({workspacePath:e.workspacePath,projectPath:c,projectName:d,includeAbsolutePaths:e.includeAbsolutePaths}),sourceStepId:g,findingId:C?.findingId??(typeof a.issueId=="string"&&a.issueId.trim()?a.issueId.trim():g),findingStatus:$,causalKey:C?.causalKey,strategy:ee,transaction:I,cwd:"project",...x?{operation:x,rollback:{available:true,strategy:"manual"}}:{}}),O=h?o.findIndex(S=>S.projectName===d&&S.command===h&&S.cwd==="project"):-1;if(O>=0){o[O]=ne({existing:o[O],incoming:W});continue}o.push(W);}}return o}function ue(e){let i=[],r=se("npx workspai bootstrap --json");for(let o of e.blockers)o.includes("profile.enterprise.ci")&&i.push(v({id:"bootstrap.enterprise-ci",artifactKind:"bootstrap-compliance",cardId:"bootstrap",title:"Run bootstrap in deterministic CI mode",order:10,phase:"bootstrap-preflight",blocker:o,summary:"Enterprise bootstrap compliance requires --ci for deterministic execution.",mode:"run-command",risk:"safe",command:r,verifyCommand:r})),o.includes("profile.enterprise.compatibility-matrix")&&i.push(v({id:"bootstrap.compatibility-matrix",artifactKind:"bootstrap-compliance",cardId:"bootstrap",title:"Create enterprise compatibility matrix baseline",order:20,phase:"bootstrap-config",blocker:o,summary:"Create the missing compatibility matrix baseline without overwriting user data.",mode:"edit-file",risk:"safe",verifyCommand:r,files:[t.compatibilityMatrix],operation:{type:"file-create",path:t.compatibilityMatrix,content:ce(e.generatedAt),overwrite:false}})),o.includes("profile.enterprise.mirror-config")&&i.push(v({id:"bootstrap.mirror-config",artifactKind:"bootstrap-compliance",cardId:"bootstrap",title:"Create enterprise mirror config baseline",order:30,phase:"bootstrap-config",blocker:o,summary:"Create the missing mirror configuration baseline without enabling mirroring.",mode:"edit-file",risk:"safe",verifyCommand:r,files:[".workspai/mirror-config.json"],operation:{type:"file-create",path:".workspai/mirror-config.json",content:de(e.generatedAt),overwrite:false}}));return i}function fe(e){let i=Array.isArray(e.report.payload.steps)?e.report.payload.steps:[],r=[],o=new Map;for(let t of i){let n=f(t),d=f(n?.command),c=typeof n?.id=="string"?n.id.trim():"",l=typeof n?.project=="string"?n.project.trim():"",p=typeof n?.status=="string"?n.status:"",k=typeof d?.display=="string"?d.display.trim():"",b=n?.required===true;if(!c.startsWith("project.")||!l||!b||p!=="fail"&&p!=="missing"||!/^npx\s+workspai\s+workspace\s+run\s+/i.test(k))continue;let s=c.split(".").at(-1)??"stage",a=`workspaceVerify.${c}`,g=o.get(l),u=/(?:^|\s)--no-gates(?:\s|$)/.test(k)?k:`${k} --no-gates`;r.push(v({id:a,artifactKind:e.report.artifactKind,cardId:e.report.cardId,title:typeof n.label=="string"&&n.label.trim()?n.label.trim():`Run ${s} for ${l}`,order:e.startOrder+r.length,phase:"fleet-run",blocker:typeof n.message=="string"&&n.message.trim()?n.message.trim():`${s} evidence is not current for ${l}.`,summary:`Produce fresh ${s} evidence for ${l} without re-entering the blocked aggregate gates.`,mode:"run-command",risk:s==="start"?"guarded":"safe",status:"ready",command:u,verifyCommand:e.ciMode?"npx workspai workspace verify --strict --json":"npx workspai workspace verify --json",scope:"project",projectName:l,projectPath:l,sourceStepId:c,...g?{dependsOn:[g]}:{},cwd:"workspace",notes:[`Source Workspace Verify step: ${c}`,"Aggregate verification must run only after this project evidence producer completes."]})),o.set(l,a);}return r}var T={python:["python3","python","py"],node:["node"],go:["go"],java:["java"],dotnet:["dotnet"],rust:["cargo"],php:["php"]};async function ge(e,i,r){for(let o of T[e]??[e])if(r?await r(o,i):await a$2({executable:o,cwd:i}))return o}async function ye(e){let i=P(e.blockers.flatMap(o=>{let t=o.match(/(?:project runtimes?|workspace)\s*\(([^)]+)\)\s+(?:is|are) not pinned/i);return t?.[1]?t[1].split(",").map(n=>n.trim().toLowerCase()).filter(n=>/^(python|node|go|java|dotnet|rust|php)$/.test(n)):[]})),r=[];for(let o of i){let t=T[o]??[o],n=await ge(o,e.workspacePath,e.toolAvailable),d=`environment.runtime.${o}`,c=`readiness.toolchain.${o}.setup`,l=e.blockers.find(p=>p.toLowerCase().includes(`(${o})`))??`The ${o} runtime is not pinned in the canonical workspace toolchain.`;n||r.push(v({id:d,artifactKind:e.report.artifactKind,cardId:e.report.cardId,title:`Provide the ${o} host runtime`,order:e.startOrder+r.length,phase:"host-prerequisite",blocker:`No launchable ${o} runtime is available in the current environment.`,summary:`Install or configure ${t.join(" or ")} outside Workspai, then refresh the remediation plan.`,mode:"manual-guidance",risk:"safe",status:"guidance-only",verifyCommand:`npx workspai setup ${o} --json`,requirements:[{kind:"executable",id:`executable:${o}`,status:"missing",executable:t.join("|"),message:`A launchable ${t.join(" or ")} executable must be visible to Workspai.`}],retryPolicy:{sameGeneration:"forbidden",resumeWhen:"environment-changed"},notes:["`workspai setup` detects and pins an existing runtime; it does not install host software."]})),r.push(v({id:c,artifactKind:e.report.artifactKind,cardId:e.report.cardId,title:`Pin ${o} in the workspace toolchain`,order:e.startOrder+r.length,phase:"toolchain-reconciliation",blocker:l,summary:`Detect and persist the current ${o} runtime in the canonical workspace toolchain lock.`,mode:"run-command",risk:"safe",status:n?"ready":"blocked",command:`npx workspai setup ${o} --json`,invocation:U(["setup",o,"--json"]),verifyCommand:e.ciMode?"npx workspai readiness --strict --json":"npx workspai readiness --json",dependsOn:n?void 0:[d],requirements:[{kind:"executable",id:`executable:${o}`,status:n?"satisfied":"missing",executable:n??t.join("|"),message:n?`Runtime prerequisite is launchable: ${n}.`:`Runtime prerequisite is unavailable: ${t.join(" or ")}.`},...n?[]:[{kind:"action",id:`action:${d}`,status:"pending",actionId:d,message:"The host runtime prerequisite must be resolved first."}]],retryPolicy:n?{sameGeneration:"allowed",resumeWhen:"immediate"}:{sameGeneration:"forbidden",resumeWhen:"environment-changed"},notes:["Run from the workspace root so the canonical toolchain.lock is updated."]})),r.push(v({id:`readiness.toolchain.${o}.bootstrap`,artifactKind:e.report.artifactKind,cardId:e.report.cardId,title:`Reconcile the ${o} workspace foundation`,order:e.startOrder+r.length,phase:"toolchain-reconciliation",blocker:`The ${o} runtime pin must be reconciled with the workspace foundation.`,summary:"Refresh the workspace foundation after the runtime pin is written.",mode:"run-command",risk:"guarded",status:n?"ready":"blocked",command:"npx workspai bootstrap --ci --json",invocation:U(["bootstrap","--ci","--json"]),verifyCommand:e.ciMode?"npx workspai readiness --strict --json":"npx workspai readiness --json",dependsOn:[c],requirements:[{kind:"action",id:`action:${c}`,status:"pending",actionId:c,message:`The ${o} toolchain pin must complete first.`}],retryPolicy:{sameGeneration:n?"allowed":"forbidden",resumeWhen:n?"dependencies-complete":"environment-changed"}}));}return r}function be(e){if(e.report.artifactKind==="readiness"&&/dependenc(?:y|ies).*vulnerabil|vulnerabil.*dependenc(?:y|ies)|security audit/i.test(e.blocker))return v({id:`${e.report.cardId}.doctor-owner.${e.order}`,artifactKind:e.report.artifactKind,cardId:e.report.cardId,title:"Resolve dependency vulnerability through Doctor",order:e.order,phase:"dependency-remediation",blocker:e.blocker,summary:"Release Readiness is the aggregate gate; use the project-scoped Doctor remediation capability that owns this dependency failure.",mode:"verify-before-fix",risk:"guarded",status:"review-required",command:"npx workspai doctor workspace --plan --json",verifyCommand:e.ciMode?"npx workspai readiness --strict --json":"npx workspai readiness --json",notes:["Read doctor-remediation-plan-last-run.json and execute the matching surface-security-hygiene capability before rerunning Readiness.","Do not treat a Readiness refresh as remediation for a source dependency vulnerability."]});let r={analyze:{title:"Refresh analyze evidence",phase:"analysis",command:"npx workspai analyze --strict --json",verify:"npx workspai analyze --strict --json"},readiness:{title:"Refresh release readiness",phase:"release-readiness",command:e.ciMode?"npx workspai readiness --strict --json":"npx workspai readiness --json",verify:e.ciMode?"npx workspai readiness --strict --json":"npx workspai readiness --json"},pipeline:{title:"Rerun governance pipeline",phase:"governance-pipeline",command:"npx workspai pipeline --json --strict",verify:"npx workspai pipeline --json --strict"},"workspace-run":{title:"Rerun failed workspace stage",phase:"fleet-run",command:e.ciMode?"npx workspai workspace run test --strict --json":"npx workspai workspace run test --json",verify:e.ciMode?"npx workspai workspace run test --strict --json":"npx workspai workspace run test --json"},"workspace-verify":{title:"Refresh workspace verify gate",phase:"verification",command:e.ciMode?"npx workspai workspace verify --strict --json":"npx workspai workspace verify --json",verify:e.ciMode?"npx workspai workspace verify --strict --json":"npx workspai workspace verify --json"},"doctor-workspace":{title:"Use Doctor remediation plan",phase:"doctor-remediation",command:"npx workspai doctor workspace --plan --json",verify:"npx workspai doctor workspace --json"}}[e.report.artifactKind]??{title:"Refresh artifact evidence",phase:"evidence-refresh",command:"npx workspai pipeline --json --strict",verify:"npx workspai pipeline --json --strict"};return v({id:`${e.report.cardId}.refresh.${e.order}`,artifactKind:e.report.artifactKind,cardId:e.report.cardId,title:r.title,order:e.order,phase:r.phase,blocker:e.blocker,summary:"No deterministic file operation is available for this artifact yet; refresh the evidence and continue with the card-specific plan.",mode:e.report.artifactKind==="doctor-workspace"?"verify-before-fix":"run-command",risk:"guarded",status:e.report.artifactKind==="doctor-workspace"?"review-required":"ready",command:r.command,verifyCommand:r.verify,notes:e.report.artifactKind==="doctor-workspace"?["Read doctor-remediation-plan-last-run.json for ordered file-level steps."]:[]})}function Y(e){let i=e.transaction?.ecosystem.toLowerCase(),r=y.basename(e.invocation?.executable??"").toLowerCase(),o=`${i??""}:${r}`;if(/(^|:)(python|pip|pip3|poetry|uv)(:|$)/.test(o))return "python";if(/(^|:)(node|npm|pnpm|yarn|bun)(:|$)/.test(o))return "node";if(/(^|:)(go)(:|$)/.test(o))return "go";if(/(^|:)(java|maven|mvn|mvnw|gradle|gradlew)(:|$)/.test(o))return "java";if(/(^|:)(dotnet|nuget)(:|$)/.test(o))return "dotnet";if(/(^|:)(rust|cargo|rustc)(:|$)/.test(o))return "rust";if(/(^|:)(php|composer)(:|$)/.test(o))return "php"}function he(e,i){let r=i.invocation?.cwd??e;return y.isAbsolute(r)?r:y.resolve(e,r)}function ke(e,i){let r=Y(e);if(r&&T[r]?.includes(y.basename(i)))return `environment.runtime.${r}`;let o=(e.projectName??"workspace").replace(/[^a-zA-Z0-9.-]+/g,"-"),t=y.basename(i).replace(/[^a-zA-Z0-9.-]+/g,"-");return `environment.executable.${o}.${t}`}async function Ae(e){let i=new Map,r=new Map(e.actions.map(t=>[t.id,t]));for(let t of e.actions){if(!t.invocation||t.status==="guidance-only")continue;let n=he(e.workspacePath,t),d=e.toolAvailable?await e.toolAvailable(t.invocation.executable,n):await a$2({executable:t.invocation.executable,cwd:n}),c={kind:"executable",id:`executable:${t.invocation.executable}`,status:d?"satisfied":"missing",executable:t.invocation.executable,message:d?`Required executable is launchable: ${t.invocation.executable}.`:`Required executable is unavailable: ${t.invocation.executable}.`};if(t.requirements=[...(t.requirements??[]).filter(p=>p.id!==c.id),c],d)continue;let l=ke(t,t.invocation.executable);!r.has(l)&&!i.has(l)&&i.set(l,v({id:l,artifactKind:t.artifactKind,cardId:"environment",title:`Provide ${y.basename(t.invocation.executable)}`,order:0,phase:"host-prerequisite",blocker:`The required executable ${t.invocation.executable} is unavailable.`,summary:"Install or configure the required executable outside Workspai, then refresh the plan.",mode:"manual-guidance",risk:"safe",status:"guidance-only",verifyCommand:t.verifyCommand,scope:t.scope,projectName:t.projectName,projectPath:t.projectPath,requirements:[c],retryPolicy:{sameGeneration:"forbidden",resumeWhen:"environment-changed"},notes:["The CLI does not install host runtimes or system package managers implicitly."]})),t.status="blocked",t.dependsOn=P([...t.dependsOn??[],l]),t.requirements.push({kind:"action",id:`action:${l}`,status:"pending",actionId:l,message:"Resolve the executable prerequisite and generate fresh evidence first."}),t.retryPolicy={sameGeneration:"forbidden",resumeWhen:"environment-changed"},t.notes.push("This action is not eligible in the current plan generation because its executable precondition failed.");}let o=[...i.values(),...e.actions];return o.forEach((t,n)=>{t.order=n+1;}),o}function we(e){let i=new Set(e.map(r=>r.id));for(let r of e){if(!r.transaction)continue;let o=Y(r);if(!o)continue;let t=`readiness.toolchain.${o}.bootstrap`;i.has(t)&&(r.dependsOn=P([...r.dependsOn??[],t]),r.requirements=[...r.requirements??[],{kind:"action",id:`action:${t}`,status:"pending",actionId:t,message:`The canonical ${o} workspace foundation must be reconciled first.`}],r.status==="ready"&&(r.retryPolicy={sameGeneration:"allowed",resumeWhen:"dependencies-complete"}));}}function ve(e){let i=e.filter(t=>t.status==="ready"&&(t.dependsOn?.length??0)===0).map(t=>t.id),r=e.filter(t=>t.status==="blocked").map(t=>t.id),o=e.find(t=>t.status==="guidance-only")?.id??null;return {nextActionId:i[0]??o,eligibleActionIds:i,blockedActionIds:r}}async function Re(e$1){let i=[a(e$1,".workspai/reports"),e(e$1,".workspai/reports")],r=[],o=new Set;for(let t of oe)for(let n of t.fileNames){let d=(await Promise.all(i.map(c=>y.join(c,n)))).find(c=>existsSync(c));if(!(!d||o.has(`${t.artifactKind}:${n}`))){o.add(`${t.artifactKind}:${n}`);try{let c=await ie.readJSON(d),l=f(c);if(!l)continue;r.push({artifactKind:t.artifactKind,cardId:t.cardId,fileName:n,absolutePath:d,payload:l});break}catch{r.push({artifactKind:t.artifactKind,cardId:t.cardId,fileName:n,absolutePath:d,payload:{blockers:[`${t.artifactKind}: report exists but could not be parsed.`]}});break}}}return r}async function Me(e){let i=y.resolve(e.workspacePath),r=e.includeAbsolutePaths===true,o=e.ciMode===true,t=new Date().toISOString(),n=a(i,".workspai/reports"),d=await Re(i),c=[],l=1;for(let s of d){if(s.artifactKind==="doctor-workspace"){let m=Array.isArray(s.payload.steps)?pe({report:s,workspacePath:i,includeAbsolutePaths:r,startOrder:l}):me({report:s,workspacePath:i,includeAbsolutePaths:r,startOrder:l});c.push(...m),l+=m.length;continue}let a=le(s);if(a.length===0)continue;if(s.artifactKind==="bootstrap-compliance"){c.push(...ue({blockers:a,generatedAt:t})),l=c.length+1;continue}if(s.artifactKind==="workspace-verify"){let m=fe({report:s,startOrder:l,ciMode:o});if(m.length>0){c.push(...m),l+=m.length;continue}}if(s.artifactKind==="readiness"){let m=await ye({report:s,blockers:a,startOrder:l,ciMode:o,workspacePath:i,toolAvailable:e.toolAvailable});if(m.length>0){c.push(...m),l+=m.length;continue}}let g=c.some(m=>m.transaction?.kind==="dependency-security"),u=s.artifactKind==="readiness"&&a.some(m=>/dependenc(?:y|ies).*vulnerabil|vulnerabil.*dependenc(?:y|ies)|security audit/i.test(m));if(g&&u)continue;let R=a[0],h=be({report:s,blocker:R,order:l,ciMode:o}),x={readiness:new Set(["bootstrap","doctor"]),pipeline:new Set(["bootstrap","doctor","analyze","readiness"]),workspaceVerify:new Set(["bootstrap","doctor","readiness","workspaceRun"])}[s.cardId];if(s.cardId==="pipeline"){let m=["doctor","analyze","readiness"].find(A=>R.toLowerCase().includes(A));m&&(x=new Set([m]));}if(x){let m=c.filter(A=>x.has(A.cardId)&&A.risk!=="invasive"&&A.status!=="blocked"&&A.status!=="guidance-only").map(A=>A.id);m.length>0&&(h.dependsOn=P([...h.dependsOn??[],...m]),h.notes.push("This aggregate gate must run after its contract-owned upstream remediation actions."));}a.length>1&&h.notes.push(...a.slice(1,8).map(m=>`Related blocker: ${m}`)),c.push(h),l+=1;}we(c);let p=await Ae({actions:c,workspacePath:i,toolAvailable:e.toolAvailable}),k=ve(p),b$1={safe:p.filter(s=>s.risk==="safe").length,guarded:p.filter(s=>s.risk==="guarded").length,invasive:p.filter(s=>s.risk==="invasive").length};return {schemaVersion:a$1,generatedAt:t,workspace:{name:await b(i),...r?{path:i}:{}},source:{command:"workspace remediation-plan",reportsDir:ae(i,n,r),includeAbsolutePaths:r,ciMode:o},summary:{artifactsScanned:d.length,cardsCovered:P(p.map(s=>s.cardId)).length,totalActions:p.length,executableActions:p.filter(s=>s.status==="ready").length,blockedActions:p.filter(s=>s.status==="blocked").length,guidanceActions:p.filter(s=>s.status==="guidance-only").length,risk:b$1},execution:k,actions:p}}async function Ee(e,i){return h(i,t.artifactRemediationPlan,e)}export{Me as a,Ee as b};
@@ -0,0 +1,2 @@
1
+ import {r,m,n,l}from'./chunk-O2CFT2A3.js';import {a}from'./chunk-HTYMXMQM.js';import {c}from'./chunk-S5KTATOU.js';import {d as d$1}from'./chunk-LMOTDLJF.js';import {h as h$1}from'./chunk-BLEIUQL6.js';import {a as a$1}from'./chunk-AFIFZTOY.js';import {e,d,b as b$1}from'./chunk-EWZZUQBR.js';import {q,p}from'./chunk-ODK4LCEL.js';import k from'path';import V from'fs-extra';import {spawnSync}from'child_process';function ue(){let e={...process.env};return delete e.GIT_DIR,delete e.GIT_WORK_TREE,delete e.GIT_INDEX_FILE,delete e.GIT_PREFIX,e}function x(e,t,a){let r=spawnSync("git",t,{cwd:e,env:ue(),encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(r.status!==0)return {ok:false,stdout:""};let i=r.stdout??"";return {ok:true,stdout:a?.preserveWhitespace?i:i.trim()}}function ge(e){let t=e.replace(/\\/g,"/").replace(/^\.\//,"");return t===".workspai/AGENT-GROUNDING.md"?true:[".workspai/reports/",".workspai/cache/",".rapidkit/reports/",".rapidkit/cache/"].some(a=>t.startsWith(a))}function ke(e){let t=[],a=[],r=[];for(let i of e.split(`
2
+ `)){if(!i.trim())continue;let n=i.slice(0,2),c=i.slice(3).trim();if(c&&!ge(c)){if(n==="??"){a.push(c);continue}n.includes("D")&&r.push(c),t.push(c);}}return {changedFiles:[...new Set(t)].sort(),untrackedFiles:[...new Set(a)].sort(),deletedFiles:[...new Set(r)].sort()}}function Q(e,t){let a={available:false,dirty:false,changedFiles:[],untrackedFiles:[],deletedFiles:[]},r=x(e,["rev-parse","--is-inside-work-tree"]);if(!r.ok||r.stdout!=="true")return a;let i=x(e,["rev-parse","--abbrev-ref","HEAD"]),n=x(e,["rev-parse","HEAD"]),c=x(e,["status","--porcelain=v1","--untracked-files=all"],{preserveWhitespace:true}),p=ke(c.stdout),m=p.changedFiles.length>0||p.untrackedFiles.length>0||p.deletedFiles.length>0;return {available:true,branch:i.ok?i.stdout:void 0,commit:n.ok?n.stdout:void 0,ref:t?.ref,dirty:m,changedFiles:p.changedFiles,untrackedFiles:p.untrackedFiles,deletedFiles:p.deletedFiles}}var oe=q.snapshot,L=q.diff,T=p.snapshot,ae=p.diff,he=q.impact,we=p.impact;function ye(e$1){if(e$1.model.projectTopology||!e$1.model.graph||e$1.modelHash!==e(e$1.model))return null;let t={...e$1.model,projectTopology:e$1.model.graph,graph:e$1.model.graph};return {...e$1,modelHash:d(t),model:t}}function ne(e){let t=e.trim().toLowerCase();return t==="git"||t.startsWith("git:")}function We(e){let t=e.trim();return t.toLowerCase()==="git"?"HEAD":t.toLowerCase().startsWith("git:")&&t.slice(4).trim()||"HEAD"}function se(e,t){return k.isAbsolute(t)?t:k.join(e,t)}async function be(e){let t=await V.readJson(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace model input is not a JSON object: ${e}`);let a=t;if(a.schemaVersion===oe){a$1(t,"contracts/workspace-intelligence/workspace-model-snapshot.v1.json",`Workspace model snapshot ${e}`);let r=a;if(!r.model||r.model.schemaVersion!==l)throw new Error(`Invalid workspace model snapshot: ${e}`);let i=d(r.model);if(r.modelHash!==i){let n=ye(r);if(!n)throw new Error(`Workspace model snapshot hash mismatch: ${e}`);return {model:n.model,hash:n.modelHash}}return {model:r.model,hash:r.modelHash}}if(a.schemaVersion===l){a$1(t,"contracts/workspace-intelligence/workspace-model.v1.json",`Workspace model ${e}`);let r=a;return {model:r,hash:d(r)}}throw a.schemaVersion===L?new Error(`workspace diff --from received a diff report (${k.basename(e)}). Use a workspace model snapshot or model report as baseline, e.g. ${T}. To analyze an existing diff report, run: npx workspai workspace impact --from ${k.basename(e)} --json`):new Error(`Unsupported workspace model input schema: ${String(a.schemaVersion)}`)}async function ve(e){let t=await V.readJson(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace diff input is not a JSON object: ${e}`);let a=t;if(a.schemaVersion!==L)return null;a$1(t,"contracts/workspace-intelligence/workspace-model-diff.v1.json",`Workspace model diff ${e}`);let r=a;if(!r.currentModel||r.currentModel.schemaVersion!==l||!r.summary||!Array.isArray(r.changes))throw new Error(`Invalid workspace model diff report: ${e}`);if(r.toHash!==d(r.currentModel))throw new Error(`Workspace model diff current-model hash mismatch: ${e}`);return r}async function Ye(e){let t=e.model??await r({workspacePath:e.workspacePath,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now});return {schemaVersion:oe,generatedAt:(e.now??new Date).toISOString(),modelHash:d(t),modelRef:m,model:t}}async function Qe(e,t){return h$1(t,T,d$1(e))}function F(e){let{evidence:t,...a}=e;return a}function h(e,t){e.push(t);}function je(e,t){let a=[],r=["name","profile","type"],i=["workspaceType","surfaces","runtimeFamilies","businessCapabilities"];for(let n of r){let c=e.workspace[n],p=t.workspace[n];b$1(c)!==b$1(p)&&h(a,{type:"workspace.changed",severity:"info",target:`workspace.${n}`,message:`Workspace metadata field changed: ${String(n)}`,before:c,after:p});}for(let n of i){let c=e.identity[n],p=t.identity[n];b$1(c)!==b$1(p)&&h(a,{type:"workspace.changed",severity:"info",target:`identity.${n}`,message:`Workspace identity field changed: ${String(n)}`,before:c,after:p});}return b$1(e.policies)!==b$1(t.policies)&&h(a,{type:"workspace.changed",severity:"warning",target:"policies",message:"Workspace policy summary changed.",before:e.policies,after:t.policies}),b$1(e.discovery)!==b$1(t.discovery)&&h(a,{type:"workspace.changed",severity:"info",target:"discovery",message:"Workspace discovery settings changed.",before:e.discovery,after:t.discovery}),e.contracts.exists!==t.contracts.exists&&h(a,{type:"workspace.changed",severity:t.contracts.exists?"info":"warning",target:t.contracts.workspaceContractPath,message:"Workspace contract presence changed.",before:e.contracts.exists,after:t.contracts.exists}),a}function Me(e,t){let a=e.validation??null,r=t.validation??null;return b$1(a)===b$1(r)?[]:[{type:"validation.changed",severity:r?.status==="failed"?"critical":"warning",target:"validation",message:"Workspace model validation changed.",before:a,after:r}]}function Ie(e,t){let a=[],r=new Map(e.projects.map(n=>[n.path,n])),i=new Map(t.projects.map(n=>[n.path,n]));for(let[n,c]of i.entries()){let p=r.get(n);if(!p){h(a,{type:"project.added",severity:"info",target:n,message:`Project added: ${c.name}`,after:F(c)});continue}let m=F(p),l=F(c);if(b$1(m)!==b$1(l)){let u=p.runtime!==c.runtime||p.framework!==c.framework;h(a,{type:"project.changed",severity:u?"warning":"info",target:n,message:`Project changed: ${c.name}`,before:m,after:l});}}for(let[n,c]of r.entries())i.has(n)||h(a,{type:"project.removed",severity:"warning",target:n,message:`Project removed: ${c.name}`,before:F(c)});return a.sort((n,c)=>`${n.type}:${n.target}`.localeCompare(`${c.type}:${c.target}`))}async function Pe(e){let t=k.resolve(e.workspacePath),a=ne(e.fromPath),r$1=a?We(e.fromPath):void 0,i=e.fromPath;if(a){let f=k.join(t,T);if(!await V.pathExists(f))throw new Error("Git-aware workspace diff requires an existing snapshot at .workspai/reports/workspace-model-snapshot.json. Run: npx workspai workspace snapshot --json");i=T;}let n=se(t,i),c=await be(n),p=e.model??await r({workspacePath:t,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now}),m$1=d(p),l=[...je(c.model,p),...Ie(c.model,p),...Me(c.model,p)],u;e.includeGitObservation!==false&&(u=e.gitObservation??Q(t,{ref:r$1}),u.available&&Se(l,u,p));let v=c.hash!==m$1;v&&!l.some(f=>!f.type.startsWith("git."))&&h(l,{type:"workspace.changed",severity:"warning",target:"model.structural-hash",message:"Workspace structural identity changed outside the currently classified diff fields.",before:c.hash,after:m$1});let P=l.filter(f=>f.type.startsWith("git.")).length,w=a?`git:${r$1??"HEAD"}`:k.relative(t,n).split(k.sep).join("/");return {schemaVersion:L,generatedAt:(e.now??new Date).toISOString(),fromRef:w,toRef:m,fromHash:c.hash,toHash:m$1,summary:{changed:v||P>0,addedProjects:l.filter(f=>f.type==="project.added").length,removedProjects:l.filter(f=>f.type==="project.removed").length,changedProjects:l.filter(f=>f.type==="project.changed").length,workspaceChanges:l.filter(f=>f.type==="workspace.changed").length,validationChanges:l.filter(f=>f.type==="validation.changed").length,gitChangedFiles:P},git:u?.available?Oe(u,r$1):{available:false,dirty:false,changedFiles:0,untrackedFiles:0,deletedFiles:0},changes:l,currentModel:p}}async function Ze(e,t){return h$1(t,ae,d$1(e))}function I(e){return {none:0,low:1,medium:2,high:3,critical:4}[e]}function Z(e){return e.reduce((t,a)=>I(a)>I(t)?a:t,"none")}var N=["none","low","medium","high","critical"];function Re(e){let t=Math.max(1,I(e)-1);return N[t]}function Ce(e){let t=Math.min(N.length-1,I(e)+1);return N[t]}function ee(e){return e.join(" ")}function b(e,t,a,r){return {id:e,label:t,scope:r.scope,project:r.project,display:ee(["npx","workspai",...a]),execute:ee(["npx","--yes","--package","workspai","workspai",...a]),required:r.required!==false}}function te(e){let t=`project:${e.name}`,a=e.commands.fleetStages,r={init:`Run init for ${e.name}`,test:`Run tests for ${e.name}`,build:`Run build for ${e.name}`,start:`Run start for ${e.name}`};return ["init","test","build","start"].filter(i=>a.includes(i)).map(i=>b(`project.${e.name}.${i}`,r[i],["workspace","run",i,"--scope",t,"--json"],{scope:"project",project:e.name}))}function _(){return [b("workspace.doctor","Run workspace doctor",["doctor","workspace","--json"],{scope:"workspace"}),b("workspace.contract.verify","Verify workspace contract",["workspace","contract","verify","--json"],{scope:"workspace"}),b("workspace.readiness","Run release readiness",["readiness","--json"],{scope:"workspace"}),b("workspace.analyze","Run workspace analyze",["analyze","--json"],{scope:"workspace",required:false}),b("workspace.pipeline","Run governance pipeline",["pipeline","--json"],{scope:"workspace",required:false}),b("workspace.doctor-fix","Verify doctor fix result",["doctor","workspace","--fix","--json"],{scope:"workspace",required:false})]}function Ee(e,t){let a=t.split(k.sep).join("/");return e.projects.filter(i=>{let n=i.path.split(k.sep).join("/");return a===n||a.startsWith(`${n}/`)}).sort((i,n)=>n.path.length-i.path.length)[0]}function Se(e,t,a){let r=new Set(e.map(n=>n.target)),i=(n,c)=>{let p=c.split(k.sep).join("/"),m=`git:${p}`;if(r.has(m))return;let l=Ee(a,p),u=l?`${l.name} (${l.path})`:"workspace";h(e,{type:n,severity:n==="git.deleted"?"warning":"info",target:m,message:`Git ${n==="git.untracked"?"untracked":n==="git.deleted"?"deleted":"changed"} file affects ${u}: ${p}`,after:{path:p,project:l?.name,projectPath:l?.path}}),r.add(m);};for(let n of t.changedFiles)i("git.file.changed",n);for(let n of t.untrackedFiles)i("git.untracked",n);for(let n of t.deletedFiles)i("git.deleted",n);}function Oe(e,t){return {available:true,ref:t??e.ref,branch:e.branch,commit:e.commit,dirty:e.dirty,changedFiles:e.changedFiles.length,untrackedFiles:e.untrackedFiles.length,deletedFiles:e.deletedFiles.length}}function Ae(e){let t=new Set,a=[];for(let r of e){let i=`${r.scope}:${r.project??""}:${r.display}`;t.has(i)||(t.add(i),a.push(r));}return a}function De(e){return e.type==="project.removed"?"high":e.severity==="critical"?"critical":e.severity==="warning"?"high":("medium")}function $e(e,t){return e.severity==="critical"?"critical":e.target==="policies"||e.target.includes("contract")?"high":e.type==="validation.changed"?(t?.projectCount??0)===0?"low":"high":e.target==="evidence"?"low":e.severity==="warning"?"medium":"low"}function xe(e){return e.affectedProjects>0||e.projectCount>0||!e.changes.every(a=>a.severity==="critical"?false:a.type.startsWith("git.")||a.type==="validation.changed")?e.risk:I(e.risk)>=I("high")||e.risk==="medium"?"low":e.risk}function re(e,t){if(!e||e==="workspace")return true;let a=(e.startsWith("project:")?e.slice(8):e).trim().toLowerCase();return [t.name,t.path,k.basename(t.path),t.absolutePath].filter(r=>typeof r=="string"&&r.trim().length>0).map(r=>r.trim().toLowerCase()).includes(a)}function Fe(e){if(!e.changed)return {headline:"No workspace model impact detected.",bullets:["The current workspace model matches the provided snapshot/report."],unsafeAssumptions:["Do not claim runtime verification passed unless a report exists."]};let t=e.affectedProjects.map(a=>a.project?.name??a.target);return {headline:`Workspace impact risk: ${e.risk}.`,bullets:[`Affected projects: ${t.length?t.join(", "):"none"}.`,`Workspace-level items: ${e.workspaceImpact.length}.`,"Use the verification plan before recommending apply, rollback, or release actions."],unsafeAssumptions:["Do not infer test/build success from impact alone.","Do not apply fixes without project scope and verification evidence.","Use display commands for users and execute commands for automation."]}}async function et(e){let t=k.resolve(e.workspacePath),a$1=ne(e.fromPath),r=e.diff;if(!r&&!a$1){let o=se(t,e.fromPath);r=await ve(o)??void 0;}r||(r=await Pe({workspacePath:t,fromPath:e.fromPath,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,includeGitObservation:e.includeGitObservation,gitObservation:e.gitObservation,now:e.now,model:e.model}));let i=new Map(r.currentModel.projects.map(o=>[o.path,o])),n$1=new Map(r.currentModel.projects.map(o=>[o.name,o])),c$1=r.changes.filter(o=>o.type.startsWith("project.")),p=new Map;for(let o of c$1){let d=(i.get(o.target)??(typeof o.before?.name=="string"?n$1.get(o.before.name):void 0))?.path??o.target,y=p.get(d)??[];y.push(o),p.set(d,y);}let m=[];for(let[o,s]of p.entries()){let d=i.get(o);if(d&&!re(e.scope,d))continue;let y=Z(s.map(De)),C=d?.name??(typeof s[0]?.before?.name=="string"?String(s[0].before.name):o);m.push({id:`project:${C}`,scope:"project",target:o,title:`Project impact: ${C}`,summary:s.map(j=>j.message).join(" "),risk:y,reasons:s.map(j=>`${j.type}: ${j.message}`),project:d?{name:d.name,path:d.path,kind:d.kind,runtime:d.runtime,framework:d.framework,supportTier:d.supportTier,...d.generator?{generator:d.generator}:{}}:void 0,verification:d?te(d):_()});}let l=n(r.currentModel),u=l?a(l):void 0,v=new Set(m.map(o=>o.project?.name).filter(o=>typeof o=="string")),P=new Map;for(let o of m)if(o.project?.name){let s=u?.byId.get(o.project.name);s&&(o.centrality={fanIn:s.fanIn,fanOut:s.fanOut,reach:s.reach,betweenness:s.betweenness,isHotspot:s.isHotspot},s.isHotspot&&(o.risk=Ce(o.risk),o.reasons=[...o.reasons,`graph.hotspot: critical-path project with ${s.reach} transitive dependent(s); risk escalated.`])),o.origin="direct",o.distance=0,P.set(o.project.name,o.risk);}let w=[],f=0;if(l&&v.size>0){let o=c(l,v);for(let s of o.values()){if(s.distance===0||v.has(s.id))continue;let d=n$1.get(s.id);if(d&&!re(e.scope,d))continue;let y=s.path[0],C=s.path[s.path.length-2]??y,j=P.get(y)??"medium",de=Re(j),M=u?.byId.get(s.id);f=Math.max(f,s.distance),w.push({id:`transitive:${s.id}`,scope:"project",target:d?.path??s.id,title:`Transitive impact: ${s.id}`,summary:`Depends on changed project ${y}${s.via?` via ${s.via}`:""} (distance ${s.distance}).`,risk:de,reasons:[`graph.dependent: depends on ${C}${s.via?` via ${s.via}`:""} (path ${s.path.join(" -> ")})`],project:d?{name:d.name,path:d.path,kind:d.kind,runtime:d.runtime,framework:d.framework,supportTier:d.supportTier,...d.generator?{generator:d.generator}:{}}:void 0,verification:d?te(d):_(),origin:"transitive",distance:s.distance,path:s.path,via:s.via,...M?{centrality:{fanIn:M.fanIn,fanOut:M.fanOut,reach:M.reach,betweenness:M.betweenness,isHotspot:M.isHotspot}}:{}});}}w.sort((o,s)=>o.target.localeCompare(s.target));let ie=u?u.hotspots.flatMap(o=>{let s=u.byId.get(o);return s?[{project:o,fanIn:s.fanIn,fanOut:s.fanOut,reach:s.reach,betweenness:s.betweenness}]:[]}):[],ce=r.changes.filter(o=>!o.type.startsWith("project.")),K=r.currentModel.summary?.projectCount??r.currentModel.projects.length,R=ce.map(o=>({id:`workspace:${o.target}`,scope:"workspace",target:o.target,title:`Workspace impact: ${o.target}`,summary:o.message,risk:$e(o,{projectCount:K}),reasons:[`${o.type}: ${o.message}`],verification:_()})),B=Ae([...m.flatMap(o=>o.verification),...w.flatMap(o=>o.verification),...R.flatMap(o=>o.verification),...r.summary.changed?_():[]]).filter(o=>o.required),pe=Z([...m.map(o=>o.risk),...w.map(o=>o.risk),...R.map(o=>o.risk)]),z=xe({risk:pe,affectedProjects:m.length,projectCount:K,changes:r.changes}),q={changed:r.summary.changed,risk:z,affectedProjects:m.length,workspaceItems:R.length,recommendedCommands:B.length,blastRadius:{directlyAffected:m.length,transitivelyAffected:w.length,maxDistance:f,graphEdges:l?.edges.length??0}};return {schemaVersion:he,generatedAt:(e.now??new Date).toISOString(),fromRef:r.fromRef,diffRef:ae,workspace:{name:r.currentModel.workspace.name,profile:r.currentModel.workspace.profile,type:r.currentModel.workspace.type},summary:q,affectedProjects:m.sort((o,s)=>o.target.localeCompare(s.target)),transitiveImpact:w,criticalPathHotspots:ie,workspaceImpact:R.sort((o,s)=>o.target.localeCompare(s.target)),verificationPlan:B,agentBrief:Fe({changed:q.changed,risk:z,affectedProjects:m,workspaceImpact:R}),diff:r}}async function tt(e,t){return h$1(t,we,d$1(e))}export{Q as a,oe as b,L as c,T as d,ae as e,he as f,we as g,ye as h,ne as i,We as j,Ye as k,Qe as l,Pe as m,Ze as n,_ as o,et as p,tt as q};
@@ -0,0 +1 @@
1
+ import {b,e,a as a$2}from'./chunk-64XWHDZ3.js';import {b as b$1,a as a$1}from'./chunk-UJXE4UAX.js';import {a,f}from'./chunk-25AWHAB5.js';import {randomUUID}from'crypto';import f$1 from'path';import x from'fs-extra';import m from'fs';var u=null;function T(){return u}function J(t){let e$1=t.argv??process.argv,n=S(e$1.slice(2)),i=process.env.WORKSPAI_PARENT_RUN_ID,r={runId:randomUUID(),startedAt:new Date().toISOString(),command:n,cwd:t.cwd??process.cwd(),rapidkitVersion:t.rapidkitVersion,...i?{parentRunId:i}:{},...i?{previousParentRunId:i}:{},finalized:false};return u=r,b(r.runId),process.env.WORKSPAI_PARENT_RUN_ID=r.runId,a({runId:r.runId,command:r.command,cwd:r.cwd,rapidkitVersion:r.rapidkitVersion,parentRunId:r.parentRunId,blueprint:t.activityBlueprint}),b$1(e$1)&&e(R(r,"run.started","info","CLI run started")),r}function A(t,e$1){if(!(!u||u.finalized)){if(u.finalized=true,f(t,e$1),u.previousParentRunId?process.env.WORKSPAI_PARENT_RUN_ID=u.previousParentRunId:delete process.env.WORKSPAI_PARENT_RUN_ID,!b$1()){u=null;return}t===0?e(R(u,"run.completed","info",e$1??"CLI run completed",{exitCode:t})):e(R(u,"run.failed","error",e$1??"CLI run failed",{exitCode:t})),u=null;}}function q(t=process.argv){a$1(t)==="json"&&(process.env.WORKSPAI_LOG_FORMAT="json",process.env.RAPIDKIT_LOG_FORMAT="json");let e=t.slice(0,2),n=S(t.slice(2));n.length!==t.length-2&&(process.argv=[...e,...n]);}function S(t){let e=[];for(let n=0;n<t.length;n+=1){let i=t[n];if(i!=="--log-json"){if(i==="--log-format"){n+=1;continue}i.startsWith("--log-format=")||e.push(i);}}return e}function R(t,e,n,i,r){return {schemaVersion:a$2,runId:t.runId,timestamp:new Date().toISOString(),level:n,event:e,component:"cli",message:i,command:t.command,metadata:{cwd:t.cwd,rapidkitVersion:t.rapidkitVersion,startedAt:t.startedAt,...r}}}var w=false,N=()=>{let t=process.exitCode??0,e=typeof t=="number"?t:Number.parseInt(t,10);A(Number.isFinite(e)?e:1);};function X(t){if(w||!t?.force&&(process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"))return;w=true,process.once("beforeExit",N);let e=process.exit.bind(process);process.exit=(n=>{let i=typeof n=="number"?n:typeof n=="string"?Number.parseInt(n,10):0,r=Number.isFinite(i)?i:1;return A(r),e(n)});}function tt(){return T()?.runId}function et(t,e){let{blockers:n,stderrTail:i,runId:r,generatedAt:s,...l}=e,o=s||(typeof t.generatedAt=="string"?t.generatedAt:void 0)||(typeof t.timestamp=="string"?t.timestamp:void 0)||new Date().toISOString();return {...t,...l,generatedAt:o,...n&&n.length>0?{blockers:n}:{},...i&&i.trim()?{stderrTail:i.trim()}:{},...r?{runId:r}:{}}}var P=new Set([".git",".workspai",".rapidkit",".venv","node_modules","target","dist","build","coverage","vendor"]),W=new Set(["test","tests","__tests__","spec","specs"]);function O(t){let e=t.toLowerCase();return e.endsWith(".rs")?"rust":e.endsWith(".go")?"go":e.endsWith(".py")?"python":/\.(?:test|spec)\.[cm]?[jt]sx?$/.test(e)?"node":e.endsWith(".java")?"java":e.endsWith(".kt")||e.endsWith(".kts")?"kotlin":e.endsWith(".exs")?"elixir":e.endsWith(".php")?"php":e.endsWith(".rb")?"ruby":e.endsWith(".cs")?"dotnet":e.endsWith(".c")?"c":/\.(?:cc|cpp|cxx)$/.test(e)?"cpp":null}function L(t,e){return e&&O(t)?true:/(?:^test[_-].+|[_-]test|\.test|\.spec|tests?)\.(?:rs|go|py|[cm]?[jt]sx?|java|kts?|exs|php|rb|cs|c|cc|cpp|cxx)$/i.test(t)}async function ot(t,e={}){let n=e.maxDepth??6,i=e.maxEntries??5e3,r=new Set,s=false,l=0;try{let p=(await x.readJson(f$1.join(t,"package.json")))?.scripts?.test;typeof p=="string"&&p.trim()&&(s=true,r.add("node"));}catch{}let o=[{dir:t,depth:0,insideTestDirectory:false}];for(;o.length>0&&l<i;){let a=o.shift();if(!a)break;let p;try{p=await x.readdir(a.dir,{withFileTypes:true});}catch{continue}for(let c of p){if(l+=1,l>i)break;if(P.has(c.name))continue;let I=f$1.join(a.dir,c.name);if(c.isDirectory()){let d=a.insideTestDirectory||W.has(c.name.toLowerCase());d&&(s=true),a.depth<n&&!c.name.startsWith(".")&&o.push({dir:I,depth:a.depth+1,insideTestDirectory:d});continue}if(c.isFile()){if(L(c.name,a.insideTestDirectory)){s=true;let d=O(c.name);d&&r.add(d);}if(!s&&c.name.toLowerCase().endsWith(".rs"))try{let d=await x.readFile(I,"utf8");(/#\s*\[\s*cfg\s*\(\s*test\s*\)\s*\]/u.test(d)||/#\s*\[\s*(?:[A-Za-z_][\w]*::)?test\s*\]/u.test(d))&&(s=true,r.add("rust"));}catch{}/^(?:pytest\.ini|tox\.ini|noxfile\.py|phpunit\.xml(?:\.dist)?|\.rspec)$/i.test(c.name)&&(s=true),/^(?:vitest|jest|playwright|cypress)\.config\.[cm]?[jt]s$/i.test(c.name)&&(s=true,r.add("node"));}}}return {detected:s,runtimeFamilies:[...r].sort()}}var V=new Set([".cs",".go",".java",".js",".jsx",".kt",".kts",".php",".py",".rb",".rs",".ts",".tsx"]),G=new Set([".git",".rapidkit",".venv",".workspai","build","coverage","dist","fixtures","htmlcov","node_modules","spec","specs","target","test","tests"]);async function j(t){try{return await m.promises.readFile(t,"utf8")}catch{return ""}}async function M(t){try{return await m.promises.access(t,m.constants.F_OK),true}catch{return false}}async function dt(t){let e=["health","health.ts","health.js","health.py","health.go","health.kt","health.rb","health.php","healthcheck","health-check","src/health","src/healthcheck","src/main/resources/application.yml","src/main/resources/application.properties","app/health.py","routes/health.ts","routes/health.js","app/controllers/health_controller.rb","app/controllers/health_check_controller.rb","config/initializers/health_check.rb"];for(let s of e)if(await M(f$1.join(t,s)))return true;let n=await j(f$1.join(t,"config","routes.rb"));if(/(?:health|readiness|liveness|readiness_check|health_check)/iu.test(n))return true;let i=[{directory:t,depth:0}],r=0;for(;i.length>0&&r<5e3;){let s=i.shift();if(!s)break;let l=[];try{l=await m.promises.readdir(s.directory,{withFileTypes:true});}catch{continue}for(let o of l){if(r+=1,r>5e3)break;if(o.isDirectory()){s.depth<6&&!o.name.startsWith(".")&&!G.has(o.name)&&i.push({directory:f$1.join(s.directory,o.name),depth:s.depth+1});continue}if(!o.isFile()||!V.has(f$1.extname(o.name).toLowerCase()))continue;if(/^(?:health|healthcheck|health-check|liveness|readiness)(?:\.|$)/iu.test(o.name))return true;let a=await j(f$1.join(s.directory,o.name));if(/(?:\bhealth\b|MapHealthChecks|health_check|healthcheck|readiness|liveness)/iu.test(a)&&/(?:@Router|@(?:app|router)\.(?:get|post)|\.(?:GET|Get|route|MapGet|MapHealthChecks)\s*\()/u.test(a))return true}}return false}export{J as a,A as b,q as c,X as d,tt as e,et as f,ot as g,dt as h};
@@ -0,0 +1,2 @@
1
+ import {b as b$1}from'./chunk-B6FJ6RG6.js';import {k,q as q$1,G as G$1}from'./chunk-CMLLERGG.js';import {a}from'./chunk-LMOTDLJF.js';import {c,j}from'./chunk-OH6LV5JP.js';import {m as m$2}from'./chunk-7NKM6EHE.js';import {e,f}from'./chunk-6B7L4NZE.js';import {b}from'./chunk-UJXE4UAX.js';import {m as m$1,t,k as k$1,u,l}from'./chunk-VQZ5PI5J.js';import fe,{promises}from'fs';import c$1 from'path';import J,{homedir}from'os';import {pathToFileURL}from'url';import m from'process';import h from'fs-extra';var R=["backend","frontend","desktop","agent","extension","gaming"],te=[{id:"backend",label:"Backend",hint:"APIs and services"},{id:"frontend",label:"Frontend",hint:"Web applications"},{id:"desktop",label:"Desktop",hint:"Native desktop applications"},{id:"agent",label:"AI Agent",hint:"Governed agent runtimes"},{id:"extension",label:"Extension",hint:"Editor and platform extensions"},{id:"gaming",label:"Gaming",hint:"Game runtimes and tooling"}];function oe(t){let o=t.label.indexOf(" \u2014 ");return o>=0?t.label.slice(o+3).trim():t.label.trim()}function ne(t){return R.includes(t.category)?t.category:null}function G(t){let e=c().flatMap(n=>{let s=ne(n);return s?[{value:n.id,label:`${U(s)} \xB7 ${oe(n)}`,hint:`${n.runtime} \xB7 tested baseline`,name:n.label,category:s}]:[]}),o=k().map(n=>({value:n.kitId,label:`Frontend \xB7 ${n.displayName}`,hint:"official \xB7 latest stable",name:`${n.displayName} \u2014 ${n.framework}`,category:"frontend"})),r=q$1().map(n=>({value:n.kitId,label:`${U(n.category)} \xB7 ${n.displayName}`,hint:`${n.runtimeCandidates.join(" + ")} \xB7 official latest stable`,name:`${n.displayName} \u2014 ${n.category}`,category:n.category})),a=G$1().map(n=>({value:n.id,label:`AI Agent \xB7 ${n.label}`,hint:`${n.runtime} \xB7 release-admitted baseline`,name:n.label,category:"agent"})),i=[...e,...o,...r,...a].filter(n=>!t||n.category===t).sort((n,s)=>{let l=R.indexOf(n.category),d=R.indexOf(s.category);return l-d||(n.label??"").localeCompare(s.label??"")});return B(i),i}function je(){let t=new Set(G().map(e=>e.category));return te.filter(e=>t.has(e.id)).map(e=>({value:e.id,label:e.label,hint:e.hint}))}function U(t){return t.charAt(0).toUpperCase()+t.slice(1)}function B(t){let e=new Set,o=new Set;for(let r of t){let a=r.label??r.name??String(r.value),i=String(r.value);if(e.has(a))throw new Error(`Duplicate kit picker label: ${a}`);if(o.has(i))throw new Error(`Duplicate kit picker value: ${i}`);e.add(a),o.add(i);}}var ie=".workspairc.json",ae=".rapidkitrc.json",se=["workspai.config.js","workspai.config.mjs","workspai.config.cjs","rapidkit.config.js","rapidkit.config.mjs","rapidkit.config.cjs"],ce=["workspai.config.json","rapidkit.config.json"];function Y(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="ENOENT"}function x(t,e){let o=e instanceof Error?e.message:String(e),r=t.endsWith(".js")&&/module is not defined in ES module scope/i.test(o)?' CommonJS syntax in a .js config is not valid when the project package uses "type": "module"; rename the file to .cjs or use export default.':"";return `Failed to load Workspai config at ${t}.${r} Cause: ${o}`}async function nt(){for(let t of [c$1.join(J.homedir(),ie),c$1.join(J.homedir(),ae)])try{let e$1=await promises.readFile(t,"utf-8"),o=JSON.parse(e$1);return e.debug(`Loaded config from ${t}`),o}catch{}return e.debug("No user config found, using defaults"),{}}async function rt(t=process.cwd(),e$1={}){let o=t,r=c$1.parse(o).root;for(;o!==r;){for(let a of ce){let i=c$1.join(o,a);try{let n=await promises.readFile(i,"utf-8"),s=JSON.parse(n);if(!s||typeof s!="object"||Array.isArray(s))throw new Error("configuration root must be a JSON object");return e.debug(`Loaded data-only Workspai config from ${a}`),s}catch(n){if(Y(n))continue;throw new Error(x(i,n))}}for(let a of se){let i=c$1.join(o,a);try{await promises.access(i);}catch(n){if(Y(n))continue;throw new Error(x(i,n))}if(e.debug(`Found config file: ${i}`),!e$1.trustExecutableConfig)throw new Error(`Refusing to execute Workspai config at ${i} without explicit trust. Use a data-only workspai.config.json file, pass --trust-config, or set WORKSPAI_TRUST_CONFIG=1.`);try{let s=await import(pathToFileURL(i).href),l=s.default||s;return e.debug(`Loaded Workspai config from ${a}`),l}catch(n){throw new Error(x(i,n))}}o=c$1.dirname(o);}return e.debug("No Workspai config file found, using defaults"),{}}function it(t,e,o){return {author:o.author||e.workspace?.defaultAuthor||t.author,pythonVersion:o.pythonVersion||e.workspace?.pythonVersion||t.pythonVersion,defaultInstallMethod:o.defaultInstallMethod||e.workspace?.installMethod||t.defaultInstallMethod,defaultKit:o.defaultKit||e.projects?.defaultKit||t.defaultKit,skipGit:o.skipGit??e.projects?.skipGit??t.skipGit,license:o.license||t.license,testRapidKitPath:o.testRapidKitPath||t.testRapidKitPath}}function at(t){return f("DEV_PATH")||t.testRapidKitPath||void 0}var E=class extends Error{constructor(o,r){super(["Workspai workspaces cannot be nested.",`Target: ${o}`,`Containing workspace: ${r}`,"Choose Managed home or pass --output <path> with a location outside the current workspace."].join(`
2
+ `));this.targetPath=o;this.containingWorkspacePath=r;this.name="NestedWorkspaceCreationError";}targetPath;containingWorkspacePath;code="WORKSPACE_NESTING_NOT_SUPPORTED"};async function de(t){try{return !!await h.stat(t)}catch{return false}}function pe(t,e){let o=t.indexOf(e);if(o>=0&&o+1<t.length)return t[o+1];let r=t.find(a=>a.startsWith(`${e}=`));if(r)return r.slice(e.length+1)}function ue(t){return t.includes("--here")}async function H(t){let e=c$1.resolve(t);for(;;){let o=[c$1.join(e,".workspai-workspace"),c$1.join(e,".rapidkit-workspace"),c$1.join(e,".workspai","workspace.json"),c$1.join(e,".rapidkit","workspace.json")];if((await Promise.all(o.map(de))).some(Boolean))return e;let r=c$1.dirname(e);if(r===e)return;e=r;}}async function yt(t){let e=c$1.resolve(t),o=await H(c$1.dirname(e));if(o)throw new E(e,o)}async function me(t,e=homedir()){let r=[{value:"managed",label:"Managed home",hint:l(e)}];return await H(t)||r.push({value:"here",label:"Current directory",hint:t}),r}function z(t,e=m.cwd()){if(ue(t))return c$1.resolve(e);let o=pe(t,"--output");if(o)return c$1.resolve(o)}function ht(t,e=m.cwd()){let o=c$1.resolve(t),r=c$1.resolve(e),a=c$1.relative(r,o);return a.length>0&&!a.startsWith("..")&&!c$1.isAbsolute(a)?`cd ${a}`:`cd ${o}`}function kt(t,e={}){let o=e.argv??[],r=e.outputParent??z(o,m.cwd());return m$1(t.trim(),{homeDir:e.homeDir,outputDir:r})}function Pt(t,e,o={}){return t?c$1.resolve(t)===c$1.resolve(e)?true:o.outputParent===void 0:false}async function wt(t,e={}){let o=e.cwd??m.cwd(),r=e.homeDir??homedir(),a=z(t,o);if(a!==void 0)return a;let i=e.hasYes??(t.includes("--yes")||t.includes("-y"));if(!(e.interactive??(!i&&!!m.stdin.isTTY&&!b())))return;let s=await me(o,r);if(s.length===1)return;let{location:l}=await b$1([{type:"rawlist",name:"location",message:"Where should the workspace be created?",choices:s,default:0}]);if(l==="here")return c$1.resolve(o)}var ge=["minimal","python-only","node-only","go-only","java-only","dotnet-only","polyglot","enterprise"],ye=new Set(["minimal","node-only","go-only","java-only","dotnet-only"]),Ft=new Set(["python-only","polyglot","enterprise"]);function he(t){return typeof t=="string"&&ge.includes(t)}function At(t){return he(t)&&ye.has(t)}var X={"python-only":"python","node-only":"node","go-only":"go","java-only":"java","dotnet-only":"dotnet"},ke={python:"Python",node:"Node",go:"Go",java:"Java",dotnet:".NET",php:"PHP",ruby:"Ruby",rust:"Rust",elixir:"Elixir",clojure:"Clojure",scala:"Scala",kotlin:"Kotlin",deno:"Deno",bun:"Bun",c:"C",cpp:"C++",unknown:"Unknown"},Pe={python:"python-only",node:"node-only",go:"go-only",java:"java-only",dotnet:"dotnet-only"},q=["node","deno","bun","python","go","java","kotlin","scala","dotnet","php","ruby","rust","elixir","clojure","c","cpp","unknown"];function v(t){return t==="bun"||t==="deno"?"node":t==="kotlin"||t==="scala"?"java":t}function I(t){return typeof t!="string"||t.trim().length===0?"minimal":t.trim().toLowerCase()}function g(t){if(typeof t!="string")return "unknown";let e=t.trim().toLowerCase();return e==="python"||e==="node"||e==="go"||e==="java"||e==="dotnet"||e==="php"||e==="ruby"||e==="rust"||e==="elixir"||e==="clojure"||e==="scala"||e==="kotlin"||e==="deno"||e==="bun"||e==="c"||e==="cpp"?e:e==="c++"||e==="cplusplus"||e==="cc"||e==="clang++"||e==="g++"?"cpp":e==="clang"||e==="gcc"?"c":"unknown"}function w(t){let e=new Set;for(let o of t)e.add(g(o));return [...e].sort((o,r)=>q.indexOf(o)-q.indexOf(r))}function we(t){let e=w(t).filter(o=>o!=="unknown");if(e.length!==0)return e.length===1?Pe[e[0]]:"polyglot"}function Q(t,e={}){return `npx workspai bootstrap --profile ${t}${e.ci?" --ci --json":""}`}function be(t,e){return t?"none":e==="strict"?"error":"warning"}function y(t){let e=t.ok?void 0:we(t.runtimes)??"polyglot";return {ok:t.ok,checkId:t.checkId,status:t.ok?"passed":"failed",profile:t.profile,runtimes:t.runtimes,message:t.message,recommendedProfile:e,recommendedCommand:e?Q(e):void 0,ciRecommendedCommand:e?Q(e,{ci:true}):void 0,severity:be(t.ok,t.mode)}}function $t(t){let e=I(t.profile),o=w(t.runtimes),r=t.mode??"warn",a=X[e];if(a){let i=o.length===0||o.every(n=>v(n)===a);return y({ok:i,checkId:`profile.${e}`,profile:e,runtimes:o,message:i?`${e} profile validated for discovered projects.`:`${e} profile mismatch: detected runtimes [${o.join(", ")}].`,mode:r})}if(e==="minimal"){let i=o.filter(l=>l!=="unknown"),s=new Set(i.map(l=>v(l))).size<=1;return y({ok:s,checkId:"profile.minimal",profile:e,runtimes:o,message:s?"minimal profile is compatible with detected runtime mix.":`minimal profile mismatch: multiple runtimes detected [${i.join(", ")}].`,mode:r})}return y({ok:true,checkId:`profile.${e}`,profile:e,runtimes:o,message:`${e} profile accepts the detected runtime mix.`,mode:r})}function Kt(t){let e=I(t.profile),o=g(t.runtime),r=t.mode??"warn",a=X[e];if(!a||o==="unknown")return y({ok:true,checkId:`profile.${e}`,profile:e,runtimes:[o],message:o==="unknown"?`Project "${t.subjectLabel}" runtime is unknown; profile compatibility will be checked by workspace doctor.`:`${e} profile accepts project "${t.subjectLabel}".`,mode:r});let i=v(o)===a;return y({ok:i,checkId:`profile.${e}`,profile:e,runtimes:i?[o]:w([a,o]),message:i?`Project "${t.subjectLabel}" is compatible with workspace profile "${e}".`:`Project "${t.subjectLabel}" is ${ke[o]}, but workspace profile is "${e}".`,mode:r})}async function St(t$1){let e=(await Promise.all(t(t$1,"policies.yml").map(async o=>await h.pathExists(o)?o:null))).find(o=>typeof o=="string");if(!e)return "warn";try{return (await h.readFile(e,"utf-8")).match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}catch{return "warn"}}async function _t(t$1){let e=(await Promise.all(t(t$1,"workspace.json").map(async o=>await h.pathExists(o)?o:null))).find(o=>typeof o=="string");if(!e)return "minimal";try{let o=await h.readJson(e);return I(o.profile)}catch{return "minimal"}}async function Lt(t,e={}){let o=new Set,r=[],a$1=new Set,i=[t];for(;i.length>0;){let n=i.pop();if(!n||a$1.has(n))continue;a$1.add(n);let s=[];try{s=await fe.promises.readdir(n,{withFileTypes:true});}catch{continue}for(let l of s){if(!l.isDirectory()||l.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(l.name))continue;let d=c$1.join(n,l.name);if(d!==t&&k$1(d))continue;if((await Promise.all([...u(d,"context.json"),...u(d,"project.json")].map(async ee=>h.pathExists(ee)))).some(Boolean)){r.push(d);continue}i.push(d);}}for(let n of r){if(e.excludeProjectPath&&c$1.resolve(n)===c$1.resolve(e.excludeProjectPath))continue;let s=j(n);o.add(g(m$2(n,s).runtime));}for(let n of await a(t))e.excludeProjectPath&&c$1.resolve(n.path)===c$1.resolve(e.excludeProjectPath)||o.add(g(n.runtime));for(let n of e.additionalRuntimes??[])o.add(g(n));return w(o)}function Nt(t,e={}){let o=e.ci?t.ciRecommendedCommand:t.recommendedCommand;return o?`Recommended: ${o}`:null}export{G as a,je as b,nt as c,rt as d,it as e,at as f,yt as g,ht as h,kt as i,Pt as j,wt as k,Ft as l,At as m,$t as n,Kt as o,St as p,_t as q,Lt as r,Nt as s};
@@ -1 +1 @@
1
- import {a}from'./chunk-MGL6DBOR.js';import {m as m$1}from'./chunk-YYELANJO.js';import {a as a$1}from'./chunk-GR6442P7.js';import {i,h}from'./chunk-FE5R6EUV.js';import {s,t}from'./chunk-ODK4LCEL.js';import {createHash}from'crypto';import l from'path';import {execa}from'execa';import v from'fs-extra';var D=s.projectTestCoverage.schemaVersion,P=t.projectTestCoverage,G=["package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","mix.exs","deps.edn","project.clj","build.sbt","CMakeLists.txt","meson.build","deno.json","deno.jsonc"];function p(t){let e=Number(t);return Number.isFinite(e)&&e>=0?e:0}function m(t,e,o=0){let n=p(t),s=Math.min(p(e),n),r=p(o);return {total:n,covered:s,skipped:r,percent:n>0?Math.round(s/n*1e4)/100:null}}function W(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e=t;return m(e.total,e.covered,e.skipped)}function y(t,e){let o=l.isAbsolute(e)?e:l.resolve(t,e),n=l.relative(t,o);return n&&!n.startsWith("..")?n.split(l.sep).join("/"):e}async function C(t){return createHash("sha256").update(await v.readFile(t)).digest("hex")}async function I(t){let e=l.resolve(t);for(;;){let o=await v.pathExists(l.join(e,".workspai","project.json"))||await v.pathExists(l.join(e,".rapidkit","project.json")),n=(await v.readdir(e).catch(()=>[])).some(r=>r.toLowerCase().endsWith(".gemspec"));if(o||n||(await Promise.all(G.map(r=>v.pathExists(l.join(e,r))))).some(Boolean))return e;let s=l.dirname(e);if(s===e)return l.resolve(t);e=s;}}async function V(t){return m$1(t).runtime}async function U(t,e,o=5){let n=[],s=[{dir:t,depth:0}],r=new Set([".git",".workspai",".rapidkit","node_modules",".venv","vendor","deps"]);for(;s.length>0;){let a=s.shift();if(!a)break;let i=await v.readdir(a.dir,{withFileTypes:true}).catch(()=>[]);for(let c of i){if(r.has(c.name)||a$1(c.name))continue;let u=l.join(a.dir,c.name),g=l.relative(t,u).split(l.sep).join("/");c.isFile()&&e(c.name,g)&&n.push(u),c.isDirectory()&&a.depth<o&&s.push({dir:u,depth:a.depth+1});}}return n}async function L(t,e){let o=await v.readJson(e),n=o.total??o,s={};for(let a of ["lines","branches","functions","statements"]){let i=W(n[a]);i&&(s[a]=i);}let r=[];for(let[a,i]of Object.entries(o)){if(a==="total"||!i||typeof i!="object"||Array.isArray(i))continue;let c=i,u={};for(let g of ["lines","branches","functions","statements"]){let b=W(c[g]);b&&(u[g]=b);}r.push({path:y(t,a),metrics:u});}return {metrics:s,files:r,source:{format:"istanbul-json",path:e,sha256:await C(e)}}}async function z(t,e){let o=await v.readJson(e),n=o.totals??{},s={lines:m(n.num_statements,n.covered_lines)};p(n.num_branches)>0&&(s.branches=m(n.num_branches,n.covered_branches));let r=[];for(let[a,i]of Object.entries(o.files??{})){let c=i?.summary??{};r.push({path:y(t,a),metrics:{lines:m(c.num_statements,c.covered_lines),...p(c.num_branches)>0?{branches:m(c.num_branches,c.covered_branches)}:{}}});}return {metrics:s,files:r,source:{format:"coverage-py-json",path:e,sha256:await C(e)}}}function j(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e=t,o=p(e.count),n=p(e.covered);return o>0?m(o,n):void 0}async function B(t,e){let o=await v.readJson(e),n=Array.isArray(o.data)?o.data[0]??{}:o,s=n.totals??{},r={};r.lines=j(s.lines),r.functions=j(s.functions),r.branches=j(s.branches),r.statements=j(s.regions);let a=[];for(let i of Array.isArray(n.files)?n.files:[]){if(!i||typeof i!="object"||Array.isArray(i))continue;let c=i,u=c.summary??{};a.push({path:y(t,String(c.filename??"unknown")),metrics:{lines:j(u.lines),functions:j(u.functions),branches:j(u.branches),statements:j(u.regions)}});}return {metrics:r,files:a,source:{format:"llvm-cov-json",path:e,sha256:await C(e)}}}async function E(t,e){let o=await v.readFile(e,"utf8"),n=[],s="",r=0,a=0,i=0,c=0,u=0,g=0,b=d=>{s&&(n.push({path:y(t,s),metrics:{lines:m(d.lineTotal,d.lineCovered),functions:m(d.functionTotal,d.functionCovered),branches:m(d.branchTotal,d.branchCovered)}}),r+=d.lineTotal,a+=d.lineCovered,i+=d.functionTotal,c+=d.functionCovered,u+=d.branchTotal,g+=d.branchCovered);},h={lineTotal:0,lineCovered:0,functionTotal:0,functionCovered:0,branchTotal:0,branchCovered:0};for(let d of o.split(/\r?\n/))d.startsWith("SF:")?s=d.slice(3):d.startsWith("LF:")?h.lineTotal=p(d.slice(3)):d.startsWith("LH:")?h.lineCovered=p(d.slice(3)):d.startsWith("FNF:")?h.functionTotal=p(d.slice(4)):d.startsWith("FNH:")?h.functionCovered=p(d.slice(4)):d.startsWith("BRF:")?h.branchTotal=p(d.slice(4)):d.startsWith("BRH:")?h.branchCovered=p(d.slice(4)):d==="end_of_record"&&(b(h),s="",h={lineTotal:0,lineCovered:0,functionTotal:0,functionCovered:0,branchTotal:0,branchCovered:0});return {metrics:{lines:m(r,a),functions:m(i,c),branches:m(u,g)},files:n,source:{format:"lcov",path:e,sha256:await C(e)}}}async function K(t,e){let o=await v.readFile(e,"utf8"),n=new Map;for(let a of o.split(/\r?\n/).slice(1)){let i=/^(.+?):\d+\.\d+,\d+\.\d+\s+(\d+)\s+(\d+)$/.exec(a.trim());if(!i)continue;let c=n.get(i[1])??{total:0,covered:0},u=p(i[2]);c.total+=u,p(i[3])>0&&(c.covered+=u),n.set(i[1],c);}let s=[...n.entries()].map(([a,i])=>({path:y(t,a),metrics:{statements:m(i.total,i.covered)}})),r=[...n.values()].reduce((a,i)=>({total:a.total+i.total,covered:a.covered+i.covered}),{total:0,covered:0});return {metrics:{statements:m(r.total,r.covered)},files:s,source:{format:"go-coverprofile",path:e,sha256:await C(e)}}}function k(t,e){let n=[...t.matchAll(new RegExp(`<counter\\s+type=["']${e}["']\\s+missed=["'](\\d+)["']\\s+covered=["'](\\d+)["']\\s*\\/?\\s*>`,"gi"))].at(-1);return n?m(Number(n[1])+Number(n[2]),n[2]):void 0}async function x(t,e){let o=await v.readFile(t,"utf8"),n={};if(e==="cobertura-xml"){let s=/<coverage\b([^>]*)>/i.exec(o)?.[1]??"",r=/\bline-rate=["']([\d.]+)["']/i.exec(s)?.[1],a=/\bbranch-rate=["']([\d.]+)["']/i.exec(s)?.[1];r&&(n.lines=m(1e4,Math.round(Number(r)*1e4))),a&&(n.branches=m(1e4,Math.round(Number(a)*1e4)));}if(e==="clover-xml"){let r=[...o.matchAll(/<metrics\b([^>]*)\/?>/gi)].at(-1)?.[1]??"",a=g=>p(new RegExp(`\\b${g}=["'](\\d+)["']`,"i").exec(r)?.[1]),i=a("statements"),c=a("methods"),u=a("conditionals");i>0&&(n.statements=m(i,a("coveredstatements"))),c>0&&(n.functions=m(c,a("coveredmethods"))),u>0&&(n.branches=m(u,a("coveredconditionals")));}return n.lines??=k(o,"LINE"),n.branches??=k(o,"BRANCH"),n.functions??=k(o,"METHOD"),n.statements??=k(o,"INSTRUCTION"),{metrics:n,files:[],source:{format:e,path:t,sha256:await C(t)}}}async function X(t){let e=await v.readFile(t,"utf8"),o=/<scoverage\b([^>]*)>/i.exec(e)?.[1]??"",n=b=>p(new RegExp(`\\b${b}=["']([\\d.]+)["']`,"i").exec(o)?.[1]),s=n("statement-count"),r=n("statements-invoked"),a=n("branch-count"),i=n("branches-invoked"),c=n("statement-rate"),u=n("branch-rate"),g={};return s>0?g.statements=m(s,r):c>0&&(g.statements=m(1e4,Math.round(c*100))),a>0?g.branches=m(a,i):u>0&&(g.branches=m(1e4,Math.round(u*100))),{metrics:g,files:[],source:{format:"scoverage-xml",path:t,sha256:await C(t)}}}async function Q(t,e){let o=await v.readJson(e),n=new Map;for(let a of Object.values(o)){let i=a?.coverage;if(!(!i||typeof i!="object"||Array.isArray(i)))for(let[c,u]of Object.entries(i)){if(!Array.isArray(u))continue;let g=n.get(c)??[];u.forEach((b,h)=>{typeof b=="number"&&(g[h]=Math.max(g[h]??0,b));}),n.set(c,g);}}let s=[...n.entries()].map(([a,i])=>{let c=i.filter(u=>typeof u=="number");return {path:y(t,a),metrics:{lines:m(c.length,c.filter(u=>u>0).length)}}}),r=s.reduce((a,i)=>{let c=i.metrics.lines;return {total:a.total+(c?.total??0),covered:a.covered+(c?.covered??0)}},{total:0,covered:0});return {metrics:{lines:m(r.total,r.covered)},files:s,source:{format:"simplecov-json",path:e,sha256:await C(e)}}}async function q(t,e={}){let o=[{relativePath:"coverage/coverage-summary.json",parser:r=>L(t,r)},{relativePath:"coverage.json",parser:async r=>{let a=await v.readJson(r);return Array.isArray(a.data)?B(t,r):z(t,r)}},{relativePath:"coverage/lcov.info",parser:r=>E(t,r)},{relativePath:"cover/lcov.info",parser:r=>E(t,r)},{relativePath:"lcov.info",parser:r=>E(t,r)},{relativePath:"coverage.out",parser:r=>K(t,r)},{relativePath:"target/site/jacoco/jacoco.xml",parser:r=>x(r,"jacoco-xml")},{relativePath:"build/reports/jacoco/test/jacocoTestReport.xml",parser:r=>x(r,"jacoco-xml")},{relativePath:"coverage.xml",parser:r=>x(r,"clover-xml")},{relativePath:".resultset.json",parser:r=>Q(t,r)}];for(let r of o){let a=l.join(t,r.relativePath);if(await v.pathExists(a))return r.parser(a)}if(e.recursive===false)return null;let s=(await U(t,(r,a)=>r==="coverage.cobertura.xml"||r==="jacoco.xml"||r==="clover.xml"||r==="scoverage.xml"||a.endsWith("/coverage-summary.json"),7)).sort()[0];return s?s.endsWith("coverage-summary.json")?L(t,s):s.endsWith("jacoco.xml")?x(s,"jacoco-xml"):s.endsWith("coverage.cobertura.xml")?x(s,"cobertura-xml"):s.endsWith("scoverage.xml")?X(s):x(s,"clover-xml"):null}async function Y(t){return v.readJson(l.join(t,"package.json")).catch(()=>null)}async function H(t,e){let o=(n,s)=>({cwd:t,executable:n,args:s});if(e==="node"||e==="bun"){let s=(await Y(t))?.scripts??{},r=["test:coverage","test:cov","coverage"].find(i=>typeof s[i]=="string"),a=e==="bun"?"bun":await v.pathExists(l.join(t,"pnpm-lock.yaml"))?"pnpm":await v.pathExists(l.join(t,"yarn.lock"))?"yarn":"npm";if(r)return {runner:String(s[r]).split(/\s+/)[0]||a,invocations:[o(a,a==="yarn"?[r]:["run",r])],diagnostics:[]};if(typeof s.test=="string"){let i=a==="yarn"?["test","--coverage"]:a==="bun"?["test","--coverage","--coverage-reporter=lcov"]:["test","--","--coverage"];return {runner:String(s.test).split(/\s+/)[0]||a,invocations:[o(a,i)],diagnostics:[]}}return {runner:null,invocations:[],diagnostics:["No project-owned test or coverage script was detected."]}}if(e==="deno")return {runner:"deno",invocations:[o("deno",["test","--coverage=coverage"]),o("deno",["coverage","--lcov","--output=coverage/lcov.info","coverage"])],diagnostics:[]};if(e==="python")return {runner:"pytest-cov",invocations:[o(await v.pathExists(l.join(t,".venv",process.platform==="win32"?"Scripts":"bin",process.platform==="win32"?"python.exe":"python"))?l.join(".venv",process.platform==="win32"?"Scripts":"bin",process.platform==="win32"?"python.exe":"python"):process.platform==="win32"?"python":"python3",["-m","pytest","--cov=.","--cov-report=json:coverage.json"])],diagnostics:[]};if(e==="go")return {runner:"go test",invocations:[o("go",["test","./...","-coverprofile=coverage.out"])],diagnostics:[]};if(e==="java"){let n=await v.pathExists(l.join(t,"gradlew")),s=await v.pathExists(l.join(t,"gradlew.bat")),r=n||s,a=await v.pathExists(l.join(t,"mvnw")),i=await v.pathExists(l.join(t,"mvnw.cmd")),c=r?process.platform==="win32"&&s?".\\gradlew.bat":"./gradlew":await v.pathExists(l.join(t,"pom.xml"))?process.platform==="win32"&&i?".\\mvnw.cmd":a?"./mvnw":"mvn":"gradle";return {runner:r?"jacoco/gradle":"jacoco/maven",invocations:[o(c,r?["test","jacocoTestReport"]:["test","jacoco:report"])],diagnostics:[]}}return e==="dotnet"?{runner:"dotnet coverlet",invocations:[o("dotnet",["test","--collect:XPlat Code Coverage"])],diagnostics:[]}:e==="rust"?{runner:"cargo llvm-cov",invocations:[o("cargo",["llvm-cov","--json","--output-path","coverage.json"])],diagnostics:["cargo-llvm-cov must be available in the project toolchain."]}:e==="php"?{runner:"phpunit",invocations:[o(process.platform==="win32"?"vendor\\bin\\phpunit.bat":"vendor/bin/phpunit",["--coverage-clover","coverage.xml"])],diagnostics:[]}:e==="ruby"?{runner:"simplecov",invocations:[o("bundle",["exec","rspec"])],diagnostics:["The test suite must enable SimpleCov to emit .resultset.json."]}:e==="elixir"?{runner:"mix cover",invocations:[o("mix",["test","--cover"])],diagnostics:["Configure ExCoveralls for JSON or LCOV interchange when machine-readable coverage is required."]}:e==="clojure"?{runner:"cloverage",invocations:[o("clojure",["-M:coverage"])],diagnostics:["The project must declare a coverage alias such as cloverage."]}:e==="scala"?{runner:"sbt-scoverage",invocations:[o("sbt",["clean","coverage","test","coverageReport"])],diagnostics:["The project must declare the scoverage plugin."]}:e==="kotlin"?{runner:"jacoco/gradle",invocations:[o(await v.pathExists(l.join(t,process.platform==="win32"?"gradlew.bat":"gradlew"))?process.platform==="win32"?".\\gradlew.bat":"./gradlew":"gradle",["test","jacocoTestReport"])],diagnostics:["The project must declare the JaCoCo Gradle plugin."]}:e==="c"||e==="cpp"?{runner:"CTest/LLVM coverage",invocations:[o("ctest",["--test-dir","build","--output-on-failure"])],diagnostics:["The native build must be instrumented for coverage and export LCOV, Cobertura, or LLVM JSON evidence."]}:{runner:null,invocations:[],diagnostics:["Project runtime could not be detected."]}}async function ve(t,e){let o=await I(t),n=e??await V(o),s=await H(o,n),r=await q(o,{recursive:false}).catch(()=>null),a=r?.source.path&&r.source.sha256?[{path:l.relative(o,r.source.path).split(l.sep).join("/"),sha256:r.source.sha256}]:[],i=[...s.diagnostics],c=r?"available":s.invocations.length===0||n==="unknown"?"unsupported":i.length>0?"requires-setup":"available";return {runtime:n,runner:s.runner,status:c,existingEvidence:a,invocations:s.invocations,prerequisites:i}}function Z(t,e){let o=t?l.relative(t,e).split(l.sep).join("/"):l.resolve(e),n=l.basename(e).toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,48)||"project",s=createHash("sha256").update(o).digest("hex").slice(0,12);return `${n}--${s}`}function ee(t){return t.lines?"lines":t.statements?"statements":t.branches?"branches":"functions"}async function me(t={}){let e=await I(t.projectPath??process.cwd()),o=a(e),n=t.runtime??await V(e),s=Math.max(0,Math.min(100,Math.round(t.target??80))),r=await H(e,n),a$1=[],i$1=Date.now();if(t.run)for(let f of r.invocations){let w=await execa(f.executable,f.args,{cwd:f.cwd,reject:false,timeout:6e5}).catch(()=>({exitCode:1}));if(a$1.push(Number(w.exitCode??1)),Number(w.exitCode??1)!==0)break}let c=await q(e).catch(()=>null),u=c?ee(c.metrics):"lines",g=c?.metrics[u]?.percent??null,b=t.run&&a$1.some(f=>f!==0)?"failed":g===null?"unavailable":g>=s?"passed":"below-target",h$1=Z(o,e),d=l.join(e,P),R=o?`.workspai/reports/projects/${h$1}/project-test-coverage-last-run.json`:null,T={schemaVersion:D,generatedAt:new Date().toISOString(),status:b,project:{id:h$1,name:l.basename(e),path:e,workspacePath:o},runtime:n,runner:r.runner,target:{metric:u,percent:s},metrics:c?.metrics??{},files:c?.files??[],lowCoverageFiles:(c?.files??[]).map(f=>{let w=f.metrics[u]??f.metrics.lines??f.metrics.statements;return {path:f.path,percent:w?.percent??null,uncovered:Math.max(0,(w?.total??0)-(w?.covered??0))}}).filter(f=>f.percent===null||f.percent<s).sort((f,w)=>w.uncovered-f.uncovered||f.path.localeCompare(w.path)),source:c?.source??{format:"unknown",path:null,sha256:null},execution:{requested:t.run===true,invocations:r.invocations,exitCodes:a$1,durationMs:Date.now()-i$1},diagnostics:[...r.diagnostics,...c?[]:["No supported machine-readable coverage artifact was found."]],artifactPaths:{project:d,workspaceLatest:o?l.join(o,P):null,workspaceProject:o&&R?l.join(o,R):null}};return o&&R&&await i(o,P,[{relativePath:P,payload:T},{relativePath:R,payload:T}]),await h(e,P,T),T}export{D as a,P as b,ve as c,me as d};
1
+ import {a}from'./chunk-COOVCORC.js';import {m as m$1}from'./chunk-7NKM6EHE.js';import {a as a$1}from'./chunk-GR6442P7.js';import {i,h}from'./chunk-BLEIUQL6.js';import {s,t}from'./chunk-ODK4LCEL.js';import {createHash}from'crypto';import l from'path';import {execa}from'execa';import v from'fs-extra';var D=s.projectTestCoverage.schemaVersion,P=t.projectTestCoverage,G=["package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","mix.exs","deps.edn","project.clj","build.sbt","CMakeLists.txt","meson.build","deno.json","deno.jsonc"];function p(t){let e=Number(t);return Number.isFinite(e)&&e>=0?e:0}function m(t,e,o=0){let n=p(t),s=Math.min(p(e),n),r=p(o);return {total:n,covered:s,skipped:r,percent:n>0?Math.round(s/n*1e4)/100:null}}function W(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e=t;return m(e.total,e.covered,e.skipped)}function y(t,e){let o=l.isAbsolute(e)?e:l.resolve(t,e),n=l.relative(t,o);return n&&!n.startsWith("..")?n.split(l.sep).join("/"):e}async function C(t){return createHash("sha256").update(await v.readFile(t)).digest("hex")}async function I(t){let e=l.resolve(t);for(;;){let o=await v.pathExists(l.join(e,".workspai","project.json"))||await v.pathExists(l.join(e,".rapidkit","project.json")),n=(await v.readdir(e).catch(()=>[])).some(r=>r.toLowerCase().endsWith(".gemspec"));if(o||n||(await Promise.all(G.map(r=>v.pathExists(l.join(e,r))))).some(Boolean))return e;let s=l.dirname(e);if(s===e)return l.resolve(t);e=s;}}async function V(t){return m$1(t).runtime}async function U(t,e,o=5){let n=[],s=[{dir:t,depth:0}],r=new Set([".git",".workspai",".rapidkit","node_modules",".venv","vendor","deps"]);for(;s.length>0;){let a=s.shift();if(!a)break;let i=await v.readdir(a.dir,{withFileTypes:true}).catch(()=>[]);for(let c of i){if(r.has(c.name)||a$1(c.name))continue;let u=l.join(a.dir,c.name),g=l.relative(t,u).split(l.sep).join("/");c.isFile()&&e(c.name,g)&&n.push(u),c.isDirectory()&&a.depth<o&&s.push({dir:u,depth:a.depth+1});}}return n}async function L(t,e){let o=await v.readJson(e),n=o.total??o,s={};for(let a of ["lines","branches","functions","statements"]){let i=W(n[a]);i&&(s[a]=i);}let r=[];for(let[a,i]of Object.entries(o)){if(a==="total"||!i||typeof i!="object"||Array.isArray(i))continue;let c=i,u={};for(let g of ["lines","branches","functions","statements"]){let b=W(c[g]);b&&(u[g]=b);}r.push({path:y(t,a),metrics:u});}return {metrics:s,files:r,source:{format:"istanbul-json",path:e,sha256:await C(e)}}}async function z(t,e){let o=await v.readJson(e),n=o.totals??{},s={lines:m(n.num_statements,n.covered_lines)};p(n.num_branches)>0&&(s.branches=m(n.num_branches,n.covered_branches));let r=[];for(let[a,i]of Object.entries(o.files??{})){let c=i?.summary??{};r.push({path:y(t,a),metrics:{lines:m(c.num_statements,c.covered_lines),...p(c.num_branches)>0?{branches:m(c.num_branches,c.covered_branches)}:{}}});}return {metrics:s,files:r,source:{format:"coverage-py-json",path:e,sha256:await C(e)}}}function j(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e=t,o=p(e.count),n=p(e.covered);return o>0?m(o,n):void 0}async function B(t,e){let o=await v.readJson(e),n=Array.isArray(o.data)?o.data[0]??{}:o,s=n.totals??{},r={};r.lines=j(s.lines),r.functions=j(s.functions),r.branches=j(s.branches),r.statements=j(s.regions);let a=[];for(let i of Array.isArray(n.files)?n.files:[]){if(!i||typeof i!="object"||Array.isArray(i))continue;let c=i,u=c.summary??{};a.push({path:y(t,String(c.filename??"unknown")),metrics:{lines:j(u.lines),functions:j(u.functions),branches:j(u.branches),statements:j(u.regions)}});}return {metrics:r,files:a,source:{format:"llvm-cov-json",path:e,sha256:await C(e)}}}async function E(t,e){let o=await v.readFile(e,"utf8"),n=[],s="",r=0,a=0,i=0,c=0,u=0,g=0,b=d=>{s&&(n.push({path:y(t,s),metrics:{lines:m(d.lineTotal,d.lineCovered),functions:m(d.functionTotal,d.functionCovered),branches:m(d.branchTotal,d.branchCovered)}}),r+=d.lineTotal,a+=d.lineCovered,i+=d.functionTotal,c+=d.functionCovered,u+=d.branchTotal,g+=d.branchCovered);},h={lineTotal:0,lineCovered:0,functionTotal:0,functionCovered:0,branchTotal:0,branchCovered:0};for(let d of o.split(/\r?\n/))d.startsWith("SF:")?s=d.slice(3):d.startsWith("LF:")?h.lineTotal=p(d.slice(3)):d.startsWith("LH:")?h.lineCovered=p(d.slice(3)):d.startsWith("FNF:")?h.functionTotal=p(d.slice(4)):d.startsWith("FNH:")?h.functionCovered=p(d.slice(4)):d.startsWith("BRF:")?h.branchTotal=p(d.slice(4)):d.startsWith("BRH:")?h.branchCovered=p(d.slice(4)):d==="end_of_record"&&(b(h),s="",h={lineTotal:0,lineCovered:0,functionTotal:0,functionCovered:0,branchTotal:0,branchCovered:0});return {metrics:{lines:m(r,a),functions:m(i,c),branches:m(u,g)},files:n,source:{format:"lcov",path:e,sha256:await C(e)}}}async function K(t,e){let o=await v.readFile(e,"utf8"),n=new Map;for(let a of o.split(/\r?\n/).slice(1)){let i=/^(.+?):\d+\.\d+,\d+\.\d+\s+(\d+)\s+(\d+)$/.exec(a.trim());if(!i)continue;let c=n.get(i[1])??{total:0,covered:0},u=p(i[2]);c.total+=u,p(i[3])>0&&(c.covered+=u),n.set(i[1],c);}let s=[...n.entries()].map(([a,i])=>({path:y(t,a),metrics:{statements:m(i.total,i.covered)}})),r=[...n.values()].reduce((a,i)=>({total:a.total+i.total,covered:a.covered+i.covered}),{total:0,covered:0});return {metrics:{statements:m(r.total,r.covered)},files:s,source:{format:"go-coverprofile",path:e,sha256:await C(e)}}}function k(t,e){let n=[...t.matchAll(new RegExp(`<counter\\s+type=["']${e}["']\\s+missed=["'](\\d+)["']\\s+covered=["'](\\d+)["']\\s*\\/?\\s*>`,"gi"))].at(-1);return n?m(Number(n[1])+Number(n[2]),n[2]):void 0}async function x(t,e){let o=await v.readFile(t,"utf8"),n={};if(e==="cobertura-xml"){let s=/<coverage\b([^>]*)>/i.exec(o)?.[1]??"",r=/\bline-rate=["']([\d.]+)["']/i.exec(s)?.[1],a=/\bbranch-rate=["']([\d.]+)["']/i.exec(s)?.[1];r&&(n.lines=m(1e4,Math.round(Number(r)*1e4))),a&&(n.branches=m(1e4,Math.round(Number(a)*1e4)));}if(e==="clover-xml"){let r=[...o.matchAll(/<metrics\b([^>]*)\/?>/gi)].at(-1)?.[1]??"",a=g=>p(new RegExp(`\\b${g}=["'](\\d+)["']`,"i").exec(r)?.[1]),i=a("statements"),c=a("methods"),u=a("conditionals");i>0&&(n.statements=m(i,a("coveredstatements"))),c>0&&(n.functions=m(c,a("coveredmethods"))),u>0&&(n.branches=m(u,a("coveredconditionals")));}return n.lines??=k(o,"LINE"),n.branches??=k(o,"BRANCH"),n.functions??=k(o,"METHOD"),n.statements??=k(o,"INSTRUCTION"),{metrics:n,files:[],source:{format:e,path:t,sha256:await C(t)}}}async function X(t){let e=await v.readFile(t,"utf8"),o=/<scoverage\b([^>]*)>/i.exec(e)?.[1]??"",n=b=>p(new RegExp(`\\b${b}=["']([\\d.]+)["']`,"i").exec(o)?.[1]),s=n("statement-count"),r=n("statements-invoked"),a=n("branch-count"),i=n("branches-invoked"),c=n("statement-rate"),u=n("branch-rate"),g={};return s>0?g.statements=m(s,r):c>0&&(g.statements=m(1e4,Math.round(c*100))),a>0?g.branches=m(a,i):u>0&&(g.branches=m(1e4,Math.round(u*100))),{metrics:g,files:[],source:{format:"scoverage-xml",path:t,sha256:await C(t)}}}async function Q(t,e){let o=await v.readJson(e),n=new Map;for(let a of Object.values(o)){let i=a?.coverage;if(!(!i||typeof i!="object"||Array.isArray(i)))for(let[c,u]of Object.entries(i)){if(!Array.isArray(u))continue;let g=n.get(c)??[];u.forEach((b,h)=>{typeof b=="number"&&(g[h]=Math.max(g[h]??0,b));}),n.set(c,g);}}let s=[...n.entries()].map(([a,i])=>{let c=i.filter(u=>typeof u=="number");return {path:y(t,a),metrics:{lines:m(c.length,c.filter(u=>u>0).length)}}}),r=s.reduce((a,i)=>{let c=i.metrics.lines;return {total:a.total+(c?.total??0),covered:a.covered+(c?.covered??0)}},{total:0,covered:0});return {metrics:{lines:m(r.total,r.covered)},files:s,source:{format:"simplecov-json",path:e,sha256:await C(e)}}}async function q(t,e={}){let o=[{relativePath:"coverage/coverage-summary.json",parser:r=>L(t,r)},{relativePath:"coverage.json",parser:async r=>{let a=await v.readJson(r);return Array.isArray(a.data)?B(t,r):z(t,r)}},{relativePath:"coverage/lcov.info",parser:r=>E(t,r)},{relativePath:"cover/lcov.info",parser:r=>E(t,r)},{relativePath:"lcov.info",parser:r=>E(t,r)},{relativePath:"coverage.out",parser:r=>K(t,r)},{relativePath:"target/site/jacoco/jacoco.xml",parser:r=>x(r,"jacoco-xml")},{relativePath:"build/reports/jacoco/test/jacocoTestReport.xml",parser:r=>x(r,"jacoco-xml")},{relativePath:"coverage.xml",parser:r=>x(r,"clover-xml")},{relativePath:".resultset.json",parser:r=>Q(t,r)}];for(let r of o){let a=l.join(t,r.relativePath);if(await v.pathExists(a))return r.parser(a)}if(e.recursive===false)return null;let s=(await U(t,(r,a)=>r==="coverage.cobertura.xml"||r==="jacoco.xml"||r==="clover.xml"||r==="scoverage.xml"||a.endsWith("/coverage-summary.json"),7)).sort()[0];return s?s.endsWith("coverage-summary.json")?L(t,s):s.endsWith("jacoco.xml")?x(s,"jacoco-xml"):s.endsWith("coverage.cobertura.xml")?x(s,"cobertura-xml"):s.endsWith("scoverage.xml")?X(s):x(s,"clover-xml"):null}async function Y(t){return v.readJson(l.join(t,"package.json")).catch(()=>null)}async function H(t,e){let o=(n,s)=>({cwd:t,executable:n,args:s});if(e==="node"||e==="bun"){let s=(await Y(t))?.scripts??{},r=["test:coverage","test:cov","coverage"].find(i=>typeof s[i]=="string"),a=e==="bun"?"bun":await v.pathExists(l.join(t,"pnpm-lock.yaml"))?"pnpm":await v.pathExists(l.join(t,"yarn.lock"))?"yarn":"npm";if(r)return {runner:String(s[r]).split(/\s+/)[0]||a,invocations:[o(a,a==="yarn"?[r]:["run",r])],diagnostics:[]};if(typeof s.test=="string"){let i=a==="yarn"?["test","--coverage"]:a==="bun"?["test","--coverage","--coverage-reporter=lcov"]:["test","--","--coverage"];return {runner:String(s.test).split(/\s+/)[0]||a,invocations:[o(a,i)],diagnostics:[]}}return {runner:null,invocations:[],diagnostics:["No project-owned test or coverage script was detected."]}}if(e==="deno")return {runner:"deno",invocations:[o("deno",["test","--coverage=coverage"]),o("deno",["coverage","--lcov","--output=coverage/lcov.info","coverage"])],diagnostics:[]};if(e==="python")return {runner:"pytest-cov",invocations:[o(await v.pathExists(l.join(t,".venv",process.platform==="win32"?"Scripts":"bin",process.platform==="win32"?"python.exe":"python"))?l.join(".venv",process.platform==="win32"?"Scripts":"bin",process.platform==="win32"?"python.exe":"python"):process.platform==="win32"?"python":"python3",["-m","pytest","--cov=.","--cov-report=json:coverage.json"])],diagnostics:[]};if(e==="go")return {runner:"go test",invocations:[o("go",["test","./...","-coverprofile=coverage.out"])],diagnostics:[]};if(e==="java"){let n=await v.pathExists(l.join(t,"gradlew")),s=await v.pathExists(l.join(t,"gradlew.bat")),r=n||s,a=await v.pathExists(l.join(t,"mvnw")),i=await v.pathExists(l.join(t,"mvnw.cmd")),c=r?process.platform==="win32"&&s?".\\gradlew.bat":"./gradlew":await v.pathExists(l.join(t,"pom.xml"))?process.platform==="win32"&&i?".\\mvnw.cmd":a?"./mvnw":"mvn":"gradle";return {runner:r?"jacoco/gradle":"jacoco/maven",invocations:[o(c,r?["test","jacocoTestReport"]:["test","jacoco:report"])],diagnostics:[]}}return e==="dotnet"?{runner:"dotnet coverlet",invocations:[o("dotnet",["test","--collect:XPlat Code Coverage"])],diagnostics:[]}:e==="rust"?{runner:"cargo llvm-cov",invocations:[o("cargo",["llvm-cov","--json","--output-path","coverage.json"])],diagnostics:["cargo-llvm-cov must be available in the project toolchain."]}:e==="php"?{runner:"phpunit",invocations:[o(process.platform==="win32"?"vendor\\bin\\phpunit.bat":"vendor/bin/phpunit",["--coverage-clover","coverage.xml"])],diagnostics:[]}:e==="ruby"?{runner:"simplecov",invocations:[o("bundle",["exec","rspec"])],diagnostics:["The test suite must enable SimpleCov to emit .resultset.json."]}:e==="elixir"?{runner:"mix cover",invocations:[o("mix",["test","--cover"])],diagnostics:["Configure ExCoveralls for JSON or LCOV interchange when machine-readable coverage is required."]}:e==="clojure"?{runner:"cloverage",invocations:[o("clojure",["-M:coverage"])],diagnostics:["The project must declare a coverage alias such as cloverage."]}:e==="scala"?{runner:"sbt-scoverage",invocations:[o("sbt",["clean","coverage","test","coverageReport"])],diagnostics:["The project must declare the scoverage plugin."]}:e==="kotlin"?{runner:"jacoco/gradle",invocations:[o(await v.pathExists(l.join(t,process.platform==="win32"?"gradlew.bat":"gradlew"))?process.platform==="win32"?".\\gradlew.bat":"./gradlew":"gradle",["test","jacocoTestReport"])],diagnostics:["The project must declare the JaCoCo Gradle plugin."]}:e==="c"||e==="cpp"?{runner:"CTest/LLVM coverage",invocations:[o("ctest",["--test-dir","build","--output-on-failure"])],diagnostics:["The native build must be instrumented for coverage and export LCOV, Cobertura, or LLVM JSON evidence."]}:{runner:null,invocations:[],diagnostics:["Project runtime could not be detected."]}}async function ve(t,e){let o=await I(t),n=e??await V(o),s=await H(o,n),r=await q(o,{recursive:false}).catch(()=>null),a=r?.source.path&&r.source.sha256?[{path:l.relative(o,r.source.path).split(l.sep).join("/"),sha256:r.source.sha256}]:[],i=[...s.diagnostics],c=r?"available":s.invocations.length===0||n==="unknown"?"unsupported":i.length>0?"requires-setup":"available";return {runtime:n,runner:s.runner,status:c,existingEvidence:a,invocations:s.invocations,prerequisites:i}}function Z(t,e){let o=t?l.relative(t,e).split(l.sep).join("/"):l.resolve(e),n=l.basename(e).toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,48)||"project",s=createHash("sha256").update(o).digest("hex").slice(0,12);return `${n}--${s}`}function ee(t){return t.lines?"lines":t.statements?"statements":t.branches?"branches":"functions"}async function me(t={}){let e=await I(t.projectPath??process.cwd()),o=a(e),n=t.runtime??await V(e),s=Math.max(0,Math.min(100,Math.round(t.target??80))),r=await H(e,n),a$1=[],i$1=Date.now();if(t.run)for(let f of r.invocations){let w=await execa(f.executable,f.args,{cwd:f.cwd,reject:false,timeout:6e5}).catch(()=>({exitCode:1}));if(a$1.push(Number(w.exitCode??1)),Number(w.exitCode??1)!==0)break}let c=await q(e).catch(()=>null),u=c?ee(c.metrics):"lines",g=c?.metrics[u]?.percent??null,b=t.run&&a$1.some(f=>f!==0)?"failed":g===null?"unavailable":g>=s?"passed":"below-target",h$1=Z(o,e),d=l.join(e,P),R=o?`.workspai/reports/projects/${h$1}/project-test-coverage-last-run.json`:null,T={schemaVersion:D,generatedAt:new Date().toISOString(),status:b,project:{id:h$1,name:l.basename(e),path:e,workspacePath:o},runtime:n,runner:r.runner,target:{metric:u,percent:s},metrics:c?.metrics??{},files:c?.files??[],lowCoverageFiles:(c?.files??[]).map(f=>{let w=f.metrics[u]??f.metrics.lines??f.metrics.statements;return {path:f.path,percent:w?.percent??null,uncovered:Math.max(0,(w?.total??0)-(w?.covered??0))}}).filter(f=>f.percent===null||f.percent<s).sort((f,w)=>w.uncovered-f.uncovered||f.path.localeCompare(w.path)),source:c?.source??{format:"unknown",path:null,sha256:null},execution:{requested:t.run===true,invocations:r.invocations,exitCodes:a$1,durationMs:Date.now()-i$1},diagnostics:[...r.diagnostics,...c?[]:["No supported machine-readable coverage artifact was found."]],artifactPaths:{project:d,workspaceLatest:o?l.join(o,P):null,workspaceProject:o&&R?l.join(o,R):null}};return o&&R&&await i(o,P,[{relativePath:P,payload:T},{relativePath:R,payload:T}]),await h(e,P,T),T}export{D as a,P as b,ve as c,me as d};
@@ -0,0 +1 @@
1
+ import ce from'path';var le="workspace-knowledge-search.v1";function w(e){return e.trim().toLowerCase()}var Z=new WeakMap;function O(e){let t=Z.get(e);if(t)return t;let s=new Map(e.relations.map(i=>[i.id,i])),o=new Map(e.entities.map(i=>[i.id,i])),r=new Map(e.proofs.map(i=>[i.id,i])),a=new Map,c=new Map,d=(i,g)=>{let u=c.get(i)??[];u.push(g),c.set(i,u);};for(let i of e.entities){let g=[i.id,i.label,i.identity.key,...i.kind==="project"&&i.projectId?[i.projectId]:[],...i.identity.aliases];for(let u of new Set(g.map(w))){let y=a.get(u)??[];y.push(i),a.set(u,y);}}for(let i of e.relations)d(i.from,{from:i.from,to:i.to,relationId:i.id,kind:i.kind,direction:"forward",proofIds:i.proofIds}),d(i.to,{from:i.to,to:i.from,relationId:i.id,kind:i.kind,direction:"reverse",proofIds:i.proofIds});for(let i of a.values())i.sort((g,u)=>g.id.localeCompare(u.id));for(let i of c.values())i.sort((g,u)=>g.to.localeCompare(u.to)||g.relationId.localeCompare(u.relationId));let p={entitiesById:o,relationsById:s,entitiesByAlias:a,proofsById:r,adjacency:c};return Z.set(e,p),p}function H(e,t,s){let o=O(e),r=o.relationsById.get(t);if(r)return {found:true,targetType:"relation",relation:r};let a=w(t),c=(o.entitiesByAlias.get(a)??[]).filter(d=>!s||d.projectId===s);return c.length===1?{found:true,targetType:"entity",entity:c[0]}:{found:false,query:t,candidates:c.map(d=>d.id).sort()}}function _e(e,t,s){let o=H(e,t,s);if(!o.found)return {query:t,found:false,target:null,proofs:[],candidates:o.candidates};let r=o.targetType==="entity"?o.entity:o.relation,a=new Set(r.proofIds);return {query:t,found:true,target:r,candidates:[],proofs:[...a].map(c=>O(e).proofsById.get(c)).filter(c=>!!c).sort((c,d)=>c.id.localeCompare(d.id))}}function Ae(e,t,s,o){let r=H(e,t,o),a=H(e,s,o);if(!r.found||r.targetType!=="entity"||!a.found||a.targetType!=="entity")return {from:t,to:s,found:false,resolvedFrom:r.found&&r.targetType==="entity"?r.entity.id:null,resolvedTo:a.found&&a.targetType==="entity"?a.entity.id:null,entityPath:[],hops:[],proofs:[]};let c=O(e),d=[r.entity.id],p=new Map,i=new Set(d),g=0;for(;g<d.length&&!i.has(a.entity.id);){let h=d[g++];for(let m of c.adjacency.get(h)??[])i.has(m.to)||(i.add(m.to),p.set(m.to,m),d.push(m.to));}if(!i.has(a.entity.id))return {from:t,to:s,found:false,resolvedFrom:r.entity.id,resolvedTo:a.entity.id,entityPath:[],hops:[],proofs:[]};let u=[],y=a.entity.id;for(;y!==r.entity.id;){let h=p.get(y);if(!h)break;u.push(h),y=h.from;}u.reverse();let K=new Set(u.flatMap(h=>h.proofIds));return {from:t,to:s,found:true,resolvedFrom:r.entity.id,resolvedTo:a.entity.id,entityPath:[r.entity.id,...u.map(h=>h.to)],hops:u,proofs:[...K].map(h=>c.proofsById.get(h)).filter(h=>!!h).sort((h,m)=>h.id.localeCompare(m.id))}}function Ce(e,t,s){return e.entities.filter(o=>(!t||o.kind===t)&&(!s||o.projectId===s)).sort((o,r)=>o.kind.localeCompare(r.kind)||o.label.localeCompare(r.label))}var b={relations:12,relatedEntities:12,proofs:8,proofIdsPerItem:4,aliasesPerEntity:8,attributeArrayItems:8,attributeStringCharacters:256};function de(e){let t=[],s=new Set;for(let o=0;o<b.proofIdsPerItem&&t.length<b.proofs;o+=1)for(let r of e){let a=r.proofIds[o];if(!(!a||s.has(a))&&(s.add(a),t.push(a),t.length>=b.proofs))break}return t}function pe(e,t,s){let o=e.identity.aliases.slice(0,b.aliasesPerEntity);s.aliases+=e.identity.aliases.length-o.length;let r=Object.fromEntries(Object.entries(e.attributes).map(([c,d])=>{if(Array.isArray(d)){let p=d.slice(0,b.attributeArrayItems);return s.attributeValues+=d.length-p.length,[c,p]}return typeof d=="string"&&d.length>b.attributeStringCharacters?(s.attributeValues+=1,[c,d.slice(0,b.attributeStringCharacters)]):[c,d]})),a=e.proofIds.filter(c=>t.has(c)).slice(0,b.proofIdsPerItem);return s.proofReferences+=e.proofIds.length-a.length,{...e,identity:{...e.identity,aliases:o},attributes:r,proofIds:a}}function ue(e){let t=Object.values(e.attributes).flatMap(s=>Array.isArray(s)?s:[s]);return [e.id,e.kind,e.label,e.projectId??"",e.identity.key,...e.identity.aliases,...t.map(s=>String(s??""))].join(" ").toLowerCase()}var ge=new Set(["a","an","and","are","as","at","be","been","being","by","can","check","could","did","do","does","find","for","from","give","had","has","have","how","i","in","into","is","it","its","may","might","of","on","or","our","show","should","that","the","their","them","then","there","these","they","this","those","tell","to","was","we","were","what","when","where","which","who","why","will","with","would","you","your"]),he=new Map([["authenticate","auth"],["authenticated","auth"],["authentication","auth"],["authorization","auth"],["authorizing","auth"],["built","build"],["config","configuration"],["configs","configuration"],["dependencies","dependency"],["connected","connect"],["connecting","connect"],["connection","connect"],["connections","connect"],["diagnostics","diagnostic"],["defined","define"],["definition","define"],["definitions","define"],["events","event"],["handled","handle"],["handling","handle"],["implemented","implement"],["implementing","implement"],["implementations","implementation"],["implements","implement"],["reliable","reliability"],["tested","test"],["testing","test"],["tests","test"],["tools","tool"],["verification","verify"],["verified","verify"],["verifies","verify"],["verifying","verify"]]);function M(e){let t=s=>w(s).replace(/\bc\+\+/gu," cplusplus ").replace(/\bc#/gu," csharp ").split(/[^a-z0-9]+/u).filter(o=>o.length>1||o==="c"||o==="r").map(o=>he.get(o)??o);return [...new Set([...t(e),...t(e.replace(/([a-z0-9])([A-Z])/g,"$1 $2"))])]}function fe(e){let t=w(e.label),s=w(e.identity.key),o=e.identity.aliases.map(w),r=ue(e),a=new Set(M(e.label)),c=new Set(M(e.identity.key)),d=new Set(e.identity.aliases.flatMap(M));return {entity:e,label:t,identity:s,aliases:o,haystack:r,labelTokens:a,identityTokens:c,aliasTokens:d,allTokens:new Set([...M(r),...a,...c,...d])}}function J(e,t){return t.length>=5&&e.startsWith(t)}function W(e,t){return e.has(t)||[...e].some(s=>J(s,t))}function q(e,t){return W(e.labelTokens,t)||W(e.identityTokens,t)||W(e.aliasTokens,t)||W(e.allTokens,t)}function ye(e,t,s,o){let{label:r,identity:a,aliases:c,haystack:d}=e,p=0;(r===t||a===t||c.includes(t))&&(p+=1e4),(r.startsWith(t)||a.startsWith(t))&&(p+=250),d.includes(t)&&(p+=100);let i=0;for(let g of s){let u=o.get(g)??1,y=W(e.labelTokens,g),K=W(e.identityTokens,g),h=W(e.aliasTokens,g),m=q(e,g);m&&(i+=1),r===g?p+=80*u:y&&(p+=36*u),K&&(p+=24*u),h&&(p+=20*u),m&&(p+=10*u);}return s.length>0&&(p+=i/s.length*120),p}function ke(e,t){if(["build","compiled","dist","generated","fixture","fixtures","testdata","target","third","vendor","vendored"].some(a=>t.has(a)))return 0;if(e.attributes.generated===true)return 5e3;let o=typeof e.attributes.artifact=="string"?e.attributes.artifact:"",r=`${e.label}/${e.identity.key}/${o}`.toLowerCase();return /(?:^|\/)(?:__fixtures__|__testfixtures__|build|compiled|dist|fixture|fixtures|generated|node_modules|target|testdata|third_party|vendor)(?:\/|$)/u.test(r)?5e3:0}function Q(e,t){let s=new Set;for(let o of t){let r=e.allTokens.has(o)?o:void 0,a=r===void 0&&o.length>=3?[...e.allTokens].find(d=>J(d,o)&&!s.has(d)):void 0,c=r??a;c&&!s.has(c)&&s.add(c);}return s.size}function me(e,t){let s=new Set([...e.labelTokens,...e.identityTokens,...e.aliasTokens]);return Q({allTokens:s},t)}var ee=new Map([["c","c"],["clojure","clojure"],["cplusplus","cpp"],["cpp","cpp"],["typescript","typescript"],["ts","typescript"],["javascript","javascript"],["js","javascript"],["nodejs","javascript"],["python","python"],["py","python"],["go","go"],["golang","go"],["csharp","csharp"],["ada","ada"],["assembly","assembly"],["asm","assembly"],["cuda","cuda"],["dotnet","csharp"],["dart","dart"],["elixir","elixir"],["fsharp","fsharp"],["fortran","fortran"],["java","java"],["kotlin","kotlin"],["hlsl","hlsl"],["llvmir","llvm-ir"],["mlir","mlir"],["lua","lua"],["php","php"],["r","r"],["ruby","ruby"],["rust","rust"],["tablegen","tablegen"],["scala","scala"],["svelte","svelte"],["swift","swift"],["vue","vue"]]);function we(e){let t=new Set(e.map(o=>ee.get(o)).filter(o=>!!o));return (e.includes("nodejs")||e.includes("node")&&e.includes("js"))&&(t.add("javascript"),t.add("typescript")),t}function be(e){let t=new Set(e.filter(o=>ee.has(o)));return (e.includes("nodejs")||e.includes("node")&&e.includes("js"))&&(t.add("node"),t.add("js"),t.add("nodejs")),t}function z(e){let t=e.attributes.language;return typeof t=="string"?w(t):null}var Ie=new Set(["api","endpoint","module","package","service"]);function Se(e,t,s){if(s.size===0||!Ie.has(e.entity.kind))return 0;let o=[...e.labelTokens].filter(a=>a.length>=2&&!te(a));if(o.length===0)return 0;let r=t.filter(a=>{let c=z(a.entity);return c!==null&&s.has(c)&&a.entity.projectId===e.entity.projectId&&o.every(d=>a.allTokens.has(d))});return r.length>0?600+Math.min(r.length,10)*10:0}function Ke(e){return {project:1e3,service:900,api:900,package:850,endpoint:800,container:700,deployment:700,environment:650,pipeline:600,"test-suite":550,owner:500,decision:450,document:400}[e.kind]??0}var Ee=new Set(["language","languages","binding","bindings","bridge","bridges","build","dependency","dependencies","depends","core","runtime","owner","owners","ownership","maintainer","ci","pipeline","pipelines","workflow","deploy","deployment","infrastructure","container","doc","docs","document","documentation","service","services","api","endpoint","endpoints","route","routes","rpc","schema","schemas","message","protobuf","proto","contract"]),We=new Set(["app","application","applications","call","calls","code","communicate","communication","connect","define","defined","expose","exposed","handle","handled","implement","implementation","integrate","integration","interact","interaction","project","provide","provided","sdk","system","use","used","uses","using"]);function te(e){return Ee.has(e)||We.has(e)}function Te(e,t){let s=t.has("language")||t.has("languages"),o=t.has("binding")||t.has("bindings")||t.has("bridge")||t.has("bridges"),r=t.has("dependency")||t.has("dependencies")||t.has("depends"),a=t.has("core")||t.has("runtime"),c=t.has("owner")||t.has("owners")||t.has("ownership")||t.has("maintainer"),d=t.has("ci")||t.has("pipeline")||t.has("pipelines")||t.has("workflow"),p=t.has("deploy")||t.has("deployment")||t.has("infrastructure")||t.has("container"),i=t.has("doc")||t.has("docs")||t.has("document")||t.has("documentation"),g=t.has("service")||t.has("services")||t.has("api")||t.has("rpc"),u=t.has("endpoint")||t.has("endpoints")||t.has("route")||t.has("routes"),y=t.has("schema")||t.has("schemas")||t.has("message")||t.has("protobuf")||t.has("proto")||t.has("contract"),K=t.has("build"),h=typeof e.attributes.mechanism=="string"?w(e.attributes.mechanism):"",m=typeof e.attributes.specification=="string"?w(e.attributes.specification):"",G=w(e.label),f=0;if(s&&e.kind==="language"){let R=typeof e.attributes.fileCount=="number"?e.attributes.fileCount:0;f+=900+Math.min(R,1e4)/10;}if(o&&e.kind==="protocol"&&(f+=800),r&&e.kind==="package"&&(f+=650),a&&e.kind==="package"&&/(?:^|[_-])core(?:$|[_-])/u.test(G)&&(f+=700),a&&e.kind==="protocol"&&h.includes("core")&&(f+=300),c&&e.kind==="owner"&&(f+=850),d&&e.kind==="pipeline"&&(f+=800),p&&["deployment","container","environment"].includes(e.kind)&&(f+=775),i&&["document","decision"].includes(e.kind)&&(f+=725),g&&["api","endpoint","service"].includes(e.kind)&&(f+=700),u&&e.kind==="endpoint"&&(f+=1e3),K){let R=typeof e.attributes.artifact=="string"?e.attributes.artifact:e.label,x=ce.basename(R).toLowerCase(),T=typeof e.attributes.stage=="string"?w(e.attributes.stage):"";e.kind==="lifecycle-stage"&&T==="build"?f+=1100:e.kind==="file"&&/^(?:cargo\.toml|composer\.json|dockerfile(?:\..+)?|go\.mod|makefile|package\.json|pom\.xml|pyproject\.toml|requirements[^/]*\.txt)$/u.test(x)?f+=950:(e.kind==="package"||e.kind==="container")&&(f+=700);}return y&&(e.kind==="schema"||(e.kind==="api"||e.kind==="protocol")&&(m.includes("protobuf")||h.includes("protobuf")))&&(f+=750),f}function je(e){return [e.has("language")||e.has("languages"),e.has("binding")||e.has("bindings")||e.has("bridge")||e.has("bridges"),e.has("dependency")||e.has("dependencies")||e.has("depends"),e.has("core")||e.has("runtime"),e.has("owner")||e.has("ownership")||e.has("maintainer"),e.has("ci")||e.has("pipeline")||e.has("workflow"),e.has("deploy")||e.has("deployment")||e.has("infrastructure"),e.has("doc")||e.has("docs")||e.has("documentation"),e.has("service")||e.has("api")||e.has("rpc"),e.has("endpoint")||e.has("endpoints")||e.has("route")||e.has("routes"),e.has("schema")||e.has("protobuf")||e.has("proto")||e.has("contract"),e.has("build")].filter(Boolean).length>=3}function Be(e,t){let s=w(t.query),o=[...new Set(M(t.query))],r=new Set(M(t.projectId??"")),a=t.projectId?o.filter(n=>!r.has(n)):o,c=!!(t.projectId&&o.length>0&&a.length===0),d=a.filter(n=>!ge.has(n)),p=d.length>0?d:a,i=we(p),g=be(p),u=new Set(p),y=p.filter(n=>!g.has(n)&&!te(n)),K=je(u),m=y.length>=2&&/\b(?:and|or)\b/iu.test(t.query)?1:p.length<=1?p.length:Math.min(2,Math.ceil(p.length/3)),G=t.minimumTermMatches===void 0?m:Math.min(m,Math.max(1,Math.trunc(t.minimumTermMatches))),f=Math.max(1,Math.min(Math.trunc(t.limit??12),100)),R=Math.max(0,Math.min(Math.trunc(t.relationsPerEntity??4),20)),x=new Set;if(t.projectId){let n=new Set(e.entities.filter(l=>l.kind==="project"&&(l.projectId===t.projectId||l.label===t.projectId)).map(l=>l.id));for(let l of e.relations)n.has(l.from)&&x.add(l.to),n.has(l.to)&&x.add(l.from);}let T=e.entities.filter(n=>(!t.kind||n.kind===t.kind)&&(!t.projectId||n.projectId===t.projectId||n.projectId===void 0&&x.has(n.id))).map(fe),ne=new Map(p.map(n=>{let l=T.filter(k=>q(k,n)).length;return [n,Math.log((T.length+1)/(l+1))+1]})),P=T.map(n=>{let l=Q(n,p),k=Q(n,y),I=me(n,y),S=z(n.entity),N=S&&i.has(S)?400:0,_=S===null?Se(n,T,i):0,ae=Te(n.entity,u),X=y.length===0||y.some(re=>q(n,re))?ae:0;return {entity:n.entity,matchedTerms:l,matchedQualifiers:k,intentScore:X,languageAffinity:_,score:c?Ke(n.entity):ye(n,s,p,ne)+k*300+I*400+N+_+X-ke(n.entity,u)}}).filter(n=>{let l=z(n.entity),k=l!==null&&i.has(l)&&n.entity.kind==="language";return (i.size===0||l!==null&&i.has(l)||n.languageAffinity>0)&&(s.length===0||n.score>0&&(y.length===0||n.matchedQualifiers>0||k)&&(c||n.matchedTerms>=G||n.intentScore>0&&(K||p.length<=2)))}).sort((n,l)=>l.score-n.score||n.entity.kind.localeCompare(l.entity.kind)||n.entity.label.localeCompare(l.entity.label)),j=(K?(()=>{let n=[],l=[],k=new Map,I=new Set;for(let S of P){let N=k.get(S.entity.kind)??0,_=w(S.entity.label);N<2&&!I.has(_)?(n.push(S),k.set(S.entity.kind,N+1),I.add(_)):l.push(S);}return [...n,...l]})():P).slice(0,f).map(n=>n.entity),A=new Set(j.map(n=>n.id)),F=new Map,D=e.relations.filter(n=>{if(!(A.has(n.from)||A.has(n.to)))return false;let k=A.has(n.from)?n.from:n.to,I=F.get(k)??0;return I>=R?false:(F.set(k,I+1),true)}),E=t.projection==="agent",v=E?D.slice(0,b.relations):D,U=O(e),L=[...new Set(v.flatMap(n=>[n.from,n.to]).filter(n=>!A.has(n)))].map(n=>U.entitiesById.get(n)).filter(n=>!!n).map(({id:n,kind:l,label:k,projectId:I})=>({id:n,kind:l,label:k,...I?{projectId:I}:{}})).sort((n,l)=>n.kind.localeCompare(l.kind)||n.label.localeCompare(l.label)),V=E?L.slice(0,b.relatedEntities):L,$=new Set([...j.flatMap(n=>n.proofIds),...v.flatMap(n=>n.proofIds)]),oe=E?de([...j,...v]):[...$],C=new Set(oe),B={entities:P.length-j.length,relations:D.length-v.length,relatedEntities:L.length-V.length,proofs:$.size-C.size,proofReferences:0,aliases:0,attributeValues:0},Y=E?j.map(n=>pe(n,C,B)):j,se=E?v.map(n=>{let l=n.proofIds.filter(k=>C.has(k)).slice(0,b.proofIdsPerItem);return B.proofReferences+=n.proofIds.length-l.length,{...n,proofIds:l}}):v,ie=[...C].map(n=>U.proofsById.get(n)).filter(n=>!!n).sort((n,l)=>n.id.localeCompare(l.id));return {schemaVersion:le,graphSourceHash:e.source.hash,query:t.query,kind:t.kind??null,...t.projectId?{projectId:t.projectId}:{},limit:f,totalMatches:P.length,truncated:P.length>Y.length||E&&Object.values(B).some(n=>n>0),entities:Y,relatedEntities:V,relations:se,proofs:ie,...E?{budget:{mode:"agent",limits:{...b},omitted:B}}:{}}}export{le as a,H as b,_e as c,Ae as d,Ce as e,Be as f};
@@ -0,0 +1 @@
1
+ import {a}from'./chunk-AFIFZTOY.js';import {q,p}from'./chunk-ODK4LCEL.js';import d from'crypto';import s from'path';import {open,unlink,stat}from'fs/promises';import u from'fs-extra';var y="model-usage-event.v1",f=q.evaluationLive,I="workspace-intelligence-evaluation-comparison.v1",S=["provider-reported","tokenizer-counted","estimated","unavailable"];var v=p.evaluationLive,h=p.evaluationLastRun,W="contracts/workspace-intelligence/model-usage-event.v1.json",k="contracts/workspace-intelligence/workspace-intelligence-evaluation.v1.json",M="contracts/workspace-intelligence/workspace-intelligence-evaluation-comparison.v1.json",P=3e4,L=100,V=25;function w(){return {modelCalls:0,toolCalls:0,tokenSources:{providerReported:0,tokenizerCounted:0,estimated:0,unavailable:0},tokens:{input:0,output:0,cachedInput:0,reasoning:0,observedTotal:0},latencyMs:0,costs:[],outcome:{status:"unknown",verified:false,blockersResolved:0},efficiency:{tokensPerVerifiedOutcome:null,noProgressDecisions:0,repeatedArtifactReads:0}}}function m(t){return t??0}function A(t){let e=w(),n=new Map,r=new Map;for(let o of t){if(o.kind==="model-call"){e.modelCalls+=1;let a={"provider-reported":"providerReported","tokenizer-counted":"tokenizerCounted",estimated:"estimated",unavailable:"unavailable"}[o.modelCall.source];if(e.tokenSources[a]+=1,e.tokens.input+=m(o.modelCall.inputTokens),e.tokens.output+=m(o.modelCall.outputTokens),e.tokens.cachedInput+=m(o.modelCall.cachedInputTokens),e.tokens.reasoning+=m(o.modelCall.reasoningTokens),e.latencyMs+=o.modelCall.latencyMs??0,o.modelCall.cost){let i=o.modelCall.cost.currency.toUpperCase(),l=r.get(i)??{currency:i,amount:0,providerReported:0,estimated:0};l.amount+=o.modelCall.cost.amount,o.modelCall.cost.source==="provider-reported"?l.providerReported+=o.modelCall.cost.amount:l.estimated+=o.modelCall.cost.amount,r.set(i,l);}continue}if(o.kind==="tool-call"){e.toolCalls+=1,e.latencyMs+=o.toolCall.durationMs??0,!o.toolCall.changedSource&&o.toolCall.result==="passed"&&(e.efficiency.noProgressDecisions+=1),o.toolCall.artifact&&n.set(o.toolCall.artifact,(n.get(o.toolCall.artifact)??0)+1);continue}o.kind==="outcome"&&(e.outcome={status:o.outcome.status,verified:o.outcome.verified,blockersResolved:o.outcome.blockersResolved});}return e.tokens.observedTotal=e.tokens.input+e.tokens.output,e.costs=[...r.values()].map(o=>({...o,amount:Number(o.amount.toFixed(8)),providerReported:Number(o.providerReported.toFixed(8)),estimated:Number(o.estimated.toFixed(8))})).sort((o,a)=>o.currency.localeCompare(a.currency)),e.efficiency.repeatedArtifactReads=[...n.values()].reduce((o,a)=>o+Math.max(0,a-1),0),e.efficiency.tokensPerVerifiedOutcome=e.outcome.verified&&e.outcome.status==="passed"&&e.tokenSources.providerReported+e.tokenSources.tokenizerCounted+e.tokenSources.estimated>0?e.tokens.observedTotal:null,e}function U(t,e=new Date){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("Evaluation event must be a JSON object.");let n=t,r={...n,schemaVersion:y,eventId:typeof n.eventId=="string"&&n.eventId.trim()?n.eventId.trim():d.randomUUID(),recordedAt:typeof n.recordedAt=="string"&&n.recordedAt.trim()?n.recordedAt:e.toISOString()};a(r,W,"workspace evaluation event");let o={"model-call":"modelCall","tool-call":"toolCall",outcome:"outcome",milestone:"milestone"}[r.kind],a$1=["modelCall","toolCall","outcome","milestone"].filter(i=>n[i]!==void 0);if(a$1.length!==1||a$1[0]!==o)throw new Error(`Evaluation event kind ${r.kind} requires only ${o}.`);if(r.kind==="model-call"&&r.modelCall.source!=="unavailable"&&r.modelCall.inputTokens===null&&r.modelCall.outputTokens===null)throw new Error("Measured model calls require at least one input or output token count.");return r}function B(t){let e=t.now??new Date,n=s.resolve(t.workspacePath),r={schemaVersion:f,runId:t.runId??d.randomUUID(),sessionId:t.sessionId??d.randomUUID(),status:"live",startedAt:e.toISOString(),updatedAt:e.toISOString(),workspace:{name:t.workspaceName?.trim()||s.basename(n),path:n},configuration:{taskId:t.taskId.trim(),strategy:t.strategy??"workspace-intelligence",...t.provider?{provider:t.provider}:{},...t.model?{model:t.model}:{},...t.temperature!==void 0?{temperature:t.temperature}:{},...t.baselineRunId?{baselineRunId:t.baselineRunId}:{}},methodology:{id:"provider-usage-and-verified-outcome.v1",claimBoundary:"Provider-reported and tokenizer-counted values are measured; estimated values remain explicitly labelled. Verified task success is required before reporting tokens per successful outcome."},events:[],summary:w()};return a(r,k,"workspace evaluation"),r}async function x(t,e){await u.ensureDir(s.dirname(t));let n=`${t}.${process.pid}.${d.randomUUID()}.tmp`;try{await u.writeJson(n,e,{spaces:2}),await u.rename(n,t);}finally{await u.remove(n).catch(()=>{});}}async function b(t,e){let n=s.join(s.resolve(t),`${v}.lock`);await u.ensureDir(s.dirname(n));for(let r=0;r<L;r+=1)try{let o=await open(n,"wx");try{return await o.writeFile(JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()})),await e()}finally{await o.close(),await unlink(n).catch(()=>{});}}catch(o){if(o.code!=="EEXIST")throw o;let i=await stat(n).catch(()=>null);if(i&&Date.now()-i.mtimeMs>P){await unlink(n).catch(()=>{});continue}await new Promise(l=>setTimeout(l,V));}throw new Error("Timed out waiting for the workspace evaluation writer lock.")}async function E(t,e,n=v){let r=s.join(s.resolve(t),n);return a(e,k,n),await x(r,e),r}async function _(t,e=v){let n=s.isAbsolute(e)?e:s.join(s.resolve(t),e),r=await u.readJson(n);return a(r,k,n),r}async function Y(t){return b(t.workspacePath,async()=>{let e=await _(t.workspacePath);if(e.status!=="live")throw new Error(`Evaluation ${e.runId} is ${e.status}; initialize a new run.`);let n=U(t.payload,t.now);if(e.events.some(o=>o.eventId===n.eventId))return e;let r={...e,updatedAt:(t.now??new Date).toISOString(),events:[...e.events,n],summary:A([...e.events,n])};return await E(t.workspacePath,r),r})}async function X(t){return b(t.workspacePath,async()=>{let e=await _(t.workspacePath),n=(t.now??new Date).toISOString(),r={...e,status:t.status??"completed",updatedAt:n,completedAt:n,summary:A(e.events)},o=await E(t.workspacePath,r,h);return await E(t.workspacePath,r),{report:r,outputPath:o}})}function Q(t,e){let n=t.summary.tokens.observedTotal,r=e.summary.tokens.observedTotal,o=n-r,a$1={schemaVersion:I,generatedAt:new Date().toISOString(),taskAligned:t.configuration.taskId===e.configuration.taskId,current:{runId:t.runId,strategy:t.configuration.strategy,tokens:n,verified:t.summary.outcome.verified,status:t.summary.outcome.status},baseline:{runId:e.runId,strategy:e.configuration.strategy,tokens:r,verified:e.summary.outcome.verified,status:e.summary.outcome.status},delta:{tokens:o,reductionPercent:r===0?null:Number((-o/r*100).toFixed(2)),modelCalls:t.summary.modelCalls-e.summary.modelCalls,toolCalls:t.summary.toolCalls-e.summary.toolCalls,latencyMs:Number((t.summary.latencyMs-e.summary.latencyMs).toFixed(2))},comparableOutcome:t.summary.outcome.verified&&e.summary.outcome.verified&&t.summary.outcome.status===e.summary.outcome.status};return a(a$1,M,"workspace evaluation comparison"),a$1}function Z(){if(S.length!==4)throw new Error("Model usage source taxonomy is incomplete.")}export{y as a,f as b,I as c,v as d,h as e,A as f,U as g,B as h,E as i,_ as j,Y as k,X as l,Q as m,Z as n};
@@ -1,4 +1,4 @@
1
- import {g,b,i,d as d$1,e,f}from'./chunk-AQNU5RXV.js';import {c as c$1}from'./chunk-X7FYEKLI.js';import {d as d$2,b as b$1,a as a$1}from'./chunk-3RBUSW7H.js';import {c}from'./chunk-EBQS5T7Q.js';import {a}from'./chunk-AFIFZTOY.js';import {d}from'./chunk-EWZZUQBR.js';import {s,p,t}from'./chunk-ODK4LCEL.js';import {u,h,g as g$1}from'./chunk-VQZ5PI5J.js';import Ee from'crypto';import se from'fs';import y from'fs/promises';import l from'path';import {execa}from'execa';import Q from'fs-extra';async function Z(e,t){let[n,r]=await Promise.all([Q.realpath(e).catch(()=>null),Q.realpath(t).catch(()=>null)]);if(!n||!r)return null;let s=l.relative(n,r);return !s||l.isAbsolute(s)||s===".."||s.startsWith(`..${l.sep}`)?null:(await Q.stat(r).catch(()=>null))?.isFile()?r:null}var Ge=s.projectContextAgent.schemaVersion,yt=["managed","local","off"],ae="<!-- WORKSPAI:PROJECT-GROUNDING:START -->",Ce="<!-- WORKSPAI:PROJECT-GROUNDING:END -->",te="<!-- WORKSPAI:GENERATED-PROJECT-SKILL -->",B=".agents/skills/workspai-grounding/SKILL.md";function ke(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}async function A(e){try{return JSON.parse(await y.readFile(e,"utf8"))}catch(t){return null}}function $(e){return e.replace(/\\/g,"/").replace(/^\.\/+/,"")}function _(e,t,n){let r=e.replace(/\\/g,"/"),s=/^[A-Za-z]:\//.test(r);if(!l.isAbsolute(e)&&!s)return $(r);if(s&&process.platform!=="win32")return null;let a=l.resolve(e),i=l.relative(n,a);if(i&&!i.startsWith("..")&&!l.isAbsolute(i))return $(i);let c=l.relative(t,a);return c&&!c.startsWith("..")&&!l.isAbsolute(c)?`workspace:${$(c)}`:null}function I(e,t,n){return [[n,"project:"],[n.replace(/\\/g,"/"),"project:"],[t,"workspace:"],[t.replace(/\\/g,"/"),"workspace:"]].reduce((s,[a,i])=>a.length>0?s.split(a).join(i):s,e)}function Re(e,t){return ke(e?.adoption)?.mode==="linked"?"adopted":ke(e?.import)?"imported":t}function We(e){if(!e.model)return null;let t=$(e.relativePath);return e.model.projects.find(n=>n.name===e.projectName||$(n.path)===t)??null}function U(e,t){e[t]=(e[t]??0)+1;}var we=["project","language","service","api","endpoint","schema","protocol","runtime-unit","lifecycle-stage","database","queue","container","deployment","pipeline","environment","test-suite","owner","decision","document","package","file","module","symbol"],oe=48,ye=16,re=12*1024;function Oe(e,t=oe,n=re){let r={language:12,api:8,service:8,endpoint:8,schema:8,protocol:8,"runtime-unit":12,"lifecycle-stage":12,file:4,module:4,symbol:4},s=new Map,a={};for(let u of e)U(a,u.kind);for(let u of we)s.set(u,e.filter(w=>w.kind===u).sort((w,f)=>w.label.localeCompare(f.label)||w.id.localeCompare(f.id)).slice(0,r[u]??6));let i=[],c={},h=0,g=0,d=true;for(;i.length<t&&d;){d=false;for(let u of we){let w=s.get(u)?.[g];if(!w)continue;let f=Buffer.byteLength(JSON.stringify(w));if(!(h+f>n)&&(i.push(w),h+=f,U(c,u),d=true,i.length>=t))break}g+=1;}let m=Object.fromEntries(Object.entries(a).map(([u,w])=>[u,w-(c[u]??0)]).filter(([,u])=>u>0).sort(([u],[w])=>u.localeCompare(w)));return {entities:i,selectedBytes:h,selectedByKind:c,omittedByKind:m}}function Ke(e,t){if(!e)return {entityCount:0,relationCount:0,proofCount:0,entitiesByKind:{},relationsByKind:{},languages:{},semantic:{protocolConceptCount:0,protocolImplementationBindings:0,equivalenceBindings:0,generationBindings:0,runtimeUnitCount:0,lifecycleStageCount:0,runtimeCoverage:[]},projection:{mode:"stratified-byte-bounded",maxEntities:oe,byteBudget:re,selectedBytes:0,eligibleCount:0,selectedCount:0,omittedCount:0,selectedByKind:{},omittedByKind:{}},relatedProjects:[],proofArtifacts:[],entities:[],relations:[],proofs:[],topology:{status:"unavailable",dependencies:[],dependents:[]},diagnostics:[]};let n=e.entities.find(o=>o.kind==="project"&&(o.id===t||o.label===t||o.projectId===t)),r=new Set(e.entities.filter(o=>o.projectId===t||o.id===n?.id||o.kind==="project"&&o.label===t).map(o=>o.id));n&&r.add(n.id);let s=e.relations.filter(o=>r.has(o.from)||r.has(o.to)),a=new Set(r);for(let o of s)a.add(o.from),a.add(o.to);let i=e.entities.filter(o=>a.has(o.id)),c=new Set,h={},g={},d={},m=new Set(i.filter(o=>o.kind==="language").map(o=>o.attributes.language).filter(o=>typeof o=="string"));for(let o of i){U(h,o.kind);let k=typeof o.attributes.language=="string"?o.attributes.language:void 0;if(k&&o.kind==="language")d[k]={fileCount:typeof o.attributes.fileCount=="number"?o.attributes.fileCount:0,symbolCount:d[k]?.symbolCount??0,generatedFileCount:typeof o.attributes.generatedFileCount=="number"?o.attributes.generatedFileCount:0};else if(k&&(o.kind==="file"||o.kind==="symbol")){let p=d[k]??{fileCount:0,symbolCount:0,generatedFileCount:0};o.kind==="file"&&!m.has(k)?(p.fileCount+=1,o.attributes.generated===true&&(p.generatedFileCount+=1)):o.kind==="symbol"&&(p.symbolCount+=1),d[k]=p;}for(let p of o.proofIds)c.add(p);}for(let o of s){U(g,o.kind);for(let k of o.proofIds)c.add(k);}let u=e.proofs.filter(o=>c.has(o.id)),w=[...new Set(e.entities.filter(o=>a.has(o.id)&&o.projectId&&o.projectId!==t).map(o=>o.projectId))].sort(),f=e.diagnostics.filter(o=>(!o.entityIds||o.entityIds.length===0)&&(!o.relationIds||o.relationIds.length===0)||o.entityIds?.some(k=>a.has(k))||o.relationIds?.some(k=>s.some(p=>p.id===k))).map(o=>({code:o.code,severity:o.severity,message:o.message,...o.recommendation?{recommendation:o.recommendation}:{}})),j=(o,k)=>({project:k,kind:o.kind,source:o.source,confidence:o.confidence,evidence:[...new Set(o.evidence.map(p=>p.file.replace(/\\/g,"/")))].sort()}),P=e.projectTopology.edges.filter(o=>o.from===t).map(o=>j(o,o.to)).sort((o,k)=>`${o.project}:${o.kind}`.localeCompare(`${k.project}:${k.kind}`)),S=e.projectTopology.edges.filter(o=>o.to===t).map(o=>j(o,o.from)).sort((o,k)=>`${o.project}:${o.kind}`.localeCompare(`${k.project}:${k.kind}`)),N=Oe(i),T=N.entities,G=i.filter(o=>o.kind==="runtime-unit"),b=new Set(T.map(o=>o.id)),W=[...s].sort((o,k)=>{let p=Number(b.has(o.from)||b.has(o.to));return Number(b.has(k.from)||b.has(k.to))-p||o.id.localeCompare(k.id)}).slice(0,16),H=new Set([...T.flatMap(o=>o.proofIds),...W.flatMap(o=>o.proofIds)]),D=u.filter(o=>H.has(o.id)).sort((o,k)=>o.id.localeCompare(k.id)).slice(0,16);return {entityCount:i.length,relationCount:s.length,proofCount:u.length,entitiesByKind:h,relationsByKind:g,languages:Object.fromEntries(Object.entries(d).sort(([o],[k])=>o.localeCompare(k))),semantic:{protocolConceptCount:h.protocol??0,protocolImplementationBindings:g["implements-protocol"]??0,equivalenceBindings:g["equivalent-to"]??0,generationBindings:(g["generated-from"]??0)+(g["generated-by"]??0),runtimeUnitCount:G.length,lifecycleStageCount:h["lifecycle-stage"]??0,runtimeCoverage:[...new Set(G.map(o=>o.attributes.runtime).filter(o=>typeof o=="string"))].sort()},projection:{mode:"stratified-byte-bounded",maxEntities:oe,byteBudget:re,selectedBytes:N.selectedBytes,eligibleCount:i.length,selectedCount:T.length,omittedCount:Math.max(0,i.length-T.length),selectedByKind:Object.fromEntries(Object.entries(N.selectedByKind).sort(([o],[k])=>o.localeCompare(k))),omittedByKind:N.omittedByKind},relatedProjects:w,proofArtifacts:[...new Set(D.map(o=>o.artifact))].sort().slice(0,24),entities:T,relations:W,proofs:D,topology:{status:P.length>0||S.length>0?"proven":e.projectTopology.nodes.some(o=>o.id===t)?"unproven":"unavailable",dependencies:P,dependents:S},diagnostics:f}}function Se(e,t,n){return Array.isArray(e)?e.map(r=>typeof r=="string"?I(r,t,n):r):typeof e=="string"?I(e,t,n):e}function _e(e,t,n){return {id:e.id,kind:e.kind,label:I(e.label,t,n),attributes:Object.fromEntries(Object.entries(e.attributes).map(([r,s])=>[r,Se(s,t,n)])),proofIds:[...e.proofIds].sort()}}function Fe(e,t,n){let r=(...a)=>e.filter(i=>a.includes(i.kind)).map(i=>_e(i,t,n)).slice(0,4),s=[];for(let a of e){for(let[i,c]of Object.entries(a.attributes))if(/(?:^|[-_.])ports?(?:$|[-_.])/i.test(i)&&(s.push({entityId:a.id,label:I(a.label,t,n),attribute:i,value:Se(c,t,n)}),s.length>=8))break;if(s.length>=8)break}return {services:r("service"),packages:r("package"),protocols:r("protocol"),runtimeUnits:r("runtime-unit"),lifecycleStages:r("lifecycle-stage"),apis:r("api"),endpoints:r("endpoint"),dataStores:r("database","queue"),deployments:r("container","deployment","environment"),pipelines:r("pipeline"),tests:r("test-suite"),owners:r("owner"),decisions:r("decision"),ports:s}}function Be(e,t,n){let r=_(e.artifact,t,n);return r?{id:e.id,provider:e.provider,artifact:r,...e.pointer?{pointer:I(e.pointer,t,n)}:{},...e.line!==void 0?{line:e.line}:{},derivation:e.derivation,trust:e.trust,confidence:e.confidence,freshness:e.freshness}:null}async function Me(e,t,n){let r=[],s=await A(l.join(e,".workspai","reports","INDEX.json"));if(Array.isArray(s?.blockers))for(let d of s.blockers)typeof d=="string"&&(d.startsWith(`${n}:`)||d.includes(`project:${n}`)||d.includes(`project ${n}`))&&r.push({source:"workspace-report-index",severity:"error",message:I(d,e,t)});let a=await A(l.join(e,".workspai","reports","doctor-project-last-run.json")),i=await A(l.join(e,".workspai","reports","doctor-last-run.json")),c=i?.projects?.find(d=>d.name===n),g=[...a?.project&&(a.projectName===n||a.project.name===n)?[{generatedAt:a.generatedAt,project:a.project}]:[],...c?[{generatedAt:i?.generatedAt,project:c}]:[]].sort((d,m)=>{let u=typeof d.generatedAt=="string"&&Date.parse(d.generatedAt)||0;return (typeof m.generatedAt=="string"&&Date.parse(m.generatedAt)||0)-u})[0];if(g)for(let d of c$1({project:g.project}))r.push({source:"doctor-project",severity:d.status==="blocking"?"error":"warning",message:I(d.message,e,t),...d.id?{code:d.id}:{}});return [...new Map(r.map(d=>[`${d.source}:${d.code??""}:${d.message}`,d])).values()].slice(0,32)}function ne(e,t=[]){return typeof e=="string"?/^[A-Za-z]:[\\/]/.test(e)||/(?:^|[\s("'`])[A-Za-z]:[\\/]/.test(e)||/(?:^|[\s("'`])\/(?:Users|home|private|var|opt|srv|mnt|Volumes|tmp)\//.test(e)||t.some(n=>n.length>0&&(e.includes(n)||e.includes(n.replace(/\\/g,"/")))):Array.isArray(e)?e.some(n=>ne(n,t)):e&&typeof e=="object"?Object.values(e).some(n=>ne(n,t)):false}function De(e){return Ee.createHash("sha256").update(JSON.stringify(e)).digest("hex")}async function Je(e){let t$1=l.resolve(e.workspacePath),n=l.resolve(e.projectPath),r=u(n,"project.json").find(p=>se.existsSync(p)),s=r?await A(r):null,a$1=await A(l.join(t$1,".workspai","workspace.contract.json")),i=l.resolve(n),c=a$1?.projects?.find(p=>p.externalPath?l.resolve(p.externalPath)===i:!p.relativePath||p.relativePath.startsWith("external/")?false:l.resolve(t$1,p.relativePath)===i)??a$1?.projects?.find(p=>p.slug===e.projectName||p.slug===l.basename(n)),h=e.projectName??(typeof s?.name=="string"?s.name:void 0)??c?.slug??l.basename(n),g=c?.relativePath??(()=>{let p=$(l.relative(t$1,n));return !p||p.startsWith("..")?`external/${h}`:p})(),d$1=await A(l.join(t$1,p.model)),m=await A(l.join(t$1,p.knowledgeGraph)),u$1=d$1?d(d$1):void 0,w=!!(u$1&&m?.source.hash===u$1),f=We({model:d$1,projectName:h,relativePath:g}),j=Ke(w?m:null,h),P=await Me(t$1,n,h),S=j.proofs.map(p=>p.freshness),N=m?!w||S.includes("stale")?"stale":S.includes("unknown")?"unknown":"fresh":"missing",T=d$1?d$1.factFreshness?.status??"unknown":"missing",b$1=[...[...d$1?[]:[{code:"project.context.model-missing",severity:"warning",message:"The canonical Workspace Model has not been generated yet. Refresh workspace intelligence before relying on project topology."}],...d$1&&!f?[{code:"project.context.project-not-materialized",severity:"warning",message:"The project is registered in the workspace contract but is not present in the current Workspace Model."}]:[],...m?[]:[{code:"project.context.graph-missing",severity:"warning",message:"The Workspace Knowledge Graph has not been generated yet. Run the workspace intelligence loop to build proof-backed relationships."}],...m&&!w?[{code:"project.context.graph-model-mismatch",severity:"warning",message:"The persisted Knowledge Graph does not match the current Workspace Model and was excluded from this project lens."}]:[]],...j.diagnostics].filter((p,E,Ne)=>Ne.findIndex(ie=>ie.code===p.code&&ie.message===p.message)===E),W=Math.max(0,b$1.length-ye+1),H=W>0?[...b$1.slice(0,ye-1),{code:"project.context.diagnostics-truncated",severity:"info",message:`${W} additional diagnostic(s) remain available in the canonical Workspace Knowledge Graph.`,recommendation:"Inspect workspace:.workspai/reports/workspace-knowledge-graph.json for the complete diagnostic set."}]:b$1,D=Re(s,e.relationship??c?.relationship??"managed"),o={schemaVersion:Ge,generatedAt:(e.now??new Date).toISOString(),workspace:{name:a$1?.workspace?.name??d$1?.workspace.name??l.basename(t$1),...a$1?.workspace?.profile||d$1?.workspace.profile?{profile:a$1?.workspace?.profile??d$1?.workspace.profile}:{},relationship:D,contract:`workspace:${t.workspaceContract}`,projectKnowledgeGraph:t.projectKnowledgeGraphReference,model:`workspace:${p.model}`,knowledgeGraph:`workspace:${p.knowledgeGraph}`,index:`workspace:${p.agentIndex}`,context:`workspace:${p.agentContext}`,skillsIndex:`workspace:${p.skillsIndex}`,boundedGraphSearch:`workspai workspace graph search <task-query> --scope project:${h} --limit 12 --json`,access:{localBinding:t.projectWorkspaceLink,canonicalEvidenceAvailableAtGeneration:true,identityIsFilesystemPath:false,resolverCommand:"workspai project workspace status --json",portableUriScheme:"workspace:",resolvedPathPolicy:"runtime-private-never-persist"}},project:{name:h,relativePath:g,...f?.kind?{kind:f.kind}:{},...f?.runtime||c?.runtime?{runtime:f?.runtime??c?.runtime}:{},...f?.runtimeCandidates?.length?{runtimeCandidates:[...f.runtimeCandidates].sort()}:{},...f?.framework||c?.framework?{framework:f?.framework??c?.framework}:{},...f?.kit||c?.kit?{kit:f?.kit??c?.kit}:{},...f?.supportTier?{supportTier:f.supportTier}:{},...f?.governance?{governance:f.governance}:{},commands:{supported:[...f?.commands.supported??[]].sort(),unsupported:[...f?.commands.unsupported??[]].sort(),fleetStages:[...f?.commands.fleetStages??[]].sort()},importantFiles:[...new Set((f?.importantFiles??[]).map(p=>_(p,t$1,n)).filter(p=>p!==null))].sort()},intelligence:{...d$1?.generatedAt?{modelGeneratedAt:d$1.generatedAt}:{},...m?.generatedAt?{graphGeneratedAt:m.generatedAt}:{},...m?.source.hash?{graphModelHash:m.source.hash}:{},entityCount:j.entityCount,relationCount:j.relationCount,proofCount:j.proofCount,entitiesByKind:j.entitiesByKind,relationsByKind:j.relationsByKind,languages:j.languages,semantic:j.semantic,projection:{...j.projection,continuationCommand:`workspai workspace graph search <task-query> --scope project:${h} --limit 12 --json`},relatedProjects:j.relatedProjects,freshness:{model:T,graph:N,graphMatchesModel:w},topology:{...j.topology,dependencies:j.topology.dependencies.map(p=>({...p,evidence:p.evidence.map(E=>_(E,t$1,n)).filter(E=>E!==null)})),dependents:j.topology.dependents.map(p=>({...p,evidence:p.evidence.map(E=>_(E,t$1,n)).filter(E=>E!==null)}))},surfaces:Fe(j.entities,t$1,n),diagnostics:H.map(p=>({...p,message:I(p.message,t$1,n),...p.recommendation?{recommendation:I(p.recommendation,t$1,n)}:{}}))},evidence:{readOrder:[b,".workspai/PROJECT-GROUNDING.md",t.projectContextAgent,"AGENTS.md","workspace:.workspai/goals/index.json",`workspace:${t.goalPackLastRun}`,"workspace:.workspai/reports/workspace-skills-index.json",`command:workspai workspace graph search <task-query> --scope project:${h} --limit 12 --json`],projectProofArtifacts:[...new Set(j.proofArtifacts.map(p=>_(p,t$1,n)).filter(p=>p!==null))],relations:j.relations.map(p=>({id:p.id,from:p.from,to:p.to,kind:p.kind,derivation:p.derivation,trust:p.trust,confidence:p.confidence,proofIds:[...p.proofIds].sort()})),proofs:j.proofs.map(p=>Be(p,t$1,n)).filter(p=>p!==null)},blockers:P,agentRouting:{enforcement:"required",mandatoryPreflight:{command:"workspai agent bootstrap --for-agent generic --strict --json",successCondition:"ready"},workspaceLocator:{command:"workspai project workspace status --json",successCondition:"resolved",outputClassification:"machine-local",persistence:"forbidden",disclosure:"forbidden",portableUriScheme:"workspace:"},workspaceEvidenceRequiredFor:["repository-analysis","architecture-analysis","change-impact","cross-project-change","contract-change","infrastructure-change","release-readiness"],requiredReadOrder:[b,"command:workspai agent bootstrap --for-agent generic --strict --json","command:workspai project workspace status --json",t.projectContextAgent,"workspace:.workspai/reports/workspace-skills-index.json",`command:workspai workspace graph search ${JSON.stringify(h)} --scope ${JSON.stringify(`project:${h}`)} --limit 12 --json`],degradedMode:{allowCompleteArchitectureClaims:false,requireDisclosure:true}},commands:{refresh:"workspai workspace intelligence run --for-agent generic --strict --json",verify:"workspai workspace verify --strict --json",graphSearch:`workspai workspace graph search ${JSON.stringify(h)} --scope ${JSON.stringify(`project:${h}`)} --limit 12 --json`,doctor:"workspai doctor project --json",workspaceStatus:"workspai project workspace status --json"}};if(ne(o,[t$1,n]))throw new Error("Project context lens rejected a non-portable absolute path.");let k={...o,integrity:{algorithm:"sha256",...u$1?{modelHash:u$1}:{},payloadHash:De(o),portable:true,absolutePathsEmitted:false}};return a(k,"contracts/workspace-intelligence/project-context-agent.v1.json","Project context agent"),k}function Ue(e){let t=e.intelligence.relatedProjects.length>0?e.intelligence.relatedProjects.map(s=>`\`${s}\``).join(", "):"No proven cross-project relation is currently available.",n=e.intelligence.diagnostics.length>0?e.intelligence.diagnostics.slice(0,8).map(s=>`- **${s.severity} \xB7 ${s.code}:** ${s.message}`).join(`
1
+ import {g,b,i,d as d$1,e,f}from'./chunk-GIFAGOMK.js';import {c as c$1}from'./chunk-X7FYEKLI.js';import {d as d$2,b as b$1,a as a$1}from'./chunk-3RBUSW7H.js';import {c}from'./chunk-OA2YJN22.js';import {a}from'./chunk-AFIFZTOY.js';import {d}from'./chunk-EWZZUQBR.js';import {u,h,g as g$1}from'./chunk-VQZ5PI5J.js';import {s,p,t}from'./chunk-ODK4LCEL.js';import Ee from'crypto';import se from'fs';import y from'fs/promises';import l from'path';import {execa}from'execa';import Q from'fs-extra';async function Z(e,t){let[n,r]=await Promise.all([Q.realpath(e).catch(()=>null),Q.realpath(t).catch(()=>null)]);if(!n||!r)return null;let s=l.relative(n,r);return !s||l.isAbsolute(s)||s===".."||s.startsWith(`..${l.sep}`)?null:(await Q.stat(r).catch(()=>null))?.isFile()?r:null}var Ge=s.projectContextAgent.schemaVersion,yt=["managed","local","off"],ae="<!-- WORKSPAI:PROJECT-GROUNDING:START -->",Ce="<!-- WORKSPAI:PROJECT-GROUNDING:END -->",te="<!-- WORKSPAI:GENERATED-PROJECT-SKILL -->",B=".agents/skills/workspai-grounding/SKILL.md";function ke(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}async function A(e){try{return JSON.parse(await y.readFile(e,"utf8"))}catch(t){return null}}function $(e){return e.replace(/\\/g,"/").replace(/^\.\/+/,"")}function _(e,t,n){let r=e.replace(/\\/g,"/"),s=/^[A-Za-z]:\//.test(r);if(!l.isAbsolute(e)&&!s)return $(r);if(s&&process.platform!=="win32")return null;let a=l.resolve(e),i=l.relative(n,a);if(i&&!i.startsWith("..")&&!l.isAbsolute(i))return $(i);let c=l.relative(t,a);return c&&!c.startsWith("..")&&!l.isAbsolute(c)?`workspace:${$(c)}`:null}function I(e,t,n){return [[n,"project:"],[n.replace(/\\/g,"/"),"project:"],[t,"workspace:"],[t.replace(/\\/g,"/"),"workspace:"]].reduce((s,[a,i])=>a.length>0?s.split(a).join(i):s,e)}function Re(e,t){return ke(e?.adoption)?.mode==="linked"?"adopted":ke(e?.import)?"imported":t}function We(e){if(!e.model)return null;let t=$(e.relativePath);return e.model.projects.find(n=>n.name===e.projectName||$(n.path)===t)??null}function U(e,t){e[t]=(e[t]??0)+1;}var we=["project","language","service","api","endpoint","schema","protocol","runtime-unit","lifecycle-stage","database","queue","container","deployment","pipeline","environment","test-suite","owner","decision","document","package","file","module","symbol"],oe=48,ye=16,re=12*1024;function Oe(e,t=oe,n=re){let r={language:12,api:8,service:8,endpoint:8,schema:8,protocol:8,"runtime-unit":12,"lifecycle-stage":12,file:4,module:4,symbol:4},s=new Map,a={};for(let u of e)U(a,u.kind);for(let u of we)s.set(u,e.filter(w=>w.kind===u).sort((w,f)=>w.label.localeCompare(f.label)||w.id.localeCompare(f.id)).slice(0,r[u]??6));let i=[],c={},h=0,g=0,d=true;for(;i.length<t&&d;){d=false;for(let u of we){let w=s.get(u)?.[g];if(!w)continue;let f=Buffer.byteLength(JSON.stringify(w));if(!(h+f>n)&&(i.push(w),h+=f,U(c,u),d=true,i.length>=t))break}g+=1;}let m=Object.fromEntries(Object.entries(a).map(([u,w])=>[u,w-(c[u]??0)]).filter(([,u])=>u>0).sort(([u],[w])=>u.localeCompare(w)));return {entities:i,selectedBytes:h,selectedByKind:c,omittedByKind:m}}function Ke(e,t){if(!e)return {entityCount:0,relationCount:0,proofCount:0,entitiesByKind:{},relationsByKind:{},languages:{},semantic:{protocolConceptCount:0,protocolImplementationBindings:0,equivalenceBindings:0,generationBindings:0,runtimeUnitCount:0,lifecycleStageCount:0,runtimeCoverage:[]},projection:{mode:"stratified-byte-bounded",maxEntities:oe,byteBudget:re,selectedBytes:0,eligibleCount:0,selectedCount:0,omittedCount:0,selectedByKind:{},omittedByKind:{}},relatedProjects:[],proofArtifacts:[],entities:[],relations:[],proofs:[],topology:{status:"unavailable",dependencies:[],dependents:[]},diagnostics:[]};let n=e.entities.find(o=>o.kind==="project"&&(o.id===t||o.label===t||o.projectId===t)),r=new Set(e.entities.filter(o=>o.projectId===t||o.id===n?.id||o.kind==="project"&&o.label===t).map(o=>o.id));n&&r.add(n.id);let s=e.relations.filter(o=>r.has(o.from)||r.has(o.to)),a=new Set(r);for(let o of s)a.add(o.from),a.add(o.to);let i=e.entities.filter(o=>a.has(o.id)),c=new Set,h={},g={},d={},m=new Set(i.filter(o=>o.kind==="language").map(o=>o.attributes.language).filter(o=>typeof o=="string"));for(let o of i){U(h,o.kind);let k=typeof o.attributes.language=="string"?o.attributes.language:void 0;if(k&&o.kind==="language")d[k]={fileCount:typeof o.attributes.fileCount=="number"?o.attributes.fileCount:0,symbolCount:d[k]?.symbolCount??0,generatedFileCount:typeof o.attributes.generatedFileCount=="number"?o.attributes.generatedFileCount:0};else if(k&&(o.kind==="file"||o.kind==="symbol")){let p=d[k]??{fileCount:0,symbolCount:0,generatedFileCount:0};o.kind==="file"&&!m.has(k)?(p.fileCount+=1,o.attributes.generated===true&&(p.generatedFileCount+=1)):o.kind==="symbol"&&(p.symbolCount+=1),d[k]=p;}for(let p of o.proofIds)c.add(p);}for(let o of s){U(g,o.kind);for(let k of o.proofIds)c.add(k);}let u=e.proofs.filter(o=>c.has(o.id)),w=[...new Set(e.entities.filter(o=>a.has(o.id)&&o.projectId&&o.projectId!==t).map(o=>o.projectId))].sort(),f=e.diagnostics.filter(o=>(!o.entityIds||o.entityIds.length===0)&&(!o.relationIds||o.relationIds.length===0)||o.entityIds?.some(k=>a.has(k))||o.relationIds?.some(k=>s.some(p=>p.id===k))).map(o=>({code:o.code,severity:o.severity,message:o.message,...o.recommendation?{recommendation:o.recommendation}:{}})),j=(o,k)=>({project:k,kind:o.kind,source:o.source,confidence:o.confidence,evidence:[...new Set(o.evidence.map(p=>p.file.replace(/\\/g,"/")))].sort()}),P=e.projectTopology.edges.filter(o=>o.from===t).map(o=>j(o,o.to)).sort((o,k)=>`${o.project}:${o.kind}`.localeCompare(`${k.project}:${k.kind}`)),S=e.projectTopology.edges.filter(o=>o.to===t).map(o=>j(o,o.from)).sort((o,k)=>`${o.project}:${o.kind}`.localeCompare(`${k.project}:${k.kind}`)),N=Oe(i),T=N.entities,G=i.filter(o=>o.kind==="runtime-unit"),b=new Set(T.map(o=>o.id)),W=[...s].sort((o,k)=>{let p=Number(b.has(o.from)||b.has(o.to));return Number(b.has(k.from)||b.has(k.to))-p||o.id.localeCompare(k.id)}).slice(0,16),H=new Set([...T.flatMap(o=>o.proofIds),...W.flatMap(o=>o.proofIds)]),D=u.filter(o=>H.has(o.id)).sort((o,k)=>o.id.localeCompare(k.id)).slice(0,16);return {entityCount:i.length,relationCount:s.length,proofCount:u.length,entitiesByKind:h,relationsByKind:g,languages:Object.fromEntries(Object.entries(d).sort(([o],[k])=>o.localeCompare(k))),semantic:{protocolConceptCount:h.protocol??0,protocolImplementationBindings:g["implements-protocol"]??0,equivalenceBindings:g["equivalent-to"]??0,generationBindings:(g["generated-from"]??0)+(g["generated-by"]??0),runtimeUnitCount:G.length,lifecycleStageCount:h["lifecycle-stage"]??0,runtimeCoverage:[...new Set(G.map(o=>o.attributes.runtime).filter(o=>typeof o=="string"))].sort()},projection:{mode:"stratified-byte-bounded",maxEntities:oe,byteBudget:re,selectedBytes:N.selectedBytes,eligibleCount:i.length,selectedCount:T.length,omittedCount:Math.max(0,i.length-T.length),selectedByKind:Object.fromEntries(Object.entries(N.selectedByKind).sort(([o],[k])=>o.localeCompare(k))),omittedByKind:N.omittedByKind},relatedProjects:w,proofArtifacts:[...new Set(D.map(o=>o.artifact))].sort().slice(0,24),entities:T,relations:W,proofs:D,topology:{status:P.length>0||S.length>0?"proven":e.projectTopology.nodes.some(o=>o.id===t)?"unproven":"unavailable",dependencies:P,dependents:S},diagnostics:f}}function Se(e,t,n){return Array.isArray(e)?e.map(r=>typeof r=="string"?I(r,t,n):r):typeof e=="string"?I(e,t,n):e}function _e(e,t,n){return {id:e.id,kind:e.kind,label:I(e.label,t,n),attributes:Object.fromEntries(Object.entries(e.attributes).map(([r,s])=>[r,Se(s,t,n)])),proofIds:[...e.proofIds].sort()}}function Fe(e,t,n){let r=(...a)=>e.filter(i=>a.includes(i.kind)).map(i=>_e(i,t,n)).slice(0,4),s=[];for(let a of e){for(let[i,c]of Object.entries(a.attributes))if(/(?:^|[-_.])ports?(?:$|[-_.])/i.test(i)&&(s.push({entityId:a.id,label:I(a.label,t,n),attribute:i,value:Se(c,t,n)}),s.length>=8))break;if(s.length>=8)break}return {services:r("service"),packages:r("package"),protocols:r("protocol"),runtimeUnits:r("runtime-unit"),lifecycleStages:r("lifecycle-stage"),apis:r("api"),endpoints:r("endpoint"),dataStores:r("database","queue"),deployments:r("container","deployment","environment"),pipelines:r("pipeline"),tests:r("test-suite"),owners:r("owner"),decisions:r("decision"),ports:s}}function Be(e,t,n){let r=_(e.artifact,t,n);return r?{id:e.id,provider:e.provider,artifact:r,...e.pointer?{pointer:I(e.pointer,t,n)}:{},...e.line!==void 0?{line:e.line}:{},derivation:e.derivation,trust:e.trust,confidence:e.confidence,freshness:e.freshness}:null}async function Me(e,t,n){let r=[],s=await A(l.join(e,".workspai","reports","INDEX.json"));if(Array.isArray(s?.blockers))for(let d of s.blockers)typeof d=="string"&&(d.startsWith(`${n}:`)||d.includes(`project:${n}`)||d.includes(`project ${n}`))&&r.push({source:"workspace-report-index",severity:"error",message:I(d,e,t)});let a=await A(l.join(e,".workspai","reports","doctor-project-last-run.json")),i=await A(l.join(e,".workspai","reports","doctor-last-run.json")),c=i?.projects?.find(d=>d.name===n),g=[...a?.project&&(a.projectName===n||a.project.name===n)?[{generatedAt:a.generatedAt,project:a.project}]:[],...c?[{generatedAt:i?.generatedAt,project:c}]:[]].sort((d,m)=>{let u=typeof d.generatedAt=="string"&&Date.parse(d.generatedAt)||0;return (typeof m.generatedAt=="string"&&Date.parse(m.generatedAt)||0)-u})[0];if(g)for(let d of c$1({project:g.project}))r.push({source:"doctor-project",severity:d.status==="blocking"?"error":"warning",message:I(d.message,e,t),...d.id?{code:d.id}:{}});return [...new Map(r.map(d=>[`${d.source}:${d.code??""}:${d.message}`,d])).values()].slice(0,32)}function ne(e,t=[]){return typeof e=="string"?/^[A-Za-z]:[\\/]/.test(e)||/(?:^|[\s("'`])[A-Za-z]:[\\/]/.test(e)||/(?:^|[\s("'`])\/(?:Users|home|private|var|opt|srv|mnt|Volumes|tmp)\//.test(e)||t.some(n=>n.length>0&&(e.includes(n)||e.includes(n.replace(/\\/g,"/")))):Array.isArray(e)?e.some(n=>ne(n,t)):e&&typeof e=="object"?Object.values(e).some(n=>ne(n,t)):false}function De(e){return Ee.createHash("sha256").update(JSON.stringify(e)).digest("hex")}async function Je(e){let t$1=l.resolve(e.workspacePath),n=l.resolve(e.projectPath),r=u(n,"project.json").find(p=>se.existsSync(p)),s=r?await A(r):null,a$1=await A(l.join(t$1,".workspai","workspace.contract.json")),i=l.resolve(n),c=a$1?.projects?.find(p=>p.externalPath?l.resolve(p.externalPath)===i:!p.relativePath||p.relativePath.startsWith("external/")?false:l.resolve(t$1,p.relativePath)===i)??a$1?.projects?.find(p=>p.slug===e.projectName||p.slug===l.basename(n)),h=e.projectName??(typeof s?.name=="string"?s.name:void 0)??c?.slug??l.basename(n),g=c?.relativePath??(()=>{let p=$(l.relative(t$1,n));return !p||p.startsWith("..")?`external/${h}`:p})(),d$1=await A(l.join(t$1,p.model)),m=await A(l.join(t$1,p.knowledgeGraph)),u$1=d$1?d(d$1):void 0,w=!!(u$1&&m?.source.hash===u$1),f=We({model:d$1,projectName:h,relativePath:g}),j=Ke(w?m:null,h),P=await Me(t$1,n,h),S=j.proofs.map(p=>p.freshness),N=m?!w||S.includes("stale")?"stale":S.includes("unknown")?"unknown":"fresh":"missing",T=d$1?d$1.factFreshness?.status??"unknown":"missing",b$1=[...[...d$1?[]:[{code:"project.context.model-missing",severity:"warning",message:"The canonical Workspace Model has not been generated yet. Refresh workspace intelligence before relying on project topology."}],...d$1&&!f?[{code:"project.context.project-not-materialized",severity:"warning",message:"The project is registered in the workspace contract but is not present in the current Workspace Model."}]:[],...m?[]:[{code:"project.context.graph-missing",severity:"warning",message:"The Workspace Knowledge Graph has not been generated yet. Run the workspace intelligence loop to build proof-backed relationships."}],...m&&!w?[{code:"project.context.graph-model-mismatch",severity:"warning",message:"The persisted Knowledge Graph does not match the current Workspace Model and was excluded from this project lens."}]:[]],...j.diagnostics].filter((p,E,Ne)=>Ne.findIndex(ie=>ie.code===p.code&&ie.message===p.message)===E),W=Math.max(0,b$1.length-ye+1),H=W>0?[...b$1.slice(0,ye-1),{code:"project.context.diagnostics-truncated",severity:"info",message:`${W} additional diagnostic(s) remain available in the canonical Workspace Knowledge Graph.`,recommendation:"Inspect workspace:.workspai/reports/workspace-knowledge-graph.json for the complete diagnostic set."}]:b$1,D=Re(s,e.relationship??c?.relationship??"managed"),o={schemaVersion:Ge,generatedAt:(e.now??new Date).toISOString(),workspace:{name:a$1?.workspace?.name??d$1?.workspace.name??l.basename(t$1),...a$1?.workspace?.profile||d$1?.workspace.profile?{profile:a$1?.workspace?.profile??d$1?.workspace.profile}:{},relationship:D,contract:`workspace:${t.workspaceContract}`,projectKnowledgeGraph:t.projectKnowledgeGraphReference,model:`workspace:${p.model}`,knowledgeGraph:`workspace:${p.knowledgeGraph}`,index:`workspace:${p.agentIndex}`,context:`workspace:${p.agentContext}`,skillsIndex:`workspace:${p.skillsIndex}`,boundedGraphSearch:`workspai workspace graph search <task-query> --scope project:${h} --limit 12 --json`,access:{localBinding:t.projectWorkspaceLink,canonicalEvidenceAvailableAtGeneration:true,identityIsFilesystemPath:false,resolverCommand:"workspai project workspace status --json",portableUriScheme:"workspace:",resolvedPathPolicy:"runtime-private-never-persist"}},project:{name:h,relativePath:g,...f?.kind?{kind:f.kind}:{},...f?.runtime||c?.runtime?{runtime:f?.runtime??c?.runtime}:{},...f?.runtimeCandidates?.length?{runtimeCandidates:[...f.runtimeCandidates].sort()}:{},...f?.framework||c?.framework?{framework:f?.framework??c?.framework}:{},...f?.kit||c?.kit?{kit:f?.kit??c?.kit}:{},...f?.supportTier?{supportTier:f.supportTier}:{},...f?.governance?{governance:f.governance}:{},commands:{supported:[...f?.commands.supported??[]].sort(),unsupported:[...f?.commands.unsupported??[]].sort(),fleetStages:[...f?.commands.fleetStages??[]].sort()},importantFiles:[...new Set((f?.importantFiles??[]).map(p=>_(p,t$1,n)).filter(p=>p!==null))].sort()},intelligence:{...d$1?.generatedAt?{modelGeneratedAt:d$1.generatedAt}:{},...m?.generatedAt?{graphGeneratedAt:m.generatedAt}:{},...m?.source.hash?{graphModelHash:m.source.hash}:{},entityCount:j.entityCount,relationCount:j.relationCount,proofCount:j.proofCount,entitiesByKind:j.entitiesByKind,relationsByKind:j.relationsByKind,languages:j.languages,semantic:j.semantic,projection:{...j.projection,continuationCommand:`workspai workspace graph search <task-query> --scope project:${h} --limit 12 --json`},relatedProjects:j.relatedProjects,freshness:{model:T,graph:N,graphMatchesModel:w},topology:{...j.topology,dependencies:j.topology.dependencies.map(p=>({...p,evidence:p.evidence.map(E=>_(E,t$1,n)).filter(E=>E!==null)})),dependents:j.topology.dependents.map(p=>({...p,evidence:p.evidence.map(E=>_(E,t$1,n)).filter(E=>E!==null)}))},surfaces:Fe(j.entities,t$1,n),diagnostics:H.map(p=>({...p,message:I(p.message,t$1,n),...p.recommendation?{recommendation:I(p.recommendation,t$1,n)}:{}}))},evidence:{readOrder:[b,".workspai/PROJECT-GROUNDING.md",t.projectContextAgent,"AGENTS.md","workspace:.workspai/goals/index.json",`workspace:${t.goalPackLastRun}`,"workspace:.workspai/reports/workspace-skills-index.json",`command:workspai workspace graph search <task-query> --scope project:${h} --limit 12 --json`],projectProofArtifacts:[...new Set(j.proofArtifacts.map(p=>_(p,t$1,n)).filter(p=>p!==null))],relations:j.relations.map(p=>({id:p.id,from:p.from,to:p.to,kind:p.kind,derivation:p.derivation,trust:p.trust,confidence:p.confidence,proofIds:[...p.proofIds].sort()})),proofs:j.proofs.map(p=>Be(p,t$1,n)).filter(p=>p!==null)},blockers:P,agentRouting:{enforcement:"required",mandatoryPreflight:{command:"workspai agent bootstrap --for-agent generic --strict --json",successCondition:"ready"},workspaceLocator:{command:"workspai project workspace status --json",successCondition:"resolved",outputClassification:"machine-local",persistence:"forbidden",disclosure:"forbidden",portableUriScheme:"workspace:"},workspaceEvidenceRequiredFor:["repository-analysis","architecture-analysis","change-impact","cross-project-change","contract-change","infrastructure-change","release-readiness"],requiredReadOrder:[b,"command:workspai agent bootstrap --for-agent generic --strict --json","command:workspai project workspace status --json",t.projectContextAgent,"workspace:.workspai/reports/workspace-skills-index.json",`command:workspai workspace graph search ${JSON.stringify(h)} --scope ${JSON.stringify(`project:${h}`)} --limit 12 --json`],degradedMode:{allowCompleteArchitectureClaims:false,requireDisclosure:true}},commands:{refresh:"workspai workspace intelligence run --for-agent generic --strict --json",verify:"workspai workspace verify --strict --json",graphSearch:`workspai workspace graph search ${JSON.stringify(h)} --scope ${JSON.stringify(`project:${h}`)} --limit 12 --json`,doctor:"workspai doctor project --json",workspaceStatus:"workspai project workspace status --json"}};if(ne(o,[t$1,n]))throw new Error("Project context lens rejected a non-portable absolute path.");let k={...o,integrity:{algorithm:"sha256",...u$1?{modelHash:u$1}:{},payloadHash:De(o),portable:true,absolutePathsEmitted:false}};return a(k,"contracts/workspace-intelligence/project-context-agent.v1.json","Project context agent"),k}function Ue(e){let t=e.intelligence.relatedProjects.length>0?e.intelligence.relatedProjects.map(s=>`\`${s}\``).join(", "):"No proven cross-project relation is currently available.",n=e.intelligence.diagnostics.length>0?e.intelligence.diagnostics.slice(0,8).map(s=>`- **${s.severity} \xB7 ${s.code}:** ${s.message}`).join(`
2
2
  `):"- No project-scoped graph diagnostic is currently recorded.",r=e.blockers.length>0?e.blockers.slice(0,12).map(s=>`- **${s.severity}${s.code?` \xB7 ${s.code}`:""}:** ${s.message}`).join(`
3
3
  `):"- No current project-scoped blocker is recorded.";return `# Workspai project grounding
4
4
 
@@ -1 +1 @@
1
- export{b as buildWorkspaceManifest,f as createProject,a as initializeStandaloneGitRepository,g as registerWorkspaceAtPath,d as resolvePythonFreeFallbackProfile,c as syncWorkspaceFoundationFiles,e as writeWorkspaceLauncher}from'./chunk-J44PN2FX.js';
1
+ export{b as buildWorkspaceManifest,f as createProject,a as initializeStandaloneGitRepository,g as registerWorkspaceAtPath,d as resolvePythonFreeFallbackProfile,c as syncWorkspaceFoundationFiles,e as writeWorkspaceLauncher}from'./chunk-P5RZO5BY.js';