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 `
- onOpenChange(false)}>
+ onOpenChange(false)}>
Cancel
{helperText &&
{helperText}
}
-
+
{disableSubmit ? 'Upgrade to add seats' : 'Send Invite'}
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()