@lovek4d/kickflip 0.7.1 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTEXT.md +18 -14
- package/SKILL.md +10 -8
- package/bin/kickflip.mjs +1 -1
- package/board/bin/board.mjs +31 -23
- package/board/domain.mjs +7 -7
- package/board/headless.mjs +8 -8
- package/board/hub-lines.mjs +1 -1
- package/board/onboarding.mjs +3 -3
- package/board/public/app-cards.js +1 -1
- package/board/public/app-lanes.js +2 -3
- package/board/public/app-reader.js +7 -3
- package/board/public/app.js +1 -1
- package/board/public/attach.js +18 -2
- package/board/public/dialogs.js +10 -12
- package/board/public/hub.css +0 -3
- package/board/public/linear-key.js +1 -1
- package/board/public/sidebar.css +1 -1
- package/board/public/style.css +31 -22
- package/board/public/ui-cards.js +6 -3
- package/board/public/ui-order.js +1 -1
- package/board/public/ui-questions.js +5 -3
- package/board/public/ui-sidebar.js +1 -1
- package/board/public/ui-threads.js +21 -16
- package/board/public/ui.js +12 -4
- package/board/public/view-hub-settings.js +25 -30
- package/board/public/view-hub.js +21 -5
- package/board/public/view-settings.js +4 -4
- package/board/server.mjs +18 -18
- package/board/store.mjs +26 -27
- package/board/tickets.mjs +3 -3
- package/hub/board-repo.mjs +1 -1
- package/hub/hub.mjs +6 -6
- package/hub/linear.mjs +1 -1
- package/hub/new-board.mjs +2 -2
- package/hub/readiness.mjs +1 -1
- package/hub/review-send.mjs +1 -1
- package/hub/slack.mjs +1 -1
- package/hub/views.mjs +1 -1
- package/package.json +1 -1
- package/starter/server.mjs +3 -3
package/CONTEXT.md
CHANGED
|
@@ -55,7 +55,7 @@ The levels back climbs in the app shell: a board, its Waiting on you, then a sep
|
|
|
55
55
|
_Avoid_: nav stack, breadcrumbs
|
|
56
56
|
|
|
57
57
|
**Hub page**:
|
|
58
|
-
The hub's status page, `/_hub/`, which the sidebar's Hub row opens: a pause or Keep going banner at the **pause line**, a banner while pushes are held or snoozed, with End snooze on a snooze, then **usage readings**, then the **pending prompts** of sessions that own no board, **Health**, whose Hub row reads the **hub status
|
|
58
|
+
The hub's status page, `/_hub/`, which the sidebar's Hub row opens: a pause or Keep going banner at the **pause line**, a banner while pushes are held or snoozed, with End snooze on a snooze, then **usage readings**, then the **pending prompts** of sessions that own no board, **Health**, whose Hub row reads the **hub status**, then its machine row, then the Keep awake toggle row, **Integrations**, then **Boards** and **Pages** with each site's health and each board's hub links and watcher, and on each board a Restart that stops its session, restarts its server and resumes the session ([a board restarts from its row on the Hub page](docs/adr/2026-11-02-1736-a-board-restarts-from-its-row-on-the-hub-page.md)), each session's remembered Always allow rules read-only under its board, polling status, then the **hub settings** summary rows ([a sidebar of every board replaces the hub home](docs/adr/2026-10-29-1639-a-sidebar-of-every-board-replaces-the-hub-home.md), [a background session's prompts and questions come to the phone](docs/adr/2026-10-30-1516-background-sessions-prompts-come-to-the-phone.md)).
|
|
59
59
|
_Avoid_: dashboard, console, hub home
|
|
60
60
|
|
|
61
61
|
**Hub status**:
|
|
@@ -157,7 +157,7 @@ A start and end time, 10:00pm to 8:00am by default. With its hold on, pushes que
|
|
|
157
157
|
_Avoid_: overnight window, wake times
|
|
158
158
|
|
|
159
159
|
**Hub settings**:
|
|
160
|
-
The summary rows below the **hub page**’s health and status: **Pause hub** first, then Notifications, Quiet hours, Rules for every board and Closed boards. Each opens its controls in a centred modal with its own scroll area. Snooze and Pause hub share one duration picker: 1h, 3h, 6h, 1d, Forever and Custom. Keep awake, Linear and Slack are not summary rows:
|
|
160
|
+
The summary rows below the **hub page**’s health and status: **Pause hub** first, then Notifications, Quiet hours, Rules for every board and Closed boards. Each opens its controls in a centred modal with its own scroll area. Snooze and Pause hub share one duration picker: 1h, 3h, 6h, 1d, Forever and Custom. Keep awake, Linear and Slack are not summary rows: Keep awake is a toggle row in Health, under the machine row, and Linear's key and Slack's token open modals from an Add key or Change key button at the end of their Integrations rows ([Linear and Slack keys open in modals from their Integrations rows](docs/adr/2026-11-09-2230-linear-and-slack-keys-open-in-modals-from-their-integrations-rows.md)). Keep awake is an on/off toggle that has the hub run `caffeinate -s`, holding the Mac awake only on AC power, and is disabled on hosts other than macOS ([Keep awake is a toggle that holds the Mac awake only on AC power](docs/adr/2026-11-09-1200-keep-awake-is-a-toggle-that-holds-the-mac-awake-only-on-ac-power.md)). Old Hub Settings links open the matching modal over Hub ([hub settings open as modals](docs/adr/2026-11-01-1221-hub-settings-open-as-modals.md)).
|
|
161
161
|
_Avoid_: Hub Settings page, preferences, hub config
|
|
162
162
|
|
|
163
163
|
**Shared person**:
|
|
@@ -203,7 +203,7 @@ A button the owner taps on the board, sent as an event. The board's rule for tap
|
|
|
203
203
|
_Avoid_: action, click
|
|
204
204
|
|
|
205
205
|
**Wave**:
|
|
206
|
-
A named set of cards from one **item file**, in build order, with a goal and a short note. Only the owner asks for one, with the +, or Claude proposes one as a board question when it spots a grouping in Todo. `board.mjs wave create --card <key>[:<earlier keys>] --card …` makes each card blocked only by the earlier cards of the wave it would conflict with, and writes the note to `wave-<slug>.md` beside the item file; each card stays one PR and starts on its own as it unblocks, so cards that don't conflict build side by side ([a wave's cards wait only on the earlier cards they'd conflict with](docs/adr/2026-11-09-1321-a-waves-cards-wait-only-on-the-earlier-cards-they-conflict-with.md)). A wave made in steps reads its steps in order and keeps its links. Todo shows it as a **wave band**. It is open until `wave finish
|
|
206
|
+
A named set of cards from one **item file**, in build order, with a goal and a short note. Only the owner asks for one, with the +, or Claude proposes one as a board question when it spots a grouping in Todo. `board.mjs wave create --card <key>[:<earlier keys>] --card …` makes each card blocked only by the earlier cards of the wave it would conflict with, and writes the note to `wave-<slug>.md` beside the item file; each card stays one PR and starts on its own as it unblocks, so cards that don't conflict build side by side ([a wave's cards wait only on the earlier cards they'd conflict with](docs/adr/2026-11-09-1321-a-waves-cards-wait-only-on-the-earlier-cards-they-conflict-with.md)). A wave made in steps reads its steps in order and keeps its links. Todo shows it as a **wave band**. Another card can wait on the whole wave with `--deps wave:<slug>`: on every card it holds as it grows, until each is Done, its blocked-by line listing the wave's open cards ([a card can wait on a whole wave](docs/adr/2026-11-09-2330-a-card-can-wait-on-a-whole-wave.md)). It is open until `wave finish`, which refuses while a card in it is open, or until all its cards are Done ([a wave the owner asks for is a lineup of cards](docs/adr/2026-11-02-1202-a-wave-the-owner-asks-for-is-a-lineup-of-cards.md); the names are [a lineup is called a wave, and the wave file an item file](docs/adr/2026-11-09-2100-a-lineup-is-called-a-wave-and-the-wave-file-an-item-file.md)).
|
|
207
207
|
_Avoid_: lineup (its old name), group, epic, batch, sprint
|
|
208
208
|
|
|
209
209
|
**Item file**:
|
|
@@ -223,7 +223,7 @@ Claude reviewing a board's repo, chosen by `hub/board-repo.mjs` `boardRepo`, wit
|
|
|
223
223
|
_Avoid_: improvements round, audit (for the whole review), bulb round
|
|
224
224
|
|
|
225
225
|
**Reviewers**:
|
|
226
|
-
The people who get a board's PR links once they are ready, and the weekday digest. Each board keeps its own in `board.json`, which its Settings modal lists, and a new item file copies them into its own `reviewers`. The board server writes both an add and a remove: an add picks a Slack member and a GitHub login from lists it fetches with the hub's Slack token and `gh`, and the server opens the DM ([the server adds reviewers from fetched lists](docs/adr/2026-11-05-2100-the-server-adds-reviewers-from-fetched-lists.md), extending [the board server removes reviewers itself](docs/adr/2026-11-04-0119-the-board-server-removes-reviewers-itself.md)). Kickflip owns the sent messages per PR, not per card, in each board's `data/pr-slack.json` `{<owner/repo#n>: {head, links: {<name>: {channel, ts, reactions}}, replies}}`: a card holds 1:m PRs, and each PR has 1:m reviewer DMs sharing one thread and one set of reactions. The card, Stale age, hub Slack link and digest read each reviewer's first link across the card's PRs, with an item's older `review_link_ts` and slack-bridge topic files only as a fallback ([Slack sends hang off PRs and go out from the hub tick](docs/adr/2026-11-07-0300-slack-sends-hang-off-prs-and-go-out-from-the-hub-tick.md)). The hub sends them as the owner, through the Slack user token pasted on Hub
|
|
226
|
+
The people who get a board's PR links once they are ready, and the weekday digest. Each board keeps its own in `board.json`, which its Settings modal lists, and a new item file copies them into its own `reviewers`. The board server writes both an add and a remove: an add picks a Slack member and a GitHub login from lists it fetches with the hub's Slack token and `gh`, and the server opens the DM ([the server adds reviewers from fetched lists](docs/adr/2026-11-05-2100-the-server-adds-reviewers-from-fetched-lists.md), extending [the board server removes reviewers itself](docs/adr/2026-11-04-0119-the-board-server-removes-reviewers-itself.md)). Kickflip owns the sent messages per PR, not per card, in each board's `data/pr-slack.json` `{<owner/repo#n>: {head, links: {<name>: {channel, ts, reactions}}, replies}}`: a card holds 1:m PRs, and each PR has 1:m reviewer DMs sharing one thread and one set of reactions. The card, Stale age, hub Slack link and digest read each reviewer's first link across the card's PRs, with an item's older `review_link_ts` and slack-bridge topic files only as a fallback ([Slack sends hang off PRs and go out from the hub tick](docs/adr/2026-11-07-0300-slack-sends-hang-off-prs-and-go-out-from-the-hub-tick.md)). The hub sends them as the owner, through the Slack user token pasted on Hub › Integrations › Slack and kept in `~/.claude/kickflip/secrets.json` beside Linear's key, opening the owner's DM with each reviewer, and records each message as it posts, so a failed one goes again next poll and a posted one never twice ([the hub sends reviewer Slack messages with its own token](docs/adr/2026-11-05-0141-the-hub-sends-reviewer-slack-messages-with-its-own-token.md)). Hub Slack identity lives in `~/.claude/kickflip/slack.json`, read or set by `board.mjs slack`; its timezone sets the weekday 09:00 to 17:00 digest window ([kickflip owns the reviewer record](docs/adr/2026-11-01-2347-kickflip-owns-the-reviewer-record.md)).
|
|
227
227
|
_Avoid_: approvers, watchers
|
|
228
228
|
|
|
229
229
|
**Finished item file**:
|
|
@@ -231,23 +231,27 @@ An item file with work items that are all in Done. Done shows it as one row that
|
|
|
231
231
|
_Avoid_: finished wave (a wave finishes with `wave finish`), closed wave, archived wave
|
|
232
232
|
|
|
233
233
|
**Work item**:
|
|
234
|
-
One unit of work in an **item file**, usually one PR. Its key is `<file>/<id>`. It reads as its ticket when the ticket is from the board's source (`#27`, `ENG-12
|
|
235
|
-
_Avoid_:
|
|
234
|
+
One unit of work in an **item file**, usually one PR. Its key is `<file>/<id>`. It reads as its ticket when the ticket is from the board's source (`#27`, `ENG-12`), else as its id ([a card is named by its board's ticket source](docs/adr/2026-11-02-2100-a-card-is-named-by-its-boards-ticket-source.md)). A new one is a **task** until it gets a ticket.
|
|
235
|
+
_Avoid_: ticket (the identity of its work in the board’s ticket source)
|
|
236
|
+
|
|
237
|
+
**Task**:
|
|
238
|
+
A work item with no ticket, keyed `T-<n>` (its board's next number), with a quiet Task badge in the ticket slot. Every new card starts as one. It gets a ticket from `--ticket <id>`, `--new-ticket`, or a yes to its grill's ticket question, which is asked only on a board with a **ticket source**; a board with none keeps every card a task ([a task is a card with no ticket, keyed T-<n>](docs/adr/2026-11-09-1500-a-task-is-a-card-with-no-ticket-keyed-t-n.md)).
|
|
239
|
+
_Avoid_: unticketed card
|
|
236
240
|
|
|
237
241
|
**Ticket**:
|
|
238
|
-
The identity of a work item in its board’s **ticket source**, shown as a badge that opens the
|
|
242
|
+
The identity of a work item in its board’s **ticket source**, shown as a badge that opens the GitHub issue or Linear issue. A ticket id belongs to its source: one stored under another source shows as its own id, unlinked. An ask has no ticket, and a card filed from it is a **task** ([a task is a card with no ticket, keyed T-<n>](docs/adr/2026-11-09-1500-a-task-is-a-card-with-no-ticket-keyed-t-n.md)). A card moves its ticket one way, building to In Progress, a PR to In Review and done to Done, when the owner is assigned it or kickflip created it; a ticket never moves its card ([kickflip reaches Linear with a key on the Mac](docs/adr/2026-11-01-1436-kickflip-reaches-linear-with-a-key-on-the-mac.md)).
|
|
239
243
|
_Avoid_: card (the board’s work item), task
|
|
240
244
|
|
|
241
245
|
**Ticket source**:
|
|
242
|
-
The board’s one choice for
|
|
246
|
+
The board’s one choice for its cards’ tickets: none (the default: every card stays a **task**), GitHub issues in the board’s repo when it is on GitHub, or a Linear workspace, team and project, picked from dropdowns listed through Hub’s **Linear key**. New board and Board Settings share the choice ([a board has one ticket source](docs/adr/2026-11-01-1348-a-board-has-one-ticket-source.md)), and pick Linear only while that key works: tapping Linear without one opens the key’s modal over them. Board Settings saves each change at once, and Done waits for a save in flight ([a board picks Linear only while Hub's key works](docs/adr/2026-11-02-1712-a-board-picks-linear-only-while-hubs-key-works.md)). A GitHub source can name the gh account its issue calls run as. The hub board’s repo is its entry’s `github`, its folder’s origin, so it can file its cards as GitHub issues ([the hub board files its cards as GitHub issues](docs/adr/2026-11-02-1611-the-hub-board-files-its-cards-as-github-issues.md)).
|
|
243
247
|
_Avoid_: integration, tracker, GitHub project
|
|
244
248
|
|
|
245
249
|
**Linear key**:
|
|
246
|
-
The owner’s Linear personal API key, pasted in Hub
|
|
250
|
+
The owner’s Linear personal API key, pasted in Hub › Integrations and kept only on the host; pages learn only whether it is set, whether Linear refused it and its workspace. It saves and is checked with Linear on paste, with no Save button, and the hub remembers a refusal until a call with that key gets an answer ([a board picks Linear only while Hub's key works](docs/adr/2026-11-02-1712-a-board-picks-linear-only-while-hubs-key-works.md)). kickflip lists teams and projects, creates projects and issues, and moves tickets with it. The hub's poll uses the saved key's viewer as the owner and advances their Linear tickets from PR state, aggregating every carrying card across boards; without a key the poll moves none ([the hub's poll moves the owner's Linear tickets](docs/adr/2026-11-02-0023-the-hubs-poll-moves-the-owners-linear-tickets.md)). Without a key, no board can pick Linear, and removing the key moves every Linear board to no ticket source ([a task is a card with no ticket, keyed T-<n>](docs/adr/2026-11-09-1500-a-task-is-a-card-with-no-ticket-keyed-t-n.md)).
|
|
247
251
|
_Avoid_: Linear token, API secret
|
|
248
252
|
|
|
249
253
|
**Internal item**:
|
|
250
|
-
A work item about the sites themselves rather than the product. Its legacy ref `S<n>` reads `INT-<n
|
|
254
|
+
A work item about the sites themselves rather than the product. Its legacy ref `S<n>` reads `INT-<n>`.
|
|
251
255
|
_Avoid_: meta task, chore
|
|
252
256
|
|
|
253
257
|
**Badge**:
|
|
@@ -283,7 +287,7 @@ Similar cards that should be cross-referenced, shown on both cards. The session
|
|
|
283
287
|
_Avoid_: sibling, link (alone)
|
|
284
288
|
|
|
285
289
|
**Split**:
|
|
286
|
-
A card a grill broke into a **wave** of smaller cards: the grill planner proposes it, when the code shows separable parts, as one question, Split as proposed or Keep as one card, and on Split the orchestrator files the cards when the card stages, as Children of the original, which closes Done "Split into …"; a card already in a wave splits into it at its place ([a grill can propose splitting its card into a wave](docs/adr/2026-11-07-1216-a-grill-can-propose-splitting-its-card-into-a-wave.md)). Wave triage's splits are of a wave's cards after filing.
|
|
290
|
+
A card a grill broke into a **wave** of smaller cards: the grill planner proposes it, when the code shows separable parts, as one question, Split as proposed or Keep as one card, and on Split the orchestrator files the cards when the card stages, as Children of the original, which closes Done "Split into …"; a card already in a wave splits into it at its place ([a grill can propose splitting its card into a wave](docs/adr/2026-11-07-1216-a-grill-can-propose-splitting-its-card-into-a-wave.md)). The close, `item set --done --split-into <wave:slug | keys>`, moves every open card that waited on the original onto the wave or cards it split into ([a card can wait on a whole wave](docs/adr/2026-11-09-2330-a-card-can-wait-on-a-whole-wave.md)). Wave triage's splits are of a wave's cards after filing.
|
|
287
291
|
_Avoid_: breakdown, epic
|
|
288
292
|
|
|
289
293
|
**Plan waves**:
|
|
@@ -295,7 +299,7 @@ _Avoid_: backlog item, todo
|
|
|
295
299
|
_Avoid_: history, old cards
|
|
296
300
|
|
|
297
301
|
**Lane**:
|
|
298
|
-
Where a card sits (In Review, In Progress, Todo, Done
|
|
302
|
+
Where a card sits (In Review, In Progress, Todo, Done), set by who acts next ([the lane follows who acts next, and a card waiting on the owner says Action needed](docs/adr/2026-10-29-1639-the-lane-follows-who-acts-next.md)). In Progress means a card is building: a running build agent, a **checking** item, or a ready PR whose CI is red, or a red draft on a board that **skips the draft**. A work card stores its **lane** (todo, progress, review, done, with `lane_at`), which one writer moves with a "Moved to <lane>: <why>" thread line; a card has no status, and held, blocked, merged and dropped are facts beside the lane ([a card stores its lane, and facts replace statuses](docs/adr/2026-11-07-1400-a-card-stores-its-lane-and-facts-replace-statuses.md)). A work card that has left Todo never drops back to it: held, blocked or **bumped out**, its build takes a **card pause** In Progress ([a card pause stops its builder at its next stopping point](docs/adr/2026-11-09-1300-a-card-pause-stops-its-builder-at-its-next-stopping-point.md), [a card moves to In Progress only once building starts](docs/adr/2026-11-03-0202-a-card-moves-to-in-progress-only-once-building-starts.md)). A running grill or prototype agent shows its status line but leaves the card where it is. In Review means finished work waits on a person: the reviewers, or the owner's review of a draft ("Review draft PR #n", whatever its CI), Merge, manual steps or the Done of an ask (see **Action needed**), or of a reopened card. An owner message or a new question on a Done card, merged or not, reopens it: In Progress until Claude answers, then In Review until the owner's Done, its next step "Tap Done once it is settled" ([a message or question on a Done card reopens it until the owner's Done](docs/adr/2026-11-02-1952-a-message-or-question-on-a-done-card-reopens-it.md), [a merged card reopens on a message, and its PR badge shows the PR's state](docs/adr/2026-11-03-1843-a-merged-card-reopens-and-its-pr-badge-shows-the-prs-state.md), [a card waiting only to be closed has no Action needed](docs/adr/2026-11-03-0137-a-card-waiting-only-to-be-closed-has-no-action-needed.md)). A card waiting only on those moves there from In Progress; one Claude still works on stays in In Progress. A card with several PRs, in any repos, sits where its least-ready PR puts it, shows a PR badge for each, and is Done once every PR has merged or closed with at least one merged ([a card holds several PRs across repos](docs/adr/2026-11-03-1904-a-card-holds-several-prs-across-repos.md)). Todo holds work that hasn't started building: the New cards, which wait on Claude ([the + makes a New card, which Claude files, folds or answers](docs/adr/2026-10-29-1639-the-plus-makes-a-new-card.md)), and every work card with no build yet, where its **Implement** shows. Discussion keeps a card there: open questions or a prototype pick, with Action needed, answered or resolved questions, grill and prototype agents, a working mark on a message in its thread and a prototype recorded for it ([a card moves to In Progress only once building starts](docs/adr/2026-11-03-0202-a-card-moves-to-in-progress-only-once-building-starts.md)). A started card that gets a question keeps its lane ([an unstarted card waits on its questions in Todo, and its one action button follows what it waits on](docs/adr/2026-10-30-1309-an-unstarted-card-waits-on-its-questions-in-todo.md)). Each lane has one fixed order, with no sort menu ([each lane has one fixed order](docs/adr/2026-11-03-0223-each-lane-has-one-fixed-order.md)): every lane but Done lists its bumped cards first, the earliest bump on top ([a bump marks the priority through every lane](docs/adr/2026-11-06-1700-a-bump-marks-the-priority-through-every-lane.md)); Todo then lists the rest oldest made first, so a new card joins the bottom ([new Todo cards join the bottom, so old ones leave first](docs/adr/2026-11-05-2345-new-todo-cards-join-the-bottom.md)); In Progress, after its bumped cards, by when each came into the lane, its reopening or its latest build agent's start, the newest arrival on top; In Review, after its bumped cards, by when the PR was first sent to a reviewer, the newest on top; Done by when each card closed, or for an answered ask when Claude last answered, the most recent on top. Done shows 10 cards, then a Show more, the thread's, that adds 10 and says how many are left; a card the owner has open stays shown ([answered asks fold into the one Done list, the kind shown in the ticket slot](docs/adr/2026-11-09-1430-answered-asks-fold-into-the-one-done-list.md)). Every card, a New card included, ends with one muted line holding the time its lane sorts by: the time only today, the day too before today ("10/31, 2:49 PM"), and the year too past 365 days. A card with no such time has no time on that line.
|
|
299
303
|
_Avoid_: column, status (status is the item's own field)
|
|
300
304
|
|
|
301
305
|
**Checking**:
|
|
@@ -460,7 +464,7 @@ _Avoid_: copy, checkout, live folder (for the builder's)
|
|
|
460
464
|
### Talking with the owner
|
|
461
465
|
|
|
462
466
|
**New task**:
|
|
463
|
-
A free-form request or question the owner sends from the board's + button (or by pressing n twice). Code and events call it an **ask**: an `ask` event whose thread is `ask:<event id>`. It is a **New card** at the top of Todo, with no wave and no Action needed, until Claude sorts it one of three ways ([the + makes a New card, which Claude files, folds or answers](docs/adr/2026-10-29-1639-the-plus-makes-a-new-card.md)): files it under a wave as a work item, whose thread opens with it (`item set --from-ask`), and sets its **card state**; folds it into the card it's about, whose thread then holds the message marked Moved (`item relate-ask`, undone by `ask unfold`); or answers it, which puts it in the
|
|
467
|
+
A free-form request or question the owner sends from the board's + button (or by pressing n twice). Code and events call it an **ask**: an `ask` event whose thread is `ask:<event id>`. It is a **New card** at the top of Todo, with no wave and no Action needed, until Claude sorts it one of three ways ([the + makes a New card, which Claude files, folds or answers](docs/adr/2026-10-29-1639-the-plus-makes-a-new-card.md)): files it under a wave as a work item, whose thread opens with it (`item set --from-ask`), and sets its **card state**; folds it into the card it's about, whose thread then holds the message marked Moved (`item relate-ask`, undone by `ask unfold`); or answers it, which puts it in Done, wearing an Ask badge in the ticket slot and named by when it was asked, whose thread takes the owner's later replies ([answered asks fold into the one Done list, the kind shown in the ticket slot](docs/adr/2026-11-09-1430-answered-asks-fold-into-the-one-done-list.md)). An answer that leaves a question open on it keeps it in Todo with Action needed, never in Done, until the owner answers and Claude replies, or it is closed; it stays in Todo while Claude takes up the answer ([an unstarted card waits on its questions in Todo, and its one action button follows what it waits on](docs/adr/2026-10-30-1309-an-unstarted-card-waits-on-its-questions-in-todo.md)). When another board fits it better, the owner can have it **moved there** (`ask move`): it becomes a New card on that board reading "Moved from <this board>", and here a Done card whose thread links to it. Folding is within one board; a move is between boards. An answer that waits on the owner, such as a choice only the owner can settle, keeps it in In Review with Action needed until the owner taps the Done beside Reply in its thread ([an ask can wait on the owner before Done, and the owner closes any open card from its thread](docs/adr/2026-10-29-1639-an-ask-can-wait-in-progress-until-the-owner-marks-it-done.md)).
|
|
464
468
|
_Avoid_: ask (in what the owner reads), message, prompt, Waiting for Claude strip
|
|
465
469
|
|
|
466
470
|
**Thread**:
|
|
@@ -582,7 +586,7 @@ Refs in text that Claude or the owner wrote are linked by the renderer, never by
|
|
|
582
586
|
| `view-questions.js` | Waiting on you as a view: a topic's questions, a prototype question's View prototypes link to its viewer, each question's eye, which asks for a prototype of that question, and one Send, which stays while the topic has a question open and otherwise opens the next topic with one, or goes back to the board |
|
|
583
587
|
| `view-notes.js` | One item's notes, or with `?wave=` a wave's goal, order and note, as a view, from `GET /api/notes`; the server redirects `plan.html` to `notes.html` |
|
|
584
588
|
| `view-hub.js` | The **hub page** as a view, from `/_hub/api/hub`, refreshed every 30 seconds while it shows; the Usage card, whose Claude model posts `/_hub/settings/claude-model`, Codex share posts `/_hub/settings/codex` and pause line posts `/_hub/settings/pause-at`, with Keep going and Stop banners posting `/_hub/settings/keep-going`, pending prompts of sessions with no board, Send now, then `view-hub-settings.js` below its status |
|
|
585
|
-
| `view-hub-settings.js` |
|
|
589
|
+
| `view-hub-settings.js` | Summary rows opening **hub settings** modals over the page, and Linear’s and Slack’s key modals (`linear-key.js`), which open from the Integrations rows, from `/_hub/api/settings`: Notifications with Snooze, Pause hub with their one duration picker (`durationPicker`: chips and a native Custom picker), Quiet hours, Rules for every board and Closed boards with Reopen |
|
|
586
590
|
| `linear-key.js` | `LinearKey`, Hub’s Linear key slot: the masked key or why it doesn’t work, the link to where keys are made, saving on paste, change or Enter with Remove, and the same slot as a modal over Board Settings or New board, which the Tickets control opens when Linear is tapped without a working key |
|
|
587
591
|
| `ui-hub.js` | `HubUI`, the hub views' pure renderers: rows, tiles, the flash, the Now row, this device's row, pause banners and the Usage card with the pause line stepper and ticks |
|
|
588
592
|
| `hub-kit.js` | `HubKit`, what the hub views share: `live` (load, the header's time and ↻, the 30-second refresh), `forms` (posting a hub form for JSON, and saving a toggle or time on change) and `device` (this device's push subscription) |
|