diff --git a/packages/start/src/lib/engine.test.ts b/packages/start/src/lib/engine.test.ts index b5c4d9565ea..daaaf2feee3 100644 --- a/packages/start/src/lib/engine.test.ts +++ b/packages/start/src/lib/engine.test.ts @@ -81,7 +81,10 @@ describe('buildSteps', () => { const connect = buildSteps(cfg, composition(cfg)).find((s) => s.id === 'connect-app')! expect(connect.title).toBe('Connect to your app') - expect(stepText(connect)).toContain('npx shadcn@latest init -d') + expect(stepText(connect)).toContain('test -f components.json || npx shadcn@latest init -d') + expect(stepText(connect)).toContain( + 'Do not run shadcn init when components.json already exists' + ) expect(stepText(connect)).toContain( 'npx shadcn@latest add @supabase/password-based-auth-nextjs' ) @@ -187,7 +190,7 @@ describe('buildSteps', () => { const connect = steps.find((s) => s.id === 'connect-app')! expect(steps.some((s) => s.id === 'add')).toBe(false) expect(connect.title).toBe('Connect to your app') - expect(stepText(connect)).toContain('npx shadcn@latest init -d') + expect(stepText(connect)).toContain('test -f components.json || npx shadcn@latest init -d') }) it('existing + no shadcn uses the Supabase code step instead of a file tree step', () => { @@ -330,6 +333,17 @@ describe('buildSteps', () => { expect(text).toContain('npx shadcn@latest add SaxonF/templates/todos') expect(text).toContain('npx shadcn@latest add SaxonF/templates/auth') }) + + it('points to template readmes for config.toml merge guidance', () => { + const cfg = config() + const supabaseCode = buildSteps(cfg, composition(cfg)).find((s) => s.id === 'supabase-code')! + const text = stepText(supabaseCode) + + expect(text).toContain("Follow the instructions in each installed template's readme") + expect(text).toContain('supabase/config.toml') + expect(text).not.toContain('--dry-run --diff') + expect(text).not.toContain('The Start composer has already merged overlapping files') + }) }) describe('buildAgentPlan', () => { diff --git a/packages/start/src/lib/project-code-plan.ts b/packages/start/src/lib/project-code-plan.ts index 300066d818e..90a566701e0 100644 --- a/packages/start/src/lib/project-code-plan.ts +++ b/packages/start/src/lib/project-code-plan.ts @@ -1,8 +1,4 @@ -import { - getRegistryAddCommand, - getRegistrySearchCommand, - getRegistryViewCommand, -} from 'template-composer' +import { getRegistryAddCommand, getRegistrySearchCommand } from 'template-composer' import type { StartComposition } from './composition/start-composition' import { listEnglish, ORMS, type StartConfig } from './config' @@ -35,7 +31,6 @@ export interface ProjectCodePlan { selectedTemplates: ProjectCodeTemplate[] dependencyTemplates: ProjectCodeTemplate[] addCommands: ProjectCodeTemplateCommand[] - viewCommands: ProjectCodeTemplateCommand[] fileGroups: ProjectCodeFileGroup[] filePaths: string[] schemaFiles: string[] @@ -85,7 +80,6 @@ export function buildProjectCodePlan( .filter((resource) => resource.kind === 'edge-function') .map((resource) => resource.label) .sort((a, b) => a.localeCompare(b)) - return { hasProjectCode: selectedTemplates.length > 0 || filePaths.length > 0, listCommand: getRegistrySearchCommand('', registryCommandOptions), @@ -97,10 +91,6 @@ export function buildProjectCodePlan( ...template, command: getRegistryAddCommand(template.id, registryCommandOptions), })), - viewCommands: selectedTemplates.map((template) => ({ - ...template, - command: getRegistryViewCommand(template.id, registryCommandOptions), - })), fileGroups, filePaths, schemaFiles, diff --git a/packages/start/src/lib/steps.ts b/packages/start/src/lib/steps.ts index fe9295137c9..a8b766ade51 100644 --- a/packages/start/src/lib/steps.ts +++ b/packages/start/src/lib/steps.ts @@ -296,12 +296,16 @@ function connectAppStep(ctx: GuideContext): SetupStep | null { type: 'code', lang: 'terminal', code: lines([ - "npx shadcn@latest init -d # if shadcn isn't set up yet", + 'test -f components.json || npx shadcn@latest init -d # skip init when shadcn/ui is already configured', ...blockPrims.map( (p) => `npx shadcn@latest add @supabase/${getShadcnBlockName(p)}-${fw.shadcnTag}` ), ]), }) + blocks.push({ + type: 'note', + text: 'Do not run shadcn init when components.json already exists; the Next.js with-supabase starter and many existing apps already include it.', + }) const missing = getMissingShadcnPrimitiveLabels(ctx) if (missing.length) { @@ -390,6 +394,11 @@ function supabaseCodeStep(ctx: GuideContext): SetupStep | null { } if (plan.addCommands.length > 0) { + blocks.push({ + type: 'note', + text: "Follow the instructions in each installed template's readme, especially when merging changes into supabase/config.toml.", + }) + blocks.push({ type: 'code', lang: 'terminal',