@kingslanding/cli 0.1.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.
Files changed (78) hide show
  1. package/README.md +157 -0
  2. package/dist/commands/deploy-key.d.ts +3 -0
  3. package/dist/commands/deploy-key.d.ts.map +1 -0
  4. package/dist/commands/deploy-key.js +113 -0
  5. package/dist/commands/deploy-key.js.map +1 -0
  6. package/dist/commands/deploy.d.ts +3 -0
  7. package/dist/commands/deploy.d.ts.map +1 -0
  8. package/dist/commands/deploy.js +139 -0
  9. package/dist/commands/deploy.js.map +1 -0
  10. package/dist/commands/init.d.ts +3 -0
  11. package/dist/commands/init.d.ts.map +1 -0
  12. package/dist/commands/init.js +63 -0
  13. package/dist/commands/init.js.map +1 -0
  14. package/dist/commands/login.d.ts +3 -0
  15. package/dist/commands/login.d.ts.map +1 -0
  16. package/dist/commands/login.js +65 -0
  17. package/dist/commands/login.js.map +1 -0
  18. package/dist/commands/logout.d.ts +3 -0
  19. package/dist/commands/logout.d.ts.map +1 -0
  20. package/dist/commands/logout.js +22 -0
  21. package/dist/commands/logout.js.map +1 -0
  22. package/dist/commands/projects.d.ts +3 -0
  23. package/dist/commands/projects.d.ts.map +1 -0
  24. package/dist/commands/projects.js +39 -0
  25. package/dist/commands/projects.js.map +1 -0
  26. package/dist/commands/whoami.d.ts +3 -0
  27. package/dist/commands/whoami.d.ts.map +1 -0
  28. package/dist/commands/whoami.js +24 -0
  29. package/dist/commands/whoami.js.map +1 -0
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +35 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/lib/api.d.ts +104 -0
  35. package/dist/lib/api.d.ts.map +1 -0
  36. package/dist/lib/api.js +118 -0
  37. package/dist/lib/api.js.map +1 -0
  38. package/dist/lib/auth.d.ts +15 -0
  39. package/dist/lib/auth.d.ts.map +1 -0
  40. package/dist/lib/auth.js +81 -0
  41. package/dist/lib/auth.js.map +1 -0
  42. package/dist/lib/config.d.ts +13 -0
  43. package/dist/lib/config.d.ts.map +1 -0
  44. package/dist/lib/config.js +66 -0
  45. package/dist/lib/config.js.map +1 -0
  46. package/dist/lib/errors.d.ts +16 -0
  47. package/dist/lib/errors.d.ts.map +1 -0
  48. package/dist/lib/errors.js +34 -0
  49. package/dist/lib/errors.js.map +1 -0
  50. package/dist/lib/files.d.ts +11 -0
  51. package/dist/lib/files.d.ts.map +1 -0
  52. package/dist/lib/files.js +60 -0
  53. package/dist/lib/files.js.map +1 -0
  54. package/dist/lib/ignore.d.ts +3 -0
  55. package/dist/lib/ignore.d.ts.map +1 -0
  56. package/dist/lib/ignore.js +20 -0
  57. package/dist/lib/ignore.js.map +1 -0
  58. package/dist/lib/output.d.ts +5 -0
  59. package/dist/lib/output.d.ts.map +1 -0
  60. package/dist/lib/output.js +15 -0
  61. package/dist/lib/output.js.map +1 -0
  62. package/dist/services/auth-service.d.ts +15 -0
  63. package/dist/services/auth-service.d.ts.map +1 -0
  64. package/dist/services/auth-service.js +65 -0
  65. package/dist/services/auth-service.js.map +1 -0
  66. package/dist/services/deploy-key-service.d.ts +9 -0
  67. package/dist/services/deploy-key-service.d.ts.map +1 -0
  68. package/dist/services/deploy-key-service.js +16 -0
  69. package/dist/services/deploy-key-service.js.map +1 -0
  70. package/dist/services/deploy-service.d.ts +19 -0
  71. package/dist/services/deploy-service.d.ts.map +1 -0
  72. package/dist/services/deploy-service.js +68 -0
  73. package/dist/services/deploy-service.js.map +1 -0
  74. package/dist/services/project-service.d.ts +10 -0
  75. package/dist/services/project-service.d.ts.map +1 -0
  76. package/dist/services/project-service.js +29 -0
  77. package/dist/services/project-service.js.map +1 -0
  78. package/package.json +49 -0
@@ -0,0 +1,39 @@
1
+ import { ApiClient } from "../lib/api.js";
2
+ import { resolveApiUrl, siteUrl } from "../lib/config.js";
3
+ import { getAuthHeader } from "../lib/auth.js";
4
+ import { formatTable, formatBytes } from "../lib/output.js";
5
+ import { AuthError } from "../lib/errors.js";
6
+ import { ProjectService } from "../services/project-service.js";
7
+ export function registerProjectsCommand(program) {
8
+ program
9
+ .command("projects")
10
+ .description("List your projects")
11
+ .option("-t, --team <slug>", "List projects for a team")
12
+ .action(async (options) => {
13
+ const apiUrl = resolveApiUrl();
14
+ const authHeader = getAuthHeader(apiUrl);
15
+ if (!authHeader) {
16
+ throw new AuthError("Not logged in. Run `kl login` first.");
17
+ }
18
+ const api = new ApiClient(apiUrl, authHeader);
19
+ const projectService = new ProjectService(api);
20
+ let teamId;
21
+ if (options.team) {
22
+ teamId = await projectService.resolveTeamId(options.team);
23
+ }
24
+ const projects = teamId
25
+ ? await projectService.listTeamProjects(teamId)
26
+ : await projectService.listProjects();
27
+ const rows = projects.map((p) => [
28
+ p.name,
29
+ siteUrl(p.name, apiUrl),
30
+ String(p.file_count),
31
+ formatBytes(p.total_size_bytes),
32
+ p.last_updated
33
+ ? new Date(p.last_updated * 1000).toLocaleDateString()
34
+ : "—",
35
+ ]);
36
+ console.log(formatTable(["NAME", "URL", "FILES", "SIZE", "LAST DEPLOYED"], rows, "No projects found."));
37
+ });
38
+ }
39
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,oBAAoB,CAAC;SACjC,MAAM,CAAC,mBAAmB,EAAE,0BAA0B,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,OAA0B,EAAE,EAAE;QAC3C,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC9C,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;QAE/C,IAAI,MAA0B,CAAC;QAC/B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM;YACrB,CAAC,CAAC,MAAM,cAAc,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAC/C,CAAC,CAAC,MAAM,cAAc,CAAC,YAAY,EAAE,CAAC;QAExC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC/B,CAAC,CAAC,IAAI;YACN,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;YACvB,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;YACpB,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC;YAC/B,CAAC,CAAC,YAAY;gBACZ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,kBAAkB,EAAE;gBACtD,CAAC,CAAC,GAAG;SACR,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CACT,WAAW,CACT,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,EACjD,IAAI,EACJ,oBAAoB,CACrB,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerWhoamiCommand(program: Command): void;
3
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoB5D"}
@@ -0,0 +1,24 @@
1
+ import { ApiClient } from "../lib/api.js";
2
+ import { resolveApiUrl } from "../lib/config.js";
3
+ import { getAuthHeader, isDeployKeyAuth } from "../lib/auth.js";
4
+ import { AuthError } from "../lib/errors.js";
5
+ export function registerWhoamiCommand(program) {
6
+ program
7
+ .command("whoami")
8
+ .description("Show the current authenticated user")
9
+ .action(async () => {
10
+ const apiUrl = resolveApiUrl();
11
+ const authHeader = getAuthHeader(apiUrl);
12
+ if (!authHeader) {
13
+ throw new AuthError("Not logged in. Run `kl login` first.");
14
+ }
15
+ if (isDeployKeyAuth()) {
16
+ console.log("Authenticated via deploy key");
17
+ return;
18
+ }
19
+ const api = new ApiClient(apiUrl, authHeader);
20
+ const account = await api.getAccount();
21
+ console.log(account.email + " (" + account.plan_tier + ")");
22
+ });
23
+ }
24
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,eAAe,EAAE,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env -S node --no-warnings
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env -S node --no-warnings
2
+ import { Command } from "commander";
3
+ import { registerLoginCommand } from "./commands/login.js";
4
+ import { registerLogoutCommand } from "./commands/logout.js";
5
+ import { registerInitCommand } from "./commands/init.js";
6
+ import { registerDeployCommand } from "./commands/deploy.js";
7
+ import { registerProjectsCommand } from "./commands/projects.js";
8
+ import { registerWhoamiCommand } from "./commands/whoami.js";
9
+ import { registerDeployKeyCommand } from "./commands/deploy-key.js";
10
+ import { CLIError } from "./lib/errors.js";
11
+ import { checkCredentialPermissions } from "./lib/auth.js";
12
+ const warning = checkCredentialPermissions();
13
+ if (warning)
14
+ console.warn(warning);
15
+ const program = new Command();
16
+ program
17
+ .name("kl")
18
+ .description("Deploy static sites to King's Landing")
19
+ .version("0.1.0");
20
+ registerLoginCommand(program);
21
+ registerLogoutCommand(program);
22
+ registerInitCommand(program);
23
+ registerDeployCommand(program);
24
+ registerProjectsCommand(program);
25
+ registerWhoamiCommand(program);
26
+ registerDeployKeyCommand(program);
27
+ program.parseAsync(process.argv).catch((err) => {
28
+ if (err instanceof CLIError) {
29
+ console.error(err.message);
30
+ process.exit(err.exitCode);
31
+ }
32
+ console.error(err instanceof Error ? err.message : "An unexpected error occurred.");
33
+ process.exit(1);
34
+ });
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAE3D,MAAM,OAAO,GAAG,0BAA0B,EAAE,CAAC;AAC7C,IAAI,OAAO;IAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAEnC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,uCAAuC,CAAC;KACpD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAElC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC;IACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,104 @@
1
+ export interface FileManifestEntry {
2
+ path: string;
3
+ size: number;
4
+ content_type: string;
5
+ }
6
+ export interface DeployInitiateRequest {
7
+ files: FileManifestEntry[];
8
+ team_id?: string;
9
+ }
10
+ export interface DeployInitiateResponse {
11
+ deployment_id: string;
12
+ expires_at: number;
13
+ uploads: {
14
+ path: string;
15
+ presigned_url: string;
16
+ }[];
17
+ project_created: boolean;
18
+ }
19
+ export interface DeployFinalizeResponse {
20
+ url: string;
21
+ deployment_id: string;
22
+ files: number;
23
+ total_size: number;
24
+ }
25
+ export interface AccountInfo {
26
+ email: string;
27
+ handle: string | null;
28
+ plan_tier: string;
29
+ created_at: number;
30
+ status: string;
31
+ }
32
+ export interface TeamInfo {
33
+ team: {
34
+ team_id: string;
35
+ name: string;
36
+ slug: string;
37
+ };
38
+ role: string;
39
+ }
40
+ export interface ProjectInfo {
41
+ name: string;
42
+ file_count: number;
43
+ total_size_bytes: number;
44
+ cloudfront_url: string;
45
+ last_updated: number;
46
+ }
47
+ export interface DeployKeyResponse {
48
+ key: string;
49
+ key_prefix: string;
50
+ message: string;
51
+ }
52
+ export interface DeployKeyStatusResponse {
53
+ exists: boolean;
54
+ key_prefix: string | null;
55
+ created_at: number | null;
56
+ }
57
+ export interface DeviceCodeResponse {
58
+ device_code: string;
59
+ user_code: string;
60
+ verification_url: string;
61
+ expires_in: number;
62
+ }
63
+ export interface DeviceTokenResponse {
64
+ status: string;
65
+ tokens: {
66
+ access_token: string;
67
+ refresh_token: string;
68
+ id_token: string;
69
+ } | null;
70
+ }
71
+ export interface RefreshResponse {
72
+ access_token: string;
73
+ id_token: string;
74
+ expires_in: number;
75
+ }
76
+ export declare class ApiClient {
77
+ private readonly baseUrl;
78
+ private authHeader;
79
+ constructor(baseUrl: string, authHeader: string | null);
80
+ updateAuthHeader(header: string): void;
81
+ createDeviceCode(): Promise<DeviceCodeResponse>;
82
+ pollDeviceToken(deviceCode: string): Promise<DeviceTokenResponse>;
83
+ refreshToken(refreshToken: string): Promise<RefreshResponse>;
84
+ logout(refreshToken: string): Promise<void>;
85
+ getAccount(): Promise<AccountInfo>;
86
+ listTeams(): Promise<TeamInfo[]>;
87
+ listProjects(limit?: number): Promise<{
88
+ items: ProjectInfo[];
89
+ next_token: string | null;
90
+ }>;
91
+ listTeamProjects(teamId: string): Promise<{
92
+ items: ProjectInfo[];
93
+ }>;
94
+ initiateDeploy(projectName: string, body: DeployInitiateRequest, options?: {
95
+ create?: boolean;
96
+ }): Promise<DeployInitiateResponse>;
97
+ finalizeDeploy(projectName: string, deploymentId: string, teamId?: string): Promise<DeployFinalizeResponse>;
98
+ createDeployKey(projectName: string, teamId?: string): Promise<DeployKeyResponse>;
99
+ getDeployKeyStatus(projectName: string, teamId?: string): Promise<DeployKeyStatusResponse>;
100
+ revokeDeployKey(projectName: string, teamId?: string): Promise<void>;
101
+ uploadFile(presignedUrl: string, body: Buffer, contentType: string): Promise<void>;
102
+ private request;
103
+ }
104
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ import { ApiError, NetworkError } from "./errors.js";
2
+ export class ApiClient {
3
+ baseUrl;
4
+ authHeader;
5
+ constructor(baseUrl, authHeader) {
6
+ this.baseUrl = baseUrl;
7
+ this.authHeader = authHeader;
8
+ }
9
+ updateAuthHeader(header) {
10
+ this.authHeader = header;
11
+ }
12
+ async createDeviceCode() {
13
+ return this.request("POST", "/auth/device/code", undefined, false);
14
+ }
15
+ async pollDeviceToken(deviceCode) {
16
+ return this.request("POST", "/auth/device/token", { device_code: deviceCode }, false);
17
+ }
18
+ async refreshToken(refreshToken) {
19
+ return this.request("POST", "/auth/refresh", { refresh_token: refreshToken }, false);
20
+ }
21
+ async logout(refreshToken) {
22
+ await this.request("POST", "/auth/logout", {
23
+ refresh_token: refreshToken,
24
+ });
25
+ }
26
+ async getAccount() {
27
+ return this.request("GET", "/account");
28
+ }
29
+ async listTeams() {
30
+ return this.request("GET", "/teams");
31
+ }
32
+ async listProjects(limit = 100) {
33
+ return this.request("GET", "/projects?limit=" + limit);
34
+ }
35
+ async listTeamProjects(teamId) {
36
+ return this.request("GET", "/teams/" + teamId + "/projects");
37
+ }
38
+ async initiateDeploy(projectName, body, options) {
39
+ const qs = options?.create ? "?create=true" : "";
40
+ return this.request("POST", "/projects/" + projectName + "/deploy" + qs, body);
41
+ }
42
+ async finalizeDeploy(projectName, deploymentId, teamId) {
43
+ const qs = teamId ? "?team_id=" + teamId : "";
44
+ return this.request("POST", "/projects/" +
45
+ projectName +
46
+ "/deploy/" +
47
+ deploymentId +
48
+ "/finalize" +
49
+ qs);
50
+ }
51
+ async createDeployKey(projectName, teamId) {
52
+ const qs = teamId ? "?team_id=" + teamId : "";
53
+ return this.request("POST", "/projects/" + projectName + "/deploy-key" + qs);
54
+ }
55
+ async getDeployKeyStatus(projectName, teamId) {
56
+ const qs = teamId ? "?team_id=" + teamId : "";
57
+ return this.request("GET", "/projects/" + projectName + "/deploy-key" + qs);
58
+ }
59
+ async revokeDeployKey(projectName, teamId) {
60
+ const qs = teamId ? "?team_id=" + teamId : "";
61
+ await this.request("DELETE", "/projects/" + projectName + "/deploy-key" + qs);
62
+ }
63
+ async uploadFile(presignedUrl, body, contentType) {
64
+ // LocalStack presigned URLs use Docker-internal hostname; rewrite for host access
65
+ const url = presignedUrl.replace("http://localstack:", "http://localhost:");
66
+ let response;
67
+ try {
68
+ response = await fetch(url, {
69
+ method: "PUT",
70
+ body,
71
+ headers: { "Content-Type": contentType },
72
+ });
73
+ }
74
+ catch {
75
+ throw new NetworkError(presignedUrl);
76
+ }
77
+ if (!response.ok) {
78
+ throw new ApiError(response.status, "S3 upload failed: " + response.statusText);
79
+ }
80
+ }
81
+ async request(method, path, body, auth = true) {
82
+ const url = this.baseUrl + "/api/v1" + path;
83
+ const headers = {};
84
+ if (auth && this.authHeader) {
85
+ headers["Authorization"] = this.authHeader;
86
+ }
87
+ if (body !== undefined) {
88
+ headers["Content-Type"] = "application/json";
89
+ }
90
+ let response;
91
+ try {
92
+ response = await fetch(url, {
93
+ method,
94
+ headers,
95
+ body: body !== undefined ? JSON.stringify(body) : undefined,
96
+ });
97
+ }
98
+ catch {
99
+ throw new NetworkError(this.baseUrl);
100
+ }
101
+ if (response.status === 204)
102
+ return undefined;
103
+ if (!response.ok) {
104
+ let detail = "HTTP " + response.status;
105
+ try {
106
+ const json = (await response.json());
107
+ if (typeof json.detail === "string")
108
+ detail = json.detail;
109
+ }
110
+ catch {
111
+ // Non-JSON error body
112
+ }
113
+ throw new ApiError(response.status, detail);
114
+ }
115
+ return response.json();
116
+ }
117
+ }
118
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface Credentials {
2
+ access_token: string;
3
+ refresh_token: string;
4
+ id_token: string;
5
+ expires_at: number;
6
+ }
7
+ export declare function loadCredentials(apiUrl: string, credPath?: string): Credentials | null;
8
+ export declare function saveCredentials(apiUrl: string, creds: Credentials, credPath?: string): void;
9
+ export declare function clearCredentials(apiUrl: string, credPath?: string): void;
10
+ export declare function checkCredentialPermissions(credPath?: string): string | null;
11
+ export declare function parseJwtExpiry(token: string): number;
12
+ export declare function getAuthHeader(apiUrl: string, credPath?: string): string | null;
13
+ export declare function isDeployKeyAuth(): boolean;
14
+ export declare function isTokenExpiringSoon(creds: Credentials, bufferSeconds?: number): boolean;
15
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AA4BD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAGrF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAK3F;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAKxE;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS3E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO9E;AAED,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,aAAa,SAAM,GAAG,OAAO,CAEpF"}
@@ -0,0 +1,81 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { KL_DIR, isLocalMode } from "./config.js";
4
+ function defaultCredPath() {
5
+ return path.join(KL_DIR, "credentials.json");
6
+ }
7
+ function readStore(credPath) {
8
+ if (!fs.existsSync(credPath))
9
+ return {};
10
+ try {
11
+ return JSON.parse(fs.readFileSync(credPath, "utf-8"));
12
+ }
13
+ catch {
14
+ return {};
15
+ }
16
+ }
17
+ function writeStore(store, credPath) {
18
+ const dir = path.dirname(credPath);
19
+ if (!fs.existsSync(dir)) {
20
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
21
+ }
22
+ fs.writeFileSync(credPath, JSON.stringify(store, null, 2) + "\n", {
23
+ encoding: "utf-8",
24
+ mode: 0o600,
25
+ });
26
+ }
27
+ export function loadCredentials(apiUrl, credPath) {
28
+ const store = readStore(credPath ?? defaultCredPath());
29
+ return store[apiUrl] ?? null;
30
+ }
31
+ export function saveCredentials(apiUrl, creds, credPath) {
32
+ const p = credPath ?? defaultCredPath();
33
+ const store = readStore(p);
34
+ store[apiUrl] = creds;
35
+ writeStore(store, p);
36
+ }
37
+ export function clearCredentials(apiUrl, credPath) {
38
+ const p = credPath ?? defaultCredPath();
39
+ const store = readStore(p);
40
+ delete store[apiUrl];
41
+ writeStore(store, p);
42
+ }
43
+ export function checkCredentialPermissions(credPath) {
44
+ const p = credPath ?? defaultCredPath();
45
+ if (!fs.existsSync(p))
46
+ return null;
47
+ const stats = fs.statSync(p);
48
+ const perms = stats.mode & 0o777;
49
+ if (perms & 0o177) {
50
+ return "Warning: " + p + " has open permissions. Run: chmod 600 " + p;
51
+ }
52
+ return null;
53
+ }
54
+ export function parseJwtExpiry(token) {
55
+ try {
56
+ const payload = token.split(".")[1];
57
+ const decoded = JSON.parse(Buffer.from(payload, "base64url").toString());
58
+ return decoded.exp ?? 0;
59
+ }
60
+ catch {
61
+ return 0;
62
+ }
63
+ }
64
+ export function getAuthHeader(apiUrl, credPath) {
65
+ const deployKey = process.env.KL_DEPLOY_KEY;
66
+ if (deployKey)
67
+ return "Bearer " + deployKey;
68
+ if (isLocalMode(apiUrl))
69
+ return "Bearer local-bypass";
70
+ const creds = loadCredentials(apiUrl, credPath);
71
+ if (creds)
72
+ return "Bearer " + creds.access_token;
73
+ return null;
74
+ }
75
+ export function isDeployKeyAuth() {
76
+ return !!process.env.KL_DEPLOY_KEY;
77
+ }
78
+ export function isTokenExpiringSoon(creds, bufferSeconds = 300) {
79
+ return creds.expires_at - bufferSeconds <= Math.floor(Date.now() / 1000);
80
+ }
81
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare const KL_DIR: string;
2
+ export interface ProjectConfig {
3
+ project: string;
4
+ directory: string;
5
+ team: string | null;
6
+ api_url?: string;
7
+ }
8
+ export declare function resolveApiUrl(cwd?: string): string;
9
+ export declare function loadProjectConfig(cwd: string): ProjectConfig | null;
10
+ export declare function writeProjectConfig(cwd: string, config: Omit<ProjectConfig, "api_url">): void;
11
+ export declare function isLocalMode(apiUrl: string): boolean;
12
+ export declare function siteUrl(projectName: string, apiUrl: string): string;
13
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,MAAM,QAAiC,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBlD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAiBnE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,GAAG,IAAI,CAG5F;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQnE"}
@@ -0,0 +1,66 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import * as os from "node:os";
4
+ const DEFAULT_API_URL = "https://api.kingslanding.io";
5
+ const LOCAL_API_URL = "https://api.kl.test";
6
+ export const KL_DIR = path.join(os.homedir(), ".kl");
7
+ export function resolveApiUrl(cwd) {
8
+ const resolvedCwd = cwd ?? process.cwd();
9
+ const envUrl = process.env.KL_API_URL;
10
+ if (envUrl)
11
+ return envUrl;
12
+ const config = loadProjectConfig(resolvedCwd);
13
+ if (config?.api_url)
14
+ return config.api_url;
15
+ const globalConfigPath = path.join(KL_DIR, "config.json");
16
+ if (fs.existsSync(globalConfigPath)) {
17
+ try {
18
+ const raw = fs.readFileSync(globalConfigPath, "utf-8");
19
+ const globalConfig = JSON.parse(raw);
20
+ if (globalConfig.api_url)
21
+ return globalConfig.api_url;
22
+ }
23
+ catch {
24
+ // Ignore malformed global config
25
+ }
26
+ }
27
+ return DEFAULT_API_URL;
28
+ }
29
+ export function loadProjectConfig(cwd) {
30
+ const configPath = path.join(cwd, "kl.json");
31
+ if (!fs.existsSync(configPath))
32
+ return null;
33
+ try {
34
+ const raw = fs.readFileSync(configPath, "utf-8");
35
+ const parsed = JSON.parse(raw);
36
+ if (!parsed.project)
37
+ return null;
38
+ return {
39
+ project: parsed.project,
40
+ directory: parsed.directory ?? ".",
41
+ team: parsed.team ?? null,
42
+ api_url: parsed.api_url,
43
+ };
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ export function writeProjectConfig(cwd, config) {
50
+ const configPath = path.join(cwd, "kl.json");
51
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n", "utf-8");
52
+ }
53
+ export function isLocalMode(apiUrl) {
54
+ return apiUrl === LOCAL_API_URL;
55
+ }
56
+ export function siteUrl(projectName, apiUrl) {
57
+ try {
58
+ const host = new URL(apiUrl).hostname; // e.g. "api.kingslanding.io"
59
+ const domain = host.replace(/^api\./, ""); // e.g. "kingslanding.io"
60
+ return "https://" + projectName + "." + domain;
61
+ }
62
+ catch {
63
+ return "https://" + projectName + ".kingslanding.io";
64
+ }
65
+ }
66
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare class CLIError extends Error {
2
+ readonly exitCode: number;
3
+ constructor(message: string, exitCode?: number);
4
+ }
5
+ export declare class ApiError extends CLIError {
6
+ readonly status: number;
7
+ readonly detail: string;
8
+ constructor(status: number, detail: string);
9
+ }
10
+ export declare class NetworkError extends CLIError {
11
+ constructor(apiUrl: string);
12
+ }
13
+ export declare class AuthError extends CLIError {
14
+ constructor(message?: string);
15
+ }
16
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;aAGf,QAAQ,EAAE,MAAM;gBADhC,OAAO,EAAE,MAAM,EACC,QAAQ,GAAE,MAAU;CAKvC;AAED,qBAAa,QAAS,SAAQ,QAAQ;aAElB,MAAM,EAAE,MAAM;aACd,MAAM,EAAE,MAAM;gBADd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM;CASjC;AAED,qBAAa,YAAa,SAAQ,QAAQ;gBAC5B,MAAM,EAAE,MAAM;CAI3B;AAED,qBAAa,SAAU,SAAQ,QAAQ;gBACzB,OAAO,CAAC,EAAE,MAAM;CAI7B"}
@@ -0,0 +1,34 @@
1
+ export class CLIError extends Error {
2
+ exitCode;
3
+ constructor(message, exitCode = 1) {
4
+ super(message);
5
+ this.exitCode = exitCode;
6
+ this.name = "CLIError";
7
+ }
8
+ }
9
+ export class ApiError extends CLIError {
10
+ status;
11
+ detail;
12
+ constructor(status, detail) {
13
+ const message = status === 429
14
+ ? "Rate limited. Wait a moment and try again."
15
+ : `API error ${status}: ${detail}`;
16
+ super(message, 1);
17
+ this.status = status;
18
+ this.detail = detail;
19
+ this.name = "ApiError";
20
+ }
21
+ }
22
+ export class NetworkError extends CLIError {
23
+ constructor(apiUrl) {
24
+ super(`Could not reach the API at ${apiUrl}. Check your connection.`, 1);
25
+ this.name = "NetworkError";
26
+ }
27
+ }
28
+ export class AuthError extends CLIError {
29
+ constructor(message) {
30
+ super(message ?? "Session expired. Run `kl login` to re-authenticate.", 1);
31
+ this.name = "AuthError";
32
+ }
33
+ }
34
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGf;IAFlB,YACE,OAAe,EACC,WAAmB,CAAC;QAEpC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,aAAQ,GAAR,QAAQ,CAAY;QAGpC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,QAAQ;IAElB;IACA;IAFlB,YACkB,MAAc,EACd,MAAc;QAE9B,MAAM,OAAO,GACX,MAAM,KAAK,GAAG;YACZ,CAAC,CAAC,4CAA4C;YAC9C,CAAC,CAAC,aAAa,MAAM,KAAK,MAAM,EAAE,CAAC;QACvC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAPF,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAQ;QAO9B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,QAAQ;IACxC,YAAY,MAAc;QACxB,KAAK,CAAC,8BAA8B,MAAM,0BAA0B,EAAE,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,QAAQ;IACrC,YAAY,OAAgB;QAC1B,KAAK,CAAC,OAAO,IAAI,qDAAqD,EAAE,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ export declare const MAX_FILE_SIZE: number;
2
+ export declare const MAX_FILE_COUNT = 1000;
3
+ export interface FileEntry {
4
+ path: string;
5
+ size: number;
6
+ content_type: string;
7
+ absolutePath: string;
8
+ }
9
+ export declare function buildFileManifest(dir: string, projectRoot?: string, ignorePatterns?: string[]): FileEntry[];
10
+ export declare function formatBytes(bytes: number): string;
11
+ //# sourceMappingURL=files.d.ts.map