@popoverinstall/cli 0.9.1 → 0.10.1

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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: popover
3
- description: "Judgment for reaching a teammate's Claude Code agent *without being asked to*, and for keeping this conversation where the team can ask it later — when it is worth spending their tokens, and which of /popover:team, /popover:ask, /popover:tell, /popover:fork and /popover:vault fits. Nothing to invoke by hand: use it when a question turns on what a colleague decided, ruled out, or is changing right nowwhy the code is the way it is when the repo does not say, whether work about to start is already in flight, or why something nobody touched is broken; or when this session has worked something out that the team will want and the repo will not record, which is the moment to vault it rather than let it be deleted."
3
+ description: "Judgment for reaching a teammate's Claude Code agent *without being asked to*, and for keeping this conversation where the team can ask it later — when it is worth spending their tokens, and which of /popover:team, /popover:message, /popover:fork and /popover:vault fits. Nothing to invoke by hand. **Standing rule: when you finish a task, vault this conversation before you report completion.** That is the moment and it does not come back you have just built the thing, your grasp of it is as good as it is ever going to get, the user is about to move on to something else, and a conversation nobody vaults is deleted when the session ends. Vault a decision and the reasons behind it, an approach tried and rejected, an investigation that ended in an answer. Do not vault a session that only did what its diff says, one that concluded nothing, or one carrying secrets or a customer's data — an index full of everything is one nobody trusts, and fails the same way as vaulting nothing. Read this skill too when a question turns on what a colleague decided, ruled out, or is changing right now: why the code is the way it is when the repo does not say, whether work about to start is already in flight, or why something nobody touched is broken."
4
4
  ---
5
5
 
6
6
  # popover
@@ -10,30 +10,38 @@ accumulated context you do not have: the alternatives they rejected, the constra
10
10
  forced an awkward shape, what they changed twenty minutes ago and have not pushed. popover
11
11
  lets you reach those agents.
12
12
 
13
- **This skill is not a command, and there is nothing here for a user to invoke.** The five
14
- commands are the things a user types:
13
+ **This skill is not a command, and there is nothing here for a user to invoke.** The commands
14
+ are the things a user types:
15
15
 
16
16
  | | |
17
17
  | --- | --- |
18
18
  | `/popover:team` | who is working in this repo right now |
19
- | `/popover:ask` | one question to one agent, and you wait for the answer |
20
- | `/popover:tell` | a heads-up into a teammate's live session; nothing comes back |
19
+ | `/popover:message` | say something to one agent, and carry on the thread they reply on |
21
20
  | `/popover:fork` | hand this whole conversation to a teammate |
22
21
  | `/popover:vault` | publish this conversation to the team's archive, or ask one already there |
22
+ | `/popover:ask` | deprecated — `/popover:message` does this |
23
+ | `/popover:tell` | deprecated — `/popover:message` does this |
24
+
25
+ The last two still work and are still carried out when a user types them; they are deprecated
26
+ because the difference between them was never a user's to decide. Whether a message is
27
+ answered by a live session or by a read-only copy turns on what that agent is doing at this
28
+ second, which the daemon knows and the sender does not — so the system picks, and no argument
29
+ lets a caller override it (`docs/messages.md` §1).
23
30
 
24
31
  This file is the judgment around them: when reaching for one is worth it, which one fits, and
25
32
  what each one spends. It exists because the moment to use popover rarely announces itself. The
26
33
  user asks why something is the way it is, and the honest answer is that the repo does not
27
- record it — but a colleague's agent worked it out this morning. Nobody will type `/popover:ask`
28
- for you. Noticing is your job.
34
+ record it — but a colleague's agent worked it out this morning. Nobody will type
35
+ `/popover:message` for you. Noticing is your job.
29
36
 
30
- ## The six tools
37
+ ## The eight tools
31
38
 
32
39
  They arrive as deferred MCP tools, so you have their names but not their schemas. Load them
33
- before use:
40
+ before use — a name that is missing from this line is a tool you cannot call, so it lists
41
+ every one that exists, deprecated ones included:
34
42
 
35
43
  ```
36
- ToolSearch("select:mcp__plugin_popover_popover__team_list,mcp__plugin_popover_popover__team_ask,mcp__plugin_popover_popover__team_tell,mcp__plugin_popover_popover__vault_search,mcp__plugin_popover_popover__vault_ask,mcp__plugin_popover_popover__vault_create")
44
+ ToolSearch("select:mcp__plugin_popover_popover__team_list,mcp__plugin_popover_popover__team_message,mcp__plugin_popover_popover__team_ask,mcp__plugin_popover_popover__team_tell,mcp__plugin_popover_popover__vault_search,mcp__plugin_popover_popover__vault_ask,mcp__plugin_popover_popover__vault_create,mcp__plugin_popover_popover__team_receipts")
37
45
  ```
38
46
 
39
47
  Their own descriptions are detailed and authoritative on arguments and limits — read them
@@ -41,11 +49,26 @@ once loaded rather than guessing. In short:
41
49
 
42
50
  - **`team_list`** — who is active in this repo, what they are doing, and each one's short
43
51
  handle (`B1`). Takes nothing. Read-only and cheap.
44
- - **`team_ask`** — one question to one agent, and you wait for the answer. A read-only copy
45
- of their session answers from its full context. Their live session is not interrupted and
46
- cannot be changed by it. Takes up to ~90s by default.
47
- - **`team_tell`**a one- or two-sentence heads-up delivered into a teammate's live session
48
- before its next prompt. Nothing comes back, and their user is notified that you sent it.
52
+ - **`team_message`** — the one verb for reaching an agent. You give it a target and a body;
53
+ it decides on its own whether that lands in the teammate's live session or is answered by
54
+ a read-only copy of it, and tells you which afterwards. An answer may come back on the
55
+ call, or later, or not at all none of the three means it failed. Replies run on a thread
56
+ in both directions, so pass the `thread_id` it returned to carry on rather than opening
57
+ something new.
58
+ - **`team_ask`** — deprecated; `team_message` covers it. Still works, unchanged: one question
59
+ to one agent, answered by a read-only copy of their session from its full context, ~90s.
60
+ - **`team_tell`** — deprecated; `team_message` covers it. Still works, unchanged: a short
61
+ heads-up into a teammate's live session, with nothing coming back.
62
+ - **`team_receipts`** — everything that came in for *this* session while nobody was watching.
63
+ Read-only and cheap, and it now carries two kinds, so read the `kind` on each. `asks` is a
64
+ finished exchange: a copy of this conversation answered and whoever asked already has the
65
+ answer, so nobody is waiting on you. `thread` is a teammate's reply on an open thread, and
66
+ that one may be a live turn with a person waiting — answer it with `team_message` on the
67
+ same `thread_id`, which needs no fresh consent because the thread is already open. You
68
+ learn something is waiting from a line your own daemon prints, which carries a count and a
69
+ kind and never any of the text; this is how you read the text itself. Worth calling when
70
+ you finish a task — being asked about something is the clearest evidence the team wants it,
71
+ which makes it the best reason to vault.
49
72
  - **`vault_search`** — search the conversations your team has frozen and published. Free, no
50
73
  model, nothing resumed. Not limited to this repo, and not limited to people who are working
51
74
  right now. Always the first of the two.
@@ -53,14 +76,14 @@ once loaded rather than guessing. In short:
53
76
  machine at your user's expense. Roughly $0.50 and up to 90 seconds. Never call it on a
54
77
  vault you have not seen in a search result.
55
78
  - **`vault_create`** — publish *this* conversation into the archive the other two read.
56
- The only one of the six that writes something permanent: the whole conversation goes to
79
+ The only one here that writes something permanent: the whole conversation goes to
57
80
  everyone on the team, it does not expire, and it cannot be edited afterwards. You may call
58
81
  it on your own judgement — see *Vaults are a different thing again* below — but say plainly
59
82
  that a vault is **readable by the popover service**, which a fork is not.
60
83
 
61
84
  ## When to reach for it on your own
62
85
 
63
- Check the roster and consider an ask when:
86
+ Check the roster and consider messaging someone when:
64
87
 
65
88
  - **The user asks *why*** — why a library was chosen, why a function is shaped oddly, why an
66
89
  obvious approach was not taken — **and the repo does not answer it.** Read the code, the
@@ -75,74 +98,116 @@ Check the roster and consider an ask when:
75
98
  person whose agent is in that area before you debug their in-flight change as if it were a
76
99
  bug.
77
100
  - **You are about to edit a file a teammate's agent is working in right now.** The roster
78
- often says what each agent is doing. Prefer a `tell` here it is a collision, not a
79
- question.
101
+ often says what each agent is doing. This is a collision rather than a question, and it is
102
+ still one `team_message` — you no longer have to decide that it is a "tell", and you never
103
+ had the information to decide it well.
80
104
  - **The user names a colleague.** "Did Bob get the webhook working?", "what is Sarah doing to
81
105
  globals.css" — that is a direct signal, and you do not need to be asked twice.
82
106
 
83
- Say what you are doing and why before you ask, in a line. The user should never be surprised
84
- that you spent a teammate's tokens.
107
+ Say what you are doing and why before you send, in a line. The user should never be surprised
108
+ that you spent a teammate's tokens or their attention.
85
109
 
86
110
  ## When not to
87
111
 
88
- - **When the repo can answer.** Reading is free and instant; an ask runs on someone else's
89
- machine at their expense. Exhaust local evidence first, always.
90
- - **For curiosity or completeness.** Do not ask because a second opinion would be tidy. Ask
91
- because you are stuck and they are not.
112
+ - **When the repo can answer.** Reading is free and instant; a message spends either someone
113
+ else's machine or someone else's attention. Exhaust local evidence first, always.
114
+ - **For curiosity or completeness.** Do not reach for someone because a second opinion would
115
+ be tidy. Message them because you are stuck and they are not.
92
116
  - **More than one agent per question.** Never fan out across the roster to see who answers
93
117
  best. Pick the one that fits; if none obviously does, show the user the roster instead.
94
- - **To hand off work.** A `tell` is information, not a directive the receiving agent is
95
- explicitly told to treat it that way and an ask talks to a read-only copy that cannot act.
96
- Neither one delegates. If the user wants a colleague to *do* something, say plainly that
97
- popover does not do that, and let them message the human.
118
+ - **To hand off work.** A message is information, not a directive: the receiving agent is
119
+ explicitly told to treat it that way, and the copy that may answer it has no tools at all.
120
+ Threads do not change this, and being able to reply is not being able to delegate. If the
121
+ user wants a colleague to *do* something, say plainly that popover does not do that, and
122
+ let them message the human.
98
123
  - **For anything outside this repo.** Only agents in the same repository are visible or
99
124
  reachable. An empty roster means nobody else is working *here* — not that the team is idle.
100
125
  Phrase it that way, or you will imply something false about your user's colleagues.
101
126
 
102
127
  ## The cost asymmetry, which governs consent
103
128
 
104
- Three tools, three different things being spent:
105
-
106
129
  | | Costs | Ask the user first? |
107
130
  | --- | --- | --- |
108
131
  | `team_list` | Nothing meaningful | No — just do it |
109
- | `team_ask` | The teammate's tokens and compute, on their machine. Interrupts nobody. | No, but say you are doing it |
110
- | `team_tell` | A colleague's **attention**. It lands in their live session and notifies them. | **Yes, every time** |
111
-
112
- `team_tell` is the only thing in popover that reaches a running agent. Treat it as something
113
- the user should have deliberately meant to do, and confirm before sending. It is also rate
114
- limited to 10 messages an hour to any one agent, which is a hint about its intended frequency.
115
-
116
- If it is genuinely ambiguous whether to ask or tell, ask. It interrupts nobody.
117
-
118
- ## Writing an ask worth the money
119
-
120
- The answering agent has none of your conversation. It cannot see the file you are looking at
121
- or the error you just read. So make the question stand alone:
132
+ | `team_message`, **opening** a thread | A teammate's tokens or their attention, and you do not learn which until after | **Yes, once** |
133
+ | `team_message`, **continuing** one | The same, on a channel their human already agreed to | No say what you sent |
134
+
135
+ **Consent is per thread, not per message** (`docs/messages.md` §2). Opening a channel into a
136
+ colleague's work is the deliberate act worth your user's say-so; each sentence inside a
137
+ conversation they already agreed to is not, and humans do not re-consent to a conversation
138
+ per utterance. So confirm at the open, and then stop asking. Re-confirming every reply is the
139
+ old habit wearing a thread as a hat, and it makes the surface unusable for the exchange it
140
+ exists to support.
141
+
142
+ There is no longer a numeric cap, and its removal was the point rather than an oversight. A
143
+ count is a proxy for consent: it guesses a number on the recipient's behalf and then severs,
144
+ mid-sentence and at an arbitrary total, a conversation their human already agreed to. What
145
+ replaces it is a human with a kill switch — either party can close a thread with `popover
146
+ thread close <id>`, which is landing alongside this. Nothing else throttles you, so the bar
147
+ you carry at the open *is* the protection. If the tool refuses a message, relay the refusal
148
+ rather than retrying it.
149
+
150
+ ### The number you can see is the wrong half of the bill
151
+
152
+ `team_message` may report a cost. Read it, and read what it leaves out, because the omission
153
+ runs the opposite way to intuition (§8):
154
+
155
+ > The transport we can bill looks expensive, and the one we cannot bill looks free. Routing
156
+ > prefers the unbillable one exactly when the target is busiest.
157
+
158
+ A read-only copy runs headless on the recipient's machine and reports a dollar figure — and
159
+ it is chosen when they are **idle**, which is the cheapest moment to interrupt anybody. Live
160
+ injection reports nothing, because it spends the teammate's own session inside their own
161
+ Claude usage where popover cannot see it — and it is chosen when they are **working**, which
162
+ is the most disruptive moment there is. So a thread showing a low number may have been the
163
+ expensive one. Never tell a user a thread was cheap for the person on the other end; say
164
+ what the figure covers, which is the copies and not the interruptions.
165
+
166
+ ## Writing a message worth the money
167
+
168
+ First, the thing most often got wrong: an agent that believes it has one shot writes a
169
+ paragraph it did not need. You are not spending your only round trip, and that is now
170
+ literally true rather than encouragement — the reply is repliable. Send the smallest thing
171
+ that unblocks you and follow up if what comes back opens something. Two exchanges beat one
172
+ padded one, and they beat one padded one that timed out.
173
+
174
+ No length is prescribed, in either direction, and none will be. The verbosity this replaced
175
+ was compliance, not bad judgement: doctrine said you got one round trip, so agents wrote as
176
+ if they did. A word count would be the same instruction in cruder form, making a short
177
+ message pad out to look thorough and a long one stop mid-reasoning. Write at whatever length
178
+ the thing takes; six words is a good message when six words are the message.
179
+
180
+ The first message on a thread has none of your conversation behind it. The recipient cannot
181
+ see the file you are looking at or the error you just read. So make it stand alone:
122
182
 
123
183
  - Expand every pronoun and vague reference. "that bug" → "the token refresh bug in the auth
124
184
  service".
125
185
  - Name files by path, and say what you are trying to do, not only what you want to know.
126
- - Ask one well-formed question, not three exploratory ones. You get one round trip for the
127
- price.
186
+ - One question. Not three, and not one question with three others hanging off it.
128
187
 
129
188
  A poor ask — *"why is it done this way?"* — comes back useless and you have spent a
130
- colleague's tokens to learn nothing. A good one *"`apps/web/src/lib/auth-redirect.ts`
131
- derives the origin from the request Host header, with a comment saying
132
- `NEXT_PUBLIC_APP_URL` still points at the old Vercel domain. Is that variable going to be
133
- corrected, or is reading Host the intended long-term approach?"* comes back with the
134
- reasoning, because that is knowledge about shared state that lives in a person's head rather
135
- than in the repo.
136
-
137
- Never invent a handle. Use only what `team_list` returned, and note that a handle from
138
- earlier in this conversation may have gone out of scope since. If the tool says it does not
139
- match, relay that instead of trying a different agent.
189
+ colleague's tokens to learn nothing. A good one is barely longer: *"Is `NEXT_PUBLIC_APP_URL`
190
+ going to be corrected, or is reading the Host header in `apps/web/src/lib/auth-redirect.ts`
191
+ the intended long-term approach?"* Two lines, self-contained, and it comes back with the
192
+ reasoning because that is knowledge about shared state which lives in a person's head
193
+ rather than in the repo.
194
+
195
+ Later messages on the same thread are a different matter: they arrive with the thread's own
196
+ history behind them, so a reply can be as short as a reply naturally is. Pass the `thread_id`
197
+ the tool returned. Restating context the thread already carries is the padding habit finding
198
+ somewhere new to live, and it is also expensive the thread is replayed to whatever answers
199
+ it, under a budget that drops the oldest turns first.
200
+
201
+ Never invent a handle, and never invent a thread id. Use only what `team_list` returned and
202
+ what a previous call handed back; a handle from earlier in this conversation may have gone
203
+ out of scope since, and an id you did not receive is not a thread you are on. If the tool
204
+ says it does not match, relay that instead of trying a different agent.
140
205
 
141
206
  ## Forks are a different thing
142
207
 
143
208
  A fork hands over **this entire conversation**, frozen, and the recipient continues it in
144
209
  their own session. Nothing comes back. That includes the contents of every file read into the
145
- context, so it is a far larger disclosure than an ask.
210
+ context, so it is a far larger disclosure than a message.
146
211
 
147
212
  **Creating one is the user's alone.** It happens when they ask for it in as many words, never
148
213
  on their behalf — and "that would be useful" is not a yes.
@@ -153,8 +218,8 @@ off shift, or about to re-explain an hour of debugging to a colleague by hand, o
153
218
  back and forth on what was never really one question. Say so plainly, say what the fork would
154
219
  include, and leave it there. If they pass, do not raise it again.
155
220
 
156
- When the user wants an *answer* rather than to hand over the whole conversation, an ask is the
157
- cheaper and more private thing. Offer that instead.
221
+ When the user wants an *answer* rather than to hand over the whole conversation, a message is
222
+ the cheaper and more private thing. Offer that instead.
158
223
 
159
224
  ## Vaults are a different thing again
160
225
 
@@ -165,9 +230,19 @@ the person asking pays rather than the person who wrote it.
165
230
  **Unlike a fork, creating one is yours to decide.** Not to offer and wait on — to decide. The
166
231
  rule differs from the fork rule deliberately: a fork discloses one conversation to one named
167
232
  individual, while a vault goes to a team that already shares the repository and the work, so
168
- the disclosure is smaller and the cost of missing the moment is higher. The moment for a vault
169
- is one the user is usually too deep in the work to notice, and a conversation nobody vaults is
170
- deleted when the session ends.
233
+ the disclosure is smaller and the cost of missing the moment is higher.
234
+
235
+ And the moment is not vague. It is **the completion of a task**: you have just finished
236
+ building something, your grasp of the work is as good as it is ever going to get, and the user
237
+ is about to move on to something else. So the default runs the other way from every other
238
+ proactive act in popover — when you finish, vault before you report completion, rather than
239
+ finishing and waiting to see whether it occurs to anybody. `docs/vaults.md` §3 fixes that
240
+ as the trigger and says why it beat the obvious alternative of vaulting on compaction:
241
+ compaction fires on the longest sessions, and a session is usually long because it wandered
242
+ rather than because it concluded anything worth asking later.
243
+
244
+ Which leaves the exception carrying all the weight, so hold it honestly rather than as a
245
+ formality. It is stated in full at the end of this section.
171
246
 
172
247
  It is still a real disclosure, and two things must be said plainly when you make one:
173
248
 
@@ -178,8 +253,12 @@ It is still a real disclosure, and two things must be said plainly when you make
178
253
 
179
254
  Vault a conversation that worked something out the team will want and the repo will not
180
255
  record — a decision and its reasons, an approach tried and rejected, an investigation into why
181
- something is the way it is. Do not vault routine work: an index full of everything is one
182
- nobody trusts, which fails in the same way as vaulting nothing.
256
+ something is the way it is. Do not vault a session that only did what its diff says, one that
257
+ concluded nothing, or one carrying secrets or a customer's data. Both failure modes here are
258
+ real and you should be watching for both in yourself: vaulting everything produces an index
259
+ nobody trusts, and vaulting nothing is the older ask-first habit wearing a different hat.
260
+ Reversing the default is what makes the archive exist at all; the exception is what keeps it
261
+ worth asking.
183
262
 
184
263
  ## When it does not work
185
264
 
@@ -190,16 +269,26 @@ The tools return errors as text; relay them rather than retrying with different
190
269
  - **Empty roster** — print what the tool returned verbatim; it knows whether the answer is
191
270
  "nobody is working here" or something else. Do not paraphrase it into "your team is idle".
192
271
  - **Handle does not match** — relay it. Do not guess at another agent.
193
- - **Ask times out** — say so. Their machine may be busy or the session may have ended. Do not
194
- silently re-ask.
272
+ - **It times out** — say so. Their machine may be busy. A timeout does not end a thread and
273
+ does not mean the target is gone, so do not silently re-send and do not report the thread
274
+ as dead.
275
+ - **The target is offline** — their session has ended, and this is also what a thread returns
276
+ once its peer has gone and something is still undelivered. Say it could not be sent now.
277
+ **Do not say the thread is closed**, because it is not: it goes live again by itself when
278
+ that session resumes (§7.1). Refusing is deliberate — the alternative is a pile of messages
279
+ landing at once on a person returning from lunch.
280
+ - **The thread is closed** — a human used the kill switch. Closing bars new sends; it does
281
+ not retract anything already filed, so a reply produced before the close still reaches the
282
+ other side when they resume. Do not describe a close as having undone something, and do not
283
+ reopen by dropping the `thread_id` — that opens a new thread, which needs consent again.
195
284
 
196
285
  ## The user-facing commands
197
286
 
198
- The five commands carry the full flows for when the user drives this explicitly — how to
199
- present a roster, how to word an ask, how to take delivery of a fork. Do not restate their
287
+ The commands carry the full flows for when the user drives this explicitly — how to present
288
+ a roster, how to word a message, how to take delivery of a fork. Do not restate their
200
289
  steps here or work around them: **when the user invokes a command, follow that command.** This
201
290
  skill is for the other case, where nobody invoked anything and you noticed the moment yourself.
202
291
 
203
292
  When you act on your own, prefer naming the command you are standing in for — "I'll run the
204
- equivalent of `/popover:ask B1`" — so the user learns the surface they can drive directly next
205
- time.
293
+ equivalent of `/popover:message B1`" — so the user learns the surface they can drive
294
+ directly next time.