workspai 0.49.0 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -28
- package/contracts/analyze-last-run.v1.json +2 -2
- package/contracts/artifact-remediation-plan.v1.json +3 -9
- package/contracts/autopilot-release.v1.json +2 -0
- package/contracts/bootstrap-compliance.v1.json +2 -1
- package/contracts/cli-log-event.v1.json +1 -1
- package/contracts/cli-runtime-command-inventory.v1.snapshot.json +80 -0
- package/contracts/compatibility-matrix.v1.json +2 -0
- package/contracts/create-planner-capabilities.v1.json +144 -32
- package/contracts/doctor-project-evidence.v1.json +191 -11
- package/contracts/doctor-project-scan.v2.json +2 -0
- package/contracts/doctor-remediation-plan.v1.json +2 -2
- package/contracts/doctor-remediation-plan.v2.json +2 -2
- package/contracts/doctor-workspace-cache.v2.json +2 -0
- package/contracts/doctor-workspace-evidence.v1.json +189 -10
- package/contracts/extension-cli-compatibility.v1.json +10 -1
- package/contracts/infra-plan.v1.json +2 -0
- package/contracts/ingestion-plan.v1.json +85 -0
- package/contracts/ingestion-result.v1.json +59 -0
- package/contracts/mirror-ops.v1.json +2 -1
- package/contracts/pipeline-last-run.v1.json +2 -2
- package/contracts/private-product-manifest.v1.json +2 -0
- package/contracts/product-factory-plan.v1.json +2 -0
- package/contracts/project-archive.v1.json +2 -0
- package/contracts/project-entry-capability.v1.json +2 -3
- package/contracts/project-test-coverage.v1.json +189 -0
- package/contracts/project-workspace-link.v1.json +66 -0
- package/contracts/project-workspace-resolution.v1.json +28 -0
- package/contracts/published-contract-catalog.v1.json +45 -0
- package/contracts/release-readiness.v1.json +2 -2
- package/contracts/runtime-command-surface.v1.json +1456 -139
- package/contracts/transparency-evidence.v1.json +2 -1
- package/contracts/workspace-archive-capabilities.v1.json +11 -5
- package/contracts/workspace-archive-manifest.v1.json +236 -0
- package/contracts/workspace-archive-operation-result.v1.json +236 -0
- package/contracts/workspace-contract.v1.json +1 -1
- package/contracts/workspace-intelligence/agent-action-outcome.v1.json +2 -2
- package/contracts/workspace-intelligence/agent-customization-pack-report.v1.json +1 -1
- package/contracts/workspace-intelligence/agent-hooks.v1.json +2 -0
- package/contracts/workspace-intelligence/agent-reports-index.v1.json +1 -1
- package/contracts/workspace-intelligence/blocker-resolution.v1.json +3 -9
- package/contracts/workspace-intelligence/doctor-fix-result.v1.json +2 -2
- package/contracts/workspace-intelligence/doctor-graph-diagnosis.v1.json +208 -0
- package/contracts/workspace-intelligence/fact-freshness.v1.json +2 -2
- package/contracts/workspace-intelligence/mcp-design.v1.json +2 -0
- package/contracts/workspace-intelligence/model-usage-event.v1.json +1 -1
- package/contracts/workspace-intelligence/project-context-agent.v1.json +360 -0
- package/contracts/workspace-intelligence/studio-blocker-handoff.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-context.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-contract-verify.v1.json +2 -2
- package/contracts/workspace-intelligence/workspace-dependency-graph.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-explain.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-graph-stream.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-graph-token-efficiency.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-impact.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-intelligence-evaluation-comparison.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-intelligence-evaluation.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-intelligence-history.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-intelligence-run.v1.json +2 -2
- package/contracts/workspace-intelligence/workspace-knowledge-graph-change-overlay.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-knowledge-graph.v1.json +48 -5
- package/contracts/workspace-intelligence/workspace-knowledge-search.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-model-diff.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-model-snapshot.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-model.v1.json +97 -5
- package/contracts/workspace-intelligence/workspace-operational-skill.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-skills-index.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-verify.v1.json +1 -1
- package/contracts/workspace-intelligence-architecture.v1.json +33 -7
- package/contracts/workspace-intelligence-chain.v1.json +1 -1
- package/contracts/workspace-list.v1.json +2 -0
- package/contracts/workspace-model-cache.v1.json +2 -0
- package/contracts/workspace-registry.v1.json +1 -1
- package/contracts/workspace-run-last.v1.json +1 -1
- package/contracts/workspace-share-bundle.v1.json +2 -1
- package/contracts/workspace-snapshot.v1.json +2 -0
- package/contracts/workspace-snapshot.v2.json +2 -0
- package/contracts/workspace-sync.v1.json +2 -0
- package/contracts/workspace-watch-event.v1.json +2 -0
- package/dist/analyze-ZFQWTCJQ.js +1 -0
- package/dist/{artifact-remediation-plan-SPOUHMK5.js → artifact-remediation-plan-ICN3KOFG.js} +1 -1
- package/dist/autopilot-release-VKXQ7BS7.js +1 -0
- package/dist/chunk-2AXEGYPL.js +1 -0
- package/dist/chunk-2D4UOYOJ.js +1 -0
- package/dist/chunk-2OIBHUVH.js +1 -0
- package/dist/chunk-3GRKUP5W.js +33 -0
- package/dist/{managed-agent-markers-AXUM75OE.js → chunk-3RBUSW7H.js} +1 -1
- package/dist/chunk-5EXZBCAZ.js +4 -0
- package/dist/chunk-6UTM5AJI.js +1 -0
- package/dist/chunk-AFIFZTOY.js +2 -0
- package/dist/{chunk-BMWFQXGW.js → chunk-AHLMIL2T.js} +1 -1
- package/dist/chunk-AL237TSJ.js +7 -0
- package/dist/chunk-AL2A7Q4X.js +86 -0
- package/dist/{chunk-VU7NZHPM.js → chunk-BHYTI3RH.js} +1 -1
- package/dist/{chunk-ESLPI3XZ.js → chunk-BQGBU2Y3.js} +1 -1
- package/dist/chunk-C35UXTDM.js +2 -0
- package/dist/chunk-C3FLCDRN.js +2 -0
- package/dist/chunk-CZC5P2MF.js +1 -0
- package/dist/{chunk-TIE2XMGH.js → chunk-DDQ3XK3H.js} +12 -12
- package/dist/{chunk-CRHYBQI3.js → chunk-DQ3PI7EP.js} +1 -1
- package/dist/chunk-EWZZUQBR.js +1 -0
- package/dist/{chunk-4KUIFXHM.js → chunk-GNQRYISX.js} +3 -3
- package/dist/chunk-I42F552T.js +2 -0
- package/dist/chunk-IDQKVJUF.js +2 -0
- package/dist/{chunk-3VFA7D5T.js → chunk-IND3TUVU.js} +1 -1
- package/dist/chunk-IPJ5URDF.js +1 -0
- package/dist/{chunk-EKZLUMCS.js → chunk-JFUD73OZ.js} +51 -51
- package/dist/chunk-KKAOTTYO.js +8 -0
- package/dist/chunk-KMLPHFLD.js +2 -0
- package/dist/{chunk-NHN4QXPP.js → chunk-KVSYBHUR.js} +1 -1
- package/dist/chunk-KXG6E5VK.js +1 -0
- package/dist/chunk-L2YK5RV2.js +1 -0
- package/dist/chunk-LAJM2SBP.js +15 -0
- package/dist/{chunk-K4X3DM7R.js → chunk-LZQUZGXB.js} +1 -1
- package/dist/chunk-MOSXTVPU.js +1 -0
- package/dist/chunk-MV7KF75Q.js +13 -0
- package/dist/chunk-MVLIONQD.js +1 -0
- package/dist/chunk-RJIYCDVC.js +1 -0
- package/dist/{chunk-BGPXQQNY.js → chunk-RTVRZFIJ.js} +1 -1
- package/dist/chunk-RVQLMTTI.js +2 -0
- package/dist/chunk-SHXJ2GDR.js +75 -0
- package/dist/{chunk-32OJDBIG.js → chunk-SS2VV3D5.js} +1 -1
- package/dist/chunk-TDTCMZK7.js +10 -0
- package/dist/chunk-UETZ7USY.js +36 -0
- package/dist/chunk-VKTUWUS6.js +1 -0
- package/dist/chunk-VRW6KXNK.js +6 -0
- package/dist/chunk-Y5YAP4F3.js +2 -0
- package/dist/chunk-YPKNQCLK.js +2 -0
- package/dist/{create-S64IWHAP.js → create-I23DC7SN.js} +1 -1
- package/dist/{demo-kit-DZ7TPG7K.js → demo-kit-KHH63TNA.js} +2 -2
- package/dist/{doctor-4NNUDNGZ.js → doctor-DOOMYLIH.js} +1 -1
- package/dist/{dotnet-webapi-clean-A6MVDYXX.js → dotnet-webapi-clean-VXEF4SHM.js} +5 -5
- package/dist/{gofiber-standard-I5YPQG5V.js → gofiber-standard-AQGSC7ON.js} +3 -3
- package/dist/{gogin-standard-VY2L4QT5.js → gogin-standard-7DU3OCBX.js} +3 -3
- package/dist/index.d.ts +38 -6
- package/dist/index.js +267 -355
- package/dist/managed-agent-markers-COE5DJ3W.js +1 -0
- package/dist/pipeline-U77HSINC.js +5 -0
- package/dist/platform-capabilities-PR6YL4KC.js +1 -0
- package/dist/project-intelligence-lens-BKKVPCLC.js +1 -0
- package/dist/project-test-coverage-4TEHZJFC.js +1 -0
- package/dist/{pythonRapidkitExec-CVCIK225.js → pythonRapidkitExec-YR7P5LWG.js} +1 -1
- package/dist/rust-axum-4HXDICIB.js +140 -0
- package/dist/{springboot-standard-55XKCBIZ.js → springboot-standard-EK6GYN5T.js} +7 -7
- package/dist/workspace-ZEYUVR26.js +1 -0
- package/dist/{workspace-agent-sync-662QHXGF.js → workspace-agent-sync-DKYJLUDP.js} +1 -1
- package/dist/workspace-archive-4JNT4S7N.js +1 -0
- package/dist/{workspace-context-23YYCUCP.js → workspace-context-IHUFMZT3.js} +1 -1
- package/dist/workspace-contract-PVLGPBBV.js +1 -0
- package/dist/workspace-explain-64HNKAHO.js +1 -0
- package/dist/workspace-explain-contract-H7O26QJU.js +1 -0
- package/dist/{workspace-feedback-SUVH2LUJ.js → workspace-feedback-RATRXFUC.js} +1 -1
- package/dist/{workspace-foundation-WPLD7OEO.js → workspace-foundation-D33LJLGT.js} +1 -1
- package/dist/workspace-graph-stream-THNG2T7R.js +1 -0
- package/dist/{workspace-history-BANOJRQ2.js → workspace-history-EWFPT74O.js} +1 -1
- package/dist/workspace-intelligence-MCNSWWDV.js +1 -0
- package/dist/{workspace-intelligence-evaluation-IPH7M3WV.js → workspace-intelligence-evaluation-7CABG5Y6.js} +1 -1
- package/dist/workspace-intelligence-runner-TG2VLHNZ.js +1 -0
- package/dist/workspace-intelligence-runtime-registry-ZZ3GRAL2.js +1 -0
- package/dist/{workspace-knowledge-graph-ARDC6HHG.js → workspace-knowledge-graph-2EYR7N56.js} +1 -1
- package/dist/{workspace-marker-SMBC3Z2Q.js → workspace-marker-7NHMDIRL.js} +1 -1
- package/dist/workspace-mcp-serve-FLAVKWYW.js +3 -0
- package/dist/workspace-model-FMFYLHE4.js +1 -0
- package/dist/workspace-model-hash-ZXYPIGCW.js +1 -0
- package/dist/workspace-onboarding-MYROZDI2.js +1 -0
- package/dist/{workspace-python-engine-state-2MLKJYQG.js → workspace-python-engine-state-J4QKW55K.js} +1 -1
- package/dist/{workspace-registry-summary-ORDK7A36.js → workspace-registry-summary-6VXIAQLX.js} +1 -1
- package/dist/workspace-run-2ZI5UMJ2.js +1 -0
- package/dist/{workspace-verify-EBVL7FWT.js → workspace-verify-FKYI65UQ.js} +1 -1
- package/dist/workspace-watch-RP5KMVP2.js +1 -0
- package/docs/GLOSSARY.md +17 -16
- package/docs/OPEN_SOURCE_USER_SCENARIOS.md +8 -3
- package/docs/README.md +6 -3
- package/docs/README_CONTENT_CONTRACT.md +18 -9
- package/docs/commands-reference.md +39 -8
- package/docs/contracts/ARTIFACT_CATALOG.md +65 -26
- package/docs/contracts/COMMAND_OWNERSHIP_MATRIX.md +2 -0
- package/docs/contracts/RUNTIME_SUPPORT_MATRIX.md +3 -3
- package/docs/contracts/rapidkit-cli-contracts.json +2 -2
- package/docs/create-planner-capabilities.md +36 -5
- package/docs/creating-workspaces-and-projects.md +59 -3
- package/docs/doctor-command.md +118 -11
- package/docs/from-code-to-shared-understanding.md +4 -1
- package/docs/graph-benchmark-methodology.md +2 -2
- package/docs/workspace-intelligence-evaluation.md +5 -0
- package/docs/workspace-knowledge-graph.md +102 -7
- package/docs/workspace-operations.md +146 -10
- package/package.json +2 -2
- package/scripts/enterprise-package-smoke.mjs +13 -1
- package/dist/analyze-EEEU3MIF.js +0 -1
- package/dist/autopilot-release-R4XRTWEM.js +0 -1
- package/dist/chunk-22DT744Z.js +0 -1
- package/dist/chunk-37CVKXBD.js +0 -1
- package/dist/chunk-3NU32T4A.js +0 -2
- package/dist/chunk-3ZK2GU7C.js +0 -1
- package/dist/chunk-4HDYADHT.js +0 -13
- package/dist/chunk-52PBRX7F.js +0 -1
- package/dist/chunk-54EP5CEV.js +0 -8
- package/dist/chunk-5XATWNME.js +0 -1
- package/dist/chunk-7YHK5NM3.js +0 -2
- package/dist/chunk-AFL3ACCR.js +0 -2
- package/dist/chunk-BFLJ2R4D.js +0 -80
- package/dist/chunk-E2KJ5QWY.js +0 -4
- package/dist/chunk-EYJ2CQSK.js +0 -1
- package/dist/chunk-FTY7GGXJ.js +0 -33
- package/dist/chunk-FXQJX34Z.js +0 -1
- package/dist/chunk-GSWPGELT.js +0 -2
- package/dist/chunk-GZTYAEWX.js +0 -1
- package/dist/chunk-HDXNIN4N.js +0 -1
- package/dist/chunk-HZDXO65G.js +0 -36
- package/dist/chunk-J5ENLXDF.js +0 -1
- package/dist/chunk-KB44JP4M.js +0 -2
- package/dist/chunk-LHOZXC2M.js +0 -2
- package/dist/chunk-MER6ZBN2.js +0 -13
- package/dist/chunk-NAJCUQ4X.js +0 -2
- package/dist/chunk-OA537ZQ5.js +0 -1
- package/dist/chunk-OW42TZFB.js +0 -1
- package/dist/chunk-P3D5YQB2.js +0 -1
- package/dist/chunk-PHXQR6PX.js +0 -2
- package/dist/chunk-PRTR2DQ2.js +0 -1
- package/dist/chunk-RHQW3DTP.js +0 -1
- package/dist/chunk-T4YR4RAI.js +0 -2
- package/dist/chunk-Y45WZR5N.js +0 -5
- package/dist/chunk-YJZOMRAS.js +0 -1
- package/dist/pipeline-LHTPE3DR.js +0 -5
- package/dist/platform-capabilities-2B4QMZXE.js +0 -1
- package/dist/workspace-PJPRBUMQ.js +0 -1
- package/dist/workspace-archive-P76EDIUG.js +0 -10
- package/dist/workspace-contract-TU2I7GC2.js +0 -1
- package/dist/workspace-dependency-graph-BP4EXYQ5.js +0 -1
- package/dist/workspace-explain-MWUEN643.js +0 -1
- package/dist/workspace-explain-contract-ZPI3JXJU.js +0 -1
- package/dist/workspace-graph-stream-KAGGQPJT.js +0 -1
- package/dist/workspace-intelligence-MFJE7W67.js +0 -1
- package/dist/workspace-intelligence-runner-OTYTHV6B.js +0 -1
- package/dist/workspace-mcp-serve-EZR6O76D.js +0 -3
- package/dist/workspace-model-7OU2M3LE.js +0 -1
- package/dist/workspace-model-hash-MHXK5MEI.js +0 -1
- package/dist/workspace-run-QND2SIYA.js +0 -1
- package/dist/workspace-watch-7HWGA5TF.js +0 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {c,d}from'./chunk-MOSXTVPU.js';import {m,k as k$1,j as j$1,b,t,n,i}from'./chunk-RJIYCDVC.js';import {a}from'./chunk-2FIX2MDC.js';import wt from'crypto';import tt from'os';import l from'path';import*as p from'fs-extra';import {execa}from'execa';var yt=["version","project","create","add","list","info","upgrade","diff","doctor","license","commands","reconcile","rollback","uninstall","checkpoint","optimize","snapshot","frameworks","modules","merge"],M=new Set(yt);var g=a();async function et(t){for(let e of [c,d]){let r=l.join(t,e);if(await p.pathExists(r))try{let n=await p.readJson(r);if(n&&typeof n=="object")return n}catch{return null}}return null}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(m(l.join(l.resolve(r),".venv")));for(let i of k$1())i.args.length===1&&i.args[0]==="--version"&&e(i.command);for(let i of j$1())e(i);return [...new Set(t)]}function v(t,e){return t==="py"?["-3",...e]:e}function H(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 D(t){if(t instanceof w)switch(t.code){case "PYTHON_NOT_FOUND":return `Workspai could not find Python (python3/python/py) on your PATH.
|
|
3
|
+
Install Python 3.10+ and ensure \`${i()}\` is available, then retry.
|
|
4
|
+
Tip: if you are inside a RapidKit project, use the local ./rapidkit launcher.`;case "BRIDGE_VENV_CREATE_FAILED":return `Workspai 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 `Workspai 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 `Workspai 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 `Workspai 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 `Workspai bridge error: ${t.message}`}return `Workspai 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 vt(){let t=_(),e=process.env.RAPIDKIT_CORE_PYTHON_PACKAGE_ID,r=e&&e.trim()?`${t}|${e.trim()}`:t;return wt.createHash("sha256").update(r).digest("hex").slice(0,12)}function j(){let t=process.env.XDG_CACHE_HOME;return t&&t.trim()?t:l.join(tt.homedir(),".cache")}function Pt(){return l.join(j(),"rapidkit","npm-bridge","venv")}function nt(){let t=vt();return l.join(j(),"rapidkit","npm-bridge",`venv-${t}`)}function Y(t){return m(t)}function U(t){return n(t)}async function rt(t$1=process.platform,e=process.env){let r=b(t$1)?["rapidkit.exe","rapidkit.cmd"]:["rapidkit"],n=t(e,t$1).flatMap(i=>r.map(o=>l.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 k(o.stdout))return {cmd:i,baseArgs:[]}}catch{}return null}async function it(t=process.platform,e=process.env){let r=b(t)?"rapidkit.exe":"rapidkit",n=(e.PATH??"").split(l.delimiter).filter(Boolean);for(let i of n){let o=l.join(i,r);try{if(!await p.pathExists(o))continue;let c=await execa(o,["--version","--json"],{reject:false,stdio:"pipe",timeout:4e3});if(c.exitCode===0&&await k(c.stdout,{requireSchema:true}))return {cmd:o,baseArgs:[]}}catch{}}return null}function ot(t){return /[<>=!~]=|@|\.whl$|\.tar\.gz$|\.zip$|git\+|https?:\/\//.test(t)}function Ct(t){return l.dirname(l.dirname(t))}function st(){return l.join(j(),"rapidkit","npm-bridge","core-commands.json")}async function at(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 c=(o.stdout??"").toString().trim();try{let s=JSON.parse(c),a=!!s&&typeof s=="object"&&s!==null&&"version"in s;if(r(`script JSON parse ok=${a}`),a)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(l.delimiter).filter(Boolean);for(let i of n){let o=l.join(i,b()?"rapidkit.exe":"rapidkit");try{if(await p.pathExists(o)){r(`found candidate on PATH: ${o}; invoking --version --json`);let c=await execa(o,["--version","--json"],{reject:false,stdio:"pipe",timeout:4e3});if(r(`candidate exitCode=${c.exitCode}`),c.exitCode===0){let s=(c.stdout??"").toString().trim();try{let a=JSON.parse(s),d=a;if(a&&typeof a=="object"&&a!==null&&"version"in d&&d.schema_version===1)return true}catch{r("candidate output not valid JSON, skipping");}}}}catch(c){r(`error probing candidate ${o}: ${String(c)}`);}}return r("no valid rapidkit found on PATH"),false}catch(n){return r(`PATH probe error: ${String(n)}`),false}}async function k(t,e){let r=(t??"").toString().trim();if(!r)return false;try{let n=JSON.parse(r);if(!n||typeof n!="object"||n===null)return false;let i=n;return "version"in i?e?.requireSchema?i.schema_version===1||i.schemaVersion==="rapidkit-core-version-v1":true:false}catch{return false}}async function ct(t,e=process.platform){let r=async o=>{try{let a=(await et(o))?.metadata?.python?.venvPath;return typeof a!="string"||!a.trim()?null:l.isAbsolute(a)?a:l.join(o,a)}catch{return null}},n$1=async(o,c)=>{let s=n(c,e);if(await p.pathExists(s)){let d=await execa(s,["--version","--json"],{reject:false,stdio:"pipe",timeout:1500,cwd:o});if(d.exitCode===0&&await k(d.stdout))return {cmd:s,baseArgs:[],workspaceDir:o}}let a=m(c,e);if(await p.pathExists(a)){let d=await execa(a,["-m","rapidkit","--version","--json"],{reject:false,stdio:"pipe",timeout:1500,cwd:o});if(d.exitCode===0&&await k(d.stdout))return {cmd:a,baseArgs:["-m","rapidkit"],workspaceDir:o}}return null},i=t;for(let o=0;o<25;o+=1){let c=await r(i),s=[l.join(i,".venv"),c].filter(d=>!!d);for(let d of [...new Set(s)]){let P=await n$1(i,d);if(P)return P}let a=l.dirname(i);if(a===i)break;i=a;}return null}async function Et(t){try{let e=l.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=await et(t);if(typeof e?.pythonVersion=="string"&&e.pythonVersion.trim())return e.pythonVersion.trim();let n=e?.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 s=await ct(t);if(s){let a=s.workspaceDir??(l.dirname(s.cmd).includes(".venv")?l.dirname(l.dirname(l.dirname(s.cmd))):l.dirname(s.cmd)),d=await Et(a);return d&&(process.env.PYENV_VERSION=d),s}}catch{}let e=await St();if(e.kind==="venv"){let s=Ct(e.pythonPath),a=U(s);return await p.pathExists(a)?{cmd:a,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 a=((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(a&&await p.pathExists(a))try{let d=await execa(a,["--version","--json"],{reject:false,stdio:"pipe",timeout:4e3});if(d.exitCode===0&&await k(d.stdout))return {cmd:a,baseArgs:[]}}catch{}}catch{}let r=await rt();if(r)return r;let n=await it();if(n)return n;let i=nt(),o=await N(e.cmd),c=U(i);return await p.pathExists(c)?{cmd:c,baseArgs:[]}:{cmd:o,baseArgs:["-m","rapidkit"]}}async function dt(){for(let t of O())try{if((await execa(t,v(t,["--version"]),{reject:false,stdio:"pipe",timeout:2e3})).exitCode===0)return t}catch{}return null}async function B(){let t=null;for(let e of O()){try{let r=await execa(e,v(e,["--version"]),{reject:false,stdio:"pipe",timeout:2e3});if(r.exitCode!==0){t=new Error(`${e} --version exited with code ${r.exitCode}`);continue}}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 _t(){let t=!!process.env.RAPIDKIT_DEBUG,e=n=>{t&&process.stderr.write(`[DEBUG] checkRapidkitCore: ${n}
|
|
16
|
+
`);},r=Array.from(new Set([...j$1(),...k$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 c=process.env.PYENV_ROOT||l.join(tt.homedir(),".pyenv"),s=l.join(c,"versions",o.trim(),"bin","pip");try{let a=await execa(s,["show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g});if(a.exitCode===0&&a.stdout?.includes("Name: rapidkit-core"))return e(`\u2713 Found in pyenv ${o}`),true}catch{try{let a=await execa("pyenv",["exec","pip","show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g,env:{...process.env,PYENV_VERSION:o.trim()}});if(a.exitCode===0&&a.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(),c=l.join(o,"rapidkit_core");if(await p.pathExists(c))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 kt(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 z(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 q(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 xt(t){return t.length<=1?[t[0]+1]:t.length===2?[t[0]+1,0]:[t[0],t[1]+1,0]}function Rt(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 ut(t,e){let r=z(t);if(!r)return false;let n=Rt(e);if(!n)return false;for(let i of n){let o=z(i.version);if(!o)return false;let c=q(r,o);if(i.op==="=="&&c!==0||i.op===">="&&c<0||i.op==="<="&&c>0||i.op===">"&&c<=0||i.op==="<"&&c>=0)return false;if(i.op==="~="){if(c<0)return false;let s=xt(o);if(q(r,s)>=0)return false}}return true}async function bt(){let t=Array.from(new Set([...j$1(),...k$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 At(){let t=_(),e=kt(t);if(!e)return {isCompatible:false,installedVersion:null,expectedConstraint:null,reason:ot(t)?"constraint-unsupported":"constraint-missing"};let r=await bt();if(!r)return {isCompatible:false,installedVersion:null,expectedConstraint:e,reason:"version-not-detected"};let n=ut(r,e);return {isCompatible:n,installedVersion:r,expectedConstraint:e,reason:n?"compatible":"incompatible-version"}}async function N(t){let e=nt(),r=Pt(),n=_(),i=[e];!ot(n)&&!await p.pathExists(e)&&await p.pathExists(r)&&i.push(r);for(let m of i){let h=Y(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,c={...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")),a=Math.max(200,Number(process.env.RAPIDKIT_BRIDGE_PIP_RETRY_DELAY_MS??"800")),d=Math.max(1e4,Number(process.env.RAPIDKIT_BRIDGE_PIP_TIMEOUT_MS??"120000")),P=m=>new Promise(h=>setTimeout(h,m)),E=async(m,h,f)=>{let y=await execa(m,h,{reject:false,stdio:["ignore","pipe","inherit"],env:c,timeout:f});if(y.exitCode===0)return;let T=(y.stdout??"").toString(),$=(y.stderr??"").toString(),b=[T,$].filter(Boolean).join(`
|
|
18
|
+
`),ft=b?`${m} ${h.join(" ")}
|
|
19
|
+
${b}`:`${m} ${h.join(" ")}`;throw new Error(ft)},R=async(m,h,f)=>{let y=0;for(;;)try{await E(m,h,f);return}catch(T){if(y>=s)throw T;let $=Math.floor(Math.random()*200),b=a*Math.pow(2,y)+$;y+=1,await P(b);}};try{await p.ensureDir(l.dirname(o));try{await E(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=Y(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:c,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 R(m,["-m","pip","install","-U","pip"],d);}catch(f){let y=f instanceof Error?f.message:String(f);throw new w("BRIDGE_PIP_UPGRADE_FAILED",y)}try{await R(m,["-m","pip","install","-U",_()],d);}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 St(){if(process.env.RAPIDKIT_BRIDGE_FORCE_VENV==="1")return {kind:"venv",pythonPath:await B()};for(let r of O())if(await at(r))return {kind:"system",cmd:r};let t=await dt();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 Jt(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"}),a=H((s.stdout??"").toString()),d=H((s.stderr??"").toString());return a&&process.stdout.write(a.endsWith(`
|
|
20
|
+
`)?a:`${a}
|
|
21
|
+
`),d&&process.stderr.write(d.endsWith(`
|
|
22
|
+
`)?d:`${d}
|
|
23
|
+
`),typeof s.exitCode=="number"?s.exitCode:1}let c=await execa(n,i,{cwd:e?.cwd,env:{...process.env,...e?.env},reject:false,stdio:"inherit"});return typeof c.exitCode=="number"?c.exitCode:1}catch(r){return process.stderr.write(`${D(r)}
|
|
24
|
+
`),1}}var It=[{pattern:/RapidKitError:\s*Directory '([^']+)' exists and force is not set/,message:t=>`\u274C Directory "${l.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 workspai list" to see available kits.`},{pattern:/RapidKitError:\s*(.+)/,message:t=>`\u274C ${t[1].trim()}`}];async function Wt(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(c=>{let s=r(i,o,{cwd:e?.cwd,env:{...process.env,...e?.env},stdio:["inherit","inherit","pipe"]}),a=[];s.stderr?.on("data",d=>{a.push(d);}),s.on("close",d=>{let P=d??1;if(P!==0&&a.length>0){let E=Buffer.concat(a).toString("utf8");for(let{pattern:R,message:m}of It){let h=E.match(R);if(h){process.stderr.write(m(h)+`
|
|
29
|
+
`),c(P);return}}process.stderr.write(E);}c(P);}),s.on("error",d=>{process.stderr.write(`${D(d)}
|
|
30
|
+
`),c(1);});})}catch(n){return process.stderr.write(`${D(n)}
|
|
31
|
+
`),1}}async function x(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:`${D(r)}
|
|
32
|
+
`}}}function pt(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 a=o.match(/^\s*rapidkit\s+([a-z0-9_-]+)\b/i);if(a){let d=a[1].trim();d&&!d.startsWith("-")&&e.add(d);}continue}if(!o.trim())break;if(/^\s*(Options|Arguments|Usage|Commands)\s*:/i.test(o))continue;let c=o.match(/^\s*([a-z0-9][a-z0-9_-]*)\b/i);if(!c)continue;let s=c[1].trim();s&&!s.startsWith("-")&&e.add(s);}return e}async function lt(){let t=st();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=st();await p.ensureDir(l.dirname(e)),await p.writeJson(e,t,{spaces:2});}async function Dt(){let t=await x(["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 Ot(){let t=await x(["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 Ht(){let e=Date.now(),r=await lt(),n=await Dt(),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 Ot();if(o?.length){let d=Array.from(new Set(o)).sort();return await Z({schema_version:1,fetched_at:e,rapidkit_version:n,commands:d}),new Set(d)}let c=await x(["--help"],{cwd:process.cwd()});if(c.exitCode!==0)return i&&r?.commands?new Set(r.commands):new Set(M);let s=pt(c.stdout);if(s.size===0)return new Set(M);let a=Array.from(s).sort();return await Z({schema_version:1,fetched_at:e,rapidkit_version:n,commands:a}),s}async function Yt(){let e=Date.now(),r=await lt();return !r||e-r.fetched_at>=864e5||!r.commands?.length?null:new Set(r.commands)}function mt(){return l.join(j(),"rapidkit","npm-bridge","modules-catalog.json")}async function jt(){let t=mt();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 X(t){let e=mt();await p.ensureDir(l.dirname(e)),await p.writeJson(e,t,{spaces:2});}function Q(t){try{return JSON.parse(t)}catch{return null}}async function Ut(t={}){let e=typeof t.ttlMs=="number"?t.ttlMs:18e5,r=Date.now(),n=await jt();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 x(i,{cwd:t.cwd,env:t.env});if(o.exitCode===0){let s=Q(o.stdout);if(s&&s.schema_version===1&&Array.isArray(s.modules)){let a={...s,fetched_at:r};return await X(a),a}}let c=await x(["modules","list","--json"],{cwd:t.cwd,env:t.env});if(c.exitCode===0){let s=Q(c.stdout);if(Array.isArray(s)){let a={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 X(a),a}}return n||null}var zt={pythonCommandCandidates:O,pickSystemPython:dt,ensureBridgeVenv:N,ensureBridgeVenvFromCandidates:B,parseCoreCommandsFromHelp:pt,tryRapidkit:at,findUserLocalRapidkitRunner:rt,findPathRapidkitRunner:it,findWorkspaceRunner:ct,checkRapidkitCoreAvailable:_t,checkRapidkitCoreVersionCompatible:At,isVersionSatisfyingConstraint:ut};export{M as a,_t as b,At as c,St as d,Jt as e,Wt as f,x as g,Ht as h,Yt as i,Ut as j,zt as k};
|
|
@@ -5,4 +5,4 @@ ${s}`,e=typeof n=="string"?n.trimEnd():"";return e?i.test(e)?`${e.replace(i,r).t
|
|
|
5
5
|
|
|
6
6
|
${r}
|
|
7
7
|
`:`${r}
|
|
8
|
-
`}function l(n){if(!n)return null;let t=n.match(i);return t?t[0].replace(c,"").replace(s,"").trim():null}export{
|
|
8
|
+
`}function l(n){if(!n)return null;let t=n.match(i);return t?t[0].replace(c,"").replace(s,"").trim():null}export{c as a,s as b,g as c,l as d};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import {d,b as b$1,e}from'./chunk-VKTUWUS6.js';import {d as d$2}from'./chunk-S5KTATOU.js';import {a}from'./chunk-2D4UOYOJ.js';import {p as p$1,w,t as t$1}from'./chunk-I42F552T.js';import {h,i,f,e as e$1}from'./chunk-GNQRYISX.js';import {d as d$1}from'./chunk-SS2VV3D5.js';import {a as a$1}from'./chunk-TQEMLBAG.js';import {t,p,s}from'./chunk-MOSXTVPU.js';import {e as e$2,g}from'./chunk-RJIYCDVC.js';import _ from'fs';import b from'path';import E from'chalk';import {execa}from'execa';function Se(e){return _.existsSync(b.join(e,"bun.lock"))||_.existsSync(b.join(e,"bunfig.toml"))?"bun":_.existsSync(b.join(e,"pnpm-lock.yaml"))?"pnpm":_.existsSync(b.join(e,"yarn.lock"))?"yarn":(_.existsSync(b.join(e,"package-lock.json")),"npm")}function Ee(e,t,r=Se(e)){return r==="npm"?`npm run ${t}`:`${r} run ${t}`}function Ce(e,t=Se(e)){return `${t} install`}var Ge={"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:[]}}},Be={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 se(e,t){if(t){let r=t.trim().toLowerCase().replace(/[_.\s]+/g,"-"),n=e$1(t),s=`${e}-${n==="gofiber"?"fiber":n==="gogin"?"gin":n==="dotnet"?"aspnetcore":n!=="unknown"?n:r==="fiber"?"fiber":r==="aspnetcore"||r==="asp-net-core"?"aspnetcore":r}`;return Ge[s]}}function Pe(e,t,r){if(t){let n=se(e,t);if(n&&n.commands[r])return n.commands[r]}if(["init","test","build","start"].includes(r)){let n=Be[r]?.[e]??[];return n.length>0?n[0]:void 0}}var ze={test:"test",build:"build",start:"start"};function ae(e){if(e.stage==="init")return e.runtime==="node"?Ce(e.projectPath):Pe(e.runtime,e.framework,e.stage);if(e.runtime==="node"){let t=ze[e.stage];if(t){let r=t$1(e.projectPath,t,{framework:e.framework});if(r)return Ee(e.projectPath,r.scriptName)}}return Pe(e.runtime,e.framework,e.stage)}function Ke(e){let t=h(e).map(r=>r==="python"?"python":r==="node"||r==="bun"?"node":r==="go"?"go":r==="java"?"java":r==="php"?"php":r==="rust"?"rust":r==="dotnet"?"dotnet":r==="elixir"?"elixir":r==="ruby"?"ruby":r==="clojure"||r==="scala"||r==="kotlin"?"jvm-generic":null).filter(r=>r!==null).filter((r,n,o)=>o.indexOf(r)===n);return {primary:t.length>0?t[0]:"unknown",secondary:t.slice(1)}}function Fe(e){return Ke(e).primary}function ie(e,t){if(!e)return "unknown";t||(t={setup:["ModuleNotFoundError","No module named","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[r,n]of Object.entries(t))for(let o of n)if(new RegExp(o,"i").test(e))return r;return "unknown"}async function q(e){let t=e.split(/[&|;]\s*/)[0].trim().split(/\s+/)[0];if(["echo","cd","pwd","test","true","false","exit"].includes(t))return {valid:true};try{let n=process.platform==="win32"?"where":"which";if((await execa(n,[t],{reject:false})).exitCode===0)return {valid:true}}catch{}return {valid:false,reason:`Command '${t}' not found or not executable`}}function Ae(e,t,r){if(!t)return e;let n=typeof t=="object"&&!Array.isArray(t)&&("dev"in t||"staging"in t||"prod"in t||"default"in t)&&!Object.keys(t).some(o=>["init","test","build","start"].includes(o))?t:{};return r&&typeof n[r]=="string"?n[r]:typeof n.default=="string"?n.default:e}var Ne={init:"init",test:"test",build:"build",start:"start"};function Ve(e){return e in Ne?Ne[e]:null}function He(e,t){let n=p$1(e)?.contextJson?.commands;if(!n||typeof n!="object"||Array.isArray(n))return;let o=n[t];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 Oe(e,t,r=w(e)){let n=Ve(t);if(!n)return He(e,t)?{supported:true}:{supported:false,reason:`Workspace stage "${t}" is not part of the Workspai fleet contract.`};if(!r.projectRoot)return {supported:false,reason:"No Workspai project metadata was detected for this target."};let o=r.commandMap[n];if(!o||o.status!=="supported"){let s=r.runtimeSupportTier==="observed"||r.frameworkSupportTier==="observed";return {supported:false,reason:o?.reason??`Command "${n}" is not supported for this project runtime/framework.`,shouldFail:!s}}return {supported:true}}var Ue=new Set(["init","test","build","start"]),Je=new Set([".git","node_modules",".workspai",".rapidkit",".venv","dist","build","coverage","htmlcov"]);async function I(e){try{return await _.promises.access(e,_.constants.F_OK),true}catch{return false}}async function qe(e){for(let t of e)if(await I(t))return true;return false}async function Ye(e,t,r){if(t==="python"){let o=[b.join(e,".workspai","cli.py"),b.join(e,".rapidkit","cli.py")];for(let s of o)if(await I(s))return {valid:true};return {valid:false,reason:"Project-local .workspai/cli.py is missing. Run `workspai init` in this project first."}}let n=r.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()})).exitCode===0)return {valid:true}}return q(r)}async function ue(e){let t=await _.promises.readFile(e,"utf-8");return JSON.parse(t)}function N(e){return e.replace(/\\/g,"/")}function Qe(e){let t=e?.trim();return t?t.startsWith("project:")?t.slice(8).trim()||null:t:null}async function Xe(e){return a(e,{skipDirs:Je,includeHiddenDirs:false,descendIntoMatchedProjects:false,isProjectDir:async(t$1,r)=>await qe([...t(t$1,"context.json"),...t(t$1,"project.json")])?true:b.resolve(t$1)===b.resolve(r)?false:h(t$1).length>0})}async function Ze(e){for(let t of [b.join(".workspai","project.json"),b.join(".workspai","context.json"),b.join(".rapidkit","project.json"),b.join(".rapidkit","context.json")]){let r=b.join(e,t);if(await I(r))try{let n=await ue(r),o=n.name??n.projectName??n.slug;if(typeof o=="string"&&o.trim())return o.trim()}catch{}}return null}async function et(e,t,r){let n=Qe(r);if(!n)return {projects:t,normalizedScope:null};let o=N(n).toLowerCase(),s=[];for(let c of t){let u=N(b.relative(e,c)),p=b.basename(c),m=await Ze(c);[u,p,m].filter(a=>typeof a=="string"&&a.length>0).map(a=>N(a).toLowerCase()).includes(o)&&s.push(c);}if(s.length===0)throw new Error(`Workspace run scope did not match any project: ${r}`);return {projects:s,normalizedScope:n}}async function tt(e,t,r){let n=await execa("git",["diff","--name-only",`${r}...HEAD`],{cwd:e,reject:false,env:a$1()});if(n.exitCode!==0)return new Set(t);let o=n.stdout.split(/\r?\n/).map(c=>c.trim()).filter(c=>c.length>0).map(c=>N(c));if(o.length===0)return new Set;let s=new Set;for(let c of t){let u=N(b.relative(e,c));if(!u||u===".")continue;let p=`${u}/`;o.some(m=>m===u||m.startsWith(p))&&s.add(c);}return s}async function rt(e,t,r){let n=await d$1(e,".workspai/workspace.contract.json")??p(e,"workspace.contract.json");if(await I(n))try{let g=await nt(e,t,r,n);if(g.graphStatus!=="missing")return g}catch{return {expanded:r,graphStatus:"invalid",expansionDepth:0}}let o=await d$1(e,".workspai/workspace-dependency-graph.json")??p(e,"workspace-dependency-graph.json");if(!await I(o))return {expanded:r,graphStatus:"missing",expansionDepth:0};let s;try{s=await ue(o);}catch{return {expanded:r,graphStatus:"invalid",expansionDepth:0}}let c=new Set(t.map(g=>b.resolve(g))),u=new Map;if(!s||typeof s!="object"||Array.isArray(s))return {expanded:r,graphStatus:"invalid",expansionDepth:0};let p$1=Array.isArray(s.projects)?s.projects:[];for(let g of p$1){if(!g||typeof g!="object"||Array.isArray(g))continue;let a=g,d=typeof a.path=="string"?a.path:"",y=b.resolve(e,d);if(!c.has(y))continue;let h=Array.isArray(a.dependsOn)?a.dependsOn.filter(w=>typeof w=="string"):[];for(let w of h){let x=b.resolve(e,w);c.has(x)&&(u.has(x)||u.set(x,new Set),u.get(x)?.add(y));}}let m=d$2(u,r);return {expanded:m.reached,graphStatus:"loaded",expansionDepth:m.added}}async function nt(e,t,r,n){let o=await ue(n);if(!o||typeof o!="object"||Array.isArray(o))return {expanded:r,graphStatus:"invalid",expansionDepth:0};let s=o,c=Array.isArray(s.projects)?s.projects:null;if(!c)return {expanded:r,graphStatus:"invalid",expansionDepth:0};let u=new Map,p=new Map;for(let y of t){let h=N(b.relative(e,y));p.set(h,b.resolve(y));}let m=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,w=typeof h.slug=="string"?h.slug:"",x=typeof h.relativePath=="string"?N(h.relativePath):w,R=p.get(x);!w||!R||u.set(w,R);}for(let y of c){if(!y||typeof y!="object"||Array.isArray(y))continue;let h=y,w=typeof h.slug=="string"?h.slug:"",x=u.get(w);if(!x)continue;let R=h.contracts&&typeof h.contracts=="object"&&!Array.isArray(h.contracts)?h.contracts:{},j=Array.isArray(R.dependsOn)?R.dependsOn.filter(v=>typeof v=="string"):[],O=Array.isArray(R.publishes)?R.publishes.filter(v=>typeof v=="string"):[],$=Array.isArray(R.consumes)?R.consumes.filter(v=>typeof v=="string"):[];for(let v of j){let S=u.get(v);S&&(a.has(S)||a.set(S,new Set),a.get(S)?.add(x));}for(let v of O)m.has(v)||m.set(v,new Set),m.get(v)?.add(x);for(let v of $)g.has(v)||g.set(v,new Set),g.get(v)?.add(x);}for(let[y,h]of m.entries()){let w=g.get(y);if(w)for(let x of h){a.has(x)||a.set(x,new Set);for(let R of w)R!==x&&a.get(x)?.add(R);}}let d=d$2(a,r);return {expanded:d.reached,graphStatus:"loaded",expansionDepth:d.added}}async function ot(e,t){if(typeof t=="boolean")return t;let r=s(e,"policies.yml").find(s=>_.existsSync(s))??p(e,"policies.yml");if(!await I(r))return true;let n="";try{n=await _.promises.readFile(r,"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}function st(e){let t=process.env.RAPIDKIT_WORKSPACE_RUN_STAGE_TIMEOUT_MS;if(t){let r=Number.parseInt(t,10);if(Number.isFinite(r)&&r>0)return r}return e==="init"?12e4:9e4}async function ce(e,t,r){let n=process.argv[1];if(!n)return {exitCode:1,stdout:"",stderr:"RapidKit entrypoint is unavailable for nested workspace-run execution."};try{let o=await execa(process.execPath,[n,...e],{cwd:t,reject:false,timeout:r,env:{...process.env,RAPIDKIT_WORKSPACE_RUN_CHILD:"1"}});return {exitCode:Number(o.exitCode??1),stdout:o.stdout,stderr:o.stderr}}catch(o){return {exitCode:typeof o=="object"&&o!==null&&"timedOut"in o&&!!o.timedOut?124:1,stdout:typeof o=="object"&&o!==null&&"stdout"in o?String(o.stdout??""):"",stderr:typeof o=="object"&&o!==null&&"stderr"in o?String(o.stderr??""):o instanceof Error?o.message:String(o)}}}function at(e){return e==="node"||e==="go"||e==="java"||e==="python"||e==="dotnet"||e==="rust"||e==="php"}function it(){return process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"}async function ct(e){let t=process.cwd();try{process.chdir(e);let{handleInitCommand:r}=await import('./index.js');return {exitCode:await r(["init"]),stdout:"",stderr:""}}finally{process.chdir(t);}}async function ut(e){let t=a=>{let d=f(a);return d==="node"||d==="bun"?"node":d==="python"?"python":d==="go"?"go":d==="java"?"java":d==="php"?"php":d==="ruby"?"ruby":d==="rust"?"rust":d==="dotnet"?"dotnet":d==="elixir"?"elixir":d==="clojure"||d==="scala"||d==="kotlin"?"jvm-generic":Fe(e)},r=a=>{if(!a)return;let d=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(d))return d},n=p$1(e),o=n?.detection??i(e,n?.projectJson??null),s=n?.contextJson,c=t(o.runtime),u=r(o.key),p={},m=new Set(["init","test","build","start"]);if(s?.commands&&typeof s.commands=="object")for(let[a,d]of Object.entries(s.commands))typeof d=="string"&&m.has(a)&&(p[a]=d);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:u,commandOverrides:Object.keys(p).length>0?p:void 0,environmentCommandVariants:g,environment:typeof s?.environment=="string"?s.environment:void 0}}async function dt(e,t,r,n,o,s,c){let u=!o?.[t]&&at(r),p;if(o&&o[t]?p=o[t]:u?p=`rapidkit ${t}`:p=ae({projectPath:e,runtime:r,framework:n,stage:t}),!p)return {exitCode:127,command:`<stage not supported for ${r}>`,message:`No stage command found for runtime '${r}' and framework '${n||"unknown"}'`,errorCategory:"runtime"};let m=Ae(p,s,c);if(!m)return {exitCode:127,command:p,message:"Failed to resolve stage command",errorCategory:"runtime"};let g=ae({projectPath:e,runtime:r,framework:n,stage:t});if(u){if(g){let f=u?await Ye(e,r,g):await q(g);if(!f.valid)return {exitCode:127,command:m,message:f.reason||"Command not available",errorCategory:"setup"}}}else {let f=await q(m);if(!f.valid)return {exitCode:127,command:m,message:f.reason||"Command not available",errorCategory:"setup"}}let a=0,d="",y="",h,w=st(t),x=Date.now();try{let f=u?t==="init"&&it()?await ct(e):await ce([t],e,w):await execa(m,[],{cwd:e,reject:false,shell:true,timeout:w});if(a=Number(f.exitCode??0),d=f.stdout,y=f.stderr,a!==0){let C=`${d}
|
|
2
|
+
${y}`,z=Date.now()-x;h=a===124||ie(C)==="timeout"||a===143&&z>=Math.floor(w*.8)?"timeout":ie(C);}}catch(f){let C=typeof f=="object"&&f!==null&&"timedOut"in f&&!!f.timedOut;return {exitCode:C?124:1,command:m,message:C?`Stage timed out after ${w}ms`:f instanceof Error?f.message:"Command execution failed",errorCategory:C?"timeout":"runtime"}}let R,j=`${d}
|
|
3
|
+
${y}`.split(/\r?\n/).map(f=>f.trim()).filter(Boolean),O=j.slice(0,6).join(`
|
|
4
|
+
`),$=Date.now()-x,v=a===124||h==="timeout"||a===143&&$>=Math.floor(w*.8),S=a===0?void 0:v?"timeout":h,T=a===0||!S?void 0:{category:S,exitCode:a,command:m,timedOut:v,timeoutMs:w,...O?{outputExcerpt:O}:{}};return {exitCode:a,command:m,errorCategory:S,healthStatus:R,failureDiagnostic:T,message:v?`Stage timed out after ${w}ms`:a!==0?O?`Stage failed with exit code ${a}: ${j[0]}`:`Stage failed with exit code ${a}`:void 0}}function De(e){try{return JSON.parse(e)}catch{return null}}function lt(e){switch(e){case "dotnet":return "Install .NET 8+ SDK, then rerun `npx workspai setup dotnet` or `npx workspai init`.";case "go":return "Install Go 1.21+, then rerun `npx workspai setup go` or `npx workspai init`.";case "java":case "jvm-generic":return "Install Java 21+ and Maven/Gradle, then rerun `npx workspai setup java` or `npx workspai init`.";case "node":return "Install Node.js LTS and npm/pnpm/yarn, then rerun `npx workspai setup node` or `npx workspai init`.";case "python":return "Install Python 3.10+ and pip/Poetry, then rerun `npx workspai setup python` or `npx workspai init`.";default:return null}}async function pt(e){let t=[],r=await ce(["doctor","workspace","--json"],e);if(r.exitCode!==0)t.push({gate:"doctor-workspace",status:"fail",summary:"doctor workspace command failed"});else {let s=De(r.stdout)?.healthScore,c=Number(s?.errors??0);Number.isFinite(c)&&c>0?t.push({gate:"doctor-workspace",status:"fail",summary:`doctor workspace reports ${c} error(s)`}):t.push({gate:"doctor-workspace",status:"pass",summary:"doctor workspace passed"});}let n=await ce(["readiness","--json"],e);if(n.exitCode!==0)t.push({gate:"readiness",status:"fail",summary:"readiness command failed"});else {let o=De(n.stdout),s=String(o?.overallStatus??"").toLowerCase();s==="fail"?t.push({gate:"readiness",status:"fail",summary:"readiness overall status is fail"}):s==="warn"?t.push({gate:"readiness",status:"warn",summary:"readiness overall status is warn"}):t.push({gate:"readiness",status:"pass",summary:"readiness overall status is pass"});}return t}var mt=new Set(["dev","stop"]);function ft(e){let t=e.trim();return !t||mt.has(t.toLowerCase())?false:Ue.has(t)?true:/^[a-z][a-z0-9_-]*$/i.test(t)}function Te(e,t,r){let n=N(b.relative(r,t));return (Array.isArray(e.projects)?e.projects:[]).some(s=>{if(!s||typeof s!="object")return false;let c=s,u=[c.relativePath,c.path].filter(p=>typeof p=="string"&&p.length>0).map(p=>N(p));return c.status==="passed"&&(u.includes(n)||u.some(p=>p.endsWith(`/${n}`)))})}function gt(e,t){return se(e,t)?.dependencies??[]}function yt(e,t){let r=Math.max(1,Math.min(4,t)),n=Number(e??r);return Number.isFinite(n)?Math.max(1,Math.min(16,Math.trunc(n))):r}async function Xt(e$1){if(!ft(e$1.stage))throw new Error(`Unsupported workspace run stage: ${e$1.stage}`);let t=Date.now(),r=b.resolve(e$1.workspacePath),n=await d(r),o=await Xe(r),{projects:s,normalizedScope:c}=await et(r,o,e$1.scope),u=e$1.affected===true,p=e$1.blastRadius===true,m=e$1.since?.trim()||"HEAD~1",g=u?await tt(r,s,m):new Set(s),a,d$1="not-applicable",y=0,h="all";if(u&&p){let l=await rt(r,o,g);a=l.expanded,d$1=l.graphStatus,y=l.expansionDepth,h="affected+blast-radius";}else u?(a=g,h="affected"):(a=g,h="all");let w=e$1.stage==="init"?false:await ot(r,e$1.enforceGates),x=w?await pt(r):[{gate:"doctor-workspace",status:"skipped",summary:"workspace run gates disabled"},{gate:"readiness",status:"skipped",summary:"workspace run gates disabled"}],R=x.find(l=>l.status==="fail"),j=s.filter(l=>a.has(l)),O=e$1.continueOnError===true||e$1.stage==="init",$=e$1.parallel===true,v=yt(e$1.maxWorkers,j.length),S=j.length,T=0;e$1.json||console.log(E.gray(`Workspace run (${e$1.stage}) started: ${S} target(s), ${$?`parallel x${v}`:"sequential"}`));let f=new Map;for(let l of o){let k=N(b.relative(r,l)),i=s.includes(l),F=i&&a.has(l);f.set(l,{path:l,relativePath:k,projectName:b.basename(k)||b.basename(l),selected:F,affected:F,status:"skipped",exitCode:null,durationMs:0,reason:F?void 0:i?"not affected":"outside scope",framework:void 0,runtimeDetected:void 0,executionCommand:void 0});}if(R)for(let l of j){let k=f.get(l);k&&(k.status="skipped",k.reason=`blocked by ${R.gate}`);}else {let l=async k=>{let i=f.get(k);if(!i)return;let F=N(b.relative(r,k));e$1.json||console.log(E.gray(`\u23F3 [${T}/${S}] ${e$1.stage} ${F}`)),i.selected=true,i.affected=true;let A=Date.now(),{runtime:P,framework:D,commandOverrides:$e,environmentCommandVariants:Ie,environment:Le}=await ut(k);i.runtimeDetected=P,i.framework=D;let Q=Oe(k,e$1.stage);if(!Q.supported){i.status=Q.shouldFail===false?"skipped":"failed",i.reason=Q.reason??`stage "${e$1.stage}" unsupported for project`,i.durationMs=Date.now()-A,i.exitCode=i.status==="failed"?127:null,i.status==="failed"&&(i.errorCategory="setup",i.errorMessage=i.reason),T+=1;return}if(e$1.reusePassed&&n){let M=n.stages[e$1.stage]??n.stages[e$1.stage];if(M&&Te(M,k,r)){i.status="passed",i.reason="reused passed result from workspace-run-last.json",i.durationMs=Date.now()-A,i.exitCode=0,T+=1,e$1.json||console.log(E.gray(`\u21BA reused passed cache for ${F}`));return}}let me=gt(P,D).filter(M=>M!==e$1.stage);if(me.length>0&&n){let M=me.find(X=>{let L=n.stages[X];return !L||!Te(L,k,r)});if(M){i.status="skipped",i.reason=`dependency stage "${M}" not satisfied in workspace-run-last.json`,i.durationMs=Date.now()-A,i.exitCode=null,T+=1;return}}let W=await dt(k,e$1.stage,P,D,$e,Ie,Le);if(i.executionCommand=W.command,i.errorCategory=W.errorCategory,i.healthStatus=W.healthStatus,i.failureDiagnostic=W.failureDiagnostic,i.durationMs=Date.now()-A,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),T+=1,!e$1.json){let M=S>0?Math.round(T/S*100):100,X=i.status==="passed"?E.green("\u2705"):E.red("\u274C");if(console.log(E.gray(`${X} [${T}/${S}] (${M}%) ${F} ${i.durationMs}ms`)),i.status==="failed"){i.reason&&console.log(E.red(` Reason: ${i.reason}`)),i.executionCommand&&console.log(E.gray(` Command: ${i.executionCommand}`));let L=lt(i.runtimeDetected);L&&i.errorCategory==="setup"&&console.log(E.gray(` Hint: ${L}`));}}};if($&&j.length>1){let k=0,i=false,F=new Array(v).fill(null).map(async()=>{for(;k<j.length;){if(i&&!O)return;let A=k;k+=1;let P=j[A];await l(P),f.get(P)?.status==="failed"&&(i=true);}});if(await Promise.all(F),!O&&i){let A=false;for(let P of j){let D=f.get(P);if(D){if(D.status==="failed"){A=true;continue}A&&D.status==="skipped"&&(D.reason=D.reason||"stopped after failure");}}}}else for(let k of j){await l(k);let i=f.get(k);if(!O&&i?.status==="failed"){let F=j.slice(j.indexOf(k)+1);for(let A of F){let P=f.get(A);P&&(P.status="skipped",P.reason="stopped after failure");}break}}}let C=[];for(let l of o){let k=f.get(l);k&&C.push(k);}let z=C.filter(l=>l.status==="passed").length,K=C.filter(l=>l.status==="failed").length,de=C.filter(l=>l.status==="skipped").length,le=e$1.strict===true,Me=K>0||le&&x.some(l=>l.status==="fail"||l.status==="warn")?1:0,pe={schemaVersion:"1.0",workspacePath:r,stage:e$1.stage,generatedAt:new Date().toISOString(),durationMs:Date.now()-t,options:{affected:u,blastRadius:p,since:u?m:null,parallel:$,maxWorkers:v,continueOnError:O,strict:le,enforceGates:w,scope:c,reusePassed:e$1.reusePassed===true},selection:{mode:h,since:u?m:null,scope:c,graphStatus:d$1,expansionDepth:y},gates:{enforced:w,results:x,blocked:!!R,blockingGate:R?.gate},summary:{projectCount:o.length,selectedCount:j.length,passed:z,failed:K,skipped:de,exitCode:Me},projects:C,enterpriseControls:{jsonReady:true,evidencePath:b$1}},We=b.join(r,b$1);return await e(r,pe),e$1.json||(R&&(console.log(E.red(`\u274C Workspace run blocked by ${R.gate}`)),console.log(E.gray(` ${R.summary}`))),console.log(E.cyan(`Workspace run (${e$1.stage}) => passed: ${z}, failed: ${K}, skipped: ${de}`)),console.log(E.gray(`Report: ${We}`))),pe}export{Xt as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {b as b$2,c,d as d$1}from'./chunk-KXG6E5VK.js';import {c as c$1}from'./chunk-VKTUWUS6.js';import {a as a$2,b as b$3}from'./chunk-PYCJWW4B.js';import {p as p$1,a as a$1,o,g,d as d$4,f}from'./chunk-C3FLCDRN.js';import {p,l,f as f$1}from'./chunk-L2YK5RV2.js';import {d}from'./chunk-EWZZUQBR.js';import {d as d$3}from'./chunk-KMLPHFLD.js';import {d as d$2,e}from'./chunk-SS2VV3D5.js';import {a as a$3}from'./chunk-AFIFZTOY.js';import {b as b$1,a,c as c$2}from'./chunk-AHLMIL2T.js';import m from'path';import v from'fs-extra';var ae="rapidkit-blocker-resolution-v1";function ce(e){let t=e.blockers.map(s=>s.trim()).filter(Boolean).slice(0,12),r=e.stderrTail?.trim().slice(-400)??"";return f$1({blockers:t,exitCode:e.exitCode??null,stderrTail:r})}function ke(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 ye(e){let t=ke(e.reason),r=ce({blockers:[e.reason]}),s=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:ae,blockerId:e.blockerId,sourceCommand:e.sourceCommand,sourceArtifact:e.sourceArtifact,resolutionClass:t,blockerSignature:r,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:s,verifyCommand:e.verifyCommand,verifyArtifact:e.verifyArtifact}}function de(e){return Array.from(new Set(e.blockingReasons.map(r=>r.trim()).filter(Boolean))).slice(0,12).map((r,s)=>ye({reason:r,blockerId:`blocker-${s+1}`,sourceCommand:e.sourceCommand,sourceArtifact:e.sourceArtifact,verifyCommand:e.verifyCommand,verifyArtifact:e.verifyArtifact}))}function he(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("doctor-project-last-run")||t.includes("doctor-remediation-plan-last-run")||t.includes("doctor-fix-result-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 ve(e){return e.length===0||e.every(t=>he(t))}function le(e){return e.projectCount>0||e.policyErrorCount>0?{verdict:e.verdict,exitCode:e.exitCode}:e.verdict==="blocked"&&ve(e.blockingReasons)?{verdict:"needs-attention",exitCode:1}:{verdict:e.verdict,exitCode:e.exitCode}}function Ye(e,t){let r=t&&t!=="ready"?` (${t.replace(/-/g," ")})`:"";return e===0?`Workspace scaffold ready${r} \u2014 add your first project to continue.`:`Workspace scaffold${r}: ${e} pre-project signal(s) \u2014 add your first project to continue.`}var fe=b$1.verify,J=a.verify;function be(e,t){return m.isAbsolute(t)?t:m.join(e,t)}async function ue(e){let t=await v.readJson(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace impact input is not a JSON object: ${e}`);let r=t;if(r.schemaVersion!==f)throw new Error(`Unsupported workspace impact schema: ${String(r.schemaVersion)}`);a$3(t,"contracts/workspace-intelligence/workspace-impact.v1.json",`Workspace impact ${e}`);let s=r;a$3(s.diff,"contracts/workspace-intelligence/workspace-model-diff.v1.json",`Embedded workspace diff in ${e}`);let i=[];s.summary.affectedProjects!==s.affectedProjects.length&&i.push("summary.affectedProjects does not match affectedProjects.length"),s.summary.workspaceItems!==s.workspaceImpact.length&&i.push("summary.workspaceItems does not match workspaceImpact.length"),s.summary.recommendedCommands!==s.verificationPlan.length&&i.push("summary.recommendedCommands does not match verificationPlan.length"),s.summary.blastRadius.directlyAffected!==s.affectedProjects.length&&i.push("blastRadius.directlyAffected does not match affectedProjects.length"),s.summary.blastRadius.transitivelyAffected!==s.transitiveImpact.length&&i.push("blastRadius.transitivelyAffected does not match transitiveImpact.length");let o=s.transitiveImpact.reduce((u,d)=>Math.max(u,d.distance??0),0);s.summary.blastRadius.maxDistance!==o&&i.push("blastRadius.maxDistance does not match transitive impact distances");let k=l(s.diff.currentModel)?.edges.length??0;if(s.summary.blastRadius.graphEdges!==k&&i.push("blastRadius.graphEdges does not match the embedded model graph"),s.summary.changed!==s.diff.summary.changed&&i.push("summary.changed does not match embedded diff summary"),s.fromRef!==s.diff.fromRef&&i.push("fromRef does not match embedded diff fromRef"),s.workspace.name!==s.diff.currentModel.workspace.name&&i.push("workspace.name does not match the embedded model"),s.diff.toHash!==d(s.diff.currentModel)&&i.push("embedded diff current-model hash does not match toHash"),i.length>0)throw new Error(`Workspace impact semantic integrity failed: ${i.join("; ")} (${e})`);return s}function we(e){let t=new Set,r=[];for(let s of e){let i=`${s.scope}:${s.project??""}:${s.display}`;t.has(i)||(t.add(i),r.push(s));}return r}function Re(e,t){if(!e||e==="workspace")return true;let r=(e.startsWith("project:")?e.slice(8):e).trim().toLowerCase();return t.scope==="workspace"?true:(t.project??"").trim().toLowerCase()===r}function Ce(e,t){if(e.id==="workspace.doctor")return m.join(t,a.doctor);if(e.id==="workspace.contract.verify")return m.join(t,a.contractVerify);if(e.id==="workspace.readiness")return m.join(t,a.readiness);if(e.id==="workspace.analyze")return m.join(t,".workspai","reports","analyze-last-run.json");if(e.id==="workspace.pipeline")return m.join(t,".workspai","reports","pipeline-last-run.json");if(e.id==="workspace.doctor-fix")return m.join(t,".workspai","reports","doctor-fix-result-last-run.json");if(e.id.startsWith("project.")&&e.id.includes("."))return m.join(t,".workspai","reports","workspace-run-last.json")}function b(e){return !e||typeof e!="object"||Array.isArray(e)?null:e}function Ae(e){let t=b(e.healthScore),r=b(e.summary),s=typeof t?.errors=="number"?t.errors:0,i=typeof t?.percent=="number"?t.percent:void 0;return s>0||r?.hasSystemErrors===true?{status:"fail",message:`Doctor evidence reports ${s} error(s).`}:typeof i=="number"&&i<70?{status:"warn",message:`Doctor health score is ${i}%.`}:{status:"pass",message:"Doctor evidence is present and healthy."}}function je(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 Ee(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 Se(e){let t=b(e.summary),r=typeof t?.verdict=="string"?t.verdict:void 0;return r==="blocked"?{status:"fail",message:"Analyze evidence reports blocking findings."}:r==="needs-attention"?{status:"warn",message:"Analyze evidence reports warnings."}:{status:"pass",message:"Analyze evidence is ready."}}function We(e){let t=e.schemaVersion==="rapidkit-doctor-fix-result-v1"?e: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 r=t,s=Array.isArray(r.remainingBlockers)?r.remainingBlockers:[];if(s.length>0)return {status:"fail",message:`Doctor fix result reports ${s.length} remaining blocker(s).`};let i=Array.isArray(r.appliedFixes)?r.appliedFixes:[];return i.length===0?{status:"pass",message:"Doctor fix result recorded with no remaining blockers."}:{status:"pass",message:`Doctor fix result recorded ${i.length} applied fix(es) with no remaining blockers.`}}async function xe(e,t){let r=await d$2(e,".workspai/reports/doctor-remediation-plan-last-run.json");if(!r)return false;try{let s=b(await v.readJson(r));if(!s||(Array.isArray(s.steps)?s.steps:[]).length>0)return false;let o=typeof s.generatedAt=="string"?s.generatedAt:void 0;if(!o||!t)return true;let k=Date.parse(o),u=Date.parse(t);return !Number.isFinite(k)||!Number.isFinite(u)?true:k>=u}catch{return false}}function Pe(e){return e.id.endsWith(".init")?"init":e.id.endsWith(".test")?"test":e.id.endsWith(".build")?"build":e.id.endsWith(".start")?"start":null}function Ie(e){let t=b(e.summary),r=typeof t?.verdict=="string"?t.verdict:void 0;return r==="blocked"?{status:"fail",message:"Pipeline evidence is blocked."}:r==="needs-attention"?{status:"warn",message:"Pipeline evidence needs attention."}:r==="ready"?{status:"pass",message:"Pipeline evidence is ready."}:{status:"warn",message:"Pipeline evidence status is unknown."}}function Ve(e,t,r){let s=Pe(t),i=c$1(e,s??void 0);if(!i)return {status:"missing",message:"Workspace run evidence is missing or unreadable."};let o=i.stage;if(s&&o!==s)return {status:"missing",message:`Workspace run evidence is for stage "${o}", expected "${s}".`};let k=Array.isArray(i.projects)?i.projects:[],u=t.project?.toLowerCase();if(!u)return {status:"missing",message:"Project-scoped workspace run evidence is missing a project identifier."};let d=k.find(g=>{let c=b(g);if(!c)return false;let n=typeof c.projectName=="string"?c.projectName.toLowerCase():"",a=["projectPath","relativePath","path"].map(f=>c[f]).filter(f=>typeof f=="string"&&f.trim().length>0).map(f=>f.replace(/\\/g,"/").toLowerCase());return n===u||a.some(f=>f.endsWith(`/${u}`)||f===u)});if(d){let g=C(i.generatedAt,r,`Workspace run evidence for ${t.project??t.id}`);if(g)return {status:"fail",message:g};let c=b(d),n=typeof c?.status=="string"?c.status:"unknown";return n==="failed"?{status:"fail",message:`Workspace run evidence failed for ${t.project}.`}:n==="passed"?{status:"pass",message:`Workspace run evidence passed for ${t.project}.`}:n==="skipped"?{status:"warn",message:`Workspace run evidence skipped for ${t.project}.`}:{status:"warn",message:`Workspace run evidence status is ${n} for ${t.project}.`}}return {status:"missing",message:`Workspace run evidence does not include project ${t.project}.`}}function C(e,t,r){if(!t)return null;if(typeof e!="string"||e.trim().length===0)return `${r} is stale: missing generatedAt timestamp (required after impact ${t}).`;let s=Date.parse(e),i=Date.parse(t);return Number.isFinite(s)?Number.isFinite(i)&&s<i?`${r} is stale: generated at ${e}, before impact ${t}.`:null:`${r} is stale: invalid generatedAt timestamp (required after impact ${t}).`}function $e(e){if(e.id==="workspace.doctor")return c$2.doctor;if(e.id==="workspace.readiness")return c$2.readiness;if(e.id==="workspace.contract.verify")return c$2.contractVerify;if(e.id==="workspace.analyze")return c$2.analyze;if(e.id==="workspace.pipeline")return "contracts/pipeline-last-run.v1.json"}async function Fe(e,t,r,s){let i=Ce(e,t),o=i?m.relative(t,i).split(m.sep).join("/"):void 0;if(e.id==="workspace.contract.verify"&&!r)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."};let k=i?await d$2(t,o??""):null;if(!i||!k)return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"missing",required:e.required,evidencePath:o,message:o?`Missing evidence report: ${o}`:"No evidence mapping exists for this command."};let u;try{u=await v.readJson(k);}catch(n){return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"fail",required:e.required,evidencePath:o,message:`Evidence report is unreadable JSON: ${n instanceof Error?n.message:String(n)}`}}let d=b(u);if(!d)return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"fail",required:e.required,evidencePath:o,message:"Evidence report is not a JSON object."};let g=$e(e);if(g)try{a$3(d,g,`${e.label} evidence`);}catch(n){return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"fail",required:e.required,evidencePath:o,message:`Evidence report is invalid: ${n instanceof Error?n.message:String(n)}`}}let c;if(e.id==="workspace.doctor"){let n=C(d.generatedAt,s,"Doctor evidence");n?c={status:"fail",message:n}:c=Ae(d);}else if(e.id==="workspace.readiness"){let n=C(d.generatedAt,s,"Release readiness evidence");n?c={status:"fail",message:n}:c=je(d);}else if(e.id==="workspace.contract.verify"){let n=C(d.generatedAt,s,"Workspace contract verify evidence");n?c={status:"fail",message:n}:c=Ee(d);}else if(e.id==="workspace.analyze"){let n=C(d.generatedAt,s,"Analyze evidence");n?c={status:"fail",message:n}:c=Se(d);}else if(e.id==="workspace.pipeline"){let n=C(d.generatedAt,s,"Pipeline evidence");n?c={status:"fail",message:n}:c=Ie(d);}else if(e.id==="workspace.doctor-fix"){let n=d.schemaVersion==="rapidkit-doctor-fix-result-v1"?d:d.fixResult,a=b(n),f=typeof a?.generatedAt=="string"?a.generatedAt:void 0,y=C(f,s,"Doctor fix result");y?c={status:"fail",message:y}:await xe(t,f)?c={status:"skipped",message:"No current doctor remediation steps are pending."}:c=We(d);}else if(e.id.startsWith("project."))c=Ve(d,e,s);else {let n=C(d.generatedAt,s,"Evidence report");n?c={status:"fail",message:n}:c={status:"pass",message:"Evidence report is present."};}return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:c.status,required:e.required,evidencePath:o,message:c.message}}function Oe(e,t={blockingReasons:[],needsAttention:false}){let r=e.filter(n=>n.status==="pass").length,s=e.filter(n=>n.status==="warn").length,i=e.filter(n=>n.status==="fail").length,o=e.filter(n=>n.status==="missing").length,k=e.filter(n=>n.status==="skipped").length,u=e.filter(n=>n.required&&(n.status==="fail"||n.status==="missing")).map(n=>`${n.id}: ${n.message}`),d=e.filter(n=>n.required&&n.status==="missing").length,g="ready",c=0;return u.length>0||t.blockingReasons.length>0?(g="blocked",c=2):(s>0||e.some(n=>!n.required&&n.status==="fail")||d>0||t.needsAttention)&&(g="needs-attention",c=1),{verdict:g,exitCode:c,stepsPassed:r,stepsWarn:s,stepsFailed:i,stepsMissing:o,stepsSkipped:k}}function Be(e,t){let r=S(e.affectedProjects.map(a=>a.project?.name).filter(a=>typeof a=="string")),s=new Set(r.map(a=>a.toLowerCase())),i=S(e.transitiveImpact.map(a=>a.project?.name).filter(a=>typeof a=="string").filter(a=>!s.has(a.toLowerCase()))),o=new Map;for(let a of t){if(a.scope!=="project"||!a.project)continue;let f=a.project.toLowerCase(),y=o.get(f)??[];y.push(a),o.set(f,y);}let k=[],u=[],d=[],g=[],c=false,n=(a,f)=>{let y=o.get(a.toLowerCase())??[];if(y.length===0){d.push(a);return}let W=y.filter(p=>p.status==="fail"),w=W.filter(p=>p.required),x=y.filter(p=>p.status==="missing"),A=x.filter(p=>p.required),P=y.some(p=>p.status==="pass"||p.status==="warn");if(w.length>0){u.push(a),g.push(`graph.subgraph.${a}: ${f} has failed verification evidence (${w.map(p=>p.id).join(", ")}).`);return}if(W.length>0){u.push(a),c=true;return}if(A.length>0){u.push(a),g.push(`graph.subgraph.${a}: ${f} has missing required verification evidence (${A.map(p=>p.id).join(", ")}).`);return}if(x.length>0){u.push(a),c=true;return}if(P){k.push(a);return}d.push(a);};for(let a of r)n(a,"directly-changed");for(let a of i)n(a,"transitive dependent");return {subgraph:{totalProjects:r.length+i.length,directlyChanged:r,transitiveDependents:i,covered:S(k),uncovered:S(u),unverifiable:S(d)},blockingReasons:g,needsAttention:c}}function S(e){return [...new Set(e)].sort((t,r)=>t.localeCompare(r))}async function _e(e){let t=m.resolve(e.workspacePath);if(e.fromImpactPath){let o=be(t,e.fromImpactPath);return {impact:await ue(o),fromImpactRef:m.relative(t,o).split(m.sep).join("/"),impactFromDisk:true}}let r=m.join(t,g);if(await v.pathExists(r))return {impact:await ue(r),fromImpactRef:g,impactFromDisk:true};let s=m.join(t,d$4);if(await v.pathExists(s))return {impact:await p$1({workspacePath:t,fromPath:d$4,scope:e.scope,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now}),fromImpactRef:d$4,impactFromDisk:false};let i=await p({workspacePath:t,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now});return {impact:{schemaVersion:f,generatedAt:(e.now??new Date).toISOString(),fromRef:"baseline",diffRef:a.diff,workspace:{name:i.workspace.name,profile:i.workspace.profile,type:i.workspace.type},summary:{changed:false,risk:"none",affectedProjects:0,workspaceItems:0,recommendedCommands:0,blastRadius:{directlyAffected:0,transitivelyAffected:0,maxDistance:0,graphEdges:l(i)?.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:b$1.diff,generatedAt:(e.now??new Date).toISOString(),fromRef:"baseline",toRef:a.model,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:i}},impactFromDisk:false}}function De(e,t){if(t)return e.generatedAt}async function pt(e){let t=m.resolve(e.workspacePath),{impact:r,fromImpactRef:s,impactFromDisk:i}=await _e(e),o$1=r.diff.currentModel,k=i?await p({workspacePath:t,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now}):o$1,u=[];if(i){let l=await p$1({workspacePath:t,fromPath:r.diff.fromRef,diff:r.diff,scope:e.scope,now:e.now}),_=[r.affectedProjects,r.transitiveImpact,r.verificationPlan],D=[l.affectedProjects,l.transitiveImpact,l.verificationPlan];JSON.stringify(_)!==JSON.stringify(D)&&u.push("workspace.impact: Persisted impact semantics do not match the impact re-derived from the embedded diff. Regenerate diff and impact.");}i&&d(k)!==r.diff.toHash&&u.push("workspace.impact: Impact evidence is stale because the current workspace model no longer matches the embedded model. Regenerate diff and impact.");let d$2=r.diff.git;if(i&&d$2?.available){let l=a$1(t,{ref:d$2.ref}),_=r.diff.changes.filter(h=>h.type.startsWith("git.")).map(h=>`${h.type}:${h.target.replace(/^git:/,"")}`).sort(),D=[...l.changedFiles.map(h=>`git.file.changed:${h}`),...l.untrackedFiles.map(h=>`git.untracked:${h}`),...l.deletedFiles.map(h=>`git.deleted:${h}`)].sort();(!l.available||l.commit!==d$2.commit||JSON.stringify(D)!==JSON.stringify(_))&&u.push("workspace.impact: Impact evidence is stale because Git changes no longer match the diff observation. Regenerate diff and impact.");}let g=De(r,i),c$1=we([...o(),...r.verificationPlan]).filter(l=>Re(e.scope,l)),n=[];for(let l of c$1)n.push(await Fe(l,t,o$1.contracts.exists===true,g));let a=Be(r,n),f=a$2(l(o$1)??{nodes:[],edges:[]}),y=b$2(o$1),W=await Ne(t),w=c(y,W?.freshness?.projectHashes),x={verdict:w.verdict,baseline:w.baseline,changed:w.changed,added:w.added,removed:w.removed,projectHashes:d$1(y)},A=b$3(f),P=o$1.policies?.mode??"warn",p$2=await He(o$1,t),B=Me(P,p$2),j=Oe(n,{blockingReasons:[...a.blockingReasons,...A,...B.blockingReasons,...u],needsAttention:a.needsAttention||B.needsAttention}),pe=n.filter(l=>l.status==="missing"&&l.evidencePath).map(l=>l.evidencePath),I=[...n.filter(l=>l.required&&(l.status==="fail"||l.status==="missing")).map(l=>`${l.id}: ${l.message}`),...a.blockingReasons,...A,...B.blockingReasons,...u],me=p$2.filter(l=>l.severity==="error").length,ge=o$1.summary?.projectCount??o$1.projects.length,G=le({projectCount:ge,verdict:j.verdict,exitCode:j.exitCode,blockingReasons:I,policyErrorCount:me});j.verdict=G.verdict,j.exitCode=G.exitCode;let U=I.length>0?de({blockingReasons:I,verifyCommand:"npx workspai workspace verify --from-impact .workspai/reports/workspace-impact-last-run.json --json",verifyArtifact:J}):[];return {schemaVersion:fe,generatedAt:(e.now??new Date).toISOString(),workspacePath:t,mode:"evidence",fromImpactRef:s,scope:e.scope,impact:{changed:r.summary.changed,risk:r.summary.risk,affectedProjects:r.summary.affectedProjects,recommendedCommands:r.summary.recommendedCommands},summary:j,steps:n,missingEvidence:pe,blockingReasons:I,...U.length>0?{resolutionHints:U}:{},verificationPlan:c$1,affectedSubgraph:a.subgraph,graphIntegrity:f,freshness:x,policyMode:P,policyViolations:p$2}}async function He(e,t){let r=[];for(let i of e.validation?.issues??[])r.push({source:"model",severity:i.severity,code:i.code,message:i.message,target:i.target});let s=await d$2(t,a.contractVerify);try{if(s&&await v.pathExists(s)){let i=await v.readJson(s);if(Array.isArray(i.violations))for(let o of i.violations)typeof o=="string"&&o.trim().length>0&&r.push({source:"contract",severity:"error",code:"contract.violation",message:o});}}catch{}return r.sort((i,o)=>i.source!==o.source?i.source.localeCompare(o.source):i.code!==o.code?i.code.localeCompare(o.code):i.message.localeCompare(o.message))}function Me(e,t){let r=t.filter(s=>s.severity==="error");return e==="enforce"&&r.length>0?{blockingReasons:r.map(s=>`policy.${s.code}: ${s.message}`),needsAttention:false}:{blockingReasons:[],needsAttention:r.length>0}}async function Ne(e){let t=m.join(e,J);try{if(!await v.pathExists(t))return null;let r=await v.readJson(t);return r&&r.schemaVersion===fe?r:null}catch{return null}}async function mt(e$1,t){return e(t,J,d$3(e$1))}function Te(e,t){let r=t?.strict?"strict":"default",s=[];if(e.summary.verdict==="blocked")return s.push(...e.blockingReasons),s.length===0&&s.push("verify verdict is blocked."),{passed:false,mode:r,exitCode:2,reasons:s};if(r==="strict"){if(e.summary.verdict!=="ready"&&s.push(`verify verdict is ${e.summary.verdict} (strict requires ready).`),e.freshness.verdict==="stale"){let i=[...e.freshness.changed,...e.freshness.added].slice(0,5);s.push(`freshness is stale${i.length>0?`: ${i.join(", ")}`:""} (strict requires fresh).`);}if(s.length>0)return {passed:false,mode:r,exitCode:1,reasons:s}}return {passed:true,mode:r,exitCode:0,reasons:s}}function gt(e,t){return Te(e,t).exitCode}export{ae as a,Ye as b,fe as c,J as d,Be as e,pt as f,mt as g,Te as h,gt as i};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import m from'fs';import i from'path';import {fileURLToPath}from'url';import y from'ajv';import w from'ajv/dist/2020.js';import $ from'ajv-formats';var d=new Map,A=["https://workspai.dev/schemas/","https://workspai.dev/contracts/"];function p(n,e){let r=A.find(t=>n.startsWith(t));if(r){let t=decodeURIComponent(n.slice(r.length)),s=t.split("/");if(!t||i.isAbsolute(t)||t.includes("\\")||t.includes("\0")||t.includes("?")||s.some(o=>o===".."||o==="."))throw new Error(`Unsafe Workspai JSON Schema reference: ${n}`);return `contracts/${t}`}if(!/^https?:\/\//i.test(n))return i.join(i.dirname(e),n).split(i.sep).join("/")}function f(n,e=new Set){if(Array.isArray(n)){for(let r of n)f(r,e);return e}if(!n||typeof n!="object")return e;for(let[r,t]of Object.entries(n))r==="$ref"&&typeof t=="string"&&!t.startsWith("#")?e.add(t.split("#",1)[0]??t):f(t,e);return e}function l(n,e,r,t=new Set){for(let s of f(e)){if(!s)continue;let o=p(s,r);if(!o)continue;let c=h(o);if(t.has(c))continue;t.add(c);let a=JSON.parse(m.readFileSync(c,"utf8"));l(n,a,o,t),n.addSchema(a);}}function h(n){let e=i.dirname(fileURLToPath(import.meta.url)),t=[i.resolve(e,"..",n),i.resolve(e,"../..",n),i.resolve(process.cwd(),n)].find(s=>m.existsSync(s));if(!t)throw new Error(`JSON Schema contract is unavailable: ${n}`);return t}function S(n){let e=h(n),r=d.get(e);if(r)return r;let t=JSON.parse(m.readFileSync(e,"utf8"));if(typeof t.$ref=="string"&&!t.$ref.startsWith("#")){let a=p(t.$ref.split("#",1)[0]??t.$ref,n);if(a){let u=S(a);return d.set(e,u),u}}let s=t.$schema?.includes("2020-12")?w:y,o=new s({allErrors:true,strict:true,allowUnionTypes:true});$(o),l(o,t,n);let c=o.compile(t);return d.set(e,c),c}function j(n){return (n??[]).slice(0,8).map(e=>{let r=e.instancePath||"/",t=e.keyword==="additionalProperties"?` (${String(e.params.additionalProperty)})`:"";return `${r} ${e.message??e.keyword}${t}`}).join("; ")}function T(n,e,r){let t=S(e);if(!t(n))throw new Error(`${r} violates ${e}: ${j(t.errors)}`)}
|
|
2
|
+
export{T as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var o={model:".workspai/reports/workspace-model.json",knowledgeGraph:".workspai/reports/workspace-knowledge-graph.json",snapshot:".workspai/reports/workspace-model-snapshot.json",diff:".workspai/reports/workspace-model-diff-last-run.json",impact:".workspai/reports/workspace-impact-last-run.json",analyze:".workspai/reports/analyze-last-run.json",doctor:".workspai/reports/doctor-last-run.json",contractVerify:".workspai/reports/workspace-contract-verify-last-run.json",readiness:".workspai/reports/release-readiness-last-run.json",verify:".workspai/reports/workspace-verify-last-run.json",history:".workspai/reports/workspace-intelligence-history.json",agentContext:".workspai/reports/workspace-context-agent.json",agentIndex:".workspai/reports/INDEX.json",agentCustomizationPack:".workspai/reports/agent-customization-pack.json",skillsIndex:".workspai/reports/workspace-skills-index.json",agents:"AGENTS.md",explain:".workspai/reports/workspace-explain-last-run.json",intelligenceRun:".workspai/reports/workspace-intelligence-run-last-run.json",evaluationLive:".workspai/reports/workspace-intelligence-evaluation-live.json",evaluationLastRun:".workspai/reports/workspace-intelligence-evaluation-last-run.json"},
|
|
1
|
+
var o={model:".workspai/reports/workspace-model.json",knowledgeGraph:".workspai/reports/workspace-knowledge-graph.json",snapshot:".workspai/reports/workspace-model-snapshot.json",diff:".workspai/reports/workspace-model-diff-last-run.json",impact:".workspai/reports/workspace-impact-last-run.json",analyze:".workspai/reports/analyze-last-run.json",doctor:".workspai/reports/doctor-last-run.json",contractVerify:".workspai/reports/workspace-contract-verify-last-run.json",readiness:".workspai/reports/release-readiness-last-run.json",verify:".workspai/reports/workspace-verify-last-run.json",history:".workspai/reports/workspace-intelligence-history.json",agentContext:".workspai/reports/workspace-context-agent.json",agentIndex:".workspai/reports/INDEX.json",agentCustomizationPack:".workspai/reports/agent-customization-pack.json",skillsIndex:".workspai/reports/workspace-skills-index.json",agents:"AGENTS.md",explain:".workspai/reports/workspace-explain-last-run.json",intelligenceRun:".workspai/reports/workspace-intelligence-run-last-run.json",evaluationLive:".workspai/reports/workspace-intelligence-evaluation-live.json",evaluationLastRun:".workspai/reports/workspace-intelligence-evaluation-last-run.json"},r={model:"workspace-model.v1",knowledgeGraph:"workspace-knowledge-graph.v1",snapshot:"workspace-model-snapshot.v1",diff:"workspace-model-diff.v1",impact:"workspace-impact.v1",analyze:"rapidkit-analyze-v1",doctor:"doctor-workspace-evidence-v1",contractVerify:"workspace-contract-verify.v1",readiness:"release-readiness-v1",verify:"workspace-verify.v1",history:"workspace-intelligence-history.v1",agentContext:"workspace-context.v1",agentIndex:"rapidkit-agent-reports-index.v1",agentCustomizationPack:"rapidkit-agent-customization-pack.v1",skillsIndex:"workspace-skills-index.v1",agents:null,explain:"workspace-explain.v1",intelligenceRun:"workspace-intelligence-run.v1",evaluationLive:"workspace-intelligence-evaluation.v1",evaluationLastRun:"workspace-intelligence-evaluation.v1"},c={model:"contracts/workspace-intelligence/workspace-model.v1.json",knowledgeGraph:"contracts/workspace-intelligence/workspace-knowledge-graph.v1.json",snapshot:"contracts/workspace-intelligence/workspace-model-snapshot.v1.json",diff:"contracts/workspace-intelligence/workspace-model-diff.v1.json",impact:"contracts/workspace-intelligence/workspace-impact.v1.json",analyze:"contracts/analyze-last-run.v1.json",doctor:"contracts/doctor-workspace-evidence.v1.json",contractVerify:"contracts/workspace-intelligence/workspace-contract-verify.v1.json",readiness:"contracts/release-readiness.v1.json",verify:"contracts/workspace-intelligence/workspace-verify.v1.json",history:"contracts/workspace-intelligence/workspace-intelligence-history.v1.json",agentContext:"contracts/workspace-intelligence/workspace-context.v1.json",agentIndex:"contracts/workspace-intelligence/agent-reports-index.v1.json",agentCustomizationPack:"contracts/workspace-intelligence/agent-customization-pack-report.v1.json",skillsIndex:"contracts/workspace-intelligence/workspace-skills-index.v1.json",agents:null,explain:"contracts/workspace-intelligence/workspace-explain.v1.json",intelligenceRun:"contracts/workspace-intelligence/workspace-intelligence-run.v1.json",evaluationLive:"contracts/workspace-intelligence/workspace-intelligence-evaluation.v1.json",evaluationLastRun:"contracts/workspace-intelligence/workspace-intelligence-evaluation.v1.json"},i={analyze:"analyze",workspace:"workspace <action> [subaction] [key] [value]",doctor:"doctor [scope]",readiness:"readiness"},p=["analyze","readiness","doctor","workspace"],l=["model","diff","impact","doctor-evidence","contract-evidence","analyze-evidence","readiness-evidence","verify","context","agent-sync","explain"],k=["sync","baseline"],d={sync:[".workspai/workspace.contract.json",".workspai/workspace-registry.v1.json"],baseline:[o.snapshot]},e=o,s={model:{command:["workspace","model","--json","--write"],produces:[e.model,e.knowledgeGraph]},diff:{command:["workspace","diff","--from",e.snapshot,"--json"],produces:[e.diff]},impact:{command:["workspace","impact","--from",e.diff,"--json"],produces:[e.impact]},"doctor-evidence":{command:["doctor","workspace","--json"],produces:[e.doctor]},"contract-evidence":{command:["workspace","contract","verify","--strict","--json"],produces:[e.contractVerify]},"analyze-evidence":{command:["analyze","--json"],produces:[e.analyze]},"readiness-evidence":{command:["readiness","--json","--skip-verify"],produces:[e.readiness]},verify:{command:["workspace","verify","--from-impact",e.impact,"--json"],produces:[e.verify,e.history]},context:{command:["workspace","context","--for-agent","--json","--write","--no-agent-sync"],produces:[e.agentContext]},"agent-sync":{command:["workspace","agent-sync","--write","--json","--preset","enterprise"],produces:[e.agentIndex,e.agentCustomizationPack,e.skillsIndex,e.agents]},explain:{command:["workspace","explain","release-blocked","--json","--write"],produces:[e.explain]}};function w(n){return s[n]}export{o as a,r as b,c,i as d,p as e,l as f,k as g,d as h,s as i,w as j};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import {a}from'./chunk-A5FBGRJA.js';import {a as a$1}from'./chunk-AFIFZTOY.js';import {j,u as u$1,e,a as a$2,t,f as f$1}from'./chunk-MOSXTVPU.js';import {s}from'./chunk-RJIYCDVC.js';import b from'crypto';import P from'fs';import d from'fs/promises';import i from'path';import O from'fs-extra';var x="project-workspace-link.v1",A="workspai.project-workspace-link",l=class extends Error{constructor(r,a,o={}){super(a);this.code=r;this.context=o;this.name="ProjectWorkspaceResolutionError";}code;context};function _(e){return P.existsSync(i.join(e,".workspai-workspace"))?".workspai-workspace":".workspai/workspace.json"}function L(e){return b.createHash("sha256").update([e.workspaceName,a(e.workspacePath),e.projectName,a(e.projectPath),e.relativePath.replace(/\\/g,"/"),e.relationship].join("\0")).digest("hex")}function $(e){let t=i.resolve(e);for(;;){if(j(t))return t;let r=i.dirname(t);if(r===t)return null;t=r;}}function J(e){let t$1=i.resolve(e);for(;;){if([...t(t$1,"project.json"),...t(t$1,"context.json")].some(a=>P.existsSync(a)))return t$1;let r=i.dirname(t$1);if(r===t$1)return null;t$1=r;}}function y(e){return JSON.parse(P.readFileSync(e,"utf8"))}function I(e){let t=y(e);if(!t||typeof t!="object"||Array.isArray(t))throw new l("project.workspace.link-invalid",`Project workspace link is not a JSON object: ${e}`,{linkPath:e});let r=t;if(r.schemaVersion!==x||r.kind!==A||r.state!=="active"||!r.workspace||typeof r.workspace.name!="string"||r.workspace.name.trim().length===0||typeof r.workspace.root!="string"||!i.isAbsolute(r.workspace.root)||![".workspai-workspace",".workspai/workspace.json"].includes(r.workspace.marker??"")||r.workspace.contract!==".workspai/workspace.contract.json"||!r.project||typeof r.project.name!="string"||r.project.name.trim().length===0||typeof r.project.relativePath!="string"||i.isAbsolute(r.project.relativePath)||r.project.relativePath.split(/[\\/]/).includes("..")||!["managed","adopted","imported","linked","restored"].includes(r.project.relationship??"")||!r.integrity||r.integrity.algorithm!=="sha256"||typeof r.integrity.binding!="string"||!/^[a-f0-9]{64}$/.test(r.integrity.binding))throw new l("project.workspace.link-invalid",`Project workspace link does not satisfy ${x}: ${e}`,{linkPath:e});try{a$1(t,"contracts/project-workspace-link.v1.json","Project workspace link");}catch(a){throw new l("project.workspace.link-invalid",`Project workspace link does not satisfy ${x}: ${e}`,{linkPath:e,validationError:a instanceof Error?a.message:String(a)})}return r}function f(e,t){let r=i.join(e,".workspai","workspace.contract.json");if(!P.existsSync(r))return null;try{let a$1=y(r);if(!Array.isArray(a$1.projects))return false;let o=a(t);return a$1.projects.some(n=>typeof n.externalPath=="string"?a(n.externalPath)===o:typeof n.relativePath!="string"||n.relativePath.startsWith("external/")?false:a(i.resolve(e,n.relativePath))===o)}catch{return false}}function K(e,t,r){let a$1=a(e),o=new Map;for(let n of s(t,r)){if(!P.existsSync(n))continue;let c;try{c=y(n);}catch{continue}if(Array.isArray(c.workspaces))for(let p of c.workspaces){if(!p||typeof p.name!="string"||typeof p.path!="string"||!Array.isArray(p.projects)||!p.projects.some(w=>w&&typeof w.path=="string"&&a(w.path)===a$1))continue;let s=a(p.path);!j(s)||f(s,e)!==true||o.set(s,{name:p.name,path:s});}}return [...o.values()].sort((n,c)=>n.path.localeCompare(c.path))}function u(e,t){if(e)throw t;return null}function Z(e$1){let t=e$1.strict===true,r=i.resolve(e$1.startPath),a=e$1.explicitWorkspacePath?i.resolve(e$1.explicitWorkspacePath):null,o=J(r);if(a)return j(a)?e$1.requireProjectMembership===true&&o&&f(a,o)!==true?u(t,new l("project.workspace.membership-missing",`Project is not registered in the explicit workspace contract: ${a}`,{workspacePath:a,projectPath:o})):{workspacePath:a,projectPath:o,source:"explicit",linkPath:o?u$1(o,e):null,recovered:false}:u(t,new l("project.workspace.explicit-invalid",`Explicit workspace path is not a Workspai workspace: ${a}`,{workspacePath:a,projectPath:o}));let n=$(r);if(n)return e$1.requireProjectMembership===true&&o&&f(n,o)!==true?u(t,new l("project.workspace.membership-missing",`Project is not registered in its parent workspace contract: ${n}`,{workspacePath:n,projectPath:o})):{workspacePath:n,projectPath:o,source:"parent",linkPath:o?u$1(o,e):null,recovered:false};if(!o)return u(t,new l("project.workspace.unlinked","No Workspai project or workspace could be resolved from the current directory.",{startPath:r}));let c=u$1(o,e),p=null;if(P.existsSync(c)){let s;try{s=I(c);}catch(C){if(t)throw C;return null}let m=L({workspaceName:s.workspace.name,workspacePath:s.workspace.root,projectName:s.project.name,projectPath:o,relativePath:s.project.relativePath,relationship:s.project.relationship}),w=f(s.workspace.root,o);if(s.integrity.binding===m&&j(s.workspace.root)&&P.existsSync(i.join(s.workspace.root,s.workspace.marker))&&w===true)return {workspacePath:i.resolve(s.workspace.root),projectPath:o,source:"local-link",linkPath:c,recovered:false};p=s;}let h=K(o,e$1.env??process.env,e$1.platform??process.platform);return h.length>1?u(t,new l("project.workspace.ambiguous",`Project is registered in more than one valid workspace: ${h.map(s=>s.name).join(", ")}. Pass --workspace <path> or run project workspace relink.`,{projectPath:o,candidates:h})):h.length===1?{workspacePath:h[0].path,projectPath:o,source:"registry",linkPath:c,recovered:p!==null}:p?u(t,new l("project.workspace.link-stale",`Project workspace link is stale and no valid registry relocation was found: ${p.workspace.root}`,{projectPath:o,linkPath:c,linkedWorkspacePath:p.workspace.root})):u(t,new l("project.workspace.unlinked","This Workspai project is not linked to a valid workspace. Run `npx workspai adopt .` or `npx workspai project workspace relink --workspace <path>`.",{projectPath:o,linkPath:c}))}async function T(e,t){await d.mkdir(i.dirname(e),{recursive:true});let r=`${e}.${process.pid}.${b.randomUUID()}.tmp`;try{await d.writeFile(r,`${JSON.stringify(t,null,2)}
|
|
2
|
+
`,{encoding:"utf8",mode:384});try{await d.rename(r,e);}catch(a){let o=a.code;if(o!=="EEXIST"&&o!=="EPERM")throw a;await O.move(r,e,{overwrite:true});}}finally{await d.rm(r,{force:true}).catch(()=>{});}}async function M(e){let t=i.join(e,".gitignore"),r=await d.readFile(t,"utf8").catch(c=>{if(c.code==="ENOENT")return "";throw c});if(r.split(/\r?\n/).map(c=>c.trim()).includes(f$1))return;let n=`${r.length>0&&!r.endsWith(`
|
|
3
|
+
`)?`
|
|
4
|
+
`:""}
|
|
5
|
+
# Workspai machine-local workspace binding
|
|
6
|
+
${f$1}
|
|
7
|
+
`;await d.writeFile(t,`${r}${n}`,"utf8");}async function F(e$1){let t=i.resolve(e$1.workspacePath),r=i.resolve(e$1.projectPath);if(!j(t))throw new l("project.workspace.explicit-invalid",`Cannot link project to an invalid Workspai workspace: ${t}`,{workspacePath:t,projectPath:r});let a$3=i.join(t,".workspai","workspace.contract.json"),o=e$1.workspaceName??i.basename(t),n=e$1.relativePath;if(P.existsSync(a$3)){let h=y(a$3);typeof h.workspace?.name=="string"&&(o=h.workspace.name);let s=a(r),m=h.projects?.find(w=>typeof w.externalPath=="string"?a(w.externalPath)===s:typeof w.relativePath=="string"&&!w.relativePath.startsWith("external/")&&a(i.resolve(t,w.relativePath))===s);m&&typeof m.relativePath=="string"&&(n=m.relativePath);}if(n??=i.relative(t,r).replace(/\\/g,"/"),(!n||n.startsWith(".."))&&(n=`external/${e$1.projectName}`),f(t,r)!==true)throw new l("project.workspace.membership-missing",`Project is not registered in the canonical workspace contract: ${e$1.projectName}`,{workspacePath:t,projectPath:r,projectName:e$1.projectName});let c={schemaVersion:x,kind:A,generatedAt:(e$1.now??new Date).toISOString(),state:"active",workspace:{name:o,root:t,marker:_(t),contract:".workspai/workspace.contract.json"},project:{name:e$1.projectName,relativePath:n,relationship:e$1.relationship},integrity:{algorithm:"sha256",binding:L({workspaceName:o,workspacePath:t,projectName:e$1.projectName,projectPath:r,relativePath:n,relationship:e$1.relationship})}};a$1(c,"contracts/project-workspace-link.v1.json","Project workspace link");let p=i.join(r,a$2,e);return await M(r),await T(p,c),{linkPath:p,link:c}}async function ee(e,t$1="linked"){if(!e.projectPath)return null;let r=t(e.projectPath,"project.json").find(o=>P.existsSync(o)),a=i.basename(e.projectPath);if(r)try{let o=y(r);typeof o.name=="string"?a=o.name:typeof o.slug=="string"&&(a=o.slug);}catch{}return F({workspacePath:e.workspacePath,projectPath:e.projectPath,projectName:a,relationship:t$1})}export{l as a,Z as b,F as c,ee as d};
|