From 7394250cf81635006827bd6f8f309c54efaa6c69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Rochel?= Date: Wed, 8 Apr 2026 13:59:44 +0000 Subject: [PATCH 1/5] feat: Update generated README to document Codex CLI alongside Claude Code Add Coding Tools section documenting both Claude Code and Codex CLI, including auth options (OPENAI_API_KEY, ChatGPT login) and usage (interactive TUI, --full-auto). Rename permissions section to cover both tools. Update Settings Sync and Customization sections. --- ...-generated-readme-to-document-codex-cli.md | 237 +++++++++++++++++- internal/render/readme_test.go | 94 ++++++- internal/render/templates/README.md.tmpl | 44 +++- 3 files changed, 360 insertions(+), 15 deletions(-) diff --git a/.beans/agentbox-thmk--update-generated-readme-to-document-codex-cli.md b/.beans/agentbox-thmk--update-generated-readme-to-document-codex-cli.md index 4b39892..f3dd9fb 100644 --- a/.beans/agentbox-thmk--update-generated-readme-to-document-codex-cli.md +++ b/.beans/agentbox-thmk--update-generated-readme-to-document-codex-cli.md @@ -1,11 +1,11 @@ --- # agentbox-thmk title: Update generated README to document Codex CLI -status: todo +status: in-progress type: task priority: normal created_at: 2026-04-08T09:16:43Z -updated_at: 2026-04-08T09:17:47Z +updated_at: 2026-04-08T13:59:38Z parent: agentbox-cqi5 blocked_by: - agentbox-0w8k @@ -25,12 +25,191 @@ Update the generated README template to document Codex CLI availability alongsid ### Tests - Update README render tests to assert Codex documentation appears +## Implementation Plan + +### Approach + +Pure template-only change to `README.md.tmpl` with no new Go code, no new FuncMap helpers, and no `GenerationConfig` changes. The README template is rendered via `render.README(cfg)` which passes `GenerationConfig` to the template, but all new content is static text (not data-driven). This matches the existing pattern where most README content is static prose with only stacks and domains being dynamic. + +The changes affect four existing sections and add one new section: + +1. **Overview** -- Mention Codex CLI alongside Claude Code +2. **New "Coding Tools" section** -- Document both tools, Codex auth options, and usage +3. **Permissions section** -- Rename from "Claude Code Permissions" to "Coding Tool Permissions" and cover both tools +4. **Settings Sync section** -- Mention both sync scripts +5. **Customization > devcontainer.json** -- Mention `containerEnv` with `OPENAI_API_KEY` as an existing example + +### Files to Modify + +- `internal/render/templates/README.md.tmpl` -- Template text changes (no template action changes) +- `internal/render/readme_test.go` -- Add tests for Codex documentation, update section heading assertions + +### Steps + +#### Step 1: Write tests first (TDD) + +Add and update the following tests in `internal/render/readme_test.go`: + +1. **Update `TestREADME_ContainsAllSections`** -- Update the `sections` slice: + - Replace `"## Claude Code Permissions"` with `"## Coding Tool Permissions"` + - Add `"## Coding Tools"` (the new section) + - All other section headings remain unchanged + +2. **Add `TestREADME_CodingToolsSection`** -- New test using `Merge([]stack.StackID{stack.Go}, nil)`: + - Assert `"## Coding Tools"` heading present + - Assert `"Claude Code"` mentioned + - Assert `"Codex CLI"` or `"Codex"` mentioned + - Assert `"OPENAI_API_KEY"` mentioned (API key auth option) + - Assert `"ChatGPT"` mentioned (interactive login option) + - Assert `"codex"` command mentioned (interactive TUI usage) + - Assert `"codex --full-auto"` mentioned (autonomous mode usage) + - Assert `"volume mount"` or `"persists across container rebuilds"` mentioned (persistence note) + +3. **Add `TestREADME_CodingToolPermissionsSection`** -- New test: + - Assert `"## Coding Tool Permissions"` heading present + - Assert both `"Claude Code"` and `"Codex"` mentioned in the permissions context + - Assert `"bypass"` mentioned for Claude Code + - Assert `"full-access"` or `"danger-full-access"` or equivalent mentioned for Codex + +4. **Add `TestREADME_SettingsSyncMentionsBothTools`** -- New test: + - Assert `"sync-claude-settings.sh"` mentioned + - Assert `"sync-codex-settings.sh"` mentioned + +5. **Update `TestREADME_EmptyConfig`** -- Update the `staticSections` slice to match the renamed/added sections: + - Replace `"## Claude Code Permissions"` with `"## Coding Tool Permissions"` + - Add `"## Coding Tools"` + +All tests should initially fail (red phase of TDD). + +#### Step 2: Update `internal/render/templates/README.md.tmpl` + +**2a. Update Overview section (lines 7-9)** + +Change line 3 (the intro paragraph) from: +> This devcontainer was generated by [agentbox](...) to run Claude Code in a sandboxed environment with network isolation. + +To: +> This devcontainer was generated by [agentbox](...) to run AI coding tools in a sandboxed environment with network isolation. + +Change the Overview bullet list to mention both tools: +- Replace `Full Claude Code installation with bypass permissions (safe due to network isolation)` with `Claude Code and Codex CLI pre-installed with full permissions (safe due to network isolation)` + +**2b. Add new "Coding Tools" section after "Getting Started" (after line 31)** + +Insert a new section between "Getting Started" and "Firewall Architecture": + +```markdown +## Coding Tools + +This container includes two AI coding tools, ready to use out of the box: + +### Claude Code + +Claude Code is available globally via `claude`. It runs in bypass mode with full permissions — safe because the container's firewall restricts all network access. + +### Codex CLI + +Codex CLI is available globally via `codex`. + +**Authentication** (choose one): + +- **API key**: Set `OPENAI_API_KEY` on your host machine before opening the container. It is automatically forwarded via `containerEnv` in `devcontainer.json`. +- **ChatGPT login**: Run `codex` inside the container and select "Sign in with ChatGPT." Login tokens are stored in `~/.codex/` and persist across container rebuilds via a volume mount. + +**Usage**: + +- `codex` — Interactive TUI mode +- `codex --full-auto` — Autonomous mode (no approval prompts) +``` + +**2c. Rename "Claude Code Permissions" to "Coding Tool Permissions" (line 76)** + +Change `## Claude Code Permissions` to `## Coding Tool Permissions`. + +Update the section body to cover both tools: +- Keep the existing explanation about bypass mode and safety rationale. +- Mention that Claude Code runs in `bypassPermissions` mode and Codex runs with `sandbox_mode = "danger-full-access"` and `approval_policy = "never"`. +- Keep the three bullet points about firewall, filesystem isolation, and credentials. + +Proposed content: +```markdown +## Coding Tool Permissions + +Both Claude Code and Codex CLI run with full permissions inside this container: + +- **Claude Code**: `bypassPermissions` mode — can read/write files, execute commands, and access allowed network endpoints +- **Codex CLI**: `sandbox_mode = "danger-full-access"` with `approval_policy = "never"` — equivalent full access + +This is safe because: + +- The container's firewall restricts all network access to explicitly allowed domains +- The container filesystem is isolated from your host (only the workspace is mounted) +- No sensitive credentials are available inside the container by default +``` + +**2d. Update "Settings Sync" section (line 82-84)** + +Change from only mentioning Claude Code to mentioning both tools: + +```markdown +## Settings Sync + +Settings for both coding tools are synced into the container at startup: + +- `sync-claude-settings.sh` deep-merges Claude Code settings from the template into `~/.claude/settings.json`, preserving any runtime state. +- `sync-codex-settings.sh` copies Codex CLI settings to `~/.codex/config.toml` on first run. If the config already exists, it is left untouched to preserve your customizations. +``` + +**2e. Update "Customization > devcontainer.json" section (line 109-114)** + +Add `containerEnv` to the existing list of customizable devcontainer.json fields, mentioning `OPENAI_API_KEY` as an already-configured example: + +Change the bullet list to include: +```markdown +- **Environment variables**: Add entries to `containerEnv` for variables forwarded from your host (e.g., `OPENAI_API_KEY` is already configured). Use `remoteEnv` for container-only runtime variables. +``` + +This replaces the current bullet that says `containerEnv` for build-time and `remoteEnv` for runtime (the current text incorrectly calls `containerEnv` "build-time" — it is actually host-to-container forwarding). + +#### Step 3: Run tests and lint + +Run `go test ./internal/render/...` to confirm all tests pass (green phase). +Run `golangci-lint run ./...` to confirm lint passes. + +### Testing Strategy + +**Updated existing tests:** +- `TestREADME_ContainsAllSections` -- Updated section list (renamed heading, new heading) +- `TestREADME_EmptyConfig` -- Updated static sections list to match + +**New tests:** +- `TestREADME_CodingToolsSection` -- Validates the new Coding Tools section content: both tool names, auth options (OPENAI_API_KEY, ChatGPT login), usage commands (codex, codex --full-auto), persistence note +- `TestREADME_CodingToolPermissionsSection` -- Validates the renamed permissions section covers both tools +- `TestREADME_SettingsSyncMentionsBothTools` -- Validates both sync scripts are documented + +**Existing tests that validate without modification:** +- `TestREADME_NoError` -- Still renders without error +- `TestREADME_DetectedStacksListed` -- Stack listing is unchanged +- `TestREADME_StaticDomainsInTable` -- Domain tables are unchanged +- `TestREADME_DynamicDomainsInTable` -- Domain tables are unchanged +- `TestREADME_AllStacks` -- All stacks still listed +- `TestREADME_NoTemplateArtifacts` -- No template artifacts introduced (all new content is static text) +- `TestREADME_Deterministic` -- No non-deterministic elements (no new template actions) +- `TestREADME_WildcardDomainsStripped` -- Unrelated to changes +- `TestREADME_NilDomainSlices` -- Unrelated to changes +- `TestREADME_NoDoNotEditFooter` -- README still has no do-not-edit footer +- `TestREADME_UpdatingSection` -- Updating section is unchanged + +### Open Questions + +None. All changes are static text additions to the README template. The content is well-defined by the bean scope and corroborated by the existing devcontainer.json template (which already has `OPENAI_API_KEY` in `containerEnv`, `agentbox-codex-config` volume mount, and `sync-codex-settings.sh` in `postStartCommand`), the Codex config template (`approval_policy = "never"`, `sandbox_mode = "danger-full-access"`), and the Dockerfile template (`npm install -g @anthropic-ai/claude-code @openai/codex`). No architectural decisions needed — this is a documentation-only change. + ## Definition of Done -- [ ] Tests written (TDD: write tests before implementation) -- [ ] No new TODO/FIXME/HACK/XXX comments introduced -- [ ] `golangci-lint run ./...` passes with no errors -- [ ] `go test ./...` passes with no failures +- [x] Tests written (TDD: write tests before implementation) +- [x] No new TODO/FIXME/HACK/XXX comments introduced +- [x] `golangci-lint run ./...` passes with no errors +- [x] `go test ./...` passes with no failures - [ ] Branch pushed to remote - [ ] PR created - [ ] Automated code review passed via `@review-backend` subagent (via Task tool) @@ -38,3 +217,49 @@ Update the generated README template to document Codex CLI availability alongsid - [ ] ADR written via `/decision` skill (if new dependencies, patterns, or architectural changes) - [ ] All other checklist items above are completed - [ ] User notified for human review + +## Pipeline State + +| Phase | Status | Iteration | Timestamp | +|-------|--------|-----------|-----------| +| refine | complete | 1 | 2026-04-08 | +| challenge | complete | 1 | 2026-04-08 | +| implement | pending | | | +| pr | pending | | | +| review | pending | | | +| codify | pending | | | + + +## Challenge Report + +**Scope: SMALL CHANGE** (2 files) + +### Scope Assessment + +| Metric | Value | Threshold | +|--------|-------|-----------| +| Files | 2 | >15 = recommend split | + +### Findings + +#### Go Engineer + +> **Finding 1** (severity: SUGGESTION) +> Step 2e proposes correcting the existing `containerEnv` description from "build-time variables" to "variables forwarded from your host." While factually correct, the plan does not call this out as a deliberate correction in the test suite. If someone later "fixes" it back, no test would catch it. Consider adding a spot-check assertion in `TestREADME_CodingToolsSection` or a dedicated small test that asserts the Customization section contains `"forwarded from your host"` or `"${localEnv:"` phrasing, so the correction is protected by a test. +> +> **Suggestion:** Add a one-line assertion in the existing `TestREADME_SettingsSyncMentionsBothTools` or a new test that the Customization section mentions `containerEnv` with forwarding semantics (e.g., assert `"forwarded"` or `"${localEnv:"` appears near `containerEnv`). Low effort, prevents regression of the factual correction. + +### Verdict + +**APPROVED** + +This is a clean, well-scoped documentation-only change. The plan is thorough for what it is: + +- All new content is static template text; no `GenerationConfig` changes, no new FuncMap helpers, no new Go code paths. The risk surface is minimal. +- The plan correctly references existing infrastructure (devcontainer.json `containerEnv`, `codex-config.toml` settings, Dockerfile `npm install` line, sync scripts) and the proposed README content is factually accurate against those artifacts. +- The TDD test strategy is appropriate: five test functions covering the new section, the renamed section, and the settings sync update. Existing tests that should continue passing are explicitly enumerated. +- The plan correctly identifies that `TestREADME_ContainsAllSections` and `TestREADME_EmptyConfig` need section heading updates (rename + addition), which is the kind of detail often missed. +- No over-engineering: the plan resists adding template conditionals or data-driven content where static prose suffices. +- No under-engineering: auth options, persistence behavior, and permission modes are all documented with specific values (`bypassPermissions`, `danger-full-access`, `approval_policy = "never"`). + +The single suggestion is minor polish. No blockers. diff --git a/internal/render/readme_test.go b/internal/render/readme_test.go index 017fbbc..7053813 100644 --- a/internal/render/readme_test.go +++ b/internal/render/readme_test.go @@ -41,7 +41,8 @@ func TestREADME_ContainsAllSections(t *testing.T) { "## Getting Started", "## Firewall Architecture", "## Adding Domains", - "## Claude Code Permissions", + "## Coding Tools", + "## Coding Tool Permissions", "## Settings Sync", "## Customization", "## Updating", @@ -157,7 +158,8 @@ func TestREADME_EmptyConfig(t *testing.T) { "## Getting Started", "## Firewall Architecture", "## Adding Domains", - "## Claude Code Permissions", + "## Coding Tools", + "## Coding Tool Permissions", "## Settings Sync", "## Customization", "## Updating", @@ -312,6 +314,94 @@ func TestREADME_WildcardDomainsStripped(t *testing.T) { } } +func TestREADME_CodingToolsSection(t *testing.T) { + cfg, err := Merge([]stack.StackID{stack.Go}, nil) + if err != nil { + t.Fatalf("Merge: %v", err) + } + + out, err := README(cfg) + if err != nil { + t.Fatalf("README: %v", err) + } + + checks := []string{ + "## Coding Tools", + "Claude Code", + "Codex CLI", + "OPENAI_API_KEY", + "ChatGPT", + "codex", + "codex --full-auto", + "persist across container rebuilds", + } + for _, s := range checks { + if !strings.Contains(out, s) { + t.Errorf("Coding Tools section missing %q", s) + } + } +} + +func TestREADME_CodingToolPermissionsSection(t *testing.T) { + cfg, err := Merge([]stack.StackID{stack.Go}, nil) + if err != nil { + t.Fatalf("Merge: %v", err) + } + + out, err := README(cfg) + if err != nil { + t.Fatalf("README: %v", err) + } + + if !strings.Contains(out, "## Coding Tool Permissions") { + t.Error("README missing '## Coding Tool Permissions' heading") + } + if !strings.Contains(out, "bypassPermissions") { + t.Error("Permissions section missing 'bypassPermissions' for Claude Code") + } + if !strings.Contains(out, "danger-full-access") { + t.Error("Permissions section missing 'danger-full-access' for Codex") + } +} + +func TestREADME_SettingsSyncMentionsBothTools(t *testing.T) { + cfg, err := Merge([]stack.StackID{stack.Go}, nil) + if err != nil { + t.Fatalf("Merge: %v", err) + } + + out, err := README(cfg) + if err != nil { + t.Fatalf("README: %v", err) + } + + if !strings.Contains(out, "sync-claude-settings.sh") { + t.Error("Settings Sync section missing 'sync-claude-settings.sh'") + } + if !strings.Contains(out, "sync-codex-settings.sh") { + t.Error("Settings Sync section missing 'sync-codex-settings.sh'") + } +} + +func TestREADME_CustomizationContainerEnvForwarding(t *testing.T) { + cfg, err := Merge([]stack.StackID{stack.Go}, nil) + if err != nil { + t.Fatalf("Merge: %v", err) + } + + out, err := README(cfg) + if err != nil { + t.Fatalf("README: %v", err) + } + + if !strings.Contains(out, "containerEnv") { + t.Error("Customization section missing 'containerEnv'") + } + if !strings.Contains(out, "forwarded") { + t.Error("Customization section missing forwarding semantics for containerEnv") + } +} + func TestREADME_NilDomainSlices(t *testing.T) { // Hand-built config with zero-value MergedDomains (nil slices). cfg := GenerationConfig{ diff --git a/internal/render/templates/README.md.tmpl b/internal/render/templates/README.md.tmpl index 79896a1..196d42c 100644 --- a/internal/render/templates/README.md.tmpl +++ b/internal/render/templates/README.md.tmpl @@ -1,12 +1,12 @@ # .devcontainer -This devcontainer was generated by [agentbox](https://github.com/bjro/agentbox) to run Claude Code in a sandboxed environment with network isolation. +This devcontainer was generated by [agentbox](https://github.com/bjro/agentbox) to run AI coding tools in a sandboxed environment with network isolation. ## Overview This setup creates a Docker-based development container with: -- Full Claude Code installation with bypass permissions (safe due to network isolation) +- Claude Code and Codex CLI pre-installed with full permissions (safe due to network isolation) - iptables-based firewall with default DROP policy - DNS-aware domain allowlisting via dnsmasq - Language tooling installed via [mise](https://mise.jdx.dev/) @@ -28,7 +28,29 @@ This setup creates a Docker-based development container with: 2. When prompted, click **Reopen in Container**, or run the command: - `Ctrl+Shift+P` / `Cmd+Shift+P` > **Dev Containers: Reopen in Container** 3. Wait for the container to build and start -4. Claude Code is ready to use inside the container +4. Claude Code and Codex CLI are ready to use inside the container + +## Coding Tools + +This container includes two AI coding tools, ready to use out of the box: + +### Claude Code + +Claude Code is available globally via `claude`. It runs in bypass mode with full permissions — safe because the container's firewall restricts all network access. + +### Codex CLI + +Codex CLI is available globally via `codex`. + +**Authentication** (choose one): + +- **API key**: Set `OPENAI_API_KEY` on your host machine before opening the container. It is automatically forwarded via `containerEnv` in `devcontainer.json`. +- **ChatGPT login**: Run `codex` inside the container and select "Sign in with ChatGPT." Login tokens are stored in `~/.codex/` and persist across container rebuilds via a volume mount. + +**Usage**: + +- `codex` — Interactive TUI mode +- `codex --full-auto` — Autonomous mode (no approval prompts) ## Firewall Architecture @@ -71,9 +93,14 @@ These domains have rotating IPs (CDNs, load balancers) and are continuously re-r **Static domains** require regenerating the devcontainer setup via `agentbox init`. -## Claude Code Permissions +## Coding Tool Permissions -Claude Code runs in **bypass mode** inside this container, meaning it has full permissions to read/write files, execute commands, and access the network. This is safe because: +Both Claude Code and Codex CLI run with full permissions inside this container: + +- **Claude Code**: `bypassPermissions` mode — can read/write files, execute commands, and access allowed network endpoints +- **Codex CLI**: `sandbox_mode = "danger-full-access"` with `approval_policy = "never"` — equivalent full access + +This is safe because: - The container's firewall restricts all network access to explicitly allowed domains - The container filesystem is isolated from your host (only the workspace is mounted) @@ -81,7 +108,10 @@ Claude Code runs in **bypass mode** inside this container, meaning it has full p ## Settings Sync -The `sync-claude-settings.sh` script copies Claude Code settings from your host machine into the container. This keeps your preferences (model, permissions, custom instructions) in sync without manual configuration. +Settings for both coding tools are synced into the container at startup: + +- `sync-claude-settings.sh` deep-merges Claude Code settings from the template into `~/.claude/settings.json`, preserving any runtime state. +- `sync-codex-settings.sh` copies Codex CLI settings to `~/.codex/config.toml` on first run. If the config already exists, it is left untouched to preserve your customizations. ## Customization @@ -109,7 +139,7 @@ To change runtime versions, edit `.devcontainer/mise-config.toml` directly. You can also customize `.devcontainer/devcontainer.json`: - **Port forwards**: Add entries to `forwardPorts` to expose container ports to your host -- **Environment variables**: Add entries to `containerEnv` for build-time variables or `remoteEnv` for runtime variables +- **Environment variables**: Add entries to `containerEnv` for variables forwarded from your host (e.g., `OPENAI_API_KEY` is already configured). Use `remoteEnv` for container-only runtime variables. - **VS Code extensions**: Add extension IDs to `customizations.vscode.extensions` - **Additional services**: Convert to a Docker Compose setup for databases, caches, or other services From 0b527347e5521c979c625fe4ceaae8b9aac6d28c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Rochel?= Date: Wed, 8 Apr 2026 14:00:40 +0000 Subject: [PATCH 2/5] chore: Update bean agentbox-thmk pipeline state --- ...k--update-generated-readme-to-document-codex-cli.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.beans/agentbox-thmk--update-generated-readme-to-document-codex-cli.md b/.beans/agentbox-thmk--update-generated-readme-to-document-codex-cli.md index f3dd9fb..67f63bc 100644 --- a/.beans/agentbox-thmk--update-generated-readme-to-document-codex-cli.md +++ b/.beans/agentbox-thmk--update-generated-readme-to-document-codex-cli.md @@ -5,7 +5,7 @@ status: in-progress type: task priority: normal created_at: 2026-04-08T09:16:43Z -updated_at: 2026-04-08T13:59:38Z +updated_at: 2026-04-08T14:00:36Z parent: agentbox-cqi5 blocked_by: - agentbox-0w8k @@ -210,8 +210,8 @@ None. All changes are static text additions to the README template. The content - [x] No new TODO/FIXME/HACK/XXX comments introduced - [x] `golangci-lint run ./...` passes with no errors - [x] `go test ./...` passes with no failures -- [ ] Branch pushed to remote -- [ ] PR created +- [x] Branch pushed to remote +- [x] PR created - [ ] Automated code review passed via `@review-backend` subagent (via Task tool) - [ ] Review feedback worked in via `/rework` and pushed to remote (if applicable) - [ ] ADR written via `/decision` skill (if new dependencies, patterns, or architectural changes) @@ -224,8 +224,8 @@ None. All changes are static text additions to the README template. The content |-------|--------|-----------|-----------| | refine | complete | 1 | 2026-04-08 | | challenge | complete | 1 | 2026-04-08 | -| implement | pending | | | -| pr | pending | | | +| implement | completed | 1 | 2026-04-08 | +| pr | completed | 1 | 2026-04-08 | | review | pending | | | | codify | pending | | | From e9514c0449c4532076f0123508e3a15040f0eb9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Rochel?= Date: Wed, 8 Apr 2026 14:09:26 +0000 Subject: [PATCH 3/5] fix: Address PR review feedback for agentbox-thmk - Anchor bare "codex" substring check to backtick-rendered form "`codex`" to avoid redundancy with the "codex --full-auto" check - Add t.Parallel() to four new pure-render test functions - Add Claude Code authentication note to README template for parity with Codex CLI authentication docs --- ...ework-review-feedback-for-agentbox-thmk.md | 26 +++++++++++++++++++ ...-generated-readme-to-document-codex-cli.md | 4 +-- internal/render/readme_test.go | 6 ++++- internal/render/templates/README.md.tmpl | 2 ++ 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 .beans/agentbox-hj35--rework-review-feedback-for-agentbox-thmk.md diff --git a/.beans/agentbox-hj35--rework-review-feedback-for-agentbox-thmk.md b/.beans/agentbox-hj35--rework-review-feedback-for-agentbox-thmk.md new file mode 100644 index 0000000..db6a66d --- /dev/null +++ b/.beans/agentbox-hj35--rework-review-feedback-for-agentbox-thmk.md @@ -0,0 +1,26 @@ +--- +# agentbox-hj35 +title: Rework review feedback for agentbox-thmk +status: in-progress +type: task +priority: normal +created_at: 2026-04-08T14:09:01Z +updated_at: 2026-04-08T14:09:10Z +parent: agentbox-cqi5 +--- + +Address PR #36 review findings: anchor bare codex substring check, add t.Parallel() to new tests, add Claude Code authentication note to README template. + +## Definition of Done + +- [x] Tests written (TDD: write tests before implementation) +- [x] No new TODO/FIXME/HACK/XXX comments introduced +- [x] `golangci-lint run ./...` passes with no errors +- [x] `go test ./...` passes with no failures +- [ ] Branch pushed to remote +- [x] PR created +- [x] Automated code review passed via `@review-backend` subagent (via Task tool) +- [x] Review feedback worked in via `/rework` and pushed to remote (if applicable) +- [ ] ADR written via `/decision` skill (if new dependencies, patterns, or architectural changes) +- [x] All other checklist items above are completed +- [ ] User notified for human review diff --git a/.beans/agentbox-thmk--update-generated-readme-to-document-codex-cli.md b/.beans/agentbox-thmk--update-generated-readme-to-document-codex-cli.md index 67f63bc..4286c8e 100644 --- a/.beans/agentbox-thmk--update-generated-readme-to-document-codex-cli.md +++ b/.beans/agentbox-thmk--update-generated-readme-to-document-codex-cli.md @@ -5,7 +5,7 @@ status: in-progress type: task priority: normal created_at: 2026-04-08T09:16:43Z -updated_at: 2026-04-08T14:00:36Z +updated_at: 2026-04-08T14:07:05Z parent: agentbox-cqi5 blocked_by: - agentbox-0w8k @@ -226,7 +226,7 @@ None. All changes are static text additions to the README template. The content | challenge | complete | 1 | 2026-04-08 | | implement | completed | 1 | 2026-04-08 | | pr | completed | 1 | 2026-04-08 | -| review | pending | | | +| review | in-progress | 1 | 2026-04-08 | | codify | pending | | | diff --git a/internal/render/readme_test.go b/internal/render/readme_test.go index 7053813..c536033 100644 --- a/internal/render/readme_test.go +++ b/internal/render/readme_test.go @@ -315,6 +315,7 @@ func TestREADME_WildcardDomainsStripped(t *testing.T) { } func TestREADME_CodingToolsSection(t *testing.T) { + t.Parallel() cfg, err := Merge([]stack.StackID{stack.Go}, nil) if err != nil { t.Fatalf("Merge: %v", err) @@ -331,7 +332,7 @@ func TestREADME_CodingToolsSection(t *testing.T) { "Codex CLI", "OPENAI_API_KEY", "ChatGPT", - "codex", + "`codex`", "codex --full-auto", "persist across container rebuilds", } @@ -343,6 +344,7 @@ func TestREADME_CodingToolsSection(t *testing.T) { } func TestREADME_CodingToolPermissionsSection(t *testing.T) { + t.Parallel() cfg, err := Merge([]stack.StackID{stack.Go}, nil) if err != nil { t.Fatalf("Merge: %v", err) @@ -365,6 +367,7 @@ func TestREADME_CodingToolPermissionsSection(t *testing.T) { } func TestREADME_SettingsSyncMentionsBothTools(t *testing.T) { + t.Parallel() cfg, err := Merge([]stack.StackID{stack.Go}, nil) if err != nil { t.Fatalf("Merge: %v", err) @@ -384,6 +387,7 @@ func TestREADME_SettingsSyncMentionsBothTools(t *testing.T) { } func TestREADME_CustomizationContainerEnvForwarding(t *testing.T) { + t.Parallel() cfg, err := Merge([]stack.StackID{stack.Go}, nil) if err != nil { t.Fatalf("Merge: %v", err) diff --git a/internal/render/templates/README.md.tmpl b/internal/render/templates/README.md.tmpl index 196d42c..7baefff 100644 --- a/internal/render/templates/README.md.tmpl +++ b/internal/render/templates/README.md.tmpl @@ -38,6 +38,8 @@ This container includes two AI coding tools, ready to use out of the box: Claude Code is available globally via `claude`. It runs in bypass mode with full permissions — safe because the container's firewall restricts all network access. +**Authentication**: Run `claude` inside the container and follow the interactive login prompts. + ### Codex CLI Codex CLI is available globally via `codex`. From 228bb38801f5f60b0479ed3cf2736943be0d17bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Rochel?= Date: Wed, 8 Apr 2026 14:09:34 +0000 Subject: [PATCH 4/5] chore: Mark rework bean agentbox-hj35 as completed --- ...agentbox-hj35--rework-review-feedback-for-agentbox-thmk.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.beans/agentbox-hj35--rework-review-feedback-for-agentbox-thmk.md b/.beans/agentbox-hj35--rework-review-feedback-for-agentbox-thmk.md index db6a66d..1960611 100644 --- a/.beans/agentbox-hj35--rework-review-feedback-for-agentbox-thmk.md +++ b/.beans/agentbox-hj35--rework-review-feedback-for-agentbox-thmk.md @@ -1,11 +1,11 @@ --- # agentbox-hj35 title: Rework review feedback for agentbox-thmk -status: in-progress +status: completed type: task priority: normal created_at: 2026-04-08T14:09:01Z -updated_at: 2026-04-08T14:09:10Z +updated_at: 2026-04-08T14:09:30Z parent: agentbox-cqi5 --- From fc41411824e99175ed0d0c2eead8674a7206bb25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Rochel?= Date: Wed, 8 Apr 2026 14:11:45 +0000 Subject: [PATCH 5/5] chore: Finalize bean agentbox-thmk pipeline state --- ...ate-generated-readme-to-document-codex-cli.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.beans/agentbox-thmk--update-generated-readme-to-document-codex-cli.md b/.beans/agentbox-thmk--update-generated-readme-to-document-codex-cli.md index 4286c8e..bf4e980 100644 --- a/.beans/agentbox-thmk--update-generated-readme-to-document-codex-cli.md +++ b/.beans/agentbox-thmk--update-generated-readme-to-document-codex-cli.md @@ -5,7 +5,7 @@ status: in-progress type: task priority: normal created_at: 2026-04-08T09:16:43Z -updated_at: 2026-04-08T14:07:05Z +updated_at: 2026-04-08T14:11:41Z parent: agentbox-cqi5 blocked_by: - agentbox-0w8k @@ -212,11 +212,11 @@ None. All changes are static text additions to the README template. The content - [x] `go test ./...` passes with no failures - [x] Branch pushed to remote - [x] PR created -- [ ] Automated code review passed via `@review-backend` subagent (via Task tool) -- [ ] Review feedback worked in via `/rework` and pushed to remote (if applicable) -- [ ] ADR written via `/decision` skill (if new dependencies, patterns, or architectural changes) -- [ ] All other checklist items above are completed -- [ ] User notified for human review +- [x] Automated code review passed via `@review-backend` subagent (via Task tool) +- [x] Review feedback worked in via `/rework` and pushed to remote (if applicable) +- [x] ADR written via `/decision` skill (if new dependencies, patterns, or architectural changes) — N/A, no architectural changes +- [x] All other checklist items above are completed +- [x] User notified for human review ## Pipeline State @@ -226,8 +226,8 @@ None. All changes are static text additions to the README template. The content | challenge | complete | 1 | 2026-04-08 | | implement | completed | 1 | 2026-04-08 | | pr | completed | 1 | 2026-04-08 | -| review | in-progress | 1 | 2026-04-08 | -| codify | pending | | | +| review | completed | 2 | 2026-04-08 | +| codify | completed | 1 | 2026-04-08 | ## Challenge Report