feat/dev-forge #7

Closed
jmoran wants to merge 0 commits from feat/dev-forge into main
Owner

More dev-oriented UI, emphasizing straightforward display of key categories and consistent page feel.

More dev-oriented UI, emphasizing straightforward display of key categories and consistent page feel.
The menu was capped at 480px and scrolled inside itself. Its last
items, Sign out among them, sat below the fold, and macOS draws no
scrollbar to hint at them.

- The menu now grows to the window's height below the top bar.
- It still scrolls on a window too short to hold it.
People name a tell or change by its number, but lists hid it and a
"#N" in prose was plain text, so readers had to open links to know
what anything was.

- List rows show the number after the title.
- A change's head says which tell it answers: "in answer to #6 from jmoran".
- "#N" in issue, pull, comment and review text links to that item.
- The link's hover shows its number, state, kind and title.
- Tests cover linking, escaping, code and links left alone, and the resolver.
Every forge tab held a live event stream open. Browsers allow six
connections to one host over HTTP/1.1, so a few background tabs left
new pages spinning and live updates broken.

- A hidden tab closes its streams: live regions, repository activity and run logs.
- Shown again, live regions and repository activity resume from the last event heard.
- A run log page reloads when shown, which replays its log.
- Checked in Brave: with every tab sent to the background, seven tabs each load in about 30ms; before, the sixth stalled.
A park note written in the owner's name woke a feedback run and steered the
running builder as the owner's word. parkIssue, parkPull and parkForBreaker
now say the note as the run's agent (else a builder on the crew).
Every repository gets Files, Issues, Pull requests and Branches, plus
Settings for an admin. Issue and pull lists filter by open, closed and
all, show the git state badge, the author, and a pull's branches, and
link to /issues/:n and /pulls/:n. The branches page leads with a branch
graph drawn from git log --branches.
ensureDirectionIssue opens the direction issue in the owner's name, so its
issue.opened event seeded "because you told" for every item in the app.
seedOwnActs now skips the issue.opened event of a repo's direction issue.
A run whose subscription's whole-life budget was spent was paused and
queued again as "paused on the provider's limit", so it read as a Claude
usage limit. The resting pick now says when the budget is the cause; the
paused run, its queued successor (BUDGET_PAUSED), its run log and a run
that fails past MAX_PAUSES all name the forge budget, and interruptionOf
reads that failure as a "forge budget" interruption.
The review task quoted only the direction line, so the reviewer asked to
remove work the owner had asked for on the pull. The runner now passes
which commenters direct the crew, and the review brief quotes their words
first and says they outrank the direction.
The review checklist named the terminal door, src/tty.ts and the forge's
signed headers in every repository, games included. Those lines now apply
when the repository is an app the forge runs; others get a plain security
line.
A run paused on a spent forge budget was queued with not_before an hour
out, and neither raising the budget nor Wake cleared it. wakeBudgetPaused
sets not_before to now on every queued agent run whose summary starts
with BUDGET_PAUSED; the Subscriptions budget and Wake handlers call it.
A run still out of budget picks, pauses and waits again.
capReached counted every run started since a director last spoke, so a
healthy reviewer/builder loop reached ISSUE_RUN_CAP in minutes and was
parked though its last round was approved. Runs created before the
newest approving review on the issue no longer count.
Builders left asides for the reviewer in pull descriptions. The system
prompt now says the description is what changed and why, with no notes to
the reviewer and nothing about how the work was done.
A forge with no snapshot destination ran the nightly take anyway and
logged "ERROR snapshot failed: this forge has nowhere to put a snapshot"
every night. The nightly timer now skips the take when no store resolves,
and boot logs one info line, "snapshots off: no destination", in place
of "snapshots on where=nowhere". An on-demand snapshot still fails and
says why. test/snapshot-nightly.test.ts joins GATE.
requeueInterrupted labelled every agent run whose lease lapsed as
"interrupted by a restart", including one this process still held after
the machine slept. It now takes the dispatcher's in-flight map: a lapsed
run still in it is requeued as "lost its heartbeat though the forge never
restarted"; any other keeps the restart label.
# Conflicts:
#	src/crew/brief.ts
spawn-host.test.ts sat in neither gate list, and the stylesheet test
predates the nonce'd boot paint every page now carries.
The Forks and Runs tabs left the strip, so their tests now look for the
palette entry and the forks page's own count.
Home now carries the forge's tabs (Home, Apps, Repositories, Map, Board,
Front page), your apps with links to their issues and pull requests, a
File an issue form with File and File to crew, and the SSH command
folded behind a button. The activity feed stays at /asked. File to crew
lands on the issue it filed and names the builder it assigned.
Reached from the command palette. file and feed are reserved names.
The feed's tests read /feed; the home's read the File an issue form,
your apps and the folded Connect card. File to crew lands on the
filed issue. A new test covers POST /file: a writer lands on the
issue; an unreadable private repository, a blank title, a stranger,
another site and a read-only token file nothing.
Its title says what waits: pull requests and repositories waiting on
your decision.
A writer pins a commit under refs/builds/<label>: an annotated tag with
a note and Parent and Source trailers. No check runs and no agent wakes.
Branches leads with a Builds card: each pin under its named parent, else
under the nearest pin in its history, and a fork's first pins under its
parent repository's. Pin build sits on each branch row and on a pull
request's head; the branch graph marks pinned commits.
A fork's first pin hangs from the nearest of its parent repository's pins
in its history, by the same rule as inside one repository.
An app's demo runs one commit at <slug>--demo with a copy of production's
data. The runtime rebuilds it from refs/demo on boot, lists it after
production in its status, and every page that names an environment says
demo. The slug demo is reserved so <theirs>--demo stays unambiguous.
setDemo moves refs/demo under a lease to a commit a verified writer chose,
announces app.demo and deploys the demo; clearDemo deletes the ref and
tears the environment down. A mirror refuses, a non-commit is refused, an
agent may not pin, and the pre-receive hook keeps refs/demo out of reach of
a push. PUT and DELETE /api/v1/repos/:owner/:name/demo call them.
On an app, Update the project demo to this build calls setDemo after the
pin lands; the pin stands even when the demo does not move. The Builds
card marks the demo's pin and links its address.
Reviewed-on: jmoran/forgeJ#6
Author
Owner

closed, these changes were delivered in #11

closed, these changes were delivered in #11
jmoran closed this pull request 2026-11-02 19:00:35 +00:00

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
jmoran/forge-jay!7
No description provided.