@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
package/plugin/commands/fork.md
CHANGED
|
@@ -1,119 +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. 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.
|
|
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.
|
package/plugin/commands/team.md
CHANGED
|
@@ -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.
|
package/plugin/commands/tell.md
CHANGED
|
@@ -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.
|