Skip to content

Conversation

@jennmueng
Copy link
Member

@jennmueng jennmueng commented Nov 11, 2025

Makes the cursor agent integration more discoverable by adding callouts to the seer project settings page. The setup handoff button will set the stopping point to cursor handoff and invalidate + make sure the dropdown state is updated.

Without integration set up:
image
With integration set up but without handoff set or automation is off:
CleanShot 2025-11-12 at 01 30 11@2x
CleanShot 2025-11-12 at 01 30 02@2x
With handoff setup:
image

Followed by #103156

…page integration

- Add reusable CursorIntegrationCta component for prompting users to configure Cursor integration
- Integrate CTA component into Seer project settings page
- Export makeProjectSeerPreferencesQueryKey for cache management
- Add query invalidation on preferences update for better cache consistency
@github-actions github-actions bot added the Scope: Frontend Automatically applied to PRs that change frontend components label Nov 11, 2025
@jennmueng jennmueng marked this pull request as ready for review November 11, 2025 17:05
@jennmueng jennmueng requested a review from a team as a code owner November 11, 2025 17:05
@roaga
Copy link
Member

roaga commented Nov 11, 2025

what does it look like if automation is disabled entirely?

@jennmueng
Copy link
Member Author

what does it look like if automation is disabled entirely?

it doesn't consider that, but good callout because we should make it so if you have the cursor integration setup but automation turned off it stays in the second state and turns automation on when you press the button

@JoshFerge JoshFerge requested a review from a team November 11, 2025 17:43
@jennmueng
Copy link
Member Author

@roaga updated the second state

Comment on lines 51 to 56
const [isDismissed, setIsDismissed] = useState(() => {
if (!dismissible || !dismissKey) {
return false;
}
return localStorage.getItem(dismissKey) === 'true';
});
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you might try useLocalStorageState here to simplify some of this

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cleaned up

@@ -324,6 +325,7 @@ function ProjectSeer({
})}
/>
<ProjectSeerGeneralForm project={project} />
<CursorIntegrationCta project={project} />
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i feel like props dismissKey and dismissible were added but aren't being used

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh yeah this was for using it in the seer drawer too, but moved to using an onboarding step instaed.

Comment on lines 141 to 143
if (!organization) {
return null;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not possible

@codecov
Copy link

codecov bot commented Nov 12, 2025

❌ 4 Tests Failed:

Tests completed Failed Passed Skipped
12551 4 12547 10
View the top 3 failed test(s) by shortest run time
CursorIntegrationCta Dismissible Functionality respects existing dismissal from localStorage
Stack Traces | 0.009s run time
Error: expect(element).toBeEmptyDOMElement()

Received:
  "<div class=\"css-18n6kge-Card e3s9acw0\"><div data-test-id=\"loading-placeholder\" class=\"css-u3xwzj-Placeholder e2q81od0\"></div></div>"
    at Object.toBeEmptyDOMElement (.../events/autofix/cursorIntegrationCta.spec.tsx:512:25)
    at Promise.finally.completed (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:1559:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:1499:10)
    at _callCircusTest (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:1009:40)
    at _runTest (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:949:3)
    at _runTestsForDescribeBlock (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:839:13)
    at _runTestsForDescribeBlock (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:829:11)
    at _runTestsForDescribeBlock (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:829:11)
    at run (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:757:3)
    at runAndTransformResultsToJestFormat (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:1920:21)
    at jestAdapter (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/runner.js:101:19)
    at runTestInternal (.../sentry/node_modules/.pnpm/jest-runner@30.0..../jest-runner/build/testWorker.js:272:16)
    at runTest (.../sentry/node_modules/.pnpm/jest-runner@30.0..../jest-runner/build/testWorker.js:340:7)
    at Object.worker (.../sentry/node_modules/.pnpm/jest-runner@30.0..../jest-runner/build/testWorker.js:494:12)
CursorIntegrationCta Dismissible Functionality resets dismissal when stage changes
Stack Traces | 0.016s run time
Error: expect(received).toBeNull()

Received: "true"
    at Object.toBeNull (.../events/autofix/cursorIntegrationCta.spec.tsx:542:48)
CursorIntegrationCta Dismissible Functionality hides component when dismissed
Stack Traces | 1.01s run time
Error: Unable to find role="button" and name "Dismiss"

Ignored nodes: comments, script, style
...
    at waitForWrapper (.../sentry/node_modules/.pnpm/@testing-library+dom@10.4.0/node_modules/@.../dom/dist/wait-for.js:163:27)
    at .../sentry/node_modules/.pnpm/@testing-library+dom@10.4.0/node_modules/@.../dom/dist/query-helpers.js:86:33
    at Object.findByRole (.../events/autofix/cursorIntegrationCta.spec.tsx:492:42)
    at Promise.finally.completed (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:1559:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:1499:10)
    at _callCircusTest (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:1009:40)
    at _runTest (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:949:3)
    at _runTestsForDescribeBlock (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:839:13)
    at _runTestsForDescribeBlock (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:829:11)
    at _runTestsForDescribeBlock (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:829:11)
    at run (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:757:3)
    at runAndTransformResultsToJestFormat (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:1920:21)
    at jestAdapter (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/runner.js:101:19)
    at runTestInternal (.../sentry/node_modules/.pnpm/jest-runner@30.0..../jest-runner/build/testWorker.js:272:16)
    at runTest (.../sentry/node_modules/.pnpm/jest-runner@30.0..../jest-runner/build/testWorker.js:340:7)
    at Object.worker (.../sentry/node_modules/.pnpm/jest-runner@30.0..../jest-runner/build/testWorker.js:494:12)
CursorIntegrationCta Dismissible Functionality shows dismiss button when dismissible is true
Stack Traces | 1.03s run time
Error: Unable to find role="button" and name "Dismiss"

Ignored nodes: comments, script, style
...
    at waitForWrapper (.../sentry/node_modules/.pnpm/@testing-library+dom@10.4.0/node_modules/@.../dom/dist/wait-for.js:163:27)
    at .../sentry/node_modules/.pnpm/@testing-library+dom@10.4.0/node_modules/@.../dom/dist/query-helpers.js:86:33
    at Object.findByRole (.../events/autofix/cursorIntegrationCta.spec.tsx:472:27)
    at Promise.finally.completed (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:1559:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:1499:10)
    at _callCircusTest (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:1009:40)
    at _runTest (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:949:3)
    at _runTestsForDescribeBlock (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:839:13)
    at _runTestsForDescribeBlock (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:829:11)
    at _runTestsForDescribeBlock (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:829:11)
    at run (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:757:3)
    at runAndTransformResultsToJestFormat (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/jestAdapterInit.js:1920:21)
    at jestAdapter (.../sentry/node_modules/.pnpm/jest-circus@30.0.4_babel-plugin-macros@3.1..../jest-circus/build/runner.js:101:19)
    at runTestInternal (.../sentry/node_modules/.pnpm/jest-runner@30.0..../jest-runner/build/testWorker.js:272:16)
    at runTest (.../sentry/node_modules/.pnpm/jest-runner@30.0..../jest-runner/build/testWorker.js:340:7)
    at Object.worker (.../sentry/node_modules/.pnpm/jest-runner@30.0..../jest-runner/build/testWorker.js:494:12)

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@jennmueng jennmueng merged commit 43aef80 into master Nov 12, 2025
47 checks passed
@jennmueng jennmueng deleted the cursor-integration-settings branch November 12, 2025 16:23
andrewshie-sentry pushed a commit that referenced this pull request Nov 13, 2025
Makes the cursor agent integration more discoverable by adding callouts
to the seer project settings page. The setup handoff button will set the
stopping point to cursor handoff and invalidate + make sure the dropdown
state is updated.

Without integration set up:
<img width="2844" height="418" alt="image"
src="https://github.com/user-attachments/assets/8fe21d53-fc6d-4da0-a149-77c851f68ceb"
/>
With integration set up but without handoff set or automation is off:
<img width="2640" height="830" alt="CleanShot 2025-11-12 at 01 30 11@2x"
src="https://github.com/user-attachments/assets/2b5d8011-848c-4585-b1b9-1e7f4f117c22"
/>
<img width="2634" height="574" alt="CleanShot 2025-11-12 at 01 30 02@2x"
src="https://github.com/user-attachments/assets/2e956428-bd33-481f-a1ae-e5b22ace3c7b"
/>
With handoff setup:
<img width="2930" height="498" alt="image"
src="https://github.com/user-attachments/assets/db5e0ada-a812-4f6f-8185-ef394fbb1eee"
/>

Followed by #103156
@github-actions github-actions bot locked and limited conversation to collaborators Nov 28, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Scope: Frontend Automatically applied to PRs that change frontend components

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants