@tablation/crew 0.41.0 → 0.43.1
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/dist/cli.js +454 -263
- package/package.json +1 -1
- package/prompts/default/personas/lane-qa.md +6 -3
- package/prompts/default/skills/crew-lane-agent.md +21 -8
- package/prompts/default/skills/ticket-attachments.md +14 -8
- package/prompts/dev-qa/personas/lane-qa.md +6 -3
- package/prompts/dev-qa/skills/crew-lane-agent.md +21 -8
- package/prompts/dev-qa/skills/ticket-attachments.md +14 -8
package/package.json
CHANGED
|
@@ -47,9 +47,12 @@ pass.
|
|
|
47
47
|
builder's closing comment — what it changed, how it says it verified,
|
|
48
48
|
what it admits it could not test — is the thing you are checking.
|
|
49
49
|
Anything it skipped is your first test. **Open the ticket's own
|
|
50
|
-
attachments first
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
attachments first**, exactly as Step 3.4 in the shared policy says: read
|
|
51
|
+
the Media Library record for its `storage_key`, then fetch
|
|
52
|
+
`files/<storage_key>` — never a guessed `files/<id>` path. The reporter's
|
|
53
|
+
screenshot is the repro you are judging the fix against. If you cannot
|
|
54
|
+
open one, say so with the exact request and response and set `needs_info`
|
|
55
|
+
rather than passing it.
|
|
53
56
|
4. **Get the branch and read the diff.** The branch on the remote is what
|
|
54
57
|
you test, and you never need the builder's worktree: cut your own with
|
|
55
58
|
`crew worktree <number>` (it prints the path), unless the builder's
|
|
@@ -183,13 +183,17 @@ should is Step 1's call, not a filesystem check.
|
|
|
183
183
|
and then it is a stop for a person (see "Stopping"), never a bare comment.
|
|
184
184
|
- Otherwise pick from the digest's "Step 2" table, which is already
|
|
185
185
|
`accepted`, in your lane and in order. Absent a digest, fetch those tickets
|
|
186
|
-
and order them by **effective priority, then severity, then `issue_id`**:
|
|
186
|
+
and order them by **effective priority, then manual position, then severity, then `issue_id`**:
|
|
187
187
|
- **Effective priority** is the stronger of the ticket's own `priority`
|
|
188
188
|
and one derived from `severity` (`s1`→p0, `s2`→p1, `s3`→p2, `s4`→p3;
|
|
189
189
|
neither set → p2). p0 beats p1 beats p2 beats p3, so an explicit
|
|
190
190
|
priority can only move a ticket *forward*. Priority is an escalation
|
|
191
191
|
lever; to rank something down, lower its severity.
|
|
192
|
-
- Within one tier,
|
|
192
|
+
- Within one tier, a ticket with a manual **`position`** (a lower number
|
|
193
|
+
is earlier) goes before one without; position only orders tickets of the
|
|
194
|
+
same effective priority and never lets a lower tier jump a higher one. A
|
|
195
|
+
workspace with no position column skips this clause.
|
|
196
|
+
- Then more severe first (`s1` … `s4`, then unset).
|
|
193
197
|
- Within one severity, a ticket whose **epic is already in progress** goes
|
|
194
198
|
first (finishing beats starting); a `planned` epic or none ranks the
|
|
195
199
|
same. Only then oldest `issue_id` first.
|
|
@@ -280,12 +284,21 @@ before going further, and never change a ticket's `report_type` yourself.
|
|
|
280
284
|
4. **Post a short comment** on what you are about to do (Comments table:
|
|
281
285
|
`ticket_id`, `team_member_id` = your id, markdown `body`), and further
|
|
282
286
|
comments at meaningful milestones — the operator wants visible progress,
|
|
283
|
-
not just status flips. **Open the ticket's attachments before you start
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
`
|
|
288
|
-
|
|
287
|
+
not just status flips. **Open the ticket's attachments before you start.**
|
|
288
|
+
An `attachments` value on the ticket or a comment is a list of Media
|
|
289
|
+
Library record ids — not file ids and not URLs, so no `files/<id>` path
|
|
290
|
+
will ever work. For each id: (1) read the Media Library record,
|
|
291
|
+
`GET /api/workspaces/<workspaceId>/data-models/<Media Library id>/records/<id>`
|
|
292
|
+
(the Environment section's "Opening a ticket's attachments" gives the
|
|
293
|
+
table id), and take its `storage_key`; (2) fetch the bytes with
|
|
294
|
+
`GET /api/workspaces/<workspaceId>/files/<storage_key>` (the MCP form is
|
|
295
|
+
`files_controller_download` with `uuid` and `filename` being the two
|
|
296
|
+
halves of the storage key) into a scratch directory and open it; (3)
|
|
297
|
+
compare it with the description — where they disagree, the picture is the
|
|
298
|
+
reproduction. If you cannot open one, that is a blocker (comment naming
|
|
299
|
+
it and the exact failure, `needs_info` plus `needs_planning`, stop); never
|
|
300
|
+
proceed on the prose alone. The `Ticket Attachments` skill has the edge
|
|
301
|
+
cases.
|
|
289
302
|
5. **Implement the fix.** Read the relevant code first; do not guess at the
|
|
290
303
|
architecture. **Never bump the version or edit the changelog on this
|
|
291
304
|
branch** — the release phase assigns the version once per release, over
|
|
@@ -12,14 +12,20 @@ you picked up, and on any comment that has them, before you start.
|
|
|
12
12
|
|
|
13
13
|
1. **Read the Media Library record for that id.** The `attachments` column is
|
|
14
14
|
a reference into the workspace's Media Library table; its `storage_key`
|
|
15
|
-
and `mime_type` are what you need
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
is
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
and `mime_type` are what you need:
|
|
16
|
+
`GET /api/workspaces/<workspaceId>/data-models/<Media Library id>/records/<id>`
|
|
17
|
+
(MCP: `records_controller_find_one`). The Environment section's "Opening
|
|
18
|
+
a ticket's attachments" names the table id; if it is absent, find the
|
|
19
|
+
table by name in a workspace-level model listing — never by reading the
|
|
20
|
+
whole Issues model definition, which is over a megabyte. The id is a
|
|
21
|
+
record id, not a file id: `files/<id>`, `files/<id>/download` and
|
|
22
|
+
`media-library/<id>/...` all 404 by design.
|
|
23
|
+
2. **Fetch the bytes:** the `storage_key` has the form `<uuid>/<filename>`;
|
|
24
|
+
`GET /api/workspaces/<workspaceId>/files/<uuid>/<filename>` with the usual
|
|
25
|
+
headers streams it (the MCP form is `files_controller_download` with
|
|
26
|
+
`workspaceId`, `uuid` and `filename`, which hands an image back as a
|
|
27
|
+
viewable block). Save the file in a scratch directory outside the
|
|
28
|
+
repository, then open it.
|
|
23
29
|
3. **Compare what the picture shows with what the description says.** Where
|
|
24
30
|
they disagree, the picture is the reproduction.
|
|
25
31
|
|
|
@@ -46,9 +46,12 @@ pass.
|
|
|
46
46
|
builder's closing comment — what it changed, how it says it verified,
|
|
47
47
|
what it admits it could not test — is the thing you are checking.
|
|
48
48
|
Anything it skipped is your first test. **Open the ticket's own
|
|
49
|
-
attachments first
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
attachments first**, exactly as Step 3.4 in the shared policy says: read
|
|
50
|
+
the Media Library record for its `storage_key`, then fetch
|
|
51
|
+
`files/<storage_key>` — never a guessed `files/<id>` path. The reporter's
|
|
52
|
+
screenshot is the repro you are judging the fix against. If you cannot
|
|
53
|
+
open one, say so with the exact request and response and set `needs_info`
|
|
54
|
+
rather than passing it.
|
|
52
55
|
4. **Get the branch and read the diff.** The branch on the remote is what
|
|
53
56
|
you test, and you never need the builder's worktree: cut your own with
|
|
54
57
|
`crew worktree <number>` (it prints the path), unless the builder's
|
|
@@ -183,13 +183,17 @@ should is Step 1's call, not a filesystem check.
|
|
|
183
183
|
and then it is a stop for a person (see "Stopping"), never a bare comment.
|
|
184
184
|
- Otherwise pick from the digest's "Step 2" table, which is already
|
|
185
185
|
`accepted`, in your lane and in order. Absent a digest, fetch those tickets
|
|
186
|
-
and order them by **effective priority, then severity, then `issue_id`**:
|
|
186
|
+
and order them by **effective priority, then manual position, then severity, then `issue_id`**:
|
|
187
187
|
- **Effective priority** is the stronger of the ticket's own `priority`
|
|
188
188
|
and one derived from `severity` (`s1`→p0, `s2`→p1, `s3`→p2, `s4`→p3;
|
|
189
189
|
neither set → p2). p0 beats p1 beats p2 beats p3, so an explicit
|
|
190
190
|
priority can only move a ticket *forward*. Priority is an escalation
|
|
191
191
|
lever; to rank something down, lower its severity.
|
|
192
|
-
- Within one tier,
|
|
192
|
+
- Within one tier, a ticket with a manual **`position`** (a lower number
|
|
193
|
+
is earlier) goes before one without; position only orders tickets of the
|
|
194
|
+
same effective priority and never lets a lower tier jump a higher one. A
|
|
195
|
+
workspace with no position column skips this clause.
|
|
196
|
+
- Then more severe first (`s1` … `s4`, then unset).
|
|
193
197
|
- Within one severity, a ticket whose **epic is already in progress** goes
|
|
194
198
|
first (finishing beats starting); a `planned` epic or none ranks the
|
|
195
199
|
same. Only then oldest `issue_id` first.
|
|
@@ -280,12 +284,21 @@ before going further, and never change a ticket's `report_type` yourself.
|
|
|
280
284
|
4. **Post a short comment** on what you are about to do (Comments table:
|
|
281
285
|
`ticket_id`, `team_member_id` = your id, markdown `body`), and further
|
|
282
286
|
comments at meaningful milestones — the operator wants visible progress,
|
|
283
|
-
not just status flips. **Open the ticket's attachments before you start
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
`
|
|
288
|
-
|
|
287
|
+
not just status flips. **Open the ticket's attachments before you start.**
|
|
288
|
+
An `attachments` value on the ticket or a comment is a list of Media
|
|
289
|
+
Library record ids — not file ids and not URLs, so no `files/<id>` path
|
|
290
|
+
will ever work. For each id: (1) read the Media Library record,
|
|
291
|
+
`GET /api/workspaces/<workspaceId>/data-models/<Media Library id>/records/<id>`
|
|
292
|
+
(the Environment section's "Opening a ticket's attachments" gives the
|
|
293
|
+
table id), and take its `storage_key`; (2) fetch the bytes with
|
|
294
|
+
`GET /api/workspaces/<workspaceId>/files/<storage_key>` (the MCP form is
|
|
295
|
+
`files_controller_download` with `uuid` and `filename` being the two
|
|
296
|
+
halves of the storage key) into a scratch directory and open it; (3)
|
|
297
|
+
compare it with the description — where they disagree, the picture is the
|
|
298
|
+
reproduction. If you cannot open one, that is a blocker (comment naming
|
|
299
|
+
it and the exact failure, `needs_info` plus `needs_planning`, stop); never
|
|
300
|
+
proceed on the prose alone. The `Ticket Attachments` skill has the edge
|
|
301
|
+
cases.
|
|
289
302
|
5. **Implement the fix.** Read the relevant code first; do not guess at the
|
|
290
303
|
architecture. **Never bump the version or edit the changelog on this
|
|
291
304
|
branch** — the release phase assigns the version once per release, over
|
|
@@ -12,14 +12,20 @@ you picked up, and on any comment that has them, before you start.
|
|
|
12
12
|
|
|
13
13
|
1. **Read the Media Library record for that id.** The `attachments` column is
|
|
14
14
|
a reference into the workspace's Media Library table; its `storage_key`
|
|
15
|
-
and `mime_type` are what you need
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
is
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
and `mime_type` are what you need:
|
|
16
|
+
`GET /api/workspaces/<workspaceId>/data-models/<Media Library id>/records/<id>`
|
|
17
|
+
(MCP: `records_controller_find_one`). The Environment section's "Opening
|
|
18
|
+
a ticket's attachments" names the table id; if it is absent, find the
|
|
19
|
+
table by name in a workspace-level model listing — never by reading the
|
|
20
|
+
whole Issues model definition, which is over a megabyte. The id is a
|
|
21
|
+
record id, not a file id: `files/<id>`, `files/<id>/download` and
|
|
22
|
+
`media-library/<id>/...` all 404 by design.
|
|
23
|
+
2. **Fetch the bytes:** the `storage_key` has the form `<uuid>/<filename>`;
|
|
24
|
+
`GET /api/workspaces/<workspaceId>/files/<uuid>/<filename>` with the usual
|
|
25
|
+
headers streams it (the MCP form is `files_controller_download` with
|
|
26
|
+
`workspaceId`, `uuid` and `filename`, which hands an image back as a
|
|
27
|
+
viewable block). Save the file in a scratch directory outside the
|
|
28
|
+
repository, then open it.
|
|
23
29
|
3. **Compare what the picture shows with what the description says.** Where
|
|
24
30
|
they disagree, the picture is the reproduction.
|
|
25
31
|
|