maesttro 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # maesttro
2
2
 
3
- Isolated Docker sandbox for local coding agents — `claude`, `opencode`, `codex`,
4
- and others. Inside the sandbox, `gh` and `git` act as the Maesttro GitHub App's
3
+ Isolated Docker runner for local coding agents — `opencode`, `claude`,
4
+ and others. Inside the runner, `gh` and `git` act as the Maesttro GitHub App's
5
5
  bot, using a token that is scoped to the current repo and lasts at most an hour.
6
6
  Your personal `~/.ssh` and `~/.config/gh` are never used. Install once, then
7
7
  `maesttro` just works from any project.
@@ -56,12 +56,12 @@ maesttro login / logout / status # manage the GitHub login
56
56
  maesttro list # see available clients
57
57
  maesttro doctor # health check anytime
58
58
 
59
- maesttro # from a repo root: new session clone + default client (claude)
59
+ maesttro # from a repo root: new session clone + default client (opencode)
60
60
  maesttro opencode # same, with opencode
61
- maesttro codex # same, with codex
62
- maesttro bash # plain shell inside the sandbox, for debugging
61
+ maesttro --strict [client] # same, with no GitHub token in the runner (no `gh`)
62
+ maesttro bash # plain shell inside the runner, for debugging
63
63
  maesttro sessions # list this repo's kept sessions
64
- maesttro resume <id> # continue one
64
+ maesttro resume <id> # continue one, in the mode it started with
65
65
  maesttro push [branch] # push a branch a session created (shows what goes out, asks first)
66
66
 
67
67
  maesttro update # bump the package + rebuild image with refreshed configs
@@ -82,7 +82,7 @@ part of the repo the container sees:
82
82
  - The host never runs git inside the clone, so agent-authored git config, hooks
83
83
  or attributes can't make your host git run anything.
84
84
  - The agent commits on its own branch in the clone. It **cannot push**:
85
- the sandbox's GitHub token is read-only for code.
85
+ the runner's GitHub token is read-only for code.
86
86
  - When a branch is ready, the agent asks you to run `maesttro push <branch>`
87
87
  from the repo root. That command pushes only branches a session created,
88
88
  never the default branch or branches that existed before. It shows you the
@@ -107,12 +107,21 @@ comments). It acts as the Maesttro GitHub App's bot:
107
107
  - Commits are authored by you (your repo's `user.name` / `user.email`) and committed by the bot.
108
108
  - The broker is reached over the tailnet. Off the tailnet, the session still starts, just without `gh`.
109
109
 
110
+ The write side is coarse. GitHub has no finer grant than "issues" and "pull
111
+ requests", so the same token that lets the agent comment and open PRs also lets
112
+ it edit label definitions and milestones, edit or close other people's issues and
113
+ comments, and submit reviews. If that is more than you want to hand an agent,
114
+ start the session with `maesttro --strict`: no token is minted and none reaches
115
+ the runner. Local git and `maesttro push` work as usual; `gh` and `git fetch` on a
116
+ private repo don't, and the agent hands GitHub actions to you instead. Resuming a
117
+ strict session stays strict; `maesttro resume <id> --no-strict` lifts it.
118
+
110
119
  ## Your instructions come along
111
120
 
112
121
  At every container start, `maesttro configure` copies your host
113
- `~/.claude/CLAUDE.md`, `~/.config/opencode/AGENTS.md`, `~/.codex/AGENTS.md` and
114
- `~/.claude/{agents,commands,skills}` into the sandbox, read-only at the
115
- source, and adds a short section explaining the sandbox rules. Credentials and
122
+ `~/.claude/CLAUDE.md`, `~/.config/opencode/AGENTS.md` and
123
+ `~/.claude/{agents,commands,skills}` into the runner, read-only at the
124
+ source, and adds a short section explaining the runner rules. Credentials and
116
125
  settings files are never copied.
117
126
 
118
127
  Upgrading from 0.1.x: the first launch removes the token you pasted before;
@@ -125,25 +134,40 @@ Defined in `src/clients.ts`, installed in `docker/Dockerfile`, configured via
125
134
 
126
135
  | Key | Client | Package |
127
136
  |---|---|---|
128
- | `claude` (default) | Claude Code | `@anthropic-ai/claude-code` |
129
- | `opencode` | opencode | `opencode-ai` |
130
- | `codex` | OpenAI Codex CLI | `@openai/codex` |
137
+ | `opencode` (default) | opencode | `opencode-ai` |
138
+ | `claude` | Claude Code | `@anthropic-ai/claude-code` |
131
139
 
132
140
  Adding a new client: add an entry to `src/clients.ts`, an install line in
133
141
  `docker/Dockerfile`, and a `docker/configs/<key>/` directory with any default
134
- config — then `maesttro update` rebuilds the image with it included.
142
+ config — then `maesttro update` rebuilds the runner image with it included.
143
+
144
+ ### Maesttro provider
145
+
146
+ Every launch builds opencode's config on your machine: your own
147
+ `~/.config/opencode/opencode.json(c)`, with secrets removed, and Maesttro's
148
+ config on top (`$MAESTTRO_URL`, default `http://100.64.0.2`). Only the result
149
+ is mounted into the runner, read-only, and copied into place at start. Your
150
+ raw config never enters the container, and your host's config is never written.
151
+
152
+ Injected: a `maesttro` provider (Orchestrate) at `/v1`, a `dgx-spark` provider
153
+ (lorem direct on the DGX), compaction, default model `maesttro/maesttro`, and
154
+ thinking blocks shown. The two providers replace yours of the same name; the
155
+ rest (`mcp`, `plugin`, other providers) is merged. Removed secrets are listed
156
+ at launch by path. `{env:X}` / `$X` references are kept.
157
+
158
+ Claude Code gets no Maesttro config and uses its own defaults and login.
135
159
 
136
160
  ---
137
161
 
138
162
  ## How `maesttro update` keeps configs current
139
163
 
140
164
  `docker/configs/<client>/` holds the curated client defaults. They aren't baked
141
- into the image: at every container start, `maesttro configure` runs from your
165
+ into the runner image: at every container start, `maesttro configure` runs from your
142
166
  installed package, which is mounted read-only, and merges them into each client's
143
167
  config, keeping your own keys. So `maesttro update` has two steps:
144
168
  1. `npm i -g maesttro@latest` refreshes the package, including `docker/configs/`,
145
169
  which the next session picks up.
146
- 2. It rebuilds the sandbox image, for new client and tool versions.
170
+ 2. It rebuilds the runner image, for new client and tool versions.
147
171
 
148
172
  Your session state (in the `maesttro-home` volume) and your project files are
149
173
  untouched by an update.
@@ -155,7 +179,7 @@ untouched by an update.
155
179
  | Mount | Source | Purpose |
156
180
  |---|---|---|
157
181
  | `/home/agent` | `maesttro-home` named volume | Per-client session state. Survives across runs, lives only in Docker. Holds no GitHub credential. |
158
- | `/home/agent/.config/gh-maesttro` (read-only) | per-session temp dir on host | The session's GitHub token (`hosts.yml`). The CLI refreshes it before its 1 h expiry and revokes it on exit. |
182
+ | `/home/agent/.config/gh-maesttro` (read-only) | per-session temp dir on host | The session's GitHub token (`hosts.yml`). The CLI refreshes it before its 1 h expiry and revokes it on exit. Not mounted in `--strict` sessions, or when GitHub access is unavailable. |
159
183
  | `<repo>/.git/objects` (read-only, same absolute path) | your repo's object store | Base history, borrowed by the clone through its `alternates`. The real `.git` is never mounted. |
160
184
  | `/workspace` | the session clone (`.worktrees/<id>`) | The working directory: a `git clone --shared` detached at the default branch. |
161
185
  | `/opt/maesttro`, `/opt/maesttro-host` (read-only) | this package; your instruction files | Used by `maesttro configure` at container start. |
@@ -189,9 +213,7 @@ maesttro/
189
213
  ├── Dockerfile
190
214
  ├── gitconfig # → /etc/gitconfig: SSH→HTTPS, gh as credential helper
191
215
  └── configs/
192
- ├── claude/
193
- ├── opencode/
194
- └── codex/
216
+ └── opencode/
195
217
  ```
196
218
 
197
219
  ## Trying it locally
@@ -214,7 +236,6 @@ registry it was installed from.
214
236
 
215
237
  ## Open items
216
238
 
217
- - Fill in real curated defaults in `docker/configs/*` (currently placeholders)
218
239
  - Pin exact client CLI versions in the Dockerfile once stable
219
240
  - Decide whether each client gets its own volume, or shares one (current setup: shared)
220
241
  - Homebrew tap as an alternative install path for non-Node users — optional