hookcatch 0.1.0 → 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
@@ -1,6 +1,6 @@
1
1
  # HookCatch CLI
2
2
 
3
- Official CLI tool for creating localhost tunnels with HookCatch.
3
+ Official CLI tool for webhook testing and localhost tunneling with HookCatch.
4
4
 
5
5
  ## Installation
6
6
 
@@ -13,156 +13,307 @@ npm install -g hookcatch
13
13
  hookcatch tunnel 3000
14
14
  ```
15
15
 
16
- ## Usage
16
+ ## Quick Start
17
17
 
18
- ### 1. Login
18
+ ```bash
19
+ # 1. Login with email/password
20
+ hookcatch login
21
+ # Enter your email and password
22
+
23
+ # 2. (Optional) Generate long-lived API token for automation
24
+ hookcatch token generate
25
+ export HOOKCATCH_API_KEY="hc_live_..."
26
+
27
+ # 3. Create a webhook bin
28
+ hookcatch bin create --name "Test Stripe"
29
+ # Returns: https://hookcatch.dev/b/abc123xyz
30
+
31
+ # 4. View captured requests
32
+ hookcatch bin requests abc123xyz
33
+
34
+ # 5. Tunnel your localhost
35
+ hookcatch tunnel 3000
36
+ ```
37
+
38
+ ## Commands
39
+
40
+ ### Authentication
19
41
 
20
- First, generate an API token from your [HookCatch Dashboard](https://hookcatch.dev/dashboard), then:
42
+ #### `login`
43
+ Authenticate with your HookCatch account (email/password or API token).
21
44
 
22
45
  ```bash
23
- npx hookcatch login
24
- # Enter your API token when prompted
46
+ # Login with email/password (interactive)
47
+ hookcatch login
48
+
49
+ # Or login with API token directly
50
+ hookcatch login --token hc_live_xxx
25
51
  ```
26
52
 
27
- ### 2. Start Tunnel (Inbound - Receive webhooks)
53
+ **For automation (OpenClaw, CI/CD):**
54
+ ```bash
55
+ # Generate a long-lived API token
56
+ hookcatch token generate
57
+
58
+ # Then use it via environment variable
59
+ export HOOKCATCH_API_KEY="hc_live_..."
60
+
61
+ # Or login directly
62
+ hookcatch login --token hc_live_...
63
+ ```
28
64
 
29
- Forward external webhooks to your localhost:
65
+ #### `logout`
66
+ Remove stored credentials.
30
67
 
31
68
  ```bash
32
- npx hookcatch tunnel <port>
69
+ hookcatch logout
70
+ ```
33
71
 
34
- # Example: Forward to localhost:3000
35
- npx hookcatch tunnel 3000
72
+ ### Bin Management (NEW!)
73
+
74
+ #### `bin create`
75
+ Create a new webhook bin.
76
+
77
+ ```bash
78
+ hookcatch bin create [options]
36
79
 
37
- # With custom options
38
- npx hookcatch tunnel 8080 --password secret123
80
+ # Options:
81
+ # --name <name> Bin name
82
+ # --private Create private bin (PLUS+ tier)
83
+ # --password <password> Password for private bin
84
+
85
+ # Examples:
86
+ hookcatch bin create --name "Stripe Webhooks"
87
+ hookcatch bin create --private --password secret123
39
88
  ```
40
89
 
41
- Your tunnel URL will be displayed. Send webhooks to this URL and they'll be forwarded to your localhost.
90
+ #### `bin list`
91
+ List all your bins.
42
92
 
43
- ### 3. Start Tunnel with Capture (Outbound - Capture localhost requests)
93
+ ```bash
94
+ hookcatch bin list
95
+ ```
44
96
 
45
- Capture outbound requests from your localhost application to a bin:
97
+ #### `bin requests <binId>`
98
+ Get captured requests for a bin.
46
99
 
47
100
  ```bash
48
- npx hookcatch tunnel <port> --capture <binId>
101
+ hookcatch bin requests <binId> [options]
49
102
 
50
- # Example: Capture requests to bin abc123
51
- npx hookcatch tunnel 3000 --capture abc123
103
+ # Options:
104
+ # --limit <number> Number of requests (default: 50)
105
+ # --format <type> Output format: json|table (default: table)
106
+ # --method <method> Filter by HTTP method (GET, POST, etc.)
52
107
 
53
- # Custom proxy port (default: 8081)
54
- npx hookcatch tunnel 3000 --capture abc123 --proxy-port 9000
108
+ # Examples:
109
+ hookcatch bin requests abc123xyz --limit 10
110
+ hookcatch bin requests abc123xyz --format json --method POST
55
111
  ```
56
112
 
57
- Configure your application to use the proxy:
113
+ #### `bin delete <binId>`
114
+ Delete a bin.
58
115
 
59
116
  ```bash
60
- # Set HTTP_PROXY environment variable
61
- HTTP_PROXY=http://localhost:8081 node app.js
117
+ hookcatch bin delete <binId> --yes
118
+ ```
119
+
120
+ ### API Token Management (NEW!)
62
121
 
63
- # Or in your code (Node.js example):
64
- const axios = require('axios');
65
- axios.get('https://api.example.com', {
66
- proxy: {
67
- host: 'localhost',
68
- port: 8081
69
- }
70
- });
122
+ #### `token generate`
123
+ Generate a long-lived API token for automation.
124
+
125
+ ```bash
126
+ hookcatch token generate
127
+ # Store the token securely - it won't be shown again!
128
+ # Use it with: export HOOKCATCH_API_KEY="hc_live_..."
71
129
  ```
72
130
 
73
- All requests through the proxy will be captured in your bin and visible in the dashboard.
131
+ #### `token status`
132
+ Check your API token status.
74
133
 
75
- ### 4. Bidirectional Mode (Both directions)
134
+ ```bash
135
+ hookcatch token status
136
+ ```
76
137
 
77
- Run both inbound and outbound capture simultaneously:
138
+ #### `token revoke`
139
+ Revoke your API token.
78
140
 
79
141
  ```bash
80
- npx hookcatch tunnel 3000 --capture my-bin-id
142
+ hookcatch token revoke --yes
81
143
  ```
82
144
 
83
- - **INBOUND**: External webhooks → tunnel URL → your localhost:3000
84
- - **OUTBOUND**: Your app → proxy (localhost:8081) → captured in bin
145
+ ### Localhost Tunneling
85
146
 
86
- ### 5. List Active Tunnels
147
+ #### `tunnel <port>`
148
+ Create a tunnel to your localhost.
87
149
 
88
150
  ```bash
89
- npx hookcatch list
151
+ hookcatch tunnel <port> [options]
152
+
153
+ # Options:
154
+ # --password <password> Password-protect tunnel (PRO+ tier)
155
+ # --subdomain <name> Custom subdomain (ENTERPRISE tier)
156
+ # --capture <binId> Capture outbound requests to bin
157
+ # --proxy-port <port> Local proxy port (default: 8081)
158
+
159
+ # Examples:
160
+ hookcatch tunnel 3000
161
+ hookcatch tunnel 8080 --password secret123
162
+ hookcatch tunnel 3000 --capture abc123
90
163
  ```
91
164
 
92
- ### 6. Stop Tunnel
165
+ #### `list`
166
+ Show all your active tunnels.
93
167
 
94
168
  ```bash
95
- npx hookcatch stop <tunnelId>
169
+ hookcatch list
96
170
  ```
97
171
 
98
- ## Commands
172
+ #### `stop <tunnelId>`
173
+ Stop a specific tunnel.
99
174
 
100
- ### `login`
101
- Authenticate with your HookCatch API token.
175
+ ```bash
176
+ hookcatch stop abc123xyz
177
+ ```
178
+
179
+ ## Usage Examples
180
+
181
+ ### Test Stripe Webhooks
102
182
 
103
183
  ```bash
104
- npx hookcatch login
184
+ # Create a bin
185
+ hookcatch bin create --name "Stripe Test"
186
+ # Use the URL in Stripe dashboard
187
+
188
+ # View captured webhooks
189
+ hookcatch bin requests abc123xyz --format json
105
190
  ```
106
191
 
107
- ### `tunnel <port>`
108
- Create a tunnel to your localhost.
192
+ ### Expose Local API
193
+
194
+ ```bash
195
+ # Start your local server
196
+ # python -m http.server 8000 &
197
+
198
+ # Expose it via tunnel
199
+ hookcatch tunnel 8000
200
+ # Public URL: https://hookcatch.dev/tunnel/xyz789
201
+ ```
109
202
 
110
- **Options:**
111
- - `--password <password>` - Password-protect the tunnel (PRO+ tier)
112
- - `--subdomain <name>` - Custom subdomain (ENTERPRISE tier)
203
+ ### Capture Outbound Requests
113
204
 
114
- **Example:**
115
205
  ```bash
116
- npx hookcatch tunnel 3000
117
- # Tunnel established
118
- # → http://localhost:3001/tunnel/abc123xyz
119
- #
120
- # Forwarding to http://localhost:3000
121
- # Press Ctrl+C to stop
206
+ # Start tunnel with capture
207
+ hookcatch tunnel 3000 --capture my-bin-id
208
+
209
+ # Configure your app to use proxy
210
+ HTTP_PROXY=http://localhost:8081 node app.js
122
211
  ```
123
212
 
124
- ### `list`
125
- Show all your active tunnels.
213
+ ### Automation with API Tokens
126
214
 
127
215
  ```bash
128
- npx hookcatch list
216
+ # Generate token
217
+ hookcatch token generate
218
+ export HOOKCATCH_API_KEY="hc_live_..."
219
+
220
+ # Use in scripts
221
+ hookcatch bin create --name "CI Test" --format json | jq -r '.url'
129
222
  ```
130
223
 
131
- ### `stop <tunnelId>`
132
- Stop a specific tunnel.
224
+ ## OpenClaw Integration
225
+
226
+ HookCatch has a dedicated OpenClaw skill for AI-powered webhook testing:
133
227
 
134
228
  ```bash
135
- npx hookcatch stop abc123xyz
229
+ # Install via ClawHub
230
+ clawhub install hookcatch
136
231
  ```
137
232
 
138
- ### `logout`
139
- Remove stored API token.
233
+ See [skills/hookcatch/README.md](../../skills/hookcatch/README.md) for details.
234
+
235
+ ## Environment Variables
236
+
237
+ Configure the CLI using environment variables:
140
238
 
141
239
  ```bash
142
- npx hookcatch logout
240
+ # API Token (for authentication)
241
+ export HOOKCATCH_TOKEN="hc_live_..."
242
+
243
+ # API URL (defaults to https://api.hookcatch.dev)
244
+ export HOOKCATCH_API_URL="https://api.hookcatch.dev"
245
+
246
+ # For local development
247
+ export HOOKCATCH_API_URL="http://localhost:3002"
143
248
  ```
144
249
 
250
+ **Priority order:**
251
+ 1. Environment variables (`HOOKCATCH_TOKEN`, `HOOKCATCH_API_URL`)
252
+ 2. Config file (`~/.config/hookcatch/config.json`)
253
+ 3. Default values (production API)
254
+
145
255
  ## Features
146
256
 
257
+ ### Webhook Bins
258
+ - ✅ Create unlimited bins (tier-dependent)
259
+ - ✅ Capture HTTP requests in real-time
260
+ - ✅ Private bins with password protection (PLUS+)
261
+ - ✅ JSON output for automation
262
+ - ✅ Request filtering by method
263
+
264
+ ### Localhost Tunnels
147
265
  - ✅ Zero-config tunnel creation
148
266
  - ✅ Real-time request forwarding
149
- - ✅ Automatic reconnection on network issues (PRO+)
150
- - ✅ Password protection (PRO+ tier)
151
- - ✅ Custom subdomains (ENTERPRISE tier)
152
- - ✅ Usage tracking and limits
153
- - Cross-platform (Windows, Mac, Linux)
267
+ - ✅ Automatic reconnection
268
+ - ✅ Password protection (PRO+)
269
+ - ✅ Custom subdomains (ENTERPRISE)
270
+
271
+ ### API Tokens
272
+ - ✅ Long-lived tokens for automation
273
+ - ✅ Secure bcrypt hashing
274
+ - ✅ Easy revocation
275
+ - ✅ No expiration (until regenerated)
154
276
 
155
277
  ## Tiers
156
278
 
157
- - **FREE**: No tunneling (upgrade required)
158
- - **PLUS**: 1 tunnel, 1-hour sessions, 1GB/month
159
- - **PRO**: 5 tunnels, unlimited time, 10GB/month
160
- - **ENTERPRISE**: 20 tunnels, custom subdomains, 100GB/month
279
+ ### FREE
280
+ - 3 bins
281
+ - 1,000 requests/month
282
+ - 24h retention
283
+ - 1 tunnel (5 min/session, 3 sessions/day)
284
+ - Public bins only
285
+
286
+ ### PLUS ($10/month)
287
+ - 25 bins
288
+ - 25,000 requests/month
289
+ - 14-day retention
290
+ - 2 tunnels (1h/session, unlimited)
291
+ - Private bins with passwords
292
+
293
+ ### PRO ($25/month)
294
+ - Unlimited bins
295
+ - 150,000 requests/month
296
+ - 90-day retention
297
+ - 5 tunnels (unlimited time)
298
+ - Team features
299
+
300
+ ### ENTERPRISE (Custom)
301
+ - Unlimited bins
302
+ - 750,000 requests/month
303
+ - 180-day retention
304
+ - 20 tunnels (unlimited time)
305
+ - Custom subdomains
306
+ - SSO & SLA
307
+
308
+ ## Environment Variables
309
+
310
+ - `HOOKCATCH_API_KEY` - API token for authentication
311
+ - `HOOKCATCH_API_URL` - Override API URL (default: https://api.hookcatch.dev)
161
312
 
162
313
  ## Support
163
314
 
164
- - Documentation: https://hookcatch.dev/docs
165
- - Issues: https://github.com/yourusername/hookcatch-cli/issues
315
+ - Documentation: https://docs.hookcatch.dev
316
+ - GitHub: https://github.com/hookcatch/cli
166
317
  - Email: support@hookcatch.dev
167
318
 
168
319
  ## License
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const binCommand: Command;
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/commands/bin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,UAAU,SAKU,CAAC"}
@@ -0,0 +1,188 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { api } from '../lib/api.js';
5
+ import { hasApiToken } from '../lib/config.js';
6
+ import Table from 'cli-table3';
7
+ export const binCommand = new Command('bin')
8
+ .description('Manage webhook bins')
9
+ .addCommand(createBinCommand())
10
+ .addCommand(listBinsCommand())
11
+ .addCommand(requestsCommand())
12
+ .addCommand(deleteBinCommand());
13
+ function createBinCommand() {
14
+ return new Command('create')
15
+ .description('Create a new webhook bin')
16
+ .option('--name <name>', 'Bin name')
17
+ .option('--private', 'Create a private bin (PLUS+ tier)')
18
+ .option('--password <password>', 'Password for private bin')
19
+ .action(async (options) => {
20
+ if (!hasApiToken()) {
21
+ console.log(chalk.red('✗ Not authenticated. Run "hookcatch login" first.\n'));
22
+ process.exit(1);
23
+ }
24
+ const spinner = ora('Creating bin...').start();
25
+ try {
26
+ const bin = await api.createBin({
27
+ name: options.name,
28
+ isPrivate: options.private,
29
+ password: options.password,
30
+ });
31
+ spinner.succeed('Bin created');
32
+ console.log(chalk.green.bold('\n✓ Webhook bin created'));
33
+ console.log(chalk.cyan(`\nBin ID: ${bin.binId}`));
34
+ console.log(chalk.cyan(`Webhook URL: ${bin.url || `https://hookcatch.dev/b/${bin.binId}`}`));
35
+ console.log(chalk.cyan(`View URL: https://hookcatch.dev/bin/${bin.binId}/view`));
36
+ if (options.name) {
37
+ console.log(chalk.gray(`Name: ${options.name}`));
38
+ }
39
+ if (options.private) {
40
+ console.log(chalk.yellow('🔒 Private bin (password required to view)'));
41
+ }
42
+ console.log();
43
+ }
44
+ catch (error) {
45
+ spinner.fail('Failed to create bin');
46
+ console.log(chalk.red(`✗ ${error.response?.data?.error || error.message}\n`));
47
+ process.exit(1);
48
+ }
49
+ });
50
+ }
51
+ function listBinsCommand() {
52
+ return new Command('list')
53
+ .description('List your webhook bins')
54
+ .action(async () => {
55
+ if (!hasApiToken()) {
56
+ console.log(chalk.red('✗ Not authenticated. Run "hookcatch login" first.\n'));
57
+ process.exit(1);
58
+ }
59
+ const spinner = ora('Fetching bins...').start();
60
+ try {
61
+ const bins = await api.listBins();
62
+ spinner.stop();
63
+ if (bins.length === 0) {
64
+ console.log(chalk.yellow('\nNo bins found. Create one with:'));
65
+ console.log(chalk.cyan(' hookcatch bin create\n'));
66
+ return;
67
+ }
68
+ console.log(chalk.bold(`\n📦 Your bins (${bins.length}):\n`));
69
+ const table = new Table({
70
+ head: ['Bin ID', 'Name', 'Status', 'Requests', 'Created'],
71
+ style: {
72
+ head: ['cyan'],
73
+ },
74
+ });
75
+ for (const bin of bins) {
76
+ const status = bin.isPrivate ? '🔒 Private' : '🌐 Public';
77
+ const requestCount = bin.requestCount || 0;
78
+ const created = new Date(bin.createdAt).toLocaleDateString();
79
+ table.push([
80
+ bin.binId,
81
+ bin.name || '-',
82
+ status,
83
+ requestCount.toString(),
84
+ created,
85
+ ]);
86
+ }
87
+ console.log(table.toString());
88
+ console.log();
89
+ }
90
+ catch (error) {
91
+ spinner.fail('Failed to fetch bins');
92
+ console.log(chalk.red(`✗ ${error.response?.data?.error || error.message}\n`));
93
+ process.exit(1);
94
+ }
95
+ });
96
+ }
97
+ function requestsCommand() {
98
+ return new Command('requests')
99
+ .description('Get requests for a bin')
100
+ .argument('<binId>', 'Bin ID')
101
+ .option('--limit <number>', 'Number of requests to fetch', '50')
102
+ .option('--format <format>', 'Output format (json|table)', 'table')
103
+ .option('--method <method>', 'Filter by HTTP method')
104
+ .action(async (binId, options) => {
105
+ if (!hasApiToken()) {
106
+ console.log(chalk.red('✗ Not authenticated. Run "hookcatch login" first.\n'));
107
+ process.exit(1);
108
+ }
109
+ const spinner = ora('Fetching requests...').start();
110
+ try {
111
+ const data = await api.getBinRequests(binId, {
112
+ limit: parseInt(options.limit, 10),
113
+ });
114
+ spinner.stop();
115
+ let requests = data.requests || [];
116
+ // Filter by method if specified
117
+ if (options.method) {
118
+ const method = options.method.toUpperCase();
119
+ requests = requests.filter((r) => r.method === method);
120
+ }
121
+ if (requests.length === 0) {
122
+ console.log(chalk.yellow('\n No requests found for this bin.\n'));
123
+ return;
124
+ }
125
+ if (options.format === 'json') {
126
+ console.log(JSON.stringify(requests, null, 2));
127
+ return;
128
+ }
129
+ // Table format
130
+ console.log(chalk.bold(`\n📥 Requests (${requests.length}):\n`));
131
+ const table = new Table({
132
+ head: ['ID', 'Method', 'Path', 'IP', 'Time'],
133
+ style: {
134
+ head: ['cyan'],
135
+ },
136
+ });
137
+ for (const req of requests) {
138
+ const method = req.method || 'GET';
139
+ const path = req.path || '/';
140
+ const ip = req.ip || '-';
141
+ const time = new Date(req.timestamp).toLocaleTimeString();
142
+ table.push([
143
+ req.id.substring(0, 8),
144
+ method,
145
+ path.substring(0, 30),
146
+ ip,
147
+ time,
148
+ ]);
149
+ }
150
+ console.log(table.toString());
151
+ console.log(chalk.gray(`\nView full details: https://hookcatch.dev/bin/${binId}/view\n`));
152
+ }
153
+ catch (error) {
154
+ spinner.fail('Failed to fetch requests');
155
+ console.log(chalk.red(`✗ ${error.response?.data?.error || error.message}\n`));
156
+ process.exit(1);
157
+ }
158
+ });
159
+ }
160
+ function deleteBinCommand() {
161
+ return new Command('delete')
162
+ .description('Delete a webhook bin')
163
+ .argument('<binId>', 'Bin ID to delete')
164
+ .option('--yes', 'Skip confirmation')
165
+ .action(async (binId, options) => {
166
+ if (!hasApiToken()) {
167
+ console.log(chalk.red('✗ Not authenticated. Run "hookcatch login" first.\n'));
168
+ process.exit(1);
169
+ }
170
+ if (!options.yes) {
171
+ console.log(chalk.yellow(`⚠️ Are you sure you want to delete bin ${binId}?`));
172
+ console.log(chalk.gray('Run with --yes to skip this confirmation.\n'));
173
+ process.exit(0);
174
+ }
175
+ const spinner = ora('Deleting bin...').start();
176
+ try {
177
+ await api.deleteBin(binId);
178
+ spinner.succeed(`Bin ${binId} deleted`);
179
+ console.log();
180
+ }
181
+ catch (error) {
182
+ spinner.fail('Failed to delete bin');
183
+ console.log(chalk.red(`✗ ${error.response?.data?.error || error.message}\n`));
184
+ process.exit(1);
185
+ }
186
+ });
187
+ }
188
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/commands/bin.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,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,YAAY,SA8ErB,CAAC"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,YAAY,SAarB,CAAC"}
@@ -2,82 +2,113 @@ import { Command } from 'commander';
2
2
  import chalk from 'chalk';
3
3
  import ora from 'ora';
4
4
  import * as readline from 'readline';
5
- import { setApiToken, getApiUrl, setApiUrl } from '../lib/config.js';
5
+ import { setApiToken, getApiUrl } from '../lib/config.js';
6
6
  import axios from 'axios';
7
7
  export const loginCommand = new Command('login')
8
- .description('Authenticate with your HookCatch API token')
9
- .action(async () => {
8
+ .description('Authenticate with your HookCatch account')
9
+ .option('--token <token>', 'Login with an API token directly')
10
+ .action(async (options) => {
10
11
  console.log(chalk.blue.bold('\n🔐 HookCatch Login\n'));
11
- console.log('Get your API token from: ' + chalk.cyan(`${getApiUrl()}/dashboard\n`));
12
+ // If token provided via flag, use it directly
13
+ if (options.token) {
14
+ return await loginWithToken(options.token);
15
+ }
16
+ // Otherwise, prompt for email/password
17
+ await loginWithCredentials();
18
+ });
19
+ async function loginWithToken(token) {
20
+ token = token.trim();
21
+ if (!token.startsWith('hc_') && !token.startsWith('eyJ')) {
22
+ console.log(chalk.red('\n✗ Invalid token format'));
23
+ console.log(chalk.gray('API tokens start with "hc_", JWT tokens start with "eyJ"\n'));
24
+ process.exit(1);
25
+ }
26
+ const spinner = ora('Validating token...').start();
27
+ try {
28
+ // Test token by calling /api/user/token (requires auth)
29
+ const response = await axios.get(`${getApiUrl()}/api/user/token`, {
30
+ headers: { Authorization: `Bearer ${token}` },
31
+ timeout: 10000,
32
+ });
33
+ spinner.succeed('Token validated');
34
+ setApiToken(token);
35
+ console.log(chalk.green('\n✓ Successfully authenticated!'));
36
+ console.log(chalk.gray('Token saved to ~/.hookcatch/config.json\n'));
37
+ }
38
+ catch (error) {
39
+ spinner.fail('Token validation failed');
40
+ if (error.response?.status === 401) {
41
+ console.log(chalk.red('\n✗ Invalid token\n'));
42
+ }
43
+ else if (error.code === 'ECONNREFUSED') {
44
+ console.log(chalk.red('\n✗ Cannot connect to HookCatch API'));
45
+ console.log(chalk.gray(` Make sure the API is running at ${getApiUrl()}\n`));
46
+ }
47
+ else {
48
+ console.log(chalk.red('\n✗ ' + error.message + '\n'));
49
+ }
50
+ process.exit(1);
51
+ }
52
+ }
53
+ async function loginWithCredentials() {
12
54
  const rl = readline.createInterface({
13
55
  input: process.stdin,
14
56
  output: process.stdout,
15
57
  });
16
- rl.question('Enter your API token: ', async (token) => {
17
- token = token.trim();
18
- if (!token) {
19
- console.log(chalk.red('\n✗ API token is required'));
20
- rl.close();
21
- process.exit(1);
22
- }
23
- if (!token.startsWith('hc_')) {
24
- console.log(chalk.red('\n✗ Invalid API token format (should start with "hc_")'));
58
+ const prompt = (question) => {
59
+ return new Promise((resolve) => {
60
+ rl.question(question, (answer) => {
61
+ resolve(answer.trim());
62
+ });
63
+ });
64
+ };
65
+ try {
66
+ const email = await prompt('Email: ');
67
+ const password = await prompt('Password: ');
68
+ if (!email || !password) {
69
+ console.log(chalk.red('\n✗ Email and password are required\n'));
25
70
  rl.close();
26
71
  process.exit(1);
27
72
  }
28
- // Validate token with server
29
- const spinner = ora('Validating token...').start();
73
+ const spinner = ora('Authenticating...').start();
30
74
  try {
31
- const apiUrl = getApiUrl();
32
- const fullUrl = `${apiUrl}/api/user/api-token`;
33
- const requestToken = (url) => axios.get(url, {
34
- headers: {
35
- Authorization: `Bearer ${token}`,
36
- },
37
- timeout: 10000,
38
- });
39
- let response;
40
- try {
41
- response = await requestToken(fullUrl);
42
- }
43
- catch (error) {
44
- if (error.response?.status === 404 && apiUrl === 'http://localhost:3001') {
45
- const fallbackUrl = 'http://localhost:3002';
46
- spinner.text = 'Validating token (retrying on port 3002)...';
47
- response = await requestToken(`${fallbackUrl}/api/user/api-token`);
48
- setApiUrl(fallbackUrl);
49
- }
50
- else {
51
- throw error;
52
- }
75
+ const response = await axios.post(`${getApiUrl()}/api/auth/login`, { email, password }, { timeout: 10000 });
76
+ const { token, user } = response.data;
77
+ if (!token) {
78
+ throw new Error('No token returned from server');
53
79
  }
54
- if (response.status === 200 && response.data.hasToken) {
55
- spinner.succeed('Token validated');
56
- setApiToken(token);
57
- console.log(chalk.green('\n✓ Successfully authenticated!'));
58
- console.log(chalk.gray('API token saved to ~/.hookcatch/config.json\n'));
80
+ spinner.succeed('Authenticated');
81
+ setApiToken(token);
82
+ console.log(chalk.green('\n✓ Successfully logged in!'));
83
+ console.log(chalk.gray(` Welcome, ${user.email}`));
84
+ console.log(chalk.gray(' Token saved to ~/.hookcatch/config.json'));
85
+ if (!user.emailVerified) {
86
+ console.log(chalk.yellow('\n⚠️ Your email is not verified.'));
87
+ console.log(chalk.gray(' Some features may be limited until you verify your email.\n'));
59
88
  }
60
89
  else {
61
- spinner.fail('Token validation failed');
62
- console.log(chalk.red('\n✗ Invalid API token'));
63
- process.exit(1);
90
+ console.log(chalk.gray('\n💡 Tip: Generate a long-lived API token with:'));
91
+ console.log(chalk.cyan(' hookcatch token generate\n'));
64
92
  }
65
93
  }
66
94
  catch (error) {
67
- spinner.fail('Token validation failed');
95
+ spinner.fail('Authentication failed');
68
96
  if (error.response?.status === 401) {
69
- console.log(chalk.red('\n✗ Invalid API token - authentication failed'));
97
+ console.log(chalk.red('\n✗ Invalid email or password\n'));
70
98
  }
71
99
  else if (error.code === 'ECONNREFUSED') {
72
100
  console.log(chalk.red('\n✗ Cannot connect to HookCatch API'));
73
- console.log(chalk.gray(` Make sure the API is running at ${getApiUrl()}`));
101
+ console.log(chalk.gray(` Make sure the API is running at ${getApiUrl()}\n`));
74
102
  }
75
103
  else {
76
- console.log(chalk.red('\n✗ Failed to validate token: ' + error.message));
104
+ console.log(chalk.red('\n✗ ' + (error.response?.data?.error || error.message) + '\n'));
77
105
  }
106
+ rl.close();
78
107
  process.exit(1);
79
108
  }
109
+ }
110
+ finally {
80
111
  rl.close();
81
- });
82
- });
112
+ }
113
+ }
83
114
  //# sourceMappingURL=login.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,iBAAiB,EAAE,kCAAkC,CAAC;KAC7D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAEvD,8CAA8C;IAC9C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,MAAM,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,uCAAuC;IACvC,MAAM,oBAAoB,EAAE,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEL,KAAK,UAAU,cAAc,CAAC,KAAa;IACzC,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAErB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC,CAAC;QACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEnD,IAAI,CAAC;QACH,wDAAwD;QACxD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,iBAAiB,EAAE;YAChE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;YAC7C,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACnC,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACxC,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB;IACjC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,CAAC,QAAgB,EAAmB,EAAE;QACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC/B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAE5C,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;YAChE,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEjD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,GAAG,SAAS,EAAE,iBAAiB,EAC/B,EAAE,KAAK,EAAE,QAAQ,EAAE,EACnB,EAAE,OAAO,EAAE,KAAK,EAAE,CACnB,CAAC;YAEF,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;YAEtC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YAED,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACjC,WAAW,CAAC,KAAK,CAAC,CAAC;YAEnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;YAEtE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC,CAAC;gBAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC,CAAC;YAC5F,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC,CAAC;gBAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACtC,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACzF,CAAC;YACD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const tokenCommand: Command;
3
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/commands/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,YAAY,SAIK,CAAC"}
@@ -0,0 +1,102 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { api } from '../lib/api.js';
5
+ import { hasApiToken, getApiToken } from '../lib/config.js';
6
+ export const tokenCommand = new Command('token')
7
+ .description('Manage API tokens')
8
+ .addCommand(generateCommand())
9
+ .addCommand(statusCommand())
10
+ .addCommand(revokeCommand());
11
+ function generateCommand() {
12
+ return new Command('generate')
13
+ .description('Generate a new API token for CLI authentication')
14
+ .action(async () => {
15
+ if (!hasApiToken()) {
16
+ console.log(chalk.red('✗ Not authenticated. Run "hookcatch login" first.\n'));
17
+ process.exit(1);
18
+ }
19
+ const spinner = ora('Generating API token...').start();
20
+ try {
21
+ // Call backend to generate token
22
+ const response = await api.client.post('/api/user/token', {}, { headers: { Authorization: `Bearer ${getApiToken()}` } });
23
+ const { token, createdAt } = response.data;
24
+ spinner.succeed('API token generated');
25
+ console.log(chalk.green.bold('\n✓ New API token generated'));
26
+ console.log(chalk.yellow('\n⚠️ Store this token securely. It will not be shown again.\n'));
27
+ console.log(chalk.cyan('Token:'));
28
+ console.log(chalk.white.bold(token));
29
+ console.log(chalk.gray(`\nCreated: ${new Date(createdAt).toLocaleString()}`));
30
+ console.log(chalk.gray('Expires: Never (until regenerated or revoked)'));
31
+ // Ask if they want to save it as the default token
32
+ console.log(chalk.yellow('\n💡 To use this token in CLI, save it with:'));
33
+ console.log(chalk.cyan(` export HOOKCATCH_TOKEN="${token}"`));
34
+ console.log(chalk.gray('\nOr save the current JWT token by default.\n'));
35
+ }
36
+ catch (error) {
37
+ spinner.fail('Failed to generate token');
38
+ console.log(chalk.red(`✗ ${error.response?.data?.error || error.message}\n`));
39
+ process.exit(1);
40
+ }
41
+ });
42
+ }
43
+ function statusCommand() {
44
+ return new Command('status')
45
+ .description('Check API token status')
46
+ .action(async () => {
47
+ if (!hasApiToken()) {
48
+ console.log(chalk.red('✗ Not authenticated. Run "hookcatch login" first.\n'));
49
+ process.exit(1);
50
+ }
51
+ const spinner = ora('Checking token status...').start();
52
+ try {
53
+ const response = await api.client.get('/api/user/token', { headers: { Authorization: `Bearer ${getApiToken()}` } });
54
+ const data = response.data;
55
+ spinner.stop();
56
+ if (data.hasToken) {
57
+ console.log(chalk.green('\n✓ API token exists'));
58
+ console.log(chalk.gray(`Created: ${new Date(data.createdAt).toLocaleString()}`));
59
+ console.log(chalk.gray('\nNote: Token value is hidden for security.'));
60
+ console.log(chalk.gray('Use "hookcatch token generate" to create a new token.\n'));
61
+ }
62
+ else {
63
+ console.log(chalk.yellow('\n⚠️ No API token generated yet'));
64
+ console.log(chalk.gray('Generate one with: hookcatch token generate\n'));
65
+ }
66
+ }
67
+ catch (error) {
68
+ spinner.fail('Failed to check status');
69
+ console.log(chalk.red(`✗ ${error.response?.data?.error || error.message}\n`));
70
+ process.exit(1);
71
+ }
72
+ });
73
+ }
74
+ function revokeCommand() {
75
+ return new Command('revoke')
76
+ .description('Revoke your API token')
77
+ .option('--yes', 'Skip confirmation')
78
+ .action(async (options) => {
79
+ if (!hasApiToken()) {
80
+ console.log(chalk.red('✗ Not authenticated. Run "hookcatch login" first.\n'));
81
+ process.exit(1);
82
+ }
83
+ if (!options.yes) {
84
+ console.log(chalk.yellow('⚠️ Are you sure you want to revoke your API token?'));
85
+ console.log(chalk.gray('This will invalidate any scripts or integrations using it.'));
86
+ console.log(chalk.gray('Run with --yes to skip this confirmation.\n'));
87
+ process.exit(0);
88
+ }
89
+ const spinner = ora('Revoking API token...').start();
90
+ try {
91
+ await api.client.delete('/api/user/token', { headers: { Authorization: `Bearer ${getApiToken()}` } });
92
+ spinner.succeed('API token revoked');
93
+ console.log(chalk.green('\n✓ API token revoked successfully\n'));
94
+ }
95
+ catch (error) {
96
+ spinner.fail('Failed to revoke token');
97
+ console.log(chalk.red(`✗ ${error.response?.data?.error || error.message}\n`));
98
+ process.exit(1);
99
+ }
100
+ });
101
+ }
102
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/commands/token.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -6,6 +6,8 @@ import { tunnelCommand } from './commands/tunnel.js';
6
6
  import { listCommand } from './commands/list.js';
7
7
  import { stopCommand } from './commands/stop.js';
8
8
  import { logoutCommand } from './commands/logout.js';
9
+ import { binCommand } from './commands/bin.js';
10
+ import { tokenCommand } from './commands/token.js';
9
11
  const program = new Command();
10
12
  program
11
13
  .name('hookcatch')
@@ -21,6 +23,8 @@ console.log(chalk.cyan(`
21
23
  `));
22
24
  // Add commands
23
25
  program.addCommand(loginCommand);
26
+ program.addCommand(binCommand);
27
+ program.addCommand(tokenCommand);
24
28
  program.addCommand(tunnelCommand);
25
29
  program.addCommand(listCommand);
26
30
  program.addCommand(stopCommand);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,wDAAwD,CAAC;KACrE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,mBAAmB;AACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;;;;;;CAMtB,CAAC,CAAC,CAAC;AAEJ,eAAe;AACf,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,kBAAkB;AAClB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,mCAAmC;AACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,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,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,wDAAwD,CAAC;KACrE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,mBAAmB;AACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;;;;;;CAMtB,CAAC,CAAC,CAAC;AAEJ,eAAe;AACf,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,kBAAkB;AAClB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,mCAAmC;AACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
package/dist/lib/api.d.ts CHANGED
@@ -1,5 +1,6 @@
1
+ import { AxiosInstance } from 'axios';
1
2
  declare class HookCatchAPI {
2
- private client;
3
+ client: AxiosInstance;
3
4
  constructor();
4
5
  private getHeaders;
5
6
  createTunnel(localPort: number, options?: {
@@ -17,6 +18,18 @@ declare class HookCatchAPI {
17
18
  headers: Record<string, string>;
18
19
  body?: string;
19
20
  }): Promise<any>;
21
+ createBin(options?: {
22
+ name?: string;
23
+ isPrivate?: boolean;
24
+ password?: string;
25
+ }): Promise<any>;
26
+ listBins(): Promise<any>;
27
+ getBin(binId: string): Promise<any>;
28
+ getBinRequests(binId: string, options?: {
29
+ limit?: number;
30
+ before?: number;
31
+ }): Promise<any>;
32
+ deleteBin(binId: string): Promise<any>;
20
33
  }
21
34
  export declare const api: HookCatchAPI;
22
35
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAGA,cAAM,YAAY;IAChB,OAAO,CAAC,MAAM,CAAgB;;IAS9B,OAAO,CAAC,UAAU;IAUZ,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAanF,WAAW;IAOX,SAAS,CAAC,QAAQ,EAAE,MAAM;IAO1B,cAAc;IAOd,YAAY,CAAC,QAAQ,EAAE,MAAM;IAO7B,aAAa;IAOb,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;CA6DrH;AAED,eAAO,MAAM,GAAG,cAAqB,CAAC"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG7C,cAAM,YAAY;IACT,MAAM,EAAE,aAAa,CAAC;;IAS7B,OAAO,CAAC,UAAU;IAUZ,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAanF,WAAW;IAOX,SAAS,CAAC,QAAQ,EAAE,MAAM;IAO1B,cAAc;IAOd,YAAY,CAAC,QAAQ,EAAE,MAAM;IAO7B,aAAa;IAOb,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;IA+D9G,SAAS,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAa7E,QAAQ;IAOR,MAAM,CAAC,KAAK,EAAE,MAAM;IAOpB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAW3E,SAAS,CAAC,KAAK,EAAE,MAAM;CAM9B;AAED,eAAO,MAAM,GAAG,cAAqB,CAAC"}
package/dist/lib/api.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import axios from 'axios';
2
2
  import { getApiToken, getApiUrl } from './config.js';
3
3
  class HookCatchAPI {
4
- client;
4
+ client; // Make public for token commands
5
5
  constructor() {
6
6
  this.client = axios.create({
7
7
  baseURL: getApiUrl(),
@@ -109,6 +109,44 @@ class HookCatchAPI {
109
109
  });
110
110
  return response.data;
111
111
  }
112
+ // Bin management methods
113
+ async createBin(options) {
114
+ const response = await this.client.post('/api/bins', {
115
+ name: options?.name,
116
+ isPrivate: options?.isPrivate,
117
+ accessPassword: options?.password,
118
+ }, { headers: this.getHeaders() });
119
+ return response.data.bin;
120
+ }
121
+ async listBins() {
122
+ const response = await this.client.get('/api/bins', {
123
+ headers: this.getHeaders(),
124
+ });
125
+ return response.data.bins;
126
+ }
127
+ async getBin(binId) {
128
+ const response = await this.client.get(`/api/bins/${binId}`, {
129
+ headers: this.getHeaders(),
130
+ });
131
+ return response.data.bin;
132
+ }
133
+ async getBinRequests(binId, options) {
134
+ const params = new URLSearchParams();
135
+ if (options?.limit)
136
+ params.append('limit', options.limit.toString());
137
+ if (options?.before)
138
+ params.append('before', options.before.toString());
139
+ const response = await this.client.get(`/api/bins/${binId}/requests?${params}`, {
140
+ headers: this.getHeaders(),
141
+ });
142
+ return response.data;
143
+ }
144
+ async deleteBin(binId) {
145
+ const response = await this.client.delete(`/api/bins/${binId}`, {
146
+ headers: this.getHeaders(),
147
+ });
148
+ return response.data;
149
+ }
112
150
  }
113
151
  export const api = new HookCatchAPI();
114
152
  //# sourceMappingURL=api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,YAAY;IACR,MAAM,CAAgB;IAE9B;QACE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,SAAS,EAAE;YACpB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAEO,UAAU;QAChB,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QACD,OAAO;YACL,aAAa,EAAE,UAAU,KAAK,EAAE;SACjC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAiB,EAAE,OAAmD;QACvF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,cAAc,EACd;YACE,SAAS;YACT,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,QAAQ,EAAE,OAAO,EAAE,QAAQ;SAC5B,EACD,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,CAC/B,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE;YACrD,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,QAAQ,EAAE,EAAE;YACjE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE;YACjE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,QAAQ,EAAE,EAAE;YACpE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE;YACjE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,IAAqF;QAClH,0CAA0C;QAC1C,MAAM,YAAY,GAA2B,EAAE,CAAC;QAChD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YACnC,8FAA8F;YAC9F,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtG,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAE/F,oCAAoC;QACpC,IAAI,WAAW,GAAQ,EAAE,CAAC;QAC1B,IAAI,gBAAgB,GAAG,kBAAkB,CAAC;QAE1C,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,mBAAmB,CAAC,CAAC;QAE3E,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAClC,IAAI,mBAAmB,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACrD,IAAI,CAAC;oBACH,gEAAgE;oBAChE,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACpC,gBAAgB,GAAG,kBAAkB,CAAC;oBACtC,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,WAAW,CAAC,CAAC;gBAC7D,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,iCAAiC;oBACjC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;oBACxB,gBAAgB,GAAG,YAAY,CAAC;oBAChC,OAAO,CAAC,GAAG,CAAC,uDAAuD,EAAE,CAAC,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,6BAA6B;gBAC7B,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;gBACxB,gBAAgB,GAAG,mBAAmB,IAAI,YAAY,CAAC;YACzD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,0CAA0C;YAC1C,WAAW,GAAG,EAAE,CAAC;YACjB,gBAAgB,GAAG,kBAAkB,CAAC;QACxC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,WAAW,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,gBAAgB,CAAC,CAAC;QAEvE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,EACxB,WAAW,EACX;YACE,OAAO,EAAE;gBACP,GAAG,YAAY;gBACf,cAAc,EAAE,gBAAgB;gBAChC,YAAY,EAAE,yBAAyB;aACxC;SACF,CACF,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAcA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,WAAW,IAAI,MAAM,GAAG,SAAS,CAEhD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,WAAW,IAAI,OAAO,CAErC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAcA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,WAAW,IAAI,MAAM,GAAG,SAAS,CAGhD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,WAAW,IAAI,OAAO,CAErC"}
@@ -2,25 +2,27 @@ import Conf from 'conf';
2
2
  const config = new Conf({
3
3
  projectName: 'hookcatch',
4
4
  defaults: {
5
- apiUrl: 'http://localhost:3002', // Default for development (backend port)
5
+ apiUrl: process.env.HOOKCATCH_API_URL || 'https://api.hookcatch.dev', // Production default
6
6
  },
7
7
  });
8
8
  export function setApiToken(token) {
9
9
  config.set('apiToken', token);
10
10
  }
11
11
  export function getApiToken() {
12
- return config.get('apiToken');
12
+ // Check environment variable first, then config file
13
+ return process.env.HOOKCATCH_TOKEN || config.get('apiToken');
13
14
  }
14
15
  export function clearApiToken() {
15
16
  config.delete('apiToken');
16
17
  }
17
18
  export function getApiUrl() {
18
- return config.get('apiUrl') || 'http://localhost:3002';
19
+ // Priority: env var > config file > production default
20
+ return process.env.HOOKCATCH_API_URL || config.get('apiUrl') || 'https://api.hookcatch.dev';
19
21
  }
20
22
  export function setApiUrl(url) {
21
23
  config.set('apiUrl', url);
22
24
  }
23
25
  export function hasApiToken() {
24
- return !!config.get('apiToken');
26
+ return !!(process.env.HOOKCATCH_TOKEN || config.get('apiToken'));
25
27
  }
26
28
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAOxB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAS;IAC9B,WAAW,EAAE,WAAW;IACxB,QAAQ,EAAE;QACR,MAAM,EAAE,uBAAuB,EAAE,yCAAyC;KAC3E;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,uBAAuB,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAOxB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAS;IAC9B,WAAW,EAAE,WAAW;IACxB,QAAQ,EAAE;QACR,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,2BAA2B,EAAE,qBAAqB;KAC5F;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,qDAAqD;IACrD,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,uDAAuD;IACvD,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,2BAA2B,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;AACnE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hookcatch",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "CLI tool for creating localhost tunnels and testing webhooks with HookCatch",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -52,6 +52,7 @@
52
52
  "dependencies": {
53
53
  "axios": "^1.6.7",
54
54
  "chalk": "^5.3.0",
55
+ "cli-table3": "^0.6.3",
55
56
  "commander": "^12.0.0",
56
57
  "conf": "^12.0.0",
57
58
  "ora": "^8.0.1",