Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": [
"chrome-devtools-mcp@0.21.0",
"--browserUrl",
"http://127.0.0.1:9223"
]
}
}
}
84 changes: 84 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# AGENTS.md

## Commands

```bash
npm start # start dev server (electron-forge)
npm run lint # eslint
npm run typecheck # tsc --noEmit
npm test # vitest run
npm run test:watch # vitest watch
npm run format # prettier
```

## Inspecting the Running App

`npm start` enables CDP remote debugging on port 9223 (port 9222 is reserved for the recorder's CDP browser).

The project has a `chrome-devtools` MCP server configured in `.mcp.json` that connects to port 9223. When the app is running, use the MCP tools (`take_snapshot`, `click`, `fill`, `navigate_page`, `take_screenshot`, `evaluate_script`, etc.) to interact with the app. Prefer `take_snapshot` over `take_screenshot` for reading UI state.

### Navigation

The app uses hash routing:

```
#/ # Home
#/recorder # Recorder
#/generator/<name>.k6g # Generator (URL-encoded name)
#/recording-previewer/<name>.har # Recording previewer
#/validator/<name>.js # Validator
#/editor/<name>.k6b # Browser test editor
#/data-file/<name> # Data file viewer
```

### IPC APIs

The renderer exposes `window.studio` with IPC APIs (accessible via `evaluate_script`): `auth`, `proxy`, `browser`, `script`, `data`, `har`, `ui`, `generator`, `browserTest`, `app`, `log`, `settings`, `browserRemote`, `cloud`, `ai`.

## Architecture

Electron desktop app for generating k6 test scripts. Three main components:

1. **Recorder** - captures browser traffic via mitmproxy → HAR files
2. **Generator** - transforms HAR + rules → k6 scripts
3. **Validator** - runs single VU test to debug scripts

### Process Model

- **Main process**: `src/main.ts` - IPC handlers, proxy/browser management
- **Preload**: `src/preload.ts` - exposes `window.studio` API via contextBridge
- **Renderer**: `src/App.tsx` - React frontend

### Key Directories

- `src/handlers/` - IPC handlers by domain (ai/, proxy/, browser/, generator/)
- `src/store/` - Zustand stores with Immer middleware
- `src/codegen/` - k6 script generation from HAR + rules
- `src/views/` - main pages (Home, Recorder, Generator, Validator, RecordingPreviewer, BrowserTestEditor, DataFile)
- `src/schemas/` - Zod schemas for validation

### IPC Pattern

Handlers follow `domain:action` naming. Each handler has:
- `index.ts` - ipcMain.handle/on registration
- `preload.ts` - contextBridge exposure
- `types.ts` - TypeScript interfaces

## Code Style

- Use `@/` path alias for src imports
- Zustand stores: always use Immer, select specific slices to avoid re-renders
- React Hook Form + Zod for form validation
- Radix UI + Emotion for styling
- Event handlers: `handleX` prefix
- Early returns to reduce nesting
- Avoid `any` - use `unknown` with type guards

## Commit Messages

Conventional Commits format. Sentence case, imperative verb.
```
feat: Add type column to WebLogView
fix: Application crashes when opening HAR file
```

1 change: 1 addition & 0 deletions CLAUDE.md
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
},
"scripts": {
"preinstall": "node install-k6.js",
"start": "electron-forge start",
"start": "electron-forge start -- --remote-debugging-port=9223",
"start:extension": "STANDALONE_EXTENSION=true vite --config vite.extension.config.mts",
"watch:extension": "vite --config vite.extension.config.mts",
"package": "electron-forge package",
Expand Down
Loading