From 50051d3fb78736e24bad41ae99a44928c0b7fe1b Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 13 Jul 2026 21:27:13 +0000 Subject: [PATCH 1/8] Show exact copyable redirect URI on /connect/oauth and harden OAuth guide against localhost guesses Co-authored-by: Kent C. Dodds --- docs/guides/integration-bootstrap.md | 6 +- docs/guides/oauth.md | 27 +++++++- .../worker/client/routes/connect-oauth.tsx | 69 ++++++++++++++++--- .../coding/kody-official-guide.ts | 2 +- 4 files changed, 88 insertions(+), 16 deletions(-) diff --git a/docs/guides/integration-bootstrap.md b/docs/guides/integration-bootstrap.md index 5d18a8ffba..cf83a75c3e 100644 --- a/docs/guides/integration-bootstrap.md +++ b/docs/guides/integration-bootstrap.md @@ -132,8 +132,10 @@ Even in that case: When setup is incomplete, tell the user what must happen next in concrete terms: -- what connect URL to open -- what provider settings or redirect URI to register +- what connect URL to open (on the user's live Kody origin, never an assumed + localhost) +- what provider settings or redirect URI to register (the exact + `{origin}/connect/oauth` for the origin the user opens Kody on) - that you are waiting for confirmation before building the dependent package or package app - that you will run a minimal authenticated verification step after setup diff --git a/docs/guides/oauth.md b/docs/guides/oauth.md index bb3f14ebf9..1208009d48 100644 --- a/docs/guides/oauth.md +++ b/docs/guides/oauth.md @@ -25,7 +25,26 @@ Register this redirect URI in the provider console: `{origin}/connect/oauth` -Use the same origin the user uses to open Kody. +`{origin}` is the exact origin the user uses to open Kody in their browser — +scheme, host, and port included. The `/connect/oauth` page displays the exact +redirect URI for the current origin with a copy button; when in doubt, have the +user open the page and copy it from there. + +Never tell the user to register a `localhost` redirect URI unless the user's +Kody deployment actually runs on localhost. On a hosted deployment such as +`https://example.com`, the redirect URI is `https://example.com/connect/oauth` — +substituting `http://localhost:8787/connect/oauth` or any other invented host +breaks the flow with a provider-side redirect mismatch error. + +## Provider setup checklist + +The provider-side setup is the same for every provider: + +1. Create an OAuth app in the provider's developer console. +2. Register the exact redirect URI above. +3. Enable any APIs and scopes the integration needs. +4. Paste the client ID (and client secret for confidential flows) into the + `/connect/oauth` setup form in Kody. ## Required query parameters @@ -127,8 +146,10 @@ routes) are for clients authenticating to Kody itself. ## Agent checklist 1. Confirm OAuth is the right auth shape. -2. Build the `/connect/oauth` URL with the required params. -3. Tell the user the exact redirect URI to register. +2. Build the `/connect/oauth` URL with the required params on the user's live + Kody origin (never a guessed or localhost origin). +3. Tell the user the exact redirect URI to register: their Kody origin plus + `/connect/oauth`. The page shows it with a copy button. 4. Have the user open the URL while signed in and wait for success. 5. Run the authenticated smoke test from `integration_bootstrap`. 6. Continue with the package or package app only after the smoke test passes. diff --git a/packages/worker/client/routes/connect-oauth.tsx b/packages/worker/client/routes/connect-oauth.tsx index a3394ab6dd..04bc23d205 100644 --- a/packages/worker/client/routes/connect-oauth.tsx +++ b/packages/worker/client/routes/connect-oauth.tsx @@ -7,6 +7,7 @@ import { safeParseHost, } from '@kody-internal/shared/url-hosts.ts' import { type Handle, css } from 'remix/ui' +import { CopyTextButton } from '#client/copy-text-button.tsx' import { on } from '#client/event-mixin.ts' import { passwordManagerIgnoreProps } from '#client/password-manager-ignore.ts' import { @@ -761,20 +762,51 @@ export function ConnectOauthRoute(handle: Handle) { return } + const renderRedirectUriCard = () => { + const redirectUri = getRedirectUri() + if (!redirectUri) return null + return ( +
+

Redirect URI

+

+ Register this exact URL as the redirect (callback) URI in your + provider's OAuth app settings. Copy it as-is — do not substitute + localhost or any other host. +

+
{redirectUri}
+
+ +
+
+ ) + } + const renderProviderInstructions = () => { if (!config) return null const instructions = config.providerSetupInstructions - if (instructions && instructions.trim()) { - return ( -

- {instructions} -

- ) - } return ( -

- Create an OAuth app with your provider and enter the Client ID below. -

+ <> +
    +
  1. + Create an OAuth app in your provider's developer console. +
  2. +
  3. Register the exact redirect URI shown above.
  4. +
  5. Enable any APIs and scopes the integration needs.
  6. +
  7. + Paste the client ID + {config.flow === 'confidential' ? ' and client secret' : ''} below. +
  8. +
+ {instructions && instructions.trim() ? ( +

+ {instructions} +

+ ) : null} + ) } @@ -950,6 +982,7 @@ export function ConnectOauthRoute(handle: Handle) {

Connect OAuth

{statusMessage}

+ {renderRedirectUriCard()} ) } @@ -977,6 +1010,7 @@ export function ConnectOauthRoute(handle: Handle) {

{statusMessage}

+ {renderRedirectUriCard()}

Provider details

@@ -1735,6 +1769,21 @@ const pageCss = { const headerCss = pageHeaderCss const eyebrowCss = pageEyebrowCss + +const redirectUriCardCss = { + ...cardCss, + border: `1px solid ${colors.primary}`, +} + +const redirectUriValueCss = { + ...insetCardCss, + margin: 0, + whiteSpace: 'pre-wrap' as const, + wordBreak: 'break-all' as const, + fontFamily: 'monospace', + fontSize: typography.fontSize.base, + fontWeight: typography.fontWeight.medium, +} const primaryButtonCss = getPrimaryButtonCss({ size: 'lg', weight: 'semibold', diff --git a/packages/worker/src/mcp/capabilities/coding/kody-official-guide.ts b/packages/worker/src/mcp/capabilities/coding/kody-official-guide.ts index e729ed21b6..e9bc92a1da 100644 --- a/packages/worker/src/mcp/capabilities/coding/kody-official-guide.ts +++ b/packages/worker/src/mcp/capabilities/coding/kody-official-guide.ts @@ -45,7 +45,7 @@ export const kodyOfficialGuideCatalog = { file: 'oauth.md', title: 'OAuth guide (standard path)', summary: - 'START HERE for third-party OAuth: hosted /connect/oauth, redirect URI, required query params, PKCE vs confidential, vs MCP OAuth.', + 'START HERE for third-party OAuth: hosted /connect/oauth, exact redirect URI on the user\u2019s live Kody origin (never assume localhost), required query params, PKCE vs confidential, vs MCP OAuth.', }, connect_secret: { file: 'account-secret-setup.md', From 0a2ad27520725c74bfda574ceeb3504a028ae974 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 13 Jul 2026 21:27:14 +0000 Subject: [PATCH 2/8] Tighten onboarding setup prompt and add community packages CTA Co-authored-by: Kent C. Dodds --- packages/worker/client/routes/onboarding.tsx | 21 ++++++++++++++++++++ packages/worker/src/app/onboarding-data.ts | 6 +++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/worker/client/routes/onboarding.tsx b/packages/worker/client/routes/onboarding.tsx index 0a5d53ea83..e9815ac899 100644 --- a/packages/worker/client/routes/onboarding.tsx +++ b/packages/worker/client/routes/onboarding.tsx @@ -30,6 +30,7 @@ import { cardCss, cardTitleCss, descriptionCss, + getPrimaryButtonCss, insetCardCss, layoutMaxWidths, mutedLinkCss, @@ -255,6 +256,20 @@ export function OnboardingRoute(handle: Handle) { {renderByokExplainer({ image: 'handoff' })} +
+

3. Explore community packages

+

+ See what other people have built with Kody — browse community + packages for ready-made automations you can fork into your own + account. +

+ +
+

Back to account @@ -284,3 +299,9 @@ const codeBlockCss = { fontSize: typography.fontSize.sm, lineHeight: 1.6, } + +const communityCtaCss = { + ...getPrimaryButtonCss(), + display: 'inline-flex', + textDecoration: 'none', +} diff --git a/packages/worker/src/app/onboarding-data.ts b/packages/worker/src/app/onboarding-data.ts index 710f55fdbd..dd948a3bf5 100644 --- a/packages/worker/src/app/onboarding-data.ts +++ b/packages/worker/src/app/onboarding-data.ts @@ -26,9 +26,9 @@ export function buildMcpServerUrl(input: { export function buildOnboardingSetupPrompt() { return [ 'Help me get started with Kody.', - 'First explain what Kody can do for me in plain language.', - 'Then help me set up the basics for my account — for example secrets, integrations, or packages I might need.', - 'Prefer searching first, then executing.', + 'First, briefly explain what Kody can do for me in plain language.', + 'Then help me connect one integration I care about: use search and the official guides to find the right setup steps, walk me through them, and verify the connection with a small ad hoc execute smoke test.', + 'Do not create any packages until the integration works — start with ad hoc execute calls, then package things up once they work.', ].join(' ') } From 5e05110b5a9892d30f70784b8973b6dcadd90cd1 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 13 Jul 2026 21:27:14 +0000 Subject: [PATCH 3/8] Make verify-email success CTA a primary button Co-authored-by: Kent C. Dodds --- .../worker/client/routes/verify-email.tsx | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/worker/client/routes/verify-email.tsx b/packages/worker/client/routes/verify-email.tsx index 5710f2b5a2..44cea3fe21 100644 --- a/packages/worker/client/routes/verify-email.tsx +++ b/packages/worker/client/routes/verify-email.tsx @@ -2,11 +2,11 @@ import { type Handle, css } from 'remix/ui' import { AppLoaderDataProvider } from '#client/loader-data-context.tsx' import { cardCss, + getPrimaryButtonCss, mutedLinkCss, pageDescriptionCss, pageHeaderCss, pageTitleCss, - primaryLinkCss, stackedPageCss, } from '#client/styles/style-primitives.ts' import { colors, spacing, typography } from '#client/styles/tokens.ts' @@ -65,15 +65,21 @@ export function VerifyEmailRoute(handle: Handle) { {data.ok ? data.message : data.error}

{data.ok ? ( -

- +

) : ( Go to account @@ -91,3 +97,9 @@ const pageCss = { margin: '0 auto', gap: spacing.lg, } + +const ctaButtonCss = { + ...getPrimaryButtonCss({ size: 'lg', weight: 'semibold' }), + display: 'inline-flex', + textDecoration: 'none', +} From 5f1ef8fe0aa6cd8187a66080b5f3e29889029f92 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 13 Jul 2026 21:27:14 +0000 Subject: [PATCH 4/8] Add logos for all integration provider suggestions Co-authored-by: Kent C. Dodds --- packages/worker/client/provider-icons.tsx | 65 ++++++++++++++++++- .../client/routes/account-integrations.tsx | 33 +++++++++- 2 files changed, 94 insertions(+), 4 deletions(-) diff --git a/packages/worker/client/provider-icons.tsx b/packages/worker/client/provider-icons.tsx index 5a4d26ff2d..ddb23f7229 100644 --- a/packages/worker/client/provider-icons.tsx +++ b/packages/worker/client/provider-icons.tsx @@ -1,9 +1,9 @@ import { type Handle } from 'remix/ui' /** - * Inline brand marks for the social login providers. Inlined as SVG (no - * external assets) so they server-render with the buttons and inherit sizing - * and color from the surrounding text. + * Inline brand marks for the social login providers and integration provider + * suggestions. Inlined as SVG (no external assets) so they server-render with + * the buttons and inherit sizing and color from the surrounding text. */ const iconSize = '1.25em' @@ -63,10 +63,69 @@ function renderXIcon() { ) } +function renderSlackIcon() { + return ( + + ) +} + +function renderSpotifyIcon() { + return ( + + ) +} + +function renderDiscordIcon() { + return ( + + ) +} + const providerIconRenderers: Record JSX.Element> = { github: renderGitHubIcon, google: renderGoogleIcon, x: renderXIcon, + slack: renderSlackIcon, + spotify: renderSpotifyIcon, + discord: renderDiscordIcon, } export function ProviderIcon(handle: Handle<{ providerId: string }>) { diff --git a/packages/worker/client/routes/account-integrations.tsx b/packages/worker/client/routes/account-integrations.tsx index 54bbeb9a31..e2dfeb5a39 100644 --- a/packages/worker/client/routes/account-integrations.tsx +++ b/packages/worker/client/routes/account-integrations.tsx @@ -121,6 +121,27 @@ function buildConnectOauthHref(integration: AccountIntegrationListItem) { return `/connect/oauth?${params.toString()}` } +function PlugIcon() { + return ( + + ) +} + function renderIntegrationDetail(label: string, value: string) { return (
@@ -377,7 +398,17 @@ export function AccountIntegrationsRoute(handle: Handle) {
-

Something else

+

+ {PlugIcon()} + Something else +

If it has an API, your Kody can learn to use it.

From f2f13a8de802bb80bfb64b9041767689bfab04c0 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 13 Jul 2026 21:27:14 +0000 Subject: [PATCH 5/8] Restyle remote connector switches with theme-aware tokens Co-authored-by: Kent C. Dodds --- .../routes/account-remote-connectors.tsx | 75 ++++++++++++++++++- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/packages/worker/client/routes/account-remote-connectors.tsx b/packages/worker/client/routes/account-remote-connectors.tsx index 5f9e5f6724..f77cebf23d 100644 --- a/packages/worker/client/routes/account-remote-connectors.tsx +++ b/packages/worker/client/routes/account-remote-connectors.tsx @@ -1,6 +1,5 @@ import { formatTimestamp } from '#client/format-timestamp.ts' import { type Handle, css } from 'remix/ui' -import toggle from 'remix/ui/toggle' import { on } from '#client/event-mixin.ts' import { passwordManagerIgnoreProps } from '#client/password-manager-ignore.ts' import { readCurrentRouterHref } from '#client/client-router.tsx' @@ -24,7 +23,14 @@ import { AccountManagementSidebar, AccountPageHeader, } from '#client/routes/account-management-components.tsx' -import { colors, radius, spacing, typography } from '#client/styles/tokens.ts' +import { + colors, + radius, + shadows, + spacing, + transitions, + typography, +} from '#client/styles/tokens.ts' import { cardCss, cardTitleCss, @@ -261,6 +267,65 @@ function CopyToClipboard(handle: Handle<{ url: string }>) { } } +/** + * Theme-aware switch styling for the enabled/attached checkboxes. The + * `remix/ui/toggle` mixin ships hardcoded light-mode colors that clash with + * the app theme (especially in dark mode), so the track and thumb are built + * from the shared design tokens instead. + */ +const switchCss = { + appearance: 'none' as const, + WebkitAppearance: 'none' as const, + position: 'relative' as const, + flex: 'none', + width: '2.75rem', + height: '1.5rem', + margin: 0, + padding: 0, + border: `1px solid ${colors.border}`, + borderRadius: radius.full, + backgroundColor: colors.background, + cursor: 'pointer', + transition: `background-color ${transitions.normal}, border-color ${transitions.normal}`, + '&::before': { + content: '""', + position: 'absolute' as const, + top: '50%', + left: '0.125rem', + width: '1.125rem', + height: '1.125rem', + borderRadius: radius.full, + backgroundColor: colors.textMuted, + boxShadow: shadows.sm, + transform: 'translateY(-50%)', + transition: `transform ${transitions.normal}, background-color ${transitions.normal}`, + }, + '&:not(:disabled):hover': { + borderColor: colors.primary, + }, + '&:checked': { + backgroundColor: colors.primary, + borderColor: colors.primary, + }, + '&:checked::before': { + backgroundColor: colors.onPrimary, + transform: 'translateY(-50%) translateX(1.25rem)', + }, + '&:focus-visible': { + outline: 'none', + boxShadow: `0 0 0 3px ${colors.primarySoftStrong}`, + }, + '&:disabled': { + cursor: 'not-allowed', + opacity: 0.55, + }, + '@media (prefers-reduced-motion: reduce)': { + '&::before': { + transition: 'none', + }, + }, +} + const iconButtonCss = { position: 'absolute' as const, right: spacing.sm, @@ -828,10 +893,11 @@ export function AccountRemoteConnectorsRoute(handle: Handle) { { editorState = { ...editorState, @@ -861,10 +927,11 @@ export function AccountRemoteConnectorsRoute(handle: Handle) { { if (!editorState.enabled) { event.currentTarget.checked = editorState.attached From 7ce48b99a303f2648ea03948fe81f28814d15535 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 13 Jul 2026 22:20:10 +0000 Subject: [PATCH 6/8] Make OAuth redirect URI guidance positive and literal (heykody.dev) Replace negative localhost warnings with the literal https://heykody.dev/connect/oauth redirect URI in the oauth and integration-bootstrap guides, the coding_guide_get summary, and the /connect/oauth redirect URI card. Also clarify the MCP OAuth distinction and stop asking for a client secret that is already stored (review feedback). Co-authored-by: Kent C. Dodds --- docs/guides/integration-bootstrap.md | 8 ++--- docs/guides/oauth.md | 30 ++++++++----------- .../worker/client/routes/connect-oauth.tsx | 8 +++-- .../coding/kody-official-guide.ts | 2 +- 4 files changed, 22 insertions(+), 26 deletions(-) diff --git a/docs/guides/integration-bootstrap.md b/docs/guides/integration-bootstrap.md index cf83a75c3e..f047b27328 100644 --- a/docs/guides/integration-bootstrap.md +++ b/docs/guides/integration-bootstrap.md @@ -132,10 +132,10 @@ Even in that case: When setup is incomplete, tell the user what must happen next in concrete terms: -- what connect URL to open (on the user's live Kody origin, never an assumed - localhost) -- what provider settings or redirect URI to register (the exact - `{origin}/connect/oauth` for the origin the user opens Kody on) +- what connect URL to open (`https://heykody.dev/...` — the origin users open + Kody on) +- what provider settings or redirect URI to register (exactly + `https://heykody.dev/connect/oauth`) - that you are waiting for confirmation before building the dependent package or package app - that you will run a minimal authenticated verification step after setup diff --git a/docs/guides/oauth.md b/docs/guides/oauth.md index 1208009d48..e248fd1eb2 100644 --- a/docs/guides/oauth.md +++ b/docs/guides/oauth.md @@ -8,7 +8,7 @@ package or package app that depends on the resulting integration or tokens. ## Default path: `/connect/oauth` -Send the signed-in user to `/connect/oauth` on your deployment host with query +Send the signed-in user to `https://heykody.dev/connect/oauth` with query parameters that describe the provider. The page runs authorize -> callback -> token exchange in a full browser context and persists access and refresh tokens through the account secrets flow. @@ -17,24 +17,18 @@ This path does not require package-app-specific OAuth code. Example shape: -`https:///connect/oauth?provider=...&authorizeUrl=...&tokenUrl=...` +`https://heykody.dev/connect/oauth?provider=...&authorizeUrl=...&tokenUrl=...` ## Redirect URI -Register this redirect URI in the provider console: +The redirect URI is: -`{origin}/connect/oauth` +`https://heykody.dev/connect/oauth` -`{origin}` is the exact origin the user uses to open Kody in their browser — -scheme, host, and port included. The `/connect/oauth` page displays the exact -redirect URI for the current origin with a copy button; when in doubt, have the -user open the page and copy it from there. - -Never tell the user to register a `localhost` redirect URI unless the user's -Kody deployment actually runs on localhost. On a hosted deployment such as -`https://example.com`, the redirect URI is `https://example.com/connect/oauth` — -substituting `http://localhost:8787/connect/oauth` or any other invented host -breaks the flow with a provider-side redirect mismatch error. +Register it in the provider console exactly as written. Users connect to Kody at +`https://heykody.dev`, so connect URLs use `https://heykody.dev/...`. The +`/connect/oauth` page shows the redirect URI for the current origin with a copy +button. A self-hosted deployment uses its own origin plus `/connect/oauth`. ## Provider setup checklist @@ -146,10 +140,10 @@ routes) are for clients authenticating to Kody itself. ## Agent checklist 1. Confirm OAuth is the right auth shape. -2. Build the `/connect/oauth` URL with the required params on the user's live - Kody origin (never a guessed or localhost origin). -3. Tell the user the exact redirect URI to register: their Kody origin plus - `/connect/oauth`. The page shows it with a copy button. +2. Build the connect URL with the required params: + `https://heykody.dev/connect/oauth?...`. +3. Tell the user the exact redirect URI to register: + `https://heykody.dev/connect/oauth`. The page shows it with a copy button. 4. Have the user open the URL while signed in and wait for success. 5. Run the authenticated smoke test from `integration_bootstrap`. 6. Continue with the package or package app only after the smoke test passes. diff --git a/packages/worker/client/routes/connect-oauth.tsx b/packages/worker/client/routes/connect-oauth.tsx index 04bc23d205..d2a94c30fe 100644 --- a/packages/worker/client/routes/connect-oauth.tsx +++ b/packages/worker/client/routes/connect-oauth.tsx @@ -770,8 +770,7 @@ export function ConnectOauthRoute(handle: Handle) {

Redirect URI

Register this exact URL as the redirect (callback) URI in your - provider's OAuth app settings. Copy it as-is — do not substitute - localhost or any other host. + provider's OAuth app settings.

{redirectUri}
@@ -798,7 +797,10 @@ export function ConnectOauthRoute(handle: Handle) {
  • Enable any APIs and scopes the integration needs.
  • Paste the client ID - {config.flow === 'confidential' ? ' and client secret' : ''} below. + {config.flow === 'confidential' && !hasStoredClientSecret + ? ' and client secret' + : ''}{' '} + below.
  • {instructions && instructions.trim() ? ( diff --git a/packages/worker/src/mcp/capabilities/coding/kody-official-guide.ts b/packages/worker/src/mcp/capabilities/coding/kody-official-guide.ts index e9bc92a1da..6971a8cebb 100644 --- a/packages/worker/src/mcp/capabilities/coding/kody-official-guide.ts +++ b/packages/worker/src/mcp/capabilities/coding/kody-official-guide.ts @@ -45,7 +45,7 @@ export const kodyOfficialGuideCatalog = { file: 'oauth.md', title: 'OAuth guide (standard path)', summary: - 'START HERE for third-party OAuth: hosted /connect/oauth, exact redirect URI on the user\u2019s live Kody origin (never assume localhost), required query params, PKCE vs confidential, vs MCP OAuth.', + 'START HERE for third-party OAuth: hosted /connect/oauth, the exact redirect URI (https://heykody.dev/connect/oauth), required query params, PKCE vs confidential, and how it differs from MCP OAuth.', }, connect_secret: { file: 'account-secret-setup.md', From 178405ff24a138ecea116a5879e715d915ffc1d0 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 13 Jul 2026 22:20:10 +0000 Subject: [PATCH 7/8] Hide duplicate Account link on verify-email when the CTA already points there Co-authored-by: Kent C. Dodds --- packages/worker/client/routes/verify-email.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/worker/client/routes/verify-email.tsx b/packages/worker/client/routes/verify-email.tsx index 44cea3fe21..217ed6e478 100644 --- a/packages/worker/client/routes/verify-email.tsx +++ b/packages/worker/client/routes/verify-email.tsx @@ -76,9 +76,11 @@ export function VerifyEmailRoute(handle: Handle) {
    {ctaLabel} - - Account - + {ctaHref === '/account' ? null : ( + + Account + + )}
    ) : ( From 96c5e62be84bcc352c14e59330ca854e7c583890 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 13 Jul 2026 22:20:10 +0000 Subject: [PATCH 8/8] Point onboarding setup prompt at coding_guide_get and the connect/secrets flows Co-authored-by: Kent C. Dodds --- packages/worker/src/app/onboarding-data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/worker/src/app/onboarding-data.ts b/packages/worker/src/app/onboarding-data.ts index dd948a3bf5..d950b95ccf 100644 --- a/packages/worker/src/app/onboarding-data.ts +++ b/packages/worker/src/app/onboarding-data.ts @@ -27,7 +27,7 @@ export function buildOnboardingSetupPrompt() { return [ 'Help me get started with Kody.', 'First, briefly explain what Kody can do for me in plain language.', - 'Then help me connect one integration I care about: use search and the official guides to find the right setup steps, walk me through them, and verify the connection with a small ad hoc execute smoke test.', + 'Then help me connect one integration I care about: use search and the official guides (coding_guide_get) to find the right setup steps, walk me through the connect or secrets flow, and verify the connection with a small ad hoc execute smoke test.', 'Do not create any packages until the integration works — start with ad hoc execute calls, then package things up once they work.', ].join(' ') }