@nocobase/cli 2.1.0-alpha.21 → 2.1.0-alpha.23
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/dist/commands/download.js +170 -37
- package/dist/commands/env/add.js +39 -12
- package/dist/commands/init.js +90 -47
- package/dist/commands/install.js +191 -57
- package/dist/commands/prompts-stages.js +6 -0
- package/dist/commands/prompts-test.js +6 -0
- package/dist/lib/api-client.js +49 -5
- package/dist/lib/cli-locale.js +115 -0
- package/dist/lib/env-auth.js +2 -2
- package/dist/lib/prompt-catalog.js +87 -58
- package/dist/lib/prompt-validators.js +9 -8
- package/dist/lib/prompt-web-ui.js +143 -74
- package/dist/lib/run-npm.js +10 -10
- package/dist/lib/runtime-generator.js +12 -1
- package/dist/locale/en-US.json +333 -0
- package/dist/locale/zh-CN.json +333 -0
- package/package.json +5 -3
package/dist/lib/run-npm.js
CHANGED
|
@@ -6,15 +6,9 @@
|
|
|
6
6
|
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
7
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
8
|
*/
|
|
9
|
-
import { spawn } from 'node:child_process';
|
|
10
9
|
import path from 'node:path';
|
|
10
|
+
import spawn from 'cross-spawn';
|
|
11
11
|
function resolveCommandName(name) {
|
|
12
|
-
if (process.platform !== 'win32' || path.extname(name) || name.includes(path.sep)) {
|
|
13
|
-
return name;
|
|
14
|
-
}
|
|
15
|
-
if (['npm', 'npx', 'pnpm', 'yarn'].includes(name)) {
|
|
16
|
-
return `${name}.cmd`;
|
|
17
|
-
}
|
|
18
12
|
return name;
|
|
19
13
|
}
|
|
20
14
|
function resolveCwd(cwd) {
|
|
@@ -27,14 +21,16 @@ function resolveCwd(cwd) {
|
|
|
27
21
|
export function run(name, args, options) {
|
|
28
22
|
const cwd = resolveCwd(options?.cwd);
|
|
29
23
|
const label = options?.errorName ?? name;
|
|
24
|
+
const command = resolveCommandName(name);
|
|
30
25
|
return new Promise((resolve, reject) => {
|
|
31
|
-
const child = spawn(
|
|
26
|
+
const child = spawn(command, [...args], {
|
|
32
27
|
stdio: options?.stdio ?? 'inherit',
|
|
33
28
|
cwd,
|
|
34
29
|
env: {
|
|
35
30
|
...process.env,
|
|
36
31
|
...options?.env,
|
|
37
32
|
},
|
|
33
|
+
windowsHide: process.platform === 'win32',
|
|
38
34
|
});
|
|
39
35
|
child.once('error', reject);
|
|
40
36
|
child.once('close', (code, signal) => {
|
|
@@ -52,14 +48,16 @@ export function run(name, args, options) {
|
|
|
52
48
|
}
|
|
53
49
|
export function commandSucceeds(name, args, options) {
|
|
54
50
|
const cwd = resolveCwd(options?.cwd);
|
|
51
|
+
const command = resolveCommandName(name);
|
|
55
52
|
return new Promise((resolve) => {
|
|
56
|
-
const child = spawn(
|
|
53
|
+
const child = spawn(command, [...args], {
|
|
57
54
|
cwd,
|
|
58
55
|
env: {
|
|
59
56
|
...process.env,
|
|
60
57
|
...options?.env,
|
|
61
58
|
},
|
|
62
59
|
stdio: 'ignore',
|
|
60
|
+
windowsHide: process.platform === 'win32',
|
|
63
61
|
});
|
|
64
62
|
child.once('error', () => resolve(false));
|
|
65
63
|
child.once('close', (code) => resolve(code === 0));
|
|
@@ -68,14 +66,16 @@ export function commandSucceeds(name, args, options) {
|
|
|
68
66
|
export function commandOutput(name, args, options) {
|
|
69
67
|
const cwd = resolveCwd(options?.cwd);
|
|
70
68
|
const label = options?.errorName ?? name;
|
|
69
|
+
const command = resolveCommandName(name);
|
|
71
70
|
return new Promise((resolve, reject) => {
|
|
72
|
-
const child = spawn(
|
|
71
|
+
const child = spawn(command, [...args], {
|
|
73
72
|
cwd,
|
|
74
73
|
env: {
|
|
75
74
|
...process.env,
|
|
76
75
|
...options?.env,
|
|
77
76
|
},
|
|
78
77
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
78
|
+
windowsHide: process.platform === 'win32',
|
|
79
79
|
});
|
|
80
80
|
let stdout = '';
|
|
81
81
|
let stderr = '';
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
1
9
|
import { createHash } from 'node:crypto';
|
|
2
10
|
import { loadBuildConfig } from './build-config.js';
|
|
3
11
|
import { toKebabCase, toLogicalActionName, toLogicalResourceName, toResourceSegments } from './naming.js';
|
|
@@ -171,7 +179,10 @@ function formatFlagExample(parameter) {
|
|
|
171
179
|
if (parameter.type === 'boolean') {
|
|
172
180
|
return `--${parameter.flagName}`;
|
|
173
181
|
}
|
|
174
|
-
if (parameter.type === 'object') {
|
|
182
|
+
if (parameter.type === 'object' || parameter.jsonEncoded) {
|
|
183
|
+
if (parameter.type === 'array' || parameter.isArray) {
|
|
184
|
+
return `--${parameter.flagName} '[]'`;
|
|
185
|
+
}
|
|
175
186
|
return `--${parameter.flagName} '{\"key\":\"value\"}'`;
|
|
176
187
|
}
|
|
177
188
|
if (parameter.isArray) {
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
{
|
|
2
|
+
"promptCatalog": {
|
|
3
|
+
"common": {
|
|
4
|
+
"cancelled": "Cancelled.",
|
|
5
|
+
"required": "Required",
|
|
6
|
+
"mustBeInteger": "Must be an integer"
|
|
7
|
+
},
|
|
8
|
+
"preset": {
|
|
9
|
+
"required": "\"{{key}}\" is required; set a non-empty values.{{key}} or omit it to prompt.",
|
|
10
|
+
"invalidSelect": "Invalid values.{{key}}: \"{{value}}\". Expected one of: {{options}}",
|
|
11
|
+
"invalidInteger": "Invalid values.{{key}}: must be an integer."
|
|
12
|
+
},
|
|
13
|
+
"nonInteractive": {
|
|
14
|
+
"textRequired": "Non-interactive: \"{{key}}\" is required; set initialValues.{{key}}, yesInitialValues.{{key}}, yesInitialValue on the block, or initialValue.",
|
|
15
|
+
"selectMissingDefault": "Non-interactive: set initialValues.{{key}}, yesInitialValues.{{key}}, or select.initialValue / yesInitialValue / options on the catalog block.",
|
|
16
|
+
"selectInvalidValue": "Invalid value for {{key}}: {{value}}. Expected one of: {{options}}",
|
|
17
|
+
"selectRequiredNoOptions": "Select \"{{key}}\" is required but has no options.",
|
|
18
|
+
"selectRequiredInteractive": "Select \"{{key}}\" is required; set initialValues.{{key}} or select.initialValue / options on the catalog block.",
|
|
19
|
+
"selectMissingInteractiveDefault": "Select \"{{key}}\" has no valid default; set initialValues.{{key}} or options on the catalog block.",
|
|
20
|
+
"passwordRequired": "Non-interactive: \"{{key}}\" is required; set initialValues.{{key}}, yesInitialValues.{{key}}, or initialValue / yesInitialValue on the block.",
|
|
21
|
+
"passwordRequiredNonEmpty": "Non-interactive: \"{{key}}\" is required; set a non-empty initialValues / yesInitialValues / initialValue / yesInitialValue.",
|
|
22
|
+
"integerRequired": "Non-interactive: \"{{key}}\" is required; set initialValues.{{key}}, yesInitialValues.{{key}}, or initialValue / yesInitialValue on the block."
|
|
23
|
+
},
|
|
24
|
+
"web": {
|
|
25
|
+
"pageTitle": "Prompt catalog (local UI)",
|
|
26
|
+
"documentHeading": "Configure parameters (localhost only)",
|
|
27
|
+
"documentHint": "This server is only bound to the loopback interface. After submit, the CLI continues in the same terminal session.",
|
|
28
|
+
"defaultFormTitle": "Form",
|
|
29
|
+
"defaultStepTitle": "Step {{index}}",
|
|
30
|
+
"stepsAriaLabel": "Form steps",
|
|
31
|
+
"stepsSidebarAriaLabel": "Steps",
|
|
32
|
+
"stepNavigationAriaLabel": "Step navigation and submit",
|
|
33
|
+
"submitAriaLabel": "Submit",
|
|
34
|
+
"back": "Back",
|
|
35
|
+
"next": "Next",
|
|
36
|
+
"submit": "Submit & continue in terminal",
|
|
37
|
+
"checking": "Checking...",
|
|
38
|
+
"sending": "Sending...",
|
|
39
|
+
"successTitle": "Success",
|
|
40
|
+
"errorTitle": "Error",
|
|
41
|
+
"savedAndClosing": "Saved. This tab will close automatically in 5 seconds.",
|
|
42
|
+
"savedCloseBlocked": "Saved. Automatic close was blocked by the browser. You can close this tab now.",
|
|
43
|
+
"invalidValue": "Invalid value",
|
|
44
|
+
"invalidRequest": "Invalid request",
|
|
45
|
+
"invalidStep": "Invalid or missing wizard step.",
|
|
46
|
+
"invalidField": "Invalid or missing field key.",
|
|
47
|
+
"fieldRequired": "Field \"{{key}}\" is required.",
|
|
48
|
+
"fieldMustBeInteger": "Field \"{{key}}\" must be an integer."
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"validators": {
|
|
52
|
+
"apiBaseUrl": {
|
|
53
|
+
"invalid": "Enter a valid URL, for example {{example}}.",
|
|
54
|
+
"invalidProtocol": "URL must start with http:// or https://, for example {{example}}."
|
|
55
|
+
},
|
|
56
|
+
"envKey": {
|
|
57
|
+
"invalid": "Use letters and numbers only."
|
|
58
|
+
},
|
|
59
|
+
"tcpPort": {
|
|
60
|
+
"invalid": "Enter a valid TCP port between 1 and 65535, for example {{example}}.",
|
|
61
|
+
"allocateFailed": "Failed to allocate an available TCP port.",
|
|
62
|
+
"allocateNotDockerPublished": "Failed to allocate an available TCP port that is not already published by Docker.",
|
|
63
|
+
"alreadyInUse": "Port {{port}} is already in use. Choose another port.",
|
|
64
|
+
"alreadyInUseByDocker": "Port {{port}} is already in use by a Docker container. Choose another port."
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"commands": {
|
|
68
|
+
"envAdd": {
|
|
69
|
+
"prompts": {
|
|
70
|
+
"name": {
|
|
71
|
+
"message": "What would you like to call this environment?",
|
|
72
|
+
"placeholder": "default"
|
|
73
|
+
},
|
|
74
|
+
"scope": {
|
|
75
|
+
"message": "Where should this connection be saved?",
|
|
76
|
+
"projectLabel": "Project",
|
|
77
|
+
"projectHint": ".nocobase in this repo",
|
|
78
|
+
"globalLabel": "Global",
|
|
79
|
+
"globalHint": "user-level config"
|
|
80
|
+
},
|
|
81
|
+
"apiBaseUrl": {
|
|
82
|
+
"message": "What is the API base URL?",
|
|
83
|
+
"placeholder": "http://localhost:13000/api"
|
|
84
|
+
},
|
|
85
|
+
"authType": {
|
|
86
|
+
"message": "How would you like to sign in?",
|
|
87
|
+
"oauthLabel": "OAuth (browser login)",
|
|
88
|
+
"oauthHint": "runs nb env auth after save",
|
|
89
|
+
"tokenLabel": "API token / API key"
|
|
90
|
+
},
|
|
91
|
+
"accessToken": {
|
|
92
|
+
"message": "Enter an API token or API key",
|
|
93
|
+
"placeholder": "Enter your API token / API key"
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
"download": {
|
|
98
|
+
"failures": {
|
|
99
|
+
"dependencyInstall": {
|
|
100
|
+
"title": "Couldn't finish preparing the local NocoBase app.",
|
|
101
|
+
"body": "The download completed, but dependency installation did not finish successfully.",
|
|
102
|
+
"hint": "Run the same command again with `--verbose` to see the full install logs."
|
|
103
|
+
},
|
|
104
|
+
"gitClone": {
|
|
105
|
+
"title": "Couldn't download NocoBase from Git.",
|
|
106
|
+
"body": "The CLI was not able to clone the selected NocoBase repository.",
|
|
107
|
+
"hint": "Run the same command again with `--verbose` to see the full clone logs."
|
|
108
|
+
},
|
|
109
|
+
"dockerPull": {
|
|
110
|
+
"title": "Couldn't download the Docker image.",
|
|
111
|
+
"body": "The CLI was not able to pull the selected NocoBase image.",
|
|
112
|
+
"hint": "Run the same command again with `--verbose` to see the full Docker pull logs."
|
|
113
|
+
},
|
|
114
|
+
"dockerSave": {
|
|
115
|
+
"title": "The Docker image was pulled, but saving the tar file failed.",
|
|
116
|
+
"body": "The CLI could not finish exporting the image to the target tarball path.",
|
|
117
|
+
"hint": "Run the same command again with `--verbose` to see the full Docker save logs."
|
|
118
|
+
},
|
|
119
|
+
"scaffold": {
|
|
120
|
+
"title": "Couldn't create the local NocoBase app scaffold.",
|
|
121
|
+
"body": "The CLI was not able to finish generating the initial app files.",
|
|
122
|
+
"hint": "Run the same command again with `--verbose` to see the full scaffold logs."
|
|
123
|
+
},
|
|
124
|
+
"build": {
|
|
125
|
+
"title": "The local NocoBase app was downloaded, but the build step failed.",
|
|
126
|
+
"body": "The CLI could not finish building the downloaded source code.",
|
|
127
|
+
"hint": "Run the same command again with `--verbose` to see the full build logs."
|
|
128
|
+
},
|
|
129
|
+
"generic": {
|
|
130
|
+
"title": "Couldn't finish downloading NocoBase.",
|
|
131
|
+
"body": "The CLI hit an unexpected command failure while preparing the download.",
|
|
132
|
+
"hint": "Run the same command again with `--verbose` to see the full command logs."
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
"prompts": {
|
|
136
|
+
"source": {
|
|
137
|
+
"message": "How would you like to get NocoBase?",
|
|
138
|
+
"dockerLabel": "Docker install (Recommended)",
|
|
139
|
+
"dockerHint": "Best for no-code and low-maintenance setups. You can upgrade later by pulling a newer image and restarting the app.",
|
|
140
|
+
"npmLabel": "create-nocobase-app install",
|
|
141
|
+
"npmHint": "Best when you want an app project with business code kept separate from the NocoBase framework, while still supporting low-code development.",
|
|
142
|
+
"gitLabel": "Git source install",
|
|
143
|
+
"gitHint": "Best when you want to try the latest unreleased changes, contribute code, or debug and modify NocoBase source directly. This option is more developer-oriented."
|
|
144
|
+
},
|
|
145
|
+
"version": {
|
|
146
|
+
"message": "Which version would you like to use?",
|
|
147
|
+
"latestLabel": "latest",
|
|
148
|
+
"latestHint": "Stable release. Best for production use and the most predictable experience. Currently unavailable.",
|
|
149
|
+
"betaLabel": "beta",
|
|
150
|
+
"betaHint": "Preview release. Good for trying upcoming features before general release.",
|
|
151
|
+
"alphaLabel": "alpha",
|
|
152
|
+
"alphaHint": "Development release. Includes the newest changes, but may be incomplete or unstable.",
|
|
153
|
+
"otherLabel": "Other",
|
|
154
|
+
"otherHint": "Enter another package version, Docker tag, or Git ref manually, such as a branch name."
|
|
155
|
+
},
|
|
156
|
+
"otherVersion": {
|
|
157
|
+
"message": "Enter the version, Docker tag, or Git ref you want to use.",
|
|
158
|
+
"placeholder": "For example: fix/cli-v2"
|
|
159
|
+
},
|
|
160
|
+
"dockerRegistry": {
|
|
161
|
+
"message": "Which Docker registry would you like to use? The image tag is set separately in Version.",
|
|
162
|
+
"placeholder": "nocobase/nocobase"
|
|
163
|
+
},
|
|
164
|
+
"dockerPlatform": {
|
|
165
|
+
"message": "Which Docker image platform should be used?",
|
|
166
|
+
"autoLabel": "Auto",
|
|
167
|
+
"autoHint": "Use Docker default for this machine"
|
|
168
|
+
},
|
|
169
|
+
"dockerSave": {
|
|
170
|
+
"message": "Save the Docker image as a tar file"
|
|
171
|
+
},
|
|
172
|
+
"gitUrl": {
|
|
173
|
+
"message": "Git repository URL",
|
|
174
|
+
"placeholder": "https://github.com/nocobase/nocobase.git"
|
|
175
|
+
},
|
|
176
|
+
"outputDir": {
|
|
177
|
+
"message": "Download location",
|
|
178
|
+
"placeholder": "e.g. ./nocobase-latest"
|
|
179
|
+
},
|
|
180
|
+
"npmRegistry": {
|
|
181
|
+
"message": "npm registry URL (optional)",
|
|
182
|
+
"placeholder": "Leave empty to use the default registry"
|
|
183
|
+
},
|
|
184
|
+
"replace": {
|
|
185
|
+
"message": "Clear the app directory if it already contains files"
|
|
186
|
+
},
|
|
187
|
+
"devDependencies": {
|
|
188
|
+
"message": "Install development dependencies (npm only)"
|
|
189
|
+
},
|
|
190
|
+
"build": {
|
|
191
|
+
"message": "Build the app after download"
|
|
192
|
+
},
|
|
193
|
+
"buildDts": {
|
|
194
|
+
"message": "Generate TypeScript declaration files"
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
"install": {
|
|
199
|
+
"validation": {
|
|
200
|
+
"builtinDbUnsupported": "Built-in database does not support \"{{dialect}}\" yet. Choose PostgreSQL, MySQL, or MariaDB, or turn off built-in database."
|
|
201
|
+
},
|
|
202
|
+
"prompts": {
|
|
203
|
+
"env": {
|
|
204
|
+
"message": "What would you like to call this app?",
|
|
205
|
+
"placeholder": "local"
|
|
206
|
+
},
|
|
207
|
+
"lang": {
|
|
208
|
+
"message": "Which language would you like to use?"
|
|
209
|
+
},
|
|
210
|
+
"appRootPath": {
|
|
211
|
+
"message": "Where should this app be stored?",
|
|
212
|
+
"placeholder": "./<env>/source/"
|
|
213
|
+
},
|
|
214
|
+
"appPort": {
|
|
215
|
+
"message": "Which port should this app use?",
|
|
216
|
+
"placeholder": "13000"
|
|
217
|
+
},
|
|
218
|
+
"storagePath": {
|
|
219
|
+
"message": "Where should uploads and local files be stored?",
|
|
220
|
+
"placeholder": "./<env>/storage/"
|
|
221
|
+
},
|
|
222
|
+
"fetchSource": {
|
|
223
|
+
"message": "Download NocoBase automatically if the app directory is empty?"
|
|
224
|
+
},
|
|
225
|
+
"dbDialect": {
|
|
226
|
+
"message": "Which database would you like to use?"
|
|
227
|
+
},
|
|
228
|
+
"builtinDb": {
|
|
229
|
+
"message": "Would you like to use the built-in database?"
|
|
230
|
+
},
|
|
231
|
+
"builtinDbImage": {
|
|
232
|
+
"message": "Which Docker image should be used for the built-in database?",
|
|
233
|
+
"placeholder": "postgres:16"
|
|
234
|
+
},
|
|
235
|
+
"dbHost": {
|
|
236
|
+
"message": "What is the database host?",
|
|
237
|
+
"placeholder": "127.0.0.1"
|
|
238
|
+
},
|
|
239
|
+
"dbPort": {
|
|
240
|
+
"message": "What is the database port?",
|
|
241
|
+
"placeholder": "5432"
|
|
242
|
+
},
|
|
243
|
+
"dbDatabase": {
|
|
244
|
+
"message": "What is the database name?"
|
|
245
|
+
},
|
|
246
|
+
"dbUser": {
|
|
247
|
+
"message": "What is the database username?"
|
|
248
|
+
},
|
|
249
|
+
"dbPassword": {
|
|
250
|
+
"message": "What is the database password?"
|
|
251
|
+
},
|
|
252
|
+
"rootUsername": {
|
|
253
|
+
"message": "Choose the initial admin username",
|
|
254
|
+
"placeholder": "nocobase"
|
|
255
|
+
},
|
|
256
|
+
"rootEmail": {
|
|
257
|
+
"message": "What is the initial admin email?",
|
|
258
|
+
"placeholder": "admin@nocobase.com"
|
|
259
|
+
},
|
|
260
|
+
"rootPassword": {
|
|
261
|
+
"message": "Choose the initial admin password"
|
|
262
|
+
},
|
|
263
|
+
"rootNickname": {
|
|
264
|
+
"message": "What display name should the initial admin use?",
|
|
265
|
+
"placeholder": "Super Admin"
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
"init": {
|
|
270
|
+
"validation": {
|
|
271
|
+
"envExists": "Env \"{{envName}}\" already exists in this workspace. Choose another env name."
|
|
272
|
+
},
|
|
273
|
+
"messages": {
|
|
274
|
+
"title": "Set Up Your NocoBase AI Workspace",
|
|
275
|
+
"appNameRequiredWhenSkipped": "Env name is required when prompts are skipped.",
|
|
276
|
+
"appNameEnvHelp": "Use `nb init --yes --env <envName>` to continue.",
|
|
277
|
+
"resumeEnvRequired": "Env name is required when resuming setup.",
|
|
278
|
+
"resumeEnvHelp": "Use `nb init --resume --env <envName>` to continue.",
|
|
279
|
+
"uiOpening": "A local setup form will open in your browser. That form needs a person to fill it in. If you are using an AI agent, do not stop this process while the CLI waits for the submission.",
|
|
280
|
+
"uiReady": "Local setup form is ready.",
|
|
281
|
+
"uiReadyHelp": "If your browser does not open automatically, copy the URL below into your browser to continue. Keep this terminal session running while the CLI waits for the submission.",
|
|
282
|
+
"uiOpenBrowserFallback": "We could not open your browser automatically. Copy the URL above into your browser to continue setup, and keep this terminal session running. If you are using an AI agent, do not stop the current process."
|
|
283
|
+
},
|
|
284
|
+
"prompts": {
|
|
285
|
+
"appName": {
|
|
286
|
+
"message": "What should this environment use for `--env`?",
|
|
287
|
+
"placeholder": "local"
|
|
288
|
+
},
|
|
289
|
+
"hasNocobase": {
|
|
290
|
+
"message": "Do you already have a NocoBase application?",
|
|
291
|
+
"noLabel": "I don't have a NocoBase application yet",
|
|
292
|
+
"yesLabel": "I already have a NocoBase application"
|
|
293
|
+
},
|
|
294
|
+
"installSkills": {
|
|
295
|
+
"message": "Install NocoBase AI coding skills (nocobase/skills)?"
|
|
296
|
+
},
|
|
297
|
+
"apiBaseUrl": {
|
|
298
|
+
"message": "API base URL",
|
|
299
|
+
"placeholder": "http://localhost:13000/api"
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
"webUi": {
|
|
303
|
+
"pageTitle": "Set Up Your NocoBase AI Workspace",
|
|
304
|
+
"documentHeading": "Set Up Your NocoBase AI Workspace",
|
|
305
|
+
"documentHint": "Connect an existing NocoBase app, or install a new one and connect it, so coding agents can work with NocoBase in this workspace.",
|
|
306
|
+
"gettingStarted": {
|
|
307
|
+
"title": "Getting started",
|
|
308
|
+
"description": "Pick your setup path."
|
|
309
|
+
},
|
|
310
|
+
"connectExistingApp": {
|
|
311
|
+
"title": "Connect an existing app",
|
|
312
|
+
"description": "Add your app connection."
|
|
313
|
+
},
|
|
314
|
+
"createNewApp": {
|
|
315
|
+
"title": "Create a new app",
|
|
316
|
+
"description": "Set project basics."
|
|
317
|
+
},
|
|
318
|
+
"downloadAppFiles": {
|
|
319
|
+
"title": "Download app files",
|
|
320
|
+
"description": "Choose source and options."
|
|
321
|
+
},
|
|
322
|
+
"configureDatabase": {
|
|
323
|
+
"title": "Configure the database",
|
|
324
|
+
"description": "Use built-in or custom."
|
|
325
|
+
},
|
|
326
|
+
"createAdminAccount": {
|
|
327
|
+
"title": "Create an admin account",
|
|
328
|
+
"description": "Set up the first admin."
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|