@poncho-ai/cli 0.39.0 → 0.40.0
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/.turbo/turbo-build.log +6 -6
- package/CHANGELOG.md +42 -0
- package/dist/{chunk-XCDN62XL.js → chunk-KVGMTYDD.js} +73 -17
- package/dist/cli.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/{run-interactive-ink-W5YJS7UH.js → run-interactive-ink-LJTKUUV4.js} +1 -1
- package/package.json +1 -1
- package/src/index.ts +1 -1
- package/src/init-onboarding.ts +8 -2
- package/src/scaffolding.ts +75 -13
- package/src/templates.ts +5 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @poncho-ai/cli@0.
|
|
2
|
+
> @poncho-ai/cli@0.40.0 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
|
[34mCLI[39m Building entry: src/cli.ts, src/index.ts
|
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
[34mCLI[39m Target: es2022
|
|
9
9
|
[34mESM[39m Build start
|
|
10
10
|
[32mESM[39m [1mdist/cli.js [22m[32m94.00 B[39m
|
|
11
|
-
[32mESM[39m [1mdist/run-interactive-ink-W5YJS7UH.js [22m[32m23.38 KB[39m
|
|
12
11
|
[32mESM[39m [1mdist/index.js [22m[32m3.10 KB[39m
|
|
13
|
-
[32mESM[39m [1mdist/
|
|
14
|
-
[32mESM[39m
|
|
12
|
+
[32mESM[39m [1mdist/run-interactive-ink-LJTKUUV4.js [22m[32m23.38 KB[39m
|
|
13
|
+
[32mESM[39m [1mdist/chunk-KVGMTYDD.js [22m[32m674.92 KB[39m
|
|
14
|
+
[32mESM[39m ⚡️ Build success in 84ms
|
|
15
15
|
[34mDTS[39m Build start
|
|
16
|
-
[32mDTS[39m ⚡️ Build success in
|
|
16
|
+
[32mDTS[39m ⚡️ Build success in 4409ms
|
|
17
17
|
[32mDTS[39m [1mdist/cli.d.ts [22m[32m20.00 B[39m
|
|
18
|
-
[32mDTS[39m [1mdist/index.d.ts [22m[32m13.
|
|
18
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m13.25 KB[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
# @poncho-ai/cli
|
|
2
2
|
|
|
3
|
+
## 0.40.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`496b684`](https://github.com/cesr/poncho-ai/commit/496b6848288cab564e0ff617495f5c34f5c07702) Thanks [@cesr](https://github.com/cesr)! - cli: add `poncho build railway` deploy target
|
|
8
|
+
|
|
9
|
+
Scaffolds `Dockerfile`, `server.js`, and `railway.toml` for deploying a
|
|
10
|
+
poncho agent to Railway. The `railway.toml` pins the builder to
|
|
11
|
+
`dockerfile`, so Railway doesn't fall back to Nixpacks (which misreads
|
|
12
|
+
`pnpm-workspace.yaml` and missing lockfiles, then fails the build before
|
|
13
|
+
producing useful logs — a common gotcha when migrating from Vercel).
|
|
14
|
+
Also accepts `railway` as a `DeployTarget` in the onboarding flow and
|
|
15
|
+
documents the new target in the README and AGENT.md template.
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- [`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
|
|
20
|
+
|
|
21
|
+
Three issues with the scaffolded Dockerfiles:
|
|
22
|
+
1. **Base image was `node:20-slim`**, but `isolated-vm@6.1.2` (used by
|
|
23
|
+
the bash sandbox / `run_code`) only ships prebuilt binaries for Node
|
|
24
|
+
22+ ABIs. On Node 20, npm fell back to compiling from source, which
|
|
25
|
+
fails because the C++ code references `v8::SourceLocation` — a V8 12
|
|
26
|
+
API not present in Node 20's V8 11. Bumped to `node:22-slim`.
|
|
27
|
+
2. **Server entrypoint couldn't find `@poncho-ai/cli`.** The Dockerfile
|
|
28
|
+
ran `npm install -g @poncho-ai/cli` but `server.js` does
|
|
29
|
+
`import { startDevServer } from "@poncho-ai/cli"`. Globally installed
|
|
30
|
+
packages aren't on Node's ESM resolution path without `NODE_PATH`,
|
|
31
|
+
so the import failed at runtime. Replaced with `npm install --omit=dev`
|
|
32
|
+
so the CLI (and any other deps in the user's `package.json`) is
|
|
33
|
+
installed locally in `/app/node_modules`.
|
|
34
|
+
3. **Browser tools didn't work.** When `browser: true` is set in
|
|
35
|
+
`poncho.config.js`, Playwright needs system Chromium libs that
|
|
36
|
+
`node:22-slim` doesn't include. The scaffold now detects browser
|
|
37
|
+
config and conditionally adds an `apt-get install` layer with the
|
|
38
|
+
required libs (`libnss3`, `libxkbcommon0`, etc.) — only when needed,
|
|
39
|
+
so users without browser keep a lean image.
|
|
40
|
+
|
|
41
|
+
Also reordered `COPY package.json` + `RUN npm install` to run before
|
|
42
|
+
copying app code, so `npm install` is cached across edits to `AGENT.md`,
|
|
43
|
+
skills, and tests.
|
|
44
|
+
|
|
3
45
|
## 0.39.0
|
|
4
46
|
|
|
5
47
|
### 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:
|
|
12864
|
+
`FROM node:22-slim
|
|
12854
12865
|
WORKDIR /app
|
|
12855
|
-
|
|
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:
|
|
12969
|
+
`FROM node:22-slim
|
|
12917
12970
|
WORKDIR /app
|
|
12918
|
-
|
|
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-
|
|
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
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
package/package.json
CHANGED
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 }) => {
|
package/src/init-onboarding.ts
CHANGED
|
@@ -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 (
|
|
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";
|
package/src/scaffolding.ts
CHANGED
|
@@ -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:
|
|
363
|
+
`FROM node:22-slim
|
|
350
364
|
WORKDIR /app
|
|
351
|
-
|
|
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:
|
|
471
|
+
`FROM node:22-slim
|
|
413
472
|
WORKDIR /app
|
|
414
|
-
|
|
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:
|