164 lines
8.5 KiB
Markdown
164 lines
8.5 KiB
Markdown
# PR#98: The Session of Each Pull Request, by Its URL in the Transcripts
|
|
|
|
Version: minor
|
|
|
|
> **WARNING:** This document describes only the change applied in this PR.
|
|
> It may already be outdated once the next PR is merged.
|
|
> Historic PR documentation is not maintained along with new PRs; treat it as a snapshot.
|
|
|
|
## Related Links
|
|
|
|
- [werkregie PR#74](https://git.javagil.de/mi/werkregie/pulls/74): the author session of a stuck pull request, by its branch.
|
|
- [werkrevisor PR#126](https://git.javagil.de/mi/werkrevisor/pulls/126): the case of a session in a checkout of werkdock
|
|
that opened a pull request of werkrevisor.
|
|
|
|
## Problem
|
|
|
|
The user runs many Claude Code sessions, and they open pull requests in several repositories.
|
|
To continue the work on a pull request, the user searches for its session.
|
|
|
|
werkregie shows the session only for a stuck pull request, and finds it by the last branch of its transcript
|
|
in a checkout of the same repository.
|
|
It does not find a session in a checkout of another repository, nor one that moved on to another branch.
|
|
|
|
## Non-Goals
|
|
|
|
- No session of a machine without a relay.
|
|
- No change of "Agent arbeitet": it keeps the match by branch.
|
|
- No GitHub pull requests; werkregie reads only Gitea.
|
|
|
|
## Specification
|
|
|
|
### Feature: the session that works on a pull request
|
|
|
|
#### Scenario#98.01: each pull request shows its session
|
|
|
|
… so that the user opens the session of a pull request with one click.
|
|
|
|
- **Given** an open pull request, and a Claude Code session that named its URL
|
|
- **When** werkregie shows the pull request in the panel of the pull requests or in "Du bist dran"
|
|
- **Then** its row shows the Claude logo and the title of the session, and a click opens the session
|
|
|
|
##### Verified by
|
|
|
|
- [AuthorsTest "a pull request that is not stuck shows its session without a message"](../../dashboard/src/test/kotlin/de/hoennig/werkregie/dashboard/AuthorsTest.kt)
|
|
- [DemoTest "the demo's pull request in conflict shows its author session and the message for it"](../../dashboard/src/test/kotlin/de/hoennig/werkregie/dashboard/DemoTest.kt)
|
|
- The page: by hand, in the panel and in "Du bist dran", on a desktop and at the width of a phone;
|
|
the page has no JavaScript tests for its rows.
|
|
|
|
#### Scenario#98.02: a session in a checkout of another repository
|
|
|
|
… so that the link finds also the work across repositories.
|
|
|
|
- **Given** a session in a checkout of werkdock that opened mi/werkrevisor PR#126 and named its URL
|
|
- **When** werkregie shows mi/werkrevisor PR#126
|
|
- **Then** its row shows that session
|
|
|
|
##### Verified by
|
|
|
|
- [AuthorsTest "a session in a checkout of another repository that named the pull request shows at it, without its other pull requests"](../../dashboard/src/test/kotlin/de/hoennig/werkregie/dashboard/AuthorsTest.kt)
|
|
- [ClaudeCodeSourceTest "a session reports the pull requests it named, also without a branch, and on each fetch those it named since"](../../dashboard/src/test/kotlin/de/hoennig/werkregie/dashboard/sources/ClaudeCodeSourceTest.kt)
|
|
- [TranscriptPullsTest "a session names a pull request by its commands, by their output about it alone and by Claude's texts"](../../dashboard/src/test/kotlin/de/hoennig/werkregie/dashboard/sources/TranscriptPullsTest.kt)
|
|
|
|
#### Scenario#98.03: the URL beats the branch
|
|
|
|
… so that a session that moved on still shows at its pull request.
|
|
|
|
- **Given** a pull request, a session that named its URL, and another session whose last line is on its branch
|
|
- **When** werkregie shows the pull request
|
|
- **Then** its row shows the session that named its URL
|
|
|
|
##### Verified by
|
|
|
|
- [AuthorsTest "the session that named the pull request beats the one on its branch, and the latest mention wins"](../../dashboard/src/test/kotlin/de/hoennig/werkregie/dashboard/AuthorsTest.kt)
|
|
|
|
#### Scenario#98.04: the latest mention wins
|
|
|
|
… so that the row shows the session that worked on the pull request last.
|
|
|
|
- **Given** a pull request whose URL two sessions named
|
|
- **When** werkregie shows the pull request
|
|
- **Then** its row shows the session that named it last
|
|
|
|
##### Verified by
|
|
|
|
- [AuthorsTest "the session that named the pull request beats the one on its branch, and the latest mention wins"](../../dashboard/src/test/kotlin/de/hoennig/werkregie/dashboard/AuthorsTest.kt)
|
|
- [TranscriptPullsTest "the latest mention counts, and a command once is an action for good"](../../dashboard/src/test/kotlin/de/hoennig/werkregie/dashboard/sources/TranscriptPullsTest.kt)
|
|
|
|
#### Scenario#98.05: a session without a URL
|
|
|
|
… so that a session of an older relay still shows by its branch.
|
|
|
|
- **Given** a pull request whose URL no session named, and a session whose last line is on its branch
|
|
- **When** werkregie shows the pull request
|
|
- **Then** its row shows that session, as before
|
|
|
|
##### Verified by
|
|
|
|
- [AuthorsTest "a pull request of another host, or one without an address, shows the session of its branch"](../../dashboard/src/test/kotlin/de/hoennig/werkregie/dashboard/AuthorsTest.kt)
|
|
- [AuthorsTest "the session with the later line on the branch is the author"](../../dashboard/src/test/kotlin/de/hoennig/werkregie/dashboard/AuthorsTest.kt)
|
|
|
|
#### Scenario#98.06: a command beats a text
|
|
|
|
… so that a session that only reports on a pull request does not hide the session that works on it.
|
|
|
|
- **Given** a pull request, a session that named its URL in a shell command,
|
|
and another session that named its URL later, but only in a text
|
|
- **When** werkregie shows the pull request
|
|
- **Then** its row shows the session that named the URL in a shell command
|
|
|
|
##### Verified by
|
|
|
|
- [AuthorsTest "a session that acted on the pull request beats a later one that only wrote about it"](../../dashboard/src/test/kotlin/de/hoennig/werkregie/dashboard/AuthorsTest.kt)
|
|
- [TranscriptPullsTest "a list of pull requests, the user's texts, files, messages, thoughts, a subagent and a line without time name none"](../../dashboard/src/test/kotlin/de/hoennig/werkregie/dashboard/sources/TranscriptPullsTest.kt)
|
|
|
|
## Solution
|
|
|
|
`TranscriptPulls` reads each transcript of a session from where the last fetch stopped, by parts of 1 MiB,
|
|
and completes a line cut at the end of a part with the next part.
|
|
The first read starts 32 MiB before the end; a file shorter than the last read is read anew.
|
|
Only a line with `/pulls/` or `/issues/` is parsed.
|
|
The addresses count from Claude's texts, from shell commands, and from the output of a command if it names one pull request only.
|
|
`PullUrls.key` makes one address of `http`, `https`, Gitea's API and `/issues/`, without the scheme.
|
|
A session keeps the 20 pull requests it named last, each with the time of the latest mention and whether a command named it.
|
|
|
|
`Author` gets these as `pulls`, and `branch` may be absent, for a session outside a git checkout.
|
|
`Authors.attach` gives every pull request its session: by its address, a command before a text, then the latest mention;
|
|
else by its branch, as before.
|
|
The message stays for a stuck pull request only.
|
|
"Agent arbeitet" keeps the match by branch.
|
|
The page shows the session in each row of the panel, as "Du bist dran" does.
|
|
|
|
## Release Notes
|
|
|
|
Each pull request shows the Claude Code session that works on it; a click opens the session.
|
|
|
|
## Open Questions
|
|
|
|
- [x] Which hosts count?
|
|
Any host: the relay sends the addresses without a list of the Gitea instances,
|
|
and the server matches them with the addresses of its pull requests; an address of another host matches none.
|
|
- [x] Which mentions count?
|
|
Claude's texts, shell commands and the output of a command about one pull request.
|
|
A list of open pull requests in an output names many; the user's texts, files, messages to other sessions and thoughts
|
|
name pull requests the session does not work on, e.g. the report of a side session or the brief for it.
|
|
Claude's texts count, since a session often builds the address of Gitea's API in a shell variable.
|
|
- [x] Why does a command beat a text?
|
|
A session that started others repeats their reports with the links to their pull requests;
|
|
its text would else show it at a pull request of another session.
|
|
- [x] What does an older relay send?
|
|
No addresses: its sessions show by branch, as before.
|
|
A new relay with an older server would fail on a session without a branch; the server is deployed first, with the merge.
|
|
- [x] Does "Agent arbeitet" use the address too?
|
|
No; this PR leaves it unchanged.
|
|
|
|
## Additional Changes
|
|
|
|
- The demo shows a session at a pull request that is not stuck.
|
|
|
|
## Follow-up PRs
|
|
|
|
- "Agent arbeitet" by the URL.
|
|
Today "Agent arbeitet" finds a session only by the branch, in a checkout of the same repository.
|
|
The follow-up PR also finds a session that named the URL of the pull request in the last 10 minutes.
|