rapidkit 0.24.2 → 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -23
- package/dist/chunk-3MJ2BD56.js +786 -0
- package/dist/chunk-UOGFCKQ5.js +33 -0
- package/dist/chunk-Z5LKRG57.js +1 -0
- package/dist/{create-3OT5GA5W.js → create-PELQEDCF.js} +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +223 -195
- package/dist/package.json +8 -3
- package/dist/{pythonRapidkitExec-EXCX5QGH.js → pythonRapidkitExec-K2SFGAYJ.js} +1 -1
- package/dist/{workspace-6SADFTND.js → workspace-PIBFBNRA.js} +52 -49
- package/package.json +8 -3
- package/dist/chunk-5JB4MOC5.js +0 -33
- package/dist/chunk-XP4GTL4L.js +0 -776
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {e,d as d$1,c as c$2,h as h$
|
|
2
|
+
import {e,d as d$1,c as c$2,h as h$2,a as a$3}from'./chunk-UOGFCKQ5.js';import {a as a$2,b,c as c$1,d,i,h,e as e$1,f}from'./chunk-3MJ2BD56.js';import {c,a as a$1,b as b$1}from'./chunk-N64Z3XVF.js';import {a,h as h$1,i as i$1,b as b$3,d as d$2,c as c$3,f as f$1,k,g}from'./chunk-Z5LKRG57.js';import {Command,Option}from'commander';import l from'chalk';import Se from'inquirer';import y from'path';import {fileURLToPath}from'url';import {exec,spawn}from'child_process';import Nr from'validate-npm-package-name';import*as _ from'fs-extra';import ___default from'fs-extra';import b$2,{promises,createWriteStream}from'fs';import {execa}from'execa';import qr from'nunjucks';import Ht from'ora';import Hr,{createHash,createVerify,createHmac}from'crypto';import hn from'os';import {promisify}from'util';import nr from'http';import sr from'https';function Ft(e){let o=Nr(e);if(!o.validForNewPackages){let r=o.errors||[],i=o.warnings||[],n=[...r,...i];throw new e$1(e,`NPM validation failed: ${n.join(", ")}`)}if(!/^[a-z][a-z0-9_-]*$/.test(e))throw new e$1(e,"Must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores");if(["test","tests","src","dist","build","lib","python","pip","poetry","node","npm","rapidkit","rapidkit"].includes(e.toLowerCase()))throw new e$1(e,`"${e}" is a reserved name. Please choose a different name.`);if(e.length<2)throw new e$1(e,"Name must be at least 2 characters long");if(e.length>214)throw new e$1(e,"Name must be less than 214 characters");return true}function jr(){return d$2()}function Dr(e,o){return e==="py"?["-3",...o]:o}function Mr(e){return typeof e=="object"&&e!==null}async function Lr(e,o,t,r=8e3){try{let i=await execa(e,o,{cwd:t,timeout:r,reject:false,stdio:"pipe"});return {ok:i.exitCode===0,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr}}catch(i){return {ok:false,exitCode:void 0,stdout:"",stderr:i instanceof Error?i.message:String(i)}}}async function Gr(e,o){let t=["-m","rapidkit",...e],r=jr();for(let i of r){let n=await Lr(i,Dr(i,t),o?.cwd,o?.timeoutMs);if(!n.ok)continue;let a=(n.stdout??"").trim();try{let s=JSON.parse(a);return Mr(s)?{ok:true,command:i,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,data:s}:{ok:false,command:i,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr}}catch{return {ok:false,command:i,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr}}}return {ok:false}}async function fo(e,o){let t=await Gr(["project","detect","--path",e,"--json"],o);return !t.ok||!t.data||t.data.schema_version!==1?{ok:false,command:t.command,exitCode:t.exitCode,stdout:t.stdout,stderr:t.stderr}:t}var Kr=fileURLToPath(import.meta.url),Wr=y.dirname(Kr);function Ur(e=32){let o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",t=Hr.randomBytes(e),r="";for(let i=0;i<e;i++)r+=o[t[i]%o.length];return r}async function ho(e,o){let t=o.template||"fastapi",r=t==="fastapi",i=r?"FastAPI":"NestJS",n=Ht(`Generating ${i} project...`).start();try{let a=y.resolve(Wr,".."),s=o.kit_name||`${t}.standard`,c$1;s==="fastapi.ddd"?c$1="fastapi-ddd":s.startsWith("fastapi")?c$1="fastapi-standard":c$1="nestjs-standard";let d=y.join(a,"templates","kits",c$1),p=qr.configure(d,{autoescape:false,trimBlocks:true,lstripBlocks:true});p.addFilter("generate_secret",function(m,k=32){return Ur(k)});let u={project_name:o.project_name,author:o.author||"RapidKit User",description:o.description||(r?"FastAPI service generated with RapidKit":"NestJS application generated with RapidKit"),app_version:o.app_version||"0.1.0",license:o.license||"MIT",package_manager:o.package_manager||"npm",node_version:o.node_version||"20.0.0",database_type:o.database_type||"postgresql",include_caching:o.include_caching||false,created_at:new Date().toISOString(),rapidkit_version:c()},g;r?g=["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"]:g=["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 m of g){let k=y.join(d,m);try{await promises.access(k);}catch{continue}let O=await promises.readFile(k,"utf-8"),A;try{A=p.renderString(O,u);}catch(K){throw console.error(`Failed to render template: ${m}`),K}let P=m.replace(/\.j2$/,""),I=y.join(e,P);await promises.mkdir(y.dirname(I),{recursive:true}),await promises.writeFile(I,A),(P.endsWith(".rapidkit/rapidkit")||P.endsWith(".rapidkit/cli.py")||P.endsWith(".rapidkit/activate")||P==="rapidkit")&&await promises.chmod(I,493);}if(r){let m=y.join(d,".rapidkit","context.json"),k=y.join(e,".rapidkit","context.json");try{await promises.mkdir(y.join(e,".rapidkit"),{recursive:true}),await promises.copyFile(m,k);}catch{await promises.mkdir(y.join(e,".rapidkit"),{recursive:true});let A=o.engine||"pip";await promises.writeFile(k,JSON.stringify({engine:A,created_by:"rapidkit-npm-fallback"},null,2));}}let h=r?`# Python
|
|
3
3
|
__pycache__/
|
|
4
4
|
*.py[cod]
|
|
5
5
|
*$py.class
|
|
@@ -67,12 +67,12 @@ Thumbs.db
|
|
|
67
67
|
|
|
68
68
|
# Coverage
|
|
69
69
|
coverage/
|
|
70
|
-
`;if(await promises.writeFile(
|
|
70
|
+
`;if(await promises.writeFile(y.join(e,".gitignore"),h),n.succeed(`${i} project generated!`),!o.skipGit){let m=Ht("Initializing git repository...").start();try{await execa("git",["init"],{cwd:e}),await execa("git",["add","."],{cwd:e}),await execa("git",["commit","-m",`Initial commit: ${i} project via RapidKit`],{cwd:e}),m.succeed("Git repository initialized");}catch{m.warn("Could not initialize git repository");}}if(!r&&!o.skipInstall){let m=o.package_manager||"npm",k=Ht(`Installing dependencies with ${m}...`).start();try{await execa(m,m==="yarn"?["install"]:m==="pnpm"?["install"]:["install"],{cwd:e}),k.succeed("Dependencies installed");}catch{k.warn(`Could not install dependencies. Run '${m} install' manually.`);}}let f=y.basename(e);console.log(`
|
|
71
71
|
${l.yellow("\u26A0\uFE0F Limited offline mode:")} This project was created using basic templates.
|
|
72
72
|
${l.gray("For full kit features, install Python 3.10+ and rapidkit-core:")}
|
|
73
73
|
${l.cyan(" sudo apt install python3 python3-pip python3-venv")}
|
|
74
74
|
${l.cyan(" pip install rapidkit-core")}
|
|
75
|
-
`),console.log(
|
|
75
|
+
`),console.log(r?`
|
|
76
76
|
${l.green("\u2728 FastAPI project created successfully!")}
|
|
77
77
|
|
|
78
78
|
${l.bold("\u{1F4C2} Project structure:")}
|
|
@@ -88,7 +88,7 @@ ${e}/
|
|
|
88
88
|
\u2514\u2500\u2500 README.md
|
|
89
89
|
|
|
90
90
|
${l.bold("\u{1F680} Get started:")}
|
|
91
|
-
${l.cyan(`cd ${
|
|
91
|
+
${l.cyan(`cd ${f}`)}
|
|
92
92
|
${l.cyan("npx rapidkit init")} ${l.gray("# Install dependencies")}
|
|
93
93
|
${l.cyan("npx rapidkit dev")} ${l.gray("# Start dev server")}
|
|
94
94
|
|
|
@@ -118,7 +118,7 @@ ${e}/
|
|
|
118
118
|
\u2514\u2500\u2500 README.md
|
|
119
119
|
|
|
120
120
|
${l.bold("\u{1F680} Get started:")}
|
|
121
|
-
${l.cyan(`cd ${
|
|
121
|
+
${l.cyan(`cd ${f}`)}
|
|
122
122
|
${l.cyan("npx rapidkit init")} ${l.gray("# Install dependencies")}
|
|
123
123
|
${l.cyan("cp .env.example .env")}
|
|
124
124
|
${l.cyan("npx rapidkit dev")} ${l.gray("# Start dev server")}
|
|
@@ -139,7 +139,7 @@ ${l.bold("\u{1F310} API endpoints:")}
|
|
|
139
139
|
|
|
140
140
|
${l.gray("Alternative: npm run start:dev, ./rapidkit dev")}
|
|
141
141
|
${l.gray("\u{1F4A1} Tip: Install globally (npm i -g rapidkit) to use without npx")}
|
|
142
|
-
`);}catch(a){throw n.fail(`Failed to generate ${i} project`),a}}function
|
|
142
|
+
`);}catch(a){throw n.fail(`Failed to generate ${i} project`),a}}function yo(e){return e.split(/[-_\s]+/).map(o=>o.charAt(0).toUpperCase()+o.slice(1)).join("")}async function Br(e,o){await promises.mkdir(y.dirname(e),{recursive:true}),await promises.writeFile(e,o,"utf8");}function Jr(e){return `package main
|
|
143
143
|
|
|
144
144
|
import (
|
|
145
145
|
"fmt"
|
|
@@ -193,7 +193,7 @@ func main() {
|
|
|
193
193
|
}
|
|
194
194
|
slog.Info("server stopped")
|
|
195
195
|
}
|
|
196
|
-
`}function
|
|
196
|
+
`}function Yr(e){return `module ${e.module_path}
|
|
197
197
|
|
|
198
198
|
go ${e.go_version}
|
|
199
199
|
|
|
@@ -227,7 +227,7 @@ require (
|
|
|
227
227
|
golang.org/x/tools v0.21.0 // indirect
|
|
228
228
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
|
229
229
|
)
|
|
230
|
-
`}function
|
|
230
|
+
`}function zr(e){return `package config
|
|
231
231
|
|
|
232
232
|
import (
|
|
233
233
|
"log/slog"
|
|
@@ -280,7 +280,7 @@ func getEnv(key, fallback string) string {
|
|
|
280
280
|
}
|
|
281
281
|
return fallback
|
|
282
282
|
}
|
|
283
|
-
`}function
|
|
283
|
+
`}function Qr(e){return `package server
|
|
284
284
|
|
|
285
285
|
import (
|
|
286
286
|
"net/http"
|
|
@@ -346,7 +346,7 @@ func NewApp(cfg *config.Config) *fiber.App {
|
|
|
346
346
|
|
|
347
347
|
return app
|
|
348
348
|
}
|
|
349
|
-
`}function
|
|
349
|
+
`}function Xr(){return `package handlers
|
|
350
350
|
|
|
351
351
|
import (
|
|
352
352
|
"time"
|
|
@@ -384,7 +384,7 @@ func Readiness(c *fiber.Ctx) error {
|
|
|
384
384
|
"time": time.Now().UTC().Format(time.RFC3339),
|
|
385
385
|
})
|
|
386
386
|
}
|
|
387
|
-
`}function
|
|
387
|
+
`}function Zr(e){return `package handlers_test
|
|
388
388
|
|
|
389
389
|
import (
|
|
390
390
|
"encoding/json"
|
|
@@ -433,7 +433,7 @@ func TestReadiness(t *testing.T) {
|
|
|
433
433
|
t.Fatalf("expected 200, got %d: %s", resp.StatusCode, resp.Status)
|
|
434
434
|
}
|
|
435
435
|
}
|
|
436
|
-
`}function
|
|
436
|
+
`}function ei(){return `# \u2500\u2500 Build stage \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
437
437
|
FROM golang:1.24-alpine AS builder
|
|
438
438
|
|
|
439
439
|
# Build-time version injection
|
|
@@ -462,7 +462,7 @@ EXPOSE 3000
|
|
|
462
462
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \\
|
|
463
463
|
CMD wget -qO- http://localhost:3000/api/v1/health/live || exit 1
|
|
464
464
|
ENTRYPOINT ["/server"]
|
|
465
|
-
`}function
|
|
465
|
+
`}function ti(e){return `version: "3.9"
|
|
466
466
|
|
|
467
467
|
services:
|
|
468
468
|
api:
|
|
@@ -477,7 +477,7 @@ services:
|
|
|
477
477
|
CORS_ALLOW_ORIGINS: "*"
|
|
478
478
|
RATE_LIMIT_RPS: "100"
|
|
479
479
|
restart: unless-stopped
|
|
480
|
-
`}function
|
|
480
|
+
`}function oi(e){return `.PHONY: dev run build test cover lint fmt tidy docs docker-up docker-down
|
|
481
481
|
|
|
482
482
|
# Build-time metadata
|
|
483
483
|
VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
|
|
@@ -523,7 +523,7 @@ docker-up:
|
|
|
523
523
|
|
|
524
524
|
docker-down:
|
|
525
525
|
docker compose down
|
|
526
|
-
`}function
|
|
526
|
+
`}function ri(e){return `# Application
|
|
527
527
|
PORT=${e.port}
|
|
528
528
|
APP_ENV=development
|
|
529
529
|
LOG_LEVEL=debug
|
|
@@ -533,7 +533,7 @@ CORS_ALLOW_ORIGINS=*
|
|
|
533
533
|
|
|
534
534
|
# Rate limiting \u2014 max requests per IP per second
|
|
535
535
|
RATE_LIMIT_RPS=100
|
|
536
|
-
`}function
|
|
536
|
+
`}function ii(){return `# Binaries
|
|
537
537
|
bin/
|
|
538
538
|
*.exe
|
|
539
539
|
*.exe~
|
|
@@ -573,7 +573,7 @@ docs/docs.go
|
|
|
573
573
|
# OS
|
|
574
574
|
.DS_Store
|
|
575
575
|
Thumbs.db
|
|
576
|
-
`}function
|
|
576
|
+
`}function ni(e){return `name: CI
|
|
577
577
|
|
|
578
578
|
on:
|
|
579
579
|
push:
|
|
@@ -627,7 +627,7 @@ jobs:
|
|
|
627
627
|
uses: golangci/golangci-lint-action@v6
|
|
628
628
|
with:
|
|
629
629
|
version: latest
|
|
630
|
-
`}function
|
|
630
|
+
`}function si(e){return `# ${yo(e.project_name)}
|
|
631
631
|
|
|
632
632
|
> ${e.description}
|
|
633
633
|
|
|
@@ -742,7 +742,7 @@ ${e.project_name}/
|
|
|
742
742
|
## License
|
|
743
743
|
|
|
744
744
|
${e.app_version} \xB7 ${e.author}
|
|
745
|
-
`}function
|
|
745
|
+
`}function ai(){return `package middleware
|
|
746
746
|
|
|
747
747
|
import (
|
|
748
748
|
"crypto/rand"
|
|
@@ -795,7 +795,7 @@ func newID() string {
|
|
|
795
795
|
}
|
|
796
796
|
return hex.EncodeToString(b)
|
|
797
797
|
}
|
|
798
|
-
`}function
|
|
798
|
+
`}function ci(e){return `package middleware_test
|
|
799
799
|
|
|
800
800
|
import (
|
|
801
801
|
"net/http"
|
|
@@ -848,7 +848,7 @@ func TestRequestID_IsReused(t *testing.T) {
|
|
|
848
848
|
t.Fatalf("expected X-Request-ID to be reused, got %q", id)
|
|
849
849
|
}
|
|
850
850
|
}
|
|
851
|
-
`}function
|
|
851
|
+
`}function li(){return `// Package apierr provides a consistent JSON error envelope for all API responses.
|
|
852
852
|
//
|
|
853
853
|
// Every error response looks like:
|
|
854
854
|
//
|
|
@@ -912,7 +912,7 @@ func InternalError(c *fiber.Ctx, _ error) error {
|
|
|
912
912
|
func TooManyRequests(c *fiber.Ctx, msg string) error {
|
|
913
913
|
return reply(c, http.StatusTooManyRequests, msg, "TOO_MANY_REQUESTS")
|
|
914
914
|
}
|
|
915
|
-
`}function
|
|
915
|
+
`}function di(e){return `package apierr_test
|
|
916
916
|
|
|
917
917
|
import (
|
|
918
918
|
"encoding/json"
|
|
@@ -1044,11 +1044,11 @@ func TestTooManyRequests(t *testing.T) {
|
|
|
1044
1044
|
t.Fatalf("expected TOO_MANY_REQUESTS, got %q", body.Code)
|
|
1045
1045
|
}
|
|
1046
1046
|
}
|
|
1047
|
-
`}function
|
|
1047
|
+
`}function pi(e){return `// Package docs provides the swaggo-generated OpenAPI specification.
|
|
1048
1048
|
//
|
|
1049
1049
|
// Run \`make docs\` to regenerate after changing handler annotations.
|
|
1050
1050
|
//
|
|
1051
|
-
// @title ${
|
|
1051
|
+
// @title ${yo(e.project_name)} API
|
|
1052
1052
|
// @version ${e.app_version}
|
|
1053
1053
|
// @description ${e.description}
|
|
1054
1054
|
// @host localhost:${e.port}
|
|
@@ -1058,7 +1058,7 @@ func TestTooManyRequests(t *testing.T) {
|
|
|
1058
1058
|
// @contact.name ${e.author}
|
|
1059
1059
|
// @license.name MIT
|
|
1060
1060
|
package docs
|
|
1061
|
-
`}function
|
|
1061
|
+
`}function ui(e){return `package handlers
|
|
1062
1062
|
|
|
1063
1063
|
import (
|
|
1064
1064
|
"net/http"
|
|
@@ -1100,7 +1100,7 @@ func EchoParams(c *fiber.Ctx) error {
|
|
|
1100
1100
|
RequestID: rid,
|
|
1101
1101
|
})
|
|
1102
1102
|
}
|
|
1103
|
-
`}function
|
|
1103
|
+
`}function gi(e){return `package handlers_test
|
|
1104
1104
|
|
|
1105
1105
|
import (
|
|
1106
1106
|
"encoding/json"
|
|
@@ -1168,7 +1168,7 @@ func TestEchoParams_EmptyName(t *testing.T) {
|
|
|
1168
1168
|
t.Fatalf("expected code=BAD_REQUEST, got %v", body["code"])
|
|
1169
1169
|
}
|
|
1170
1170
|
}
|
|
1171
|
-
`}function
|
|
1171
|
+
`}function mi(e){return `package config_test
|
|
1172
1172
|
|
|
1173
1173
|
import (
|
|
1174
1174
|
"log/slog"
|
|
@@ -1236,7 +1236,7 @@ func TestLoad_Defaults(t *testing.T) {
|
|
|
1236
1236
|
t.Errorf("expected default LogLevel=debug (development env), got %q", cfg.LogLevel)
|
|
1237
1237
|
}
|
|
1238
1238
|
}
|
|
1239
|
-
`}function
|
|
1239
|
+
`}function fi(){return `package middleware
|
|
1240
1240
|
|
|
1241
1241
|
import (
|
|
1242
1242
|
"os"
|
|
@@ -1264,7 +1264,7 @@ func CORS() fiber.Handler {
|
|
|
1264
1264
|
MaxAge: 600,
|
|
1265
1265
|
})
|
|
1266
1266
|
}
|
|
1267
|
-
`}function
|
|
1267
|
+
`}function hi(e){return `package middleware_test
|
|
1268
1268
|
|
|
1269
1269
|
import (
|
|
1270
1270
|
"net/http"
|
|
@@ -1336,7 +1336,7 @@ func TestCORS_Default_Origin(t *testing.T) {
|
|
|
1336
1336
|
t.Fatal("expected CORS header when origins defaulting to *")
|
|
1337
1337
|
}
|
|
1338
1338
|
}
|
|
1339
|
-
`}function
|
|
1339
|
+
`}function yi(e){return `package server_test
|
|
1340
1340
|
|
|
1341
1341
|
import (
|
|
1342
1342
|
"encoding/json"
|
|
@@ -1425,7 +1425,7 @@ func TestServer_Docs_Redirect(t *testing.T) {
|
|
|
1425
1425
|
t.Fatalf("expected Location=/docs/index.html, got %q", loc)
|
|
1426
1426
|
}
|
|
1427
1427
|
}
|
|
1428
|
-
`}function
|
|
1428
|
+
`}function wi(e){return `package middleware
|
|
1429
1429
|
|
|
1430
1430
|
import (
|
|
1431
1431
|
"os"
|
|
@@ -1458,7 +1458,7 @@ func RateLimit() fiber.Handler {
|
|
|
1458
1458
|
},
|
|
1459
1459
|
})
|
|
1460
1460
|
}
|
|
1461
|
-
`}function
|
|
1461
|
+
`}function vi(e){return `package middleware_test
|
|
1462
1462
|
|
|
1463
1463
|
import (
|
|
1464
1464
|
"net/http"
|
|
@@ -1534,7 +1534,7 @@ func TestRateLimit_InvalidRPS(t *testing.T) {
|
|
|
1534
1534
|
t.Fatalf("expected 200 with invalid RPS env, got %d", resp.StatusCode)
|
|
1535
1535
|
}
|
|
1536
1536
|
}
|
|
1537
|
-
`}function
|
|
1537
|
+
`}function ki(e){return `# Air \u2014 live reload for Go projects
|
|
1538
1538
|
# https://github.com/air-verse/air
|
|
1539
1539
|
root = "."
|
|
1540
1540
|
tmp_dir = "tmp"
|
|
@@ -1558,7 +1558,7 @@ tmp_dir = "tmp"
|
|
|
1558
1558
|
|
|
1559
1559
|
[log]
|
|
1560
1560
|
time = false
|
|
1561
|
-
`}function
|
|
1561
|
+
`}function bi(e){return `run:
|
|
1562
1562
|
timeout: 5m
|
|
1563
1563
|
|
|
1564
1564
|
linters:
|
|
@@ -1604,7 +1604,7 @@ issues:
|
|
|
1604
1604
|
linters:
|
|
1605
1605
|
- errcheck
|
|
1606
1606
|
- wrapcheck
|
|
1607
|
-
`}function
|
|
1607
|
+
`}function Ri(){return JSON.stringify({engine:"npm",runtime:"go"},null,2)}function _i(e){return `#!/usr/bin/env sh
|
|
1608
1608
|
# RapidKit Go/Fiber project launcher \u2014 generated by RapidKit CLI
|
|
1609
1609
|
# https://getrapidkit.com
|
|
1610
1610
|
|
|
@@ -1683,7 +1683,7 @@ case "$CMD" in
|
|
|
1683
1683
|
exit 1
|
|
1684
1684
|
;;
|
|
1685
1685
|
esac
|
|
1686
|
-
`}function
|
|
1686
|
+
`}function Ci(e){return `@echo off
|
|
1687
1687
|
rem RapidKit Go/Fiber project launcher \u2014 Windows
|
|
1688
1688
|
set CMD=%1
|
|
1689
1689
|
if "%CMD%"=="" goto usage
|
|
@@ -1708,8 +1708,8 @@ if "%CMD%"=="start" ( bin\\${e.project_name}.exe %* & exit /b %ERRORLEVEL% )
|
|
|
1708
1708
|
:usage
|
|
1709
1709
|
echo Available: init, dev, start, build, docs, test, lint, format
|
|
1710
1710
|
exit /b 1
|
|
1711
|
-
`}function
|
|
1712
|
-
`));}let i=
|
|
1711
|
+
`}function Si(e,o){return JSON.stringify({kit_name:"gofiber.standard",runtime:"go",module_support:false,project_name:e.project_name,module_path:e.module_path,app_version:e.app_version,created_by:"rapidkit-npm",rapidkit_version:o,created_at:new Date().toISOString()},null,2)}async function Kt(e,o){let t={project_name:o.project_name,module_path:o.module_path||o.project_name,author:o.author||"RapidKit User",description:o.description||`Go/Fiber REST API \u2014 ${o.project_name}`,go_version:o.go_version||"1.24",app_version:o.app_version||"0.1.0",port:o.port||"3000",skipGit:o.skipGit??false},r=c();try{await execa("go",["version"],{timeout:3e3});}catch{console.log(l.yellow("\n\u26A0 Go not found in PATH \u2014 project will be scaffolded, but `go mod tidy` requires Go 1.21+")),console.log(l.gray(` Install: https://go.dev/dl/
|
|
1712
|
+
`));}let i=Ht(`Generating Go/Fiber project: ${t.project_name}\u2026`).start();try{let n=(c,d)=>Br(y.join(e,c),d),a=y.join(e,"rapidkit"),s=y.join(e,"rapidkit.cmd");await Promise.all([n("cmd/server/main.go",Jr(t)),n("go.mod",Yr(t)),n("internal/config/config.go",zr(t)),n("internal/server/server.go",Qr(t)),n("internal/middleware/requestid.go",ai()),n("internal/middleware/requestid_test.go",ci(t)),n("internal/apierr/apierr.go",li()),n("internal/apierr/apierr_test.go",di(t)),n("internal/handlers/health.go",Xr()),n("internal/handlers/health_test.go",Zr(t)),n("internal/handlers/example.go",ui(t)),n("internal/handlers/example_test.go",gi(t)),n("internal/config/config_test.go",mi(t)),n("internal/middleware/cors.go",fi()),n("internal/middleware/cors_test.go",hi(t)),n("internal/middleware/ratelimit.go",wi(t)),n("internal/middleware/ratelimit_test.go",vi(t)),n("internal/server/server_test.go",yi(t)),n("docs/doc.go",pi(t)),n(".air.toml",ki(t)),n("Dockerfile",ei()),n("docker-compose.yml",ti(t)),n("Makefile",oi(t)),n(".golangci.yml",bi(t.module_path)),n(".env.example",ri(t)),n(".gitignore",ii()),n(".github/workflows/ci.yml",ni(t)),n("README.md",si(t)),n(".rapidkit/project.json",Si(t,r)),n(".rapidkit/context.json",Ri()),n("rapidkit",_i(t)),n("rapidkit.cmd",Ci(t))]),await promises.chmod(a,493),await promises.chmod(s,493),i.succeed(l.green(`Project created at ${e}`));try{i.start("Fetching Go dependencies\u2026"),await execa("go",["mod","tidy"],{cwd:e,timeout:12e4}),i.succeed(l.gray("\u2713 go mod tidy completed"));}catch{i.warn(l.yellow("\u26A0 go mod tidy failed \u2014 run manually: go mod tidy"));}if(!t.skipGit)try{await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","chore: initial scaffold (rapidkit gofiber.standard)"],{cwd:e}),console.log(l.gray("\u2713 git repository initialized"));}catch{console.log(l.gray("\u26A0 git init skipped (git not found or error)"));}console.log(""),console.log(l.bold("\u2705 Go/Fiber project ready!")),console.log(""),console.log(l.cyan("Next steps:")),console.log(l.white(` cd ${t.project_name}`)),console.log(l.white(" make run # start dev server")),console.log(l.white(" make test # run tests")),console.log(""),console.log(l.gray("Server will listen on port "+t.port)),console.log(l.gray(" http://localhost:"+t.port+"/api/v1/health/live")),console.log(l.gray(" http://localhost:"+t.port+"/api/v1/health/ready")),console.log(""),console.log(l.yellow("\u2139 RapidKit modules are not available for Go projects (module system uses Python/pip).")),console.log("");}catch(n){throw i.fail(l.red("Failed to generate Go/Fiber project")),n}}function wo(e){return e.split(/[-_\s]+/).map(o=>o.charAt(0).toUpperCase()+o.slice(1)).join("")}async function Pi(e,o){await promises.mkdir(y.dirname(e),{recursive:true}),await promises.writeFile(e,o,"utf8");}function Ei(e){return `package main
|
|
1713
1713
|
|
|
1714
1714
|
import (
|
|
1715
1715
|
"context"
|
|
@@ -1776,7 +1776,7 @@ func main() {
|
|
|
1776
1776
|
}
|
|
1777
1777
|
slog.Info("server stopped")
|
|
1778
1778
|
}
|
|
1779
|
-
`}function
|
|
1779
|
+
`}function Ii(e){return `module ${e.module_path}
|
|
1780
1780
|
|
|
1781
1781
|
go ${e.go_version}
|
|
1782
1782
|
|
|
@@ -1825,7 +1825,7 @@ require (
|
|
|
1825
1825
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
|
1826
1826
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
|
1827
1827
|
)
|
|
1828
|
-
`}function
|
|
1828
|
+
`}function Ti(e){return `package config
|
|
1829
1829
|
|
|
1830
1830
|
import (
|
|
1831
1831
|
"log/slog"
|
|
@@ -1880,7 +1880,7 @@ func getEnv(key, fallback string) string {
|
|
|
1880
1880
|
}
|
|
1881
1881
|
return fallback
|
|
1882
1882
|
}
|
|
1883
|
-
`}function
|
|
1883
|
+
`}function Oi(e){return `package server
|
|
1884
1884
|
|
|
1885
1885
|
import (
|
|
1886
1886
|
"net/http"
|
|
@@ -1932,7 +1932,7 @@ func NewRouter(cfg *config.Config) *gin.Engine {
|
|
|
1932
1932
|
|
|
1933
1933
|
return r
|
|
1934
1934
|
}
|
|
1935
|
-
`}function
|
|
1935
|
+
`}function Ai(){return `package handlers
|
|
1936
1936
|
|
|
1937
1937
|
import (
|
|
1938
1938
|
"net/http"
|
|
@@ -1971,7 +1971,7 @@ func Readiness(c *gin.Context) {
|
|
|
1971
1971
|
"time": time.Now().UTC().Format(time.RFC3339),
|
|
1972
1972
|
})
|
|
1973
1973
|
}
|
|
1974
|
-
`}function
|
|
1974
|
+
`}function Ni(e){return `package handlers_test
|
|
1975
1975
|
|
|
1976
1976
|
import (
|
|
1977
1977
|
"encoding/json"
|
|
@@ -2016,7 +2016,7 @@ func TestReadiness(t *testing.T) {
|
|
|
2016
2016
|
t.Fatalf("expected 200, got %d: %s", w.Code, w.Body.String())
|
|
2017
2017
|
}
|
|
2018
2018
|
}
|
|
2019
|
-
`}function
|
|
2019
|
+
`}function $i(){return `# \u2500\u2500 Build stage \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
2020
2020
|
FROM golang:1.24-alpine AS builder
|
|
2021
2021
|
|
|
2022
2022
|
# Build-time version injection
|
|
@@ -2045,7 +2045,7 @@ EXPOSE 8080
|
|
|
2045
2045
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \\
|
|
2046
2046
|
CMD wget -qO- http://localhost:8080/api/v1/health/live || exit 1
|
|
2047
2047
|
ENTRYPOINT ["/server"]
|
|
2048
|
-
`}function
|
|
2048
|
+
`}function ji(e){return `version: "3.9"
|
|
2049
2049
|
|
|
2050
2050
|
services:
|
|
2051
2051
|
api:
|
|
@@ -2061,7 +2061,7 @@ services:
|
|
|
2061
2061
|
CORS_ALLOW_ORIGINS: "*"
|
|
2062
2062
|
RATE_LIMIT_RPS: "100"
|
|
2063
2063
|
restart: unless-stopped
|
|
2064
|
-
`}function
|
|
2064
|
+
`}function Di(e){return `.PHONY: dev run build test cover lint fmt tidy docs docker-up docker-down
|
|
2065
2065
|
|
|
2066
2066
|
# Build-time metadata
|
|
2067
2067
|
VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
|
|
@@ -2115,7 +2115,7 @@ docker-up:
|
|
|
2115
2115
|
|
|
2116
2116
|
docker-down:
|
|
2117
2117
|
docker compose down
|
|
2118
|
-
`}function
|
|
2118
|
+
`}function Mi(e){return `# Application
|
|
2119
2119
|
PORT=${e.port}
|
|
2120
2120
|
APP_ENV=development
|
|
2121
2121
|
GIN_MODE=debug
|
|
@@ -2126,7 +2126,7 @@ CORS_ALLOW_ORIGINS=*
|
|
|
2126
2126
|
|
|
2127
2127
|
# Rate limiting \u2014 max requests per IP per second
|
|
2128
2128
|
RATE_LIMIT_RPS=100
|
|
2129
|
-
`}function
|
|
2129
|
+
`}function Li(){return `# Binaries
|
|
2130
2130
|
bin/
|
|
2131
2131
|
*.exe
|
|
2132
2132
|
*.exe~
|
|
@@ -2166,7 +2166,7 @@ docs/docs.go
|
|
|
2166
2166
|
# OS
|
|
2167
2167
|
.DS_Store
|
|
2168
2168
|
Thumbs.db
|
|
2169
|
-
`}function
|
|
2169
|
+
`}function Gi(e){return `name: CI
|
|
2170
2170
|
|
|
2171
2171
|
on:
|
|
2172
2172
|
push:
|
|
@@ -2220,7 +2220,7 @@ jobs:
|
|
|
2220
2220
|
uses: golangci/golangci-lint-action@v6
|
|
2221
2221
|
with:
|
|
2222
2222
|
version: latest
|
|
2223
|
-
`}function
|
|
2223
|
+
`}function qi(e){return `# ${wo(e.project_name)}
|
|
2224
2224
|
|
|
2225
2225
|
> ${e.description}
|
|
2226
2226
|
|
|
@@ -2336,7 +2336,7 @@ ${e.project_name}/
|
|
|
2336
2336
|
## License
|
|
2337
2337
|
|
|
2338
2338
|
${e.app_version} \xB7 ${e.author}
|
|
2339
|
-
`}function
|
|
2339
|
+
`}function Fi(){return `package middleware
|
|
2340
2340
|
|
|
2341
2341
|
import (
|
|
2342
2342
|
"crypto/rand"
|
|
@@ -2388,7 +2388,7 @@ func newID() string {
|
|
|
2388
2388
|
}
|
|
2389
2389
|
return hex.EncodeToString(b)
|
|
2390
2390
|
}
|
|
2391
|
-
`}function
|
|
2391
|
+
`}function Hi(e){return `package middleware_test
|
|
2392
2392
|
|
|
2393
2393
|
import (
|
|
2394
2394
|
"net/http"
|
|
@@ -2437,7 +2437,7 @@ func TestRequestID_IsReused(t *testing.T) {
|
|
|
2437
2437
|
t.Fatalf("expected X-Request-ID to be reused, got %q", id)
|
|
2438
2438
|
}
|
|
2439
2439
|
}
|
|
2440
|
-
`}function
|
|
2440
|
+
`}function Ki(){return `// Package apierr provides a consistent JSON error envelope for all API responses.
|
|
2441
2441
|
//
|
|
2442
2442
|
// Every error response looks like:
|
|
2443
2443
|
//
|
|
@@ -2500,7 +2500,7 @@ func InternalError(c *gin.Context, _ error) {
|
|
|
2500
2500
|
func TooManyRequests(c *gin.Context) {
|
|
2501
2501
|
reply(c, http.StatusTooManyRequests, "rate limit exceeded", "TOO_MANY_REQUESTS")
|
|
2502
2502
|
}
|
|
2503
|
-
`}function
|
|
2503
|
+
`}function Wi(e){return `package apierr_test
|
|
2504
2504
|
|
|
2505
2505
|
import (
|
|
2506
2506
|
"encoding/json"
|
|
@@ -2626,11 +2626,11 @@ func TestTooManyRequests(t *testing.T) {
|
|
|
2626
2626
|
t.Fatalf("expected TOO_MANY_REQUESTS, got %q", body.Code)
|
|
2627
2627
|
}
|
|
2628
2628
|
}
|
|
2629
|
-
`}function
|
|
2629
|
+
`}function Ui(e){return `// Package docs provides the swaggo-generated OpenAPI specification.
|
|
2630
2630
|
//
|
|
2631
2631
|
// Run \`make docs\` to regenerate after changing handler annotations.
|
|
2632
2632
|
//
|
|
2633
|
-
// @title ${
|
|
2633
|
+
// @title ${wo(e.project_name)} API
|
|
2634
2634
|
// @version ${e.app_version}
|
|
2635
2635
|
// @description ${e.description}
|
|
2636
2636
|
// @host localhost:${e.port}
|
|
@@ -2640,7 +2640,7 @@ func TestTooManyRequests(t *testing.T) {
|
|
|
2640
2640
|
// @contact.name ${e.author}
|
|
2641
2641
|
// @license.name MIT
|
|
2642
2642
|
package docs
|
|
2643
|
-
`}function
|
|
2643
|
+
`}function Vi(e){return `package handlers
|
|
2644
2644
|
|
|
2645
2645
|
import (
|
|
2646
2646
|
"net/http"
|
|
@@ -2682,7 +2682,7 @@ func EchoParams(c *gin.Context) {
|
|
|
2682
2682
|
RequestID: c.GetString("X-Request-ID"),
|
|
2683
2683
|
})
|
|
2684
2684
|
}
|
|
2685
|
-
`}function
|
|
2685
|
+
`}function Bi(e){return `package handlers_test
|
|
2686
2686
|
|
|
2687
2687
|
import (
|
|
2688
2688
|
"encoding/json"
|
|
@@ -2747,7 +2747,7 @@ func TestEchoParams_EmptyName(t *testing.T) {
|
|
|
2747
2747
|
t.Fatalf("expected code=BAD_REQUEST, got %v", body["code"])
|
|
2748
2748
|
}
|
|
2749
2749
|
}
|
|
2750
|
-
`}function
|
|
2750
|
+
`}function Ji(e){return `package config_test
|
|
2751
2751
|
|
|
2752
2752
|
import (
|
|
2753
2753
|
"log/slog"
|
|
@@ -2823,7 +2823,7 @@ func TestLoad_Defaults(t *testing.T) {
|
|
|
2823
2823
|
t.Errorf("expected default GinMode=debug, got %q", cfg.GinMode)
|
|
2824
2824
|
}
|
|
2825
2825
|
}
|
|
2826
|
-
`}function
|
|
2826
|
+
`}function Yi(){return `package middleware
|
|
2827
2827
|
|
|
2828
2828
|
import (
|
|
2829
2829
|
"net/http"
|
|
@@ -2871,7 +2871,7 @@ func CORS() gin.HandlerFunc {
|
|
|
2871
2871
|
c.Next()
|
|
2872
2872
|
}
|
|
2873
2873
|
}
|
|
2874
|
-
`}function
|
|
2874
|
+
`}function zi(e){return `package middleware_test
|
|
2875
2875
|
|
|
2876
2876
|
import (
|
|
2877
2877
|
"net/http"
|
|
@@ -2957,7 +2957,7 @@ func TestCORS_Default_Origin(t *testing.T) {
|
|
|
2957
2957
|
t.Fatal("expected CORS header when CORS_ALLOW_ORIGINS defaults to *")
|
|
2958
2958
|
}
|
|
2959
2959
|
}
|
|
2960
|
-
`}function
|
|
2960
|
+
`}function Qi(e){return `package server_test
|
|
2961
2961
|
|
|
2962
2962
|
import (
|
|
2963
2963
|
"encoding/json"
|
|
@@ -3067,7 +3067,7 @@ func TestServer_ReleaseMode(t *testing.T) {
|
|
|
3067
3067
|
t.Fatalf("expected 200 in release mode, got %d", w.Code)
|
|
3068
3068
|
}
|
|
3069
3069
|
}
|
|
3070
|
-
`}function
|
|
3070
|
+
`}function Xi(e){return `package middleware
|
|
3071
3071
|
|
|
3072
3072
|
import (
|
|
3073
3073
|
"os"
|
|
@@ -3118,7 +3118,7 @@ func RateLimit() gin.HandlerFunc {
|
|
|
3118
3118
|
c.Next()
|
|
3119
3119
|
}
|
|
3120
3120
|
}
|
|
3121
|
-
`}function
|
|
3121
|
+
`}function Zi(e){return `package middleware_test
|
|
3122
3122
|
|
|
3123
3123
|
import (
|
|
3124
3124
|
"net/http"
|
|
@@ -3187,7 +3187,7 @@ func TestRateLimit_InvalidRPS(t *testing.T) {
|
|
|
3187
3187
|
t.Fatalf("expected 200 with invalid RPS env, got %d", w.Code)
|
|
3188
3188
|
}
|
|
3189
3189
|
}
|
|
3190
|
-
`}function
|
|
3190
|
+
`}function en(e){return `# Air \u2014 live reload for Go projects
|
|
3191
3191
|
# https://github.com/air-verse/air
|
|
3192
3192
|
root = "."
|
|
3193
3193
|
tmp_dir = "tmp"
|
|
@@ -3212,7 +3212,7 @@ tmp_dir = "tmp"
|
|
|
3212
3212
|
|
|
3213
3213
|
[log]
|
|
3214
3214
|
time = false
|
|
3215
|
-
`}function
|
|
3215
|
+
`}function tn(e){return `run:
|
|
3216
3216
|
timeout: 5m
|
|
3217
3217
|
|
|
3218
3218
|
linters:
|
|
@@ -3258,7 +3258,7 @@ issues:
|
|
|
3258
3258
|
linters:
|
|
3259
3259
|
- errcheck
|
|
3260
3260
|
- wrapcheck
|
|
3261
|
-
`}function
|
|
3261
|
+
`}function on(){return JSON.stringify({engine:"npm",runtime:"go"},null,2)}function rn(e,o){return JSON.stringify({kit_name:"gogin.standard",runtime:"go",module_support:false,project_name:e.project_name,module_path:e.module_path,app_version:e.app_version,created_by:"rapidkit-npm",rapidkit_version:o,created_at:new Date().toISOString()},null,2)}function nn(e){return `#!/usr/bin/env sh
|
|
3262
3262
|
# RapidKit Go/Gin project launcher \u2014 generated by RapidKit CLI
|
|
3263
3263
|
# https://getrapidkit.com
|
|
3264
3264
|
|
|
@@ -3337,7 +3337,7 @@ case "$CMD" in
|
|
|
3337
3337
|
exit 1
|
|
3338
3338
|
;;
|
|
3339
3339
|
esac
|
|
3340
|
-
`}function
|
|
3340
|
+
`}function sn(e){return `@echo off
|
|
3341
3341
|
rem RapidKit Go/Gin project launcher \u2014 Windows
|
|
3342
3342
|
set CMD=%1
|
|
3343
3343
|
if "%CMD%"=="" goto usage
|
|
@@ -3362,69 +3362,71 @@ if "%CMD%"=="start" ( bin\\${e.project_name}.exe %* & exit /b %ERRORLEVEL% )
|
|
|
3362
3362
|
:usage
|
|
3363
3363
|
echo Available: init, dev, start, build, docs, test, lint, format
|
|
3364
3364
|
exit /b 1
|
|
3365
|
-
`}async function
|
|
3366
|
-
`));}let i=At(`Generating Go/Gin project: ${t.project_name}\u2026`).start();try{let n=(c,p)=>ti(f.join(e,c),p),a=f.join(e,"rapidkit"),s=f.join(e,"rapidkit.cmd");await Promise.all([n("cmd/server/main.go",ri(t)),n("go.mod",oi(t)),n("internal/config/config.go",ii(t)),n("internal/server/server.go",ni(t)),n("internal/middleware/requestid.go",fi()),n("internal/middleware/requestid_test.go",hi(t)),n("internal/apierr/apierr.go",yi()),n("internal/apierr/apierr_test.go",wi(t)),n("internal/handlers/health.go",si()),n("internal/handlers/health_test.go",ai(t)),n("internal/handlers/example.go",ki(t)),n("internal/handlers/example_test.go",bi(t)),n("internal/config/config_test.go",Ri(t)),n("internal/middleware/cors.go",Ci()),n("internal/middleware/cors_test.go",Si(t)),n("internal/middleware/ratelimit.go",xi(t)),n("internal/middleware/ratelimit_test.go",Pi(t)),n("internal/server/server_test.go",_i(t)),n("docs/doc.go",vi(t)),n(".air.toml",Ei(t)),n("Dockerfile",ci()),n("docker-compose.yml",li(t)),n("Makefile",di(t)),n(".golangci.yml",Ii(t.module_path)),n(".env.example",pi(t)),n(".gitignore",ui()),n(".github/workflows/ci.yml",gi(t)),n("README.md",mi(t)),n(".rapidkit/project.json",Oi(t,o)),n(".rapidkit/context.json",Ti()),n("rapidkit",Ai(t)),n("rapidkit.cmd",Ni(t))]),await promises.chmod(a,493),await promises.chmod(s,493),i.succeed(l.green(`Project created at ${e}`));try{i.start("Fetching Go dependencies\u2026"),await execa("go",["mod","tidy"],{cwd:e,timeout:12e4}),i.succeed(l.gray("\u2713 go mod tidy completed"));}catch{i.warn(l.yellow("\u26A0 go mod tidy failed \u2014 run manually: go mod tidy"));}if(!t.skipGit)try{await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","chore: initial scaffold (rapidkit gogin.standard)"],{cwd:e}),console.log(l.gray("\u2713 git repository initialized"));}catch{console.log(l.gray("\u26A0 git init skipped (git not found or error)"));}console.log(""),console.log(l.bold("\u2705 Go/Gin project ready!")),console.log(""),console.log(l.cyan("Next steps:")),console.log(l.white(` cd ${t.project_name}`)),console.log(l.white(" make run # start dev server")),console.log(l.white(" make test # run tests")),console.log(""),console.log(l.gray("Server will listen on port "+t.port)),console.log(l.gray(" http://localhost:"+t.port+"/api/v1/health/live")),console.log(l.gray(" http://localhost:"+t.port+"/api/v1/health/ready")),console.log(""),console.log(l.yellow("\u2139 RapidKit modules are not available for Go projects (module system uses Python/pip).")),console.log("");}catch(n){throw i.fail(l.red("Failed to generate Go/Gin project")),n}}async function ar(){let e=process.platform==="win32"?["python","python3"]:["python3","python"];for(let r of e)try{let{stdout:t}=await execa(r,["--version"],{timeout:3e3}),o=t.match(/Python (\d+\.\d+\.\d+)/);if(o){let i=o[1],[n,a]=i.split(".").map(Number);return n<3||n===3&&a<10?{status:"warn",message:`Python ${i} (requires 3.10+)`,details:`${r} found but version is below minimum requirement`}:{status:"ok",message:`Python ${i}`,details:`Using ${r}`}}}catch{continue}return {status:"error",message:"Python not found",details:"Install Python 3.10+ and ensure it's in PATH"}}async function cr(){try{let{stdout:e}=await execa("poetry",["--version"],{timeout:3e3}),r=e.match(/Poetry .*version ([\d.]+)/);return r?{status:"ok",message:`Poetry ${r[1]}`,details:"Available for dependency management"}:{status:"warn",message:"Poetry version unknown"}}catch{return {status:"warn",message:"Poetry not installed",details:"Optional: Install for better dependency management"}}}async function lr(){try{let{stdout:e}=await execa("pipx",["--version"],{timeout:3e3});return {status:"ok",message:`pipx ${e.trim()}`,details:"Available for global tool installation"}}catch{return {status:"warn",message:"pipx not installed",details:"Optional: Install for isolated Python tools"}}}async function dr(){try{let{stdout:e}=await execa("go",["version"],{timeout:3e3}),r=e.match(/go version go(\d+\.\d+(?:\.\d+)?)/);return r?{status:"ok",message:`Go ${r[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 pr(){let e=process.env.HOME||process.env.USERPROFILE||"",r=[],t=[{location:"Global (pipx)",path:f.join(e,".local","bin","rapidkit")},{location:"Global (pipx)",path:f.join(e,"AppData","Roaming","Python","Scripts","rapidkit.exe")},{location:"Global (pyenv)",path:f.join(e,".pyenv","shims","rapidkit")},{location:"Global (system)",path:"/usr/local/bin/rapidkit"},{location:"Global (system)",path:"/usr/bin/rapidkit"}],o=[{location:"Workspace (.venv)",path:f.join(process.cwd(),".venv","bin","rapidkit")},{location:"Workspace (.venv)",path:f.join(process.cwd(),".venv","Scripts","rapidkit.exe")}];for(let{location:n,path:a}of [...t,...o])try{if(await b__default.pathExists(a)){let{stdout:s,exitCode:c}=await execa(a,["--version"],{timeout:3e3,reject:false});if(c===0&&(s.includes("RapidKit Version")||s.includes("RapidKit"))){let p=s.match(/v?([\d.]+(?:rc\d+)?(?:a\d+)?(?:b\d+)?)/);p&&r.push({location:n,path:a,version:p[1]});}}}catch{continue}if(r.length>0)return {status:"ok",message:`RapidKit Core ${r[0].version}`,paths:r.map(a=>({location:a.location,path:a.path,version:a.version}))};try{let{stdout:n,exitCode:a}=await execa("rapidkit",["--version"],{timeout:3e3,reject:false});if(a===0&&(n.includes("RapidKit Version")||n.includes("RapidKit"))){let s=n.match(/v?([\d.]+(?:rc\d+)?(?:a\d+)?(?:b\d+)?)/);if(s)return {status:"ok",message:`RapidKit Core ${s[1]}`,details:"Available via PATH"}}}catch{}try{let{stdout:n,exitCode:a}=await execa("poetry",["run","rapidkit","--version"],{timeout:3e3,reject:false});if(a===0&&(n.includes("RapidKit Version")||n.includes("RapidKit"))){let s=n.match(/v?([\d.]+(?:rc\d+)?(?:a\d+)?(?:b\d+)?)/);if(s)return {status:"ok",message:`RapidKit Core ${s[1]}`,details:"Available via Poetry"}}}catch{}let i=process.platform==="win32"?["python","python3"]:["python3","python"];for(let n of i)try{let{stdout:a,exitCode:s}=await execa(n,["-c","import rapidkit_core; print(rapidkit_core.__version__)"],{timeout:3e3,reject:false});if(s===0&&a&&!a.includes("Traceback")&&!a.includes("ModuleNotFoundError")){let c=a.trim();if(c)return {status:"ok",message:`RapidKit Core ${c}`,details:`Available in ${n} environment`}}}catch{continue}return {status:"error",message:"RapidKit Core not installed",details:"Install with: pipx install rapidkit-core"}}async function mt(e,r){let t=f.join(e,"Dockerfile");r.hasDocker=await b__default.pathExists(t);let o=f.join(e,"tests"),i=f.join(e,"test"),n=await b__default.pathExists(o)||await b__default.pathExists(i),a=false;if(r.framework==="Go/Fiber"||r.framework==="Go/Gin")try{let s=[{dir:e,depth:0}],c=4,p=new Set([".git",".venv","node_modules","dist","build","vendor"]);for(;s.length>0&&!a;){let d=s.shift();if(!d)break;let m=[];try{m=await b__default.readdir(d.dir);}catch{continue}for(let h of m){let w=f.join(d.dir,h),g;try{g=await b__default.stat(w);}catch{continue}if(g.isFile()&&h.endsWith("_test.go")){a=true;break}g.isDirectory()&&d.depth<c&&!p.has(h)&&!h.startsWith(".")&&s.push({dir:w,depth:d.depth+1});}}}catch{}if(r.hasTests=n||a,r.framework==="NestJS"){let s=f.join(e,".eslintrc.js"),c=f.join(e,".eslintrc.json");r.hasCodeQuality=await b__default.pathExists(s)||await b__default.pathExists(c);}else if(r.framework==="Go/Fiber"||r.framework==="Go/Gin"){let s=f.join(e,".golangci.yml"),c=f.join(e,".golangci.yaml"),p=f.join(e,"Makefile"),d=await b__default.pathExists(p)&&(await b__default.readFile(p,"utf8")).includes("golangci-lint");r.hasCodeQuality=await b__default.pathExists(s)||await b__default.pathExists(c)||d;}else if(r.framework==="FastAPI"){let s=f.join(e,"ruff.toml"),c=f.join(e,"pyproject.toml");if(await b__default.pathExists(c))try{let p=await b__default.readFile(c,"utf8");r.hasCodeQuality=p.includes("[tool.ruff]")||await b__default.pathExists(s);}catch{r.hasCodeQuality=await b__default.pathExists(s);}}try{if(r.framework==="NestJS"){let{stdout:s}=await execa("npm",["audit","--json"],{cwd:e,reject:false});if(s)try{let p=JSON.parse(s).metadata?.vulnerabilities;p&&(r.vulnerabilities=(p.high||0)+(p.critical||0)+(p.moderate||0));}catch{}}else if(r.framework==="FastAPI"){let s=f.join(e,".venv"),c=process.platform==="win32"?f.join(s,"Scripts","python.exe"):f.join(s,"bin","python");if(await b__default.pathExists(c))try{let{stdout:p}=await execa(c,["-m","pip","list","--format=json"],{timeout:5e3,reject:false});if(p){JSON.parse(p);r.vulnerabilities=0;}}catch{}}}catch{}}async function $i(e){let t={name:f.basename(e),path:e,venvActive:false,depsInstalled:false,coreInstalled:false,issues:[],fixCommands:[]},o=f.join(e,".rapidkit");if(!await b__default.pathExists(o))return t.issues.push("Not a valid RapidKit project (missing .rapidkit directory)"),t;try{let m=f.join(e,"registry.json");if(await b__default.pathExists(m)){let h=await b__default.readJson(m);h.installed_modules&&(t.stats={modules:h.installed_modules.length});}}catch{}let i=null;try{let m=f.join(o,"project.json");if(await b__default.pathExists(m)){i=await b__default.readJson(m);let h=i?.kit_name||i?.kit;h&&(t.kit=h);}}catch{}try{let m=f.join(e,".git");if(await b__default.pathExists(m)){let{stdout:h}=await execa("git",["log","-1","--format=%cr"],{cwd:e,reject:false});h&&(t.lastModified=h.trim());}else {let h=await b__default.stat(e),g=Date.now()-h.mtime.getTime(),u=Math.floor(g/(1e3*60*60*24));t.lastModified=u===0?"today":`${u} day${u>1?"s":""} ago`;}}catch{}let n=f.join(e,"package.json"),a=f.join(e,"pyproject.toml"),s=f.join(e,"go.mod");if(await b__default.pathExists(s)||i?.runtime==="go"||typeof i?.kit_name=="string"&&(i.kit_name.startsWith("gofiber")||i.kit_name.startsWith("gogin"))){let m=i?.kit_name??"";t.framework=m.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=f.join(e,"go.sum");return await b__default.pathExists(h)?t.depsInstalled=true:(t.depsInstalled=false,t.issues.push("Go dependencies not downloaded (go.sum missing)"),t.fixCommands?.push(`cd ${e} && go mod tidy`)),await mt(e,t),t}let p=await b__default.pathExists(n),d=await b__default.pathExists(a);if(p){t.framework="NestJS",t.venvActive=true;let m=f.join(e,"node_modules");if(await b__default.pathExists(m))try{let u=(await b__default.readdir(m)).filter(C=>!C.startsWith(".")&&!C.startsWith("_"));t.depsInstalled=u.length>0;}catch{t.depsInstalled=false;}t.depsInstalled||(t.issues.push("Dependencies not installed (node_modules empty or missing)"),t.fixCommands?.push(`cd ${e} && rapidkit init`)),t.coreInstalled=false;let h=f.join(e,".env");if(t.hasEnvFile=await b__default.pathExists(h),!t.hasEnvFile){let g=f.join(e,".env.example");await b__default.pathExists(g)&&(t.issues.push("Environment file missing (found .env.example)"),t.fixCommands?.push(`cd ${e} && cp .env.example .env`));}let w=f.join(e,"src");if(t.modulesHealthy=true,t.missingModules=[],await b__default.pathExists(w))try{let g=await b__default.readdir(w);t.modulesHealthy=g.length>0;}catch{t.modulesHealthy=false;}return await mt(e,t),t}if(d){t.framework="FastAPI";let m=f.join(e,".venv");if(await b__default.pathExists(m)){t.venvActive=true;let u=process.platform==="win32"?f.join(m,"Scripts","python.exe"):f.join(m,"bin","python");if(await b__default.pathExists(u)){try{let{stdout:C}=await execa(u,["-c","import rapidkit_core; print(rapidkit_core.__version__)"],{timeout:2e3});t.coreInstalled=true,t.coreVersion=C.trim();}catch{t.coreInstalled=false;}try{await execa(u,["-c","import fastapi"],{timeout:2e3}),t.depsInstalled=true;}catch{try{let C=f.join(m,"lib");if(await b__default.pathExists(C)){let A=(await b__default.readdir(C)).find(_=>_.startsWith("python"));if(A){let _=f.join(C,A,"site-packages");if(await b__default.pathExists(_)){let K=(await b__default.readdir(_)).filter(D=>!D.startsWith("_")&&!D.includes("dist-info")&&!["pip","setuptools","wheel","pkg_resources"].includes(D));t.depsInstalled=K.length>0;}}}t.depsInstalled||(t.issues.push("Dependencies not installed"),t.fixCommands?.push(`cd ${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(`cd ${e} && rapidkit init`);let h=f.join(e,".env");if(t.hasEnvFile=await b__default.pathExists(h),!t.hasEnvFile){let u=f.join(e,".env.example");await b__default.pathExists(u)&&(t.issues.push("Environment file missing (found .env.example)"),t.fixCommands?.push(`cd ${e} && cp .env.example .env`));}let w=f.join(e,"src"),g=f.join(e,"modules");if(t.modulesHealthy=true,t.missingModules=[],await b__default.pathExists(w)){let u=f.join(w,"__init__.py");await b__default.pathExists(u)||(t.modulesHealthy=false,t.missingModules.push("src/__init__.py"));}if(await b__default.pathExists(g))try{let u=await ur(g);for(let C of u){let I=f.join(g,C,"__init__.py");await b__default.pathExists(I)||(t.modulesHealthy=false,t.missingModules.push(`modules/${C}/__init__.py`));}}catch{}return !t.modulesHealthy&&t.missingModules.length>0&&t.issues.push(`Missing module init files: ${t.missingModules.join(", ")}`),await mt(e,t),t}return t.issues.push("Unknown project type (no package.json or pyproject.toml)"),await mt(e,t),t}async function ur(e){try{return (await b__default.readdir(e,{withFileTypes:true})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{try{let r=await b__default.readdir(e),t=[];for(let o of r)try{(await b__default.stat(f.join(e,o))).isDirectory()&&t.push(o);}catch{continue}return t}catch{return []}}}async function $t(e){let r=f.join(e,".rapidkit");if(!await b__default.pathExists(r))return false;let t=["project.json","context.json","file-hashes.json"];for(let o of t)if(await b__default.pathExists(f.join(r,o)))return true;return false}function gr(e,r){if(r.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 Di(e,r,t){let o=new Set,i=[{dir:e,depth:0}];for(;i.length>0;){let n=i.shift();if(!n)break;try{let a=await b__default.readdir(n.dir);for(let s of a){if(gr(s,t))continue;let c=f.join(n.dir,s),p;try{p=await b__default.stat(c);}catch{continue}if(p.isDirectory()){if(await $t(c)){o.add(c);continue}n.depth<r&&i.push({dir:c,depth:n.depth+1});}}}catch{continue}}return Array.from(o)}async function nr(e){let r=e,t=f.parse(r).root;for(;r!==t;){let o=[f.join(r,".rapidkit-workspace"),f.join(r,".rapidkit","workspace-marker.json"),f.join(r,".rapidkit","config.json")];for(let i of o)if(await b__default.pathExists(i))return r;r=f.dirname(r);}return null}function Gi(e,r){let t=0,o=0,i=0;return e.forEach(a=>{a.status==="ok"?t++:a.status==="warn"?o++:a.status==="error"&&i++;}),r.forEach(a=>{(a.isGoProject?a.issues.length===0&&a.depsInstalled:a.issues.length===0&&a.venvActive&&a.depsInstalled)?t++:a.issues.length>0&&o++;}),{total:t+o+i,passed:t,warnings:o,errors:i}}async function Mi(e){let r=f.basename(e);try{let i=f.join(e,".rapidkit-workspace");await b__default.pathExists(i)&&(r=(await b__default.readJSON(i)).name||r);}catch{try{let i=f.join(e,".rapidkit","config.json");r=(await b__default.readJSON(i)).workspace_name||r;}catch{}}let t={workspacePath:e,workspaceName:r,python:await ar(),poetry:await cr(),pipx:await lr(),go:await dr(),rapidkitCore:await pr(),projects:[]};try{let i=new Set([".git",".venv","node_modules",".rapidkit","dist","build","coverage","__pycache__"]),n=new Set;await $t(e)&&n.add(e);let a$1=async(s,c)=>{if(c<0)return;let p=await ur(s);for(let d of p){if(gr(d,i))continue;let m=f.join(s,d);if(await $t(m)){n.add(m);continue}c>0&&await a$1(m,c-1);}};if(await a$1(e,1),a.debug(`Workspace scan (shallow) found ${n.size} project(s)`),n.size===0){let s=await Di(e,3,i);s.forEach(c=>n.add(c)),a.debug(`Workspace scan (deep fallback) found ${s.length} project(s)`);}n.size>0&&a.debug(`Workspace projects detected: ${Array.from(n).join(", ")}`);for(let s of n){let c=await $i(s);t.projects.push(c);}}catch(i){a.debug(`Failed to scan workspace projects: ${i}`);}let o=[t.python,t.poetry,t.pipx,t.go,t.rapidkitCore];if(t.healthScore=Gi(o,t.projects),t.rapidkitCore.status==="ok"){let i=t.rapidkitCore.message.match(/([\d.]+(?:rc\d+)?(?:a\d+)?(?:b\d+)?)/);i&&(t.coreVersion=i[1]);}return t}function Re(e,r){let t=e.status==="ok"?"\u2705":e.status==="warn"?"\u26A0\uFE0F":"\u274C",o=e.status==="ok"?l.green:e.status==="warn"?l.yellow:l.red;console.log(`${t} ${l.bold(r)}: ${o(e.message)}`),e.paths&&e.paths.length>0?e.paths.forEach(i=>{let n=i.version?l.cyan(` -> ${i.version}`):"";console.log(` ${l.cyan("\u2022")} ${l.gray(i.location)}: ${l.dim(i.path)}${n}`);}):e.details&&console.log(` ${l.gray(e.details)}`);}function Li(e){let r=e.issues.length>0,t=r?"\u26A0\uFE0F":"\u2705",o=r?l.yellow:l.green;if(console.log(`
|
|
3367
|
-
${t} ${l.bold("Project")}: ${
|
|
3368
|
-
${l.bold.cyan("\u{1F527} Quick Fix:")}`),e.fixCommands.forEach(c=>{console.log(` ${l.cyan("$")} ${l.white(c)}`);})));}async function
|
|
3365
|
+
`}async function Wt(e,o){let t={project_name:o.project_name,module_path:o.module_path||o.project_name,author:o.author||"RapidKit User",description:o.description||`Go/Gin REST API \u2014 ${o.project_name}`,go_version:o.go_version||"1.24",app_version:o.app_version||"0.1.0",port:o.port||"8080",skipGit:o.skipGit??false},r=c();try{await execa("go",["version"],{timeout:3e3});}catch{console.log(l.yellow("\n\u26A0 Go not found in PATH \u2014 project will be scaffolded, but `go mod tidy` requires Go 1.21+")),console.log(l.gray(` Install: https://go.dev/dl/
|
|
3366
|
+
`));}let i=Ht(`Generating Go/Gin project: ${t.project_name}\u2026`).start();try{let n=(c,d)=>Pi(y.join(e,c),d),a=y.join(e,"rapidkit"),s=y.join(e,"rapidkit.cmd");await Promise.all([n("cmd/server/main.go",Ei(t)),n("go.mod",Ii(t)),n("internal/config/config.go",Ti(t)),n("internal/server/server.go",Oi(t)),n("internal/middleware/requestid.go",Fi()),n("internal/middleware/requestid_test.go",Hi(t)),n("internal/apierr/apierr.go",Ki()),n("internal/apierr/apierr_test.go",Wi(t)),n("internal/handlers/health.go",Ai()),n("internal/handlers/health_test.go",Ni(t)),n("internal/handlers/example.go",Vi(t)),n("internal/handlers/example_test.go",Bi(t)),n("internal/config/config_test.go",Ji(t)),n("internal/middleware/cors.go",Yi()),n("internal/middleware/cors_test.go",zi(t)),n("internal/middleware/ratelimit.go",Xi(t)),n("internal/middleware/ratelimit_test.go",Zi(t)),n("internal/server/server_test.go",Qi(t)),n("docs/doc.go",Ui(t)),n(".air.toml",en(t)),n("Dockerfile",$i()),n("docker-compose.yml",ji(t)),n("Makefile",Di(t)),n(".golangci.yml",tn(t.module_path)),n(".env.example",Mi(t)),n(".gitignore",Li()),n(".github/workflows/ci.yml",Gi(t)),n("README.md",qi(t)),n(".rapidkit/project.json",rn(t,r)),n(".rapidkit/context.json",on()),n("rapidkit",nn(t)),n("rapidkit.cmd",sn(t))]),await promises.chmod(a,493),await promises.chmod(s,493),i.succeed(l.green(`Project created at ${e}`));try{i.start("Fetching Go dependencies\u2026"),await execa("go",["mod","tidy"],{cwd:e,timeout:12e4}),i.succeed(l.gray("\u2713 go mod tidy completed"));}catch{i.warn(l.yellow("\u26A0 go mod tidy failed \u2014 run manually: go mod tidy"));}if(!t.skipGit)try{await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","chore: initial scaffold (rapidkit gogin.standard)"],{cwd:e}),console.log(l.gray("\u2713 git repository initialized"));}catch{console.log(l.gray("\u26A0 git init skipped (git not found or error)"));}console.log(""),console.log(l.bold("\u2705 Go/Gin project ready!")),console.log(""),console.log(l.cyan("Next steps:")),console.log(l.white(` cd ${t.project_name}`)),console.log(l.white(" make run # start dev server")),console.log(l.white(" make test # run tests")),console.log(""),console.log(l.gray("Server will listen on port "+t.port)),console.log(l.gray(" http://localhost:"+t.port+"/api/v1/health/live")),console.log(l.gray(" http://localhost:"+t.port+"/api/v1/health/ready")),console.log(""),console.log(l.yellow("\u2139 RapidKit modules are not available for Go projects (module system uses Python/pip).")),console.log("");}catch(n){throw i.fail(l.red("Failed to generate Go/Gin project")),n}}function cn(e){return [...new Set(e.filter(o=>o&&o.trim().length>0))]}function ln(){let e=k().map(r=>y.join(r,a()?"poetry.exe":"poetry")),o=a()?[y.join(process.env.APPDATA||"","Python","Scripts","poetry.exe"),y.join(process.env.USERPROFILE||"","AppData","Roaming","Python","Scripts","poetry.exe")]:[],t=a()?[]:["/usr/local/bin/poetry","/usr/bin/poetry"];return cn([...e,...o,...t])}function dn(e){let o=k().map(c=>({location:"Global (user-local)",path:y.join(c,a()?"rapidkit.exe":"rapidkit")})),t=[{location:"Global (pipx)",path:y.join(e,".local","bin","rapidkit")},{location:"Global (pipx)",path:y.join(e,"AppData","Roaming","Python","Scripts","rapidkit.exe")},{location:"Global (pyenv)",path:y.join(e,".pyenv","shims","rapidkit")},{location:"Global (system)",path:"/usr/local/bin/rapidkit"},{location:"Global (system)",path:"/usr/bin/rapidkit"}],r=g(y.join(process.cwd(),".venv")),i=i$1(process.cwd()),n=[{location:"Workspace (.venv)",path:r},...i.map(c=>({location:"Workspace (launcher)",path:c}))],a$1=[...o,...t,...n],s=new Set;return a$1.filter(c=>s.has(c.path)?false:(s.add(c.path),true))}function Je(e,o){return a()?`cd "${e}"; ${o}`:`cd ${e} && ${o}`}function vo(e){return a()?Je(e,"Copy-Item .env.example .env"):Je(e,"cp .env.example .env")}async function Ro(){let e=d$2();for(let o of e)try{let{stdout:t}=await execa(o,["--version"],{timeout:3e3}),r=t.match(/Python (\d+\.\d+\.\d+)/);if(r){let i=r[1],[n,a]=i.split(".").map(Number);return n<3||n===3&&a<10?{status:"warn",message:`Python ${i} (requires 3.10+)`,details:`${o} found but version is below minimum requirement`}:{status:"ok",message:`Python ${i}`,details:`Using ${o}`}}}catch{continue}return {status:"error",message:"Python not found",details:"Install Python 3.10+ and ensure it's in PATH"}}async function _o(){try{let{stdout:e}=await execa("poetry",["--version"],{timeout:3e3}),o=e.match(/Poetry .*version ([\d.]+)/);return o?{status:"ok",message:`Poetry ${o[1]}`,details:"Available for dependency management"}:{status:"warn",message:"Poetry version unknown"}}catch{let e=d$2().map(o=>({cmd:o,args:o==="py"?["-3","-m","poetry","--version"]:["-m","poetry","--version"]}));for(let o of e)try{let{stdout:t}=await execa(o.cmd,o.args,{timeout:3e3,shell:b$3()}),r=t.match(/Poetry .*version ([\d.]+)/)||t.match(/([\d.]+)/);return {status:"ok",message:r?.[1]?`Poetry ${r[1]}`:"Poetry detected",details:`Available via ${o.cmd} ${o.args.join(" ")}`}}catch{continue}for(let o of ln())try{if(!await ___default.pathExists(o))continue;let{stdout:t}=await execa(o,["--version"],{timeout:3e3,shell:b$3()}),r=t.match(/Poetry .*version ([\d.]+)/)||t.match(/([\d.]+)/);return {status:"ok",message:r?.[1]?`Poetry ${r[1]}`:"Poetry detected",details:`Available at ${o}`}}catch{continue}return {status:"warn",message:"Poetry not installed",details:"Optional: Install for better dependency management"}}}async function Co(){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$2();for(let o of e)try{let t=o==="py"?["-3","-m","pipx","--version"]:["-m","pipx","--version"],{stdout:r}=await execa(o,t,{timeout:3e3,shell:b$3()});return {status:"ok",message:`pipx ${r.trim()}`,details:`Available via ${o} ${t.join(" ")}`}}catch{continue}return {status:"warn",message:"pipx not installed",details:"Optional: Install for isolated Python tools"}}}async function So(){try{let{stdout:e}=await execa("go",["version"],{timeout:3e3}),o=e.match(/go version go(\d+\.\d+(?:\.\d+)?)/);return o?{status:"ok",message:`Go ${o[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 xo(){let e=process.env.HOME||process.env.USERPROFILE||"",o=[],t=dn(e);for(let{location:i,path:n}of t)try{if(await ___default.pathExists(n)){let{stdout:a,exitCode:s}=await execa(n,["--version"],{timeout:3e3,reject:false});if(s===0&&(a.includes("RapidKit Version")||a.includes("RapidKit"))){let c=a.match(/v?([\d.]+(?:rc\d+)?(?:a\d+)?(?:b\d+)?)/);c&&o.push({location:i,path:n,version:c[1]});}}}catch{continue}if(o.length>0)return {status:"ok",message:`RapidKit Core ${o[0].version}`,paths:o.map(n=>({location:n.location,path:n.path,version:n.version}))};try{let{stdout:i,exitCode:n}=await execa("rapidkit",["--version"],{timeout:3e3,reject:false});if(n===0&&(i.includes("RapidKit Version")||i.includes("RapidKit"))){let a=i.match(/v?([\d.]+(?:rc\d+)?(?:a\d+)?(?:b\d+)?)/);if(a)return {status:"ok",message:`RapidKit Core ${a[1]}`,details:"Available via PATH"}}}catch{}try{let{stdout:i,exitCode:n}=await execa("poetry",["run","rapidkit","--version"],{timeout:3e3,reject:false});if(n===0&&(i.includes("RapidKit Version")||i.includes("RapidKit"))){let a=i.match(/v?([\d.]+(?:rc\d+)?(?:a\d+)?(?:b\d+)?)/);if(a)return {status:"ok",message:`RapidKit Core ${a[1]}`,details:"Available via Poetry"}}}catch{}let r=d$2();for(let i of r)try{let{stdout:n,exitCode:a}=await execa(i,["-c","import rapidkit_core; print(rapidkit_core.__version__)"],{timeout:3e3,reject:false});if(a===0&&n&&!n.includes("Traceback")&&!n.includes("ModuleNotFoundError")){let s=n.trim();if(s)return {status:"ok",message:`RapidKit Core ${s}`,details:`Available in ${i} environment`}}}catch{continue}return {status:"error",message:"RapidKit Core not installed",details:"Install with: pipx install rapidkit-core"}}async function Rt(e,o){let t=y.join(e,"Dockerfile");o.hasDocker=await ___default.pathExists(t);let r=y.join(e,"tests"),i=y.join(e,"test"),n=await ___default.pathExists(r)||await ___default.pathExists(i),a=false;if(o.framework==="Go/Fiber"||o.framework==="Go/Gin")try{let s=[{dir:e,depth:0}],c=4,d=new Set([".git",".venv","node_modules","dist","build","vendor"]);for(;s.length>0&&!a;){let p=s.shift();if(!p)break;let u=[];try{u=await ___default.readdir(p.dir);}catch{continue}for(let g of u){let h=y.join(p.dir,g),f;try{f=await ___default.stat(h);}catch{continue}if(f.isFile()&&g.endsWith("_test.go")){a=true;break}f.isDirectory()&&p.depth<c&&!d.has(g)&&!g.startsWith(".")&&s.push({dir:h,depth:p.depth+1});}}}catch{}if(o.hasTests=n||a,o.framework==="NestJS"){let s=y.join(e,".eslintrc.js"),c=y.join(e,".eslintrc.json");o.hasCodeQuality=await ___default.pathExists(s)||await ___default.pathExists(c);}else if(o.framework==="Go/Fiber"||o.framework==="Go/Gin"){let s=y.join(e,".golangci.yml"),c=y.join(e,".golangci.yaml"),d=y.join(e,"Makefile"),p=await ___default.pathExists(d)&&(await ___default.readFile(d,"utf8")).includes("golangci-lint");o.hasCodeQuality=await ___default.pathExists(s)||await ___default.pathExists(c)||p;}else if(o.framework==="FastAPI"){let s=y.join(e,"ruff.toml"),c=y.join(e,"pyproject.toml");if(await ___default.pathExists(c))try{let d=await ___default.readFile(c,"utf8");o.hasCodeQuality=d.includes("[tool.ruff]")||await ___default.pathExists(s);}catch{o.hasCodeQuality=await ___default.pathExists(s);}}try{if(o.framework==="NestJS"){let{stdout:s}=await execa("npm",["audit","--json"],{cwd:e,reject:false});if(s)try{let d=JSON.parse(s).metadata?.vulnerabilities;d&&(o.vulnerabilities=(d.high||0)+(d.critical||0)+(d.moderate||0));}catch{}}else if(o.framework==="FastAPI"){let s=y.join(e,".venv"),c=f$1(s);if(await ___default.pathExists(c))try{let{stdout:d}=await execa(c,["-m","pip","list","--format=json"],{timeout:5e3,reject:false});if(d){JSON.parse(d);o.vulnerabilities=0;}}catch{}}}catch{}}async function pn(e){let t={name:y.basename(e),path:e,venvActive:false,depsInstalled:false,coreInstalled:false,issues:[],fixCommands:[]},r=y.join(e,".rapidkit");if(!await ___default.pathExists(r))return t.issues.push("Not a valid RapidKit project (missing .rapidkit directory)"),t;try{let u=y.join(e,"registry.json");if(await ___default.pathExists(u)){let g=await ___default.readJson(u);g.installed_modules&&(t.stats={modules:g.installed_modules.length});}}catch{}let i=null;try{let u=y.join(r,"project.json");if(await ___default.pathExists(u)){i=await ___default.readJson(u);let g=i?.kit_name||i?.kit;g&&(t.kit=g);}}catch{}try{let u=y.join(e,".git");if(await ___default.pathExists(u)){let{stdout:g}=await execa("git",["log","-1","--format=%cr"],{cwd:e,reject:false});g&&(t.lastModified=g.trim());}else {let g=await ___default.stat(e),f=Date.now()-g.mtime.getTime(),m=Math.floor(f/(1e3*60*60*24));t.lastModified=m===0?"today":`${m} day${m>1?"s":""} ago`;}}catch{}let n=y.join(e,"package.json"),a=y.join(e,"pyproject.toml"),s=y.join(e,"go.mod");if(await ___default.pathExists(s)||i?.runtime==="go"||typeof i?.kit_name=="string"&&(i.kit_name.startsWith("gofiber")||i.kit_name.startsWith("gogin"))){let u=i?.kit_name??"";t.framework=u.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 g=y.join(e,"go.sum");return await ___default.pathExists(g)?t.depsInstalled=true:(t.depsInstalled=false,t.issues.push("Go dependencies not downloaded (go.sum missing)"),t.fixCommands?.push(Je(e,"go mod tidy"))),await Rt(e,t),t}let d=await ___default.pathExists(n),p=await ___default.pathExists(a);if(d){t.framework="NestJS",t.venvActive=true;let u=y.join(e,"node_modules");if(await ___default.pathExists(u))try{let m=(await ___default.readdir(u)).filter(k=>!k.startsWith(".")&&!k.startsWith("_"));t.depsInstalled=m.length>0;}catch{t.depsInstalled=false;}t.depsInstalled||(t.issues.push("Dependencies not installed (node_modules empty or missing)"),t.fixCommands?.push(Je(e,"rapidkit init"))),t.coreInstalled=false;let g=y.join(e,".env");if(t.hasEnvFile=await ___default.pathExists(g),!t.hasEnvFile){let f=y.join(e,".env.example");await ___default.pathExists(f)&&(t.issues.push("Environment file missing (found .env.example)"),t.fixCommands?.push(vo(e)));}let h=y.join(e,"src");if(t.modulesHealthy=true,t.missingModules=[],await ___default.pathExists(h))try{let f=await ___default.readdir(h);t.modulesHealthy=f.length>0;}catch{t.modulesHealthy=false;}return await Rt(e,t),t}if(p){t.framework="FastAPI";let u=y.join(e,".venv");if(await ___default.pathExists(u)){t.venvActive=true;let m=f$1(u);if(await ___default.pathExists(m)){try{let{stdout:k}=await execa(m,["-c","import rapidkit_core; print(rapidkit_core.__version__)"],{timeout:2e3});t.coreInstalled=true,t.coreVersion=k.trim();}catch{t.coreInstalled=false;}try{await execa(m,["-c","import fastapi"],{timeout:2e3}),t.depsInstalled=true;}catch{try{let k=y.join(u,"lib");if(await ___default.pathExists(k)){let A=(await ___default.readdir(k)).find(P=>P.startsWith("python"));if(A){let P=y.join(k,A,"site-packages");if(await ___default.pathExists(P)){let K=(await ___default.readdir(P)).filter(j=>!j.startsWith("_")&&!j.includes("dist-info")&&!["pip","setuptools","wheel","pkg_resources"].includes(j));t.depsInstalled=K.length>0;}}}t.depsInstalled||(t.issues.push("Dependencies not installed"),t.fixCommands?.push(Je(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(Je(e,"rapidkit init"));let g=y.join(e,".env");if(t.hasEnvFile=await ___default.pathExists(g),!t.hasEnvFile){let m=y.join(e,".env.example");await ___default.pathExists(m)&&(t.issues.push("Environment file missing (found .env.example)"),t.fixCommands?.push(vo(e)));}let h=y.join(e,"src"),f=y.join(e,"modules");if(t.modulesHealthy=true,t.missingModules=[],await ___default.pathExists(h)){let m=y.join(h,"__init__.py");await ___default.pathExists(m)||(t.modulesHealthy=false,t.missingModules.push("src/__init__.py"));}if(await ___default.pathExists(f))try{let m=await Po(f);for(let k of m){let O=y.join(f,k,"__init__.py");await ___default.pathExists(O)||(t.modulesHealthy=false,t.missingModules.push(`modules/${k}/__init__.py`));}}catch{}return !t.modulesHealthy&&t.missingModules.length>0&&t.issues.push(`Missing module init files: ${t.missingModules.join(", ")}`),await Rt(e,t),t}return t.issues.push("Unknown project type (no package.json or pyproject.toml)"),await Rt(e,t),t}async function Po(e){try{return (await ___default.readdir(e,{withFileTypes:true})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{try{let o=await ___default.readdir(e),t=[];for(let r of o)try{(await ___default.stat(y.join(e,r))).isDirectory()&&t.push(r);}catch{continue}return t}catch{return []}}}async function Ut(e){let o=y.join(e,".rapidkit");if(!await ___default.pathExists(o))return false;let t=["project.json","context.json","file-hashes.json"];for(let r of t)if(await ___default.pathExists(y.join(o,r)))return true;return false}function Eo(e,o){if(o.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 un(e,o,t){let r=new Set,i=[{dir:e,depth:0}];for(;i.length>0;){let n=i.shift();if(!n)break;try{let a=await ___default.readdir(n.dir);for(let s of a){if(Eo(s,t))continue;let c=y.join(n.dir,s),d;try{d=await ___default.stat(c);}catch{continue}if(d.isDirectory()){if(await Ut(c)){r.add(c);continue}n.depth<o&&i.push({dir:c,depth:n.depth+1});}}}catch{continue}}return Array.from(r)}async function ko(e){let o=e,t=y.parse(o).root;for(;o!==t;){let r=[y.join(o,".rapidkit-workspace"),y.join(o,".rapidkit","workspace-marker.json"),y.join(o,".rapidkit","config.json")];for(let i of r)if(await ___default.pathExists(i))return o;o=y.dirname(o);}return null}function gn(e,o){let t=0,r=0,i=0;return e.forEach(a=>{a.status==="ok"?t++:a.status==="warn"?r++:a.status==="error"&&i++;}),o.forEach(a=>{(a.isGoProject?a.issues.length===0&&a.depsInstalled:a.issues.length===0&&a.venvActive&&a.depsInstalled)?t++:a.issues.length>0&&r++;}),{total:t+r+i,passed:t,warnings:r,errors:i}}async function mn(e){let o=y.basename(e);try{let i=y.join(e,".rapidkit-workspace");await ___default.pathExists(i)&&(o=(await ___default.readJSON(i)).name||o);}catch{try{let i=y.join(e,".rapidkit","config.json");o=(await ___default.readJSON(i)).workspace_name||o;}catch{}}let t={workspacePath:e,workspaceName:o,python:await Ro(),poetry:await _o(),pipx:await Co(),go:await So(),rapidkitCore:await xo(),projects:[]};try{let i=new Set([".git",".venv","node_modules",".rapidkit","dist","build","coverage","__pycache__"]),n=new Set;await Ut(e)&&n.add(e);let a=async(s,c)=>{if(c<0)return;let d=await Po(s);for(let p of d){if(Eo(p,i))continue;let u=y.join(s,p);if(await Ut(u)){n.add(u);continue}c>0&&await a(u,c-1);}};if(await a(e,1),a$1.debug(`Workspace scan (shallow) found ${n.size} project(s)`),n.size===0){let s=await un(e,3,i);s.forEach(c=>n.add(c)),a$1.debug(`Workspace scan (deep fallback) found ${s.length} project(s)`);}n.size>0&&a$1.debug(`Workspace projects detected: ${Array.from(n).join(", ")}`);for(let s of n){let c=await pn(s);t.projects.push(c);}}catch(i){a$1.debug(`Failed to scan workspace projects: ${i}`);}let r=[t.python,t.poetry,t.pipx,t.go,t.rapidkitCore];if(t.healthScore=gn(r,t.projects),t.rapidkitCore.status==="ok"){let i=t.rapidkitCore.message.match(/([\d.]+(?:rc\d+)?(?:a\d+)?(?:b\d+)?)/);i&&(t.coreVersion=i[1]);}return t}function Ce(e,o){let t=e.status==="ok"?"\u2705":e.status==="warn"?"\u26A0\uFE0F":"\u274C",r=e.status==="ok"?l.green:e.status==="warn"?l.yellow:l.red;console.log(`${t} ${l.bold(o)}: ${r(e.message)}`),e.paths&&e.paths.length>0?e.paths.forEach(i=>{let n=i.version?l.cyan(` -> ${i.version}`):"";console.log(` ${l.cyan("\u2022")} ${l.gray(i.location)}: ${l.dim(i.path)}${n}`);}):e.details&&console.log(` ${l.gray(e.details)}`);}function fn(e){let o=e.issues.length>0,t=o?"\u26A0\uFE0F":"\u2705",r=o?l.yellow:l.green;if(console.log(`
|
|
3367
|
+
${t} ${l.bold("Project")}: ${r(e.name)}`),e.framework){let c=e.framework==="FastAPI"?"\u{1F40D}":e.framework==="NestJS"?"\u{1F985}":e.framework==="Go/Fiber"||e.framework==="Go/Gin"?"\u{1F439}":"\u{1F4E6}";console.log(` ${c} Framework: ${l.cyan(e.framework)}${e.kit?l.gray(` (${e.kit})`):""}`);}console.log(` ${l.gray(`Path: ${e.path}`)}`);let i=e.isGoProject===true,n=!i&&e.venvActive&&!e.coreInstalled;if(!i&&!n&&(e.venvActive?console.log(` \u2705 Virtual environment: ${l.green("Active")}`):console.log(` \u274C Virtual environment: ${l.red("Not found")}`),e.coreInstalled?console.log(` ${l.dim("\u2139")} RapidKit Core: ${l.gray(e.coreVersion||"In venv")} ${l.dim("(optional)")}`):console.log(` ${l.dim("\u2139")} RapidKit Core: ${l.gray("Using global installation")} ${l.dim("(recommended)")}`)),e.depsInstalled?console.log(` \u2705 Dependencies: ${l.green("Installed")}`):console.log(` \u26A0\uFE0F Dependencies: ${l.yellow("Not installed")}`),e.hasEnvFile!==void 0&&(e.hasEnvFile?console.log(` \u2705 Environment: ${l.green(".env configured")}`):console.log(` \u26A0\uFE0F Environment: ${l.yellow(".env missing")}`)),e.modulesHealthy!==void 0&&(e.modulesHealthy?console.log(` \u2705 Modules: ${l.green("Healthy")}`):e.missingModules&&e.missingModules.length>0&&console.log(` \u26A0\uFE0F Modules: ${l.yellow(`Missing ${e.missingModules.length} init file(s)`)}`)),e.stats){let c=[];e.stats.modules!==void 0&&c.push(`${e.stats.modules} module${e.stats.modules!==1?"s":""}`),c.length>0&&console.log(` \u{1F4CA} Stats: ${l.cyan(c.join(" \u2022 "))}`);}e.lastModified&&console.log(` \u{1F552} Last Modified: ${l.gray(e.lastModified)}`);let s=[];if(e.hasTests!==void 0&&s.push(e.hasTests?"\u2705 Tests":l.dim("\u2298 No tests")),e.hasDocker!==void 0&&s.push(e.hasDocker?"\u2705 Docker":l.dim("\u2298 No Docker")),e.hasCodeQuality!==void 0){let c=e.framework==="NestJS"?"ESLint":e.framework==="Go/Fiber"||e.framework==="Go/Gin"?"golangci-lint":"Ruff";s.push(e.hasCodeQuality?`\u2705 ${c}`:l.dim(`\u2298 No ${c}`));}s.length>0&&console.log(` ${s.join(" \u2022 ")}`),e.vulnerabilities!==void 0&&e.vulnerabilities>0&&console.log(` \u26A0\uFE0F Security: ${l.yellow(`${e.vulnerabilities} vulnerability(ies) found`)}`),e.issues.length>0&&(console.log(` ${l.bold("Issues:")}`),e.issues.forEach(c=>{console.log(` \u2022 ${l.yellow(c)}`);}),e.fixCommands&&e.fixCommands.length>0&&(console.log(`
|
|
3368
|
+
${l.bold.cyan("\u{1F527} Quick Fix:")}`),e.fixCommands.forEach(c=>{console.log(` ${l.cyan("$")} ${l.white(c)}`);})));}async function bo(e,o=false){let t=e.filter(s=>s.fixCommands&&s.fixCommands.length>0);if(t.length===0){console.log(l.green(`
|
|
3369
3369
|
\u2705 No fixes needed - all projects are healthy!`));return}console.log(l.bold.cyan(`
|
|
3370
3370
|
\u{1F527} Available Fixes:
|
|
3371
|
-
`));for(let
|
|
3371
|
+
`));for(let s of t)console.log(l.bold(`Project: ${l.yellow(s.name)}`)),s.fixCommands.forEach((c,d)=>{console.log(` ${d+1}. ${l.cyan(c)}`);}),console.log();if(!o){console.log(l.gray('\u{1F4A1} Run "rapidkit doctor workspace --fix" to apply fixes automatically'));return}let{confirm:r}=await Se.prompt([{type:"confirm",name:"confirm",message:`Apply ${t.reduce((s,c)=>s+c.fixCommands.length,0)} fix(es)?`,default:false}]);if(!r){console.log(l.yellow(`
|
|
3372
3372
|
\u26A0\uFE0F Fixes cancelled by user`));return}console.log(l.bold.cyan(`
|
|
3373
3373
|
\u{1F680} Applying fixes...
|
|
3374
|
-
`));let i=
|
|
3375
|
-
`));continue}let
|
|
3376
|
-
`));continue}await
|
|
3377
|
-
`));continue}await execa(
|
|
3378
|
-
`));}
|
|
3374
|
+
`));let i=s=>/^https?:\/\//i.test(s.trim()),n=(s,c)=>{let d=c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),p=[new RegExp(`^cd\\s+"([^"]+)"\\s*(?:&&|;)\\s*${d}\\s*$`,"i"),new RegExp(`^cd\\s+(.+?)\\s*(?:&&|;)\\s*${d}\\s*$`,"i")];for(let u of p){let g=s.match(u);if(g?.[1])return {projectPath:g[1].trim()}}return null},a=s=>n(s,"cp\\s+\\.env\\.example\\s+\\.env")||n(s,"copy-item\\s+\\.env\\.example\\s+\\.env");for(let s of t){console.log(l.bold(`Fixing ${l.cyan(s.name)}...`));for(let c of s.fixCommands)try{if(console.log(l.gray(` $ ${c}`)),i(c)){console.log(l.yellow(` \u2139 Manual action required: open ${c}`)),console.log(l.green(` \u2705 Recorded as guidance
|
|
3375
|
+
`));continue}let d=a(c);if(d){let g=y.join(d.projectPath,".env.example"),h=y.join(d.projectPath,".env");if(!await ___default.pathExists(g))throw new Error(`.env.example not found at ${g}`);if(await ___default.pathExists(h)){console.log(l.green(` \u2705 .env already exists
|
|
3376
|
+
`));continue}await ___default.copy(g,h,{overwrite:false,errorOnExist:false}),console.log(l.green(` \u2705 Success
|
|
3377
|
+
`));continue}let p=n(c,"rapidkit\\s+init");if(p){await execa("rapidkit",["init"],{cwd:p.projectPath,shell:b$3(),stdio:"inherit"}),console.log(l.green(` \u2705 Success
|
|
3378
|
+
`));continue}let u=n(c,"go\\s+mod\\s+tidy");if(u){await execa("go",["mod","tidy"],{cwd:u.projectPath,shell:b$3(),stdio:"inherit"}),console.log(l.green(` \u2705 Success
|
|
3379
|
+
`));continue}await execa(c,{shell:true,stdio:"inherit"}),console.log(l.green(` \u2705 Success
|
|
3380
|
+
`));}catch(d){console.log(l.red(` \u274C Failed: ${d instanceof Error?d.message:String(d)}
|
|
3379
3381
|
`));}}console.log(l.bold.green(`
|
|
3380
|
-
\u2705 Fix process completed!`));}async function
|
|
3382
|
+
\u2705 Fix process completed!`));}async function Io(e={}){let o=!e.workspace&&e.fix?await ko(process.cwd()):null,t=e.workspace||!!o;if(e.json||console.log(l.bold.cyan(`
|
|
3381
3383
|
\u{1FA7A} RapidKit Health Check
|
|
3382
|
-
`)),t){let o
|
|
3383
|
-
\u{1F4CA} Health Score:`)),console.log(` ${
|
|
3384
|
+
`)),t){let r=o??await ko(process.cwd());r||(a$1.error("No RapidKit workspace found in current directory or parents"),a$1.info('Run this command from within a workspace, or use "rapidkit doctor" for system check'),process.exit(1)),e.json||(o&&console.log(l.gray("\u2139\uFE0F Detected workspace context; enabling workspace checks for --fix")),console.log(l.bold(`Workspace: ${l.cyan(y.basename(r))}`)),console.log(l.gray(`Path: ${r}`)));let i=await mn(r);if(e.json){let s={workspace:{name:y.basename(r),path:r},healthScore:i.healthScore,system:{python:i.python,poetry:i.poetry,pipx:i.pipx,rapidkitCore:i.rapidkitCore,versions:{core:i.coreVersion,npm:i.npmVersion}},projects:i.projects.map(c=>({name:c.name,path:c.path,venvActive:c.venvActive,depsInstalled:c.depsInstalled,coreInstalled:c.coreInstalled,coreVersion:c.coreVersion,issues:c.issues,fixCommands:c.fixCommands})),summary:{totalProjects:i.projects.length,totalIssues:i.projects.reduce((c,d)=>c+d.issues.length,0),hasSystemErrors:[i.python,i.rapidkitCore].some(c=>c.status==="error")}};console.log(JSON.stringify(s,null,2));return}if(i.healthScore){let s=i.healthScore,c=Math.round(s.passed/s.total*100),d=c>=80?l.green:c>=50?l.yellow:l.red,p="\u2588".repeat(Math.floor(c/5))+"\u2591".repeat(20-Math.floor(c/5));console.log(l.bold(`
|
|
3385
|
+
\u{1F4CA} Health Score:`)),console.log(` ${d(`${c}%`)} ${l.gray(p)}`),console.log(` ${l.green(`\u2705 ${s.passed} passed`)} ${l.gray("|")} ${l.yellow(`\u26A0\uFE0F ${s.warnings} warnings`)} ${l.gray("|")} ${l.red(`\u274C ${s.errors} errors`)}`);}if(console.log(l.bold(`
|
|
3384
3386
|
|
|
3385
3387
|
System Tools:
|
|
3386
|
-
`)),
|
|
3388
|
+
`)),Ce(i.python,"Python"),Ce(i.poetry,"Poetry"),Ce(i.pipx,"pipx"),Ce(i.go,"Go"),Ce(i.rapidkitCore,"RapidKit Core"),i.coreVersion&&i.npmVersion){let s=i.coreVersion.split(".")[1],c=i.npmVersion.split(".")[1];s!==c&&(console.log(l.yellow(`
|
|
3387
3389
|
\u26A0\uFE0F Version mismatch: Core ${i.coreVersion} / CLI ${i.npmVersion}`)),console.log(l.gray(" Consider updating to matching versions for best compatibility")));}i.projects.length>0?(console.log(l.bold(`
|
|
3388
|
-
\u{1F4E6} Projects (${i.projects.length}):`)),i.projects.forEach(s=>
|
|
3389
|
-
\u{1F4E6} Projects:`)),console.log(l.gray(" No RapidKit projects found in workspace")));let n=i.projects.reduce((s,c)=>s+c.issues.length,0),a
|
|
3390
|
-
\u26A0\uFE0F Found ${n} project issue(s)`)),a
|
|
3390
|
+
\u{1F4E6} Projects (${i.projects.length}):`)),i.projects.forEach(s=>fn(s))):(console.log(l.bold(`
|
|
3391
|
+
\u{1F4E6} Projects:`)),console.log(l.gray(" No RapidKit projects found in workspace")));let n=i.projects.reduce((s,c)=>s+c.issues.length,0),a=[i.python,i.rapidkitCore].some(s=>s.status==="error");a||n>0?(console.log(l.bold.yellow(`
|
|
3392
|
+
\u26A0\uFE0F Found ${n} project issue(s)`)),a&&console.log(l.bold.red("\u274C System requirements not met")),e.fix?await bo(i.projects,true):n>0&&await bo(i.projects,false)):console.log(l.bold.green(`
|
|
3391
3393
|
\u2705 All checks passed! Workspace is healthy.`));}else {console.log(l.bold(`System Tools:
|
|
3392
|
-
`));let
|
|
3394
|
+
`));let r=await Ro(),i=await _o(),n=await Co(),a=await So(),s=await xo();Ce(r,"Python"),Ce(i,"Poetry"),Ce(n,"pipx"),Ce(a,"Go"),Ce(s,"RapidKit Core"),[r,s].some(d=>d.status==="error")?(console.log(l.bold.red(`
|
|
3393
3395
|
\u274C Some required tools are missing`)),e.fix&&console.log(l.gray(`
|
|
3394
|
-
Tip: Project auto-fix runs in workspace mode. Run from a workspace and use "
|
|
3395
|
-
Tip: Run "
|
|
3396
|
+
Tip: Project auto-fix runs in workspace mode. Run from a workspace and use "rapidkit doctor workspace --fix"`)),console.log(l.gray(`
|
|
3397
|
+
Tip: Run "rapidkit doctor workspace" for detailed project checks`))):(console.log(l.bold.green(`
|
|
3396
3398
|
\u2705 All required tools are installed!`)),e.fix&&console.log(l.gray(`
|
|
3397
|
-
Tip: Project auto-fix runs in workspace mode. Run from a workspace and use "
|
|
3398
|
-
Tip: Run "
|
|
3399
|
+
Tip: Project auto-fix runs in workspace mode. Run from a workspace and use "rapidkit doctor workspace --fix"`)),console.log(l.gray(`
|
|
3400
|
+
Tip: Run "rapidkit doctor workspace" for detailed project checks`)));}console.log("");}var Vt=y.join(hn.homedir(),".rapidkit"),_t=y.join(Vt,"config.json");function Ye(){try{if(!b$2.existsSync(_t))return {};let e=b$2.readFileSync(_t,"utf-8");return JSON.parse(e)}catch{return {}}}function Ct(e){let t={...Ye(),...e};b$2.existsSync(Vt)||b$2.mkdirSync(Vt,{recursive:true}),b$2.writeFileSync(_t,JSON.stringify(t,null,2),"utf-8");}function st(){return process.env.OPENAI_API_KEY||Ye().openaiApiKey||null}function Bt(){return Ye().aiEnabled!==false}function Jt(){return _t}async function Oo(){return (await import('inquirer')).default}function Ao(e){let o=e.command("config").description("Configure RapidKit settings");o.command("set-api-key").description("Set OpenAI API key for AI features").option("--key <key>","API key (or enter interactively)").action(async t=>{let r=t.key;r?r.startsWith("sk-")||(console.log(l.red(`
|
|
3399
3401
|
\u274C Invalid API key format (should start with sk-)
|
|
3400
|
-
`)),process.exit(1)):
|
|
3402
|
+
`)),process.exit(1)):r=(await(await Oo()).prompt([{type:"password",name:"apiKey",message:"Enter your OpenAI API key:",validate:a=>a?a.startsWith("sk-")?a.length<20?"API key seems too short":true:"Invalid API key format (should start with sk-)":"API key is required"}])).apiKey,Ct({openaiApiKey:r}),console.log(l.green(`
|
|
3401
3403
|
\u2705 OpenAI API key saved successfully!
|
|
3402
|
-
`)),console.log(l.gray(`Stored in: ${
|
|
3404
|
+
`)),console.log(l.gray(`Stored in: ${Jt()}`)),console.log(l.cyan(`
|
|
3403
3405
|
\u{1F389} You can now use AI features:`)),console.log(l.white(' rapidkit ai recommend "I need user authentication"')),console.log(l.gray(`
|
|
3404
3406
|
\u{1F4A1} To generate module embeddings (one-time):`)),console.log(l.white(" cd rapidkit-npm")),console.log(l.white(` npx tsx src/ai/generate-embeddings.ts
|
|
3405
|
-
`));}),
|
|
3407
|
+
`));}),o.command("show").description("Show current configuration").action(()=>{let t=Ye();if(console.log(l.bold(`
|
|
3406
3408
|
\u2699\uFE0F RapidKit Configuration
|
|
3407
|
-
`)),t.openaiApiKey){let
|
|
3408
|
-
\u{1F4C1} Config file: ${
|
|
3409
|
-
`));}),
|
|
3409
|
+
`)),t.openaiApiKey){let r=t.openaiApiKey.substring(0,8)+"..."+t.openaiApiKey.slice(-4);console.log(l.cyan("OpenAI API Key:"),l.white(r));}else console.log(l.cyan("OpenAI API Key:"),l.red("Not set")),console.log(l.gray(" Set with: rapidkit config set-api-key"));console.log(l.cyan("AI Features:"),t.aiEnabled!==false?l.green("Enabled"):l.red("Disabled")),console.log(l.gray(`
|
|
3410
|
+
\u{1F4C1} Config file: ${Jt()}
|
|
3411
|
+
`));}),o.command("remove-api-key").description("Remove stored OpenAI API key").action(async()=>{if(!Ye().openaiApiKey){console.log(l.yellow(`
|
|
3410
3412
|
\u26A0\uFE0F No API key is currently stored
|
|
3411
|
-
`));return}(await(await
|
|
3413
|
+
`));return}(await(await Oo()).prompt([{type:"confirm",name:"confirm",message:"Are you sure you want to remove your OpenAI API key?",default:false}])).confirm?(Ct({openaiApiKey:void 0}),console.log(l.green(`
|
|
3412
3414
|
\u2705 API key removed successfully
|
|
3413
3415
|
`))):console.log(l.gray(`
|
|
3414
3416
|
Cancelled
|
|
3415
|
-
`));}),
|
|
3417
|
+
`));}),o.command("ai <action>").description("Enable or disable AI features (enable|disable)").action(t=>{t!=="enable"&&t!=="disable"&&(console.log(l.red(`
|
|
3416
3418
|
\u274C Invalid action: ${t}`)),console.log(l.gray(`Use: rapidkit config ai enable|disable
|
|
3417
|
-
`)),process.exit(1));let
|
|
3418
|
-
\u2705 AI features ${
|
|
3419
|
-
`));});}var yt=null,wt=false,Lt=null;async function Fi(){return Lt||(Lt=(await import('openai')).default),Lt}function wr(){wt=true;}function vr(e){let t=new Array(1536),o=0;for(let n=0;n<e.length;n++)o=(o<<5)-o+e.charCodeAt(n),o=o&o;for(let n=0;n<1536;n++)o=o*1664525+1013904223&4294967295,t[n]=o/4294967295*2-1;let i=Math.sqrt(t.reduce((n,a)=>n+a*a,0));return t.map(n=>n/i)}async function vt(e){let r=await Fi();yt=new r({apiKey:e});}function kr(){if(!yt)throw new Error("OpenAI client not initialized. Call initOpenAI() first with your API key.");return yt}async function br(e){return wt?vr(e):(await kr().embeddings.create({model:"text-embedding-3-small",input:e,encoding_format:"float"})).data[0].embedding}async function Rr(e){return wt?e.map(vr):(await kr().embeddings.create({model:"text-embedding-3-small",input:e,encoding_format:"float"})).data.map(o=>o.embedding)}function Cr(){return yt!==null}function Sr(){return wt}var Ui=promisify(exec),xr=[{id:"authentication-core",name:"Authentication Core",category:"auth",description:"Complete authentication system with password hashing, JWT tokens, OAuth 2.0, and secure session management",longDescription:"Production-ready authentication with bcrypt password hashing, JWT access/refresh tokens, OAuth 2.0 providers (Google, GitHub, etc), rate limiting, and security best practices.",keywords:["auth","login","password","jwt","oauth","token","authentication","security","signin","signup"],framework:"both",dependencies:[],useCases:["User login and logout","Password reset flow","OAuth social login (Google, GitHub)","JWT authentication","Secure session management","Token refresh","Rate limiting"]},{id:"users-core",name:"Users Core",category:"auth",description:"User management system with profiles, roles, permissions, and user CRUD operations",longDescription:"Complete user management with user profiles, role-based access control (RBAC), permissions, user search, soft delete, and audit trails.",keywords:["user","profile","role","permission","rbac","management","admin","accounts"],framework:"both",dependencies:["authentication-core"],useCases:["User registration","User profile management","Role management (admin, user, etc)","Permission system","User administration dashboard","Soft delete users"]},{id:"session-management",name:"Session Management",category:"auth",description:"Secure session handling with Redis storage, session rotation, and device tracking",longDescription:"Advanced session management with Redis-backed storage, automatic session rotation, device fingerprinting, IP tracking, and session revocation.",keywords:["session","redis","cookie","storage","device","tracking"],framework:"both",dependencies:["authentication-core","redis-cache"],useCases:["User session management","Remember me functionality","Device tracking","Session security","Logout from all devices","Session expiration"]},{id:"db-postgres",name:"PostgreSQL",category:"database",description:"PostgreSQL integration with async SQLAlchemy, migrations, connection pooling, and query optimization",longDescription:"Production-ready PostgreSQL with async SQLAlchemy 2.0, Alembic migrations, connection pooling, query optimization, JSON support, and full-text search.",keywords:["postgres","postgresql","database","sql","sqlalchemy","migration","orm","relational"],framework:"both",dependencies:[],useCases:["Relational database","Complex SQL queries","Database transactions","Data integrity","Production-grade database","ACID compliance"]},{id:"db-mongodb",name:"MongoDB",category:"database",description:"MongoDB integration with Motor async driver, schema validation, and aggregation pipelines",longDescription:"Async MongoDB with Motor driver, Pydantic schema validation, aggregation pipelines, indexes, and Atlas integration.",keywords:["mongodb","mongo","nosql","document","database","motor"],framework:"both",dependencies:[],useCases:["Document storage","Flexible schema","Real-time data","JSON documents","Unstructured data","Analytics"]},{id:"stripe-payment",name:"Stripe Payment",category:"payment",description:"Stripe integration with payment intents, subscriptions, webhooks, and customer portal",longDescription:"Complete Stripe integration with Payment Intents API, subscription management, automatic webhooks, customer portal, refunds, and SCA compliance.",keywords:["stripe","payment","subscription","billing","checkout","webhook","credit card"],framework:"both",dependencies:[],useCases:["Accept credit card payments","Subscription billing","One-time payments","Checkout flow","Payment webhooks","Refunds and disputes"]},{id:"email",name:"Email",category:"communication",description:"Email sending with templates, SMTP/SendGrid/AWS SES support, and queue management",longDescription:"Production email system with Jinja2 templates, multiple providers (SMTP, SendGrid, AWS SES), queue management, retry logic, and bounce handling.",keywords:["email","mail","smtp","sendgrid","ses","template","notification"],framework:"both",dependencies:[],useCases:["Welcome emails","Password reset emails","Notifications","Marketing emails","Transactional emails","Email templates"]},{id:"sms",name:"SMS",category:"communication",description:"SMS sending with Twilio, verification codes, and delivery tracking",longDescription:"SMS integration with Twilio, verification codes, two-factor authentication, delivery tracking, and international support.",keywords:["sms","twilio","text","message","2fa","verification","otp"],framework:"both",dependencies:[],useCases:["2FA verification codes","SMS notifications","Phone verification","OTP generation","SMS alerts"]},{id:"redis-cache",name:"Redis Cache",category:"infrastructure",description:"Redis caching with decorators, TTL management, and cache invalidation patterns",longDescription:"Redis integration with async client, caching decorators, TTL management, cache invalidation, pub/sub, and rate limiting.",keywords:["redis","cache","memory","performance","speed","pubsub"],framework:"both",dependencies:[],useCases:["API response caching","Session storage","Rate limiting","Real-time features","Performance optimization","Pub/sub messaging"]},{id:"celery",name:"Celery",category:"infrastructure",description:"Background task processing with Celery, periodic tasks, and monitoring",longDescription:"Celery task queue with Redis/RabbitMQ backend, periodic tasks (cron), task monitoring, retry logic, and failure handling.",keywords:["celery","task","background","queue","async","worker","job","cron"],framework:"fastapi",dependencies:["redis-cache"],useCases:["Background email sending","Data processing","Report generation","Scheduled tasks","Long-running jobs"]},{id:"storage",name:"Storage",category:"infrastructure",description:"File storage with S3, local filesystem, and image processing",longDescription:"Unified storage interface for AWS S3, local files, image resizing, format conversion, CDN integration, and presigned URLs.",keywords:["storage","s3","file","upload","image","cdn","aws"],framework:"both",dependencies:[],useCases:["File uploads","Image storage","Document management","Profile pictures","Media files","CDN integration"]}],Ve=null,_r=0,Wi=300*1e3;function Vi(e){return {id:e.name||e.id||e.module_id||"",name:e.display_name||e.name||"",category:Bi(e.category||"infrastructure"),description:e.description||e.summary||"",longDescription:e.long_description||e.description||"",keywords:e.keywords||e.tags||[],framework:Ji(e.framework),dependencies:e.dependencies||[],useCases:e.use_cases||e.useCases||[]}}function Bi(e){return {auth:"auth",authentication:"auth",database:"database",payment:"payment",billing:"payment",communication:"communication",infrastructure:"infrastructure",security:"security",analytics:"analytics"}[e.toLowerCase()]||"infrastructure"}function Ji(e){if(!e)return "both";if(typeof e=="string"){if(e.toLowerCase().includes("fastapi"))return "fastapi";if(e.toLowerCase().includes("nest"))return "nestjs"}return "both"}async function Yi(){try{let{stdout:e}=await Ui("rapidkit modules list --json-schema 1",{timeout:1e4,maxBuffer:10485760}),r=e.match(/\{[\s\S]*\}/),t=r?r[0]:e,o=JSON.parse(t),i=[];return Array.isArray(o)?i=o:o.modules&&Array.isArray(o.modules)?i=o.modules:o.data&&Array.isArray(o.data)&&(i=o.data),i.map(Vi).filter(n=>n.id&&n.name)}catch(e){return e.code==="ENOENT"?console.warn("\u26A0\uFE0F RapidKit Python Core not found in PATH"):e.killed?console.warn("\u26A0\uFE0F Python Core command timed out"):console.warn("\u26A0\uFE0F Failed to fetch modules from Python Core:",e.message),console.warn(" Using fallback module catalog (11 modules)"),xr}}async function kt(){let e=Date.now();return Ve&&e-_r<Wi||(Ve=await Yi(),_r=e,Ve.length===0&&(console.warn("\u26A0\uFE0F No modules found, using fallback catalog"),Ve=xr)),Ve}var Qi=fileURLToPath(import.meta.url),Er=f.dirname(Qi),tt=null;function Xi(){if(tt)return tt;let e=[f.join(Er,"../../data/modules-embeddings.json"),f.join(Er,"../data/modules-embeddings.json"),f.join(process.cwd(),"data/modules-embeddings.json")],r=null;for(let i of e)if(S.existsSync(i)){r=i;break}if(!r)throw new Error("embeddings file not found");let t=S.readFileSync(r,"utf-8"),o=JSON.parse(t);return Array.isArray(o)?tt={model:"mock-or-text-embedding-3-small",dimension:o[0]?.embedding?.length||1536,generated_at:new Date().toISOString(),modules:o}:tt=o,tt}function Zi(e,r){if(e.length!==r.length)throw new Error("Vectors must have the same length");let t=0,o=0,i=0;for(let a=0;a<e.length;a++)t+=e[a]*r[a],o+=e[a]*e[a],i+=r[a]*r[a];let n=Math.sqrt(o)*Math.sqrt(i);return n===0?0:t/n}function en(e,r){let t=r.toLowerCase(),o=e.keywords.filter(i=>t.includes(i)||i.includes(t));return o.length>0?`Matches: ${o.slice(0,3).join(", ")}`:`Relevant for: ${e.useCases[0]}`}async function Ir(e,r=5){let t=Xi(),o=await kt(),i=await br(e),n=t.modules.map(a=>{let s=o.find(p=>p.id===a.id);if(!s)return null;let c=Zi(i,a.embedding);return {module:s,score:c,reason:en(s,e)}}).filter(a=>a!==null);return n.sort((a,s)=>s.score-a.score),n.slice(0,r)}var on=fileURLToPath(import.meta.url),Tr=f.dirname(on);async function Or(){return (await import('inquirer')).default}function nn(){return [f.join(Tr,"../../data/modules-embeddings.json"),f.join(Tr,"../data/modules-embeddings.json"),f.join(process.cwd(),"data/modules-embeddings.json")]}function Ar(){let e=nn();for(let r of e)if(S.existsSync(r))try{let t=JSON.parse(S.readFileSync(r,"utf-8")),o=Array.isArray(t)?t:t.modules||[];return {exists:true,path:r,moduleCount:o.length,generatedAt:t.generated_at||null}}catch{continue}return {exists:false,path:null,moduleCount:0,generatedAt:null}}async function Rt(e=true,r){try{if(!Cr()&&!Sr())return console.log(l.red(`
|
|
3419
|
+
`)),process.exit(1));let r=t==="enable";Ct({aiEnabled:r}),console.log(l.green(`
|
|
3420
|
+
\u2705 AI features ${r?"enabled":"disabled"}
|
|
3421
|
+
`));});}var St=null,xt=false,Yt=null;async function yn(){return Yt||(Yt=(await import('openai')).default),Yt}function No(){xt=true;}function $o(e){let t=new Array(1536),r=0;for(let n=0;n<e.length;n++)r=(r<<5)-r+e.charCodeAt(n),r=r&r;for(let n=0;n<1536;n++)r=r*1664525+1013904223&4294967295,t[n]=r/4294967295*2-1;let i=Math.sqrt(t.reduce((n,a)=>n+a*a,0));return t.map(n=>n/i)}async function Pt(e){let o=await yn();St=new o({apiKey:e});}function jo(){if(!St)throw new Error("OpenAI client not initialized. Call initOpenAI() first with your API key.");return St}async function Do(e){return xt?$o(e):(await jo().embeddings.create({model:"text-embedding-3-small",input:e,encoding_format:"float"})).data[0].embedding}async function Mo(e){return xt?e.map($o):(await jo().embeddings.create({model:"text-embedding-3-small",input:e,encoding_format:"float"})).data.map(r=>r.embedding)}function Lo(){return St!==null}function Go(){return xt}var kn=promisify(exec),Fo=[{id:"authentication-core",name:"Authentication Core",category:"auth",description:"Complete authentication system with password hashing, JWT tokens, OAuth 2.0, and secure session management",longDescription:"Production-ready authentication with bcrypt password hashing, JWT access/refresh tokens, OAuth 2.0 providers (Google, GitHub, etc), rate limiting, and security best practices.",keywords:["auth","login","password","jwt","oauth","token","authentication","security","signin","signup"],framework:"both",dependencies:[],useCases:["User login and logout","Password reset flow","OAuth social login (Google, GitHub)","JWT authentication","Secure session management","Token refresh","Rate limiting"]},{id:"users-core",name:"Users Core",category:"auth",description:"User management system with profiles, roles, permissions, and user CRUD operations",longDescription:"Complete user management with user profiles, role-based access control (RBAC), permissions, user search, soft delete, and audit trails.",keywords:["user","profile","role","permission","rbac","management","admin","accounts"],framework:"both",dependencies:["authentication-core"],useCases:["User registration","User profile management","Role management (admin, user, etc)","Permission system","User administration dashboard","Soft delete users"]},{id:"session-management",name:"Session Management",category:"auth",description:"Secure session handling with Redis storage, session rotation, and device tracking",longDescription:"Advanced session management with Redis-backed storage, automatic session rotation, device fingerprinting, IP tracking, and session revocation.",keywords:["session","redis","cookie","storage","device","tracking"],framework:"both",dependencies:["authentication-core","redis-cache"],useCases:["User session management","Remember me functionality","Device tracking","Session security","Logout from all devices","Session expiration"]},{id:"db-postgres",name:"PostgreSQL",category:"database",description:"PostgreSQL integration with async SQLAlchemy, migrations, connection pooling, and query optimization",longDescription:"Production-ready PostgreSQL with async SQLAlchemy 2.0, Alembic migrations, connection pooling, query optimization, JSON support, and full-text search.",keywords:["postgres","postgresql","database","sql","sqlalchemy","migration","orm","relational"],framework:"both",dependencies:[],useCases:["Relational database","Complex SQL queries","Database transactions","Data integrity","Production-grade database","ACID compliance"]},{id:"db-mongodb",name:"MongoDB",category:"database",description:"MongoDB integration with Motor async driver, schema validation, and aggregation pipelines",longDescription:"Async MongoDB with Motor driver, Pydantic schema validation, aggregation pipelines, indexes, and Atlas integration.",keywords:["mongodb","mongo","nosql","document","database","motor"],framework:"both",dependencies:[],useCases:["Document storage","Flexible schema","Real-time data","JSON documents","Unstructured data","Analytics"]},{id:"stripe-payment",name:"Stripe Payment",category:"payment",description:"Stripe integration with payment intents, subscriptions, webhooks, and customer portal",longDescription:"Complete Stripe integration with Payment Intents API, subscription management, automatic webhooks, customer portal, refunds, and SCA compliance.",keywords:["stripe","payment","subscription","billing","checkout","webhook","credit card"],framework:"both",dependencies:[],useCases:["Accept credit card payments","Subscription billing","One-time payments","Checkout flow","Payment webhooks","Refunds and disputes"]},{id:"email",name:"Email",category:"communication",description:"Email sending with templates, SMTP/SendGrid/AWS SES support, and queue management",longDescription:"Production email system with Jinja2 templates, multiple providers (SMTP, SendGrid, AWS SES), queue management, retry logic, and bounce handling.",keywords:["email","mail","smtp","sendgrid","ses","template","notification"],framework:"both",dependencies:[],useCases:["Welcome emails","Password reset emails","Notifications","Marketing emails","Transactional emails","Email templates"]},{id:"sms",name:"SMS",category:"communication",description:"SMS sending with Twilio, verification codes, and delivery tracking",longDescription:"SMS integration with Twilio, verification codes, two-factor authentication, delivery tracking, and international support.",keywords:["sms","twilio","text","message","2fa","verification","otp"],framework:"both",dependencies:[],useCases:["2FA verification codes","SMS notifications","Phone verification","OTP generation","SMS alerts"]},{id:"redis-cache",name:"Redis Cache",category:"infrastructure",description:"Redis caching with decorators, TTL management, and cache invalidation patterns",longDescription:"Redis integration with async client, caching decorators, TTL management, cache invalidation, pub/sub, and rate limiting.",keywords:["redis","cache","memory","performance","speed","pubsub"],framework:"both",dependencies:[],useCases:["API response caching","Session storage","Rate limiting","Real-time features","Performance optimization","Pub/sub messaging"]},{id:"celery",name:"Celery",category:"infrastructure",description:"Background task processing with Celery, periodic tasks, and monitoring",longDescription:"Celery task queue with Redis/RabbitMQ backend, periodic tasks (cron), task monitoring, retry logic, and failure handling.",keywords:["celery","task","background","queue","async","worker","job","cron"],framework:"fastapi",dependencies:["redis-cache"],useCases:["Background email sending","Data processing","Report generation","Scheduled tasks","Long-running jobs"]},{id:"storage",name:"Storage",category:"infrastructure",description:"File storage with S3, local filesystem, and image processing",longDescription:"Unified storage interface for AWS S3, local files, image resizing, format conversion, CDN integration, and presigned URLs.",keywords:["storage","s3","file","upload","image","cdn","aws"],framework:"both",dependencies:[],useCases:["File uploads","Image storage","Document management","Profile pictures","Media files","CDN integration"]}],ze=null,qo=0,bn=300*1e3;function Rn(e){return {id:e.name||e.id||e.module_id||"",name:e.display_name||e.name||"",category:_n(e.category||"infrastructure"),description:e.description||e.summary||"",longDescription:e.long_description||e.description||"",keywords:e.keywords||e.tags||[],framework:Cn(e.framework),dependencies:e.dependencies||[],useCases:e.use_cases||e.useCases||[]}}function _n(e){return {auth:"auth",authentication:"auth",database:"database",payment:"payment",billing:"payment",communication:"communication",infrastructure:"infrastructure",security:"security",analytics:"analytics"}[e.toLowerCase()]||"infrastructure"}function Cn(e){if(!e)return "both";if(typeof e=="string"){if(e.toLowerCase().includes("fastapi"))return "fastapi";if(e.toLowerCase().includes("nest"))return "nestjs"}return "both"}async function Sn(){try{let{stdout:e}=await kn("rapidkit modules list --json-schema 1",{timeout:1e4,maxBuffer:10485760}),o=e.match(/\{[\s\S]*\}/),t=o?o[0]:e,r=JSON.parse(t),i=[];return Array.isArray(r)?i=r:r.modules&&Array.isArray(r.modules)?i=r.modules:r.data&&Array.isArray(r.data)&&(i=r.data),i.map(Rn).filter(n=>n.id&&n.name)}catch(e){return e.code==="ENOENT"?console.warn("\u26A0\uFE0F RapidKit Python Core not found in PATH"):e.killed?console.warn("\u26A0\uFE0F Python Core command timed out"):console.warn("\u26A0\uFE0F Failed to fetch modules from Python Core:",e.message),console.warn(" Using fallback module catalog (11 modules)"),Fo}}async function Et(){let e=Date.now();return ze&&e-qo<bn||(ze=await Sn(),qo=e,ze.length===0&&(console.warn("\u26A0\uFE0F No modules found, using fallback catalog"),ze=Fo)),ze}var Pn=fileURLToPath(import.meta.url),Ko=y.dirname(Pn),at=null;function En(){if(at)return at;let e=[y.join(Ko,"../../data/modules-embeddings.json"),y.join(Ko,"../data/modules-embeddings.json"),y.join(process.cwd(),"data/modules-embeddings.json")],o=null;for(let i of e)if(b$2.existsSync(i)){o=i;break}if(!o)throw new Error("embeddings file not found");let t=b$2.readFileSync(o,"utf-8"),r=JSON.parse(t);return Array.isArray(r)?at={model:"mock-or-text-embedding-3-small",dimension:r[0]?.embedding?.length||1536,generated_at:new Date().toISOString(),modules:r}:at=r,at}function In(e,o){if(e.length!==o.length)throw new Error("Vectors must have the same length");let t=0,r=0,i=0;for(let a=0;a<e.length;a++)t+=e[a]*o[a],r+=e[a]*e[a],i+=o[a]*o[a];let n=Math.sqrt(r)*Math.sqrt(i);return n===0?0:t/n}function Tn(e,o){let t=o.toLowerCase(),r=e.keywords.filter(i=>t.includes(i)||i.includes(t));return r.length>0?`Matches: ${r.slice(0,3).join(", ")}`:`Relevant for: ${e.useCases[0]}`}async function Wo(e,o=5){let t=En(),r=await Et(),i=await Do(e),n=t.modules.map(a=>{let s=r.find(d=>d.id===a.id);if(!s)return null;let c=In(i,a.embedding);return {module:s,score:c,reason:Tn(s,e)}}).filter(a=>a!==null);return n.sort((a,s)=>s.score-a.score),n.slice(0,o)}var Nn=fileURLToPath(import.meta.url),Uo=y.dirname(Nn);async function Vo(){return (await import('inquirer')).default}function $n(){return [y.join(Uo,"../../data/modules-embeddings.json"),y.join(Uo,"../data/modules-embeddings.json"),y.join(process.cwd(),"data/modules-embeddings.json")]}function Bo(){let e=$n();for(let o of e)if(b$2.existsSync(o))try{let t=JSON.parse(b$2.readFileSync(o,"utf-8")),r=Array.isArray(t)?t:t.modules||[];return {exists:true,path:o,moduleCount:r.length,generatedAt:t.generated_at||null}}catch{continue}return {exists:false,path:null,moduleCount:0,generatedAt:null}}async function Tt(e=true,o){try{if(!Lo()&&!Go())return console.log(l.red(`
|
|
3420
3422
|
\u274C OpenAI not initialized`)),console.log(l.yellow("Please set your API key:")),console.log(l.white(" rapidkit config set-api-key")),console.log(l.gray(` OR set: export OPENAI_API_KEY="sk-..."
|
|
3421
3423
|
`)),false;console.log(l.blue(`
|
|
3422
3424
|
\u{1F916} Generating AI embeddings for RapidKit modules...
|
|
3423
|
-
`)),console.log(l.gray("\u{1F4E1} Fetching modules from RapidKit..."));let t=await
|
|
3424
|
-
`));let
|
|
3425
|
-
`)),e){let a=await
|
|
3425
|
+
`)),console.log(l.gray("\u{1F4E1} Fetching modules from RapidKit..."));let t=await Et();console.log(l.green(`\u2713 Found ${t.length} modules
|
|
3426
|
+
`));let r=t.length*50/1e6*.02;if(console.log(l.cyan(`\u{1F4B0} Estimated cost: ~$${r.toFixed(3)}`)),console.log(l.gray(` (Based on ${t.length} modules at $0.02/1M tokens)
|
|
3427
|
+
`)),e){let a=await Vo(),{confirm:s}=await a.prompt([{type:"confirm",name:"confirm",message:"Generate embeddings now?",default:true}]);if(!s)return console.log(l.yellow(`
|
|
3426
3428
|
\u26A0\uFE0F Embeddings generation cancelled
|
|
3427
|
-
`)),false}let i=t.map(a=>`${a.name}. ${a.description}. ${a.longDescription}. Keywords: ${a.keywords.join(", ")}. Use cases: ${a.useCases.join(", ")}.`),n=
|
|
3429
|
+
`)),false}let i=t.map(a=>`${a.name}. ${a.description}. ${a.longDescription}. Keywords: ${a.keywords.join(", ")}. Use cases: ${a.useCases.join(", ")}.`),n=Ht(`Generating embeddings for ${t.length} modules...`).start();try{let a=await Mo(i);n.succeed(`Generated embeddings for ${t.length} modules`);let s={model:"text-embedding-3-small",dimension:a[0].length,generated_at:new Date().toISOString(),modules:t.map((p,u)=>({id:p.id,name:p.name,embedding:a[u]}))},c=o||y.join(process.cwd(),"data","modules-embeddings.json"),d=y.dirname(c);return b$2.existsSync(d)||b$2.mkdirSync(d,{recursive:true}),b$2.writeFileSync(c,JSON.stringify(s,null,2)),console.log(l.green(`
|
|
3428
3430
|
\u2705 Embeddings generated successfully!`)),console.log(l.gray(`\u{1F4C1} Saved to: ${c}`)),console.log(l.gray(`\u{1F4CA} Size: ${t.length} modules, ${a[0].length} dimensions
|
|
3429
3431
|
`)),true}catch(a){return n.fail("Failed to generate embeddings"),a.message?.includes("429")?(console.log(l.red(`
|
|
3430
3432
|
\u274C OpenAI API quota exceeded`)),console.log(l.yellow(`Please check your billing: https://platform.openai.com/account/billing
|
|
@@ -3434,118 +3436,140 @@ Cancelled
|
|
|
3434
3436
|
\u274C Error: ${a.message}
|
|
3435
3437
|
`)),false}}catch(t){return console.log(l.red(`
|
|
3436
3438
|
\u274C Failed to generate embeddings: ${t.message}
|
|
3437
|
-
`)),false}}async function
|
|
3439
|
+
`)),false}}async function Jo(e=true){if(Bo().exists)return true;if(console.log(l.yellow(`
|
|
3438
3440
|
\u26A0\uFE0F Module embeddings not found`)),console.log(l.gray(`AI recommendations require embeddings to be generated.
|
|
3439
3441
|
`)),!e)return console.log(l.red("\u274C Cannot generate embeddings in non-interactive mode")),console.log(l.white(`Run: rapidkit ai generate-embeddings
|
|
3440
|
-
`)),false;let t=await
|
|
3442
|
+
`)),false;let t=await Vo(),{action:r}=await t.prompt([{type:"list",name:"action",message:"What would you like to do?",choices:[{name:"\u{1F680} Generate embeddings now (requires OpenAI API key)",value:"generate"},{name:"\u{1F4DD} Show me how to generate them manually",value:"manual"},{name:"\u274C Cancel",value:"cancel"}]}]);return r==="generate"?await Tt(true):(r==="manual"&&(console.log(l.cyan(`
|
|
3441
3443
|
\u{1F4DD} To generate embeddings manually:
|
|
3442
3444
|
`)),console.log(l.white("1. Get OpenAI API key from: https://platform.openai.com/api-keys")),console.log(l.white("2. Set the API key:")),console.log(l.gray(" rapidkit config set-api-key")),console.log(l.gray(` OR: export OPENAI_API_KEY="sk-..."
|
|
3443
3445
|
`)),console.log(l.white("3. Generate embeddings:")),console.log(l.gray(` rapidkit ai generate-embeddings
|
|
3444
3446
|
`)),console.log(l.cyan(`\u{1F4B0} Cost: ~$0.50 one-time
|
|
3445
|
-
`))),false)}async function
|
|
3447
|
+
`))),false)}async function Yo(){let e=Bo();return e.exists?(console.log(l.blue(`
|
|
3446
3448
|
\u{1F504} Updating embeddings...`)),console.log(l.gray(`Current: ${e.moduleCount} modules`)),console.log(l.gray(`Generated: ${e.generatedAt||"unknown"}
|
|
3447
|
-
`)),await
|
|
3449
|
+
`)),await Tt(true,e.path)):(console.log(l.yellow(`
|
|
3448
3450
|
\u26A0\uFE0F No existing embeddings found`)),console.log(l.gray(`Use: rapidkit ai generate-embeddings
|
|
3449
|
-
`)),false)}async function
|
|
3451
|
+
`)),false)}async function zo(){return (await import('inquirer')).default}function Qo(e){let o=e.command("ai").description("AI-powered features");o.command("recommend").description("Get AI-powered module recommendations").argument("[query]",'What do you want to build? (e.g., "user authentication with email")').option("-n, --number <count>","Number of recommendations","5").option("--json","Output as JSON").action(async(t,r)=>{try{Bt()||(console.log(l.yellow(`
|
|
3450
3452
|
\u26A0\uFE0F AI features are disabled`)),console.log(l.gray(`Enable with: rapidkit config ai enable
|
|
3451
|
-
`)),process.exit(1));let i=
|
|
3453
|
+
`)),process.exit(1));let i=st();i?await Pt(i):(console.log(l.yellow(`
|
|
3452
3454
|
\u26A0\uFE0F OpenAI API key not configured - using MOCK MODE for testing
|
|
3453
3455
|
`)),console.log(l.gray("\u{1F4DD} Note: Mock embeddings provide approximate results for testing.")),console.log(l.gray(` For production, configure your OpenAI API key:
|
|
3454
3456
|
`)),console.log(l.white(" 1. Get your key from: https://platform.openai.com/api-keys")),console.log(l.white(" 2. Configure it: rapidkit config set-api-key")),console.log(l.gray(` OR set: export OPENAI_API_KEY="sk-proj-..."
|
|
3455
|
-
`)),
|
|
3457
|
+
`)),No());let n=t;n||(n=(await(await zo()).prompt([{type:"input",name:"query",message:"\u{1F916} What do you want to build?",validate:f=>f.length===0?"Please enter a description":f.length<3?"Please be more specific (at least 3 characters)":true}])).query),r.json||console.log(l.blue(`
|
|
3456
3458
|
\u{1F916} Analyzing your request...
|
|
3457
|
-
`)),await
|
|
3459
|
+
`)),await Jo(!r.json)||(console.log(l.yellow(`
|
|
3458
3460
|
\u26A0\uFE0F Cannot proceed without embeddings
|
|
3459
|
-
`)),process.exit(1));let s=parseInt(
|
|
3461
|
+
`)),process.exit(1));let s=parseInt(r.number,10),c=await Wo(n,s);if(c.length===0||c[0].score<.3)if(console.log(l.yellow(`
|
|
3460
3462
|
\u26A0\uFE0F No matching modules found in RapidKit registry.
|
|
3461
3463
|
`)),console.log(l.cyan(`\u{1F4A1} Options:
|
|
3462
3464
|
`)),console.log(l.white("1. Create custom module:")),console.log(l.gray(" rapidkit modules scaffold <name> --category <category>")),console.log(l.gray(` Example: rapidkit modules scaffold blockchain-integration --category integrations
|
|
3463
3465
|
`)),console.log(l.white("2. Search with different keywords")),console.log(l.gray(` Try more general terms (e.g., "storage" instead of "blockchain")
|
|
3464
3466
|
`)),console.log(l.white("3. Request feature:")),console.log(l.gray(` https://github.com/getrapidkit/rapidkit/issues
|
|
3465
3467
|
`)),c.length>0)console.log(l.yellow(`\u26A0\uFE0F Low confidence matches found:
|
|
3466
|
-
`));else return;if(
|
|
3467
|
-
`)),c.forEach((h
|
|
3468
|
-
`));let
|
|
3469
|
-
\u{1F4E6} Installing ${
|
|
3470
|
-
`)),console.log(l.gray(`Command: rapidkit add module ${
|
|
3468
|
+
`));else return;if(r.json){console.log(JSON.stringify({query:n,recommendations:c},null,2));return}console.log(l.green.bold(`\u{1F4E6} Recommended Modules:
|
|
3469
|
+
`)),c.forEach((g,h)=>{let f=(g.score*100).toFixed(1),m=g.score>.8?" \u2B50":"";console.log(l.bold(`${h+1}. ${g.module.name}${m}`)),console.log(l.gray(` ${g.module.description}`)),console.log(l.cyan(` Match: ${f}%`)+l.gray(` - ${g.reason}`)),console.log(l.yellow(` Category: ${g.module.category}`)),g.module.dependencies.length>0&&console.log(l.magenta(` Requires: ${g.module.dependencies.join(", ")}`)),console.log();});let d=c.slice(0,3).map(g=>g.module.id);console.log(l.cyan("\u{1F4A1} Quick install (top 3):")),console.log(l.white(` rapidkit add module ${d.join(" ")}
|
|
3470
|
+
`));let p=await zo(),{shouldInstall:u}=await p.prompt([{type:"confirm",name:"shouldInstall",message:"Would you like to install these modules now?",default:false}]);if(u){let{selectedModules:g}=await p.prompt([{type:"checkbox",name:"selectedModules",message:"Select modules to install:",choices:c.map(h=>({name:`${h.module.name} - ${h.module.description}`,value:h.module.id,checked:h.score>.7}))}]);g.length>0?(console.log(l.blue(`
|
|
3471
|
+
\u{1F4E6} Installing ${g.length} modules...
|
|
3472
|
+
`)),console.log(l.gray(`Command: rapidkit add module ${g.join(" ")}`)),console.log(l.yellow(`
|
|
3471
3473
|
\u26A0\uFE0F Note: Module installation not yet implemented`)),console.log(l.gray(`Coming soon in next version!
|
|
3472
3474
|
`))):console.log(l.gray(`
|
|
3473
3475
|
No modules selected
|
|
3474
|
-
`));}}catch(i){a.error(`
|
|
3476
|
+
`));}}catch(i){a$1.error(`
|
|
3475
3477
|
\u274C Error:`,i.message),i.code==="invalid_api_key"?(console.log(l.yellow(`
|
|
3476
3478
|
\u{1F4A1} Your API key may be invalid or expired`)),console.log(l.cyan(` Update it: rapidkit config set-api-key
|
|
3477
3479
|
`))):i.message.includes("embeddings file not found")&&(console.log(l.yellow(`
|
|
3478
3480
|
\u{1F4A1} Module embeddings not generated yet`)),console.log(l.cyan(" Generate them (one-time):")),console.log(l.white(" cd rapidkit-npm")),console.log(l.white(' export OPENAI_API_KEY="sk-proj-..."')),console.log(l.white(` npx tsx src/ai/generate-embeddings.ts
|
|
3479
|
-
`))),process.exit(1);}}),
|
|
3481
|
+
`))),process.exit(1);}}),o.command("info").description("Show AI features information").action(()=>{let t=st(),r=Bt();console.log(l.bold(`
|
|
3480
3482
|
\u{1F916} RapidKit AI Features
|
|
3481
|
-
`)),console.log(l.cyan("Status:"),
|
|
3483
|
+
`)),console.log(l.cyan("Status:"),r?l.green("Enabled"):l.red("Disabled")),console.log(l.cyan("API Key:"),t?l.green("Configured \u2713"):l.red("Not configured \u2717")),console.log(l.bold(`
|
|
3482
3484
|
\u{1F4E6} Available Features:
|
|
3483
3485
|
`)),console.log(l.white("\u2022 Module Recommender")+l.gray(" - AI-powered module suggestions")),console.log(l.gray(' Usage: rapidkit ai recommend "I need authentication"')),console.log(l.bold(`
|
|
3484
3486
|
\u{1F4B0} Pricing:
|
|
3485
3487
|
`)),console.log(l.white("\u2022 Per query: ~$0.0002")+l.gray(" (practically free)")),console.log(l.white("\u2022 100 queries: ~$0.02")+l.gray(" (2 cents)")),console.log(l.white("\u2022 1000 queries: ~$0.20")+l.gray(" (20 cents)")),console.log(l.bold(`
|
|
3486
3488
|
\u{1F680} Getting Started:
|
|
3487
|
-
`)),t?(console.log(l.green("\u2713 You're all set!")),console.log(l.white(' Try: rapidkit ai recommend "user authentication"'))):(console.log(l.white("1. Get OpenAI API key: https://platform.openai.com/api-keys")),console.log(l.white("2. Configure: rapidkit config set-api-key")),console.log(l.white('3. Try: rapidkit ai recommend "user authentication"'))),console.log();}),
|
|
3489
|
+
`)),t?(console.log(l.green("\u2713 You're all set!")),console.log(l.white(' Try: rapidkit ai recommend "user authentication"'))):(console.log(l.white("1. Get OpenAI API key: https://platform.openai.com/api-keys")),console.log(l.white("2. Configure: rapidkit config set-api-key")),console.log(l.white('3. Try: rapidkit ai recommend "user authentication"'))),console.log();}),o.command("generate-embeddings").description("Generate AI embeddings for all modules (one-time setup)").option("--force","Force regeneration even if embeddings exist").action(async()=>{try{let t=st();t||(console.log(l.red(`
|
|
3488
3490
|
\u274C OpenAI API key not configured
|
|
3489
3491
|
`)),console.log(l.cyan(`To generate embeddings, you need an OpenAI API key:
|
|
3490
3492
|
`)),console.log(l.white("1. Get your key from: https://platform.openai.com/api-keys")),console.log(l.white("2. Configure it: rapidkit config set-api-key")),console.log(l.gray(`
|
|
3491
3493
|
OR set environment variable:`)),console.log(l.white(` export OPENAI_API_KEY="sk-proj-..."
|
|
3492
|
-
`)),process.exit(1)),
|
|
3493
|
-
`))),process.exit(
|
|
3494
|
+
`)),process.exit(1)),Pt(t);let r=await Tt(true);r&&(console.log(l.green("\u2705 Ready to use AI recommendations!")),console.log(l.cyan(`Try: rapidkit ai recommend "authentication"
|
|
3495
|
+
`))),process.exit(r?0:1);}catch(t){a$1.error("Failed to generate embeddings:",t.message),process.exit(1);}}),o.command("update-embeddings").description("Update existing embeddings with latest modules").action(async()=>{try{let t=st();t||(console.log(l.red(`
|
|
3494
3496
|
\u274C OpenAI API key not configured
|
|
3495
3497
|
`)),console.log(l.white(`Set your API key: rapidkit config set-api-key
|
|
3496
|
-
`)),process.exit(1)),vt(t);let o=await jr();process.exit(o?0:1);}catch(t){a.error("Failed to update embeddings:",t.message),process.exit(1);}});}var Ct=class{constructor(r){this.runCommand=r;}runtime="go";async run(r,t,o){return {exitCode:await this.runCommand(r,t,o)}}findWorkspaceRoot(r){let t=r;for(;;){if(S.existsSync(f.join(t,".rapidkit-workspace")))return t;let o=f.dirname(t);if(o===t)break;t=o;}return null}resolveDependencyMode(r){let t=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(t==="shared-runtime-caches"||t==="shared-node-deps"||t==="isolated")return t;let o=this.findWorkspaceRoot(r);if(!o)return "isolated";let i=f.join(o,".rapidkit","policies.yml");if(!S.existsSync(i))return "isolated";try{let s=S.readFileSync(i,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*$/m)?.[1]?.toLowerCase();if(s==="shared-runtime-caches"||s==="shared-node-deps"||s==="isolated")return s}catch{}return "isolated"}withGoCacheEnv(r,t){let o=this.resolveDependencyMode(r),i=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(r),n=o==="shared-runtime-caches"?f.join(i||r,".rapidkit","cache","go"):f.join(r,".rapidkit","cache","go"),a=process.env.GOMODCACHE,s=process.env.GOCACHE;return process.env.GOMODCACHE=f.join(n,"mod"),process.env.GOCACHE=f.join(n,"build"),t().finally(()=>{typeof a>"u"?delete process.env.GOMODCACHE:process.env.GOMODCACHE=a,typeof s>"u"?delete process.env.GOCACHE:process.env.GOCACHE=s;})}async checkPrereqs(){return this.run("go",["version"],process.cwd())}async warmSetupCache(r){return this.withGoCacheEnv(r,async()=>{try{return process.env.GOMODCACHE&&S.mkdirSync(process.env.GOMODCACHE,{recursive:true}),process.env.GOCACHE&&S.mkdirSync(process.env.GOCACHE,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Go cache directories"}}})}async initProject(r){return this.withGoCacheEnv(r,()=>this.run("go",["mod","tidy"],r))}async runDev(r){return this.withGoCacheEnv(r,()=>{let t=f.join(r,"Makefile");return S.existsSync(t)?this.run("make",["run"],r):this.run("go",["run","./main.go"],r)})}async runTest(r){return this.withGoCacheEnv(r,()=>this.run("go",["test","./..."],r))}async runBuild(r){return this.withGoCacheEnv(r,()=>this.run("go",["build","./..."],r))}async runStart(r){return this.withGoCacheEnv(r,()=>{let o=(process.platform==="win32"?[f.join(r,"server.exe"),f.join(r,"server")]:[f.join(r,"server")]).find(i=>S.existsSync(i));return o?this.run(o,[],r):this.run("go",["run","./main.go"],r)})}async doctorHints(r){return ["Install Go from https://go.dev/dl/ if missing.","Run go mod tidy when dependencies are out of sync.","Use make run for hot-reload if Makefile exists."]}};var St=class{constructor(r){this.runCommand=r;}runtime="node";async run(r,t,o){return {exitCode:await this.runCommand(r,t,o)}}findWorkspaceRoot(r){let t=r;for(;;){if(S.existsSync(f.join(t,".rapidkit-workspace")))return t;let o=f.dirname(t);if(o===t)break;t=o;}return null}resolveDependencyMode(r){let t=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(t==="shared-runtime-caches"||t==="shared-node-deps"||t==="isolated")return t;let o=this.findWorkspaceRoot(r);if(!o)return "isolated";let i=f.join(o,".rapidkit","policies.yml");if(!S.existsSync(i))return "isolated";try{let s=S.readFileSync(i,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*$/m)?.[1]?.toLowerCase();if(s==="shared-runtime-caches"||s==="shared-node-deps"||s==="isolated")return s}catch{}return "isolated"}withDependencyEnv(r,t,o){let i=this.resolveDependencyMode(r),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(r),a=i==="isolated"?f.join(r,".rapidkit","cache","node"):f.join(n||r,".rapidkit","cache","node"),s=process.env.npm_config_cache,c=process.env.npm_config_store_dir;return t==="pnpm"?(process.env.npm_config_store_dir=f.join(a,"pnpm-store"),process.env.npm_config_cache=f.join(a,"pnpm-cache")):t==="yarn"?process.env.npm_config_cache=f.join(a,"yarn-cache"):process.env.npm_config_cache=f.join(a,"npm-cache"),o().finally(()=>{typeof s>"u"?delete process.env.npm_config_cache:process.env.npm_config_cache=s,typeof c>"u"?delete process.env.npm_config_store_dir:process.env.npm_config_store_dir=c;})}detectPackageManager(r){return S.existsSync(f.join(r,"pnpm-lock.yaml"))?"pnpm":S.existsSync(f.join(r,"yarn.lock"))?"yarn":"npm"}scriptArgs(r,t){return r==="npm"?["run",t]:["run",t]}async checkPrereqs(){return this.run("node",["--version"],process.cwd())}async warmSetupCache(r){let t=this.detectPackageManager(r);return this.withDependencyEnv(r,t,async()=>{try{return process.env.npm_config_cache&&S.mkdirSync(process.env.npm_config_cache,{recursive:true}),t==="pnpm"&&process.env.npm_config_store_dir&&S.mkdirSync(process.env.npm_config_store_dir,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Node cache directories"}}})}async initProject(r){let t=this.detectPackageManager(r),o=this.resolveDependencyMode(r),i=o==="shared-runtime-caches"||o==="shared-node-deps"?["install","--prefer-offline"]:["install"];return this.withDependencyEnv(r,t,()=>this.run(t,i,r))}async runDev(r){let t=this.detectPackageManager(r);return this.withDependencyEnv(r,t,()=>this.run(t,this.scriptArgs(t,"dev"),r))}async runTest(r){let t=this.detectPackageManager(r);return this.withDependencyEnv(r,t,()=>this.run(t,this.scriptArgs(t,"test"),r))}async runBuild(r){let t=this.detectPackageManager(r);return this.withDependencyEnv(r,t,()=>this.run(t,this.scriptArgs(t,"build"),r))}async runStart(r){let t=this.detectPackageManager(r);return this.withDependencyEnv(r,t,()=>this.run(t,this.scriptArgs(t,"start"),r))}async doctorHints(r){return ["Install Node.js LTS and ensure node/npm are on PATH.","Use lockfiles (package-lock.json, pnpm-lock.yaml, yarn.lock) for deterministic installs.","Run install before dev/test/build if dependencies changed."]}};var _t=class{constructor(r){this.runCore=r;}runtime="python";async run(r,t){return {exitCode:await this.withPythonCacheEnv(t,()=>this.runCore(r,t))}}findWorkspaceRoot(r){let t=r;for(;;){if(S.existsSync(f.join(t,".rapidkit-workspace")))return t;let o=f.dirname(t);if(o===t)break;t=o;}return null}resolveDependencyMode(r){let t=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(t==="shared-runtime-caches"||t==="shared-node-deps"||t==="isolated")return t;let o=this.findWorkspaceRoot(r);if(!o)return "isolated";let i=f.join(o,".rapidkit","policies.yml");if(!S.existsSync(i))return "isolated";try{let s=S.readFileSync(i,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*$/m)?.[1]?.toLowerCase();if(s==="shared-runtime-caches"||s==="shared-node-deps"||s==="isolated")return s}catch{}return "isolated"}withPythonCacheEnv(r,t){let o=this.resolveDependencyMode(r),i=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(r),n=o==="shared-runtime-caches"?f.join(i||r,".rapidkit","cache","python"):f.join(r,".rapidkit","cache","python"),a=process.env.PIP_CACHE_DIR,s=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=f.join(n,"pip"),process.env.POETRY_CACHE_DIR=f.join(n,"poetry"),t().finally(()=>{typeof a>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=a,typeof s>"u"?delete process.env.POETRY_CACHE_DIR:process.env.POETRY_CACHE_DIR=s;})}async checkPrereqs(){let r=process.cwd(),t=await this.run(["doctor","check"],r);return t.exitCode===0?t:this.run(["doctor"],r)}async initProject(r){return this.run(["init"],r)}async runDev(r){return this.run(["dev"],r)}async runTest(r){return this.run(["test"],r)}async runBuild(r){return this.run(["build"],r)}async runStart(r){return this.run(["start"],r)}async doctorHints(r){return ['Run "npx rapidkit doctor workspace" for a full workspace scan.','Use "npx rapidkit init" after adding or changing modules.','Use workspace launcher "./rapidkit" to avoid environment drift.']}};function sn(){let e={...process.env},r=e.PATH||"";if(r){let t=r.split(f.delimiter).filter(o=>!o.replace(/\\/g,"/").includes("/.pyenv/shims")).join(f.delimiter);e.PATH=t;}return e.PYENV_VERSION="system",e.POETRY_PYTHON=e.POETRY_PYTHON||(process.platform==="win32"?"python":"python3"),typeof e.RAPIDKIT_SKIP_LOCK_SYNC>"u"&&(e.RAPIDKIT_SKIP_LOCK_SYNC="1"),e}function Me(e,r){return e==="go"?new Ct((t,o,i)=>r.runCommandInCwd(t,o,i)):e==="node"?new St((t,o,i)=>r.runCommandInCwd(t,o,i)):new _t((t,o)=>r.runCoreRapidkit(t,{cwd:o,env:sn()}))}var xt=f.join(qi.homedir(),".rapidkit","cache"),Mr=1440*60*1e3,Pt=class e{static instance;memoryCache=new Map;constructor(){}static getInstance(){return e.instance||(e.instance=new e),e.instance}getCacheKey(r){return createHash("md5").update(r).digest("hex")}getCachePath(r){return f.join(xt,`${this.getCacheKey(r)}.json`)}async get(r,t="1.0"){let o=this.memoryCache.get(r);if(o&&o.version===t&&Date.now()-o.timestamp<Mr)return a.debug(`Cache hit (memory): ${r}`),o.data;try{let i=this.getCachePath(r),n=await promises.readFile(i,"utf-8"),a$1=JSON.parse(n);if(a$1.version===t&&Date.now()-a$1.timestamp<Mr)return a.debug(`Cache hit (disk): ${r}`),this.memoryCache.set(r,a$1),a$1.data;await promises.unlink(i).catch(()=>{});}catch{a.debug(`Cache miss: ${r}`);}return null}async set(r,t,o="1.0"){let i={data:t,timestamp:Date.now(),version:o};this.memoryCache.set(r,i);try{await promises.mkdir(xt,{recursive:true});let n=this.getCachePath(r);await promises.writeFile(n,JSON.stringify(i),"utf-8"),a.debug(`Cache set: ${r}`);}catch(n){a.debug(`Cache write failed: ${r}`,n);}}async invalidate(r){this.memoryCache.delete(r);try{let t=this.getCachePath(r);await promises.unlink(t),a.debug(`Cache invalidated: ${r}`);}catch{}}async clear(){this.memoryCache.clear();try{let r=await promises.readdir(xt);await Promise.all(r.map(t=>promises.unlink(f.join(xt,t)))),a.debug("Cache cleared");}catch{}}};function Te(e){let r=e;for(;;){let t=f.join(r,".rapidkit","project.json");if(S.existsSync(t))try{return JSON.parse(S.readFileSync(t,"utf8"))}catch{return null}let o=f.dirname(r);if(o===r)break;r=o;}return null}function ge(e,r){let t=e?.runtime?.toLowerCase(),o=e?.kit_name?.toLowerCase(),i=S.existsSync(f.join(r,"go.mod"));return t==="go"||(o?.startsWith("gofiber")??false)||(o?.startsWith("gogin")??false)||i}function me(e,r){let t=e?.runtime?.toLowerCase(),o=e?.kit_name?.toLowerCase(),i=S.existsSync(f.join(r,"package.json"));return t==="node"||t==="typescript"||(o?.startsWith("nestjs")??false)||i}function fe(e,r){let t=e?.runtime?.toLowerCase(),o=e?.kit_name?.toLowerCase(),i=S.existsSync(f.join(r,"pyproject.toml")),n=S.existsSync(f.join(r,"requirements.txt"))||S.existsSync(f.join(r,"requirements.in"));return t==="python"||(o?.startsWith("fastapi")??false)||i||n}async function un(e){let r=await promises.readFile(e);return createHash("sha256").update(r).digest("hex")}async function Lr(e,r){await b.outputFile(e,`${JSON.stringify(r,null,2)}
|
|
3497
|
-
`,"utf-8");}function
|
|
3498
|
-
`,"utf-8"),i}function wn(e,r){if(!r?.enabled)return {headers:{}};let t=process.env[r.hmacKeyEnv];if(!t)return {headers:{},error:`Evidence signing key env is missing: ${r.hmacKeyEnv}`};let o=(r.algorithm||"sha256").toLowerCase(),i=r.headerName||"x-rapidkit-evidence-signature",n=createHmac(o,t).update(JSON.stringify(e)).digest("hex");return {headers:{[i]:n,"x-rapidkit-evidence-signature-alg":o}}}async function vn(e,r,t){let o=(t.algorithm||"sha256").toLowerCase(),i=ve(e,t.publicKeyPath);if(!await b.pathExists(i))return {verified:false,algorithm:o,publicKeyPath:i,publicKeyFingerprint:"",signature:t.signature,message:`Public key not found: ${i}`};try{let n=await promises.readFile(i,"utf-8"),a=await promises.readFile(r),s=createVerify(o);s.update(a),s.end();let c=Buffer.from(t.signature,"base64"),p=s.verify(n,c),d=createHash("sha256").update(n).digest("hex");return {verified:p,algorithm:o,publicKeyPath:i,publicKeyFingerprint:d,signature:t.signature,message:p?"Attestation verified.":"Attestation signature verification failed."}}catch(n){return {verified:false,algorithm:o,publicKeyPath:i,publicKeyFingerprint:"",signature:t.signature,message:`Attestation verification error: ${n.message}`}}}async function kn(e,r,t,o){let i=process.env.RAPIDKIT_SIGSTORE_MOCK;if(i==="success")return {verified:true,tlogVerified:o.requireTransparencyLog,message:"Sigstore verification passed (mock).",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:t.bundlePath||null,certificatePath:t.certificatePath||null,signaturePath:t.signaturePath||null};if(i==="fail")return {verified:false,tlogVerified:false,message:"Sigstore verification failed (mock).",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:t.bundlePath||null,certificatePath:t.certificatePath||null,signaturePath:t.signaturePath||null};let n=t.signaturePath?ve(e,t.signaturePath):null;if(!n||!await b.pathExists(n))return {verified:false,tlogVerified:false,message:"Sigstore signaturePath is missing or not found.",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:t.bundlePath||null,certificatePath:t.certificatePath||null,signaturePath:n};let a=["verify-blob",r,"--signature",n],s=t.certificatePath?ve(e,t.certificatePath):null;s&&a.push("--certificate",s);let c=t.bundlePath?ve(e,t.bundlePath):null;c&&a.push("--bundle",c);let p=t.keyPath?ve(e,t.keyPath):null;p&&a.push("--key",p),t.identity&&a.push("--certificate-identity",t.identity),t.issuer&&a.push("--certificate-oidc-issuer",t.issuer),t.rekorUrl&&a.push("--rekor-url",t.rekorUrl),o.requireTransparencyLog||a.push("--insecure-ignore-tlog");try{let d=await execa("cosign",a,{reject:false});return d.exitCode===0?{verified:true,tlogVerified:o.requireTransparencyLog,message:"Sigstore verification passed.",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:c,certificatePath:s,signaturePath:n}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${d.stderr||d.stdout||"unknown error"}`,identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:c,certificatePath:s,signaturePath:n}}catch(d){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${d.message}`,identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:c,certificatePath:s,signaturePath:n}}}async function bn(e,r){let t=r.algorithm||"sha256",o=ve(e,r.policyPath),i=ve(e,r.signaturePath),n=ve(e,r.publicKeyPath);if(!await b.pathExists(o))return {verified:false,message:`Governance policy bundle not found: ${o}`,policies:null};if(!await b.pathExists(i))return {verified:false,message:`Governance policy signature not found: ${i}`,policies:null};if(!await b.pathExists(n))return {verified:false,message:`Governance policy public key not found: ${n}`,policies:null};try{let a=await promises.readFile(o,"utf-8"),s=(await promises.readFile(i,"utf-8")).trim(),c=await promises.readFile(n,"utf-8"),p=createVerify(t);return p.update(a),p.end(),p.verify(c,Buffer.from(s,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(a).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(a){return {verified:false,message:`Governance policy bundle verification error: ${a.message}`,policies:null}}}async function Ht(e,r){let t=[],o={syncedArtifacts:0,verifiedArtifacts:0,rotatedFiles:0,lockWritten:false,governanceBundleVerified:false,transparencyEvidenceWritten:false,transparencyEvidenceRecords:0,evidenceExported:false,evidenceExportTarget:null},i=f.join(e,".rapidkit"),n=f.join(i,"mirror-config.json"),a=f.join(i,"mirror.lock"),s=f.join(i,"mirror","artifacts"),c=f.join(i,"reports"),p=await mn(e);if(!await b.pathExists(n))return t.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .rapidkit/mirror-config.json not found."}),{checks:t,details:o};let d={};try{d=JSON.parse(await promises.readFile(n,"utf-8"));}catch{return t.push({id:"mirror.lifecycle.config",status:"failed",message:"Mirror lifecycle failed: invalid JSON in mirror-config.json."}),{checks:t,details:o}}if(!(r.forceRun===true||r.ciMode||r.offlineMode||d.mode==="offline-only"))return t.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: not in ci/offline mode."}),{checks:t,details:o};await b.ensureDir(s);let h=Math.max(0,d.prefetch?.retries??2),w=Math.max(0,d.prefetch?.backoffMs??250),g=Math.max(1e3,d.prefetch?.timeoutMs??15e3),u=d.security?.requireAttestation===true,C=d.security?.requireSigstore===true,I=d.security?.requireTransparencyLog===true,A=d.security?.requireSignedGovernance===true,_=d.security?.evidenceExport,N=(process.env.RAPIDKIT_ENV||d.security?.governance?.environment||"dev").toLowerCase(),K=d.security?.governance?.policies||{};if(d.security?.governanceBundle){let B=await bn(e,d.security.governanceBundle);if(t.push({id:"governance.bundle.verify",status:B.verified?"passed":"failed",message:B.message}),B.verified&&B.policies)K=B.policies,o.governanceBundleVerified=true;else if(A)return {checks:t,details:o}}let D=K[N],q=I||D?.requireTransparencyLog===true,ke=[],Ye=Array.isArray(d.artifacts)?d.artifacts:[],he=[];for(let B=0;B<Ye.length;B+=1){let G=Ye[B],k=G.id||`artifact-${B+1}`,oe=G.source?ve(e,G.source):null,ie=gn(G,k),F=f.join(s,ie),te=false,ae={sourceType:"path",source:oe||G.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(oe&&await b.pathExists(oe))await b.ensureDir(f.dirname(F)),await b.copyFile(oe,F),o.syncedArtifacts+=1,te=true,ae={sourceType:"path",source:oe,host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true},t.push({id:`mirror.sync.${k}`,status:"passed",message:`Mirrored artifact ${k} from source path.`});else if(G.url){let U="";try{U=new URL(G.url).hostname.toLowerCase();}catch{t.push({id:`mirror.prefetch.${k}`,status:"failed",message:`Invalid URL for ${k}: ${G.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||p.has(U))){t.push({id:`mirror.prefetch.trust.${k}`,status:"failed",message:`Untrusted mirror host for ${k}: ${U}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(r.offlineMode&&(await b.pathExists(F)?(te=true,ae={sourceType:"url",source:G.url,host:U,fetchedAt:new Date().toISOString(),attempts:0,trusted:true},t.push({id:`mirror.prefetch.${k}`,status:"passed",message:`Offline mode reused existing mirrored artifact ${k}.`})):t.push({id:`mirror.prefetch.${k}`,status:"failed",message:`Offline mode cannot prefetch remote artifact ${k} without an existing mirrored copy.`}),!te))continue;if(!te){let re=null,Ee=0;for(let _e=1;_e<=h+1;_e+=1){Ee=_e;try{await fn(G.url,F,g),o.syncedArtifacts+=1,te=true,ae={sourceType:"url",source:G.url,host:U,fetchedAt:new Date().toISOString(),attempts:Ee,trusted:true},t.push({id:`mirror.prefetch.${k}`,status:"passed",message:Ee>1?`Prefetched artifact ${k} from ${U} after ${Ee} attempts.`:`Prefetched artifact ${k} from ${U}.`});break}catch(nt){if(re=nt,_e<=h){await qr(w*_e);continue}}}if(!te){t.push({id:`mirror.prefetch.${k}`,status:"failed",message:`Failed to prefetch ${k} after ${h+1} attempt(s): ${re?.message||"unknown error"}`});continue}}if(!te){t.push({id:`mirror.prefetch.${k}`,status:"failed",message:`Failed to prefetch ${k}.`});continue}}if(!te){G.required||r.offlineMode?t.push({id:`mirror.sync.${k}`,status:"failed",message:`Mirror source missing for ${k}${oe?`: ${oe}`:""}`}):t.push({id:`mirror.sync.${k}`,status:"skipped",message:`Mirror source not found for optional artifact ${k}.`});continue}let x=await un(F);if(G.sha256&&G.sha256.toLowerCase()!==x.toLowerCase()){t.push({id:`mirror.verify.${k}`,status:"failed",message:`Checksum mismatch for ${k}.`});continue}o.verifiedArtifacts+=1,t.push({id:`mirror.verify.${k}`,status:"passed",message:`Checksum verified for ${k}.`});let P=G.attestation?await vn(e,F,G.attestation):null;if(G.attestation){if(t.push({id:`mirror.attest.${k}`,status:P?.verified?"passed":"failed",message:P?.message||"Attestation verification failed."}),!P?.verified)continue}else if(u){t.push({id:`mirror.attest.${k}`,status:"failed",message:`Attestation is required but missing for ${k}.`});continue}else t.push({id:`mirror.attest.${k}`,status:"skipped",message:`No attestation provided for ${k}.`});let $=G.attestation?.sigstore,T=$?await kn(e,F,$,{requireTransparencyLog:q}):null;if($){if(t.push({id:`mirror.sigstore.${k}`,status:T?.verified?"passed":"failed",message:T?.message||"Sigstore verification failed."}),ke.push({artifactId:k,verified:!!T?.verified,tlogVerified:!!T?.tlogVerified,identity:T?.identity||null,issuer:T?.issuer||null,rekorUrl:T?.rekorUrl||null,timestamp:new Date().toISOString(),environment:N}),!T?.verified)continue}else if(C){t.push({id:`mirror.sigstore.${k}`,status:"failed",message:`Sigstore attestation is required but missing for ${k}.`});continue}else t.push({id:`mirror.sigstore.${k}`,status:"skipped",message:`No Sigstore attestation provided for ${k}.`});if($&&T?.verified&&D){let U=D.allowedIdentities||[];if(U.length>0){let re=!!T.identity&&U.includes(T.identity);if(t.push({id:`mirror.sigstore.policy.identity.${k}`,status:re?"passed":"failed",message:re?`Sigstore identity policy passed for ${k} in ${N}.`:`Sigstore identity policy failed for ${k} in ${N}.`}),!re)continue}let Pe=D.allowedIssuers||[];if(Pe.length>0){let re=!!T.issuer&&Pe.includes(T.issuer);if(t.push({id:`mirror.sigstore.policy.issuer.${k}`,status:re?"passed":"failed",message:re?`Sigstore issuer policy passed for ${k} in ${N}.`:`Sigstore issuer policy failed for ${k} in ${N}.`}),!re)continue}let Se=D.allowedRekorUrls||[];if(Se.length>0){let re=!!T.rekorUrl&&Se.includes(T.rekorUrl);if(t.push({id:`mirror.sigstore.policy.rekor.${k}`,status:re?"passed":"failed",message:re?`Sigstore Rekor policy passed for ${k} in ${N}.`:`Sigstore Rekor policy failed for ${k} in ${N}.`}),!re)continue}}else D&&t.push({id:`mirror.sigstore.policy.${k}`,status:"skipped",message:`Sigstore governance policy configured for ${N} but no verified Sigstore attestation for ${k}.`});let de=await promises.stat(F);he.push({id:k,path:f.relative(e,F),sha256:x,size:de.size,provenance:ae,attestation:{detached:{provided:!!G.attestation,verified:P?.verified||false,algorithm:P?.algorithm||null,publicKeyPath:P?.publicKeyPath||null,publicKeyFingerprint:P?.publicKeyFingerprint||null,signature:P?.signature||null,verifiedAt:P?.verified?new Date().toISOString():null},sigstore:{provided:!!$,verified:T?.verified||false,tlogVerified:T?.tlogVerified||false,identity:T?.identity||null,issuer:T?.issuer||null,rekorUrl:T?.rekorUrl||null,bundlePath:T?.bundlePath||null,certificatePath:T?.certificatePath||null,signaturePath:T?.signaturePath||null,verifiedAt:T?.verified?new Date().toISOString():null}}});}let pe=d.retention?.keepLast;if(typeof pe=="number"&&pe>0){let G=(await promises.readdir(s,{withFileTypes:true})).filter(k=>k.isFile()).map(k=>f.join(s,k.name));if(G.length>pe){let k=await Promise.all(G.map(async ie=>({filePath:ie,stat:await promises.stat(ie)})));k.sort((ie,F)=>F.stat.mtimeMs-ie.stat.mtimeMs);let oe=k.slice(pe);for(let ie of oe)await promises.unlink(ie.filePath),o.rotatedFiles+=1;}}t.push({id:"mirror.rotate",status:"passed",message:o.rotatedFiles>0?`Mirror retention rotation removed ${o.rotatedFiles} file(s).`:"Mirror retention rotation completed with no removals."});let Ke={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:d.mode||null,environment:N,artifacts:he};if(await promises.writeFile(a,`${JSON.stringify(Ke,null,2)}
|
|
3499
|
-
`,"utf-8"),
|
|
3500
|
-
`,"utf-8"),
|
|
3501
|
-
`),1;let
|
|
3502
|
-
`),1;await a.ensureDir(i),await
|
|
3503
|
-
`),1}}async function
|
|
3504
|
-
`),1;let
|
|
3505
|
-
`),1;await a.ensureDir(i),await
|
|
3506
|
-
`),1}}async function
|
|
3507
|
-
Reason: ${
|
|
3498
|
+
`)),process.exit(1)),Pt(t);let r=await Yo();process.exit(r?0:1);}catch(t){a$1.error("Failed to update embeddings:",t.message),process.exit(1);}});}var Ot=class{constructor(o){this.runCommand=o;}runtime="go";async run(o,t,r){return {exitCode:await this.runCommand(o,t,r)}}findWorkspaceRoot(o){let t=o;for(;;){if(b$2.existsSync(y.join(t,".rapidkit-workspace")))return t;let r=y.dirname(t);if(r===t)break;t=r;}return null}resolveDependencyMode(o){let t=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(t==="shared-runtime-caches"||t==="shared-node-deps"||t==="isolated")return t;let r=this.findWorkspaceRoot(o);if(!r)return "isolated";let i=y.join(r,".rapidkit","policies.yml");if(!b$2.existsSync(i))return "isolated";try{let s=b$2.readFileSync(i,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(s==="shared-runtime-caches"||s==="shared-node-deps"||s==="isolated")return s}catch{}return "isolated"}withGoCacheEnv(o,t){let r=this.resolveDependencyMode(o),i=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(o),n=r==="shared-runtime-caches"?y.join(i||o,".rapidkit","cache","go"):y.join(o,".rapidkit","cache","go"),a=process.env.GOMODCACHE,s=process.env.GOCACHE;return process.env.GOMODCACHE=y.join(n,"mod"),process.env.GOCACHE=y.join(n,"build"),t().finally(()=>{typeof a>"u"?delete process.env.GOMODCACHE:process.env.GOMODCACHE=a,typeof s>"u"?delete process.env.GOCACHE:process.env.GOCACHE=s;})}async checkPrereqs(){return this.run("go",["version"],process.cwd())}async warmSetupCache(o){return this.withGoCacheEnv(o,async()=>{try{return process.env.GOMODCACHE&&b$2.mkdirSync(process.env.GOMODCACHE,{recursive:true}),process.env.GOCACHE&&b$2.mkdirSync(process.env.GOCACHE,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Go cache directories"}}})}async initProject(o){return this.withGoCacheEnv(o,()=>this.run("go",["mod","tidy"],o))}async runDev(o){return this.withGoCacheEnv(o,()=>{let t=y.join(o,"Makefile");return b$2.existsSync(t)?this.run("make",["run"],o):this.run("go",["run","./main.go"],o)})}async runTest(o){return this.withGoCacheEnv(o,()=>this.run("go",["test","./..."],o))}async runBuild(o){return this.withGoCacheEnv(o,()=>this.run("go",["build","./..."],o))}async runStart(o){return this.withGoCacheEnv(o,()=>{let r=(a()?[y.join(o,"server.exe"),y.join(o,"server")]:[y.join(o,"server")]).find(i=>b$2.existsSync(i));return r?this.run(r,[],o):this.run("go",["run","./main.go"],o)})}async doctorHints(o){return ["Install Go from https://go.dev/dl/ if missing.","Run go mod tidy when dependencies are out of sync.","Use make run for hot-reload if Makefile exists."]}};var At=class{constructor(o){this.runCommand=o;}runtime="node";async run(o,t,r){return {exitCode:await this.runCommand(o,t,r)}}findWorkspaceRoot(o){let t=o;for(;;){if(b$2.existsSync(y.join(t,".rapidkit-workspace")))return t;let r=y.dirname(t);if(r===t)break;t=r;}return null}resolveDependencyMode(o){let t=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(t==="shared-runtime-caches"||t==="shared-node-deps"||t==="isolated")return t;let r=this.findWorkspaceRoot(o);if(!r)return "isolated";let i=y.join(r,".rapidkit","policies.yml");if(!b$2.existsSync(i))return "isolated";try{let s=b$2.readFileSync(i,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(s==="shared-runtime-caches"||s==="shared-node-deps"||s==="isolated")return s}catch{}return "isolated"}withDependencyEnv(o,t,r){let i=this.resolveDependencyMode(o),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(o),a=i==="isolated"?y.join(o,".rapidkit","cache","node"):y.join(n||o,".rapidkit","cache","node"),s=process.env.npm_config_cache,c=process.env.npm_config_store_dir;return t==="pnpm"?(process.env.npm_config_store_dir=y.join(a,"pnpm-store"),process.env.npm_config_cache=y.join(a,"pnpm-cache")):t==="yarn"?process.env.npm_config_cache=y.join(a,"yarn-cache"):process.env.npm_config_cache=y.join(a,"npm-cache"),r().finally(()=>{typeof s>"u"?delete process.env.npm_config_cache:process.env.npm_config_cache=s,typeof c>"u"?delete process.env.npm_config_store_dir:process.env.npm_config_store_dir=c;})}detectPackageManager(o){return b$2.existsSync(y.join(o,"pnpm-lock.yaml"))?"pnpm":b$2.existsSync(y.join(o,"yarn.lock"))?"yarn":"npm"}scriptArgs(o,t){return o==="npm"?["run",t]:["run",t]}async checkPrereqs(){return this.run("node",["--version"],process.cwd())}async warmSetupCache(o){let t=this.detectPackageManager(o);return this.withDependencyEnv(o,t,async()=>{try{return process.env.npm_config_cache&&b$2.mkdirSync(process.env.npm_config_cache,{recursive:true}),t==="pnpm"&&process.env.npm_config_store_dir&&b$2.mkdirSync(process.env.npm_config_store_dir,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Node cache directories"}}})}async initProject(o){let t=this.detectPackageManager(o),r=this.resolveDependencyMode(o),i=r==="shared-runtime-caches"||r==="shared-node-deps"?["install","--prefer-offline"]:["install"];return this.withDependencyEnv(o,t,()=>this.run(t,i,o))}async runDev(o){let t=this.detectPackageManager(o);return this.withDependencyEnv(o,t,()=>this.run(t,this.scriptArgs(t,"dev"),o))}async runTest(o){let t=this.detectPackageManager(o);return this.withDependencyEnv(o,t,()=>this.run(t,this.scriptArgs(t,"test"),o))}async runBuild(o){let t=this.detectPackageManager(o);return this.withDependencyEnv(o,t,()=>this.run(t,this.scriptArgs(t,"build"),o))}async runStart(o){let t=this.detectPackageManager(o);return this.withDependencyEnv(o,t,()=>this.run(t,this.scriptArgs(t,"start"),o))}async doctorHints(o){return ["Install Node.js LTS and ensure node/npm are on PATH.","Use lockfiles (package-lock.json, pnpm-lock.yaml, yarn.lock) for deterministic installs.","Run install before dev/test/build if dependencies changed."]}};var Nt=class{constructor(o){this.runCore=o;}runtime="python";async run(o,t){return {exitCode:await this.withPythonCacheEnv(t,()=>this.runCore(o,t))}}findWorkspaceRoot(o){let t=o;for(;;){if(b$2.existsSync(y.join(t,".rapidkit-workspace")))return t;let r=y.dirname(t);if(r===t)break;t=r;}return null}resolveDependencyMode(o){let t=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(t==="shared-runtime-caches"||t==="shared-node-deps"||t==="isolated")return t;let r=this.findWorkspaceRoot(o);if(!r)return "isolated";let i=y.join(r,".rapidkit","policies.yml");if(!b$2.existsSync(i))return "isolated";try{let s=b$2.readFileSync(i,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(s==="shared-runtime-caches"||s==="shared-node-deps"||s==="isolated")return s}catch{}return "isolated"}withPythonCacheEnv(o,t){let r=this.resolveDependencyMode(o),i=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(o),n=r==="shared-runtime-caches"?y.join(i||o,".rapidkit","cache","python"):y.join(o,".rapidkit","cache","python"),a=process.env.PIP_CACHE_DIR,s=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=y.join(n,"pip"),process.env.POETRY_CACHE_DIR=y.join(n,"poetry"),t().finally(()=>{typeof a>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=a,typeof s>"u"?delete process.env.POETRY_CACHE_DIR:process.env.POETRY_CACHE_DIR=s;})}async checkPrereqs(){let o=process.cwd(),t=await this.run(["doctor","check"],o);return t.exitCode===0?t:this.run(["doctor"],o)}async initProject(o){return this.run(["init"],o)}async runDev(o){return this.run(["dev"],o)}async runTest(o){return this.run(["test"],o)}async runBuild(o){return this.run(["build"],o)}async runStart(o){return this.run(["start"],o)}async doctorHints(o){return ['Run "npx rapidkit doctor workspace" for a full workspace scan.','Use "npx rapidkit init" after adding or changing modules.','Use workspace launcher "./rapidkit" to avoid environment drift.']}};function jn(){let e={...process.env},o=e.PATH||"";if(o){let t=o.split(y.delimiter).filter(r=>!r.replace(/\\/g,"/").includes("/.pyenv/shims")).join(y.delimiter);e.PATH=t;}return e.PYENV_VERSION="system",e.POETRY_PYTHON=e.POETRY_PYTHON||c$3(),typeof e.RAPIDKIT_SKIP_LOCK_SYNC>"u"&&(e.RAPIDKIT_SKIP_LOCK_SYNC="1"),e}function Fe(e,o){return e==="go"?new Ot((t,r,i)=>o.runCommandInCwd(t,r,i)):e==="node"?new At((t,r,i)=>o.runCommandInCwd(t,r,i)):new Nt((t,r)=>o.runCoreRapidkit(t,{cwd:r,env:jn()}))}var Zo=y.join(hn.homedir(),".rapidkit","cache"),er=1440*60*1e3;function Qt(){let e=process.env.RAPIDKIT_CACHE_DIR?.trim();if(e)return e;let o=process.env.VITEST_WORKER_ID?.trim();return o?y.join(Zo,`vitest-${o}`):Zo}var jt=class e{static instance;memoryCache=new Map;constructor(){}static getInstance(){return e.instance||(e.instance=new e),e.instance}getCacheKey(o){return createHash("md5").update(o).digest("hex")}getCachePath(o){return y.join(Qt(),`${this.getCacheKey(o)}.json`)}async get(o,t="1.0"){let r=this.memoryCache.get(o);if(r&&r.version===t&&Date.now()-r.timestamp<er)return a$1.debug(`Cache hit (memory): ${o}`),r.data;try{let i=this.getCachePath(o),n=await promises.readFile(i,"utf-8"),a=JSON.parse(n);if(a.version===t&&Date.now()-a.timestamp<er)return a$1.debug(`Cache hit (disk): ${o}`),this.memoryCache.set(o,a),a.data;await promises.unlink(i).catch(()=>{});}catch{a$1.debug(`Cache miss: ${o}`);}return null}async set(o,t,r="1.0"){let i={data:t,timestamp:Date.now(),version:r};this.memoryCache.set(o,i);try{await promises.mkdir(Qt(),{recursive:true});let n=this.getCachePath(o);await promises.writeFile(n,JSON.stringify(i),"utf-8"),a$1.debug(`Cache set: ${o}`);}catch(n){a$1.debug(`Cache write failed: ${o}`,n);}}async invalidate(o){this.memoryCache.delete(o);try{let t=this.getCachePath(o);await promises.unlink(t),a$1.debug(`Cache invalidated: ${o}`);}catch{}}async clear(){this.memoryCache.clear();try{let o=Qt(),t=await promises.readdir(o);await Promise.all(t.map(r=>promises.unlink(y.join(o,r)))),a$1.debug("Cache cleared");}catch{}}};function Ne(e){let o=e;for(;;){let t=y.join(o,".rapidkit","project.json");if(b$2.existsSync(t))try{return JSON.parse(b$2.readFileSync(t,"utf8"))}catch{return null}let r=y.dirname(o);if(r===o)break;o=r;}return null}function me(e,o){let t=e?.runtime?.toLowerCase(),r=e?.kit_name?.toLowerCase(),i=b$2.existsSync(y.join(o,"go.mod"));return t==="go"||(r?.startsWith("gofiber")??false)||(r?.startsWith("gogin")??false)||i}function fe(e,o){let t=e?.runtime?.toLowerCase(),r=e?.kit_name?.toLowerCase(),i=b$2.existsSync(y.join(o,"package.json"));return t==="node"||t==="typescript"||(r?.startsWith("nestjs")??false)||i}function he(e,o){let t=e?.runtime?.toLowerCase(),r=e?.kit_name?.toLowerCase(),i=b$2.existsSync(y.join(o,"pyproject.toml")),n=b$2.existsSync(y.join(o,"requirements.txt"))||b$2.existsSync(y.join(o,"requirements.in"));return t==="python"||(r?.startsWith("fastapi")??false)||i||n}async function Fn(e){let o=await promises.readFile(e);return createHash("sha256").update(o).digest("hex")}async function tr(e,o){await _.outputFile(e,`${JSON.stringify(o,null,2)}
|
|
3499
|
+
`,"utf-8");}function be(e,o){return y.isAbsolute(o)?o:y.join(e,o)}function Hn(e,o){if(e.target)return e.target;if(e.source)return y.basename(e.source);if(e.url)try{let t=new URL(e.url).pathname,r=y.basename(t);if(r&&r!=="/")return r}catch{}return `${o}.artifact`}async function Kn(e){let o=y.join(e,".rapidkit","trusted-sources.lock"),t=new Set(["localhost","127.0.0.1"]);if(!await _.pathExists(o))return t;try{let i=(await promises.readFile(o,"utf-8")).split(/\r?\n/).map(n=>n.trim()).filter(n=>n.length>0&&!n.startsWith("#"));for(let n of i)t.add(n.toLowerCase());}catch{}return t}async function Wn(e,o,t){await _.ensureDir(y.dirname(o)),await new Promise((r,i)=>{let a=(e.startsWith("https://")?sr:nr).get(e,s=>{if(!s.statusCode||s.statusCode<200||s.statusCode>=300){i(new Error(`HTTP ${s.statusCode||"unknown"}`)),s.resume();return}let c=createWriteStream(o);s.pipe(c),c.on("finish",()=>{c.close(),r();}),c.on("error",d=>{i(d);});});a.setTimeout(t,()=>{a.destroy(new Error(`Request timeout after ${t}ms`));}),a.on("error",s=>{i(s);});});}async function Un(e,o,t,r,i){let n=new URL(e),a=JSON.stringify(o),s=n.protocol==="https:"?sr:nr;await new Promise((c,d)=>{let p=s.request({method:"POST",hostname:n.hostname,port:n.port||(n.protocol==="https:"?443:80),path:`${n.pathname}${n.search}`,headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(a),...r?{Authorization:`Bearer ${r}`}:{},...i||{}}},u=>{if(!u.statusCode||u.statusCode<200||u.statusCode>=300){d(new Error(`HTTP ${u.statusCode||"unknown"}`)),u.resume();return}u.resume(),c();});p.setTimeout(t,()=>{p.destroy(new Error(`Request timeout after ${t}ms`));}),p.on("error",u=>{d(u);}),p.write(a),p.end();});}function or(e){return new Promise(o=>setTimeout(o,e))}async function Vn(e,o,t,r){let i=be(e,o||".rapidkit/reports/evidence-export-dead-letter.ndjson");return await _.ensureDir(y.dirname(i)),await promises.appendFile(i,`${JSON.stringify({timestamp:new Date().toISOString(),reason:r,payload:t})}
|
|
3500
|
+
`,"utf-8"),i}function Bn(e,o){if(!o?.enabled)return {headers:{}};let t=process.env[o.hmacKeyEnv];if(!t)return {headers:{},error:`Evidence signing key env is missing: ${o.hmacKeyEnv}`};let r=(o.algorithm||"sha256").toLowerCase(),i=o.headerName||"x-rapidkit-evidence-signature",n=createHmac(r,t).update(JSON.stringify(e)).digest("hex");return {headers:{[i]:n,"x-rapidkit-evidence-signature-alg":r}}}async function Jn(e,o,t){let r=(t.algorithm||"sha256").toLowerCase(),i=be(e,t.publicKeyPath);if(!await _.pathExists(i))return {verified:false,algorithm:r,publicKeyPath:i,publicKeyFingerprint:"",signature:t.signature,message:`Public key not found: ${i}`};try{let n=await promises.readFile(i,"utf-8"),a=await promises.readFile(o),s=createVerify(r);s.update(a),s.end();let c=Buffer.from(t.signature,"base64"),d=s.verify(n,c),p=createHash("sha256").update(n).digest("hex");return {verified:d,algorithm:r,publicKeyPath:i,publicKeyFingerprint:p,signature:t.signature,message:d?"Attestation verified.":"Attestation signature verification failed."}}catch(n){return {verified:false,algorithm:r,publicKeyPath:i,publicKeyFingerprint:"",signature:t.signature,message:`Attestation verification error: ${n.message}`}}}async function Yn(e,o,t,r){let i=process.env.RAPIDKIT_SIGSTORE_MOCK;if(i==="success")return {verified:true,tlogVerified:r.requireTransparencyLog,message:"Sigstore verification passed (mock).",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:t.bundlePath||null,certificatePath:t.certificatePath||null,signaturePath:t.signaturePath||null};if(i==="fail")return {verified:false,tlogVerified:false,message:"Sigstore verification failed (mock).",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:t.bundlePath||null,certificatePath:t.certificatePath||null,signaturePath:t.signaturePath||null};let n=t.signaturePath?be(e,t.signaturePath):null;if(!n||!await _.pathExists(n))return {verified:false,tlogVerified:false,message:"Sigstore signaturePath is missing or not found.",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:t.bundlePath||null,certificatePath:t.certificatePath||null,signaturePath:n};let a=["verify-blob",o,"--signature",n],s=t.certificatePath?be(e,t.certificatePath):null;s&&a.push("--certificate",s);let c=t.bundlePath?be(e,t.bundlePath):null;c&&a.push("--bundle",c);let d=t.keyPath?be(e,t.keyPath):null;d&&a.push("--key",d),t.identity&&a.push("--certificate-identity",t.identity),t.issuer&&a.push("--certificate-oidc-issuer",t.issuer),t.rekorUrl&&a.push("--rekor-url",t.rekorUrl),r.requireTransparencyLog||a.push("--insecure-ignore-tlog");try{let p=await execa("cosign",a,{reject:false});return p.exitCode===0?{verified:true,tlogVerified:r.requireTransparencyLog,message:"Sigstore verification passed.",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:c,certificatePath:s,signaturePath:n}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${p.stderr||p.stdout||"unknown error"}`,identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:c,certificatePath:s,signaturePath:n}}catch(p){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${p.message}`,identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:c,certificatePath:s,signaturePath:n}}}async function zn(e,o){let t=o.algorithm||"sha256",r=be(e,o.policyPath),i=be(e,o.signaturePath),n=be(e,o.publicKeyPath);if(!await _.pathExists(r))return {verified:false,message:`Governance policy bundle not found: ${r}`,policies:null};if(!await _.pathExists(i))return {verified:false,message:`Governance policy signature not found: ${i}`,policies:null};if(!await _.pathExists(n))return {verified:false,message:`Governance policy public key not found: ${n}`,policies:null};try{let a=await promises.readFile(r,"utf-8"),s=(await promises.readFile(i,"utf-8")).trim(),c=await promises.readFile(n,"utf-8"),d=createVerify(t);return d.update(a),d.end(),d.verify(c,Buffer.from(s,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(a).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(a){return {verified:false,message:`Governance policy bundle verification error: ${a.message}`,policies:null}}}async function Xt(e,o){let t=[],r={syncedArtifacts:0,verifiedArtifacts:0,rotatedFiles:0,lockWritten:false,governanceBundleVerified:false,transparencyEvidenceWritten:false,transparencyEvidenceRecords:0,evidenceExported:false,evidenceExportTarget:null},i=y.join(e,".rapidkit"),n=y.join(i,"mirror-config.json"),a=y.join(i,"mirror.lock"),s=y.join(i,"mirror","artifacts"),c=y.join(i,"reports"),d=await Kn(e);if(!await _.pathExists(n))return t.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .rapidkit/mirror-config.json not found."}),{checks:t,details:r};let p={};try{p=JSON.parse(await promises.readFile(n,"utf-8"));}catch{return t.push({id:"mirror.lifecycle.config",status:"failed",message:"Mirror lifecycle failed: invalid JSON in mirror-config.json."}),{checks:t,details:r}}if(!(o.forceRun===true||o.ciMode||o.offlineMode||p.mode==="offline-only"))return t.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: not in ci/offline mode."}),{checks:t,details:r};await _.ensureDir(s);let g=Math.max(0,p.prefetch?.retries??2),h=Math.max(0,p.prefetch?.backoffMs??250),f=Math.max(1e3,p.prefetch?.timeoutMs??15e3),m=p.security?.requireAttestation===true,k=p.security?.requireSigstore===true,O=p.security?.requireTransparencyLog===true,A=p.security?.requireSignedGovernance===true,P=p.security?.evidenceExport,I=(process.env.RAPIDKIT_ENV||p.security?.governance?.environment||"dev").toLowerCase(),K=p.security?.governance?.policies||{};if(p.security?.governanceBundle){let J=await zn(e,p.security.governanceBundle);if(t.push({id:"governance.bundle.verify",status:J.verified?"passed":"failed",message:J.message}),J.verified&&J.policies)K=J.policies,r.governanceBundleVerified=true;else if(A)return {checks:t,details:r}}let j=K[I],M=O||j?.requireTransparencyLog===true,Re=[],Ze=Array.isArray(p.artifacts)?p.artifacts:[],we=[];for(let J=0;J<Ze.length;J+=1){let L=Ze[J],R=L.id||`artifact-${J+1}`,ne=L.source?be(e,L.source):null,se=Hn(L,R),F=y.join(s,se),oe=false,ce={sourceType:"path",source:ne||L.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(ne&&await _.pathExists(ne))await _.ensureDir(y.dirname(F)),await _.copyFile(ne,F),r.syncedArtifacts+=1,oe=true,ce={sourceType:"path",source:ne,host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true},t.push({id:`mirror.sync.${R}`,status:"passed",message:`Mirrored artifact ${R} from source path.`});else if(L.url){let W="";try{W=new URL(L.url).hostname.toLowerCase();}catch{t.push({id:`mirror.prefetch.${R}`,status:"failed",message:`Invalid URL for ${R}: ${L.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||d.has(W))){t.push({id:`mirror.prefetch.trust.${R}`,status:"failed",message:`Untrusted mirror host for ${R}: ${W}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(o.offlineMode&&(await _.pathExists(F)?(oe=true,ce={sourceType:"url",source:L.url,host:W,fetchedAt:new Date().toISOString(),attempts:0,trusted:true},t.push({id:`mirror.prefetch.${R}`,status:"passed",message:`Offline mode reused existing mirrored artifact ${R}.`})):t.push({id:`mirror.prefetch.${R}`,status:"failed",message:`Offline mode cannot prefetch remote artifact ${R} without an existing mirrored copy.`}),!oe))continue;if(!oe){let re=null,Te=0;for(let Pe=1;Pe<=g+1;Pe+=1){Te=Pe;try{await Wn(L.url,F,f),r.syncedArtifacts+=1,oe=true,ce={sourceType:"url",source:L.url,host:W,fetchedAt:new Date().toISOString(),attempts:Te,trusted:true},t.push({id:`mirror.prefetch.${R}`,status:"passed",message:Te>1?`Prefetched artifact ${R} from ${W} after ${Te} attempts.`:`Prefetched artifact ${R} from ${W}.`});break}catch(ut){if(re=ut,Pe<=g){await or(h*Pe);continue}}}if(!oe){t.push({id:`mirror.prefetch.${R}`,status:"failed",message:`Failed to prefetch ${R} after ${g+1} attempt(s): ${re?.message||"unknown error"}`});continue}}if(!oe){t.push({id:`mirror.prefetch.${R}`,status:"failed",message:`Failed to prefetch ${R}.`});continue}}if(!oe){L.required||o.offlineMode?t.push({id:`mirror.sync.${R}`,status:"failed",message:`Mirror source missing for ${R}${ne?`: ${ne}`:""}`}):t.push({id:`mirror.sync.${R}`,status:"skipped",message:`Mirror source not found for optional artifact ${R}.`});continue}let S=await Fn(F);if(L.sha256&&L.sha256.toLowerCase()!==S.toLowerCase()){t.push({id:`mirror.verify.${R}`,status:"failed",message:`Checksum mismatch for ${R}.`});continue}r.verifiedArtifacts+=1,t.push({id:`mirror.verify.${R}`,status:"passed",message:`Checksum verified for ${R}.`});let E=L.attestation?await Jn(e,F,L.attestation):null;if(L.attestation){if(t.push({id:`mirror.attest.${R}`,status:E?.verified?"passed":"failed",message:E?.message||"Attestation verification failed."}),!E?.verified)continue}else if(m){t.push({id:`mirror.attest.${R}`,status:"failed",message:`Attestation is required but missing for ${R}.`});continue}else t.push({id:`mirror.attest.${R}`,status:"skipped",message:`No attestation provided for ${R}.`});let D=L.attestation?.sigstore,N=D?await Yn(e,F,D,{requireTransparencyLog:M}):null;if(D){if(t.push({id:`mirror.sigstore.${R}`,status:N?.verified?"passed":"failed",message:N?.message||"Sigstore verification failed."}),Re.push({artifactId:R,verified:!!N?.verified,tlogVerified:!!N?.tlogVerified,identity:N?.identity||null,issuer:N?.issuer||null,rekorUrl:N?.rekorUrl||null,timestamp:new Date().toISOString(),environment:I}),!N?.verified)continue}else if(k){t.push({id:`mirror.sigstore.${R}`,status:"failed",message:`Sigstore attestation is required but missing for ${R}.`});continue}else t.push({id:`mirror.sigstore.${R}`,status:"skipped",message:`No Sigstore attestation provided for ${R}.`});if(D&&N?.verified&&j){let W=j.allowedIdentities||[];if(W.length>0){let re=!!N.identity&&W.includes(N.identity);if(t.push({id:`mirror.sigstore.policy.identity.${R}`,status:re?"passed":"failed",message:re?`Sigstore identity policy passed for ${R} in ${I}.`:`Sigstore identity policy failed for ${R} in ${I}.`}),!re)continue}let Ie=j.allowedIssuers||[];if(Ie.length>0){let re=!!N.issuer&&Ie.includes(N.issuer);if(t.push({id:`mirror.sigstore.policy.issuer.${R}`,status:re?"passed":"failed",message:re?`Sigstore issuer policy passed for ${R} in ${I}.`:`Sigstore issuer policy failed for ${R} in ${I}.`}),!re)continue}let xe=j.allowedRekorUrls||[];if(xe.length>0){let re=!!N.rekorUrl&&xe.includes(N.rekorUrl);if(t.push({id:`mirror.sigstore.policy.rekor.${R}`,status:re?"passed":"failed",message:re?`Sigstore Rekor policy passed for ${R} in ${I}.`:`Sigstore Rekor policy failed for ${R} in ${I}.`}),!re)continue}}else j&&t.push({id:`mirror.sigstore.policy.${R}`,status:"skipped",message:`Sigstore governance policy configured for ${I} but no verified Sigstore attestation for ${R}.`});let pe=await promises.stat(F);we.push({id:R,path:y.relative(e,F),sha256:S,size:pe.size,provenance:ce,attestation:{detached:{provided:!!L.attestation,verified:E?.verified||false,algorithm:E?.algorithm||null,publicKeyPath:E?.publicKeyPath||null,publicKeyFingerprint:E?.publicKeyFingerprint||null,signature:E?.signature||null,verifiedAt:E?.verified?new Date().toISOString():null},sigstore:{provided:!!D,verified:N?.verified||false,tlogVerified:N?.tlogVerified||false,identity:N?.identity||null,issuer:N?.issuer||null,rekorUrl:N?.rekorUrl||null,bundlePath:N?.bundlePath||null,certificatePath:N?.certificatePath||null,signaturePath:N?.signaturePath||null,verifiedAt:N?.verified?new Date().toISOString():null}}});}let ue=p.retention?.keepLast;if(typeof ue=="number"&&ue>0){let L=(await promises.readdir(s,{withFileTypes:true})).filter(R=>R.isFile()).map(R=>y.join(s,R.name));if(L.length>ue){let R=await Promise.all(L.map(async se=>({filePath:se,stat:await promises.stat(se)})));R.sort((se,F)=>F.stat.mtimeMs-se.stat.mtimeMs);let ne=R.slice(ue);for(let se of ne)await promises.unlink(se.filePath),r.rotatedFiles+=1;}}t.push({id:"mirror.rotate",status:"passed",message:r.rotatedFiles>0?`Mirror retention rotation removed ${r.rotatedFiles} file(s).`:"Mirror retention rotation completed with no removals."});let Ve={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:p.mode||null,environment:I,artifacts:we};if(await promises.writeFile(a,`${JSON.stringify(Ve,null,2)}
|
|
3501
|
+
`,"utf-8"),r.lockWritten=true,t.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${y.relative(e,a)}.`}),r.transparencyEvidenceRecords=Re.length,Re.length>0){let J={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:I,records:Re},L=new Date().toISOString().replace(/[:.]/g,"-"),R=y.join(c,`transparency-evidence-${L}.json`),ne=y.join(c,"transparency-evidence.latest.json");if(await _.ensureDir(c),await tr(R,J),await tr(ne,J),r.transparencyEvidenceWritten=true,t.push({id:"sigstore.evidence.write",status:"passed",message:`Transparency evidence written to ${y.relative(e,ne)}.`}),P?.enabled){let se=Math.max(1e3,P.timeoutMs??1e4);if(P.target==="file")if(!P.filePath)t.push({id:"sigstore.evidence.export.file",status:"failed",message:"Evidence export target=file requires security.evidenceExport.filePath."});else try{let F=be(e,P.filePath);await _.ensureDir(y.dirname(F)),await promises.appendFile(F,`${JSON.stringify(J)}
|
|
3502
|
+
`,"utf-8"),r.evidenceExported=true,r.evidenceExportTarget=F,t.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${F}.`});}catch(F){t.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${F.message}`});}else if(P.target==="http")if(!P.endpoint)t.push({id:"sigstore.evidence.export.http",status:"failed",message:"Evidence export target=http requires security.evidenceExport.endpoint."});else {let F=Math.max(0,P.retries??0),oe=Math.max(0,P.backoffMs??500),ce=Bn(J,P.signing);ce.error&&t.push({id:"sigstore.evidence.export.http",status:"failed",message:ce.error});try{let S=P.authTokenEnv?process.env[P.authTokenEnv]:void 0,E=false,D=null;for(let N=1;N<=F+1;N+=1)try{if(ce.error)throw new Error(ce.error);await Un(P.endpoint,J,se,S,ce.headers),r.evidenceExported=true,r.evidenceExportTarget=P.endpoint,t.push({id:"sigstore.evidence.export.http",status:"passed",message:N>1?`Transparency evidence exported to HTTP endpoint ${P.endpoint} after ${N} attempts.`:`Transparency evidence exported to HTTP endpoint ${P.endpoint}.`}),E=true;break}catch(pe){D=pe,N<=F&&await or(oe*N);}if(!E)throw D||new Error("unknown evidence export error")}catch(S){let E=`Evidence HTTP export failed: ${S.message}`;t.push({id:"sigstore.evidence.export.http",status:"failed",message:E});try{let D=await Vn(e,P.deadLetterPath,J,E);t.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${D}.`});}catch(D){t.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${D.message}`});}}}if(P.failOnError&&t.some(oe=>oe.status==="failed"&&(oe.id==="sigstore.evidence.export.file"||oe.id==="sigstore.evidence.export.http")))return {checks:t,details:r}}else t.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export not configured (security.evidenceExport.enabled=false)."});}else t.push({id:"sigstore.evidence.write",status:"skipped",message:"No Sigstore records available for transparency evidence output."}),t.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export skipped because no transparency evidence records exist."});return {checks:t,details:r}}function Zt(e){if(!e||typeof e!="object")return null;let o=e.code;return o==="PYTHON_NOT_FOUND"||o==="BRIDGE_VENV_BOOTSTRAP_FAILED"?o:null}function Xn(e){let o=e.trim().toLowerCase();return o?o.startsWith("fastapi")?"fastapi":o.startsWith("nestjs")?"nestjs":null:null}function Mt(e){let o=e.trim().toLowerCase();return o.startsWith("gofiber")||o==="go"||o==="go.standard"||o==="fiber"}function dt(e){let o=e.trim().toLowerCase();return o.startsWith("gogin")||o==="gin"}function pt(e,o){let t=e.indexOf(o);if(t>=0&&t+1<e.length)return e[t+1];let r=e.find(i=>i.startsWith(`${o}=`));if(r)return r.slice(o.length+1)}function kr(){return d$2()}function cr(){let e={...process.env},o=e.PATH||"";return o&&(e.PATH=o.split(y.delimiter).filter(t=>!t.replace(/\\/g,"/").includes("/.pyenv/shims")).join(y.delimiter)),e.PYENV_VERSION="system",e.POETRY_PYTHON||(e.POETRY_PYTHON=c$3()),e.RAPIDKIT_SKIP_LOCK_SYNC||(e.RAPIDKIT_SKIP_LOCK_SYNC="1"),e.POETRY_KEYRING_ENABLED||(e.POETRY_KEYRING_ENABLED="false"),e.PYTHON_KEYRING_BACKEND||(e.PYTHON_KEYRING_BACKEND="keyring.backends.null.Keyring"),e.POETRY_NO_INTERACTION||(e.POETRY_NO_INTERACTION="1"),e}function Zn(e){return f$1(y.join(e,".venv"))}async function es(e){for(let o of kr())if(await de(o,o==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],e)===0)return 0;return 1}async function lr(e){if(e[0]!=="create"||e[1]!=="project")return 1;let o=e[2],t=e[3];if(!o||!t)return process.stderr.write(`Usage: rapidkit create project gofiber.standard <name> [--output <dir>]
|
|
3503
|
+
`),1;let r=pt(e,"--output")||process.cwd(),i=y.resolve(r,t),n=e.includes("--skip-git")||e.includes("--no-git");try{let{default:a}=await import('fs-extra');if(await a.ensureDir(y.dirname(i)),await a.pathExists(i))return process.stderr.write(`\u274C Directory "${i}" already exists
|
|
3504
|
+
`),1;await a.ensureDir(i),await Kt(i,{project_name:t,module_path:t,skipGit:n});let s=B(process.cwd());if(s){let{syncWorkspaceProjects:c}=await import('./workspace-PIBFBNRA.js');await c(s,true);}return 0}catch(a){return process.stderr.write(`RapidKit Go/Fiber generator failed: ${a?.message??a}
|
|
3505
|
+
`),1}}async function dr(e){if(e[0]!=="create"||e[1]!=="project")return 1;let o=e[2],t=e[3];if(!o||!t)return process.stderr.write(`Usage: rapidkit create project gogin.standard <name> [--output <dir>]
|
|
3506
|
+
`),1;let r=pt(e,"--output")||process.cwd(),i=y.resolve(r,t),n=e.includes("--skip-git")||e.includes("--no-git");try{let{default:a}=await import('fs-extra');if(await a.ensureDir(y.dirname(i)),await a.pathExists(i))return process.stderr.write(`\u274C Directory "${i}" already exists
|
|
3507
|
+
`),1;await a.ensureDir(i),await Wt(i,{project_name:t,module_path:t,skipGit:n});let s=B(process.cwd());if(s){let{syncWorkspaceProjects:c}=await import('./workspace-PIBFBNRA.js');await c(s,true);}return 0}catch(a){return process.stderr.write(`RapidKit Go/Gin generator failed: ${a?.message??a}
|
|
3508
|
+
`),1}}async function eo(e,o){if(e.includes("--json"))return process.stderr.write("RapidKit (npm) offline fallback does not support --json for `create` commands.\nInstall Python 3.10+ and retry the same command.\n"),1;if(e[0]!=="create")return 1;if(e[1]!=="project")return process.stderr.write(`RapidKit (npm) could not run the Python core engine for \`create\`.
|
|
3509
|
+
Reason: ${o}.
|
|
3508
3510
|
Install Python 3.10+ to use the interactive wizard and full kit catalog.
|
|
3509
3511
|
`),1;let i=e[2],n=e[3];if(!i||!n)return process.stderr.write(`Usage: rapidkit create project <kit> <name> [--output <dir>]
|
|
3510
3512
|
Tip: offline fallback supports only fastapi* and nestjs* kits.
|
|
3511
|
-
`),1;let a=
|
|
3512
|
-
Reason: ${
|
|
3513
|
+
`),1;let a=Xn(i);if(!a)return process.stderr.write(`RapidKit (npm) could not run the Python core engine to create this kit.
|
|
3514
|
+
Reason: ${o}.
|
|
3513
3515
|
Requested kit: ${i}
|
|
3514
3516
|
Offline fallback only supports: fastapi.standard, nestjs.standard (and their shorthands).
|
|
3515
3517
|
Install Python 3.10+ to access all kits.
|
|
3516
|
-
`),1;let s=
|
|
3517
|
-
`),1;let
|
|
3518
|
-
`),1}}async function
|
|
3519
|
-
`),1;try{
|
|
3520
|
-
`),1;throw
|
|
3521
|
-
`),1;let
|
|
3522
|
-
`),1}try{if(e[0]==="create"&&e[1]==="project"){if(e.includes("--help")||e.includes("-h"))try{return await c$2(),await d$1(["create","project","--help"],{cwd:process.cwd()})}catch(
|
|
3518
|
+
`),1;let s=pt(e,"--output")||process.cwd(),c=y.resolve(s,n),d=e.includes("--skip-git")||e.includes("--no-git"),p=e.includes("--skip-install");try{if(await _.ensureDir(y.dirname(c)),await _.pathExists(c))return process.stderr.write(`\u274C Directory "${c}" already exists
|
|
3519
|
+
`),1;let u="pip",g=B(process.cwd());if(g)try{let{readWorkspaceMarker:h}=await import('./workspace-marker-IOPQ42A7.js'),f=await h(g);f?.metadata?.npm?.installMethod&&(u=f.metadata.npm.installMethod,a$1.debug(`Detected workspace engine: ${u}`));}catch(h){a$1.debug("Failed to read workspace marker",h);}else a$1.debug("No workspace found, using default engine: pip");if(await _.ensureDir(c),await ho(c,{project_name:n,template:a,kit_name:i,skipGit:d,skipInstall:p,engine:u}),g){let{syncWorkspaceProjects:h}=await import('./workspace-PIBFBNRA.js');await h(g,true);}return 0}catch(u){return process.stderr.write(`RapidKit (npm) offline fallback failed: ${u?.message??u}
|
|
3520
|
+
`),1}}async function br(e){let o=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]);if(e[0]==="create"&&(!e[1]||e[1].startsWith("-"))){let t=e.includes("--yes")||e.includes("-y"),r=e.slice(1),i;!process.stdin.isTTY||t?(i="workspace",process.stdin.isTTY&&console.log(l.gray("\u2139\uFE0F No subcommand provided for `create`; defaulting to `create workspace`."))):i=(await Se.prompt([{type:"rawlist",name:"createTarget",message:"What do you want to create?",choices:[{name:"workspace",value:"workspace"},{name:"project",value:"project"}]}])).createTarget;let n=["create",i,...r];return await br(n)}if(e[0]==="create"&&e[1]==="workspace")try{let t=e.includes("--yes")||e.includes("-y"),r=e.includes("--skip-git")||e.includes("--no-git"),i=e[2]&&!e[2].startsWith("-")?e[2]:void 0,n=pt(e,"--install-method"),a=n==="poetry"||n==="venv"||n==="pipx"?n:void 0,s=pt(e,"--profile"),c=s==="minimal"||s==="go-only"||s==="python-only"||s==="node-only"||s==="polyglot"||s==="enterprise"?s:void 0,d$1=i||(t?"my-workspace":(await Se.prompt([{type:"input",name:"workspaceName",message:"Workspace name:",default:"my-workspace"}])).workspaceName);if(!d$1||!d$1.trim())return process.stderr.write(`Workspace name is required.
|
|
3521
|
+
`),1;try{Ft(d$1);}catch(h){if(h instanceof d)return process.stderr.write(`${h.message}
|
|
3522
|
+
`),1;throw h}let p=y.resolve(process.cwd(),d$1);if(await _.pathExists(p))return process.stderr.write(`\u274C Directory "${d$1}" already exists
|
|
3523
|
+
`),1;let u=await a$2(),g=u.author||process.env.USER||"RapidKit User";if(!t){let h=await Se.prompt([{type:"input",name:"author",message:"Author name:",default:g}]);h.author?.trim()&&(g=h.author.trim());}return await h(d$1,{skipGit:r,yes:t,userConfig:{...u,author:g},installMethod:a,profile:c}),0}catch(t){return process.stderr.write(`RapidKit (npm) failed to create workspace: ${t?.message??t}
|
|
3524
|
+
`),1}try{if(e[0]==="create"&&e[1]==="project"){if(e.includes("--help")||e.includes("-h"))try{return await c$2(),await d$1(["create","project","--help"],{cwd:process.cwd()})}catch(f){return process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${f?.message??f}
|
|
3523
3525
|
`),1}if(!e[2]||e[2].startsWith("-")){console.log(l.bold(`
|
|
3524
3526
|
\u{1F680} RapidKit
|
|
3525
|
-
`));let{kitChoice:
|
|
3526
|
-
`),a.debug(`Synced Python version ${
|
|
3527
|
-
`),1)}}if(e[0]==="create"&&e[1]!=="project")try{await c$2();let t=await d$1(e,{cwd:process.cwd()});if(t===0){let
|
|
3528
|
-
`),1)}return await c$2(),await d$1(e,{cwd:process.cwd()})}catch(t){let
|
|
3529
|
-
`),1)}}var
|
|
3530
|
-
|
|
3531
|
-
|
|
3532
|
-
`
|
|
3533
|
-
`
|
|
3534
|
-
|
|
3535
|
-
|
|
3536
|
-
`
|
|
3537
|
-
|
|
3538
|
-
`)
|
|
3539
|
-
`)
|
|
3540
|
-
`)
|
|
3541
|
-
|
|
3527
|
+
`));let{kitChoice:f}=await Se.prompt([{type:"rawlist",name:"kitChoice",message:"Select a kit to scaffold:",choices:[{name:"fastapi \u2014 FastAPI Standard Kit",value:"fastapi.standard"},{name:"fastapi \u2014 FastAPI DDD Kit",value:"fastapi.ddd"},{name:"nestjs \u2014 NestJS Standard Kit",value:"nestjs.standard"},{name:"go/fiber \u2014 Go Fiber Standard Kit",value:"gofiber.standard"},{name:"go/gin \u2014 Go Gin Standard Kit",value:"gogin.standard"}]}]);if(Mt(f)||dt(f)){let{projectName:k}=await Se.prompt([{type:"input",name:"projectName",message:"Project name:",validate:A=>A.trim().length>0||"Project name is required"}]),O=e.slice(2).filter(A=>A.startsWith("-"));return dt(f)?await dr(["create","project",f,k.trim(),...O]):await lr(["create","project",f,k.trim(),...O])}let{projectName:m}=await Se.prompt([{type:"input",name:"projectName",message:"Project name:",validate:k=>k.trim().length>0||"Project name is required"}]);e.splice(2,0,f,m.trim());}{let f=B(process.cwd()),m=(e[2]||"").toLowerCase();if(f&&m){let k=y.join(f,".rapidkit","workspace.json"),O=y.join(f,".rapidkit","policies.yml");try{let[A,P]=await Promise.all([_.pathExists(k).then(ue=>ue?b$2.promises.readFile(k,"utf-8"):"{}"),_.pathExists(O).then(ue=>ue?b$2.promises.readFile(O,"utf-8"):"")]),I=JSON.parse(A).profile,j=P.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]??"warn",M=Mt(m)||dt(m)||m.startsWith("go"),Re=["nestjs","react","vue","nextjs","next","vite","angular","svelte","express","koa","fastify"].some(ue=>m.includes(ue)),Ze=!M&&!Re,we=null;if(I==="python-only"&&!Ze?we=`Kit "${m}" is not a Python kit, but workspace profile is "python-only".`:I==="node-only"&&!Re?we=`Kit "${m}" is not a Node kit, but workspace profile is "node-only".`:I==="go-only"&&!M&&(we=`Kit "${m}" is not a Go kit, but workspace profile is "go-only".`),we){if(j==="strict")return console.log(l.red(`\u274C Profile violation (strict mode): ${we}`)),console.log(l.gray("\u{1F4A1} Change workspace profile or use --no-workspace to skip enforcement.")),1;console.log(l.yellow(`\u26A0\uFE0F Profile warning: ${we}`)),console.log(l.gray('\u{1F4A1} Consider using a "polyglot" workspace profile for multi-language projects.'));}}catch{}}}if(Mt(e[2]||""))return await lr(e);if(dt(e[2]||""))return await dr(e);let r=e.includes("--create-workspace"),i$1=e.includes("--no-workspace"),n=e.includes("--yes")||e.includes("-y"),a=e.includes("--skip-git")||e.includes("--no-git");if(!!!ro(process.cwd())){if(r)await i(process.cwd(),{skipGit:a,yes:n,userConfig:await a$2()});else if(!i$1)if(n)await i(process.cwd(),{skipGit:a,yes:true,userConfig:await a$2()});else {let{createWs:f}=await Se.prompt([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);f&&await i(process.cwd(),{skipGit:a,yes:false,userConfig:await a$2()});}}let d=[...e.filter(f=>{let m=f.split("=")[0];return !o.has(f)&&!o.has(m)})],p=B(process.cwd()),h=e.includes("--skip-install")||!!p?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0;try{await c$2();let f=await d$1(d,{cwd:process.cwd(),env:h});if(f===0&&p&&!e.includes("--skip-install")&&(console.log(l.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(l.white(" Next: cd <project-name> && npx rapidkit init"))),f===0){let m=p||B(process.cwd());if(m){try{let O=e[3];if(O){let A=e.indexOf("--output"),P=A>=0?e[A+1]:".",I=y.resolve(process.cwd(),P,O),K=y.join(m,".python-version"),j=y.join(I,".python-version");if(b$2.existsSync(K)&&b$2.existsSync(I)){let M=b$2.readFileSync(K,"utf-8");b$2.writeFileSync(j,M.trim()+`
|
|
3528
|
+
`),a$1.debug(`Synced Python version ${M.trim()} from workspace to ${O}`);}}}catch(O){a$1.debug("Could not sync Python version from workspace:",O);}let{syncWorkspaceProjects:k}=await import('./workspace-PIBFBNRA.js');await k(m,true);}}return f}catch(f){let m=Zt(f);return m?await eo(d,m):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${f?.message??f}
|
|
3529
|
+
`),1)}}if(e[0]==="create"&&e[1]!=="project")try{await c$2();let t=await d$1(e,{cwd:process.cwd()});if(t===0){let r=B(process.cwd());if(r){let{syncWorkspaceProjects:i}=await import('./workspace-PIBFBNRA.js');await i(r,true);}}return t}catch(t){let r=Zt(t);return r?await eo(e,r):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${t?.message??t}
|
|
3530
|
+
`),1)}return await c$2(),await d$1(e,{cwd:process.cwd()})}catch(t){let r=Zt(t);return r?await eo(e,r):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${t?.message??t}
|
|
3531
|
+
`),1)}}var pr=["init","dev","start","build","test","docs","lint","format","create","help","--help","-h"],ts=["doctor","workspace","bootstrap","setup","cache","mirror","ai","config","shell"],os=["doctor","workspace","ai","config","shell"],rs=["bootstrap","setup","cache","mirror"],Rr=["lint","format","docs"],_r=["build","dev","start","test"],ur=[..._r,...Rr];function Lt(e){return !!e&&ts.includes(e)}function gr(e){return !!e&&os.includes(e)}function is(e){return !!e&&rs.includes(e)}function Cr(e){return b$2.existsSync(y.join(e,".rapidkit-workspace"))||b$2.existsSync(y.join(e,".rapidkit","workspace.json"))}function Sr(e){let o=e;for(;;){let t=y.join(o,".rapidkit","context.json");if(b$2.existsSync(t))return t;let r=y.dirname(o);if(r===o)break;o=r;}return null}function ro(e){let o=e;for(;;){let t=y.join(o,".rapidkit-workspace");if(b$2.existsSync(t))return t;let r=y.dirname(o);if(r===o)break;o=r;}return null}function B(e){let o=e;for(;;){let t=y.join(o,".rapidkit-workspace");if(b$2.existsSync(t))return o;let r=y.dirname(o);if(r===o)break;o=r;}return null}function ns(e){let o=e;for(;;){let t=y.join(o,".rapidkit-workspace"),r=y.join(o,".rapidkit","workspace.json");if(!b$2.existsSync(t)&&b$2.existsSync(r))return o;let i=y.dirname(o);if(i===o)break;o=i;}return null}var xr={enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true};function ss(e){return e&&e.match(/^[\t ]*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}function lt(e,o){let t=e.match(new RegExp(`^[\\t ]*${o}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return t?t[1]==="true":xr[o]}function mr(e){let o=e??"";return {mode:ss(o),dependency_sharing_mode:Pr(o),rules:{enforce_workspace_marker:lt(o,"enforce_workspace_marker"),enforce_toolchain_lock:lt(o,"enforce_toolchain_lock"),disallow_untrusted_tool_sources:lt(o,"disallow_untrusted_tool_sources"),enforce_compatibility_matrix:lt(o,"enforce_compatibility_matrix"),require_mirror_lock_for_offline:lt(o,"require_mirror_lock_for_offline")}}}function fr(e,o,t){let r=`${o}: ${t}`,i=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=new RegExp(`^[\\t ]*${i}:\\s*.*$`,"m");if(n.test(e))return e.replace(n,r);let a=/^[\t ]*rules:\s*(?:#.*)?$/m;return a.test(e)?e.replace(a,`${r}
|
|
3532
|
+
rules:`):`${e.endsWith(`
|
|
3533
|
+
`)?e:`${e}
|
|
3534
|
+
`}${r}
|
|
3535
|
+
`}function as(e,o,t){let r=` ${o}: ${t?"true":"false"}`,i=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=new RegExp(`^[\\t ]+${i}:\\s*.*$`,"m");if(n.test(e))return e.replace(n,r);let a=/^[\t ]*rules:\s*(?:#.*)?$/m;return a.test(e)?e.replace(a,`rules:
|
|
3536
|
+
${r}`):`${e.endsWith(`
|
|
3537
|
+
`)?e:`${e}
|
|
3538
|
+
`}rules:
|
|
3539
|
+
${r}
|
|
3540
|
+
`}function cs(){return ['version: "1.0"','mode: warn # "warn" or "strict"','dependency_sharing_mode: isolated # "isolated" or "shared-runtime-caches" or "shared-node-deps"',"# change profile (recommended): npx rapidkit bootstrap --profile polyglot","# change mode/dependency manually: edit this file and rerun npx rapidkit init","rules:"," enforce_workspace_marker: true"," enforce_toolchain_lock: false"," disallow_untrusted_tool_sources: false"," enforce_compatibility_matrix: false"," require_mirror_lock_for_offline: true",""].join(`
|
|
3541
|
+
`)}async function hr(e){let o=y.join(e,".rapidkit","policies.yml");return await _.pathExists(o)?b$2.promises.readFile(o,"utf-8"):cs()}async function ls(e,o){let t=y.join(e,".rapidkit"),r=y.join(t,"policies.yml");await _.ensureDir(t);let i=o.endsWith(`
|
|
3542
|
+
`)?o:`${o}
|
|
3543
|
+
`;await b$2.promises.writeFile(r,i,"utf-8");}function ds(e){let o=e.trim().toLowerCase();return o==="true"||o==="1"||o==="on"?true:o==="false"||o==="0"||o==="off"?false:null}function Pr(e){if(!e)return "isolated";let t=e.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();return t==="shared-runtime-caches"||t==="shared-node-deps"||t==="isolated"?t:"isolated"}function Er(e){if(!e)return {mode:"isolated",status:"skipped",message:"No policies.yml found; dependency_sharing_mode defaults to isolated."};let o=e.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m);if(!o)return {mode:"isolated",status:"skipped",message:"dependency_sharing_mode is not set; defaulting to isolated."};let t=o[1].toLowerCase();return t==="isolated"||t==="shared-runtime-caches"||t==="shared-node-deps"?{mode:t,status:"passed",message:`dependency_sharing_mode is valid: ${t}.`}:{mode:"isolated",status:"failed",message:`Invalid dependency_sharing_mode: ${t}. Use one of: isolated, shared-runtime-caches, shared-node-deps.`}}async function Ir(e,o){let t=B(e),r=t?y.join(t,".rapidkit","policies.yml"):null,i="isolated";if(r&&await _.pathExists(r))try{let s=await b$2.promises.readFile(r,"utf-8"),c=Er(s);if(c.status==="failed")return console.log(l.red(`\u274C ${c.message}`)),{ok:false,code:1};i=c.mode;}catch{return console.log(l.red("\u274C Failed to read workspace policy file (.rapidkit/policies.yml).")),{ok:false,code:1}}let n=process.env.RAPIDKIT_DEP_SHARING_MODE,a=process.env.RAPIDKIT_WORKSPACE_PATH;process.env.RAPIDKIT_DEP_SHARING_MODE=i,t&&(process.env.RAPIDKIT_WORKSPACE_PATH=t);try{return {ok:true,value:await o()}}finally{typeof n>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=n,typeof a>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=a;}}async function de(e,o,t){return await new Promise(r=>{let i=spawn(e,o,{stdio:"inherit",cwd:t,shell:b$3()});i.on("close",n=>r(n??1)),i.on("error",()=>r(1));})}async function Xe(e,o){await _.outputFile(e,`${JSON.stringify(o,null,2)}
|
|
3544
|
+
`,"utf-8");}async function ps(e){let o=new Set(["go-only"]);try{let r=y.join(e,".rapidkit","workspace.json"),i=JSON.parse(await b$2.promises.readFile(r,"utf-8"));if(o.has(i.profile??""))return 0}catch{}let t="poetry";try{let{readWorkspaceMarker:r}=await import('./workspace-marker-IOPQ42A7.js'),n=(await r(e))?.metadata?.npm?.installMethod;(n==="poetry"||n==="venv"||n==="pipx"||n==="pip")&&(t=n);}catch{}if(t==="poetry"||t==="venv"){let r=y.join(e,"pyproject.toml"),i=false;try{i=(await b$2.promises.readFile(r,"utf-8")).includes("rapidkit-core");}catch{i=false;}let n=process.env.RAPIDKIT_DEV_PATH,a=n?await _.pathExists(n):false;if(i){let s=Zn(e);if(!await _.pathExists(s)){let p=await es(e);if(p!==0)return p}let d=await de(s,a&&n?["-m","pip","install",n,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"],e);if(d!==0)return d}else {let s=await de("poetry",["install","--no-root"],e);if(s!==0)return s;let c=await de("poetry",["add","rapidkit-core"],e);if(c!==0)return c}try{let{writeWorkspaceLauncher:s}=await import('./create-PELQEDCF.js');await s(e,"poetry");}catch{}return 0}return 0}async function Tr(e){let o=await b$2.promises.readdir(e,{withFileTypes:true}),t=[];for(let r of o){if(!r.isDirectory()||r.name.startsWith("."))continue;let i=y.join(e,r.name),n=y.join(i,".rapidkit","context.json"),a=y.join(i,".rapidkit","project.json");(await _.pathExists(n)||await _.pathExists(a))&&t.push(i);}return t}function us(e){let o="my-workspace",t=1;for(;;){let r=t===1?o:`${o}-${t}`,i=y.join(e,r);if(!b$2.existsSync(i))return {name:r,targetPath:i};t+=1;}}async function to(e){return (await Fe("go",{runCommandInCwd:de,runCoreRapidkit:d$1}).initProject(e)).exitCode}async function Ue(e,o){let t=Fe("node",{runCommandInCwd:de,runCoreRapidkit:d$1});return e==="init"?(await t.initProject(o)).exitCode:e==="dev"?(await t.runDev(o)).exitCode:e==="test"?(await t.runTest(o)).exitCode:e==="build"?(await t.runBuild(o)).exitCode:(await t.runStart(o)).exitCode}async function gs(e,o=io){let t=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof t>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let n=function(S){if(!S)return null;let E=S.trim().toLowerCase();return E==="minimal"||E==="go-only"||E==="python-only"||E==="node-only"||E==="polyglot"||E==="enterprise"?E:null},a=function(S){let N=S.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",pe=(W,Ie)=>{let xe=S.match(new RegExp(`^\\s*${W}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return xe?xe[1].toLowerCase()==="true":Ie};return {mode:N,dependency_sharing_mode:Pr(S),rules:{enforce_workspace_marker:pe("enforce_workspace_marker",true),enforce_toolchain_lock:pe("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:pe("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:pe("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:pe("require_mirror_lock_for_offline",true)}}};let s=["init"],c,d=false,p=false,u=false;for(let S=1;S<e.length;S+=1){let E=e[S];if(E==="--ci"){d=true;continue}if(E==="--offline"){p=true;continue}if(E==="--json"){u=true;continue}if(E==="--profile"){let D=e[S+1];if(!D||D.startsWith("-"))return console.log(l.yellow("Usage: rapidkit bootstrap [path] [--profile <minimal|go-only|python-only|node-only|polyglot|enterprise>] [--ci] [--offline] [--json]")),1;c=D,S+=1;continue}if(E.startsWith("--profile=")){c=E.slice(10);continue}s.push(E);}let g=n(c);if(c&&!g)return console.log(l.red(`Invalid profile: ${c}. Use one of: minimal, go-only, python-only, node-only, polyglot, enterprise.`)),1;let h=process.cwd(),f$1=B(h);f$1||(f$1=ns(h));let m=[],k=null,O=null;if(f$1)try{let S=y.join(f$1,".rapidkit","workspace.json"),E=await b$2.promises.readFile(S,"utf-8"),D=JSON.parse(E);O=n(D.profile);}catch{O=null;}let A=["minimal","python-only","node-only","go-only","polyglot","enterprise"],P={minimal:"minimal \u2014 Foundation files only (fastest bootstrap, mixed projects)","python-only":"python-only \u2014 Python + Poetry (FastAPI, Django, ML pipelines)","node-only":"node-only \u2014 Node.js runtime (NestJS, Express, Next.js)","go-only":"go-only \u2014 Go runtime (Fiber, Gin, gRPC, microservices)",polyglot:"polyglot \u2014 Python + Node.js + Go multi-runtime workspace",enterprise:"enterprise \u2014 Polyglot + governance + Sigstore verification"},I=g;if(!!f$1&&!g&&!d&&!u&&!!process.stdin.isTTY&&!!process.stdout.isTTY){let S=O||"minimal",{chosenProfile:E}=await Se.prompt([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${S})`,choices:A.map(D=>({name:D===S?`${P[D]} \u2190 current`:P[D],value:D})),default:A.indexOf(S)}]);I=E;}let j=I||O||"minimal";if(f$1)try{let E=j==="python-only"||j==="polyglot"||j==="enterprise"?"poetry":"venv",D;try{let W=(await b$2.promises.readFile(y.join(f$1,".python-version"),"utf-8")).trim();W&&(D=W);}catch{}let N=await f(f$1,{workspaceName:y.basename(f$1),installMethod:E,pythonVersion:D,profile:j,writeMarker:true,writeGitignore:true,onlyIfMissing:true});m.push({id:"workspace.legacy.sync",status:N.length>0?"passed":"skipped",message:N.length>0?`Legacy workspace foundation synchronized: ${N.join(", ")}`:"Workspace foundation files are already up to date."});}catch(S){m.push({id:"workspace.legacy.sync",status:"failed",message:`Failed to synchronize legacy workspace foundation files: ${S.message}`});}if(f$1&&I&&I!==O)try{let S=y.join(f$1,".rapidkit","workspace.json"),E=await b$2.promises.readFile(S,"utf-8"),D=JSON.parse(E);D.profile=I,await b$2.promises.writeFile(S,JSON.stringify(D,null,2)+`
|
|
3545
|
+
`,"utf-8");}catch{}let M={mode:"warn",dependency_sharing_mode:"isolated",rules:{enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true}},Re=null;if(f$1)try{let S=await b$2.promises.readFile(y.join(f$1,".rapidkit","policies.yml"),"utf-8");Re=S,M=a(S);}catch{m.push({id:"policy.file",status:"skipped",message:"No workspace policy file found; using default bootstrap policy."});}else m.push({id:"workspace.detect",status:"skipped",message:"No workspace marker found; bootstrap runs in project/single-path mode."});if(f$1){let S=Er(Re);M.dependency_sharing_mode=S.mode,m.push({id:"policy.schema.dependency_sharing_mode",status:S.status,message:S.message}),m.push({id:"policy.dependency_sharing_mode.effective",status:"passed",message:M.dependency_sharing_mode==="isolated"?"Effective dependency mode: isolated (default secure mode).":M.dependency_sharing_mode==="shared-node-deps"?"Effective dependency mode: shared-node-deps (Node projects share workspace-level caches).":"Effective dependency mode: shared-runtime-caches (Node/Python/Go share workspace-level caches)."});let E=b$2.existsSync(y.join(f$1,".rapidkit-workspace"));m.push({id:"policy.enforce_workspace_marker",status:!M.rules.enforce_workspace_marker||E?"passed":"failed",message:!M.rules.enforce_workspace_marker||E?"Workspace marker policy satisfied.":"Workspace marker policy failed: .rapidkit-workspace is missing."});let D=b$2.existsSync(y.join(f$1,".rapidkit","toolchain.lock"));m.push({id:"policy.enforce_toolchain_lock",status:!M.rules.enforce_toolchain_lock||D?"passed":"failed",message:!M.rules.enforce_toolchain_lock||D?"Toolchain lock policy satisfied.":"Toolchain lock policy failed: .rapidkit/toolchain.lock is missing."});let N=process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||b$2.existsSync(y.join(f$1,".rapidkit","trusted-sources.lock"));m.push({id:"policy.disallow_untrusted_tool_sources",status:!M.rules.disallow_untrusted_tool_sources||N?"passed":"failed",message:!M.rules.disallow_untrusted_tool_sources||N?"Trusted tool sources policy satisfied.":"Trusted tool sources policy failed: set RAPIDKIT_TRUSTED_SOURCES=1 or provide .rapidkit/trusted-sources.lock."});let pe=y.join(f$1,".rapidkit","compatibility-matrix.json"),W=b$2.existsSync(pe),Ie=M.rules.enforce_compatibility_matrix;if(m.push({id:"policy.enforce_compatibility_matrix",status:!Ie||W?"passed":"failed",message:!Ie||W?"Compatibility matrix policy satisfied.":"Compatibility matrix policy failed: .rapidkit/compatibility-matrix.json is missing."}),W)try{let q=await b$2.promises.readFile(pe,"utf-8"),z=JSON.parse(q),gt=!!z&&typeof z=="object";m.push({id:"compatibility.matrix.parse",status:gt?"passed":"failed",message:gt?"Compatibility matrix parsed successfully.":"Compatibility matrix parse failed: invalid JSON object."});}catch{m.push({id:"compatibility.matrix.parse",status:"failed",message:"Compatibility matrix parse failed: invalid JSON."});}let xe=y.join(f$1,".rapidkit","mirror-config.json"),re=y.join(f$1,".rapidkit","mirror.lock"),Te=b$2.existsSync(xe),Pe=b$2.existsSync(re),ut={};if(Te)try{ut=JSON.parse(await b$2.promises.readFile(xe,"utf-8")),m.push({id:"mirror.config.parse",status:"passed",message:"Mirror configuration parsed successfully."});}catch{m.push({id:"mirror.config.parse",status:"failed",message:"Mirror configuration parse failed: invalid JSON in .rapidkit/mirror-config.json."});}let Gt=await Xt(f$1,{ciMode:d,offlineMode:p});if(m.push(...Gt.checks.map(q=>({id:q.id,status:q.status,message:q.message}))),k=Gt.details,Gt.details.lockWritten&&(Pe=true),p){let q=process.env.RAPIDKIT_MIRROR_ENABLED==="1"||ut.enabled===true;m.push({id:"offline.mirror.enabled",status:q?"passed":"failed",message:q?"Offline mode mirror is enabled.":'Offline mode requires mirror enablement (set RAPIDKIT_MIRROR_ENABLED=1 or .rapidkit/mirror-config.json {"enabled": true}).'});let z=M.rules.require_mirror_lock_for_offline;m.push({id:"offline.mirror.lock",status:!z||Pe?"passed":"failed",message:!z||Pe?"Offline mode mirror lock policy satisfied.":"Offline mode mirror lock policy failed: .rapidkit/mirror.lock is missing."});}else m.push({id:"offline.mirror.enabled",status:"skipped",message:"Offline mirror checks skipped (offline mode is disabled)."});let Ar=await Tr(f$1),le=new Set;for(let q of Ar){let z=Ne(q);if(me(z,q)){le.add("go");continue}if(fe(z,q)){le.add("node");continue}if(he(z,q)){le.add("python");continue}le.add("unknown");}if(j==="go-only"){let q=le.size===0||[...le].every(z=>z==="go");m.push({id:"profile.go-only",status:q?"passed":"failed",message:q?"go-only profile validated for discovered projects.":`go-only profile mismatch: detected runtimes [${[...le].join(", ")}].`});}else if(j==="python-only"){let q=le.size===0||[...le].every(z=>z==="python");m.push({id:"profile.python-only",status:q?"passed":"failed",message:q?"python-only profile validated for discovered projects.":`python-only profile mismatch: detected runtimes [${[...le].join(", ")}].`});}else if(j==="node-only"){let q=le.size===0||[...le].every(z=>z==="node");m.push({id:"profile.node-only",status:q?"passed":"failed",message:q?"node-only profile validated for discovered projects.":`node-only profile mismatch: detected runtimes [${[...le].join(", ")}].`});}else if(j==="minimal"){let q=[...le].filter(gt=>gt!=="unknown"),z=q.length<=1;m.push({id:"profile.minimal",status:z?"passed":"failed",message:z?"minimal profile is compatible with detected runtime mix.":`minimal profile mismatch: multiple runtimes detected [${q.join(", ")}].`});}else j==="enterprise"&&(m.push({id:"profile.enterprise.ci",status:d?"passed":"failed",message:d?"enterprise profile running with --ci.":"enterprise profile expects --ci for deterministic non-interactive mode."}),m.push({id:"profile.enterprise.compatibility-matrix",status:W?"passed":"failed",message:W?"enterprise profile has compatibility matrix.":"enterprise profile requires .rapidkit/compatibility-matrix.json."}),m.push({id:"profile.enterprise.mirror-config",status:Te?"passed":"failed",message:Te?"enterprise profile has mirror configuration.":"enterprise profile requires .rapidkit/mirror-config.json."}));}d&&(process.env.RAPIDKIT_BOOTSTRAP_CI="1"),p&&(process.env.RAPIDKIT_OFFLINE_MODE="1");let we=m.some(S=>S.id.startsWith("policy.schema.")&&S.status==="failed")||M.mode==="strict"&&m.some(S=>S.status==="failed"),ue=f$1||h,Ve=y.join(ue,".rapidkit","reports"),J=new Date().toISOString().replace(/[:.]/g,"-"),L=y.join(Ve,`bootstrap-compliance-${J}.json`),R=y.join(Ve,"bootstrap-compliance.latest.json"),ne={command:"bootstrap",timestamp:new Date().toISOString(),workspacePath:f$1,profile:j,options:{ci:d,offline:p,strict:M.mode==="strict"},policyMode:M.mode,policyRules:M.rules,mirrorLifecycle:k,checks:m};if(we){let S={...ne,result:"blocked",initExitCode:null};return await _.ensureDir(Ve),await Xe(L,S),await Xe(R,S),u?process.stdout.write(`${JSON.stringify(S,null,2)}
|
|
3546
|
+
`):(console.log(l.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(l.gray(`Compliance report: ${L}`))),1}let se=0;u||(se=await o(s));let F=m.filter(S=>S.status==="failed").length,oe=se!==0?"failed":F>0?"ok_with_warnings":"ok",ce={...ne,result:oe,initExitCode:se};if(await _.ensureDir(Ve),await Xe(L,ce),await Xe(R,ce),u)process.stdout.write(`${JSON.stringify(ce,null,2)}
|
|
3547
|
+
`);else {let S=m.filter(E=>E.status==="failed").length;S>0&&console.log(l.yellow(`\u26A0\uFE0F Bootstrap completed with ${S} policy/profile warnings.`)),console.log(l.gray(`Compliance report: ${L}`));}return se}finally{typeof t>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=t;}}async function ms(e){let o=(e[1]||"").toLowerCase(),t=e.includes("--warm-deps")||e.includes("--warm-dependencies");if(!o||!["python","node","go"].includes(o))return console.log(l.yellow("Usage: rapidkit setup <python|node|go> [--warm-deps]")),1;let r=async(d,p)=>{if(d==="node"){if(!b$2.existsSync(y.join(p,"package.json")))return {exitCode:0,message:"Node warm-up skipped: package.json not found in current directory."};let g=b$2.existsSync(y.join(p,"pnpm-lock.yaml")),h=b$2.existsSync(y.join(p,"yarn.lock"));return g?{exitCode:await de("pnpm",["install","--lockfile-only","--ignore-scripts"],p)}:h?{exitCode:await de("yarn",["install","--ignore-scripts"],p)}:{exitCode:await de("npm",["install","--package-lock-only","--ignore-scripts"],p)}}return d==="go"?b$2.existsSync(y.join(p,"go.mod"))?{exitCode:await de("go",["mod","download"],p)}:{exitCode:0,message:"Go warm-up skipped: go.mod not found in current directory."}:{exitCode:0,message:"Dependency warm-up currently applies to node/go runtimes."}},i=Fe(o,{runCommandInCwd:de,runCoreRapidkit:(d,p)=>d$1(d,{...p,cwd:void 0})}),n=await i.checkPrereqs(),a=await i.doctorHints(process.cwd()),s=B(process.cwd()),c=s||process.cwd();if(n.exitCode===0){console.log(l.green(`\u2705 ${o} prerequisites look good.`));let d=["python","node","go"].filter(p=>p!==o).join("/");if(console.log(l.gray(` Scope: validated ${o} runtime only. ${d} checks are optional unless your workspace profile uses them.`)),o==="python"&&console.log(l.gray(" Note: Poetry is recommended, but venv/pipx-based flows are supported in workspace creation.")),i.warmSetupCache&&((await i.warmSetupCache(c)).exitCode===0?console.log(l.gray(` ${o} cache warm-up completed.`)):console.log(l.yellow(` ${o} cache warm-up skipped (non-fatal).`))),t){let p=await r(o,c),u=/skipped/i.test(p.message||"");p.message&&console.log(l.gray(` ${p.message}`)),p.exitCode===0&&!u?console.log(l.gray(` ${o} dependency warm-up completed (--warm-deps).`)):p.exitCode!==0&&console.log(l.yellow(` ${o} dependency warm-up failed (non-fatal).`));}if(s)try{let p=y.join(s,".rapidkit","toolchain.lock"),u={};try{u=JSON.parse(await b$2.promises.readFile(p,"utf-8"));}catch{}(!u.runtime||typeof u.runtime!="object")&&(u.runtime={});let g=u.runtime;if(o==="python"){let h=null;try{let{execa:f}=await import('execa');for(let m of kr()){let O=await f(m,m==="py"?["-3","--version"]:["--version"],{cwd:s,stdio:"pipe",reject:false,timeout:3e3});if(O.exitCode===0){let P=(O.stdout||O.stderr||"").match(/Python\s+(\S+)/);if(h=P?P[1]:null,h)break}}}catch{}g.python={...g.python||{},version:h,last_setup:new Date().toISOString()};}else if(o==="node")g.node={...g.node||{},version:process.version,last_setup:new Date().toISOString()};else if(o==="go"){let h=null;try{let{execa:f}=await import('execa'),k=((await f("go",["version"],{cwd:s,stdio:"pipe"})).stdout||"").match(/go(\d+\.\d+(?:\.\d+)?)/i);h=k?k[1]:null;}catch{}g.go={...g.go||{},version:h,last_setup:new Date().toISOString()};}u.updated_at=new Date().toISOString(),await b$2.promises.writeFile(p,JSON.stringify(u,null,2)+`
|
|
3548
|
+
`,"utf-8"),console.log(l.gray(" toolchain.lock updated (.rapidkit/toolchain.lock)"));}catch{}}else console.log(l.red(`\u274C ${o} prerequisites check failed.`));if(a.length>0){console.log(l.gray(`
|
|
3549
|
+
Hints:`));for(let d of a)console.log(l.gray(`- ${d}`));}return n.exitCode}function fs(e){let o={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};for(let t of e.split(`
|
|
3550
|
+
`)){let r=t.trim(),i=r.match(/^strategy:\s*(\S+)/);i&&(o.strategy=i[1].replace(/['"]]/g,""));let n=r.match(/^prune_on_bootstrap:\s*(true|false)/);n&&(o.prune_on_bootstrap=n[1]==="true");let a=r.match(/^self_heal:\s*(true|false)/);a&&(o.self_heal=a[1]==="true");let s=r.match(/^verify_integrity:\s*(true|false)/);s&&(o.verify_integrity=s[1]==="true");}return o}async function hs(e){let o=(e[1]||"status").toLowerCase(),t=jt.getInstance(),r=B(process.cwd()),i={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};if(r)try{let n=await b$2.promises.readFile(y.join(r,".rapidkit","cache-config.yml"),"utf-8");i=fs(n);}catch{}return o==="status"?(console.log(l.cyan("RapidKit cache is enabled")),console.log(l.cyan("RapidKit cache status")),r?(console.log(l.gray(` Workspace: ${r}`)),console.log(l.gray(` Strategy: ${i.strategy}`)),console.log(l.gray(` Self-heal: ${i.self_heal}`)),console.log(l.gray(` Prune on bootstrap:${i.prune_on_bootstrap}`)),console.log(l.gray(` Verify integrity: ${i.verify_integrity}`))):console.log(l.gray(" (not inside a workspace \u2014 showing in-memory cache only)")),console.log(l.gray(" In-memory cache: enabled")),console.log(l.gray(" Use: rapidkit cache clear|prune|repair")),0):o==="clear"?(await t.clear(),console.log(l.green("Cache clear completed")),console.log(l.green("\u2705 Cache cleared (all entries removed).")),0):o==="prune"?(await t.clear(),console.log(l.green("\u2705 Cache pruned (stale entries removed).")),i.prune_on_bootstrap||console.log(l.gray(" Tip: set prune_on_bootstrap: true in .rapidkit/cache-config.yml to auto-prune on every bootstrap.")),0):o==="repair"?i.self_heal?(await t.clear(),console.log(l.green("\u2705 Cache repaired (self-heal applied, stale entries evicted).")),i.verify_integrity&&console.log(l.gray(" Integrity verification is enabled in cache-config.yml.")),0):(console.log(l.yellow("\u26A0\uFE0F self_heal is disabled in .rapidkit/cache-config.yml \u2014 skipping repair.")),0):(console.log(l.yellow("Usage: rapidkit cache <status|clear|prune|repair>")),1)}async function ys(e,o,t,r){let i=(o||"show").toLowerCase(),n=y.join(e,".rapidkit","policies.yml");if(i==="show"||i==="status"||i==="get"){let p=await hr(e),u=mr(p);return console.log(l.cyan(`Policy file: ${n}`)),console.log(l.gray(` mode: ${u.mode}`)),console.log(l.gray(` dependency_sharing_mode: ${u.dependency_sharing_mode}`)),console.log(l.gray(" rules:")),console.log(l.gray(` enforce_workspace_marker: ${u.rules.enforce_workspace_marker}`)),console.log(l.gray(` enforce_toolchain_lock: ${u.rules.enforce_toolchain_lock}`)),console.log(l.gray(` disallow_untrusted_tool_sources: ${u.rules.disallow_untrusted_tool_sources}`)),console.log(l.gray(` enforce_compatibility_matrix: ${u.rules.enforce_compatibility_matrix}`)),console.log(l.gray(` require_mirror_lock_for_offline: ${u.rules.require_mirror_lock_for_offline}`)),console.log(l.gray("Examples:")),console.log(l.gray(" npx rapidkit workspace policy set mode strict")),console.log(l.gray(" npx rapidkit workspace policy set dependency_sharing_mode shared-runtime-caches")),console.log(l.gray(" npx rapidkit workspace policy set rules.enforce_toolchain_lock true")),0}if(i!=="set")return console.log(l.red(`Unknown workspace policy action: ${o||""}`)),console.log(l.gray("Available: show, set")),1;if(!t||typeof r>"u")return console.log(l.yellow("Usage: rapidkit workspace policy set <key> <value>")),console.log(l.gray("Allowed keys:")),console.log(l.gray(" mode (warn|strict)")),console.log(l.gray(" dependency_sharing_mode (isolated|shared-runtime-caches|shared-node-deps)")),console.log(l.gray(" rules.enforce_workspace_marker (true|false)")),console.log(l.gray(" rules.enforce_toolchain_lock (true|false)")),console.log(l.gray(" rules.disallow_untrusted_tool_sources (true|false)")),console.log(l.gray(" rules.enforce_compatibility_matrix (true|false)")),console.log(l.gray(" rules.require_mirror_lock_for_offline (true|false)")),1;let a=t.trim(),c=await hr(e);if(a==="mode"){let p=r.trim().toLowerCase();if(p!=="warn"&&p!=="strict")return console.log(l.red("\u274C Invalid mode. Use: warn | strict")),1;c=fr(c,"mode",`${p} # "warn" or "strict"`);}else if(a==="dependency_sharing_mode"){let p=r.trim().toLowerCase();if(p!=="isolated"&&p!=="shared-runtime-caches"&&p!=="shared-node-deps")return console.log(l.red("\u274C Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps")),1;c=fr(c,"dependency_sharing_mode",`${p} # "isolated" or "shared-runtime-caches" or "shared-node-deps"`);}else if(a.startsWith("rules.")){let p=a.slice(6);if(!(p in xr))return console.log(l.red(`\u274C Unknown policy rule: ${p}`)),1;let u=ds(r);if(u===null)return console.log(l.red("\u274C Rule values must be boolean: true | false")),1;c=as(c,p,u);}else return console.log(l.red(`\u274C Unknown policy key: ${a}`)),1;await ls(e,c);let d=mr(c);return console.log(l.green(`\u2705 Updated ${a} in .rapidkit/policies.yml`)),console.log(l.gray(` mode: ${d.mode}`)),console.log(l.gray(` dependency_sharing_mode: ${d.dependency_sharing_mode}`)),console.log(l.gray(" Tip: run `npx rapidkit workspace policy show` to inspect all values.")),0}async function ws(e){let o=(e[1]||"status").toLowerCase(),t=e.includes("--json"),r=B(process.cwd());if(!r)return console.log(l.red("\u274C Not inside a RapidKit workspace")),console.log(l.gray("\u{1F4A1} Run this command from within a workspace directory")),1;let i=y.join(r,".rapidkit"),n=y.join(i,"mirror-config.json"),a=y.join(i,"mirror.lock"),s=y.join(i,"mirror","artifacts"),c=y.join(i,"reports");async function d(p){let u=new Date().toISOString().replace(/[:.]/g,"-"),g=y.join(c,`mirror-ops-${u}.json`),h=y.join(c,"mirror-ops.latest.json");await _.ensureDir(c),await Xe(g,p),await Xe(h,p);}if(o==="status"){if(!await _.pathExists(n))try{let k={schema_version:"1.0",enabled:false,strategy:"on-demand",artifacts:[],created_at:new Date().toISOString(),note:"Auto-generated by rapidkit mirror status. Set enabled: true and add artifact entries to activate mirroring."};await _.ensureDir(i),await b$2.promises.writeFile(n,JSON.stringify(k,null,2)+`
|
|
3551
|
+
`,"utf-8"),console.log(l.gray(" mirror-config.json created with defaults (.rapidkit/mirror-config.json)"));}catch{}let u=await _.pathExists(n),g=await _.pathExists(s),h=await _.pathExists(a),f=g?(await b$2.promises.readdir(s,{withFileTypes:true})).filter(k=>k.isFile()).length:0,m={command:"mirror",action:o,result:"ok",timestamp:new Date().toISOString(),workspacePath:r,mirror:{configExists:u,lockExists:h,artifactsCount:f}};return await d(m),t?(process.stdout.write(`${JSON.stringify(m,null,2)}
|
|
3552
|
+
`),0):(console.log(l.cyan("RapidKit mirror status")),console.log(l.gray(`Workspace: ${r}`)),console.log(l.gray(`Config: ${u?"present":"missing"} (${n})`)),console.log(l.gray(`Lock: ${h?"present":"missing"} (${a})`)),console.log(l.gray(`Artifacts: ${f}`)),0)}if(o==="sync"||o==="verify"||o==="rotate"){let p=await Xt(r,{ciMode:true,offlineMode:o==="verify",forceRun:true}),u=p.checks.filter(f=>f.status==="failed"),g=p.checks.some(f=>f.id.startsWith("mirror.verify.")&&f.status==="failed");if(o==="verify"&&g){let f={command:"mirror",action:o,result:"failed",timestamp:new Date().toISOString(),workspacePath:r,details:p.details,checks:p.checks};if(await d(f),t)return process.stdout.write(`${JSON.stringify(f,null,2)}
|
|
3553
|
+
`),1;console.log(l.red("\u274C Mirror verify failed."));for(let m of p.checks.filter(k=>k.id.startsWith("mirror.verify.")))console.log(l.gray(`- ${m.id}: ${m.message}`));return 1}if(u.length>0){let f={command:"mirror",action:o,result:"failed",timestamp:new Date().toISOString(),workspacePath:r,details:p.details,checks:p.checks};if(await d(f),t)return process.stdout.write(`${JSON.stringify(f,null,2)}
|
|
3554
|
+
`),1;console.log(l.yellow(`\u26A0\uFE0F Mirror ${o} completed with ${u.length} issue(s).`));for(let m of u)console.log(l.gray(`- ${m.id}: ${m.message}`));return 1}let h={command:"mirror",action:o,result:"ok",timestamp:new Date().toISOString(),workspacePath:r,details:p.details,checks:p.checks};return await d(h),t?(process.stdout.write(`${JSON.stringify(h,null,2)}
|
|
3555
|
+
`),0):o==="rotate"?(console.log(l.green(`\u2705 Mirror rotate completed. Rotated files: ${p.details.rotatedFiles}.`)),0):o==="verify"?(console.log(l.green(`\u2705 Mirror verify completed. Verified artifacts: ${p.details.verifiedArtifacts}.`)),0):(console.log(l.green(`\u2705 Mirror sync completed. Synced artifacts: ${p.details.syncedArtifacts}.`)),0)}return console.log(l.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),1}async function io(e){let o=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof o>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let t=process.cwd(),r=await Ir(t,async()=>{let i=B(t),n=Fe("python",{runCommandInCwd:de,runCoreRapidkit:d$1});if(e.length>1){let u=y.resolve(t,e[1]),g=Ne(u);return me(g,u)?await to(u):fe(g,u)?await Ue("init",u):he(g,u)?(await n.initProject(u)).exitCode:await d$1(e,{cwd:t})}let a=Ne(t),s=!!B(t)&&t===B(t);if(!s&&me(a,t))return await to(t);if(!s&&fe(a,t))return await Ue("init",t);if(!s&&he(a,t))return (await n.initProject(t)).exitCode;let c=i||B(t),d=Sr(t),p=d?y.dirname(y.dirname(d)):null;if(p&&p!==c)return (await n.initProject(p)).exitCode;if(c&&t===c){let u=await ps(c);if(u!==0)return u;let g=await Tr(c);if(g.length===0){let h="minimal";try{h=JSON.parse(await b$2.promises.readFile(y.join(c,".rapidkit","workspace.json"),"utf-8")).profile??"minimal";}catch{}return h==="go-only"?(console.log(l.green("\u2714 Go workspace ready")),console.log(l.gray(`
|
|
3542
3556
|
No projects yet \u2014 create one and then run init inside it:`)),console.log(l.white(" npx rapidkit create project gofiber.standard my-api")),console.log(l.white(" cd my-api && npx rapidkit init")),console.log(l.gray(`
|
|
3543
3557
|
\u{1F4A1} Go dependencies are managed per-project (go.mod / go mod tidy).`))):(console.log(l.green("\u2714 Workspace ready")),console.log(l.gray(`
|
|
3544
|
-
No projects yet \u2014 create one to get started:`)),console.log(l.white(" npx rapidkit create project"))),0}for(let
|
|
3545
|
-
`);
|
|
3546
|
-
`);
|
|
3547
|
-
`);for(let g of
|
|
3548
|
-
`);
|
|
3558
|
+
No projects yet \u2014 create one to get started:`)),console.log(l.white(" npx rapidkit create project"))),0}for(let h of g){let f=Ne(h);if(me(f,h)){let m=await to(h);if(m!==0)return m}else {if(fe(f,h)){let k=await Ue("init",h);if(k!==0)return k;continue}if(he(f,h)){let k=await n.initProject(h);if(k.exitCode!==0)return k.exitCode;continue}let m=await d$1(["init"],{cwd:h});if(m!==0)return m}}return 0}if(!c){let u=await a$2(),{name:g}=us(t);return await h(g,{yes:true,userConfig:u}),0}return await d$1(e,{cwd:t})});return r.ok?r.value:r.code}finally{typeof o>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=o;}}async function yr(e){let o=B(e);if(!o)return [];let t="warn";try{(await b$2.promises.readFile(y.join(o,".rapidkit","policies.yml"),"utf-8")).match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"&&(t="strict");}catch{return []}if(t!=="strict")return [];let r=[],i=y.join(o,".rapidkit","toolchain.lock");if(!b$2.existsSync(i))return r.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain)."),r;let n={};try{n=JSON.parse(await b$2.promises.readFile(i,"utf-8"));}catch{return []}let a=n.runtime??{},s=Ne(e);me(s,e)&&!a.go?.version?r.push("go.version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."):fe(s,e)&&!a.node?.version?r.push("node.version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."):he(s,e)&&!a.python?.version&&r.push("python.version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");try{let d=JSON.parse(await b$2.promises.readFile(y.join(o,".rapidkit","workspace.json"),"utf-8")).profile??"";d==="python-only"&&(me(s,e)||fe(s,e))?r.push('Workspace profile is "python-only" but this project is not Python.'):d==="node-only"&&(me(s,e)||he(s,e))?r.push('Workspace profile is "node-only" but this project is not Node.'):d==="go-only"&&(fe(s,e)||he(s,e))&&r.push('Workspace profile is "go-only" but this project is not Go.');}catch{}return r}async function vs(){let e=async g=>{if(!a()||!g.toLowerCase().endsWith(".cmd"))return false;try{let f=(await _.readFile(g,"utf8")).replace(/\r\n/g,`
|
|
3559
|
+
`).toLowerCase(),m=f.includes("\\.rapidkit\\rapidkit"),k=f.includes("\\.rapidkit\\rapidkit.cmd")||f.includes("\\.rapidkit\\rapidkit.exe")||f.includes("\\.venv\\scripts\\rapidkit.exe");return m&&!k}catch{return false}},o=process.cwd(),t=process.argv.slice(2),r=t[0],i=!r||r==="--help"||r==="-h"||r==="help",n=Cr(o),a$2=b$2.existsSync(y.join(o,".rapidkit","project.json"));if(Lt(t[0])||t[0]==="create"||t[0]==="init"&&n&&!a$2)return false;try{let g=r==="shell"&&t[1]==="activate",h=r==="create",f=await fo(o,{cwd:o,timeoutMs:1200});if(f.ok&&f.data?.isRapidkitProject&&f.data.engine==="python"){let m=h||Lt(r);if(!i&&!g&&!m){if(r&&ur.includes(r)){let O=await yr(o).catch(()=>[]);if(O.length>0){process.stderr.write(l.red("\u274C Strict policy violations prevent running this command:")+`
|
|
3560
|
+
`);for(let A of O)process.stderr.write(l.red(` \u2022 ${A}`)+`
|
|
3561
|
+
`);process.exit(1);}}let k=await d$1(process.argv.slice(2),{cwd:o});process.exit(k);}}}catch{}let s=Sr(o),c=a(),d=i$1(o),p=null;for(let g of d)if(await _.pathExists(g)){if(await e(g)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${g}. Falling back to core bridge.`);continue}p=g;break}let u=r==="create";if(r==="init"&&n&&!a$2)return false;if(r&&ur.includes(r)){let g=await yr(o);if(g.length>0){process.stderr.write(l.red("\u274C Strict policy violations prevent running this command:")+`
|
|
3562
|
+
`);for(let h of g)process.stderr.write(l.red(` \u2022 ${h}`)+`
|
|
3563
|
+
`);process.exit(1);}}if(p&&r&&pr.includes(r)&&!u){a$1.debug(`Delegating to local CLI: ${p} ${t.join(" ")}`);let g=r==="init"?cr():process.env,h=spawn(p,t,{stdio:"inherit",cwd:o,shell:c,env:g});return h.on("close",f=>{process.exit(f??0);}),h.on("error",f=>{a$1.error(`Failed to run local rapidkit: ${f.message}`),process.exit(1);}),true}if(s&&await _.pathExists(s))try{if((await _.readJson(s)).engine==="pip"){let h=t[0],f=i$1(o),m=null;for(let k of f)if(await _.pathExists(k)){if(await e(k)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${k}. Falling back to core bridge.`);continue}m=k;break}if(m&&h&&pr.includes(h)){a$1.debug(`Delegating to local CLI (early detection): ${m} ${t.join(" ")}`);let k=h==="init"?cr():process.env,O=spawn(m,t,{stdio:"inherit",cwd:o,env:k});return O.on("close",A=>process.exit(A??0)),O.on("error",A=>{a$1.error(`Failed to run local rapidkit: ${A.message}`),process.exit(1);}),true}if(h==="shell"&&t[1]==="activate"){let k=a()?`# RapidKit: activation snippet (PowerShell)
|
|
3564
|
+
$venv = ".venv"
|
|
3565
|
+
if (Test-Path "$venv\\Scripts\\Activate.ps1") { . "$venv\\Scripts\\Activate.ps1" }
|
|
3566
|
+
$env:RAPIDKIT_PROJECT_ROOT = (Get-Location).Path
|
|
3567
|
+
$project = (Get-Location).Path
|
|
3568
|
+
$env:PATH = "$project\\.rapidkit;$project;" + $env:PATH
|
|
3569
|
+
|
|
3570
|
+
# CMD alternative:
|
|
3571
|
+
# call .venv\\Scripts\\activate.bat
|
|
3572
|
+
`:`# RapidKit: activation snippet - eval "$(rapidkit shell activate)"
|
|
3549
3573
|
VENV='.venv'
|
|
3550
3574
|
if [ -f "$VENV/bin/activate" ]; then
|
|
3551
3575
|
. "$VENV/bin/activate"
|
|
@@ -3556,16 +3580,16 @@ export RAPIDKIT_PROJECT_ROOT="$(pwd)"
|
|
|
3556
3580
|
export PATH="$(pwd)/.rapidkit:$(pwd):$PATH"
|
|
3557
3581
|
`;console.log(l.green.bold(`
|
|
3558
3582
|
\u2705 Activation snippet \u2014 run the following to activate this project in your current shell:
|
|
3559
|
-
`)),console.log(
|
|
3583
|
+
`)),console.log(k),console.log(l.gray(`
|
|
3560
3584
|
\u{1F4A1} After activation you can run: rapidkit dev
|
|
3561
|
-
`)),process.exit(0);}if(!
|
|
3585
|
+
`)),process.exit(0);}if(!i&&!Lt(h)){let k=await d$1(t,{cwd:o});process.exit(k);}}}catch{}return false}var je=null,Dt=false,ye=new Command,ks=process.env.RAPIDKIT_SHOW_LEGACY==="1"||process.env.RAPIDKIT_SHOW_LEGACY?.toLowerCase()==="true";async function bs(e){if(e.length===0)return false;let o=e[0],t=e[1];if(Rr.includes(o))return true;if(Lt(o)||o==="shell"&&t==="activate")return false;if(e.includes("--tui"))return true;if(o==="--help"||o==="-h"||o==="help"||o==="--version"||o==="-V"||e.includes("--template")||e.includes("-t"))return false;let r=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]);if(e.some(n=>r.has(n)))return false;let i=await h$2();return i?i.has(o):!!(a$3.has(o)||e.length>1)}ye.name("rapidkit").description("Create RapidKit workspaces and projects").version(c());var Rs=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";ye.addHelpText("beforeAll",`RapidKit NPM CLI
|
|
3562
3586
|
|
|
3563
|
-
Global CLI
|
|
3564
3587
|
Create workspaces, scaffold projects, and manage your development toolchain.
|
|
3565
|
-
`);
|
|
3588
|
+
`);ye.addHelpText("afterAll",`
|
|
3566
3589
|
Workspace Setup Commands
|
|
3567
3590
|
rapidkit bootstrap Bootstrap projects in workspace (--profile python-only|node-only|go-only|polyglot|enterprise)
|
|
3568
3591
|
rapidkit setup <runtime> Set up runtime toolchain (runtime: python | node | go)
|
|
3592
|
+
rapidkit workspace list List registered workspaces on this system
|
|
3569
3593
|
rapidkit mirror Manage registry mirrors (mirror status --json | sync | verify | rotate)
|
|
3570
3594
|
rapidkit cache Manage package cache (cache status | clear | prune | repair)
|
|
3571
3595
|
|
|
@@ -3580,38 +3604,42 @@ Quick start:
|
|
|
3580
3604
|
npx rapidkit my-workspace # Create + bootstrap workspace
|
|
3581
3605
|
cd my-workspace
|
|
3582
3606
|
npx rapidkit create project # Interactive kit picker
|
|
3583
|
-
|
|
3607
|
+
${Rs} # Install deps + run
|
|
3584
3608
|
|
|
3585
3609
|
Notes:
|
|
3586
3610
|
--skip-install (npm wrapper) enables fast-path for lock/dependency steps.
|
|
3587
3611
|
It is different from core --skip-essentials (essential module installation).
|
|
3588
3612
|
|
|
3589
3613
|
Use "rapidkit help <command>" for more information.
|
|
3590
|
-
`);
|
|
3591
|
-
\u{1F680} Welcome to RapidKit!
|
|
3592
|
-
`)),e$1||(
|
|
3593
|
-
\u274C ${s.message}`),s.details&&a.warn(`\u{1F4A1} ${s.details}
|
|
3594
|
-
`),process.exit(1)),s}let n=
|
|
3614
|
+
`);ye.argument("[name]","Name of the workspace or project directory").addOption(new Option("-t, --template <template>","Legacy: create a project with template (fastapi, nestjs) instead of a workspace").hideHelp()).option("-y, --yes","Skip prompts and use defaults").option("--author <name>","Author/team name for workspace metadata").addOption(new Option("--skip-git","Skip git initialization").hideHelp()).addOption(new Option("--skip-install","Legacy: skip installing dependencies (template mode)").hideHelp()).option("--debug","Enable debug logging").addOption(new Option("--dry-run","Show what would be created without creating it").hideHelp()).addOption(new Option("--install-method <method>","Installation method: poetry, venv, or pipx").choices(["poetry","venv","pipx"]).hideHelp()).addOption(new Option("--profile <profile>","Workspace bootstrap profile: minimal, python-only, node-only, go-only, polyglot, enterprise").choices(["minimal","python-only","node-only","go-only","polyglot","enterprise"]).hideHelp()).addOption(new Option("--create-workspace","When creating a project outside a workspace: create and register a workspace in the current directory").hideHelp()).addOption(new Option("--no-workspace","When creating a project outside a workspace: do not create a workspace").hideHelp()).option("--no-update-check","Skip checking for updates").action(async(e$1,o)=>{try{o.debug&&(a$1.setDebug(true),a$1.debug("Debug mode enabled"));let t=await a$2();a$1.debug("User config loaded",t);let r=await b();a$1.debug("RapidKit config loaded",r);let i$1=c$1(t,r,{author:o.author,pythonVersion:void 0,skipGit:o.skipGit});a$1.debug("Merged config",i$1),o.updateCheck!==false&&await b$1(),console.log(l.blue.bold(`
|
|
3615
|
+
\u{1F680} Welcome to RapidKit NPM CLI!
|
|
3616
|
+
`)),e$1||(Or(),process.exit(0));try{Ft(e$1);}catch(s){throw s instanceof d&&(a$1.error(`
|
|
3617
|
+
\u274C ${s.message}`),s.details&&a$1.warn(`\u{1F4A1} ${s.details}
|
|
3618
|
+
`),process.exit(1)),s}let n=y.resolve(process.cwd(),e$1);je=n,await _.pathExists(n)&&(a$1.error(`
|
|
3595
3619
|
\u274C Directory "${e$1}" already exists`),console.log(l.cyan(`
|
|
3596
3620
|
\u{1F4A1} Choose a different name or delete the existing directory.
|
|
3597
|
-
`)),process.exit(1));let a
|
|
3621
|
+
`)),process.exit(1));let a=!!o.template;if(o.dryRun){console.log(l.cyan(`
|
|
3598
3622
|
\u{1F50D} Dry-run mode - showing what would be created:
|
|
3599
|
-
`)),console.log(l.white("\u{1F4C2} Path:"),n),console.log(l.white("\u{1F4E6} Type:"),a
|
|
3600
|
-
`)),a
|
|
3601
|
-
`),a.debug(`Synced Python version ${K.trim()} from workspace to project`);}}catch(K){a.debug("Could not sync Python version from workspace:",K);}}if(!
|
|
3602
|
-
`),a.debug(`Re-synced Python version ${
|
|
3603
|
-
\u274C ${t.message}`),t.details&&a.warn(`\u{1F4A1} ${t.details}`),a.debug("Error code:",t.code)):(a.error(`
|
|
3604
|
-
\u274C An unexpected error occurred:`),console.error(t)),process.exit(1);}finally{
|
|
3623
|
+
`)),console.log(l.white("\u{1F4C2} Path:"),n),console.log(l.white("\u{1F4E6} Type:"),a?`Project (${o.template})`:"Workspace"),console.log();return}if(!o.yes&&!a?await Se.prompt([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"RapidKit User"}]):o.yes&&console.log(l.gray(`Using default values (--yes flag)
|
|
3624
|
+
`)),a){let s=String(o.template||"").trim(),c=s.toLowerCase(),d=c==="fastapi"?"fastapi.standard":c==="nestjs"?"nestjs.standard":c==="go"||c==="fiber"?"gofiber.standard":c==="gin"?"gogin.standard":s;if(Mt(d)){let A=y.resolve(process.cwd(),e$1);await Kt(A,{project_name:e$1,module_path:e$1,skipGit:o.skipGit});return}if(dt(d)){let A=y.resolve(process.cwd(),e$1);await Wt(A,{project_name:e$1,module_path:e$1,skipGit:o.skipGit});return}if(!!!ro(process.cwd())){if(o.createWorkspace)await i(process.cwd(),{skipGit:o.skipGit,yes:o.yes,userConfig:t});else if(!o.noWorkspace)if(o.yes)await i(process.cwd(),{skipGit:o.skipGit,yes:true,userConfig:t});else {let{createWs:A}=await Se.prompt([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);A&&await i(process.cwd(),{skipGit:o.skipGit,yes:false,userConfig:t});}}let u=["create","project",d,e$1,"--output",process.cwd()];o.yes&&u.push("--yes");let g=B(process.cwd()),h=!!o.skipInstall,f=h||!!g;h&&u.push("--skip-essentials");let m=f?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0,k=await e(u,{cwd:process.cwd(),env:m});k!==0&&process.exit(k),g&&!o.skipInstall&&(console.log(l.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(l.white(" Next: cd <project-name> && npx rapidkit init")));let O=ro(process.cwd());if(O){let A=y.dirname(O),P=y.join(A,".python-version"),I=y.join(n,".python-version");try{if(await _.pathExists(P)){let K=b$2.readFileSync(P,"utf-8");b$2.writeFileSync(I,K.trim()+`
|
|
3625
|
+
`),a$1.debug(`Synced Python version ${K.trim()} from workspace to project`);}}catch(K){a$1.debug("Could not sync Python version from workspace:",K);}}if(!o.skipInstall){let A=await d$1(["init",n],{cwd:process.cwd()});if(A!==0&&process.exit(A),O){let P=y.dirname(O),I=y.join(P,".python-version"),K=y.join(n,".python-version");try{if(await _.pathExists(I)){let j=b$2.readFileSync(I,"utf-8");b$2.writeFileSync(K,j.trim()+`
|
|
3626
|
+
`),a$1.debug(`Re-synced Python version ${j.trim()} after init`);}}catch(j){a$1.debug("Could not re-sync Python version after init:",j);}}}}else await h(e$1,{skipGit:o.skipGit,dryRun:o.dryRun,yes:o.yes,userConfig:i$1,installMethod:o.installMethod,profile:o.profile});}catch(t){t instanceof d?(a$1.error(`
|
|
3627
|
+
\u274C ${t.message}`),t.details&&a$1.warn(`\u{1F4A1} ${t.details}`),a$1.debug("Error code:",t.code)):(a$1.error(`
|
|
3628
|
+
\u274C An unexpected error occurred:`),console.error(t)),process.exit(1);}finally{je=null;}});Qo(ye);Ao(ye);ye.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async e=>{e!=="activate"&&(console.log(l.red(`Unknown shell command: ${e}`)),process.exit(1));let o=process.cwd();function t(c){let d=c;for(;;){let p=y.join(d,".rapidkit","context.json");if(b$2.existsSync(p))return p;let u=y.dirname(d);if(u===d)break;d=u;}return null}let r=t(o);function i(c){let d=c;for(;;){let p=y.join(d,".venv"),u=y.join(d,".rapidkit","activate");if(b$2.existsSync(u)||b$2.existsSync(p))return {venv:p,activateFile:u};let g=y.dirname(d);if(g===d)break;d=g;}return null}let n=i(o);!r&&!n&&(console.log(l.yellow("No RapidKit project found in this directory")),process.exit(1));let a$1;n&&b$2.existsSync(n.activateFile)?a$1=n.activateFile:n&&b$2.existsSync(n.venv)?a$1=h$1(n.venv):(console.log(l.yellow("No virtual environment found")),process.exit(1));let s=a();console.log(s?`call "${a$1}"`:`. "${a$1}"`);});ye.command("doctor [scope]").description("\u{1FA7A} Check RapidKit environment health").option("--workspace","Check entire workspace (including all projects)").option("--json","Output results in JSON format (for CI/CD pipelines)").option("--fix","Automatically fix common issues (with confirmation)").action(async(e,o)=>{e&&e!=="workspace"&&(console.log(l.red(`Unknown doctor scope: ${e}`)),console.log(l.gray("Available: workspace")),process.exit(1)),await Io({...o,workspace:o.workspace||e==="workspace"});});ye.command("workspace <action> [subaction] [key] [value]").description("Manage RapidKit workspaces (list, sync, policy)").action(async(e,o,t,r)=>{if(e==="list"){let{listWorkspaces:i}=await import('./workspace-PIBFBNRA.js');await i();}else if(e==="sync"){let i=B(process.cwd());i||(console.log(l.red("\u274C Not inside a RapidKit workspace")),console.log(l.gray("\u{1F4A1} Run this command from within a workspace directory")),process.exit(1));let{syncWorkspaceProjects:n}=await import('./workspace-PIBFBNRA.js');console.log(l.cyan(`\u{1F4C2} Scanning workspace: ${y.basename(i)}`)),await n(i);}else if(e==="policy"){let i=B(process.cwd());i||(console.log(l.red("\u274C Not inside a RapidKit workspace")),console.log(l.gray("\u{1F4A1} Run this command from within a workspace directory")),process.exit(1));let n=await ys(i,o,t,r);n!==0&&process.exit(n);}else console.log(l.red(`Unknown workspace action: ${e}`)),console.log(l.gray("Available: list, sync, policy")),process.exit(1);});function Or(){let e=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";console.log(l.white(`Usage:
|
|
3605
3629
|
`)),console.log(l.cyan(` npx rapidkit <workspace-name> [options]
|
|
3606
|
-
`)),console.log(l.bold("Quick start \u2014 workspace workflow:")),console.log(l.cyan(" npx rapidkit my-workspace ")+l.gray("# Create workspace (interactive profile picker)")),console.log(l.cyan(" cd my-workspace")),console.log(l.cyan(" rapidkit bootstrap ")+l.gray("# Bootstrap all runtime toolchains")),console.log(l.cyan(" rapidkit create project ")+l.gray("# Interactive kit picker")),console.log(l.cyan(" cd my-api")),console.log(l.cyan(`
|
|
3630
|
+
`)),console.log(l.bold("Quick start \u2014 workspace workflow:")),console.log(l.cyan(" npx rapidkit my-workspace ")+l.gray("# Create workspace (interactive profile picker)")),console.log(l.cyan(" cd my-workspace")),console.log(l.cyan(" npx rapidkit bootstrap ")+l.gray("# Bootstrap all runtime toolchains")),console.log(l.cyan(" npx rapidkit create project ")+l.gray("# Interactive kit picker")),console.log(l.cyan(" cd my-api")),console.log(l.cyan(` ${e}
|
|
3607
3631
|
`)),console.log(l.bold("Workspace profiles (asked during creation):")),console.log(l.gray(" minimal Foundation files only \u2014 fastest bootstrap (default)")),console.log(l.gray(" python-only Python + Poetry (FastAPI, Django, ML)")),console.log(l.gray(" node-only Node.js runtime (NestJS, Express, Next.js)")),console.log(l.gray(" go-only Go runtime (Fiber, Gin, gRPC)")),console.log(l.gray(" polyglot Python + Node.js + Go multi-runtime")),console.log(l.gray(` enterprise Polyglot + governance + Sigstore
|
|
3608
|
-
`)),console.log(l.bold("Workspace commands (inside a workspace):")),console.log(l.gray(" rapidkit bootstrap [--profile <p>] Re-bootstrap toolchains")),console.log(l.gray(" rapidkit setup python|node|go [--warm-deps] Set up runtime (+ optional deps warm-up)")),console.log(l.gray(" rapidkit mirror [status|sync|verify|rotate] Registry mirror management")),console.log(l.gray(` rapidkit cache [status|clear|prune|repair] Package cache management
|
|
3609
|
-
`)),console.log(l.bold("Options (workspace creation):")),console.log(l.gray(" -y, --yes Skip prompts and use defaults")),console.log(l.gray(" --skip-git Skip git initialization")),console.log(l.gray(" --debug Enable debug logging")),console.log(l.gray(" --dry-run Show what would be created")),console.log(l.gray(" --create-workspace When creating a project outside a workspace: create and register a workspace in the current directory")),console.log(l.gray(" --no-workspace When creating a project outside a workspace: do not create a workspace")),console.log(l.gray(` --no-update-check Skip checking for updates
|
|
3610
|
-
`)),console.log(l.bold("Project commands (inside a project):")),console.log(l.gray(" rapidkit create project Scaffold a new project")),console.log(l.gray(" cd my-api Change directory to the new project")),console.log(l.gray(" rapidkit init Install project dependencies")),console.log(l.gray(" rapidkit dev Start dev server")),console.log(l.gray(" rapidkit build Build for production")),console.log(l.gray(` rapidkit test Run tests
|
|
3632
|
+
`)),console.log(l.bold("Workspace commands (inside a workspace):")),console.log(l.gray(" npx rapidkit bootstrap [--profile <p>] Re-bootstrap toolchains")),console.log(l.gray(" npx rapidkit workspace list List registered workspaces")),console.log(l.gray(" npx rapidkit workspace policy show Show effective workspace policies")),console.log(l.gray(" npx rapidkit workspace policy set <k> <v> Update workspace policy values")),console.log(l.gray(" npx rapidkit setup python|node|go [--warm-deps] Set up runtime (+ optional deps warm-up)")),console.log(l.gray(" npx rapidkit mirror [status|sync|verify|rotate] Registry mirror management")),console.log(l.gray(` npx rapidkit cache [status|clear|prune|repair] Package cache management
|
|
3633
|
+
`)),console.log(l.bold("Options (workspace creation):")),console.log(l.gray(" -y, --yes Skip prompts and use defaults")),console.log(l.gray(" --author <name> Author/team name for workspace metadata")),console.log(l.gray(" --skip-git Skip git initialization")),console.log(l.gray(" --debug Enable debug logging")),console.log(l.gray(" --dry-run Show what would be created")),console.log(l.gray(" --create-workspace When creating a project outside a workspace: create and register a workspace in the current directory")),console.log(l.gray(" --no-workspace When creating a project outside a workspace: do not create a workspace")),console.log(l.gray(` --no-update-check Skip checking for updates
|
|
3634
|
+
`)),console.log(l.bold("Project commands (inside a project):")),console.log(l.gray(" npx rapidkit create project Scaffold a new project")),console.log(l.gray(" cd my-api Change directory to the new project")),console.log(l.gray(" npx rapidkit init Install project dependencies")),console.log(l.gray(" npx rapidkit dev Start dev server")),console.log(l.gray(" npx rapidkit build Build for production")),console.log(l.gray(` npx rapidkit test Run tests
|
|
3611
3635
|
`)),console.log(l.bold("Flags clarification:")),console.log(l.gray(" --skip-install npm fast-path for lock/dependency steps")),console.log(l.gray(` --skip-essentials core flag for skipping essential module installation
|
|
3612
|
-
`)),console.log(l.
|
|
3613
|
-
`))
|
|
3614
|
-
|
|
3615
|
-
|
|
3616
|
-
`),
|
|
3617
|
-
|
|
3636
|
+
`)),ks?(console.log(l.bold("Legacy (shown because RAPIDKIT_SHOW_LEGACY=1):")),console.log(l.gray(" npx rapidkit my-project --template fastapi")),console.log(l.gray(" npx rapidkit my-project --template nestjs")),console.log(l.gray(` --skip-install Fast-path lock/deps (legacy template mode) \u2014 not same as --skip-essentials
|
|
3637
|
+
`))):console.log(l.gray(`Tip: set RAPIDKIT_SHOW_LEGACY=1 to show legacy template flags in help.
|
|
3638
|
+
`));}var wr="__rapidkit_signal_handlers_registered__",vr=globalThis;vr[wr]||(vr[wr]=true,process.on("SIGINT",async()=>{if(!Dt){if(Dt=true,console.log(l.yellow(`
|
|
3639
|
+
|
|
3640
|
+
\u26A0\uFE0F Interrupted by user`)),je&&await _.pathExists(je)){console.log(l.gray("Cleaning up partial installation..."));try{await _.remove(je),console.log(l.green("\u2713 Cleanup complete"));}catch(e){a$1.debug("Cleanup failed:",e);}}process.exit(130);}}),process.on("SIGTERM",async()=>{if(!Dt){if(Dt=true,a$1.debug("Received SIGTERM"),je&&await _.pathExists(je))try{await _.remove(je);}catch(e){a$1.debug("Cleanup failed:",e);}process.exit(143);}}));var _s=process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test",Cs=(()=>{let e=process.argv[1];if(!e)return false;try{return b$2.realpathSync(e)===b$2.realpathSync(fileURLToPath(import.meta.url))}catch{return y.resolve(e)===y.resolve(fileURLToPath(import.meta.url))}})(),Ss=!_s||Cs;if(Ss){let e=process.argv.slice(2),o=e[0],t=process.cwd(),r=Cr(t),i=b$2.existsSync(y.join(t,".rapidkit","project.json")),n=gr(o),a=o==="init"&&r&&!i;(e.length===0||e.length===1&&(o==="--help"||o==="-h"||o==="help"))&&(console.log(l.blue.bold(`
|
|
3641
|
+
\u{1F680} Welcome to RapidKit NPM CLI!
|
|
3642
|
+
`)),Or(),process.exit(0)),n?ye.parse():a?io(e).then(c=>process.exit(c)).catch(c=>{process.stderr.write(`RapidKit (npm) failed to run workspace init: ${c?.message??c}
|
|
3643
|
+
`),process.exit(1);}):vs().then(async c=>{if(!c){let d=process.argv.slice(2);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] argv=${JSON.stringify(d)}
|
|
3644
|
+
`),gr(d[0])){ye.parse();return}if(d[0]==="create"){let u=await br(d);process.exit(u);}if(d[0]==="init"){let u=await io(d);process.exit(u);}if(is(d[0])){if(d[0]==="bootstrap"){let g=await gs(d);process.exit(g);}if(d[0]==="setup"){let g=await ms(d);process.exit(g);}if(d[0]==="cache"){let g=await hs(d);process.exit(g);}let u=await ws(d);process.exit(u);}if(_r.includes(d[0])){let u=d[0],g=Ne(process.cwd()),h=B(process.cwd());if(h){let m=y.join(h,".rapidkit","policies.yml");if(await _.pathExists(m))try{let k=await b$2.promises.readFile(m,"utf-8");if(((k.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??k.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]??"warn")==="strict"){let P=y.join(h,".rapidkit","toolchain.lock"),I=[];if(!await _.pathExists(P))I.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain).");else try{let M=JSON.parse(await b$2.promises.readFile(P,"utf-8")).runtime??{};me(g,process.cwd())&&!M.go?.version&&I.push("Go runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."),fe(g,process.cwd())&&!M.node?.version&&I.push("Node runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."),he(g,process.cwd())&&!M.python?.version&&I.push("Python runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");}catch{}let K=y.join(h,".rapidkit","workspace.json");if(await _.pathExists(K))try{let M=JSON.parse(await b$2.promises.readFile(K,"utf-8")).profile??"";M==="python-only"&&(me(g,process.cwd())||fe(g,process.cwd()))&&I.push('Workspace profile is "python-only" but this project is not Python. Update the workspace profile or use a polyglot workspace.'),M==="node-only"&&(me(g,process.cwd())||he(g,process.cwd()))&&I.push('Workspace profile is "node-only" but this project is not Node. Update the workspace profile or use a polyglot workspace.'),M==="go-only"&&(he(g,process.cwd())||fe(g,process.cwd()))&&I.push('Workspace profile is "go-only" but this project is not Go. Update the workspace profile or use a polyglot workspace.');}catch{}if(I.length>0){console.log(l.red(`\u274C Strict policy violations block \`${u}\`:`));for(let j of I)console.log(l.red(` \u2022 ${j}`));console.log(l.gray("\u{1F4A1} Fix violations or switch to warn mode: set mode: warn in .rapidkit/policies.yml")),process.exit(1);}}}catch{}}let f=await Ir(process.cwd(),async()=>{if(me(g,process.cwd())){let m=Fe("go",{runCommandInCwd:de,runCoreRapidkit:d$1});return u==="dev"?(await m.runDev(process.cwd())).exitCode:u==="test"?(await m.runTest(process.cwd())).exitCode:u==="build"?(await m.runBuild(process.cwd())).exitCode:(await m.runStart(process.cwd())).exitCode}if(fe(g,process.cwd()))return u==="dev"?await Ue("dev",process.cwd()):u==="test"?await Ue("test",process.cwd()):u==="build"?await Ue("build",process.cwd()):await Ue("start",process.cwd());if(he(g,process.cwd())){let m=Fe("python",{runCommandInCwd:de,runCoreRapidkit:d$1});return u==="dev"?(await m.runDev(process.cwd())).exitCode:u==="test"?(await m.runTest(process.cwd())).exitCode:u==="build"?(await m.runBuild(process.cwd())).exitCode:(await m.runStart(process.cwd())).exitCode}return -1});f.ok||process.exit(f.code),f.value>=0&&process.exit(f.value);}if(d[0]==="add"||d[0]==="module"&&d[1]==="add"){let u=Ne(process.cwd());(u?.runtime==="go"||u?.module_support===false)&&(console.error(l.red("\u274C RapidKit modules are not available for Go projects.")),console.error(l.gray(" The module system requires Python and is only supported for FastAPI and NestJS projects.")),process.exit(1));}let p=await bs(d);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] shouldForwardToCore=${p}
|
|
3645
|
+
`),p){let u=await d$1(d,{cwd:process.cwd()});process.exit(u);}ye.parse();}});}export{ts as NPM_ONLY_TOP_LEVEL_COMMANDS,gs as handleBootstrapCommand,hs as handleCacheCommand,br as handleCreateOrFallback,io as handleInitCommand,ws as handleMirrorCommand,ms as handleSetupCommand,bs as shouldForwardToCore};
|