@mesh-tech/mesh-cli 0.36.0 → 0.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/docs-preview.css +1599 -0
- package/dist/bin/mesh.auth-preflight-AQJ5TQES.js +48 -0
- package/dist/bin/mesh.auth-preflight-AQJ5TQES.js.map +6 -0
- package/dist/bin/mesh.capture-history-A4IAVVIR.js +38 -0
- package/dist/bin/mesh.capture-history-A4IAVVIR.js.map +6 -0
- package/dist/bin/mesh.chunk-2QIVBQX5.js +647 -0
- package/dist/bin/mesh.chunk-2QIVBQX5.js.map +6 -0
- package/dist/bin/mesh.chunk-2YRWJH5X.js +1747 -0
- package/dist/bin/mesh.chunk-2YRWJH5X.js.map +6 -0
- package/dist/bin/mesh.chunk-BF2SH6XT.js +303 -0
- package/dist/bin/mesh.chunk-BF2SH6XT.js.map +6 -0
- package/dist/bin/mesh.chunk-F4654EPX.js +383 -0
- package/dist/bin/mesh.chunk-F4654EPX.js.map +6 -0
- package/dist/bin/mesh.chunk-HPYZWPRM.js +1146 -0
- package/dist/bin/mesh.chunk-HPYZWPRM.js.map +6 -0
- package/dist/bin/mesh.chunk-I6NXLXGC.js +7715 -0
- package/dist/bin/mesh.chunk-I6NXLXGC.js.map +6 -0
- package/dist/bin/mesh.chunk-IQOBTL42.js +60 -0
- package/dist/bin/mesh.chunk-IQOBTL42.js.map +6 -0
- package/dist/bin/mesh.chunk-IU2IWH6O.js +835 -0
- package/dist/bin/mesh.chunk-IU2IWH6O.js.map +6 -0
- package/dist/bin/mesh.chunk-KN4BZOYH.js +187 -0
- package/dist/bin/mesh.chunk-KN4BZOYH.js.map +6 -0
- package/dist/bin/mesh.chunk-LMYPTJ2F.js +10092 -0
- package/dist/bin/mesh.chunk-LMYPTJ2F.js.map +6 -0
- package/dist/bin/mesh.chunk-MCBMHWXP.js +837 -0
- package/dist/bin/mesh.chunk-MCBMHWXP.js.map +6 -0
- package/dist/bin/mesh.chunk-OW5EMVG5.js +507 -0
- package/dist/bin/mesh.chunk-OW5EMVG5.js.map +6 -0
- package/dist/bin/mesh.chunk-TZAGJTKU.js +217 -0
- package/dist/bin/mesh.chunk-TZAGJTKU.js.map +6 -0
- package/dist/bin/mesh.chunk-WFFDF346.js +59 -0
- package/dist/bin/mesh.chunk-WFFDF346.js.map +6 -0
- package/dist/bin/mesh.cli-reference-H3TOPIET.js +158 -0
- package/dist/bin/mesh.cli-reference-H3TOPIET.js.map +6 -0
- package/dist/bin/mesh.convert-7N2H2SVK.js +274 -0
- package/dist/bin/mesh.convert-7N2H2SVK.js.map +6 -0
- package/dist/bin/mesh.create-app-NGXACFAU.js +39 -0
- package/dist/bin/mesh.create-app-NGXACFAU.js.map +6 -0
- package/dist/bin/mesh.dev-token-server-YP2VBP2S.js +61 -0
- package/dist/bin/mesh.dev-token-server-YP2VBP2S.js.map +6 -0
- package/dist/bin/mesh.js +20 -26418
- package/dist/bin/mesh.js.map +3 -3
- package/dist/bin/mesh.login-7SIAKFXJ.js +91 -0
- package/dist/bin/mesh.login-7SIAKFXJ.js.map +6 -0
- package/dist/bin/mesh.platform-setup-CJXE3BCP.js +37 -0
- package/dist/bin/mesh.platform-setup-CJXE3BCP.js.map +6 -0
- package/dist/bin/mesh.preview-RJGTCTY3.js +2410 -0
- package/dist/bin/mesh.preview-RJGTCTY3.js.map +6 -0
- package/dist/bin/mesh.program-BIDQBSSI.js +23 -0
- package/dist/bin/mesh.program-BIDQBSSI.js.map +6 -0
- package/dist/bin/mesh.registry-7P4MGXEK.js +47 -0
- package/dist/bin/mesh.registry-7P4MGXEK.js.map +6 -0
- package/dist/bin/mesh.registry-identity-JW4KO7N7.js +42 -0
- package/dist/bin/mesh.registry-identity-JW4KO7N7.js.map +6 -0
- package/dist/bin/mesh.skills-MNDSMBIE.js +23 -0
- package/dist/bin/mesh.skills-MNDSMBIE.js.map +6 -0
- package/dist/bin/mesh.src-5D5DFSLX.js +1302 -0
- package/dist/bin/mesh.src-5D5DFSLX.js.map +6 -0
- package/dist/bin/mesh.src-G7TJBLNJ.js +40 -0
- package/dist/bin/mesh.src-G7TJBLNJ.js.map +6 -0
- package/dist/bin/mesh.stack-EFTFAOCV.js +64 -0
- package/dist/bin/mesh.stack-EFTFAOCV.js.map +6 -0
- package/dist/bin/mesh.start-MPQFIEMH.js +454 -0
- package/dist/bin/mesh.start-MPQFIEMH.js.map +6 -0
- package/dist/bin/mesh.wizard-ZJE4S6PC.js +500 -0
- package/dist/bin/mesh.wizard-ZJE4S6PC.js.map +6 -0
- package/dist/build-info.json +2 -2
- package/dist/src/commands/app-check.d.ts +2 -1
- package/dist/src/commands/app-check.js +32 -0
- package/dist/src/commands/create-app.d.ts +0 -1
- package/dist/src/commands/create-app.js +0 -4
- package/dist/src/commands/dev.d.ts +6 -0
- package/dist/src/commands/dev.js +152 -3
- package/dist/src/commands/docs.js +33 -0
- package/dist/src/commands/local/act-as-local.d.ts +5 -0
- package/dist/src/commands/local/act-as-local.js +41 -0
- package/dist/src/commands/local/auth-provision.d.ts +1 -0
- package/dist/src/commands/local/auth-provision.js +1 -0
- package/dist/src/commands/local/index.js +4 -0
- package/dist/src/commands/local/local-api-key.d.ts +44 -0
- package/dist/src/commands/local/local-api-key.js +115 -0
- package/dist/src/commands/local/local-spicedb.d.ts +95 -0
- package/dist/src/commands/local/local-spicedb.js +304 -0
- package/dist/src/commands/local/publish-docs.d.ts +81 -0
- package/dist/src/commands/local/publish-docs.js +328 -0
- package/dist/src/commands/local/seed-zitadel.js +2 -0
- package/dist/src/commands/temporal.js +191 -61
- package/dist/src/commands/temporal.js.map +3 -3
- package/dist/src/docs/convert.d.ts +35 -0
- package/dist/src/docs/convert.js +276 -0
- package/dist/src/docs/preview-source.d.ts +13 -0
- package/dist/src/docs/preview-source.js +58 -0
- package/dist/src/docs/preview.d.ts +32 -0
- package/dist/src/docs/preview.js +279 -0
- package/dist/src/utils/scaffold-versions.d.ts +0 -1
- package/dist/src/utils/scaffold-versions.js +0 -1
- package/fragments/agents/AGENTS.md.hbs +27 -27
- package/fragments/base/README.md.hbs +5 -2
- package/fragments/base/index.ts.hbs +19 -33
- package/fragments/base/package.json.hbs +4 -2
- package/fragments/service/api/openapi.json.hbs +1 -1
- package/fragments/service/docs/docs.yaml.hbs +10 -0
- package/fragments/service/docs/pages/getting-started.md.hbs +6 -9
- package/package.json +19 -3
- package/skills/mesh/SKILL.md +2 -2
- package/stack/docker-compose.hub.yml +6 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import {
|
|
2
|
+
MeshCliError
|
|
3
|
+
} from "./mesh.chunk-IQOBTL42.js";
|
|
4
|
+
|
|
5
|
+
// packages/mesh-cli/src/commands/init/platform-setup.ts
|
|
6
|
+
import * as fs from "fs";
|
|
7
|
+
import * as path from "path";
|
|
8
|
+
import { execFileSync } from "child_process";
|
|
9
|
+
var PLATFORM_SETUP_DEFAULTS = {
|
|
10
|
+
env: "dev",
|
|
11
|
+
region: "us-east-2",
|
|
12
|
+
profile: "default"
|
|
13
|
+
};
|
|
14
|
+
var DOMAIN_REQUIRED_MESSAGE = "--domain is required: the core stack creates the public Route 53 zone <env>.<domain>, and a placeholder domain scaffolds a zone whose certificate can never validate, so ingress never serves HTTPS.";
|
|
15
|
+
function defaultStateBucket(tenant) {
|
|
16
|
+
return `${tenant}-mesh-platform-pulumi-state`;
|
|
17
|
+
}
|
|
18
|
+
function defaultPlatformDir(tenant) {
|
|
19
|
+
return `${tenant}-mesh-platform`;
|
|
20
|
+
}
|
|
21
|
+
function validateEnv(value) {
|
|
22
|
+
return /^[a-z][a-z0-9-]*$/.test(value.trim()) ? true : "lowercase letters, digits and dashes, starting with a letter";
|
|
23
|
+
}
|
|
24
|
+
function validateRegion(value) {
|
|
25
|
+
return /^[a-z]{2}(-[a-z]+)+-\d$/.test(value.trim()) ? true : "an AWS region, e.g. us-east-2 or eu-west-1";
|
|
26
|
+
}
|
|
27
|
+
function validateDomain(value) {
|
|
28
|
+
const domain = value.trim().toLowerCase().replace(/\.$/, "");
|
|
29
|
+
if (!domain) return "a public domain you control, e.g. q2poc.pub";
|
|
30
|
+
if (!/^(?=.{1,253}$)([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/.test(domain)) {
|
|
31
|
+
return "a public domain you control, e.g. q2poc.pub";
|
|
32
|
+
}
|
|
33
|
+
if (/(^|\.)(example\.(com|org|net)|invalid|localhost|test)$/.test(domain)) {
|
|
34
|
+
return `${domain} is a placeholder \u2014 its ACM certificate can never validate, because nobody can delegate that zone to you. Use a domain you control.`;
|
|
35
|
+
}
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
function validateStateBucket(value) {
|
|
39
|
+
const bucket = value.trim();
|
|
40
|
+
return /^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$/.test(bucket) && !bucket.includes("..") ? true : "3\u201363 characters: lowercase letters, digits, dots and dashes, starting and ending alphanumeric";
|
|
41
|
+
}
|
|
42
|
+
function resolveTargetDir(tenant, flags, cwd) {
|
|
43
|
+
const dir = path.resolve(cwd, flags.dir ?? defaultPlatformDir(tenant));
|
|
44
|
+
if (fs.existsSync(dir) && fs.readdirSync(dir).length > 0) {
|
|
45
|
+
throw new MeshCliError(`Target directory is not empty: ${dir}`, {
|
|
46
|
+
remediation: { command: `mesh init platform ${tenant} --dir <empty-dir>` }
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return dir;
|
|
50
|
+
}
|
|
51
|
+
async function resolvePlatformSetup(tenant, flags, deps) {
|
|
52
|
+
const cwd = deps.cwd ?? process.cwd();
|
|
53
|
+
const dir = resolveTargetDir(tenant, flags, cwd);
|
|
54
|
+
const ask = deps.interactive && !flags.yes ? deps.prompts : void 0;
|
|
55
|
+
const env = flags.env ?? (ask ? await ask.input({ message: "Environment", default: PLATFORM_SETUP_DEFAULTS.env, validate: validateEnv }) : PLATFORM_SETUP_DEFAULTS.env);
|
|
56
|
+
if (validateEnv(env) !== true) throw new MeshCliError(`Invalid environment '${env}' \u2014 ${validateEnv(env)}.`);
|
|
57
|
+
const region = flags.region ?? (ask ? await ask.input({ message: "AWS region", default: PLATFORM_SETUP_DEFAULTS.region, validate: validateRegion }) : PLATFORM_SETUP_DEFAULTS.region);
|
|
58
|
+
if (validateRegion(region) !== true) throw new MeshCliError(`Invalid region '${region}' \u2014 ${validateRegion(region)}.`);
|
|
59
|
+
let domain = flags.domain;
|
|
60
|
+
if (domain === void 0) {
|
|
61
|
+
if (!ask) throw new MeshCliError(DOMAIN_REQUIRED_MESSAGE, { remediation: { command: `mesh init platform ${tenant} --domain <your-domain>` } });
|
|
62
|
+
domain = await ask.input({
|
|
63
|
+
message: `Public base domain (the core stack creates the Route 53 zone ${env}.<domain>; its NS records must be delegated from the parent before the deploy can finish)`,
|
|
64
|
+
validate: validateDomain
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
const domainCheck = validateDomain(domain);
|
|
68
|
+
if (domainCheck !== true) throw new MeshCliError(`Invalid --domain '${domain}' \u2014 ${domainCheck}`);
|
|
69
|
+
domain = domain.trim().toLowerCase().replace(/\.$/, "");
|
|
70
|
+
const profile = flags.profile ?? (ask ? await ask.input({ message: "AWS profile the stack config references", default: PLATFORM_SETUP_DEFAULTS.profile }) : PLATFORM_SETUP_DEFAULTS.profile);
|
|
71
|
+
const bucketDefault = defaultStateBucket(tenant);
|
|
72
|
+
const stateBucket = flags.stateBucket ?? (ask ? await ask.input({ message: "Pulumi state S3 bucket (holds this platform's state \u2014 created below if it does not exist)", default: bucketDefault, validate: validateStateBucket }) : bucketDefault);
|
|
73
|
+
const bucketCheck = validateStateBucket(stateBucket);
|
|
74
|
+
if (bucketCheck !== true) throw new MeshCliError(`Invalid --state-bucket '${stateBucket}' \u2014 ${bucketCheck}`);
|
|
75
|
+
let createStateBucket = flags.createStateBucket ?? false;
|
|
76
|
+
if (flags.createStateBucket === void 0 && ask) {
|
|
77
|
+
createStateBucket = await ask.confirm({
|
|
78
|
+
message: `Create s3://${stateBucket} in ${region} now (versioned), if it does not exist?`,
|
|
79
|
+
default: true
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
tenant,
|
|
84
|
+
env,
|
|
85
|
+
region,
|
|
86
|
+
domain,
|
|
87
|
+
profile,
|
|
88
|
+
stateBucket: stateBucket.trim(),
|
|
89
|
+
dir,
|
|
90
|
+
createStateBucket
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function stateBucketCreateCommand(setup) {
|
|
94
|
+
const location = setup.region === "us-east-1" ? "" : ` --create-bucket-configuration LocationConstraint=${setup.region}`;
|
|
95
|
+
return `aws s3api create-bucket --bucket ${setup.stateBucket} --region ${setup.region}${location} --profile ${setup.profile}`;
|
|
96
|
+
}
|
|
97
|
+
function awsJson(args, profile) {
|
|
98
|
+
return execFileSync("aws", [...args, "--profile", profile], {
|
|
99
|
+
encoding: "utf8",
|
|
100
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
var realStateBucketDeps = {
|
|
104
|
+
headBucket(setup) {
|
|
105
|
+
try {
|
|
106
|
+
awsJson(["s3api", "head-bucket", "--bucket", setup.stateBucket, "--region", setup.region], setup.profile);
|
|
107
|
+
return true;
|
|
108
|
+
} catch {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
createBucket(setup) {
|
|
113
|
+
const args = ["s3api", "create-bucket", "--bucket", setup.stateBucket, "--region", setup.region];
|
|
114
|
+
if (setup.region !== "us-east-1") args.push("--create-bucket-configuration", `LocationConstraint=${setup.region}`);
|
|
115
|
+
awsJson(args, setup.profile);
|
|
116
|
+
},
|
|
117
|
+
enableVersioning(setup) {
|
|
118
|
+
awsJson(
|
|
119
|
+
["s3api", "put-bucket-versioning", "--bucket", setup.stateBucket, "--region", setup.region, "--versioning-configuration", "Status=Enabled"],
|
|
120
|
+
setup.profile
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
async function ensureStateBucket(setup, deps = realStateBucketDeps) {
|
|
125
|
+
if (!setup.createStateBucket) {
|
|
126
|
+
return { created: false, present: false, detail: "not requested" };
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
if (deps.headBucket(setup)) {
|
|
130
|
+
return { created: false, present: true, detail: `s3://${setup.stateBucket} already exists` };
|
|
131
|
+
}
|
|
132
|
+
} catch {
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
deps.createBucket(setup);
|
|
136
|
+
} catch (err) {
|
|
137
|
+
const why = errorDetail(err);
|
|
138
|
+
return { created: false, present: false, detail: `could not create s3://${setup.stateBucket} \u2014 ${why}` };
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
deps.enableVersioning(setup);
|
|
142
|
+
return { created: true, present: true, detail: `created s3://${setup.stateBucket} in ${setup.region} (versioning on)` };
|
|
143
|
+
} catch (err) {
|
|
144
|
+
return { created: true, present: true, detail: `created s3://${setup.stateBucket} in ${setup.region}, but versioning could not be enabled \u2014 ${errorDetail(err)}` };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function errorDetail(err) {
|
|
148
|
+
const stderr = err && typeof err === "object" && "stderr" in err ? String(err.stderr ?? "") : "";
|
|
149
|
+
const text = stderr.trim() || (err instanceof Error ? err.message : String(err));
|
|
150
|
+
return text.split("\n").filter(Boolean).slice(-1)[0] ?? "unknown error";
|
|
151
|
+
}
|
|
152
|
+
function exportCredentialsCommand(profile) {
|
|
153
|
+
return `eval "$(aws configure export-credentials --profile ${profile} --format env)" # mesh deploy reads AWS_ACCESS_KEY_ID; a platform stack carries no mesh:deployerRole`;
|
|
154
|
+
}
|
|
155
|
+
function renderPlatformNextSteps(setup, opts = {}) {
|
|
156
|
+
const dir = opts.relativeDir ?? setup.dir;
|
|
157
|
+
const steps = [];
|
|
158
|
+
if (!opts.bucket?.present) {
|
|
159
|
+
steps.push(`${stateBucketCreateCommand(setup)} # the Pulumi state bucket, once`);
|
|
160
|
+
}
|
|
161
|
+
steps.push(
|
|
162
|
+
`cd ${dir}`,
|
|
163
|
+
"pnpm install",
|
|
164
|
+
`aws sso login --profile ${setup.profile} # if this profile is SSO`,
|
|
165
|
+
exportCredentialsCommand(setup.profile),
|
|
166
|
+
`cd core && mesh deploy up # the VPC, EKS, RDS and the public zone ${setup.env}.${setup.domain}`,
|
|
167
|
+
`# \u2192 then delegate the NS records of ${setup.env}.${setup.domain} from ${setup.domain} at your registrar; the deploy stops at the mesh-gateway Ingress until ACM issues the certificate, then continues`,
|
|
168
|
+
"cd ../platform && mesh deploy up # Temporal, Zitadel, the Hub (needs Docker \u2014 it builds service images)",
|
|
169
|
+
`mesh login ${setup.tenant}.${setup.env} # your platform sign-in, once it is up`,
|
|
170
|
+
"",
|
|
171
|
+
"Then, in your apps repo, for the hello-world app:",
|
|
172
|
+
` mesh init --tenant ${setup.tenant} --platform ${setup.env}`,
|
|
173
|
+
" mesh create-app --name hello --primitives service",
|
|
174
|
+
" mesh deploy up # from the app directory"
|
|
175
|
+
);
|
|
176
|
+
return steps;
|
|
177
|
+
}
|
|
178
|
+
async function scaffoldPlatformRepo(setup) {
|
|
179
|
+
if (fs.existsSync(setup.dir) && fs.readdirSync(setup.dir).length > 0) {
|
|
180
|
+
throw new MeshCliError(`Target directory is not empty: ${setup.dir}`, {
|
|
181
|
+
remediation: { command: `mesh init platform ${setup.tenant} --dir <empty-dir>` }
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
const { copyTemplate } = await import("./mesh.create-app-NGXACFAU.js");
|
|
185
|
+
const { findPackageRoot } = await import("./mesh.stack-EFTFAOCV.js");
|
|
186
|
+
const { syncSkills } = await import("./mesh.skills-MNDSMBIE.js");
|
|
187
|
+
const templateDir = path.join(findPackageRoot(), "templates", "platform-repo");
|
|
188
|
+
fs.mkdirSync(setup.dir, { recursive: true });
|
|
189
|
+
copyTemplate(templateDir, setup.dir, {
|
|
190
|
+
tenant: setup.tenant,
|
|
191
|
+
env: setup.env,
|
|
192
|
+
region: setup.region,
|
|
193
|
+
domain: setup.domain,
|
|
194
|
+
profile: setup.profile,
|
|
195
|
+
stateBucket: setup.stateBucket
|
|
196
|
+
});
|
|
197
|
+
syncSkills(setup.dir);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export {
|
|
201
|
+
PLATFORM_SETUP_DEFAULTS,
|
|
202
|
+
DOMAIN_REQUIRED_MESSAGE,
|
|
203
|
+
defaultStateBucket,
|
|
204
|
+
defaultPlatformDir,
|
|
205
|
+
validateEnv,
|
|
206
|
+
validateRegion,
|
|
207
|
+
validateDomain,
|
|
208
|
+
validateStateBucket,
|
|
209
|
+
resolveTargetDir,
|
|
210
|
+
resolvePlatformSetup,
|
|
211
|
+
stateBucketCreateCommand,
|
|
212
|
+
realStateBucketDeps,
|
|
213
|
+
ensureStateBucket,
|
|
214
|
+
exportCredentialsCommand,
|
|
215
|
+
renderPlatformNextSteps,
|
|
216
|
+
scaffoldPlatformRepo
|
|
217
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/commands/init/platform-setup.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// packages/mesh-cli/src/utils/log.ts
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
function logPrefix(opts) {
|
|
4
|
+
const enabled = opts.envFlag === "1" || opts.envFlag !== "0" && !opts.isTTY;
|
|
5
|
+
return enabled ? `[${opts.now.toISOString().slice(11, 19)}] ` : "";
|
|
6
|
+
}
|
|
7
|
+
function prefix() {
|
|
8
|
+
return chalk.dim(
|
|
9
|
+
logPrefix({
|
|
10
|
+
isTTY: !!process.stderr.isTTY,
|
|
11
|
+
envFlag: process.env.MESH_LOG_TIMESTAMPS,
|
|
12
|
+
now: /* @__PURE__ */ new Date()
|
|
13
|
+
})
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
function logInfo(message) {
|
|
17
|
+
console.error(prefix() + chalk.blue("\u2139"), message);
|
|
18
|
+
}
|
|
19
|
+
function logSuccess(message) {
|
|
20
|
+
console.error(prefix() + chalk.green("\u2713"), message);
|
|
21
|
+
}
|
|
22
|
+
function logWarn(message) {
|
|
23
|
+
console.error(prefix() + chalk.yellow("\u26A0"), message);
|
|
24
|
+
}
|
|
25
|
+
function logError(message) {
|
|
26
|
+
console.error(prefix() + chalk.red("\u2717"), message);
|
|
27
|
+
}
|
|
28
|
+
function formatElapsed(ms) {
|
|
29
|
+
const totalSec = Math.max(0, Math.round(ms / 1e3));
|
|
30
|
+
const h = Math.floor(totalSec / 3600);
|
|
31
|
+
const m = Math.floor(totalSec % 3600 / 60);
|
|
32
|
+
const s = totalSec % 60;
|
|
33
|
+
if (h > 0) return `${h}h ${m}m`;
|
|
34
|
+
if (m > 0) return `${m}m ${s}s`;
|
|
35
|
+
return `${s}s`;
|
|
36
|
+
}
|
|
37
|
+
function startHeartbeat(label, intervalMs = 15e3) {
|
|
38
|
+
const startedAt = Date.now();
|
|
39
|
+
let lastOutputAt = startedAt;
|
|
40
|
+
const timer = setInterval(() => {
|
|
41
|
+
if (Date.now() - lastOutputAt < intervalMs) return;
|
|
42
|
+
logInfo(`\u2026 still working: ${label} (${formatElapsed(Date.now() - startedAt)} elapsed)`);
|
|
43
|
+
}, intervalMs);
|
|
44
|
+
timer.unref?.();
|
|
45
|
+
return {
|
|
46
|
+
stop: () => clearInterval(timer),
|
|
47
|
+
touch: () => {
|
|
48
|
+
lastOutputAt = Date.now();
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export {
|
|
54
|
+
logInfo,
|
|
55
|
+
logSuccess,
|
|
56
|
+
logWarn,
|
|
57
|
+
logError,
|
|
58
|
+
startHeartbeat
|
|
59
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/log.ts"],
|
|
4
|
+
"mappings": ";AASA,OAAO,WAAW;AAMX,SAAS,UAAU,MAIf;AACT,QAAM,UAAU,KAAK,YAAY,OAAQ,KAAK,YAAY,OAAO,CAAC,KAAK;AACvE,SAAO,UAAU,IAAI,KAAK,IAAI,YAAY,EAAE,MAAM,IAAI,EAAE,CAAC,OAAO;AAClE;AAEA,SAAS,SAAiB;AACxB,SAAO,MAAM;AAAA,IACX,UAAU;AAAA,MACR,OAAO,CAAC,CAAC,QAAQ,OAAO;AAAA,MACxB,SAAS,QAAQ,IAAI;AAAA,MACrB,KAAK,oBAAI,KAAK;AAAA,IAChB,CAAC;AAAA,EACH;AACF;AAEO,SAAS,QAAQ,SAAuB;AAC7C,UAAQ,MAAM,OAAO,IAAI,MAAM,KAAK,QAAG,GAAG,OAAO;AACnD;AAEO,SAAS,WAAW,SAAuB;AAChD,UAAQ,MAAM,OAAO,IAAI,MAAM,MAAM,QAAG,GAAG,OAAO;AACpD;AAEO,SAAS,QAAQ,SAAuB;AAC7C,UAAQ,MAAM,OAAO,IAAI,MAAM,OAAO,QAAG,GAAG,OAAO;AACrD;AAEO,SAAS,SAAS,SAAuB;AAC9C,UAAQ,MAAM,OAAO,IAAI,MAAM,IAAI,QAAG,GAAG,OAAO;AAClD;AAGO,SAAS,cAAc,IAAoB;AAChD,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,GAAI,CAAC;AAClD,QAAM,IAAI,KAAK,MAAM,WAAW,IAAI;AACpC,QAAM,IAAI,KAAK,MAAO,WAAW,OAAQ,EAAE;AAC3C,QAAM,IAAI,WAAW;AACrB,MAAI,IAAI,EAAG,QAAO,GAAG,CAAC,KAAK,CAAC;AAC5B,MAAI,IAAI,EAAG,QAAO,GAAG,CAAC,KAAK,CAAC;AAC5B,SAAO,GAAG,CAAC;AACb;AAQO,SAAS,eACd,OACA,aAAa,MAC4B;AACzC,QAAM,YAAY,KAAK,IAAI;AAC3B,MAAI,eAAe;AACnB,QAAM,QAAQ,YAAY,MAAM;AAC9B,QAAI,KAAK,IAAI,IAAI,eAAe,WAAY;AAC5C,YAAQ,yBAAoB,KAAK,KAAK,cAAc,KAAK,IAAI,IAAI,SAAS,CAAC,WAAW;AAAA,EACxF,GAAG,UAAU;AACb,QAAM,QAAQ;AACd,SAAO;AAAA,IACL,MAAM,MAAM,cAAc,KAAK;AAAA,IAC/B,OAAO,MAAM;AACX,qBAAe,KAAK,IAAI;AAAA,IAC1B;AAAA,EACF;AACF;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// packages/mesh-cli/src/docs/cli-reference.ts
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
function currentMachinePaths() {
|
|
4
|
+
return { homeDir: os.homedir(), tmpDir: os.tmpdir() };
|
|
5
|
+
}
|
|
6
|
+
function normalizeMachinePaths(value, paths) {
|
|
7
|
+
const candidates = [
|
|
8
|
+
{ prefix: paths.tmpDir, symbol: "$TMPDIR" },
|
|
9
|
+
{ prefix: paths.homeDir, symbol: "~" }
|
|
10
|
+
];
|
|
11
|
+
const substitutions = candidates.filter((candidate) => candidate.prefix && candidate.prefix !== "/").sort((a, b) => b.prefix.length - a.prefix.length);
|
|
12
|
+
for (const { prefix, symbol } of substitutions) {
|
|
13
|
+
if (value === prefix) return symbol;
|
|
14
|
+
if (value.startsWith(`${prefix}/`)) return symbol + value.slice(prefix.length);
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
function formatDefault(value, paths = currentMachinePaths()) {
|
|
19
|
+
if (value === void 0 || value === null) return void 0;
|
|
20
|
+
if (typeof value === "string") return normalizeMachinePaths(value, paths);
|
|
21
|
+
if (typeof value === "boolean" || typeof value === "number") return String(value);
|
|
22
|
+
return normalizeMachinePaths(JSON.stringify(value), paths);
|
|
23
|
+
}
|
|
24
|
+
function slugifyCommandPath(path) {
|
|
25
|
+
return path.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
26
|
+
}
|
|
27
|
+
function extractOptions(command) {
|
|
28
|
+
const options = command.options ?? [];
|
|
29
|
+
return options.map((option) => option).filter((option) => !option.hidden).map((option) => {
|
|
30
|
+
const ref = {
|
|
31
|
+
flags: option.flags ?? "",
|
|
32
|
+
description: option.description ?? "",
|
|
33
|
+
required: Boolean(option.mandatory ?? option.required ?? false)
|
|
34
|
+
};
|
|
35
|
+
const rendered = formatDefault(option.defaultValue);
|
|
36
|
+
if (rendered !== void 0) ref.defaultValue = rendered;
|
|
37
|
+
if (option.argChoices?.length) ref.choices = [...option.argChoices];
|
|
38
|
+
return ref;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function extractArgs(command) {
|
|
42
|
+
const internals = command;
|
|
43
|
+
const declared = internals.registeredArguments ?? internals._args ?? [];
|
|
44
|
+
if (!Array.isArray(declared) || declared.length === 0) return "";
|
|
45
|
+
return declared.map((argument) => {
|
|
46
|
+
const arg = argument;
|
|
47
|
+
const name = typeof arg.name === "function" ? arg.name() : "arg";
|
|
48
|
+
const spread = arg.variadic ? "..." : "";
|
|
49
|
+
return arg.required ? `<${name}${spread}>` : `[${name}${spread}]`;
|
|
50
|
+
}).join(" ");
|
|
51
|
+
}
|
|
52
|
+
function isUndocumented(command) {
|
|
53
|
+
const internals = command;
|
|
54
|
+
return internals._name === "help" || internals._hidden === true;
|
|
55
|
+
}
|
|
56
|
+
function extractCommand(command, parentPath, depth) {
|
|
57
|
+
const internals = command;
|
|
58
|
+
const name = internals._name ?? "";
|
|
59
|
+
const path = parentPath ? `${parentPath} ${name}` : name;
|
|
60
|
+
return {
|
|
61
|
+
path,
|
|
62
|
+
name,
|
|
63
|
+
aliases: [...internals._aliases ?? []],
|
|
64
|
+
description: internals._description ?? "",
|
|
65
|
+
args: extractArgs(command),
|
|
66
|
+
options: extractOptions(command),
|
|
67
|
+
slug: slugifyCommandPath(path),
|
|
68
|
+
depth,
|
|
69
|
+
subcommands: (internals.commands ?? []).filter((child) => !isUndocumented(child)).map((child) => extractCommand(child, path, depth + 1))
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function extractCliReference(program) {
|
|
73
|
+
const internals = program;
|
|
74
|
+
const rootName = internals._name ?? "mesh";
|
|
75
|
+
return {
|
|
76
|
+
name: rootName,
|
|
77
|
+
description: internals._description ?? "",
|
|
78
|
+
options: extractOptions(program).filter(
|
|
79
|
+
(option) => !/(^|\s)(-V|--version)(\s|,|$)/.test(option.flags)
|
|
80
|
+
),
|
|
81
|
+
commands: (internals.commands ?? []).filter((child) => !isUndocumented(child)).map((child) => extractCommand(child, rootName, 1))
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function flattenCommands(reference) {
|
|
85
|
+
const flat = [];
|
|
86
|
+
const visit = (command) => {
|
|
87
|
+
flat.push(command);
|
|
88
|
+
command.subcommands.forEach(visit);
|
|
89
|
+
};
|
|
90
|
+
reference.commands.forEach(visit);
|
|
91
|
+
return flat;
|
|
92
|
+
}
|
|
93
|
+
function cell(text) {
|
|
94
|
+
return text.replace(/\\/g, "\\\\").replace(/\|/g, "\\|").replace(/\r?\n/g, " ").trim();
|
|
95
|
+
}
|
|
96
|
+
function renderOptionsTable(options) {
|
|
97
|
+
if (options.length === 0) return [];
|
|
98
|
+
const lines = ["| Option | Description | Default |", "| --- | --- | --- |"];
|
|
99
|
+
for (const option of options) {
|
|
100
|
+
const notes = [];
|
|
101
|
+
if (option.required) notes.push("**required**");
|
|
102
|
+
if (option.choices?.length) notes.push(`one of: ${option.choices.join(", ")}`);
|
|
103
|
+
const description = [cell(option.description), ...notes].filter(Boolean).join(" \u2014 ");
|
|
104
|
+
const defaultValue = option.defaultValue === void 0 ? "" : `\`${cell(option.defaultValue)}\``;
|
|
105
|
+
lines.push(`| \`${cell(option.flags)}\` | ${description} | ${defaultValue} |`);
|
|
106
|
+
}
|
|
107
|
+
lines.push("");
|
|
108
|
+
return lines;
|
|
109
|
+
}
|
|
110
|
+
function renderCommand(command) {
|
|
111
|
+
const heading = "#".repeat(Math.min(command.depth + 1, 4));
|
|
112
|
+
const usage = [command.path, command.options.length > 0 ? "[options]" : "", command.args].filter(Boolean).join(" ");
|
|
113
|
+
const lines = [`${heading} \`${command.path}\``, ""];
|
|
114
|
+
if (command.description) lines.push(command.description, "");
|
|
115
|
+
if (command.aliases.length > 0) {
|
|
116
|
+
lines.push(`Alias: ${command.aliases.map((alias) => `\`${alias}\``).join(", ")}`, "");
|
|
117
|
+
}
|
|
118
|
+
lines.push("```bash", usage, "```", "");
|
|
119
|
+
lines.push(...renderOptionsTable(command.options));
|
|
120
|
+
command.subcommands.forEach((child) => lines.push(...renderCommand(child)));
|
|
121
|
+
return lines;
|
|
122
|
+
}
|
|
123
|
+
function renderCliReferenceMarkdown(reference) {
|
|
124
|
+
const lines = [
|
|
125
|
+
"<!--",
|
|
126
|
+
" GENERATED FILE \u2014 do not edit by hand.",
|
|
127
|
+
" Source: the commander tree in packages/mesh-cli/src/program.ts",
|
|
128
|
+
" Rebuild: pnpm exec mesh docs cli-reference",
|
|
129
|
+
"-->",
|
|
130
|
+
"",
|
|
131
|
+
"# `mesh` CLI reference",
|
|
132
|
+
"",
|
|
133
|
+
reference.description,
|
|
134
|
+
"",
|
|
135
|
+
"Every command below is generated from the CLI's own command tree, so this",
|
|
136
|
+
"page cannot drift from the binary you have installed. Run any command with",
|
|
137
|
+
"`--help` for the same information at the terminal.",
|
|
138
|
+
""
|
|
139
|
+
];
|
|
140
|
+
lines.push(...renderOptionsTable(reference.options));
|
|
141
|
+
lines.push("## Commands", "");
|
|
142
|
+
for (const command of reference.commands) {
|
|
143
|
+
const summary = cell(command.description) || "\u2014";
|
|
144
|
+
lines.push(`- [\`${command.path}\`](#${command.slug}) \u2014 ${summary}`);
|
|
145
|
+
}
|
|
146
|
+
lines.push("");
|
|
147
|
+
reference.commands.forEach((command) => lines.push(...renderCommand(command)));
|
|
148
|
+
return `${lines.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd()}
|
|
149
|
+
`;
|
|
150
|
+
}
|
|
151
|
+
export {
|
|
152
|
+
extractCliReference,
|
|
153
|
+
flattenCommands,
|
|
154
|
+
formatDefault,
|
|
155
|
+
normalizeMachinePaths,
|
|
156
|
+
renderCliReferenceMarkdown,
|
|
157
|
+
slugifyCommandPath
|
|
158
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/docs/cli-reference.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|