Skip to content

Commit 8255acb

Browse files
jong-kyungfengmk2
andauthored
docs: improve agent repository guidance (#1670)
## Summary - Add a root `AGENTS.md` as the primary AI-agent guide for the vite-plus repository - Use oxc-resolver's [`AGENTS.md` ](https://github.com/oxc-project/oxc-resolver/blob/main/AGENTS.md)as a structural reference for project overview, architecture, workflow, conventions, testing, debugging, and agent tips - Convert `CLAUDE.md` into a compatibility pointer to `AGENTS.md` ## Details This updates the root agent guidance so AI coding assistants can orient around Vite+ as a unified web toolchain rather than a Vite Task-only codebase. The new guide covers: - project overview and key technologies - repo architecture map - where to start for common change areas - `vp` built-ins vs `vp run` / `run.tasks` - setup, build, validation, and snap-test guidance - Rust and TypeScript convention references - debugging anchors and common agent pitfalls `CLAUDE.md` now delegates to `AGENTS.md` to keep one source of truth. Co-authored-by: MK (fengmk2) <fengmk2@gmail.com>
1 parent de5f8d9 commit 8255acb

2 files changed

Lines changed: 193 additions & 144 deletions

File tree

AGENTS.md

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
# AI Agent Guidelines for Vite-Plus
2+
3+
This document helps AI coding assistants work on the **vite-plus repository**. It is repo-specific: `CLAUDE.md` points here for compatibility, while `packages/cli/AGENTS.md` is the generated guidance shipped to projects that use Vite+.
4+
5+
Use this file to orient quickly, choose the right code area, and pick validation that matches the change. Prefer canonical source files and docs over duplicating details here.
6+
7+
## Project Overview
8+
9+
Vite+ is **the unified toolchain for the web** behind the `vp` CLI. It combines Vite, Rolldown, Vitest, tsdown, Oxlint, Oxfmt, Vite Task, runtime management, package-manager workflows, project creation/migration, and monorepo task caching.
10+
11+
### Key Technologies
12+
13+
- **TypeScript / Node ESM**: CLI entrypoints, create/migrate/config/staged commands, docs tooling, and package exports.
14+
- **Rust 2024**: global `vp` binary, local CLI binding, package-manager/runtime helpers, config extraction, shared utilities.
15+
- **NAPI**: bridges the TypeScript CLI package to Rust command implementations under `packages/cli/binding/`.
16+
- **pnpm workspaces**: local packages under `packages/*`.
17+
- **Vite+ config**: `vite.config.ts` configures lint, format, test, and run tasks for this repo.
18+
19+
## Architecture
20+
21+
High-signal repo map:
22+
23+
```
24+
vite-plus/
25+
├── packages/cli/ # Published vite-plus package, JS CLI, docs, templates, snap tests, NAPI binding
26+
│ ├── src/bin.ts # JS entrypoint and local CLI dispatch
27+
│ ├── src/utils/agent.ts # Generated agent-file marker/update logic
28+
│ ├── binding/ # Rust NAPI binding used by the local CLI
29+
│ ├── snap-tests/ # Local CLI output snapshots
30+
│ └── snap-tests-global/ # Global CLI output snapshots
31+
├── packages/core/ # @voidzero-dev/vite-plus-core bundled toolchain surfaces
32+
├── packages/test/ # @voidzero-dev/vite-plus-test Vitest-compatible exports
33+
├── packages/prompts/ # Prompt UI/helpers package
34+
├── packages/tools/ # Repo tooling
35+
├── crates/vite_global_cli/ # Standalone global vp binary and top-level command routing
36+
├── crates/vite_pm_cli/ # Package-manager command surface
37+
├── crates/vite_install/ # Package-manager detection/install behavior
38+
├── crates/vite_js_runtime/ # Managed Node.js runtime support
39+
├── crates/vite_static_config/ # Static extraction of vite.config.* data
40+
└── crates/vite_shared/ # Shared Rust env config, tracing, output, utilities
41+
```
42+
43+
## Where to Start
44+
45+
- **JS-backed CLI behavior**: start at `packages/cli/src/bin.ts` and nearby `packages/cli/src/**` files.
46+
- **Local CLI / NAPI-backed behavior**: start at `packages/cli/binding/src/lib.rs` and `packages/cli/binding/src/cli/mod.rs`.
47+
- **Global `vp` routing, aliases, and runtime bootstrap**: start at `crates/vite_global_cli/src/main.rs` and `crates/vite_global_cli/src/cli.rs`.
48+
- **Package-manager commands**: start at `crates/vite_pm_cli/` and `crates/vite_install/`.
49+
- **Managed Node runtime / shims**: start at `crates/vite_js_runtime/`.
50+
- **Static `vite.config.ts` extraction**: start at `crates/vite_static_config/README.md` and `packages/cli/src/resolve-vite-config.ts`.
51+
- **Bundled toolchain surfaces**: start with `packages/core/BUNDLING.md`, `packages/cli/BUNDLING.md`, and `packages/test/BUNDLING.md`.
52+
- **Generated project agent guidance**: `packages/cli/AGENTS.md` and `packages/cli/src/utils/agent.ts`; do not edit these when the task is only to improve root repo guidance.
53+
- **Product/repo docs**: root contributor docs live at the repo root and `docs/`; CLI package docs live under `packages/cli/docs/`; generated agent guidance is separate.
54+
- **CLI output behavior**: inspect the relevant code plus `packages/cli/snap-tests/` or `packages/cli/snap-tests-global/`.
55+
56+
## Command and Config Model
57+
58+
`vp` has built-in toolchain commands and a separate task runner:
59+
60+
```bash
61+
vp dev # Vite dev server
62+
vp build # Vite + Rolldown build
63+
vp test # Bundled Vitest
64+
vp lint # Oxlint
65+
vp fmt # Oxfmt
66+
vp check # Format/lint/type-check workflow
67+
vp pack # Library/app packaging
68+
69+
vp run build # Run a package.json script or configured run task
70+
vpr build # Shorthand for vp run build
71+
```
72+
73+
Important distinctions:
74+
75+
- `vp test` is a built-in command. `vp run test` runs a `package.json` script or `vite.config.ts` run task named `test`.
76+
- Existing `package.json` scripts are first-class `vp run <script>` targets and are not cached by default.
77+
- Define `run.tasks` in `vite.config.ts` when a task needs explicit command config, default caching, dependencies, input tracking, or environment tracking.
78+
- A task name can come from `package.json` or `vite.config.ts`, but not both.
79+
- Do not introduce `vite-task.json`; current Vite+ task configuration lives under `run` in `vite.config.ts`.
80+
- Do not run `cargo test -p vite_task` in this repo; Vite Task crates are git dependencies, not local workspace members.
81+
82+
Reference: `packages/cli/docs/guide/run.md` and `packages/cli/docs/config/run.md`.
83+
84+
## Development Workflow
85+
86+
### Initial setup
87+
88+
```bash
89+
just init
90+
```
91+
92+
### Build and install from source
93+
94+
```bash
95+
just build # Release build for Vite+
96+
pnpm bootstrap-cli # Build packages, compile vp/NAPI, and install the global CLI
97+
vp --version
98+
```
99+
100+
Use `pnpm bootstrap-cli` when you need to validate the installed global CLI at `~/.vite-plus`.
101+
102+
### Routine validation
103+
104+
Choose checks by change type:
105+
106+
| Change type | Useful validation |
107+
| --- | --- |
108+
| Docs-only / agent-guide edits | Check referenced paths and commands; run `git diff --check -- <files>` |
109+
| TypeScript or JS CLI behavior | `vp check`, `pnpm test:unit`, plus focused package tests when available |
110+
| Rust CLI/crate behavior | `just check`, `just test`, `just lint` |
111+
| CLI output or command UX | Relevant snap tests, then inspect `git diff` for `snap.txt` changes |
112+
| Global CLI behavior | `pnpm bootstrap-cli`, `vp --version`, then relevant global snap tests |
113+
| Release/build behavior | `just build` |
114+
| Pre-merge/full validation | `pnpm bootstrap-cli && pnpm test && git status` |
115+
116+
Use `vp check --fix` only when you intentionally want formatting or lint fixes applied.
117+
118+
### Snap tests
119+
120+
Snap tests live in `packages/cli/snap-tests/` and `packages/cli/snap-tests-global/`.
121+
122+
```bash
123+
pnpm -F vite-plus snap-test
124+
pnpm -F vite-plus snap-test-local
125+
pnpm -F vite-plus snap-test-local <name-filter>
126+
pnpm -F vite-plus snap-test-global
127+
pnpm -F vite-plus snap-test-global <name-filter>
128+
```
129+
130+
Snap tests regenerate `snap.txt` and can exit successfully even when output changed. Always inspect `git diff` afterward. Ensure fixture inputs are committed or created by the test setup, not accidentally supplied by ignored local files.
131+
132+
## Code Conventions
133+
134+
### Rust
135+
136+
Reference these files instead of duplicating rules here:
137+
138+
- `.clippy.toml` — custom lint restrictions and disallowed Rust APIs/macros.
139+
- `crates/vite_shared/src/output.rs` — shared user-facing output helpers.
140+
- `crates/vite_shared/src/env_config.rs` — test-scoped environment configuration helpers.
141+
- `crates/vite_command/src/lib.rs` and `crates/vite_global_cli/src/cli.rs` — examples of `vite_path` usage in local Rust code.
142+
143+
Prefer shared output helpers for user-facing messages and match nearby command style. New Rust code should satisfy the custom clippy restrictions.
144+
145+
### TypeScript
146+
147+
Reference these files instead of duplicating rules here:
148+
149+
- `packages/cli/src/utils/terminal.ts` — shared user-facing terminal output helpers.
150+
- `tsconfig.json` — TypeScript compiler settings.
151+
- `vite.config.ts` — repository lint, format, test, and task configuration.
152+
- `packages/cli/src/utils/agent.ts` and `packages/cli/AGENTS.md` — generated/migrated project agent guidance.
153+
154+
## Testing Strategy
155+
156+
Use the validation matrix above as the source of truth. For behavior-bearing changes, find the nearest existing tests before editing and add or update coverage in the same area. For CLI output changes, pair focused tests with snap-test diff review. For documentation-only changes, verify referenced paths, commands, and links instead of running unrelated suites.
157+
158+
## Common Pitfalls
159+
160+
- **Treating Vite+ as only Vite Task**: Vite Task is integrated, but this repo spans CLI, runtime, package management, bundled packages, create/migrate, docs, and upstream integration.
161+
- **Looking for local `crates/vite_task`**: it does not exist here. Check `Cargo.toml` for git dependency wiring.
162+
- **Confusing built-ins with scripts**: `vp test` and `vp run test` can do different things.
163+
- **Trusting snap-test exit status alone**: always inspect snapshot diffs.
164+
165+
## Debugging
166+
167+
- Use `vp --version` to see bundled tool versions before researching tool behavior.
168+
- Use `vp help` and `vp <command> --help` to inspect command surfaces.
169+
- For command routing bugs, compare the global path (`crates/vite_global_cli/`) with the local/NAPI path (`packages/cli/src/bin.ts`, `packages/cli/binding/`).
170+
- For config-loading bugs, compare the static extractor (`crates/vite_static_config/`) with the JS resolver fallback (`packages/cli/src/resolve-vite-config.ts`).
171+
- For package-manager behavior, inspect `crates/vite_pm_cli/`, `crates/vite_install/`, and related snap tests.
172+
- For `vp check`, lint, format, or type-check behavior, validate end-to-end because bundled-tool routing can hide silent config drift.
173+
174+
## AI Assistant Tips
175+
176+
- Identify the ownership layer before editing: JS CLI, Rust global CLI, NAPI/local CLI, package manager, runtime, config, docs, or bundled packages.
177+
- Prefer source references over copied explanations when adding guidance; this file should help agents navigate, not replace the docs.
178+
- Keep diffs scoped to the requested area and leave unrelated tracked or untracked files alone.
179+
180+
## References
181+
182+
- Product overview: `README.md`
183+
- Contributor workflow: `CONTRIBUTING.md`
184+
- Root scripts: `package.json`
185+
- Repo config: `vite.config.ts`
186+
- Vite+ guide: `docs/guide/index.md`
187+
- Run guide: `packages/cli/docs/guide/run.md`
188+
- Run config: `packages/cli/docs/config/run.md`
189+
- CLI package architecture: `packages/cli/BUNDLING.md`
190+
- Core package architecture: `packages/core/BUNDLING.md`
191+
- Test package architecture: `packages/test/BUNDLING.md`
192+
- Generated agent guidance: `packages/cli/AGENTS.md`, `packages/cli/src/utils/agent.ts`

CLAUDE.md

Lines changed: 1 addition & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -1,144 +1 @@
1-
# Vite-Plus
2-
3-
A monorepo task runner (like nx/turbo) with intelligent caching and dependency resolution.
4-
5-
## Core Concept
6-
7-
**Task Execution**: Run tasks across monorepo packages with automatic dependency ordering.
8-
9-
```bash
10-
# Built-in commands
11-
vp build # Run Vite build (dedicated command)
12-
vp test # Run Vitest (dedicated command)
13-
vp lint # Run oxlint (dedicated command)
14-
15-
# Run tasks across packages (explicit mode)
16-
vp run -r build # recursive with topological ordering
17-
vp run app#build web#build # specific packages
18-
vp run -r --no-topological build # recursive without implicit deps
19-
20-
# Run task in current package (implicit mode - for non-built-in tasks)
21-
vp run dev # runs dev script from package.json
22-
```
23-
24-
## Key Architecture
25-
26-
- **Entry**: `crates/vite_task/src/lib.rs` - CLI parsing and main logic
27-
- **Workspace**: `crates/vite_task/src/config/workspace.rs` - Loads packages, creates task graph
28-
- **Task Graph**: `crates/vite_task/src/config/task_graph_builder.rs` - Builds dependency graph
29-
- **Execution**: `crates/vite_task/src/schedule.rs` - Executes tasks in dependency order
30-
31-
## Task Dependencies
32-
33-
1. **Explicit** (always applied): Defined in `vite-task.json`
34-
35-
```json
36-
{
37-
"tasks": {
38-
"test": {
39-
"command": "jest",
40-
"dependsOn": ["build", "lint"]
41-
}
42-
}
43-
}
44-
```
45-
46-
2. **Implicit** (when `--topological`): Based on package.json dependencies
47-
- If A depends on B, then A#build depends on B#build automatically
48-
49-
## Key Features
50-
51-
- **Topological Flag**: Controls implicit dependencies from package relationships
52-
- Default: ON for `--recursive`, OFF otherwise
53-
- Toggle with `--no-topological` to disable
54-
55-
- **Boolean Flags**: All support `--no-*` pattern for explicit disable
56-
- Example: `--recursive` vs `--no-recursive`
57-
- Conflicts handled by clap
58-
- If you want to add a new boolean flag, follow this pattern
59-
60-
## Path Type System
61-
62-
- **Type Safety**: All paths use typed `vite_path` instead of `std::path` for better safety
63-
- **Absolute Paths**: `vite_path::AbsolutePath` / `AbsolutePathBuf`
64-
- **Relative Paths**: `vite_path::RelativePath` / `RelativePathBuf`
65-
66-
- **Usage Guidelines**:
67-
- Use methods such as `strip_prefix`/`join` provided in `vite_path` for path operations instead of converting to std paths
68-
- Only convert to std paths when interfacing with std library functions, and this should be implicit in most cases thanks to `AsRef<Path>` implementations
69-
- Add necessary methods in `vite_path` instead of falling back to std path types
70-
71-
- **Converting from std paths** (e.g., `TempDir::path()`):
72-
73-
```rust
74-
let temp_path = AbsolutePathBuf::new(temp_dir.path().to_path_buf()).unwrap();
75-
```
76-
77-
- **Function signatures**: Prefer `&AbsolutePath` over `&std::path::Path`
78-
79-
- **Passing to std functions**: `AbsolutePath` implements `AsRef<Path>`, use `.as_path()` when explicit `&Path` is required
80-
81-
## Clippy Rules
82-
83-
All **new** Rust code must follow the custom clippy rules defined in `.clippy.toml` (disallowed types, macros, and methods). Existing code may not fully comply due to historical reasons.
84-
85-
## CLI Output
86-
87-
All user-facing output must go through shared output modules instead of raw print calls.
88-
89-
- **Rust**: Use `vite_shared::output` functions (`info`, `warn`, `error`, `note`, `success`) — never raw `println!`/`eprintln!` (enforced by clippy `disallowed-macros`)
90-
- **TypeScript**: Use `packages/cli/src/utils/terminal.ts` functions (`infoMsg`, `warnMsg`, `errorMsg`, `noteMsg`, `log`) — never raw `console.log`/`console.error`
91-
92-
## Git Workflow
93-
94-
- Run `vp check --fix` before committing to format and lint code
95-
96-
## Quick Reference
97-
98-
- **Compound Commands**: `"build": "tsc && rollup"` splits into subtasks
99-
- **Task Format**: `package#task` (e.g., `app#build`)
100-
- **Path Types**: Use `vite_path` types instead of `std::path` types for type safety
101-
- **Tests**: Run `cargo test -p vite_task` to verify changes
102-
- **Debug**: Use `--debug` to see cache operations
103-
104-
## Tests
105-
106-
- Run `cargo test` to execute all tests
107-
- You never need to run `pnpm install` in the test fixtures dir, vite-plus should able to load and parse the workspace without `pnpm install`.
108-
109-
### Environment Variables in Tests
110-
111-
- **Prefer `EnvConfig::test_scope()`**: For tests needing custom config values (VP_HOME, npm registry, etc.), use thread-local `EnvConfig::test_scope()` or `EnvConfig::test_guard()` from `vite_shared` — no `unsafe`, no `#[serial]`, full parallelism
112-
- **`#[serial]` required for `std::env::set_var`/`remove_var`**: Any test that directly modifies process env vars (PATH, VP_SHIM_TOOL, etc.) MUST have `#[serial_test::serial]` to prevent concurrent access races
113-
- **Clean up ALL related env vars**: When clearing env vars before a test, clear ALL vars that the function under test reads — not just the one being tested
114-
115-
## Build
116-
117-
- Run `pnpm bootstrap-cli` from the project root to build all packages and install the global CLI
118-
- This builds all `@voidzero-dev/*` and `vite-plus` packages
119-
- Compiles the Rust NAPI bindings and the `vp` Rust binary
120-
- Installs the CLI globally to `~/.vite-plus/`
121-
122-
## Snap Tests
123-
124-
Snap tests are located in `packages/cli/snap-tests/` (local CLI) and `packages/cli/snap-tests-global/` (global CLI). Each test case is a directory containing:
125-
126-
- `package.json` - Package configuration for the test
127-
- `steps.json` - Commands to run and environment variables
128-
- `src/` - Source files for the test
129-
- `snap.txt` - Expected output (generated/updated by running the test)
130-
131-
```bash
132-
# Run all snap tests (local + global)
133-
pnpm -F vite-plus snap-test
134-
135-
# Run only local CLI snap tests
136-
pnpm -F vite-plus snap-test-local
137-
pnpm -F vite-plus snap-test-local <name-filter>
138-
139-
# Run only global CLI snap tests
140-
pnpm -F vite-plus snap-test-global
141-
pnpm -F vite-plus snap-test-global <name-filter>
142-
```
143-
144-
The snap test will automatically generate/update the `snap.txt` file with the command outputs. It exits with zero status even if there are output differences; you need to manually check the diffs(`git diff`) to verify correctness.
1+
@AGENTS.md

0 commit comments

Comments
 (0)