# Development See [AGENTS.md](https://github.com/earendil-works/pi/blob/main/AGENTS.md) for additional guidelines. ## Setup ```bash git clone https://github.com/earendil-works/pi cd pi npm install npm run build ``` Run from source: ```bash /path/to/pi/pi-test.sh ``` The script can be run from any directory. Pi keeps the caller's current working directory. ### Experimental remote harness The remote harness server/client integration is development-only. Run it from the repository with: ```bash PI_EXPERIMENTAL=1 ./pi-test.sh server PI_EXPERIMENTAL=1 ./pi-test.sh client ``` `PI_SERVER_DIR` overrides the server profile and socket directory (default: `~/.pi/server`). `PI_SERVER_ID` selects the logical server ID when `--server-id` is omitted. The `client` and `experimental/plugin` package subpaths resolve only under the `source` condition in a checkout. Their implementations and the server/client commands are excluded from npm packages and standalone binaries. `pi-client`, `pi-protocol`, and `pi-server` are development dependencies of coding-agent, not runtime dependencies. The local SDK and stdio RPC API are unchanged. ## Forking / Rebranding Configure via `package.json`: ```json { "piConfig": { "name": "pi", "configDir": ".pi" } } ``` Change `name`, `configDir`, and `bin` field for your fork. Affects CLI banner, config paths, and environment variable names. ## Path Resolution Three execution modes: npm install, standalone binary, tsx from source. **Always use `src/config.ts`** for package assets: ```typescript import { getPackageDir, getThemeDir } from "./config.js"; ``` Never use `__dirname` directly for package assets. ## Debug Command `/debug` (hidden) writes to `~/.pi/agent/pi-debug.log`: - Rendered TUI lines with ANSI codes - Last messages sent to the LLM ## Testing ```bash ./test.sh # Run non-LLM tests (no API keys needed) npm test # Run all tests npm test -- test/specific.test.ts # Run specific test ``` ### Published package smoke test After building, run `npm run check:package-install`. It packs the public packages and installs only coding-agent as a direct dependency in a temporary directory outside the repository. Local tarball overrides select declared transitive dependencies without installing development-only packages. The check verifies SDK imports and CLI startup without credentials or model requests. `npm run check` also checks runtime dependency declarations and rejects excluded development sources pulled into a package's build through imports. ## Project Structure ``` packages/ ai/ # LLM provider abstraction agent/ # Agent loop and message types tui/ # Terminal UI components coding-agent/ # CLI and interactive mode ```