carson 3.27.0 → 3.28.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.
- checksums.yaml +4 -4
- data/.github/workflows/carson_policy.yml +1 -1
- data/API.md +34 -7
- data/MANUAL.md +10 -9
- data/README.md +15 -8
- data/RELEASE.md +27 -1
- data/VERSION +1 -1
- data/carson.gemspec +1 -0
- data/lib/carson/delivery.rb +9 -2
- data/lib/carson/ledger.rb +318 -34
- data/lib/carson/runtime/deliver.rb +779 -85
- data/lib/carson/runtime/govern.rb +118 -66
- data/lib/carson/runtime/local/merge_proof.rb +199 -0
- data/lib/carson/runtime/local/sync.rb +89 -0
- data/lib/carson/runtime/local/worktree.rb +7 -21
- data/lib/carson/runtime/local.rb +1 -0
- data/lib/carson/runtime/status.rb +34 -1
- data/lib/carson/worktree.rb +95 -18
- metadata +24 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a58a0b99b9cd8c7e241c6278f9b72fd4a6188cf45a51f22a5cb88bb6a83a703a
|
|
4
|
+
data.tar.gz: 0203fbacb58d17d33f58e90f4b868ad7065c086d0fb0963100eb0cac7f4d5f51
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 356111e22c7bf14aac077ebc02b80554713c1228dc7ab36688abdd8fb199e40e9c9965f1da0398e2736545b1bf9ffb38dee11f36081f8d781acc7c23e11d506e
|
|
7
|
+
data.tar.gz: 2476eae596465a0f3b7256646a7ed8364c709ed6279a3183da6ea4636dc05129cb7168d9e6dc2eee701ff4f05d56ec13e94a0c86719b0ec0dc82ce967548ab1c
|
data/API.md
CHANGED
|
@@ -25,14 +25,14 @@ carson <command> [subcommand] [arguments]
|
|
|
25
25
|
| Command | Purpose |
|
|
26
26
|
|---|---|
|
|
27
27
|
| `carson audit` | Evaluate governance status and generate report output. |
|
|
28
|
-
| `carson deliver [--commit MESSAGE]` | Run Carson-owned branch delivery for the current checkout. Plain `deliver` transports existing commits only; `--commit` creates one all-dirty delivery commit first,
|
|
28
|
+
| `carson deliver [--commit MESSAGE]` | Run Carson-owned branch delivery for the current checkout. Plain `deliver` transports existing commits only; `--commit` creates one all-dirty delivery commit first. Before push, Carson verifies the branch is fresh against the configured remote `main`; behind or unknown freshness blocks delivery without creating or refreshing a PR. If freshness is good, Carson pushes, creates or refreshes the PR, watches the delivery for a bounded settle window, merges when clear, syncs local `main`, and reports merge proof for the delivered branch. Non-integrated exits report `Merge deferred` or `Merge blocked` with explicit handoff commands. |
|
|
29
29
|
| `carson recover --check NAME [--json]` | Run the exceptional governed recovery path when one governance-owned required check is already red on the default branch. Carson proves the named baseline failure, keeps every other gate intact, merges through the recovery path, and records a machine-readable audit event. |
|
|
30
30
|
| `carson sync` | Fast-forward local `main` from configured remote when tree is clean. |
|
|
31
31
|
| `carson prune` | Remove stale local branches whose upstream refs no longer exist. |
|
|
32
|
-
| `carson housekeep [--json] [--dry-run]` | Attempt to sync the current repo, then reap
|
|
32
|
+
| `carson housekeep [--json] [--dry-run]` | Attempt to sync the current repo, then reap worktrees with strong abandonment evidence, reconcile integrated delivery worktree records from the ledger, and prune stale branches. Safe cleanup still runs when sync is blocked. |
|
|
33
33
|
| `carson template check` | Detect drift between managed templates and host `.github/*` files. |
|
|
34
34
|
| `carson template apply` | Write canonical managed template content into host `.github/*` files. |
|
|
35
|
-
| `carson status [--json]` | Show repository delivery state, including the next queued delivery and blocked-delivery summaries. Default output is Markdown/text; `--json` is the explicit machine contract. |
|
|
35
|
+
| `carson status [--json]` | Show repository delivery state, including the next queued delivery and blocked-delivery summaries. For the current branch, status also reports Carson's last observed PR state and merge proof when the branch has a Carson delivery record. Default output is Markdown/text; `--json` is the explicit machine contract. |
|
|
36
36
|
| `carson abandon <pr_number\|pr_url\|branch> [--json]` | Close abandoned delivery work and clean up its PR, worktree, and branch when safe. |
|
|
37
37
|
| `carson worktree create <name>` | Create an isolated worktree and branch for a new stream of work. |
|
|
38
38
|
| `carson worktree list [--json]` | Show every registered worktree with PR state and Carson's cleanup recommendation. |
|
|
@@ -50,7 +50,7 @@ All batch commands operate across every governed repository registered in `gover
|
|
|
50
50
|
| `carson prune --all` | Remove stale branches across all governed repos. |
|
|
51
51
|
| `carson status --all [--json]` | Portfolio-wide delivery overview per governed repository. |
|
|
52
52
|
| `carson template check --all` | Read-only template drift detection across all governed repos. |
|
|
53
|
-
| `carson housekeep --all [--loop SECONDS]` | Attempt sync, then reap
|
|
53
|
+
| `carson housekeep --all [--loop SECONDS]` | Attempt sync, then reap worktrees with strong abandonment evidence, reconcile integrated delivery worktree records from the ledger, and prune across all governed repos. Safe cleanup still runs when sync is blocked. |
|
|
54
54
|
|
|
55
55
|
`--loop SECONDS` runs the housekeep cycle continuously, sleeping SECONDS between cycles. It requires `--all`, accepts only positive integers, and exits cleanly on `Ctrl-C` with a cycle count summary.
|
|
56
56
|
|
|
@@ -58,7 +58,7 @@ All batch commands operate across every governed repository registered in `gover
|
|
|
58
58
|
|
|
59
59
|
| Command | Purpose |
|
|
60
60
|
|---|---|
|
|
61
|
-
| `carson govern [--dry-run] [--json] [--loop SECONDS]` | Portfolio-level delivery oversight: assess active deliveries, integrate ready branches, dispatch revisions, and escalate blocked work. |
|
|
61
|
+
| `carson govern [--dry-run] [--json] [--loop SECONDS]` | Portfolio-level delivery oversight: assess active deliveries, integrate ready branches, dispatch revisions, and escalate blocked work. Live integrated rows include merge proof. |
|
|
62
62
|
|
|
63
63
|
`--loop SECONDS` runs the govern cycle continuously, sleeping SECONDS between cycles. The loop isolates errors per cycle — a single failing cycle does not stop the daemon. `Ctrl-C` cleanly exits with a cycle count summary. SECONDS must be a positive integer.
|
|
64
64
|
|
|
@@ -66,7 +66,34 @@ Governed integration is fixed to `squash`. Non-squash `govern.merge.method` valu
|
|
|
66
66
|
|
|
67
67
|
After a live integration attempt, govern reports the actual outcome. Failed merges stay held at gate instead of being reported as integrated.
|
|
68
68
|
|
|
69
|
-
After CI and review pass, Carson still checks GitHub mergeability. Conflicting PRs
|
|
69
|
+
After CI and review pass, Carson still checks GitHub mergeability. Conflicting PRs exit as `Merge blocked` with an explicit merge-conflict summary. `BEHIND` is treated as freshness failure: Carson blocks and requires a branch refresh before it will continue.
|
|
70
|
+
|
|
71
|
+
In `--json` mode, `deliver` still suppresses human output. Every JSON result now includes `watch_window_seconds`, `waited_seconds`, and `merge_attempted`; integrated exits also include a `merge_proof` object; deferred and blocked exits also include a `handoff` object with `reason`, `expectation`, and ordered `next_steps`.
|
|
72
|
+
|
|
73
|
+
`status --json` extends the `branch` object with:
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"pull_request": {
|
|
78
|
+
"number": 299,
|
|
79
|
+
"url": "https://github.com/example/repo/pull/299",
|
|
80
|
+
"state": "MERGED",
|
|
81
|
+
"draft": false,
|
|
82
|
+
"merged_at": "2026-03-16T09:00:00Z",
|
|
83
|
+
"summary": "PR #299 is merged."
|
|
84
|
+
},
|
|
85
|
+
"merge_proof": {
|
|
86
|
+
"applicable": true,
|
|
87
|
+
"proven": true,
|
|
88
|
+
"basis": "content_identical",
|
|
89
|
+
"summary": "proven on main — 6 changed files already match main.",
|
|
90
|
+
"main_branch": "main",
|
|
91
|
+
"changed_files_count": 6
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
On `main`, `branch.merge_proof` is still present with `basis: "not_applicable"`. On non-main branches with no Carson delivery record, `branch.pull_request` and `branch.merge_proof` are `null`. `status --all` remains summary-only in v1 and does not include per-repo merge proof.
|
|
70
97
|
|
|
71
98
|
After a successful govern merge, Carson runs the same cleanup path as `housekeep`: sync, reap safe worktrees, then prune.
|
|
72
99
|
|
|
@@ -157,7 +184,7 @@ Environment overrides:
|
|
|
157
184
|
- `agent.codex` / `agent.claude`: provider-specific options (reserved).
|
|
158
185
|
- `check_wait`: seconds to wait for CI checks before classifying (default: `30`).
|
|
159
186
|
- `merge.method`: `"squash"` only in governed mode.
|
|
160
|
-
- `state_path`: JSON
|
|
187
|
+
- `state_path`: JSON ledger path for active deliveries and revisions. Legacy SQLite ledgers are imported automatically on first read; explicit legacy `.sqlite3` paths keep working after import.
|
|
161
188
|
|
|
162
189
|
`template` schema:
|
|
163
190
|
|
data/MANUAL.md
CHANGED
|
@@ -66,12 +66,12 @@ on:
|
|
|
66
66
|
|
|
67
67
|
jobs:
|
|
68
68
|
governance:
|
|
69
|
-
uses: wanghailei/carson/.github/workflows/carson_policy.yml@
|
|
69
|
+
uses: wanghailei/carson/.github/workflows/carson_policy.yml@v3.28.0
|
|
70
70
|
secrets:
|
|
71
71
|
CARSON_READ_TOKEN: ${{ secrets.CARSON_READ_TOKEN }}
|
|
72
72
|
with:
|
|
73
|
-
carson_ref: "
|
|
74
|
-
carson_version: "
|
|
73
|
+
carson_ref: "v3.28.0"
|
|
74
|
+
carson_version: "3.28.0"
|
|
75
75
|
rubocop_version: "1.81.0"
|
|
76
76
|
```
|
|
77
77
|
|
|
@@ -157,16 +157,16 @@ On the governed main working tree, Carson blocks raw `git add` / `git commit` an
|
|
|
157
157
|
|
|
158
158
|
**2. Work** — make changes, test them, and either commit normally or let Carson create the delivery commit.
|
|
159
159
|
|
|
160
|
-
**3. Hand the branch to Carson** — `deliver` is the synchronous happy path. Carson pushes the branch, creates or refreshes the PR,
|
|
160
|
+
**3. Hand the branch to Carson** — `deliver` is the synchronous happy path. Before any push, Carson verifies the branch is fresh against the configured remote `main`. If freshness is behind or unknown, delivery stops immediately and no PR is created or refreshed. If freshness is good, Carson pushes the branch, creates or refreshes the PR, watches the delivery for a bounded settle window, merges when the path is clear, syncs local `main`, and then reports merge proof for the delivered branch. If the window expires without integration, Carson exits with an explicit `Merge deferred` or `Merge blocked` handoff that states whether merge was attempted and what to run next. Plain `carson deliver` transports existing commits and blocks if the worktree is dirty. `carson deliver --commit "..."` creates one all-dirty agent-authored commit first, then continues the same delivery flow. Managed template drift is still corrected in a separate Carson-managed commit before push.
|
|
161
161
|
|
|
162
162
|
```bash
|
|
163
163
|
carson deliver
|
|
164
164
|
# or, if the worktree is still dirty:
|
|
165
165
|
carson deliver --commit "fix: describe this delivery"
|
|
166
|
-
# Output: merged into main, or
|
|
166
|
+
# Output: merged into main, or an explicit deferred/blocked handoff
|
|
167
167
|
```
|
|
168
168
|
|
|
169
|
-
**4. Inspect or wait when needed** — when `deliver` cannot merge immediately, `status` shows the current branch, the next queued delivery, and
|
|
169
|
+
**4. Inspect or wait when needed** — when `deliver` cannot merge immediately, Carson tells you whether the PR was deferred or blocked, whether merge was attempted, and which command to run next. `status` still shows the current branch, the next queued delivery, and blocked-delivery summaries for the repository. When the current branch has a Carson delivery record, `status` also shows Carson's last observed PR state and merge proof. Keep `govern` running when you want unattended portfolio reassessment and revision dispatch across governed repositories:
|
|
170
170
|
|
|
171
171
|
```bash
|
|
172
172
|
carson status
|
|
@@ -193,7 +193,7 @@ carson worktree list
|
|
|
193
193
|
carson housekeep
|
|
194
194
|
```
|
|
195
195
|
|
|
196
|
-
`housekeep` still performs safe reaping and branch pruning when `sync` cannot complete. A blocked sync no longer prevents cleanup work that has its own safety evidence.
|
|
196
|
+
`housekeep` still performs safe reaping and branch pruning when `sync` cannot complete. A blocked sync no longer prevents cleanup work that has its own safety evidence. Absorbed-into-main detection is informational; Carson only auto-reaps when it also has stronger abandonment evidence such as a missing directory, merged PR, or closed abandoned PR.
|
|
197
197
|
|
|
198
198
|
`housekeep` also reconciles integrated delivery worktree records from the ledger. If the recorded worktree is already gone, Carson clears the stale ledger path. If the worktree still points at the integrated head and is safe to remove, Carson reaps it and clears the ledger path in the same pass.
|
|
199
199
|
|
|
@@ -325,9 +325,9 @@ Each cycle runs independently: if one cycle fails (network error, GitHub API tim
|
|
|
325
325
|
|
|
326
326
|
`carson govern` dispatches coding agents (Codex or Claude) when an active delivery is blocked by CI, review, or policy feedback. The agent receives the failure context and attempts a revision. If the agent succeeds, the delivery re-enters the governance pipeline. If it fails repeatedly or times out, the delivery is escalated for human attention.
|
|
327
327
|
|
|
328
|
-
After a live merge attempt, govern reports the actual outcome. Failed merges stay held at gate instead of being reported as integrated.
|
|
328
|
+
After a live merge attempt, govern reports the actual outcome. Failed merges stay held at gate instead of being reported as integrated. Successful integrations also report merge proof for the landed branch.
|
|
329
329
|
|
|
330
|
-
After CI and review pass, Carson still checks GitHub mergeability. Conflicting PRs
|
|
330
|
+
After CI and review pass, Carson still checks GitHub mergeability. Conflicting PRs exit as `Merge blocked` with an explicit merge-conflict summary. `BEHIND` is treated as a freshness failure, not a harmless squash detail: Carson blocks and requires a branch refresh before it will continue.
|
|
331
331
|
|
|
332
332
|
After a successful govern merge, Carson runs the same cleanup path as `carson housekeep`: sync, reap safe worktrees, then prune.
|
|
333
333
|
|
|
@@ -359,6 +359,7 @@ These define what Carson *is*. They are not configurable.
|
|
|
359
359
|
- **Active review** — undisposed reviewer findings block merge; feedback must be acknowledged.
|
|
360
360
|
- **Self-diagnosing output** — every warning and error names what went wrong, why, and what to do next.
|
|
361
361
|
- **Transparent governance** — Carson prepares everything for merge but never makes decisions without telling you.
|
|
362
|
+
- **Structural-edit discipline** — coding agents must not use Python or other blind text-rewrite scripts to edit Carson's Ruby source. Ruby files are edited with scoped patches or Ruby-aware tools so structural `end` boundaries are not truncated by cross-language text munging.
|
|
362
363
|
|
|
363
364
|
### Configurable defaults
|
|
364
365
|
|
data/README.md
CHANGED
|
@@ -26,7 +26,7 @@ Carson lives on your workstation and in CI, never inside the repositories it gov
|
|
|
26
26
|
~/.carson/ ← Carson lives here, never inside your repos
|
|
27
27
|
│
|
|
28
28
|
├─ hooks ──────────────► commit gates and command guards
|
|
29
|
-
├─ worktree flow ──────► create → work → deliver →
|
|
29
|
+
├─ worktree flow ──────► create → work → deliver → housekeep
|
|
30
30
|
└─ portfolio layer ────► status --all | refresh --all | govern
|
|
31
31
|
```
|
|
32
32
|
|
|
@@ -35,6 +35,7 @@ The outsider boundary still matters: Carson governs repositories without becomin
|
|
|
35
35
|
## Principles
|
|
36
36
|
|
|
37
37
|
- **Worktree-first** — substantive work happens in worktrees, not on `main`.
|
|
38
|
+
- **Single landing path** — completed work rejoins shared truth through remote `main` via PR-based delivery.
|
|
38
39
|
- **Carson-owned operations** — Carson owns worktree and delivery operations in governed repositories. Raw `git worktree add/remove`, raw `git pull --rebase`, and raw `gh pr create/merge` are blocked, and `git add` / `git commit` are blocked on the main working tree until you create a Carson worktree.
|
|
39
40
|
- **Self-diagnosing output** — every block should say what happened and the exact next command.
|
|
40
41
|
- **Outsider boundary** — Carson governs repositories without becoming a host-repository runtime dependency.
|
|
@@ -50,18 +51,24 @@ carson onboard your/repo/path
|
|
|
50
51
|
carson worktree create your-worktree
|
|
51
52
|
cd your/repo/path/.claude/worktrees/your-worktree
|
|
52
53
|
|
|
53
|
-
# work and test, then
|
|
54
|
-
|
|
54
|
+
# work and test, then commit and hand the branch to Carson
|
|
55
|
+
git add -A
|
|
56
|
+
git commit -m "fix: describe this delivery"
|
|
57
|
+
carson deliver
|
|
55
58
|
|
|
56
|
-
#
|
|
57
|
-
carson
|
|
59
|
+
# or let Carson create one all-dirty delivery commit:
|
|
60
|
+
# carson deliver --commit "fix: describe this delivery"
|
|
61
|
+
|
|
62
|
+
# once the delivery is integrated, clean up from the repo root
|
|
63
|
+
cd your/repo/path
|
|
64
|
+
carson housekeep
|
|
58
65
|
```
|
|
59
66
|
|
|
60
|
-
`carson deliver`
|
|
67
|
+
`carson deliver` runs Carson-owned branch delivery. Before any push, Carson verifies that the branch is fresh against the configured remote `main`. If freshness is behind or unknown, delivery stops with an explicit block and no PR side effect. Plain `deliver` transports existing commits only; `carson deliver --commit "..."` creates one all-dirty delivery commit first, then continues the same flow. If the branch is fresh, Carson pushes it, creates or refreshes the PR, watches the delivery for a bounded settle window, merges when clear, and syncs local `main`. If the settle window expires without integration, Carson exits with an explicit `Merge deferred` or `Merge blocked` handoff instead of leaving the PR mysteriously open. Deferred and blocked exits say whether Carson attempted merge and list the next commands in order.
|
|
61
68
|
|
|
62
69
|
When one Carson-governed required check is already red on the default branch and the current PR is the repair, use `carson recover --check "..."`. Recovery is the explicit exceptional path: Carson proves the baseline failure, keeps every other gate intact, records an audit event, and never teaches operators to step outside Carson first.
|
|
63
70
|
|
|
64
|
-
`carson worktree list` is the visibility surface for cleanup: it shows every registered worktree, the branch, PR state, whether the content is already on `main`, and Carson's keep or reap recommendation. When work needs to be abandoned instead of landed, use `carson abandon <pr-number|pr-url|branch>` to close the PR and clean up the branch/worktree safely.
|
|
71
|
+
`carson worktree list` is the visibility surface for cleanup: it shows every registered worktree, the branch, PR state, whether the content is already on `main`, and Carson's keep or reap recommendation. Content matching `main` is diagnostic, not standalone proof that a worktree is abandoned. `carson housekeep` is the main cleanup pass: sync main, reap worktrees with strong abandonment evidence (for example a missing directory, merged PR, or closed abandoned PR), and prune stale branches. When work needs to be abandoned instead of landed, use `carson abandon <pr-number|pr-url|branch>` to close the PR and clean up the branch/worktree safely.
|
|
65
72
|
|
|
66
73
|
## Portfolio Layer
|
|
67
74
|
|
|
@@ -73,7 +80,7 @@ carson refresh --all
|
|
|
73
80
|
carson govern --dry-run
|
|
74
81
|
```
|
|
75
82
|
|
|
76
|
-
`carson govern` is the portfolio layer. It
|
|
83
|
+
`carson govern` is the portfolio layer. It assesses active deliveries across governed repositories, integrates ready branches, dispatches revisions for blocked work, and escalates what still needs human judgement. Governed integration is squash-only and happens one repository at a time.
|
|
77
84
|
|
|
78
85
|
## Where to Read Next
|
|
79
86
|
|
data/RELEASE.md
CHANGED
|
@@ -5,6 +5,30 @@ Release-note scope rule:
|
|
|
5
5
|
- `RELEASE.md` records only version deltas, breaking changes, and migration actions.
|
|
6
6
|
- Operational usage guides live in `MANUAL.md` and `API.md`.
|
|
7
7
|
|
|
8
|
+
## 3.28.0
|
|
9
|
+
|
|
10
|
+
### What changed
|
|
11
|
+
|
|
12
|
+
- **Merge proof is now a first-class delivery surface** — Carson now proves whether a delivered branch's content is already on `main`, even after squash or rewritten history. `carson status` reports the current branch's last observed PR state and merge proof when Carson is tracking that branch, while `carson deliver` and live `carson govern` integrations report the same proof immediately after landing.
|
|
13
|
+
- **Delivery state now preserves PR telemetry and proof for machine consumers** — the JSON ledger stores the last observed PR state, draft flag, merged timestamp, and merge-proof payload so Carson can report stable `pull_request` and `merge_proof` objects without re-querying GitHub on every status read.
|
|
14
|
+
- **Delivery and worktree safety are harder to break** — sync now refuses to proceed from a detached main worktree, worktree lifecycle guards catch more partial-state failures, and govern/deliver reporting stays consistent when mergeability, freshness, and follow-up paths change underneath the branch.
|
|
15
|
+
|
|
16
|
+
### No migration required
|
|
17
|
+
|
|
18
|
+
- Existing workflows continue to work unchanged. Machine consumers may now see additive `merge_proof` and current-branch `pull_request` data in Carson JSON output.
|
|
19
|
+
|
|
20
|
+
## 3.27.1
|
|
21
|
+
|
|
22
|
+
### What changed
|
|
23
|
+
|
|
24
|
+
- **JSON ledger preserves legacy state and FIFO ordering** — legacy SQLite ledgers now import automatically into the JSON store on first read, same branch/head deliveries collapse across repo-path aliases, and queue order stays first-in-first-out even when multiple deliveries share the same timestamp.
|
|
25
|
+
- **sqlite3 support restored for migration** — `carson.gemspec` depends on `sqlite3` again so Carson can import legacy SQLite ledgers, and CI installs the gem before running unit tests.
|
|
26
|
+
- **Script Ruby guards now follow the gem contract** — `script/ci_smoke.sh` and `script/install_global_carson.sh` read the minimum supported Ruby version from `carson.gemspec` instead of hard-coding it, so smoke checks and installer behaviour stay aligned with the published gem.
|
|
27
|
+
|
|
28
|
+
### Migration
|
|
29
|
+
|
|
30
|
+
- Existing SQLite ledgers are imported automatically on first read. Explicit legacy `.sqlite3` paths keep working after import.
|
|
31
|
+
|
|
8
32
|
## 3.27.0
|
|
9
33
|
|
|
10
34
|
### What changed
|
|
@@ -27,7 +51,9 @@ Release-note scope rule:
|
|
|
27
51
|
- **Govern now finds worktree-created deliveries** — `repository_record` stored the worktree CWD as `repo_path` in the ledger, but `govern` looked up deliveries by the main tree path from config. The SQL query never matched, so `carson govern` always reported "no active deliveries" for worktree-created PRs. Now `repository_record` uses `main_worktree_root` so the ledger key is always the canonical main tree path. Also fixed the govern fallback path, `reconcile_delivery!`, `housekeep_repo!`, and `review_evidence` for the same mismatch.
|
|
28
52
|
- **Status shows canonical repository name** — `carson status` from a worktree displayed the worktree folder name (e.g. `feature-branch`) as `Repository:` instead of the actual repository name. Now correctly shows the canonical name.
|
|
29
53
|
|
|
30
|
-
###
|
|
54
|
+
### Migration note
|
|
55
|
+
|
|
56
|
+
- Existing SQLite ledgers are imported automatically on first read. No manual cleanup is required before upgrading.
|
|
31
57
|
|
|
32
58
|
## 3.23.3
|
|
33
59
|
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
3.
|
|
1
|
+
3.28.0
|
data/carson.gemspec
CHANGED
|
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
|
|
|
28
28
|
spec.bindir = "exe"
|
|
29
29
|
spec.executables = [ "carson" ]
|
|
30
30
|
spec.require_paths = [ "lib" ]
|
|
31
|
+
spec.add_dependency "sqlite3", ">= 1.3", "< 3"
|
|
31
32
|
spec.files = Dir.glob( "{lib,exe,templates,hooks}/**/*", File::FNM_DOTMATCH ).select { |path| File.file?( path ) } + [
|
|
32
33
|
".github/workflows/carson_policy.yml",
|
|
33
34
|
"README.md",
|
data/lib/carson/delivery.rb
CHANGED
|
@@ -8,13 +8,16 @@ module Carson
|
|
|
8
8
|
|
|
9
9
|
attr_reader :repo_path, :repository, :branch, :head, :worktree_path, :status,
|
|
10
10
|
:pull_request_number, :pull_request_url, :revisions, :cause, :summary,
|
|
11
|
-
:created_at, :updated_at, :integrated_at, :superseded_at
|
|
11
|
+
:created_at, :updated_at, :integrated_at, :superseded_at,
|
|
12
|
+
:pull_request_state, :pull_request_draft, :pull_request_merged_at, :merge_proof
|
|
12
13
|
|
|
13
14
|
def initialize(
|
|
14
15
|
repo_path:, branch:, head:, worktree_path:, status:,
|
|
15
16
|
pull_request_number:, pull_request_url:, cause:, summary:,
|
|
16
17
|
created_at:, updated_at:, integrated_at:, superseded_at:,
|
|
17
|
-
revisions: [], repository: nil
|
|
18
|
+
revisions: [], repository: nil,
|
|
19
|
+
pull_request_state: nil, pull_request_draft: nil, pull_request_merged_at: nil,
|
|
20
|
+
merge_proof: nil
|
|
18
21
|
)
|
|
19
22
|
@repo_path = repo_path
|
|
20
23
|
@repository = repository
|
|
@@ -31,6 +34,10 @@ module Carson
|
|
|
31
34
|
@updated_at = updated_at
|
|
32
35
|
@integrated_at = integrated_at
|
|
33
36
|
@superseded_at = superseded_at
|
|
37
|
+
@pull_request_state = pull_request_state
|
|
38
|
+
@pull_request_draft = pull_request_draft
|
|
39
|
+
@pull_request_merged_at = pull_request_merged_at
|
|
40
|
+
@merge_proof = merge_proof
|
|
34
41
|
end
|
|
35
42
|
|
|
36
43
|
def key
|