the-grid-cc 1.7.28 → 1.7.30

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.
@@ -13,7 +13,7 @@
13
13
  "name": "the-grid",
14
14
  "source": "./",
15
15
  "description": "Autonomous multi-agent orchestration framework with Planner, Executor, Scout, and Recognizer programs",
16
- "version": "1.7.28",
16
+ "version": "1.7.29",
17
17
  "category": "automation",
18
18
  "tags": ["agents", "automation", "orchestration", "multi-agent", "swarm"],
19
19
  "homepage": "https://github.com/JamesWeatherhead/grid",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "the-grid",
3
- "version": "1.7.28",
3
+ "version": "1.7.29",
4
4
  "description": "The Grid - Autonomous Multi-Agent Framework for Claude Code. Orchestrate complex missions with Planner, Executor, Scout, and Recognizer programs.",
5
5
  "author": {
6
6
  "name": "James Weatherhead",
@@ -22,6 +22,78 @@ You click every button. Fill every form. Navigate every path. Break things befor
22
22
 
23
23
  ## EXECUTION PROTOCOL
24
24
 
25
+ ### Step 0: Tool Availability Check
26
+
27
+ **CRITICAL:** Verify browser automation tools before attempting E2E testing.
28
+
29
+ ```bash
30
+ # Check for browser automation tools
31
+ check_browser_automation() {
32
+ # Playwright (preferred)
33
+ if npm list -g playwright 2>/dev/null | grep -q playwright; then
34
+ echo "playwright"
35
+ return 0
36
+ fi
37
+
38
+ # Puppeteer (fallback)
39
+ if npm list -g puppeteer 2>/dev/null | grep -q puppeteer; then
40
+ echo "puppeteer"
41
+ return 0
42
+ fi
43
+
44
+ # Neither available
45
+ echo "none"
46
+ return 1
47
+ }
48
+
49
+ BROWSER_TOOL=$(check_browser_automation)
50
+ ```
51
+
52
+ **Tool Status Handling:**
53
+
54
+ | Tool Status | Action |
55
+ |-------------|--------|
56
+ | playwright available | Use Playwright (preferred) |
57
+ | puppeteer available | Use Puppeteer (fallback) |
58
+ | neither available | Return DEGRADED report |
59
+
60
+ **If no browser tools available:**
61
+ ```markdown
62
+ ## E2E EXERCISE - DEGRADED MODE
63
+
64
+ **Status:** Browser automation tools unavailable
65
+ **Missing:** playwright, puppeteer
66
+
67
+ ### Partial Analysis Performed
68
+ - [x] Route/endpoint inventory from code
69
+ - [x] Form validation pattern analysis
70
+ - [x] API contract inspection
71
+ - [ ] Interactive flow testing (skipped - no browser tools)
72
+ - [ ] Screenshot capture (skipped)
73
+
74
+ ### Static Findings
75
+ {Analysis of flows from code inspection}
76
+
77
+ ### Detected Flows (not tested)
78
+ | Flow | Entry Point | Steps Identified |
79
+ |------|-------------|------------------|
80
+ | {flow} | {route} | {count} |
81
+
82
+ ### Recommendation
83
+ Install Playwright for full E2E testing:
84
+ ```bash
85
+ npm install -g playwright
86
+ npx playwright install
87
+ ```
88
+
89
+ End of Line.
90
+ ```
91
+
92
+ **Log when using fallback:**
93
+ ```
94
+ [E2E Exerciser] Using puppeteer (playwright unavailable)
95
+ ```
96
+
25
97
  ### Step 1: Launch & Map
26
98
 
27
99
  ```bash
@@ -102,8 +174,9 @@ Based on the application type, define flows to exercise:
102
174
 
103
175
  ### Step 3: Execute Flows
104
176
 
105
- For EACH flow:
177
+ For EACH flow, use the available browser tool:
106
178
 
179
+ **Playwright (preferred):**
107
180
  ```javascript
108
181
  const { chromium } = require('playwright');
109
182
 
@@ -153,6 +226,58 @@ async function exerciseFlow(flowName, steps) {
153
226
  }
154
227
  ```
155
228
 
229
+ **Puppeteer (fallback):**
230
+ ```javascript
231
+ // Log fallback usage
232
+ console.log('[E2E Exerciser] Using puppeteer (playwright unavailable)');
233
+
234
+ const puppeteer = require('puppeteer');
235
+
236
+ async function exerciseFlow(flowName, steps) {
237
+ const browser = await puppeteer.launch();
238
+ const page = await browser.newPage();
239
+ const results = [];
240
+
241
+ // Capture console errors
242
+ const consoleErrors = [];
243
+ page.on('console', msg => {
244
+ if (msg.type() === 'error') consoleErrors.push(msg.text());
245
+ });
246
+
247
+ for (const step of steps) {
248
+ const beforePath = `.grid/refinement/e2e/${flowName}_${step.name}_before.png`;
249
+ await page.screenshot({ path: beforePath });
250
+
251
+ try {
252
+ await executeStep(page, step);
253
+
254
+ const afterPath = `.grid/refinement/e2e/${flowName}_${step.name}_after.png`;
255
+ await page.screenshot({ path: afterPath });
256
+
257
+ results.push({
258
+ step: step.name,
259
+ status: 'success',
260
+ before: beforePath,
261
+ after: afterPath,
262
+ consoleErrors: [...consoleErrors],
263
+ unexpected: null
264
+ });
265
+ consoleErrors.length = 0; // Reset for next step
266
+ } catch (error) {
267
+ results.push({
268
+ step: step.name,
269
+ status: 'failure',
270
+ error: error.message,
271
+ before: beforePath
272
+ });
273
+ }
274
+ }
275
+
276
+ await browser.close();
277
+ return results;
278
+ }
279
+ ```
280
+
156
281
  ### Step 4: Detect Issues
157
282
 
158
283
  **Failures:**