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