@m2s2/cli 0.1.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/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ /node_modules
2
+
package/README.md ADDED
@@ -0,0 +1,366 @@
1
+ # m2s2-cli
2
+
3
+ The official CLI for scaffolding and working with [M²S²](https://github.com/M2S2-Engineering-Group) design system projects. Create new React or Angular applications pre-wired with M²S² components, generate components, and keep your installation up to date — all from the terminal.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Installation](#installation)
8
+ - [Commands](#commands)
9
+ - [new](#m2s2-new)
10
+ - [generate component](#m2s2-generate-component)
11
+ - [upgrade](#m2s2-upgrade)
12
+ - [Building from Source](#building-from-source)
13
+ - [Testing](#testing)
14
+ - [Project Structure](#project-structure)
15
+ - [Workflows](#workflows)
16
+ - [Contributing](#contributing)
17
+
18
+ ---
19
+
20
+ ## Installation
21
+
22
+ ### Shell installer (macOS / Linux)
23
+
24
+ ```bash
25
+ curl --proto '=https' --tlsv1.2 -LsSf \
26
+ https://github.com/M2S2-Engineering-Group/m2s2-cli/releases/latest/download/m2s2-cli-installer.sh | sh
27
+ ```
28
+
29
+ ### PowerShell (Windows)
30
+
31
+ ```powershell
32
+ irm https://github.com/M2S2-Engineering-Group/m2s2-cli/releases/latest/download/m2s2-cli-installer.ps1 | iex
33
+ ```
34
+
35
+ ### npm / npx
36
+
37
+ ```bash
38
+ # Install globally
39
+ npm install -g @m2s2/cli
40
+
41
+ # Or run without installing
42
+ npx @m2s2/cli new my-app
43
+ ```
44
+
45
+ ### Cargo
46
+
47
+ ```bash
48
+ cargo install m2s2-cli
49
+ ```
50
+
51
+ ### Verify installation
52
+
53
+ ```bash
54
+ m2s2 --version
55
+ ```
56
+
57
+ ---
58
+
59
+ ## Commands
60
+
61
+ ### `m2s2 new`
62
+
63
+ Scaffold a new project pre-configured with the M²S² design system.
64
+
65
+ ```bash
66
+ m2s2 new <name> [OPTIONS]
67
+ ```
68
+
69
+ **Arguments**
70
+
71
+ | Argument | Description |
72
+ |----------|-------------|
73
+ | `<name>` | Project directory name |
74
+
75
+ **Options**
76
+
77
+ | Flag | Description |
78
+ |------|-------------|
79
+ | `--framework <react\|angular>` | Framework to scaffold. Prompted interactively if omitted. |
80
+ | `--skip-install` | Skip running `npm install` after writing project files. |
81
+
82
+ **Examples**
83
+
84
+ ```bash
85
+ # Interactive framework selection
86
+ m2s2 new my-app
87
+
88
+ # Explicit framework
89
+ m2s2 new my-app --framework react
90
+ m2s2 new my-app --framework angular
91
+
92
+ # Skip npm install (useful in CI or offline environments)
93
+ m2s2 new my-app --framework react --skip-install
94
+ ```
95
+
96
+ **What gets generated**
97
+
98
+ *React*
99
+ ```
100
+ my-app/
101
+ ├── src/
102
+ │ ├── main.tsx # BrowserRouter + M2S2Provider
103
+ │ ├── App.tsx # Navbar + Footer wired with M²S² configs
104
+ │ └── App.scss
105
+ ├── index.html
106
+ ├── package.json # @m2s2/react-lib, @m2s2/tokens, Vite, TypeScript
107
+ ├── vite.config.ts
108
+ ├── tsconfig.json
109
+ └── .gitignore
110
+ ```
111
+
112
+ *Angular*
113
+ ```
114
+ my-app/
115
+ ├── src/
116
+ │ ├── main.ts
117
+ │ ├── styles.scss
118
+ │ ├── index.html
119
+ │ └── app/
120
+ │ ├── app.component.ts # Standalone, imports NavbarComponent + FooterComponent
121
+ │ ├── app.component.html
122
+ │ ├── app.component.scss
123
+ │ ├── app.routes.ts
124
+ │ └── app.config.ts
125
+ ├── package.json # @m2s2/ng-lib, @m2s2/tokens, Angular 21
126
+ ├── angular.json
127
+ ├── tsconfig.json
128
+ ├── tsconfig.app.json
129
+ └── .gitignore
130
+ ```
131
+
132
+ ---
133
+
134
+ ### `m2s2 generate component`
135
+
136
+ Scaffold a new component inside an existing M²S² project.
137
+
138
+ ```bash
139
+ m2s2 generate component <name> [OPTIONS]
140
+ ```
141
+
142
+ Run this command from your project root. The framework is detected automatically by reading `package.json` — no flag needed if your project was created with `m2s2 new`.
143
+
144
+ **Arguments**
145
+
146
+ | Argument | Description |
147
+ |----------|-------------|
148
+ | `<name>` | Component name. Accepts any casing — `MyCard`, `my-card`, and `myCard` all produce the same output. |
149
+
150
+ **Options**
151
+
152
+ | Flag | Description |
153
+ |------|-------------|
154
+ | `--framework <react\|angular>` | Override framework detection. |
155
+ | `--path <dir>` | Override the output directory. A subdirectory named after the component is always created inside `<dir>`. |
156
+
157
+ **Examples**
158
+
159
+ ```bash
160
+ # Auto-detect framework from package.json
161
+ m2s2 generate component HeroSection
162
+
163
+ # Kebab-case input — same result
164
+ m2s2 generate component hero-section
165
+
166
+ # Override output directory
167
+ m2s2 generate component HeroSection --path src/features
168
+
169
+ # Override framework
170
+ m2s2 generate component HeroSection --framework angular
171
+ ```
172
+
173
+ **What gets generated**
174
+
175
+ *React* — written to `src/components/<Name>/`
176
+ ```
177
+ src/components/HeroSection/
178
+ ├── HeroSection.tsx # Typed props interface, BEM className application
179
+ ├── HeroSection.scss # Scoped class stub (.hero-section)
180
+ └── index.ts # Barrel re-export
181
+ ```
182
+
183
+ *Angular* — written to `src/app/components/<name>/`
184
+ ```
185
+ src/app/components/hero-section/
186
+ ├── hero-section.component.ts # Standalone component, app-hero-section selector
187
+ ├── hero-section.component.html # BEM wrapper div
188
+ └── hero-section.component.scss # Scoped class stub (.hero-section)
189
+ ```
190
+
191
+ ---
192
+
193
+ ### `m2s2 upgrade`
194
+
195
+ Check for and install a newer version of the CLI.
196
+
197
+ ```bash
198
+ m2s2 upgrade [OPTIONS]
199
+ ```
200
+
201
+ **Options**
202
+
203
+ | Flag | Description |
204
+ |------|-------------|
205
+ | `--check` | Print available version without installing. |
206
+
207
+ **Examples**
208
+
209
+ ```bash
210
+ # Check if an update is available
211
+ m2s2 upgrade --check
212
+
213
+ # Download and install the latest version
214
+ m2s2 upgrade
215
+ ```
216
+
217
+ The upgrade command hits the GitHub Releases API, compares the latest release tag against the running binary version, and — if a newer version exists — runs the official installer script for your platform. Restart your terminal after upgrading.
218
+
219
+ ---
220
+
221
+ ## Building from Source
222
+
223
+ **Prerequisites:** Rust 1.85+ (edition 2024), Node.js 18+ for running scaffolded projects.
224
+
225
+ ```bash
226
+ git clone https://github.com/M2S2-Engineering-Group/m2s2-cli.git
227
+ cd m2s2-cli
228
+
229
+ # Debug build
230
+ cargo build
231
+
232
+ # Run directly
233
+ cargo run -- new my-app --framework react --skip-install
234
+
235
+ # Optimised release build (matches the distributed binary)
236
+ cargo build --profile dist
237
+ ```
238
+
239
+ The binary is written to `target/debug/m2s2` (debug) or `target/dist/m2s2` (dist profile).
240
+
241
+ ### Templates
242
+
243
+ All scaffold and generate templates live under `templates/` and are embedded into the binary at compile time via [`rust-embed`](https://github.com/pyros2097/rust-embed). Changes to template files require a rebuild to take effect.
244
+
245
+ ```
246
+ templates/
247
+ ├── react/ # m2s2 new --framework react
248
+ ├── angular/ # m2s2 new --framework angular
249
+ └── generate/
250
+ ├── react/ # m2s2 generate component (React)
251
+ └── angular/ # m2s2 generate component (Angular)
252
+ ```
253
+
254
+ ---
255
+
256
+ ## Testing
257
+
258
+ ```bash
259
+ # Run all tests
260
+ cargo test
261
+
262
+ # Lint
263
+ cargo clippy -- -D warnings
264
+
265
+ # Format check
266
+ cargo fmt --check
267
+ ```
268
+
269
+ End-to-end smoke test (no npm install required):
270
+
271
+ ```bash
272
+ # Scaffold a React project and inspect the output
273
+ cargo run -- new test-app --framework react --skip-install
274
+ find test-app -type f
275
+
276
+ # Generate a component inside it
277
+ cd test-app
278
+ ../target/debug/m2s2 generate component MyCard
279
+ ```
280
+
281
+ ---
282
+
283
+ ## Project Structure
284
+
285
+ ```
286
+ src/
287
+ ├── main.rs # CLI entry point, command routing
288
+ ├── scaffold/
289
+ │ └── mod.rs # Template engine (rust-embed + Handlebars)
290
+ └── commands/
291
+ ├── mod.rs
292
+ ├── new.rs # m2s2 new
293
+ ├── upgrade.rs # m2s2 upgrade
294
+ └── generate/
295
+ ├── mod.rs # m2s2 generate (subcommand router)
296
+ └── component.rs # m2s2 generate component
297
+ ```
298
+
299
+ ---
300
+
301
+ ## Workflows
302
+
303
+ ### CI (`ci.yml`)
304
+
305
+ Runs on every push to `main` and every pull request.
306
+
307
+ | Job | Description |
308
+ |-----|-------------|
309
+ | `build` | Compiles the crate for macOS (arm64), Linux (x86_64), and Windows (x86_64) in a matrix. |
310
+ | `test` | Runs `cargo test` on Linux. |
311
+ | `clippy` | Runs `cargo clippy -- -D warnings`. |
312
+ | `fmt` | Runs `cargo fmt --check`. |
313
+
314
+ ### Release (`release-plz.yml` + `release.yml`)
315
+
316
+ Releases are fully automated from conventional commits — no manual tagging required.
317
+
318
+ 1. **Merge to `main`** — `release-plz` reads conventional commit history and opens a Release PR with a bumped version and generated CHANGELOG.
319
+ 2. **Merge the Release PR** — `release-plz` pushes the version tag and publishes the crate to **crates.io**.
320
+ 3. **Tag push** — `release.yml` (cargo-dist) triggers and builds platform binaries in parallel:
321
+ - `aarch64-apple-darwin`
322
+ - `x86_64-apple-darwin`
323
+ - `aarch64-unknown-linux-gnu`
324
+ - `x86_64-unknown-linux-gnu`
325
+ - `x86_64-pc-windows-msvc`
326
+ 4. **GitHub Release created** — all binaries, checksums, shell installer, and PowerShell installer are attached.
327
+ 5. **`publish-npm.yml` triggers** — publishes `@m2s2/cli` to npm.
328
+
329
+ ### Template Sync (`template-sync.yml`)
330
+
331
+ Keeps scaffold template dependencies in sync with the latest published M²S² library versions.
332
+
333
+ Triggers:
334
+ - **Weekly** — every Monday at 08:00 UTC.
335
+ - **`repository_dispatch`** — fired automatically by the design system CI whenever `@m2s2/react-lib`, `@m2s2/ng-lib`, or `@m2s2/tokens` publishes a new release.
336
+
337
+ When a version change is detected, the workflow opens a pull request updating the pinned package versions in `templates/react/package.json.hbs` and `templates/angular/package.json.hbs`. Merging that PR flows through the normal release pipeline.
338
+
339
+ ### Required Repository Secrets
340
+
341
+ | Secret | Used By | Description |
342
+ |--------|---------|-------------|
343
+ | `APP_ID` | `release-plz.yml` | GitHub App ID for bypassing branch protection on release commits. |
344
+ | `APP_PRIVATE_KEY` | `release-plz.yml` | GitHub App private key. |
345
+ | `NPM_TOKEN` | `publish-npm.yml` | npm access token with publish rights to the `@m2s2` scope. |
346
+ | `CARGO_REGISTRY_TOKEN` | `release-plz.yml` | crates.io API token for publishing `m2s2-cli`. |
347
+
348
+ ---
349
+
350
+ ## Contributing
351
+
352
+ Commit messages follow the [Conventional Commits](https://www.conventionalcommits.org/) specification — this is what release-plz uses to determine version bumps and generate the CHANGELOG.
353
+
354
+ | Prefix | Version bump |
355
+ |--------|-------------|
356
+ | `fix:` | Patch |
357
+ | `feat:` | Minor |
358
+ | `feat!:` / `BREAKING CHANGE` | Major |
359
+ | `chore:`, `docs:`, `refactor:` | No release |
360
+
361
+ ```bash
362
+ # Good examples
363
+ git commit -m "feat: add m2s2 init command"
364
+ git commit -m "fix: detect camelCase component names correctly"
365
+ git commit -m "chore: update Angular template to v22"
366
+ ```
@@ -0,0 +1,212 @@
1
+ const { createWriteStream, existsSync, mkdirSync, mkdtemp } = require("fs");
2
+ const { join, sep } = require("path");
3
+ const { spawnSync } = require("child_process");
4
+ const { tmpdir } = require("os");
5
+
6
+ const axios = require("axios");
7
+ const rimraf = require("rimraf");
8
+ const tmpDir = tmpdir();
9
+
10
+ const error = (msg) => {
11
+ console.error(msg);
12
+ process.exit(1);
13
+ };
14
+
15
+ class Package {
16
+ constructor(platform, name, url, filename, zipExt, binaries) {
17
+ let errors = [];
18
+ if (typeof url !== "string") {
19
+ errors.push("url must be a string");
20
+ } else {
21
+ try {
22
+ new URL(url);
23
+ } catch (e) {
24
+ errors.push(e);
25
+ }
26
+ }
27
+ if (name && typeof name !== "string") {
28
+ errors.push("package name must be a string");
29
+ }
30
+ if (!name) {
31
+ errors.push("You must specify the name of your package");
32
+ }
33
+ if (binaries && typeof binaries !== "object") {
34
+ errors.push("binaries must be a string => string map");
35
+ }
36
+ if (!binaries) {
37
+ errors.push("You must specify the binaries in the package");
38
+ }
39
+
40
+ if (errors.length > 0) {
41
+ let errorMsg =
42
+ "One or more of the parameters you passed to the Binary constructor are invalid:\n";
43
+ errors.forEach((error) => {
44
+ errorMsg += error;
45
+ });
46
+ errorMsg +=
47
+ '\n\nCorrect usage: new Package("my-binary", "https://example.com/binary/download.tar.gz", {"my-binary": "my-binary"})';
48
+ error(errorMsg);
49
+ }
50
+
51
+ this.platform = platform;
52
+ this.url = url;
53
+ this.name = name;
54
+ this.filename = filename;
55
+ this.zipExt = zipExt;
56
+ this.installDirectory = join(__dirname, "node_modules", ".bin_real");
57
+ this.binaries = binaries;
58
+
59
+ if (!existsSync(this.installDirectory)) {
60
+ mkdirSync(this.installDirectory, { recursive: true });
61
+ }
62
+ }
63
+
64
+ exists() {
65
+ for (const binaryName in this.binaries) {
66
+ const binRelPath = this.binaries[binaryName];
67
+ const binPath = join(this.installDirectory, binRelPath);
68
+ if (!existsSync(binPath)) {
69
+ return false;
70
+ }
71
+ }
72
+ return true;
73
+ }
74
+
75
+ install(fetchOptions, suppressLogs = false) {
76
+ if (this.exists()) {
77
+ if (!suppressLogs) {
78
+ console.error(
79
+ `${this.name} is already installed, skipping installation.`,
80
+ );
81
+ }
82
+ return Promise.resolve();
83
+ }
84
+
85
+ if (existsSync(this.installDirectory)) {
86
+ rimraf.sync(this.installDirectory);
87
+ }
88
+
89
+ mkdirSync(this.installDirectory, { recursive: true });
90
+
91
+ if (!suppressLogs) {
92
+ console.error(`Downloading release from ${this.url}`);
93
+ }
94
+
95
+ return axios({ ...fetchOptions, url: this.url, responseType: "stream" })
96
+ .then((res) => {
97
+ return new Promise((resolve, reject) => {
98
+ mkdtemp(`${tmpDir}${sep}`, (err, directory) => {
99
+ let tempFile = join(directory, this.filename);
100
+ const sink = res.data.pipe(createWriteStream(tempFile));
101
+ sink.on("error", (err) => reject(err));
102
+ sink.on("close", () => {
103
+ if (/\.tar\.*/.test(this.zipExt)) {
104
+ const result = spawnSync("tar", [
105
+ "xf",
106
+ tempFile,
107
+ // The tarballs are stored with a leading directory
108
+ // component; we strip one component in the
109
+ // shell installers too.
110
+ "--strip-components",
111
+ "1",
112
+ "-C",
113
+ this.installDirectory,
114
+ ]);
115
+ if (result.status == 0) {
116
+ resolve();
117
+ } else if (result.error) {
118
+ reject(result.error);
119
+ } else {
120
+ reject(
121
+ new Error(
122
+ `An error occurred untarring the artifact: stdout: ${result.stdout}; stderr: ${result.stderr}`,
123
+ ),
124
+ );
125
+ }
126
+ } else if (this.zipExt == ".zip") {
127
+ let result;
128
+ if (this.platform.artifactName.includes("windows")) {
129
+ // Windows does not have "unzip" by default on many installations, instead
130
+ // we use Expand-Archive from powershell
131
+ result = spawnSync("powershell.exe", [
132
+ "-NoProfile",
133
+ "-NonInteractive",
134
+ "-Command",
135
+ `& {
136
+ param([string]$LiteralPath, [string]$DestinationPath)
137
+ Expand-Archive -LiteralPath $LiteralPath -DestinationPath $DestinationPath -Force
138
+ }`,
139
+ tempFile,
140
+ this.installDirectory,
141
+ ]);
142
+ } else {
143
+ result = spawnSync("unzip", [
144
+ "-q",
145
+ tempFile,
146
+ "-d",
147
+ this.installDirectory,
148
+ ]);
149
+ }
150
+
151
+ if (result.status == 0) {
152
+ resolve();
153
+ } else if (result.error) {
154
+ reject(result.error);
155
+ } else {
156
+ reject(
157
+ new Error(
158
+ `An error occurred unzipping the artifact: stdout: ${result.stdout}; stderr: ${result.stderr}`,
159
+ ),
160
+ );
161
+ }
162
+ } else {
163
+ reject(
164
+ new Error(`Unrecognized file extension: ${this.zipExt}`),
165
+ );
166
+ }
167
+ });
168
+ });
169
+ });
170
+ })
171
+ .then(() => {
172
+ if (!suppressLogs) {
173
+ console.error(`${this.name} has been installed!`);
174
+ }
175
+ })
176
+ .catch((e) => {
177
+ error(`Error fetching release: ${e.message}`);
178
+ });
179
+ }
180
+
181
+ run(binaryName, fetchOptions) {
182
+ const promise = !this.exists()
183
+ ? this.install(fetchOptions, true)
184
+ : Promise.resolve();
185
+
186
+ promise
187
+ .then(() => {
188
+ const [, , ...args] = process.argv;
189
+
190
+ const options = { cwd: process.cwd(), stdio: "inherit" };
191
+
192
+ const binRelPath = this.binaries[binaryName];
193
+ if (!binRelPath) {
194
+ error(`${binaryName} is not a known binary in ${this.name}`);
195
+ }
196
+ const binPath = join(this.installDirectory, binRelPath);
197
+ const result = spawnSync(binPath, args, options);
198
+
199
+ if (result.error) {
200
+ error(result.error);
201
+ }
202
+
203
+ process.exit(result.status);
204
+ })
205
+ .catch((e) => {
206
+ error(e.message);
207
+ process.exit(1);
208
+ });
209
+ }
210
+ }
211
+
212
+ module.exports.Package = Package;
package/binary.js ADDED
@@ -0,0 +1,128 @@
1
+ const { Package } = require("./binary-install");
2
+ const os = require("os");
3
+ const cTable = require("console.table");
4
+ const libc = require("detect-libc");
5
+ const { configureProxy } = require("axios-proxy-builder");
6
+
7
+ const error = (msg) => {
8
+ console.error(msg);
9
+ process.exit(1);
10
+ };
11
+
12
+ const {
13
+ name,
14
+ artifactDownloadUrls,
15
+ supportedPlatforms,
16
+ glibcMinimum,
17
+ } = require("./package.json");
18
+
19
+ // FIXME: implement NPM installer handling of fallback download URLs
20
+ const artifactDownloadUrl = artifactDownloadUrls[0];
21
+ const builderGlibcMajorVersion = glibcMinimum.major;
22
+ const builderGlibcMinorVersion = glibcMinimum.series;
23
+
24
+ const getPlatform = () => {
25
+ const rawOsType = os.type();
26
+ const rawArchitecture = os.arch();
27
+
28
+ // We want to use rust-style target triples as the canonical key
29
+ // for a platform, so translate the "os" library's concepts into rust ones
30
+ let osType = "";
31
+ switch (rawOsType) {
32
+ case "Windows_NT":
33
+ osType = "pc-windows-msvc";
34
+ break;
35
+ case "Darwin":
36
+ osType = "apple-darwin";
37
+ break;
38
+ case "Linux":
39
+ osType = "unknown-linux-gnu";
40
+ break;
41
+ }
42
+
43
+ let arch = "";
44
+ switch (rawArchitecture) {
45
+ case "x64":
46
+ arch = "x86_64";
47
+ break;
48
+ case "arm64":
49
+ arch = "aarch64";
50
+ break;
51
+ }
52
+
53
+ if (rawOsType === "Linux") {
54
+ if (libc.familySync() == "musl") {
55
+ osType = "unknown-linux-musl-dynamic";
56
+ } else if (libc.isNonGlibcLinuxSync()) {
57
+ console.warn(
58
+ "Your libc is neither glibc nor musl; trying static musl binary instead",
59
+ );
60
+ osType = "unknown-linux-musl-static";
61
+ } else {
62
+ let libcVersion = libc.versionSync();
63
+ let splitLibcVersion = libcVersion.split(".");
64
+ let libcMajorVersion = splitLibcVersion[0];
65
+ let libcMinorVersion = splitLibcVersion[1];
66
+ if (
67
+ libcMajorVersion != builderGlibcMajorVersion ||
68
+ libcMinorVersion < builderGlibcMinorVersion
69
+ ) {
70
+ // We can't run the glibc binaries, but we can run the static musl ones
71
+ // if they exist
72
+ console.warn(
73
+ "Your glibc isn't compatible; trying static musl binary instead",
74
+ );
75
+ osType = "unknown-linux-musl-static";
76
+ }
77
+ }
78
+ }
79
+
80
+ // Assume the above succeeded and build a target triple to look things up with.
81
+ // If any of it failed, this lookup will fail and we'll handle it like normal.
82
+ let targetTriple = `${arch}-${osType}`;
83
+ let platform = supportedPlatforms[targetTriple];
84
+
85
+ if (!platform) {
86
+ error(
87
+ `Platform with type "${rawOsType}" and architecture "${rawArchitecture}" is not supported by ${name}.\nYour system must be one of the following:\n\n${Object.keys(
88
+ supportedPlatforms,
89
+ ).join(",")}`,
90
+ );
91
+ }
92
+
93
+ return platform;
94
+ };
95
+
96
+ const getPackage = () => {
97
+ const platform = getPlatform();
98
+ const url = `${artifactDownloadUrl}/${platform.artifactName}`;
99
+ let filename = platform.artifactName;
100
+ let ext = platform.zipExt;
101
+ let binary = new Package(platform, name, url, filename, ext, platform.bins);
102
+
103
+ return binary;
104
+ };
105
+
106
+ const install = (suppressLogs) => {
107
+ if (!artifactDownloadUrl || artifactDownloadUrl.length === 0) {
108
+ console.warn("in demo mode, not installing binaries");
109
+ return;
110
+ }
111
+ const package = getPackage();
112
+ const proxy = configureProxy(package.url);
113
+
114
+ return package.install(proxy, suppressLogs);
115
+ };
116
+
117
+ const run = (binaryName) => {
118
+ const package = getPackage();
119
+ const proxy = configureProxy(package.url);
120
+
121
+ package.run(binaryName, proxy);
122
+ };
123
+
124
+ module.exports = {
125
+ install,
126
+ run,
127
+ getPackage,
128
+ };
package/install.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { install } = require("./binary");
4
+ install(false);
@@ -0,0 +1,546 @@
1
+ {
2
+ "lockfileVersion": 3,
3
+ "name": "@m2s2/cli",
4
+ "packages": {
5
+ "": {
6
+ "bin": {
7
+ "m2s2": "run-m2s2.js"
8
+ },
9
+ "dependencies": {
10
+ "axios": "^1.13.5",
11
+ "axios-proxy-builder": "^0.1.2",
12
+ "console.table": "^0.10.0",
13
+ "detect-libc": "^2.1.2",
14
+ "rimraf": "^6.1.3"
15
+ },
16
+ "devDependencies": {
17
+ "prettier": "^3.8.1"
18
+ },
19
+ "engines": {
20
+ "node": ">=14",
21
+ "npm": ">=6"
22
+ },
23
+ "hasInstallScript": true,
24
+ "license": "MIT",
25
+ "name": "@m2s2/cli",
26
+ "version": "0.1.0"
27
+ },
28
+ "node_modules/@isaacs/cliui": {
29
+ "engines": {
30
+ "node": ">=18"
31
+ },
32
+ "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==",
33
+ "license": "BlueOak-1.0.0",
34
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz",
35
+ "version": "9.0.0"
36
+ },
37
+ "node_modules/asynckit": {
38
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
39
+ "license": "MIT",
40
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
41
+ "version": "0.4.0"
42
+ },
43
+ "node_modules/axios": {
44
+ "dependencies": {
45
+ "follow-redirects": "^1.15.11",
46
+ "form-data": "^4.0.5",
47
+ "proxy-from-env": "^1.1.0"
48
+ },
49
+ "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==",
50
+ "license": "MIT",
51
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz",
52
+ "version": "1.13.5"
53
+ },
54
+ "node_modules/axios-proxy-builder": {
55
+ "dependencies": {
56
+ "tunnel": "^0.0.6"
57
+ },
58
+ "integrity": "sha512-6uBVsBZzkB3tCC8iyx59mCjQckhB8+GQrI9Cop8eC7ybIsvs/KtnNgEBfRMSEa7GqK2VBGUzgjNYMdPIfotyPA==",
59
+ "license": "MIT",
60
+ "resolved": "https://registry.npmjs.org/axios-proxy-builder/-/axios-proxy-builder-0.1.2.tgz",
61
+ "version": "0.1.2"
62
+ },
63
+ "node_modules/balanced-match": {
64
+ "dependencies": {
65
+ "jackspeak": "^4.2.3"
66
+ },
67
+ "engines": {
68
+ "node": "20 || >=22"
69
+ },
70
+ "integrity": "sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==",
71
+ "license": "MIT",
72
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.2.tgz",
73
+ "version": "4.0.2"
74
+ },
75
+ "node_modules/brace-expansion": {
76
+ "dependencies": {
77
+ "balanced-match": "^4.0.2"
78
+ },
79
+ "engines": {
80
+ "node": "20 || >=22"
81
+ },
82
+ "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==",
83
+ "license": "MIT",
84
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz",
85
+ "version": "5.0.2"
86
+ },
87
+ "node_modules/call-bind-apply-helpers": {
88
+ "dependencies": {
89
+ "es-errors": "^1.3.0",
90
+ "function-bind": "^1.1.2"
91
+ },
92
+ "engines": {
93
+ "node": ">= 0.4"
94
+ },
95
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
96
+ "license": "MIT",
97
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
98
+ "version": "1.0.2"
99
+ },
100
+ "node_modules/clone": {
101
+ "engines": {
102
+ "node": ">=0.8"
103
+ },
104
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
105
+ "license": "MIT",
106
+ "optional": true,
107
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
108
+ "version": "1.0.4"
109
+ },
110
+ "node_modules/combined-stream": {
111
+ "dependencies": {
112
+ "delayed-stream": "~1.0.0"
113
+ },
114
+ "engines": {
115
+ "node": ">= 0.8"
116
+ },
117
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
118
+ "license": "MIT",
119
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
120
+ "version": "1.0.8"
121
+ },
122
+ "node_modules/console.table": {
123
+ "dependencies": {
124
+ "easy-table": "1.1.0"
125
+ },
126
+ "engines": {
127
+ "node": "> 0.10"
128
+ },
129
+ "integrity": "sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==",
130
+ "license": "MIT",
131
+ "resolved": "https://registry.npmjs.org/console.table/-/console.table-0.10.0.tgz",
132
+ "version": "0.10.0"
133
+ },
134
+ "node_modules/defaults": {
135
+ "dependencies": {
136
+ "clone": "^1.0.2"
137
+ },
138
+ "funding": {
139
+ "url": "https://github.com/sponsors/sindresorhus"
140
+ },
141
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
142
+ "license": "MIT",
143
+ "optional": true,
144
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
145
+ "version": "1.0.4"
146
+ },
147
+ "node_modules/delayed-stream": {
148
+ "engines": {
149
+ "node": ">=0.4.0"
150
+ },
151
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
152
+ "license": "MIT",
153
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
154
+ "version": "1.0.0"
155
+ },
156
+ "node_modules/detect-libc": {
157
+ "engines": {
158
+ "node": ">=8"
159
+ },
160
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
161
+ "license": "Apache-2.0",
162
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
163
+ "version": "2.1.2"
164
+ },
165
+ "node_modules/dunder-proto": {
166
+ "dependencies": {
167
+ "call-bind-apply-helpers": "^1.0.1",
168
+ "es-errors": "^1.3.0",
169
+ "gopd": "^1.2.0"
170
+ },
171
+ "engines": {
172
+ "node": ">= 0.4"
173
+ },
174
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
175
+ "license": "MIT",
176
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
177
+ "version": "1.0.1"
178
+ },
179
+ "node_modules/easy-table": {
180
+ "integrity": "sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA==",
181
+ "license": "MIT",
182
+ "optionalDependencies": {
183
+ "wcwidth": ">=1.0.1"
184
+ },
185
+ "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.1.0.tgz",
186
+ "version": "1.1.0"
187
+ },
188
+ "node_modules/es-define-property": {
189
+ "engines": {
190
+ "node": ">= 0.4"
191
+ },
192
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
193
+ "license": "MIT",
194
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
195
+ "version": "1.0.1"
196
+ },
197
+ "node_modules/es-errors": {
198
+ "engines": {
199
+ "node": ">= 0.4"
200
+ },
201
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
202
+ "license": "MIT",
203
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
204
+ "version": "1.3.0"
205
+ },
206
+ "node_modules/es-object-atoms": {
207
+ "dependencies": {
208
+ "es-errors": "^1.3.0"
209
+ },
210
+ "engines": {
211
+ "node": ">= 0.4"
212
+ },
213
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
214
+ "license": "MIT",
215
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
216
+ "version": "1.1.1"
217
+ },
218
+ "node_modules/es-set-tostringtag": {
219
+ "dependencies": {
220
+ "es-errors": "^1.3.0",
221
+ "get-intrinsic": "^1.2.6",
222
+ "has-tostringtag": "^1.0.2",
223
+ "hasown": "^2.0.2"
224
+ },
225
+ "engines": {
226
+ "node": ">= 0.4"
227
+ },
228
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
229
+ "license": "MIT",
230
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
231
+ "version": "2.1.0"
232
+ },
233
+ "node_modules/follow-redirects": {
234
+ "engines": {
235
+ "node": ">=4.0"
236
+ },
237
+ "funding": [
238
+ {
239
+ "type": "individual",
240
+ "url": "https://github.com/sponsors/RubenVerborgh"
241
+ }
242
+ ],
243
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
244
+ "license": "MIT",
245
+ "peerDependenciesMeta": {
246
+ "debug": {
247
+ "optional": true
248
+ }
249
+ },
250
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
251
+ "version": "1.15.11"
252
+ },
253
+ "node_modules/form-data": {
254
+ "dependencies": {
255
+ "asynckit": "^0.4.0",
256
+ "combined-stream": "^1.0.8",
257
+ "es-set-tostringtag": "^2.1.0",
258
+ "hasown": "^2.0.2",
259
+ "mime-types": "^2.1.12"
260
+ },
261
+ "engines": {
262
+ "node": ">= 6"
263
+ },
264
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
265
+ "license": "MIT",
266
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
267
+ "version": "4.0.5"
268
+ },
269
+ "node_modules/function-bind": {
270
+ "funding": {
271
+ "url": "https://github.com/sponsors/ljharb"
272
+ },
273
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
274
+ "license": "MIT",
275
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
276
+ "version": "1.1.2"
277
+ },
278
+ "node_modules/get-intrinsic": {
279
+ "dependencies": {
280
+ "call-bind-apply-helpers": "^1.0.2",
281
+ "es-define-property": "^1.0.1",
282
+ "es-errors": "^1.3.0",
283
+ "es-object-atoms": "^1.1.1",
284
+ "function-bind": "^1.1.2",
285
+ "get-proto": "^1.0.1",
286
+ "gopd": "^1.2.0",
287
+ "has-symbols": "^1.1.0",
288
+ "hasown": "^2.0.2",
289
+ "math-intrinsics": "^1.1.0"
290
+ },
291
+ "engines": {
292
+ "node": ">= 0.4"
293
+ },
294
+ "funding": {
295
+ "url": "https://github.com/sponsors/ljharb"
296
+ },
297
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
298
+ "license": "MIT",
299
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
300
+ "version": "1.3.0"
301
+ },
302
+ "node_modules/get-proto": {
303
+ "dependencies": {
304
+ "dunder-proto": "^1.0.1",
305
+ "es-object-atoms": "^1.0.0"
306
+ },
307
+ "engines": {
308
+ "node": ">= 0.4"
309
+ },
310
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
311
+ "license": "MIT",
312
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
313
+ "version": "1.0.1"
314
+ },
315
+ "node_modules/glob": {
316
+ "dependencies": {
317
+ "minimatch": "^10.2.0",
318
+ "minipass": "^7.1.2",
319
+ "path-scurry": "^2.0.0"
320
+ },
321
+ "engines": {
322
+ "node": "20 || >=22"
323
+ },
324
+ "funding": {
325
+ "url": "https://github.com/sponsors/isaacs"
326
+ },
327
+ "integrity": "sha512-/g3B0mC+4x724v1TgtBlBtt2hPi/EWptsIAmXUx9Z2rvBYleQcsrmaOzd5LyL50jf/Soi83ZDJmw2+XqvH/EeA==",
328
+ "license": "BlueOak-1.0.0",
329
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.3.tgz",
330
+ "version": "13.0.3"
331
+ },
332
+ "node_modules/gopd": {
333
+ "engines": {
334
+ "node": ">= 0.4"
335
+ },
336
+ "funding": {
337
+ "url": "https://github.com/sponsors/ljharb"
338
+ },
339
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
340
+ "license": "MIT",
341
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
342
+ "version": "1.2.0"
343
+ },
344
+ "node_modules/has-symbols": {
345
+ "engines": {
346
+ "node": ">= 0.4"
347
+ },
348
+ "funding": {
349
+ "url": "https://github.com/sponsors/ljharb"
350
+ },
351
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
352
+ "license": "MIT",
353
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
354
+ "version": "1.1.0"
355
+ },
356
+ "node_modules/has-tostringtag": {
357
+ "dependencies": {
358
+ "has-symbols": "^1.0.3"
359
+ },
360
+ "engines": {
361
+ "node": ">= 0.4"
362
+ },
363
+ "funding": {
364
+ "url": "https://github.com/sponsors/ljharb"
365
+ },
366
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
367
+ "license": "MIT",
368
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
369
+ "version": "1.0.2"
370
+ },
371
+ "node_modules/hasown": {
372
+ "dependencies": {
373
+ "function-bind": "^1.1.2"
374
+ },
375
+ "engines": {
376
+ "node": ">= 0.4"
377
+ },
378
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
379
+ "license": "MIT",
380
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
381
+ "version": "2.0.2"
382
+ },
383
+ "node_modules/jackspeak": {
384
+ "dependencies": {
385
+ "@isaacs/cliui": "^9.0.0"
386
+ },
387
+ "engines": {
388
+ "node": "20 || >=22"
389
+ },
390
+ "funding": {
391
+ "url": "https://github.com/sponsors/isaacs"
392
+ },
393
+ "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==",
394
+ "license": "BlueOak-1.0.0",
395
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz",
396
+ "version": "4.2.3"
397
+ },
398
+ "node_modules/lru-cache": {
399
+ "engines": {
400
+ "node": "20 || >=22"
401
+ },
402
+ "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==",
403
+ "license": "BlueOak-1.0.0",
404
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz",
405
+ "version": "11.2.6"
406
+ },
407
+ "node_modules/math-intrinsics": {
408
+ "engines": {
409
+ "node": ">= 0.4"
410
+ },
411
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
412
+ "license": "MIT",
413
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
414
+ "version": "1.1.0"
415
+ },
416
+ "node_modules/mime-db": {
417
+ "engines": {
418
+ "node": ">= 0.6"
419
+ },
420
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
421
+ "license": "MIT",
422
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
423
+ "version": "1.52.0"
424
+ },
425
+ "node_modules/mime-types": {
426
+ "dependencies": {
427
+ "mime-db": "1.52.0"
428
+ },
429
+ "engines": {
430
+ "node": ">= 0.6"
431
+ },
432
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
433
+ "license": "MIT",
434
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
435
+ "version": "2.1.35"
436
+ },
437
+ "node_modules/minimatch": {
438
+ "dependencies": {
439
+ "brace-expansion": "^5.0.2"
440
+ },
441
+ "engines": {
442
+ "node": "20 || >=22"
443
+ },
444
+ "funding": {
445
+ "url": "https://github.com/sponsors/isaacs"
446
+ },
447
+ "integrity": "sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==",
448
+ "license": "BlueOak-1.0.0",
449
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.0.tgz",
450
+ "version": "10.2.0"
451
+ },
452
+ "node_modules/minipass": {
453
+ "engines": {
454
+ "node": ">=16 || 14 >=14.17"
455
+ },
456
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
457
+ "license": "ISC",
458
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
459
+ "version": "7.1.2"
460
+ },
461
+ "node_modules/package-json-from-dist": {
462
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
463
+ "license": "BlueOak-1.0.0",
464
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
465
+ "version": "1.0.1"
466
+ },
467
+ "node_modules/path-scurry": {
468
+ "dependencies": {
469
+ "lru-cache": "^11.0.0",
470
+ "minipass": "^7.1.2"
471
+ },
472
+ "engines": {
473
+ "node": "20 || >=22"
474
+ },
475
+ "funding": {
476
+ "url": "https://github.com/sponsors/isaacs"
477
+ },
478
+ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==",
479
+ "license": "BlueOak-1.0.0",
480
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz",
481
+ "version": "2.0.1"
482
+ },
483
+ "node_modules/prettier": {
484
+ "bin": {
485
+ "prettier": "bin/prettier.cjs"
486
+ },
487
+ "dev": true,
488
+ "engines": {
489
+ "node": ">=14"
490
+ },
491
+ "funding": {
492
+ "url": "https://github.com/prettier/prettier?sponsor=1"
493
+ },
494
+ "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
495
+ "license": "MIT",
496
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
497
+ "version": "3.8.1"
498
+ },
499
+ "node_modules/proxy-from-env": {
500
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
501
+ "license": "MIT",
502
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
503
+ "version": "1.1.0"
504
+ },
505
+ "node_modules/rimraf": {
506
+ "bin": {
507
+ "rimraf": "dist/esm/bin.mjs"
508
+ },
509
+ "dependencies": {
510
+ "glob": "^13.0.3",
511
+ "package-json-from-dist": "^1.0.1"
512
+ },
513
+ "engines": {
514
+ "node": "20 || >=22"
515
+ },
516
+ "funding": {
517
+ "url": "https://github.com/sponsors/isaacs"
518
+ },
519
+ "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==",
520
+ "license": "BlueOak-1.0.0",
521
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz",
522
+ "version": "6.1.3"
523
+ },
524
+ "node_modules/tunnel": {
525
+ "engines": {
526
+ "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
527
+ },
528
+ "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
529
+ "license": "MIT",
530
+ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
531
+ "version": "0.0.6"
532
+ },
533
+ "node_modules/wcwidth": {
534
+ "dependencies": {
535
+ "defaults": "^1.0.3"
536
+ },
537
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
538
+ "license": "MIT",
539
+ "optional": true,
540
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
541
+ "version": "1.0.1"
542
+ }
543
+ },
544
+ "requires": true,
545
+ "version": "0.1.0"
546
+ }
package/package.json ADDED
@@ -0,0 +1,103 @@
1
+ {
2
+ "artifactDownloadUrls": [
3
+ "https://github.com/M2S2-Engineering-Group/m2s2-cli/releases/download/v0.1.0"
4
+ ],
5
+ "author": "M²S² Engineering Group <contact@m2s2.io>",
6
+ "bin": {
7
+ "m2s2": "run-m2s2.js"
8
+ },
9
+ "dependencies": {
10
+ "axios": "^1.13.5",
11
+ "axios-proxy-builder": "^0.1.2",
12
+ "console.table": "^0.10.0",
13
+ "detect-libc": "^2.1.2",
14
+ "rimraf": "^6.1.3"
15
+ },
16
+ "description": "CLI for scaffolding M²S² design system projects",
17
+ "devDependencies": {
18
+ "prettier": "^3.8.1"
19
+ },
20
+ "engines": {
21
+ "node": ">=14",
22
+ "npm": ">=6"
23
+ },
24
+ "glibcMinimum": {
25
+ "major": 2,
26
+ "series": 35
27
+ },
28
+ "homepage": "https://github.com/M2S2-Engineering-Group/m2s2-cli",
29
+ "keywords": [
30
+ "command-line-utilities",
31
+ "development-tools",
32
+ "cli",
33
+ "scaffold",
34
+ "react",
35
+ "angular",
36
+ "m2s2"
37
+ ],
38
+ "license": "MIT",
39
+ "name": "@m2s2/cli",
40
+ "preferUnplugged": true,
41
+ "repository": "https://github.com/M2S2-Engineering-Group/m2s2-cli",
42
+ "scripts": {
43
+ "fmt": "prettier --write **/*.js",
44
+ "fmt:check": "prettier --check **/*.js",
45
+ "postinstall": "node ./install.js"
46
+ },
47
+ "supportedPlatforms": {
48
+ "aarch64-apple-darwin": {
49
+ "artifactName": "m2s2-cli-aarch64-apple-darwin.tar.xz",
50
+ "bins": {
51
+ "m2s2": "m2s2"
52
+ },
53
+ "zipExt": ".tar.xz"
54
+ },
55
+ "aarch64-pc-windows-msvc": {
56
+ "artifactName": "m2s2-cli-x86_64-pc-windows-msvc.zip",
57
+ "bins": {
58
+ "m2s2": "m2s2.exe"
59
+ },
60
+ "zipExt": ".zip"
61
+ },
62
+ "aarch64-unknown-linux-gnu": {
63
+ "artifactName": "m2s2-cli-aarch64-unknown-linux-gnu.tar.xz",
64
+ "bins": {
65
+ "m2s2": "m2s2"
66
+ },
67
+ "zipExt": ".tar.xz"
68
+ },
69
+ "x86_64-apple-darwin": {
70
+ "artifactName": "m2s2-cli-x86_64-apple-darwin.tar.xz",
71
+ "bins": {
72
+ "m2s2": "m2s2"
73
+ },
74
+ "zipExt": ".tar.xz"
75
+ },
76
+ "x86_64-pc-windows-gnu": {
77
+ "artifactName": "m2s2-cli-x86_64-pc-windows-msvc.zip",
78
+ "bins": {
79
+ "m2s2": "m2s2.exe"
80
+ },
81
+ "zipExt": ".zip"
82
+ },
83
+ "x86_64-pc-windows-msvc": {
84
+ "artifactName": "m2s2-cli-x86_64-pc-windows-msvc.zip",
85
+ "bins": {
86
+ "m2s2": "m2s2.exe"
87
+ },
88
+ "zipExt": ".zip"
89
+ },
90
+ "x86_64-unknown-linux-gnu": {
91
+ "artifactName": "m2s2-cli-x86_64-unknown-linux-gnu.tar.xz",
92
+ "bins": {
93
+ "m2s2": "m2s2"
94
+ },
95
+ "zipExt": ".tar.xz"
96
+ }
97
+ },
98
+ "version": "0.1.0",
99
+ "volta": {
100
+ "node": "18.14.1",
101
+ "npm": "9.5.0"
102
+ }
103
+ }
package/run-m2s2.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { run } = require("./binary");
4
+ run("m2s2");