chore(release): prepare v0.18.0 - version bump, and the entry point --focus was missing
release-plugin.mjs does not bump these; it REFUSES to release until they already match the target (release-plugin.mjs:64). The bump belongs in this repo, not in the catalog session, so the catalog step is now unblocked: plugin.json, package.json, README badge and all three SKILL.md frontmatters move to 0.18.0 together, and CHANGELOG's [Unreleased] becomes [0.18.0]. More important than the numbers: --focus was reachable by nobody. The board SKILL.md is the operator's only entry point and it documented only --plan, so "fokusdag pa X" would have routed to an unfocused plan on a released 0.18.0. The skill now passes the user's phrasing through VERBATIM - resolving prose to a slug in the skill would put a guess in front of a deterministic lookup, and fokus= already reports what the phrase resolved to. It also relays the three disclosure lines rather than trimming them as noise, since this is the one rendering that hides repos. check-versions: 0 ERROR, 1 WARN (catalog ref lags plugin.json - the documented transient state before the ref bump). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0186vKCzuUEN5WcJB82kddzF
This commit is contained in:
parent
dd04356920
commit
ecbb34ae48
7 changed files with 45 additions and 10 deletions
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "repo-mailbox",
|
||||
"version": "0.17.0",
|
||||
"version": "0.18.0",
|
||||
"description": "Local mailbox for coordination between Claude Code sessions in different repositories. Directed messages and broadcasts as plain Markdown files on your own disk, injected as context at session start. Local, private, no network.",
|
||||
"author": {
|
||||
"name": "Kjell Tore Guttormsen"
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file.
|
|||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [Unreleased]
|
||||
## [0.18.0] - 2026-08-02
|
||||
|
||||
### Added
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
*AI-generated: all code produced by Claude Code through dialog-driven development.*
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
|
@ -94,7 +94,7 @@ Scoring is judgement and belongs to the skill; turning scores into a row is a lo
|
|||
coord-done.sh <filename>... | --all # archive without replying
|
||||
coord-count.sh [--exclude <mailbox>] # per mailbox: pending + replies owed, delivering nothing
|
||||
coord-sweep.sh [--write] [--days <n>] [--log <path>] # close aged notices machine-wide (dry-run by default)
|
||||
board.sh [--roots <dir>[,<dir>...]] [--brief|--plan] # cross-repo attention board (read-only)
|
||||
board.sh [--roots <dir>[,<dir>...]] [--brief|--plan] [--focus "<prose>"] # cross-repo attention board (read-only)
|
||||
brief-nightly.sh # render the briefing to a file, atomically
|
||||
route.sh --path <v> --verification <v> --reversibility <v> \
|
||||
--scope <v> --rationale "<why>" # model + effort for the next session
|
||||
|
|
@ -109,6 +109,8 @@ It makes **zero model calls**, which is the point rather than a detail. Under su
|
|||
|
||||
**`board.sh --plan` renders the day plan**, a *third* rendering of that same scan and the only one that takes a position: which repos to open a tab for today, in what order, and the command to start each. The order is the position, and there is no cutoff — nothing is hidden, and four deterministic rules decide it. Repos owing mail come first, most-owed first, *whatever their status*: excluding `blocked` or `done` is a statement about a repo's own next step, which by definition cannot be moved, while owing an answer is a different axis and answering is often what unblocks it. Then live work (`in-progress`), then `planned`, then last and labelled, the repos with no board line at all — the table already prints a note about those, so a plan that dropped them silently would repeat exactly that defect. Still zero model calls, still read-only, and still cross-checked against `coord-count.sh`.
|
||||
|
||||
**`--focus "<prose>"` narrows that plan to one subject, and reports what it held back.** It is the only cutoff this format has, which is why the report is a condition of the feature rather than a refinement of it: `--plan` documents that it hides nothing and labels what it cannot rank, so a silent filter would break a property already written down. The same run prints the subjects the prose resolved to, how many blocks were removed, how many `STATE.md` were searched, and — named, not counted — the repos that *mention* a resolved subject without declaring a marker line. That last class is enumerated because it is where the misses live: a repo can be a heavy participant and never have written a marker, and no string measurement finds it until the held-back population is listed. Each surviving block carries the declaration it survived on. Prose matching nothing prints the *full* plan and says so, since the phrase arrives verbatim from a person and a typo must not empty the day. The subject vocabulary is read from the scanned `STATE.md` themselves, so the "reads `STATE.md` and no other file" invariant is untouched.
|
||||
|
||||
It prints `key=value` blocks rather than prose because it has **two consumers**: the operator pasting a command, and a separate repo driving a terminal from it. Prose would make the rendered format an API that no test here could hold stable for a consumer living in another repo. Each block carries `dir=` as an absolute path — a new terminal pane inherits its anchor's working directory, so a plan that omitted it would look right and point at the wrong repo. A repo whose route line is missing or unparseable gets `command_missing=` with the reason, never an empty `command=`: a driver reading `^command=` would type a blank line into a live pane.
|
||||
|
||||
The two consumers want the same information shaped differently, so each block carries both. `dir=` and `command=` stay separate for a driver, which moves the pane itself and then types the command. **`paste=` is the operator's line** — the two already joined into one `cd … && claude …` to select and paste. Asking a person to assemble a directory from one field and a command from another is not a saved line of output; it is the step where a session gets started in the wrong repository. `paste=` is emitted only where `command=` is, since `paste=cd X && ` with nothing after it would run the `cd` and then a bare newline, leaving you in the right directory with no session and no error.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "repo-mailbox",
|
||||
"version": "0.17.0",
|
||||
"version": "0.18.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"engines": {
|
||||
|
|
|
|||
|
|
@ -9,15 +9,18 @@ description: >-
|
|||
"what unblocks the most", "show the board", "what is cheapest to move",
|
||||
"cross-repo status", "where is the leverage", "which repo is blocked". Also
|
||||
covers planning a whole day rather than picking one repo: "plan my day", "which
|
||||
repos should I open tabs for", "day plan". Also triggers on Norwegian phrasings:
|
||||
repos should I open tabs for", "day plan" — including a day with a subject:
|
||||
"focus day on X", "today I am only working on X", "which repos does X touch".
|
||||
Also triggers on Norwegian phrasings:
|
||||
"hva skal jeg jobbe med", "hvem venter på meg", "hva løsner mest", "vis tavlen",
|
||||
"hva er billigst å flytte", "hvor bør jeg begynne", "status på tvers av repo",
|
||||
"hva er blokkert", "lag en dagsplan", "planlegg dagen", "hvilke repo skal jeg
|
||||
åpne i dag". Trigger even when the
|
||||
åpne i dag", "fokusdag på X", "i dag jobber jeg bare med X", "hvilke repo
|
||||
gjelder X". Trigger even when the
|
||||
user names no repo and no tool — choosing *between* repos is this skill. Not for
|
||||
"where were we" inside the current repo: that is this repo's own STATE.md,
|
||||
already injected at session start.
|
||||
version: "0.17.0"
|
||||
version: "0.18.0"
|
||||
---
|
||||
|
||||
# board — which repo deserves the next session
|
||||
|
|
@ -151,6 +154,36 @@ Two things to say out loud when you hand it over:
|
|||
per tab. Fixing them is the `route` skill's job, in *that* repo — never a side
|
||||
quest here.
|
||||
|
||||
### When the day has a subject ("fokusdag")
|
||||
|
||||
"I dag jobber jeg bare med X", "fokusdag på X", "hvilke repo gjelder X" — pass the
|
||||
user's own words through, untouched:
|
||||
|
||||
"$BOARD" --plan --focus "<the user's phrasing, verbatim>"
|
||||
|
||||
**Do not tokenize, normalize or translate the phrase into a slug yourself.** The
|
||||
engine resolves prose against the topic markers the scanned `STATE.md` files
|
||||
actually declare, and it reports what it resolved to. Guessing a slug here would
|
||||
put a judgement call in front of a lookup that is already deterministic — and
|
||||
`fokus=` in the output tells the user what the phrase resolved to, which your
|
||||
guess would silently replace.
|
||||
|
||||
This is the only rendering that *hides* repos, so three lines carry weight and
|
||||
must be relayed, never trimmed as noise:
|
||||
|
||||
- **`fokus_utenfor=`** — repos that *mention* the subject with no marker line.
|
||||
They are named, not counted, because that is where the misses live: a repo can
|
||||
be a heavy participant and still never have written a marker. Say "nevner",
|
||||
never "dekker" — this reports text found in a file, not relevance.
|
||||
- **`fokus_droppet=`** — how many blocks the cutoff removed.
|
||||
- **`fokus_rekkevidde=`** — how many `STATE.md` were searched. The scan opens no
|
||||
other file, so a repo whose evidence lives in a `README` is invisible to it.
|
||||
|
||||
If `fokus_ikke_brukt=` appears, the phrase matched no declared subject and the
|
||||
**full** plan came back. Say so plainly — the user asked for a narrow day and got
|
||||
a wide one, and presenting it as focused would be the one failure this whole
|
||||
rendering is built to avoid.
|
||||
|
||||
Blocks are `key=value` and comment lines start with `#`, because a separate driver
|
||||
repo consumes this output. That format is a contract with a consumer outside this
|
||||
repo: never reformat it, and never hand-edit a block before passing it on.
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ description: >-
|
|||
covers retiring a broadcast that has become wrong or obsolete: "retract that
|
||||
broadcast", "that announcement is outdated, pull it", "trekk tilbake kringkastingen",
|
||||
"den broadcasten er utdatert".
|
||||
version: "0.17.0"
|
||||
version: "0.18.0"
|
||||
---
|
||||
|
||||
# coord-send — natural-language front door for inter-repo messages
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ description: >-
|
|||
the operator names no model and no tool — choosing the model for the next
|
||||
session IS this skill. Not for choosing which REPO gets the next session:
|
||||
that is the `board` skill.
|
||||
version: "0.17.0"
|
||||
version: "0.18.0"
|
||||
---
|
||||
|
||||
# route — what the next session should run with
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue