@uchibeke/gallivant 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 +120 -60
- package/SECURITY.md +9 -0
- package/bin/gallivant.mjs +41 -14
- package/bin/promote-bitbucket.mjs +40 -0
- package/bin/task-pr.mjs +9 -0
- package/bin/task-review.mjs +15 -0
- package/docs/README.md +6 -2
- package/docs/agent-setup.md +55 -41
- package/docs/architecture.md +11 -3
- package/docs/bitbucket-promotion.md +69 -0
- package/docs/bitbucket-review.md +330 -0
- package/docs/chains.md +30 -1
- package/docs/codex-cloud.md +7 -0
- package/docs/codex-review.md +50 -0
- package/docs/commands.md +103 -14
- package/docs/config.md +45 -13
- package/docs/execution.md +1 -1
- package/docs/first-party-review.md +266 -0
- package/docs/git-hosts.md +294 -0
- package/docs/guardrails.md +56 -0
- package/docs/install.md +137 -67
- package/docs/launch.md +7 -4
- package/docs/network-recovery.md +9 -0
- package/docs/openai-agents.md +3 -2
- package/docs/prd.md +23 -2
- package/docs/preparation.md +2 -2
- package/docs/release-qualification.md +1 -1
- package/docs/releasing.md +46 -22
- package/docs/task-delivery.md +5 -5
- package/docs/task-profiles.md +537 -0
- package/docs/tasks.md +59 -197
- package/lib/attribution.mjs +7 -3
- package/lib/block.mjs +10 -1
- package/lib/chains.mjs +101 -30
- package/lib/codex_cloud.mjs +2 -1
- package/lib/codex_cloud_input.mjs +15 -6
- package/lib/codex_cloud_result.mjs +1 -1
- package/lib/commands/doctor.mjs +22 -453
- package/lib/commands/init.mjs +281 -28
- package/lib/commands/register.mjs +81 -13
- package/lib/commands/resume.mjs +5 -1
- package/lib/commands/review.mjs +66 -0
- package/lib/commands/serve.mjs +8 -0
- package/lib/commands/start.mjs +30 -11
- package/lib/commands/status.mjs +18 -2
- package/lib/commands/task.mjs +9 -1
- package/lib/commands/up.mjs +19 -11
- package/lib/commands/why.mjs +7 -3
- package/lib/config.mjs +42 -9
- package/lib/context.mjs +28 -21
- package/lib/control.mjs +21 -6
- package/lib/credential.mjs +20 -14
- package/lib/deliverable.mjs +2 -0
- package/lib/events.mjs +96 -53
- package/lib/execution.mjs +132 -11
- package/lib/execution_preparation.mjs +16 -1
- package/lib/execution_result.mjs +26 -5
- package/lib/first_party_review.mjs +618 -0
- package/lib/fs.mjs +10 -3
- package/lib/gh.mjs +144 -56
- package/lib/git.mjs +133 -32
- package/lib/git_diff.mjs +121 -0
- package/lib/harness.mjs +14 -10
- package/lib/host_contract.mjs +71 -0
- package/lib/host_definitions.mjs +22 -0
- package/lib/hosts/bitbucket.mjs +553 -0
- package/lib/hosts/bitbucket_contract.mjs +57 -0
- package/lib/hosts/bitbucket_credential.mjs +62 -0
- package/lib/hosts/bitbucket_review.mjs +44 -0
- package/lib/hosts/bitbucket_review_producer.mjs +50 -0
- package/lib/hosts/github.mjs +57 -0
- package/lib/hosts/github_contract.mjs +27 -0
- package/lib/hosts/github_doctor.mjs +482 -0
- package/lib/hosts/github_review_summary.mjs +38 -0
- package/lib/hosts/transport_doctor.mjs +35 -0
- package/lib/hosts.mjs +130 -0
- package/lib/learning_qualification.mjs +1 -1
- package/lib/notify.mjs +1 -1
- package/lib/openai_agents_input.mjs +7 -2
- package/lib/openai_agents_sources.mjs +16 -8
- package/lib/plugin_package.mjs +13 -1
- package/lib/pr_operation.mjs +41 -0
- package/lib/prd.mjs +18 -3
- package/lib/preparation_codex.mjs +6 -1
- package/lib/probe.mjs +6 -4
- package/lib/process.mjs +24 -0
- package/lib/promotion.mjs +132 -0
- package/lib/promotion_git.mjs +63 -0
- package/lib/prompt.mjs +16 -13
- package/lib/provider_health.mjs +14 -3
- package/lib/repository.mjs +68 -0
- package/lib/repository_preflight.mjs +11 -0
- package/lib/review_evaluation.mjs +25 -0
- package/lib/review_evidence.mjs +500 -0
- package/lib/review_history.mjs +73 -0
- package/lib/review_image.mjs +145 -0
- package/lib/review_link.mjs +12 -0
- package/lib/review_policy.mjs +132 -0
- package/lib/review_policy_contract.mjs +18 -0
- package/lib/review_state.mjs +13 -0
- package/lib/review_visual.mjs +94 -0
- package/lib/runtime-environment.mjs +6 -0
- package/lib/runtime_node.mjs +3 -2
- package/lib/runtime_state.mjs +39 -5
- package/lib/sources/prd.mjs +6 -3
- package/lib/state.mjs +137 -24
- package/lib/task_completion.mjs +7 -3
- package/lib/task_contract.mjs +201 -27
- package/lib/task_delivery.mjs +9 -2
- package/lib/task_delivery_contract.mjs +13 -9
- package/lib/task_delivery_view.mjs +18 -2
- package/lib/task_environment.mjs +13 -1
- package/lib/task_limits.mjs +13 -0
- package/lib/task_model_config.mjs +99 -0
- package/lib/task_model_route.mjs +243 -0
- package/lib/task_prepare.mjs +21 -8
- package/lib/task_profile.mjs +1875 -0
- package/lib/task_repository_context.mjs +65 -0
- package/lib/tasks.mjs +252 -51
- package/lib/tick.mjs +373 -98
- package/lib/time.mjs +1 -0
- package/lib/tracker/pages.mjs +19 -5
- package/lib/tracker/review.mjs +21 -0
- package/lib/tracker_process.mjs +8 -1
- package/lib/verification_sandbox.mjs +2 -1
- package/lib/work_artifacts.mjs +79 -0
- package/npm-shrinkwrap.json +12 -3
- package/package.json +9 -3
- package/templates/plugin/task-delivery.SKILL.md +17 -10
- package/templates/plugin/task-intake-contract.json +18 -0
- package/templates/plugin/task-profile-requests.mjs +1448 -0
- package/templates/tracker/tracker.css +3 -0
- package/templates/tracker/tracker.js +38 -0
package/docs/install.md
CHANGED
|
@@ -1,14 +1,34 @@
|
|
|
1
1
|
# Install
|
|
2
2
|
|
|
3
|
-
Get one repository task from a brief to a reviewed pull request.
|
|
4
|
-
|
|
5
|
-
Gallivant keeps the implementation and review loop moving
|
|
3
|
+
Get one repository task from a brief to a reviewed pull request. One command sets
|
|
4
|
+
up a repository; `doctor` tells you what still needs your decision or login; then
|
|
5
|
+
you start a small task. Gallivant keeps the implementation and review loop moving
|
|
6
|
+
and you review and merge.
|
|
6
7
|
|
|
7
8
|
**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
|
+
It includes a copy/paste prompt, the setup checks and the point where a real run starts.
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
## 1. Prerequisites
|
|
12
|
+
|
|
13
|
+
Requirements shared by the coordinator: macOS or Linux, Node 22 or newer, Git,
|
|
14
|
+
`gh` signed in, and `jq`. For the recommended local path, use signed-in Codex CLI
|
|
15
|
+
0.160.0+ or Claude Code 2.1.263+ (Codex implementation accepts 0.158.0+, but
|
|
16
|
+
plain-language preparation needs 0.160.0+). Hosted OpenAI Agents execution has a
|
|
17
|
+
separate setup below and needs no local Codex or Claude binary. See the
|
|
18
|
+
[capability matrix](../README.md#harness-support) before choosing another harness.
|
|
19
|
+
|
|
20
|
+
| Prerequisite | Check | If it fails |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| Node 22+ | `node --version` | install Node from your package manager or a version manager |
|
|
23
|
+
| Git and jq | `git --version`, `jq --version` | `brew install git jq`, `apt install git jq` or `dnf install git jq` |
|
|
24
|
+
| GitHub CLI signed in | `gh auth status` | `gh auth login` |
|
|
25
|
+
| Codex CLI signed in | `codex login status` | `codex login` |
|
|
26
|
+
| Claude Code signed in | `claude auth status` | `claude auth login` |
|
|
27
|
+
| Git identity | `git config --get user.name`, `git config --get user.email` | `git config --global user.name "..."` and `user.email` |
|
|
28
|
+
|
|
29
|
+
Each login belongs to that tool's own flow. Nothing in Gallivant asks for a
|
|
30
|
+
password, token or browser cookie, and `init` stops before writing anything when
|
|
31
|
+
`gh` or the selected harness is signed out.
|
|
12
32
|
|
|
13
33
|
Linux installations need process inspection through `ps` with `lstart`, `command`,
|
|
14
34
|
PID and process-group fields (normally the `procps`/`procps-ng` package). Minimal
|
|
@@ -17,72 +37,103 @@ blocks safe restart rather than allowing overlapping agents. The CI baseline is
|
|
|
17
37
|
Ubuntu with Node 22/24; other distributions must also satisfy their harness and
|
|
18
38
|
sandbox prerequisites.
|
|
19
39
|
|
|
20
|
-
|
|
21
|
-
|
|
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.
|
|
40
|
+
For DNS errors or stalled provider calls, see [network diagnosis and recovery](network-recovery.md).
|
|
41
|
+
The diagnostic command works before configuration or login, on Linux and macOS.
|
|
24
42
|
|
|
25
|
-
|
|
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.
|
|
43
|
+
## 2. The command
|
|
31
44
|
|
|
32
|
-
|
|
45
|
+
Inside the Git checkout you want Gallivant to work in:
|
|
33
46
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
47
|
+
```bash
|
|
48
|
+
cd /path/to/your/repository
|
|
49
|
+
npx --yes @uchibeke/gallivant init --harness codex # or: --harness claude
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
This setup flow requires **0.2.1 or newer**. Check npm's current release with
|
|
53
|
+
`npm view @uchibeke/gallivant version`. Source changes on `main` reach this
|
|
54
|
+
command through a [versioned release](releasing.md); setup itself does not publish
|
|
55
|
+
a package.
|
|
56
|
+
|
|
57
|
+
`npx` downloads the published `@uchibeke/gallivant` package into npm's cache and
|
|
58
|
+
runs its `gallivant` command. Nothing is installed globally, no `gallivant`
|
|
59
|
+
command is added to your PATH, and this repository is not cloned. The command
|
|
60
|
+
ends by saying so and printing both the next `npx` command and the optional
|
|
61
|
+
persistent install:
|
|
38
62
|
|
|
39
63
|
```bash
|
|
40
|
-
|
|
41
|
-
npm ci --ignore-scripts
|
|
42
|
-
npm link
|
|
64
|
+
npm install -g @uchibeke/gallivant # optional; then use plain `gallivant`
|
|
43
65
|
gallivant --version
|
|
44
|
-
gallivant --help # from any directory, to confirm it is on your PATH
|
|
45
66
|
```
|
|
46
67
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
68
|
+
If the shell cannot find `gallivant` after a global install, the `bin` directory
|
|
69
|
+
under `npm prefix -g` is not on your PATH. Avoid `sudo npm install`; use a
|
|
70
|
+
user-owned Node installation or prefix. The rest of this guide writes
|
|
71
|
+
`gallivant`; with `npx`, read that as `npx --yes @uchibeke/gallivant`.
|
|
72
|
+
|
|
73
|
+
### What `init` does
|
|
74
|
+
|
|
75
|
+
1. Refuses to continue, writing nothing, when the directory is not a Git
|
|
76
|
+
checkout, its `origin` remote is not a github.com repository, `gh` is signed
|
|
77
|
+
out, the selected harness is missing, too old or signed out, or the resolved
|
|
78
|
+
run credential cannot see or push to the repository. Each refusal names the
|
|
79
|
+
command that fixes it. Classic credentials also need `public_repo` or `repo`
|
|
80
|
+
scope; a failed scope lookup stops setup before writing and asks you to retry.
|
|
81
|
+
2. Creates `~/.gallivant/config.json` (mode 600) with your authenticated GitHub
|
|
82
|
+
login in `trusted_authors`, the selected installed harness, notifications
|
|
83
|
+
disabled and a separate `~/.gallivant-worktrees` directory for task checkouts.
|
|
84
|
+
Use `--worktrees /absolute/path` to put checkouts elsewhere, outside the
|
|
85
|
+
config home.
|
|
86
|
+
3. Records the repository in `repos` once, by its lowercased `owner/name`.
|
|
87
|
+
4. Prints the `doctor` report and exits with its status: `0` when every check
|
|
88
|
+
passes, `1` while something still needs you.
|
|
89
|
+
|
|
90
|
+
Running it again is safe. An existing config keeps every key as written,
|
|
91
|
+
including custom harness binaries, `github_token_file`, `repos` entries with
|
|
92
|
+
their base branches, `notify` and `worktrees`; the only change is the one `repos`
|
|
93
|
+
entry for the current repository, and a repository already listed is not
|
|
94
|
+
duplicated. `--worktrees` is refused when it differs from the configured
|
|
95
|
+
directory, so edit the config to move checkouts. `--harness` adds the named
|
|
96
|
+
harness when it is not configured yet and leaves the others alone.
|
|
97
|
+
If both Codex and Claude are configured, pass `--harness codex` or
|
|
98
|
+
`--harness claude` explicitly. Setup rechecks settings changed by another command
|
|
99
|
+
before writing, so concurrent repository registrations preserve each other's entries.
|
|
100
|
+
|
|
101
|
+
### What `init` leaves to you
|
|
102
|
+
|
|
103
|
+
`doctor` reports these with the exact fix. `init` does not perform them:
|
|
104
|
+
|
|
105
|
+
- **Reviewer.** The default reviewer is the Codex GitHub integration. Enable it
|
|
106
|
+
on the repository, configure another supported bot, or set `"reviewer": null`
|
|
107
|
+
to rely on CI and trusted human feedback. Without one of these, the default
|
|
108
|
+
loop waits for a review that cannot arrive. See [the reviewer key](config.md#the-reviewer-object).
|
|
109
|
+
- **Branch protection.** Section 5 below. `doctor` prints the `gh api` call; you
|
|
110
|
+
run it.
|
|
111
|
+
- **Harness guardrails.** Sections 7 and 8 below. APort's installer writes the
|
|
112
|
+
hook, and Codex asks you to trust it interactively.
|
|
113
|
+
- **Credentials and notifications.** Sections 4 and 6 below are optional and
|
|
114
|
+
need your own token or ntfy topic.
|
|
115
|
+
- **Starting work.** Setup never prepares or starts a task, so it spends nothing
|
|
116
|
+
on inference. Section 9 covers the first task and what `--run` authorizes.
|
|
51
117
|
|
|
52
118
|
Global configuration lives in `~/.gallivant/config.json` (or
|
|
53
|
-
`$GALLIVANT_HOME/config.json` when explicitly set).
|
|
54
|
-
need a target checkout: run inside it, pass
|
|
55
|
-
pass the PRD path for a written brief.
|
|
119
|
+
`$GALLIVANT_HOME/config.json` when explicitly set). See [config.md](config.md)
|
|
120
|
+
for every key. Task commands still need a target checkout: run inside it, pass
|
|
121
|
+
`--dir` for natural-language tasks, or pass the PRD path for a written brief.
|
|
56
122
|
|
|
57
|
-
|
|
123
|
+
### Install from source
|
|
124
|
+
|
|
125
|
+
Contributors who want to run the checkout they are editing:
|
|
58
126
|
|
|
59
127
|
```bash
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
gallivant init --harness codex # or --harness claude
|
|
65
|
-
gallivant doctor
|
|
128
|
+
git clone https://github.com/uchibeke/gallivant && cd gallivant
|
|
129
|
+
npm ci --ignore-scripts
|
|
130
|
+
npm link
|
|
131
|
+
gallivant --version
|
|
66
132
|
```
|
|
67
133
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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.
|
|
134
|
+
The package has locked runtime dependencies; `npm ci` installs them for a source
|
|
135
|
+
checkout. `npm i -g .` copies instead of linking. This is not the path for using
|
|
136
|
+
Gallivant; the published package is.
|
|
86
137
|
|
|
87
138
|
### Hosted Agents API instead of a local CLI
|
|
88
139
|
|
|
@@ -134,7 +185,16 @@ currently disabled because repository ownership of the selected environment
|
|
|
134
185
|
cannot be verified. See [the Cloud gate](codex-cloud.md); local Codex and Claude
|
|
135
186
|
remain available.
|
|
136
187
|
|
|
137
|
-
## 3.
|
|
188
|
+
## 3. Read the report
|
|
189
|
+
|
|
190
|
+
`init` ends with the `doctor` report; `gallivant doctor` prints it again at any
|
|
191
|
+
time. Every failing line carries the command or file that fixes it. Work through
|
|
192
|
+
them in order, then rerun `doctor`. `doctor` without flags checks configuration,
|
|
193
|
+
credentials and repository access without launching a model run; `doctor --probe`
|
|
194
|
+
runs a real Claude sandbox test and `doctor --send` sends a real notification,
|
|
195
|
+
so use those only when you mean to.
|
|
196
|
+
|
|
197
|
+
## 4. GitHub auth
|
|
138
198
|
|
|
139
199
|
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
200
|
|
|
@@ -178,11 +238,11 @@ recognizes enterprise hosts on an existing checkout, but new-task repository
|
|
|
178
238
|
resolution and clone URLs currently use github.com. An enterprise login or token
|
|
179
239
|
alone does not establish supported end-to-end operation.
|
|
180
240
|
|
|
181
|
-
##
|
|
241
|
+
## 5. A ruleset on each repo
|
|
182
242
|
|
|
183
243
|
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
244
|
|
|
185
|
-
##
|
|
245
|
+
## 6. Notifications
|
|
186
246
|
|
|
187
247
|
Optional: create a topic on [ntfy.sh](https://ntfy.sh) or your own server, install the ntfy app, and set
|
|
188
248
|
`"notify": { "ntfy": "https://ntfy.sh/<unguessable-topic>", "email": null }`.
|
|
@@ -195,7 +255,7 @@ gallivant doctor --send # sends one test message
|
|
|
195
255
|
|
|
196
256
|
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
257
|
|
|
198
|
-
##
|
|
258
|
+
## 7. APort on Claude Code
|
|
199
259
|
|
|
200
260
|
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
261
|
|
|
@@ -224,7 +284,7 @@ gallivant doctor --probe # a real run: a write inside the checkout succeeds,
|
|
|
224
284
|
|
|
225
285
|
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
286
|
|
|
227
|
-
##
|
|
287
|
+
## 8. APort on Codex
|
|
228
288
|
|
|
229
289
|
```bash
|
|
230
290
|
npx @aporthq/aport-agent-guardrails codex --global --enforcement=warn
|
|
@@ -239,10 +299,10 @@ Git metadata writes and escalations, the scoped token and the ruleset. Gallivant
|
|
|
239
299
|
sets the approval mode on start and resume. A denial must be diagnosed, not
|
|
240
300
|
bypassed. See [guardrails.md](guardrails.md#codex-git-writes-need-automatic-approval).
|
|
241
301
|
|
|
242
|
-
##
|
|
302
|
+
## 9. First task
|
|
243
303
|
|
|
244
304
|
Before dispatch, confirm the repository, target branch, permitted changes and
|
|
245
|
-
spending limits. The default `max_iterations` is
|
|
305
|
+
spending limits. The default `max_iterations` is 60 automatic fix rounds;
|
|
246
306
|
`max_budget_usd` defaults to 5 and gives Claude a native per-run dollar cap.
|
|
247
307
|
Other local harnesses do not enforce an equivalent dollar cap. Use your provider's
|
|
248
308
|
spend controls and review [budget semantics](config.md) before unattended work.
|
|
@@ -271,9 +331,9 @@ gallivant task start TASK_ID --revision REVISION --run
|
|
|
271
331
|
gallivant start
|
|
272
332
|
```
|
|
273
333
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
service starts the daemon; `gallivant start` with no path also opens the dashboard.
|
|
334
|
+
Preparation always returns for review, including when the original request
|
|
335
|
+
contains `--run`. Approve the visible ready revision with the separate start
|
|
336
|
+
command above. The task service starts the daemon; `gallivant start` with no path also opens the dashboard.
|
|
277
337
|
Read [task operations](tasks.md) for selected context, revisions, recovery and costs.
|
|
278
338
|
|
|
279
339
|
### From a written brief
|
|
@@ -336,3 +396,13 @@ Watch `gallivant status` after the start run ends: the entry moves from `impleme
|
|
|
336
396
|
| `<worktrees>/<repo>/<prd>` | one partial clone per PRD; durable until you delete it |
|
|
337
397
|
|
|
338
398
|
Override the home directory with `GALLIVANT_HOME` to run a second instance.
|
|
399
|
+
|
|
400
|
+
## Bitbucket-only first run
|
|
401
|
+
|
|
402
|
+
Bitbucket setup uses Node, Git, a selected local harness, an account API token,
|
|
403
|
+
and explicit reviewer or no-reviewer policy. It does not require `gh` sign-in.
|
|
404
|
+
Follow the [first-run commands](bitbucket-review.md#first-setup-including-a-checkout-with-no-existing-configuration),
|
|
405
|
+
including separate SSH and API credentials when using SSH Git. Setup checks
|
|
406
|
+
transport access; a live public repository run has reached ready with explicit
|
|
407
|
+
no-reviewer policy. Independent review and a clean Linux installation have not
|
|
408
|
+
been qualified. Check `gallivant doctor` before starting your own repository.
|
package/docs/launch.md
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
# Announcement drafts
|
|
2
2
|
|
|
3
3
|
Publish these only after [the release checks](releasing.md#verify-before-announcing)
|
|
4
|
-
pass
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
pass for the version being announced. The package is published as
|
|
5
|
+
`@uchibeke/gallivant`; the setup command to advertise is
|
|
6
|
+
`npx --yes @uchibeke/gallivant init --harness codex` (or `--harness claude`),
|
|
7
|
+
run inside the target checkout. Check that the behavior the README describes is
|
|
8
|
+
in the released version before quoting it. Add a genuine dashboard screenshot or
|
|
9
|
+
recording of a task reaching a reviewed PR. Fixture tests are not live provider
|
|
10
|
+
evidence.
|
|
8
11
|
|
|
9
12
|
## X
|
|
10
13
|
|
package/docs/network-recovery.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Network failures and recovery
|
|
2
2
|
|
|
3
|
+
The coordinator normally retains a successful local provider health check for
|
|
4
|
+
five minutes, so a long coordinator cycle does not immediately expire it. A due,
|
|
5
|
+
pending, failed or timed-out check still fences dispatch. An explicit
|
|
6
|
+
`execution.progressMs` setting controls this interval and remains authoritative.
|
|
7
|
+
Provider readiness refreshes on its own timer while a long coordinator cycle
|
|
8
|
+
is still processing. A pending or failed refresh continues to block dispatch.
|
|
9
|
+
Messages and resume requests remain queued while a readiness check is pending;
|
|
10
|
+
an actual failed check still reports failure for the operator to repair.
|
|
11
|
+
|
|
3
12
|
`ENOTFOUND` means a hostname lookup failed. `EAI_AGAIN` indicates a temporary
|
|
4
13
|
resolver failure. Neither proves that a provider is down, credentials expired,
|
|
5
14
|
or APort denied a tool call. DNS can affect one hostname while other sites work.
|
package/docs/openai-agents.md
CHANGED
|
@@ -85,7 +85,8 @@ entry, prepare and inspect a brief first, then follow the returned next action:
|
|
|
85
85
|
```sh
|
|
86
86
|
gallivant task "Document the existing test commands in CONTRIBUTING.md. Change documentation only." \
|
|
87
87
|
--harness openai-agents --verify 'git diff --check'
|
|
88
|
-
#
|
|
88
|
+
# Review the ready draft, then substitute its returned task ID and revision:
|
|
89
|
+
gallivant task start TASK_ID --revision REVISION --run
|
|
89
90
|
```
|
|
90
91
|
|
|
91
92
|
Natural-language intake uses the selected provider's versioned preparation
|
|
@@ -414,7 +415,7 @@ publication and review correction. Use the exact prerequisites above to record
|
|
|
414
415
|
those phases; fixture passes alone are not end-to-end qualification.
|
|
415
416
|
|
|
416
417
|
The original M5/M6 integration handoff points to
|
|
417
|
-
[`aporthq/agent-passport#417`](https://github.com/aporthq/agent-passport/pull/417),
|
|
418
|
+
[`aporthq/agent-passport#417`](https://github.com/aporthq/agent-passport/pull/417) (not publicly readable),
|
|
418
419
|
merged on 2026-10-09. Its canonical brief is
|
|
419
420
|
`docs/prds/aport-task-delivery-workflow-integration.md` in that repository, with
|
|
420
421
|
job identity `aporthq/agent-passport/aport-task-delivery-workflow-integration`.
|
package/docs/prd.md
CHANGED
|
@@ -76,6 +76,27 @@ These keys beyond `status` and `harness` are read if present:
|
|
|
76
76
|
editing a document it was handed, and the list is part of the contract: adding or removing a file stops the entry
|
|
77
77
|
the way an edited criterion does. See [config.md](config.md#files-a-brief-carries-sources) for how it differs from
|
|
78
78
|
`context_paths`.
|
|
79
|
+
- `publish_files` is an optional list of **exact output files** that would otherwise match the task-artifact policy:
|
|
80
|
+
|
|
81
|
+
```yaml
|
|
82
|
+
publish_files:
|
|
83
|
+
- docs/audit/requested-security-report.md
|
|
84
|
+
- docs/evidence/export-dialog.png
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Use it only for reports, evidence or carried documents the operator explicitly wants in the PR. It does not list
|
|
88
|
+
ordinary implementation files or tests. No globs, directories, absolute paths or more than 100 entries are accepted.
|
|
89
|
+
The saved, approved brief supplies these exceptions; editing the session's copy cannot grant permission. Changing
|
|
90
|
+
the list changes the contract and uses the normal `prd-changed` repair/approval flow.
|
|
91
|
+
|
|
92
|
+
Task work logs, session transcripts, scratch files, audit chronology and review/handoff notes belong outside Git.
|
|
93
|
+
Create scratch space with `mktemp -d`; put concise verification results in the PR receipt. Keep lasting project
|
|
94
|
+
documentation and release/rollback instructions concise. The commit hook and final remote PR-diff check reject
|
|
95
|
+
conventional work-artifact paths (including `docs/audit/`, `docs/evidence/`, `docs/verification/`, `WORK_LOG.md`,
|
|
96
|
+
`NOTES.md`, and carried `sources`) unless listed here. Deletions remain allowed so an existing PR can be cleaned.
|
|
97
|
+
Required image evidence must remain committed at its explicitly approved paths; deleting it would invalidate review.
|
|
98
|
+
This is a path hygiene check, not a semantic content scanner: do not rename work logs to evade it.
|
|
99
|
+
|
|
79
100
|
- `context_paths` gives this one brief read access to directories outside its checkout, added to whatever
|
|
80
101
|
`config.json` already lists rather than replacing it. Comma-separated, or a `[a, b]` list:
|
|
81
102
|
|
|
@@ -128,7 +149,7 @@ file in your checkout are two files, and until this existed nothing compared the
|
|
|
128
149
|
the run finished against criteria nobody was asking for and the PR arrived satisfying a document that had changed.
|
|
129
150
|
|
|
130
151
|
So the two are compared, and what happens depends on what you changed. The comparison is in the contract's own terms:
|
|
131
|
-
the acceptance criteria, Verify commands, `harness`, `context_paths`, `sources`,
|
|
152
|
+
the acceptance criteria, Verify commands, `harness`, `context_paths`, `sources`, `publish_files`,
|
|
132
153
|
and the **Coordinator delivery contract** when present. The ownership section
|
|
133
154
|
keeps a natural-language publication instruction separate from provider work.
|
|
134
155
|
It is validated and fingerprinted too; malformed edits cannot be silently ignored.
|
|
@@ -138,7 +159,7 @@ request bytes remain exact.
|
|
|
138
159
|
| What you changed | What happens |
|
|
139
160
|
|---|---|
|
|
140
161
|
| Anything outside those contract fields: the Problem prose, a reworded story, a new Out of scope bullet | Nothing stops. The snapshot follows your edit so later prompts carry your current wording, the log says it happened, and you are not told. Stopping a run to ask about a typo fix would be worse than useless. |
|
|
141
|
-
| A criterion, a Verify command, the harness, `context_paths`, `sources` or coordinator delivery ownership | The entry stops with `prd-changed` before the gate runs, and `gallivant why` names each difference. |
|
|
162
|
+
| A criterion, a Verify command, the harness, `context_paths`, `sources`, `publish_files` or coordinator delivery ownership | The entry stops with `prd-changed` before the gate runs, and `gallivant why` names each difference. |
|
|
142
163
|
| The ORDER of two criteria, without changing a word of either | Also `prd-changed`. Criteria are numbered by position, and the receipt on the open PR attests `ac-1` and `ac-2` by those numbers, so swapping two of them leaves the receipt attesting each criterion with the other's evidence. |
|
|
143
164
|
| The file no longer passes the contract | `prd-illegal`. Fix the file and `gallivant ready` it again; it cannot become the brief the gate judges as it stands. |
|
|
144
165
|
| The file is gone from your checkout | `prd-gone`. Restore it, or `gallivant remove` the entry. |
|
package/docs/preparation.md
CHANGED
|
@@ -16,7 +16,7 @@ Preparation and implementation are separate capabilities:
|
|
|
16
16
|
| Claude Code | Tools disabled | Local checkout |
|
|
17
17
|
| Codex | Isolated native profile, Codex 0.160.0+ | Local checkout |
|
|
18
18
|
| OpenAI Agents API | Text only, no tools or environment | Hosted sandbox |
|
|
19
|
-
| Gemini CLI, OpenCode, Goose | Unavailable; use `new` → `ready` → `start` | Local checkout |
|
|
19
|
+
| Gemini CLI, OpenCode, Goose | Unavailable through the harness; the configured [model route](task-profiles.md#planner-routes) can draft, or use `new` → `ready` → `start` | Local checkout |
|
|
20
20
|
| Codex Cloud | Unavailable | New dispatch blocked on environment/repository verification |
|
|
21
21
|
|
|
22
22
|
An adapter's presence does not prove the configured account can use its selected
|
|
@@ -102,7 +102,7 @@ Official configuration references:
|
|
|
102
102
|
Re-run native qualification when upgrading the CLI or adding tool capabilities.
|
|
103
103
|
|
|
104
104
|
The recorded cross-repository integration handoff names
|
|
105
|
-
[`aporthq/agent-passport#417`](https://github.com/aporthq/agent-passport/pull/417),
|
|
105
|
+
[`aporthq/agent-passport#417`](https://github.com/aporthq/agent-passport/pull/417) (not publicly readable),
|
|
106
106
|
with job identity `aporthq/agent-passport/aport-task-delivery-workflow-integration`.
|
|
107
107
|
The handoff calls for reusing that continuation after the actual portable package
|
|
108
108
|
is available. This document qualifies the preparation boundary; it does not
|
|
@@ -16,7 +16,7 @@ the accessible actual demo recording URL. Do not substitute generated images.
|
|
|
16
16
|
|
|
17
17
|
```sh
|
|
18
18
|
npm run release:preflight -- --config "$PACKAGE_CONFIG" --setup "$SETUP_EVIDENCE"
|
|
19
|
-
npm run release:package -- --config "$PACKAGE_CONFIG" --out "$RELEASE_DIR" --core-version 0.
|
|
19
|
+
npm run release:package -- --config "$PACKAGE_CONFIG" --out "$RELEASE_DIR" --core-version 0.3.0 --source-commit "$SOURCE_COMMIT" --deployment "$DEPLOYMENT_RECORD" --evidence "$LIVE_EVIDENCE"
|
|
20
20
|
npm run release:validate -- --out "$RELEASE_DIR"
|
|
21
21
|
```
|
|
22
22
|
|
package/docs/releasing.md
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
# Releasing
|
|
2
2
|
|
|
3
3
|
The package name is `@uchibeke/gallivant`; the executable is `gallivant`. The repository is
|
|
4
|
-
`uchibeke/gallivant`.
|
|
5
|
-
|
|
6
|
-
npm
|
|
4
|
+
`uchibeke/gallivant`. The first public release, 0.2.0, was published on
|
|
5
|
+
2026-10-19; `npm view @uchibeke/gallivant version` reports the current one.
|
|
6
|
+
Before announcing a version, confirm its npm publication and a passing consumer
|
|
7
|
+
smoke check. A public GitHub repository alone does not make the npm command work.
|
|
8
|
+
|
|
9
|
+
The README and installation guide lead with
|
|
10
|
+
`npx --yes @uchibeke/gallivant init --harness codex`, which runs whatever
|
|
11
|
+
version npm serves as `latest`. When `init` or another documented command changes
|
|
12
|
+
behavior, release the version that carries it before, or together with, the
|
|
13
|
+
documentation that describes it.
|
|
7
14
|
|
|
8
15
|
## One-time launch setup
|
|
9
16
|
|
|
@@ -21,14 +28,13 @@ npm command work.
|
|
|
21
28
|
Enable the `main` ruleset with pull requests, the four portability checks,
|
|
22
29
|
and protection against deletion and force pushes. Read back both settings:
|
|
23
30
|
merely referencing `environment: npm` in YAML does not create protection.
|
|
24
|
-
3.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
4. Once the package exists, configure its npm trusted publisher for GitHub owner
|
|
31
|
+
3. The initial publication used a short-lived granular `NPM_TOKEN` in the
|
|
32
|
+
protected `npm` environment, scoped as narrowly as npm permits. Never put a
|
|
33
|
+
token in the repository or a PR. A local `npm login` is not authentication
|
|
34
|
+
for GitHub Actions. Do not publish a release locally to bypass this setup:
|
|
35
|
+
the release's provenance is generated in supported CI, not by the
|
|
36
|
+
developer's terminal.
|
|
37
|
+
4. With the package published, configure its npm trusted publisher for GitHub owner
|
|
32
38
|
`uchibeke`, repository `gallivant`, workflow `release.yml`, environment `npm`.
|
|
33
39
|
Permit direct `npm publish`, which is what this workflow runs. Validate a new
|
|
34
40
|
trusted publisher within two days or recreate it after expiry; configure it
|
|
@@ -56,8 +62,8 @@ npm whoami --registry=https://registry.npmjs.org
|
|
|
56
62
|
npm view @uchibeke/gallivant version --registry=https://registry.npmjs.org
|
|
57
63
|
```
|
|
58
64
|
|
|
59
|
-
|
|
60
|
-
|
|
65
|
+
`npm view` should report the published version. An absent `npm` environment or
|
|
66
|
+
disabled branch protection is unfinished release setup.
|
|
61
67
|
|
|
62
68
|
### Staged publishing is a different workflow
|
|
63
69
|
|
|
@@ -75,10 +81,25 @@ GitHub release. Until then, use the documented CI bootstrap credential route.
|
|
|
75
81
|
|
|
76
82
|
## Release a version
|
|
77
83
|
|
|
84
|
+
Merging a PR to `main` does not bump the version, create a tag or publish a
|
|
85
|
+
package. There is no scheduled release or automatic version-bump PR. Prepare a
|
|
86
|
+
version-bump PR, wait for its checks, merge it, then trigger the workflow and
|
|
87
|
+
approve the protected `npm` environment. A newer source checkout with an already
|
|
88
|
+
published version cannot refresh that npm version: the tag and tarball guards
|
|
89
|
+
deliberately require the original commit and bytes.
|
|
90
|
+
|
|
78
91
|
Update the version with `npm version patch --no-git-tag-version` (or `minor`),
|
|
79
92
|
which updates `package.json` and `npm-shrinkwrap.json`. Include release notes in
|
|
80
93
|
the PR and merge it after CI passes. Do not bump the version for a retry.
|
|
81
94
|
|
|
95
|
+
Update `CORE_VERSION` in `lib/task_delivery_contract.mjs` to the same version.
|
|
96
|
+
For a minor release, review and update its pre-1.0 compatibility window, the
|
|
97
|
+
handshake tests and the packaging examples in [task delivery](task-delivery.md)
|
|
98
|
+
and [release qualification](release-qualification.md). Other minor versions
|
|
99
|
+
require explicit migration; keep the exact artifact pin and wire-schema guards.
|
|
100
|
+
Run the full portability suite, including plugin packaging and release assembly,
|
|
101
|
+
before publishing: the npm install smoke alone does not exercise those builders.
|
|
102
|
+
|
|
82
103
|
The workflow follows the guardrails repository's pattern: validate the release
|
|
83
104
|
ref, test before publishing, and permit recovery without replacing published
|
|
84
105
|
versions. This single-package project does not need its multi-registry dispatcher.
|
|
@@ -87,8 +108,8 @@ Choose one trigger:
|
|
|
87
108
|
|
|
88
109
|
```sh
|
|
89
110
|
# From an up-to-date main checkout; replace the example with package.json's version.
|
|
90
|
-
git tag -a v0.
|
|
91
|
-
git push origin v0.
|
|
111
|
+
git tag -a v0.3.0 -m 'Release 0.3.0'
|
|
112
|
+
git push origin v0.3.0
|
|
92
113
|
|
|
93
114
|
# Or dispatch against main; the workflow uses main's package version.
|
|
94
115
|
gh workflow run release.yml --repo uchibeke/gallivant --ref main
|
|
@@ -113,7 +134,8 @@ original workflow rather than dispatching newer `main` with the old version.
|
|
|
113
134
|
|
|
114
135
|
```sh
|
|
115
136
|
npm view @uchibeke/gallivant version dist.integrity dist.attestations
|
|
116
|
-
|
|
137
|
+
npx --yes @uchibeke/gallivant --version # the command the README leads with
|
|
138
|
+
npm install -g @uchibeke/gallivant # the documented persistent option
|
|
117
139
|
gallivant --version
|
|
118
140
|
gallivant --help
|
|
119
141
|
```
|
|
@@ -124,9 +146,9 @@ in a clean project that installed the released version to verify registry
|
|
|
124
146
|
signatures and available provenance. Metadata presence alone is not signature
|
|
125
147
|
verification; see [npm provenance verification](https://docs.npmjs.com/generating-provenance-statements/#verifying-provenance-attestations).
|
|
126
148
|
|
|
127
|
-
After publication is verified,
|
|
128
|
-
the
|
|
129
|
-
|
|
149
|
+
After publication is verified, check that the README's `npx` command and the
|
|
150
|
+
installation guide match the behavior of the released version, and keep the
|
|
151
|
+
source-install alternative for contributors.
|
|
130
152
|
|
|
131
153
|
Use a clean test account/home and the [getting-started guide](install.md) for one
|
|
132
154
|
small real PR. Confirm implementation, feedback-driven continuation, CI and the
|
|
@@ -135,6 +157,8 @@ paid-provider access. Recheck anonymous GitHub access and all README links.
|
|
|
135
157
|
Announcement drafts are in [launch.md](launch.md).
|
|
136
158
|
|
|
137
159
|
For local validation without publishing: `npm run lint`, `npm test`, and
|
|
138
|
-
`npm run test:install`. The last command packs
|
|
139
|
-
directory,
|
|
140
|
-
|
|
160
|
+
`npm run test:install`. The last command packs the tarball under a disposable
|
|
161
|
+
directory, runs the README's `npx` setup command against it from a fixture
|
|
162
|
+
repository with a throwaway home, installs it as a dependency, exercises PRD
|
|
163
|
+
commands outside the source tree, and imports every declared module export. It
|
|
164
|
+
makes registry requests but no model calls.
|
package/docs/task-delivery.md
CHANGED
|
@@ -12,14 +12,14 @@ must enforce the same authorization, ownership, persistence and recovery
|
|
|
12
12
|
contracts. In the APort integration, APort owns publication and the host
|
|
13
13
|
responsibilities above. Its existing
|
|
14
14
|
`aporthq/agent-passport/aport-task-delivery-mcp` job produced merged
|
|
15
|
-
[PR #414](https://github.com/aporthq/agent-passport/pull/414); reuse that integration.
|
|
15
|
+
[PR #414](https://github.com/aporthq/agent-passport/pull/414) (not publicly readable); reuse that integration.
|
|
16
16
|
The M5/M6 notes below preserve that integration's milestone evidence and gates;
|
|
17
17
|
they do not certify another host or supply a public UI, database or competing
|
|
18
18
|
runner.
|
|
19
19
|
|
|
20
20
|
## Installed exports
|
|
21
21
|
|
|
22
|
-
Core `0.
|
|
22
|
+
Core `0.3.0`, task schema `1`, execution schema `1`, operation schema `1`.
|
|
23
23
|
The candidate digest comes from the emitted `runtime.json`/`manifest.json`;
|
|
24
24
|
pin the artifact produced from the eventual human-merged commit, not this branch.
|
|
25
25
|
|
|
@@ -218,7 +218,7 @@ Before wake-up, migrate/pin the exact runtime artifact. Supply the emitted
|
|
|
218
218
|
The coordinator refuses a different active-job digest. Compatible patches keep
|
|
219
219
|
task/provider/brief identities; drain jobs before staging a different artifact.
|
|
220
220
|
No running code is silently upgraded. The public API's pre-1.0 compatibility
|
|
221
|
-
window is `0.
|
|
221
|
+
window is `0.3.x`, with operation/task/execution wire schemas all `1`; other
|
|
222
222
|
versions need migration.
|
|
223
223
|
|
|
224
224
|
The portable contracts/views/wake envelope have no Node dependencies. The complete
|
|
@@ -267,9 +267,9 @@ changes and remain development fixtures:
|
|
|
267
267
|
npm ci --ignore-scripts
|
|
268
268
|
node bin/package-plugin.mjs --config /private/aport-package.json --validate-public
|
|
269
269
|
npm run package:plugin -- --config /private/aport-package.json --out /private/candidate \
|
|
270
|
-
--core-version 0.
|
|
270
|
+
--core-version 0.3.0 --source-commit <40-character-merged-commit>
|
|
271
271
|
# For development only, add --internal; keep fixture:true in the config.
|
|
272
|
-
npm install --ignore-scripts --prefix /private/candidate-runtime /private/candidate/uchibeke-gallivant-0.
|
|
272
|
+
npm install --ignore-scripts --prefix /private/candidate-runtime /private/candidate/uchibeke-gallivant-0.3.0.tgz
|
|
273
273
|
node /private/candidate-runtime/node_modules/@uchibeke/gallivant/bin/task-delivery-state.mjs check \
|
|
274
274
|
--home /durable/preview --manifest /private/candidate/runtime.json
|
|
275
275
|
node /private/previous-runtime/node_modules/@uchibeke/gallivant/bin/task-delivery-state.mjs backup \
|