@base44-preview/cli 0.0.15-pr.93.4af3300 → 0.0.15-pr.95.d246983

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.
Files changed (3) hide show
  1. package/README.md +135 -42
  2. package/dist/cli/index.js +113 -97
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,78 +1,171 @@
1
1
  # Base44 CLI
2
2
 
3
- Command-line interface for building applications with [Base44's backend service](https://docs.base44.com/developers/backend/overview/introduction).
3
+ A unified command-line interface for managing Base44 applications, entities, functions, deployments, and related services.
4
4
 
5
- Base44's backend service provides a managed backend for your applications, including data storage with entities, serverless functions, authentication, and hosting. The CLI lets you:
6
-
7
- - **Create projects** from templates.
8
- - **Sync** resources defined in local code with your Base44 backend.
9
- - **Deploy sites** to Base44's hosting platform.
10
-
11
- To get started, see the full list of commands below or check out the [documentation](https://docs.base44.com/developers/references/cli/get-started/overview).
5
+ **Zero dependencies** - installs in seconds with no dependency resolution.
12
6
 
13
7
  ## Installation
14
8
 
15
9
  ```bash
10
+ # Using npm (globally)
16
11
  npm install -g base44
17
- ```
18
12
 
19
- Or run commands directly with npx:
20
-
21
- ```bash
13
+ # Or run directly with npx
22
14
  npx base44 <command>
23
15
  ```
24
16
 
25
- Requires Node.js 20.19.0 or higher.
26
-
27
- ## Quick start
17
+ ## Quick Start
28
18
 
29
19
  ```bash
30
- # Authenticate
20
+ # 1. Login to Base44
31
21
  base44 login
32
22
 
33
- # Create a project
23
+ # 2. Create a new project
34
24
  base44 create
25
+
26
+ # 3. Deploy everything (entities, functions, and site)
27
+ npm run build
28
+ base44 deploy
35
29
  ```
36
30
 
37
- The CLI will guide you through project setup. For step-by-step tutorials, see the quickstart guides:
31
+ ## Commands
38
32
 
39
- - [Backend only](https://docs.base44.com/developers/backend/quickstart/quickstart-backend-only) — for headless apps or custom frontends
40
- - [React](https://docs.base44.com/developers/backend/quickstart/quickstart-with-react) — full-stack with Vite + React
33
+ ### Authentication
41
34
 
42
- ## Commands
35
+ | Command | Description |
36
+ |---------|-------------|
37
+ | `base44 login` | Authenticate with Base44 using device code flow |
38
+ | `base44 whoami` | Display current authenticated user |
39
+ | `base44 logout` | Logout from current device |
40
+
41
+ ### Project Management
42
+
43
+ | Command | Description |
44
+ |---------|-------------|
45
+ | `base44 create` | Create a new Base44 project from a template |
46
+ | `base44 link` | Link an existing local project to Base44 |
47
+ | `base44 dashboard` | Open the app dashboard in your browser |
48
+
49
+ ### Deployment
50
+
51
+ | Command | Description |
52
+ |---------|-------------|
53
+ | `base44 deploy` | Deploy all resources (entities, functions, and site) |
54
+
55
+ ### Entities
56
+
57
+ | Command | Description |
58
+ |---------|-------------|
59
+ | `base44 entities push` | Push local entity schemas to Base44 |
60
+
61
+ ### Functions
62
+
63
+ | Command | Description |
64
+ |---------|-------------|
65
+ | `base44 functions deploy` | Deploy local functions to Base44 |
66
+
67
+ ### Site
43
68
 
44
69
  | Command | Description |
45
- | ------- | ----------- |
46
- | [`create`](https://docs.base44.com/developers/references/cli/commands/create) | Create a new Base44 project from a template |
47
- | [`deploy`](https://docs.base44.com/developers/references/cli/commands/deploy) | Deploy resources and site to Base44 |
48
- | [`eject`](https://docs.base44.com/developers/references/cli/commands/eject) | Create a Base44 backend project from an existing Base44 app |
49
- | [`link`](https://docs.base44.com/developers/references/cli/commands/link) | Link a local project to a project on Base44 |
50
- | [`dashboard`](https://docs.base44.com/developers/references/cli/commands/dashboard) | Open the app dashboard in your browser |
51
- | [`login`](https://docs.base44.com/developers/references/cli/commands/login) | Authenticate with Base44 |
52
- | [`logout`](https://docs.base44.com/developers/references/cli/commands/logout) | Sign out and clear stored credentials |
53
- | [`whoami`](https://docs.base44.com/developers/references/cli/commands/whoami) | Display the current authenticated user |
54
- | [`entities push`](https://docs.base44.com/developers/references/cli/commands/entities-push) | Push local entity schemas to Base44 |
55
- | [`functions deploy`](https://docs.base44.com/developers/references/cli/commands/functions-deploy) | Deploy local functions to Base44 |
56
- | [`site deploy`](https://docs.base44.com/developers/references/cli/commands/site-deploy) | Deploy built site files to Base44 hosting |
57
-
58
- ## Help
70
+ |---------|-------------|
71
+ | `base44 site deploy` | Deploy built site files to Base44 hosting |
72
+
73
+ ## Configuration
74
+
75
+ ### Project Configuration
76
+
77
+ Base44 projects are configured via a `config.jsonc` (or `config.json`) file in the `base44/` subdirectory:
78
+
79
+ ```jsonc
80
+ // base44/config.jsonc
81
+ {
82
+ "name": "My Project",
83
+ "entitiesDir": "./entities", // Default: ./entities
84
+ "functionsDir": "./functions", // Default: ./functions
85
+ "site": {
86
+ "outputDirectory": "../dist" // Path to built site files
87
+ }
88
+ }
89
+ ```
90
+
91
+ ### App Configuration
92
+
93
+ Your app ID is stored in a `.app.jsonc` file in the `base44/` directory. This file is created automatically when you run `base44 create` or `base44 link`:
94
+
95
+ ```jsonc
96
+ // base44/.app.jsonc
97
+ {
98
+ "id": "your-app-id"
99
+ }
100
+ ```
101
+
102
+ ## Project Structure
103
+
104
+ A typical Base44 project has this structure:
105
+
106
+ ```
107
+ my-project/
108
+ ├── base44/
109
+ │ ├── config.jsonc # Project configuration
110
+ │ ├── .app.jsonc # App ID (git-ignored)
111
+ │ ├── entities/ # Entity schema files
112
+ │ │ ├── user.jsonc
113
+ │ │ └── product.jsonc
114
+ │ └── functions/ # Backend functions
115
+ │ └── my-function/
116
+ │ ├── config.jsonc
117
+ │ └── index.js
118
+ ├── src/ # Your frontend code
119
+ ├── dist/ # Built site files (for deployment)
120
+ └── package.json
121
+ ```
122
+
123
+ ## Development
124
+
125
+ ### Prerequisites
126
+
127
+ - Node.js >= 20.19.0
128
+ - npm
129
+
130
+ ### Setup
59
131
 
60
132
  ```bash
61
- base44 --help
62
- base44 <command> --help
133
+ # Clone the repository
134
+ git clone https://github.com/base44/cli.git
135
+ cd cli
136
+
137
+ # Install dependencies
138
+ npm install
139
+
140
+ # Build
141
+ npm run build
142
+
143
+ # Run in development mode
144
+ npm run dev -- <command>
63
145
  ```
64
146
 
65
- ## Version
147
+ ### Available Scripts
66
148
 
67
149
  ```bash
68
- base44 --version
150
+ npm run build # Build with tsdown
151
+ npm run typecheck # Type check with tsc
152
+ npm run dev # Run in development mode with tsx
153
+ npm run lint # Lint with ESLint
154
+ npm test # Run tests with Vitest
69
155
  ```
70
156
 
71
- ## Alpha
157
+ ### Running the Built CLI
72
158
 
73
- The CLI and Base44 backend service are currently in alpha. We're actively improving them based on user feedback. Share your thoughts and feature requests on our [GitHub Discussions](https://github.com/orgs/base44/discussions).
159
+ ```bash
160
+ # After building
161
+ npm start -- <command>
162
+
163
+ # Or directly
164
+ ./dist/cli/index.js <command>
165
+ ```
166
+ ## Contributing
74
167
 
75
- Found a bug? [Open an issue](https://github.com/base44/cli/issues).
168
+ See [AGENTS.md](./AGENTS.md) for development guidelines and architecture documentation.
76
169
 
77
170
  ## License
78
171
 
package/dist/cli/index.js CHANGED
@@ -4,7 +4,7 @@ import { EventEmitter, addAbortListener, on, once, setMaxListeners } from "node:
4
4
  import childProcess, { ChildProcess, execFile, spawn, spawnSync } from "node:child_process";
5
5
  import path, { basename, dirname, join, posix, resolve, win32 } from "node:path";
6
6
  import fs, { appendFileSync, createReadStream, createWriteStream, readFileSync, statSync, writeFileSync } from "node:fs";
7
- import y, { execArgv, execPath, hrtime, platform, stdin, stdout } from "node:process";
7
+ import process$1, { execArgv, execPath, hrtime, platform, stdin, stdout } from "node:process";
8
8
  import { aborted, callbackify, debuglog, inspect, promisify, stripVTControlCharacters } from "node:util";
9
9
  import * as g from "node:readline";
10
10
  import O from "node:readline";
@@ -894,7 +894,7 @@ var require_command = /* @__PURE__ */ __commonJSMin(((exports) => {
894
894
  const childProcess$1 = __require("node:child_process");
895
895
  const path$15 = __require("node:path");
896
896
  const fs$10 = __require("node:fs");
897
- const process$3 = __require("node:process");
897
+ const process$4 = __require("node:process");
898
898
  const { Argument, humanReadableArgName } = require_argument();
899
899
  const { CommanderError } = require_error$1();
900
900
  const { Help } = require_help();
@@ -945,10 +945,10 @@ var require_command = /* @__PURE__ */ __commonJSMin(((exports) => {
945
945
  this._showHelpAfterError = false;
946
946
  this._showSuggestionAfterError = true;
947
947
  this._outputConfiguration = {
948
- writeOut: (str) => process$3.stdout.write(str),
949
- writeErr: (str) => process$3.stderr.write(str),
950
- getOutHelpWidth: () => process$3.stdout.isTTY ? process$3.stdout.columns : void 0,
951
- getErrHelpWidth: () => process$3.stderr.isTTY ? process$3.stderr.columns : void 0,
948
+ writeOut: (str) => process$4.stdout.write(str),
949
+ writeErr: (str) => process$4.stderr.write(str),
950
+ getOutHelpWidth: () => process$4.stdout.isTTY ? process$4.stdout.columns : void 0,
951
+ getErrHelpWidth: () => process$4.stderr.isTTY ? process$4.stderr.columns : void 0,
952
952
  outputError: (str, write) => write(str)
953
953
  };
954
954
  this._hidden = false;
@@ -1302,7 +1302,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
1302
1302
  */
1303
1303
  _exit(exitCode, code$1, message) {
1304
1304
  if (this._exitCallback) this._exitCallback(new CommanderError(exitCode, code$1, message));
1305
- process$3.exit(exitCode);
1305
+ process$4.exit(exitCode);
1306
1306
  }
1307
1307
  /**
1308
1308
  * Register callback `fn` for the command.
@@ -1641,11 +1641,11 @@ Expecting one of '${allowedValues.join("', '")}'`);
1641
1641
  if (argv !== void 0 && !Array.isArray(argv)) throw new Error("first parameter to parse must be array or undefined");
1642
1642
  parseOptions = parseOptions || {};
1643
1643
  if (argv === void 0 && parseOptions.from === void 0) {
1644
- if (process$3.versions?.electron) parseOptions.from = "electron";
1645
- const execArgv$1 = process$3.execArgv ?? [];
1644
+ if (process$4.versions?.electron) parseOptions.from = "electron";
1645
+ const execArgv$1 = process$4.execArgv ?? [];
1646
1646
  if (execArgv$1.includes("-e") || execArgv$1.includes("--eval") || execArgv$1.includes("-p") || execArgv$1.includes("--print")) parseOptions.from = "eval";
1647
1647
  }
1648
- if (argv === void 0) argv = process$3.argv;
1648
+ if (argv === void 0) argv = process$4.argv;
1649
1649
  this.rawArgs = argv.slice();
1650
1650
  let userArgs;
1651
1651
  switch (parseOptions.from) {
@@ -1655,7 +1655,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
1655
1655
  userArgs = argv.slice(2);
1656
1656
  break;
1657
1657
  case "electron":
1658
- if (process$3.defaultApp) {
1658
+ if (process$4.defaultApp) {
1659
1659
  this._scriptPath = argv[1];
1660
1660
  userArgs = argv.slice(2);
1661
1661
  } else userArgs = argv.slice(1);
@@ -1769,15 +1769,15 @@ Expecting one of '${allowedValues.join("', '")}'`);
1769
1769
  }
1770
1770
  launchWithNode = sourceExt.includes(path$15.extname(executableFile));
1771
1771
  let proc$1;
1772
- if (process$3.platform !== "win32") if (launchWithNode) {
1772
+ if (process$4.platform !== "win32") if (launchWithNode) {
1773
1773
  args.unshift(executableFile);
1774
- args = incrementNodeInspectorPort(process$3.execArgv).concat(args);
1775
- proc$1 = childProcess$1.spawn(process$3.argv[0], args, { stdio: "inherit" });
1774
+ args = incrementNodeInspectorPort(process$4.execArgv).concat(args);
1775
+ proc$1 = childProcess$1.spawn(process$4.argv[0], args, { stdio: "inherit" });
1776
1776
  } else proc$1 = childProcess$1.spawn(executableFile, args, { stdio: "inherit" });
1777
1777
  else {
1778
1778
  args.unshift(executableFile);
1779
- args = incrementNodeInspectorPort(process$3.execArgv).concat(args);
1780
- proc$1 = childProcess$1.spawn(process$3.execPath, args, { stdio: "inherit" });
1779
+ args = incrementNodeInspectorPort(process$4.execArgv).concat(args);
1780
+ proc$1 = childProcess$1.spawn(process$4.execPath, args, { stdio: "inherit" });
1781
1781
  }
1782
1782
  if (!proc$1.killed) [
1783
1783
  "SIGUSR1",
@@ -1786,14 +1786,14 @@ Expecting one of '${allowedValues.join("', '")}'`);
1786
1786
  "SIGINT",
1787
1787
  "SIGHUP"
1788
1788
  ].forEach((signal) => {
1789
- process$3.on(signal, () => {
1789
+ process$4.on(signal, () => {
1790
1790
  if (proc$1.killed === false && proc$1.exitCode === null) proc$1.kill(signal);
1791
1791
  });
1792
1792
  });
1793
1793
  const exitCallback = this._exitCallback;
1794
1794
  proc$1.on("close", (code$1) => {
1795
1795
  code$1 = code$1 ?? 1;
1796
- if (!exitCallback) process$3.exit(code$1);
1796
+ if (!exitCallback) process$4.exit(code$1);
1797
1797
  else exitCallback(new CommanderError(code$1, "commander.executeSubCommandAsync", "(close)"));
1798
1798
  });
1799
1799
  proc$1.on("error", (err) => {
@@ -1805,7 +1805,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
1805
1805
  - ${executableDirMessage}`;
1806
1806
  throw new Error(executableMissing);
1807
1807
  } else if (err.code === "EACCES") throw new Error(`'${executableFile}' not executable`);
1808
- if (!exitCallback) process$3.exit(1);
1808
+ if (!exitCallback) process$4.exit(1);
1809
1809
  else {
1810
1810
  const wrappedError = new CommanderError(1, "commander.executeSubCommandAsync", "(error)");
1811
1811
  wrappedError.nestedError = err;
@@ -2211,13 +2211,13 @@ Expecting one of '${allowedValues.join("', '")}'`);
2211
2211
  */
2212
2212
  _parseOptionsEnv() {
2213
2213
  this.options.forEach((option) => {
2214
- if (option.envVar && option.envVar in process$3.env) {
2214
+ if (option.envVar && option.envVar in process$4.env) {
2215
2215
  const optionKey = option.attributeName();
2216
2216
  if (this.getOptionValue(optionKey) === void 0 || [
2217
2217
  "default",
2218
2218
  "config",
2219
2219
  "env"
2220
- ].includes(this.getOptionValueSource(optionKey))) if (option.required || option.optional) this.emit(`optionEnv:${option.name()}`, process$3.env[option.envVar]);
2220
+ ].includes(this.getOptionValueSource(optionKey))) if (option.required || option.optional) this.emit(`optionEnv:${option.name()}`, process$4.env[option.envVar]);
2221
2221
  else this.emit(`optionEnv:${option.name()}`);
2222
2222
  }
2223
2223
  });
@@ -2596,7 +2596,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
2596
2596
  */
2597
2597
  help(contextOptions) {
2598
2598
  this.outputHelp(contextOptions);
2599
- let exitCode = process$3.exitCode || 0;
2599
+ let exitCode = process$4.exitCode || 0;
2600
2600
  if (exitCode === 0 && contextOptions && typeof contextOptions !== "function" && contextOptions.error) exitCode = 1;
2601
2601
  this._exit(exitCode, "commander.help", "(outputHelp)");
2602
2602
  }
@@ -2712,16 +2712,16 @@ var require_src = /* @__PURE__ */ __commonJSMin(((exports, module) => {
2712
2712
  const CSI = `${ESC}[`;
2713
2713
  const beep = "\x07";
2714
2714
  const cursor = {
2715
- to(x$2, y$2) {
2716
- if (!y$2) return `${CSI}${x$2 + 1}G`;
2717
- return `${CSI}${y$2 + 1};${x$2 + 1}H`;
2715
+ to(x$2, y$1) {
2716
+ if (!y$1) return `${CSI}${x$2 + 1}G`;
2717
+ return `${CSI}${y$1 + 1};${x$2 + 1}H`;
2718
2718
  },
2719
- move(x$2, y$2) {
2719
+ move(x$2, y$1) {
2720
2720
  let ret = "";
2721
2721
  if (x$2 < 0) ret += `${CSI}${-x$2}D`;
2722
2722
  else if (x$2 > 0) ret += `${CSI}${x$2}C`;
2723
- if (y$2 < 0) ret += `${CSI}${-y$2}A`;
2724
- else if (y$2 > 0) ret += `${CSI}${y$2}B`;
2723
+ if (y$1 < 0) ret += `${CSI}${-y$1}A`;
2724
+ else if (y$1 > 0) ret += `${CSI}${y$1}B`;
2725
2725
  return ret;
2726
2726
  },
2727
2727
  up: (count$1 = 1) => `${CSI}${count$1}A`,
@@ -3031,13 +3031,13 @@ function rD() {
3031
3031
  }
3032
3032
  }), r;
3033
3033
  }
3034
- const ED = rD(), d$1 = new Set(["\x1B", "›"]), oD = 39, y$1 = "\x07", V$1 = "[", nD = "]", G$1 = "m", _$1 = `${nD}8;;`, z = (e$1) => `${d$1.values().next().value}${V$1}${e$1}${G$1}`, K$1 = (e$1) => `${d$1.values().next().value}${_$1}${e$1}${y$1}`, aD = (e$1) => e$1.split(" ").map((u$2) => p(u$2)), k$1 = (e$1, u$2, t) => {
3034
+ const ED = rD(), d$1 = new Set(["\x1B", "›"]), oD = 39, y = "\x07", V$1 = "[", nD = "]", G$1 = "m", _$1 = `${nD}8;;`, z = (e$1) => `${d$1.values().next().value}${V$1}${e$1}${G$1}`, K$1 = (e$1) => `${d$1.values().next().value}${_$1}${e$1}${y}`, aD = (e$1) => e$1.split(" ").map((u$2) => p(u$2)), k$1 = (e$1, u$2, t) => {
3035
3035
  const F$1 = [...u$2];
3036
3036
  let s = !1, i$1 = !1, D$1 = p(P$1(e$1[e$1.length - 1]));
3037
3037
  for (const [C$1, n$1] of F$1.entries()) {
3038
3038
  const E = p(n$1);
3039
3039
  if (D$1 + E <= t ? e$1[e$1.length - 1] += n$1 : (e$1.push(n$1), D$1 = 0), d$1.has(n$1) && (s = !0, i$1 = F$1.slice(C$1 + 1).join("").startsWith(_$1)), s) {
3040
- i$1 ? n$1 === y$1 && (s = !1, i$1 = !1) : n$1 === G$1 && (s = !1);
3040
+ i$1 ? n$1 === y && (s = !1, i$1 = !1) : n$1 === G$1 && (s = !1);
3041
3041
  continue;
3042
3042
  }
3043
3043
  D$1 += E, D$1 === t && C$1 < F$1.length - 1 && (e$1.push(""), D$1 = 0);
@@ -3079,7 +3079,7 @@ const ED = rD(), d$1 = new Set(["\x1B", "›"]), oD = 39, y$1 = "\x07", V$1 = "["
3079
3079
  `)];
3080
3080
  for (const [E, a$1] of n$1.entries()) {
3081
3081
  if (F$1 += a$1, d$1.has(a$1)) {
3082
- const { groups: c$1 } = (/* @__PURE__ */ new RegExp(`(?:\\${V$1}(?<code>\\d+)m|\\${_$1}(?<uri>.*)${y$1})`)).exec(n$1.slice(E).join("")) || { groups: {} };
3082
+ const { groups: c$1 } = (/* @__PURE__ */ new RegExp(`(?:\\${V$1}(?<code>\\d+)m|\\${_$1}(?<uri>.*)${y})`)).exec(n$1.slice(E).join("")) || { groups: {} };
3083
3083
  if (c$1.code !== void 0) {
3084
3084
  const f = Number.parseFloat(c$1.code);
3085
3085
  s = f === oD ? void 0 : f;
@@ -3480,7 +3480,7 @@ var RD = class extends x$1 {
3480
3480
  //#endregion
3481
3481
  //#region node_modules/@clack/prompts/dist/index.mjs
3482
3482
  function ce() {
3483
- return y.platform !== "win32" ? y.env.TERM !== "linux" : !!y.env.CI || !!y.env.WT_SESSION || !!y.env.TERMINUS_SUBLIME || y.env.ConEmuTask === "{cmd::Cmder}" || y.env.TERM_PROGRAM === "Terminus-Sublime" || y.env.TERM_PROGRAM === "vscode" || y.env.TERM === "xterm-256color" || y.env.TERM === "alacritty" || y.env.TERMINAL_EMULATOR === "JetBrains-JediTerm";
3483
+ return process$1.platform !== "win32" ? process$1.env.TERM !== "linux" : !!process$1.env.CI || !!process$1.env.WT_SESSION || !!process$1.env.TERMINUS_SUBLIME || process$1.env.ConEmuTask === "{cmd::Cmder}" || process$1.env.TERM_PROGRAM === "Terminus-Sublime" || process$1.env.TERM_PROGRAM === "vscode" || process$1.env.TERM === "xterm-256color" || process$1.env.TERM === "alacritty" || process$1.env.TERMINAL_EMULATOR === "JetBrains-JediTerm";
3484
3484
  }
3485
3485
  const V = ce(), u$1 = (t, n$1) => V ? t : n$1, le = u$1("◆", "*"), L = u$1("■", "x"), W = u$1("▲", "x"), C = u$1("◇", "o"), ue = u$1("┌", "T"), o$1 = u$1("│", "|"), d = u$1("└", "—"), k = u$1("●", ">"), P = u$1("○", " "), A = u$1("◻", "[•]"), T = u$1("◼", "[+]"), F = u$1("◻", "[ ]"), $e = u$1("▪", "•"), _ = u$1("─", "-"), me = u$1("╮", "+"), de = u$1("├", "+"), pe = u$1("╯", "+"), q = u$1("●", "•"), D = u$1("◆", "*"), U = u$1("▲", "!"), K = u$1("■", "x"), b = (t) => {
3486
3486
  switch (t) {
@@ -6628,7 +6628,7 @@ function initializeContext(params) {
6628
6628
  external: params?.external ?? void 0
6629
6629
  };
6630
6630
  }
6631
- function process$2(schema, ctx, _params = {
6631
+ function process$3(schema, ctx, _params = {
6632
6632
  path: [],
6633
6633
  schemaPath: []
6634
6634
  }) {
@@ -6665,7 +6665,7 @@ function process$2(schema, ctx, _params = {
6665
6665
  const parent = schema._zod.parent;
6666
6666
  if (parent) {
6667
6667
  if (!result.ref) result.ref = parent;
6668
- process$2(parent, ctx, params);
6668
+ process$3(parent, ctx, params);
6669
6669
  ctx.seen.get(parent).isParent = true;
6670
6670
  }
6671
6671
  }
@@ -6877,7 +6877,7 @@ const createToJSONSchemaMethod = (schema, processors = {}) => (params) => {
6877
6877
  ...params,
6878
6878
  processors
6879
6879
  });
6880
- process$2(schema, ctx);
6880
+ process$3(schema, ctx);
6881
6881
  extractDefs(ctx, schema);
6882
6882
  return finalize(ctx, schema);
6883
6883
  };
@@ -6889,7 +6889,7 @@ const createStandardJSONSchemaMethod = (schema, io, processors = {}) => (params)
6889
6889
  io,
6890
6890
  processors
6891
6891
  });
6892
- process$2(schema, ctx);
6892
+ process$3(schema, ctx);
6893
6893
  extractDefs(ctx, schema);
6894
6894
  return finalize(ctx, schema);
6895
6895
  };
@@ -6973,7 +6973,7 @@ const arrayProcessor = (schema, ctx, _json, params) => {
6973
6973
  if (typeof minimum === "number") json.minItems = minimum;
6974
6974
  if (typeof maximum === "number") json.maxItems = maximum;
6975
6975
  json.type = "array";
6976
- json.items = process$2(def.element, ctx, {
6976
+ json.items = process$3(def.element, ctx, {
6977
6977
  ...params,
6978
6978
  path: [...params.path, "items"]
6979
6979
  });
@@ -6984,7 +6984,7 @@ const objectProcessor = (schema, ctx, _json, params) => {
6984
6984
  json.type = "object";
6985
6985
  json.properties = {};
6986
6986
  const shape = def.shape;
6987
- for (const key in shape) json.properties[key] = process$2(shape[key], ctx, {
6987
+ for (const key in shape) json.properties[key] = process$3(shape[key], ctx, {
6988
6988
  ...params,
6989
6989
  path: [
6990
6990
  ...params.path,
@@ -7002,7 +7002,7 @@ const objectProcessor = (schema, ctx, _json, params) => {
7002
7002
  if (def.catchall?._zod.def.type === "never") json.additionalProperties = false;
7003
7003
  else if (!def.catchall) {
7004
7004
  if (ctx.io === "output") json.additionalProperties = false;
7005
- } else if (def.catchall) json.additionalProperties = process$2(def.catchall, ctx, {
7005
+ } else if (def.catchall) json.additionalProperties = process$3(def.catchall, ctx, {
7006
7006
  ...params,
7007
7007
  path: [...params.path, "additionalProperties"]
7008
7008
  });
@@ -7010,7 +7010,7 @@ const objectProcessor = (schema, ctx, _json, params) => {
7010
7010
  const unionProcessor = (schema, ctx, json, params) => {
7011
7011
  const def = schema._zod.def;
7012
7012
  const isExclusive = def.inclusive === false;
7013
- const options = def.options.map((x$2, i$1) => process$2(x$2, ctx, {
7013
+ const options = def.options.map((x$2, i$1) => process$3(x$2, ctx, {
7014
7014
  ...params,
7015
7015
  path: [
7016
7016
  ...params.path,
@@ -7023,7 +7023,7 @@ const unionProcessor = (schema, ctx, json, params) => {
7023
7023
  };
7024
7024
  const intersectionProcessor = (schema, ctx, json, params) => {
7025
7025
  const def = schema._zod.def;
7026
- const a$1 = process$2(def.left, ctx, {
7026
+ const a$1 = process$3(def.left, ctx, {
7027
7027
  ...params,
7028
7028
  path: [
7029
7029
  ...params.path,
@@ -7031,7 +7031,7 @@ const intersectionProcessor = (schema, ctx, json, params) => {
7031
7031
  0
7032
7032
  ]
7033
7033
  });
7034
- const b$2 = process$2(def.right, ctx, {
7034
+ const b$2 = process$3(def.right, ctx, {
7035
7035
  ...params,
7036
7036
  path: [
7037
7037
  ...params.path,
@@ -7048,7 +7048,7 @@ const tupleProcessor = (schema, ctx, _json, params) => {
7048
7048
  json.type = "array";
7049
7049
  const prefixPath$1 = ctx.target === "draft-2020-12" ? "prefixItems" : "items";
7050
7050
  const restPath = ctx.target === "draft-2020-12" ? "items" : ctx.target === "openapi-3.0" ? "items" : "additionalItems";
7051
- const prefixItems = def.items.map((x$2, i$1) => process$2(x$2, ctx, {
7051
+ const prefixItems = def.items.map((x$2, i$1) => process$3(x$2, ctx, {
7052
7052
  ...params,
7053
7053
  path: [
7054
7054
  ...params.path,
@@ -7056,7 +7056,7 @@ const tupleProcessor = (schema, ctx, _json, params) => {
7056
7056
  i$1
7057
7057
  ]
7058
7058
  }));
7059
- const rest = def.rest ? process$2(def.rest, ctx, {
7059
+ const rest = def.rest ? process$3(def.rest, ctx, {
7060
7060
  ...params,
7061
7061
  path: [
7062
7062
  ...params.path,
@@ -7082,7 +7082,7 @@ const tupleProcessor = (schema, ctx, _json, params) => {
7082
7082
  };
7083
7083
  const nullableProcessor = (schema, ctx, json, params) => {
7084
7084
  const def = schema._zod.def;
7085
- const inner = process$2(def.innerType, ctx, params);
7085
+ const inner = process$3(def.innerType, ctx, params);
7086
7086
  const seen = ctx.seen.get(schema);
7087
7087
  if (ctx.target === "openapi-3.0") {
7088
7088
  seen.ref = def.innerType;
@@ -7091,27 +7091,27 @@ const nullableProcessor = (schema, ctx, json, params) => {
7091
7091
  };
7092
7092
  const nonoptionalProcessor = (schema, ctx, _json, params) => {
7093
7093
  const def = schema._zod.def;
7094
- process$2(def.innerType, ctx, params);
7094
+ process$3(def.innerType, ctx, params);
7095
7095
  const seen = ctx.seen.get(schema);
7096
7096
  seen.ref = def.innerType;
7097
7097
  };
7098
7098
  const defaultProcessor = (schema, ctx, json, params) => {
7099
7099
  const def = schema._zod.def;
7100
- process$2(def.innerType, ctx, params);
7100
+ process$3(def.innerType, ctx, params);
7101
7101
  const seen = ctx.seen.get(schema);
7102
7102
  seen.ref = def.innerType;
7103
7103
  json.default = JSON.parse(JSON.stringify(def.defaultValue));
7104
7104
  };
7105
7105
  const prefaultProcessor = (schema, ctx, json, params) => {
7106
7106
  const def = schema._zod.def;
7107
- process$2(def.innerType, ctx, params);
7107
+ process$3(def.innerType, ctx, params);
7108
7108
  const seen = ctx.seen.get(schema);
7109
7109
  seen.ref = def.innerType;
7110
7110
  if (ctx.io === "input") json._prefault = JSON.parse(JSON.stringify(def.defaultValue));
7111
7111
  };
7112
7112
  const catchProcessor = (schema, ctx, json, params) => {
7113
7113
  const def = schema._zod.def;
7114
- process$2(def.innerType, ctx, params);
7114
+ process$3(def.innerType, ctx, params);
7115
7115
  const seen = ctx.seen.get(schema);
7116
7116
  seen.ref = def.innerType;
7117
7117
  let catchValue;
@@ -7125,20 +7125,20 @@ const catchProcessor = (schema, ctx, json, params) => {
7125
7125
  const pipeProcessor = (schema, ctx, _json, params) => {
7126
7126
  const def = schema._zod.def;
7127
7127
  const innerType = ctx.io === "input" ? def.in._zod.def.type === "transform" ? def.out : def.in : def.out;
7128
- process$2(innerType, ctx, params);
7128
+ process$3(innerType, ctx, params);
7129
7129
  const seen = ctx.seen.get(schema);
7130
7130
  seen.ref = innerType;
7131
7131
  };
7132
7132
  const readonlyProcessor = (schema, ctx, json, params) => {
7133
7133
  const def = schema._zod.def;
7134
- process$2(def.innerType, ctx, params);
7134
+ process$3(def.innerType, ctx, params);
7135
7135
  const seen = ctx.seen.get(schema);
7136
7136
  seen.ref = def.innerType;
7137
7137
  json.readOnly = true;
7138
7138
  };
7139
7139
  const optionalProcessor = (schema, ctx, _json, params) => {
7140
7140
  const def = schema._zod.def;
7141
- process$2(def.innerType, ctx, params);
7141
+ process$3(def.innerType, ctx, params);
7142
7142
  const seen = ctx.seen.get(schema);
7143
7143
  seen.ref = def.innerType;
7144
7144
  };
@@ -16156,7 +16156,7 @@ const createIgnorePredicate = (patterns, cwd, baseDir) => {
16156
16156
  };
16157
16157
  const normalizeOptions$2 = (options = {}) => {
16158
16158
  const ignoreOption = options.ignore ? Array.isArray(options.ignore) ? options.ignore : [options.ignore] : [];
16159
- const cwd = toPath$1(options.cwd) ?? y.cwd();
16159
+ const cwd = toPath$1(options.cwd) ?? process$1.cwd();
16160
16160
  const deep = typeof options.deep === "number" ? Math.max(0, options.deep) + 1 : Number.POSITIVE_INFINITY;
16161
16161
  return {
16162
16162
  cwd,
@@ -16253,7 +16253,7 @@ const getDirectoryGlob = ({ directoryPath, files, extensions }) => {
16253
16253
  const extensionGlob = extensions?.length > 0 ? `.${extensions.length > 1 ? `{${extensions.join(",")}}` : extensions[0]}` : "";
16254
16254
  return files ? files.map((file) => path.posix.join(directoryPath, `**/${path.extname(file) ? file : `${file}${extensionGlob}`}`)) : [path.posix.join(directoryPath, `**${extensionGlob ? `/*${extensionGlob}` : ""}`)];
16255
16255
  };
16256
- const directoryToGlob = async (directoryPaths, { cwd = y.cwd(), files, extensions, fs: fsImplementation } = {}) => {
16256
+ const directoryToGlob = async (directoryPaths, { cwd = process$1.cwd(), files, extensions, fs: fsImplementation } = {}) => {
16257
16257
  return (await Promise.all(directoryPaths.map(async (directoryPath) => {
16258
16258
  if (shouldExpandGlobstarDirectory(isNegativePattern(directoryPath) ? directoryPath.slice(1) : directoryPath)) return getDirectoryGlob({
16259
16259
  directoryPath,
@@ -16267,7 +16267,7 @@ const directoryToGlob = async (directoryPaths, { cwd = y.cwd(), files, extension
16267
16267
  }) : directoryPath;
16268
16268
  }))).flat();
16269
16269
  };
16270
- const directoryToGlobSync = (directoryPaths, { cwd = y.cwd(), files, extensions, fs: fsImplementation } = {}) => directoryPaths.flatMap((directoryPath) => {
16270
+ const directoryToGlobSync = (directoryPaths, { cwd = process$1.cwd(), files, extensions, fs: fsImplementation } = {}) => directoryPaths.flatMap((directoryPath) => {
16271
16271
  if (shouldExpandGlobstarDirectory(isNegativePattern(directoryPath) ? directoryPath.slice(1) : directoryPath)) return getDirectoryGlob({
16272
16272
  directoryPath,
16273
16273
  files,
@@ -16363,7 +16363,7 @@ const applyIgnoreFilesAndGetFilterSync = (options) => {
16363
16363
  };
16364
16364
  const createFilterFunction = (isIgnored, cwd) => {
16365
16365
  const seen = /* @__PURE__ */ new Set();
16366
- const basePath = cwd || y.cwd();
16366
+ const basePath = cwd || process$1.cwd();
16367
16367
  const pathCache = /* @__PURE__ */ new Map();
16368
16368
  return (fastGlobResult) => {
16369
16369
  const pathKey$1 = path.normalize(fastGlobResult.path ?? fastGlobResult);
@@ -30703,13 +30703,13 @@ var ansi_styles_default = ansiStyles;
30703
30703
 
30704
30704
  //#endregion
30705
30705
  //#region node_modules/chalk/source/vendor/supports-color/index.js
30706
- function hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : y.argv) {
30706
+ function hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process$1.argv) {
30707
30707
  const prefix = flag.startsWith("-") ? "" : flag.length === 1 ? "-" : "--";
30708
30708
  const position = argv.indexOf(prefix + flag);
30709
30709
  const terminatorPosition = argv.indexOf("--");
30710
30710
  return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);
30711
30711
  }
30712
- const { env } = y;
30712
+ const { env } = process$1;
30713
30713
  let flagForceColor;
30714
30714
  if (hasFlag("no-color") || hasFlag("no-colors") || hasFlag("color=false") || hasFlag("color=never")) flagForceColor = 0;
30715
30715
  else if (hasFlag("color") || hasFlag("colors") || hasFlag("color=true") || hasFlag("color=always")) flagForceColor = 1;
@@ -30742,7 +30742,7 @@ function _supportsColor(haveStream, { streamIsTTY, sniffFlags = true } = {}) {
30742
30742
  if (haveStream && !streamIsTTY && forceColor === void 0) return 0;
30743
30743
  const min = forceColor || 0;
30744
30744
  if (env.TERM === "dumb") return min;
30745
- if (y.platform === "win32") {
30745
+ if (process$1.platform === "win32") {
30746
30746
  const osRelease = os.release().split(".");
30747
30747
  if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) return Number(osRelease[2]) >= 14931 ? 3 : 2;
30748
30748
  return 1;
@@ -31481,9 +31481,9 @@ const getSubprocessResult = ({ stdout: stdout$1 }) => {
31481
31481
  //#region node_modules/execa/lib/utils/standard-stream.js
31482
31482
  const isStandardStream = (stream) => STANDARD_STREAMS.includes(stream);
31483
31483
  const STANDARD_STREAMS = [
31484
- y.stdin,
31485
- y.stdout,
31486
- y.stderr
31484
+ process$1.stdin,
31485
+ process$1.stdout,
31486
+ process$1.stderr
31487
31487
  ];
31488
31488
  const STANDARD_STREAMS_ALIASES = [
31489
31489
  "stdin",
@@ -31608,9 +31608,9 @@ const NO_ESCAPE_REGEXP = /^[\w./-]+$/;
31608
31608
  //#endregion
31609
31609
  //#region node_modules/is-unicode-supported/index.js
31610
31610
  function isUnicodeSupported() {
31611
- const { env: env$1 } = y;
31611
+ const { env: env$1 } = process$1;
31612
31612
  const { TERM, TERM_PROGRAM } = env$1;
31613
- if (y.platform !== "win32") return TERM !== "linux";
31613
+ if (process$1.platform !== "win32") return TERM !== "linux";
31614
31614
  return Boolean(env$1.WT_SESSION) || Boolean(env$1.TERMINUS_SUBLIME) || env$1.ConEmuTask === "{cmd::Cmder}" || TERM_PROGRAM === "Terminus-Sublime" || TERM_PROGRAM === "vscode" || TERM === "xterm-256color" || TERM === "alacritty" || TERM === "rxvt-unicode" || TERM === "rxvt-unicode-256color" || env$1.TERMINAL_EMULATOR === "JetBrains-JediTerm";
31615
31615
  }
31616
31616
 
@@ -32537,7 +32537,7 @@ const TEN_MEGABYTES_IN_BYTES = 10 * 1024 * 1024;
32537
32537
 
32538
32538
  //#endregion
32539
32539
  //#region node_modules/npm-run-path/index.js
32540
- const npmRunPath = ({ cwd = y.cwd(), path: pathOption = y.env[pathKey()], preferLocal = true, execPath: execPath$1 = y.execPath, addExecPath = true } = {}) => {
32540
+ const npmRunPath = ({ cwd = process$1.cwd(), path: pathOption = process$1.env[pathKey()], preferLocal = true, execPath: execPath$1 = process$1.execPath, addExecPath = true } = {}) => {
32541
32541
  const cwdPath = path.resolve(toPath(cwd));
32542
32542
  const result = [];
32543
32543
  const pathParts = pathOption.split(path.delimiter);
@@ -32555,7 +32555,7 @@ const applyExecPath = (result, pathParts, execPath$1, cwdPath) => {
32555
32555
  const pathPart = path.resolve(cwdPath, toPath(execPath$1), "..");
32556
32556
  if (!pathParts.includes(pathPart)) result.push(pathPart);
32557
32557
  };
32558
- const npmRunPathEnv = ({ env: env$1 = y.env, ...options } = {}) => {
32558
+ const npmRunPathEnv = ({ env: env$1 = process$1.env, ...options } = {}) => {
32559
32559
  env$1 = { ...env$1 };
32560
32560
  const pathName = pathKey({ env: env$1 });
32561
32561
  options.path = env$1[pathName];
@@ -33690,7 +33690,7 @@ const normalizeCwd = (cwd = getDefaultCwd()) => {
33690
33690
  };
33691
33691
  const getDefaultCwd = () => {
33692
33692
  try {
33693
- return y.cwd();
33693
+ return process$1.cwd();
33694
33694
  } catch (error) {
33695
33695
  error.message = `The current directory does not exist.\n${error.message}`;
33696
33696
  throw error;
@@ -33725,7 +33725,7 @@ const normalizeOptions = (filePath, rawArguments, rawOptions) => {
33725
33725
  options.killSignal = normalizeKillSignal(options.killSignal);
33726
33726
  options.forceKillAfterDelay = normalizeForceKillAfterDelay(options.forceKillAfterDelay);
33727
33727
  options.lines = options.lines.map((lines, fdNumber) => lines && !BINARY_ENCODINGS.has(options.encoding) && options.buffer[fdNumber]);
33728
- if (y.platform === "win32" && path.basename(file, ".exe") === "cmd") commandArguments.unshift("/q");
33728
+ if (process$1.platform === "win32" && path.basename(file, ".exe") === "cmd") commandArguments.unshift("/q");
33729
33729
  return {
33730
33730
  file,
33731
33731
  commandArguments,
@@ -33752,7 +33752,7 @@ const addDefaultOptions = ({ extendEnv = true, preferLocal = false, cwd, localDi
33752
33752
  });
33753
33753
  const getEnv = ({ env: envOption, extendEnv, preferLocal, node, localDirectory, nodePath }) => {
33754
33754
  const env$1 = extendEnv ? {
33755
- ...y.env,
33755
+ ...process$1.env,
33756
33756
  ...envOption
33757
33757
  } : envOption;
33758
33758
  if (preferLocal || node) return npmRunPathEnv({
@@ -34752,12 +34752,12 @@ const guessStreamDirection = {
34752
34752
  }
34753
34753
  };
34754
34754
  const getStandardStreamDirection = (value) => {
34755
- if ([0, y.stdin].includes(value)) return "input";
34755
+ if ([0, process$1.stdin].includes(value)) return "input";
34756
34756
  if ([
34757
34757
  1,
34758
34758
  2,
34759
- y.stdout,
34760
- y.stderr
34759
+ process$1.stdout,
34760
+ process$1.stderr
34761
34761
  ].includes(value)) return "output";
34762
34762
  };
34763
34763
  const DEFAULT_DIRECTION = "output";
@@ -35821,9 +35821,9 @@ const addIpcMethods = (subprocess, { ipc }) => {
35821
35821
  Object.assign(subprocess, getIpcMethods(subprocess, false, ipc));
35822
35822
  };
35823
35823
  const getIpcExport = () => {
35824
- const anyProcess = y;
35824
+ const anyProcess = process$1;
35825
35825
  const isSubprocess = true;
35826
- const ipc = y.channel !== void 0;
35826
+ const ipc = process$1.channel !== void 0;
35827
35827
  return {
35828
35828
  ...getIpcMethods(anyProcess, isSubprocess, ipc),
35829
35829
  getCancelSignal: getCancelSignal$1.bind(void 0, {
@@ -36065,7 +36065,7 @@ if (process.platform === "linux") signals.push("SIGIO", "SIGPOLL", "SIGPWR", "SI
36065
36065
 
36066
36066
  //#endregion
36067
36067
  //#region node_modules/signal-exit/dist/mjs/index.js
36068
- const processOk = (process$4) => !!process$4 && typeof process$4 === "object" && typeof process$4.removeListener === "function" && typeof process$4.emit === "function" && typeof process$4.reallyExit === "function" && typeof process$4.listeners === "function" && typeof process$4.kill === "function" && typeof process$4.pid === "number" && typeof process$4.on === "function";
36068
+ const processOk = (process$5) => !!process$5 && typeof process$5 === "object" && typeof process$5.removeListener === "function" && typeof process$5.emit === "function" && typeof process$5.reallyExit === "function" && typeof process$5.listeners === "function" && typeof process$5.kill === "function" && typeof process$5.pid === "number" && typeof process$5.on === "function";
36069
36069
  const kExitEmitter = Symbol.for("signal-exit emitter");
36070
36070
  const global$1 = globalThis;
36071
36071
  const ObjectDefineProperty = Object.defineProperty.bind(Object);
@@ -36133,7 +36133,7 @@ var SignalExitFallback = class extends SignalExitBase {
36133
36133
  };
36134
36134
  var SignalExit = class extends SignalExitBase {
36135
36135
  /* c8 ignore start */
36136
- #hupSig = process$1.platform === "win32" ? "SIGINT" : "SIGHUP";
36136
+ #hupSig = process$2.platform === "win32" ? "SIGINT" : "SIGHUP";
36137
36137
  /* c8 ignore stop */
36138
36138
  #emitter = new Emitter();
36139
36139
  #process;
@@ -36141,15 +36141,15 @@ var SignalExit = class extends SignalExitBase {
36141
36141
  #originalProcessReallyExit;
36142
36142
  #sigListeners = {};
36143
36143
  #loaded = false;
36144
- constructor(process$4) {
36144
+ constructor(process$5) {
36145
36145
  super();
36146
- this.#process = process$4;
36146
+ this.#process = process$5;
36147
36147
  this.#sigListeners = {};
36148
36148
  for (const sig of signals) this.#sigListeners[sig] = () => {
36149
36149
  const listeners = this.#process.listeners(sig);
36150
36150
  let { count: count$1 } = this.#emitter;
36151
36151
  /* c8 ignore start */
36152
- const p$1 = process$4;
36152
+ const p$1 = process$5;
36153
36153
  if (typeof p$1.__signal_exit_emitter__ === "object" && typeof p$1.__signal_exit_emitter__.count === "number") count$1 += p$1.__signal_exit_emitter__.count;
36154
36154
  /* c8 ignore stop */
36155
36155
  if (listeners.length === count$1) {
@@ -36157,11 +36157,11 @@ var SignalExit = class extends SignalExitBase {
36157
36157
  const ret = this.#emitter.emit("exit", null, sig);
36158
36158
  /* c8 ignore start */
36159
36159
  const s = sig === "SIGHUP" ? this.#hupSig : sig;
36160
- if (!ret) process$4.kill(process$4.pid, s);
36160
+ if (!ret) process$5.kill(process$5.pid, s);
36161
36161
  }
36162
36162
  };
36163
- this.#originalProcessReallyExit = process$4.reallyExit;
36164
- this.#originalProcessEmit = process$4.emit;
36163
+ this.#originalProcessReallyExit = process$5.reallyExit;
36164
+ this.#originalProcessEmit = process$5.emit;
36165
36165
  }
36166
36166
  onExit(cb, opts) {
36167
36167
  /* c8 ignore start */
@@ -36228,8 +36228,8 @@ var SignalExit = class extends SignalExitBase {
36228
36228
  } else return og.call(this.#process, ev, ...args);
36229
36229
  }
36230
36230
  };
36231
- const process$1 = globalThis.process;
36232
- const { onExit, load, unload } = signalExitWrap(processOk(process$1) ? new SignalExit(process$1) : new SignalExitFallback());
36231
+ const process$2 = globalThis.process;
36232
+ const { onExit, load, unload } = signalExitWrap(processOk(process$2) ? new SignalExit(process$2) : new SignalExitFallback());
36233
36233
 
36234
36234
  //#endregion
36235
36235
  //#region node_modules/execa/lib/terminate/cleanup.js
@@ -38042,6 +38042,7 @@ async function createInteractive(options) {
38042
38042
  description: result.description || void 0,
38043
38043
  projectPath: result.projectPath,
38044
38044
  deploy: options.deploy,
38045
+ skills: options.skills,
38045
38046
  isInteractive: true
38046
38047
  });
38047
38048
  }
@@ -38052,10 +38053,11 @@ async function createNonInteractive(options) {
38052
38053
  description: options.description,
38053
38054
  projectPath: options.path,
38054
38055
  deploy: options.deploy,
38056
+ skills: options.skills,
38055
38057
  isInteractive: false
38056
38058
  });
38057
38059
  }
38058
- async function executeCreate({ template, name: rawName, description, projectPath, deploy, isInteractive }) {
38060
+ async function executeCreate({ template, name: rawName, description, projectPath, deploy, skills, isInteractive }) {
38059
38061
  const name$1 = rawName.trim();
38060
38062
  const resolvedPath = resolve(projectPath);
38061
38063
  const { projectId } = await runTask("Setting up your project...", async () => {
@@ -38073,6 +38075,20 @@ async function executeCreate({ template, name: rawName, description, projectPath
38073
38075
  id: projectId,
38074
38076
  projectRoot: resolvedPath
38075
38077
  });
38078
+ let shouldAddSkills;
38079
+ if (isInteractive) {
38080
+ const result = await ye({ message: "Add AI agent skills? (Helps AI assistants like Cursor, Claude Code work with Base44)" });
38081
+ shouldAddSkills = !pD(result) && result;
38082
+ } else shouldAddSkills = !!skills;
38083
+ if (shouldAddSkills) await runTask("Adding AI agent skills...", async () => {
38084
+ await execa({
38085
+ cwd: resolvedPath,
38086
+ shell: true
38087
+ })`npx -y add-skill base44/skills`;
38088
+ }, {
38089
+ successMessage: theme.colors.base44Orange("AI agent skills added successfully"),
38090
+ errorMessage: "Failed to add AI agent skills"
38091
+ });
38076
38092
  const { project, entities } = await readProjectConfig(resolvedPath);
38077
38093
  let finalAppUrl;
38078
38094
  if (entities.length > 0) {
@@ -38120,7 +38136,7 @@ async function executeCreate({ template, name: rawName, description, projectPath
38120
38136
  if (finalAppUrl) M.message(`${theme.styles.header("Site")}: ${theme.colors.links(finalAppUrl)}`);
38121
38137
  return { outroMessage: "Your project is set up and ready to use" };
38122
38138
  }
38123
- const createCommand = new Command("create").description("Create a new Base44 project").option("-n, --name <name>", "Project name").option("-d, --description <description>", "Project description").option("-p, --path <path>", "Path where to create the project").option("-t, --template <id>", "Template ID (e.g., backend-only, backend-and-client)").option("--deploy", "Build and deploy the site").hook("preAction", validateNonInteractiveFlags$1).action(async (options) => {
38139
+ const createCommand = new Command("create").description("Create a new Base44 project").option("-n, --name <name>", "Project name").option("-d, --description <description>", "Project description").option("-p, --path <path>", "Path where to create the project").option("-t, --template <id>", "Template ID (e.g., backend-only, backend-and-client)").option("--deploy", "Build and deploy the site").option("--skills", "Add AI agent skills (Cursor, Claude Code, etc.)").hook("preAction", validateNonInteractiveFlags$1).action(async (options) => {
38124
38140
  await chooseCreate(options);
38125
38141
  });
38126
38142
 
@@ -38166,7 +38182,7 @@ function isInsideContainer() {
38166
38182
  //#endregion
38167
38183
  //#region node_modules/is-wsl/index.js
38168
38184
  const isWsl = () => {
38169
- if (y.platform !== "linux") return false;
38185
+ if (process$1.platform !== "linux") return false;
38170
38186
  if (os.release().toLowerCase().includes("microsoft")) {
38171
38187
  if (isInsideContainer()) return false;
38172
38188
  return true;
@@ -38177,12 +38193,12 @@ const isWsl = () => {
38177
38193
  return false;
38178
38194
  }
38179
38195
  };
38180
- var is_wsl_default = y.env.__IS_WSL_TEST__ ? isWsl : isWsl();
38196
+ var is_wsl_default = process$1.env.__IS_WSL_TEST__ ? isWsl : isWsl();
38181
38197
 
38182
38198
  //#endregion
38183
38199
  //#region node_modules/powershell-utils/index.js
38184
38200
  const execFile$2 = promisify(childProcess.execFile);
38185
- const powerShellPath$1 = () => `${y.env.SYSTEMROOT || y.env.windir || String.raw`C:\Windows`}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`;
38201
+ const powerShellPath$1 = () => `${process$1.env.SYSTEMROOT || process$1.env.windir || String.raw`C:\Windows`}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`;
38186
38202
  const executePowerShell = async (command, options = {}) => {
38187
38203
  const { powerShellPath: psPath, ...execFileOptions } = options;
38188
38204
  const encodedCommand = executePowerShell.encodeCommand(command);
@@ -38293,7 +38309,7 @@ function defineLazyProperty(object$1, propertyName, valueGetter) {
38293
38309
  //#region node_modules/default-browser-id/index.js
38294
38310
  const execFileAsync$3 = promisify(execFile);
38295
38311
  async function defaultBrowserId() {
38296
- if (y.platform !== "darwin") throw new Error("macOS only");
38312
+ if (process$1.platform !== "darwin") throw new Error("macOS only");
38297
38313
  const { stdout: stdout$1 } = await execFileAsync$3("defaults", [
38298
38314
  "read",
38299
38315
  "com.apple.LaunchServices/com.apple.launchservices.secure",
@@ -38308,7 +38324,7 @@ async function defaultBrowserId() {
38308
38324
  //#region node_modules/run-applescript/index.js
38309
38325
  const execFileAsync$2 = promisify(execFile);
38310
38326
  async function runAppleScript(script, { humanReadableOutput = true, signal } = {}) {
38311
- if (y.platform !== "darwin") throw new Error("macOS only");
38327
+ if (process$1.platform !== "darwin") throw new Error("macOS only");
38312
38328
  const outputArguments = humanReadableOutput ? [] : ["-ss"];
38313
38329
  const execOptions = {};
38314
38330
  if (signal) execOptions.signal = signal;
@@ -38417,14 +38433,14 @@ async function defaultBrowser$1(_execFileAsync = execFileAsync$1) {
38417
38433
  const execFileAsync = promisify(execFile);
38418
38434
  const titleize = (string$2) => string$2.toLowerCase().replaceAll(/(?:^|\s|-)\S/g, (x$2) => x$2.toUpperCase());
38419
38435
  async function defaultBrowser() {
38420
- if (y.platform === "darwin") {
38436
+ if (process$1.platform === "darwin") {
38421
38437
  const id = await defaultBrowserId();
38422
38438
  return {
38423
38439
  name: await bundleName(id),
38424
38440
  id
38425
38441
  };
38426
38442
  }
38427
- if (y.platform === "linux") {
38443
+ if (process$1.platform === "linux") {
38428
38444
  const { stdout: stdout$1 } = await execFileAsync("xdg-mime", [
38429
38445
  "query",
38430
38446
  "default",
@@ -38436,13 +38452,13 @@ async function defaultBrowser() {
38436
38452
  id
38437
38453
  };
38438
38454
  }
38439
- if (y.platform === "win32") return defaultBrowser$1();
38455
+ if (process$1.platform === "win32") return defaultBrowser$1();
38440
38456
  throw new Error("Only macOS, Linux, and Windows are supported");
38441
38457
  }
38442
38458
 
38443
38459
  //#endregion
38444
38460
  //#region node_modules/is-in-ssh/index.js
38445
- const isInSsh = Boolean(y.env.SSH_CONNECTION || y.env.SSH_CLIENT || y.env.SSH_TTY);
38461
+ const isInSsh = Boolean(process$1.env.SSH_CONNECTION || process$1.env.SSH_CLIENT || process$1.env.SSH_TTY);
38446
38462
  var is_in_ssh_default = isInSsh;
38447
38463
 
38448
38464
  //#endregion
@@ -38450,7 +38466,7 @@ var is_in_ssh_default = isInSsh;
38450
38466
  const fallbackAttemptSymbol = Symbol("fallbackAttempt");
38451
38467
  const __dirname = import.meta.url ? path.dirname(fileURLToPath(import.meta.url)) : "";
38452
38468
  const localXdgOpenPath = path.join(__dirname, "xdg-open");
38453
- const { platform: platform$1, arch } = y;
38469
+ const { platform: platform$1, arch } = process$1;
38454
38470
  const tryEachApp = async (apps$1, opener) => {
38455
38471
  if (apps$1.length === 0) return;
38456
38472
  const errors = [];
@@ -38563,7 +38579,7 @@ const baseOpen = async (options) => {
38563
38579
  await fs$1.access(localXdgOpenPath, constants$1.X_OK);
38564
38580
  exeLocalXdgOpen = true;
38565
38581
  } catch {}
38566
- command = y.versions.electron ?? (platform$1 === "android" || isBundled || !exeLocalXdgOpen) ? "xdg-open" : localXdgOpenPath;
38582
+ command = process$1.versions.electron ?? (platform$1 === "android" || isBundled || !exeLocalXdgOpen) ? "xdg-open" : localXdgOpenPath;
38567
38583
  }
38568
38584
  if (appArguments.length > 0) cliArguments.push(...appArguments);
38569
38585
  if (!options.wait) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@base44-preview/cli",
3
- "version": "0.0.15-pr.93.4af3300",
3
+ "version": "0.0.15-pr.95.d246983",
4
4
  "description": "Base44 CLI - Unified interface for managing Base44 applications",
5
5
  "type": "module",
6
6
  "main": "./dist/cli/index.js",