@poncho-ai/cli 0.39.0 → 0.40.1

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @poncho-ai/cli@0.39.0 build /home/runner/work/poncho-ai/poncho-ai/packages/cli
2
+ > @poncho-ai/cli@0.40.1 build /home/runner/work/poncho-ai/poncho-ai/packages/cli
3
3
  > tsup src/index.ts src/cli.ts --format esm --dts
4
4
 
5
5
  CLI Building entry: src/cli.ts, src/index.ts
@@ -8,11 +8,11 @@
8
8
  CLI Target: es2022
9
9
  ESM Build start
10
10
  ESM dist/cli.js 94.00 B
11
- ESM dist/run-interactive-ink-W5YJS7UH.js 23.38 KB
12
11
  ESM dist/index.js 3.10 KB
13
- ESM dist/chunk-XCDN62XL.js 673.51 KB
14
- ESM ⚡️ Build success in 88ms
12
+ ESM dist/run-interactive-ink-LJTKUUV4.js 23.38 KB
13
+ ESM dist/chunk-KVGMTYDD.js 674.92 KB
14
+ ESM ⚡️ Build success in 72ms
15
15
  DTS Build start
16
- DTS ⚡️ Build success in 4452ms
16
+ DTS ⚡️ Build success in 4002ms
17
17
  DTS dist/cli.d.ts 20.00 B
18
- DTS dist/index.d.ts 13.24 KB
18
+ DTS dist/index.d.ts 13.25 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,54 @@
1
1
  # @poncho-ai/cli
2
2
 
3
+ ## 0.40.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`8dec90d`](https://github.com/cesr/poncho-ai/commit/8dec90d4df246b0cc16adc9fae61a568db67cbfe)]:
8
+ - @poncho-ai/harness@0.40.1
9
+
10
+ ## 0.40.0
11
+
12
+ ### Minor Changes
13
+
14
+ - [`496b684`](https://github.com/cesr/poncho-ai/commit/496b6848288cab564e0ff617495f5c34f5c07702) Thanks [@cesr](https://github.com/cesr)! - cli: add `poncho build railway` deploy target
15
+
16
+ Scaffolds `Dockerfile`, `server.js`, and `railway.toml` for deploying a
17
+ poncho agent to Railway. The `railway.toml` pins the builder to
18
+ `dockerfile`, so Railway doesn't fall back to Nixpacks (which misreads
19
+ `pnpm-workspace.yaml` and missing lockfiles, then fails the build before
20
+ producing useful logs — a common gotcha when migrating from Vercel).
21
+ Also accepts `railway` as a `DeployTarget` in the onboarding flow and
22
+ documents the new target in the README and AGENT.md template.
23
+
24
+ ### Patch Changes
25
+
26
+ - [`496b684`](https://github.com/cesr/poncho-ai/commit/496b6848288cab564e0ff617495f5c34f5c07702) Thanks [@cesr](https://github.com/cesr)! - cli: fix `poncho build` Dockerfile scaffolds for docker/railway/fly
27
+
28
+ Three issues with the scaffolded Dockerfiles:
29
+ 1. **Base image was `node:20-slim`**, but `isolated-vm@6.1.2` (used by
30
+ the bash sandbox / `run_code`) only ships prebuilt binaries for Node
31
+ 22+ ABIs. On Node 20, npm fell back to compiling from source, which
32
+ fails because the C++ code references `v8::SourceLocation` — a V8 12
33
+ API not present in Node 20's V8 11. Bumped to `node:22-slim`.
34
+ 2. **Server entrypoint couldn't find `@poncho-ai/cli`.** The Dockerfile
35
+ ran `npm install -g @poncho-ai/cli` but `server.js` does
36
+ `import { startDevServer } from "@poncho-ai/cli"`. Globally installed
37
+ packages aren't on Node's ESM resolution path without `NODE_PATH`,
38
+ so the import failed at runtime. Replaced with `npm install --omit=dev`
39
+ so the CLI (and any other deps in the user's `package.json`) is
40
+ installed locally in `/app/node_modules`.
41
+ 3. **Browser tools didn't work.** When `browser: true` is set in
42
+ `poncho.config.js`, Playwright needs system Chromium libs that
43
+ `node:22-slim` doesn't include. The scaffold now detects browser
44
+ config and conditionally adds an `apt-get install` layer with the
45
+ required libs (`libnss3`, `libxkbcommon0`, etc.) — only when needed,
46
+ so users without browser keep a lean image.
47
+
48
+ Also reordered `COPY package.json` + `RUN npm install` to run before
49
+ copying app code, so `npm install` is cached across edits to `AGENT.md`,
50
+ skills, and tests.
51
+
3
52
  ## 0.39.0
4
53
 
5
54
  ### Minor Changes
@@ -12372,7 +12372,7 @@ cron:
12372
12372
 
12373
12373
  - \`poncho dev\`: jobs run via an in-process scheduler.
12374
12374
  - \`poncho build vercel\`: generates \`vercel.json\` cron entries. Set \`CRON_SECRET\` to the same value as \`PONCHO_AUTH_TOKEN\` so Vercel can authenticate.
12375
- - Docker/Fly.io: scheduler runs automatically.
12375
+ - Docker/Fly.io/Railway: scheduler runs automatically.
12376
12376
  - Lambda: use AWS EventBridge to trigger \`GET /api/cron/<jobName>\` with \`Authorization: Bearer <token>\`.
12377
12377
  - Trigger manually: \`curl http://localhost:3000/api/cron/daily-report\`
12378
12378
 
@@ -12496,6 +12496,10 @@ poncho build lambda
12496
12496
  # Fly.io
12497
12497
  poncho build fly
12498
12498
  fly deploy
12499
+
12500
+ # Railway
12501
+ poncho build railway
12502
+ railway up
12499
12503
  \`\`\`
12500
12504
 
12501
12505
  Set environment variables on your deployment platform:
@@ -12577,7 +12581,7 @@ var ensureFile = async (path, content) => {
12577
12581
  };
12578
12582
  var normalizeDeployTarget = (target) => {
12579
12583
  const normalized = target.toLowerCase();
12580
- if (normalized === "vercel" || normalized === "docker" || normalized === "lambda" || normalized === "fly") {
12584
+ if (normalized === "vercel" || normalized === "docker" || normalized === "lambda" || normalized === "fly" || normalized === "railway") {
12581
12585
  return normalized;
12582
12586
  }
12583
12587
  throw new Error(`Unsupported build target: ${target}`);
@@ -12738,14 +12742,21 @@ var scaffoldDeployTarget = async (projectDir, target, options) => {
12738
12742
  const port = Number.parseInt(process.env.PORT ?? "3000", 10);
12739
12743
  await startDevServer(Number.isNaN(port) ? 3000 : port, { workingDir: process.cwd() });
12740
12744
  `;
12745
+ let browserEnabled = false;
12746
+ try {
12747
+ const cfg = await loadPonchoConfig(projectDir);
12748
+ browserEnabled = !!cfg?.browser;
12749
+ } catch {
12750
+ }
12751
+ const chromiumLibsLayer = browserEnabled ? `RUN apt-get update && apt-get install -y --no-install-recommends \\
12752
+ ca-certificates fonts-liberation libnss3 libatk1.0-0 libatk-bridge2.0-0 \\
12753
+ libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 \\
12754
+ libxrandr2 libgbm1 libpango-1.0-0 libcairo2 libasound2 \\
12755
+ && rm -rf /var/lib/apt/lists/*
12756
+
12757
+ ` : "";
12741
12758
  if (target === "vercel") {
12742
12759
  const traceHints = [];
12743
- let browserEnabled = false;
12744
- try {
12745
- const cfg = await loadPonchoConfig(projectDir);
12746
- browserEnabled = !!cfg?.browser;
12747
- } catch {
12748
- }
12749
12760
  if (browserEnabled) {
12750
12761
  traceHints.push(`import("@poncho-ai/browser").catch(() => {});`);
12751
12762
  const projectPkgPath = resolve4(projectDir, "package.json");
@@ -12850,16 +12861,19 @@ export default async function handler(req, res) {
12850
12861
  const dockerfilePath = resolve4(projectDir, "Dockerfile");
12851
12862
  await writeScaffoldFile(
12852
12863
  dockerfilePath,
12853
- `FROM node:20-slim
12864
+ `FROM node:22-slim
12854
12865
  WORKDIR /app
12855
- COPY package.json package.json
12866
+
12867
+ ${chromiumLibsLayer}COPY package.json package.json
12868
+ RUN npm install --omit=dev
12869
+
12856
12870
  COPY AGENT.md AGENT.md
12857
12871
  COPY poncho.config.js poncho.config.js
12858
12872
  COPY skills skills
12859
12873
  COPY tests tests
12860
12874
  COPY .env.example .env.example
12861
- RUN corepack enable && npm install -g @poncho-ai/cli@^${cliVersion}
12862
12875
  COPY server.js server.js
12876
+
12863
12877
  EXPOSE 3000
12864
12878
  CMD ["node","server.js"]
12865
12879
  `,
@@ -12893,6 +12907,45 @@ export const handler = async (event = {}) => {
12893
12907
  //
12894
12908
  // Reminders: Create a CloudWatch Events rule that triggers GET /api/reminders/check
12895
12909
  // every 10 minutes (or your preferred interval) with Authorization: Bearer <PONCHO_AUTH_TOKEN>.
12910
+ `,
12911
+ { force: options?.force, writtenPaths, baseDir: projectDir }
12912
+ );
12913
+ } else if (target === "railway") {
12914
+ await writeScaffoldFile(
12915
+ resolve4(projectDir, "Dockerfile"),
12916
+ `FROM node:22-slim
12917
+ WORKDIR /app
12918
+
12919
+ ${chromiumLibsLayer}COPY package.json package.json
12920
+ RUN npm install --omit=dev
12921
+
12922
+ COPY AGENT.md AGENT.md
12923
+ COPY poncho.config.js poncho.config.js
12924
+ COPY skills skills
12925
+ COPY tests tests
12926
+ COPY .env.example .env.example
12927
+ COPY server.js server.js
12928
+
12929
+ EXPOSE 3000
12930
+ CMD ["node","server.js"]
12931
+ `,
12932
+ { force: options?.force, writtenPaths, baseDir: projectDir }
12933
+ );
12934
+ await writeScaffoldFile(resolve4(projectDir, "server.js"), sharedServerEntrypoint, {
12935
+ force: options?.force,
12936
+ writtenPaths,
12937
+ baseDir: projectDir
12938
+ });
12939
+ await writeScaffoldFile(
12940
+ resolve4(projectDir, "railway.toml"),
12941
+ `[build]
12942
+ builder = "dockerfile"
12943
+ dockerfilePath = "Dockerfile"
12944
+
12945
+ [deploy]
12946
+ startCommand = "node server.js"
12947
+ restartPolicyType = "on_failure"
12948
+ restartPolicyMaxRetries = 3
12896
12949
  `,
12897
12950
  { force: options?.force, writtenPaths, baseDir: projectDir }
12898
12951
  );
@@ -12913,15 +12966,18 @@ export const handler = async (event = {}) => {
12913
12966
  );
12914
12967
  await writeScaffoldFile(
12915
12968
  resolve4(projectDir, "Dockerfile"),
12916
- `FROM node:20-slim
12969
+ `FROM node:22-slim
12917
12970
  WORKDIR /app
12918
- COPY package.json package.json
12971
+
12972
+ ${chromiumLibsLayer}COPY package.json package.json
12973
+ RUN npm install --omit=dev
12974
+
12919
12975
  COPY AGENT.md AGENT.md
12920
12976
  COPY poncho.config.js poncho.config.js
12921
12977
  COPY skills skills
12922
12978
  COPY tests tests
12923
- RUN npm install -g @poncho-ai/cli@^${cliVersion}
12924
12979
  COPY server.js server.js
12980
+
12925
12981
  EXPOSE 3000
12926
12982
  CMD ["node","server.js"]
12927
12983
  `,
@@ -13501,7 +13557,7 @@ var askOnboardingQuestions = async (options) => {
13501
13557
  var getProviderModelName = (provider) => provider === "openai" || provider === "openai-codex" ? "gpt-5.3-codex" : "claude-opus-4-5";
13502
13558
  var normalizeDeployTarget2 = (value) => {
13503
13559
  const target = typeof value === "string" ? value.toLowerCase() : "";
13504
- if (target === "vercel" || target === "docker" || target === "fly" || target === "lambda") {
13560
+ if (target === "vercel" || target === "docker" || target === "fly" || target === "lambda" || target === "railway") {
13505
13561
  return target;
13506
13562
  }
13507
13563
  return "none";
@@ -14205,7 +14261,7 @@ var runInteractive = async (workingDir, params) => {
14205
14261
  await harness.initialize();
14206
14262
  const identity = await ensureAgentIdentity2(workingDir);
14207
14263
  try {
14208
- const { runInteractiveInk } = await import("./run-interactive-ink-W5YJS7UH.js");
14264
+ const { runInteractiveInk } = await import("./run-interactive-ink-LJTKUUV4.js");
14209
14265
  await runInteractiveInk({
14210
14266
  harness,
14211
14267
  params,
@@ -18068,7 +18124,7 @@ var buildCli = () => {
18068
18124
  process.exitCode = 1;
18069
18125
  }
18070
18126
  });
18071
- program.command("build").argument("[target]", "vercel|docker|lambda|fly").option("--force", "overwrite existing deployment files").description("Scaffold deployment files for a target").action(async (target, options) => {
18127
+ program.command("build").argument("[target]", "vercel|docker|lambda|fly|railway").option("--force", "overwrite existing deployment files").description("Scaffold deployment files for a target").action(async (target, options) => {
18072
18128
  if (!target) {
18073
18129
  return;
18074
18130
  }
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  main
4
- } from "./chunk-XCDN62XL.js";
4
+ } from "./chunk-KVGMTYDD.js";
5
5
 
6
6
  // src/cli.ts
7
7
  void main();
package/dist/index.d.ts CHANGED
@@ -78,7 +78,7 @@ declare const TEST_TEMPLATE = "tests:\n - name: \"Basic sanity\"\n task: \"W
78
78
  declare const SKILL_TEMPLATE = "---\nname: starter-skill\ndescription: Starter local skill template\nallowed-tools:\n - ./scripts/starter-echo.ts\n---\n\n# Starter Skill\n\nThis is a starter local skill created by `poncho init`.\n\n## Authoring Notes\n\n- Put executable JavaScript/TypeScript files in `scripts/`.\n- Ask the agent to call `run_skill_script` with `skill`, `script`, and optional `input`.\n";
79
79
  declare const SKILL_TOOL_TEMPLATE = "export default async function run(input) {\n const message = typeof input?.message === \"string\" ? input.message : \"\";\n return { echoed: message };\n}\n";
80
80
 
81
- type DeployTarget = "none" | "vercel" | "docker" | "fly" | "lambda";
81
+ type DeployTarget = "none" | "vercel" | "docker" | "fly" | "lambda" | "railway";
82
82
  type InitOnboardingOptions = {
83
83
  yes?: boolean;
84
84
  interactive?: boolean;
package/dist/index.js CHANGED
@@ -77,7 +77,7 @@ import {
77
77
  writeHtml,
78
78
  writeJson,
79
79
  writeScaffoldFile
80
- } from "./chunk-XCDN62XL.js";
80
+ } from "./chunk-KVGMTYDD.js";
81
81
  export {
82
82
  AGENT_TEMPLATE,
83
83
  ENV_TEMPLATE,
@@ -3,7 +3,7 @@ import {
3
3
  getMascotLines,
4
4
  inferConversationTitle,
5
5
  resolveHarnessEnvironment
6
- } from "./chunk-XCDN62XL.js";
6
+ } from "./chunk-KVGMTYDD.js";
7
7
 
8
8
  // src/run-interactive-ink.ts
9
9
  import * as readline from "readline";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@poncho-ai/cli",
3
- "version": "0.39.0",
3
+ "version": "0.40.1",
4
4
  "description": "CLI for building and deploying AI agents",
5
5
  "repository": {
6
6
  "type": "git",
@@ -28,9 +28,9 @@
28
28
  "react": "^19.2.4",
29
29
  "react-devtools-core": "^6.1.5",
30
30
  "yaml": "^2.8.1",
31
- "@poncho-ai/harness": "0.40.0",
32
31
  "@poncho-ai/messaging": "0.8.5",
33
- "@poncho-ai/sdk": "1.10.0"
32
+ "@poncho-ai/sdk": "1.10.0",
33
+ "@poncho-ai/harness": "0.40.1"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@types/busboy": "^1.5.4",
package/src/index.ts CHANGED
@@ -4741,7 +4741,7 @@ export const buildCli = (): Command => {
4741
4741
 
4742
4742
  program
4743
4743
  .command("build")
4744
- .argument("[target]", "vercel|docker|lambda|fly")
4744
+ .argument("[target]", "vercel|docker|lambda|fly|railway")
4745
4745
  .option("--force", "overwrite existing deployment files")
4746
4746
  .description("Scaffold deployment files for a target")
4747
4747
  .action(async (target: string | undefined, options: { force?: boolean }) => {
@@ -21,7 +21,7 @@ const bold = (s: string): string => `${C.bold}${s}${C.reset}`;
21
21
  const INPUT_CARET = "»";
22
22
 
23
23
  type OnboardingAnswers = Record<string, string | number | boolean>;
24
- export type DeployTarget = "none" | "vercel" | "docker" | "fly" | "lambda";
24
+ export type DeployTarget = "none" | "vercel" | "docker" | "fly" | "lambda" | "railway";
25
25
 
26
26
  export type InitOnboardingOptions = {
27
27
  yes?: boolean;
@@ -282,7 +282,13 @@ const getProviderModelName = (provider: string): string =>
282
282
 
283
283
  const normalizeDeployTarget = (value: unknown): DeployTarget => {
284
284
  const target = typeof value === "string" ? value.toLowerCase() : "";
285
- if (target === "vercel" || target === "docker" || target === "fly" || target === "lambda") {
285
+ if (
286
+ target === "vercel" ||
287
+ target === "docker" ||
288
+ target === "fly" ||
289
+ target === "lambda" ||
290
+ target === "railway"
291
+ ) {
286
292
  return target;
287
293
  }
288
294
  return "none";
@@ -25,7 +25,8 @@ export const normalizeDeployTarget = (target: string): DeployScaffoldTarget => {
25
25
  normalized === "vercel" ||
26
26
  normalized === "docker" ||
27
27
  normalized === "lambda" ||
28
- normalized === "fly"
28
+ normalized === "fly" ||
29
+ normalized === "railway"
29
30
  ) {
30
31
  return normalized;
31
32
  }
@@ -223,6 +224,25 @@ const port = Number.parseInt(process.env.PORT ?? "3000", 10);
223
224
  await startDevServer(Number.isNaN(port) ? 3000 : port, { workingDir: process.cwd() });
224
225
  `;
225
226
 
227
+ let browserEnabled = false;
228
+ try {
229
+ const cfg = await loadPonchoConfig(projectDir);
230
+ browserEnabled = !!cfg?.browser;
231
+ } catch { /* best-effort */ }
232
+
233
+ // Chromium runtime libs for Playwright when `browser: true`. Built as a
234
+ // single apt-get layer so it can be inserted verbatim into Dockerfiles
235
+ // for docker/railway/fly targets and stripped out otherwise.
236
+ const chromiumLibsLayer = browserEnabled
237
+ ? `RUN apt-get update && apt-get install -y --no-install-recommends \\
238
+ ca-certificates fonts-liberation libnss3 libatk1.0-0 libatk-bridge2.0-0 \\
239
+ libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 \\
240
+ libxrandr2 libgbm1 libpango-1.0-0 libcairo2 libasound2 \\
241
+ && rm -rf /var/lib/apt/lists/*
242
+
243
+ `
244
+ : "";
245
+
226
246
  if (target === "vercel") {
227
247
  // Build @vercel/nft trace hints for packages that are dynamically loaded
228
248
  // at runtime. Bare `import("pkg")` with a string literal is enough for
@@ -231,12 +251,6 @@ await startDevServer(Number.isNaN(port) ? 3000 : port, { workingDir: process.cwd
231
251
  // an optional package isn't installed.
232
252
  const traceHints: string[] = [];
233
253
 
234
- let browserEnabled = false;
235
- try {
236
- const cfg = await loadPonchoConfig(projectDir);
237
- browserEnabled = !!cfg?.browser;
238
- } catch { /* best-effort */ }
239
-
240
254
  if (browserEnabled) {
241
255
  traceHints.push(`import("@poncho-ai/browser").catch(() => {});`);
242
256
 
@@ -346,16 +360,19 @@ export default async function handler(req, res) {
346
360
  const dockerfilePath = resolve(projectDir, "Dockerfile");
347
361
  await writeScaffoldFile(
348
362
  dockerfilePath,
349
- `FROM node:20-slim
363
+ `FROM node:22-slim
350
364
  WORKDIR /app
351
- COPY package.json package.json
365
+
366
+ ${chromiumLibsLayer}COPY package.json package.json
367
+ RUN npm install --omit=dev
368
+
352
369
  COPY AGENT.md AGENT.md
353
370
  COPY poncho.config.js poncho.config.js
354
371
  COPY skills skills
355
372
  COPY tests tests
356
373
  COPY .env.example .env.example
357
- RUN corepack enable && npm install -g @poncho-ai/cli@^${cliVersion}
358
374
  COPY server.js server.js
375
+
359
376
  EXPOSE 3000
360
377
  CMD ["node","server.js"]
361
378
  `,
@@ -389,6 +406,48 @@ export const handler = async (event = {}) => {
389
406
  //
390
407
  // Reminders: Create a CloudWatch Events rule that triggers GET /api/reminders/check
391
408
  // every 10 minutes (or your preferred interval) with Authorization: Bearer <PONCHO_AUTH_TOKEN>.
409
+ `,
410
+ { force: options?.force, writtenPaths, baseDir: projectDir },
411
+ );
412
+ } else if (target === "railway") {
413
+ await writeScaffoldFile(
414
+ resolve(projectDir, "Dockerfile"),
415
+ `FROM node:22-slim
416
+ WORKDIR /app
417
+
418
+ ${chromiumLibsLayer}COPY package.json package.json
419
+ RUN npm install --omit=dev
420
+
421
+ COPY AGENT.md AGENT.md
422
+ COPY poncho.config.js poncho.config.js
423
+ COPY skills skills
424
+ COPY tests tests
425
+ COPY .env.example .env.example
426
+ COPY server.js server.js
427
+
428
+ EXPOSE 3000
429
+ CMD ["node","server.js"]
430
+ `,
431
+ { force: options?.force, writtenPaths, baseDir: projectDir },
432
+ );
433
+ await writeScaffoldFile(resolve(projectDir, "server.js"), sharedServerEntrypoint, {
434
+ force: options?.force,
435
+ writtenPaths,
436
+ baseDir: projectDir,
437
+ });
438
+ // Pin Railway to the Dockerfile builder so it doesn't try Nixpacks (which
439
+ // misreads pnpm-workspace.yaml or missing lockfiles and fails the build
440
+ // before producing useful logs).
441
+ await writeScaffoldFile(
442
+ resolve(projectDir, "railway.toml"),
443
+ `[build]
444
+ builder = "dockerfile"
445
+ dockerfilePath = "Dockerfile"
446
+
447
+ [deploy]
448
+ startCommand = "node server.js"
449
+ restartPolicyType = "on_failure"
450
+ restartPolicyMaxRetries = 3
392
451
  `,
393
452
  { force: options?.force, writtenPaths, baseDir: projectDir },
394
453
  );
@@ -409,15 +468,18 @@ export const handler = async (event = {}) => {
409
468
  );
410
469
  await writeScaffoldFile(
411
470
  resolve(projectDir, "Dockerfile"),
412
- `FROM node:20-slim
471
+ `FROM node:22-slim
413
472
  WORKDIR /app
414
- COPY package.json package.json
473
+
474
+ ${chromiumLibsLayer}COPY package.json package.json
475
+ RUN npm install --omit=dev
476
+
415
477
  COPY AGENT.md AGENT.md
416
478
  COPY poncho.config.js poncho.config.js
417
479
  COPY skills skills
418
480
  COPY tests tests
419
- RUN npm install -g @poncho-ai/cli@^${cliVersion}
420
481
  COPY server.js server.js
482
+
421
483
  EXPOSE 3000
422
484
  CMD ["node","server.js"]
423
485
  `,
package/src/templates.ts CHANGED
@@ -369,7 +369,7 @@ cron:
369
369
 
370
370
  - \`poncho dev\`: jobs run via an in-process scheduler.
371
371
  - \`poncho build vercel\`: generates \`vercel.json\` cron entries. Set \`CRON_SECRET\` to the same value as \`PONCHO_AUTH_TOKEN\` so Vercel can authenticate.
372
- - Docker/Fly.io: scheduler runs automatically.
372
+ - Docker/Fly.io/Railway: scheduler runs automatically.
373
373
  - Lambda: use AWS EventBridge to trigger \`GET /api/cron/<jobName>\` with \`Authorization: Bearer <token>\`.
374
374
  - Trigger manually: \`curl http://localhost:3000/api/cron/daily-report\`
375
375
 
@@ -493,6 +493,10 @@ poncho build lambda
493
493
  # Fly.io
494
494
  poncho build fly
495
495
  fly deploy
496
+
497
+ # Railway
498
+ poncho build railway
499
+ railway up
496
500
  \`\`\`
497
501
 
498
502
  Set environment variables on your deployment platform: