Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

## Unreleased

- `jam`, `jam-to-tasks`, `jam-to-ticket` and `jam-proof-table` handle screenshot, replay and silent Jams, and Jams that raise several problems: the router reads the transcript and a silent Jam's description, a task cites its field when there is no timestamp, a screenshot counts as proof, and an existing ticket covers only its own problem.
- Added `jam`: type `/jam` and what you want, and it routes to the matching Jam skill. It also catches a bare jam.dev link or a vague ask, reads the Jam, and routes by what it holds; a clear ask still goes straight to its own skill.
- The README lists skills as one bulleted list instead of a table plus a section per skill. `scripts/check.mjs` checks for the list entry.
- The skills no longer download and run an installer. If `jam` is missing, they ask you to install it from jam.dev/cli. Addresses the remote-code-execution audit finding on `jam-proof` and `jam-annotate`.
Expand Down
19 changes: 15 additions & 4 deletions skills/jam-proof-table/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,12 +79,23 @@ the oldest.

```bash
jam get jam "$ID" --json # reads back, type, duration
jam get frames "$ID" --at 48000 --size medium --out "$(mktemp -d)" # outside the repo
```

Open the frame at the moment the claim shows up; `--at` must be below the
Jam's `duration`. A blank page, a single frozen frame, or the wrong tab is
not proof. Record it again with `jam-proof` and say that you did.
Then check it by its `type`; the other types have no video frames:

```bash
jam get frames "$ID" --at 48000 --size medium --out "$(mktemp -d)" # video; outside the repo
jam get screenshots "$ID" --out "$(mktemp -d)" # screenshot
Comment thread
baransu marked this conversation as resolved.
```

A replay has no frames or screenshots: check it in its events, console and
network, and mark the row unconfirmed when they cannot settle the claim.

For a video, open the frame at the moment the claim shows up; `--at` must be
below the Jam's `duration`. A blank page, a single frozen frame, or the wrong
tab is not proof. A screenshot is one still image by design: it is proof when
the claim is visible in it. When the Jam does not show the claim, record it
again with `jam-proof` and say that you did.

Some claims happen off screen: an API status, a count, a sent message. Check
those in `jam get network`, `jam get console` or `jam get user-events`, and
Expand Down
16 changes: 12 additions & 4 deletions skills/jam-to-tasks/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ the mic off, that answer is final.

## 2. Read the whole transcript

Only a video with the mic on has one. Otherwise skip to step 3 and take the
asks from the title, description and comments.
Comment thread
baransu marked this conversation as resolved.
Comment thread
baransu marked this conversation as resolved.

```bash
jam get transcript "$ID" --json # WebVTT in the "transcript" field
```
Expand All @@ -70,8 +73,9 @@ trailing silence ("Thank you.") is transcription noise, not an ask.
Open a task each time the person raises something: a bug, wrong data, a
visual nit, a behavior change, a feature request. All count. Give each one:

- an id (`T1`, `T2`, ...) and its start time
- the verbatim quote
- an id (`T1`, `T2`, ...) and where it came from: its start time in the
narration, or the field (title, description, a comment) of a silent Jam
- the verbatim quote, from that source
- a type: bug, visual, behavior, feature, reference

## 4. Resolve every "this"
Expand All @@ -87,6 +91,9 @@ jam get frames "$ID" --overview --size medium --out "$FRAMES"
jam get frames "$ID" --at 14220,18720,46140 --size medium --out "$FRAMES"
```

A screenshot Jam has no frames: open `jam get screenshots "$ID" --out
"$FRAMES"` instead. A replay has neither; use its user events.

Open every frame. The cursor is often the only clue to what "here" means.
When no cursor shows, or the frame is blurred mid-scroll, pull one 500 ms
later. Re-pull at `--size large` when UI text is too small to read. Sample
Expand Down Expand Up @@ -133,8 +140,9 @@ and then in small units, not one large commit.

## 7. Check coverage and close

Re-read the transcript top to bottom. Every sentence that asks for something
maps to a task id. Then give every id an outcome: done (with files),
Re-read the transcript top to bottom, or with no narration the title,
description and comments. Every sentence that asks for something maps to a
task id. Then give every id an outcome: done (with files),
deferred (with the reason), needs an answer, or could not reproduce. Write
the totals: "11 asks: 9 done, 1 deferred, 1 needs an answer."

Expand Down
10 changes: 7 additions & 3 deletions skills/jam-to-ticket/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,13 @@ jam get jam "$ID" --json
it, each with `id` and `url`. Then search the tracker for the Jam's id and
full URL, then for two or three words from its title. Tracker search is
fuzzy and returns near misses: a match is a ticket whose body or
attachments hold this Jam's id. On a match, return that ticket and stop.
That also answers "was this Jam ever ticketed?". Add the new Jam to the
existing ticket only when the user asks.
attachments hold this Jam's id.

"Was this Jam ever ticketed?" is read-only: return the matches and stop.
Otherwise keep the matches and read on. A match covers only the problems its
ticket describes, so a Jam that raises several problems (step 4) still needs
tickets for the rest. When every problem is covered, return those tickets and
stop. Add the new Jam to an existing ticket only when the user asks.
Comment thread
baransu marked this conversation as resolved.

## 3. Read the Jam

Expand Down
11 changes: 8 additions & 3 deletions skills/jam/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,14 @@ the order asked, and pass what the first one found to the next.
## A Jam link with no clear ask

Read the Jam's details first: the `getDetails` MCP tool, or
`jam get jam <id> --json`. Then route by what it holds:

- A narrated walkthrough that asks for several changes: `jam-to-tasks`.
`jam get jam <id> --json`. For a video with the mic on (`micEnabled`), read
the transcript too (`getVideoTranscript`, or `jam get transcript <id> --json`):
the spoken asks are there, and a title like "Feedback" says nothing about
them. If captions are not ready, wait a minute and retry once, then route on
the details and say so. Then route by what it holds:

- Several changes asked for, in the narration or in the title, description
or comments of a silent Jam: `jam-to-tasks`.
- One bug, an error, or a failed request: `jam-fix`. It diagnoses without
changing code, so it is the safe default.
- Neither is clear: ask one question that names the options in plain words
Expand Down
Loading