@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
@@ -0,0 +1,4 @@
1
+ export declare function configAnthropicCommand(options: {
2
+ key?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAMA,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CrF"}
@@ -0,0 +1,43 @@
1
+ import { password } from "@inquirer/prompts";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { requireApiKey, requireProjectConfig } from "../lib/config.js";
5
+ import { ChuckyApi } from "../lib/api.js";
6
+ export async function configAnthropicCommand(options) {
7
+ console.log(chalk.bold("\nSet Anthropic API Key\n"));
8
+ try {
9
+ const apiKey = requireApiKey();
10
+ const projectConfig = requireProjectConfig();
11
+ const api = new ChuckyApi(apiKey);
12
+ // Get Anthropic API key from option or prompt
13
+ let anthropicKey = options.key;
14
+ if (!anthropicKey) {
15
+ anthropicKey = await password({
16
+ message: "Anthropic API key (sk-ant-...):",
17
+ mask: "*",
18
+ validate: (value) => {
19
+ if (!value)
20
+ return "API key is required";
21
+ if (!value.startsWith("sk-ant-")) {
22
+ return "Anthropic API key should start with 'sk-ant-'";
23
+ }
24
+ return true;
25
+ },
26
+ });
27
+ }
28
+ // Validate format
29
+ if (!anthropicKey.startsWith("sk-ant-")) {
30
+ console.log(chalk.red("\nError: Anthropic API key should start with 'sk-ant-'"));
31
+ process.exit(1);
32
+ }
33
+ const spinner = ora("Updating Anthropic API key...").start();
34
+ await api.setAnthropicKey(projectConfig.projectId, anthropicKey);
35
+ spinner.succeed("Anthropic API key updated");
36
+ console.log(chalk.dim(`\nProject: ${projectConfig.projectName}`));
37
+ }
38
+ catch (error) {
39
+ console.log(chalk.red(`\nError: ${error.message}`));
40
+ process.exit(1);
41
+ }
42
+ }
43
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAyB;IACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAG,oBAAoB,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QAElC,8CAA8C;QAC9C,IAAI,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;QAE/B,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,YAAY,GAAG,MAAM,QAAQ,CAAC;gBAC5B,OAAO,EAAE,iCAAiC;gBAC1C,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oBAClB,IAAI,CAAC,KAAK;wBAAE,OAAO,qBAAqB,CAAC;oBACzC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;wBACjC,OAAO,+CAA+C,CAAC;oBACzD,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,wDAAwD,CAAC,CACpE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,CAAC;QAE7D,MAAM,GAAG,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAEjE,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAa,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function deleteCommand(projectIdArg?: string): Promise<void>;
2
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6ExE"}
@@ -0,0 +1,66 @@
1
+ import { confirm, select } from "@inquirer/prompts";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { requireApiKey, loadProjectConfig } from "../lib/config.js";
5
+ import { ChuckyApi } from "../lib/api.js";
6
+ export async function deleteCommand(projectIdArg) {
7
+ console.log(chalk.bold("\nDelete Project\n"));
8
+ try {
9
+ const apiKey = requireApiKey();
10
+ const api = new ChuckyApi(apiKey);
11
+ let projectId = projectIdArg;
12
+ let projectName;
13
+ // If no project ID provided, try current project or ask
14
+ if (!projectId) {
15
+ const projectConfig = loadProjectConfig();
16
+ if (projectConfig) {
17
+ // Use current project
18
+ const useCurrent = await confirm({
19
+ message: `Delete current project '${projectConfig.projectName}'?`,
20
+ default: false,
21
+ });
22
+ if (useCurrent) {
23
+ projectId = projectConfig.projectId;
24
+ projectName = projectConfig.projectName;
25
+ }
26
+ }
27
+ // If still no project ID, let user select from list
28
+ if (!projectId) {
29
+ const spinner = ora("Fetching projects...").start();
30
+ const projects = await api.listProjects();
31
+ spinner.stop();
32
+ if (projects.length === 0) {
33
+ console.log(chalk.yellow("\nNo projects found."));
34
+ return;
35
+ }
36
+ const selected = await select({
37
+ message: "Select project to delete:",
38
+ choices: projects.map((p) => ({
39
+ name: `${p.name} (${p.id})`,
40
+ value: p,
41
+ })),
42
+ });
43
+ projectId = selected.id;
44
+ projectName = selected.name;
45
+ }
46
+ }
47
+ // Final confirmation
48
+ const confirmDelete = await confirm({
49
+ message: chalk.red(`Are you sure you want to delete '${projectName || projectId}'? This cannot be undone.`),
50
+ default: false,
51
+ });
52
+ if (!confirmDelete) {
53
+ console.log(chalk.dim("Aborted."));
54
+ return;
55
+ }
56
+ const spinner = ora("Deleting project...").start();
57
+ await api.deleteProject(projectId);
58
+ spinner.succeed(`Project '${projectName || projectId}' deleted`);
59
+ console.log(chalk.dim("\nNote: If this was your current project, run 'chucky init' to initialize a new one."));
60
+ }
61
+ catch (error) {
62
+ console.log(chalk.red(`\nError: ${error.message}`));
63
+ process.exit(1);
64
+ }
65
+ }
66
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function deployCommand(options: {
2
+ folder?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AASA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuE/E"}
@@ -0,0 +1,67 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import { resolve } from "node:path";
4
+ import { existsSync, unlinkSync } from "node:fs";
5
+ import { requireApiKey, requireProjectConfig } from "../lib/config.js";
6
+ import { ChuckyApi } from "../lib/api.js";
7
+ import { createArchive, formatBytes } from "../lib/archive.js";
8
+ import { uploadToR2 } from "../lib/r2.js";
9
+ export async function deployCommand(options) {
10
+ console.log(chalk.bold("\nDeploying to Chucky\n"));
11
+ let archivePath = null;
12
+ try {
13
+ const apiKey = requireApiKey();
14
+ const projectConfig = requireProjectConfig();
15
+ const api = new ChuckyApi(apiKey);
16
+ // Determine folder to deploy
17
+ const folder = options.folder || projectConfig.folder || ".";
18
+ const fullPath = resolve(folder);
19
+ if (!existsSync(fullPath)) {
20
+ console.log(chalk.red(`\nError: Directory does not exist: ${fullPath}`));
21
+ process.exit(1);
22
+ }
23
+ console.log(chalk.dim(`Project: ${projectConfig.projectName}`));
24
+ console.log(chalk.dim(`Folder: ${fullPath}\n`));
25
+ // Step 1: Create archive
26
+ const archiveSpinner = ora("Creating archive...").start();
27
+ const archive = await createArchive(fullPath);
28
+ archivePath = archive.path;
29
+ archiveSpinner.succeed(`Archive created (${formatBytes(archive.size)}, ${archive.fileCount} files)`);
30
+ // Step 2: Get upload URL
31
+ const urlSpinner = ora("Getting upload URL...").start();
32
+ const uploadInfo = await api.getUploadUrl(projectConfig.projectId);
33
+ urlSpinner.succeed("Got upload URL");
34
+ // Step 3: Upload to R2
35
+ const uploadSpinner = ora("Uploading...").start();
36
+ await uploadToR2(uploadInfo, archivePath, (uploaded, total) => {
37
+ const percent = Math.round((uploaded / total) * 100);
38
+ uploadSpinner.text = `Uploading... ${percent}% (${formatBytes(uploaded)}/${formatBytes(total)})`;
39
+ });
40
+ uploadSpinner.succeed(`Uploaded to R2 (${uploadInfo.key})`);
41
+ // Step 4: Mark workspace as uploaded
42
+ const syncSpinner = ora("Finalizing deployment...").start();
43
+ const result = await api.markWorkspaceUploaded(projectConfig.projectId);
44
+ syncSpinner.succeed("Deployment complete");
45
+ // Clean up temp file
46
+ if (archivePath && existsSync(archivePath)) {
47
+ unlinkSync(archivePath);
48
+ }
49
+ console.log(chalk.bold.green("\nDeployment successful!"));
50
+ console.log(chalk.dim(`\nProject UUID: ${result.projectUuid}`));
51
+ console.log(chalk.dim(`Workspace: ${uploadInfo.key}`));
52
+ }
53
+ catch (error) {
54
+ // Clean up temp file on error
55
+ if (archivePath && existsSync(archivePath)) {
56
+ try {
57
+ unlinkSync(archivePath);
58
+ }
59
+ catch {
60
+ // Ignore cleanup errors
61
+ }
62
+ }
63
+ console.log(chalk.red(`\nError: ${error.message}`));
64
+ process.exit(1);
65
+ }
66
+ }
67
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function initCommand(options: {
2
+ yes?: boolean;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAoCA,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoH3E"}
@@ -0,0 +1,208 @@
1
+ import { input, select, confirm, password } from "@inquirer/prompts";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
5
+ import { join, resolve } from "node:path";
6
+ import { requireApiKey, saveProjectConfig, isProjectInitialized, } from "../lib/config.js";
7
+ import { ChuckyApi } from "../lib/api.js";
8
+ const GITHUB_ACTION_TEMPLATE = `name: Deploy to Chucky
9
+ on:
10
+ push:
11
+ branches: [main]
12
+
13
+ jobs:
14
+ deploy:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - uses: actions/setup-node@v4
20
+ with:
21
+ node-version: '20'
22
+
23
+ - name: Install Chucky CLI
24
+ run: npm install -g @chucky/cli
25
+
26
+ - name: Deploy workspace
27
+ run: chucky deploy
28
+ env:
29
+ CHUCKY_API_KEY: \${{ secrets.CHUCKY_API_KEY }}
30
+ `;
31
+ export async function initCommand(options) {
32
+ console.log(chalk.bold("\nInitialize Chucky Project\n"));
33
+ // Check if already initialized
34
+ if (isProjectInitialized()) {
35
+ const overwrite = await confirm({
36
+ message: "Project already initialized. Overwrite?",
37
+ default: false,
38
+ });
39
+ if (!overwrite) {
40
+ console.log(chalk.dim("Aborted."));
41
+ return;
42
+ }
43
+ }
44
+ try {
45
+ const apiKey = requireApiKey();
46
+ const api = new ChuckyApi(apiKey);
47
+ // Fetch existing projects
48
+ const spinner = ora("Fetching projects...").start();
49
+ const projects = await api.listProjects();
50
+ spinner.stop();
51
+ // Ask: create new or use existing?
52
+ let projectId;
53
+ let projectName;
54
+ let hmacKey;
55
+ if (projects.length > 0) {
56
+ const createOrSelect = await select({
57
+ message: "What would you like to do?",
58
+ choices: [
59
+ { name: "Create a new project", value: "create" },
60
+ { name: "Use an existing project", value: "existing" },
61
+ ],
62
+ });
63
+ if (createOrSelect === "existing") {
64
+ const selectedProject = await select({
65
+ message: "Select a project:",
66
+ choices: projects.map((p) => ({
67
+ name: `${p.name} (${p.isActive ? "active" : "inactive"})`,
68
+ value: p,
69
+ })),
70
+ });
71
+ projectId = selectedProject.id;
72
+ projectName = selectedProject.name;
73
+ // Get full HMAC key
74
+ const keyInfo = await api.getHmacKey(projectId);
75
+ hmacKey = keyInfo.hmacKey;
76
+ }
77
+ else {
78
+ // Create new project
79
+ const result = await createNewProject(api);
80
+ projectId = result.projectId;
81
+ projectName = result.projectName;
82
+ hmacKey = result.hmacKey;
83
+ }
84
+ }
85
+ else {
86
+ // No existing projects, create new
87
+ const result = await createNewProject(api);
88
+ projectId = result.projectId;
89
+ projectName = result.projectName;
90
+ hmacKey = result.hmacKey;
91
+ }
92
+ // Ask for folder to deploy
93
+ const folder = await input({
94
+ message: "Folder to deploy:",
95
+ default: ".",
96
+ validate: (value) => {
97
+ const fullPath = resolve(value);
98
+ if (!existsSync(fullPath)) {
99
+ return `Directory does not exist: ${fullPath}`;
100
+ }
101
+ return true;
102
+ },
103
+ });
104
+ // Save project config
105
+ saveProjectConfig({
106
+ projectId,
107
+ projectName,
108
+ folder,
109
+ hmacKey,
110
+ });
111
+ console.log(chalk.green("\nProject config saved to .chucky.json"));
112
+ // Ask about GitHub Actions
113
+ const setupGithubActions = await confirm({
114
+ message: "Setup GitHub Actions for automatic deployment?",
115
+ default: true,
116
+ });
117
+ if (setupGithubActions) {
118
+ await setupGitHubActionsWorkflow();
119
+ }
120
+ console.log(chalk.bold.green("\nProject initialized successfully!"));
121
+ console.log(chalk.dim(`\nNext steps:`));
122
+ console.log(chalk.dim(` 1. Run 'chucky deploy' to deploy your workspace`));
123
+ if (setupGithubActions) {
124
+ console.log(chalk.dim(` 2. Add CHUCKY_API_KEY to your GitHub repository secrets`));
125
+ }
126
+ }
127
+ catch (error) {
128
+ console.log(chalk.red(`\nError: ${error.message}`));
129
+ process.exit(1);
130
+ }
131
+ }
132
+ async function createNewProject(api) {
133
+ const name = await input({
134
+ message: "Project name:",
135
+ validate: (value) => {
136
+ if (!value.trim())
137
+ return "Project name is required";
138
+ if (value.length > 64)
139
+ return "Project name must be 64 characters or less";
140
+ return true;
141
+ },
142
+ });
143
+ const description = await input({
144
+ message: "Description (optional):",
145
+ });
146
+ // Ask for Anthropic API key
147
+ const setAnthropicKey = await confirm({
148
+ message: "Set Anthropic API key now?",
149
+ default: true,
150
+ });
151
+ let anthropicApiKey;
152
+ if (setAnthropicKey) {
153
+ anthropicApiKey = await password({
154
+ message: "Anthropic API key (sk-ant-...):",
155
+ mask: "*",
156
+ validate: (value) => {
157
+ if (!value)
158
+ return true; // Optional
159
+ if (!value.startsWith("sk-ant-")) {
160
+ return "Anthropic API key should start with 'sk-ant-'";
161
+ }
162
+ return true;
163
+ },
164
+ });
165
+ }
166
+ const spinner = ora("Creating project...").start();
167
+ try {
168
+ const result = await api.createProject(name, {
169
+ description: description || undefined,
170
+ anthropicApiKey: anthropicApiKey || undefined,
171
+ });
172
+ spinner.succeed(`Project '${name}' created`);
173
+ return {
174
+ projectId: result.projectId,
175
+ projectName: name,
176
+ hmacKey: result.hmacKey,
177
+ };
178
+ }
179
+ catch (error) {
180
+ spinner.fail("Failed to create project");
181
+ throw error;
182
+ }
183
+ }
184
+ async function setupGitHubActionsWorkflow() {
185
+ const workflowDir = join(process.cwd(), ".github", "workflows");
186
+ const workflowPath = join(workflowDir, "chucky-deploy.yml");
187
+ // Check if workflow already exists
188
+ if (existsSync(workflowPath)) {
189
+ const overwrite = await confirm({
190
+ message: "GitHub workflow already exists. Overwrite?",
191
+ default: false,
192
+ });
193
+ if (!overwrite) {
194
+ console.log(chalk.dim("Skipping GitHub Actions setup."));
195
+ return;
196
+ }
197
+ }
198
+ // Create directory if needed
199
+ if (!existsSync(workflowDir)) {
200
+ mkdirSync(workflowDir, { recursive: true });
201
+ }
202
+ // Write workflow file
203
+ writeFileSync(workflowPath, GITHUB_ACTION_TEMPLATE);
204
+ console.log(chalk.green(`\nGitHub workflow created: ${workflowPath}`));
205
+ console.log(chalk.yellow("\nImportant: Add CHUCKY_API_KEY to your GitHub repository secrets:"));
206
+ console.log(chalk.dim(" Settings > Secrets and variables > Actions > New repository secret"));
207
+ }
208
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function keysCommand(): Promise<void>;
2
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/commands/keys.ts"],"names":[],"mappings":"AAKA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA6BjD"}
@@ -0,0 +1,26 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import { requireApiKey, requireProjectConfig } from "../lib/config.js";
4
+ import { ChuckyApi } from "../lib/api.js";
5
+ export async function keysCommand() {
6
+ const spinner = ora("Fetching HMAC key...").start();
7
+ try {
8
+ const apiKey = requireApiKey();
9
+ const projectConfig = requireProjectConfig();
10
+ const api = new ChuckyApi(apiKey);
11
+ const keyInfo = await api.getHmacKey(projectConfig.projectId);
12
+ spinner.stop();
13
+ console.log(chalk.bold(`\nHMAC Key for ${projectConfig.projectName}\n`));
14
+ console.log(chalk.dim("Use this key to sign JWTs for your users.\n"));
15
+ console.log(` ${chalk.bold("Key:")} ${keyInfo.hmacKey}`);
16
+ console.log(` ${chalk.bold("Created:")} ${new Date(keyInfo.createdAt).toLocaleString()}`);
17
+ console.log();
18
+ console.log(chalk.dim("Tip: Keep this key secret. You can regenerate it in the dashboard if compromised."));
19
+ }
20
+ catch (error) {
21
+ spinner.fail("Failed to fetch HMAC key");
22
+ console.log(chalk.red(`\nError: ${error.message}`));
23
+ process.exit(1);
24
+ }
25
+ }
26
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/commands/keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAG,oBAAoB,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QAElC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAE9D,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,aAAa,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,EAAE,CAC9E,CAAC;QACF,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,mFAAmF,CACpF,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAa,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function listCommand(): Promise<void>;
2
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAKA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAqCjD"}
@@ -0,0 +1,38 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import { requireApiKey } from "../lib/config.js";
4
+ import { ChuckyApi } from "../lib/api.js";
5
+ export async function listCommand() {
6
+ const spinner = ora("Fetching projects...").start();
7
+ try {
8
+ const apiKey = requireApiKey();
9
+ const api = new ChuckyApi(apiKey);
10
+ const projects = await api.listProjects();
11
+ spinner.stop();
12
+ if (projects.length === 0) {
13
+ console.log(chalk.yellow("\nNo projects found."));
14
+ console.log(chalk.dim("Run 'chucky init' to create a new project."));
15
+ return;
16
+ }
17
+ console.log(chalk.bold(`\nProjects (${projects.length}):\n`));
18
+ for (const project of projects) {
19
+ const status = project.isActive
20
+ ? chalk.green("active")
21
+ : chalk.red("inactive");
22
+ console.log(` ${chalk.bold(project.name)}`);
23
+ console.log(` ID: ${chalk.dim(project.id)}`);
24
+ console.log(` Status: ${status}`);
25
+ console.log(` HMAC Key: ${chalk.dim(project.hmacKey)}`);
26
+ if (project.description) {
27
+ console.log(` Description: ${chalk.dim(project.description)}`);
28
+ }
29
+ console.log();
30
+ }
31
+ }
32
+ catch (error) {
33
+ spinner.fail("Failed to fetch projects");
34
+ console.log(chalk.red(`\nError: ${error.message}`));
35
+ process.exit(1);
36
+ }
37
+ }
38
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC;QAE1C,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC;QAE9D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ;gBAC7B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACvB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAE1B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,EAAE,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3D,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAa,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function loginCommand(options: {
2
+ key?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAQA,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD3E"}
@@ -0,0 +1,53 @@
1
+ import { password } from "@inquirer/prompts";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { saveGlobalConfig, loadGlobalConfig } from "../lib/config.js";
5
+ import { ChuckyApi } from "../lib/api.js";
6
+ const DEFAULT_PORTAL_URL = "https://mellow-quokka-802.convex.site";
7
+ export async function loginCommand(options) {
8
+ console.log(chalk.bold("\nChucky CLI Login\n"));
9
+ // Get API key from option or prompt
10
+ let apiKey = options.key;
11
+ if (!apiKey) {
12
+ apiKey = await password({
13
+ message: "Enter your API key (ak_live_...):",
14
+ mask: "*",
15
+ validate: (value) => {
16
+ if (!value)
17
+ return "API key is required";
18
+ if (!value.startsWith("ak_live_")) {
19
+ return "API key should start with 'ak_live_'";
20
+ }
21
+ return true;
22
+ },
23
+ });
24
+ }
25
+ // Validate the API key
26
+ const spinner = ora("Validating API key...").start();
27
+ try {
28
+ const api = new ChuckyApi(apiKey);
29
+ const result = await api.validateApiKey();
30
+ if (!result.valid) {
31
+ spinner.fail("Invalid API key");
32
+ console.log(chalk.red(`\nError: ${result.error || "API key validation failed"}`));
33
+ process.exit(1);
34
+ }
35
+ // Save config
36
+ const existingConfig = loadGlobalConfig();
37
+ saveGlobalConfig({
38
+ apiKey,
39
+ email: result.email,
40
+ portalUrl: existingConfig?.portalUrl || DEFAULT_PORTAL_URL,
41
+ });
42
+ spinner.succeed("Logged in successfully");
43
+ console.log(chalk.green(`\nWelcome, ${result.email}!`));
44
+ console.log(chalk.dim(`Credit balance: $${result.credit_balance_usd?.toFixed(2) || "0.00"}`));
45
+ console.log(chalk.dim("\nConfig saved to ~/.chucky/config.json"));
46
+ }
47
+ catch (error) {
48
+ spinner.fail("Login failed");
49
+ console.log(chalk.red(`\nError: ${error.message}`));
50
+ process.exit(1);
51
+ }
52
+ }
53
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,kBAAkB,GAAG,uCAAuC,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAyB;IAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAEhD,oCAAoC;IACpC,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAEzB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,MAAM,QAAQ,CAAC;YACtB,OAAO,EAAE,mCAAmC;YAC5C,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;gBAClB,IAAI,CAAC,KAAK;oBAAE,OAAO,qBAAqB,CAAC;gBACzC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAClC,OAAO,sCAAsC,CAAC;gBAChD,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB;IACvB,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC;QAE1C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,KAAK,IAAI,2BAA2B,EAAE,CAAC,CAAC,CAAC;YAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,cAAc;QACd,MAAM,cAAc,GAAG,gBAAgB,EAAE,CAAC;QAC1C,gBAAgB,CAAC;YACf,MAAM;YACN,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,cAAc,EAAE,SAAS,IAAI,kBAAkB;SAC3D,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAa,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
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":""}