@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.
Files changed (168) hide show
  1. package/CONTRIBUTING.md +26 -0
  2. package/LICENSE +204 -0
  3. package/README.md +201 -2
  4. package/SECURITY.md +19 -0
  5. package/bin/gallivant.mjs +257 -0
  6. package/bin/package-plugin.mjs +16 -0
  7. package/bin/release-live.mjs +29 -0
  8. package/bin/release-package.mjs +23 -0
  9. package/bin/session-runtime.mjs +13 -0
  10. package/bin/task-delivery-state.mjs +12 -0
  11. package/docs/README.md +70 -0
  12. package/docs/agent-setup.md +214 -0
  13. package/docs/app.md +111 -0
  14. package/docs/architecture.md +265 -0
  15. package/docs/chains.md +102 -0
  16. package/docs/codex-cloud.md +284 -0
  17. package/docs/commands.md +620 -0
  18. package/docs/config.md +430 -0
  19. package/docs/execution.md +796 -0
  20. package/docs/guardrails.md +311 -0
  21. package/docs/install.md +338 -0
  22. package/docs/launch.md +42 -0
  23. package/docs/learning.md +369 -0
  24. package/docs/network-recovery.md +101 -0
  25. package/docs/openai-agents.md +457 -0
  26. package/docs/prd.md +246 -0
  27. package/docs/preparation.md +110 -0
  28. package/docs/release-qualification.md +196 -0
  29. package/docs/releasing.md +140 -0
  30. package/docs/runtime-environment.md +113 -0
  31. package/docs/task-delivery.md +476 -0
  32. package/docs/tasks.md +739 -0
  33. package/lib/aport.mjs +95 -0
  34. package/lib/attribution.mjs +95 -0
  35. package/lib/block.mjs +89 -0
  36. package/lib/capabilities.mjs +3 -0
  37. package/lib/chains.mjs +222 -0
  38. package/lib/codex_cloud.mjs +160 -0
  39. package/lib/codex_cloud_config.mjs +20 -0
  40. package/lib/codex_cloud_input.mjs +49 -0
  41. package/lib/codex_cloud_result.mjs +74 -0
  42. package/lib/commands/doctor.mjs +457 -0
  43. package/lib/commands/init.mjs +34 -0
  44. package/lib/commands/learn.mjs +54 -0
  45. package/lib/commands/new.mjs +47 -0
  46. package/lib/commands/ready.mjs +45 -0
  47. package/lib/commands/register.mjs +195 -0
  48. package/lib/commands/resume.mjs +224 -0
  49. package/lib/commands/serve.mjs +349 -0
  50. package/lib/commands/start.mjs +247 -0
  51. package/lib/commands/start_services.mjs +22 -0
  52. package/lib/commands/status.mjs +150 -0
  53. package/lib/commands/task.mjs +73 -0
  54. package/lib/commands/up.mjs +228 -0
  55. package/lib/commands/why.mjs +143 -0
  56. package/lib/config.mjs +461 -0
  57. package/lib/context.mjs +100 -0
  58. package/lib/control.mjs +202 -0
  59. package/lib/control_contract.mjs +16 -0
  60. package/lib/coordinator.mjs +19 -0
  61. package/lib/credential.mjs +161 -0
  62. package/lib/daemon.mjs +156 -0
  63. package/lib/deliverable.mjs +357 -0
  64. package/lib/events.mjs +261 -0
  65. package/lib/executable.mjs +31 -0
  66. package/lib/execution.mjs +631 -0
  67. package/lib/execution_contract.mjs +15 -0
  68. package/lib/execution_input.mjs +4 -0
  69. package/lib/execution_io.mjs +94 -0
  70. package/lib/execution_journal.mjs +69 -0
  71. package/lib/execution_preparation.mjs +29 -0
  72. package/lib/execution_result.mjs +266 -0
  73. package/lib/fs.mjs +133 -0
  74. package/lib/gh.mjs +289 -0
  75. package/lib/git.mjs +434 -0
  76. package/lib/harness.mjs +521 -0
  77. package/lib/harness_log.mjs +432 -0
  78. package/lib/hash.mjs +16 -0
  79. package/lib/identity.mjs +98 -0
  80. package/lib/learning.mjs +654 -0
  81. package/lib/learning_contract.mjs +2 -0
  82. package/lib/learning_data.mjs +135 -0
  83. package/lib/learning_input.mjs +111 -0
  84. package/lib/learning_qualification.mjs +67 -0
  85. package/lib/learning_signer.mjs +151 -0
  86. package/lib/learning_store.mjs +88 -0
  87. package/lib/log.mjs +53 -0
  88. package/lib/network_diagnostics.mjs +64 -0
  89. package/lib/network_recovery.mjs +42 -0
  90. package/lib/notify.mjs +58 -0
  91. package/lib/openai_agents.mjs +373 -0
  92. package/lib/openai_agents_config.mjs +14 -0
  93. package/lib/openai_agents_http.mjs +87 -0
  94. package/lib/openai_agents_input.mjs +15 -0
  95. package/lib/openai_agents_sources.mjs +112 -0
  96. package/lib/owner_delivery.mjs +443 -0
  97. package/lib/plugin_package.mjs +340 -0
  98. package/lib/prd.mjs +635 -0
  99. package/lib/preparation_agents.mjs +33 -0
  100. package/lib/preparation_codex.mjs +212 -0
  101. package/lib/probe.mjs +126 -0
  102. package/lib/prompt.mjs +238 -0
  103. package/lib/provider_health.mjs +55 -0
  104. package/lib/public-format.mjs +31 -0
  105. package/lib/public_output.mjs +49 -0
  106. package/lib/release_package.mjs +154 -0
  107. package/lib/repository_files.mjs +86 -0
  108. package/lib/run.mjs +385 -0
  109. package/lib/run_log.mjs +94 -0
  110. package/lib/runtime-environment.mjs +87 -0
  111. package/lib/runtime_dependencies.mjs +15 -0
  112. package/lib/runtime_node.mjs +107 -0
  113. package/lib/runtime_state.mjs +174 -0
  114. package/lib/sources/index.mjs +27 -0
  115. package/lib/sources/prd.mjs +50 -0
  116. package/lib/start_contract.mjs +37 -0
  117. package/lib/state.mjs +246 -0
  118. package/lib/task_allowance.mjs +31 -0
  119. package/lib/task_completion.mjs +61 -0
  120. package/lib/task_contract.mjs +450 -0
  121. package/lib/task_delivery.mjs +219 -0
  122. package/lib/task_delivery_cancel.mjs +34 -0
  123. package/lib/task_delivery_contract.mjs +61 -0
  124. package/lib/task_delivery_mcp.mjs +40 -0
  125. package/lib/task_delivery_store.mjs +43 -0
  126. package/lib/task_delivery_view.mjs +88 -0
  127. package/lib/task_environment.mjs +281 -0
  128. package/lib/task_prepare.mjs +224 -0
  129. package/lib/task_store.mjs +38 -0
  130. package/lib/tasks.mjs +513 -0
  131. package/lib/tick.mjs +1635 -0
  132. package/lib/time.mjs +36 -0
  133. package/lib/tracker/assets.mjs +43 -0
  134. package/lib/tracker/pages.mjs +320 -0
  135. package/lib/tracker/runs.mjs +102 -0
  136. package/lib/tracker/stream.mjs +74 -0
  137. package/lib/tracker_process.mjs +107 -0
  138. package/lib/verification_sandbox.mjs +181 -0
  139. package/node_modules/smol-toml/LICENSE +24 -0
  140. package/node_modules/smol-toml/README.md +605 -0
  141. package/node_modules/smol-toml/dist/date.d.ts +41 -0
  142. package/node_modules/smol-toml/dist/date.js +156 -0
  143. package/node_modules/smol-toml/dist/error.d.ts +37 -0
  144. package/node_modules/smol-toml/dist/error.js +67 -0
  145. package/node_modules/smol-toml/dist/extract.js +289 -0
  146. package/node_modules/smol-toml/dist/index.cjs +770 -0
  147. package/node_modules/smol-toml/dist/index.d.ts +44 -0
  148. package/node_modules/smol-toml/dist/index.js +34 -0
  149. package/node_modules/smol-toml/dist/parse.d.ts +73 -0
  150. package/node_modules/smol-toml/dist/parse.js +164 -0
  151. package/node_modules/smol-toml/dist/primitive.js +151 -0
  152. package/node_modules/smol-toml/dist/stringify.d.ts +32 -0
  153. package/node_modules/smol-toml/dist/stringify.js +219 -0
  154. package/node_modules/smol-toml/dist/struct.js +156 -0
  155. package/node_modules/smol-toml/dist/util.d.ts +43 -0
  156. package/node_modules/smol-toml/dist/util.js +57 -0
  157. package/node_modules/smol-toml/package.json +68 -0
  158. package/npm-shrinkwrap.json +1823 -0
  159. package/package.json +105 -4
  160. package/templates/claude-settings.json +18 -0
  161. package/templates/passport.gallivant.json +83 -0
  162. package/templates/plugin/bundled-runtime.json +26 -0
  163. package/templates/plugin/schemas/mcp.schema.json +120 -0
  164. package/templates/plugin/schemas/plugin.schema.json +65 -0
  165. package/templates/plugin/task-delivery.SKILL.md +60 -0
  166. package/templates/prd.md +32 -0
  167. package/templates/tracker/tracker.css +301 -0
  168. package/templates/tracker/tracker.js +721 -0
@@ -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