@popoverinstall/cli 0.8.0 → 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.
Files changed (60) hide show
  1. package/CHANGELOG.md +196 -69
  2. package/LICENSE +21 -21
  3. package/README.md +142 -141
  4. package/dist/config-command.d.ts +2 -0
  5. package/dist/config-command.d.ts.map +1 -0
  6. package/dist/config-command.js +80 -0
  7. package/dist/config-command.js.map +1 -0
  8. package/dist/cursor-hooks.d.ts +18 -0
  9. package/dist/cursor-hooks.d.ts.map +1 -0
  10. package/dist/cursor-hooks.js +105 -0
  11. package/dist/cursor-hooks.js.map +1 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +46 -25
  14. package/dist/index.js.map +1 -1
  15. package/dist/keys.d.ts +10 -0
  16. package/dist/keys.d.ts.map +1 -0
  17. package/dist/keys.js +44 -0
  18. package/dist/keys.js.map +1 -0
  19. package/dist/next-steps.d.ts +1 -5
  20. package/dist/next-steps.d.ts.map +1 -1
  21. package/dist/next-steps.js +9 -5
  22. package/dist/next-steps.js.map +1 -1
  23. package/dist/repo-scan.d.ts +130 -0
  24. package/dist/repo-scan.d.ts.map +1 -0
  25. package/dist/repo-scan.js +281 -0
  26. package/dist/repo-scan.js.map +1 -0
  27. package/dist/repos.d.ts +180 -0
  28. package/dist/repos.d.ts.map +1 -0
  29. package/dist/repos.js +1002 -0
  30. package/dist/repos.js.map +1 -0
  31. package/dist/snapshot.d.ts +35 -0
  32. package/dist/snapshot.d.ts.map +1 -1
  33. package/dist/snapshot.js +16 -16
  34. package/dist/snapshot.js.map +1 -1
  35. package/dist/terminal.d.ts.map +1 -1
  36. package/dist/terminal.js +21 -0
  37. package/dist/terminal.js.map +1 -1
  38. package/dist/vaults.d.ts +276 -0
  39. package/dist/vaults.d.ts.map +1 -0
  40. package/dist/vaults.js +1224 -0
  41. package/dist/vaults.js.map +1 -0
  42. package/package.json +47 -47
  43. package/plugin/.claude-plugin/plugin.json +19 -19
  44. package/plugin/.mcp.json +9 -9
  45. package/plugin/README.md +84 -76
  46. package/plugin/commands/ask.md +65 -65
  47. package/plugin/commands/fork.md +119 -118
  48. package/plugin/commands/repos.md +107 -0
  49. package/plugin/commands/team.md +60 -60
  50. package/plugin/commands/tell.md +66 -66
  51. package/plugin/commands/vault.md +173 -0
  52. package/plugin/hooks/hooks.json +111 -111
  53. package/plugin/mcp/index.mjs +585 -355
  54. package/plugin/scripts/_ipc.mjs +146 -146
  55. package/plugin/scripts/announce-roster.mjs +141 -131
  56. package/plugin/scripts/deliver-messages.mjs +77 -77
  57. package/plugin/scripts/emit-event.mjs +44 -44
  58. package/plugin/scripts/ensure-daemon.mjs +156 -156
  59. package/plugin/scripts/roster.mjs +52 -52
  60. package/plugin/skills/popover/SKILL.md +175 -160
@@ -1,118 +1,119 @@
1
- ---
2
- description: Share this conversation as a fork a teammate can carry on, or open one you were sent
3
- # Quoted because an unquoted value starting with `[` is parsed as a YAML flow sequence,
4
- # which fails and silently drops EVERY field here, allowed-tools included.
5
- argument-hint: "[create|open] [code]"
6
- allowed-tools: Bash(popover fork *), AskUserQuestion
7
- ---
8
-
9
- # Fork this conversation
10
-
11
- The user ran `/popover:fork`. Arguments, which may be empty: **$ARGUMENTS**
12
-
13
- This session's id is `${CLAUDE_SESSION_ID}`. You will need it for `create`.
14
-
15
- A fork is not an ask. An ask sends a teammate's question to a read-only copy of someone's
16
- session and brings back one answer. A fork hands over **the whole conversation**, frozen at
17
- the moment it was made, and the person who opens it gets their own local chat that continues
18
- from there. Nothing they do in it comes back here.
19
-
20
- The first word of the arguments chooses what to do. Follow exactly one of these paths.
21
-
22
- ## 1. `create` — freeze this conversation and get a code
23
-
24
- Run:
25
-
26
- ```
27
- popover fork create --session ${CLAUDE_SESSION_ID} --json
28
- ```
29
-
30
- On `ok: true`, show the user the code on its own line so it is easy to copy, then tell them,
31
- briefly and in this order:
32
-
33
- - Who it is for and how they open it: `popover fork open <code>`, or
34
- `npx @popoverinstall/cli fork open <code>` if they do not have popover yet.
35
- - That the code stops working in 24 hours, but a chat someone has already opened does not —
36
- it is theirs from then on.
37
- - That it is frozen at `last_turn_at`, so nothing said after this point is included. If they
38
- keep working and want the newer state shared, they run `create` again for a new code.
39
- - That this sends the entire conversation, including the contents of every file read into
40
- it. Say it plainly, once. It is a much larger disclosure than an ask and the user should
41
- make it deliberately.
42
-
43
- On `ok: false`, relay `message` and the `hints` verbatim. Do not retry with different flags.
44
-
45
- ## 2. `open <code>` — take delivery of a fork
46
-
47
- Run:
48
-
49
- ```
50
- popover fork open <the code they typed> --json
51
- ```
52
-
53
- On `ok: false`, relay `message` and `hints` and stop.
54
-
55
- On `ok: true`, tell them what arrived: who shared it, the title if there is one,
56
- `entry_count` messages, when it was frozen, and which repo it came from. Then surface
57
- whatever the output flags:
58
-
59
- - `repo_match: "different"` — say which repo it came from and which one they are in, and
60
- that the conversation will refer to files they may not have.
61
- - `repo_match: "unknown"` — they are not in a git repository, so paths in it may not resolve.
62
- - `version_skew` — relay it as a note, not a blocker.
63
- - `claude_problem` — this one *is* a blocker. Relay it and stop.
64
-
65
- Then explain why this needs a window of its own, and offer the choice.
66
-
67
- **A fork cannot open inside this chat.** A running Claude Code session cannot become a
68
- different session — one chat holds one conversation, and this one already has its own. So
69
- the fork starts as a second session in a new window. If this conversation has real context
70
- in it already, say that plainly; if the user only just started here, one short line is
71
- enough.
72
-
73
- Then call `AskUserQuestion` with exactly these two options, so Esc cancels:
74
-
75
- - **Open a new window** — "Start the fork in its own terminal window"
76
- - **Print the command** — "Show the command and let me run it myself"
77
-
78
- If they choose to open a new window, run:
79
-
80
- ```
81
- popover fork launch <stage_id> --json
82
- ```
83
-
84
- Then report what happened: `opened: true` means a window is on its way, and it is worth
85
- adding that the fork may take a moment to appear. `opened: false` is not a failure — it
86
- happens over SSH, in a container, and anywhere there is no window to open — so show them
87
- `command` and the `cwd` to run it in.
88
-
89
- If they choose to print the command, run the same thing with `--here` instead of no flag,
90
- and show them the `command` it prints. `--here` writes the fork without trying to open
91
- anything.
92
-
93
- If they press Esc, stop. Nothing has been written to their machine yet, and there is nothing
94
- to clean up.
95
-
96
- ## 3. No arguments, or anything else
97
-
98
- Say what the two halves do in two lines, and stop:
99
-
100
- `/popover:fork create` · `/popover:fork open PQRS-2345-BCDF-7892`
101
-
102
- Do not create a fork on the user's behalf just because they ran the command with no
103
- arguments. Sharing a conversation is a disclosure, and it should always be something they
104
- asked for in as many words.
105
-
106
- ## Rules
107
-
108
- - Never invent or guess at a code. If what they typed is rejected, relay that and let them
109
- paste it again a code is 16 characters in four groups and is easy to truncate.
110
- - Never print a code the user has not seen; it is the entire credential and the decryption
111
- key for the conversation behind it.
112
- - A fork is one-way. If the user seems to want an answer rather than to hand over the whole
113
- conversation, say that `/popover:ask` is the cheaper thing and offer it instead.
114
- - Do not run `create` and then immediately `open` the result to "test" it. Every open counts
115
- against what the sharer sees, and the fork is already verified by the command exiting
116
- cleanly.
117
- - `popover fork revoke <code>` destroys a snapshot early. It cannot recall a copy someone
118
- has already opened; if the user is worried about that, say so rather than reassuring them.
1
+ ---
2
+ description: Share this conversation as a fork a teammate can carry on, or open one you were sent
3
+ # Quoted because an unquoted value starting with `[` is parsed as a YAML flow sequence,
4
+ # which fails and silently drops EVERY field here, allowed-tools included.
5
+ argument-hint: "[create|open] [code]"
6
+ allowed-tools: Bash(popover fork *), AskUserQuestion
7
+ ---
8
+
9
+ # Fork this conversation
10
+
11
+ The user ran `/popover:fork`. Arguments, which may be empty: **$ARGUMENTS**
12
+
13
+ This session's id is `${CLAUDE_SESSION_ID}`. You will need it for `create`.
14
+
15
+ A fork is not an ask. An ask sends a teammate's question to a read-only copy of someone's
16
+ session and brings back one answer. A fork hands over **the whole conversation**, frozen at
17
+ the moment it was made, and the person who opens it gets their own local chat that continues
18
+ from there. Nothing they do in it comes back here.
19
+
20
+ The first word of the arguments chooses what to do. Follow exactly one of these paths.
21
+
22
+ ## 1. `create` — freeze this conversation and get a code
23
+
24
+ Run:
25
+
26
+ ```
27
+ popover fork create --session ${CLAUDE_SESSION_ID} --json
28
+ ```
29
+
30
+ On `ok: true`, show the user the code on its own line so it is easy to copy, then tell them,
31
+ briefly and in this order:
32
+
33
+ - Who it is for and how they open it: `popover fork open <code>`, or
34
+ `npx @popoverinstall/cli fork open <code>` if they do not have popover yet.
35
+ - That the code stops working in 24 hours, but a chat someone has already opened does not —
36
+ it is theirs from then on.
37
+ - That it is frozen at `last_turn_at`, so nothing said after this point is included. If they
38
+ keep working and want the newer state shared, they run `create` again for a new code.
39
+ - That this sends the entire conversation, including the contents of every file read into
40
+ it. Say it plainly, once. It is a much larger disclosure than an ask and the user should
41
+ make it deliberately.
42
+
43
+ On `ok: false`, relay `message` and the `hints` verbatim. Do not retry with different flags.
44
+
45
+ ## 2. `open <code>` — take delivery of a fork
46
+
47
+ Run:
48
+
49
+ ```
50
+ popover fork open <the code they typed> --json
51
+ ```
52
+
53
+ On `ok: false`, relay `message` and `hints` and stop.
54
+
55
+ On `ok: true`, tell them what arrived: who shared it, the title if there is one,
56
+ `entry_count` messages, when it was frozen, and which repo it came from. Then surface
57
+ whatever the output flags:
58
+
59
+ - `repo_match: "different"` — say which repo it came from and which one they are in, and
60
+ that the conversation will refer to files they may not have.
61
+ - `repo_match: "unknown"` — they are not in a git repository, so paths in it may not resolve.
62
+ - `version_skew` — relay it as a note, not a blocker.
63
+ - `claude_problem` — this one *is* a blocker. Relay it and stop.
64
+
65
+ Then explain why this needs a window of its own, and offer the choice.
66
+
67
+ **A fork cannot open inside this chat.** A running Claude Code session cannot become a
68
+ different session — one chat holds one conversation, and this one already has its own. So
69
+ the fork starts as a second session in a new window. If this conversation has real context
70
+ in it already, say that plainly; if the user only just started here, one short line is
71
+ enough.
72
+
73
+ Then call `AskUserQuestion` with exactly these two options, so Esc cancels:
74
+
75
+ - **Open a new window** — "Start the fork in its own terminal window"
76
+ - **Print the command** — "Show the command and let me run it myself"
77
+
78
+ If they choose to open a new window, run:
79
+
80
+ ```
81
+ popover fork launch <stage_id> --json
82
+ ```
83
+
84
+ Then report what happened: `opened: true` means a window is on its way, and it is worth
85
+ adding that the fork may take a moment to appear. `opened: false` is not a failure — it
86
+ happens over SSH, in a container, and anywhere there is no window to open — so show them
87
+ `command` and the `cwd` to run it in.
88
+
89
+ If they choose to print the command, run the same thing with `--here` instead of no flag,
90
+ and show them the `command` it prints. `--here` writes the fork without trying to open
91
+ anything.
92
+
93
+ If they press Esc, stop. Nothing has been written to their machine yet, and there is nothing
94
+ to clean up.
95
+
96
+ ## 3. No arguments, or anything else
97
+
98
+ Say what the two halves do in two lines, and stop:
99
+
100
+ `/popover:fork create` · `/popover:fork open PQRS-2345-BCDF-7892`
101
+
102
+ Do not create a fork on the user's behalf just because they ran the command with no
103
+ arguments. Suggesting a fork is fair game, and the popover skill says when — but creating
104
+ one is a disclosure the user has to have chosen. An empty invocation is someone looking, not
105
+ someone choosing.
106
+
107
+ ## Rules
108
+
109
+ - Never invent or guess at a code. If what they typed is rejected, relay that and let them
110
+ paste it again a code is 16 characters in four groups and is easy to truncate.
111
+ - Never print a code the user has not seen; it is the entire credential and the decryption
112
+ key for the conversation behind it.
113
+ - A fork is one-way. If the user seems to want an answer rather than to hand over the whole
114
+ conversation, say that `/popover:ask` is the cheaper thing and offer it instead.
115
+ - Do not run `create` and then immediately `open` the result to "test" it. Every open counts
116
+ against what the sharer sees, and the fork is already verified by the command exiting
117
+ cleanly.
118
+ - `popover fork revoke <code>` destroys a snapshot early. It cannot recall a copy someone
119
+ has already opened; if the user is worried about that, say so rather than reassuring them.
@@ -0,0 +1,107 @@
1
+ ---
2
+ description: Show which repos your teams treat as one product, and add the one you are in
3
+ # Quoted because an unquoted value starting with `[` is parsed as a YAML flow sequence,
4
+ # which fails and silently drops EVERY field here, allowed-tools included.
5
+ argument-hint: "[add] [team]"
6
+ # Two narrow permissions rather than `Bash(popover repos *)`, so that `rm` is not reachable
7
+ # from here even by accident. See "What this command will not do".
8
+ allowed-tools: Bash(popover repos --json), Bash(popover repos add *), AskUserQuestion
9
+ ---
10
+
11
+ # Team repos
12
+
13
+ The user ran `/popover:repos`. Arguments, which may be empty: **$ARGUMENTS**
14
+
15
+ Two agents can see, ask and tell each other when they share a team **and** share a repo. A
16
+ team's repo list is what makes `backend`, `app` and `firmware` count as one repo for that
17
+ purpose — without it, an agent in one cannot reach an agent in another however obviously they
18
+ are the same product.
19
+
20
+ Which repo this command is about comes from **the directory you are in**. There is no repo
21
+ argument anywhere, deliberately: registering one proves you hold a clone of it rather than that
22
+ you can spell its name.
23
+
24
+ ## Reporting — always do this first
25
+
26
+ Run:
27
+
28
+ ```
29
+ popover repos --json
30
+ ```
31
+
32
+ On `ok: false`, relay `message` and the `hints` verbatim and stop. Do not retry with different
33
+ flags, and do not try `popover repos` without `--json` to see if it says something friendlier.
34
+
35
+ On `ok: true`, read the fields and say, in a few lines:
36
+
37
+ - `kind` — `repo` means one clone, `workspace` means a directory whose children are repos (the
38
+ orchestrating case), `none` means there is nothing here to register and `message` says why.
39
+ - `status[]` — for each repo here: `onTeams` are the teams that list it, and `published: false`
40
+ means popover holds no key for it, so it cannot be registered yet whatever the user's
41
+ permissions are.
42
+ - `teams[]` — each team, its `listed` repos, and `isAdmin`.
43
+
44
+ Then say what it means for visibility, once, in the user's terms: who can currently see agents
45
+ here, and what listing this repo would change. Do not print the raw JSON.
46
+
47
+ ## Adding
48
+
49
+ Only when the user asked to add, or agreed to after you offered. Run:
50
+
51
+ ```
52
+ popover repos add --json
53
+ ```
54
+
55
+ Add the team name when the user named one, or when the report showed more than one team they
56
+ administer: `popover repos add Quolabs --json`.
57
+
58
+ Success comes back as `ok: true` with `added`, `already` and `unpublished`. Report `added` and
59
+ `already` in one line each. For anything in `unpublished`, say that popover has published no
60
+ session from that clone yet, so there is no key to register — it is not a permissions problem
61
+ and running the command again will not fix it.
62
+
63
+ ### The two refusals you must not paper over
64
+
65
+ `ok: false` with `error: "needs_confirmation"` means this is a **workspace** and adding would
66
+ register several repos at once. The `hints` list them. **Ask the user with `AskUserQuestion`**
67
+ before re-running with `--yes`. Registering a repo decides who can see whose agents; a list of
68
+ three where the user was thinking of one is not a detail to assume through.
69
+
70
+ `ok: false` with `error: "ambiguous_team"` means they administer more than one team. Ask which,
71
+ with `AskUserQuestion`, and re-run naming it. Never pick for them.
72
+
73
+ Every other `ok: false` — `not_admin`, `github_not_linked`, `github_scope_missing`,
74
+ `not_repo_admin`, `not_github`, `github_org_restricted` — is a refusal with an explanation.
75
+ Relay `message` and `hints` as they are. They are worded carefully and three of them are easy
76
+ to garble:
77
+
78
+ - `github_scope_missing` is **not** "you have no GitHub account". They almost certainly signed
79
+ in with GitHub. Repository access is a separate, heavier consent that is only asked for when
80
+ a repo is added.
81
+ - `github_org_restricted` is **not** "that repo does not exist". GitHub answers 404 for a
82
+ private repo whose organization has not approved popover, and this only ever comes up for a
83
+ repo the user demonstrably has a clone of. An owner of that GitHub organization has to
84
+ approve popover.
85
+ - `not_admin` names who to ask. Pass the names on; that is what makes it actionable.
86
+
87
+ ## What this command will not do
88
+
89
+ **It does not remove a repo.** That is `popover repos rm`, in a terminal, and it is missing
90
+ here on purpose rather than by oversight — removing a repo takes *other people's* agents out of
91
+ scope at the next check, and they will not be told why. It should be a thing a human typed.
92
+ If the user asks to remove one, say that plainly and give them the command:
93
+
94
+ `popover repos rm Quolabs`
95
+
96
+ Do not run it through any other tool, and do not talk them out of it either — just make them
97
+ the one who types it.
98
+
99
+ ## Rules
100
+
101
+ - Never claim a repo is listed unless `--json` said so. The whole feature is a gate; a wrong
102
+ answer here reads as "popover is broken" the next time somebody cannot see a teammate.
103
+ - Adding is a team-wide decision. Any member in any listed repo can then reach any agent in any
104
+ listed repo — there are no per-repo permissions. Say so before adding, if the user seems to
105
+ be reaching for a narrower kind of sharing; the answer to that is a second team.
106
+ - Nothing here is retryable by trying harder. Every refusal names a specific thing to change,
107
+ and running the same command twice will produce the same refusal.
@@ -1,60 +1,60 @@
1
- ---
2
- description: Show which of your teammates' Claude Code agents are active in this repo right now
3
- # No argument-hint: this command takes none. The ask/tell tools are still allowed below
4
- # because `/popover:team ask …` was the only form before 0.8.0 and is still carried out.
5
- allowed-tools: mcp__plugin_popover_popover__team_list, mcp__plugin_popover_popover__team_ask, mcp__plugin_popover_popover__team_tell, AskUserQuestion
6
- ---
7
-
8
- # Team agents
9
-
10
- The user ran `/popover:team`. Arguments, which are usually empty: **$ARGUMENTS**
11
-
12
- This command shows the roster. Asking and telling are their own commands now — `/popover:ask`
13
- and `/popover:tell` — because they cost different things and deserve to be chosen, not reached
14
- by a subword.
15
-
16
- ## The roster
17
-
18
- Call `mcp__plugin_popover_popover__team_list`, then print what it returns **verbatim** in a
19
- fenced block. Do not reformat it, re-sort it, or add agents that are not in it.
20
-
21
- Only agents working in **this repo** are visible. A teammate running Claude Code in a different
22
- repository is neither listed nor reachable, so an empty roster means nobody else is working
23
- *here* — not that the team is idle. Say it that way; the tool's own text already knows the
24
- difference, so relay it rather than paraphrasing it into "your team is idle".
25
-
26
- Then add one short line showing where to go next:
27
-
28
- `/popover:ask B1 why did you rule out redis?` · `/popover:tell B1 the migration is applied`
29
-
30
- Stop there. Do not ask or tell anything on the user's behalf.
31
-
32
- ## If they typed `ask` or `tell` anyway
33
-
34
- `/popover:team ask …` and `/popover:team tell …` were the only forms before 0.8.0, so they are
35
- still muscle memory. Do not answer with a correction and nothing else — carry it out, then
36
- mention the shorter command once at the end in a single line. The user gets what they asked for
37
- and learns the new name.
38
-
39
- **`ask <handle> <question>`** — call `mcp__plugin_popover_popover__team_ask` with `target` set
40
- to the handle exactly as typed and `question` set to the rest, rewritten to stand alone: the
41
- answering agent has none of this conversation, so expand every pronoun and vague reference
42
- ("that bug" → "the token refresh bug in the auth service") and name files by path. Show the
43
- answer attributed — `> **B1** (Bob Chen, api-server): …` — then say how it bears on the work in
44
- hand, if it does.
45
-
46
- **`tell <handle> <message>`** — call `mcp__plugin_popover_popover__team_tell` with `target` and
47
- `message`, made self-contained the same way. Nothing comes back; confirm in one line what was
48
- sent and to whom, and stop. A tell is information, not a directive — if the user is trying to
49
- hand over work, say so and offer an ask instead.
50
-
51
- If the tool errors or times out, relay it plainly rather than retrying or trying another agent.
52
-
53
- ## Rules
54
-
55
- - Never invent a handle. Only use ones `team_list` returned.
56
- - Asking costs the *teammate* money and runs on *their* machine. Telling costs their attention
57
- and notifies them. One agent per request either way.
58
- - An answer comes from a read-only copy of their session. Their live session is not interrupted
59
- and cannot be modified by an ask. A tell **is** delivered into their live session, before its
60
- next prompt — that is the one thing in popover that reaches a running agent.
1
+ ---
2
+ description: Show which of your teammates' Claude Code agents are active in this repo right now
3
+ # No argument-hint: this command takes none. The ask/tell tools are still allowed below
4
+ # because `/popover:team ask …` was the only form before 0.8.0 and is still carried out.
5
+ allowed-tools: mcp__plugin_popover_popover__team_list, mcp__plugin_popover_popover__team_ask, mcp__plugin_popover_popover__team_tell, AskUserQuestion
6
+ ---
7
+
8
+ # Team agents
9
+
10
+ The user ran `/popover:team`. Arguments, which are usually empty: **$ARGUMENTS**
11
+
12
+ This command shows the roster. Asking and telling are their own commands now — `/popover:ask`
13
+ and `/popover:tell` — because they cost different things and deserve to be chosen, not reached
14
+ by a subword.
15
+
16
+ ## The roster
17
+
18
+ Call `mcp__plugin_popover_popover__team_list`, then print what it returns **verbatim** in a
19
+ fenced block. Do not reformat it, re-sort it, or add agents that are not in it.
20
+
21
+ Only agents working in **this repo** are visible. A teammate running Claude Code in a different
22
+ repository is neither listed nor reachable, so an empty roster means nobody else is working
23
+ *here* — not that the team is idle. Say it that way; the tool's own text already knows the
24
+ difference, so relay it rather than paraphrasing it into "your team is idle".
25
+
26
+ Then add one short line showing where to go next:
27
+
28
+ `/popover:ask B1 why did you rule out redis?` · `/popover:tell B1 the migration is applied`
29
+
30
+ Stop there. Do not ask or tell anything on the user's behalf.
31
+
32
+ ## If they typed `ask` or `tell` anyway
33
+
34
+ `/popover:team ask …` and `/popover:team tell …` were the only forms before 0.8.0, so they are
35
+ still muscle memory. Do not answer with a correction and nothing else — carry it out, then
36
+ mention the shorter command once at the end in a single line. The user gets what they asked for
37
+ and learns the new name.
38
+
39
+ **`ask <handle> <question>`** — call `mcp__plugin_popover_popover__team_ask` with `target` set
40
+ to the handle exactly as typed and `question` set to the rest, rewritten to stand alone: the
41
+ answering agent has none of this conversation, so expand every pronoun and vague reference
42
+ ("that bug" → "the token refresh bug in the auth service") and name files by path. Show the
43
+ answer attributed — `> **B1** (Bob Chen, api-server): …` — then say how it bears on the work in
44
+ hand, if it does.
45
+
46
+ **`tell <handle> <message>`** — call `mcp__plugin_popover_popover__team_tell` with `target` and
47
+ `message`, made self-contained the same way. Nothing comes back; confirm in one line what was
48
+ sent and to whom, and stop. A tell is information, not a directive — if the user is trying to
49
+ hand over work, say so and offer an ask instead.
50
+
51
+ If the tool errors or times out, relay it plainly rather than retrying or trying another agent.
52
+
53
+ ## Rules
54
+
55
+ - Never invent a handle. Only use ones `team_list` returned.
56
+ - Asking costs the *teammate* money and runs on *their* machine. Telling costs their attention
57
+ and notifies them. One agent per request either way.
58
+ - An answer comes from a read-only copy of their session. Their live session is not interrupted
59
+ and cannot be modified by an ask. A tell **is** delivered into their live session, before its
60
+ next prompt — that is the one thing in popover that reaches a running agent.
@@ -1,66 +1,66 @@
1
- ---
2
- description: Send a short heads-up into a teammate's live session — no answer comes back, and they are notified
3
- # Quoted because an unquoted value starting with `[` is parsed as a YAML flow sequence,
4
- # which fails and silently drops EVERY field here, allowed-tools included.
5
- argument-hint: "[agent-handle] <message>"
6
- allowed-tools: mcp__plugin_popover_popover__team_list, mcp__plugin_popover_popover__team_tell, AskUserQuestion
7
- ---
8
-
9
- # Tell a teammate's agent
10
-
11
- The user ran `/popover:tell`. Arguments, which may be empty: **$ARGUMENTS**
12
-
13
- A tell is the one thing in popover that reaches a **running** agent: it is delivered into a
14
- teammate's live session before its next prompt, and their user is notified. It costs a
15
- colleague's attention rather than their tokens, which is why it is its own command and why the
16
- bar for sending one is higher than for an ask.
17
-
18
- Only agents working in **this repo** are reachable.
19
-
20
- ## No arguments
21
-
22
- Call `mcp__plugin_popover_popover__team_list`, print what it returns **verbatim** in a fenced
23
- block, and show the form:
24
-
25
- `/popover:tell B1 the repo_keys migration is applied on prod`
26
-
27
- Stop there. Do not send anything on the user's behalf.
28
-
29
- ## A handle and a message
30
-
31
- Call `mcp__plugin_popover_popover__team_tell` with:
32
-
33
- - `target`: the handle or name they used, exactly as typed
34
- - `message`: the rest of their message, made **self-contained** — it arrives with no context of
35
- its own, so name the thing rather than referring to it. One or two sentences.
36
-
37
- Nothing comes back. Confirm what was sent and to whom, in one line, and stop:
38
-
39
- > Told **B1** (Bob Chen): the repo_keys migration is applied on prod.
40
-
41
- ## A message with no handle
42
-
43
- Call `mcp__plugin_popover_popover__team_list`, then **confirm the recipient with
44
- `AskUserQuestion` before sending** — up to 4 candidates, label = the handle, description =
45
- owner, repo, and what it is doing. Do this even when only one agent plausibly fits.
46
-
47
- Naming a handle is how the user says *which colleague to interrupt*; if they did not name one,
48
- that choice has not been made yet and it is not yours to make. This is the one place a tell
49
- differs from an ask, which may pick its own target because the only thing it spends is tokens.
50
-
51
- If none fit, show the roster instead. Never broadcast to several agents.
52
-
53
- ## Rules
54
-
55
- - **What a tell is for:** facts about shared state that would otherwise cause a collision — a
56
- migration you just applied, a branch you force-pushed, a file you are about to rewrite that
57
- their agent is working in right now.
58
- - **What it is not for:** instructions or handing over work. The receiving agent is explicitly
59
- told to treat the message as information rather than a directive. If the user is trying to
60
- give another agent a task, say so and offer `/popover:ask` instead — or suggest they message
61
- the human.
62
- - **Never invent a handle**, and do not fan out to several agents unless asked in as many words.
63
- - Rate limited to 10 messages an hour to any one agent, which is a hint about its intended
64
- frequency. If the limit is hit, relay that rather than retrying.
65
- - If it is genuinely ambiguous whether the user meant to ask or tell, prefer **`/popover:ask`**
66
- — it interrupts nobody.
1
+ ---
2
+ description: Send a short heads-up into a teammate's live session — no answer comes back, and they are notified
3
+ # Quoted because an unquoted value starting with `[` is parsed as a YAML flow sequence,
4
+ # which fails and silently drops EVERY field here, allowed-tools included.
5
+ argument-hint: "[agent-handle] <message>"
6
+ allowed-tools: mcp__plugin_popover_popover__team_list, mcp__plugin_popover_popover__team_tell, AskUserQuestion
7
+ ---
8
+
9
+ # Tell a teammate's agent
10
+
11
+ The user ran `/popover:tell`. Arguments, which may be empty: **$ARGUMENTS**
12
+
13
+ A tell is the one thing in popover that reaches a **running** agent: it is delivered into a
14
+ teammate's live session before its next prompt, and their user is notified. It costs a
15
+ colleague's attention rather than their tokens, which is why it is its own command and why the
16
+ bar for sending one is higher than for an ask.
17
+
18
+ Only agents working in **this repo** are reachable.
19
+
20
+ ## No arguments
21
+
22
+ Call `mcp__plugin_popover_popover__team_list`, print what it returns **verbatim** in a fenced
23
+ block, and show the form:
24
+
25
+ `/popover:tell B1 the repo_keys migration is applied on prod`
26
+
27
+ Stop there. Do not send anything on the user's behalf.
28
+
29
+ ## A handle and a message
30
+
31
+ Call `mcp__plugin_popover_popover__team_tell` with:
32
+
33
+ - `target`: the handle or name they used, exactly as typed
34
+ - `message`: the rest of their message, made **self-contained** — it arrives with no context of
35
+ its own, so name the thing rather than referring to it. One or two sentences.
36
+
37
+ Nothing comes back. Confirm what was sent and to whom, in one line, and stop:
38
+
39
+ > Told **B1** (Bob Chen): the repo_keys migration is applied on prod.
40
+
41
+ ## A message with no handle
42
+
43
+ Call `mcp__plugin_popover_popover__team_list`, then **confirm the recipient with
44
+ `AskUserQuestion` before sending** — up to 4 candidates, label = the handle, description =
45
+ owner, repo, and what it is doing. Do this even when only one agent plausibly fits.
46
+
47
+ Naming a handle is how the user says *which colleague to interrupt*; if they did not name one,
48
+ that choice has not been made yet and it is not yours to make. This is the one place a tell
49
+ differs from an ask, which may pick its own target because the only thing it spends is tokens.
50
+
51
+ If none fit, show the roster instead. Never broadcast to several agents.
52
+
53
+ ## Rules
54
+
55
+ - **What a tell is for:** facts about shared state that would otherwise cause a collision — a
56
+ migration you just applied, a branch you force-pushed, a file you are about to rewrite that
57
+ their agent is working in right now.
58
+ - **What it is not for:** instructions or handing over work. The receiving agent is explicitly
59
+ told to treat the message as information rather than a directive. If the user is trying to
60
+ give another agent a task, say so and offer `/popover:ask` instead — or suggest they message
61
+ the human.
62
+ - **Never invent a handle**, and do not fan out to several agents unless asked in as many words.
63
+ - Rate limited to 10 messages an hour to any one agent, which is a hint about its intended
64
+ frequency. If the limit is hit, relay that rather than retrying.
65
+ - If it is genuinely ambiguous whether the user meant to ask or tell, prefer **`/popover:ask`**
66
+ — it interrupts nobody.