deployai 0.1.0-beta.1 → 0.1.0-beta.10
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 +503 -159
- package/package.json +49 -12
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
|
},
|
|
@@ -697,7 +700,7 @@ function frameworkDisplay(d) {
|
|
|
697
700
|
|
|
698
701
|
// ../shared/src/issue-help.ts
|
|
699
702
|
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
|
|
703
|
+
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
704
|
function serverDb(nameHe, nameEn) {
|
|
702
705
|
return {
|
|
703
706
|
he: {
|
|
@@ -736,7 +739,7 @@ var ISSUE_HELP = {
|
|
|
736
739
|
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
740
|
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
741
|
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
|
|
742
|
+
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
743
|
},
|
|
741
744
|
en: {
|
|
742
745
|
what: "The site saves files in a folder on the server, such as images that visitors upload or a file with data.",
|
|
@@ -748,10 +751,10 @@ var ISSUE_HELP = {
|
|
|
748
751
|
unsupported_db_mysql: serverDb("MySQL", "MySQL"),
|
|
749
752
|
unsupported_db_mongodb: {
|
|
750
753
|
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
|
|
754
|
+
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.",
|
|
755
|
+
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
756
|
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
|
|
757
|
+
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
758
|
},
|
|
756
759
|
en: {
|
|
757
760
|
what: "The site keeps its data in MongoDB, a database that runs on a separate server.",
|
|
@@ -764,7 +767,7 @@ var ISSUE_HELP = {
|
|
|
764
767
|
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
768
|
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
769
|
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
|
|
770
|
+
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
771
|
},
|
|
769
772
|
en: {
|
|
770
773
|
what: "The site keeps its data in a database file inside the project.",
|
|
@@ -789,8 +792,8 @@ var ISSUE_HELP = {
|
|
|
789
792
|
he: {
|
|
790
793
|
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
794
|
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
|
|
795
|
+
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."],
|
|
796
|
+
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
797
|
},
|
|
795
798
|
en: {
|
|
796
799
|
what: "The site uses the bcrypt library to store passwords safely.",
|
|
@@ -800,9 +803,9 @@ var ISSUE_HELP = {
|
|
|
800
803
|
},
|
|
801
804
|
native_module_other: {
|
|
802
805
|
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
|
|
806
|
+
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
807
|
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
|
|
808
|
+
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
809
|
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
810
|
},
|
|
808
811
|
en: {
|
|
@@ -816,7 +819,7 @@ var ISSUE_HELP = {
|
|
|
816
819
|
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
820
|
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
821
|
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
|
|
822
|
+
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
823
|
},
|
|
821
824
|
en: {
|
|
822
825
|
what: "The site starts something that keeps running in the background, such as a timer, a job queue or a scheduled task.",
|
|
@@ -829,7 +832,7 @@ var ISSUE_HELP = {
|
|
|
829
832
|
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
833
|
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
834
|
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
|
|
835
|
+
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
836
|
},
|
|
834
837
|
en: {
|
|
835
838
|
what: "The site runs a WebSocket server, an open connection that stays up to send live updates.",
|
|
@@ -851,11 +854,11 @@ var ISSUE_HELP = {
|
|
|
851
854
|
}
|
|
852
855
|
},
|
|
853
856
|
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
|
|
857
|
+
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.'),
|
|
858
|
+
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
859
|
adapter_missing_hono: {
|
|
857
860
|
he: {
|
|
858
|
-
what: "\u05D4\u05D0\u05EA\u05E8 \u05D1\u05E0\u05D5\u05D9 \u05D1
|
|
861
|
+
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
862
|
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
863
|
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
864
|
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 +869,16 @@ var ISSUE_HELP = {
|
|
|
866
869
|
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
870
|
}
|
|
868
871
|
},
|
|
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
|
|
872
|
+
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),
|
|
873
|
+
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),
|
|
874
|
+
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),
|
|
875
|
+
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
876
|
env_file_committed: {
|
|
874
877
|
he: {
|
|
875
878
|
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
879
|
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
|
|
880
|
+
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."],
|
|
881
|
+
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
882
|
},
|
|
880
883
|
en: {
|
|
881
884
|
what: "An env file with passwords and keys is saved in git, the version history of the code.",
|
|
@@ -900,8 +903,8 @@ var ISSUE_HELP = {
|
|
|
900
903
|
he: {
|
|
901
904
|
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
905
|
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
|
|
906
|
+
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."],
|
|
907
|
+
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
908
|
},
|
|
906
909
|
en: {
|
|
907
910
|
what: "The site runs system commands or other programs from its code.",
|
|
@@ -913,8 +916,8 @@ var ISSUE_HELP = {
|
|
|
913
916
|
he: {
|
|
914
917
|
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
918
|
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
|
|
919
|
+
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)."],
|
|
920
|
+
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
921
|
},
|
|
919
922
|
en: {
|
|
920
923
|
what: "The site starts its own server that listens on a port, for example with Express.",
|
|
@@ -926,8 +929,8 @@ var ISSUE_HELP = {
|
|
|
926
929
|
he: {
|
|
927
930
|
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
931
|
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
|
|
932
|
+
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."],
|
|
933
|
+
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
934
|
},
|
|
932
935
|
en: {
|
|
933
936
|
what: "package.json has no build command, the command that builds the site.",
|
|
@@ -940,7 +943,7 @@ var ISSUE_HELP = {
|
|
|
940
943
|
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
944
|
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
945
|
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
|
|
946
|
+
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
947
|
},
|
|
945
948
|
en: {
|
|
946
949
|
what: "The site is built with a tool we do not run, such as WordPress, PHP or Python.",
|
|
@@ -979,7 +982,7 @@ var ISSUE_HELP = {
|
|
|
979
982
|
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
983
|
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
984
|
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
|
|
985
|
+
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
986
|
},
|
|
984
987
|
en: {
|
|
985
988
|
what: "The site is built with a tool whose support on DeployAI is still in beta.",
|
|
@@ -989,7 +992,7 @@ var ISSUE_HELP = {
|
|
|
989
992
|
},
|
|
990
993
|
astro_adapter_unsupported: {
|
|
991
994
|
he: {
|
|
992
|
-
what: "\u05D4\u05D0\u05EA\u05E8 \u05D1\u05E0\u05D5\u05D9 \u05D1
|
|
995
|
+
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
996
|
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
997
|
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
998
|
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 +1047,7 @@ var ISSUE_HELP = {
|
|
|
1044
1047
|
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
1048
|
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
1049
|
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
|
|
1050
|
+
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
1051
|
},
|
|
1049
1052
|
en: {
|
|
1050
1053
|
what: "A form has fields with no label that says what to fill in.",
|
|
@@ -1057,7 +1060,7 @@ var ISSUE_HELP = {
|
|
|
1057
1060
|
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
1061
|
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
1062
|
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
|
|
1063
|
+
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
1064
|
},
|
|
1062
1065
|
en: {
|
|
1063
1066
|
what: "The site has buttons with no name, usually buttons that show only an icon.",
|
|
@@ -1083,7 +1086,7 @@ var ISSUE_HELP = {
|
|
|
1083
1086
|
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
1087
|
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
1088
|
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
|
|
1089
|
+
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
1090
|
},
|
|
1088
1091
|
en: {
|
|
1089
1092
|
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 +1112,7 @@ var ISSUE_HELP = {
|
|
|
1109
1112
|
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
1113
|
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
1114
|
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
|
|
1115
|
+
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
1116
|
},
|
|
1114
1117
|
en: {
|
|
1115
1118
|
what: "The site has elements that force a custom order for the Tab key.",
|
|
@@ -1148,7 +1151,7 @@ var ISSUE_HELP = {
|
|
|
1148
1151
|
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
1152
|
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
1153
|
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
|
|
1154
|
+
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
1155
|
},
|
|
1153
1156
|
en: {
|
|
1154
1157
|
what: 'The home page does not start with a "Skip to content" link that goes straight to the main content.',
|
|
@@ -1161,7 +1164,7 @@ var ISSUE_HELP = {
|
|
|
1161
1164
|
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
1165
|
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
1166
|
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
|
|
1167
|
+
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
1168
|
},
|
|
1166
1169
|
en: {
|
|
1167
1170
|
what: "We did not find an accessibility statement on the site, or the home page does not link to it.",
|
|
@@ -20910,18 +20913,23 @@ var DeployResponse = external_exports.object({
|
|
|
20910
20913
|
versionId: external_exports.string(),
|
|
20911
20914
|
number: external_exports.number(),
|
|
20912
20915
|
queuePosition: external_exports.number(),
|
|
20913
|
-
previewUrl: external_exports.string()
|
|
20916
|
+
previewUrl: external_exports.string(),
|
|
20917
|
+
/** Only for a heavy home page (D-420): the files it loads from the site and whether it prefetches links. */
|
|
20918
|
+
page: external_exports.object({ files: external_exports.number(), prefetches: external_exports.boolean() }).optional()
|
|
20914
20919
|
});
|
|
20920
|
+
var VersionStatus = external_exports.enum(["queued", "building", "ready", "failed", "replaced"]);
|
|
20921
|
+
var MigrationStatus = external_exports.enum(["waiting", "queued", "running", "done", "failed"]);
|
|
20915
20922
|
var Version = external_exports.object({
|
|
20916
20923
|
id: external_exports.string(),
|
|
20917
20924
|
number: external_exports.number(),
|
|
20918
20925
|
message: external_exports.string(),
|
|
20919
|
-
status:
|
|
20926
|
+
status: VersionStatus,
|
|
20920
20927
|
isLive: external_exports.boolean(),
|
|
20921
20928
|
createdAt: external_exports.string(),
|
|
20922
20929
|
sizeBytes: external_exports.number(),
|
|
20923
20930
|
/** 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()
|
|
20931
|
+
error: external_exports.string().nullable().optional(),
|
|
20932
|
+
migrationStatus: MigrationStatus.nullable().optional()
|
|
20925
20933
|
});
|
|
20926
20934
|
var VersionsResponse = external_exports.object({ versions: external_exports.array(Version) });
|
|
20927
20935
|
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 +20942,27 @@ var StatusResponse = external_exports.object({
|
|
|
20934
20942
|
project: Project,
|
|
20935
20943
|
queue: external_exports.object({ position: external_exports.number(), running: external_exports.boolean() }),
|
|
20936
20944
|
/** The newest version, with the error and the end of the build log when it failed. */
|
|
20937
|
-
latest: external_exports.object({
|
|
20945
|
+
latest: external_exports.object({
|
|
20946
|
+
number: external_exports.number(),
|
|
20947
|
+
status: VersionStatus,
|
|
20948
|
+
error: external_exports.string().nullable(),
|
|
20949
|
+
logTail: external_exports.string().nullable(),
|
|
20950
|
+
migrationStatus: MigrationStatus.nullable().optional(),
|
|
20951
|
+
/** A ready version that is not live: its preview, for the owner to look at before promote (D-505). */
|
|
20952
|
+
preview: external_exports.string().nullable().optional(),
|
|
20953
|
+
/** Going live right now (D-528). */
|
|
20954
|
+
goingLive: external_exports.boolean().optional(),
|
|
20955
|
+
/** The go live check found it broken and the previous version came back (D-297, D-528). */
|
|
20956
|
+
wentBack: external_exports.object({ previous: external_exports.number(), reason: external_exports.string() }).nullable().optional()
|
|
20957
|
+
}).nullable().optional()
|
|
20938
20958
|
});
|
|
20939
20959
|
var ApiError = external_exports.object({
|
|
20940
20960
|
error: external_exports.string(),
|
|
20941
20961
|
messageHe: external_exports.string().optional(),
|
|
20942
20962
|
/** Where to buy what the call needs (D-206). */
|
|
20943
|
-
buyUrl: external_exports.string().optional()
|
|
20963
|
+
buyUrl: external_exports.string().optional(),
|
|
20964
|
+
/** The dashboard page that resolves the refusal, for example the SQL to approve. */
|
|
20965
|
+
url: external_exports.string().optional()
|
|
20944
20966
|
});
|
|
20945
20967
|
var AddonRunStatus = external_exports.enum(["todo", "served", "done", "failed", "skipped"]);
|
|
20946
20968
|
var AddonItem = external_exports.object({
|
|
@@ -21115,33 +21137,33 @@ var SITE = "site-<slug>";
|
|
|
21115
21137
|
var SITE_DATA = "dai-<project id>";
|
|
21116
21138
|
var ARCH_NODES = [
|
|
21117
21139
|
// 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, \
|
|
21140
|
+
{ 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
21141
|
{ 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
21142
|
{ 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
21143
|
{ 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
21144
|
// Platform
|
|
21123
|
-
{ id: "web", kind: "app", zone: "platform", label: "Web app (Next.js)", summary: "\u05D0\u05EA\u05E8 \u05D4\u05E9\u05D9\u05D5\u05D5\u05E7, \
|
|
21145
|
+
{ 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
21146
|
{ 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
21147
|
{ 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
21148
|
{ 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
21149
|
{ 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"] },
|
|
21150
|
+
{ 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
21151
|
// 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"],
|
|
21152
|
+
{ 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
21153
|
{ 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
|
|
21154
|
+
{ 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"] },
|
|
21155
|
+
{ 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"] },
|
|
21156
|
+
{ 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
21157
|
{ 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
|
|
21158
|
+
{ 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
21159
|
{ 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
21160
|
// 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"] },
|
|
21161
|
+
{ 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"] },
|
|
21162
|
+
{ 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
21163
|
{ 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
21164
|
{ 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"] },
|
|
21165
|
+
{ 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"] },
|
|
21166
|
+
{ 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
21167
|
// Customer sites
|
|
21146
21168
|
{ 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
21169
|
{ 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 +21232,7 @@ var ARCH_FLOWS = [
|
|
|
21210
21232
|
labelEn: "Site visit",
|
|
21211
21233
|
steps: [
|
|
21212
21234
|
{ 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
|
|
21235
|
+
{ 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
21236
|
{ 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
21237
|
{ edge: dispatchEdgeId("DISPATCHER"), text: "\u05D4\u05D1\u05E7\u05E9\u05D4 \u05E2\u05D5\u05D1\u05E8\u05EA \u05DC\u05BEnamespace.", textEn: "The request goes to the namespace." },
|
|
21216
21238
|
{ edge: "dispatcher-site", text: "\u05D4\u05BEWorker \u05E9\u05DC \u05D4\u05D0\u05EA\u05E8 \u05E2\u05D5\u05E0\u05D4.", textEn: "The site's Worker answers." },
|
|
@@ -21223,12 +21245,12 @@ var ARCH_FLOWS = [
|
|
|
21223
21245
|
label: "\u05DB\u05D9\u05D1\u05D5\u05D9 \u05D0\u05EA\u05E8",
|
|
21224
21246
|
labelEn: "Turn a site off",
|
|
21225
21247
|
steps: [
|
|
21226
|
-
{ edge: "browser-tunnel", text: '\u05D4\u05D1\u05E2\u05DC\u05D9\u05DD \u05DC\u05D5\u05D7\u05E5 "\u05DB\u05D1\u05D4" \u05D1\
|
|
21248
|
+
{ 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
21249
|
{ 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
21250
|
{ 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
21251
|
{ edge: "queue-worker", text: "\u05D4\u05BEworker \u05DE\u05E8\u05D9\u05E5 \u05D0\u05D5\u05EA\u05D4.", textEn: "The worker runs it." },
|
|
21230
21252
|
{ 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
|
|
21253
|
+
{ 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
21254
|
]
|
|
21233
21255
|
},
|
|
21234
21256
|
{
|
|
@@ -21251,7 +21273,7 @@ var ARCH_FLOWS = [
|
|
|
21251
21273
|
{ 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
21274
|
{ edge: "worker-visits", text: "\u05D1\u05D9\u05E7\u05D5\u05E8\u05D9\u05DD \u05DE\u05BEAnalytics Engine SQL.", textEn: "Visits from Analytics Engine SQL." },
|
|
21253
21275
|
{ 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\
|
|
21276
|
+
{ 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
21277
|
{ 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
21278
|
{ 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
21279
|
{ 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 +21283,8 @@ var ARCH_FLOWS = [
|
|
|
21261
21283
|
|
|
21262
21284
|
// ../shared/src/cost-model.ts
|
|
21263
21285
|
var DEFAULT_FLEET = {
|
|
21264
|
-
mix: { basic: 0.65, business: 0.3,
|
|
21265
|
-
sitesPerAccount: { free: 1, basic: 1, business: 2,
|
|
21286
|
+
mix: { basic: 0.65, business: 0.3, agency: 0.05 },
|
|
21287
|
+
sitesPerAccount: { free: 1, basic: 1, business: 2, agency: 6 },
|
|
21266
21288
|
freeProfile: "quiet",
|
|
21267
21289
|
paidProfile: "typical",
|
|
21268
21290
|
ownDomainShare: 0.6,
|
|
@@ -21283,12 +21305,10 @@ var PLAN_FEATURES = [
|
|
|
21283
21305
|
{ key: "ssl" },
|
|
21284
21306
|
{ key: "analytics", limit: "analyticsDays" },
|
|
21285
21307
|
{ key: "data", limit: "maxDataMb" },
|
|
21286
|
-
{ key: "
|
|
21308
|
+
{ key: "pageViews", limit: "maxPageViewsMonth" },
|
|
21287
21309
|
{ key: "deploys", limit: "maxDeploysDay" },
|
|
21288
|
-
{ key: "buildMinutes", limit: "maxBuildMinutesMonth" },
|
|
21289
21310
|
{ key: "emails", limit: "maxEmailsMonth" },
|
|
21290
21311
|
{ key: "versions", limit: "maxVersionsMb" },
|
|
21291
|
-
{ key: "invitedUsers", limit: "maxInvitedUsers" },
|
|
21292
21312
|
{ key: "helpDeploys" },
|
|
21293
21313
|
{ key: "helpEmail" },
|
|
21294
21314
|
{ key: "whatsapp", soon: true }
|
|
@@ -21304,11 +21324,12 @@ var LOGIN = { cmd: "npx deployai@latest login", say: "The owner approves it in t
|
|
|
21304
21324
|
var STATUS = { cmd: "npx deployai@latest status", say: "Run it until the new version is ready, then send the owner the preview address." };
|
|
21305
21325
|
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
21326
|
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.";
|
|
21327
|
+
var BUILD = { say: `Build the owner's site in this folder in place of the starter page, as the instructions above say, following README.md "Before you go live". Run check only after that.` };
|
|
21307
21328
|
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
21329
|
function startSteps(kind, opts = {}) {
|
|
21309
21330
|
switch (kind) {
|
|
21310
21331
|
case "new":
|
|
21311
|
-
return [CHECK, ASK, LOGIN, { cmd: 'npx deployai@latest deploy -m "first version"', say: DEPLOY_SAY }, STATUS, PROMOTE];
|
|
21332
|
+
return [...opts.starter ? [BUILD] : [], CHECK, ASK, LOGIN, { cmd: 'npx deployai@latest deploy -m "first version"', say: DEPLOY_SAY }, STATUS, PROMOTE];
|
|
21312
21333
|
case "update": {
|
|
21313
21334
|
const deploy = { cmd: 'npx deployai@latest deploy -m "<what changed, in a few words>"', say: DEPLOY_SAY };
|
|
21314
21335
|
return opts.emptyFolder ? [LOGIN, PULL, CHECK, ASK, deploy, STATUS, PROMOTE] : [CHECK, ASK, LOGIN, deploy, STATUS, PROMOTE];
|
|
@@ -21349,10 +21370,10 @@ var CLI_MAP_NODES = [
|
|
|
21349
21370
|
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
21371
|
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
21372
|
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."),
|
|
21373
|
+
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
21374
|
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
21375
|
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", "\
|
|
21376
|
+
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
21377
|
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
21378
|
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
21379
|
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 +21384,7 @@ var CLI_MAP_NODES = [
|
|
|
21363
21384
|
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
21385
|
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
21386
|
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, \
|
|
21387
|
+
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
21388
|
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
21389
|
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
21390
|
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 +21481,38 @@ function findSecretLine(text, re) {
|
|
|
21460
21481
|
}
|
|
21461
21482
|
return null;
|
|
21462
21483
|
}
|
|
21484
|
+
var PRIVATE_DIRS = /* @__PURE__ */ new Set([".deployai", ".claude", ".cursor", ".vscode", ".idea", ".git", ".github", ".husky"]);
|
|
21485
|
+
var PRIVATE_FILES = /* @__PURE__ */ new Set(["DEPLOYAI.md", "CLAUDE.md", "AGENTS.md", ".cursorrules", ".windsurfrules"]);
|
|
21486
|
+
var SERVED_DOT_DIR = ".well-known";
|
|
21487
|
+
var BUILD_DOTFILES = /* @__PURE__ */ new Set([".babelrc", ".babelrc.json", ".browserslistrc", ".postcssrc", ".postcssrc.json", ".postcssrc.js", ".postcssrc.cjs", ".postcssrc.mjs", ".swcrc", ".nvmrc", ".node-version", ".assetsignore"]);
|
|
21488
|
+
var segments = (path) => path.replace(/^\/+/, "").split("/").filter(Boolean);
|
|
21489
|
+
function privateProjectFile(path) {
|
|
21490
|
+
const parts = segments(path);
|
|
21491
|
+
const base = parts[parts.length - 1] ?? "";
|
|
21492
|
+
return PRIVATE_FILES.has(base) || parts.slice(0, -1).some((p) => PRIVATE_DIRS.has(p)) || PRIVATE_DIRS.has(base);
|
|
21493
|
+
}
|
|
21494
|
+
function dotPath(path) {
|
|
21495
|
+
const parts = segments(path);
|
|
21496
|
+
if (parts[0] === SERVED_DOT_DIR) parts.shift();
|
|
21497
|
+
return parts.some((p) => p.startsWith("."));
|
|
21498
|
+
}
|
|
21499
|
+
function neverUploadedFile(rel) {
|
|
21500
|
+
if (privateProjectFile(rel)) return true;
|
|
21501
|
+
const parts = segments(rel);
|
|
21502
|
+
if (parts.length === 1 && BUILD_DOTFILES.has(parts[0])) return false;
|
|
21503
|
+
return dotPath(rel);
|
|
21504
|
+
}
|
|
21505
|
+
|
|
21506
|
+
// ../shared/src/domain-sales.ts
|
|
21507
|
+
var IL_TLDS = ["co.il", "org.il", "net.il"];
|
|
21508
|
+
var DEFAULT_LIVEDNS_POINTS = { 5: 9100, 10: 8900, 20: 8700, 50: 8500, 100: 8200 };
|
|
21509
|
+
var pointCost = (points, pack) => Math.round(points[pack] / (1 + VAT_RATE));
|
|
21510
|
+
var DEFAULT_DOMAIN_REGISTRARS = {
|
|
21511
|
+
cloudflare: { enabled: true, feeRate: 0.03, maxUsdCentsPerDay: 1e4 },
|
|
21512
|
+
livedns: { enabled: true, feeRate: 0.01, pack: 5, costAgorot: pointCost(DEFAULT_LIVEDNS_POINTS, 5) },
|
|
21513
|
+
manual: { enabled: true, feeRate: 0.01, costAgorot: 7500 }
|
|
21514
|
+
};
|
|
21515
|
+
var LIVEDNS_TLDS = [...IL_TLDS, "com", "net", "org"];
|
|
21463
21516
|
|
|
21464
21517
|
// ../shared/src/env-scopes.ts
|
|
21465
21518
|
var ENV_KEYS = {
|
|
@@ -21468,14 +21521,18 @@ var ENV_KEYS = {
|
|
|
21468
21521
|
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
21522
|
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
21523
|
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)." },
|
|
21524
|
+
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
21525
|
TUNNEL_ORIGIN_CERT: { scope: "local", section: "app", about: "The cloudflared login certificate pnpm dev:public checks. Default ~/.cloudflared/cert.pem." },
|
|
21472
21526
|
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." },
|
|
21527
|
+
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
21528
|
CF_REGISTRAR_TOKEN: { scope: "server", section: "cloudflare", about: "Buys real domains (D-300): a Cloudflare token with Registrar edit only. Server only." },
|
|
21529
|
+
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." },
|
|
21530
|
+
LIVEDNS_PASSWORD: { scope: "server", section: "cloudflare", about: "Its password, sent in every LiveDNS call; never logged. Server only." },
|
|
21531
|
+
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
21532
|
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
21533
|
DISPATCH_RATE_LIMIT_FREE: { scope: "same", section: "cloudflare", about: "The same on a site on a free plan." },
|
|
21476
21534
|
DISPATCH_RATE_LIMIT_PAID: { scope: "same", section: "cloudflare", about: "The same on a site on a paid plan." },
|
|
21477
21535
|
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
21536
|
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
21537
|
GOOGLE_CLIENT_SECRET: { scope: "same", section: "login", about: "The secret of that Google client." },
|
|
21481
21538
|
GITHUB_CLIENT_ID: { scope: "same", section: "login", about: "GitHub, Settings, Developer settings, OAuth Apps, with both redirect addresses on it." },
|
|
@@ -21592,6 +21649,26 @@ var SPACES = {
|
|
|
21592
21649
|
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
21650
|
};
|
|
21594
21651
|
|
|
21652
|
+
// ../shared/src/agent-rules.ts
|
|
21653
|
+
var BUILD_WITH = [
|
|
21654
|
+
`Frameworks: ${SUPPORTED_FRAMEWORKS.map((f) => f.name).join(", ")}. In beta: ${BETA_FRAMEWORKS.map((f) => f.name).join(", ")} (Next.js through the OpenNext Cloudflare adapter).`,
|
|
21655
|
+
"Database: Cloudflare D1 (SQLite), through Drizzle with drizzle-orm/d1 or Prisma with the D1 adapter.",
|
|
21656
|
+
"Uploaded files and images: Cloudflare R2 (object storage), never the local disk.",
|
|
21657
|
+
"Settings and secrets: environment variables, set with: npx deployai@latest env set <key>",
|
|
21658
|
+
"Images: resize at build time or serve them as they are; no native image modules at runtime.",
|
|
21659
|
+
"Passwords: bcryptjs or Web Crypto, never native bcrypt.",
|
|
21660
|
+
"Server code runs per request: no long-running processes, background servers or child processes."
|
|
21661
|
+
];
|
|
21662
|
+
var KEEP_DATA_RULES = [
|
|
21663
|
+
"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:",
|
|
21664
|
+
"- 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.",
|
|
21665
|
+
"- 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.",
|
|
21666
|
+
"- User accounts and passwords: keep existing password hashes working (bcryptjs reads bcrypt hashes), so no one has to reset.",
|
|
21667
|
+
"- Sessions and cache (Redis, memory): these can be lost, and users may have to log in again. Say so.",
|
|
21668
|
+
"Never delete the old database, files or storage service."
|
|
21669
|
+
];
|
|
21670
|
+
var AGENT_POINTER = "Read DEPLOYAI.md before you write code, change the plan or add a dependency: this project is published with DeployAI.";
|
|
21671
|
+
|
|
21595
21672
|
// src/config.ts
|
|
21596
21673
|
import { randomUUID } from "crypto";
|
|
21597
21674
|
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
@@ -21629,6 +21706,7 @@ function loadConfig() {
|
|
|
21629
21706
|
};
|
|
21630
21707
|
if (typeof raw.apiUrl === "string") cfg.apiUrl = raw.apiUrl;
|
|
21631
21708
|
if (typeof raw.token === "string") cfg.token = raw.token;
|
|
21709
|
+
if (typeof raw.tokenApiUrl === "string") cfg.tokenApiUrl = raw.tokenApiUrl;
|
|
21632
21710
|
if (typeof raw.email === "string") cfg.email = raw.email;
|
|
21633
21711
|
if (raw.guestClaims && typeof raw.guestClaims === "object") {
|
|
21634
21712
|
const links = Object.fromEntries(Object.entries(raw.guestClaims).filter(([, v]) => typeof v === "string"));
|
|
@@ -21738,6 +21816,8 @@ var M = {
|
|
|
21738
21816
|
startInstalled: "Installed its packages (npm install).",
|
|
21739
21817
|
startBrief: "Wrote the owner's details to {file} (kept out of git and never uploaded).",
|
|
21740
21818
|
startLinked: 'Linked this folder to the site "{name}".',
|
|
21819
|
+
startRules: "Wrote the rules for your agent to DEPLOYAI.md (never uploaded).",
|
|
21820
|
+
startStarter: "Wrote a starter page (index.html) to build the site on.",
|
|
21741
21821
|
startRelinked: 'Linked this folder to the site "{name}" instead of the site it was linked to.',
|
|
21742
21822
|
statusLine: "Status: {s}",
|
|
21743
21823
|
ready: "ready",
|
|
@@ -21751,6 +21831,8 @@ var M = {
|
|
|
21751
21831
|
pasteFix: " Paste the prompt below into your AI editor, then run: npx deployai@latest check",
|
|
21752
21832
|
copied: " (copied to clipboard)",
|
|
21753
21833
|
runDeploy: ' Run: npx deployai@latest deploy -m "<message>"',
|
|
21834
|
+
initHint: " So your agent follows the DeployAI rules, run: npx deployai@latest init",
|
|
21835
|
+
emptyFolder: "Nothing to check yet: this folder has no site. Build the site here, then run: npx deployai@latest check",
|
|
21754
21836
|
deployTitle: "DeployAI deploy",
|
|
21755
21837
|
guestTitle: "DeployAI deploy (no account)",
|
|
21756
21838
|
uploading: "Uploading...",
|
|
@@ -21765,6 +21847,9 @@ var M = {
|
|
|
21765
21847
|
goesLive: "The new version goes live when its build is done.",
|
|
21766
21848
|
followBuild: " Run: npx deployai@latest status (to follow the build)",
|
|
21767
21849
|
thenPromote: " Then, only after the owner approves the preview: npx deployai@latest promote v{n} (to put it live)",
|
|
21850
|
+
heavyPage: "The home page loads {n} files from the site. Fewer files make it faster for visitors.",
|
|
21851
|
+
prefetchPage: "The home page fetches pages before anyone opens them (link prefetch). Turning it off on long link lists saves visitors data.",
|
|
21852
|
+
speedHint: " Check it: npx deployai@latest speed {url}",
|
|
21768
21853
|
queueWaiting: "waiting in queue, position {n}",
|
|
21769
21854
|
files: "Files",
|
|
21770
21855
|
skipped: "Skipped",
|
|
@@ -21788,26 +21873,33 @@ var M = {
|
|
|
21788
21873
|
statusTitle: "DeployAI status",
|
|
21789
21874
|
state: "State",
|
|
21790
21875
|
liveVersion: "Live version",
|
|
21876
|
+
newestVersion: "Newest version",
|
|
21877
|
+
promoteReady: " After the owner approves the preview: npx deployai@latest promote v{n} (to put it live)",
|
|
21878
|
+
askOwner: ' Version {n} is ready and not live. Ask the owner: "Version {n} is ready. Do you want to put it live?"',
|
|
21879
|
+
showPreview: " Send them the preview first: {url}",
|
|
21791
21880
|
notPublished: "not published yet",
|
|
21792
21881
|
none: "none",
|
|
21793
21882
|
buildingNow: "building now",
|
|
21794
21883
|
idle: "idle",
|
|
21795
21884
|
envListTitle: "Variables",
|
|
21796
|
-
envNone: "This site has no variables yet. Add one: npx deployai@latest env set <
|
|
21885
|
+
envNone: "This site has no variables yet. Add one: npx deployai@latest env set <KEY> <value>",
|
|
21797
21886
|
envSecret: "secret",
|
|
21798
21887
|
envPlain: "plain",
|
|
21799
|
-
envNeedValue: 'Give the value after the key, or pipe it in: echo "<value>" | npx deployai@latest env set <
|
|
21888
|
+
envNeedValue: 'Give the value after the key, or pipe it in: echo "<value>" | npx deployai@latest env set <KEY>',
|
|
21800
21889
|
envSavedSecret: "Saved {key} as a secret on the live site. Its value is not stored and is never shown again.",
|
|
21801
21890
|
envSavedPlain: "Saved {key}. The live site gets it in about a minute.",
|
|
21802
21891
|
envRemoved: "Removed {key}. The live site loses it in about a minute.",
|
|
21803
21892
|
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 _,
|
|
21893
|
+
envInvalidKey: "A variable name is capital English letters, digits and _, starts with a letter, up to 64 characters, like STRIPE_KEY.",
|
|
21805
21894
|
envTooLong: "The value is over 5 KB, too long for a variable.",
|
|
21806
21895
|
envSendFailed: "The secret did not reach the site. Try again in a minute.",
|
|
21807
21896
|
envNoKey: "This site has no variable with that name. See them: npx deployai@latest env list",
|
|
21808
21897
|
buildFailed: "The build of v{n} failed. The live site did not change.",
|
|
21898
|
+
wentBack: "v{n} went live but did not answer ({reason}), so v{prev} came back by itself. Fix the error, then deploy again.",
|
|
21899
|
+
goingLive: "v{n} is going live now. Run status again in a few seconds.",
|
|
21809
21900
|
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>"',
|
|
21901
|
+
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>"',
|
|
21902
|
+
buildFixHintNoNote: 'Fix the error above, then run: npx deployai@latest check, then npx deployai@latest deploy -m "<message>"',
|
|
21811
21903
|
linkedTo: "Linked to {name} ({slug}).",
|
|
21812
21904
|
loginTitle: "DeployAI login",
|
|
21813
21905
|
browserOpened: "Opened the browser. Approve the code there.",
|
|
@@ -21869,10 +21961,18 @@ var M = {
|
|
|
21869
21961
|
startExpired: "These instructions expired (they last 7 days). Copy them again from the DeployAI site.",
|
|
21870
21962
|
startUsedUp: "These instructions were already used 5 times. Copy them again from the DeployAI site.",
|
|
21871
21963
|
loginExpired: "The login code expired. Run: npx deployai@latest login",
|
|
21872
|
-
loggedOut: "Logged out. The token was removed from this computer.",
|
|
21964
|
+
loggedOut: "Logged out. The token was canceled and removed from this computer.",
|
|
21873
21965
|
protocol: "Unexpected answer from DeployAI. Run the latest CLI: npx deployai@latest",
|
|
21874
21966
|
guestClaimFirst: "This folder holds a temporary site, and you are logged in. Claim the site to your account first: {url}",
|
|
21875
21967
|
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.",
|
|
21968
|
+
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",
|
|
21969
|
+
sqlWaitingLine: "Database changes (SQL) wait for your approval before this version goes live: {url}",
|
|
21970
|
+
sqlWaiting: "This version has database changes (SQL) that have not run yet. Approve them in the dashboard first, then promote again: {url}",
|
|
21971
|
+
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.",
|
|
21972
|
+
linkConfirm: "Link this folder to {name} ({address})? (y/N) ",
|
|
21973
|
+
linkOnlyOne: "You have one site: {name} ({address}). To link it, or a new site, run:",
|
|
21974
|
+
linkCancelled: "Not linked. Nothing changed.",
|
|
21975
|
+
loggedOutLocalOnly: "Logged out on this computer. DeployAI could not be reached, so the token stays valid until it expires (30 days).",
|
|
21876
21976
|
savedIn: "Saved in .deployai/project.json",
|
|
21877
21977
|
createdProject: "Created the site {name}.",
|
|
21878
21978
|
noProjects: "No sites yet.",
|
|
@@ -21883,15 +21983,17 @@ var M = {
|
|
|
21883
21983
|
runLink: " Run: npx deployai@latest link",
|
|
21884
21984
|
nextSteps: "Next steps",
|
|
21885
21985
|
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" }
|
|
21986
|
+
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
21987
|
},
|
|
21888
21988
|
he: {
|
|
21889
21989
|
startTitle: "DeployAI start",
|
|
21890
21990
|
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
21991
|
startDownloaded: "\u05D4\u05D3\u05D5\u05D2\u05DE\u05D4 {key} \u05D4\u05D5\u05E8\u05D3\u05D4: {n} \u05E7\u05D1\u05E6\u05D9\u05DD.",
|
|
21892
21992
|
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
|
|
21993
|
+
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
21994
|
startLinked: '\u05D4\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D7\u05D5\u05D1\u05E8\u05D4 \u05DC\u05D0\u05EA\u05E8 "{name}".',
|
|
21995
|
+
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).",
|
|
21996
|
+
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
21997
|
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
21998
|
statusLine: "\u05DE\u05E6\u05D1: {s}",
|
|
21897
21999
|
ready: "\u05DE\u05D5\u05DB\u05DF \u05DC\u05E2\u05DC\u05D5\u05EA",
|
|
@@ -21905,6 +22007,8 @@ var M = {
|
|
|
21905
22007
|
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
22008
|
copied: " (\u05D4\u05D5\u05E2\u05EA\u05E7)",
|
|
21907
22009
|
runDeploy: ' \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest deploy -m "<message>"',
|
|
22010
|
+
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",
|
|
22011
|
+
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
22012
|
deployTitle: "DeployAI deploy",
|
|
21909
22013
|
guestTitle: "DeployAI deploy (\u05D1\u05DC\u05D9 \u05D7\u05E9\u05D1\u05D5\u05DF)",
|
|
21910
22014
|
uploading: "\u05DE\u05E2\u05DC\u05D9\u05DD...",
|
|
@@ -21919,49 +22023,59 @@ var M = {
|
|
|
21919
22023
|
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
22024
|
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
22025
|
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)",
|
|
22026
|
+
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.",
|
|
22027
|
+
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.",
|
|
22028
|
+
speedHint: " \u05DC\u05D1\u05D3\u05D9\u05E7\u05D4: npx deployai@latest speed {url}",
|
|
21922
22029
|
queueWaiting: "\u05DE\u05DE\u05EA\u05D9\u05DF \u05D1\u05EA\u05D5\u05E8, \u05DE\u05E7\u05D5\u05DD {n}",
|
|
21923
22030
|
files: "\u05E7\u05D1\u05E6\u05D9\u05DD",
|
|
21924
22031
|
skipped: "\u05D3\u05D9\u05DC\u05D2\u05E0\u05D5",
|
|
21925
|
-
skippedLarge: "{n} \u05E7\u05D1\u05E6\u05D9\u05DD \u05D2\u05D3\u05D5\u05DC\u05D9\u05DD \u05DE
|
|
22032
|
+
skippedLarge: "{n} \u05E7\u05D1\u05E6\u05D9\u05DD \u05D2\u05D3\u05D5\u05DC\u05D9\u05DD \u05DE\u05BE{max}: {names}",
|
|
21926
22033
|
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
22034
|
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
22035
|
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
22036
|
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
22037
|
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
|
|
22038
|
+
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
22039
|
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
22040
|
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
|
|
22041
|
+
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
22042
|
pullDamaged: "\u05D4\u05D4\u05D5\u05E8\u05D3\u05D4 \u05E4\u05D2\u05D5\u05DE\u05D4. \u05E0\u05E1\u05D5 \u05E9\u05D5\u05D1.",
|
|
21936
22043
|
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
|
|
22044
|
+
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
22045
|
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
|
|
22046
|
+
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
22047
|
promoteQueued: "\u05D4\u05E2\u05DC\u05D0\u05EA v{n} \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8 \u05D1\u05EA\u05D5\u05E8.",
|
|
21941
22048
|
runStatus: " \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest status",
|
|
21942
22049
|
statusTitle: "DeployAI status",
|
|
21943
22050
|
state: "\u05DE\u05E6\u05D1",
|
|
21944
22051
|
liveVersion: "\u05D2\u05E8\u05E1\u05D4 \u05D7\u05D9\u05D4",
|
|
22052
|
+
newestVersion: "\u05D2\u05E8\u05E1\u05D4 \u05D0\u05D7\u05E8\u05D5\u05E0\u05D4",
|
|
22053
|
+
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)",
|
|
22054
|
+
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?"',
|
|
22055
|
+
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
22056
|
notPublished: "\u05E2\u05D3\u05D9\u05D9\u05DF \u05DC\u05D0 \u05D1\u05D0\u05D5\u05D5\u05D9\u05E8",
|
|
21946
22057
|
none: "\u05D0\u05D9\u05DF",
|
|
21947
22058
|
buildingNow: "\u05D1\u05D5\u05E0\u05D9\u05DD \u05E2\u05DB\u05E9\u05D9\u05D5",
|
|
21948
22059
|
idle: "\u05E4\u05E0\u05D5\u05D9",
|
|
21949
22060
|
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 <
|
|
22061
|
+
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
22062
|
envSecret: "\u05E1\u05D5\u05D3",
|
|
21952
22063
|
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 <
|
|
22064
|
+
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
22065
|
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
22066
|
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
22067
|
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
22068
|
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
|
|
22069
|
+
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.",
|
|
22070
|
+
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
22071
|
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
22072
|
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
22073
|
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.",
|
|
22074
|
+
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.",
|
|
22075
|
+
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
22076
|
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>"',
|
|
22077
|
+
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>"',
|
|
22078
|
+
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
22079
|
linkedTo: "\u05DE\u05D7\u05D5\u05D1\u05E8 \u05DC {name} ({slug}).",
|
|
21966
22080
|
loginTitle: "DeployAI login",
|
|
21967
22081
|
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 +22086,17 @@ var M = {
|
|
|
21972
22086
|
help: "\u05E2\u05D6\u05E8\u05D4",
|
|
21973
22087
|
notLoggedIn: "\u05DC\u05D0 \u05DE\u05D7\u05D5\u05D1\u05E8\u05D9\u05DD. \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest login",
|
|
21974
22088
|
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\
|
|
22089
|
+
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
22090
|
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
22091
|
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
22092
|
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
|
|
22093
|
+
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",
|
|
22094
|
+
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
22095
|
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
22096
|
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
22097
|
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
|
|
22098
|
+
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.",
|
|
22099
|
+
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
22100
|
noProjectNamed: "\u05D0\u05D9\u05DF \u05D0\u05EA\u05E8 \u05D1\u05E9\u05DD {name}. \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest link",
|
|
21987
22101
|
noNameGiven: "\u05DC\u05D0 \u05E0\u05D1\u05D7\u05E8 \u05E9\u05DD.",
|
|
21988
22102
|
noProjectPicked: "\u05DC\u05D0 \u05E0\u05D1\u05D7\u05E8 \u05D0\u05EA\u05E8.",
|
|
@@ -21991,7 +22105,7 @@ var M = {
|
|
|
21991
22105
|
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
22106
|
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
22107
|
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
|
|
22108
|
+
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
22109
|
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
22110
|
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
22111
|
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 +22127,7 @@ var M = {
|
|
|
22013
22127
|
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
22128
|
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
22129
|
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
|
|
22130
|
+
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
22131
|
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
22132
|
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
22133
|
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 +22137,18 @@ var M = {
|
|
|
22023
22137
|
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
22138
|
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
22139
|
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
|
|
22140
|
+
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.",
|
|
22141
|
+
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
22142
|
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
|
|
22143
|
+
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.",
|
|
22144
|
+
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",
|
|
22145
|
+
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}",
|
|
22146
|
+
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}",
|
|
22147
|
+
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.",
|
|
22148
|
+
linkConfirm: "\u05DC\u05D7\u05D1\u05E8 \u05D0\u05EA \u05D4\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D4\u05D6\u05D5 \u05DC {name} ({address})? (y/N) ",
|
|
22149
|
+
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:",
|
|
22150
|
+
linkCancelled: "\u05DC\u05D0 \u05D7\u05D5\u05D1\u05E8. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05D4\u05E9\u05EA\u05E0\u05D4.",
|
|
22151
|
+
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
22152
|
savedIn: "\u05E0\u05E9\u05DE\u05E8 \u05D1 .deployai/project.json",
|
|
22031
22153
|
createdProject: "\u05E0\u05D5\u05E6\u05E8 \u05D4\u05D0\u05EA\u05E8 {name}.",
|
|
22032
22154
|
noProjects: "\u05D0\u05D9\u05DF \u05E2\u05D3\u05D9\u05D9\u05DF \u05D0\u05EA\u05E8\u05D9\u05DD.",
|
|
@@ -22036,8 +22158,8 @@ var M = {
|
|
|
22036
22158
|
runLinkPick: ' \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest link <slug>, \u05D0\u05D5: npx deployai@latest link --create "<name>"',
|
|
22037
22159
|
runLink: " \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest link",
|
|
22038
22160
|
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" }
|
|
22161
|
+
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.",
|
|
22162
|
+
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
22163
|
}
|
|
22042
22164
|
};
|
|
22043
22165
|
function stateName(state, root) {
|
|
@@ -22050,7 +22172,7 @@ function messages(root) {
|
|
|
22050
22172
|
}
|
|
22051
22173
|
|
|
22052
22174
|
// src/version.ts
|
|
22053
|
-
var CLI_VERSION = "0.1.0-beta.
|
|
22175
|
+
var CLI_VERSION = "0.1.0-beta.10";
|
|
22054
22176
|
|
|
22055
22177
|
// src/api.ts
|
|
22056
22178
|
function apiContext(apiFlag) {
|
|
@@ -22062,6 +22184,8 @@ function userAgent(cfg) {
|
|
|
22062
22184
|
}
|
|
22063
22185
|
function requireToken(ctx) {
|
|
22064
22186
|
if (!ctx.config.token) throw new CliError(messages(process.cwd())("notLoggedIn"), 1, "auth");
|
|
22187
|
+
const saved = ctx.config.tokenApiUrl?.replace(/\/+$/, "");
|
|
22188
|
+
if (saved && saved !== ctx.apiUrl.replace(/\/+$/, "")) throw new CliError(messages(process.cwd())("tokenOtherApi", { saved, url: ctx.apiUrl }), 1, "auth");
|
|
22065
22189
|
return ctx.config.token;
|
|
22066
22190
|
}
|
|
22067
22191
|
async function apiRequest(ctx, path, schema, opts = {}) {
|
|
@@ -22106,6 +22230,9 @@ async function apiRequest(ctx, path, schema, opts = {}) {
|
|
|
22106
22230
|
if (parsed2.success && parsed2.data.error === "not_entitled") {
|
|
22107
22231
|
throw new CliError(t("notEntitled", { url: parsed2.data.buyUrl ?? ctx.apiUrl }), 1, "not_entitled");
|
|
22108
22232
|
}
|
|
22233
|
+
if (parsed2.success && parsed2.data.error === "sql_waiting") {
|
|
22234
|
+
throw new CliError(t("sqlWaiting", { url: parsed2.data.url ?? `${ctx.apiUrl}/dashboard` }), 1, "sql_waiting");
|
|
22235
|
+
}
|
|
22109
22236
|
const known = parsed2.success ? knownError(parsed2.data.error, data?.max, t, { ...data, billingUrl: `${ctx.apiUrl}/billing` }) : null;
|
|
22110
22237
|
if (known) throw new CliError(known, 1, parsed2.success ? parsed2.data.error : "api");
|
|
22111
22238
|
const msg = parsed2.success ? parsed2.data.error : `HTTP ${res.status}`;
|
|
@@ -22208,7 +22335,8 @@ var TELEMETRY_SENT = [
|
|
|
22208
22335
|
"Linked project id, detected framework and version",
|
|
22209
22336
|
"After each check: compatible or not, blocker and warning codes (for example fs_write)",
|
|
22210
22337
|
"OS, architecture and Node version (in the request header)",
|
|
22211
|
-
"Your user id, only after login (from the login token)"
|
|
22338
|
+
"Your user id, only after login (from the login token)",
|
|
22339
|
+
"After a failed version, the one sentence you pass with deploy --fixed (what you changed, no code)"
|
|
22212
22340
|
];
|
|
22213
22341
|
var TELEMETRY_NEVER_SENT = [
|
|
22214
22342
|
"Source code or file contents",
|
|
@@ -22274,22 +22402,20 @@ async function sendTelemetryEvent(ctx, event) {
|
|
|
22274
22402
|
}
|
|
22275
22403
|
|
|
22276
22404
|
// src/commands/init.ts
|
|
22277
|
-
import { existsSync as
|
|
22405
|
+
import { appendFileSync, existsSync as existsSync5, readFileSync as readFileSync5, writeFileSync as writeFileSync3 } from "fs";
|
|
22278
22406
|
import { join as join5 } from "path";
|
|
22279
22407
|
|
|
22280
22408
|
// src/analyze.ts
|
|
22281
22409
|
import { execFileSync } from "child_process";
|
|
22282
|
-
import { existsSync as
|
|
22410
|
+
import { existsSync as existsSync4, readFileSync as readFileSync4, readdirSync as readdirSync2 } from "fs";
|
|
22283
22411
|
import { join as join4 } from "path";
|
|
22284
22412
|
|
|
22285
22413
|
// src/files.ts
|
|
22286
|
-
import { readdirSync, readFileSync as readFileSync3, lstatSync } from "fs";
|
|
22414
|
+
import { existsSync as existsSync3, readdirSync, readFileSync as readFileSync3, lstatSync } from "fs";
|
|
22287
22415
|
import { join as join3 } from "path";
|
|
22288
22416
|
var SKIP_DIRS = /* @__PURE__ */ new Set([
|
|
22289
22417
|
"node_modules",
|
|
22290
22418
|
".git",
|
|
22291
|
-
"dist",
|
|
22292
|
-
"build",
|
|
22293
22419
|
".next",
|
|
22294
22420
|
".astro",
|
|
22295
22421
|
".svelte-kit",
|
|
@@ -22297,9 +22423,19 @@ var SKIP_DIRS = /* @__PURE__ */ new Set([
|
|
|
22297
22423
|
".vercel",
|
|
22298
22424
|
".wrangler",
|
|
22299
22425
|
".turbo",
|
|
22300
|
-
".cache"
|
|
22301
|
-
"coverage"
|
|
22426
|
+
".cache"
|
|
22302
22427
|
]);
|
|
22428
|
+
var ROOT_BUILD_DIRS = /* @__PURE__ */ new Set(["dist", "build", "out", "coverage"]);
|
|
22429
|
+
function rootBuilds(root) {
|
|
22430
|
+
const file2 = join3(root, "package.json");
|
|
22431
|
+
if (!existsSync3(file2)) return false;
|
|
22432
|
+
try {
|
|
22433
|
+
const pkg = JSON.parse(readFileSync3(file2, "utf8"));
|
|
22434
|
+
return typeof pkg?.scripts?.build === "string";
|
|
22435
|
+
} catch {
|
|
22436
|
+
return true;
|
|
22437
|
+
}
|
|
22438
|
+
}
|
|
22303
22439
|
var MAX_FILE_BYTES = 10 * 1024 * 1024;
|
|
22304
22440
|
var MAX_TOTAL_BYTES = 50 * 1024 * 1024;
|
|
22305
22441
|
function isEnvFile(name) {
|
|
@@ -22370,10 +22506,19 @@ function loadIgnore(root) {
|
|
|
22370
22506
|
return [];
|
|
22371
22507
|
}
|
|
22372
22508
|
}
|
|
22509
|
+
function loadUploadIgnore(root) {
|
|
22510
|
+
let git = [];
|
|
22511
|
+
try {
|
|
22512
|
+
git = parseIgnore(readFileSync3(join3(root, ".gitignore"), "utf8"));
|
|
22513
|
+
} catch {
|
|
22514
|
+
}
|
|
22515
|
+
return [...git, ...loadIgnore(root)];
|
|
22516
|
+
}
|
|
22373
22517
|
function walkFiles(root, opts = {}) {
|
|
22374
22518
|
const result = [];
|
|
22375
22519
|
const maxFiles = opts.maxFiles ?? 2e4;
|
|
22376
22520
|
const rules = opts.ignore ?? [];
|
|
22521
|
+
const skipRootBuild = opts.skipRootBuild ?? rootBuilds(root);
|
|
22377
22522
|
const visit2 = (dirAbs, dirRel) => {
|
|
22378
22523
|
let names;
|
|
22379
22524
|
try {
|
|
@@ -22394,6 +22539,7 @@ function walkFiles(root, opts = {}) {
|
|
|
22394
22539
|
if (st.isSymbolicLink()) continue;
|
|
22395
22540
|
if (st.isDirectory()) {
|
|
22396
22541
|
if (SKIP_DIRS.has(name)) continue;
|
|
22542
|
+
if (!dirRel && skipRootBuild && ROOT_BUILD_DIRS.has(name)) continue;
|
|
22397
22543
|
if (isIgnored(rules, rel, true)) continue;
|
|
22398
22544
|
visit2(abs, rel);
|
|
22399
22545
|
} else if (st.isFile()) {
|
|
@@ -22407,12 +22553,12 @@ function walkFiles(root, opts = {}) {
|
|
|
22407
22553
|
return result;
|
|
22408
22554
|
}
|
|
22409
22555
|
function planUpload(root) {
|
|
22410
|
-
const all = walkFiles(root, { ignore:
|
|
22556
|
+
const all = walkFiles(root, { ignore: loadUploadIgnore(root), skipEnv: true, maxFiles: 1e5 });
|
|
22411
22557
|
const files = [];
|
|
22412
22558
|
const skippedLarge = [];
|
|
22413
22559
|
let totalBytes = 0;
|
|
22414
22560
|
for (const f of all) {
|
|
22415
|
-
if (f.rel
|
|
22561
|
+
if (neverUploadedFile(f.rel)) continue;
|
|
22416
22562
|
if (f.size > MAX_FILE_BYTES) {
|
|
22417
22563
|
skippedLarge.push(f);
|
|
22418
22564
|
continue;
|
|
@@ -22424,6 +22570,7 @@ function planUpload(root) {
|
|
|
22424
22570
|
}
|
|
22425
22571
|
|
|
22426
22572
|
// src/analyze.ts
|
|
22573
|
+
var INIT_FILES = /* @__PURE__ */ new Set(["DEPLOYAI.md", "AGENTS.md", "CLAUDE.md"]);
|
|
22427
22574
|
var CODE_EXT = /\.(js|jsx|ts|tsx|mjs|cjs|mts|cts|vue|svelte|astro)$/;
|
|
22428
22575
|
var SECRET_SCAN_EXT = /\.(js|jsx|ts|tsx|mjs|cjs|mts|cts|vue|svelte|astro|json|ya?ml|toml|html|prisma)$/;
|
|
22429
22576
|
var LOCKFILES = /* @__PURE__ */ new Set(["package-lock.json", "pnpm-lock.yaml", "yarn.lock", "bun.lock", "bun.lockb"]);
|
|
@@ -22501,10 +22648,10 @@ function depLine(pkgText, dep) {
|
|
|
22501
22648
|
return l ?? void 0;
|
|
22502
22649
|
}
|
|
22503
22650
|
function detectPackageManager(root, pkg) {
|
|
22504
|
-
if (
|
|
22505
|
-
if (
|
|
22506
|
-
if (
|
|
22507
|
-
if (
|
|
22651
|
+
if (existsSync4(join4(root, "pnpm-lock.yaml"))) return "pnpm";
|
|
22652
|
+
if (existsSync4(join4(root, "bun.lockb")) || existsSync4(join4(root, "bun.lock"))) return "bun";
|
|
22653
|
+
if (existsSync4(join4(root, "yarn.lock"))) return "yarn";
|
|
22654
|
+
if (existsSync4(join4(root, "package-lock.json"))) return "npm";
|
|
22508
22655
|
const pm = pkg?.packageManager?.split("@")[0];
|
|
22509
22656
|
if (pm === "pnpm" || pm === "yarn" || pm === "bun" || pm === "npm") return pm;
|
|
22510
22657
|
return pkg ? "npm" : "none";
|
|
@@ -22532,7 +22679,7 @@ function detectFramework2(root, pkg, files, sources) {
|
|
|
22532
22679
|
}
|
|
22533
22680
|
function detectLanguage(root, pkg, files) {
|
|
22534
22681
|
const deps = { ...pkg?.devDependencies ?? {}, ...pkg?.dependencies ?? {} };
|
|
22535
|
-
if (
|
|
22682
|
+
if (existsSync4(join4(root, "tsconfig.json")) || deps.typescript) return "TypeScript";
|
|
22536
22683
|
if (files.some((f) => /\.(ts|tsx|mts|cts)$/.test(f.rel) && !f.rel.endsWith(".d.ts"))) return "TypeScript";
|
|
22537
22684
|
if (files.some((f) => /\.(js|jsx|mjs|cjs)$/.test(f.rel)) || pkg) return "JavaScript";
|
|
22538
22685
|
return "HTML";
|
|
@@ -22549,7 +22696,7 @@ function isBuildTimeFile(rel) {
|
|
|
22549
22696
|
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
22697
|
}
|
|
22551
22698
|
function trackedEnvFiles(root) {
|
|
22552
|
-
if (!
|
|
22699
|
+
if (!existsSync4(join4(root, ".git"))) return [];
|
|
22553
22700
|
try {
|
|
22554
22701
|
const out2 = execFileSync("git", ["ls-files", "-z"], { cwd: root, encoding: "utf8", timeout: 5e3, stdio: ["ignore", "pipe", "ignore"] });
|
|
22555
22702
|
return out2.split("\0").filter((p) => {
|
|
@@ -22720,7 +22867,7 @@ function analyzeProject(root) {
|
|
|
22720
22867
|
}
|
|
22721
22868
|
if (!databases.some((d) => d.kind === "d1")) {
|
|
22722
22869
|
for (const name of ["wrangler.toml", "wrangler.json", "wrangler.jsonc"]) {
|
|
22723
|
-
if (!
|
|
22870
|
+
if (!existsSync4(join4(root, name))) continue;
|
|
22724
22871
|
const text = readFileSync4(join4(root, name), "utf8");
|
|
22725
22872
|
const at = text.search(/d1_databases/);
|
|
22726
22873
|
if (at < 0) continue;
|
|
@@ -22781,7 +22928,7 @@ function analyzeProject(root) {
|
|
|
22781
22928
|
}
|
|
22782
22929
|
const otherStack = detectOtherStack(files.map((f) => f.rel));
|
|
22783
22930
|
if (otherStack) add({ code: "other_stack", severity: "blocker", detail: ` ${otherStack.name}` });
|
|
22784
|
-
const empty = !files.some((f) => !f.rel.startsWith(".deployai/") && f.rel
|
|
22931
|
+
const empty = !files.some((f) => !f.rel.startsWith(".deployai/") && !INIT_FILES.has(f.rel) && !isEnvFile(f.rel.split("/").pop() ?? ""));
|
|
22785
22932
|
if (empty) add({ code: "no_files", severity: "blocker" });
|
|
22786
22933
|
if (framework.id === "unknown" && !otherStack && !empty) {
|
|
22787
22934
|
add({ code: "unknown_framework", severity: "warning", detail: framework.flavor ? ` (looks like ${framework.flavor})` : "" });
|
|
@@ -22879,13 +23026,34 @@ This project is published with DeployAI.
|
|
|
22879
23026
|
|
|
22880
23027
|
Always explain to the user in simple words, in the language they write to you in. The user may not read English.
|
|
22881
23028
|
|
|
22882
|
-
|
|
23029
|
+
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".
|
|
23030
|
+
|
|
23031
|
+
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.
|
|
23032
|
+
|
|
23033
|
+
## Build with
|
|
23034
|
+
|
|
23035
|
+
${BUILD_WITH.map((l) => `- ${l}`).join("\n")}
|
|
23036
|
+
|
|
23037
|
+
To start from working code, see the samples: npx deployai@latest samples
|
|
23038
|
+
|
|
23039
|
+
## Do not add
|
|
23040
|
+
|
|
22883
23041
|
- local file system writes
|
|
22884
23042
|
- database drivers DeployAI does not support (see: npx deployai@latest inspect)
|
|
22885
23043
|
- long-running processes or background servers
|
|
22886
23044
|
- native binary modules
|
|
22887
23045
|
- DeployAI or any cloud credentials in source code
|
|
22888
23046
|
|
|
23047
|
+
## Do not run
|
|
23048
|
+
|
|
23049
|
+
- 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
|
|
23050
|
+
|
|
23051
|
+
## Keep existing data
|
|
23052
|
+
|
|
23053
|
+
${KEEP_DATA_RULES.join("\n")}
|
|
23054
|
+
|
|
23055
|
+
## Check
|
|
23056
|
+
|
|
22889
23057
|
Before adding a dependency or a new server feature, run: npx deployai@latest check
|
|
22890
23058
|
Ask the developer before removing any existing functionality.
|
|
22891
23059
|
|
|
@@ -22893,30 +23061,47 @@ Files:
|
|
|
22893
23061
|
- .deployai/project.json: project id and settings (safe to commit)
|
|
22894
23062
|
- .deployai/last-check.json: latest check result (not committed)
|
|
22895
23063
|
`;
|
|
23064
|
+
var AGENT_FILES = ["AGENTS.md", "CLAUDE.md"];
|
|
22896
23065
|
function runInit(root, opts = {}) {
|
|
22897
23066
|
const created = [];
|
|
22898
23067
|
const kept = [];
|
|
23068
|
+
const updated = [];
|
|
22899
23069
|
const md = join5(root, "DEPLOYAI.md");
|
|
22900
|
-
if (
|
|
23070
|
+
if (existsSync5(md) && !opts.force) {
|
|
22901
23071
|
kept.push("DEPLOYAI.md");
|
|
22902
23072
|
} else {
|
|
22903
23073
|
writeFileSync3(md, DEPLOYAI_MD);
|
|
22904
23074
|
created.push("DEPLOYAI.md");
|
|
22905
23075
|
}
|
|
23076
|
+
if (opts.agentFiles !== false) {
|
|
23077
|
+
for (const name of AGENT_FILES) {
|
|
23078
|
+
const file2 = join5(root, name);
|
|
23079
|
+
const text = existsSync5(file2) ? readFileSync5(file2, "utf8") : null;
|
|
23080
|
+
if (text === null) {
|
|
23081
|
+
writeFileSync3(file2, `${AGENT_POINTER}
|
|
23082
|
+
`);
|
|
23083
|
+
created.push(name);
|
|
23084
|
+
} else if (text.includes("DEPLOYAI.md")) {
|
|
23085
|
+
kept.push(name);
|
|
23086
|
+
} else {
|
|
23087
|
+
const eol = text.includes("\r\n") ? "\r\n" : "\n";
|
|
23088
|
+
const gap = !text.trim() ? "" : text.endsWith("\n") ? eol : eol + eol;
|
|
23089
|
+
appendFileSync(file2, `${gap}${AGENT_POINTER}${eol}`);
|
|
23090
|
+
updated.push(name);
|
|
23091
|
+
}
|
|
23092
|
+
}
|
|
23093
|
+
}
|
|
22906
23094
|
ensureDeployaiDir(root);
|
|
22907
23095
|
const existing = readProject(root);
|
|
23096
|
+
const framework = existing?.framework ?? analyzeProject(root).inspect.framework.id;
|
|
22908
23097
|
if (existing) {
|
|
22909
23098
|
kept.push(".deployai/project.json");
|
|
22910
23099
|
} else {
|
|
22911
|
-
|
|
22912
|
-
writeProject(root, {
|
|
22913
|
-
projectId: null,
|
|
22914
|
-
framework: analysis.inspect.framework.id,
|
|
22915
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
22916
|
-
});
|
|
23100
|
+
writeProject(root, { projectId: null, framework, createdAt: (/* @__PURE__ */ new Date()).toISOString() });
|
|
22917
23101
|
created.push(".deployai/project.json");
|
|
22918
23102
|
}
|
|
22919
|
-
|
|
23103
|
+
const hasCode = existsSync5(join5(root, "package.json")) || framework !== "unknown";
|
|
23104
|
+
return { created, kept, updated, hasCode };
|
|
22920
23105
|
}
|
|
22921
23106
|
function initCommand(root, opts) {
|
|
22922
23107
|
const res = runInit(root, opts);
|
|
@@ -22926,6 +23111,7 @@ function initCommand(root, opts) {
|
|
|
22926
23111
|
out(
|
|
22927
23112
|
rows([
|
|
22928
23113
|
...res.created.map((f) => ["Created", f]),
|
|
23114
|
+
...res.updated.map((f) => ["Added a line", `${f} (read DEPLOYAI.md)`]),
|
|
22929
23115
|
...res.kept.map((f) => ["Kept", f]),
|
|
22930
23116
|
["Guard", ".deployai/last-check.json (git ignored)"],
|
|
22931
23117
|
["Linked project", project?.projectId ?? "none yet"]
|
|
@@ -22933,12 +23119,18 @@ function initCommand(root, opts) {
|
|
|
22933
23119
|
);
|
|
22934
23120
|
out();
|
|
22935
23121
|
out("Next step");
|
|
22936
|
-
|
|
23122
|
+
if (res.hasCode) {
|
|
23123
|
+
out(" Run: npx deployai@latest check");
|
|
23124
|
+
} else {
|
|
23125
|
+
out(" Start from a sample: npx deployai@latest samples");
|
|
23126
|
+
out(" Or tell your agent what to build, or to review your plan. It follows DEPLOYAI.md.");
|
|
23127
|
+
}
|
|
22937
23128
|
if (!project?.projectId) out(" Then: npx deployai@latest login, npx deployai@latest link");
|
|
22938
23129
|
}
|
|
22939
23130
|
|
|
22940
23131
|
// src/commands/check.ts
|
|
22941
|
-
import { writeFileSync as writeFileSync4 } from "fs";
|
|
23132
|
+
import { existsSync as existsSync6, writeFileSync as writeFileSync4 } from "fs";
|
|
23133
|
+
import { join as join6 } from "path";
|
|
22942
23134
|
|
|
22943
23135
|
// src/prompt.ts
|
|
22944
23136
|
var PROMPT_RULES = [
|
|
@@ -22948,8 +23140,10 @@ var PROMPT_RULES = [
|
|
|
22948
23140
|
"Keep the project runnable outside DeployAI.",
|
|
22949
23141
|
"Never add credentials to source code.",
|
|
22950
23142
|
"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."
|
|
23143
|
+
"For the database, use D1 as shown in the DeployAI CRUD sample.",
|
|
23144
|
+
"Follow DEPLOYAI.md for every future change. If it is missing, run: npx deployai@latest init"
|
|
22952
23145
|
];
|
|
23146
|
+
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
23147
|
var MAX_LOCATIONS = 3;
|
|
22954
23148
|
function locList(items) {
|
|
22955
23149
|
const locs = [...new Set(items.map(locationOf).filter(Boolean))];
|
|
@@ -22988,6 +23182,11 @@ function buildPrompt(analysis) {
|
|
|
22988
23182
|
if (def) lines.push(`- ${def.fixForAgent}`);
|
|
22989
23183
|
}
|
|
22990
23184
|
lines.push("");
|
|
23185
|
+
if (blockerGroups.some((g) => DATA_CODES.has(g.code))) {
|
|
23186
|
+
lines.push("Keep existing data:");
|
|
23187
|
+
lines.push(...KEEP_DATA_RULES);
|
|
23188
|
+
lines.push("");
|
|
23189
|
+
}
|
|
22991
23190
|
lines.push("Rules:");
|
|
22992
23191
|
for (const r of PROMPT_RULES) lines.push(`- ${r}`);
|
|
22993
23192
|
lines.push("");
|
|
@@ -23114,8 +23313,14 @@ async function runCheck(root, ctx, opts = {}) {
|
|
|
23114
23313
|
writeFileSync4(lastCheckFile(root), JSON.stringify(json2, null, 2) + "\n");
|
|
23115
23314
|
} catch {
|
|
23116
23315
|
}
|
|
23316
|
+
const empty = a.findings.length > 0 && a.findings.every((f) => f.code === "no_files");
|
|
23117
23317
|
if (opts.json) {
|
|
23118
23318
|
out(JSON.stringify(json2, null, 2));
|
|
23319
|
+
} else if (opts.print !== false && empty) {
|
|
23320
|
+
out("DeployAI check");
|
|
23321
|
+
out();
|
|
23322
|
+
out(messages(root)("emptyFolder"));
|
|
23323
|
+
if (!existsSync6(join6(root, "DEPLOYAI.md"))) out(messages(root)("initHint"));
|
|
23119
23324
|
} else if (opts.print !== false) {
|
|
23120
23325
|
printCheck(a);
|
|
23121
23326
|
out();
|
|
@@ -23137,6 +23342,7 @@ async function runCheck(root, ctx, opts = {}) {
|
|
|
23137
23342
|
} else {
|
|
23138
23343
|
out(t("runDeploy"));
|
|
23139
23344
|
}
|
|
23345
|
+
if (!existsSync6(join6(root, "DEPLOYAI.md"))) out(t("initHint"));
|
|
23140
23346
|
}
|
|
23141
23347
|
await telemetry;
|
|
23142
23348
|
return a;
|
|
@@ -23199,7 +23405,7 @@ async function loginCommand(ctx, opts = {}) {
|
|
|
23199
23405
|
});
|
|
23200
23406
|
if (poll.status === "approved") {
|
|
23201
23407
|
if (!poll.token) throw new CliError(messages()("loginNoToken"), 1, "protocol");
|
|
23202
|
-
updateConfig({ token: poll.token, email: poll.email, apiUrl: ctx.apiUrl });
|
|
23408
|
+
updateConfig({ token: poll.token, email: poll.email, apiUrl: ctx.apiUrl, tokenApiUrl: ctx.apiUrl });
|
|
23203
23409
|
out();
|
|
23204
23410
|
out(poll.email ? t("loggedInAs", { email: poll.email }) : t("loggedIn"));
|
|
23205
23411
|
out(t("nextStep"));
|
|
@@ -23210,9 +23416,18 @@ async function loginCommand(ctx, opts = {}) {
|
|
|
23210
23416
|
}
|
|
23211
23417
|
throw new CliError(t("loginExpired"), 1, "auth_expired");
|
|
23212
23418
|
}
|
|
23213
|
-
function logoutCommand() {
|
|
23214
|
-
|
|
23215
|
-
|
|
23419
|
+
async function logoutCommand(ctx) {
|
|
23420
|
+
let revoked = true;
|
|
23421
|
+
if (ctx.config.token) {
|
|
23422
|
+
const apiUrl = (ctx.config.tokenApiUrl ?? ctx.apiUrl).replace(/\/+$/, "");
|
|
23423
|
+
try {
|
|
23424
|
+
await apiRequest({ apiUrl, config: ctx.config }, "/api/cli/logout", null, { method: "POST", body: {}, timeoutMs: 1e4 });
|
|
23425
|
+
} catch (e2) {
|
|
23426
|
+
revoked = e2 instanceof CliError && e2.category === "auth";
|
|
23427
|
+
}
|
|
23428
|
+
}
|
|
23429
|
+
updateConfig({ token: void 0, tokenApiUrl: void 0, email: void 0 });
|
|
23430
|
+
out(messages()(revoked ? "loggedOut" : "loggedOutLocalOnly"));
|
|
23216
23431
|
}
|
|
23217
23432
|
async function whoamiCommand(ctx) {
|
|
23218
23433
|
const me = await apiRequest(ctx, "/api/cli/me", MeResponse);
|
|
@@ -23301,8 +23516,21 @@ async function linkCommand(root, ctx, target, opts) {
|
|
|
23301
23516
|
return;
|
|
23302
23517
|
}
|
|
23303
23518
|
if (projects.length === 1) {
|
|
23304
|
-
|
|
23305
|
-
|
|
23519
|
+
const p = projects[0];
|
|
23520
|
+
const address = p.url ?? p.slug;
|
|
23521
|
+
if (process.stdin.isTTY && process.stdout.isTTY) {
|
|
23522
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
23523
|
+
let answer;
|
|
23524
|
+
try {
|
|
23525
|
+
answer = (await rl.question(t("linkConfirm", { name: p.name, address }))).trim().toLowerCase();
|
|
23526
|
+
} finally {
|
|
23527
|
+
rl.close();
|
|
23528
|
+
}
|
|
23529
|
+
if (answer === "y" || answer === "yes") return save(root, p);
|
|
23530
|
+
out(t("linkCancelled"));
|
|
23531
|
+
return;
|
|
23532
|
+
}
|
|
23533
|
+
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
23534
|
}
|
|
23307
23535
|
const current = readProject(root)?.projectId;
|
|
23308
23536
|
out(t("projects"));
|
|
@@ -23328,7 +23556,7 @@ async function linkCommand(root, ctx, target, opts) {
|
|
|
23328
23556
|
import { createInterface as createInterface2 } from "readline/promises";
|
|
23329
23557
|
|
|
23330
23558
|
// src/tar.ts
|
|
23331
|
-
import { readFileSync as
|
|
23559
|
+
import { readFileSync as readFileSync6 } from "fs";
|
|
23332
23560
|
import { gzipSync } from "zlib";
|
|
23333
23561
|
var BLOCK = 512;
|
|
23334
23562
|
function writeString(buf, offset, length, value) {
|
|
@@ -23412,7 +23640,7 @@ function packFiles(files) {
|
|
|
23412
23640
|
return createTarGz(
|
|
23413
23641
|
files.map((f) => ({
|
|
23414
23642
|
name: f.rel,
|
|
23415
|
-
data:
|
|
23643
|
+
data: readFileSync6(f.abs),
|
|
23416
23644
|
mtimeMs: f.mtimeMs,
|
|
23417
23645
|
mode: f.mode & 64 ? 493 : 420
|
|
23418
23646
|
}))
|
|
@@ -23482,6 +23710,7 @@ async function deployCommand(root, ctx, opts) {
|
|
|
23482
23710
|
if (!ctx.config.token) {
|
|
23483
23711
|
const guestToken = project?.projectId ? ctx.config.guestTokens?.[project.projectId] : void 0;
|
|
23484
23712
|
if (guestToken) return deployVersion(root, { ...ctx, config: { ...ctx.config, token: guestToken } }, opts, true);
|
|
23713
|
+
if (project?.projectId) throw new CliError(messages(root)("guestAccountSite"), 1, "auth");
|
|
23485
23714
|
const interactive = Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
23486
23715
|
if (!opts.guest && !(interactive && await askGuest(root))) {
|
|
23487
23716
|
throw new CliError(messages(root)("deployNotLoggedIn"), 1, "auth");
|
|
@@ -23493,7 +23722,7 @@ async function deployCommand(root, ctx, opts) {
|
|
|
23493
23722
|
try {
|
|
23494
23723
|
return await deployVersion(root, ctx, opts, false);
|
|
23495
23724
|
} catch (e2) {
|
|
23496
|
-
if (!claim2 || !(e2 instanceof CliError) || e2.category !== "forbidden") throw e2;
|
|
23725
|
+
if (!claim2 || !(e2 instanceof CliError) || e2.category !== "forbidden" && e2.category !== "not_found") throw e2;
|
|
23497
23726
|
const t = messages(root);
|
|
23498
23727
|
const url2 = ctx.config.guestClaims?.[claim2];
|
|
23499
23728
|
throw new CliError(url2 ? t("guestClaimFirst", { url: url2 }) : t("guestClaimFirstNoLink"), 1, "guest_unclaimed");
|
|
@@ -23533,6 +23762,8 @@ async function deployVersion(root, ctx, opts, guest) {
|
|
|
23533
23762
|
const form = new FormData();
|
|
23534
23763
|
form.append("projectId", project.projectId);
|
|
23535
23764
|
form.append("message", message);
|
|
23765
|
+
const fixed = (opts.fixed ?? "").replace(/\s+/g, " ").trim().slice(0, 300);
|
|
23766
|
+
if (fixed && telemetryEnabled(ctx.config)) form.append("fixNote", fixed);
|
|
23536
23767
|
form.append("archive", new Blob([new Uint8Array(archive)], { type: "application/gzip" }), "source.tar.gz");
|
|
23537
23768
|
const res = await apiRequest(ctx, "/api/cli/deploy", DeployResponse, { method: "POST", form, timeoutMs: 5 * 6e4 });
|
|
23538
23769
|
out();
|
|
@@ -23540,6 +23771,7 @@ async function deployVersion(root, ctx, opts, guest) {
|
|
|
23540
23771
|
out(rows([[t("version"), `v${res.number}`], [t("queue"), queueText(res.queuePosition, root)], [t("address"), res.previewUrl]]));
|
|
23541
23772
|
out();
|
|
23542
23773
|
out(t("goesLive"));
|
|
23774
|
+
pageHint(res, root);
|
|
23543
23775
|
return;
|
|
23544
23776
|
}
|
|
23545
23777
|
out(
|
|
@@ -23553,6 +23785,15 @@ async function deployVersion(root, ctx, opts, guest) {
|
|
|
23553
23785
|
out(t("nextStep"));
|
|
23554
23786
|
out(t("followBuild"));
|
|
23555
23787
|
out(t("thenPromote", { n: res.number }));
|
|
23788
|
+
pageHint(res, root);
|
|
23789
|
+
}
|
|
23790
|
+
function pageHint(res, root) {
|
|
23791
|
+
if (!res.page) return;
|
|
23792
|
+
const t = messages(root);
|
|
23793
|
+
out();
|
|
23794
|
+
if (res.page.files > 40) out(t("heavyPage", { n: res.page.files }));
|
|
23795
|
+
if (res.page.prefetches) out(t("prefetchPage"));
|
|
23796
|
+
out(t("speedHint", { url: res.previewUrl.split("?")[0] }));
|
|
23556
23797
|
}
|
|
23557
23798
|
async function deployGuest(root, ctx, opts) {
|
|
23558
23799
|
const message = (opts.message ?? "").trim() || "first version";
|
|
@@ -23604,8 +23845,8 @@ async function claimCommand(root, ctx, opts) {
|
|
|
23604
23845
|
|
|
23605
23846
|
// src/commands/samples.ts
|
|
23606
23847
|
import { createInterface as createInterface3 } from "readline/promises";
|
|
23607
|
-
import { existsSync as
|
|
23608
|
-
import { dirname, join as
|
|
23848
|
+
import { existsSync as existsSync7, mkdirSync as mkdirSync3, readdirSync as readdirSync3, writeFileSync as writeFileSync5 } from "fs";
|
|
23849
|
+
import { dirname, join as join7, relative, resolve, sep } from "path";
|
|
23609
23850
|
import { gunzipSync } from "zlib";
|
|
23610
23851
|
var SAMPLES = [
|
|
23611
23852
|
{ key: "landing", title: "Landing page: a full one-page site with WhatsApp sign-up", stack: "static HTML and CSS" },
|
|
@@ -23616,7 +23857,7 @@ var SAMPLES = [
|
|
|
23616
23857
|
{ key: "admin", title: "Back office with login: dashboard, orders, stock, customers", stack: "Astro on Workers, D1" }
|
|
23617
23858
|
];
|
|
23618
23859
|
var MAX_BYTES = 20 * 1024 * 1024;
|
|
23619
|
-
var IGNORED = /* @__PURE__ */ new Set([".git", ".DS_Store", "Thumbs.db", ".deployai"]);
|
|
23860
|
+
var IGNORED = /* @__PURE__ */ new Set([".git", ".DS_Store", "Thumbs.db", ".deployai", "DEPLOYAI.md", "AGENTS.md", "CLAUDE.md"]);
|
|
23620
23861
|
function listSamples(apiUrl) {
|
|
23621
23862
|
out("DeployAI samples");
|
|
23622
23863
|
out("");
|
|
@@ -23626,7 +23867,7 @@ function listSamples(apiUrl) {
|
|
|
23626
23867
|
out(`See them live: ${apiUrl}/samples`);
|
|
23627
23868
|
}
|
|
23628
23869
|
function filesIn(dir) {
|
|
23629
|
-
return
|
|
23870
|
+
return existsSync7(dir) ? readdirSync3(dir).filter((f) => !IGNORED.has(f)) : [];
|
|
23630
23871
|
}
|
|
23631
23872
|
function freeFolder(cwd, key) {
|
|
23632
23873
|
for (let n2 = 1; ; n2++) {
|
|
@@ -23709,7 +23950,7 @@ async function samplesCommand(cwd, ctx, key, opts = {}) {
|
|
|
23709
23950
|
}
|
|
23710
23951
|
const written = await downloadSample(ctx, sample.key, root);
|
|
23711
23952
|
const base = resolve(root);
|
|
23712
|
-
const hasPackage =
|
|
23953
|
+
const hasPackage = existsSync7(join7(base, "package.json"));
|
|
23713
23954
|
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
23955
|
out("");
|
|
23715
23956
|
const t = messages(base);
|
|
@@ -23781,18 +24022,23 @@ async function versionsCommand(root, ctx) {
|
|
|
23781
24022
|
const sorted = [...versions].sort((a, b) => b.number - a.number);
|
|
23782
24023
|
out("Versions");
|
|
23783
24024
|
for (const v of sorted) {
|
|
24025
|
+
const status = v.status === "replaced" ? stateName("replaced", root) : v.status;
|
|
23784
24026
|
const cols = [
|
|
23785
24027
|
`v${v.number}`.padEnd(6),
|
|
23786
24028
|
(v.isLive ? "live" : "").padEnd(6),
|
|
23787
|
-
|
|
24029
|
+
status.padEnd(10),
|
|
23788
24030
|
shortDate(v.createdAt).padEnd(18),
|
|
23789
24031
|
formatBytes(v.sizeBytes).padEnd(10),
|
|
23790
24032
|
v.message
|
|
23791
24033
|
];
|
|
23792
24034
|
out(` ${cols.join("")}`);
|
|
23793
24035
|
if (v.error) out(` ${v.error}`);
|
|
24036
|
+
if (v.migrationStatus === "waiting") out(` ${messages(root)("sqlWaitingLine", { url: versionsPage(ctx, projectId) })}`);
|
|
23794
24037
|
}
|
|
23795
24038
|
}
|
|
24039
|
+
function versionsPage(ctx, projectId) {
|
|
24040
|
+
return `${ctx.apiUrl}/project/${encodeURIComponent(projectId)}/versions`;
|
|
24041
|
+
}
|
|
23796
24042
|
async function changeLiveCommand(root, ctx, version2, kind) {
|
|
23797
24043
|
requireToken(ctx);
|
|
23798
24044
|
const projectId = linkedProjectId(root);
|
|
@@ -23809,6 +24055,7 @@ async function statusCommand(root, ctx) {
|
|
|
23809
24055
|
const s = await apiRequest(ctx, `/api/cli/status?projectId=${encodeURIComponent(projectId)}`, StatusResponse);
|
|
23810
24056
|
const p = s.project;
|
|
23811
24057
|
const t = messages(root);
|
|
24058
|
+
const newer = s.latest && s.latest.number !== p.liveVersion ? s.latest : null;
|
|
23812
24059
|
out(t("statusTitle"));
|
|
23813
24060
|
out();
|
|
23814
24061
|
out(
|
|
@@ -23817,9 +24064,32 @@ async function statusCommand(root, ctx) {
|
|
|
23817
24064
|
[t("state"), stateName(p.status, root)],
|
|
23818
24065
|
[t("address"), p.url ?? t("notPublished")],
|
|
23819
24066
|
[t("liveVersion"), p.liveVersion ? `v${p.liveVersion}` : t("none")],
|
|
24067
|
+
// A newer upload than the live one: its state, so "follow the build" after deploy has something to follow.
|
|
24068
|
+
...newer ? [[t("newestVersion"), `v${newer.number} ${stateName(newer.status, root)}`]] : [],
|
|
23820
24069
|
[t("queue"), s.queue.running ? t("buildingNow") : s.queue.position > 0 ? queueText(s.queue.position, root) : t("idle")]
|
|
23821
24070
|
])
|
|
23822
24071
|
);
|
|
24072
|
+
if (s.latest?.goingLive) {
|
|
24073
|
+
out();
|
|
24074
|
+
out(t("goingLive", { n: s.latest.number }));
|
|
24075
|
+
return;
|
|
24076
|
+
}
|
|
24077
|
+
if (s.latest?.wentBack) {
|
|
24078
|
+
out();
|
|
24079
|
+
out(t("wentBack", { n: s.latest.number, prev: s.latest.wentBack.previous, reason: s.latest.wentBack.reason }));
|
|
24080
|
+
return;
|
|
24081
|
+
}
|
|
24082
|
+
if (newer?.status === "ready") {
|
|
24083
|
+
out();
|
|
24084
|
+
out(t("nextStep"));
|
|
24085
|
+
out(t("askOwner", { n: newer.number }));
|
|
24086
|
+
if (s.latest?.preview) out(t("showPreview", { url: s.latest.preview }));
|
|
24087
|
+
out(t("promoteReady", { n: newer.number }));
|
|
24088
|
+
}
|
|
24089
|
+
if (s.latest?.migrationStatus === "waiting") {
|
|
24090
|
+
out();
|
|
24091
|
+
out(t("sqlWaitingLine", { url: versionsPage(ctx, projectId) }));
|
|
24092
|
+
}
|
|
23823
24093
|
if (s.latest?.status !== "failed") return;
|
|
23824
24094
|
out();
|
|
23825
24095
|
out(t("buildFailed", { n: s.latest.number }));
|
|
@@ -23830,13 +24100,60 @@ async function statusCommand(root, ctx) {
|
|
|
23830
24100
|
for (const line of s.latest.logTail.split("\n")) out(` ${line}`);
|
|
23831
24101
|
}
|
|
23832
24102
|
out();
|
|
23833
|
-
out(t("buildFixHint"));
|
|
24103
|
+
out(t(telemetryEnabled(ctx.config) ? "buildFixHint" : "buildFixHintNoNote"));
|
|
23834
24104
|
}
|
|
23835
24105
|
|
|
23836
24106
|
// src/commands/start.ts
|
|
23837
24107
|
import { spawnSync as spawnSync2 } from "child_process";
|
|
23838
|
-
import { existsSync as
|
|
23839
|
-
import { join as
|
|
24108
|
+
import { existsSync as existsSync8, writeFileSync as writeFileSync7 } from "fs";
|
|
24109
|
+
import { join as join9, relative as relative2, resolve as resolve2 } from "path";
|
|
24110
|
+
|
|
24111
|
+
// src/commands/starter.ts
|
|
24112
|
+
import { writeFileSync as writeFileSync6 } from "fs";
|
|
24113
|
+
import { join as join8 } from "path";
|
|
24114
|
+
var esc2 = (s) => s.replace(/[&<>"]/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """ })[c]);
|
|
24115
|
+
function page(name, lang) {
|
|
24116
|
+
const he = lang === "he";
|
|
24117
|
+
const title = esc2(name || (he ? "\u05D4\u05D0\u05EA\u05E8 \u05E9\u05DC\u05D9" : "My site"));
|
|
24118
|
+
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.";
|
|
24119
|
+
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 ' : "";
|
|
24120
|
+
return `<!doctype html>
|
|
24121
|
+
<html lang="${he ? "he" : "en"}" dir="${he ? "rtl" : "ltr"}">
|
|
24122
|
+
<head>
|
|
24123
|
+
<meta charset="utf-8">
|
|
24124
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
24125
|
+
<title>${title}</title>
|
|
24126
|
+
${font}<style>
|
|
24127
|
+
body { margin: 0; min-height: 100vh; display: grid; place-items: center; font-family: ${he ? "Heebo, " : ""}system-ui, sans-serif; background: #fafafa; color: #18181b; }
|
|
24128
|
+
main { padding: 1.5rem; text-align: center; }
|
|
24129
|
+
h1 { margin: 0 0 .5rem; font-size: 2rem; }
|
|
24130
|
+
</style>
|
|
24131
|
+
</head>
|
|
24132
|
+
<body>
|
|
24133
|
+
<main>
|
|
24134
|
+
<h1>${title}</h1>
|
|
24135
|
+
<p>${soon}</p>
|
|
24136
|
+
</main>
|
|
24137
|
+
</body>
|
|
24138
|
+
</html>
|
|
24139
|
+
`;
|
|
24140
|
+
}
|
|
24141
|
+
var README = `# Starter page
|
|
24142
|
+
|
|
24143
|
+
DeployAI wrote this page so the folder starts as a working site. Build the owner's site here in its place.
|
|
24144
|
+
|
|
24145
|
+
## Before you go live
|
|
24146
|
+
|
|
24147
|
+
- Replace \`index.html\` with the owner's real site, in the languages they want. Keep it static HTML and CSS unless the site needs server code (forms, logins, data): then follow the stack in DEPLOYAI.md.
|
|
24148
|
+
- Nothing from this starter stays: no "coming soon" text goes live.
|
|
24149
|
+
- Delete this README or replace it with notes about the site.
|
|
24150
|
+
`;
|
|
24151
|
+
function writeStarter(root, name, lang) {
|
|
24152
|
+
writeFileSync6(join8(root, "index.html"), page(name ?? "", lang));
|
|
24153
|
+
writeFileSync6(join8(root, "README.md"), README);
|
|
24154
|
+
}
|
|
24155
|
+
|
|
24156
|
+
// src/commands/start.ts
|
|
23840
24157
|
var REASONS = { start_not_found: "startNotFound", start_expired: "startExpired", start_used_up: "startUsedUp" };
|
|
23841
24158
|
var reason = (code) => messages(process.cwd())(REASONS[code] ?? "startNotFound");
|
|
23842
24159
|
async function fetchStart(ctx, id) {
|
|
@@ -23868,25 +24185,32 @@ async function startCommand(cwd, ctx, id, opts = {}) {
|
|
|
23868
24185
|
const sameSite = Boolean(choices.projectId && readProject(here)?.projectId === choices.projectId);
|
|
23869
24186
|
const root = fresh && filesIn(here).length && !opts.here && !sameSite ? freeFolder(here, choices.slug ?? sample?.key ?? "site") : here;
|
|
23870
24187
|
const done = [];
|
|
23871
|
-
const
|
|
24188
|
+
const empty = !filesIn(root).length;
|
|
24189
|
+
const starter = kind === "new" && !sample && empty;
|
|
24190
|
+
const steps = startSteps(kind, { emptyFolder: kind === "update" && empty, starter });
|
|
23872
24191
|
updateProject(root, { lang: langOf(choices.ownerLanguage) });
|
|
23873
24192
|
const t = messages(root);
|
|
23874
24193
|
if (sample && !sameSite) {
|
|
23875
24194
|
const written = await downloadSample(ctx, sample.key, root);
|
|
23876
24195
|
done.push(t("startDownloaded", { key: sample.key, n: written }));
|
|
23877
|
-
if (
|
|
24196
|
+
if (existsSync8(join9(root, "package.json"))) {
|
|
23878
24197
|
if (opts.install !== false && install(root)) done.push(t("startInstalled"));
|
|
23879
24198
|
else steps.unshift({ cmd: "npm install", say: "Installs the sample's packages." });
|
|
23880
24199
|
}
|
|
23881
24200
|
}
|
|
24201
|
+
if (starter) {
|
|
24202
|
+
writeStarter(root, choices.name, langOf(choices.ownerLanguage));
|
|
24203
|
+
done.push(t("startStarter"));
|
|
24204
|
+
}
|
|
23882
24205
|
if (choices.brief) {
|
|
23883
24206
|
ensureDeployaiDir(root);
|
|
23884
|
-
|
|
24207
|
+
writeFileSync7(join9(root, BRIEF_FILE), `# The owner's details
|
|
23885
24208
|
|
|
23886
24209
|
${choices.brief}
|
|
23887
24210
|
`);
|
|
23888
24211
|
done.push(t("startBrief", { file: BRIEF_FILE }));
|
|
23889
24212
|
}
|
|
24213
|
+
if (runInit(root).created.includes("DEPLOYAI.md")) done.push(t("startRules"));
|
|
23890
24214
|
if (choices.projectId) {
|
|
23891
24215
|
const before = readProject(root);
|
|
23892
24216
|
writeProject(root, { ...before ?? {}, projectId: choices.projectId, name: choices.name ?? void 0, slug: choices.slug ?? void 0, createdAt: before?.createdAt ?? (/* @__PURE__ */ new Date()).toISOString() });
|
|
@@ -23912,7 +24236,7 @@ ${choices.brief}
|
|
|
23912
24236
|
}
|
|
23913
24237
|
|
|
23914
24238
|
// src/commands/addon.ts
|
|
23915
|
-
import { readFileSync as
|
|
24239
|
+
import { readFileSync as readFileSync7 } from "fs";
|
|
23916
24240
|
import { resolve as resolve3 } from "path";
|
|
23917
24241
|
function linkedProjectId2(root) {
|
|
23918
24242
|
const id = readProject(root)?.projectId;
|
|
@@ -23945,6 +24269,25 @@ async function addonsCommand(root, ctx) {
|
|
|
23945
24269
|
}
|
|
23946
24270
|
out(`Next: ${r.next}. Ask the site owner if they want to start it now, then run: npx deployai@latest addon next`);
|
|
23947
24271
|
}
|
|
24272
|
+
async function addonBuyCommand(root, ctx, key) {
|
|
24273
|
+
requireToken(ctx);
|
|
24274
|
+
const projectId = linkedProjectId2(root);
|
|
24275
|
+
const name = key.trim().toLowerCase();
|
|
24276
|
+
const r = await apiRequest(ctx, `/api/cli/addons?projectId=${encodeURIComponent(projectId)}`, AddonsResponse);
|
|
24277
|
+
if (!r.open) {
|
|
24278
|
+
out("The DeployAI marketplace is not open yet. Add-ons open soon.");
|
|
24279
|
+
return;
|
|
24280
|
+
}
|
|
24281
|
+
const a = r.addons.find((x) => x.key === name);
|
|
24282
|
+
if (!a) throw new CliError(`No add-on named ${name}. See the list: npx deployai@latest addons`, 1, "unknown");
|
|
24283
|
+
if (a.owned) {
|
|
24284
|
+
out(`This site already has ${a.name}. To run it: npx deployai@latest addon run ${a.key}`);
|
|
24285
|
+
return;
|
|
24286
|
+
}
|
|
24287
|
+
if (!a.buyUrl) throw new CliError(`${a.name} is not for sale right now.`, 1, "not_for_sale");
|
|
24288
|
+
out(`Send this link to the site owner. They pay once for this site, then run: npx deployai@latest addon run ${a.key}`);
|
|
24289
|
+
out(a.buyUrl);
|
|
24290
|
+
}
|
|
23948
24291
|
function printAddon(a) {
|
|
23949
24292
|
out(`DeployAI add-on ${a.position} of ${a.total}: ${a.name} (${a.key}, run ${a.runId}).`);
|
|
23950
24293
|
out("Follow these instructions step by step, with the site owner:");
|
|
@@ -23974,7 +24317,7 @@ async function addonDoneCommand(root, ctx, runId, opts) {
|
|
|
23974
24317
|
let report;
|
|
23975
24318
|
if (opts.report) {
|
|
23976
24319
|
try {
|
|
23977
|
-
report = JSON.parse(
|
|
24320
|
+
report = JSON.parse(readFileSync7(resolve3(root, opts.report), "utf8"));
|
|
23978
24321
|
} catch {
|
|
23979
24322
|
throw new CliError(`Cannot read the report file ${opts.report} as JSON.`, 1, "usage");
|
|
23980
24323
|
}
|
|
@@ -24070,7 +24413,7 @@ function buildProgram() {
|
|
|
24070
24413
|
const g = (cmd) => cmd.optsWithGlobals();
|
|
24071
24414
|
const root = (cmd) => resolve4(g(cmd).dir ?? process.cwd());
|
|
24072
24415
|
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));
|
|
24416
|
+
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
24417
|
program.command("inspect").description("show framework, package manager, language, database, storage").option("--json", "machine readable output").action((opts, cmd) => inspectCommand(root(cmd), opts));
|
|
24075
24418
|
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
24419
|
const a = await runCheck(root(cmd), ctx(cmd), opts);
|
|
@@ -24079,13 +24422,13 @@ function buildProgram() {
|
|
|
24079
24422
|
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
24423
|
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
24424
|
program.command("login").description("log in through the browser").action((_opts, cmd) => loginCommand(ctx(cmd), { root: root(cmd) }));
|
|
24082
|
-
program.command("logout").description("
|
|
24425
|
+
program.command("logout").description("cancel the login token and remove it from this computer").action((_opts, cmd) => logoutCommand(ctx(cmd)));
|
|
24083
24426
|
program.command("whoami").description("show the logged in user").action((_opts, cmd) => whoamiCommand(ctx(cmd)));
|
|
24084
24427
|
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
24428
|
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
24429
|
(project, opts, cmd) => linkCommand(root(cmd), ctx(cmd), project, opts)
|
|
24087
24430
|
);
|
|
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));
|
|
24431
|
+
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
24432
|
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
24433
|
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
24434
|
program.command("versions").description("list versions").action((_opts, cmd) => versionsCommand(root(cmd), ctx(cmd)));
|
|
@@ -24096,6 +24439,7 @@ function buildProgram() {
|
|
|
24096
24439
|
const addon = program.command("addon").description("run the add-ons of this site, one at a time");
|
|
24097
24440
|
addon.command("next").description("print the next add-on for your agent").action((_opts, cmd) => addonNextCommand(root(cmd), ctx(cmd)));
|
|
24098
24441
|
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));
|
|
24442
|
+
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
24443
|
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
24444
|
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
24445
|
const env = program.command("env").description("the site's environment variables: secrets by default, never shown again");
|