workspai 0.68.0 → 0.69.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 (175) hide show
  1. package/README.md +38 -18
  2. package/contracts/cli-runtime-command-inventory.v1.snapshot.json +459 -0
  3. package/contracts/extension-cli-compatibility.v1.json +11 -0
  4. package/contracts/published-contract-catalog.v1.json +55 -0
  5. package/contracts/runtime-command-surface.v1.json +282 -0
  6. package/contracts/workspace-intelligence/architecture-change-lease.v1.json +50 -0
  7. package/contracts/workspace-intelligence/architecture-surprise-report.v1.json +46 -0
  8. package/contracts/workspace-intelligence/change-operation-result.v1.json +43 -0
  9. package/contracts/workspace-intelligence/decision-checkpoint.v1.json +18 -0
  10. package/contracts/workspace-intelligence/decision-event.v1.json +134 -0
  11. package/contracts/workspace-intelligence/decision-transaction.v1.json +29 -0
  12. package/contracts/workspace-intelligence/goal-index.v1.json +13 -0
  13. package/contracts/workspace-intelligence/goal-pack.v1.json +2 -1
  14. package/contracts/workspace-intelligence/predicted-architecture-change.v1.json +34 -0
  15. package/contracts/workspace-intelligence/proof-carrying-change-capsule-export.v1.json +14 -0
  16. package/contracts/workspace-intelligence/proof-carrying-change-capsule-validation.v1.json +16 -0
  17. package/contracts/workspace-intelligence/proof-carrying-change-capsule.v1.json +62 -0
  18. package/contracts/workspace-intelligence/proof-carrying-change-list.v1.json +80 -0
  19. package/contracts/workspace-intelligence/workspace-knowledge-graph-change-overlay.v1.json +9 -1
  20. package/dist/analyze-GPYPXXRT.js +1 -0
  21. package/dist/{artifact-remediation-plan-I7IKC5MR.js → artifact-remediation-plan-JHHZ4L24.js} +1 -1
  22. package/dist/autopilot-release-FL47VMF7.js +1 -0
  23. package/dist/capabilities-command-MYSLJIYS.js +1 -0
  24. package/dist/chunk-2LZWBUJD.js +1 -0
  25. package/dist/{chunk-7DDEMDG2.js → chunk-37ZLNFV5.js} +2 -2
  26. package/dist/{chunk-OFYY4725.js → chunk-3G5FF2JZ.js} +1 -1
  27. package/dist/chunk-3HFFKW4Q.js +2 -0
  28. package/dist/{chunk-BHM6RHTA.js → chunk-3WHE7V4M.js} +1 -1
  29. package/dist/chunk-A3MYO55A.js +3 -0
  30. package/dist/chunk-ABMB6MJT.js +1 -0
  31. package/dist/chunk-AD4ZY3RF.js +12 -0
  32. package/dist/chunk-BM2F5C4J.js +1 -0
  33. package/dist/chunk-COICGD62.js +1 -0
  34. package/dist/{chunk-4WVOAX2V.js → chunk-DWL3PPLA.js} +1 -1
  35. package/dist/{chunk-3Z4SVBMR.js → chunk-EBEAJIBI.js} +1 -1
  36. package/dist/chunk-EBQS5T7Q.js +7 -0
  37. package/dist/{chunk-5OV2WXAR.js → chunk-EG6EZ7HW.js} +1 -1
  38. package/dist/chunk-ERVWW5HX.js +1 -0
  39. package/dist/chunk-EZPLMAW2.js +1 -0
  40. package/dist/chunk-FIK343LI.js +1 -0
  41. package/dist/chunk-GSSJJS5M.js +6 -0
  42. package/dist/{chunk-TMRCPT7S.js → chunk-GYN6RPNU.js} +1 -1
  43. package/dist/{chunk-6E2Y3XGT.js → chunk-HCFOVANQ.js} +1 -1
  44. package/dist/chunk-I3UCODXU.js +1 -0
  45. package/dist/{chunk-3BMYMZQB.js → chunk-IGJA6GBQ.js} +1 -1
  46. package/dist/{chunk-FX5J6JCK.js → chunk-IVYPC36J.js} +1 -1
  47. package/dist/chunk-K33JJVQZ.js +2 -0
  48. package/dist/{chunk-KDY4X7SQ.js → chunk-M37ALD4V.js} +1 -1
  49. package/dist/{chunk-3XF7O66C.js → chunk-MAWHHHU3.js} +5 -5
  50. package/dist/chunk-MBICKDYP.js +1 -0
  51. package/dist/{chunk-QMQBX3RV.js → chunk-MGL6DBOR.js} +1 -1
  52. package/dist/chunk-MHQHRMKU.js +5 -0
  53. package/dist/{chunk-2C5XJBYI.js → chunk-N2Q4MSSP.js} +64 -64
  54. package/dist/chunk-N4B2M44I.js +1 -0
  55. package/dist/chunk-NSH7TTSV.js +1 -0
  56. package/dist/chunk-O5XQP5E7.js +1 -0
  57. package/dist/chunk-ODK4LCEL.js +1 -0
  58. package/dist/chunk-OU3BBWH5.js +49 -0
  59. package/dist/chunk-OZXCNVGW.js +2 -0
  60. package/dist/{chunk-SLFOUSRW.js → chunk-QYEQVNBF.js} +1 -1
  61. package/dist/chunk-RVOW3BHQ.js +2 -0
  62. package/dist/chunk-TKXRP2B4.js +1 -0
  63. package/dist/chunk-UNXG3ZFV.js +1 -0
  64. package/dist/chunk-UW4SESKD.js +2 -0
  65. package/dist/{chunk-2MTJWPQ4.js → chunk-V52R2W2Q.js} +1 -1
  66. package/dist/chunk-V6TIT6M3.js +157 -0
  67. package/dist/chunk-VNKAISFE.js +8 -0
  68. package/dist/chunk-W6WRT77T.js +1 -0
  69. package/dist/chunk-WHR5SL33.js +4 -0
  70. package/dist/{chunk-IXXQMD34.js → chunk-WZ5V5U2K.js} +1 -1
  71. package/dist/chunk-XPGCFVGC.js +4 -0
  72. package/dist/chunk-YKY4JFCF.js +1 -0
  73. package/dist/{chunk-VIN7NJW3.js → chunk-YWZBGSFE.js} +3 -3
  74. package/dist/chunk-YZL7ZY7J.js +2 -0
  75. package/dist/{create-U5PQHOZ4.js → create-GWBQ74ZI.js} +1 -1
  76. package/dist/doctor-OQAXSMEM.js +1 -0
  77. package/dist/goal-lifecycle-YWBVQ2DF.js +1 -0
  78. package/dist/goal-pack-KUXPZVNO.js +1 -0
  79. package/dist/index.d.ts +35 -2
  80. package/dist/index.js +239 -239
  81. package/dist/pipeline-PGB5TEV3.js +5 -0
  82. package/dist/{project-agent-entry-MH7364BE.js → project-agent-entry-H3JAGNLS.js} +1 -1
  83. package/dist/{project-intelligence-lens-ZCCHUKVI.js → project-intelligence-lens-7NMKHV5N.js} +1 -1
  84. package/dist/{project-test-coverage-JPWTBSSJ.js → project-test-coverage-3DKZKLWY.js} +1 -1
  85. package/dist/proof-carrying-change-QFH7WI2E.js +1 -0
  86. package/dist/verified-goal-7XHRWYSE.js +1 -0
  87. package/dist/{workspace-B33BFZZ3.js → workspace-TJHCETBV.js} +1 -1
  88. package/dist/{workspace-agent-sync-T3MJO2MX.js → workspace-agent-sync-Z35NTXCB.js} +1 -1
  89. package/dist/{workspace-archive-NOSGRKRZ.js → workspace-archive-OSMU3CK6.js} +1 -1
  90. package/dist/{workspace-context-KOCEP4MJ.js → workspace-context-KNJQUJWC.js} +1 -1
  91. package/dist/{workspace-contract-MQ3QE52V.js → workspace-contract-VIUQT5SZ.js} +1 -1
  92. package/dist/workspace-explain-HM6GMK26.js +1 -0
  93. package/dist/workspace-explain-contract-KV7RTEJU.js +1 -0
  94. package/dist/{workspace-feedback-3YLIUFQ7.js → workspace-feedback-YSPEGCON.js} +1 -1
  95. package/dist/{workspace-foundation-O7O3QIS4.js → workspace-foundation-PLXFPI3J.js} +1 -1
  96. package/dist/{workspace-graph-stream-XTGGBD7D.js → workspace-graph-stream-FNRQ2FTB.js} +1 -1
  97. package/dist/workspace-graph-token-efficiency-WNAFAN2F.js +1 -0
  98. package/dist/{workspace-history-7HDZZ4G5.js → workspace-history-HDDFG6LH.js} +1 -1
  99. package/dist/{workspace-intelligence-TFEQBPUP.js → workspace-intelligence-QLSD5EEV.js} +1 -1
  100. package/dist/{workspace-intelligence-benchmark-PLVUBGWO.js → workspace-intelligence-benchmark-S5OXVNLC.js} +1 -1
  101. package/dist/{workspace-intelligence-evaluation-OJIQS5SN.js → workspace-intelligence-evaluation-QDSOOUHH.js} +1 -1
  102. package/dist/{workspace-intelligence-runner-6ZAV6RO4.js → workspace-intelligence-runner-4EW4T2OW.js} +1 -1
  103. package/dist/workspace-intelligence-runtime-registry-ZLPF7BAY.js +1 -0
  104. package/dist/{workspace-knowledge-graph-AUXYL3L6.js → workspace-knowledge-graph-EEOW5VAJ.js} +1 -1
  105. package/dist/workspace-knowledge-graph-change-overlay-FIIAFLO6.js +1 -0
  106. package/dist/{workspace-knowledge-graph-contract-X52KXBXJ.js → workspace-knowledge-graph-contract-FVX5T7SU.js} +1 -1
  107. package/dist/{workspace-knowledge-graph-query-A7TKONWY.js → workspace-knowledge-graph-query-WHCGPBGS.js} +1 -1
  108. package/dist/workspace-knowledge-graph-snapshot-X347REDB.js +1 -0
  109. package/dist/workspace-mcp-serve-NQ42PE2I.js +3 -0
  110. package/dist/{workspace-model-GVXNLSQM.js → workspace-model-NCOOY5LC.js} +1 -1
  111. package/dist/{workspace-onboarding-ECZ2KJ2A.js → workspace-onboarding-JNC7ZFMR.js} +1 -1
  112. package/dist/{workspace-readme-6N5Y2ZSJ.js → workspace-readme-OV2ADTLW.js} +2 -2
  113. package/dist/{workspace-registry-summary-5SFBTRGQ.js → workspace-registry-summary-ONT4VOJX.js} +1 -1
  114. package/dist/{workspace-repair-engine-CKJCTWKX.js → workspace-repair-engine-WMJCYWO4.js} +2 -2
  115. package/dist/workspace-run-3S35MDX6.js +1 -0
  116. package/dist/{workspace-verify-D3QTMAUI.js → workspace-verify-MLABQUWK.js} +1 -1
  117. package/dist/{workspace-watch-XYJEW2Z2.js → workspace-watch-MJOG5AZ3.js} +1 -1
  118. package/docs/README.md +2 -0
  119. package/docs/ci-workflows.md +1 -1
  120. package/docs/commands-reference.md +23 -0
  121. package/docs/contracts/ARTIFACT_CATALOG.md +37 -18
  122. package/docs/contracts/COMMAND_OWNERSHIP_MATRIX.md +17 -0
  123. package/docs/contracts/PROOF_CARRYING_CHANGE_CONTRACT_PLAN.md +65 -0
  124. package/docs/proof-carrying-change.implementation.v1.json +118 -0
  125. package/docs/proof-carrying-change.md +202 -0
  126. package/package.json +1 -1
  127. package/dist/analyze-JDEWUBC6.js +0 -1
  128. package/dist/autopilot-release-OELUFNLL.js +0 -1
  129. package/dist/capabilities-command-RAAYENQ6.js +0 -1
  130. package/dist/chunk-2KX6KHEC.js +0 -1
  131. package/dist/chunk-3KU3YUWD.js +0 -2
  132. package/dist/chunk-3NF3M3RE.js +0 -1
  133. package/dist/chunk-3OGPTLI2.js +0 -1
  134. package/dist/chunk-5ME4W4LN.js +0 -1
  135. package/dist/chunk-5XUAAQSV.js +0 -5
  136. package/dist/chunk-5YZ2W57R.js +0 -8
  137. package/dist/chunk-7DZNZ3GM.js +0 -3
  138. package/dist/chunk-BG6IX6HA.js +0 -1
  139. package/dist/chunk-BMAFHX6A.js +0 -1
  140. package/dist/chunk-BUYLM6QV.js +0 -1
  141. package/dist/chunk-C2VTO5WT.js +0 -2
  142. package/dist/chunk-CPR2CMOY.js +0 -1
  143. package/dist/chunk-CSZPE637.js +0 -2
  144. package/dist/chunk-DFVG4DDZ.js +0 -6
  145. package/dist/chunk-EHLGPLIU.js +0 -1
  146. package/dist/chunk-FPDH3N3A.js +0 -7
  147. package/dist/chunk-GVQKAINC.js +0 -49
  148. package/dist/chunk-IKUFNK46.js +0 -2
  149. package/dist/chunk-JYMO7QXQ.js +0 -1
  150. package/dist/chunk-KY2GOSO5.js +0 -1
  151. package/dist/chunk-LEOFD3W5.js +0 -12
  152. package/dist/chunk-LPCZHKD5.js +0 -1
  153. package/dist/chunk-N5HPMATQ.js +0 -1
  154. package/dist/chunk-P3622IM5.js +0 -4
  155. package/dist/chunk-Q7UGDNSM.js +0 -1
  156. package/dist/chunk-RVAOJOXA.js +0 -2
  157. package/dist/chunk-TCLKGPXF.js +0 -2
  158. package/dist/chunk-W5VKBDSD.js +0 -157
  159. package/dist/chunk-WRZSQDZV.js +0 -1
  160. package/dist/chunk-Y4Z6CEII.js +0 -1
  161. package/dist/chunk-ZEEV5J4I.js +0 -1
  162. package/dist/chunk-ZGHJIQXL.js +0 -1
  163. package/dist/doctor-D7YI7LSA.js +0 -1
  164. package/dist/goal-lifecycle-BMS6GSIU.js +0 -1
  165. package/dist/goal-pack-RBSVQMMX.js +0 -1
  166. package/dist/pipeline-QOMXH2EK.js +0 -5
  167. package/dist/verified-goal-XUXU2X5H.js +0 -1
  168. package/dist/workspace-explain-DTFCKYXK.js +0 -1
  169. package/dist/workspace-explain-contract-WMREJWHF.js +0 -1
  170. package/dist/workspace-graph-token-efficiency-5LJKQU2J.js +0 -1
  171. package/dist/workspace-intelligence-runtime-registry-UKFB3BI7.js +0 -1
  172. package/dist/workspace-knowledge-graph-change-overlay-XG6FC4IX.js +0 -1
  173. package/dist/workspace-knowledge-graph-snapshot-GPBDAKAU.js +0 -1
  174. package/dist/workspace-mcp-serve-TDUXJUAA.js +0 -3
  175. package/dist/workspace-run-ZZ5WHL7W.js +0 -1
@@ -1 +1 @@
1
- import {a as a$1}from'./chunk-LPCWROQ3.js';import {f,e as e$1,g,i}from'./chunk-ZGHJIQXL.js';var R=f.repairTransaction,C=e$1.repairTransaction,E=g.repairTransaction;var y="workspai.workspace-repair-proposal.v1",j="contracts/workspace-intelligence/workspace-repair-proposal.v1.json";var A="workspai.workspace-repair-capabilities.v1",b="workspai.workspace-repair-consumer-protocol.v1",v=["project","workspace","linked-project","polyglot-project"],d=["missing-tool","stale-evidence","missing-artifact","no-op-proposal","source-drift","validation-failure","producer-failure","provider-outage","interrupted-rollback","unsupported-runtime"],u=["automatic-refresh","bounded-replan","decision-required","checkpoint-rollback","durable-resume","manual-repair"],w={"missing-tool":"decision-required","stale-evidence":"automatic-refresh","missing-artifact":"automatic-refresh","no-op-proposal":"bounded-replan","source-drift":"bounded-replan","validation-failure":"checkpoint-rollback","producer-failure":"bounded-replan","provider-outage":"durable-resume","interrupted-rollback":"durable-resume","unsupported-runtime":"manual-repair"};function P(){let i=[],s=c.map(o=>o.id);new Set(s).size!==s.length&&i.push("adapter ids are not unique"),v.length<4&&i.push("scope matrix is incomplete"),d.length<10&&i.push("failure-family matrix is incomplete"),u.length<6&&i.push("recovery-path matrix is incomplete");for(let o of d){let t=w[o];u.includes(t)||i.push(`${o} has no bounded recovery policy`);}for(let o of c)for(let t of ["reconcile","audit","test","build"])o.stages[t]||i.push(`${o.id}.${t} is undeclared`);return i}var c=[{id:"node",ecosystem:"JavaScript / TypeScript",manifests:["package.json"],lockfiles:["package-lock.json","npm-shrinkwrap.json","pnpm-lock.yaml","yarn.lock","bun.lock","bun.lockb"],packageManagers:["npm","pnpm","yarn","bun"],support:"full",stages:{reconcile:"native",audit:"native",test:"declared",build:"declared"},requiredToolFamilies:["selected package manager"]},{id:"python",ecosystem:"Python",manifests:["pyproject.toml","requirements.txt"],lockfiles:["uv.lock","poetry.lock","requirements.txt"],packageManagers:["uv","poetry","pip"],support:"conditional",stages:{reconcile:"conditional",audit:"conditional",test:"conditional",build:"declared"},requiredToolFamilies:["isolated Python","selected environment manager","pip-audit or governed Doctor audit"],limitation:"A bounded isolated environment and an installed audit surface are required."},{id:"go",ecosystem:"Go",manifests:["go.mod"],lockfiles:["go.sum"],packageManagers:["go modules"],support:"conditional",stages:{reconcile:"native",audit:"conditional",test:"native",build:"native"},requiredToolFamilies:["go","govulncheck"],limitation:"govulncheck must be installed; the engine never fetches an unreviewed tool."},{id:"rust",ecosystem:"Rust",manifests:["Cargo.toml"],lockfiles:["Cargo.lock"],packageManagers:["cargo"],support:"conditional",stages:{reconcile:"native",audit:"conditional",test:"native",build:"native"},requiredToolFamilies:["cargo","cargo-audit"],limitation:"The cargo-audit subcommand must already be installed."},{id:"php-composer",ecosystem:"PHP",manifests:["composer.json"],lockfiles:["composer.lock"],packageManagers:["composer"],support:"full",stages:{reconcile:"native",audit:"native",test:"declared",build:"declared"},requiredToolFamilies:["composer"]},{id:"ruby-bundler",ecosystem:"Ruby",manifests:["Gemfile"],lockfiles:["Gemfile.lock"],packageManagers:["bundler"],support:"conditional",stages:{reconcile:"native",audit:"conditional",test:"declared",build:"declared"},requiredToolFamilies:["bundle","bundle-audit"],limitation:"bundle-audit and the declared Rake tasks must already exist."},{id:"elixir-mix",ecosystem:"Elixir",manifests:["mix.exs"],lockfiles:["mix.lock"],packageManagers:["mix"],support:"conditional",stages:{reconcile:"native",audit:"conditional",test:"native",build:"native"},requiredToolFamilies:["mix","Hex audit task"],limitation:"The project must expose the Hex audit task used by its dependency policy."},{id:"deno",ecosystem:"Deno",manifests:["deno.json","deno.jsonc"],lockfiles:["deno.lock"],packageManagers:["deno"],support:"full",stages:{reconcile:"native",audit:"native",test:"declared",build:"declared"},requiredToolFamilies:["deno"]},{id:"dotnet",ecosystem:".NET",manifests:["*.sln","*.csproj","*.fsproj","*.vbproj"],lockfiles:["Directory.Packages.props","packages.lock.json"],packageManagers:["NuGet / dotnet"],support:"full",stages:{reconcile:"native",audit:"native",test:"native",build:"native"},requiredToolFamilies:["dotnet"]},{id:"jvm-maven",ecosystem:"JVM / Maven",manifests:["pom.xml"],lockfiles:[],packageManagers:["Maven Wrapper","Maven"],support:"conditional",stages:{reconcile:"native",audit:"conditional",test:"native",build:"native"},requiredToolFamilies:["mvnw or mvn","governed Doctor audit"],limitation:"A project-specific dependency audit command must be declared by Doctor evidence."},{id:"jvm-gradle",ecosystem:"JVM / Gradle",manifests:["build.gradle.kts","build.gradle"],lockfiles:["gradle.lockfile","gradle/libs.versions.toml"],packageManagers:["Gradle Wrapper","Gradle"],support:"conditional",stages:{reconcile:"native",audit:"conditional",test:"native",build:"native"},requiredToolFamilies:["gradlew or gradle","governed Doctor audit"],limitation:"A project-specific dependency audit command must be declared by Doctor evidence."},{id:"clojure",ecosystem:"Clojure",manifests:["deps.edn","project.clj"],lockfiles:[],packageManagers:["Clojure CLI","Leiningen"],support:"conditional",stages:{reconcile:"native",audit:"conditional",test:"conditional",build:"conditional"},requiredToolFamilies:["clojure or lein","governed project audit"],limitation:"Tests and builds run only when the selected Clojure project surface declares a deterministic entrypoint."},{id:"scala-sbt",ecosystem:"Scala / sbt",manifests:["build.sbt"],lockfiles:[],packageManagers:["sbt"],support:"conditional",stages:{reconcile:"native",audit:"conditional",test:"native",build:"native"},requiredToolFamilies:["sbt","governed project audit"],limitation:"A project-specific dependency audit command must be declared by Doctor evidence."}];function M(){let i=P();if(i.length>0)throw new Error(`Workspace Repair qualification matrix is incomplete: ${i.join("; ")}`);return {schemaVersion:A,owner:"Workspai CLI",workflow:["plan","preconditions","approval","target-precondition","checkpoint","execute","reconcile","audit","test","build","target-producer-verify","canonical-verify","close-or-rollback-or-decision"],invariants:{multiAdapterProjects:true,missingTools:"decision-required",unsupportedEcosystems:"decision-required",silentFallbackToModelExecution:false,mutationAuthority:"cli-only",targetClosure:"selected-causal-action-set",changeReceipt:"checkpoint-hash-delta",consumerTimeline:"durable-transaction-events",typedDecisionCauses:true,registeredLinkedProjectMutationBoundary:true,sourceProposalIntegrity:"project-bound-hash-pinned",completionAuthority:"cli-verification-receipt",goalSourceTransition:"closed-integrity-bound-v1",goalAttemptBudget:"durable-serialized-v1",consumerHandshakeRequired:true,ephemeralProposalsAreEvidence:false,approvalBoundToPlanHash:true,canonicalVerificationRequired:true,rollbackConflictDetection:true},consumerProtocol:{protocolVersion:b,versionProbe:{args:["--version","--json"],schemaVersion:"rapidkit-version-v1"},capabilityProbe:{args:["workspace","repair","capabilities","--json"],schemaVersion:A},invocation:{command:"workspace repair",workspaceResolution:["process-cwd","--workspace"],actions:["capabilities","plan","propose","approve","decide","execute","resume","status","list","rollback","cancel"]},contracts:{operationResult:a$1,proposal:y,transaction:R},transientPaths:[".workspai/repair/inbox/*.json",".workspai/repair/engine.lock"]},qualificationMatrix:{schemaVersion:"workspai.workspace-repair-qualification-matrix.v1",status:"contract-enforced",dimensions:{adapters:c.map(s=>s.id),scopes:v,failureFamilies:d,recoveryPaths:u,failureRecoveryPolicy:w},invariants:{everyAdapterDeclaresClosureStages:true,everyFailureTerminates:true,everyMutationIsCheckpointed:true,workspaceAndProjectScopesUseTheSameEngine:true,linkedProjectsRemainBoundaryChecked:true}},adapters:c}}var V="workspai.studio-card-repair-capabilities.v1",h="npx workspai workspace verify --json",r=e$1,a=i;function e(i,s,o,t={}){return {cardId:i,scope:t.scope??"workspace",producerCommand:s,producerArtifact:o,verifyCommand:s,verifyArtifact:o,aggregateVerifyCommand:h,targetClosure:"exact-producer-and-causal-action-set",aggregateRepair:"sequential-causal-queue",transactionScope:"one-causal-finding-family",workspacePosture:"reported-separately",repairPolicy:t.repairPolicy??"refresh-producer",remediationArtifacts:t.remediationArtifacts??[]}}var H=[e("doctor","npx workspai doctor workspace --json",r.doctor,{repairPolicy:"diagnose-and-repair",remediationArtifacts:[a.doctorRemediationPlan,a.artifactRemediationPlan]}),e("projectDoctor","npx workspai doctor project --json",a.doctorProject,{scope:"project",repairPolicy:"diagnose-and-repair",remediationArtifacts:[a.doctorRemediationPlan,a.artifactRemediationPlan]}),e("pipeline","npx workspai pipeline --json --strict",a.pipelineLastRun,{repairPolicy:"source-repair-then-produce",remediationArtifacts:[a.artifactRemediationPlan]}),e("analyze","npx workspai analyze --json",r.analyze,{repairPolicy:"source-repair-then-produce",remediationArtifacts:[a.artifactRemediationPlan]}),e("readiness","npx workspai readiness --json",r.readiness,{repairPolicy:"source-repair-then-produce",remediationArtifacts:[a.artifactRemediationPlan]}),e("bootstrap","npx workspai bootstrap --ci --json",a.bootstrapCompliance,{repairPolicy:"source-repair-then-produce",remediationArtifacts:[a.artifactRemediationPlan]}),e("workspaceSync","npx workspai workspace sync --json",a.workspaceRegistry),e("foundation","npx workspai workspace foundation ensure --json",".workspai/workspace.json"),e("contract","npx workspai workspace contract verify --strict --json",r.contractVerify,{repairPolicy:"source-repair-then-produce"}),e("autopilot","npx workspai autopilot release --json",a.autopilotReleaseLastRun,{repairPolicy:"source-repair-then-produce"}),e("workspaceRun","npx workspai workspace run test --json",a.workspaceRunLast,{repairPolicy:"source-repair-then-produce",remediationArtifacts:[a.artifactRemediationPlan]}),e("setup","npx workspai setup --json",".workspai/toolchain.lock",{repairPolicy:"source-repair-then-produce"}),e("importReadiness","npx workspai doctor project --json",a.doctorProject,{scope:"project",repairPolicy:"diagnose-and-repair",remediationArtifacts:[a.artifactRemediationPlan]}),e("snapshot","npx workspai snapshot create --json",".workspai/reports/snapshot-last-run.json"),e("workspaceModel","npx workspai workspace model --json --write",r.model),e("intelligenceSnapshot","npx workspai workspace snapshot --json",r.snapshot),e("workspaceDiff",`npx workspai workspace diff --from ${r.snapshot} --json`,r.diff),e("workspaceImpact",`npx workspai workspace impact --from ${r.diff} --json`,r.impact),e("workspaceIntelligenceRun","npx workspai workspace intelligence run --for-agent generic --strict --json",r.intelligenceRun,{repairPolicy:"source-repair-then-produce"}),e("workspaceVerify",h,r.verify,{repairPolicy:"source-repair-then-produce",remediationArtifacts:[a.artifactRemediationPlan]}),e("workspaceExplain","npx workspai workspace explain release-blocked --json --write",r.explain),e("workspaceWhy","npx workspai workspace why release-blocked --json --write",a.workspaceWhy),e("workspaceTrace",`npx workspai workspace trace --from ${r.diff} --json --write`,a.workspaceTrace),e("workspaceWatch","npx workspai workspace watch --once --json",r.model),e("workspaceContextAgent","npx workspai workspace context --for-agent --json --write",r.agentContext),e("agentGrounding","npx workspai workspace agent-sync --write --refresh-context --json --preset enterprise --target vscode",r.agentCustomizationPack),e("share",`npx workspai workspace share --output ${a.workspaceShareBundle} --json`,a.workspaceShareBundle),e("archive","npx workspai workspace export --output team-workspace.workspai-archive.zip --json",".workspai/archive-manifest.json"),e("mirror","npx workspai mirror status --json",a.mirrorOps),e("cache","npx workspai cache status --json",".workspai/cache-config.yml"),e("policy","npx workspai workspace policy show --json",".workspai/policies.yml",{repairPolicy:"source-repair-then-produce"}),e("infra","npx workspai infra plan --json",a.infraPlan,{repairPolicy:"source-repair-then-produce"})];export{R as a,C as b,E as c,y as d,j as e,A as f,c as g,M as h,V as i,H as j};
1
+ import {a as a$1}from'./chunk-LPCWROQ3.js';import {q,p,r as r$1,t}from'./chunk-ODK4LCEL.js';var R=q.repairTransaction,C=p.repairTransaction,E=r$1.repairTransaction;var y="workspai.workspace-repair-proposal.v1",j="contracts/workspace-intelligence/workspace-repair-proposal.v1.json";var A="workspai.workspace-repair-capabilities.v1",b="workspai.workspace-repair-consumer-protocol.v1",v=["project","workspace","linked-project","polyglot-project"],d=["missing-tool","stale-evidence","missing-artifact","no-op-proposal","source-drift","validation-failure","producer-failure","provider-outage","interrupted-rollback","unsupported-runtime"],u=["automatic-refresh","bounded-replan","decision-required","checkpoint-rollback","durable-resume","manual-repair"],w={"missing-tool":"decision-required","stale-evidence":"automatic-refresh","missing-artifact":"automatic-refresh","no-op-proposal":"bounded-replan","source-drift":"bounded-replan","validation-failure":"checkpoint-rollback","producer-failure":"bounded-replan","provider-outage":"durable-resume","interrupted-rollback":"durable-resume","unsupported-runtime":"manual-repair"};function P(){let i=[],s=c.map(o=>o.id);new Set(s).size!==s.length&&i.push("adapter ids are not unique"),v.length<4&&i.push("scope matrix is incomplete"),d.length<10&&i.push("failure-family matrix is incomplete"),u.length<6&&i.push("recovery-path matrix is incomplete");for(let o of d){let t=w[o];u.includes(t)||i.push(`${o} has no bounded recovery policy`);}for(let o of c)for(let t of ["reconcile","audit","test","build"])o.stages[t]||i.push(`${o.id}.${t} is undeclared`);return i}var c=[{id:"node",ecosystem:"JavaScript / TypeScript",manifests:["package.json"],lockfiles:["package-lock.json","npm-shrinkwrap.json","pnpm-lock.yaml","yarn.lock","bun.lock","bun.lockb"],packageManagers:["npm","pnpm","yarn","bun"],support:"full",stages:{reconcile:"native",audit:"native",test:"declared",build:"declared"},requiredToolFamilies:["selected package manager"]},{id:"python",ecosystem:"Python",manifests:["pyproject.toml","requirements.txt"],lockfiles:["uv.lock","poetry.lock","requirements.txt"],packageManagers:["uv","poetry","pip"],support:"conditional",stages:{reconcile:"conditional",audit:"conditional",test:"conditional",build:"declared"},requiredToolFamilies:["isolated Python","selected environment manager","pip-audit or governed Doctor audit"],limitation:"A bounded isolated environment and an installed audit surface are required."},{id:"go",ecosystem:"Go",manifests:["go.mod"],lockfiles:["go.sum"],packageManagers:["go modules"],support:"conditional",stages:{reconcile:"native",audit:"conditional",test:"native",build:"native"},requiredToolFamilies:["go","govulncheck"],limitation:"govulncheck must be installed; the engine never fetches an unreviewed tool."},{id:"rust",ecosystem:"Rust",manifests:["Cargo.toml"],lockfiles:["Cargo.lock"],packageManagers:["cargo"],support:"conditional",stages:{reconcile:"native",audit:"conditional",test:"native",build:"native"},requiredToolFamilies:["cargo","cargo-audit"],limitation:"The cargo-audit subcommand must already be installed."},{id:"php-composer",ecosystem:"PHP",manifests:["composer.json"],lockfiles:["composer.lock"],packageManagers:["composer"],support:"full",stages:{reconcile:"native",audit:"native",test:"declared",build:"declared"},requiredToolFamilies:["composer"]},{id:"ruby-bundler",ecosystem:"Ruby",manifests:["Gemfile"],lockfiles:["Gemfile.lock"],packageManagers:["bundler"],support:"conditional",stages:{reconcile:"native",audit:"conditional",test:"declared",build:"declared"},requiredToolFamilies:["bundle","bundle-audit"],limitation:"bundle-audit and the declared Rake tasks must already exist."},{id:"elixir-mix",ecosystem:"Elixir",manifests:["mix.exs"],lockfiles:["mix.lock"],packageManagers:["mix"],support:"conditional",stages:{reconcile:"native",audit:"conditional",test:"native",build:"native"},requiredToolFamilies:["mix","Hex audit task"],limitation:"The project must expose the Hex audit task used by its dependency policy."},{id:"deno",ecosystem:"Deno",manifests:["deno.json","deno.jsonc"],lockfiles:["deno.lock"],packageManagers:["deno"],support:"full",stages:{reconcile:"native",audit:"native",test:"declared",build:"declared"},requiredToolFamilies:["deno"]},{id:"dotnet",ecosystem:".NET",manifests:["*.sln","*.csproj","*.fsproj","*.vbproj"],lockfiles:["Directory.Packages.props","packages.lock.json"],packageManagers:["NuGet / dotnet"],support:"full",stages:{reconcile:"native",audit:"native",test:"native",build:"native"},requiredToolFamilies:["dotnet"]},{id:"jvm-maven",ecosystem:"JVM / Maven",manifests:["pom.xml"],lockfiles:[],packageManagers:["Maven Wrapper","Maven"],support:"conditional",stages:{reconcile:"native",audit:"conditional",test:"native",build:"native"},requiredToolFamilies:["mvnw or mvn","governed Doctor audit"],limitation:"A project-specific dependency audit command must be declared by Doctor evidence."},{id:"jvm-gradle",ecosystem:"JVM / Gradle",manifests:["build.gradle.kts","build.gradle"],lockfiles:["gradle.lockfile","gradle/libs.versions.toml"],packageManagers:["Gradle Wrapper","Gradle"],support:"conditional",stages:{reconcile:"native",audit:"conditional",test:"native",build:"native"},requiredToolFamilies:["gradlew or gradle","governed Doctor audit"],limitation:"A project-specific dependency audit command must be declared by Doctor evidence."},{id:"clojure",ecosystem:"Clojure",manifests:["deps.edn","project.clj"],lockfiles:[],packageManagers:["Clojure CLI","Leiningen"],support:"conditional",stages:{reconcile:"native",audit:"conditional",test:"conditional",build:"conditional"},requiredToolFamilies:["clojure or lein","governed project audit"],limitation:"Tests and builds run only when the selected Clojure project surface declares a deterministic entrypoint."},{id:"scala-sbt",ecosystem:"Scala / sbt",manifests:["build.sbt"],lockfiles:[],packageManagers:["sbt"],support:"conditional",stages:{reconcile:"native",audit:"conditional",test:"native",build:"native"},requiredToolFamilies:["sbt","governed project audit"],limitation:"A project-specific dependency audit command must be declared by Doctor evidence."}];function M(){let i=P();if(i.length>0)throw new Error(`Workspace Repair qualification matrix is incomplete: ${i.join("; ")}`);return {schemaVersion:A,owner:"Workspai CLI",workflow:["plan","preconditions","approval","target-precondition","checkpoint","execute","reconcile","audit","test","build","target-producer-verify","canonical-verify","close-or-rollback-or-decision"],invariants:{multiAdapterProjects:true,missingTools:"decision-required",unsupportedEcosystems:"decision-required",silentFallbackToModelExecution:false,mutationAuthority:"cli-only",targetClosure:"selected-causal-action-set",changeReceipt:"checkpoint-hash-delta",consumerTimeline:"durable-transaction-events",typedDecisionCauses:true,registeredLinkedProjectMutationBoundary:true,sourceProposalIntegrity:"project-bound-hash-pinned",completionAuthority:"cli-verification-receipt",goalSourceTransition:"closed-integrity-bound-v1",goalAttemptBudget:"durable-serialized-v1",consumerHandshakeRequired:true,ephemeralProposalsAreEvidence:false,approvalBoundToPlanHash:true,canonicalVerificationRequired:true,rollbackConflictDetection:true},consumerProtocol:{protocolVersion:b,versionProbe:{args:["--version","--json"],schemaVersion:"rapidkit-version-v1"},capabilityProbe:{args:["workspace","repair","capabilities","--json"],schemaVersion:A},invocation:{command:"workspace repair",workspaceResolution:["process-cwd","--workspace"],actions:["capabilities","plan","propose","approve","decide","execute","resume","status","list","rollback","cancel"]},contracts:{operationResult:a$1,proposal:y,transaction:R},transientPaths:[".workspai/repair/inbox/*.json",".workspai/repair/engine.lock"]},qualificationMatrix:{schemaVersion:"workspai.workspace-repair-qualification-matrix.v1",status:"contract-enforced",dimensions:{adapters:c.map(s=>s.id),scopes:v,failureFamilies:d,recoveryPaths:u,failureRecoveryPolicy:w},invariants:{everyAdapterDeclaresClosureStages:true,everyFailureTerminates:true,everyMutationIsCheckpointed:true,workspaceAndProjectScopesUseTheSameEngine:true,linkedProjectsRemainBoundaryChecked:true}},adapters:c}}var V="workspai.studio-card-repair-capabilities.v1",h="npx workspai workspace verify --json",r=p,a=t;function e(i,s,o,t={}){return {cardId:i,scope:t.scope??"workspace",producerCommand:s,producerArtifact:o,verifyCommand:s,verifyArtifact:o,aggregateVerifyCommand:h,targetClosure:"exact-producer-and-causal-action-set",aggregateRepair:"sequential-causal-queue",transactionScope:"one-causal-finding-family",workspacePosture:"reported-separately",repairPolicy:t.repairPolicy??"refresh-producer",remediationArtifacts:t.remediationArtifacts??[]}}var H=[e("doctor","npx workspai doctor workspace --json",r.doctor,{repairPolicy:"diagnose-and-repair",remediationArtifacts:[a.doctorRemediationPlan,a.artifactRemediationPlan]}),e("projectDoctor","npx workspai doctor project --json",a.doctorProject,{scope:"project",repairPolicy:"diagnose-and-repair",remediationArtifacts:[a.doctorRemediationPlan,a.artifactRemediationPlan]}),e("pipeline","npx workspai pipeline --json --strict",a.pipelineLastRun,{repairPolicy:"source-repair-then-produce",remediationArtifacts:[a.artifactRemediationPlan]}),e("analyze","npx workspai analyze --json",r.analyze,{repairPolicy:"source-repair-then-produce",remediationArtifacts:[a.artifactRemediationPlan]}),e("readiness","npx workspai readiness --json",r.readiness,{repairPolicy:"source-repair-then-produce",remediationArtifacts:[a.artifactRemediationPlan]}),e("bootstrap","npx workspai bootstrap --ci --json",a.bootstrapCompliance,{repairPolicy:"source-repair-then-produce",remediationArtifacts:[a.artifactRemediationPlan]}),e("workspaceSync","npx workspai workspace sync --json",a.workspaceRegistry),e("foundation","npx workspai workspace foundation ensure --json",".workspai/workspace.json"),e("contract","npx workspai workspace contract verify --strict --json",r.contractVerify,{repairPolicy:"source-repair-then-produce"}),e("autopilot","npx workspai autopilot release --json",a.autopilotReleaseLastRun,{repairPolicy:"source-repair-then-produce"}),e("workspaceRun","npx workspai workspace run test --json",a.workspaceRunLast,{repairPolicy:"source-repair-then-produce",remediationArtifacts:[a.artifactRemediationPlan]}),e("setup","npx workspai setup --json",".workspai/toolchain.lock",{repairPolicy:"source-repair-then-produce"}),e("importReadiness","npx workspai doctor project --json",a.doctorProject,{scope:"project",repairPolicy:"diagnose-and-repair",remediationArtifacts:[a.artifactRemediationPlan]}),e("snapshot","npx workspai snapshot create --json",".workspai/reports/snapshot-last-run.json"),e("workspaceModel","npx workspai workspace model --json --write",r.model),e("intelligenceSnapshot","npx workspai workspace snapshot --json",r.snapshot),e("workspaceDiff",`npx workspai workspace diff --from ${r.snapshot} --json`,r.diff),e("workspaceImpact",`npx workspai workspace impact --from ${r.diff} --json`,r.impact),e("workspaceIntelligenceRun","npx workspai workspace intelligence run --for-agent generic --strict --json",r.intelligenceRun,{repairPolicy:"source-repair-then-produce"}),e("workspaceVerify",h,r.verify,{repairPolicy:"source-repair-then-produce",remediationArtifacts:[a.artifactRemediationPlan]}),e("workspaceExplain","npx workspai workspace explain release-blocked --json --write",r.explain),e("workspaceWhy","npx workspai workspace why release-blocked --json --write",a.workspaceWhy),e("workspaceTrace",`npx workspai workspace trace --from ${r.diff} --json --write`,a.workspaceTrace),e("workspaceWatch","npx workspai workspace watch --once --json",r.model),e("workspaceContextAgent","npx workspai workspace context --for-agent --json --write",r.agentContext),e("agentGrounding","npx workspai workspace agent-sync --write --refresh-context --json --preset enterprise --target vscode",r.agentCustomizationPack),e("share",`npx workspai workspace share --output ${a.workspaceShareBundle} --json`,a.workspaceShareBundle),e("archive","npx workspai workspace export --output team-workspace.workspai-archive.zip --json",".workspai/archive-manifest.json"),e("mirror","npx workspai mirror status --json",a.mirrorOps),e("cache","npx workspai cache status --json",".workspai/cache-config.yml"),e("policy","npx workspai workspace policy show --json",".workspai/policies.yml",{repairPolicy:"source-repair-then-produce"}),e("infra","npx workspai infra plan --json",a.infraPlan,{repairPolicy:"source-repair-then-produce"})];export{R as a,C as b,E as c,y as d,j as e,A as f,c as g,M as h,V as i,H as j};
@@ -1 +1 @@
1
- import {a}from'./chunk-QMQBX3RV.js';import {m as m$1}from'./chunk-U5ENEDJA.js';import {a as a$1}from'./chunk-GR6442P7.js';import {f,e}from'./chunk-C2VTO5WT.js';import {h,i}from'./chunk-ZGHJIQXL.js';import {createHash}from'crypto';import l from'path';import {execa}from'execa';import v from'fs-extra';var D=h.projectTestCoverage.schemaVersion,P=i.projectTestCoverage,G=["package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","mix.exs","deps.edn","project.clj","build.sbt","CMakeLists.txt","meson.build","deno.json","deno.jsonc"];function p(t){let e=Number(t);return Number.isFinite(e)&&e>=0?e:0}function m(t,e,o=0){let n=p(t),s=Math.min(p(e),n),r=p(o);return {total:n,covered:s,skipped:r,percent:n>0?Math.round(s/n*1e4)/100:null}}function W(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e=t;return m(e.total,e.covered,e.skipped)}function y(t,e){let o=l.isAbsolute(e)?e:l.resolve(t,e),n=l.relative(t,o);return n&&!n.startsWith("..")?n.split(l.sep).join("/"):e}async function C(t){return createHash("sha256").update(await v.readFile(t)).digest("hex")}async function I(t){let e=l.resolve(t);for(;;){let o=await v.pathExists(l.join(e,".workspai","project.json"))||await v.pathExists(l.join(e,".rapidkit","project.json")),n=(await v.readdir(e).catch(()=>[])).some(r=>r.toLowerCase().endsWith(".gemspec"));if(o||n||(await Promise.all(G.map(r=>v.pathExists(l.join(e,r))))).some(Boolean))return e;let s=l.dirname(e);if(s===e)return l.resolve(t);e=s;}}async function V(t){return m$1(t).runtime}async function U(t,e,o=5){let n=[],s=[{dir:t,depth:0}],r=new Set([".git",".workspai",".rapidkit","node_modules",".venv","vendor","deps"]);for(;s.length>0;){let a=s.shift();if(!a)break;let i=await v.readdir(a.dir,{withFileTypes:true}).catch(()=>[]);for(let c of i){if(r.has(c.name)||a$1(c.name))continue;let u=l.join(a.dir,c.name),g=l.relative(t,u).split(l.sep).join("/");c.isFile()&&e(c.name,g)&&n.push(u),c.isDirectory()&&a.depth<o&&s.push({dir:u,depth:a.depth+1});}}return n}async function L(t,e){let o=await v.readJson(e),n=o.total??o,s={};for(let a of ["lines","branches","functions","statements"]){let i=W(n[a]);i&&(s[a]=i);}let r=[];for(let[a,i]of Object.entries(o)){if(a==="total"||!i||typeof i!="object"||Array.isArray(i))continue;let c=i,u={};for(let g of ["lines","branches","functions","statements"]){let b=W(c[g]);b&&(u[g]=b);}r.push({path:y(t,a),metrics:u});}return {metrics:s,files:r,source:{format:"istanbul-json",path:e,sha256:await C(e)}}}async function z(t,e){let o=await v.readJson(e),n=o.totals??{},s={lines:m(n.num_statements,n.covered_lines)};p(n.num_branches)>0&&(s.branches=m(n.num_branches,n.covered_branches));let r=[];for(let[a,i]of Object.entries(o.files??{})){let c=i?.summary??{};r.push({path:y(t,a),metrics:{lines:m(c.num_statements,c.covered_lines),...p(c.num_branches)>0?{branches:m(c.num_branches,c.covered_branches)}:{}}});}return {metrics:s,files:r,source:{format:"coverage-py-json",path:e,sha256:await C(e)}}}function j(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e=t,o=p(e.count),n=p(e.covered);return o>0?m(o,n):void 0}async function B(t,e){let o=await v.readJson(e),n=Array.isArray(o.data)?o.data[0]??{}:o,s=n.totals??{},r={};r.lines=j(s.lines),r.functions=j(s.functions),r.branches=j(s.branches),r.statements=j(s.regions);let a=[];for(let i of Array.isArray(n.files)?n.files:[]){if(!i||typeof i!="object"||Array.isArray(i))continue;let c=i,u=c.summary??{};a.push({path:y(t,String(c.filename??"unknown")),metrics:{lines:j(u.lines),functions:j(u.functions),branches:j(u.branches),statements:j(u.regions)}});}return {metrics:r,files:a,source:{format:"llvm-cov-json",path:e,sha256:await C(e)}}}async function E(t,e){let o=await v.readFile(e,"utf8"),n=[],s="",r=0,a=0,i=0,c=0,u=0,g=0,b=d=>{s&&(n.push({path:y(t,s),metrics:{lines:m(d.lineTotal,d.lineCovered),functions:m(d.functionTotal,d.functionCovered),branches:m(d.branchTotal,d.branchCovered)}}),r+=d.lineTotal,a+=d.lineCovered,i+=d.functionTotal,c+=d.functionCovered,u+=d.branchTotal,g+=d.branchCovered);},h={lineTotal:0,lineCovered:0,functionTotal:0,functionCovered:0,branchTotal:0,branchCovered:0};for(let d of o.split(/\r?\n/))d.startsWith("SF:")?s=d.slice(3):d.startsWith("LF:")?h.lineTotal=p(d.slice(3)):d.startsWith("LH:")?h.lineCovered=p(d.slice(3)):d.startsWith("FNF:")?h.functionTotal=p(d.slice(4)):d.startsWith("FNH:")?h.functionCovered=p(d.slice(4)):d.startsWith("BRF:")?h.branchTotal=p(d.slice(4)):d.startsWith("BRH:")?h.branchCovered=p(d.slice(4)):d==="end_of_record"&&(b(h),s="",h={lineTotal:0,lineCovered:0,functionTotal:0,functionCovered:0,branchTotal:0,branchCovered:0});return {metrics:{lines:m(r,a),functions:m(i,c),branches:m(u,g)},files:n,source:{format:"lcov",path:e,sha256:await C(e)}}}async function K(t,e){let o=await v.readFile(e,"utf8"),n=new Map;for(let a of o.split(/\r?\n/).slice(1)){let i=/^(.+?):\d+\.\d+,\d+\.\d+\s+(\d+)\s+(\d+)$/.exec(a.trim());if(!i)continue;let c=n.get(i[1])??{total:0,covered:0},u=p(i[2]);c.total+=u,p(i[3])>0&&(c.covered+=u),n.set(i[1],c);}let s=[...n.entries()].map(([a,i])=>({path:y(t,a),metrics:{statements:m(i.total,i.covered)}})),r=[...n.values()].reduce((a,i)=>({total:a.total+i.total,covered:a.covered+i.covered}),{total:0,covered:0});return {metrics:{statements:m(r.total,r.covered)},files:s,source:{format:"go-coverprofile",path:e,sha256:await C(e)}}}function k(t,e){let n=[...t.matchAll(new RegExp(`<counter\\s+type=["']${e}["']\\s+missed=["'](\\d+)["']\\s+covered=["'](\\d+)["']\\s*\\/?\\s*>`,"gi"))].at(-1);return n?m(Number(n[1])+Number(n[2]),n[2]):void 0}async function x(t,e){let o=await v.readFile(t,"utf8"),n={};if(e==="cobertura-xml"){let s=/<coverage\b([^>]*)>/i.exec(o)?.[1]??"",r=/\bline-rate=["']([\d.]+)["']/i.exec(s)?.[1],a=/\bbranch-rate=["']([\d.]+)["']/i.exec(s)?.[1];r&&(n.lines=m(1e4,Math.round(Number(r)*1e4))),a&&(n.branches=m(1e4,Math.round(Number(a)*1e4)));}if(e==="clover-xml"){let r=[...o.matchAll(/<metrics\b([^>]*)\/?>/gi)].at(-1)?.[1]??"",a=g=>p(new RegExp(`\\b${g}=["'](\\d+)["']`,"i").exec(r)?.[1]),i=a("statements"),c=a("methods"),u=a("conditionals");i>0&&(n.statements=m(i,a("coveredstatements"))),c>0&&(n.functions=m(c,a("coveredmethods"))),u>0&&(n.branches=m(u,a("coveredconditionals")));}return n.lines??=k(o,"LINE"),n.branches??=k(o,"BRANCH"),n.functions??=k(o,"METHOD"),n.statements??=k(o,"INSTRUCTION"),{metrics:n,files:[],source:{format:e,path:t,sha256:await C(t)}}}async function X(t){let e=await v.readFile(t,"utf8"),o=/<scoverage\b([^>]*)>/i.exec(e)?.[1]??"",n=b=>p(new RegExp(`\\b${b}=["']([\\d.]+)["']`,"i").exec(o)?.[1]),s=n("statement-count"),r=n("statements-invoked"),a=n("branch-count"),i=n("branches-invoked"),c=n("statement-rate"),u=n("branch-rate"),g={};return s>0?g.statements=m(s,r):c>0&&(g.statements=m(1e4,Math.round(c*100))),a>0?g.branches=m(a,i):u>0&&(g.branches=m(1e4,Math.round(u*100))),{metrics:g,files:[],source:{format:"scoverage-xml",path:t,sha256:await C(t)}}}async function Q(t,e){let o=await v.readJson(e),n=new Map;for(let a of Object.values(o)){let i=a?.coverage;if(!(!i||typeof i!="object"||Array.isArray(i)))for(let[c,u]of Object.entries(i)){if(!Array.isArray(u))continue;let g=n.get(c)??[];u.forEach((b,h)=>{typeof b=="number"&&(g[h]=Math.max(g[h]??0,b));}),n.set(c,g);}}let s=[...n.entries()].map(([a,i])=>{let c=i.filter(u=>typeof u=="number");return {path:y(t,a),metrics:{lines:m(c.length,c.filter(u=>u>0).length)}}}),r=s.reduce((a,i)=>{let c=i.metrics.lines;return {total:a.total+(c?.total??0),covered:a.covered+(c?.covered??0)}},{total:0,covered:0});return {metrics:{lines:m(r.total,r.covered)},files:s,source:{format:"simplecov-json",path:e,sha256:await C(e)}}}async function q(t,e={}){let o=[{relativePath:"coverage/coverage-summary.json",parser:r=>L(t,r)},{relativePath:"coverage.json",parser:async r=>{let a=await v.readJson(r);return Array.isArray(a.data)?B(t,r):z(t,r)}},{relativePath:"coverage/lcov.info",parser:r=>E(t,r)},{relativePath:"cover/lcov.info",parser:r=>E(t,r)},{relativePath:"lcov.info",parser:r=>E(t,r)},{relativePath:"coverage.out",parser:r=>K(t,r)},{relativePath:"target/site/jacoco/jacoco.xml",parser:r=>x(r,"jacoco-xml")},{relativePath:"build/reports/jacoco/test/jacocoTestReport.xml",parser:r=>x(r,"jacoco-xml")},{relativePath:"coverage.xml",parser:r=>x(r,"clover-xml")},{relativePath:".resultset.json",parser:r=>Q(t,r)}];for(let r of o){let a=l.join(t,r.relativePath);if(await v.pathExists(a))return r.parser(a)}if(e.recursive===false)return null;let s=(await U(t,(r,a)=>r==="coverage.cobertura.xml"||r==="jacoco.xml"||r==="clover.xml"||r==="scoverage.xml"||a.endsWith("/coverage-summary.json"),7)).sort()[0];return s?s.endsWith("coverage-summary.json")?L(t,s):s.endsWith("jacoco.xml")?x(s,"jacoco-xml"):s.endsWith("coverage.cobertura.xml")?x(s,"cobertura-xml"):s.endsWith("scoverage.xml")?X(s):x(s,"clover-xml"):null}async function Y(t){return v.readJson(l.join(t,"package.json")).catch(()=>null)}async function H(t,e){let o=(n,s)=>({cwd:t,executable:n,args:s});if(e==="node"||e==="bun"){let s=(await Y(t))?.scripts??{},r=["test:coverage","test:cov","coverage"].find(i=>typeof s[i]=="string"),a=e==="bun"?"bun":await v.pathExists(l.join(t,"pnpm-lock.yaml"))?"pnpm":await v.pathExists(l.join(t,"yarn.lock"))?"yarn":"npm";if(r)return {runner:String(s[r]).split(/\s+/)[0]||a,invocations:[o(a,a==="yarn"?[r]:["run",r])],diagnostics:[]};if(typeof s.test=="string"){let i=a==="yarn"?["test","--coverage"]:a==="bun"?["test","--coverage","--coverage-reporter=lcov"]:["test","--","--coverage"];return {runner:String(s.test).split(/\s+/)[0]||a,invocations:[o(a,i)],diagnostics:[]}}return {runner:null,invocations:[],diagnostics:["No project-owned test or coverage script was detected."]}}if(e==="deno")return {runner:"deno",invocations:[o("deno",["test","--coverage=coverage"]),o("deno",["coverage","--lcov","--output=coverage/lcov.info","coverage"])],diagnostics:[]};if(e==="python")return {runner:"pytest-cov",invocations:[o(await v.pathExists(l.join(t,".venv",process.platform==="win32"?"Scripts":"bin",process.platform==="win32"?"python.exe":"python"))?l.join(".venv",process.platform==="win32"?"Scripts":"bin",process.platform==="win32"?"python.exe":"python"):process.platform==="win32"?"python":"python3",["-m","pytest","--cov=.","--cov-report=json:coverage.json"])],diagnostics:[]};if(e==="go")return {runner:"go test",invocations:[o("go",["test","./...","-coverprofile=coverage.out"])],diagnostics:[]};if(e==="java"){let n=await v.pathExists(l.join(t,"gradlew")),s=await v.pathExists(l.join(t,"gradlew.bat")),r=n||s,a=await v.pathExists(l.join(t,"mvnw")),i=await v.pathExists(l.join(t,"mvnw.cmd")),c=r?process.platform==="win32"&&s?".\\gradlew.bat":"./gradlew":await v.pathExists(l.join(t,"pom.xml"))?process.platform==="win32"&&i?".\\mvnw.cmd":a?"./mvnw":"mvn":"gradle";return {runner:r?"jacoco/gradle":"jacoco/maven",invocations:[o(c,r?["test","jacocoTestReport"]:["test","jacoco:report"])],diagnostics:[]}}return e==="dotnet"?{runner:"dotnet coverlet",invocations:[o("dotnet",["test","--collect:XPlat Code Coverage"])],diagnostics:[]}:e==="rust"?{runner:"cargo llvm-cov",invocations:[o("cargo",["llvm-cov","--json","--output-path","coverage.json"])],diagnostics:["cargo-llvm-cov must be available in the project toolchain."]}:e==="php"?{runner:"phpunit",invocations:[o(process.platform==="win32"?"vendor\\bin\\phpunit.bat":"vendor/bin/phpunit",["--coverage-clover","coverage.xml"])],diagnostics:[]}:e==="ruby"?{runner:"simplecov",invocations:[o("bundle",["exec","rspec"])],diagnostics:["The test suite must enable SimpleCov to emit .resultset.json."]}:e==="elixir"?{runner:"mix cover",invocations:[o("mix",["test","--cover"])],diagnostics:["Configure ExCoveralls for JSON or LCOV interchange when machine-readable coverage is required."]}:e==="clojure"?{runner:"cloverage",invocations:[o("clojure",["-M:coverage"])],diagnostics:["The project must declare a coverage alias such as cloverage."]}:e==="scala"?{runner:"sbt-scoverage",invocations:[o("sbt",["clean","coverage","test","coverageReport"])],diagnostics:["The project must declare the scoverage plugin."]}:e==="kotlin"?{runner:"jacoco/gradle",invocations:[o(await v.pathExists(l.join(t,process.platform==="win32"?"gradlew.bat":"gradlew"))?process.platform==="win32"?".\\gradlew.bat":"./gradlew":"gradle",["test","jacocoTestReport"])],diagnostics:["The project must declare the JaCoCo Gradle plugin."]}:e==="c"||e==="cpp"?{runner:"CTest/LLVM coverage",invocations:[o("ctest",["--test-dir","build","--output-on-failure"])],diagnostics:["The native build must be instrumented for coverage and export LCOV, Cobertura, or LLVM JSON evidence."]}:{runner:null,invocations:[],diagnostics:["Project runtime could not be detected."]}}async function ve(t,e){let o=await I(t),n=e??await V(o),s=await H(o,n),r=await q(o,{recursive:false}).catch(()=>null),a=r?.source.path&&r.source.sha256?[{path:l.relative(o,r.source.path).split(l.sep).join("/"),sha256:r.source.sha256}]:[],i=[...s.diagnostics],c=r?"available":s.invocations.length===0||n==="unknown"?"unsupported":i.length>0?"requires-setup":"available";return {runtime:n,runner:s.runner,status:c,existingEvidence:a,invocations:s.invocations,prerequisites:i}}function Z(t,e){let o=t?l.relative(t,e).split(l.sep).join("/"):l.resolve(e),n=l.basename(e).toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,48)||"project",s=createHash("sha256").update(o).digest("hex").slice(0,12);return `${n}--${s}`}function ee(t){return t.lines?"lines":t.statements?"statements":t.branches?"branches":"functions"}async function me(t={}){let e$1=await I(t.projectPath??process.cwd()),o=a(e$1),n=t.runtime??await V(e$1),s=Math.max(0,Math.min(100,Math.round(t.target??80))),r=await H(e$1,n),a$1=[],i=Date.now();if(t.run)for(let f of r.invocations){let w=await execa(f.executable,f.args,{cwd:f.cwd,reject:false,timeout:6e5}).catch(()=>({exitCode:1}));if(a$1.push(Number(w.exitCode??1)),Number(w.exitCode??1)!==0)break}let c=await q(e$1).catch(()=>null),u=c?ee(c.metrics):"lines",g=c?.metrics[u]?.percent??null,b=t.run&&a$1.some(f=>f!==0)?"failed":g===null?"unavailable":g>=s?"passed":"below-target",h=Z(o,e$1),d=l.join(e$1,P),R=o?`.workspai/reports/projects/${h}/project-test-coverage-last-run.json`:null,T={schemaVersion:D,generatedAt:new Date().toISOString(),status:b,project:{id:h,name:l.basename(e$1),path:e$1,workspacePath:o},runtime:n,runner:r.runner,target:{metric:u,percent:s},metrics:c?.metrics??{},files:c?.files??[],lowCoverageFiles:(c?.files??[]).map(f=>{let w=f.metrics[u]??f.metrics.lines??f.metrics.statements;return {path:f.path,percent:w?.percent??null,uncovered:Math.max(0,(w?.total??0)-(w?.covered??0))}}).filter(f=>f.percent===null||f.percent<s).sort((f,w)=>w.uncovered-f.uncovered||f.path.localeCompare(w.path)),source:c?.source??{format:"unknown",path:null,sha256:null},execution:{requested:t.run===true,invocations:r.invocations,exitCodes:a$1,durationMs:Date.now()-i},diagnostics:[...r.diagnostics,...c?[]:["No supported machine-readable coverage artifact was found."]],artifactPaths:{project:d,workspaceLatest:o?l.join(o,P):null,workspaceProject:o&&R?l.join(o,R):null}};return o&&R&&await f(o,P,[{relativePath:P,payload:T},{relativePath:R,payload:T}]),await e(e$1,P,T),T}export{D as a,P as b,ve as c,me as d};
1
+ import {a}from'./chunk-MGL6DBOR.js';import {m as m$1}from'./chunk-U5ENEDJA.js';import {a as a$1}from'./chunk-GR6442P7.js';import {h,g}from'./chunk-OZXCNVGW.js';import {s,t}from'./chunk-ODK4LCEL.js';import {createHash}from'crypto';import l from'path';import {execa}from'execa';import v from'fs-extra';var D=s.projectTestCoverage.schemaVersion,P=t.projectTestCoverage,G=["package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","mix.exs","deps.edn","project.clj","build.sbt","CMakeLists.txt","meson.build","deno.json","deno.jsonc"];function p(t){let e=Number(t);return Number.isFinite(e)&&e>=0?e:0}function m(t,e,o=0){let n=p(t),s=Math.min(p(e),n),r=p(o);return {total:n,covered:s,skipped:r,percent:n>0?Math.round(s/n*1e4)/100:null}}function W(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e=t;return m(e.total,e.covered,e.skipped)}function y(t,e){let o=l.isAbsolute(e)?e:l.resolve(t,e),n=l.relative(t,o);return n&&!n.startsWith("..")?n.split(l.sep).join("/"):e}async function C(t){return createHash("sha256").update(await v.readFile(t)).digest("hex")}async function I(t){let e=l.resolve(t);for(;;){let o=await v.pathExists(l.join(e,".workspai","project.json"))||await v.pathExists(l.join(e,".rapidkit","project.json")),n=(await v.readdir(e).catch(()=>[])).some(r=>r.toLowerCase().endsWith(".gemspec"));if(o||n||(await Promise.all(G.map(r=>v.pathExists(l.join(e,r))))).some(Boolean))return e;let s=l.dirname(e);if(s===e)return l.resolve(t);e=s;}}async function V(t){return m$1(t).runtime}async function U(t,e,o=5){let n=[],s=[{dir:t,depth:0}],r=new Set([".git",".workspai",".rapidkit","node_modules",".venv","vendor","deps"]);for(;s.length>0;){let a=s.shift();if(!a)break;let i=await v.readdir(a.dir,{withFileTypes:true}).catch(()=>[]);for(let c of i){if(r.has(c.name)||a$1(c.name))continue;let u=l.join(a.dir,c.name),g=l.relative(t,u).split(l.sep).join("/");c.isFile()&&e(c.name,g)&&n.push(u),c.isDirectory()&&a.depth<o&&s.push({dir:u,depth:a.depth+1});}}return n}async function L(t,e){let o=await v.readJson(e),n=o.total??o,s={};for(let a of ["lines","branches","functions","statements"]){let i=W(n[a]);i&&(s[a]=i);}let r=[];for(let[a,i]of Object.entries(o)){if(a==="total"||!i||typeof i!="object"||Array.isArray(i))continue;let c=i,u={};for(let g of ["lines","branches","functions","statements"]){let b=W(c[g]);b&&(u[g]=b);}r.push({path:y(t,a),metrics:u});}return {metrics:s,files:r,source:{format:"istanbul-json",path:e,sha256:await C(e)}}}async function z(t,e){let o=await v.readJson(e),n=o.totals??{},s={lines:m(n.num_statements,n.covered_lines)};p(n.num_branches)>0&&(s.branches=m(n.num_branches,n.covered_branches));let r=[];for(let[a,i]of Object.entries(o.files??{})){let c=i?.summary??{};r.push({path:y(t,a),metrics:{lines:m(c.num_statements,c.covered_lines),...p(c.num_branches)>0?{branches:m(c.num_branches,c.covered_branches)}:{}}});}return {metrics:s,files:r,source:{format:"coverage-py-json",path:e,sha256:await C(e)}}}function j(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e=t,o=p(e.count),n=p(e.covered);return o>0?m(o,n):void 0}async function B(t,e){let o=await v.readJson(e),n=Array.isArray(o.data)?o.data[0]??{}:o,s=n.totals??{},r={};r.lines=j(s.lines),r.functions=j(s.functions),r.branches=j(s.branches),r.statements=j(s.regions);let a=[];for(let i of Array.isArray(n.files)?n.files:[]){if(!i||typeof i!="object"||Array.isArray(i))continue;let c=i,u=c.summary??{};a.push({path:y(t,String(c.filename??"unknown")),metrics:{lines:j(u.lines),functions:j(u.functions),branches:j(u.branches),statements:j(u.regions)}});}return {metrics:r,files:a,source:{format:"llvm-cov-json",path:e,sha256:await C(e)}}}async function E(t,e){let o=await v.readFile(e,"utf8"),n=[],s="",r=0,a=0,i=0,c=0,u=0,g=0,b=d=>{s&&(n.push({path:y(t,s),metrics:{lines:m(d.lineTotal,d.lineCovered),functions:m(d.functionTotal,d.functionCovered),branches:m(d.branchTotal,d.branchCovered)}}),r+=d.lineTotal,a+=d.lineCovered,i+=d.functionTotal,c+=d.functionCovered,u+=d.branchTotal,g+=d.branchCovered);},h={lineTotal:0,lineCovered:0,functionTotal:0,functionCovered:0,branchTotal:0,branchCovered:0};for(let d of o.split(/\r?\n/))d.startsWith("SF:")?s=d.slice(3):d.startsWith("LF:")?h.lineTotal=p(d.slice(3)):d.startsWith("LH:")?h.lineCovered=p(d.slice(3)):d.startsWith("FNF:")?h.functionTotal=p(d.slice(4)):d.startsWith("FNH:")?h.functionCovered=p(d.slice(4)):d.startsWith("BRF:")?h.branchTotal=p(d.slice(4)):d.startsWith("BRH:")?h.branchCovered=p(d.slice(4)):d==="end_of_record"&&(b(h),s="",h={lineTotal:0,lineCovered:0,functionTotal:0,functionCovered:0,branchTotal:0,branchCovered:0});return {metrics:{lines:m(r,a),functions:m(i,c),branches:m(u,g)},files:n,source:{format:"lcov",path:e,sha256:await C(e)}}}async function K(t,e){let o=await v.readFile(e,"utf8"),n=new Map;for(let a of o.split(/\r?\n/).slice(1)){let i=/^(.+?):\d+\.\d+,\d+\.\d+\s+(\d+)\s+(\d+)$/.exec(a.trim());if(!i)continue;let c=n.get(i[1])??{total:0,covered:0},u=p(i[2]);c.total+=u,p(i[3])>0&&(c.covered+=u),n.set(i[1],c);}let s=[...n.entries()].map(([a,i])=>({path:y(t,a),metrics:{statements:m(i.total,i.covered)}})),r=[...n.values()].reduce((a,i)=>({total:a.total+i.total,covered:a.covered+i.covered}),{total:0,covered:0});return {metrics:{statements:m(r.total,r.covered)},files:s,source:{format:"go-coverprofile",path:e,sha256:await C(e)}}}function k(t,e){let n=[...t.matchAll(new RegExp(`<counter\\s+type=["']${e}["']\\s+missed=["'](\\d+)["']\\s+covered=["'](\\d+)["']\\s*\\/?\\s*>`,"gi"))].at(-1);return n?m(Number(n[1])+Number(n[2]),n[2]):void 0}async function x(t,e){let o=await v.readFile(t,"utf8"),n={};if(e==="cobertura-xml"){let s=/<coverage\b([^>]*)>/i.exec(o)?.[1]??"",r=/\bline-rate=["']([\d.]+)["']/i.exec(s)?.[1],a=/\bbranch-rate=["']([\d.]+)["']/i.exec(s)?.[1];r&&(n.lines=m(1e4,Math.round(Number(r)*1e4))),a&&(n.branches=m(1e4,Math.round(Number(a)*1e4)));}if(e==="clover-xml"){let r=[...o.matchAll(/<metrics\b([^>]*)\/?>/gi)].at(-1)?.[1]??"",a=g=>p(new RegExp(`\\b${g}=["'](\\d+)["']`,"i").exec(r)?.[1]),i=a("statements"),c=a("methods"),u=a("conditionals");i>0&&(n.statements=m(i,a("coveredstatements"))),c>0&&(n.functions=m(c,a("coveredmethods"))),u>0&&(n.branches=m(u,a("coveredconditionals")));}return n.lines??=k(o,"LINE"),n.branches??=k(o,"BRANCH"),n.functions??=k(o,"METHOD"),n.statements??=k(o,"INSTRUCTION"),{metrics:n,files:[],source:{format:e,path:t,sha256:await C(t)}}}async function X(t){let e=await v.readFile(t,"utf8"),o=/<scoverage\b([^>]*)>/i.exec(e)?.[1]??"",n=b=>p(new RegExp(`\\b${b}=["']([\\d.]+)["']`,"i").exec(o)?.[1]),s=n("statement-count"),r=n("statements-invoked"),a=n("branch-count"),i=n("branches-invoked"),c=n("statement-rate"),u=n("branch-rate"),g={};return s>0?g.statements=m(s,r):c>0&&(g.statements=m(1e4,Math.round(c*100))),a>0?g.branches=m(a,i):u>0&&(g.branches=m(1e4,Math.round(u*100))),{metrics:g,files:[],source:{format:"scoverage-xml",path:t,sha256:await C(t)}}}async function Q(t,e){let o=await v.readJson(e),n=new Map;for(let a of Object.values(o)){let i=a?.coverage;if(!(!i||typeof i!="object"||Array.isArray(i)))for(let[c,u]of Object.entries(i)){if(!Array.isArray(u))continue;let g=n.get(c)??[];u.forEach((b,h)=>{typeof b=="number"&&(g[h]=Math.max(g[h]??0,b));}),n.set(c,g);}}let s=[...n.entries()].map(([a,i])=>{let c=i.filter(u=>typeof u=="number");return {path:y(t,a),metrics:{lines:m(c.length,c.filter(u=>u>0).length)}}}),r=s.reduce((a,i)=>{let c=i.metrics.lines;return {total:a.total+(c?.total??0),covered:a.covered+(c?.covered??0)}},{total:0,covered:0});return {metrics:{lines:m(r.total,r.covered)},files:s,source:{format:"simplecov-json",path:e,sha256:await C(e)}}}async function q(t,e={}){let o=[{relativePath:"coverage/coverage-summary.json",parser:r=>L(t,r)},{relativePath:"coverage.json",parser:async r=>{let a=await v.readJson(r);return Array.isArray(a.data)?B(t,r):z(t,r)}},{relativePath:"coverage/lcov.info",parser:r=>E(t,r)},{relativePath:"cover/lcov.info",parser:r=>E(t,r)},{relativePath:"lcov.info",parser:r=>E(t,r)},{relativePath:"coverage.out",parser:r=>K(t,r)},{relativePath:"target/site/jacoco/jacoco.xml",parser:r=>x(r,"jacoco-xml")},{relativePath:"build/reports/jacoco/test/jacocoTestReport.xml",parser:r=>x(r,"jacoco-xml")},{relativePath:"coverage.xml",parser:r=>x(r,"clover-xml")},{relativePath:".resultset.json",parser:r=>Q(t,r)}];for(let r of o){let a=l.join(t,r.relativePath);if(await v.pathExists(a))return r.parser(a)}if(e.recursive===false)return null;let s=(await U(t,(r,a)=>r==="coverage.cobertura.xml"||r==="jacoco.xml"||r==="clover.xml"||r==="scoverage.xml"||a.endsWith("/coverage-summary.json"),7)).sort()[0];return s?s.endsWith("coverage-summary.json")?L(t,s):s.endsWith("jacoco.xml")?x(s,"jacoco-xml"):s.endsWith("coverage.cobertura.xml")?x(s,"cobertura-xml"):s.endsWith("scoverage.xml")?X(s):x(s,"clover-xml"):null}async function Y(t){return v.readJson(l.join(t,"package.json")).catch(()=>null)}async function H(t,e){let o=(n,s)=>({cwd:t,executable:n,args:s});if(e==="node"||e==="bun"){let s=(await Y(t))?.scripts??{},r=["test:coverage","test:cov","coverage"].find(i=>typeof s[i]=="string"),a=e==="bun"?"bun":await v.pathExists(l.join(t,"pnpm-lock.yaml"))?"pnpm":await v.pathExists(l.join(t,"yarn.lock"))?"yarn":"npm";if(r)return {runner:String(s[r]).split(/\s+/)[0]||a,invocations:[o(a,a==="yarn"?[r]:["run",r])],diagnostics:[]};if(typeof s.test=="string"){let i=a==="yarn"?["test","--coverage"]:a==="bun"?["test","--coverage","--coverage-reporter=lcov"]:["test","--","--coverage"];return {runner:String(s.test).split(/\s+/)[0]||a,invocations:[o(a,i)],diagnostics:[]}}return {runner:null,invocations:[],diagnostics:["No project-owned test or coverage script was detected."]}}if(e==="deno")return {runner:"deno",invocations:[o("deno",["test","--coverage=coverage"]),o("deno",["coverage","--lcov","--output=coverage/lcov.info","coverage"])],diagnostics:[]};if(e==="python")return {runner:"pytest-cov",invocations:[o(await v.pathExists(l.join(t,".venv",process.platform==="win32"?"Scripts":"bin",process.platform==="win32"?"python.exe":"python"))?l.join(".venv",process.platform==="win32"?"Scripts":"bin",process.platform==="win32"?"python.exe":"python"):process.platform==="win32"?"python":"python3",["-m","pytest","--cov=.","--cov-report=json:coverage.json"])],diagnostics:[]};if(e==="go")return {runner:"go test",invocations:[o("go",["test","./...","-coverprofile=coverage.out"])],diagnostics:[]};if(e==="java"){let n=await v.pathExists(l.join(t,"gradlew")),s=await v.pathExists(l.join(t,"gradlew.bat")),r=n||s,a=await v.pathExists(l.join(t,"mvnw")),i=await v.pathExists(l.join(t,"mvnw.cmd")),c=r?process.platform==="win32"&&s?".\\gradlew.bat":"./gradlew":await v.pathExists(l.join(t,"pom.xml"))?process.platform==="win32"&&i?".\\mvnw.cmd":a?"./mvnw":"mvn":"gradle";return {runner:r?"jacoco/gradle":"jacoco/maven",invocations:[o(c,r?["test","jacocoTestReport"]:["test","jacoco:report"])],diagnostics:[]}}return e==="dotnet"?{runner:"dotnet coverlet",invocations:[o("dotnet",["test","--collect:XPlat Code Coverage"])],diagnostics:[]}:e==="rust"?{runner:"cargo llvm-cov",invocations:[o("cargo",["llvm-cov","--json","--output-path","coverage.json"])],diagnostics:["cargo-llvm-cov must be available in the project toolchain."]}:e==="php"?{runner:"phpunit",invocations:[o(process.platform==="win32"?"vendor\\bin\\phpunit.bat":"vendor/bin/phpunit",["--coverage-clover","coverage.xml"])],diagnostics:[]}:e==="ruby"?{runner:"simplecov",invocations:[o("bundle",["exec","rspec"])],diagnostics:["The test suite must enable SimpleCov to emit .resultset.json."]}:e==="elixir"?{runner:"mix cover",invocations:[o("mix",["test","--cover"])],diagnostics:["Configure ExCoveralls for JSON or LCOV interchange when machine-readable coverage is required."]}:e==="clojure"?{runner:"cloverage",invocations:[o("clojure",["-M:coverage"])],diagnostics:["The project must declare a coverage alias such as cloverage."]}:e==="scala"?{runner:"sbt-scoverage",invocations:[o("sbt",["clean","coverage","test","coverageReport"])],diagnostics:["The project must declare the scoverage plugin."]}:e==="kotlin"?{runner:"jacoco/gradle",invocations:[o(await v.pathExists(l.join(t,process.platform==="win32"?"gradlew.bat":"gradlew"))?process.platform==="win32"?".\\gradlew.bat":"./gradlew":"gradle",["test","jacocoTestReport"])],diagnostics:["The project must declare the JaCoCo Gradle plugin."]}:e==="c"||e==="cpp"?{runner:"CTest/LLVM coverage",invocations:[o("ctest",["--test-dir","build","--output-on-failure"])],diagnostics:["The native build must be instrumented for coverage and export LCOV, Cobertura, or LLVM JSON evidence."]}:{runner:null,invocations:[],diagnostics:["Project runtime could not be detected."]}}async function ve(t,e){let o=await I(t),n=e??await V(o),s=await H(o,n),r=await q(o,{recursive:false}).catch(()=>null),a=r?.source.path&&r.source.sha256?[{path:l.relative(o,r.source.path).split(l.sep).join("/"),sha256:r.source.sha256}]:[],i=[...s.diagnostics],c=r?"available":s.invocations.length===0||n==="unknown"?"unsupported":i.length>0?"requires-setup":"available";return {runtime:n,runner:s.runner,status:c,existingEvidence:a,invocations:s.invocations,prerequisites:i}}function Z(t,e){let o=t?l.relative(t,e).split(l.sep).join("/"):l.resolve(e),n=l.basename(e).toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,48)||"project",s=createHash("sha256").update(o).digest("hex").slice(0,12);return `${n}--${s}`}function ee(t){return t.lines?"lines":t.statements?"statements":t.branches?"branches":"functions"}async function me(t={}){let e=await I(t.projectPath??process.cwd()),o=a(e),n=t.runtime??await V(e),s=Math.max(0,Math.min(100,Math.round(t.target??80))),r=await H(e,n),a$1=[],i=Date.now();if(t.run)for(let f of r.invocations){let w=await execa(f.executable,f.args,{cwd:f.cwd,reject:false,timeout:6e5}).catch(()=>({exitCode:1}));if(a$1.push(Number(w.exitCode??1)),Number(w.exitCode??1)!==0)break}let c=await q(e).catch(()=>null),u=c?ee(c.metrics):"lines",g$1=c?.metrics[u]?.percent??null,b=t.run&&a$1.some(f=>f!==0)?"failed":g$1===null?"unavailable":g$1>=s?"passed":"below-target",h$1=Z(o,e),d=l.join(e,P),R=o?`.workspai/reports/projects/${h$1}/project-test-coverage-last-run.json`:null,T={schemaVersion:D,generatedAt:new Date().toISOString(),status:b,project:{id:h$1,name:l.basename(e),path:e,workspacePath:o},runtime:n,runner:r.runner,target:{metric:u,percent:s},metrics:c?.metrics??{},files:c?.files??[],lowCoverageFiles:(c?.files??[]).map(f=>{let w=f.metrics[u]??f.metrics.lines??f.metrics.statements;return {path:f.path,percent:w?.percent??null,uncovered:Math.max(0,(w?.total??0)-(w?.covered??0))}}).filter(f=>f.percent===null||f.percent<s).sort((f,w)=>w.uncovered-f.uncovered||f.path.localeCompare(w.path)),source:c?.source??{format:"unknown",path:null,sha256:null},execution:{requested:t.run===true,invocations:r.invocations,exitCodes:a$1,durationMs:Date.now()-i},diagnostics:[...r.diagnostics,...c?[]:["No supported machine-readable coverage artifact was found."]],artifactPaths:{project:d,workspaceLatest:o?l.join(o,P):null,workspaceProject:o&&R?l.join(o,R):null}};return o&&R&&await h(o,P,[{relativePath:P,payload:T},{relativePath:R,payload:T}]),await g(e,P,T),T}export{D as a,P as b,ve as c,me as d};
@@ -0,0 +1,7 @@
1
+ import {a}from'./chunk-A5FBGRJA.js';import {a as a$1}from'./chunk-AFIFZTOY.js';import {t,s}from'./chunk-ODK4LCEL.js';import {s as s$1}from'./chunk-RGNCL5OB.js';import {k,v,e,a as a$2,u,f as f$1}from'./chunk-VQZ5PI5J.js';import b from'crypto';import P from'fs';import d from'fs/promises';import i from'path';import T from'fs-extra';var x=s.projectWorkspaceLink.schemaVersion,L="workspai.project-workspace-link",l=class extends Error{constructor(r,a,o={}){super(a);this.code=r;this.context=o;this.name="ProjectWorkspaceResolutionError";}code;context};function $(e){return P.existsSync(i.join(e,".workspai-workspace"))?".workspai-workspace":".workspai/workspace.json"}function _(e){return b.createHash("sha256").update([e.workspaceName,a(e.workspacePath),e.projectName,a(e.projectPath),e.relativePath.replace(/\\/g,"/"),e.relationship].join("\0")).digest("hex")}function I(e){let t=i.resolve(e);for(;;){if(k(t))return t;let r=i.dirname(t);if(r===t)return null;t=r;}}function J(e){let t=i.resolve(e);for(;;){if([...u(t,"project.json"),...u(t,"context.json")].some(a=>P.existsSync(a)))return t;let r=i.dirname(t);if(r===t)return null;t=r;}}function y(e){return JSON.parse(P.readFileSync(e,"utf8"))}function K(e){let t$1=y(e);if(!t$1||typeof t$1!="object"||Array.isArray(t$1))throw new l("project.workspace.link-invalid",`Project workspace link is not a JSON object: ${e}`,{linkPath:e});let r=t$1;if(r.schemaVersion!==x||r.kind!==L||r.state!=="active"||!r.workspace||typeof r.workspace.name!="string"||r.workspace.name.trim().length===0||typeof r.workspace.root!="string"||!i.isAbsolute(r.workspace.root)||![".workspai-workspace",".workspai/workspace.json"].includes(r.workspace.marker??"")||r.workspace.contract!==t.workspaceContract||!r.project||typeof r.project.name!="string"||r.project.name.trim().length===0||typeof r.project.relativePath!="string"||i.isAbsolute(r.project.relativePath)||r.project.relativePath.split(/[\\/]/).includes("..")||!["managed","adopted","imported","linked","restored"].includes(r.project.relationship??"")||!r.integrity||r.integrity.algorithm!=="sha256"||typeof r.integrity.binding!="string"||!/^[a-f0-9]{64}$/.test(r.integrity.binding))throw new l("project.workspace.link-invalid",`Project workspace link does not satisfy ${x}: ${e}`,{linkPath:e});try{a$1(t$1,"contracts/project-workspace-link.v1.json","Project workspace link");}catch(a){throw new l("project.workspace.link-invalid",`Project workspace link does not satisfy ${x}: ${e}`,{linkPath:e,validationError:a instanceof Error?a.message:String(a)})}return r}function f(e,t){let r=i.join(e,".workspai","workspace.contract.json");if(!P.existsSync(r))return null;try{let a$1=y(r);if(!Array.isArray(a$1.projects))return false;let o=a(t);return a$1.projects.some(n=>typeof n.externalPath=="string"?a(n.externalPath)===o:typeof n.relativePath!="string"||n.relativePath.startsWith("external/")?false:a(i.resolve(e,n.relativePath))===o)}catch{return false}}function M(e,t,r){let a$1=a(e),o=new Map;for(let n of s$1(t,r)){if(!P.existsSync(n))continue;let c;try{c=y(n);}catch{continue}if(Array.isArray(c.workspaces))for(let p of c.workspaces){if(!p||typeof p.name!="string"||typeof p.path!="string"||!Array.isArray(p.projects)||!p.projects.some(w=>w&&typeof w.path=="string"&&a(w.path)===a$1))continue;let s=a(p.path);!k(s)||f(s,e)!==true||o.set(s,{name:p.name,path:s});}}return [...o.values()].sort((n,c)=>n.path.localeCompare(c.path))}function m(e,t){if(e)throw t;return null}function te(e$1){let t=e$1.strict===true,r=i.resolve(e$1.startPath),a=e$1.explicitWorkspacePath?i.resolve(e$1.explicitWorkspacePath):null,o=J(r);if(a)return k(a)?e$1.requireProjectMembership===true&&o&&f(a,o)!==true?m(t,new l("project.workspace.membership-missing",`Project is not registered in the explicit workspace contract: ${a}`,{workspacePath:a,projectPath:o})):{workspacePath:a,projectPath:o,source:"explicit",linkPath:o?v(o,e):null,recovered:false}:m(t,new l("project.workspace.explicit-invalid",`Explicit workspace path is not a Workspai workspace: ${a}`,{workspacePath:a,projectPath:o}));let n=I(r);if(n)return e$1.requireProjectMembership===true&&o&&f(n,o)!==true?m(t,new l("project.workspace.membership-missing",`Project is not registered in its parent workspace contract: ${n}`,{workspacePath:n,projectPath:o})):{workspacePath:n,projectPath:o,source:"parent",linkPath:o?v(o,e):null,recovered:false};if(!o)return m(t,new l("project.workspace.unlinked","No Workspai project or workspace could be resolved from the current directory.",{startPath:r}));let c=v(o,e),p=null;if(P.existsSync(c)){let s;try{s=K(c);}catch(O){if(t)throw O;return null}let u=_({workspaceName:s.workspace.name,workspacePath:s.workspace.root,projectName:s.project.name,projectPath:o,relativePath:s.project.relativePath,relationship:s.project.relationship}),w=f(s.workspace.root,o);if(s.integrity.binding===u&&k(s.workspace.root)&&P.existsSync(i.join(s.workspace.root,s.workspace.marker))&&w===true)return {workspacePath:i.resolve(s.workspace.root),projectPath:o,source:"local-link",linkPath:c,recovered:false};p=s;}let h=M(o,e$1.env??process.env,e$1.platform??process.platform);return h.length>1?m(t,new l("project.workspace.ambiguous",`Project is registered in more than one valid workspace: ${h.map(s=>s.name).join(", ")}. Pass --workspace <path> or run project workspace relink.`,{projectPath:o,candidates:h})):h.length===1?{workspacePath:h[0].path,projectPath:o,source:"registry",linkPath:c,recovered:p!==null}:p?m(t,new l("project.workspace.link-stale",`Project workspace link is stale and no valid registry relocation was found: ${p.workspace.root}`,{projectPath:o,linkPath:c,linkedWorkspacePath:p.workspace.root})):m(t,new l("project.workspace.unlinked","This Workspai project is not linked to a valid workspace. Run `npx workspai adopt .` or `npx workspai project workspace relink --workspace <path>`.",{projectPath:o,linkPath:c}))}async function F(e,t){await d.mkdir(i.dirname(e),{recursive:true});let r=`${e}.${process.pid}.${b.randomUUID()}.tmp`;try{await d.writeFile(r,`${JSON.stringify(t,null,2)}
2
+ `,{encoding:"utf8",mode:384});try{await d.rename(r,e);}catch(a){let o=a.code;if(o!=="EEXIST"&&o!=="EPERM")throw a;await T.move(r,e,{overwrite:true});}}finally{await d.rm(r,{force:true}).catch(()=>{});}}async function D(e){let t=i.join(e,".gitignore"),r=await d.readFile(t,"utf8").catch(c=>{if(c.code==="ENOENT")return "";throw c});if(r.split(/\r?\n/).map(c=>c.trim()).includes(f$1))return;let n=`${r.length>0&&!r.endsWith(`
3
+ `)?`
4
+ `:""}
5
+ # Workspai machine-local workspace binding
6
+ ${f$1}
7
+ `;await d.writeFile(t,`${r}${n}`,"utf8");}async function V(e$1){let t$1=i.resolve(e$1.workspacePath),r=i.resolve(e$1.projectPath);if(!k(t$1))throw new l("project.workspace.explicit-invalid",`Cannot link project to an invalid Workspai workspace: ${t$1}`,{workspacePath:t$1,projectPath:r});let a$3=i.join(t$1,".workspai","workspace.contract.json"),o=e$1.workspaceName??i.basename(t$1),n=e$1.relativePath;if(P.existsSync(a$3)){let h=y(a$3);typeof h.workspace?.name=="string"&&(o=h.workspace.name);let s=a(r),u=h.projects?.find(w=>typeof w.externalPath=="string"?a(w.externalPath)===s:typeof w.relativePath=="string"&&!w.relativePath.startsWith("external/")&&a(i.resolve(t$1,w.relativePath))===s);u&&typeof u.relativePath=="string"&&(n=u.relativePath);}if(n??=i.relative(t$1,r).replace(/\\/g,"/"),(!n||n.startsWith(".."))&&(n=`external/${e$1.projectName}`),f(t$1,r)!==true)throw new l("project.workspace.membership-missing",`Project is not registered in the canonical workspace contract: ${e$1.projectName}`,{workspacePath:t$1,projectPath:r,projectName:e$1.projectName});let c={schemaVersion:x,kind:L,generatedAt:(e$1.now??new Date).toISOString(),state:"active",workspace:{name:o,root:t$1,marker:$(t$1),contract:t.workspaceContract},project:{name:e$1.projectName,relativePath:n,relationship:e$1.relationship},integrity:{algorithm:"sha256",binding:_({workspaceName:o,workspacePath:t$1,projectName:e$1.projectName,projectPath:r,relativePath:n,relationship:e$1.relationship})}};a$1(c,"contracts/project-workspace-link.v1.json","Project workspace link");let p=i.join(r,a$2,e);return await D(r),await F(p,c),{linkPath:p,link:c}}async function oe(e,t="linked"){if(!e.projectPath)return null;let r=u(e.projectPath,"project.json").find(o=>P.existsSync(o)),a=i.basename(e.projectPath);if(r)try{let o=y(r);typeof o.name=="string"?a=o.name:typeof o.slug=="string"&&(a=o.slug);}catch{}return V({workspacePath:e.workspacePath,projectPath:e.projectPath,projectName:a,relationship:t})}export{l as a,te as b,V as c,oe as d};
@@ -1 +1 @@
1
- import a from'path';import Y from'fs-extra';import q from'chalk';async function U(p,n={}){let e=a.resolve(p),{WORKSPACE_CONTRACT_PATH:l,syncWorkspaceContract:d,verifyWorkspaceContract:S,writeWorkspaceContractVerifyEvidence:j}=await import('./workspace-contract-MQ3QE52V.js'),w=await d({workspacePath:e,strict:true}),{syncWorkspaceReadme:E,WORKSPACE_README_PATH:R}=await import('./workspace-readme-6N5Y2ZSJ.js'),x=await E({workspacePath:e,workspaceName:w.contract.workspace.name,profile:w.contract.workspace.profile??"minimal",projectCount:w.contract.projects.length}),{buildWorkspaceModel:h,writeWorkspaceModel:g}=await import('./workspace-model-GVXNLSQM.js'),r=await h({workspacePath:e,includeEvidence:true}),k=await g(r,e),{buildWorkspaceImpact:G,buildWorkspaceModelSnapshot:O,diffWorkspaceModel:$,writeWorkspaceImpact:M,writeWorkspaceModelDiff:T,writeWorkspaceModelSnapshot:_}=await import('./workspace-intelligence-TFEQBPUP.js'),{WORKSPACE_INTELLIGENCE_ARTIFACTS:s}=await import('./workspace-intelligence-runtime-registry-UKFB3BI7.js'),{syncWorkspaceAgentGrounding:P}=await import('./workspace-agent-sync-T3MJO2MX.js'),W=await P({workspacePath:e,model:r,write:true,refreshContext:true,strict:false,preset:"enterprise",targets:["all"],projectGrounding:n.projectGrounding??"managed"}),v=new Set(W.writtenFiles),i=new Set(W.projectLenses?.skipped.map(t=>`${t.name}: ${t.reason}`)??[]),{readWorkspaceKnowledgeGraphSnapshot:C}=await import('./workspace-knowledge-graph-snapshot-GPBDAKAU.js'),o=await C(e),y=false;if(o.status==="miss"){if(o.reason!=="live-input-mismatch")throw new Error(`Workspace consumer sync could not validate canonical Model/Graph evidence (${o.reason}).`);r=await h({workspacePath:e,includeEvidence:true}),k=await g(r,e);let{buildWorkspaceAgentContext:t,writeWorkspaceAgentContext:f}=await import('./workspace-context-KOCEP4MJ.js'),m=await t({workspacePath:e,model:r,agent:"generic",includeEvidence:true});await f(m,e);let b=await P({workspacePath:e,model:r,write:true,refreshContext:false,strict:false,preset:"enterprise",targets:["all"],projectGrounding:n.projectGrounding??"managed"});for(let c of b.writtenFiles)v.add(c);for(let c of b.projectLenses?.skipped??[])i.add(`${c.name}: ${c.reason}`);if(o=await C(e),o.status==="miss")throw new Error(`Workspace consumer reconciliation did not produce fresh canonical evidence (${o.reason}).`);y=true;}let F=a.join(e,s.snapshot),u=false;if(!await Y.pathExists(F)){let t=await O({workspacePath:e,model:r});await _(t,e),u=true;}let I=await $({workspacePath:e,fromPath:s.snapshot,model:r}),N=await T(I,e),L=await G({workspacePath:e,fromPath:s.diff}),K=await M(L,e),z=await S({workspacePath:e,strict:true}),H=await j({workspacePath:e,result:z}),V=(o.graph.source.inputs?.scopes??[]).filter(t=>t.truncated);for(let t of V)i.add(`${t.kind}:${t.id} graph inventory reached its ${t.fileLimit}-file emergency bound; inventory completeness is bounded.`);let A=o.graph.quality.completeness?.providers.bounded??0;A>0&&i.add(`${A} graph provider(s) used declared adaptive semantic/deep budgets; inspect provider inputCoverage before making exhaustive symbol-level claims.`);let D=[l,(await import('./workspace-registry-summary-5SFBTRGQ.js')).WORKSPACE_REGISTRY_SUMMARY_RELATIVE_PATH,a.relative(e,x).split(a.sep).join("/")||R,a.relative(e,k).split(a.sep).join("/"),s.knowledgeGraph,...u?[s.snapshot]:[],a.relative(e,N).split(a.sep).join("/"),a.relative(e,K).split(a.sep).join("/"),a.relative(e,H).split(a.sep).join("/"),...v].filter((t,f,m)=>m.indexOf(t)===f);return n.silent||console.log(q.gray(`\u2713 Workspace Intelligence synced \xB7 ${r.summary.projectCount} project(s) \xB7 model + graph + agent grounding \xB7 freshness sealed`)),{workspacePath:e,projectCount:r.summary.projectCount,baselineCreated:u,freshnessSealed:true,reconciledAfterGrounding:y,writtenFiles:D,warnings:[...i].sort()}}async function ee(p,n={}){let e=a.resolve(p),l=n.workspaceName??a.basename(e),{registerWorkspaceStrict:d}=await import('./workspace-B33BFZZ3.js');return await d(e,l),U(e,{silent:n.silent})}export{U as a,ee as b};
1
+ import a from'path';import Y from'fs-extra';import q from'chalk';async function U(p,n={}){let e=a.resolve(p),{WORKSPACE_CONTRACT_PATH:l,syncWorkspaceContract:d,verifyWorkspaceContract:S,writeWorkspaceContractVerifyEvidence:j}=await import('./workspace-contract-VIUQT5SZ.js'),w=await d({workspacePath:e,strict:true}),{syncWorkspaceReadme:E,WORKSPACE_README_PATH:R}=await import('./workspace-readme-OV2ADTLW.js'),x=await E({workspacePath:e,workspaceName:w.contract.workspace.name,profile:w.contract.workspace.profile??"minimal",projectCount:w.contract.projects.length}),{buildWorkspaceModel:h,writeWorkspaceModel:g}=await import('./workspace-model-NCOOY5LC.js'),r=await h({workspacePath:e,includeEvidence:true}),k=await g(r,e),{buildWorkspaceImpact:G,buildWorkspaceModelSnapshot:O,diffWorkspaceModel:$,writeWorkspaceImpact:M,writeWorkspaceModelDiff:T,writeWorkspaceModelSnapshot:_}=await import('./workspace-intelligence-QLSD5EEV.js'),{WORKSPACE_INTELLIGENCE_ARTIFACTS:s}=await import('./workspace-intelligence-runtime-registry-ZLPF7BAY.js'),{syncWorkspaceAgentGrounding:P}=await import('./workspace-agent-sync-Z35NTXCB.js'),W=await P({workspacePath:e,model:r,write:true,refreshContext:true,strict:false,preset:"enterprise",targets:["all"],projectGrounding:n.projectGrounding??"managed"}),v=new Set(W.writtenFiles),i=new Set(W.projectLenses?.skipped.map(t=>`${t.name}: ${t.reason}`)??[]),{readWorkspaceKnowledgeGraphSnapshot:C}=await import('./workspace-knowledge-graph-snapshot-X347REDB.js'),o=await C(e),y=false;if(o.status==="miss"){if(o.reason!=="live-input-mismatch")throw new Error(`Workspace consumer sync could not validate canonical Model/Graph evidence (${o.reason}).`);r=await h({workspacePath:e,includeEvidence:true}),k=await g(r,e);let{buildWorkspaceAgentContext:t,writeWorkspaceAgentContext:f}=await import('./workspace-context-KNJQUJWC.js'),m=await t({workspacePath:e,model:r,agent:"generic",includeEvidence:true});await f(m,e);let b=await P({workspacePath:e,model:r,write:true,refreshContext:false,strict:false,preset:"enterprise",targets:["all"],projectGrounding:n.projectGrounding??"managed"});for(let c of b.writtenFiles)v.add(c);for(let c of b.projectLenses?.skipped??[])i.add(`${c.name}: ${c.reason}`);if(o=await C(e),o.status==="miss")throw new Error(`Workspace consumer reconciliation did not produce fresh canonical evidence (${o.reason}).`);y=true;}let F=a.join(e,s.snapshot),u=false;if(!await Y.pathExists(F)){let t=await O({workspacePath:e,model:r});await _(t,e),u=true;}let I=await $({workspacePath:e,fromPath:s.snapshot,model:r}),N=await T(I,e),L=await G({workspacePath:e,fromPath:s.diff}),K=await M(L,e),z=await S({workspacePath:e,strict:true}),H=await j({workspacePath:e,result:z}),V=(o.graph.source.inputs?.scopes??[]).filter(t=>t.truncated);for(let t of V)i.add(`${t.kind}:${t.id} graph inventory reached its ${t.fileLimit}-file emergency bound; inventory completeness is bounded.`);let A=o.graph.quality.completeness?.providers.bounded??0;A>0&&i.add(`${A} graph provider(s) used declared adaptive semantic/deep budgets; inspect provider inputCoverage before making exhaustive symbol-level claims.`);let D=[l,(await import('./workspace-registry-summary-ONT4VOJX.js')).WORKSPACE_REGISTRY_SUMMARY_RELATIVE_PATH,a.relative(e,x).split(a.sep).join("/")||R,a.relative(e,k).split(a.sep).join("/"),s.knowledgeGraph,...u?[s.snapshot]:[],a.relative(e,N).split(a.sep).join("/"),a.relative(e,K).split(a.sep).join("/"),a.relative(e,H).split(a.sep).join("/"),...v].filter((t,f,m)=>m.indexOf(t)===f);return n.silent||console.log(q.gray(`\u2713 Workspace Intelligence synced \xB7 ${r.summary.projectCount} project(s) \xB7 model + graph + agent grounding \xB7 freshness sealed`)),{workspacePath:e,projectCount:r.summary.projectCount,baselineCreated:u,freshnessSealed:true,reconciledAfterGrounding:y,writtenFiles:D,warnings:[...i].sort()}}async function ee(p,n={}){let e=a.resolve(p),l=n.workspaceName??a.basename(e),{registerWorkspaceStrict:d}=await import('./workspace-TJHCETBV.js');return await d(e,l),U(e,{silent:n.silent})}export{U as a,ee as b};
@@ -0,0 +1 @@
1
+ import {e,g}from'./chunk-OZXCNVGW.js';import {t,s}from'./chunk-ODK4LCEL.js';import {t as t$1}from'./chunk-VQZ5PI5J.js';import u from'fs';import A from'path';var a=s.workspaceRunLast.schemaVersion,W="workspace-run-last.json",o=t.workspaceRunLast;var P=new Set(["init","test","build","start"]);function _(e){return P.has(e)}async function d(e){try{return await u.promises.access(e,u.constants.F_OK),true}catch{return false}}async function w(e){try{let r=await u.promises.readFile(e,"utf-8");return JSON.parse(r)}catch{return null}}function m(e){return !e||typeof e!="object"||Array.isArray(e)?null:e}function h(e){let r=e.stage;return typeof r!="string"||r.trim().length===0||!Array.isArray(e.projects)?false:_(r)||/^[a-z][a-z0-9_-]*$/i.test(r)}function T(e){let r=m(e);return !r||r.schemaVersion===a?false:h(r)}function C(e){let r=m(e);return r?r.schemaVersion===a&&r.stages!=null:false}function p(e){if(C(e))return e;if(T(e)){let r=e.stage;return {schemaVersion:a,generatedAt:e.generatedAt,workspacePath:e.workspacePath,latestStage:r,stages:{[r]:e},enterpriseControls:e.enterpriseControls??{jsonReady:true,evidencePath:o}}}return null}function U(e,r){let n=p(e);if(!n)return null;let t=r??n.latestStage;return n.stages[t]??null}async function V(e){let r=(await Promise.all(t$1(A.resolve(e),"reports",W).map(async t=>await d(t)?t:null))).find(t=>typeof t=="string");if(!r)return null;let n=await w(r);return p(n)}async function j(e$1,r){let n=A.resolve(e$1);return e(n,o,async()=>{let t=(await Promise.all(t$1(n,"reports",W).map(async s=>await d(s)?s:null))).find(s=>typeof s=="string"),R=t?await w(t):null,i=p(R);if(t&&!i)throw new Error(`Workspace run evidence is unreadable or invalid; refusing to overwrite: ${t}`);let l=i?{...i.stages}:{};l[r.stage]=r;let g$1={schemaVersion:a,generatedAt:r.generatedAt,workspacePath:r.workspacePath,latestStage:r.stage,stages:l,enterpriseControls:{jsonReady:true,evidencePath:o}};return await g(n,o,g$1),g$1})}export{W as a,o as b,U as c,V as d,j as e};
@@ -0,0 +1 @@
1
+ var ne="workspace-knowledge-search.v1";function b(e){return e.trim().toLowerCase()}var V=new WeakMap;function B(e){let t=V.get(e);if(t)return t;let s=new Map(e.relations.map(a=>[a.id,a])),o=new Map(e.entities.map(a=>[a.id,a])),i=new Map(e.proofs.map(a=>[a.id,a])),r=new Map,d=new Map,h=(a,g)=>{let p=d.get(a)??[];p.push(g),d.set(a,p);};for(let a of e.entities){let g=[a.id,a.label,a.identity.key,...a.kind==="project"&&a.projectId?[a.projectId]:[],...a.identity.aliases];for(let p of new Set(g.map(b))){let k=r.get(p)??[];k.push(a),r.set(p,k);}}for(let a of e.relations)h(a.from,{from:a.from,to:a.to,relationId:a.id,kind:a.kind,direction:"forward",proofIds:a.proofIds}),h(a.to,{from:a.to,to:a.from,relationId:a.id,kind:a.kind,direction:"reverse",proofIds:a.proofIds});for(let a of r.values())a.sort((g,p)=>g.id.localeCompare(p.id));for(let a of d.values())a.sort((g,p)=>g.to.localeCompare(p.to)||g.relationId.localeCompare(p.relationId));let l={entitiesById:o,relationsById:s,entitiesByAlias:r,proofsById:i,adjacency:d};return V.set(e,l),l}function D(e,t){let s=B(e),o=s.relationsById.get(t);if(o)return {found:true,targetType:"relation",relation:o};let i=b(t),r=s.entitiesByAlias.get(i)??[];return r.length===1?{found:true,targetType:"entity",entity:r[0]}:{found:false,query:t,candidates:r.map(d=>d.id).sort()}}function Ke(e,t){let s=D(e,t);if(!s.found)return {query:t,found:false,target:null,proofs:[],candidates:s.candidates};let o=s.targetType==="entity"?s.entity:s.relation,i=new Set(o.proofIds);return {query:t,found:true,target:o,candidates:[],proofs:[...i].map(r=>B(e).proofsById.get(r)).filter(r=>!!r).sort((r,d)=>r.id.localeCompare(d.id))}}function Se(e,t,s){let o=D(e,t),i=D(e,s);if(!o.found||o.targetType!=="entity"||!i.found||i.targetType!=="entity")return {from:t,to:s,found:false,resolvedFrom:o.found&&o.targetType==="entity"?o.entity.id:null,resolvedTo:i.found&&i.targetType==="entity"?i.entity.id:null,entityPath:[],hops:[],proofs:[]};let r=B(e),d=[o.entity.id],h=new Map,l=new Set(d),a=0;for(;a<d.length&&!l.has(i.entity.id);){let u=d[a++];for(let w of r.adjacency.get(u)??[])l.has(w.to)||(l.add(w.to),h.set(w.to,w),d.push(w.to));}if(!l.has(i.entity.id))return {from:t,to:s,found:false,resolvedFrom:o.entity.id,resolvedTo:i.entity.id,entityPath:[],hops:[],proofs:[]};let g=[],p=i.entity.id;for(;p!==o.entity.id;){let u=h.get(p);if(!u)break;g.push(u),p=u.from;}g.reverse();let k=new Set(g.flatMap(u=>u.proofIds));return {from:t,to:s,found:true,resolvedFrom:o.entity.id,resolvedTo:i.entity.id,entityPath:[o.entity.id,...g.map(u=>u.to)],hops:g,proofs:[...k].map(u=>r.proofsById.get(u)).filter(u=>!!u).sort((u,w)=>u.id.localeCompare(w.id))}}function Ee(e,t,s){return e.entities.filter(o=>(!t||o.kind===t)&&(!s||o.projectId===s)).sort((o,i)=>o.kind.localeCompare(i.kind)||o.label.localeCompare(i.label))}var m={relations:12,relatedEntities:12,proofs:8,proofIdsPerItem:4,aliasesPerEntity:8,attributeArrayItems:8,attributeStringCharacters:256};function oe(e){let t=[],s=new Set;for(let o=0;o<m.proofIdsPerItem&&t.length<m.proofs;o+=1)for(let i of e){let r=i.proofIds[o];if(!(!r||s.has(r))&&(s.add(r),t.push(r),t.length>=m.proofs))break}return t}function se(e,t,s){let o=e.identity.aliases.slice(0,m.aliasesPerEntity);s.aliases+=e.identity.aliases.length-o.length;let i=Object.fromEntries(Object.entries(e.attributes).map(([d,h])=>{if(Array.isArray(h)){let l=h.slice(0,m.attributeArrayItems);return s.attributeValues+=h.length-l.length,[d,l]}return typeof h=="string"&&h.length>m.attributeStringCharacters?(s.attributeValues+=1,[d,h.slice(0,m.attributeStringCharacters)]):[d,h]})),r=e.proofIds.filter(d=>t.has(d)).slice(0,m.proofIdsPerItem);return s.proofReferences+=e.proofIds.length-r.length,{...e,identity:{...e.identity,aliases:o},attributes:i,proofIds:r}}function ae(e){let t=Object.values(e.attributes).flatMap(s=>Array.isArray(s)?s:[s]);return [e.id,e.kind,e.label,e.projectId??"",e.identity.key,...e.identity.aliases,...t.map(s=>String(s??""))].join(" ").toLowerCase()}var ie=new Set(["a","an","and","are","as","at","be","been","being","by","can","check","could","did","do","does","find","for","from","give","had","has","have","how","i","in","into","is","it","its","may","might","of","on","or","our","show","should","that","the","their","them","then","there","these","they","this","those","tell","to","was","we","were","what","when","where","which","who","why","will","with","would","you","your"]),re=new Map([["authenticate","auth"],["authenticated","auth"],["authentication","auth"],["authorization","auth"],["authorizing","auth"],["config","configuration"],["configs","configuration"],["dependencies","dependency"],["connected","connect"],["connecting","connect"],["connection","connect"],["connections","connect"],["diagnostics","diagnostic"],["reliable","reliability"],["tested","test"],["testing","test"],["tests","test"],["verification","verify"],["verified","verify"],["verifies","verify"],["verifying","verify"]]);function M(e){let t=s=>b(s).replace(/\bc\+\+/gu," cplusplus ").replace(/\bc#/gu," csharp ").split(/[^a-z0-9]+/u).filter(o=>o.length>1||o==="c"||o==="r").map(o=>re.get(o)??o);return [...new Set([...t(e),...t(e.replace(/([a-z0-9])([A-Z])/g,"$1 $2"))])]}function ce(e){let t=b(e.label),s=b(e.identity.key),o=e.identity.aliases.map(b),i=ae(e);return {entity:e,label:t,identity:s,aliases:o,haystack:i,labelTokens:new Set(M(e.label)),identityTokens:new Set(M(e.identity.key)),aliasTokens:new Set(e.identity.aliases.flatMap(M)),allTokens:new Set(M(i))}}function E(e,t){return e.has(t)||t.length>=3&&[...e].some(s=>s.startsWith(t))}function _(e,t){return E(e.labelTokens,t)||E(e.identityTokens,t)||E(e.aliasTokens,t)||E(e.allTokens,t)}function le(e,t,s,o){let{label:i,identity:r,aliases:d,haystack:h}=e,l=0;(i===t||r===t||d.includes(t))&&(l+=1e4),(i.startsWith(t)||r.startsWith(t))&&(l+=250),h.includes(t)&&(l+=100);let a=0;for(let g of s){let p=o.get(g)??1,k=E(e.labelTokens,g),u=E(e.identityTokens,g),w=E(e.aliasTokens,g),f=_(e,g);f&&(a+=1),i===g?l+=80*p:k&&(l+=36*p),u&&(l+=24*p),w&&(l+=20*p),f&&(l+=10*p);}return s.length>0&&(l+=a/s.length*120),l}function F(e,t){let s=new Set;for(let o of t){let i=e.allTokens.has(o)?o:void 0,r=i===void 0&&o.length>=3?[...e.allTokens].find(h=>h.startsWith(o)&&!s.has(h)):void 0,d=i??r;d&&!s.has(d)&&s.add(d);}return s.size}var de=new Map([["c","c"],["clojure","clojure"],["cplusplus","cpp"],["cpp","cpp"],["typescript","typescript"],["ts","typescript"],["javascript","javascript"],["js","javascript"],["nodejs","javascript"],["python","python"],["py","python"],["go","go"],["golang","go"],["csharp","csharp"],["ada","ada"],["assembly","assembly"],["asm","assembly"],["cuda","cuda"],["dotnet","csharp"],["dart","dart"],["elixir","elixir"],["fsharp","fsharp"],["fortran","fortran"],["java","java"],["kotlin","kotlin"],["hlsl","hlsl"],["llvmir","llvm-ir"],["mlir","mlir"],["lua","lua"],["php","php"],["r","r"],["ruby","ruby"],["rust","rust"],["tablegen","tablegen"],["scala","scala"],["svelte","svelte"],["swift","swift"],["vue","vue"]]);function pe(e){return new Set(e.map(t=>de.get(t)).filter(t=>!!t))}function Y(e){let t=e.attributes.language;return typeof t=="string"?b(t):null}function ge(e){return {project:1e3,service:900,api:900,package:850,endpoint:800,container:700,deployment:700,environment:650,pipeline:600,"test-suite":550,owner:500,decision:450,document:400}[e.kind]??0}var he=new Set(["language","languages","binding","bindings","bridge","bridges","dependency","dependencies","depends","core","runtime","owner","owners","ownership","maintainer","ci","pipeline","pipelines","workflow","deploy","deployment","infrastructure","container","doc","docs","document","documentation","service","services","api","rpc","schema","schemas","message","protobuf","proto","contract"]),ue=new Set(["app","application","applications","call","calls","code","communicate","communication","connect","define","defined","expose","exposed","handle","handled","implement","implementation","integrate","integration","interact","interaction","project","provide","provided","system","use","used","uses","using"]);function fe(e){return he.has(e)||ue.has(e)}function ye(e,t){let s=t.has("language")||t.has("languages"),o=t.has("binding")||t.has("bindings")||t.has("bridge")||t.has("bridges"),i=t.has("dependency")||t.has("dependencies")||t.has("depends"),r=t.has("core")||t.has("runtime"),d=t.has("owner")||t.has("owners")||t.has("ownership")||t.has("maintainer"),h=t.has("ci")||t.has("pipeline")||t.has("pipelines")||t.has("workflow"),l=t.has("deploy")||t.has("deployment")||t.has("infrastructure")||t.has("container"),a=t.has("doc")||t.has("docs")||t.has("document")||t.has("documentation"),g=t.has("service")||t.has("services")||t.has("api")||t.has("rpc"),p=t.has("schema")||t.has("schemas")||t.has("message")||t.has("protobuf")||t.has("proto")||t.has("contract"),k=typeof e.attributes.mechanism=="string"?b(e.attributes.mechanism):"",u=typeof e.attributes.specification=="string"?b(e.attributes.specification):"",w=b(e.label),f=0;if(s&&e.kind==="language"){let O=typeof e.attributes.fileCount=="number"?e.attributes.fileCount:0;f+=900+Math.min(O,1e4)/10;}return o&&e.kind==="protocol"&&(f+=800),i&&e.kind==="package"&&(f+=650),r&&e.kind==="package"&&/(?:^|[_-])core(?:$|[_-])/u.test(w)&&(f+=700),r&&e.kind==="protocol"&&k.includes("core")&&(f+=300),d&&e.kind==="owner"&&(f+=850),h&&e.kind==="pipeline"&&(f+=800),l&&["deployment","container","environment"].includes(e.kind)&&(f+=775),a&&["document","decision"].includes(e.kind)&&(f+=725),g&&["api","endpoint","service"].includes(e.kind)&&(f+=700),p&&(e.kind==="schema"||(e.kind==="api"||e.kind==="protocol")&&(u.includes("protobuf")||k.includes("protobuf")))&&(f+=750),f}function we(e){return [e.has("language")||e.has("languages"),e.has("binding")||e.has("bindings")||e.has("bridge")||e.has("bridges"),e.has("dependency")||e.has("dependencies")||e.has("depends"),e.has("core")||e.has("runtime"),e.has("owner")||e.has("ownership")||e.has("maintainer"),e.has("ci")||e.has("pipeline")||e.has("workflow"),e.has("deploy")||e.has("deployment")||e.has("infrastructure"),e.has("doc")||e.has("docs")||e.has("documentation"),e.has("service")||e.has("api")||e.has("rpc"),e.has("schema")||e.has("protobuf")||e.has("proto")||e.has("contract")].filter(Boolean).length>=3}function We(e,t){let s=b(t.query),o=[...new Set(M(t.query))],i=new Set(M(t.projectId??"")),r=t.projectId?o.filter(n=>!i.has(n)):o,d=!!(t.projectId&&o.length>0&&r.length===0),h=r.filter(n=>!ie.has(n)),l=h.length>0?h:r,a=pe(l),g=new Set(l),p=l.filter(n=>!fe(n)),k=we(g),u=l.length<=1?l.length:Math.min(2,Math.ceil(l.length/3)),w=t.minimumTermMatches===void 0?u:Math.min(u,Math.max(1,Math.trunc(t.minimumTermMatches))),f=Math.max(1,Math.min(Math.trunc(t.limit??12),100)),O=Math.max(0,Math.min(Math.trunc(t.relationsPerEntity??4),20)),G=new Set;if(t.projectId){let n=new Set(e.entities.filter(c=>c.kind==="project"&&(c.projectId===t.projectId||c.label===t.projectId)).map(c=>c.id));for(let c of e.relations)n.has(c.from)&&G.add(c.to),n.has(c.to)&&G.add(c.from);}let P=e.entities.filter(n=>(!t.kind||n.kind===t.kind)&&(!t.projectId||n.projectId===t.projectId||n.projectId===void 0&&G.has(n.id))).map(ce),$=new Map(l.map(n=>{let c=P.filter(y=>_(y,n)).length;return [n,Math.log((P.length+1)/(c+1))+1]})),X=p.some(n=>P.some(c=>_(c,n))),v=P.map(n=>{let c=F(n,l),y=F(n,p),I=Y(n.entity),S=I&&a.has(I)?400:0,x=ye(n.entity,g),j=p.length===0||p.some(te=>_(n,te))?x:0;return {entity:n.entity,matchedTerms:c,matchedQualifiers:y,intentScore:j,score:d?ge(n.entity):le(n,s,l,$)+y*300+S+j}}).filter(n=>{let c=Y(n.entity);return (a.size===0||c===null||a.has(c))&&(s.length===0||n.score>0&&(!X||p.length===0||n.matchedQualifiers>0)&&(d||n.matchedTerms>=w||n.intentScore>0&&(k||l.length<=2)))}).sort((n,c)=>c.score-n.score||n.entity.kind.localeCompare(c.entity.kind)||n.entity.label.localeCompare(c.entity.label)),W=(k?(()=>{let n=[],c=[],y=new Map,I=new Set;for(let S of v){let x=y.get(S.entity.kind)??0,j=b(S.entity.label);x<2&&!I.has(j)?(n.push(S),y.set(S.entity.kind,x+1),I.add(j)):c.push(S);}return [...n,...c]})():v).slice(0,f).map(n=>n.entity),R=new Set(W.map(n=>n.id)),L=new Map,H=e.relations.filter(n=>{if(!(R.has(n.from)||R.has(n.to)))return false;let y=R.has(n.from)?n.from:n.to,I=L.get(y)??0;return I>=O?false:(L.set(y,I+1),true)}),K=t.projection==="agent",T=K?H.slice(0,m.relations):H,z=B(e),N=[...new Set(T.flatMap(n=>[n.from,n.to]).filter(n=>!R.has(n)))].map(n=>z.entitiesById.get(n)).filter(n=>!!n).map(({id:n,kind:c,label:y,projectId:I})=>({id:n,kind:c,label:y,...I?{projectId:I}:{}})).sort((n,c)=>n.kind.localeCompare(c.kind)||n.label.localeCompare(c.label)),Q=K?N.slice(0,m.relatedEntities):N,q=new Set([...W.flatMap(n=>n.proofIds),...T.flatMap(n=>n.proofIds)]),Z=K?oe([...W,...T]):[...q],C=new Set(Z),A={entities:v.length-W.length,relations:H.length-T.length,relatedEntities:N.length-Q.length,proofs:q.size-C.size,proofReferences:0,aliases:0,attributeValues:0},U=K?W.map(n=>se(n,C,A)):W,J=K?T.map(n=>{let c=n.proofIds.filter(y=>C.has(y)).slice(0,m.proofIdsPerItem);return A.proofReferences+=n.proofIds.length-c.length,{...n,proofIds:c}}):T,ee=[...C].map(n=>z.proofsById.get(n)).filter(n=>!!n).sort((n,c)=>n.id.localeCompare(c.id));return {schemaVersion:ne,graphSourceHash:e.source.hash,query:t.query,kind:t.kind??null,...t.projectId?{projectId:t.projectId}:{},limit:f,totalMatches:v.length,truncated:v.length>U.length||K&&Object.values(A).some(n=>n>0),entities:U,relatedEntities:Q,relations:J,proofs:ee,...K?{budget:{mode:"agent",limits:{...m},omitted:A}}:{}}}export{ne as a,D as b,Ke as c,Se as d,Ee as e,We as f};
@@ -0,0 +1 @@
1
+ import {a}from'./chunk-FB7SCXAZ.js';import {createHash}from'crypto';function p(o){return Array.isArray(o)?`[${o.map(p).join(",")}]`:o&&typeof o=="object"?`{${Object.entries(o).sort(([t],[d])=>t.localeCompare(d)).map(([t,d])=>`${JSON.stringify(t)}:${p(d)}`).join(",")}}`:JSON.stringify(o)}function k(o){return createHash("sha256").update(p({entities:o.entities,relations:o.relations,proofs:o.proofs.map(({observedAt:t,freshness:d,...r})=>r)})).digest("hex")}function v(o,t){return [...new Set([...Object.keys(o),...Object.keys(t)])].filter(d=>p(o[d])!==p(t[d])).sort()}function f(o,t){let d=new Map(o.map(a=>[a.id,a])),r=new Map(t.map(a=>[a.id,a])),s=t.filter(a=>!d.has(a.id)),e=o.filter(a=>!r.has(a.id)),c=[];for(let[a,i]of d){let g=r.get(a);if(!g)continue;let l=v(i,g);l.length>0&&c.push({id:a,before:i,after:g,changedFields:l});}return {added:[...s].sort((a,i)=>a.id.localeCompare(i.id)),removed:[...e].sort((a,i)=>a.id.localeCompare(i.id)),changed:c.sort((a,i)=>a.id.localeCompare(i.id))}}function y(o){return {...o,observedAt:"1970-01-01T00:00:00.000Z",freshness:"fresh"}}function A(o,t){let d=f(o.map(y),t.map(y)),r=new Map(o.map(e=>[e.id,e])),s=new Map(t.map(e=>[e.id,e]));return {added:d.added.map(e=>s.get(e.id)??e),removed:d.removed.map(e=>r.get(e.id)??e),changed:d.changed.map(e=>({id:e.id,before:r.get(e.id),after:s.get(e.id),changedFields:e.changedFields}))}}function K(o,t){let d=new Set(t);return o.proofs.filter(r=>d.has(r.id)).map(r=>r.artifact)}function P(o,t,d=new Date){let r=f(o.entities,t.entities),s=f(o.relations,t.relations),e=A(o.proofs,t.proofs),c=new Set([...r.added.map(n=>n.id),...r.removed.map(n=>n.id),...r.changed.map(n=>n.id)]),a$1=[...s.added,...s.removed,...s.changed.flatMap(n=>[n.before,n.after].filter(Boolean))];for(let n of a$1)c.add(n.from),c.add(n.to);let i=new Set(c);for(let n of [...o.relations,...t.relations])(c.has(n.from)||c.has(n.to))&&(i.add(n.from),i.add(n.to));let g=new Set([...e.added.map(n=>n.id),...e.removed.map(n=>n.id),...e.changed.map(n=>n.id)]),l=[...new Set([...K(o,g),...K(t,g),...e.added.map(n=>n.artifact),...e.removed.map(n=>n.artifact),...e.changed.flatMap(n=>[n.before?.artifact,n.after?.artifact])])].filter(n=>!!n).sort(),h=r.removed.length+s.removed.length+e.removed.length,m=h+r.added.length+r.changed.length+s.added.length+s.changed.length+e.added.length+e.removed.length+e.changed.length,W=m===0?"none":h>0||i.size>=10?"high":i.size>=5||m>=5?"medium":"low";return {schemaVersion:a,generatedAt:d.toISOString(),workspace:t.workspace,base:{schemaVersion:o.schemaVersion,generatedAt:o.generatedAt,fingerprint:k(o)},head:{schemaVersion:t.schemaVersion,generatedAt:t.generatedAt,fingerprint:k(t)},entities:r,relations:s,proofs:e,impactedEntityIds:[...i].sort(),changedArtifacts:l,summary:{entityAdds:r.added.length,entityRemovals:r.removed.length,entityChanges:r.changed.length,relationAdds:s.added.length,relationRemovals:s.removed.length,relationChanges:s.changed.length,proofAdds:e.added.length,proofRemovals:e.removed.length,proofChanges:e.changed.length,impactedEntities:i.size,changedArtifacts:l.length,risk:W}}}export{P as a};
@@ -0,0 +1,6 @@
1
+ import {a}from'./chunk-NS53IPAC.js';import {a as a$1}from'./chunk-MGL6DBOR.js';import {g}from'./chunk-OZXCNVGW.js';import {s,b,a as a$2,d,c}from'./chunk-ODK4LCEL.js';import pe from'path';import h from'chalk';import {createHash}from'crypto';var F="workspai.doctor-adapter.v1",D=["runtime","dependency","security","configuration","test","quality"];function A(e){return e.trim().toLowerCase().replace(/[^a-z0-9+.#-]+/g,"-")}function ae(e){if(e.contractVersion!==F)throw new Error(`Unsupported Doctor adapter contract: ${e.contractVersion}`);if(!e.id.trim())throw new Error("Doctor adapter id must not be empty.");if(e.runtimeFamilies.length===0)throw new Error(`Doctor adapter ${e.id} must own at least one runtime family.`);if(e.platforms.length===0)throw new Error(`Doctor adapter ${e.id} must declare supported platforms.`);let i=e.domains.map(t=>t.domain);if(i.length!==D.length||new Set(i).size!==D.length||D.some(t=>!i.includes(t)))throw new Error(`Doctor adapter ${e.id} must declare every canonical diagnostic domain exactly once.`);for(let t of e.domains)if(t.level==="unsupported"&&t.limitations.length===0)throw new Error(`Doctor adapter ${e.id} must explain unsupported ${t.domain} coverage.`)}var $=class{#e=new Map;#i=new Map;#t=new Map;register(i){ae(i);let t=A(i.id);if(this.#e.has(t))throw new Error(`Doctor adapter id is already registered: ${i.id}`);let s=[...i.runtimeFamilies,...i.aliases].map(A);for(let c of s){let a=this.#i.get(c);if(a)throw new Error(`Doctor runtime ${c} is already owned by adapter ${a}.`)}for(let c of i.frameworks.map(A)){let a=this.#t.get(c);if(a)throw new Error(`Doctor framework ${c} is already owned by adapter ${a}.`)}let r=structuredClone(i);this.#e.set(t,r);for(let c of s)this.#i.set(c,t);for(let c of i.frameworks.map(A))this.#t.set(c,t);return this}resolveWithDiagnostics(i){let t=i.runtimeFamily?this.#i.get(A(i.runtimeFamily)):void 0,s=i.framework?this.#t.get(A(i.framework)):void 0;if(t&&s&&t!==s)return {status:"conflict",descriptor:null,runtimeOwner:t,frameworkOwner:s};let r=t??s;return {status:r?"matched":"unresolved",descriptor:r?structuredClone(this.#e.get(r)??null):null,...t?{runtimeOwner:t}:{},...s?{frameworkOwner:s}:{}}}resolve(i){return this.resolveWithDiagnostics(i).descriptor}list(){return [...this.#e.values()].map(i=>structuredClone(i)).sort((i,t)=>i.id.localeCompare(t.id))}};var Y=[...D],W=["linux","darwin","win32"],re=[{id:"node",aliases:["nodejs","javascript","typescript"],frameworks:["NestJS","Next.js","Remix","Nuxt","React","Vue","Angular","SvelteKit","Svelte","Vite","Astro","Solid","Express","Fastify","Koa","Electron","VS Code Extension"],tier:"first-class",native:Y},{id:"python",aliases:["py"],frameworks:["FastAPI","Django","Flask","Python"],tier:"first-class",native:Y},{id:"go",aliases:["golang"],frameworks:["Go","Go/Fiber","Go/Gin","Echo"],tier:"first-class",native:["runtime","dependency","test","quality"],portable:["security","configuration"]},{id:"java",aliases:["jvm"],frameworks:["Java","Spring Boot"],tier:"first-class",native:["runtime","dependency","test","quality"],portable:["security","configuration"]},{id:"dotnet",aliases:[".net","csharp","c#"],frameworks:["ASP.NET"],tier:"first-class",native:["runtime","dependency","test","quality"],portable:["security","configuration"]},{id:"rust",aliases:["cargo"],frameworks:["Rust","Axum"],tier:"first-class",native:["runtime","dependency","test","quality"],portable:["security","configuration"]},{id:"php",aliases:["composer"],frameworks:["PHP","Laravel"],tier:"first-class",native:["runtime","dependency","security"],portable:["configuration","test","quality"]},{id:"ruby",aliases:["bundler"],frameworks:["Ruby","Ruby on Rails"],tier:"extended",portable:["runtime","dependency","configuration","test","quality"],observable:["security"]},{id:"elixir",aliases:["beam"],frameworks:["Elixir","Phoenix"],tier:"extended",portable:["runtime","dependency","configuration","test","quality"],observable:["security"]},{id:"clojure",frameworks:["Clojure"],tier:"extended",portable:["runtime","dependency","configuration","test","quality"],observable:["security"]},{id:"deno",frameworks:["Deno"],tier:"extended",portable:["runtime","dependency","configuration","test","quality"],observable:["security"]},{id:"bun",frameworks:["Bun"],tier:"extended",portable:["runtime","dependency","configuration","test","quality"],observable:["security"]},{id:"scala",frameworks:["Scala"],tier:"extended",portable:["runtime","dependency","configuration","test","quality"],observable:["security"]},{id:"kotlin",frameworks:["Kotlin"],tier:"extended",portable:["runtime","dependency","configuration","test","quality"],observable:["security"]},{id:"c",aliases:["c-lang"],frameworks:["C"],tier:"extended",portable:["runtime","dependency","test","quality"],observable:["configuration"],limitations:["Security diagnosis requires a declared native scanner or workspace adapter."]},{id:"cpp",aliases:["c++","cplusplus"],frameworks:["C++"],tier:"extended",portable:["runtime","dependency","test","quality"],observable:["configuration"],limitations:["Security diagnosis requires a declared native scanner or workspace adapter."]}];function oe(e,i){let t={runtime:["project markers","entrypoints","toolchain evidence"],dependency:["dependency manifests","lockfiles","installed-tree evidence"],security:["runtime-native audit","advisory evidence"],configuration:["environment contracts","deployment/container markers"],test:["test scripts","test configuration","coverage evidence"],quality:["lint/format/static-analysis contracts"]};return [`${e} adapter`,...t[i]]}function ce(e,i){return e.native?.includes(i)?"native":e.portable?.includes(i)?"portable":e.observable?.includes(i)?"observable":"unsupported"}function le(e){let i=D.map(t=>{let s=ce(e,t);return {domain:t,level:s,evidenceSources:s==="unsupported"?[]:oe(e.id,t),limitations:s==="unsupported"?[`${e.id} has no built-in ${t} provider; declare a workspace adapter.`]:s==="observable"?[`${t} evidence is observable but not runtime-native for ${e.id}.`]:[]}});return {contractVersion:F,id:`builtin.${e.id}`,runtimeFamilies:[e.id],aliases:e.aliases??[],frameworks:e.frameworks,projectKinds:["backend","frontend","desktop","extension","fullstack","generic"],tier:e.tier,platforms:[...W],domains:i,repairModes:["typed-operation","structured-invocation","manual-guidance"],source:"builtin",limitations:e.limitations??[]}}function de(){return {contractVersion:F,id:"builtin.unknown",runtimeFamilies:["unknown"],aliases:["generic","unrecognized"],frameworks:["Unknown"],projectKinds:["backend","frontend","desktop","extension","fullstack","generic"],tier:"fallback",platforms:[...W],domains:D.map(e=>({domain:e,level:e==="security"?"unsupported":"observable",evidenceSources:e==="security"?[]:["portable workspace markers","declared custom checks"],limitations:[e==="security"?"No safe security claim is possible without a runtime-native audit provider.":`Only portable ${e} evidence is available until a runtime adapter is registered.`]})),repairModes:["manual-guidance"],source:"builtin",limitations:["Unknown runtimes are fail-closed: missing domain evidence is reported as unknown, never healthy.","Automatic repair is unavailable until a typed adapter owns the runtime."]}}function P(){let e=new $;for(let i of re)e.register(le(i));return e.register(de()),e}function J(e,i=P()){let t=i.resolveWithDiagnostics(e),s=t.descriptor??i.resolve({runtimeFamily:"unknown"});if(!s)throw new Error("Doctor fallback adapter is not registered.");let r=c=>s.domains.filter(a=>a.level===c).map(a=>a.domain);return {registryVersion:b,adapterId:s.id,runtimeFamily:s.runtimeFamilies[0]??"unknown",tier:s.tier,confidence:s.tier==="first-class"?"high":s.tier==="extended"?"medium":"low",nativeDomains:r("native"),portableDomains:r("portable"),observableDomains:r("observable"),unsupportedDomains:r("unsupported"),limitations:[...t.status==="conflict"?[`Runtime/framework ownership conflict (${t.runtimeOwner} vs ${t.frameworkOwner}); Doctor failed closed instead of selecting an ambiguous adapter.`]:[],...s.limitations,...s.domains.flatMap(c=>c.limitations)]}}function K(e={}){let i=P(),t=i.list(),s=i.resolveWithDiagnostics({runtimeFamily:e.runtime,framework:e.framework}),r=e.runtime||e.framework?[s.descriptor]:t;if((e.runtime||e.framework)&&!r[0]){let a=i.resolve({runtimeFamily:"unknown"});a&&(s.status==="conflict"&&a.limitations.unshift(`Runtime/framework ownership conflict (${s.runtimeOwner} vs ${s.frameworkOwner}); Doctor failed closed instead of selecting an ambiguous adapter.`),r[0]=a);}let c=r.filter(a=>!!a);return {schemaVersion:a$2,registryVersion:b,generatedBy:"workspai",policy:{unknownIsHealthy:false,unsupportedIsHealthy:false,repairRequiresTypedOperation:true,canonicalDomains:[...D]},summary:{adapterCount:c.length,firstClassRuntimes:c.filter(a=>a.tier==="first-class").length,extendedRuntimes:c.filter(a=>a.tier==="extended").length,fallbackRuntimes:c.filter(a=>a.tier==="fallback").length,frameworkCount:new Set(c.flatMap(a=>a.frameworks)).size,platformCount:new Set(c.flatMap(a=>a.platforms)).size},adapters:c}}var me=["runtime","dependency","security","configuration","test","quality"];function I(e){return createHash("sha256").update(e).digest("hex").slice(0,12)}function S(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function Q(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g," ").replace(/\s+/g," ").trim()}function ge(e,i){let t=Q(e);return t?i.some(s=>[s.reason,s.recommendation??""].map(Q).filter(Boolean).some(c=>c===t||c.includes(t)||t.includes(c))):true}function fe(e){return e.status==="fail"?"blocking":e.status==="warn"?"advisory":"informational"}function X(e){return e.issueClass==="dependency"?"dependency":e.issueClass==="security"?"security":e.issueClass==="environment"||e.issueClass==="configuration"||e.issueClass==="container"||e.issueClass==="deployment"||e.issueClass==="workspace-contract"?"configuration":e.issueClass==="test"?"test":e.issueClass==="quality"||e.issueClass==="custom"?"quality":e.issueClass==="runtime"||e.issueClass==="framework"||e.issueClass==="source-tree"?"runtime":null}function ye(e,i){return me.map(t=>{let s=e.filter(o=>X(o)===t),r=e.filter(o=>o.applicability!=="not-applicable"&&X(o)===t),c=i.unsupportedDomains.includes(t);if(r.length===0){let o=s.some(d=>d.applicability==="not-applicable");return {id:t,status:o?"not-applicable":"not-run",observationCount:0,blockingFindings:0,advisoryFindings:0,reason:o?`${t} checks ran and found no declared intent requiring this domain.`:c?`${t} is unsupported by Doctor adapter ${i.adapterId}; no healthy claim is allowed.`:`No ${t} diagnostic observation was produced.`}}let a=r.some(o=>o.freshness?.status==="stale"||o.freshness?.status==="unknown"),p=r.filter(o=>o.status==="fail").length,m=r.filter(o=>o.status==="warn").length,C=p>0||m>0;return {id:t,status:a?"stale":C?"findings":c?"not-run":"clean",observationCount:r.length,blockingFindings:p,advisoryFindings:m,reason:a?`${t} evidence is stale or has unknown freshness.`:C?`${t} diagnostics produced findings.`:c?`${t} observations cannot establish complete health because adapter ${i.adapterId} declares the domain unsupported.`:`${t} diagnostics completed without findings.`}})}function De(e){if(e.status==="pass")return "not-needed";let i=e.repairCapability;return i?i.status==="manual"||i.requiresReview?"manual":i.status!=="available"||!i.canAutoFix?"unavailable":i.requiresApproval?"approval-required":"automatic":"unavailable"}function be(e){if(e.freshness?.status==="stale"||e.freshness?.status==="unknown")return {label:"low",score:.35,state:"unknown"};let i=!!(e.issueClass&&e.issueClass!=="unknown"),t=!!(e.repairCapability?.operation?.type||e.repairCapability?.invocation?.executable);return i&&t&&e.repairIntent?.confidence==="high"?{label:"high",score:.95,state:"confirmed"}:i&&(e.status==="fail"||e.status==="warn")?{label:"medium",score:t?.82:.68,state:"candidate"}:e.status==="pass"?{label:"high",score:.98,state:"confirmed"}:{label:"low",score:.3,state:"unknown"}}function ve(e,i){let t=[{kind:"probe",role:"observation",ref:`probe:${e.id}`,claim:e.reason}];for(let r of e.repairCapability?.files??[])t.push({kind:"file",role:"repair-target",ref:r.split(pe.sep).join("/"),claim:"Structured repair capability declared this path as an affected target."});if(e.repairCapability?.invocation?.executable){let r=e.repairCapability.invocation;t.push({kind:"command",role:"verification",ref:[r.executable,...r.args??[]].join(" "),claim:"Structured command invocation is available for this diagnostic path."});}if(e.issueClass==="security"&&/(?:dependency|audit|vulnerab|security-hygiene)/i.test(`${e.id} ${e.label}`))for(let r of i??[])t.push({kind:"dependency",role:"subject",ref:r.version?`${r.name}@${r.version}`:r.name,claim:r.advisoryIds&&r.advisoryIds.length>0?`Dependency is referenced by ${r.advisoryIds.join(", ")}.`:"Dependency is present in security audit evidence."});return t}function we(e,i){let t=i.issueClass?.trim()||"unknown",s=be(i);return {id:`${S(i.id)}:${I(`${e.projectPath}\0${i.id}`)}`,causalKey:[S(e.projectName),I(e.projectPath),S(t),S(i.id)].join(":"),projectName:e.projectName,projectPath:e.projectPath,probeId:i.id,label:i.label,status:fe(i),severity:i.severity,issueClass:t,operationalImpact:i.operationalImpact?.trim()||"developer-friction",applicability:i.applicability??"applicable",confidence:s.label,confidenceScore:s.score,diagnosisState:s.state,symptom:i.reason,...i.recommendation?{recommendation:i.recommendation}:{},proofs:ve(i,e.dependencySubjects),repair:{disposition:De(i),...i.repairCapability?.id?{capabilityId:i.repairCapability.id}:{},...i.repairCapability?.operation?.type?{operationType:i.repairCapability.operation.type}:{},...i.repairCapability?.verifyCommand?{verifyCommand:i.repairCapability.verifyCommand}:{},requiresFreshEvidence:i.repairIntent?.requiresFreshEvidence===true||i.freshness?.verifyBeforeUse===true}}}function he(e,i,t){let s=`legacy-runtime-issue-${t+1}`;return {id:`${s}:${I(`${e.projectPath}\0${i}`)}`,causalKey:[S(e.projectName),I(e.projectPath),"unknown",I(i)].join(":"),projectName:e.projectName,projectPath:e.projectPath,probeId:s,label:"Runtime diagnostic issue",status:"blocking",severity:"error",issueClass:"unknown",operationalImpact:"runtime-risk",applicability:"applicable",confidence:"low",confidenceScore:.25,diagnosisState:"unknown",symptom:i,proofs:[{kind:"unknown",role:"observation",ref:`legacy-issue:${t+1}`,claim:i}],repair:{disposition:"unavailable",requiresFreshEvidence:true}}}function Z(e){let i=[...e.probes],t=[...new Set((e.runtimeFamilies&&e.runtimeFamilies.length>0?e.runtimeFamilies:[e.runtimeFamily??"unknown"]).filter(Boolean))],s=e.runtimeFamily??t[0]??"unknown",r=t.filter(n=>n!==s&&n!=="unknown"),c=J({runtimeFamily:e.runtimeFamily,framework:e.framework},e.adapterRegistry),a$1=ye(i,c),p=(e.legacyIssues??[]).filter(n=>!ge(n,i)),m=new Map;for(let n of i){let l=m.get(n.id)??new Set;l.add(n.status),m.set(n.id,l);}let C=[...m.entries()].filter(([,n])=>n.size>1).map(([n,l])=>({probeId:n,statuses:[...l].sort(),reason:"The same diagnostic probe produced contradictory states in one project scan."})),o=[...i.filter(n=>n.applicability!=="not-applicable"&&n.status!=="pass").map(n=>we(e,n)),...p.map((n,l)=>he(e,n,l))],d={blocking:4,unknown:3,advisory:2,informational:1},O=new Map;for(let n of o){let l=O.get(n.causalKey)??[];l.push(n),O.set(n.causalKey,l);}let g=[...O.values()].map(n=>{let u=[...n].sort((f,j)=>d[j.status]-d[f.status]||j.confidenceScore-f.confidenceScore||f.id.localeCompare(j.id)).at(0);if(!u)throw new Error("Doctor diagnosis causal group cannot be empty.");let G=structuredClone(u);return G.proofs=[...new Map(n.flatMap(f=>f.proofs).map(f=>[`${f.kind}:${f.role}:${f.ref}:${f.claim}`,f])).values()],G}).sort((n,l)=>n.causalKey.localeCompare(l.causalKey)||n.id.localeCompare(l.id)),k=new Map;for(let n of g){let l=k.get(n.causalKey)??[];l.push(n),k.set(n.causalKey,l);}let b=[...k.entries()].map(([n,l])=>({causalKey:n,issueClass:l[0]?.issueClass??"unknown",status:l.some(u=>u.status==="blocking")?"blocking":l.some(u=>u.status==="advisory")?"advisory":l.some(u=>u.status==="unknown")?"unknown":"informational",findingIds:l.map(u=>u.id),projectPaths:[...new Set(l.map(u=>u.projectPath))],repairable:l.some(u=>u.repair.disposition==="automatic"||u.repair.disposition==="approval-required")})),v=[...g.filter(n=>n.diagnosisState==="unknown"||n.issueClass==="unknown"||n.applicability==="unknown").map(n=>({id:`unknown:${n.id}`,probeId:n.probeId,reason:n.issueClass==="unknown"?"The observation is real, but Doctor cannot yet bind it to a typed issue class.":"Evidence is insufficient or stale for a confirmed diagnosis."})),...a$1.filter(n=>n.status==="not-run"||n.status==="stale").map(n=>({id:`unknown:domain:${n.id}:${I(e.projectPath)}`,reason:n.reason})),...r.map(n=>({id:`unknown:runtime:${S(n)}:${I(e.projectPath)}`,reason:e.projectArchetype==="platform"?`${n} is part of this cross-language platform, but only portable evidence and the primary ${s} runtime adapter were evaluated. Add a typed ${n} adapter before making runtime-specific health claims.`:`${n} was detected inside this composite project boundary, but the ${s} adapter is the only runtime-specific adapter evaluated for this scan. Declare a nested project boundary or a typed Doctor adapter before treating ${n} as healthy.`}))],y=g.filter(n=>n.diagnosisState!=="unknown").length,x=g.length===0?100:y/g.length*100,ie=a$1.filter(n=>n.status!=="not-run"&&n.status!=="stale").length/a$1.length*100,U=t.filter(n=>n!=="unknown").length,te=s!=="unknown"&&t.includes(s)?1:0,ne=U===0?0:te/U*100,se=Math.round(Math.min(x,ie,ne)*100)/100;return {schemaVersion:a,engineVersion:"universal-diagnosis-v1",project:{name:e.projectName,path:e.projectPath,runtimeFamily:e.runtimeFamily??"unknown",runtimeFamilies:t,framework:e.framework??"Unknown",projectKind:e.projectKind??"generic"},capability:c,domains:a$1,coverage:{totalObservations:i.length+p.length,evaluatedObservations:i.filter(n=>n.applicability!=="not-applicable").length,passingObservations:i.filter(n=>n.applicability!=="not-applicable"&&n.status==="pass").length,blockingFindings:g.filter(n=>n.status==="blocking").length,advisoryFindings:g.filter(n=>n.status==="advisory").length,unknownFindings:v.length,repairableFindings:g.filter(n=>n.repair.disposition==="automatic"||n.repair.disposition==="approval-required").length,manualFindings:g.filter(n=>n.repair.disposition==="manual").length,unsupportedFindings:g.filter(n=>n.repair.disposition==="unavailable").length,contradictionCount:C.length,diagnosisCompleteness:se},findings:g,causalGroups:b,unknowns:v,contradictions:C}}function w(e){let i=e.severity??"error",t=e.repair??"unavailable";return {id:e.id,label:e.label,status:i==="error"?"fail":"warn",severity:i,reason:`${e.label} detected by the validation corpus.`,issueClass:e.issueClass,operationalImpact:i==="error"?"release-risk":"ci-risk",repairIntent:{confidence:e.confidence??"medium",requiresFreshEvidence:true},...t==="unavailable"?{}:{repairCapability:{id:`repair.${e.id}`,status:t==="manual"?"manual":"available",canAutoFix:t==="automatic"||t==="approval-required",requiresApproval:t==="approval-required",requiresReview:t==="manual",operation:{type:"validation-operation"},verifyCommand:"npx workspai doctor project --json"}}}}var Ce=[{id:"runtime-missing",diseaseClass:"runtime",description:"Required runtime is absent.",probe:w({id:"runtime-missing",label:"Runtime missing",issueClass:"runtime"}),expected:{finding:true,domain:"runtime",status:"blocking",diagnosisState:"candidate",repairDisposition:"unavailable"}},{id:"dependencies-missing",diseaseClass:"dependency",description:"Installed dependency tree is absent.",probe:w({id:"dependencies-missing",label:"Dependencies missing",issueClass:"dependency",repair:"automatic",confidence:"high"}),expected:{finding:true,domain:"dependency",status:"blocking",diagnosisState:"confirmed",repairDisposition:"automatic"}},{id:"security-advisory",diseaseClass:"security",description:"A runtime-native audit reports a blocking advisory.",probe:w({id:"security-advisory",label:"Security advisory",issueClass:"security",repair:"approval-required",confidence:"high"}),expected:{finding:true,domain:"security",status:"blocking",diagnosisState:"confirmed",repairDisposition:"approval-required"}},{id:"environment-contract",diseaseClass:"configuration",description:"Environment/configuration contract is incomplete.",probe:w({id:"environment-contract",label:"Environment contract incomplete",issueClass:"environment",severity:"warn",repair:"manual"}),expected:{finding:true,domain:"configuration",status:"advisory",diagnosisState:"candidate",repairDisposition:"manual"}},{id:"container-contract",diseaseClass:"configuration",description:"Container delivery contract is incomplete.",probe:w({id:"container-contract",label:"Container contract incomplete",issueClass:"container",severity:"warn"}),expected:{finding:true,domain:"configuration",status:"advisory",diagnosisState:"candidate",repairDisposition:"unavailable"}},{id:"tests-missing",diseaseClass:"test",description:"No deterministic test surface is declared.",probe:w({id:"tests-missing",label:"Tests missing",issueClass:"test",severity:"warn",repair:"manual"}),expected:{finding:true,domain:"test",status:"advisory",diagnosisState:"candidate",repairDisposition:"manual"}},{id:"quality-missing",diseaseClass:"quality",description:"No lint/format/static-analysis surface is declared.",probe:w({id:"quality-missing",label:"Quality tooling missing",issueClass:"quality",severity:"warn"}),expected:{finding:true,domain:"quality",status:"advisory",diagnosisState:"candidate",repairDisposition:"unavailable"}},{id:"stale-evidence",diseaseClass:"freshness",description:"Evidence is stale and must not be treated as confirmed.",probe:{...w({id:"stale-evidence",label:"Stale evidence",issueClass:"security"}),freshness:{status:"stale",verifyBeforeUse:true}},expected:{finding:true,domain:"security",status:"blocking",diagnosisState:"unknown",repairDisposition:"unavailable"}},{id:"unknown-disease",diseaseClass:"unknown",description:"A real symptom cannot be bound to a typed disease class.",probe:w({id:"unknown-disease",label:"Unknown disease",issueClass:"unknown"}),expected:{finding:true,status:"blocking",diagnosisState:"unknown",repairDisposition:"unavailable"}},{id:"healthy-runtime",diseaseClass:"healthy-control",description:"Healthy evidence must not become a finding.",probe:{id:"healthy-runtime",label:"Healthy runtime",status:"pass",severity:"info",reason:"Runtime evidence is healthy.",issueClass:"runtime",operationalImpact:"none"},expected:{finding:false,domain:"runtime"}}];function _(e){return Math.round(e*1e4)/1e4}function ee(){let i=P().list(),t=i.flatMap(o=>Ce.map(d=>{let O=o.runtimeFamilies[0]??"unknown",g=o.frameworks[0]??"Unknown",k=Z({projectName:`validation-${o.id}-${d.id}`,projectPath:`/virtual/doctor-validation/${o.id}/${d.id}`,runtimeFamily:O,framework:g,projectKind:"generic",probes:[d.probe]}),b=k.findings.find(x=>x.probeId===d.probe.id),N=k.domains.find(x=>x.observationCount>0)?.id,v={finding:!!b,...N?{domain:N}:{},...b?.status?{status:b.status}:{},...b?.diagnosisState?{diagnosisState:b.diagnosisState}:{},...b?.repair.disposition?{repairDisposition:b.repair.disposition}:{}},y=[];return v.finding!==d.expected.finding&&y.push("finding-presence"),d.expected.domain&&v.domain!==d.expected.domain&&y.push("domain"),d.expected.status&&v.status!==d.expected.status&&y.push("status"),d.expected.diagnosisState&&v.diagnosisState!==d.expected.diagnosisState&&y.push("diagnosis-state"),d.expected.repairDisposition&&v.repairDisposition!==d.expected.repairDisposition&&y.push("repair-disposition"),k.capability.adapterId!==o.id&&y.push("adapter-binding"),{id:`${o.id}:${d.id}`,passed:y.length===0,expected:d.expected,actual:v,failures:y}})),s=t.filter(o=>o.expected.finding),r=t.filter(o=>!o.expected.finding),c$1=s.filter(o=>o.actual.finding).length,a=s.length-c$1,p=r.filter(o=>!o.actual.finding).length,m=r.length-p,C=new Set(t.map(o=>o.actual.domain).filter(o=>!!o));return {schemaVersion:c,corpusVersion:d,capabilityRegistryVersion:b,scope:"synthetic-contract-corpus",summary:{totalCases:t.length,passedCases:t.filter(o=>o.passed).length,failedCases:t.filter(o=>!o.passed).length,truePositives:c$1,trueNegatives:p,falsePositives:m,falseNegatives:a,precision:_(c$1/Math.max(1,c$1+m)),recall:_(c$1/Math.max(1,c$1+a)),domainCoverage:_(C.size/D.length),runtimeAdapterCoverage:_(new Set(t.map(o=>o.id.split(":",1)[0])).size/Math.max(1,i.length)),runtimeAdaptersExercised:i.length,declaredPlatforms:new Set(i.flatMap(o=>o.platforms)).size},cases:t,limitations:["Precision and recall describe the versioned synthetic contract corpus, not every public repository.","Every registered runtime adapter is exercised against the same disease corpus; this proves contract behavior, not tool availability on a host.","Runtime-native fixture and real Linux, macOS, and Windows acceptance gates remain separate evidence surfaces."]}}async function Qe(e={}){let i=K({runtime:e.runtime,framework:e.framework}),t=e.validate?ee():void 0,s$1,r;if(e.write){let a=e.workspace?pe.resolve(e.workspace):a$1(process.cwd());if(!a)return e.json?console.log(JSON.stringify({schemaVersion:i.schemaVersion,status:"error",error:{code:"doctor.capabilities.workspace-not-found",message:"--write requires a Workspai workspace or --workspace <path>."}},null,2)):console.log(h.red("Doctor capabilities could not be written: no workspace found.")),1;let p=K();s$1=await g(a,s.doctorCapabilities.artifactPath,p),t&&(r=await g(a,s.doctorValidation.artifactPath,t));}let c={...i,...t?{validation:t}:{},...s$1?{artifactPath:s$1}:{},...r?{validationArtifactPath:r}:{}};if(e.json)e.quiet||console.log(JSON.stringify(c,null,2));else if(!e.quiet){console.log(h.bold.cyan(`
2
+ \u{1FA7A} Workspai Doctor capabilities
3
+ `)),console.log(`${i.summary.adapterCount} adapter(s) \xB7 ${i.summary.frameworkCount} framework mapping(s) \xB7 ${i.summary.platformCount} platform(s)`);for(let a of i.adapters){let p=a.domains.map(m=>`${m.domain}:${m.level}`).join(" \xB7 ");console.log(h.bold(`
4
+ ${a.runtimeFamilies.join(", ")} \xB7 ${a.tier}`)),console.log(h.gray(p));for(let m of a.limitations)console.log(h.yellow(` ! ${m}`));}if(t){let a=t.summary,p=a.failedCases===0?h.green:h.red;console.log(p(`
5
+ Validation ${a.passedCases}/${a.totalCases} \xB7 precision ${a.precision} \xB7 recall ${a.recall}`));}s$1&&console.log(h.gray(`
6
+ Capabilities: ${s$1}`)),r&&console.log(h.gray(`Validation: ${r}`));}return t&&t.summary.failedCases>0?1:0}export{Z as a,Qe as b};
@@ -1 +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
+ import {b}from'./chunk-IGJA6GBQ.js';import {m,j,e}from'./chunk-UNXG3ZFV.js';import {a as a$1}from'./chunk-AFIFZTOY.js';import {a}from'./chunk-2LIVMG5C.js';import {s}from'./chunk-ODK4LCEL.js';import x from'crypto';import l from'path';import g from'fs-extra';var L=s.workspaceIntelligenceBenchmark.schemaVersion,O=s.workspaceIntelligenceBenchmark.artifactPath,S=s.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 +1 @@
1
- import {f}from'./chunk-ZGHJIQXL.js';var i=f.knowledgeGraph,s=["workspace","project","service","api","endpoint","schema","protocol","language","package","runtime-unit","lifecycle-stage","module","file","symbol","database","queue","container","deployment","pipeline","environment","document","decision","test-suite","owner"],p=["contains","defines","imports","depends-on","exposes","implements","implements-protocol","uses-language","equivalent-to","calls","reads-from","writes-to","publishes","consumes","deploys","runs-on","routes-to","documents","decided-by","tests","owns","generated-by","generated-from","configured-by","references"],a=["extracted","inferred","authored"],d=["authoritative","corroborated","observed","ambiguous"],c=["high","medium","low"],l=["fresh","stale","unknown"];export{i as a,s as b,p as c,a as d,d as e,c as f,l as g};
1
+ import {q}from'./chunk-ODK4LCEL.js';var i=q.knowledgeGraph,s=["workspace","project","service","api","endpoint","schema","protocol","language","package","runtime-unit","lifecycle-stage","module","file","symbol","database","queue","container","deployment","pipeline","environment","document","decision","test-suite","owner"],p=["contains","defines","imports","depends-on","exposes","implements","implements-protocol","uses-language","equivalent-to","calls","reads-from","writes-to","publishes","consumes","deploys","runs-on","routes-to","documents","decided-by","tests","owns","generated-by","generated-from","configured-by","references"],a=["extracted","inferred","authored"],d=["authoritative","corroborated","observed","ambiguous"],c=["high","medium","low"],l=["fresh","stale","unknown"];export{i as a,s as b,p as c,a as d,d as e,c as f,l as g};
@@ -0,0 +1 @@
1
+ import {a as a$1}from'./chunk-A5FBGRJA.js';import {g,p}from'./chunk-UW4SESKD.js';import {f as f$1,g as g$1}from'./chunk-OZXCNVGW.js';import {t,s}from'./chunk-ODK4LCEL.js';import {s as s$1,q}from'./chunk-RGNCL5OB.js';import {t as t$1}from'./chunk-VQZ5PI5J.js';import a from'path';import {existsSync}from'fs';import m from'fs-extra';var f=t.workspaceRegistry,w=s.workspaceRegistry.schemaVersion;function E(r){return {slug:r.slug,relativePath:r.relativePath,framework:r.framework,kit:r.kit,source:r.source}}async function b(r){let e=t$1(r,"workspace.json").find(t=>existsSync(t));if(!e)return {exists:false,legacyProjectCount:0};try{let t=await m.readJson(e),c=Array.isArray(t.projects)?t.projects.length:0,o=typeof t.workspace_name=="string"&&t.workspace_name.trim()||typeof t.name=="string"&&t.name.trim()||a.basename(r);return {exists:true,manifestPath:e,workspaceName:o,profile:typeof t.profile=="string"?t.profile:void 0,legacyProjectCount:c}}catch{return {exists:true,manifestPath:e,legacyProjectCount:0,workspaceName:a.basename(r)}}}async function _(r){let e=a$1(r);for(let t of s$1())if(await m.pathExists(t))try{let o=((await m.readJson(t)).workspaces||[]).find(s=>a$1(s.path)===e);if(o)return {exists:true,projectCount:Array.isArray(o.projects)?o.projects.length:0,registryPath:t}}catch{continue}return {exists:false,projectCount:0,registryPath:a.join(q(),"workspaces.json")}}async function T(r,e){let t=a.resolve(r),c=await f$1(t,g),o=await b(t),s=await _(t),i=e?.contract!==void 0||!!c,n=[];if(e?.contract)n=e.contract.projects||[];else if(i)try{let{contract:A}=await p({workspacePath:t});n=A.projects||[];}catch{n=[];}let d={contract:{exists:i,projectCount:n.length,path:g},globalRegistry:{exists:s.exists,projectCount:s.projectCount,path:s.registryPath},legacyWorkspaceJson:{exists:o.exists,projectCount:o.legacyProjectCount,path:o.manifestPath?a.relative(t,o.manifestPath):void 0}},p$1="none",u=[],y=0;return i?(p$1="workspace.contract.json",u=n.map(E),y=u.length):s.projectCount>0?(p$1="global-registry",y=s.projectCount):o.legacyProjectCount>0&&(p$1="legacy-workspace.json",y=o.legacyProjectCount),{contractExists:i,summary:{schemaVersion:w,kind:"rapidkit.workspace.registry",workspacePath:t,workspaceName:o.workspaceName||a.basename(t),profile:o.profile,projectCount:y,authority:p$1,contractPath:g,projects:u,sources:d}}}async function U(r){let e=await f$1(r,f);if(!e)return null;try{let t=await m.readJson(e);return t?.schemaVersion!==w?null:t}catch{return null}}async function D(r,e){let t=await M(r,e);return await g$1(r,f,t),t}async function M(r,e){return {...(await T(r,{contract:e?.contract})).summary,generatedAt:(e?.now??new Date).toISOString(),registrySummaryPath:f}}function F(r,e=""){return r.projectCount>0?r.authority==="workspace.contract.json"?`${r.projectCount} project(s) registered in workspace contract${e}.`:r.authority==="global-registry"?`${r.projectCount} project(s) registered in global workspace registry${e}.`:`${r.projectCount} project(s) registered in legacy workspace manifest${e}.`:`Workspace state exists, but no projects are registered yet${e}.`}export{f as a,w as b,T as c,U as d,D as e,M as f,F as g};
@@ -1 +1 @@
1
- import {f}from'./chunk-BMAFHX6A.js';import a from'path';import d from'fs-extra';var b=4,C="workspace-graph-token-efficiency.v1";function k(e){return Math.ceil(e/b)}function y(e,o){let n=a.resolve(e,o),t=a.relative(e,n);return !t||t.startsWith("..")||a.isAbsolute(t)?null:n}async function P(e){let o=new Map,n=[a.join(e,".workspai","workspace.contract.json"),a.join(e,".rapidkit","workspace.contract.json")];for(let t of n)if(await d.pathExists(t))try{let s=await d.readJson(t);for(let r of s.projects??[])typeof r.relativePath=="string"&&typeof r.externalPath=="string"&&a.isAbsolute(r.externalPath)&&o.set(r.relativePath.replace(/\\/g,"/").replace(/\/$/,""),r.externalPath);break}catch{}return o}function A(e,o,n){if(!o||a.isAbsolute(o))return null;let t=a.resolve(e),s=o.replace(/\\/g,"/");for(let[r,c]of [...n.entries()].sort(([u],[l])=>l.length-u.length))if(s.startsWith(`${r}/`))return y(c,s.slice(r.length+1));return y(t,s)}async function S(e){let o=a.resolve(e.workspacePath),n=f(e.graph,{query:e.query,...e.kind?{kind:e.kind}:{},...e.projectId?{projectId:e.projectId}:{},limit:e.limit,projection:"agent"}),t=e.corpus;if(!t){let l=[...new Set(e.graph.proofs.map(i=>i.artifact))].sort(),p=[],v=await P(o),h=0,g=0;for(let i of l){let f=A(o,i,v);if(!f){p.push(i);continue}try{let w=await d.readFile(f,"utf8");h+=w.length,g+=1;}catch{p.push(i);}}t={artifactCount:g,characterCount:h,estimatedTokens:k(h),unreadableArtifacts:p};}let s=JSON.stringify(n).length,r=t.estimatedTokens,c=k(s),u=Math.max(0,r-c);return {schemaVersion:C,generatedAt:(e.now??new Date).toISOString(),workspacePath:o,query:e.query,graph:{schemaVersion:e.graph.schemaVersion,sourceArtifact:e.graph.source.artifact,sourceHash:e.graph.source.hash,entityCount:e.graph.entities.length,relationCount:e.graph.relations.length,proofCount:e.graph.proofs.length},methodology:{id:"indexed-corpus-vs-bounded-retrieval.v1",estimated:true,charsPerToken:b,claimBoundary:"Measures retrieval payload reduction against readable proof-source text; it does not claim equivalent answer quality or model-specific billing savings."},corpus:t,retrieval:{matchCount:n.entities.length,characterCount:s,estimatedTokens:c,truncated:n.truncated,payload:n},savings:{estimatedTokensAvoided:u,reductionRatio:c===0?0:Number((r/c).toFixed(2)),reductionPercent:r===0?0:Number((u/r*100).toFixed(2))}}}export{C as a,S as b};
1
+ import {f}from'./chunk-EZPLMAW2.js';import a from'path';import d from'fs-extra';var b=4,C="workspace-graph-token-efficiency.v1";function k(e){return Math.ceil(e/b)}function y(e,o){let n=a.resolve(e,o),t=a.relative(e,n);return !t||t.startsWith("..")||a.isAbsolute(t)?null:n}async function P(e){let o=new Map,n=[a.join(e,".workspai","workspace.contract.json"),a.join(e,".rapidkit","workspace.contract.json")];for(let t of n)if(await d.pathExists(t))try{let s=await d.readJson(t);for(let r of s.projects??[])typeof r.relativePath=="string"&&typeof r.externalPath=="string"&&a.isAbsolute(r.externalPath)&&o.set(r.relativePath.replace(/\\/g,"/").replace(/\/$/,""),r.externalPath);break}catch{}return o}function A(e,o,n){if(!o||a.isAbsolute(o))return null;let t=a.resolve(e),s=o.replace(/\\/g,"/");for(let[r,c]of [...n.entries()].sort(([u],[l])=>l.length-u.length))if(s.startsWith(`${r}/`))return y(c,s.slice(r.length+1));return y(t,s)}async function S(e){let o=a.resolve(e.workspacePath),n=f(e.graph,{query:e.query,...e.kind?{kind:e.kind}:{},...e.projectId?{projectId:e.projectId}:{},limit:e.limit,projection:"agent"}),t=e.corpus;if(!t){let l=[...new Set(e.graph.proofs.map(i=>i.artifact))].sort(),p=[],v=await P(o),h=0,g=0;for(let i of l){let f=A(o,i,v);if(!f){p.push(i);continue}try{let w=await d.readFile(f,"utf8");h+=w.length,g+=1;}catch{p.push(i);}}t={artifactCount:g,characterCount:h,estimatedTokens:k(h),unreadableArtifacts:p};}let s=JSON.stringify(n).length,r=t.estimatedTokens,c=k(s),u=Math.max(0,r-c);return {schemaVersion:C,generatedAt:(e.now??new Date).toISOString(),workspacePath:o,query:e.query,graph:{schemaVersion:e.graph.schemaVersion,sourceArtifact:e.graph.source.artifact,sourceHash:e.graph.source.hash,entityCount:e.graph.entities.length,relationCount:e.graph.relations.length,proofCount:e.graph.proofs.length},methodology:{id:"indexed-corpus-vs-bounded-retrieval.v1",estimated:true,charsPerToken:b,claimBoundary:"Measures retrieval payload reduction against readable proof-source text; it does not claim equivalent answer quality or model-specific billing savings."},corpus:t,retrieval:{matchCount:n.entities.length,characterCount:s,estimatedTokens:c,truncated:n.truncated,payload:n},savings:{estimatedTokensAvoided:u,reductionRatio:c===0?0:Number((r/c).toFixed(2)),reductionPercent:r===0?0:Number((u/r*100).toFixed(2))}}}export{C as a,S as b};
@@ -1 +1 @@
1
- import {f}from'./chunk-ZGHJIQXL.js';var i=f.explain,u=["project","release-blocked","blocker","trace"];function s(t){let e=t.trim();if(!e)return null;if(e==="release-blocked")return {kind:"release-blocked"};if(e.startsWith("project:")){let r=e.slice(8).trim();return r?{kind:"project",project:r}:null}if(e.startsWith("blocker:")){let r=e.slice(8).trim();return r?{kind:"blocker",blockerId:r}:null}if(e.startsWith("trace:")){let r=e.slice(6).trim();return r?{kind:"trace",diffRef:r}:null}return {kind:"project",project:e}}function E(t){let e=t.trim();if(!e)return null;if(e.startsWith("trace:")){let n=s(e);return n?.kind==="trace"?n:null}let r=e.replace(/\\/g,"/").trim().toLowerCase();return r.endsWith(".json")||r.includes("workspace-model-diff")||r.startsWith(".rapidkit/")||r.includes("/.rapidkit/")?{kind:"trace",diffRef:e}:null}function A(t){if(!t||typeof t!="object"||Array.isArray(t))return false;let e=t;return e.schemaVersion===i&&typeof e.generatedAt=="string"&&typeof e.summary=="string"&&Array.isArray(e.sections)&&e.target!=null&&typeof e.target=="object"&&!Array.isArray(e.target)&&typeof e.target.kind=="string"}export{i as a,u as b,s as c,E as d,A as e};
1
+ import {q}from'./chunk-ODK4LCEL.js';var i=q.explain,u=["project","release-blocked","blocker","trace"];function s(t){let e=t.trim();if(!e)return null;if(e==="release-blocked")return {kind:"release-blocked"};if(e.startsWith("project:")){let r=e.slice(8).trim();return r?{kind:"project",project:r}:null}if(e.startsWith("blocker:")){let r=e.slice(8).trim();return r?{kind:"blocker",blockerId:r}:null}if(e.startsWith("trace:")){let r=e.slice(6).trim();return r?{kind:"trace",diffRef:r}:null}return {kind:"project",project:e}}function E(t){let e=t.trim();if(!e)return null;if(e.startsWith("trace:")){let n=s(e);return n?.kind==="trace"?n:null}let r=e.replace(/\\/g,"/").trim().toLowerCase();return r.endsWith(".json")||r.includes("workspace-model-diff")||r.startsWith(".rapidkit/")||r.includes("/.rapidkit/")?{kind:"trace",diffRef:e}:null}function A(t){if(!t||typeof t!="object"||Array.isArray(t))return false;let e=t;return e.schemaVersion===i&&typeof e.generatedAt=="string"&&typeof e.summary=="string"&&Array.isArray(e.sections)&&e.target!=null&&typeof e.target=="object"&&!Array.isArray(e.target)&&typeof e.target.kind=="string"}export{i as a,u as b,s as c,E as d,A as e};
@@ -0,0 +1,2 @@
1
+ import {a}from'./chunk-AFIFZTOY.js';import {p,r,q,s,A,u}from'./chunk-ODK4LCEL.js';import A$1 from'path';function f(t){let r=Object.values(A).filter(a=>a.produces.includes(t)).map(a=>[...a.command]),n=u[t]??[];return [...r,...n.map(a=>[...a])]}var E=Object.keys(p).flatMap(t=>{let r$1=t,n=q[r$1],a=r[r$1];if(!n||!a)return [];let c=p[r$1];return [{artifactPath:c,schemaVersion:n,contractPath:a,producerCommands:f(c)}]}),g=Object.values(s).map(t=>({...t,producerCommands:t.producerCommands.map(r=>[...r])})),d=Object.freeze(Object.fromEntries([...E,...g].map(t=>[t.artifactPath,t])));function m(t){return t.split(A$1.sep).join("/").replace(/^\.\//,"")}var e=s,T=[{pattern:/^\.workspai\/decisions\/change-[^/]+\/transaction\.json$/,canonicalPath:e.decisionTransaction.artifactPath},{pattern:/^\.workspai\/decisions\/change-[^/]+\/checkpoint\.json$/,canonicalPath:e.decisionCheckpoint.artifactPath},{pattern:/^\.workspai\/changes\/change-[^/]+\/lease\.json$/,canonicalPath:e.architectureChangeLease.artifactPath},{pattern:/^\.workspai\/changes\/change-[^/]+\/predicted-overlay\.json$/,canonicalPath:e.predictedArchitectureChange.artifactPath},{pattern:/^\.workspai\/changes\/change-[^/]+\/actual-overlay\.json$/,canonicalPath:e.actualArchitectureChange.artifactPath},{pattern:/^\.workspai\/changes\/change-[^/]+\/architecture-surprises\.json$/,canonicalPath:e.architectureSurpriseReport.artifactPath},{pattern:/^\.workspai\/changes\/change-[^/]+\/capsule\.json$/,canonicalPath:e.proofCarryingChangeCapsule.artifactPath},{pattern:/^\.workspai\/reports\/bootstrap-compliance-[^/]+\.json$/,canonicalPath:e.bootstrapCompliance.artifactPath},{pattern:/^\.workspai\/reports\/mirror-ops-[^/]+\.json$/,canonicalPath:e.mirrorOps.artifactPath},{pattern:/^\.workspai\/reports\/transparency-evidence-[^/]+\.json$/,canonicalPath:e.transparencyEvidence.artifactPath},{pattern:/^\.workspai\/reports\/projects\/[^/]+\/doctor-project-last-run\.json$/,canonicalPath:e.doctorProject.artifactPath},{pattern:/^\.workspai\/reports\/projects\/[^/]+\/project-test-coverage-last-run\.json$/,canonicalPath:e.projectTestCoverage.artifactPath}];function k(t){let r=m(t),n=d[r];if(n)return n;let a=T.find(c=>c.pattern.test(r));return a?d[a.canonicalPath]??null:null}function O(t,r,n=t){let a$1=m(t),c=k(t);if(!c){if(a$1.startsWith(".workspai/reports/")&&a$1.endsWith(".json"))throw new Error(`${n} is a public workspace report without a registered artifact contract`);return}let u=c.schemaVersionField??"schemaVersion",i=r&&typeof r=="object"?r[u]:void 0;if(i!==c.schemaVersion)throw new Error(`${n} schemaVersion is ${String(i)}, expected ${c.schemaVersion}`);a(r,c.contractPath,n);}
2
+ export{k as a,O as b};
@@ -1,4 +1,4 @@
1
- import {l,f,e as e$2,g as g$1}from'./chunk-IXXQMD34.js';import {b as b$4}from'./chunk-5OV2WXAR.js';import {b as b$7,a as a$3}from'./chunk-D5LLTUTY.js';import {b as b$2}from'./chunk-B6FJ6RG6.js';import {a as a$2}from'./chunk-Q7UGDNSM.js';import {e,g,h as h$1,c as c$1,i as i$1,f as f$1,b as b$6,d as d$4}from'./chunk-46QH3ZVI.js';import {g as g$2}from'./chunk-TCLKGPXF.js';import {d as d$1,b as b$1}from'./chunk-2LIVMG5C.js';import {h,e as e$1,b as b$3,d as d$2}from'./chunk-PKKSRXUS.js';import {a}from'./chunk-TQEMLBAG.js';import {i,b as b$5,k as k$1,j,m,t,s as s$1,q}from'./chunk-RGNCL5OB.js';import {b,a as a$1,c,d as d$3}from'./chunk-VQZ5PI5J.js';import {promises}from'fs';import*as k from'fs-extra';import d from'path';import s from'chalk';import {execa}from'execa';function ct(e){let n=e.projectCount??0,t=n===1?"project":"projects",o=e.pythonEngine==="installed"?`Python ${e.pythonVersion||"3.10+"} \xB7 ${e.installMethod||"local environment"}`:e.pythonEngine==="skipped"?"Python engine not installed":"Runtime-neutral foundation";return ["","\u2713 Workspace ready",`${e.workspaceName} \xB7 ${e.profile} \xB7 ${n} registered ${t}`,`Location ${e.workspacePath}`,`Runtime ${o}`,...e.note?[`Note ${e.note}`]:[],"","Workspace Intelligence"," \u2713 Contract and project registry"," \u2713 Canonical model and proof-backed graph"," \u2713 Agent context, grounding, and evidence index","","Next",` ${g$1(e.workspacePath)}`," npx workspai create"," npx workspai workspace intelligence run --for-agent generic --strict --json","","Evidence .workspai/reports/INDEX.json","Guide README.md",""]}function B(e){let n=ct(e);for(let t of n)t==="\u2713 Workspace ready"?console.log(s.green.bold(t)):t==="Workspace Intelligence"||t==="Next"?console.log(s.cyan.bold(t)):t.startsWith(" \u2713")?console.log(s.green(t)):t.startsWith("Location")||t.startsWith("Runtime")?console.log(s.gray(t)):console.log(t);}function T(){return i()}var pt="transactions";function dt(){return d.join(q(),pt)}async function He(){let e=dt();return await b$7(e),a$3({journalDirectory:e})}async function Ue(e){for(let n of s$1())await e.captureFile(n);}async function se(e){let n=await He();try{return await Ue(n),await n.captureOwnedTree(e),n}catch(t){return F(n,t)}}async function ut(e){let n=await He();try{await Ue(n),await n.captureOwnedTree(d.join(e,a$1)),await n.captureOwnedTree(d.join(e,".venv"));let t=[c,".gitignore",d.join(a$1,"workspace.json"),d.join(a$1,"toolchain.lock"),d.join(a$1,"policies.yml"),d.join(a$1,"cache-config.yml"),g$2,a$2,"pyproject.toml","poetry.toml","poetry.lock","rapidkit","rapidkit.cmd","README.md",".rapidkit-global"];for(let o of t)await n.captureFile(d.join(e,o));return n}catch(t){return F(n,t)}}async function J(e){await e.commit(),e.journalPath&&await promises.rm(d.dirname(e.journalPath),{recursive:true,force:true}).catch(n=>e$1.debug(`Could not remove committed lifecycle journal: ${n}`));}async function F(e,n){try{await e.rollback();}catch(t){throw new AggregateError([n,t],"Workspace lifecycle failed and rollback was incomplete.")}throw n}async function Q(e,n,t,o,a){let l=d$1(n,h(),t,a?.pythonEngine?{coreStatus:a.pythonEngine,...a.pythonEngineReason?{coreReason:a.pythonEngineReason}:{},...o?{pythonVersion:o}:{}}:void 0);o&&!a?.pythonEngine&&(l.metadata||(l.metadata={}),l.metadata.python={pythonVersion:o}),await b$1(e,l);}async function H(e){await k.outputFile(d.join(e,".gitignore"),`.venv/
1
+ import {l,f,e as e$2,g as g$1}from'./chunk-WZ5V5U2K.js';import {b as b$4}from'./chunk-EG6EZ7HW.js';import {b as b$7,a as a$3}from'./chunk-D5LLTUTY.js';import {b as b$2}from'./chunk-B6FJ6RG6.js';import {a as a$2}from'./chunk-I3UCODXU.js';import {e,g,h as h$1,c as c$1,i as i$1,f as f$1,b as b$6,d as d$4}from'./chunk-46QH3ZVI.js';import {g as g$2}from'./chunk-UW4SESKD.js';import {d as d$1,b as b$1}from'./chunk-2LIVMG5C.js';import {h,e as e$1,b as b$3,d as d$2}from'./chunk-PKKSRXUS.js';import {a}from'./chunk-TQEMLBAG.js';import {i,b as b$5,k as k$1,j,m,t,s as s$1,q}from'./chunk-RGNCL5OB.js';import {b,a as a$1,c,d as d$3}from'./chunk-VQZ5PI5J.js';import {promises}from'fs';import*as k from'fs-extra';import d from'path';import s from'chalk';import {execa}from'execa';function ct(e){let n=e.projectCount??0,t=n===1?"project":"projects",o=e.pythonEngine==="installed"?`Python ${e.pythonVersion||"3.10+"} \xB7 ${e.installMethod||"local environment"}`:e.pythonEngine==="skipped"?"Python engine not installed":"Runtime-neutral foundation";return ["","\u2713 Workspace ready",`${e.workspaceName} \xB7 ${e.profile} \xB7 ${n} registered ${t}`,`Location ${e.workspacePath}`,`Runtime ${o}`,...e.note?[`Note ${e.note}`]:[],"","Workspace Intelligence"," \u2713 Contract and project registry"," \u2713 Canonical model and proof-backed graph"," \u2713 Agent context, grounding, and evidence index","","Next",` ${g$1(e.workspacePath)}`," npx workspai create"," npx workspai workspace intelligence run --for-agent generic --strict --json","","Evidence .workspai/reports/INDEX.json","Guide README.md",""]}function B(e){let n=ct(e);for(let t of n)t==="\u2713 Workspace ready"?console.log(s.green.bold(t)):t==="Workspace Intelligence"||t==="Next"?console.log(s.cyan.bold(t)):t.startsWith(" \u2713")?console.log(s.green(t)):t.startsWith("Location")||t.startsWith("Runtime")?console.log(s.gray(t)):console.log(t);}function T(){return i()}var pt="transactions";function dt(){return d.join(q(),pt)}async function He(){let e=dt();return await b$7(e),a$3({journalDirectory:e})}async function Ue(e){for(let n of s$1())await e.captureFile(n);}async function se(e){let n=await He();try{return await Ue(n),await n.captureOwnedTree(e),n}catch(t){return F(n,t)}}async function ut(e){let n=await He();try{await Ue(n),await n.captureOwnedTree(d.join(e,a$1)),await n.captureOwnedTree(d.join(e,".venv"));let t=[c,".gitignore",d.join(a$1,"workspace.json"),d.join(a$1,"toolchain.lock"),d.join(a$1,"policies.yml"),d.join(a$1,"cache-config.yml"),g$2,a$2,"pyproject.toml","poetry.toml","poetry.lock","rapidkit","rapidkit.cmd","README.md",".rapidkit-global"];for(let o of t)await n.captureFile(d.join(e,o));return n}catch(t){return F(n,t)}}async function J(e){await e.commit(),e.journalPath&&await promises.rm(d.dirname(e.journalPath),{recursive:true,force:true}).catch(n=>e$1.debug(`Could not remove committed lifecycle journal: ${n}`));}async function F(e,n){try{await e.rollback();}catch(t){throw new AggregateError([n,t],"Workspace lifecycle failed and rollback was incomplete.")}throw n}async function Q(e,n,t,o,a){let l=d$1(n,h(),t,a?.pythonEngine?{coreStatus:a.pythonEngine,...a.pythonEngineReason?{coreReason:a.pythonEngineReason}:{},...o?{pythonVersion:o}:{}}:void 0);o&&!a?.pythonEngine&&(l.metadata||(l.metadata={}),l.metadata.python={pythonVersion:o}),await b$1(e,l);}async function H(e){await k.outputFile(d.join(e,".gitignore"),`.venv/
2
2
  __pycache__/
3
3
  *.pyc
4
4
  .env
@@ -1,8 +1,8 @@
1
- import {c}from'./chunk-BUYLM6QV.js';import {a}from'./chunk-A5FBGRJA.js';import {a as a$2}from'./chunk-NMXGSVMD.js';import {b}from'./chunk-IKUFNK46.js';import {i,h as h$1}from'./chunk-ZGHJIQXL.js';import {h}from'./chunk-PKKSRXUS.js';import {a as a$1}from'./chunk-TQEMLBAG.js';import {q,r,s}from'./chunk-RGNCL5OB.js';import {u,t}from'./chunk-VQZ5PI5J.js';import {promises}from'fs';import {randomUUID}from'crypto';import n from'path';import p from'chalk';import le from'fs-extra';import N from'ora';import {execa}from'execa';var de=3e4,me=45e3;async function ge(e){try{let r=await execa("git",["rev-parse","--show-toplevel"],{cwd:e,env:a$1()});return r.stdout.trim()?n.resolve(e,r.stdout.trim()):null}catch{return null}}async function re(e,r,t){if(await ge(e)){r.warn("Git initialization skipped because target is already inside a git worktree");return}r.start("Initializing git repository...");try{await execa("git",["init"],{cwd:e,env:a$1()}),await execa("git",["add","."],{cwd:e,env:a$1()}),await execa("git",["-c","user.name=Workspai","-c","user.email=workspai@localhost","commit","-m",t],{cwd:e,env:a$1()}),r.succeed("Git repository initialized");}catch{r.warn("Could not initialize git repository");}}function G(e){let r=a(e.path),t=Array.isArray(e.projects)?e.projects:[],o=[],a$1=new Set;for(let s of t){if(!s||typeof s.name!="string"||typeof s.path!="string")continue;let i=a(s.path);a$1.has(i)||(a$1.add(i),o.push({name:s.name,path:i}));}return {name:e.name,path:r,mode:e.mode,projects:o}}function I(e){let r=[],t=new Set;for(let o of e.workspaces||[]){if(!o||typeof o.name!="string"||typeof o.path!="string")continue;let a=G(o);t.has(a.path)||(t.add(a.path),r.push(a));}return {workspaces:r}}async function ue(e){let r;try{r=await promises.readFile(e,"utf8");}catch(t){if(t.code==="ENOENT")return {workspaces:[]};throw t}try{let t=JSON.parse(r);if(!t||!Array.isArray(t.workspaces))throw new Error("missing workspaces array");return I(t)}catch(t){throw new Error(`Workspace registry is invalid: ${e}`,{cause:t})}}async function ke(e){let r;try{r=await promises.readFile(e,"utf8");}catch(o){if(o.code==="ENOENT")return {workspaces:[]};throw o}let t;try{t=JSON.parse(r);}catch(o){throw new Error(`Workspace registry is invalid: ${e}`,{cause:o})}if(!t||typeof t!="object"||!Array.isArray(t.workspaces))throw new Error(`Workspace registry is invalid: ${e}`);for(let o of t.workspaces)if(!o||typeof o.name!="string"||typeof o.path!="string"||o.mode!==void 0&&typeof o.mode!="string"||o.projects!==void 0&&!Array.isArray(o.projects)||Array.isArray(o.projects)&&o.projects.some(a=>!a||typeof a.name!="string"||typeof a.path!="string"))throw new Error(`Workspace registry contains an invalid entry: ${e}`);return I(t)}async function z(){let e={workspaces:[]},r=new Set;for(let t of s()){let o=await ue(t);for(let a of o.workspaces)r.has(a.path)||(r.add(a.path),e.workspaces.push(a));}return e}async function oe(e=s()){let r={workspaces:[]},t=new Set;for(let o of e){let a=await ke(o);for(let s of a.workspaces)t.has(s.path)||(t.add(s.path),r.workspaces.push(s));}return r}function fe(e){let r=e?.code;return process.platform==="win32"&&(r==="EPERM"||r==="EINVAL"||r==="ENOSYS")}async function ae(e){try{await e.sync();}catch(r){if(!fe(r))throw r}}async function X(e,r){let t=n.dirname(e);await promises.mkdir(t,{recursive:true});let o=`${n.basename(e)}.`,a=Date.now();for(let i of await promises.readdir(t)){if(!i.startsWith(o)||!i.endsWith(".tmp"))continue;let c=n.join(t,i),d=await promises.stat(c).catch(()=>null);d&&a-d.mtimeMs>3e4&&await promises.rm(c,{force:true}).catch(()=>{});}let s=await promises.readFile(e,"utf8").catch(()=>null);if(s!==null){let i=false;try{let c=JSON.parse(s);i=Array.isArray(c.workspaces);}catch{i=false;}if(!i){let c=`${e}.corrupt-${Date.now()}`;await promises.copyFile(e,c);}}await se(e,`${JSON.stringify(I(r),null,2)}
1
+ import {c}from'./chunk-N4B2M44I.js';import {a}from'./chunk-A5FBGRJA.js';import {a as a$2}from'./chunk-NMXGSVMD.js';import {b}from'./chunk-K33JJVQZ.js';import {t as t$1,s}from'./chunk-ODK4LCEL.js';import {h}from'./chunk-PKKSRXUS.js';import {a as a$1}from'./chunk-TQEMLBAG.js';import {q,r,s as s$1}from'./chunk-RGNCL5OB.js';import {u,t}from'./chunk-VQZ5PI5J.js';import {promises}from'fs';import {randomUUID}from'crypto';import n from'path';import p from'chalk';import le from'fs-extra';import N from'ora';import {execa}from'execa';var de=3e4,me=45e3;async function ge(e){try{let r=await execa("git",["rev-parse","--show-toplevel"],{cwd:e,env:a$1()});return r.stdout.trim()?n.resolve(e,r.stdout.trim()):null}catch{return null}}async function re(e,r,t){if(await ge(e)){r.warn("Git initialization skipped because target is already inside a git worktree");return}r.start("Initializing git repository...");try{await execa("git",["init"],{cwd:e,env:a$1()}),await execa("git",["add","."],{cwd:e,env:a$1()}),await execa("git",["-c","user.name=Workspai","-c","user.email=workspai@localhost","commit","-m",t],{cwd:e,env:a$1()}),r.succeed("Git repository initialized");}catch{r.warn("Could not initialize git repository");}}function G(e){let r=a(e.path),t=Array.isArray(e.projects)?e.projects:[],o=[],a$1=new Set;for(let s of t){if(!s||typeof s.name!="string"||typeof s.path!="string")continue;let i=a(s.path);a$1.has(i)||(a$1.add(i),o.push({name:s.name,path:i}));}return {name:e.name,path:r,mode:e.mode,projects:o}}function I(e){let r=[],t=new Set;for(let o of e.workspaces||[]){if(!o||typeof o.name!="string"||typeof o.path!="string")continue;let a=G(o);t.has(a.path)||(t.add(a.path),r.push(a));}return {workspaces:r}}async function ue(e){let r;try{r=await promises.readFile(e,"utf8");}catch(t){if(t.code==="ENOENT")return {workspaces:[]};throw t}try{let t=JSON.parse(r);if(!t||!Array.isArray(t.workspaces))throw new Error("missing workspaces array");return I(t)}catch(t){throw new Error(`Workspace registry is invalid: ${e}`,{cause:t})}}async function ke(e){let r;try{r=await promises.readFile(e,"utf8");}catch(o){if(o.code==="ENOENT")return {workspaces:[]};throw o}let t;try{t=JSON.parse(r);}catch(o){throw new Error(`Workspace registry is invalid: ${e}`,{cause:o})}if(!t||typeof t!="object"||!Array.isArray(t.workspaces))throw new Error(`Workspace registry is invalid: ${e}`);for(let o of t.workspaces)if(!o||typeof o.name!="string"||typeof o.path!="string"||o.mode!==void 0&&typeof o.mode!="string"||o.projects!==void 0&&!Array.isArray(o.projects)||Array.isArray(o.projects)&&o.projects.some(a=>!a||typeof a.name!="string"||typeof a.path!="string"))throw new Error(`Workspace registry contains an invalid entry: ${e}`);return I(t)}async function z(){let e={workspaces:[]},r=new Set;for(let t of s$1()){let o=await ue(t);for(let a of o.workspaces)r.has(a.path)||(r.add(a.path),e.workspaces.push(a));}return e}async function oe(e=s$1()){let r={workspaces:[]},t=new Set;for(let o of e){let a=await ke(o);for(let s of a.workspaces)t.has(s.path)||(t.add(s.path),r.workspaces.push(s));}return r}function fe(e){let r=e?.code;return process.platform==="win32"&&(r==="EPERM"||r==="EINVAL"||r==="ENOSYS")}async function ae(e){try{await e.sync();}catch(r){if(!fe(r))throw r}}async function X(e,r){let t=n.dirname(e);await promises.mkdir(t,{recursive:true});let o=`${n.basename(e)}.`,a=Date.now();for(let i of await promises.readdir(t)){if(!i.startsWith(o)||!i.endsWith(".tmp"))continue;let c=n.join(t,i),d=await promises.stat(c).catch(()=>null);d&&a-d.mtimeMs>3e4&&await promises.rm(c,{force:true}).catch(()=>{});}let s=await promises.readFile(e,"utf8").catch(()=>null);if(s!==null){let i=false;try{let c=JSON.parse(s);i=Array.isArray(c.workspaces);}catch{i=false;}if(!i){let c=`${e}.corrupt-${Date.now()}`;await promises.copyFile(e,c);}}await se(e,`${JSON.stringify(I(r),null,2)}
2
2
  `);}async function se(e,r){let t=n.dirname(e);await promises.mkdir(t,{recursive:true});let o=`${e}.${process.pid}.${randomUUID()}.tmp`;try{await promises.writeFile(o,r);let a=await promises.open(o,"r");try{await ae(a);}finally{await a.close();}try{await promises.rename(o,e);}catch(s){let i=s.code;if(i!=="EEXIST"&&i!=="EPERM")throw s;await le.move(o,e,{overwrite:true});}}finally{await promises.rm(o,{force:true}).catch(()=>{});}}async function Z(e){try{return {exists:true,content:await promises.readFile(e)}}catch(r){if(r.code==="ENOENT")return {exists:false};throw r}}async function ee(e,r){if(!r.exists){await promises.rm(e,{force:true});return}await se(e,r.content);}async function we(e,r){let t=n.join(e,"workspaces.json.lock"),o=randomUUID();await promises.mkdir(e,{recursive:true});let a=Date.now(),s;for(;!s;)try{s=await promises.open(t,"wx"),await s.writeFile(`${JSON.stringify({pid:process.pid,lockId:o,createdAt:new Date().toISOString()})}
3
- `),await ae(s);}catch(i){if(i.code!=="EEXIST")throw i;let c=await promises.stat(t).catch(()=>null);if(c&&Date.now()-c.mtimeMs>de){let d=await promises.readFile(t,"utf8").then(g=>JSON.parse(g)).catch(()=>null),u=Number(d?.pid),f=false;if(Number.isInteger(u)&&u>0)try{process.kill(u,0),f=true;}catch(g){f=g.code==="EPERM";}if(!f){await promises.rm(t,{force:true}).catch(()=>{});continue}}if(Date.now()-a>me)throw new Error(`Timed out waiting for workspace registry lock: ${t}`);await new Promise(d=>setTimeout(d,25));}try{return await r()}finally{await s.close().catch(()=>{}),await promises.readFile(t,"utf8").then(c=>JSON.parse(c).lockId===o).catch(()=>false)&&await promises.rm(t,{force:true}).catch(()=>{});}}async function S(e){let r$1=q(),t=n.join(r$1,"workspaces.json"),o=n.join(r(),"workspaces.json"),a=[...new Set(s())];return we(r$1,async()=>{let[s,i]=await Promise.all([Z(t),Z(o)]),c=await oe(a);await e(c);let d=I(c);try{await X(t,d),await X(o,d);}catch(u){let g=(await Promise.allSettled([ee(t,s),ee(o,i)])).filter(k=>k.status==="rejected").map(k=>k.reason);throw g.length>0?new AggregateError([u,...g],"Workspace registry transaction failed and could not be fully restored"):u}return d})}async function ie(e,r){let t=a(e);await S(o=>{let a=o.workspaces.find(s=>s.path===t);if(a){a.name=r,a.mode=a.mode||"full",a.projects=Array.isArray(a.projects)?a.projects:[];return}o.workspaces.push({name:r,path:t,mode:"full",projects:[]});});}async function He(e){let r=a(e),o=(await oe()).workspaces.find(a=>a.path===r);return o?{...o,projects:o.projects.map(a=>({...a}))}:null}async function Ke(e,r){let t=a(e);await S(o=>{let a=o.workspaces.findIndex(i=>i.path===t);if(!r){a>=0&&o.workspaces.splice(a,1);return}let s=G(r);a>=0?o.workspaces[a]=s:o.workspaces.push(s);});}async function qe(e){let r=a(e);await S(t=>{t.workspaces=t.workspaces.filter(o=>o.path!==r);});}async function he(e,r){try{await ie(e,r);}catch{console.warn(p.gray("Note: Could not register workspace in shared registry"));}}async function Qe(e,r=false){let t=a(e),o={workspacePath:t,workspaceFound:false,added:[],skipped:0};try{let a$1=await z(),s=a$1.workspaces.find(k=>k.path===t);if(!s){if(await he(t,n.basename(n.resolve(e))),a$1=await z(),s=a$1.workspaces.find(k=>k.path===t),!s)return r||console.log("\u26A0\uFE0F Workspace could not be registered in registry"),o;r||console.log("\u2714 Registered workspace in shared registry");}Array.isArray(s.projects)||(s.projects=[]);let i=0,c=0,d=[],u$1=[],f=[e],g=new Set;for(;f.length>0;){let k=f.shift();if(!k||g.has(k))continue;g.add(k);let w=await promises.readdir(k,{withFileTypes:true});for(let h of w){if(!h.isDirectory()||h.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(h.name))continue;let v=n.join(k,h.name),y=a(v);try{let x=false;for(let P of [...u(y,"context.json"),...u(y,"project.json")])try{await promises.access(P),x=true;break}catch{}if(x){let P=n.basename(y),m=s.projects.some($=>$.path===y);u$1.push({name:P,path:y}),m?c++:(s.projects.push({name:P,path:y}),i++,d.push(y),r||console.log(`\u2714 Added: ${n.relative(e,y)}`));continue}}catch{}f.push(v);}}return await S(k=>{let w=k.workspaces.find(y=>y.path===t);if(!w)return;let h=`${t}${n.sep}`,v=(w.projects||[]).filter(y=>y.path!==t&&!y.path.startsWith(h));w.projects=G({...w,projects:[...v,...u$1]}).projects;}),i>0?r||console.log(`
3
+ `),await ae(s);}catch(i){if(i.code!=="EEXIST")throw i;let c=await promises.stat(t).catch(()=>null);if(c&&Date.now()-c.mtimeMs>de){let d=await promises.readFile(t,"utf8").then(g=>JSON.parse(g)).catch(()=>null),u=Number(d?.pid),f=false;if(Number.isInteger(u)&&u>0)try{process.kill(u,0),f=true;}catch(g){f=g.code==="EPERM";}if(!f){await promises.rm(t,{force:true}).catch(()=>{});continue}}if(Date.now()-a>me)throw new Error(`Timed out waiting for workspace registry lock: ${t}`);await new Promise(d=>setTimeout(d,25));}try{return await r()}finally{await s.close().catch(()=>{}),await promises.readFile(t,"utf8").then(c=>JSON.parse(c).lockId===o).catch(()=>false)&&await promises.rm(t,{force:true}).catch(()=>{});}}async function S(e){let r$1=q(),t=n.join(r$1,"workspaces.json"),o=n.join(r(),"workspaces.json"),a=[...new Set(s$1())];return we(r$1,async()=>{let[s,i]=await Promise.all([Z(t),Z(o)]),c=await oe(a);await e(c);let d=I(c);try{await X(t,d),await X(o,d);}catch(u){let g=(await Promise.allSettled([ee(t,s),ee(o,i)])).filter(k=>k.status==="rejected").map(k=>k.reason);throw g.length>0?new AggregateError([u,...g],"Workspace registry transaction failed and could not be fully restored"):u}return d})}async function ie(e,r){let t=a(e);await S(o=>{let a=o.workspaces.find(s=>s.path===t);if(a){a.name=r,a.mode=a.mode||"full",a.projects=Array.isArray(a.projects)?a.projects:[];return}o.workspaces.push({name:r,path:t,mode:"full",projects:[]});});}async function He(e){let r=a(e),o=(await oe()).workspaces.find(a=>a.path===r);return o?{...o,projects:o.projects.map(a=>({...a}))}:null}async function Ke(e,r){let t=a(e);await S(o=>{let a=o.workspaces.findIndex(i=>i.path===t);if(!r){a>=0&&o.workspaces.splice(a,1);return}let s=G(r);a>=0?o.workspaces[a]=s:o.workspaces.push(s);});}async function qe(e){let r=a(e);await S(t=>{t.workspaces=t.workspaces.filter(o=>o.path!==r);});}async function he(e,r){try{await ie(e,r);}catch{console.warn(p.gray("Note: Could not register workspace in shared registry"));}}async function Qe(e,r=false){let t=a(e),o={workspacePath:t,workspaceFound:false,added:[],skipped:0};try{let a$1=await z(),s=a$1.workspaces.find(k=>k.path===t);if(!s){if(await he(t,n.basename(n.resolve(e))),a$1=await z(),s=a$1.workspaces.find(k=>k.path===t),!s)return r||console.log("\u26A0\uFE0F Workspace could not be registered in registry"),o;r||console.log("\u2714 Registered workspace in shared registry");}Array.isArray(s.projects)||(s.projects=[]);let i=0,c=0,d=[],u$1=[],f=[e],g=new Set;for(;f.length>0;){let k=f.shift();if(!k||g.has(k))continue;g.add(k);let w=await promises.readdir(k,{withFileTypes:true});for(let h of w){if(!h.isDirectory()||h.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(h.name))continue;let v=n.join(k,h.name),y=a(v);try{let x=false;for(let P of [...u(y,"context.json"),...u(y,"project.json")])try{await promises.access(P),x=true;break}catch{}if(x){let P=n.basename(y),m=s.projects.some($=>$.path===y);u$1.push({name:P,path:y}),m?c++:(s.projects.push({name:P,path:y}),i++,d.push(y),r||console.log(`\u2714 Added: ${n.relative(e,y)}`));continue}}catch{}f.push(v);}}return await S(k=>{let w=k.workspaces.find(y=>y.path===t);if(!w)return;let h=`${t}${n.sep}`,v=(w.projects||[]).filter(y=>y.path!==t&&!y.path.startsWith(h));w.projects=G({...w,projects:[...v,...u$1]}).projects;}),i>0?r||console.log(`
4
4
  \u2705 Synced ${i} project(s) to registry`):r||console.log(`
5
- \u2705 All projects already registered (${c} found)`),{workspacePath:t,workspaceFound:true,added:d,skipped:c}}catch(a){return r||console.error("\u274C Failed to sync projects:",a.message),o}}async function ye(e,r,t){let o=a(e),a$1=a(t);await S(s=>{let i=s.workspaces.find(u=>u.path===o);if(!i)throw new Error(`Workspace is not registered: ${o}`);i.projects=Array.isArray(i.projects)?i.projects:[];let c=i.projects.findIndex(u=>u.path===a$1||u.name===r),d={name:r,path:a$1};c>=0?i.projects[c]=d:i.projects.push(d);});}async function Xe(e,r,t){try{await ye(e,r,t);}catch{}}async function Ze(e,r){let t=N("Creating Workspai workspace...").start();try{await promises.mkdir(e,{recursive:true}),await promises.mkdir(n.join(e,".workspai"),{recursive:true});let o={workspace_name:r.name,author:r.author,rapidkit_version:h(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(n.join(e,".workspai","config.json"),JSON.stringify(o,null,2));let{syncWorkspaceFoundationFiles:a}=await import('./create-U5PQHOZ4.js');await a(e,{workspaceName:r.name,installMethod:"venv",writeMarker:true,writeGitignore:false,onlyIfMissing:true});let s=$e();await promises.writeFile(n.join(e,"rapidkit"),s),await promises.chmod(n.join(e,"rapidkit"),493);let i=je();await promises.writeFile(n.join(e,"rapidkit.cmd"),i);let c=ve(r.name);await promises.writeFile(n.join(e,"README.md"),c),await promises.writeFile(n.join(e,".gitignore"),`# Workspai workspace
5
+ \u2705 All projects already registered (${c} found)`),{workspacePath:t,workspaceFound:true,added:d,skipped:c}}catch(a){return r||console.error("\u274C Failed to sync projects:",a.message),o}}async function ye(e,r,t){let o=a(e),a$1=a(t);await S(s=>{let i=s.workspaces.find(u=>u.path===o);if(!i)throw new Error(`Workspace is not registered: ${o}`);i.projects=Array.isArray(i.projects)?i.projects:[];let c=i.projects.findIndex(u=>u.path===a$1||u.name===r),d={name:r,path:a$1};c>=0?i.projects[c]=d:i.projects.push(d);});}async function Xe(e,r,t){try{await ye(e,r,t);}catch{}}async function Ze(e,r){let t=N("Creating Workspai workspace...").start();try{await promises.mkdir(e,{recursive:true}),await promises.mkdir(n.join(e,".workspai"),{recursive:true});let o={workspace_name:r.name,author:r.author,rapidkit_version:h(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(n.join(e,".workspai","config.json"),JSON.stringify(o,null,2));let{syncWorkspaceFoundationFiles:a}=await import('./create-GWBQ74ZI.js');await a(e,{workspaceName:r.name,installMethod:"venv",writeMarker:true,writeGitignore:false,onlyIfMissing:true});let s=$e();await promises.writeFile(n.join(e,"rapidkit"),s),await promises.chmod(n.join(e,"rapidkit"),493);let i=je();await promises.writeFile(n.join(e,"rapidkit.cmd"),i);let c=ve(r.name);await promises.writeFile(n.join(e,"README.md"),c),await promises.writeFile(n.join(e,".gitignore"),`# Workspai workspace
6
6
  .env
7
7
  .env.*
8
8
  !.env.example
@@ -17,7 +17,7 @@ Thumbs.db
17
17
 
18
18
  # Logs
19
19
  *.log
20
- `),await _e(e),t.succeed("Workspace created!"),r.skipGit||await re(e,N(),"Initial commit: Workspai workspace"),await ie(e,r.name);let{publishWorkspaceRegistrySummary:u}=await import('./workspace-registry-summary-5SFBTRGQ.js');await u(e),console.log(`
20
+ `),await _e(e),t.succeed("Workspace created!"),r.skipGit||await re(e,N(),"Initial commit: Workspai workspace"),await ie(e,r.name);let{publishWorkspaceRegistrySummary:u}=await import('./workspace-registry-summary-ONT4VOJX.js');await u(e),console.log(`
21
21
  ${p.green("\u2728 Workspai workspace created successfully!")}
22
22
 
23
23
  ${p.bold("\u{1F4C2} Workspace structure:")}
@@ -663,4 +663,4 @@ ${p.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx
663
663
  \u{1F4E6} Registered Workspai Workspaces:
664
664
  `));for(let g of d.workspaces)console.log(p.cyan(` ${g.name}`)),console.log(p.gray(` Path: ${g.path}`)),console.log(p.gray(` Projects: ${g.projects?.length||0}`)),console.log();c>0&&console.log(p.gray(`Cleaned ${c} stale workspace entr${c===1?"y":"ies"}.`)),console.log(p.gray(`Total: ${d.workspaces.length} workspace(s)
665
665
  `));}catch(a){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:0,registryExists:true,registryValid:false},error:{code:"workspace.registry.read_failed",message:a.message}},null,2));return}console.error(p.red(`
666
- \u274C Failed to read workspace registry`)),console.error(p.gray(String(a)));}}function Re(e){if(!e||typeof e!="object"||Array.isArray(e))return [];let r=e.projects;return Array.isArray(r)?r.filter(t=>!!t&&typeof t=="object"&&!Array.isArray(t)):[]}function Se(e,r){if(r||!e||typeof e!="object"||Array.isArray(e))return e;let t=structuredClone(e);return Array.isArray(t.projects)&&(t.projects=t.projects.map(o=>{if(!o||typeof o!="object"||Array.isArray(o))return o;let a={...o};return delete a.externalPath,a})),t}async function xe(e){try{let r=await promises.readFile(e,"utf8");return JSON.parse(r)}catch{return null}}async function B(e){for(let r of e){let t=await xe(r);if(t!==null)return t}return null}function Ee(e){return c(e)}async function We(e){return a$2(e,{skipDirs:new Set(["node_modules","dist","build","target","coverage","htmlcov"]),includeHiddenDirs:false,descendIntoMatchedProjects:true})}async function J(e){try{return (await promises.readdir(e,{withFileTypes:true})).filter(t=>t.isFile()&&t.name.toLowerCase().endsWith(".json")).map(t=>t.name).sort((t,o)=>t.localeCompare(o))}catch{return []}}async function rt(e,r){let t$1=r?.includePaths===true,o=r?.includeDoctorEvidence!==false,a=r?.includeBlueprint!==false,s=n.resolve(e),i$1=await B(t(s,"workspace.json")),c=typeof i$1?.workspace_name=="string"&&i$1.workspace_name.trim()||n.basename(s),d=typeof i$1?.profile=="string"?i$1.profile:void 0,u$1=typeof i$1?.rapidkit_version=="string"?i$1.rapidkit_version:void 0,f=await B(t(s,"workspace.contract.json")),g=Se(f,t$1),k=await We(s),w=new Map;for(let m of k)w.set(n.resolve(m),{projectPath:n.resolve(m)});for(let m of Re(f)){let $=typeof m.externalPath=="string"?m.externalPath.trim():"",j=typeof m.relativePath=="string"?m.relativePath.trim():"";if(!$&&!j)continue;let b=n.resolve(s,$||j),R=w.get(b);w.set(b,{projectPath:b,name:typeof m.slug=="string"&&m.slug.trim()?m.slug.trim():R?.name,relativePath:j||R?.relativePath,runtime:typeof m.runtime=="string"&&m.runtime.trim()?m.runtime.trim():R?.runtime,kit:typeof m.kit=="string"&&m.kit.trim()?m.kit.trim():R?.kit,modules:Array.isArray(m.modules)?m.modules.filter(L=>typeof L=="string"):R?.modules});}let h=[];for(let m of w.values()){let $=m.projectPath,j=await B(u($,"project.json")),b=m.relativePath||n.relative(s,$)||".",R=n.dirname(u($,n.join("reports","placeholder"))[0]),L=n.dirname(u($,n.join("reports","placeholder"))[1]),D={name:m.name||n.basename($),relative_path:b,runtime:typeof j?.runtime=="string"?j.runtime:m.runtime,kit_name:typeof j?.kit_name=="string"?j.kit_name:m.kit,modules:Array.isArray(j?.modules)?j.modules.filter(E=>typeof E=="string"):m.modules};if(t$1&&(D.absolute_path=$),o){let E=await B([n.join(R,"doctor-last-run.json"),n.join(L,"doctor-last-run.json")]);Ee(E)&&(D.doctor_report=E);}let M=[...await J(R),...await J(L)].filter((E,ce,pe)=>pe.indexOf(E)===ce);M.length>0&&(D.reports=M),h.push(D);}let v=t(s,"reports"),y=[...await J(v[0]),...await J(v[1])].filter((m,$,j)=>j.indexOf(m)===$),x={schema_version:h$1.workspaceShareBundle.schemaVersion,generated_at:new Date().toISOString(),generated_by:"workspai",workspace:{name:c,relative_root:".",profile:d,rapidkit_version:u$1,...t$1?{absolute_root:s}:{}},summary:{project_count:h.length,doctor_evidence_included:o,contract_included:!!g},reports:{workspace:y},projects:h,...g?{contract:g}:{}};a&&(x.blueprint={schema_version:"rapidkit.workspace-blueprint.v1",purpose:"portable-reproducibility",workspace:{name:c,profile:d},projects:h.map(m=>({name:m.name,relative_path:m.relative_path,runtime:m.runtime,kit_name:m.kit_name,modules:m.modules??[],recreate_commands:[...m.kit_name?[`npx workspai create project ${m.kit_name} ${m.name} --yes --skip-install`]:[],`cd ${m.relative_path}`,"npx workspai init","npx workspai test"]})),recommended_commands:["npx workspai workspace contract verify --strict","npx workspai doctor workspace","npx workspai workspace run init --json","npx workspai workspace run test --strict --json","npx workspai readiness --strict --json"]});let P=r?.outputPath?n.resolve(r.outputPath):n.join(v[0],"share-bundle.json");return r?.outputPath||b(i.workspaceShareBundle,x),await promises.mkdir(n.dirname(P),{recursive:true}),await promises.writeFile(P,JSON.stringify(x,null,2),"utf8"),P}export{G as a,ie as b,He as c,Ke as d,qe as e,he as f,Qe as g,ye as h,Xe as i,Ze as j,et as k,tt as l,rt as m};
666
+ \u274C Failed to read workspace registry`)),console.error(p.gray(String(a)));}}function Re(e){if(!e||typeof e!="object"||Array.isArray(e))return [];let r=e.projects;return Array.isArray(r)?r.filter(t=>!!t&&typeof t=="object"&&!Array.isArray(t)):[]}function Se(e,r){if(r||!e||typeof e!="object"||Array.isArray(e))return e;let t=structuredClone(e);return Array.isArray(t.projects)&&(t.projects=t.projects.map(o=>{if(!o||typeof o!="object"||Array.isArray(o))return o;let a={...o};return delete a.externalPath,a})),t}async function xe(e){try{let r=await promises.readFile(e,"utf8");return JSON.parse(r)}catch{return null}}async function B(e){for(let r of e){let t=await xe(r);if(t!==null)return t}return null}function Ee(e){return c(e)}async function We(e){return a$2(e,{skipDirs:new Set(["node_modules","dist","build","target","coverage","htmlcov"]),includeHiddenDirs:false,descendIntoMatchedProjects:true})}async function J(e){try{return (await promises.readdir(e,{withFileTypes:true})).filter(t=>t.isFile()&&t.name.toLowerCase().endsWith(".json")).map(t=>t.name).sort((t,o)=>t.localeCompare(o))}catch{return []}}async function rt(e,r){let t$2=r?.includePaths===true,o=r?.includeDoctorEvidence!==false,a=r?.includeBlueprint!==false,s$1=n.resolve(e),i=await B(t(s$1,"workspace.json")),c=typeof i?.workspace_name=="string"&&i.workspace_name.trim()||n.basename(s$1),d=typeof i?.profile=="string"?i.profile:void 0,u$1=typeof i?.rapidkit_version=="string"?i.rapidkit_version:void 0,f=await B(t(s$1,"workspace.contract.json")),g=Se(f,t$2),k=await We(s$1),w=new Map;for(let m of k)w.set(n.resolve(m),{projectPath:n.resolve(m)});for(let m of Re(f)){let $=typeof m.externalPath=="string"?m.externalPath.trim():"",j=typeof m.relativePath=="string"?m.relativePath.trim():"";if(!$&&!j)continue;let b=n.resolve(s$1,$||j),R=w.get(b);w.set(b,{projectPath:b,name:typeof m.slug=="string"&&m.slug.trim()?m.slug.trim():R?.name,relativePath:j||R?.relativePath,runtime:typeof m.runtime=="string"&&m.runtime.trim()?m.runtime.trim():R?.runtime,kit:typeof m.kit=="string"&&m.kit.trim()?m.kit.trim():R?.kit,modules:Array.isArray(m.modules)?m.modules.filter(L=>typeof L=="string"):R?.modules});}let h=[];for(let m of w.values()){let $=m.projectPath,j=await B(u($,"project.json")),b=m.relativePath||n.relative(s$1,$)||".",R=n.dirname(u($,n.join("reports","placeholder"))[0]),L=n.dirname(u($,n.join("reports","placeholder"))[1]),D={name:m.name||n.basename($),relative_path:b,runtime:typeof j?.runtime=="string"?j.runtime:m.runtime,kit_name:typeof j?.kit_name=="string"?j.kit_name:m.kit,modules:Array.isArray(j?.modules)?j.modules.filter(E=>typeof E=="string"):m.modules};if(t$2&&(D.absolute_path=$),o){let E=await B([n.join(R,"doctor-last-run.json"),n.join(L,"doctor-last-run.json")]);Ee(E)&&(D.doctor_report=E);}let M=[...await J(R),...await J(L)].filter((E,ce,pe)=>pe.indexOf(E)===ce);M.length>0&&(D.reports=M),h.push(D);}let v=t(s$1,"reports"),y=[...await J(v[0]),...await J(v[1])].filter((m,$,j)=>j.indexOf(m)===$),x={schema_version:s.workspaceShareBundle.schemaVersion,generated_at:new Date().toISOString(),generated_by:"workspai",workspace:{name:c,relative_root:".",profile:d,rapidkit_version:u$1,...t$2?{absolute_root:s$1}:{}},summary:{project_count:h.length,doctor_evidence_included:o,contract_included:!!g},reports:{workspace:y},projects:h,...g?{contract:g}:{}};a&&(x.blueprint={schema_version:"rapidkit.workspace-blueprint.v1",purpose:"portable-reproducibility",workspace:{name:c,profile:d},projects:h.map(m=>({name:m.name,relative_path:m.relative_path,runtime:m.runtime,kit_name:m.kit_name,modules:m.modules??[],recreate_commands:[...m.kit_name?[`npx workspai create project ${m.kit_name} ${m.name} --yes --skip-install`]:[],`cd ${m.relative_path}`,"npx workspai init","npx workspai test"]})),recommended_commands:["npx workspai workspace contract verify --strict","npx workspai doctor workspace","npx workspai workspace run init --json","npx workspai workspace run test --strict --json","npx workspai readiness --strict --json"]});let P=r?.outputPath?n.resolve(r.outputPath):n.join(v[0],"share-bundle.json");return r?.outputPath||b(t$1.workspaceShareBundle,x),await promises.mkdir(n.dirname(P),{recursive:true}),await promises.writeFile(P,JSON.stringify(x,null,2),"utf8"),P}export{G as a,ie as b,He as c,Ke as d,qe as e,he as f,Qe as g,ye as h,Xe as i,Ze as j,et as k,tt as l,rt as m};