rapidkit 0.41.0 → 0.41.2

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 (169) hide show
  1. package/README.md +88 -11
  2. package/contracts/extension-cli-compatibility.v1.json +1 -1
  3. package/contracts/runtime-command-surface.v1.json +3 -1
  4. package/contracts/workspace-intelligence/agent-action-outcome.v1.json +17 -1
  5. package/contracts/workspace-intelligence/studio-blocker-handoff.v1.json +24 -0
  6. package/contracts/workspace-intelligence/workspace-dependency-graph.v1.json +61 -1
  7. package/dist/analyze-QYHMGLSG.js +1 -0
  8. package/dist/autopilot-release-YDEUKRW6.js +1 -0
  9. package/dist/{chunk-WA6JYVJM.js → chunk-33LR2QEM.js} +1 -1
  10. package/dist/{chunk-DMUEGR36.js → chunk-3PTJID76.js} +1 -1
  11. package/dist/chunk-46AGNYI7.js +50 -0
  12. package/dist/chunk-AQ4XZZC6.js +1 -0
  13. package/dist/{chunk-MGUJWRZA.js → chunk-BFEBZABL.js} +3 -3
  14. package/dist/chunk-DWXRVGOY.js +2 -0
  15. package/dist/chunk-E5ZVQL3C.js +13 -0
  16. package/dist/chunk-ELU3G6DQ.js +9 -0
  17. package/dist/chunk-EN6YCX36.js +1 -0
  18. package/dist/chunk-FMBSON6H.js +33 -0
  19. package/dist/chunk-GBJBQ43T.js +1 -0
  20. package/dist/chunk-HYAT2EG7.js +1 -0
  21. package/dist/{chunk-FPUNOIAR.js → chunk-ITJ6RKUW.js} +3 -3
  22. package/dist/{chunk-Y2SCTWL4.js → chunk-JNXT6KJV.js} +2 -2
  23. package/dist/{chunk-XOVB2ZP5.js → chunk-JU3VNLTY.js} +1 -1
  24. package/dist/{chunk-44GSDNPQ.js → chunk-KIUSCFHF.js} +1 -1
  25. package/dist/{chunk-KTQZUWAM.js → chunk-RSYUNEH7.js} +13 -13
  26. package/dist/chunk-VDTAPIHB.js +2 -0
  27. package/dist/chunk-WCICO7ZB.js +13 -0
  28. package/dist/chunk-WRMCPKGA.js +1 -0
  29. package/dist/{chunk-73IS6RIM.js → chunk-ZPXMZCYG.js} +1 -1
  30. package/dist/{create-UGXMC4CT.js → create-RNP5ACQL.js} +1 -1
  31. package/dist/demo-kit-N5U3NGAE.js +149 -0
  32. package/dist/{doctor-LCKG5S76.js → doctor-XM6QDTDC.js} +1 -1
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.js +118 -117
  35. package/dist/{pipeline-MKNYPNGD.js → pipeline-YD2DO7XY.js} +1 -1
  36. package/dist/platform-capabilities-TSLK667K.js +1 -0
  37. package/dist/{pythonRapidkitExec-MNWRC4F2.js → pythonRapidkitExec-SGKW76XM.js} +1 -1
  38. package/dist/{workspace-FDMJD5XI.js → workspace-E554C5SM.js} +1 -1
  39. package/dist/{workspace-agent-sync-WJIZCZX5.js → workspace-agent-sync-BHE2V4KS.js} +1 -1
  40. package/dist/{workspace-context-RYOQYGOP.js → workspace-context-VJTXW3K4.js} +1 -1
  41. package/dist/{workspace-contract-ITFCJCHI.js → workspace-contract-OO4GMENV.js} +1 -1
  42. package/dist/workspace-explain-XJ22ZXJY.js +1 -0
  43. package/dist/workspace-explain-contract-24RQ7KIW.js +1 -0
  44. package/dist/{workspace-foundation-SILFUKL5.js → workspace-foundation-LISDH53T.js} +1 -1
  45. package/dist/{workspace-intelligence-YOZQBAK5.js → workspace-intelligence-EC63CRVF.js} +1 -1
  46. package/dist/workspace-mcp-serve-KOM2V35Q.js +3 -0
  47. package/dist/{workspace-model-VMMLHJWI.js → workspace-model-YL7W3573.js} +1 -1
  48. package/dist/workspace-registry-summary-X5WRUU3T.js +1 -0
  49. package/dist/workspace-run-F5FADRY5.js +1 -0
  50. package/dist/workspace-verify-IAUHP6Y6.js +1 -0
  51. package/dist/{workspace-watch-3MEZRSEE.js → workspace-watch-H2AETGFI.js} +1 -1
  52. package/docs/DEVELOPMENT.md +1 -1
  53. package/docs/OPEN_SOURCE_USER_SCENARIOS.md +1 -1
  54. package/docs/README.md +1 -1
  55. package/docs/commands-reference.md +10 -2
  56. package/docs/contracts/ARTIFACT_CATALOG.md +1 -1
  57. package/docs/contracts/README.md +11 -0
  58. package/package.json +7 -3
  59. package/scripts/enterprise-package-smoke.mjs +433 -0
  60. package/scripts/prepack-enterprise.mjs +40 -0
  61. package/templates/generator.js +175 -0
  62. package/templates/kits/fastapi-ddd/README.md.j2 +122 -0
  63. package/templates/kits/fastapi-ddd/common/env.example.j2 +10 -0
  64. package/templates/kits/fastapi-ddd/env.example.j2 +1 -0
  65. package/templates/kits/fastapi-ddd/pyproject.toml.j2 +64 -0
  66. package/templates/kits/fastapi-ddd/src/__init__.py.j2 +3 -0
  67. package/templates/kits/fastapi-ddd/src/app/__init__.py.j2 +11 -0
  68. package/templates/kits/fastapi-ddd/src/app/application/__init__.py.j2 +5 -0
  69. package/templates/kits/fastapi-ddd/src/app/application/interfaces.py.j2 +43 -0
  70. package/templates/kits/fastapi-ddd/src/app/application/use_cases/__init__.py.j2 +6 -0
  71. package/templates/kits/fastapi-ddd/src/app/application/use_cases/health.py.j2 +14 -0
  72. package/templates/kits/fastapi-ddd/src/app/application/use_cases/notes.py.j2 +24 -0
  73. package/templates/kits/fastapi-ddd/src/app/config/__init__.py.j2 +16 -0
  74. package/templates/kits/fastapi-ddd/src/app/domain/__init__.py.j2 +3 -0
  75. package/templates/kits/fastapi-ddd/src/app/domain/models/__init__.py.j2 +6 -0
  76. package/templates/kits/fastapi-ddd/src/app/domain/models/health.py.j2 +16 -0
  77. package/templates/kits/fastapi-ddd/src/app/domain/models/note.py.j2 +27 -0
  78. package/templates/kits/fastapi-ddd/src/app/infrastructure/__init__.py.j2 +5 -0
  79. package/templates/kits/fastapi-ddd/src/app/infrastructure/repositories/__init__.py.j2 +6 -0
  80. package/templates/kits/fastapi-ddd/src/app/infrastructure/repositories/health.py.j2 +17 -0
  81. package/templates/kits/fastapi-ddd/src/app/infrastructure/repositories/notes.py.j2 +28 -0
  82. package/templates/kits/fastapi-ddd/src/app/main.py.j2 +61 -0
  83. package/templates/kits/fastapi-ddd/src/app/presentation/__init__.py.j2 +3 -0
  84. package/templates/kits/fastapi-ddd/src/app/presentation/api/__init__.py.j2 +5 -0
  85. package/templates/kits/fastapi-ddd/src/app/presentation/api/dependencies/__init__.py.j2 +19 -0
  86. package/templates/kits/fastapi-ddd/src/app/presentation/api/router.py.j2 +10 -0
  87. package/templates/kits/fastapi-ddd/src/app/presentation/api/routes/__init__.py.j2 +5 -0
  88. package/templates/kits/fastapi-ddd/src/app/presentation/api/routes/health.py.j2 +27 -0
  89. package/templates/kits/fastapi-ddd/src/app/presentation/api/routes/notes.py.j2 +50 -0
  90. package/templates/kits/fastapi-ddd/src/app/shared/__init__.py.j2 +5 -0
  91. package/templates/kits/fastapi-ddd/src/app/shared/result.py.j2 +28 -0
  92. package/templates/kits/fastapi-ddd/src/cli.py.j2 +167 -0
  93. package/templates/kits/fastapi-ddd/src/main.py.j2 +35 -0
  94. package/templates/kits/fastapi-ddd/src/modules/__init__.py.j2 +3 -0
  95. package/templates/kits/fastapi-ddd/src/routing/__init__.py.j2 +13 -0
  96. package/templates/kits/fastapi-ddd/src/routing/health.py.j2 +7 -0
  97. package/templates/kits/fastapi-ddd/src/routing/notes.py.j2 +7 -0
  98. package/templates/kits/fastapi-ddd/tests/__init__.py.j2 +1 -0
  99. package/templates/kits/fastapi-ddd/tests/test_app_factory.py.j2 +22 -0
  100. package/templates/kits/fastapi-ddd/tests/test_health.py.j2 +17 -0
  101. package/templates/kits/fastapi-ddd/tests/test_notes.py.j2 +27 -0
  102. package/templates/kits/fastapi-standard/README.md.j2 +145 -0
  103. package/templates/kits/fastapi-standard/common/env.example.j2 +10 -0
  104. package/templates/kits/fastapi-standard/env.example.j2 +1 -0
  105. package/templates/kits/fastapi-standard/pyproject.toml.j2 +64 -0
  106. package/templates/kits/fastapi-standard/src/__init__.py.j2 +3 -0
  107. package/templates/kits/fastapi-standard/src/cli.py.j2 +168 -0
  108. package/templates/kits/fastapi-standard/src/main.py.j2 +66 -0
  109. package/templates/kits/fastapi-standard/src/modules/__init__.py.j2 +3 -0
  110. package/templates/kits/fastapi-standard/src/routing/__init__.py.j2 +16 -0
  111. package/templates/kits/fastapi-standard/src/routing/examples.py.j2 +71 -0
  112. package/templates/kits/fastapi-standard/src/routing/health.py.j2 +22 -0
  113. package/templates/kits/fastapi-standard/tests/__init__.py.j2 +1 -0
  114. package/templates/kits/fastapi-standard/tests/test_examples.py.j2 +29 -0
  115. package/templates/kits/fastapi-standard/tests/test_health.py.j2 +17 -0
  116. package/templates/kits/nestjs-standard/Dockerfile.j2 +41 -0
  117. package/templates/kits/nestjs-standard/README.md.j2 +139 -0
  118. package/templates/kits/nestjs-standard/docker-compose.yml.j2 +94 -0
  119. package/templates/kits/nestjs-standard/docs/README.md.j2 +15 -0
  120. package/templates/kits/nestjs-standard/env.example.j2 +18 -0
  121. package/templates/kits/nestjs-standard/eslint.config.cjs.j2 +9 -0
  122. package/templates/kits/nestjs-standard/jest.config.ts.j2 +22 -0
  123. package/templates/kits/nestjs-standard/nest-cli.json.j2 +10 -0
  124. package/templates/kits/nestjs-standard/package.json.j2 +101 -0
  125. package/templates/kits/nestjs-standard/src/app.controller.ts.j2 +14 -0
  126. package/templates/kits/nestjs-standard/src/app.module.ts.j2 +26 -0
  127. package/templates/kits/nestjs-standard/src/app.service.ts.j2 +16 -0
  128. package/templates/kits/nestjs-standard/src/auth/auth.controller.ts.j2 +20 -0
  129. package/templates/kits/nestjs-standard/src/auth/auth.module.ts.j2 +13 -0
  130. package/templates/kits/nestjs-standard/src/auth/auth.service.ts.j2 +6 -0
  131. package/templates/kits/nestjs-standard/src/auth/entities/token.entity.ts.j2 +3 -0
  132. package/templates/kits/nestjs-standard/src/auth/entities/user.entity.ts.j2 +3 -0
  133. package/templates/kits/nestjs-standard/src/auth/entities/webauthn.entity.ts.j2 +3 -0
  134. package/templates/kits/nestjs-standard/src/config/configuration.ts.j2 +85 -0
  135. package/templates/kits/nestjs-standard/src/config/index.ts.j2 +2 -0
  136. package/templates/kits/nestjs-standard/src/config/validation.ts.j2 +21 -0
  137. package/templates/kits/nestjs-standard/src/examples/dto/create-note.dto.ts.j2 +11 -0
  138. package/templates/kits/nestjs-standard/src/examples/examples.controller.ts.j2 +24 -0
  139. package/templates/kits/nestjs-standard/src/examples/examples.module.ts.j2 +10 -0
  140. package/templates/kits/nestjs-standard/src/examples/examples.service.ts.j2 +33 -0
  141. package/templates/kits/nestjs-standard/src/main.ts.j2 +53 -0
  142. package/templates/kits/nestjs-standard/src/modules/index.ts.j2 +25 -0
  143. package/templates/kits/nestjs-standard/test/app.controller.spec.ts.j2 +24 -0
  144. package/templates/kits/nestjs-standard/test/app.e2e-spec.ts.j2 +60 -0
  145. package/templates/kits/nestjs-standard/test/examples.controller.spec.ts.j2 +28 -0
  146. package/templates/kits/nestjs-standard/test/jest-e2e.json.j2 +15 -0
  147. package/templates/kits/nestjs-standard/tsconfig.build.json.j2 +12 -0
  148. package/templates/kits/nestjs-standard/tsconfig.json.j2 +26 -0
  149. package/dist/analyze-JVMUCQ22.js +0 -1
  150. package/dist/autopilot-release-GM5ALPWO.js +0 -1
  151. package/dist/chunk-424B73UF.js +0 -1
  152. package/dist/chunk-56RL5OB6.js +0 -2
  153. package/dist/chunk-AO6PG3K2.js +0 -9
  154. package/dist/chunk-AT3EQ2S7.js +0 -2
  155. package/dist/chunk-FVCZGUVX.js +0 -1
  156. package/dist/chunk-GX7UU7LL.js +0 -33
  157. package/dist/chunk-P5ODFWB2.js +0 -13
  158. package/dist/chunk-QN2LPLHO.js +0 -1
  159. package/dist/chunk-RIZCWYRR.js +0 -1
  160. package/dist/chunk-YOQ2546V.js +0 -50
  161. package/dist/chunk-Z5LKRG57.js +0 -1
  162. package/dist/chunk-ZQRFVFKK.js +0 -13
  163. package/dist/demo-kit-2VI4H6OJ.js +0 -141
  164. package/dist/workspace-explain-VKSUKP3O.js +0 -1
  165. package/dist/workspace-explain-contract-CLHQ3XEH.js +0 -1
  166. package/dist/workspace-mcp-serve-OOLITFCK.js +0 -3
  167. package/dist/workspace-registry-summary-ZXGKL2NT.js +0 -1
  168. package/dist/workspace-run-IHB2TPMD.js +0 -1
  169. package/dist/workspace-verify-3CAKAZIL.js +0 -1
@@ -0,0 +1,33 @@
1
+ import {l,j as j$1,i,b,q,m,h}from'./chunk-WRMCPKGA.js';import {a}from'./chunk-2FIX2MDC.js';import ft from'crypto';import q$1 from'os';import u from'path';import*as p from'fs-extra';import {execa}from'execa';var mt=["version","project","create","add","list","info","upgrade","diff","doctor","license","commands","reconcile","rollback","uninstall","checkpoint","optimize","snapshot","frameworks","modules","merge"],M=new Set(mt);var g=a();function O(){let t=[],e=i=>{let o=i?.trim();o&&t.push(o);};e(process.env.RAPIDKIT_BRIDGE_PYTHON),e(process.env.RAPIDKIT_PYTHON_CMD),e(process.env.POETRY_PYTHON);let r=_();(r.startsWith("/")||r.startsWith(".")||r.startsWith(".."))&&!r.startsWith("file:")&&e(l(u.join(u.resolve(r),".venv")));for(let i of j$1())i.args.length===1&&i.args[0]==="--version"&&e(i.command);for(let i$1 of i())e(i$1);return [...new Set(t)]}function v(t,e){return t==="py"?["-3",...e]:e}function J(t){if(!t)return t;let e=["Installed Poetry version does not support '--no-update'. Falling back to 'poetry lock'."];return t.split(/\r?\n/).filter(i=>!e.some(o=>i.includes(o))).join(`
2
+ `)}var w=class extends Error{code;constructor(e,r){super(r),this.code=e;}};function S(t){if(t instanceof w)switch(t.code){case "PYTHON_NOT_FOUND":return `RapidKit (npm) could not find Python (python3/python/py) on your PATH.
3
+ Install Python 3.10+ and ensure \`${h()}\` is available, then retry.
4
+ Tip: if you are inside a RapidKit project, use the local ./rapidkit launcher.`;case "BRIDGE_VENV_CREATE_FAILED":return `RapidKit (npm) failed to create its bridge virtual environment.
5
+ `+(b()?`Ensure Python is installed with venv support.
6
+ `:`Ensure Python venv support is installed (e.g., python3-venv).
7
+ `)+`Details: ${t.message}`;case "BRIDGE_PIP_BOOTSTRAP_FAILED":return `RapidKit (npm) could not bootstrap pip inside the bridge virtual environment.
8
+ `+(b()?`Ensure pip is available for your Python installation and retry.
9
+ `:`Install python3-venv/python3-pip and retry.
10
+ `)+`Details: ${t.message}`;case "BRIDGE_PIP_UPGRADE_FAILED":return `RapidKit (npm) could not upgrade pip in the bridge virtual environment.
11
+ Check your network/proxy or disable RAPIDKIT_BRIDGE_UPGRADE_PIP.
12
+ Details: ${t.message}`;case "BRIDGE_PIP_INSTALL_FAILED":return `RapidKit (npm) could not install rapidkit-core in the bridge virtual environment.
13
+ Check your network/proxy, or install manually with: pipx install rapidkit-core.
14
+ Details: ${t.message}`;default:return `RapidKit (npm) bridge error: ${t.message}`}return `RapidKit (npm) failed to run the Python core engine: ${t instanceof Error?t.message:String(t)}`}function _(){let t=process.env.RAPIDKIT_CORE_PYTHON_PACKAGE;return t&&t.trim()?t.trim():"rapidkit-core"}function ht(){let t=_(),e=process.env.RAPIDKIT_CORE_PYTHON_PACKAGE_ID,r=e&&e.trim()?`${t}|${e.trim()}`:t;return ft.createHash("sha256").update(r).digest("hex").slice(0,12)}function j(){let t=process.env.XDG_CACHE_HOME;return t&&t.trim()?t:u.join(q$1.homedir(),".cache")}function gt(){return u.join(j(),"rapidkit","npm-bridge","venv")}function Q(){let t=ht();return u.join(j(),"rapidkit","npm-bridge",`venv-${t}`)}function H(t){return l(t)}function U(t){return m(t)}async function tt(t=process.platform,e=process.env){let r=b(t)?["rapidkit.exe","rapidkit.cmd"]:["rapidkit"],n=q(e,t).flatMap(i=>r.map(o=>u.join(i,o)));for(let i of [...new Set(n)])try{if(!await p.pathExists(i))continue;let o=await execa(i,["--version","--json"],{reject:false,stdio:"pipe",timeout:4e3});if(o.exitCode===0&&await D(o.stdout))return {cmd:i,baseArgs:[]}}catch{}return null}function et(t){return /[<>=!~]=|@|\.whl$|\.tar\.gz$|\.zip$|git\+|https?:\/\//.test(t)}function yt(t){return u.dirname(u.dirname(t))}function nt(){return u.join(j(),"rapidkit","npm-bridge","core-commands.json")}async function rt(t){let e=!!process.env.RAPIDKIT_DEBUG,r=n=>{e&&process.stderr.write(`[DEBUG] tryRapidkit(${t}): ${n}
15
+ `);};try{r("probing interpreter-specific rapidkit script");let i=((await execa(t,v(t,["-c","import sysconfig, os; print(os.path.join(sysconfig.get_path('scripts'), 'rapidkit'))"]),{reject:false,stdio:"pipe",timeout:2e3})).stdout??"").toString().trim();if(r(`script path: ${i}`),i)try{if(await p.pathExists(i)){r(`found script at ${i}; invoking --version --json`);let o=await execa(i,["--version","--json"],{reject:false,stdio:"pipe",timeout:4e3});if(r(`script exitCode=${o.exitCode}`),o.exitCode===0){let a=(o.stdout??"").toString().trim();try{let s=JSON.parse(a),c=!!s&&typeof s=="object"&&s!==null&&"version"in s;if(r(`script JSON parse ok=${c}`),c)return true}catch{r("script output not valid JSON");}}}}catch(o){r(`interpreter-specific script probe failed: ${String(o)}`);}}catch(n){r(`interpreter-specific script probe error: ${String(n)}`);}try{r('probing importlib.find_spec("rapidkit")');let n=await execa(t,v(t,["-c","import importlib.util; print(1 if importlib.util.find_spec('rapidkit') else 0)"]),{reject:false,stdio:"pipe",timeout:2e3});if(r(`import probe exitCode=${n.exitCode} stdout=${(n.stdout??"").toString().trim()}`),n.exitCode===0&&(n.stdout??"").toString().trim()==="1")return true}catch(n){r(`import probe error: ${String(n)}`);}try{r("probing python -m rapidkit");let n=await execa(t,v(t,["-m","rapidkit","--version","--json"]),{reject:false,stdio:"pipe",timeout:8e3});if(r(`-m probe exitCode=${n.exitCode}`),n.exitCode===0)return true}catch(n){r(`-m probe error: ${String(n)}`);}try{r("probing PATH for rapidkit executables");let n=(process.env.PATH??"").split(u.delimiter).filter(Boolean);for(let i of n){let o=u.join(i,b()?"rapidkit.exe":"rapidkit");try{if(await p.pathExists(o)){r(`found candidate on PATH: ${o}; invoking --version --json`);let a=await execa(o,["--version","--json"],{reject:false,stdio:"pipe",timeout:4e3});if(r(`candidate exitCode=${a.exitCode}`),a.exitCode===0){let s=(a.stdout??"").toString().trim();try{let c=JSON.parse(s);if(c&&typeof c=="object"&&c!==null&&"version"in c)return true}catch{r("candidate output not valid JSON, skipping");}}}}catch(a){r(`error probing candidate ${o}: ${String(a)}`);}}return r("no valid rapidkit found on PATH"),false}catch(n){return r(`PATH probe error: ${String(n)}`),false}}async function D(t){let e=(t??"").toString().trim();if(!e)return false;try{let r=JSON.parse(e);return !!r&&typeof r=="object"&&r!==null&&"version"in r}catch{return false}}async function it(t,e=process.platform){let r=async o=>{try{let a=u.join(o,".rapidkit-workspace");if(!await p.pathExists(a))return null;let c=(await p.readJson(a))?.metadata?.python?.venvPath;return typeof c!="string"||!c.trim()?null:u.isAbsolute(c)?c:u.join(o,c)}catch{return null}},n=async(o,a)=>{let s=m(a,e);if(await p.pathExists(s)){let l=await execa(s,["--version","--json"],{reject:false,stdio:"pipe",timeout:1500,cwd:o});if(l.exitCode===0&&await D(l.stdout))return {cmd:s,baseArgs:[],workspaceDir:o}}let c=l(a,e);if(await p.pathExists(c)){let l=await execa(c,["-m","rapidkit","--version","--json"],{reject:false,stdio:"pipe",timeout:1500,cwd:o});if(l.exitCode===0&&await D(l.stdout))return {cmd:c,baseArgs:["-m","rapidkit"],workspaceDir:o}}return null},i=t;for(let o=0;o<25;o+=1){let a=await r(i),s=[u.join(i,".venv"),a].filter(l=>!!l);for(let l of [...new Set(s)]){let P=await n(i,l);if(P)return P}let c=u.dirname(i);if(c===i)break;i=c;}return null}async function wt(t){try{let e=u.join(t,".python-version");if(await p.pathExists(e)){let n=(await p.readFile(e,"utf-8")).trim();if(n)return n}}catch{}try{let e=u.join(t,".rapidkit-workspace");if(await p.pathExists(e)){let r=await p.readJson(e);if(typeof r?.pythonVersion=="string"&&r.pythonVersion.trim())return r.pythonVersion.trim();let n=r?.metadata?.python?.pythonVersion;if(typeof n=="string"&&n.trim())return n.trim()}}catch{}return null}async function F(t){if(t&&t.trim())try{let a=await it(t);if(a){let s=a.workspaceDir??(u.dirname(a.cmd).includes(".venv")?u.dirname(u.dirname(u.dirname(a.cmd))):u.dirname(a.cmd)),c=await wt(s);return c&&(process.env.PYENV_VERSION=c),a}}catch{}let e=await xt();if(e.kind==="venv"){let a=yt(e.pythonPath),s=U(a);return await p.pathExists(s)?{cmd:s,baseArgs:[]}:{cmd:e.pythonPath,baseArgs:["-m","rapidkit"]}}try{if((await execa(e.cmd,["-m","rapidkit","--version","--json"],{reject:false,stdio:"pipe",timeout:4e3})).exitCode===0)return {cmd:e.cmd,baseArgs:["-m","rapidkit"]}}catch{}try{let s=((await execa(e.cmd,["-c","import sysconfig, os; print(os.path.join(sysconfig.get_path('scripts'), 'rapidkit'))"],{reject:false,stdio:"pipe",timeout:2e3})).stdout??"").toString().trim();if(s&&await p.pathExists(s))try{let c=await execa(s,["--version","--json"],{reject:false,stdio:"pipe",timeout:4e3});if(c.exitCode===0&&await D(c.stdout))return {cmd:s,baseArgs:[]}}catch{}}catch{}let r=await tt();if(r)return r;let n=Q(),i=await N(e.cmd),o=U(n);return await p.pathExists(o)?{cmd:o,baseArgs:[]}:{cmd:i,baseArgs:["-m","rapidkit"]}}async function ot(){for(let t of O())try{return await execa(t,v(t,["--version"]),{reject:false,stdio:"pipe",timeout:2e3}),t}catch{}return null}async function B(){let t=null;for(let e of O()){try{await execa(e,v(e,["--version"]),{reject:false,stdio:"pipe",timeout:2e3});}catch(r){t=r;continue}try{return await N(e)}catch(r){t=r;continue}}throw t instanceof w?t:t instanceof Error?new w("BRIDGE_VENV_BOOTSTRAP_FAILED",t.message):new w("PYTHON_NOT_FOUND","No Python interpreter found (python3/python/py).")}async function vt(){let t=!!process.env.RAPIDKIT_DEBUG,e=n=>{t&&process.stderr.write(`[DEBUG] checkRapidkitCore: ${n}
16
+ `);},r=Array.from(new Set([...i(),...j$1(14,10).map(n=>n.command)]));for(let n of r)try{e(`Method 1: trying ${n} import`);let i=await execa(n,v(n,["-c","import rapidkit_core; print(1)"]),{reject:false,stdio:"pipe",timeout:g});if(i.exitCode===0&&i.stdout?.trim()==="1")return e(`\u2713 Found via ${n} import`),true}catch{continue}for(let n of r)try{e(`Method 2: trying ${n} -m pip show`);let i=await execa(n,v(n,["-m","pip","show","rapidkit-core"]),{reject:false,stdio:"pipe",timeout:g});if(i.exitCode===0&&i.stdout?.includes("Name: rapidkit-core"))return e(`\u2713 Found via ${n} -m pip show`),true}catch{continue}for(let n of ["pip","pip3"])try{e(`Method 3: trying ${n} show`);let i=await execa(n,["show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g});if(i.exitCode===0&&i.stdout?.includes("Name: rapidkit-core"))return e(`\u2713 Found via ${n} show`),true}catch{continue}try{e("Method 4: checking pyenv versions");let n=await execa("pyenv",["versions","--bare"],{reject:false,stdio:"pipe",timeout:g});if(n.exitCode===0&&n.stdout){let i=n.stdout.split(`
17
+ `).filter(o=>o.trim());e(`Found pyenv versions: ${i.join(", ")}`);for(let o of i){let a=process.env.PYENV_ROOT||u.join(q$1.homedir(),".pyenv"),s=u.join(a,"versions",o.trim(),"bin","pip");try{let c=await execa(s,["show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g});if(c.exitCode===0&&c.stdout?.includes("Name: rapidkit-core"))return e(`\u2713 Found in pyenv ${o}`),true}catch{try{let c=await execa("pyenv",["exec","pip","show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g,env:{...process.env,PYENV_VERSION:o.trim()}});if(c.exitCode===0&&c.stdout?.includes("Name: rapidkit-core"))return e(`\u2713 Found in pyenv ${o} via PYENV_VERSION`),true}catch{continue}}}}}catch{e("pyenv not available");}for(let n of r)try{e(`Method 5: checking ${n} user site`);let i=await execa(n,v(n,["-m","site","--user-site"]),{reject:false,stdio:"pipe",timeout:g});if(i.exitCode===0&&i.stdout){let o=i.stdout.trim(),a=u.join(o,"rapidkit_core");if(await p.pathExists(a))return e("\u2713 Found in user site-packages"),true}}catch{continue}try{e("Method 6: checking pipx");let n=await execa("pipx",["list"],{reject:false,stdio:"pipe",timeout:g});if(n.exitCode===0&&n.stdout?.includes("rapidkit-core"))return e("\u2713 Found via pipx"),true}catch{e("pipx not available");}for(let n of r)try{e(`Method 6: checking ${n} -m pipx list`);let i=await execa(n,v(n,["-m","pipx","list"]),{reject:false,stdio:"pipe",timeout:g});if(i.exitCode===0&&i.stdout?.includes("rapidkit-core"))return e(`\u2713 Found via ${n} -m pipx list`),true}catch{continue}try{if(e("Method 7: checking poetry"),(await execa("poetry",["show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g})).exitCode===0)return e("\u2713 Found via poetry"),true}catch{e("poetry check failed");}for(let n of r)try{if(e(`Method 7: checking ${n} -m poetry show rapidkit-core`),(await execa(n,v(n,["-m","poetry","show","rapidkit-core"]),{reject:false,stdio:"pipe",timeout:g})).exitCode===0)return e(`\u2713 Found via ${n} -m poetry`),true}catch{continue}try{e("Method 8: checking conda");let n=await execa("conda",["list","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g});if(n.exitCode===0&&n.stdout?.includes("rapidkit-core"))return e("\u2713 Found via conda"),true}catch{e("conda not available");}return e("\u2717 Not found in any environment"),false}function Pt(t){let e=t.trim();if(!e||!e.startsWith("rapidkit-core"))return null;let r=e.slice(13).trim();return !r||/[\/@]|\.whl$|\.tar\.gz$|\.zip$|git\+|https?:\/\//.test(r)?null:r}function Y(t){let e=t.trim();if(!e)return null;let r=e.split("."),n=[];for(let i of r){let o=i.match(/^(\d+)/);if(!o){n.push(0);continue}n.push(Number.parseInt(o[1],10));}return n}function W(t,e){let r=Math.max(t.length,e.length);for(let n=0;n<r;n+=1){let i=n<t.length?t[n]:0,o=n<e.length?e[n]:0;if(i>o)return 1;if(i<o)return -1}return 0}function Ct(t){return t.length<=1?[t[0]+1]:t.length===2?[t[0]+1,0]:[t[0],t[1]+1,0]}function Et(t){let e=t.split(",").map(n=>n.trim()).filter(Boolean);if(e.length===0)return null;let r=[];for(let n of e){let i=n.match(/^(==|>=|<=|>|<|~=)\s*([0-9][0-9A-Za-z+._-]*)$/);if(!i)return null;r.push({op:i[1],version:i[2]});}return r}function st(t,e){let r=Y(t);if(!r)return false;let n=Et(e);if(!n)return false;for(let i of n){let o=Y(i.version);if(!o)return false;let a=W(r,o);if(i.op==="=="&&a!==0||i.op===">="&&a<0||i.op==="<="&&a>0||i.op===">"&&a<=0||i.op==="<"&&a>=0)return false;if(i.op==="~="){if(a<0)return false;let s=Ct(o);if(W(r,s)>=0)return false}}return true}async function _t(){let t=Array.from(new Set([...i(),...j$1(14,10).map(r=>r.command)])),e=r=>{let n=r.match(/^Version:\s*(.+)$/m);return n?n[1].trim():null};for(let r of t)try{let n=await execa(r,v(r,["-m","pip","show","rapidkit-core"]),{reject:false,stdio:"pipe",timeout:g});if(n.exitCode===0){let i=e(n.stdout||"");if(i)return i}}catch{continue}for(let r of ["pip","pip3"])try{let n=await execa(r,["show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g});if(n.exitCode===0){let i=e(n.stdout||"");if(i)return i}}catch{continue}try{let r=await execa("pipx",["list"],{reject:false,stdio:"pipe",timeout:g});if(r.exitCode===0&&r.stdout){let n=r.stdout.match(/rapidkit-core\s+([0-9][0-9A-Za-z+._-]*)/i);if(n?.[1])return n[1]}}catch{}return null}async function kt(){let t=_(),e=Pt(t);if(!e)return {isCompatible:false,installedVersion:null,expectedConstraint:null,reason:et(t)?"constraint-unsupported":"constraint-missing"};let r=await _t();if(!r)return {isCompatible:false,installedVersion:null,expectedConstraint:e,reason:"version-not-detected"};let n=st(r,e);return {isCompatible:n,installedVersion:r,expectedConstraint:e,reason:n?"compatible":"incompatible-version"}}async function N(t){let e=Q(),r=gt(),n=_(),i=[e];!et(n)&&!await p.pathExists(e)&&await p.pathExists(r)&&i.push(r);for(let m of i){let h=H(m);if(await p.pathExists(h))try{let f=await execa(h,["-c","import importlib.util; print(1 if importlib.util.find_spec('rapidkit') else 0)"],{reject:false,stdio:"pipe",timeout:2e3});if(f.exitCode===0&&(f.stdout??"").toString().trim()==="1")return h;await p.remove(m);}catch{await p.remove(m);}}let o=e,a={...process.env,PIP_DISABLE_PIP_VERSION_CHECK:"1",PIP_NO_PYTHON_VERSION_WARNING:"1"},s=Math.max(0,Number(process.env.RAPIDKIT_BRIDGE_PIP_RETRY??"2")),c=Math.max(200,Number(process.env.RAPIDKIT_BRIDGE_PIP_RETRY_DELAY_MS??"800")),l=Math.max(1e4,Number(process.env.RAPIDKIT_BRIDGE_PIP_TIMEOUT_MS??"120000")),P=m=>new Promise(h=>setTimeout(h,m)),C=async(m,h,f)=>{let y=await execa(m,h,{reject:false,stdio:["ignore","pipe","inherit"],env:a,timeout:f});if(y.exitCode===0)return;let T=(y.stdout??"").toString(),$=(y.stderr??"").toString(),R=[T,$].filter(Boolean).join(`
18
+ `),pt=R?`${m} ${h.join(" ")}
19
+ ${R}`:`${m} ${h.join(" ")}`;throw new Error(pt)},x=async(m,h,f)=>{let y=0;for(;;)try{await C(m,h,f);return}catch(T){if(y>=s)throw T;let $=Math.floor(Math.random()*200),R=c*Math.pow(2,y)+$;y+=1,await P(R);}};try{await p.ensureDir(u.dirname(o));try{await C(t,v(t,["-m","venv",o]),6e4);}catch(f){let y=f instanceof Error?f.message:String(f);throw new w("BRIDGE_VENV_CREATE_FAILED",y)}let m=H(o);if((await execa(m,["-m","pip","--version"],{reject:false,stdio:"pipe",timeout:2e3})).exitCode!==0&&(await execa(m,["-m","ensurepip","--default-pip"],{reject:false,stdio:["ignore","pipe","inherit"],env:a,timeout:6e4})).exitCode!==0)throw new w("BRIDGE_PIP_BOOTSTRAP_FAILED","ensurepip failed; install python3-venv/python3-pip and retry.");if(process.env.RAPIDKIT_BRIDGE_UPGRADE_PIP==="1")try{await x(m,["-m","pip","install","-U","pip"],l);}catch(f){let y=f instanceof Error?f.message:String(f);throw new w("BRIDGE_PIP_UPGRADE_FAILED",y)}try{await x(m,["-m","pip","install","-U",_()],l);}catch(f){let y=f instanceof Error?f.message:String(f);throw new w("BRIDGE_PIP_INSTALL_FAILED",y)}return m}catch(m){if(m instanceof w)throw m;let h=m instanceof Error?m.message:String(m);throw new w("BRIDGE_VENV_BOOTSTRAP_FAILED",h)}}async function xt(){if(process.env.RAPIDKIT_BRIDGE_FORCE_VENV==="1")return {kind:"venv",pythonPath:await B()};for(let r of O())if(await rt(r))return {kind:"system",cmd:r};let t=await ot();if(!t)throw new w("PYTHON_NOT_FOUND","No Python interpreter found (python3/python/py).");let e;try{e=await N(t);}catch{e=await B();}return {kind:"venv",pythonPath:e}}async function Bt(t,e){try{let r=await F(e?.cwd),n=r.cmd,i=[...r.baseArgs,...t];if(t[0]==="init"){let s=await execa(n,i,{cwd:e?.cwd,env:{...process.env,...e?.env},reject:false,stdio:"pipe"}),c=J((s.stdout??"").toString()),l=J((s.stderr??"").toString());return c&&process.stdout.write(c.endsWith(`
20
+ `)?c:`${c}
21
+ `),l&&process.stderr.write(l.endsWith(`
22
+ `)?l:`${l}
23
+ `),typeof s.exitCode=="number"?s.exitCode:1}let a=await execa(n,i,{cwd:e?.cwd,env:{...process.env,...e?.env},reject:false,stdio:"inherit"});return typeof a.exitCode=="number"?a.exitCode:1}catch(r){return process.stderr.write(`${S(r)}
24
+ `),1}}var Rt=[{pattern:/RapidKitError:\s*Directory '([^']+)' exists and force is not set/,message:t=>`\u274C Directory "${u.basename(t[1])}" already exists.
25
+ \u{1F4A1} Choose a different name, or remove the existing directory first:
26
+ rm -rf ${t[1]}`},{pattern:/RapidKitError:\s*Project name '([^']+)' is (invalid|not allowed)/i,message:t=>`\u274C Invalid project name: "${t[1]}"
27
+ \u{1F4A1} Use lowercase letters, numbers, and hyphens only (e.g. my-api).`},{pattern:/RapidKitError:\s*Kit '([^']+)' not found/i,message:t=>`\u274C Unknown kit: "${t[1]}"
28
+ \u{1F4A1} Run "npx rapidkit list" to see available kits.`},{pattern:/RapidKitError:\s*(.+)/,message:t=>`\u274C ${t[1].trim()}`}];async function Ft(t,e){let{spawn:r}=await import('child_process');try{let n=await F(e?.cwd),i=n.cmd,o=[...n.baseArgs,...t];return await new Promise(a=>{let s=r(i,o,{cwd:e?.cwd,env:{...process.env,...e?.env},stdio:["inherit","inherit","pipe"]}),c=[];s.stderr?.on("data",l=>{c.push(l);}),s.on("close",l=>{let P=l??1;if(P!==0&&c.length>0){let C=Buffer.concat(c).toString("utf8");for(let{pattern:x,message:m}of Rt){let h=C.match(x);if(h){process.stderr.write(m(h)+`
29
+ `),a(P);return}}process.stderr.write(C);}a(P);}),s.on("error",l=>{process.stderr.write(`${S(l)}
30
+ `),a(1);});})}catch(n){return process.stderr.write(`${S(n)}
31
+ `),1}}async function k(t,e){try{let r=await F(e?.cwd),n=r.cmd,i=[...r.baseArgs,...t],o=await execa(n,i,{cwd:e?.cwd,env:{...process.env,...e?.env},reject:false,stdio:"pipe"});return {exitCode:typeof o.exitCode=="number"?o.exitCode:1,stdout:(o.stdout??"").toString(),stderr:(o.stderr??"").toString()}}catch(r){return {exitCode:1,stdout:"",stderr:`${S(r)}
32
+ `}}}function at(t){let e=new Set,r=t.split(`
33
+ `),n=false;for(let i of r){let o=i.replace(/\r$/,"");if(!n){/^\s*Commands:\s*$/i.test(o)&&(n=true);let c=o.match(/^\s*rapidkit\s+([a-z0-9_-]+)\b/i);if(c){let l=c[1].trim();l&&!l.startsWith("-")&&e.add(l);}continue}if(!o.trim())break;if(/^\s*(Options|Arguments|Usage|Commands)\s*:/i.test(o))continue;let a=o.match(/^\s*([a-z0-9][a-z0-9_-]*)\b/i);if(!a)continue;let s=a[1].trim();s&&!s.startsWith("-")&&e.add(s);}return e}async function ct(){let t=nt();if(!await p.pathExists(t))return null;try{let e=await p.readJson(t);if(e&&e.schema_version===1&&Array.isArray(e.commands))return e}catch{}return null}async function z(t){let e=nt();await p.ensureDir(u.dirname(e)),await p.writeJson(e,t,{spaces:2});}async function bt(){let t=await k(["version","--json"],{cwd:process.cwd()});if(t.exitCode===0)try{let r=JSON.parse(t.stdout)?.version;return typeof r=="string"?r:void 0}catch{return}}async function At(){let t=await k(["commands","--json"],{cwd:process.cwd()});if(t.exitCode!==0)return null;try{let e=JSON.parse(t.stdout);if(e?.schema_version!==1||!Array.isArray(e.commands))return null;let r=e.commands.filter(n=>typeof n=="string");return r.length?r:null}catch{return null}}async function Gt(){let e=Date.now(),r=await ct(),n=await bt(),i=!!r?.commands?.length;if(i&&e-r.fetched_at<864e5&&(!n||!r.rapidkit_version||r.rapidkit_version===n))return new Set(r.commands);let o=await At();if(o?.length){let l=Array.from(new Set(o)).sort();return await z({schema_version:1,fetched_at:e,rapidkit_version:n,commands:l}),new Set(l)}let a=await k(["--help"],{cwd:process.cwd()});if(a.exitCode!==0)return i&&r?.commands?new Set(r.commands):new Set(M);let s=at(a.stdout);if(s.size===0)return new Set(M);let c=Array.from(s).sort();return await z({schema_version:1,fetched_at:e,rapidkit_version:n,commands:c}),s}async function Lt(){let e=Date.now(),r=await ct();return !r||e-r.fetched_at>=864e5||!r.commands?.length?null:new Set(r.commands)}function dt(){return u.join(j(),"rapidkit","npm-bridge","modules-catalog.json")}async function It(){let t=dt();if(!await p.pathExists(t))return null;try{let e=await p.readJson(t);if(e&&e.schema_version===1&&Array.isArray(e.modules))return e}catch{}return null}async function Z(t){let e=dt();await p.ensureDir(u.dirname(e)),await p.writeJson(e,t,{spaces:2});}function X(t){try{return JSON.parse(t)}catch{return null}}async function Kt(t={}){let e=typeof t.ttlMs=="number"?t.ttlMs:18e5,r=Date.now(),n=await It();if(n?.fetched_at&&r-n.fetched_at<e)return n;let i=["modules","list","--json-schema","1"];t.category&&i.push("--category",t.category),t.tag&&i.push("--tag",t.tag),t.detailed&&i.push("--detailed");let o=await k(i,{cwd:t.cwd,env:t.env});if(o.exitCode===0){let s=X(o.stdout);if(s&&s.schema_version===1&&Array.isArray(s.modules)){let c={...s,fetched_at:r};return await Z(c),c}}let a=await k(["modules","list","--json"],{cwd:t.cwd,env:t.env});if(a.exitCode===0){let s=X(a.stdout);if(Array.isArray(s)){let c={schema_version:1,generated_at:new Date().toISOString(),filters:{category:t.category??null,tag:t.tag??null,detailed:!!t.detailed},stats:{total:s.length,returned:s.length,invalid:0},modules:s,source:"legacy-json",fetched_at:r};return await Z(c),c}}return n||null}var Jt={pythonCommandCandidates:O,pickSystemPython:ot,ensureBridgeVenv:N,ensureBridgeVenvFromCandidates:B,parseCoreCommandsFromHelp:at,tryRapidkit:rt,findUserLocalRapidkitRunner:tt,findWorkspaceRunner:it,checkRapidkitCoreAvailable:vt,checkRapidkitCoreVersionCompatible:kt,isVersionSatisfyingConstraint:st};export{M as a,vt as b,kt as c,xt as d,Bt as e,Ft as f,k as g,Gt as h,Lt as i,Kt as j,Jt as k};
@@ -0,0 +1 @@
1
+ var t=".rapidkit/skills",n=".rapidkit/reports/workspace-skills-index.json",s=".rapidkit/reports/workspace-explain-last-run.json",o=".rapidkit/reports/workspace-why-last-run.json",p=".rapidkit/reports/workspace-trace-last-run.json";function d(r){let i=r.trim();if(!i||i.includes("..")||i.includes("/"))throw new Error(`Invalid operational skill id: ${r}`);return `${t}/${i}.md`}var l={"rapidkit-diagnose-api-failure":"rapidkit-diagnose","rapidkit-release-readiness":"rapidkit-release-readiness","rapidkit-safe-schema-migration":"rapidkit-safe-schema-migration","rapidkit-dependency-upgrade":"rapidkit-dependency-upgrade","rapidkit-rename-contract":"rapidkit-rename-contract"};export{t as a,n as b,s as c,o as d,p as e,d as f,l as g};
@@ -0,0 +1 @@
1
+ import {a,b as b$1}from'./chunk-PYCJWW4B.js';import {b,c,d}from'./chunk-KIUSCFHF.js';import {m,f,c as c$1,n,e}from'./chunk-DWXRVGOY.js';import {c as c$2}from'./chunk-64RTZBHU.js';import {j,b as b$2}from'./chunk-EN6YCX36.js';import {a as a$1}from'./chunk-3PTJID76.js';import p from'path';import y from'fs-extra';var K="rapidkit-blocker-resolution-v1";function J(e){let t=e.blockers.map(r=>r.trim()).filter(Boolean).slice(0,12),s=e.stderrTail?.trim().slice(-400)??"";return b$2({blockers:t,exitCode:e.exitCode??null,stderrTail:s})}function te(e){let t=e.trim().toLowerCase();return t?t.includes("missing evidence")||t.includes(": missing")||t.includes("artifact missing")||t.includes("not found on disk")?"artifact-missing":t.includes("policy.")||t.includes("contract")?"config-fixable":t.includes("impact")||t.includes("untracked")||t.includes("grounding")?"semantic-attention":t.includes("failed")||t.includes("blocked")||t.includes(": fail")?"command-failed-repeat":"config-fixable":"unresolvable-without-human"}function se(e){let t=te(e.reason),s=J({blockers:[e.reason]}),r=t==="artifact-missing"?[{actionKind:"run-once",detail:e.sourceCommand?`Run the source command once: ${e.sourceCommand}`:"Run the mapped workspace intelligence command once to generate the missing artifact.",studioActionId:"run-analyze"}]:t==="semantic-attention"?[{actionKind:"commit-files",detail:"Review workspace-level grounding files (AGENTS.md, agent-sync outputs) and commit or refresh the impact baseline."},{actionKind:"refresh-baseline",detail:"Refresh snapshot + diff + impact before re-running verify."}]:[{actionKind:"edit-file",detail:"Apply the smallest safe file or policy fix for this blocker before re-running verification.",studioActionId:"fix-lens"}];return {schemaVersion:K,blockerId:e.blockerId,sourceCommand:e.sourceCommand,sourceArtifact:e.sourceArtifact,resolutionClass:t,blockerSignature:s,commandRetryHint:t==="artifact-missing"?"Run the source command once, then verify.":"Do not re-run the same failing command; fix the source issue first, then verify.",fixHints:r,verifyCommand:e.verifyCommand,verifyArtifact:e.verifyArtifact}}function U(e){return Array.from(new Set(e.blockingReasons.map(s=>s.trim()).filter(Boolean))).slice(0,12).map((s,r)=>se({reason:s,blockerId:`blocker-${r+1}`,sourceCommand:e.sourceCommand,sourceArtifact:e.sourceArtifact,verifyCommand:e.verifyCommand,verifyArtifact:e.verifyArtifact}))}function re(e){let t=e.toLowerCase();return t.includes("stale")||t.includes("missing evidence")||t.includes("no projects")||t.includes("projects.empty")||t.includes("projects discovered")||t.includes("projects.missing")||t.includes("not yet run")||t.includes("doctor-last-run")||t.includes("pipeline-last-run")||t.includes("release-readiness")||t.includes("analyze-last-run")||t.includes("analyze reported")||t.includes("analyze verdict")||t.includes("analyze needs attention")||t.includes("toolchain.lock")||t.includes("not pinned")||t.includes("readiness:")||t.includes("env:")||t.includes("workspace-run-last")||t.includes("pre-project")||t.includes("before adding projects")||t.includes("workspace.projects.missing")||t.includes("no backend projects")||t.includes("index.json")||t.includes("workspace-intelligence-history")||t.includes("validation warning")||t.includes("workspace model validation")||t.includes("workspace.marker")||t.includes("no project roots")||t.includes("no infrastructure services")||t.includes("infra/overrides")||t.includes("infra dependencies")||t.includes("contract verify")||t.includes("contract inspect")||t.includes("publish verify evidence")}function ne(e){return e.length===0||e.every(t=>re(t))}function G(e){return e.projectCount>0||e.policyErrorCount>0?{verdict:e.verdict,exitCode:e.exitCode}:e.verdict==="blocked"&&ne(e.blockingReasons)?{verdict:"needs-attention",exitCode:1}:{verdict:e.verdict,exitCode:e.exitCode}}function $e(e,t){let s=t&&t!=="ready"?` (${t.replace(/-/g," ")})`:"";return e===0?`Workspace scaffold ready${s} \u2014 add your first project to continue.`:`Workspace scaffold${s}: ${e} pre-project signal(s) \u2014 add your first project to continue.`}var X="workspace-verify.v1",I=".rapidkit/reports/workspace-verify-last-run.json";function ie(e,t){return p.isAbsolute(t)?t:p.join(e,t)}async function Y(e$1){let t=await y.readJson(e$1);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace impact input is not a JSON object: ${e$1}`);let s=t;if(s.schemaVersion!==e)throw new Error(`Unsupported workspace impact schema: ${String(s.schemaVersion)}`);return s}function oe(e){let t=new Set,s=[];for(let r of e){let n=`${r.scope}:${r.project??""}:${r.display}`;t.has(n)||(t.add(n),s.push(r));}return s}function ae(e,t){if(!e||e==="workspace")return true;let s=(e.startsWith("project:")?e.slice(8):e).trim().toLowerCase();return t.scope==="workspace"?true:(t.project??"").trim().toLowerCase()===s}function ce(e,t){if(e.id==="workspace.doctor")return p.join(t,".rapidkit","reports","doctor-last-run.json");if(e.id==="workspace.contract.verify")return p.join(t,".rapidkit","reports","workspace-contract-verify-last-run.json");if(e.id==="workspace.readiness")return p.join(t,".rapidkit","reports","release-readiness-last-run.json");if(e.id==="workspace.analyze")return p.join(t,".rapidkit","reports","analyze-last-run.json");if(e.id==="workspace.pipeline")return p.join(t,".rapidkit","reports","pipeline-last-run.json");if(e.id==="workspace.doctor-fix")return p.join(t,".rapidkit","reports","doctor-last-run.json");if(e.id.startsWith("project.")&&e.id.includes("."))return p.join(t,".rapidkit","reports","workspace-run-last.json")}function w(e){return !e||typeof e!="object"||Array.isArray(e)?null:e}function le(e){let t=w(e.healthScore),s=typeof t?.errors=="number"?t.errors:0,r=typeof t?.percent=="number"?t.percent:void 0;return s>0?{status:"fail",message:`Doctor evidence reports ${s} error(s).`}:typeof r=="number"&&r<70?{status:"warn",message:`Doctor health score is ${r}%.`}:{status:"pass",message:"Doctor evidence is present and healthy."}}function de(e){let t=typeof e.overallStatus=="string"?e.overallStatus:"unknown";return t==="fail"?{status:"fail",message:"Release readiness evidence reports blocking failures."}:t==="warn"?{status:"warn",message:"Release readiness evidence reports warnings."}:t==="pass"?{status:"pass",message:"Release readiness evidence passed."}:{status:"warn",message:`Release readiness evidence status is ${t}.`}}function ue(e){let t=typeof e.status=="string"?e.status:"unknown";return t==="failed"||t==="fail"?{status:"fail",message:"Workspace contract verify evidence failed."}:t==="passed"||t==="pass"?{status:"pass",message:"Workspace contract verify evidence passed."}:{status:"warn",message:`Workspace contract verify evidence status is ${t}.`}}function pe(e){let t=w(e.summary);if(t?.blocking===true||e.blocking===true)return {status:"fail",message:"Analyze evidence reports blocking findings."};let r=typeof t?.status=="string"?t.status:void 0;return r==="warn"||r==="warning"?{status:"warn",message:"Analyze evidence reports warnings."}:{status:"pass",message:"Analyze evidence is present."}}function fe(e){let t=e.fixResult;if(!t||typeof t!="object"||Array.isArray(t))return {status:"skipped",message:"Doctor fix result not present; run doctor workspace --fix --json to record fixes."};let s=t,r=Array.isArray(s.remainingBlockers)?s.remainingBlockers:[];if(r.length>0)return {status:"fail",message:`Doctor fix result reports ${r.length} remaining blocker(s).`};let n=Array.isArray(s.appliedFixes)?s.appliedFixes:[];return n.length===0?{status:"pass",message:"Doctor fix result recorded with no remaining blockers."}:{status:"pass",message:`Doctor fix result recorded ${n.length} applied fix(es) with no remaining blockers.`}}function ge(e){return e.id.endsWith(".init")?"init":e.id.endsWith(".test")?"test":e.id.endsWith(".build")?"build":e.id.endsWith(".start")?"start":null}function me(e){let t=w(e.summary),s=typeof t?.verdict=="string"?t.verdict:void 0;return s==="blocked"?{status:"fail",message:"Pipeline evidence is blocked."}:s==="needs-attention"?{status:"warn",message:"Pipeline evidence needs attention."}:s==="ready"?{status:"pass",message:"Pipeline evidence is ready."}:{status:"warn",message:"Pipeline evidence status is unknown."}}function ke(e,t,s){let r=ge(t),n=c$2(e,r??void 0);if(!n)return {status:"missing",message:"Workspace run evidence is missing or unreadable."};let i=n.stage;if(r&&i!==r)return {status:"missing",message:`Workspace run evidence is for stage "${i}", expected "${r}".`};let d=Array.isArray(n.projects)?n.projects:[],l=t.project?.toLowerCase();if(!l)return {status:"missing",message:"Project-scoped workspace run evidence is missing a project identifier."};let a=d.find(g=>{let m=w(g);if(!m)return false;let c=typeof m.projectName=="string"?m.projectName.toLowerCase():"",o=["projectPath","relativePath","path"].map(u=>m[u]).filter(u=>typeof u=="string"&&u.trim().length>0).map(u=>u.replace(/\\/g,"/").toLowerCase());return c===l||o.some(u=>u.endsWith(`/${l}`)||u===l)});if(a){let g=v(n.generatedAt,s,`Workspace run evidence for ${t.project??t.id}`);if(g)return {status:"fail",message:g};let m=w(a),c=typeof m?.status=="string"?m.status:"unknown";return c==="failed"?{status:"fail",message:`Workspace run evidence failed for ${t.project}.`}:c==="passed"?{status:"pass",message:`Workspace run evidence passed for ${t.project}.`}:c==="skipped"?{status:"warn",message:`Workspace run evidence skipped for ${t.project}.`}:{status:"warn",message:`Workspace run evidence status is ${c} for ${t.project}.`}}return {status:"missing",message:`Workspace run evidence does not include project ${t.project}.`}}function v(e,t,s){if(!t)return null;if(typeof e!="string"||e.trim().length===0)return `${s} is stale: missing generatedAt timestamp (required after impact ${t}).`;let r=Date.parse(e),n=Date.parse(t);return Number.isFinite(r)?Number.isFinite(n)&&r<n?`${s} is stale: generated at ${e}, before impact ${t}.`:null:`${s} is stale: invalid generatedAt timestamp (required after impact ${t}).`}async function ye(e,t,s,r){let n=ce(e,t),i=n?p.relative(t,n).split(p.sep).join("/"):void 0;if(e.id==="workspace.contract.verify"&&!s)return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"skipped",required:e.required,message:"Workspace contract is not present; contract verify skipped."};if(!n||!await y.pathExists(n))return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"missing",required:e.required,evidencePath:i,message:i?`Missing evidence report: ${i}`:"No evidence mapping exists for this command."};let d=w(await y.readJson(n));if(!d)return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"fail",required:e.required,evidencePath:i,message:"Evidence report is not a JSON object."};let l;if(e.id==="workspace.doctor"){let a=v(d.generatedAt,r,"Doctor evidence");a?l={status:"fail",message:a}:l=le(d);}else if(e.id==="workspace.readiness"){let a=v(d.generatedAt,r,"Release readiness evidence");a?l={status:"fail",message:a}:l=de(d);}else if(e.id==="workspace.contract.verify"){let a=v(d.generatedAt,r,"Workspace contract verify evidence");a?l={status:"fail",message:a}:l=ue(d);}else if(e.id==="workspace.analyze"){let a=v(d.generatedAt,r,"Analyze evidence");a?l={status:"fail",message:a}:l=pe(d);}else if(e.id==="workspace.pipeline"){let a=v(d.generatedAt,r,"Pipeline evidence");a?l={status:"fail",message:a}:l=me(d);}else if(e.id==="workspace.doctor-fix")l=fe(d);else if(e.id.startsWith("project."))l=ke(d,e,r);else {let a=v(d.generatedAt,r,"Evidence report");a?l={status:"fail",message:a}:l={status:"pass",message:"Evidence report is present."};}return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:l.status,required:e.required,evidencePath:i,message:l.message}}function he(e,t={blockingReasons:[],needsAttention:false}){let s=e.filter(c=>c.status==="pass").length,r=e.filter(c=>c.status==="warn").length,n=e.filter(c=>c.status==="fail").length,i=e.filter(c=>c.status==="missing").length,d=e.filter(c=>c.status==="skipped").length,l=e.filter(c=>c.required&&(c.status==="fail"||c.status==="missing")).map(c=>`${c.id}: ${c.message}`),a=e.filter(c=>c.required&&c.status==="missing").length,g="ready",m=0;return l.length>0||t.blockingReasons.length>0?(g="blocked",m=2):(r>0||a>0||t.needsAttention)&&(g="needs-attention",m=1),{verdict:g,exitCode:m,stepsPassed:s,stepsWarn:r,stepsFailed:n,stepsMissing:i,stepsSkipped:d}}function ve(e,t){let s=W(e.affectedProjects.map(o=>o.project?.name).filter(o=>typeof o=="string")),r=new Set(s.map(o=>o.toLowerCase())),n=W(e.transitiveImpact.map(o=>o.project?.name).filter(o=>typeof o=="string").filter(o=>!r.has(o.toLowerCase()))),i=new Map;for(let o of t){if(o.scope!=="project"||!o.project)continue;let u=o.project.toLowerCase(),h=i.get(u)??[];h.push(o),i.set(u,h);}let d=[],l=[],a=[],g=[],m=false,c=(o,u)=>{let h=i.get(o.toLowerCase())??[];if(h.length===0){a.push(o);return}let R=h.filter(f=>f.status==="fail"),C=h.filter(f=>f.status==="missing"),b=C.filter(f=>f.required),j=h.some(f=>f.status==="pass"||f.status==="warn");if(R.length>0){l.push(o),g.push(`graph.subgraph.${o}: ${u} has failed verification evidence (${R.map(f=>f.id).join(", ")}).`);return}if(b.length>0){l.push(o),g.push(`graph.subgraph.${o}: ${u} has missing required verification evidence (${b.map(f=>f.id).join(", ")}).`);return}if(C.length>0){l.push(o),m=true;return}if(j){d.push(o);return}a.push(o);};for(let o of s)c(o,"directly-changed");for(let o of n)c(o,"transitive dependent");return {subgraph:{totalProjects:s.length+n.length,directlyChanged:s,transitiveDependents:n,covered:W(d),uncovered:W(l),unverifiable:W(a)},blockingReasons:g,needsAttention:m}}function W(e){return [...new Set(e)].sort((t,s)=>t.localeCompare(s))}async function be(e$1){let t=p.resolve(e$1.workspacePath);if(e$1.fromImpactPath){let i=ie(t,e$1.fromImpactPath);return {impact:await Y(i),fromImpactRef:p.relative(t,i).split(p.sep).join("/"),impactFromDisk:true}}let s=p.join(t,f);if(await y.pathExists(s))return {impact:await Y(s),fromImpactRef:f,impactFromDisk:true};let r=p.join(t,c$1);if(await y.pathExists(r))return {impact:await n({workspacePath:t,fromPath:c$1,scope:e$1.scope,includeAbsolutePaths:e$1.includeAbsolutePaths,includeEvidence:e$1.includeEvidence,observableScanDepth:e$1.observableScanDepth,now:e$1.now}),fromImpactRef:c$1,impactFromDisk:false};let n$1=await j({workspacePath:t,includeAbsolutePaths:e$1.includeAbsolutePaths,includeEvidence:e$1.includeEvidence,observableScanDepth:e$1.observableScanDepth,now:e$1.now});return {impact:{schemaVersion:e,generatedAt:(e$1.now??new Date).toISOString(),fromRef:"baseline",diffRef:".rapidkit/reports/workspace-model-diff-last-run.json",workspace:{name:n$1.workspace.name,profile:n$1.workspace.profile,type:n$1.workspace.type},summary:{changed:false,risk:"none",affectedProjects:0,workspaceItems:0,recommendedCommands:0,blastRadius:{directlyAffected:0,transitivelyAffected:0,maxDistance:0,graphEdges:n$1.graph?.edges.length??0}},affectedProjects:[],transitiveImpact:[],criticalPathHotspots:[],workspaceImpact:[],verificationPlan:[],agentBrief:{headline:"Baseline workspace verify run.",bullets:["No impact report or snapshot was available; baseline gates were evaluated."],unsafeAssumptions:["Do not claim runtime verification passed unless evidence exists."]},diff:{schemaVersion:"workspace-model-diff.v1",generatedAt:(e$1.now??new Date).toISOString(),fromRef:"baseline",toRef:".rapidkit/reports/workspace-model.json",fromHash:"baseline",toHash:"baseline",summary:{changed:false,addedProjects:0,removedProjects:0,changedProjects:0,workspaceChanges:0,validationChanges:0,gitChangedFiles:0},git:{available:false,dirty:false,changedFiles:0,untrackedFiles:0,deletedFiles:0},changes:[],currentModel:n$1}},impactFromDisk:false}}function we(e,t){if(t)return e.generatedAt;let s=e.diff?.generatedAt;if(typeof s=="string"&&s.trim().length>0)return s}async function Ke(e){let t=p.resolve(e.workspacePath),{impact:s,fromImpactRef:r,impactFromDisk:n}=await be(e),i=s.diff.currentModel,d$1=we(s,n),l=oe([...m(),...s.verificationPlan]).filter(k=>ae(e.scope,k)),a$1=[];for(let k of l)a$1.push(await ye(k,t,i.contracts.exists===true,d$1));let g=ve(s,a$1),m$1=a(i.graph??{nodes:[],edges:[]}),c$1=b(i),o=await je(t),u=c(c$1,o?.freshness?.projectHashes),h={verdict:u.verdict,baseline:u.baseline,changed:u.changed,added:u.added,removed:u.removed,projectHashes:d(c$1)},R=b$1(m$1),C=i.policies?.mode??"warn",b$2=await Re(i,t),j=Ce(C,b$2),f=he(a$1,{blockingReasons:[...g.blockingReasons,...R,...j.blockingReasons],needsAttention:g.needsAttention||j.needsAttention}),Q=a$1.filter(k=>k.status==="missing"&&k.evidencePath).map(k=>k.evidencePath),x=[...a$1.filter(k=>k.required&&(k.status==="fail"||k.status==="missing")).map(k=>`${k.id}: ${k.message}`),...g.blockingReasons,...R,...j.blockingReasons],Z=b$2.filter(k=>k.severity==="error").length,ee=i.summary?.projectCount??i.projects.length,$=G({projectCount:ee,verdict:f.verdict,exitCode:f.exitCode,blockingReasons:x,policyErrorCount:Z});f.verdict=$.verdict,f.exitCode=$.exitCode;let B=x.length>0?U({blockingReasons:x,verifyCommand:"npx rapidkit workspace verify --from-impact .rapidkit/reports/workspace-impact-last-run.json --json",verifyArtifact:I}):[];return {schemaVersion:X,generatedAt:(e.now??new Date).toISOString(),workspacePath:t,mode:"evidence",fromImpactRef:r,scope:e.scope,impact:{changed:s.summary.changed,risk:s.summary.risk,affectedProjects:s.summary.affectedProjects,recommendedCommands:s.summary.recommendedCommands},summary:f,steps:a$1,missingEvidence:Q,blockingReasons:x,...B.length>0?{resolutionHints:B}:{},verificationPlan:l,affectedSubgraph:g.subgraph,graphIntegrity:m$1,freshness:h,policyMode:C,policyViolations:b$2}}async function Re(e,t){let s=[];for(let n of e.validation?.issues??[])s.push({source:"model",severity:n.severity,code:n.code,message:n.message,target:n.target});let r=p.join(t,".rapidkit","reports","workspace-contract-verify-last-run.json");try{if(await y.pathExists(r)){let n=await y.readJson(r);if(Array.isArray(n.violations))for(let i of n.violations)typeof i=="string"&&i.trim().length>0&&s.push({source:"contract",severity:"error",code:"contract.violation",message:i});}}catch{}return s.sort((n,i)=>n.source!==i.source?n.source.localeCompare(i.source):n.code!==i.code?n.code.localeCompare(i.code):n.message.localeCompare(i.message))}function Ce(e,t){let s=t.filter(r=>r.severity==="error");return e==="enforce"&&s.length>0?{blockingReasons:s.map(r=>`policy.${r.code}: ${r.message}`),needsAttention:false}:{blockingReasons:[],needsAttention:s.length>0}}async function je(e){let t=p.join(e,I);try{if(!await y.pathExists(t))return null;let s=await y.readJson(t);return s&&s.schemaVersion===X?s:null}catch{return null}}async function Je(e,t){let s=p.join(t,I);return await y.ensureDir(p.dirname(s)),await y.writeJson(s,a$1(e),{spaces:2}),s}function We(e,t){let s=t?.strict?"strict":"default",r=[];if(e.summary.verdict==="blocked")return r.push(...e.blockingReasons),r.length===0&&r.push("verify verdict is blocked."),{passed:false,mode:s,exitCode:2,reasons:r};if(s==="strict"){if(e.summary.verdict!=="ready"&&r.push(`verify verdict is ${e.summary.verdict} (strict requires ready).`),e.freshness.verdict==="stale"){let n=[...e.freshness.changed,...e.freshness.added].slice(0,5);r.push(`freshness is stale${n.length>0?`: ${n.join(", ")}`:""} (strict requires fresh).`);}if(r.length>0)return {passed:false,mode:s,exitCode:1,reasons:r}}return {passed:true,mode:s,exitCode:e.summary.exitCode===2?0:e.summary.exitCode,reasons:r}}function Ue(e,t){let s=We(e,t);return s.passed?e.summary.verdict==="blocked"?2:t?.strict&&e.summary.verdict!=="ready"?1:e.summary.exitCode:s.exitCode}export{K as a,$e as b,X as c,I as d,ve as e,Ke as f,Je as g,We as h,Ue as i};
@@ -1,4 +1,4 @@
1
- import {a,b}from'./chunk-KMUWWZRT.js';import {f,e}from'./chunk-PCXSTKZ5.js';import {c as c$1}from'./chunk-NFUXULIF.js';import {a as a$1,b as b$1,d as d$1,c,f as f$1}from'./chunk-YBS2HGO3.js';import u from'chalk';import d from'fs';import h from'fs-extra';import l from'path';var G="release-readiness-v1";function $(t,e){let a=l.resolve(t);if(!b(a))return a;let s=l.join(e,".rapidkit","workspace.contract.json");if(d.existsSync(s))try{let i=JSON.parse(d.readFileSync(s,"utf-8")),n=Array.isArray(i.projects)?i.projects:[];for(let c of n){let f=p(c),g=typeof f.relativePath=="string"?f.relativePath.trim():"";if(g)return l.join(e,g)}}catch{}let r=x(e),o=Array.isArray(r.payload?.projects)?r.payload.projects:[];for(let i of o){let n=p(i),c=typeof n.path=="string"?n.path.trim():"";if(c)return l.resolve(c)}return a}function I(t){let e=a$1(t);return b$1(e,t)?"go":d$1(e,t)?"java":c(e,t)?"node":f$1(e,t)?"python":"unknown"}function O(t,e){if(!d.existsSync(t))return null;let a=d.readdirSync(t).filter(s=>s.endsWith(".json")&&e.some(r=>r.test(s))).map(s=>l.join(t,s));return a.length===0?null:(a.sort((s,r)=>d.statSync(r).mtimeMs-d.statSync(s).mtimeMs),a[0])}function p(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}async function V(t){let{readWorkspaceRegistrySummary:e,resolveWorkspaceRegisteredProjects:a}=await import('./workspace-registry-summary-ZXGKL2NT.js'),s=await e(t);return s?s.projectCount:(await a(t)).summary.projectCount}function z(t,e,a){let s=l.join(t,".rapidkit","toolchain.lock");if(!d.existsSync(s))return {gate:"env",status:"fail",summary:"toolchain.lock is missing",details:["Run rapidkit bootstrap to pin runtime versions and generate a reproducible toolchain."],evidencePath:s};try{let r=JSON.parse(d.readFileSync(s,"utf-8")),o=p(r.runtime),n=["python","node","go","java"].filter(c=>{let f=p(o[c]);return typeof f.version=="string"&&f.version.trim().length>0});if(n.length===0)return {gate:"env",status:"fail",summary:"No runtime versions are pinned in toolchain.lock",details:["Pin at least one runtime version via rapidkit setup <runtime> and re-run bootstrap."],evidencePath:s};if(e!=="unknown"){let c=p(o[e]);if(typeof c.version!="string"||c.version.trim().length===0)return {gate:"env",status:"fail",summary:`${a?.hasRegisteredProjects?"Project runtime":"Workspace"} (${e}) is not pinned in toolchain.lock`,details:[`Run rapidkit setup ${e} and rapidkit bootstrap to lock ${e} for this workspace.`],evidencePath:s}}return {gate:"env",status:"pass",summary:`Pinned runtimes: ${n.join(", ")}`,details:[],evidencePath:s}}catch{return {gate:"env",status:"fail",summary:"toolchain.lock is invalid JSON",details:["Regenerate lockfile with rapidkit bootstrap."],evidencePath:s}}}function x(t){let e=l.join(t,".rapidkit","reports","doctor-last-run.json");if(!d.existsSync(e))return {payload:null,path:e};try{let a=JSON.parse(d.readFileSync(e,"utf-8"));return c$1(a,"workspace")?{payload:a,path:e}:{payload:null,path:e}}catch{return {payload:null,path:e}}}function L(t){let e=x(t);if(!e.payload)return {gate:{gate:"doctor",status:"fail",summary:"Doctor evidence is missing",details:["Run rapidkit doctor workspace --json before release readiness checks."],evidencePath:e.path},payload:null};let a=p(e.payload.summary),s=Number(a.totalIssues??0);return a.hasSystemErrors?{gate:{gate:"doctor",status:"fail",summary:"Doctor reported system errors",details:["Resolve system-level doctor errors before proceeding."],evidencePath:e.path},payload:e.payload}:s>0?{gate:{gate:"doctor",status:"warn",summary:`Doctor found ${s} issue(s)`,details:["Run rapidkit doctor workspace --fix and re-run readiness checks."],evidencePath:e.path},payload:e.payload}:{gate:{gate:"doctor",status:"pass",summary:"Doctor checks passed without issues",details:[],evidencePath:e.path},payload:e.payload}}function D(t){let e=l.join(t,".rapidkit","reports","analyze-last-run.json");if(!d.existsSync(e))return {gate:"analyze",status:"fail",summary:"Analyze evidence is missing",details:["Run rapidkit analyze --json before release readiness checks."],evidencePath:e};try{let a=JSON.parse(d.readFileSync(e,"utf-8")),s=p(a.summary),r=String(s.verdict??"").toLowerCase(),o=Number(s.score??0),i=p(s.findings),n=Number(i.fail??0);return r==="blocked"||n>0?{gate:"analyze",status:"fail",summary:`Analyze verdict is blocked (score ${o}/100)`,details:["Resolve analyze findings and regenerate analyze-last-run.json."],evidencePath:e}:r==="needs-attention"?{gate:"analyze",status:"warn",summary:`Analyze needs attention (score ${o}/100)`,details:["Review analyze warnings before release."],evidencePath:e}:{gate:"analyze",status:"pass",summary:`Analyze passed (score ${o}/100)`,details:[],evidencePath:e}}catch{return {gate:"analyze",status:"fail",summary:"Analyze evidence is invalid JSON",details:["Re-run rapidkit analyze --json to regenerate evidence."],evidencePath:e}}}function J(t){try{let e=JSON.parse(d.readFileSync(t,"utf-8")),a=String(e.status??"").toLowerCase(),s=p(e.summary),r=Number(s.failedChecks??0);return a==="fail"||r>0?{gate:"verify",status:"fail",summary:"Verify-pack contract reports failed checks",details:["Fix failed verify checks and regenerate verify-pack contract evidence."],evidencePath:t}:a==="pass"?{gate:"verify",status:"pass",summary:"Verify-pack contract passed",details:[],evidencePath:t}:{gate:"verify",status:"warn",summary:"Verify-pack contract status is not explicit",details:["Ensure contract status is pass/fail and keep schema aligned with v1 contract."],evidencePath:t}}catch{return {gate:"verify",status:"fail",summary:"Verify-pack contract is invalid JSON",details:["Regenerate verify-pack contract artifact."],evidencePath:t}}}async function W(t,e){if(e.skipVerify)return {gate:"verify",status:"pass",summary:"Verify gate skipped (--skip-verify)",details:["Verification was explicitly skipped for this readiness run."]};let a=l.join(t,".rapidkit","reports"),s=O(a,[/verify-pack-contract/i,/^verify.*\.json$/i]);if(s)return J(s);let r=l.join(a,"workspace-contract-verify-last-run.json"),o=O(a,[/workspace-contract-verify-last-run/i,/workspace-contract-verify/i]);if(o)try{let i=JSON.parse(d.readFileSync(o,"utf-8")),n=String(i.status??"").toLowerCase();if(n==="passed"||n==="pass")return {gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI cache)",details:[],evidencePath:o};if(n==="failed"||n==="fail")return {gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI cache)",details:(Array.isArray(i.violations)?i.violations:[]).slice(0,5),evidencePath:o}}catch{}try{let{verifyWorkspaceContract:i}=await import('./workspace-contract-ITFCJCHI.js'),n=await i({workspacePath:t}),c={schemaVersion:"v1",source:"cli",generatedAt:new Date().toISOString(),status:n.status,contractPath:n.contractPath,projectCount:n.projectCount,checks:n.checks,violations:n.violations};return await h.ensureDir(a),await h.writeJSON(r,c,{spaces:2}),n.status==="failed"?{gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI)",details:n.violations.slice(0,5),evidencePath:r}:{gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI)",details:[],evidencePath:r}}catch(i){return {gate:"verify",status:"fail",summary:"No verify evidence and workspace contract verification unavailable",details:["Run rapidkit workspace contract verify --json or export verify-pack contract from CI.",i instanceof Error?i.message:String(i)],evidencePath:l.join(a,"*verify*.json")}}}function F(t,e){let a=l.join(e,".rapidkit","reports","doctor-last-run.json");if(!t)return {gate:"dependency",status:"warn",summary:"Dependency risk check skipped (doctor evidence missing)",details:["Run rapidkit doctor workspace --json to include dependency findings."],evidencePath:a};let s=Array.isArray(t.projects)?t.projects:[],r=s.reduce((i,n)=>{let c=Number(n.vulnerabilities??0);return Number.isFinite(c)?i+Math.max(0,c):i},0),o=s.filter(i=>i.depsInstalled===false).length;return r>0?{gate:"dependency",status:"fail",summary:`${r} dependency vulnerability(ies) reported`,details:["Resolve vulnerabilities (npm/pip/go audit pipelines) before release."],evidencePath:a}:o>0?{gate:"dependency",status:"warn",summary:`${o} project(s) report missing dependencies`,details:["Run project init/bootstrap and regenerate doctor evidence."],evidencePath:a}:{gate:"dependency",status:"pass",summary:"No dependency vulnerabilities reported",details:[],evidencePath:a}}function M(t){return t.some(e=>e.status==="fail")?"fail":t.some(e=>e.status==="warn")?"warn":"pass"}async function _(t,e){let a=l.join(t,".rapidkit","reports","release-readiness-last-run.json");return await h.ensureDir(l.dirname(a)),await h.writeJSON(a,e,{spaces:2}),a}async function K(t={}){let e$1=l.resolve(t.startPath??process.cwd()),a$1=a(e$1)??e$1,s=$(e$1,a$1),r=I(s),o=await V(a$1)>0,i=z(a$1,r,{hasRegisteredProjects:o}),n=L(a$1),c=D(a$1),f$1=await W(a$1,{skipVerify:t.skipVerify}),g=F(n.payload,a$1),k=[i,n.gate,c,f$1,g],v=M(k),m={schemaVersion:G,generatedAt:new Date().toISOString(),workspacePath:a$1,projectPath:s,action:t.action,overallStatus:v,blocking:v==="fail",blockingReasons:k.filter(y=>y.status==="fail").map(y=>`${y.gate}: ${y.summary}`),gates:k};if(t.writeReport!==false){let y=f(m,{commandId:"workspaceReadiness",exitCode:v==="fail"?2:v==="warn"?1:0,generatedAt:m.generatedAt,blockers:m.blockingReasons,runId:e()});m.evidencePath=await _(a$1,y);}return m}function H(t){return t==="pass"?u.green("PASS"):t==="warn"?u.yellow("WARN"):u.red("FAIL")}function B(t){return t==="pass"?u.green("PASS"):t==="warn"?u.yellow("WARN"):u.red("FAIL")}async function se(t){let e=await K({writeReport:true,skipVerify:t.skipVerify===true});if(t.json)console.log(JSON.stringify(e,null,2));else {console.log(u.bold.cyan(`
1
+ import {a,b}from'./chunk-KMUWWZRT.js';import {f,e}from'./chunk-PCXSTKZ5.js';import {c as c$1}from'./chunk-NFUXULIF.js';import {a as a$1,b as b$1,d as d$1,c,f as f$1}from'./chunk-YBS2HGO3.js';import u from'chalk';import d from'fs';import h from'fs-extra';import l from'path';var $="release-readiness-v1";function I(t,e){let a=l.resolve(t);if(!b(a))return a;let s=l.join(e,".rapidkit","workspace.contract.json");if(d.existsSync(s))try{let i=JSON.parse(d.readFileSync(s,"utf-8")),n=Array.isArray(i.projects)?i.projects:[];for(let c of n){let f=p(c),g=typeof f.relativePath=="string"?f.relativePath.trim():"";if(g)return l.join(e,g)}}catch{}let r=x(e),o=Array.isArray(r.payload?.projects)?r.payload.projects:[];for(let i of o){let n=p(i),c=typeof n.path=="string"?n.path.trim():"";if(c)return l.resolve(c)}return a}function V(t){let e=a$1(t);return b$1(e,t)?"go":d$1(e,t)?"java":c(e,t)?"node":f$1(e,t)?"python":"unknown"}function O(t,e){if(!d.existsSync(t))return null;let a=d.readdirSync(t).filter(s=>s.endsWith(".json")&&e.some(r=>r.test(s))).map(s=>l.join(t,s));return a.length===0?null:(a.sort((s,r)=>d.statSync(r).mtimeMs-d.statSync(s).mtimeMs),a[0])}function p(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}async function z(t){let{readWorkspaceRegistrySummary:e,resolveWorkspaceRegisteredProjects:a}=await import('./workspace-registry-summary-X5WRUU3T.js'),s=await e(t);return s?s.projectCount:(await a(t)).summary.projectCount}function L(t,e,a){let s=l.join(t,".rapidkit","toolchain.lock");if(!d.existsSync(s))return {gate:"env",status:"fail",summary:"toolchain.lock is missing",details:["Run rapidkit bootstrap to pin runtime versions and generate a reproducible toolchain."],evidencePath:s};try{let r=JSON.parse(d.readFileSync(s,"utf-8")),o=p(r.runtime),n=["python","node","go","java"].filter(c=>{let f=p(o[c]);return typeof f.version=="string"&&f.version.trim().length>0});if(n.length===0)return {gate:"env",status:"fail",summary:"No runtime versions are pinned in toolchain.lock",details:["Pin at least one runtime version via rapidkit setup <runtime> and re-run bootstrap."],evidencePath:s};if(e!=="unknown"){let c=p(o[e]);if(typeof c.version!="string"||c.version.trim().length===0)return {gate:"env",status:"fail",summary:`${a?.hasRegisteredProjects?"Project runtime":"Workspace"} (${e}) is not pinned in toolchain.lock`,details:[`Run rapidkit setup ${e} and rapidkit bootstrap to lock ${e} for this workspace.`],evidencePath:s}}return {gate:"env",status:"pass",summary:`Pinned runtimes: ${n.join(", ")}`,details:[],evidencePath:s}}catch{return {gate:"env",status:"fail",summary:"toolchain.lock is invalid JSON",details:["Regenerate lockfile with rapidkit bootstrap."],evidencePath:s}}}function x(t){let e=l.join(t,".rapidkit","reports","doctor-last-run.json");if(!d.existsSync(e))return {payload:null,path:e};try{let a=JSON.parse(d.readFileSync(e,"utf-8"));return c$1(a,"workspace")?{payload:a,path:e}:{payload:null,path:e}}catch{return {payload:null,path:e}}}function D(t){let e=x(t);if(!e.payload)return {gate:{gate:"doctor",status:"fail",summary:"Doctor evidence is missing",details:["Run rapidkit doctor workspace --json before release readiness checks."],evidencePath:e.path},payload:null};let a=p(e.payload.summary),s=Number(a.totalIssues??0);return a.hasSystemErrors?{gate:{gate:"doctor",status:"fail",summary:"Doctor reported system errors",details:["Resolve system-level doctor errors before proceeding."],evidencePath:e.path},payload:e.payload}:s>0?{gate:{gate:"doctor",status:"warn",summary:`Doctor found ${s} issue(s)`,details:["Run rapidkit doctor workspace --fix and re-run readiness checks."],evidencePath:e.path},payload:e.payload}:{gate:{gate:"doctor",status:"pass",summary:"Doctor checks passed without issues",details:[],evidencePath:e.path},payload:e.payload}}function J(t){let e=l.join(t,".rapidkit","reports","analyze-last-run.json");if(!d.existsSync(e))return {gate:"analyze",status:"fail",summary:"Analyze evidence is missing",details:["Run rapidkit analyze --json before release readiness checks."],evidencePath:e};try{let a=JSON.parse(d.readFileSync(e,"utf-8")),s=p(a.summary),r=String(s.verdict??"").toLowerCase(),o=Number(s.score??0),i=p(s.findings),n=Number(i.fail??0);return r==="blocked"||n>0?{gate:"analyze",status:"fail",summary:`Analyze verdict is blocked (score ${o}/100)`,details:["Resolve analyze findings and regenerate analyze-last-run.json."],evidencePath:e}:r==="needs-attention"?{gate:"analyze",status:"warn",summary:`Analyze needs attention (score ${o}/100)`,details:["Review analyze warnings before release."],evidencePath:e}:{gate:"analyze",status:"pass",summary:`Analyze passed (score ${o}/100)`,details:[],evidencePath:e}}catch{return {gate:"analyze",status:"fail",summary:"Analyze evidence is invalid JSON",details:["Re-run rapidkit analyze --json to regenerate evidence."],evidencePath:e}}}function W(t){try{let e=JSON.parse(d.readFileSync(t,"utf-8")),a=String(e.status??"").toLowerCase(),s=p(e.summary),r=Number(s.failedChecks??0);return a==="fail"||r>0?{gate:"verify",status:"fail",summary:"Verify-pack contract reports failed checks",details:["Fix failed verify checks and regenerate verify-pack contract evidence."],evidencePath:t}:a==="pass"?{gate:"verify",status:"pass",summary:"Verify-pack contract passed",details:[],evidencePath:t}:{gate:"verify",status:"warn",summary:"Verify-pack contract status is not explicit",details:["Ensure contract status is pass/fail and keep schema aligned with v1 contract."],evidencePath:t}}catch{return {gate:"verify",status:"fail",summary:"Verify-pack contract is invalid JSON",details:["Regenerate verify-pack contract artifact."],evidencePath:t}}}async function F(t,e){if(e.skipVerify)return {gate:"verify",status:"pass",summary:"Verify gate skipped (--skip-verify)",details:["Verification was explicitly skipped for this readiness run."]};let a=l.join(t,".rapidkit","reports"),s=O(a,[/verify-pack-contract/i,/^verify.*\.json$/i]);if(s)return W(s);let r=l.join(a,"workspace-contract-verify-last-run.json"),o=O(a,[/workspace-contract-verify-last-run/i,/workspace-contract-verify/i]);if(o)try{let i=JSON.parse(d.readFileSync(o,"utf-8")),n=String(i.status??"").toLowerCase();if(n==="passed"||n==="pass")return {gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI cache)",details:[],evidencePath:o};if(n==="failed"||n==="fail")return {gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI cache)",details:(Array.isArray(i.violations)?i.violations:[]).slice(0,5),evidencePath:o}}catch{}try{let{verifyWorkspaceContract:i}=await import('./workspace-contract-OO4GMENV.js'),n=await i({workspacePath:t}),c={schemaVersion:"v1",source:"cli",generatedAt:new Date().toISOString(),status:n.status,contractPath:n.contractPath,projectCount:n.projectCount,checks:n.checks,violations:n.violations};return await h.ensureDir(a),await h.writeJSON(r,c,{spaces:2}),n.status==="failed"?{gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI)",details:n.violations.slice(0,5),evidencePath:r}:{gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI)",details:[],evidencePath:r}}catch(i){return {gate:"verify",status:"fail",summary:"No verify evidence and workspace contract verification unavailable",details:["Run rapidkit workspace contract verify --json or export verify-pack contract from CI.",i instanceof Error?i.message:String(i)],evidencePath:l.join(a,"*verify*.json")}}}function M(t,e){let a=l.join(e,".rapidkit","reports","doctor-last-run.json");if(!t)return {gate:"dependency",status:"warn",summary:"Dependency risk check skipped (doctor evidence missing)",details:["Run rapidkit doctor workspace --json to include dependency findings."],evidencePath:a};let s=Array.isArray(t.projects)?t.projects:[],r=s.reduce((i,n)=>{let c=Number(n.vulnerabilities??0);return Number.isFinite(c)?i+Math.max(0,c):i},0),o=s.filter(i=>i.depsInstalled===false).length;return r>0?{gate:"dependency",status:"fail",summary:`${r} dependency vulnerability(ies) reported`,details:["Resolve vulnerabilities (npm/pip/go audit pipelines) before release."],evidencePath:a}:o>0?{gate:"dependency",status:"warn",summary:`${o} project(s) report missing dependencies`,details:["Run project init/bootstrap and regenerate doctor evidence."],evidencePath:a}:{gate:"dependency",status:"pass",summary:"No dependency vulnerabilities reported",details:[],evidencePath:a}}function _(t){return t.some(e=>e.status==="fail")?"fail":t.some(e=>e.status==="warn")?"warn":"pass"}async function K(t,e){let a=l.join(t,".rapidkit","reports","release-readiness-last-run.json");return await h.ensureDir(l.dirname(a)),await h.writeJSON(a,e,{spaces:2}),a}async function H(t={}){let e$1=l.resolve(t.startPath??process.cwd()),a$1=a(e$1)??e$1,s=I(e$1,a$1),r=V(s),o=await z(a$1)>0,n=L(a$1,o?r:"unknown",{hasRegisteredProjects:o}),c=D(a$1),f$1=J(a$1),g=await F(a$1,{skipVerify:t.skipVerify}),G=M(c.payload,a$1),k=[n,c.gate,f$1,g,G],v=_(k),m={schemaVersion:$,generatedAt:new Date().toISOString(),workspacePath:a$1,projectPath:s,action:t.action,overallStatus:v,blocking:v==="fail",blockingReasons:k.filter(y=>y.status==="fail").map(y=>`${y.gate}: ${y.summary}`),gates:k};if(t.writeReport!==false){let y=f(m,{commandId:"workspaceReadiness",exitCode:v==="fail"?2:v==="warn"?1:0,generatedAt:m.generatedAt,blockers:m.blockingReasons,runId:e()});m.evidencePath=await K(a$1,y);}return m}function B(t){return t==="pass"?u.green("PASS"):t==="warn"?u.yellow("WARN"):u.red("FAIL")}function U(t){return t==="pass"?u.green("PASS"):t==="warn"?u.yellow("WARN"):u.red("FAIL")}async function ne(t){let e=await H({writeReport:true,skipVerify:t.skipVerify===true});if(t.json)console.log(JSON.stringify(e,null,2));else {console.log(u.bold.cyan(`
2
2
  \u{1F6A6} RapidKit Release Readiness
3
- `)),console.log(u.bold(`Workspace: ${u.cyan(l.basename(e.workspacePath))}`)),console.log(u.gray(`Path: ${e.workspacePath}`)),console.log(`Overall: ${B(e.overallStatus)}`);for(let a of e.gates){console.log(` - ${a.gate}: ${H(a.status)} ${a.summary}`);for(let s of a.details)console.log(u.gray(` ${s}`));a.evidencePath&&console.log(u.gray(` evidence: ${a.evidencePath}`));}e.evidencePath&&console.log(u.gray(`
4
- Evidence saved: ${e.evidencePath}`));}t.strict&&e.overallStatus!=="pass"&&process.exit(1);}export{K as a,se as b};
3
+ `)),console.log(u.bold(`Workspace: ${u.cyan(l.basename(e.workspacePath))}`)),console.log(u.gray(`Path: ${e.workspacePath}`)),console.log(`Overall: ${U(e.overallStatus)}`);for(let a of e.gates){console.log(` - ${a.gate}: ${B(a.status)} ${a.summary}`);for(let s of a.details)console.log(u.gray(` ${s}`));a.evidencePath&&console.log(u.gray(` evidence: ${a.evidencePath}`));}e.evidencePath&&console.log(u.gray(`
4
+ Evidence saved: ${e.evidencePath}`));}t.strict&&e.overallStatus!=="pass"&&process.exit(1);}export{H as a,ne as b};
@@ -1,6 +1,6 @@
1
- import {c as c$1}from'./chunk-FVCZGUVX.js';import {b as b$1,d as d$1,a,e}from'./chunk-RIZCWYRR.js';import {b,c,d}from'./chunk-WA6JYVJM.js';import {j,h,b as b$2,g}from'./chunk-QN2LPLHO.js';import {j as j$1}from'./chunk-DMUEGR36.js';import s from'path';import m from'fs-extra';var _=["Scope","Evidence","Diagnosis","Fix Plan","Run","Verify","Assumptions"];var xe="workspace-operational-skill.v1";function ye(e){if(typeof e!="string")return null;let t=e.trim();return !t||t.includes("/")||t.includes("..")?null:t}function ce(e){let t=ye(e.skillId);if(!t)throw new Error(`Invalid skill id: ${e.skillId}`);return {schemaVersion:xe,skillId:t,canonicalPath:d$1(t),title:e.title,triggers:[...e.triggers].sort((r,i)=>r.localeCompare(i)),requiredReports:[...e.requiredReports].sort((r,i)=>r.localeCompare(i)),scopedProjects:[...e.scopedProjects??[]].sort((r,i)=>r.localeCompare(i)),verificationCommands:[...e.verificationCommands],answerContractSections:[..._],...e.promptStem?{promptStem:e.promptStem}:{},markdown:e.markdown}}var Se="workspace-skills-index.v1";function pe(e){let t=[...e.skills].sort((i,o)=>i.skillId.localeCompare(o.skillId)),r=e.inputsHash??b$2({skillIds:t.map(i=>i.skillId),paths:t.map(i=>i.canonicalPath)});return {schemaVersion:Se,generatedAt:e.generatedAt,inputsHash:r,skills:t.map(i=>({skillId:i.skillId,path:i.canonicalPath,schemaVersion:i.schemaVersion,title:i.title}))}}var de=[".rapidkit/reports/INDEX.json",b,c$1],je=[{skillId:"rapidkit-diagnose-api-failure",title:"Diagnose API failure",triggers:["api failure","500 error","integration test failed","service unreachable"],objective:"Investigate a failing API or service using RapidKit evidence before editing application code.",steps:["Read `.rapidkit/reports/INDEX.json` and identify fail/warn reports for the scoped project.","Read `.rapidkit/reports/doctor-last-run.json` and project-scoped run evidence if present.","Map the failure to workspace vs project scope; cite exit codes and blocker messages.","Propose the smallest safe fix (config, env, dependency) with explicit verification commands."]},{skillId:"rapidkit-release-readiness",title:"Release readiness",triggers:["release","ship","production","readiness gate"],objective:"Assess whether this workspace is release-ready using governed RapidKit gates.",steps:["Read `.rapidkit/reports/release-readiness-last-run.json` and `pipeline-last-run.json`.","Read `.rapidkit/reports/workspace-verify-last-run.json` for verdict and blocking reasons.","List blocking gates first; never claim ready without cited report fields.","Provide one safe next command and a verification checklist."]},{skillId:"rapidkit-safe-schema-migration",title:"Safe schema migration",triggers:["migration","schema change","database migration","db migrate"],objective:"Plan and verify a schema migration with blast-radius awareness.",steps:["Identify affected projects from workspace model and dependency graph.","Run or review impact/verify evidence for transitive dependents.","Require project-scoped test/build commands before promoting the migration.","Document rollback and verification signals."]},{skillId:"rapidkit-dependency-upgrade",title:"Dependency upgrade",triggers:["upgrade dependency","bump package","security advisory","outdated deps"],objective:"Upgrade dependencies with graph-aware verification.",steps:["Scope the upgrade to the owning project from workspace model.","Check transitive dependents via workspace graph / impact reports.","Prefer workspace run test/build for affected projects.","Re-run `workspace verify` after evidence refresh."]},{skillId:"rapidkit-rename-contract",title:"Rename contract safely",triggers:["rename contract","rename event","breaking api","contract change"],objective:"Rename or change a shared contract with consumer awareness.",steps:["Read `.rapidkit/workspace.contract.json` for publishes/consumes/owns edges.","List all consumer projects before proposing renames.","Update contract file and regenerate workspace model.","Verify contract gate and integration tests for consumers."]}];function D(e){return `npx rapidkit ${e}`.trim()}function ve(e){let t=[`# ${e.template.title}`,"",`> Workspace: **${e.workspaceName}** \xB7 Skill: \`${e.template.skillId}\``,"","## Objective","",e.template.objective,"","## Triggers","",...e.template.triggers.map(r=>`- ${r}`),"","## Required evidence (read first)","",...de.map(r=>`- \`${r}\``),"","## Procedure","",...e.template.steps.map((r,i)=>`${i+1}. ${r}`),""];if(e.scopedProjects.length>0&&t.push("## Scoped projects","",...e.scopedProjects.map(r=>`- ${r}`),""),e.contractSummary&&t.push("## Contract context","",e.contractSummary,""),e.verificationCommands.length>0){t.push("## Verification commands (this workspace)","");for(let r of e.verificationCommands)t.push(`- \`${r}\``);t.push("");}return t.push("## Answer contract","","Return: Scope, Evidence, Diagnosis, Fix Plan, Run, Verify, Assumptions.","","## Refresh stale evidence","","```bash",D("workspace agent-sync --write --refresh-context"),"```",""),t.join(`
1
+ import {b,c,d}from'./chunk-33LR2QEM.js';import {d as d$1}from'./chunk-HYAT2EG7.js';import {b as b$1,f,a,g as g$1}from'./chunk-GBJBQ43T.js';import {j,h,b as b$2,g}from'./chunk-EN6YCX36.js';import {j as j$1}from'./chunk-3PTJID76.js';import s from'path';import m from'fs-extra';var _=["Scope","Evidence","Diagnosis","Fix Plan","Run","Verify","Assumptions"];var xe="workspace-operational-skill.v1";function ye(e){if(typeof e!="string")return null;let t=e.trim();return !t||t.includes("/")||t.includes("..")?null:t}function ce(e){let t=ye(e.skillId);if(!t)throw new Error(`Invalid skill id: ${e.skillId}`);return {schemaVersion:xe,skillId:t,canonicalPath:f(t),title:e.title,triggers:[...e.triggers].sort((r,i)=>r.localeCompare(i)),requiredReports:[...e.requiredReports].sort((r,i)=>r.localeCompare(i)),scopedProjects:[...e.scopedProjects??[]].sort((r,i)=>r.localeCompare(i)),verificationCommands:[...e.verificationCommands],answerContractSections:[..._],...e.promptStem?{promptStem:e.promptStem}:{},markdown:e.markdown}}var Se="workspace-skills-index.v1";function pe(e){let t=[...e.skills].sort((i,o)=>i.skillId.localeCompare(o.skillId)),r=e.inputsHash??b$2({skillIds:t.map(i=>i.skillId),paths:t.map(i=>i.canonicalPath)});return {schemaVersion:Se,generatedAt:e.generatedAt,inputsHash:r,skills:t.map(i=>({skillId:i.skillId,path:i.canonicalPath,schemaVersion:i.schemaVersion,title:i.title}))}}var de=[".rapidkit/reports/INDEX.json",b,d$1],je=[{skillId:"rapidkit-diagnose-api-failure",title:"Diagnose API failure",triggers:["api failure","500 error","integration test failed","service unreachable"],objective:"Investigate a failing API or service using RapidKit evidence before editing application code.",steps:["Read `.rapidkit/reports/INDEX.json` and identify fail/warn reports for the scoped project.","Read `.rapidkit/reports/doctor-last-run.json` and project-scoped run evidence if present.","Map the failure to workspace vs project scope; cite exit codes and blocker messages.","Propose the smallest safe fix (config, env, dependency) with explicit verification commands."]},{skillId:"rapidkit-release-readiness",title:"Release readiness",triggers:["release","ship","production","readiness gate"],objective:"Assess whether this workspace is release-ready using governed RapidKit gates.",steps:["Read `.rapidkit/reports/release-readiness-last-run.json` and `pipeline-last-run.json`.","Read `.rapidkit/reports/workspace-verify-last-run.json` for verdict and blocking reasons.","List blocking gates first; never claim ready without cited report fields.","Provide one safe next command and a verification checklist."]},{skillId:"rapidkit-safe-schema-migration",title:"Safe schema migration",triggers:["migration","schema change","database migration","db migrate"],objective:"Plan and verify a schema migration with blast-radius awareness.",steps:["Identify affected projects from workspace model and dependency graph.","Run or review impact/verify evidence for transitive dependents.","Require project-scoped test/build commands before promoting the migration.","Document rollback and verification signals."]},{skillId:"rapidkit-dependency-upgrade",title:"Dependency upgrade",triggers:["upgrade dependency","bump package","security advisory","outdated deps"],objective:"Upgrade dependencies with graph-aware verification.",steps:["Scope the upgrade to the owning project from workspace model.","Check transitive dependents via workspace graph / impact reports.","Prefer workspace run test/build for affected projects.","Re-run `workspace verify` after evidence refresh."]},{skillId:"rapidkit-rename-contract",title:"Rename contract safely",triggers:["rename contract","rename event","breaking api","contract change"],objective:"Rename or change a shared contract with consumer awareness.",steps:["Read `.rapidkit/workspace.contract.json` for publishes/consumes/owns edges.","List all consumer projects before proposing renames.","Update contract file and regenerate workspace model.","Verify contract gate and integration tests for consumers."]}];function D(e){return `npx rapidkit ${e}`.trim()}function ve(e){let t=[`# ${e.template.title}`,"",`> Workspace: **${e.workspaceName}** \xB7 Skill: \`${e.template.skillId}\``,"","## Objective","",e.template.objective,"","## Triggers","",...e.template.triggers.map(r=>`- ${r}`),"","## Required evidence (read first)","",...de.map(r=>`- \`${r}\``),"","## Procedure","",...e.template.steps.map((r,i)=>`${i+1}. ${r}`),""];if(e.scopedProjects.length>0&&t.push("## Scoped projects","",...e.scopedProjects.map(r=>`- ${r}`),""),e.contractSummary&&t.push("## Contract context","",e.contractSummary,""),e.verificationCommands.length>0){t.push("## Verification commands (this workspace)","");for(let r of e.verificationCommands)t.push(`- \`${r}\``);t.push("");}return t.push("## Answer contract","","Return: Scope, Evidence, Diagnosis, Fix Plan, Run, Verify, Assumptions.","","## Refresh stale evidence","","```bash",D("workspace agent-sync --write --refresh-context"),"```",""),t.join(`
2
2
  `)}function Ce(e){return e?.safeCommands?.length?e.safeCommands.slice(0,8).map(t=>t.display):[D("workspace verify --json"),D("doctor workspace --json")]}function Pe(e){return e?.projects?.length?e.projects.slice(0,12).map(r=>{let i=r.contracts.owns.join(", ")||"none",o=r.contracts.publishes.join(", ")||"none",p=r.contracts.consumes.join(", ")||"none";return `- **${r.slug}**: owns \`${i}\`; publishes \`${o}\`; consumes \`${p}\``}).join(`
3
- `):void 0}function le(e$1){let t=e$1.model.workspace.name,r=e$1.model.projects.map(p=>p.name).sort(),i=Ce(e$1.context??null),o=Pe(e$1.contract??null);return je.map(p=>{let c=ve({template:p,workspaceName:t,scopedProjects:r,verificationCommands:i,contractSummary:o});return ce({skillId:p.skillId,title:p.title,triggers:p.triggers,requiredReports:[...de],scopedProjects:r,verificationCommands:i,promptStem:e[p.skillId],markdown:c})})}async function ue(e){let t=s.resolve(e.workspacePath),r=[],i=b$2({skills:e.skills.map(p=>({id:p.skillId,path:p.canonicalPath,hash:b$2({markdown:p.markdown})}))}),o=pe({generatedAt:e.generatedAt,skills:e.skills,inputsHash:i});if(e.write){for(let c of e.skills){let n=s.join(t,c.canonicalPath);await m.ensureDir(s.dirname(n)),await m.writeFile(n,c.markdown,"utf8"),r.push(c.canonicalPath);}let p=s.join(t,b$1);await m.ensureDir(s.dirname(p)),await m.writeJson(p,o,{spaces:2}),r.push(b$1);}return {skills:e.skills,index:o,writtenPaths:r}}function ge(e){return ["## Operational skills (canonical)","","Read workspace-native playbooks from `.rapidkit/skills/` before generic repo scans:","",...e.skills.map(r=>`- \`${r.path}\` \u2014 ${r.title} (\`${r.skillId}\`)`),"","Regenerate:","","```bash",D("workspace agent-sync --write --refresh-context"),"```",""].join(`
3
+ `):void 0}function le(e){let t=e.model.workspace.name,r=e.model.projects.map(p=>p.name).sort(),i=Ce(e.context??null),o=Pe(e.contract??null);return je.map(p=>{let c=ve({template:p,workspaceName:t,scopedProjects:r,verificationCommands:i,contractSummary:o});return ce({skillId:p.skillId,title:p.title,triggers:p.triggers,requiredReports:[...de],scopedProjects:r,verificationCommands:i,promptStem:g$1[p.skillId],markdown:c})})}async function ue(e){let t=s.resolve(e.workspacePath),r=[],i=b$2({skills:e.skills.map(p=>({id:p.skillId,path:p.canonicalPath,hash:b$2({markdown:p.markdown})}))}),o=pe({generatedAt:e.generatedAt,skills:e.skills,inputsHash:i});if(e.write){for(let c of e.skills){let n=s.join(t,c.canonicalPath);await m.ensureDir(s.dirname(n)),await m.writeFile(n,c.markdown,"utf8"),r.push(c.canonicalPath);}let p=s.join(t,b$1);await m.ensureDir(s.dirname(p)),await m.writeJson(p,o,{spaces:2}),r.push(b$1);}return {skills:e.skills,index:o,writtenPaths:r}}function ge(e){return ["## Operational skills (canonical)","","Read workspace-native playbooks from `.rapidkit/skills/` before generic repo scans:","",...e.skills.map(r=>`- \`${r.path}\` \u2014 ${r.title} (\`${r.skillId}\`)`),"","Regenerate:","","```bash",D("workspace agent-sync --write --refresh-context"),"```",""].join(`
4
4
  `)}var Ee={"rapidkit-diagnose-api-failure":".github/prompts/rapidkit-diagnose.prompt.md","rapidkit-release-readiness":".github/prompts/rapidkit-release-readiness.prompt.md"},X="## Workspace verification (hydrated)";function Ie(e){let t=[X,"","Verification commands for this workspace:","",...e.verificationCommands.length?e.verificationCommands.map(r=>`- \`${r}\``):["- `npx rapidkit workspace verify --json`"]];return e.scopedProjects.length>0&&t.push("","Scoped projects:","",...e.scopedProjects.map(r=>`- ${r}`)),t.push(""),t.join(`
5
5
  `)}async function me(e){let t=s.resolve(e.workspacePath),r=[];for(let i of e.skills){let o=Ee[i.skillId];if(!o)continue;let p=s.join(t,o);if(!await m.pathExists(p))continue;let c=await m.readFile(p,"utf8"),n=Ie(i),g=c.includes(X)?c.replace(new RegExp(`${X}[\\s\\S]*$`),n.trimEnd()):`${c.trimEnd()}
6
6
 
@@ -1 +1 @@
1
- import {b as b$1}from'./chunk-CDCYRBAY.js';import {r,j as j$1}from'./chunk-ZQRFVFKK.js';import {f}from'./chunk-OLDPVVSV.js';import {b}from'./chunk-MIWDCR6I.js';import f$1,{promises}from'fs';import i from'path';import E,{homedir}from'os';import {pathToFileURL}from'url';import l from'process';function R(t){let r=t.label.indexOf(" \u2014 ");return r>=0?t.label.slice(r+3).trim():t.label.trim()}function j(){let t=r().map(r=>({value:r.id,label:R(r),hint:r.description,name:r.label})),e=j$1().map(r=>({value:r.kitId,label:r.displayName,hint:r.commandDisplay("my-app"),name:`${r.displayName} \u2014 ${r.framework}`}));return [...t,...e]}var _=".rapidkitrc.json",F=["rapidkit.config.js","rapidkit.config.mjs","rapidkit.config.cjs"];async function yt(){let t=i.join(E.homedir(),_);try{let e=await promises.readFile(t,"utf-8"),r=JSON.parse(e);return f.debug(`Loaded config from ${t}`),r}catch{return f.debug("No user config found, using defaults"),{}}}async function vt(t=process.cwd()){let e=t,r=i.parse(e).root;for(;e!==r;){for(let n of F){let o=i.join(e,n);try{await promises.access(o),f.debug(`Found config file: ${o}`);let m=await import(pathToFileURL(o).href),P=m.default||m;return f.debug(`Loaded RapidKit config from ${n}`),P}catch{continue}}e=i.dirname(e);}return f.debug("No RapidKit config file found, using defaults"),{}}function bt(t,e,r){return {author:r.author||e.workspace?.defaultAuthor||t.author,pythonVersion:r.pythonVersion||e.workspace?.pythonVersion||t.pythonVersion,defaultInstallMethod:r.defaultInstallMethod||e.workspace?.installMethod||t.defaultInstallMethod,defaultKit:r.defaultKit||e.projects?.defaultKit||t.defaultKit,skipGit:r.skipGit??e.projects?.skipGit??t.skipGit,license:r.license||t.license,testRapidKitPath:r.testRapidKitPath||t.testRapidKitPath}}function wt(t){return process.env.RAPIDKIT_DEV_PATH||t.testRapidKitPath||void 0}var x="workspai",Rt="Workspai";function L(t){return f$1.existsSync(i.join(t,".rapidkit-workspace"))||f$1.existsSync(i.join(t,".rapidkit","workspace.json"))}function g(t=homedir()){return i.join(t,"rapidkit","workspaces")}function K(t=homedir()){return i.join(t,"Workspai","rapidkits")}function y(t,e=homedir()){return i.join(g(e),t)}function U(t,e=homedir()){return [y(t,e),i.join(K(e),t)]}function D(t,e={}){let r=e.homeDir??homedir();return e.outputDir?i.resolve(e.outputDir,t):y(t,r)}function jt(t,e=homedir()){for(let r of U(t,e))if(f$1.existsSync(r))return r}function Et(t,e="my-workspace"){let r=1;for(;;){let n=r===1?e:`${e}-${r}`,o=i.join(t,n);if(!f$1.existsSync(o))return {name:n,targetPath:o};r+=1;}}function S(t=homedir()){return [i.join(g(t),x),i.join(K(t),x)]}function Mt(t=homedir()){for(let e of S(t))if(L(e))return e;return y(x,t)}function T(t,e){let r=t.indexOf(e);if(r>=0&&r+1<t.length)return t[r+1];let n=t.find(o=>o.startsWith(`${e}=`));if(n)return n.slice(e.length+1)}function N(t){return t.includes("--here")}function W(t,e=l.cwd()){if(N(t))return i.resolve(e);let r=T(t,"--output");if(r)return i.resolve(r)}function $t(t,e=l.cwd()){let r=i.resolve(t),n=i.resolve(e),o=i.relative(n,r);return o.length>0&&!o.startsWith("..")&&!i.isAbsolute(o)?`cd ${o}`:`cd ${r}`}function Gt(t,e={}){let r=e.argv??[],n=e.outputParent??W(r,l.cwd());return D(t.trim(),{homeDir:e.homeDir,outputDir:n})}async function Ot(t,e={}){let r=e.cwd??l.cwd(),n=e.homeDir??homedir(),o=W(t,r);if(o!==void 0)return o;let h=e.hasYes??(t.includes("--yes")||t.includes("-y"));if(!(e.interactive??(!h&&!!l.stdin.isTTY&&!b())))return;let P=g(n),{location:A}=await b$1([{type:"rawlist",name:"location",message:"Where should the workspace be created?",choices:[{value:"managed",label:"Managed home",hint:P},{value:"here",label:"Current directory",hint:r}],default:0}]);if(A==="here")return i.resolve(r)}export{j as a,yt as b,vt as c,bt as d,wt as e,Rt as f,g,jt as h,Et as i,Mt as j,$t as k,Gt as l,Ot as m};
1
+ import {b as b$1}from'./chunk-CDCYRBAY.js';import {r,j as j$1}from'./chunk-E5ZVQL3C.js';import {f}from'./chunk-OLDPVVSV.js';import {b}from'./chunk-MIWDCR6I.js';import f$1,{promises}from'fs';import i from'path';import E,{homedir}from'os';import {pathToFileURL}from'url';import l from'process';function R(t){let r=t.label.indexOf(" \u2014 ");return r>=0?t.label.slice(r+3).trim():t.label.trim()}function j(){let t=r().map(r=>({value:r.id,label:R(r),hint:r.description,name:r.label})),e=j$1().map(r=>({value:r.kitId,label:r.displayName,hint:r.commandDisplay("my-app"),name:`${r.displayName} \u2014 ${r.framework}`}));return [...t,...e]}var _=".rapidkitrc.json",F=["rapidkit.config.js","rapidkit.config.mjs","rapidkit.config.cjs"];async function yt(){let t=i.join(E.homedir(),_);try{let e=await promises.readFile(t,"utf-8"),r=JSON.parse(e);return f.debug(`Loaded config from ${t}`),r}catch{return f.debug("No user config found, using defaults"),{}}}async function vt(t=process.cwd()){let e=t,r=i.parse(e).root;for(;e!==r;){for(let n of F){let o=i.join(e,n);try{await promises.access(o),f.debug(`Found config file: ${o}`);let m=await import(pathToFileURL(o).href),P=m.default||m;return f.debug(`Loaded RapidKit config from ${n}`),P}catch{continue}}e=i.dirname(e);}return f.debug("No RapidKit config file found, using defaults"),{}}function bt(t,e,r){return {author:r.author||e.workspace?.defaultAuthor||t.author,pythonVersion:r.pythonVersion||e.workspace?.pythonVersion||t.pythonVersion,defaultInstallMethod:r.defaultInstallMethod||e.workspace?.installMethod||t.defaultInstallMethod,defaultKit:r.defaultKit||e.projects?.defaultKit||t.defaultKit,skipGit:r.skipGit??e.projects?.skipGit??t.skipGit,license:r.license||t.license,testRapidKitPath:r.testRapidKitPath||t.testRapidKitPath}}function wt(t){return process.env.RAPIDKIT_DEV_PATH||t.testRapidKitPath||void 0}var x="workspai",Rt="Workspai";function L(t){return f$1.existsSync(i.join(t,".rapidkit-workspace"))||f$1.existsSync(i.join(t,".rapidkit","workspace.json"))}function g(t=homedir()){return i.join(t,"rapidkit","workspaces")}function K(t=homedir()){return i.join(t,"Workspai","rapidkits")}function y(t,e=homedir()){return i.join(g(e),t)}function U(t,e=homedir()){return [y(t,e),i.join(K(e),t)]}function D(t,e={}){let r=e.homeDir??homedir();return e.outputDir?i.resolve(e.outputDir,t):y(t,r)}function jt(t,e=homedir()){for(let r of U(t,e))if(f$1.existsSync(r))return r}function Et(t,e="my-workspace"){let r=1;for(;;){let n=r===1?e:`${e}-${r}`,o=i.join(t,n);if(!f$1.existsSync(o))return {name:n,targetPath:o};r+=1;}}function S(t=homedir()){return [i.join(g(t),x),i.join(K(t),x)]}function Mt(t=homedir()){for(let e of S(t))if(L(e))return e;return y(x,t)}function T(t,e){let r=t.indexOf(e);if(r>=0&&r+1<t.length)return t[r+1];let n=t.find(o=>o.startsWith(`${e}=`));if(n)return n.slice(e.length+1)}function N(t){return t.includes("--here")}function W(t,e=l.cwd()){if(N(t))return i.resolve(e);let r=T(t,"--output");if(r)return i.resolve(r)}function $t(t,e=l.cwd()){let r=i.resolve(t),n=i.resolve(e),o=i.relative(n,r);return o.length>0&&!o.startsWith("..")&&!i.isAbsolute(o)?`cd ${o}`:`cd ${r}`}function Gt(t,e={}){let r=e.argv??[],n=e.outputParent??W(r,l.cwd());return D(t.trim(),{homeDir:e.homeDir,outputDir:n})}async function Ot(t,e={}){let r=e.cwd??l.cwd(),n=e.homeDir??homedir(),o=W(t,r);if(o!==void 0)return o;let h=e.hasYes??(t.includes("--yes")||t.includes("-y"));if(!(e.interactive??(!h&&!!l.stdin.isTTY&&!b())))return;let P=g(n),{location:A}=await b$1([{type:"rawlist",name:"location",message:"Where should the workspace be created?",choices:[{value:"managed",label:"Managed home",hint:P},{value:"here",label:"Current directory",hint:r}],default:0}]);if(A==="here")return i.resolve(r)}export{j as a,yt as b,vt as c,bt as d,wt as e,Rt as f,g,jt as h,Et as i,Mt as j,$t as k,Gt as l,Ot as m};
@@ -1 +1 @@
1
- import {a,b as b$1}from'./chunk-S5KTATOU.js';import {b}from'./chunk-QN2LPLHO.js';function f(r){let s=new Map;for(let n of r.projects)s.has(n.name)||s.set(n.name,b(n));return s}function j(r){let s=f(r),n=r.graph??{nodes:r.projects.map(t=>({id:t.name,path:t.path})),edges:[]},a$1=a(n),o=new Map;for(let t of n.nodes){let e=s.get(t.id)??b({missing:t.id}),g=[...b$1(a$1,[t.id],{direction:"dependencies"}).keys()].filter(c=>c!==t.id).sort((c,l)=>c.localeCompare(l)).map(c=>({id:c,hash:s.get(c)??"<unknown>"}));o.set(t.id,{id:t.id,ownHash:e,transitiveInputsHash:b({own:e,dependencies:g})});}return o}function v(r,s){if(!s||Object.keys(s).length===0)return {verdict:"unknown",baseline:"none",changed:[],added:[],removed:[]};let n=[],a=[];for(let[e,i]of r.entries())e in s?s[e]!==i.transitiveInputsHash&&n.push(e):a.push(e);let o=[];for(let e of Object.keys(s))r.has(e)||o.push(e);return n.sort((e,i)=>e.localeCompare(i)),a.sort((e,i)=>e.localeCompare(i)),o.sort((e,i)=>e.localeCompare(i)),{verdict:n.length>0||a.length>0||o.length>0?"stale":"fresh",baseline:"recorded",changed:n,added:a,removed:o}}function w(r){let s={};for(let[n,a]of [...r.entries()].sort((o,t)=>o[0].localeCompare(t[0])))s[n]=a.transitiveInputsHash;return s}export{f as a,j as b,v as c,w as d};
1
+ import {b}from'./chunk-EN6YCX36.js';import {a,b as b$1}from'./chunk-S5KTATOU.js';function f(r){let s=new Map;for(let n of r.projects)s.has(n.name)||s.set(n.name,b(n));return s}function j(r){let s=f(r),n=r.graph??{nodes:r.projects.map(t=>({id:t.name,path:t.path})),edges:[]},a$1=a(n),o=new Map;for(let t of n.nodes){let e=s.get(t.id)??b({missing:t.id}),g=[...b$1(a$1,[t.id],{direction:"dependencies"}).keys()].filter(c=>c!==t.id).sort((c,l)=>c.localeCompare(l)).map(c=>({id:c,hash:s.get(c)??"<unknown>"}));o.set(t.id,{id:t.id,ownHash:e,transitiveInputsHash:b({own:e,dependencies:g})});}return o}function v(r,s){if(!s||Object.keys(s).length===0)return {verdict:"unknown",baseline:"none",changed:[],added:[],removed:[]};let n=[],a=[];for(let[e,i]of r.entries())e in s?s[e]!==i.transitiveInputsHash&&n.push(e):a.push(e);let o=[];for(let e of Object.keys(s))r.has(e)||o.push(e);return n.sort((e,i)=>e.localeCompare(i)),a.sort((e,i)=>e.localeCompare(i)),o.sort((e,i)=>e.localeCompare(i)),{verdict:n.length>0||a.length>0||o.length>0?"stale":"fresh",baseline:"recorded",changed:n,added:a,removed:o}}function w(r){let s={};for(let[n,a]of [...r.entries()].sort((o,t)=>o[0].localeCompare(t[0])))s[n]=a.transitiveInputsHash;return s}export{f as a,j as b,v as c,w as d};
@@ -1,4 +1,4 @@
1
- import {k,e as e$2}from'./chunk-XOVB2ZP5.js';import {b as b$2}from'./chunk-CDCYRBAY.js';import {e,g,f as f$2,b as b$3,c as c$2,d as d$2}from'./chunk-ZQRFVFKK.js';import {a,d,b as b$1}from'./chunk-RV6HBTFC.js';import {b}from'./chunk-Q2KZIBV4.js';import {f,c,e as e$3}from'./chunk-OLDPVVSV.js';import {a as a$1,e as e$1,d as d$1,f as f$1,c as c$1,k as k$1}from'./chunk-Z5LKRG57.js';import {promises}from'fs';import*as P from'fs-extra';import m from'path';import t from'chalk';import {execa}from'execa';async function H(e,o={}){let n=m.resolve(e),r=o.workspaceName??m.basename(n);try{let{registerWorkspace:a}=await import('./workspace-FDMJD5XI.js');await a(n,r);}catch(a){o.silent||console.warn(t.gray(`Note: Could not register workspace in shared registry: ${a?.message??a}`));}try{let{syncWorkspaceContract:a}=await import('./workspace-contract-ITFCJCHI.js'),c=await a({workspacePath:n});if(o.silent||console.log(t.gray(`\u2139\uFE0F Workspace intelligence synced (contract + registry summary, ${c.contract.projects.length} project(s)).`)),!o.silent&&c.verification.status!=="passed"){console.log(t.yellow("\u26A0\uFE0F Workspace contract verification reported issues."));for(let d of c.verification.violations)console.log(t.gray(` Violation: ${d}`));console.log(t.white(" Next: npx rapidkit workspace contract inspect"));}}catch(a){o.silent||console.warn(t.gray(`Note: Could not sync workspace intelligence layer: ${a?.message??a}`));}}function S(){return c$1()}async function B(e,o,n,r){let a=d(o,b(),n);r&&(a.metadata||(a.metadata={}),a.metadata.python={version:r}),await b$1(e,a);}async function z(e){await P.outputFile(m.join(e,".gitignore"),`.venv/
1
+ import {k,e as e$1}from'./chunk-JU3VNLTY.js';import {b as b$2}from'./chunk-CDCYRBAY.js';import {e,g,f as f$1,b as b$4,c as c$1,d as d$1}from'./chunk-E5ZVQL3C.js';import {a,d,b as b$1}from'./chunk-RV6HBTFC.js';import {b}from'./chunk-Q2KZIBV4.js';import {f,c,e as e$2}from'./chunk-OLDPVVSV.js';import {b as b$3,j,i,l,h,q}from'./chunk-WRMCPKGA.js';import {promises}from'fs';import*as P from'fs-extra';import m from'path';import t from'chalk';import {execa}from'execa';async function H(e,o={}){let n=m.resolve(e),r=o.workspaceName??m.basename(n);try{let{registerWorkspace:a}=await import('./workspace-E554C5SM.js');await a(n,r);}catch(a){o.silent||console.warn(t.gray(`Note: Could not register workspace in shared registry: ${a?.message??a}`));}try{let{syncWorkspaceContract:a}=await import('./workspace-contract-OO4GMENV.js'),c=await a({workspacePath:n});if(o.silent||console.log(t.gray(`\u2139\uFE0F Workspace intelligence synced (contract + registry summary, ${c.contract.projects.length} project(s)).`)),!o.silent&&c.verification.status!=="passed"){console.log(t.yellow("\u26A0\uFE0F Workspace contract verification reported issues."));for(let d of c.verification.violations)console.log(t.gray(` Violation: ${d}`));console.log(t.white(" Next: npx rapidkit workspace contract inspect"));}}catch(a){o.silent||console.warn(t.gray(`Note: Could not sync workspace intelligence layer: ${a?.message??a}`));}}function S(){return h()}async function B(e,o,n,r){let a=d(o,b(),n);r&&(a.metadata||(a.metadata={}),a.metadata.python={version:r}),await b$1(e,a);}async function z(e){await P.outputFile(m.join(e,".gitignore"),`.venv/
2
2
  __pycache__/
3
3
  *.pyc
4
4
  .env
@@ -36,11 +36,11 @@ cache:
36
36
  self_heal: true
37
37
  verify_integrity: false
38
38
  `}async function Et(){try{let{stdout:e}=await execa("go",["version"],{timeout:3e3,stdio:"pipe"}),o=e.match(/go(\d+\.\d+(?:\.\d+)?)/i);return o?o[1]:void 0}catch{return}}async function Ct(){try{let{stdout:e}=await execa("dotnet",["--version"],{timeout:3e3,stdio:"pipe"}),o=e.trim();return o.length>0?o:void 0}catch{return}}async function Q(e,o,n,r,a,c){let[d,p]=await Promise.all([Et(),Ct()]);await P.outputFile(m.join(e,".rapidkit","workspace.json"),xt(o,n,r,a,c),"utf-8"),await P.outputFile(m.join(e,".rapidkit","toolchain.lock"),It(n,r,process.version,d,p),"utf-8"),await P.outputFile(m.join(e,".rapidkit","policies.yml"),Rt(),"utf-8"),await P.outputFile(m.join(e,".rapidkit","cache-config.yml"),_t(),"utf-8");}async function ke(e,o){let{workspaceName:n=m.basename(e),installMethod:r="venv",pythonVersion:a$1,profile:c,writeMarker:d$1=true,writeGitignore:p=true,onlyIfMissing:y=true}=o||{},h=[],[g,s]=await Promise.all([Et(),Ct()]),i=[{relPath:m.join(".rapidkit","workspace.json"),content:xt(n,r,a$1,c)},{relPath:m.join(".rapidkit","toolchain.lock"),content:It(r,a$1,process.version,g,s)},{relPath:m.join(".rapidkit","policies.yml"),content:Rt()},{relPath:m.join(".rapidkit","cache-config.yml"),content:_t()}];for(let f of i){let u=m.join(e,f.relPath);y&&await P.pathExists(u)||(await P.outputFile(u,f.content,"utf-8"),h.push(f.relPath));}if(d$1&&(!!!await a(e)||!y)){let u=d(n,b(),r);a$1&&(u.metadata||(u.metadata={}),u.metadata.python={version:a$1}),await b$1(e,u),h.push(".rapidkit-workspace");}if(p){let f=m.join(e,".gitignore");(!y||!await P.pathExists(f))&&(await z(e),h.push(".gitignore"));}return h}var jt=new Set(["go-only","java-only","dotnet-only","node-only","minimal"]),Ot={"python-only":"minimal",polyglot:"node-only",enterprise:"polyglot"};function Vt(e){let o=e,n=new Set;for(;!jt.has(o);){if(n.has(o))return "minimal";n.add(o);let r=Ot[o];if(!r)return "minimal";o=r;}return o}var F="3.10",$t=["3.10","3.11","3.12"];async function Pt(e){try{let{stdout:o}=await execa(e,["--version"],{timeout:3e3}),n=o.match(/Python (\d+\.\d+\.\d+)/);if(n)return n[1]}catch{}return null}async function Lt(e,o){try{await promises.writeFile(m.join(e,".python-version"),`${o}
39
- `,"utf-8"),f.debug(`Created .python-version with ${o}`);}catch(n){f.warn(`Failed to create .python-version: ${n}`);}}function V(){let n=[...(process.env.PATH||"").split(m.delimiter).filter(Boolean)];for(let r of k$1())n.includes(r)||n.unshift(r);process.env.PATH=n.join(m.delimiter);}async function it(e,o){V(),e.start("Checking pipx installation");try{return await execa("pipx",["--version"]),e.succeed("pipx found"),{kind:"binary"}}catch{}let n=S();try{return await execa(n,["-m","pipx","--version"]),e.succeed("pipx found"),{kind:"python-module",pythonCmd:n}}catch{}if(o)throw new d$2;e.stop?.();let{installPipx:r}=await b$2([{type:"confirm",name:"installPipx",message:"pipx is not installed. Install it now (user install via python -m pip)?",default:true}]);if(!r)throw new d$2;e.start("Installing pipx (user install)");try{try{await execa(n,["-m","pip","install","--user","--upgrade","pip"]);}catch{}await execa(n,["-m","pip","install","--user","--upgrade","pipx"]);}catch(a){let c=a,d=String(c?.stderr||c?.shortMessage||c?.message||"");throw new f$2("Install pipx with python -m pip",a instanceof Error?a:new Error(d))}e.succeed("pipx installed"),V();try{return await execa(n,["-m","pipx","--version"]),{kind:"python-module",pythonCmd:n}}catch(a){let c=a,d=String(c?.stderr||c?.shortMessage||c?.message||"pipx not runnable after install");throw new f$2("Verify pipx after install",new Error(`${d}
39
+ `,"utf-8"),f.debug(`Created .python-version with ${o}`);}catch(n){f.warn(`Failed to create .python-version: ${n}`);}}function V(){let n=[...(process.env.PATH||"").split(m.delimiter).filter(Boolean)];for(let r of q())n.includes(r)||n.unshift(r);process.env.PATH=n.join(m.delimiter);}async function it(e,o){V(),e.start("Checking pipx installation");try{return await execa("pipx",["--version"]),e.succeed("pipx found"),{kind:"binary"}}catch{}let n=S();try{return await execa(n,["-m","pipx","--version"]),e.succeed("pipx found"),{kind:"python-module",pythonCmd:n}}catch{}if(o)throw new d$1;e.stop?.();let{installPipx:r}=await b$2([{type:"confirm",name:"installPipx",message:"pipx is not installed. Install it now (user install via python -m pip)?",default:true}]);if(!r)throw new d$1;e.start("Installing pipx (user install)");try{try{await execa(n,["-m","pip","install","--user","--upgrade","pip"]);}catch{}await execa(n,["-m","pip","install","--user","--upgrade","pipx"]);}catch(a){let c=a,d=String(c?.stderr||c?.shortMessage||c?.message||"");throw new f$1("Install pipx with python -m pip",a instanceof Error?a:new Error(d))}e.succeed("pipx installed"),V();try{return await execa(n,["-m","pipx","--version"]),{kind:"python-module",pythonCmd:n}}catch(a){let c=a,d=String(c?.stderr||c?.shortMessage||c?.message||"pipx not runnable after install");throw new f$1("Verify pipx after install",new Error(`${d}
40
40
 
41
- Try reopening your terminal or run: ${n} -m pipx ensurepath`))}}async function O(e,o){return e.kind==="binary"?execa("pipx",o):execa(e.pythonCmd,["-m","pipx",...o])}function Gt(e){let o=e.match(/^(\d+)\.(\d+)/);return o?`${o[1]}.${o[2]}`:null}function bt(e){if(!e)return null;let o=e.match(/Python\s+(\d+)\.(\d+)(?:\.\d+)?/i);return o?`${o[1]}.${o[2]}`:null}function ut(e,o){let[n,r]=e.split(".").map(d=>Number(d)),[a,c]=o.split(".").map(d=>Number(d));return n!==a?n-a:r-c}function U(e,o){return ut(e,o)>=0}async function Wt(e){let o=new Set,n=e$1(14,10);for(let s of n)try{let i=await execa(s.command,s.args,{timeout:2500}),f=bt(`${i.stdout||""}
41
+ Try reopening your terminal or run: ${n} -m pipx ensurepath`))}}async function O(e,o){return e.kind==="binary"?execa("pipx",o):execa(e.pythonCmd,["-m","pipx",...o])}function Gt(e){let o=e.match(/^(\d+)\.(\d+)/);return o?`${o[1]}.${o[2]}`:null}function bt(e){if(!e)return null;let o=e.match(/Python\s+(\d+)\.(\d+)(?:\.\d+)?/i);return o?`${o[1]}.${o[2]}`:null}function ut(e,o){let[n,r]=e.split(".").map(d=>Number(d)),[a,c]=o.split(".").map(d=>Number(d));return n!==a?n-a:r-c}function U(e,o){return ut(e,o)>=0}async function Wt(e){let o=new Set,n=j(14,10);for(let s of n)try{let i=await execa(s.command,s.args,{timeout:2500}),f=bt(`${i.stdout||""}
42
42
  ${i.stderr||""}`);f&&U(f,F)&&o.add(f);}catch{}let r=null;try{let s=await execa(S(),["--version"],{timeout:2500}),i=bt(`${s.stdout||""}
43
- ${s.stderr||""}`);i&&U(i,F)&&(r=i,o.add(i));}catch{}let a=$t.filter(s=>U(s,F)),c=new Set([...a,...o]),d=Array.from(c).sort((s,i)=>ut(i,s)),p=e?Gt(e):null,y=p&&U(p,F)?p:r||d[0]||F;return c.has(y)||c.add(y),{choices:Array.from(c).sort((s,i)=>ut(i,s)).map(s=>{let i=[];return s===r&&i.push("current system"),s===F&&i.push("minimum supported"),o.has(s)&&s!==r&&i.push("detected"),{name:i.length>0?`${s} (${i.join(", ")})`:s,value:s}}),defaultValue:y}}async function Ht(){V();let e=false,o=false;try{await execa("poetry",["--version"],{timeout:2500}),e=true;}catch{e=false;}try{await execa("pipx",["--version"],{timeout:2500}),o=true;}catch{let n=c$1();try{await execa(n,["-m","pipx","--version"],{timeout:2500}),o=true;}catch{o=false;}}return {poetry:e,pipx:o}}async function At(){V();try{return await execa("poetry",["--version"],{timeout:2500}),true}catch{return false}}function zt(e,o){return e==="poetry"&&o.poetry?"poetry":e==="pipx"&&o.pipx?"pipx":e==="venv"?"venv":o.poetry?"poetry":"venv"}async function Ut(e,o){V(),e.start("Checking Poetry installation");try{await execa("poetry",["--version"]),e.succeed("Poetry found");return}catch{}if(o)throw new c$2;let{installPoetry:n}=await b$2([{type:"confirm",name:"installPoetry",message:"Poetry is not installed. Install it now using pipx?",default:true}]);if(!n)throw new c$2;let r=await it(e,o);e.start("Installing Poetry with pipx");try{await O(r,["install","poetry"]);}catch(a){let c=a,d=String(c?.stderr||c?.shortMessage||c?.message||"");if(/already\s+installed|already\s+seems\s+to\s+be\s+installed|exists/i.test(d))try{await O(r,["upgrade","poetry"]);}catch{}else throw new f$2("Install Poetry with pipx",a instanceof Error?a:new Error(d))}e.succeed("Poetry installed"),V();try{await execa("poetry",["--version"]);}catch(a){let c=a,d=String(c?.stderr||c?.shortMessage||c?.message||"Poetry not found on PATH");throw new f$2("Verify Poetry after pipx install",new Error(`${d}
43
+ ${s.stderr||""}`);i&&U(i,F)&&(r=i,o.add(i));}catch{}let a=$t.filter(s=>U(s,F)),c=new Set([...a,...o]),d=Array.from(c).sort((s,i)=>ut(i,s)),p=e?Gt(e):null,y=p&&U(p,F)?p:r||d[0]||F;return c.has(y)||c.add(y),{choices:Array.from(c).sort((s,i)=>ut(i,s)).map(s=>{let i=[];return s===r&&i.push("current system"),s===F&&i.push("minimum supported"),o.has(s)&&s!==r&&i.push("detected"),{name:i.length>0?`${s} (${i.join(", ")})`:s,value:s}}),defaultValue:y}}async function Ht(){V();let e=false,o=false;try{await execa("poetry",["--version"],{timeout:2500}),e=true;}catch{e=false;}try{await execa("pipx",["--version"],{timeout:2500}),o=true;}catch{let n=h();try{await execa(n,["-m","pipx","--version"],{timeout:2500}),o=true;}catch{o=false;}}return {poetry:e,pipx:o}}async function At(){V();try{return await execa("poetry",["--version"],{timeout:2500}),true}catch{return false}}function zt(e,o){return e==="poetry"&&o.poetry?"poetry":e==="pipx"&&o.pipx?"pipx":e==="venv"?"venv":o.poetry?"poetry":"venv"}async function Ut(e,o){V(),e.start("Checking Poetry installation");try{await execa("poetry",["--version"]),e.succeed("Poetry found");return}catch{}if(o)throw new c$1;let{installPoetry:n}=await b$2([{type:"confirm",name:"installPoetry",message:"Poetry is not installed. Install it now using pipx?",default:true}]);if(!n)throw new c$1;let r=await it(e,o);e.start("Installing Poetry with pipx");try{await O(r,["install","poetry"]);}catch(a){let c=a,d=String(c?.stderr||c?.shortMessage||c?.message||"");if(/already\s+installed|already\s+seems\s+to\s+be\s+installed|exists/i.test(d))try{await O(r,["upgrade","poetry"]);}catch{}else throw new f$1("Install Poetry with pipx",a instanceof Error?a:new Error(d))}e.succeed("Poetry installed"),V();try{await execa("poetry",["--version"]);}catch(a){let c=a,d=String(c?.stderr||c?.shortMessage||c?.message||"Poetry not found on PATH");throw new f$1("Verify Poetry after pipx install",new Error(`${d}
44
44
 
45
45
  Poetry may be installed but not on PATH yet. Try reopening your terminal or run: pipx ensurepath`))}}function qt(e){let o=e==="poetry";return `#!/usr/bin/env sh
46
46
  set -eu
@@ -225,7 +225,7 @@ npx rapidkit dev
225
225
  \u{1F4A1} Profile management:`)),console.log(t.gray(" \u2022 Add Python? \u2192 rapidkit bootstrap --profile python-only|polyglot")),console.log(t.gray(" \u2022 Add Node.js? \u2192 rapidkit bootstrap --profile node-only|polyglot")),console.log(t.gray(" \u2022 Add Go? \u2192 rapidkit bootstrap --profile go-only|polyglot")),console.log(t.gray(" \u2022 Add .NET? \u2192 rapidkit bootstrap --profile dotnet-only|polyglot")),console.log(t.gray(" \u2022 Full setup? \u2192 rapidkit bootstrap --profile enterprise")),console.log(t.cyan(`
226
226
  \u{1F4D6} Common commands:`)),console.log(t.white(" rapidkit create - Create a new project (interactive)")),console.log(t.white(" rapidkit list - List available kits")),console.log(t.white(" rapidkit modules - List available modules")),console.log(t.white(" rapidkit doctor - Check workspace health")),console.log(t.white(` rapidkit bootstrap --help - Advanced workspace configuration
227
227
  `));try{let{stdout:b}=await execa("go",["version"],{timeout:3e3}),v=b.match(/go version go(\d+\.\d+(?:\.\d+)?)/),M=v?v[1]:"unknown";console.log(t.gray(`\u{1F439} Go ${M} detected \u2014 ready for gofiber.standard projects`));}catch{console.log(t.yellow("\u26A0\uFE0F Go not installed \u2014 needed for gofiber.standard/gogin.standard projects")),console.log(t.gray(" Install: https://go.dev/dl/"));}console.log("");}catch(w){I.fail("Failed to create RapidKit environment"),console.error(t.red(`
228
- \u274C Error:`),w);try{await P.remove(i);}catch{}throw w}}async function Mt(e){let o=[];if(!a$1())try{let{stdout:c}=await execa("pyenv",["which","python"]),d=c.trim();d&&o.push(d);}catch{}let n=Number(e.split(".")[1]),r=e$1(n,10).map(c=>c.command).filter(Boolean);o.push(`python${e}`,...r,...d$1());let a=[...new Set(o)];for(let c of a)try{let d=c==="py"?["-3","--version"]:["--version"],p=c==="py"?["-3","-c","import sys; sys.exit(0)"]:["-c","import sys; sys.exit(0)"],{stdout:y}=await execa(c,d,{timeout:2e3}),h=y.match(/Python (\d+\.\d+)/)?.[1];if(h&&U(h,e))return await execa(c,p,{timeout:2e3}),c}catch{continue}return null}async function Dt(e,o,n,r,a,c=false){await Ut(n,c),n.start("Finding Python interpreter");let d=await Mt(o);d?(f.debug(`Found working Python: ${d}`),n.succeed("Python found")):n.warn("Could not verify Python path, proceeding with default"),n.start("Initializing Poetry project");let p=m.join(e,"pyproject.toml"),h=(await P.pathExists(p)?await promises.readFile(p,"utf-8"):"").includes("rapidkit-core");if(h)n.succeed("Poetry project initialized");else {await execa("poetry",["init","--no-interaction","--python",`^${o}`],{cwd:e}),n.succeed("Poetry project initialized");let f=await promises.readFile(p,"utf-8");f.includes("[tool.poetry]")?f=f.replace("[tool.poetry]",`[tool.poetry]
228
+ \u274C Error:`),w);try{await P.remove(i);}catch{}throw w}}async function Mt(e){let o=[];if(!b$3())try{let{stdout:c}=await execa("pyenv",["which","python"]),d=c.trim();d&&o.push(d);}catch{}let n=Number(e.split(".")[1]),r=j(n,10).map(c=>c.command).filter(Boolean);o.push(`python${e}`,...r,...i());let a=[...new Set(o)];for(let c of a)try{let d=c==="py"?["-3","--version"]:["--version"],p=c==="py"?["-3","-c","import sys; sys.exit(0)"]:["-c","import sys; sys.exit(0)"],{stdout:y}=await execa(c,d,{timeout:2e3}),h=y.match(/Python (\d+\.\d+)/)?.[1];if(h&&U(h,e))return await execa(c,p,{timeout:2e3}),c}catch{continue}return null}async function Dt(e,o,n,r,a,c=false){await Ut(n,c),n.start("Finding Python interpreter");let d=await Mt(o);d?(f.debug(`Found working Python: ${d}`),n.succeed("Python found")):n.warn("Could not verify Python path, proceeding with default"),n.start("Initializing Poetry project");let p=m.join(e,"pyproject.toml"),h=(await P.pathExists(p)?await promises.readFile(p,"utf-8"):"").includes("rapidkit-core");if(h)n.succeed("Poetry project initialized");else {await execa("poetry",["init","--no-interaction","--python",`^${o}`],{cwd:e}),n.succeed("Poetry project initialized");let f=await promises.readFile(p,"utf-8");f.includes("[tool.poetry]")?f=f.replace("[tool.poetry]",`[tool.poetry]
229
229
  package-mode = false`):f.includes("[project]")&&(f.includes("[build-system]")?f=f.replace("[build-system]",`
230
230
  [tool.poetry]
231
231
  package-mode = false
@@ -234,32 +234,32 @@ package-mode = false
234
234
 
235
235
  [tool.poetry]
236
236
  package-mode = false
237
- `),await promises.writeFile(p,f,"utf-8");}n.start("Configuring Poetry");try{await execa("poetry",["config","virtualenvs.in-project","true","--local"],{cwd:e}),n.succeed("Poetry configured");}catch{n.warn("Could not configure Poetry virtualenvs.in-project");}n.start("Creating virtualenv");let g$1=d||S(),s=f$1(m.join(e,".venv"));try{await execa(g$1,["-m","venv",".venv"],{cwd:e,timeout:6e4}),n.succeed("Virtualenv created");}catch(i){f.debug(`python -m venv failed: ${i}`),n.warn("Could not pre-create virtualenv, Poetry will try"),s=d||S();}try{await execa("poetry",["env","use",s||S()],{cwd:e}),f.debug(`Poetry env set to: ${s}`);}catch(i){f.debug(`Could not set Poetry env: ${i}`);}if(n.start("Installing RapidKit"),h&&!r){let i=e$2(a||{}),f$1=i?await P.pathExists(i):false,u=f$1&&i?i:"rapidkit-core";i&&!f$1&&f.warn(`RAPIDKIT_DEV_PATH is set but path does not exist: ${i}. Falling back to PyPI.`),n.text=f$1?"Installing RapidKit from local path":"Installing RapidKit from PyPI";let E=false,T=null;for(let _=1;_<=3;_++)try{f$1||e$3({status:"started",message:"Installing RapidKit from PyPI",installMethod:"poetry",attempt:_,maxAttempts:3}),await execa(s,["-m","pip","install",u,"--quiet"],{cwd:e,timeout:18e4}),E=true,f$1||e$3({status:"succeeded",message:"RapidKit installed from PyPI",installMethod:"poetry",attempt:_,maxAttempts:3});break}catch(L){T=L,f.debug(`pip install rapidkit-core attempt ${_} failed: ${L}`),_<3&&(n.text=`Retrying installation (attempt ${_+1}/3)`,await new Promise(X=>setTimeout(X,2e3)));}if(!E){let _=T?.stderr||T?.message||"Unknown error";throw f.debug(`All pip install attempts failed. Last error: ${_}`),_.includes("Could not find")||_.includes("No matching distribution")?new g:new f$2("Install rapidkit-core with pip",new Error(`Failed to install rapidkit-core after 3 attempts.
237
+ `),await promises.writeFile(p,f,"utf-8");}n.start("Configuring Poetry");try{await execa("poetry",["config","virtualenvs.in-project","true","--local"],{cwd:e}),n.succeed("Poetry configured");}catch{n.warn("Could not configure Poetry virtualenvs.in-project");}n.start("Creating virtualenv");let g$1=d||S(),s=l(m.join(e,".venv"));try{await execa(g$1,["-m","venv",".venv"],{cwd:e,timeout:6e4}),n.succeed("Virtualenv created");}catch(i){f.debug(`python -m venv failed: ${i}`),n.warn("Could not pre-create virtualenv, Poetry will try"),s=d||S();}try{await execa("poetry",["env","use",s||S()],{cwd:e}),f.debug(`Poetry env set to: ${s}`);}catch(i){f.debug(`Could not set Poetry env: ${i}`);}if(n.start("Installing RapidKit"),h&&!r){let i=e$1(a||{}),f$2=i?await P.pathExists(i):false,u=f$2&&i?i:"rapidkit-core";i&&!f$2&&f.warn(`RAPIDKIT_DEV_PATH is set but path does not exist: ${i}. Falling back to PyPI.`),n.text=f$2?"Installing RapidKit from local path":"Installing RapidKit from PyPI";let E=false,T=null;for(let _=1;_<=3;_++)try{f$2||e$2({status:"started",message:"Installing RapidKit from PyPI",installMethod:"poetry",attempt:_,maxAttempts:3}),await execa(s,["-m","pip","install",u,"--quiet"],{cwd:e,timeout:18e4}),E=true,f$2||e$2({status:"succeeded",message:"RapidKit installed from PyPI",installMethod:"poetry",attempt:_,maxAttempts:3});break}catch(L){T=L,f.debug(`pip install rapidkit-core attempt ${_} failed: ${L}`),_<3&&(n.text=`Retrying installation (attempt ${_+1}/3)`,await new Promise(X=>setTimeout(X,2e3)));}if(!E){let _=T?.stderr||T?.message||"Unknown error";throw f.debug(`All pip install attempts failed. Last error: ${_}`),_.includes("Could not find")||_.includes("No matching distribution")?new g:new f$1("Install rapidkit-core with pip",new Error(`Failed to install rapidkit-core after 3 attempts.
238
238
  Error: ${_}
239
239
 
240
240
  Possible solutions:
241
241
  1. Check your internet connection
242
242
  2. Try installing manually: cd ${m.basename(e)} && poetry add rapidkit-core
243
- 3. Use venv method instead: npx rapidkit ${m.basename(e)} --install-method=venv`))}}else {n.text="Syncing Poetry environment";try{await execa("poetry",["install","--no-root"],{cwd:e,timeout:12e4}),n.succeed("Poetry environment synced");}catch(i){f.debug(`poetry install --no-root failed: ${i}`),n.warn("Could not sync Poetry environment, proceeding with add command");}if(n.start("Installing RapidKit"),r){let i=e$2(a||{});if(!i)throw new f$2("Test mode installation",new Error("No local RapidKit path configured. Set RAPIDKIT_DEV_PATH environment variable."));f.debug(`Installing from local path: ${i}`),n.text="Installing RapidKit from local path (test mode)",await execa("poetry",["add",i],{cwd:e});}else {n.text="Installing RapidKit from PyPI";let i=false,f$1=null;for(let u=1;u<=3;u++)try{e$3({status:"started",message:"Installing RapidKit from PyPI",installMethod:"poetry",attempt:u,maxAttempts:3}),await execa("poetry",["add","rapidkit-core"],{cwd:e,timeout:6e4*u}),i=true,e$3({status:"succeeded",message:"RapidKit installed from PyPI",installMethod:"poetry",attempt:u,maxAttempts:3});break}catch(E){f$1=E,f.debug(`Poetry add attempt ${u} failed: ${E}`),u<3&&(n.text=`Retrying installation (attempt ${u+1}/3)`,await new Promise(T=>setTimeout(T,2e3)));}if(!i){let u=f$1?.stderr||f$1?.message||"Unknown error";throw f.debug(`All Poetry install attempts failed. Last error: ${u}`),u.includes("Could not find")||u.includes("No matching distribution")?new g:new f$2("Install rapidkit-core with Poetry",new Error(`Failed to install rapidkit-core after 3 attempts.
243
+ 3. Use venv method instead: npx rapidkit ${m.basename(e)} --install-method=venv`))}}else {n.text="Syncing Poetry environment";try{await execa("poetry",["install","--no-root"],{cwd:e,timeout:12e4}),n.succeed("Poetry environment synced");}catch(i){f.debug(`poetry install --no-root failed: ${i}`),n.warn("Could not sync Poetry environment, proceeding with add command");}if(n.start("Installing RapidKit"),r){let i=e$1(a||{});if(!i)throw new f$1("Test mode installation",new Error("No local RapidKit path configured. Set RAPIDKIT_DEV_PATH environment variable."));f.debug(`Installing from local path: ${i}`),n.text="Installing RapidKit from local path (test mode)",await execa("poetry",["add",i],{cwd:e});}else {n.text="Installing RapidKit from PyPI";let i=false,f$2=null;for(let u=1;u<=3;u++)try{e$2({status:"started",message:"Installing RapidKit from PyPI",installMethod:"poetry",attempt:u,maxAttempts:3}),await execa("poetry",["add","rapidkit-core"],{cwd:e,timeout:6e4*u}),i=true,e$2({status:"succeeded",message:"RapidKit installed from PyPI",installMethod:"poetry",attempt:u,maxAttempts:3});break}catch(E){f$2=E,f.debug(`Poetry add attempt ${u} failed: ${E}`),u<3&&(n.text=`Retrying installation (attempt ${u+1}/3)`,await new Promise(T=>setTimeout(T,2e3)));}if(!i){let u=f$2?.stderr||f$2?.message||"Unknown error";throw f.debug(`All Poetry install attempts failed. Last error: ${u}`),u.includes("Could not find")||u.includes("No matching distribution")?new g:new f$1("Install rapidkit-core with Poetry",new Error(`Failed to install rapidkit-core after 3 attempts.
244
244
  Error: ${u}
245
245
 
246
246
  Possible solutions:
247
247
  1. Check your internet connection
248
248
  2. Try installing manually: cd ${m.basename(e)} && poetry add rapidkit-core
249
- 3. Use venv method instead: npx rapidkit ${m.basename(e)} --install-method=venv`))}}}n.succeed("RapidKit installed in project virtualenv");try{let{checkRapidkitCoreAvailable:i}=await import('./pythonRapidkitExec-MNWRC4F2.js');if(!await i()&&!r){n.start("Checking optional global pipx installation");let u=await it(n,true);try{n.start("Installing RapidKit globally with pipx for CLI access"),await O(u,["install","rapidkit-core"]),n.succeed("RapidKit installed globally");}catch(E){n.warn("Could not install globally (non-fatal, project virtualenv has RapidKit)"),f.debug(`pipx install failed: ${E}`);}}}catch(i){n.succeed("Skipped optional global pipx installation"),f.debug(`Global install check skipped: ${i}`);}}async function yt(e,o,n,r,a,c=false){n.start(`Checking Python ${o}`);let d=S();try{let{stdout:y}=await execa(d,["--version"]),h=y.match(/Python (\d+\.\d+)/)?.[1];if(h&&!U(h,o))throw new b$3(o,h);n.succeed(`Python ${h} found`);}catch(y){throw y instanceof b$3?y:new b$3(o)}n.start("Creating virtual environment");try{await execa(d,["-m","venv",".venv"],{cwd:e}),n.succeed("Virtual environment created");}catch(y){if(n.fail("Failed to create virtual environment"),(g=>typeof g=="object"&&g!==null&&"stdout"in g&&typeof g.stdout=="string")(y)&&y.stdout.includes("ensurepip is not")){let g=y.stdout.match(/apt install (python[\d.]+-venv)/),s=g?g[1]:"python3-venv";throw new f$2("Python venv module not available",new Error(`Virtual environment creation failed.
249
+ 3. Use venv method instead: npx rapidkit ${m.basename(e)} --install-method=venv`))}}}n.succeed("RapidKit installed in project virtualenv");try{let{checkRapidkitCoreAvailable:i}=await import('./pythonRapidkitExec-SGKW76XM.js');if(!await i()&&!r){n.start("Checking optional global pipx installation");let u=await it(n,true);try{n.start("Installing RapidKit globally with pipx for CLI access"),await O(u,["install","rapidkit-core"]),n.succeed("RapidKit installed globally");}catch(E){n.warn("Could not install globally (non-fatal, project virtualenv has RapidKit)"),f.debug(`pipx install failed: ${E}`);}}}catch(i){n.succeed("Skipped optional global pipx installation"),f.debug(`Global install check skipped: ${i}`);}}async function yt(e,o,n,r,a,c=false){n.start(`Checking Python ${o}`);let d=S();try{let{stdout:y}=await execa(d,["--version"]),h=y.match(/Python (\d+\.\d+)/)?.[1];if(h&&!U(h,o))throw new b$4(o,h);n.succeed(`Python ${h} found`);}catch(y){throw y instanceof b$4?y:new b$4(o)}n.start("Creating virtual environment");try{await execa(d,["-m","venv",".venv"],{cwd:e}),n.succeed("Virtual environment created");}catch(y){if(n.fail("Failed to create virtual environment"),(g=>typeof g=="object"&&g!==null&&"stdout"in g&&typeof g.stdout=="string")(y)&&y.stdout.includes("ensurepip is not")){let g=y.stdout.match(/apt install (python[\d.]+-venv)/),s=g?g[1]:"python3-venv";throw new f$1("Python venv module not available",new Error(`Virtual environment creation failed.
250
250
 
251
251
  On Debian/Ubuntu systems, install the venv package:
252
252
  sudo apt install ${s}
253
253
 
254
254
  Or use Poetry instead (recommended):
255
- npx rapidkit ${m.basename(e)} --yes`))}throw new f$2("Virtual environment creation",y instanceof Error?y:new Error(String(y)))}n.start("Installing RapidKit");let p=f$1(m.join(e,".venv"));if(await execa(p,["-m","pip","install","--upgrade","pip"],{cwd:e}),r){let y=e$2(a||{});if(!y)throw new f$2("Test mode installation",new Error("No local RapidKit path configured. Set RAPIDKIT_DEV_PATH environment variable."));f.debug(`Installing from local path: ${y}`),n.text="Installing RapidKit from local path (test mode)",await execa(p,["-m","pip","install","-e",y],{cwd:e});}else {n.text="Installing RapidKit from PyPI";let y=false,h=null;for(let g=1;g<=3;g++)try{e$3({status:"started",message:"Installing RapidKit from PyPI",installMethod:"venv",attempt:g,maxAttempts:3}),await execa(p,["-m","pip","install","rapidkit-core"],{cwd:e,timeout:6e4*g}),y=true,e$3({status:"succeeded",message:"RapidKit installed from PyPI",installMethod:"venv",attempt:g,maxAttempts:3});break}catch(s){h=s,f.debug(`pip install attempt ${g} failed: ${s}`),g<3&&(n.text=`Retrying installation (attempt ${g+1}/3)`,await new Promise(i=>setTimeout(i,2e3)));}if(!y){let g$1=h?.stderr||h?.message||"Unknown error";throw f.debug(`All pip install attempts failed. Last error: ${g$1}`),g$1.includes("Could not find")||g$1.includes("No matching distribution")?new g:new f$2("Install rapidkit-core with pip",new Error(`Failed to install rapidkit-core after 3 attempts.
255
+ npx rapidkit ${m.basename(e)} --yes`))}throw new f$1("Virtual environment creation",y instanceof Error?y:new Error(String(y)))}n.start("Installing RapidKit");let p=l(m.join(e,".venv"));if(await execa(p,["-m","pip","install","--upgrade","pip"],{cwd:e}),r){let y=e$1(a||{});if(!y)throw new f$1("Test mode installation",new Error("No local RapidKit path configured. Set RAPIDKIT_DEV_PATH environment variable."));f.debug(`Installing from local path: ${y}`),n.text="Installing RapidKit from local path (test mode)",await execa(p,["-m","pip","install","-e",y],{cwd:e});}else {n.text="Installing RapidKit from PyPI";let y=false,h=null;for(let g=1;g<=3;g++)try{e$2({status:"started",message:"Installing RapidKit from PyPI",installMethod:"venv",attempt:g,maxAttempts:3}),await execa(p,["-m","pip","install","rapidkit-core"],{cwd:e,timeout:6e4*g}),y=true,e$2({status:"succeeded",message:"RapidKit installed from PyPI",installMethod:"venv",attempt:g,maxAttempts:3});break}catch(s){h=s,f.debug(`pip install attempt ${g} failed: ${s}`),g<3&&(n.text=`Retrying installation (attempt ${g+1}/3)`,await new Promise(i=>setTimeout(i,2e3)));}if(!y){let g$1=h?.stderr||h?.message||"Unknown error";throw f.debug(`All pip install attempts failed. Last error: ${g$1}`),g$1.includes("Could not find")||g$1.includes("No matching distribution")?new g:new f$1("Install rapidkit-core with pip",new Error(`Failed to install rapidkit-core after 3 attempts.
256
256
  Error: ${g$1}
257
257
 
258
258
  Possible solutions:
259
259
  1. Check your internet connection
260
- 2. Try installing manually: cd ${m.basename(e)} && ${f$1(".venv")} -m pip install rapidkit-core
261
- 3. Use Poetry instead: npx rapidkit ${m.basename(e)} --install-method=poetry`))}}n.succeed("RapidKit installed in project virtualenv");try{let{checkRapidkitCoreAvailable:y}=await import('./pythonRapidkitExec-MNWRC4F2.js');if(!await y()&&!r){n.start("Checking optional global pipx installation");let g=await it(n,true);try{n.start("Installing RapidKit globally with pipx for CLI access"),await O(g,["install","rapidkit-core"]),n.succeed("RapidKit installed globally");}catch(s){n.warn("Could not install globally (non-fatal, project virtualenv has RapidKit)"),f.debug(`pipx install failed: ${s}`);}}}catch(y){n.succeed("Skipped optional global pipx installation"),f.debug(`Global install check skipped: ${y}`);}}async function Kt(e,o,n,r,a=false){if(!n)try{let{checkRapidkitCoreVersionCompatible:d}=await import('./pythonRapidkitExec-MNWRC4F2.js'),p=await d();if(p.isCompatible){o.succeed(`RapidKit ${p.installedVersion??""} already compatible globally; skipping pipx installation`),await P.outputFile(m.join(e,".rapidkit-global"),`RapidKit already available globally (version ${p.installedVersion??"unknown"}) and satisfies expected constraint ${p.expectedConstraint??"n/a"}; workspace will reuse the existing installation
262
- `,"utf-8");return}p.reason==="constraint-missing"?o.warn('Version-aware global reuse skipped: no explicit rapidkit-core version constraint found. Set RAPIDKIT_CORE_PYTHON_PACKAGE (example: RAPIDKIT_CORE_PYTHON_PACKAGE="rapidkit-core>=0.4.0,<0.9.0") to enable version-aware reuse. Proceeding with pipx install/upgrade.'):p.reason==="constraint-unsupported"&&o.warn('Version-aware global reuse skipped: RAPIDKIT_CORE_PYTHON_PACKAGE uses an unsupported spec (path/url/git). Use a version range instead (example: RAPIDKIT_CORE_PYTHON_PACKAGE="rapidkit-core==0.4.0" or "rapidkit-core>=0.4.0,<0.9.0"). Proceeding with pipx install/upgrade.'),f.debug(`Global RapidKit install is not reusable via version-aware policy (reason=${p.reason}, installed=${p.installedVersion??"unknown"}, expected=${p.expectedConstraint??"none"}). Proceeding with pipx install/upgrade.`);}catch(d){f.debug(`Global RapidKit version-aware check failed before pipx install: ${d}`);}let c=await it(o,a);if(o.start("Installing RapidKit globally with pipx"),n){let d=e$2(r||{});if(!d)throw new f$2("Test mode installation",new Error("No local RapidKit path configured. Set RAPIDKIT_DEV_PATH environment variable."));f.debug(`Installing from local path: ${d}`),o.text="Installing RapidKit from local path (test mode)",await O(c,["install","-e",d]);}else {o.text="Installing RapidKit from PyPI",e$3({status:"started",message:"Installing RapidKit from PyPI",installMethod:"pipx"});try{await O(c,["install","rapidkit-core"]),e$3({status:"succeeded",message:"RapidKit installed from PyPI",installMethod:"pipx"});}catch(d){try{o.text="RapidKit already installed globally, upgrading to match expected version",await O(c,["upgrade","rapidkit-core"]),e$3({status:"succeeded",message:"RapidKit upgraded from PyPI",installMethod:"pipx"});}catch(p){throw f.debug(`pipx install/upgrade failed: install=${d}, upgrade=${p}`),new g}}}o.succeed("RapidKit installed globally"),await P.outputFile(m.join(e,".rapidkit-global"),`RapidKit installed globally with pipx
260
+ 2. Try installing manually: cd ${m.basename(e)} && ${l(".venv")} -m pip install rapidkit-core
261
+ 3. Use Poetry instead: npx rapidkit ${m.basename(e)} --install-method=poetry`))}}n.succeed("RapidKit installed in project virtualenv");try{let{checkRapidkitCoreAvailable:y}=await import('./pythonRapidkitExec-SGKW76XM.js');if(!await y()&&!r){n.start("Checking optional global pipx installation");let g=await it(n,true);try{n.start("Installing RapidKit globally with pipx for CLI access"),await O(g,["install","rapidkit-core"]),n.succeed("RapidKit installed globally");}catch(s){n.warn("Could not install globally (non-fatal, project virtualenv has RapidKit)"),f.debug(`pipx install failed: ${s}`);}}}catch(y){n.succeed("Skipped optional global pipx installation"),f.debug(`Global install check skipped: ${y}`);}}async function Kt(e,o,n,r,a=false){if(!n)try{let{checkRapidkitCoreVersionCompatible:d}=await import('./pythonRapidkitExec-SGKW76XM.js'),p=await d();if(p.isCompatible){o.succeed(`RapidKit ${p.installedVersion??""} already compatible globally; skipping pipx installation`),await P.outputFile(m.join(e,".rapidkit-global"),`RapidKit already available globally (version ${p.installedVersion??"unknown"}) and satisfies expected constraint ${p.expectedConstraint??"n/a"}; workspace will reuse the existing installation
262
+ `,"utf-8");return}p.reason==="constraint-missing"?o.warn('Version-aware global reuse skipped: no explicit rapidkit-core version constraint found. Set RAPIDKIT_CORE_PYTHON_PACKAGE (example: RAPIDKIT_CORE_PYTHON_PACKAGE="rapidkit-core>=0.4.0,<0.9.0") to enable version-aware reuse. Proceeding with pipx install/upgrade.'):p.reason==="constraint-unsupported"&&o.warn('Version-aware global reuse skipped: RAPIDKIT_CORE_PYTHON_PACKAGE uses an unsupported spec (path/url/git). Use a version range instead (example: RAPIDKIT_CORE_PYTHON_PACKAGE="rapidkit-core==0.4.0" or "rapidkit-core>=0.4.0,<0.9.0"). Proceeding with pipx install/upgrade.'),f.debug(`Global RapidKit install is not reusable via version-aware policy (reason=${p.reason}, installed=${p.installedVersion??"unknown"}, expected=${p.expectedConstraint??"none"}). Proceeding with pipx install/upgrade.`);}catch(d){f.debug(`Global RapidKit version-aware check failed before pipx install: ${d}`);}let c=await it(o,a);if(o.start("Installing RapidKit globally with pipx"),n){let d=e$1(r||{});if(!d)throw new f$1("Test mode installation",new Error("No local RapidKit path configured. Set RAPIDKIT_DEV_PATH environment variable."));f.debug(`Installing from local path: ${d}`),o.text="Installing RapidKit from local path (test mode)",await O(c,["install","-e",d]);}else {o.text="Installing RapidKit from PyPI",e$2({status:"started",message:"Installing RapidKit from PyPI",installMethod:"pipx"});try{await O(c,["install","rapidkit-core"]),e$2({status:"succeeded",message:"RapidKit installed from PyPI",installMethod:"pipx"});}catch(d){try{o.text="RapidKit already installed globally, upgrading to match expected version",await O(c,["upgrade","rapidkit-core"]),e$2({status:"succeeded",message:"RapidKit upgraded from PyPI",installMethod:"pipx"});}catch(p){throw f.debug(`pipx install/upgrade failed: install=${d}, upgrade=${p}`),new g}}}o.succeed("RapidKit installed globally"),await P.outputFile(m.join(e,".rapidkit-global"),`RapidKit installed globally with pipx
263
263
  `,"utf-8");}async function be(e,o){let{skipGit:n=false,testMode:r=false,userConfig:a={},yes:c$1=false,installMethod:d,pythonVersion:p="3.10"}=o||{},y=d||a.defaultInstallMethod||await(async()=>{try{return await execa("poetry",["--version"],{timeout:3e3}),"poetry"}catch{return f.warn("Poetry not found \u2014 auto-selecting venv. Pass --install-method poetry to override."),"venv"}})(),h=y==="poetry"&&!await At()?"venv":y;await B(e,m.basename(e),h),await z(e),await Q(e,m.basename(e),h,p,o?.profile);let g=c("Registering workspace",{component:"create",phase:"workspace.register"});try{if(h==="poetry"?(await J(e,m.basename(e)),await Dt(e,p,g,r,a,c$1)):h==="venv"?await yt(e,p,g,r,a):await Kt(e,g,r,a,c$1),await St(e,h),await Tt(e,h),g.succeed("Workspace registered"),await H(e,{workspaceName:m.basename(e),silent:r}),!n){g.start("Initializing git repository");try{await execa("git",["init"],{cwd:e}),await execa("git",["add","."],{cwd:e}),await execa("git",["commit","-m","Initial commit: RapidKit workspace"],{cwd:e}),g.succeed("Git repository initialized");}catch{g.warn("Could not initialize git repository");}}}catch(s){throw g.fail("Failed to register workspace"),s}}async function Tt(e,o){let n=o==="poetry"?`source $(poetry env info --path)/bin/activate
264
264
  # Or simply use: poetry run rapidkit <command>`:o==="venv"?"source .venv/bin/activate # On Windows: .venv\\Scripts\\activate":"N/A (globally installed)",r=o==="poetry"?`# No activation needed (recommended):
265
265
  ./rapidkit --help
@@ -269,7 +269,7 @@ poetry run rapidkit --help`:o==="venv"?`# No activation needed (recommended):
269
269
  # or direct:
270
270
  ./.venv/bin/rapidkit --help`:`# Optional: use the local launcher
271
271
  ./rapidkit --help
272
- # (pipx installs may require Poetry/venv to be present in this folder)`,a=a$1()?"python --version (or: py -3 --version)":"python3 --version (or: python --version)",c=`# RapidKit Workspace
272
+ # (pipx installs may require Poetry/venv to be present in this folder)`,a=b$3()?"python --version (or: py -3 --version)":"python3 --version (or: python --version)",c=`# RapidKit Workspace
273
273
 
274
274
  This directory contains a RapidKit development environment.
275
275
 
@@ -0,0 +1,2 @@
1
+ import {d,a,b,e}from'./chunk-64RTZBHU.js';import {n,q,g}from'./chunk-YBS2HGO3.js';import {h,i,f,e as e$1}from'./chunk-UZW5QFRW.js';import {d as d$1}from'./chunk-S5KTATOU.js';import {a as a$1}from'./chunk-VKLL63TL.js';import {e as e$2,g as g$1}from'./chunk-WRMCPKGA.js';import _ from'fs';import w from'path';import S from'chalk';import {execa}from'execa';function be(e){return _.existsSync(w.join(e,"bun.lock"))||_.existsSync(w.join(e,"bunfig.toml"))?"bun":_.existsSync(w.join(e,"pnpm-lock.yaml"))?"pnpm":_.existsSync(w.join(e,"yarn.lock"))?"yarn":(_.existsSync(w.join(e,"package-lock.json")),"npm")}function xe(e,r,t=be(e)){return t==="npm"?`npm run ${r}`:`${t} run ${r}`}function Re(e,r=be(e)){return `${r} install`}var Me={"python-fastapi":{runtime:"python",framework:"FastAPI",markers:["pyproject.toml","fastapi"],commands:{init:"python -m pip install -e .",test:"pytest",build:"python -m build",start:"uvicorn main:app --reload"},errorPatterns:{setup:["ModuleNotFoundError","No module named","pip: command not found"],"test-failure":["FAILED","ERROR","test session started"],dependency:["ImportError","missing.*dependency"],runtime:["TypeError","AttributeError","ValueError"],timeout:["timeout","Timeout","timed out"],unknown:[]},healthCheck:{stage:"start",type:"http",value:"http://localhost:8000/docs"},validation:{command:"python -m pip list | grep fastapi",error:"FastAPI not installed"}},"python-django":{runtime:"python",framework:"Django",markers:["manage.py","django"],commands:{init:"python manage.py migrate",test:"python manage.py test",build:"python manage.py collectstatic --noinput",start:"python manage.py runserver 0.0.0.0:8000"},errorPatterns:{setup:["ModuleNotFoundError","ProgrammingError.*migrate"],"test-failure":["FAILED","ERROR","Ran.*test"],dependency:["ImportError","missing.*dependency"],runtime:["DatabaseError","ImproperlyConfigured"],timeout:["timeout","Timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:8e3},dependencies:["init"]},"node-nestjs":{runtime:"node",framework:"NestJS",markers:["package.json","@nestjs/core"],commands:{init:"npm install",test:"npm run test",build:"npm run build",start:"npm run start"},errorPatterns:{setup:["npm ERR!","ENOENT","not found"],"test-failure":["Tests.*failed","FAIL","fail.*test"],dependency:["Cannot find module","ERR_MODULE_NOT_FOUND"],runtime:["TypeError","Error: ","ReferenceError"],timeout:["timeout","TIMEOUT"],unknown:[]},healthCheck:{stage:"start",type:"port",value:3e3}},"node-express":{runtime:"node",framework:"Express",markers:["package.json","express"],commands:{init:"npm install",test:"npm run test",build:"npm run build",start:"npm start"},errorPatterns:{setup:["npm ERR!","ENOENT"],"test-failure":["failed","FAIL"],dependency:["Cannot find module"],runtime:["Error","TypeError"],timeout:["timeout"],unknown:[]}},"go-fiber":{runtime:"go",framework:"Fiber",markers:["go.mod","fiber"],commands:{init:"go mod download && go mod tidy",test:"go test ./...",build:"go build -o app .",start:"./app"},errorPatterns:{setup:["go: .*not found","cannot find","go mod tidy"],"test-failure":["FAIL","--- FAIL"],dependency:["missing.*module"],runtime:["panic","fatal","Error"],timeout:["timeout","context deadline"],unknown:[]},dependencies:["init"]},"go-gin":{runtime:"go",framework:"Gin",markers:["go.mod","gin-gonic"],commands:{init:"go mod download && go mod tidy",test:"go test ./...",build:"go build -o app .",start:"./app"},errorPatterns:{setup:["go: .*not found"],"test-failure":["FAIL"],dependency:["missing.*module"],runtime:["panic"],timeout:["timeout"],unknown:[]}},"java-springboot":{runtime:"java",framework:"Spring Boot",markers:["pom.xml","build.gradle","spring-boot"],commands:{init:"mvn dependency:go-offline",test:"mvn test",build:"mvn package -DskipTests",start:"mvn spring-boot:run"},errorPatterns:{setup:["\\[ERROR\\]","BUILD FAILURE","missing dependencies"],"test-failure":["\\[ERROR\\] Tests run:","BUILD FAILURE"],dependency:["missing.*dependency"],runtime:["Exception","Error","NullPointerException"],timeout:["timeout","Timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:8080}},"php-laravel":{runtime:"php",framework:"Laravel",markers:["composer.json","artisan","app/Models"],commands:{init:"composer install && php artisan migrate:fresh --seed",test:"php artisan test",build:"php artisan config:cache && php artisan route:cache && php artisan view:cache",start:"php artisan serve --host=0.0.0.0 --port=8000"},errorPatterns:{setup:["Composer.*lock","Fatal error","Class.*not found"],"test-failure":["FAILED","Tests.*failed"],dependency:["Class.*not found","require.*failed"],runtime:["Fatal error","Exception","Error"],timeout:["timeout","Timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:8e3},dependencies:["init"]},"php-symfony":{runtime:"php",framework:"Symfony",markers:["composer.json","symfony.lock","bin/console"],commands:{init:"composer install && php bin/console doctrine:database:create",test:"php bin/phpunit",build:"php bin/console cache:clear --env=prod",start:"symfony serve --no-tls"},errorPatterns:{setup:["Composer.*error","Fatal error"],"test-failure":["FAILED","failure"],dependency:["Class.*not found"],runtime:["Fatal error","Exception"],timeout:["timeout"],unknown:[]},dependencies:["init"]},"rust-actix":{runtime:"rust",framework:"Actix-web",markers:["Cargo.toml","actix"],commands:{init:"cargo fetch",test:"cargo test",build:"cargo build --release",start:"cargo run --release"},errorPatterns:{setup:["error: .*could not find","failed.*download"],"test-failure":["test result:","FAILED"],dependency:["can.t find.*crate"],runtime:["error\\[E","thread.*panicked"],timeout:["timeout"],unknown:[]},validation:{command:"cargo --version",error:"Rust/Cargo not installed"}},"rust-axum":{runtime:"rust",framework:"Axum",markers:["Cargo.toml","axum"],commands:{init:"cargo fetch",test:"cargo test",build:"cargo build --release",start:"cargo run --release"},errorPatterns:{setup:["error: .*could not find"],"test-failure":["test result:","FAILED"],dependency:["can.t find.*crate"],runtime:["error\\[E"],timeout:["timeout"],unknown:[]}},"rust-rocket":{runtime:"rust",framework:"Rocket",markers:["Cargo.toml","rocket"],commands:{init:"cargo fetch",test:"cargo test",build:"cargo build --release",start:"cargo run --release"},errorPatterns:{setup:["error: .*could not find"],"test-failure":["FAILED"],dependency:["can.t find"],runtime:["error\\[E"],timeout:["timeout"],unknown:[]}},"dotnet-aspnetcore":{runtime:"dotnet",framework:"ASP.NET Core",markers:[".csproj",".sln","Program.cs"],commands:{init:"dotnet restore",test:"dotnet test",build:"dotnet build -c Release",start:"dotnet run"},errorPatterns:{setup:["error CS","CSPROJ.*not found","NuGet.*restore"],"test-failure":["Failed:.*test","FAILED"],dependency:["error NU1101"],runtime:["error CS","Exception"],timeout:["timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:5e3}},"elixir-phoenix":{runtime:"elixir",framework:"Phoenix",markers:["mix.exs","phoenix"],commands:{init:"mix setup",test:"mix test",build:"mix compile --all-warnings",start:"mix phx.server"},errorPatterns:{setup:["\\*\\* \\(.*Error\\)","Mix.InstallError"],"test-failure":["\\d+\\sfailed","FAILED"],dependency:["dependencies are not available"],runtime:["\\*\\* \\(","RuntimeError"],timeout:["timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:4e3},dependencies:["init"]},"ruby-rails":{runtime:"ruby",framework:"Rails",markers:["Gemfile","config/application.rb","bin/rails"],commands:{init:"bundle install && rails db:prepare",test:"rails test",build:"rails assets:precompile",start:"rails server --binding=0.0.0.0 --port=3000"},errorPatterns:{setup:["Bundler::.*Error","Gem::.*Error"],"test-failure":["failures,","error,","FAILED"],dependency:["Could not find.*gem"],runtime:["Error","Exception","NoMethodError"],timeout:["timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:3e3},dependencies:["init"]},"ruby-sinatra":{runtime:"ruby",framework:"Sinatra",markers:["Gemfile","app.rb","sinatra"],commands:{init:"bundle install",test:"rspec",build:`echo "Sinatra apps don't require build"`,start:"ruby app.rb"},errorPatterns:{setup:["Bundler.*Error","Gem.*Error"],"test-failure":["failure","FAILED"],dependency:["Could not find.*gem"],runtime:["Error","NoMethodError"],timeout:["timeout"],unknown:[]}}},Oe={init:{python:["pip install -e .","poetry install","pip install -r requirements.txt"],node:["npm install","pnpm install","yarn install"],go:["go mod download && go mod tidy","go get ./..."],java:["mvn dependency:go-offline","gradle dependencies"],php:["composer install"],rust:["cargo fetch"],dotnet:["dotnet restore"],elixir:["mix deps.get"],ruby:["bundle install"],"jvm-generic":["mvn dependency:go-offline","gradle dependencies"],unknown:[]},test:{python:["pytest","python -m unittest","python -m pytest"],node:["npm test","npm run test"],go:["go test ./...","make test"],java:["mvn test","gradle test"],php:["php artisan test","phpunit","pest"],rust:["cargo test"],dotnet:["dotnet test"],elixir:["mix test"],ruby:["rspec","ruby -m minitest"],"jvm-generic":["mvn test","gradle test"],unknown:[]},build:{python:["python -m build","python setup.py build"],node:["npm run build"],go:["go build -o app .","go build ./..."],java:["mvn package -DskipTests","gradle build -x test"],php:['echo "PHP build: typically no build step"'],rust:["cargo build --release"],dotnet:["dotnet build -c Release"],elixir:["mix compile"],ruby:["gem build *.gemspec"],"jvm-generic":["mvn package -DskipTests","gradle build"],unknown:[]},start:{python:["python app.py","python main.py","uvicorn main:app --reload"],node:["npm start","node index.js","node src/index.js"],go:["./app","go run main.go","go run ./..."],java:["mvn spring-boot:run","gradle bootRun","java -jar target/*.jar"],php:["php -S 0.0.0.0:8000","php artisan serve"],rust:["cargo run --release","./target/release/app"],dotnet:["dotnet run"],elixir:["mix phx.server","iex -S mix"],ruby:["rails server","ruby app.rb","bundle exec puma"],"jvm-generic":["java -jar *.jar","gradle run"],unknown:[]}};function ee(e,r){if(r){let t=r.trim().toLowerCase().replace(/[_.\s]+/g,"-"),n=e$1(r),s=`${e}-${n==="gofiber"?"fiber":n==="gogin"?"gin":n==="dotnet"?"aspnetcore":n!=="unknown"?n:t==="fiber"?"fiber":t==="aspnetcore"||t==="asp-net-core"?"aspnetcore":t}`;return Me[s]}}function ve(e,r,t){if(r){let n=ee(e,r);if(n&&n.commands[t])return n.commands[t]}if(["init","test","build","start"].includes(t)){let n=Oe[t]?.[e]??[];return n.length>0?n[0]:void 0}}var Le={test:"test",build:"build",start:"start"};function te(e){if(e.stage==="init")return e.runtime==="node"?Re(e.projectPath):ve(e.runtime,e.framework,e.stage);if(e.runtime==="node"){let r=Le[e.stage];if(r){let t=g(e.projectPath,r,{framework:e.framework});if(t)return xe(e.projectPath,t.scriptName)}}return ve(e.runtime,e.framework,e.stage)}function _e(e){let r=h(e).map(t=>t==="python"?"python":t==="node"||t==="bun"?"node":t==="go"?"go":t==="java"?"java":t==="php"?"php":t==="rust"?"rust":t==="dotnet"?"dotnet":t==="elixir"?"elixir":t==="ruby"?"ruby":t==="clojure"||t==="scala"||t==="kotlin"?"jvm-generic":null).filter(t=>t!==null).filter((t,n,o)=>o.indexOf(t)===n);return {primary:r.length>0?r[0]:"unknown",secondary:r.slice(1)}}function Se(e){return _e(e).primary}function je(e,r){if(!e)return "unknown";r||(r={setup:["ModuleNotFoundError","npm ERR!","error:","not found"],"test-failure":["FAILED","FAIL","failed"],dependency:["cannot find module","import.*error"],runtime:["Exception","Error:","panic","TypeError"],timeout:["timeout","Timeout","deadline exceeded"],unknown:[]});for(let[t,n]of Object.entries(r))for(let o of n)if(new RegExp(o,"i").test(e))return t;return "unknown"}async function z(e){let r=e.split(/[&|;]\s*/)[0].trim().split(/\s+/)[0];if(["echo","cd","pwd","test","true","false","exit"].includes(r))return {valid:true};try{let n=process.platform==="win32"?"where":"which";if((await execa(n,[r],{reject:false})).exitCode===0)return {valid:true}}catch{}return {valid:false,reason:`Command '${r}' not found or not executable`}}function Ee(e,r,t){if(!r)return e;let n=typeof r=="object"&&!Array.isArray(r)&&("dev"in r||"staging"in r||"prod"in r||"default"in r)&&!Object.keys(r).some(o=>["init","test","build","start"].includes(o))?r:{};return t&&typeof n[t]=="string"?n[t]:typeof n.default=="string"?n.default:e}var Ce={init:"init",test:"test",build:"build",start:"start"};function Ge(e){return e in Ce?Ce[e]:null}function Be(e,r){let n$1=n(e)?.contextJson?.commands;if(!n$1||typeof n$1!="object"||Array.isArray(n$1))return;let o=n$1[r];if(typeof o=="string"&&o.trim().length>0)return o.trim();if(o&&typeof o=="object"&&!Array.isArray(o)){let s=o,c=s.default??s.dev;if(typeof c=="string"&&c.trim().length>0)return c.trim()}}function Pe(e,r,t=q(e)){let n=Ge(r);if(!n)return Be(e,r)?{supported:true}:{supported:false,reason:`Workspace stage "${r}" is not part of the RapidKit fleet contract.`};if(!t.projectRoot)return {supported:false,reason:"No RapidKit project metadata was detected for this target."};let o=t.commandMap[n];return !o||o.status!=="supported"?{supported:false,reason:o?.reason??`Command "${n}" is not supported for this project runtime/framework.`}:{supported:true}}var Ke=new Set(["init","test","build","start"]),Ve=new Set([".git","node_modules",".rapidkit",".venv","dist","build","coverage","htmlcov"]);async function $(e){try{return await _.promises.access(e,_.constants.F_OK),true}catch{return false}}async function ze(e,r,t){if(r==="python"){let o=w.join(e,".rapidkit","cli.py");return await $(o)?{valid:true}:{valid:false,reason:"Project-local .rapidkit/cli.py is missing. Run `rapidkit init` in this project first."}}let n=t.trim().split(/\s+/)[0];if(n&&["npm","npx","pnpm","yarn"].includes(n)){let o=e$2(n);if((await execa(o.command,[...o.prefixArgs,"--version"],{reject:false,env:g$1()})).exitCode===0)return {valid:true}}return z(t)}async function ne(e){let r=await _.promises.readFile(e,"utf-8");return JSON.parse(r)}function C(e){return e.replace(/\\/g,"/")}function He(e){let r=e?.trim();return r?r.startsWith("project:")?r.slice(8).trim()||null:r:null}async function Ue(e){return a$1(e,{skipDirs:Ve,includeHiddenDirs:false,descendIntoMatchedProjects:false,isProjectDir:async(r,t)=>await $(w.join(r,".rapidkit","context.json"))||await $(w.join(r,".rapidkit","project.json"))?true:w.resolve(r)===w.resolve(t)?false:h(r).length>0})}async function Je(e){for(let r of [w.join(".rapidkit","project.json"),w.join(".rapidkit","context.json")]){let t=w.join(e,r);if(await $(t))try{let n=await ne(t),o=n.name??n.projectName??n.slug;if(typeof o=="string"&&o.trim())return o.trim()}catch{}}return null}async function qe(e,r,t){let n=He(t);if(!n)return {projects:r,normalizedScope:null};let o=C(n).toLowerCase(),s=[];for(let c of r){let d=C(w.relative(e,c)),p=w.basename(c),f=await Je(c);[d,p,f].filter(a=>typeof a=="string"&&a.length>0).map(a=>C(a).toLowerCase()).includes(o)&&s.push(c);}if(s.length===0)throw new Error(`Workspace run scope did not match any project: ${t}`);return {projects:s,normalizedScope:n}}async function Ye(e,r,t){let n=await execa("git",["diff","--name-only",`${t}...HEAD`],{cwd:e,reject:false});if(n.exitCode!==0)return new Set(r);let o=n.stdout.split(/\r?\n/).map(c=>c.trim()).filter(c=>c.length>0).map(c=>C(c));if(o.length===0)return new Set;let s=new Set;for(let c of r){let d=C(w.relative(e,c));if(!d||d===".")continue;let p=`${d}/`;o.some(f=>f===d||f.startsWith(p))&&s.add(c);}return s}async function Qe(e,r,t){let n=w.join(e,".rapidkit","workspace.contract.json");if(await $(n))try{let g=await Xe(e,r,t,n);if(g.graphStatus!=="missing")return g}catch{return {expanded:t,graphStatus:"invalid",expansionDepth:0}}let o=w.join(e,".rapidkit","workspace-dependency-graph.json");if(!await $(o))return {expanded:t,graphStatus:"missing",expansionDepth:0};let s;try{s=await ne(o);}catch{return {expanded:t,graphStatus:"invalid",expansionDepth:0}}let c=new Set(r.map(g=>w.resolve(g))),d=new Map;if(!s||typeof s!="object"||Array.isArray(s))return {expanded:t,graphStatus:"invalid",expansionDepth:0};let p=Array.isArray(s.projects)?s.projects:[];for(let g of p){if(!g||typeof g!="object"||Array.isArray(g))continue;let a=g,l=typeof a.path=="string"?a.path:"",y=w.resolve(e,l);if(!c.has(y))continue;let h=Array.isArray(a.dependsOn)?a.dependsOn.filter(R=>typeof R=="string"):[];for(let R of h){let u=w.resolve(e,R);c.has(u)&&(d.has(u)||d.set(u,new Set),d.get(u)?.add(y));}}let f=d$1(d,t);return {expanded:f.reached,graphStatus:"loaded",expansionDepth:f.added}}async function Xe(e,r,t,n){let o=await ne(n);if(!o||typeof o!="object"||Array.isArray(o))return {expanded:t,graphStatus:"invalid",expansionDepth:0};let s=o,c=Array.isArray(s.projects)?s.projects:null;if(!c)return {expanded:t,graphStatus:"invalid",expansionDepth:0};let d=new Map,p=new Map;for(let y of r){let h=C(w.relative(e,y));p.set(h,w.resolve(y));}let f=new Map,g=new Map,a=new Map;for(let y of c){if(!y||typeof y!="object"||Array.isArray(y))continue;let h=y,R=typeof h.slug=="string"?h.slug:"",u=typeof h.relativePath=="string"?C(h.relativePath):R,b=p.get(u);!R||!b||d.set(R,b);}for(let y of c){if(!y||typeof y!="object"||Array.isArray(y))continue;let h=y,R=typeof h.slug=="string"?h.slug:"",u=d.get(R);if(!u)continue;let b=h.contracts&&typeof h.contracts=="object"&&!Array.isArray(h.contracts)?h.contracts:{},v=Array.isArray(b.dependsOn)?b.dependsOn.filter(x=>typeof x=="string"):[],I=Array.isArray(b.publishes)?b.publishes.filter(x=>typeof x=="string"):[],M=Array.isArray(b.consumes)?b.consumes.filter(x=>typeof x=="string"):[];for(let x of v){let P=d.get(x);P&&(a.has(P)||a.set(P,new Set),a.get(P)?.add(u));}for(let x of I)f.has(x)||f.set(x,new Set),f.get(x)?.add(u);for(let x of M)g.has(x)||g.set(x,new Set),g.get(x)?.add(u);}for(let[y,h]of f.entries()){let R=g.get(y);if(R)for(let u of h){a.has(u)||a.set(u,new Set);for(let b of R)b!==u&&a.get(u)?.add(b);}}let l=d$1(a,t);return {expanded:l.reached,graphStatus:"loaded",expansionDepth:l.added}}async function Ze(e,r){if(typeof r=="boolean")return r;let t=w.join(e,".rapidkit","policies.yml");if(!await $(t))return true;let n="";try{n=await _.promises.readFile(t,"utf-8");}catch{return true}let o=n.match(/^[\t ]*rules\.enforce_workspace_run_gates:\s*(true|false)\s*(?:#.*)?$/m);return o?o[1]==="true":true}async function re(e,r){let t=process.argv[1];if(!t)return {exitCode:1,stdout:"",stderr:"RapidKit entrypoint is unavailable for nested workspace-run execution."};let n=await execa(process.execPath,[t,...e],{cwd:r,reject:false,env:{...process.env,RAPIDKIT_WORKSPACE_RUN_CHILD:"1"}});return {exitCode:Number(n.exitCode??1),stdout:n.stdout,stderr:n.stderr}}function et(e){return e==="node"||e==="go"||e==="java"||e==="python"||e==="dotnet"}function tt(){return process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"}async function rt(e){let r=process.cwd();try{process.chdir(e);let{handleInitCommand:t}=await import('./index.js');return {exitCode:await t(["init"]),stdout:"",stderr:""}}finally{process.chdir(r);}}async function nt(e){let r=a=>{let l=f(a);return l==="node"||l==="bun"?"node":l==="python"?"python":l==="go"?"go":l==="java"?"java":l==="php"?"php":l==="ruby"?"ruby":l==="rust"?"rust":l==="dotnet"?"dotnet":l==="elixir"?"elixir":l==="clojure"||l==="scala"||l==="kotlin"?"jvm-generic":Se(e)},t=a=>{if(!a)return;let l=e$1(a);if(new Set(["fastapi","django","flask","nestjs","express","fastify","koa","gofiber","gogin","echo","springboot","laravel","symfony","rails","sinatra","dotnet","actix","axum","rocket","phoenix"]).has(l))return l},n$1=n(e),o=n$1?.detection??i(e,n$1?.projectJson??null),s=n$1?.contextJson,c=r(o.runtime),d=t(o.key),p={},f$1=new Set(["init","test","build","start"]);if(s?.commands&&typeof s.commands=="object")for(let[a,l]of Object.entries(s.commands))typeof l=="string"&&f$1.has(a)&&(p[a]=l);let g;if(s?.commandEnvironments&&typeof s.commandEnvironments=="object"){let a=s.commandEnvironments;g={dev:typeof a.dev=="string"?a.dev:void 0,staging:typeof a.staging=="string"?a.staging:void 0,prod:typeof a.prod=="string"?a.prod:void 0,default:typeof a.default=="string"?a.default:void 0};}return {runtime:c,framework:d,commandOverrides:Object.keys(p).length>0?p:void 0,environmentCommandVariants:g,environment:typeof s?.environment=="string"?s.environment:void 0}}async function ot(e,r,t,n,o,s,c){let d=!o?.[r]&&et(t),p;if(o&&o[r]?p=o[r]:d?p=`rapidkit ${r}`:p=te({projectPath:e,runtime:t,framework:n,stage:r}),!p)return {exitCode:127,command:`<stage not supported for ${t}>`,message:`No stage command found for runtime '${t}' and framework '${n||"unknown"}'`,errorCategory:"runtime"};let f=Ee(p,s,c);if(!f)return {exitCode:127,command:p,message:"Failed to resolve stage command",errorCategory:"runtime"};let g=te({projectPath:e,runtime:t,framework:n,stage:r});if(d){if(g){let u=d?await ze(e,t,g):await z(g);if(!u.valid)return {exitCode:127,command:f,message:u.reason||"Command not available",errorCategory:"setup"}}}else {let u=await z(f);if(!u.valid)return {exitCode:127,command:f,message:u.reason||"Command not available",errorCategory:"setup"}}let a=0,l="",y="",h;try{let u=d?r==="init"&&tt()?await rt(e):await re([r],e):await execa(f,[],{cwd:e,reject:false,shell:true});if(a=Number(u.exitCode??0),l=u.stdout,y=u.stderr,a!==0){let b=`${l}
2
+ ${y}`;h=je(b);}}catch(u){return {exitCode:1,command:f,message:u instanceof Error?u.message:"Command execution failed",errorCategory:"runtime"}}return {exitCode:a,command:f,errorCategory:h,healthStatus:void 0,message:a!==0?`Stage failed with exit code ${a}`:void 0}}function Fe(e){try{return JSON.parse(e)}catch{return null}}function st(e){switch(e){case "dotnet":return "Install .NET 8+ SDK, then rerun `npx rapidkit setup dotnet` or `npx rapidkit init`.";case "go":return "Install Go 1.21+, then rerun `npx rapidkit setup go` or `npx rapidkit init`.";case "java":case "jvm-generic":return "Install Java 21+ and Maven/Gradle, then rerun `npx rapidkit setup java` or `npx rapidkit init`.";case "node":return "Install Node.js LTS and npm/pnpm/yarn, then rerun `npx rapidkit setup node` or `npx rapidkit init`.";case "python":return "Install Python 3.10+ and pip/Poetry, then rerun `npx rapidkit setup python` or `npx rapidkit init`.";default:return null}}async function at(e){let r=[],t=await re(["doctor","workspace","--json"],e);if(t.exitCode!==0)r.push({gate:"doctor-workspace",status:"fail",summary:"doctor workspace command failed"});else {let s=Fe(t.stdout)?.healthScore,c=Number(s?.errors??0);Number.isFinite(c)&&c>0?r.push({gate:"doctor-workspace",status:"fail",summary:`doctor workspace reports ${c} error(s)`}):r.push({gate:"doctor-workspace",status:"pass",summary:"doctor workspace passed"});}let n=await re(["readiness","--json"],e);if(n.exitCode!==0)r.push({gate:"readiness",status:"fail",summary:"readiness command failed"});else {let o=Fe(n.stdout),s=String(o?.overallStatus??"").toLowerCase();s==="fail"?r.push({gate:"readiness",status:"fail",summary:"readiness overall status is fail"}):s==="warn"?r.push({gate:"readiness",status:"warn",summary:"readiness overall status is warn"}):r.push({gate:"readiness",status:"pass",summary:"readiness overall status is pass"});}return r}var it=new Set(["dev","stop"]);function ct(e){let r=e.trim();return !r||it.has(r.toLowerCase())?false:Ke.has(r)?true:/^[a-z][a-z0-9_-]*$/i.test(r)}function Ae(e,r,t){let n=C(w.relative(t,r));return (Array.isArray(e.projects)?e.projects:[]).some(s=>{if(!s||typeof s!="object")return false;let c=s,d=[c.relativePath,c.path].filter(p=>typeof p=="string"&&p.length>0).map(p=>C(p));return c.status==="passed"&&(d.includes(n)||d.some(p=>p.endsWith(`/${n}`)))})}function ut(e,r){return ee(e,r)?.dependencies??[]}function dt(e,r){let t=Math.max(1,Math.min(4,r)),n=Number(e??t);return Number.isFinite(n)?Math.max(1,Math.min(16,Math.trunc(n))):t}async function Bt(e$1){if(!ct(e$1.stage))throw new Error(`Unsupported workspace run stage: ${e$1.stage}`);let r=Date.now(),t=w.resolve(e$1.workspacePath),n=await d(t),o=await Ue(t),{projects:s,normalizedScope:c}=await qe(t,o,e$1.scope),d$1=e$1.affected===true,p=e$1.blastRadius===true,f=e$1.since?.trim()||"HEAD~1",g=d$1?await Ye(t,s,f):new Set(s),a$1,l="not-applicable",y=0,h="all";if(d$1&&p){let m=await Qe(t,o,g);a$1=m.expanded,l=m.graphStatus,y=m.expansionDepth,h="affected+blast-radius";}else d$1?(a$1=g,h="affected"):(a$1=g,h="all");let R=e$1.stage==="init"?false:await Ze(t,e$1.enforceGates),u=R?await at(t):[{gate:"doctor-workspace",status:"skipped",summary:"workspace run gates disabled"},{gate:"readiness",status:"skipped",summary:"workspace run gates disabled"}],b$1=u.find(m=>m.status==="fail"),v=s.filter(m=>a$1.has(m)),I=e$1.continueOnError===true||e$1.stage==="init",M=e$1.parallel===true,x=dt(e$1.maxWorkers,v.length),P=v.length,N=0;e$1.json||console.log(S.gray(`Workspace run (${e$1.stage}) started: ${P} target(s), ${M?`parallel x${x}`:"sequential"}`));let A=new Map;for(let m of o){let k=s.includes(m),i=k&&a$1.has(m);A.set(m,{path:m,relativePath:C(w.relative(t,m)),selected:i,affected:i,status:"skipped",exitCode:null,durationMs:0,reason:i?void 0:k?"not affected":"outside scope",framework:void 0,runtimeDetected:void 0,executionCommand:void 0});}if(b$1)for(let m of v){let k=A.get(m);k&&(k.status="skipped",k.reason=`blocked by ${b$1.gate}`);}else {let m=async k=>{let i=A.get(k);if(!i)return;let T=C(w.relative(t,k));e$1.json||console.log(S.gray(`\u23F3 [${N}/${P}] ${e$1.stage} ${T}`)),i.selected=true,i.affected=true;let E=Date.now(),{runtime:j,framework:F,commandOverrides:We,environmentCommandVariants:De,environment:$e}=await nt(k);i.runtimeDetected=j,i.framework=F;let ce=Pe(k,e$1.stage);if(!ce.supported){i.status="skipped",i.reason=ce.reason??`stage "${e$1.stage}" unsupported for project`,i.durationMs=Date.now()-E,i.exitCode=null,N+=1;return}if(e$1.reusePassed&&n){let D=n.stages[e$1.stage]??n.stages[e$1.stage];if(D&&Ae(D,k,t)){i.status="passed",i.reason="reused passed result from workspace-run-last.json",i.durationMs=Date.now()-E,i.exitCode=0,N+=1,e$1.json||console.log(S.gray(`\u21BA reused passed cache for ${T}`));return}}let ue=ut(j,F);if(ue.length>0&&n){let D=ue.find(q=>{let L=n.stages[q];return !L||!Ae(L,k,t)});if(D){i.status="skipped",i.reason=`dependency stage "${D}" not satisfied in workspace-run-last.json`,i.durationMs=Date.now()-E,i.exitCode=null,N+=1;return}}let W=await ot(k,e$1.stage,j,F,We,De,$e);if(i.executionCommand=W.command,i.errorCategory=W.errorCategory,i.healthStatus=W.healthStatus,i.durationMs=Date.now()-E,i.exitCode=W.exitCode,W.exitCode===0?(i.status="passed",i.reason=void 0):(i.status="failed",i.reason=W.message||"stage command failed",i.errorMessage=W.message),N+=1,!e$1.json){let D=P>0?Math.round(N/P*100):100,q=i.status==="passed"?S.green("\u2705"):S.red("\u274C");if(console.log(S.gray(`${q} [${N}/${P}] (${D}%) ${T} ${i.durationMs}ms`)),i.status==="failed"){i.reason&&console.log(S.red(` Reason: ${i.reason}`)),i.executionCommand&&console.log(S.gray(` Command: ${i.executionCommand}`));let L=st(i.runtimeDetected);L&&i.errorCategory==="setup"&&console.log(S.gray(` Hint: ${L}`));}}};if(M&&v.length>1){let k=0,i=false,T=new Array(x).fill(null).map(async()=>{for(;k<v.length;){if(i&&!I)return;let E=k;k+=1;let j=v[E];await m(j),A.get(j)?.status==="failed"&&(i=true);}});if(await Promise.all(T),!I&&i){let E=false;for(let j of v){let F=A.get(j);if(F){if(F.status==="failed"){E=true;continue}E&&F.status==="skipped"&&(F.reason=F.reason||"stopped after failure");}}}}else for(let k of v){await m(k);let i=A.get(k);if(!I&&i?.status==="failed"){let T=v.slice(v.indexOf(k)+1);for(let E of T){let j=A.get(E);j&&(j.status="skipped",j.reason="stopped after failure");}break}}}let O=[];for(let m of o){let k=A.get(m);k&&O.push(k);}let oe=O.filter(m=>m.status==="passed").length,J=O.filter(m=>m.status==="failed").length,se=O.filter(m=>m.status==="skipped").length,ae=e$1.strict===true,Ne=J>0||ae&&u.some(m=>m.status==="fail"||m.status==="warn")?1:0,ie={schemaVersion:"1.0",workspacePath:t,stage:e$1.stage,generatedAt:new Date().toISOString(),durationMs:Date.now()-r,options:{affected:d$1,blastRadius:p,since:d$1?f:null,parallel:M,maxWorkers:x,continueOnError:I,strict:ae,enforceGates:R,scope:c,reusePassed:e$1.reusePassed===true},selection:{mode:h,since:d$1?f:null,scope:c,graphStatus:l,expansionDepth:y},gates:{enforced:R,results:u,blocked:!!b$1,blockingGate:b$1?.gate},summary:{projectCount:o.length,selectedCount:v.length,passed:oe,failed:J,skipped:se,exitCode:Ne},projects:O,enterpriseControls:{jsonReady:true,evidencePath:b}},Te=w.join(t,".rapidkit","reports",a);return await e(t,ie),e$1.json||(b$1&&(console.log(S.red(`\u274C Workspace run blocked by ${b$1.gate}`)),console.log(S.gray(` ${b$1.summary}`))),console.log(S.cyan(`Workspace run (${e$1.stage}) => passed: ${oe}, failed: ${J}, skipped: ${se}`)),console.log(S.gray(`Report: ${Te}`))),ie}export{Bt as a};