feat(board): cross-repo attention board as script + skill (0.9.0)
The mailbox answers "who wrote to me"; it never answered "which repo deserves the next session". board.sh scans every discovered repo and reads three sources each: the STATE.md next-step block with its optional board line, git status, and that repo's pending mailbox count. Read-only by construction, pinned by board-selftest.sh (28 checks). It ships here rather than as a personal script because the mailbox is one of its three inputs and the two carry the same axis distinction: a pending count means others are waiting on that repo, while who a repo waits ON comes only from its board line, since the message format has no reply-to field. Splitting the board from the mailbox would put that distinction in two places. It also lets the skill resolve the engine through CLAUDE_PLUGIN_ROOT like every other script here, instead of depending on a file that exists only in ~/.claude/scripts (a directory with no remote and no backup). The skill is a ranking, not a report: re-runs the board every invocation because counts drift, ranks by what unblocks the most and what is cheapest to move, then names one repo, the rule that fired, and the real next action read from that repo's STATE.md. Never the table. Not wired into session start, which would spend context on repos the session is not in. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MubwdTi88yu4hVLAFG1LbM
This commit is contained in:
parent
ec92c866c1
commit
61e224ccc3
10 changed files with 691 additions and 13 deletions
|
|
@ -16,6 +16,15 @@ test('coord bash selftest passes', () => {
|
|||
execFileSync('bash', [join(root, 'scripts', 'coord-selftest.sh')], { encoding: 'utf8' });
|
||||
});
|
||||
|
||||
// board.sh reads this plugin's mailbox for its INN column, so the board ships
|
||||
// here rather than only as a personal script. Pinning the selftest from the
|
||||
// plugin root is what makes that ownership real: the skill resolves the engine
|
||||
// through CLAUDE_PLUGIN_ROOT, so a board.sh that exists only in
|
||||
// ~/.claude/scripts/ would be missing on exactly the path production uses.
|
||||
test('board bash selftest passes', () => {
|
||||
execFileSync('bash', [join(root, 'scripts', 'board-selftest.sh')], { encoding: 'utf8' });
|
||||
});
|
||||
|
||||
// The engine refuses to invent an identity from the cwd, but the hook is the
|
||||
// FOURTH place repo identity is derived, and a rule enforced in three of four
|
||||
// places is not a rule: as long as the hook resolved the name itself and passed
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue