@chucky.cloud/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 (49) hide show
  1. package/dist/commands/config.d.ts +4 -0
  2. package/dist/commands/config.d.ts.map +1 -0
  3. package/dist/commands/config.js +43 -0
  4. package/dist/commands/config.js.map +1 -0
  5. package/dist/commands/delete.d.ts +2 -0
  6. package/dist/commands/delete.d.ts.map +1 -0
  7. package/dist/commands/delete.js +66 -0
  8. package/dist/commands/delete.js.map +1 -0
  9. package/dist/commands/deploy.d.ts +4 -0
  10. package/dist/commands/deploy.d.ts.map +1 -0
  11. package/dist/commands/deploy.js +67 -0
  12. package/dist/commands/deploy.js.map +1 -0
  13. package/dist/commands/init.d.ts +4 -0
  14. package/dist/commands/init.d.ts.map +1 -0
  15. package/dist/commands/init.js +208 -0
  16. package/dist/commands/init.js.map +1 -0
  17. package/dist/commands/keys.d.ts +2 -0
  18. package/dist/commands/keys.d.ts.map +1 -0
  19. package/dist/commands/keys.js +26 -0
  20. package/dist/commands/keys.js.map +1 -0
  21. package/dist/commands/list.d.ts +2 -0
  22. package/dist/commands/list.d.ts.map +1 -0
  23. package/dist/commands/list.js +38 -0
  24. package/dist/commands/list.js.map +1 -0
  25. package/dist/commands/login.d.ts +4 -0
  26. package/dist/commands/login.d.ts.map +1 -0
  27. package/dist/commands/login.js +53 -0
  28. package/dist/commands/login.js.map +1 -0
  29. package/dist/index.d.ts +3 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +60 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/lib/api.d.ts +80 -0
  34. package/dist/lib/api.d.ts.map +1 -0
  35. package/dist/lib/api.js +95 -0
  36. package/dist/lib/api.js.map +1 -0
  37. package/dist/lib/archive.d.ts +18 -0
  38. package/dist/lib/archive.d.ts.map +1 -0
  39. package/dist/lib/archive.js +78 -0
  40. package/dist/lib/archive.js.map +1 -0
  41. package/dist/lib/config.d.ts +48 -0
  42. package/dist/lib/config.d.ts.map +1 -0
  43. package/dist/lib/config.js +107 -0
  44. package/dist/lib/config.js.map +1 -0
  45. package/dist/lib/r2.d.ts +6 -0
  46. package/dist/lib/r2.d.ts.map +1 -0
  47. package/dist/lib/r2.js +40 -0
  48. package/dist/lib/r2.js.map +1 -0
  49. package/package.json +44 -0
package/dist/index.js ADDED
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { loginCommand } from "./commands/login.js";
4
+ import { listCommand } from "./commands/list.js";
5
+ import { initCommand } from "./commands/init.js";
6
+ import { deployCommand } from "./commands/deploy.js";
7
+ import { keysCommand } from "./commands/keys.js";
8
+ import { configAnthropicCommand } from "./commands/config.js";
9
+ import { deleteCommand } from "./commands/delete.js";
10
+ const program = new Command();
11
+ program
12
+ .name("chucky")
13
+ .description("CLI for deploying workspaces to Chucky cloud")
14
+ .version("0.1.0");
15
+ // Login command
16
+ program
17
+ .command("login")
18
+ .description("Authenticate with your Chucky account")
19
+ .option("-k, --key <key>", "API key (ak_live_...)")
20
+ .action(loginCommand);
21
+ // List command
22
+ program
23
+ .command("list")
24
+ .alias("ls")
25
+ .description("List all projects")
26
+ .action(listCommand);
27
+ // Init command
28
+ program
29
+ .command("init")
30
+ .description("Initialize a new Chucky project in the current directory")
31
+ .option("-y, --yes", "Skip prompts and use defaults")
32
+ .action(initCommand);
33
+ // Deploy command
34
+ program
35
+ .command("deploy")
36
+ .description("Deploy workspace to Chucky")
37
+ .option("-f, --folder <path>", "Folder to deploy (overrides config)")
38
+ .action(deployCommand);
39
+ // Keys command
40
+ program
41
+ .command("keys")
42
+ .description("Show HMAC key for current project")
43
+ .action(keysCommand);
44
+ // Config commands
45
+ const configCmd = program
46
+ .command("config")
47
+ .description("Configure project settings");
48
+ configCmd
49
+ .command("anthropic")
50
+ .description("Set Anthropic API key for current project")
51
+ .option("-k, --key <key>", "Anthropic API key (sk-ant-...)")
52
+ .action(configAnthropicCommand);
53
+ // Delete command
54
+ program
55
+ .command("delete [projectId]")
56
+ .description("Delete a project")
57
+ .action(deleteCommand);
58
+ // Parse arguments
59
+ program.parse();
60
+ //# 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,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,8CAA8C,CAAC;KAC3D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,gBAAgB;AAChB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;KAClD,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,KAAK,CAAC,IAAI,CAAC;KACX,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,0DAA0D,CAAC;KACvE,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC;KACpD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,qBAAqB,EAAE,qCAAqC,CAAC;KACpE,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,kBAAkB;AAClB,MAAM,SAAS,GAAG,OAAO;KACtB,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4BAA4B,CAAC,CAAC;AAE7C,SAAS;KACN,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,iBAAiB,EAAE,gCAAgC,CAAC;KAC3D,MAAM,CAAC,sBAAsB,CAAC,CAAC;AAElC,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,kBAAkB,CAAC;KAC/B,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,80 @@
1
+ export interface Project {
2
+ id: string;
3
+ name: string;
4
+ description?: string;
5
+ isActive: boolean;
6
+ hmacKey: string;
7
+ createdAt: number;
8
+ }
9
+ export interface CreateProjectResult {
10
+ projectId: string;
11
+ hmacKey: string;
12
+ }
13
+ export interface UploadUrlInfo {
14
+ bucket: string;
15
+ key: string;
16
+ endpoint: string;
17
+ accessKeyId: string;
18
+ secretAccessKey: string;
19
+ expires: number;
20
+ projectUuid: string;
21
+ }
22
+ export interface ValidationResult {
23
+ valid: boolean;
24
+ customer_id?: string;
25
+ email?: string;
26
+ credit_balance_usd?: number;
27
+ error?: string;
28
+ }
29
+ /**
30
+ * API client for the Chucky portal
31
+ */
32
+ export declare class ChuckyApi {
33
+ private baseUrl;
34
+ private apiKey;
35
+ constructor(apiKey: string);
36
+ private request;
37
+ /**
38
+ * Validate API key
39
+ */
40
+ validateApiKey(): Promise<ValidationResult>;
41
+ /**
42
+ * List all projects
43
+ */
44
+ listProjects(): Promise<Project[]>;
45
+ /**
46
+ * Create a new project
47
+ */
48
+ createProject(name: string, options?: {
49
+ description?: string;
50
+ anthropicApiKey?: string;
51
+ }): Promise<CreateProjectResult>;
52
+ /**
53
+ * Delete a project
54
+ */
55
+ deleteProject(projectId: string): Promise<void>;
56
+ /**
57
+ * Get HMAC key for a project
58
+ */
59
+ getHmacKey(projectId: string): Promise<{
60
+ hmacKey: string;
61
+ createdAt: number;
62
+ }>;
63
+ /**
64
+ * Set Anthropic API key for a project
65
+ */
66
+ setAnthropicKey(projectId: string, anthropicApiKey: string): Promise<void>;
67
+ /**
68
+ * Get upload URL for workspace
69
+ */
70
+ getUploadUrl(projectId: string): Promise<UploadUrlInfo>;
71
+ /**
72
+ * Mark workspace as uploaded
73
+ */
74
+ markWorkspaceUploaded(projectId: string): Promise<{
75
+ success: boolean;
76
+ hasWorkspace: boolean;
77
+ projectUuid: string;
78
+ }>;
79
+ }
80
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;YAKZ,OAAO;IA0BrB;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAUjD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAKxC;;OAEG;IACG,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3D,OAAO,CAAC,mBAAmB,CAAC;IAQ/B;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAQpF;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhF;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAM7D;;OAEG;IACG,qBAAqB,CACzB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAO7E"}
@@ -0,0 +1,95 @@
1
+ import { getPortalUrl } from "./config.js";
2
+ /**
3
+ * API client for the Chucky portal
4
+ */
5
+ export class ChuckyApi {
6
+ baseUrl;
7
+ apiKey;
8
+ constructor(apiKey) {
9
+ this.baseUrl = getPortalUrl();
10
+ this.apiKey = apiKey;
11
+ }
12
+ async request(method, path, body) {
13
+ const url = `${this.baseUrl}${path}`;
14
+ const headers = {
15
+ "Content-Type": "application/json",
16
+ Authorization: `Bearer ${this.apiKey}`,
17
+ };
18
+ const response = await fetch(url, {
19
+ method,
20
+ headers,
21
+ body: body ? JSON.stringify(body) : undefined,
22
+ });
23
+ const data = await response.json();
24
+ if (!response.ok) {
25
+ throw new Error(data.error || `Request failed: ${response.status}`);
26
+ }
27
+ return data;
28
+ }
29
+ /**
30
+ * Validate API key
31
+ */
32
+ async validateApiKey() {
33
+ const response = await fetch(`${this.baseUrl}/api/validate-api-key`, {
34
+ method: "POST",
35
+ headers: { "Content-Type": "application/json" },
36
+ body: JSON.stringify({ api_key: this.apiKey }),
37
+ });
38
+ return (await response.json());
39
+ }
40
+ /**
41
+ * List all projects
42
+ */
43
+ async listProjects() {
44
+ const result = await this.request("GET", "/api/projects");
45
+ return result.projects;
46
+ }
47
+ /**
48
+ * Create a new project
49
+ */
50
+ async createProject(name, options) {
51
+ return this.request("POST", "/api/projects", {
52
+ name,
53
+ description: options?.description,
54
+ anthropicApiKey: options?.anthropicApiKey,
55
+ });
56
+ }
57
+ /**
58
+ * Delete a project
59
+ */
60
+ async deleteProject(projectId) {
61
+ await this.request("POST", "/api/projects/delete", {
62
+ projectId,
63
+ });
64
+ }
65
+ /**
66
+ * Get HMAC key for a project
67
+ */
68
+ async getHmacKey(projectId) {
69
+ return this.request("POST", "/api/projects/hmac-key", { projectId });
70
+ }
71
+ /**
72
+ * Set Anthropic API key for a project
73
+ */
74
+ async setAnthropicKey(projectId, anthropicApiKey) {
75
+ await this.request("POST", "/api/projects/anthropic-key", {
76
+ projectId,
77
+ anthropicApiKey,
78
+ });
79
+ }
80
+ /**
81
+ * Get upload URL for workspace
82
+ */
83
+ async getUploadUrl(projectId) {
84
+ return this.request("POST", "/api/projects/upload-url", {
85
+ projectId,
86
+ });
87
+ }
88
+ /**
89
+ * Mark workspace as uploaded
90
+ */
91
+ async markWorkspaceUploaded(projectId) {
92
+ return this.request("POST", "/api/projects/workspace-uploaded", { projectId });
93
+ }
94
+ }
95
+ //# 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,18 @@
1
+ export interface ArchiveResult {
2
+ path: string;
3
+ size: number;
4
+ fileCount: number;
5
+ }
6
+ /**
7
+ * Create a tar.gz archive of a directory
8
+ */
9
+ export declare function createArchive(sourceDir: string, ignorePatterns?: string[]): Promise<ArchiveResult>;
10
+ /**
11
+ * Format bytes to human-readable string
12
+ */
13
+ export declare function formatBytes(bytes: number): string;
14
+ /**
15
+ * Get readable stream for archive
16
+ */
17
+ export declare function getArchiveStream(archivePath: string): import("fs").ReadStream;
18
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/lib/archive.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,cAAc,GAAE,MAAM,EAA4B,GACjD,OAAO,CAAC,aAAa,CAAC,CAyCxB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,2BAEnD"}
@@ -0,0 +1,78 @@
1
+ import { createWriteStream, createReadStream, statSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import archiver from "archiver";
5
+ // Default patterns to ignore when creating archive
6
+ const DEFAULT_IGNORE_PATTERNS = [
7
+ "node_modules/**",
8
+ ".git/**",
9
+ ".env",
10
+ ".env.*",
11
+ "*.log",
12
+ ".DS_Store",
13
+ "Thumbs.db",
14
+ ".chucky.json",
15
+ "dist/**",
16
+ "build/**",
17
+ ".next/**",
18
+ ".nuxt/**",
19
+ "coverage/**",
20
+ ".cache/**",
21
+ "*.tgz",
22
+ "*.tar.gz",
23
+ ];
24
+ /**
25
+ * Create a tar.gz archive of a directory
26
+ */
27
+ export async function createArchive(sourceDir, ignorePatterns = DEFAULT_IGNORE_PATTERNS) {
28
+ const archiveName = `workspace-${Date.now()}.tgz`;
29
+ const archivePath = join(tmpdir(), archiveName);
30
+ return new Promise((resolve, reject) => {
31
+ const output = createWriteStream(archivePath);
32
+ const archive = archiver("tar", {
33
+ gzip: true,
34
+ gzipOptions: { level: 9 },
35
+ });
36
+ let fileCount = 0;
37
+ output.on("close", () => {
38
+ const stats = statSync(archivePath);
39
+ resolve({
40
+ path: archivePath,
41
+ size: stats.size,
42
+ fileCount,
43
+ });
44
+ });
45
+ archive.on("entry", () => {
46
+ fileCount++;
47
+ });
48
+ archive.on("error", (err) => {
49
+ reject(err);
50
+ });
51
+ archive.pipe(output);
52
+ // Add directory contents, respecting ignore patterns
53
+ archive.glob("**/*", {
54
+ cwd: sourceDir,
55
+ ignore: ignorePatterns,
56
+ dot: true, // Include dotfiles
57
+ });
58
+ archive.finalize();
59
+ });
60
+ }
61
+ /**
62
+ * Format bytes to human-readable string
63
+ */
64
+ export function formatBytes(bytes) {
65
+ if (bytes === 0)
66
+ return "0 Bytes";
67
+ const k = 1024;
68
+ const sizes = ["Bytes", "KB", "MB", "GB"];
69
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
70
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
71
+ }
72
+ /**
73
+ * Get readable stream for archive
74
+ */
75
+ export function getArchiveStream(archivePath) {
76
+ return createReadStream(archivePath);
77
+ }
78
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/lib/archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export interface GlobalConfig {
2
+ apiKey: string;
3
+ email?: string;
4
+ portalUrl: string;
5
+ }
6
+ export interface ProjectConfig {
7
+ projectId: string;
8
+ projectName: string;
9
+ folder: string;
10
+ hmacKey?: string;
11
+ }
12
+ /**
13
+ * Load global config
14
+ */
15
+ export declare function loadGlobalConfig(): GlobalConfig | null;
16
+ /**
17
+ * Save global config
18
+ */
19
+ export declare function saveGlobalConfig(config: GlobalConfig): void;
20
+ /**
21
+ * Load project config from current directory
22
+ */
23
+ export declare function loadProjectConfig(cwd?: string): ProjectConfig | null;
24
+ /**
25
+ * Save project config to current directory
26
+ */
27
+ export declare function saveProjectConfig(config: ProjectConfig, cwd?: string): void;
28
+ /**
29
+ * Check if user is logged in
30
+ */
31
+ export declare function isLoggedIn(): boolean;
32
+ /**
33
+ * Get API key or throw if not logged in
34
+ */
35
+ export declare function requireApiKey(): string;
36
+ /**
37
+ * Get portal URL
38
+ */
39
+ export declare function getPortalUrl(): string;
40
+ /**
41
+ * Get project config or throw if not initialized
42
+ */
43
+ export declare function requireProjectConfig(): ProjectConfig;
44
+ /**
45
+ * Check if project is initialized in current directory
46
+ */
47
+ export declare function isProjectInitialized(): boolean;
48
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAkBD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,GAAG,IAAI,CAUtD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAG3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,aAAa,GAAG,IAAI,CAWnF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,GAAE,MAAsB,GAAG,IAAI,CAG1F;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAGpC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAYtC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,aAAa,CAMpD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C"}
@@ -0,0 +1,107 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ const CONFIG_DIR = join(homedir(), ".chucky");
5
+ const GLOBAL_CONFIG_PATH = join(CONFIG_DIR, "config.json");
6
+ const PROJECT_CONFIG_FILE = ".chucky.json";
7
+ // Default portal URL
8
+ const DEFAULT_PORTAL_URL = "https://mellow-quokka-802.convex.site";
9
+ /**
10
+ * Ensure config directory exists
11
+ */
12
+ function ensureConfigDir() {
13
+ if (!existsSync(CONFIG_DIR)) {
14
+ mkdirSync(CONFIG_DIR, { recursive: true });
15
+ }
16
+ }
17
+ /**
18
+ * Load global config
19
+ */
20
+ export function loadGlobalConfig() {
21
+ try {
22
+ if (!existsSync(GLOBAL_CONFIG_PATH)) {
23
+ return null;
24
+ }
25
+ const content = readFileSync(GLOBAL_CONFIG_PATH, "utf-8");
26
+ return JSON.parse(content);
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ /**
33
+ * Save global config
34
+ */
35
+ export function saveGlobalConfig(config) {
36
+ ensureConfigDir();
37
+ writeFileSync(GLOBAL_CONFIG_PATH, JSON.stringify(config, null, 2));
38
+ }
39
+ /**
40
+ * Load project config from current directory
41
+ */
42
+ export function loadProjectConfig(cwd = process.cwd()) {
43
+ try {
44
+ const configPath = join(cwd, PROJECT_CONFIG_FILE);
45
+ if (!existsSync(configPath)) {
46
+ return null;
47
+ }
48
+ const content = readFileSync(configPath, "utf-8");
49
+ return JSON.parse(content);
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ }
55
+ /**
56
+ * Save project config to current directory
57
+ */
58
+ export function saveProjectConfig(config, cwd = process.cwd()) {
59
+ const configPath = join(cwd, PROJECT_CONFIG_FILE);
60
+ writeFileSync(configPath, JSON.stringify(config, null, 2));
61
+ }
62
+ /**
63
+ * Check if user is logged in
64
+ */
65
+ export function isLoggedIn() {
66
+ const config = loadGlobalConfig();
67
+ return config !== null && !!config.apiKey;
68
+ }
69
+ /**
70
+ * Get API key or throw if not logged in
71
+ */
72
+ export function requireApiKey() {
73
+ // Check environment variable first
74
+ const envKey = process.env.CHUCKY_API_KEY;
75
+ if (envKey) {
76
+ return envKey;
77
+ }
78
+ const config = loadGlobalConfig();
79
+ if (!config?.apiKey) {
80
+ throw new Error("Not logged in. Run 'chucky login' first or set CHUCKY_API_KEY environment variable.");
81
+ }
82
+ return config.apiKey;
83
+ }
84
+ /**
85
+ * Get portal URL
86
+ */
87
+ export function getPortalUrl() {
88
+ const config = loadGlobalConfig();
89
+ return config?.portalUrl || DEFAULT_PORTAL_URL;
90
+ }
91
+ /**
92
+ * Get project config or throw if not initialized
93
+ */
94
+ export function requireProjectConfig() {
95
+ const config = loadProjectConfig();
96
+ if (!config) {
97
+ throw new Error("Project not initialized. Run 'chucky init' first.");
98
+ }
99
+ return config;
100
+ }
101
+ /**
102
+ * Check if project is initialized in current directory
103
+ */
104
+ export function isProjectInitialized() {
105
+ return loadProjectConfig() !== null;
106
+ }
107
+ //# 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,6 @@
1
+ import type { UploadUrlInfo } from "./api.js";
2
+ /**
3
+ * Upload a file to R2 using the provided credentials
4
+ */
5
+ export declare function uploadToR2(uploadInfo: UploadUrlInfo, filePath: string, onProgress?: (uploaded: number, total: number) => void): Promise<void>;
6
+ //# sourceMappingURL=r2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"r2.d.ts","sourceRoot":"","sources":["../../src/lib/r2.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C;;GAEG;AACH,wBAAsB,UAAU,CAC9B,UAAU,EAAE,aAAa,EACzB,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACrD,OAAO,CAAC,IAAI,CAAC,CAuCf"}
package/dist/lib/r2.js ADDED
@@ -0,0 +1,40 @@
1
+ import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
2
+ import { createReadStream, statSync } from "node:fs";
3
+ /**
4
+ * Upload a file to R2 using the provided credentials
5
+ */
6
+ export async function uploadToR2(uploadInfo, filePath, onProgress) {
7
+ const { endpoint, accessKeyId, secretAccessKey, bucket, key } = uploadInfo;
8
+ // Create S3 client configured for R2
9
+ const client = new S3Client({
10
+ endpoint,
11
+ region: "auto",
12
+ credentials: {
13
+ accessKeyId,
14
+ secretAccessKey,
15
+ },
16
+ });
17
+ // Get file stats
18
+ const stats = statSync(filePath);
19
+ const fileSize = stats.size;
20
+ // Read file
21
+ const fileStream = createReadStream(filePath);
22
+ // Track progress
23
+ let uploaded = 0;
24
+ fileStream.on("data", (chunk) => {
25
+ uploaded += typeof chunk === "string" ? Buffer.byteLength(chunk) : chunk.length;
26
+ if (onProgress) {
27
+ onProgress(uploaded, fileSize);
28
+ }
29
+ });
30
+ // Upload
31
+ const command = new PutObjectCommand({
32
+ Bucket: bucket,
33
+ Key: key,
34
+ Body: fileStream,
35
+ ContentType: "application/gzip",
36
+ ContentLength: fileSize,
37
+ });
38
+ await client.send(command);
39
+ }
40
+ //# sourceMappingURL=r2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"r2.js","sourceRoot":"","sources":["../../src/lib/r2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGrD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,UAAyB,EACzB,QAAgB,EAChB,UAAsD;IAEtD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC;IAE3E,qCAAqC;IACrC,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC;QAC1B,QAAQ;QACR,MAAM,EAAE,MAAM;QACd,WAAW,EAAE;YACX,WAAW;YACX,eAAe;SAChB;KACF,CAAC,CAAC;IAEH,iBAAiB;IACjB,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;IAE5B,YAAY;IACZ,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE9C,iBAAiB;IACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;QAC/C,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QAChF,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS;IACT,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC;QACnC,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,GAAG;QACR,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,kBAAkB;QAC/B,aAAa,EAAE,QAAQ;KACxB,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@chucky.cloud/cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI for deploying workspaces to Chucky cloud",
5
+ "type": "module",
6
+ "bin": {
7
+ "chucky": "./dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "tsc --watch",
12
+ "start": "node dist/index.js",
13
+ "typecheck": "tsc --noEmit"
14
+ },
15
+ "keywords": [
16
+ "chucky",
17
+ "claude",
18
+ "agent",
19
+ "deploy",
20
+ "cli"
21
+ ],
22
+ "author": "",
23
+ "license": "MIT",
24
+ "dependencies": {
25
+ "@aws-sdk/client-s3": "^3.700.0",
26
+ "@aws-sdk/s3-request-presigner": "^3.700.0",
27
+ "archiver": "^7.0.1",
28
+ "chalk": "^5.3.0",
29
+ "commander": "^12.1.0",
30
+ "inquirer": "^12.0.0",
31
+ "ora": "^8.1.0"
32
+ },
33
+ "devDependencies": {
34
+ "@types/archiver": "^6.0.3",
35
+ "@types/node": "^22.10.0",
36
+ "typescript": "^5.7.0"
37
+ },
38
+ "engines": {
39
+ "node": ">=18"
40
+ },
41
+ "files": [
42
+ "dist"
43
+ ]
44
+ }