testblocks-agent 1.0.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/index.js ADDED
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.ensurePlaywright = ensurePlaywright;
38
+ const config_1 = require("./config");
39
+ const client_1 = require("./client");
40
+ const executor_1 = require("./executor");
41
+ const POLL_INTERVAL = 3000; // 3 seconds
42
+ async function ensurePlaywright() {
43
+ const { execSync } = await Promise.resolve().then(() => __importStar(require('child_process')));
44
+ try {
45
+ execSync('npx playwright --version', { stdio: 'ignore' });
46
+ }
47
+ catch {
48
+ console.log('Playwright not found. Installing...');
49
+ execSync('npm install @playwright/test', { stdio: 'inherit' });
50
+ }
51
+ // Check if browser binaries are installed
52
+ try {
53
+ const result = execSync('npx playwright install --dry-run chromium 2>&1', { encoding: 'utf-8' });
54
+ // If dry-run shows browsers need installing, or if the command isn't supported, try launching
55
+ if (result.includes('browser') || result.includes('install')) {
56
+ throw new Error('need install');
57
+ }
58
+ }
59
+ catch {
60
+ // Browser binaries not installed or dry-run not supported — install them
61
+ console.log('Installing Chromium browser (first-time setup, ~130MB)...');
62
+ execSync('npx playwright install chromium', { stdio: 'inherit' });
63
+ console.log('Chromium installed successfully.');
64
+ console.log('');
65
+ }
66
+ }
67
+ async function main() {
68
+ console.log('TestBlocks Agent v1.0.0');
69
+ console.log('');
70
+ // Handle `testblocks-agent config` subcommand
71
+ if ((0, config_1.isConfigCommand)()) {
72
+ (0, config_1.handleConfigCommand)();
73
+ return;
74
+ }
75
+ // Check for help flag
76
+ if (process.argv.includes('--help') || process.argv.includes('-h')) {
77
+ console.log('Usage: testblocks-agent --server <url> --token <token>');
78
+ console.log('');
79
+ console.log('Options:');
80
+ console.log(' --server, -s <url> TestBlocks server URL');
81
+ console.log(' --token, -t <token> Agent token (tbat_...)');
82
+ console.log(' --project, -p <id> Project ID (optional, derived from token)');
83
+ console.log(' --help, -h Show this help');
84
+ console.log('');
85
+ console.log('Subcommands:');
86
+ console.log(' config Save configuration to ~/.testblocks/agent.json');
87
+ console.log('');
88
+ console.log('Environment variables:');
89
+ console.log(' TESTBLOCKS_SERVER Server URL');
90
+ console.log(' TESTBLOCKS_TOKEN Agent token');
91
+ console.log(' TESTBLOCKS_PROJECT Project ID (optional)');
92
+ console.log('');
93
+ console.log('Quick start:');
94
+ console.log(' npx testblocks-agent --server https://api.testblocks.io --token tbat_...');
95
+ return;
96
+ }
97
+ const config = (0, config_1.loadConfig)();
98
+ const client = new client_1.AgentClient(config);
99
+ // Validate token
100
+ console.log(`Connecting to ${config.serverUrl}...`);
101
+ try {
102
+ const validation = await client.validate();
103
+ console.log(`Authenticated. Project: "${validation.projectName}"`);
104
+ }
105
+ catch (err) {
106
+ console.error('Failed to connect:', err instanceof Error ? err.message : err);
107
+ process.exit(1);
108
+ }
109
+ // Ensure Playwright + browser binaries are installed
110
+ await ensurePlaywright();
111
+ console.log('Listening for test jobs... (Ctrl+C to stop)');
112
+ console.log('');
113
+ // Handle graceful shutdown
114
+ let running = true;
115
+ let currentExecution = null;
116
+ const shutdown = () => {
117
+ console.log('\nShutting down...');
118
+ running = false;
119
+ // If executing a job, it will handle its own cleanup
120
+ };
121
+ process.on('SIGINT', shutdown);
122
+ process.on('SIGTERM', shutdown);
123
+ // Main poll loop
124
+ while (running) {
125
+ try {
126
+ const job = await client.poll();
127
+ if (job) {
128
+ console.log(`Received job: ${job.specs.length} test(s)`);
129
+ currentExecution = (0, executor_1.executeJob)(job, client);
130
+ await currentExecution;
131
+ currentExecution = null;
132
+ console.log('Job complete. Listening for more...');
133
+ console.log('');
134
+ }
135
+ }
136
+ catch (err) {
137
+ // Only log non-connection errors to avoid noise during server downtime
138
+ if (err instanceof Error && !err.message.includes('fetch failed') && !err.message.includes('ECONNREFUSED')) {
139
+ console.error('Poll error:', err.message);
140
+ }
141
+ }
142
+ if (running) {
143
+ await new Promise(resolve => setTimeout(resolve, POLL_INTERVAL));
144
+ }
145
+ }
146
+ }
147
+ main().catch((err) => {
148
+ console.error('Fatal error:', err);
149
+ process.exit(1);
150
+ });
151
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "testblocks-agent",
3
+ "version": "1.0.0",
4
+ "description": "TestBlocks local agent — run Playwright tests on your machine",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "testblocks-agent": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "dev": "tsx src/index.ts",
14
+ "build": "tsc",
15
+ "start": "node dist/index.js",
16
+ "test": "vitest run",
17
+ "test:coverage": "vitest run --coverage"
18
+ },
19
+ "keywords": [
20
+ "testblocks",
21
+ "testing",
22
+ "playwright",
23
+ "test-runner",
24
+ "e2e",
25
+ "automation"
26
+ ],
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://github.com/automatewithalex/testblocks.git",
30
+ "directory": "agent"
31
+ },
32
+ "license": "MIT",
33
+ "dependencies": {
34
+ "@playwright/test": "^1.58.2",
35
+ "dotenv": "^17.3.1"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^25.4.0",
39
+ "@vitest/coverage-v8": "^4.0.18",
40
+ "tsx": "^4.21.0",
41
+ "typescript": "^5.9.3",
42
+ "vitest": "^4.0.18"
43
+ }
44
+ }