rapidkit 0.34.0 → 0.36.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 +137 -706
- package/contracts/backend-import-stack-parity.snapshot.json +36 -36
- package/contracts/infra-stack.v1.json +190 -47
- package/contracts/module-layout.v1.json +12 -3
- package/contracts/module-support.v1.json +20 -0
- package/contracts/runtime-command-surface.v1.json +139 -22
- package/contracts/workspace-intelligence/workspace-context.v1.json +59 -0
- package/contracts/workspace-intelligence/workspace-impact.v1.json +84 -0
- package/contracts/workspace-intelligence/workspace-model-diff.v1.json +105 -0
- package/contracts/workspace-intelligence/workspace-model-snapshot.v1.json +36 -0
- package/contracts/workspace-intelligence/workspace-model.v1.json +50 -0
- package/contracts/workspace-intelligence/workspace-verify.v1.json +111 -0
- package/dist/analyze-HXO6R656.js +1 -0
- package/dist/autopilot-release-FMQ5KND5.js +1 -0
- package/dist/chunk-45KNNNAB.js +2 -0
- package/dist/chunk-7ZSURMR2.js +4 -0
- package/dist/chunk-A5FBGRJA.js +1 -0
- package/dist/{chunk-3TBSWOTY.js → chunk-DC44JPI3.js} +13 -13
- package/dist/chunk-HHJAANUC.js +1 -0
- package/dist/{chunk-2PGMJSO5.js → chunk-HUQ5WRUF.js} +86 -86
- package/dist/chunk-KIB4KHBF.js +3 -0
- package/dist/chunk-KMUWWZRT.js +1 -0
- package/dist/chunk-MCLLP6MW.js +2 -0
- package/dist/chunk-OCGZNSOE.js +1 -0
- package/dist/chunk-TC2PSHT6.js +50 -0
- package/dist/chunk-UY4LZEXK.js +7 -0
- package/dist/chunk-UZW5QFRW.js +5 -0
- package/dist/chunk-VPNHGQIV.js +1 -0
- package/dist/chunk-Y2ZPG7KN.js +9 -0
- package/dist/chunk-YBS2HGO3.js +2 -0
- package/dist/chunk-YJ24EV3P.js +1 -0
- package/dist/create-7R4CGABE.js +1 -0
- package/dist/{doctor-3SBEO7XU.js → doctor-DG3TBPZN.js} +1 -1
- package/dist/imported-projects-registry-ZOCHFWMK.js +1 -0
- package/dist/index.d.ts +29 -2
- package/dist/index.js +135 -129
- package/dist/module-layout-NZ43RSC5.js +1 -0
- package/dist/pipeline-23AEXNF2.js +5 -0
- package/dist/{workspace-AG2MQFTY.js → workspace-ZDL5IQU4.js} +1 -1
- package/dist/workspace-context-YFQQROOZ.js +2 -0
- package/dist/{workspace-contract-Z5VYUF3T.js → workspace-contract-A6QP7FPA.js} +1 -1
- package/dist/workspace-foundation-QVWALXMP.js +1 -0
- package/dist/workspace-intelligence-VLA2RILM.js +1 -0
- package/dist/workspace-model-OO4WOBJS.js +1 -0
- package/dist/workspace-run-NIKH2IKF.js +1 -0
- package/dist/workspace-verify-XEXRCET7.js +1 -0
- package/package.json +14 -4
- package/dist/analyze-SVYRQNLO.js +0 -1
- package/dist/autopilot-release-LBKCP73F.js +0 -1
- package/dist/chunk-4E6ZGX6V.js +0 -1
- package/dist/chunk-ILY6QARY.js +0 -9
- package/dist/chunk-JIECGCLV.js +0 -4
- package/dist/chunk-KXTXQODI.js +0 -5
- package/dist/chunk-QCZGNOTH.js +0 -2
- package/dist/chunk-QUNCXYYK.js +0 -1
- package/dist/chunk-RGXFDBYB.js +0 -7
- package/dist/chunk-SAIWD6VM.js +0 -3
- package/dist/chunk-Y3UKTEZO.js +0 -2
- package/dist/chunk-YV7IQDBM.js +0 -50
- package/dist/create-BO2I3ESU.js +0 -1
- package/dist/module-layout-J56LHEGH.js +0 -1
- package/dist/pipeline-VUQ6AXKF.js +0 -5
- package/dist/workspace-foundation-G74V6K4U.js +0 -1
- package/dist/workspace-run-EDM3SUPA.js +0 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://getrapidkit.com/schemas/workspace-verify.v1.json",
|
|
4
|
+
"title": "RapidKit Workspace Verify Last Run",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": [
|
|
7
|
+
"schemaVersion",
|
|
8
|
+
"generatedAt",
|
|
9
|
+
"workspacePath",
|
|
10
|
+
"mode",
|
|
11
|
+
"impact",
|
|
12
|
+
"summary",
|
|
13
|
+
"steps",
|
|
14
|
+
"missingEvidence",
|
|
15
|
+
"blockingReasons",
|
|
16
|
+
"verificationPlan"
|
|
17
|
+
],
|
|
18
|
+
"properties": {
|
|
19
|
+
"schemaVersion": {
|
|
20
|
+
"const": "workspace-verify.v1"
|
|
21
|
+
},
|
|
22
|
+
"generatedAt": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"format": "date-time"
|
|
25
|
+
},
|
|
26
|
+
"workspacePath": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"minLength": 1
|
|
29
|
+
},
|
|
30
|
+
"mode": {
|
|
31
|
+
"const": "evidence"
|
|
32
|
+
},
|
|
33
|
+
"fromImpactRef": { "type": "string" },
|
|
34
|
+
"scope": { "type": "string" },
|
|
35
|
+
"impact": {
|
|
36
|
+
"type": "object",
|
|
37
|
+
"required": ["changed", "risk", "affectedProjects", "recommendedCommands"],
|
|
38
|
+
"properties": {
|
|
39
|
+
"changed": { "type": "boolean" },
|
|
40
|
+
"risk": {
|
|
41
|
+
"enum": ["none", "low", "medium", "high", "critical"]
|
|
42
|
+
},
|
|
43
|
+
"affectedProjects": { "type": "integer", "minimum": 0 },
|
|
44
|
+
"recommendedCommands": { "type": "integer", "minimum": 0 }
|
|
45
|
+
},
|
|
46
|
+
"additionalProperties": false
|
|
47
|
+
},
|
|
48
|
+
"summary": {
|
|
49
|
+
"type": "object",
|
|
50
|
+
"required": [
|
|
51
|
+
"verdict",
|
|
52
|
+
"exitCode",
|
|
53
|
+
"stepsPassed",
|
|
54
|
+
"stepsWarn",
|
|
55
|
+
"stepsFailed",
|
|
56
|
+
"stepsMissing",
|
|
57
|
+
"stepsSkipped"
|
|
58
|
+
],
|
|
59
|
+
"properties": {
|
|
60
|
+
"verdict": {
|
|
61
|
+
"enum": ["ready", "needs-attention", "blocked"]
|
|
62
|
+
},
|
|
63
|
+
"exitCode": {
|
|
64
|
+
"enum": [0, 1, 2]
|
|
65
|
+
},
|
|
66
|
+
"stepsPassed": { "type": "integer", "minimum": 0 },
|
|
67
|
+
"stepsWarn": { "type": "integer", "minimum": 0 },
|
|
68
|
+
"stepsFailed": { "type": "integer", "minimum": 0 },
|
|
69
|
+
"stepsMissing": { "type": "integer", "minimum": 0 },
|
|
70
|
+
"stepsSkipped": { "type": "integer", "minimum": 0 }
|
|
71
|
+
},
|
|
72
|
+
"additionalProperties": false
|
|
73
|
+
},
|
|
74
|
+
"steps": {
|
|
75
|
+
"type": "array",
|
|
76
|
+
"items": {
|
|
77
|
+
"type": "object",
|
|
78
|
+
"required": ["id", "label", "scope", "command", "status", "required", "message"],
|
|
79
|
+
"properties": {
|
|
80
|
+
"id": { "type": "string" },
|
|
81
|
+
"label": { "type": "string" },
|
|
82
|
+
"scope": {
|
|
83
|
+
"enum": ["workspace", "project"]
|
|
84
|
+
},
|
|
85
|
+
"project": { "type": "string" },
|
|
86
|
+
"status": {
|
|
87
|
+
"enum": ["pass", "warn", "fail", "missing", "skipped"]
|
|
88
|
+
},
|
|
89
|
+
"required": { "type": "boolean" },
|
|
90
|
+
"evidencePath": { "type": "string" },
|
|
91
|
+
"message": { "type": "string" },
|
|
92
|
+
"command": { "type": "object", "additionalProperties": true }
|
|
93
|
+
},
|
|
94
|
+
"additionalProperties": true
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
"missingEvidence": {
|
|
98
|
+
"type": "array",
|
|
99
|
+
"items": { "type": "string" }
|
|
100
|
+
},
|
|
101
|
+
"blockingReasons": {
|
|
102
|
+
"type": "array",
|
|
103
|
+
"items": { "type": "string" }
|
|
104
|
+
},
|
|
105
|
+
"verificationPlan": {
|
|
106
|
+
"type": "array",
|
|
107
|
+
"items": { "type": "object", "additionalProperties": true }
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
"additionalProperties": true
|
|
111
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{b as printAnalyzeReport,a as runAnalyze}from'./chunk-Y2ZPG7KN.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{b as AUTOPILOT_RELEASE_ALIAS_FILENAME,a as AUTOPILOT_RELEASE_LAST_RUN_FILENAME,c as runAutopilotRelease}from'./chunk-UY4LZEXK.js';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {d,b,a}from'./chunk-VPNHGQIV.js';import U from'crypto';import f from'path';import w from'fs-extra';import {spawnSync}from'child_process';function j(e,t){let r=spawnSync("git",t,{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]});return r.status!==0?{ok:false,stdout:""}:{ok:true,stdout:(r.stdout??"").trim()}}function J(e){let t=[],r=[],o=[];for(let c of e.split(`
|
|
2
|
+
`)){if(!c.trim())continue;let n=c.slice(0,2),s=c.slice(3).trim();if(s){if(n==="??"){r.push(s);continue}n.includes("D")&&o.push(s),t.push(s);}}return {changedFiles:[...new Set(t)].sort(),untrackedFiles:[...new Set(r)].sort(),deletedFiles:[...new Set(o)].sort()}}function _(e,t){let r={available:false,dirty:false,changedFiles:[],untrackedFiles:[],deletedFiles:[]},o=j(e,["rev-parse","--is-inside-work-tree"]);if(!o.ok||o.stdout!=="true")return r;let c=j(e,["rev-parse","--abbrev-ref","HEAD"]),n=j(e,["rev-parse","HEAD"]),s=j(e,["status","--porcelain=v1","--untracked-files=all"]),i=J(s.stdout),p=i.changedFiles.length>0||i.untrackedFiles.length>0||i.deletedFiles.length>0;return {available:true,branch:c.ok?c.stdout:void 0,commit:n.ok?n.stdout:void 0,ref:t?.ref,dirty:p,changedFiles:i.changedFiles,untrackedFiles:i.untrackedFiles,deletedFiles:i.deletedFiles}}var V="workspace-model-snapshot.v1",G="workspace-model-diff.v1",E=".rapidkit/reports/workspace-model-snapshot.json",N=".rapidkit/reports/workspace-model-diff-last-run.json",Q="workspace-impact.v1",X=".rapidkit/reports/workspace-impact-last-run.json";function B(e){let t=e.trim().toLowerCase();return t==="git"||t.startsWith("git:")}function Y(e){let t=e.trim();return t.toLowerCase()==="git"?"HEAD":t.toLowerCase().startsWith("git:")&&t.slice(4).trim()||"HEAD"}function F(e){if(Array.isArray(e))return e.map(t=>F(t));if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=F(e[r]);return t}return e}function u(e){return JSON.stringify(F(e))}function S(e){let t={...e,generatedAt:"<ignored>",validation:e.validation?{...e.validation,issues:e.validation.issues.map(r=>({...r})).sort((r,o)=>{let c=`${r.severity}:${r.code}:${r.target}:${r.message}`,n=`${o.severity}:${o.code}:${o.target}:${o.message}`;return c.localeCompare(n)})}:void 0};return U.createHash("sha256").update(u(t)).digest("hex")}function L(e,t){return f.isAbsolute(t)?t:f.join(e,t)}async function Z(e){let t=await w.readJson(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace model input is not a JSON object: ${e}`);let r=t;if(r.schemaVersion===V){let o=r;if(!o.model||o.model.schemaVersion!==a)throw new Error(`Invalid workspace model snapshot: ${e}`);return {model:o.model,hash:o.modelHash||S(o.model)}}if(r.schemaVersion===a){let o=r;return {model:o,hash:S(o)}}throw new Error(`Unsupported workspace model input schema: ${String(r.schemaVersion)}`)}async function ee(e){let t=await w.readJson(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace diff input is not a JSON object: ${e}`);let r=t;if(r.schemaVersion!==G)return null;let o=r;if(!o.currentModel||o.currentModel.schemaVersion!==a||!o.summary||!Array.isArray(o.changes))throw new Error(`Invalid workspace model diff report: ${e}`);return o}async function Pe(e){let t=e.model??await d({workspacePath:e.workspacePath,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now});return {schemaVersion:V,generatedAt:(e.now??new Date).toISOString(),modelHash:S(t),modelRef:b,model:t}}async function Me(e,t){let r=f.join(t,E);return await w.ensureDir(f.dirname(r)),await w.writeJson(r,e,{spaces:2}),r}function C(e){return {name:e.name,path:e.path,kind:e.kind,runtime:e.runtime,framework:e.framework,generator:e.generator,supportTier:e.supportTier,commands:e.commands,importantFiles:e.importantFiles}}function h(e,t){e.push(t);}function te(e,t){let r=[],o=["name","profile","type"],c=["workspaceType","surfaces","runtimeFamilies","businessCapabilities"];for(let n of o){let s=e.workspace[n],i=t.workspace[n];u(s)!==u(i)&&h(r,{type:"workspace.changed",severity:"info",target:`workspace.${n}`,message:`Workspace metadata field changed: ${String(n)}`,before:s,after:i});}for(let n of c){let s=e.identity[n],i=t.identity[n];u(s)!==u(i)&&h(r,{type:"workspace.changed",severity:"info",target:`identity.${n}`,message:`Workspace identity field changed: ${String(n)}`,before:s,after:i});}return u(e.policies)!==u(t.policies)&&h(r,{type:"workspace.changed",severity:"warning",target:"policies",message:"Workspace policy summary changed.",before:e.policies,after:t.policies}),u(e.evidence)!==u(t.evidence)&&h(r,{type:"workspace.changed",severity:"info",target:"evidence",message:"Workspace evidence summary changed.",before:e.evidence,after:t.evidence}),u(e.discovery)!==u(t.discovery)&&h(r,{type:"workspace.changed",severity:"info",target:"discovery",message:"Workspace discovery settings changed.",before:e.discovery,after:t.discovery}),e.contracts.exists!==t.contracts.exists&&h(r,{type:"workspace.changed",severity:t.contracts.exists?"info":"warning",target:t.contracts.workspaceContractPath,message:"Workspace contract presence changed.",before:e.contracts.exists,after:t.contracts.exists}),r}function re(e,t){let r=e.validation??null,o=t.validation??null;return u(r)===u(o)?[]:[{type:"validation.changed",severity:o?.status==="failed"?"critical":"warning",target:"validation",message:"Workspace model validation changed.",before:r,after:o}]}function oe(e,t){let r=[],o=new Map(e.projects.map(n=>[n.path,n])),c=new Map(t.projects.map(n=>[n.path,n]));for(let[n,s]of c.entries()){let i=o.get(n);if(!i){h(r,{type:"project.added",severity:"info",target:n,message:`Project added: ${s.name}`,after:C(s)});continue}let p=C(i),d=C(s);if(u(p)!==u(d)){let g=i.runtime!==s.runtime||i.framework!==s.framework;h(r,{type:"project.changed",severity:g?"warning":"info",target:n,message:`Project changed: ${s.name}`,before:p,after:d});}}for(let[n,s]of o.entries())c.has(n)||h(r,{type:"project.removed",severity:"warning",target:n,message:`Project removed: ${s.name}`,before:C(s)});return r.sort((n,s)=>`${n.type}:${n.target}`.localeCompare(`${s.type}:${s.target}`))}async function ne(e){let t=f.resolve(e.workspacePath),r=B(e.fromPath),o=r?Y(e.fromPath):void 0,c=e.fromPath;if(r){let m=f.join(t,E);if(!await w.pathExists(m))throw new Error("Git-aware workspace diff requires an existing snapshot at .rapidkit/reports/workspace-model-snapshot.json. Run: npx rapidkit workspace snapshot --json");c=E;}let n=L(t,c),s=await Z(n),i=e.model??await d({workspacePath:t,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now}),p=S(i),d$1=[...te(s.model,i),...oe(s.model,i),...re(s.model,i)],g;e.includeGitObservation!==false&&(g=e.gitObservation??_(t,{ref:o}),g.available&&ie(d$1,g,i));let y=d$1.filter(m=>m.type.startsWith("git.")).length,v=s.hash!==p,O=r?`git:${o??"HEAD"}`:f.relative(t,n).split(f.sep).join("/");return {schemaVersion:G,generatedAt:(e.now??new Date).toISOString(),fromRef:O,toRef:b,fromHash:s.hash,toHash:p,summary:{changed:v||y>0,addedProjects:d$1.filter(m=>m.type==="project.added").length,removedProjects:d$1.filter(m=>m.type==="project.removed").length,changedProjects:d$1.filter(m=>m.type==="project.changed").length,workspaceChanges:d$1.filter(m=>m.type==="workspace.changed").length,validationChanges:d$1.filter(m=>m.type==="validation.changed").length,gitChangedFiles:y},git:g?.available?ce(g,o):{available:false,dirty:false,changedFiles:0,untrackedFiles:0,deletedFiles:0},changes:d$1,currentModel:i}}async function je(e,t){let r=f.join(t,N);return await w.ensureDir(f.dirname(r)),await w.writeJson(r,e,{spaces:2}),r}function R(e){return {none:0,low:1,medium:2,high:3,critical:4}[e]}function T(e){return e.reduce((t,r)=>R(r)>R(t)?r:t,"none")}function H(e){return e.join(" ")}function W(e,t,r,o){return {id:e,label:t,scope:o.scope,project:o.project,display:H(["npx","rapidkit",...r]),execute:H(["npx","--yes","--package","rapidkit","rapidkit",...r]),required:o.required!==false}}function ae(e){let t=`project:${e.name}`;return [W(`project.${e.name}.test`,`Run tests for ${e.name}`,["workspace","run","test","--scope",t,"--json"],{scope:"project",project:e.name,required:e.commands.fleetStages.includes("test")}),W(`project.${e.name}.build`,`Run build for ${e.name}`,["workspace","run","build","--scope",t,"--json"],{scope:"project",project:e.name,required:e.commands.fleetStages.includes("build")})]}function A(){return [W("workspace.doctor","Run workspace doctor",["doctor","workspace","--json"],{scope:"workspace"}),W("workspace.contract.verify","Verify workspace contract",["workspace","contract","verify","--json"],{scope:"workspace"}),W("workspace.readiness","Run release readiness",["readiness","--json"],{scope:"workspace"}),W("workspace.analyze","Run workspace analyze",["analyze","--json"],{scope:"workspace",required:false}),W("workspace.pipeline","Run governance pipeline",["pipeline","--json"],{scope:"workspace",required:false})]}function se(e,t){let r=t.split(f.sep).join("/");return e.projects.filter(c=>{let n=c.path.split(f.sep).join("/");return r===n||r.startsWith(`${n}/`)}).sort((c,n)=>n.path.length-c.path.length)[0]}function ie(e,t,r){let o=new Set(e.map(n=>n.target)),c=(n,s)=>{let i=s.split(f.sep).join("/"),p=`git:${i}`;if(o.has(p))return;let d=se(r,i),g=d?`${d.name} (${d.path})`:"workspace";h(e,{type:n,severity:n==="git.deleted"?"warning":"info",target:p,message:`Git ${n==="git.untracked"?"untracked":n==="git.deleted"?"deleted":"changed"} file affects ${g}: ${i}`,after:{path:i,project:d?.name,projectPath:d?.path}}),o.add(p);};for(let n of t.changedFiles)c("git.file.changed",n);for(let n of t.untrackedFiles)c("git.untracked",n);for(let n of t.deletedFiles)c("git.deleted",n);}function ce(e,t){return {available:true,ref:t??e.ref,branch:e.branch,commit:e.commit,dirty:e.dirty,changedFiles:e.changedFiles.length,untrackedFiles:e.untrackedFiles.length,deletedFiles:e.deletedFiles.length}}function pe(e){let t=new Set,r=[];for(let o of e){let c=`${o.scope}:${o.project??""}:${o.display}`;t.has(c)||(t.add(c),r.push(o));}return r}function de(e){return e.type==="project.removed"?"high":e.severity==="critical"?"critical":e.severity==="warning"?"high":("medium")}function le(e,t){return e.severity==="critical"?"critical":e.target==="policies"||e.target.includes("contract")?"high":e.type==="validation.changed"?(t?.projectCount??0)===0?"low":"high":e.target==="evidence"?"low":e.severity==="warning"?"medium":"low"}function fe(e){return e.affectedProjects>0||e.projectCount>0||!e.changes.every(r=>r.severity==="critical"?false:r.type.startsWith("git.")||r.type==="validation.changed")?e.risk:R(e.risk)>=R("high")||e.risk==="medium"?"low":e.risk}function me(e,t){if(!e||e==="workspace")return true;let r=(e.startsWith("project:")?e.slice(8):e).trim().toLowerCase();return [t.name,t.path,f.basename(t.path),t.absolutePath].filter(o=>typeof o=="string"&&o.trim().length>0).map(o=>o.trim().toLowerCase()).includes(r)}function ue(e){if(!e.changed)return {headline:"No workspace model impact detected.",bullets:["The current workspace model matches the provided snapshot/report."],unsafeAssumptions:["Do not claim runtime verification passed unless a report exists."]};let t=e.affectedProjects.map(r=>r.project?.name??r.target);return {headline:`Workspace impact risk: ${e.risk}.`,bullets:[`Affected projects: ${t.length?t.join(", "):"none"}.`,`Workspace-level items: ${e.workspaceImpact.length}.`,"Use the verification plan before recommending apply, rollback, or release actions."],unsafeAssumptions:["Do not infer test/build success from impact alone.","Do not apply fixes without project scope and verification evidence.","Use display commands for users and execute commands for automation."]}}async function Ce(e){let t=f.resolve(e.workspacePath),r=B(e.fromPath),o=e.diff;if(!o&&!r){let a=L(t,e.fromPath);o=await ee(a)??void 0;}o||(o=await ne({workspacePath:t,fromPath:e.fromPath,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,includeGitObservation:e.includeGitObservation,gitObservation:e.gitObservation,now:e.now,model:e.model}));let c=new Map(o.currentModel.projects.map(a=>[a.path,a])),n=new Map(o.currentModel.projects.map(a=>[a.name,a])),s=o.changes.filter(a=>a.type.startsWith("project.")),i=new Map;for(let a of s){let l=(c.get(a.target)??(typeof a.before?.name=="string"?n.get(a.before.name):void 0))?.path??a.target,b=i.get(l)??[];b.push(a),i.set(l,b);}let p=[];for(let[a,k]of i.entries()){let l=c.get(a);if(l&&!me(e.scope,l))continue;let b=T(k.map(de)),x=l?.name??(typeof k[0]?.before?.name=="string"?String(k[0].before.name):a);p.push({id:`project:${x}`,scope:"project",target:a,title:`Project impact: ${x}`,summary:k.map(P=>P.message).join(" "),risk:b,reasons:k.map(P=>`${P.type}: ${P.message}`),project:l?{name:l.name,path:l.path,kind:l.kind,runtime:l.runtime,framework:l.framework,supportTier:l.supportTier,...l.generator?{generator:l.generator}:{}}:void 0,verification:l?ae(l):A()});}let d=o.changes.filter(a=>!a.type.startsWith("project.")),g=o.currentModel.summary?.projectCount??o.currentModel.projects.length,y=d.map(a=>({id:`workspace:${a.target}`,scope:"workspace",target:a.target,title:`Workspace impact: ${a.target}`,summary:a.message,risk:le(a,{projectCount:g}),reasons:[`${a.type}: ${a.message}`],verification:A()})),v=pe([...p.flatMap(a=>a.verification),...y.flatMap(a=>a.verification),...o.summary.changed?A():[]]).filter(a=>a.required),O=T([...p.map(a=>a.risk),...y.map(a=>a.risk)]),m=fe({risk:O,affectedProjects:p.length,projectCount:g,changes:o.changes}),$={changed:o.summary.changed,risk:m,affectedProjects:p.length,workspaceItems:y.length,recommendedCommands:v.length};return {schemaVersion:Q,generatedAt:(e.now??new Date).toISOString(),fromRef:o.fromRef,diffRef:N,workspace:{name:o.currentModel.workspace.name,profile:o.currentModel.workspace.profile,type:o.currentModel.workspace.type},summary:$,affectedProjects:p.sort((a,k)=>a.target.localeCompare(k.target)),workspaceImpact:y.sort((a,k)=>a.target.localeCompare(k.target)),verificationPlan:v,agentBrief:ue({changed:$.changed,risk:m,affectedProjects:p,workspaceImpact:y}),diff:o}}async function Se(e,t){let r=f.join(t,X);return await w.ensureDir(f.dirname(r)),await w.writeJson(r,e,{spaces:2}),r}export{V as a,G as b,E as c,N as d,Q as e,X as f,B as g,Y as h,Pe as i,Me as j,ne as k,je as l,A as m,Ce as n,Se as o};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import {a as a$1,b as b$1,d as d$1,c,f}from'./chunk-YBS2HGO3.js';import {a,b}from'./chunk-KMUWWZRT.js';import {c as c$1}from'./chunk-NFUXULIF.js';import u from'chalk';import d from'fs';import m from'fs-extra';import l from'path';function C(t,e){let a=l.resolve(t);if(!b(a))return a;let s=l.join(e,".rapidkit","workspace.contract.json");if(d.existsSync(s))try{let i=JSON.parse(d.readFileSync(s,"utf-8")),n=Array.isArray(i.projects)?i.projects:[];for(let c of n){let y=p(c),f=typeof y.relativePath=="string"?y.relativePath.trim():"";if(f)return l.join(e,f)}}catch{}let r=k(e),o=Array.isArray(r.payload?.projects)?r.payload.projects:[];for(let i of o){let n=p(i),c=typeof n.path=="string"?n.path.trim():"";if(c)return l.resolve(c)}return a}function $(t){let e=a$1(t);return b$1(e,t)?"go":d$1(e,t)?"java":c(e,t)?"node":f(e,t)?"python":"unknown"}function x(t,e){if(!d.existsSync(t))return null;let a=d.readdirSync(t).filter(s=>s.endsWith(".json")&&e.some(r=>r.test(s))).map(s=>l.join(t,s));return a.length===0?null:(a.sort((s,r)=>d.statSync(r).mtimeMs-d.statSync(s).mtimeMs),a[0])}function p(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function G(t){let e=l.join(t,".rapidkit","workspace.contract.json");if(d.existsSync(e))try{let r=JSON.parse(d.readFileSync(e,"utf-8")),o=Array.isArray(r.projects)?r.projects:[];if(o.length>0)return o.length}catch{}let a=k(t);return (Array.isArray(a.payload?.projects)?a.payload.projects:[]).length}function z(t,e,a){let s=l.join(t,".rapidkit","toolchain.lock");if(!d.existsSync(s))return {gate:"env",status:"fail",summary:"toolchain.lock is missing",details:["Run rapidkit bootstrap to pin runtime versions and generate a reproducible toolchain."],evidencePath:s};try{let r=JSON.parse(d.readFileSync(s,"utf-8")),o=p(r.runtime),n=["python","node","go","java"].filter(c=>{let y=p(o[c]);return typeof y.version=="string"&&y.version.trim().length>0});if(n.length===0)return {gate:"env",status:"fail",summary:"No runtime versions are pinned in toolchain.lock",details:["Pin at least one runtime version via rapidkit setup <runtime> and re-run bootstrap."],evidencePath:s};if(e!=="unknown"){let c=p(o[e]);if(typeof c.version!="string"||c.version.trim().length===0)return {gate:"env",status:"fail",summary:`${a?.hasRegisteredProjects?"Project runtime":"Workspace"} (${e}) is not pinned in toolchain.lock`,details:[`Run rapidkit setup ${e} and rapidkit bootstrap to lock ${e} for this workspace.`],evidencePath:s}}return {gate:"env",status:"pass",summary:`Pinned runtimes: ${n.join(", ")}`,details:[],evidencePath:s}}catch{return {gate:"env",status:"fail",summary:"toolchain.lock is invalid JSON",details:["Regenerate lockfile with rapidkit bootstrap."],evidencePath:s}}}function k(t){let e=l.join(t,".rapidkit","reports","doctor-last-run.json");if(!d.existsSync(e))return {payload:null,path:e};try{let a=JSON.parse(d.readFileSync(e,"utf-8"));return c$1(a,"workspace")?{payload:a,path:e}:{payload:null,path:e}}catch{return {payload:null,path:e}}}function V(t){let e=k(t);if(!e.payload)return {gate:{gate:"doctor",status:"fail",summary:"Doctor evidence is missing",details:["Run rapidkit doctor workspace --json before release readiness checks."],evidencePath:e.path},payload:null};let a=p(e.payload.summary),s=Number(a.totalIssues??0);return a.hasSystemErrors?{gate:{gate:"doctor",status:"fail",summary:"Doctor reported system errors",details:["Resolve system-level doctor errors before proceeding."],evidencePath:e.path},payload:e.payload}:s>0?{gate:{gate:"doctor",status:"warn",summary:`Doctor found ${s} issue(s)`,details:["Run rapidkit doctor workspace --fix and re-run readiness checks."],evidencePath:e.path},payload:e.payload}:{gate:{gate:"doctor",status:"pass",summary:"Doctor checks passed without issues",details:[],evidencePath:e.path},payload:e.payload}}function E(t){let e=l.join(t,".rapidkit","reports","analyze-last-run.json");if(!d.existsSync(e))return {gate:"analyze",status:"fail",summary:"Analyze evidence is missing",details:["Run rapidkit analyze --json before release readiness checks."],evidencePath:e};try{let a=JSON.parse(d.readFileSync(e,"utf-8")),s=p(a.summary),r=String(s.verdict??"").toLowerCase(),o=Number(s.score??0),i=p(s.findings),n=Number(i.fail??0);return r==="blocked"||n>0?{gate:"analyze",status:"fail",summary:`Analyze verdict is blocked (score ${o}/100)`,details:["Resolve analyze findings and regenerate analyze-last-run.json."],evidencePath:e}:r==="needs-attention"?{gate:"analyze",status:"warn",summary:`Analyze needs attention (score ${o}/100)`,details:["Review analyze warnings before release."],evidencePath:e}:{gate:"analyze",status:"pass",summary:`Analyze passed (score ${o}/100)`,details:[],evidencePath:e}}catch{return {gate:"analyze",status:"fail",summary:"Analyze evidence is invalid JSON",details:["Re-run rapidkit analyze --json to regenerate evidence."],evidencePath:e}}}function J(t){try{let e=JSON.parse(d.readFileSync(t,"utf-8")),a=String(e.status??"").toLowerCase(),s=p(e.summary),r=Number(s.failedChecks??0);return a==="fail"||r>0?{gate:"verify",status:"fail",summary:"Verify-pack contract reports failed checks",details:["Fix failed verify checks and regenerate verify-pack contract evidence."],evidencePath:t}:a==="pass"?{gate:"verify",status:"pass",summary:"Verify-pack contract passed",details:[],evidencePath:t}:{gate:"verify",status:"warn",summary:"Verify-pack contract status is not explicit",details:["Ensure contract status is pass/fail and keep schema aligned with v1 contract."],evidencePath:t}}catch{return {gate:"verify",status:"fail",summary:"Verify-pack contract is invalid JSON",details:["Regenerate verify-pack contract artifact."],evidencePath:t}}}async function L(t,e){if(e.skipVerify)return {gate:"verify",status:"pass",summary:"Verify gate skipped (--skip-verify)",details:["Verification was explicitly skipped for this readiness run."]};let a=l.join(t,".rapidkit","reports"),s=x(a,[/verify-pack-contract/i,/^verify.*\.json$/i]);if(s)return J(s);let r=l.join(a,"workspace-contract-verify-last-run.json"),o=x(a,[/workspace-contract-verify-last-run/i,/workspace-contract-verify/i]);if(o)try{let i=JSON.parse(d.readFileSync(o,"utf-8")),n=String(i.status??"").toLowerCase();if(n==="passed"||n==="pass")return {gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI cache)",details:[],evidencePath:o};if(n==="failed"||n==="fail")return {gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI cache)",details:(Array.isArray(i.violations)?i.violations:[]).slice(0,5),evidencePath:o}}catch{}try{let{verifyWorkspaceContract:i}=await import('./workspace-contract-A6QP7FPA.js'),n=await i({workspacePath:t}),c={schemaVersion:"v1",source:"cli",generatedAt:new Date().toISOString(),status:n.status,contractPath:n.contractPath,projectCount:n.projectCount,checks:n.checks,violations:n.violations};return await m.ensureDir(a),await m.writeJSON(r,c,{spaces:2}),n.status==="failed"?{gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI)",details:n.violations.slice(0,5),evidencePath:r}:{gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI)",details:[],evidencePath:r}}catch(i){return {gate:"verify",status:"fail",summary:"No verify evidence and workspace contract verification unavailable",details:["Run rapidkit workspace contract verify --json or export verify-pack contract from CI.",i instanceof Error?i.message:String(i)],evidencePath:l.join(a,"*verify*.json")}}}function D(t,e){let a=l.join(e,".rapidkit","reports","doctor-last-run.json");if(!t)return {gate:"dependency",status:"warn",summary:"Dependency risk check skipped (doctor evidence missing)",details:["Run rapidkit doctor workspace --json to include dependency findings."],evidencePath:a};let s=Array.isArray(t.projects)?t.projects:[],r=s.reduce((i,n)=>{let c=Number(n.vulnerabilities??0);return Number.isFinite(c)?i+Math.max(0,c):i},0),o=s.filter(i=>i.depsInstalled===false).length;return r>0?{gate:"dependency",status:"fail",summary:`${r} dependency vulnerability(ies) reported`,details:["Resolve vulnerabilities (npm/pip/go audit pipelines) before release."],evidencePath:a}:o>0?{gate:"dependency",status:"warn",summary:`${o} project(s) report missing dependencies`,details:["Run project init/bootstrap and regenerate doctor evidence."],evidencePath:a}:{gate:"dependency",status:"pass",summary:"No dependency vulnerabilities reported",details:[],evidencePath:a}}function I(t){return t.some(e=>e.status==="fail")?"fail":t.some(e=>e.status==="warn")?"warn":"pass"}async function W(t,e){let a=l.join(t,".rapidkit","reports","release-readiness-last-run.json");return await m.ensureDir(l.dirname(a)),await m.writeJSON(a,e,{spaces:2}),a}async function F(t={}){let e=l.resolve(t.startPath??process.cwd()),a$1=a(e)??e,s=C(e,a$1),r=$(s),o=G(a$1)>0,i=z(a$1,r,{hasRegisteredProjects:o}),n=V(a$1),c=E(a$1),y=await L(a$1,{skipVerify:t.skipVerify}),f=D(n.payload,a$1),v=[i,n.gate,c,y,f],R=I(v),h={schemaVersion:"v1",generatedAt:new Date().toISOString(),workspacePath:a$1,projectPath:s,action:t.action,overallStatus:R,blocking:R==="fail",blockingReasons:v.filter(g=>g.status==="fail").map(g=>`${g.gate}: ${g.summary}`),gates:v};return t.writeReport!==false&&(h.evidencePath=await W(a$1,h)),h}function K(t){return t==="pass"?u.green("PASS"):t==="warn"?u.yellow("WARN"):u.red("FAIL")}function M(t){return t==="pass"?u.green("PASS"):t==="warn"?u.yellow("WARN"):u.red("FAIL")}async function _(t){let e=await F({writeReport:true,skipVerify:t.skipVerify===true});if(t.json)console.log(JSON.stringify(e,null,2));else {console.log(u.bold.cyan(`
|
|
2
|
+
\u{1F6A6} RapidKit Release Readiness
|
|
3
|
+
`)),console.log(u.bold(`Workspace: ${u.cyan(l.basename(e.workspacePath))}`)),console.log(u.gray(`Path: ${e.workspacePath}`)),console.log(`Overall: ${M(e.overallStatus)}`);for(let a of e.gates){console.log(` - ${a.gate}: ${K(a.status)} ${a.summary}`);for(let s of a.details)console.log(u.gray(` ${s}`));a.evidencePath&&console.log(u.gray(` evidence: ${a.evidencePath}`));}e.evidencePath&&console.log(u.gray(`
|
|
4
|
+
Evidence saved: ${e.evidencePath}`));}t.strict&&e.overallStatus!=="pass"&&process.exit(1);}export{F as a,_ as b};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {realpathSync}from'fs';import o from'path';function p(t){let r=o.resolve(t);try{r=realpathSync.native(r);}catch{}return process.platform==="win32"?r.toLowerCase():r}export{p as a};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {a}from'./chunk-
|
|
1
|
+
import {a}from'./chunk-A5FBGRJA.js';import {c}from'./chunk-NFUXULIF.js';import {a as a$1}from'./chunk-VKLL63TL.js';import {b}from'./chunk-AC6KIKII.js';import {j}from'./chunk-Z5LKRG57.js';import {promises}from'fs';import o from'path';import i from'chalk';import N from'ora';import {execa}from'execa';function O(e){let t=a(e.path),r=Array.isArray(e.projects)?e.projects:[],a$1=[],c=new Set;for(let p of r){if(!p||typeof p.name!="string"||typeof p.path!="string")continue;let n=a(p.path);c.has(n)||(c.add(n),a$1.push({name:p.name,path:n}));}return {name:e.name,path:t,mode:e.mode,projects:a$1}}function P(e){let t=[],r=new Set;for(let a of e.workspaces||[]){if(!a||typeof a.name!="string"||typeof a.path!="string")continue;let c=O(a);r.has(c.path)||(r.add(c.path),t.push(c));}return {workspaces:t}}async function B(e,t){try{let r=a(e),a$1=j(),c=o.join(a$1,"workspaces.json");await promises.mkdir(a$1,{recursive:true});let p={workspaces:[]};try{let s=await promises.readFile(c,"utf8"),l=JSON.parse(s);l&&Array.isArray(l.workspaces)&&(p=P(l));}catch{}p.workspaces.some(s=>s.path===r)||(p.workspaces.push({name:t,path:r,mode:"full",projects:[]}),await promises.writeFile(c,JSON.stringify(p,null,2)));}catch{console.warn(i.gray("Note: Could not register workspace in shared registry"));}}async function oe(e,t=false){let r=a(e),a$1={workspacePath:r,workspaceFound:false,added:[],skipped:0};try{let c=j(),p=o.join(c,"workspaces.json"),n={workspaces:[]};try{let f=await promises.readFile(p,"utf8"),h=JSON.parse(f);h&&Array.isArray(h.workspaces)&&(n=P(h));}catch{return t||console.log("\u26A0\uFE0F Workspace registry not found"),a$1}let s=n.workspaces.find(f=>f.path===r);if(!s)return t||console.log("\u26A0\uFE0F Workspace not registered in registry"),a$1;Array.isArray(s.projects)||(s.projects=[]);let l=0,k=0,u=[],m=[e],y=new Set;for(;m.length>0;){let f=m.shift();if(!f||y.has(f))continue;y.add(f);let h=await promises.readdir(f,{withFileTypes:true});for(let w of h){if(!w.isDirectory()||w.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(w.name))continue;let b=o.join(f,w.name),g=a(b),$=o.join(g,".rapidkit","context.json"),D=o.join(g,".rapidkit","project.json");try{let S=false;try{await promises.access($),S=true;}catch{await promises.access(D),S=true;}if(S){let v=o.basename(g);s.projects.some(_=>_.path===g||_.name===v)?k++:(s.projects.push({name:v,path:g}),l++,u.push(g),t||console.log(`\u2714 Added: ${o.relative(e,g)}`));continue}}catch{}m.push(b);}}return l>0?(await promises.writeFile(p,JSON.stringify(n,null,2)),t||console.log(`
|
|
2
2
|
\u2705 Synced ${l} project(s) to registry`)):t||console.log(`
|
|
3
|
-
\u2705 All projects already registered (${k} found)`),{workspacePath:r,workspaceFound:true,added:
|
|
3
|
+
\u2705 All projects already registered (${k} found)`),{workspacePath:r,workspaceFound:true,added:u,skipped:k}}catch(c){return t||console.error("\u274C Failed to sync projects:",c.message),a$1}}async function ne(e,t,r){try{let a$1=a(e),c=a(r),p=j(),n=o.join(p,"workspaces.json"),s={workspaces:[]};try{let m=await promises.readFile(n,"utf8"),y=JSON.parse(m);y&&Array.isArray(y.workspaces)&&(s=P(y));}catch{return}let l=s.workspaces.find(m=>m.path===a$1);if(!l)return;Array.isArray(l.projects)||(l.projects=[]);let k=l.projects.findIndex(m=>m.path===c||m.name===t),u={name:t,path:c};if(k>=0){let m=l.projects[k];(m.name!==u.name||m.path!==u.path)&&(l.projects[k]=u,await promises.writeFile(n,JSON.stringify(s,null,2)));}else l.projects.push({name:t,path:c}),await promises.writeFile(n,JSON.stringify(s,null,2));}catch{}}async function se(e,t){let r=N("Creating RapidKit workspace...").start();try{await promises.mkdir(e,{recursive:true}),await promises.mkdir(o.join(e,".rapidkit"),{recursive:true});let a={workspace_name:t.name,author:t.author,rapidkit_version:b(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(o.join(e,".rapidkit","config.json"),JSON.stringify(a,null,2));let{syncWorkspaceFoundationFiles:c}=await import('./create-7R4CGABE.js');await c(e,{workspaceName:t.name,installMethod:"venv",writeMarker:true,writeGitignore:false,onlyIfMissing:true});let p=T();await promises.writeFile(o.join(e,"rapidkit"),p),await promises.chmod(o.join(e,"rapidkit"),493);let n=z();await promises.writeFile(o.join(e,"rapidkit.cmd"),n);let s=U(t.name);if(await promises.writeFile(o.join(e,"README.md"),s),await promises.writeFile(o.join(e,".gitignore"),`# RapidKit workspace
|
|
4
4
|
.env
|
|
5
5
|
.env.*
|
|
6
6
|
!.env.example
|
|
@@ -15,7 +15,7 @@ Thumbs.db
|
|
|
15
15
|
|
|
16
16
|
# Logs
|
|
17
17
|
*.log
|
|
18
|
-
`),await promises.writeFile(o.join(e,".rapidkit-workspace"),JSON.stringify({signature:"RAPIDKIT_WORKSPACE",createdBy:"rapidkit-npm",version:b(),createdAt:new Date().toISOString(),name:t.name},null,2)),await J(e),r.succeed("Workspace created!"),!t.skipGit){let k=
|
|
18
|
+
`),await promises.writeFile(o.join(e,".rapidkit-workspace"),JSON.stringify({signature:"RAPIDKIT_WORKSPACE",createdBy:"rapidkit-npm",version:b(),createdAt:new Date().toISOString(),name:t.name},null,2)),await J(e),r.succeed("Workspace created!"),!t.skipGit){let k=N("Initializing git repository...").start();try{await execa("git",["init"],{cwd:e}),await execa("git",["add","."],{cwd:e}),await execa("git",["commit","-m","Initial commit: RapidKit workspace"],{cwd:e}),k.succeed("Git repository initialized");}catch{k.warn("Could not initialize git repository");}}await B(e,t.name),console.log(`
|
|
19
19
|
${i.green("\u2728 RapidKit workspace created successfully!")}
|
|
20
20
|
|
|
21
21
|
${i.bold("\u{1F4C2} Workspace structure:")}
|
|
@@ -349,11 +349,11 @@ cmd_project() {
|
|
|
349
349
|
;;
|
|
350
350
|
dev)
|
|
351
351
|
echo -e "\${BLUE}\u{1F680} Starting development server...\${NC}"
|
|
352
|
-
$pm run
|
|
352
|
+
$pm run dev
|
|
353
353
|
;;
|
|
354
354
|
start)
|
|
355
355
|
echo -e "\${BLUE}\u26A1 Starting production server...\${NC}"
|
|
356
|
-
$pm run start
|
|
356
|
+
$pm run start
|
|
357
357
|
;;
|
|
358
358
|
build)
|
|
359
359
|
echo -e "\${BLUE}\u{1F4E6} Building project...\${NC}"
|
|
@@ -361,7 +361,7 @@ cmd_project() {
|
|
|
361
361
|
;;
|
|
362
362
|
test)
|
|
363
363
|
echo -e "\${BLUE}\u{1F9EA} Running tests...\${NC}"
|
|
364
|
-
$pm test
|
|
364
|
+
$pm run test
|
|
365
365
|
;;
|
|
366
366
|
lint)
|
|
367
367
|
echo -e "\${BLUE}\u{1F527} Running linter...\${NC}"
|
|
@@ -480,7 +480,7 @@ npx rapidkit dev # Start dev server
|
|
|
480
480
|
|
|
481
481
|
- [RapidKit Documentation](https://rapidkit.dev)
|
|
482
482
|
- [GitHub Repository](https://github.com/Baziar/rapidkit)
|
|
483
|
-
`}async function J(e){let{fileURLToPath:t}=await import('url'),r=t(import.meta.url),a=o.dirname(r),
|
|
483
|
+
`}async function J(e){let{fileURLToPath:t}=await import('url'),r=t(import.meta.url),a=o.dirname(r),c=o.resolve(a,".."),p=o.join(c,"templates","kits"),n=o.join(e,".rapidkit","templates"),{default:s}=await import('fs-extra');await s.copy(p,n);let l=o.join(c,"templates","generator.js"),k=o.join(e,".rapidkit","generator.js");await s.copy(l,k);}async function ce(e,t){let r=t.template==="fastapi",a=r?"FastAPI":"NestJS",c=N(`Creating ${a} project...`).start();try{let{fileURLToPath:p}=await import('url'),n=p(import.meta.url),s=o.dirname(n),l=o.resolve(s,".."),k=r?"fastapi-standard":"nestjs-standard",u=o.join(l,"templates","kits",k);await promises.mkdir(e,{recursive:true});let m={project_name:r?t.name.replace(/-/g,"_").toLowerCase():t.name.replace(/_/g,"-").toLowerCase(),author:t.author,description:t.description||`${a} application generated with RapidKit`,app_version:"0.1.0",license:"MIT",package_manager:t.package_manager||"npm",created_at:new Date().toISOString(),rapidkit_version:b()};await F(u,e,m);let y=r?`# Python
|
|
484
484
|
__pycache__/
|
|
485
485
|
*.py[cod]
|
|
486
486
|
*$py.class
|
|
@@ -548,7 +548,7 @@ Thumbs.db
|
|
|
548
548
|
|
|
549
549
|
# Coverage
|
|
550
550
|
coverage/
|
|
551
|
-
`;if(await promises.writeFile(o.join(e,".gitignore")
|
|
551
|
+
`;if(await promises.writeFile(o.join(e,".gitignore"),y),c.succeed(`${a} project created!`),!t.skipGit){let h=N("Initializing git repository...").start();try{await execa("git",["init"],{cwd:e}),await execa("git",["add","."],{cwd:e}),await execa("git",["commit","-m",`Initial commit: ${a} project via RapidKit`],{cwd:e}),h.succeed("Git repository initialized");}catch{h.warn("Could not initialize git repository");}}if(!t.skipInstall&&!r){let h=t.package_manager||"npm",w=N(`Installing dependencies with ${h}...`).start();try{await execa(h,["install"],{cwd:e}),w.succeed("Dependencies installed");}catch{w.warn(`Could not install dependencies. Run '${h} install' manually.`);}}let f=o.basename(e);console.log(r?`
|
|
552
552
|
${i.green("\u2728 FastAPI project created successfully!")}
|
|
553
553
|
|
|
554
554
|
${i.bold("\u{1F4C2} Project structure:")}
|
|
@@ -614,16 +614,16 @@ ${i.bold("\u{1F310} API endpoints:")}
|
|
|
614
614
|
http://localhost:8000/examples/notes # Example API
|
|
615
615
|
|
|
616
616
|
${i.gray("\u{1F4A1} Tip: Install globally (npm i -g rapidkit) to use without npx")}
|
|
617
|
-
`);}catch(
|
|
617
|
+
`);}catch(p){throw c.fail(`Failed to create ${a} project`),p}}async function F(e,t,r){let a=await promises.readdir(e,{withFileTypes:true});for(let c of a){let p=o.join(e,c.name),n=c.name.replace(/\.j2$/,""),s=o.join(t,n);if(c.isDirectory())await promises.mkdir(s,{recursive:true}),await F(p,s,r);else {let l=await promises.readFile(p,"utf-8");c.name.endsWith(".j2")&&(l=G(l,r)),await promises.writeFile(s,l),(n==="rapidkit"||n==="activate"||n.endsWith(".py")&&s.includes(".rapidkit"))&&await promises.chmod(s,493);}}}function G(e,t){let r=e;for(let[a,c]of Object.entries(t)){let p=new RegExp(`\\{\\{\\s*${a}\\s*\\}\\}`,"g");r=r.replace(p,String(c));let n=new RegExp(`\\{\\{\\s*${a}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\}\\}`,"g");r=r.replace(n,(k,u,m)=>String(c).replace(new RegExp(u,"g"),m));let s=new RegExp(`\\{\\{\\s*${a}\\s*\\|\\s*lower\\s*\\}\\}`,"g");r=r.replace(s,String(c).toLowerCase());let l=new RegExp(`\\{\\{\\s*${a}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\|\\s*lower\\s*\\}\\}`,"g");r=r.replace(l,(k,u,m)=>String(c).replace(new RegExp(u,"g"),m).toLowerCase());}return r}async function pe(){let e=j(),t=o.join(e,"workspaces.json");if(!await promises.stat(t).catch(()=>null)){console.log(i.yellow(`
|
|
618
618
|
\u26A0\uFE0F No workspaces registered yet.
|
|
619
619
|
`)),console.log(i.gray(`Create a workspace with: npx rapidkit <workspace-name>
|
|
620
620
|
`));return}try{let r=await promises.readFile(t,"utf8"),a=JSON.parse(r);if(!a||typeof a!="object"||!Array.isArray(a.workspaces)){console.log(i.yellow(`
|
|
621
621
|
\u26A0\uFE0F Workspace registry is invalid; resetting to empty state.
|
|
622
|
-
`)),await promises.writeFile(t,JSON.stringify({workspaces:[]},null,2));return}let
|
|
622
|
+
`)),await promises.writeFile(t,JSON.stringify({workspaces:[]},null,2));return}let c=P(a),p=[],n=0;for(let u of c.workspaces)await promises.stat(u.path).catch(()=>null)?p.push(u):n+=1;let s={workspaces:p},l=JSON.stringify(a),k=JSON.stringify(s);if(l!==k&&await promises.writeFile(t,JSON.stringify(s,null,2)),!s.workspaces||s.workspaces.length===0){console.log(i.yellow(`
|
|
623
623
|
\u26A0\uFE0F No workspaces registered yet.
|
|
624
|
-
`)),
|
|
624
|
+
`)),n>0&&console.log(i.gray(`Cleaned ${n} stale workspace entr${n===1?"y":"ies"}.
|
|
625
625
|
`));return}console.log(i.bold(`
|
|
626
626
|
\u{1F4E6} Registered RapidKit Workspaces:
|
|
627
|
-
`));for(let
|
|
627
|
+
`));for(let u of s.workspaces)console.log(i.cyan(` ${u.name}`)),console.log(i.gray(` Path: ${u.path}`)),console.log(i.gray(` Projects: ${u.projects?.length||0}`)),console.log();n>0&&console.log(i.gray(`Cleaned ${n} stale workspace entr${n===1?"y":"ies"}.`)),console.log(i.gray(`Total: ${s.workspaces.length} workspace(s)
|
|
628
628
|
`));}catch(r){console.error(i.red(`
|
|
629
|
-
\u274C Failed to read workspace registry`)),console.error(i.gray(String(r)));}}async function
|
|
629
|
+
\u274C Failed to read workspace registry`)),console.error(i.gray(String(r)));}}async function E(e){try{let t=await promises.readFile(e,"utf8");return JSON.parse(t)}catch{return null}}function K(e){return c(e)}async function M(e){return a$1(e,{skipDirs:new Set(["node_modules","dist","build","target","coverage","htmlcov"]),includeHiddenDirs:false,descendIntoMatchedProjects:true})}async function A(e){try{return (await promises.readdir(e,{withFileTypes:true})).filter(r=>r.isFile()&&r.name.toLowerCase().endsWith(".json")).map(r=>r.name).sort((r,a)=>r.localeCompare(a))}catch{return []}}async function de(e,t){let r=t?.includePaths===true,a=t?.includeDoctorEvidence!==false,c=t?.includeBlueprint!==false,p=o.resolve(e),n=await E(o.join(p,".rapidkit","workspace.json")),s=typeof n?.workspace_name=="string"&&n.workspace_name.trim()||o.basename(p),l=typeof n?.profile=="string"?n.profile:void 0,k=typeof n?.rapidkit_version=="string"?n.rapidkit_version:void 0,u=await M(p),m=[];for(let g of u){let $=await E(o.join(g,".rapidkit","project.json")),D=o.relative(p,g)||".",S=o.join(g,".rapidkit","reports"),v={name:o.basename(g),relative_path:D,runtime:typeof $?.runtime=="string"?$.runtime:void 0,kit_name:typeof $?.kit_name=="string"?$.kit_name:void 0,modules:Array.isArray($?.modules)?$.modules.filter(_=>typeof _=="string"):void 0};if(r&&(v.absolute_path=g),a){let _=await E(o.join(S,"doctor-last-run.json"));K(_)&&(v.doctor_report=_);}let W=await A(S);W.length>0&&(v.reports=W),m.push(v);}let y=o.join(p,".rapidkit","reports"),f=await A(y),h=await E(o.join(p,".rapidkit","workspace.contract.json")),w={schema_version:"1.1",generated_at:new Date().toISOString(),generated_by:"rapidkit-npm",workspace:{name:s,relative_root:".",profile:l,rapidkit_version:k,...r?{absolute_root:p}:{}},summary:{project_count:m.length,doctor_evidence_included:a,contract_included:!!h},reports:{workspace:f},projects:m,...h?{contract:h}:{}};c&&(w.blueprint={schema_version:"rapidkit.workspace-blueprint.v1",purpose:"portable-reproducibility",workspace:{name:s,profile:l},projects:m.map(g=>({name:g.name,relative_path:g.relative_path,runtime:g.runtime,kit_name:g.kit_name,modules:g.modules??[],recreate_commands:[...g.kit_name?[`npx rapidkit create project ${g.kit_name} ${g.name} --yes --skip-install`]:[],`cd ${g.relative_path}`,"npx rapidkit init","npx rapidkit test"]})),recommended_commands:["npx rapidkit workspace contract verify --strict","npx rapidkit doctor workspace","npx rapidkit workspace run init --json","npx rapidkit workspace run test --strict --json","npx rapidkit readiness --strict --json"]});let b=t?.outputPath?o.resolve(t.outputPath):o.join(y,"share-bundle.json");return await promises.mkdir(o.dirname(b),{recursive:true}),await promises.writeFile(b,JSON.stringify(w,null,2),"utf8"),b}export{B as a,oe as b,ne as c,se as d,ce as e,pe as f,de as g};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import c from'fs-extra';import*as n from'path';function d(e){return n.join(e,".rapidkit","imported-projects.json")}async function m(e){let o=d(e);if(!await c.pathExists(o))return [];try{let s=await c.readJSON(o);return (Array.isArray(s?.projects)?s.projects:[]).filter(i=>{if(!i||typeof i!="object")return false;let r=i;return typeof r.name=="string"&&typeof r.path=="string"&&typeof r.stack=="string"&&typeof r.confidence=="string"&&typeof r.importedAt=="string"})}catch{return []}}async function l(e,o){if(o.length===0)return;let s=await m(e),a=new Map;for(let t of s)a.set(t.path,t);for(let t of o)a.set(t.path,t);let i=Array.from(a.values()).sort((t,y)=>t.name.localeCompare(y.name)).map(t=>({...t})),r={version:1,updatedAt:new Date().toISOString(),projects:i},p=d(e);await c.ensureDir(n.dirname(p)),await c.writeJSON(p,r,{spaces:2});}async function j(e,o){if(o.length===0)return;let s=await m(e),a=new Set(o.map(t=>n.resolve(t))),i=s.filter(t=>!a.has(n.resolve(t.path))),r={version:1,updatedAt:new Date().toISOString(),projects:i},p=d(e);await c.ensureDir(n.dirname(p)),await c.writeJSON(p,r,{spaces:2});}export{m as a,l as b,j as c};
|