@tablation/crew 0.15.0 → 0.17.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tablation/crew",
3
- "version": "0.15.0",
3
+ "version": "0.17.0",
4
4
  "description": "A standing team of headless agents that picks work off a Tablation board, does it on a machine you control, and reports back.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -379,6 +379,17 @@ if `report_type` is either of those.
379
379
  not from this checkout's working
380
380
  state, is deliberate: the primary checkout may have anything going on.
381
381
  `cd` into the worktree and do everything else below there.
382
+ **`crew worktree <number>` does all of this for you and is the preferred
383
+ route** — it prints the worktree's path on stdout. It cuts from
384
+ `<remote>/<branch>` when the branch is already pushed (another ship built
385
+ it, or an earlier run of yours), fresh from `<remote>/<base>` when no
386
+ branch exists anywhere, fast-forwards a clean stale worktree at the same
387
+ path, and re-cuts one whose branch is gone from the remote and which holds
388
+ no work of its own. It exits 1 and leaves the directory alone when that
389
+ worktree has uncommitted changes or commits that are not on the remote
390
+ (someone may be editing it by hand) — say so in a ticket comment and carry
391
+ on from a fresh worktree path only if a person says so. **A missing
392
+ worktree is never a reason to stop.**
382
393
  2. A worktree is a clean checkout, so it is missing exactly the files git
383
394
  ignores — which are usually the ones without which nothing runs. Copy the
384
395
  files the Environment section lists across from the primary checkout, then
@@ -556,11 +567,23 @@ if `report_type` is either of those.
556
567
  `in_progress` and the next `fixed` push again — a plain fast-forward, never
557
568
  `--force`; if the push is rejected, someone else moved the branch, so stop
558
569
  and say so on the ticket instead of forcing it.
559
- Leave the worktree and branch exactly where they are, unmerged: QA boots
560
- *your worktree* on its derived ports to test the fix, so removing it
561
- would leave QA nothing to test. Your last progress comment is what QA
562
- reads first — say what you changed, how you verified it, which ports and
563
- database the worktree uses, and anything you could not test yourself.
570
+ The runner checks this when your session ends: if the ticket is at `fixed`
571
+ and `<remote>/<branch>` is missing or not at your worktree's HEAD, it sets
572
+ the ticket back to `in_progress` (still yours) with an event saying what it
573
+ found, and QA never sees it. When it matches, the runner records
574
+ `pushed <sha> to <remote>/<branch>` on the ticket itself; you still state the
575
+ sha in your last progress comment.
576
+ **Your worktree is yours for this run only, and the branch on the remote is
577
+ what QA tests.** Leave the branch exactly where it is, unmerged, and do not
578
+ remove the worktree by hand: when your session ends at a verified push the
579
+ runner removes it (nothing on this ship's disk is needed again). The one
580
+ exception is a repo that declares a `handoff` hook — there the worktree is
581
+ kept, because a server you left running serves from it; the runner records
582
+ that on the ticket, and QA on another ship cuts its own worktree from the
583
+ remote instead. Your last progress comment is what QA reads first — say what
584
+ you changed, how you verified it, which ports and database you used, and
585
+ anything you could not test yourself. A later run, on any ship, starts from
586
+ `<remote>/<branch>`, so anything not committed and pushed is gone.
564
587
 
565
588
  ## Question and Investigation tickets
566
589
 
@@ -56,12 +56,23 @@ human review, so "probably fine" is not a pass.
56
56
  Does the change actually do what the comment claims? Does it handle the
57
57
  empty/error/permission path, or only the happy one? Does it touch
58
58
  anything the ticket never mentioned?
59
+ **You never need the builder's worktree.** Cut your own from the remote
60
+ branch with `crew worktree <number>` (prints its path) — unless the builder's
61
+ hand-off event says its ship kept a worktree and a server for you, in which
62
+ case you may open that URL instead. Remove yours when you hand the ticket on.
59
63
  **A branch on the remote is testable.** The builder may be on another ship:
60
64
  the digest's `branch` column then reads `<name> (on origin only)` and no
61
65
  worktree exists here yet. Cut one from the remote branch —
62
66
  `git worktree add <the digest's worktree> <name>` from the ticket's repo
63
67
  checkout (git creates the local tracking branch) — and carry on. Only
64
68
  **MISSING** (gone locally and on the remote) means there is nothing to test.
69
+ **Name the sha you test.** Your starting comment states the
70
+ `<remote>/<branch>` tip you fetched. The runner records the pushed tip as an
71
+ event comment on the ticket, `pushed <sha> to <remote>/<branch>`; if the tip
72
+ you fetched differs from the latest such event, say so in that same comment
73
+ and verify the remote tip anyway — the remote is the only git truth, and the
74
+ difference is information, not a reason to refuse. If the branch is not on
75
+ the remote at all, bounce the ticket to `in_progress` with that reason.
65
76
  5. **Run it.** The builder left its worktree in place for you: `cd` into it,
66
77
  `nvm use` if the repository pins a version, and `eval` the **`ports`** hook
67
78
  for this worktree's own ports (anything already listening on them is a dead
@@ -120,7 +131,12 @@ human review, so "probably fine" is not a pass.
120
131
  write itself conditional on the `updated_at` you just read, with an
121
132
  `X-Expected-Updated-At` header; a 409 means the same thing.
122
133
 
123
- - **It holds up** → `status` = `verified`, and clear `assignee_id`. That
134
+ - **It holds up** → `status` = `verified`, and clear `assignee_id`. When
135
+ the Issues table has a `verified_sha` column, set it in the same write to
136
+ the full sha of the branch head you tested (`git rev-parse HEAD` in the
137
+ worktree): for a repo that hands work to human review, the crew compares
138
+ the branch against it every cycle and sends the ticket back to you if a
139
+ reviewer's commit moves it. That
124
140
  is the merge trigger: the release phase will squash-merge the branch,
125
141
  bump the version, and deploy this cycle or the next. Say in
126
142
  the comment what you exercised, so the record shows what "verified"
@@ -361,6 +361,17 @@ if `report_type` is either of those.
361
361
  not from this checkout's working
362
362
  state, is deliberate: the primary checkout may have anything going on.
363
363
  `cd` into the worktree and do everything else below there.
364
+ **`crew worktree <number>` does all of this for you and is the preferred
365
+ route** — it prints the worktree's path on stdout. It cuts from
366
+ `<remote>/<branch>` when the branch is already pushed (another ship built
367
+ it, or an earlier run of yours), fresh from `<remote>/<base>` when no
368
+ branch exists anywhere, fast-forwards a clean stale worktree at the same
369
+ path, and re-cuts one whose branch is gone from the remote and which holds
370
+ no work of its own. It exits 1 and leaves the directory alone when that
371
+ worktree has uncommitted changes or commits that are not on the remote
372
+ (someone may be editing it by hand) — say so in a ticket comment and carry
373
+ on from a fresh worktree path only if a person says so. **A missing
374
+ worktree is never a reason to stop.**
364
375
  2. A worktree is a clean checkout, so it is missing exactly the files git
365
376
  ignores — which are usually the ones without which nothing runs. Copy the
366
377
  files the Environment section lists across from the primary checkout, then
@@ -538,11 +549,23 @@ if `report_type` is either of those.
538
549
  `in_progress` and the next `fixed` push again — a plain fast-forward, never
539
550
  `--force`; if the push is rejected, someone else moved the branch, so stop
540
551
  and say so on the ticket instead of forcing it.
541
- Leave the worktree and branch exactly where they are, unmerged: QA boots
542
- *your worktree* on its derived ports to test the fix, so removing it
543
- would leave QA nothing to test. Your last progress comment is what QA
544
- reads first — say what you changed, how you verified it, which ports and
545
- database the worktree uses, and anything you could not test yourself.
552
+ The runner checks this when your session ends: if the ticket is at `fixed`
553
+ and `<remote>/<branch>` is missing or not at your worktree's HEAD, it sets
554
+ the ticket back to `in_progress` (still yours) with an event saying what it
555
+ found, and QA never sees it. When it matches, the runner records
556
+ `pushed <sha> to <remote>/<branch>` on the ticket itself; you still state the
557
+ sha in your last progress comment.
558
+ **Your worktree is yours for this run only, and the branch on the remote is
559
+ what QA tests.** Leave the branch exactly where it is, unmerged, and do not
560
+ remove the worktree by hand: when your session ends at a verified push the
561
+ runner removes it (nothing on this ship's disk is needed again). The one
562
+ exception is a repo that declares a `handoff` hook — there the worktree is
563
+ kept, because a server you left running serves from it; the runner records
564
+ that on the ticket, and QA on another ship cuts its own worktree from the
565
+ remote instead. Your last progress comment is what QA reads first — say what
566
+ you changed, how you verified it, which ports and database you used, and
567
+ anything you could not test yourself. A later run, on any ship, starts from
568
+ `<remote>/<branch>`, so anything not committed and pushed is gone.
546
569
 
547
570
  ## Question and Investigation tickets
548
571
 
@@ -54,6 +54,13 @@ human review, so "probably fine" is not a pass.
54
54
  Does the change actually do what the comment claims? Does it handle the
55
55
  empty/error/permission path, or only the happy one? Does it touch
56
56
  anything the ticket never mentioned?
57
+ **Name the sha you test.** Your starting comment states the
58
+ `<remote>/<branch>` tip you fetched. The runner records the pushed tip as an
59
+ event comment on the ticket, `pushed <sha> to <remote>/<branch>`; if the tip
60
+ you fetched differs from the latest such event, say so in that same comment
61
+ and verify the remote tip anyway — the remote is the only git truth, and the
62
+ difference is information, not a reason to refuse. If the branch is not on
63
+ the remote at all, bounce the ticket to `in_progress` with that reason.
57
64
  5. **Run it.** The builder left its worktree in place for you: `cd` into it,
58
65
  `nvm use` if the repository pins a version, and `eval` the **`ports`** hook
59
66
  for this worktree's own ports (anything already listening on them is a dead
@@ -111,7 +118,12 @@ human review, so "probably fine" is not a pass.
111
118
  write itself conditional on the `updated_at` you just read, with an
112
119
  `X-Expected-Updated-At` header; a 409 means the same thing.
113
120
 
114
- - **It holds up** → `status` = `verified`, and clear `assignee_id`. That
121
+ - **It holds up** → `status` = `verified`, and clear `assignee_id`. When
122
+ the Issues table has a `verified_sha` column, set it in the same write to
123
+ the full sha of the branch head you tested (`git rev-parse HEAD` in the
124
+ worktree): for a repo that hands work to human review, the crew compares
125
+ the branch against it every cycle and sends the ticket back to you if a
126
+ reviewer's commit moves it. That
115
127
  is the merge trigger: the release phase will squash-merge the branch,
116
128
  bump the version, and deploy this cycle or the next. Say in
117
129
  the comment what you exercised, so the record shows what "verified"