@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
|
@@ -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 @@
|
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAgB,MAAM,eAAe,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,YAAqB;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QAElC,IAAI,SAAS,GAAG,YAAY,CAAC;QAC7B,IAAI,WAA+B,CAAC;QAEpC,wDAAwD;QACxD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;YAE1C,IAAI,aAAa,EAAE,CAAC;gBAClB,sBAAsB;gBACtB,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC;oBAC/B,OAAO,EAAE,2BAA2B,aAAa,CAAC,WAAW,IAAI;oBACjE,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;gBAEH,IAAI,UAAU,EAAE,CAAC;oBACf,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;oBACpC,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC;gBAC1C,CAAC;YACH,CAAC;YAED,oDAAoD;YACpD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;gBACpD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC;gBAC1C,OAAO,CAAC,IAAI,EAAE,CAAC;gBAEf,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;oBAClD,OAAO;gBACT,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAU;oBACrC,OAAO,EAAE,2BAA2B;oBACpC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC5B,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,GAAG;wBAC3B,KAAK,EAAE,CAAC;qBACT,CAAC,CAAC;iBACJ,CAAC,CAAC;gBAEH,SAAS,GAAG,QAAQ,CAAC,EAAE,CAAC;gBACxB,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC;YAClC,OAAO,EAAE,KAAK,CAAC,GAAG,CAChB,oCAAoC,WAAW,IAAI,SAAS,2BAA2B,CACxF;YACD,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;QACnD,MAAM,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,CAAC,OAAO,CAAC,YAAY,WAAW,IAAI,SAAS,WAAW,CAAC,CAAC;QAEjE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,sFAAsF,CACvF,CACF,CAAC;IACJ,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 @@
|
|
|
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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA4B;IAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAEnD,IAAI,WAAW,GAAkB,IAAI,CAAC;IAEtC,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,6BAA6B;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,IAAI,GAAG,CAAC;QAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAEjC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,QAAQ,IAAI,CAAC,CAAC,CAAC;QAEhD,yBAAyB;QACzB,MAAM,cAAc,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC9C,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;QAC3B,cAAc,CAAC,OAAO,CACpB,oBAAoB,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,SAAS,SAAS,CAC7E,CAAC;QAEF,yBAAyB;QACzB,MAAM,UAAU,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;QACxD,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACnE,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAErC,uBAAuB;QACvB,MAAM,aAAa,GAAG,GAAG,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,CAAC;QAElD,MAAM,UAAU,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;YAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;YACrD,aAAa,CAAC,IAAI,GAAG,gBAAgB,OAAO,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC;QACnG,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC,OAAO,CAAC,mBAAmB,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;QAE5D,qCAAqC;QACrC,MAAM,WAAW,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,qBAAqB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACxE,WAAW,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAE3C,qBAAqB;QACrB,IAAI,WAAW,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,UAAU,CAAC,WAAW,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,8BAA8B;QAC9B,IAAI,WAAW,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,UAAU,CAAC,WAAW,CAAC,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;QAED,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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|