rapidkit 0.40.1 → 0.41.1

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 (199) hide show
  1. package/README.md +48 -7
  2. package/contracts/agent-customization-pack.v1.json +52 -2
  3. package/contracts/extension-cli-compatibility.v1.json +14 -2
  4. package/contracts/runtime-command-surface.v1.json +7 -1
  5. package/contracts/workspace-intelligence/agent-action-outcome.v1.json +38 -0
  6. package/contracts/workspace-intelligence/blocker-resolution.v1.json +65 -0
  7. package/contracts/workspace-intelligence/doctor-fix-result.v1.json +34 -0
  8. package/contracts/workspace-intelligence/studio-blocker-handoff.v1.json +91 -0
  9. package/contracts/workspace-intelligence/workspace-contract-verify.v1.json +51 -0
  10. package/contracts/workspace-intelligence/workspace-dependency-graph.v1.json +61 -1
  11. package/contracts/workspace-intelligence/workspace-explain.v1.json +31 -0
  12. package/contracts/workspace-intelligence/workspace-intelligence-history.v1.json +36 -0
  13. package/contracts/workspace-intelligence/workspace-operational-skill.v1.json +37 -0
  14. package/contracts/workspace-intelligence/workspace-skills-index.v1.json +27 -0
  15. package/dist/analyze-QYHMGLSG.js +1 -0
  16. package/dist/autopilot-release-AHMQEUFH.js +1 -0
  17. package/dist/chunk-33LR2QEM.js +2 -0
  18. package/dist/chunk-3PTJID76.js +2 -0
  19. package/dist/chunk-46AGNYI7.js +50 -0
  20. package/dist/chunk-64RTZBHU.js +2 -0
  21. package/dist/chunk-AQ4XZZC6.js +1 -0
  22. package/dist/{chunk-RXWM5DSC.js → chunk-BFEBZABL.js} +3 -3
  23. package/dist/{chunk-3YLMCP3V.js → chunk-CDCYRBAY.js} +1 -1
  24. package/dist/chunk-CDPR2YKL.js +13 -0
  25. package/dist/chunk-CKXJR3YT.js +7 -0
  26. package/dist/chunk-E5ZVQL3C.js +13 -0
  27. package/dist/chunk-ELU3G6DQ.js +9 -0
  28. package/dist/chunk-EN6YCX36.js +1 -0
  29. package/dist/chunk-FMBSON6H.js +33 -0
  30. package/dist/chunk-GBJBQ43T.js +1 -0
  31. package/dist/chunk-ICGWHIMK.js +1 -0
  32. package/dist/{chunk-4FJQWL7P.js → chunk-ITJ6RKUW.js} +3 -3
  33. package/dist/{workspace-graph-ICB7OVAZ.js → chunk-JEI6BTZI.js} +1 -1
  34. package/dist/{chunk-G76C74EV.js → chunk-JU3VNLTY.js} +1 -1
  35. package/dist/chunk-JW2FSKT3.js +2 -0
  36. package/dist/chunk-KIUSCFHF.js +1 -0
  37. package/dist/chunk-LKX3L7TE.js +2 -0
  38. package/dist/chunk-MIWDCR6I.js +2 -0
  39. package/dist/{chunk-6G2KSHP6.js → chunk-OLDPVVSV.js} +1 -1
  40. package/dist/{chunk-4Q2ZZKGB.js → chunk-PCXSTKZ5.js} +1 -1
  41. package/dist/{chunk-6KD5F6LX.js → chunk-Q2KZIBV4.js} +1 -1
  42. package/dist/{chunk-ERCD6NFF.js → chunk-RSYUNEH7.js} +13 -13
  43. package/dist/chunk-TJN7G2MA.js +1 -0
  44. package/dist/chunk-UQR6G7KH.js +32 -0
  45. package/dist/chunk-VMJA36WD.js +1 -0
  46. package/dist/chunk-WRMCPKGA.js +1 -0
  47. package/dist/{create-XVDDQA42.js → create-RNP5ACQL.js} +1 -1
  48. package/dist/demo-kit-N5U3NGAE.js +149 -0
  49. package/dist/{doctor-UOLOGJ2Z.js → doctor-XM6QDTDC.js} +1 -1
  50. package/dist/{dotnet-webapi-clean-RTBRPDPL.js → dotnet-webapi-clean-K33C77EI.js} +1 -1
  51. package/dist/{gofiber-standard-UGIRKPKL.js → gofiber-standard-BQ4HCXL2.js} +1 -1
  52. package/dist/{gogin-standard-HJ7SPFNT.js → gogin-standard-PUBCYW3A.js} +1 -1
  53. package/dist/index.d.ts +45 -7
  54. package/dist/index.js +145 -127
  55. package/dist/{pipeline-XK62WL4D.js → pipeline-DH6Z47O4.js} +1 -1
  56. package/dist/platform-capabilities-TSLK667K.js +1 -0
  57. package/dist/{pythonRapidkitExec-MNWRC4F2.js → pythonRapidkitExec-SGKW76XM.js} +1 -1
  58. package/dist/{springboot-standard-IWJSVDLZ.js → springboot-standard-XFVQI37R.js} +1 -1
  59. package/dist/{workspace-L4ITCKMM.js → workspace-E554C5SM.js} +1 -1
  60. package/dist/workspace-agent-sync-2HRPM5ZD.js +1 -0
  61. package/dist/{workspace-context-NMMQMHNU.js → workspace-context-VJTXW3K4.js} +1 -1
  62. package/dist/workspace-contract-OO4GMENV.js +1 -0
  63. package/dist/workspace-explain-3WSJLIJ6.js +1 -0
  64. package/dist/workspace-explain-contract-24RQ7KIW.js +1 -0
  65. package/dist/workspace-feedback-65NR3EZH.js +1 -0
  66. package/dist/{workspace-foundation-HNIRAIBF.js → workspace-foundation-LISDH53T.js} +1 -1
  67. package/dist/workspace-graph-2A5THUCI.js +1 -0
  68. package/dist/workspace-history-VPDADQKG.js +1 -0
  69. package/dist/{workspace-intelligence-64IWAYHS.js → workspace-intelligence-E3KXEZCM.js} +1 -1
  70. package/dist/workspace-mcp-serve-RFYDCA2L.js +3 -0
  71. package/dist/workspace-model-YL7W3573.js +1 -0
  72. package/dist/workspace-registry-summary-X5WRUU3T.js +1 -0
  73. package/dist/workspace-run-GCIQD73R.js +1 -0
  74. package/dist/workspace-verify-NRYH7RNB.js +1 -0
  75. package/dist/workspace-watch-H2AETGFI.js +1 -0
  76. package/docs/DEVELOPMENT.md +1 -1
  77. package/docs/OPEN_SOURCE_USER_SCENARIOS.md +1 -1
  78. package/docs/README.md +1 -1
  79. package/docs/commands-reference.md +10 -2
  80. package/docs/contracts/ARTIFACT_CATALOG.md +3 -1
  81. package/docs/contracts/NAMING_AND_COEXISTENCE.md +58 -0
  82. package/docs/workspace-run.md +25 -1
  83. package/package.json +7 -3
  84. package/scripts/enterprise-package-smoke.mjs +427 -0
  85. package/scripts/prepack-enterprise.mjs +40 -0
  86. package/templates/generator.js +175 -0
  87. package/templates/kits/fastapi-ddd/README.md.j2 +122 -0
  88. package/templates/kits/fastapi-ddd/common/env.example.j2 +10 -0
  89. package/templates/kits/fastapi-ddd/env.example.j2 +1 -0
  90. package/templates/kits/fastapi-ddd/pyproject.toml.j2 +64 -0
  91. package/templates/kits/fastapi-ddd/src/__init__.py.j2 +3 -0
  92. package/templates/kits/fastapi-ddd/src/app/__init__.py.j2 +11 -0
  93. package/templates/kits/fastapi-ddd/src/app/application/__init__.py.j2 +5 -0
  94. package/templates/kits/fastapi-ddd/src/app/application/interfaces.py.j2 +43 -0
  95. package/templates/kits/fastapi-ddd/src/app/application/use_cases/__init__.py.j2 +6 -0
  96. package/templates/kits/fastapi-ddd/src/app/application/use_cases/health.py.j2 +14 -0
  97. package/templates/kits/fastapi-ddd/src/app/application/use_cases/notes.py.j2 +24 -0
  98. package/templates/kits/fastapi-ddd/src/app/config/__init__.py.j2 +16 -0
  99. package/templates/kits/fastapi-ddd/src/app/domain/__init__.py.j2 +3 -0
  100. package/templates/kits/fastapi-ddd/src/app/domain/models/__init__.py.j2 +6 -0
  101. package/templates/kits/fastapi-ddd/src/app/domain/models/health.py.j2 +16 -0
  102. package/templates/kits/fastapi-ddd/src/app/domain/models/note.py.j2 +27 -0
  103. package/templates/kits/fastapi-ddd/src/app/infrastructure/__init__.py.j2 +5 -0
  104. package/templates/kits/fastapi-ddd/src/app/infrastructure/repositories/__init__.py.j2 +6 -0
  105. package/templates/kits/fastapi-ddd/src/app/infrastructure/repositories/health.py.j2 +17 -0
  106. package/templates/kits/fastapi-ddd/src/app/infrastructure/repositories/notes.py.j2 +28 -0
  107. package/templates/kits/fastapi-ddd/src/app/main.py.j2 +61 -0
  108. package/templates/kits/fastapi-ddd/src/app/presentation/__init__.py.j2 +3 -0
  109. package/templates/kits/fastapi-ddd/src/app/presentation/api/__init__.py.j2 +5 -0
  110. package/templates/kits/fastapi-ddd/src/app/presentation/api/dependencies/__init__.py.j2 +19 -0
  111. package/templates/kits/fastapi-ddd/src/app/presentation/api/router.py.j2 +10 -0
  112. package/templates/kits/fastapi-ddd/src/app/presentation/api/routes/__init__.py.j2 +5 -0
  113. package/templates/kits/fastapi-ddd/src/app/presentation/api/routes/health.py.j2 +27 -0
  114. package/templates/kits/fastapi-ddd/src/app/presentation/api/routes/notes.py.j2 +50 -0
  115. package/templates/kits/fastapi-ddd/src/app/shared/__init__.py.j2 +5 -0
  116. package/templates/kits/fastapi-ddd/src/app/shared/result.py.j2 +28 -0
  117. package/templates/kits/fastapi-ddd/src/cli.py.j2 +167 -0
  118. package/templates/kits/fastapi-ddd/src/main.py.j2 +35 -0
  119. package/templates/kits/fastapi-ddd/src/modules/__init__.py.j2 +3 -0
  120. package/templates/kits/fastapi-ddd/src/routing/__init__.py.j2 +13 -0
  121. package/templates/kits/fastapi-ddd/src/routing/health.py.j2 +7 -0
  122. package/templates/kits/fastapi-ddd/src/routing/notes.py.j2 +7 -0
  123. package/templates/kits/fastapi-ddd/tests/__init__.py.j2 +1 -0
  124. package/templates/kits/fastapi-ddd/tests/test_app_factory.py.j2 +22 -0
  125. package/templates/kits/fastapi-ddd/tests/test_health.py.j2 +17 -0
  126. package/templates/kits/fastapi-ddd/tests/test_notes.py.j2 +27 -0
  127. package/templates/kits/fastapi-standard/README.md.j2 +145 -0
  128. package/templates/kits/fastapi-standard/common/env.example.j2 +10 -0
  129. package/templates/kits/fastapi-standard/env.example.j2 +1 -0
  130. package/templates/kits/fastapi-standard/pyproject.toml.j2 +64 -0
  131. package/templates/kits/fastapi-standard/src/__init__.py.j2 +3 -0
  132. package/templates/kits/fastapi-standard/src/cli.py.j2 +168 -0
  133. package/templates/kits/fastapi-standard/src/main.py.j2 +66 -0
  134. package/templates/kits/fastapi-standard/src/modules/__init__.py.j2 +3 -0
  135. package/templates/kits/fastapi-standard/src/routing/__init__.py.j2 +16 -0
  136. package/templates/kits/fastapi-standard/src/routing/examples.py.j2 +71 -0
  137. package/templates/kits/fastapi-standard/src/routing/health.py.j2 +22 -0
  138. package/templates/kits/fastapi-standard/tests/__init__.py.j2 +1 -0
  139. package/templates/kits/fastapi-standard/tests/test_examples.py.j2 +29 -0
  140. package/templates/kits/fastapi-standard/tests/test_health.py.j2 +17 -0
  141. package/templates/kits/nestjs-standard/Dockerfile.j2 +41 -0
  142. package/templates/kits/nestjs-standard/README.md.j2 +139 -0
  143. package/templates/kits/nestjs-standard/docker-compose.yml.j2 +94 -0
  144. package/templates/kits/nestjs-standard/docs/README.md.j2 +15 -0
  145. package/templates/kits/nestjs-standard/env.example.j2 +18 -0
  146. package/templates/kits/nestjs-standard/eslint.config.cjs.j2 +9 -0
  147. package/templates/kits/nestjs-standard/jest.config.ts.j2 +22 -0
  148. package/templates/kits/nestjs-standard/nest-cli.json.j2 +10 -0
  149. package/templates/kits/nestjs-standard/package.json.j2 +101 -0
  150. package/templates/kits/nestjs-standard/src/app.controller.ts.j2 +14 -0
  151. package/templates/kits/nestjs-standard/src/app.module.ts.j2 +26 -0
  152. package/templates/kits/nestjs-standard/src/app.service.ts.j2 +16 -0
  153. package/templates/kits/nestjs-standard/src/auth/auth.controller.ts.j2 +20 -0
  154. package/templates/kits/nestjs-standard/src/auth/auth.module.ts.j2 +13 -0
  155. package/templates/kits/nestjs-standard/src/auth/auth.service.ts.j2 +6 -0
  156. package/templates/kits/nestjs-standard/src/auth/entities/token.entity.ts.j2 +3 -0
  157. package/templates/kits/nestjs-standard/src/auth/entities/user.entity.ts.j2 +3 -0
  158. package/templates/kits/nestjs-standard/src/auth/entities/webauthn.entity.ts.j2 +3 -0
  159. package/templates/kits/nestjs-standard/src/config/configuration.ts.j2 +85 -0
  160. package/templates/kits/nestjs-standard/src/config/index.ts.j2 +2 -0
  161. package/templates/kits/nestjs-standard/src/config/validation.ts.j2 +21 -0
  162. package/templates/kits/nestjs-standard/src/examples/dto/create-note.dto.ts.j2 +11 -0
  163. package/templates/kits/nestjs-standard/src/examples/examples.controller.ts.j2 +24 -0
  164. package/templates/kits/nestjs-standard/src/examples/examples.module.ts.j2 +10 -0
  165. package/templates/kits/nestjs-standard/src/examples/examples.service.ts.j2 +33 -0
  166. package/templates/kits/nestjs-standard/src/main.ts.j2 +53 -0
  167. package/templates/kits/nestjs-standard/src/modules/index.ts.j2 +25 -0
  168. package/templates/kits/nestjs-standard/test/app.controller.spec.ts.j2 +24 -0
  169. package/templates/kits/nestjs-standard/test/app.e2e-spec.ts.j2 +60 -0
  170. package/templates/kits/nestjs-standard/test/examples.controller.spec.ts.j2 +28 -0
  171. package/templates/kits/nestjs-standard/test/jest-e2e.json.j2 +15 -0
  172. package/templates/kits/nestjs-standard/tsconfig.build.json.j2 +12 -0
  173. package/templates/kits/nestjs-standard/tsconfig.json.j2 +26 -0
  174. package/dist/analyze-RHQM4AB2.js +0 -1
  175. package/dist/autopilot-release-OJTLXPMX.js +0 -1
  176. package/dist/chunk-5VBRMLRU.js +0 -7
  177. package/dist/chunk-7VI4U7Q5.js +0 -2
  178. package/dist/chunk-FV5A3N3I.js +0 -2
  179. package/dist/chunk-GDGATWR5.js +0 -2
  180. package/dist/chunk-GOM3RFB3.js +0 -2
  181. package/dist/chunk-GX7UU7LL.js +0 -33
  182. package/dist/chunk-KYH364KQ.js +0 -1
  183. package/dist/chunk-OWNGSAO3.js +0 -2
  184. package/dist/chunk-QPEBI6AB.js +0 -2
  185. package/dist/chunk-TYZPPUBH.js +0 -1
  186. package/dist/chunk-VQMZC5TC.js +0 -9
  187. package/dist/chunk-WHCON2VN.js +0 -50
  188. package/dist/chunk-X7PWDIQW.js +0 -1
  189. package/dist/chunk-Z5LKRG57.js +0 -1
  190. package/dist/chunk-ZWKLRZE5.js +0 -13
  191. package/dist/demo-kit-RWGOEDW4.js +0 -141
  192. package/dist/workspace-agent-sync-G7JU77IK.js +0 -25
  193. package/dist/workspace-contract-D5O4OZD5.js +0 -1
  194. package/dist/workspace-history-LHUTLE3S.js +0 -1
  195. package/dist/workspace-model-SDHH5RBC.js +0 -1
  196. package/dist/workspace-registry-summary-MIPHVB56.js +0 -1
  197. package/dist/workspace-run-SPP32MPV.js +0 -1
  198. package/dist/workspace-verify-6Q6MGRG6.js +0 -1
  199. package/dist/workspace-watch-JDXVGW4H.js +0 -1
@@ -1,4 +1,4 @@
1
- import {c}from'./chunk-5VBRMLRU.js';import {b}from'./chunk-WHCON2VN.js';import {b as b$1}from'./chunk-RXWM5DSC.js';import {a as a$1}from'./chunk-VQMZC5TC.js';import {a as a$2}from'./chunk-4FJQWL7P.js';import {a}from'./chunk-KMUWWZRT.js';import {f,e}from'./chunk-4Q2ZZKGB.js';import c$1 from'chalk';import D from'fs-extra';import u from'path';function C(t){return t===0?"pass":t===2?"warn":"fail"}function M(t){return t.some(s=>s.status==="fail")?"blocked":t.some(s=>s.status==="warn")?"needs-attention":"ready"}function F(t,s){if(s)return 3;let a=t.some(i=>i.status==="fail"),r=t.some(i=>i.status==="warn");return a?1:r?2:0}async function j(t){let s=await b$1(t,true),a=false;try{let{syncWorkspaceContract:r}=await import('./workspace-contract-D5O4OZD5.js');await r({workspacePath:t}),a=true;}catch{a=false;}return {sync:s,contractSynced:a}}async function G(t={}){let s=u.resolve(t.workspacePath??process.cwd()),a$3=a(s);if(!a$3)throw new Error("No RapidKit workspace found in current directory or parents");let r=[],i=[],l=false,p,y,m,f$1=Date.now();try{let{sync:e,contractSynced:n}=await j(a$3),o=e.workspaceFound&&(e.added.length>0||e.skipped>=0)||e.workspaceFound?"pass":"warn";r.push({name:"sync",status:o,durationMs:Date.now()-f$1,summary:e.workspaceFound?`registry sync complete (${e.added.length} added, ${e.skipped} existing)${n?", contract synced":""}`:"workspace not registered in global registry; contract sync attempted"}),e.workspaceFound||i.push("workspace registry entry missing \u2014 run rapidkit create workspace or register manually");}catch(e){l=true,r.push({name:"sync",status:"fail",durationMs:Date.now()-f$1,summary:`sync failed: ${e instanceof Error?e.message:String(e)}`}),i.push("workspace sync stage failed");}let w=Date.now();try{let e=await b({workspace:true,json:true,quiet:true,strict:t.strict===true,ci:t.strict!==true}),n=C(e),o=u.join(a$3,".rapidkit","reports","doctor-last-run.json");r.push({name:"doctor",status:n,durationMs:Date.now()-w,summary:n==="pass"?"doctor workspace passed":n==="warn"?"doctor workspace reported warnings":"doctor workspace reported errors",exitCode:e,evidencePath:o}),n==="fail"?i.push("doctor workspace gate failed"):n==="warn"&&i.push("doctor workspace reported warnings");}catch(e){l=true,r.push({name:"doctor",status:"fail",durationMs:Date.now()-w,summary:`doctor failed: ${e instanceof Error?e.message:String(e)}`}),i.push("doctor workspace stage failed");}if(t.skipAnalyze)r.push({name:"analyze",status:"skipped",durationMs:0,summary:"analyze stage skipped"});else {let e=Date.now();try{let n=await a$1({workspacePath:a$3,json:true,strict:t.strict===true});p=u.join(a$3,".rapidkit","reports","analyze-last-run.json");let o=n.summary.verdict==="blocked"?"fail":n.summary.verdict==="needs-attention"?"warn":"pass";r.push({name:"analyze",status:o,durationMs:Date.now()-e,summary:`analyze verdict: ${n.summary.verdict} (score ${n.summary.score}/100)`,evidencePath:p}),o==="fail"?i.push("analyze reported blocked verdict"):o==="warn"&&i.push("analyze reported needs-attention verdict");}catch(n){l=true,r.push({name:"analyze",status:"fail",durationMs:Date.now()-e,summary:`analyze failed: ${n instanceof Error?n.message:String(n)}`}),i.push("analyze stage failed");}}let h=Date.now();try{let e=await a$2({startPath:a$3,writeReport:true,skipVerify:t.skipVerify===true});y=e.evidencePath;let n=e.overallStatus==="pass"?"pass":e.overallStatus==="warn"?"warn":"fail";r.push({name:"readiness",status:n,durationMs:Date.now()-h,summary:`readiness overall: ${e.overallStatus}`,evidencePath:e.evidencePath}),n==="fail"?i.push(...e.blockingReasons.map(o=>`readiness: ${o}`)):n==="warn"&&i.push(...e.gates.filter(o=>o.status==="warn").map(o=>`readiness warn: ${o.gate}: ${o.summary}`));}catch(e){l=true,r.push({name:"readiness",status:"fail",durationMs:Date.now()-h,summary:`readiness failed: ${e instanceof Error?e.message:String(e)}`}),i.push("readiness stage failed");}if(t.skipAutopilot)r.push({name:"autopilot",status:"skipped",durationMs:0,summary:"autopilot stage skipped"});else {let e=Date.now(),n=t.autopilotMode??"audit";try{let o=await c({workspacePath:a$3,mode:n,json:true,skipPipelineStages:true});m=o.artifacts.reportPath;let P=o.summary.verdict==="approved"?"pass":o.summary.verdict==="partial"?"warn":"fail";r.push({name:"autopilot",status:P,durationMs:Date.now()-e,summary:`autopilot ${n}: ${o.summary.verdict}`,exitCode:o.summary.exitCode,evidencePath:m}),P!=="pass"&&i.push(...o.blockingReasons.slice(0,5));}catch(o){l=true,r.push({name:"autopilot",status:"fail",durationMs:Date.now()-e,summary:`autopilot failed: ${o instanceof Error?o.message:String(o)}`}),i.push("autopilot release stage failed");}}let z=M(r),k=F(r,l),g=u.join(a$3,".rapidkit","reports","pipeline-last-run.json"),d={schemaVersion:"rapidkit-pipeline-v1",generatedAt:new Date().toISOString(),workspacePath:a$3,summary:{verdict:z,exitCode:k,stagesPassed:r.filter(e=>e.status==="pass").length,stagesWarn:r.filter(e=>e.status==="warn").length,stagesFailed:r.filter(e=>e.status==="fail").length},stages:r,blockingReasons:[...new Set(i)],artifacts:{reportPath:g,analyzeEvidencePath:p,readinessEvidencePath:y,autopilotEvidencePath:m}};if(t.writeReport!==false){await D.ensureDir(u.dirname(g));let e$1=f(d,{commandId:"workspacePipeline",exitCode:k,generatedAt:d.generatedAt,blockers:d.blockingReasons,runId:e()});await D.writeJSON(g,e$1,{spaces:2});}if(t.writeReport!==false&&t.noAgentSync!==true&&process.env.RAPIDKIT_NO_AGENT_SYNC!=="1"&&t.agentSync!==false)try{let{syncWorkspaceAgentGrounding:e}=await import('./workspace-agent-sync-G7JU77IK.js'),n=await e({workspacePath:a$3,write:true,refreshContext:true,strict:false});d.agentGrounding={indexPath:n.indexPath,writtenFiles:n.writtenFiles,blockers:n.blockers};}catch{}return d}async function X(t){let s;try{s=await G(t);}catch(a){let r=a instanceof Error?a.message:String(a);t.json?console.log(JSON.stringify({schemaVersion:"rapidkit-pipeline-error-v1",ok:false,error:{message:r}},null,2)):console.log(c$1.red(`Pipeline failed: ${r}`)),process.exit(1);}if(t.json)console.log(JSON.stringify(s,null,2));else {console.log(c$1.bold.cyan(`
1
+ import {a as a$1}from'./chunk-ELU3G6DQ.js';import {c}from'./chunk-CKXJR3YT.js';import {b}from'./chunk-46AGNYI7.js';import {b as b$1}from'./chunk-BFEBZABL.js';import {a as a$2}from'./chunk-ITJ6RKUW.js';import {a}from'./chunk-KMUWWZRT.js';import {f,e}from'./chunk-PCXSTKZ5.js';import c$1 from'chalk';import D from'fs-extra';import u from'path';function C(t){return t===0?"pass":t===2?"warn":"fail"}function M(t){return t.some(s=>s.status==="fail")?"blocked":t.some(s=>s.status==="warn")?"needs-attention":"ready"}function F(t,s){if(s)return 3;let a=t.some(i=>i.status==="fail"),r=t.some(i=>i.status==="warn");return a?1:r?2:0}async function j(t){let s=await b$1(t,true),a=false;try{let{syncWorkspaceContract:r}=await import('./workspace-contract-OO4GMENV.js');await r({workspacePath:t}),a=true;}catch{a=false;}return {sync:s,contractSynced:a}}async function G(t={}){let s=u.resolve(t.workspacePath??process.cwd()),a$3=a(s);if(!a$3)throw new Error("No RapidKit workspace found in current directory or parents");let r=[],i=[],l=false,p,y,m,f$1=Date.now();try{let{sync:e,contractSynced:n}=await j(a$3),o=e.workspaceFound&&(e.added.length>0||e.skipped>=0)||e.workspaceFound?"pass":"warn";r.push({name:"sync",status:o,durationMs:Date.now()-f$1,summary:e.workspaceFound?`registry sync complete (${e.added.length} added, ${e.skipped} existing)${n?", contract synced":""}`:"workspace not registered in global registry; contract sync attempted"}),e.workspaceFound||i.push("workspace registry entry missing \u2014 run rapidkit create workspace or register manually");}catch(e){l=true,r.push({name:"sync",status:"fail",durationMs:Date.now()-f$1,summary:`sync failed: ${e instanceof Error?e.message:String(e)}`}),i.push("workspace sync stage failed");}let w=Date.now();try{let e=await b({workspace:true,json:true,quiet:true,strict:t.strict===true,ci:t.strict!==true}),n=C(e),o=u.join(a$3,".rapidkit","reports","doctor-last-run.json");r.push({name:"doctor",status:n,durationMs:Date.now()-w,summary:n==="pass"?"doctor workspace passed":n==="warn"?"doctor workspace reported warnings":"doctor workspace reported errors",exitCode:e,evidencePath:o}),n==="fail"?i.push("doctor workspace gate failed"):n==="warn"&&i.push("doctor workspace reported warnings");}catch(e){l=true,r.push({name:"doctor",status:"fail",durationMs:Date.now()-w,summary:`doctor failed: ${e instanceof Error?e.message:String(e)}`}),i.push("doctor workspace stage failed");}if(t.skipAnalyze)r.push({name:"analyze",status:"skipped",durationMs:0,summary:"analyze stage skipped"});else {let e=Date.now();try{let n=await a$1({workspacePath:a$3,json:true,strict:t.strict===true});p=u.join(a$3,".rapidkit","reports","analyze-last-run.json");let o=n.summary.verdict==="blocked"?"fail":n.summary.verdict==="needs-attention"?"warn":"pass";r.push({name:"analyze",status:o,durationMs:Date.now()-e,summary:`analyze verdict: ${n.summary.verdict} (score ${n.summary.score}/100)`,evidencePath:p}),o==="fail"?i.push("analyze reported blocked verdict"):o==="warn"&&i.push("analyze reported needs-attention verdict");}catch(n){l=true,r.push({name:"analyze",status:"fail",durationMs:Date.now()-e,summary:`analyze failed: ${n instanceof Error?n.message:String(n)}`}),i.push("analyze stage failed");}}let h=Date.now();try{let e=await a$2({startPath:a$3,writeReport:true,skipVerify:t.skipVerify===true});y=e.evidencePath;let n=e.overallStatus==="pass"?"pass":e.overallStatus==="warn"?"warn":"fail";r.push({name:"readiness",status:n,durationMs:Date.now()-h,summary:`readiness overall: ${e.overallStatus}`,evidencePath:e.evidencePath}),n==="fail"?i.push(...e.blockingReasons.map(o=>`readiness: ${o}`)):n==="warn"&&i.push(...e.gates.filter(o=>o.status==="warn").map(o=>`readiness warn: ${o.gate}: ${o.summary}`));}catch(e){l=true,r.push({name:"readiness",status:"fail",durationMs:Date.now()-h,summary:`readiness failed: ${e instanceof Error?e.message:String(e)}`}),i.push("readiness stage failed");}if(t.skipAutopilot)r.push({name:"autopilot",status:"skipped",durationMs:0,summary:"autopilot stage skipped"});else {let e=Date.now(),n=t.autopilotMode??"audit";try{let o=await c({workspacePath:a$3,mode:n,json:true,skipPipelineStages:true});m=o.artifacts.reportPath;let P=o.summary.verdict==="approved"?"pass":o.summary.verdict==="partial"?"warn":"fail";r.push({name:"autopilot",status:P,durationMs:Date.now()-e,summary:`autopilot ${n}: ${o.summary.verdict}`,exitCode:o.summary.exitCode,evidencePath:m}),P!=="pass"&&i.push(...o.blockingReasons.slice(0,5));}catch(o){l=true,r.push({name:"autopilot",status:"fail",durationMs:Date.now()-e,summary:`autopilot failed: ${o instanceof Error?o.message:String(o)}`}),i.push("autopilot release stage failed");}}let z=M(r),k=F(r,l),g=u.join(a$3,".rapidkit","reports","pipeline-last-run.json"),d={schemaVersion:"rapidkit-pipeline-v1",generatedAt:new Date().toISOString(),workspacePath:a$3,summary:{verdict:z,exitCode:k,stagesPassed:r.filter(e=>e.status==="pass").length,stagesWarn:r.filter(e=>e.status==="warn").length,stagesFailed:r.filter(e=>e.status==="fail").length},stages:r,blockingReasons:[...new Set(i)],artifacts:{reportPath:g,analyzeEvidencePath:p,readinessEvidencePath:y,autopilotEvidencePath:m}};if(t.writeReport!==false){await D.ensureDir(u.dirname(g));let e$1=f(d,{commandId:"workspacePipeline",exitCode:k,generatedAt:d.generatedAt,blockers:d.blockingReasons,runId:e()});await D.writeJSON(g,e$1,{spaces:2});}if(t.writeReport!==false&&t.noAgentSync!==true&&process.env.RAPIDKIT_NO_AGENT_SYNC!=="1"&&t.agentSync!==false)try{let{syncWorkspaceAgentGrounding:e}=await import('./workspace-agent-sync-2HRPM5ZD.js'),n=await e({workspacePath:a$3,write:true,refreshContext:true,strict:false});d.agentGrounding={indexPath:n.indexPath,writtenFiles:n.writtenFiles,blockers:n.blockers};}catch{}return d}async function X(t){let s;try{s=await G(t);}catch(a){let r=a instanceof Error?a.message:String(a);t.json?console.log(JSON.stringify({schemaVersion:"rapidkit-pipeline-error-v1",ok:false,error:{message:r}},null,2)):console.log(c$1.red(`Pipeline failed: ${r}`)),process.exit(1);}if(t.json)console.log(JSON.stringify(s,null,2));else {console.log(c$1.bold.cyan(`
2
2
  \u{1F517} RapidKit Governance Pipeline
3
3
  `)),console.log(c$1.bold(`Workspace: ${c$1.cyan(u.basename(s.workspacePath))}`)),console.log(c$1.gray(`Path: ${s.workspacePath}`)),console.log(c$1.white(`Verdict: ${s.summary.verdict} Exit: ${s.summary.exitCode} (${s.summary.stagesPassed} pass / ${s.summary.stagesWarn} warn / ${s.summary.stagesFailed} fail)`));for(let a of s.stages){let r=a.status==="pass"?c$1.green("PASS"):a.status==="warn"?c$1.yellow("WARN"):a.status==="skipped"?c$1.gray("SKIP"):c$1.red("FAIL");console.log(` - ${a.name}: ${r} ${a.summary}`);}if(s.blockingReasons.length>0){console.log(c$1.bold(`
4
4
  Blocking reasons:`));for(let a of s.blockingReasons.slice(0,8))console.log(c$1.gray(` \u2022 ${a}`));}console.log(c$1.gray(`
@@ -0,0 +1 @@
1
+ export{f as augmentPathWithNodeBin,g as buildPackageRunnerSubprocessEnv,a as detectPlatformKind,h as getDefaultPythonCommand,i as getPythonCommandCandidates,j as getPythonVersionProbeCandidates,o as getRapidkitLocalScriptCandidates,q as getUserLocalBinCandidates,n as getVenvActivateScriptPath,k as getVenvBinDirectory,l as getVenvPythonPath,m as getVenvRapidkitPath,p as getWorkspaceRegistryDirectory,b as isWindowsPlatform,d as resolvePackageRunnerExecutable,e as resolvePackageRunnerInvocation,c as shouldUseShellExecution}from'./chunk-WRMCPKGA.js';
@@ -1 +1 @@
1
- export{k as __test__,b as checkRapidkitCoreAvailable,c as checkRapidkitCoreVersionCompatible,i as getCachedCoreTopLevelCommands,h as getCoreTopLevelCommands,j as getModulesCatalog,d as resolveRapidkitPython,e as runCoreRapidkit,g as runCoreRapidkitCapture,f as runCoreRapidkitStreamed}from'./chunk-GX7UU7LL.js';
1
+ export{k as __test__,b as checkRapidkitCoreAvailable,c as checkRapidkitCoreVersionCompatible,i as getCachedCoreTopLevelCommands,h as getCoreTopLevelCommands,j as getModulesCatalog,d as resolveRapidkitPython,e as runCoreRapidkit,g as runCoreRapidkitCapture,f as runCoreRapidkitStreamed}from'./chunk-FMBSON6H.js';
@@ -1,4 +1,4 @@
1
- import {b as b$1,c}from'./chunk-3Q7264EJ.js';import {b}from'./chunk-6KD5F6LX.js';import {promises}from'fs';import g from'path';import r from'chalk';import R from'ora';import {execa}from'execa';var y="21",$="3.5.0",j="2.8.9";function u(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"").replace(/\.{2,}/g,".").split(".").map(p=>p.replace(/^[^a-z]+/,"").replace(/[^a-z0-9]/g,"")).filter(Boolean).join(".")}function _(e,t){return e.replace(/[\r\n\t]+/g," ").trim()||t}function x(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-")}function M(e,t){let s=u(e)||"com.rapidkit.apps",p=u(t)||"service";return `${s}.${p}`}function E(e){return e.replace(/\./g,"/")}function T(){return JSON.stringify({engine:"npm",runtime:"java"},null,2)}function A(e,t){return JSON.stringify({kit_name:"springboot.standard",runtime:"java",module_support:false,project_name:e.project_name,artifact_id:e.artifact_id,group_id:e.group_id,package_name:e.package_name,app_version:e.app_version,created_by:"rapidkit-npm",rapidkit_version:t,created_at:new Date().toISOString()},null,2)}function P(e){return `<?xml version="1.0" encoding="UTF-8"?>
1
+ import {b as b$1,c}from'./chunk-3Q7264EJ.js';import {b}from'./chunk-Q2KZIBV4.js';import {promises}from'fs';import g from'path';import r from'chalk';import R from'ora';import {execa}from'execa';var y="21",$="3.5.0",j="2.8.9";function u(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"").replace(/\.{2,}/g,".").split(".").map(p=>p.replace(/^[^a-z]+/,"").replace(/[^a-z0-9]/g,"")).filter(Boolean).join(".")}function _(e,t){return e.replace(/[\r\n\t]+/g," ").trim()||t}function x(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-")}function M(e,t){let s=u(e)||"com.rapidkit.apps",p=u(t)||"service";return `${s}.${p}`}function E(e){return e.replace(/\./g,"/")}function T(){return JSON.stringify({engine:"npm",runtime:"java"},null,2)}function A(e,t){return JSON.stringify({kit_name:"springboot.standard",runtime:"java",module_support:false,project_name:e.project_name,artifact_id:e.artifact_id,group_id:e.group_id,package_name:e.package_name,app_version:e.app_version,created_by:"rapidkit-npm",rapidkit_version:t,created_at:new Date().toISOString()},null,2)}function P(e){return `<?xml version="1.0" encoding="UTF-8"?>
2
2
  <project xmlns="http://maven.apache.org/POM/4.0.0"
3
3
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
4
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
@@ -1 +1 @@
1
- export{e as createProject,d as createWorkspace,g as createWorkspaceShareBundle,f as listWorkspaces,c as registerProjectInWorkspace,a as registerWorkspace,b as syncWorkspaceProjects}from'./chunk-RXWM5DSC.js';
1
+ export{e as createProject,d as createWorkspace,g as createWorkspaceShareBundle,f as listWorkspaces,c as registerProjectInWorkspace,a as registerWorkspace,b as syncWorkspaceProjects}from'./chunk-BFEBZABL.js';
@@ -0,0 +1 @@
1
+ export{g as AGENT_CUSTOMIZATION_PACK_REPORT_PATH,d as AGENT_CUSTOMIZATION_PACK_SCHEMA,f as AGENT_GROUNDING_DOC_PATH,e as AGENT_REPORTS_INDEX_PATH,c as AGENT_REPORTS_INDEX_SCHEMA,h as AGENT_REPORT_CATALOG,i as buildWorkspaceAgentReportsIndex,j as parseAgentGroundingTargets,k as syncWorkspaceAgentGrounding}from'./chunk-UQR6G7KH.js';
@@ -1 +1 @@
1
- export{b as WORKSPACE_CONTEXT_AGENT_REPORT_PATH,a as WORKSPACE_CONTEXT_SCHEMA_VERSION,c as buildWorkspaceAgentContext,d as writeWorkspaceAgentContext}from'./chunk-OWNGSAO3.js';
1
+ export{b as WORKSPACE_CONTEXT_AGENT_REPORT_PATH,a as WORKSPACE_CONTEXT_SCHEMA_VERSION,c as buildWorkspaceAgentContext,d as writeWorkspaceAgentContext}from'./chunk-33LR2QEM.js';
@@ -0,0 +1 @@
1
+ export{b as WORKSPACE_CONTRACT_PATH,d as WORKSPACE_CONTRACT_SCHEMA_VERSION,c as WORKSPACE_CONTRACT_VERIFY_REPORT_PATH,e as WORKSPACE_CONTRACT_VERIFY_SCHEMA_VERSION,g as buildWorkspaceContract,k as buildWorkspaceContractGraph,f as discoverProjectJsonFiles,j as readWorkspaceContract,i as syncWorkspaceContract,l as verifyWorkspaceContract,h as writeWorkspaceContract,m as writeWorkspaceContractVerifyEvidence}from'./chunk-3PTJID76.js';
@@ -0,0 +1 @@
1
+ export{b as buildWorkspaceExplain,a as resolveWorkspaceExplainArtifactPath,c as writeWorkspaceExplainReport}from'./chunk-CDPR2YKL.js';export{d as WORKSPACE_MODEL_DIFF_REPORT_PATH}from'./chunk-LKX3L7TE.js';export{c as WORKSPACE_EXPLAIN_REPORT_PATH,e as WORKSPACE_TRACE_REPORT_PATH,d as WORKSPACE_WHY_REPORT_PATH}from'./chunk-GBJBQ43T.js';
@@ -0,0 +1 @@
1
+ export{a as WORKSPACE_EXPLAIN_SCHEMA_VERSION,b as WORKSPACE_EXPLAIN_TARGETS,e as isWorkspaceExplainReport,c as parseWorkspaceExplainTarget,d as resolveWorkspaceTraceTarget}from'./chunk-AQ4XZZC6.js';export{c as WORKSPACE_EXPLAIN_REPORT_PATH,e as WORKSPACE_TRACE_REPORT_PATH,d as WORKSPACE_WHY_REPORT_PATH}from'./chunk-GBJBQ43T.js';
@@ -0,0 +1 @@
1
+ import {b}from'./chunk-ICGWHIMK.js';import {b as b$1,f,i}from'./chunk-VMJA36WD.js';import o from'path';async function m(r){let t=o.resolve(r.workspacePath),n=b(r.payload);if(!n)return {ok:false,error:"Invalid agent-action-outcome payload",historyPath:o.join(t,b$1)};let c=f(n),p=o.join(t,b$1);return await i(t,c,{retention:r.retention}),{ok:true,entry:c,historyPath:p}}function l(r){let t=r.trim();if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function h(){let r=[];for await(let t of process.stdin)r.push(typeof t=="string"?Buffer.from(t):t);return Buffer.concat(r).toString("utf8")}export{l as parseFeedbackStdinPayload,h as readStdinAll,m as recordWorkspaceFeedback};
@@ -1 +1 @@
1
- import {b}from'./chunk-ERCD6NFF.js';import {a}from'./chunk-RV6HBTFC.js';import c from'path';import u from'fs-extra';async function W(t,r){let o=await a(t),d=o?.name||c.basename(t),n,i=c.join(t,".python-version");if(await u.pathExists(i)){let a=(await u.readFile(i,"utf-8")).trim();a&&(n=a);}let e=r?.profile||"polyglot",m=e==="python-only"||e==="polyglot"||e==="enterprise",f=r?.installMethod||o?.metadata?.npm?.installMethod||(m?"poetry":"venv"),s=await b(t,{workspaceName:d,installMethod:f,pythonVersion:n,profile:e,writeMarker:true,writeGitignore:true,onlyIfMissing:!r?.force}),{publishWorkspaceRegistrySummary:y}=await import('./workspace-registry-summary-MIPHVB56.js');return await y(t),{workspacePath:t,created:s,status:s.length>0?"passed":"skipped"}}export{W as ensureWorkspaceFoundation};
1
+ import {b}from'./chunk-RSYUNEH7.js';import {a}from'./chunk-RV6HBTFC.js';import c from'path';import u from'fs-extra';async function W(t,r){let o=await a(t),d=o?.name||c.basename(t),n,i=c.join(t,".python-version");if(await u.pathExists(i)){let a=(await u.readFile(i,"utf-8")).trim();a&&(n=a);}let e=r?.profile||"polyglot",m=e==="python-only"||e==="polyglot"||e==="enterprise",f=r?.installMethod||o?.metadata?.npm?.installMethod||(m?"poetry":"venv"),s=await b(t,{workspaceName:d,installMethod:f,pythonVersion:n,profile:e,writeMarker:true,writeGitignore:true,onlyIfMissing:!r?.force}),{publishWorkspaceRegistrySummary:y}=await import('./workspace-registry-summary-X5WRUU3T.js');return await y(t),{workspacePath:t,created:s,status:s.length>0?"passed":"skipped"}}export{W as ensureWorkspaceFoundation};
@@ -0,0 +1 @@
1
+ export{d as buildGraphEmit,a as explainGraphNode,b as renderGraphDot,c as renderGraphMermaid}from'./chunk-JEI6BTZI.js';
@@ -0,0 +1 @@
1
+ export{c as DEFAULT_HISTORY_RETENTION,b as WORKSPACE_HISTORY_PATH,a as WORKSPACE_HISTORY_SCHEMA_VERSION,h as appendHistoryEntry,f as historyEntryFromAgentAction,e as historyEntryFromVerify,d as normalizeHistoryEntry,g as readWorkspaceHistory,i as recordWorkspaceHistory}from'./chunk-VMJA36WD.js';
@@ -1 +1 @@
1
- export{f as WORKSPACE_IMPACT_REPORT_PATH,e as WORKSPACE_IMPACT_SCHEMA_VERSION,d as WORKSPACE_MODEL_DIFF_REPORT_PATH,b as WORKSPACE_MODEL_DIFF_SCHEMA_VERSION,c as WORKSPACE_MODEL_SNAPSHOT_REPORT_PATH,a as WORKSPACE_MODEL_SNAPSHOT_SCHEMA_VERSION,n as buildWorkspaceImpact,i as buildWorkspaceModelSnapshot,k as diffWorkspaceModel,g as isGitDiffSource,h as parseGitDiffRef,m as workspaceVerificationPlan,o as writeWorkspaceImpact,l as writeWorkspaceModelDiff,j as writeWorkspaceModelSnapshot}from'./chunk-QPEBI6AB.js';
1
+ export{f as WORKSPACE_IMPACT_REPORT_PATH,e as WORKSPACE_IMPACT_SCHEMA_VERSION,d as WORKSPACE_MODEL_DIFF_REPORT_PATH,b as WORKSPACE_MODEL_DIFF_SCHEMA_VERSION,c as WORKSPACE_MODEL_SNAPSHOT_REPORT_PATH,a as WORKSPACE_MODEL_SNAPSHOT_SCHEMA_VERSION,n as buildWorkspaceImpact,i as buildWorkspaceModelSnapshot,k as diffWorkspaceModel,g as isGitDiffSource,h as parseGitDiffRef,m as workspaceVerificationPlan,o as writeWorkspaceImpact,l as writeWorkspaceModelDiff,j as writeWorkspaceModelSnapshot}from'./chunk-LKX3L7TE.js';
@@ -0,0 +1,3 @@
1
+ import {b}from'./chunk-CDPR2YKL.js';import {b as b$2}from'./chunk-33LR2QEM.js';import {d}from'./chunk-TJN7G2MA.js';import {c,e}from'./chunk-AQ4XZZC6.js';import {c as c$1,b as b$3}from'./chunk-GBJBQ43T.js';import {h as h$1}from'./chunk-EN6YCX36.js';import {c as c$2}from'./chunk-3PTJID76.js';import f from'path';import T from'readline';import b$1 from'fs-extra';var P=".rapidkit/reports/INDEX.json";function h(t,e){return t.kind!==e.kind?false:t.kind==="project"&&e.kind==="project"?t.project.toLowerCase()===e.project.toLowerCase():t.kind==="blocker"&&e.kind==="blocker"?t.blockerId===e.blockerId:t.kind==="trace"&&e.kind==="trace"?t.diffRef===e.diffRef:true}var O=[{name:"getWorkspaceModel",description:"Read workspace-model.json",inputSchema:{type:"object",properties:{}}},{name:"getEvidenceIndex",description:"Read agent reports INDEX.json",inputSchema:{type:"object",properties:{}}},{name:"getBlockers",description:"Aggregate blocking reasons from verify, explain, and contract-verify reports",inputSchema:{type:"object",properties:{}}},{name:"getSafeCommands",description:"Read safe commands from workspace-context-agent.json",inputSchema:{type:"object",properties:{}}},{name:"getProjectContext",description:"Read scoped project context from workspace-context-agent.json",inputSchema:{type:"object",properties:{project:{type:"string",description:"Optional project name; defaults to active scope"}}}},{name:"getArtifact",description:"Read one workspace-relative artifact path",inputSchema:{type:"object",properties:{relativePath:{type:"string"}},required:["relativePath"]}},{name:"listOperationalSkills",description:"Read workspace-skills-index.json",inputSchema:{type:"object",properties:{}}},{name:"getWorkspaceExplain",description:"Build or read workspace explain report",inputSchema:{type:"object",properties:{target:{type:"string",description:"release-blocked | project:<name> | blocker:<id> | trace:<diffRef> | <project>"}}}}];function C(t){let e=t.trim().replace(/\\/g,"/");return e.length>0&&!f.isAbsolute(e)&&!e.split("/").includes("..")&&e.startsWith(".rapidkit/")}async function l(t,e){if(!C(e))throw new Error(`Unsafe artifact path: ${e}`);let i=f.join(t,e);return await b$1.pathExists(i)?b$1.readJson(i):null}async function _(t){let e$1=[],i=new Set,s=((await l(t,d))?.blockingReasons??[]).filter(n=>typeof n=="string"&&n.trim().length>0);if(s.length>0){e$1.push({artifact:d,reasons:s});for(let n of s)i.add(n);}let a=await l(t,c$1);if(e(a)){let n=(a.blockingReasons??[]).filter(r=>typeof r=="string"&&r.trim().length>0);if(n.length>0){e$1.push({artifact:c$1,reasons:n});for(let r of n)i.add(r);}}let c=await l(t,c$2),p=(c?.violations??[]).filter(n=>typeof n=="string"&&n.trim().length>0);if(p.length>0||String(c?.status??"").toLowerCase()==="failed"){let n=p.length>0?p:["Workspace contract verification failed"];e$1.push({artifact:c$2,reasons:n});for(let r of n)i.add(r);}return {blockingReasons:[...i],sources:e$1}}async function x(t,e$1,i){switch(e$1){case "getWorkspaceModel":return l(t,h$1);case "getEvidenceIndex":return l(t,P);case "getBlockers":return _(t);case "getSafeCommands":return {safeCommands:(await l(t,b$2))?.safeCommands??[]};case "getProjectContext":{let o=await l(t,b$2);if(!o)return null;let s=String(i.project??"").trim(),a=o.scope?.activeProject??void 0,c=s||a,p=Array.isArray(o.projects)?o.projects:[],n=c&&p.find(r=>typeof r.name=="string"&&r.name.toLowerCase()===c.toLowerCase());return {workspace:o.workspace??null,scope:o.scope??null,validation:o.validation??null,project:n??null,safeCommands:o.safeCommands??[]}}case "getArtifact":{let o=String(i.relativePath??"").trim();return l(t,o)}case "listOperationalSkills":return l(t,b$3);case "getWorkspaceExplain":{let o=String(i.target??"release-blocked").trim(),s=c(o);if(!s)throw new Error(`Invalid explain target: ${o}`);let a=await l(t,c$1);return e(a)&&h(a.target,s)?a:b({workspacePath:t,target:s})}default:throw new Error(`Unknown tool: ${e$1}`)}}function R(t,e){process.stdout.write(`${JSON.stringify({jsonrpc:"2.0",id:t??null,result:e})}
2
+ `);}function w(t,e){process.stdout.write(`${JSON.stringify({jsonrpc:"2.0",id:t??null,error:{code:-32e3,message:e}})}
3
+ `);}async function B(t){let e=f.resolve(t.workspacePath),i=T.createInterface({input:process.stdin,terminal:false});for await(let o of i){let s=o.trim();if(!s)continue;let a;try{a=JSON.parse(s);}catch{w(null,"Invalid JSON-RPC request");continue}let{id:c,method:p,params:n}=a;try{if(p==="initialize"){R(c,{protocolVersion:"2024-11-05",capabilities:{tools:{}},serverInfo:{name:"rapidkit-workspace-mcp",version:"0.1.0"}});continue}if(p==="notifications/initialized")continue;if(p==="tools/list"){R(c,{tools:O.map(r=>({name:r.name,description:r.description,inputSchema:r.inputSchema}))});continue}if(p==="tools/call"){let r=String(n?.name??""),A=n?.arguments&&typeof n.arguments=="object"?n.arguments:{},E=await x(e,r,A);R(c,{content:[{type:"text",text:JSON.stringify(E,null,2)}],isError:E==null});continue}w(c,`Unsupported method: ${p??"unknown"}`);}catch(r){w(c,r instanceof Error?r.message:String(r));}}}async function F(t,e,i={}){return x(f.resolve(t),e,i)}export{O as WORKSPACE_MCP_READ_TOOLS,F as invokeMcpToolForTest,B as runWorkspaceMcpServe};
@@ -0,0 +1 @@
1
+ export{h as WORKSPACE_MODEL_REPORT_PATH,g as WORKSPACE_MODEL_SCHEMA_VERSION,j as buildWorkspaceModel,k as buildWorkspaceModelCached,l as buildWorkspaceModelIncremental,i as validateWorkspaceModelStrict,m as writeWorkspaceModel}from'./chunk-EN6YCX36.js';
@@ -0,0 +1 @@
1
+ import {a}from'./chunk-A5FBGRJA.js';import {b,j}from'./chunk-3PTJID76.js';import {p}from'./chunk-WRMCPKGA.js';import s from'path';import n from'fs-extra';var l=".rapidkit/workspace-registry.v1.json",h="workspace-registry.v1";function P(r){return {slug:r.slug,relativePath:r.relativePath,framework:r.framework,kit:r.kit,source:r.source}}async function f(r){let t=s.join(r,".rapidkit","workspace.json");if(!await n.pathExists(t))return {exists:false,legacyProjectCount:0};try{let e=await n.readJson(t),o=Array.isArray(e.projects)?e.projects.length:0;return {exists:true,workspaceName:typeof e.workspace_name=="string"&&e.workspace_name.trim()||typeof e.name=="string"&&e.name.trim()||s.basename(r),profile:typeof e.profile=="string"?e.profile:void 0,legacyProjectCount:o}}catch{return {exists:true,legacyProjectCount:0,workspaceName:s.basename(r)}}}async function W(r){let t=a(r),e=s.join(p(),"workspaces.json");if(!await n.pathExists(e))return 0;try{let a$1=((await n.readJson(e)).workspaces||[]).find(c=>a(c.path)===t);return Array.isArray(a$1?.projects)?a$1.projects.length:0}catch{return 0}}async function S(r){let t=s.resolve(r),e=s.join(t,b),o=await f(t),a=await W(t),c=await n.pathExists(e),i=[];if(c)try{let{contract:w}=await j({workspacePath:t});i=w.projects||[];}catch{i=[];}let R={contract:{exists:c,projectCount:i.length,path:b},globalRegistry:{exists:a>0,projectCount:a,path:s.join(p(),"workspaces.json")},legacyWorkspaceJson:{exists:o.exists,projectCount:o.legacyProjectCount,path:".rapidkit/workspace.json"}},p$1="none",u=[],y=0;return c?(p$1="workspace.contract.json",u=i.map(P),y=u.length):a>0?(p$1="global-registry",y=a):o.legacyProjectCount>0&&(p$1="legacy-workspace.json",y=o.legacyProjectCount),{contractExists:c,summary:{schemaVersion:h,kind:"rapidkit.workspace.registry",workspacePath:t,workspaceName:o.workspaceName||s.basename(t),profile:o.profile,projectCount:y,authority:p$1,contractPath:b,projects:u,sources:R}}}async function v(r){let t=s.join(s.resolve(r),l);if(!await n.pathExists(t))return null;try{let e=await n.readJson(t);return e?.schemaVersion!==h?null:e}catch{return null}}async function N(r,t){let e=await S(r),o=s.join(s.resolve(r),l),a={...e.summary,generatedAt:(t?.now??new Date).toISOString(),registrySummaryPath:l};return await n.ensureDir(s.dirname(o)),await n.writeJson(o,a,{spaces:2}),a}function M(r,t=""){return r.projectCount>0?r.authority==="workspace.contract.json"?`${r.projectCount} project(s) registered in workspace contract${t}.`:r.authority==="global-registry"?`${r.projectCount} project(s) registered in global workspace registry${t}.`:`${r.projectCount} project(s) registered in legacy workspace manifest${t}.`:`Workspace state exists, but no projects are registered yet${t}.`}export{l as WORKSPACE_REGISTRY_SUMMARY_RELATIVE_PATH,h as WORKSPACE_REGISTRY_SUMMARY_SCHEMA_VERSION,M as formatWorkspaceRegistrySyncSummary,N as publishWorkspaceRegistrySummary,v as readWorkspaceRegistrySummary,S as resolveWorkspaceRegisteredProjects};
@@ -0,0 +1 @@
1
+ export{a as runWorkspaceStage}from'./chunk-JW2FSKT3.js';export{a as WORKSPACE_RUN_LAST_REPORT_FILENAME}from'./chunk-64RTZBHU.js';
@@ -0,0 +1 @@
1
+ export{d as WORKSPACE_VERIFY_REPORT_PATH,c as WORKSPACE_VERIFY_SCHEMA_VERSION,f as buildWorkspaceVerify,e as computeAffectedSubgraphGate,h as evaluateWorkspaceVerifyGate,i as workspaceVerifyExitCode,g as writeWorkspaceVerify}from'./chunk-TJN7G2MA.js';
@@ -0,0 +1 @@
1
+ import {a}from'./chunk-KIUSCFHF.js';import {b,l}from'./chunk-EN6YCX36.js';import b$1 from'fs';var M="workspace-watch-event.v1";function g(t){return `${t.from}\0${t.to}\0${t.kind}`}function f(t){return (t.graph?.edges??[]).map(r=>({from:r.from,to:r.to,kind:r.kind}))}function m(t){let o=[...a(t).entries()].sort((a,n)=>a[0].localeCompare(n[0])).map(([a,n])=>({id:a,hash:n})),c=f(t).map(g).sort((a,n)=>a.localeCompare(n));return b({projects:o,edges:c})}function w(t,r){let o=a(r),c=t?a(t):new Map,a$1=[],n=[];for(let[e,s]of o.entries())c.has(e)?c.get(e)!==s&&a$1.push(e):n.push(e);let d=[];for(let e of c.keys())o.has(e)||d.push(e);let i=new Map(t?f(t).map(e=>[g(e),e]):[]),l=new Map(f(r).map(e=>[g(e),e])),p=[];for(let[e,s]of l.entries())i.has(e)||p.push(s);let h=[];for(let[e,s]of i.entries())l.has(e)||h.push(s);let u=(e,s)=>g(e).localeCompare(g(s));return a$1.sort((e,s)=>e.localeCompare(s)),n.sort((e,s)=>e.localeCompare(s)),d.sort((e,s)=>e.localeCompare(s)),p.sort(u),h.sort(u),{changedProjects:a$1,addedProjects:n,removedProjects:d,edgesAdded:p,edgesRemoved:h}}var k=class{model=null;sequence=0;rebuild;now;constructor(r,o){this.rebuild=o?.rebuild??(()=>l({...r})),this.now=o?.now??(()=>new Date);}get currentModel(){return this.model}async start(){let r=Date.now(),{model:o}=await this.rebuild();return this.model=o,this.buildEvent("ready","initial",null,o,Date.now()-r)}async pulse(){let r=Date.now(),o=this.model,{model:c,mode:a}=await this.rebuild(),n=this.buildEvent(this.hasStructuralChange(o,c)?"changed":"unchanged",a,o,c,Date.now()-r);return this.model=c,n}hasStructuralChange(r,o){return r?m(r)!==m(o):true}buildEvent(r,o,c,a,n){let d=w(c,a),i=m(a),l=c?m(c)!==i:true;return {schemaVersion:M,kind:r,sequence:this.sequence++,timestamp:this.now().toISOString(),mode:o,modelHash:i,modelHashChanged:l,changedProjects:d.changedProjects,addedProjects:d.addedProjects,removedProjects:d.removedProjects,graph:{nodeCount:a.graph?.nodes.length??0,edgeCount:a.graph?.edges.length??0,edgesAdded:d.edgesAdded,edgesRemoved:d.edgesRemoved},durationMs:n}}},P=new Set([".git",".hg",".svn","node_modules",".venv","venv","dist","build","out","target","coverage","htmlcov",".next",".turbo",".cache"]),R=new Set(["reports","cache","tmp",".cache"]);function y(t){if(!t)return false;let r=t.split(/[\\/]/).filter(Boolean);if(r.some(o=>P.has(o)))return false;for(let o=0;o<r.length-1;o+=1)if(r[o]===".rapidkit"&&R.has(r[o+1]))return false;return true}async function D(t){let r=new k(t.buildOptions,t.engineOptions),o=await r.start();if(t.emit(o),t.once)return;let c=t.debounceMs??250,a=t.selfWriteSuppressionMs??Math.max(400,c+150),n=null,d=false,i=false,l=0,p=async()=>{if(d){i=true;return}d=true;try{let e=await r.pulse();t.emit(e);}catch(e){t.emit({schemaVersion:M,kind:"error",sequence:-1,timestamp:new Date().toISOString(),mode:"full",modelHash:r.currentModel?m(r.currentModel):"",modelHashChanged:false,changedProjects:[],addedProjects:[],removedProjects:[],graph:{nodeCount:0,edgeCount:0,edgesAdded:[],edgesRemoved:[]},durationMs:0,error:e instanceof Error?e.message:String(e)});}finally{d=false,l=Date.now()+a,i&&(i=false,p());}},h=e=>{y(e)&&(d||Date.now()<l||(n&&clearTimeout(n),n=setTimeout(()=>{n=null,p();},c)));};t.onProgress?.(`Watching ${t.workspacePath} for changes (Ctrl+C to stop).`);let u=b$1.watch(t.workspacePath,{recursive:true},(e,s)=>{typeof s=="string"?h(s):s&&h(Buffer.from(s).toString("utf8"));});await new Promise(e=>{let s=()=>{n&&clearTimeout(n),u.close(),e();};if(t.signal){if(t.signal.aborted){s();return}t.signal.addEventListener("abort",s,{once:true});}u.on("error",()=>s());});}export{M as WORKSPACE_WATCH_EVENT_SCHEMA_VERSION,k as WorkspaceWatchEngine,m as computeWatchModelHash,w as diffWatchModels,y as isWatchRelevantPath,D as runWorkspaceWatch};
@@ -42,7 +42,7 @@ npx rapidkit my-workspace --test-mode
42
42
  ```bash
43
43
  # Direct project creation
44
44
  npx rapidkit create project fastapi.standard my-api --output .
45
- npx rapidkit create frontend nextjs my-web --yes
45
+ npx rapidkit create project nextjs my-web --yes
46
46
 
47
47
  # Workspace mode
48
48
  npx rapidkit create workspace my-workspace --yes --profile polyglot
@@ -27,7 +27,7 @@ npx rapidkit import https://github.com/acme/orders-api.git --git --workspace ./p
27
27
 
28
28
  ```bash
29
29
  cd my-workspace
30
- npx rapidkit create frontend nextjs marketing-web --yes
30
+ npx rapidkit create project nextjs marketing-web --yes
31
31
  ```
32
32
 
33
33
  ## What changed from the old flow?
package/docs/README.md CHANGED
@@ -29,7 +29,7 @@ Hub for user and contributor documentation. Start with the [main README](../READ
29
29
  **Common tasks**
30
30
 
31
31
  - Adopt an existing repo: [workspace-operations.md#import-and-adoption](./workspace-operations.md#import-and-adoption)
32
- - Scaffold a frontend app: [commands-reference.md](./commands-reference.md) (`create frontend`)
32
+ - Scaffold a frontend app: [commands-reference.md](./commands-reference.md) (`create project nextjs <name>`)
33
33
  - CI release gate: [commands-reference.md](./commands-reference.md) (`pipeline`, `readiness`)
34
34
  - Agent context: `workspace model` / `workspace context` — schemas in [contracts/workspace-intelligence/](../contracts/workspace-intelligence/)
35
35
 
@@ -73,8 +73,7 @@ See [workspace-run.md](./workspace-run.md) for fleet orchestration semantics.
73
73
  ## Project lifecycle
74
74
 
75
75
  ```bash
76
- npx rapidkit create project <kit> <name> [--yes] [--skip-install]
77
- npx rapidkit create frontend <id> <name> [--output <dir>] [--yes] [--skip-install] [--skip-git]
76
+ npx rapidkit create project <kit> <name> [--yes] [--skip-install] [--skip-git] [--output <dir>]
78
77
  npx rapidkit project commands [--json]
79
78
  npx rapidkit commands --scope project [--json]
80
79
  npx rapidkit init
@@ -84,6 +83,15 @@ npx rapidkit build
84
83
  npx rapidkit start
85
84
  ```
86
85
 
86
+ Examples:
87
+
88
+ ```bash
89
+ npx rapidkit create project fastapi.standard my-api --yes
90
+ npx rapidkit create project nextjs my-web --yes
91
+ ```
92
+
93
+ `create frontend <id> <name>` is still accepted and routes to the same generators.
94
+
87
95
  `project commands` shows the effective command contract for the current project. Core-backed FastAPI/NestJS projects can use module commands such as `add` and `modules`. Frontend apps, Go, Spring Boot, .NET, and adopted/imported repositories use runtime lifecycle commands and workspace governance while Core module mutation remains disabled.
88
96
 
89
97
  ## Operations
@@ -43,7 +43,9 @@ Side/cache (not gates): `.rapidkit/reports/doctor-workspace-cache.json` (`doctor
43
43
  | `workspace impact --from <diff>` | `workspace-impact-last-run.json` | `workspace-impact.v1` | `workspace-impact.v1.json` |
44
44
  | `workspace verify` | `workspace-verify-last-run.json` | `workspace-verify.v1` | `workspace-verify.v1.json` |
45
45
  | `workspace context --write` | `workspace-context-agent.json` | `workspace-context.v1` | `workspace-context.v1.json` |
46
- | `workspace agent-sync --write` | `reports/INDEX.json`, `reports/agent-customization-pack.json`, `reports/rapidkit-mcp-design.json`, `AGENT-GROUNDING.md`, `AGENTS.md`, Copilot/Cursor/Claude/VS Code agent surfaces | `rapidkit-agent-customization-pack.v1` | `contracts/agent-customization-pack.v1.json` |
46
+ | `workspace agent-sync --write` | `reports/INDEX.json`, `reports/agent-customization-pack.json`, `reports/rapidkit-mcp-design.json`, `reports/workspace-skills-index.json`, `.rapidkit/skills/*.md`, `AGENT-GROUNDING.md`, `AGENTS.md`, Copilot/Cursor/Claude/VS Code agent surfaces | `rapidkit-agent-customization-pack.v1` | `contracts/agent-customization-pack.v1.json` |
47
+ | `workspace explain --write` | `workspace-explain-last-run.json` | `workspace-explain.v1` | `contracts/workspace-intelligence/workspace-explain.v1.json` |
48
+ | `workspace feedback record` | `workspace-intelligence-history.json` (`kind: agent-action`) | `workspace-intelligence-history.v1` | `contracts/workspace-intelligence/workspace-intelligence-history.v1.json` |
47
49
 
48
50
  **CLI semantics:** `workspace diff --from` expects a **model or snapshot** baseline. `workspace impact --from` expects a **diff report**.
49
51
 
@@ -0,0 +1,58 @@
1
+ # Naming and coexistence (Phase 4.0)
2
+
3
+ Rules for **operational intelligence** artifacts so npm CLI, VS Code extension, and agent tools share one canonical layout without duplicate generators.
4
+
5
+ ## Canonical vs generated surfaces
6
+
7
+ | Layer | Canonical (workspace-native) | Generated (agent-sync) |
8
+ | ----- | ---------------------------- | ---------------------- |
9
+ | Operational playbooks | `.rapidkit/skills/{skillId}.md` | — |
10
+ | Skills index | `.rapidkit/reports/workspace-skills-index.json` | — |
11
+ | Copilot skill umbrella | — | `.github/skills/rapidkit-workspace-intelligence/SKILL.md` |
12
+ | Explain report | `.rapidkit/reports/workspace-explain-last-run.json` | — |
13
+ | Action feedback | `.rapidkit/reports/workspace-intelligence-history.json` (`kind: agent-action`) | — |
14
+
15
+ **Rule:** Never add a standalone `workspace skills generate` command. Operational skills are produced only by `workspace agent-sync --write` (extend the Agent Customization Pack).
16
+
17
+ ## Skill identifiers
18
+
19
+ Built-in operational skill ids use the `rapidkit-*` prefix:
20
+
21
+ - `rapidkit-diagnose-api-failure`
22
+ - `rapidkit-release-readiness`
23
+ - `rapidkit-safe-schema-migration`
24
+ - `rapidkit-dependency-upgrade`
25
+ - `rapidkit-rename-contract`
26
+
27
+ Paths are derived from id via `operationalSkillPath()` in `src/contracts/workspace-artifact-paths.ts`.
28
+
29
+ ## Command coexistence
30
+
31
+ | User intent | Command | Notes |
32
+ | ----------- | ------- | ----- |
33
+ | Project / release / blocker narrative | `workspace explain …` | Primary explain surface |
34
+ | Shorthand alias | `workspace why …` | Same parser as `explain` |
35
+ | Diff → blast radius → gates | `workspace trace --from <diff>` | Slice of explain (`kind: trace`) |
36
+ | Graph node centrality | `workspace graph explain <project>` | Graph-topology slice; see **Graph explain coexistence** below |
37
+ | Record agent outcome | `workspace feedback record --json` | Appends to history, no separate feedback file |
38
+ | MCP read bridge | `workspace mcp serve` | Read-mostly stdio JSON-RPC; maps Phase 4 explain + skills tools |
39
+
40
+ ## Graph explain coexistence (4.11)
41
+
42
+ `workspace graph explain <project>` remains the **graph-topology slice** — centrality, direct/transitive dependents via `explainGraphNode` in `workspace-graph.ts`.
43
+
44
+ `workspace explain project:<name>` is the **unified narrative** — consumers, contracts, verification plan, release risk from reports.
45
+
46
+ Do not duplicate BFS/traversal: graph explain stays single-sourced in `workspace-graph.ts`; unified explain composes it when building project sections.
47
+
48
+ ## Extension alignment
49
+
50
+ Schema versions advertised by `rapidkit --version --json` and `commands --json` must match files under `contracts/workspace-intelligence/`. Run `npm run sync:shared-contracts` after npm changes so `rapidkit-vscode/contracts` stays aligned.
51
+
52
+ ## Answer contract (shared)
53
+
54
+ All operational skills and the workspace-intelligence Copilot skill use the same answer shape:
55
+
56
+ **Scope → Evidence → Diagnosis → Fix Plan → Run → Verify → Assumptions**
57
+
58
+ Defined in `src/contracts/standard-answer-contract.ts` and referenced by the agent customization pack.
@@ -46,7 +46,31 @@ Override stage commands per project via `.rapidkit/context.json`:
46
46
  }
47
47
  ```
48
48
 
49
- Enterprise features include command overrides, multi-framework projects, error categorization (setup vs test vs runtime), preflight validation, health checks, custom stages, stage dependencies, environment variants, caching, and composite steps.
49
+ Enterprise features include command overrides, multi-framework projects, error categorization (setup vs test vs runtime), preflight validation, health checks, custom stages (via `.rapidkit/context.json` `commands`), stage dependencies (from framework registry), environment variants, result caching (`--reuse-passed`), and composite steps.
50
+
51
+ ### Custom stages
52
+
53
+ Declare extra fleet stages in `.rapidkit/context.json`:
54
+
55
+ ```json
56
+ {
57
+ "commands": {
58
+ "lint": "php bin/phpstan analyse --level=8"
59
+ }
60
+ }
61
+ ```
62
+
63
+ Run them with `npx rapidkit workspace run lint --scope project:<name>`.
64
+
65
+ ### Stage dependencies and caching
66
+
67
+ Framework registry entries may declare `dependencies` (for example `start` depends on `build`). When `.rapidkit/reports/workspace-run-last.json` exists, projects skip until dependency stages show `passed`.
68
+
69
+ Use `--reuse-passed` to skip projects that already passed the requested stage in the cached report:
70
+
71
+ ```bash
72
+ npx rapidkit workspace run test --reuse-passed --json
73
+ ```
50
74
 
51
75
  ## JSON reporting
52
76
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rapidkit",
3
- "version": "0.40.1",
3
+ "version": "0.41.1",
4
4
  "type": "module",
5
5
  "description": "Open-source workspace intelligence CLI for software systems: create, adopt, govern, verify, and align polyglot workspaces for humans, CI, IDEs, and AI agents.",
6
6
  "keywords": [
@@ -41,10 +41,13 @@
41
41
  "dist",
42
42
  "contracts",
43
43
  "docs",
44
+ "templates",
44
45
  "data/modules-embeddings.json",
45
46
  "scripts/enforce-package-manager.cjs",
46
47
  "scripts/check-cli-resolution.cjs",
47
- "scripts/check-agent-customization-drift.mjs"
48
+ "scripts/check-agent-customization-drift.mjs",
49
+ "scripts/enterprise-package-smoke.mjs",
50
+ "scripts/prepack-enterprise.mjs"
48
51
  ],
49
52
  "publishConfig": {
50
53
  "registry": "https://registry.npmjs.org",
@@ -80,7 +83,8 @@
80
83
  "test:prepare-embeddings": "node scripts/prepare-mock-embeddings.mjs",
81
84
  "generate-embeddings": "npx tsx src/ai/generate-embeddings.ts",
82
85
  "verify:package-cli": "node scripts/verify-package-cli.mjs",
83
- "prepack": "npm run build && npm run test:prepare-embeddings && npm run verify:package-cli",
86
+ "smoke:enterprise-package": "node scripts/enterprise-package-smoke.mjs",
87
+ "prepack": "node scripts/prepack-enterprise.mjs",
84
88
  "test:e2e": "vitest run src/__tests__/e2e.test.ts",
85
89
  "test:scenarios": "node scripts/run-scenario-matrix-local.mjs",
86
90
  "test:scenarios:full": "node scripts/run-scenario-matrix-local.mjs --full",