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 +42 -21
- package/dist/maesttro.js +612 -196
- package/docker/Dockerfile +5 -6
- package/docker/configs/opencode/config.json +1 -1
- package/docker/runner-marker +1 -0
- package/package.json +2 -2
- package/docker/configs/claude/settings.json +0 -3
- package/docker/configs/codex/config.json +0 -3
- package/docker/sandbox-marker +0 -1
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# maesttro
|
|
2
2
|
|
|
3
|
-
Isolated Docker
|
|
4
|
-
and others. Inside the
|
|
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 (
|
|
59
|
+
maesttro # from a repo root: new session clone + default client (opencode)
|
|
60
60
|
maesttro opencode # same, with opencode
|
|
61
|
-
maesttro
|
|
62
|
-
maesttro bash # plain shell inside the
|
|
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
|
|
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
|
|
114
|
-
`~/.claude/{agents,commands,skills}` into the
|
|
115
|
-
source, and adds a short section explaining the
|
|
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
|
-
| `
|
|
129
|
-
| `
|
|
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
|
|
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
|
-
|
|
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
|