@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/CHANGELOG.md
CHANGED
|
@@ -7,19 +7,88 @@ The format is parsed by `parseChangelog()` in `packages/shared/src/changelog.ts`
|
|
|
7
7
|
parser doing the reading is the one shipped in the *previous* release, so keep to what is
|
|
8
8
|
already here:
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
* `## <version>` — newest first. Anything that is not a version triple is skipped, so an
|
|
11
11
|
`## Unreleased` heading is safe to keep at the top while a release is in flight.
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
* `### Features` and `### Fixes` — the only two sections that print. Others are ignored.
|
|
13
|
+
* `* ` bullets, one change each — `- ` also parses, and older releases are written with it.
|
|
14
|
+
Wrapped lines are joined; a blank line ends the bullet.
|
|
14
15
|
|
|
15
16
|
Every version that ships needs an entry — an update with nothing to print says nothing at
|
|
16
17
|
all, which reads as though the update did not happen.
|
|
17
18
|
|
|
19
|
+
Illustrate a change with the general case, never with the particular one it was built for.
|
|
20
|
+
The repos, paths, names and measurements that came out of building popover are ours, not the
|
|
21
|
+
reader's: an entry that says "a product split across several repos" lands for everybody,
|
|
22
|
+
where one that names our own three lands for nobody and leaks what we were working on.
|
|
23
|
+
Before, after, and why — stated so that the reader recognises their own situation in it.
|
|
24
|
+
|
|
25
|
+
## 0.9.0
|
|
26
|
+
|
|
27
|
+
### Features
|
|
28
|
+
|
|
29
|
+
* A conversation that worked something out can now be kept. Why a value is the value it is,
|
|
30
|
+
what was tried and abandoned, what the constraint actually turned out to be — all of it used
|
|
31
|
+
to be deleted the moment the session ended, leaving a diff that records what changed and
|
|
32
|
+
never why. Your agent can save one to your team's vault, and anyone on the team can ask it
|
|
33
|
+
afterwards. It answers from its own frozen context, on the asker's machine and at the asker's
|
|
34
|
+
cost, so the person who made it does not have to be online, does not have to still work here,
|
|
35
|
+
and does not pay for your question. `/popover:vault`, or `popover vault` from a terminal.
|
|
36
|
+
|
|
37
|
+
Two things are worth knowing before the first one. Your agent decides when to vault rather
|
|
38
|
+
than offering and waiting for you, which is a deliberate departure from how forks work:
|
|
39
|
+
inside a team the disclosure is small, and the moment worth keeping is one you are usually
|
|
40
|
+
too deep in the work to notice. And a vault is stored somewhere popover can read it, which is
|
|
41
|
+
not true of a fork — a fork's code never reaches our server, and a vault has no code, because
|
|
42
|
+
being on the team is the whole of who can open it.
|
|
43
|
+
|
|
44
|
+
* popover.to/vaults shows everything your team has kept, with what each one can answer, who
|
|
45
|
+
saved it and when it was frozen. Not what it said: a vault is asked, never read, and a page
|
|
46
|
+
that printed the conversation would turn an index your team published into transcripts it
|
|
47
|
+
did not.
|
|
48
|
+
|
|
49
|
+
* Asking is two steps, and the first one is free. Searching what your team has kept costs
|
|
50
|
+
nothing and spends no tokens; only actually putting a question to a vault loads its
|
|
51
|
+
conversation. That is what stops an agent from quietly spending real money fanning out across
|
|
52
|
+
an archive to answer one question, and it is why a vault that nobody has disturbed since it
|
|
53
|
+
was frozen ranks above a newer one whose files have all moved underneath it.
|
|
54
|
+
|
|
55
|
+
* Agents in different repos can now reach each other, when a team says those repos belong
|
|
56
|
+
together. A product split across several repos was that many unrelated islands: an agent in
|
|
57
|
+
one could not list or ask an agent in another, however obviously they were the same piece of
|
|
58
|
+
work. A team admin adds each repo at popover.to/repos or with `popover repos add`, and from
|
|
59
|
+
then on agents in any of them see each other. Nothing changes for a repo nobody has added,
|
|
60
|
+
and adding one requires proving through GitHub that you administer it — so this widens what
|
|
61
|
+
your team can see only where somebody with the authority to say so has said it.
|
|
62
|
+
|
|
63
|
+
* An agent working in a folder *above* several repos is no longer invisible to everyone. If
|
|
64
|
+
you run Claude Code one directory up to coordinate across the clones sitting underneath it,
|
|
65
|
+
that directory is not itself a git repo, and popover had nothing to identify it by — so the
|
|
66
|
+
one agent with the whole picture was the one agent nobody could talk to. It now publishes
|
|
67
|
+
each repo it finds one level down, and appears to teammates in each of them, labelled by the
|
|
68
|
+
repo you share. `popover config workspace-scan off` turns it off.
|
|
69
|
+
|
|
70
|
+
* `popover repos` says which repos your team treats as one product, and adds or removes the
|
|
71
|
+
one you are standing in. It takes no repo argument at any depth, deliberately: which repo it
|
|
72
|
+
means comes from your working directory, because registering one is a claim to have the
|
|
73
|
+
clone rather than to know the name. `/popover:repos` does the same from inside a session.
|
|
74
|
+
|
|
75
|
+
### Fixes
|
|
76
|
+
|
|
77
|
+
* Your view of a repo no longer expires a week after you last worked in it. Access used to
|
|
78
|
+
lapse silently after seven days — you would come back to a project, find your teammates'
|
|
79
|
+
agents missing, and have nothing on screen to tell you why or that opening a session there
|
|
80
|
+
would fix it. **This means you can now see agents in repos you had aged out of, without
|
|
81
|
+
having asked for that.** It is worth knowing rather than discovering: the expiry existed
|
|
82
|
+
because there was no other way for access to a repo to ever end, and a team's repo list is
|
|
83
|
+
now a better one — an admin removes a repo, or removes a person from the team, and it takes
|
|
84
|
+
effect at once instead of in a week. Everything else is unchanged: you still only see people
|
|
85
|
+
you share a team with, and only in repos you have actually cloned.
|
|
86
|
+
|
|
18
87
|
## 0.8.1
|
|
19
88
|
|
|
20
89
|
### Features
|
|
21
90
|
|
|
22
|
-
|
|
91
|
+
* Your agent offers a fork when the moment calls for one, instead of waiting to be asked. It
|
|
23
92
|
used to be told never to suggest one, on the reasoning that handing over a whole
|
|
24
93
|
conversation is a large enough disclosure to be the user's own idea. The effect was that the
|
|
25
94
|
most useful case never came up at all, because the moment for a fork is one you are usually
|
|
@@ -31,7 +100,7 @@ all, which reads as though the update did not happen.
|
|
|
31
100
|
|
|
32
101
|
### Fixes
|
|
33
102
|
|
|
34
|
-
|
|
103
|
+
* Your agent is told who else is working in the repo again. The notice was supposed to appear
|
|
35
104
|
whenever the cast of teammate agents changed, and almost never did: it gave the daemon 250ms
|
|
36
105
|
to answer, and any answer more than five seconds old means fetching from the server, which
|
|
37
106
|
takes about 350ms. So it ran out of time and said nothing — and saying nothing looks exactly
|
|
@@ -39,45 +108,45 @@ all, which reads as though the update did not happen.
|
|
|
39
108
|
answer. If you are working alone it also stops checking every prompt, so you are not paying
|
|
40
109
|
for a lookup that has nothing to report.
|
|
41
110
|
|
|
42
|
-
|
|
111
|
+
* `popover fork revoke` no longer tells you a fork is destroyed when it is not. If the write
|
|
43
112
|
failed, it said "revoked" anyway — the one command whose whole job is undoing a mistake, and
|
|
44
113
|
the one place a false confirmation is worst, because you stop looking. It now says it could
|
|
45
114
|
not and asks you to try again. A code that was already gone still reports success, which is
|
|
46
115
|
deliberate: answering differently would let anyone holding a code learn whether a
|
|
47
116
|
conversation exists.
|
|
48
117
|
|
|
49
|
-
|
|
118
|
+
* Expired forks are actually deleted now. A fork's ciphertext is supposed to be destroyed 24
|
|
50
119
|
hours after it is made, but the cleanup only ever ran when somebody happened to create
|
|
51
120
|
another fork — so on a quiet team, conversations you had shared for a day stayed on the
|
|
52
121
|
server indefinitely. It now runs on a schedule of its own.
|
|
53
122
|
|
|
54
|
-
|
|
123
|
+
* A hiccup on our side no longer signs your machine out. Several of these reported a temporary
|
|
55
124
|
server problem as a permanent refusal: a failed lookup during `popover login` looked like an
|
|
56
125
|
invalid code and abandoned the login, and one during a routine daemon check looked like your
|
|
57
126
|
machine had been revoked — which is not something it retries. They now say the service is
|
|
58
127
|
briefly unavailable, and the daemon keeps its session.
|
|
59
128
|
|
|
60
|
-
|
|
129
|
+
* Opening a fork works on Windows when the folder it came from has a non-ASCII name. The
|
|
61
130
|
console reads a script in its own code page rather than UTF-8, so a path like
|
|
62
131
|
`C:\Users\Renée\work` arrived mangled, the `cd` quietly failed, and the fork opened anyway in
|
|
63
132
|
whatever directory the console started in — looking correct while every file path in the
|
|
64
133
|
conversation pointed somewhere else. It now switches the console to UTF-8 first, and stops
|
|
65
134
|
with a message rather than opening in the wrong place.
|
|
66
135
|
|
|
67
|
-
|
|
136
|
+
* Asks against a long conversation work now. Answering an agent used to run the question past
|
|
68
137
|
Haiku no matter what the agent itself was running, and Haiku holds 200K tokens — so on any
|
|
69
138
|
session bigger than that, Claude Code had to compress the whole conversation before it could
|
|
70
139
|
read it, which took longer than the 90 seconds the asker waits. You got "did not answer in
|
|
71
140
|
time", and the machine being asked had already spent the tokens. The answer now comes from
|
|
72
|
-
the same model the session is already running, which fits by definition:
|
|
73
|
-
|
|
141
|
+
the same model the session is already running, which fits by definition: a conversation that
|
|
142
|
+
used to time out now answers well inside the window. It costs the answering machine
|
|
74
143
|
more per ask, and it is their call — set `POPOVER_FORK_MODEL` to pin a cheaper one.
|
|
75
144
|
|
|
76
145
|
## 0.8.0
|
|
77
146
|
|
|
78
147
|
### Features
|
|
79
148
|
|
|
80
|
-
|
|
149
|
+
* Asking and telling are their own commands. `/popover:ask B1 why did you rule out redis?` and
|
|
81
150
|
`/popover:tell B1 the migration is applied` replace `/popover:team ask …` and
|
|
82
151
|
`/popover:team tell …`, and `/popover:team` is now just the roster. The three cost completely
|
|
83
152
|
different things — the roster costs nothing, an ask spends the teammate's tokens on their
|
|
@@ -85,7 +154,7 @@ all, which reads as though the update did not happen.
|
|
|
85
154
|
behind one first word made the cheapest and the most intrusive look like the same gesture.
|
|
86
155
|
The old forms still work and mention the new name once, so nothing you have already learned
|
|
87
156
|
breaks.
|
|
88
|
-
|
|
157
|
+
* Agents can have names. `popover rename B1 "auth work"` gives one of your agents a name, and
|
|
89
158
|
your teammates see it on their next roster while the dashboard picks it up live — so three
|
|
90
159
|
sessions in the same repo stop being three identical rows of `B1`, `B2`, `B3`. Run
|
|
91
160
|
`popover rename` on its own to pick from a list instead of looking a handle up first. A named
|
|
@@ -93,72 +162,72 @@ all, which reads as though the update did not happen.
|
|
|
93
162
|
reach it. You can only name your own agents, the name goes when the session does, and
|
|
94
163
|
`popover rename B1 ""` takes it off again. Nothing changes for anyone who never uses it: a
|
|
95
164
|
roster with no named agents on it prints exactly as it did before.
|
|
96
|
-
|
|
165
|
+
* The documentation is public. popover.to/docs is the whole of how it works — the roster,
|
|
97
166
|
asking, telling, forking, which agents can see each other, and what leaves your machine —
|
|
98
167
|
and popover.to/changelog is this file, with a URL you can send someone. Neither needs an
|
|
99
168
|
account: until now the only thing a person could read before installing was the poster, so
|
|
100
169
|
deciding whether to run the install command meant asking somebody who already had.
|
|
101
|
-
|
|
170
|
+
* `popover changelog` points at popover.to/changelog when an install has no notes to read,
|
|
102
171
|
rather than at a repository that is private and answers a 404.
|
|
103
172
|
|
|
104
173
|
### Fixes
|
|
105
174
|
|
|
106
|
-
|
|
175
|
+
* Everyone on your team needs this release. The way a repo is identified changed, and a popover
|
|
107
176
|
older than 0.8.0 cannot prove which repo it is in — so an out-of-date machine keeps working
|
|
108
177
|
and keeps its own agents up to date, but goes quiet for the rest of the team until it
|
|
109
178
|
updates. It says so on its own roster and in `popover doctor`, and your roster counts the
|
|
110
179
|
teammates it cannot show you rather than leaving you to wonder where everybody went.
|
|
111
|
-
|
|
180
|
+
* An unrecognised repo identity costs you the identity, not the update. A publish carries every
|
|
112
181
|
session on the machine in one write, so refusing that write over one field it did not like
|
|
113
182
|
took the whole machine off the air — no roster, no status, and its own agents frozen at
|
|
114
183
|
whatever they were last doing — while the connection itself looked perfectly healthy. A value
|
|
115
184
|
we cannot verify is now dropped and the update lands without it.
|
|
116
|
-
|
|
185
|
+
* Working in the same repo is now something popover checks rather than something it takes your
|
|
117
186
|
word for. A repo was identified by the name of its git remote, which anyone can type, so
|
|
118
187
|
anyone on your team could claim to be in a repo they had never cloned and see — and ask —
|
|
119
188
|
the agents working in it. Identity now comes from the repository's own history, which you
|
|
120
189
|
only have if you have actually cloned it, and what reaches the server is a hash of that
|
|
121
190
|
rather than the thing itself, so it cannot be read off one session and reused on another.
|
|
122
|
-
|
|
191
|
+
* Revoking a machine ends it. A revoked machine could quietly un-revoke itself and carry on,
|
|
123
192
|
which made the button on the dashboard a suggestion.
|
|
124
|
-
|
|
193
|
+
* The agent that answers you cannot rewrite what you asked it, and the agent you send a
|
|
125
194
|
message to cannot change who it came from. Both are what `/activity` and `popover log` show
|
|
126
195
|
you afterwards, so both are now fixed at the moment they are written.
|
|
127
|
-
|
|
196
|
+
* Nothing a teammate can type reaches your agent as an instruction. Names, titles and the
|
|
128
197
|
activity shown on the roster are text your agent reads, and a newline in the right place
|
|
129
198
|
could forge a line that looked like popover talking. That text is now bounded and stripped
|
|
130
199
|
of anything that can start a new line, hide itself, or reverse the one it is on.
|
|
131
|
-
|
|
200
|
+
* A laptop and a desktop no longer give two agents the same handle. Both machines numbered
|
|
132
201
|
their own agents from one, so `G1` could mean either, and asking for it reached neither.
|
|
133
202
|
Handles are now handed out where all of your machines can be seen at once.
|
|
134
|
-
|
|
203
|
+
* `popover daemon stop` stops popover and nothing else. It trusted a leftover file naming a
|
|
135
204
|
process id, which the operating system may since have given to something entirely
|
|
136
205
|
unrelated — and `popover update` runs it for you.
|
|
137
|
-
|
|
206
|
+
* `popover update` no longer risks leaving half an install behind on Windows, where a file
|
|
138
207
|
being replaced cannot be one a running program still holds open.
|
|
139
|
-
|
|
208
|
+
* A slow moment no longer takes your agents off your teammates' rosters. If popover could not
|
|
140
209
|
read the list of running sessions — a busy machine, a moment's hesitation — it concluded
|
|
141
210
|
every one of them had ended.
|
|
142
|
-
|
|
211
|
+
* `popover fork revoke` tells you the truth when it fails. It reported that a conversation had
|
|
143
212
|
been destroyed without checking, which is the one command whose word you would not think to
|
|
144
213
|
doubt.
|
|
145
|
-
|
|
214
|
+
* Agents belonging to teammates whose names are not written in the Latin alphabet can be
|
|
146
215
|
reached again. A teammate called 李明 is given the handle 李1, and asking for it matched every
|
|
147
216
|
agent whose handle ended in the same digit — so `/popover:team ask 李1` came back "did you
|
|
148
217
|
mean 李1 or 王1?" with no third thing you could type that would have worked. Their name now
|
|
149
218
|
finds them too, and so does the name of an agent renamed in any script.
|
|
150
|
-
|
|
219
|
+
* The roster lines up its columns for those agents rather than shearing them. Column widths
|
|
151
220
|
were counted in characters, and a character in Chinese, Japanese or Korean takes two columns
|
|
152
221
|
of a terminal, as does an emoji — so every such row drifted a column further left than the
|
|
153
222
|
one above it.
|
|
154
|
-
|
|
223
|
+
* Asking for something with no letters or digits in it — punctuation, or an emoji on its own —
|
|
155
224
|
says nothing matches, instead of matching every agent on the roster at once.
|
|
156
225
|
|
|
157
226
|
## 0.7.2
|
|
158
227
|
|
|
159
228
|
### Fixes
|
|
160
229
|
|
|
161
|
-
|
|
230
|
+
* `popover update` updates the machine on Windows instead of handing you a command. It used
|
|
162
231
|
to print `npm install -g @popoverinstall/cli@latest` and stop, on the belief that replacing
|
|
163
232
|
the `popover.cmd` shim while it was running would corrupt it — npm's shims are built to
|
|
164
233
|
survive exactly that, which is how npm upgrades itself. Worse, the command it printed could
|
|
@@ -168,7 +237,7 @@ all, which reads as though the update did not happen.
|
|
|
168
237
|
metadata rather than trusting the cache, and if a release really has not propagated yet it
|
|
169
238
|
says so and tells you to try again shortly, instead of reporting that the version does not
|
|
170
239
|
exist.
|
|
171
|
-
|
|
240
|
+
* `popover setup` registers the plugin on Windows when your user directory has a space in it.
|
|
172
241
|
It was passing the plugin's path through a shell unquoted, so Claude Code was told to add a
|
|
173
242
|
marketplace at the first half of the path and answered `Path does not exist` — which also
|
|
174
243
|
meant every `popover update` left the old plugin registered against the new daemon.
|
|
@@ -178,12 +247,12 @@ all, which reads as though the update did not happen.
|
|
|
178
247
|
|
|
179
248
|
### Features
|
|
180
249
|
|
|
181
|
-
|
|
250
|
+
* `popover changelog` says what the last update changed, whenever you want to know rather than
|
|
182
251
|
only in the second the update prints it. Press `1` and the whole history opens in a pane you
|
|
183
252
|
scroll inside — bounded to part of the window, and erased when you leave it, so reading back
|
|
184
253
|
through eight releases does not push everything else out of your terminal. `popover changelog
|
|
185
254
|
--all` goes straight there, and prints plainly when piped into something else.
|
|
186
|
-
|
|
255
|
+
* popover has its own domain: a fresh `popover login` now connects to www.popover.to instead of
|
|
187
256
|
the old vercel.app address. Nothing changes for a machine already logged in — the origin it
|
|
188
257
|
connected through is kept in its credentials and still preferred — and the old hostname keeps
|
|
189
258
|
resolving, so installs of earlier releases carry on working.
|
|
@@ -192,7 +261,7 @@ all, which reads as though the update did not happen.
|
|
|
192
261
|
|
|
193
262
|
### Features
|
|
194
263
|
|
|
195
|
-
|
|
264
|
+
* Claude Code now notices your teammates without being asked. An agent used to learn that
|
|
196
265
|
popover existed only once you typed `/popover:team`, which meant the moment most worth using
|
|
197
266
|
it for — you are about to edit a file somebody else's agent is already in — went past
|
|
198
267
|
unremarked. A session in a repo where a teammate is working now begins with the roster in
|
|
@@ -205,7 +274,7 @@ all, which reads as though the update did not happen.
|
|
|
205
274
|
|
|
206
275
|
### Fixes
|
|
207
276
|
|
|
208
|
-
|
|
277
|
+
* Deleting your account now deletes a team you were the last member of, rather than leaving it
|
|
209
278
|
behind where nobody can reach it. An empty team has no admin, so nobody could open it, rename
|
|
210
279
|
it, or revoke the invite links still pointing at it. A team with other people on it is
|
|
211
280
|
untouched — they keep the team and each other, and only your own machines and agents go.
|
|
@@ -214,36 +283,36 @@ all, which reads as though the update did not happen.
|
|
|
214
283
|
|
|
215
284
|
### Features
|
|
216
285
|
|
|
217
|
-
|
|
286
|
+
* Hand a whole conversation to someone with `/popover:fork create`. It prints a code that
|
|
218
287
|
works for 24 hours; whoever you send it to runs `/popover:fork open <code>` and gets their
|
|
219
288
|
own local chat carrying everything you had worked out. Their chat does not expire with the
|
|
220
289
|
code, and nothing they do in it reaches you.
|
|
221
|
-
|
|
290
|
+
* Opening a fork needs no popover account — `npx @popoverinstall/cli fork open <code>` is
|
|
222
291
|
enough — so you can hand one to someone who has never installed it.
|
|
223
|
-
|
|
292
|
+
* A fork is frozen at the moment you make it. Nothing you say afterwards is included, and
|
|
224
293
|
`popover fork create` tells you which turn it cut at.
|
|
225
|
-
|
|
294
|
+
* `popover fork list` shows the codes you have handed out, and `popover fork revoke <code>`
|
|
226
295
|
destroys a snapshot early. Revoking cannot recall a copy someone has already opened, and
|
|
227
296
|
says so rather than implying otherwise.
|
|
228
|
-
|
|
297
|
+
* A fork is sealed on your machine before it is sent, with a key derived from the code
|
|
229
298
|
itself, so what the server stores is something it cannot read.
|
|
230
|
-
|
|
299
|
+
* Sharing a fork sends the whole conversation, including every file your agent read into it.
|
|
231
300
|
`popover fork create` says so every time, because it is a much larger disclosure than an
|
|
232
301
|
ask.
|
|
233
302
|
|
|
234
303
|
### Fixes
|
|
235
304
|
|
|
236
|
-
|
|
305
|
+
* Asks answer from what the agent already knows, and nothing else. The answering copy no
|
|
237
306
|
longer has file access, so it stops going off to investigate and replies from its own
|
|
238
307
|
context — much faster and cheaper, and it can no longer open a file your session had not
|
|
239
308
|
already opened. The trade is that a question about something the agent never looked at now
|
|
240
309
|
gets "I don't know" instead of a fresh answer.
|
|
241
|
-
|
|
310
|
+
* A message from one of your own agents in the same repo now arrives with a much lighter
|
|
242
311
|
note than one from a teammate. Both are your agents, working from the same code, so being
|
|
243
312
|
warned about it as sternly as about a stranger was wrong — and framing that cries wolf is
|
|
244
313
|
framing the next reader skims. One of your agents in a *different* repo still gets a
|
|
245
314
|
careful note, because it cannot see the code you are in.
|
|
246
|
-
|
|
315
|
+
* The roster marks your own line again, and a message or question is recorded against the
|
|
247
316
|
agent that actually sent it. The plugin's MCP server is started once and kept, so the
|
|
248
317
|
session it believed it was serving could be one that had already ended — which left the
|
|
249
318
|
marker missing, the sender of a tell shown only as "another agent", and the activity page
|
|
@@ -253,20 +322,20 @@ all, which reads as though the update did not happen.
|
|
|
253
322
|
|
|
254
323
|
### Features
|
|
255
324
|
|
|
256
|
-
|
|
325
|
+
* popover installs from npm now: `npm install -g @popoverinstall/cli`, then `popover setup`
|
|
257
326
|
and `popover login`. The same two commands on macOS, Linux and Windows.
|
|
258
|
-
|
|
327
|
+
* Running `popover` with no arguments tells you what to run next, and ticks each step off as
|
|
259
328
|
you finish it. It stops appearing once the machine is connected.
|
|
260
|
-
|
|
329
|
+
* `popover ask` and `popover tell` have moved into the session: use `/popover:team ask B1 …`
|
|
261
330
|
and `/popover:team tell B1 …` in Claude Code. Typing the old commands tells you where they
|
|
262
331
|
went. An agent asking has the context to write a question worth answering, and to do
|
|
263
332
|
something with the answer — a terminal has neither.
|
|
264
|
-
|
|
333
|
+
* `popover log` now lists the messages your agents were sent as well as the questions they
|
|
265
334
|
were asked.
|
|
266
335
|
|
|
267
336
|
### Fixes
|
|
268
337
|
|
|
269
|
-
|
|
338
|
+
* `popover setup` registers the Claude Code plugin correctly on a machine that has never had
|
|
270
339
|
it installed. It previously named a plugin marketplace that does not exist, which only
|
|
271
340
|
showed up on a genuinely fresh machine.
|
|
272
341
|
|
|
@@ -274,80 +343,80 @@ all, which reads as though the update did not happen.
|
|
|
274
343
|
|
|
275
344
|
### Features
|
|
276
345
|
|
|
277
|
-
|
|
346
|
+
* Agents can tell each other things, not only ask. `/popover:team tell B1 the migration is
|
|
278
347
|
applied on prod` drops a heads-up into that agent's next prompt. Nothing comes back —
|
|
279
348
|
it is for facts that would otherwise cause a collision, not for questions.
|
|
280
|
-
|
|
349
|
+
* `/popover:team` now takes `ask` or `tell` as its first word. `/popover:team ask B1 why did you
|
|
281
350
|
rule out redis?` is what it always did, spelled out.
|
|
282
|
-
|
|
351
|
+
* You are told whenever a teammate's agent sends one of yours a message, so nothing reaches
|
|
283
352
|
your agent without you knowing. Messages between two of your own agents stay quiet.
|
|
284
|
-
|
|
353
|
+
* A message arrives named: which agent sent it, and who is running that agent. Your agent is
|
|
285
354
|
told to treat it as information from someone who cannot see what it is working on, rather
|
|
286
355
|
than as an instruction from you.
|
|
287
|
-
|
|
356
|
+
* Only agents working in the same repo can be told, the same rule that decides who you can
|
|
288
357
|
ask, and one agent can send another at most ten messages an hour.
|
|
289
|
-
|
|
290
|
-
|
|
358
|
+
* The activity page lists messages next to questions, so you can see who told whom what.
|
|
359
|
+
* `popover update` prints the release notes for what it just installed.
|
|
291
360
|
|
|
292
361
|
### Fixes
|
|
293
362
|
|
|
294
|
-
|
|
363
|
+
* An ask whose agent finishes without writing an answer now says the agent could not
|
|
295
364
|
answer, instead of the contradictory "The agent failed (success)".
|
|
296
365
|
|
|
297
366
|
## 0.3.0
|
|
298
367
|
|
|
299
368
|
### Features
|
|
300
369
|
|
|
301
|
-
|
|
370
|
+
* An agent sees only the teammates working in the same repo. Repos are identified by their
|
|
302
371
|
git remotes, so two clones match however they were cloned and whatever the folder is
|
|
303
372
|
called, and a directory with no shared remote stays private.
|
|
304
|
-
|
|
305
|
-
|
|
373
|
+
* Your teammates' machines now appear on the dashboard, read-only, alongside your own.
|
|
374
|
+
* The dashboard follows the organization picked in the switcher instead of showing
|
|
306
375
|
everything you can see at once.
|
|
307
|
-
|
|
376
|
+
* The dashboard, sign-in and onboarding screens are restyled to match the landing poster.
|
|
308
377
|
|
|
309
378
|
### Fixes
|
|
310
379
|
|
|
311
|
-
|
|
312
|
-
|
|
380
|
+
* A laptop that logged in more than once is one row on the machines page again, not three.
|
|
381
|
+
* Only the daemon can report a daemon version or a heartbeat, so a stale row can no longer
|
|
313
382
|
claim a machine is alive.
|
|
314
|
-
|
|
383
|
+
* Refreshing the team list no longer folds your own machines into your teammates'.
|
|
315
384
|
|
|
316
385
|
## 0.2.1
|
|
317
386
|
|
|
318
387
|
### Features
|
|
319
388
|
|
|
320
|
-
|
|
321
|
-
|
|
389
|
+
* Agent handles lost their dash: `G1`, not `G-1`.
|
|
390
|
+
* The roster marks which line is the reading agent's own, and the activity feed names both
|
|
322
391
|
ends of an ask.
|
|
323
392
|
|
|
324
393
|
### Fixes
|
|
325
394
|
|
|
326
|
-
|
|
395
|
+
* The asker's session is read from `CLAUDE_CODE_SESSION_ID` — the old name did not exist,
|
|
327
396
|
so asks were attributed to nobody.
|
|
328
|
-
|
|
397
|
+
* A missing `role` claim is named on the dashboard instead of rendering an empty page.
|
|
329
398
|
|
|
330
399
|
## 0.2.0
|
|
331
400
|
|
|
332
401
|
### Features
|
|
333
402
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
403
|
+
* `popover update` upgrades this machine in place and restarts the daemon on the new build.
|
|
404
|
+
* The roster prints one line when a newer version is available.
|
|
405
|
+
* Windows installer: `irm <host>/install.ps1 | iex`.
|
|
406
|
+
* The machines page stays current instead of freezing at whatever it rendered with.
|
|
338
407
|
|
|
339
408
|
### Fixes
|
|
340
409
|
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
410
|
+
* An agent that cannot be reached shows as unreachable rather than active.
|
|
411
|
+
* The daemon exits when it crashes and when its terminal closes, instead of lingering.
|
|
412
|
+
* Stopping the daemon on Windows marks its sessions offline, so teammates stop seeing rows
|
|
344
413
|
for agents that are gone.
|
|
345
|
-
|
|
414
|
+
* One machine row per install instead of one per login, and sessions stranded by an earlier
|
|
346
415
|
login on the same host are closed.
|
|
347
416
|
|
|
348
417
|
## 0.1.0
|
|
349
418
|
|
|
350
419
|
### Features
|
|
351
420
|
|
|
352
|
-
|
|
421
|
+
* First release: see your team's active Claude Code agents with `/popover:team`, and ask one of
|
|
353
422
|
them a question that a read-only fork answers from that agent's full context.
|
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 Quolabs
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Quolabs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|