deployai 0.1.0-beta.1 → 0.1.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -9
- package/dist/index.js +540 -160
- package/package.json +33 -15
package/dist/index.js
CHANGED
|
@@ -12,6 +12,9 @@ import { Command } from "commander";
|
|
|
12
12
|
// src/api.ts
|
|
13
13
|
import { arch, platform } from "os";
|
|
14
14
|
|
|
15
|
+
// ../shared/src/plans.ts
|
|
16
|
+
var VAT_RATE = 0.18;
|
|
17
|
+
|
|
15
18
|
// ../shared/src/blockers.ts
|
|
16
19
|
var ISSUES = [
|
|
17
20
|
// Blockers
|
|
@@ -117,7 +120,7 @@ var ISSUES = [
|
|
|
117
120
|
code: "adapter_missing_sveltekit",
|
|
118
121
|
severity: "blocker",
|
|
119
122
|
titleEn: "SvelteKit adapter is missing",
|
|
120
|
-
titleHe: "\u05D7\u05E1\u05E8 \u05DE\u05EA\u05D0\u05DD \u05DC
|
|
123
|
+
titleHe: "\u05D7\u05E1\u05E8 \u05DE\u05EA\u05D0\u05DD \u05DC\u05BESvelteKit",
|
|
121
124
|
agentLine: "SvelteKit is used without the Cloudflare adapter{detail} ({loc}).",
|
|
122
125
|
fixForAgent: 'Keep SvelteKit. Install @sveltejs/adapter-cloudflare as a dev dependency, then where the adapter is set (vite.config.ts on SvelteKit 3, svelte.config.js before) import adapter from "@sveltejs/adapter-cloudflare" and set adapter: adapter(). Remove @sveltejs/adapter-auto or other adapters. Do not convert the site.'
|
|
123
126
|
},
|
|
@@ -125,7 +128,7 @@ var ISSUES = [
|
|
|
125
128
|
code: "adapter_missing_react_router",
|
|
126
129
|
severity: "blocker",
|
|
127
130
|
titleEn: "React Router adapter is missing",
|
|
128
|
-
titleHe: "\u05D7\u05E1\u05E8 \u05DE\u05EA\u05D0\u05DD \u05DC
|
|
131
|
+
titleHe: "\u05D7\u05E1\u05E8 \u05DE\u05EA\u05D0\u05DD \u05DC\u05BEReact Router",
|
|
129
132
|
agentLine: "React Router (framework mode) is used without the Cloudflare Vite plugin{detail} ({loc}).",
|
|
130
133
|
fixForAgent: 'Keep React Router. Install @cloudflare/vite-plugin and wrangler as dev dependencies, add cloudflare({ viteEnvironment: { name: "ssr" } }) before reactRouter() in the vite.config plugins, add workers/app.ts that exports default { fetch } and passes each request to createRequestHandler(() => import("virtual:react-router/server-build")) from react-router, and add wrangler.jsonc with "main": "./workers/app.ts" and "compatibility_flags": ["nodejs_compat"]. Follow the official Cloudflare React Router template. Do not convert the site.'
|
|
131
134
|
},
|
|
@@ -141,7 +144,7 @@ var ISSUES = [
|
|
|
141
144
|
code: "adapter_missing_nextjs",
|
|
142
145
|
severity: "blocker",
|
|
143
146
|
titleEn: "Next.js needs the OpenNext adapter",
|
|
144
|
-
titleHe: "\u05DC
|
|
147
|
+
titleHe: "\u05DC\u05BENext.js \u05D7\u05E1\u05E8 \u05D4\u05DE\u05EA\u05D0\u05DD OpenNext",
|
|
145
148
|
agentLine: "Next.js{detail} is used without the OpenNext Cloudflare adapter ({loc}).",
|
|
146
149
|
fixForAgent: 'Keep Next.js. Install @opennextjs/cloudflare as a dependency and add open-next.config.ts with: import { defineCloudflareConfig } from "@opennextjs/cloudflare"; export default defineCloudflareConfig();. DeployAI then builds with opennextjs-cloudflare build. Next.js on DeployAI is in beta: tell the user, and do not convert the site.'
|
|
147
150
|
},
|
|
@@ -149,7 +152,7 @@ var ISSUES = [
|
|
|
149
152
|
code: "adapter_missing_solidstart",
|
|
150
153
|
severity: "blocker",
|
|
151
154
|
titleEn: "SolidStart preset is missing",
|
|
152
|
-
titleHe: "\u05D7\u05E1\u05E8\u05D4 \u05D4\u05D2\u05D3\u05E8\u05D4 \u05DC
|
|
155
|
+
titleHe: "\u05D7\u05E1\u05E8\u05D4 \u05D4\u05D2\u05D3\u05E8\u05D4 \u05DC\u05BESolidStart",
|
|
153
156
|
agentLine: "SolidStart is used without the Cloudflare preset{detail} ({loc}).",
|
|
154
157
|
fixForAgent: 'Keep SolidStart. Set server: { preset: "cloudflare_module" } in app.config.ts (in vite.config.ts on SolidStart 2). SolidStart on DeployAI is in beta: tell the user.'
|
|
155
158
|
},
|
|
@@ -157,7 +160,7 @@ var ISSUES = [
|
|
|
157
160
|
code: "adapter_missing_qwik",
|
|
158
161
|
severity: "blocker",
|
|
159
162
|
titleEn: "Qwik City adapter is missing",
|
|
160
|
-
titleHe: "\u05D7\u05E1\u05E8 \u05DE\u05EA\u05D0\u05DD \u05DC
|
|
163
|
+
titleHe: "\u05D7\u05E1\u05E8 \u05DE\u05EA\u05D0\u05DD \u05DC\u05BEQwik City",
|
|
161
164
|
agentLine: "Qwik City is used without the Cloudflare adapter{detail} ({loc}).",
|
|
162
165
|
fixForAgent: "Keep Qwik. Run npm run qwik add cloudflare-pages, which adds adapters/cloudflare-pages/vite.config.ts and the build.server script. Qwik City on DeployAI is in beta: tell the user."
|
|
163
166
|
},
|
|
@@ -165,7 +168,7 @@ var ISSUES = [
|
|
|
165
168
|
code: "adapter_missing_tanstack_start",
|
|
166
169
|
severity: "blocker",
|
|
167
170
|
titleEn: "TanStack Start adapter is missing",
|
|
168
|
-
titleHe: "\u05D7\u05E1\u05E8 \u05DE\u05EA\u05D0\u05DD \u05DC
|
|
171
|
+
titleHe: "\u05D7\u05E1\u05E8 \u05DE\u05EA\u05D0\u05DD \u05DC\u05BETanStack Start",
|
|
169
172
|
agentLine: "TanStack Start is used without the Cloudflare Vite plugin{detail} ({loc}).",
|
|
170
173
|
fixForAgent: 'Keep TanStack Start. Install @cloudflare/vite-plugin and wrangler as dev dependencies, add cloudflare({ viteEnvironment: { name: "ssr" } }) to the vite.config plugins, and add wrangler.jsonc with "main": "@tanstack/react-start/server-entry" and "compatibility_flags": ["nodejs_compat"]. TanStack Start on DeployAI is in beta: tell the user.'
|
|
171
174
|
},
|
|
@@ -202,6 +205,14 @@ var ISSUES = [
|
|
|
202
205
|
fixForAgent: "A custom server that listens on a port cannot run here. Move the routes to Hono (very similar to Express and runs on Cloudflare Workers) or to Astro API routes, and remove app.listen."
|
|
203
206
|
},
|
|
204
207
|
// Warnings
|
|
208
|
+
{
|
|
209
|
+
code: "email_smtp",
|
|
210
|
+
severity: "warning",
|
|
211
|
+
titleEn: "Sends email through SMTP, which does not run here",
|
|
212
|
+
titleHe: "\u05E9\u05D5\u05DC\u05D7 \u05DE\u05D9\u05D9\u05DC \u05D3\u05E8\u05DA SMTP, \u05E9\u05DC\u05D0 \u05E2\u05D5\u05D1\u05D3 \u05D0\u05E6\u05DC\u05E0\u05D5",
|
|
213
|
+
agentLine: "The site sends email with{detail}, which needs SMTP. SMTP does not run on DeployAI, so the email part will fail.",
|
|
214
|
+
fixForAgent: "For email to the site owner (a form answer, a new order), use the built-in email: POST JSON { subject, text, replyTo } to `${DEPLOYAI_API}/api/site/notify` with Authorization: Bearer DEPLOYAI_KEY, with no keys to ask for. For email to customers, use an HTTP email API (Resend, Postmark) with its key set by npx deployai@latest env set. Remove the SMTP library."
|
|
215
|
+
},
|
|
205
216
|
{
|
|
206
217
|
code: "no_build_script",
|
|
207
218
|
severity: "warning",
|
|
@@ -697,7 +708,7 @@ function frameworkDisplay(d) {
|
|
|
697
708
|
|
|
698
709
|
// ../shared/src/issue-help.ts
|
|
699
710
|
var HELP_ORIGIN = "https://deployai.co.il";
|
|
700
|
-
var DB_PROMPT_HE = "\u05D4\u05E2\u05D1\u05E8 \u05D0\u05EA \u05E9\u05DB\u05D1\u05EA \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DC
|
|
711
|
+
var DB_PROMPT_HE = "\u05D4\u05E2\u05D1\u05E8 \u05D0\u05EA \u05E9\u05DB\u05D1\u05EA \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DC\u05BECloudflare D1 (SQLite). \u05E2\u05DD Prisma \u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\u05BEprovider \u05E9\u05DC sqlite \u05D5\u05D1\u05DE\u05EA\u05D0\u05DD \u05E9\u05DC D1, \u05D0\u05D5 \u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\u05BEDrizzle \u05E2\u05DD drizzle-orm/d1. \u05E9\u05DE\u05D5\u05E8 \u05E2\u05DC \u05D0\u05D5\u05EA\u05DF \u05D8\u05D1\u05DC\u05D0\u05D5\u05EA \u05D5\u05E9\u05D3\u05D5\u05EA.";
|
|
701
712
|
function serverDb(nameHe, nameEn) {
|
|
702
713
|
return {
|
|
703
714
|
he: {
|
|
@@ -736,7 +747,7 @@ var ISSUE_HELP = {
|
|
|
736
747
|
what: "\u05D4\u05D0\u05EA\u05E8 \u05E9\u05D5\u05DE\u05E8 \u05E7\u05D1\u05E6\u05D9\u05DD \u05D1\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05E2\u05DC \u05D4\u05E9\u05E8\u05EA, \u05DC\u05DE\u05E9\u05DC \u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05E9\u05D2\u05D5\u05DC\u05E9\u05D9\u05DD \u05DE\u05E2\u05DC\u05D9\u05DD \u05D0\u05D5 \u05E7\u05D5\u05D1\u05E5 \u05E2\u05DD \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD.",
|
|
737
748
|
why: "\u05DC\u05D0\u05EA\u05E8\u05D9\u05DD \u05D0\u05E6\u05DC\u05E0\u05D5 \u05D0\u05D9\u05DF \u05D3\u05D9\u05E1\u05E7 \u05E7\u05D1\u05D5\u05E2. \u05DB\u05DC \u05DB\u05E0\u05D9\u05E1\u05D4 \u05DC\u05D0\u05EA\u05E8 \u05DE\u05EA\u05D7\u05D9\u05DC\u05D4 \u05DE\u05D7\u05D3\u05E9, \u05D5\u05E7\u05D5\u05D1\u05E5 \u05E9\u05E0\u05E9\u05DE\u05E8 \u05E0\u05E2\u05DC\u05DD \u05DE\u05D9\u05D3. \u05DC\u05DB\u05DF \u05D4\u05D0\u05EA\u05E8 \u05DC\u05D0 \u05D9\u05E2\u05DC\u05D4 \u05E2\u05D3 \u05E9\u05D6\u05D4 \u05D9\u05E9\u05EA\u05E0\u05D4.",
|
|
738
749
|
fix: ["\u05E7\u05D1\u05E6\u05D9\u05DD \u05E9\u05D2\u05D5\u05DC\u05E9\u05D9\u05DD \u05DE\u05E2\u05DC\u05D9\u05DD \u05E0\u05E9\u05DE\u05E8\u05D9\u05DD \u05D1\u05D0\u05D7\u05E1\u05D5\u05DF \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD \u05E9\u05DC\u05E0\u05D5.", "\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DB\u05DE\u05D5 \u05D4\u05D6\u05DE\u05E0\u05D5\u05EA \u05D0\u05D5 \u05E4\u05E0\u05D9\u05D5\u05EA \u05E0\u05E9\u05DE\u05E8\u05D9\u05DD \u05D1\u05DE\u05E1\u05D3 \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E9\u05DC\u05E0\u05D5.", "\u05E7\u05E8\u05D9\u05D0\u05D4 \u05E9\u05DC \u05E7\u05D1\u05E6\u05D9\u05DD \u05E9\u05D4\u05DD \u05D7\u05DC\u05E7 \u05DE\u05D4\u05D0\u05EA\u05E8 \u05DE\u05D5\u05EA\u05E8\u05EA, \u05DB\u05E9\u05D4\u05D9\u05D0 \u05E7\u05D5\u05E8\u05D9\u05EA \u05D1\u05D6\u05DE\u05DF \u05D4\u05D1\u05E0\u05D9\u05D9\u05D4."],
|
|
739
|
-
prompt: "\u05D4\u05D0\u05EA\u05E8 \u05E8\u05E5 \u05D1\u05DC\u05D9 \u05D3\u05D9\u05E1\u05E7 \u05E9\u05D0\u05E4\u05E9\u05E8 \u05DC\u05DB\u05EA\u05D5\u05D1 \u05D0\u05DC\u05D9\u05D5. \u05E9\u05DE\u05D5\u05E8 \u05E7\u05D1\u05E6\u05D9\u05DD \u05E9\u05DE\u05D5\u05E2\u05DC\u05D9\u05DD \u05D1
|
|
750
|
+
prompt: "\u05D4\u05D0\u05EA\u05E8 \u05E8\u05E5 \u05D1\u05DC\u05D9 \u05D3\u05D9\u05E1\u05E7 \u05E9\u05D0\u05E4\u05E9\u05E8 \u05DC\u05DB\u05EA\u05D5\u05D1 \u05D0\u05DC\u05D9\u05D5. \u05E9\u05DE\u05D5\u05E8 \u05E7\u05D1\u05E6\u05D9\u05DD \u05E9\u05DE\u05D5\u05E2\u05DC\u05D9\u05DD \u05D1\u05BER2 (\u05D0\u05D7\u05E1\u05D5\u05DF \u05E7\u05D1\u05E6\u05D9\u05DD) \u05D5\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05D1\u05BED1. \u05E7\u05E8\u05D9\u05D0\u05D4 \u05E9\u05DC \u05E7\u05D1\u05E6\u05D9\u05DD \u05DE\u05EA\u05D5\u05DA \u05D4\u05E4\u05E8\u05D5\u05D9\u05E7\u05D8 \u05DE\u05D5\u05EA\u05E8\u05EA \u05E8\u05E7 \u05D0\u05DD \u05D4\u05D9\u05D0 \u05E7\u05D5\u05E8\u05D9\u05EA \u05D1\u05D6\u05DE\u05DF \u05D4\u05D1\u05E0\u05D9\u05D9\u05D4."
|
|
740
751
|
},
|
|
741
752
|
en: {
|
|
742
753
|
what: "The site saves files in a folder on the server, such as images that visitors upload or a file with data.",
|
|
@@ -748,10 +759,10 @@ var ISSUE_HELP = {
|
|
|
748
759
|
unsupported_db_mysql: serverDb("MySQL", "MySQL"),
|
|
749
760
|
unsupported_db_mongodb: {
|
|
750
761
|
he: {
|
|
751
|
-
what: "\u05D4\u05D0\u05EA\u05E8 \u05E9\u05D5\u05DE\u05E8 \u05D0\u05EA \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E9\u05DC\u05D5 \u05D1
|
|
752
|
-
why: "\u05DB\u05DC \u05D0\u05EA\u05E8 \u05D0\u05E6\u05DC\u05E0\u05D5 \u05DE\u05E7\u05D1\u05DC \u05DE\u05E1\u05D3 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DE\u05D5\u05D1\u05E0\u05D4, \u05D5\u05D0\u05D9\u05DF \u05D7\u05D9\u05D1\u05D5\u05E8 \u05DC
|
|
762
|
+
what: "\u05D4\u05D0\u05EA\u05E8 \u05E9\u05D5\u05DE\u05E8 \u05D0\u05EA \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E9\u05DC\u05D5 \u05D1\u05BEMongoDB, \u05DE\u05E1\u05D3 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E9\u05E8\u05E5 \u05E2\u05DC \u05E9\u05E8\u05EA \u05E0\u05E4\u05E8\u05D3.",
|
|
763
|
+
why: "\u05DB\u05DC \u05D0\u05EA\u05E8 \u05D0\u05E6\u05DC\u05E0\u05D5 \u05DE\u05E7\u05D1\u05DC \u05DE\u05E1\u05D3 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DE\u05D5\u05D1\u05E0\u05D4, \u05D5\u05D0\u05D9\u05DF \u05D7\u05D9\u05D1\u05D5\u05E8 \u05DC\u05BEMongoDB. \u05D4\u05D0\u05EA\u05E8 \u05DC\u05D0 \u05D9\u05E2\u05DC\u05D4 \u05E2\u05D3 \u05E9\u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05D9\u05E2\u05D1\u05E8\u05D5 \u05DC\u05DE\u05E1\u05D3 \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E9\u05DC\u05E0\u05D5.",
|
|
753
764
|
fix: ["\u05D4\u05E1\u05D5\u05DB\u05DF \u05E9\u05DC\u05DB\u05DD \u05D4\u05D5\u05E4\u05DA \u05DB\u05DC \u05D0\u05D5\u05E1\u05E3 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DC\u05D8\u05D1\u05DC\u05D4 \u05D1\u05DE\u05E1\u05D3 \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E9\u05DC\u05E0\u05D5, \u05E2\u05DD \u05E2\u05DE\u05D5\u05D3\u05D5\u05EA \u05D1\u05E8\u05D5\u05E8\u05D5\u05EA.", "\u05D0\u05DD \u05D9\u05E9 \u05DB\u05D1\u05E8 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05D0\u05DE\u05D9\u05EA\u05D9\u05D9\u05DD, \u05E9\u05D5\u05DE\u05E8\u05D9\u05DD \u05DE\u05D4\u05DD \u05E2\u05D5\u05EA\u05E7 \u05DC\u05E4\u05E0\u05D9 \u05D4\u05DE\u05E2\u05D1\u05E8.", "\u05DE\u05E8\u05D9\u05E6\u05D9\u05DD \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D4\u05D1\u05D3\u05D9\u05E7\u05D4."],
|
|
754
|
-
prompt: "\u05D4\u05E2\u05D1\u05E8 \u05D0\u05EA \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DC
|
|
765
|
+
prompt: "\u05D4\u05E2\u05D1\u05E8 \u05D0\u05EA \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DC\u05BECloudflare D1 (SQLite). \u05D4\u05E4\u05D5\u05DA \u05DB\u05DC collection \u05DC\u05D8\u05D1\u05DC\u05D4 \u05E2\u05DD \u05E2\u05DE\u05D5\u05D3\u05D5\u05EA \u05D1\u05E8\u05D5\u05E8\u05D5\u05EA, \u05D5\u05E9\u05DE\u05D5\u05E8 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DE\u05E7\u05D5\u05E0\u05E0\u05D9\u05DD \u05D1\u05E2\u05DE\u05D5\u05D3\u05D5\u05EA \u05D8\u05E7\u05E1\u05D8 \u05E9\u05DC JSON \u05DB\u05E9\u05E6\u05E8\u05D9\u05DA."
|
|
755
766
|
},
|
|
756
767
|
en: {
|
|
757
768
|
what: "The site keeps its data in MongoDB, a database that runs on a separate server.",
|
|
@@ -764,7 +775,7 @@ var ISSUE_HELP = {
|
|
|
764
775
|
what: "\u05D4\u05D0\u05EA\u05E8 \u05E9\u05D5\u05DE\u05E8 \u05D0\u05EA \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05D1\u05E7\u05D5\u05D1\u05E5 \u05DE\u05E1\u05D3 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E9\u05E0\u05DE\u05E6\u05D0 \u05D1\u05EA\u05D5\u05DA \u05D4\u05E4\u05E8\u05D5\u05D9\u05E7\u05D8.",
|
|
765
776
|
why: "\u05D0\u05D9\u05DF \u05D0\u05E6\u05DC\u05E0\u05D5 \u05D3\u05D9\u05E1\u05E7 \u05E7\u05D1\u05D5\u05E2, \u05D0\u05D6 \u05E7\u05D5\u05D1\u05E5 \u05DB\u05D6\u05D4 \u05DC\u05D0 \u05E0\u05E9\u05DE\u05E8 \u05D1\u05D9\u05DF \u05DB\u05E0\u05D9\u05E1\u05D4 \u05DC\u05DB\u05E0\u05D9\u05E1\u05D4. \u05D4\u05D7\u05D3\u05E9\u05D5\u05EA \u05D4\u05D8\u05D5\u05D1\u05D5\u05EA: \u05DE\u05E1\u05D3 \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E9\u05DC\u05E0\u05D5 \u05DE\u05D3\u05D1\u05E8 \u05D1\u05D0\u05D5\u05EA\u05D4 \u05E9\u05E4\u05D4, \u05D0\u05D6 \u05D4\u05D8\u05D1\u05DC\u05D0\u05D5\u05EA \u05D5\u05D4\u05E9\u05D0\u05D9\u05DC\u05EA\u05D5\u05EA \u05E0\u05E9\u05D0\u05E8\u05D5\u05EA \u05DB\u05DE\u05D5 \u05E9\u05D4\u05DF.",
|
|
766
777
|
fix: ["\u05D4\u05E1\u05D5\u05DB\u05DF \u05E9\u05DC\u05DB\u05DD \u05DE\u05D7\u05DC\u05D9\u05E3 \u05D0\u05EA \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05DC\u05E7\u05D5\u05D1\u05E5 \u05D1\u05D7\u05D9\u05D1\u05D5\u05E8 \u05DC\u05DE\u05E1\u05D3 \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E9\u05DC\u05E0\u05D5.", "\u05D4\u05D8\u05D1\u05DC\u05D0\u05D5\u05EA \u05D5\u05D4\u05E9\u05D0\u05D9\u05DC\u05EA\u05D5\u05EA \u05E0\u05E9\u05D0\u05E8\u05D5\u05EA.", "\u05DE\u05E8\u05D9\u05E6\u05D9\u05DD \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D4\u05D1\u05D3\u05D9\u05E7\u05D4."],
|
|
767
|
-
prompt: "D1 \u05D4\u05D5\u05D0 SQLite \u05E9\u05DE\u05E0\u05D5\u05D4\u05DC \u05E2\u05DC \u05D9\u05D3\u05D9 Cloudflare, \u05DB\u05DA \u05E9\u05D4 SQL \u05D9\u05DB\u05D5\u05DC \u05DC\u05D4\u05D9\u05E9\u05D0\u05E8. \u05D4\u05D7\u05DC\u05E3 \u05D0\u05EA \u05D4\u05D3\u05E8\u05D9\u05D9\u05D1\u05E8 \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9 \u05D1
|
|
778
|
+
prompt: "D1 \u05D4\u05D5\u05D0 SQLite \u05E9\u05DE\u05E0\u05D5\u05D4\u05DC \u05E2\u05DC \u05D9\u05D3\u05D9 Cloudflare, \u05DB\u05DA \u05E9\u05D4 SQL \u05D9\u05DB\u05D5\u05DC \u05DC\u05D4\u05D9\u05E9\u05D0\u05E8. \u05D4\u05D7\u05DC\u05E3 \u05D0\u05EA \u05D4\u05D3\u05E8\u05D9\u05D9\u05D1\u05E8 \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9 \u05D1\u05BEbinding \u05E9\u05DC D1, \u05D0\u05D5 \u05D1\u05BEDrizzle \u05E2\u05DD drizzle-orm/d1."
|
|
768
779
|
},
|
|
769
780
|
en: {
|
|
770
781
|
what: "The site keeps its data in a database file inside the project.",
|
|
@@ -789,8 +800,8 @@ var ISSUE_HELP = {
|
|
|
789
800
|
he: {
|
|
790
801
|
what: "\u05D4\u05D0\u05EA\u05E8 \u05DE\u05E9\u05EA\u05DE\u05E9 \u05D1\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 bcrypt \u05DB\u05D3\u05D9 \u05DC\u05E9\u05DE\u05D5\u05E8 \u05E1\u05D9\u05E1\u05DE\u05D0\u05D5\u05EA \u05D1\u05E6\u05D5\u05E8\u05D4 \u05D1\u05D8\u05D5\u05D7\u05D4.",
|
|
791
802
|
why: "bcrypt \u05D1\u05E0\u05D5\u05D9\u05D4 \u05DE\u05E7\u05D5\u05D3 \u05DE\u05E7\u05D5\u05DE\u05D9 \u05E9\u05DC\u05D0 \u05E8\u05E5 \u05E2\u05DC \u05D4\u05E9\u05E8\u05EA\u05D9\u05DD \u05E9\u05DC\u05E0\u05D5, \u05D5\u05DC\u05DB\u05DF \u05D4\u05D0\u05EA\u05E8 \u05DC\u05D0 \u05D9\u05E2\u05DC\u05D4.",
|
|
792
|
-
fix: ["\u05DE\u05D7\u05DC\u05D9\u05E4\u05D9\u05DD \u05DC
|
|
793
|
-
prompt: "\u05D4\u05D7\u05DC\u05E3 \u05D0\u05EA bcrypt \u05D1
|
|
803
|
+
fix: ["\u05DE\u05D7\u05DC\u05D9\u05E4\u05D9\u05DD \u05DC\u05BEbcryptjs, \u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05E9\u05E2\u05D5\u05D1\u05D3\u05EA \u05D1\u05D3\u05D9\u05D5\u05E7 \u05D0\u05D5\u05EA\u05D5 \u05D3\u05D1\u05E8 \u05D5\u05DB\u05EA\u05D5\u05D1\u05D4 \u05DB\u05D5\u05DC\u05D4 \u05D1\u05BEJavaScript.", "\u05E1\u05D9\u05E1\u05DE\u05D0\u05D5\u05EA \u05E9\u05DB\u05D1\u05E8 \u05E9\u05DE\u05D5\u05E8\u05D5\u05EA \u05DE\u05DE\u05E9\u05D9\u05DB\u05D5\u05EA \u05DC\u05E2\u05D1\u05D5\u05D3. \u05D4\u05DE\u05E9\u05EA\u05DE\u05E9\u05D9\u05DD \u05DC\u05D0 \u05E6\u05E8\u05D9\u05DB\u05D9\u05DD \u05DC\u05D1\u05D7\u05D5\u05E8 \u05E1\u05D9\u05E1\u05DE\u05D4 \u05D7\u05D3\u05E9\u05D4."],
|
|
804
|
+
prompt: "\u05D4\u05D7\u05DC\u05E3 \u05D0\u05EA bcrypt \u05D1\u05BEbcryptjs (\u05D0\u05D5\u05EA\u05D5 API, JavaScript \u05D8\u05D4\u05D5\u05E8), \u05D0\u05D5 \u05D1\u05BEWeb Crypto API (PBKDF2). \u05D2\u05D9\u05D1\u05D5\u05D1\u05D9 \u05E1\u05D9\u05E1\u05DE\u05D0\u05D5\u05EA \u05E7\u05D9\u05D9\u05DE\u05D9\u05DD \u05E9\u05DC bcrypt \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD \u05EA\u05E7\u05E4\u05D9\u05DD \u05E2\u05DD bcryptjs."
|
|
794
805
|
},
|
|
795
806
|
en: {
|
|
796
807
|
what: "The site uses the bcrypt library to store passwords safely.",
|
|
@@ -800,9 +811,9 @@ var ISSUE_HELP = {
|
|
|
800
811
|
},
|
|
801
812
|
native_module_other: {
|
|
802
813
|
he: {
|
|
803
|
-
what: "\u05D4\u05D0\u05EA\u05E8 \u05DE\u05E9\u05EA\u05DE\u05E9 \u05D1\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05E9\u05D1\u05E0\u05D5\u05D9\u05D4 \u05DE\u05E7\u05D5\u05D3 \u05DE\u05E7\u05D5\u05DE\u05D9 \u05DC\u05DE\u05D7\u05E9\u05D1 \u05DE\u05E1\u05D5\u05D9\u05DD, \u05D5\u05DC\u05D0 \u05E8\u05E7 \u05DE
|
|
814
|
+
what: "\u05D4\u05D0\u05EA\u05E8 \u05DE\u05E9\u05EA\u05DE\u05E9 \u05D1\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05E9\u05D1\u05E0\u05D5\u05D9\u05D4 \u05DE\u05E7\u05D5\u05D3 \u05DE\u05E7\u05D5\u05DE\u05D9 \u05DC\u05DE\u05D7\u05E9\u05D1 \u05DE\u05E1\u05D5\u05D9\u05DD, \u05D5\u05DC\u05D0 \u05E8\u05E7 \u05DE\u05BEJavaScript.",
|
|
804
815
|
why: "\u05E1\u05E4\u05E8\u05D9\u05D5\u05EA \u05DB\u05D0\u05DC\u05D4 \u05DC\u05D0 \u05E8\u05E6\u05D5\u05EA \u05E2\u05DC \u05D4\u05E9\u05E8\u05EA\u05D9\u05DD \u05E9\u05DC\u05E0\u05D5, \u05D5\u05DC\u05DB\u05DF \u05D4\u05D0\u05EA\u05E8 \u05DC\u05D0 \u05D9\u05E2\u05DC\u05D4.",
|
|
805
|
-
fix: ["\u05DE\u05D7\u05DC\u05D9\u05E4\u05D9\u05DD \u05D0\u05EA \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05D1\u05D7\u05DC\u05D5\u05E4\u05D4 \u05E9\u05DB\u05EA\u05D5\u05D1\u05D4 \u05D1
|
|
816
|
+
fix: ["\u05DE\u05D7\u05DC\u05D9\u05E4\u05D9\u05DD \u05D0\u05EA \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05D1\u05D7\u05DC\u05D5\u05E4\u05D4 \u05E9\u05DB\u05EA\u05D5\u05D1\u05D4 \u05D1\u05BEJavaScript.", "\u05D0\u05D5 \u05DE\u05E2\u05D1\u05D9\u05E8\u05D9\u05DD \u05D0\u05EA \u05D4\u05E2\u05D1\u05D5\u05D3\u05D4 \u05E9\u05DC\u05D4 \u05DC\u05D6\u05DE\u05DF \u05D4\u05D1\u05E0\u05D9\u05D9\u05D4."],
|
|
806
817
|
prompt: "\u05E1\u05E4\u05E8\u05D9\u05D5\u05EA \u05E0\u05D9\u05D9\u05D8\u05D9\u05D1 \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC\u05D5\u05EA \u05DC\u05E8\u05D5\u05E5 \u05D1\u05E9\u05E8\u05EA. \u05D4\u05D7\u05DC\u05E3 \u05D0\u05EA \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05D1\u05D7\u05DC\u05D5\u05E4\u05D4 \u05E9\u05DC JavaScript \u05D8\u05D4\u05D5\u05E8 \u05D0\u05D5 \u05E9\u05DC Web API, \u05D0\u05D5 \u05D4\u05E2\u05D1\u05E8 \u05D0\u05EA \u05D4\u05E2\u05D1\u05D5\u05D3\u05D4 \u05D4\u05D6\u05D5 \u05DC\u05D6\u05DE\u05DF \u05D4\u05D1\u05E0\u05D9\u05D9\u05D4."
|
|
807
818
|
},
|
|
808
819
|
en: {
|
|
@@ -816,7 +827,7 @@ var ISSUE_HELP = {
|
|
|
816
827
|
what: "\u05D4\u05D0\u05EA\u05E8 \u05DE\u05E4\u05E2\u05D9\u05DC \u05DE\u05E9\u05D4\u05D5 \u05E9\u05E8\u05E5 \u05D1\u05E8\u05E7\u05E2 \u05DB\u05DC \u05D4\u05D6\u05DE\u05DF, \u05DB\u05DE\u05D5 \u05D8\u05D9\u05D9\u05DE\u05E8, \u05EA\u05D5\u05E8 \u05DE\u05E9\u05D9\u05DE\u05D5\u05EA \u05D0\u05D5 \u05DE\u05E9\u05D9\u05DE\u05D4 \u05DE\u05EA\u05D5\u05D6\u05DE\u05E0\u05EA.",
|
|
817
828
|
why: "\u05D0\u05E6\u05DC\u05E0\u05D5 \u05D4\u05D0\u05EA\u05E8 \u05E8\u05E5 \u05E8\u05E7 \u05DB\u05E9\u05DE\u05D9\u05E9\u05D4\u05D5 \u05E0\u05DB\u05E0\u05E1, \u05D5\u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05E0\u05E9\u05D0\u05E8 \u05E4\u05D5\u05E2\u05DC \u05D1\u05D9\u05DF \u05DB\u05E0\u05D9\u05E1\u05D4 \u05DC\u05DB\u05E0\u05D9\u05E1\u05D4. \u05DE\u05D4 \u05E9\u05E8\u05E5 \u05D1\u05E8\u05E7\u05E2 \u05E4\u05E9\u05D5\u05D8 \u05DC\u05D0 \u05D9\u05E4\u05E2\u05DC, \u05D5\u05DC\u05DB\u05DF \u05D4\u05D0\u05EA\u05E8 \u05DC\u05D0 \u05D9\u05E2\u05DC\u05D4.",
|
|
818
829
|
fix: ["\u05DE\u05D5\u05E6\u05D9\u05D0\u05D9\u05DD \u05DE\u05D4\u05D0\u05EA\u05E8 \u05D8\u05D9\u05D9\u05DE\u05E8\u05D9\u05DD, \u05EA\u05D5\u05E8\u05D9 \u05DE\u05E9\u05D9\u05DE\u05D5\u05EA \u05D5\u05E1\u05E4\u05E8\u05D9\u05D5\u05EA \u05E9\u05DC \u05DE\u05E9\u05D9\u05DE\u05D5\u05EA \u05DE\u05EA\u05D5\u05D6\u05DE\u05E0\u05D5\u05EA.", "\u05D0\u05DD \u05E6\u05E8\u05D9\u05DA \u05DE\u05E9\u05D9\u05DE\u05D4 \u05E9\u05E8\u05E6\u05D4 \u05DC\u05E4\u05D9 \u05E9\u05E2\u05D5\u05DF, \u05D4\u05E1\u05D5\u05DB\u05DF \u05D9\u05E9\u05D0\u05DC \u05D0\u05EA\u05DB\u05DD \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D4\u05D5\u05D0 \u05D1\u05D5\u05E0\u05D4 \u05D0\u05D5\u05EA\u05D4."],
|
|
819
|
-
prompt: "\u05D4\u05D0\u05EA\u05E8 \u05E8\u05E5 \u05DC\u05DB\u05DC \u05D1\u05E7\u05E9\u05D4 \u05D1\u05E0\u05E4\u05E8\u05D3, \u05D5\u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05E0\u05E9\u05D0\u05E8 \u05E4\u05D5\u05E2\u05DC \u05D1\u05D9\u05DF \u05D1\u05E7\u05E9\u05D5\u05EA. \u05D4\u05E1\u05E8 \u05D8\u05D9\u05D9\u05DE\u05E8\u05D9\u05DD, \u05EA\u05D5\u05E8\u05D9 \u05DE\u05E9\u05D9\u05DE\u05D5\u05EA \u05D5\u05E1\u05E4\u05E8\u05D9\u05D5\u05EA cron. \u05E2\u05D1\u05D5\u05D3\u05D4 \u05DE\u05EA\u05D5\u05D6\u05DE\u05E0\u05EA \u05EA\u05D5\u05DB\u05DC \u05DC\u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1
|
|
830
|
+
prompt: "\u05D4\u05D0\u05EA\u05E8 \u05E8\u05E5 \u05DC\u05DB\u05DC \u05D1\u05E7\u05E9\u05D4 \u05D1\u05E0\u05E4\u05E8\u05D3, \u05D5\u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05E0\u05E9\u05D0\u05E8 \u05E4\u05D5\u05E2\u05DC \u05D1\u05D9\u05DF \u05D1\u05E7\u05E9\u05D5\u05EA. \u05D4\u05E1\u05E8 \u05D8\u05D9\u05D9\u05DE\u05E8\u05D9\u05DD, \u05EA\u05D5\u05E8\u05D9 \u05DE\u05E9\u05D9\u05DE\u05D5\u05EA \u05D5\u05E1\u05E4\u05E8\u05D9\u05D5\u05EA cron. \u05E2\u05D1\u05D5\u05D3\u05D4 \u05DE\u05EA\u05D5\u05D6\u05DE\u05E0\u05EA \u05EA\u05D5\u05DB\u05DC \u05DC\u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\u05BECloudflare Cron Trigger \u05D1\u05D4\u05DE\u05E9\u05DA, \u05E9\u05D0\u05DC \u05D0\u05EA \u05D4\u05DE\u05E4\u05EA\u05D7 \u05E7\u05D5\u05D3\u05DD."
|
|
820
831
|
},
|
|
821
832
|
en: {
|
|
822
833
|
what: "The site starts something that keeps running in the background, such as a timer, a job queue or a scheduled task.",
|
|
@@ -829,7 +840,7 @@ var ISSUE_HELP = {
|
|
|
829
840
|
what: "\u05D4\u05D0\u05EA\u05E8 \u05DE\u05E4\u05E2\u05D9\u05DC \u05E9\u05E8\u05EA WebSocket, \u05D7\u05D9\u05D1\u05D5\u05E8 \u05E4\u05EA\u05D5\u05D7 \u05E9\u05E0\u05E9\u05D0\u05E8 \u05E4\u05E2\u05D9\u05DC \u05DB\u05D3\u05D9 \u05DC\u05E9\u05DC\u05D5\u05D7 \u05E2\u05D3\u05DB\u05D5\u05E0\u05D9\u05DD \u05D7\u05D9\u05D9\u05DD.",
|
|
830
841
|
why: "\u05E9\u05E8\u05EA \u05DB\u05D6\u05D4 \u05E6\u05E8\u05D9\u05DA \u05DC\u05E8\u05D5\u05E5 \u05DB\u05DC \u05D4\u05D6\u05DE\u05DF, \u05D5\u05D0\u05E6\u05DC\u05E0\u05D5 \u05D4\u05D0\u05EA\u05E8 \u05E8\u05E5 \u05E8\u05E7 \u05DB\u05E9\u05DE\u05D9\u05E9\u05D4\u05D5 \u05E0\u05DB\u05E0\u05E1. \u05DC\u05DB\u05DF \u05D4\u05D0\u05EA\u05E8 \u05DC\u05D0 \u05D9\u05E2\u05DC\u05D4.",
|
|
831
842
|
fix: ["\u05DC\u05E2\u05D3\u05DB\u05D5\u05E0\u05D9\u05DD \u05D7\u05D9\u05D9\u05DD \u05D1\u05D5\u05D3\u05E7\u05D9\u05DD \u05DE\u05D7\u05D3\u05E9 \u05DB\u05DC \u05DB\u05DE\u05D4 \u05E9\u05E0\u05D9\u05D5\u05EA, \u05D0\u05D5 \u05DE\u05E9\u05EA\u05DE\u05E9\u05D9\u05DD \u05D1\u05D6\u05E8\u05DD \u05E2\u05D3\u05DB\u05D5\u05E0\u05D9\u05DD \u05DE\u05D4\u05E9\u05E8\u05EA.", "\u05D0\u05DD \u05D6\u05D4 \u05DC\u05D1 \u05D4\u05D0\u05EA\u05E8, \u05DB\u05DE\u05D5 \u05E6'\u05D0\u05D8 \u05D7\u05D9, \u05D4\u05E1\u05D5\u05DB\u05DF \u05D9\u05E9\u05D0\u05DC \u05D0\u05EA\u05DB\u05DD \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D4\u05D5\u05D0 \u05DE\u05E9\u05E0\u05D4 \u05D0\u05EA \u05D4\u05DE\u05D1\u05E0\u05D4."],
|
|
832
|
-
prompt: "\u05E9\u05E8\u05EA WebSocket \u05E2\u05E6\u05DE\u05D0\u05D9 \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC \u05DC\u05E8\u05D5\u05E5 \u05DB\u05D0\u05DF. \u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1
|
|
843
|
+
prompt: "\u05E9\u05E8\u05EA WebSocket \u05E2\u05E6\u05DE\u05D0\u05D9 \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC \u05DC\u05E8\u05D5\u05E5 \u05DB\u05D0\u05DF. \u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\u05BEpolling \u05D0\u05D5 \u05D1\u05BEserver-sent events \u05DC\u05E2\u05D3\u05DB\u05D5\u05E0\u05D9\u05DD \u05D7\u05D9\u05D9\u05DD, \u05D0\u05D5 \u05E9\u05D0\u05DC \u05D0\u05EA \u05D4\u05DE\u05E4\u05EA\u05D7 \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D0\u05EA\u05D4 \u05DE\u05EA\u05DB\u05E0\u05DF \u05DE\u05D7\u05D3\u05E9 \u05D0\u05EA \u05D4\u05D9\u05DB\u05D5\u05DC\u05EA \u05D4\u05D6\u05D5."
|
|
833
844
|
},
|
|
834
845
|
en: {
|
|
835
846
|
what: "The site runs a WebSocket server, an open connection that stays up to send live updates.",
|
|
@@ -851,11 +862,11 @@ var ISSUE_HELP = {
|
|
|
851
862
|
}
|
|
852
863
|
},
|
|
853
864
|
adapter_missing_astro: adapterMissing("Astro", '\u05D4\u05D5\u05E1\u05E3 \u05D0\u05EA \u05D4\u05DE\u05EA\u05D0\u05DD \u05D4\u05E8\u05E9\u05DE\u05D9: \u05D4\u05EA\u05E7\u05DF \u05D0\u05EA @astrojs/cloudflare, \u05D5\u05D1\u05E7\u05D5\u05D1\u05E5 astro.config.mjs \u05D9\u05D9\u05D1\u05D0 cloudflare \u05DE "@astrojs/cloudflare" \u05D5\u05D4\u05D2\u05D3\u05E8 adapter: cloudflare(). \u05D0\u05DC \u05EA\u05E1\u05D9\u05E8 \u05E0\u05EA\u05D9\u05D1\u05D9 \u05E9\u05E8\u05EA \u05D5\u05D0\u05DC \u05EA\u05DE\u05D9\u05E8 \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8.'),
|
|
854
|
-
adapter_missing_sveltekit: adapterMissing("SvelteKit", '\u05D4\u05EA\u05E7\u05DF \u05D0\u05EA @sveltejs/adapter-cloudflare \u05DB\u05EA\u05DC\u05D5\u05EA \u05E4\u05D9\u05EA\u05D5\u05D7, \u05D5\u05D1\u05DE\u05E7\u05D5\u05DD \u05E9\u05D1\u05D5 \u05DE\u05D5\u05D2\u05D3\u05E8 \u05D4\u05DE\u05EA\u05D0\u05DD (vite.config.ts \u05D1
|
|
855
|
-
adapter_missing_react_router: adapterMissing("React Router", '\u05D4\u05EA\u05E7\u05DF \u05D0\u05EA @cloudflare/vite-plugin \u05D5\u05D0\u05EA wrangler \u05DB\u05EA\u05DC\u05D5\u05D9\u05D5\u05EA \u05E4\u05D9\u05EA\u05D5\u05D7, \u05D4\u05D5\u05E1\u05E3 cloudflare({ viteEnvironment: { name: "ssr" } }) \u05DC\u05E4\u05E0\u05D9 reactRouter() \u05D1
|
|
865
|
+
adapter_missing_sveltekit: adapterMissing("SvelteKit", '\u05D4\u05EA\u05E7\u05DF \u05D0\u05EA @sveltejs/adapter-cloudflare \u05DB\u05EA\u05DC\u05D5\u05EA \u05E4\u05D9\u05EA\u05D5\u05D7, \u05D5\u05D1\u05DE\u05E7\u05D5\u05DD \u05E9\u05D1\u05D5 \u05DE\u05D5\u05D2\u05D3\u05E8 \u05D4\u05DE\u05EA\u05D0\u05DD (vite.config.ts \u05D1\u05BESvelteKit 3, svelte.config.js \u05DC\u05E4\u05E0\u05D9 \u05DB\u05DF) \u05D9\u05D9\u05D1\u05D0 adapter \u05DE "@sveltejs/adapter-cloudflare" \u05D5\u05D4\u05D2\u05D3\u05E8 adapter: adapter(). \u05D4\u05E1\u05E8 \u05D0\u05EA @sveltejs/adapter-auto \u05D0\u05D5 \u05DE\u05EA\u05D0\u05DE\u05D9\u05DD \u05D0\u05D7\u05E8\u05D9\u05DD. \u05D0\u05DC \u05EA\u05DE\u05D9\u05E8 \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8.'),
|
|
866
|
+
adapter_missing_react_router: adapterMissing("React Router", '\u05D4\u05EA\u05E7\u05DF \u05D0\u05EA @cloudflare/vite-plugin \u05D5\u05D0\u05EA wrangler \u05DB\u05EA\u05DC\u05D5\u05D9\u05D5\u05EA \u05E4\u05D9\u05EA\u05D5\u05D7, \u05D4\u05D5\u05E1\u05E3 cloudflare({ viteEnvironment: { name: "ssr" } }) \u05DC\u05E4\u05E0\u05D9 reactRouter() \u05D1\u05BEplugins \u05E9\u05DC vite.config, \u05D4\u05D5\u05E1\u05E3 workers/app.ts \u05E9\u05DE\u05E2\u05D1\u05D9\u05E8 \u05DB\u05DC \u05D1\u05E7\u05E9\u05D4 \u05DC\u05BEcreateRequestHandler \u05DE\u05BEreact-router, \u05D5\u05D4\u05D5\u05E1\u05E3 wrangler.jsonc \u05E2\u05DD "main": "./workers/app.ts" \u05D5 "compatibility_flags": ["nodejs_compat"]. \u05E2\u05D1\u05D5\u05D3 \u05DC\u05E4\u05D9 \u05D4\u05EA\u05D1\u05E0\u05D9\u05EA \u05D4\u05E8\u05E9\u05DE\u05D9\u05EA \u05E9\u05DC Cloudflare \u05DC\u05BEReact Router. \u05D0\u05DC \u05EA\u05DE\u05D9\u05E8 \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8.'),
|
|
856
867
|
adapter_missing_hono: {
|
|
857
868
|
he: {
|
|
858
|
-
what: "\u05D4\u05D0\u05EA\u05E8 \u05D1\u05E0\u05D5\u05D9 \u05D1
|
|
869
|
+
what: "\u05D4\u05D0\u05EA\u05E8 \u05D1\u05E0\u05D5\u05D9 \u05D1\u05BEHono, \u05D0\u05D1\u05DC \u05DE\u05D5\u05E4\u05E2\u05DC \u05DB\u05E9\u05E8\u05EA \u05E9\u05DE\u05D0\u05D6\u05D9\u05DF \u05DC\u05E4\u05D5\u05E8\u05D8.",
|
|
859
870
|
why: "\u05D0\u05E6\u05DC\u05E0\u05D5 \u05D0\u05D9\u05DF \u05E9\u05E8\u05EA \u05E9\u05E8\u05E5 \u05DB\u05DC \u05D4\u05D6\u05DE\u05DF. Hono \u05E2\u05D5\u05D1\u05D3 \u05D0\u05E6\u05DC\u05E0\u05D5 \u05DB\u05DE\u05D5 \u05E9\u05D4\u05D5\u05D0, \u05E8\u05E7 \u05E6\u05E8\u05D9\u05DA \u05DC\u05D9\u05D9\u05E6\u05D0 \u05D0\u05EA \u05D4\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4 \u05D1\u05DE\u05E7\u05D5\u05DD \u05DC\u05D4\u05E4\u05E2\u05D9\u05DC \u05E9\u05E8\u05EA.",
|
|
860
871
|
fix: ["\u05D4\u05E1\u05D5\u05DB\u05DF \u05DE\u05D5\u05D7\u05E7 \u05D0\u05EA \u05D4\u05E4\u05E2\u05DC\u05EA \u05D4\u05E9\u05E8\u05EA \u05D5\u05DE\u05D9\u05D9\u05E6\u05D0 \u05D0\u05EA \u05D4\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4 \u05DE\u05E7\u05D5\u05D1\u05E5 \u05D4\u05DB\u05E0\u05D9\u05E1\u05D4.", "\u05DB\u05DC \u05D4\u05E0\u05EA\u05D9\u05D1\u05D9\u05DD \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD \u05DB\u05DE\u05D5 \u05E9\u05D4\u05DD.", "\u05DE\u05E8\u05D9\u05E6\u05D9\u05DD \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D4\u05D1\u05D3\u05D9\u05E7\u05D4."],
|
|
861
872
|
prompt: '\u05D4\u05E9\u05D0\u05E8 \u05D0\u05EA Hono. \u05D4\u05E1\u05E8 \u05D0\u05EA serve() \u05E9\u05DC @hono/node-server \u05D5\u05D9\u05D9\u05E6\u05D0 export default app \u05DE\u05E7\u05D5\u05D1\u05E5 \u05D4\u05DB\u05E0\u05D9\u05E1\u05D4 (\u05DC\u05DE\u05E9\u05DC src/index.ts). \u05D4\u05D5\u05E1\u05E3 wrangler.jsonc \u05E2\u05DD "main" \u05E9\u05DE\u05E6\u05D1\u05D9\u05E2 \u05E2\u05DC \u05D4\u05E7\u05D5\u05D1\u05E5 \u05D4\u05D6\u05D4 \u05D5 "compatibility_flags": ["nodejs_compat"]. \u05D4\u05E9\u05D0\u05E8 \u05D0\u05EA \u05D0\u05D5\u05EA\u05DD \u05E0\u05EA\u05D9\u05D1\u05D9\u05DD.'
|
|
@@ -866,16 +877,16 @@ var ISSUE_HELP = {
|
|
|
866
877
|
fix: ["Your agent removes the server start and exports the app from the entry file.", "All routes stay as they are.", "Run the check again."]
|
|
867
878
|
}
|
|
868
879
|
},
|
|
869
|
-
adapter_missing_nextjs: adapterMissing("Next.js", '\u05D4\u05EA\u05E7\u05DF \u05D0\u05EA @opennextjs/cloudflare \u05DB\u05EA\u05DC\u05D5\u05EA \u05D5\u05D4\u05D5\u05E1\u05E3 open-next.config.ts \u05E2\u05DD: import { defineCloudflareConfig } from "@opennextjs/cloudflare"; export default defineCloudflareConfig();. DeployAI \u05D1\u05D5\u05E0\u05D4 \u05D0\u05D6 \u05E2\u05DD opennextjs-cloudflare build. Next.js \u05D1
|
|
870
|
-
adapter_missing_solidstart: adapterMissing("SolidStart", '\u05D4\u05D2\u05D3\u05E8 server: { preset: "cloudflare_module" } \u05D1\u05E7\u05D5\u05D1\u05E5 app.config.ts (\u05D1
|
|
871
|
-
adapter_missing_qwik: adapterMissing("Qwik City", "\u05D4\u05E8\u05E5 npm run qwik add cloudflare-pages, \u05E9\u05DE\u05D5\u05E1\u05D9\u05E3 \u05D0\u05EA adapters/cloudflare-pages/vite.config.ts \u05D5\u05D0\u05EA \u05D4\u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 build.server. Qwik City \u05D1
|
|
872
|
-
adapter_missing_tanstack_start: adapterMissing("TanStack Start", '\u05D4\u05EA\u05E7\u05DF \u05D0\u05EA @cloudflare/vite-plugin \u05D5\u05D0\u05EA wrangler \u05DB\u05EA\u05DC\u05D5\u05D9\u05D5\u05EA \u05E4\u05D9\u05EA\u05D5\u05D7, \u05D4\u05D5\u05E1\u05E3 cloudflare({ viteEnvironment: { name: "ssr" } }) \u05DC
|
|
880
|
+
adapter_missing_nextjs: adapterMissing("Next.js", '\u05D4\u05EA\u05E7\u05DF \u05D0\u05EA @opennextjs/cloudflare \u05DB\u05EA\u05DC\u05D5\u05EA \u05D5\u05D4\u05D5\u05E1\u05E3 open-next.config.ts \u05E2\u05DD: import { defineCloudflareConfig } from "@opennextjs/cloudflare"; export default defineCloudflareConfig();. DeployAI \u05D1\u05D5\u05E0\u05D4 \u05D0\u05D6 \u05E2\u05DD opennextjs-cloudflare build. Next.js \u05D1\u05BEDeployAI \u05D1\u05E9\u05DC\u05D1 \u05D1\u05D8\u05D0: \u05E1\u05E4\u05E8 \u05E2\u05DC \u05D6\u05D4 \u05DC\u05DE\u05E9\u05EA\u05DE\u05E9, \u05D5\u05D0\u05DC \u05EA\u05DE\u05D9\u05E8 \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8.', true),
|
|
881
|
+
adapter_missing_solidstart: adapterMissing("SolidStart", '\u05D4\u05D2\u05D3\u05E8 server: { preset: "cloudflare_module" } \u05D1\u05E7\u05D5\u05D1\u05E5 app.config.ts (\u05D1\u05BEvite.config.ts \u05D1\u05BESolidStart 2). SolidStart \u05D1\u05BEDeployAI \u05D1\u05E9\u05DC\u05D1 \u05D1\u05D8\u05D0: \u05E1\u05E4\u05E8 \u05E2\u05DC \u05D6\u05D4 \u05DC\u05DE\u05E9\u05EA\u05DE\u05E9.', true),
|
|
882
|
+
adapter_missing_qwik: adapterMissing("Qwik City", "\u05D4\u05E8\u05E5 npm run qwik add cloudflare-pages, \u05E9\u05DE\u05D5\u05E1\u05D9\u05E3 \u05D0\u05EA adapters/cloudflare-pages/vite.config.ts \u05D5\u05D0\u05EA \u05D4\u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 build.server. Qwik City \u05D1\u05BEDeployAI \u05D1\u05E9\u05DC\u05D1 \u05D1\u05D8\u05D0: \u05E1\u05E4\u05E8 \u05E2\u05DC \u05D6\u05D4 \u05DC\u05DE\u05E9\u05EA\u05DE\u05E9.", true),
|
|
883
|
+
adapter_missing_tanstack_start: adapterMissing("TanStack Start", '\u05D4\u05EA\u05E7\u05DF \u05D0\u05EA @cloudflare/vite-plugin \u05D5\u05D0\u05EA wrangler \u05DB\u05EA\u05DC\u05D5\u05D9\u05D5\u05EA \u05E4\u05D9\u05EA\u05D5\u05D7, \u05D4\u05D5\u05E1\u05E3 cloudflare({ viteEnvironment: { name: "ssr" } }) \u05DC\u05BEplugins \u05E9\u05DC vite.config, \u05D5\u05D4\u05D5\u05E1\u05E3 wrangler.jsonc \u05E2\u05DD "main": "@tanstack/react-start/server-entry" \u05D5 "compatibility_flags": ["nodejs_compat"]. TanStack Start \u05D1\u05BEDeployAI \u05D1\u05E9\u05DC\u05D1 \u05D1\u05D8\u05D0: \u05E1\u05E4\u05E8 \u05E2\u05DC \u05D6\u05D4 \u05DC\u05DE\u05E9\u05EA\u05DE\u05E9.', true),
|
|
873
884
|
env_file_committed: {
|
|
874
885
|
he: {
|
|
875
886
|
what: "\u05E7\u05D5\u05D1\u05E5 env \u05E2\u05DD \u05E1\u05D9\u05E1\u05DE\u05D0\u05D5\u05EA \u05D5\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05E0\u05E9\u05DE\u05E8 \u05D1\u05EA\u05D5\u05DA git, \u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05D4\u05D2\u05E8\u05E1\u05D0\u05D5\u05EA \u05E9\u05DC \u05D4\u05E7\u05D5\u05D3.",
|
|
876
887
|
why: "\u05DB\u05DC \u05DE\u05D9 \u05E9\u05E8\u05D5\u05D0\u05D4 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3 \u05E8\u05D5\u05D0\u05D4 \u05D2\u05DD \u05D0\u05EA \u05D4\u05E1\u05D5\u05D3\u05D5\u05EA. \u05DC\u05DB\u05DF \u05D0\u05E0\u05D7\u05E0\u05D5 \u05E2\u05D5\u05E6\u05E8\u05D9\u05DD \u05D0\u05EA \u05D4\u05D4\u05E2\u05DC\u05D0\u05D4.",
|
|
877
|
-
fix: ["\u05DE\u05D5\u05E6\u05D9\u05D0\u05D9\u05DD \u05D0\u05EA \u05D4\u05E7\u05D5\u05D1\u05E5 \u05DE
|
|
878
|
-
prompt: "\u05D4\u05D5\u05E6\u05D0 \u05D0\u05EA \u05E7\u05D5\u05D1\u05E5 \u05D4
|
|
888
|
+
fix: ["\u05DE\u05D5\u05E6\u05D9\u05D0\u05D9\u05DD \u05D0\u05EA \u05D4\u05E7\u05D5\u05D1\u05E5 \u05DE\u05BEgit \u05D5\u05DE\u05D5\u05E1\u05D9\u05E4\u05D9\u05DD \u05D0\u05D5\u05EA\u05D5 \u05DC\u05E8\u05E9\u05D9\u05DE\u05EA \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD \u05E9\u05BEgit \u05DE\u05EA\u05E2\u05DC\u05DD \u05DE\u05D4\u05DD.", "\u05DE\u05D7\u05DC\u05D9\u05E4\u05D9\u05DD \u05DB\u05DC \u05DE\u05E4\u05EA\u05D7 \u05E9\u05D4\u05D9\u05D4 \u05D1\u05E7\u05D5\u05D1\u05E5, \u05DB\u05D9 \u05D4\u05D5\u05D0 \u05DB\u05D1\u05E8 \u05E0\u05D7\u05E9\u05E3.", "\u05D0\u05EA \u05D4\u05E1\u05D5\u05D3\u05D5\u05EA \u05E9\u05D5\u05DE\u05E8\u05D9\u05DD \u05D1\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D4\u05D0\u05EA\u05E8 \u05D1\u05BEDeployAI, \u05DC\u05D0 \u05D1\u05E7\u05D5\u05D3."],
|
|
889
|
+
prompt: "\u05D4\u05D5\u05E6\u05D0 \u05D0\u05EA \u05E7\u05D5\u05D1\u05E5 \u05D4\u05BEenv \u05DE\u05BEgit (git rm --cached), \u05D4\u05D5\u05E1\u05E3 .env* \u05DC .gitignore, \u05D5\u05D0\u05DE\u05D5\u05E8 \u05DC\u05DE\u05E9\u05EA\u05DE\u05E9 \u05DC\u05D4\u05D7\u05DC\u05D9\u05E3 \u05DB\u05DC \u05E1\u05D5\u05D3 \u05E9\u05D4\u05D9\u05D4 \u05D1\u05D5. \u05E1\u05D5\u05D3\u05D5\u05EA \u05E0\u05E9\u05DE\u05E8\u05D9\u05DD \u05D1\u05E2\u05DE\u05D5\u05D3 \u05D4\u05D0\u05EA\u05E8 \u05D1\u05BEDeployAI, \u05EA\u05D7\u05EA \u05D4\u05D2\u05D3\u05E8\u05D5\u05EA, \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05E1\u05D5\u05D3\u05D9\u05D9\u05DD."
|
|
879
890
|
},
|
|
880
891
|
en: {
|
|
881
892
|
what: "An env file with passwords and keys is saved in git, the version history of the code.",
|
|
@@ -900,8 +911,8 @@ var ISSUE_HELP = {
|
|
|
900
911
|
he: {
|
|
901
912
|
what: "\u05D4\u05D0\u05EA\u05E8 \u05DE\u05E8\u05D9\u05E5 \u05E4\u05E7\u05D5\u05D3\u05D5\u05EA \u05DE\u05E2\u05E8\u05DB\u05EA \u05D0\u05D5 \u05EA\u05D5\u05DB\u05E0\u05D5\u05EA \u05D0\u05D7\u05E8\u05D5\u05EA \u05DE\u05EA\u05D5\u05DA \u05D4\u05E7\u05D5\u05D3.",
|
|
902
913
|
why: "\u05E2\u05DC \u05D4\u05E9\u05E8\u05EA\u05D9\u05DD \u05E9\u05DC\u05E0\u05D5 \u05D0\u05D9 \u05D0\u05E4\u05E9\u05E8 \u05DC\u05D4\u05E4\u05E2\u05D9\u05DC \u05EA\u05D5\u05DB\u05E0\u05D5\u05EA \u05D0\u05D7\u05E8\u05D5\u05EA. \u05E8\u05E7 \u05D4\u05E7\u05D5\u05D3 \u05E9\u05DC \u05D4\u05D0\u05EA\u05E8 \u05E2\u05E6\u05DE\u05D5 \u05E8\u05E5, \u05D5\u05DC\u05DB\u05DF \u05D4\u05D0\u05EA\u05E8 \u05DC\u05D0 \u05D9\u05E2\u05DC\u05D4.",
|
|
903
|
-
fix: ["\u05E2\u05D5\u05E9\u05D9\u05DD \u05D0\u05EA \u05D0\u05D5\u05EA\u05D4 \u05E2\u05D1\u05D5\u05D3\u05D4 \u05D1
|
|
904
|
-
prompt: "\u05D4\u05E9\u05E8\u05EA \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC \u05DC\u05D4\u05E4\u05E2\u05D9\u05DC \u05EA\u05D5\u05DB\u05E0\u05D5\u05EA \u05D0\u05D7\u05E8\u05D5\u05EA. \u05D1\u05E6\u05E2 \u05D0\u05EA \u05D4\u05E2\u05D1\u05D5\u05D3\u05D4 \u05D1
|
|
914
|
+
fix: ["\u05E2\u05D5\u05E9\u05D9\u05DD \u05D0\u05EA \u05D0\u05D5\u05EA\u05D4 \u05E2\u05D1\u05D5\u05D3\u05D4 \u05D1\u05BEJavaScript.", "\u05D0\u05D5 \u05E4\u05D5\u05E0\u05D9\u05DD \u05DC\u05E9\u05D9\u05E8\u05D5\u05EA \u05D7\u05D9\u05E6\u05D5\u05E0\u05D9 \u05D3\u05E8\u05DA \u05D4\u05D0\u05D9\u05E0\u05D8\u05E8\u05E0\u05D8.", "\u05D0\u05D5 \u05DE\u05E2\u05D1\u05D9\u05E8\u05D9\u05DD \u05D0\u05EA \u05D4\u05E2\u05D1\u05D5\u05D3\u05D4 \u05DC\u05E9\u05DC\u05D1 \u05D4\u05D1\u05E0\u05D9\u05D9\u05D4."],
|
|
915
|
+
prompt: "\u05D4\u05E9\u05E8\u05EA \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC \u05DC\u05D4\u05E4\u05E2\u05D9\u05DC \u05EA\u05D5\u05DB\u05E0\u05D5\u05EA \u05D0\u05D7\u05E8\u05D5\u05EA. \u05D1\u05E6\u05E2 \u05D0\u05EA \u05D4\u05E2\u05D1\u05D5\u05D3\u05D4 \u05D1\u05BEJavaScript, \u05E7\u05E8\u05D0 \u05DC\u05BEHTTP API \u05D1\u05DE\u05E7\u05D5\u05DD, \u05D0\u05D5 \u05D4\u05E2\u05D1\u05E8 \u05D0\u05D5\u05EA\u05D4 \u05DC\u05E9\u05DC\u05D1 \u05D4\u05BEbuild."
|
|
905
916
|
},
|
|
906
917
|
en: {
|
|
907
918
|
what: "The site runs system commands or other programs from its code.",
|
|
@@ -913,8 +924,8 @@ var ISSUE_HELP = {
|
|
|
913
924
|
he: {
|
|
914
925
|
what: "\u05D4\u05D0\u05EA\u05E8 \u05DE\u05E4\u05E2\u05D9\u05DC \u05E9\u05E8\u05EA \u05DE\u05E9\u05DC\u05D5 \u05E9\u05DE\u05D0\u05D6\u05D9\u05DF \u05DC\u05E4\u05D5\u05E8\u05D8, \u05DC\u05DE\u05E9\u05DC \u05E2\u05DD Express.",
|
|
915
926
|
why: "\u05D0\u05E6\u05DC\u05E0\u05D5 \u05D0\u05D9\u05DF \u05E9\u05E8\u05EA \u05E9\u05E8\u05E5 \u05DB\u05DC \u05D4\u05D6\u05DE\u05DF. \u05D4\u05D0\u05EA\u05E8 \u05E8\u05E5 \u05E8\u05E7 \u05DB\u05E9\u05DE\u05D9\u05E9\u05D4\u05D5 \u05E0\u05DB\u05E0\u05E1, \u05D5\u05DC\u05DB\u05DF \u05E9\u05E8\u05EA \u05E9\u05DE\u05D0\u05D6\u05D9\u05DF \u05DC\u05E4\u05D5\u05E8\u05D8 \u05DC\u05D0 \u05D9\u05E2\u05D1\u05D5\u05D3.",
|
|
916
|
-
fix: ["\u05DE\u05E2\u05D1\u05D9\u05E8\u05D9\u05DD \u05D0\u05EA \u05D4\u05E0\u05EA\u05D9\u05D1\u05D9\u05DD \u05DC
|
|
917
|
-
prompt: "\u05E9\u05E8\u05EA \u05DE\u05D5\u05EA\u05D0\u05DD \u05E9\u05DE\u05D0\u05D6\u05D9\u05DF \u05DC\u05E4\u05D5\u05E8\u05D8 \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC \u05DC\u05E8\u05D5\u05E5 \u05DB\u05D0\u05DF. \u05D4\u05E2\u05D1\u05E8 \u05D0\u05EA \u05D4\u05E0\u05EA\u05D9\u05D1\u05D9\u05DD \u05DC
|
|
927
|
+
fix: ["\u05DE\u05E2\u05D1\u05D9\u05E8\u05D9\u05DD \u05D0\u05EA \u05D4\u05E0\u05EA\u05D9\u05D1\u05D9\u05DD \u05DC\u05BEHono, \u05E9\u05D3\u05D5\u05DE\u05D4 \u05DE\u05D0\u05D5\u05D3 \u05DC\u05BEExpress \u05D5\u05E2\u05D5\u05D1\u05D3 \u05D0\u05E6\u05DC\u05E0\u05D5.", "\u05D0\u05D5 \u05DC\u05E0\u05EA\u05D9\u05D1\u05D9 API \u05E9\u05DC Astro.", "\u05DE\u05D5\u05D7\u05E7\u05D9\u05DD \u05D0\u05EA \u05D4\u05E9\u05D5\u05E8\u05D4 \u05E9\u05DE\u05E4\u05E2\u05D9\u05DC\u05D4 \u05D0\u05EA \u05D4\u05E9\u05E8\u05EA (app.listen)."],
|
|
928
|
+
prompt: "\u05E9\u05E8\u05EA \u05DE\u05D5\u05EA\u05D0\u05DD \u05E9\u05DE\u05D0\u05D6\u05D9\u05DF \u05DC\u05E4\u05D5\u05E8\u05D8 \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC \u05DC\u05E8\u05D5\u05E5 \u05DB\u05D0\u05DF. \u05D4\u05E2\u05D1\u05E8 \u05D0\u05EA \u05D4\u05E0\u05EA\u05D9\u05D1\u05D9\u05DD \u05DC\u05BEHono (\u05D3\u05D5\u05DE\u05D4 \u05DE\u05D0\u05D5\u05D3 \u05DC\u05BEExpress \u05D5\u05E8\u05E5 \u05E2\u05DC Cloudflare Workers) \u05D0\u05D5 \u05DC\u05E0\u05EA\u05D9\u05D1\u05D9 API \u05E9\u05DC Astro, \u05D5\u05D4\u05E1\u05E8 \u05D0\u05EA app.listen."
|
|
918
929
|
},
|
|
919
930
|
en: {
|
|
920
931
|
what: "The site starts its own server that listens on a port, for example with Express.",
|
|
@@ -922,12 +933,25 @@ var ISSUE_HELP = {
|
|
|
922
933
|
fix: ["Move the routes to Hono, which is very similar to Express and works on DeployAI.", "Or to Astro API routes.", "Delete the line that starts the server (app.listen)."]
|
|
923
934
|
}
|
|
924
935
|
},
|
|
936
|
+
email_smtp: {
|
|
937
|
+
he: {
|
|
938
|
+
what: "\u05D4\u05D0\u05EA\u05E8 \u05E9\u05D5\u05DC\u05D7 \u05DE\u05D9\u05D9\u05DC \u05D3\u05E8\u05DA SMTP (\u05DC\u05DE\u05E9\u05DC \u05E2\u05DD nodemailer).",
|
|
939
|
+
why: "\u05D6\u05D5 \u05D0\u05D6\u05D4\u05E8\u05D4. \u05D4\u05D0\u05EA\u05E8 \u05E2\u05D5\u05DC\u05D4, \u05D0\u05D1\u05DC SMTP \u05DC\u05D0 \u05E2\u05D5\u05D1\u05D3 \u05D0\u05E6\u05DC\u05E0\u05D5, \u05D0\u05D6 \u05D4\u05DE\u05D9\u05D9\u05DC\u05D9\u05DD \u05DC\u05D0 \u05D9\u05D9\u05E9\u05DC\u05D7\u05D5.",
|
|
940
|
+
fix: ["\u05DE\u05D9\u05D9\u05DC \u05D0\u05DC\u05D9\u05DB\u05DD, \u05DC\u05DE\u05E9\u05DC \u05E2\u05DC \u05D8\u05D5\u05E4\u05E1 \u05E9\u05DE\u05D5\u05DC\u05D0: \u05D4\u05DE\u05D9\u05D9\u05DC \u05D4\u05DE\u05D5\u05D1\u05E0\u05D4 \u05E9\u05DC DeployAI, \u05D1\u05DC\u05D9 \u05E1\u05E4\u05E7 \u05DE\u05D9\u05D9\u05DC \u05D5\u05D1\u05DC\u05D9 \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA.", "\u05DE\u05D9\u05D9\u05DC \u05DC\u05DC\u05E7\u05D5\u05D7\u05D5\u05EA: \u05E9\u05D9\u05E8\u05D5\u05EA \u05DE\u05D9\u05D9\u05DC \u05D3\u05E8\u05DA HTTP, \u05DB\u05DE\u05D5 Resend \u05D0\u05D5 Postmark."],
|
|
941
|
+
prompt: "\u05D4\u05D0\u05EA\u05E8 \u05E9\u05D5\u05DC\u05D7 \u05DE\u05D9\u05D9\u05DC \u05D3\u05E8\u05DA SMTP, \u05E9\u05DC\u05D0 \u05E2\u05D5\u05D1\u05D3 \u05D1\u05BEDeployAI. \u05DC\u05DE\u05D9\u05D9\u05DC \u05D0\u05DC\u05D9\u05D9 (\u05D8\u05D5\u05E4\u05E1 \u05E9\u05DE\u05D5\u05DC\u05D0, \u05D4\u05D6\u05DE\u05E0\u05D4 \u05D7\u05D3\u05E9\u05D4) \u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\u05DE\u05D9\u05D9\u05DC \u05D4\u05DE\u05D5\u05D1\u05E0\u05D4: POST \u05E2\u05DD JSON { subject, text, replyTo } \u05D0\u05DC ${DEPLOYAI_API}/api/site/notify \u05E2\u05DD \u05D4\u05DB\u05D5\u05EA\u05E8\u05EA Authorization: Bearer DEPLOYAI_KEY. \u05DC\u05DE\u05D9\u05D9\u05DC \u05DC\u05DC\u05E7\u05D5\u05D7\u05D5\u05EA \u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\u05BEResend \u05D0\u05D5 Postmark \u05D3\u05E8\u05DA HTTP. \u05D4\u05E1\u05E8 \u05D0\u05EA \u05E1\u05E4\u05E8\u05D9\u05D9\u05EA \u05D4\u05BESMTP."
|
|
942
|
+
},
|
|
943
|
+
en: {
|
|
944
|
+
what: "The site sends email through SMTP (for example with nodemailer).",
|
|
945
|
+
why: "This is a warning. The site goes live, but SMTP does not run here, so the emails will not be sent.",
|
|
946
|
+
fix: ["Email to you, for example on a form answer: the DeployAI built-in email, with no email provider and no keys.", "Email to customers: an email service over HTTP, like Resend or Postmark."]
|
|
947
|
+
}
|
|
948
|
+
},
|
|
925
949
|
no_build_script: {
|
|
926
950
|
he: {
|
|
927
951
|
what: "\u05D1\u05E7\u05D5\u05D1\u05E5 package.json \u05D0\u05D9\u05DF \u05E4\u05E7\u05D5\u05D3\u05EA build, \u05D4\u05E4\u05E7\u05D5\u05D3\u05D4 \u05E9\u05D1\u05D5\u05E0\u05D4 \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8.",
|
|
928
952
|
why: "\u05D6\u05D5 \u05D0\u05D6\u05D4\u05E8\u05D4. \u05D1\u05DC\u05D9 \u05E4\u05E7\u05D5\u05D3\u05EA build \u05D0\u05E0\u05D7\u05E0\u05D5 \u05DC\u05D0 \u05D9\u05D5\u05D3\u05E2\u05D9\u05DD \u05D0\u05D9\u05DA \u05DC\u05D1\u05E0\u05D5\u05EA \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8, \u05D5\u05D0\u05DD \u05D4\u05D5\u05D0 \u05E6\u05E8\u05D9\u05DA \u05D1\u05E0\u05D9\u05D9\u05D4 \u05D4\u05D5\u05D0 \u05E2\u05DC\u05D5\u05DC \u05DC\u05D0 \u05DC\u05E2\u05D1\u05D5\u05D3.",
|
|
929
|
-
fix: ["\u05DE\u05D5\u05E1\u05D9\u05E4\u05D9\u05DD \u05DC
|
|
930
|
-
prompt: '\u05D4\u05D5\u05E1\u05E3 \u05DC
|
|
953
|
+
fix: ["\u05DE\u05D5\u05E1\u05D9\u05E4\u05D9\u05DD \u05DC\u05BEpackage.json \u05E4\u05E7\u05D5\u05D3\u05EA build \u05E9\u05D1\u05D5\u05E0\u05D4 \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8, \u05DC\u05DE\u05E9\u05DC vite build \u05D0\u05D5 astro build.", "\u05D0\u05EA\u05E8 HTML \u05E4\u05E9\u05D5\u05D8, \u05D1\u05DC\u05D9 \u05E9\u05DC\u05D1 \u05D1\u05E0\u05D9\u05D9\u05D4, \u05DC\u05D0 \u05E6\u05E8\u05D9\u05DA \u05D0\u05D5\u05EA\u05D4."],
|
|
954
|
+
prompt: '\u05D4\u05D5\u05E1\u05E3 \u05DC\u05BEpackage.json \u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 "build" \u05E9\u05D1\u05D5\u05E0\u05D4 \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8, \u05DC\u05DE\u05E9\u05DC "vite build" \u05D0\u05D5 "astro build".'
|
|
931
955
|
},
|
|
932
956
|
en: {
|
|
933
957
|
what: "package.json has no build command, the command that builds the site.",
|
|
@@ -940,7 +964,7 @@ var ISSUE_HELP = {
|
|
|
940
964
|
what: "\u05D4\u05D0\u05EA\u05E8 \u05D1\u05E0\u05D5\u05D9 \u05D1\u05DB\u05DC\u05D9 \u05E9\u05DC\u05D0 \u05E8\u05E5 \u05D0\u05E6\u05DC\u05E0\u05D5, \u05DC\u05DE\u05E9\u05DC WordPress, PHP \u05D0\u05D5 Python.",
|
|
941
965
|
why: "\u05D4\u05D0\u05D7\u05E1\u05D5\u05DF \u05E9\u05DC\u05E0\u05D5 \u05DE\u05E8\u05D9\u05E5 \u05D0\u05EA\u05E8\u05D9\u05DD \u05DE\u05D5\u05DB\u05E0\u05D9\u05DD \u05D5\u05D0\u05EA\u05E8\u05D9\u05DD \u05D1\u05DB\u05DC\u05D9\u05DD \u05E9\u05DC JavaScript. \u05D0\u05EA\u05E8 \u05DB\u05D6\u05D4 \u05DC\u05D0 \u05D9\u05E2\u05DC\u05D4 \u05DB\u05DE\u05D5 \u05E9\u05D4\u05D5\u05D0.",
|
|
942
966
|
fix: ["\u05DE\u05D1\u05E7\u05E9\u05D9\u05DD \u05DE\u05D4\u05E1\u05D5\u05DB\u05DF \u05DC\u05D1\u05E0\u05D5\u05EA \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8 \u05DE\u05D7\u05D3\u05E9 \u05DB\u05DA \u05E9\u05D9\u05E8\u05D5\u05E5 \u05D0\u05E6\u05DC\u05E0\u05D5, \u05E2\u05DD \u05D0\u05D5\u05EA\u05DD \u05D3\u05E4\u05D9\u05DD, \u05D8\u05E7\u05E1\u05D8\u05D9\u05DD \u05D5\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA.", "\u05D4\u05D0\u05EA\u05E8 \u05D4\u05D9\u05E9\u05DF \u05E0\u05E9\u05D0\u05E8 \u05DB\u05DE\u05D5 \u05E9\u05D4\u05D5\u05D0 \u05E2\u05D3 \u05E9\u05D0\u05EA\u05DD \u05DE\u05D0\u05E9\u05E8\u05D9\u05DD \u05D0\u05EA \u05D4\u05D7\u05D3\u05E9."],
|
|
943
|
-
prompt: "\u05D1\u05E0\u05D4 \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8 \u05DE\u05D7\u05D3\u05E9 \u05DB\u05DA \u05E9\u05D9\u05E8\u05D5\u05E5 \u05D1
|
|
967
|
+
prompt: "\u05D1\u05E0\u05D4 \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8 \u05DE\u05D7\u05D3\u05E9 \u05DB\u05DA \u05E9\u05D9\u05E8\u05D5\u05E5 \u05D1\u05BEDeployAI: HTML \u05E1\u05D8\u05D8\u05D9 \u05D0\u05DD \u05D0\u05D9\u05DF \u05D1\u05D5 \u05E7\u05D5\u05D3 \u05E9\u05E8\u05EA, \u05D0\u05D5 Astro \u05D0\u05D5 Hono \u05D0\u05DD \u05D9\u05E9 (\u05D8\u05E4\u05E1\u05D9\u05DD, \u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA, \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD). \u05E9\u05DE\u05D5\u05E8 \u05E2\u05DC \u05DB\u05DC \u05D4\u05D3\u05E4\u05D9\u05DD, \u05D4\u05D8\u05E7\u05E1\u05D8\u05D9\u05DD, \u05D4\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA, \u05D4\u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05D5\u05D4\u05D8\u05E4\u05E1\u05D9\u05DD, \u05D5\u05D4\u05E2\u05D1\u05E8 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DC\u05BED1. \u05D1\u05E0\u05D4 \u05D1\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D7\u05D3\u05E9\u05D4, \u05D4\u05E8\u05E5 \u05E9\u05DD npx deployai@latest check, \u05D5\u05D4\u05E9\u05D0\u05E8 \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8 \u05D4\u05D9\u05E9\u05DF \u05E2\u05D3 \u05E9\u05D4\u05DE\u05E9\u05EA\u05DE\u05E9 \u05DE\u05D0\u05E9\u05E8 \u05D0\u05EA \u05D4\u05D7\u05D3\u05E9."
|
|
944
968
|
},
|
|
945
969
|
en: {
|
|
946
970
|
what: "The site is built with a tool we do not run, such as WordPress, PHP or Python.",
|
|
@@ -979,7 +1003,7 @@ var ISSUE_HELP = {
|
|
|
979
1003
|
what: "\u05D4\u05D0\u05EA\u05E8 \u05D1\u05E0\u05D5\u05D9 \u05D1\u05DB\u05DC\u05D9 \u05E9\u05D4\u05EA\u05DE\u05D9\u05DB\u05D4 \u05D1\u05D5 \u05D0\u05E6\u05DC\u05E0\u05D5 \u05E2\u05D3\u05D9\u05D9\u05DF \u05D1\u05E9\u05DC\u05D1 \u05D1\u05D8\u05D0.",
|
|
980
1004
|
why: "\u05D6\u05D5 \u05E8\u05E7 \u05D0\u05D6\u05D4\u05E8\u05D4, \u05D5\u05D4\u05D0\u05EA\u05E8 \u05D9\u05DB\u05D5\u05DC \u05DC\u05E2\u05DC\u05D5\u05EA. \u05D4\u05DB\u05DC\u05D9 \u05E0\u05D1\u05E0\u05D4 \u05E2\u05DD \u05D4\u05DE\u05EA\u05D0\u05DD \u05D4\u05E8\u05E9\u05DE\u05D9 \u05E9\u05DC\u05D5, \u05D0\u05D1\u05DC \u05E2\u05D1\u05E8 \u05D0\u05E6\u05DC\u05E0\u05D5 \u05E4\u05D7\u05D5\u05EA \u05D1\u05D3\u05D9\u05E7\u05D5\u05EA.",
|
|
981
1005
|
fix: ["\u05DC\u05D0 \u05E6\u05E8\u05D9\u05DA \u05DC\u05E9\u05E0\u05D5\u05EA \u05DB\u05DC\u05D5\u05DD.", "\u05D1\u05D5\u05D3\u05E7\u05D9\u05DD \u05D4\u05D9\u05D8\u05D1 \u05D0\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8 \u05D4\u05EA\u05E6\u05D5\u05D2\u05D4 \u05D4\u05DE\u05E7\u05D3\u05D9\u05DE\u05D4 \u05DC\u05E4\u05E0\u05D9 \u05E9\u05DE\u05E2\u05DC\u05D9\u05DD \u05D0\u05EA \u05D4\u05D2\u05E8\u05E1\u05D4 \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8."],
|
|
982
|
-
prompt: "\u05D4\u05D0\u05EA\u05E8 \u05D9\u05DB\u05D5\u05DC \u05DC\u05E2\u05DC\u05D5\u05EA, \u05E0\u05D1\u05E0\u05D4 \u05E2\u05DD \u05D4\u05DE\u05EA\u05D0\u05DD \u05D4\u05E8\u05E9\u05DE\u05D9 \u05E9\u05DC Cloudflare, \u05D0\u05D1\u05DC \u05D4\u05DB\u05DC\u05D9 \u05D4\u05D6\u05D4 \u05E2\u05D1\u05E8 \u05E4\u05D7\u05D5\u05EA \u05D1\u05D3\u05D9\u05E7\u05D5\u05EA \u05D1
|
|
1006
|
+
prompt: "\u05D4\u05D0\u05EA\u05E8 \u05D9\u05DB\u05D5\u05DC \u05DC\u05E2\u05DC\u05D5\u05EA, \u05E0\u05D1\u05E0\u05D4 \u05E2\u05DD \u05D4\u05DE\u05EA\u05D0\u05DD \u05D4\u05E8\u05E9\u05DE\u05D9 \u05E9\u05DC Cloudflare, \u05D0\u05D1\u05DC \u05D4\u05DB\u05DC\u05D9 \u05D4\u05D6\u05D4 \u05E2\u05D1\u05E8 \u05E4\u05D7\u05D5\u05EA \u05D1\u05D3\u05D9\u05E7\u05D5\u05EA \u05D1\u05BEDeployAI. \u05E1\u05E4\u05E8 \u05E2\u05DC \u05D6\u05D4 \u05DC\u05DE\u05E9\u05EA\u05DE\u05E9, \u05D5\u05D1\u05D3\u05D5\u05E7 \u05D4\u05D9\u05D8\u05D1 \u05D0\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8 \u05D4\u05EA\u05E6\u05D5\u05D2\u05D4 \u05D4\u05DE\u05E7\u05D3\u05D9\u05DE\u05D4 \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D4\u05D2\u05E8\u05E1\u05D4 \u05E2\u05D5\u05DC\u05D4 \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8."
|
|
983
1007
|
},
|
|
984
1008
|
en: {
|
|
985
1009
|
what: "The site is built with a tool whose support on DeployAI is still in beta.",
|
|
@@ -989,7 +1013,7 @@ var ISSUE_HELP = {
|
|
|
989
1013
|
},
|
|
990
1014
|
astro_adapter_unsupported: {
|
|
991
1015
|
he: {
|
|
992
|
-
what: "\u05D4\u05D0\u05EA\u05E8 \u05D1\u05E0\u05D5\u05D9 \u05D1
|
|
1016
|
+
what: "\u05D4\u05D0\u05EA\u05E8 \u05D1\u05E0\u05D5\u05D9 \u05D1\u05BEAstro, \u05D0\u05D1\u05DC \u05DE\u05D5\u05D2\u05D3\u05E8 \u05E2\u05DD \u05DE\u05EA\u05D0\u05DD \u05DC\u05E9\u05E8\u05EA \u05DE\u05E1\u05D5\u05D2 \u05D0\u05D7\u05E8.",
|
|
993
1017
|
why: "\u05D6\u05D5 \u05D0\u05D6\u05D4\u05E8\u05D4. \u05D4\u05DE\u05EA\u05D0\u05DD \u05E7\u05D5\u05D1\u05E2 \u05D0\u05D9\u05E4\u05D4 \u05D4\u05D7\u05DC\u05E7\u05D9\u05DD \u05D4\u05D3\u05D9\u05E0\u05DE\u05D9\u05D9\u05DD \u05E9\u05DC \u05D4\u05D0\u05EA\u05E8 \u05E8\u05E6\u05D9\u05DD, \u05D5\u05DE\u05EA\u05D0\u05DD \u05DC\u05D0 \u05DE\u05EA\u05D0\u05D9\u05DD \u05D9\u05DB\u05D5\u05DC \u05DC\u05E9\u05D1\u05D5\u05E8 \u05D0\u05D5\u05EA\u05DD.",
|
|
994
1018
|
fix: ["\u05DC\u05D7\u05DC\u05E7\u05D9\u05DD \u05D3\u05D9\u05E0\u05DE\u05D9\u05D9\u05DD \u05DE\u05D7\u05DC\u05D9\u05E4\u05D9\u05DD \u05DC\u05DE\u05EA\u05D0\u05DD \u05E9\u05D0\u05E0\u05D7\u05E0\u05D5 \u05EA\u05D5\u05DE\u05DB\u05D9\u05DD \u05D1\u05D5. \u05D4\u05E1\u05D5\u05DB\u05DF \u05D9\u05D5\u05D3\u05E2 \u05D0\u05D9\u05D6\u05D4.", "\u05D0\u05EA\u05E8 \u05E1\u05D8\u05D8\u05D9 \u05DC\u05D2\u05DE\u05E8\u05D9 \u05DC\u05D0 \u05E6\u05E8\u05D9\u05DA \u05DE\u05EA\u05D0\u05DD \u05D1\u05DB\u05DC\u05DC."],
|
|
995
1019
|
prompt: "\u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\u05DE\u05EA\u05D0\u05DD @astrojs/cloudflare \u05DC\u05E0\u05EA\u05D9\u05D1\u05D9 \u05E9\u05E8\u05EA, \u05D0\u05D5 \u05D4\u05E1\u05E8 \u05D0\u05EA \u05D4\u05DE\u05EA\u05D0\u05DD \u05DC\u05D0\u05EA\u05E8 \u05E1\u05D8\u05D8\u05D9 \u05DC\u05D2\u05DE\u05E8\u05D9."
|
|
@@ -1044,7 +1068,7 @@ var ISSUE_HELP = {
|
|
|
1044
1068
|
what: "\u05D9\u05E9 \u05D1\u05D8\u05D5\u05E4\u05E1 \u05E9\u05D3\u05D5\u05EA \u05D1\u05DC\u05D9 \u05EA\u05D5\u05D5\u05D9\u05EA \u05E9\u05D0\u05D5\u05DE\u05E8\u05EA \u05DE\u05D4 \u05E6\u05E8\u05D9\u05DA \u05DC\u05DE\u05DC\u05D0 \u05D1\u05D4\u05DD.",
|
|
1045
1069
|
why: '\u05D6\u05D5 \u05E8\u05E7 \u05D0\u05D6\u05D4\u05E8\u05D4. \u05E7\u05D5\u05E8\u05D0 \u05DE\u05E1\u05DA \u05DE\u05E7\u05E8\u05D9\u05D0 \u05E8\u05E7 "\u05E9\u05D3\u05D4 \u05E2\u05E8\u05D9\u05DB\u05D4", \u05D5\u05D4\u05D2\u05D5\u05DC\u05E9 \u05DC\u05D0 \u05D9\u05D5\u05D3\u05E2 \u05DE\u05D4 \u05DC\u05DB\u05EA\u05D5\u05D1. \u05D8\u05E7\u05E1\u05D8 \u05DC\u05D3\u05D5\u05D2\u05DE\u05D4 \u05D1\u05EA\u05D5\u05DA \u05D4\u05E9\u05D3\u05D4 \u05DC\u05D0 \u05DE\u05E1\u05E4\u05D9\u05E7, \u05DB\u05D9 \u05D4\u05D5\u05D0 \u05E0\u05E2\u05DC\u05DD \u05DB\u05E9\u05DE\u05EA\u05D7\u05D9\u05DC\u05D9\u05DD \u05DC\u05D4\u05E7\u05DC\u05D9\u05D3.',
|
|
1046
1070
|
fix: ["\u05DE\u05D5\u05E1\u05D9\u05E4\u05D9\u05DD \u05DC\u05DB\u05DC \u05E9\u05D3\u05D4 \u05EA\u05D5\u05D5\u05D9\u05EA \u05D2\u05DC\u05D5\u05D9\u05D4 \u05E9\u05DE\u05D7\u05D5\u05D1\u05E8\u05EA \u05D0\u05DC\u05D9\u05D5.", "\u05DE\u05E8\u05D9\u05E6\u05D9\u05DD \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D4\u05D1\u05D3\u05D9\u05E7\u05D4."],
|
|
1047
|
-
prompt: '\u05EA\u05DF \u05DC\u05DB\u05DC input, select \u05D5
|
|
1071
|
+
prompt: '\u05EA\u05DF \u05DC\u05DB\u05DC input, select \u05D5\u05BEtextarea \u05EA\u05D5\u05D5\u05D9\u05EA \u05D2\u05DC\u05D5\u05D9\u05D4 <label for="field-id"> \u05E9\u05DE\u05EA\u05D0\u05D9\u05DE\u05D4 \u05DC\u05BEid \u05E9\u05DC \u05D4\u05E9\u05D3\u05D4, \u05D0\u05D5 \u05E2\u05D8\u05D5\u05E3 \u05D0\u05EA \u05D4\u05E9\u05D3\u05D4 \u05D1 <label> \u05E9\u05DC\u05D5. \u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\u05BEaria-label \u05E8\u05E7 \u05DB\u05E9\u05D0\u05D9\u05DF \u05D0\u05E4\u05E9\u05E8\u05D5\u05EA \u05DC\u05EA\u05D5\u05D5\u05D9\u05EA \u05D2\u05DC\u05D5\u05D9\u05D4. placeholder \u05D4\u05D5\u05D0 \u05DC\u05D0 \u05EA\u05D5\u05D5\u05D9\u05EA.'
|
|
1048
1072
|
},
|
|
1049
1073
|
en: {
|
|
1050
1074
|
what: "A form has fields with no label that says what to fill in.",
|
|
@@ -1057,7 +1081,7 @@ var ISSUE_HELP = {
|
|
|
1057
1081
|
what: "\u05D9\u05E9 \u05D1\u05D0\u05EA\u05E8 \u05DB\u05E4\u05EA\u05D5\u05E8\u05D9\u05DD \u05D1\u05DC\u05D9 \u05E9\u05DD, \u05D1\u05D3\u05E8\u05DA \u05DB\u05DC\u05DC \u05DB\u05E4\u05EA\u05D5\u05E8\u05D9\u05DD \u05E9\u05D9\u05E9 \u05D1\u05D4\u05DD \u05E8\u05E7 \u05E1\u05DE\u05DC.",
|
|
1058
1082
|
why: '\u05D6\u05D5 \u05E8\u05E7 \u05D0\u05D6\u05D4\u05E8\u05D4. \u05E7\u05D5\u05E8\u05D0 \u05DE\u05E1\u05DA \u05DE\u05E7\u05E8\u05D9\u05D0 \u05E8\u05E7 "\u05DB\u05E4\u05EA\u05D5\u05E8", \u05D5\u05D4\u05D2\u05D5\u05DC\u05E9 \u05DC\u05D0 \u05D9\u05D5\u05D3\u05E2 \u05DE\u05D4 \u05D4\u05DB\u05E4\u05EA\u05D5\u05E8 \u05E2\u05D5\u05E9\u05D4.',
|
|
1059
1083
|
fix: ['\u05E0\u05D5\u05EA\u05E0\u05D9\u05DD \u05DC\u05DB\u05DC \u05DB\u05E4\u05EA\u05D5\u05E8 \u05D8\u05E7\u05E1\u05D8, \u05D0\u05D5 \u05E9\u05DD \u05E0\u05E1\u05EA\u05E8 \u05DC\u05DB\u05E4\u05EA\u05D5\u05E8 \u05E9\u05D9\u05E9 \u05D1\u05D5 \u05E8\u05E7 \u05E1\u05DE\u05DC, \u05DC\u05DE\u05E9\u05DC "\u05E1\u05D2\u05D9\u05E8\u05EA \u05D4\u05EA\u05E4\u05E8\u05D9\u05D8".', "\u05DE\u05E8\u05D9\u05E6\u05D9\u05DD \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D4\u05D1\u05D3\u05D9\u05E7\u05D4."],
|
|
1060
|
-
prompt: '\u05EA\u05DF \u05DC\u05DB\u05DC <button> \u05E9\u05DD \u05E9\u05E7\u05D5\u05E8\u05D0 \u05DE\u05E1\u05DA \u05D9\u05DB\u05D5\u05DC \u05DC\u05D4\u05E7\u05E8\u05D9\u05D0: \u05D8\u05E7\u05E1\u05D8 \u05D2\u05DC\u05D5\u05D9, \u05D0\u05D5 aria-label="..." \u05DC\u05DB\u05E4\u05EA\u05D5\u05E8 \u05E9\u05D9\u05E9 \u05D1\u05D5 \u05E8\u05E7 \u05E1\u05DE\u05DC (\u05DC\u05DE\u05E9\u05DC aria-label="\u05E1\u05D2\u05D9\u05E8\u05EA \u05D4\u05EA\u05E4\u05E8\u05D9\u05D8"). \u05E1\u05DE\u05DF \u05D0\u05EA \u05D4\u05E1\u05DE\u05DC \u05E9\u05D1\u05EA\u05D5\u05DB\u05D5 \u05D1
|
|
1084
|
+
prompt: '\u05EA\u05DF \u05DC\u05DB\u05DC <button> \u05E9\u05DD \u05E9\u05E7\u05D5\u05E8\u05D0 \u05DE\u05E1\u05DA \u05D9\u05DB\u05D5\u05DC \u05DC\u05D4\u05E7\u05E8\u05D9\u05D0: \u05D8\u05E7\u05E1\u05D8 \u05D2\u05DC\u05D5\u05D9, \u05D0\u05D5 aria-label="..." \u05DC\u05DB\u05E4\u05EA\u05D5\u05E8 \u05E9\u05D9\u05E9 \u05D1\u05D5 \u05E8\u05E7 \u05E1\u05DE\u05DC (\u05DC\u05DE\u05E9\u05DC aria-label="\u05E1\u05D2\u05D9\u05E8\u05EA \u05D4\u05EA\u05E4\u05E8\u05D9\u05D8"). \u05E1\u05DE\u05DF \u05D0\u05EA \u05D4\u05E1\u05DE\u05DC \u05E9\u05D1\u05EA\u05D5\u05DB\u05D5 \u05D1\u05BEaria-hidden="true".'
|
|
1061
1085
|
},
|
|
1062
1086
|
en: {
|
|
1063
1087
|
what: "The site has buttons with no name, usually buttons that show only an icon.",
|
|
@@ -1083,7 +1107,7 @@ var ISSUE_HELP = {
|
|
|
1083
1107
|
what: "\u05D4\u05DB\u05D5\u05EA\u05E8\u05D5\u05EA \u05D1\u05E2\u05DE\u05D5\u05D3 \u05DE\u05D3\u05DC\u05D2\u05D5\u05EA \u05E2\u05DC \u05E8\u05DE\u05D4, \u05DC\u05DE\u05E9\u05DC \u05DE\u05DB\u05D5\u05EA\u05E8\u05EA \u05DE\u05E9\u05E0\u05D4 \u05D9\u05E9\u05E8 \u05DC\u05DB\u05D5\u05EA\u05E8\u05EA \u05D1\u05E8\u05DE\u05D4 \u05E8\u05D1\u05D9\u05E2\u05D9\u05EA, \u05D0\u05D5 \u05E9\u05D0\u05D9\u05DF \u05D1\u05E2\u05DE\u05D5\u05D3 \u05DB\u05D5\u05EA\u05E8\u05EA \u05E8\u05D0\u05E9\u05D9\u05EA.",
|
|
1084
1108
|
why: "\u05D6\u05D5 \u05E8\u05E7 \u05D0\u05D6\u05D4\u05E8\u05D4. \u05D2\u05D5\u05DC\u05E9\u05D9\u05DD \u05E2\u05DD \u05E7\u05D5\u05E8\u05D0 \u05DE\u05E1\u05DA \u05E2\u05D5\u05D1\u05E8\u05D9\u05DD \u05D1\u05D9\u05DF \u05DB\u05D5\u05EA\u05E8\u05D5\u05EA \u05DB\u05D3\u05D9 \u05DC\u05D4\u05D1\u05D9\u05DF \u05D0\u05EA \u05DE\u05D1\u05E0\u05D4 \u05D4\u05E2\u05DE\u05D5\u05D3, \u05D5\u05D3\u05D9\u05DC\u05D5\u05D2 \u05E2\u05DC \u05E8\u05DE\u05D4 \u05E0\u05E8\u05D0\u05D4 \u05DC\u05D4\u05DD \u05DB\u05DE\u05D5 \u05D7\u05DC\u05E7 \u05D7\u05E1\u05E8.",
|
|
1085
1109
|
fix: ["\u05E0\u05D5\u05EA\u05E0\u05D9\u05DD \u05DC\u05DB\u05DC \u05E2\u05DE\u05D5\u05D3 \u05DB\u05D5\u05EA\u05E8\u05EA \u05E8\u05D0\u05E9\u05D9\u05EA \u05D0\u05D7\u05EA.", "\u05DE\u05E9\u05EA\u05DE\u05E9\u05D9\u05DD \u05D1\u05E8\u05DE\u05D5\u05EA \u05D4\u05DB\u05D5\u05EA\u05E8\u05D5\u05EA \u05DC\u05E4\u05D9 \u05D4\u05E1\u05D3\u05E8, \u05D5\u05D4\u05DE\u05E8\u05D0\u05D4 \u05E0\u05E9\u05D0\u05E8 \u05D0\u05D5\u05EA\u05D5 \u05D3\u05D1\u05E8.", "\u05DE\u05E8\u05D9\u05E6\u05D9\u05DD \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D4\u05D1\u05D3\u05D9\u05E7\u05D4."],
|
|
1086
|
-
prompt: "\u05EA\u05DF \u05DC\u05DB\u05DC \u05E2\u05DE\u05D5\u05D3 <h1> \u05D0\u05D7\u05D3, \u05D5\u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\u05DB\u05D5\u05EA\u05E8\u05D5\u05EA \u05DC\u05E4\u05D9 \u05D4\u05E1\u05D3\u05E8 \u05D1\u05DC\u05D9 \u05DC\u05D3\u05DC\u05D2 \u05E2\u05DC \u05E8\u05DE\u05D4 (h2 \u05DE\u05EA\u05D7\u05EA \u05DC
|
|
1110
|
+
prompt: "\u05EA\u05DF \u05DC\u05DB\u05DC \u05E2\u05DE\u05D5\u05D3 <h1> \u05D0\u05D7\u05D3, \u05D5\u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\u05DB\u05D5\u05EA\u05E8\u05D5\u05EA \u05DC\u05E4\u05D9 \u05D4\u05E1\u05D3\u05E8 \u05D1\u05DC\u05D9 \u05DC\u05D3\u05DC\u05D2 \u05E2\u05DC \u05E8\u05DE\u05D4 (h2 \u05DE\u05EA\u05D7\u05EA \u05DC\u05BEh1, h3 \u05DE\u05EA\u05D7\u05EA \u05DC\u05BEh2). \u05D1\u05D7\u05E8 \u05D0\u05EA \u05E8\u05DE\u05EA \u05D4\u05DB\u05D5\u05EA\u05E8\u05EA \u05DC\u05E4\u05D9 \u05D4\u05DE\u05D1\u05E0\u05D4, \u05D5\u05E9\u05DE\u05D5\u05E8 \u05E2\u05DC \u05D0\u05D5\u05EA\u05D5 \u05DE\u05E8\u05D0\u05D4 \u05E2\u05DD CSS."
|
|
1087
1111
|
},
|
|
1088
1112
|
en: {
|
|
1089
1113
|
what: "The headings on a page skip a level, for example from a subheading straight to a fourth level heading, or the page has no main heading.",
|
|
@@ -1109,7 +1133,7 @@ var ISSUE_HELP = {
|
|
|
1109
1133
|
what: "\u05D9\u05E9 \u05D1\u05D0\u05EA\u05E8 \u05E8\u05DB\u05D9\u05D1\u05D9\u05DD \u05E9\u05DE\u05E9\u05E0\u05D9\u05DD \u05D1\u05DB\u05D5\u05D7 \u05D0\u05EA \u05E1\u05D3\u05E8 \u05D4\u05DE\u05E2\u05D1\u05E8 \u05D1\u05DE\u05E7\u05E9 Tab.",
|
|
1110
1134
|
why: "\u05D6\u05D5 \u05E8\u05E7 \u05D0\u05D6\u05D4\u05E8\u05D4. \u05DE\u05D9 \u05E9\u05D2\u05D5\u05DC\u05E9 \u05E2\u05DD \u05DE\u05E7\u05DC\u05D3\u05EA \u05E7\u05D5\u05E4\u05E5 \u05D1\u05D9\u05DF \u05D7\u05DC\u05E7\u05D9 \u05D4\u05E2\u05DE\u05D5\u05D3 \u05D1\u05E1\u05D3\u05E8 \u05DE\u05D1\u05DC\u05D1\u05DC, \u05E9\u05DC\u05D0 \u05DE\u05EA\u05D0\u05D9\u05DD \u05DC\u05DE\u05D4 \u05E9\u05D4\u05D5\u05D0 \u05E8\u05D5\u05D0\u05D4.",
|
|
1111
1135
|
fix: ["\u05DE\u05D1\u05D8\u05DC\u05D9\u05DD \u05D0\u05EA \u05E1\u05D3\u05E8 \u05D4\u05DE\u05E2\u05D1\u05E8 \u05D4\u05DE\u05D5\u05EA\u05D0\u05DD, \u05D5\u05DE\u05E1\u05D3\u05E8\u05D9\u05DD \u05D0\u05EA \u05D4\u05E8\u05DB\u05D9\u05D1\u05D9\u05DD \u05D1\u05E2\u05DE\u05D5\u05D3 \u05DC\u05E4\u05D9 \u05D4\u05E1\u05D3\u05E8 \u05D4\u05E0\u05DB\u05D5\u05DF.", "\u05DE\u05E8\u05D9\u05E6\u05D9\u05DD \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D4\u05D1\u05D3\u05D9\u05E7\u05D4."],
|
|
1112
|
-
prompt: '\u05D4\u05E1\u05E8 \u05E2\u05E8\u05DB\u05D9 tabindex \u05D2\u05D3\u05D5\u05DC\u05D9\u05DD \u05DE 0. \u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1
|
|
1136
|
+
prompt: '\u05D4\u05E1\u05E8 \u05E2\u05E8\u05DB\u05D9 tabindex \u05D2\u05D3\u05D5\u05DC\u05D9\u05DD \u05DE 0. \u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\u05BEtabindex="0" \u05DB\u05D3\u05D9 \u05E9\u05E8\u05DB\u05D9\u05D1 \u05DE\u05D5\u05EA\u05D0\u05DD \u05D9\u05E7\u05D1\u05DC \u05E4\u05D5\u05E7\u05D5\u05E1, \u05D5\u05E1\u05D3\u05E8 \u05D0\u05EA \u05D4\u05E8\u05DB\u05D9\u05D1\u05D9\u05DD \u05D1\u05E1\u05D3\u05E8 \u05D4\u05E0\u05DB\u05D5\u05DF \u05D1\u05BEHTML \u05D1\u05DE\u05E7\u05D5\u05DD \u05DC\u05DB\u05E4\u05D5\u05EA \u05E1\u05D3\u05E8.'
|
|
1113
1137
|
},
|
|
1114
1138
|
en: {
|
|
1115
1139
|
what: "The site has elements that force a custom order for the Tab key.",
|
|
@@ -1148,7 +1172,7 @@ var ISSUE_HELP = {
|
|
|
1148
1172
|
what: '\u05E2\u05DE\u05D5\u05D3 \u05D4\u05D1\u05D9\u05EA \u05DC\u05D0 \u05DE\u05EA\u05D7\u05D9\u05DC \u05D1\u05E7\u05D9\u05E9\u05D5\u05E8 "\u05D3\u05D9\u05DC\u05D5\u05D2 \u05DC\u05EA\u05D5\u05DB\u05DF" \u05E9\u05DE\u05D5\u05D1\u05D9\u05DC \u05D9\u05E9\u05E8 \u05DC\u05EA\u05D5\u05DB\u05DF \u05D4\u05E8\u05D0\u05E9\u05D9.',
|
|
1149
1173
|
why: "\u05D6\u05D5 \u05E8\u05E7 \u05D0\u05D6\u05D4\u05E8\u05D4. \u05DE\u05D9 \u05E9\u05D2\u05D5\u05DC\u05E9 \u05E2\u05DD \u05DE\u05E7\u05DC\u05D3\u05EA \u05E6\u05E8\u05D9\u05DA \u05DC\u05E2\u05D1\u05D5\u05E8 \u05E2\u05DC \u05DB\u05DC \u05D4\u05EA\u05E4\u05E8\u05D9\u05D8 \u05D1\u05DB\u05DC \u05E2\u05DE\u05D5\u05D3 \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D4\u05D5\u05D0 \u05DE\u05D2\u05D9\u05E2 \u05DC\u05EA\u05D5\u05DB\u05DF.",
|
|
1150
1174
|
fix: ['\u05DE\u05D5\u05E1\u05D9\u05E4\u05D9\u05DD \u05D1\u05EA\u05D7\u05D9\u05DC\u05EA \u05D4\u05E2\u05DE\u05D5\u05D3 \u05E7\u05D9\u05E9\u05D5\u05E8 "\u05D3\u05D9\u05DC\u05D5\u05D2 \u05DC\u05EA\u05D5\u05DB\u05DF" \u05E9\u05DE\u05D5\u05E4\u05D9\u05E2 \u05E8\u05E7 \u05DB\u05E9\u05DE\u05D2\u05D9\u05E2\u05D9\u05DD \u05D0\u05DC\u05D9\u05D5 \u05D1\u05DE\u05E7\u05DC\u05D3\u05EA.', "\u05DE\u05E8\u05D9\u05E6\u05D9\u05DD \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D4\u05D1\u05D3\u05D9\u05E7\u05D4."],
|
|
1151
|
-
prompt: '\u05D4\u05D5\u05E1\u05E3 \u05E7\u05D9\u05E9\u05D5\u05E8 \u05D3\u05D9\u05DC\u05D5\u05D2 \u05DB\u05E8\u05DB\u05D9\u05D1 \u05D4\u05E8\u05D0\u05E9\u05D5\u05DF \u05E9\u05DE\u05E7\u05D1\u05DC \u05E4\u05D5\u05E7\u05D5\u05E1 \u05D1 <body>: <a href="#main" class="skip-link">\u05D3\u05D9\u05DC\u05D5\u05D2 \u05DC\u05EA\u05D5\u05DB\u05DF</a> \u05D1\u05E9\u05E4\u05EA \u05D4\u05E2\u05DE\u05D5\u05D3, \u05D5
|
|
1175
|
+
prompt: '\u05D4\u05D5\u05E1\u05E3 \u05E7\u05D9\u05E9\u05D5\u05E8 \u05D3\u05D9\u05DC\u05D5\u05D2 \u05DB\u05E8\u05DB\u05D9\u05D1 \u05D4\u05E8\u05D0\u05E9\u05D5\u05DF \u05E9\u05DE\u05E7\u05D1\u05DC \u05E4\u05D5\u05E7\u05D5\u05E1 \u05D1 <body>: <a href="#main" class="skip-link">\u05D3\u05D9\u05DC\u05D5\u05D2 \u05DC\u05EA\u05D5\u05DB\u05DF</a> \u05D1\u05E9\u05E4\u05EA \u05D4\u05E2\u05DE\u05D5\u05D3, \u05D5\u05BEid="main" \u05E2\u05DC \u05E8\u05DB\u05D9\u05D1 \u05D4 <main>. \u05D4\u05E1\u05EA\u05E8 \u05D0\u05D5\u05EA\u05D5 \u05E2\u05D3 \u05E9\u05D4\u05D5\u05D0 \u05DE\u05E7\u05D1\u05DC \u05E4\u05D5\u05E7\u05D5\u05E1 \u05DE\u05D4\u05DE\u05E7\u05DC\u05D3\u05EA, \u05D5\u05D0\u05D6 \u05D4\u05E6\u05D2 \u05D0\u05D5\u05EA\u05D5.'
|
|
1152
1176
|
},
|
|
1153
1177
|
en: {
|
|
1154
1178
|
what: 'The home page does not start with a "Skip to content" link that goes straight to the main content.',
|
|
@@ -1161,7 +1185,7 @@ var ISSUE_HELP = {
|
|
|
1161
1185
|
what: "\u05DC\u05D0 \u05DE\u05E6\u05D0\u05E0\u05D5 \u05D1\u05D0\u05EA\u05E8 \u05D4\u05E6\u05D4\u05E8\u05EA \u05E0\u05D2\u05D9\u05E9\u05D5\u05EA, \u05D0\u05D5 \u05E9\u05D0\u05D9\u05DF \u05D0\u05DC\u05D9\u05D4 \u05E7\u05D9\u05E9\u05D5\u05E8 \u05DE\u05E2\u05DE\u05D5\u05D3 \u05D4\u05D1\u05D9\u05EA.",
|
|
1162
1186
|
why: "\u05D6\u05D5 \u05E8\u05E7 \u05D0\u05D6\u05D4\u05E8\u05D4, \u05D5\u05D4\u05D0\u05EA\u05E8 \u05D9\u05E2\u05DC\u05D4. \u05D0\u05D1\u05DC \u05D1\u05D9\u05E9\u05E8\u05D0\u05DC \u05D0\u05EA\u05E8 \u05E9\u05DC \u05E2\u05E1\u05E7 \u05E9\u05E0\u05D5\u05EA\u05DF \u05E9\u05D9\u05E8\u05D5\u05EA \u05DC\u05E6\u05D9\u05D1\u05D5\u05E8 \u05E6\u05E8\u05D9\u05DA \u05D4\u05E6\u05D4\u05E8\u05EA \u05E0\u05D2\u05D9\u05E9\u05D5\u05EA \u05E9\u05E7\u05DC \u05DC\u05DE\u05E6\u05D5\u05D0, \u05D1\u05D3\u05E8\u05DA \u05DB\u05DC\u05DC \u05D1\u05EA\u05D7\u05EA\u05D9\u05EA \u05DB\u05DC \u05E2\u05DE\u05D5\u05D3.",
|
|
1163
1187
|
fix: ['\u05DE\u05D5\u05E1\u05D9\u05E4\u05D9\u05DD \u05E2\u05DE\u05D5\u05D3 "\u05D4\u05E6\u05D4\u05E8\u05EA \u05E0\u05D2\u05D9\u05E9\u05D5\u05EA" \u05E2\u05DD \u05DE\u05D4 \u05E9\u05D4\u05D5\u05E0\u05D2\u05E9, \u05DE\u05D4 \u05E2\u05D5\u05D3 \u05DC\u05D0, \u05D5\u05E4\u05E8\u05D8\u05D9 \u05D4\u05E7\u05E9\u05E8 \u05E9\u05DC \u05E8\u05DB\u05D6 \u05D4\u05E0\u05D2\u05D9\u05E9\u05D5\u05EA.', "\u05DE\u05E7\u05E9\u05E8\u05D9\u05DD \u05D0\u05DC\u05D9\u05D5 \u05DE\u05D4\u05EA\u05D7\u05EA\u05D9\u05EA \u05E9\u05DC \u05DB\u05DC \u05E2\u05DE\u05D5\u05D3.", "\u05DE\u05E8\u05D9\u05E6\u05D9\u05DD \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D4\u05D1\u05D3\u05D9\u05E7\u05D4."],
|
|
1164
|
-
prompt: '\u05D4\u05D5\u05E1\u05E3 \u05E2\u05DE\u05D5\u05D3 \u05D4\u05E6\u05D4\u05E8\u05EA \u05E0\u05D2\u05D9\u05E9\u05D5\u05EA (\u05DC\u05DE\u05E9\u05DC accessibility.html, \u05E2\u05DD \u05D4\u05DB\u05D5\u05EA\u05E8\u05EA "\u05D4\u05E6\u05D4\u05E8\u05EA \u05E0\u05D2\u05D9\u05E9\u05D5\u05EA" \u05D1\u05D0\u05EA\u05E8 \u05D1\u05E2\u05D1\u05E8\u05D9\u05EA) \u05D5\u05E7\u05E9\u05E8 \u05D0\u05DC\u05D9\u05D5 \u05DE\u05D4\u05EA\u05D7\u05EA\u05D9\u05EA \u05E9\u05DC \u05DB\u05DC \u05E2\u05DE\u05D5\u05D3. \u05D4\u05E2\u05DE\u05D5\u05D3 \u05D0\u05D5\u05DE\u05E8 \u05DE\u05D4 \u05D4\u05D5\u05E0\u05D2\u05E9, \u05DC\u05E4\u05D9 \u05D0\u05D9\u05D6\u05D4 \u05EA\u05E7\u05DF (\u05EA
|
|
1188
|
+
prompt: '\u05D4\u05D5\u05E1\u05E3 \u05E2\u05DE\u05D5\u05D3 \u05D4\u05E6\u05D4\u05E8\u05EA \u05E0\u05D2\u05D9\u05E9\u05D5\u05EA (\u05DC\u05DE\u05E9\u05DC accessibility.html, \u05E2\u05DD \u05D4\u05DB\u05D5\u05EA\u05E8\u05EA "\u05D4\u05E6\u05D4\u05E8\u05EA \u05E0\u05D2\u05D9\u05E9\u05D5\u05EA" \u05D1\u05D0\u05EA\u05E8 \u05D1\u05E2\u05D1\u05E8\u05D9\u05EA) \u05D5\u05E7\u05E9\u05E8 \u05D0\u05DC\u05D9\u05D5 \u05DE\u05D4\u05EA\u05D7\u05EA\u05D9\u05EA \u05E9\u05DC \u05DB\u05DC \u05E2\u05DE\u05D5\u05D3. \u05D4\u05E2\u05DE\u05D5\u05D3 \u05D0\u05D5\u05DE\u05E8 \u05DE\u05D4 \u05D4\u05D5\u05E0\u05D2\u05E9, \u05DC\u05E4\u05D9 \u05D0\u05D9\u05D6\u05D4 \u05EA\u05E7\u05DF (\u05EA\u05F4\u05D9 5568, WCAG 2.0 \u05D1\u05E8\u05DE\u05D4 AA), \u05DE\u05D4 \u05E2\u05D5\u05D3 \u05DC\u05D0 \u05E0\u05D2\u05D9\u05E9, \u05DE\u05D9 \u05E8\u05DB\u05D6 \u05D4\u05E0\u05D2\u05D9\u05E9\u05D5\u05EA \u05E2\u05DD \u05D8\u05DC\u05E4\u05D5\u05DF \u05D5\u05DE\u05D9\u05D9\u05DC, \u05D5\u05DE\u05EA\u05D9 \u05D4\u05D4\u05E6\u05D4\u05E8\u05D4 \u05E2\u05D5\u05D3\u05DB\u05E0\u05D4 \u05DC\u05D0\u05D7\u05E8\u05D5\u05E0\u05D4.'
|
|
1165
1189
|
},
|
|
1166
1190
|
en: {
|
|
1167
1191
|
what: "We did not find an accessibility statement on the site, or the home page does not link to it.",
|
|
@@ -20910,18 +20934,23 @@ var DeployResponse = external_exports.object({
|
|
|
20910
20934
|
versionId: external_exports.string(),
|
|
20911
20935
|
number: external_exports.number(),
|
|
20912
20936
|
queuePosition: external_exports.number(),
|
|
20913
|
-
previewUrl: external_exports.string()
|
|
20937
|
+
previewUrl: external_exports.string(),
|
|
20938
|
+
/** Only for a heavy home page (D-420): the files it loads from the site and whether it prefetches links. */
|
|
20939
|
+
page: external_exports.object({ files: external_exports.number(), prefetches: external_exports.boolean() }).optional()
|
|
20914
20940
|
});
|
|
20941
|
+
var VersionStatus = external_exports.enum(["queued", "building", "ready", "failed", "replaced"]);
|
|
20942
|
+
var MigrationStatus = external_exports.enum(["waiting", "queued", "running", "done", "failed"]);
|
|
20915
20943
|
var Version = external_exports.object({
|
|
20916
20944
|
id: external_exports.string(),
|
|
20917
20945
|
number: external_exports.number(),
|
|
20918
20946
|
message: external_exports.string(),
|
|
20919
|
-
status:
|
|
20947
|
+
status: VersionStatus,
|
|
20920
20948
|
isLive: external_exports.boolean(),
|
|
20921
20949
|
createdAt: external_exports.string(),
|
|
20922
20950
|
sizeBytes: external_exports.number(),
|
|
20923
20951
|
/** Why the build failed, in words the customer's AI can act on. Null unless status is failed. */
|
|
20924
|
-
error: external_exports.string().nullable().optional()
|
|
20952
|
+
error: external_exports.string().nullable().optional(),
|
|
20953
|
+
migrationStatus: MigrationStatus.nullable().optional()
|
|
20925
20954
|
});
|
|
20926
20955
|
var VersionsResponse = external_exports.object({ versions: external_exports.array(Version) });
|
|
20927
20956
|
var EnvSetRequest = external_exports.object({ projectId: external_exports.string(), key: external_exports.string(), value: external_exports.string(), secret: external_exports.boolean().default(true) });
|
|
@@ -20934,13 +20963,27 @@ var StatusResponse = external_exports.object({
|
|
|
20934
20963
|
project: Project,
|
|
20935
20964
|
queue: external_exports.object({ position: external_exports.number(), running: external_exports.boolean() }),
|
|
20936
20965
|
/** The newest version, with the error and the end of the build log when it failed. */
|
|
20937
|
-
latest: external_exports.object({
|
|
20966
|
+
latest: external_exports.object({
|
|
20967
|
+
number: external_exports.number(),
|
|
20968
|
+
status: VersionStatus,
|
|
20969
|
+
error: external_exports.string().nullable(),
|
|
20970
|
+
logTail: external_exports.string().nullable(),
|
|
20971
|
+
migrationStatus: MigrationStatus.nullable().optional(),
|
|
20972
|
+
/** A ready version that is not live: its preview, for the owner to look at before promote (D-505). */
|
|
20973
|
+
preview: external_exports.string().nullable().optional(),
|
|
20974
|
+
/** Going live right now (D-528). */
|
|
20975
|
+
goingLive: external_exports.boolean().optional(),
|
|
20976
|
+
/** The go live check found it broken and the previous version came back (D-297, D-528). */
|
|
20977
|
+
wentBack: external_exports.object({ previous: external_exports.number(), reason: external_exports.string() }).nullable().optional()
|
|
20978
|
+
}).nullable().optional()
|
|
20938
20979
|
});
|
|
20939
20980
|
var ApiError = external_exports.object({
|
|
20940
20981
|
error: external_exports.string(),
|
|
20941
20982
|
messageHe: external_exports.string().optional(),
|
|
20942
20983
|
/** Where to buy what the call needs (D-206). */
|
|
20943
|
-
buyUrl: external_exports.string().optional()
|
|
20984
|
+
buyUrl: external_exports.string().optional(),
|
|
20985
|
+
/** The dashboard page that resolves the refusal, for example the SQL to approve. */
|
|
20986
|
+
url: external_exports.string().optional()
|
|
20944
20987
|
});
|
|
20945
20988
|
var AddonRunStatus = external_exports.enum(["todo", "served", "done", "failed", "skipped"]);
|
|
20946
20989
|
var AddonItem = external_exports.object({
|
|
@@ -21115,33 +21158,33 @@ var SITE = "site-<slug>";
|
|
|
21115
21158
|
var SITE_DATA = "dai-<project id>";
|
|
21116
21159
|
var ARCH_NODES = [
|
|
21117
21160
|
// Outside
|
|
21118
|
-
{ id: "browser", kind: "actor", zone: "outside", label: "\u05D3\u05E4\u05D3\u05E4\u05DF", labelEn: "Browser", summary: "\u05DC\u05E7\u05D5\u05D7\u05D5\u05EA \u05D5\u05D0\u05D3\u05DE\u05D9\u05E0\u05D9\u05DD \u05E4\u05D5\u05EA\u05D7\u05D9\u05DD \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8, \
|
|
21161
|
+
{ id: "browser", kind: "actor", zone: "outside", label: "\u05D3\u05E4\u05D3\u05E4\u05DF", labelEn: "Browser", summary: "\u05DC\u05E7\u05D5\u05D7\u05D5\u05EA \u05D5\u05D0\u05D3\u05DE\u05D9\u05E0\u05D9\u05DD \u05E4\u05D5\u05EA\u05D7\u05D9\u05DD \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8, \u05DC\u05D5\u05D7 \u05D4\u05D1\u05E7\u05E8\u05D4 \u05D5\u05D4\u05D0\u05D3\u05DE\u05D9\u05DF.", summaryEn: "Customers and admins open the site, the dashboard and the admin." },
|
|
21119
21162
|
{ id: "cli", kind: "actor", zone: "outside", label: "deployai CLI", summary: "\u05D4\u05E1\u05D5\u05DB\u05DF \u05D0\u05D5 \u05D4\u05DC\u05E7\u05D5\u05D7 \u05DE\u05E8\u05D9\u05E6\u05D9\u05DD check \u05D5\u05BEdeploy, \u05D5\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05D1\u05E7\u05D5\u05D3 \u05DE\u05DB\u05E9\u05D9\u05E8.", summaryEn: "The agent or the customer runs check and deploy, and logs in with a device code.", code: ["packages/cli"], docs: ["docs/07-cli.md"] },
|
|
21120
21163
|
{ id: "board-watcher", kind: "actor", zone: "outside", label: "Board watcher", summary: "\u05E8\u05E5 \u05D0\u05E6\u05DC \u05D4\u05D1\u05E2\u05DC\u05D9\u05DD (pnpm board:watch): \u05DC\u05D5\u05E7\u05D7 \u05DB\u05E8\u05D8\u05D9\u05E1 \u05DE\u05DC\u05D5\u05D7 \u05D4\u05E2\u05D1\u05D5\u05D3\u05D4 (\u05E8\u05E7 \u05DB\u05E9\u05D4\u05DE\u05EA\u05D2 \u05E9\u05DC\u05D5 \u05D1\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05E4\u05D5\u05E2\u05DC), \u05DE\u05E8\u05D9\u05E5 Claude Code \u05DC\u05E7\u05E8\u05D9\u05D0\u05D4 \u05D1\u05DC\u05D1\u05D3 \u05D5\u05DE\u05D7\u05D6\u05D9\u05E8 \u05EA\u05D5\u05DB\u05E0\u05D9\u05EA. \u05DB\u05E8\u05D8\u05D9\u05E1 \u05E2\u05DD \u05D1\u05E0\u05D9\u05D9\u05D4 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA \u05E9\u05D0\u05D5\u05E9\u05E8 \u05E0\u05D1\u05E0\u05D4 \u05D1\u05EA\u05D9\u05E7\u05D9\u05D9\u05EA \u05D4\u05E4\u05E8\u05D5\u05D9\u05E7\u05D8, \u05D0\u05D7\u05D3 \u05D1\u05DB\u05DC \u05E4\u05E2\u05DD. \u05D4\u05D5\u05D0 \u05D2\u05DD \u05DB\u05D5\u05EA\u05D1 \u05D2\u05E8\u05E1\u05D0\u05D5\u05EA \u05D7\u05D3\u05E9\u05D5\u05EA \u05DC\u05E1\u05E4\u05E8\u05D9\u05D9\u05EA \u05D4\u05E4\u05E8\u05D5\u05DE\u05E4\u05D8\u05D9\u05DD \u05DC\u05E4\u05D9 \u05D4\u05E2\u05E8\u05D5\u05EA \u05D4\u05D1\u05E2\u05DC\u05D9\u05DD, \u05DC\u05D1\u05D3\u05D9\u05E7\u05D4 \u05D5\u05E4\u05E8\u05E1\u05D5\u05DD.", summaryEn: "Runs on the owner computer (pnpm board:watch): claims a work board ticket (only while its settings switch is on), runs Claude Code read only and posts a plan back. An approved auto build ticket is built in the project folder, one at a time. It also writes new versions of prompt library prompts from the owner notes, for review and publishing.", code: ["scripts/board-watch.ts", "scripts/prompts-sync.ts"], env: ["BOARD_RUNNER_TOKEN", "BOARD_URL"], decisions: ["D-110", "D-127", "D-182", "D-250"] },
|
|
21121
21164
|
{ id: "visitor", kind: "actor", zone: "outside", label: "\u05DE\u05D1\u05E7\u05E8 \u05D1\u05D0\u05EA\u05E8", labelEn: "Site visitor", summary: "\u05DE\u05D1\u05E7\u05E8 \u05D1\u05D0\u05EA\u05E8 \u05E9\u05DC \u05DC\u05E7\u05D5\u05D7 \u05D1\u05DB\u05EA\u05D5\u05D1\u05EA <slug>.<\u05D3\u05D5\u05DE\u05D9\u05D9\u05DF \u05D0\u05EA\u05E8\u05D9\u05DD> (\u05DB\u05DE\u05D5 deploy-net.com \u05D0\u05D5 freesite.click) \u05D0\u05D5 \u05D1\u05D3\u05D5\u05DE\u05D9\u05D9\u05DF \u05DE\u05E9\u05DC\u05D5.", summaryEn: "A visitor on a customer site at <slug>.<a sites domain> (like deploy-net.com or freesite.click) or on their own domain." },
|
|
21122
21165
|
// Platform
|
|
21123
|
-
{ id: "web", kind: "app", zone: "platform", label: "Web app (Next.js)", summary: "\u05D0\u05EA\u05E8 \u05D4\u05E9\u05D9\u05D5\u05D5\u05E7, \
|
|
21166
|
+
{ id: "web", kind: "app", zone: "platform", label: "Web app (Next.js)", summary: "\u05D0\u05EA\u05E8 \u05D4\u05E9\u05D9\u05D5\u05D5\u05E7, \u05DC\u05D5\u05D7 \u05D4\u05D1\u05E7\u05E8\u05D4, \u05D4\u05D0\u05D3\u05DE\u05D9\u05DF \u05D5\u05D4\u05BEAPI \u05E9\u05DC \u05D4\u05BECLI. \u05DE\u05DB\u05E0\u05D9\u05E1 \u05E2\u05D1\u05D5\u05D3\u05D5\u05EA \u05DC\u05EA\u05D5\u05E8.", summaryEn: "The marketing site, the dashboard, the admin and the CLI API. Puts jobs in the queue.", code: ["apps/web/src/app", "apps/web/src/server"], env: ["DEPLOYAI_SPACE", "BETTER_AUTH_SECRET", "NEXT_PUBLIC_SUPPORT_WHATSAPP", "DEV_SUPERADMIN_PASSWORD", "OPENAI_APPS_CHALLENGE"], portability: "Our app (site, dashboard, API, builds)", docs: ["docs/04-architecture.md"], decisions: ["D-020", "D-057", "D-104", "D-149", "D-238", "D-293"] },
|
|
21124
21167
|
{ id: "queue", kind: "db", zone: "platform", label: "pg-boss queue", summary: "\u05DB\u05DC \u05DE\u05D4 \u05E9\u05D0\u05D9\u05D8\u05D9 \u05D0\u05D5 \u05E0\u05D5\u05D2\u05E2 \u05D1\u05BECloudflare \u05E8\u05E5 \u05DB\u05E2\u05D1\u05D5\u05D3\u05D4 \u05D1\u05EA\u05D5\u05E8.", summaryEn: "Everything slow or that touches Cloudflare runs as a job in the queue.", code: ["apps/web/src/server/queue.ts"], portability: "Job queue", decisions: ["D-058"] },
|
|
21125
21168
|
{ id: "worker", kind: "app", zone: "platform", label: "Job worker", summary: "\u05EA\u05D4\u05DC\u05D9\u05DA \u05E0\u05E4\u05E8\u05D3 \u05E9\u05DE\u05E8\u05D9\u05E5 \u05D0\u05EA \u05D4\u05E2\u05D1\u05D5\u05D3\u05D5\u05EA \u05DE\u05D4\u05EA\u05D5\u05E8: \u05D1\u05E0\u05D9\u05D9\u05D4, \u05D4\u05E2\u05DC\u05D0\u05D4, \u05E0\u05D9\u05EA\u05D5\u05D1, \u05D1\u05D9\u05E7\u05D5\u05E8\u05D9\u05DD, \u05E2\u05DC\u05D5\u05D9\u05D5\u05EA \u05D5\u05DE\u05D9\u05D9\u05DC\u05D9\u05DD \u05DC\u05DE\u05E9\u05E4\u05DA (pnpm worker, \u05D0\u05D5 pnpm worker:public \u05DE\u05D0\u05D7\u05D5\u05E8\u05D9 \u05D4\u05BEtunnel).", summaryEn: "A separate process that runs the queued jobs: build, upload, routing, visits, costs and lifecycle emails (pnpm worker, or pnpm worker:public behind the tunnel).", code: ["apps/web/src/server/worker.ts", "apps/web/src/server/jobs.ts", "apps/web/src/server/site-data.ts", "apps/web/src/server/lifecycle", "apps/web/src/server/host-report.ts"], env: ["BUILD_SLOTS", "LIFECYCLE_NOW", "A11Y_RENDER", "DOCKER_HOST", "HOST_REPORT_PATH"], decisions: ["D-058", "D-148", "D-180", "D-340"] },
|
|
21126
21169
|
{ id: "build", kind: "app", zone: "platform", label: "Build service (Docker)", summary: "\u05E7\u05D5\u05E0\u05D8\u05D9\u05D9\u05E0\u05E8 \u05D7\u05D3\u05E9 \u05DC\u05DB\u05DC \u05E9\u05DC\u05D1, \u05D1\u05DC\u05D9 \u05E1\u05D5\u05D3\u05D5\u05EA. \u05D1\u05D5\u05E0\u05D4 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3 \u05E9\u05DC \u05D4\u05DC\u05E7\u05D5\u05D7 \u05DC\u05E7\u05D5\u05D1\u05E5 Worker.", summaryEn: "A fresh container for every step, with no secrets. Builds the customer's code into a Worker file.", code: ["apps/web/src/server/build.ts"], env: ["BUILD_MODE"] },
|
|
21127
21170
|
{ id: "postgres", kind: "db", zone: "platform", label: "Postgres", summary: "\u05DE\u05E1\u05D3 \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E9\u05DC\u05E0\u05D5: \u05DE\u05E9\u05EA\u05DE\u05E9\u05D9\u05DD, \u05D0\u05EA\u05E8\u05D9\u05DD, \u05D2\u05E8\u05E1\u05D0\u05D5\u05EA, \u05EA\u05E9\u05DC\u05D5\u05DE\u05D9\u05DD, \u05D1\u05D9\u05E7\u05D5\u05E8\u05D9\u05DD \u05D5\u05D9\u05D5\u05DE\u05DF. \u05D1\u05D9\u05D9\u05E6\u05D5\u05E8 \u05D2\u05D9\u05D1\u05D5\u05D9 pg_dump \u05DC\u05D9\u05DC\u05D9 \u05DC\u05D3\u05DC\u05D9 R2 \u05E0\u05E4\u05E8\u05D3 (14 \u05D9\u05D5\u05DE\u05D9\u05D9\u05DD, 4 \u05E9\u05D1\u05D5\u05E2\u05D9\u05D9\u05DD), \u05DE\u05D5\u05E6\u05E4\u05DF \u05D1\u05BEage, \u05D5\u05DE\u05D2\u05D1\u05D9\u05DD \u05D2\u05DD \u05D9\u05D3\u05E0\u05D9\u05EA \u05DE\u05D0\u05D3\u05DE\u05D9\u05DF, \u05E9\u05E8\u05EA, \u05D2\u05D9\u05D1\u05D5\u05D9\u05D9\u05DD.", summaryEn: "Our database: users, sites, versions, payments, visits and the audit log. In production a nightly pg_dump goes to its own R2 bucket (14 daily, 4 weekly), encrypted with age, plus manual copies from Admin, Server, Backups.", code: ["apps/web/src/server/db/schema.ts", "scripts/backup-db.sh", "apps/web/src/server/backups.ts"], env: ["DATABASE_URL", "BACKUP_S3_ACCESS_KEY_ID", "BACKUP_S3_SECRET_ACCESS_KEY", "BACKUP_AGE_RECIPIENT"], portability: "Our database", docs: ["docs/04-architecture.md", "docs/22-go-live.md", "docs/23-server.md"], decisions: ["D-336", "D-340"] },
|
|
21128
|
-
{ id: "files", kind: "storage", zone: "platform", label: "Version files", summary: "\u05D0\u05E8\u05DB\u05D9\u05D5\u05E0\u05D9 \u05DE\u05E7\u05D5\u05E8 \u05D5\u05EA\u05D5\u05E6\u05E8\u05D9 \u05D1\u05E0\u05D9\u05D9\u05D4 \u05E9\u05DC \u05DB\u05DC \u05D2\u05E8\u05E1\u05D4, \u05D3\u05E8\u05DA storage.ts \u05D1\u05DC\u05D1\u05D3. \u05D3\u05DC\u05D9 R2 \u05DC\u05DB\u05DC \u05E1\u05D1\u05D9\u05D1\u05D4, \u05D5\u05E0\u05D9\u05E7\u05D5\u05D9 \u05DC\u05D9\u05DC\u05D9 \u05E9\u05DC \u05E7\u05D1\u05E6\u05D9\u05DD \u05E9\u05D0\u05E3 \u05D2\u05E8\u05E1\u05D4 \u05DC\u05D0 \u05DE\u05E9\u05EA\u05DE\u05E9\u05EA \u05D1\u05D4\u05DD.", summaryEn: "Source archives and build output of every version, through storage.ts only. One R2 bucket per place, and a nightly sweep of files no version uses.", code: ["apps/web/src/server/storage.ts", "apps/web/src/server/storage-sweep.ts"], env: ["STORAGE_DIR", "S3_ACCESS_KEY_ID", "S3_SECRET_ACCESS_KEY"], portability: "Version files (uploads and build output)", docs: ["docs/17-portability.md"], decisions: ["D-095", "D-096", "D-316"] },
|
|
21171
|
+
{ id: "files", kind: "storage", zone: "platform", label: "Version files", summary: "\u05D0\u05E8\u05DB\u05D9\u05D5\u05E0\u05D9 \u05DE\u05E7\u05D5\u05E8 \u05D5\u05EA\u05D5\u05E6\u05E8\u05D9 \u05D1\u05E0\u05D9\u05D9\u05D4 \u05E9\u05DC \u05DB\u05DC \u05D2\u05E8\u05E1\u05D4, \u05D3\u05E8\u05DA storage.ts \u05D1\u05DC\u05D1\u05D3. \u05D3\u05DC\u05D9 R2 \u05DC\u05DB\u05DC \u05E1\u05D1\u05D9\u05D1\u05D4, \u05D5\u05E0\u05D9\u05E7\u05D5\u05D9 \u05DC\u05D9\u05DC\u05D9 \u05E9\u05DC \u05E7\u05D1\u05E6\u05D9\u05DD \u05E9\u05D0\u05E3 \u05D2\u05E8\u05E1\u05D4 \u05DC\u05D0 \u05DE\u05E9\u05EA\u05DE\u05E9\u05EA \u05D1\u05D4\u05DD. \u05D1\u05D9\u05D9\u05E6\u05D5\u05E8 \u05E9\u05D9\u05E7\u05D5\u05E3 \u05DC\u05D9\u05DC\u05D9 \u05DC\u05D3\u05DC\u05D9 \u05D4\u05D2\u05D9\u05D1\u05D5\u05D9\u05D9\u05DD, \u05EA\u05D7\u05EA files/ (D-473).", summaryEn: "Source archives and build output of every version, through storage.ts only. One R2 bucket per place, and a nightly sweep of files no version uses. In prod a nightly mirror into the backups bucket, under files/ (D-473).", code: ["apps/web/src/server/storage.ts", "apps/web/src/server/storage-sweep.ts", "scripts/mirror-files.sh"], env: ["STORAGE_DIR", "S3_ACCESS_KEY_ID", "S3_SECRET_ACCESS_KEY"], portability: "Version files (uploads and build output)", docs: ["docs/17-portability.md"], decisions: ["D-095", "D-096", "D-316", "D-473"] },
|
|
21129
21172
|
// Services
|
|
21130
|
-
{ id: "email-sending", kind: "external", zone: "services", label: "CF Email Sending", summary: "\u05E9\u05DC\u05D9\u05D7\u05EA \u05DE\u05D9\u05D9\u05DC\u05D9\u05DD \u05D3\u05E8\u05DA Cloudflare Email Sending. \u05D1\u05DC\u05D9 \u05D8\u05D5\u05E7\u05DF \u05D4\u05DE\u05D9\u05D9\u05DC \u05DE\u05D5\u05D3\u05E4\u05E1 \u05D1\u05DC\u05D5\u05D2.", summaryEn: "Sends email through Cloudflare Email Sending. Without a token, the email is printed to the log.", code: ["apps/web/src/server/email.ts"],
|
|
21173
|
+
{ id: "email-sending", kind: "external", zone: "services", label: "CF Email Sending", summary: "\u05E9\u05DC\u05D9\u05D7\u05EA \u05DE\u05D9\u05D9\u05DC\u05D9\u05DD \u05D3\u05E8\u05DA Cloudflare Email Sending. \u05D1\u05DC\u05D9 \u05D8\u05D5\u05E7\u05DF \u05D4\u05DE\u05D9\u05D9\u05DC \u05DE\u05D5\u05D3\u05E4\u05E1 \u05D1\u05DC\u05D5\u05D2.", summaryEn: "Sends email through Cloudflare Email Sending. Without a token, the email is printed to the log.", code: ["apps/web/src/server/email.ts"], portability: "Emails" },
|
|
21131
21174
|
{ id: "oauth", kind: "external", zone: "services", label: "Google / GitHub OAuth", summary: "\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05E2\u05DD Google \u05D0\u05D5 GitHub \u05D3\u05E8\u05DA Better Auth.", summaryEn: "Log in with Google or GitHub through Better Auth.", code: ["apps/web/src/server/auth.ts"], env: ["GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET", "GITHUB_CLIENT_ID", "GITHUB_CLIENT_SECRET"], decisions: ["D-020"] },
|
|
21132
|
-
{ id: "payments", kind: "external", zone: "services", label: "Payment provider (Cardcom)", summary: "\u05E7\u05D0\u05E8\u05D3\u05E7\u05D5\u05DD \u05DB\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC, \u05D5\u05E0\u05D1\u05D7\u05E8 \u05D1\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D4\u05D0\u05D3\u05DE\u05D9\u05DF (\u05D0\u05D5 \u05DE\u05D3\u05D5\u05DE\u05D4 \u05DC\u05D1\u05D3\u05D9\u05E7\u05D5\u05EA). \u05D4\u05DB\u05E8\u05D8\u05D9\u05E1 \u05DE\u05D5\u05E7\u05DC\u05D3 \u05D1\u05D3\u05E3 \u05D4\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05E9\u05DC \u05E7\u05D0\u05E8\u05D3\u05E7\u05D5\u05DD \u05D5\u05E0\u05E9\u05DE\u05E8 \u05DB\u05D8\u05D5\u05E7\u05DF \u05DE\u05D5\u05E6\u05E4\u05DF, \u05DB\u05DC \u05D7\u05D9\u05D5\u05D1 \u05E2\u05DD \u05DE\u05E4\u05EA\u05D7 \u05D0\u05D9\u05D3\u05DE\u05E4\u05D5\u05D8\u05E0\u05D8\u05D9\u05D5\u05EA, \u05D5\u05E7\u05D0\u05E8\u05D3\u05E7\u05D5\u05DD \u05DE\u05E4\u05D9\u05E7\u05D4 \u05D7\u05E9\u05D1\u05D5\u05E0\u05D9\u05EA \u05DE\u05E1 \u05DC\u05DB\u05DC \u05D7\u05D9\u05D5\u05D1 \u05D5\u05D7\u05E9\u05D1\u05D5\u05E0\u05D9\u05EA \u05D6\u05D9\u05DB\u05D5\u05D9 \u05DC\u05DB\u05DC \u05D4\u05D7\u05D6\u05E8.", summaryEn: "Cardcom by default, chosen in admin settings (or simulated for tests). The card is typed on the secure Cardcom page and saved as a sealed token, every charge carries an idempotency key, and Cardcom issues a tax invoice per charge and a credit invoice per refund.", code: ["apps/web/src/server/billing/provider.ts", "apps/web/src/server/billing/cardcom.ts", "apps/web/src/server/billing/card-pages.ts", "apps/web/src/app/api/billing/card"], env: ["BILLING_PROVIDER", "BILLING_MOCK_FAIL", "CARDCOM_TERMINAL", "CARDCOM_API_NAME", "CARDCOM_API_PASSWORD", "CARDCOM_INVOICES", "CARDCOM_CSS_URL", "CARDCOM_TOKEN_KEY"], portability: "Payments", decisions: ["D-175", "D-292"] },
|
|
21133
|
-
{ id: "registrar", kind: "external", zone: "services", label: "Domain
|
|
21134
|
-
{ id: "mcp", kind: "external", zone: "services", label: "MCP for AI tools (/api/mcp)", summary: "ChatGPT \u05D5
|
|
21175
|
+
{ id: "payments", kind: "external", zone: "services", label: "Payment provider (Cardcom)", summary: "\u05E7\u05D0\u05E8\u05D3\u05E7\u05D5\u05DD \u05DB\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC, \u05D5\u05E0\u05D1\u05D7\u05E8 \u05D1\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D4\u05D0\u05D3\u05DE\u05D9\u05DF (\u05D0\u05D5 \u05DE\u05D3\u05D5\u05DE\u05D4 \u05DC\u05D1\u05D3\u05D9\u05E7\u05D5\u05EA). \u05D4\u05DB\u05E8\u05D8\u05D9\u05E1 \u05DE\u05D5\u05E7\u05DC\u05D3 \u05D1\u05D3\u05E3 \u05D4\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05E9\u05DC \u05E7\u05D0\u05E8\u05D3\u05E7\u05D5\u05DD \u05D5\u05E0\u05E9\u05DE\u05E8 \u05DB\u05D8\u05D5\u05E7\u05DF \u05DE\u05D5\u05E6\u05E4\u05DF, \u05DB\u05DC \u05D7\u05D9\u05D5\u05D1 \u05E2\u05DD \u05DE\u05E4\u05EA\u05D7 \u05D0\u05D9\u05D3\u05DE\u05E4\u05D5\u05D8\u05E0\u05D8\u05D9\u05D5\u05EA, \u05D5\u05E7\u05D0\u05E8\u05D3\u05E7\u05D5\u05DD \u05DE\u05E4\u05D9\u05E7\u05D4 \u05D7\u05E9\u05D1\u05D5\u05E0\u05D9\u05EA \u05DE\u05E1 \u05DC\u05DB\u05DC \u05D7\u05D9\u05D5\u05D1 \u05D5\u05D7\u05E9\u05D1\u05D5\u05E0\u05D9\u05EA \u05D6\u05D9\u05DB\u05D5\u05D9 \u05DC\u05DB\u05DC \u05D4\u05D7\u05D6\u05E8.", summaryEn: "Cardcom by default, chosen in admin settings (or simulated for tests). The card is typed on the secure Cardcom page and saved as a sealed token, every charge carries an idempotency key, and Cardcom issues a tax invoice per charge and a credit invoice per refund.", code: ["apps/web/src/server/billing/provider.ts", "apps/web/src/server/billing/cardcom.ts", "apps/web/src/server/billing/card-pages.ts", "apps/web/src/app/api/billing/card"], env: ["BILLING_PROVIDER", "BILLING_MOCK_FAIL", "CARDCOM_TERMINAL", "CARDCOM_API_NAME", "CARDCOM_API_PASSWORD", "CARDCOM_INVOICES", "CARDCOM_CSS_URL", "CARDCOM_TOKEN_KEY", "CARDCOM_DEPARTMENT_ID"], portability: "Payments", decisions: ["D-175", "D-292"] },
|
|
21176
|
+
{ id: "registrar", kind: "external", zone: "services", label: "Domain registrars (Cloudflare, LiveDNS)", summary: "\u05E7\u05E0\u05D9\u05D9\u05EA \u05D3\u05D5\u05DE\u05D9\u05D9\u05E0\u05D9\u05DD \u05DC\u05D0\u05EA\u05E8: \u05DB\u05DC \u05E9\u05DD \u05D4\u05D5\u05DC\u05DA \u05DC\u05E8\u05E9\u05DD \u05D4\u05D6\u05D5\u05DC \u05D1\u05D9\u05D5\u05EA\u05E8 \u05E9\u05E4\u05D5\u05E2\u05DC, \u05DB\u05DC \u05E8\u05E9\u05DD \u05D1\u05E2\u05DC\u05D5\u05EA \u05D5\u05D1\u05E2\u05DE\u05DC\u05D4 \u05DE\u05E9\u05DC\u05D5 (Cloudflare \u05D1\u05D3\u05D5\u05DC\u05E8\u05D9\u05DD \u05DC\u05DB\u05DC \u05E9\u05DD, LiveDNS \u05DE\u05E0\u05E7\u05D5\u05D3\u05D5\u05EA \u05E7\u05E8\u05D3\u05D9\u05D8 \u05DC\u05E4\u05D9 \u05D4\u05DE\u05D7\u05D9\u05E8\u05D5\u05DF \u05E9\u05E0\u05E7\u05E8\u05D0 \u05DB\u05DC \u05D9\u05D5\u05DD, \u05D0\u05D5 \u05D9\u05D3\u05E0\u05D9 \u05DE\u05EA\u05D5\u05E8 \u05D4\u05E6\u05D5\u05D5\u05EA), \u05DE\u05D7\u05D9\u05E8 \u05DB\u05DC \u05E1\u05D9\u05D5\u05DE\u05EA \u05E0\u05D1\u05D3\u05E7 \u05DB\u05DC \u05D9\u05D5\u05DD (\u05D5\u05D0\u05E4\u05E9\u05E8 \u05DC\u05DB\u05D1\u05D5\u05EA \u05E1\u05D9\u05D5\u05DE\u05D5\u05EA), \u05E8\u05D9\u05E9\u05D5\u05DD \u05D0\u05D7\u05D3 \u05DC\u05DB\u05DC \u05D4\u05D6\u05DE\u05E0\u05D4, \u05D9\u05D5\u05DE\u05DF \u05E7\u05E8\u05D9\u05D0\u05D5\u05EA \u05DC\u05DB\u05DC \u05D4\u05D6\u05DE\u05E0\u05D4, \u05D5\u05D7\u05D9\u05D3\u05D5\u05E9 \u05E9\u05E0\u05EA\u05D9 \u05D0\u05E6\u05DC \u05D0\u05D5\u05EA\u05D5 \u05E8\u05E9\u05DD. \u05DC\u05D3\u05D5\u05DE\u05D9\u05D9\u05DF \u05E9\u05E0\u05E7\u05E0\u05D4: \u05D3\u05D5\u05D0\u05E8 \u05D3\u05E8\u05DA Cloudflare Email Routing.", summaryEn: "Buying domains for a site: each name goes to the cheapest registrar that is on, each with its own cost and fee (Cloudflare in dollars per name, LiveDNS from credit points priced by its list, read daily, or by hand from the team queue), the price of every extension checked daily (some can be turned off), one registration per order, a call log per order, yearly renewal at the same registrar. For a bought domain: email through Cloudflare Email Routing.", code: ["apps/web/src/server/registrar.ts", "apps/web/src/server/registrar-livedns.ts", "apps/web/src/server/registrar-log.ts", "apps/web/src/server/domain-sales.ts", "apps/web/src/server/domain-extensions.ts", "apps/web/src/server/domain-email.ts", "apps/web/src/server/billing/services.ts"], env: ["CF_REGISTRAR_TOKEN", "LIVEDNS_USER", "LIVEDNS_PASSWORD"], decisions: ["D-299", "D-300", "D-301", "D-458", "D-486", "D-489", "D-491"] },
|
|
21177
|
+
{ id: "mcp", kind: "external", zone: "services", label: "MCP for AI tools (/api/mcp)", summary: "ChatGPT \u05D5\u05BEClaude \u05DE\u05EA\u05D7\u05D1\u05E8\u05D9\u05DD \u05D1\u05DC\u05D9 \u05D8\u05E8\u05DE\u05D9\u05E0\u05DC: OAuth \u05E2\u05DD \u05D0\u05D9\u05E9\u05D5\u05E8 \u05D1\u05D3\u05E4\u05D3\u05E4\u05DF, \u05D5\u05D0\u05D6 \u05DB\u05DC\u05D9\u05DD \u05DC\u05E8\u05E9\u05D9\u05DE\u05EA \u05D4\u05D0\u05EA\u05E8\u05D9\u05DD, \u05D1\u05D3\u05D9\u05E7\u05D4, \u05D4\u05E2\u05DC\u05D0\u05EA \u05D2\u05E8\u05E1\u05D4 \u05DC\u05EA\u05E6\u05D5\u05D2\u05D4 \u05DE\u05E7\u05D3\u05D9\u05DE\u05D4, \u05D4\u05E8\u05E6\u05EA \u05EA\u05D5\u05E1\u05E4\u05D9\u05DD \u05E9\u05D4\u05D0\u05EA\u05E8 \u05E7\u05E0\u05D4 (\u05D4\u05E7\u05E0\u05D9\u05D9\u05D4 \u05E8\u05E7 \u05D1\u05D0\u05EA\u05E8), \u05D5\u05D4\u05E2\u05DC\u05D0\u05D4 \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8 \u05E8\u05E7 \u05E2\u05DD \u05D4\u05E8\u05E9\u05D0\u05D4 \u05D5\u05D0\u05D9\u05E9\u05D5\u05E8.", summaryEn: "ChatGPT and Claude connect without a terminal: OAuth with a browser consent, then tools to list sites, check, upload a version to a preview, run add-ons the site owns (buying stays on the site), and go live only with the permission and a yes.", code: ["apps/web/src/app/api/mcp/route.ts", "apps/web/src/server/mcp-tools.ts", "apps/web/src/server/auth.ts"], decisions: ["D-302"] },
|
|
21135
21178
|
{ id: "npm", kind: "external", zone: "services", label: "npm registry", summary: "\u05DE\u05E4\u05D9\u05E5 \u05D0\u05EA \u05D4\u05BECLI, \u05D5\u05DE\u05DE\u05E0\u05D5 \u05D4\u05D1\u05E0\u05D9\u05D9\u05D4 \u05DE\u05EA\u05E7\u05D9\u05E0\u05D4 \u05EA\u05DC\u05D5\u05D9\u05D5\u05EA.", summaryEn: "Distributes the CLI, and the build installs dependencies from it." },
|
|
21136
|
-
{ id: "pagespeed", kind: "external", zone: "services", label: "Google PageSpeed Insights", summary: "\u05D1\u05D3\u05D9\u05E7\u05D5\u05EA \u05D4\u05DE\u05D4\u05D9\u05E8\u05D5\u05EA, \u05D4\u05E0\u05D2\u05D9\u05E9\u05D5\u05EA \u05D5\u05D4
|
|
21179
|
+
{ id: "pagespeed", kind: "external", zone: "services", label: "Google PageSpeed Insights", summary: "\u05D1\u05D3\u05D9\u05E7\u05D5\u05EA \u05D4\u05DE\u05D4\u05D9\u05E8\u05D5\u05EA, \u05D4\u05E0\u05D2\u05D9\u05E9\u05D5\u05EA \u05D5\u05D4\u05BESEO \u05D4\u05D7\u05D9\u05E0\u05DE\u05D9\u05D5\u05EA: Lighthouse \u05D1\u05DE\u05E2\u05D1\u05D3\u05D4 \u05E9\u05DC \u05D2\u05D5\u05D2\u05DC (\u05DB\u05D5\u05DC\u05DC \u05E1\u05D5\u05DB\u05E0\u05D9 AI) \u05D5\u05E0\u05EA\u05D5\u05E0\u05D9 \u05DE\u05D1\u05E7\u05E8\u05D9\u05DD \u05D0\u05DE\u05D9\u05EA\u05D9\u05D9\u05DD.", summaryEn: "The free speed, accessibility and SEO tests: Lighthouse run at Google (AI agents included) plus real visitor data.", env: ["PAGESPEED_API_KEY"], decisions: ["D-199", "D-222"] },
|
|
21137
21180
|
{ id: "turnstile", kind: "external", zone: "services", label: "CF Turnstile", summary: '\u05D1\u05D3\u05D9\u05E7\u05EA "\u05D4\u05D0\u05DD \u05D0\u05EA\u05DD \u05D1\u05E0\u05D9 \u05D0\u05D3\u05DD" \u05D1\u05D8\u05E4\u05E1\u05D9 \u05D4\u05DB\u05DC\u05D9\u05DD \u05D4\u05D7\u05D9\u05E0\u05DE\u05D9\u05D9\u05DD, \u05D1\u05DC\u05D9 \u05E4\u05D0\u05D6\u05DC\u05D9\u05DD \u05DC\u05E8\u05D5\u05D1 \u05D4\u05DE\u05D1\u05E7\u05E8\u05D9\u05DD.', summaryEn: 'The "are you human" check on the free tool forms, with no puzzle for most visitors.', env: ["TURNSTILE_SITE_KEY", "TURNSTILE_SECRET"], decisions: ["D-199"] },
|
|
21138
21181
|
// Cloudflare
|
|
21139
|
-
{ id: "tunnel", kind: "cf-resource", zone: "cloudflare", label: "Cloudflare Tunnel", summary: "\u05D4\u05D9\u05D5\u05DD \u05D4\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4 \u05E8\u05E6\u05D4 \u05E2\u05DC \u05D4\u05DE\u05D7\u05E9\u05D1 \u05D4\u05D6\u05D4 \u05D5\u05E0\u05D7\u05E9\u05E4\u05EA \u05D3\u05E8\u05DA dev.deployai.co.il (pnpm tunnel, \u05D0\u05D5 \u05D4\u05DB\u05DC \u05D9\u05D7\u05D3 \u05D1\u05BEpnpm dev:public).", summaryEn: "Today the app runs on this computer and is exposed through dev.deployai.co.il (pnpm tunnel, or everything at once with pnpm dev:public).", code: ["scripts/dev-public.ts"], env: ["TUNNEL_ORIGIN_CERT"], decisions: ["D-089", "D-148"] },
|
|
21140
|
-
{ id: "cfapi", kind: "external", zone: "cloudflare", label: "Cloudflare API", summary: "\u05DB\u05DC \u05E4\u05E2\u05D5\u05DC\u05D4 \u05DE\u05D5\u05DC Cloudflare \u05E2\u05D5\u05D1\u05E8\u05EA \u05D1\u05BEREST API \u05E2\u05DD \u05D3\u05DC\u05D9 \u05D8\u05D5\u05E7\u05E0\u05D9\u05DD \u05DE\u05E9\u05D5\u05EA\u05E3. \u05D1\u05DC\u05D9 Wrangler.", summaryEn: "Every Cloudflare action goes through the REST API with a shared token bucket. No Wrangler.", code: ["apps/web/src/server/cloudflare.ts", "scripts/cf-setup.ts"], env: ["CF_API_TOKEN"], docs: ["docs/10-cloudflare-reference.md"], decisions: ["D-007", "D-031", "D-058"] },
|
|
21182
|
+
{ id: "tunnel", kind: "cf-resource", zone: "cloudflare", label: "Cloudflare Tunnel", summary: "\u05D4\u05D9\u05D5\u05DD \u05D4\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4 \u05E8\u05E6\u05D4 \u05E2\u05DC \u05D4\u05DE\u05D7\u05E9\u05D1 \u05D4\u05D6\u05D4 \u05D5\u05E0\u05D7\u05E9\u05E4\u05EA \u05D3\u05E8\u05DA dev.deployai.co.il (pnpm tunnel, \u05D0\u05D5 \u05D4\u05DB\u05D5\u05DC \u05D9\u05D7\u05D3 \u05D1\u05BEpnpm dev:public).", summaryEn: "Today the app runs on this computer and is exposed through dev.deployai.co.il (pnpm tunnel, or everything at once with pnpm dev:public).", code: ["scripts/dev-public.ts"], env: ["TUNNEL_ORIGIN_CERT"], decisions: ["D-089", "D-148"] },
|
|
21183
|
+
{ id: "cfapi", kind: "external", zone: "cloudflare", label: "Cloudflare API", summary: "\u05DB\u05DC \u05E4\u05E2\u05D5\u05DC\u05D4 \u05DE\u05D5\u05DC Cloudflare \u05E2\u05D5\u05D1\u05E8\u05EA \u05D1\u05BEREST API \u05E2\u05DD \u05D3\u05DC\u05D9 \u05D8\u05D5\u05E7\u05E0\u05D9\u05DD \u05DE\u05E9\u05D5\u05EA\u05E3. \u05D1\u05DC\u05D9 Wrangler.", summaryEn: "Every Cloudflare action goes through the REST API with a shared token bucket. No Wrangler.", code: ["apps/web/src/server/cloudflare.ts", "scripts/cf-setup.ts", "apps/web/src/server/admin-geo.ts"], env: ["CF_API_TOKEN", "ADMIN_GEO_MANAGE"], docs: ["docs/10-cloudflare-reference.md"], decisions: ["D-007", "D-031", "D-058", "D-455"] },
|
|
21141
21184
|
{ id: "demos", kind: "worker", zone: "cloudflare", label: "deployai-demos", summary: "\u05D4\u05D3\u05DE\u05D5\u05D0\u05D9\u05DD \u05D1\u05DB\u05EA\u05D5\u05D1\u05D5\u05EA \u05DB\u05DE\u05D5 shop.deploy-net.com, \u05E2\u05DC \u05DB\u05DC \u05D3\u05D5\u05DE\u05D9\u05D9\u05DF \u05D0\u05EA\u05E8\u05D9\u05DD: \u05DE\u05D5\u05E9\u05DA \u05D0\u05EA /demo/<key> \u05DE\u05D4\u05D0\u05EA\u05E8 \u05E9\u05DC\u05E0\u05D5 \u05D5\u05DE\u05E1\u05D9\u05E8 \u05D0\u05EA \u05D4\u05E7\u05D9\u05D3\u05D5\u05DE\u05EA, noindex.", summaryEn: "The demos on hosts like shop.deploy-net.com, on every sites domain: fetches /demo/<key> from our site and strips the prefix, noindex.", code: ["workers/demos/src", "scripts/deploy-demos.ts", "packages/shared/src/demos.ts"], env: ["CHROME_PATH", "SHOTS_BASE"], docs: ["workers/demos/README.md"], decisions: ["D-112", "D-293"] },
|
|
21142
21185
|
{ id: "tools-worker", kind: "worker", zone: "cloudflare", label: "deployai-tools", summary: "\u05DE\u05D5\u05E8\u05D9\u05D3 \u05D0\u05EA \u05D4\u05E2\u05DE\u05D5\u05D3\u05D9\u05DD \u05D5\u05D4\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05E9\u05D4\u05DB\u05DC\u05D9\u05DD \u05D4\u05D7\u05D9\u05E0\u05DE\u05D9\u05D9\u05DD \u05D1\u05D5\u05D3\u05E7\u05D9\u05DD, \u05DB\u05D3\u05D9 \u05E9\u05DB\u05EA\u05D5\u05D1\u05EA \u05E9\u05DE\u05D1\u05E7\u05E8 \u05D4\u05E7\u05DC\u05D9\u05D3 \u05DC\u05D0 \u05EA\u05D9\u05D8\u05E2\u05DF \u05DE\u05D4\u05E9\u05E8\u05EA \u05E9\u05DC\u05E0\u05D5. \u05E8\u05E7 \u05E9\u05DE\u05D5\u05EA \u05E6\u05D9\u05D1\u05D5\u05E8\u05D9\u05D9\u05DD, \u05DB\u05DC \u05EA\u05E9\u05D5\u05D1\u05EA DNS \u05D5\u05DB\u05DC \u05D4\u05E4\u05E0\u05D9\u05D4 \u05E0\u05D1\u05D3\u05E7\u05D5\u05EA.", summaryEn: "Downloads the pages and images the free tools test, so an address a visitor typed is never fetched from our server. Public names only; every DNS answer and redirect is checked.", code: ["workers/tools/src", "scripts/deploy-tools.ts", "packages/shared/src/safe-url.ts"], env: ["TOOLS_FETCH_SECRET"], decisions: ["D-199"] },
|
|
21143
|
-
{ id: "uptime-worker", kind: "worker", zone: "cloudflare", label: "deployai-uptime", summary: "\u05D1\u05D5\u05D3\u05E7 \u05DE\u05D1\u05D7\u05D5\u05E5 \u05DB\u05DC 2 \u05D3\u05E7\u05D5\u05EA \u05E9-/api/health \u05E2\u05D5\u05E0\u05D4, \u05DB\u05D9 \u05E9\u05E8\u05EA \u05E9\u05E0\u05E4\u05DC \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC \u05DC\u05D3\u05D5\u05D5\u05D7 \u05E2\u05DC \u05E2\u05E6\u05DE\u05D5. \u05E9\u05D5\u05DE\u05E8 \u05D0\u05EA \u05D4\u05EA\u05D5\u05E6\u05D0\u05D4 \u05D1
|
|
21144
|
-
{ id: "dispatch", kind: "worker", zone: "cloudflare", label: "deployai-dispatch", summary: 'Worker \u05D0\u05D7\u05D3 \u05E2\u05DC */* \u05E9\u05DE\u05E0\u05EA\u05D1 \u05DB\u05DC \u05DB\u05EA\u05D5\u05D1\u05EA \u05DC\u05D0\u05EA\u05E8, \u05E1\u05D5\u05E4\u05E8 \u05D1\u05D9\u05E7\u05D5\u05E8\u05D9\u05DD, \u05DE\u05D2\u05D1\u05D9\u05DC \u05E7\u05E6\u05D1 \u05D5\u05DE\u05D5\u05E1\u05D9\u05E3 \u05D0\u05EA \u05D4\u05EA\u05D2 "\u05D1\u05D0\u05D5\u05D5\u05D9\u05E8 \u05E2\u05DD DeployAI" \u05DC\u05D0\u05EA\u05E8\u05D9\u05DD \u05E9\u05D1\u05D7\u05D1\u05D9\u05DC\u05D4 \u05E9\u05DC\u05D4\u05DD \u05D9\u05E9 \u05EA\u05D2, \u05D0\u05E3 \u05E4\u05E2\u05DD \u05DC\u05D0 \u05DC\u05D0\u05EA\u05E8 \u05D6\u05DE\u05E0\u05D9.', summaryEn: 'One Worker on */* that routes every address to its site, counts visits, limits the rate and adds the "Live with DeployAI" badge to sites whose plan has the badge, never to a temporary site.', code: ["workers/dispatch/src", "scripts/deploy-dispatch.ts"], env: ["DISPATCH_RATE_LIMIT_PERIOD"], docs: ["workers/dispatch/README.md"], decisions: ["D-087", "D-113", "D-179", "D-238", "D-245"] },
|
|
21186
|
+
{ id: "uptime-worker", kind: "worker", zone: "cloudflare", label: "deployai-uptime", summary: "\u05D1\u05D5\u05D3\u05E7 \u05DE\u05D1\u05D7\u05D5\u05E5 \u05DB\u05DC 2 \u05D3\u05E7\u05D5\u05EA \u05E9-/api/health \u05E2\u05D5\u05E0\u05D4, \u05DB\u05D9 \u05E9\u05E8\u05EA \u05E9\u05E0\u05E4\u05DC \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC \u05DC\u05D3\u05D5\u05D5\u05D7 \u05E2\u05DC \u05E2\u05E6\u05DE\u05D5. \u05E9\u05D5\u05DE\u05E8 \u05D0\u05EA \u05D4\u05EA\u05D5\u05E6\u05D0\u05D4 \u05D1\u05BEKV, \u05D5\u05E9\u05EA\u05D9 \u05E0\u05E4\u05D9\u05DC\u05D5\u05EA \u05D1\u05E8\u05E6\u05E3 \u05E9\u05D5\u05DC\u05D7\u05D5\u05EA \u05DE\u05D9\u05D9\u05DC \u05DC\u05E6\u05D5\u05D5\u05EA.", summaryEn: "Checks from outside every 2 minutes that /api/health answers, because a server that is down cannot report itself. Keeps the result in KV; two failures in a row email the team.", code: ["workers/uptime/src", "scripts/deploy-uptime.ts", "apps/web/src/app/api/health/route.ts"], env: ["UPTIME_ALERT_TO", "UPTIME_ALERT_TOKEN"], decisions: ["D-331"] },
|
|
21187
|
+
{ id: "dispatch", kind: "worker", zone: "cloudflare", label: "deployai-dispatch", summary: 'Worker \u05D0\u05D7\u05D3 \u05E2\u05DC */* \u05E9\u05DE\u05E0\u05EA\u05D1 \u05DB\u05DC \u05DB\u05EA\u05D5\u05D1\u05EA \u05DC\u05D0\u05EA\u05E8, \u05E1\u05D5\u05E4\u05E8 \u05D1\u05D9\u05E7\u05D5\u05E8\u05D9\u05DD, \u05DE\u05D2\u05D1\u05D9\u05DC \u05E7\u05E6\u05D1 \u05D5\u05DE\u05D5\u05E1\u05D9\u05E3 \u05D0\u05EA \u05D4\u05EA\u05D2 "\u05D1\u05D0\u05D5\u05D5\u05D9\u05E8 \u05E2\u05DD DeployAI" \u05DC\u05D0\u05EA\u05E8\u05D9\u05DD \u05E9\u05D1\u05D7\u05D1\u05D9\u05DC\u05D4 \u05E9\u05DC\u05D4\u05DD \u05D9\u05E9 \u05EA\u05D2, \u05D0\u05E3 \u05E4\u05E2\u05DD \u05DC\u05D0 \u05DC\u05D0\u05EA\u05E8 \u05D6\u05DE\u05E0\u05D9.', summaryEn: 'One Worker on */* that routes every address to its site, counts visits, limits the rate and adds the "Live with DeployAI" badge to sites whose plan has the badge, never to a temporary site.', code: ["workers/dispatch/src", "scripts/deploy-dispatch.ts"], env: ["DISPATCH_RATE_LIMIT_PERIOD", "PROBE_SECRET"], docs: ["workers/dispatch/README.md"], decisions: ["D-087", "D-113", "D-179", "D-238", "D-245", "D-528"] },
|
|
21145
21188
|
// Customer sites
|
|
21146
21189
|
{ id: "site", kind: "worker", zone: "customer", label: SITE, summary: "\u05D4\u05D0\u05EA\u05E8 \u05E9\u05DC \u05D4\u05DC\u05E7\u05D5\u05D7: Worker \u05DC\u05DB\u05DC \u05D0\u05EA\u05E8, \u05E2\u05DD \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD \u05D5\u05D4\u05E7\u05D5\u05D3 \u05E9\u05DC\u05D5.", summaryEn: "The customer's site: a Worker per site, with its files and code.", portability: "Customer sites", decisions: ["D-113", "D-245"] },
|
|
21147
21190
|
{ id: "site-d1", kind: "db", zone: "customer", label: `D1 ${SITE_DATA}`, summary: "\u05DE\u05E1\u05D3 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DC\u05DB\u05DC \u05D0\u05EA\u05E8, \u05E0\u05D5\u05E6\u05E8 \u05E4\u05E2\u05DD \u05D0\u05D7\u05EA \u05D5\u05DE\u05D7\u05D5\u05D1\u05E8 \u05D1\u05DB\u05DC \u05D4\u05E2\u05DC\u05D0\u05D4.", summaryEn: "A database per site, created once and bound on every upload.", code: ["apps/web/src/server/site-data.ts"], portability: "Customer site data", decisions: ["D-076"] },
|
|
@@ -21210,7 +21253,7 @@ var ARCH_FLOWS = [
|
|
|
21210
21253
|
labelEn: "Site visit",
|
|
21211
21254
|
steps: [
|
|
21212
21255
|
{ edge: "visitor-dispatch", text: "\u05DB\u05DC \u05DB\u05EA\u05D5\u05D1\u05EA \u05DE\u05D2\u05D9\u05E2\u05D4 \u05DC\u05BEdispatch Worker.", textEn: "Every address reaches the dispatch Worker." },
|
|
21213
|
-
{ edge: dispatchEdgeId("ROUTES"), text: "\u05D4\u05DB\u05EA\u05D5\u05D1\u05EA \u05DE\u05DE\u05D5\u05E4\u05D4 \u05DC\u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 (\u05EA\u05EA \u05D3\u05D5\u05DE\u05D9\u05D9\u05DF \u05D1\u05DC\u05D9 \u05E7\u05E8\u05D9\u05D0\u05D4, \u05D3\u05D5\u05DE\u05D9\u05D9\u05DF \u05E9\u05DC \u05DC\u05E7\u05D5\u05D7 \u05D1\u05BEhost:), \u05D5\u05E0\u05E7\u05E8\u05D0\u05EA \u05E8\u05E9\u05D5\u05DE\u05EA \u05D4\u05D0\u05EA\u05E8 site:: \u05DE\u05E1\u05DC\u05D5\u05DC, \u05DE\u05E2\u05D1\u05D3, \u05EA\u05D2, \u05DE\u05D9 \u05E8\u05E9\u05D0\u05D9 \u05DC\u05D4\u05D9\u05DB\u05E0\u05E1
|
|
21256
|
+
{ edge: dispatchEdgeId("ROUTES"), text: "\u05D4\u05DB\u05EA\u05D5\u05D1\u05EA \u05DE\u05DE\u05D5\u05E4\u05D4 \u05DC\u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 (\u05EA\u05EA \u05D3\u05D5\u05DE\u05D9\u05D9\u05DF \u05D1\u05DC\u05D9 \u05E7\u05E8\u05D9\u05D0\u05D4, \u05D3\u05D5\u05DE\u05D9\u05D9\u05DF \u05E9\u05DC \u05DC\u05E7\u05D5\u05D7 \u05D1\u05BEhost:), \u05D5\u05E0\u05E7\u05E8\u05D0\u05EA \u05E8\u05E9\u05D5\u05DE\u05EA \u05D4\u05D0\u05EA\u05E8 site:: \u05DE\u05E1\u05DC\u05D5\u05DC, \u05DE\u05E2\u05D1\u05D3, \u05EA\u05D2, \u05DE\u05D9 \u05E8\u05E9\u05D0\u05D9 \u05DC\u05D4\u05D9\u05DB\u05E0\u05E1 \u05D5\u05DB\u05D1\u05D5\u05D9. \u05E0\u05E9\u05DE\u05E8\u05EA \u05D1\u05D6\u05D9\u05DB\u05E8\u05D5\u05DF \u05D3\u05E7\u05D4 (D-249).", textEn: "The address is mapped to a script (our subdomain without a read, a customer domain by host:), and the site record site: is read: tier, CPU, badge, who may come in and off. Kept a minute in memory (D-249)." },
|
|
21214
21257
|
{ edge: dispatchEdgeId("RATE_FREE"), text: "\u05D1\u05D3\u05D9\u05E7\u05EA \u05E7\u05E6\u05D1 \u05DC\u05E4\u05D9 IP \u05D5\u05D0\u05EA\u05E8, \u05D1\u05DE\u05D2\u05D1\u05DC\u05D4 \u05E9\u05DC \u05D4\u05DE\u05E1\u05DC\u05D5\u05DC (\u05D6\u05DE\u05E0\u05D9, \u05D7\u05D9\u05E0\u05DE\u05D9 \u05D0\u05D5 \u05D1\u05EA\u05E9\u05DC\u05D5\u05DD).", textEn: "Rate check by IP and site, with the tier limit (temporary, free or paid)." },
|
|
21215
21258
|
{ edge: dispatchEdgeId("DISPATCHER"), text: "\u05D4\u05D1\u05E7\u05E9\u05D4 \u05E2\u05D5\u05D1\u05E8\u05EA \u05DC\u05BEnamespace.", textEn: "The request goes to the namespace." },
|
|
21216
21259
|
{ edge: "dispatcher-site", text: "\u05D4\u05BEWorker \u05E9\u05DC \u05D4\u05D0\u05EA\u05E8 \u05E2\u05D5\u05E0\u05D4.", textEn: "The site's Worker answers." },
|
|
@@ -21223,12 +21266,12 @@ var ARCH_FLOWS = [
|
|
|
21223
21266
|
label: "\u05DB\u05D9\u05D1\u05D5\u05D9 \u05D0\u05EA\u05E8",
|
|
21224
21267
|
labelEn: "Turn a site off",
|
|
21225
21268
|
steps: [
|
|
21226
|
-
{ edge: "browser-tunnel", text: '\u05D4\u05D1\u05E2\u05DC\u05D9\u05DD \u05DC\u05D5\u05D7\u05E5 "\u05DB\u05D1\u05D4" \u05D1\
|
|
21269
|
+
{ edge: "browser-tunnel", text: '\u05D4\u05D1\u05E2\u05DC\u05D9\u05DD \u05DC\u05D5\u05D7\u05E5 "\u05DB\u05D1\u05D4" \u05D1\u05DC\u05D5\u05D7 \u05D4\u05D1\u05E7\u05E8\u05D4.', textEn: 'The owner clicks "Turn off" in the dashboard.' },
|
|
21227
21270
|
{ edge: "tunnel-web", text: "\u05D4\u05D1\u05E7\u05E9\u05D4 \u05DE\u05D2\u05D9\u05E2\u05D4 \u05DC\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4.", textEn: "The request reaches the app." },
|
|
21228
21271
|
{ edge: "web-queue", text: "\u05E2\u05D1\u05D5\u05D3\u05EA site-toggle \u05D1\u05E2\u05D3\u05D9\u05E4\u05D5\u05EA \u05D3\u05D7\u05D5\u05E4\u05D4.", textEn: "A site-toggle job with urgent priority." },
|
|
21229
21272
|
{ edge: "queue-worker", text: "\u05D4\u05BEworker \u05DE\u05E8\u05D9\u05E5 \u05D0\u05D5\u05EA\u05D4.", textEn: "The worker runs it." },
|
|
21230
21273
|
{ edge: "worker-cfapi", text: "\u05E4\u05E0\u05D9\u05D9\u05D4 \u05DC\u05BECloudflare API.", textEn: "A call to the Cloudflare API." },
|
|
21231
|
-
{ edge: "cfapi-kv", text: '\u05E8\u05E9\u05D5\u05DE\u05EA \u05D4\u05D0\u05EA\u05E8 site: \u05D1\u05BEKV \u05E0\u05DB\u05EA\u05D1\u05EA \u05DE\u05D7\u05D3\u05E9 \u05E2\u05DD \u05DB\u05D1\u05D5\u05D9
|
|
21274
|
+
{ edge: "cfapi-kv", text: '\u05E8\u05E9\u05D5\u05DE\u05EA \u05D4\u05D0\u05EA\u05E8 site: \u05D1\u05BEKV \u05E0\u05DB\u05EA\u05D1\u05EA \u05DE\u05D7\u05D3\u05E9 \u05E2\u05DD \u05DB\u05D1\u05D5\u05D9, \u05D5\u05DE\u05D2\u05D9\u05E2\u05D4 \u05DC\u05DE\u05D1\u05E7\u05E8\u05D9\u05DD \u05EA\u05D5\u05DA \u05D3\u05E7\u05D4 (D-249). \u05D4\u05BEdispatch Worker \u05E2\u05D5\u05E0\u05D4 \u05D1\u05E2\u05DE\u05D5\u05D3 "\u05D4\u05D0\u05EA\u05E8 \u05DC\u05D0 \u05D6\u05DE\u05D9\u05DF" \u05D1\u05E9\u05E4\u05EA \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05E9\u05DC \u05D4\u05DE\u05D1\u05E7\u05E8 (D-413), \u05E2\u05DD \u05D4\u05DC\u05D5\u05D2\u05D5 \u05D5\u05E7\u05D9\u05E9\u05D5\u05E8 \u05DC\u05BEDeployAI (D-178).', textEn: 'The site record site: in KV is written again with off, and reaches visitors within a minute (D-249). The dispatch Worker answers the "site unavailable" page in the browser language of the visitor (D-413), with the logo and a link to DeployAI (D-178).' }
|
|
21232
21275
|
]
|
|
21233
21276
|
},
|
|
21234
21277
|
{
|
|
@@ -21251,7 +21294,7 @@ var ARCH_FLOWS = [
|
|
|
21251
21294
|
{ edge: "queue-worker", text: "\u05E2\u05D1\u05D5\u05D3\u05D5\u05EA visits-collect \u05D5\u05BEusage-collect \u05E8\u05E6\u05D5\u05EA \u05E4\u05E2\u05DD \u05D1\u05D9\u05D5\u05DD.", textEn: "The visits-collect and usage-collect jobs run once a day." },
|
|
21252
21295
|
{ edge: "worker-visits", text: "\u05D1\u05D9\u05E7\u05D5\u05E8\u05D9\u05DD \u05DE\u05BEAnalytics Engine SQL.", textEn: "Visits from Analytics Engine SQL." },
|
|
21253
21296
|
{ edge: "worker-cfapi", text: "\u05E9\u05D9\u05DE\u05D5\u05E9 \u05D5\u05E2\u05DC\u05D5\u05EA \u05DC\u05DB\u05DC Worker \u05DE\u05BECloudflare.", textEn: "Usage and cost per Worker from Cloudflare." },
|
|
21254
|
-
{ edge: "worker-postgres", text: "\u05E0\u05E9\u05DE\u05E8 \u05D1\u05BEvisits_daily \u05D5\u05BEusage_daily \u05DC\
|
|
21297
|
+
{ edge: "worker-postgres", text: "\u05E0\u05E9\u05DE\u05E8 \u05D1\u05BEvisits_daily \u05D5\u05BEusage_daily \u05DC\u05DC\u05D5\u05D7 \u05D4\u05D1\u05E7\u05E8\u05D4 \u05D5\u05DC\u05D0\u05D3\u05DE\u05D9\u05DF.", textEn: "Saved in visits_daily and usage_daily for the dashboard and the admin." },
|
|
21255
21298
|
{ edge: "worker-cfapi", text: "\u05E2\u05D1\u05D5\u05D3\u05EA cf-billing \u05DE\u05D1\u05D9\u05D0\u05D4 \u05D0\u05EA \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF \u05D4\u05D0\u05DE\u05D9\u05EA\u05D9 (\u05DE\u05E1\u05DC\u05D5\u05DC\u05D9\u05DD \u05D5\u05E9\u05D9\u05DE\u05D5\u05E9 \u05DC\u05E4\u05D9 \u05E9\u05D9\u05E8\u05D5\u05EA) \u05DE\u05BEBilling API, \u05DC\u05D9\u05D3 \u05D4\u05D4\u05E2\u05E8\u05DB\u05D4 \u05E9\u05DC\u05E0\u05D5 (D-281).", textEn: "The cf-billing job reads the real bill (plans and usage per service) from the Billing APIs, next to our estimate (D-281)." },
|
|
21256
21299
|
{ edge: "worker-cfapi", text: "\u05E2\u05D1\u05D5\u05D3\u05EA cf-caps \u05E1\u05D5\u05E4\u05E8\u05EA \u05D0\u05EA \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF \u05DE\u05D5\u05DC \u05D4\u05DE\u05D2\u05D1\u05DC\u05D5\u05EA \u05E9\u05DC Cloudflare (\u05DB\u05EA\u05D5\u05D1\u05D5\u05EA \u05DE\u05D5\u05EA\u05D0\u05DE\u05D5\u05EA, D1, R2, \u05E1\u05E7\u05E8\u05D9\u05E4\u05D8\u05D9\u05DD) \u05D5\u05DE\u05D5\u05E6\u05D0\u05EA \u05E9\u05D0\u05E8\u05D9\u05D5\u05EA, \u05D1\u05DB\u05DE\u05D4 \u05E7\u05E8\u05D9\u05D0\u05D5\u05EA \u05E7\u05E8\u05D9\u05D0\u05D4 \u05D1\u05DC\u05D1\u05D3 (D-283).", textEn: "The cf-caps job counts the account against Cloudflare's limits (custom hostnames, D1, R2, scripts) and finds leftovers, in a few read only calls (D-283)." },
|
|
21257
21300
|
{ edge: "worker-postgres", text: "\u05DB\u05DC \u05E7\u05E8\u05D9\u05D0\u05D4 \u05DC\u05BECloudflare \u05E0\u05E1\u05E4\u05E8\u05EA \u05DC\u05E4\u05D9 \u05D3\u05E7\u05D4 \u05D1\u05BEcf_api_minutes, \u05DE\u05D5\u05DC 1,200 \u05E7\u05E8\u05D9\u05D0\u05D5\u05EA \u05D5\u05BE320 \u05E9\u05D0\u05D9\u05DC\u05EA\u05D5\u05EA GraphQL \u05D1\u05BE5 \u05D3\u05E7\u05D5\u05EA (D-283).", textEn: "Every Cloudflare call is counted per minute in cf_api_minutes, against 1,200 calls and 320 GraphQL queries per 5 minutes (D-283)." }
|
|
@@ -21261,8 +21304,8 @@ var ARCH_FLOWS = [
|
|
|
21261
21304
|
|
|
21262
21305
|
// ../shared/src/cost-model.ts
|
|
21263
21306
|
var DEFAULT_FLEET = {
|
|
21264
|
-
mix: { basic: 0.65, business: 0.3,
|
|
21265
|
-
sitesPerAccount: { free: 1, basic: 1, business: 2,
|
|
21307
|
+
mix: { basic: 0.65, business: 0.3, agency: 0.05 },
|
|
21308
|
+
sitesPerAccount: { free: 1, basic: 1, business: 2, agency: 6 },
|
|
21266
21309
|
freeProfile: "quiet",
|
|
21267
21310
|
paidProfile: "typical",
|
|
21268
21311
|
ownDomainShare: 0.6,
|
|
@@ -21283,12 +21326,10 @@ var PLAN_FEATURES = [
|
|
|
21283
21326
|
{ key: "ssl" },
|
|
21284
21327
|
{ key: "analytics", limit: "analyticsDays" },
|
|
21285
21328
|
{ key: "data", limit: "maxDataMb" },
|
|
21286
|
-
{ key: "
|
|
21329
|
+
{ key: "pageViews", limit: "maxPageViewsMonth" },
|
|
21287
21330
|
{ key: "deploys", limit: "maxDeploysDay" },
|
|
21288
|
-
{ key: "buildMinutes", limit: "maxBuildMinutesMonth" },
|
|
21289
21331
|
{ key: "emails", limit: "maxEmailsMonth" },
|
|
21290
21332
|
{ key: "versions", limit: "maxVersionsMb" },
|
|
21291
|
-
{ key: "invitedUsers", limit: "maxInvitedUsers" },
|
|
21292
21333
|
{ key: "helpDeploys" },
|
|
21293
21334
|
{ key: "helpEmail" },
|
|
21294
21335
|
{ key: "whatsapp", soon: true }
|
|
@@ -21304,11 +21345,12 @@ var LOGIN = { cmd: "npx deployai@latest login", say: "The owner approves it in t
|
|
|
21304
21345
|
var STATUS = { cmd: "npx deployai@latest status", say: "Run it until the new version is ready, then send the owner the preview address." };
|
|
21305
21346
|
var PROMOTE = { cmd: "npx deployai@latest promote v<N>", say: "Only after the owner approves the preview. N is the version number deploy printed. Then give the owner the live address." };
|
|
21306
21347
|
var DEPLOY_SAY = "It builds a preview first. Write the -m message in a few words in the language of the owner, about what they see changed.";
|
|
21348
|
+
var BUILD = { say: "This folder had no site, so start wrote a starter page. Do not ask where the site comes from or which way to start: build a first version of the owner's site in its place now. Use what you know (the instructions above, .deployai/brief.md if it exists, the folder name) and choose the layout, colors and wording yourself. Ask at most one short question, and only if you cannot tell what the site is for. Leave out what you do not know (phone, prices, hours) instead of asking for it. Then show it to the owner and offer to add those details. Run check only after that." };
|
|
21307
21349
|
var PULL = { cmd: "npx deployai@latest pull", say: "This folder was empty, so it downloads the code of the live site first. Work on that code." };
|
|
21308
21350
|
function startSteps(kind, opts = {}) {
|
|
21309
21351
|
switch (kind) {
|
|
21310
21352
|
case "new":
|
|
21311
|
-
return [CHECK, ASK, LOGIN, { cmd: 'npx deployai@latest deploy -m "first version"', say: DEPLOY_SAY }, STATUS, PROMOTE];
|
|
21353
|
+
return [...opts.starter ? [BUILD] : [], CHECK, ASK, LOGIN, { cmd: 'npx deployai@latest deploy -m "first version"', say: DEPLOY_SAY }, STATUS, PROMOTE];
|
|
21312
21354
|
case "update": {
|
|
21313
21355
|
const deploy = { cmd: 'npx deployai@latest deploy -m "<what changed, in a few words>"', say: DEPLOY_SAY };
|
|
21314
21356
|
return opts.emptyFolder ? [LOGIN, PULL, CHECK, ASK, deploy, STATUS, PROMOTE] : [CHECK, ASK, LOGIN, deploy, STATUS, PROMOTE];
|
|
@@ -21325,7 +21367,8 @@ function startSteps(kind, opts = {}) {
|
|
|
21325
21367
|
];
|
|
21326
21368
|
case "guest":
|
|
21327
21369
|
return [
|
|
21328
|
-
|
|
21370
|
+
...opts.starter ? [BUILD] : [],
|
|
21371
|
+
{ ...CHECK, say: "Fix every blocker it lists, then run it again until it shows none. If the site needs environment variables, secrets, file storage or sending email, never stop building for it: tell the owner once, in one plain line, that putting those parts live needs a free account (one link, about a minute), keep building what they asked, and ask about the account only at the deploy step." },
|
|
21329
21372
|
ASK,
|
|
21330
21373
|
{ cmd: "npx deployai@latest deploy --guest", say: "It prints the address, the claim link and any owner keys." },
|
|
21331
21374
|
{ say: "The site goes live about a minute later: wait, then open the address to see it is live before you tell the owner." },
|
|
@@ -21334,6 +21377,8 @@ function startSteps(kind, opts = {}) {
|
|
|
21334
21377
|
];
|
|
21335
21378
|
}
|
|
21336
21379
|
}
|
|
21380
|
+
var allowCommandsUrl = (lang = "he") => `${HELP_ORIGIN}${lang === "he" ? "" : "/en"}/connect-ai#allow`;
|
|
21381
|
+
var runCommandsRule = (lang = "he") => `Run every npx deployai@latest command yourself. If your tool asks before it runs one, ask the owner one short yes or no question that names the command, for example "Run npx deployai@latest check? (yes or no)", and run it when they say yes. Never ask the owner to copy, paste or type a command. Never change your tool's own settings to allow it. If it is still blocked after their yes, tell them in plain words and send them ${allowCommandsUrl(lang)}, which shows them the one setting that allows it.`;
|
|
21337
21382
|
var START_FAIL_LINE = "If anything fails, tell the owner in plain words what happened and what you will do next.";
|
|
21338
21383
|
|
|
21339
21384
|
// ../shared/src/cli-map.ts
|
|
@@ -21349,10 +21394,10 @@ var CLI_MAP_NODES = [
|
|
|
21349
21394
|
n("cmd-start", "cli", "start <id>", "\u05DE\u05DB\u05D9\u05DF \u05D0\u05EA \u05D4\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05DC\u05E4\u05D9 \u05DB\u05DC \u05D4\u05D1\u05D7\u05D9\u05E8\u05D5\u05EA: \u05EA\u05D9\u05E7\u05D9\u05D9\u05D4, \u05D3\u05D5\u05D2\u05DE\u05D4 \u05D5\u05D4\u05EA\u05E7\u05E0\u05D4, \u05E7\u05D5\u05D1\u05E5 \u05D4\u05E4\u05E8\u05D8\u05D9\u05DD \u05D5\u05D7\u05D9\u05D1\u05D5\u05E8 \u05DC\u05D0\u05EA\u05E8. \u05DE\u05D3\u05E4\u05D9\u05E1 \u05DC\u05E1\u05D5\u05DB\u05DF \u05D0\u05EA \u05D4\u05D8\u05E7\u05E1\u05D8 \u05D5\u05D0\u05EA \u05D4\u05E4\u05E7\u05D5\u05D3\u05D5\u05EA.", "Prepares the folder with every choice: folder, sample and install, the details file and the site link. Prints the text and the commands for the agent."),
|
|
21350
21395
|
n("cmd-samples", "cli", "samples [key]", "\u05E8\u05E9\u05D9\u05DE\u05EA \u05D4\u05D3\u05D5\u05D2\u05DE\u05D0\u05D5\u05EA, \u05D0\u05D5 \u05D4\u05D5\u05E8\u05D3\u05D4 \u05E9\u05DC \u05D0\u05D7\u05EA.", "Lists the samples, or downloads one."),
|
|
21351
21396
|
n("cmd-check", "cli", "check", "\u05D4\u05D0\u05DD \u05D4\u05E4\u05E8\u05D5\u05D9\u05E7\u05D8 \u05D9\u05DB\u05D5\u05DC \u05DC\u05E8\u05D5\u05E5 \u05D0\u05E6\u05DC\u05E0\u05D5: \u05D7\u05D5\u05E1\u05DE\u05D9\u05DD \u05D5\u05D0\u05D6\u05D4\u05E8\u05D5\u05EA, \u05E2\u05DD \u05E4\u05E8\u05D5\u05DE\u05E4\u05D8 \u05EA\u05D9\u05E7\u05D5\u05DF.", "Can the project run on our hosting: blockers and warnings, with a fix prompt."),
|
|
21352
|
-
n("cmd-init", "cli", "init", "\u05D9\u05D5\u05E6\u05E8 DEPLOYAI.md \u05D5 .deployai/project.json.", "Creates DEPLOYAI.md and .deployai/project.json."),
|
|
21397
|
+
n("cmd-init", "cli", "init", "\u05D9\u05D5\u05E6\u05E8 DEPLOYAI.md \u05E2\u05DD \u05D4\u05DB\u05DC\u05DC\u05D9\u05DD \u05DC\u05E1\u05D5\u05DB\u05DF, \u05E9\u05D5\u05E8\u05D4 \u05D0\u05DC\u05D9\u05D5 \u05D1 AGENTS.md \u05D5 CLAUDE.md, \u05D5 .deployai/project.json. \u05E8\u05D0\u05E9\u05D5\u05DF \u05D1\u05E4\u05E8\u05D5\u05D9\u05E7\u05D8 \u05D7\u05D3\u05E9.", "Creates DEPLOYAI.md with the agent rules, a line to it in AGENTS.md and CLAUDE.md, and .deployai/project.json. First in a new project."),
|
|
21353
21398
|
n("cmd-inspect", "cli", "inspect", "\u05DE\u05D4 \u05D6\u05D5\u05D4\u05D4 \u05D1\u05E4\u05E8\u05D5\u05D9\u05E7\u05D8: \u05DE\u05E1\u05D2\u05E8\u05EA, \u05E9\u05E4\u05D4, \u05DE\u05E1\u05D3 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD.", "What the project is: framework, language, database."),
|
|
21354
21399
|
n("cmd-login", "cli", "login", "\u05DB\u05E0\u05D9\u05E1\u05D4 \u05D1\u05D3\u05E4\u05D3\u05E4\u05DF, \u05D1\u05E2\u05DC \u05D4\u05D0\u05EA\u05E8 \u05DE\u05D0\u05E9\u05E8.", "Login in the browser, the owner approves."),
|
|
21355
|
-
n("cmd-logout", "cli", "logout", "\
|
|
21400
|
+
n("cmd-logout", "cli", "logout", "\u05DE\u05D1\u05D8\u05DC \u05D0\u05EA \u05D4\u05D8\u05D5\u05E7\u05DF \u05D5\u05D9\u05D5\u05E6\u05D0 \u05DE\u05D4\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05DE\u05D7\u05E9\u05D1 \u05D4\u05D6\u05D4.", "Cancels the token and logs out on this computer."),
|
|
21356
21401
|
n("cmd-whoami", "cli", "whoami", "\u05E2\u05DD \u05D0\u05D9\u05D6\u05D4 \u05D7\u05E9\u05D1\u05D5\u05DF \u05DE\u05D7\u05D5\u05D1\u05E8\u05D9\u05DD.", "Which account is logged in."),
|
|
21357
21402
|
n("cmd-link", "cli", "link [site]", "\u05DE\u05D7\u05D1\u05E8 \u05D0\u05EA \u05D4\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05DC\u05D0\u05EA\u05E8, \u05D0\u05D5 \u05D9\u05D5\u05E6\u05E8 \u05D0\u05EA\u05E8 \u05E2\u05DD --create.", "Links the folder to a site, or makes one with --create."),
|
|
21358
21403
|
n("cmd-deploy", "cli", "deploy -m", "\u05D1\u05D5\u05D3\u05E7, \u05D0\u05D5\u05E8\u05D6 \u05D5\u05DE\u05E2\u05DC\u05D4 \u05D2\u05E8\u05E1\u05D4 \u05DC\u05EA\u05E6\u05D5\u05D2\u05D4 \u05DE\u05E7\u05D3\u05D9\u05DE\u05D4.", "Checks, packs and uploads a version to a preview."),
|
|
@@ -21363,7 +21408,7 @@ var CLI_MAP_NODES = [
|
|
|
21363
21408
|
n("cmd-promote", "cli", "promote v<N>", "\u05DE\u05E2\u05DC\u05D4 \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8 \u05D2\u05E8\u05E1\u05D4 \u05E9\u05D0\u05D5\u05E9\u05E8\u05D4.", "Puts an approved version live."),
|
|
21364
21409
|
n("cmd-versions", "cli", "versions", "\u05E8\u05E9\u05D9\u05DE\u05EA \u05D4\u05D2\u05E8\u05E1\u05D0\u05D5\u05EA \u05E9\u05DC \u05D4\u05D0\u05EA\u05E8.", "The site's versions."),
|
|
21365
21410
|
n("cmd-rollback", "cli", "rollback v<N>", "\u05D7\u05D5\u05D6\u05E8 \u05DC\u05D2\u05E8\u05E1\u05D4 \u05E7\u05D5\u05D3\u05DE\u05EA.", "Goes back to an earlier version."),
|
|
21366
|
-
n("cmd-addons", "cli", "addons / addon next", "\u05D4\u05EA\u05D5\u05E1\u05E4\u05D9\u05DD \u05E9\u05DC \u05D4\u05D0\u05EA\u05E8, \
|
|
21411
|
+
n("cmd-addons", "cli", "addons / addon next / addon buy", "\u05D4\u05EA\u05D5\u05E1\u05E4\u05D9\u05DD \u05E9\u05DC \u05D4\u05D0\u05EA\u05E8, \u05D4\u05E9\u05DC\u05D1 \u05D4\u05D1\u05D0 \u05E9\u05DC \u05EA\u05D5\u05E1\u05E3 \u05E9\u05E0\u05E7\u05E0\u05D4, \u05D5\u05E7\u05D9\u05E9\u05D5\u05E8 \u05E7\u05E0\u05D9\u05D9\u05D4 \u05DC\u05D1\u05E2\u05DC \u05D4\u05D0\u05EA\u05E8.", "The site's add-ons, the next step of one it bought, and a buy link for the owner."),
|
|
21367
21412
|
n("cmd-addon-run", "cli", "addon run / done", "\u05EA\u05D5\u05E1\u05E3 \u05D0\u05D7\u05D3 \u05DC\u05E4\u05D9 \u05E9\u05DD, \u05D5\u05D3\u05D9\u05D5\u05D5\u05D7 \u05E9\u05D4\u05E9\u05DC\u05D1 \u05D4\u05E1\u05EA\u05D9\u05D9\u05DD.", "One add-on by name, and the report that a step is done."),
|
|
21368
21413
|
n("cmd-env", "cli", "env list / set / remove", "\u05DE\u05E9\u05EA\u05E0\u05D9 \u05D4\u05E1\u05D1\u05D9\u05D1\u05D4 \u05E9\u05DC \u05D4\u05D0\u05EA\u05E8. \u05E1\u05D5\u05D3 \u05DB\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC, \u05D5\u05DC\u05D0 \u05DE\u05D5\u05E6\u05D2 \u05E9\u05D5\u05D1.", "The site's environment variables. A secret by default, never shown again."),
|
|
21369
21414
|
n("cmd-speed", "cli", "speed <url>", "\u05D1\u05D3\u05D9\u05E7\u05EA \u05DE\u05D4\u05D9\u05E8\u05D5\u05EA \u05E9\u05DC \u05DB\u05EA\u05D5\u05D1\u05EA \u05D7\u05D9\u05D4.", "A speed test of a live address."),
|
|
@@ -21460,6 +21505,38 @@ function findSecretLine(text, re) {
|
|
|
21460
21505
|
}
|
|
21461
21506
|
return null;
|
|
21462
21507
|
}
|
|
21508
|
+
var PRIVATE_DIRS = /* @__PURE__ */ new Set([".deployai", ".claude", ".cursor", ".vscode", ".idea", ".git", ".github", ".husky"]);
|
|
21509
|
+
var PRIVATE_FILES = /* @__PURE__ */ new Set(["DEPLOYAI.md", "CLAUDE.md", "AGENTS.md", ".cursorrules", ".windsurfrules"]);
|
|
21510
|
+
var SERVED_DOT_DIR = ".well-known";
|
|
21511
|
+
var BUILD_DOTFILES = /* @__PURE__ */ new Set([".babelrc", ".babelrc.json", ".browserslistrc", ".postcssrc", ".postcssrc.json", ".postcssrc.js", ".postcssrc.cjs", ".postcssrc.mjs", ".swcrc", ".nvmrc", ".node-version", ".assetsignore"]);
|
|
21512
|
+
var segments = (path) => path.replace(/^\/+/, "").split("/").filter(Boolean);
|
|
21513
|
+
function privateProjectFile(path) {
|
|
21514
|
+
const parts = segments(path);
|
|
21515
|
+
const base = parts[parts.length - 1] ?? "";
|
|
21516
|
+
return PRIVATE_FILES.has(base) || parts.slice(0, -1).some((p) => PRIVATE_DIRS.has(p)) || PRIVATE_DIRS.has(base);
|
|
21517
|
+
}
|
|
21518
|
+
function dotPath(path) {
|
|
21519
|
+
const parts = segments(path);
|
|
21520
|
+
if (parts[0] === SERVED_DOT_DIR) parts.shift();
|
|
21521
|
+
return parts.some((p) => p.startsWith("."));
|
|
21522
|
+
}
|
|
21523
|
+
function neverUploadedFile(rel) {
|
|
21524
|
+
if (privateProjectFile(rel)) return true;
|
|
21525
|
+
const parts = segments(rel);
|
|
21526
|
+
if (parts.length === 1 && BUILD_DOTFILES.has(parts[0])) return false;
|
|
21527
|
+
return dotPath(rel);
|
|
21528
|
+
}
|
|
21529
|
+
|
|
21530
|
+
// ../shared/src/domain-sales.ts
|
|
21531
|
+
var IL_TLDS = ["co.il", "org.il", "net.il"];
|
|
21532
|
+
var DEFAULT_LIVEDNS_POINTS = { 5: 9100, 10: 8900, 20: 8700, 50: 8500, 100: 8200 };
|
|
21533
|
+
var pointCost = (points, pack) => Math.round(points[pack] / (1 + VAT_RATE));
|
|
21534
|
+
var DEFAULT_DOMAIN_REGISTRARS = {
|
|
21535
|
+
cloudflare: { enabled: true, feeRate: 0.03, maxUsdCentsPerDay: 1e4 },
|
|
21536
|
+
livedns: { enabled: true, feeRate: 0.01, pack: 5, costAgorot: pointCost(DEFAULT_LIVEDNS_POINTS, 5) },
|
|
21537
|
+
manual: { enabled: true, feeRate: 0.01, costAgorot: 7500 }
|
|
21538
|
+
};
|
|
21539
|
+
var LIVEDNS_TLDS = [...IL_TLDS, "com", "net", "org"];
|
|
21463
21540
|
|
|
21464
21541
|
// ../shared/src/env-scopes.ts
|
|
21465
21542
|
var ENV_KEYS = {
|
|
@@ -21468,14 +21545,18 @@ var ENV_KEYS = {
|
|
|
21468
21545
|
BETTER_AUTH_SECRET: { scope: "own", section: "app", required: ["server"], sample: { local: "change-me-to-a-long-random-string", server: "" }, about: "Signs login sessions and our own links; changing it logs everyone out. 32 characters or more in production: openssl rand -base64 48" },
|
|
21469
21546
|
DEV_SUPERADMIN_PASSWORD: { scope: "local", section: "app", about: "The superadmin password after every local wipe. Without it the one in apps/web/local-logins.md is kept (D-100)." },
|
|
21470
21547
|
NEXT_PUBLIC_SUPPORT_WHATSAPP: { scope: "same", section: "app", about: "The WhatsApp number people reach us on, digits with the country code (972...). Empty shows only the email (D-237)." },
|
|
21548
|
+
OPENAI_APPS_CHALLENGE: { scope: "server", section: "app", about: "The domain check token from the OpenAI platform portal (Plugins, domain verification), served as plain text at /.well-known/openai-apps-challenge (D-474). Unset: that page is a 404." },
|
|
21471
21549
|
TUNNEL_ORIGIN_CERT: { scope: "local", section: "app", about: "The cloudflared login certificate pnpm dev:public checks. Default ~/.cloudflared/cert.pem." },
|
|
21472
21550
|
CF_API_TOKEN: { scope: "own", section: "cloudflare", required: ["server"], about: "Cloudflare token (pnpm cf:token-link): sites, KV, D1, R2, routes, custom hostnames and our emails. Each machine its own. Without it everything Cloudflare is a dry run." },
|
|
21551
|
+
PROBE_SECRET: { scope: "own", section: "cloudflare", about: "Signs our go live and uptime probes so the dispatch Worker lets them past a site country and bot rules (D-528); pnpm dispatch:deploy sends it to the dispatch Worker. Unset: probes from abroad see the blocked page. openssl rand -hex 32" },
|
|
21473
21552
|
CF_REGISTRAR_TOKEN: { scope: "server", section: "cloudflare", about: "Buys real domains (D-300): a Cloudflare token with Registrar edit only. Server only." },
|
|
21553
|
+
LIVEDNS_USER: { scope: "server", section: "cloudflare", about: "Buys real Israeli domains at LiveDNS (D-458): the API user of our LiveDNS partner account. Server only: LiveDNS refuses some networks, and it spends prepaid credit." },
|
|
21554
|
+
LIVEDNS_PASSWORD: { scope: "server", section: "cloudflare", about: "Its password, sent in every LiveDNS call; never logged. Server only." },
|
|
21555
|
+
ADMIN_GEO_MANAGE: { scope: "server", section: "cloudflare", about: "1 lets the superadmin change the admin-geo rule on Admin, Server, Security (temporary, D-455); CF_API_TOKEN needs Zone WAF Edit. Off or unset: the card only shows it. The rule stays in Cloudflare either way." },
|
|
21474
21556
|
DISPATCH_RATE_LIMIT_GUEST: { scope: "same", section: "cloudflare", about: "pnpm dispatch:deploy: requests per IP per period on a temporary site (D-087, D-238)." },
|
|
21475
21557
|
DISPATCH_RATE_LIMIT_FREE: { scope: "same", section: "cloudflare", about: "The same on a site on a free plan." },
|
|
21476
21558
|
DISPATCH_RATE_LIMIT_PAID: { scope: "same", section: "cloudflare", about: "The same on a site on a paid plan." },
|
|
21477
21559
|
DISPATCH_RATE_LIMIT_PERIOD: { scope: "same", section: "cloudflare", about: "The rate limit period in seconds: 10 or 60." },
|
|
21478
|
-
MAIL_POSTAL_ADDRESS: { scope: "same", section: "email", about: "The business address in the footer of lifecycle emails (anti-spam law, D-180). Required before a tips or offers email can be turned on or sent (D-370)." },
|
|
21479
21560
|
GOOGLE_CLIENT_ID: { scope: "same", section: "login", about: "Google Cloud Console, OAuth client, with both the laptop and the server redirect addresses on it." },
|
|
21480
21561
|
GOOGLE_CLIENT_SECRET: { scope: "same", section: "login", about: "The secret of that Google client." },
|
|
21481
21562
|
GITHUB_CLIENT_ID: { scope: "same", section: "login", about: "GitHub, Settings, Developer settings, OAuth Apps, with both redirect addresses on it." },
|
|
@@ -21592,6 +21673,28 @@ var SPACES = {
|
|
|
21592
21673
|
test: build("test", { ...CLOUDFLARE_SPACES.prod, kvNamespaceId: "", sitesZoneId: null, backupBucket: null, toolsWorkerUrl: "" }, { ...SPACE_ADDRESSES.prod, appUrl: "http://localhost:3000", siteUrl: "http://localhost:3000", trustedOrigins: [], storage: "local" })
|
|
21593
21674
|
};
|
|
21594
21675
|
|
|
21676
|
+
// ../shared/src/agent-rules.ts
|
|
21677
|
+
var BUILD_WITH = [
|
|
21678
|
+
`Frameworks: ${SUPPORTED_FRAMEWORKS.map((f) => f.name).join(", ")}. In beta: ${BETA_FRAMEWORKS.map((f) => f.name).join(", ")} (Next.js through the OpenNext Cloudflare adapter).`,
|
|
21679
|
+
"Database: Cloudflare D1 (SQLite), through Drizzle with drizzle-orm/d1 or Prisma with the D1 adapter.",
|
|
21680
|
+
"Uploaded files and images: Cloudflare R2 (object storage), never the local disk.",
|
|
21681
|
+
"Settings and secrets: environment variables, set with: npx deployai@latest env set <key>",
|
|
21682
|
+
"Images: resize at build time or serve them as they are; no native image modules at runtime.",
|
|
21683
|
+
"Passwords: bcryptjs or Web Crypto, never native bcrypt.",
|
|
21684
|
+
"Server code runs per request: no long-running processes, background servers or child processes.",
|
|
21685
|
+
// D-535: the agent knows our built-in email, so it never adds an email provider or asks the owner for keys to email them.
|
|
21686
|
+
"Email to the site owner (a form answer, a new order): the built-in email, with no email provider or keys. POST JSON { subject, text, replyTo } to `${DEPLOYAI_API}/api/site/notify` with the header Authorization: Bearer DEPLOYAI_KEY (both are environment variables every upload gets). It reaches only the owner. On a temporary site it works once the owner has a free account: keep building, and say so only when it is time to go live. Email to customers needs an HTTP email API (Resend, Postmark), never SMTP."
|
|
21687
|
+
];
|
|
21688
|
+
var KEEP_DATA_RULES = [
|
|
21689
|
+
"Moving to DeployAI changes where data lives. It never moves the data by itself. Before you switch any of these, save a copy inside the project and tell the user, in simple words, what was saved and where:",
|
|
21690
|
+
"- Database (Postgres, MySQL, MongoDB, a SQLite file): export it to a file (pg_dump, mysqldump, mongoexport, sqlite3 .dump), so it can be imported into D1 later.",
|
|
21691
|
+
"- Uploaded files and images on the local disk or another storage service: keep them in a folder (download them first if they are on another service), so they can be uploaded to R2 later.",
|
|
21692
|
+
"- User accounts and passwords: keep existing password hashes working (bcryptjs reads bcrypt hashes), so no one has to reset.",
|
|
21693
|
+
"- Sessions and cache (Redis, memory): these can be lost, and users may have to log in again. Say so.",
|
|
21694
|
+
"Never delete the old database, files or storage service."
|
|
21695
|
+
];
|
|
21696
|
+
var AGENT_POINTER = "Read DEPLOYAI.md before you write code, change the plan or add a dependency: this project is published with DeployAI.";
|
|
21697
|
+
|
|
21595
21698
|
// src/config.ts
|
|
21596
21699
|
import { randomUUID } from "crypto";
|
|
21597
21700
|
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
@@ -21629,6 +21732,7 @@ function loadConfig() {
|
|
|
21629
21732
|
};
|
|
21630
21733
|
if (typeof raw.apiUrl === "string") cfg.apiUrl = raw.apiUrl;
|
|
21631
21734
|
if (typeof raw.token === "string") cfg.token = raw.token;
|
|
21735
|
+
if (typeof raw.tokenApiUrl === "string") cfg.tokenApiUrl = raw.tokenApiUrl;
|
|
21632
21736
|
if (typeof raw.email === "string") cfg.email = raw.email;
|
|
21633
21737
|
if (raw.guestClaims && typeof raw.guestClaims === "object") {
|
|
21634
21738
|
const links = Object.fromEntries(Object.entries(raw.guestClaims).filter(([, v]) => typeof v === "string"));
|
|
@@ -21738,6 +21842,8 @@ var M = {
|
|
|
21738
21842
|
startInstalled: "Installed its packages (npm install).",
|
|
21739
21843
|
startBrief: "Wrote the owner's details to {file} (kept out of git and never uploaded).",
|
|
21740
21844
|
startLinked: 'Linked this folder to the site "{name}".',
|
|
21845
|
+
startRules: "Wrote the rules for your agent to DEPLOYAI.md (never uploaded).",
|
|
21846
|
+
startStarter: "Wrote a starter page (index.html) to build the site on.",
|
|
21741
21847
|
startRelinked: 'Linked this folder to the site "{name}" instead of the site it was linked to.',
|
|
21742
21848
|
statusLine: "Status: {s}",
|
|
21743
21849
|
ready: "ready",
|
|
@@ -21751,6 +21857,8 @@ var M = {
|
|
|
21751
21857
|
pasteFix: " Paste the prompt below into your AI editor, then run: npx deployai@latest check",
|
|
21752
21858
|
copied: " (copied to clipboard)",
|
|
21753
21859
|
runDeploy: ' Run: npx deployai@latest deploy -m "<message>"',
|
|
21860
|
+
initHint: " So your agent follows the DeployAI rules, run: npx deployai@latest init",
|
|
21861
|
+
emptyFolder: "Nothing to check yet: this folder has no site. Build the site here, then run: npx deployai@latest check",
|
|
21754
21862
|
deployTitle: "DeployAI deploy",
|
|
21755
21863
|
guestTitle: "DeployAI deploy (no account)",
|
|
21756
21864
|
uploading: "Uploading...",
|
|
@@ -21765,6 +21873,9 @@ var M = {
|
|
|
21765
21873
|
goesLive: "The new version goes live when its build is done.",
|
|
21766
21874
|
followBuild: " Run: npx deployai@latest status (to follow the build)",
|
|
21767
21875
|
thenPromote: " Then, only after the owner approves the preview: npx deployai@latest promote v{n} (to put it live)",
|
|
21876
|
+
heavyPage: "The home page loads {n} files from the site. Fewer files make it faster for visitors.",
|
|
21877
|
+
prefetchPage: "The home page fetches pages before anyone opens them (link prefetch). Turning it off on long link lists saves visitors data.",
|
|
21878
|
+
speedHint: " Check it: npx deployai@latest speed {url}",
|
|
21768
21879
|
queueWaiting: "waiting in queue, position {n}",
|
|
21769
21880
|
files: "Files",
|
|
21770
21881
|
skipped: "Skipped",
|
|
@@ -21788,26 +21899,33 @@ var M = {
|
|
|
21788
21899
|
statusTitle: "DeployAI status",
|
|
21789
21900
|
state: "State",
|
|
21790
21901
|
liveVersion: "Live version",
|
|
21902
|
+
newestVersion: "Newest version",
|
|
21903
|
+
promoteReady: " After the owner approves the preview: npx deployai@latest promote v{n} (to put it live)",
|
|
21904
|
+
askOwner: ' Version {n} is ready and not live. Ask the owner: "Version {n} is ready. Do you want to put it live?"',
|
|
21905
|
+
showPreview: " Send them the preview first: {url}",
|
|
21791
21906
|
notPublished: "not published yet",
|
|
21792
21907
|
none: "none",
|
|
21793
21908
|
buildingNow: "building now",
|
|
21794
21909
|
idle: "idle",
|
|
21795
21910
|
envListTitle: "Variables",
|
|
21796
|
-
envNone: "This site has no variables yet. Add one: npx deployai@latest env set <
|
|
21911
|
+
envNone: "This site has no variables yet. Add one: npx deployai@latest env set <KEY> <value>",
|
|
21797
21912
|
envSecret: "secret",
|
|
21798
21913
|
envPlain: "plain",
|
|
21799
|
-
envNeedValue: 'Give the value after the key, or pipe it in: echo "<value>" | npx deployai@latest env set <
|
|
21914
|
+
envNeedValue: 'Give the value after the key, or pipe it in: echo "<value>" | npx deployai@latest env set <KEY>',
|
|
21800
21915
|
envSavedSecret: "Saved {key} as a secret on the live site. Its value is not stored and is never shown again.",
|
|
21801
21916
|
envSavedPlain: "Saved {key}. The live site gets it in about a minute.",
|
|
21802
21917
|
envRemoved: "Removed {key}. The live site loses it in about a minute.",
|
|
21803
21918
|
guestNoEnv: "A temporary site has no environment variables. Keep it in an account first: npx deployai@latest claim",
|
|
21804
|
-
envInvalidKey: "A variable name is English letters, digits and _,
|
|
21919
|
+
envInvalidKey: "A variable name is capital English letters, digits and _, starts with a letter, up to 64 characters, like STRIPE_KEY.",
|
|
21805
21920
|
envTooLong: "The value is over 5 KB, too long for a variable.",
|
|
21806
21921
|
envSendFailed: "The secret did not reach the site. Try again in a minute.",
|
|
21807
21922
|
envNoKey: "This site has no variable with that name. See them: npx deployai@latest env list",
|
|
21808
21923
|
buildFailed: "The build of v{n} failed. The live site did not change.",
|
|
21924
|
+
wentBack: "v{n} went live but did not answer ({reason}), so v{prev} came back by itself. Fix the error, then deploy again.",
|
|
21925
|
+
goingLive: "v{n} is going live now. Run status again in a few seconds.",
|
|
21809
21926
|
buildLogTail: "End of the build log:",
|
|
21810
|
-
buildFixHint: 'Fix the error above, then run: npx deployai@latest check, then npx deployai@latest deploy -m "<message>"',
|
|
21927
|
+
buildFixHint: 'Fix the error above, then run: npx deployai@latest check, then npx deployai@latest deploy -m "<message>" --fixed "<one sentence: what you changed, no code>"',
|
|
21928
|
+
buildFixHintNoNote: 'Fix the error above, then run: npx deployai@latest check, then npx deployai@latest deploy -m "<message>"',
|
|
21811
21929
|
linkedTo: "Linked to {name} ({slug}).",
|
|
21812
21930
|
loginTitle: "DeployAI login",
|
|
21813
21931
|
browserOpened: "Opened the browser. Approve the code there.",
|
|
@@ -21869,10 +21987,18 @@ var M = {
|
|
|
21869
21987
|
startExpired: "These instructions expired (they last 7 days). Copy them again from the DeployAI site.",
|
|
21870
21988
|
startUsedUp: "These instructions were already used 5 times. Copy them again from the DeployAI site.",
|
|
21871
21989
|
loginExpired: "The login code expired. Run: npx deployai@latest login",
|
|
21872
|
-
loggedOut: "Logged out. The token was removed from this computer.",
|
|
21990
|
+
loggedOut: "Logged out. The token was canceled and removed from this computer.",
|
|
21873
21991
|
protocol: "Unexpected answer from DeployAI. Run the latest CLI: npx deployai@latest",
|
|
21874
21992
|
guestClaimFirst: "This folder holds a temporary site, and you are logged in. Claim the site to your account first: {url}",
|
|
21875
21993
|
guestClaimFirstNoLink: "This folder holds a temporary site, and you are logged in. Claim it to your account first with the claim link deploy --guest printed.",
|
|
21994
|
+
guestAccountSite: "This folder belongs to a site in an account, so it cannot go up as a temporary site. Run: npx deployai@latest login, then: npx deployai@latest deploy",
|
|
21995
|
+
sqlWaitingLine: "Database changes (SQL) wait for your approval before this version goes live: {url}",
|
|
21996
|
+
sqlWaiting: "This version has database changes (SQL) that have not run yet. Approve them in the dashboard first, then promote again: {url}",
|
|
21997
|
+
tokenOtherApi: "The login on this computer is for {saved}, not {url}. Run: npx deployai@latest login --api {url}, or drop --api and DEPLOYAI_API_URL.",
|
|
21998
|
+
linkConfirm: "Link this folder to {name} ({address})? (y/N) ",
|
|
21999
|
+
linkOnlyOne: "You have one site: {name} ({address}). To link it, or a new site, run:",
|
|
22000
|
+
linkCancelled: "Not linked. Nothing changed.",
|
|
22001
|
+
loggedOutLocalOnly: "Logged out on this computer. DeployAI could not be reached, so the token stays valid until it expires (30 days).",
|
|
21876
22002
|
savedIn: "Saved in .deployai/project.json",
|
|
21877
22003
|
createdProject: "Created the site {name}.",
|
|
21878
22004
|
noProjects: "No sites yet.",
|
|
@@ -21883,15 +22009,17 @@ var M = {
|
|
|
21883
22009
|
runLink: " Run: npx deployai@latest link",
|
|
21884
22010
|
nextSteps: "Next steps",
|
|
21885
22011
|
readme: "Read README.md in the folder for what each file does.",
|
|
21886
|
-
states: { online: "live", building: "building", ready: "ready for review", failed: "failed", paused: "paused", off: "off", queued: "waiting", deleted: "deleted", new: "new" }
|
|
22012
|
+
states: { online: "live", building: "building", ready: "ready for review", failed: "failed", paused: "paused", off: "off", queued: "waiting", replaced: "replaced by a newer upload", deleted: "deleted", new: "new" }
|
|
21887
22013
|
},
|
|
21888
22014
|
he: {
|
|
21889
22015
|
startTitle: "DeployAI start",
|
|
21890
22016
|
startNewFolder: "\u05D1\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D4\u05D6\u05D5 \u05DB\u05D1\u05E8 \u05D9\u05E9 \u05E7\u05D1\u05E6\u05D9\u05DD, \u05D0\u05D6 \u05D4\u05D0\u05EA\u05E8 \u05D4\u05D7\u05D3\u05E9 \u05D1\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D7\u05D3\u05E9\u05D4: {dir}",
|
|
21891
22017
|
startDownloaded: "\u05D4\u05D3\u05D5\u05D2\u05DE\u05D4 {key} \u05D4\u05D5\u05E8\u05D3\u05D4: {n} \u05E7\u05D1\u05E6\u05D9\u05DD.",
|
|
21892
22018
|
startInstalled: "\u05D4\u05D7\u05D1\u05D9\u05DC\u05D5\u05EA \u05E9\u05DC\u05D4 \u05D4\u05D5\u05EA\u05E7\u05E0\u05D5 (npm install).",
|
|
21893
|
-
startBrief: "\u05D4\u05E4\u05E8\u05D8\u05D9\u05DD \u05E9\u05DC \u05D1\u05E2\u05DC \u05D4\u05D0\u05EA\u05E8 \u05E0\u05DB\u05EA\u05D1\u05D5 \u05DC {file} (\u05DC\u05D0 \u05E0\u05DB\u05E0\u05E1\u05D9\u05DD \u05DC
|
|
22019
|
+
startBrief: "\u05D4\u05E4\u05E8\u05D8\u05D9\u05DD \u05E9\u05DC \u05D1\u05E2\u05DC \u05D4\u05D0\u05EA\u05E8 \u05E0\u05DB\u05EA\u05D1\u05D5 \u05DC {file} (\u05DC\u05D0 \u05E0\u05DB\u05E0\u05E1\u05D9\u05DD \u05DC\u05BEgit \u05D5\u05DC\u05D0 \u05E2\u05D5\u05DC\u05D9\u05DD \u05DC\u05D0\u05EA\u05E8).",
|
|
21894
22020
|
startLinked: '\u05D4\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D7\u05D5\u05D1\u05E8\u05D4 \u05DC\u05D0\u05EA\u05E8 "{name}".',
|
|
22021
|
+
startRules: "\u05D4\u05DB\u05DC\u05DC\u05D9\u05DD \u05DC\u05E1\u05D5\u05DB\u05DF \u05E0\u05DB\u05EA\u05D1\u05D5 \u05DC DEPLOYAI.md (\u05DC\u05D0 \u05E2\u05D5\u05DC\u05D9\u05DD \u05DC\u05D0\u05EA\u05E8).",
|
|
22022
|
+
startStarter: "\u05E0\u05DB\u05EA\u05D1 \u05D3\u05E3 \u05E4\u05EA\u05D9\u05D7\u05D4 (index.html) \u05DC\u05D1\u05E0\u05D5\u05EA \u05E2\u05DC\u05D9\u05D5 \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8.",
|
|
21895
22023
|
startRelinked: '\u05D4\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D7\u05D5\u05D1\u05E8\u05D4 \u05DC\u05D0\u05EA\u05E8 "{name}" \u05D1\u05DE\u05E7\u05D5\u05DD \u05D4\u05D0\u05EA\u05E8 \u05E9\u05D4\u05D9\u05D9\u05EA\u05D4 \u05DE\u05D7\u05D5\u05D1\u05E8\u05EA \u05D0\u05DC\u05D9\u05D5.',
|
|
21896
22024
|
statusLine: "\u05DE\u05E6\u05D1: {s}",
|
|
21897
22025
|
ready: "\u05DE\u05D5\u05DB\u05DF \u05DC\u05E2\u05DC\u05D5\u05EA",
|
|
@@ -21905,6 +22033,8 @@ var M = {
|
|
|
21905
22033
|
pasteFix: " \u05D4\u05D3\u05D1\u05D9\u05E7\u05D5 \u05D0\u05EA \u05D4\u05E4\u05E8\u05D5\u05DE\u05E4\u05D8 \u05E9\u05DC\u05DE\u05D8\u05D4 \u05DC\u05E1\u05D5\u05DB\u05DF, \u05D5\u05D0\u05D6 \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest check",
|
|
21906
22034
|
copied: " (\u05D4\u05D5\u05E2\u05EA\u05E7)",
|
|
21907
22035
|
runDeploy: ' \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest deploy -m "<message>"',
|
|
22036
|
+
initHint: " \u05DB\u05D3\u05D9 \u05E9\u05D4\u05E1\u05D5\u05DB\u05DF \u05D9\u05E2\u05D1\u05D5\u05D3 \u05DC\u05E4\u05D9 \u05D4\u05DB\u05DC\u05DC\u05D9\u05DD \u05E9\u05DC DeployAI, \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest init",
|
|
22037
|
+
emptyFolder: "\u05D0\u05D9\u05DF \u05E2\u05D3\u05D9\u05D9\u05DF \u05DE\u05D4 \u05DC\u05D1\u05D3\u05D5\u05E7: \u05D0\u05D9\u05DF \u05D1\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D4\u05D6\u05D5 \u05D0\u05EA\u05E8. \u05D1\u05E0\u05D5 \u05DB\u05D0\u05DF \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8, \u05D5\u05D0\u05D6 \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest check",
|
|
21908
22038
|
deployTitle: "DeployAI deploy",
|
|
21909
22039
|
guestTitle: "DeployAI deploy (\u05D1\u05DC\u05D9 \u05D7\u05E9\u05D1\u05D5\u05DF)",
|
|
21910
22040
|
uploading: "\u05DE\u05E2\u05DC\u05D9\u05DD...",
|
|
@@ -21919,49 +22049,59 @@ var M = {
|
|
|
21919
22049
|
goesLive: "\u05D4\u05D2\u05E8\u05E1\u05D4 \u05D4\u05D7\u05D3\u05E9\u05D4 \u05E2\u05D5\u05DC\u05D4 \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8 \u05DB\u05E9\u05D4\u05D1\u05E0\u05D9\u05D9\u05D4 \u05E9\u05DC\u05D4 \u05DE\u05E1\u05EA\u05D9\u05D9\u05DE\u05EA.",
|
|
21920
22050
|
followBuild: " \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest status (\u05DB\u05D3\u05D9 \u05DC\u05E2\u05E7\u05D5\u05D1 \u05D0\u05D7\u05E8\u05D9 \u05D4\u05D1\u05E0\u05D9\u05D9\u05D4)",
|
|
21921
22051
|
thenPromote: " \u05D5\u05E8\u05E7 \u05D0\u05D7\u05E8\u05D9 \u05E9\u05D1\u05E2\u05DC \u05D4\u05D0\u05EA\u05E8 \u05D0\u05D9\u05E9\u05E8 \u05D0\u05EA \u05D4\u05EA\u05E6\u05D5\u05D2\u05D4 \u05D4\u05DE\u05E7\u05D3\u05D9\u05DE\u05D4: npx deployai@latest promote v{n} (\u05DB\u05D3\u05D9 \u05DC\u05D4\u05E2\u05DC\u05D5\u05EA \u05D0\u05D5\u05EA\u05D4 \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8)",
|
|
22052
|
+
heavyPage: "\u05E2\u05DE\u05D5\u05D3 \u05D4\u05D1\u05D9\u05EA \u05D8\u05D5\u05E2\u05DF {n} \u05E7\u05D1\u05E6\u05D9\u05DD \u05DE\u05D4\u05D0\u05EA\u05E8. \u05E4\u05D7\u05D5\u05EA \u05E7\u05D1\u05E6\u05D9\u05DD \u05D6\u05D4 \u05D0\u05EA\u05E8 \u05DE\u05D4\u05D9\u05E8 \u05D9\u05D5\u05EA\u05E8 \u05DC\u05DE\u05D1\u05E7\u05E8\u05D9\u05DD.",
|
|
22053
|
+
prefetchPage: "\u05E2\u05DE\u05D5\u05D3 \u05D4\u05D1\u05D9\u05EA \u05D8\u05D5\u05E2\u05DF \u05E2\u05DE\u05D5\u05D3\u05D9\u05DD \u05DC\u05E4\u05E0\u05D9 \u05E9\u05DE\u05D9\u05E9\u05D4\u05D5 \u05E4\u05D5\u05EA\u05D7 \u05D0\u05D5\u05EA\u05DD (prefetch). \u05DB\u05D9\u05D1\u05D5\u05D9 \u05E9\u05DC\u05D5 \u05D1\u05E8\u05E9\u05D9\u05DE\u05D5\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05D0\u05E8\u05D5\u05DB\u05D5\u05EA \u05D7\u05D5\u05E1\u05DA \u05DC\u05DE\u05D1\u05E7\u05E8\u05D9\u05DD \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD.",
|
|
22054
|
+
speedHint: " \u05DC\u05D1\u05D3\u05D9\u05E7\u05D4: npx deployai@latest speed {url}",
|
|
21922
22055
|
queueWaiting: "\u05DE\u05DE\u05EA\u05D9\u05DF \u05D1\u05EA\u05D5\u05E8, \u05DE\u05E7\u05D5\u05DD {n}",
|
|
21923
22056
|
files: "\u05E7\u05D1\u05E6\u05D9\u05DD",
|
|
21924
22057
|
skipped: "\u05D3\u05D9\u05DC\u05D2\u05E0\u05D5",
|
|
21925
|
-
skippedLarge: "{n} \u05E7\u05D1\u05E6\u05D9\u05DD \u05D2\u05D3\u05D5\u05DC\u05D9\u05DD \u05DE
|
|
22058
|
+
skippedLarge: "{n} \u05E7\u05D1\u05E6\u05D9\u05DD \u05D2\u05D3\u05D5\u05DC\u05D9\u05DD \u05DE\u05BE{max}: {names}",
|
|
21926
22059
|
ownerKeys: "\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D1\u05E2\u05DC\u05D9\u05DD \u05DC\u05D0\u05EA\u05E8 \u05D4\u05D6\u05D4 (\u05DE\u05D5\u05E6\u05D2\u05D9\u05DD \u05E4\u05E2\u05DD \u05D0\u05D7\u05EA, \u05E9\u05DE\u05E8\u05D5 \u05D0\u05D5\u05EA\u05DD \u05E2\u05DB\u05E9\u05D9\u05D5):",
|
|
21927
22060
|
guestLive: "\u05D4\u05D0\u05EA\u05E8 \u05E2\u05D5\u05DC\u05D4 \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8 \u05DB\u05E9\u05D4\u05D1\u05E0\u05D9\u05D9\u05D4 \u05DE\u05E1\u05EA\u05D9\u05D9\u05DE\u05EA (\u05D1\u05E2\u05E8\u05DA \u05D3\u05E7\u05D4).",
|
|
21928
22061
|
guestClaim: "\u05E4\u05EA\u05D7\u05D5 \u05D0\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8 \u05D4\u05E9\u05DE\u05D9\u05E8\u05D4 \u05DB\u05D3\u05D9 \u05DC\u05E9\u05DE\u05D5\u05E8 \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8 (\u05D4\u05E8\u05E9\u05DE\u05D4 \u05D0\u05D5 \u05DB\u05E0\u05D9\u05E1\u05D4).",
|
|
21929
22062
|
claimLink: "\u05E7\u05D9\u05E9\u05D5\u05E8 \u05D4\u05E9\u05DE\u05D9\u05E8\u05D4 \u05E9\u05DC \u05D4\u05D0\u05EA\u05E8 \u05D4\u05D6\u05DE\u05E0\u05D9: {url}",
|
|
21930
22063
|
pulled: "\u05D4\u05D5\u05E8\u05D3\u05E0\u05D5 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3 \u05E9\u05DC \u05D2\u05E8\u05E1\u05D4 v{v}: {n} \u05E7\u05D1\u05E6\u05D9\u05DD.",
|
|
21931
|
-
pullNotLinked: "\u05D4\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D4\u05D6\u05D5 \u05DC\u05D0 \u05DE\u05D7\u05D5\u05D1\u05E8\u05EA \u05DC\u05D0\u05EA\u05E8. \u05D4\u05E2\u05EA\u05D9\u05E7\u05D5 \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D4\u05E9\u05D5\u05E8\u05D4 \u05DE\u05D3\u05E3 \u05D4\u05D0\u05EA\u05E8 \u05D1
|
|
22064
|
+
pullNotLinked: "\u05D4\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D4\u05D6\u05D5 \u05DC\u05D0 \u05DE\u05D7\u05D5\u05D1\u05E8\u05EA \u05DC\u05D0\u05EA\u05E8. \u05D4\u05E2\u05EA\u05D9\u05E7\u05D5 \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D4\u05E9\u05D5\u05E8\u05D4 \u05DE\u05D3\u05E3 \u05D4\u05D0\u05EA\u05E8 \u05D1\u05BEDeployAI.",
|
|
21932
22065
|
pullNotEmpty: "\u05D1\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D4\u05D6\u05D5 \u05DB\u05D1\u05E8 \u05D9\u05E9 \u05E7\u05D1\u05E6\u05D9\u05DD, \u05D0\u05D6 \u05DC\u05D0 \u05D4\u05D5\u05E8\u05D3\u05E0\u05D5 \u05DB\u05DC\u05D5\u05DD. \u05D4\u05E9\u05EA\u05DE\u05E9\u05D5 \u05D1\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05E8\u05D9\u05E7\u05D4.",
|
|
21933
22066
|
pullNoSource: "\u05DC\u05D0\u05EA\u05E8 \u05D4\u05D6\u05D4 \u05E2\u05D5\u05D3 \u05D0\u05D9\u05DF \u05D2\u05E8\u05E1\u05D4 \u05DC\u05D4\u05D5\u05E8\u05D9\u05D3.",
|
|
21934
|
-
pullTooLarge: "\u05D4\u05E7\u05D5\u05D3 \u05E9\u05DC \u05D4\u05D2\u05E8\u05E1\u05D4 \u05D4\u05D6\u05D5 \u05D2\u05D3\u05D5\u05DC \u05DE
|
|
22067
|
+
pullTooLarge: "\u05D4\u05E7\u05D5\u05D3 \u05E9\u05DC \u05D4\u05D2\u05E8\u05E1\u05D4 \u05D4\u05D6\u05D5 \u05D2\u05D3\u05D5\u05DC \u05DE\u05BE50MB, \u05D2\u05D3\u05D5\u05DC \u05DE\u05D3\u05D9 \u05DC\u05D4\u05D5\u05E8\u05D3\u05D4.",
|
|
21935
22068
|
pullDamaged: "\u05D4\u05D4\u05D5\u05E8\u05D3\u05D4 \u05E4\u05D2\u05D5\u05DE\u05D4. \u05E0\u05E1\u05D5 \u05E9\u05D5\u05D1.",
|
|
21936
22069
|
guestEmailHint: "\u05DC\u05E7\u05D1\u05DC \u05D0\u05D5\u05EA\u05D5 \u05D1\u05DE\u05D9\u05D9\u05DC, \u05E2\u05DD \u05EA\u05D6\u05DB\u05D5\u05E8\u05EA \u05DC\u05E4\u05E0\u05D9 \u05D4\u05DE\u05D7\u05D9\u05E7\u05D4: npx deployai@latest claim --email <email>",
|
|
21937
|
-
claimEmailed: "\u05E9\u05DC\u05D7\u05E0\u05D5 \u05D0\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8 \u05D4\u05E9\u05DE\u05D9\u05E8\u05D4 \u05DC
|
|
22070
|
+
claimEmailed: "\u05E9\u05DC\u05D7\u05E0\u05D5 \u05D0\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8 \u05D4\u05E9\u05DE\u05D9\u05E8\u05D4 \u05DC\u05BE{email}. \u05EA\u05D6\u05DB\u05D5\u05E8\u05EA \u05EA\u05D2\u05D9\u05E2 3 \u05D9\u05DE\u05D9\u05DD \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D4\u05D0\u05EA\u05E8 \u05E0\u05DE\u05D7\u05E7.",
|
|
21938
22071
|
claimNoLink: "\u05DE\u05D4\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D4\u05D6\u05D5 \u05DC\u05D0 \u05D4\u05D5\u05E2\u05DC\u05D4 \u05D0\u05EA\u05E8 \u05D6\u05DE\u05E0\u05D9 \u05DE\u05D4\u05DE\u05D7\u05E9\u05D1 \u05D4\u05D6\u05D4, \u05D0\u05D6 \u05D0\u05D9\u05DF \u05DB\u05D0\u05DF \u05E7\u05D9\u05E9\u05D5\u05E8 \u05E9\u05DE\u05D9\u05E8\u05D4.",
|
|
21939
|
-
rollbackQueued: "\u05D4\u05D7\u05D6\u05E8\u05D4 \u05DC
|
|
22072
|
+
rollbackQueued: "\u05D4\u05D7\u05D6\u05E8\u05D4 \u05DC\u05BEv{n} \u05D1\u05EA\u05D5\u05E8. \u05D0\u05D9\u05DF \u05E6\u05D5\u05E8\u05DA \u05D1\u05D1\u05E0\u05D9\u05D9\u05D4 \u05DE\u05D7\u05D3\u05E9.",
|
|
21940
22073
|
promoteQueued: "\u05D4\u05E2\u05DC\u05D0\u05EA v{n} \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8 \u05D1\u05EA\u05D5\u05E8.",
|
|
21941
22074
|
runStatus: " \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest status",
|
|
21942
22075
|
statusTitle: "DeployAI status",
|
|
21943
22076
|
state: "\u05DE\u05E6\u05D1",
|
|
21944
22077
|
liveVersion: "\u05D2\u05E8\u05E1\u05D4 \u05D7\u05D9\u05D4",
|
|
22078
|
+
newestVersion: "\u05D2\u05E8\u05E1\u05D4 \u05D0\u05D7\u05E8\u05D5\u05E0\u05D4",
|
|
22079
|
+
promoteReady: " \u05D0\u05D7\u05E8\u05D9 \u05E9\u05D1\u05E2\u05DC \u05D4\u05D0\u05EA\u05E8 \u05D0\u05D9\u05E9\u05E8 \u05D0\u05EA \u05D4\u05EA\u05E6\u05D5\u05D2\u05D4 \u05D4\u05DE\u05E7\u05D3\u05D9\u05DE\u05D4: npx deployai@latest promote v{n} (\u05DB\u05D3\u05D9 \u05DC\u05D4\u05E2\u05DC\u05D5\u05EA \u05D0\u05D5\u05EA\u05D4 \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8)",
|
|
22080
|
+
askOwner: ' \u05D2\u05E8\u05E1\u05D4 {n} \u05DE\u05D5\u05DB\u05E0\u05D4 \u05D5\u05E2\u05D5\u05D3 \u05DC\u05D0 \u05D1\u05D0\u05D5\u05D5\u05D9\u05E8. \u05E9\u05D0\u05DC\u05D5 \u05D0\u05EA \u05D1\u05E2\u05DC \u05D4\u05D0\u05EA\u05E8: "\u05D2\u05E8\u05E1\u05D4 {n} \u05DE\u05D5\u05DB\u05E0\u05D4. \u05DC\u05D4\u05E2\u05DC\u05D5\u05EA \u05D0\u05D5\u05EA\u05D4 \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8?"',
|
|
22081
|
+
showPreview: " \u05E9\u05DC\u05D7\u05D5 \u05E7\u05D5\u05D3\u05DD \u05D0\u05EA \u05D4\u05EA\u05E6\u05D5\u05D2\u05D4 \u05D4\u05DE\u05E7\u05D3\u05D9\u05DE\u05D4: {url}",
|
|
21945
22082
|
notPublished: "\u05E2\u05D3\u05D9\u05D9\u05DF \u05DC\u05D0 \u05D1\u05D0\u05D5\u05D5\u05D9\u05E8",
|
|
21946
22083
|
none: "\u05D0\u05D9\u05DF",
|
|
21947
22084
|
buildingNow: "\u05D1\u05D5\u05E0\u05D9\u05DD \u05E2\u05DB\u05E9\u05D9\u05D5",
|
|
21948
22085
|
idle: "\u05E4\u05E0\u05D5\u05D9",
|
|
21949
22086
|
envListTitle: "\u05DE\u05E9\u05EA\u05E0\u05D9\u05DD",
|
|
21950
|
-
envNone: "\u05DC\u05D0\u05EA\u05E8 \u05D4\u05D6\u05D4 \u05E2\u05D5\u05D3 \u05D0\u05D9\u05DF \u05DE\u05E9\u05EA\u05E0\u05D9\u05DD. \u05D4\u05D5\u05E1\u05D9\u05E4\u05D5 \u05D0\u05D7\u05D3: npx deployai@latest env set <
|
|
22087
|
+
envNone: "\u05DC\u05D0\u05EA\u05E8 \u05D4\u05D6\u05D4 \u05E2\u05D5\u05D3 \u05D0\u05D9\u05DF \u05DE\u05E9\u05EA\u05E0\u05D9\u05DD. \u05D4\u05D5\u05E1\u05D9\u05E4\u05D5 \u05D0\u05D7\u05D3: npx deployai@latest env set <KEY> <value>",
|
|
21951
22088
|
envSecret: "\u05E1\u05D5\u05D3",
|
|
21952
22089
|
envPlain: "\u05D2\u05DC\u05D5\u05D9",
|
|
21953
|
-
envNeedValue: '\u05DB\u05EA\u05D1\u05D5 \u05D0\u05EA \u05D4\u05E2\u05E8\u05DA \u05D0\u05D7\u05E8\u05D9 \u05D4\u05E9\u05DD, \u05D0\u05D5 \u05D4\u05E2\u05D1\u05D9\u05E8\u05D5 \u05D0\u05D5\u05EA\u05D5 \u05D1\u05E6\u05D9\u05E0\u05D5\u05E8: echo "<value>" | npx deployai@latest env set <
|
|
22090
|
+
envNeedValue: '\u05DB\u05EA\u05D1\u05D5 \u05D0\u05EA \u05D4\u05E2\u05E8\u05DA \u05D0\u05D7\u05E8\u05D9 \u05D4\u05E9\u05DD, \u05D0\u05D5 \u05D4\u05E2\u05D1\u05D9\u05E8\u05D5 \u05D0\u05D5\u05EA\u05D5 \u05D1\u05E6\u05D9\u05E0\u05D5\u05E8: echo "<value>" | npx deployai@latest env set <KEY>',
|
|
21954
22091
|
envSavedSecret: "\u05E9\u05DE\u05E8\u05E0\u05D5 \u05D0\u05EA {key} \u05DB\u05E1\u05D5\u05D3 \u05D1\u05D0\u05EA\u05E8 \u05D4\u05D7\u05D9. \u05D4\u05E2\u05E8\u05DA \u05DC\u05D0 \u05E0\u05E9\u05DE\u05E8 \u05D0\u05E6\u05DC\u05E0\u05D5 \u05D5\u05DC\u05D0 \u05D9\u05D5\u05E6\u05D2 \u05E9\u05D5\u05D1.",
|
|
21955
22092
|
envSavedPlain: "\u05E9\u05DE\u05E8\u05E0\u05D5 \u05D0\u05EA {key}. \u05D4\u05D0\u05EA\u05E8 \u05D4\u05D7\u05D9 \u05D9\u05E7\u05D1\u05DC \u05D0\u05D5\u05EA\u05D5 \u05EA\u05D5\u05DA \u05DB\u05D3\u05E7\u05D4.",
|
|
21956
22093
|
envRemoved: "\u05D4\u05E1\u05E8\u05E0\u05D5 \u05D0\u05EA {key}. \u05D4\u05D5\u05D0 \u05D9\u05D9\u05E2\u05DC\u05DD \u05DE\u05D4\u05D0\u05EA\u05E8 \u05D4\u05D7\u05D9 \u05EA\u05D5\u05DA \u05DB\u05D3\u05E7\u05D4.",
|
|
21957
22094
|
guestNoEnv: "\u05DC\u05D0\u05EA\u05E8 \u05D6\u05DE\u05E0\u05D9 \u05D0\u05D9\u05DF \u05DE\u05E9\u05EA\u05E0\u05D9 \u05E1\u05D1\u05D9\u05D1\u05D4. \u05E9\u05DE\u05E8\u05D5 \u05D0\u05D5\u05EA\u05D5 \u05DC\u05D7\u05E9\u05D1\u05D5\u05DF \u05E7\u05D5\u05D3\u05DD: npx deployai@latest claim",
|
|
21958
|
-
envInvalidKey: "\u05E9\u05DD \u05DE\u05E9\u05EA\u05E0\u05D4: \u05D0\u05D5\u05EA\u05D9\u05D5\u05EA \u05D1\u05D0\u05E0\u05D2\u05DC\u05D9\u05EA, \u05E1\u05E4\u05E8\u05D5\u05EA \u05D5-_, \
|
|
21959
|
-
envTooLong: "\u05D4\u05E2\u05E8\u05DA \u05D2\u05D3\u05D5\u05DC \u05DE
|
|
22095
|
+
envInvalidKey: "\u05E9\u05DD \u05DE\u05E9\u05EA\u05E0\u05D4: \u05D0\u05D5\u05EA\u05D9\u05D5\u05EA \u05D2\u05D3\u05D5\u05DC\u05D5\u05EA \u05D1\u05D0\u05E0\u05D2\u05DC\u05D9\u05EA, \u05E1\u05E4\u05E8\u05D5\u05EA \u05D5-_, \u05DE\u05EA\u05D7\u05D9\u05DC \u05D1\u05D0\u05D5\u05EA, \u05E2\u05D3 64 \u05EA\u05D5\u05D5\u05D9\u05DD, \u05DB\u05DE\u05D5 STRIPE_KEY.",
|
|
22096
|
+
envTooLong: "\u05D4\u05E2\u05E8\u05DA \u05D2\u05D3\u05D5\u05DC \u05DE\u05BE5KB, \u05D0\u05E8\u05D5\u05DA \u05DE\u05D3\u05D9 \u05DC\u05DE\u05E9\u05EA\u05E0\u05D4.",
|
|
21960
22097
|
envSendFailed: "\u05D4\u05E1\u05D5\u05D3 \u05DC\u05D0 \u05D4\u05D2\u05D9\u05E2 \u05DC\u05D0\u05EA\u05E8. \u05E0\u05E1\u05D5 \u05E9\u05D5\u05D1 \u05D1\u05E2\u05D5\u05D3 \u05D3\u05E7\u05D4.",
|
|
21961
22098
|
envNoKey: "\u05DC\u05D0\u05EA\u05E8 \u05D0\u05D9\u05DF \u05DE\u05E9\u05EA\u05E0\u05D4 \u05D1\u05E9\u05DD \u05D4\u05D6\u05D4. \u05DC\u05E8\u05E9\u05D9\u05DE\u05D4: npx deployai@latest env list",
|
|
21962
22099
|
buildFailed: "\u05D4\u05D1\u05E0\u05D9\u05D9\u05D4 \u05E9\u05DC v{n} \u05E0\u05DB\u05E9\u05DC\u05D4. \u05D4\u05D0\u05EA\u05E8 \u05D4\u05D7\u05D9 \u05DC\u05D0 \u05D4\u05E9\u05EA\u05E0\u05D4.",
|
|
22100
|
+
wentBack: "v{n} \u05E2\u05DC\u05EA\u05D4 \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8 \u05D0\u05D1\u05DC \u05DC\u05D0 \u05E2\u05E0\u05EA\u05D4 ({reason}), \u05D5\u05DC\u05DB\u05DF v{prev} \u05D7\u05D6\u05E8\u05D4 \u05DC\u05D1\u05D3. \u05EA\u05E7\u05E0\u05D5 \u05D0\u05EA \u05D4\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D5\u05D4\u05E2\u05DC\u05D5 \u05E9\u05D5\u05D1.",
|
|
22101
|
+
goingLive: "v{n} \u05E2\u05D5\u05DC\u05D4 \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8 \u05E2\u05DB\u05E9\u05D9\u05D5. \u05D4\u05E8\u05D9\u05E6\u05D5 status \u05E9\u05D5\u05D1 \u05D1\u05E2\u05D5\u05D3 \u05DB\u05DE\u05D4 \u05E9\u05E0\u05D9\u05D5\u05EA.",
|
|
21963
22102
|
buildLogTail: "\u05E1\u05D5\u05E3 \u05D9\u05D5\u05DE\u05DF \u05D4\u05D1\u05E0\u05D9\u05D9\u05D4:",
|
|
21964
|
-
buildFixHint: '\u05EA\u05E7\u05E0\u05D5 \u05D0\u05EA \u05D4\u05E9\u05D2\u05D9\u05D0\u05D4 \u05E9\u05DC\u05DE\u05E2\u05DC\u05D4, \u05D5\u05D0\u05D6 \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest check, \u05D5\u05D0\u05D7\u05E8\u05D9\u05D5 npx deployai@latest deploy -m "<message>"',
|
|
22103
|
+
buildFixHint: '\u05EA\u05E7\u05E0\u05D5 \u05D0\u05EA \u05D4\u05E9\u05D2\u05D9\u05D0\u05D4 \u05E9\u05DC\u05DE\u05E2\u05DC\u05D4, \u05D5\u05D0\u05D6 \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest check, \u05D5\u05D0\u05D7\u05E8\u05D9\u05D5 npx deployai@latest deploy -m "<message>" --fixed "<one sentence: what you changed, no code>"',
|
|
22104
|
+
buildFixHintNoNote: '\u05EA\u05E7\u05E0\u05D5 \u05D0\u05EA \u05D4\u05E9\u05D2\u05D9\u05D0\u05D4 \u05E9\u05DC\u05DE\u05E2\u05DC\u05D4, \u05D5\u05D0\u05D6 \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest check, \u05D5\u05D0\u05D7\u05E8\u05D9\u05D5 npx deployai@latest deploy -m "<message>"',
|
|
21965
22105
|
linkedTo: "\u05DE\u05D7\u05D5\u05D1\u05E8 \u05DC {name} ({slug}).",
|
|
21966
22106
|
loginTitle: "DeployAI login",
|
|
21967
22107
|
browserOpened: "\u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05E0\u05E4\u05EA\u05D7. \u05D0\u05E9\u05E8\u05D5 \u05E9\u05DD \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3.",
|
|
@@ -21972,17 +22112,17 @@ var M = {
|
|
|
21972
22112
|
help: "\u05E2\u05D6\u05E8\u05D4",
|
|
21973
22113
|
notLoggedIn: "\u05DC\u05D0 \u05DE\u05D7\u05D5\u05D1\u05E8\u05D9\u05DD. \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest login",
|
|
21974
22114
|
sessionExpired: "\u05DC\u05D0 \u05DE\u05D7\u05D5\u05D1\u05E8\u05D9\u05DD, \u05D0\u05D5 \u05E9\u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05E4\u05D2. \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest login",
|
|
21975
|
-
siteDeleted: "\u05D4\u05D0\u05EA\u05E8 \u05E0\u05DE\u05D7\u05E7 \u05D1\
|
|
22115
|
+
siteDeleted: "\u05D4\u05D0\u05EA\u05E8 \u05E0\u05DE\u05D7\u05E7 \u05D1\u05DC\u05D5\u05D7 \u05D4\u05D1\u05E7\u05E8\u05D4 \u05E9\u05DC DeployAI. \u05D1\u05E2\u05DC \u05D4\u05D0\u05EA\u05E8 \u05D9\u05DB\u05D5\u05DC \u05DC\u05E9\u05D7\u05D6\u05E8 \u05D0\u05D5\u05EA\u05D5 \u05DE\u05DC\u05D5\u05D7 \u05D4\u05D1\u05E7\u05E8\u05D4 (\u05D4\u05D0\u05EA\u05E8\u05D9\u05DD \u05E9\u05DC\u05D9, \u05D0\u05EA\u05E8\u05D9\u05DD \u05E9\u05E0\u05DE\u05D7\u05E7\u05D5) \u05EA\u05D5\u05DA 7 \u05D9\u05DE\u05D9\u05DD. \u05DB\u05D3\u05D9 \u05DC\u05D4\u05E2\u05DC\u05D5\u05EA \u05DC\u05D0\u05EA\u05E8 \u05D0\u05D7\u05E8, \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest link",
|
|
21976
22116
|
notEntitled: "\u05DC\u05D0\u05EA\u05E8 \u05D4\u05D6\u05D4 \u05D0\u05D9\u05DF \u05D0\u05EA \u05D4\u05EA\u05D5\u05E1\u05E3 \u05D4\u05D6\u05D4. \u05D1\u05E2\u05DC \u05D4\u05D0\u05EA\u05E8 \u05D9\u05DB\u05D5\u05DC \u05DC\u05E7\u05E0\u05D5\u05EA \u05D0\u05D5\u05EA\u05D5 \u05DC\u05D0\u05EA\u05E8 \u05DB\u05D0\u05DF: {url}",
|
|
21977
22117
|
forbidden: "\u05D4\u05D7\u05E9\u05D1\u05D5\u05DF \u05D4\u05D6\u05D4 \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC \u05DC\u05E9\u05E0\u05D5\u05EA \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8 \u05D4\u05D6\u05D4. \u05D1\u05D3\u05E7\u05D5 \u05E9\u05E0\u05DB\u05E0\u05E1\u05EA\u05DD \u05E2\u05DD \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF \u05E9\u05D4\u05D0\u05EA\u05E8 \u05E9\u05D9\u05D9\u05DA \u05DC\u05D5.",
|
|
21978
22118
|
notFound: "DeployAI \u05DC\u05D0 \u05DE\u05E6\u05D0 \u05D0\u05EA \u05D6\u05D4, \u05D0\u05D5 \u05E9\u05D4\u05D7\u05E9\u05D1\u05D5\u05DF \u05D4\u05D6\u05D4 \u05DC\u05D0 \u05E8\u05D5\u05D0\u05D4 \u05D0\u05EA \u05D6\u05D4. \u05D1\u05D3\u05E7\u05D5 \u05D0\u05EA \u05D4\u05E9\u05DD \u05D0\u05D5 \u05D4\u05E7\u05D9\u05E9\u05D5\u05E8, \u05D5\u05E9\u05E0\u05DB\u05E0\u05E1\u05EA\u05DD \u05E2\u05DD \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF \u05E9\u05D9\u05E6\u05E8 \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8: npx deployai@latest whoami",
|
|
21979
|
-
badArchive: "\u05D4\u05D4\u05E2\u05DC\u05D0\u05D4 \u05D4\u05D2\u05D9\u05E2\u05D4 \u05E4\u05D2\u05D5\u05DE\u05D4 \u05D0\u05D5 \u05E8\u05D9\u05E7\u05D4. \u05D4\u05E8\u05D9\u05E6\u05D5 \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D0\u05D5\u05EA\u05D4 \u05E4\u05E7\u05D5\u05D3\u05D4. \u05D0\u05DD \u05D6\u05D4 \u05D7\u05D5\u05D6\u05E8, \u05E2\u05D3\u05DB\u05E0\u05D5 \u05D0\u05EA \u05D4
|
|
21980
|
-
invalidRequest: "DeployAI \u05DC\u05D0 \u05E7\u05D9\u05D1\u05DC \u05D0\u05EA \u05D4\u05D1\u05E7\u05E9\u05D4. \u05D4\u05E8\u05D9\u05E6\u05D5 \u05D0\u05D5\u05EA\u05D4 \u05E9\u05D5\u05D1 \u05E2\u05DD \u05D4
|
|
22119
|
+
badArchive: "\u05D4\u05D4\u05E2\u05DC\u05D0\u05D4 \u05D4\u05D2\u05D9\u05E2\u05D4 \u05E4\u05D2\u05D5\u05DE\u05D4 \u05D0\u05D5 \u05E8\u05D9\u05E7\u05D4. \u05D4\u05E8\u05D9\u05E6\u05D5 \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D0\u05D5\u05EA\u05D4 \u05E4\u05E7\u05D5\u05D3\u05D4. \u05D0\u05DD \u05D6\u05D4 \u05D7\u05D5\u05D6\u05E8, \u05E2\u05D3\u05DB\u05E0\u05D5 \u05D0\u05EA \u05D4\u05BECLI: npx deployai@latest",
|
|
22120
|
+
invalidRequest: "DeployAI \u05DC\u05D0 \u05E7\u05D9\u05D1\u05DC \u05D0\u05EA \u05D4\u05D1\u05E7\u05E9\u05D4. \u05D4\u05E8\u05D9\u05E6\u05D5 \u05D0\u05D5\u05EA\u05D4 \u05E9\u05D5\u05D1 \u05E2\u05DD \u05D4\u05BECLI \u05D4\u05E2\u05D3\u05DB\u05E0\u05D9: npx deployai@latest",
|
|
21981
22121
|
invalidEmail: "\u05DB\u05EA\u05D5\u05D1\u05EA \u05D4\u05DE\u05D9\u05D9\u05DC \u05DC\u05D0 \u05EA\u05E7\u05D9\u05E0\u05D4. \u05D1\u05D3\u05E7\u05D5 \u05D0\u05D5\u05EA\u05D4 \u05D5\u05D4\u05E8\u05D9\u05E6\u05D5 \u05E9\u05D5\u05D1.",
|
|
21982
22122
|
emailSet: "\u05DB\u05D1\u05E8 \u05D4\u05D5\u05D2\u05D3\u05E8 \u05DE\u05D9\u05D9\u05DC \u05EA\u05D6\u05DB\u05D5\u05E8\u05EA \u05DC\u05D0\u05EA\u05E8 \u05D4\u05D6\u05D4.",
|
|
21983
22123
|
addonsClosed: "\u05D4\u05EA\u05D5\u05E1\u05E4\u05D9\u05DD \u05E2\u05D5\u05D3 \u05DC\u05D0 \u05E4\u05EA\u05D5\u05D7\u05D9\u05DD, \u05D5\u05DC\u05DB\u05DF \u05D0\u05D9 \u05D0\u05E4\u05E9\u05E8 \u05DC\u05D4\u05E8\u05D9\u05E5 \u05D0\u05EA \u05D6\u05D4 \u05E2\u05DB\u05E9\u05D9\u05D5.",
|
|
21984
|
-
timeout: "DeployAI \u05DC\u05D0 \u05E2\u05E0\u05D4 \u05D1\u05D6\u05DE\u05DF \u05D1
|
|
21985
|
-
unreachable: "\u05D0\u05D9\u05DF \u05D7\u05D9\u05D1\u05D5\u05E8 \u05DC
|
|
22124
|
+
timeout: "DeployAI \u05DC\u05D0 \u05E2\u05E0\u05D4 \u05D1\u05D6\u05DE\u05DF \u05D1\u05BE{url}. \u05D1\u05D3\u05E7\u05D5 \u05D0\u05EA \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D5\u05D4\u05E8\u05D9\u05E6\u05D5 \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D0\u05D5\u05EA\u05D4 \u05E4\u05E7\u05D5\u05D3\u05D4.",
|
|
22125
|
+
unreachable: "\u05D0\u05D9\u05DF \u05D7\u05D9\u05D1\u05D5\u05E8 \u05DC\u05BEDeployAI \u05D1\u05BE{url}. \u05D1\u05D3\u05E7\u05D5 \u05D0\u05EA \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D5\u05D4\u05E8\u05D9\u05E6\u05D5 \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D0\u05D5\u05EA\u05D4 \u05E4\u05E7\u05D5\u05D3\u05D4.",
|
|
21986
22126
|
noProjectNamed: "\u05D0\u05D9\u05DF \u05D0\u05EA\u05E8 \u05D1\u05E9\u05DD {name}. \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest link",
|
|
21987
22127
|
noNameGiven: "\u05DC\u05D0 \u05E0\u05D1\u05D7\u05E8 \u05E9\u05DD.",
|
|
21988
22128
|
noProjectPicked: "\u05DC\u05D0 \u05E0\u05D1\u05D7\u05E8 \u05D0\u05EA\u05E8.",
|
|
@@ -21991,7 +22131,7 @@ var M = {
|
|
|
21991
22131
|
sampleDownloadFailed: "\u05DC\u05D0 \u05D4\u05E6\u05DC\u05D7\u05E0\u05D5 \u05DC\u05D4\u05D5\u05E8\u05D9\u05D3 \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8 \u05DC\u05D3\u05D5\u05D2\u05DE\u05D4 {key} (HTTP {status}). \u05D4\u05E8\u05D9\u05E6\u05D5 \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D0\u05D5\u05EA\u05D4 \u05E4\u05E7\u05D5\u05D3\u05D4.",
|
|
21992
22132
|
sampleTooLarge: "\u05D4\u05D4\u05D5\u05E8\u05D3\u05D4 \u05E9\u05DC \u05D4\u05D0\u05EA\u05E8 \u05DC\u05D3\u05D5\u05D2\u05DE\u05D4 \u05D2\u05D3\u05D5\u05DC\u05D4 \u05DE\u05D3\u05D9.",
|
|
21993
22133
|
noSampleNamed: "\u05D0\u05D9\u05DF \u05D0\u05EA\u05E8 \u05DC\u05D3\u05D5\u05D2\u05DE\u05D4 \u05D1\u05E9\u05DD {key}. \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest samples",
|
|
21994
|
-
unknownSample: "\u05D4
|
|
22134
|
+
unknownSample: "\u05D4\u05BECLI \u05D4\u05D6\u05D4 \u05DC\u05D0 \u05DE\u05DB\u05D9\u05E8 \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8 \u05DC\u05D3\u05D5\u05D2\u05DE\u05D4 {key}. \u05D4\u05E8\u05D9\u05E6\u05D5 \u05D0\u05D5\u05EA\u05D5 \u05E2\u05DD npx deployai@latest.",
|
|
21995
22135
|
loginNoToken: "\u05D4\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05D0\u05D5\u05E9\u05E8\u05D4 \u05D0\u05D1\u05DC \u05DC\u05D0 \u05D7\u05D6\u05E8 \u05DE\u05E4\u05EA\u05D7. \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest login",
|
|
21996
22136
|
rateLimited: "\u05D9\u05D5\u05EA\u05E8 \u05DE\u05D3\u05D9 \u05E0\u05D9\u05E1\u05D9\u05D5\u05E0\u05D5\u05EA \u05D1\u05D6\u05DE\u05DF \u05E7\u05E6\u05E8. \u05D7\u05DB\u05D5 \u05D3\u05E7\u05D4 \u05D5\u05E0\u05E1\u05D5 \u05E9\u05D5\u05D1.",
|
|
21997
22137
|
apiError: "DeployAI \u05DC\u05D0 \u05D4\u05E6\u05DC\u05D9\u05D7 \u05DC\u05E2\u05E9\u05D5\u05EA \u05D0\u05EA \u05D6\u05D4 \u05E2\u05DB\u05E9\u05D9\u05D5 ({code}). \u05E0\u05E1\u05D5 \u05E9\u05D5\u05D1 \u05D1\u05E2\u05D5\u05D3 \u05D3\u05E7\u05D4.",
|
|
@@ -22013,7 +22153,7 @@ var M = {
|
|
|
22013
22153
|
uploadTooLargeGuest: "\u05D4\u05D4\u05E2\u05DC\u05D0\u05D4 \u05D2\u05D3\u05D5\u05DC\u05D4 \u05DE\u05D3\u05D9 \u05DC\u05D0\u05EA\u05E8 \u05D1\u05DC\u05D9 \u05D7\u05E9\u05D1\u05D5\u05DF: {size} \u05D0\u05D7\u05E8\u05D9 \u05DB\u05D9\u05D5\u05D5\u05E5, \u05D4\u05DE\u05E7\u05E1\u05D9\u05DE\u05D5\u05DD {max}. \u05D4\u05EA\u05D7\u05D1\u05E8\u05D5 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05E2\u05DC\u05D5\u05EA \u05D9\u05D5\u05EA\u05E8: npx deployai@latest login",
|
|
22014
22154
|
notLinked: "\u05D4\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D4\u05D6\u05D5 \u05DC\u05D0 \u05DE\u05D7\u05D5\u05D1\u05E8\u05EA \u05DC\u05D0\u05EA\u05E8. \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest link",
|
|
22015
22155
|
askGuest: "\u05DC\u05D4\u05E2\u05DC\u05D5\u05EA \u05D1\u05DC\u05D9 \u05D7\u05E9\u05D1\u05D5\u05DF? \u05EA\u05E7\u05D1\u05DC\u05D5 \u05D0\u05EA\u05E8 \u05D6\u05DE\u05E0\u05D9 \u05E9\u05D0\u05E4\u05E9\u05E8 \u05DC\u05E9\u05DE\u05D5\u05E8 \u05D0\u05D7\u05E8 \u05DB\u05DA. (y/N) ",
|
|
22016
|
-
inviteOnly: "\u05D4\u05E2\u05DC\u05D0\u05D4 \u05D1\u05DC\u05D9 \u05D7\u05E9\u05D1\u05D5\u05DF \u05DE\u05D5\u05E9\u05D4\u05D9\u05EA \u05DB\u05DC \u05E2\u05D5\u05D3 \u05D4\u05D4\u05E8\u05E9\u05DE\u05D4 \u05DC
|
|
22156
|
+
inviteOnly: "\u05D4\u05E2\u05DC\u05D0\u05D4 \u05D1\u05DC\u05D9 \u05D7\u05E9\u05D1\u05D5\u05DF \u05DE\u05D5\u05E9\u05D4\u05D9\u05EA \u05DB\u05DC \u05E2\u05D5\u05D3 \u05D4\u05D4\u05E8\u05E9\u05DE\u05D4 \u05DC\u05BEDeployAI \u05D1\u05D4\u05D6\u05DE\u05E0\u05D4 \u05D1\u05DC\u05D1\u05D3. \u05D0\u05DD \u05D9\u05E9 \u05DC\u05DB\u05DD \u05D7\u05E9\u05D1\u05D5\u05DF \u05D0\u05D5 \u05D4\u05D6\u05DE\u05E0\u05D4, \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest login",
|
|
22017
22157
|
guestOneSite: "\u05D0\u05EA\u05E8 \u05D6\u05DE\u05E0\u05D9 \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC \u05DC\u05D9\u05E6\u05D5\u05E8 \u05D0\u05EA\u05E8\u05D9\u05DD \u05E0\u05D5\u05E1\u05E4\u05D9\u05DD. \u05E7\u05D5\u05D3\u05DD \u05E9\u05DE\u05E8\u05D5 \u05D0\u05D5\u05EA\u05D5 \u05D1\u05D7\u05E9\u05D1\u05D5\u05DF \u05D7\u05D9\u05E0\u05DD: npx deployai@latest claim",
|
|
22018
22158
|
siteLimit: "\u05D4\u05DE\u05E1\u05DC\u05D5\u05DC \u05E9\u05DC\u05DB\u05DD \u05DE\u05D0\u05E4\u05E9\u05E8 {max} \u05D0\u05EA\u05E8\u05D9\u05DD, \u05D5\u05DB\u05D5\u05DC\u05DD \u05D1\u05E9\u05D9\u05DE\u05D5\u05E9. \u05E2\u05D3\u05DB\u05E0\u05D5 \u05D0\u05D7\u05D3 \u05DE\u05D4\u05DD \u05D1\u05DE\u05E7\u05D5\u05DD (npx deployai@latest link), \u05D0\u05D5 \u05E9\u05D3\u05E8\u05D2\u05D5 \u05D0\u05EA \u05D4\u05DE\u05E1\u05DC\u05D5\u05DC: {url}",
|
|
22019
22159
|
siteLimitNoMax: "\u05D1\u05DE\u05E1\u05DC\u05D5\u05DC \u05E9\u05DC\u05DB\u05DD \u05D0\u05D9\u05DF \u05DE\u05E7\u05D5\u05DD \u05DC\u05D0\u05EA\u05E8 \u05E0\u05D5\u05E1\u05E3. \u05E2\u05D3\u05DB\u05E0\u05D5 \u05D0\u05D7\u05D3 \u05DE\u05D4\u05D0\u05EA\u05E8\u05D9\u05DD \u05E9\u05DC\u05DB\u05DD \u05D1\u05DE\u05E7\u05D5\u05DD (npx deployai@latest link), \u05D0\u05D5 \u05E9\u05D3\u05E8\u05D2\u05D5 \u05D0\u05EA \u05D4\u05DE\u05E1\u05DC\u05D5\u05DC: {url}",
|
|
@@ -22023,10 +22163,18 @@ var M = {
|
|
|
22023
22163
|
startExpired: "\u05E4\u05D2 \u05D4\u05EA\u05D5\u05E7\u05E3 \u05E9\u05DC \u05D4\u05D4\u05D5\u05E8\u05D0\u05D5\u05EA \u05D4\u05D0\u05DC\u05D4 (\u05D4\u05DF \u05EA\u05E7\u05E4\u05D5\u05EA 7 \u05D9\u05DE\u05D9\u05DD). \u05D4\u05E2\u05EA\u05D9\u05E7\u05D5 \u05D0\u05D5\u05EA\u05DF \u05E9\u05D5\u05D1 \u05DE\u05D4\u05D0\u05EA\u05E8 \u05E9\u05DC DeployAI.",
|
|
22024
22164
|
startUsedUp: "\u05DB\u05D1\u05E8 \u05D4\u05E9\u05EA\u05DE\u05E9\u05D5 \u05D1\u05D4\u05D5\u05E8\u05D0\u05D5\u05EA \u05D4\u05D0\u05DC\u05D4 5 \u05E4\u05E2\u05DE\u05D9\u05DD. \u05D4\u05E2\u05EA\u05D9\u05E7\u05D5 \u05D0\u05D5\u05EA\u05DF \u05E9\u05D5\u05D1 \u05DE\u05D4\u05D0\u05EA\u05E8 \u05E9\u05DC DeployAI.",
|
|
22025
22165
|
loginExpired: "\u05E7\u05D5\u05D3 \u05D4\u05DB\u05E0\u05D9\u05E1\u05D4 \u05E4\u05D2. \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest login",
|
|
22026
|
-
loggedOut: "\u05D4\u05EA\u05E0\u05EA\u05E7\u05EA\u05DD. \u05D4\u05D8\u05D5\u05E7\u05DF \u05E0\u05DE\u05D7\u05E7 \u05DE\u05D4\u05DE\u05D7\u05E9\u05D1 \u05D4\u05D6\u05D4.",
|
|
22027
|
-
protocol: "\u05EA\u05E9\u05D5\u05D1\u05D4 \u05DC\u05D0 \u05E6\u05E4\u05D5\u05D9\u05D4 \u05DE
|
|
22166
|
+
loggedOut: "\u05D4\u05EA\u05E0\u05EA\u05E7\u05EA\u05DD. \u05D4\u05D8\u05D5\u05E7\u05DF \u05D1\u05D5\u05D8\u05DC \u05D5\u05E0\u05DE\u05D7\u05E7 \u05DE\u05D4\u05DE\u05D7\u05E9\u05D1 \u05D4\u05D6\u05D4.",
|
|
22167
|
+
protocol: "\u05EA\u05E9\u05D5\u05D1\u05D4 \u05DC\u05D0 \u05E6\u05E4\u05D5\u05D9\u05D4 \u05DE\u05BEDeployAI. \u05D4\u05E8\u05D9\u05E6\u05D5 \u05D0\u05EA \u05D4\u05D2\u05E8\u05E1\u05D4 \u05D4\u05D0\u05D7\u05E8\u05D5\u05E0\u05D4: npx deployai@latest",
|
|
22028
22168
|
guestClaimFirst: "\u05D1\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D4\u05D6\u05D5 \u05D9\u05E9 \u05D0\u05EA\u05E8 \u05D6\u05DE\u05E0\u05D9, \u05D5\u05D0\u05EA\u05DD \u05DE\u05D7\u05D5\u05D1\u05E8\u05D9\u05DD \u05DC\u05D7\u05E9\u05D1\u05D5\u05DF. \u05E7\u05D5\u05D3\u05DD \u05E9\u05DE\u05E8\u05D5 \u05D0\u05EA \u05D4\u05D0\u05EA\u05E8 \u05D1\u05D7\u05E9\u05D1\u05D5\u05DF: {url}",
|
|
22029
|
-
guestClaimFirstNoLink: "\u05D1\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D4\u05D6\u05D5 \u05D9\u05E9 \u05D0\u05EA\u05E8 \u05D6\u05DE\u05E0\u05D9, \u05D5\u05D0\u05EA\u05DD \u05DE\u05D7\u05D5\u05D1\u05E8\u05D9\u05DD \u05DC\u05D7\u05E9\u05D1\u05D5\u05DF. \u05E7\u05D5\u05D3\u05DD \u05E9\u05DE\u05E8\u05D5 \u05D0\u05D5\u05EA\u05D5 \u05D1\u05D7\u05E9\u05D1\u05D5\u05DF \u05E2\u05DD \u05E7\u05D9\u05E9\u05D5\u05E8 \u05D4\u05E9\u05DE\u05D9\u05E8\u05D4 \u05E9
|
|
22169
|
+
guestClaimFirstNoLink: "\u05D1\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D4\u05D6\u05D5 \u05D9\u05E9 \u05D0\u05EA\u05E8 \u05D6\u05DE\u05E0\u05D9, \u05D5\u05D0\u05EA\u05DD \u05DE\u05D7\u05D5\u05D1\u05E8\u05D9\u05DD \u05DC\u05D7\u05E9\u05D1\u05D5\u05DF. \u05E7\u05D5\u05D3\u05DD \u05E9\u05DE\u05E8\u05D5 \u05D0\u05D5\u05EA\u05D5 \u05D1\u05D7\u05E9\u05D1\u05D5\u05DF \u05E2\u05DD \u05E7\u05D9\u05E9\u05D5\u05E8 \u05D4\u05E9\u05DE\u05D9\u05E8\u05D4 \u05E9\u05BEdeploy --guest \u05D4\u05D3\u05E4\u05D9\u05E1.",
|
|
22170
|
+
guestAccountSite: "\u05D4\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D4\u05D6\u05D5 \u05E9\u05D9\u05D9\u05DB\u05EA \u05DC\u05D0\u05EA\u05E8 \u05D1\u05D7\u05E9\u05D1\u05D5\u05DF, \u05D5\u05DC\u05DB\u05DF \u05D4\u05D9\u05D0 \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC\u05D4 \u05DC\u05E2\u05DC\u05D5\u05EA \u05DB\u05D0\u05EA\u05E8 \u05D6\u05DE\u05E0\u05D9. \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest login, \u05D5\u05D0\u05D6: npx deployai@latest deploy",
|
|
22171
|
+
sqlWaitingLine: "\u05E9\u05D9\u05E0\u05D5\u05D9\u05D9\u05DD \u05D1\u05DE\u05E1\u05D3 \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD (SQL) \u05DE\u05D7\u05DB\u05D9\u05DD \u05DC\u05D0\u05D9\u05E9\u05D5\u05E8 \u05E9\u05DC\u05DB\u05DD \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D4\u05D2\u05E8\u05E1\u05D4 \u05D4\u05D6\u05D5 \u05E2\u05D5\u05DC\u05D4 \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8: {url}",
|
|
22172
|
+
sqlWaiting: "\u05D1\u05D2\u05E8\u05E1\u05D4 \u05D4\u05D6\u05D5 \u05D9\u05E9 \u05E9\u05D9\u05E0\u05D5\u05D9\u05D9\u05DD \u05D1\u05DE\u05E1\u05D3 \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD (SQL) \u05E9\u05E2\u05D5\u05D3 \u05DC\u05D0 \u05E8\u05E6\u05D5. \u05D0\u05E9\u05E8\u05D5 \u05D0\u05D5\u05EA\u05DD \u05E7\u05D5\u05D3\u05DD \u05D1\u05DC\u05D5\u05D7 \u05D4\u05D1\u05E7\u05E8\u05D4, \u05D5\u05D0\u05D6 \u05D4\u05E2\u05DC\u05D5 \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8 \u05E9\u05D5\u05D1: {url}",
|
|
22173
|
+
tokenOtherApi: "\u05D4\u05DB\u05E0\u05D9\u05E1\u05D4 \u05D1\u05DE\u05D7\u05E9\u05D1 \u05D4\u05D6\u05D4 \u05D4\u05D9\u05D0 \u05DC {saved}, \u05DC\u05D0 \u05DC {url}. \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest login --api {url}, \u05D0\u05D5 \u05D4\u05D5\u05E8\u05D9\u05D3\u05D5 \u05D0\u05EA --api \u05D5\u05D0\u05EA DEPLOYAI_API_URL.",
|
|
22174
|
+
linkConfirm: "\u05DC\u05D7\u05D1\u05E8 \u05D0\u05EA \u05D4\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D4\u05D6\u05D5 \u05DC {name} ({address})? (y/N) ",
|
|
22175
|
+
linkOnlyOne: "\u05D9\u05E9 \u05DC\u05DB\u05DD \u05D0\u05EA\u05E8 \u05D0\u05D7\u05D3: {name} ({address}). \u05DB\u05D3\u05D9 \u05DC\u05D7\u05D1\u05E8 \u05D0\u05D5\u05EA\u05D5, \u05D0\u05D5 \u05D0\u05EA\u05E8 \u05D7\u05D3\u05E9, \u05D4\u05E8\u05D9\u05E6\u05D5:",
|
|
22176
|
+
linkCancelled: "\u05DC\u05D0 \u05D7\u05D5\u05D1\u05E8. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05D4\u05E9\u05EA\u05E0\u05D4.",
|
|
22177
|
+
loggedOutLocalOnly: "\u05D4\u05EA\u05E0\u05EA\u05E7\u05EA\u05DD \u05D1\u05DE\u05D7\u05E9\u05D1 \u05D4\u05D6\u05D4. \u05DC\u05D0 \u05D4\u05E6\u05DC\u05D7\u05E0\u05D5 \u05DC\u05D4\u05D2\u05D9\u05E2 \u05DC\u05BEDeployAI, \u05D0\u05D6 \u05D4\u05D8\u05D5\u05E7\u05DF \u05EA\u05E7\u05E3 \u05E2\u05D3 \u05E9\u05D9\u05E4\u05D5\u05D2 (30 \u05D9\u05D5\u05DD).",
|
|
22030
22178
|
savedIn: "\u05E0\u05E9\u05DE\u05E8 \u05D1 .deployai/project.json",
|
|
22031
22179
|
createdProject: "\u05E0\u05D5\u05E6\u05E8 \u05D4\u05D0\u05EA\u05E8 {name}.",
|
|
22032
22180
|
noProjects: "\u05D0\u05D9\u05DF \u05E2\u05D3\u05D9\u05D9\u05DF \u05D0\u05EA\u05E8\u05D9\u05DD.",
|
|
@@ -22036,8 +22184,8 @@ var M = {
|
|
|
22036
22184
|
runLinkPick: ' \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest link <slug>, \u05D0\u05D5: npx deployai@latest link --create "<name>"',
|
|
22037
22185
|
runLink: " \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest link",
|
|
22038
22186
|
nextSteps: "\u05D4\u05E9\u05DC\u05D1\u05D9\u05DD \u05D4\u05D1\u05D0\u05D9\u05DD",
|
|
22039
|
-
readme: "\u05D1
|
|
22040
|
-
states: { online: "\u05D1\u05D0\u05D5\u05D5\u05D9\u05E8", building: "\u05D1\u05D1\u05E0\u05D9\u05D9\u05D4", ready: "\u05DE\u05D7\u05DB\u05D4 \u05DC\u05D0\u05D9\u05E9\u05D5\u05E8", failed: "\u05E0\u05DB\u05E9\u05DC", paused: "\u05DE\u05D5\u05E9\u05D4\u05D4", off: "\u05DB\u05D1\u05D5\u05D9", queued: "\u05D1\u05EA\u05D5\u05E8", deleted: "\u05E0\u05DE\u05D7\u05E7", new: "\u05D7\u05D3\u05E9" }
|
|
22187
|
+
readme: "\u05D1\u05BEREADME.md \u05E9\u05D1\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05DB\u05EA\u05D5\u05D1 \u05DE\u05D4 \u05DB\u05DC \u05E7\u05D5\u05D1\u05E5 \u05E2\u05D5\u05E9\u05D4.",
|
|
22188
|
+
states: { online: "\u05D1\u05D0\u05D5\u05D5\u05D9\u05E8", building: "\u05D1\u05D1\u05E0\u05D9\u05D9\u05D4", ready: "\u05DE\u05D7\u05DB\u05D4 \u05DC\u05D0\u05D9\u05E9\u05D5\u05E8", failed: "\u05E0\u05DB\u05E9\u05DC", paused: "\u05DE\u05D5\u05E9\u05D4\u05D4", off: "\u05DB\u05D1\u05D5\u05D9", queued: "\u05D1\u05EA\u05D5\u05E8", replaced: "\u05D4\u05D5\u05D7\u05DC\u05E4\u05D4 \u05D1\u05D4\u05E2\u05DC\u05D0\u05D4 \u05D7\u05D3\u05E9\u05D4 \u05D9\u05D5\u05EA\u05E8", deleted: "\u05E0\u05DE\u05D7\u05E7", new: "\u05D7\u05D3\u05E9" }
|
|
22041
22189
|
}
|
|
22042
22190
|
};
|
|
22043
22191
|
function stateName(state, root) {
|
|
@@ -22050,7 +22198,7 @@ function messages(root) {
|
|
|
22050
22198
|
}
|
|
22051
22199
|
|
|
22052
22200
|
// src/version.ts
|
|
22053
|
-
var CLI_VERSION = "0.1.0-beta.
|
|
22201
|
+
var CLI_VERSION = "0.1.0-beta.11";
|
|
22054
22202
|
|
|
22055
22203
|
// src/api.ts
|
|
22056
22204
|
function apiContext(apiFlag) {
|
|
@@ -22062,6 +22210,8 @@ function userAgent(cfg) {
|
|
|
22062
22210
|
}
|
|
22063
22211
|
function requireToken(ctx) {
|
|
22064
22212
|
if (!ctx.config.token) throw new CliError(messages(process.cwd())("notLoggedIn"), 1, "auth");
|
|
22213
|
+
const saved = ctx.config.tokenApiUrl?.replace(/\/+$/, "");
|
|
22214
|
+
if (saved && saved !== ctx.apiUrl.replace(/\/+$/, "")) throw new CliError(messages(process.cwd())("tokenOtherApi", { saved, url: ctx.apiUrl }), 1, "auth");
|
|
22065
22215
|
return ctx.config.token;
|
|
22066
22216
|
}
|
|
22067
22217
|
async function apiRequest(ctx, path, schema, opts = {}) {
|
|
@@ -22106,6 +22256,9 @@ async function apiRequest(ctx, path, schema, opts = {}) {
|
|
|
22106
22256
|
if (parsed2.success && parsed2.data.error === "not_entitled") {
|
|
22107
22257
|
throw new CliError(t("notEntitled", { url: parsed2.data.buyUrl ?? ctx.apiUrl }), 1, "not_entitled");
|
|
22108
22258
|
}
|
|
22259
|
+
if (parsed2.success && parsed2.data.error === "sql_waiting") {
|
|
22260
|
+
throw new CliError(t("sqlWaiting", { url: parsed2.data.url ?? `${ctx.apiUrl}/dashboard` }), 1, "sql_waiting");
|
|
22261
|
+
}
|
|
22109
22262
|
const known = parsed2.success ? knownError(parsed2.data.error, data?.max, t, { ...data, billingUrl: `${ctx.apiUrl}/billing` }) : null;
|
|
22110
22263
|
if (known) throw new CliError(known, 1, parsed2.success ? parsed2.data.error : "api");
|
|
22111
22264
|
const msg = parsed2.success ? parsed2.data.error : `HTTP ${res.status}`;
|
|
@@ -22208,7 +22361,8 @@ var TELEMETRY_SENT = [
|
|
|
22208
22361
|
"Linked project id, detected framework and version",
|
|
22209
22362
|
"After each check: compatible or not, blocker and warning codes (for example fs_write)",
|
|
22210
22363
|
"OS, architecture and Node version (in the request header)",
|
|
22211
|
-
"Your user id, only after login (from the login token)"
|
|
22364
|
+
"Your user id, only after login (from the login token)",
|
|
22365
|
+
"After a failed version, the one sentence you pass with deploy --fixed (what you changed, no code)"
|
|
22212
22366
|
];
|
|
22213
22367
|
var TELEMETRY_NEVER_SENT = [
|
|
22214
22368
|
"Source code or file contents",
|
|
@@ -22274,22 +22428,20 @@ async function sendTelemetryEvent(ctx, event) {
|
|
|
22274
22428
|
}
|
|
22275
22429
|
|
|
22276
22430
|
// src/commands/init.ts
|
|
22277
|
-
import { existsSync as
|
|
22431
|
+
import { appendFileSync, existsSync as existsSync5, readFileSync as readFileSync5, writeFileSync as writeFileSync3 } from "fs";
|
|
22278
22432
|
import { join as join5 } from "path";
|
|
22279
22433
|
|
|
22280
22434
|
// src/analyze.ts
|
|
22281
22435
|
import { execFileSync } from "child_process";
|
|
22282
|
-
import { existsSync as
|
|
22436
|
+
import { existsSync as existsSync4, readFileSync as readFileSync4, readdirSync as readdirSync2 } from "fs";
|
|
22283
22437
|
import { join as join4 } from "path";
|
|
22284
22438
|
|
|
22285
22439
|
// src/files.ts
|
|
22286
|
-
import { readdirSync, readFileSync as readFileSync3, lstatSync } from "fs";
|
|
22440
|
+
import { existsSync as existsSync3, readdirSync, readFileSync as readFileSync3, lstatSync } from "fs";
|
|
22287
22441
|
import { join as join3 } from "path";
|
|
22288
22442
|
var SKIP_DIRS = /* @__PURE__ */ new Set([
|
|
22289
22443
|
"node_modules",
|
|
22290
22444
|
".git",
|
|
22291
|
-
"dist",
|
|
22292
|
-
"build",
|
|
22293
22445
|
".next",
|
|
22294
22446
|
".astro",
|
|
22295
22447
|
".svelte-kit",
|
|
@@ -22297,9 +22449,19 @@ var SKIP_DIRS = /* @__PURE__ */ new Set([
|
|
|
22297
22449
|
".vercel",
|
|
22298
22450
|
".wrangler",
|
|
22299
22451
|
".turbo",
|
|
22300
|
-
".cache"
|
|
22301
|
-
"coverage"
|
|
22452
|
+
".cache"
|
|
22302
22453
|
]);
|
|
22454
|
+
var ROOT_BUILD_DIRS = /* @__PURE__ */ new Set(["dist", "build", "out", "coverage"]);
|
|
22455
|
+
function rootBuilds(root) {
|
|
22456
|
+
const file2 = join3(root, "package.json");
|
|
22457
|
+
if (!existsSync3(file2)) return false;
|
|
22458
|
+
try {
|
|
22459
|
+
const pkg = JSON.parse(readFileSync3(file2, "utf8"));
|
|
22460
|
+
return typeof pkg?.scripts?.build === "string";
|
|
22461
|
+
} catch {
|
|
22462
|
+
return true;
|
|
22463
|
+
}
|
|
22464
|
+
}
|
|
22303
22465
|
var MAX_FILE_BYTES = 10 * 1024 * 1024;
|
|
22304
22466
|
var MAX_TOTAL_BYTES = 50 * 1024 * 1024;
|
|
22305
22467
|
function isEnvFile(name) {
|
|
@@ -22370,10 +22532,19 @@ function loadIgnore(root) {
|
|
|
22370
22532
|
return [];
|
|
22371
22533
|
}
|
|
22372
22534
|
}
|
|
22535
|
+
function loadUploadIgnore(root) {
|
|
22536
|
+
let git = [];
|
|
22537
|
+
try {
|
|
22538
|
+
git = parseIgnore(readFileSync3(join3(root, ".gitignore"), "utf8"));
|
|
22539
|
+
} catch {
|
|
22540
|
+
}
|
|
22541
|
+
return [...git, ...loadIgnore(root)];
|
|
22542
|
+
}
|
|
22373
22543
|
function walkFiles(root, opts = {}) {
|
|
22374
22544
|
const result = [];
|
|
22375
22545
|
const maxFiles = opts.maxFiles ?? 2e4;
|
|
22376
22546
|
const rules = opts.ignore ?? [];
|
|
22547
|
+
const skipRootBuild = opts.skipRootBuild ?? rootBuilds(root);
|
|
22377
22548
|
const visit2 = (dirAbs, dirRel) => {
|
|
22378
22549
|
let names;
|
|
22379
22550
|
try {
|
|
@@ -22394,6 +22565,7 @@ function walkFiles(root, opts = {}) {
|
|
|
22394
22565
|
if (st.isSymbolicLink()) continue;
|
|
22395
22566
|
if (st.isDirectory()) {
|
|
22396
22567
|
if (SKIP_DIRS.has(name)) continue;
|
|
22568
|
+
if (!dirRel && skipRootBuild && ROOT_BUILD_DIRS.has(name)) continue;
|
|
22397
22569
|
if (isIgnored(rules, rel, true)) continue;
|
|
22398
22570
|
visit2(abs, rel);
|
|
22399
22571
|
} else if (st.isFile()) {
|
|
@@ -22407,12 +22579,12 @@ function walkFiles(root, opts = {}) {
|
|
|
22407
22579
|
return result;
|
|
22408
22580
|
}
|
|
22409
22581
|
function planUpload(root) {
|
|
22410
|
-
const all = walkFiles(root, { ignore:
|
|
22582
|
+
const all = walkFiles(root, { ignore: loadUploadIgnore(root), skipEnv: true, maxFiles: 1e5 });
|
|
22411
22583
|
const files = [];
|
|
22412
22584
|
const skippedLarge = [];
|
|
22413
22585
|
let totalBytes = 0;
|
|
22414
22586
|
for (const f of all) {
|
|
22415
|
-
if (f.rel
|
|
22587
|
+
if (neverUploadedFile(f.rel)) continue;
|
|
22416
22588
|
if (f.size > MAX_FILE_BYTES) {
|
|
22417
22589
|
skippedLarge.push(f);
|
|
22418
22590
|
continue;
|
|
@@ -22424,6 +22596,7 @@ function planUpload(root) {
|
|
|
22424
22596
|
}
|
|
22425
22597
|
|
|
22426
22598
|
// src/analyze.ts
|
|
22599
|
+
var INIT_FILES = /* @__PURE__ */ new Set(["DEPLOYAI.md", "AGENTS.md", "CLAUDE.md"]);
|
|
22427
22600
|
var CODE_EXT = /\.(js|jsx|ts|tsx|mjs|cjs|mts|cts|vue|svelte|astro)$/;
|
|
22428
22601
|
var SECRET_SCAN_EXT = /\.(js|jsx|ts|tsx|mjs|cjs|mts|cts|vue|svelte|astro|json|ya?ml|toml|html|prisma)$/;
|
|
22429
22602
|
var LOCKFILES = /* @__PURE__ */ new Set(["package-lock.json", "pnpm-lock.yaml", "yarn.lock", "bun.lock", "bun.lockb"]);
|
|
@@ -22501,10 +22674,10 @@ function depLine(pkgText, dep) {
|
|
|
22501
22674
|
return l ?? void 0;
|
|
22502
22675
|
}
|
|
22503
22676
|
function detectPackageManager(root, pkg) {
|
|
22504
|
-
if (
|
|
22505
|
-
if (
|
|
22506
|
-
if (
|
|
22507
|
-
if (
|
|
22677
|
+
if (existsSync4(join4(root, "pnpm-lock.yaml"))) return "pnpm";
|
|
22678
|
+
if (existsSync4(join4(root, "bun.lockb")) || existsSync4(join4(root, "bun.lock"))) return "bun";
|
|
22679
|
+
if (existsSync4(join4(root, "yarn.lock"))) return "yarn";
|
|
22680
|
+
if (existsSync4(join4(root, "package-lock.json"))) return "npm";
|
|
22508
22681
|
const pm = pkg?.packageManager?.split("@")[0];
|
|
22509
22682
|
if (pm === "pnpm" || pm === "yarn" || pm === "bun" || pm === "npm") return pm;
|
|
22510
22683
|
return pkg ? "npm" : "none";
|
|
@@ -22532,7 +22705,7 @@ function detectFramework2(root, pkg, files, sources) {
|
|
|
22532
22705
|
}
|
|
22533
22706
|
function detectLanguage(root, pkg, files) {
|
|
22534
22707
|
const deps = { ...pkg?.devDependencies ?? {}, ...pkg?.dependencies ?? {} };
|
|
22535
|
-
if (
|
|
22708
|
+
if (existsSync4(join4(root, "tsconfig.json")) || deps.typescript) return "TypeScript";
|
|
22536
22709
|
if (files.some((f) => /\.(ts|tsx|mts|cts)$/.test(f.rel) && !f.rel.endsWith(".d.ts"))) return "TypeScript";
|
|
22537
22710
|
if (files.some((f) => /\.(js|jsx|mjs|cjs)$/.test(f.rel)) || pkg) return "JavaScript";
|
|
22538
22711
|
return "HTML";
|
|
@@ -22549,7 +22722,7 @@ function isBuildTimeFile(rel) {
|
|
|
22549
22722
|
return /\.config\.(js|ts|mjs|cjs|mts|cts)$/.test(base) || /^(scripts|tools|tests?|__tests__|e2e|cypress|prisma\/seed)\//.test(rel) || /\/(__tests__|__mocks__)\//.test(rel) || /\.(test|spec|stories)\.[a-z]+$/.test(base) || base.endsWith(".d.ts") || /^seed\.(js|ts|mjs)$/.test(base);
|
|
22550
22723
|
}
|
|
22551
22724
|
function trackedEnvFiles(root) {
|
|
22552
|
-
if (!
|
|
22725
|
+
if (!existsSync4(join4(root, ".git"))) return [];
|
|
22553
22726
|
try {
|
|
22554
22727
|
const out2 = execFileSync("git", ["ls-files", "-z"], { cwd: root, encoding: "utf8", timeout: 5e3, stdio: ["ignore", "pipe", "ignore"] });
|
|
22555
22728
|
return out2.split("\0").filter((p) => {
|
|
@@ -22720,7 +22893,7 @@ function analyzeProject(root) {
|
|
|
22720
22893
|
}
|
|
22721
22894
|
if (!databases.some((d) => d.kind === "d1")) {
|
|
22722
22895
|
for (const name of ["wrangler.toml", "wrangler.json", "wrangler.jsonc"]) {
|
|
22723
|
-
if (!
|
|
22896
|
+
if (!existsSync4(join4(root, name))) continue;
|
|
22724
22897
|
const text = readFileSync4(join4(root, name), "utf8");
|
|
22725
22898
|
const at = text.search(/d1_databases/);
|
|
22726
22899
|
if (at < 0) continue;
|
|
@@ -22781,11 +22954,13 @@ function analyzeProject(root) {
|
|
|
22781
22954
|
}
|
|
22782
22955
|
const otherStack = detectOtherStack(files.map((f) => f.rel));
|
|
22783
22956
|
if (otherStack) add({ code: "other_stack", severity: "blocker", detail: ` ${otherStack.name}` });
|
|
22784
|
-
const empty = !files.some((f) => !f.rel.startsWith(".deployai/") && f.rel
|
|
22957
|
+
const empty = !files.some((f) => !f.rel.startsWith(".deployai/") && !INIT_FILES.has(f.rel) && !isEnvFile(f.rel.split("/").pop() ?? ""));
|
|
22785
22958
|
if (empty) add({ code: "no_files", severity: "blocker" });
|
|
22786
22959
|
if (framework.id === "unknown" && !otherStack && !empty) {
|
|
22787
22960
|
add({ code: "unknown_framework", severity: "warning", detail: framework.flavor ? ` (looks like ${framework.flavor})` : "" });
|
|
22788
22961
|
}
|
|
22962
|
+
const smtp = ["nodemailer", "emailjs", "smtp-client"].find((d) => deps[d]);
|
|
22963
|
+
if (smtp) add({ code: "email_smtp", severity: "warning", file: "package.json", detail: ` ${smtp}` });
|
|
22789
22964
|
const hasBuildScript = Boolean(pkg?.scripts?.build);
|
|
22790
22965
|
if (pkg && !hasBuildScript && framework.id !== "static" && framework.id !== "hono") {
|
|
22791
22966
|
add({ code: "no_build_script", severity: "warning", file: "package.json" });
|
|
@@ -22879,13 +23054,40 @@ This project is published with DeployAI.
|
|
|
22879
23054
|
|
|
22880
23055
|
Always explain to the user in simple words, in the language they write to you in. The user may not read English.
|
|
22881
23056
|
|
|
22882
|
-
|
|
23057
|
+
When you install or set something up, say what it does for the site, not the package name. Say "installing the site runtime" or "setting up a local test database", not "installing the Cloudflare adapter" or "installing wrangler".
|
|
23058
|
+
|
|
23059
|
+
Before you write code or change the plan, compare it with these rules. If something in it does not fit, say what and propose the change.
|
|
23060
|
+
|
|
23061
|
+
## Build with
|
|
23062
|
+
|
|
23063
|
+
${BUILD_WITH.map((l) => `- ${l}`).join("\n")}
|
|
23064
|
+
|
|
23065
|
+
To start from working code, see the samples: npx deployai@latest samples
|
|
23066
|
+
|
|
23067
|
+
## Do not add
|
|
23068
|
+
|
|
22883
23069
|
- local file system writes
|
|
22884
23070
|
- database drivers DeployAI does not support (see: npx deployai@latest inspect)
|
|
22885
23071
|
- long-running processes or background servers
|
|
22886
23072
|
- native binary modules
|
|
22887
23073
|
- DeployAI or any cloud credentials in source code
|
|
22888
23074
|
|
|
23075
|
+
## Do not run
|
|
23076
|
+
|
|
23077
|
+
- wrangler commands that need a Cloudflare account (login, deploy, d1 create, r2 bucket create). Wrangler is installed only for local development. The user does not need a Cloudflare account: DeployAI creates the database and storage and publishes the site, with: npx deployai@latest deploy
|
|
23078
|
+
|
|
23079
|
+
## Keep existing data
|
|
23080
|
+
|
|
23081
|
+
${KEEP_DATA_RULES.join("\n")}
|
|
23082
|
+
|
|
23083
|
+
## Running DeployAI commands
|
|
23084
|
+
|
|
23085
|
+
${runCommandsRule()}
|
|
23086
|
+
|
|
23087
|
+
Never stop building for an account, a plan or a limit. Build what the owner asks; say once, in one plain line, what going live will need, and ask about it only at the deploy step.
|
|
23088
|
+
|
|
23089
|
+
## Check
|
|
23090
|
+
|
|
22889
23091
|
Before adding a dependency or a new server feature, run: npx deployai@latest check
|
|
22890
23092
|
Ask the developer before removing any existing functionality.
|
|
22891
23093
|
|
|
@@ -22893,30 +23095,47 @@ Files:
|
|
|
22893
23095
|
- .deployai/project.json: project id and settings (safe to commit)
|
|
22894
23096
|
- .deployai/last-check.json: latest check result (not committed)
|
|
22895
23097
|
`;
|
|
23098
|
+
var AGENT_FILES = ["AGENTS.md", "CLAUDE.md"];
|
|
22896
23099
|
function runInit(root, opts = {}) {
|
|
22897
23100
|
const created = [];
|
|
22898
23101
|
const kept = [];
|
|
23102
|
+
const updated = [];
|
|
22899
23103
|
const md = join5(root, "DEPLOYAI.md");
|
|
22900
|
-
if (
|
|
23104
|
+
if (existsSync5(md) && !opts.force) {
|
|
22901
23105
|
kept.push("DEPLOYAI.md");
|
|
22902
23106
|
} else {
|
|
22903
23107
|
writeFileSync3(md, DEPLOYAI_MD);
|
|
22904
23108
|
created.push("DEPLOYAI.md");
|
|
22905
23109
|
}
|
|
23110
|
+
if (opts.agentFiles !== false) {
|
|
23111
|
+
for (const name of AGENT_FILES) {
|
|
23112
|
+
const file2 = join5(root, name);
|
|
23113
|
+
const text = existsSync5(file2) ? readFileSync5(file2, "utf8") : null;
|
|
23114
|
+
if (text === null) {
|
|
23115
|
+
writeFileSync3(file2, `${AGENT_POINTER}
|
|
23116
|
+
`);
|
|
23117
|
+
created.push(name);
|
|
23118
|
+
} else if (text.includes("DEPLOYAI.md")) {
|
|
23119
|
+
kept.push(name);
|
|
23120
|
+
} else {
|
|
23121
|
+
const eol = text.includes("\r\n") ? "\r\n" : "\n";
|
|
23122
|
+
const gap = !text.trim() ? "" : text.endsWith("\n") ? eol : eol + eol;
|
|
23123
|
+
appendFileSync(file2, `${gap}${AGENT_POINTER}${eol}`);
|
|
23124
|
+
updated.push(name);
|
|
23125
|
+
}
|
|
23126
|
+
}
|
|
23127
|
+
}
|
|
22906
23128
|
ensureDeployaiDir(root);
|
|
22907
23129
|
const existing = readProject(root);
|
|
23130
|
+
const framework = existing?.framework ?? analyzeProject(root).inspect.framework.id;
|
|
22908
23131
|
if (existing) {
|
|
22909
23132
|
kept.push(".deployai/project.json");
|
|
22910
23133
|
} else {
|
|
22911
|
-
|
|
22912
|
-
writeProject(root, {
|
|
22913
|
-
projectId: null,
|
|
22914
|
-
framework: analysis.inspect.framework.id,
|
|
22915
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
22916
|
-
});
|
|
23134
|
+
writeProject(root, { projectId: null, framework, createdAt: (/* @__PURE__ */ new Date()).toISOString() });
|
|
22917
23135
|
created.push(".deployai/project.json");
|
|
22918
23136
|
}
|
|
22919
|
-
|
|
23137
|
+
const hasCode = existsSync5(join5(root, "package.json")) || framework !== "unknown";
|
|
23138
|
+
return { created, kept, updated, hasCode };
|
|
22920
23139
|
}
|
|
22921
23140
|
function initCommand(root, opts) {
|
|
22922
23141
|
const res = runInit(root, opts);
|
|
@@ -22926,6 +23145,7 @@ function initCommand(root, opts) {
|
|
|
22926
23145
|
out(
|
|
22927
23146
|
rows([
|
|
22928
23147
|
...res.created.map((f) => ["Created", f]),
|
|
23148
|
+
...res.updated.map((f) => ["Added a line", `${f} (read DEPLOYAI.md)`]),
|
|
22929
23149
|
...res.kept.map((f) => ["Kept", f]),
|
|
22930
23150
|
["Guard", ".deployai/last-check.json (git ignored)"],
|
|
22931
23151
|
["Linked project", project?.projectId ?? "none yet"]
|
|
@@ -22933,12 +23153,18 @@ function initCommand(root, opts) {
|
|
|
22933
23153
|
);
|
|
22934
23154
|
out();
|
|
22935
23155
|
out("Next step");
|
|
22936
|
-
|
|
23156
|
+
if (res.hasCode) {
|
|
23157
|
+
out(" Run: npx deployai@latest check");
|
|
23158
|
+
} else {
|
|
23159
|
+
out(" Start from a sample: npx deployai@latest samples");
|
|
23160
|
+
out(" Or tell your agent what to build, or to review your plan. It follows DEPLOYAI.md.");
|
|
23161
|
+
}
|
|
22937
23162
|
if (!project?.projectId) out(" Then: npx deployai@latest login, npx deployai@latest link");
|
|
22938
23163
|
}
|
|
22939
23164
|
|
|
22940
23165
|
// src/commands/check.ts
|
|
22941
|
-
import { writeFileSync as writeFileSync4 } from "fs";
|
|
23166
|
+
import { existsSync as existsSync6, writeFileSync as writeFileSync4 } from "fs";
|
|
23167
|
+
import { join as join6 } from "path";
|
|
22942
23168
|
|
|
22943
23169
|
// src/prompt.ts
|
|
22944
23170
|
var PROMPT_RULES = [
|
|
@@ -22948,8 +23174,11 @@ var PROMPT_RULES = [
|
|
|
22948
23174
|
"Keep the project runnable outside DeployAI.",
|
|
22949
23175
|
"Never add credentials to source code.",
|
|
22950
23176
|
"Explain every step to the user in simple words, in the language they write to you in.",
|
|
22951
|
-
"For the database, use D1 as shown in the DeployAI CRUD sample."
|
|
23177
|
+
"For the database, use D1 as shown in the DeployAI CRUD sample.",
|
|
23178
|
+
"Follow DEPLOYAI.md for every future change. If it is missing, run: npx deployai@latest init",
|
|
23179
|
+
runCommandsRule()
|
|
22952
23180
|
];
|
|
23181
|
+
var DATA_CODES = /* @__PURE__ */ new Set(["fs_write", "unsupported_db_postgres", "unsupported_db_mysql", "unsupported_db_mongodb", "unsupported_db_sqlite_file", "native_module_bcrypt"]);
|
|
22953
23182
|
var MAX_LOCATIONS = 3;
|
|
22954
23183
|
function locList(items) {
|
|
22955
23184
|
const locs = [...new Set(items.map(locationOf).filter(Boolean))];
|
|
@@ -22988,6 +23217,11 @@ function buildPrompt(analysis) {
|
|
|
22988
23217
|
if (def) lines.push(`- ${def.fixForAgent}`);
|
|
22989
23218
|
}
|
|
22990
23219
|
lines.push("");
|
|
23220
|
+
if (blockerGroups.some((g) => DATA_CODES.has(g.code))) {
|
|
23221
|
+
lines.push("Keep existing data:");
|
|
23222
|
+
lines.push(...KEEP_DATA_RULES);
|
|
23223
|
+
lines.push("");
|
|
23224
|
+
}
|
|
22991
23225
|
lines.push("Rules:");
|
|
22992
23226
|
for (const r of PROMPT_RULES) lines.push(`- ${r}`);
|
|
22993
23227
|
lines.push("");
|
|
@@ -23114,8 +23348,14 @@ async function runCheck(root, ctx, opts = {}) {
|
|
|
23114
23348
|
writeFileSync4(lastCheckFile(root), JSON.stringify(json2, null, 2) + "\n");
|
|
23115
23349
|
} catch {
|
|
23116
23350
|
}
|
|
23351
|
+
const empty = a.findings.length > 0 && a.findings.every((f) => f.code === "no_files");
|
|
23117
23352
|
if (opts.json) {
|
|
23118
23353
|
out(JSON.stringify(json2, null, 2));
|
|
23354
|
+
} else if (opts.print !== false && empty) {
|
|
23355
|
+
out("DeployAI check");
|
|
23356
|
+
out();
|
|
23357
|
+
out(messages(root)("emptyFolder"));
|
|
23358
|
+
if (!existsSync6(join6(root, "DEPLOYAI.md"))) out(messages(root)("initHint"));
|
|
23119
23359
|
} else if (opts.print !== false) {
|
|
23120
23360
|
printCheck(a);
|
|
23121
23361
|
out();
|
|
@@ -23137,6 +23377,7 @@ async function runCheck(root, ctx, opts = {}) {
|
|
|
23137
23377
|
} else {
|
|
23138
23378
|
out(t("runDeploy"));
|
|
23139
23379
|
}
|
|
23380
|
+
if (!existsSync6(join6(root, "DEPLOYAI.md"))) out(t("initHint"));
|
|
23140
23381
|
}
|
|
23141
23382
|
await telemetry;
|
|
23142
23383
|
return a;
|
|
@@ -23199,7 +23440,7 @@ async function loginCommand(ctx, opts = {}) {
|
|
|
23199
23440
|
});
|
|
23200
23441
|
if (poll.status === "approved") {
|
|
23201
23442
|
if (!poll.token) throw new CliError(messages()("loginNoToken"), 1, "protocol");
|
|
23202
|
-
updateConfig({ token: poll.token, email: poll.email, apiUrl: ctx.apiUrl });
|
|
23443
|
+
updateConfig({ token: poll.token, email: poll.email, apiUrl: ctx.apiUrl, tokenApiUrl: ctx.apiUrl });
|
|
23203
23444
|
out();
|
|
23204
23445
|
out(poll.email ? t("loggedInAs", { email: poll.email }) : t("loggedIn"));
|
|
23205
23446
|
out(t("nextStep"));
|
|
@@ -23210,9 +23451,18 @@ async function loginCommand(ctx, opts = {}) {
|
|
|
23210
23451
|
}
|
|
23211
23452
|
throw new CliError(t("loginExpired"), 1, "auth_expired");
|
|
23212
23453
|
}
|
|
23213
|
-
function logoutCommand() {
|
|
23214
|
-
|
|
23215
|
-
|
|
23454
|
+
async function logoutCommand(ctx) {
|
|
23455
|
+
let revoked = true;
|
|
23456
|
+
if (ctx.config.token) {
|
|
23457
|
+
const apiUrl = (ctx.config.tokenApiUrl ?? ctx.apiUrl).replace(/\/+$/, "");
|
|
23458
|
+
try {
|
|
23459
|
+
await apiRequest({ apiUrl, config: ctx.config }, "/api/cli/logout", null, { method: "POST", body: {}, timeoutMs: 1e4 });
|
|
23460
|
+
} catch (e2) {
|
|
23461
|
+
revoked = e2 instanceof CliError && e2.category === "auth";
|
|
23462
|
+
}
|
|
23463
|
+
}
|
|
23464
|
+
updateConfig({ token: void 0, tokenApiUrl: void 0, email: void 0 });
|
|
23465
|
+
out(messages()(revoked ? "loggedOut" : "loggedOutLocalOnly"));
|
|
23216
23466
|
}
|
|
23217
23467
|
async function whoamiCommand(ctx) {
|
|
23218
23468
|
const me = await apiRequest(ctx, "/api/cli/me", MeResponse);
|
|
@@ -23301,8 +23551,21 @@ async function linkCommand(root, ctx, target, opts) {
|
|
|
23301
23551
|
return;
|
|
23302
23552
|
}
|
|
23303
23553
|
if (projects.length === 1) {
|
|
23304
|
-
|
|
23305
|
-
|
|
23554
|
+
const p = projects[0];
|
|
23555
|
+
const address = p.url ?? p.slug;
|
|
23556
|
+
if (process.stdin.isTTY && process.stdout.isTTY) {
|
|
23557
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
23558
|
+
let answer;
|
|
23559
|
+
try {
|
|
23560
|
+
answer = (await rl.question(t("linkConfirm", { name: p.name, address }))).trim().toLowerCase();
|
|
23561
|
+
} finally {
|
|
23562
|
+
rl.close();
|
|
23563
|
+
}
|
|
23564
|
+
if (answer === "y" || answer === "yes") return save(root, p);
|
|
23565
|
+
out(t("linkCancelled"));
|
|
23566
|
+
return;
|
|
23567
|
+
}
|
|
23568
|
+
throw new CliError([t("linkOnlyOne", { name: p.name, address }), ` npx deployai@latest link ${p.slug}`, ' npx deployai@latest link --create "<name>"'].join("\n"), 1, "usage");
|
|
23306
23569
|
}
|
|
23307
23570
|
const current = readProject(root)?.projectId;
|
|
23308
23571
|
out(t("projects"));
|
|
@@ -23328,7 +23591,7 @@ async function linkCommand(root, ctx, target, opts) {
|
|
|
23328
23591
|
import { createInterface as createInterface2 } from "readline/promises";
|
|
23329
23592
|
|
|
23330
23593
|
// src/tar.ts
|
|
23331
|
-
import { readFileSync as
|
|
23594
|
+
import { readFileSync as readFileSync6 } from "fs";
|
|
23332
23595
|
import { gzipSync } from "zlib";
|
|
23333
23596
|
var BLOCK = 512;
|
|
23334
23597
|
function writeString(buf, offset, length, value) {
|
|
@@ -23412,7 +23675,7 @@ function packFiles(files) {
|
|
|
23412
23675
|
return createTarGz(
|
|
23413
23676
|
files.map((f) => ({
|
|
23414
23677
|
name: f.rel,
|
|
23415
|
-
data:
|
|
23678
|
+
data: readFileSync6(f.abs),
|
|
23416
23679
|
mtimeMs: f.mtimeMs,
|
|
23417
23680
|
mode: f.mode & 64 ? 493 : 420
|
|
23418
23681
|
}))
|
|
@@ -23482,6 +23745,7 @@ async function deployCommand(root, ctx, opts) {
|
|
|
23482
23745
|
if (!ctx.config.token) {
|
|
23483
23746
|
const guestToken = project?.projectId ? ctx.config.guestTokens?.[project.projectId] : void 0;
|
|
23484
23747
|
if (guestToken) return deployVersion(root, { ...ctx, config: { ...ctx.config, token: guestToken } }, opts, true);
|
|
23748
|
+
if (project?.projectId) throw new CliError(messages(root)("guestAccountSite"), 1, "auth");
|
|
23485
23749
|
const interactive = Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
23486
23750
|
if (!opts.guest && !(interactive && await askGuest(root))) {
|
|
23487
23751
|
throw new CliError(messages(root)("deployNotLoggedIn"), 1, "auth");
|
|
@@ -23493,7 +23757,7 @@ async function deployCommand(root, ctx, opts) {
|
|
|
23493
23757
|
try {
|
|
23494
23758
|
return await deployVersion(root, ctx, opts, false);
|
|
23495
23759
|
} catch (e2) {
|
|
23496
|
-
if (!claim2 || !(e2 instanceof CliError) || e2.category !== "forbidden") throw e2;
|
|
23760
|
+
if (!claim2 || !(e2 instanceof CliError) || e2.category !== "forbidden" && e2.category !== "not_found") throw e2;
|
|
23497
23761
|
const t = messages(root);
|
|
23498
23762
|
const url2 = ctx.config.guestClaims?.[claim2];
|
|
23499
23763
|
throw new CliError(url2 ? t("guestClaimFirst", { url: url2 }) : t("guestClaimFirstNoLink"), 1, "guest_unclaimed");
|
|
@@ -23533,6 +23797,8 @@ async function deployVersion(root, ctx, opts, guest) {
|
|
|
23533
23797
|
const form = new FormData();
|
|
23534
23798
|
form.append("projectId", project.projectId);
|
|
23535
23799
|
form.append("message", message);
|
|
23800
|
+
const fixed = (opts.fixed ?? "").replace(/\s+/g, " ").trim().slice(0, 300);
|
|
23801
|
+
if (fixed && telemetryEnabled(ctx.config)) form.append("fixNote", fixed);
|
|
23536
23802
|
form.append("archive", new Blob([new Uint8Array(archive)], { type: "application/gzip" }), "source.tar.gz");
|
|
23537
23803
|
const res = await apiRequest(ctx, "/api/cli/deploy", DeployResponse, { method: "POST", form, timeoutMs: 5 * 6e4 });
|
|
23538
23804
|
out();
|
|
@@ -23540,6 +23806,7 @@ async function deployVersion(root, ctx, opts, guest) {
|
|
|
23540
23806
|
out(rows([[t("version"), `v${res.number}`], [t("queue"), queueText(res.queuePosition, root)], [t("address"), res.previewUrl]]));
|
|
23541
23807
|
out();
|
|
23542
23808
|
out(t("goesLive"));
|
|
23809
|
+
pageHint(res, root);
|
|
23543
23810
|
return;
|
|
23544
23811
|
}
|
|
23545
23812
|
out(
|
|
@@ -23553,6 +23820,15 @@ async function deployVersion(root, ctx, opts, guest) {
|
|
|
23553
23820
|
out(t("nextStep"));
|
|
23554
23821
|
out(t("followBuild"));
|
|
23555
23822
|
out(t("thenPromote", { n: res.number }));
|
|
23823
|
+
pageHint(res, root);
|
|
23824
|
+
}
|
|
23825
|
+
function pageHint(res, root) {
|
|
23826
|
+
if (!res.page) return;
|
|
23827
|
+
const t = messages(root);
|
|
23828
|
+
out();
|
|
23829
|
+
if (res.page.files > 40) out(t("heavyPage", { n: res.page.files }));
|
|
23830
|
+
if (res.page.prefetches) out(t("prefetchPage"));
|
|
23831
|
+
out(t("speedHint", { url: res.previewUrl.split("?")[0] }));
|
|
23556
23832
|
}
|
|
23557
23833
|
async function deployGuest(root, ctx, opts) {
|
|
23558
23834
|
const message = (opts.message ?? "").trim() || "first version";
|
|
@@ -23604,8 +23880,8 @@ async function claimCommand(root, ctx, opts) {
|
|
|
23604
23880
|
|
|
23605
23881
|
// src/commands/samples.ts
|
|
23606
23882
|
import { createInterface as createInterface3 } from "readline/promises";
|
|
23607
|
-
import { existsSync as
|
|
23608
|
-
import { dirname, join as
|
|
23883
|
+
import { existsSync as existsSync7, mkdirSync as mkdirSync3, readdirSync as readdirSync3, writeFileSync as writeFileSync5 } from "fs";
|
|
23884
|
+
import { dirname, join as join7, relative, resolve, sep } from "path";
|
|
23609
23885
|
import { gunzipSync } from "zlib";
|
|
23610
23886
|
var SAMPLES = [
|
|
23611
23887
|
{ key: "landing", title: "Landing page: a full one-page site with WhatsApp sign-up", stack: "static HTML and CSS" },
|
|
@@ -23616,7 +23892,7 @@ var SAMPLES = [
|
|
|
23616
23892
|
{ key: "admin", title: "Back office with login: dashboard, orders, stock, customers", stack: "Astro on Workers, D1" }
|
|
23617
23893
|
];
|
|
23618
23894
|
var MAX_BYTES = 20 * 1024 * 1024;
|
|
23619
|
-
var IGNORED = /* @__PURE__ */ new Set([".git", ".DS_Store", "Thumbs.db", ".deployai"]);
|
|
23895
|
+
var IGNORED = /* @__PURE__ */ new Set([".git", ".DS_Store", "Thumbs.db", ".deployai", "DEPLOYAI.md", "AGENTS.md", "CLAUDE.md"]);
|
|
23620
23896
|
function listSamples(apiUrl) {
|
|
23621
23897
|
out("DeployAI samples");
|
|
23622
23898
|
out("");
|
|
@@ -23626,7 +23902,7 @@ function listSamples(apiUrl) {
|
|
|
23626
23902
|
out(`See them live: ${apiUrl}/samples`);
|
|
23627
23903
|
}
|
|
23628
23904
|
function filesIn(dir) {
|
|
23629
|
-
return
|
|
23905
|
+
return existsSync7(dir) ? readdirSync3(dir).filter((f) => !IGNORED.has(f)) : [];
|
|
23630
23906
|
}
|
|
23631
23907
|
function freeFolder(cwd, key) {
|
|
23632
23908
|
for (let n2 = 1; ; n2++) {
|
|
@@ -23709,7 +23985,7 @@ async function samplesCommand(cwd, ctx, key, opts = {}) {
|
|
|
23709
23985
|
}
|
|
23710
23986
|
const written = await downloadSample(ctx, sample.key, root);
|
|
23711
23987
|
const base = resolve(root);
|
|
23712
|
-
const hasPackage =
|
|
23988
|
+
const hasPackage = existsSync7(join7(base, "package.json"));
|
|
23713
23989
|
out(base === resolve(cwd) ? `Downloaded the ${sample.key} sample: ${written} files.` : `Downloaded the ${sample.key} sample into the new folder ${relative(cwd, base)}: ${written} files. Work in that folder from now on.`);
|
|
23714
23990
|
out("");
|
|
23715
23991
|
const t = messages(base);
|
|
@@ -23781,18 +24057,23 @@ async function versionsCommand(root, ctx) {
|
|
|
23781
24057
|
const sorted = [...versions].sort((a, b) => b.number - a.number);
|
|
23782
24058
|
out("Versions");
|
|
23783
24059
|
for (const v of sorted) {
|
|
24060
|
+
const status = v.status === "replaced" ? stateName("replaced", root) : v.status;
|
|
23784
24061
|
const cols = [
|
|
23785
24062
|
`v${v.number}`.padEnd(6),
|
|
23786
24063
|
(v.isLive ? "live" : "").padEnd(6),
|
|
23787
|
-
|
|
24064
|
+
status.padEnd(10),
|
|
23788
24065
|
shortDate(v.createdAt).padEnd(18),
|
|
23789
24066
|
formatBytes(v.sizeBytes).padEnd(10),
|
|
23790
24067
|
v.message
|
|
23791
24068
|
];
|
|
23792
24069
|
out(` ${cols.join("")}`);
|
|
23793
24070
|
if (v.error) out(` ${v.error}`);
|
|
24071
|
+
if (v.migrationStatus === "waiting") out(` ${messages(root)("sqlWaitingLine", { url: versionsPage(ctx, projectId) })}`);
|
|
23794
24072
|
}
|
|
23795
24073
|
}
|
|
24074
|
+
function versionsPage(ctx, projectId) {
|
|
24075
|
+
return `${ctx.apiUrl}/project/${encodeURIComponent(projectId)}/versions`;
|
|
24076
|
+
}
|
|
23796
24077
|
async function changeLiveCommand(root, ctx, version2, kind) {
|
|
23797
24078
|
requireToken(ctx);
|
|
23798
24079
|
const projectId = linkedProjectId(root);
|
|
@@ -23809,6 +24090,7 @@ async function statusCommand(root, ctx) {
|
|
|
23809
24090
|
const s = await apiRequest(ctx, `/api/cli/status?projectId=${encodeURIComponent(projectId)}`, StatusResponse);
|
|
23810
24091
|
const p = s.project;
|
|
23811
24092
|
const t = messages(root);
|
|
24093
|
+
const newer = s.latest && s.latest.number !== p.liveVersion ? s.latest : null;
|
|
23812
24094
|
out(t("statusTitle"));
|
|
23813
24095
|
out();
|
|
23814
24096
|
out(
|
|
@@ -23817,9 +24099,32 @@ async function statusCommand(root, ctx) {
|
|
|
23817
24099
|
[t("state"), stateName(p.status, root)],
|
|
23818
24100
|
[t("address"), p.url ?? t("notPublished")],
|
|
23819
24101
|
[t("liveVersion"), p.liveVersion ? `v${p.liveVersion}` : t("none")],
|
|
24102
|
+
// A newer upload than the live one: its state, so "follow the build" after deploy has something to follow.
|
|
24103
|
+
...newer ? [[t("newestVersion"), `v${newer.number} ${stateName(newer.status, root)}`]] : [],
|
|
23820
24104
|
[t("queue"), s.queue.running ? t("buildingNow") : s.queue.position > 0 ? queueText(s.queue.position, root) : t("idle")]
|
|
23821
24105
|
])
|
|
23822
24106
|
);
|
|
24107
|
+
if (s.latest?.goingLive) {
|
|
24108
|
+
out();
|
|
24109
|
+
out(t("goingLive", { n: s.latest.number }));
|
|
24110
|
+
return;
|
|
24111
|
+
}
|
|
24112
|
+
if (s.latest?.wentBack) {
|
|
24113
|
+
out();
|
|
24114
|
+
out(t("wentBack", { n: s.latest.number, prev: s.latest.wentBack.previous, reason: s.latest.wentBack.reason }));
|
|
24115
|
+
return;
|
|
24116
|
+
}
|
|
24117
|
+
if (newer?.status === "ready") {
|
|
24118
|
+
out();
|
|
24119
|
+
out(t("nextStep"));
|
|
24120
|
+
out(t("askOwner", { n: newer.number }));
|
|
24121
|
+
if (s.latest?.preview) out(t("showPreview", { url: s.latest.preview }));
|
|
24122
|
+
out(t("promoteReady", { n: newer.number }));
|
|
24123
|
+
}
|
|
24124
|
+
if (s.latest?.migrationStatus === "waiting") {
|
|
24125
|
+
out();
|
|
24126
|
+
out(t("sqlWaitingLine", { url: versionsPage(ctx, projectId) }));
|
|
24127
|
+
}
|
|
23823
24128
|
if (s.latest?.status !== "failed") return;
|
|
23824
24129
|
out();
|
|
23825
24130
|
out(t("buildFailed", { n: s.latest.number }));
|
|
@@ -23830,13 +24135,60 @@ async function statusCommand(root, ctx) {
|
|
|
23830
24135
|
for (const line of s.latest.logTail.split("\n")) out(` ${line}`);
|
|
23831
24136
|
}
|
|
23832
24137
|
out();
|
|
23833
|
-
out(t("buildFixHint"));
|
|
24138
|
+
out(t(telemetryEnabled(ctx.config) ? "buildFixHint" : "buildFixHintNoNote"));
|
|
23834
24139
|
}
|
|
23835
24140
|
|
|
23836
24141
|
// src/commands/start.ts
|
|
23837
24142
|
import { spawnSync as spawnSync2 } from "child_process";
|
|
23838
|
-
import { existsSync as
|
|
23839
|
-
import { join as
|
|
24143
|
+
import { existsSync as existsSync8, writeFileSync as writeFileSync7 } from "fs";
|
|
24144
|
+
import { join as join9, relative as relative2, resolve as resolve2 } from "path";
|
|
24145
|
+
|
|
24146
|
+
// src/commands/starter.ts
|
|
24147
|
+
import { writeFileSync as writeFileSync6 } from "fs";
|
|
24148
|
+
import { join as join8 } from "path";
|
|
24149
|
+
var esc2 = (s) => s.replace(/[&<>"]/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """ })[c]);
|
|
24150
|
+
function page(name, lang) {
|
|
24151
|
+
const he = lang === "he";
|
|
24152
|
+
const title = esc2(name || (he ? "\u05D4\u05D0\u05EA\u05E8 \u05E9\u05DC\u05D9" : "My site"));
|
|
24153
|
+
const soon = he ? "\u05D4\u05D0\u05EA\u05E8 \u05D1\u05D1\u05E0\u05D9\u05D9\u05D4, \u05D1\u05E7\u05E8\u05D5\u05D1 \u05DB\u05D0\u05DF." : "This site is being built. Coming soon.";
|
|
24154
|
+
const font = he ? '<link rel="preconnect" href="https://fonts.googleapis.com">\n <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Heebo:wght@400;700&display=swap">\n ' : "";
|
|
24155
|
+
return `<!doctype html>
|
|
24156
|
+
<html lang="${he ? "he" : "en"}" dir="${he ? "rtl" : "ltr"}">
|
|
24157
|
+
<head>
|
|
24158
|
+
<meta charset="utf-8">
|
|
24159
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
24160
|
+
<title>${title}</title>
|
|
24161
|
+
${font}<style>
|
|
24162
|
+
body { margin: 0; min-height: 100vh; display: grid; place-items: center; font-family: ${he ? "Heebo, " : ""}system-ui, sans-serif; background: #fafafa; color: #18181b; }
|
|
24163
|
+
main { padding: 1.5rem; text-align: center; }
|
|
24164
|
+
h1 { margin: 0 0 .5rem; font-size: 2rem; }
|
|
24165
|
+
</style>
|
|
24166
|
+
</head>
|
|
24167
|
+
<body>
|
|
24168
|
+
<main>
|
|
24169
|
+
<h1>${title}</h1>
|
|
24170
|
+
<p>${soon}</p>
|
|
24171
|
+
</main>
|
|
24172
|
+
</body>
|
|
24173
|
+
</html>
|
|
24174
|
+
`;
|
|
24175
|
+
}
|
|
24176
|
+
var README = `# Starter page
|
|
24177
|
+
|
|
24178
|
+
DeployAI wrote this page so the folder starts as a working site. Build the owner's site here in its place.
|
|
24179
|
+
|
|
24180
|
+
## Before you go live
|
|
24181
|
+
|
|
24182
|
+
- Replace \`index.html\` with a first version of the owner's site right away, from what you know: one short question at most, details you do not have left out until the owner sees it. Keep it static HTML and CSS unless the site needs server code (forms, logins, data): then follow the stack in DEPLOYAI.md.
|
|
24183
|
+
- Nothing from this starter stays: no "coming soon" text goes live.
|
|
24184
|
+
- Delete this README or replace it with notes about the site.
|
|
24185
|
+
`;
|
|
24186
|
+
function writeStarter(root, name, lang) {
|
|
24187
|
+
writeFileSync6(join8(root, "index.html"), page(name ?? "", lang));
|
|
24188
|
+
writeFileSync6(join8(root, "README.md"), README);
|
|
24189
|
+
}
|
|
24190
|
+
|
|
24191
|
+
// src/commands/start.ts
|
|
23840
24192
|
var REASONS = { start_not_found: "startNotFound", start_expired: "startExpired", start_used_up: "startUsedUp" };
|
|
23841
24193
|
var reason = (code) => messages(process.cwd())(REASONS[code] ?? "startNotFound");
|
|
23842
24194
|
async function fetchStart(ctx, id) {
|
|
@@ -23868,25 +24220,32 @@ async function startCommand(cwd, ctx, id, opts = {}) {
|
|
|
23868
24220
|
const sameSite = Boolean(choices.projectId && readProject(here)?.projectId === choices.projectId);
|
|
23869
24221
|
const root = fresh && filesIn(here).length && !opts.here && !sameSite ? freeFolder(here, choices.slug ?? sample?.key ?? "site") : here;
|
|
23870
24222
|
const done = [];
|
|
23871
|
-
const
|
|
24223
|
+
const empty = !filesIn(root).length;
|
|
24224
|
+
const starter = (kind === "new" || kind === "guest") && !sample && empty;
|
|
24225
|
+
const steps = startSteps(kind, { emptyFolder: kind === "update" && empty, starter });
|
|
23872
24226
|
updateProject(root, { lang: langOf(choices.ownerLanguage) });
|
|
23873
24227
|
const t = messages(root);
|
|
23874
24228
|
if (sample && !sameSite) {
|
|
23875
24229
|
const written = await downloadSample(ctx, sample.key, root);
|
|
23876
24230
|
done.push(t("startDownloaded", { key: sample.key, n: written }));
|
|
23877
|
-
if (
|
|
24231
|
+
if (existsSync8(join9(root, "package.json"))) {
|
|
23878
24232
|
if (opts.install !== false && install(root)) done.push(t("startInstalled"));
|
|
23879
24233
|
else steps.unshift({ cmd: "npm install", say: "Installs the sample's packages." });
|
|
23880
24234
|
}
|
|
23881
24235
|
}
|
|
24236
|
+
if (starter) {
|
|
24237
|
+
writeStarter(root, choices.name, langOf(choices.ownerLanguage));
|
|
24238
|
+
done.push(t("startStarter"));
|
|
24239
|
+
}
|
|
23882
24240
|
if (choices.brief) {
|
|
23883
24241
|
ensureDeployaiDir(root);
|
|
23884
|
-
|
|
24242
|
+
writeFileSync7(join9(root, BRIEF_FILE), `# The owner's details
|
|
23885
24243
|
|
|
23886
24244
|
${choices.brief}
|
|
23887
24245
|
`);
|
|
23888
24246
|
done.push(t("startBrief", { file: BRIEF_FILE }));
|
|
23889
24247
|
}
|
|
24248
|
+
if (runInit(root).created.includes("DEPLOYAI.md")) done.push(t("startRules"));
|
|
23890
24249
|
if (choices.projectId) {
|
|
23891
24250
|
const before = readProject(root);
|
|
23892
24251
|
writeProject(root, { ...before ?? {}, projectId: choices.projectId, name: choices.name ?? void 0, slug: choices.slug ?? void 0, createdAt: before?.createdAt ?? (/* @__PURE__ */ new Date()).toISOString() });
|
|
@@ -23908,11 +24267,12 @@ ${choices.brief}
|
|
|
23908
24267
|
out("Then, in this order:");
|
|
23909
24268
|
steps.forEach((s, i) => out(`${i + 1}. ${s.cmd ? `Run ${s.cmd}. ` : ""}${s.say}`));
|
|
23910
24269
|
out();
|
|
24270
|
+
out(runCommandsRule(langOf(choices.ownerLanguage)));
|
|
23911
24271
|
out(START_FAIL_LINE);
|
|
23912
24272
|
}
|
|
23913
24273
|
|
|
23914
24274
|
// src/commands/addon.ts
|
|
23915
|
-
import { readFileSync as
|
|
24275
|
+
import { readFileSync as readFileSync7 } from "fs";
|
|
23916
24276
|
import { resolve as resolve3 } from "path";
|
|
23917
24277
|
function linkedProjectId2(root) {
|
|
23918
24278
|
const id = readProject(root)?.projectId;
|
|
@@ -23945,6 +24305,25 @@ async function addonsCommand(root, ctx) {
|
|
|
23945
24305
|
}
|
|
23946
24306
|
out(`Next: ${r.next}. Ask the site owner if they want to start it now, then run: npx deployai@latest addon next`);
|
|
23947
24307
|
}
|
|
24308
|
+
async function addonBuyCommand(root, ctx, key) {
|
|
24309
|
+
requireToken(ctx);
|
|
24310
|
+
const projectId = linkedProjectId2(root);
|
|
24311
|
+
const name = key.trim().toLowerCase();
|
|
24312
|
+
const r = await apiRequest(ctx, `/api/cli/addons?projectId=${encodeURIComponent(projectId)}`, AddonsResponse);
|
|
24313
|
+
if (!r.open) {
|
|
24314
|
+
out("The DeployAI marketplace is not open yet. Add-ons open soon.");
|
|
24315
|
+
return;
|
|
24316
|
+
}
|
|
24317
|
+
const a = r.addons.find((x) => x.key === name);
|
|
24318
|
+
if (!a) throw new CliError(`No add-on named ${name}. See the list: npx deployai@latest addons`, 1, "unknown");
|
|
24319
|
+
if (a.owned) {
|
|
24320
|
+
out(`This site already has ${a.name}. To run it: npx deployai@latest addon run ${a.key}`);
|
|
24321
|
+
return;
|
|
24322
|
+
}
|
|
24323
|
+
if (!a.buyUrl) throw new CliError(`${a.name} is not for sale right now.`, 1, "not_for_sale");
|
|
24324
|
+
out(`Send this link to the site owner. They pay once for this site, then run: npx deployai@latest addon run ${a.key}`);
|
|
24325
|
+
out(a.buyUrl);
|
|
24326
|
+
}
|
|
23948
24327
|
function printAddon(a) {
|
|
23949
24328
|
out(`DeployAI add-on ${a.position} of ${a.total}: ${a.name} (${a.key}, run ${a.runId}).`);
|
|
23950
24329
|
out("Follow these instructions step by step, with the site owner:");
|
|
@@ -23974,7 +24353,7 @@ async function addonDoneCommand(root, ctx, runId, opts) {
|
|
|
23974
24353
|
let report;
|
|
23975
24354
|
if (opts.report) {
|
|
23976
24355
|
try {
|
|
23977
|
-
report = JSON.parse(
|
|
24356
|
+
report = JSON.parse(readFileSync7(resolve3(root, opts.report), "utf8"));
|
|
23978
24357
|
} catch {
|
|
23979
24358
|
throw new CliError(`Cannot read the report file ${opts.report} as JSON.`, 1, "usage");
|
|
23980
24359
|
}
|
|
@@ -24070,7 +24449,7 @@ function buildProgram() {
|
|
|
24070
24449
|
const g = (cmd) => cmd.optsWithGlobals();
|
|
24071
24450
|
const root = (cmd) => resolve4(g(cmd).dir ?? process.cwd());
|
|
24072
24451
|
const ctx = (cmd) => apiContext(g(cmd).api);
|
|
24073
|
-
program.command("init").description("create DEPLOYAI.md and .deployai/ guard files").option("--force", "overwrite DEPLOYAI.md").action((opts, cmd) => initCommand(root(cmd), opts));
|
|
24452
|
+
program.command("init").description("create DEPLOYAI.md and .deployai/ guard files").option("--force", "overwrite DEPLOYAI.md").option("--no-agent-files", "do not add the DEPLOYAI.md line to AGENTS.md and CLAUDE.md").action((opts, cmd) => initCommand(root(cmd), opts));
|
|
24074
24453
|
program.command("inspect").description("show framework, package manager, language, database, storage").option("--json", "machine readable output").action((opts, cmd) => inspectCommand(root(cmd), opts));
|
|
24075
24454
|
program.command("check").description("can this project run on DeployAI: blockers and warnings, with the AI prompt").option("--json", "machine readable output").option("--no-clipboard", "do not copy the prompt to the clipboard").action(async (opts, cmd) => {
|
|
24076
24455
|
const a = await runCheck(root(cmd), ctx(cmd), opts);
|
|
@@ -24079,13 +24458,13 @@ function buildProgram() {
|
|
|
24079
24458
|
program.command("start").description("start from the line copied on the DeployAI site: prepares this folder with every choice made there, then prints the steps").argument("<id>", "the code from the copied line").option("--here", "put a new site in this folder even when it has files").option("--no-install", "do not run npm install for the sample").action((id, opts, cmd) => startCommand(root(cmd), ctx(cmd), id, opts));
|
|
24080
24459
|
program.command("samples").description("list the official sample sites, or download one (into this folder when empty, else a new one)").argument("[name]", "landing, business, form, crud, shop or admin").argument("[folder]", "put the sample in this folder (default: this one when empty, else asks or makes a new one)").option("--force", "write into this folder even when it has files").action((name, folder, opts, cmd) => samplesCommand(root(cmd), ctx(cmd), name, { ...opts, folder }));
|
|
24081
24460
|
program.command("login").description("log in through the browser").action((_opts, cmd) => loginCommand(ctx(cmd), { root: root(cmd) }));
|
|
24082
|
-
program.command("logout").description("
|
|
24461
|
+
program.command("logout").description("cancel the login token and remove it from this computer").action((_opts, cmd) => logoutCommand(ctx(cmd)));
|
|
24083
24462
|
program.command("whoami").description("show the logged in user").action((_opts, cmd) => whoamiCommand(ctx(cmd)));
|
|
24084
24463
|
program.command("telemetry").description("show what is sent, or turn telemetry on or off").argument("[action]", "status, on or off", "status").action((action) => telemetryCommand(action));
|
|
24085
24464
|
program.command("link").description("link this folder to a DeployAI project").argument("[project]", "project slug or id").option("--create <name>", "create a new project and link it").action(
|
|
24086
24465
|
(project, opts, cmd) => linkCommand(root(cmd), ctx(cmd), project, opts)
|
|
24087
24466
|
);
|
|
24088
|
-
program.command("deploy").description("check, pack and upload the source, then print the preview address").option("-m, --message <message>", "version message", "update").option("--guest", "without login: deploy as a temporary site, deleted after the days we set unless claimed").action((opts, cmd) => deployCommand(root(cmd), ctx(cmd), opts));
|
|
24467
|
+
program.command("deploy").description("check, pack and upload the source, then print the preview address").option("-m, --message <message>", "version message", "update").option("--fixed <what>", "after a failed version: one sentence on what you changed to fix it, no code (helps us catch it for others)").option("--guest", "without login: deploy as a temporary site, deleted after the days we set unless claimed").action((opts, cmd) => deployCommand(root(cmd), ctx(cmd), opts));
|
|
24089
24468
|
program.command("pull").description("download the code of the linked site's live version into this empty folder (needs login)").action((_opts, cmd) => pullCommand(root(cmd), ctx(cmd)));
|
|
24090
24469
|
program.command("claim").description("print this folder's temporary site keep link again; --email mails it, with a reminder before the delete").option("--email <address>", "the owner's email for the link and the reminder").action((opts, cmd) => claimCommand(root(cmd), ctx(cmd), opts));
|
|
24091
24470
|
program.command("versions").description("list versions").action((_opts, cmd) => versionsCommand(root(cmd), ctx(cmd)));
|
|
@@ -24096,6 +24475,7 @@ function buildProgram() {
|
|
|
24096
24475
|
const addon = program.command("addon").description("run the add-ons of this site, one at a time");
|
|
24097
24476
|
addon.command("next").description("print the next add-on for your agent").action((_opts, cmd) => addonNextCommand(root(cmd), ctx(cmd)));
|
|
24098
24477
|
addon.command("run").description("print one add-on by name").argument("<name>", "the add-on name, as npx deployai@latest addons lists it").action((name, _opts, cmd) => addonRunCommand(root(cmd), ctx(cmd), name));
|
|
24478
|
+
addon.command("buy").description("print the link where the site owner buys an add-on").argument("<name>", "the add-on name, as npx deployai@latest addons lists it").action((name, _opts, cmd) => addonBuyCommand(root(cmd), ctx(cmd), name));
|
|
24099
24479
|
addon.command("done").description("save the report of a finished add-on and print the next one").argument("<runId>", "the run id printed at the top of the add-on").option("--status <status>", "done, failed or skipped", "done").option("--report <file>", "the JSON report, for example .deployai/addon-report.json").action((runId, opts, cmd) => addonDoneCommand(root(cmd), ctx(cmd), runId, opts));
|
|
24100
24480
|
program.command("speed").description("Google PageSpeed test of a page: lab results, real visitor data, biggest opportunities").argument("<url>", "the page address").option("--desktop", "test a desktop load instead of a phone").action((url2, opts, cmd) => speedCommand(ctx(cmd), url2, opts));
|
|
24101
24481
|
const env = program.command("env").description("the site's environment variables: secrets by default, never shown again");
|