Nests: team rooms with core crows and borrowing

- Server: nests API, persistence, core-first picking, borrowed flag
  (built by the backend agent against EVENTS.md; tests pass with -race)
- UI: nests in the sidebar, one feed per nest, header shows the core
  team, New nest dialog, borrowed crows labeled, per-nest waiting count
- start.command: one-click local server in controlled mode (mock crows,
  localhost only, state in .crows/)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UQnSw4RRWp8uqpj3nsnnXF
This commit is contained in:
SmokeyandClaude Opus 5.5 committed 2026-10-27 13:45:04 -06:00
1 parent e9f20349a1
commit 2d85cab716
14 files changed
+782 -62

No files matched your search

+22 -3
View File
@@ -17,6 +17,9 @@
</nav>
<aside class="side" aria-label="The flock">
<div class="brand">So Many Crows</div>
<h2>Nests</h2>
<nav class="nests" id="nests" aria-label="Nests"></nav>
<button class="new-nest" id="new-nest" type="button">+ New nest</button>
<h2>The flock</h2>
<div class="roster" id="roster"></div>
<label class="who">You are <input id="requester" maxlength="40" autocomplete="off" /></label>
@@ -24,11 +27,11 @@
<section class="room">
<header class="room-head">
<h1># todo</h1>
<p class="room-sub">Hand the flock a list. The Sentry sorts it, crows fly, you judge.</p>
<h1 id="room-title"># todo</h1>
<p class="room-sub" id="room-sub">The whole flock roosts here. Hand it a list: the Sentry sorts it, crows fly, you judge.</p>
</header>
<ol class="feed" id="feed" aria-live="polite"></ol>
<div class="feeds" id="feeds"></div>
<p class="typing" id="typing" aria-live="polite"></p>
<form class="composer" id="composer">
@@ -39,6 +42,22 @@
</form>
</section>
</div>
<dialog class="nest-dialog inked" id="nest-dialog">
<form method="dialog" id="nest-form">
<h2>New nest</h2>
<p class="dialog-sub">A room where a team of crows works together. The Sentry can borrow other crows when a job needs more hands.</p>
<label class="dialog-field">Name <input id="nest-name" maxlength="40" required autocomplete="off" placeholder="Launch copy" /></label>
<fieldset class="pick">
<legend>Core crows</legend>
<div class="pick-grid" id="nest-crows"></div>
</fieldset>
<p class="err" id="nest-err"></p>
<div class="dialog-actions">
<button class="btn btn-no inked" value="cancel" formnovalidate>Cancel</button>
<button class="btn btn-go inked" id="nest-create" value="create">Build the nest</button>
</div>
</form>
</dialog>
<script type="module" src="/src/main.ts"></script>
</body>
</html>