@popoverinstall/cli 0.8.1 → 0.9.0
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/CHANGELOG.md +147 -78
- package/LICENSE +21 -21
- package/README.md +142 -141
- package/dist/config-command.d.ts +2 -0
- package/dist/config-command.d.ts.map +1 -0
- package/dist/config-command.js +80 -0
- package/dist/config-command.js.map +1 -0
- package/dist/cursor-hooks.d.ts +18 -0
- package/dist/cursor-hooks.d.ts.map +1 -0
- package/dist/cursor-hooks.js +105 -0
- package/dist/cursor-hooks.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -25
- package/dist/index.js.map +1 -1
- package/dist/keys.d.ts +10 -0
- package/dist/keys.d.ts.map +1 -0
- package/dist/keys.js +44 -0
- package/dist/keys.js.map +1 -0
- package/dist/repo-scan.d.ts +130 -0
- package/dist/repo-scan.d.ts.map +1 -0
- package/dist/repo-scan.js +281 -0
- package/dist/repo-scan.js.map +1 -0
- package/dist/repos.d.ts +180 -0
- package/dist/repos.d.ts.map +1 -0
- package/dist/repos.js +1002 -0
- package/dist/repos.js.map +1 -0
- package/dist/snapshot.d.ts +35 -0
- package/dist/snapshot.d.ts.map +1 -1
- package/dist/snapshot.js +16 -16
- package/dist/snapshot.js.map +1 -1
- package/dist/vaults.d.ts +276 -0
- package/dist/vaults.d.ts.map +1 -0
- package/dist/vaults.js +1224 -0
- package/dist/vaults.js.map +1 -0
- package/package.json +47 -47
- package/plugin/.claude-plugin/plugin.json +19 -19
- package/plugin/.mcp.json +9 -9
- package/plugin/README.md +84 -77
- package/plugin/commands/ask.md +65 -65
- package/plugin/commands/fork.md +119 -119
- package/plugin/commands/repos.md +107 -0
- package/plugin/commands/team.md +60 -60
- package/plugin/commands/tell.md +66 -66
- package/plugin/commands/vault.md +173 -0
- package/plugin/hooks/hooks.json +111 -111
- package/plugin/mcp/index.mjs +585 -355
- package/plugin/scripts/_ipc.mjs +146 -146
- package/plugin/scripts/announce-roster.mjs +141 -141
- package/plugin/scripts/deliver-messages.mjs +77 -77
- package/plugin/scripts/emit-event.mjs +44 -44
- package/plugin/scripts/ensure-daemon.mjs +156 -156
- package/plugin/scripts/roster.mjs +52 -52
- package/plugin/skills/popover/SKILL.md +175 -168
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// Renders the /team menu.
|
|
3
|
-
//
|
|
4
|
-
// Invoked from the command's `!` injection, so its stdout becomes part of the prompt
|
|
5
|
-
// Claude sees. Two consequences shape everything here:
|
|
6
|
-
// - always exit 0. A non-zero exit aborts the whole slash command.
|
|
7
|
-
// - always print something useful. If the daemon is down, say so in words the model
|
|
8
|
-
// can relay, rather than printing an empty section and letting it invent a reason.
|
|
9
|
-
|
|
10
|
-
import { callerSessionId, request } from "./_ipc.mjs";
|
|
11
|
-
|
|
12
|
-
// `fromSessionId` is what lets the daemon mark this agent's own line. It comes from the
|
|
13
|
-
// session's environment, so a bare shell run of this script sends nothing and the roster
|
|
14
|
-
// comes back unmarked.
|
|
15
|
-
const reply = await request(
|
|
16
|
-
{
|
|
17
|
-
t: "roster",
|
|
18
|
-
id: "cli",
|
|
19
|
-
refresh: true,
|
|
20
|
-
...(callerSessionId() ? { fromSessionId: callerSessionId() } : {}),
|
|
21
|
-
// Fallback for the window where the daemon has not yet resolved this session's repo —
|
|
22
|
-
// the same hint the MCP server sends. Without it an unplaceable caller falls through to
|
|
23
|
-
// pure recency across every session on the machine, so `/popover:team` run in one repo
|
|
24
|
-
// could print the roster for another, under a heading claiming it was this one.
|
|
25
|
-
cwd: process.cwd(),
|
|
26
|
-
},
|
|
27
|
-
{ timeoutMs: 8000 },
|
|
28
|
-
);
|
|
29
|
-
|
|
30
|
-
if (!reply) {
|
|
31
|
-
console.log(
|
|
32
|
-
"The popover daemon is not running on this machine, so teammate agents are not visible.\n" +
|
|
33
|
-
"Start it with `popover daemon start`, or check `popover doctor`.",
|
|
34
|
-
);
|
|
35
|
-
} else if (reply.t === "error") {
|
|
36
|
-
// The daemon distinguishes "no credentials" from "signed in but cannot connect", so
|
|
37
|
-
// relay its message rather than assuming the user has not logged in.
|
|
38
|
-
console.log(
|
|
39
|
-
reply.code === "not_authenticated"
|
|
40
|
-
? reply.message
|
|
41
|
-
: `Could not load the team roster: ${reply.message}`,
|
|
42
|
-
);
|
|
43
|
-
} else if (reply.t === "roster.ok") {
|
|
44
|
-
console.log(reply.rendered);
|
|
45
|
-
if (reply.stale) {
|
|
46
|
-
console.log("\n(Showing cached data — the backend was unreachable.)");
|
|
47
|
-
}
|
|
48
|
-
} else {
|
|
49
|
-
console.log("The popover daemon returned an unexpected response.");
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
process.exit(0);
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Renders the /team menu.
|
|
3
|
+
//
|
|
4
|
+
// Invoked from the command's `!` injection, so its stdout becomes part of the prompt
|
|
5
|
+
// Claude sees. Two consequences shape everything here:
|
|
6
|
+
// - always exit 0. A non-zero exit aborts the whole slash command.
|
|
7
|
+
// - always print something useful. If the daemon is down, say so in words the model
|
|
8
|
+
// can relay, rather than printing an empty section and letting it invent a reason.
|
|
9
|
+
|
|
10
|
+
import { callerSessionId, request } from "./_ipc.mjs";
|
|
11
|
+
|
|
12
|
+
// `fromSessionId` is what lets the daemon mark this agent's own line. It comes from the
|
|
13
|
+
// session's environment, so a bare shell run of this script sends nothing and the roster
|
|
14
|
+
// comes back unmarked.
|
|
15
|
+
const reply = await request(
|
|
16
|
+
{
|
|
17
|
+
t: "roster",
|
|
18
|
+
id: "cli",
|
|
19
|
+
refresh: true,
|
|
20
|
+
...(callerSessionId() ? { fromSessionId: callerSessionId() } : {}),
|
|
21
|
+
// Fallback for the window where the daemon has not yet resolved this session's repo —
|
|
22
|
+
// the same hint the MCP server sends. Without it an unplaceable caller falls through to
|
|
23
|
+
// pure recency across every session on the machine, so `/popover:team` run in one repo
|
|
24
|
+
// could print the roster for another, under a heading claiming it was this one.
|
|
25
|
+
cwd: process.cwd(),
|
|
26
|
+
},
|
|
27
|
+
{ timeoutMs: 8000 },
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
if (!reply) {
|
|
31
|
+
console.log(
|
|
32
|
+
"The popover daemon is not running on this machine, so teammate agents are not visible.\n" +
|
|
33
|
+
"Start it with `popover daemon start`, or check `popover doctor`.",
|
|
34
|
+
);
|
|
35
|
+
} else if (reply.t === "error") {
|
|
36
|
+
// The daemon distinguishes "no credentials" from "signed in but cannot connect", so
|
|
37
|
+
// relay its message rather than assuming the user has not logged in.
|
|
38
|
+
console.log(
|
|
39
|
+
reply.code === "not_authenticated"
|
|
40
|
+
? reply.message
|
|
41
|
+
: `Could not load the team roster: ${reply.message}`,
|
|
42
|
+
);
|
|
43
|
+
} else if (reply.t === "roster.ok") {
|
|
44
|
+
console.log(reply.rendered);
|
|
45
|
+
if (reply.stale) {
|
|
46
|
+
console.log("\n(Showing cached data — the backend was unreachable.)");
|
|
47
|
+
}
|
|
48
|
+
} else {
|
|
49
|
+
console.log("The popover daemon returned an unexpected response.");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
process.exit(0);
|
|
@@ -1,168 +1,175 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: popover
|
|
3
|
-
description: "Judgment for reaching a teammate's Claude Code agent *without being asked to* — when it is worth spending their tokens, and which of /popover:team, /popover:ask, /popover:tell and /popover:fork fits. Nothing to invoke by hand: use it 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
|
-
---
|
|
5
|
-
|
|
6
|
-
# popover
|
|
7
|
-
|
|
8
|
-
Your teammates are running their own Claude Code sessions in this repo. Each one has
|
|
9
|
-
accumulated context you do not have: the alternatives they rejected, the constraint that
|
|
10
|
-
forced an awkward shape, what they changed twenty minutes ago and have not pushed. popover
|
|
11
|
-
lets you reach those agents.
|
|
12
|
-
|
|
13
|
-
**This skill is not a command, and there is nothing here for a user to invoke.** The
|
|
14
|
-
commands are the things a user types:
|
|
15
|
-
|
|
16
|
-
| | |
|
|
17
|
-
| --- | --- |
|
|
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 |
|
|
21
|
-
| `/popover:fork` | hand this whole conversation to a teammate |
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
- **You are about to
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
- **
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
1
|
+
---
|
|
2
|
+
name: popover
|
|
3
|
+
description: "Judgment for reaching a teammate's Claude Code agent *without being asked to* — when it is worth spending their tokens, and which of /popover:team, /popover:ask, /popover:tell and /popover:fork fits. Nothing to invoke by hand: use it 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
|
+
---
|
|
5
|
+
|
|
6
|
+
# popover
|
|
7
|
+
|
|
8
|
+
Your teammates are running their own Claude Code sessions in this repo. Each one has
|
|
9
|
+
accumulated context you do not have: the alternatives they rejected, the constraint that
|
|
10
|
+
forced an awkward shape, what they changed twenty minutes ago and have not pushed. popover
|
|
11
|
+
lets you reach those agents.
|
|
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:
|
|
15
|
+
|
|
16
|
+
| | |
|
|
17
|
+
| --- | --- |
|
|
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 |
|
|
21
|
+
| `/popover:fork` | hand this whole conversation to a teammate |
|
|
22
|
+
| `/popover:vault` | publish this conversation to the team's archive, or ask one already there |
|
|
23
|
+
|
|
24
|
+
This file is the judgment around them: when reaching for one is worth it, which one fits, and
|
|
25
|
+
what each one spends. It exists because the moment to use popover rarely announces itself. The
|
|
26
|
+
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.
|
|
29
|
+
|
|
30
|
+
## The five tools
|
|
31
|
+
|
|
32
|
+
They arrive as deferred MCP tools, so you have their names but not their schemas. Load them
|
|
33
|
+
before use:
|
|
34
|
+
|
|
35
|
+
```
|
|
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")
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Their own descriptions are detailed and authoritative on arguments and limits — read them
|
|
40
|
+
once loaded rather than guessing. In short:
|
|
41
|
+
|
|
42
|
+
- **`team_list`** — who is active in this repo, what they are doing, and each one's short
|
|
43
|
+
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.
|
|
49
|
+
- **`vault_search`** — search the conversations your team has frozen and published. Free, no
|
|
50
|
+
model, nothing resumed. Not limited to this repo, and not limited to people who are working
|
|
51
|
+
right now. Always the first of the two.
|
|
52
|
+
- **`vault_ask`** — one question to one vault, answered from its frozen context on *this*
|
|
53
|
+
machine at your user's expense. Roughly $0.50 and up to 90 seconds. Never call it on a
|
|
54
|
+
vault you have not seen in a search result.
|
|
55
|
+
|
|
56
|
+
## When to reach for it on your own
|
|
57
|
+
|
|
58
|
+
Check the roster and consider an ask when:
|
|
59
|
+
|
|
60
|
+
- **The user asks *why*** — why a library was chosen, why a function is shaped oddly, why an
|
|
61
|
+
obvious approach was not taken — **and the repo does not answer it.** Read the code, the
|
|
62
|
+
comments, `git log`, `git blame`, and `CLAUDE.md` first. If the reasoning is not written
|
|
63
|
+
down anywhere, that is precisely the case popover was built for: it exists only in
|
|
64
|
+
somebody's session.
|
|
65
|
+
- **You are about to start something that may already be underway** — a rename spanning many
|
|
66
|
+
files, a dependency bump, a refactor of a shared module. One `team_list` costs almost
|
|
67
|
+
nothing and can save the user an afternoon of conflicted work.
|
|
68
|
+
- **You are blocked by something you did not break** — a migration that appears unapplied, a
|
|
69
|
+
failing build on untouched code, an endpoint that disagrees with its own types. Ask the
|
|
70
|
+
person whose agent is in that area before you debug their in-flight change as if it were a
|
|
71
|
+
bug.
|
|
72
|
+
- **You are about to edit a file a teammate's agent is working in right now.** The roster
|
|
73
|
+
often says what each agent is doing. Prefer a `tell` here — it is a collision, not a
|
|
74
|
+
question.
|
|
75
|
+
- **The user names a colleague.** "Did Bob get the webhook working?", "what is Sarah doing to
|
|
76
|
+
globals.css" — that is a direct signal, and you do not need to be asked twice.
|
|
77
|
+
|
|
78
|
+
Say what you are doing and why before you ask, in a line. The user should never be surprised
|
|
79
|
+
that you spent a teammate's tokens.
|
|
80
|
+
|
|
81
|
+
## When not to
|
|
82
|
+
|
|
83
|
+
- **When the repo can answer.** Reading is free and instant; an ask runs on someone else's
|
|
84
|
+
machine at their expense. Exhaust local evidence first, always.
|
|
85
|
+
- **For curiosity or completeness.** Do not ask because a second opinion would be tidy. Ask
|
|
86
|
+
because you are stuck and they are not.
|
|
87
|
+
- **More than one agent per question.** Never fan out across the roster to see who answers
|
|
88
|
+
best. Pick the one that fits; if none obviously does, show the user the roster instead.
|
|
89
|
+
- **To hand off work.** A `tell` is information, not a directive — the receiving agent is
|
|
90
|
+
explicitly told to treat it that way — and an ask talks to a read-only copy that cannot act.
|
|
91
|
+
Neither one delegates. If the user wants a colleague to *do* something, say plainly that
|
|
92
|
+
popover does not do that, and let them message the human.
|
|
93
|
+
- **For anything outside this repo.** Only agents in the same repository are visible or
|
|
94
|
+
reachable. An empty roster means nobody else is working *here* — not that the team is idle.
|
|
95
|
+
Phrase it that way, or you will imply something false about your user's colleagues.
|
|
96
|
+
|
|
97
|
+
## The cost asymmetry, which governs consent
|
|
98
|
+
|
|
99
|
+
Three tools, three different things being spent:
|
|
100
|
+
|
|
101
|
+
| | Costs | Ask the user first? |
|
|
102
|
+
| --- | --- | --- |
|
|
103
|
+
| `team_list` | Nothing meaningful | No — just do it |
|
|
104
|
+
| `team_ask` | The teammate's tokens and compute, on their machine. Interrupts nobody. | No, but say you are doing it |
|
|
105
|
+
| `team_tell` | A colleague's **attention**. It lands in their live session and notifies them. | **Yes, every time** |
|
|
106
|
+
|
|
107
|
+
`team_tell` is the only thing in popover that reaches a running agent. Treat it as something
|
|
108
|
+
the user should have deliberately meant to do, and confirm before sending. It is also rate
|
|
109
|
+
limited to 10 messages an hour to any one agent, which is a hint about its intended frequency.
|
|
110
|
+
|
|
111
|
+
If it is genuinely ambiguous whether to ask or tell, ask. It interrupts nobody.
|
|
112
|
+
|
|
113
|
+
## Writing an ask worth the money
|
|
114
|
+
|
|
115
|
+
The answering agent has none of your conversation. It cannot see the file you are looking at
|
|
116
|
+
or the error you just read. So make the question stand alone:
|
|
117
|
+
|
|
118
|
+
- Expand every pronoun and vague reference. "that bug" → "the token refresh bug in the auth
|
|
119
|
+
service".
|
|
120
|
+
- Name files by path, and say what you are trying to do, not only what you want to know.
|
|
121
|
+
- Ask one well-formed question, not three exploratory ones. You get one round trip for the
|
|
122
|
+
price.
|
|
123
|
+
|
|
124
|
+
A poor ask — *"why is it done this way?"* — comes back useless and you have spent a
|
|
125
|
+
colleague's tokens to learn nothing. A good one — *"`apps/web/src/lib/auth-redirect.ts`
|
|
126
|
+
derives the origin from the request Host header, with a comment saying
|
|
127
|
+
`NEXT_PUBLIC_APP_URL` still points at the old Vercel domain. Is that variable going to be
|
|
128
|
+
corrected, or is reading Host the intended long-term approach?"* — comes back with the
|
|
129
|
+
reasoning, because that is knowledge about shared state that lives in a person's head rather
|
|
130
|
+
than in the repo.
|
|
131
|
+
|
|
132
|
+
Never invent a handle. Use only what `team_list` returned, and note that a handle from
|
|
133
|
+
earlier in this conversation may have gone out of scope since. If the tool says it does not
|
|
134
|
+
match, relay that instead of trying a different agent.
|
|
135
|
+
|
|
136
|
+
## Forks are a different thing
|
|
137
|
+
|
|
138
|
+
A fork hands over **this entire conversation**, frozen, and the recipient continues it in
|
|
139
|
+
their own session. Nothing comes back. That includes the contents of every file read into the
|
|
140
|
+
context, so it is a far larger disclosure than an ask.
|
|
141
|
+
|
|
142
|
+
**Creating one is the user's alone.** It happens when they ask for it in as many words, never
|
|
143
|
+
on their behalf — and "that would be useful" is not a yes.
|
|
144
|
+
|
|
145
|
+
Saying that a fork would fit is a different act from making one, and it is worth doing once.
|
|
146
|
+
The moment for a fork is one the user is usually too deep in the work to notice: they are going
|
|
147
|
+
off shift, or about to re-explain an hour of debugging to a colleague by hand, or trading asks
|
|
148
|
+
back and forth on what was never really one question. Say so plainly, say what the fork would
|
|
149
|
+
include, and leave it there. If they pass, do not raise it again.
|
|
150
|
+
|
|
151
|
+
When the user wants an *answer* rather than to hand over the whole conversation, an ask is the
|
|
152
|
+
cheaper and more private thing. Offer that instead.
|
|
153
|
+
|
|
154
|
+
## When it does not work
|
|
155
|
+
|
|
156
|
+
The tools return errors as text; relay them rather than retrying with different arguments.
|
|
157
|
+
|
|
158
|
+
- **"the popover daemon is not running"** — teammate agents are unreachable from this machine.
|
|
159
|
+
`popover daemon start`, or `popover doctor` to diagnose. Do not treat it as an empty roster.
|
|
160
|
+
- **Empty roster** — print what the tool returned verbatim; it knows whether the answer is
|
|
161
|
+
"nobody is working here" or something else. Do not paraphrase it into "your team is idle".
|
|
162
|
+
- **Handle does not match** — relay it. Do not guess at another agent.
|
|
163
|
+
- **Ask times out** — say so. Their machine may be busy or the session may have ended. Do not
|
|
164
|
+
silently re-ask.
|
|
165
|
+
|
|
166
|
+
## The user-facing commands
|
|
167
|
+
|
|
168
|
+
The four commands carry the full flows for when the user drives this explicitly — how to
|
|
169
|
+
present a roster, how to word an ask, how to take delivery of a fork. Do not restate their
|
|
170
|
+
steps here or work around them: **when the user invokes a command, follow that command.** This
|
|
171
|
+
skill is for the other case, where nobody invoked anything and you noticed the moment yourself.
|
|
172
|
+
|
|
173
|
+
When you act on your own, prefer naming the command you are standing in for — "I'll run the
|
|
174
|
+
equivalent of `/popover:ask B1`" — so the user learns the surface they can drive directly next
|
|
175
|
+
time.
|