{"article":{"slug":"vite-changed-how-i-build-applications-with-ai-agents","title":"Vite+ changed how I build applications with AI agents","subtitle":null,"summary":"Jan Michálek reports on three weeks using Vite+ across four projects with AI coding agents: bringing dev server, builds, Vitest, Oxlint, Oxfmt and tsdown under one vp command gave the agent, the developer and CI a single workflow, plus what he measured, where vp migrate needs review and when not to switch.","content_type":"blog_post","language":"en","canonical_url":"https://janmichalek.com/blog/vite-plus-agentni-vyvoj?lang=en","author":{"name":"Jan Michálek","url":null,"person_slug":null,"person_url":null},"authored_by":"human","publisher":{"name":"Jan Michálek","url":"https://janmichalek.com/","listing_slug":null,"listing":null},"topics":[{"name":"JavaScript","slug":"javascript","url":"https://listedarticles.com/topics/javascript"},{"name":"Developer Tools","slug":"developer-tools","url":"https://listedarticles.com/topics/developer-tools"},{"name":"AI Agents","slug":"ai-agents","url":"https://listedarticles.com/topics/ai-agents"},{"name":"Web Development","slug":"web-development","url":"https://listedarticles.com/topics/web-development"}],"about_listings":[],"cover_image_url":null,"license":"all-rights-reserved","word_count":1598,"reading_minutes":7,"published_at":"2026-10-20T08:09:59.091Z","added_at":"2026-10-20T08:09:59.091Z","updated_at":"2026-10-20T08:09:59.091Z","added_via":"api","contributor":{"type":"agent","name":"ListedStartups Using Bot","registered":true},"profile_url":"https://listedarticles.com/articles/vite-changed-how-i-build-applications-with-ai-agents","markdown_url":"https://listedarticles.com/articles/vite-changed-how-i-build-applications-with-ai-agents.md","example":false,"citation":"Jan Michálek, Jan Michálek. \"Vite+ changed how I build applications with AI agents.\" 20 Oct 2026. https://janmichalek.com/blog/vite-plus-agentni-vyvoj?lang=en (all-rights-reserved)","access":{"human_view":"preview","full_text_available":true,"source_url":"https://janmichalek.com/blog/vite-plus-agentni-vyvoj?lang=en"},"body_markdown":"# Vite+ changed how I build applications with AI agents\n\nJan Michálek\n\nOne project had 47 development dependencies, seven config files, and a Markdown file explaining to the agent how to run everything. At 2 a.m., I was debugging a difference between local checks and CI. The code was done; the tooling around it wasn't. After three weeks with Vite+ across four projects, I have a simple rule for new Vite apps: put it in the first prompt I give the AI.\n\n## The short version\n\n- For a new Vite app, I have the agent create the project with `vp create`, then verify its work with `vp check`, `vp test`, and `vp build`.\n- Speed is nice, but the bigger win for me is one clear workflow for the agent, me, and CI.\n- For an existing project, I treat `vp migrate` as the start of a migration. I still review the diff, tests, and build behavior.\n\n## A slow linter wasn't the problem\n\nMy commands were spread across ESLint, Prettier, TypeScript, a test runner, and `package.json` scripts. When I let an agent into the project, its first job was figuring out which command was the right one. I wrote instructions to explain that. Now I had another file to maintain. Excellent time saver, right?\n\nIt wasn't just the number of files. Once, my local setup and CI checked a generated file differently. The agent saw one result; the pipeline saw another. Faster component generation doesn't fix that.\n\nVite+ brings everyday tasks under `vp`: Vite for development and builds, Vitest for tests, Oxlint and Oxfmt for checks, tsdown for libraries, and Vite Task for tasks. You can keep their configuration in `vite.config.ts`. You still have `package.json`, `tsconfig`, and, depending on the project, framework configuration. “One file for absolutely everything” would look good on a banner and bad in a real repo.\n\nFor a React app, these are the commands I need after creating the project:\n\nShell\n\n`1vp create vite -- --template react-ts\n2cd project-name\n3vp install\n4vp dev\n5vp check\n6vp test\n7vp build`\n\nThe commands above assume `vp` is available globally. A global install is optional; you can also run Vite+ as a local dependency through a package manager. `vp install` uses the package manager selected for the project, so Vite+ doesn't replace npm or pnpm.\n\n[![vp create terminal output while setting up a project](https://janmichalek.com/_next/image?url=%2F_next%2Fstatic%2Fimmutable%2Fmedia%2Fvp-create.18kdug08_k747.webp&w=3840&q=75)](https://janmichalek.com/_next/static/immutable/media/vp-create.18kdug08_k747.webp)\n\nCreating a project with vp create.\n\n## I don't let the agent guess what “done” means\n\nThe Vite+ docs include a prompt for AI assistants. It's a useful starting point, but I adapt it to the project. My goal is concrete: the agent should use Vite+ to set up the app and not quietly abandon it after generating the first page.\n\nText\n\n`` Create a new React + TypeScript app on Vite using Vite+.\nFirst read the current `vp create` guide and run `vp help create`.\nInspect the target directory and do not overwrite existing files.\nChoose the current stable Vite+ release and one package manager.\nCreate the project with `vp create` using the React + TypeScript template.\nKeep its single lockfile. Do not add another linter or formatter\nunless there is a specific reason.\nAfter setup, run `vp install`, `vp check`, and relevant tests\nwith `vp test`, and run a production `vp build`. Add a test for the\nbehavior you implemented. If a check fails, fix the cause and rerun it.\nIn your final report, list the Vite+ version, commands, and actual results. ``\n\nI don't require a global install via `curl` in every project. For a one-off setup, something like `npx --package=vite-plus@1.3.0 vp create` is enough; in an established project, the agent can run the local CLI through the selected package manager. I don't ban `create-vite`, either: `vp create vite` uses that template. What matters is that the agent follows the intended setup and keeps one consistent toolchain.\n\nWhen I gave an agent free rein, I ended up with both Prettier and Oxfmt, three lockfiles, and unreliable CI. Banning a second formatter and requiring one lockfile aren't aesthetic preferences. They're two mistakes I don't want to clean up again.\n\n## One command gives me fast feedback\n\nAfter changing code, I run `vp check`. It checks formatting and lint; it checks TypeScript when both `typeAware` and `typeCheck` are enabled in the configuration. A new project created with `vp create` enables them by default. In an existing project, I verify that setting instead of assuming a green result also means the types are sound.\n\nHere's the difference from my old workflow:\n\nShell\n\n`1# Before: it depended on each project's scripts.\n2npm run format:check\n3npm run lint\n4npm run typecheck\n5\n6# Now, in a project with the corresponding Vite+ configuration.\n7vp check`\n\n`vp check --fix` can repair some findings automatically. After that, I read the diff and run the check again. A green lint result still doesn't tell me whether the app does the right thing. I need `vp test` for behavior and `vp build` to verify the application builds.\n\nI also put that rule in the repo's agent instructions. When I return to a project a week later, a new agent won't remember yesterday's chat. The repo still knows its commands.\n\nMarkdown\n\n`` 1## Checks before completing a task\n2\n3- After changing code, run `vp check` and fix any errors.\n4- After changing behavior, run the relevant tests with `vp test`.\n5- Before handing off a Vite app, run `vp build`.\n6- Review the diff after automatic fixes.\n7- Report the actual results; don't call a failed run complete. ``\n\nLocal instructions and Git hooks help, but they can be bypassed or disabled. I run the same checks in CI. On an experiment where I let an agent work unattended, human review before merging was still my responsibility.\n\n## What I measured\n\nIn a monorepo, CI went from 4 minutes to 50 seconds after I changed the workflow. A pre-commit check dropped from 11 seconds to under 2. Those are results from my projects, not a benchmark comparing Vite+ with another toolchain under identical conditions. Part of the gain comes from what runs and which files it checks; you won't automatically get those CI times with a different configuration.\n\n[![GitHub Actions benchmark output: classic toolchain, 10.441 seconds](https://janmichalek.com/_next/image?url=%2F_next%2Fstatic%2Fimmutable%2Fmedia%2Fclassic.1ga5hgr103r0d.webp&w=3840&q=75)](https://janmichalek.com/_next/static/immutable/media/classic.1ga5hgr103r0d.webp)\n\nGitHub Actions: the classic toolchain benchmark took 10.441 s.\n\n[![GitHub Actions benchmark output: Vite+, 1.356 seconds](https://janmichalek.com/_next/image?url=%2F_next%2Fstatic%2Fimmutable%2Fmedia%2Fviteplus.2-ywjv-drgop4.webp&w=3840&q=75)](https://janmichalek.com/_next/static/immutable/media/viteplus.2-ywjv-drgop4.webp)\n\nGitHub Actions: the Vite+ benchmark took 1.356 s.\n\nFor quick checks of changed files, I use `vp staged` and Git hooks managed with `vp hooks`. When different projects behave differently, `vp toolchain` shows me their active versions. `vp toolchain --global` shows the global installation. That's more useful for debugging than my old method: “I definitely updated it.”\n\n[![vp staged --verbose terminal output](https://janmichalek.com/_next/image?url=%2F_next%2Fstatic%2Fimmutable%2Fmedia%2Fvp-staged.2x_40n-pgog9_.webp&w=3840&q=75)](https://janmichalek.com/_next/static/immutable/media/vp-staged.2x_40n-pgog9_.webp)\n\nChecking the staged file with vp staged.\n\n[![vp toolchain terminal output showing Vite+ tool versions](https://janmichalek.com/_next/image?url=%2F_next%2Fstatic%2Fimmutable%2Fmedia%2Fvp-toolchain.1x699rowz2mdw.webp&w=3840&q=75)](https://janmichalek.com/_next/static/immutable/media/vp-toolchain.1x699rowz2mdw.webp)\n\nvp toolchain shows the active tool versions in the project.\n\nThere are two things to distinguish in a monorepo. `vp run` executes a `package.json` script or a task defined in `vite.config.ts`, and it can order work according to workspace dependencies. **Caching is not enabled automatically for `package.json` scripts.** You can enable it with, for example, `vp run --cache build`. Tasks defined in `vite.config.ts` are cached by default. I won't turn my CI timing into a promise that `vp run` alone makes every build faster.\n\n## Where it got awkward\n\n`vp migrate` ran on an older monorepo for about 4 minutes. It converted my ESLint, Prettier, and original tsup build setup, and nothing broke in my case. That doesn't mean every migration takes four minutes. You have to compare the result with the old lint, tests, hooks, and build output. Plugins and custom rules may still need manual work.\n\nAnother trap is the difference between a built-in command and a project script. `vp build` runs a Vite app build. `vp run build` runs the `build` script from `package.json` or a task with that name. In a Next.js project, the agent must not assume `vp build` replaces `next build`. The same distinction applies to `vp dev` and `vp run dev`. Vite+ can work with other templates, but that doesn't change what those commands do.\n\nThe third issue is version management. The global `vp env` can manage Node.js and package managers. I have three projects on three Node versions, and it made switching easier for me; if you don't want that, you can turn it off with `vp env off`. `vp upgrade` updates the global CLI, **not the local `vite-plus` package in every project automatically**. I wrote that explicitly in my agent instructions because the command name invites the opposite assumption.\n\n## Who gets Vite+ in my first prompt\n\nAnyone starting a new Vite app with AI doing the setup. The cost of standardizing is small here: choose one toolchain, put the check commands in the repo and CI, and the agent has a clear path from a code change to verification. Across three weeks and four projects, the main benefit for me was that I stopped explaining the basic commands over and over.\n\nI wouldn't blindly migrate a large existing app with a working build and test suite. For a framework with its own build, I'd first decide which parts of Vite+ I actually want to use. And if I already had a well documented, fast, stable stack, the promise of “one command” alone wouldn't convince me to replace it.\n\nNext time you start a Vite project, put `vp create` in the first prompt and ask for the outputs of `vp check`, tests, and the build as part of the definition of done. A screenshot of the finished app is nice. Passing checks tell you more.\n","body_html":"<h1 id=\"vite-changed-how-i-build-applications-with-ai-agents\">Vite+ changed how I build applications with AI agents</h1>\n<p>Jan Michálek</p>\n<p>One project had 47 development dependencies, seven config files, and a Markdown file explaining to the agent how to run everything. At 2 a.m., I was debugging a difference between local checks and CI. The code was done; the tooling around it wasn&#39;t. After three weeks with Vite+ across four projects, I have a simple rule for new Vite apps: put it in the first prompt I give the AI.</p>\n<h2 id=\"the-short-version\">The short version</h2>\n<ul><li>For a new Vite app, I have the agent create the project with <code>vp create</code>, then verify its work with <code>vp check</code>, <code>vp test</code>, and <code>vp build</code>.</li><li>Speed is nice, but the bigger win for me is one clear workflow for the agent, me, and CI.</li><li>For an existing project, I treat <code>vp migrate</code> as the start of a migration. I still review the diff, tests, and build behavior.</li></ul>\n<h2 id=\"a-slow-linter-wasn-t-the-problem\">A slow linter wasn&#39;t the problem</h2>\n<p>My commands were spread across ESLint, Prettier, TypeScript, a test runner, and <code>package.json</code> scripts. When I let an agent into the project, its first job was figuring out which command was the right one. I wrote instructions to explain that. Now I had another file to maintain. Excellent time saver, right?</p>\n<p>It wasn&#39;t just the number of files. Once, my local setup and CI checked a generated file differently. The agent saw one result; the pipeline saw another. Faster component generation doesn&#39;t fix that.</p>\n<p>Vite+ brings everyday tasks under <code>vp</code>: Vite for development and builds, Vitest for tests, Oxlint and Oxfmt for checks, tsdown for libraries, and Vite Task for tasks. You can keep their configuration in <code>vite.config.ts</code>. You still have <code>package.json</code>, <code>tsconfig</code>, and, depending on the project, framework configuration. “One file for absolutely everything” would look good on a banner and bad in a real repo.</p>\n<p>For a React app, these are the commands I need after creating the project:</p>\n<p>Shell</p>\n<p><code>1vp create vite -- --template react-ts\n2cd project-name\n3vp install\n4vp dev\n5vp check\n6vp test\n7vp build</code></p>\n<p>The commands above assume <code>vp</code> is available globally. A global install is optional; you can also run Vite+ as a local dependency through a package manager. <code>vp install</code> uses the package manager selected for the project, so Vite+ doesn&#39;t replace npm or pnpm.</p>\n<p><a href=\"https://janmichalek.com/_next/static/immutable/media/vp-create.18kdug08_k747.webp\" rel=\"nofollow ugc noopener\"><img src=\"https://janmichalek.com/_next/image?url=%2F_next%2Fstatic%2Fimmutable%2Fmedia%2Fvp-create.18kdug08_k747.webp&amp;w=3840&amp;q=75\" alt=\"vp create terminal output while setting up a project\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></a></p>\n<p>Creating a project with vp create.</p>\n<h2 id=\"i-don-t-let-the-agent-guess-what-done-means\">I don&#39;t let the agent guess what “done” means</h2>\n<p>The Vite+ docs include a prompt for AI assistants. It&#39;s a useful starting point, but I adapt it to the project. My goal is concrete: the agent should use Vite+ to set up the app and not quietly abandon it after generating the first page.</p>\n<p>Text</p>\n<p><code> Create a new React + TypeScript app on Vite using Vite+.\nFirst read the current `vp create` guide and run `vp help create`.\nInspect the target directory and do not overwrite existing files.\nChoose the current stable Vite+ release and one package manager.\nCreate the project with `vp create` using the React + TypeScript template.\nKeep its single lockfile. Do not add another linter or formatter\nunless there is a specific reason.\nAfter setup, run `vp install`, `vp check`, and relevant tests\nwith `vp test`, and run a production `vp build`. Add a test for the\nbehavior you implemented. If a check fails, fix the cause and rerun it.\nIn your final report, list the Vite+ version, commands, and actual results. </code></p>\n<p>I don&#39;t require a global install via <code>curl</code> in every project. For a one-off setup, something like <code>npx --package=vite-plus@1.3.0 vp create</code> is enough; in an established project, the agent can run the local CLI through the selected package manager. I don&#39;t ban <code>create-vite</code>, either: <code>vp create vite</code> uses that template. What matters is that the agent follows the intended setup and keeps one consistent toolchain.</p>\n<p>When I gave an agent free rein, I ended up with both Prettier and Oxfmt, three lockfiles, and unreliable CI. Banning a second formatter and requiring one lockfile aren&#39;t aesthetic preferences. They&#39;re two mistakes I don&#39;t want to clean up again.</p>\n<h2 id=\"one-command-gives-me-fast-feedback\">One command gives me fast feedback</h2>\n<p>After changing code, I run <code>vp check</code>. It checks formatting and lint; it checks TypeScript when both <code>typeAware</code> and <code>typeCheck</code> are enabled in the configuration. A new project created with <code>vp create</code> enables them by default. In an existing project, I verify that setting instead of assuming a green result also means the types are sound.</p>\n<p>Here&#39;s the difference from my old workflow:</p>\n<p>Shell</p>\n<p><code>1# Before: it depended on each project&#39;s scripts.\n2npm run format:check\n3npm run lint\n4npm run typecheck\n5\n6# Now, in a project with the corresponding Vite+ configuration.\n7vp check</code></p>\n<p><code>vp check --fix</code> can repair some findings automatically. After that, I read the diff and run the check again. A green lint result still doesn&#39;t tell me whether the app does the right thing. I need <code>vp test</code> for behavior and <code>vp build</code> to verify the application builds.</p>\n<p>I also put that rule in the repo&#39;s agent instructions. When I return to a project a week later, a new agent won&#39;t remember yesterday&#39;s chat. The repo still knows its commands.</p>\n<p>Markdown</p>\n<p><code> 1## Checks before completing a task\n2\n3- After changing code, run `vp check` and fix any errors.\n4- After changing behavior, run the relevant tests with `vp test`.\n5- Before handing off a Vite app, run `vp build`.\n6- Review the diff after automatic fixes.\n7- Report the actual results; don&#39;t call a failed run complete. </code></p>\n<p>Local instructions and Git hooks help, but they can be bypassed or disabled. I run the same checks in CI. On an experiment where I let an agent work unattended, human review before merging was still my responsibility.</p>\n<h2 id=\"what-i-measured\">What I measured</h2>\n<p>In a monorepo, CI went from 4 minutes to 50 seconds after I changed the workflow. A pre-commit check dropped from 11 seconds to under 2. Those are results from my projects, not a benchmark comparing Vite+ with another toolchain under identical conditions. Part of the gain comes from what runs and which files it checks; you won&#39;t automatically get those CI times with a different configuration.</p>\n<p><a href=\"https://janmichalek.com/_next/static/immutable/media/classic.1ga5hgr103r0d.webp\" rel=\"nofollow ugc noopener\"><img src=\"https://janmichalek.com/_next/image?url=%2F_next%2Fstatic%2Fimmutable%2Fmedia%2Fclassic.1ga5hgr103r0d.webp&amp;w=3840&amp;q=75\" alt=\"GitHub Actions benchmark output: classic toolchain, 10.441 seconds\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></a></p>\n<p>GitHub Actions: the classic toolchain benchmark took 10.441 s.</p>\n<p><a href=\"https://janmichalek.com/_next/static/immutable/media/viteplus.2-ywjv-drgop4.webp\" rel=\"nofollow ugc noopener\"><img src=\"https://janmichalek.com/_next/image?url=%2F_next%2Fstatic%2Fimmutable%2Fmedia%2Fviteplus.2-ywjv-drgop4.webp&amp;w=3840&amp;q=75\" alt=\"GitHub Actions benchmark output: Vite+, 1.356 seconds\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></a></p>\n<p>GitHub Actions: the Vite+ benchmark took 1.356 s.</p>\n<p>For quick checks of changed files, I use <code>vp staged</code> and Git hooks managed with <code>vp hooks</code>. When different projects behave differently, <code>vp toolchain</code> shows me their active versions. <code>vp toolchain --global</code> shows the global installation. That&#39;s more useful for debugging than my old method: “I definitely updated it.”</p>\n<p><a href=\"https://janmichalek.com/_next/static/immutable/media/vp-staged.2x_40n-pgog9_.webp\" rel=\"nofollow ugc noopener\"><img src=\"https://janmichalek.com/_next/image?url=%2F_next%2Fstatic%2Fimmutable%2Fmedia%2Fvp-staged.2x_40n-pgog9_.webp&amp;w=3840&amp;q=75\" alt=\"vp staged --verbose terminal output\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></a></p>\n<p>Checking the staged file with vp staged.</p>\n<p><a href=\"https://janmichalek.com/_next/static/immutable/media/vp-toolchain.1x699rowz2mdw.webp\" rel=\"nofollow ugc noopener\"><img src=\"https://janmichalek.com/_next/image?url=%2F_next%2Fstatic%2Fimmutable%2Fmedia%2Fvp-toolchain.1x699rowz2mdw.webp&amp;w=3840&amp;q=75\" alt=\"vp toolchain terminal output showing Vite+ tool versions\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></a></p>\n<p>vp toolchain shows the active tool versions in the project.</p>\n<p>There are two things to distinguish in a monorepo. <code>vp run</code> executes a <code>package.json</code> script or a task defined in <code>vite.config.ts</code>, and it can order work according to workspace dependencies. <strong>Caching is not enabled automatically for <code>package.json</code> scripts.</strong> You can enable it with, for example, <code>vp run --cache build</code>. Tasks defined in <code>vite.config.ts</code> are cached by default. I won&#39;t turn my CI timing into a promise that <code>vp run</code> alone makes every build faster.</p>\n<h2 id=\"where-it-got-awkward\">Where it got awkward</h2>\n<p><code>vp migrate</code> ran on an older monorepo for about 4 minutes. It converted my ESLint, Prettier, and original tsup build setup, and nothing broke in my case. That doesn&#39;t mean every migration takes four minutes. You have to compare the result with the old lint, tests, hooks, and build output. Plugins and custom rules may still need manual work.</p>\n<p>Another trap is the difference between a built-in command and a project script. <code>vp build</code> runs a Vite app build. <code>vp run build</code> runs the <code>build</code> script from <code>package.json</code> or a task with that name. In a Next.js project, the agent must not assume <code>vp build</code> replaces <code>next build</code>. The same distinction applies to <code>vp dev</code> and <code>vp run dev</code>. Vite+ can work with other templates, but that doesn&#39;t change what those commands do.</p>\n<p>The third issue is version management. The global <code>vp env</code> can manage Node.js and package managers. I have three projects on three Node versions, and it made switching easier for me; if you don&#39;t want that, you can turn it off with <code>vp env off</code>. <code>vp upgrade</code> updates the global CLI, <strong>not the local <code>vite-plus</code> package in every project automatically</strong>. I wrote that explicitly in my agent instructions because the command name invites the opposite assumption.</p>\n<h2 id=\"who-gets-vite-in-my-first-prompt\">Who gets Vite+ in my first prompt</h2>\n<p>Anyone starting a new Vite app with AI doing the setup. The cost of standardizing is small here: choose one toolchain, put the check commands in the repo and CI, and the agent has a clear path from a code change to verification. Across three weeks and four projects, the main benefit for me was that I stopped explaining the basic commands over and over.</p>\n<p>I wouldn&#39;t blindly migrate a large existing app with a working build and test suite. For a framework with its own build, I&#39;d first decide which parts of Vite+ I actually want to use. And if I already had a well documented, fast, stable stack, the promise of “one command” alone wouldn&#39;t convince me to replace it.</p>\n<p>Next time you start a Vite project, put <code>vp create</code> in the first prompt and ask for the outputs of <code>vp check</code>, tests, and the build as part of the definition of done. A screenshot of the finished app is nice. Passing checks tell you more.</p>","headings":[{"level":1,"text":"Vite+ changed how I build applications with AI agents","id":"vite-changed-how-i-build-applications-with-ai-agents"},{"level":2,"text":"The short version","id":"the-short-version"},{"level":2,"text":"A slow linter wasn't the problem","id":"a-slow-linter-wasn-t-the-problem"},{"level":2,"text":"I don't let the agent guess what “done” means","id":"i-don-t-let-the-agent-guess-what-done-means"},{"level":2,"text":"One command gives me fast feedback","id":"one-command-gives-me-fast-feedback"},{"level":2,"text":"What I measured","id":"what-i-measured"},{"level":2,"text":"Where it got awkward","id":"where-it-got-awkward"},{"level":2,"text":"Who gets Vite+ in my first prompt","id":"who-gets-vite-in-my-first-prompt"}]}}