@crawlee-cloud/cli 0.1.5 → 0.2.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/README.md CHANGED
@@ -58,12 +58,11 @@ You'll be prompted for your API token. Credentials are stored in `~/.crawlee-clo
58
58
 
59
59
  ### Environment Variables
60
60
 
61
- | Variable | Description |
62
- |----------|-------------|
61
+ | Variable | Description |
62
+ | ----------------------- | --------------------- |
63
63
  | `CRAWLEE_CLOUD_API_URL` | Override API base URL |
64
- | `CRAWLEE_CLOUD_TOKEN` | Override API token |
64
+ | `CRAWLEE_CLOUD_TOKEN` | Override API token |
65
65
 
66
66
  ## Documentation
67
67
 
68
68
  For full documentation, visit the [Crawlee Cloud Documentation](https://github.com/crawlee-cloud/crawlee-cloud).
69
-
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `crawlee-cloud dev` command
3
+ *
4
+ * Runs an Actor in development mode with hot reload.
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare const devCommand: Command;
8
+ //# sourceMappingURL=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,UAAU,SAyHnB,CAAC"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * `crawlee-cloud dev` command
3
+ *
4
+ * Runs an Actor in development mode with hot reload.
5
+ */
6
+ import { Command } from 'commander';
7
+ import chalk from 'chalk';
8
+ import path from 'path';
9
+ import fs from 'fs-extra';
10
+ import { spawn } from 'child_process';
11
+ import chokidar from 'chokidar';
12
+ import dotenv from 'dotenv';
13
+ export const devCommand = new Command('dev')
14
+ .description('Run Actor in development mode with hot reload')
15
+ .option('-w, --watch', 'Enable file watching and auto-restart', false)
16
+ .action(async (options) => {
17
+ console.log(chalk.bold('\nšŸ”„ Starting development mode\n'));
18
+ const cwd = process.cwd();
19
+ // Check if we're in an Actor directory
20
+ const packageJsonPath = path.join(cwd, 'package.json');
21
+ const requirementsPath = path.join(cwd, 'requirements.txt');
22
+ const isPython = await fs.pathExists(requirementsPath) && !await fs.pathExists(packageJsonPath);
23
+ if (!await fs.pathExists(packageJsonPath) && !isPython) {
24
+ console.log(chalk.red('āŒ No package.json or requirements.txt found'));
25
+ console.log(chalk.dim('Are you in an Actor directory?'));
26
+ process.exit(1);
27
+ }
28
+ // Load .env if exists
29
+ const envPath = path.join(cwd, '.env');
30
+ if (await fs.pathExists(envPath)) {
31
+ dotenv.config({ path: envPath });
32
+ }
33
+ // Set up storage directory
34
+ const storageDir = path.join(cwd, 'storage');
35
+ await fs.ensureDir(path.join(storageDir, 'key_value_stores', 'default'));
36
+ await fs.ensureDir(path.join(storageDir, 'datasets', 'default'));
37
+ await fs.ensureDir(path.join(storageDir, 'request_queues', 'default'));
38
+ // Environment for the Actor
39
+ const env = {
40
+ ...process.env,
41
+ APIFY_LOCAL_STORAGE_DIR: storageDir,
42
+ APIFY_HEADLESS: '1',
43
+ CRAWLEE_STORAGE_DIR: storageDir,
44
+ };
45
+ let child = null;
46
+ let isRestarting = false;
47
+ const startActor = () => {
48
+ if (child) {
49
+ isRestarting = true;
50
+ child.kill();
51
+ }
52
+ // Small delay before restart
53
+ setTimeout(() => {
54
+ const timestamp = new Date().toLocaleTimeString();
55
+ console.log(chalk.dim(`[${timestamp}]`), chalk.cyan('Starting Actor...'));
56
+ console.log(chalk.dim('─'.repeat(50)));
57
+ // Cross-platform command detection
58
+ const isWindows = process.platform === 'win32';
59
+ const pythonCmd = isWindows ? 'python' : 'python3';
60
+ const npmCmd = isWindows ? 'npm.cmd' : 'npm';
61
+ const cmd = isPython ? pythonCmd : npmCmd;
62
+ const args = isPython ? ['-m', 'src'] : ['start'];
63
+ child = spawn(cmd, args, {
64
+ cwd,
65
+ env,
66
+ stdio: 'inherit',
67
+ shell: true,
68
+ });
69
+ child.on('exit', (code) => {
70
+ if (!isRestarting) {
71
+ console.log(chalk.dim('─'.repeat(50)));
72
+ if (code === 0) {
73
+ console.log(chalk.green('\nāœ… Actor finished'));
74
+ }
75
+ else {
76
+ console.log(chalk.yellow(`\nāš ļø Actor exited with code ${String(code ?? 'unknown')}`));
77
+ }
78
+ if (options.watch === true) {
79
+ console.log(chalk.dim('\nWatching for changes... (Ctrl+C to exit)\n'));
80
+ }
81
+ }
82
+ isRestarting = false;
83
+ });
84
+ }, isRestarting ? 500 : 0);
85
+ };
86
+ // Start Actor
87
+ startActor();
88
+ // Watch for changes
89
+ if (options.watch === true) {
90
+ const watchPaths = isPython
91
+ ? ['src/**/*.py', '*.py']
92
+ : ['src/**/*.ts', 'src/**/*.js', '*.ts', '*.js'];
93
+ const watcher = chokidar.watch(watchPaths, {
94
+ cwd,
95
+ ignored: ['node_modules', 'storage', 'dist', '.git', '__pycache__'],
96
+ ignoreInitial: true,
97
+ });
98
+ watcher.on('change', (filePath) => {
99
+ const timestamp = new Date().toLocaleTimeString();
100
+ console.log(chalk.dim(`\n[${timestamp}]`), chalk.yellow(`File changed: ${filePath}`));
101
+ startActor();
102
+ });
103
+ watcher.on('add', (filePath) => {
104
+ const timestamp = new Date().toLocaleTimeString();
105
+ console.log(chalk.dim(`\n[${timestamp}]`), chalk.yellow(`File added: ${filePath}`));
106
+ startActor();
107
+ });
108
+ // Handle Ctrl+C
109
+ process.on('SIGINT', () => {
110
+ console.log(chalk.dim('\n\nShutting down...\n'));
111
+ void watcher.close();
112
+ if (child)
113
+ child.kill();
114
+ process.exit(0);
115
+ });
116
+ }
117
+ });
118
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `crawlee-cloud init` command
3
+ *
4
+ * Scaffolds new Actor projects using official Apify templates.
5
+ * Templates are fetched from: https://github.com/apify/actor-templates
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare const initCommand: Command;
9
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmCpC,eAAO,MAAM,WAAW,SAwNpB,CAAC"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * `crawlee-cloud init` command
3
+ *
4
+ * Scaffolds new Actor projects using official Apify templates.
5
+ * Templates are fetched from: https://github.com/apify/actor-templates
6
+ */
7
+ import { Command } from 'commander';
8
+ import chalk from 'chalk';
9
+ import ora from 'ora';
10
+ import inquirer from 'inquirer';
11
+ import path from 'path';
12
+ import fs from 'fs-extra';
13
+ import AdmZip from 'adm-zip';
14
+ const MANIFEST_URL = 'https://raw.githubusercontent.com/apify/actor-templates/master/templates/manifest.json';
15
+ export const initCommand = new Command('init')
16
+ .description('Create a new Actor project from template (uses official Apify templates)')
17
+ .argument('[name]', 'Name of the Actor project')
18
+ .option('-t, --template <template>', 'Template ID (e.g., ts-crawlee-cheerio)')
19
+ .option('-l, --list', 'List available templates')
20
+ .action(async (nameArg, options) => {
21
+ console.log(chalk.bold('\nšŸš€ Create a new Actor project\n'));
22
+ // Fetch templates manifest
23
+ const fetchSpinner = ora('Fetching available templates...').start();
24
+ let manifest;
25
+ try {
26
+ const response = await fetch(MANIFEST_URL);
27
+ if (!response.ok) {
28
+ throw new Error(`Failed to fetch templates: ${String(response.status)}`);
29
+ }
30
+ manifest = await response.json();
31
+ fetchSpinner.succeed(`Found ${String(manifest.templates.length)} templates`);
32
+ }
33
+ catch (err) {
34
+ fetchSpinner.fail('Failed to fetch templates');
35
+ console.error(err);
36
+ process.exit(1);
37
+ }
38
+ // List mode
39
+ if (options.list === true) {
40
+ console.log(chalk.dim('\nAvailable templates:\n'));
41
+ const categories = [...new Set(manifest.templates.map(t => t.category))];
42
+ for (const category of categories) {
43
+ console.log(chalk.bold.cyan(` ${category.toUpperCase()}`));
44
+ const categoryTemplates = manifest.templates.filter(t => t.category === category);
45
+ for (const t of categoryTemplates) {
46
+ console.log(chalk.white(` ${t.id}`));
47
+ const desc = t.description ? t.description.slice(0, 60) : '';
48
+ console.log(chalk.dim(` ${t.label} - ${desc}...`));
49
+ }
50
+ console.log();
51
+ }
52
+ return;
53
+ }
54
+ // Get project name
55
+ let projectName = nameArg ?? '';
56
+ if (!projectName) {
57
+ const answer = await inquirer.prompt([{
58
+ type: 'input',
59
+ name: 'name',
60
+ message: 'Actor name:',
61
+ default: 'my-actor',
62
+ validate: (input) => {
63
+ if (!/^[a-z0-9-]+$/.test(input)) {
64
+ return 'Name must contain only lowercase letters, numbers, and hyphens';
65
+ }
66
+ return true;
67
+ },
68
+ }]);
69
+ projectName = answer.name;
70
+ }
71
+ // Check if directory exists
72
+ const targetDir = path.resolve(process.cwd(), projectName);
73
+ if (await fs.pathExists(targetDir)) {
74
+ console.log(chalk.red(`āŒ Directory "${projectName}" already exists`));
75
+ process.exit(1);
76
+ }
77
+ // Get template
78
+ let template;
79
+ if (options.template) {
80
+ template = manifest.templates.find(t => t.id === options.template);
81
+ if (!template) {
82
+ console.log(chalk.red(`āŒ Template "${options.template}" not found`));
83
+ console.log(chalk.dim('Run `crc init --list` to see available templates'));
84
+ process.exit(1);
85
+ }
86
+ }
87
+ else {
88
+ // Group templates by category for selection
89
+ const choices = manifest.templates
90
+ .filter(t => t.category === 'javascript' || t.category === 'typescript' || t.category === 'python')
91
+ .map(t => ({
92
+ name: `${t.label} ${chalk.dim(`(${t.id})`)}`,
93
+ value: t.id,
94
+ short: t.id,
95
+ }));
96
+ const answer = await inquirer.prompt([{
97
+ type: 'list',
98
+ name: 'templateId',
99
+ message: 'Select a template:',
100
+ choices: [
101
+ new inquirer.Separator(chalk.bold('─── TypeScript ───')),
102
+ ...choices.filter(c => c.value.startsWith('ts-')),
103
+ new inquirer.Separator(chalk.bold('─── JavaScript ───')),
104
+ ...choices.filter(c => c.value.startsWith('js-')),
105
+ new inquirer.Separator(chalk.bold('─── Python ───')),
106
+ ...choices.filter(c => c.value.startsWith('python-')),
107
+ ],
108
+ pageSize: 15,
109
+ }]);
110
+ template = manifest.templates.find(t => t.id === answer.templateId);
111
+ }
112
+ if (!template) {
113
+ console.log(chalk.red('āŒ No template selected'));
114
+ process.exit(1);
115
+ }
116
+ console.log(chalk.dim(`\nTemplate: ${template.label}`));
117
+ console.log(chalk.dim(`Category: ${template.category}`));
118
+ console.log();
119
+ // Download and extract template
120
+ const downloadSpinner = ora('Downloading template...').start();
121
+ try {
122
+ const response = await fetch(template.archiveUrl);
123
+ if (!response.ok) {
124
+ throw new Error(`Failed to download: ${String(response.status)}`);
125
+ }
126
+ const arrayBuffer = await response.arrayBuffer();
127
+ const buffer = Buffer.from(arrayBuffer);
128
+ downloadSpinner.text = 'Extracting template...';
129
+ const zip = new AdmZip(buffer);
130
+ // Create target directory
131
+ await fs.ensureDir(targetDir);
132
+ // Extract files
133
+ const entries = zip.getEntries();
134
+ for (const entry of entries) {
135
+ if (entry.isDirectory)
136
+ continue;
137
+ // Remove the top-level directory from the path (e.g., "ts-crawlee-cheerio/")
138
+ const entryPath = entry.entryName;
139
+ const pathParts = entryPath.split('/');
140
+ const relativePath = pathParts.slice(1).join('/');
141
+ if (!relativePath)
142
+ continue;
143
+ const targetPath = path.join(targetDir, relativePath);
144
+ await fs.ensureDir(path.dirname(targetPath));
145
+ await fs.writeFile(targetPath, entry.getData());
146
+ }
147
+ downloadSpinner.succeed('Template extracted');
148
+ }
149
+ catch (err) {
150
+ downloadSpinner.fail('Failed to download template');
151
+ console.error(err);
152
+ process.exit(1);
153
+ }
154
+ // Update actor.json with project name
155
+ const actorJsonPath = path.join(targetDir, '.actor', 'actor.json');
156
+ if (await fs.pathExists(actorJsonPath)) {
157
+ try {
158
+ const actorJson = await fs.readJson(actorJsonPath);
159
+ actorJson.name = projectName;
160
+ actorJson.title = projectName.split('-').map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');
161
+ await fs.writeJson(actorJsonPath, actorJson, { spaces: 4 });
162
+ }
163
+ catch {
164
+ // Ignore if actor.json update fails
165
+ }
166
+ }
167
+ // Install dependencies
168
+ const isPython = template.category === 'python';
169
+ const installSpinner = ora('Installing dependencies...').start();
170
+ try {
171
+ const { spawn } = await import('child_process');
172
+ // Cross-platform command detection
173
+ const isWindows = process.platform === 'win32';
174
+ const pythonCmd = isWindows ? 'python' : 'python3';
175
+ const npmCmd = isWindows ? 'npm.cmd' : 'npm';
176
+ await new Promise((resolve, reject) => {
177
+ const cmd = isPython ? pythonCmd : npmCmd;
178
+ const args = isPython ? ['-m', 'pip', 'install', '-r', 'requirements.txt'] : ['install'];
179
+ const child = spawn(cmd, args, {
180
+ cwd: targetDir,
181
+ stdio: 'pipe',
182
+ shell: true,
183
+ });
184
+ child.on('exit', (code) => {
185
+ if (code === 0)
186
+ resolve();
187
+ else
188
+ reject(new Error(`Install failed with code ${String(code)}`));
189
+ });
190
+ child.on('error', reject);
191
+ });
192
+ installSpinner.succeed('Dependencies installed');
193
+ }
194
+ catch {
195
+ installSpinner.warn('Could not install dependencies (run manually)');
196
+ }
197
+ // Success message
198
+ console.log(chalk.green(`\nāœ… Actor "${projectName}" created successfully!\n`));
199
+ console.log(chalk.bold('Next steps:'));
200
+ console.log(chalk.cyan(` cd ${projectName}`));
201
+ console.log(chalk.cyan(' crc run # Run locally'));
202
+ console.log(chalk.cyan(' crc push # Push to Crawlee Cloud'));
203
+ console.log();
204
+ console.log(chalk.dim('Template from: github.com/apify/actor-templates'));
205
+ console.log();
206
+ });
207
+ //# 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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,YAAY,SAiDrB,CAAC"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,eAAO,MAAM,YAAY,SA6ErB,CAAC"}
@@ -15,25 +15,42 @@ export const loginCommand = new Command('login')
15
15
  console.log(chalk.bold('\nšŸ” Login to Crawlee Cloud\n'));
16
16
  const existingConfig = await getConfig();
17
17
  // Get API URL
18
- const apiBaseUrl = options.url || await input({
19
- message: 'API URL:',
20
- default: existingConfig.apiBaseUrl || 'http://localhost:3000',
21
- });
18
+ const apiBaseUrl = options.url ??
19
+ (await input({
20
+ message: 'API URL:',
21
+ default: existingConfig.apiBaseUrl || 'http://localhost:3000',
22
+ }));
22
23
  // Get token
23
- const token = options.token || await password({
24
- message: 'API Token:',
25
- mask: '*',
26
- });
27
- // Test connection
28
- console.log(chalk.dim('\nTesting connection...'));
24
+ const token = options.token ??
25
+ (await password({
26
+ message: 'API Token:',
27
+ mask: '*',
28
+ }));
29
+ // Test connection and validate token
30
+ console.log(chalk.dim('\nValidating credentials...'));
29
31
  try {
30
- const response = await fetch(`${apiBaseUrl}/health`);
31
- if (!response.ok) {
32
- throw new Error(`Server returned ${response.status}`);
32
+ // First check if server is reachable
33
+ const healthResponse = await fetch(`${apiBaseUrl}/health`);
34
+ if (!healthResponse.ok) {
35
+ throw new Error(`Server returned ${String(healthResponse.status)}`);
33
36
  }
34
- const health = await response.json();
35
- console.log(chalk.green(`āœ… Connected to Crawlee Cloud v${health.version}`));
36
- // Save config
37
+ const health = (await healthResponse.json());
38
+ // Now validate the token by calling an authenticated endpoint
39
+ const authResponse = await fetch(`${apiBaseUrl}/v2/auth/me`, {
40
+ headers: {
41
+ Authorization: `Bearer ${token}`,
42
+ },
43
+ });
44
+ if (authResponse.status === 401 || authResponse.status === 403) {
45
+ throw new Error('Invalid token. Please check your API key and try again.');
46
+ }
47
+ if (!authResponse.ok) {
48
+ throw new Error(`Authentication failed: ${String(authResponse.status)}`);
49
+ }
50
+ const userData = (await authResponse.json());
51
+ console.log(chalk.green(`āœ… Connected to Crawlee Cloud v${health.version ?? '1.0.0'}`));
52
+ console.log(chalk.dim(` Authenticated as: ${userData.data.email}`));
53
+ // Save config only after successful validation
37
54
  await saveConfig({
38
55
  apiBaseUrl,
39
56
  token,
@@ -42,8 +59,14 @@ export const loginCommand = new Command('login')
42
59
  console.log(chalk.green('\nāœ… Login successful!\n'));
43
60
  }
44
61
  catch (err) {
45
- console.log(chalk.red(`\nāŒ Failed to connect: ${err.message}`));
46
- console.log(chalk.dim(`\nMake sure the platform is running at ${apiBaseUrl}`));
62
+ const message = err.message;
63
+ console.log(chalk.red(`\nāŒ ${message}`));
64
+ if (message.includes('Invalid token')) {
65
+ console.log(chalk.dim(`\nGet a valid token from your dashboard: Settings → API Keys`));
66
+ }
67
+ else {
68
+ console.log(chalk.dim(`\nMake sure the platform is running at ${apiBaseUrl}`));
69
+ }
47
70
  process.exit(1);
48
71
  }
49
72
  });
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,qBAAqB,EAAE,WAAW,CAAC;KAC1C,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAEzD,MAAM,cAAc,GAAG,MAAM,SAAS,EAAE,CAAC;IAEzC,cAAc;IACd,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,IAAI,MAAM,KAAK,CAAC;QAC5C,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,cAAc,CAAC,UAAU,IAAI,uBAAuB;KAC9D,CAAC,CAAC;IAEH,YAAY;IACZ,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,QAAQ,CAAC;QAC5C,OAAO,EAAE,YAAY;QACrB,IAAI,EAAE,GAAG;KACV,CAAC,CAAC;IAEH,kBAAkB;IAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,SAAS,CAAC,CAAC;QAErD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAyC,CAAC;QAE5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAE5E,cAAc;QACd,MAAM,UAAU,CAAC;YACf,UAAU;YACV,KAAK;SACN,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAEtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA2B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,UAAU,EAAE,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,WAAW,SAoFpB,CAAC"}
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BpC,eAAO,MAAM,WAAW,SAgHpB,CAAC"}
@@ -10,6 +10,7 @@ export const logsCommand = new Command('logs')
10
10
  .description('View logs for a run')
11
11
  .argument('<run-id>', 'Run ID')
12
12
  .option('-f, --follow', 'Follow logs in real-time', false)
13
+ .option('-l, --limit <lines>', 'Number of log lines to show', '1000')
13
14
  .action(async (runId, options) => {
14
15
  console.log(chalk.bold(`\nšŸ“‹ Logs for run: ${runId}\n`));
15
16
  const config = await getConfig();
@@ -26,47 +27,69 @@ export const logsCommand = new Command('logs')
26
27
  console.log(chalk.red(`āŒ Run not found: ${runId}`));
27
28
  process.exit(1);
28
29
  }
29
- const run = (await runResponse.json());
30
- console.log(chalk.dim(`Actor: ${run.data.actId}`));
31
- console.log(chalk.dim(`Status: ${run.data.status}`));
32
- console.log(chalk.dim(`Started: ${run.data.startedAt}`));
33
- if (run.data.finishedAt) {
34
- console.log(chalk.dim(`Finished: ${run.data.finishedAt}`));
30
+ const runResult = await runResponse.json();
31
+ const run = runResult.data;
32
+ console.log(chalk.dim(`Actor: ${run.actId}`));
33
+ console.log(chalk.dim(`Status: ${formatStatus(run.status)}`));
34
+ console.log(chalk.dim(`Started: ${new Date(run.startedAt).toLocaleString()}`));
35
+ if (run.finishedAt) {
36
+ console.log(chalk.dim(`Finished: ${new Date(run.finishedAt).toLocaleString()}`));
35
37
  }
36
38
  console.log(chalk.dim('─'.repeat(60)));
37
39
  console.log();
38
- if (options.follow && (run.data.status === 'RUNNING' || run.data.status === 'READY')) {
39
- // Follow logs (simplified - in production would use WebSocket or SSE)
40
- console.log(chalk.dim('Following logs... (Ctrl+C to stop)\n'));
41
- while (true) {
40
+ // Fetch logs from API
41
+ const fetchLogs = async (offset = 0) => {
42
+ const logsResponse = await fetch(`${config.apiBaseUrl}/v2/actor-runs/${runId}/logs?limit=${options.limit}&offset=${String(offset)}`, { headers: { 'Authorization': `Bearer ${config.token}` } });
43
+ if (!logsResponse.ok) {
44
+ return [];
45
+ }
46
+ const logsResult = await logsResponse.json();
47
+ return logsResult.data.items;
48
+ };
49
+ // Print logs
50
+ const printLog = (entry) => {
51
+ const time = new Date(entry.timestamp).toLocaleTimeString();
52
+ const level = formatLevel(entry.level);
53
+ console.log(`${chalk.dim(time)} ${level} ${entry.message}`);
54
+ };
55
+ const logs = await fetchLogs();
56
+ if (logs.length === 0) {
57
+ console.log(chalk.dim('No logs available yet.'));
58
+ // Check if run failed without logs - show helpful message
59
+ if (run.status === 'FAILED') {
60
+ console.log();
61
+ console.log(chalk.yellow('šŸ’” Run failed but no logs were captured.'));
62
+ console.log(chalk.dim(' Check runner container logs with:'));
63
+ console.log(chalk.dim(' docker compose logs runner'));
64
+ }
65
+ }
66
+ else {
67
+ logs.forEach(printLog);
68
+ }
69
+ // Follow mode
70
+ if (options.follow && (run.status === 'RUNNING' || run.status === 'READY')) {
71
+ console.log(chalk.dim('\nFollowing logs... (Ctrl+C to stop)\n'));
72
+ let lastCount = logs.length;
73
+ let isRunning = true;
74
+ while (isRunning) {
42
75
  await sleep(2000);
76
+ // Check run status
43
77
  const statusResponse = await fetch(`${config.apiBaseUrl}/v2/actor-runs/${runId}`, {
44
78
  headers: { 'Authorization': `Bearer ${config.token}` },
45
79
  });
46
80
  const statusResult = await statusResponse.json();
81
+ // Fetch new logs
82
+ const newLogs = await fetchLogs(lastCount);
83
+ newLogs.forEach(printLog);
84
+ lastCount += newLogs.length;
47
85
  if (statusResult.data.status !== 'RUNNING' && statusResult.data.status !== 'READY') {
48
- console.log(chalk.dim(`\nRun finished with status: ${statusResult.data.status}`));
49
- break;
86
+ console.log(chalk.dim(`\nRun finished with status: ${formatStatus(statusResult.data.status)}`));
87
+ isRunning = false;
50
88
  }
51
89
  }
52
90
  }
53
- else {
54
- // For now, just show run status
55
- // In production, would fetch actual container logs
56
- console.log(chalk.dim('(Real-time logs not yet implemented - checking run status)'));
57
- console.log();
58
- if (run.data.status === 'SUCCEEDED') {
59
- console.log(chalk.green('Run completed successfully'));
60
- }
61
- else if (run.data.status === 'FAILED') {
62
- console.log(chalk.red('Run failed'));
63
- }
64
- else if (run.data.status === 'RUNNING') {
65
- console.log(chalk.yellow('Run is still in progress'));
66
- }
67
- else {
68
- console.log(chalk.dim(`Status: ${run.data.status}`));
69
- }
91
+ else if (run.status === 'RUNNING') {
92
+ console.log(chalk.dim('\nRun is still in progress. Use -f to follow logs.'));
70
93
  }
71
94
  console.log();
72
95
  }
@@ -75,6 +98,35 @@ export const logsCommand = new Command('logs')
75
98
  process.exit(1);
76
99
  }
77
100
  });
101
+ function formatLevel(level) {
102
+ switch (level.toUpperCase()) {
103
+ case 'ERROR':
104
+ return chalk.red('ERR');
105
+ case 'WARN':
106
+ case 'WARNING':
107
+ return chalk.yellow('WRN');
108
+ case 'INFO':
109
+ return chalk.blue('INF');
110
+ case 'DEBUG':
111
+ return chalk.dim('DBG');
112
+ default:
113
+ return chalk.dim(level.slice(0, 3).toUpperCase());
114
+ }
115
+ }
116
+ function formatStatus(status) {
117
+ switch (status) {
118
+ case 'SUCCEEDED':
119
+ return chalk.green('āœ“ SUCCEEDED');
120
+ case 'FAILED':
121
+ return chalk.red('āœ— FAILED');
122
+ case 'RUNNING':
123
+ return chalk.cyan('⟳ RUNNING');
124
+ case 'READY':
125
+ return chalk.dim('READY');
126
+ default:
127
+ return status;
128
+ }
129
+ }
78
130
  function sleep(ms) {
79
131
  return new Promise(resolve => setTimeout(resolve, ms));
80
132
  }
@@ -1 +1 @@
1
- {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `crawlee-cloud status` command
3
+ *
4
+ * Check the status of a run.
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare const statusCommand: Command;
8
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkDpC,eAAO,MAAM,aAAa,SAyGtB,CAAC"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * `crawlee-cloud status` command
3
+ *
4
+ * Check the status of a run.
5
+ */
6
+ import { Command } from 'commander';
7
+ import chalk from 'chalk';
8
+ import ora from 'ora';
9
+ import { getConfig } from '../utils/config.js';
10
+ function formatDuration(ms) {
11
+ if (ms < 1000)
12
+ return `${String(ms)}ms`;
13
+ if (ms < 60000)
14
+ return `${(ms / 1000).toFixed(1)}s`;
15
+ const mins = Math.floor(ms / 60000);
16
+ const secs = Math.floor((ms % 60000) / 1000);
17
+ return `${String(mins)}m ${String(secs)}s`;
18
+ }
19
+ function formatStatus(status) {
20
+ const statusMap = {
21
+ 'READY': chalk.dim('READY'),
22
+ 'RUNNING': chalk.cyan('⟳ RUNNING'),
23
+ 'SUCCEEDED': chalk.green('āœ“ SUCCEEDED'),
24
+ 'FAILED': chalk.red('āœ— FAILED'),
25
+ 'ABORTING': chalk.yellow('āø ABORTING'),
26
+ 'ABORTED': chalk.gray('ā¹ ABORTED'),
27
+ 'TIMING-OUT': chalk.yellow('ā° TIMING-OUT'),
28
+ 'TIMED-OUT': chalk.red('ā° TIMED-OUT'),
29
+ };
30
+ return statusMap[status] ?? status;
31
+ }
32
+ export const statusCommand = new Command('status')
33
+ .description('Check the status of a run')
34
+ .argument('<run-id>', 'Run ID to check')
35
+ .option('-w, --watch', 'Watch for updates')
36
+ .option('-i, --interval <seconds>', 'Watch interval in seconds', '5')
37
+ .action(async (runId, options) => {
38
+ const config = await getConfig();
39
+ const fetchStatus = async () => {
40
+ try {
41
+ const response = await fetch(`${config.apiBaseUrl}/v2/actor-runs/${runId}`, {
42
+ headers: {
43
+ 'Authorization': `Bearer ${config.token}`,
44
+ },
45
+ });
46
+ if (!response.ok) {
47
+ if (response.status === 404) {
48
+ console.log(chalk.red(`āŒ Run "${runId}" not found`));
49
+ return null;
50
+ }
51
+ throw new Error(`API error: ${String(response.status)}`);
52
+ }
53
+ const json = await response.json();
54
+ return json.data;
55
+ }
56
+ catch (err) {
57
+ console.log(chalk.red('āŒ Failed to fetch run status'));
58
+ console.error(err);
59
+ return null;
60
+ }
61
+ };
62
+ const displayStatus = (run) => {
63
+ console.clear();
64
+ console.log(chalk.bold('\nšŸ“Š Run Status\n'));
65
+ console.log(chalk.dim('Run ID: '), run.id);
66
+ console.log(chalk.dim('Actor: '), run.actId);
67
+ console.log(chalk.dim('Status: '), formatStatus(run.status));
68
+ console.log(chalk.dim('Started: '), new Date(run.startedAt).toLocaleString());
69
+ if (run.finishedAt) {
70
+ console.log(chalk.dim('Finished: '), new Date(run.finishedAt).toLocaleString());
71
+ }
72
+ if (run.stats?.durationMillis) {
73
+ console.log(chalk.dim('Duration: '), formatDuration(run.stats.durationMillis));
74
+ }
75
+ if (run.stats && (run.stats.requestsTotal ?? run.stats.requestsFinished)) {
76
+ console.log();
77
+ console.log(chalk.bold('Requests:'));
78
+ console.log(chalk.dim(' Total: '), String(run.stats.requestsTotal ?? 0));
79
+ console.log(chalk.dim(' Finished: '), chalk.green(String(run.stats.requestsFinished ?? 0)));
80
+ console.log(chalk.dim(' Failed: '), chalk.red(String(run.stats.requestsFailed ?? 0)));
81
+ }
82
+ if (run.options) {
83
+ console.log();
84
+ console.log(chalk.bold('Resources:'));
85
+ if (run.options.memoryMbytes) {
86
+ console.log(chalk.dim(' Memory: '), `${String(run.options.memoryMbytes)} MB`);
87
+ }
88
+ if (run.options.timeoutSecs) {
89
+ console.log(chalk.dim(' Timeout: '), `${String(run.options.timeoutSecs)}s`);
90
+ }
91
+ }
92
+ console.log();
93
+ };
94
+ if (options.watch === true) {
95
+ const intervalSecs = options.interval ?? '5';
96
+ const intervalMs = parseInt(intervalSecs, 10) * 1000;
97
+ console.log(chalk.dim(`Watching run status (every ${intervalSecs}s, Ctrl+C to exit)...\n`));
98
+ const check = async () => {
99
+ const run = await fetchStatus();
100
+ if (!run) {
101
+ process.exit(1);
102
+ }
103
+ displayStatus(run);
104
+ // Stop watching if run is finished
105
+ if (['SUCCEEDED', 'FAILED', 'ABORTED', 'TIMED-OUT'].includes(run.status)) {
106
+ console.log(chalk.dim('Run finished. Stopping watch.'));
107
+ process.exit(run.status === 'SUCCEEDED' ? 0 : 1);
108
+ }
109
+ };
110
+ await check();
111
+ setInterval(() => void check(), intervalMs);
112
+ }
113
+ else {
114
+ const spinner = ora('Fetching run status...').start();
115
+ const run = await fetchStatus();
116
+ spinner.stop();
117
+ if (!run) {
118
+ process.exit(1);
119
+ }
120
+ displayStatus(run);
121
+ }
122
+ });
123
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,14 +2,14 @@
2
2
  * Crawlee Cloud CLI
3
3
  *
4
4
  * Commands:
5
+ * init Create new Actor from template
5
6
  * run Run Actor locally
7
+ * dev Run Actor with hot reload
6
8
  * push Push Actor to platform
7
9
  * call <actor> Call a remote Actor
8
10
  * logs <run-id> View run logs
11
+ * status <run-id> Check run status
9
12
  * login Authenticate with platform
10
- *
11
- * Note: To create a new Actor, use `apify create` (official Apify CLI)
12
- * for 100% compatibility with both Apify Cloud and Crawlee Cloud.
13
13
  */
14
14
  import { Command } from 'commander';
15
15
  export declare const program: Command;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,OAAO,SAAgB,CAAC;AAcrC,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,OAAO,SAAgB,CAAC;AAiBrC,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -2,31 +2,37 @@
2
2
  * Crawlee Cloud CLI
3
3
  *
4
4
  * Commands:
5
+ * init Create new Actor from template
5
6
  * run Run Actor locally
7
+ * dev Run Actor with hot reload
6
8
  * push Push Actor to platform
7
9
  * call <actor> Call a remote Actor
8
10
  * logs <run-id> View run logs
11
+ * status <run-id> Check run status
9
12
  * login Authenticate with platform
10
- *
11
- * Note: To create a new Actor, use `apify create` (official Apify CLI)
12
- * for 100% compatibility with both Apify Cloud and Crawlee Cloud.
13
13
  */
14
14
  import { Command } from 'commander';
15
+ import { initCommand } from './commands/init.js';
15
16
  import { runCommand } from './commands/run.js';
17
+ import { devCommand } from './commands/dev.js';
16
18
  import { pushCommand } from './commands/push.js';
17
19
  import { callCommand } from './commands/call.js';
18
20
  import { logsCommand } from './commands/logs.js';
21
+ import { statusCommand } from './commands/status.js';
19
22
  import { loginCommand } from './commands/login.js';
20
23
  export const program = new Command();
21
24
  program
22
25
  .name('crawlee-cloud')
23
- .description('CLI for Crawlee Cloud - run and deploy Actors (use `apify create` to create new Actors)')
24
- .version('0.1.0');
26
+ .description('CLI for Crawlee Cloud - create, run, and deploy Actors')
27
+ .version('0.2.0');
25
28
  // Register commands
29
+ program.addCommand(initCommand);
26
30
  program.addCommand(runCommand);
31
+ program.addCommand(devCommand);
27
32
  program.addCommand(pushCommand);
28
33
  program.addCommand(callCommand);
29
34
  program.addCommand(logsCommand);
35
+ program.addCommand(statusCommand);
30
36
  program.addCommand(loginCommand);
31
37
  export { program as cli };
32
38
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAErC,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,yFAAyF,CAAC;KACtG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAEjC,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,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,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAErC,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,wDAAwD,CAAC;KACrE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAEjC,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crawlee-cloud/cli",
3
- "version": "0.1.5",
3
+ "version": "0.2.0",
4
4
  "description": "CLI for Crawlee Cloud - run and deploy Actors",
5
5
  "type": "module",
6
6
  "bin": {
@@ -23,14 +23,18 @@
23
23
  ],
24
24
  "license": "MIT",
25
25
  "dependencies": {
26
- "commander": "^12.1.0",
26
+ "adm-zip": "^0.5.16",
27
27
  "chalk": "^5.3.0",
28
- "ora": "^8.1.1",
29
- "inquirer": "^12.1.0",
28
+ "chokidar": "^5.0.0",
29
+ "commander": "^12.1.0",
30
+ "dotenv": "^16.4.7",
30
31
  "fs-extra": "^11.2.0",
31
- "dotenv": "^16.4.7"
32
+ "inquirer": "^12.1.0",
33
+ "ora": "^8.1.1",
34
+ "table": "^6.9.0"
32
35
  },
33
36
  "devDependencies": {
37
+ "@types/adm-zip": "^0.5.7",
34
38
  "@types/fs-extra": "^11.0.4",
35
39
  "@types/node": "^20.10.0",
36
40
  "tsx": "^4.7.0",
@@ -51,4 +55,4 @@
51
55
  "url": "https://github.com/crawlee-cloud/crawlee-cloud/issues"
52
56
  },
53
57
  "homepage": "https://crawlee.cloud"
54
- }
58
+ }