rapidkit 0.25.7 → 0.27.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 +34 -5
- package/dist/{create-27NVMJAR.js → create-3V7O72CO.js} +20 -15
- package/dist/demo-kit-HMJZ3A3M.js +141 -0
- package/dist/doctor-JEBQTQQE.js +38 -0
- package/dist/index.js +188 -169
- package/dist/package.json +4 -2
- package/dist/springboot-standard-AGTOOTNT.js +697 -0
- package/dist/{workspace-VXNLNKCM.js → workspace-7JHX7L3E.js} +86 -68
- package/package.json +4 -2
- package/dist/demo-kit-63CFMCPD.js +0 -141
- package/dist/doctor-P57TTWEP.js +0 -38
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {j}from'./chunk-Z5LKRG57.js';import {b as b$1}from'./chunk-Q7ULIFQA.js';import {promises}from'fs';import
|
|
2
|
-
\u2705 Synced ${
|
|
3
|
-
\u2705 All projects already registered (${
|
|
1
|
+
import {j as j$1}from'./chunk-Z5LKRG57.js';import {b as b$1}from'./chunk-Q7ULIFQA.js';import {promises}from'fs';import n from'path';import a from'chalk';import b from'ora';import {execa}from'execa';function j(e){let t=n.resolve(e);return process.platform==="win32"?t.toLowerCase():t}function I(e){let t=j(e.path),r=Array.isArray(e.projects)?e.projects:[],o=[],i=new Set;for(let s of r){if(!s||typeof s.name!="string"||typeof s.path!="string")continue;let c=j(s.path);i.has(c)||(i.add(c),o.push({name:s.name,path:c}));}return {name:e.name,path:t,mode:e.mode,projects:o}}function x(e){let t=[],r=new Set;for(let o of e.workspaces||[]){if(!o||typeof o.name!="string"||typeof o.path!="string")continue;let i=I(o);r.has(i.path)||(r.add(i.path),t.push(i));}return {workspaces:t}}async function A(e,t){try{let r=j(e),o=j$1(),i=n.join(o,"workspaces.json");await promises.mkdir(o,{recursive:true});let s={workspaces:[]};try{let p=await promises.readFile(i,"utf8"),d=JSON.parse(p);d&&Array.isArray(d.workspaces)&&(s=x(d));}catch{}s.workspaces.some(p=>p.path===r)||(s.workspaces.push({name:t,path:r,mode:"full",projects:[]}),await promises.writeFile(i,JSON.stringify(s,null,2)));}catch{console.warn(a.gray("Note: Could not register workspace in shared registry"));}}async function X(e,t=false){try{let r=j(e),o=j$1(),i=n.join(o,"workspaces.json"),s={workspaces:[]};try{let g=await promises.readFile(i,"utf8"),f=JSON.parse(g);f&&Array.isArray(f.workspaces)&&(s=x(f));}catch{t||console.log("\u26A0\uFE0F Workspace registry not found");return}let c=s.workspaces.find(g=>g.path===r);if(!c){t||console.log("\u26A0\uFE0F Workspace not registered in registry");return}Array.isArray(c.projects)||(c.projects=[]);let p=0,d=0,u=[e],m=new Set;for(;u.length>0;){let g=u.shift();if(!g||m.has(g))continue;m.add(g);let f=await promises.readdir(g,{withFileTypes:true});for(let y of f){if(!y.isDirectory()||y.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(y.name))continue;let k=n.join(g,y.name),h=j(k),v=n.join(h,".rapidkit","context.json"),E=n.join(h,".rapidkit","project.json");try{let _=false;try{await promises.access(v),_=true;}catch{await promises.access(E),_=true;}if(_){let $=n.basename(h);c.projects.some(R=>R.path===h||R.name===$)?d++:(c.projects.push({name:$,path:h}),p++,t||console.log(`\u2714 Added: ${n.relative(e,h)}`));continue}}catch{}u.push(k);}}p>0?(await promises.writeFile(i,JSON.stringify(s,null,2)),t||console.log(`
|
|
2
|
+
\u2705 Synced ${p} project(s) to registry`)):t||console.log(`
|
|
3
|
+
\u2705 All projects already registered (${d} found)`);}catch(r){t||console.error("\u274C Failed to sync projects:",r.message);}}async function Z(e,t,r){try{let o=j(e),i=j(r),s=j$1(),c=n.join(s,"workspaces.json"),p={workspaces:[]};try{let m=await promises.readFile(c,"utf8"),g=JSON.parse(m);g&&Array.isArray(g.workspaces)&&(p=x(g));}catch{return}let d=p.workspaces.find(m=>m.path===o);if(!d)return;Array.isArray(d.projects)||(d.projects=[]),d.projects.some(m=>m.path===i||m.name===t)||(d.projects.push({name:t,path:i}),await promises.writeFile(c,JSON.stringify(p,null,2)));}catch{}}async function ee(e,t){let r=b("Creating RapidKit workspace...").start();try{await promises.mkdir(e,{recursive:true}),await promises.mkdir(n.join(e,".rapidkit"),{recursive:true});let o={workspace_name:t.name,author:t.author,rapidkit_version:b$1(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(n.join(e,".rapidkit","config.json"),JSON.stringify(o,null,2));let{syncWorkspaceFoundationFiles:i}=await import('./create-3V7O72CO.js');await i(e,{workspaceName:t.name,installMethod:"venv",writeMarker:true,writeGitignore:false,onlyIfMissing:true});let s=F();await promises.writeFile(n.join(e,"rapidkit"),s),await promises.chmod(n.join(e,"rapidkit"),493);let c=O();await promises.writeFile(n.join(e,"rapidkit.cmd"),c);let p=B(t.name);if(await promises.writeFile(n.join(e,"README.md"),p),await promises.writeFile(n.join(e,".gitignore"),`# RapidKit workspace
|
|
4
4
|
.env
|
|
5
5
|
.env.*
|
|
6
6
|
!.env.example
|
|
@@ -15,38 +15,44 @@ Thumbs.db
|
|
|
15
15
|
|
|
16
16
|
# Logs
|
|
17
17
|
*.log
|
|
18
|
-
`),await promises.writeFile(
|
|
19
|
-
${
|
|
18
|
+
`),await promises.writeFile(n.join(e,".rapidkit-workspace"),JSON.stringify({signature:"RAPIDKIT_WORKSPACE",createdBy:"rapidkit-npm",version:b$1(),createdAt:new Date().toISOString(),name:t.name},null,2)),await T(e),r.succeed("Workspace created!"),!t.skipGit){let u=b("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}),u.succeed("Git repository initialized");}catch{u.warn("Could not initialize git repository");}}await A(e,t.name),console.log(`
|
|
19
|
+
${a.green("\u2728 RapidKit workspace created successfully!")}
|
|
20
20
|
|
|
21
|
-
${
|
|
21
|
+
${a.bold("\u{1F4C2} Workspace structure:")}
|
|
22
22
|
${e}/
|
|
23
23
|
\u251C\u2500\u2500 rapidkit # Local CLI wrapper
|
|
24
24
|
\u251C\u2500\u2500 rapidkit.cmd # Windows local CLI wrapper
|
|
25
25
|
\u251C\u2500\u2500 .rapidkit/ # Workspace configuration
|
|
26
|
-
\u2502 \u251C\u2500\u2500
|
|
27
|
-
\u2502 \
|
|
26
|
+
\u2502 \u251C\u2500\u2500 workspace.json # Workspace manifest
|
|
27
|
+
\u2502 \u251C\u2500\u2500 toolchain.lock # Runtime pinning
|
|
28
|
+
\u2502 \u251C\u2500\u2500 policies.yml # Enforcement policy
|
|
29
|
+
\u2502 \u251C\u2500\u2500 cache-config.yml# Cache policy
|
|
30
|
+
\u2502 \u2514\u2500\u2500 config.json # Legacy compatibility metadata
|
|
28
31
|
\u2514\u2500\u2500 README.md
|
|
29
32
|
|
|
30
|
-
${
|
|
31
|
-
${
|
|
32
|
-
${
|
|
33
|
-
${
|
|
34
|
-
${
|
|
35
|
-
${
|
|
36
|
-
|
|
37
|
-
${
|
|
38
|
-
fastapi
|
|
39
|
-
nestjs
|
|
40
|
-
|
|
41
|
-
|
|
33
|
+
${a.bold("\u{1F680} Get started:")}
|
|
34
|
+
${a.cyan(`cd ${t.name}`)}
|
|
35
|
+
${a.cyan("npx rapidkit my-api --template fastapi")}
|
|
36
|
+
${a.cyan("cd my-api")}
|
|
37
|
+
${a.cyan("npx rapidkit init")}
|
|
38
|
+
${a.cyan("npx rapidkit dev")}
|
|
39
|
+
|
|
40
|
+
${a.bold("\u{1F4E6} Available templates:")}
|
|
41
|
+
fastapi - FastAPI + Python
|
|
42
|
+
nestjs - NestJS + TypeScript
|
|
43
|
+
springboot - Spring Boot + Java
|
|
44
|
+
gofiber - Go Fiber
|
|
45
|
+
gogin - Go Gin
|
|
46
|
+
|
|
47
|
+
${a.bold("\u{1F4DA} Commands:")}
|
|
42
48
|
npx rapidkit <name> --template <type> Create a new project
|
|
43
49
|
npx rapidkit init Install dependencies
|
|
44
50
|
npx rapidkit dev Start dev server
|
|
45
51
|
npx rapidkit help Show all commands
|
|
46
52
|
|
|
47
|
-
${
|
|
48
|
-
${
|
|
49
|
-
`);}catch(
|
|
53
|
+
${a.gray("Alternative: ./rapidkit dev (Windows: .\\rapidkit.cmd dev), make dev")}
|
|
54
|
+
${a.gray("\u{1F4A1} Tip: Install globally (npm i -g rapidkit) to use without npx")}
|
|
55
|
+
`);}catch(o){throw r.fail("Failed to create workspace"),o}}function F(){return `#!/usr/bin/env bash
|
|
50
56
|
#
|
|
51
57
|
# RapidKit CLI - Local workspace commands
|
|
52
58
|
# This script provides rapidkit commands within the workspace
|
|
@@ -70,10 +76,14 @@ find_project_root() {
|
|
|
70
76
|
return 1
|
|
71
77
|
}
|
|
72
78
|
|
|
73
|
-
# Check if we're in a workspace (
|
|
79
|
+
# Check if we're in a workspace (modern marker first, legacy config fallback)
|
|
74
80
|
find_workspace_root() {
|
|
75
81
|
local dir="$PWD"
|
|
76
82
|
while [[ "$dir" != "/" ]]; do
|
|
83
|
+
if [[ -f "$dir/.rapidkit-workspace" ]]; then
|
|
84
|
+
echo "$dir"
|
|
85
|
+
return 0
|
|
86
|
+
fi
|
|
77
87
|
if [[ -f "$dir/.rapidkit/config.json" ]]; then
|
|
78
88
|
if grep -q '"type": "workspace"' "$dir/.rapidkit/config.json" 2>/dev/null; then
|
|
79
89
|
echo "$dir"
|
|
@@ -132,14 +142,17 @@ print_create_help() {
|
|
|
132
142
|
echo -e "\${BOLD}Usage:\${NC} rapidkit create <project-name> [options]"
|
|
133
143
|
echo ""
|
|
134
144
|
echo -e "\${BOLD}Options:\${NC}"
|
|
135
|
-
echo " -t, --template <name> Template to use (fastapi, nestjs)"
|
|
145
|
+
echo " -t, --template <name> Template to use (fastapi, nestjs, springboot, gofiber, gogin)"
|
|
136
146
|
echo " -y, --yes Skip prompts, use defaults"
|
|
137
147
|
echo " --skip-git Skip git initialization"
|
|
138
148
|
echo " --skip-install Skip dependency installation"
|
|
139
149
|
echo ""
|
|
140
150
|
echo -e "\${BOLD}Templates:\${NC}"
|
|
141
|
-
echo " fastapi
|
|
142
|
-
echo " nestjs
|
|
151
|
+
echo " fastapi FastAPI + Python (default)"
|
|
152
|
+
echo " nestjs NestJS + TypeScript"
|
|
153
|
+
echo " springboot Spring Boot + Java"
|
|
154
|
+
echo " gofiber Go Fiber"
|
|
155
|
+
echo " gogin Go Gin"
|
|
143
156
|
echo ""
|
|
144
157
|
echo -e "\${BOLD}Examples:\${NC}"
|
|
145
158
|
echo -e " \${CYAN}rapidkit create my-api\${NC}"
|
|
@@ -194,9 +207,9 @@ cmd_create() {
|
|
|
194
207
|
done
|
|
195
208
|
|
|
196
209
|
# Validate template
|
|
197
|
-
if [[ "$template" != "fastapi" && "$template" != "nestjs" ]]; then
|
|
210
|
+
if [[ "$template" != "fastapi" && "$template" != "nestjs" && "$template" != "springboot" && "$template" != "spring" && "$template" != "gofiber" && "$template" != "gogin" && "$template" != "go" && "$template" != "fiber" && "$template" != "gin" && "$template" != "java" ]]; then
|
|
198
211
|
echo -e "\${RED}\u274C Invalid template: $template\${NC}"
|
|
199
|
-
|
|
212
|
+
echo -e "Available templates: fastapi, nestjs, springboot, gofiber, gogin"
|
|
200
213
|
exit 1
|
|
201
214
|
fi
|
|
202
215
|
|
|
@@ -231,14 +244,19 @@ cmd_create() {
|
|
|
231
244
|
echo -e "\${BLUE}\${BOLD}\u{1F680} Creating $template project: $project_name\${NC}"
|
|
232
245
|
echo ""
|
|
233
246
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
247
|
+
local normalized_template="$template"
|
|
248
|
+
case "$template" in
|
|
249
|
+
fastapi) normalized_template="fastapi.standard" ;;
|
|
250
|
+
nestjs) normalized_template="nestjs.standard" ;;
|
|
251
|
+
spring|springboot|java) normalized_template="springboot.standard" ;;
|
|
252
|
+
go|fiber|gofiber) normalized_template="gofiber.standard" ;;
|
|
253
|
+
gin|gogin) normalized_template="gogin.standard" ;;
|
|
254
|
+
esac
|
|
255
|
+
|
|
256
|
+
if command -v rapidkit >/dev/null 2>&1; then
|
|
257
|
+
rapidkit create project "$normalized_template" "$project_name" $yes_flag $skip_git $skip_install
|
|
239
258
|
else
|
|
240
|
-
|
|
241
|
-
exit 1
|
|
259
|
+
npx rapidkit create project "$normalized_template" "$project_name" $yes_flag $skip_git $skip_install
|
|
242
260
|
fi
|
|
243
261
|
}
|
|
244
262
|
|
|
@@ -394,7 +412,7 @@ main() {
|
|
|
394
412
|
}
|
|
395
413
|
|
|
396
414
|
main "$@"
|
|
397
|
-
`}function
|
|
415
|
+
`}function O(){return `@echo off
|
|
398
416
|
setlocal enabledelayedexpansion
|
|
399
417
|
|
|
400
418
|
set "SCRIPT_DIR=%~dp0"
|
|
@@ -414,7 +432,7 @@ if %ERRORLEVEL%==0 (
|
|
|
414
432
|
echo [RapidKit] No sh/bash found. Falling back to npx rapidkit.
|
|
415
433
|
npx rapidkit %*
|
|
416
434
|
exit /b %ERRORLEVEL%
|
|
417
|
-
`}function
|
|
435
|
+
`}function B(e){return `# ${e}
|
|
418
436
|
|
|
419
437
|
RapidKit workspace for building API projects.
|
|
420
438
|
|
|
@@ -462,7 +480,7 @@ npx rapidkit dev # Start dev server
|
|
|
462
480
|
|
|
463
481
|
- [RapidKit Documentation](https://rapidkit.dev)
|
|
464
482
|
- [GitHub Repository](https://github.com/Baziar/rapidkit)
|
|
465
|
-
`}async function
|
|
483
|
+
`}async function T(e){let{fileURLToPath:t}=await import('url'),r=t(import.meta.url),o=n.dirname(r),i=n.resolve(o,".."),s=n.join(i,"templates","kits"),c=n.join(e,".rapidkit","templates"),{default:p}=await import('fs-extra');await p.copy(s,c);let d=n.join(i,"templates","generator.js"),u=n.join(e,".rapidkit","generator.js");await p.copy(d,u);}async function te(e,t){let r=t.template==="fastapi",o=r?"FastAPI":"NestJS",i=b(`Creating ${o} project...`).start();try{let{fileURLToPath:s}=await import('url'),c=s(import.meta.url),p=n.dirname(c),d=n.resolve(p,".."),u=r?"fastapi-standard":"nestjs-standard",m=n.join(d,"templates","kits",u);await promises.mkdir(e,{recursive:true});let g={project_name:r?t.name.replace(/-/g,"_").toLowerCase():t.name.replace(/_/g,"-").toLowerCase(),author:t.author,description:t.description||`${o} 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$1()};await W(m,e,g);let f=r?`# Python
|
|
466
484
|
__pycache__/
|
|
467
485
|
*.py[cod]
|
|
468
486
|
*$py.class
|
|
@@ -530,10 +548,10 @@ Thumbs.db
|
|
|
530
548
|
|
|
531
549
|
# Coverage
|
|
532
550
|
coverage/
|
|
533
|
-
`;if(await promises.writeFile(
|
|
534
|
-
${
|
|
551
|
+
`;if(await promises.writeFile(n.join(e,".gitignore"),f),i.succeed(`${o} project created!`),!t.skipGit){let k=b("Initializing git repository...").start();try{await execa("git",["init"],{cwd:e}),await execa("git",["add","."],{cwd:e}),await execa("git",["commit","-m",`Initial commit: ${o} project via RapidKit`],{cwd:e}),k.succeed("Git repository initialized");}catch{k.warn("Could not initialize git repository");}}if(!t.skipInstall&&!r){let k=t.package_manager||"npm",h=b(`Installing dependencies with ${k}...`).start();try{await execa(k,["install"],{cwd:e}),h.succeed("Dependencies installed");}catch{h.warn(`Could not install dependencies. Run '${k} install' manually.`);}}let y=n.basename(e);console.log(r?`
|
|
552
|
+
${a.green("\u2728 FastAPI project created successfully!")}
|
|
535
553
|
|
|
536
|
-
${
|
|
554
|
+
${a.bold("\u{1F4C2} Project structure:")}
|
|
537
555
|
${e}/
|
|
538
556
|
\u251C\u2500\u2500 .rapidkit/ # RapidKit CLI module
|
|
539
557
|
\u251C\u2500\u2500 src/
|
|
@@ -545,12 +563,12 @@ ${e}/
|
|
|
545
563
|
\u251C\u2500\u2500 pyproject.toml # Poetry configuration
|
|
546
564
|
\u2514\u2500\u2500 README.md
|
|
547
565
|
|
|
548
|
-
${
|
|
549
|
-
${
|
|
550
|
-
${
|
|
551
|
-
${
|
|
566
|
+
${a.bold("\u{1F680} Get started:")}
|
|
567
|
+
${a.cyan(`cd ${y}`)}
|
|
568
|
+
${a.cyan("npx rapidkit init")} ${a.gray("# Install dependencies")}
|
|
569
|
+
${a.cyan("npx rapidkit dev")} ${a.gray("# Start dev server")}
|
|
552
570
|
|
|
553
|
-
${
|
|
571
|
+
${a.bold("\u{1F4DA} Available commands:")}
|
|
554
572
|
npx rapidkit init # Install dependencies (poetry install)
|
|
555
573
|
npx rapidkit dev # Start dev server with hot reload
|
|
556
574
|
npx rapidkit start # Start production server
|
|
@@ -558,12 +576,12 @@ ${r.bold("\u{1F4DA} Available commands:")}
|
|
|
558
576
|
npx rapidkit lint # Lint code
|
|
559
577
|
npx rapidkit format # Format code
|
|
560
578
|
|
|
561
|
-
${
|
|
562
|
-
${
|
|
579
|
+
${a.gray("Alternative: make dev, ./rapidkit dev, poetry run dev")}
|
|
580
|
+
${a.gray("\u{1F4A1} Tip: Install globally (npm i -g rapidkit) to use without npx")}
|
|
563
581
|
`:`
|
|
564
|
-
${
|
|
582
|
+
${a.green("\u2728 NestJS project created successfully!")}
|
|
565
583
|
|
|
566
|
-
${
|
|
584
|
+
${a.bold("\u{1F4C2} Project structure:")}
|
|
567
585
|
${e}/
|
|
568
586
|
\u251C\u2500\u2500 .rapidkit/ # RapidKit CLI module
|
|
569
587
|
\u251C\u2500\u2500 src/
|
|
@@ -575,13 +593,13 @@ ${e}/
|
|
|
575
593
|
\u251C\u2500\u2500 package.json # Dependencies
|
|
576
594
|
\u2514\u2500\u2500 README.md
|
|
577
595
|
|
|
578
|
-
${
|
|
579
|
-
${
|
|
580
|
-
${t.skipInstall?
|
|
581
|
-
`:""}${
|
|
582
|
-
${
|
|
596
|
+
${a.bold("\u{1F680} Get started:")}
|
|
597
|
+
${a.cyan(`cd ${y}`)}
|
|
598
|
+
${t.skipInstall?a.cyan("npx rapidkit init")+a.gray(" # npm install")+`
|
|
599
|
+
`:""}${a.cyan("cp .env.example .env")}
|
|
600
|
+
${a.cyan("npx rapidkit dev")} ${a.gray("# Start dev server")}
|
|
583
601
|
|
|
584
|
-
${
|
|
602
|
+
${a.bold("\u{1F4DA} Available commands:")}
|
|
585
603
|
npx rapidkit init # Install dependencies
|
|
586
604
|
npx rapidkit dev # Start dev server with hot reload
|
|
587
605
|
npx rapidkit start # Start production server
|
|
@@ -590,22 +608,22 @@ ${r.bold("\u{1F4DA} Available commands:")}
|
|
|
590
608
|
npx rapidkit lint # Lint code
|
|
591
609
|
npx rapidkit format # Format code
|
|
592
610
|
|
|
593
|
-
${
|
|
611
|
+
${a.bold("\u{1F310} API endpoints:")}
|
|
594
612
|
http://localhost:8000/health # Health check
|
|
595
613
|
http://localhost:8000/docs # Swagger docs
|
|
596
614
|
http://localhost:8000/examples/notes # Example API
|
|
597
615
|
|
|
598
|
-
${
|
|
599
|
-
`);}catch(s){throw
|
|
616
|
+
${a.gray("\u{1F4A1} Tip: Install globally (npm i -g rapidkit) to use without npx")}
|
|
617
|
+
`);}catch(s){throw i.fail(`Failed to create ${o} project`),s}}async function W(e,t,r){let o=await promises.readdir(e,{withFileTypes:true});for(let i of o){let s=n.join(e,i.name),c=i.name.replace(/\.j2$/,""),p=n.join(t,c);if(i.isDirectory())await promises.mkdir(p,{recursive:true}),await W(s,p,r);else {let d=await promises.readFile(s,"utf-8");i.name.endsWith(".j2")&&(d=z(d,r)),await promises.writeFile(p,d),(c==="rapidkit"||c==="activate"||c.endsWith(".py")&&p.includes(".rapidkit"))&&await promises.chmod(p,493);}}}function z(e,t){let r=e;for(let[o,i]of Object.entries(t)){let s=new RegExp(`\\{\\{\\s*${o}\\s*\\}\\}`,"g");r=r.replace(s,String(i));let c=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\}\\}`,"g");r=r.replace(c,(u,m,g)=>String(i).replace(new RegExp(m,"g"),g));let p=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*lower\\s*\\}\\}`,"g");r=r.replace(p,String(i).toLowerCase());let d=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\|\\s*lower\\s*\\}\\}`,"g");r=r.replace(d,(u,m,g)=>String(i).replace(new RegExp(m,"g"),g).toLowerCase());}return r}async function re(){let e=j$1(),t=n.join(e,"workspaces.json");if(!await promises.stat(t).catch(()=>null)){console.log(a.yellow(`
|
|
600
618
|
\u26A0\uFE0F No workspaces registered yet.
|
|
601
|
-
`)),console.log(
|
|
602
|
-
`));return}try{let
|
|
619
|
+
`)),console.log(a.gray(`Create a workspace with: npx rapidkit <workspace-name>
|
|
620
|
+
`));return}try{let r=await promises.readFile(t,"utf8"),o=JSON.parse(r);if(!o||typeof o!="object"||!Array.isArray(o.workspaces)){console.log(a.yellow(`
|
|
603
621
|
\u26A0\uFE0F Workspace registry is invalid; resetting to empty state.
|
|
604
|
-
`)),await promises.writeFile(t,JSON.stringify({workspaces:[]},null,2));return}let
|
|
622
|
+
`)),await promises.writeFile(t,JSON.stringify({workspaces:[]},null,2));return}let i=x(o),s=[],c=0;for(let m of i.workspaces)await promises.stat(m.path).catch(()=>null)?s.push(m):c+=1;let p={workspaces:s},d=JSON.stringify(o),u=JSON.stringify(p);if(d!==u&&await promises.writeFile(t,JSON.stringify(p,null,2)),!p.workspaces||p.workspaces.length===0){console.log(a.yellow(`
|
|
605
623
|
\u26A0\uFE0F No workspaces registered yet.
|
|
606
|
-
`)),
|
|
607
|
-
`));return}console.log(
|
|
624
|
+
`)),c>0&&console.log(a.gray(`Cleaned ${c} stale workspace entr${c===1?"y":"ies"}.
|
|
625
|
+
`));return}console.log(a.bold(`
|
|
608
626
|
\u{1F4E6} Registered RapidKit Workspaces:
|
|
609
|
-
`));for(let
|
|
610
|
-
`));}catch(
|
|
611
|
-
\u274C Failed to read workspace registry`)),console.error(
|
|
627
|
+
`));for(let m of p.workspaces)console.log(a.cyan(` ${m.name}`)),console.log(a.gray(` Path: ${m.path}`)),console.log(a.gray(` Projects: ${m.projects?.length||0}`)),console.log();c>0&&console.log(a.gray(`Cleaned ${c} stale workspace entr${c===1?"y":"ies"}.`)),console.log(a.gray(`Total: ${p.workspaces.length} workspace(s)
|
|
628
|
+
`));}catch(r){console.error(a.red(`
|
|
629
|
+
\u274C Failed to read workspace registry`)),console.error(a.gray(String(r)));}}async function P(e){try{let t=await promises.readFile(e,"utf8");return JSON.parse(t)}catch{return null}}async function D(e){try{return await promises.access(e),true}catch{return false}}async function U(e){let t=[],r=[e],o=new Set;for(;r.length>0;){let i=r.shift();if(!i||o.has(i))continue;o.add(i);let s=[];try{s=await promises.readdir(i,{withFileTypes:true});}catch{continue}for(let c of s){if(!c.isDirectory()||c.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(c.name))continue;let p=n.join(i,c.name),d=await D(n.join(p,".rapidkit","context.json")),u=await D(n.join(p,".rapidkit","project.json"));(d||u)&&t.push(p),r.push(p);}}return t.sort((i,s)=>i.localeCompare(s))}async function L(e){try{return (await promises.readdir(e,{withFileTypes:true})).filter(r=>r.isFile()&&r.name.toLowerCase().endsWith(".json")).map(r=>r.name).sort((r,o)=>r.localeCompare(o))}catch{return []}}async function ie(e,t){let r=t?.includePaths===true,o=t?.includeDoctorEvidence!==false,i=n.resolve(e),s=await P(n.join(i,".rapidkit","workspace.json")),c=typeof s?.workspace_name=="string"&&s.workspace_name.trim()||n.basename(i),p=typeof s?.profile=="string"?s.profile:void 0,d=typeof s?.rapidkit_version=="string"?s.rapidkit_version:void 0,u=await U(i),m=[];for(let h of u){let v=await P(n.join(h,".rapidkit","project.json")),E=n.relative(i,h)||".",_=n.join(h,".rapidkit","reports"),$={name:n.basename(h),relative_path:E,runtime:typeof v?.runtime=="string"?v.runtime:void 0,kit_name:typeof v?.kit_name=="string"?v.kit_name:void 0};if(r&&($.absolute_path=h),o){let R=await P(n.join(_,"doctor-last-run.json"));R&&($.doctor_report=R);}let N=await L(_);N.length>0&&($.reports=N),m.push($);}let g=n.join(i,".rapidkit","reports"),f=await L(g),y={schema_version:"1.0",generated_at:new Date().toISOString(),generated_by:"rapidkit-npm",workspace:{name:c,relative_root:".",profile:p,rapidkit_version:d,...r?{absolute_root:i}:{}},summary:{project_count:m.length,doctor_evidence_included:o},reports:{workspace:f},projects:m},k=t?.outputPath?n.resolve(t.outputPath):n.join(g,"share-bundle.json");return await promises.mkdir(n.dirname(k),{recursive:true}),await promises.writeFile(k,JSON.stringify(y,null,2),"utf8"),k}export{te as createProject,ee as createWorkspace,ie as createWorkspaceShareBundle,re as listWorkspaces,Z as registerProjectInWorkspace,A as registerWorkspace,X as syncWorkspaceProjects};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rapidkit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.27.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Official CLI for RapidKit, an open-source workspace platform that standardizes how teams build, scale, and deploy backend services.",
|
|
6
6
|
"keywords": [
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
"create",
|
|
12
12
|
"fastapi",
|
|
13
13
|
"nestjs",
|
|
14
|
+
"springboot",
|
|
15
|
+
"spring",
|
|
14
16
|
"gofiber",
|
|
15
17
|
"gogin",
|
|
16
18
|
"backend",
|
|
@@ -69,7 +71,7 @@
|
|
|
69
71
|
"sync:contracts": "node scripts/sync-contracts.mjs",
|
|
70
72
|
"check:contracts": "node scripts/sync-contracts.mjs --check",
|
|
71
73
|
"bundle-size": "npm run build && du -sh dist/ && ls -lh dist/",
|
|
72
|
-
"analyze": "npm run build &&
|
|
74
|
+
"analyze": "npm run build && node scripts/analyze-dist.mjs",
|
|
73
75
|
"size-check": "npm run build && size-limit",
|
|
74
76
|
"bench": "npx tsx scripts/benchmarks.ts",
|
|
75
77
|
"quality": "npm run typecheck && npm run lint && npm run format:check && npm test && npm run size-check",
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import {b}from'./chunk-Q7ULIFQA.js';import {promises}from'fs';import a from'path';import F from'nunjucks';import t from'chalk';import _ from'ora';import {fileURLToPath}from'url';import {execa}from'execa';import R from'crypto';var D=fileURLToPath(import.meta.url),E=a.dirname(D);function C(i=32){let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",d=R.randomBytes(i),r="";for(let p=0;p<i;p++)r+=e[d[p]%e.length];return r}async function B(i,e){let d=e.template||"fastapi",r=d==="fastapi",p=r?"FastAPI":"NestJS",v=_(`Generating ${p} project...`).start();try{let u=a.resolve(E,".."),h=e.kit_name||`${d}.standard`,l;h==="fastapi.ddd"?l="fastapi-ddd":h.startsWith("fastapi")?l="fastapi-standard":l="nestjs-standard";let k=a.join(u,"templates","kits",l),x=F.configure(k,{autoescape:false,trimBlocks:true,lstripBlocks:true});x.addFilter("generate_secret",function(n,s=32){return C(s)});let I={project_name:e.project_name,author:e.author||"RapidKit User",description:e.description||(r?"FastAPI service generated with RapidKit":"NestJS application generated with RapidKit"),app_version:e.app_version||"0.1.0",license:e.license||"MIT",package_manager:e.package_manager||"npm",node_version:e.node_version||"20.0.0",database_type:e.database_type||"postgresql",include_caching:e.include_caching||false,created_at:new Date().toISOString(),rapidkit_version:b()},j;r?j=["src/main.py.j2","src/__init__.py.j2","src/cli.py.j2","src/routing/__init__.py.j2","src/routing/health.py.j2","src/modules/__init__.py.j2","tests/__init__.py.j2","README.md.j2","pyproject.toml.j2","Makefile.j2",".rapidkit/__init__.py.j2",".rapidkit/project.json.j2",".rapidkit/cli.py.j2",".rapidkit/rapidkit.j2",".rapidkit/activate.j2","rapidkit.j2","rapidkit.cmd.j2"]:j=["src/main.ts.j2","src/app.module.ts.j2","src/app.controller.ts.j2","src/app.service.ts.j2","src/config/configuration.ts.j2","src/config/validation.ts.j2","src/config/index.ts.j2","src/modules/index.ts.j2","src/examples/examples.module.ts.j2","src/examples/examples.controller.ts.j2","src/examples/examples.service.ts.j2","src/examples/dto/create-note.dto.ts.j2","test/app.controller.spec.ts.j2","test/examples.controller.spec.ts.j2","test/app.e2e-spec.ts.j2","test/jest-e2e.json.j2","package.json.j2","tsconfig.json.j2","tsconfig.build.json.j2","nest-cli.json.j2","jest.config.ts.j2","eslint.config.cjs.j2",".env.example.j2","docker-compose.yml.j2","Dockerfile.j2","README.md.j2",".rapidkit/project.json.j2",".rapidkit/rapidkit.j2",".rapidkit/rapidkit.cmd.j2",".rapidkit/activate.j2","rapidkit.j2","rapidkit.cmd.j2"];for(let n of j){let s=a.join(k,n);try{await promises.access(s);}catch{continue}let y=await promises.readFile(s,"utf-8"),m;try{m=x.renderString(y,I);}catch(S){throw console.error(`Failed to render template: ${n}`),S}let c=n.replace(/\.j2$/,""),f=a.join(i,c);await promises.mkdir(a.dirname(f),{recursive:true}),await promises.writeFile(f,m),(c.endsWith(".rapidkit/rapidkit")||c.endsWith(".rapidkit/cli.py")||c.endsWith(".rapidkit/activate")||c==="rapidkit")&&await promises.chmod(f,493);}if(r){let n=a.join(k,".rapidkit","context.json"),s=a.join(i,".rapidkit","context.json");try{await promises.mkdir(a.join(i,".rapidkit"),{recursive:true}),await promises.copyFile(n,s);}catch{await promises.mkdir(a.join(i,".rapidkit"),{recursive:true});let m=e.engine||"pip";await promises.writeFile(s,JSON.stringify({engine:m,created_by:"rapidkit-npm-fallback"},null,2));}}let b$1=r?`# Python
|
|
2
|
-
__pycache__/
|
|
3
|
-
*.py[cod]
|
|
4
|
-
*$py.class
|
|
5
|
-
*.so
|
|
6
|
-
.Python
|
|
7
|
-
build/
|
|
8
|
-
develop-eggs/
|
|
9
|
-
dist/
|
|
10
|
-
downloads/
|
|
11
|
-
eggs/
|
|
12
|
-
.eggs/
|
|
13
|
-
lib/
|
|
14
|
-
lib64/
|
|
15
|
-
parts/
|
|
16
|
-
sdist/
|
|
17
|
-
var/
|
|
18
|
-
wheels/
|
|
19
|
-
*.egg-info/
|
|
20
|
-
.installed.cfg
|
|
21
|
-
*.egg
|
|
22
|
-
|
|
23
|
-
# Virtual environments
|
|
24
|
-
.venv/
|
|
25
|
-
venv/
|
|
26
|
-
ENV/
|
|
27
|
-
env/
|
|
28
|
-
|
|
29
|
-
# IDEs
|
|
30
|
-
.vscode/
|
|
31
|
-
.idea/
|
|
32
|
-
*.swp
|
|
33
|
-
*.swo
|
|
34
|
-
*~
|
|
35
|
-
|
|
36
|
-
# OS
|
|
37
|
-
.DS_Store
|
|
38
|
-
Thumbs.db
|
|
39
|
-
|
|
40
|
-
# Project specific
|
|
41
|
-
.env
|
|
42
|
-
.env.local
|
|
43
|
-
`:`# Node artifacts
|
|
44
|
-
node_modules/
|
|
45
|
-
dist/
|
|
46
|
-
.tmp/
|
|
47
|
-
.env
|
|
48
|
-
.env.*
|
|
49
|
-
!.env.example
|
|
50
|
-
|
|
51
|
-
# Logs
|
|
52
|
-
logs/
|
|
53
|
-
*.log
|
|
54
|
-
npm-debug.log*
|
|
55
|
-
yarn-debug.log*
|
|
56
|
-
yarn-error.log*
|
|
57
|
-
pnpm-debug.log*
|
|
58
|
-
|
|
59
|
-
# OS
|
|
60
|
-
.DS_Store
|
|
61
|
-
Thumbs.db
|
|
62
|
-
|
|
63
|
-
# IDEs
|
|
64
|
-
.idea/
|
|
65
|
-
.vscode/
|
|
66
|
-
|
|
67
|
-
# Coverage
|
|
68
|
-
coverage/
|
|
69
|
-
`;if(await promises.writeFile(a.join(i,".gitignore"),b$1),v.succeed(`${p} project generated!`),!e.skipGit){let n=_("Initializing git repository...").start();try{await execa("git",["init"],{cwd:i}),await execa("git",["add","."],{cwd:i}),await execa("git",["commit","-m",`Initial commit: ${p} project via RapidKit`],{cwd:i}),n.succeed("Git repository initialized");}catch{n.warn("Could not initialize git repository");}}if(!r&&!e.skipInstall){let n=e.package_manager||"npm",s=_(`Installing dependencies with ${n}...`).start();try{await execa(n,n==="yarn"?["install"]:n==="pnpm"?["install"]:["install"],{cwd:i}),s.succeed("Dependencies installed");}catch{s.warn(`Could not install dependencies. Run '${n} install' manually.`);}}let w=a.basename(i);console.log(`
|
|
70
|
-
${t.yellow("\u26A0\uFE0F Limited offline mode:")} This project was created using basic templates.
|
|
71
|
-
${t.gray("For full kit features, install Python 3.10+ and rapidkit-core:")}
|
|
72
|
-
${t.cyan(" sudo apt install python3 python3-pip python3-venv")}
|
|
73
|
-
${t.cyan(" pip install rapidkit-core")}
|
|
74
|
-
`),console.log(r?`
|
|
75
|
-
${t.green("\u2728 FastAPI project created successfully!")}
|
|
76
|
-
|
|
77
|
-
${t.bold("\u{1F4C2} Project structure:")}
|
|
78
|
-
${i}/
|
|
79
|
-
\u251C\u2500\u2500 .rapidkit/ # RapidKit CLI module
|
|
80
|
-
\u251C\u2500\u2500 src/
|
|
81
|
-
\u2502 \u251C\u2500\u2500 main.py # FastAPI application
|
|
82
|
-
\u2502 \u251C\u2500\u2500 cli.py # CLI commands
|
|
83
|
-
\u2502 \u251C\u2500\u2500 routing/ # API routes
|
|
84
|
-
\u2502 \u2514\u2500\u2500 modules/ # Module system
|
|
85
|
-
\u251C\u2500\u2500 tests/ # Test suite
|
|
86
|
-
\u251C\u2500\u2500 pyproject.toml # Poetry configuration
|
|
87
|
-
\u2514\u2500\u2500 README.md
|
|
88
|
-
|
|
89
|
-
${t.bold("\u{1F680} Get started:")}
|
|
90
|
-
${t.cyan(`cd ${w}`)}
|
|
91
|
-
${t.cyan("npx rapidkit init")} ${t.gray("# Install dependencies")}
|
|
92
|
-
${t.cyan("npx rapidkit dev")} ${t.gray("# Start dev server")}
|
|
93
|
-
|
|
94
|
-
${t.bold("\u{1F4DA} Available commands:")}
|
|
95
|
-
npx rapidkit init # Install dependencies (poetry install)
|
|
96
|
-
npx rapidkit dev # Start dev server with hot reload
|
|
97
|
-
npx rapidkit start # Start production server
|
|
98
|
-
npx rapidkit test # Run tests
|
|
99
|
-
npx rapidkit lint # Lint code
|
|
100
|
-
npx rapidkit format # Format code
|
|
101
|
-
|
|
102
|
-
${t.gray("Alternative: make dev, ./rapidkit dev, poetry run dev")}
|
|
103
|
-
${t.gray("\u{1F4A1} Tip: Install globally (npm i -g rapidkit) to use without npx")}
|
|
104
|
-
`:`
|
|
105
|
-
${t.green("\u2728 NestJS project created successfully!")}
|
|
106
|
-
|
|
107
|
-
${t.bold("\u{1F4C2} Project structure:")}
|
|
108
|
-
${i}/
|
|
109
|
-
\u251C\u2500\u2500 .rapidkit/ # RapidKit CLI module
|
|
110
|
-
\u251C\u2500\u2500 src/
|
|
111
|
-
\u2502 \u251C\u2500\u2500 main.ts # Application entry point
|
|
112
|
-
\u2502 \u251C\u2500\u2500 app.module.ts # Root module
|
|
113
|
-
\u2502 \u251C\u2500\u2500 config/ # Configuration
|
|
114
|
-
\u2502 \u2514\u2500\u2500 examples/ # Example module
|
|
115
|
-
\u251C\u2500\u2500 test/ # Test files
|
|
116
|
-
\u251C\u2500\u2500 package.json # Dependencies
|
|
117
|
-
\u2514\u2500\u2500 README.md
|
|
118
|
-
|
|
119
|
-
${t.bold("\u{1F680} Get started:")}
|
|
120
|
-
${t.cyan(`cd ${w}`)}
|
|
121
|
-
${t.cyan("npx rapidkit init")} ${t.gray("# Install dependencies")}
|
|
122
|
-
${t.cyan("cp .env.example .env")}
|
|
123
|
-
${t.cyan("npx rapidkit dev")} ${t.gray("# Start dev server")}
|
|
124
|
-
|
|
125
|
-
${t.bold("\u{1F4DA} Available commands:")}
|
|
126
|
-
npx rapidkit init # Install dependencies
|
|
127
|
-
npx rapidkit dev # Start dev server with hot reload
|
|
128
|
-
npx rapidkit start # Start production server
|
|
129
|
-
npx rapidkit build # Build for production
|
|
130
|
-
npx rapidkit test # Run tests
|
|
131
|
-
npx rapidkit lint # Lint code
|
|
132
|
-
npx rapidkit format # Format code
|
|
133
|
-
|
|
134
|
-
${t.bold("\u{1F310} API endpoints:")}
|
|
135
|
-
http://localhost:8000/health # Health check
|
|
136
|
-
http://localhost:8000/docs # Swagger docs
|
|
137
|
-
http://localhost:8000/examples/notes # Example API
|
|
138
|
-
|
|
139
|
-
${t.gray("Alternative: npm run start:dev, ./rapidkit dev")}
|
|
140
|
-
${t.gray("\u{1F4A1} Tip: Install globally (npm i -g rapidkit) to use without npx")}
|
|
141
|
-
`);}catch(u){throw v.fail(`Failed to generate ${p} project`),u}}export{B as generateDemoKit};
|
package/dist/doctor-P57TTWEP.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import {b,f,d as d$1,a as a$1,k,g,i as i$1}from'./chunk-Z5LKRG57.js';import {a}from'./chunk-VM2TOHNX.js';import i from'chalk';import {execa}from'execa';import d from'fs-extra';import l from'path';import U from'inquirer';function Q(e){return [...new Set(e.filter(s=>s&&s.trim().length>0))]}function B(){let e=k().map(r=>l.join(r,a$1()?"poetry.exe":"poetry")),s=a$1()?[l.join(process.env.APPDATA||"","Python","Scripts","poetry.exe"),l.join(process.env.USERPROFILE||"","AppData","Roaming","Python","Scripts","poetry.exe")]:[],t=a$1()?[]:["/usr/local/bin/poetry","/usr/bin/poetry"];return Q([...e,...s,...t])}function z(e){let s=k().map(n=>({location:"Global (user-local)",path:l.join(n,a$1()?"rapidkit.exe":"rapidkit")})),t=[{location:"Global (pipx)",path:l.join(e,".local","bin","rapidkit")},{location:"Global (pipx)",path:l.join(e,"AppData","Roaming","Python","Scripts","rapidkit.exe")},{location:"Global (pyenv)",path:l.join(e,".pyenv","shims","rapidkit")},{location:"Global (system)",path:"/usr/local/bin/rapidkit"},{location:"Global (system)",path:"/usr/bin/rapidkit"}],r=g(l.join(process.cwd(),".venv")),o=i$1(process.cwd()),c=[{location:"Workspace (.venv)",path:r},...o.map(n=>({location:"Workspace (launcher)",path:n}))],u=[...s,...t,...c],a=new Set;return u.filter(n=>a.has(n.path)?false:(a.add(n.path),true))}function X(e){let s=new Map([["Workspace (.venv)",0],["Global (user-local)",1],["Global (pipx)",2],["Global (pyenv)",3],["Global (system)",4]]);return [...e].sort((t,r)=>{let o=s.get(t.location)??Number.MAX_SAFE_INTEGER,c=s.get(r.location)??Number.MAX_SAFE_INTEGER;return o!==c?o-c:t.path.localeCompare(r.path)})}function C(e,s){return a$1()?`cd "${e}"; ${s}`:`cd ${e} && ${s}`}function D(e){return a$1()?C(e,"Copy-Item .env.example .env"):C(e,"cp .env.example .env")}async function N(e){try{let s=await d.stat(e);return `${l.basename(e)}:${s.isDirectory()?"d":"f"}:${s.size}:${s.mtimeMs}`}catch{return `${l.basename(e)}:missing`}}async function Y(e){try{let s=new Set([".git",".venv","node_modules",".rapidkit","dist","build","coverage","__pycache__"]),t=new Set;await _(e)&&t.add(e);let r=async(o,c)=>{if(c<0)return;let u=await O(o);for(let a of u){if(q(a,s))continue;let n=l.join(o,a);if(await _(n)){t.add(n);continue}c>0&&await r(n,c-1);}};return await r(e,1),t.size===0&&(await le(e,3,s)).forEach(c=>t.add(c)),Array.from(t).sort((o,c)=>o.localeCompare(c))}catch{return []}}async function Z(e,s){let t=[l.join(e,".rapidkit-workspace"),l.join(e,".rapidkit","workspace.json"),l.join(e,".rapidkit","policies.yml"),l.join(e,".rapidkit","toolchain.lock"),l.join(e,".rapidkit","cache-config.yml")],r=[".rapidkit/project.json",".rapidkit/context.json",".rapidkit/file-hashes.json","package.json","pyproject.toml","go.mod","go.sum","requirements.txt","Dockerfile","Makefile",".env",".env.example","src","modules","tests","test",".venv","node_modules"],o=await Promise.all(t.map(N)),c=await Promise.all(s.map(async u=>{let a=await Promise.all(r.map(n=>N(l.join(u,n))));return `${u}::${a.join("|")}`}));return [...o,...c].join("||")}async function ee(e,s){try{if(!await d.pathExists(e))return null;let t=await d.readJSON(e);return !t||t.signature!==s||!Array.isArray(t.projects)?null:t}catch{return null}}async function te(e,s){try{await d.ensureDir(l.dirname(e)),await d.writeJSON(e,s,{spaces:2});}catch{}}async function se(e,s,t){let r=l.join(e,".rapidkit","reports","doctor-last-run.json");try{return await d.ensureDir(l.dirname(r)),await d.writeJSON(r,{generatedAt:new Date().toISOString(),workspacePath:e,workspaceName:s.workspaceName,projectScanCached:s.projectScanCached??false,projectScanSignature:s.projectScanSignature,cachePath:t,healthScore:s.healthScore,system:{python:s.python,poetry:s.poetry,pipx:s.pipx,go:s.go,rapidkitCore:s.rapidkitCore,versions:{core:s.coreVersion,npm:s.npmVersion}},projects:s.projects,summary:{totalProjects:s.projects.length,totalIssues:s.projects.reduce((o,c)=>o+c.issues.length,0),hasSystemErrors:[s.python,s.rapidkitCore].some(o=>o.status==="error")}},{spaces:2}),r}catch{return}}async function J(){let[e,s,t,r,o]=await Promise.all([oe(),ie(),ne(),ae(),re()]);return {python:e,poetry:s,pipx:t,go:r,rapidkitCore:o}}async function oe(){let e=d$1();for(let s of e)try{let{stdout:t}=await execa(s,["--version"],{timeout:3e3}),r=t.match(/Python (\d+\.\d+\.\d+)/);if(r){let o=r[1],[c,u]=o.split(".").map(Number);return c<3||c===3&&u<10?{status:"warn",message:`Python ${o} (requires 3.10+)`,details:`${s} found but version is below minimum requirement`}:{status:"ok",message:`Python ${o}`,details:`Using ${s}`}}}catch{continue}return {status:"error",message:"Python not found",details:"Install Python 3.10+ and ensure it's in PATH"}}async function ie(){try{let{stdout:e}=await execa("poetry",["--version"],{timeout:3e3}),s=e.match(/Poetry .*version ([\d.]+)/);return s?{status:"ok",message:`Poetry ${s[1]}`,details:"Available for dependency management"}:{status:"warn",message:"Poetry version unknown"}}catch{let e=d$1().map(s=>({cmd:s,args:s==="py"?["-3","-m","poetry","--version"]:["-m","poetry","--version"]}));for(let s of e)try{let{stdout:t}=await execa(s.cmd,s.args,{timeout:3e3,shell:b()}),r=t.match(/Poetry .*version ([\d.]+)/)||t.match(/([\d.]+)/);return {status:"ok",message:r?.[1]?`Poetry ${r[1]}`:"Poetry detected",details:`Available via ${s.cmd} ${s.args.join(" ")}`}}catch{continue}for(let s of B())try{if(!await d.pathExists(s))continue;let{stdout:t}=await execa(s,["--version"],{timeout:3e3,shell:b()}),r=t.match(/Poetry .*version ([\d.]+)/)||t.match(/([\d.]+)/);return {status:"ok",message:r?.[1]?`Poetry ${r[1]}`:"Poetry detected",details:`Available at ${s}`}}catch{continue}return {status:"warn",message:"Poetry not installed",details:"Optional: Install for better dependency management"}}}async function ne(){try{let{stdout:e}=await execa("pipx",["--version"],{timeout:3e3});return {status:"ok",message:`pipx ${e.trim()}`,details:"Available for global tool installation"}}catch{let e=d$1();for(let s of e)try{let t=s==="py"?["-3","-m","pipx","--version"]:["-m","pipx","--version"],{stdout:r}=await execa(s,t,{timeout:3e3,shell:b()});return {status:"ok",message:`pipx ${r.trim()}`,details:`Available via ${s} ${t.join(" ")}`}}catch{continue}return {status:"warn",message:"pipx not installed",details:"Optional: Install for isolated Python tools"}}}async function ae(){try{let{stdout:e}=await execa("go",["version"],{timeout:3e3}),s=e.match(/go version go(\d+\.\d+(?:\.\d+)?)/);return s?{status:"ok",message:`Go ${s[1]}`,details:"Available for Go/Fiber and Go/Gin projects"}:{status:"ok",message:"Go (version unknown)",details:"go found in PATH"}}catch{return {status:"warn",message:"Go not installed",details:"Optional: Required only for gofiber.standard / gogin.standard projects \u2014 https://go.dev/dl/"}}}async function re(){let e=process.env.HOME||process.env.USERPROFILE||"",s=[],t=z(e);for(let{location:o,path:c}of t)try{if(await d.pathExists(c)){let{stdout:u,exitCode:a}=await execa(c,["--version"],{timeout:3e3,reject:false});if(a===0&&(u.includes("RapidKit Version")||u.includes("RapidKit"))){let n=u.match(/v?([\d.]+(?:rc\d+)?(?:a\d+)?(?:b\d+)?)/);n&&s.push({location:o,path:c,version:n[1]});}}}catch{continue}if(s.length>0){let o=s.filter(u=>u.location!=="Workspace (launcher)");if(o.length>0){let u=X(o);return {status:"ok",message:`RapidKit Core ${u[0].version}`,paths:u.map(n=>({location:n.location,path:n.path,version:n.version}))}}return {status:"ok",message:`RapidKit Core ${s[0].version}`,details:"Detected via workspace launcher"}}try{let{stdout:o,exitCode:c}=await execa("rapidkit",["--version"],{timeout:3e3,reject:false});if(c===0&&(o.includes("RapidKit Version")||o.includes("RapidKit"))){let u=o.match(/v?([\d.]+(?:rc\d+)?(?:a\d+)?(?:b\d+)?)/);if(u)return {status:"ok",message:`RapidKit Core ${u[1]}`,details:"Available via PATH"}}}catch{}try{let{stdout:o,exitCode:c}=await execa("poetry",["run","rapidkit","--version"],{timeout:3e3,reject:false});if(c===0&&(o.includes("RapidKit Version")||o.includes("RapidKit"))){let u=o.match(/v?([\d.]+(?:rc\d+)?(?:a\d+)?(?:b\d+)?)/);if(u)return {status:"ok",message:`RapidKit Core ${u[1]}`,details:"Available via Poetry"}}}catch{}let r=d$1();for(let o of r)try{let{stdout:c,exitCode:u}=await execa(o,["-c","import rapidkit_core; print(rapidkit_core.__version__)"],{timeout:3e3,reject:false});if(u===0&&c&&!c.includes("Traceback")&&!c.includes("ModuleNotFoundError")){let a=c.trim();if(a)return {status:"ok",message:`RapidKit Core ${a}`,details:`Available in ${o} environment`}}}catch{continue}return {status:"error",message:"RapidKit Core not installed",details:"Install with: pipx install rapidkit-core"}}async function S(e,s){let t=l.join(e,"Dockerfile");s.hasDocker=await d.pathExists(t);let r=l.join(e,"tests"),o=l.join(e,"test"),c=await d.pathExists(r)||await d.pathExists(o),u=false;if(s.framework==="Go/Fiber"||s.framework==="Go/Gin")try{let a=[{dir:e,depth:0}],n=4,m=new Set([".git",".venv","node_modules","dist","build","vendor"]);for(;a.length>0&&!u;){let p=a.shift();if(!p)break;let f=[];try{f=await d.readdir(p.dir);}catch{continue}for(let h of f){let w=l.join(p.dir,h),y;try{y=await d.stat(w);}catch{continue}if(y.isFile()&&h.endsWith("_test.go")){u=true;break}y.isDirectory()&&p.depth<n&&!m.has(h)&&!h.startsWith(".")&&a.push({dir:w,depth:p.depth+1});}}}catch{}if(s.hasTests=c||u,s.framework==="NestJS"){let a=l.join(e,".eslintrc.js"),n=l.join(e,".eslintrc.json");s.hasCodeQuality=await d.pathExists(a)||await d.pathExists(n);}else if(s.framework==="Go/Fiber"||s.framework==="Go/Gin"){let a=l.join(e,".golangci.yml"),n=l.join(e,".golangci.yaml"),m=l.join(e,"Makefile"),p=await d.pathExists(m)&&(await d.readFile(m,"utf8")).includes("golangci-lint");s.hasCodeQuality=await d.pathExists(a)||await d.pathExists(n)||p;}else if(s.framework==="FastAPI"){let a=l.join(e,"ruff.toml"),n=l.join(e,"pyproject.toml");if(await d.pathExists(n))try{let m=await d.readFile(n,"utf8");s.hasCodeQuality=m.includes("[tool.ruff]")||await d.pathExists(a);}catch{s.hasCodeQuality=await d.pathExists(a);}}try{if(s.framework==="NestJS"){let{stdout:a}=await execa("npm",["audit","--json"],{cwd:e,reject:false});if(a)try{let m=JSON.parse(a).metadata?.vulnerabilities;m&&(s.vulnerabilities=(m.high||0)+(m.critical||0)+(m.moderate||0));}catch{}}else if(s.framework==="FastAPI"){let a=l.join(e,".venv"),n=f(a);if(await d.pathExists(n))try{let{stdout:m}=await execa(n,["-m","pip","list","--format=json"],{timeout:5e3,reject:false});if(m){JSON.parse(m);s.vulnerabilities=0;}}catch{}}}catch{}}async function ce(e){let t={name:l.basename(e),path:e,venvActive:false,depsInstalled:false,coreInstalled:false,issues:[],fixCommands:[]},r=l.join(e,".rapidkit");if(!await d.pathExists(r))return t.issues.push("Not a valid RapidKit project (missing .rapidkit directory)"),t;try{let f=l.join(e,"registry.json");if(await d.pathExists(f)){let h=await d.readJson(f);h.installed_modules&&(t.stats={modules:h.installed_modules.length});}}catch{}let o=null;try{let f=l.join(r,"project.json");if(await d.pathExists(f)){o=await d.readJson(f);let h=o?.kit_name||o?.kit;h&&(t.kit=h);}}catch{}try{let f=l.join(e,".git");if(await d.pathExists(f)){let{stdout:h}=await execa("git",["log","-1","--format=%cr"],{cwd:e,reject:false});h&&(t.lastModified=h.trim());}else {let h=await d.stat(e),y=Date.now()-h.mtime.getTime(),k=Math.floor(y/(1e3*60*60*24));t.lastModified=k===0?"today":`${k} day${k>1?"s":""} ago`;}}catch{}let c=l.join(e,"package.json"),u=l.join(e,"pyproject.toml"),a=l.join(e,"go.mod");if(await d.pathExists(a)||o?.runtime==="go"||typeof o?.kit_name=="string"&&(o.kit_name.startsWith("gofiber")||o.kit_name.startsWith("gogin"))){let f=o?.kit_name??"";t.framework=f.startsWith("gogin")?"Go/Gin":"Go/Fiber",t.isGoProject=true,t.venvActive=true,t.coreInstalled=false;try{await execa("go",["version"],{timeout:3e3});}catch{t.issues.push("Go toolchain not found \u2014 install from https://go.dev/dl/"),t.fixCommands?.push("https://go.dev/dl/");}let h=l.join(e,"go.sum");return await d.pathExists(h)?t.depsInstalled=true:(t.depsInstalled=false,t.issues.push("Go dependencies not downloaded (go.sum missing)"),t.fixCommands?.push(C(e,"go mod tidy"))),await S(e,t),t}let m=await d.pathExists(c),p=await d.pathExists(u);if(m){t.framework="NestJS",t.venvActive=true;let f=l.join(e,"node_modules");if(await d.pathExists(f))try{let k=(await d.readdir(f)).filter(v=>!v.startsWith(".")&&!v.startsWith("_"));t.depsInstalled=k.length>0;}catch{t.depsInstalled=false;}t.depsInstalled||(t.issues.push("Dependencies not installed (node_modules empty or missing)"),t.fixCommands?.push(C(e,"rapidkit init"))),t.coreInstalled=false;let h=l.join(e,".env");if(t.hasEnvFile=await d.pathExists(h),!t.hasEnvFile){let y=l.join(e,".env.example");await d.pathExists(y)&&(t.issues.push("Environment file missing (found .env.example)"),t.fixCommands?.push(D(e)));}let w=l.join(e,"src");if(t.modulesHealthy=true,t.missingModules=[],await d.pathExists(w))try{let y=await d.readdir(w);t.modulesHealthy=y.length>0;}catch{t.modulesHealthy=false;}return await S(e,t),t}if(p){t.framework="FastAPI";let f$1=l.join(e,".venv");if(await d.pathExists(f$1)){t.venvActive=true;let k=f(f$1);if(await d.pathExists(k)){try{let{stdout:v}=await execa(k,["-c","import rapidkit_core; print(rapidkit_core.__version__)"],{timeout:2e3});t.coreInstalled=true,t.coreVersion=v.trim();}catch{t.coreInstalled=false;}try{await execa(k,["-c","import fastapi"],{timeout:2e3}),t.depsInstalled=true;}catch{try{let v=l.join(f$1,"lib");if(await d.pathExists(v)){let F=(await d.readdir(v)).find(E=>E.startsWith("python"));if(F){let E=l.join(v,F,"site-packages");if(await d.pathExists(E)){let L=(await d.readdir(E)).filter(R=>!R.startsWith("_")&&!R.includes("dist-info")&&!["pip","setuptools","wheel","pkg_resources"].includes(R));t.depsInstalled=L.length>0;}}}t.depsInstalled||(t.issues.push("Dependencies not installed"),t.fixCommands?.push(C(e,"rapidkit init")));}catch{t.issues.push("Could not verify dependency installation");}}}else t.issues.push("Virtual environment exists but Python executable not found");}else t.issues.push("Virtual environment not created"),t.fixCommands?.push(C(e,"rapidkit init"));let h=l.join(e,".env");if(t.hasEnvFile=await d.pathExists(h),!t.hasEnvFile){let k=l.join(e,".env.example");await d.pathExists(k)&&(t.issues.push("Environment file missing (found .env.example)"),t.fixCommands?.push(D(e)));}let w=l.join(e,"src"),y=l.join(e,"modules");if(t.modulesHealthy=true,t.missingModules=[],await d.pathExists(w)){let k=l.join(w,"__init__.py");await d.pathExists(k)||(t.modulesHealthy=false,t.missingModules.push("src/__init__.py"));}if(await d.pathExists(y))try{let k=await O(y);for(let v of k){let A=l.join(y,v,"__init__.py");await d.pathExists(A)||(t.modulesHealthy=false,t.missingModules.push(`modules/${v}/__init__.py`));}}catch{}return !t.modulesHealthy&&t.missingModules.length>0&&t.issues.push(`Missing module init files: ${t.missingModules.join(", ")}`),await S(e,t),t}return t.issues.push("Unknown project type (no package.json or pyproject.toml)"),await S(e,t),t}async function O(e){try{return (await d.readdir(e,{withFileTypes:true})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{try{let s=await d.readdir(e),t=[];for(let r of s)try{(await d.stat(l.join(e,r))).isDirectory()&&t.push(r);}catch{continue}return t}catch{return []}}}async function _(e){let s=l.join(e,".rapidkit");if(!await d.pathExists(s))return false;let t=["project.json","context.json","file-hashes.json"];for(let r of t)if(await d.pathExists(l.join(s,r)))return true;return false}function q(e,s){if(s.has(e))return true;let t=e.toLowerCase();return !!(t==="dist"||t.startsWith("dist-")||t.startsWith("dist_")||t==="build"||t.startsWith("build-")||t.startsWith("build_"))}async function le(e,s,t){let r=new Set,o=[{dir:e,depth:0}];for(;o.length>0;){let c=o.shift();if(!c)break;try{let u=await d.readdir(c.dir);for(let a of u){if(q(a,t))continue;let n=l.join(c.dir,a),m;try{m=await d.stat(n);}catch{continue}if(m.isDirectory()){if(await _(n)){r.add(n);continue}c.depth<s&&o.push({dir:n,depth:c.depth+1});}}}catch{continue}}return Array.from(r)}async function W(e){let s=e,t=l.parse(s).root;for(;s!==t;){let r=[l.join(s,".rapidkit-workspace"),l.join(s,".rapidkit","workspace-marker.json"),l.join(s,".rapidkit","config.json")];for(let o of r)if(await d.pathExists(o))return s;s=l.dirname(s);}return null}function de(e,s){let t=0,r=0,o=0;return e.forEach(u=>{u.status==="ok"?t++:u.status==="warn"?r++:u.status==="error"&&o++;}),s.forEach(u=>{(u.isGoProject?u.issues.length===0&&u.depsInstalled:u.issues.length===0&&u.venvActive&&u.depsInstalled)?t++:u.issues.length>0&&r++;}),{total:t+r+o,passed:t,warnings:r,errors:o}}async function V(e,s=true){let t=l.basename(e);try{let p=l.join(e,".rapidkit-workspace");await d.pathExists(p)&&(t=(await d.readJSON(p)).name||t);}catch{try{let p=l.join(e,".rapidkit","config.json");t=(await d.readJSON(p)).workspace_name||t;}catch{}}let[r,o]=await Promise.all([J(),Y(e)]),c={workspacePath:e,workspaceName:t,python:r.python,poetry:r.poetry,pipx:r.pipx,go:r.go,rapidkitCore:r.rapidkitCore,projects:[]};a.debug(`Workspace scan found ${o.length} project(s)`);let u=await Z(e,o),a$1=l.join(e,".rapidkit","reports","doctor-workspace-cache.json"),n=s?await ee(a$1,u):null;if(n)c.projects=n.projects,c.projectScanCached=true,a.debug(`Workspace project health cache hit: ${a$1}`);else try{let p=await Promise.all(o.map(f=>ce(f)));c.projects=p,c.projectScanCached=false,await te(a$1,{signature:u,generatedAt:new Date().toISOString(),projects:p}),a.debug(`Workspace project health cache refreshed: ${a$1}`);}catch(p){a.debug(`Failed to scan workspace projects: ${p}`);}c.projectScanSignature=u,c.projectScanCachePath=a$1;let m=[c.python,c.poetry,c.pipx,c.go,c.rapidkitCore];if(c.healthScore=de(m,c.projects),c.rapidkitCore.status==="ok"){let p=c.rapidkitCore.message.match(/([\d.]+(?:rc\d+)?(?:a\d+)?(?:b\d+)?)/);p&&(c.coreVersion=p[1]);}return c.evidencePath=await se(e,c,n?a$1:null),c}function x(e,s){let t=e.status==="ok"?"\u2705":e.status==="warn"?"\u26A0\uFE0F":"\u274C",r=e.status==="ok"?i.green:e.status==="warn"?i.yellow:i.red;console.log(`${t} ${i.bold(s)}: ${r(e.message)}`),e.paths&&e.paths.length>0?e.paths.forEach(o=>{let c=o.version?i.cyan(` -> ${o.version}`):"";console.log(` ${i.cyan("\u2022")} ${i.gray(o.location)}: ${i.dim(o.path)}${c}`);}):e.details&&console.log(` ${i.gray(e.details)}`);}function ue(e){let s=e.issues.length>0,t=s?"\u26A0\uFE0F":"\u2705",r=s?i.yellow:i.green;if(console.log(`
|
|
2
|
-
${t} ${i.bold("Project")}: ${r(e.name)}`),e.framework){let n=e.framework==="FastAPI"?"\u{1F40D}":e.framework==="NestJS"?"\u{1F985}":e.framework==="Go/Fiber"||e.framework==="Go/Gin"?"\u{1F439}":"\u{1F4E6}";console.log(` ${n} Framework: ${i.cyan(e.framework)}${e.kit?i.gray(` (${e.kit})`):""}`);}console.log(` ${i.gray(`Path: ${e.path}`)}`);let o=e.isGoProject===true,c=!o&&e.venvActive&&!e.coreInstalled;if(!o&&!c&&(e.venvActive?console.log(` \u2705 Virtual environment: ${i.green("Active")}`):console.log(` \u274C Virtual environment: ${i.red("Not found")}`),e.coreInstalled?console.log(` ${i.dim("\u2139")} RapidKit Core: ${i.gray(e.coreVersion||"In venv")} ${i.dim("(optional)")}`):console.log(` ${i.dim("\u2139")} RapidKit Core: ${i.gray("Using global installation")} ${i.dim("(recommended)")}`)),e.depsInstalled?console.log(` \u2705 Dependencies: ${i.green("Installed")}`):console.log(` \u26A0\uFE0F Dependencies: ${i.yellow("Not installed")}`),e.hasEnvFile!==void 0&&(e.hasEnvFile?console.log(` \u2705 Environment: ${i.green(".env configured")}`):console.log(` \u26A0\uFE0F Environment: ${i.yellow(".env missing")}`)),e.modulesHealthy!==void 0&&(e.modulesHealthy?console.log(` \u2705 Modules: ${i.green("Healthy")}`):e.missingModules&&e.missingModules.length>0&&console.log(` \u26A0\uFE0F Modules: ${i.yellow(`Missing ${e.missingModules.length} init file(s)`)}`)),e.stats){let n=[];e.stats.modules!==void 0&&n.push(`${e.stats.modules} module${e.stats.modules!==1?"s":""}`),n.length>0&&console.log(` \u{1F4CA} Stats: ${i.cyan(n.join(" \u2022 "))}`);}e.lastModified&&console.log(` \u{1F552} Last Modified: ${i.gray(e.lastModified)}`);let a=[];if(e.hasTests!==void 0&&a.push(e.hasTests?"\u2705 Tests":i.dim("\u2298 No tests")),e.hasDocker!==void 0&&a.push(e.hasDocker?"\u2705 Docker":i.dim("\u2298 No Docker")),e.hasCodeQuality!==void 0){let n=e.framework==="NestJS"?"ESLint":e.framework==="Go/Fiber"||e.framework==="Go/Gin"?"golangci-lint":"Ruff";a.push(e.hasCodeQuality?`\u2705 ${n}`:i.dim(`\u2298 No ${n}`));}a.length>0&&console.log(` ${a.join(" \u2022 ")}`),e.vulnerabilities!==void 0&&e.vulnerabilities>0&&console.log(` \u26A0\uFE0F Security: ${i.yellow(`${e.vulnerabilities} vulnerability(ies) found`)}`),e.issues.length>0&&(console.log(` ${i.bold("Issues:")}`),e.issues.forEach(n=>{console.log(` \u2022 ${i.yellow(n)}`);}),e.fixCommands&&e.fixCommands.length>0&&(console.log(`
|
|
3
|
-
${i.bold.cyan("\u{1F527} Quick Fix:")}`),e.fixCommands.forEach(n=>{console.log(` ${i.cyan("$")} ${i.white(n)}`);})));}async function T(){try{return (await execa("go",["version"],{timeout:3e3,reject:false})).exitCode===0}catch{return false}}async function K(e,s=false){let t=e.filter(m=>m.fixCommands&&m.fixCommands.length>0),r=null;if(t.length===0){console.log(i.green(`
|
|
4
|
-
\u2705 No fixes needed - all projects are healthy!`));return}console.log(i.bold.cyan(`
|
|
5
|
-
\u{1F527} Available Fixes:
|
|
6
|
-
`));for(let m of t)console.log(i.bold(`Project: ${i.yellow(m.name)}`)),m.fixCommands.forEach((p,f)=>{console.log(` ${f+1}. ${i.cyan(p)}`);}),console.log();let o=0;for(let m of t)for(let p of m.fixCommands){if(/^https?:\/\//i.test(p.trim()))continue;if(a(p,"cp\\s+\\.env\\.example\\s+\\.env")||a(p,"copy-item\\s+\\.env\\.example\\s+\\.env")||a(p,"rapidkit\\s+init")){o+=1;continue}if(a(p,"go\\s+mod\\s+tidy")){r===null&&(r=await T()),r&&(o+=1);continue}o+=1;}if(o===0){console.log(i.gray("\u{1F4A1} No automatic fixes can be applied right now.")),r===false&&console.log(i.gray(" Install Go to enable go mod tidy fixes, then rerun `rapidkit doctor workspace --fix`."));return}if(!s){console.log(i.gray('\u{1F4A1} Run "npx rapidkit doctor workspace --fix" to apply fixes automatically'));return}let{confirm:c}=await U.prompt([{type:"confirm",name:"confirm",message:`Apply ${t.reduce((m,p)=>m+p.fixCommands.length,0)} fix(es)?`,default:false}]);if(!c){console.log(i.yellow(`
|
|
7
|
-
\u26A0\uFE0F Fixes cancelled by user`));return}console.log(i.bold.cyan(`
|
|
8
|
-
\u{1F680} Applying fixes...
|
|
9
|
-
`));let u=m=>/^https?:\/\//i.test(m.trim());function a(m,p){let f=[new RegExp(`^cd\\s+"([^"]+)"\\s*(?:&&|;)\\s*${p}\\s*$`,"i"),new RegExp(`^cd\\s+'([^']+)'\\s*(?:&&|;)\\s*${p}\\s*$`,"i"),new RegExp(`^cd\\s+(.+?)\\s*(?:&&|;)\\s*${p}\\s*$`,"i")];for(let h of f){let w=m.match(h);if(w?.[1])return {projectPath:w[1].trim()}}return null}function n(m){return a(m,"cp\\s+\\.env\\.example\\s+\\.env")||a(m,"copy-item\\s+\\.env\\.example\\s+\\.env")}for(let m of t){console.log(i.bold(`Fixing ${i.cyan(m.name)}...`));for(let p of m.fixCommands)try{if(console.log(i.gray(` $ ${p}`)),u(p)){console.log(i.yellow(` \u2139 Manual action required: open ${p}`)),console.log(i.green(` \u2705 Recorded as guidance
|
|
10
|
-
`));continue}let f=n(p);if(f){let y=l.join(f.projectPath,".env.example"),k=l.join(f.projectPath,".env");if(!await d.pathExists(y))throw new Error(`.env.example not found at ${y}`);if(await d.pathExists(k)){console.log(i.green(` \u2705 .env already exists
|
|
11
|
-
`));continue}await d.copy(y,k,{overwrite:false,errorOnExist:false}),console.log(i.green(` \u2705 Success
|
|
12
|
-
`));continue}let h=a(p,"rapidkit\\s+init");if(h){await execa("rapidkit",["init"],{cwd:h.projectPath,shell:b(),stdio:"inherit"}),console.log(i.green(` \u2705 Success
|
|
13
|
-
`));continue}let w=a(p,"go\\s+mod\\s+tidy");if(w){if(r===null&&(r=await T()),!r){console.log(i.yellow(" \u26A0 Go toolchain is not installed \u2014 skipping go mod tidy; install Go to apply this fix.")),console.log(i.green(` \u2705 Recorded as guidance
|
|
14
|
-
`));continue}await execa("go",["mod","tidy"],{cwd:w.projectPath,shell:b(),stdio:"inherit"}),console.log(i.green(` \u2705 Success
|
|
15
|
-
`));continue}await execa(p,{shell:true,stdio:"inherit"}),console.log(i.green(` \u2705 Success
|
|
16
|
-
`));}catch(f){console.log(i.red(` \u274C Failed: ${f instanceof Error?f.message:String(f)}
|
|
17
|
-
`));}}console.log(i.bold.green(`
|
|
18
|
-
\u2705 Fix process completed!`));}async function be(e={}){let s=!e.workspace&&e.fix?await W(process.cwd()):null,t=e.workspace||!!s;if(e.json||console.log(i.bold.cyan(`
|
|
19
|
-
\u{1FA7A} RapidKit Health Check
|
|
20
|
-
`)),t){let r=s??await W(process.cwd());r||(a.error("No RapidKit workspace found in current directory or parents"),a.info('Run this command from within a workspace, or use "rapidkit doctor" for system check'),process.exit(1)),e.json||(s&&console.log(i.gray("\u2139\uFE0F Detected workspace context; enabling workspace checks for --fix")),console.log(i.bold(`Workspace: ${i.cyan(l.basename(r))}`)),console.log(i.gray(`Path: ${r}`)));let o=await V(r);if(e.json||(o.projectScanCached&&console.log(i.gray(`\u2139\uFE0F Reused cached project scan${o.projectScanCachePath?` (${l.basename(o.projectScanCachePath)})`:""}`)),o.evidencePath&&console.log(i.gray(`\u2139\uFE0F Evidence saved: ${o.evidencePath}`))),e.json){let a={workspace:{name:l.basename(r),path:r},cache:{projectScan:o.projectScanCached??false,projectScanPath:o.projectScanCachePath,evidencePath:o.evidencePath},healthScore:o.healthScore,system:{python:o.python,poetry:o.poetry,pipx:o.pipx,rapidkitCore:o.rapidkitCore,versions:{core:o.coreVersion,npm:o.npmVersion}},projects:o.projects.map(n=>({name:n.name,path:n.path,venvActive:n.venvActive,depsInstalled:n.depsInstalled,coreInstalled:n.coreInstalled,coreVersion:n.coreVersion,issues:n.issues,fixCommands:n.fixCommands})),summary:{totalProjects:o.projects.length,totalIssues:o.projects.reduce((n,m)=>n+m.issues.length,0),hasSystemErrors:[o.python,o.rapidkitCore].some(n=>n.status==="error")}};console.log(JSON.stringify(a,null,2));return}if(o.healthScore){let a=o.healthScore,n=Math.round(a.passed/a.total*100),m=n>=80?i.green:n>=50?i.yellow:i.red,p="\u2588".repeat(Math.floor(n/5))+"\u2591".repeat(20-Math.floor(n/5));console.log(i.bold(`
|
|
21
|
-
\u{1F4CA} Health Score:`)),console.log(` ${m(`${n}%`)} ${i.gray(p)}`),console.log(` ${i.green(`\u2705 ${a.passed} passed`)} ${i.gray("|")} ${i.yellow(`\u26A0\uFE0F ${a.warnings} warnings`)} ${i.gray("|")} ${i.red(`\u274C ${a.errors} errors`)}`);}if(console.log(i.bold(`
|
|
22
|
-
|
|
23
|
-
System Tools:
|
|
24
|
-
`)),x(o.python,"Python"),x(o.poetry,"Poetry"),x(o.pipx,"pipx"),x(o.go,"Go"),x(o.rapidkitCore,"RapidKit Core"),o.coreVersion&&o.npmVersion){let a=o.coreVersion.split(".")[1],n=o.npmVersion.split(".")[1];a!==n&&(console.log(i.yellow(`
|
|
25
|
-
\u26A0\uFE0F Version mismatch: Core ${o.coreVersion} / CLI ${o.npmVersion}`)),console.log(i.gray(" Consider updating to matching versions for best compatibility")));}o.projects.length>0?(console.log(i.bold(`
|
|
26
|
-
\u{1F4E6} Projects (${o.projects.length}):`)),o.projects.forEach(a=>ue(a))):(console.log(i.bold(`
|
|
27
|
-
\u{1F4E6} Projects:`)),console.log(i.gray(" No RapidKit projects found in workspace")));let c=o.projects.reduce((a,n)=>a+n.issues.length,0),u=[o.python,o.rapidkitCore].some(a=>a.status==="error");if(u||c>0)if(console.log(i.bold.yellow(`
|
|
28
|
-
\u26A0\uFE0F Found ${c} project issue(s)`)),u&&console.log(i.bold.red("\u274C System requirements not met")),e.fix){if(await K(o.projects,true),!e.json){let a=await V(r,false),n=a.projects.reduce((p,f)=>p+f.issues.length,0),m=[a.python,a.rapidkitCore].some(p=>p.status==="error");m||n>0?(console.log(i.bold.yellow(`
|
|
29
|
-
\u26A0\uFE0F Post-fix verification found ${n} remaining issue(s)`)),m&&console.log(i.bold.red("\u274C System requirements still not met"))):console.log(i.bold.green(`
|
|
30
|
-
\u2705 Post-fix verification passed. Workspace is healthy.`)),a.projectScanCached&&console.log(i.gray(`\u2139\uFE0F Reused cached project scan${a.projectScanCachePath?` (${l.basename(a.projectScanCachePath)})`:""}`)),a.evidencePath&&console.log(i.gray(`\u2139\uFE0F Evidence refreshed: ${a.evidencePath}`));}}else c>0&&await K(o.projects,false);else console.log(i.bold.green(`
|
|
31
|
-
\u2705 All checks passed! Workspace is healthy.`));}else {console.log(i.bold(`System Tools:
|
|
32
|
-
`));let r=await J(),o=r.python,c=r.poetry,u=r.pipx,a=r.go,n=r.rapidkitCore;x(o,"Python"),x(c,"Poetry"),x(u,"pipx"),x(a,"Go"),x(n,"RapidKit Core"),[o,n].some(p=>p.status==="error")?(console.log(i.bold.red(`
|
|
33
|
-
\u274C Some required tools are missing`)),e.fix&&console.log(i.gray(`
|
|
34
|
-
Tip: Project auto-fix runs in workspace mode. Run from a workspace and use "rapidkit doctor workspace --fix"`)),console.log(i.gray(`
|
|
35
|
-
Tip: Run "rapidkit doctor workspace" for detailed project checks`))):(console.log(i.bold.green(`
|
|
36
|
-
\u2705 All required tools are installed!`)),e.fix&&console.log(i.gray(`
|
|
37
|
-
Tip: Project auto-fix runs in workspace mode. Run from a workspace and use "rapidkit doctor workspace --fix"`)),console.log(i.gray(`
|
|
38
|
-
Tip: Run "rapidkit doctor workspace" for detailed project checks`)));}console.log("");}export{be as runDoctor};
|