@uchibeke/gallivant 0.0.0-stage → 0.2.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/CONTRIBUTING.md +26 -0
- package/LICENSE +204 -0
- package/README.md +201 -2
- package/SECURITY.md +19 -0
- package/bin/gallivant.mjs +257 -0
- package/bin/package-plugin.mjs +16 -0
- package/bin/release-live.mjs +29 -0
- package/bin/release-package.mjs +23 -0
- package/bin/session-runtime.mjs +13 -0
- package/bin/task-delivery-state.mjs +12 -0
- package/docs/README.md +70 -0
- package/docs/agent-setup.md +214 -0
- package/docs/app.md +111 -0
- package/docs/architecture.md +265 -0
- package/docs/chains.md +102 -0
- package/docs/codex-cloud.md +284 -0
- package/docs/commands.md +620 -0
- package/docs/config.md +430 -0
- package/docs/execution.md +796 -0
- package/docs/guardrails.md +311 -0
- package/docs/install.md +338 -0
- package/docs/launch.md +42 -0
- package/docs/learning.md +369 -0
- package/docs/network-recovery.md +101 -0
- package/docs/openai-agents.md +457 -0
- package/docs/prd.md +246 -0
- package/docs/preparation.md +110 -0
- package/docs/release-qualification.md +196 -0
- package/docs/releasing.md +140 -0
- package/docs/runtime-environment.md +113 -0
- package/docs/task-delivery.md +476 -0
- package/docs/tasks.md +739 -0
- package/lib/aport.mjs +95 -0
- package/lib/attribution.mjs +95 -0
- package/lib/block.mjs +89 -0
- package/lib/capabilities.mjs +3 -0
- package/lib/chains.mjs +222 -0
- package/lib/codex_cloud.mjs +160 -0
- package/lib/codex_cloud_config.mjs +20 -0
- package/lib/codex_cloud_input.mjs +49 -0
- package/lib/codex_cloud_result.mjs +74 -0
- package/lib/commands/doctor.mjs +457 -0
- package/lib/commands/init.mjs +34 -0
- package/lib/commands/learn.mjs +54 -0
- package/lib/commands/new.mjs +47 -0
- package/lib/commands/ready.mjs +45 -0
- package/lib/commands/register.mjs +195 -0
- package/lib/commands/resume.mjs +224 -0
- package/lib/commands/serve.mjs +349 -0
- package/lib/commands/start.mjs +247 -0
- package/lib/commands/start_services.mjs +22 -0
- package/lib/commands/status.mjs +150 -0
- package/lib/commands/task.mjs +73 -0
- package/lib/commands/up.mjs +228 -0
- package/lib/commands/why.mjs +143 -0
- package/lib/config.mjs +461 -0
- package/lib/context.mjs +100 -0
- package/lib/control.mjs +202 -0
- package/lib/control_contract.mjs +16 -0
- package/lib/coordinator.mjs +19 -0
- package/lib/credential.mjs +161 -0
- package/lib/daemon.mjs +156 -0
- package/lib/deliverable.mjs +357 -0
- package/lib/events.mjs +261 -0
- package/lib/executable.mjs +31 -0
- package/lib/execution.mjs +631 -0
- package/lib/execution_contract.mjs +15 -0
- package/lib/execution_input.mjs +4 -0
- package/lib/execution_io.mjs +94 -0
- package/lib/execution_journal.mjs +69 -0
- package/lib/execution_preparation.mjs +29 -0
- package/lib/execution_result.mjs +266 -0
- package/lib/fs.mjs +133 -0
- package/lib/gh.mjs +289 -0
- package/lib/git.mjs +434 -0
- package/lib/harness.mjs +521 -0
- package/lib/harness_log.mjs +432 -0
- package/lib/hash.mjs +16 -0
- package/lib/identity.mjs +98 -0
- package/lib/learning.mjs +654 -0
- package/lib/learning_contract.mjs +2 -0
- package/lib/learning_data.mjs +135 -0
- package/lib/learning_input.mjs +111 -0
- package/lib/learning_qualification.mjs +67 -0
- package/lib/learning_signer.mjs +151 -0
- package/lib/learning_store.mjs +88 -0
- package/lib/log.mjs +53 -0
- package/lib/network_diagnostics.mjs +64 -0
- package/lib/network_recovery.mjs +42 -0
- package/lib/notify.mjs +58 -0
- package/lib/openai_agents.mjs +373 -0
- package/lib/openai_agents_config.mjs +14 -0
- package/lib/openai_agents_http.mjs +87 -0
- package/lib/openai_agents_input.mjs +15 -0
- package/lib/openai_agents_sources.mjs +112 -0
- package/lib/owner_delivery.mjs +443 -0
- package/lib/plugin_package.mjs +340 -0
- package/lib/prd.mjs +635 -0
- package/lib/preparation_agents.mjs +33 -0
- package/lib/preparation_codex.mjs +212 -0
- package/lib/probe.mjs +126 -0
- package/lib/prompt.mjs +238 -0
- package/lib/provider_health.mjs +55 -0
- package/lib/public-format.mjs +31 -0
- package/lib/public_output.mjs +49 -0
- package/lib/release_package.mjs +154 -0
- package/lib/repository_files.mjs +86 -0
- package/lib/run.mjs +385 -0
- package/lib/run_log.mjs +94 -0
- package/lib/runtime-environment.mjs +87 -0
- package/lib/runtime_dependencies.mjs +15 -0
- package/lib/runtime_node.mjs +107 -0
- package/lib/runtime_state.mjs +174 -0
- package/lib/sources/index.mjs +27 -0
- package/lib/sources/prd.mjs +50 -0
- package/lib/start_contract.mjs +37 -0
- package/lib/state.mjs +246 -0
- package/lib/task_allowance.mjs +31 -0
- package/lib/task_completion.mjs +61 -0
- package/lib/task_contract.mjs +450 -0
- package/lib/task_delivery.mjs +219 -0
- package/lib/task_delivery_cancel.mjs +34 -0
- package/lib/task_delivery_contract.mjs +61 -0
- package/lib/task_delivery_mcp.mjs +40 -0
- package/lib/task_delivery_store.mjs +43 -0
- package/lib/task_delivery_view.mjs +88 -0
- package/lib/task_environment.mjs +281 -0
- package/lib/task_prepare.mjs +224 -0
- package/lib/task_store.mjs +38 -0
- package/lib/tasks.mjs +513 -0
- package/lib/tick.mjs +1635 -0
- package/lib/time.mjs +36 -0
- package/lib/tracker/assets.mjs +43 -0
- package/lib/tracker/pages.mjs +320 -0
- package/lib/tracker/runs.mjs +102 -0
- package/lib/tracker/stream.mjs +74 -0
- package/lib/tracker_process.mjs +107 -0
- package/lib/verification_sandbox.mjs +181 -0
- package/node_modules/smol-toml/LICENSE +24 -0
- package/node_modules/smol-toml/README.md +605 -0
- package/node_modules/smol-toml/dist/date.d.ts +41 -0
- package/node_modules/smol-toml/dist/date.js +156 -0
- package/node_modules/smol-toml/dist/error.d.ts +37 -0
- package/node_modules/smol-toml/dist/error.js +67 -0
- package/node_modules/smol-toml/dist/extract.js +289 -0
- package/node_modules/smol-toml/dist/index.cjs +770 -0
- package/node_modules/smol-toml/dist/index.d.ts +44 -0
- package/node_modules/smol-toml/dist/index.js +34 -0
- package/node_modules/smol-toml/dist/parse.d.ts +73 -0
- package/node_modules/smol-toml/dist/parse.js +164 -0
- package/node_modules/smol-toml/dist/primitive.js +151 -0
- package/node_modules/smol-toml/dist/stringify.d.ts +32 -0
- package/node_modules/smol-toml/dist/stringify.js +219 -0
- package/node_modules/smol-toml/dist/struct.js +156 -0
- package/node_modules/smol-toml/dist/util.d.ts +43 -0
- package/node_modules/smol-toml/dist/util.js +57 -0
- package/node_modules/smol-toml/package.json +68 -0
- package/npm-shrinkwrap.json +1823 -0
- package/package.json +105 -4
- package/templates/claude-settings.json +18 -0
- package/templates/passport.gallivant.json +83 -0
- package/templates/plugin/bundled-runtime.json +26 -0
- package/templates/plugin/schemas/mcp.schema.json +120 -0
- package/templates/plugin/schemas/plugin.schema.json +65 -0
- package/templates/plugin/task-delivery.SKILL.md +60 -0
- package/templates/prd.md +32 -0
- package/templates/tracker/tracker.css +301 -0
- package/templates/tracker/tracker.js +721 -0
package/docs/install.md
ADDED
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
# Install
|
|
2
|
+
|
|
3
|
+
Get one repository task from a brief to a reviewed pull request. Install the CLI,
|
|
4
|
+
sign in to GitHub and one harness, finish the checks, then start a small task.
|
|
5
|
+
Gallivant keeps the implementation and review loop moving; you review and merge.
|
|
6
|
+
|
|
7
|
+
**Using a coding agent to set this up?** Give it the [agent setup guide](agent-setup.md).
|
|
8
|
+
It includes a copy/paste prompt, setup checks and the point where a real run starts.
|
|
9
|
+
|
|
10
|
+
For DNS errors or stalled provider calls, see [network diagnosis and recovery](network-recovery.md).
|
|
11
|
+
The diagnostic command works before configuration or login, on Linux and macOS.
|
|
12
|
+
|
|
13
|
+
Linux installations need process inspection through `ps` with `lstart`, `command`,
|
|
14
|
+
PID and process-group fields (normally the `procps`/`procps-ng` package). Minimal
|
|
15
|
+
containers may omit it. Keep process inspection available: uncertain ownership
|
|
16
|
+
blocks safe restart rather than allowing overlapping agents. The CI baseline is
|
|
17
|
+
Ubuntu with Node 22/24; other distributions must also satisfy their harness and
|
|
18
|
+
sandbox prerequisites.
|
|
19
|
+
|
|
20
|
+
Start with one harness and one repository. `gallivant init` creates your local
|
|
21
|
+
config; `gallivant doctor` checks the prerequisites and prints a fix for each
|
|
22
|
+
missing item. Setup time depends on whether your harness and GitHub are already
|
|
23
|
+
configured. No model call is needed to install the CLI or validate a hand-written PRD.
|
|
24
|
+
|
|
25
|
+
Requirements shared by the coordinator: macOS or Linux, Node 22 or newer, Git,
|
|
26
|
+
`gh` signed in, and `jq`. For the recommended local path, use signed-in Claude
|
|
27
|
+
Code 2.1.263+ or Codex CLI 0.160.0+ (Codex implementation accepts 0.158.0+, but
|
|
28
|
+
plain-language preparation needs 0.160.0+). Hosted OpenAI Agents execution has a
|
|
29
|
+
separate setup below and needs no local Codex or Claude binary. See the
|
|
30
|
+
[capability matrix](../README.md#harness-support) before choosing another harness.
|
|
31
|
+
|
|
32
|
+
## 1. The command
|
|
33
|
+
|
|
34
|
+
Check the [registry version](https://www.npmjs.com/package/@uchibeke/gallivant). If one
|
|
35
|
+
is available, install the CLI with `npm install -g @uchibeke/gallivant` and check
|
|
36
|
+
`gallivant --version`. If the package has not been published yet, use the source
|
|
37
|
+
checkout:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
git clone https://github.com/uchibeke/gallivant && cd gallivant
|
|
41
|
+
npm ci --ignore-scripts
|
|
42
|
+
npm link
|
|
43
|
+
gallivant --version
|
|
44
|
+
gallivant --help # from any directory, to confirm it is on your PATH
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The package has locked runtime dependencies; `npm ci` installs them for a source
|
|
48
|
+
checkout. `npm i -g .` copies instead of linking.
|
|
49
|
+
If the shell cannot find the command afterwards,
|
|
50
|
+
the `bin` directory under `npm prefix -g` is not on your PATH.
|
|
51
|
+
|
|
52
|
+
Global configuration lives in `~/.gallivant/config.json` (or
|
|
53
|
+
`$GALLIVANT_HOME/config.json` when explicitly set). Task commands still
|
|
54
|
+
need a target checkout: run inside it, pass `--dir` for natural-language tasks, or
|
|
55
|
+
pass the PRD path for a written brief.
|
|
56
|
+
|
|
57
|
+
## 2. Sign in and create config
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
gh auth login # skip if gh auth status already passes
|
|
61
|
+
codex login # or sign in with claude, if that is your selected harness
|
|
62
|
+
git config --get user.name
|
|
63
|
+
git config --get user.email
|
|
64
|
+
gallivant init --harness codex # or --harness claude
|
|
65
|
+
gallivant doctor
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`init` writes `~/.gallivant/config.json` with mode 600, trusts your authenticated
|
|
69
|
+
GitHub login, records only the selected installed harness, and creates
|
|
70
|
+
`~/.gallivant-worktrees` for separate task checkouts. Use `--worktrees /absolute/path`
|
|
71
|
+
to choose another location outside the config home. Notifications start disabled.
|
|
72
|
+
Existing configs are never overwritten. If `init` reports an existing config,
|
|
73
|
+
continue with `doctor`; preserve the config and repair only the relevant keys.
|
|
74
|
+
Set your Git name/email if the checks
|
|
75
|
+
above are empty; commits use your configured identity.
|
|
76
|
+
|
|
77
|
+
`doctor` can also print a suggested config when none exists. It reports missing
|
|
78
|
+
guardrails, credentials and repository protections; `init` does not configure
|
|
79
|
+
those for you. Add the target repository to `repos` so `doctor` checks its
|
|
80
|
+
permissions, base branch and protections. See [config.md](config.md) for every key.
|
|
81
|
+
The default reviewer is
|
|
82
|
+
the Codex GitHub integration: enable it on your target repository, configure
|
|
83
|
+
another supported bot, or explicitly set `"reviewer": null` to use CI and trusted
|
|
84
|
+
human feedback. Without a configured review bot, the default loop waits for a
|
|
85
|
+
review that cannot arrive.
|
|
86
|
+
|
|
87
|
+
### Hosted Agents API instead of a local CLI
|
|
88
|
+
|
|
89
|
+
`init --harness` currently supports only `codex` and `claude`. For a hosted-only
|
|
90
|
+
installation, create the config manually; do not install a local agent just to
|
|
91
|
+
satisfy `init`. Create `~/.gallivant` privately, save the following as
|
|
92
|
+
`~/.gallivant/config.json` with mode `600`, and replace the example account,
|
|
93
|
+
project, model, repository, username and API-key path with your authorized values:
|
|
94
|
+
|
|
95
|
+
```json
|
|
96
|
+
{
|
|
97
|
+
"trusted_authors": ["YOUR_GITHUB_LOGIN"],
|
|
98
|
+
"worktrees": "~/.gallivant-worktrees",
|
|
99
|
+
"repos": ["YOUR_OWNER/YOUR_REPO"],
|
|
100
|
+
"harness": {
|
|
101
|
+
"openai-agents": {
|
|
102
|
+
"account": "my-service-account",
|
|
103
|
+
"organization": "org-selected",
|
|
104
|
+
"project": "proj-selected",
|
|
105
|
+
"api_key_file": "/absolute/path/to/private/agents-key",
|
|
106
|
+
"model": "YOUR_AUTHORIZED_MODEL",
|
|
107
|
+
"environment": "openai_hosted",
|
|
108
|
+
"container_size": "small",
|
|
109
|
+
"network": { "access": "disabled" },
|
|
110
|
+
"allowance": { "remainingUsd": 1, "reservedUsd": 0.2 }
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
"notify": null
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Keep existing config keys if you are adding this adapter to an existing install.
|
|
118
|
+
The allowance is an illustrative local reservation, not a provider-enforced
|
|
119
|
+
spend cap. API inference and hosted compute use API billing, independently of a
|
|
120
|
+
ChatGPT subscription. Read the [Agents API guide](openai-agents.md) for scoped
|
|
121
|
+
API permissions, packages, restricted networking and cancellation limitations.
|
|
122
|
+
|
|
123
|
+
Run `gallivant doctor` before starting. Hosted results are verified locally in an
|
|
124
|
+
OS sandbox: macOS needs `sandbox-exec` and Command Line Tools; Linux needs
|
|
125
|
+
`/usr/bin/bwrap` and the supported namespaces. Missing sandbox support blocks
|
|
126
|
+
execution/publication. Read-only account probes do not prove inference entitlement
|
|
127
|
+
or a successful full lifecycle. Local APort hooks are not installed into hosted
|
|
128
|
+
sessions; mandatory local-only policies cause a refusal.
|
|
129
|
+
|
|
130
|
+
Use `--harness openai-agents` with `gallivant task`, or `harness: openai-agents`
|
|
131
|
+
in your PRD. Keep the coordinator machine awake and online even though the agent
|
|
132
|
+
runs remotely. **Codex Cloud is a different adapter:** its new dispatch is
|
|
133
|
+
currently disabled because repository ownership of the selected environment
|
|
134
|
+
cannot be verified. See [the Cloud gate](codex-cloud.md); local Codex and Claude
|
|
135
|
+
remain available.
|
|
136
|
+
|
|
137
|
+
## 3. GitHub auth
|
|
138
|
+
|
|
139
|
+
By default Gallivant uses the login you already have, however you set it up. Nothing to configure beyond `gh auth status` passing. There is no file to copy for this: every git setting a run needs, the credential helper included, is passed in the run's environment.
|
|
140
|
+
|
|
141
|
+
For local CLI runs, the coordinator resolves GitHub credentials before launching
|
|
142
|
+
the harness. Supported sandbox settings restrict native credential-store access,
|
|
143
|
+
so the run receives `GH_TOKEN` and an environment-carried Git helper. Sandbox
|
|
144
|
+
coverage differs by harness; see [guardrails](guardrails.md). The token is not
|
|
145
|
+
placed in command arguments or persisted by Gallivant, but the child process
|
|
146
|
+
can read it. For hosted Agents execution, GitHub credentials stay with the local
|
|
147
|
+
coordinator, which verifies and publishes returned artifacts.
|
|
148
|
+
|
|
149
|
+
Do not create a separate `~/.gallivant/gitconfig` or override `GIT_CONFIG_GLOBAL`
|
|
150
|
+
for a run. Current versions carry Git configuration in the run environment.
|
|
151
|
+
`doctor` checks that transport with `git ls-remote` in an isolated home;
|
|
152
|
+
a successful read does not by itself prove push permission.
|
|
153
|
+
|
|
154
|
+
Where the credential comes from, first answer wins:
|
|
155
|
+
|
|
156
|
+
1. `github_token_file`, if you set one in config.
|
|
157
|
+
2. `GH_TOKEN` or `GITHUB_TOKEN` in the environment the daemon was started in.
|
|
158
|
+
3. `gh auth token`. This is why any login works: `gh` answers from whichever store it used, whether that is a keyring, a secret service, or a plain `hosts.yml` on a machine with neither.
|
|
159
|
+
|
|
160
|
+
If none of the three answers, `gallivant start` refuses and names all three. It does not start a session that would spend money and then fail to push.
|
|
161
|
+
|
|
162
|
+
Optional, and recommended once the loop runs on repos that matter: a fine-grained personal access token limited to the participating repos, so an escaped run cannot reach every repository your login can. Create one at GitHub, Settings, Developer settings, Fine-grained tokens, with Contents, Pull requests and Issues read and write, Checks, Actions and Metadata read, and **no Workflows permission**. Save it and point config at it:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
umask 077
|
|
166
|
+
cat > ~/.gallivant/gh-token
|
|
167
|
+
# Paste the token, then press Ctrl-D. Do not paste it into a shell command.
|
|
168
|
+
# config.json: "github_token_file": "~/.gallivant/gh-token"
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
With the file set it wins over both of the other two. A missing, unreadable or empty
|
|
172
|
+
file refuses the operation instead of falling back to a wider login. Restore it,
|
|
173
|
+
or explicitly set `github_token_file` to `null` and restart the daemon to choose ambient authentication. `doctor` reports which source a run would use, whether the token is classic or fine-grained, and repository access and protection checks. Its Git credential-transport check uses
|
|
174
|
+
`git ls-remote`; a successful read does not by itself prove push permission.
|
|
175
|
+
|
|
176
|
+
This installation guide targets github.com repositories. The credential resolver
|
|
177
|
+
recognizes enterprise hosts on an existing checkout, but new-task repository
|
|
178
|
+
resolution and clone URLs currently use github.com. An enterprise login or token
|
|
179
|
+
alone does not establish supported end-to-end operation.
|
|
180
|
+
|
|
181
|
+
## 4. A ruleset on each repo
|
|
182
|
+
|
|
183
|
+
The one control that stops a push to the default branch is GitHub's. `doctor` prints the exact `gh api` call for every repo in `repos`; it creates a ruleset that blocks deletion and force pushes on the default branch and requires a pull request, with no bypass actors. Gallivant never merges, so the ruleset costs nothing in the loop.
|
|
184
|
+
|
|
185
|
+
## 5. Notifications
|
|
186
|
+
|
|
187
|
+
Optional: create a topic on [ntfy.sh](https://ntfy.sh) or your own server, install the ntfy app, and set
|
|
188
|
+
`"notify": { "ntfy": "https://ntfy.sh/<unguessable-topic>", "email": null }`.
|
|
189
|
+
Set `notify.email` to also get each message by email through ntfy's `Email` header.
|
|
190
|
+
With `"notify": null`, use the dashboard or `status`; there are no push notifications.
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
gallivant doctor --send # sends one test message
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Three kinds of message exist: `ready for a human`, `needs you: <reason>`, and a throttled `gallivant: <error>` when the daemon itself cannot work (gh not authenticated, a harness signed out). Nothing on merge. Nothing per round.
|
|
197
|
+
|
|
198
|
+
## 6. APort on Claude Code
|
|
199
|
+
|
|
200
|
+
APort's installer writes a PreToolUse hook with matcher `*` into whichever settings file it is pointed at, and the hook enforces one passport. Gallivant's passport is strict on purpose: writes only under the worktrees directory, control-plane directories blocked. Installed into `~/.claude/settings.json`, that policy would apply to every interactive Claude session you run and block your normal work. So the installer goes into a Gallivant-owned directory, and every run loads it with `--settings` plus `APORT_CLAUDE_CODE_CONFIG_DIR`. Nothing about the sandbox requires this; it is only about keeping Gallivant's policy separate from yours.
|
|
201
|
+
|
|
202
|
+
If you would rather have one policy everywhere, point `harness.claude.settings` at `~/.claude/settings.json` and install APort there; the sandbox block then applies to your interactive sessions too.
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
APORT_CLAUDE_CODE_CONFIG_DIR=~/.gallivant/claude npx @aporthq/aport-agent-guardrails claude-code
|
|
206
|
+
# choose "Create local passport file"; no hosted account is needed
|
|
207
|
+
# init and doctor print the absolute path to the packaged passport template.
|
|
208
|
+
cp /absolute/path/printed/by/init/passport.gallivant.json ~/.gallivant/claude/aport/passport.json
|
|
209
|
+
# then edit it: replace {{worktrees}} with your worktrees path and {{home}} with your home directory
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Merge the sandbox block from the packaged `claude-settings.json` path printed by
|
|
213
|
+
`init` into `~/.gallivant/claude/settings.json` next to the hooks the installer wrote.
|
|
214
|
+
Those absolute template paths work after either source or npm installation.
|
|
215
|
+
Every Claude run loads that file with `--settings` and sets `APORT_CLAUDE_CODE_CONFIG_DIR`, so the hook and the sandbox apply only to Gallivant runs.
|
|
216
|
+
|
|
217
|
+
On macOS the template enables `sandbox.enableWeakerNetworkIsolation` so `gh` can use Apple's certificate verification service. Without it, a valid GitHub login can fail inside the sandbox with `x509: OSStatus -26276`. This grants access to `com.apple.trustd.agent` and opens a potential exfiltration route through that service; review the [security tradeoff](guardrails.md#claude-on-macos-needs-certificate-verification) before applying it. The setting has no effect on Linux. `doctor` detects the missing setting on macOS and explains the repair; it does not change settings automatically.
|
|
218
|
+
|
|
219
|
+
Any APort passport option works: a hosted passport created by the installer, an existing hosted `agent_id`, or a local file. With a hosted passport the limits live in the aport.io dashboard, so set `data.file.write` `allowed_paths` there to your worktrees directory and `blocked_paths` to the control-plane directories listed in `templates/passport.gallivant.json`; with a local passport, copy the template. `doctor` reports which mode is in use.
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
gallivant doctor --probe # a real run: a write inside the checkout succeeds, a write outside is denied
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
The probe reads the APort audit log to tell apart a hook that never ran from a passport that allowed the write, and prints the fix for each.
|
|
226
|
+
|
|
227
|
+
## 7. APort on Codex
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
npx @aporthq/aport-agent-guardrails codex --global --enforcement=warn
|
|
231
|
+
codex # once: run /hooks and trust the APort hook. This step cannot be automated.
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
APort's Codex hook is beta. Warn mode may downgrade policy denials, but adapter
|
|
235
|
+
failures can still block calls such as unsupported multi-file `apply_patch`;
|
|
236
|
+
check the installed guardrails version's support before unattended use. The
|
|
237
|
+
other controls are `workspace-write`, Codex's automatic approval reviewer for
|
|
238
|
+
Git metadata writes and escalations, the scoped token and the ruleset. Gallivant
|
|
239
|
+
sets the approval mode on start and resume. A denial must be diagnosed, not
|
|
240
|
+
bypassed. See [guardrails.md](guardrails.md#codex-git-writes-need-automatic-approval).
|
|
241
|
+
|
|
242
|
+
## 8. First task
|
|
243
|
+
|
|
244
|
+
Before dispatch, confirm the repository, target branch, permitted changes and
|
|
245
|
+
spending limits. The default `max_iterations` is 30 automatic fix rounds;
|
|
246
|
+
`max_budget_usd` defaults to 5 and gives Claude a native per-run dollar cap.
|
|
247
|
+
Other local harnesses do not enforce an equivalent dollar cap. Use your provider's
|
|
248
|
+
spend controls and review [budget semantics](config.md) before unattended work.
|
|
249
|
+
A paid preparation call is different from the local `ready --check` validator.
|
|
250
|
+
|
|
251
|
+
You can deliver code, documentation, research or content, provided the outcome
|
|
252
|
+
is a repository change with concrete acceptance criteria and checks. You do not
|
|
253
|
+
need to write a PRD by hand.
|
|
254
|
+
|
|
255
|
+
### From plain language
|
|
256
|
+
|
|
257
|
+
Inside the target repository:
|
|
258
|
+
|
|
259
|
+
```sh
|
|
260
|
+
gallivant task "Document how to run the existing tests in CONTRIBUTING.md. Use the commands already defined in the repository. Change documentation only." \
|
|
261
|
+
--harness codex --verify 'git diff --check'
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
Choose `claude` or `openai-agents` instead when configured. This first command
|
|
265
|
+
uses inference to prepare a brief but does not start implementation. Inspect the
|
|
266
|
+
returned draft and assumptions. If it needs answers, use its printed question
|
|
267
|
+
IDs and `Next` action. Once ready, substitute your returned ID and revision:
|
|
268
|
+
|
|
269
|
+
```sh
|
|
270
|
+
gallivant task start TASK_ID --revision REVISION --run
|
|
271
|
+
gallivant start
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Alternatively, add `--run` to the original `task` request to authorize
|
|
275
|
+
implementation as soon as preparation and any clarifications succeed. The task
|
|
276
|
+
service starts the daemon; `gallivant start` with no path also opens the dashboard.
|
|
277
|
+
Read [task operations](tasks.md) for selected context, revisions, recovery and costs.
|
|
278
|
+
|
|
279
|
+
### From a written brief
|
|
280
|
+
|
|
281
|
+
`new` uses the first configured harness. Pass `--harness` with another configured
|
|
282
|
+
harness only when you intend to select it.
|
|
283
|
+
|
|
284
|
+
```sh
|
|
285
|
+
gallivant new widget-export
|
|
286
|
+
# Fill in docs/prds/widget-export.md, including every required section.
|
|
287
|
+
gallivant ready docs/prds/widget-export.md --check
|
|
288
|
+
gallivant ready docs/prds/widget-export.md
|
|
289
|
+
gallivant start docs/prds/widget-export.md
|
|
290
|
+
gallivant status
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
`new` writes a complete template. Fill in its Problem, User stories, Acceptance
|
|
294
|
+
criteria, Verify, Where to look and Out of scope sections. Empty section headings
|
|
295
|
+
are not a runnable brief. [The PRD contract](prd.md) explains the rules and
|
|
296
|
+
noncoding verification. `ready --check` is a local, read-only validation;
|
|
297
|
+
`ready` records readiness and updates the file without committing it.
|
|
298
|
+
|
|
299
|
+
`start` starts the background daemon and dashboard and opens the browser when
|
|
300
|
+
available. Do not run a second `up`. `--no-open` suppresses browser launch;
|
|
301
|
+
`--no-server` starts the task and daemon without the dashboard. `gallivant start`
|
|
302
|
+
with no path starts/reuses the services without submitting a task. `serve` uses
|
|
303
|
+
the same startup; supervisors can use `serve --foreground --no-open --no-daemon`
|
|
304
|
+
for a tracker whose daemon is managed separately. `gallivant down` stops both
|
|
305
|
+
standalone services, preserving active agent processes.
|
|
306
|
+
|
|
307
|
+
On macOS the daemon starts `caffeinate` for its lifetime to prevent idle sleep.
|
|
308
|
+
Closing a laptop lid, losing network or shutting down still interrupts monitoring.
|
|
309
|
+
There is no automatic login/reboot service installer yet.
|
|
310
|
+
|
|
311
|
+
### Completion verification
|
|
312
|
+
|
|
313
|
+
APort readiness/completion verification is separate from harness pre-tool hooks.
|
|
314
|
+
By default, the built-in contract checks are confirmed by APort's hosted endpoint;
|
|
315
|
+
this needs network access and unauthenticated requests have an IP rate limit.
|
|
316
|
+
An installed APort Claude API key is used when available. To deliberately use
|
|
317
|
+
only the local completion evaluator, set `"deliverable": { "evaluator": "local" }`
|
|
318
|
+
in config; the local acceptance criteria and receipt checks still apply. See
|
|
319
|
+
[the completion contract](prd.md#the-completion-receipt) for details.
|
|
320
|
+
|
|
321
|
+
## Verifying the first real PR
|
|
322
|
+
|
|
323
|
+
Watch `gallivant status` after the start run ends: the entry moves from `implementing` to `waiting on reviewer` once the PR is open. When the reviewer's review lands, the next tick shows `fixing`, then a round comment appears on the PR, and after the re-review either a `ready for a human` notification arrives or `status` shows why not.
|
|
324
|
+
|
|
325
|
+
## Where things live
|
|
326
|
+
|
|
327
|
+
| Path | What |
|
|
328
|
+
|---|---|
|
|
329
|
+
| `~/.gallivant/config.json` | your config, mode 600 |
|
|
330
|
+
| `~/.gallivant/state.json` | the registry; preserve it and its snapshots for exact local recovery |
|
|
331
|
+
| `~/.gallivant/runs/<entry>/<run>/` | `job.json`, redacted `job.log`, private raw `provider.log` for local runs, local `cmd.json` or hosted execution/artifact records |
|
|
332
|
+
| `~/.gallivant/daemon.json` | daemon health, read by `status` |
|
|
333
|
+
| `~/.gallivant/tracker.json`, `tracker.lock`, `tracker.log` | standalone dashboard ownership, port and output |
|
|
334
|
+
| `~/.gallivant/errors.log` | every warning and error |
|
|
335
|
+
| `~/.gallivant/claude/` | Gallivant's Claude settings, APort hook runtime, passport, audit log |
|
|
336
|
+
| `<worktrees>/<repo>/<prd>` | one partial clone per PRD; durable until you delete it |
|
|
337
|
+
|
|
338
|
+
Override the home directory with `GALLIVANT_HOME` to run a second instance.
|
package/docs/launch.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Announcement drafts
|
|
2
|
+
|
|
3
|
+
Publish these only after [the release checks](releasing.md#verify-before-announcing)
|
|
4
|
+
pass and the repository is public. Use the install command that actually works
|
|
5
|
+
for the released version; do not advertise npm installation before publication.
|
|
6
|
+
Add a genuine dashboard screenshot or recording of a task reaching a reviewed
|
|
7
|
+
PR. Fixture tests are not live provider evidence.
|
|
8
|
+
|
|
9
|
+
## X
|
|
10
|
+
|
|
11
|
+
Give an agent a task. Let the review loop run. Go outside.
|
|
12
|
+
|
|
13
|
+
Gallivant turns requests into reviewed PRs: code, docs or research. Local or
|
|
14
|
+
hosted agents, review/CI fixes, and a dashboard for corrections. You choose
|
|
15
|
+
what merges.
|
|
16
|
+
|
|
17
|
+
https://github.com/uchibeke/gallivant
|
|
18
|
+
|
|
19
|
+
## LinkedIn
|
|
20
|
+
|
|
21
|
+
I built Gallivant to reduce the time spent checking whether an agent has
|
|
22
|
+
finished, collecting review feedback, and sending it back for the next fix.
|
|
23
|
+
|
|
24
|
+
Start with a plain-language request or a written brief. Gallivant keeps the
|
|
25
|
+
requirements, implementation, tests and PR review together. It watches reviews
|
|
26
|
+
and CI, continues the same session for corrections, and reports when the result
|
|
27
|
+
is ready for you or needs help. A local dashboard lets you follow progress and
|
|
28
|
+
message the agent.
|
|
29
|
+
|
|
30
|
+
This also works for research, documentation and content delivered as repository
|
|
31
|
+
files. For longer plans, merge one milestone and the next starts from that base.
|
|
32
|
+
You retain the merge decision.
|
|
33
|
+
|
|
34
|
+
Claude Code and local Codex are the recommended starting points. An explicit
|
|
35
|
+
OpenAI Agents API integration supports hosted preparation and execution with
|
|
36
|
+
separate account, permission and billing requirements. The support table
|
|
37
|
+
separates implemented adapters from live qualification; Codex Cloud dispatch
|
|
38
|
+
remains disabled until its repository binding can be verified.
|
|
39
|
+
|
|
40
|
+
Gallivant runs on macOS and Linux. Its coordinator still needs to stay online,
|
|
41
|
+
even when the agent runs remotely. Setup, examples and operating boundaries:
|
|
42
|
+
https://github.com/uchibeke/gallivant
|