mirror of
https://github.com/paperclipai/paperclip
synced 2026-05-08 16:12:20 +02:00
## Thinking Path > - Paperclip orchestrates AI agents for zero-human companies, and its CLI import/export path is part of how operators move company state safely between environments. > - The `paperclipai company import/export` e2e test is supposed to validate that portability flow inside a hermetic harness, not against a developer's live Paperclip home. > - This regression showed nested CLI subprocesses could silently fall back to ambient `PAPERCLIP_*` state and mutate a real local instance by creating extra companies such as `CLI-1-Roundtrip-Test`. > - The first job was to pin the test subprocesses to isolated config, home, instance, auth, and context paths, and to add a regression assertion that proves the nested CLI writes stay inside the test-owned state. > - Once the PR was up, CI and Greptile exposed two follow-on issues that were blocking merge: plugin SDK typecheck bootstrap was racing across packages in fresh CI, and the new lock helper needed one more fix to release its lock on failure. > - This pull request therefore ends up doing two tightly related things: fixing the original CLI isolation leak, and hardening the supporting typecheck/bootstrap path enough for the fix to verify cleanly in CI. > - The benefit is that the portability e2e test is now actually isolated, and the PR verification path is stable enough to catch regressions instead of introducing its own nondeterministic failures. ## What Changed - Hardened `cli/src/__tests__/company-import-export-e2e.test.ts` so nested CLI subprocesses re-seed isolated `PAPERCLIP_CONFIG`, `PAPERCLIP_HOME`, `PAPERCLIP_INSTANCE_ID`, `PAPERCLIP_CONTEXT`, `PAPERCLIP_AUTH_STORE`, and throwaway `HOME` values instead of falling back to ambient machine state. - Added a regression assertion around `paperclipai context set --json`, then cleared the temporary `context.json` so the isolation check and the later export/import flow stay independent. - Passed the same isolated `HOME` into the server subprocess so both sides of the e2e harness are symmetric. - Introduced locking in `scripts/ensure-plugin-build-deps.mjs` and switched the server/plugin example `typecheck` scripts to use that helper instead of launching concurrent raw `@paperclipai/plugin-sdk` builds. - Fixed the helper failure path so it releases the lock before exiting non-zero, which prevents stale-lock timeouts during parallel typecheck runs. ## Verification - `pnpm vitest run cli/src/__tests__/company-import-export-e2e.test.ts --project paperclipai` - `pnpm --filter paperclipai typecheck` - `pnpm -r typecheck` - PR checks now pass on the current head, including `policy`, `verify`, `e2e`, `security/snyk`, and `Greptile Review`. ## Risks - Low risk. The product-facing behavior change is scoped to test harness code in the CLI e2e suite. - The CI stabilization changes only affect bootstrap/typecheck helper paths for the server and plugin/example packages, but they do touch shared verification plumbing; the main risk is changing how fresh build artifacts are prepared in local/CI typecheck runs. ## Model Used - Anthropic Claude via Paperclip `claude_local`, model `claude-opus-4-7`, high-effort local coding agent, used for the initial implementation and first peer-reviewed verification. - OpenAI Codex via Paperclip `codex_local`, model `gpt-5.4`, high reasoning-effort local coding agent with tool use, used for CI triage, Greptile follow-up fixes, verification, and PR maintenance. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] If this change affects the UI, I have included before/after screenshots - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [x] I will address all Greptile and reviewer comments before requesting merge
File Browser Example Plugin
Example Paperclip plugin that demonstrates:
- projectSidebarItem — An optional "Files" link under each project in the sidebar that opens the project detail with this plugin’s tab selected. This is controlled by plugin settings and defaults to off.
- detailTab (entityType project) — A project detail tab with a workspace-path selector, a desktop two-column layout (file tree left, editor right), and a mobile one-panel flow with a back button from editor to file tree, including save support.
This is a repo-local example plugin for development. It should not be assumed to ship in a generic production build unless it is explicitly included.
Slots
| Slot | Type | Description |
|---|---|---|
| Files (sidebar) | projectSidebarItem |
Optional link under each project → project detail + tab. |
| Files (tab) | detailTab |
Responsive tree/editor layout with save support. |
Settings
Show Files in Sidebar— toggles the project sidebar link on or off. Defaults to off.Comment File Links— controls whether comment annotations and the comment context-menu action are shown.
Capabilities
ui.sidebar.register— project sidebar itemui.detailTab.register— project detail tabprojects.read— resolve projectproject.workspaces.read— list workspaces and read paths for file access
Worker
- getData
workspaces—ctx.projects.listWorkspaces(projectId, companyId)(ordered, primary first). - getData
fileList—{ projectId, workspaceId, directoryPath? }→ list directory entries for the workspace root or a subdirectory (Nodefs). - getData
fileContent—{ projectId, workspaceId, filePath }→ read file content using workspace-relative paths (Nodefs). - performAction
writeFile—{ projectId, workspaceId, filePath, content }→ write the current editor buffer back to disk.
Local Install (Dev)
From the repo root, build the plugin and install it by local path:
pnpm --filter @paperclipai/plugin-file-browser-example build
pnpm paperclipai plugin install ./packages/plugins/examples/plugin-file-browser-example
To uninstall:
pnpm paperclipai plugin uninstall paperclip-file-browser-example --force
Local development notes:
- Build first. The host resolves the worker from the manifest
entrypoints.worker(e.g../dist/worker.js). Runpnpm buildin the plugin directory before installing so the worker file exists. - Dev-only install path. This local-path install flow assumes this monorepo checkout is present on disk. For deployed installs, publish an npm package instead of depending on
packages/plugins/examples/...existing on the host. - Reinstall after pulling. If you installed a plugin by local path before the server stored
package_path, the plugin may show status error (worker not found). Uninstall and install again so the server persists the path and can activate the plugin. - Optional: use
paperclip-plugin-dev-serverfor UI hot-reload withdevUiUrlin plugin config.
Structure
src/manifest.ts— manifest withprojectSidebarItemanddetailTab(entityTypes["project"]).src/worker.ts— data handlers for workspaces, file list, file content.src/ui/index.tsx—FilesLink(sidebar) andFilesTab(workspace path selector + two-panel file tree/editor).