AGENTS.md
OpenWork is a free, open-source desktop app (macOS, Windows, Linux) for doing work with AI agents on your own files — an open-source alternative to Claude Cowork and Codex, built on OpenCode, running any model from 50+ providers. Desktop mode keeps files local; cloud is optional. Three surfaces live in this repo:
- Desktop app (
apps/,packages/) — local-first agent workspace: chat on files, skills, browser automation, scheduled automations, Anthropic-compatible plugins. - OpenWork MCP gateway (
ee/apps/den-api) — one URL (api.openworklabs.com/mcp/agent) that brings org-assigned skills, plugins, and connections (Google Workspace, Microsoft 365, MCPs) into Codex, Claude Code, Cursor, or any MCP client viasearch_capabilities/execute_capability. - OpenWork Den (
ee/apps/den-*) — the org control plane: provision inference, manage teams and access, set desktop policies, publish skills and plugins through marketplaces.
The app consumes OpenWork server surfaces (self-hosted or hosted) rather than inventing parallel behavior. Anything OpenCode can do is available in OpenWork, even before a dedicated UI exists.
OpenCode v2 is the default. Hosts automatically back up and migrate existing v1
history when idle, without a Den feature flag or Helm setting. Respect explicit
manual engine choices and local support/test overrides; never restore the retired
engineV2ForceUpgrade gate. See docs/opencode-engine-migration.md.
Customer-cloud managed installation architecture lives in
infra/managed-deployments/README.md and docs/managed-deployments.md. AWS
uses CloudFormation/CodeBuild; GCP uses customer-approved Cloud Shell and
impersonated Terraform behind managedDeployments (cloud only, off), the same
switch as AWS and the deployment agent tools.
Installer publication/configuration is an operator action, not CLI sign-in or a
feature rollout. Never fake readiness; local tests do not prove a live install.
Killing a rollout blocks launches without deleting customer resources or
interrupting authenticated enrollment/health reports.
Confidentiality (hard rule — this repo is public)
Never let a branch name, commit, PR text, comment, fixture, or evidence identify a customer, prospect, partner, or outside person; use internal ticket IDs, and escalate any leak instead of rewriting history.
Generated API contracts
Den route metadata and shared schemas are the source of truth. OpenAPI and
packages/sdk/src/gen/** are ignored build artifacts: never commit or hand-edit
them. CI generates, lints and typechecks them from the PR source and uploads
an artifact. Hosted docs read the normalized deployed contract at
/openapi.json?public=1; the raw /openapi.json remains available.
pnpm sdk:build and SDK typechecks generate missing or stale artifacts first.
pnpm den:contract forces a clean generation and prepares/removes a disposable
local MySQL database. Start MySQL with pnpm dev:den:mysql; only
OPENWORK_CONTRACT_MYSQL_URL can select alternate localhost credentials.
DATABASE_URL is never used for generation. After a merge/rebase regenerate
locally when needed; generated files do not enter the merge. Never regenerate
a Drizzle migration snapshot to resolve an API conflict.
Optional: pnpm hooks:install enables source validation before commits. It
refuses unstaged/untracked contract inputs and never stages generated outputs.
Hooks never commit, push, or change CI/Warden policy; CI remains authoritative.
Coding
- pnpm only, never npm/yarn. TypeScript: never
any, typecasts, orasunless 100% necessary or instructed. - Prefer Tailwind, React, shadcn/ui (Base UI), TanStack Query, Zustand, Zod,
Drizzle, Better-Auth. Reuse
@/components; end users are non-technical. - Put any change to product behavior that users can see behind a feature
flag, so it can be turned off without a deploy: new or changed flows,
screens, options and defaults. Ship directly only what users won't notice
as a behavior change: fixes that restore intended behavior, polish,
refactors, tests and
/admintooling. When unsure, flag. Follow.opencode/skills/add-a-feature. - Any user-facing UI (desktop app, Den web, MCP Apps, artifact views) follows
DESIGN.md: read it before designing, cite its rule ids in PRs, and attach screenshots of new UI. The optional.warden/skills/design-spec-reviewskill can review these rules locally.
Verify changes headless
Launching the desktop app on a developer's computer opens a window that takes focus. Check app UI in headless Chrome instead:
- Specs:
seed.appWeb(write-a-spec);run-testsexplains which placement tests your working tree. - By hand:
pnpm world up dev-app-web --detach -- --browser, then drive the printedcdpaddress (drive-desktop-cdp). - Use the desktop app (
seed.desktop,pnpm dev,preview-desktop,live-desktop) only when the user asks or the change needs the desktop shell: titlebar and window controls, native menus and dialogs,openwork://links and OAuth hand-off, the built-in browser pane, updater, quit and relaunch, or packaged builds. Prefer--daytonafor those so the window opens in a sandbox; Daytona builds a pushed commit, not your working tree.