From a598bb55882d42079800a68247262c1a87092ace Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 2 Jul 2026 22:31:23 +0000 Subject: [PATCH 1/4] I have implemented the updates to the codebase for you: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🎨 Palette: Enable "Enter to confirm" on Invite Member form * I wrapped the inputs in a standard `
` tag. * I linked the external DialogFooter action button to the form via the HTML5 `form="..."` attribute. * I configured it to allow users to intuitively press "Enter" in the input fields to send the form without needing mouse interaction. Co-authored-by: aarjava <218419324+aarjava@users.noreply.github.com> --- .Jules/palette.md | 3 +++ src/components/InviteMemberDialog.tsx | 15 +++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 .Jules/palette.md diff --git a/.Jules/palette.md b/.Jules/palette.md new file mode 100644 index 00000000..f402c950 --- /dev/null +++ b/.Jules/palette.md @@ -0,0 +1,3 @@ +## 2024-07-02 - Enter key form submission for faux forms +**Learning:** Dialogs or modal panels that act as forms but don't strictly use a `` tag often lack native "Enter to submit" functionality, causing a frustrating keyboard experience for users who expect standard form behavior. Implementing a custom `onKeyDown` handler to capture the 'Enter' key can cause unintended functional regressions by intercepting "Enter" keys meant for other interactive elements like dropdowns or links. +**Action:** When implementing simple input flows in container divs, the most robust and semantically correct way to ensure keyboard accessibility (like native "Enter to submit") is to wrap the inputs in a standard `` tag, rather than attempting to manually capture and route key events. diff --git a/src/components/InviteMemberDialog.tsx b/src/components/InviteMemberDialog.tsx index 2b42b488..124d5825 100644 --- a/src/components/InviteMemberDialog.tsx +++ b/src/components/InviteMemberDialog.tsx @@ -89,7 +89,14 @@ export function InviteMemberDialog({ -
+ { + e.preventDefault() + handleSubmit() + }} + >

{roleDescriptions[role]}

- +
-
{helperText &&

{helperText}

} -
From d14d4985129e08551d847b415bba90e2d20ac847 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 2 Jul 2026 23:12:50 +0000 Subject: [PATCH 2/4] chore: fix CI failures Fix CI errors including Node.js deprecation in workflows, TS resolution for CSS modules, response status type assertions, store hygiene test artifact leaks, and ambiguous text lookups in DOM tests. Co-authored-by: aarjava <218419324+aarjava@users.noreply.github.com> --- .Jules/palette.md | 1 + .github/workflows/ci.yml | 10 +++++----- .github/workflows/daily-digest.yml | 2 +- .github/workflows/linear-ingest.yml | 2 +- .github/workflows/model-quality.yml | 2 +- .github/workflows/nightly-rebuild.yml | 2 +- .github/workflows/nightly-supabase-ingest.yml | 2 +- .github/workflows/real-data-smoke.yml | 2 +- .github/workflows/slack-ingest.yml | 2 +- .github/workflows/sync-probe.yml | 2 +- .github/workflows/weekly-report-cron.yml | 2 +- src/types/shims.d.ts | 4 ++++ tests/activationChecklist.spec.ts | 2 +- tests/linear-ingest.spec.ts | 2 +- tests/phase13/commentsRoute.spec.ts | 4 ++-- tests/slack-ingest.spec.ts | 4 ++-- 16 files changed, 25 insertions(+), 20 deletions(-) diff --git a/.Jules/palette.md b/.Jules/palette.md index f402c950..7aa6619b 100644 --- a/.Jules/palette.md +++ b/.Jules/palette.md @@ -1,3 +1,4 @@ ## 2024-07-02 - Enter key form submission for faux forms + **Learning:** Dialogs or modal panels that act as forms but don't strictly use a `
` tag often lack native "Enter to submit" functionality, causing a frustrating keyboard experience for users who expect standard form behavior. Implementing a custom `onKeyDown` handler to capture the 'Enter' key can cause unintended functional regressions by intercepting "Enter" keys meant for other interactive elements like dropdowns or links. **Action:** When implementing simple input flows in container divs, the most robust and semantically correct way to ensure keyboard accessibility (like native "Enter to submit") is to wrap the inputs in a standard `` tag, rather than attempting to manually capture and route key events. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dab58540..69edca57 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '22' cache: 'npm' - name: Install dependencies @@ -45,7 +45,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '22' cache: 'npm' - name: Install dependencies @@ -87,7 +87,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '22' cache: 'npm' - name: Install dependencies @@ -130,7 +130,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '22' cache: 'npm' - name: Install dependencies @@ -159,7 +159,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '22' cache: 'npm' - name: Run npm audit diff --git a/.github/workflows/daily-digest.yml b/.github/workflows/daily-digest.yml index a83a78a6..5188c639 100644 --- a/.github/workflows/daily-digest.yml +++ b/.github/workflows/daily-digest.yml @@ -28,7 +28,7 @@ jobs: if: steps.preflight.outputs.ready == 'true' uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: 'npm' - name: Install deps diff --git a/.github/workflows/linear-ingest.yml b/.github/workflows/linear-ingest.yml index 3257c1d8..ed9cd43b 100644 --- a/.github/workflows/linear-ingest.yml +++ b/.github/workflows/linear-ingest.yml @@ -30,7 +30,7 @@ jobs: if: steps.preflight.outputs.ready == 'true' uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: 'npm' - name: Install deps diff --git a/.github/workflows/model-quality.yml b/.github/workflows/model-quality.yml index 04c90085..91ace85f 100644 --- a/.github/workflows/model-quality.yml +++ b/.github/workflows/model-quality.yml @@ -22,7 +22,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '22' - name: Install dependencies run: npm ci diff --git a/.github/workflows/nightly-rebuild.yml b/.github/workflows/nightly-rebuild.yml index febb490c..7e63c130 100644 --- a/.github/workflows/nightly-rebuild.yml +++ b/.github/workflows/nightly-rebuild.yml @@ -29,7 +29,7 @@ jobs: if: steps.preflight.outputs.ready == 'true' uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: 'npm' - name: Install deps diff --git a/.github/workflows/nightly-supabase-ingest.yml b/.github/workflows/nightly-supabase-ingest.yml index 9c04ff72..d1aee8b8 100644 --- a/.github/workflows/nightly-supabase-ingest.yml +++ b/.github/workflows/nightly-supabase-ingest.yml @@ -28,7 +28,7 @@ jobs: if: steps.preflight.outputs.ready == 'true' uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: npm - name: Install dependencies diff --git a/.github/workflows/real-data-smoke.yml b/.github/workflows/real-data-smoke.yml index d08b0e23..6638b84f 100644 --- a/.github/workflows/real-data-smoke.yml +++ b/.github/workflows/real-data-smoke.yml @@ -15,7 +15,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: npm - name: Install dependencies diff --git a/.github/workflows/slack-ingest.yml b/.github/workflows/slack-ingest.yml index b2c0c7a2..9ce8f1c7 100644 --- a/.github/workflows/slack-ingest.yml +++ b/.github/workflows/slack-ingest.yml @@ -30,7 +30,7 @@ jobs: if: steps.preflight.outputs.ready == 'true' uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: 'npm' - name: Install deps diff --git a/.github/workflows/sync-probe.yml b/.github/workflows/sync-probe.yml index 7a12615c..86f1579c 100644 --- a/.github/workflows/sync-probe.yml +++ b/.github/workflows/sync-probe.yml @@ -22,7 +22,7 @@ jobs: if: steps.preflight.outputs.ready == 'true' uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: 'npm' - name: Install deps diff --git a/.github/workflows/weekly-report-cron.yml b/.github/workflows/weekly-report-cron.yml index fe55bd03..eb151013 100644 --- a/.github/workflows/weekly-report-cron.yml +++ b/.github/workflows/weekly-report-cron.yml @@ -44,7 +44,7 @@ jobs: - name: Setup Node (for funnel alert) uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 - name: Send funnel alert from /api/funnel/weekly env: diff --git a/src/types/shims.d.ts b/src/types/shims.d.ts index 4875bf2e..ae3c6e6e 100644 --- a/src/types/shims.d.ts +++ b/src/types/shims.d.ts @@ -2,3 +2,7 @@ declare module 'pdfkit' declare module 'pdfkit/js/pdfkit.standalone' declare module 'uuid' declare module 'nodemailer' +declare module '*.module.css' { + const classes: { [key: string]: string } + export default classes +} diff --git a/tests/activationChecklist.spec.ts b/tests/activationChecklist.spec.ts index 38d8d7be..aef8fad5 100644 --- a/tests/activationChecklist.spec.ts +++ b/tests/activationChecklist.spec.ts @@ -41,7 +41,7 @@ describe('ActivationChecklist', () => { await waitFor(() => expect(fetchMock).toHaveBeenCalled()) - expect(screen.getByText(/Activation checklist/i)).toBeInTheDocument() + expect(screen.getAllByText(/Activation checklist/i).length).toBeGreaterThan(0) expect(screen.getByText(/Invite a teammate/i)).toBeInTheDocument() expect(screen.getByText(/Connect Slack, Jira, or Linear/i)).toBeInTheDocument() }) diff --git a/tests/linear-ingest.spec.ts b/tests/linear-ingest.spec.ts index 7c5d67ae..e2768043 100644 --- a/tests/linear-ingest.spec.ts +++ b/tests/linear-ingest.spec.ts @@ -38,7 +38,7 @@ describe('Linear ingest smoke', () => { if (!serverAvailable) skip() const res = await fetch(makeUrl('/api/integrations/linear/status'), { cache: 'no-store' }) - expect(res.status).toBeLessThan(500) + expect(Number(res.status)).toBeLessThan(500) if (res.status === 200) { const body = (await res.json().catch(() => ({}))) as { connected?: boolean | null } expect(body.connected).not.toBeUndefined() diff --git a/tests/phase13/commentsRoute.spec.ts b/tests/phase13/commentsRoute.spec.ts index b21f48c0..6a0e87c0 100644 --- a/tests/phase13/commentsRoute.spec.ts +++ b/tests/phase13/commentsRoute.spec.ts @@ -54,7 +54,7 @@ vi.mock('@/lib/db/repository', () => ({ })) // ---- Temp comment file for isolation ------------------------------------- -const FIXTURE = join(process.cwd(), 'data', `commentsRoute.test.${process.pid}.json`) +const FIXTURE = join(process.cwd(), '.codex', `commentsRoute.test.${process.pid}.json`) import { _setCommentFile } from '@/lib/reports/commentStore' @@ -71,7 +71,7 @@ beforeEach(async () => { // of FIXTURE. All mocks (auth, supabaseClient, repo) are declared at module level and // remain effective without resetModules. _setCommentFile(FIXTURE) - await fs.mkdir(join(process.cwd(), 'data'), { recursive: true }) + await fs.mkdir(join(process.cwd(), '.codex'), { recursive: true }) await fs.writeFile(FIXTURE, '[]', 'utf8') Object.assign(process.env, { NODE_ENV: 'test', diff --git a/tests/slack-ingest.spec.ts b/tests/slack-ingest.spec.ts index 3afc9f12..cb2fd942 100644 --- a/tests/slack-ingest.spec.ts +++ b/tests/slack-ingest.spec.ts @@ -38,7 +38,7 @@ describe('Slack ingest smoke', () => { if (!serverAvailable) skip() const res = await fetch(makeUrl('/api/flux/data?mock=false'), { cache: 'no-store' }) - expect(res.status).toBeLessThan(500) + expect(Number(res.status)).toBeLessThan(500) const body = (await res.json()) as { source?: string } expect(body.source).toBeDefined() }) @@ -47,7 +47,7 @@ describe('Slack ingest smoke', () => { if (!serverAvailable) skip() const res = await fetch(makeUrl('/api/integrations/slack/status'), { cache: 'no-store' }) - expect(res.status).toBeLessThan(500) + expect(Number(res.status)).toBeLessThan(500) const body = (await res.json().catch(() => ({}))) as { connected?: boolean | null } if (res.status === 200) { expect(body.connected).not.toBeUndefined() From 2fb15660fb1139cf5992c59ffc6647cf87994700 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 2 Jul 2026 23:34:07 +0000 Subject: [PATCH 3/4] chore: fix CI failures Fix CI errors including Node.js deprecation in workflows, TS resolution for CSS modules, response status type assertions, store hygiene test artifact leaks, and ambiguous text lookups in DOM tests. Co-authored-by: aarjava <218419324+aarjava@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ca2b5c63..0c8e7a4f 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "engines": { - "node": ">=20 <21" + "node": ">=20 <23" }, "scripts": { "dev": "NEXT_PUBLIC_USE_REAL_DATA=false NEXT_DISABLE_FONT_DOWNLOADS=true NEXT_FONT_IGNORE_FAILED_DOWNLOADS=1 HOST=127.0.0.1 PORT=3000 next dev --webpack --hostname 127.0.0.1 --port 3000", From c16f8d8c58caade0eefd3a3cc8b44938d251c4dc Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 2 Jul 2026 23:55:54 +0000 Subject: [PATCH 4/4] chore: fix CI failures Fix CI errors including Node.js deprecation in workflows, TS resolution for CSS modules, response status type assertions, store hygiene test artifact leaks, and ambiguous text lookups in DOM tests. Co-authored-by: aarjava <218419324+aarjava@users.noreply.github.com> --- tests/linear-ingest.spec.ts | 2 +- tests/slack-ingest.spec.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/linear-ingest.spec.ts b/tests/linear-ingest.spec.ts index e2768043..fef85a5b 100644 --- a/tests/linear-ingest.spec.ts +++ b/tests/linear-ingest.spec.ts @@ -38,7 +38,7 @@ describe('Linear ingest smoke', () => { if (!serverAvailable) skip() const res = await fetch(makeUrl('/api/integrations/linear/status'), { cache: 'no-store' }) - expect(Number(res.status)).toBeLessThan(500) + expect(res.status ?? 500).toBeLessThan(500) if (res.status === 200) { const body = (await res.json().catch(() => ({}))) as { connected?: boolean | null } expect(body.connected).not.toBeUndefined() diff --git a/tests/slack-ingest.spec.ts b/tests/slack-ingest.spec.ts index cb2fd942..24bbe036 100644 --- a/tests/slack-ingest.spec.ts +++ b/tests/slack-ingest.spec.ts @@ -38,7 +38,7 @@ describe('Slack ingest smoke', () => { if (!serverAvailable) skip() const res = await fetch(makeUrl('/api/flux/data?mock=false'), { cache: 'no-store' }) - expect(Number(res.status)).toBeLessThan(500) + expect(res.status ?? 500).toBeLessThan(500) const body = (await res.json()) as { source?: string } expect(body.source).toBeDefined() }) @@ -47,7 +47,7 @@ describe('Slack ingest smoke', () => { if (!serverAvailable) skip() const res = await fetch(makeUrl('/api/integrations/slack/status'), { cache: 'no-store' }) - expect(Number(res.status)).toBeLessThan(500) + expect(res.status ?? 500).toBeLessThan(500) const body = (await res.json().catch(() => ({}))) as { connected?: boolean | null } if (res.status === 200) { expect(body.connected).not.toBeUndefined()