@podosoft/podokit 0.16.4 → 0.17.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/deploy-compose-exec.d.ts +93 -0
- package/dist/deploy-compose-exec.js +198 -0
- package/dist/deploy-compose-profile.d.ts +107 -0
- package/dist/deploy-compose-profile.js +361 -0
- package/dist/deploy-compose-render.d.ts +48 -0
- package/dist/deploy-compose-render.js +333 -0
- package/dist/deploy-compose-sync.d.ts +144 -0
- package/dist/deploy-compose-sync.js +412 -0
- package/dist/deploy-compose.d.ts +98 -0
- package/dist/deploy-compose.js +667 -0
- package/dist/deploy-dispatch.d.ts +33 -0
- package/dist/deploy-dispatch.js +58 -0
- package/dist/deploy-driver.d.ts +25 -0
- package/dist/deploy-driver.js +78 -0
- package/dist/deploy-profile.d.ts +3 -10
- package/dist/deploy-profile.js +82 -291
- package/dist/deploy-schema.d.ts +56 -0
- package/dist/deploy-schema.js +261 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +178 -6
- package/dist/lib.d.ts +9 -0
- package/dist/lib.js +30 -1
- package/dist/templates/fullstack-nest-svelte/AGENTS.md +2 -1
- package/dist/templates/fullstack-nest-svelte/Dockerfile.dev +34 -3
- package/dist/templates/fullstack-nest-svelte/apps/api/Dockerfile +68 -7
- package/dist/templates/fullstack-nest-svelte/apps/web/Dockerfile +60 -8
- package/dist/templates/fullstack-nest-svelte/apps/web/server.js +31 -0
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/server/backend-proxy.test.ts +21 -0
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/server/backend-proxy.ts +15 -1
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/server/ws-upgrade.js +267 -0
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/server/ws-upgrade.test.js +134 -0
- package/dist/templates/fullstack-nest-svelte/apps/web/vite.config.ts +17 -7
- package/dist/templates/fullstack-nest-svelte/dot-agents/skills/podokit-deploy/SKILL.md +55 -10
- package/dist/templates/fullstack-nest-svelte/dot-agents/skills/podokit-deploy/references/profile.md +50 -1
- package/dist/templates/fullstack-nest-svelte/dot-agents/skills/podokit-deploy/references/release.md +64 -0
- package/dist/templates/fullstack-nest-svelte/dot-agents/skills/podokit-deploy-fast/SKILL.md +92 -0
- package/dist/templates/fullstack-nest-svelte/dot-claude/skills/podokit-deploy/SKILL.md +1 -1
- package/dist/templates/fullstack-nest-svelte/dot-claude/skills/podokit-deploy-fast/SKILL.md +8 -0
- package/dist/templates/fullstack-nest-svelte/dot-dockerignore +7 -0
- package/dist/templates/fullstack-nest-svelte/dot-env.example +7 -0
- package/dist/templates/fullstack-nest-svelte/dot-github/workflows/release.yml +142 -0
- package/dist/templates/fullstack-nest-svelte/infra/k3s/README.md +18 -0
- package/dist/templates/fullstack-nest-svelte/infra/k3s/api-deployment.yaml +6 -1
- package/dist/templates/fullstack-nest-svelte/infra/k3s/ingress.yaml +8 -0
- package/dist/templates/fullstack-nest-svelte/infra/k3s/web-deployment.yaml +11 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/account-page.svelte +15 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/device-label.test.ts +62 -0
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/device-label.ts +50 -0
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/i18n/catalogs/admin-dashboard/en.json +5 -0
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/i18n/catalogs/admin-dashboard/ko.json +5 -0
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/sessions/+page.svelte +3 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/users/+page.svelte +3 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(auth)/reset-password/+page.svelte +12 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(auth)/signup/+page.svelte +13 -1
- package/dist/templates/modules/admin-dashboard/files/tests/helpers/accounts.ts +27 -2
- package/dist/templates/modules/admin-dashboard/files/tests/ui/account.ui.spec.ts +20 -1
- package/dist/templates/modules/admin-dashboard/files/tests/ui/auth.ui.spec.ts +26 -1
- package/dist/templates/modules/admin-dashboard/files/tests/ui/email.ui.spec.ts +10 -1
- package/dist/templates/modules/admin-dashboard/files/tests/ui/two-factor.ui.spec.ts +3 -3
- package/dist/templates/modules/bullmq/files/infra/k3s/worker-deployment.yaml +2 -1
- package/dist/templates/todo/AGENTS.md +2 -1
- package/dist/templates/todo/Dockerfile.dev +34 -3
- package/dist/templates/todo/apps/api/Dockerfile +68 -7
- package/dist/templates/todo/apps/web/Dockerfile +60 -8
- package/dist/templates/todo/apps/web/server.js +31 -0
- package/dist/templates/todo/apps/web/src/lib/server/backend-proxy.test.ts +21 -0
- package/dist/templates/todo/apps/web/src/lib/server/backend-proxy.ts +15 -1
- package/dist/templates/todo/apps/web/src/lib/server/ws-upgrade.js +267 -0
- package/dist/templates/todo/apps/web/src/lib/server/ws-upgrade.test.js +134 -0
- package/dist/templates/todo/apps/web/vite.config.ts +17 -7
- package/dist/templates/todo/dot-agents/skills/podokit-deploy/SKILL.md +55 -10
- package/dist/templates/todo/dot-agents/skills/podokit-deploy/references/profile.md +47 -0
- package/dist/templates/todo/dot-agents/skills/podokit-deploy/references/release.md +64 -0
- package/dist/templates/todo/dot-agents/skills/podokit-deploy-fast/SKILL.md +92 -0
- package/dist/templates/todo/dot-claude/skills/podokit-deploy/SKILL.md +1 -1
- package/dist/templates/todo/dot-claude/skills/podokit-deploy-fast/SKILL.md +8 -0
- package/dist/templates/todo/dot-dockerignore +7 -0
- package/dist/templates/todo/dot-env.example +7 -0
- package/dist/templates/todo/dot-github/workflows/release.yml +142 -0
- package/dist/templates/todo/infra/k3s/README.md +18 -0
- package/dist/templates/todo/infra/k3s/api-deployment.yaml +6 -1
- package/dist/templates/todo/infra/k3s/ingress.yaml +8 -0
- package/dist/templates/todo/infra/k3s/web-deployment.yaml +11 -1
- package/package.json +1 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { CommandRunner } from "./dev";
|
|
2
|
+
import { type DeploymentDoctorFinding, type DeploymentPlan, type DeploymentStatus, type VerificationResult } from "./deploy";
|
|
3
|
+
import { type ComposeDoctorFinding, type ComposePlan, type ComposeStatus, type ComposeVerificationResult } from "./deploy-compose";
|
|
4
|
+
import { type DeployDriver } from "./deploy-driver";
|
|
5
|
+
/**
|
|
6
|
+
* Driver-agnostic entry points.
|
|
7
|
+
*
|
|
8
|
+
* A caller that already knows which driver it wants can reach for that driver's
|
|
9
|
+
* functions directly. Everything that works from a profile name — the CLI's shared
|
|
10
|
+
* paths, the MCP server — comes through here instead, so adding a driver does not
|
|
11
|
+
* mean adding a parallel tool for every read-only operation.
|
|
12
|
+
*/
|
|
13
|
+
export declare function doctorAnyDeployment(projectRoot: string, profileName: string, runner?: CommandRunner): {
|
|
14
|
+
driver: DeployDriver;
|
|
15
|
+
findings: (DeploymentDoctorFinding | ComposeDoctorFinding)[];
|
|
16
|
+
};
|
|
17
|
+
export declare function planAnyDeployment(projectRoot: string, profileName: string, release: string, runner?: CommandRunner): {
|
|
18
|
+
driver: DeployDriver;
|
|
19
|
+
plan: DeploymentPlan | ComposePlan;
|
|
20
|
+
};
|
|
21
|
+
export declare function getAnyDeploymentStatus(projectRoot: string, profileName: string, runner?: CommandRunner): {
|
|
22
|
+
driver: DeployDriver;
|
|
23
|
+
status: DeploymentStatus | ComposeStatus;
|
|
24
|
+
};
|
|
25
|
+
export declare function verifyAnyDeployment(projectRoot: string, profileName: string, fetcher?: typeof fetch): Promise<{
|
|
26
|
+
driver: DeployDriver;
|
|
27
|
+
verification: VerificationResult | ComposeVerificationResult;
|
|
28
|
+
}>;
|
|
29
|
+
/** A one-line, secret-free description of where a profile points. */
|
|
30
|
+
export declare function describeDeploymentTarget(profile: {
|
|
31
|
+
driver: DeployDriver;
|
|
32
|
+
target: Record<string, unknown>;
|
|
33
|
+
}): string;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.doctorAnyDeployment = doctorAnyDeployment;
|
|
4
|
+
exports.planAnyDeployment = planAnyDeployment;
|
|
5
|
+
exports.getAnyDeploymentStatus = getAnyDeploymentStatus;
|
|
6
|
+
exports.verifyAnyDeployment = verifyAnyDeployment;
|
|
7
|
+
exports.describeDeploymentTarget = describeDeploymentTarget;
|
|
8
|
+
const deploy_1 = require("./deploy");
|
|
9
|
+
const deploy_compose_1 = require("./deploy-compose");
|
|
10
|
+
const deploy_driver_1 = require("./deploy-driver");
|
|
11
|
+
/**
|
|
12
|
+
* Driver-agnostic entry points.
|
|
13
|
+
*
|
|
14
|
+
* A caller that already knows which driver it wants can reach for that driver's
|
|
15
|
+
* functions directly. Everything that works from a profile name — the CLI's shared
|
|
16
|
+
* paths, the MCP server — comes through here instead, so adding a driver does not
|
|
17
|
+
* mean adding a parallel tool for every read-only operation.
|
|
18
|
+
*/
|
|
19
|
+
function doctorAnyDeployment(projectRoot, profileName, runner) {
|
|
20
|
+
const driver = (0, deploy_driver_1.readDeploymentDriver)(projectRoot, profileName);
|
|
21
|
+
const findings = driver === "docker-compose"
|
|
22
|
+
? (0, deploy_compose_1.doctorComposeDeployment)(projectRoot, profileName, runner)
|
|
23
|
+
: (0, deploy_1.doctorDeployment)(projectRoot, profileName, runner);
|
|
24
|
+
return { driver, findings };
|
|
25
|
+
}
|
|
26
|
+
function planAnyDeployment(projectRoot, profileName, release, runner) {
|
|
27
|
+
const driver = (0, deploy_driver_1.readDeploymentDriver)(projectRoot, profileName);
|
|
28
|
+
return {
|
|
29
|
+
driver,
|
|
30
|
+
plan: driver === "docker-compose"
|
|
31
|
+
? (0, deploy_compose_1.planComposeDeployment)(projectRoot, profileName, release, runner)
|
|
32
|
+
: (0, deploy_1.planDeployment)(projectRoot, profileName, release, runner),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function getAnyDeploymentStatus(projectRoot, profileName, runner) {
|
|
36
|
+
const driver = (0, deploy_driver_1.readDeploymentDriver)(projectRoot, profileName);
|
|
37
|
+
return {
|
|
38
|
+
driver,
|
|
39
|
+
status: driver === "docker-compose"
|
|
40
|
+
? (0, deploy_compose_1.getComposeStatus)(projectRoot, profileName, runner)
|
|
41
|
+
: (0, deploy_1.getDeploymentStatus)(projectRoot, profileName, runner),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async function verifyAnyDeployment(projectRoot, profileName, fetcher) {
|
|
45
|
+
const driver = (0, deploy_driver_1.readDeploymentDriver)(projectRoot, profileName);
|
|
46
|
+
return {
|
|
47
|
+
driver,
|
|
48
|
+
verification: driver === "docker-compose"
|
|
49
|
+
? await (0, deploy_compose_1.verifyComposeDeployment)(projectRoot, profileName, fetcher)
|
|
50
|
+
: await (0, deploy_1.verifyDeployment)(projectRoot, profileName, fetcher),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** A one-line, secret-free description of where a profile points. */
|
|
54
|
+
function describeDeploymentTarget(profile) {
|
|
55
|
+
return profile.driver === "docker-compose"
|
|
56
|
+
? `driver=docker-compose, context=${String(profile.target.context)}, project=${String(profile.target.project)}`
|
|
57
|
+
: `driver=kubernetes-helm, context=${String(profile.target.context)}, namespace=${String(profile.target.namespace)}, release=${String(profile.target.release)}`;
|
|
58
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { DeployProfileV1 } from "./deploy-profile";
|
|
2
|
+
import { DockerComposeProfileV1 } from "./deploy-compose-profile";
|
|
3
|
+
/**
|
|
4
|
+
* Driver dispatch.
|
|
5
|
+
*
|
|
6
|
+
* A profile names its own driver, so reading one is a two-step: look at `driver`,
|
|
7
|
+
* then hand the document to that driver's parser. Everything downstream narrows on
|
|
8
|
+
* the same discriminant.
|
|
9
|
+
*/
|
|
10
|
+
export type AnyDeployProfile = DeployProfileV1 | DockerComposeProfileV1;
|
|
11
|
+
export type DeployDriver = AnyDeployProfile["driver"];
|
|
12
|
+
export declare const DEPLOY_DRIVERS: DeployDriver[];
|
|
13
|
+
export interface AnyDeploymentProfileSummary {
|
|
14
|
+
name: string;
|
|
15
|
+
path: string;
|
|
16
|
+
profile: AnyDeployProfile;
|
|
17
|
+
}
|
|
18
|
+
/** The declared driver, read without validating the rest of the document. */
|
|
19
|
+
export declare function readDeploymentDriver(projectRoot: string, name: string): DeployDriver;
|
|
20
|
+
export declare function loadAnyDeploymentProfile(projectRoot: string, name: string): AnyDeployProfile;
|
|
21
|
+
export declare function loadComposeProfile(projectRoot: string, name: string): DockerComposeProfileV1;
|
|
22
|
+
export declare function loadKubernetesProfile(projectRoot: string, name: string): DeployProfileV1;
|
|
23
|
+
export declare function listAnyDeploymentProfiles(projectRoot: string): AnyDeploymentProfileSummary[];
|
|
24
|
+
/** The release tag gate, which both drivers enforce identically. */
|
|
25
|
+
export declare function assertAnyReleaseTag(profile: AnyDeployProfile, release: string): void;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEPLOY_DRIVERS = void 0;
|
|
4
|
+
exports.readDeploymentDriver = readDeploymentDriver;
|
|
5
|
+
exports.loadAnyDeploymentProfile = loadAnyDeploymentProfile;
|
|
6
|
+
exports.loadComposeProfile = loadComposeProfile;
|
|
7
|
+
exports.loadKubernetesProfile = loadKubernetesProfile;
|
|
8
|
+
exports.listAnyDeploymentProfiles = listAnyDeploymentProfiles;
|
|
9
|
+
exports.assertAnyReleaseTag = assertAnyReleaseTag;
|
|
10
|
+
const node_fs_1 = require("node:fs");
|
|
11
|
+
const node_path_1 = require("node:path");
|
|
12
|
+
const deploy_profile_1 = require("./deploy-profile");
|
|
13
|
+
const deploy_compose_profile_1 = require("./deploy-compose-profile");
|
|
14
|
+
const deploy_schema_1 = require("./deploy-schema");
|
|
15
|
+
exports.DEPLOY_DRIVERS = ["kubernetes-helm", "docker-compose"];
|
|
16
|
+
function readProfileDocument(projectRoot, name) {
|
|
17
|
+
const path = (0, deploy_schema_1.profilePath)(projectRoot, name);
|
|
18
|
+
if (!(0, node_fs_1.existsSync)(path))
|
|
19
|
+
throw new Error(`Deployment profile "${name}" does not exist at ${path}.`);
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse((0, node_fs_1.readFileSync)(path, "utf8"));
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
throw new Error(`Cannot read deployment profile "${name}": ${error.message}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** The declared driver, read without validating the rest of the document. */
|
|
28
|
+
function readDeploymentDriver(projectRoot, name) {
|
|
29
|
+
const document = readProfileDocument(projectRoot, name);
|
|
30
|
+
if (!(0, deploy_schema_1.isRecord)(document))
|
|
31
|
+
throw new Error("Deployment profile must be a JSON object.");
|
|
32
|
+
const driver = document.driver;
|
|
33
|
+
if (driver !== "kubernetes-helm" && driver !== "docker-compose") {
|
|
34
|
+
throw new Error(`Unsupported deployment driver: ${String(driver)}. Supported drivers: ${exports.DEPLOY_DRIVERS.join(", ")}.`);
|
|
35
|
+
}
|
|
36
|
+
return driver;
|
|
37
|
+
}
|
|
38
|
+
function loadAnyDeploymentProfile(projectRoot, name) {
|
|
39
|
+
return readDeploymentDriver(projectRoot, name) === "docker-compose"
|
|
40
|
+
? (0, deploy_compose_profile_1.parseComposeProfile)(readProfileDocument(projectRoot, name))
|
|
41
|
+
: (0, deploy_profile_1.loadDeploymentProfile)(projectRoot, name);
|
|
42
|
+
}
|
|
43
|
+
function loadComposeProfile(projectRoot, name) {
|
|
44
|
+
const profile = loadAnyDeploymentProfile(projectRoot, name);
|
|
45
|
+
if (profile.driver !== "docker-compose") {
|
|
46
|
+
throw new Error(`Deployment profile "${name}" uses the ${profile.driver} driver; this command needs docker-compose.`);
|
|
47
|
+
}
|
|
48
|
+
return profile;
|
|
49
|
+
}
|
|
50
|
+
function loadKubernetesProfile(projectRoot, name) {
|
|
51
|
+
const profile = loadAnyDeploymentProfile(projectRoot, name);
|
|
52
|
+
if (profile.driver !== "kubernetes-helm") {
|
|
53
|
+
throw new Error(`Deployment profile "${name}" uses the ${profile.driver} driver; this command needs kubernetes-helm.`);
|
|
54
|
+
}
|
|
55
|
+
return profile;
|
|
56
|
+
}
|
|
57
|
+
function listAnyDeploymentProfiles(projectRoot) {
|
|
58
|
+
const directory = (0, deploy_schema_1.profileDirectory)(projectRoot);
|
|
59
|
+
if (!(0, node_fs_1.existsSync)(directory))
|
|
60
|
+
return [];
|
|
61
|
+
return (0, node_fs_1.readdirSync)(directory)
|
|
62
|
+
.filter((entry) => entry.endsWith(".json"))
|
|
63
|
+
.sort()
|
|
64
|
+
.map((entry) => {
|
|
65
|
+
const name = entry.slice(0, -5);
|
|
66
|
+
return {
|
|
67
|
+
name,
|
|
68
|
+
path: (0, node_path_1.join)(directory, entry),
|
|
69
|
+
profile: loadAnyDeploymentProfile(projectRoot, name),
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/** The release tag gate, which both drivers enforce identically. */
|
|
74
|
+
function assertAnyReleaseTag(profile, release) {
|
|
75
|
+
if (release === "latest" || !new RegExp(profile.release.tagPattern).test(release)) {
|
|
76
|
+
throw new Error(`Release "${release}" does not match deployment tag pattern ${profile.release.tagPattern}.`);
|
|
77
|
+
}
|
|
78
|
+
}
|
package/dist/deploy-profile.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { MigrationProfile, VerificationCheckProfile } from "./deploy-schema";
|
|
2
|
+
export { profileDirectory, profilePath } from "./deploy-schema";
|
|
3
|
+
export type { MigrationProfile, VerificationCheckProfile } from "./deploy-schema";
|
|
1
4
|
export type DependencyMode = "inCluster" | "external" | "disabled";
|
|
2
5
|
export interface ResourceProfile {
|
|
3
6
|
cpuRequest: string;
|
|
@@ -25,14 +28,6 @@ export interface NamedSecretProfile {
|
|
|
25
28
|
name: string;
|
|
26
29
|
requiredKeys: string[];
|
|
27
30
|
}
|
|
28
|
-
export interface VerificationCheckProfile {
|
|
29
|
-
path: string;
|
|
30
|
-
expectedStatus: number;
|
|
31
|
-
expectedJson?: Record<string, string | number | boolean | null>;
|
|
32
|
-
}
|
|
33
|
-
export interface MigrationProfile {
|
|
34
|
-
command: string[];
|
|
35
|
-
}
|
|
36
31
|
export interface DeployProfileV1 {
|
|
37
32
|
schemaVersion: 1;
|
|
38
33
|
driver: "kubernetes-helm";
|
|
@@ -82,8 +77,6 @@ export interface DeploymentProfileSummary {
|
|
|
82
77
|
path: string;
|
|
83
78
|
profile: DeployProfileV1;
|
|
84
79
|
}
|
|
85
|
-
export declare function profileDirectory(projectRoot: string): string;
|
|
86
|
-
export declare function profilePath(projectRoot: string, name: string): string;
|
|
87
80
|
export declare function loadDeploymentProfile(projectRoot: string, name: string): DeployProfileV1;
|
|
88
81
|
export declare function listDeploymentProfiles(projectRoot: string): DeploymentProfileSummary[];
|
|
89
82
|
export interface InitializeDeploymentProfileOptions {
|