workspai 0.66.0 → 0.68.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 (149) hide show
  1. package/README.md +24 -22
  2. package/contracts/cli-runtime-command-inventory.v1.snapshot.json +4 -0
  3. package/contracts/extension-cli-compatibility.v1.json +4 -0
  4. package/contracts/published-contract-catalog.v1.json +20 -0
  5. package/contracts/runtime-command-surface.v1.json +55 -2
  6. package/contracts/workspace-activity-board.v1.json +120 -0
  7. package/contracts/workspace-activity-event.v1.json +31 -1
  8. package/contracts/workspace-activity-monitor-fleet.v1.json +18 -0
  9. package/contracts/workspace-activity-monitor-snapshot.v1.json +194 -0
  10. package/contracts/workspace-intelligence/workspace-intelligence-benchmark.v1.json +196 -0
  11. package/contracts/workspace-intelligence/workspace-knowledge-search.v1.json +1 -0
  12. package/contracts/workspace-intelligence-architecture.v1.json +17 -0
  13. package/contracts/workspace-intelligence-chain.v1.json +17 -0
  14. package/dist/analyze-JDEWUBC6.js +1 -0
  15. package/dist/{artifact-remediation-plan-M2XBS2IU.js → artifact-remediation-plan-I7IKC5MR.js} +1 -1
  16. package/dist/autopilot-release-OELUFNLL.js +1 -0
  17. package/dist/capabilities-command-RAAYENQ6.js +1 -0
  18. package/dist/chunk-25AWHAB5.js +2 -0
  19. package/dist/{chunk-QGAPGZPL.js → chunk-2C5XJBYI.js} +1 -1
  20. package/dist/{chunk-PJPS7CNH.js → chunk-2KX6KHEC.js} +1 -1
  21. package/dist/{chunk-JZJBA2V2.js → chunk-2MTJWPQ4.js} +1 -1
  22. package/dist/chunk-3BMYMZQB.js +1 -0
  23. package/dist/{chunk-VA5VSOBL.js → chunk-3KU3YUWD.js} +1 -1
  24. package/dist/{chunk-UPIPSSXY.js → chunk-3NF3M3RE.js} +1 -1
  25. package/dist/chunk-3OGPTLI2.js +1 -0
  26. package/dist/{chunk-EHH4SKVH.js → chunk-3XF7O66C.js} +3 -3
  27. package/dist/{chunk-WTWRSEOW.js → chunk-3Z4SVBMR.js} +1 -1
  28. package/dist/{chunk-NVND4727.js → chunk-46QH3ZVI.js} +1 -1
  29. package/dist/{chunk-XQFWUM2P.js → chunk-4WVOAX2V.js} +1 -1
  30. package/dist/{chunk-727IQFGN.js → chunk-5ME4W4LN.js} +1 -1
  31. package/dist/{chunk-IVF6NEHS.js → chunk-5OV2WXAR.js} +1 -1
  32. package/dist/{chunk-R2M5OJOK.js → chunk-5XUAAQSV.js} +2 -2
  33. package/dist/{chunk-IIFFEEMX.js → chunk-5YZ2W57R.js} +1 -1
  34. package/dist/{chunk-B4IVVTMQ.js → chunk-64XWHDZ3.js} +1 -1
  35. package/dist/{chunk-AP4PV6WJ.js → chunk-6E2Y3XGT.js} +1 -1
  36. package/dist/{chunk-4XEH3WNV.js → chunk-7DDEMDG2.js} +1 -1
  37. package/dist/{chunk-YX5VWPR5.js → chunk-7DZNZ3GM.js} +1 -1
  38. package/dist/{chunk-OI2VOU6S.js → chunk-BG6IX6HA.js} +1 -1
  39. package/dist/{chunk-6JX56VAL.js → chunk-BHM6RHTA.js} +1 -1
  40. package/dist/chunk-BMAFHX6A.js +1 -0
  41. package/dist/{chunk-3NM3JAZW.js → chunk-BUYLM6QV.js} +1 -1
  42. package/dist/{chunk-GAYK3WGV.js → chunk-C2VTO5WT.js} +1 -1
  43. package/dist/chunk-CPR2CMOY.js +1 -0
  44. package/dist/{chunk-PD7Y6HIM.js → chunk-CSZPE637.js} +1 -1
  45. package/dist/{chunk-5OA33JH2.js → chunk-D5LLTUTY.js} +1 -1
  46. package/dist/{chunk-3H5ACWWZ.js → chunk-DFVG4DDZ.js} +1 -1
  47. package/dist/{chunk-5XGR3LRI.js → chunk-EHLGPLIU.js} +1 -1
  48. package/dist/{chunk-334J2KIP.js → chunk-FPDH3N3A.js} +1 -1
  49. package/dist/{chunk-D4UHRJAP.js → chunk-FX5J6JCK.js} +1 -1
  50. package/dist/{chunk-DUBOKZMA.js → chunk-GVQKAINC.js} +12 -12
  51. package/dist/{chunk-XESFJN52.js → chunk-IKUFNK46.js} +1 -1
  52. package/dist/{chunk-AXUA7PFV.js → chunk-IXXQMD34.js} +1 -1
  53. package/dist/{chunk-HJLGXFMK.js → chunk-JYMO7QXQ.js} +1 -1
  54. package/dist/{chunk-JRP6WP5C.js → chunk-KDY4X7SQ.js} +1 -1
  55. package/dist/{chunk-L5Q2S5GY.js → chunk-KFTJVVJR.js} +1 -1
  56. package/dist/{chunk-SX6A656X.js → chunk-KY2GOSO5.js} +1 -1
  57. package/dist/chunk-LDBULT2T.js +4 -0
  58. package/dist/{chunk-VQOWB26M.js → chunk-LEOFD3W5.js} +1 -1
  59. package/dist/{chunk-L5CCIIF2.js → chunk-N5HPMATQ.js} +1 -1
  60. package/dist/{chunk-2PACEMNE.js → chunk-OFYY4725.js} +1 -1
  61. package/dist/{chunk-O37UBRMX.js → chunk-P3622IM5.js} +1 -1
  62. package/dist/{chunk-TABXSDTR.js → chunk-PKKSRXUS.js} +1 -1
  63. package/dist/{chunk-ZQH2I5RQ.js → chunk-Q7UGDNSM.js} +1 -1
  64. package/dist/{chunk-HLWDIIWL.js → chunk-QMQBX3RV.js} +1 -1
  65. package/dist/{chunk-TTHO4MFC.js → chunk-RVAOJOXA.js} +1 -1
  66. package/dist/{chunk-H5RJCS5E.js → chunk-SLFOUSRW.js} +1 -1
  67. package/dist/{chunk-7FF5EOIO.js → chunk-TCLKGPXF.js} +1 -1
  68. package/dist/chunk-TMRCPT7S.js +1 -0
  69. package/dist/{chunk-EP4CUWOO.js → chunk-VIN7NJW3.js} +1 -1
  70. package/dist/chunk-W37NOQVG.js +1 -0
  71. package/dist/chunk-W5VKBDSD.js +157 -0
  72. package/dist/{chunk-UOCERSAN.js → chunk-WRZSQDZV.js} +1 -1
  73. package/dist/{chunk-ECLMYTWT.js → chunk-Y4Z6CEII.js} +1 -1
  74. package/dist/{chunk-6UNATTB7.js → chunk-ZGHJIQXL.js} +1 -1
  75. package/dist/{create-SOLLXXAB.js → create-U5PQHOZ4.js} +1 -1
  76. package/dist/{demo-kit-5UQH2OXC.js → demo-kit-RKTHTXHJ.js} +1 -1
  77. package/dist/{doctor-NQ5PUCUP.js → doctor-D7YI7LSA.js} +1 -1
  78. package/dist/{dotnet-webapi-clean-YEHYIGOT.js → dotnet-webapi-clean-XL4IBUQV.js} +1 -1
  79. package/dist/{goal-lifecycle-IPNY7KNR.js → goal-lifecycle-BMS6GSIU.js} +1 -1
  80. package/dist/{goal-pack-2WV3EA4Y.js → goal-pack-RBSVQMMX.js} +1 -1
  81. package/dist/{gofiber-standard-C44IIQYH.js → gofiber-standard-OHHMCNMJ.js} +1 -1
  82. package/dist/{gogin-standard-X7VKACVR.js → gogin-standard-BAZXPOKL.js} +1 -1
  83. package/dist/index.d.ts +14 -2
  84. package/dist/index.js +129 -129
  85. package/dist/live-command-GNAASZ7U.js +15 -0
  86. package/dist/{pipeline-MIMENSI7.js → pipeline-QOMXH2EK.js} +1 -1
  87. package/dist/{project-agent-entry-OWLJ3IHQ.js → project-agent-entry-MH7364BE.js} +1 -1
  88. package/dist/{project-intelligence-lens-I67EO6AE.js → project-intelligence-lens-ZCCHUKVI.js} +1 -1
  89. package/dist/{project-test-coverage-OPDVSFPH.js → project-test-coverage-JPWTBSSJ.js} +1 -1
  90. package/dist/{rust-axum-JKZTZDRZ.js → rust-axum-CCJ6UCBW.js} +1 -1
  91. package/dist/{springboot-standard-PI4FLTAN.js → springboot-standard-M5JQEJML.js} +1 -1
  92. package/dist/{verified-goal-46JWNCDY.js → verified-goal-XUXU2X5H.js} +1 -1
  93. package/dist/{workspace-KO37XHF6.js → workspace-B33BFZZ3.js} +1 -1
  94. package/dist/{workspace-agent-sync-32FIJQBH.js → workspace-agent-sync-T3MJO2MX.js} +1 -1
  95. package/dist/{workspace-archive-6R5DRNZW.js → workspace-archive-NOSGRKRZ.js} +1 -1
  96. package/dist/{workspace-context-JKRPX775.js → workspace-context-KOCEP4MJ.js} +1 -1
  97. package/dist/{workspace-contract-4T3NYNK5.js → workspace-contract-MQ3QE52V.js} +1 -1
  98. package/dist/workspace-explain-DTFCKYXK.js +1 -0
  99. package/dist/workspace-explain-contract-WMREJWHF.js +1 -0
  100. package/dist/{workspace-feedback-6VQ7T4CR.js → workspace-feedback-3YLIUFQ7.js} +1 -1
  101. package/dist/{workspace-foundation-GHWO3BZU.js → workspace-foundation-O7O3QIS4.js} +1 -1
  102. package/dist/{workspace-graph-stream-PTVS47NJ.js → workspace-graph-stream-XTGGBD7D.js} +1 -1
  103. package/dist/workspace-graph-token-efficiency-5LJKQU2J.js +1 -0
  104. package/dist/{workspace-history-M2K4M2JY.js → workspace-history-7HDZZ4G5.js} +1 -1
  105. package/dist/{workspace-intelligence-PJIPTXL3.js → workspace-intelligence-TFEQBPUP.js} +1 -1
  106. package/dist/workspace-intelligence-benchmark-PLVUBGWO.js +1 -0
  107. package/dist/workspace-intelligence-evaluation-OJIQS5SN.js +1 -0
  108. package/dist/{workspace-intelligence-runner-M47QR3JM.js → workspace-intelligence-runner-6ZAV6RO4.js} +1 -1
  109. package/dist/{workspace-intelligence-runtime-registry-FFGQF4A7.js → workspace-intelligence-runtime-registry-UKFB3BI7.js} +1 -1
  110. package/dist/{workspace-knowledge-graph-V2EAYDCL.js → workspace-knowledge-graph-AUXYL3L6.js} +1 -1
  111. package/dist/{workspace-knowledge-graph-contract-VANN7RCA.js → workspace-knowledge-graph-contract-X52KXBXJ.js} +1 -1
  112. package/dist/{workspace-knowledge-graph-query-RASPF7FS.js → workspace-knowledge-graph-query-A7TKONWY.js} +1 -1
  113. package/dist/workspace-knowledge-graph-snapshot-GPBDAKAU.js +1 -0
  114. package/dist/{workspace-mcp-serve-YRORNE4P.js → workspace-mcp-serve-TDUXJUAA.js} +1 -1
  115. package/dist/{workspace-model-VSVKLX7M.js → workspace-model-GVXNLSQM.js} +1 -1
  116. package/dist/{workspace-onboarding-2VMJZVLZ.js → workspace-onboarding-ECZ2KJ2A.js} +1 -1
  117. package/dist/{workspace-readme-6X3GLTBM.js → workspace-readme-6N5Y2ZSJ.js} +1 -1
  118. package/dist/{workspace-registry-summary-QVSJKKTX.js → workspace-registry-summary-5SFBTRGQ.js} +1 -1
  119. package/dist/{workspace-repair-engine-WSKV3Q4V.js → workspace-repair-engine-CKJCTWKX.js} +1 -1
  120. package/dist/workspace-run-ZZ5WHL7W.js +1 -0
  121. package/dist/{workspace-verify-EJCSOBIK.js → workspace-verify-D3QTMAUI.js} +1 -1
  122. package/dist/{workspace-watch-JTIFBF4Z.js → workspace-watch-XYJEW2Z2.js} +1 -1
  123. package/docs/DEVELOPMENT.md +19 -0
  124. package/docs/README.md +19 -16
  125. package/docs/ci-workflows.md +1 -1
  126. package/docs/commands-reference.md +20 -2
  127. package/docs/contracts/ARTIFACT_CATALOG.md +1 -0
  128. package/docs/contracts/README.md +3 -0
  129. package/docs/workspace-intelligence-benchmark.md +82 -0
  130. package/docs/workspace-knowledge-graph.md +1 -0
  131. package/docs/workspace-live-activity.md +29 -5
  132. package/package.json +4 -2
  133. package/dist/analyze-UJQWGNM2.js +0 -1
  134. package/dist/autopilot-release-U6F4M2BQ.js +0 -1
  135. package/dist/capabilities-command-XUKPO25Z.js +0 -1
  136. package/dist/chunk-5TY74LLW.js +0 -2
  137. package/dist/chunk-5U4L6VF2.js +0 -1
  138. package/dist/chunk-C4S22E6S.js +0 -1
  139. package/dist/chunk-H7MRINGP.js +0 -1
  140. package/dist/chunk-JC4XSU7G.js +0 -1
  141. package/dist/chunk-MZ7U4BIQ.js +0 -157
  142. package/dist/chunk-UTV4DTNM.js +0 -1
  143. package/dist/live-command-Q6E45N7S.js +0 -18
  144. package/dist/workspace-explain-MOGL4GEA.js +0 -1
  145. package/dist/workspace-explain-contract-W2E6LF4Q.js +0 -1
  146. package/dist/workspace-graph-token-efficiency-Z5JD5NHI.js +0 -1
  147. package/dist/workspace-intelligence-evaluation-GONCRE6O.js +0 -1
  148. package/dist/workspace-knowledge-graph-snapshot-5YIG6EMG.js +0 -1
  149. package/dist/workspace-run-3BXKTLVL.js +0 -1
@@ -1,2 +1,2 @@
1
- import {l}from'./chunk-HJLGXFMK.js';import {b}from'./chunk-334J2KIP.js';import {a as a$1}from'./chunk-UPIPSSXY.js';import {j as j$1}from'./chunk-PJPS7CNH.js';import {b as b$1}from'./chunk-XESFJN52.js';import {a}from'./chunk-AFIFZTOY.js';import {c}from'./chunk-EWZZUQBR.js';import {h,i,e}from'./chunk-6UNATTB7.js';import Ae from'crypto';import H from'fs';import O from'fs/promises';import m from'path';var pe=h.projectAgentEntry.schemaVersion,M=i.projectAgentEntry,Ee="workspai.agent-bootstrap-receipt.v1",We="<!-- WORKSPAI:AGENT-ENTRY:START -->",Fe="<!-- WORKSPAI:AGENT-ENTRY:END -->",q=["generic","codex","claude","gemini","qwen","kimi","grok","copilot","cursor","windsurf","amazon-q"],qe=["CLAUDE.md","GEMINI.md","QWEN.md",".amazonq/rules/workspai-agent-entry.md"];function ve(t){let s=t?.trim().toLowerCase()||"generic";if(s==="orca")return "grok";if(q.includes(s))return s;throw new Error(`Unsupported agent host "${s}". Expected one of: ${q.join(", ")}.`)}function le(t){let s=t.map(i=>i.id).sort(),n=[...q].sort();if(s.length!==n.length||s.some((i,c)=>i!==n[c]))throw new Error("Project agent entry must define each supported host exactly once.")}function V(t){let{integrity:s,...n}=t;return n}function S(t){return c(t)}function Ve(t){le(t.hosts);let s={schemaVersion:pe,generatedAt:t.context.generatedAt,project:{name:t.context.project.name,relativePath:t.context.project.relativePath,...t.context.project.runtime?{runtime:t.context.project.runtime}:{},...t.context.project.framework?{framework:t.context.project.framework}:{}},workspace:{name:t.context.workspace.name,relationship:t.context.workspace.relationship,localBinding:i.projectWorkspaceLink,identityIsFilesystemPath:false,resolverCommand:"workspai project workspace status --json",portableUriScheme:"workspace:",resolvedPathPolicy:"runtime-private-never-persist"},canonical:{projectContext:i.projectContextAgent,projectGrounding:".workspai/PROJECT-GROUNDING.md",projectKnowledgeGraph:i.projectKnowledgeGraphReference,goalIndex:`workspace:${i.goalIndex}`,workspaceIndex:`workspace:${e.agentIndex}`,workspaceContext:`workspace:${e.agentContext}`,workspaceModel:`workspace:${e.model}`,knowledgeGraph:`workspace:${e.knowledgeGraph}`,workspaceSkillsIndex:`workspace:${e.skillsIndex}`,boundedGraphSearch:"command:workspai workspace graph search <task-query> --scope project:<project> --limit 12 --json"},protocol:{mode:"canonical-first",bootstrapCommand:"workspai agent bootstrap --for-agent generic --strict --json",verifyCommand:"workspai project agent-entry verify --for-agent all --strict --json",requiredReadOrder:[M,"command:workspai agent bootstrap --for-agent generic --strict --json","command:workspai project workspace status --json",i.projectContextAgent,`workspace:${i.goalIndex}`,`workspace:${e.skillsIndex}`,"command:workspai workspace graph search <task-query> --scope project:<project> --limit 12 --json","source:targeted-live-files"],sourcePolicy:{liveSourceAuthority:"exact-implementation",workspaceEvidenceAuthority:"identity-topology-readiness-goals",broadScanBeforeBootstrap:false,sourceMutation:"governed-only",verificationClaims:"cli-evidence-only"},degradedMode:{discloseMissingEvidence:true,allowCompleteArchitectureClaims:false,allowReadOnlySourceInspection:true}},hosts:[...t.hosts].sort((i,c)=>i.id.localeCompare(c.id))},n={...s,integrity:{algorithm:"sha256",projectContextHash:t.context.integrity.payloadHash,payloadHash:S(s),portable:true,absolutePathsEmitted:false}};if(!j(n))throw new Error("Project agent entry rejected a non-portable local path.");return a(n,"contracts/workspace-intelligence/project-agent-entry.v1.json","Project agent entry"),n}function j(t){return typeof t=="string"?!(/^[A-Za-z]:[\\/]/.test(t)||/(?:^|[\s("'`])[A-Za-z]:[\\/]/.test(t)||/(?:^|[\s("'`])file:\/\//i.test(t)||/(?:^|[\s("'`])\\\\[^\\\s]+[\\]/.test(t)||/(?:^|[\s("'`])\/(?:Users|home|private|var|opt|srv|mnt|Volumes|tmp)\//.test(t)):Array.isArray(t)?t.every(j):t&&typeof t=="object"?Object.values(t).every(j):true}async function Pe(t){let s=m.join(t,M),n=JSON.parse(await O.readFile(s,"utf8"));if(a(n,"contracts/workspace-intelligence/project-agent-entry.v1.json","Project agent entry"),n.integrity.payloadHash!==S(V(n)))throw new Error("Project agent entry integrity validation failed.");if(le(n.hosts),!j(n)||n.integrity.absolutePathsEmitted)throw new Error("Project agent entry contains a non-portable local path.");return n}async function Ce(t){let s=m.join(t,i.projectContextAgent),n=JSON.parse(await O.readFile(s,"utf8"));a(n,"contracts/workspace-intelligence/project-context-agent.v1.json","Project context agent");let i$1=V(n),c=Ae.createHash("sha256").update(JSON.stringify(i$1)).digest("hex");if(n.integrity.payloadHash!==c)throw new Error("Project context agent integrity validation failed.");if(!j(n)||n.integrity.absolutePathsEmitted)throw new Error("Project context agent contains a non-portable local path.");return n}function Te(t){return t.includes("blocked")?"blocked":t.includes("degraded")?"degraded":"ready"}async function Be(t){let s=b({startPath:m.resolve(t.startPath??process.cwd()),strict:true,requireProjectMembership:true});if(!s?.projectPath)throw new Error("No canonically bound Workspai project was resolved.");let n=s.projectPath,i$1=s.workspacePath,c$1=await Pe(n),o=await Ce(n);if(c$1.integrity.projectContextHash!==o.integrity.payloadHash||c$1.project.name!==o.project.name||c$1.workspace.name!==o.workspace.name)throw new Error("Project agent entry is not bound to the current project context.");let B=t.forAgent?.trim().toLowerCase()||"generic",U=B==="all",g=U?"all":ve(B),J=g,u=U?c$1.hosts:c$1.hosts.filter(e=>e.id===g),Y=c$1.hosts.find(e=>e.id==="generic");if(u.length===0&&Y&&u.push(Y),u.length===0)throw new Error("Project agent entry does not define generic host coverage.");let A=[],l$1=(e,r,C,h)=>A.push({id:e,status:r,message:C,...h?{artifact:h}:{}});l$1("workspace-binding","passed","Canonical workspace membership is resolved."),l$1("entry-integrity","passed","Project entry manifest integrity is valid.",M),l$1("project-context-integrity","passed","Project context integrity and manifest binding are valid.",i.projectContextAgent);let L=[...new Set(u.flatMap(e=>e.entryFiles))].sort(),de=L.filter(e=>!H.existsSync(m.join(n,e))),w=u.some(e=>e.status==="blocked")||de.length>0?"blocked":u.some(e=>e.status==="degraded")?"degraded":"ready";l$1("host-discovery",w==="ready"?"passed":w==="degraded"?"warning":"failed",w==="ready"?`${g} has discoverable Workspai entry coverage.`:w==="degraded"?u.find(e=>e.reason)?.reason??`${g} entry coverage is degraded.`:`${g} entry coverage is missing required files.`,L[0]);let D=[e.agentIndex,e.agentContext,e.skillsIndex,e.model,e.knowledgeGraph],R=D.filter(e=>!H.existsSync(m.join(i$1,e)));l$1("canonical-evidence",R.length===0?"passed":"failed",R.length===0?"Required canonical workspace evidence is present.":`Required canonical evidence is missing: ${R.join(", ")}.`);let E=[],x=null,y=null;for(let e$1 of D)if(!R.includes(e$1))try{let r=JSON.parse(await O.readFile(m.join(i$1,e$1),"utf8"));b$1(e$1,r,e$1),e$1===e.model&&(x=r),e$1===e.knowledgeGraph&&(y=r);}catch{E.push(e$1);}l$1("canonical-contracts",E.length===0?"passed":"failed",E.length===0?"Canonical workspace evidence satisfies its published schemas.":`Canonical evidence failed contract validation: ${E.join(", ")}.`);let I=i.projectKnowledgeGraphReference,z=m.join(n,I),Z="failed",b$2="The project Knowledge Graph reference is missing.";if(H.existsSync(z)&&y)try{let e=JSON.parse(await O.readFile(z,"utf8"));b$1(I,e,I);let r=j$1(y,o.project.name),{integrity:C,...h}=e,f=y.source;e.project.name===o.project.name&&e.canonical.sourceHash===f?.hash&&e.canonical.projectionHash===c(r)&&e.integrity.payloadHash===c(h)?(Z="passed",b$2="The project reference integrity-binds the exact current projection of canonical workspace evidence."):b$2="The project Knowledge Graph reference is stale or does not match the canonical project projection.";}catch{b$2="The project Knowledge Graph reference failed schema or integrity validation.";}l$1("project-knowledge-graph",Z,b$2,I);let ge=x?.workspace,he=y?.workspace,fe=Array.isArray(y?.entities)?y.entities:[],me=Array.isArray(x?.projects)?x.projects:[],Q=E.length===0&&ge?.name===o.workspace.name&&he?.name===o.workspace.name&&me.some(e=>e.name===o.project.name)&&fe.some(e=>e.projectId===o.project.name);l$1("canonical-project-membership",Q?"passed":"failed",Q?"The project and workspace identities agree across the entry, Model, and Graph.":"The project or workspace identity is missing or inconsistent in canonical evidence.");let X=!o.intelligence.freshness.graphMatchesModel||["missing","stale"].includes(o.intelligence.freshness.model)||["missing","stale"].includes(o.intelligence.freshness.graph)?"failed":o.intelligence.freshness.model==="unknown"||o.intelligence.freshness.graph==="unknown"?"warning":"passed",k=false,G;if(t.validateLiveInputs!==false)try{let e=await a$1(i$1);k=e.status==="hit";let r=e.status==="hit"?"Live project inputs match the persisted Model and Knowledge Graph snapshot.":`Live project inputs require an intelligence refresh (${e.reason}).`;G={id:"live-inputs",status:k?"passed":"failed",message:r};}catch{G={id:"live-inputs",status:"failed",message:"Live project inputs could not be validated against canonical graph evidence."};}else G={id:"live-inputs",status:"warning",message:"Live input validation was skipped; persisted compatibility was checked only."};let K=X==="warning"&&o.intelligence.freshness.model==="unknown"&&o.intelligence.freshness.graph==="fresh"&&o.intelligence.freshness.graphMatchesModel&&k?"passed":X;l$1("persisted-freshness",K,K==="passed"?o.intelligence.freshness.model==="unknown"?"Model and Graph bindings are current; live input validation closes structural freshness while verify-before-use facts remain individually governed.":"Persisted Model and Knowledge Graph bindings are current.":K==="warning"?"Persisted evidence is compatible, but at least one freshness state is unknown.":"Persisted Model or Knowledge Graph evidence is missing, stale, or mismatched."),A.push(G);let d={present:false,appliesToProject:false,status:"none"},_=[],ue=m.join(i$1,i.goalIndex);if(H.existsSync(ue)){let e=null;try{e=await l({workspacePath:i$1,validateBindings:false});}catch{_.push("workspai goal --list --json"),l$1("active-goal","failed","The Goal index is present but invalid.");}if(e?.active&&(d={present:true,appliesToProject:e.active.scope.projects.includes(o.project.name),status:"invalid",id:e.active.id,objective:e.active.objective,lifecycle:e.active.lifecycle,goalPack:`workspace:${e.active.goalPack}`,agentHandoff:`workspace:${e.active.agentHandoff}`}),e)try{let r=await l({workspacePath:i$1,validateBindings:true});r.active&&(d={present:true,appliesToProject:r.active.scope.projects.includes(o.project.name),status:"ready",id:r.active.id,objective:r.active.objective,lifecycle:r.active.lifecycle,goalPack:`workspace:${r.active.goalPack}`,agentHandoff:`workspace:${r.active.agentHandoff}`}),l$1("active-goal","passed",r.active?"The active Goal Pack and agent handoff have valid canonical bindings.":"No active Goal Pack is selected.");}catch(r){let C=r instanceof Error?r.message:String(r),h=d.present&&/\bstale\b|--refresh/i.test(C);if(d.present&&(d.status=h?"stale":"invalid"),h&&d.objective){let f=e.active,re=f?.scope.kind==="project"&&f.scope.projects.length===1?`project:${f.scope.projects[0]}`:f?.scope.kind==="project-set"&&f.scope.projects.length>1?`projects:${f.scope.projects.join(",")}`:"workspace";_.push(`workspai goal ${JSON.stringify(d.objective)} --scope ${re} --for-agent generic --refresh --json`);}else _.push("workspai goal --status --json");l$1("active-goal","failed",h?"The selected Goal Pack is present but stale; regenerate it against current canonical evidence before acting.":d.present?"The selected Goal Pack is present but its canonical binding or handoff is invalid.":"The Goal index could not be validated.");}}else l$1("active-goal","passed","No Goal index is present for this workspace.");let ee=A.some(e=>e.status==="failed")?"blocked":A.some(e=>e.status==="warning")?"degraded":"ready",v=Te([w,ee]),P=o.blockers.some(e=>e.severity==="error")?"blocked":o.blockers.length>0?"degraded":"ready",ye=P==="blocked"?"blocked":P==="degraded"?"degraded":"not-verified",we=`command:workspai agent bootstrap --for-agent ${g} --strict --json`,ke=c$1.protocol.requiredReadOrder.map(e=>e==="command:workspai agent bootstrap --for-agent generic --strict --json"?we:e),te={schemaVersion:Ee,generatedAt:(t.now??new Date).toISOString(),status:v,statusScope:"agent-grounding",readiness:{agentGrounding:v,architectureEvidence:ee,projectEnvironment:P,release:ye},requestedAgent:J,resolvedHost:g,project:{name:o.project.name,relativePath:o.project.relativePath,...o.project.runtime?{runtime:o.project.runtime}:{},...o.project.framework?{framework:o.project.framework}:{}},workspace:{name:o.workspace.name,relationship:o.workspace.relationship,resolved:true,identityIsFilesystemPath:false,resolverCommand:"workspai project workspace status --json",portableUriScheme:"workspace:",resolvedPathPolicy:"runtime-private-never-persist"},entry:{artifact:M,schemaVersion:pe,hostStatus:w,entryFiles:L},canonicalEvidence:{projectContext:i.projectContextAgent,projectKnowledgeGraph:i.projectKnowledgeGraphReference,workspaceIndex:`workspace:${e.agentIndex}`,workspaceContext:`workspace:${e.agentContext}`,workspaceModel:`workspace:${e.model}`,knowledgeGraph:`workspace:${e.knowledgeGraph}`,workspaceSkillsIndex:`workspace:${e.skillsIndex}`,boundedGraphSearch:"command:workspai workspace graph search <task-query> --scope project:<project> --limit 12 --json",modelFreshness:k?"fresh":o.intelligence.freshness.model,graphFreshness:k?"fresh":o.intelligence.freshness.graph,graphMatchesModel:o.intelligence.freshness.graphMatchesModel,liveInputsValidated:k,blockerCount:o.blockers.length},activeGoal:d,requiredReadOrder:ke,claims:{architecture:v==="ready"?"allowed-with-citations":"prohibited",sourceInspection:"bounded-and-targeted",sourceMutation:"governed-cli-transaction-only",verification:"cli-evidence-only"},checks:A,nextActions:v==="ready"?[...d.present&&d.appliesToProject&&d.agentHandoff?[`read:${d.agentHandoff}`]:[],...P==="blocked"?["workspai doctor project --json","workspai workspace explain release-blocked --json"]:P==="degraded"?["workspai doctor project --json"]:[],`workspai workspace graph search <task-query> --scope project:${o.project.name} --limit 12 --json`,"inspect only the returned proof paths and target source files"]:[..._,"workspai workspace intelligence run --for-agent generic --strict --json",`workspai agent bootstrap --for-agent ${g} --strict --json`]},oe=S(V(c$1)),je=S({manifestHash:oe,projectContextHash:o.integrity.payloadHash,requestedAgent:J,status:v,generatedAt:te.generatedAt}),ne={...te,receiptId:je},$={...ne,integrity:{algorithm:"sha256",manifestHash:oe,projectContextHash:o.integrity.payloadHash,payloadHash:S(ne),portable:true,absolutePathsEmitted:false}};if(!j($))throw new Error("Agent bootstrap receipt rejected a non-portable local path.");return a($,"contracts/workspace-intelligence/agent-bootstrap-receipt.v1.json","Agent bootstrap receipt"),$}
1
+ import {l}from'./chunk-JYMO7QXQ.js';import {b}from'./chunk-FPDH3N3A.js';import {a as a$1}from'./chunk-3NF3M3RE.js';import {j as j$1}from'./chunk-2KX6KHEC.js';import {b as b$1}from'./chunk-IKUFNK46.js';import {a}from'./chunk-AFIFZTOY.js';import {c}from'./chunk-EWZZUQBR.js';import {h,i,e}from'./chunk-ZGHJIQXL.js';import Ae from'crypto';import H from'fs';import O from'fs/promises';import m from'path';var pe=h.projectAgentEntry.schemaVersion,M=i.projectAgentEntry,Ee="workspai.agent-bootstrap-receipt.v1",We="<!-- WORKSPAI:AGENT-ENTRY:START -->",Fe="<!-- WORKSPAI:AGENT-ENTRY:END -->",q=["generic","codex","claude","gemini","qwen","kimi","grok","copilot","cursor","windsurf","amazon-q"],qe=["CLAUDE.md","GEMINI.md","QWEN.md",".amazonq/rules/workspai-agent-entry.md"];function ve(t){let s=t?.trim().toLowerCase()||"generic";if(s==="orca")return "grok";if(q.includes(s))return s;throw new Error(`Unsupported agent host "${s}". Expected one of: ${q.join(", ")}.`)}function le(t){let s=t.map(i=>i.id).sort(),n=[...q].sort();if(s.length!==n.length||s.some((i,c)=>i!==n[c]))throw new Error("Project agent entry must define each supported host exactly once.")}function V(t){let{integrity:s,...n}=t;return n}function S(t){return c(t)}function Ve(t){le(t.hosts);let s={schemaVersion:pe,generatedAt:t.context.generatedAt,project:{name:t.context.project.name,relativePath:t.context.project.relativePath,...t.context.project.runtime?{runtime:t.context.project.runtime}:{},...t.context.project.framework?{framework:t.context.project.framework}:{}},workspace:{name:t.context.workspace.name,relationship:t.context.workspace.relationship,localBinding:i.projectWorkspaceLink,identityIsFilesystemPath:false,resolverCommand:"workspai project workspace status --json",portableUriScheme:"workspace:",resolvedPathPolicy:"runtime-private-never-persist"},canonical:{projectContext:i.projectContextAgent,projectGrounding:".workspai/PROJECT-GROUNDING.md",projectKnowledgeGraph:i.projectKnowledgeGraphReference,goalIndex:`workspace:${i.goalIndex}`,workspaceIndex:`workspace:${e.agentIndex}`,workspaceContext:`workspace:${e.agentContext}`,workspaceModel:`workspace:${e.model}`,knowledgeGraph:`workspace:${e.knowledgeGraph}`,workspaceSkillsIndex:`workspace:${e.skillsIndex}`,boundedGraphSearch:"command:workspai workspace graph search <task-query> --scope project:<project> --limit 12 --json"},protocol:{mode:"canonical-first",bootstrapCommand:"workspai agent bootstrap --for-agent generic --strict --json",verifyCommand:"workspai project agent-entry verify --for-agent all --strict --json",requiredReadOrder:[M,"command:workspai agent bootstrap --for-agent generic --strict --json","command:workspai project workspace status --json",i.projectContextAgent,`workspace:${i.goalIndex}`,`workspace:${e.skillsIndex}`,"command:workspai workspace graph search <task-query> --scope project:<project> --limit 12 --json","source:targeted-live-files"],sourcePolicy:{liveSourceAuthority:"exact-implementation",workspaceEvidenceAuthority:"identity-topology-readiness-goals",broadScanBeforeBootstrap:false,sourceMutation:"governed-only",verificationClaims:"cli-evidence-only"},degradedMode:{discloseMissingEvidence:true,allowCompleteArchitectureClaims:false,allowReadOnlySourceInspection:true}},hosts:[...t.hosts].sort((i,c)=>i.id.localeCompare(c.id))},n={...s,integrity:{algorithm:"sha256",projectContextHash:t.context.integrity.payloadHash,payloadHash:S(s),portable:true,absolutePathsEmitted:false}};if(!j(n))throw new Error("Project agent entry rejected a non-portable local path.");return a(n,"contracts/workspace-intelligence/project-agent-entry.v1.json","Project agent entry"),n}function j(t){return typeof t=="string"?!(/^[A-Za-z]:[\\/]/.test(t)||/(?:^|[\s("'`])[A-Za-z]:[\\/]/.test(t)||/(?:^|[\s("'`])file:\/\//i.test(t)||/(?:^|[\s("'`])\\\\[^\\\s]+[\\]/.test(t)||/(?:^|[\s("'`])\/(?:Users|home|private|var|opt|srv|mnt|Volumes|tmp)\//.test(t)):Array.isArray(t)?t.every(j):t&&typeof t=="object"?Object.values(t).every(j):true}async function Pe(t){let s=m.join(t,M),n=JSON.parse(await O.readFile(s,"utf8"));if(a(n,"contracts/workspace-intelligence/project-agent-entry.v1.json","Project agent entry"),n.integrity.payloadHash!==S(V(n)))throw new Error("Project agent entry integrity validation failed.");if(le(n.hosts),!j(n)||n.integrity.absolutePathsEmitted)throw new Error("Project agent entry contains a non-portable local path.");return n}async function Ce(t){let s=m.join(t,i.projectContextAgent),n=JSON.parse(await O.readFile(s,"utf8"));a(n,"contracts/workspace-intelligence/project-context-agent.v1.json","Project context agent");let i$1=V(n),c=Ae.createHash("sha256").update(JSON.stringify(i$1)).digest("hex");if(n.integrity.payloadHash!==c)throw new Error("Project context agent integrity validation failed.");if(!j(n)||n.integrity.absolutePathsEmitted)throw new Error("Project context agent contains a non-portable local path.");return n}function Te(t){return t.includes("blocked")?"blocked":t.includes("degraded")?"degraded":"ready"}async function Be(t){let s=b({startPath:m.resolve(t.startPath??process.cwd()),strict:true,requireProjectMembership:true});if(!s?.projectPath)throw new Error("No canonically bound Workspai project was resolved.");let n=s.projectPath,i$1=s.workspacePath,c$1=await Pe(n),o=await Ce(n);if(c$1.integrity.projectContextHash!==o.integrity.payloadHash||c$1.project.name!==o.project.name||c$1.workspace.name!==o.workspace.name)throw new Error("Project agent entry is not bound to the current project context.");let B=t.forAgent?.trim().toLowerCase()||"generic",U=B==="all",g=U?"all":ve(B),J=g,u=U?c$1.hosts:c$1.hosts.filter(e=>e.id===g),Y=c$1.hosts.find(e=>e.id==="generic");if(u.length===0&&Y&&u.push(Y),u.length===0)throw new Error("Project agent entry does not define generic host coverage.");let A=[],l$1=(e,r,C,h)=>A.push({id:e,status:r,message:C,...h?{artifact:h}:{}});l$1("workspace-binding","passed","Canonical workspace membership is resolved."),l$1("entry-integrity","passed","Project entry manifest integrity is valid.",M),l$1("project-context-integrity","passed","Project context integrity and manifest binding are valid.",i.projectContextAgent);let L=[...new Set(u.flatMap(e=>e.entryFiles))].sort(),de=L.filter(e=>!H.existsSync(m.join(n,e))),w=u.some(e=>e.status==="blocked")||de.length>0?"blocked":u.some(e=>e.status==="degraded")?"degraded":"ready";l$1("host-discovery",w==="ready"?"passed":w==="degraded"?"warning":"failed",w==="ready"?`${g} has discoverable Workspai entry coverage.`:w==="degraded"?u.find(e=>e.reason)?.reason??`${g} entry coverage is degraded.`:`${g} entry coverage is missing required files.`,L[0]);let D=[e.agentIndex,e.agentContext,e.skillsIndex,e.model,e.knowledgeGraph],R=D.filter(e=>!H.existsSync(m.join(i$1,e)));l$1("canonical-evidence",R.length===0?"passed":"failed",R.length===0?"Required canonical workspace evidence is present.":`Required canonical evidence is missing: ${R.join(", ")}.`);let E=[],x=null,y=null;for(let e$1 of D)if(!R.includes(e$1))try{let r=JSON.parse(await O.readFile(m.join(i$1,e$1),"utf8"));b$1(e$1,r,e$1),e$1===e.model&&(x=r),e$1===e.knowledgeGraph&&(y=r);}catch{E.push(e$1);}l$1("canonical-contracts",E.length===0?"passed":"failed",E.length===0?"Canonical workspace evidence satisfies its published schemas.":`Canonical evidence failed contract validation: ${E.join(", ")}.`);let I=i.projectKnowledgeGraphReference,z=m.join(n,I),Z="failed",b$2="The project Knowledge Graph reference is missing.";if(H.existsSync(z)&&y)try{let e=JSON.parse(await O.readFile(z,"utf8"));b$1(I,e,I);let r=j$1(y,o.project.name),{integrity:C,...h}=e,f=y.source;e.project.name===o.project.name&&e.canonical.sourceHash===f?.hash&&e.canonical.projectionHash===c(r)&&e.integrity.payloadHash===c(h)?(Z="passed",b$2="The project reference integrity-binds the exact current projection of canonical workspace evidence."):b$2="The project Knowledge Graph reference is stale or does not match the canonical project projection.";}catch{b$2="The project Knowledge Graph reference failed schema or integrity validation.";}l$1("project-knowledge-graph",Z,b$2,I);let ge=x?.workspace,he=y?.workspace,fe=Array.isArray(y?.entities)?y.entities:[],me=Array.isArray(x?.projects)?x.projects:[],Q=E.length===0&&ge?.name===o.workspace.name&&he?.name===o.workspace.name&&me.some(e=>e.name===o.project.name)&&fe.some(e=>e.projectId===o.project.name);l$1("canonical-project-membership",Q?"passed":"failed",Q?"The project and workspace identities agree across the entry, Model, and Graph.":"The project or workspace identity is missing or inconsistent in canonical evidence.");let X=!o.intelligence.freshness.graphMatchesModel||["missing","stale"].includes(o.intelligence.freshness.model)||["missing","stale"].includes(o.intelligence.freshness.graph)?"failed":o.intelligence.freshness.model==="unknown"||o.intelligence.freshness.graph==="unknown"?"warning":"passed",k=false,G;if(t.validateLiveInputs!==false)try{let e=await a$1(i$1);k=e.status==="hit";let r=e.status==="hit"?"Live project inputs match the persisted Model and Knowledge Graph snapshot.":`Live project inputs require an intelligence refresh (${e.reason}).`;G={id:"live-inputs",status:k?"passed":"failed",message:r};}catch{G={id:"live-inputs",status:"failed",message:"Live project inputs could not be validated against canonical graph evidence."};}else G={id:"live-inputs",status:"warning",message:"Live input validation was skipped; persisted compatibility was checked only."};let K=X==="warning"&&o.intelligence.freshness.model==="unknown"&&o.intelligence.freshness.graph==="fresh"&&o.intelligence.freshness.graphMatchesModel&&k?"passed":X;l$1("persisted-freshness",K,K==="passed"?o.intelligence.freshness.model==="unknown"?"Model and Graph bindings are current; live input validation closes structural freshness while verify-before-use facts remain individually governed.":"Persisted Model and Knowledge Graph bindings are current.":K==="warning"?"Persisted evidence is compatible, but at least one freshness state is unknown.":"Persisted Model or Knowledge Graph evidence is missing, stale, or mismatched."),A.push(G);let d={present:false,appliesToProject:false,status:"none"},_=[],ue=m.join(i$1,i.goalIndex);if(H.existsSync(ue)){let e=null;try{e=await l({workspacePath:i$1,validateBindings:false});}catch{_.push("workspai goal --list --json"),l$1("active-goal","failed","The Goal index is present but invalid.");}if(e?.active&&(d={present:true,appliesToProject:e.active.scope.projects.includes(o.project.name),status:"invalid",id:e.active.id,objective:e.active.objective,lifecycle:e.active.lifecycle,goalPack:`workspace:${e.active.goalPack}`,agentHandoff:`workspace:${e.active.agentHandoff}`}),e)try{let r=await l({workspacePath:i$1,validateBindings:true});r.active&&(d={present:true,appliesToProject:r.active.scope.projects.includes(o.project.name),status:"ready",id:r.active.id,objective:r.active.objective,lifecycle:r.active.lifecycle,goalPack:`workspace:${r.active.goalPack}`,agentHandoff:`workspace:${r.active.agentHandoff}`}),l$1("active-goal","passed",r.active?"The active Goal Pack and agent handoff have valid canonical bindings.":"No active Goal Pack is selected.");}catch(r){let C=r instanceof Error?r.message:String(r),h=d.present&&/\bstale\b|--refresh/i.test(C);if(d.present&&(d.status=h?"stale":"invalid"),h&&d.objective){let f=e.active,re=f?.scope.kind==="project"&&f.scope.projects.length===1?`project:${f.scope.projects[0]}`:f?.scope.kind==="project-set"&&f.scope.projects.length>1?`projects:${f.scope.projects.join(",")}`:"workspace";_.push(`workspai goal ${JSON.stringify(d.objective)} --scope ${re} --for-agent generic --refresh --json`);}else _.push("workspai goal --status --json");l$1("active-goal","failed",h?"The selected Goal Pack is present but stale; regenerate it against current canonical evidence before acting.":d.present?"The selected Goal Pack is present but its canonical binding or handoff is invalid.":"The Goal index could not be validated.");}}else l$1("active-goal","passed","No Goal index is present for this workspace.");let ee=A.some(e=>e.status==="failed")?"blocked":A.some(e=>e.status==="warning")?"degraded":"ready",v=Te([w,ee]),P=o.blockers.some(e=>e.severity==="error")?"blocked":o.blockers.length>0?"degraded":"ready",ye=P==="blocked"?"blocked":P==="degraded"?"degraded":"not-verified",we=`command:workspai agent bootstrap --for-agent ${g} --strict --json`,ke=c$1.protocol.requiredReadOrder.map(e=>e==="command:workspai agent bootstrap --for-agent generic --strict --json"?we:e),te={schemaVersion:Ee,generatedAt:(t.now??new Date).toISOString(),status:v,statusScope:"agent-grounding",readiness:{agentGrounding:v,architectureEvidence:ee,projectEnvironment:P,release:ye},requestedAgent:J,resolvedHost:g,project:{name:o.project.name,relativePath:o.project.relativePath,...o.project.runtime?{runtime:o.project.runtime}:{},...o.project.framework?{framework:o.project.framework}:{}},workspace:{name:o.workspace.name,relationship:o.workspace.relationship,resolved:true,identityIsFilesystemPath:false,resolverCommand:"workspai project workspace status --json",portableUriScheme:"workspace:",resolvedPathPolicy:"runtime-private-never-persist"},entry:{artifact:M,schemaVersion:pe,hostStatus:w,entryFiles:L},canonicalEvidence:{projectContext:i.projectContextAgent,projectKnowledgeGraph:i.projectKnowledgeGraphReference,workspaceIndex:`workspace:${e.agentIndex}`,workspaceContext:`workspace:${e.agentContext}`,workspaceModel:`workspace:${e.model}`,knowledgeGraph:`workspace:${e.knowledgeGraph}`,workspaceSkillsIndex:`workspace:${e.skillsIndex}`,boundedGraphSearch:"command:workspai workspace graph search <task-query> --scope project:<project> --limit 12 --json",modelFreshness:k?"fresh":o.intelligence.freshness.model,graphFreshness:k?"fresh":o.intelligence.freshness.graph,graphMatchesModel:o.intelligence.freshness.graphMatchesModel,liveInputsValidated:k,blockerCount:o.blockers.length},activeGoal:d,requiredReadOrder:ke,claims:{architecture:v==="ready"?"allowed-with-citations":"prohibited",sourceInspection:"bounded-and-targeted",sourceMutation:"governed-cli-transaction-only",verification:"cli-evidence-only"},checks:A,nextActions:v==="ready"?[...d.present&&d.appliesToProject&&d.agentHandoff?[`read:${d.agentHandoff}`]:[],...P==="blocked"?["workspai doctor project --json","workspai workspace explain release-blocked --json"]:P==="degraded"?["workspai doctor project --json"]:[],`workspai workspace graph search <task-query> --scope project:${o.project.name} --limit 12 --json`,"inspect only the returned proof paths and target source files"]:[..._,"workspai workspace intelligence run --for-agent generic --strict --json",`workspai agent bootstrap --for-agent ${g} --strict --json`]},oe=S(V(c$1)),je=S({manifestHash:oe,projectContextHash:o.integrity.payloadHash,requestedAgent:J,status:v,generatedAt:te.generatedAt}),ne={...te,receiptId:je},$={...ne,integrity:{algorithm:"sha256",manifestHash:oe,projectContextHash:o.integrity.payloadHash,payloadHash:S(ne),portable:true,absolutePathsEmitted:false}};if(!j($))throw new Error("Agent bootstrap receipt rejected a non-portable local path.");return a($,"contracts/workspace-intelligence/agent-bootstrap-receipt.v1.json","Agent bootstrap receipt"),$}
2
2
  export{pe as a,M as b,Ee as c,We as d,Fe as e,q as f,qe as g,ve as h,Ve as i,Be as j};
@@ -1 +1 @@
1
- import {i,e}from'./chunk-6UNATTB7.js';var _=".workspai/skills";var a=e.skillsIndex,c=e.explain,P=i.workspaceWhy,O=i.workspaceTrace,I=".workspai/AGENT-GROUNDING.md",A=".rapidkit/AGENT-GROUNDING.md",R=".cursor/rules/workspai-grounding.mdc",E=".cursor/rules/workspai-evidence.mdc",T=".cursor/rules/workspai-diagnose.mdc",L=".cursor/rules/workspai-repair.mdc",S=".cursor/rules/workspai-release.mdc",d=".cursor/rules/rapidkit-grounding.mdc",k=".windsurfrules",C=".windsurf/rules/workspai-grounding.md",u=".windsurf/rules/workspai-evidence.md",N=".grok/rules/workspai-grounding.md",l=".grok/rules/workspai-evidence.md",K=".claude/rules/workspai-evidence.md",m=".claude/rules/workspai-workspace.md",g=".claude/rules/rapidkit-evidence.md",G=".amazonq/rules/workspai-workspace.md",x=".github/instructions/workspai-workspace.instructions.md",w=".github/instructions/rapidkit-workspace.instructions.md",H=".github/instructions/workspai-evidence.instructions.md",D=".github/instructions/rapidkit-evidence.instructions.md",U=".github/prompts/workspai-diagnose.prompt.md",W=".github/prompts/rapidkit-diagnose.prompt.md",h=".github/prompts/workspai-repair.prompt.md",b=".github/prompts/rapidkit-repair.prompt.md",M=".github/prompts/workspai-release-readiness.prompt.md",Y=".github/prompts/rapidkit-release-readiness.prompt.md",f=".github/prompts/workspai-project-onboard.prompt.md",v=".github/prompts/rapidkit-project-onboard.prompt.md",B=".github/prompts/workspai-adopt-project.prompt.md",V=".github/prompts/rapidkit-adopt-project.prompt.md",y=".github/skills/workspai-grounding/SKILL.md",F=".github/skills/rapidkit-grounding/SKILL.md",j=".github/skills/workspai-workspace-intelligence/SKILL.md",J=".github/skills/rapidkit-workspace-intelligence/SKILL.md",X=".cursor/skills/workspai-grounding/SKILL.md",$=".claude/skills/workspai-grounding/SKILL.md",z=".agents/skills/workspai-grounding/SKILL.md",q=".grok/skills/workspai-grounding/SKILL.md",Q=i.workspaiMcpDesign,Z=i.legacyMcpDesign,ss=i.agentHooks,os=".vscode/rapidkit-agent-hooks.json";var n=["workspai-diagnose-api-failure","workspai-release-readiness","workspai-safe-schema-migration","workspai-dependency-upgrade","workspai-rename-contract"];function ts(o){let t=o.trim();if(!t||t.includes("..")||t.includes("/"))throw new Error(`Invalid operational skill id: ${o}`);return `${_}/${t}.md`}function rs(o){return n.includes(o)}var _s={"workspai-diagnose-api-failure":"workspai-diagnose","workspai-release-readiness":"workspai-release-readiness","workspai-safe-schema-migration":"workspai-safe-schema-migration","workspai-dependency-upgrade":"workspai-dependency-upgrade","workspai-rename-contract":"workspai-rename-contract"};export{U as A,W as B,h as C,b as D,M as E,Y as F,f as G,v as H,B as I,V as J,y as K,F as L,j as M,J as N,X as O,$ as P,z as Q,q as R,Q as S,Z as T,ss as U,os as V,ts as W,rs as X,_s as Y,_ as a,a as b,c,P as d,O as e,I as f,A as g,R as h,E as i,T as j,L as k,S as l,d as m,k as n,C as o,u as p,N as q,l as r,K as s,m as t,g as u,G as v,x as w,w as x,H as y,D as z};
1
+ import {i,e}from'./chunk-ZGHJIQXL.js';var _=".workspai/skills";var a=e.skillsIndex,c=e.explain,P=i.workspaceWhy,O=i.workspaceTrace,I=".workspai/AGENT-GROUNDING.md",A=".rapidkit/AGENT-GROUNDING.md",R=".cursor/rules/workspai-grounding.mdc",E=".cursor/rules/workspai-evidence.mdc",T=".cursor/rules/workspai-diagnose.mdc",L=".cursor/rules/workspai-repair.mdc",S=".cursor/rules/workspai-release.mdc",d=".cursor/rules/rapidkit-grounding.mdc",k=".windsurfrules",C=".windsurf/rules/workspai-grounding.md",u=".windsurf/rules/workspai-evidence.md",N=".grok/rules/workspai-grounding.md",l=".grok/rules/workspai-evidence.md",K=".claude/rules/workspai-evidence.md",m=".claude/rules/workspai-workspace.md",g=".claude/rules/rapidkit-evidence.md",G=".amazonq/rules/workspai-workspace.md",x=".github/instructions/workspai-workspace.instructions.md",w=".github/instructions/rapidkit-workspace.instructions.md",H=".github/instructions/workspai-evidence.instructions.md",D=".github/instructions/rapidkit-evidence.instructions.md",U=".github/prompts/workspai-diagnose.prompt.md",W=".github/prompts/rapidkit-diagnose.prompt.md",h=".github/prompts/workspai-repair.prompt.md",b=".github/prompts/rapidkit-repair.prompt.md",M=".github/prompts/workspai-release-readiness.prompt.md",Y=".github/prompts/rapidkit-release-readiness.prompt.md",f=".github/prompts/workspai-project-onboard.prompt.md",v=".github/prompts/rapidkit-project-onboard.prompt.md",B=".github/prompts/workspai-adopt-project.prompt.md",V=".github/prompts/rapidkit-adopt-project.prompt.md",y=".github/skills/workspai-grounding/SKILL.md",F=".github/skills/rapidkit-grounding/SKILL.md",j=".github/skills/workspai-workspace-intelligence/SKILL.md",J=".github/skills/rapidkit-workspace-intelligence/SKILL.md",X=".cursor/skills/workspai-grounding/SKILL.md",$=".claude/skills/workspai-grounding/SKILL.md",z=".agents/skills/workspai-grounding/SKILL.md",q=".grok/skills/workspai-grounding/SKILL.md",Q=i.workspaiMcpDesign,Z=i.legacyMcpDesign,ss=i.agentHooks,os=".vscode/rapidkit-agent-hooks.json";var n=["workspai-diagnose-api-failure","workspai-release-readiness","workspai-safe-schema-migration","workspai-dependency-upgrade","workspai-rename-contract"];function ts(o){let t=o.trim();if(!t||t.includes("..")||t.includes("/"))throw new Error(`Invalid operational skill id: ${o}`);return `${_}/${t}.md`}function rs(o){return n.includes(o)}var _s={"workspai-diagnose-api-failure":"workspai-diagnose","workspai-release-readiness":"workspai-release-readiness","workspai-safe-schema-migration":"workspai-safe-schema-migration","workspai-dependency-upgrade":"workspai-dependency-upgrade","workspai-rename-contract":"workspai-rename-contract"};export{U as A,W as B,h as C,b as D,M as E,Y as F,f as G,v as H,B as I,V as J,y as K,F as L,j as M,J as N,X as O,$ as P,z as Q,q as R,Q as S,Z as T,ss as U,os as V,ts as W,rs as X,_s as Y,_ as a,a as b,c,P as d,O as e,I as f,A as g,R as h,E as i,T as j,L as k,S as l,d as m,k as n,C as o,u as p,N as q,l as r,K as s,m as t,g as u,G as v,x as w,w as x,H as y,D as z};
@@ -1,2 +1,2 @@
1
- import {z as z$1}from'./chunk-L5Q2S5GY.js';import {j,m as m$1}from'./chunk-U5ENEDJA.js';import {a as a$1}from'./chunk-GR6442P7.js';import {a as a$2,d,c as c$1,e as e$1}from'./chunk-GAYK3WGV.js';import {b}from'./chunk-XESFJN52.js';import {l}from'./chunk-OCGZNSOE.js';import {i,e,h,f}from'./chunk-6UNATTB7.js';import {c}from'./chunk-B4IVVTMQ.js';import {a}from'./chunk-XWKGZRHN.js';import {t,u,q}from'./chunk-VQZ5PI5J.js';import*as m from'path';import m__default from'path';import k from'fs-extra';import Ce from'crypto';var ye="unknown-run";function se(e){let t=c();return !t||t===ye?e:{...e,runId:t}}async function ce(e,t){await k.ensureDir(m.dirname(e));let r=`${e}.${process.pid}.${Date.now()}.${Ce.randomUUID()}.tmp`;try{await k.writeJSON(r,t,{spaces:2}),await k.move(r,e,{overwrite:true});}finally{await k.remove(r).catch(()=>{});}}function ie(e){return q(e,"imported-projects.json")}async function I(e){let t$1=(await Promise.all(t(e,"imported-projects.json").map(async r=>await k.pathExists(r)?r:null))).find(r=>typeof r=="string");if(!t$1)return [];try{let r=await k.readJSON(t$1);if(!r||typeof r!="object"||r.version!==1||!Array.isArray(r.projects))throw new Error("expected a version 1 registry with a projects array");let o=r.projects,n=o.filter(i=>{if(!i||typeof i!="object")return false;let c=i;return typeof c.name=="string"&&typeof c.path=="string"&&typeof c.stack=="string"&&typeof c.confidence=="string"&&typeof c.importedAt=="string"});if(n.length!==o.length)throw new Error("one or more project entries are invalid");return n}catch(r){throw new Error(`Imported-project registry is invalid: ${t$1}`,{cause:r})}}async function He(e,t){if(t.length===0)return;let r=ie(e);await a(`${r}.lock`,async()=>{let o=await I(e),n=new Map;for(let c of o)n.set(c.path,c);for(let c of t)n.set(c.path,c);let i=Array.from(n.values()).sort((c,u)=>c.name.localeCompare(u.name)).map(c=>({...c}));await ce(r,{version:1,updatedAt:new Date().toISOString(),projects:i});},{timeoutMs:3e4,staleMs:6e4,purpose:"imported-projects-registry-upsert"});}async function Je(e,t){if(t.length===0)return;let r=ie(e);await a(`${r}.lock`,async()=>{let o=await I(e),n=new Set(t.map(c=>m.resolve(c))),i=o.filter(c=>!n.has(m.resolve(c.path)));await ce(r,{version:1,updatedAt:new Date().toISOString(),projects:i});},{timeoutMs:3e4,staleMs:6e4,purpose:"imported-projects-registry-remove"});}var ze="workspace-dependency-graph.v1",pe=["code-import","package-dep","event-pub-sub","service-dependsOn","shared-resource"],de=["inferred","contract","manual"];var v=i.workspaceContract,Ee=e.contractVerify,_=h.workspaceContract.schemaVersion,ve=f.contractVerify,N=class extends Error{constructor(r){super(`Workspace contract verification failed: ${r.violations.join("; ")}`);this.verification=r;this.name="WorkspaceContractVerificationError";}verification};function fe(e){return e.replace(/\\/g,"/")}function z(e){let t=fe(e).trim();return !t||t.startsWith("/")||t.startsWith("~")||/^[a-zA-Z]:\//.test(t)||t.includes("\0")?false:!t.split("/").filter(Boolean).some(r=>r===".."||r===".")}function le(e,t){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,80)||t}function je(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function ue(e){let r=(Array.isArray(e.ports)?e.ports:[]).map(i=>{if(!i||typeof i!="object"||Array.isArray(i))return null;let c=i,u=Number(c.port);if(!Number.isInteger(u)||u<1||u>65535)return null;let g=c.protocol==="https"||c.protocol==="grpc"||c.protocol==="tcp"||c.protocol==="udp"?c.protocol:"http";return {name:typeof c.name=="string"&&c.name.trim()?c.name:"http",port:u,protocol:g}}).filter(i=>i!==null);if(r.length>0)return r;let o=e.frontend&&typeof e.frontend=="object"&&!Array.isArray(e.frontend)?e.frontend:void 0,n=Number(e.port??o?.default_port);return Number.isInteger(n)&&n>=1&&n<=65535?[{name:"http",port:n,protocol:"http"}]:[]}async function be(e){let t=m__default.join(e,"Dockerfile");if(!await k.pathExists(t))return [];try{let r=await k.readFile(t,"utf8"),o=new Map;for(let n of r.matchAll(/^\s*EXPOSE\s+(.+)$/gim))for(let i of n[1].split(/\s+/)){let c=i.match(/^(\d{1,5})(?:\/(tcp|udp))?$/i),u=Number(c?.[1]);if(!c||!Number.isInteger(u)||u<1||u>65535)continue;let g=c[2]?.toLowerCase();o.set(u,{name:"http",port:u,protocol:g==="udp"?"udp":"http"});}return [...o.values()].sort((n,i)=>n.port-i.port)}catch{return []}}async function D(e){for(let t of e)if(await k.pathExists(t))return t;return null}async function We(e){for(let t$1 of t(e,"workspace.json"))try{let r=await k.readJson(t$1);return {name:typeof r.workspace_name=="string"&&r.workspace_name.trim()||typeof r.name=="string"&&r.name.trim()||m__default.basename(e),profile:typeof r.profile=="string"?r.profile:void 0}}catch{}return {name:m__default.basename(e)}}async function Se(e){let t=[],r=[e],o=new Set,n=new Set([".git",".workspai",".rapidkit","node_modules",".venv","venv","dist","build","target",".next",".turbo",".cache"]);for(;r.length>0;){let i=r.shift();if(!i||o.has(i))continue;o.add(i);let c=await D(u(i,"project.json")),u$1=await D(u(i,"context.json"));if(c||u$1){t.push(c??u$1??"");continue}let g;try{g=await k.readdir(i,{withFileTypes:true});}catch{continue}for(let d of g)!d.isDirectory()||n.has(d.name)||a$1(d.name)||r.push(m__default.join(i,d.name));}return t.sort()}function Ae(e){let t=(e||"").toLowerCase();if(t.includes("fastapi"))return "fastapi";if(t.includes("nestjs"))return "nestjs";if(t.includes("springboot"))return "springboot";if(t.includes("gofiber"))return "fiber";if(t.includes("gogin"))return "gin"}function Re(e,t){let r=(e||"").toLowerCase(),o=(t||"").toLowerCase();return r.includes("vscode-extension")?null:r.includes("fastapi")?8e3:r.includes("nestjs")?3e3:r.includes("springboot")?8080:r.includes("gofiber")?3e3:r.includes("gogin")?8080:r.startsWith("adopted.")?null:o==="node"?3e3:o==="python"?8e3:o==="java"||o==="go"?8080:null}function U(e,t){let r=e;for(;t.has(r)&&r<65535;)r+=1;return r}function B(e,t,r){let o=e!==void 0&&e.source===void 0,n=Re(t.kit,t.runtime),i=e?.ports||[],c=t.ports||[],u=(t.kit||"").toLowerCase().includes("vscode-extension"),g=t.source==="adopted-local"&&e?.source!==void 0,d=t.source!==void 0&&e?.source!==void 0,p=(u&&c.length===0?[]:g?c.length>0?c:n?[{name:"http",port:U(n,r),protocol:"http"}]:[]:i.length>0?i:c.length>0?c:n?[{name:"http",port:U(n,r),protocol:"http"}]:[]).map(w=>({...w,port:U(w.port,r)}));for(let w of p)r.add(w.port);let f={...t,...e,slug:e?.slug||t.slug,relativePath:o&&e?.relativePath&&z(e.relativePath)?e.relativePath:t.relativePath,source:o&&e?.source||t.source,relationship:o&&e?.relationship||t.relationship,externalPath:o&&e?.externalPath||t.externalPath,runtime:d?t.runtime:e?.runtime||t.runtime,framework:d?t.framework:e?.framework||t.framework,kit:d?t.kit:e?.kit||t.kit,modules:e?.modules?.length?e.modules:t.modules,ports:p,contracts:{owns:e?.contracts?.owns||[],apis:e?.contracts?.apis||[],publishes:e?.contracts?.publishes||[],consumes:e?.contracts?.consumes||[],dependsOn:e?.contracts?.dependsOn||[],env:e?.contracts?.env||[]}},h=JSON.stringify(e||null)!==JSON.stringify(f);return {project:f,changed:h}}async function he(e){let t=m__default.resolve(e.workspacePath),r=await We(t),o=await Se(t),n=await I(t),i=new Map(n.map(s=>[m__default.resolve(s.path),s])),c=[];for(let s of n){let p=m__default.resolve(s.path),f=await D(u(p,"project.json"))??await D(u(p,"context.json"));!f||o.some(h=>m__default.resolve(h)===m__default.resolve(f))||c.push({projectJsonPath:f,registryEntry:s});}let u$1=[],g=[...o.map(s=>({projectJsonPath:s,registryEntry:i.get(m__default.resolve(m__default.dirname(m__default.dirname(s))))})),...c];for(let{projectJsonPath:s,registryEntry:p}of g){let f=m__default.dirname(m__default.dirname(s)),h=fe(m__default.relative(t,f)),w=p!==void 0&&!z(h),C=le(p?.name||m__default.basename(f),m__default.basename(f)),b=w?`external/${C}`:h||C,P=await k.readJson(s),a=typeof P.kit_name=="string"&&P.kit_name||typeof P.kit=="string"&&P.kit||void 0,E=j(P)?m$1(f,P):void 0,j$1=E!==void 0&&E.key!=="unknown",T=j$1?E.runtime:typeof P.runtime=="string"?P.runtime:void 0,y=j$1?E.key:typeof P.framework=="string"&&P.framework||Ae(a),$=p?.relationship==="adopted"?"adopted":"imported",K=j$1?`${$}.${E.key}`:a;u$1.push({slug:p?.name||b||m__default.basename(f),relativePath:b,source:p?.source??"workspace",relationship:p?.relationship,externalPath:w?f:void 0,runtime:T,framework:y,kit:K,modules:je(P.modules),ports:ue(P).length>0?ue(P):await be(f),contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]}});}let d=new Map;for(let s of u$1){let p=le(s.slug,s.relativePath),f=d.get(p);(!f||f.source!=="workspace"&&s.source==="workspace")&&d.set(p,s);}return {schemaVersion:_,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:r,projects:[...d.values()]}}async function dt(e){let t=m__default.resolve(e.outputPath||a$2(e.workspacePath,v));if(await k.pathExists(t)&&e.force!==true)throw new Error(`Workspace contract already exists: ${t}. Use --force to overwrite.`);let r=await he({workspacePath:e.workspacePath,now:e.now}),o=new Set,n={...r,projects:r.projects.map(c=>B(void 0,c,o).project)},i=await Pe({workspacePath:e.workspacePath,contractPath:t,contract:n});if(e.strict&&i.status==="failed")throw new N(i);return await ke({workspacePath:e.workspacePath,contractPath:t,contract:n,now:e.now}),{contractPath:t,contract:n}}async function lt(e){let t=m__default.resolve(e.workspacePath),r=a$2(t,v),o=await d(t,v)??r,n=await he({workspacePath:t,now:e.now}),i=await k.pathExists(o)?await k.readJson(o):null,c=new Map((i?.projects||[]).map(h=>[h.slug,h])),u=new Set,g=[],d$1=[],s=[];for(let h of n.projects){let w=c.get(h.slug),C=B(w,h,u);w?C.changed&&d$1.push(h.slug):g.push(h.slug),s.push(C.project),c.delete(h.slug);}for(let h of c.values()){if(h.source)continue;let w=B(h,h,u);s.push(w.project);}let p={schemaVersion:_,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:{...i?.workspace||{},...n.workspace,name:n.workspace.name||i?.workspace?.name||m__default.basename(t)},projects:s.sort((h,w)=>h.slug.localeCompare(w.slug))},f=await Pe({workspacePath:t,contractPath:r,contract:p});if(e.strict&&f.status==="failed")throw new N(f);return await ke({workspacePath:t,contractPath:r,contract:p,now:e.now}),{contractPath:r,contract:p,addedProjects:g,updatedProjects:d$1,verification:f}}async function me(e){return await k.pathExists(e)?{exists:true,contents:await k.readFile(e)}:{exists:false}}async function ge(e,t){if(!t.exists){await k.remove(e);return}await k.outputFile(e,t.contents);}async function ke(e){let{buildWorkspaceRegistrySummary:t,WORKSPACE_REGISTRY_SUMMARY_RELATIVE_PATH:r}=await import('./workspace-registry-summary-QVSJKKTX.js'),o=await t(e.workspacePath,{now:e.now,contract:e.contract}),n=a$2(e.workspacePath,r),i=c=>{if(!c||typeof c!="object"||Array.isArray(c))return JSON.stringify(c);let{generatedAt:u,...g}=c;return JSON.stringify(g)};if(await k.pathExists(e.contractPath)&&await k.pathExists(n)){let[c,u]=await Promise.all([k.readJson(e.contractPath),k.readJson(n)]);if(i(c)===i(e.contract)&&i(u)===i(o))return}b(v,e.contract),b(r,o),await c$1(e.workspacePath,v,async()=>{let[c,u]=await Promise.all([me(e.contractPath),me(n)]);try{if(e.contractPath===a$2(e.workspacePath,v)?await e$1(e.workspacePath,v,e.contract):(await k.ensureDir(m__default.dirname(e.contractPath)),await k.writeJson(e.contractPath,e.contract,{spaces:2})),process.env.WORKSPAI_TEST_FAIL_WORKSPACE_REGISTRY_PUBLISH==="1")throw new Error("Injected workspace registry summary publication failure.");await e$1(e.workspacePath,r,o);}catch(g){let s=(await Promise.allSettled([ge(e.contractPath,c),ge(n,u)])).filter(p=>p.status==="rejected");throw s.length>0?new AggregateError([g,...s.map(p=>p.reason)],"Workspace contract publication failed and rollback was incomplete."):g}});}async function we(e){let t=e.contractPath??(await d(e.workspacePath,v)||a$2(e.workspacePath,v)),r=await k.readJson(t);return {contractPath:t,contract:r}}var xe={metadata:[".workspai/project.json",".workspai/context.json",".rapidkit/project.json",".rapidkit/context.json"],manifests:["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","pyproject.toml","poetry.lock","requirements.txt","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","Gemfile","composer.json"],entrypoints:["src/main.ts","src/index.ts","src/app.ts","src/main.js","src/index.js","main.py","app/main.py","manage.py","main.go","cmd/main.go","Program.cs"],apiSpecifications:["openapi.yaml","openapi.yml","openapi.json","swagger.yaml","swagger.yml","swagger.json"],infrastructure:["Dockerfile","docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml","k8s","kubernetes","terraform"],documentation:["README.md","ARCHITECTURE.md","CONTRIBUTING.md","docs"]};function _e(e,t){return t.externalPath?m__default.resolve(t.externalPath):m__default.resolve(e,t.relativePath)}async function Ge(e){let t={metadata:[],manifests:[],entrypoints:[],apiSpecifications:[],infrastructure:[],documentation:[]};for(let[r,o]of Object.entries(xe))for(let n of o)await k.pathExists(m__default.join(e,n))&&t[r].push(n);try{let r=await k.readdir(e,{withFileTypes:true});for(let o of r)o.isFile()&&(o.name.endsWith(".csproj")||o.name.endsWith(".sln"))&&t.manifests.push(o.name),o.isFile()&&o.name.endsWith(".tf")&&t.infrastructure.push(o.name);}catch{}for(let r of Object.values(t))r.sort((o,n)=>o.localeCompare(n));return t}function x(e){return !e||typeof e!="object"||Array.isArray(e)?[]:Object.keys(e).sort((t,r)=>t.localeCompare(r))}async function Oe(e){try{let t=await k.readJson(m__default.join(e,"package.json")),r={runtime:x(t.dependencies),development:x(t.devDependencies),peer:x(t.peerDependencies),optional:x(t.optionalDependencies)};return {...typeof t.name=="string"?{name:t.name}:{},...typeof t.version=="string"?{version:t.version}:{},...typeof t.private=="boolean"?{private:t.private}:{},scripts:x(t.scripts),dependencies:r,dependencyCount:new Set(Object.values(r).flat()).size}}catch{return}}async function Ie(e){for(let t of [".env.example",".env.sample",".env.template"])try{return (await k.readFile(m__default.join(e,t),"utf8")).split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#")&&o.includes("=")).map(o=>o.slice(0,o.indexOf("=")).trim()).filter(o=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(o)).sort((o,n)=>o.localeCompare(n))}catch{}return []}function Ne(e,t){try{let r=z$1(e);if(r.engine!=="unknown")return r;let o=k.pathExistsSync(m__default.join(e,"package.json"))?"npm":k.pathExistsSync(m__default.join(e,"pyproject.toml"))?"python":k.pathExistsSync(m__default.join(e,"requirements.txt"))?"pip":"unknown";return {...r,engine:o,runtime:t.runtime??r.runtime,framework:t.framework??r.framework,frameworkDisplayName:t.framework??r.frameworkDisplayName}}catch{return {schemaVersion:1,scope:"project",projectRoot:null,engine:"unknown",runtime:"unknown",runtimeCandidates:["unknown"],compositeRuntime:false,lifecycleCoverage:"complete",framework:"unknown",frameworkDisplayName:"Unknown",frameworkConfidence:"low",frameworkSupportTier:"observed",runtimeSupportTier:"observed",runtimeDoctorSupport:"observed",moduleSupport:false,fleetStages:[],localOnlyCommands:[],commandMap:{},supportedCommands:[],unsupportedCommands:[],globalCommands:[]}}}function De(e,t,r){let o=e.projects.map(n=>({id:n.slug,path:n.relativePath,runtime:n.runtime,framework:n.framework}));return {schemaVersion:"workspace-dependency-graph.v1",generatedAt:t,nodes:o,edges:[],stats:{nodeCount:o.length,edgeCount:0,inferredEdges:0,contractEdges:0,manualEdges:0,authoritativeEdges:0,lowConfidenceEdges:0,orphanCount:o.length,connectedNodeCount:0,density:0,edgeCoverageRatio:o.length===0?1:0,evidenceCoverageRatio:1,hotspotCount:0,hasCycle:false},diagnostics:[{code:"graph.enrichment.failed",severity:"warning",message:r,recommendation:"Review project manifests and graph overrides, then rerun workspace contract graph."}]}}async function ut(e$1){let{contractPath:t,contract:r}=await we(e$1),o=e$1.now??new Date,n=o.toISOString(),{buildWorkspaceModel:i,workspaceModelProjectTopology:c}=await import('./workspace-model-VSVKLX7M.js'),{hashWorkspaceModel:u}=await import('./workspace-model-hash-ZXYPIGCW.js'),g=await i({workspacePath:e$1.workspacePath,includeEvidence:false,now:o}),d=c(g)??De(r,n,"The canonical Workspace Model did not provide a project dependency topology."),s=new Map(d.nodes.map(a=>[a.id,a.operationalProfile])),{buildWorkspaceKnowledgeGraph:p}=await import('./workspace-knowledge-graph-V2EAYDCL.js'),f=await p({workspacePath:e$1.workspacePath,workspace:{name:g.workspace.name,...g.workspace.profile?{profile:g.workspace.profile}:{}},contract:r,projectTopology:d,now:o,projects:g.projects.map(a=>({id:a.name,path:a.path,...a.absolutePath?{absolutePath:a.absolutePath}:{},runtime:a.runtime,runtimeCandidates:a.runtimeCandidates,framework:a.framework,...a.kit?{kit:a.kit}:{}})),source:{kind:"workspace-model",artifact:e.model,hashAlgorithm:"sha256",hash:u(g)}}),h=await Promise.all(r.projects.map(async a=>{let l=_e(e$1.workspacePath,a),[E,j,T]=await Promise.all([Ge(l),Oe(l),Ie(l)]),y=Ne(l,a);return {id:a.slug,label:a.slug,relativePath:a.relativePath,source:a.source,relationship:a.relationship,externalPath:a.externalPath,runtime:a.runtime??y.runtime,framework:a.framework??y.framework,kit:a.kit,modules:a.modules,ports:a.ports,apis:a.contracts.apis,owns:a.contracts.owns,env:[...new Set([...a.contracts.env,...T])].sort(($,K)=>$.localeCompare(K)),contracts:{owns:[...a.contracts.owns],apis:[...a.contracts.apis],publishes:[...a.contracts.publishes],consumes:[...a.contracts.consumes],dependsOn:[...a.contracts.dependsOn],env:[...a.contracts.env]},capabilities:{engine:y.engine,supportTier:y.frameworkSupportTier,runtimeSupportTier:y.runtimeSupportTier,doctorSupport:y.runtimeDoctorSupport,moduleSupport:y.moduleSupport,fleetStages:[...y.fleetStages],localOnlyCommands:[...y.localOnlyCommands],supportedCommands:[...y.supportedCommands]},files:E,...j?{package:j}:{},...s.get(a.slug)?{operationalProfile:s.get(a.slug)}:{}}})),w=new Set(h.map(a=>a.id)),C=new Map,b=[];for(let a of r.projects){for(let l of a.contracts.dependsOn||[])w.has(l)&&b.push({from:l,to:a.slug,type:"dependency",label:"dependsOn"});for(let l of a.contracts.publishes||[])C.has(l)||C.set(l,new Set),C.get(l)?.add(a.slug);}for(let a of r.projects)for(let l of a.contracts.consumes||[]){let E=C.get(l);if(E)for(let j of E)j!==a.slug&&b.push({from:j,to:a.slug,type:"event",label:l});}let P={schemaVersion:1,kind:"rapidkit.workspace.contract.graph",workspace:r.workspace,generatedAt:n,nodes:h.sort((a,l)=>a.id.localeCompare(l.id)),edges:b.sort((a,l)=>`${a.from}:${a.to}:${a.type}:${a.label}`.localeCompare(`${l.from}:${l.to}:${l.type}:${l.label}`)),dependencyGraph:d,knowledgeGraph:f,semantics:{legacyEdges:"producer-to-consumer",dependencyGraphEdges:"consumer-to-dependency"},summary:{projectCount:h.length,dependencyEdges:b.filter(a=>a.type==="dependency").length,eventEdges:b.filter(a=>a.type==="event").length,portCount:h.reduce((a,l)=>a+l.ports.length,0),apiCount:h.reduce((a,l)=>a+l.apis.length,0),relationshipEdges:d.stats.edgeCount,inferredEdges:d.stats.inferredEdges,authoritativeEdges:d.stats.authoritativeEdges,orphanProjects:d.stats.orphanCount,hotspotProjects:d.stats.hotspotCount,evidenceCoverageRatio:d.stats.evidenceCoverageRatio,edgeCoverageRatio:d.stats.edgeCoverageRatio,connectedProjects:d.stats.connectedNodeCount,lowConfidenceEdges:d.stats.lowConfidenceEdges,hasCycle:d.stats.hasCycle,manifestCount:h.reduce((a,l)=>a+l.files.manifests.length,0),entrypointCount:h.reduce((a,l)=>a+l.files.entrypoints.length,0),diagnostics:d.diagnostics?.length??0,relationshipKinds:Object.fromEntries(pe.map(a=>[a,d.edges.filter(l=>l.kind===a).length])),relationshipSources:Object.fromEntries(de.map(a=>[a,d.edges.filter(l=>l.source===a).length])),entityCount:f.quality.entityCount,knowledgeRelations:f.quality.relationCount,proofCount:f.quality.proofCount,providerCount:f.providers.length,knowledgeUnknowns:f.quality.unknownCount}};return {contractPath:t,graph:P}}async function Pe(e){let t=e.contract?{contractPath:e.contractPath??a$2(e.workspacePath,v),contract:e.contract}:await we(e),{contractPath:r,contract:o}=t,n=[],i=[];o.kind!=="rapidkit.workspace.contract"&&n.push("Contract kind must be rapidkit.workspace.contract."),o.schemaVersion!==_&&n.push(`Contract schemaVersion must be ${_}.`),o.workspace?.name||n.push("Contract workspace.name is required."),Array.isArray(o.projects)||n.push("Contract projects must be an array.");let c=new Set,u=new Map;for(let s of o.projects||[]){if(!s.slug){n.push("Every project must declare slug.");continue}c.has(s.slug)&&n.push(`Duplicate project slug: ${s.slug}.`),c.add(s.slug),s.relativePath?z(s.relativePath)||n.push(`Project ${s.slug} declares unsafe relativePath: ${s.relativePath}.`):n.push(`Project ${s.slug} must declare relativePath.`),s.externalPath&&(s.relationship==="adopted"||s.source==="adopted-local"||s.source==="local-folder"||s.source==="git-url"||n.push(`Project ${s.slug} declares externalPath without imported/adopted provenance.`),m__default.isAbsolute(s.externalPath)||n.push(`Project ${s.slug} declares non-absolute externalPath.`));for(let p of s.ports||[]){(!Number.isInteger(p.port)||p.port<1||p.port>65535)&&n.push(`Project ${s.slug} declares invalid port: ${p.port}.`);let f=u.get(p.port);f&&n.push(`Port ${p.port} is claimed by both ${f} and ${s.slug}.`),u.set(p.port,s.slug);}for(let p of s.contracts?.apis||[])(!p.name?.trim()||!p.basePath?.startsWith("/"))&&n.push(`Project ${s.slug} declares invalid API contract.`);for(let p of [...s.contracts?.publishes||[],...s.contracts?.consumes||[]])p.trim()||n.push(`Project ${s.slug} declares an empty event contract.`);for(let p of s.contracts?.env||[])/^[A-Z_][A-Z0-9_]*$/.test(p)||n.push(`Project ${s.slug} declares invalid env contract: ${p}.`);for(let p of s.contracts?.dependsOn||[])c.has(p);}for(let s of o.projects||[])for(let p of s.contracts?.dependsOn||[])c.has(p)||n.push(`Project ${s.slug} depends on unknown project: ${p}.`);i.push({id:"schema",status:o.kind==="rapidkit.workspace.contract"&&o.schemaVersion===_?"passed":"failed",message:"Contract schema and kind are valid."}),i.push({id:"projects",status:Array.isArray(o.projects)?"passed":"failed",message:`Contract declares ${Array.isArray(o.projects)?o.projects.length:0} project(s).`}),i.push({id:"ports",status:n.some(s=>s.toLowerCase().includes("port"))?"failed":"passed",message:"Project port declarations are valid and collision-free."}),i.push({id:"dependencies",status:n.some(s=>s.includes("depends on unknown project"))?"failed":"passed",message:"Project dependencies point to known project slugs."}),i.push({id:"contracts",status:n.some(s=>s.includes("unsafe relativePath")||s.includes("invalid API contract")||s.includes("event contract")||s.includes("env contract"))?"failed":"passed",message:"Project path, API, event, and env contracts are valid."});let g=await l(e.workspacePath);if(g.moduleCount>0){for(let s of g.issues)n.push(`${m__default.basename(s.projectRoot)}: ${s.message} (slug=${s.slug})`);i.push({id:"module-paths",status:g.status,message:g.status==="passed"?`All ${g.moduleCount} registered module(s) resolve under canonical paths.`:`${g.issues.length} registered module(s) missing canonical install paths.`});}else e.strict&&i.push({id:"module-paths",status:"passed",message:"No registry-backed modules declared in workspace projects."});return {status:n.length>0?"failed":"passed",contractPath:r,projectCount:Array.isArray(o.projects)?o.projects.length:0,checks:i,violations:n}}async function mt(e){let t=m__default.resolve(e.workspacePath),r={schemaVersion:ve,generatedAt:e.generatedAt??new Date().toISOString(),status:e.result.status,contractPath:e.result.contractPath,projectCount:e.result.projectCount,checks:e.result.checks,violations:e.result.violations};return e$1(t,Ee,se(r))}
1
+ import {z as z$1}from'./chunk-KFTJVVJR.js';import {j,m as m$1}from'./chunk-U5ENEDJA.js';import {a as a$1}from'./chunk-GR6442P7.js';import {a as a$2,d,c as c$1,e as e$1}from'./chunk-C2VTO5WT.js';import {b}from'./chunk-IKUFNK46.js';import {l}from'./chunk-OCGZNSOE.js';import {i,e,h,f}from'./chunk-ZGHJIQXL.js';import {c}from'./chunk-64XWHDZ3.js';import {a}from'./chunk-XWKGZRHN.js';import {t,u,q}from'./chunk-VQZ5PI5J.js';import*as m from'path';import m__default from'path';import k from'fs-extra';import Ce from'crypto';var ye="unknown-run";function se(e){let t=c();return !t||t===ye?e:{...e,runId:t}}async function ce(e,t){await k.ensureDir(m.dirname(e));let r=`${e}.${process.pid}.${Date.now()}.${Ce.randomUUID()}.tmp`;try{await k.writeJSON(r,t,{spaces:2}),await k.move(r,e,{overwrite:true});}finally{await k.remove(r).catch(()=>{});}}function ie(e){return q(e,"imported-projects.json")}async function I(e){let t$1=(await Promise.all(t(e,"imported-projects.json").map(async r=>await k.pathExists(r)?r:null))).find(r=>typeof r=="string");if(!t$1)return [];try{let r=await k.readJSON(t$1);if(!r||typeof r!="object"||r.version!==1||!Array.isArray(r.projects))throw new Error("expected a version 1 registry with a projects array");let o=r.projects,n=o.filter(i=>{if(!i||typeof i!="object")return false;let c=i;return typeof c.name=="string"&&typeof c.path=="string"&&typeof c.stack=="string"&&typeof c.confidence=="string"&&typeof c.importedAt=="string"});if(n.length!==o.length)throw new Error("one or more project entries are invalid");return n}catch(r){throw new Error(`Imported-project registry is invalid: ${t$1}`,{cause:r})}}async function He(e,t){if(t.length===0)return;let r=ie(e);await a(`${r}.lock`,async()=>{let o=await I(e),n=new Map;for(let c of o)n.set(c.path,c);for(let c of t)n.set(c.path,c);let i=Array.from(n.values()).sort((c,u)=>c.name.localeCompare(u.name)).map(c=>({...c}));await ce(r,{version:1,updatedAt:new Date().toISOString(),projects:i});},{timeoutMs:3e4,staleMs:6e4,purpose:"imported-projects-registry-upsert"});}async function Je(e,t){if(t.length===0)return;let r=ie(e);await a(`${r}.lock`,async()=>{let o=await I(e),n=new Set(t.map(c=>m.resolve(c))),i=o.filter(c=>!n.has(m.resolve(c.path)));await ce(r,{version:1,updatedAt:new Date().toISOString(),projects:i});},{timeoutMs:3e4,staleMs:6e4,purpose:"imported-projects-registry-remove"});}var ze="workspace-dependency-graph.v1",pe=["code-import","package-dep","event-pub-sub","service-dependsOn","shared-resource"],de=["inferred","contract","manual"];var v=i.workspaceContract,Ee=e.contractVerify,_=h.workspaceContract.schemaVersion,ve=f.contractVerify,N=class extends Error{constructor(r){super(`Workspace contract verification failed: ${r.violations.join("; ")}`);this.verification=r;this.name="WorkspaceContractVerificationError";}verification};function fe(e){return e.replace(/\\/g,"/")}function z(e){let t=fe(e).trim();return !t||t.startsWith("/")||t.startsWith("~")||/^[a-zA-Z]:\//.test(t)||t.includes("\0")?false:!t.split("/").filter(Boolean).some(r=>r===".."||r===".")}function le(e,t){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,80)||t}function je(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function ue(e){let r=(Array.isArray(e.ports)?e.ports:[]).map(i=>{if(!i||typeof i!="object"||Array.isArray(i))return null;let c=i,u=Number(c.port);if(!Number.isInteger(u)||u<1||u>65535)return null;let g=c.protocol==="https"||c.protocol==="grpc"||c.protocol==="tcp"||c.protocol==="udp"?c.protocol:"http";return {name:typeof c.name=="string"&&c.name.trim()?c.name:"http",port:u,protocol:g}}).filter(i=>i!==null);if(r.length>0)return r;let o=e.frontend&&typeof e.frontend=="object"&&!Array.isArray(e.frontend)?e.frontend:void 0,n=Number(e.port??o?.default_port);return Number.isInteger(n)&&n>=1&&n<=65535?[{name:"http",port:n,protocol:"http"}]:[]}async function be(e){let t=m__default.join(e,"Dockerfile");if(!await k.pathExists(t))return [];try{let r=await k.readFile(t,"utf8"),o=new Map;for(let n of r.matchAll(/^\s*EXPOSE\s+(.+)$/gim))for(let i of n[1].split(/\s+/)){let c=i.match(/^(\d{1,5})(?:\/(tcp|udp))?$/i),u=Number(c?.[1]);if(!c||!Number.isInteger(u)||u<1||u>65535)continue;let g=c[2]?.toLowerCase();o.set(u,{name:"http",port:u,protocol:g==="udp"?"udp":"http"});}return [...o.values()].sort((n,i)=>n.port-i.port)}catch{return []}}async function D(e){for(let t of e)if(await k.pathExists(t))return t;return null}async function We(e){for(let t$1 of t(e,"workspace.json"))try{let r=await k.readJson(t$1);return {name:typeof r.workspace_name=="string"&&r.workspace_name.trim()||typeof r.name=="string"&&r.name.trim()||m__default.basename(e),profile:typeof r.profile=="string"?r.profile:void 0}}catch{}return {name:m__default.basename(e)}}async function Se(e){let t=[],r=[e],o=new Set,n=new Set([".git",".workspai",".rapidkit","node_modules",".venv","venv","dist","build","target",".next",".turbo",".cache"]);for(;r.length>0;){let i=r.shift();if(!i||o.has(i))continue;o.add(i);let c=await D(u(i,"project.json")),u$1=await D(u(i,"context.json"));if(c||u$1){t.push(c??u$1??"");continue}let g;try{g=await k.readdir(i,{withFileTypes:true});}catch{continue}for(let d of g)!d.isDirectory()||n.has(d.name)||a$1(d.name)||r.push(m__default.join(i,d.name));}return t.sort()}function Ae(e){let t=(e||"").toLowerCase();if(t.includes("fastapi"))return "fastapi";if(t.includes("nestjs"))return "nestjs";if(t.includes("springboot"))return "springboot";if(t.includes("gofiber"))return "fiber";if(t.includes("gogin"))return "gin"}function Re(e,t){let r=(e||"").toLowerCase(),o=(t||"").toLowerCase();return r.includes("vscode-extension")?null:r.includes("fastapi")?8e3:r.includes("nestjs")?3e3:r.includes("springboot")?8080:r.includes("gofiber")?3e3:r.includes("gogin")?8080:r.startsWith("adopted.")?null:o==="node"?3e3:o==="python"?8e3:o==="java"||o==="go"?8080:null}function U(e,t){let r=e;for(;t.has(r)&&r<65535;)r+=1;return r}function B(e,t,r){let o=e!==void 0&&e.source===void 0,n=Re(t.kit,t.runtime),i=e?.ports||[],c=t.ports||[],u=(t.kit||"").toLowerCase().includes("vscode-extension"),g=t.source==="adopted-local"&&e?.source!==void 0,d=t.source!==void 0&&e?.source!==void 0,p=(u&&c.length===0?[]:g?c.length>0?c:n?[{name:"http",port:U(n,r),protocol:"http"}]:[]:i.length>0?i:c.length>0?c:n?[{name:"http",port:U(n,r),protocol:"http"}]:[]).map(w=>({...w,port:U(w.port,r)}));for(let w of p)r.add(w.port);let f={...t,...e,slug:e?.slug||t.slug,relativePath:o&&e?.relativePath&&z(e.relativePath)?e.relativePath:t.relativePath,source:o&&e?.source||t.source,relationship:o&&e?.relationship||t.relationship,externalPath:o&&e?.externalPath||t.externalPath,runtime:d?t.runtime:e?.runtime||t.runtime,framework:d?t.framework:e?.framework||t.framework,kit:d?t.kit:e?.kit||t.kit,modules:e?.modules?.length?e.modules:t.modules,ports:p,contracts:{owns:e?.contracts?.owns||[],apis:e?.contracts?.apis||[],publishes:e?.contracts?.publishes||[],consumes:e?.contracts?.consumes||[],dependsOn:e?.contracts?.dependsOn||[],env:e?.contracts?.env||[]}},h=JSON.stringify(e||null)!==JSON.stringify(f);return {project:f,changed:h}}async function he(e){let t=m__default.resolve(e.workspacePath),r=await We(t),o=await Se(t),n=await I(t),i=new Map(n.map(s=>[m__default.resolve(s.path),s])),c=[];for(let s of n){let p=m__default.resolve(s.path),f=await D(u(p,"project.json"))??await D(u(p,"context.json"));!f||o.some(h=>m__default.resolve(h)===m__default.resolve(f))||c.push({projectJsonPath:f,registryEntry:s});}let u$1=[],g=[...o.map(s=>({projectJsonPath:s,registryEntry:i.get(m__default.resolve(m__default.dirname(m__default.dirname(s))))})),...c];for(let{projectJsonPath:s,registryEntry:p}of g){let f=m__default.dirname(m__default.dirname(s)),h=fe(m__default.relative(t,f)),w=p!==void 0&&!z(h),C=le(p?.name||m__default.basename(f),m__default.basename(f)),b=w?`external/${C}`:h||C,P=await k.readJson(s),a=typeof P.kit_name=="string"&&P.kit_name||typeof P.kit=="string"&&P.kit||void 0,E=j(P)?m$1(f,P):void 0,j$1=E!==void 0&&E.key!=="unknown",T=j$1?E.runtime:typeof P.runtime=="string"?P.runtime:void 0,y=j$1?E.key:typeof P.framework=="string"&&P.framework||Ae(a),$=p?.relationship==="adopted"?"adopted":"imported",K=j$1?`${$}.${E.key}`:a;u$1.push({slug:p?.name||b||m__default.basename(f),relativePath:b,source:p?.source??"workspace",relationship:p?.relationship,externalPath:w?f:void 0,runtime:T,framework:y,kit:K,modules:je(P.modules),ports:ue(P).length>0?ue(P):await be(f),contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]}});}let d=new Map;for(let s of u$1){let p=le(s.slug,s.relativePath),f=d.get(p);(!f||f.source!=="workspace"&&s.source==="workspace")&&d.set(p,s);}return {schemaVersion:_,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:r,projects:[...d.values()]}}async function dt(e){let t=m__default.resolve(e.outputPath||a$2(e.workspacePath,v));if(await k.pathExists(t)&&e.force!==true)throw new Error(`Workspace contract already exists: ${t}. Use --force to overwrite.`);let r=await he({workspacePath:e.workspacePath,now:e.now}),o=new Set,n={...r,projects:r.projects.map(c=>B(void 0,c,o).project)},i=await Pe({workspacePath:e.workspacePath,contractPath:t,contract:n});if(e.strict&&i.status==="failed")throw new N(i);return await ke({workspacePath:e.workspacePath,contractPath:t,contract:n,now:e.now}),{contractPath:t,contract:n}}async function lt(e){let t=m__default.resolve(e.workspacePath),r=a$2(t,v),o=await d(t,v)??r,n=await he({workspacePath:t,now:e.now}),i=await k.pathExists(o)?await k.readJson(o):null,c=new Map((i?.projects||[]).map(h=>[h.slug,h])),u=new Set,g=[],d$1=[],s=[];for(let h of n.projects){let w=c.get(h.slug),C=B(w,h,u);w?C.changed&&d$1.push(h.slug):g.push(h.slug),s.push(C.project),c.delete(h.slug);}for(let h of c.values()){if(h.source)continue;let w=B(h,h,u);s.push(w.project);}let p={schemaVersion:_,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:{...i?.workspace||{},...n.workspace,name:n.workspace.name||i?.workspace?.name||m__default.basename(t)},projects:s.sort((h,w)=>h.slug.localeCompare(w.slug))},f=await Pe({workspacePath:t,contractPath:r,contract:p});if(e.strict&&f.status==="failed")throw new N(f);return await ke({workspacePath:t,contractPath:r,contract:p,now:e.now}),{contractPath:r,contract:p,addedProjects:g,updatedProjects:d$1,verification:f}}async function me(e){return await k.pathExists(e)?{exists:true,contents:await k.readFile(e)}:{exists:false}}async function ge(e,t){if(!t.exists){await k.remove(e);return}await k.outputFile(e,t.contents);}async function ke(e){let{buildWorkspaceRegistrySummary:t,WORKSPACE_REGISTRY_SUMMARY_RELATIVE_PATH:r}=await import('./workspace-registry-summary-5SFBTRGQ.js'),o=await t(e.workspacePath,{now:e.now,contract:e.contract}),n=a$2(e.workspacePath,r),i=c=>{if(!c||typeof c!="object"||Array.isArray(c))return JSON.stringify(c);let{generatedAt:u,...g}=c;return JSON.stringify(g)};if(await k.pathExists(e.contractPath)&&await k.pathExists(n)){let[c,u]=await Promise.all([k.readJson(e.contractPath),k.readJson(n)]);if(i(c)===i(e.contract)&&i(u)===i(o))return}b(v,e.contract),b(r,o),await c$1(e.workspacePath,v,async()=>{let[c,u]=await Promise.all([me(e.contractPath),me(n)]);try{if(e.contractPath===a$2(e.workspacePath,v)?await e$1(e.workspacePath,v,e.contract):(await k.ensureDir(m__default.dirname(e.contractPath)),await k.writeJson(e.contractPath,e.contract,{spaces:2})),process.env.WORKSPAI_TEST_FAIL_WORKSPACE_REGISTRY_PUBLISH==="1")throw new Error("Injected workspace registry summary publication failure.");await e$1(e.workspacePath,r,o);}catch(g){let s=(await Promise.allSettled([ge(e.contractPath,c),ge(n,u)])).filter(p=>p.status==="rejected");throw s.length>0?new AggregateError([g,...s.map(p=>p.reason)],"Workspace contract publication failed and rollback was incomplete."):g}});}async function we(e){let t=e.contractPath??(await d(e.workspacePath,v)||a$2(e.workspacePath,v)),r=await k.readJson(t);return {contractPath:t,contract:r}}var xe={metadata:[".workspai/project.json",".workspai/context.json",".rapidkit/project.json",".rapidkit/context.json"],manifests:["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","pyproject.toml","poetry.lock","requirements.txt","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","Gemfile","composer.json"],entrypoints:["src/main.ts","src/index.ts","src/app.ts","src/main.js","src/index.js","main.py","app/main.py","manage.py","main.go","cmd/main.go","Program.cs"],apiSpecifications:["openapi.yaml","openapi.yml","openapi.json","swagger.yaml","swagger.yml","swagger.json"],infrastructure:["Dockerfile","docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml","k8s","kubernetes","terraform"],documentation:["README.md","ARCHITECTURE.md","CONTRIBUTING.md","docs"]};function _e(e,t){return t.externalPath?m__default.resolve(t.externalPath):m__default.resolve(e,t.relativePath)}async function Ge(e){let t={metadata:[],manifests:[],entrypoints:[],apiSpecifications:[],infrastructure:[],documentation:[]};for(let[r,o]of Object.entries(xe))for(let n of o)await k.pathExists(m__default.join(e,n))&&t[r].push(n);try{let r=await k.readdir(e,{withFileTypes:true});for(let o of r)o.isFile()&&(o.name.endsWith(".csproj")||o.name.endsWith(".sln"))&&t.manifests.push(o.name),o.isFile()&&o.name.endsWith(".tf")&&t.infrastructure.push(o.name);}catch{}for(let r of Object.values(t))r.sort((o,n)=>o.localeCompare(n));return t}function x(e){return !e||typeof e!="object"||Array.isArray(e)?[]:Object.keys(e).sort((t,r)=>t.localeCompare(r))}async function Oe(e){try{let t=await k.readJson(m__default.join(e,"package.json")),r={runtime:x(t.dependencies),development:x(t.devDependencies),peer:x(t.peerDependencies),optional:x(t.optionalDependencies)};return {...typeof t.name=="string"?{name:t.name}:{},...typeof t.version=="string"?{version:t.version}:{},...typeof t.private=="boolean"?{private:t.private}:{},scripts:x(t.scripts),dependencies:r,dependencyCount:new Set(Object.values(r).flat()).size}}catch{return}}async function Ie(e){for(let t of [".env.example",".env.sample",".env.template"])try{return (await k.readFile(m__default.join(e,t),"utf8")).split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#")&&o.includes("=")).map(o=>o.slice(0,o.indexOf("=")).trim()).filter(o=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(o)).sort((o,n)=>o.localeCompare(n))}catch{}return []}function Ne(e,t){try{let r=z$1(e);if(r.engine!=="unknown")return r;let o=k.pathExistsSync(m__default.join(e,"package.json"))?"npm":k.pathExistsSync(m__default.join(e,"pyproject.toml"))?"python":k.pathExistsSync(m__default.join(e,"requirements.txt"))?"pip":"unknown";return {...r,engine:o,runtime:t.runtime??r.runtime,framework:t.framework??r.framework,frameworkDisplayName:t.framework??r.frameworkDisplayName}}catch{return {schemaVersion:1,scope:"project",projectRoot:null,engine:"unknown",runtime:"unknown",runtimeCandidates:["unknown"],compositeRuntime:false,lifecycleCoverage:"complete",framework:"unknown",frameworkDisplayName:"Unknown",frameworkConfidence:"low",frameworkSupportTier:"observed",runtimeSupportTier:"observed",runtimeDoctorSupport:"observed",moduleSupport:false,fleetStages:[],localOnlyCommands:[],commandMap:{},supportedCommands:[],unsupportedCommands:[],globalCommands:[]}}}function De(e,t,r){let o=e.projects.map(n=>({id:n.slug,path:n.relativePath,runtime:n.runtime,framework:n.framework}));return {schemaVersion:"workspace-dependency-graph.v1",generatedAt:t,nodes:o,edges:[],stats:{nodeCount:o.length,edgeCount:0,inferredEdges:0,contractEdges:0,manualEdges:0,authoritativeEdges:0,lowConfidenceEdges:0,orphanCount:o.length,connectedNodeCount:0,density:0,edgeCoverageRatio:o.length===0?1:0,evidenceCoverageRatio:1,hotspotCount:0,hasCycle:false},diagnostics:[{code:"graph.enrichment.failed",severity:"warning",message:r,recommendation:"Review project manifests and graph overrides, then rerun workspace contract graph."}]}}async function ut(e$1){let{contractPath:t,contract:r}=await we(e$1),o=e$1.now??new Date,n=o.toISOString(),{buildWorkspaceModel:i,workspaceModelProjectTopology:c}=await import('./workspace-model-GVXNLSQM.js'),{hashWorkspaceModel:u}=await import('./workspace-model-hash-ZXYPIGCW.js'),g=await i({workspacePath:e$1.workspacePath,includeEvidence:false,now:o}),d=c(g)??De(r,n,"The canonical Workspace Model did not provide a project dependency topology."),s=new Map(d.nodes.map(a=>[a.id,a.operationalProfile])),{buildWorkspaceKnowledgeGraph:p}=await import('./workspace-knowledge-graph-AUXYL3L6.js'),f=await p({workspacePath:e$1.workspacePath,workspace:{name:g.workspace.name,...g.workspace.profile?{profile:g.workspace.profile}:{}},contract:r,projectTopology:d,now:o,projects:g.projects.map(a=>({id:a.name,path:a.path,...a.absolutePath?{absolutePath:a.absolutePath}:{},runtime:a.runtime,runtimeCandidates:a.runtimeCandidates,framework:a.framework,...a.kit?{kit:a.kit}:{}})),source:{kind:"workspace-model",artifact:e.model,hashAlgorithm:"sha256",hash:u(g)}}),h=await Promise.all(r.projects.map(async a=>{let l=_e(e$1.workspacePath,a),[E,j,T]=await Promise.all([Ge(l),Oe(l),Ie(l)]),y=Ne(l,a);return {id:a.slug,label:a.slug,relativePath:a.relativePath,source:a.source,relationship:a.relationship,externalPath:a.externalPath,runtime:a.runtime??y.runtime,framework:a.framework??y.framework,kit:a.kit,modules:a.modules,ports:a.ports,apis:a.contracts.apis,owns:a.contracts.owns,env:[...new Set([...a.contracts.env,...T])].sort(($,K)=>$.localeCompare(K)),contracts:{owns:[...a.contracts.owns],apis:[...a.contracts.apis],publishes:[...a.contracts.publishes],consumes:[...a.contracts.consumes],dependsOn:[...a.contracts.dependsOn],env:[...a.contracts.env]},capabilities:{engine:y.engine,supportTier:y.frameworkSupportTier,runtimeSupportTier:y.runtimeSupportTier,doctorSupport:y.runtimeDoctorSupport,moduleSupport:y.moduleSupport,fleetStages:[...y.fleetStages],localOnlyCommands:[...y.localOnlyCommands],supportedCommands:[...y.supportedCommands]},files:E,...j?{package:j}:{},...s.get(a.slug)?{operationalProfile:s.get(a.slug)}:{}}})),w=new Set(h.map(a=>a.id)),C=new Map,b=[];for(let a of r.projects){for(let l of a.contracts.dependsOn||[])w.has(l)&&b.push({from:l,to:a.slug,type:"dependency",label:"dependsOn"});for(let l of a.contracts.publishes||[])C.has(l)||C.set(l,new Set),C.get(l)?.add(a.slug);}for(let a of r.projects)for(let l of a.contracts.consumes||[]){let E=C.get(l);if(E)for(let j of E)j!==a.slug&&b.push({from:j,to:a.slug,type:"event",label:l});}let P={schemaVersion:1,kind:"rapidkit.workspace.contract.graph",workspace:r.workspace,generatedAt:n,nodes:h.sort((a,l)=>a.id.localeCompare(l.id)),edges:b.sort((a,l)=>`${a.from}:${a.to}:${a.type}:${a.label}`.localeCompare(`${l.from}:${l.to}:${l.type}:${l.label}`)),dependencyGraph:d,knowledgeGraph:f,semantics:{legacyEdges:"producer-to-consumer",dependencyGraphEdges:"consumer-to-dependency"},summary:{projectCount:h.length,dependencyEdges:b.filter(a=>a.type==="dependency").length,eventEdges:b.filter(a=>a.type==="event").length,portCount:h.reduce((a,l)=>a+l.ports.length,0),apiCount:h.reduce((a,l)=>a+l.apis.length,0),relationshipEdges:d.stats.edgeCount,inferredEdges:d.stats.inferredEdges,authoritativeEdges:d.stats.authoritativeEdges,orphanProjects:d.stats.orphanCount,hotspotProjects:d.stats.hotspotCount,evidenceCoverageRatio:d.stats.evidenceCoverageRatio,edgeCoverageRatio:d.stats.edgeCoverageRatio,connectedProjects:d.stats.connectedNodeCount,lowConfidenceEdges:d.stats.lowConfidenceEdges,hasCycle:d.stats.hasCycle,manifestCount:h.reduce((a,l)=>a+l.files.manifests.length,0),entrypointCount:h.reduce((a,l)=>a+l.files.entrypoints.length,0),diagnostics:d.diagnostics?.length??0,relationshipKinds:Object.fromEntries(pe.map(a=>[a,d.edges.filter(l=>l.kind===a).length])),relationshipSources:Object.fromEntries(de.map(a=>[a,d.edges.filter(l=>l.source===a).length])),entityCount:f.quality.entityCount,knowledgeRelations:f.quality.relationCount,proofCount:f.quality.proofCount,providerCount:f.providers.length,knowledgeUnknowns:f.quality.unknownCount}};return {contractPath:t,graph:P}}async function Pe(e){let t=e.contract?{contractPath:e.contractPath??a$2(e.workspacePath,v),contract:e.contract}:await we(e),{contractPath:r,contract:o}=t,n=[],i=[];o.kind!=="rapidkit.workspace.contract"&&n.push("Contract kind must be rapidkit.workspace.contract."),o.schemaVersion!==_&&n.push(`Contract schemaVersion must be ${_}.`),o.workspace?.name||n.push("Contract workspace.name is required."),Array.isArray(o.projects)||n.push("Contract projects must be an array.");let c=new Set,u=new Map;for(let s of o.projects||[]){if(!s.slug){n.push("Every project must declare slug.");continue}c.has(s.slug)&&n.push(`Duplicate project slug: ${s.slug}.`),c.add(s.slug),s.relativePath?z(s.relativePath)||n.push(`Project ${s.slug} declares unsafe relativePath: ${s.relativePath}.`):n.push(`Project ${s.slug} must declare relativePath.`),s.externalPath&&(s.relationship==="adopted"||s.source==="adopted-local"||s.source==="local-folder"||s.source==="git-url"||n.push(`Project ${s.slug} declares externalPath without imported/adopted provenance.`),m__default.isAbsolute(s.externalPath)||n.push(`Project ${s.slug} declares non-absolute externalPath.`));for(let p of s.ports||[]){(!Number.isInteger(p.port)||p.port<1||p.port>65535)&&n.push(`Project ${s.slug} declares invalid port: ${p.port}.`);let f=u.get(p.port);f&&n.push(`Port ${p.port} is claimed by both ${f} and ${s.slug}.`),u.set(p.port,s.slug);}for(let p of s.contracts?.apis||[])(!p.name?.trim()||!p.basePath?.startsWith("/"))&&n.push(`Project ${s.slug} declares invalid API contract.`);for(let p of [...s.contracts?.publishes||[],...s.contracts?.consumes||[]])p.trim()||n.push(`Project ${s.slug} declares an empty event contract.`);for(let p of s.contracts?.env||[])/^[A-Z_][A-Z0-9_]*$/.test(p)||n.push(`Project ${s.slug} declares invalid env contract: ${p}.`);for(let p of s.contracts?.dependsOn||[])c.has(p);}for(let s of o.projects||[])for(let p of s.contracts?.dependsOn||[])c.has(p)||n.push(`Project ${s.slug} depends on unknown project: ${p}.`);i.push({id:"schema",status:o.kind==="rapidkit.workspace.contract"&&o.schemaVersion===_?"passed":"failed",message:"Contract schema and kind are valid."}),i.push({id:"projects",status:Array.isArray(o.projects)?"passed":"failed",message:`Contract declares ${Array.isArray(o.projects)?o.projects.length:0} project(s).`}),i.push({id:"ports",status:n.some(s=>s.toLowerCase().includes("port"))?"failed":"passed",message:"Project port declarations are valid and collision-free."}),i.push({id:"dependencies",status:n.some(s=>s.includes("depends on unknown project"))?"failed":"passed",message:"Project dependencies point to known project slugs."}),i.push({id:"contracts",status:n.some(s=>s.includes("unsafe relativePath")||s.includes("invalid API contract")||s.includes("event contract")||s.includes("env contract"))?"failed":"passed",message:"Project path, API, event, and env contracts are valid."});let g=await l(e.workspacePath);if(g.moduleCount>0){for(let s of g.issues)n.push(`${m__default.basename(s.projectRoot)}: ${s.message} (slug=${s.slug})`);i.push({id:"module-paths",status:g.status,message:g.status==="passed"?`All ${g.moduleCount} registered module(s) resolve under canonical paths.`:`${g.issues.length} registered module(s) missing canonical install paths.`});}else e.strict&&i.push({id:"module-paths",status:"passed",message:"No registry-backed modules declared in workspace projects."});return {status:n.length>0?"failed":"passed",contractPath:r,projectCount:Array.isArray(o.projects)?o.projects.length:0,checks:i,violations:n}}async function mt(e){let t=m__default.resolve(e.workspacePath),r={schemaVersion:ve,generatedAt:e.generatedAt??new Date().toISOString(),status:e.result.status,contractPath:e.result.contractPath,projectCount:e.result.projectCount,checks:e.result.checks,violations:e.result.violations};return e$1(t,Ee,se(r))}
2
2
  export{I as a,He as b,Je as c,se as d,ze as e,pe as f,v as g,Ee as h,_ as i,ve as j,N as k,Se as l,he as m,dt as n,lt as o,we as p,ut as q,Pe as r,mt as s};
@@ -0,0 +1 @@
1
+ import {b}from'./chunk-3BMYMZQB.js';import {m,j,e}from'./chunk-CPR2CMOY.js';import {a as a$1}from'./chunk-AFIFZTOY.js';import {a}from'./chunk-2LIVMG5C.js';import {h}from'./chunk-ZGHJIQXL.js';import x from'crypto';import l from'path';import g from'fs-extra';var L=h.workspaceIntelligenceBenchmark.schemaVersion,O=h.workspaceIntelligenceBenchmark.artifactPath,S=h.workspaceIntelligenceBenchmark.contractPath,q={"agent-core.v1":{id:"agent-core.v1",version:1,title:"Cross-project agent retrieval core",scenarios:[{id:"architecture",title:"Architecture and runtime discovery",preferredKinds:["service","runtime-unit","language","project","workspace"]},{id:"ownership",title:"Dependency and ownership discovery",preferredKinds:["package","module","owner","project","workspace"]},{id:"interfaces",title:"Interface and contract discovery",preferredKinds:["api","endpoint","protocol","schema","project","workspace"]},{id:"change-safety",title:"Change safety and verification discovery",preferredKinds:["test-suite","lifecycle-stage","pipeline","module","project","workspace"]},{id:"delivery",title:"Build and delivery discovery",preferredKinds:["pipeline","deployment","container","lifecycle-stage","project","workspace"]}]}};function y(e,t){if(e.length===0)return 0;let n=[...e].sort((a,r)=>a-r),i=Math.min(n.length-1,Math.max(0,Math.ceil(t*n.length)-1));return n[i]??0}function G(e,t){let n=new Map;for(let a of e.entities){let r=a.label.trim().toLowerCase();n.set(r,(n.get(r)??0)+1);}for(let a of t){let r=e.entities.filter(s=>s.kind===a).sort((s,m)=>s.id.localeCompare(m.id)),o=r.find(s=>n.get(s.label.trim().toLowerCase())===1);if(o)return {entity:o,query:o.label};let u=r[0];if(u)return {entity:u,query:u.identity.key}}let i=[...e.entities].sort((a,r)=>a.id.localeCompare(r.id))[0];if(!i)throw new Error("Workspace benchmark requires at least one graph entity.");return {entity:i,query:i.identity.key}}function R(e){if(!e||e.summary.modelCalls===0)return "unavailable";let t=e.summary.tokenSources,n=t.providerReported+t.tokenizerCounted;return n+t.estimated+t.unavailable!==e.summary.modelCalls?"mixed":n===e.summary.modelCalls?"measured":t.estimated===e.summary.modelCalls?"estimated":t.unavailable===e.summary.modelCalls?"unavailable":"mixed"}function H(e){return e.comparison?.taskAligned===true&&e.comparison.comparableOutcome===true&&e.currentProvenance==="measured"&&e.baselineProvenance==="measured"?e.comparison.delta.reductionPercent:null}async function W(e,t){try{return await j(e,t)}catch{return}}async function Y(e$1){let t=l.resolve(e$1.workspacePath),n=e$1.suite??"agent-core.v1",i=q[n],a$2=[],r;for(let c of i.scenarios){let v=G(e$1.graph,c.preferredKinds),h=v.entity,d=await b({workspacePath:t,graph:e$1.graph,query:v.query,limit:e$1.limit??12,...r?{corpus:r}:{},now:e$1.now});r=d.corpus;let C=d.retrieval.payload.entities.some(M=>M.id===h.id);a$2.push({id:c.id,title:c.title,query:v.query,queryOrigin:"graph-derived",targetEntityId:h.id,targetKind:h.kind,targetRetrieved:C,result:C?"matched":"empty",matchCount:d.retrieval.matchCount,truncated:d.retrieval.truncated,retrievalCharacterCount:d.retrieval.characterCount,retrievalEstimatedTokens:d.retrieval.estimatedTokens,estimatedTokensAvoided:d.savings.estimatedTokensAvoided,estimatedReductionPercent:d.savings.reductionPercent});}r??={artifactCount:0,characterCount:0,estimatedTokens:0,unreadableArtifacts:[]};let o=await W(t,e$1.evaluationPath??e),u=e$1.baselineEvaluationPath?await W(t,e$1.baselineEvaluationPath):void 0,s=o&&u?m(o,u):void 0,m$1=R(o),_=R(u),K=H({comparison:s,currentProvenance:m$1,baselineProvenance:_}),N=await a(t),f=a$2.filter(c=>c.result==="matched").length,E=a$2.map(c=>c.retrievalEstimatedTokens),B=a$2.map(c=>c.estimatedReductionPercent),b$1={schemaVersion:L,generatedAt:(e$1.now??new Date).toISOString(),workspace:{name:N?.name||l.basename(t),path:t},suite:{id:i.id,version:i.version,title:i.title},graph:{schemaVersion:e$1.graph.schemaVersion,sourceArtifact:e$1.graph.source.artifact,sourceHash:e$1.graph.source.hash,entityCount:e$1.graph.entities.length,relationCount:e$1.graph.relations.length,proofCount:e$1.graph.proofs.length},methodology:{id:"multi-scenario-bounded-retrieval.v1",charsPerEstimatedToken:4,deterministic:true,networkRequired:false,scenarioTargetPolicy:"evidence-backed-representative.v1",claimBoundary:"Retrieval values estimate payload size against readable proof-source text across fixed scenario categories with deterministic evidence-backed representative targets. They do not establish answer equivalence, model billing savings, or task success."},corpus:r,scenarios:a$2,retrievalSummary:{provenance:"estimated",scenarioCount:a$2.length,matchedScenarioCount:f,medianRetrievalEstimatedTokens:y(E,.5),p95RetrievalEstimatedTokens:y(E,.95),medianEstimatedReductionPercent:y(B,.5),status:r.estimatedTokens===0?"unavailable":f===a$2.length?"passed":"partial"},evaluation:{availability:o?"available":"unavailable",provenance:m$1,...o?{current:{runId:o.runId,taskId:o.configuration.taskId,strategy:o.configuration.strategy,status:o.status,summary:o.summary}}:{},...s?{comparison:s}:{},trustedMeasuredReductionPercent:K,claimBoundary:"A measured reduction is reported only for task-aligned runs with comparable verified outcomes when every model call in both runs uses provider-reported or tokenizer-counted usage."}};return a$1(b$1,S,"workspace intelligence benchmark"),b$1}async function Z(e,t,n=O){a$1(t,S,n);let i=l.isAbsolute(n)?n:l.join(l.resolve(e),n),a=l.relative(l.resolve(e),i);if(a.startsWith("..")||l.isAbsolute(a))throw new Error("Workspace benchmark output must remain inside the workspace.");await g.ensureDir(l.dirname(i));let r=`${i}.${process.pid}.${x.randomUUID()}.tmp`;try{await g.writeJson(r,t,{spaces:2}),await g.rename(r,i);}finally{await g.remove(r).catch(()=>{});}return i}export{L as a,O as b,S as c,q as d,R as e,H as f,Y as g,Z as h};
@@ -1,4 +1,4 @@
1
- import {a as a$4}from'./chunk-ZEEV5J4I.js';import {f as f$1,e as e$1}from'./chunk-SX6A656X.js';import {a as a$1,b}from'./chunk-HLWDIIWL.js';import {b as b$1,c}from'./chunk-JZJBA2V2.js';import {a as a$2}from'./chunk-NMXGSVMD.js';import {p,a as a$3}from'./chunk-7FF5EOIO.js';import {k as k$1,m,l}from'./chunk-U5ENEDJA.js';import {e as e$2}from'./chunk-GAYK3WGV.js';import {e,f}from'./chunk-6UNATTB7.js';import {k,t,u}from'./chunk-VQZ5PI5J.js';import j from'fs';import i from'path';import a from'chalk';var Z=new Set([".git",".workspai",".rapidkit",".venv","node_modules","dist","build","target","coverage","htmlcov",".next"]);async function I(e){try{return await j.promises.access(e,j.constants.F_OK),true}catch{return false}}async function S(e){try{let n=JSON.parse(await j.promises.readFile(e,"utf-8"));return n&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async function v(e){try{return await j.promises.readFile(e,"utf-8")}catch{return ""}}function ee(e){return a$1(e)}async function ne(e,n){return await X([...u(e,"project.json"),...u(e,"context.json")])?true:b(e)?false:i.resolve(e)===i.resolve(n)?k$1(e).length>0:k$1(e).length>0}async function te(e){let n=await a$2(e,{skipDirs:Z,includeHiddenDirs:false,descendIntoMatchedProjects:false,isProjectDir:ne}),r=(await a$3(e)).filter(s=>s.relationship==="adopted"||s.source==="adopted-local").map(s=>i.resolve(s.path)).filter(s=>j.existsSync(s)),o=[...new Set([...n.map(s=>i.resolve(s)),...r])];return o.length>0?o:b(e)?[]:k$1(e).length>0?[e]:[]}function re(e,n){return i.relative(e,n).replace(/\\/g,"/")||"."}async function E(e,n){for(let t of n)if(await I(i.join(e,t)))return true;return false}async function X(e){for(let n of e)if(await I(n))return true;return false}async function Y(e){for(let n of e){let t=await S(n);if(t)return t}return null}async function oe(e){if(await E(e,["health","health.ts","health.js","health.py","health.go","health.kt","health.rb","health.php","healthcheck","health-check","src/health.ts","src/health.js","src/health.py","src/health.go","src/health.kt","src/health.rb","src/health.php","src/healthcheck.ts","src/healthcheck.js","src/liveness.ts","src/readiness.ts","src/ping.ts","app/controllers/health_controller.rb","app/controllers/health_check_controller.rb","config/initializers/health_check.rb"]))return true;let t=await v(i.join(e,"config","routes.rb"));return /(?:health|readiness|liveness|readiness_check|health_check)/iu.test(t)}async function se(e,n){if(await E(e,[".env",".env.local"]))return true;let t=n?.contracts&&typeof n.contracts=="object"?n.contracts:null;if(Array.isArray(t?.env)&&t.env.length>0)return true;let r=await S(i.join(e,"package.json")),o={...r?.dependencies??{},...r?.devDependencies??{}};if(Object.keys(o).some(c=>/^(?:dotenv|dotenv-flow|env-cmd)$/iu.test(c)))return true;let s=await v(i.join(e,"pyproject.toml"));if(/\b(?:python-dotenv|pydantic-settings)\b/iu.test(s))return true;let p=[await v(i.join(e,"compose.yaml")),await v(i.join(e,"compose.yml")),await v(i.join(e,"docker-compose.yml")),await v(i.join(e,"docker-compose.yaml"))].join(`
1
+ import {a as a$4}from'./chunk-ZEEV5J4I.js';import {f as f$1,e as e$1}from'./chunk-KY2GOSO5.js';import {a as a$1,b}from'./chunk-QMQBX3RV.js';import {b as b$1,c}from'./chunk-2MTJWPQ4.js';import {a as a$2}from'./chunk-NMXGSVMD.js';import {p,a as a$3}from'./chunk-TCLKGPXF.js';import {k as k$1,m,l}from'./chunk-U5ENEDJA.js';import {e as e$2}from'./chunk-C2VTO5WT.js';import {e,f}from'./chunk-ZGHJIQXL.js';import {k,t,u}from'./chunk-VQZ5PI5J.js';import j from'fs';import i from'path';import a from'chalk';var Z=new Set([".git",".workspai",".rapidkit",".venv","node_modules","dist","build","target","coverage","htmlcov",".next"]);async function I(e){try{return await j.promises.access(e,j.constants.F_OK),true}catch{return false}}async function S(e){try{let n=JSON.parse(await j.promises.readFile(e,"utf-8"));return n&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async function v(e){try{return await j.promises.readFile(e,"utf-8")}catch{return ""}}function ee(e){return a$1(e)}async function ne(e,n){return await X([...u(e,"project.json"),...u(e,"context.json")])?true:b(e)?false:i.resolve(e)===i.resolve(n)?k$1(e).length>0:k$1(e).length>0}async function te(e){let n=await a$2(e,{skipDirs:Z,includeHiddenDirs:false,descendIntoMatchedProjects:false,isProjectDir:ne}),r=(await a$3(e)).filter(s=>s.relationship==="adopted"||s.source==="adopted-local").map(s=>i.resolve(s.path)).filter(s=>j.existsSync(s)),o=[...new Set([...n.map(s=>i.resolve(s)),...r])];return o.length>0?o:b(e)?[]:k$1(e).length>0?[e]:[]}function re(e,n){return i.relative(e,n).replace(/\\/g,"/")||"."}async function E(e,n){for(let t of n)if(await I(i.join(e,t)))return true;return false}async function X(e){for(let n of e)if(await I(n))return true;return false}async function Y(e){for(let n of e){let t=await S(n);if(t)return t}return null}async function oe(e){if(await E(e,["health","health.ts","health.js","health.py","health.go","health.kt","health.rb","health.php","healthcheck","health-check","src/health.ts","src/health.js","src/health.py","src/health.go","src/health.kt","src/health.rb","src/health.php","src/healthcheck.ts","src/healthcheck.js","src/liveness.ts","src/readiness.ts","src/ping.ts","app/controllers/health_controller.rb","app/controllers/health_check_controller.rb","config/initializers/health_check.rb"]))return true;let t=await v(i.join(e,"config","routes.rb"));return /(?:health|readiness|liveness|readiness_check|health_check)/iu.test(t)}async function se(e,n){if(await E(e,[".env",".env.local"]))return true;let t=n?.contracts&&typeof n.contracts=="object"?n.contracts:null;if(Array.isArray(t?.env)&&t.env.length>0)return true;let r=await S(i.join(e,"package.json")),o={...r?.dependencies??{},...r?.devDependencies??{}};if(Object.keys(o).some(c=>/^(?:dotenv|dotenv-flow|env-cmd)$/iu.test(c)))return true;let s=await v(i.join(e,"pyproject.toml"));if(/\b(?:python-dotenv|pydantic-settings)\b/iu.test(s))return true;let p=[await v(i.join(e,"compose.yaml")),await v(i.join(e,"compose.yml")),await v(i.join(e,"docker-compose.yml")),await v(i.join(e,"docker-compose.yaml"))].join(`
2
2
  `);return /^\s*(?:env_file|environment)\s*:/imu.test(p)}async function ae(e){return (await a$4(e)).detected}async function ie(e){let n=await S(i.join(e,"package.json")),t=n?.scripts&&typeof n.scripts=="object"?n.scripts:{};return Object.keys(t).sort()}function y(e,n,t,r,o,s,p){return {id:e,severity:n,target:t,title:r,detail:o,remediation:s,...p&&p.length>0?{files:[...p]}:{}}}function ce(e){let n=e.reduce((t,r)=>r.severity==="fail"?t+28:r.severity==="warn"?t+12:t+3,0);return Math.max(0,100-n)}async function de(e,n,t){let r=await Y(u(n,"project.json")),o=m(n,r),s=l(n),p=o.runtime==="unknown"?s[0]||"unknown":o.runtime,c$1=[p,...s.filter(G=>G!==p)],g=await b$1(n,r,{runtime:p,framework:o.key}),w=["backend","service","worker"].includes(g),h=w&&/^(?:fastapi|django|flask|nestjs|express|fastify|springboot|gofiber|gogin|dotnet-webapi|laravel|rails|phoenix|axum|actix|rocket)$/u.test(o.key),k=re(e,n),u$1=k,b=await ie(n),C=await X([...u(n,"project.json"),...u(n,"context.json")]),P=await ae(n),x=await E(n,["Dockerfile","dockerfile"]),R=await E(n,[".env.example","env.example","config/env.example"]),F=await se(n,r),m$1=await c({projectPath:n,declaration:t?.governance}),d=m$1.ci.status==="repository",l$1=await oe(n),f=[];return o.key==="unknown"&&f.push(y("project.stack.unknown","fail",u$1,"Project stack is unknown","Workspai cannot confidently classify this backend project.","Add .workspai/project.json metadata or import the project with `workspai import`.")),C||f.push(y("project.marker.missing","warn",u$1,"Workspai marker is missing","The project can be detected by files, but it is not registered with Workspai metadata.","Run `workspai import <path>` from a workspace or create the project through Workspai.")),P||f.push(y("project.tests.missing","warn",u$1,"Test entrypoint is missing","No common test folder, config, or package test script was found.","Add a test command so `workspai workspace run test --affected` can gate changes.")),w&&F&&!R&&f.push(y("project.env.example.missing","info",u$1,"Environment example is missing","No .env.example or env.example file was found.","Add an env example for onboarding and CI secret documentation.",[".env.example"])),m$1.ci.status==="unknown"?f.push(y("project.ci.missing","warn",u$1,"CI governance is not proven","No repository CI surface or canonical external CI declaration was found for this project.","Add repository CI configuration or declare the external CI authority in the workspace contract.",[".github/workflows/ci.yml"])):m$1.ci.status==="external-observed"&&f.push(y("project.ci.external-observed","info",u$1,"Continuous integration appears externally managed",`Repository documentation references an external CI control plane (${m$1.ci.evidence.join(", ")}).`,"Declare the external CI provider in the canonical workspace contract when authoritative release gating depends on it.")),h&&!l$1&&f.push(y("project.health.missing","info",u$1,"Health or readiness probe is missing","The project has no obvious health or readiness endpoint to support automated deployment and runtime checks.","Add a simple health endpoint and document it for readiness gates and observability.")),w&&!x&&f.push(y("project.container.missing","info",u$1,"Container recipe is missing","No Dockerfile was found for this project.","Add a Dockerfile when the service is intended for containerized deployment.",["Dockerfile"])),{name:typeof r?.name=="string"&&r.name.trim()?r.name.trim():i.basename(n),path:n,relativePath:k,runtime:p,runtimeCandidates:c$1,framework:o.key,confidence:o.confidence,supportTier:o.supportTier,hasRapidKitMarker:C,hasTests:P,hasDockerfile:x,hasEnvExample:R,hasCiConfig:d,governance:m$1,hasHealthEndpoint:l$1,scripts:b,findings:f,score:ce(f)}}function le(e){return e.name.toLowerCase()}async function pe(e){let n=new Map(e.map(o=>[le(o),o])),t=[];for(let o of e){let s=await S(i.join(o.path,"package.json")),p={...s?.dependencies??{},...s?.devDependencies??{},...s?.peerDependencies??{}};for(let g of Object.keys(p)){let w=g.replace(/^@[^/]+\//,"").toLowerCase(),h=n.get(w);h&&h.relativePath!==o.relativePath&&t.push({from:o.relativePath,to:h.relativePath,kind:"package"});}let c=await v(i.join(o.path,"pyproject.toml"));for(let g of e)g.relativePath!==o.relativePath&&c.includes(g.name)&&t.push({from:o.relativePath,to:g.relativePath,kind:"workspace-reference"});}let r=new Set;return t.filter(o=>{let s=`${o.from}\0${o.to}\0${o.kind}`;return r.has(s)?false:(r.add(s),true)})}function ue(e,n){let t=new Map;for(let r of e)t.set(r.relativePath,{project:r.relativePath,directDependents:0,directDependencies:0});for(let r of n){let o=t.get(r.from),s=t.get(r.to);o&&(o.directDependencies+=1),s&&(s.directDependents+=1);}return Array.from(t.values()).sort((r,o)=>o.directDependents-r.directDependents||o.directDependencies-r.directDependencies)}async function me(e){let n=await Y(t(e,"workspace.json"));return typeof n?.profile=="string"?n.profile:null}function fe(e){return {fail:e.filter(n=>n.severity==="fail").length,warn:e.filter(n=>n.severity==="warn").length,info:e.filter(n=>n.severity==="info").length}}function ge(e){if(e.projectCount===0)return e.workspaceDetected?["Add your first project: npx workspai create project <name> --kit <kit>","Import an existing service: npx workspai import <path>"]:["Create a Workspai workspace: npx workspai create workspace my-workspace --profile polyglot","Import an existing service: npx workspai import ../service"];let n=[];return e.findings.some(t=>t.id==="workspace.marker.missing")&&n.push("Initialize workspace metadata with `workspai bootstrap --profile polyglot`."),e.findings.some(t=>t.id==="project.marker.missing")&&n.push("Register detected projects with `workspai import <path>` or recreate them via `workspai create project`."),e.findings.some(t=>t.id==="project.tests.missing")&&n.push("Add test entrypoints, then gate changes with `workspai workspace run test --affected --strict`."),e.findings.some(t=>t.id==="project.ci.missing")&&n.push("Add CI/CD configuration to catch regressions early and make workspace health checks actionable."),e.findings.some(t=>t.id==="project.health.missing")&&n.push("Add a health/readiness endpoint so runtime probes and deployment checks can verify service health."),e.hasCanonicalGraph||n.push("Generate canonical topology with `workspai workspace model --write --include-evidence`."),n.push("Run `workspai autopilot release --mode audit --json` before release."),Array.from(new Set(n))}async function Fe(e$3={}){let n=i.resolve(e$3.workspacePath||process.cwd());if(!await I(n))throw new Error(`Workspace path does not exist: ${n}`);let t=ee(n)??n,r=k(t),o=await me(t),s=await te(t),p$1;try{p$1=(await p({workspacePath:t})).contract;}catch{}let c=await Promise.all(s.map(d=>{let l=p$1?.projects.find(f=>{let G=f.externalPath??f.relativePath;return i.resolve(t,G)===i.resolve(d)});return de(t,d,l)})),g=await pe(c),w=ue(c,g),h=[];r||h.push(y("workspace.marker.missing","warn",".","Workspace metadata is missing","The directory can be analyzed, but it is not a registered Workspai workspace.","Run `workspai create workspace` or `workspai bootstrap --profile polyglot` in a workspace root.")),c.length===0&&h.push(y("workspace.projects.missing","warn",".","No backend projects detected","Workspai did not find runtime markers or project metadata under this root.","Create a project with `workspai create project` or import one with `workspai import <path>`."));let k$1=[...h,...c.flatMap(d=>d.findings)],u=fe(k$1),b={};for(let d of c)for(let l of d.runtimeCandidates)b[l]=(b[l]||0)+1;let C=c.length>0?Math.round(c.reduce((d,l)=>d+l.score,0)/c.length):0,P=h.reduce((d,l)=>d+(l.severity==="fail"?20:l.severity==="warn"?8:2),0),x=Math.max(0,C-P),R=c.length===0&&u.fail===0&&k$1.length>0&&k$1.every(d=>d.id==="workspace.projects.missing"&&d.severity==="warn"),F=u.fail>0||e$3.strict&&u.warn>0&&!R?"blocked":u.warn>0?"needs-attention":"ready",m={schemaVersion:f.analyze,generatedAt:new Date().toISOString(),workspacePath:t,workspaceDetected:r,profile:o,summary:{statusScope:"source-structure",releaseReadiness:"not-evaluated",score:x,verdict:F,projectCount:c.length,runtimeCount:Object.keys(b).length,findings:u},runtimes:b,projects:c,dependencyGraph:{status:g.length>0?"generated":"empty",edges:g,topImpactedProjects:w.slice(0,5)},findings:k$1,nextActions:ge({findings:k$1,projectCount:c.length,hasCanonicalGraph:await I(i.join(t,e.knowledgeGraph)),workspaceDetected:r}),enterpriseControls:{jsonReady:true,ciGateCommand:"workspai analyze --json --strict",releaseGateCommand:"workspai autopilot release --mode enforce --json",evidencePath:e.analyze}};if(e$3.output&&(await j.promises.mkdir(i.dirname(i.resolve(e$3.output)),{recursive:true}),await j.promises.writeFile(i.resolve(e$3.output),`${JSON.stringify(m,null,2)}
3
3
  `)),!e$3.output&&r){let d=f$1(m,{commandId:"workspaceAnalyze",exitCode:m.summary.verdict==="blocked"?2:m.summary.verdict==="needs-attention"?1:0,generatedAt:m.generatedAt,blockers:m.findings.filter(l=>l.severity==="fail").map(l=>l.title).slice(0,12),runId:e$1()});await e$2(t,e.analyze,d);}return m}function Ge(e){let n=e.summary.verdict==="ready"?a.green:e.summary.verdict==="needs-attention"?a.yellow:a.red;if(console.log(a.bold(`
4
4
  Workspai Workspace Analysis
@@ -0,0 +1 @@
1
+ import {u,e,k}from'./chunk-VQZ5PI5J.js';import W from'crypto';import p from'fs';import g from'os';import r from'path';var K="workspace-activity-event.v1",B=["run.started","run.completed","run.failed","run.cancelled","block.planned","block.started","block.progress","block.completed","block.failed","block.blocked","block.skipped","edge.declared","operation.started","operation.completed","operation.failed","touch.planned","touch.observed","artifact.published","artifact.rejected","warning.detected"],N=["planned","running","succeeded","warned","blocked","failed","cancelled","skipped","rolled-back"];var _=["package.json","pyproject.toml","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","*.sln"];function l(t){try{return p.existsSync(t)}catch{return false}}function x(t,i){return i.some(e=>{if(e==="*.sln")try{return p.readdirSync(t).some(o=>o.toLowerCase().endsWith(".sln"))}catch{return false}return l(r.join(t,e))})}function E(t,i,e){let o=r.resolve(t),s=e?r.resolve(e):null;for(;;){if(i(o))return o;if(s&&o===s)return null;let a=r.dirname(o);if(a===o)return null;o=a;}}function j(t){for(let i of u(t,e))if(l(i))try{let e=JSON.parse(p.readFileSync(i,"utf8")),o=typeof e.workspace?.root=="string"?e.workspace.root:null;if(o&&k(r.resolve(o)))return r.resolve(o)}catch{}return null}function w(t=process.env){return t.WORKSPAI_ACTIVITY_STATE_DIR?r.resolve(t.WORKSPAI_ACTIVITY_STATE_DIR):process.platform==="win32"?r.join(t.LOCALAPPDATA||g.homedir(),"Workspai","activity"):process.platform==="darwin"?r.join(g.homedir(),"Library","Application Support","Workspai","activity"):r.join(t.XDG_STATE_HOME||r.join(g.homedir(),".local","state"),"workspai","activity")}function T(t,i){let e=r.resolve(i);try{e=p.realpathSync.native(e);}catch{}return process.platform==="win32"&&(e=e.toLowerCase()),`${t}-${W.createHash("sha256").update(e).digest("hex").slice(0,24)}`}function I(t){let i=r.resolve(t);try{i=p.realpathSync.native(i);}catch{}return process.platform==="win32"&&(i=i.toLowerCase()),`local-${W.createHash("sha256").update(i).digest("hex").slice(0,24)}`}function J(t=process.cwd(),i={}){let e=r.resolve(t),o=E(e,k),s=E(e,f=>l(r.join(f,".git"))||x(f,_),o??void 0),a=s?j(s):null,n=o??a??s??e,c=s??o??e,v=o||a?"workspace":s&&u(s,"project.json").some(l)?"project":"ephemeral-project",R=T(v,n),y=w(i.env),k$1=r.join(y,I(c)),A=r.join(y,I(n));return {rootPath:n,observationRootPath:c,statePath:k$1,mirrorStatePaths:A===k$1?[]:[A],scope:{kind:v,id:R,label:r.basename(n)||"project",portable:false}}}function U(t){let i=r.resolve(t.rootPath),e=r.resolve(t.observationRootPath);return {id:T("project",e),kind:e===i?"workspace-root":"project",label:r.basename(e)||t.scope.label}}function q(t,i){let e=r.resolve(i),o=r.relative(r.resolve(t),e);return o===""?".":!o.startsWith("..")&&!r.isAbsolute(o)?o.replaceAll("\\","/"):`<external>/${r.basename(e)}`}var P=200,O=14;function Q(t,i={}){let e=Math.max(10,i.maxRuns??P),o=Date.now()-Math.max(1,i.maxAgeDays??O)*24*60*60*1e3,s=[];try{s=p.readdirSync(t,{withFileTypes:true}).filter(n=>n.isFile()&&n.name.endsWith(".ndjson")).map(n=>{let c=r.join(t,n.name);return {path:c,mtimeMs:p.statSync(c).mtimeMs}}).sort((n,c)=>c.mtimeMs-n.mtimeMs);}catch{return 0}let a=0;for(let[n,c]of s.entries())if(!(n<e&&c.mtimeMs>=o))try{p.unlinkSync(c.path),a+=1;}catch{}return a}export{K as a,B as b,N as c,w as d,J as e,U as f,q as g,P as h,Q as i};
@@ -0,0 +1,157 @@
1
+ import {g,b,i as i$1,d as d$1,e as e$1,f}from'./chunk-RVAOJOXA.js';import {c}from'./chunk-FPDH3N3A.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 {a}from'./chunk-AFIFZTOY.js';import {d}from'./chunk-EWZZUQBR.js';import {h,e,i}from'./chunk-ZGHJIQXL.js';import {u,h as h$1,g as g$1}from'./chunk-VQZ5PI5J.js';import be from'crypto';import ne from'fs';import y from'fs/promises';import l from'path';import {execa}from'execa';import X from'fs-extra';async function Q(e,t){let[n,o]=await Promise.all([X.realpath(e).catch(()=>null),X.realpath(t).catch(()=>null)]);if(!n||!o)return null;let s=l.relative(n,o);return !s||l.isAbsolute(s)||s===".."||s.startsWith(`..${l.sep}`)?null:(await X.stat(o).catch(()=>null))?.isFile()?o:null}var Ne=h.projectContextAgent.schemaVersion,ft=["managed","local","off"],se="<!-- WORKSPAI:PROJECT-GROUNDING:START -->",ve="<!-- WORKSPAI:PROJECT-GROUNDING:END -->",ee="<!-- WORKSPAI:GENERATED-PROJECT-SKILL -->",B=".agents/skills/workspai-grounding/SKILL.md";function he(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 W(e){return e.replace(/\\/g,"/").replace(/^\.\/+/,"")}function _(e,t,n){let o=e.replace(/\\/g,"/"),s=/^[A-Za-z]:\//.test(o);if(!l.isAbsolute(e)&&!s)return W(o);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 W(i);let c=l.relative(t,a);return c&&!c.startsWith("..")&&!l.isAbsolute(c)?`workspace:${W(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 Ae(e,t){return he(e?.adoption)?.mode==="linked"?"adopted":he(e?.import)?"imported":t}function xe(e){if(!e.model)return null;let t=W(e.relativePath);return e.model.projects.find(n=>n.name===e.projectName||W(n.path)===t)??null}function U(e,t){e[t]=(e[t]??0)+1;}var fe=["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"],te=48,re=12*1024;function Le(e,t=te,n=re){let o={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 fe)s.set(u,e.filter(k=>k.kind===u).sort((k,f)=>k.label.localeCompare(f.label)||k.id.localeCompare(f.id)).slice(0,o[u]??6));let i=[],c={},h=0,p=0,d=true;for(;i.length<t&&d;){d=false;for(let u of fe){let k=s.get(u)?.[p];if(!k)continue;let f=Buffer.byteLength(JSON.stringify(k));if(!(h+f>n)&&(i.push(k),h+=f,U(c,u),d=true,i.length>=t))break}p+=1;}let m=Object.fromEntries(Object.entries(a).map(([u,k])=>[u,k-(c[u]??0)]).filter(([,u])=>u>0).sort(([u],[k])=>u.localeCompare(k)));return {entities:i,selectedBytes:h,selectedByKind:c,omittedByKind:m}}function $e(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:te,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(r=>r.kind==="project"&&(r.id===t||r.label===t||r.projectId===t)),o=new Set(e.entities.filter(r=>r.projectId===t||r.id===n?.id||r.kind==="project"&&r.label===t).map(r=>r.id));n&&o.add(n.id);let s=e.relations.filter(r=>o.has(r.from)||o.has(r.to)),a=new Set(o);for(let r of s)a.add(r.from),a.add(r.to);let i=e.entities.filter(r=>a.has(r.id)),c=new Set,h={},p={},d={},m=new Set(i.filter(r=>r.kind==="language").map(r=>r.attributes.language).filter(r=>typeof r=="string"));for(let r of i){U(h,r.kind);let w=typeof r.attributes.language=="string"?r.attributes.language:void 0;if(w&&r.kind==="language")d[w]={fileCount:typeof r.attributes.fileCount=="number"?r.attributes.fileCount:0,symbolCount:d[w]?.symbolCount??0,generatedFileCount:typeof r.attributes.generatedFileCount=="number"?r.attributes.generatedFileCount:0};else if(w&&(r.kind==="file"||r.kind==="symbol")){let b=d[w]??{fileCount:0,symbolCount:0,generatedFileCount:0};r.kind==="file"&&!m.has(w)?(b.fileCount+=1,r.attributes.generated===true&&(b.generatedFileCount+=1)):r.kind==="symbol"&&(b.symbolCount+=1),d[w]=b;}for(let b of r.proofIds)c.add(b);}for(let r of s){U(p,r.kind);for(let w of r.proofIds)c.add(w);}let u=e.proofs.filter(r=>c.has(r.id)),k=[...new Set(e.entities.filter(r=>a.has(r.id)&&r.projectId&&r.projectId!==t).map(r=>r.projectId))].sort(),f=e.diagnostics.filter(r=>(!r.entityIds||r.entityIds.length===0)&&(!r.relationIds||r.relationIds.length===0)||r.entityIds?.some(w=>a.has(w))||r.relationIds?.some(w=>s.some(b=>b.id===w))).map(r=>({code:r.code,severity:r.severity,message:r.message,...r.recommendation?{recommendation:r.recommendation}:{}})),j=(r,w)=>({project:w,kind:r.kind,source:r.source,confidence:r.confidence,evidence:[...new Set(r.evidence.map(b=>b.file.replace(/\\/g,"/")))].sort()}),P=e.projectTopology.edges.filter(r=>r.from===t).map(r=>j(r,r.to)).sort((r,w)=>`${r.project}:${r.kind}`.localeCompare(`${w.project}:${w.kind}`)),S=e.projectTopology.edges.filter(r=>r.to===t).map(r=>j(r,r.from)).sort((r,w)=>`${r.project}:${r.kind}`.localeCompare(`${w.project}:${w.kind}`)),N=Le(i),T=N.entities,L=i.filter(r=>r.kind==="runtime-unit"),E=new Set(T.map(r=>r.id)),$=[...s].sort((r,w)=>{let b=Number(E.has(r.from)||E.has(r.to));return Number(E.has(w.from)||E.has(w.to))-b||r.id.localeCompare(w.id)}).slice(0,16),D=new Set([...T.flatMap(r=>r.proofIds),...$.flatMap(r=>r.proofIds)]),g=u.filter(r=>D.has(r.id)).sort((r,w)=>r.id.localeCompare(w.id)).slice(0,16);return {entityCount:i.length,relationCount:s.length,proofCount:u.length,entitiesByKind:h,relationsByKind:p,languages:Object.fromEntries(Object.entries(d).sort(([r],[w])=>r.localeCompare(w))),semantic:{protocolConceptCount:h.protocol??0,protocolImplementationBindings:p["implements-protocol"]??0,equivalenceBindings:p["equivalent-to"]??0,generationBindings:(p["generated-from"]??0)+(p["generated-by"]??0),runtimeUnitCount:L.length,lifecycleStageCount:h["lifecycle-stage"]??0,runtimeCoverage:[...new Set(L.map(r=>r.attributes.runtime).filter(r=>typeof r=="string"))].sort()},projection:{mode:"stratified-byte-bounded",maxEntities:te,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(([r],[w])=>r.localeCompare(w))),omittedByKind:N.omittedByKind},relatedProjects:k,proofArtifacts:[...new Set(g.map(r=>r.artifact))].sort().slice(0,24),entities:T,relations:$,proofs:g,topology:{status:P.length>0||S.length>0?"proven":e.projectTopology.nodes.some(r=>r.id===t)?"unproven":"unavailable",dependencies:P,dependents:S},diagnostics:f}}function Ee(e,t,n){return Array.isArray(e)?e.map(o=>typeof o=="string"?I(o,t,n):o):typeof e=="string"?I(e,t,n):e}function Ge(e,t,n){return {id:e.id,kind:e.kind,label:I(e.label,t,n),attributes:Object.fromEntries(Object.entries(e.attributes).map(([o,s])=>[o,Ee(s,t,n)])),proofIds:[...e.proofIds].sort()}}function We(e,t,n){let o=(...a)=>e.filter(i=>a.includes(i.kind)).map(i=>Ge(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:Ee(c,t,n)}),s.length>=8))break;if(s.length>=8)break}return {services:o("service"),packages:o("package"),protocols:o("protocol"),runtimeUnits:o("runtime-unit"),lifecycleStages:o("lifecycle-stage"),apis:o("api"),endpoints:o("endpoint"),dataStores:o("database","queue"),deployments:o("container","deployment","environment"),pipelines:o("pipeline"),tests:o("test-suite"),owners:o("owner"),decisions:o("decision"),ports:s}}function Oe(e,t,n){let o=_(e.artifact,t,n);return o?{id:e.id,provider:e.provider,artifact:o,...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 Ke(e,t,n){let o=[],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}`))&&o.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),p=[...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(p)for(let d of c$1({project:p.project}))o.push({source:"doctor-project",severity:d.status==="blocking"?"error":"warning",message:I(d.message,e,t),...d.id?{code:d.id}:{}});return [...new Map(o.map(d=>[`${d.source}:${d.code??""}:${d.message}`,d])).values()].slice(0,32)}function oe(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=>oe(n,t)):e&&typeof e=="object"?Object.values(e).some(n=>oe(n,t)):false}function _e(e){return be.createHash("sha256").update(JSON.stringify(e)).digest("hex")}async function Fe(e$1){let t=l.resolve(e$1.workspacePath),n=l.resolve(e$1.projectPath),o=u(n,"project.json").find(g=>ne.existsSync(g)),s=o?await A(o):null,a$1=await A(l.join(t,".workspai","workspace.contract.json")),i$1=l.resolve(n),c=a$1?.projects?.find(g=>g.externalPath?l.resolve(g.externalPath)===i$1:!g.relativePath||g.relativePath.startsWith("external/")?false:l.resolve(t,g.relativePath)===i$1)??a$1?.projects?.find(g=>g.slug===e$1.projectName||g.slug===l.basename(n)),h=e$1.projectName??(typeof s?.name=="string"?s.name:void 0)??c?.slug??l.basename(n),p=c?.relativePath??(()=>{let g=W(l.relative(t,n));return !g||g.startsWith("..")?`external/${h}`:g})(),d$1=await A(l.join(t,e.model)),m=await A(l.join(t,e.knowledgeGraph)),u$1=d$1?d(d$1):void 0,k=!!(u$1&&m?.source.hash===u$1),f=xe({model:d$1,projectName:h,relativePath:p}),j=$e(k?m:null,h),P=await Ke(t,n,h),S=j.proofs.map(g=>g.freshness),N=m?!k||S.includes("stale")?"stale":S.includes("unknown")?"unknown":"fresh":"missing",T=d$1?d$1.factFreshness?.status??"unknown":"missing",L=[...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&&!k?[{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."}]:[]],E=Ae(s,e$1.relationship??c?.relationship??"managed"),$={schemaVersion:Ne,generatedAt:(e$1.now??new Date).toISOString(),workspace:{name:a$1?.workspace?.name??d$1?.workspace.name??l.basename(t),...a$1?.workspace?.profile||d$1?.workspace.profile?{profile:a$1?.workspace?.profile??d$1?.workspace.profile}:{},relationship:E,contract:`workspace:${i.workspaceContract}`,projectKnowledgeGraph:i.projectKnowledgeGraphReference,model:`workspace:${e.model}`,knowledgeGraph:`workspace:${e.knowledgeGraph}`,index:`workspace:${e.agentIndex}`,context:`workspace:${e.agentContext}`,skillsIndex:`workspace:${e.skillsIndex}`,boundedGraphSearch:`workspai workspace graph search <task-query> --scope project:${h} --limit 12 --json`,access:{localBinding:i.projectWorkspaceLink,canonicalEvidenceAvailableAtGeneration:true,identityIsFilesystemPath:false,resolverCommand:"workspai project workspace status --json",portableUriScheme:"workspace:",resolvedPathPolicy:"runtime-private-never-persist"}},project:{name:h,relativePath:p,...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(g=>_(g,t,n)).filter(g=>g!==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:k},topology:{...j.topology,dependencies:j.topology.dependencies.map(g=>({...g,evidence:g.evidence.map(r=>_(r,t,n)).filter(r=>r!==null)})),dependents:j.topology.dependents.map(g=>({...g,evidence:g.evidence.map(r=>_(r,t,n)).filter(r=>r!==null)}))},surfaces:We(j.entities,t,n),diagnostics:[...L,...j.diagnostics].map(g=>({...g,message:I(g.message,t,n),...g.recommendation?{recommendation:I(g.recommendation,t,n)}:{}}))},evidence:{readOrder:[b,".workspai/PROJECT-GROUNDING.md",i.projectContextAgent,"AGENTS.md","workspace:.workspai/goals/index.json",`workspace:${i.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(g=>_(g,t,n)).filter(g=>g!==null))],relations:j.relations.map(g=>({id:g.id,from:g.from,to:g.to,kind:g.kind,derivation:g.derivation,trust:g.trust,confidence:g.confidence,proofIds:[...g.proofIds].sort()})),proofs:j.proofs.map(g=>Oe(g,t,n)).filter(g=>g!==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",i.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(oe($,[t,n]))throw new Error("Project context lens rejected a non-portable absolute path.");let D={...$,integrity:{algorithm:"sha256",...u$1?{modelHash:u$1}:{},payloadHash:_e($),portable:true,absolutePathsEmitted:false}};return a(D,"contracts/workspace-intelligence/project-context-agent.v1.json","Project context agent"),D}function Be(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
+ `):"- No project-scoped graph diagnostic is currently recorded.",o=e.blockers.length>0?e.blockers.slice(0,12).map(s=>`- **${s.severity}${s.code?` \xB7 ${s.code}`:""}:** ${s.message}`).join(`
3
+ `):"- No current project-scoped blocker is recorded.";return `# Workspai project grounding
4
+
5
+ This project is adopted into the **${e.workspace.name}** Workspai workspace.
6
+ That value is the canonical workspace identity, not its filesystem path. Workspai
7
+ commands launched here resolve the machine-local workspace automatically.
8
+
9
+ ## Mandatory first contact
10
+
11
+ Do not begin broad repository discovery, architecture claims, planning, or mutation
12
+ until this sequence is complete:
13
+
14
+ 1. Read \`${b}\` to discover the portable protocol.
15
+ 2. Run \`workspai agent bootstrap --for-agent generic --strict --json\`.
16
+ 3. Follow the receipt's \`requiredReadOrder\` exactly.
17
+ 4. Read \`.workspai/reports/project-context-agent.json\`.
18
+ 5. If the receipt reports an active Goal, read its immutable Goal Pack and agent
19
+ handoff before choosing or expanding work.
20
+ 6. Read the compact workspace Skills index and load only a matching playbook.
21
+ 7. Query the bounded Workspace Graph with the user's actual task before opening broad
22
+ source, then inspect only returned proof paths and targeted live files.
23
+
24
+ Receipt policy:
25
+
26
+ - \`ready\`: continue with bounded evidence and targeted source inspection.
27
+ - \`degraded\`: disclose the limitation and do not claim complete architecture or verification.
28
+ - \`blocked\`: stop governed claims, execute \`nextActions\`, and rerun bootstrap.
29
+
30
+ ## Workspace location and portable paths
31
+
32
+ - \`${e.workspace.name}\` is an identity, not a directory name to guess.
33
+ - Project-local paths begin with \`.workspai/\`.
34
+ - Canonical workspace paths begin with \`workspace:\`.
35
+ - Resolve the exact local workspace root only when direct file access is necessary by
36
+ running \`workspai project workspace status --json\` from this project.
37
+ - The resolver's absolute paths are machine-local runtime data. Never persist or copy
38
+ them into answers, shared logs, commits, prompts, telemetry, or portable artifacts.
39
+
40
+ ## Authority boundary
41
+
42
+ The Workspace Model owns canonical project identity and its compact \`projectTopology\`.
43
+ The Workspace Knowledge Graph is a separate, proof-backed enrichment containing
44
+ files, symbols, APIs, infrastructure, tests, owners, and decisions. Do not treat
45
+ an unproven topology edge as proof that two projects are independent. Live source owns
46
+ exact implementation. CLI evidence owns Goal, readiness, repair, and verification claims.
47
+ Repository-authored instructions remain authoritative for source changes after this
48
+ entry gate; Workspai preserves rather than replaces them.
49
+
50
+ ## Knowledge Graph routing
51
+
52
+ - Project graph reference: \`${e.workspace.projectKnowledgeGraph}\`. It integrity-binds
53
+ this project to its exact canonical projection without duplicating the full graph.
54
+ - Workspace aggregate: \`${e.workspace.knowledgeGraph}\`. Resolve it through the
55
+ workspace binding only for cross-project or workspace-wide consumption.
56
+ - Default agent path: use the bounded graph-search command below; resolve the canonical
57
+ graph only when the task explicitly requires full graph interchange.
58
+
59
+ ## Project
60
+
61
+ - Name: \`${e.project.name}\`
62
+ - Workspace-relative identity: \`${e.project.relativePath}\`
63
+ - Runtime: \`${e.project.runtime??"unknown"}\`
64
+ - Framework: \`${e.project.framework??"unknown"}\`
65
+ - Relationship: \`${e.workspace.relationship}\`
66
+ - Related projects: ${t}
67
+ - Topology status: \`${e.intelligence.topology.status}\`
68
+ - Model freshness: \`${e.intelligence.freshness.model}\`
69
+ - Knowledge Graph freshness: \`${e.intelligence.freshness.graph}\`
70
+
71
+ ## Current evidence coverage
72
+
73
+ - Project-scoped entities: ${e.intelligence.entityCount}
74
+ - Project-scoped relations: ${e.intelligence.relationCount}
75
+ - Portable proofs: ${e.intelligence.proofCount}
76
+
77
+ ${n}
78
+
79
+ ## Current project blockers
80
+
81
+ ${o}
82
+
83
+ ## Safe commands from this project
84
+
85
+ \`\`\`bash
86
+ ${e.commands.workspaceStatus}
87
+ ${e.commands.doctor}
88
+ ${e.commands.graphSearch}
89
+ ${e.commands.verify}
90
+ \`\`\`
91
+
92
+ The machine-local workspace binding lives only in
93
+ \`.workspai/workspace-link.local.json\`, which is gitignored. Portable grounding files
94
+ never publish its value.
95
+ `}function Me(e){return `# Workspai agent entry gate (mandatory)
96
+
97
+ - Project: \`${e.project.name}\`
98
+ - Workspace identity: \`${e.workspace.name}\` (logical name, not a filesystem path)
99
+ - Entry contract: \`${b}\`
100
+
101
+ Before broad repository discovery, architecture claims, planning, or mutation:
102
+
103
+ 1. Read \`${b}\`.
104
+ 2. Run \`workspai agent bootstrap --for-agent generic --strict --json\`.
105
+ 3. Follow the receipt's \`requiredReadOrder\` exactly.
106
+ 4. If a Goal is active, read its immutable Goal Pack and handoff before acting.
107
+ 5. Read the compact workspace Skills index and load only a matching playbook.
108
+ 6. Query the bounded Workspace Graph with the user's task, then inspect only returned proofs and targeted live source.
109
+
110
+ Receipt policy: \`ready\` may proceed; \`degraded\` must disclose limitations and may not claim complete architecture or verification; \`blocked\` must stop governed claims, execute \`nextActions\`, and rerun bootstrap.
111
+
112
+ \`workspace:\` paths belong to the canonical workspace, not this project's \`.workspai\` directory. Resolve their machine-local root at runtime with \`workspai project workspace status --json\`. That output is machine-local: never copy it into answers, shared logs, commits, or portable artifacts.
113
+
114
+ Authority: Workspai evidence owns identity, topology, goals, readiness, and verification. Live source and repository-authored rules own exact implementation and source conventions.`}function ke(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function q(e,t){return new RegExp(`${ke(e)}[\\s\\S]*?${ke(t)}`,"m")}function Ce(e){let t=e.replace(q(se,ve),"");return d$2(t)?.includes("# Workspai project boundary")&&(t=t.replace(q(a$1,b$1),"")),t.replace(/\n{3,}/g,`
115
+
116
+ `).trim()}function De(e,t){let n=Ce(e),o=`${se}
117
+ ${t.trim()}
118
+ ${ve}`;return n?`${o}
119
+
120
+ ${n}
121
+ `:`${o}
122
+ `}async function x(e,t){await y.mkdir(l.dirname(e),{recursive:true});let n=`${e}.${process.pid}.${be.randomUUID()}.tmp`;try{await y.writeFile(n,t,"utf8");try{await y.rename(n,e);}catch(o){let s=o.code;if(s!=="EEXIST"&&s!=="EPERM")throw o;await X.move(n,e,{overwrite:true});}}finally{await y.rm(n,{force:true}).catch(()=>{});}}async function F(e,t){let n=l.resolve(e),o=await y.realpath(n).catch(()=>n),s=l.resolve(t),a=l.relative(n,s);if(!a||a===".."||a.startsWith(`..${l.sep}`)||l.isAbsolute(a))throw new Error("Project agent output path must remain inside the project.");let i=a.split(l.sep),c=n;for(let[h,p]of i.entries()){c=l.join(c,p);let d=await y.lstat(c).catch(u=>{if(u.code==="ENOENT")return null;throw u});if(!d)return l.join(c,...i.slice(h+1));let m=h===i.length-1;if(d.isSymbolicLink()){if(m)throw new Error(`Project agent output is blocked by authored state: ${a}`);let u=await y.realpath(c),k=l.relative(o,u),f=await y.stat(u);if(k===".."||k.startsWith(`..${l.sep}`)||l.isAbsolute(k)||!f.isDirectory())throw new Error(`Project agent output is blocked by authored state: ${a}`);c=u;continue}if(m?!d.isFile():!d.isDirectory())throw new Error(`Project agent output is blocked by authored state: ${a}`)}return c}async function kt(e$1){let t=l.join(e$1.projectPath,".agents","skills");try{await F(e$1.projectPath,l.join(t,"workspai-grounding","SKILL.md"));}catch{return []}let n=await A(l.join(e$1.workspacePath,e.skillsIndex)),o=new Set([B,...(n?.skills??[]).map(i=>`.agents/skills/${i.skillId}/SKILL.md`)]),s=await y.readdir(t,{withFileTypes:true}).catch(i=>{if(i.code==="ENOENT")return [];throw i});for(let i of s)i.isDirectory()&&i.name.startsWith("workspai-")&&o.add(`.agents/skills/${i.name}/SKILL.md`);let a=[];for(let i of o){let c=l.join(e$1.projectPath,i);a.push(await F(e$1.projectPath,c));}return a}function Je(e,t){let n=t?.skillId??"workspai-grounding",o=t?.title??"Workspai project grounding",s=t?`workspace:${t.path}`:null;return ["---",`name: ${n}`,`description: ${JSON.stringify(`${o} through the Workspai project intelligence contract`)}`,"---","",ee,"",`# ${o}`,"",`This is a portable project entry for \`${e.project.name}\`. It contains no machine-local workspace path.`,"","## Workflow","",`1. Read \`${b}\`.`,"2. Run `workspai agent bootstrap --for-agent generic --strict --json`.","3. Continue only when the receipt permits it and follow its bounded `requiredReadOrder`.",...s?[`4. Resolve and follow the canonical Skill \`${s}\` listed in \`workspace:.workspai/reports/workspace-skills-index.json\`.`,`5. Query the graph with \`workspai workspace graph search <task-query> --scope project:${e.project.name} --limit 12 --json\` before broad source inspection.`]:["4. Load only the matching canonical Skill from `workspace:.workspai/reports/workspace-skills-index.json`.",`5. Query the graph with \`workspai workspace graph search <task-query> --scope project:${e.project.name} --limit 12 --json\` before broad source inspection.`],"","Repository-authored instructions and live source remain authoritative for exact implementation.",""].join(`
123
+ `)}async function we(e$1){let t=l.join(e$1.projectPath,".agents","skills"),n=await A(l.join(e$1.workspacePath,e.skillsIndex)),o=e$1.context?[{relativePath:B,skill:void 0},...(n?.skills??[]).map(p=>({relativePath:`.agents/skills/${p.skillId}/SKILL.md`,skill:p}))]:[],s=new Set(o.map(p=>p.relativePath)),a=[],i=[],c=[];try{await F(e$1.projectPath,l.join(t,"workspai-grounding","SKILL.md"));}catch(p){return {availableFiles:a,writtenFiles:i,authoredCollisions:c,reason:String(p)}}if(e$1.mode==="managed"&&e$1.context)for(let p of o){let d=l.join(e$1.projectPath,p.relativePath),m=await F(e$1.projectPath,d),u=await y.readFile(m,"utf8").catch(f=>{if(f.code==="ENOENT")return "";throw f});if(u&&!u.includes(ee)){a.push(p.relativePath),c.push(p.relativePath);continue}let k=Je(e$1.context,p.skill);k!==u&&await x(m,k),a.push(p.relativePath),i.push(p.relativePath);}let h=await y.readdir(t,{withFileTypes:true}).catch(p=>{if(p.code==="ENOENT")return [];throw p});for(let p of h){if(!p.isDirectory()||!p.name.startsWith("workspai-"))continue;let d=`.agents/skills/${p.name}/SKILL.md`;if(e$1.mode==="managed"&&s.has(d))continue;let m=l.join(e$1.projectPath,d),u=await F(e$1.projectPath,m);(await y.readFile(u,"utf8").catch(()=>"")).includes(ee)&&await y.rm(l.dirname(u),{recursive:true,force:true});}return {availableFiles:a,writtenFiles:i,authoredCollisions:c}}async function Re(e,t){let n;try{n=await execa("git",["rev-parse","--show-toplevel"],{cwd:e,reject:false});}catch{return false}if(n?.exitCode!==0)return false;let o=n.stdout.trim();if(!o)return false;let s,a;try{[s,a]=await Promise.all([y.realpath(l.resolve(o)),y.realpath(e)]);}catch{return false}let i=l.resolve(a,t),c=l.relative(s,i).replace(/\\/g,"/");if(!c||l.isAbsolute(c)||c===".."||c.startsWith("../"))return false;let h;try{h=await execa("git",["cat-file","-e",`HEAD:${c}`],{cwd:s,reject:false});}catch{return false}if(h?.exitCode!==0)return false;let p;try{p=await execa("git",["ls-files","--deleted","--error-unmatch","--",`:(top)${c}`],{cwd:s,reject:false});}catch{return false}return p?.exitCode===0}async function ye(e,t){let n=l.join(e,".gitignore"),o=await y.readFile(n,"utf8").catch(c=>{if(c.code==="ENOENT")return "";throw c}),s=[g$1,h$1,b],a=o.split(/\r?\n/).filter(c=>c.trim()!=="# Workspai local project grounding"&&!s.includes(c.trim()));for(;a.length>0&&a[a.length-1]==="";)a.pop();t==="local"&&(a.length>0&&a.push(""),a.push("# Workspai local project grounding",...s));let i=a.length>0?`${a.join(`
124
+ `)}
125
+ `:"";i!==o&&await x(n,i);}var M=[{host:"claude",relativePath:"CLAUDE.md",importFromAgents:"@AGENTS.md",importFromGrounding:"@.workspai/PROJECT-GROUNDING.md"},{host:"gemini",relativePath:"GEMINI.md",importFromAgents:"@./AGENTS.md",importFromGrounding:"@./.workspai/PROJECT-GROUNDING.md"},{host:"qwen",relativePath:"QWEN.md",importFromAgents:"@AGENTS.md",importFromGrounding:"@.workspai/PROJECT-GROUNDING.md"},{host:"amazon-q",relativePath:".amazonq/rules/workspai-agent-entry.md",importFromAgents:"",importFromGrounding:""}];if(M.length!==g.length||M.some((e,t)=>e.relativePath!==g[t]))throw new Error("Project agent adapter paths must match the portable entry contract.");async function Ue(e,t){let n=t.split("/").slice(0,-1),o=e;for(let s of n){o=l.join(o,s);let a=await y.lstat(o).catch(i=>{if(i.code==="ENOENT")return null;throw i});if(!a)return null;if(a.isSymbolicLink()||!a.isDirectory())return l.relative(e,o).split(l.sep).join("/")}return null}function qe(e){let t=e.agentsAvailable?e.adapter.importFromAgents:e.adapter.importFromGrounding;return t?`${e.importAlreadyPresent?"":`${t}
126
+
127
+ `}# Workspai host binding \xB7 ${e.adapter.host}
128
+
129
+ The imported Workspai entry gate is mandatory. Validate this host with
130
+ \`workspai agent bootstrap --for-agent ${e.adapter.host} --strict --json\`, then follow
131
+ the receipt's \`requiredReadOrder\`, Goal handoff, bounded Graph queries, proof paths,
132
+ status policy, workspace locator privacy policy, and authority boundary. Do not repeat
133
+ the imported instructions or replace repository-authored source rules.`:`# Workspai entry for ${e.adapter.host}
134
+
135
+ Before broad repository discovery, architecture claims, planning, or mutation:
136
+
137
+ 1. Read \`${b}\`.
138
+ 2. Run \`workspai agent bootstrap --for-agent ${e.adapter.host} --strict --json\`.
139
+ 3. Follow \`requiredReadOrder\`, any active Goal handoff, bounded Graph queries, and returned proof paths.
140
+
141
+ Receipt policy: \`ready\` may proceed; \`degraded\` must disclose limitations; \`blocked\` must execute \`nextActions\` and rerun bootstrap before governed claims.
142
+
143
+ The workspace name is a logical identity, not a path. Resolve \`workspace:\` URIs at runtime with \`workspai project workspace status --json\`; its absolute paths are machine-local and must never be copied into shared output or portable artifacts. Live source owns exact implementation; Workspai evidence owns identity, topology, goals, readiness, and verification. Repository-authored rules remain authoritative for source changes after this entry gate.`}async function je(e){let t=await Ue(e.projectPath,e.adapter.relativePath);if(t)return {reason:`${e.adapter.relativePath} has an unsafe repository-authored parent at ${t}.`};let n=l.join(e.projectPath,e.adapter.relativePath),o=n,s=await y.lstat(n).catch(m=>{if(m.code==="ENOENT")return null;throw m});if(s?.isSymbolicLink()){let m=await Q(e.projectPath,n);if(!m)return {reason:`${e.adapter.relativePath} is a symbolic link without a safe repository-local file target.`};let u=await y.readFile(m,"utf8");if(e.agentsAvailable&&u.includes(se)){let f=`${u.replace(q(d$1,e$1),"").replace(/\n{3,}/g,`
144
+
145
+ `).trimEnd()}
146
+ `;return f!==u&&await x(m,f),{path:e.adapter.relativePath}}if(u.includes(d$1))return {path:e.adapter.relativePath};o=m;}let a=s?.isFile()===true,i=await y.readFile(o,"utf8").catch(m=>{if(m.code==="ENOENT")return "";throw m});if(e.mode==="managed"&&!a&&await Re(e.projectPath,e.adapter.relativePath))return {reason:`${e.adapter.relativePath} has an authored tracked deletion.`};let c=i.replace(q(d$1,e$1),"").replace(/\n{3,}/g,`
147
+
148
+ `).trim(),h=!!(e.agentsAvailable&&e.adapter.importFromAgents&&c.split(/\r?\n/u).some(m=>m.trim()===e.adapter.importFromAgents)),p=e.mode==="managed"?[c,`${d$1}
149
+ ${qe({...e,importAlreadyPresent:h}).trim()}
150
+ ${e$1}`].filter(Boolean).join(`
151
+
152
+ `):c;if(!p)return a&&!s?.isSymbolicLink()&&await y.rm(o,{force:true}),{};let d=`${p.trimEnd()}
153
+ `;return d!==i&&await x(o,d),e.mode==="managed"?{path:e.adapter.relativePath}:{}}function He(e){let t={id:"generic",discovery:"portable-fallback",entryFiles:[g$1],status:"ready",managed:e.mode==="managed"},o=["codex","kimi","grok","copilot","cursor","windsurf"].map(i=>({id:i,discovery:"native",entryFiles:["AGENTS.md",...["codex","kimi","grok"].includes(i)&&e.portableSkillsAvailable?[B]:[]],status:e.agentsAvailable?["codex","kimi","grok"].includes(i)&&!e.portableSkillsAvailable?"blocked":["codex","kimi","grok"].includes(i)&&e.portableGroundingAuthoredCollision?"degraded":"ready":"blocked",managed:e.mode==="managed"&&e.agentsAvailable&&(!["codex","kimi","grok"].includes(i)||e.portableSkillsAvailable&&!e.portableGroundingAuthoredCollision),...e.agentsAvailable?["codex","kimi","grok"].includes(i)&&!e.portableSkillsAvailable?{reason:e.portableSkillsReason??"The provider-neutral project Skill projection could not be generated safely."}:["codex","kimi","grok"].includes(i)&&e.portableGroundingAuthoredCollision?{reason:"An authored Skill occupies the Workspai grounding path; it was preserved and AGENTS.md remains the fallback entry."}:{}:{reason:"AGENTS.md could not be managed without overriding authored repository state."}})),s=M.map(i=>{let c=e.adapters.get(i.host);return {id:i.host,discovery:"adapter",entryFiles:[i.relativePath],status:c?.path?"ready":e.mode==="managed"?"blocked":"degraded",managed:!!c?.path,...c?.path?{}:{reason:c?.reason??"Provider adapter generation is disabled by the project grounding policy."}}}),a=[t,...o,...s];return f.map(i=>a.find(c=>c.id===i))}async function Pe(e,t,n){let o=l.join(e,"AGENTS.md"),s=await y.lstat(o).catch(d=>{if(d.code==="ENOENT")return null;throw d}),a=s?.isSymbolicLink()?await Q(e,o):o;if(!a)return;let i=s?.isFile()===true||s?.isSymbolicLink()===true,c=await y.readFile(a,"utf8").catch(d=>{if(d.code==="ENOENT")return "";throw d});if(t==="managed"&&!n)throw new Error("Managed project grounding requires a project context.");if(t==="managed"&&!i&&await Re(e,"AGENTS.md"))return;let h=t==="managed"&&n?De(c,Me(n)):Ce(c);if(!h){i&&!s?.isSymbolicLink()&&await y.rm(a,{force:true});return}let p=`${h.trimEnd()}
154
+ `;return p!==c&&await x(a,p),t==="managed"?o:void 0}async function ze(e){let t=e.mode??"managed",n=l.resolve(e.workspacePath),o=l.resolve(e.projectPath);if(t==="off"){let P=u(o,"project.json").find(E=>ne.existsSync(E)),S=P?await A(P):null,N=e.projectName??(typeof S?.name=="string"?S.name:void 0)??l.basename(o),T=Ae(S,e.relationship??"managed"),L=await c({workspacePath:n,projectPath:o,projectName:N,relationship:T,now:e.now});return await ye(o,t),await Pe(o,t),await we({workspacePath:n,projectPath:o,mode:t}),await Promise.all(M.map(E=>je({projectPath:o,adapter:E,mode:t,agentsAvailable:false}))),await Promise.all([y.rm(l.join(o,h$1),{force:true}),y.rm(l.join(o,g$1),{force:true}),y.rm(l.join(o,b),{force:true}),y.rm(l.join(o,i.projectKnowledgeGraphReference),{force:true})]),{mode:t,projectPath:o,linkPath:L.linkPath,writtenFiles:[i.projectWorkspaceLink]}}let s=await Fe(e),a=s.workspace.relationship,i$2=await c({workspacePath:n,projectPath:o,projectName:s.project.name,relationship:a,workspaceName:s.workspace.name,relativePath:s.project.relativePath,now:e.now});await ye(o,t);let c$1=await Pe(o,t,s),h=new Map;for(let P of M)h.set(P.host,await je({projectPath:o,adapter:P,mode:t,agentsAvailable:!!c$1}));let p=await we({workspacePath:n,projectPath:o,mode:t,context:s}),d=He({mode:t,agentsAvailable:!!c$1,portableSkillsAvailable:p.availableFiles.includes(B),portableGroundingAuthoredCollision:p.authoredCollisions.includes(B),...p.reason?{portableSkillsReason:p.reason}:{},adapters:h}),m=l.join(o,h$1),u$1=l.join(o,g$1),k=l.join(o,b),f=i$1({context:s,hosts:d});await x(m,`${JSON.stringify(s,null,2)}
155
+ `),await x(u$1,`${Be(s).trimEnd()}
156
+ `),await x(k,`${JSON.stringify(f,null,2)}
157
+ `);let j=[i.projectWorkspaceLink,h$1,g$1,b];c$1&&j.push("AGENTS.md");for(let P of h.values())P.path&&j.push(P.path);return j.push(...p.writtenFiles),{mode:t,projectPath:o,linkPath:i$2.linkPath,groundingPath:u$1,contextPath:m,agentEntryPath:k,agentsPath:c$1,hostCoverage:d,writtenFiles:j}}async function wt(e){let t=l.resolve(e.workspacePath),n=e.mode??"managed",o=await Ve(t),s=[],a=[];for(let i of o.resolved)try{s.push(await ze({workspacePath:t,projectPath:i.projectPath,projectName:i.name,relationship:i.relationship,mode:n,now:e.now}));}catch(c){a.push({name:i.name,reason:c instanceof Error?c.message:String(c)});}return {workspacePath:t,mode:n,projects:s,skipped:[...o.skipped,...a]}}async function Ve(e){let t=l.resolve(e),n=await A(l.join(t,".workspai","workspace.contract.json")),o=[],s=[];for(let a of n?.projects??[]){let i=a.slug??a.relativePath??"unknown-project",c=typeof a.externalPath=="string"?l.resolve(a.externalPath):typeof a.relativePath=="string"&&!a.relativePath.startsWith("external/")?l.resolve(t,a.relativePath):null;if(!c||!ne.existsSync(c)){s.push({name:i,reason:"project path is unavailable on this machine"});continue}o.push({name:i,projectPath:c,relationship:a.relationship??"managed"});}return {resolved:o,skipped:s}}export{Q as a,Ne as b,ft as c,se as d,ve as e,ee as f,B as g,Le as h,Fe as i,kt as j,ze as k,wt as l,Ve as m};