workspai 0.43.1 → 0.44.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 +23 -10
- package/contracts/agent-customization-pack.v1.json +1 -1
- package/contracts/autopilot-release.v1.json +204 -0
- package/contracts/cli-operation-result.v1.json +119 -0
- package/contracts/command-capabilities.v1.json +138 -0
- package/contracts/compatibility-matrix.v1.json +37 -0
- package/contracts/create-planner-capabilities.v1.json +156 -65
- package/contracts/doctor-project-scan.v2.json +60 -0
- package/contracts/doctor-remediation-plan.v1.json +19 -4
- package/contracts/doctor-remediation-plan.v2.json +7 -0
- package/contracts/doctor-workspace-cache.v2.json +82 -0
- package/contracts/extension-cli-compatibility.v1.json +47 -3
- package/contracts/infra-plan.v1.json +189 -0
- package/contracts/private-product-manifest.v1.json +155 -0
- package/contracts/product-factory-plan.v1.json +200 -0
- package/contracts/project-archive.v1.json +40 -0
- package/contracts/project-entry-capability.v1.json +127 -0
- package/contracts/published-contract-catalog.v1.json +334 -0
- package/contracts/runtime-command-surface.v1.json +239 -10
- package/contracts/version.v1.json +48 -0
- package/contracts/workspace-archive-capabilities.v1.json +90 -0
- package/contracts/workspace-archive-manifest.v1.json +107 -0
- package/contracts/workspace-archive-operation-result.v1.json +565 -0
- package/contracts/workspace-intelligence/agent-customization-pack-report.v1.json +98 -0
- package/contracts/workspace-intelligence/agent-hooks.v1.json +38 -0
- package/contracts/workspace-intelligence/agent-reports-index.v1.json +56 -0
- package/contracts/workspace-intelligence/mcp-design.v1.json +42 -0
- package/contracts/workspace-intelligence/workspace-context.v1.json +12 -0
- package/contracts/workspace-intelligence/workspace-explain.v1.json +1 -0
- package/contracts/workspace-intelligence-architecture.v1.json +723 -0
- package/contracts/workspace-intelligence-chain.v1.json +1194 -0
- package/contracts/workspace-list.v1.json +56 -0
- package/contracts/workspace-model-cache.v1.json +55 -0
- package/contracts/workspace-snapshot.v1.json +58 -0
- package/contracts/workspace-snapshot.v2.json +97 -0
- package/contracts/workspace-sync.v1.json +30 -0
- package/contracts/workspace-watch-event.v1.json +112 -0
- package/dist/analyze-6OCBM4ID.js +1 -0
- package/dist/{artifact-remediation-plan-244S5K6I.js → artifact-remediation-plan-Z7OCSME3.js} +2 -2
- package/dist/autopilot-release-LI2WJCEW.js +1 -0
- package/dist/{chunk-LZQNVH7D.js → chunk-2K3GYCPS.js} +1 -1
- package/dist/chunk-2QN6BMM7.js +2 -0
- package/dist/chunk-2QOWRBQD.js +1 -0
- package/dist/chunk-5AKYMAIL.js +1 -0
- package/dist/{chunk-FDDDQMJ2.js → chunk-5PVEQ6CZ.js} +1 -1
- package/dist/{chunk-DOCPUNWS.js → chunk-7EIMPQR3.js} +1 -1
- package/dist/{chunk-U6AXYUQY.js → chunk-7IHLTPZ6.js} +1 -1
- package/dist/chunk-7RIWU5TZ.js +1 -0
- package/dist/chunk-B66A4TVP.js +1 -0
- package/dist/chunk-CL6TGI4Q.js +8 -0
- package/dist/chunk-FWJV7CCI.js +2 -0
- package/dist/chunk-J4AICQFB.js +1 -0
- package/dist/chunk-JICOD2GI.js +1 -0
- package/dist/{chunk-EMTQ6OKI.js → chunk-JP25YL3J.js} +1 -1
- package/dist/chunk-L2Q7B2OJ.js +1 -0
- package/dist/chunk-L3E6IRUQ.js +8 -0
- package/dist/chunk-LG6RFLPZ.js +1 -0
- package/dist/chunk-LGP6WXS2.js +4 -0
- package/dist/{chunk-ONU457VN.js → chunk-M4VITK6X.js} +52 -50
- package/dist/chunk-NTXO7BMH.js +4 -0
- package/dist/{chunk-PPHTYJ7G.js → chunk-OW4UNG27.js} +36 -37
- package/dist/chunk-P4SWTY5X.js +33 -0
- package/dist/chunk-TRMDODFM.js +13 -0
- package/dist/chunk-UNF72FTB.js +1 -0
- package/dist/chunk-V5JN4TDX.js +2 -0
- package/dist/chunk-VA5MRHKM.js +2 -0
- package/dist/chunk-XIVFLY6G.js +1 -0
- package/dist/chunk-YUX4YFGL.js +78 -0
- package/dist/{create-42RTNLH2.js → create-DFAWAS5C.js} +1 -1
- package/dist/doctor-PVSWDBJL.js +1 -0
- package/dist/index.d.ts +250 -24
- package/dist/index.js +194 -195
- package/dist/pipeline-ND734AJM.js +5 -0
- package/dist/{platform-capabilities-XAVU4HSM.js → platform-capabilities-YICBF4FA.js} +1 -1
- package/dist/{pythonRapidkitExec-GCQ3M46E.js → pythonRapidkitExec-UJYIB6FL.js} +1 -1
- package/dist/{workspace-DZHWB7BV.js → workspace-FQT3QIRS.js} +1 -1
- package/dist/workspace-agent-sync-ZYCPXTU3.js +1 -0
- package/dist/workspace-archive-EEGLHZDW.js +10 -0
- package/dist/workspace-context-WAGGJCDL.js +1 -0
- package/dist/{workspace-contract-2TA27LGT.js → workspace-contract-SEI4SNSG.js} +1 -1
- package/dist/workspace-explain-MVGGRCDN.js +1 -0
- package/dist/workspace-explain-contract-KT757JGQ.js +1 -0
- package/dist/{workspace-feedback-R6H4UFZB.js → workspace-feedback-RCB25NFO.js} +1 -1
- package/dist/{workspace-foundation-FQWHPQGX.js → workspace-foundation-KXDL6P6X.js} +1 -1
- package/dist/{workspace-history-CGCK2DJI.js → workspace-history-M4QQBIPB.js} +1 -1
- package/dist/workspace-intelligence-QOGD2TZS.js +1 -0
- package/dist/workspace-mcp-serve-CEFKEMYG.js +3 -0
- package/dist/{workspace-model-F3B75TYT.js → workspace-model-GMSRBICO.js} +1 -1
- package/dist/workspace-registry-summary-S52SEJAG.js +1 -0
- package/dist/workspace-run-VC4OUPRF.js +1 -0
- package/dist/{workspace-verify-OAATQV5T.js → workspace-verify-NP4GMFSV.js} +1 -1
- package/dist/workspace-watch-IIBH3Y25.js +1 -0
- package/docs/AI_FEATURES.md +67 -34
- package/docs/README.md +2 -1
- package/docs/commands-reference.md +26 -14
- package/docs/contracts/ARTIFACT_CATALOG.md +60 -36
- package/docs/contracts/README.md +3 -2
- package/docs/create-planner-capabilities.md +36 -18
- package/docs/workspace-operations.md +25 -0
- package/package.json +26 -14
- package/scripts/enterprise-package-smoke.mjs +40 -8
- package/scripts/prepack-enterprise.mjs +8 -0
- package/dist/analyze-5BU4QIPK.js +0 -1
- package/dist/autopilot-release-45YVOBQO.js +0 -1
- package/dist/chunk-3QVTWKUI.js +0 -4
- package/dist/chunk-753LOKFZ.js +0 -2
- package/dist/chunk-AMDKXXLP.js +0 -1
- package/dist/chunk-AQ4XZZC6.js +0 -1
- package/dist/chunk-CDE4Q77U.js +0 -2
- package/dist/chunk-DNAY5ALC.js +0 -1
- package/dist/chunk-FHSMY75W.js +0 -1
- package/dist/chunk-FM7GMFZA.js +0 -2
- package/dist/chunk-HV5ZFXAZ.js +0 -13
- package/dist/chunk-LRW2SAGL.js +0 -4
- package/dist/chunk-LTWYYP6E.js +0 -7
- package/dist/chunk-NAAQMSO3.js +0 -1
- package/dist/chunk-NFUXULIF.js +0 -1
- package/dist/chunk-OL64GWQC.js +0 -9
- package/dist/chunk-SI3AQKIP.js +0 -1
- package/dist/chunk-TH5Y3EMA.js +0 -33
- package/dist/chunk-UQKCCWUL.js +0 -78
- package/dist/chunk-XNGANEXM.js +0 -2
- package/dist/doctor-DK4BON3N.js +0 -1
- package/dist/pipeline-HQ57V6OZ.js +0 -5
- package/dist/workspace-agent-sync-5ADIQS7B.js +0 -1
- package/dist/workspace-archive-GCZNI44O.js +0 -3
- package/dist/workspace-context-GEXDHA7A.js +0 -1
- package/dist/workspace-explain-D5NNL3NG.js +0 -1
- package/dist/workspace-explain-contract-DNS2YEL7.js +0 -1
- package/dist/workspace-intelligence-BEM6WGCZ.js +0 -1
- package/dist/workspace-mcp-serve-OMBA5V3C.js +0 -3
- package/dist/workspace-registry-summary-6MFBRWDS.js +0 -1
- package/dist/workspace-run-3WJXIQKR.js +0 -1
- package/dist/workspace-watch-HU2OTQ52.js +0 -1
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {c as c$
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import {c as c$2}from'./chunk-2QOWRBQD.js';import {a}from'./chunk-A5FBGRJA.js';import {a as a$2}from'./chunk-GZTYAEWX.js';import {c as c$1}from'./chunk-Y45WZR5N.js';import {a as a$1}from'./chunk-TQEMLBAG.js';import {p as p$1,r,q as q$1}from'./chunk-2K3GYCPS.js';import {p,o}from'./chunk-5XATWNME.js';import {promises}from'fs';import {randomUUID}from'crypto';import c from'path';import s from'chalk';import ee from'fs-extra';import E from'ora';import {execa}from'execa';async function te(e){try{let r=await execa("git",["rev-parse","--show-toplevel"],{cwd:e,env:a$1()});return r.stdout.trim()?c.resolve(e,r.stdout.trim()):null}catch{return null}}async function V(e,r,t){if(await te(e)){r.warn("Git initialization skipped because target is already inside a git worktree");return}r.start("Initializing git repository...");try{await execa("git",["init"],{cwd:e,env:a$1()}),await execa("git",["add","."],{cwd:e,env:a$1()}),await execa("git",["commit","-m",t],{cwd:e,env:a$1()}),r.succeed("Git repository initialized");}catch{r.warn("Could not initialize git repository");}}function Y(e){let r=a(e.path),t=Array.isArray(e.projects)?e.projects:[],o=[],a$1=new Set;for(let p of t){if(!p||typeof p.name!="string"||typeof p.path!="string")continue;let n=a(p.path);a$1.has(n)||(a$1.add(n),o.push({name:p.name,path:n}));}return {name:e.name,path:r,mode:e.mode,projects:o}}function F(e){let r=[],t=new Set;for(let o of e.workspaces||[]){if(!o||typeof o.name!="string"||typeof o.path!="string")continue;let a=Y(o);t.has(a.path)||(t.add(a.path),r.push(a));}return {workspaces:r}}async function re(e){try{let r=await promises.readFile(e,"utf8"),t=JSON.parse(r);if(t&&Array.isArray(t.workspaces))return F(t)}catch{}return {workspaces:[]}}async function O(){let e={workspaces:[]},r$1=new Set;for(let t of r()){let o=await re(t);for(let a of o.workspaces)r$1.has(a.path)||(r$1.add(a.path),e.workspaces.push(a));}return e}function ae(e){let r=e?.code;return process.platform==="win32"&&(r==="EPERM"||r==="EINVAL"||r==="ENOSYS")}async function H(e){try{await e.sync();}catch(r){if(!ae(r))throw r}}async function M(e,r){let t=c.dirname(e);await promises.mkdir(t,{recursive:true});let o=`${c.basename(e)}.`,a=Date.now();for(let i of await promises.readdir(t)){if(!i.startsWith(o)||!i.endsWith(".tmp"))continue;let l=c.join(t,i),m=await promises.stat(l).catch(()=>null);m&&a-m.mtimeMs>3e4&&await promises.rm(l,{force:true}).catch(()=>{});}let p=await promises.readFile(e,"utf8").catch(()=>null);if(p!==null){let i=false;try{let l=JSON.parse(p);i=Array.isArray(l.workspaces);}catch{i=false;}if(!i){let l=`${e}.corrupt-${Date.now()}`;await promises.copyFile(e,l);}}let n=`${e}.${process.pid}.${randomUUID()}.tmp`;try{await promises.writeFile(n,`${JSON.stringify(F(r),null,2)}
|
|
2
|
+
`);let i=await promises.open(n,"r");try{await H(i);}finally{await i.close();}try{await promises.rename(n,e);}catch(l){let m=l.code;if(m!=="EEXIST"&&m!=="EPERM")throw l;await ee.move(n,e,{overwrite:true});}}finally{await promises.rm(n,{force:true}).catch(()=>{});}}async function oe(e){let r=p$1(),t=c.join(r,"workspaces.json.lock");await promises.mkdir(r,{recursive:true});let o=Date.now(),a;for(;!a;)try{a=await promises.open(t,"wx"),await a.writeFile(`${JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()})}
|
|
3
|
+
`),await H(a);}catch(p){if(p.code!=="EEXIST")throw p;let n=await promises.stat(t).catch(()=>null);if(n&&Date.now()-n.mtimeMs>3e4){let i=await promises.readFile(t,"utf8").then(f=>JSON.parse(f)).catch(()=>null),l=Number(i?.pid),m=false;if(Number.isInteger(l)&&l>0)try{process.kill(l,0),m=true;}catch(f){m=f.code==="EPERM";}if(!m){await promises.rm(t,{force:true}).catch(()=>{});continue}}if(Date.now()-o>1e4)throw new Error(`Timed out waiting for workspace registry lock: ${t}`);await new Promise(i=>setTimeout(i,25));}try{return await e()}finally{await a.close().catch(()=>{}),await promises.rm(t,{force:true}).catch(()=>{});}}async function P(e){return oe(async()=>{let r=await O();await e(r);let t=F(r),o=c.join(p$1(),"workspaces.json"),a=c.join(q$1(),"workspaces.json");return await M(o,t),await M(a,t),t})}async function q(e,r){try{let t=a(e);await P(o=>{let a=o.workspaces.find(p=>p.path===t);if(a){a.name=r,a.mode=a.mode||"full",a.projects=Array.isArray(a.projects)?a.projects:[];return}o.workspaces.push({name:r,path:t,mode:"full",projects:[]});});}catch{console.warn(s.gray("Note: Could not register workspace in shared registry"));}}async function Ce(e,r=false){let t=a(e),o={workspacePath:t,workspaceFound:false,added:[],skipped:0};try{let a$1=await O(),p$1=a$1.workspaces.find(u=>u.path===t);if(!p$1){if(await q(t,c.basename(c.resolve(e))),a$1=await O(),p$1=a$1.workspaces.find(u=>u.path===t),!p$1)return r||console.log("\u26A0\uFE0F Workspace could not be registered in registry"),o;r||console.log("\u2714 Registered workspace in shared registry");}Array.isArray(p$1.projects)||(p$1.projects=[]);let n=0,i=0,l=[],m=[],f=[e],g=new Set;for(;f.length>0;){let u=f.shift();if(!u||g.has(u))continue;g.add(u);let y=await promises.readdir(u,{withFileTypes:true});for(let h of y){if(!h.isDirectory()||h.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(h.name))continue;let j=c.join(u,h.name),w=a(j);try{let k=false;for(let $ of [...p(w,"context.json"),...p(w,"project.json")])try{await promises.access($),k=true;break}catch{}if(k){let $=c.basename(w),b=p$1.projects.some(W=>W.path===w);m.push({name:$,path:w}),b?i++:(p$1.projects.push({name:$,path:w}),n++,l.push(w),r||console.log(`\u2714 Added: ${c.relative(e,w)}`));continue}}catch{}f.push(j);}}return await P(u=>{let y=u.workspaces.find(w=>w.path===t);if(!y)return;let h=`${t}${c.sep}`,j=(y.projects||[]).filter(w=>w.path!==t&&!w.path.startsWith(h));y.projects=Y({...y,projects:[...j,...m]}).projects;}),n>0?r||console.log(`
|
|
4
|
+
\u2705 Synced ${n} project(s) to registry`):r||console.log(`
|
|
5
|
+
\u2705 All projects already registered (${i} found)`),{workspacePath:t,workspaceFound:true,added:l,skipped:i}}catch(a){return r||console.error("\u274C Failed to sync projects:",a.message),o}}async function Pe(e,r,t){try{let o=a(e),a$1=a(t);await P(p=>{let n=p.workspaces.find(m=>m.path===o);if(!n)return;n.projects=Array.isArray(n.projects)?n.projects:[];let i=n.projects.findIndex(m=>m.path===a$1||m.name===r),l={name:r,path:a$1};i>=0?n.projects[i]=l:n.projects.push(l);});}catch{}}async function We(e,r){let t=E("Creating Workspai workspace...").start();try{await promises.mkdir(e,{recursive:true}),await promises.mkdir(c.join(e,".workspai"),{recursive:true});let o={workspace_name:r.name,author:r.author,rapidkit_version:c$1(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(c.join(e,".workspai","config.json"),JSON.stringify(o,null,2));let{syncWorkspaceFoundationFiles:a}=await import('./create-DFAWAS5C.js');await a(e,{workspaceName:r.name,installMethod:"venv",writeMarker:true,writeGitignore:false,onlyIfMissing:true});let p=ie();await promises.writeFile(c.join(e,"rapidkit"),p),await promises.chmod(c.join(e,"rapidkit"),493);let n=se();await promises.writeFile(c.join(e,"rapidkit.cmd"),n);let i=ne(r.name);await promises.writeFile(c.join(e,"README.md"),i),await promises.writeFile(c.join(e,".gitignore"),`# Workspai workspace
|
|
4
6
|
.env
|
|
5
7
|
.env.*
|
|
6
8
|
!.env.example
|
|
@@ -15,10 +17,10 @@ Thumbs.db
|
|
|
15
17
|
|
|
16
18
|
# Logs
|
|
17
19
|
*.log
|
|
18
|
-
`),await promises.writeFile(
|
|
19
|
-
${
|
|
20
|
+
`),await promises.writeFile(c.join(e,".workspai-workspace"),JSON.stringify({signature:"WORKSPAI_WORKSPACE",createdBy:"workspai-cli",version:c$1(),createdAt:new Date().toISOString(),name:r.name},null,2)),await ce(e),t.succeed("Workspace created!"),r.skipGit||await V(e,E(),"Initial commit: Workspai workspace"),await q(e,r.name);let{publishWorkspaceRegistrySummary:m}=await import('./workspace-registry-summary-S52SEJAG.js');await m(e),console.log(`
|
|
21
|
+
${s.green("\u2728 Workspai workspace created successfully!")}
|
|
20
22
|
|
|
21
|
-
${
|
|
23
|
+
${s.bold("\u{1F4C2} Workspace structure:")}
|
|
22
24
|
${e}/
|
|
23
25
|
\u251C\u2500\u2500 rapidkit # Local CLI wrapper
|
|
24
26
|
\u251C\u2500\u2500 rapidkit.cmd # Windows local CLI wrapper
|
|
@@ -30,29 +32,29 @@ ${e}/
|
|
|
30
32
|
\u2502 \u2514\u2500\u2500 config.json # Workspai workspace config
|
|
31
33
|
\u2514\u2500\u2500 README.md
|
|
32
34
|
|
|
33
|
-
${
|
|
34
|
-
${
|
|
35
|
-
${
|
|
36
|
-
${
|
|
37
|
-
${
|
|
38
|
-
${
|
|
35
|
+
${s.bold("\u{1F680} Get started:")}
|
|
36
|
+
${s.cyan(`cd ${r.name}`)}
|
|
37
|
+
${s.cyan("npx workspai create project fastapi.standard my-api --yes")}
|
|
38
|
+
${s.cyan("cd my-api")}
|
|
39
|
+
${s.cyan("npx workspai init")}
|
|
40
|
+
${s.cyan("npx workspai dev")}
|
|
39
41
|
|
|
40
|
-
${
|
|
42
|
+
${s.bold("\u{1F4E6} Available templates:")}
|
|
41
43
|
fastapi - FastAPI + Python
|
|
42
44
|
nestjs - NestJS + TypeScript
|
|
43
45
|
springboot - Spring Boot + Java
|
|
44
46
|
gofiber - Go Fiber
|
|
45
47
|
gogin - Go Gin
|
|
46
48
|
|
|
47
|
-
${
|
|
49
|
+
${s.bold("\u{1F4DA} Commands:")}
|
|
48
50
|
npx workspai create project <kit> <name> Create a new project
|
|
49
51
|
npx workspai init Install dependencies
|
|
50
52
|
npx workspai dev Start dev server
|
|
51
53
|
npx workspai help Show all commands
|
|
52
54
|
|
|
53
|
-
${
|
|
54
|
-
${
|
|
55
|
-
`);}catch(
|
|
55
|
+
${s.gray("Alternative: npx workspai dev, make dev")}
|
|
56
|
+
${s.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
|
|
57
|
+
`);}catch(o){throw t.fail("Failed to create workspace"),o}}function ie(){return `#!/usr/bin/env bash
|
|
56
58
|
#
|
|
57
59
|
# Workspai CLI - local workspace commands
|
|
58
60
|
# This script provides legacy ./rapidkit commands within the workspace
|
|
@@ -426,7 +428,7 @@ main() {
|
|
|
426
428
|
print_help
|
|
427
429
|
;;
|
|
428
430
|
version|-v|--version)
|
|
429
|
-
echo "Workspai CLI (legacy ./rapidkit launcher) v${c()}"
|
|
431
|
+
echo "Workspai CLI (legacy ./rapidkit launcher) v${c$1()}"
|
|
430
432
|
;;
|
|
431
433
|
*)
|
|
432
434
|
echo -e "\${RED}\u274C Unknown command: $cmd\${NC}"
|
|
@@ -438,7 +440,7 @@ main() {
|
|
|
438
440
|
}
|
|
439
441
|
|
|
440
442
|
main "$@"
|
|
441
|
-
`}function
|
|
443
|
+
`}function se(){return `@echo off
|
|
442
444
|
setlocal enabledelayedexpansion
|
|
443
445
|
|
|
444
446
|
set "SCRIPT_DIR=%~dp0"
|
|
@@ -458,7 +460,7 @@ if %ERRORLEVEL%==0 (
|
|
|
458
460
|
echo [Workspai] No sh/bash found. Falling back to npx workspai.
|
|
459
461
|
npx workspai %*
|
|
460
462
|
exit /b %ERRORLEVEL%
|
|
461
|
-
`}function
|
|
463
|
+
`}function ne(e){return `# ${e}
|
|
462
464
|
|
|
463
465
|
Workspai workspace for building API projects.
|
|
464
466
|
|
|
@@ -504,7 +506,7 @@ npx workspai dev # Start dev server
|
|
|
504
506
|
|
|
505
507
|
- [Workspai Documentation](https://workspai.dev)
|
|
506
508
|
- [GitHub Repository](https://github.com/rapidkitlabs/workspai)
|
|
507
|
-
`}async function
|
|
509
|
+
`}async function ce(e){let{fileURLToPath:r}=await import('url'),t=r(import.meta.url),o=c.dirname(t),a=c.resolve(o,".."),p=c.join(a,"templates","kits"),n=c.join(e,".workspai","templates"),{default:i}=await import('fs-extra');await i.copy(p,n);let l=c.join(a,"templates","generator.js"),m=c.join(e,".workspai","generator.js");await i.copy(l,m);}async function Ne(e,r){let t=r.template==="fastapi",o=t?"FastAPI":"NestJS",a=E(`Creating ${o} project...`).start();try{let{fileURLToPath:p}=await import('url'),n=p(import.meta.url),i=c.dirname(n),l=c.resolve(i,".."),m=t?"fastapi-standard":"nestjs-standard",f=c.join(l,"templates","kits",m);await promises.mkdir(e,{recursive:true});let g={project_name:t?r.name.replace(/-/g,"_").toLowerCase():r.name.replace(/_/g,"-").toLowerCase(),author:r.author,description:r.description||`${o} application generated with Workspai`,app_version:"0.1.0",license:"MIT",package_manager:r.package_manager||"npm",created_at:new Date().toISOString(),rapidkit_version:c$1()};await K(f,e,g);let u=t?`# Python
|
|
508
510
|
__pycache__/
|
|
509
511
|
*.py[cod]
|
|
510
512
|
*$py.class
|
|
@@ -572,10 +574,10 @@ Thumbs.db
|
|
|
572
574
|
|
|
573
575
|
# Coverage
|
|
574
576
|
coverage/
|
|
575
|
-
`;if(await promises.writeFile(
|
|
576
|
-
${
|
|
577
|
+
`;if(await promises.writeFile(c.join(e,".gitignore"),u),a.succeed(`${o} project created!`),r.skipGit||await V(e,E(),`Initial commit: ${o} project via Workspai`),!r.skipInstall&&!t){let h=r.package_manager||"npm",j=E(`Installing dependencies with ${h}...`).start();try{await execa(h,["install"],{cwd:e}),j.succeed("Dependencies installed");}catch{j.warn(`Could not install dependencies. Run '${h} install' manually.`);}}let y=c.basename(e);console.log(t?`
|
|
578
|
+
${s.green("\u2728 FastAPI project created successfully!")}
|
|
577
579
|
|
|
578
|
-
${
|
|
580
|
+
${s.bold("\u{1F4C2} Project structure:")}
|
|
579
581
|
${e}/
|
|
580
582
|
\u251C\u2500\u2500 .workspai/ # Project metadata
|
|
581
583
|
\u251C\u2500\u2500 src/
|
|
@@ -587,12 +589,12 @@ ${e}/
|
|
|
587
589
|
\u251C\u2500\u2500 pyproject.toml # Poetry configuration
|
|
588
590
|
\u2514\u2500\u2500 README.md
|
|
589
591
|
|
|
590
|
-
${
|
|
591
|
-
${
|
|
592
|
-
${
|
|
593
|
-
${
|
|
592
|
+
${s.bold("\u{1F680} Get started:")}
|
|
593
|
+
${s.cyan(`cd ${y}`)}
|
|
594
|
+
${s.cyan("npx workspai init")} ${s.gray("# Install dependencies")}
|
|
595
|
+
${s.cyan("npx workspai dev")} ${s.gray("# Start dev server")}
|
|
594
596
|
|
|
595
|
-
${
|
|
597
|
+
${s.bold("\u{1F4DA} Available commands:")}
|
|
596
598
|
npx workspai init # Install dependencies (poetry install)
|
|
597
599
|
npx workspai dev # Start dev server with hot reload
|
|
598
600
|
npx workspai start # Start production server
|
|
@@ -600,12 +602,12 @@ ${a$1.bold("\u{1F4DA} Available commands:")}
|
|
|
600
602
|
npx workspai lint # Lint code
|
|
601
603
|
npx workspai format # Format code
|
|
602
604
|
|
|
603
|
-
${
|
|
604
|
-
${
|
|
605
|
+
${s.gray("Alternative: make dev, npx workspai dev, poetry run dev")}
|
|
606
|
+
${s.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
|
|
605
607
|
`:`
|
|
606
|
-
${
|
|
608
|
+
${s.green("\u2728 NestJS project created successfully!")}
|
|
607
609
|
|
|
608
|
-
${
|
|
610
|
+
${s.bold("\u{1F4C2} Project structure:")}
|
|
609
611
|
${e}/
|
|
610
612
|
\u251C\u2500\u2500 .workspai/ # Project metadata
|
|
611
613
|
\u251C\u2500\u2500 src/
|
|
@@ -617,13 +619,13 @@ ${e}/
|
|
|
617
619
|
\u251C\u2500\u2500 package.json # Dependencies
|
|
618
620
|
\u2514\u2500\u2500 README.md
|
|
619
621
|
|
|
620
|
-
${
|
|
621
|
-
${
|
|
622
|
-
${
|
|
623
|
-
`:""}${
|
|
624
|
-
${
|
|
622
|
+
${s.bold("\u{1F680} Get started:")}
|
|
623
|
+
${s.cyan(`cd ${y}`)}
|
|
624
|
+
${r.skipInstall?s.cyan("npx workspai init")+s.gray(" # npm install")+`
|
|
625
|
+
`:""}${s.cyan("cp .env.example .env")}
|
|
626
|
+
${s.cyan("npx workspai dev")} ${s.gray("# Start dev server")}
|
|
625
627
|
|
|
626
|
-
${
|
|
628
|
+
${s.bold("\u{1F4DA} Available commands:")}
|
|
627
629
|
npx workspai init # Install dependencies
|
|
628
630
|
npx workspai dev # Start dev server with hot reload
|
|
629
631
|
npx workspai start # Start production server
|
|
@@ -632,22 +634,22 @@ ${a$1.bold("\u{1F4DA} Available commands:")}
|
|
|
632
634
|
npx workspai lint # Lint code
|
|
633
635
|
npx workspai format # Format code
|
|
634
636
|
|
|
635
|
-
${
|
|
637
|
+
${s.bold("\u{1F310} API endpoints:")}
|
|
636
638
|
http://localhost:8000/health # Health check
|
|
637
639
|
http://localhost:8000/docs # Swagger docs
|
|
638
640
|
http://localhost:8000/examples/notes # Example API
|
|
639
641
|
|
|
640
|
-
${
|
|
641
|
-
`);}catch(
|
|
642
|
+
${s.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
|
|
643
|
+
`);}catch(p){throw a.fail(`Failed to create ${o} project`),p}}async function K(e,r,t){let o=await promises.readdir(e,{withFileTypes:true});for(let a of o){let p=c.join(e,a.name),n=a.name.replace(/\.j2$/,""),i=c.join(r,n);if(a.isDirectory())await promises.mkdir(i,{recursive:true}),await K(p,i,t);else {let l=await promises.readFile(p,"utf-8");a.name.endsWith(".j2")&&(l=pe(l,t)),await promises.writeFile(i,l),(n==="rapidkit"||n==="activate"||n.endsWith(".py")&&(i.includes(".workspai")||i.includes(".rapidkit")))&&await promises.chmod(i,493);}}}function pe(e,r){let t=e;for(let[o,a]of Object.entries(r)){let p=new RegExp(`\\{\\{\\s*${o}\\s*\\}\\}`,"g");t=t.replace(p,String(a));let n=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\}\\}`,"g");t=t.replace(n,(m,f,g)=>String(a).replace(new RegExp(f,"g"),g));let i=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*lower\\s*\\}\\}`,"g");t=t.replace(i,String(a).toLowerCase());let l=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\|\\s*lower\\s*\\}\\}`,"g");t=t.replace(l,(m,f,g)=>String(a).replace(new RegExp(f,"g"),g).toLowerCase());}return t}async function Ie(e={}){let r=p$1(),t=c.join(r,"workspaces.json"),o=await O();if(o.workspaces.length===0){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:0,registryExists:false}},null,2));return}console.log(s.yellow(`
|
|
642
644
|
\u26A0\uFE0F No workspaces registered yet.
|
|
643
|
-
`)),console.log(
|
|
644
|
-
`));return}try{let o
|
|
645
|
+
`)),console.log(s.gray(`Create a workspace with: npx workspai <workspace-name>
|
|
646
|
+
`));return}try{let a=o;if(!a||typeof a!="object"||!Array.isArray(a.workspaces)){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:0,registryExists:true,registryValid:false},error:{code:"workspace.registry.invalid",message:"Workspace registry is invalid."}},null,2));return}console.log(s.yellow(`
|
|
645
647
|
\u26A0\uFE0F Workspace registry is invalid; resetting to empty state.
|
|
646
|
-
`)),await
|
|
648
|
+
`)),await P(g=>{g.workspaces=[];});return}let p=F(a),n=[],i=0;for(let g of p.workspaces)await promises.stat(g.path).catch(()=>null)?n.push(g):i+=1;let l={workspaces:n},m=JSON.stringify(a),f=JSON.stringify(l);if(!e.json&&m!==f){let g=new Set(n.map(u=>u.path));await P(u=>{u.workspaces=u.workspaces.filter(y=>g.has(y.path));});}if(!l.workspaces||l.workspaces.length===0){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:i,registryExists:true,registryValid:true,cleanupApplied:false}},null,2));return}console.log(s.yellow(`
|
|
647
649
|
\u26A0\uFE0F No workspaces registered yet.
|
|
648
|
-
`)),
|
|
649
|
-
`));return}if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:
|
|
650
|
+
`)),i>0&&console.log(s.gray(`Cleaned ${i} stale workspace entr${i===1?"y":"ies"}.
|
|
651
|
+
`));return}if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:l.workspaces,summary:{total:l.workspaces.length,missing:i,registryExists:true,registryValid:true,cleanupApplied:false}},null,2));return}console.log(s.bold(`
|
|
650
652
|
\u{1F4E6} Registered Workspai Workspaces:
|
|
651
|
-
`));for(let
|
|
652
|
-
`));}catch(
|
|
653
|
-
\u274C Failed to read workspace registry`)),console.error(
|
|
653
|
+
`));for(let g of l.workspaces)console.log(s.cyan(` ${g.name}`)),console.log(s.gray(` Path: ${g.path}`)),console.log(s.gray(` Projects: ${g.projects?.length||0}`)),console.log();i>0&&console.log(s.gray(`Cleaned ${i} stale workspace entr${i===1?"y":"ies"}.`)),console.log(s.gray(`Total: ${l.workspaces.length} workspace(s)
|
|
654
|
+
`));}catch(a){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:0,registryExists:true,registryValid:false},error:{code:"workspace.registry.read_failed",message:a.message}},null,2));return}console.error(s.red(`
|
|
655
|
+
\u274C Failed to read workspace registry`)),console.error(s.gray(String(a)));}}async function le(e){try{let r=await promises.readFile(e,"utf8");return JSON.parse(r)}catch{return null}}async function A(e){for(let r of e){let t=await le(r);if(t!==null)return t}return null}function de(e){return c$2(e)}async function me(e){return a$2(e,{skipDirs:new Set(["node_modules","dist","build","target","coverage","htmlcov"]),includeHiddenDirs:false,descendIntoMatchedProjects:true})}async function L(e){try{return (await promises.readdir(e,{withFileTypes:true})).filter(t=>t.isFile()&&t.name.toLowerCase().endsWith(".json")).map(t=>t.name).sort((t,o)=>t.localeCompare(o))}catch{return []}}async function De(e,r){let t=r?.includePaths===true,o$1=r?.includeDoctorEvidence!==false,a=r?.includeBlueprint!==false,p$1=c.resolve(e),n=await A(o(p$1,"workspace.json")),i=typeof n?.workspace_name=="string"&&n.workspace_name.trim()||c.basename(p$1),l=typeof n?.profile=="string"?n.profile:void 0,m=typeof n?.rapidkit_version=="string"?n.rapidkit_version:void 0,f=await me(p$1),g=[];for(let k of f){let $=await A(p(k,"project.json")),b=c.relative(p$1,k)||".",W=c.dirname(p(k,c.join("reports","placeholder"))[0]),B=c.dirname(p(k,c.join("reports","placeholder"))[1]),N={name:c.basename(k),relative_path:b,runtime:typeof $?.runtime=="string"?$.runtime:void 0,kit_name:typeof $?.kit_name=="string"?$.kit_name:void 0,modules:Array.isArray($?.modules)?$.modules.filter(_=>typeof _=="string"):void 0};if(t&&(N.absolute_path=k),o$1){let _=await A([c.join(W,"doctor-last-run.json"),c.join(B,"doctor-last-run.json")]);de(_)&&(N.doctor_report=_);}let T=[...await L(W),...await L(B)].filter((_,X,Q)=>Q.indexOf(_)===X);T.length>0&&(N.reports=T),g.push(N);}let u=o(p$1,"reports"),y=[...await L(u[0]),...await L(u[1])].filter((k,$,b)=>b.indexOf(k)===$),h=await A(o(p$1,"workspace.contract.json")),j={schema_version:"1.1",generated_at:new Date().toISOString(),generated_by:"workspai",workspace:{name:i,relative_root:".",profile:l,rapidkit_version:m,...t?{absolute_root:p$1}:{}},summary:{project_count:g.length,doctor_evidence_included:o$1,contract_included:!!h},reports:{workspace:y},projects:g,...h?{contract:h}:{}};a&&(j.blueprint={schema_version:"rapidkit.workspace-blueprint.v1",purpose:"portable-reproducibility",workspace:{name:i,profile:l},projects:g.map(k=>({name:k.name,relative_path:k.relative_path,runtime:k.runtime,kit_name:k.kit_name,modules:k.modules??[],recreate_commands:[...k.kit_name?[`npx workspai create project ${k.kit_name} ${k.name} --yes --skip-install`]:[],`cd ${k.relative_path}`,"npx workspai init","npx workspai test"]})),recommended_commands:["npx workspai workspace contract verify --strict","npx workspai doctor workspace","npx workspai workspace run init --json","npx workspai workspace run test --strict --json","npx workspai readiness --strict --json"]});let w=r?.outputPath?c.resolve(r.outputPath):c.join(u[0],"share-bundle.json");return await promises.mkdir(c.dirname(w),{recursive:true}),await promises.writeFile(w,JSON.stringify(j,null,2),"utf8"),w}export{q as a,Ce as b,Pe as c,We as d,Ne as e,Ie as f,De as g};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import {d,b as b$1,e}from'./chunk-B66A4TVP.js';import {j,q as q$1,n}from'./chunk-7UZVOYF5.js';import {h,i,f as f$1,e as e$1}from'./chunk-4KUIFXHM.js';import {d as d$1}from'./chunk-S5KTATOU.js';import {f}from'./chunk-FWJV7CCI.js';import {a}from'./chunk-GZTYAEWX.js';import {a as a$1}from'./chunk-TQEMLBAG.js';import {e as e$2,g}from'./chunk-2K3GYCPS.js';import {p,l,o}from'./chunk-5XATWNME.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=n(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=j(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=q$1(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,r)=>await qe([...p(t,"context.json"),...p(t,"project.json")])?true:b.resolve(t)===b.resolve(r)?false:h(t).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 f(e,".workspai/workspace.contract.json")??l(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 f(e,".workspai/workspace-dependency-graph.json")??l(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=Array.isArray(s.projects)?s.projects:[];for(let g of p){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$1(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"):[],W=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 W)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$1(a,r);return {expanded:d.reached,graphStatus:"loaded",expansionDepth:d.added}}async function ot(e,t){if(typeof t=="boolean")return t;let r=o(e,"policies.yml").find(s=>_.existsSync(s))??l(e,"policies.yml");if(!await I(r))return true;let n="";try{n=await _.promises.readFile(r,"utf-8");}catch{return true}let o$1=n.match(/^[\t ]*rules\.enforce_workspace_run_gates:\s*(true|false)\s*(?:#.*)?$/m);return o$1?o$1[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"}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$1(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=j(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
|
+
`),W=Date.now()-x,v=a===124||h==="timeout"||a===143&&W>=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",W=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), ${W?`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 $=n.stages[e$1.stage]??n.stages[e$1.stage];if($&&Te($,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);if(me.length>0&&n){let $=me.find(X=>{let L=n.stages[X];return !L||!Te(L,k,r)});if($){i.status="skipped",i.reason=`dependency stage "${$}" not satisfied in workspace-run-last.json`,i.durationMs=Date.now()-A,i.exitCode=null,T+=1;return}}let M=await dt(k,e$1.stage,P,D,$e,Ie,Le);if(i.executionCommand=M.command,i.errorCategory=M.errorCategory,i.healthStatus=M.healthStatus,i.failureDiagnostic=M.failureDiagnostic,i.durationMs=Date.now()-A,i.exitCode=M.exitCode,M.exitCode===0?(i.status="passed",i.reason=void 0):(i.status="failed",i.reason=M.message||"stage command failed",i.errorMessage=M.message),T+=1,!e$1.json){let $=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}] (${$}%) ${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(W&&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:W,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};
|