@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.
- package/dist/commands/config.d.ts +4 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +43 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/delete.d.ts +2 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +66 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/deploy.d.ts +4 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +67 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +208 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/keys.d.ts +2 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +26 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +38 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +4 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +53 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +80 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +95 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/archive.d.ts +18 -0
- package/dist/lib/archive.d.ts.map +1 -0
- package/dist/lib/archive.js +78 -0
- package/dist/lib/archive.js.map +1 -0
- package/dist/lib/config.d.ts +48 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +107 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/r2.d.ts +6 -0
- package/dist/lib/r2.d.ts.map +1 -0
- package/dist/lib/r2.js +40 -0
- package/dist/lib/r2.js.map +1 -0
- 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"}
|
package/dist/lib/api.js
ADDED
|
@@ -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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"}
|
package/dist/lib/r2.d.ts
ADDED
|
@@ -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
|
+
}
|