@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.
- package/CHANGELOG.md +196 -69
- 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/next-steps.d.ts +1 -5
- package/dist/next-steps.d.ts.map +1 -1
- package/dist/next-steps.js +9 -5
- package/dist/next-steps.js.map +1 -1
- 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/terminal.d.ts.map +1 -1
- package/dist/terminal.js +21 -0
- package/dist/terminal.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 -76
- package/plugin/commands/ask.md +65 -65
- package/plugin/commands/fork.md +119 -118
- 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 -131
- 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 -160
package/CHANGELOG.md
CHANGED
|
@@ -7,19 +7,146 @@ 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
|
+
|
|
87
|
+
## 0.8.1
|
|
88
|
+
|
|
89
|
+
### Features
|
|
90
|
+
|
|
91
|
+
* Your agent offers a fork when the moment calls for one, instead of waiting to be asked. It
|
|
92
|
+
used to be told never to suggest one, on the reasoning that handing over a whole
|
|
93
|
+
conversation is a large enough disclosure to be the user's own idea. The effect was that the
|
|
94
|
+
most useful case never came up at all, because the moment for a fork is one you are usually
|
|
95
|
+
too deep in the work to notice: you are going off shift, or about to re-explain an hour of
|
|
96
|
+
debugging to a colleague by hand, or trading asks back and forth on what turns out never to
|
|
97
|
+
have been one question. Your agent now says so once, and says what the fork would include.
|
|
98
|
+
Making one is still yours alone — it cannot create a fork without you asking, "that would be
|
|
99
|
+
useful" is not read as a yes, and if you pass on the offer it does not raise it again.
|
|
100
|
+
|
|
101
|
+
### Fixes
|
|
102
|
+
|
|
103
|
+
* Your agent is told who else is working in the repo again. The notice was supposed to appear
|
|
104
|
+
whenever the cast of teammate agents changed, and almost never did: it gave the daemon 250ms
|
|
105
|
+
to answer, and any answer more than five seconds old means fetching from the server, which
|
|
106
|
+
takes about 350ms. So it ran out of time and said nothing — and saying nothing looks exactly
|
|
107
|
+
like working alone, which is why it went unnoticed. It now waits long enough to get an
|
|
108
|
+
answer. If you are working alone it also stops checking every prompt, so you are not paying
|
|
109
|
+
for a lookup that has nothing to report.
|
|
110
|
+
|
|
111
|
+
* `popover fork revoke` no longer tells you a fork is destroyed when it is not. If the write
|
|
112
|
+
failed, it said "revoked" anyway — the one command whose whole job is undoing a mistake, and
|
|
113
|
+
the one place a false confirmation is worst, because you stop looking. It now says it could
|
|
114
|
+
not and asks you to try again. A code that was already gone still reports success, which is
|
|
115
|
+
deliberate: answering differently would let anyone holding a code learn whether a
|
|
116
|
+
conversation exists.
|
|
117
|
+
|
|
118
|
+
* Expired forks are actually deleted now. A fork's ciphertext is supposed to be destroyed 24
|
|
119
|
+
hours after it is made, but the cleanup only ever ran when somebody happened to create
|
|
120
|
+
another fork — so on a quiet team, conversations you had shared for a day stayed on the
|
|
121
|
+
server indefinitely. It now runs on a schedule of its own.
|
|
122
|
+
|
|
123
|
+
* A hiccup on our side no longer signs your machine out. Several of these reported a temporary
|
|
124
|
+
server problem as a permanent refusal: a failed lookup during `popover login` looked like an
|
|
125
|
+
invalid code and abandoned the login, and one during a routine daemon check looked like your
|
|
126
|
+
machine had been revoked — which is not something it retries. They now say the service is
|
|
127
|
+
briefly unavailable, and the daemon keeps its session.
|
|
128
|
+
|
|
129
|
+
* Opening a fork works on Windows when the folder it came from has a non-ASCII name. The
|
|
130
|
+
console reads a script in its own code page rather than UTF-8, so a path like
|
|
131
|
+
`C:\Users\Renée\work` arrived mangled, the `cd` quietly failed, and the fork opened anyway in
|
|
132
|
+
whatever directory the console started in — looking correct while every file path in the
|
|
133
|
+
conversation pointed somewhere else. It now switches the console to UTF-8 first, and stops
|
|
134
|
+
with a message rather than opening in the wrong place.
|
|
135
|
+
|
|
136
|
+
* Asks against a long conversation work now. Answering an agent used to run the question past
|
|
137
|
+
Haiku no matter what the agent itself was running, and Haiku holds 200K tokens — so on any
|
|
138
|
+
session bigger than that, Claude Code had to compress the whole conversation before it could
|
|
139
|
+
read it, which took longer than the 90 seconds the asker waits. You got "did not answer in
|
|
140
|
+
time", and the machine being asked had already spent the tokens. The answer now comes from
|
|
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
|
|
143
|
+
more per ask, and it is their call — set `POPOVER_FORK_MODEL` to pin a cheaper one.
|
|
144
|
+
|
|
18
145
|
## 0.8.0
|
|
19
146
|
|
|
20
147
|
### Features
|
|
21
148
|
|
|
22
|
-
|
|
149
|
+
* Asking and telling are their own commands. `/popover:ask B1 why did you rule out redis?` and
|
|
23
150
|
`/popover:tell B1 the migration is applied` replace `/popover:team ask …` and
|
|
24
151
|
`/popover:team tell …`, and `/popover:team` is now just the roster. The three cost completely
|
|
25
152
|
different things — the roster costs nothing, an ask spends the teammate's tokens on their
|
|
@@ -27,7 +154,7 @@ all, which reads as though the update did not happen.
|
|
|
27
154
|
behind one first word made the cheapest and the most intrusive look like the same gesture.
|
|
28
155
|
The old forms still work and mention the new name once, so nothing you have already learned
|
|
29
156
|
breaks.
|
|
30
|
-
|
|
157
|
+
* Agents can have names. `popover rename B1 "auth work"` gives one of your agents a name, and
|
|
31
158
|
your teammates see it on their next roster while the dashboard picks it up live — so three
|
|
32
159
|
sessions in the same repo stop being three identical rows of `B1`, `B2`, `B3`. Run
|
|
33
160
|
`popover rename` on its own to pick from a list instead of looking a handle up first. A named
|
|
@@ -35,72 +162,72 @@ all, which reads as though the update did not happen.
|
|
|
35
162
|
reach it. You can only name your own agents, the name goes when the session does, and
|
|
36
163
|
`popover rename B1 ""` takes it off again. Nothing changes for anyone who never uses it: a
|
|
37
164
|
roster with no named agents on it prints exactly as it did before.
|
|
38
|
-
|
|
165
|
+
* The documentation is public. popover.to/docs is the whole of how it works — the roster,
|
|
39
166
|
asking, telling, forking, which agents can see each other, and what leaves your machine —
|
|
40
167
|
and popover.to/changelog is this file, with a URL you can send someone. Neither needs an
|
|
41
168
|
account: until now the only thing a person could read before installing was the poster, so
|
|
42
169
|
deciding whether to run the install command meant asking somebody who already had.
|
|
43
|
-
|
|
170
|
+
* `popover changelog` points at popover.to/changelog when an install has no notes to read,
|
|
44
171
|
rather than at a repository that is private and answers a 404.
|
|
45
172
|
|
|
46
173
|
### Fixes
|
|
47
174
|
|
|
48
|
-
|
|
175
|
+
* Everyone on your team needs this release. The way a repo is identified changed, and a popover
|
|
49
176
|
older than 0.8.0 cannot prove which repo it is in — so an out-of-date machine keeps working
|
|
50
177
|
and keeps its own agents up to date, but goes quiet for the rest of the team until it
|
|
51
178
|
updates. It says so on its own roster and in `popover doctor`, and your roster counts the
|
|
52
179
|
teammates it cannot show you rather than leaving you to wonder where everybody went.
|
|
53
|
-
|
|
180
|
+
* An unrecognised repo identity costs you the identity, not the update. A publish carries every
|
|
54
181
|
session on the machine in one write, so refusing that write over one field it did not like
|
|
55
182
|
took the whole machine off the air — no roster, no status, and its own agents frozen at
|
|
56
183
|
whatever they were last doing — while the connection itself looked perfectly healthy. A value
|
|
57
184
|
we cannot verify is now dropped and the update lands without it.
|
|
58
|
-
|
|
185
|
+
* Working in the same repo is now something popover checks rather than something it takes your
|
|
59
186
|
word for. A repo was identified by the name of its git remote, which anyone can type, so
|
|
60
187
|
anyone on your team could claim to be in a repo they had never cloned and see — and ask —
|
|
61
188
|
the agents working in it. Identity now comes from the repository's own history, which you
|
|
62
189
|
only have if you have actually cloned it, and what reaches the server is a hash of that
|
|
63
190
|
rather than the thing itself, so it cannot be read off one session and reused on another.
|
|
64
|
-
|
|
191
|
+
* Revoking a machine ends it. A revoked machine could quietly un-revoke itself and carry on,
|
|
65
192
|
which made the button on the dashboard a suggestion.
|
|
66
|
-
|
|
193
|
+
* The agent that answers you cannot rewrite what you asked it, and the agent you send a
|
|
67
194
|
message to cannot change who it came from. Both are what `/activity` and `popover log` show
|
|
68
195
|
you afterwards, so both are now fixed at the moment they are written.
|
|
69
|
-
|
|
196
|
+
* Nothing a teammate can type reaches your agent as an instruction. Names, titles and the
|
|
70
197
|
activity shown on the roster are text your agent reads, and a newline in the right place
|
|
71
198
|
could forge a line that looked like popover talking. That text is now bounded and stripped
|
|
72
199
|
of anything that can start a new line, hide itself, or reverse the one it is on.
|
|
73
|
-
|
|
200
|
+
* A laptop and a desktop no longer give two agents the same handle. Both machines numbered
|
|
74
201
|
their own agents from one, so `G1` could mean either, and asking for it reached neither.
|
|
75
202
|
Handles are now handed out where all of your machines can be seen at once.
|
|
76
|
-
|
|
203
|
+
* `popover daemon stop` stops popover and nothing else. It trusted a leftover file naming a
|
|
77
204
|
process id, which the operating system may since have given to something entirely
|
|
78
205
|
unrelated — and `popover update` runs it for you.
|
|
79
|
-
|
|
206
|
+
* `popover update` no longer risks leaving half an install behind on Windows, where a file
|
|
80
207
|
being replaced cannot be one a running program still holds open.
|
|
81
|
-
|
|
208
|
+
* A slow moment no longer takes your agents off your teammates' rosters. If popover could not
|
|
82
209
|
read the list of running sessions — a busy machine, a moment's hesitation — it concluded
|
|
83
210
|
every one of them had ended.
|
|
84
|
-
|
|
211
|
+
* `popover fork revoke` tells you the truth when it fails. It reported that a conversation had
|
|
85
212
|
been destroyed without checking, which is the one command whose word you would not think to
|
|
86
213
|
doubt.
|
|
87
|
-
|
|
214
|
+
* Agents belonging to teammates whose names are not written in the Latin alphabet can be
|
|
88
215
|
reached again. A teammate called 李明 is given the handle 李1, and asking for it matched every
|
|
89
216
|
agent whose handle ended in the same digit — so `/popover:team ask 李1` came back "did you
|
|
90
217
|
mean 李1 or 王1?" with no third thing you could type that would have worked. Their name now
|
|
91
218
|
finds them too, and so does the name of an agent renamed in any script.
|
|
92
|
-
|
|
219
|
+
* The roster lines up its columns for those agents rather than shearing them. Column widths
|
|
93
220
|
were counted in characters, and a character in Chinese, Japanese or Korean takes two columns
|
|
94
221
|
of a terminal, as does an emoji — so every such row drifted a column further left than the
|
|
95
222
|
one above it.
|
|
96
|
-
|
|
223
|
+
* Asking for something with no letters or digits in it — punctuation, or an emoji on its own —
|
|
97
224
|
says nothing matches, instead of matching every agent on the roster at once.
|
|
98
225
|
|
|
99
226
|
## 0.7.2
|
|
100
227
|
|
|
101
228
|
### Fixes
|
|
102
229
|
|
|
103
|
-
|
|
230
|
+
* `popover update` updates the machine on Windows instead of handing you a command. It used
|
|
104
231
|
to print `npm install -g @popoverinstall/cli@latest` and stop, on the belief that replacing
|
|
105
232
|
the `popover.cmd` shim while it was running would corrupt it — npm's shims are built to
|
|
106
233
|
survive exactly that, which is how npm upgrades itself. Worse, the command it printed could
|
|
@@ -110,7 +237,7 @@ all, which reads as though the update did not happen.
|
|
|
110
237
|
metadata rather than trusting the cache, and if a release really has not propagated yet it
|
|
111
238
|
says so and tells you to try again shortly, instead of reporting that the version does not
|
|
112
239
|
exist.
|
|
113
|
-
|
|
240
|
+
* `popover setup` registers the plugin on Windows when your user directory has a space in it.
|
|
114
241
|
It was passing the plugin's path through a shell unquoted, so Claude Code was told to add a
|
|
115
242
|
marketplace at the first half of the path and answered `Path does not exist` — which also
|
|
116
243
|
meant every `popover update` left the old plugin registered against the new daemon.
|
|
@@ -120,12 +247,12 @@ all, which reads as though the update did not happen.
|
|
|
120
247
|
|
|
121
248
|
### Features
|
|
122
249
|
|
|
123
|
-
|
|
250
|
+
* `popover changelog` says what the last update changed, whenever you want to know rather than
|
|
124
251
|
only in the second the update prints it. Press `1` and the whole history opens in a pane you
|
|
125
252
|
scroll inside — bounded to part of the window, and erased when you leave it, so reading back
|
|
126
253
|
through eight releases does not push everything else out of your terminal. `popover changelog
|
|
127
254
|
--all` goes straight there, and prints plainly when piped into something else.
|
|
128
|
-
|
|
255
|
+
* popover has its own domain: a fresh `popover login` now connects to www.popover.to instead of
|
|
129
256
|
the old vercel.app address. Nothing changes for a machine already logged in — the origin it
|
|
130
257
|
connected through is kept in its credentials and still preferred — and the old hostname keeps
|
|
131
258
|
resolving, so installs of earlier releases carry on working.
|
|
@@ -134,7 +261,7 @@ all, which reads as though the update did not happen.
|
|
|
134
261
|
|
|
135
262
|
### Features
|
|
136
263
|
|
|
137
|
-
|
|
264
|
+
* Claude Code now notices your teammates without being asked. An agent used to learn that
|
|
138
265
|
popover existed only once you typed `/popover:team`, which meant the moment most worth using
|
|
139
266
|
it for — you are about to edit a file somebody else's agent is already in — went past
|
|
140
267
|
unremarked. A session in a repo where a teammate is working now begins with the roster in
|
|
@@ -147,7 +274,7 @@ all, which reads as though the update did not happen.
|
|
|
147
274
|
|
|
148
275
|
### Fixes
|
|
149
276
|
|
|
150
|
-
|
|
277
|
+
* Deleting your account now deletes a team you were the last member of, rather than leaving it
|
|
151
278
|
behind where nobody can reach it. An empty team has no admin, so nobody could open it, rename
|
|
152
279
|
it, or revoke the invite links still pointing at it. A team with other people on it is
|
|
153
280
|
untouched — they keep the team and each other, and only your own machines and agents go.
|
|
@@ -156,36 +283,36 @@ all, which reads as though the update did not happen.
|
|
|
156
283
|
|
|
157
284
|
### Features
|
|
158
285
|
|
|
159
|
-
|
|
286
|
+
* Hand a whole conversation to someone with `/popover:fork create`. It prints a code that
|
|
160
287
|
works for 24 hours; whoever you send it to runs `/popover:fork open <code>` and gets their
|
|
161
288
|
own local chat carrying everything you had worked out. Their chat does not expire with the
|
|
162
289
|
code, and nothing they do in it reaches you.
|
|
163
|
-
|
|
290
|
+
* Opening a fork needs no popover account — `npx @popoverinstall/cli fork open <code>` is
|
|
164
291
|
enough — so you can hand one to someone who has never installed it.
|
|
165
|
-
|
|
292
|
+
* A fork is frozen at the moment you make it. Nothing you say afterwards is included, and
|
|
166
293
|
`popover fork create` tells you which turn it cut at.
|
|
167
|
-
|
|
294
|
+
* `popover fork list` shows the codes you have handed out, and `popover fork revoke <code>`
|
|
168
295
|
destroys a snapshot early. Revoking cannot recall a copy someone has already opened, and
|
|
169
296
|
says so rather than implying otherwise.
|
|
170
|
-
|
|
297
|
+
* A fork is sealed on your machine before it is sent, with a key derived from the code
|
|
171
298
|
itself, so what the server stores is something it cannot read.
|
|
172
|
-
|
|
299
|
+
* Sharing a fork sends the whole conversation, including every file your agent read into it.
|
|
173
300
|
`popover fork create` says so every time, because it is a much larger disclosure than an
|
|
174
301
|
ask.
|
|
175
302
|
|
|
176
303
|
### Fixes
|
|
177
304
|
|
|
178
|
-
|
|
305
|
+
* Asks answer from what the agent already knows, and nothing else. The answering copy no
|
|
179
306
|
longer has file access, so it stops going off to investigate and replies from its own
|
|
180
307
|
context — much faster and cheaper, and it can no longer open a file your session had not
|
|
181
308
|
already opened. The trade is that a question about something the agent never looked at now
|
|
182
309
|
gets "I don't know" instead of a fresh answer.
|
|
183
|
-
|
|
310
|
+
* A message from one of your own agents in the same repo now arrives with a much lighter
|
|
184
311
|
note than one from a teammate. Both are your agents, working from the same code, so being
|
|
185
312
|
warned about it as sternly as about a stranger was wrong — and framing that cries wolf is
|
|
186
313
|
framing the next reader skims. One of your agents in a *different* repo still gets a
|
|
187
314
|
careful note, because it cannot see the code you are in.
|
|
188
|
-
|
|
315
|
+
* The roster marks your own line again, and a message or question is recorded against the
|
|
189
316
|
agent that actually sent it. The plugin's MCP server is started once and kept, so the
|
|
190
317
|
session it believed it was serving could be one that had already ended — which left the
|
|
191
318
|
marker missing, the sender of a tell shown only as "another agent", and the activity page
|
|
@@ -195,20 +322,20 @@ all, which reads as though the update did not happen.
|
|
|
195
322
|
|
|
196
323
|
### Features
|
|
197
324
|
|
|
198
|
-
|
|
325
|
+
* popover installs from npm now: `npm install -g @popoverinstall/cli`, then `popover setup`
|
|
199
326
|
and `popover login`. The same two commands on macOS, Linux and Windows.
|
|
200
|
-
|
|
327
|
+
* Running `popover` with no arguments tells you what to run next, and ticks each step off as
|
|
201
328
|
you finish it. It stops appearing once the machine is connected.
|
|
202
|
-
|
|
329
|
+
* `popover ask` and `popover tell` have moved into the session: use `/popover:team ask B1 …`
|
|
203
330
|
and `/popover:team tell B1 …` in Claude Code. Typing the old commands tells you where they
|
|
204
331
|
went. An agent asking has the context to write a question worth answering, and to do
|
|
205
332
|
something with the answer — a terminal has neither.
|
|
206
|
-
|
|
333
|
+
* `popover log` now lists the messages your agents were sent as well as the questions they
|
|
207
334
|
were asked.
|
|
208
335
|
|
|
209
336
|
### Fixes
|
|
210
337
|
|
|
211
|
-
|
|
338
|
+
* `popover setup` registers the Claude Code plugin correctly on a machine that has never had
|
|
212
339
|
it installed. It previously named a plugin marketplace that does not exist, which only
|
|
213
340
|
showed up on a genuinely fresh machine.
|
|
214
341
|
|
|
@@ -216,80 +343,80 @@ all, which reads as though the update did not happen.
|
|
|
216
343
|
|
|
217
344
|
### Features
|
|
218
345
|
|
|
219
|
-
|
|
346
|
+
* Agents can tell each other things, not only ask. `/popover:team tell B1 the migration is
|
|
220
347
|
applied on prod` drops a heads-up into that agent's next prompt. Nothing comes back —
|
|
221
348
|
it is for facts that would otherwise cause a collision, not for questions.
|
|
222
|
-
|
|
349
|
+
* `/popover:team` now takes `ask` or `tell` as its first word. `/popover:team ask B1 why did you
|
|
223
350
|
rule out redis?` is what it always did, spelled out.
|
|
224
|
-
|
|
351
|
+
* You are told whenever a teammate's agent sends one of yours a message, so nothing reaches
|
|
225
352
|
your agent without you knowing. Messages between two of your own agents stay quiet.
|
|
226
|
-
|
|
353
|
+
* A message arrives named: which agent sent it, and who is running that agent. Your agent is
|
|
227
354
|
told to treat it as information from someone who cannot see what it is working on, rather
|
|
228
355
|
than as an instruction from you.
|
|
229
|
-
|
|
356
|
+
* Only agents working in the same repo can be told, the same rule that decides who you can
|
|
230
357
|
ask, and one agent can send another at most ten messages an hour.
|
|
231
|
-
|
|
232
|
-
|
|
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.
|
|
233
360
|
|
|
234
361
|
### Fixes
|
|
235
362
|
|
|
236
|
-
|
|
363
|
+
* An ask whose agent finishes without writing an answer now says the agent could not
|
|
237
364
|
answer, instead of the contradictory "The agent failed (success)".
|
|
238
365
|
|
|
239
366
|
## 0.3.0
|
|
240
367
|
|
|
241
368
|
### Features
|
|
242
369
|
|
|
243
|
-
|
|
370
|
+
* An agent sees only the teammates working in the same repo. Repos are identified by their
|
|
244
371
|
git remotes, so two clones match however they were cloned and whatever the folder is
|
|
245
372
|
called, and a directory with no shared remote stays private.
|
|
246
|
-
|
|
247
|
-
|
|
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
|
|
248
375
|
everything you can see at once.
|
|
249
|
-
|
|
376
|
+
* The dashboard, sign-in and onboarding screens are restyled to match the landing poster.
|
|
250
377
|
|
|
251
378
|
### Fixes
|
|
252
379
|
|
|
253
|
-
|
|
254
|
-
|
|
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
|
|
255
382
|
claim a machine is alive.
|
|
256
|
-
|
|
383
|
+
* Refreshing the team list no longer folds your own machines into your teammates'.
|
|
257
384
|
|
|
258
385
|
## 0.2.1
|
|
259
386
|
|
|
260
387
|
### Features
|
|
261
388
|
|
|
262
|
-
|
|
263
|
-
|
|
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
|
|
264
391
|
ends of an ask.
|
|
265
392
|
|
|
266
393
|
### Fixes
|
|
267
394
|
|
|
268
|
-
|
|
395
|
+
* The asker's session is read from `CLAUDE_CODE_SESSION_ID` — the old name did not exist,
|
|
269
396
|
so asks were attributed to nobody.
|
|
270
|
-
|
|
397
|
+
* A missing `role` claim is named on the dashboard instead of rendering an empty page.
|
|
271
398
|
|
|
272
399
|
## 0.2.0
|
|
273
400
|
|
|
274
401
|
### Features
|
|
275
402
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
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.
|
|
280
407
|
|
|
281
408
|
### Fixes
|
|
282
409
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
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
|
|
286
413
|
for agents that are gone.
|
|
287
|
-
|
|
414
|
+
* One machine row per install instead of one per login, and sessions stranded by an earlier
|
|
288
415
|
login on the same host are closed.
|
|
289
416
|
|
|
290
417
|
## 0.1.0
|
|
291
418
|
|
|
292
419
|
### Features
|
|
293
420
|
|
|
294
|
-
|
|
421
|
+
* First release: see your team's active Claude Code agents with `/popover:team`, and ask one of
|
|
295
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.
|