{"id":49581663,"url":"https://github.com/flemosr/agent-workcell","last_synced_at":"2026-05-03T20:40:00.442Z","repository":{"id":342617651,"uuid":"1146166417","full_name":"flemosr/agent-workcell","owner":"flemosr","description":"An opinionated, containerized environment for running TUI coding agents in YOLO mode, with Chrome integration, selective persistence, and isolated GPG-signed commits. Supports Claude Code, OpenCode and Codex.","archived":false,"fork":false,"pushed_at":"2026-04-24T14:07:54.000Z","size":253,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-24T15:40:55.171Z","etag":null,"topics":["agentic-ai","ai-coding","claude","claude-code","codex","containerization","developer-tools","docker","opencode","sandbox"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/flemosr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-30T17:57:11.000Z","updated_at":"2026-04-24T14:09:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/flemosr/agent-workcell","commit_stats":null,"previous_names":["flemosr/claude-sandbox","flemosr/agent-sandbox","flemosr/agent-workcell"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/flemosr/agent-workcell","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flemosr%2Fagent-workcell","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flemosr%2Fagent-workcell/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flemosr%2Fagent-workcell/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flemosr%2Fagent-workcell/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flemosr","download_url":"https://codeload.github.com/flemosr/agent-workcell/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flemosr%2Fagent-workcell/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32584646,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agentic-ai","ai-coding","claude","claude-code","codex","containerization","developer-tools","docker","opencode","sandbox"],"created_at":"2026-05-03T20:39:58.278Z","updated_at":"2026-05-03T20:40:00.426Z","avatar_url":"https://github.com/flemosr.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# agent workcell\n\nAn opinionated, containerized environment for running TUI coding agents in YOLO mode, with Chrome\nintegration, selective persistence, and isolated GPG-signed commits.\n\nSupports [Claude Code](https://claude.ai/code), [OpenCode](https://opencode.ai/), and\n[Codex](https://github.com/openai/codex), selectable per-launch. Geared towards Rust, Python, and\nTypeScript development. A global context file is injected so the agent is aware of the sandbox's\ncapabilities and constraints.\n\n## Prerequisites\n\n- Docker installed\n- macOS (or Linux/WSL2)\n\n## Setup\n\n### 1. Add the shell alias\n\nAdd this to your `~/.zshrc`:\n\n```bash\nalias workcell=\"/path/to/agent-workcell/cli.sh\"\n```\n\nReplace `/path/to/agent-workcell` with the actual path to this repository.\n\nThen reload your shell:\n\n```bash\nsource ~/.zshrc\n```\n\n### 2. Build the `agent-workcell` image\n\n```bash\nworkcell build\n```\n\nThis runs `docker compose build` from the workcell repository root, so it works even when you invoke\n`workcell` from another directory. Rebuilding also refreshes the bundled agent TUIs in the image to\ntheir latest releases.\n\n### 3. Authenticate (first time only)\n\nRun the workcell with a selected agent once to authenticate with your corresponding account:\n\n```bash\nworkcell run claude\n```\n\n### 4. Configure Chrome (optional)\n\nTo use browser integration (`--with-chrome`), you need to configure Chrome settings.\n\n**Install socat** (required for Chrome integration):\n\n```bash\nbrew install socat\n```\n\n**Create a dedicated Chrome profile for Agent:**\n\n1. Open Chrome and click your profile icon (top-right)\n2. Click \"Add\" to create a new profile\n3. Name it \"Agent\" (or any name you prefer)\n4. Go to `chrome://version` in the new profile\n5. Look at \"Profile Path\" - note the last folder name (e.g., \"Profile 3\")\n\n**Create your config file:**\n\n```bash\ncp config.template.sh config.sh\n```\n\nEdit `config.sh` and set `CHROME_PROFILE` to your profile's folder name:\n\n```bash\nCHROME_PROFILE=\"Profile 3\"  # \u003c-- Use folder name from chrome://version\n```\n\nYour `config.sh` is gitignored, so your personal settings won't be committed.\n\n### 5. Configure GPG commit signing (optional)\n\nTo have commits made inside the workcell show as \"Verified\" on GitHub, enable GPG signing in your\n`config.sh`:\n\n```bash\nGIT_AUTHOR_NAME=\"Workcell Agent Name\"\nGIT_AUTHOR_EMAIL=\"agent@example.local\"\nGPG_SIGNING=true\n```\n\nOn first launch, the workcell generates a passphrase-less ed25519 GPG key and prints the public key.\nIf you want the agent's commits to appear as verified on GitHub, add it to your account at:\n**Settings \u003e SSH and GPG keys \u003e New GPG key**.\n\nThe key is persisted in the Docker volume, so it survives container restarts and image rebuilds.\n\nSee [Manage GPG keys](#manage-gpg-keys) for export, import, revocation, and other key management\ncommands.\n\n## Usage\n\n### Run the workcell\n\nNavigate to any project directory and run:\n\n```bash\n# Normal mode (defaults to claude)\nworkcell run\n\n# Explicit agent selection\nworkcell run claude\nworkcell run opencode\nworkcell run codex\n\n# YOLO mode (no permission prompts)\nworkcell run --yolo\nworkcell run opencode --yolo\nworkcell run codex --yolo\n\n# Firewalled mode (restricted network access)\nworkcell run --firewalled\n\n# Chrome enabled (browser control)\nworkcell run --with-chrome\n\n# Expose a port for dev server (accessible at localhost:3000 on host)\nworkcell run --port 3000\n\n# Multiple ports\nworkcell run --port 3000 --port 5173\n\n# Web dev setup: YOLO + Chrome + port exposed\nworkcell run --yolo --with-chrome --port 3000\n\n# YOLO + firewalled\nworkcell run --yolo --firewalled\n\n# With a prompt\nworkcell run --yolo -p \"fix the tests\"\n\n# Pass any agent-specific arguments\nworkcell run --resume\nworkcell run opencode run \"summarize the repo\"\nworkcell run codex \"fix the tests\"\n```\n\n**Choosing an agent.** The first positional arg after `run` selects the agent: `claude` (default),\n`opencode`, or `codex`. All agents use the same sandbox image, the same persistent Docker volume,\nand the same `--yolo` / `--firewalled` / `--with-chrome` / `--port` flags. `--yolo` maps to each\nagent's native bypass:\n\n- **claude** → `--dangerously-skip-permissions` CLI flag\n- **opencode** → `{\"permission\":\"allow\"}` injected via the `OPENCODE_CONFIG_CONTENT` env var\n  (opencode's CLI flag only applies to the non-interactive `run` subcommand, not the TUI)\n- **codex** → `--dangerously-bypass-approvals-and-sandbox` CLI flag\n\n**Shorthand:** Running `workcell` without a command defaults to `run` with claude:\n\n```bash\nworkcell --yolo --with-chrome --port 3000\n```\n\n### Start Chrome separately\n\nIf you want to start Chrome independently (e.g., to keep it running across workcell sessions):\n\n```bash\n# Start Chrome with remote debugging\nworkcell start-chrome\n\n# Auto-restart if Chrome is running\nworkcell start-chrome --restart\n\n# Override settings from config\nworkcell start-chrome --port 9333 --profile \"Profile 1\"\n```\n\n### Manage GPG keys\n\n```bash\n# Generate a new key (reads identity from config.sh)\nworkcell gpg-new\n\n# Export the workcell GPG key\nworkcell gpg-export --file my-key-backup.asc\n\n# Import a previously exported key\nworkcell gpg-import --file my-key-backup.asc\n\n# Generate a revocation certificate\nworkcell gpg-revoke --file revoke.asc\n\n# Erase all GPG keys from the workcell\nworkcell gpg-erase\n```\n\n### Edit workcell settings\n\nOpen an agent's config file in `vi` (inside the workcell Docker volume). The agent argument is\nrequired — there is no default, to avoid accidentally editing the wrong file:\n\n```bash\n# Claude Code: edits ~/.claude/settings.json. See https://docs.anthropic.com/en/docs/claude-code/settings\nworkcell settings claude\n\n# OpenCode: edits ~/.config/opencode/opencode.jsonc if present. See https://opencode.ai/docs/config/\n# otherwise ~/.config/opencode/opencode.json\nworkcell settings opencode\n\n# Codex: edits ~/.codex/config.toml. See https://developers.openai.com/codex/config-reference\nworkcell settings codex\n```\n\nIf no OpenCode config file exists yet, `workcell settings opencode` creates a minimal\n`opencode.json` with the schema URL before opening it.\nIf no Codex config file exists yet, `workcell settings codex` creates an empty\n`config.toml` before opening it.\n\nThese edits persist across container restarts.\n\n## How it works\n\n- Your current directory is mounted at `/workspaces/\u003cproject-name\u003e` inside the container\n- Workspace-local workcell files for the current project live under `.workcell/`\n- Claude Code session history for the project is stored in `.workcell/claude-sessions/`\n- `.workcell/tasks/` is created for task-management files and other local multi-agent scratch work\n- OpenCode session history and storage persist in the Docker volume under\n  `~/.local/share/opencode/`\n- Codex auth, config, history, and logs persist in the Docker volume under `~/.codex/`\n- Codex conversation/session files for the project are bind-mounted into `.workcell/codex-sessions/`\n- Agent settings (claude, opencode, and codex) persist between sessions via a Docker volume\n- The container runs as non-root user `agent` for safety (agent-neutral, regardless of which agent\n  CLI is launched)\n- Full network access is available (for web searches, docs, git, etc.)\n- Filesystem access is isolated to the mounted directory\n- Host services are accessible via `host.docker.internal`\n- Dev server ports can be exposed with `--port \u003cport\u003e` (sets `$EXPOSED_PORTS` env var)\n- A global context file is injected as `~/.claude/CLAUDE.md` (claude),\n  `~/.config/opencode/AGENTS.md` (opencode), and `~/.codex/AGENTS.md` (codex) to inform each\n  agent about the sandbox environment\n- With `--with-chrome`, agents can control Chrome on the host for web development\n\n## Persistence\n\n### User data (Docker volume)\n\nUser-level data (credentials, settings, plugins) is stored in a Docker volume `agent-workcell`,\nmounted at `/home/agent/persist` inside the container.\n\n```\nagent-workcell → /home/agent/persist/\n├── .claude/                  # Claude Code configuration (~/.claude)\n│   ├── .credentials.json     # (plaintext — keep the volume private)\n│   ├── settings.json\n│   ├── CLAUDE.md             # Global agent context (claude)\n│   └── ...\n├── .claude.json              # Onboarding state, theme, user ID\n├── .claude-versions/         # Claude Code binary versions\n│   └── versions/             # Downloaded Claude Code updates\n├── .config/opencode/         # OpenCode configuration (~/.config/opencode)\n│   ├── opencode.json{,c}\n│   └── AGENTS.md             # Global agent context (opencode)\n├── .local/state/opencode/    # OpenCode local UI state (~/.local/state/opencode)\n│   └── model.json            # recent/favorite models and per-model variants\n├── .local/share/opencode/    # OpenCode data (~/.local/share/opencode)\n│   ├── auth.json             # (plaintext provider credentials)\n│   ├── log/\n│   ├── opencode.db           # session/message history\n│   └── storage/              # additional OpenCode session artifacts\n├── .opencode/                # OpenCode install home (binary + bundled dependencies)\n├── .codex/                   # Codex configuration and non-session state (~/.codex)\n│   ├── config.toml           # User settings\n│   ├── auth.json             # (plaintext — keep the volume private)\n│   ├── history.jsonl         # Command history\n│   ├── log/                  # Logs\n│   └── AGENTS.md             # Global agent context (codex)\n├── .rustup/                  # Rust toolchains and components\n├── .cargo/                   # Cargo registry cache, installed binaries, and config\n├── .gnupg/                   # GPG keys for commit signing (when GPG_SIGNING is enabled)\n├── .nvm/                     # Node.js versions and global packages\n│   ├── versions/node/        # Installed Node.js versions\n│   └── ...\n```\n\nThe entrypoint creates symlinks so tools find their config in the expected locations:\n\n- `~/.claude` → `~/persist/.claude`\n- `~/.claude.json` → `~/persist/.claude.json`\n- `~/.local/share/claude` → `~/persist/.claude-versions`\n- `~/.opencode` → `~/persist/.opencode`\n- `~/.config/opencode` → `~/persist/.config/opencode`\n- `~/.local/state/opencode` → `~/persist/.local/state/opencode`\n- `~/.local/share/opencode` → `~/persist/.local/share/opencode`\n- `~/.codex` → `~/persist/.codex`\n- `~/.rustup` → `~/persist/.rustup`\n- `~/.cargo` → `~/persist/.cargo`\n- `~/.gnupg` → `~/persist/.gnupg`\n- `~/.nvm` → `~/persist/.nvm`\n\nThis ensures authentication, settings, OpenCode's local model-picker state, installed Claude Code\nand OpenCode versions, Rust toolchains, Node.js versions, and global npm packages persist\nacross container restarts and image rebuilds. Codex ships as a standalone binary baked into\nthe image, so image rebuilds pick up the newer Codex version without any volume interaction.\n\n\u003e **Security note.** All agents store credentials as plaintext inside the Docker volume\n\u003e (`~/.claude/.credentials.json` for Claude Code, `~/.local/share/opencode/auth.json` for OpenCode,\n\u003e `~/.codex/auth.json` for Codex). Anyone who can read the `agent-workcell` volume can read those\n\u003e keys. Treat volume backups (`workcell volume-backup`) as sensitive.\n\n### Workspace-local workcell data\n\nThe workcell creates a workspace-local `.workcell/` directory for project-scoped agent\nsessions and task-management files:\n\n- `.workcell/claude-sessions/` — bind-mounted to claude's per-project session dir\n  (`~/persist/.claude/projects/-workspaces-\u003cproject\u003e/`)\n- `.workcell/opencode-sessions/` — destination for `workcell opencode-sessions-export`\n  (one JSON file per session; see [opencode session data](#opencode-session-data))\n- `.workcell/codex-sessions/` — the workspace-local source of truth for Codex conversation\n  files, with two sibling subdirectories: `sessions/` (bind-mounted to `~/persist/.codex/sessions/`,\n  date-partitioned as `sessions/YYYY/MM/DD/*.jsonl`) and `archived_sessions/` (bind-mounted to\n  `~/persist/.codex/archived_sessions/`)\n- `.workcell/tasks/` — task-management files and scratch notes for multi-agent workflows\n  (see [Multi-agent task files](#multi-agent-task-files))\n\n### Multi-agent task files\n\n`.workcell/tasks/` is a shared scratchpad for coordinating work across multiple agent\nsessions — sub-agents within a single run or different agents across different sessions. Agents\nare instructed (via the injected global context file) to create a task file whenever a request\nspans multiple steps or is likely to continue later, and to read existing task files before\nstarting non-trivial work so handoffs don't lose context.\n\nEach task file is a single Markdown document named\n`YYYYMMDD-HHMMSS-brief-descriptive-slug.md` (UTC timestamp prefix for chronological ordering and\nuniqueness across agents). The expected sections are:\n\n- **Status / Created / Updated** — lifecycle metadata.\n- **Objective** — what the task aims to accomplish, and why.\n- **Context** — background a fresh agent needs (prior discoveries, constraints, user preferences,\n  relevant files/commits/PRs).\n- **Plan** — checklist of steps.\n- **Findings** — append-only, timestamped log of discoveries and decisions. Previous entries are\n  never rewritten; corrections are added as new entries.\n- **Next Steps** — handoff note left when pausing; cleared on completion.\n- **Dependencies** — links to other task files or external blockers.\n- **Notes** — free-form scratch area.\n\nSub-tasks go in their own task files, linked via `Dependencies`, rather than being nested inside\na single file. The full rule set agents follow lives in\n[`sandbox/agent-context.md`](sandbox/agent-context.md) under *Task Management (Multi-Agent\nWorkflows)*.\n\n### OpenCode session data\n\nOpenCode persists its session state in the Docker volume:\n\n- `~/persist/.local/share/opencode/opencode.db` — session/message records\n- `~/persist/.local/share/opencode/storage/` — additional session artifacts such as\n  `session_diff/` and migration metadata\n\nThis means OpenCode sessions survive workcell restarts and image rebuilds, but they are tied to the\nDocker volume rather than the workspace tree. To keep a workspace-local backup that survives\n`workcell volume-rm`, export them:\n\n```bash\nworkcell opencode-sessions-export\n```\n\nThis writes one JSON file per session to `.workcell/opencode-sessions/\u003csession-id\u003e.json`,\nauto-scoped to the current workspace (OpenCode derives the project ID from the git root-commit\nSHA, or uses `\"global\"` for non-git directories). Re-running the command overwrites existing\nfiles; session files for sessions later deleted in OpenCode are left in place as recovery\nartifacts.\n\nTo restore after a `volume-rm` (or on a fresh machine), run:\n\n```bash\nworkcell opencode-sessions-import\n```\n\nThis imports every JSON file under `.workcell/opencode-sessions/`. Session IDs and project\nscoping are preserved from the JSON, so sessions restore to the original workspace as long as the\ngit root-commit SHA matches. Re-importing an existing session is a no-op.\n\n\u003e **Tip.** Add `.workcell/` to your `.gitignore` (global or per-repo). These files are local\n\u003e state, not source — and like any agent history they may contain secrets the agent read during\n\u003e the session.\n\n### Managing the volume\n\n```bash\n# Open a shell in the volume\nworkcell volume-shell\n\n# Backup the volume\nworkcell volume-backup --file agent-workcell-bkp.tgz\n\n# Restore from backup\nworkcell volume-restore --file agent-workcell-bkp.tgz\n\n# Remove the volume\nworkcell volume-rm\n```\n\n## Browser Integration (Web Development)\n\nThe workcell includes browser control tools for web development workflows. Agents can interact with\nChrome running on your host machine via the Chrome DevTools Protocol (CDP).\n\n### Prerequisites\n\nInstall `socat` for port forwarding (one-time setup):\n\n```bash\nbrew install socat\n```\n\n### Usage\n\nSimply use the `--with-chrome` flag:\n\n```bash\nworkcell --with-chrome\n```\n\nThis automatically:\n1. Starts Chrome with remote debugging (using your \"Agent\" profile)\n2. Sets up port forwarding via socat\n3. Sets `CHROME_LOG` env var and mounts the log file (for troubleshooting)\n4. Cleans up Chrome when the workcell exits\n\nThe agent can use `browser test` to check if Chrome is available.\n\n### How It Works\n\nThere are two directions of communication:\n\n**1. Container → Host (Chrome control via CDP)**\n\nChrome on Mac ignores `--remote-debugging-address=0.0.0.0` and only binds to `127.0.0.1`. Since\nDocker containers can't reach the host's localhost directly, we use `socat` as a bridge:\n\n```\n┌─────────────────────────────────────────────────────────────────────┐\n│  HOST (Mac)                                                         │\n│                                                                     │\n│   Chrome ◄──────── socat ◄──────── Docker Network                   │\n│   127.0.0.1:19222   0.0.0.0:9222    host.docker.internal:9222       │\n│   (internal)        (bridge)        (container access)              │\n└─────────────────────────────────────────────────────────────────────┘\n```\n\n**2. Host → Container (accessing dev servers)**\n\nDev servers running in the container are exposed via the `--port` flag:\n\n```bash\nworkcell --with-chrome --port 3000\n```\n\n```\n┌─────────────────────────────────────────────────────────────────────┐\n│  HOST (Mac)                                                         │\n│                                                                     │\n│   Browser ────► localhost:3000 ────► Docker -p 3000:3000            │\n│                                                                     │\n└─────────────────────────────────────────────────────────────────────┘\n                                  │\n                                  ▼\n┌─────────────────────────────────────────────────────────────────────┐\n│  CONTAINER                                                          │\n│                                                                     │\n│   React/Vite/etc ◄─── 0.0.0.0:3000                                  │\n│                                                                     │\n└─────────────────────────────────────────────────────────────────────┘\n```\n\nThe `$EXPOSED_PORTS` env var contains the list of exposed ports (e.g., `3000,5173`).\n\n**Complete flow for web development:**\n\n*User (on host):*\n1. Start workcell with port: `workcell --with-chrome --port 3000`\n\n*Agent (in container):*  \n2. Start dev server: `npm run dev -- --host 0.0.0.0` (must bind to 0.0.0.0)  \n3. Navigate Chrome: `browser goto \"http://localhost:3000\"` (Chrome is on host)\n\n## Available Tools\n\nThe workcell comes with the following pre-installed:\n\n| Category | Tools |\n|----------|-------|\n| **Languages** | Node.js LTS (via nvm), Python 3.11, Rust (stable) |\n| **Node.js** | `nvm` (version manager), `npm`, `npx` |\n| **Python** | `pyright` (type checker), `ruff` (linter), `playwright`, `matplotlib`, `numpy` |\n| **Browser** | `browser` CLI for Chrome automation |\n| **Database** | `psql` (PostgreSQL client) |\n| **Utilities** | `git`, `curl`, `wget`, `jq`, `yq`, `ripgrep`, `fd` |\n\n## Network restrictions\n\nUse the `--firewalled` flag to restrict network access to essential agent and tooling domains only:\n\n- Anthropic API (api.anthropic.com, claude.ai)\n- OpenAI / Codex (api.openai.com, chatgpt.com, auth.openai.com)\n- OpenCode, including Zen and Go (opencode.ai)\n- JavaScript/TypeScript (npm, Yarn, nodejs.org)\n- Rust (crates.io, docs.rs, rust-lang.org)\n- GitHub\n\nThis reduces the risk of data exfiltration to unauthorized servers while still allowing the agent\nto fetch docs and install packages.\n\n## Project structure\n\n```\nagent-workcell/\n├── README.md\n├── docker-compose.yml\n├── cli.sh                      # Main CLI entrypoint\n├── config.template.sh          # Configuration template\n├── config.sh                   # Your config (create from template, gitignored)\n├── scripts/\n│   ├── run_sandbox.sh          # Docker container runner\n│   └── start-chrome-debug.sh   # Chrome debug launcher\n└── sandbox/\n    ├── agent-context.md        # Global context for the sandboxed agent\n    ├── Dockerfile\n    ├── entrypoint.sh\n    ├── init-firewall.sh\n    └── browser-tools/          # Browser control utilities\n        ├── browser.sh          # CLI wrapper\n        └── browser.py          # Python module\n```\n\n## License\n\nThis project is licensed under the [Apache License (Version 2.0)](LICENSE).\n\n## Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally submitted for inclusion by\nyou, shall be licensed as Apache-2.0, without any additional terms or conditions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflemosr%2Fagent-workcell","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflemosr%2Fagent-workcell","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflemosr%2Fagent-workcell/lists"}