{"owner":"juspay","repo":"hyperswitch","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md"],"skills":{"AGENTS.md":"# AGENTS.md\n\nGuidance for human and AI contributors working in this repository.\n\n## 1. Purpose\n\nPaperclip is a control plane for AI-agent companies.\nThe current implementation target is V1 and is defined in `doc/SPEC-implementation.md`.\n\n## 2. Read This First\n\nBefore making changes, read in this order:\n\n1. `doc/GOAL.md`\n2. `doc/PRODUCT.md`\n3. `doc/SPEC-implementation.md`\n4. `doc/DEVELOPING.md`\n5. `doc/DATABASE.md`\n\n`doc/SPEC.md` is long-horizon product context.\n`doc/SPEC-implementation.md` is the concrete V1 build contract.\n\n## 3. Repo Map\n\n- `server/`: Express REST API and orchestration services\n- `ui/`: React + Vite board UI\n- `packages/db/`: Drizzle schema, migrations, DB clients\n- `packages/shared/`: shared types, constants, validators, API path constants\n- `packages/adapters/`: agent adapter implementations (Claude, Codex, Cursor, etc.)\n- `packages/adapter-utils/`: shared adapter utilities\n- `packages/plugins/`: plugin system packages\n- `doc/`: operational and product docs\n\n## 4. Dev Setup (Auto DB)\n\nUse embedded PGlite in dev by leaving `DATABASE_URL` unset.\n\n```sh\npnpm install\npnpm dev\n```\n\nThis starts:\n\n- API: `http://localhost:3100`\n- UI: `http://localhost:3100` (served by API server in dev middleware mode)\n\nQuick checks:\n\n```sh\ncurl http://localhost:3100/api/health\ncurl http://localhost:3100/api/companies\n```\n\nReset local dev DB:\n\n```sh\nrm -rf data/pglite\npnpm dev\n```\n\n## 5. Core Engineering Rules\n\n1. Keep changes company-scoped.\nEvery domain entity should be scoped to a company and company boundaries must be enforced in routes/services.\n\n2. Keep contracts synchronized.\nIf you change schema/API behavior, update all impacted layers:\n- `packages/db` schema and exports\n- `packages/shared` types/constants/validators\n- `server` routes/services\n- `ui` API clients and pages\n\n3. Preserve control-plane invariants.\n- Single-assignee task model\n- Atomic issue checkout semantics\n- Approval gates for governed actions\n- Budget hard-stop auto-pause behavior\n- Activity logging for mutating actions\n\n4. Do not replace strategic docs wholesale unless asked.\nPrefer additive updates. Keep `doc/SPEC.md` and `doc/SPEC-implementation.md` aligned.\n\n5. Keep repo plan docs dated and centralized.\nWhen you are creating a plan file in the repository itself, new plan documents belong in `doc/plans/` and should use `YYYY-MM-DD-slug.md` filenames. This does not replace Paperclip issue planning: if a Paperclip issue asks for a plan, update the issue `plan` document per the `paperclip` skill instead of creating a repo markdown file.\n\n## 6. Database Change Workflow\n\nWhen changing data model:\n\n1. Edit `packages/db/src/schema/*.ts`\n2. Ensure new tables are exported from `packages/db/src/schema/index.ts`\n3. Generate migration:\n\n```sh\npnpm db:generate\n```\n\n4. Validate compile:\n\n```sh\npnpm -r typecheck\n```\n\nNotes:\n- `packages/db/drizzle.config.ts` reads compiled schema from `dist/schema/*.js`\n- `pnpm db:generate` compiles `packages/db` first\n\n## 7. Verification Before Hand-off\n\nDefault local/agent test path:\n\n```sh\npnpm test\n```\n\nThis is the cheap default and only runs the Vitest suite. Browser suites stay opt-in:\n\n```sh\npnpm test:e2e\npnpm test:release-smoke\n```\n\nRun the browser suites only when your change touches them or when you are explicitly verifying CI/release flows.\n\nFor normal issue work, run the smallest relevant verification first. Do not default to repo-wide typecheck/build/test on every heartbeat when a narrower check is enough to prove the change.\n\nRun this full check before claiming repo work done in a PR-ready hand-off, or when the change scope is broad enough that targeted checks are not sufficient:\n\n```sh\npnpm -r typecheck\npnpm test:run\npnpm build\n```\n\nIf anything cannot be run, explicitly report what was not run and why.\n\n## 8. API and Auth Expectations\n\n- Base path: `/api`\n- Board access is treated as full-control operator context\n- Agent access uses bearer API keys (`agent_api_keys`), hashed at rest\n- Agent keys must not access other companies\n\nWhen adding endpoints:\n\n- apply company access checks\n- enforce actor permissions (board vs agent)\n- write activity log entries for mutations\n- return consistent HTTP errors (`400/401/403/404/409/422/500`)\n\n## 9. UI Expectations\n\n- Keep routes and nav aligned with available API surface\n- Use company selection context for company-scoped pages\n- Surface failures clearly; do not silently ignore API errors\n\n## 10. Pull Request Requirements\n\nWhen creating a pull request (via `gh pr create` or any other method), you **must** read and fill in every section of [`.github/PULL_REQUEST_TEMPLATE.md`](.github/PULL_REQUEST_TEMPLATE.md). Do not craft ad-hoc PR bodies — use the template as the structure for your PR description. Required sections:\n\n- **Thinking Path** — trace reasoning from project context to this change (see `CONTRIBUTING.md` for examples)\n- **What Changed** — bullet list of concrete changes\n- **Verification** — how a reviewer can confirm it works\n- **Risks** — what could go wrong\n- **Model Used** — the AI model that produced or assisted with the change (provider, exact model ID, context window, capabilities). Write \"None — human-authored\" if no AI was used.\n- **Checklist** — all items checked\n\n## 11. Definition of Done\n\nA change is done when all are true:\n\n1. Behavior matches `doc/SPEC-implementation.md`\n2. Typecheck, tests, and build pass\n3. Contracts are synced across db/shared/server/ui\n4. Docs updated when behavior or commands change\n5. PR description follows the [PR template](.github/PULL_REQUEST_TEMPLATE.md) with all sections filled in (including Model Used)\n\n## 11. Fork-Specific: HenkDz/paperclip\n\nThis is a fork of `paperclipai/paperclip` with QoL patches and an **external-only** Hermes adapter story on branch `feat/externalize-hermes-adapter` ([tree](https://github.com/HenkDz/paperclip/tree/feat/externalize-hermes-adapter)).\n\n### Branch Strategy\n\n- `feat/externalize-hermes-adapter` → core has **no** `hermes-paperclip-adapter` dependency and **no** built-in `hermes_local` registration. Install Hermes via the Adapter Plugin manager (`@henkey/hermes-paperclip-adapter` or a `file:` path).\n- Older fork branches may still document built-in Hermes; treat this file as authoritative for the externalize branch.\n\n### Hermes (plugin only)\n\n- Register through **Board → Adapter manager** (same as Droid). Type remains `hermes_local` once the package is loaded.\n- UI uses generic **config-schema** + **ui-parser.js** from the package — no Hermes imports in `server/` or `ui/` source.\n- Optional: `file:` entry in `~/.paperclip/adapter-plugins.json` for local dev of the adapter repo.\n\n### Local Dev\n\n- Fork runs on port 3101+ (auto-detects if 3100 is taken by upstream instance)\n- `npx vite build` hangs on NTFS — use `node node_modules/vite/bin/vite.js build` instead\n- Server startup from NTFS takes 30-60s — don't assume failure immediately\n- Kill ALL paperclip processes before starting: `pkill -f \"paperclip\"; pkill -f \"tsx.*index.ts\"`\n- Vite cache survives `rm -rf dist` — delete both: `rm -rf ui/dist ui/node_modules/.vite`\n\n### Fork QoL Patches (not in upstream)\n\nThese are local modifications in the fork's UI. If re-copying source, these must be re-applied:\n\n1. **stderr_group** — amber accordion for MCP init noise in `RunTranscriptView.tsx`\n2. **tool_group** — accordion for consecutive non-terminal tools (write, read, search, browser)\n3. **Dashboard excerpt** — `LatestRunCard` strips markdown, shows first 3 lines/280 chars\n\n### Plugin System\n\nPR #2218 (`feat/external-adapter-phase1`) adds external adapter support. See root `AGENTS.md` for full details.\n\n- Adapters can be loaded as external plugins via `~/.paperclip/adapter-plugins.json`\n- The plugin-loader should have ZERO hardcoded adapter imports — pure dynamic loading\n- `createServerAdapter()` must include ALL optional fields (especially `detectModel`)\n- Built-in UI adapters can shadow external plugin parsers — remove built-in when fully externalizing\n- Reference external adapters: Hermes (`@henkey/hermes-paperclip-adapter` or `file:`) and Droid (npm)\n"},"files":{"AGENTS.md":"# AGENTS.md\n\nGuidance for human and AI contributors working in this repository.\n\n## 1. Purpose\n\nPaperclip is a control plane for AI-agent companies.\nThe current implementation target is V1 and is defined in `doc/SPEC-implementation.md`.\n\n## 2. Read This First\n\nBefore making changes, read in this order:\n\n1. `doc/GOAL.md`\n2. `doc/PRODUCT.md`\n3. `doc/SPEC-implementation.md`\n4. `doc/DEVELOPING.md`\n5. `doc/DATABASE.md`\n\n`doc/SPEC.md` is long-horizon product context.\n`doc/SPEC-implementation.md` is the concrete V1 build contract.\n\n## 3. Repo Map\n\n- `server/`: Express REST API and orchestration services\n- `ui/`: React + Vite board UI\n- `packages/db/`: Drizzle schema, migrations, DB clients\n- `packages/shared/`: shared types, constants, validators, API path constants\n- `packages/adapters/`: agent adapter implementations (Claude, Codex, Cursor, etc.)\n- `packages/adapter-utils/`: shared adapter utilities\n- `packages/plugins/`: plugin system packages\n- `doc/`: operational and product docs\n\n## 4. Dev Setup (Auto DB)\n\nUse embedded PGlite in dev by leaving `DATABASE_URL` unset.\n\n```sh\npnpm install\npnpm dev\n```\n\nThis starts:\n\n- API: `http://localhost:3100`\n- UI: `http://localhost:3100` (served by API server in dev middleware mode)\n\nQuick checks:\n\n```sh\ncurl http://localhost:3100/api/health\ncurl http://localhost:3100/api/companies\n```\n\nReset local dev DB:\n\n```sh\nrm -rf data/pglite\npnpm dev\n```\n\n## 5. Core Engineering Rules\n\n1. Keep changes company-scoped.\nEvery domain entity should be scoped to a company and company boundaries must be enforced in routes/services.\n\n2. Keep contracts synchronized.\nIf you change schema/API behavior, update all impacted layers:\n- `packages/db` schema and exports\n- `packages/shared` types/constants/validators\n- `server` routes/services\n- `ui` API clients and pages\n\n3. Preserve control-plane invariants.\n- Single-assignee task model\n- Atomic issue checkout semantics\n- Approval gates for governed actions\n- Budget hard-stop auto-pause behavior\n- Activity logging for mutating actions\n\n4. Do not replace strategic docs wholesale unless asked.\nPrefer additive updates. Keep `doc/SPEC.md` and `doc/SPEC-implementation.md` aligned.\n\n5. Keep repo plan docs dated and centralized.\nWhen you are creating a plan file in the repository itself, new plan documents belong in `doc/plans/` and should use `YYYY-MM-DD-slug.md` filenames. This does not replace Paperclip issue planning: if a Paperclip issue asks for a plan, update the issue `plan` document per the `paperclip` skill instead of creating a repo markdown file.\n\n## 6. Database Change Workflow\n\nWhen changing data model:\n\n1. Edit `packages/db/src/schema/*.ts`\n2. Ensure new tables are exported from `packages/db/src/schema/index.ts`\n3. Generate migration:\n\n```sh\npnpm db:generate\n```\n\n4. Validate compile:\n\n```sh\npnpm -r typecheck\n```\n\nNotes:\n- `packages/db/drizzle.config.ts` reads compiled schema from `dist/schema/*.js`\n- `pnpm db:generate` compiles `packages/db` first\n\n## 7. Verification Before Hand-off\n\nDefault local/agent test path:\n\n```sh\npnpm test\n```\n\nThis is the cheap default and only runs the Vitest suite. Browser suites stay opt-in:\n\n```sh\npnpm test:e2e\npnpm test:release-smoke\n```\n\nRun the browser suites only when your change touches them or when you are explicitly verifying CI/release flows.\n\nFor normal issue work, run the smallest relevant verification first. Do not default to repo-wide typecheck/build/test on every heartbeat when a narrower check is enough to prove the change.\n\nRun this full check before claiming repo work done in a PR-ready hand-off, or when the change scope is broad enough that targeted checks are not sufficient:\n\n```sh\npnpm -r typecheck\npnpm test:run\npnpm build\n```\n\nIf anything cannot be run, explicitly report what was not run and why.\n\n## 8. API and Auth Expectations\n\n- Base path: `/api`\n- Board access is treated as full-control operator context\n- Agent access uses bearer API keys (`agent_api_keys`), hashed at rest\n- Agent keys must not access other companies\n\nWhen adding endpoints:\n\n- apply company access checks\n- enforce actor permissions (board vs agent)\n- write activity log entries for mutations\n- return consistent HTTP errors (`400/401/403/404/409/422/500`)\n\n## 9. UI Expectations\n\n- Keep routes and nav aligned with available API surface\n- Use company selection context for company-scoped pages\n- Surface failures clearly; do not silently ignore API errors\n\n## 10. Pull Request Requirements\n\nWhen creating a pull request (via `gh pr create` or any other method), you **must** read and fill in every section of [`.github/PULL_REQUEST_TEMPLATE.md`](.github/PULL_REQUEST_TEMPLATE.md). Do not craft ad-hoc PR bodies — use the template as the structure for your PR description. Required sections:\n\n- **Thinking Path** — trace reasoning from project context to this change (see `CONTRIBUTING.md` for examples)\n- **What Changed** — bullet list of concrete changes\n- **Verification** — how a reviewer can confirm it works\n- **Risks** — what could go wrong\n- **Model Used** — the AI model that produced or assisted with the change (provider, exact model ID, context window, capabilities). Write \"None — human-authored\" if no AI was used.\n- **Checklist** — all items checked\n\n## 11. Definition of Done\n\nA change is done when all are true:\n\n1. Behavior matches `doc/SPEC-implementation.md`\n2. Typecheck, tests, and build pass\n3. Contracts are synced across db/shared/server/ui\n4. Docs updated when behavior or commands change\n5. PR description follows the [PR template](.github/PULL_REQUEST_TEMPLATE.md) with all sections filled in (including Model Used)\n\n## 11. Fork-Specific: HenkDz/paperclip\n\nThis is a fork of `paperclipai/paperclip` with QoL patches and an **external-only** Hermes adapter story on branch `feat/externalize-hermes-adapter` ([tree](https://github.com/HenkDz/paperclip/tree/feat/externalize-hermes-adapter)).\n\n### Branch Strategy\n\n- `feat/externalize-hermes-adapter` → core has **no** `hermes-paperclip-adapter` dependency and **no** built-in `hermes_local` registration. Install Hermes via the Adapter Plugin manager (`@henkey/hermes-paperclip-adapter` or a `file:` path).\n- Older fork branches may still document built-in Hermes; treat this file as authoritative for the externalize branch.\n\n### Hermes (plugin only)\n\n- Register through **Board → Adapter manager** (same as Droid). Type remains `hermes_local` once the package is loaded.\n- UI uses generic **config-schema** + **ui-parser.js** from the package — no Hermes imports in `server/` or `ui/` source.\n- Optional: `file:` entry in `~/.paperclip/adapter-plugins.json` for local dev of the adapter repo.\n\n### Local Dev\n\n- Fork runs on port 3101+ (auto-detects if 3100 is taken by upstream instance)\n- `npx vite build` hangs on NTFS — use `node node_modules/vite/bin/vite.js build` instead\n- Server startup from NTFS takes 30-60s — don't assume failure immediately\n- Kill ALL paperclip processes before starting: `pkill -f \"paperclip\"; pkill -f \"tsx.*index.ts\"`\n- Vite cache survives `rm -rf dist` — delete both: `rm -rf ui/dist ui/node_modules/.vite`\n\n### Fork QoL Patches (not in upstream)\n\nThese are local modifications in the fork's UI. If re-copying source, these must be re-applied:\n\n1. **stderr_group** — amber accordion for MCP init noise in `RunTranscriptView.tsx`\n2. **tool_group** — accordion for consecutive non-terminal tools (write, read, search, browser)\n3. **Dashboard excerpt** — `LatestRunCard` strips markdown, shows first 3 lines/280 chars\n\n### Plugin System\n\nPR #2218 (`feat/external-adapter-phase1`) adds external adapter support. See root `AGENTS.md` for full details.\n\n- Adapters can be loaded as external plugins via `~/.paperclip/adapter-plugins.json`\n- The plugin-loader should have ZERO hardcoded adapter imports — pure dynamic loading\n- `createServerAdapter()` must include ALL optional fields (especially `detectModel`)\n- Built-in UI adapters can shadow external plugin parsers — remove built-in when fully externalizing\n- Reference external adapters: Hermes (`@henkey/hermes-paperclip-adapter` or `file:`) and Droid (npm)\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# AGENTS.md\n\nGuidance for human and AI contributors working in this repository.\n\n## 1. Purpose\n\nPaperclip is a control plane for AI-agent companies.\nThe current implementation target is V1 and is defined in `doc/SPEC-implementation.md`.\n\n## 2. Read This First\n\nBefore making changes, read in this order:\n\n1. `doc/GOAL.md`\n2. `doc/PRODUCT.md`\n3. `doc/SPEC-implementation.md`\n4. `doc/DEVELOPING.md`\n5. `doc/DATABASE.md`\n\n`doc/SPEC.md` is long-horizon product context.\n`doc/SPEC-implementation.md` is the concrete V1 build contract.\n\n## 3. Repo Map\n\n- `server/`: Express REST API and orchestration services\n- `ui/`: React + Vite board UI\n- `packages/db/`: Drizzle schema, migrations, DB clients\n- `packages/shared/`: shared types, constants, validators, API path constants\n- `packages/adapters/`: agent adapter implementations (Claude, Codex, Cursor, etc.)\n- `packages/adapter-utils/`: shared adapter utilities\n- `packages/plugins/`: plugin system packages\n- `doc/`: operational and product docs\n\n## 4. Dev Setup (Auto DB)\n\nUse embedded PGlite in dev by leaving `DATABASE_URL` unset.\n\n```sh\npnpm install\npnpm dev\n```\n\nThis starts:\n\n- API: `http://localhost:3100`\n- UI: `http://localhost:3100` (served by API server in dev middleware mode)\n\nQuick checks:\n\n```sh\ncurl http://localhost:3100/api/health\ncurl http://localhost:3100/api/companies\n```\n\nReset local dev DB:\n\n```sh\nrm -rf data/pglite\npnpm dev\n```\n\n## 5. Core Engineering Rules\n\n1. Keep changes company-scoped.\nEvery domain entity should be scoped to a company and company boundaries must be enforced in routes/services.\n\n2. Keep contracts synchronized.\nIf you change schema/API behavior, update all impacted layers:\n- `packages/db` schema and exports\n- `packages/shared` types/constants/validators\n- `server` routes/services\n- `ui` API clients and pages\n\n3. Preserve control-plane invariants.\n- Single-assignee task model\n- Atomic issue checkout semantics\n- Approval gates for governed actions\n- Budget hard-stop auto-pause behavior\n- Activity logging for mutating actions\n\n4. Do not replace strategic docs wholesale unless asked.\nPrefer additive updates. Keep `doc/SPEC.md` and `doc/SPEC-implementation.md` aligned.\n\n5. Keep repo plan docs dated and centralized.\nWhen you are creating a plan file in the repository itself, new plan documents belong in `doc/plans/` and should use `YYYY-MM-DD-slug.md` filenames. This does not replace Paperclip issue planning: if a Paperclip issue asks for a plan, update the issue `plan` document per the `paperclip` skill instead of creating a repo markdown file.\n\n## 6. Database Change Workflow\n\nWhen changing data model:\n\n1. Edit `packages/db/src/schema/*.ts`\n2. Ensure new tables are exported from `packages/db/src/schema/index.ts`\n3. Generate migration:\n\n```sh\npnpm db:generate\n```\n\n4. Validate compile:\n\n```sh\npnpm -r typecheck\n```\n\nNotes:\n- `packages/db/drizzle.config.ts` reads compiled schema from `dist/schema/*.js`\n- `pnpm db:generate` compiles `packages/db` first\n\n## 7. Verification Before Hand-off\n\nDefault local/agent test path:\n\n```sh\npnpm test\n```\n\nThis is the cheap default and only runs the Vitest suite. Browser suites stay opt-in:\n\n```sh\npnpm test:e2e\npnpm test:release-smoke\n```\n\nRun the browser suites only when your change touches them or when you are explicitly verifying CI/release flows.\n\nFor normal issue work, run the smallest relevant verification first. Do not default to repo-wide typecheck/build/test on every heartbeat when a narrower check is enough to prove the change.\n\nRun this full check before claiming repo work done in a PR-ready hand-off, or when the change scope is broad enough that targeted checks are not sufficient:\n\n```sh\npnpm -r typecheck\npnpm test:run\npnpm build\n```\n\nIf anything cannot be run, explicitly report what was not run and why.\n\n## 8. API and Auth Expectations\n\n- Base path: `/api`\n- Board access is treated as full-control operator context\n- Agent access uses bearer API keys (`agent_api_keys`), hashed at rest\n- Agent keys must not access other companies\n\nWhen adding endpoints:\n\n- apply company access checks\n- enforce actor permissions (board vs agent)\n- write activity log entries for mutations\n- return consistent HTTP errors (`400/401/403/404/409/422/500`)\n\n## 9. UI Expectations\n\n- Keep routes and nav aligned with available API surface\n- Use company selection context for company-scoped pages\n- Surface failures clearly; do not silently ignore API errors\n\n## 10. Pull Request Requirements\n\nWhen creating a pull request (via `gh pr create` or any other method), you **must** read and fill in every section of [`.github/PULL_REQUEST_TEMPLATE.md`](.github/PULL_REQUEST_TEMPLATE.md). Do not craft ad-hoc PR bodies — use the template as the structure for your PR description. Required sections:\n\n- **Thinking Path** — trace reasoning from project context to this change (see `CONTRIBUTING.md` for examples)\n- **What Changed** — bullet list of concrete changes\n- **Verification** — how a reviewer can confirm it works\n- **Risks** — what could go wrong\n- **Model Used** — the AI model that produced or assisted with the change (provider, exact model ID, context window, capabilities). Write \"None — human-authored\" if no AI was used.\n- **Checklist** — all items checked\n\n## 11. Definition of Done\n\nA change is done when all are true:\n\n1. Behavior matches `doc/SPEC-implementation.md`\n2. Typecheck, tests, and build pass\n3. Contracts are synced across db/shared/server/ui\n4. Docs updated when behavior or commands change\n5. PR description follows the [PR template](.github/PULL_REQUEST_TEMPLATE.md) with all sections filled in (including Model Used)\n\n## 11. Fork-Specific: HenkDz/paperclip\n\nThis is a fork of `paperclipai/paperclip` with QoL patches and an **external-only** Hermes adapter story on branch `feat/externalize-hermes-adapter` ([tree](https://github.com/HenkDz/paperclip/tree/feat/externalize-hermes-adapter)).\n\n### Branch Strategy\n\n- `feat/externalize-hermes-adapter` → core has **no** `hermes-paperclip-adapter` dependency and **no** built-in `hermes_local` registration. Install Hermes via the Adapter Plugin manager (`@henkey/hermes-paperclip-adapter` or a `file:` path).\n- Older fork branches may still document built-in Hermes; treat this file as authoritative for the externalize branch.\n\n### Hermes (plugin only)\n\n- Register through **Board → Adapter manager** (same as Droid). Type remains `hermes_local` once the package is loaded.\n- UI uses generic **config-schema** + **ui-parser.js** from the package — no Hermes imports in `server/` or `ui/` source.\n- Optional: `file:` entry in `~/.paperclip/adapter-plugins.json` for local dev of the adapter repo.\n\n### Local Dev\n\n- Fork runs on port 3101+ (auto-detects if 3100 is taken by upstream instance)\n- `npx vite build` hangs on NTFS — use `node node_modules/vite/bin/vite.js build` instead\n- Server startup from NTFS takes 30-60s — don't assume failure immediately\n- Kill ALL paperclip processes before starting: `pkill -f \"paperclip\"; pkill -f \"tsx.*index.ts\"`\n- Vite cache survives `rm -rf dist` — delete both: `rm -rf ui/dist ui/node_modules/.vite`\n\n### Fork QoL Patches (not in upstream)\n\nThese are local modifications in the fork's UI. If re-copying source, these must be re-applied:\n\n1. **stderr_group** — amber accordion for MCP init noise in `RunTranscriptView.tsx`\n2. **tool_group** — accordion for consecutive non-terminal tools (write, read, search, browser)\n3. **Dashboard excerpt** — `LatestRunCard` strips markdown, shows first 3 lines/280 chars\n\n### Plugin System\n\nPR #2218 (`feat/external-adapter-phase1`) adds external adapter support. See root `AGENTS.md` for full details.\n\n- Adapters can be loaded as external plugins via `~/.paperclip/adapter-plugins.json`\n- The plugin-loader should have ZERO hardcoded adapter imports — pure dynamic loading\n- `createServerAdapter()` must include ALL optional fields (especially `detectModel`)\n- Built-in UI adapters can shadow external plugin parsers — remove built-in when fully externalizing\n- Reference external adapters: Hermes (`@henkey/hermes-paperclip-adapter` or `file:`) and Droid (npm)\n","category":"root","tokens":2020}]}