From 4378656901a822809fbf5c27f8a79d69b7c883dd Mon Sep 17 00:00:00 2001 From: cfngc4594 Date: Fri, 18 Sep 2026 09:14:08 +0800 Subject: [PATCH] fix(create): make scaffolded intent install work with bun bunx was picking up the local intent shim from @tanstack/devtools, and Intent 0.4.0 now needs intent.skills before it will write guidance without a TTY. Co-authored-by: Cursor --- packages/create/src/edge-create-app.ts | 15 +++++++ packages/create/src/integrations/intent.ts | 17 ++++++++ packages/create/src/package-manager.ts | 2 +- .../create/tests/integrations/intent.test.ts | 43 +++++++++++++++++++ 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 packages/create/tests/integrations/intent.test.ts diff --git a/packages/create/src/edge-create-app.ts b/packages/create/src/edge-create-app.ts index 4586262a..dabd59d9 100644 --- a/packages/create/src/edge-create-app.ts +++ b/packages/create/src/edge-create-app.ts @@ -264,6 +264,21 @@ async function setupIntent( message: 'Setting up TanStack Intent skill discovery...', }) + const packageJsonPath = joinPaths(targetDir, 'package.json') + if (environment.exists(packageJsonPath)) { + const packageJSON = JSON.parse(await environment.readFile(packageJsonPath)) + if (!packageJSON.intent?.skills) { + packageJSON.intent = { + ...packageJSON.intent, + skills: ['@tanstack/*'], + } + await environment.writeFile( + packageJsonPath, + JSON.stringify(packageJSON, null, 2), + ) + } + } + const { command, args } = getPackageManagerExecuteCommand( options.packageManager, INTENT_PACKAGE, diff --git a/packages/create/src/integrations/intent.ts b/packages/create/src/integrations/intent.ts index 373af44d..6c7ad50a 100644 --- a/packages/create/src/integrations/intent.ts +++ b/packages/create/src/integrations/intent.ts @@ -26,6 +26,23 @@ export async function setupIntent( }) try { + const packageJsonPath = resolve(targetDir, 'package.json') + if (environment.exists(packageJsonPath)) { + const packageJSON = JSON.parse( + await environment.readFile(packageJsonPath), + ) + if (!packageJSON.intent?.skills) { + packageJSON.intent = { + ...packageJSON.intent, + skills: ['@tanstack/*'], + } + await environment.writeFile( + packageJsonPath, + JSON.stringify(packageJSON, null, 2), + ) + } + } + await packageManagerExecute( environment, resolve(targetDir), diff --git a/packages/create/src/package-manager.ts b/packages/create/src/package-manager.ts index c4b9eb43..ecd43c28 100644 --- a/packages/create/src/package-manager.ts +++ b/packages/create/src/package-manager.ts @@ -82,7 +82,7 @@ export function getPackageManagerExecuteCommand( } } -export const INTENT_PACKAGE = '@tanstack/intent' +export const INTENT_PACKAGE = '@tanstack/intent@latest' export function intentCommand( packageManager: PackageManager, diff --git a/packages/create/tests/integrations/intent.test.ts b/packages/create/tests/integrations/intent.test.ts new file mode 100644 index 00000000..e4a41364 --- /dev/null +++ b/packages/create/tests/integrations/intent.test.ts @@ -0,0 +1,43 @@ +import { describe, expect, it } from 'vitest' + +import { createMemoryEnvironment } from '../../src/environment.js' +import { setupIntent } from '../../src/integrations/intent.js' +import type { Options } from '../../src/types.js' + +describe('intent', () => { + it('should skip if intent is disabled', async () => { + const { environment, output } = createMemoryEnvironment() + environment.startRun() + await setupIntent(environment, '/test', { + intent: false, + packageManager: 'bun', + } as Options) + environment.finishRun() + + expect(output.commands).toEqual([]) + }) + + it('should write intent.skills and run install', async () => { + const { environment, output } = createMemoryEnvironment() + environment.startRun() + await environment.writeFile( + '/package.json', + JSON.stringify({ name: 'test' }), + ) + await setupIntent(environment, '/', { + intent: true, + packageManager: 'bun', + } as Options) + environment.finishRun() + + expect(JSON.parse(output.files['/package.json']).intent).toEqual({ + skills: ['@tanstack/*'], + }) + expect(output.commands).toEqual([ + { + command: 'bunx', + args: ['--bun', '@tanstack/intent@latest', 'install'], + }, + ]) + }) +})