demo: replace social feed with spreadsheet app, update overlay and docs#94
demo: replace social feed with spreadsheet app, update overlay and docs#94
Conversation
- Replace social feed demo with spreadsheet grid demo app - Update browser overlay cursor pointer and constants - Refine website demo recording scripts and constants - Update CLI README, SKILL.md docs, and browser testing rules - Update infer-agent provider detection
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
commit: |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 5 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit f8b5480. Configure here.
| "args": [ | ||
| "-y", | ||
| "expect-cli@latest", | ||
| "/Users/aidenybai/Developer/expect/apps/cli/dist/index.js", |
There was a problem hiding this comment.
Hardcoded local filesystem path in MCP config
High Severity
The .mcp.json config was changed from npx -y expect-cli@latest mcp to a hardcoded absolute path /Users/aidenybai/Developer/expect/apps/cli/dist/index.js. This is a developer-specific local filesystem path that will not work for any other contributor or in CI. This appears to be a local development override that was accidentally committed.
Reviewed by Cursor Bugbot for commit f8b5480. Configure here.
| if (editingCell) { | ||
| commitEdit(); | ||
| const { col, row } = parseSelected(); | ||
| const nextCell = `${store.colLetter(col)}${row + 1}`; |
There was a problem hiding this comment.
Enter key doesn't clamp row within grid bounds
Medium Severity
When pressing Enter to commit an edit, the next cell is computed as row + 1 without clamping to store.ROW_COUNT. The ArrowDown handler correctly uses Math.min(row + 1, store.ROW_COUNT), but both Enter key handlers (in handleKeyDown and in the cell's inline onKeyDown) skip this bounds check. On the last row, this selects a cell outside the rendered grid.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit f8b5480. Configure here.
|
|
||
| await hoverAndClick(page, copyButtons.nth(1)); | ||
| await waitUntilOffset(page, scenarioStartMs, copySkillStep.endOffsetMs); | ||
|
|
There was a problem hiding this comment.
Recording script references UI elements absent from demo
Medium Severity
recordInvoiceAppScenario locates elements like "New Invoice" link and "Create Invoice" submit button, and the step definitions describe "InvoiceApp" flows. But the demo app at DEMO_TARGET_URL (localhost:5173) is now a spreadsheet grid with none of these elements. Running this recording script against the current demo will fail immediately.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit f8b5480. Configure here.
| posts: data.posts.map((p) => | ||
| p.id === postId | ||
| ? { | ||
| ...p, |
There was a problem hiding this comment.
Unused store methods and type never referenced
Low Severity
store.getSelectionRange and store.deleteRow are newly added methods that are never called anywhere in the codebase. Similarly, the SpreadsheetState interface exported from types.ts is never imported or referenced. These are dead code that add maintenance burden.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit f8b5480. Configure here.
| }, | ||
| }; | ||
| }); | ||
| const demoEvents: eventWithTime[] = recordedDemoEvents.map((event) => event); |
There was a problem hiding this comment.
Identity map produces a redundant shallow copy
Low Severity
recordedDemoEvents.map((event) => event) is a no-op identity mapping. The previous code transformed URL hostnames in the events, but that logic was removed, leaving behind a pointless .map that just copies the array without changes.
Reviewed by Cursor Bugbot for commit f8b5480. Configure here.
There was a problem hiding this comment.
4 issues found across 31 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="apps/website/scripts/record-demo.ts">
<violation number="1" location="apps/website/scripts/record-demo.ts:117">
P1: This recording script references UI elements (`"New Invoice"` link, `"Create Invoice"` button, delete buttons) that don't exist in the new spreadsheet demo app. The demo at `DEMO_TARGET_URL` (localhost:5173) now renders a spreadsheet grid — running this script will fail immediately on this locator.</violation>
</file>
<file name=".mcp.json">
<violation number="1" location=".mcp.json:4">
P1: The MCP server command uses a hardcoded absolute local path, which makes this config non-portable and likely broken for every other environment.</violation>
</file>
<file name=".cursor/rules/browser-testing.mdc">
<violation number="1" location=".cursor/rules/browser-testing.mdc:61">
P2: The new session-persistence guidance conflicts with the existing "unlock when done" rule by telling users not to unlock across turns. Keep tabs open across turns, but release `browser_lock` at turn end and reacquire next turn.</violation>
</file>
<file name="apps/demo/src/components/spreadsheet-grid.tsx">
<violation number="1" location="apps/demo/src/components/spreadsheet-grid.tsx:77">
P2: Clamp Enter navigation to the last row to avoid selecting cells outside the grid.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review, or fix all with cubic.
| await page.mouse.move(500, 400, { steps: 8 }); | ||
| await waitUntilOffset(page, scenarioStartMs, setupStep.endOffsetMs); | ||
|
|
||
| const newInvoiceButton = page.locator("a", { hasText: "New Invoice" }); |
There was a problem hiding this comment.
P1: This recording script references UI elements ("New Invoice" link, "Create Invoice" button, delete buttons) that don't exist in the new spreadsheet demo app. The demo at DEMO_TARGET_URL (localhost:5173) now renders a spreadsheet grid — running this script will fail immediately on this locator.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At apps/website/scripts/record-demo.ts, line 117:
<comment>This recording script references UI elements (`"New Invoice"` link, `"Create Invoice"` button, delete buttons) that don't exist in the new spreadsheet demo app. The demo at `DEMO_TARGET_URL` (localhost:5173) now renders a spreadsheet grid — running this script will fail immediately on this locator.</comment>
<file context>
@@ -102,61 +101,48 @@ const hoverAndClick = async (page: Page, locator: Locator): Promise<void> => {
+ await page.mouse.move(500, 400, { steps: 8 });
+ await waitUntilOffset(page, scenarioStartMs, setupStep.endOffsetMs);
+
+ const newInvoiceButton = page.locator("a", { hasText: "New Invoice" });
+ await hoverAndClick(page, newInvoiceButton);
+ await page.waitForTimeout(NAVIGATE_SETTLE_MS);
</file context>
| "mcpServers": { | ||
| "expect": { | ||
| "command": "npx", | ||
| "command": "node", |
There was a problem hiding this comment.
P1: The MCP server command uses a hardcoded absolute local path, which makes this config non-portable and likely broken for every other environment.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .mcp.json, line 4:
<comment>The MCP server command uses a hardcoded absolute local path, which makes this config non-portable and likely broken for every other environment.</comment>
<file context>
@@ -1,10 +1,9 @@
"mcpServers": {
"expect": {
- "command": "npx",
+ "command": "node",
"args": [
- "-y",
</file context>
| 1. Do NOT call `close` or `browser_lock unlock` if you plan to revisit the page | ||
| 2. On the next turn, `browser_tabs list` will show the existing tab — reuse it | ||
| 3. Only close/unlock when ALL verification is complete and no more iterations are expected |
There was a problem hiding this comment.
P2: The new session-persistence guidance conflicts with the existing "unlock when done" rule by telling users not to unlock across turns. Keep tabs open across turns, but release browser_lock at turn end and reacquire next turn.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .cursor/rules/browser-testing.mdc, line 61:
<comment>The new session-persistence guidance conflicts with the existing "unlock when done" rule by telling users not to unlock across turns. Keep tabs open across turns, but release `browser_lock` at turn end and reacquire next turn.</comment>
<file context>
@@ -53,6 +54,14 @@ Reference the performance skill at `.agents/skills/performance/SKILL.md` and the
+
+When you expect to re-verify after code fixes, keep the browser session alive between turns:
+
+1. Do NOT call `close` or `browser_lock unlock` if you plan to revisit the page
+2. On the next turn, `browser_tabs list` will show the existing tab — reuse it
+3. Only close/unlock when ALL verification is complete and no more iterations are expected
</file context>
| 1. Do NOT call `close` or `browser_lock unlock` if you plan to revisit the page | |
| 2. On the next turn, `browser_tabs list` will show the existing tab — reuse it | |
| 3. Only close/unlock when ALL verification is complete and no more iterations are expected | |
| 1. Do NOT call `close` if you plan to revisit the page | |
| 2. On the next turn, `browser_tabs list` will show the existing tab — reuse it | |
| 3. Still call `browser_lock` with action `unlock` at the end of each turn, then re-lock the tab on the next turn |
| if (editingCell) { | ||
| commitEdit(); | ||
| const { col, row } = parseSelected(); | ||
| const nextCell = `${store.colLetter(col)}${row + 1}`; |
There was a problem hiding this comment.
P2: Clamp Enter navigation to the last row to avoid selecting cells outside the grid.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At apps/demo/src/components/spreadsheet-grid.tsx, line 77:
<comment>Clamp Enter navigation to the last row to avoid selecting cells outside the grid.</comment>
<file context>
@@ -0,0 +1,296 @@
+ if (editingCell) {
+ commitEdit();
+ const { col, row } = parseSelected();
+ const nextCell = `${store.colLetter(col)}${row + 1}`;
+ store.selectCell(nextCell);
+ onUpdate();
</file context>
Replace social feed demo with spreadsheet grid app (cell selection, editing, formula evaluation, keyboard nav). Update browser overlay cursor colors and add mousemove tracking. Add subagent usage and session persistence guidance to skills and rules.


Summary
spreadsheet-grid.tsxanddashboard.tsx, removed old social feed components/pages)Test plan
Note
Medium Risk
Medium risk due to a full demo app swap (new state model, keyboard/mouse interactions, formula evaluation) plus changes to the injected overlay behavior and website demo recorder, which could introduce UI regressions or brittle scripted recordings.
Overview
Replaces the
apps/demosocial-feed demo (login/feed/profile/post flows) with a spreadsheet-style dashboard: newSpreadsheetGridUI with cell selection, inline editing, range drag highlight, keyboard navigation, and basic=SUM(A1:B2)formula evaluation backed by a new cell-based store/seed data.Updates demo presentation and tooling: new header/layout styling, refreshed theme tokens and error boundary styling, and website demo replay/recording retargeted to a localhost “InvoiceApp” scenario (new step definitions, trace status, and scripted interactions).
Tweaks the injected browser overlay visuals/behavior (larger cursor/tooltip, updated positioning/flip constants, mousemove-driven cursor updates) and updates Expect docs/rules (subagent-first testing, session reuse) along with minor cleanup in
infer-agentand a local-path.mcp.jsoncommand change.Reviewed by Cursor Bugbot for commit f8b5480. Bugbot is set up for automated code reviews on this repo. Configure here.
Summary by cubic
Replaced the social feed demo with a spreadsheet app that supports selection, range drag, inline edit, and basic formulas, and refreshed the overlay/recording UX to improve demo clarity.
New Features
spreadsheet-grid.tsx,dashboard.tsx) with selection, drag-to-select, Enter/Tab navigation, Delete to clear, and formula evaluation for=SUM(A#:B#).Refactors
COL_COUNT,ROW_COUNT, andcolLetter; added raw vs computed cell values.http://localhost:5173, updated scripted steps/trace, and refined recorder timing.SKILL.md, and browser testing rules with subagent and session reuse guidance..mcp.jsonnow launchesexpectvianode; minor cleanup ininfer-agent; small CSS/Title tweaks.Written for commit f8b5480. Summary will update on new commits.