Files
Kang 1a41b06470 docs: update CLAUDE.md with enhanced development commands and web deployment instructions
- Expanded development commands for frontend and backend, including new build and test commands.
- Added detailed instructions for web deployment and server management.
- Improved organization of commands for better clarity and usability.
2026-10-07 14:15:36 +08:00

475 lines
13 KiB
Markdown

# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Development commands
### Root app
- `pnpm install` — install JS dependencies
- `pnpm dev` — run the Vite frontend only
- `pnpm tauri dev` — run the full desktop app in Tauri dev mode
- `pnpm build` — build the desktop frontend
- `pnpm build:web` — type-check and build the frontend for Web deployment
- `pnpm tauri build` — build the production desktop bundle
- `pnpm test` — run frontend Vitest tests
- `pnpm lint` — run frontend lint checks
- `pnpm format` — apply frontend formatting
- `pnpm format:check` — check frontend formatting
- `pnpm i18n:check` — check locale JSON formatting
- `pnpm i18n:fix` — rewrite locale JSON formatting
- `pnpm i18n:keys` — check locale key consistency
- `pnpm version-sync` — sync version numbers across app files
- `pnpm release` — version sync + production Tauri build
### Rust / Tauri backend
- `cargo fmt --manifest-path src-tauri/Cargo.toml` — format Rust code
- `cargo clippy --manifest-path src-tauri/Cargo.toml --all-targets` — lint Rust code
- `cargo test --manifest-path src-tauri/Cargo.toml` — run desktop backend tests
- `cargo test --manifest-path src-tauri/Cargo.toml <test_name>` — run a single backend test
- `cargo test --manifest-path src-tauri/crates/otp/Cargo.toml` — run OTP crate tests
### Web deployment
- `pnpm web:build:server` — build the Web Rust server
- `pnpm web:serve` — run the Web server locally
- `pnpm test:web` — run Web backend tests
- `pnpm test:web:e2e` — run Web deployment E2E tests
Web deployment details are documented in:
- `docs/web-deployment.md`
- `deploy/web/README.md`
### Docs site
- `pnpm --dir docs-site start` — serve all locales
- `pnpm --dir docs-site start:zh` — run zh-CN docs dev server
- `pnpm --dir docs-site start:en` — run English docs dev server
- `pnpm --dir docs-site start:ko` — run Korean docs dev server
- `pnpm --dir docs-site build` — build the docs site
## Big-picture architecture
NyaTerm is primarily a Tauri 2 desktop application built with React, TypeScript, and Rust.
The repository also supports a Web deployment runtime. The React frontend is shared, while backend access is adapted per runtime.
```text
React / TypeScript
|
src/lib/backend/api.ts
|
+----+----------------+
| |
Desktop Web
| |
Tauri IPC HTTP / SSE / WS
| |
src-tauri/src/ nyaterm-web
| |
+------ shared -------+
nyaterm-core
```
For ordinary Desktop-specific work, keep the existing Tauri architecture and do not over-generalize solely for Web.
When changing shared frontend backend abstractions or shared Rust core logic, consider both runtimes.
### Frontend backend abstraction
Shared frontend code should normally access backend functionality through `src/lib/backend/`.
Important files:
- `src/lib/backend/api.ts` — common `invoke`, `listen`, and `emit` entry point
- `src/lib/backend/runtime.ts` — runtime detection and capability checks
- `src/lib/backend/tauri.ts` — Desktop/Tauri adapter
- `src/lib/backend/http.ts` — Web HTTP/SSE/WebSocket adapter
- `src/lib/backend/platform/` — runtime-specific platform API wrappers
Avoid adding scattered direct `@tauri-apps/api` calls where an existing shared adapter should be used.
Do not assume a shared React component implies identical Desktop and Web capabilities. Check `runtime.ts` before changing capability gating.
### Desktop backend
The main Desktop backend lives under:
```text
src-tauri/src/
```
Tauri commands are registered centrally in `src-tauri/src/lib.rs` and grouped by concern under `src-tauri/src/cmd/`.
Desktop-specific functionality includes areas such as:
- native windows
- Local Shell
- Serial
- RDP
- tray
- native file integration
- global shortcuts
- updater
- OS-specific integrations
### Shared Rust core
Reusable backend/domain logic shared by Desktop and Web is located under:
```text
src-tauri/crates/nyaterm-core/
```
When backend behavior genuinely applies to both runtimes, prefer sharing it through `nyaterm-core` instead of duplicating implementations.
Do not move Desktop-only behavior into the shared core merely for architectural symmetry.
### Web backend
The Web server lives under:
```text
src-tauri/crates/nyaterm-web/
```
It provides browser-compatible backend access using HTTP, SSE, and WebSocket transports.
Web support is intentionally a subset of the Desktop application. Do not assume every Desktop capability has or needs an equivalent Web implementation.
## Window model
`src/main.tsx` decides between the main application and child-page/window flows.
The main application uses the normal app provider and `App.tsx`.
Child flows use `ChildAppProvider` and `ChildWindowRouter`.
Desktop child windows are coordinated through `src/lib/windowManager.ts`.
Native Tauri window APIs are Desktop-specific. When changing shared window-related code, ensure browser mode does not accidentally call native window APIs.
## Frontend state model
`src/context/AppContext.tsx` and `src/context/AppProvider.tsx` are central to application state.
They cover areas such as:
- tab/session workspace state
- UI and application settings
- saved connections and groups
- startup workspace restoration
`src/context/ChildAppProvider.tsx` is the lighter provider used by child-page/window flows.
`src/context/TransferContext.tsx` tracks file transfer state and backend transfer notifications.
## Workspace / terminal model
The terminal workspace has two distinct layers:
- `src/lib/workspaceTabs.ts` manages the persistent logical tab and pane model
- `src/lib/tabWindows.ts` manages the runtime multi-tab / split-window layout
Do not confuse persistent workspace state with runtime terminal layout.
`src/App.tsx` is the main application shell.
`src/components/terminal/XTerminal.tsx` is the central xterm.js integration point.
Terminal issues may involve:
```text
transport
-> backend session I/O
-> IPC / Web transport
-> frontend event handling
-> buffering / backpressure
-> xterm rendering
-> user interaction
```
Do not attribute terminal performance or correctness problems to the network, Rust, WebView, or xterm without tracing the actual path.
## Backend runtime model
Desktop backend state and managers are constructed in `src-tauri/src/lib.rs`.
Backend functionality is grouped under `src-tauri/src/core/` and related command modules.
Relevant areas include:
- SSH
- SFTP
- Local PTY
- Telnet
- Serial
- RDP
- VNC
- tunnels
- recording
- AI
- monitoring
- sync / backup
- plugins
- storage
When investigating async Rust behavior, check:
- task ownership
- channels
- cancellation
- locks
- reconnect
- shutdown
- session lifecycle
## SSH / auth / transfer details
SSH-related work should consider:
- connection lifecycle
- authentication
- saved credentials
- keyboard-interactive / OTP
- host-key verification
- known hosts
- proxies
- jump hosts
- tunnels
- SFTP
- reconnect
- session ownership
Do not bypass host-key verification or credential encryption.
File-transfer behavior differs between Desktop and Web. Desktop may use native paths, file watchers, native dialogs, and child windows, while Web uses browser-compatible upload/download and internal editing flows.
## AI Assistant
The AI Assistant includes Ask and Agent-style workflows.
Relevant areas include:
- streaming
- provider compatibility
- terminal context
- session mentions
- command cards
- command risk levels
- approvals
- approved execution
- cancellation
- history
- audit
- prompt redaction
High-risk commands must continue to use the existing approval mechanism.
Web currently supports a more limited AI capability set than Desktop. Do not expose Desktop Agent/MCP behavior in Web merely because shared UI is available.
## Persistence model
Desktop data normally lives under:
```text
~/.nyaterm/
```
The primary store is `nyaterm.redb`.
Sensitive values are encrypted before storage.
When changing persistence, consider:
- backward compatibility
- migrations
- backup/import/export
- cloud-sync snapshots
- existing legacy migration paths
Web uses its own data directory configured through `NYATERM_WEB_DATA_DIR`. Do not assume Web data lives under the Desktop user's `~/.nyaterm/`.
Security-sensitive code must not:
- store passwords or secrets in plaintext
- log credentials or private keys
- bypass master-password or server-key protections
- weaken host-key verification
- break compatibility with existing encrypted data
## Plugins
Plugin-related code spans:
```text
plugins/
src/components/plugins/
src/lib/plugins.ts
src/lib/pluginBridge.ts
src/lib/pluginIpc.ts
src-tauri/crates/nyaterm-plugin-runtime/
```
Web currently supports only a subset of plugin functionality.
Do not assume native plugin installation or execution is browser-compatible.
## Project-specific guidance
### UI
Prefer existing shadcn/ui patterns and components.
Shared UI components live under:
```text
src/components/ui/
```
### Internationalization
When changing user-facing text, update all supported locale files:
- `src/i18n/locales/en.json`
- `src/i18n/locales/zh-CN.json`
- `src/i18n/locales/zh-TW.json`
- `src/i18n/locales/ko.json`
### Frontend tests
The root frontend uses Vitest.
Tests are colocated throughout `src/` using `*.test.ts` and `*.test.tsx`.
Add or update focused tests when changing reusable frontend logic.
### Frontend linting
`pnpm lint` includes the repository no-console check.
Prefer the existing logger infrastructure over direct `console.*` calls.
### Vite
Vite uses the `@` alias for `src/`.
### Docs
There is a separate Docusaurus app under `docs-site/`.
Useful implementation documentation is under `docs-site/docs/development/`.
For Web deployment behavior, prefer the current implementation and `docs/web-deployment.md` over assumptions based on older architecture notes.
## Code modification principles
This is a long-lived project.
When modifying code:
- understand the current implementation before changing it
- prefer small, targeted changes
- avoid unrelated refactors
- preserve existing module boundaries
- reuse existing abstractions
- avoid introducing complex architecture merely to remove minor duplication
- consider backward compatibility for config, databases, backups, and persisted state
- consider Windows, macOS, and Linux differences
- preserve Desktop behavior when changing shared Web-facing code
- consider both runtimes when modifying shared backend abstractions or `nyaterm-core`
- consider cancellation, teardown, and ownership in async Rust
- do not remove compatibility logic without understanding why it exists
## Validation principles
Choose the smallest meaningful validation set.
Frontend changes may use:
```sh
pnpm test
pnpm lint
pnpm build:web
```
Desktop Rust changes may use:
```sh
cargo fmt --manifest-path src-tauri/Cargo.toml -- --check
cargo test --manifest-path src-tauri/Cargo.toml <relevant_test>
cargo clippy --manifest-path src-tauri/Cargo.toml --all-targets
```
Web backend changes may use:
```sh
pnpm test:web
pnpm build:web
```
Use `pnpm test:web:e2e` when the change affects actual Web deployment, transport, or browser integration.
Do not run the heaviest full build by default for every small change.
If validation fails because of the environment or an unrelated existing issue, report what was run, what passed, what failed, and whether the failure appears related to the change.
Do not claim tests or builds passed unless they were actually executed successfully.
## Source analysis principles
For implementation questions:
1. identify whether the problem belongs to React UI, frontend state, backend adapter, Tauri IPC, Web transport, Rust backend, transport, or persistence
2. find the actual entry point and call sites
3. read the real implementation before drawing conclusions
4. follow the actual call chain
5. inspect Git history when compatibility logic is involved
6. for async code, inspect task ownership, channels, locks, cancellation, and lifecycle
7. do not invent files, functions, types, commands, or behavior from names alone
Typical Desktop flow:
```text
User action
-> React component / hook
-> backend adapter
-> Tauri command / event
-> Rust backend
-> transport / storage
-> frontend state update
-> UI
```
Typical Web flow:
```text
User action
-> React component / hook
-> backend adapter
-> HTTP / SSE / WebSocket
-> nyaterm-web
-> shared core / service
-> frontend state update
-> UI
```
Always verify the actual implementation in the current source tree.
## Git conventions
Repository history generally follows Conventional Commit-style subjects such as:
```text
feat:
fix:
perf:
refactor:
test:
chore:
docs:
```
Keep commits focused and consistent with recent repository history.