@percher/core 0.4.0 → 0.4.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.
- package/dist/commands/account.d.ts +24 -14
- package/dist/commands/account.d.ts.map +1 -1
- package/dist/commands/account.js +17 -4
- package/dist/commands/account.js.map +1 -1
- package/dist/commands/admin-reconcile-routes.d.ts +18 -0
- package/dist/commands/admin-reconcile-routes.d.ts.map +1 -0
- package/dist/commands/admin-reconcile-routes.js +22 -0
- package/dist/commands/admin-reconcile-routes.js.map +1 -0
- package/dist/commands/ai-files.d.ts +5 -17
- package/dist/commands/ai-files.d.ts.map +1 -1
- package/dist/commands/ai-files.js +3 -4
- package/dist/commands/ai-files.js.map +1 -1
- package/dist/commands/alerts.d.ts +69 -0
- package/dist/commands/alerts.d.ts.map +1 -0
- package/dist/commands/alerts.js +80 -0
- package/dist/commands/alerts.js.map +1 -0
- package/dist/commands/app-resources.d.ts +30 -0
- package/dist/commands/app-resources.d.ts.map +1 -0
- package/dist/commands/app-resources.js +34 -0
- package/dist/commands/app-resources.js.map +1 -0
- package/dist/commands/app-topology.d.ts +18 -0
- package/dist/commands/app-topology.d.ts.map +1 -0
- package/dist/commands/app-topology.js +25 -0
- package/dist/commands/app-topology.js.map +1 -0
- package/dist/commands/billing.d.ts +8 -8
- package/dist/commands/billing.d.ts.map +1 -1
- package/dist/commands/billing.js +1 -1
- package/dist/commands/billing.js.map +1 -1
- package/dist/commands/continue.d.ts +1 -1
- package/dist/commands/create.d.ts +2 -12
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +1 -1
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/dashboard.d.ts +2 -8
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +1 -1
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/data-export.d.ts +2 -8
- package/dist/commands/data-export.d.ts.map +1 -1
- package/dist/commands/data-export.js +1 -1
- package/dist/commands/data-export.js.map +1 -1
- package/dist/commands/data.d.ts +2 -8
- package/dist/commands/data.d.ts.map +1 -1
- package/dist/commands/data.js +1 -1
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/delete.d.ts +2 -8
- package/dist/commands/delete.d.ts.map +1 -1
- package/dist/commands/delete.js +1 -1
- package/dist/commands/delete.js.map +1 -1
- package/dist/commands/deploys.d.ts +4 -28
- package/dist/commands/deploys.d.ts.map +1 -1
- package/dist/commands/deploys.js +1 -1
- package/dist/commands/deploys.js.map +1 -1
- package/dist/commands/dev.d.ts +2 -6
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +1 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/diagnose.d.ts +2 -22
- package/dist/commands/diagnose.d.ts.map +1 -1
- package/dist/commands/diagnose.js +1 -1
- package/dist/commands/diagnose.js.map +1 -1
- package/dist/commands/doctor.d.ts +10 -35
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +12 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/domains.d.ts +5 -27
- package/dist/commands/domains.d.ts.map +1 -1
- package/dist/commands/domains.js +1 -1
- package/dist/commands/domains.js.map +1 -1
- package/dist/commands/env-scan.js +1 -1
- package/dist/commands/env-scan.js.map +1 -1
- package/dist/commands/env.d.ts +4 -20
- package/dist/commands/env.d.ts.map +1 -1
- package/dist/commands/env.js +1 -1
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/export.d.ts +1 -1
- package/dist/commands/forgejo.d.ts +45 -0
- package/dist/commands/forgejo.d.ts.map +1 -0
- package/dist/commands/forgejo.js +125 -0
- package/dist/commands/forgejo.js.map +1 -0
- package/dist/commands/generate.d.ts +2 -6
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +1 -1
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/github.d.ts +4 -15
- package/dist/commands/github.d.ts.map +1 -1
- package/dist/commands/github.js +17 -1
- package/dist/commands/github.js.map +1 -1
- package/dist/commands/import-project.d.ts +13 -9
- package/dist/commands/import-project.d.ts.map +1 -1
- package/dist/commands/import-project.js +73 -22
- package/dist/commands/import-project.js.map +1 -1
- package/dist/commands/init.d.ts +26 -11
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +103 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/insights.d.ts +2 -6
- package/dist/commands/insights.d.ts.map +1 -1
- package/dist/commands/insights.js +1 -1
- package/dist/commands/insights.js.map +1 -1
- package/dist/commands/login.d.ts +2 -8
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +22 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logs.d.ts +25 -10
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +65 -5
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/mcp.d.ts +2 -2
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +1 -1
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/migrate-supabase-map.d.ts +171 -0
- package/dist/commands/migrate-supabase-map.d.ts.map +1 -0
- package/dist/commands/migrate-supabase-map.js +452 -0
- package/dist/commands/migrate-supabase-map.js.map +1 -0
- package/dist/commands/migrate-supabase-schema.d.ts +67 -0
- package/dist/commands/migrate-supabase-schema.d.ts.map +1 -0
- package/dist/commands/migrate-supabase-schema.js +321 -0
- package/dist/commands/migrate-supabase-schema.js.map +1 -0
- package/dist/commands/migrate-supabase-scripts.d.ts +64 -0
- package/dist/commands/migrate-supabase-scripts.d.ts.map +1 -0
- package/dist/commands/migrate-supabase-scripts.js +564 -0
- package/dist/commands/migrate-supabase-scripts.js.map +1 -0
- package/dist/commands/migrate-supabase-sdk.d.ts +133 -0
- package/dist/commands/migrate-supabase-sdk.d.ts.map +1 -0
- package/dist/commands/migrate-supabase-sdk.js +1119 -0
- package/dist/commands/migrate-supabase-sdk.js.map +1 -0
- package/dist/commands/migrate-supabase-walker.d.ts +93 -0
- package/dist/commands/migrate-supabase-walker.d.ts.map +1 -0
- package/dist/commands/migrate-supabase-walker.js +413 -0
- package/dist/commands/migrate-supabase-walker.js.map +1 -0
- package/dist/commands/migrate-supabase.d.ts +81 -0
- package/dist/commands/migrate-supabase.d.ts.map +1 -0
- package/dist/commands/migrate-supabase.js +579 -0
- package/dist/commands/migrate-supabase.js.map +1 -0
- package/dist/commands/open.d.ts +2 -6
- package/dist/commands/open.d.ts.map +1 -1
- package/dist/commands/open.js +1 -1
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/publish-api-error.d.ts +46 -0
- package/dist/commands/publish-api-error.d.ts.map +1 -0
- package/dist/commands/publish-api-error.js +307 -0
- package/dist/commands/publish-api-error.js.map +1 -0
- package/dist/commands/publish.d.ts +40 -17
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +115 -8
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/push.d.ts +2 -12
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +2 -2
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/redeploy.d.ts +2 -8
- package/dist/commands/redeploy.d.ts.map +1 -1
- package/dist/commands/redeploy.js +2 -2
- package/dist/commands/redeploy.js.map +1 -1
- package/dist/commands/rename.d.ts +2 -8
- package/dist/commands/rename.d.ts.map +1 -1
- package/dist/commands/rename.js +1 -1
- package/dist/commands/rename.js.map +1 -1
- package/dist/commands/reproduce.d.ts +2 -8
- package/dist/commands/reproduce.d.ts.map +1 -1
- package/dist/commands/reproduce.js +1 -1
- package/dist/commands/reproduce.js.map +1 -1
- package/dist/commands/reset-superuser.d.ts +2 -16
- package/dist/commands/reset-superuser.d.ts.map +1 -1
- package/dist/commands/reset-superuser.js +1 -1
- package/dist/commands/reset-superuser.js.map +1 -1
- package/dist/commands/restore.d.ts +7 -22
- package/dist/commands/restore.d.ts.map +1 -1
- package/dist/commands/restore.js +1 -1
- package/dist/commands/restore.js.map +1 -1
- package/dist/commands/resume.d.ts +2 -6
- package/dist/commands/resume.d.ts.map +1 -1
- package/dist/commands/resume.js +1 -1
- package/dist/commands/resume.js.map +1 -1
- package/dist/commands/rollback.d.ts +2 -8
- package/dist/commands/rollback.d.ts.map +1 -1
- package/dist/commands/rollback.js +1 -1
- package/dist/commands/rollback.js.map +1 -1
- package/dist/commands/sharing.d.ts +48 -0
- package/dist/commands/sharing.d.ts.map +1 -0
- package/dist/commands/sharing.js +85 -0
- package/dist/commands/sharing.js.map +1 -0
- package/dist/commands/status.d.ts +2 -6
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/transfers.d.ts +34 -0
- package/dist/commands/transfers.d.ts.map +1 -0
- package/dist/commands/transfers.js +62 -0
- package/dist/commands/transfers.js.map +1 -0
- package/dist/commands/unsuspend.d.ts +2 -6
- package/dist/commands/unsuspend.d.ts.map +1 -1
- package/dist/commands/unsuspend.js +1 -1
- package/dist/commands/unsuspend.js.map +1 -1
- package/dist/commands/versions.d.ts +2 -6
- package/dist/commands/versions.d.ts.map +1 -1
- package/dist/commands/versions.js +1 -1
- package/dist/commands/versions.js.map +1 -1
- package/dist/commands/wait-deploy.d.ts +2 -12
- package/dist/commands/wait-deploy.d.ts.map +1 -1
- package/dist/commands/wait-deploy.js +1 -1
- package/dist/commands/wait-deploy.js.map +1 -1
- package/dist/context.d.ts +15 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/detect.d.ts +11 -0
- package/dist/detect.d.ts.map +1 -1
- package/dist/detect.js +31 -8
- package/dist/detect.js.map +1 -1
- package/dist/env-scan-source.js +1 -1
- package/dist/env-scan-source.js.map +1 -1
- package/dist/error-classifier.d.ts +17 -0
- package/dist/error-classifier.d.ts.map +1 -1
- package/dist/error-classifier.js +94 -8
- package/dist/error-classifier.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +63 -49
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +56 -42
- package/dist/index.js.map +1 -1
- package/dist/plans.d.ts +61 -5
- package/dist/plans.d.ts.map +1 -1
- package/dist/plans.js +78 -18
- package/dist/plans.js.map +1 -1
- package/dist/recovery.d.ts +60 -3
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +22 -0
- package/dist/recovery.js.map +1 -1
- package/dist/static-docker.d.ts +77 -0
- package/dist/static-docker.d.ts.map +1 -0
- package/dist/static-docker.js +105 -0
- package/dist/static-docker.js.map +1 -0
- package/dist/tarball.js +1 -1
- package/dist/tarball.js.map +1 -1
- package/dist/templates/ai-files/cursor-percher-mdc.d.ts.map +1 -1
- package/dist/templates/ai-files/cursor-percher-mdc.js +12 -9
- package/dist/templates/ai-files/cursor-percher-mdc.js.map +1 -1
- package/dist/templates.js +11 -11
- package/dist/templates.js.map +1 -1
- package/dist/watcher.js +1 -1
- package/dist/watcher.js.map +1 -1
- package/package.json +6 -2
package/dist/commands/github.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { z } from "zod
|
|
1
|
+
import { z } from "zod";
|
|
2
2
|
import { readPercherTomlAppName } from "../app-name";
|
|
3
3
|
import { PercherCoreError } from "../errors";
|
|
4
4
|
// Keep in sync with the API-side GITHUB_URL_RE in packages/api/src/routes/github.ts
|
|
@@ -10,6 +10,16 @@ export const githubConnectInputSchema = z.object({
|
|
|
10
10
|
.regex(GITHUB_URL_RE, "Must be a public GitHub HTTPS URL (https://github.com/owner/repo)")
|
|
11
11
|
.describe("Public GitHub repo URL (https://github.com/owner/repo)"),
|
|
12
12
|
branch: z.string().optional().describe("Branch to deploy and track (default: main)"),
|
|
13
|
+
/**
|
|
14
|
+
* FUTURE9 Fas 5 — opt-in to converting pushes to non-tracked branches
|
|
15
|
+
* into preview deploys. Default false — every push to a non-tracked
|
|
16
|
+
* branch is skipped today; flipping this on creates a preview URL
|
|
17
|
+
* at `<app>--p-<branch-slug>.percher.run` for every such push.
|
|
18
|
+
*/
|
|
19
|
+
autoPreviews: z
|
|
20
|
+
.boolean()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("Opt-in: push to a non-tracked branch creates a preview deploy at <app>--p-<branch-slug>.percher.run. Default false."),
|
|
13
23
|
});
|
|
14
24
|
function resolveApp(ctx, app) {
|
|
15
25
|
const name = app ?? readPercherTomlAppName(ctx.cwd);
|
|
@@ -28,6 +38,7 @@ export async function githubConnect(ctx, input) {
|
|
|
28
38
|
const deployment = await ctx.client.apps.importFromGithub(appRef, {
|
|
29
39
|
repoUrl: input.repoUrl,
|
|
30
40
|
branch,
|
|
41
|
+
...(input.autoPreviews !== undefined ? { autoPreviews: input.autoPreviews } : {}),
|
|
31
42
|
});
|
|
32
43
|
// 2. Generate webhook secret — separate call, may fail independently
|
|
33
44
|
let webhook = null;
|
|
@@ -78,6 +89,11 @@ export async function githubConnect(ctx, input) {
|
|
|
78
89
|
" Secret: [see webhookInstructions.secret]",
|
|
79
90
|
" Event: Just the push event",
|
|
80
91
|
`Every push to ${branch} will auto-deploy the app.`,
|
|
92
|
+
...(input.autoPreviews
|
|
93
|
+
? [
|
|
94
|
+
"Auto-previews enabled: pushes to any other branch will deploy to <app>--p-<branch-slug>.percher.run.",
|
|
95
|
+
]
|
|
96
|
+
: []),
|
|
81
97
|
].join("\n"),
|
|
82
98
|
};
|
|
83
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/commands/github.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/commands/github.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,25 @@
|
|
|
1
|
-
import { z } from "zod
|
|
1
|
+
import { z } from "zod";
|
|
2
2
|
import type { Context } from "../context";
|
|
3
3
|
export declare const importInputSchema: z.ZodObject<{
|
|
4
|
-
from: z.ZodOptional<z.ZodEnum<
|
|
4
|
+
from: z.ZodOptional<z.ZodEnum<{
|
|
5
|
+
vercel: "vercel";
|
|
6
|
+
netlify: "netlify";
|
|
7
|
+
}>>;
|
|
5
8
|
app: z.ZodOptional<z.ZodString>;
|
|
6
|
-
},
|
|
7
|
-
app?: string | undefined;
|
|
8
|
-
from?: "vercel" | "netlify" | undefined;
|
|
9
|
-
}, {
|
|
10
|
-
app?: string | undefined;
|
|
11
|
-
from?: "vercel" | "netlify" | undefined;
|
|
12
|
-
}>;
|
|
9
|
+
}, z.core.$strip>;
|
|
13
10
|
export type ImportInput = z.infer<typeof importInputSchema>;
|
|
14
11
|
export interface ImportResult {
|
|
15
12
|
provider: string;
|
|
16
13
|
configGenerated: boolean;
|
|
17
14
|
warnings: string[];
|
|
18
15
|
envVars: string[];
|
|
16
|
+
/**
|
|
17
|
+
* Extra files written next to percher.toml — the Dockerfile +
|
|
18
|
+
* Caddyfile scaffolded when the imported project is a static
|
|
19
|
+
* framework that needs a build step. Empty otherwise. Relative to
|
|
20
|
+
* the project root.
|
|
21
|
+
*/
|
|
22
|
+
scaffoldedFiles: string[];
|
|
19
23
|
}
|
|
20
24
|
export declare function importProject(ctx: Context, input?: ImportInput): Promise<ImportResult>;
|
|
21
25
|
//# sourceMappingURL=import-project.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-project.d.ts","sourceRoot":"","sources":["../../src/commands/import-project.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"import-project.d.ts","sourceRoot":"","sources":["../../src/commands/import-project.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAQ1C,eAAO,MAAM,iBAAiB;;;;;;iBAM5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAoKD,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,WAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAkEhG"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import { z } from "zod
|
|
3
|
+
import { z } from "zod";
|
|
4
4
|
import { PercherCoreError } from "../errors";
|
|
5
|
+
import { renderStaticFrameworkCaddyfile, renderStaticFrameworkDockerfile, STATIC_DOCKER_PORT, } from "../static-docker";
|
|
5
6
|
export const importInputSchema = z.object({
|
|
6
7
|
from: z
|
|
7
8
|
.enum(["vercel", "netlify"])
|
|
@@ -19,13 +20,15 @@ function detectProvider(cwd) {
|
|
|
19
20
|
function mapVercelFramework(framework) {
|
|
20
21
|
const map = {
|
|
21
22
|
nextjs: { runtime: "node", framework: "nextjs" },
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
// Static frameworks need a build step the `runtime = "static"`
|
|
24
|
+
// Caddy path won't run — they ship as `runtime = "docker"`.
|
|
25
|
+
"create-react-app": { runtime: "docker", framework: "vite", staticBuildSpa: true },
|
|
26
|
+
vite: { runtime: "docker", framework: "vite", staticBuildSpa: true },
|
|
24
27
|
svelte: { runtime: "node", framework: "sveltekit" },
|
|
25
28
|
remix: { runtime: "node", framework: "remix" },
|
|
26
|
-
astro: { runtime: "
|
|
29
|
+
astro: { runtime: "docker", framework: "astro", staticBuildSpa: false },
|
|
27
30
|
nuxtjs: { runtime: "node" },
|
|
28
|
-
gatsby: { runtime: "
|
|
31
|
+
gatsby: { runtime: "docker", staticBuildSpa: false },
|
|
29
32
|
};
|
|
30
33
|
return map[framework ?? ""] ?? { runtime: "node" };
|
|
31
34
|
}
|
|
@@ -34,14 +37,23 @@ function parseVercelJson(cwd) {
|
|
|
34
37
|
const config = JSON.parse(raw);
|
|
35
38
|
const warnings = [];
|
|
36
39
|
const envVars = [];
|
|
37
|
-
const { runtime, framework } = mapVercelFramework(config.framework);
|
|
38
|
-
const buildCommand = config.buildCommand ?? "bun run build";
|
|
39
|
-
const output = config.outputDirectory ?? (framework === "nextjs" ? ".next" : "dist");
|
|
40
|
+
const { runtime, framework, staticBuildSpa } = mapVercelFramework(config.framework);
|
|
40
41
|
let toml = `[app]\nname = "imported-app"\nruntime = "${runtime}"\n`;
|
|
41
42
|
if (framework)
|
|
42
43
|
toml += `framework = "${framework}"\n`;
|
|
43
|
-
|
|
44
|
-
if (
|
|
44
|
+
let staticBuild;
|
|
45
|
+
if (staticBuildSpa !== undefined) {
|
|
46
|
+
// Static framework that needs a build step → runtime = "docker"
|
|
47
|
+
// multi-stage build. The static Caddy runtime rejects a
|
|
48
|
+
// [build].command, so [build] is dropped and a Dockerfile +
|
|
49
|
+
// Caddyfile are scaffolded instead.
|
|
50
|
+
staticBuild = { outputDir: config.outputDirectory ?? "dist", spa: staticBuildSpa };
|
|
51
|
+
toml += `\n[web]\nport = ${STATIC_DOCKER_PORT}\nhealth = "/"\n`;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const buildCommand = config.buildCommand ?? "bun run build";
|
|
55
|
+
const output = config.outputDirectory ?? (framework === "nextjs" ? ".next" : "dist");
|
|
56
|
+
toml += `\n[build]\ncommand = "${buildCommand}"\noutput = "${output}"\n`;
|
|
45
57
|
toml += `\n[web]\nport = 3000\nhealth = "/api/health"\n`;
|
|
46
58
|
}
|
|
47
59
|
if (config.env) {
|
|
@@ -58,7 +70,7 @@ function parseVercelJson(cwd) {
|
|
|
58
70
|
if (config.installCommand && config.installCommand !== "npm install") {
|
|
59
71
|
warnings.push(`Custom install command "${config.installCommand}" — Percher uses bun install by default`);
|
|
60
72
|
}
|
|
61
|
-
return { toml, warnings, envVars };
|
|
73
|
+
return { toml, warnings, envVars, staticBuild };
|
|
62
74
|
}
|
|
63
75
|
function parseNetlifyToml(cwd) {
|
|
64
76
|
const raw = readFileSync(join(cwd, "netlify.toml"), "utf-8");
|
|
@@ -67,14 +79,27 @@ function parseNetlifyToml(cwd) {
|
|
|
67
79
|
// Simple TOML parsing for netlify.toml (build section)
|
|
68
80
|
const buildCommand = raw.match(/command\s*=\s*"([^"]+)"/)?.[1] ?? "bun run build";
|
|
69
81
|
const publishDir = raw.match(/publish\s*=\s*"([^"]+)"/)?.[1] ?? "dist";
|
|
70
|
-
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
82
|
+
const hasPackageJson = existsSync(join(cwd, "package.json"));
|
|
83
|
+
const looksLikeStaticOutput = publishDir === "dist" || publishDir === "build" || publishDir === "public";
|
|
84
|
+
let toml = `[app]\nname = "imported-app"\n`;
|
|
85
|
+
let staticBuild;
|
|
86
|
+
if (!hasPackageJson) {
|
|
87
|
+
// Plain static site, no build step — the static Caddy runtime
|
|
88
|
+
// serves the published files directly. No [build] section.
|
|
89
|
+
toml += `runtime = "static"\n`;
|
|
90
|
+
}
|
|
91
|
+
else if (looksLikeStaticOutput) {
|
|
92
|
+
// Static frontend that needs a build step → runtime = "docker"
|
|
93
|
+
// multi-stage build. netlify.toml doesn't name the framework, so
|
|
94
|
+
// assume an SPA (index.html fallback): a soft 404 on a static
|
|
95
|
+
// site generator is far less broken than a hard 404 on every
|
|
96
|
+
// deep link of an SPA.
|
|
97
|
+
toml += `runtime = "docker"\n\n[web]\nport = ${STATIC_DOCKER_PORT}\nhealth = "/"\n`;
|
|
98
|
+
staticBuild = { outputDir: publishDir, spa: true };
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
toml += `runtime = "node"\n`;
|
|
102
|
+
toml += `\n[build]\ncommand = "${buildCommand.replace(/npm run/g, "bun run")}"\noutput = "${publishDir}"\n`;
|
|
78
103
|
toml += `\n[web]\nport = 3000\nhealth = "/health"\n`;
|
|
79
104
|
}
|
|
80
105
|
// Check for environment variables
|
|
@@ -94,7 +119,7 @@ function parseNetlifyToml(cwd) {
|
|
|
94
119
|
if (raw.includes("[[redirects]]")) {
|
|
95
120
|
warnings.push("Netlify redirects detected — Percher doesn't support _redirects. Use your framework's built-in routing instead.");
|
|
96
121
|
}
|
|
97
|
-
return { toml, warnings, envVars };
|
|
122
|
+
return { toml, warnings, envVars, staticBuild };
|
|
98
123
|
}
|
|
99
124
|
export async function importProject(ctx, input = {}) {
|
|
100
125
|
const provider = input.from ?? detectProvider(ctx.cwd);
|
|
@@ -122,13 +147,39 @@ export async function importProject(ctx, input = {}) {
|
|
|
122
147
|
if (existsSync(tomlPath)) {
|
|
123
148
|
result.warnings.unshift("percher.toml already exists — overwriting with imported config");
|
|
124
149
|
}
|
|
125
|
-
const { writeFileSync } = await import("node:fs");
|
|
126
150
|
writeFileSync(tomlPath, result.toml);
|
|
151
|
+
// Static-framework imports ship as runtime = "docker": scaffold the
|
|
152
|
+
// multi-stage Dockerfile + Caddyfile so the project is deploy-ready.
|
|
153
|
+
// A pre-existing Dockerfile/Caddyfile is the user's own — leave it
|
|
154
|
+
// untouched and warn rather than clobbering it.
|
|
155
|
+
const scaffoldedFiles = [];
|
|
156
|
+
if (result.staticBuild) {
|
|
157
|
+
const targets = [
|
|
158
|
+
{
|
|
159
|
+
name: "Dockerfile",
|
|
160
|
+
content: renderStaticFrameworkDockerfile({ outputDir: result.staticBuild.outputDir }),
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
name: "Caddyfile",
|
|
164
|
+
content: renderStaticFrameworkCaddyfile({ spa: result.staticBuild.spa }),
|
|
165
|
+
},
|
|
166
|
+
];
|
|
167
|
+
for (const { name, content } of targets) {
|
|
168
|
+
const target = join(ctx.cwd, name);
|
|
169
|
+
if (existsSync(target)) {
|
|
170
|
+
result.warnings.push(`${name} already exists — left untouched. The imported config expects a multi-stage static build; merge by hand if needed.`);
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
writeFileSync(target, content, "utf-8");
|
|
174
|
+
scaffoldedFiles.push(name);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
127
177
|
return {
|
|
128
178
|
provider,
|
|
129
179
|
configGenerated: true,
|
|
130
180
|
warnings: result.warnings,
|
|
131
181
|
envVars: result.envVars,
|
|
182
|
+
scaffoldedFiles,
|
|
132
183
|
};
|
|
133
184
|
}
|
|
134
185
|
//# sourceMappingURL=import-project.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-project.js","sourceRoot":"","sources":["../../src/commands/import-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"import-project.js","sourceRoot":"","sources":["../../src/commands/import-project.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,26 +1,41 @@
|
|
|
1
1
|
import { type PercherConfig } from "@percher/toml";
|
|
2
|
-
import { z } from "zod
|
|
2
|
+
import { z } from "zod";
|
|
3
3
|
import type { Context } from "../context";
|
|
4
4
|
import { type DetectedFramework } from "../detect";
|
|
5
|
+
/**
|
|
6
|
+
* FUTURE11 Fas 5 — detect names that almost certainly came from an
|
|
7
|
+
* auto-generated temp directory (timestamps, date stamps, very long
|
|
8
|
+
* trailing slugs). These get a prompt in interactive mode and a
|
|
9
|
+
* stderr warning otherwise — preventing a temp-dir name from
|
|
10
|
+
* silently becoming the app's permanent subdomain.
|
|
11
|
+
*
|
|
12
|
+
* Exported for unit testing.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isSuspiciousAutoName(name: string): boolean;
|
|
5
15
|
export declare const initInputSchema: z.ZodObject<{
|
|
6
16
|
force: z.ZodOptional<z.ZodBoolean>;
|
|
7
17
|
name: z.ZodOptional<z.ZodString>;
|
|
8
|
-
dataMode: z.ZodOptional<z.ZodEnum<
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
dataMode?: "pocketbase" | "postgres" | "sqlite" | "none" | undefined;
|
|
17
|
-
}>;
|
|
18
|
+
dataMode: z.ZodOptional<z.ZodEnum<{
|
|
19
|
+
pocketbase: "pocketbase";
|
|
20
|
+
postgres: "postgres";
|
|
21
|
+
sqlite: "sqlite";
|
|
22
|
+
none: "none";
|
|
23
|
+
}>>;
|
|
24
|
+
interactive: z.ZodOptional<z.ZodBoolean>;
|
|
25
|
+
}, z.core.$strip>;
|
|
18
26
|
export type InitInput = z.infer<typeof initInputSchema>;
|
|
19
27
|
export interface InitResult {
|
|
20
28
|
path: string;
|
|
21
29
|
config: PercherConfig;
|
|
22
30
|
detected: DetectedFramework | null;
|
|
23
31
|
overwritten: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Extra files written next to percher.toml — currently the
|
|
34
|
+
* Dockerfile + Caddyfile scaffolded for static frameworks that need
|
|
35
|
+
* a build step (Vite, static Astro). Empty for every other project.
|
|
36
|
+
* Relative to the project root.
|
|
37
|
+
*/
|
|
38
|
+
scaffoldedFiles: string[];
|
|
24
39
|
}
|
|
25
40
|
export declare function init(ctx: Context, input?: InitInput): Promise<InitResult>;
|
|
26
41
|
//# sourceMappingURL=init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,aAAa,EAAa,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,KAAK,iBAAiB,EAAqC,MAAM,WAAW,CAAC;AAItF;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAU1D;AA6BD,eAAO,MAAM,eAAe;;;;;;;;;;iBAU1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,WAAW,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAQD,wBAAsB,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,SAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAgHnF"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,9 +1,43 @@
|
|
|
1
1
|
import { existsSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { basename, join } from "node:path";
|
|
3
3
|
import { generateName, serialize } from "@percher/toml";
|
|
4
|
-
import { z } from "zod
|
|
4
|
+
import { z } from "zod";
|
|
5
5
|
import { detectFramework, refineBunRuntime } from "../detect";
|
|
6
6
|
import { PercherCoreError } from "../errors";
|
|
7
|
+
import { renderStaticFrameworkCaddyfile, renderStaticFrameworkDockerfile } from "../static-docker";
|
|
8
|
+
/**
|
|
9
|
+
* FUTURE11 Fas 5 — detect names that almost certainly came from an
|
|
10
|
+
* auto-generated temp directory (timestamps, date stamps, very long
|
|
11
|
+
* trailing slugs). These get a prompt in interactive mode and a
|
|
12
|
+
* stderr warning otherwise — preventing a temp-dir name from
|
|
13
|
+
* silently becoming the app's permanent subdomain.
|
|
14
|
+
*
|
|
15
|
+
* Exported for unit testing.
|
|
16
|
+
*/
|
|
17
|
+
export function isSuspiciousAutoName(name) {
|
|
18
|
+
// Suffix of 8+ digits — catches `tool-20260512164520` without
|
|
19
|
+
// catching `app-v2` or `app-123`.
|
|
20
|
+
if (/-\d{8,}$/.test(name))
|
|
21
|
+
return true;
|
|
22
|
+
// Date-shaped substring — `2026-05-12`, `20260512`, `app-2026-05`.
|
|
23
|
+
if (/\d{4}-?\d{2}-?\d{2}/.test(name))
|
|
24
|
+
return true;
|
|
25
|
+
// Very long names — almost certainly an auto-generated dir slug
|
|
26
|
+
// rather than a deliberate app name.
|
|
27
|
+
if (name.length >= 30)
|
|
28
|
+
return true;
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Heuristic for interactive mode used when an explicit
|
|
33
|
+
* `interactive` value isn't passed via input. Treats Node's TTY
|
|
34
|
+
* check as the source of truth — bun:test, MCP, and CI all see
|
|
35
|
+
* `process.stdin?.isTTY === undefined`, so they fall through to
|
|
36
|
+
* non-interactive behavior naturally.
|
|
37
|
+
*/
|
|
38
|
+
function detectInteractive() {
|
|
39
|
+
return process.stdin?.isTTY === true && process.stdout?.isTTY === true;
|
|
40
|
+
}
|
|
7
41
|
function buildDataConfig(mode) {
|
|
8
42
|
if (mode === "convex") {
|
|
9
43
|
return {
|
|
@@ -23,6 +57,12 @@ export const initInputSchema = z.object({
|
|
|
23
57
|
force: z.boolean().optional(),
|
|
24
58
|
name: z.string().optional(),
|
|
25
59
|
dataMode: z.enum(["pocketbase", "postgres", "sqlite", "none"]).optional(),
|
|
60
|
+
/**
|
|
61
|
+
* Override the TTY-based interactive detection. CLI passes true,
|
|
62
|
+
* MCP / CI / agent callers pass false, tests pin it explicitly.
|
|
63
|
+
* Defaults to `process.stdin.isTTY && process.stdout.isTTY`.
|
|
64
|
+
*/
|
|
65
|
+
interactive: z.boolean().optional(),
|
|
26
66
|
});
|
|
27
67
|
function scanEnvVars(_cwd) {
|
|
28
68
|
// Minimal implementation: do not walk the full tree in init. The CLI can
|
|
@@ -40,7 +80,37 @@ export async function init(ctx, input = {}) {
|
|
|
40
80
|
}
|
|
41
81
|
const rawDetected = await detectFramework(ctx.cwd);
|
|
42
82
|
const detected = rawDetected ? refineBunRuntime(rawDetected, ctx.cwd) : null;
|
|
43
|
-
|
|
83
|
+
// FUTURE11 Fas 5 — auto-name flow:
|
|
84
|
+
// - --name takes priority (CI/agent path).
|
|
85
|
+
// - Otherwise slugify the dir name. If the slug looks
|
|
86
|
+
// auto-generated (timestamp, date stamp, ≥30 chars) and we're
|
|
87
|
+
// interactive, prompt the user with the suggestion as default.
|
|
88
|
+
// In non-interactive mode emit a stderr warning so the user
|
|
89
|
+
// notices the name retroactively when reading the log.
|
|
90
|
+
let name;
|
|
91
|
+
if (input.name) {
|
|
92
|
+
name = input.name;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const suggestion = generateName(basename(ctx.cwd));
|
|
96
|
+
const interactive = input.interactive ?? detectInteractive();
|
|
97
|
+
if (isSuspiciousAutoName(suggestion) && interactive) {
|
|
98
|
+
const answer = (await ctx.prompt(`Suggested app name: '${suggestion}'. Press Enter to accept, or type a different name: `, { default: suggestion })).trim();
|
|
99
|
+
name = answer.length > 0 ? answer : suggestion;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
if (isSuspiciousAutoName(suggestion)) {
|
|
103
|
+
const writer = ctx.stderr.getWriter();
|
|
104
|
+
try {
|
|
105
|
+
await writer.write(new TextEncoder().encode(`warning: auto-generated app name '${suggestion}' looks like a temp-dir slug — set [app].name in percher.toml or pass --name to override.\n`));
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
writer.releaseLock();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
name = suggestion;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
44
114
|
const config = {
|
|
45
115
|
app: {
|
|
46
116
|
name,
|
|
@@ -62,11 +132,42 @@ export async function init(ctx, input = {}) {
|
|
|
62
132
|
config.env = envVars;
|
|
63
133
|
}
|
|
64
134
|
writeFileSync(path, serialize(config), "utf8");
|
|
135
|
+
// Static frameworks that need a build step ship as runtime = "docker"
|
|
136
|
+
// (the static Caddy path serves pre-built files only — it rejects a
|
|
137
|
+
// [build].command). Scaffold the multi-stage Dockerfile + Caddyfile
|
|
138
|
+
// alongside percher.toml so the project is deploy-ready. Detection
|
|
139
|
+
// guarantees no Dockerfile exists here — a pre-existing one routes to
|
|
140
|
+
// runtime = "docker"/framework = "docker" earlier and never sets
|
|
141
|
+
// `staticBuild` — but guard every write so an unrelated file is never
|
|
142
|
+
// clobbered without --force.
|
|
143
|
+
const scaffoldedFiles = [];
|
|
144
|
+
if (detected?.staticBuild) {
|
|
145
|
+
const targets = [
|
|
146
|
+
{
|
|
147
|
+
name: "Dockerfile",
|
|
148
|
+
content: renderStaticFrameworkDockerfile({
|
|
149
|
+
outputDir: detected.staticBuild.outputDir,
|
|
150
|
+
}),
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: "Caddyfile",
|
|
154
|
+
content: renderStaticFrameworkCaddyfile({ spa: detected.staticBuild.spa }),
|
|
155
|
+
},
|
|
156
|
+
];
|
|
157
|
+
for (const { name, content } of targets) {
|
|
158
|
+
const target = join(ctx.cwd, name);
|
|
159
|
+
if (existsSync(target) && !input.force)
|
|
160
|
+
continue;
|
|
161
|
+
writeFileSync(target, content, "utf8");
|
|
162
|
+
scaffoldedFiles.push(name);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
65
165
|
return {
|
|
66
166
|
path,
|
|
67
167
|
config,
|
|
68
168
|
detected,
|
|
69
169
|
overwritten: exists,
|
|
170
|
+
scaffoldedFiles,
|
|
70
171
|
};
|
|
71
172
|
}
|
|
72
173
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
import { z } from "zod
|
|
1
|
+
import { z } from "zod";
|
|
2
2
|
import type { Context } from "../context";
|
|
3
3
|
export declare const insightsInputSchema: z.ZodObject<{
|
|
4
4
|
app: z.ZodOptional<z.ZodString>;
|
|
5
|
-
},
|
|
6
|
-
app?: string | undefined;
|
|
7
|
-
}, {
|
|
8
|
-
app?: string | undefined;
|
|
9
|
-
}>;
|
|
5
|
+
}, z.core.$strip>;
|
|
10
6
|
export type InsightsInput = z.infer<typeof insightsInputSchema>;
|
|
11
7
|
export interface InsightSuggestion {
|
|
12
8
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insights.d.ts","sourceRoot":"","sources":["../../src/commands/insights.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"insights.d.ts","sourceRoot":"","sources":["../../src/commands/insights.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,eAAO,MAAM,mBAAmB;;iBAE9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,mBAAmB,CAAC;IAC3E,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,aAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CAqC/F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insights.js","sourceRoot":"","sources":["../../src/commands/insights.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"insights.js","sourceRoot":"","sources":["../../src/commands/insights.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3B,CAAC,CAAC;AA0BH;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAY,EAAE,QAAuB,EAAE;IACpE,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,gBAAgB,CAAC,4CAA4C,EAAE;YACvE,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,6DAA6D;SACpE,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAkD;QAC9D,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,CAAC;KACR,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE9F,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,uBAAuB,IAAI,CAAC,OAAO,YAAY,IAAI,CAAC,IAAI,IAAI,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,KAAK,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC;YAC7D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,IAAI,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,mBAAmB,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YAC7F,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,MAAM;QAChB,OAAO;KACR,CAAC;AACJ,CAAC"}
|
package/dist/commands/login.d.ts
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
import { z } from "zod
|
|
1
|
+
import { z } from "zod";
|
|
2
2
|
import type { Context } from "../context";
|
|
3
3
|
export declare const loginInputSchema: z.ZodObject<{
|
|
4
4
|
token: z.ZodOptional<z.ZodString>;
|
|
5
5
|
apiUrl: z.ZodOptional<z.ZodString>;
|
|
6
|
-
},
|
|
7
|
-
token?: string | undefined;
|
|
8
|
-
apiUrl?: string | undefined;
|
|
9
|
-
}, {
|
|
10
|
-
token?: string | undefined;
|
|
11
|
-
apiUrl?: string | undefined;
|
|
12
|
-
}>;
|
|
6
|
+
}, z.core.$strip>;
|
|
13
7
|
export type LoginInput = z.infer<typeof loginInputSchema>;
|
|
14
8
|
export declare function login(ctx: Context, input?: LoginInput): Promise<string>;
|
|
15
9
|
//# sourceMappingURL=login.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,eAAO,MAAM,gBAAgB;;;iBAG3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AA2C1D,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BjF"}
|
package/dist/commands/login.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PercherClient, saveConfig } from "@percher/client";
|
|
2
|
-
import { z } from "zod
|
|
2
|
+
import { z } from "zod";
|
|
3
3
|
import { PercherCoreError } from "../errors";
|
|
4
4
|
export const loginInputSchema = z.object({
|
|
5
5
|
token: z.string().optional(),
|
|
@@ -16,9 +16,30 @@ async function validateAndPersist(ctx, apiUrl, token) {
|
|
|
16
16
|
const client = new PercherClient({
|
|
17
17
|
apiUrl: apiUrl ?? ctx.client.apiUrl,
|
|
18
18
|
token,
|
|
19
|
+
// FUTURE6 — carry the MCP session id forward across the
|
|
20
|
+
// re-mint. Without this, post-login MCP requests would drop the
|
|
21
|
+
// X-Percher-Session header (PercherClient reads options only in
|
|
22
|
+
// its constructor) and the server's per-session limit would no
|
|
23
|
+
// longer see the agent's loop.
|
|
24
|
+
sessionId: ctx.client.sessionId,
|
|
19
25
|
});
|
|
20
26
|
const me = await client.auth.whoami();
|
|
21
27
|
await writeStatus(ctx, `Signed in as ${me.email}`);
|
|
28
|
+
// FUTURE16 Fas 1.4: re-bind ctx.client so subsequent tool calls in
|
|
29
|
+
// the same MCP session see the new token. PercherClient reads
|
|
30
|
+
// loadConfig() only once in its constructor — without rebinding,
|
|
31
|
+
// the singleton context behöll pre-login-clienten (token: null)
|
|
32
|
+
// även efter saveConfig skrev token till disk. Pre-fix triggades
|
|
33
|
+
// det här bara när en agent försökte publish:a i samma MCP-session
|
|
34
|
+
// som login:en (en ny MCP-session återskapade singleton från disk
|
|
35
|
+
// och fungerade); recovery-kontraktet säger att open_login →
|
|
36
|
+
// percher_login → omkall publish ska fungera utan restart.
|
|
37
|
+
if (ctx.setClient) {
|
|
38
|
+
ctx.setClient(client);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
ctx.client = client;
|
|
42
|
+
}
|
|
22
43
|
return token;
|
|
23
44
|
}
|
|
24
45
|
export async function login(ctx, input = {}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|