workspai 0.46.0 → 0.47.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 +61 -12
- package/contracts/agent-customization-pack.v1.json +6 -1
- package/contracts/bootstrap-compliance.v1.json +14 -0
- package/contracts/cli-runtime-command-inventory.v1.snapshot.json +4 -0
- package/contracts/extension-cli-compatibility.v1.json +7 -1
- package/contracts/mirror-ops.v1.json +16 -0
- package/contracts/published-contract-catalog.v1.json +31 -0
- package/contracts/runtime-command-surface.v1.json +149 -1
- package/contracts/transparency-evidence.v1.json +13 -0
- package/contracts/workspace-contract.v1.json +78 -0
- package/contracts/workspace-intelligence/workspace-context.v1.json +20 -0
- package/contracts/workspace-intelligence/workspace-graph-token-efficiency.v1.json +72 -0
- package/contracts/workspace-intelligence/workspace-intelligence-run.v1.json +6 -1
- package/contracts/workspace-intelligence/workspace-knowledge-graph-change-overlay.v1.json +200 -0
- package/contracts/workspace-intelligence/workspace-knowledge-graph.v1.json +260 -0
- package/contracts/workspace-intelligence/workspace-knowledge-search.v1.json +60 -0
- package/contracts/workspace-intelligence-architecture.v1.json +6 -3
- package/contracts/workspace-intelligence-chain.v1.json +14 -3
- package/contracts/workspace-share-bundle.v1.json +16 -0
- package/dist/analyze-UVXPRGYZ.js +1 -0
- package/dist/artifact-remediation-plan-EPALZ2LC.js +3 -0
- package/dist/autopilot-release-5BQ6F5L2.js +1 -0
- package/dist/chunk-22NJ2ZMG.js +2 -0
- package/dist/{chunk-UQWOVV6V.js → chunk-2GHUZDYA.js} +1 -1
- package/dist/chunk-2TEDAKP6.js +2 -0
- package/dist/chunk-6SWRNA47.js +4 -0
- package/dist/chunk-76YOPAOT.js +1 -0
- package/dist/chunk-7VLCK5JW.js +1 -0
- package/dist/{chunk-J5PIZCAU.js → chunk-BSRVO52Y.js} +1 -1
- package/dist/chunk-COARSXRC.js +1 -0
- package/dist/chunk-CV5HKU4P.js +1 -0
- package/dist/chunk-CW7PGBIQ.js +13 -0
- package/dist/{chunk-WPEEC5BX.js → chunk-DV6GJD4K.js} +1 -1
- package/dist/chunk-FB7SCXAZ.js +1 -0
- package/dist/{chunk-4LGXSBCN.js → chunk-HSGFUKCN.js} +1 -1
- package/dist/{chunk-ZKAI3PJE.js → chunk-ITCAMC2E.js} +1 -1
- package/dist/chunk-KB44JP4M.js +2 -0
- package/dist/{chunk-QA5BGEQW.js → chunk-KZZ36CK5.js} +1 -1
- package/dist/chunk-LNRAB7UY.js +1 -0
- package/dist/{chunk-VFDM65IE.js → chunk-MEMHNE7Y.js} +22 -22
- package/dist/chunk-NOFM7MNA.js +2 -0
- package/dist/chunk-NRYS4CLR.js +2 -0
- package/dist/chunk-OA537ZQ5.js +1 -0
- package/dist/chunk-PBHP6JNY.js +8 -0
- package/dist/chunk-QDWYIRHR.js +8 -0
- package/dist/chunk-RWRLFSKW.js +2 -0
- package/dist/chunk-SK6XRKGG.js +1 -0
- package/dist/chunk-THIOE2PB.js +2 -0
- package/dist/chunk-TNQI5VCW.js +36 -0
- package/dist/chunk-TWNFECMN.js +2 -0
- package/dist/{chunk-6IIZJQLV.js → chunk-U5EZHZBX.js} +1 -1
- package/dist/{chunk-YUATNVOT.js → chunk-VBSQ7MF6.js} +19 -19
- package/dist/chunk-WDKNMTJQ.js +1 -0
- package/dist/chunk-YCL3I2JO.js +2 -0
- package/dist/chunk-ZDN7RHXJ.js +1 -0
- package/dist/chunk-ZM5NQ5Z2.js +1 -0
- package/dist/{create-WCV3L6XH.js → create-7JKJDAQV.js} +1 -1
- package/dist/{doctor-5BWM2EMJ.js → doctor-PGPNIS76.js} +1 -1
- package/dist/index.d.ts +33 -12
- package/dist/index.js +317 -317
- package/dist/pipeline-IB6ILJSV.js +5 -0
- package/dist/{workspace-7OXW5YTJ.js → workspace-H3QXBFGB.js} +1 -1
- package/dist/{workspace-agent-sync-O4IA6VOA.js → workspace-agent-sync-C7SG2Z5W.js} +1 -1
- package/dist/{workspace-archive-H74NBBNW.js → workspace-archive-P76EDIUG.js} +1 -1
- package/dist/{workspace-context-R7IPUBPG.js → workspace-context-BKQBKA4C.js} +1 -1
- package/dist/workspace-contract-RPQQBQXR.js +1 -0
- package/dist/workspace-dependency-graph-23BI2HG7.js +1 -0
- package/dist/workspace-explain-WVN7JH3U.js +1 -0
- package/dist/{workspace-explain-contract-SVFJAAEI.js → workspace-explain-contract-SEFTVF6J.js} +1 -1
- package/dist/{workspace-feedback-REOS36ZZ.js → workspace-feedback-WAID3IOE.js} +1 -1
- package/dist/{workspace-foundation-KXT4QI5O.js → workspace-foundation-5OOJEO2D.js} +1 -1
- package/dist/workspace-graph-token-efficiency-CFGFCJ5V.js +1 -0
- package/dist/{workspace-history-OGOVSKZG.js → workspace-history-C6OP3IAQ.js} +1 -1
- package/dist/workspace-intelligence-VKDL3H2J.js +1 -0
- package/dist/workspace-intelligence-runner-LVALAZY7.js +1 -0
- package/dist/workspace-knowledge-graph-FE2NTZKV.js +1 -0
- package/dist/workspace-knowledge-graph-change-overlay-XG6FC4IX.js +1 -0
- package/dist/workspace-knowledge-graph-query-VOSPPH4W.js +1 -0
- package/dist/workspace-mcp-serve-KT2I676Z.js +3 -0
- package/dist/workspace-model-S33CIB2R.js +1 -0
- package/dist/workspace-model-hash-MHXK5MEI.js +1 -0
- package/dist/{workspace-registry-summary-SZ46R5PD.js → workspace-registry-summary-A3YDL63D.js} +1 -1
- package/dist/workspace-run-M4LNJILC.js +1 -0
- package/dist/{workspace-verify-MFQ7IXGD.js → workspace-verify-ZGH3NXAH.js} +1 -1
- package/dist/workspace-watch-EVBJTMV7.js +1 -0
- package/docs/AI_DYNAMIC_INTEGRATION.md +73 -428
- package/docs/AI_EXAMPLES.md +37 -395
- package/docs/AI_FEATURES.md +76 -456
- package/docs/AI_QUICKSTART.md +49 -212
- package/docs/GLOSSARY.md +60 -0
- package/docs/OPEN_SOURCE_USER_SCENARIOS.md +68 -7
- package/docs/README.md +63 -41
- package/docs/commands-reference.md +51 -4
- package/docs/config-file-guide.md +6 -2
- package/docs/contracts/ARTIFACT_CATALOG.md +67 -37
- package/docs/contracts/README.md +44 -8
- package/docs/graph-benchmark-methodology.md +121 -0
- package/docs/workspace-knowledge-graph.md +295 -0
- package/docs/workspace-operations.md +49 -0
- package/package.json +2 -1
- package/dist/analyze-BEBEZSZK.js +0 -1
- package/dist/artifact-remediation-plan-FFQSESAM.js +0 -3
- package/dist/autopilot-release-WUR4CQIT.js +0 -1
- package/dist/chunk-2G7FASAO.js +0 -2
- package/dist/chunk-4EPHWD27.js +0 -8
- package/dist/chunk-CVHMUSRX.js +0 -1
- package/dist/chunk-DIPD72H4.js +0 -2
- package/dist/chunk-EFYHGCGX.js +0 -2
- package/dist/chunk-FWRXA435.js +0 -2
- package/dist/chunk-HDURFXW5.js +0 -2
- package/dist/chunk-HMUKBW2S.js +0 -4
- package/dist/chunk-K4WNYXKK.js +0 -33
- package/dist/chunk-LG6RFLPZ.js +0 -1
- package/dist/chunk-N7DV5L7C.js +0 -1
- package/dist/chunk-PRBVYW3T.js +0 -1
- package/dist/chunk-QZLIURER.js +0 -13
- package/dist/chunk-RIEF2DDX.js +0 -8
- package/dist/chunk-SXMTSV5M.js +0 -1
- package/dist/chunk-SXPY523X.js +0 -1
- package/dist/chunk-V3LRQZ36.js +0 -1
- package/dist/chunk-WYFPXTTS.js +0 -2
- package/dist/pipeline-ORIWVVYM.js +0 -5
- package/dist/workspace-contract-HKCMOMFE.js +0 -1
- package/dist/workspace-explain-GOPQYTPQ.js +0 -1
- package/dist/workspace-intelligence-7IESQSXY.js +0 -1
- package/dist/workspace-intelligence-runner-6GJ5M4HB.js +0 -1
- package/dist/workspace-mcp-serve-FRVWBO36.js +0 -3
- package/dist/workspace-model-PPYX7B4S.js +0 -1
- package/dist/workspace-run-V3KKHTVF.js +0 -1
- package/dist/workspace-watch-SOPZHRWA.js +0 -1
|
@@ -102,6 +102,12 @@
|
|
|
102
102
|
"schemaVersion": "workspace-model.v1",
|
|
103
103
|
"schemaContract": "contracts/workspace-intelligence/workspace-model.v1.json"
|
|
104
104
|
},
|
|
105
|
+
{
|
|
106
|
+
"id": "knowledgeGraph",
|
|
107
|
+
"path": ".workspai/reports/workspace-knowledge-graph.json",
|
|
108
|
+
"schemaVersion": "workspace-knowledge-graph.v1",
|
|
109
|
+
"schemaContract": "contracts/workspace-intelligence/workspace-knowledge-graph.v1.json"
|
|
110
|
+
},
|
|
105
111
|
{
|
|
106
112
|
"id": "snapshot",
|
|
107
113
|
"path": ".workspai/reports/workspace-model-snapshot.json",
|
|
@@ -310,6 +316,7 @@
|
|
|
310
316
|
"label": "System understanding",
|
|
311
317
|
"artifacts": [
|
|
312
318
|
".workspai/reports/workspace-model.json",
|
|
319
|
+
".workspai/reports/workspace-knowledge-graph.json",
|
|
313
320
|
".workspai/reports/workspace-model-diff-last-run.json",
|
|
314
321
|
".workspai/reports/workspace-impact-last-run.json"
|
|
315
322
|
],
|
|
@@ -493,9 +500,10 @@
|
|
|
493
500
|
"workspace graph mermaid"
|
|
494
501
|
],
|
|
495
502
|
"reads": [
|
|
496
|
-
".workspai/reports/workspace-model.json
|
|
503
|
+
".workspai/reports/workspace-model.json",
|
|
504
|
+
".workspai/reports/workspace-knowledge-graph.json"
|
|
497
505
|
],
|
|
498
|
-
"role": "
|
|
506
|
+
"role": "Query the proof-backed graph derived from the canonical workspace model.",
|
|
499
507
|
"chainStep": false
|
|
500
508
|
},
|
|
501
509
|
{
|
|
@@ -726,7 +734,8 @@
|
|
|
726
734
|
],
|
|
727
735
|
"consumesArtifacts": [],
|
|
728
736
|
"produces": [
|
|
729
|
-
".workspai/reports/workspace-model.json"
|
|
737
|
+
".workspai/reports/workspace-model.json",
|
|
738
|
+
".workspai/reports/workspace-knowledge-graph.json"
|
|
730
739
|
],
|
|
731
740
|
"dependsOn": [],
|
|
732
741
|
"exitPolicy": "stop-on-error",
|
|
@@ -1206,6 +1215,7 @@
|
|
|
1206
1215
|
".workspai/reports/workspace-impact-last-run.json",
|
|
1207
1216
|
".workspai/reports/workspace-explain-last-run.json",
|
|
1208
1217
|
".workspai/reports/workspace-model.json",
|
|
1218
|
+
".workspai/reports/workspace-knowledge-graph.json",
|
|
1209
1219
|
".workspai/reports/agent-customization-pack.json",
|
|
1210
1220
|
".workspai/reports/workspace-skills-index.json"
|
|
1211
1221
|
],
|
|
@@ -1218,6 +1228,7 @@
|
|
|
1218
1228
|
"ideAndCi": {
|
|
1219
1229
|
"requiredArtifacts": [
|
|
1220
1230
|
".workspai/reports/workspace-model.json",
|
|
1231
|
+
".workspai/reports/workspace-knowledge-graph.json",
|
|
1221
1232
|
".workspai/reports/workspace-impact-last-run.json",
|
|
1222
1233
|
".workspai/reports/workspace-verify-last-run.json"
|
|
1223
1234
|
],
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://getrapidkit.com/schemas/workspace-share-bundle.v1.json",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"required": ["schema_version", "generated_at", "generated_by", "workspace", "summary", "reports", "projects"],
|
|
6
|
+
"properties": {
|
|
7
|
+
"schema_version": { "const": "1.1" },
|
|
8
|
+
"generated_at": { "type": "string", "format": "date-time" },
|
|
9
|
+
"generated_by": { "const": "workspai" },
|
|
10
|
+
"workspace": { "type": "object" },
|
|
11
|
+
"summary": { "type": "object" },
|
|
12
|
+
"reports": { "type": "object" },
|
|
13
|
+
"projects": { "type": "array", "items": { "type": "object" } }
|
|
14
|
+
},
|
|
15
|
+
"additionalProperties": true
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{b as printAnalyzeReport,a as runAnalyze}from'./chunk-PBHP6JNY.js';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import {a as a$1}from'./chunk-2E6WGUN6.js';import {a,e,b}from'./chunk-2TEDAKP6.js';import y from'path';import {existsSync}from'fs';import x from'fs-extra';var I=[{artifactKind:"bootstrap-compliance",cardId:"bootstrap",fileNames:["bootstrap-compliance.latest.json"]},{artifactKind:"doctor-workspace",cardId:"doctor",fileNames:["doctor-remediation-plan-last-run.json"]},{artifactKind:"analyze",cardId:"analyze",fileNames:["analyze-last-run.json"]},{artifactKind:"readiness",cardId:"readiness",fileNames:["release-readiness-last-run.json"]},{artifactKind:"pipeline",cardId:"pipeline",fileNames:["pipeline-last-run.json"]},{artifactKind:"workspace-run",cardId:"workspaceRun",fileNames:["workspace-run-last.json"]},{artifactKind:"workspace-verify",cardId:"workspaceVerify",fileNames:["workspace-verify-last-run.json"]}];function m(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function f(e){return Array.isArray(e)?e.filter(r=>typeof r=="string"&&r.trim().length>0):[]}function k(e){return [...new Set(e.map(r=>r.trim()).filter(Boolean))]}function K(e,r,t){return t?r:y.relative(e,r)}function C(e){let r=e?.trim()||"npx workspai bootstrap";if(!/(?:^|\s)--ci(?:\s|$)/.test(r)&&/(?:^|\s)--json(?:\s|$)/.test(r))return r.replace(/(?:^|\s)--json(?:\s|$)/,i=>{let n=i.startsWith(" ")?" ":"",c=i.endsWith(" ")?" ":"";return `${n}--ci --json${c}`}).trim();let t=/(?:^|\s)--ci(?:\s|$)/.test(r)?r:`${r} --ci`;return /(?:^|\s)--json(?:\s|$)/.test(t)?t:`${t} --json`}function M(e){return `${JSON.stringify({schemaVersion:"rapidkit.compatibility-matrix.v1",generatedAt:e,source:"workspai workspace remediation-plan",runtimes:{},notes:["Minimal enterprise baseline. Add runtime and toolchain entries as governance matures."]},null,2)}
|
|
2
|
+
`}function N(e){return `${JSON.stringify({schema_version:"1.0",enabled:false,strategy:"on-demand",artifacts:[],created_at:e,note:"Minimal enterprise baseline. Set enabled: true and add artifact entries to activate mirroring."},null,2)}
|
|
3
|
+
`}function $(e){let r=e.payload,t=f(r.blockers),i=f(r.blockingReasons),n=f(r.failures),c=f(r.reasons),d=f(r.policyViolations),a=m(r.summary),l=f(a?.blockers);if(e.artifactKind==="analyze"){let o=(Array.isArray(r.findings)?r.findings:[]).map(s=>m(s)).filter(s=>!!s).map(s=>String(s.message??s.title??s.id??"").trim()).filter(Boolean);return k([...t,...o,...i])}if(e.artifactKind==="workspace-run"){let u=m(r.stages),o=Object.entries(u??{}).flatMap(([s,b])=>{let h=m(b);return (Array.isArray(h?.projects)?h.projects:[]).map(p=>m(p)).filter(p=>!!p).filter(p=>p.status==="failed"||p.ok===false).map(p=>`${s}: ${String(p.project??p.name??"project")} failed`)});return k([...t,...o,...i])}return k([...t,...i,...n,...c,...d,...l])}function g(e){return {id:e.id,artifactKind:e.artifactKind,cardId:e.cardId,title:e.title,order:e.order,phase:e.phase,scope:"workspace",status:e.status??"ready",mode:e.mode,risk:e.risk,requiresApproval:true,blocker:e.blocker,summary:e.summary,...e.command?{command:e.command}:{},verifyCommand:e.verifyCommand,cwd:"workspace",files:e.files??[],...e.operation?{operation:e.operation}:{},rollback:{available:!!e.operation,strategy:e.operation?"idempotent":"none"},notes:e.notes??[]}}function P(e){let r=[],t=C("npx workspai bootstrap --json");for(let i of e.blockers)i.includes("profile.enterprise.ci")&&r.push(g({id:"bootstrap.enterprise-ci",artifactKind:"bootstrap-compliance",cardId:"bootstrap",title:"Run bootstrap in deterministic CI mode",order:10,phase:"bootstrap-preflight",blocker:i,summary:"Enterprise bootstrap compliance requires --ci for deterministic execution.",mode:"run-command",risk:"safe",command:t,verifyCommand:t})),i.includes("profile.enterprise.compatibility-matrix")&&r.push(g({id:"bootstrap.compatibility-matrix",artifactKind:"bootstrap-compliance",cardId:"bootstrap",title:"Create enterprise compatibility matrix baseline",order:20,phase:"bootstrap-config",blocker:i,summary:"Create the missing compatibility matrix baseline without overwriting user data.",mode:"edit-file",risk:"safe",verifyCommand:t,files:[".workspai/compatibility-matrix.json"],operation:{type:"file-create",path:".workspai/compatibility-matrix.json",content:M(e.generatedAt),overwrite:false}})),i.includes("profile.enterprise.mirror-config")&&r.push(g({id:"bootstrap.mirror-config",artifactKind:"bootstrap-compliance",cardId:"bootstrap",title:"Create enterprise mirror config baseline",order:30,phase:"bootstrap-config",blocker:i,summary:"Create the missing mirror configuration baseline without enabling mirroring.",mode:"edit-file",risk:"safe",verifyCommand:t,files:[".workspai/mirror-config.json"],operation:{type:"file-create",path:".workspai/mirror-config.json",content:N(e.generatedAt),overwrite:false}}));return r}function S(e){if(e.report.artifactKind==="readiness"&&/dependenc(?:y|ies).*vulnerabil|vulnerabil.*dependenc(?:y|ies)|security audit/i.test(e.blocker))return g({id:`${e.report.cardId}.doctor-owner.${e.order}`,artifactKind:e.report.artifactKind,cardId:e.report.cardId,title:"Resolve dependency vulnerability through Doctor",order:e.order,phase:"dependency-remediation",blocker:e.blocker,summary:"Release Readiness is the aggregate gate; use the project-scoped Doctor remediation capability that owns this dependency failure.",mode:"verify-before-fix",risk:"guarded",status:"review-required",command:"npx workspai doctor workspace --plan --json",verifyCommand:e.ciMode?"npx workspai readiness --strict --json":"npx workspai readiness --json",notes:["Read doctor-remediation-plan-last-run.json and execute the matching surface-security-hygiene capability before rerunning Readiness.","Do not treat a Readiness refresh as remediation for a source dependency vulnerability."]});let t={analyze:{title:"Refresh analyze evidence",phase:"analysis",command:"npx workspai analyze --strict --json",verify:"npx workspai analyze --strict --json"},readiness:{title:"Refresh release readiness",phase:"release-readiness",command:e.ciMode?"npx workspai readiness --strict --json":"npx workspai readiness --json",verify:e.ciMode?"npx workspai readiness --strict --json":"npx workspai readiness --json"},pipeline:{title:"Rerun governance pipeline",phase:"governance-pipeline",command:"npx workspai pipeline --json --strict",verify:"npx workspai pipeline --json --strict"},"workspace-run":{title:"Rerun failed workspace stage",phase:"fleet-run",command:e.ciMode?"npx workspai workspace run test --strict --json":"npx workspai workspace run test --json",verify:e.ciMode?"npx workspai workspace run test --strict --json":"npx workspai workspace run test --json"},"workspace-verify":{title:"Refresh workspace verify gate",phase:"verification",command:e.ciMode?"npx workspai workspace verify --strict --json":"npx workspai workspace verify --json",verify:e.ciMode?"npx workspai workspace verify --strict --json":"npx workspai workspace verify --json"},"doctor-workspace":{title:"Use Doctor remediation plan",phase:"doctor-remediation",command:"npx workspai doctor workspace --plan --json",verify:"npx workspai doctor workspace --json"}}[e.report.artifactKind]??{title:"Refresh artifact evidence",phase:"evidence-refresh",command:"npx workspai pipeline --json --strict",verify:"npx workspai pipeline --json --strict"};return g({id:`${e.report.cardId}.refresh.${e.order}`,artifactKind:e.report.artifactKind,cardId:e.report.cardId,title:t.title,order:e.order,phase:t.phase,blocker:e.blocker,summary:"No deterministic file operation is available for this artifact yet; refresh the evidence and continue with the card-specific plan.",mode:e.report.artifactKind==="doctor-workspace"?"verify-before-fix":"run-command",risk:"guarded",status:e.report.artifactKind==="doctor-workspace"?"review-required":"ready",command:t.command,verifyCommand:t.verify,notes:e.report.artifactKind==="doctor-workspace"?["Read doctor-remediation-plan-last-run.json for ordered file-level steps."]:[]})}async function O(e){let r=[a(e,".workspai/reports"),b(e,".workspai/reports")],t=[],i=new Set;for(let n of I)for(let c of n.fileNames){let d=(await Promise.all(r.map(a=>y.join(a,c)))).find(a=>existsSync(a));if(!(!d||i.has(`${n.artifactKind}:${c}`))){i.add(`${n.artifactKind}:${c}`);try{let a=await x.readJSON(d),l=m(a);if(!l)continue;t.push({artifactKind:n.artifactKind,cardId:n.cardId,fileName:c,absolutePath:d,payload:l});}catch{t.push({artifactKind:n.artifactKind,cardId:n.cardId,fileName:c,absolutePath:d,payload:{blockers:[`${n.artifactKind}: report exists but could not be parsed.`]}});}}}return t}async function F(e){let r=y.resolve(e.workspacePath),t=e.includeAbsolutePaths===true,i=e.ciMode===true,n=new Date().toISOString(),c=a(r,".workspai/reports"),d=await O(r),a$2=[],l=1;for(let o of d){let s=$(o);if(s.length!==0){if(o.artifactKind==="bootstrap-compliance"){a$2.push(...P({blockers:s,generatedAt:n})),l=a$2.length+1;continue}for(let b of s.slice(0,8))a$2.push(S({report:o,blocker:b,order:l,ciMode:i})),l+=1;}}let u={safe:a$2.filter(o=>o.risk==="safe").length,guarded:a$2.filter(o=>o.risk==="guarded").length,invasive:a$2.filter(o=>o.risk==="invasive").length};return {schemaVersion:a$1,generatedAt:n,workspace:{name:y.basename(r),...t?{path:r}:{}},source:{command:"workspace remediation-plan",reportsDir:K(r,c,t),includeAbsolutePaths:t,ciMode:i},summary:{artifactsScanned:d.length,cardsCovered:k(a$2.map(o=>o.cardId)).length,totalActions:a$2.length,executableActions:a$2.filter(o=>o.status==="ready").length,risk:u},actions:a$2}}async function W(e$1,r){return e(r,".workspai/reports/artifact-remediation-plan-last-run.json",e$1)}export{F as buildArtifactRemediationPlan,W as writeArtifactRemediationPlan};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{b as AUTOPILOT_RELEASE_ALIAS_FILENAME,a as AUTOPILOT_RELEASE_LAST_RUN_FILENAME,c as runAutopilotRelease}from'./chunk-QDWYIRHR.js';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {a as a$1}from'./chunk-FXQJX34Z.js';import {w}from'./chunk-TWNFECMN.js';import {a as a$2,d,c,e as e$1}from'./chunk-2TEDAKP6.js';import {b as b$1}from'./chunk-YCL3I2JO.js';import {a,b}from'./chunk-LNRAB7UY.js';import {e}from'./chunk-RO73VVHW.js';import {p,o}from'./chunk-5XATWNME.js';import {l}from'./chunk-OCGZNSOE.js';import m from'path';import g from'fs-extra';var ne="unknown-run";function M(e$1){let t=e();return !t||t===ne?e$1:{...e$1,runId:t}}var be="workspace-dependency-graph.v1",L=["code-import","package-dep","event-pub-sub","service-dependsOn","shared-resource"],U=["inferred","contract","manual"];var C=".workspai/workspace.contract.json",ae=a.contractVerify,v=1,se=b.contractVerify,j=class extends Error{constructor(o){super(`Workspace contract verification failed: ${o.violations.join("; ")}`);this.verification=o;this.name="WorkspaceContractVerificationError";}verification};function Z(e){return e.replace(/\\/g,"/")}function O(e){let t=Z(e).trim();return !t||t.startsWith("/")||t.startsWith("~")||/^[a-zA-Z]:\//.test(t)||t.includes("\0")?false:!t.split("/").filter(Boolean).some(o=>o===".."||o===".")}function z(e,t){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,80)||t}function ce(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function ie(e){let o=(Array.isArray(e.ports)?e.ports:[]).map(c=>{if(!c||typeof c!="object"||Array.isArray(c))return null;let d=c,f=Number(d.port);if(!Number.isInteger(f)||f<1||f>65535)return null;let u=d.protocol==="https"||d.protocol==="grpc"||d.protocol==="tcp"||d.protocol==="udp"?d.protocol:"http";return {name:typeof d.name=="string"&&d.name.trim()?d.name:"http",port:f,protocol:u}}).filter(c=>c!==null);if(o.length>0)return o;let n=e.frontend&&typeof e.frontend=="object"&&!Array.isArray(e.frontend)?e.frontend:void 0,s=Number(e.port??n?.default_port);return Number.isInteger(s)&&s>=1&&s<=65535?[{name:"http",port:s,protocol:"http"}]:[]}async function A(e){for(let t of e)if(await g.pathExists(t))return t;return null}async function pe(e){for(let t of o(e,"workspace.json"))try{let o=await g.readJson(t);return {name:typeof o.workspace_name=="string"&&o.workspace_name.trim()||typeof o.name=="string"&&o.name.trim()||m.basename(e),profile:typeof o.profile=="string"?o.profile:void 0}}catch{}return {name:m.basename(e)}}async function de(e){let t=[],o=[e],n=new Set,s=new Set([".git",".workspai",".rapidkit","node_modules",".venv","venv","dist","build","target",".next",".turbo",".cache"]);for(;o.length>0;){let c=o.shift();if(!c||n.has(c))continue;n.add(c);let d=await A(p(c,"project.json")),f=await A(p(c,"context.json"));if(d||f){t.push(d??f??"");continue}let u;try{u=await g.readdir(c,{withFileTypes:true});}catch{continue}for(let l of u)!l.isDirectory()||s.has(l.name)||o.push(m.join(c,l.name));}return t.sort()}function ue(e){let t=(e||"").toLowerCase();if(t.includes("fastapi"))return "fastapi";if(t.includes("nestjs"))return "nestjs";if(t.includes("springboot"))return "springboot";if(t.includes("gofiber"))return "fiber";if(t.includes("gogin"))return "gin"}function le(e,t){let o=(e||"").toLowerCase(),n=(t||"").toLowerCase();return o.includes("fastapi")?8e3:o.includes("nestjs")?3e3:o.includes("springboot")?8080:o.includes("gofiber")?3e3:o.includes("gogin")?8080:n==="node"?3e3:n==="python"?8e3:n==="java"||n==="go"?8080:null}function Y(e,t){let o=e;for(;t.has(o)&&o<65535;)o+=1;return o}function _(e,t,o){let n=e!==void 0&&e.source===void 0,s=le(t.kit,t.runtime),c=e?.ports||[],d=t.ports||[],u=(c.length>0?c:d.length>0?d:s?[{name:"http",port:Y(s,o),protocol:"http"}]:[]).map(i=>({...i,port:Y(i.port,o)}));for(let i of u)o.add(i.port);let l={...t,...e,slug:e?.slug||t.slug,relativePath:n&&e?.relativePath&&O(e.relativePath)?e.relativePath:t.relativePath,source:n&&e?.source||t.source,relationship:n&&e?.relationship||t.relationship,externalPath:n&&e?.externalPath||t.externalPath,runtime:e?.runtime||t.runtime,framework:e?.framework||t.framework,kit:e?.kit||t.kit,modules:e?.modules?.length?e.modules:t.modules,ports:u,contracts:{owns:e?.contracts?.owns||[],apis:e?.contracts?.apis||[],publishes:e?.contracts?.publishes||[],consumes:e?.contracts?.consumes||[],dependsOn:e?.contracts?.dependsOn||[],env:e?.contracts?.env||[]}},a=JSON.stringify(e||null)!==JSON.stringify(l);return {project:l,changed:a}}async function Q(e){let t=m.resolve(e.workspacePath),o=await pe(t),n=await de(t),s=await a$1(t),c=[];for(let l of s){let a=m.resolve(l.path),i=await A(p(a,"project.json"))??await A(p(a,"context.json"));!i||n.some(k=>m.resolve(k)===m.resolve(i))||c.push({projectJsonPath:i,registryEntry:l});}let d=[],f=[...n.map(l=>({projectJsonPath:l})),...c];for(let{projectJsonPath:l,registryEntry:a}of f){let i=m.dirname(m.dirname(l)),k=Z(m.relative(t,i)),h=a!==void 0&&!O(k),r=z(a?.name||m.basename(i),m.basename(i)),p=h?`external/${r}`:k||r,w=await g.readJson(l),y=typeof w.kit_name=="string"&&w.kit_name||typeof w.kit=="string"&&w.kit||void 0,R=typeof w.framework=="string"&&w.framework||ue(y);d.push({slug:a?.name||p||m.basename(i),relativePath:p,source:a?.source??"workspace",relationship:a?.relationship,externalPath:h?i:void 0,runtime:typeof w.runtime=="string"?w.runtime:void 0,framework:R,kit:y,modules:ce(w.modules),ports:ie(w),contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]}});}let u=new Map;for(let l of d){let a=z(l.slug,l.relativePath),i=u.get(a);(!i||i.source!=="workspace"&&l.source==="workspace")&&u.set(a,l);}return {schemaVersion:v,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:o,projects:[...u.values()]}}async function Te(e){let t=m.resolve(e.outputPath||a$2(e.workspacePath,C));if(await g.pathExists(t)&&e.force!==true)throw new Error(`Workspace contract already exists: ${t}. Use --force to overwrite.`);let o=await Q({workspacePath:e.workspacePath,now:e.now}),n=new Set,s={...o,projects:o.projects.map(d=>_(void 0,d,n).project)},c=await te({workspacePath:e.workspacePath,contractPath:t,contract:s});if(e.strict&&c.status==="failed")throw new j(c);return await X({workspacePath:e.workspacePath,contractPath:t,contract:s,now:e.now}),{contractPath:t,contract:s}}async function Ve(e){let t=m.resolve(e.workspacePath),o=a$2(t,C),n=await d(t,C)??o,s=await Q({workspacePath:t,now:e.now}),c=await g.pathExists(n)?await g.readJson(n):null,d$1=new Map((c?.projects||[]).map(h=>[h.slug,h])),f=new Set,u=[],l=[],a=[];for(let h of s.projects){let r=d$1.get(h.slug),p=_(r,h,f);r?p.changed&&l.push(h.slug):u.push(h.slug),a.push(p.project),d$1.delete(h.slug);}for(let h of d$1.values()){if(h.source)continue;let r=_(h,h,f);a.push(r.project);}let i={schemaVersion:v,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:{...s.workspace,...c?.workspace||{},name:c?.workspace?.name||s.workspace.name},projects:a.sort((h,r)=>h.slug.localeCompare(r.slug))},k=await te({workspacePath:t,contractPath:o,contract:i});if(e.strict&&k.status==="failed")throw new j(k);return await X({workspacePath:t,contractPath:o,contract:i,now:e.now}),{contractPath:o,contract:i,addedProjects:u,updatedProjects:l,verification:k}}async function q(e){return await g.pathExists(e)?{exists:true,contents:await g.readFile(e)}:{exists:false}}async function B(e,t){if(!t.exists){await g.remove(e);return}await g.outputFile(e,t.contents);}async function X(e){let{buildWorkspaceRegistrySummary:t,WORKSPACE_REGISTRY_SUMMARY_RELATIVE_PATH:o}=await import('./workspace-registry-summary-A3YDL63D.js'),n=await t(e.workspacePath,{now:e.now,contract:e.contract}),s=a$2(e.workspacePath,o),c$1=d=>{if(!d||typeof d!="object"||Array.isArray(d))return JSON.stringify(d);let{generatedAt:f,...u}=d;return JSON.stringify(u)};if(await g.pathExists(e.contractPath)&&await g.pathExists(s)){let[d,f]=await Promise.all([g.readJson(e.contractPath),g.readJson(s)]);if(c$1(d)===c$1(e.contract)&&c$1(f)===c$1(n))return}b$1(C,e.contract),b$1(o,n),await c(e.workspacePath,C,async()=>{let[d,f]=await Promise.all([q(e.contractPath),q(s)]);try{if(e.contractPath===a$2(e.workspacePath,C)?await e$1(e.workspacePath,C,e.contract):(await g.ensureDir(m.dirname(e.contractPath)),await g.writeJson(e.contractPath,e.contract,{spaces:2})),process.env.WORKSPAI_TEST_FAIL_WORKSPACE_REGISTRY_PUBLISH==="1")throw new Error("Injected workspace registry summary publication failure.");await e$1(e.workspacePath,o,n);}catch(u){let a=(await Promise.allSettled([B(e.contractPath,d),B(s,f)])).filter(i=>i.status==="rejected");throw a.length>0?new AggregateError([u,...a.map(i=>i.reason)],"Workspace contract publication failed and rollback was incomplete."):u}});}async function ee(e){let t=e.contractPath??(await d(e.workspacePath,C)||a$2(e.workspacePath,C)),o=await g.readJson(t);return {contractPath:t,contract:o}}var me={metadata:[".workspai/project.json",".workspai/context.json",".rapidkit/project.json",".rapidkit/context.json"],manifests:["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","pyproject.toml","poetry.lock","requirements.txt","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","Gemfile","composer.json"],entrypoints:["src/main.ts","src/index.ts","src/app.ts","src/main.js","src/index.js","main.py","app/main.py","manage.py","main.go","cmd/main.go","Program.cs"],apiSpecifications:["openapi.yaml","openapi.yml","openapi.json","swagger.yaml","swagger.yml","swagger.json"],infrastructure:["Dockerfile","docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml","k8s","kubernetes","terraform"],documentation:["README.md","ARCHITECTURE.md","CONTRIBUTING.md","docs"]};function ge(e,t){return t.externalPath?m.resolve(t.externalPath):m.resolve(e,t.relativePath)}async function fe(e){let t={metadata:[],manifests:[],entrypoints:[],apiSpecifications:[],infrastructure:[],documentation:[]};for(let[o,n]of Object.entries(me))for(let s of n)await g.pathExists(m.join(e,s))&&t[o].push(s);try{let o=await g.readdir(e,{withFileTypes:true});for(let n of o)n.isFile()&&(n.name.endsWith(".csproj")||n.name.endsWith(".sln"))&&t.manifests.push(n.name),n.isFile()&&n.name.endsWith(".tf")&&t.infrastructure.push(n.name);}catch{}for(let o of Object.values(t))o.sort((n,s)=>n.localeCompare(s));return t}function W(e){return !e||typeof e!="object"||Array.isArray(e)?[]:Object.keys(e).sort((t,o)=>t.localeCompare(o))}async function he(e){try{let t=await g.readJson(m.join(e,"package.json")),o={runtime:W(t.dependencies),development:W(t.devDependencies),peer:W(t.peerDependencies),optional:W(t.optionalDependencies)};return {...typeof t.name=="string"?{name:t.name}:{},...typeof t.version=="string"?{version:t.version}:{},...typeof t.private=="boolean"?{private:t.private}:{},scripts:W(t.scripts),dependencies:o,dependencyCount:new Set(Object.values(o).flat()).size}}catch{return}}async function ke(e){for(let t of [".env.example",".env.sample",".env.template"])try{return (await g.readFile(m.join(e,t),"utf8")).split(/\r?\n/).map(n=>n.trim()).filter(n=>n.length>0&&!n.startsWith("#")&&n.includes("=")).map(n=>n.slice(0,n.indexOf("=")).trim()).filter(n=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(n)).sort((n,s)=>n.localeCompare(s))}catch{}return []}function we(e,t){try{let o=w(e);if(o.engine!=="unknown")return o;let n=g.pathExistsSync(m.join(e,"package.json"))?"npm":g.pathExistsSync(m.join(e,"pyproject.toml"))?"python":g.pathExistsSync(m.join(e,"requirements.txt"))?"pip":"unknown";return {...o,engine:n,runtime:t.runtime??o.runtime,framework:t.framework??o.framework,frameworkDisplayName:t.framework??o.frameworkDisplayName}}catch{return {schemaVersion:1,scope:"project",projectRoot:null,engine:"unknown",runtime:"unknown",framework:"unknown",frameworkDisplayName:"Unknown",frameworkConfidence:"low",frameworkSupportTier:"observed",runtimeSupportTier:"observed",runtimeDoctorSupport:"observed",moduleSupport:false,fleetStages:[],localOnlyCommands:[],commandMap:{},supportedCommands:[],unsupportedCommands:[],globalCommands:[]}}}function Pe(e,t,o){let n=e.projects.map(s=>({id:s.slug,path:s.relativePath,runtime:s.runtime,framework:s.framework}));return {schemaVersion:"workspace-dependency-graph.v1",generatedAt:t,nodes:n,edges:[],stats:{nodeCount:n.length,edgeCount:0,inferredEdges:0,contractEdges:0,manualEdges:0,authoritativeEdges:0,lowConfidenceEdges:0,orphanCount:n.length,connectedNodeCount:0,density:0,edgeCoverageRatio:n.length===0?1:0,evidenceCoverageRatio:1,hotspotCount:0,hasCycle:false},diagnostics:[{code:"graph.enrichment.failed",severity:"warning",message:o,recommendation:"Review project manifests and graph overrides, then rerun workspace contract graph."}]}}async function Ke(e){let{contractPath:t,contract:o}=await ee(e),n=e.now??new Date,s=n.toISOString(),c;try{let{inferWorkspaceDependencyGraph:r}=await import('./workspace-dependency-graph-23BI2HG7.js');c=await r({workspacePath:e.workspacePath,contract:o,now:n,model:{projects:o.projects.map(p=>({name:p.slug,path:p.relativePath,...p.externalPath?{absolutePath:p.externalPath}:{},...p.runtime?{runtime:p.runtime}:{},...p.framework?{framework:p.framework}:{},...p.framework?{kind:p.framework}:{}}))}});}catch(r){c=Pe(o,s,`Graph enrichment failed: ${r instanceof Error?r.message:String(r)}`);}let d=new Map(c.nodes.map(r=>[r.id,r.operationalProfile])),{buildWorkspaceKnowledgeGraph:f}=await import('./workspace-knowledge-graph-FE2NTZKV.js'),u=await f({workspacePath:e.workspacePath,workspace:o.workspace,contract:o,projectTopology:c,now:n,projects:o.projects.map(r=>({id:r.slug,path:r.relativePath,...r.externalPath?{absolutePath:r.externalPath}:{},...r.runtime?{runtime:r.runtime}:{},...r.framework?{framework:r.framework}:{},...r.kit?{kit:r.kit}:{}}))}),l=await Promise.all(o.projects.map(async r=>{let p=ge(e.workspacePath,r),[w,y,R]=await Promise.all([fe(p),he(p),ke(p)]),P=we(p,r);return {id:r.slug,label:r.slug,relativePath:r.relativePath,source:r.source,relationship:r.relationship,externalPath:r.externalPath,runtime:r.runtime??P.runtime,framework:r.framework??P.framework,kit:r.kit,modules:r.modules,ports:r.ports,apis:r.contracts.apis,owns:r.contracts.owns,env:[...new Set([...r.contracts.env,...R])].sort((re,oe)=>re.localeCompare(oe)),contracts:{owns:[...r.contracts.owns],apis:[...r.contracts.apis],publishes:[...r.contracts.publishes],consumes:[...r.contracts.consumes],dependsOn:[...r.contracts.dependsOn],env:[...r.contracts.env]},capabilities:{engine:P.engine,supportTier:P.frameworkSupportTier,runtimeSupportTier:P.runtimeSupportTier,doctorSupport:P.runtimeDoctorSupport,moduleSupport:P.moduleSupport,fleetStages:[...P.fleetStages],localOnlyCommands:[...P.localOnlyCommands],supportedCommands:[...P.supportedCommands]},files:w,...y?{package:y}:{},...d.get(r.slug)?{operationalProfile:d.get(r.slug)}:{}}})),a=new Set(l.map(r=>r.id)),i=new Map,k=[];for(let r of o.projects){for(let p of r.contracts.dependsOn||[])a.has(p)&&k.push({from:p,to:r.slug,type:"dependency",label:"dependsOn"});for(let p of r.contracts.publishes||[])i.has(p)||i.set(p,new Set),i.get(p)?.add(r.slug);}for(let r of o.projects)for(let p of r.contracts.consumes||[]){let w=i.get(p);if(w)for(let y of w)y!==r.slug&&k.push({from:y,to:r.slug,type:"event",label:p});}let h={schemaVersion:1,kind:"rapidkit.workspace.contract.graph",workspace:o.workspace,generatedAt:s,nodes:l.sort((r,p)=>r.id.localeCompare(p.id)),edges:k.sort((r,p)=>`${r.from}:${r.to}:${r.type}:${r.label}`.localeCompare(`${p.from}:${p.to}:${p.type}:${p.label}`)),dependencyGraph:c,knowledgeGraph:u,semantics:{legacyEdges:"producer-to-consumer",dependencyGraphEdges:"consumer-to-dependency"},summary:{projectCount:l.length,dependencyEdges:k.filter(r=>r.type==="dependency").length,eventEdges:k.filter(r=>r.type==="event").length,portCount:l.reduce((r,p)=>r+p.ports.length,0),apiCount:l.reduce((r,p)=>r+p.apis.length,0),relationshipEdges:c.stats.edgeCount,inferredEdges:c.stats.inferredEdges,authoritativeEdges:c.stats.authoritativeEdges,orphanProjects:c.stats.orphanCount,hotspotProjects:c.stats.hotspotCount,evidenceCoverageRatio:c.stats.evidenceCoverageRatio,edgeCoverageRatio:c.stats.edgeCoverageRatio,connectedProjects:c.stats.connectedNodeCount,lowConfidenceEdges:c.stats.lowConfidenceEdges,hasCycle:c.stats.hasCycle,manifestCount:l.reduce((r,p)=>r+p.files.manifests.length,0),entrypointCount:l.reduce((r,p)=>r+p.files.entrypoints.length,0),diagnostics:c.diagnostics?.length??0,relationshipKinds:Object.fromEntries(L.map(r=>[r,c.edges.filter(p=>p.kind===r).length])),relationshipSources:Object.fromEntries(U.map(r=>[r,c.edges.filter(p=>p.source===r).length])),entityCount:u.quality.entityCount,knowledgeRelations:u.quality.relationCount,proofCount:u.quality.proofCount,providerCount:u.providers.length,knowledgeUnknowns:u.quality.unknownCount}};return {contractPath:t,graph:h}}async function te(e){let t=e.contract?{contractPath:e.contractPath??a$2(e.workspacePath,C),contract:e.contract}:await ee(e),{contractPath:o,contract:n}=t,s=[],c=[];n.kind!=="rapidkit.workspace.contract"&&s.push("Contract kind must be rapidkit.workspace.contract."),n.schemaVersion!==v&&s.push(`Contract schemaVersion must be ${v}.`),n.workspace?.name||s.push("Contract workspace.name is required."),Array.isArray(n.projects)||s.push("Contract projects must be an array.");let d=new Set,f=new Map;for(let a of n.projects||[]){if(!a.slug){s.push("Every project must declare slug.");continue}d.has(a.slug)&&s.push(`Duplicate project slug: ${a.slug}.`),d.add(a.slug),a.relativePath?O(a.relativePath)||s.push(`Project ${a.slug} declares unsafe relativePath: ${a.relativePath}.`):s.push(`Project ${a.slug} must declare relativePath.`),a.externalPath&&(a.relationship==="adopted"||a.source==="adopted-local"||a.source==="local-folder"||a.source==="git-url"||s.push(`Project ${a.slug} declares externalPath without imported/adopted provenance.`),m.isAbsolute(a.externalPath)||s.push(`Project ${a.slug} declares non-absolute externalPath.`));for(let i of a.ports||[]){(!Number.isInteger(i.port)||i.port<1||i.port>65535)&&s.push(`Project ${a.slug} declares invalid port: ${i.port}.`);let k=f.get(i.port);k&&s.push(`Port ${i.port} is claimed by both ${k} and ${a.slug}.`),f.set(i.port,a.slug);}for(let i of a.contracts?.apis||[])(!i.name?.trim()||!i.basePath?.startsWith("/"))&&s.push(`Project ${a.slug} declares invalid API contract.`);for(let i of [...a.contracts?.publishes||[],...a.contracts?.consumes||[]])i.trim()||s.push(`Project ${a.slug} declares an empty event contract.`);for(let i of a.contracts?.env||[])/^[A-Z_][A-Z0-9_]*$/.test(i)||s.push(`Project ${a.slug} declares invalid env contract: ${i}.`);for(let i of a.contracts?.dependsOn||[])d.has(i);}for(let a of n.projects||[])for(let i of a.contracts?.dependsOn||[])d.has(i)||s.push(`Project ${a.slug} depends on unknown project: ${i}.`);c.push({id:"schema",status:n.kind==="rapidkit.workspace.contract"&&n.schemaVersion===v?"passed":"failed",message:"Contract schema and kind are valid."}),c.push({id:"projects",status:Array.isArray(n.projects)?"passed":"failed",message:`Contract declares ${Array.isArray(n.projects)?n.projects.length:0} project(s).`}),c.push({id:"ports",status:s.some(a=>a.toLowerCase().includes("port"))?"failed":"passed",message:"Project port declarations are valid and collision-free."}),c.push({id:"dependencies",status:s.some(a=>a.includes("depends on unknown project"))?"failed":"passed",message:"Project dependencies point to known project slugs."}),c.push({id:"contracts",status:s.some(a=>a.includes("unsafe relativePath")||a.includes("invalid API contract")||a.includes("event contract")||a.includes("env contract"))?"failed":"passed",message:"Project path, API, event, and env contracts are valid."});let u=await l(e.workspacePath);if(u.moduleCount>0){for(let a of u.issues)s.push(`${m.basename(a.projectRoot)}: ${a.message} (slug=${a.slug})`);c.push({id:"module-paths",status:u.status,message:u.status==="passed"?`All ${u.moduleCount} registered module(s) resolve under canonical paths.`:`${u.issues.length} registered module(s) missing canonical install paths.`});}else e.strict&&c.push({id:"module-paths",status:"passed",message:"No registry-backed modules declared in workspace projects."});return {status:s.length>0?"failed":"passed",contractPath:o,projectCount:Array.isArray(n.projects)?n.projects.length:0,checks:c,violations:s}}async function $e(e){let t=m.resolve(e.workspacePath),o={schemaVersion:se,generatedAt:e.generatedAt??new Date().toISOString(),status:e.result.status,contractPath:e.result.contractPath,projectCount:e.result.projectCount,checks:e.result.checks,violations:e.result.violations};return e$1(t,ae,M(o))}
|
|
2
|
+
export{M as a,be as b,L as c,C as d,ae as e,v as f,se as g,j as h,de as i,Q as j,Te as k,Ve as l,ee as m,Ke as n,te as o,$e as p};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {a as a$1}from'./chunk-
|
|
1
|
+
import {a as a$1}from'./chunk-LNRAB7UY.js';var r=".workspai/skills";var e=a$1.skillsIndex,a=a$1.explain,_=".workspai/reports/workspace-why-last-run.json",c=".workspai/reports/workspace-trace-last-run.json",O=".workspai/AGENT-GROUNDING.md",P=".rapidkit/AGENT-GROUNDING.md",I=".cursor/rules/workspai-grounding.mdc",A=".cursor/rules/rapidkit-grounding.mdc",T=".claude/rules/workspai-evidence.md",E=".claude/rules/rapidkit-evidence.md",R=".github/instructions/workspai-workspace.instructions.md",L=".github/instructions/rapidkit-workspace.instructions.md",d=".github/instructions/workspai-evidence.instructions.md",S=".github/instructions/rapidkit-evidence.instructions.md",C=".github/prompts/workspai-diagnose.prompt.md",k=".github/prompts/rapidkit-diagnose.prompt.md",l=".github/prompts/workspai-repair.prompt.md",m=".github/prompts/rapidkit-repair.prompt.md",N=".github/prompts/workspai-release-readiness.prompt.md",u=".github/prompts/rapidkit-release-readiness.prompt.md",g=".github/prompts/workspai-project-onboard.prompt.md",K=".github/prompts/rapidkit-project-onboard.prompt.md",G=".github/prompts/workspai-adopt-project.prompt.md",w=".github/prompts/rapidkit-adopt-project.prompt.md",x=".github/skills/workspai-grounding/SKILL.md",H=".github/skills/rapidkit-grounding/SKILL.md",D=".github/skills/workspai-workspace-intelligence/SKILL.md",W=".github/skills/rapidkit-workspace-intelligence/SKILL.md",h=".workspai/reports/workspai-mcp-design.json",U=".workspai/reports/rapidkit-mcp-design.json",b=".vscode/workspai-agent-hooks.json",Y=".vscode/rapidkit-agent-hooks.json";function M(t){let s=t.trim();if(!s||s.includes("..")||s.includes("/"))throw new Error(`Invalid operational skill id: ${t}`);return `${r}/${s}.md`}var f={"workspai-diagnose-api-failure":"workspai-diagnose","workspai-release-readiness":"workspai-release-readiness","workspai-safe-schema-migration":"workspai-safe-schema-migration","workspai-dependency-upgrade":"workspai-dependency-upgrade","workspai-rename-contract":"workspai-rename-contract"};export{H as A,D as B,W as C,h as D,U as E,b as F,Y as G,M as H,f as I,r as a,e as b,a as c,_ as d,c as e,O as f,P as g,I as h,A as i,T as j,E as k,R as l,L as m,d as n,S as o,C as p,k as q,l as r,m as s,N as t,u,g as v,K as w,G as x,w as y,x as z};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {b}from'./chunk-YCL3I2JO.js';import {r,s}from'./chunk-5XATWNME.js';import c from'path';import {randomUUID}from'crypto';import {open}from'fs/promises';import i from'fs-extra';function x(e,t){let s=c.resolve(e),r=t.trim();if(!r||c.isAbsolute(r))throw new Error(`Workspace artifact path must be non-empty and relative: ${t}`);let l=c.resolve(s,r),a=c.relative(s,l);if(a===".."||a.startsWith(`..${c.sep}`)||c.isAbsolute(a))throw new Error(`Workspace artifact path escapes workspace root: ${t}`);return l}function p(e,t){return x(e,r(t))}function $(e,t){return x(e,s(t))}async function W(e,t){let s=c.resolve(e);await i.ensureDir(s);let r=c.dirname(t);await i.ensureDir(r);let[l,a]=await Promise.all([i.realpath(s),i.realpath(r)]),o=c.relative(l,a);if(o===".."||o.startsWith(`..${c.sep}`)||c.isAbsolute(o))throw new Error(`Workspace artifact parent resolves outside workspace root: ${r}`)}async function M(e,t){let s=c.resolve(e),[r,l]=await Promise.all([i.realpath(s),i.realpath(t)]),a=c.relative(r,l);if(a===".."||a.startsWith(`..${c.sep}`)||c.isAbsolute(a))throw new Error(`Workspace artifact resolves outside workspace root: ${t}`)}function R(e){let t=e?.code;return process.platform==="win32"&&(t==="EPERM"||t==="EINVAL"||t==="ENOSYS")}async function T(e){try{await e.sync();}catch(t){if(!R(t))throw t}}async function y(e,t,s){await W(e,t);let r=c.dirname(t),l=`${c.basename(t)}.`,a=Date.now();for(let w of await i.readdir(r)){if(!w.startsWith(l)||!w.endsWith(".tmp"))continue;let f=c.join(r,w),n=await i.stat(f).catch(()=>null);n&&a-n.mtimeMs>3e4&&await i.remove(f).catch(()=>{});}let o=`${t}.${process.pid}.${randomUUID()}.tmp`;try{await s(o);let w=await open(o,"r");try{await T(w);}finally{await w.close();}let f=Number(process.env.WORKSPAI_TEST_ATOMIC_WRITE_DELAY_MS??0);Number.isFinite(f)&&f>0&&await new Promise(n=>setTimeout(n,Math.min(f,3e4)));try{await i.rename(o,t);}catch(n){let d=n.code;if(d!=="EEXIST"&&d!=="EPERM")throw n;await i.move(o,t,{overwrite:true});}}finally{await i.remove(o).catch(()=>{});}}async function _(e,t,s,r={}){let l=p(e,t);await W(e,l);let a=`${l}.lock`,o=r.timeoutMs??1e4,w=r.staleAfterMs??3e4,f=Date.now(),n;for(;!n;)try{n=await open(a,"wx"),await n.writeFile(`${JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()})}
|
|
2
|
+
`),await T(n);}catch(d){if(d.code!=="EEXIST")throw n&&(await n.close().catch(()=>{}),n=void 0,await i.remove(a).catch(()=>{})),d;let[A,S]=await Promise.all([i.stat(a).catch(()=>null),i.readJson(a).catch(()=>null)]),u=Number(S?.pid),m=Number.isInteger(u)&&u>0,h=false;if(m)try{process.kill(u,0),h=true;}catch(g){h=g.code==="EPERM";}let I=!m&&!!(A&&Date.now()-A.mtimeMs>w);if(m&&!h||I){await i.remove(a).catch(()=>{});continue}if(Date.now()-f>=o)throw new Error(`Timed out waiting for workspace artifact lock: ${t}`);await new Promise(g=>setTimeout(g,20));}try{return await s()}finally{await n.close().catch(()=>{}),await i.remove(a).catch(()=>{});}}async function z(e,t){let s=[p(e,t),$(e,t)];for(let r of s)if(await i.pathExists(r))return await M(e,r),r;return null}async function B(e,t,s){b(t,s);let r=p(e,t);return await y(e,r,l=>i.writeJson(l,s,{spaces:2})),r}async function H(e,t,s){if(s.length===0)return [];let r=s.map(a=>({...a,path:p(e,a.relativePath)})),l=r.find((a,o)=>r.findIndex(w=>w.path===a.path)!==o);if(l)throw new Error(`Duplicate workspace artifact transaction target: ${l.relativePath}`);for(let a of r)b(a.relativePath,a.payload);return _(e,t,async()=>{let a=await Promise.all(r.map(async o=>({path:o.path,exists:await i.pathExists(o.path),contents:await i.readFile(o.path).catch(()=>null)})));try{for(let o=0;o<r.length;o+=1){let w=r[o];await y(e,w.path,n=>i.writeJson(n,w.payload,{spaces:2}));let f=Number(process.env.WORKSPAI_TEST_FAIL_ARTIFACT_SET_AFTER??0);if(Number.isInteger(f)&&f===o+1)throw new Error(`Injected artifact-set failure after ${f} write(s).`)}return r.map(o=>o.path)}catch(o){let f=(await Promise.allSettled(a.map(async n=>{if(!n.exists||n.contents===null){await i.remove(n.path);return}await y(e,n.path,d=>i.writeFile(d,n.contents));}))).filter(n=>n.status==="rejected");throw f.length>0?new AggregateError([o,...f.map(n=>n.reason)],"Workspace artifact transaction failed and rollback was incomplete."):o}})}export{p as a,$ as b,_ as c,z as d,B as e,H as f};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import {f as f$1,e}from'./chunk-T3GJ7YVG.js';import {a,b}from'./chunk-22DT744Z.js';import {i,j,l as l$1,k,n}from'./chunk-TWNFECMN.js';import {a as a$2,e as e$1}from'./chunk-2TEDAKP6.js';import {c}from'./chunk-U5EZHZBX.js';import {b as b$2}from'./chunk-YCL3I2JO.js';import {b as b$1,a as a$1}from'./chunk-LNRAB7UY.js';import {o}from'./chunk-5XATWNME.js';import d from'chalk';import l from'fs';import p from'path';var J=a$1.readiness,F=b$1.readiness;function M(t,e){let a=p.resolve(t);if(!b(a))return a;let s=z(e,"workspace.contract.json");if(l.existsSync(s))try{let o=JSON.parse(l.readFileSync(s,"utf-8")),n=Array.isArray(o.projects)?o.projects:[];for(let r of n){let u=f(r),v=typeof u.relativePath=="string"?u.relativePath.trim():"";if(v)return p.join(e,v)}}catch{}let i=D(e),c=Array.isArray(i.payload?.projects)?i.payload.projects:[];for(let o of c){let n=f(o),r=typeof n.path=="string"?n.path.trim():"";if(r)return p.resolve(r)}return a}function T(t){let e=i(t);return j(e,t)?"go":l$1(e,t)?"java":k(e,t)?"node":n(e,t)?"python":"unknown"}function W(t,e){if(!l.existsSync(t))return null;let a=l.readdirSync(t).filter(s=>s.endsWith(".json")&&e.some(i=>i.test(s))).map(s=>p.join(t,s));return a.length===0?null:(a.sort((s,i)=>l.statSync(i).mtimeMs-l.statSync(s).mtimeMs),a[0])}function f(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function L(t){for(let e of t)if(l.existsSync(e))return e;return null}function z(t,...e){let a=o(t,...e);return L(a)??a[0]}function S(t,e){let a=a$2(t,`.workspai/reports/${e}`);return L([a,p.join(t,".rapidkit","reports",e)])??a}async function H(t){let{readWorkspaceRegistrySummary:e,resolveWorkspaceRegisteredProjects:a}=await import('./workspace-registry-summary-A3YDL63D.js'),s=await e(t);return s?s.projectCount:(await a(t)).summary.projectCount}function K(t,e,a){let s=z(t,"toolchain.lock");if(!l.existsSync(s))return {gate:"env",status:"fail",summary:"toolchain.lock is missing",details:["Run workspai bootstrap to pin runtime versions and generate a reproducible toolchain."],evidencePath:s};try{let i=JSON.parse(l.readFileSync(s,"utf-8")),c=f(i.runtime),n=["python","node","go","java"].filter(r=>{let u=f(c[r]);return typeof u.version=="string"&&u.version.trim().length>0});if(n.length===0)return {gate:"env",status:"fail",summary:"No runtime versions are pinned in toolchain.lock",details:["Pin at least one runtime version via workspai setup <runtime> and re-run bootstrap."],evidencePath:s};if(e!=="unknown"){let r=f(c[e]);if(typeof r.version!="string"||r.version.trim().length===0)return {gate:"env",status:"fail",summary:`${a?.hasRegisteredProjects?"Project runtime":"Workspace"} (${e}) is not pinned in toolchain.lock`,details:[`Run workspai setup ${e} and workspai bootstrap to lock ${e} for this workspace.`],evidencePath:s}}return {gate:"env",status:"pass",summary:`Pinned runtimes: ${n.join(", ")}`,details:[],evidencePath:s}}catch{return {gate:"env",status:"fail",summary:"toolchain.lock is invalid JSON",details:["Regenerate lockfile with workspai bootstrap."],evidencePath:s}}}function D(t){let e=S(t,"doctor-last-run.json");if(!l.existsSync(e))return {payload:null,path:e};try{let a=JSON.parse(l.readFileSync(e,"utf-8"));return c(a,"workspace")?{payload:a,path:e}:{payload:null,path:e}}catch{return {payload:null,path:e}}}function B(t){let e=D(t);if(!e.payload)return {gate:{gate:"doctor",status:"fail",summary:"Doctor evidence is missing",details:["Run workspai doctor workspace --json before release readiness checks."],evidencePath:e.path},payload:null};let a=f(e.payload.summary),s=Number(a.totalIssues??0);return a.hasSystemErrors?{gate:{gate:"doctor",status:"fail",summary:"Doctor reported system errors",details:["Resolve system-level doctor errors before proceeding."],evidencePath:e.path},payload:e.payload}:s>0?{gate:{gate:"doctor",status:"warn",summary:`Doctor found ${s} issue(s)`,details:["Run workspai doctor workspace --fix and re-run readiness checks."],evidencePath:e.path},payload:e.payload}:{gate:{gate:"doctor",status:"pass",summary:"Doctor checks passed without issues",details:[],evidencePath:e.path},payload:e.payload}}function U(t){let e=S(t,"analyze-last-run.json");if(!l.existsSync(e))return {gate:"analyze",status:"fail",summary:"Analyze evidence is missing",details:["Run workspai analyze --json before release readiness checks."],evidencePath:e};try{let a=JSON.parse(l.readFileSync(e,"utf-8"));b$2(a$1.analyze,a,e);let s=f(a.summary),i=String(s.verdict??"").toLowerCase(),c=Number(s.score??0),o=f(s.findings),n=Number(o.fail??0);return i==="blocked"||n>0?{gate:"analyze",status:"fail",summary:`Analyze verdict is blocked (score ${c}/100)`,details:["Resolve analyze findings and regenerate analyze-last-run.json."],evidencePath:e}:i==="needs-attention"?{gate:"analyze",status:"warn",summary:`Analyze needs attention (score ${c}/100)`,details:["Review analyze warnings before release."],evidencePath:e}:{gate:"analyze",status:"pass",summary:`Analyze passed (score ${c}/100)`,details:[],evidencePath:e}}catch{return {gate:"analyze",status:"fail",summary:"Analyze evidence is invalid or violates its contract",details:["Re-run workspai analyze --json to regenerate evidence."],evidencePath:e}}}function q(t){try{let e=JSON.parse(l.readFileSync(t,"utf-8")),a=String(e.status??"").toLowerCase(),s=f(e.summary),i=Number(s.failedChecks??0);return a==="fail"||i>0?{gate:"verify",status:"fail",summary:"Verify-pack contract reports failed checks",details:["Fix failed verify checks and regenerate verify-pack contract evidence."],evidencePath:t}:a==="pass"?{gate:"verify",status:"pass",summary:"Verify-pack contract passed",details:[],evidencePath:t}:{gate:"verify",status:"warn",summary:"Verify-pack contract status is not explicit",details:["Ensure contract status is pass/fail and keep schema aligned with v1 contract."],evidencePath:t}}catch{return {gate:"verify",status:"fail",summary:"Verify-pack contract is invalid JSON",details:["Regenerate verify-pack contract artifact."],evidencePath:t}}}async function Q(t,e){if(e.skipVerify)return {gate:"verify",status:"pass",summary:"Verify gate skipped (--skip-verify)",details:["Verification was explicitly skipped for this readiness run."]};let a=[a$2(t,".workspai/reports"),p.join(t,".rapidkit","reports")],s=a[0],i=a.map(n=>W(n,[/verify-pack-contract/i,/^verify.*\.json$/i])).find(n=>typeof n=="string")??null;if(i)return q(i);let c=a$2(t,a$1.contractVerify),o=a.map(n=>W(n,[/workspace-contract-verify-last-run/i,/workspace-contract-verify/i])).find(n=>typeof n=="string")??null;if(o)try{let n=JSON.parse(l.readFileSync(o,"utf-8")),r=String(n.status??"").toLowerCase();if(r==="passed"||r==="pass")return {gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI cache)",details:[],evidencePath:o};if(r==="failed"||r==="fail")return {gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI cache)",details:(Array.isArray(n.violations)?n.violations:[]).slice(0,5),evidencePath:o}}catch{}try{let{verifyWorkspaceContract:n}=await import('./workspace-contract-RPQQBQXR.js'),r=await n({workspacePath:t}),u={schemaVersion:"v1",source:"cli",generatedAt:new Date().toISOString(),status:r.status,contractPath:r.contractPath,projectCount:r.projectCount,checks:r.checks,violations:r.violations};return await e$1(t,a$1.contractVerify,u),r.status==="failed"?{gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI)",details:r.violations.slice(0,5),evidencePath:c}:{gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI)",details:[],evidencePath:c}}catch(n){return {gate:"verify",status:"fail",summary:"No verify evidence and workspace contract verification unavailable",details:["Run workspai workspace contract verify --json or export verify-pack contract from CI.",n instanceof Error?n.message:String(n)],evidencePath:p.join(s,"*verify*.json")}}}function X(t,e){let a=S(e,"doctor-last-run.json");if(!t)return {gate:"dependency",status:"warn",summary:"Dependency risk check skipped (doctor evidence missing)",details:["Run workspai doctor workspace --json to include dependency findings."],evidencePath:a};let s=Array.isArray(t.projects)?t.projects:[],i=s.reduce((o,n)=>{let r=Number(n.vulnerabilities??0);return Number.isFinite(r)?o+Math.max(0,r):o},0),c=s.filter(o=>o.depsInstalled===false).length;return i>0?{gate:"dependency",status:"fail",summary:`${i} dependency vulnerability(ies) reported`,details:["Resolve vulnerabilities (npm/pip/go audit pipelines) before release."],evidencePath:a}:c>0?{gate:"dependency",status:"warn",summary:`${c} project(s) report missing dependencies`,details:["Run project init/bootstrap and regenerate doctor evidence."],evidencePath:a}:{gate:"dependency",status:"pass",summary:"No dependency vulnerabilities reported",details:[],evidencePath:a}}function Y(t){return t.some(e=>e.status==="fail")?"fail":t.some(e=>e.status==="warn")?"warn":"pass"}async function Z(t,e){return e$1(t,J,e)}async function ee(t={}){let e$1=p.resolve(t.startPath??process.cwd()),a$1=a(e$1)??e$1,s=await H(a$1)>0,i=s&&b(e$1)?a$1:M(e$1,a$1),c=i===a$1?"unknown":T(i),n=K(a$1,s?c:"unknown",{hasRegisteredProjects:s}),r=B(a$1),u=U(a$1),v=await Q(a$1,{skipVerify:t.skipVerify}),_=X(r.payload,a$1),R=[n,r.gate,u,v,_],k=Y(R),g={schemaVersion:F,generatedAt:new Date().toISOString(),workspacePath:a$1,projectPath:i,action:t.action,overallStatus:k,blocking:k==="fail",blockingReasons:R.filter(y=>y.status==="fail").map(y=>`${y.gate}: ${y.summary}`),gates:R};if(t.writeReport!==false){let y=f$1(g,{commandId:"workspaceReadiness",exitCode:k==="fail"?2:k==="warn"?1:0,generatedAt:g.generatedAt,blockers:g.blockingReasons,runId:e()});g.evidencePath=await Z(a$1,y);}return g}function te(t){return t==="pass"?d.green("PASS"):t==="warn"?d.yellow("WARN"):d.red("FAIL")}function ae(t){return t==="pass"?d.green("PASS"):t==="warn"?d.yellow("WARN"):d.red("FAIL")}async function me(t){let e=await ee({startPath:t.workspace,writeReport:true,skipVerify:t.skipVerify===true});if(t.json)console.log(JSON.stringify(e,null,2));else {console.log(d.bold.cyan(`
|
|
2
|
+
\u{1F6A6} Workspai Release Readiness
|
|
3
|
+
`)),console.log(d.bold(`Workspace: ${d.cyan(p.basename(e.workspacePath))}`)),console.log(d.gray(`Path: ${e.workspacePath}`)),console.log(`Overall: ${ae(e.overallStatus)}`);for(let a of e.gates){console.log(` - ${a.gate}: ${te(a.status)} ${a.summary}`);for(let s of a.details)console.log(d.gray(` ${s}`));a.evidencePath&&console.log(d.gray(` evidence: ${a.evidencePath}`));}e.evidencePath&&console.log(d.gray(`
|
|
4
|
+
Evidence saved: ${e.evidencePath}`));}t.strict&&e.overallStatus!=="pass"&&process.exit(1);}export{ee as a,me as b};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {d as d$1,c,e}from'./chunk-2TEDAKP6.js';import {b,a as a$1}from'./chunk-LNRAB7UY.js';import k from'fs-extra';var y=b.history,a=a$1.history,d=50;function A(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t;return typeof e.generatedAt!="string"?null:e.kind==="agent-action"?typeof e.actionId!="string"||typeof e.summary!="string"||e.outcome!=="ok"&&e.outcome!=="failed"?null:{kind:"agent-action",generatedAt:e.generatedAt,actionId:e.actionId,scope:typeof e.scope=="string"?e.scope:"workspace",summary:e.summary,outcome:e.outcome,...typeof e.evidenceSha256=="string"?{evidenceSha256:e.evidenceSha256}:{}}:e.kind==="doctor-fix"?e.scope!=="workspace"&&e.scope!=="project"||typeof e.summary!="string"||e.outcome!=="ok"&&e.outcome!=="failed"?null:{kind:"doctor-fix",generatedAt:e.generatedAt,scope:e.scope,summary:e.summary,outcome:e.outcome,applied:typeof e.applied=="number"?e.applied:0,failed:typeof e.failed=="number"?e.failed:0,skipped:typeof e.skipped=="number"?e.skipped:0,remainingBlockers:typeof e.remainingBlockers=="number"?e.remainingBlockers:0}:typeof e.verdict!="string"||typeof e.risk!="string"||typeof e.gatePassed!="boolean"?null:{kind:"verify",generatedAt:e.generatedAt,verdict:e.verdict,risk:String(e.risk),affectedProjects:typeof e.affectedProjects=="number"?e.affectedProjects:0,freshness:e.freshness??"unknown",gatePassed:e.gatePassed,blockingReasons:typeof e.blockingReasons=="number"?e.blockingReasons:0,policyViolations:typeof e.policyViolations=="number"?e.policyViolations:0}}function S(t,e){return {kind:"verify",generatedAt:t.generatedAt,verdict:t.summary.verdict,risk:t.impact.risk,affectedProjects:t.impact.affectedProjects,freshness:t.freshness.verdict,gatePassed:e,blockingReasons:t.blockingReasons.length,policyViolations:t.policyViolations.length}}function F(t){return {kind:"agent-action",generatedAt:t.generatedAt,actionId:t.actionId,scope:t.scope,summary:t.summary,outcome:t.outcome,...t.evidenceSha256?{evidenceSha256:t.evidenceSha256}:{}}}function V(t,e){let o=t.appliedFixes.filter(i=>i.outcome==="applied").length,r=t.appliedFixes.filter(i=>i.outcome==="failed").length,n=t.appliedFixes.filter(i=>i.outcome==="skipped").length,s=t.appliedFixes.filter(i=>i.outcome==="guidance").length,c=t.remainingBlockers.length,g=r>0||c>0?"failed":"ok";return {kind:"doctor-fix",generatedAt:t.generatedAt,scope:e,summary:`${o} applied, ${r} failed, ${n} skipped, ${s} guidance, ${c} blocker(s) remaining`,outcome:g,applied:o,failed:r,skipped:n,remainingBlockers:c}}async function E(t){let e=await d$1(t,a);try{if(!e||!await k.pathExists(e))return null;let o=await k.readJson(e);return o?.schemaVersion!==y||!Array.isArray(o.entries)?null:{schemaVersion:y,retention:typeof o.retention=="number"?o.retention:d,entries:o.entries.map(r=>A(r)).filter(r=>r!=null)}}catch{return null}}function x(t,e,o=d){let r=Math.max(1,Math.floor(o)),n=[...t?.entries??[],e],s=n.slice(Math.max(0,n.length-r));return {schemaVersion:y,retention:r,entries:s}}async function v(t,e$1,o){return c(t,a,async()=>{let r=await d$1(t,a),n=await E(t);if(r&&!n)throw new Error(`Workspace history is unreadable or invalid; refusing to overwrite: ${r}`);let s=x(n,e$1,o?.retention??d);return await e(t,a,s),s})}export{y as a,a as b,d as c,A as d,S as e,F as f,V as g,E as h,x as i,v as j};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {d as d$1,m}from'./chunk-22NJ2ZMG.js';import {d,e}from'./chunk-2TEDAKP6.js';import {a as a$1}from'./chunk-A5FBGRJA.js';import {o}from'./chunk-5XATWNME.js';import {r,p}from'./chunk-EYJ2CQSK.js';import a from'path';import {existsSync}from'fs';import u from'fs-extra';var f=".workspai/workspace-registry.v1.json",w="workspace-registry.v1";function x(r){return {slug:r.slug,relativePath:r.relativePath,framework:r.framework,kit:r.kit,source:r.source}}async function A(r){let e=o(r,"workspace.json").find(t=>existsSync(t));if(!e)return {exists:false,legacyProjectCount:0};try{let t=await u.readJson(e),c=Array.isArray(t.projects)?t.projects.length:0,o=typeof t.workspace_name=="string"&&t.workspace_name.trim()||typeof t.name=="string"&&t.name.trim()||a.basename(r);return {exists:true,manifestPath:e,workspaceName:o,profile:typeof t.profile=="string"?t.profile:void 0,legacyProjectCount:c}}catch{return {exists:true,manifestPath:e,legacyProjectCount:0,workspaceName:a.basename(r)}}}async function b(r$1){let e=a$1(r$1);for(let t of r())if(await u.pathExists(t))try{let o=((await u.readJson(t)).workspaces||[]).find(s=>a$1(s.path)===e);if(o)return {exists:true,projectCount:Array.isArray(o.projects)?o.projects.length:0,registryPath:t}}catch{continue}return {exists:false,projectCount:0,registryPath:a.join(p(),"workspaces.json")}}async function E(r,e){let t=a.resolve(r),c=await d(t,d$1),o=await A(t),s=await b(t),i=e?.contract!==void 0||!!c,n=[];if(e?.contract)n=e.contract.projects||[];else if(i)try{let{contract:d}=await m({workspacePath:t});n=d.projects||[];}catch{n=[];}let S={contract:{exists:i,projectCount:n.length,path:d$1},globalRegistry:{exists:s.exists,projectCount:s.projectCount,path:s.registryPath},legacyWorkspaceJson:{exists:o.exists,projectCount:o.legacyProjectCount,path:o.manifestPath?a.relative(t,o.manifestPath):void 0}},p="none",m$1=[],y=0;return i?(p="workspace.contract.json",m$1=n.map(x),y=m$1.length):s.projectCount>0?(p="global-registry",y=s.projectCount):o.legacyProjectCount>0&&(p="legacy-workspace.json",y=o.legacyProjectCount),{contractExists:i,summary:{schemaVersion:w,kind:"rapidkit.workspace.registry",workspacePath:t,workspaceName:o.workspaceName||a.basename(t),profile:o.profile,projectCount:y,authority:p,contractPath:d$1,projects:m$1,sources:S}}}async function Y(r){let e=await d(r,f);if(!e)return null;try{let t=await u.readJson(e);return t?.schemaVersion!==w?null:t}catch{return null}}async function D(r,e$1){let t=await _(r,e$1);return await e(r,f,t),t}async function _(r,e){return {...(await E(r,{contract:e?.contract})).summary,generatedAt:(e?.now??new Date).toISOString(),registrySummaryPath:f}}function H(r,e=""){return r.projectCount>0?r.authority==="workspace.contract.json"?`${r.projectCount} project(s) registered in workspace contract${e}.`:r.authority==="global-registry"?`${r.projectCount} project(s) registered in global workspace registry${e}.`:`${r.projectCount} project(s) registered in legacy workspace manifest${e}.`:`Workspace state exists, but no projects are registered yet${e}.`}export{f as a,w as b,E as c,Y as d,D as e,_ as f,H as g};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {f as f$1,e as e$2
|
|
1
|
+
import {f as f$1,e as e$2}from'./chunk-SK6XRKGG.js';import {b as b$3}from'./chunk-NHN4QXPP.js';import {b as b$6,a as a$3}from'./chunk-THIOE2PB.js';import {e,g,f as f$2,b as b$5,c as c$3,d as d$2}from'./chunk-MER6ZBN2.js';import {a as a$2}from'./chunk-7VLCK5JW.js';import {d as d$3}from'./chunk-22NJ2ZMG.js';import {d,b as b$2}from'./chunk-GSWPGELT.js';import {c}from'./chunk-Y45WZR5N.js';import {f,c as c$2,e as e$3}from'./chunk-7YHK5NM3.js';import {a as a$1}from'./chunk-TQEMLBAG.js';import {b as b$1,a,c as c$1,d as d$1}from'./chunk-5XATWNME.js';import {b as b$4,j,i,l,h,s,r,p as p$1}from'./chunk-EYJ2CQSK.js';import {promises}from'fs';import*as b from'fs-extra';import p from'path';import e$1 from'chalk';import {execa}from'execa';async function G(t,o={}){let n=p.resolve(t),s=o.workspaceName??p.basename(n),{registerWorkspaceStrict:a}=await import('./workspace-H3QXBFGB.js');await a(n,s);let{syncWorkspaceContract:l}=await import('./workspace-contract-RPQQBQXR.js'),d=await l({workspacePath:n,strict:true});o.silent||console.log(e$1.gray(`\u2139\uFE0F Workspace intelligence synced (contract + registry summary, ${d.contract.projects.length} project(s)).`));}function N(){return h()}var st="transactions";function lt(){return p.join(p$1(),st)}async function Fe(){let t=lt();return await b$6(t),a$3({journalDirectory:t})}async function Le(t){for(let o of r())await t.captureFile(o);}async function ie(t){let o=await Fe();try{return await Le(o),await o.captureOwnedTree(t),o}catch(n){return F(o,n)}}async function ct(t){let o=await Fe();try{await Le(o),await o.captureOwnedTree(p.join(t,a)),await o.captureOwnedTree(p.join(t,".venv"));let n=[c$1,".gitignore",p.join(a,"workspace.json"),p.join(a,"toolchain.lock"),p.join(a,"policies.yml"),p.join(a,"cache-config.yml"),d$3,a$2,"pyproject.toml","poetry.toml","poetry.lock","rapidkit","rapidkit.cmd","README.md",".rapidkit-global"];for(let s of n)await o.captureFile(p.join(t,s));return o}catch(n){return F(o,n)}}async function B(t){await t.commit(),t.journalPath&&await promises.rm(p.dirname(t.journalPath),{recursive:true,force:true}).catch(o=>f.debug(`Could not remove committed lifecycle journal: ${o}`));}async function F(t,o){try{await t.rollback();}catch(n){throw new AggregateError([o,n],"Workspace lifecycle failed and rollback was incomplete.")}throw o}async function J(t,o,n,s,a){let l=d(o,c(),n,a?.pythonEngine?{coreStatus:a.pythonEngine,...a.pythonEngineReason?{coreReason:a.pythonEngineReason}:{},...s?{pythonVersion:s}:{}}:void 0);s&&!a?.pythonEngine&&(l.metadata||(l.metadata={}),l.metadata.python={pythonVersion:s}),await b$2(t,l);}async function U(t){await b.outputFile(p.join(t,".gitignore"),`.venv/
|
|
2
2
|
__pycache__/
|
|
3
3
|
*.pyc
|
|
4
4
|
.env
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {a}from'./chunk-HTYMXMQM.js';import {d,c,b as b$1}from'./chunk-22NJ2ZMG.js';import l from'path';import h from'fs-extra';import V from'crypto';var he="rapidkit-freshness-metadata-v1";function v(e){if(Array.isArray(e))return e.map(o=>v(o));if(e&&typeof e=="object"){let o={};for(let n of Object.keys(e).sort())o[n]=v(e[n]);return o}return e}function B(e){return JSON.stringify(v(e))}function D(e){return V.createHash("sha256").update(B(e)).digest("hex")}var b=".workspai/workspace-graph.overrides.json",z=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),L=new Set([".git",".hg",".svn",".workspai",".rapidkit",".venv","node_modules","dist","build","out","target","coverage","htmlcov",".next",".turbo",".cache"]),O=600,A=5,J=256*1024,R={inferred:1,contract:2,manual:3};function X(e){return e.split(l.sep).join("/")}function y(e,o){return X(l.relative(e,o)||".")}function M(e){let o=new Map;for(let n of e.projects)o.has(n.name)||o.set(n.name,{id:n.name,path:n.path,...n.runtime?{runtime:n.runtime}:{},...n.framework?{framework:n.framework}:{},...n.kind?{kind:n.kind}:{}});return [...o.values()].sort((n,r)=>n.id.localeCompare(r.id))}function N(e,o){let n=new Map,r=new Map;for(let t of o.projects){if(n.has(t.name))continue;let i=t.absolutePath?l.resolve(t.absolutePath):l.resolve(e,t.path);n.set(t.name,i),r.has(i)||r.set(i,t.name);}let s=[...r.entries()].map(([t,i])=>({dir:t,id:i})).sort((t,i)=>i.dir.length-t.dir.length||t.dir.localeCompare(i.dir));return {idToDir:n,dirToId:r,sortedDirs:s}}function k(e,o){let n=l.resolve(o);for(let{dir:r,id:s}of e.sortedDirs)if(n===r||n.startsWith(`${r}${l.sep}`))return s;return null}async function G(e){try{if(!await h.pathExists(e))return null;let o=await h.readJSON(e);return o&&typeof o=="object"&&!Array.isArray(o)?o:null}catch{return null}}async function j(e){try{return await h.pathExists(e)?await h.readFile(e,"utf8"):null}catch{return null}}async function _(e,o){let n=[],r=new Map;for(let[s,t]of o.idToDir.entries()){let i=await G(l.join(t,"package.json")),c=typeof i?.name=="string"?i.name.trim():"";c&&!r.has(c)&&r.set(c,s);}for(let[s,t]of o.idToDir.entries()){let i=await G(l.join(t,"package.json"));if(i){let c=["dependencies","devDependencies","peerDependencies","optionalDependencies"],a=new Set;for(let d of c){let p=i[d];if(!(!p||typeof p!="object"||Array.isArray(p)))for(let f of Object.keys(p)){let u=r.get(f);!u||u===s||a.has(u)||(a.add(u),n.push({from:s,to:u,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:y(e,l.join(t,"package.json")),detail:`declares dependency ${f}`}]}));}}}n.push(...await Y(e,o,s,t)),n.push(...await q(e,o,s,t));}return n}async function Y(e,o,n,r){let s=await j(l.join(r,"pyproject.toml"));if(!s)return [];let t=[],i=new Set,c=/path\s*=\s*["']([^"']+)["']/g,a;for(;(a=c.exec(s))!==null;){let d=k(o,l.resolve(r,a[1]));!d||d===n||i.has(d)||(i.add(d),t.push({from:n,to:d,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:y(e,l.join(r,"pyproject.toml")),detail:`path dependency ${a[1]}`}]}));}return t}async function q(e,o,n,r){let s=await j(l.join(r,"go.mod"));if(!s)return [];let t=[],i=new Set,c=/replace\s+\S+\s+=>\s+(\.[^\s]+)/g,a;for(;(a=c.exec(s))!==null;){let d=k(o,l.resolve(r,a[1]));!d||d===n||i.has(d)||(i.add(d),t.push({from:n,to:d,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:y(e,l.join(r,"go.mod")),detail:`go.mod replace ${a[1]}`}]}));}return t}async function U(e,o){let n=[],r=[e];for(;r.length>0&&n.length<o;){let s=r.shift();if(!s)continue;let t=[];try{t=await h.readdir(s,{withFileTypes:true});}catch{continue}let i=[],c=[];for(let a of t)if(a.isDirectory()){if(L.has(a.name)||a.name.startsWith("."))continue;i.push(l.join(s,a.name));}else a.isFile()&&z.has(l.extname(a.name))&&c.push(l.join(s,a.name));c.sort((a,d)=>a.localeCompare(d)),i.sort((a,d)=>a.localeCompare(d));for(let a of c){if(n.length>=o)break;n.push(a);}r.push(...i);}return n}var Q=[/\bfrom\s+["']([^"']+)["']/g,/\bimport\s+["']([^"']+)["']/g,/\bimport\s*\(\s*["']([^"']+)["']\s*\)/g,/\brequire\s*\(\s*["']([^"']+)["']\s*\)/g];function Z(e){let o=new Set;for(let n of Q){n.lastIndex=0;let r;for(;(r=n.exec(e))!==null;){let s=r[1];s.startsWith(".")&&o.add(s);}}return [...o]}async function P(e,o,n,r){let s=new Map;for(let[t,i]of o.idToDir.entries()){if(r&&!r.has(t))continue;let c=await U(i,n);for(let a of c){let d=await h.stat(a).catch(()=>null);if(!d||d.size>J)continue;let p=await j(a);if(p)for(let f of Z(p)){let u=l.resolve(l.dirname(a),f),g=k(o,u);if(!g||g===t)continue;let I=`${t}\0${g}`,m=s.get(I);m||(m={from:t,to:g,evidence:[]},s.set(I,m)),m.evidence.length<A&&m.evidence.push({file:y(e,a),detail:`imports ${f}`});}}}return [...s.values()].map(t=>({from:t.from,to:t.to,kind:"code-import",source:"inferred",confidence:"medium",evidence:t.evidence}))}function ee(e,o,n){let r=new Map;for(let s of n.projects){let t=ne(e,o,s);t&&r.set(s.slug,t);}return r}function ne(e,o,n){let r=[n.relativePath,n.externalPath].filter(s=>typeof s=="string"&&s.length>0);for(let s of r){let t=l.resolve(e,s),i=o.dirToId.get(t)??k(o,t);if(i)return i}return o.idToDir.has(n.slug)?n.slug:null}function T(e,o,n){let r=[],s=ee(e,o,n),t=d,i=new Map,c=new Map;for(let a of n.projects){let d=s.get(a.slug);if(!d)continue;let p=a.contracts??{publishes:[],consumes:[],dependsOn:[]};for(let f of p.dependsOn??[]){let u=s.get(f);!u||u===d||r.push({from:d,to:u,kind:"service-dependsOn",source:"contract",confidence:"high",evidence:[{file:t,detail:`dependsOn ${f}`}]});}for(let f of p.publishes??[])i.has(f)||i.set(f,new Set),i.get(f)?.add(d);for(let f of p.consumes??[])c.has(f)||c.set(f,new Set),c.get(f)?.add(d);}for(let[a,d]of i.entries()){let p=c.get(a);if(p)for(let f of p)for(let u of d)f!==u&&r.push({from:f,to:u,kind:"event-pub-sub",source:"contract",confidence:"high",evidence:[{file:t,detail:`consumes event ${a}`}]});}return r.push(...te(n,s)),r}function C(e){return e.toLowerCase().replace(/[^a-z0-9]/g,"")}function te(e,o){let n=[],r=e.projects.map(s=>({project:s,id:o.get(s.slug)})).filter(s=>!!s.id).filter(s=>C(s.project.slug).length>=3);for(let s of e.projects){let t=o.get(s.slug);if(!t)continue;let i=s.contracts?.env??[];if(i.length===0)continue;let c=new Set;for(let a of i){let d$1=C(a);for(let p of r)p.id===t||c.has(p.id)||!(d$1.includes(C(p.project.slug))&&(p.project.ports?.length??0)>0)||(c.add(p.id),n.push({from:t,to:p.id,kind:"shared-resource",source:"inferred",confidence:"low",evidence:[{file:d,detail:`env ${a} references ${p.project.slug}`}]}));}}return n}async function F(e,o){let n=await G(l.join(e,b)),r=Array.isArray(n?.edges)?n?.edges:[],s=[],t=new Set(c);for(let i of r){if(!i||typeof i!="object"||Array.isArray(i))continue;let c=i,a=typeof c.from=="string"?c.from:"",d=typeof c.to=="string"?c.to:"",p=typeof c.kind=="string"?c.kind:"";if(!o.has(a)||!o.has(d)||a===d||!t.has(p))continue;let f=Array.isArray(c.evidence)?c.evidence.map(u=>u&&typeof u=="object"&&typeof u.file=="string"?{file:u.file,...typeof u.detail=="string"?{detail:u.detail}:{}}:null).filter(u=>!!u):[];s.push({from:a,to:d,kind:p,source:"manual",confidence:"high",evidence:f.length>0?f:[{file:b,detail:"manual edge"}]});}return s}function re(e){return `${e.from}\0${e.to}\0${e.kind}`}function oe(e){let o=new Set,n=[];for(let r of e){let s=`${r.file}\0${r.detail??""}`;o.has(s)||(o.add(s),n.push(r));}return n.sort((r,s)=>r.file.localeCompare(s.file)||(r.detail??"").localeCompare(s.detail??"")).slice(0,A)}function se(e){let o=new Map;for(let n of e){let r=re(n),s=o.get(r);if(!s){o.set(r,{...n,evidence:[...n.evidence]});continue}let t=R[s.source],i=R[n.source];i>t?o.set(r,{...n,evidence:[...n.evidence,...s.evidence]}):i===t&&s.evidence.push(...n.evidence);}return [...o.values()].map(n=>({from:n.from,to:n.to,kind:n.kind,source:n.source,confidence:n.confidence,evidence:oe(n.evidence)})).sort((n,r)=>n.from.localeCompare(r.from)||n.to.localeCompare(r.to)||n.kind.localeCompare(r.kind)||n.source.localeCompare(r.source))}function W(e){return Math.round(e*1e3)/1e3}function ie(e){return Math.max(0,Math.min(100,Math.round(e)))}function ae(e){return e>=75?"critical":e>=50?"high":e>=20?"medium":"low"}function ce(e){return e==="critical"||e==="high"?"strict":e==="medium"?"elevated":"normal"}function de(e,o){let n=a({nodes:e,edges:o}),r=new Map;for(let s of e){let t=n.byId.get(s.id)??{fanIn:0,fanOut:0,reach:0,betweenness:0,isHotspot:false},i=o.filter(g=>g.from===s.id||g.to===s.id),c=i.filter(g=>g.source==="contract"||g.source==="manual").length,a=i.filter(g=>g.confidence==="low").length,d=[],p=t.reach*20+t.fanIn*14+t.fanOut*8+Math.min(20,t.betweenness*4)+c*8;t.isHotspot&&(p+=24,d.push("Critical-path hotspot in dependency graph")),t.reach>0&&d.push(`Change reaches ${t.reach} dependent project(s)`),t.fanIn>0&&d.push(`${t.fanIn} direct dependent project(s)`),t.fanOut>0&&d.push(`${t.fanOut} direct dependency project(s)`),c>0&&d.push(`${c} contract/manual edge(s)`),a>0&&d.push(`${a} low-confidence inferred edge(s) need review`),i.length===0&&d.push("No dependency evidence connected to this project yet");let f=ie(p),u=ae(f);r.set(s.id,{weight:u,score:f,verificationPriority:ce(u),reasons:d.slice(0,5),centrality:{fanIn:t.fanIn,fanOut:t.fanOut,reach:t.reach,betweenness:t.betweenness,isHotspot:t.isHotspot}});}return r}function pe(e,o){let n=de(e,o);return e.map(r=>({...r,operationalProfile:n.get(r.id)}))}function ue(e,o){let n=new Set;for(let a of o)n.add(a.from),n.add(a.to);let r=e.length,s=o.length,t=e.filter(a=>n.has(a.id)).length,i=Math.max(0,r-t),c=a({nodes:e,edges:o});return {nodeCount:r,edgeCount:s,inferredEdges:o.filter(a=>a.source==="inferred").length,contractEdges:o.filter(a=>a.source==="contract").length,manualEdges:o.filter(a=>a.source==="manual").length,authoritativeEdges:o.filter(a=>a.source==="contract"||a.source==="manual").length,lowConfidenceEdges:o.filter(a=>a.confidence==="low").length,orphanCount:i,connectedNodeCount:t,density:W(r>1?s/(r*(r-1)):0),edgeCoverageRatio:W(r>0?t/r:1),evidenceCoverageRatio:W(s>0?o.filter(a=>a.evidence.length>0).length/s:1),hotspotCount:c.hotspots.length,hasCycle:le(e,o)}}function fe(e,o,n){let r=[],s=e.filter(t=>!o.some(i=>i.from===t.id||i.to===t.id)).map(t=>t.id).sort((t,i)=>t.localeCompare(i));return n.nodeCount===0&&r.push({code:"graph.empty",severity:"info",message:"Workspace model has no projects, so dependency reasoning is unavailable.",recommendation:"Import, scaffold, or register projects before relying on graph-aware impact."}),n.nodeCount>1&&n.edgeCount===0?r.push({code:"graph.edges.missing",severity:"warning",message:"Projects were detected, but no inter-project dependency edges were found.",recommendation:"Run graph explain, add workspace contract relationships, or define manual graph overrides for operational dependencies that code imports cannot reveal.",nodeIds:s}):n.orphanCount>0&&r.push({code:"graph.orphans.detected",severity:"warning",message:`${n.orphanCount} project(s) have no dependency evidence connected to the graph.`,recommendation:"Review isolated projects and add package, contract, or manual edges when they participate in release-critical flows.",nodeIds:s.slice(0,12)}),n.lowConfidenceEdges>0&&r.push({code:"graph.low_confidence_edges",severity:"info",message:`${n.lowConfidenceEdges} inferred edge(s) are low confidence.`,recommendation:"Promote important low-confidence relationships to workspace contract or manual overrides."}),n.edgeCount>0&&n.evidenceCoverageRatio<1&&r.push({code:"graph.evidence.partial",severity:"warning",message:"Some dependency edges do not include file-level evidence.",recommendation:"Attach evidence to manual overrides so agents can audit why a relationship exists."}),n.hasCycle&&r.push({code:"graph.cycle.detected",severity:"error",message:"The dependency graph contains at least one directed cycle.",recommendation:"Break the cycle or document the relationship explicitly before using graph-aware release gates."}),r.sort((t,i)=>{let c={error:0,warning:1,info:2};return c[t.severity]-c[i.severity]||t.code.localeCompare(i.code)})}function le(e,o){let n=new Map;for(let a of e)n.set(a.id,[]);for(let a of o)n.has(a.from)||n.set(a.from,[]),n.get(a.from)?.push(a.to);let r=0,s=1,t=2,i=new Map;for(let a of n.keys())i.set(a,r);let c=a=>{let d=[{id:a,index:0}];for(i.set(a,s);d.length>0;){let p=d[d.length-1],f=n.get(p.id)??[];if(p.index>=f.length){i.set(p.id,t),d.pop();continue}let u=f[p.index];p.index+=1;let g=i.get(u)??r;if(g===s)return true;g===r&&(i.set(u,s),d.push({id:u,index:0}));}return false};for(let a of [...n.keys()].sort())if(i.get(a)===r&&c(a))return true;return false}function Ge(e){return D({nodes:e.nodes,edges:e.edges,stats:e.stats})}function H(e,o,n,r){let s=se(n.filter(a=>o.has(a.from)&&o.has(a.to))),t=pe(e,s),i=ue(e,s),c=fe(e,s,i);return {schemaVersion:b$1,generatedAt:(r??new Date).toISOString(),nodes:t,edges:s,stats:i,...c.length>0?{diagnostics:c}:{}}}async function Pe(e){let o=l.resolve(e.workspacePath),n=e.maxImportFilesPerProject??O,r=M(e.model),s=new Set(r.map(c=>c.id)),t=N(o,e.model),i=[];return i.push(...await _(o,t)),i.push(...await P(o,t,n)),e.contract&&i.push(...T(o,t,e.contract)),i.push(...await F(o,s)),H(r,s,i,e.now)}async function je(e){let o=l.resolve(e.workspacePath),n=e.maxImportFilesPerProject??O,r=M(e.model),s=new Set(r.map(c=>c.id)),t=N(o,e.model),i=[];if(i.push(...await _(o,t)),e.structuralChange)i.push(...await P(o,t,n));else {i.push(...await P(o,t,n,e.changedProjectIds));for(let c of e.previousGraph.edges)c.kind==="code-import"&&c.source==="inferred"&&!e.changedProjectIds.has(c.from)&&s.has(c.from)&&s.has(c.to)&&i.push({from:c.from,to:c.to,kind:"code-import",source:"inferred",confidence:c.confidence,evidence:c.evidence});}return e.contract&&i.push(...T(o,t,e.contract)),i.push(...await F(o,s)),H(r,s,i,e.now)}export{he as a,D as b,b as c,le as d,Ge as e,Pe as f,je as g};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {f as f$1}from'./chunk-WDKNMTJQ.js';import a from'path';import b from'fs-extra';var f=4,y="workspace-graph-token-efficiency.v1";function g(e){return Math.ceil(e/f)}function v(e,o){if(!o||a.isAbsolute(o))return null;let r=a.resolve(e),i=a.resolve(r,o),t=a.relative(r,i);return !t||t.startsWith("..")||a.isAbsolute(t)?null:i}async function P(e){let o=a.resolve(e.workspacePath),r=f$1(e.graph,{query:e.query,...e.kind?{kind:e.kind}:{},limit:e.limit}),i=[...new Set(e.graph.proofs.map(s=>s.artifact))].sort(),t=[],u=0,d=0;for(let s of i){let m=v(o,s);if(!m){t.push(s);continue}try{let k=await b.readFile(m,"utf8");u+=k.length,d+=1;}catch{t.push(s);}}let l=JSON.stringify(r).length,n=g(u),c=g(l),h=Math.max(0,n-c);return {schemaVersion:y,generatedAt:(e.now??new Date).toISOString(),workspacePath:o,query:e.query,graph:{schemaVersion:e.graph.schemaVersion,sourceArtifact:e.graph.source.artifact,sourceHash:e.graph.source.hash,entityCount:e.graph.entities.length,relationCount:e.graph.relations.length,proofCount:e.graph.proofs.length},methodology:{id:"indexed-corpus-vs-bounded-retrieval.v1",estimated:true,charsPerToken:f,claimBoundary:"Measures retrieval payload reduction against readable proof-source text; it does not claim equivalent answer quality or model-specific billing savings."},corpus:{artifactCount:d,characterCount:u,estimatedTokens:n,unreadableArtifacts:t},retrieval:{matchCount:r.entities.length,characterCount:l,estimatedTokens:c,truncated:r.truncated,payload:r},savings:{estimatedTokensAvoided:h,reductionRatio:c===0?0:Number((n/c).toFixed(2)),reductionPercent:n===0?0:Number((h/n*100).toFixed(2))}}}export{y as a,P as b};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import {a as a$1}from'./chunk-JEI6BTZI.js';import {a}from'./chunk-HSGFUKCN.js';import {c,e,d}from'./chunk-2GHUZDYA.js';import {d as d$1,b}from'./chunk-ZM5NQ5Z2.js';import {g}from'./chunk-NOFM7MNA.js';import {k}from'./chunk-ZDN7RHXJ.js';import {m,a as a$2}from'./chunk-22NJ2ZMG.js';import {e as e$1}from'./chunk-2TEDAKP6.js';import {b as b$1}from'./chunk-YCL3I2JO.js';import {a as a$3}from'./chunk-KB44JP4M.js';import j from'path';import W from'fs-extra';function G(e$1){switch(e$1){case "why":return d;case "trace":return e;default:return c}}async function P(e,n,o){try{if(!await W.pathExists(e))return null;let r=await W.readJson(e);return n?b$1(n,r,e):o&&a$3(r,o,e),r}catch(r){if((n||o)&&await W.pathExists(e))throw r;return null}}function z(e,n){if(!e)return null;let o=n.trim().toLowerCase();return e.projects.find(r=>r.slug.toLowerCase()===o||r.relativePath.toLowerCase()===o)??null}function J(e,n,o){let r=o.trim().toLowerCase(),t=(e.graph?.nodes.map(a=>a.id)??e.projects.map(a=>a.name)).find(a=>a.toLowerCase()===r);if(t)return t;let d=e.projects.find(a=>[a.name,a.path,j.basename(a.path)].filter(u=>u.trim().length>0).some(u=>u.toLowerCase()===r));if(d)return d.name;let c=z(n,o);if(c){let a=e.projects.find(u=>u.path===c.relativePath||u.path.endsWith(`/${c.relativePath}`));if(a)return a.name}return o}function X(e,n){if(!e)return [];let o=n.trim().toLowerCase(),r=new Set;for(let l of e.projects){l.contracts.dependsOn?.some(t=>t.toLowerCase()===o)&&r.add(l.slug);for(let t of l.contracts.consumes??[])for(let d of e.projects)d.contracts.publishes?.includes(t)&&d.slug===o&&r.add(l.slug);}return [...r].sort()}function Y(e,n){if(!e)return [];let o=n.trim().toLowerCase();return e.steps.filter(r=>r.scope==="project"&&r.project?.toLowerCase()===o&&r.command?.display).map(r=>r.command.display).slice(0,8)}function p(e,n,o){return {id:e,title:n,body:o.trim()}}async function me(e){let n=j.resolve(e.workspacePath),o=(e.now??new Date).toISOString(),r=e.model??await k({workspacePath:n,includeEvidence:true}),l=e.contract;if(l===void 0)try{l=(await m({workspacePath:n})).contract;}catch{l=null;}let t=e.verify;t===void 0&&(t=await P(j.join(n,d$1),d$1));let d=e.impact;if(d===void 0&&(d=await P(j.join(n,g),g)),e.target.kind==="release-blocked"){let s=t?.blockingReasons??[],i=(r.summary?.projectCount??r.projects.length)===0,g=[p("verdict",i?"Workspace scaffold posture":"Release verdict",t?i?`Scaffold posture: **${t.summary.verdict}** (exit ${t.summary.exitCode}). Freshness: **${t.freshness.verdict}**. No registered projects yet \u2014 release gates apply after the first project is added.`:`Verdict: **${t.summary.verdict}** (exit ${t.summary.exitCode}). Risk: **${t.impact.risk}**. Freshness: **${t.freshness.verdict}**.`:"No workspace verify report found. Run `npx workspai workspace verify --json --write` first."),p("blockers",i?"Pre-project signals":"Blocking reasons",s.length?s.map(h=>`- ${h}`).join(`
|
|
2
|
+
`):i?"No pre-project signals in the latest verify report.":"No blocking reasons in the latest verify report.")];return t?.resolutionHints?.length&&g.push(p("resolution","Resolution hints",t.resolutionHints.map(h=>`- **${h.blockerId}** (${h.resolutionClass}): ${h.commandRetryHint??h.fixHints[0]?.detail??"See fix hints"}`).join(`
|
|
3
|
+
`))),{schemaVersion:a,generatedAt:o,workspacePath:n,target:e.target,summary:t?i?b(s.length,t.summary.verdict):`${s.length>0||t.summary.verdict==="blocked"?"Release blocked":"Release posture"}: ${t.summary.verdict} with ${s.length} blocking reason(s).`:"Release posture unknown \u2014 verify report missing.",sections:g,releaseRisk:t?.impact.risk,blockingReasons:s,resolutionHints:t?.resolutionHints}}if(e.target.kind==="blocker"){let s=e.target,m=t?.resolutionHints?.find(g=>g.blockerId===s.blockerId),i=t?.blockingReasons.find(g=>g.includes(s.blockerId))??t?.blockingReasons[0];return {schemaVersion:a,generatedAt:o,workspacePath:n,target:s,summary:m?`Blocker ${s.blockerId}: ${m.resolutionClass}`:`Blocker ${s.blockerId} (no structured hint)`,sections:[p("reason","Blocking signal",i??"No matching blocking reason in verify."),p("hint","Resolution class",m?`${m.resolutionClass}
|
|
4
|
+
|
|
5
|
+
${m.commandRetryHint??""}
|
|
6
|
+
|
|
7
|
+
${m.fixHints.map(g=>`- ${g.detail}`).join(`
|
|
8
|
+
`)}`:"Run workspace verify to emit resolutionHints for this blocker.")],blockingReasons:i?[i]:[],resolutionHints:m?[m]:[]}}if(e.target.kind==="trace"){let s=j.isAbsolute(e.target.diffRef)?e.target.diffRef:j.join(n,e.target.diffRef),m=await P(s,void 0,"contracts/workspace-intelligence/workspace-model-diff.v1.json"),i=m?.summary?.changedProjects??[...new Set((m?.changes??[]).map(f=>f.project).filter(Boolean))],h=(r.summary?.projectCount??r.projects.length)===0,T=d?.transitiveImpact?.map(f=>`${f.project?.name??f.target} (d${f.distance??0}, via ${f.via??"\u2014"})`)??[],y=t?.affectedSubgraph;return {schemaVersion:a,generatedAt:o,workspacePath:n,target:e.target,summary:i?.length?`Trace from ${i.length} changed project(s) through blast radius to gate coverage.`:h?"Trace: workspace scaffold baseline \u2014 no project changes in the latest diff.":"Trace: diff baseline present with no project changes.",sections:[p("origin","Change origin",i?.length?i.map(f=>`- ${f}`).join(`
|
|
9
|
+
`):"No changed projects in diff."),p("blast-radius","Transitive impact",T.length?T.map(f=>`- ${f}`).join(`
|
|
10
|
+
`):"No transitive impact report."),p("gate","Subgraph gate",y?`Directly changed: ${y.directlyChanged}; transitive dependents: ${y.transitiveDependents}; covered: ${y.covered}; uncovered: ${y.uncovered}; unverifiable: ${y.unverifiable}.`:"No verify subgraph coverage available.")],releaseRisk:d?.summary?.risk??t?.impact.risk,blockingReasons:t?.blockingReasons}}let c=e.target.project,a$2=J(r,l,c),u=r.graph,k$1=u?a$1(u,a$2):{found:false,centrality:null,directDependents:[],transitiveDependents:[]},v=z(l,c),E=X(l,c),b$1=Y(t,c),w=r.projects.find(s=>s.name.toLowerCase()===c.toLowerCase()),x=[p("overview","Project overview",w?`${w.name} (${w.frameworkDisplayName}, ${w.runtime}) at \`${w.path}\`.`:`Project **${c}** ${k$1.found?"exists in graph":"not found in workspace model"}.`),p("consumers","Consumers / dependents",[`Direct dependents: ${k$1.directDependents.join(", ")||"none"}`,`Contract consumers: ${E.join(", ")||"none"}`,`Transitive dependents (blast radius): ${k$1.transitiveDependents.length}`].join(`
|
|
11
|
+
`)),p("contracts","Critical contracts",v?[`Owns: ${v.contracts?.owns?.join(", ")||"none"}`,`Publishes: ${v.contracts.publishes.join(", ")||"none"}`,`Consumes: ${v.contracts.consumes.join(", ")||"none"}`,`APIs: ${v.contracts.apis.map(s=>s.name).join(", ")||"none"}`].join(`
|
|
12
|
+
`):"No workspace.contract.json entry for this project."),p("verification","Required verification",b$1.length?b$1.map(s=>`- ${s}`).join(`
|
|
13
|
+
`):"- `npx workspai workspace verify --json`\n- Project test/build via `workspace run` when configured")];k$1.centrality&&x.push(p("centrality","Graph centrality",`fanIn ${k$1.centrality.fanIn}, fanOut ${k$1.centrality.fanOut}, reach ${k$1.centrality.reach}, hotspot ${k$1.centrality.isHotspot?"yes":"no"}.`));let I=c.trim().toLowerCase(),A=s=>s.project?.name?.toLowerCase()===I||s.target.toLowerCase()===I,S=d?.affectedProjects?.find(A)?.risk??d?.transitiveImpact?.find(A)?.risk??t?.impact.risk??"unknown";return {schemaVersion:a,generatedAt:o,workspacePath:n,target:e.target,summary:`${c}: ${E.length} consumer(s), release risk **${S}**.`,sections:x,releaseRisk:String(S)}}async function fe(e,n,o="explain"){let r=G(o);return await e$1(n,r,a$2(e)),r}export{G as a,me as b,fe as c};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {e
|
|
1
|
+
import {c,e}from'./chunk-2TEDAKP6.js';import {o as o$1}from'./chunk-5XATWNME.js';import u from'fs';import d from'path';var a="workspace-run-v1",p="workspace-run-last.json",o=`.workspai/reports/${p}`;var m=new Set(["init","test","build","start"]);function A(e){return m.has(e)}async function w(e){try{return await u.promises.access(e,u.constants.F_OK),true}catch{return false}}async function W(e){try{let r=await u.promises.readFile(e,"utf-8");return JSON.parse(r)}catch{return null}}function S(e){return !e||typeof e!="object"||Array.isArray(e)?null:e}function P(e){let r=e.stage;return typeof r!="string"||r.trim().length===0||!Array.isArray(e.projects)?false:A(r)||/^[a-z][a-z0-9_-]*$/i.test(r)}function _(e){let r=S(e);return !r||r.schemaVersion===a?false:P(r)}function h(e){let r=S(e);return r?r.schemaVersion===a&&r.stages!=null:false}function R(e){if(h(e))return e;if(_(e)){let r=e.stage;return {schemaVersion:a,generatedAt:e.generatedAt,workspacePath:e.workspacePath,latestStage:r,stages:{[r]:e},enterpriseControls:e.enterpriseControls??{jsonReady:true,evidencePath:o}}}return null}function x(e,r){let n=R(e);if(!n)return null;let t=r??n.latestStage;return n.stages[t]??null}async function L(e){let r=(await Promise.all(o$1(d.resolve(e),"reports",p).map(async t=>await w(t)?t:null))).find(t=>typeof t=="string");if(!r)return null;let n=await W(r);return R(n)}async function I(e$1,r){let n=d.resolve(e$1);return c(n,o,async()=>{let t=(await Promise.all(o$1(n,"reports",p).map(async s=>await w(s)?s:null))).find(s=>typeof s=="string"),l=t?await W(t):null,i=R(l);if(t&&!i)throw new Error(`Workspace run evidence is unreadable or invalid; refusing to overwrite: ${t}`);let g=i?{...i.stages}:{};g[r.stage]=r;let k={schemaVersion:a,generatedAt:r.generatedAt,workspacePath:r.workspacePath,latestStage:r.stage,stages:g,enterpriseControls:{jsonReady:true,evidencePath:o}};return await e(n,o,k),k})}export{p as a,o as b,x as c,L as d,I as e};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var r="workspace-knowledge-graph-change-overlay.v1";export{r as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {b}from'./chunk-
|
|
1
|
+
import {b}from'./chunk-LNRAB7UY.js';var i=b.explain,g=["project","release-blocked","blocker","trace"];function s(t){let r=t.trim();if(!r)return null;if(r==="release-blocked")return {kind:"release-blocked"};if(r.startsWith("project:")){let e=r.slice(8).trim();return e?{kind:"project",project:e}:null}if(r.startsWith("blocker:")){let e=r.slice(8).trim();return e?{kind:"blocker",blockerId:e}:null}if(r.startsWith("trace:")){let e=r.slice(6).trim();return e?{kind:"trace",diffRef:e}:null}return {kind:"project",project:r}}function u(t){let r=t.trim();if(!r)return null;if(r.startsWith("trace:")){let n=s(r);return n?.kind==="trace"?n:null}let e=r.replace(/\\/g,"/").trim().toLowerCase();return e.endsWith(".json")||e.includes("workspace-model-diff")||e.startsWith(".rapidkit/")||e.includes("/.rapidkit/")?{kind:"trace",diffRef:r}:null}function A(t){if(!t||typeof t!="object"||Array.isArray(t))return false;let r=t;return r.schemaVersion===i&&typeof r.generatedAt=="string"&&typeof r.summary=="string"&&Array.isArray(r.sections)&&r.target!=null&&typeof r.target=="object"&&!Array.isArray(r.target)&&typeof r.target.kind=="string"}export{i as a,g as b,s as c,u as d,A as e};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {b}from'./chunk-
|
|
1
|
+
import {b}from'./chunk-COARSXRC.js';import {a,b as b$1}from'./chunk-S5KTATOU.js';function f(r){let s=new Map;for(let n of r.projects)s.has(n.name)||s.set(n.name,b(n));return s}function j(r){let s=f(r),n=r.graph??{nodes:r.projects.map(t=>({id:t.name,path:t.path})),edges:[]},a$1=a(n),o=new Map;for(let t of n.nodes){let e=s.get(t.id)??b({missing:t.id}),g=[...b$1(a$1,[t.id],{direction:"dependencies"}).keys()].filter(c=>c!==t.id).sort((c,l)=>c.localeCompare(l)).map(c=>({id:c,hash:s.get(c)??"<unknown>"}));o.set(t.id,{id:t.id,ownHash:e,transitiveInputsHash:b({own:e,dependencies:g})});}return o}function v(r,s){if(!s||Object.keys(s).length===0)return {verdict:"unknown",baseline:"none",changed:[],added:[],removed:[]};let n=[],a=[];for(let[e,i]of r.entries())e in s?s[e]!==i.transitiveInputsHash&&n.push(e):a.push(e);let o=[];for(let e of Object.keys(s))r.has(e)||o.push(e);return n.sort((e,i)=>e.localeCompare(i)),a.sort((e,i)=>e.localeCompare(i)),o.sort((e,i)=>e.localeCompare(i)),{verdict:n.length>0||a.length>0||o.length>0?"stale":"fresh",baseline:"recorded",changed:n,added:a,removed:o}}function w(r){let s={};for(let[n,a]of [...r.entries()].sort((o,t)=>o[0].localeCompare(t[0])))s[n]=a.transitiveInputsHash;return s}export{f as a,j as b,v as c,w as d};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import m from'fs';import o from'path';import {fileURLToPath}from'url';import g from'ajv';import S from'ajv/dist/2020.js';import j from'ajv-formats';var f=new Map;function d(e,t=new Set){if(Array.isArray(e)){for(let r of e)d(r,t);return t}if(!e||typeof e!="object")return t;for(let[r,n]of Object.entries(e))r==="$ref"&&typeof n=="string"&&!n.startsWith("#")?t.add(n.split("#",1)[0]??n):d(n,t);return t}function u(e,t,r,n=new Set){for(let i of d(t)){if(!i||/^https?:\/\//i.test(i))continue;let s=o.join(o.dirname(r),i).split(o.sep).join("/"),c=l(s);if(n.has(c))continue;n.add(c);let a=JSON.parse(m.readFileSync(c,"utf8"));u(e,a,s,n),e.addSchema(a);}}function l(e){let t=o.dirname(fileURLToPath(import.meta.url)),n=[o.resolve(t,"..",e),o.resolve(t,"../..",e),o.resolve(process.cwd(),e)].find(i=>m.existsSync(i));if(!n)throw new Error(`JSON Schema contract is unavailable: ${e}`);return n}function h(e){let t=l(e),r=f.get(t);if(r)return r;let n=JSON.parse(m.readFileSync(t,"utf8"));if(typeof n.$ref=="string"&&!n.$ref.startsWith("#")){let a=o.join(o.dirname(e),n.$ref).split(o.sep).join("/"),p=h(a);return f.set(t,p),p}let i=n.$schema?.includes("2020-12")?S:g,s=new i({allErrors:true,strict:true,allowUnionTypes:true});j(s),u(s,n,e);let c=s.compile(n);return f.set(t,c),c}function w(e){return (e??[]).slice(0,8).map(t=>{let r=t.instancePath||"/",n=t.keyword==="additionalProperties"?` (${String(t.params.additionalProperty)})`:"";return `${r} ${t.message??t.keyword}${n}`}).join("; ")}function b(e,t,r){let n=h(t);if(!n(e))throw new Error(`${r} violates ${t}: ${w(n.errors)}`)}
|
|
2
|
+
export{b as a};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {d,b as b$1,e}from'./chunk-WPEEC5BX.js';import {j,q as q$1,n}from'./chunk-DIPD72H4.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-HDURFXW5.js';import {a}from'./chunk-GZTYAEWX.js';import {a as a$1}from'./chunk-TQEMLBAG.js';import {p,l,o}from'./chunk-5XATWNME.js';import {e as e$2,g}from'./chunk-EYJ2CQSK.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}
|
|
1
|
+
import {d,b as b$1,e}from'./chunk-DV6GJD4K.js';import {d as d$2}from'./chunk-S5KTATOU.js';import {p as p$1,w,t}from'./chunk-TWNFECMN.js';import {h,i,f,e as e$1}from'./chunk-4KUIFXHM.js';import {d as d$1}from'./chunk-2TEDAKP6.js';import {a}from'./chunk-GZTYAEWX.js';import {a as a$1}from'./chunk-TQEMLBAG.js';import {p,l,o}from'./chunk-5XATWNME.js';import {e as e$2,g}from'./chunk-EYJ2CQSK.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$1=ze[e.stage];if(t$1){let r=t(e.projectPath,t$1,{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,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 d$1(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 d$1(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$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"):[],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$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=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(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
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
3
|
${y}`.split(/\r?\n/).map(f=>f.trim()).filter(Boolean),O=j.slice(0,6).join(`
|
|
4
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};
|
|
@@ -0,0 +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"},t={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"},r={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"},a={analyze:"analyze",workspace:"workspace <action> [subaction] [key] [value]",doctor:"doctor [scope]",readiness:"readiness"},c=["analyze","readiness","doctor","workspace"],i=["model","diff","impact","doctor-evidence","contract-evidence","analyze-evidence","readiness-evidence","verify","context","agent-sync","explain"],p=["sync","baseline"],l={sync:[".workspai/workspace.contract.json",".workspai/workspace-registry.v1.json"],baseline:[o.snapshot]},e=o,d={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]}};export{o as a,t as b,r as c,a as d,c as e,i as f,p as g,l as h,d as i};
|