threadnote 0.7.7 → 0.7.9
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/README.md +11 -2
- package/dist/mcp_server.cjs +233 -196
- package/dist/threadnote.cjs +1673 -252
- package/docs/agent-instructions.md +2 -2
- package/docs/index.html +56 -32
- package/docs/share.md +20 -6
- package/manager/app.css +858 -0
- package/manager/app.js +37361 -0
- package/manager/index.html +14 -0
- package/package.json +15 -6
|
@@ -133,8 +133,8 @@ design decisions, API contracts, gotchas) and is safe to share. Do NOT publish:
|
|
|
133
133
|
- anything mentioning secrets, customer data, raw logs, or material a teammate's git history shouldn't carry.
|
|
134
134
|
|
|
135
135
|
The MCP tool `share_publish` runs the same scrubber as the CLI and refuses to publish memories containing common secret
|
|
136
|
-
patterns (PEM private keys, `sk-...`, `gh[pousr]_...`, `Bearer ...`, `AKIA...`, `xox[abprs]-...`). It
|
|
137
|
-
|
|
136
|
+
patterns (PEM private keys, `sk-...`, `gh[pousr]_...`, `Bearer ...`, `AKIA...`, `xox[abprs]-...`). It writes and pushes
|
|
137
|
+
the shared copy first, then removes the personal copy after the push succeeds.
|
|
138
138
|
|
|
139
139
|
Incoming shared memories are normally fetched and synced automatically before MCP `recall_context` / `read_context` and
|
|
140
140
|
CLI `threadnote recall` / `threadnote read` return. If automatic sync reports a dirty worktree, a conflict, or another
|
package/docs/index.html
CHANGED
|
@@ -225,7 +225,8 @@
|
|
|
225
225
|
|
|
226
226
|
/* hero */
|
|
227
227
|
#hero {
|
|
228
|
-
background:
|
|
228
|
+
background:
|
|
229
|
+
radial-gradient(circle at 25% 30%, rgba(94, 224, 197, 0.08), transparent 55%),
|
|
229
230
|
radial-gradient(circle at 75% 70%, rgba(124, 140, 255, 0.05), transparent 55%), var(--bg);
|
|
230
231
|
place-items: center;
|
|
231
232
|
}
|
|
@@ -298,7 +299,9 @@
|
|
|
298
299
|
border: 1px solid var(--line);
|
|
299
300
|
border-radius: var(--radius-lg);
|
|
300
301
|
padding: 1.5rem 1.5rem 1.4rem;
|
|
301
|
-
transition:
|
|
302
|
+
transition:
|
|
303
|
+
border-color 0.2s ease,
|
|
304
|
+
transform 0.2s ease;
|
|
302
305
|
}
|
|
303
306
|
|
|
304
307
|
.card:hover {
|
|
@@ -606,7 +609,9 @@
|
|
|
606
609
|
background: var(--line);
|
|
607
610
|
border: 0;
|
|
608
611
|
display: block;
|
|
609
|
-
transition:
|
|
612
|
+
transition:
|
|
613
|
+
background-color 0.2s ease,
|
|
614
|
+
transform 0.2s ease;
|
|
610
615
|
}
|
|
611
616
|
.deck-nav a::after {
|
|
612
617
|
content: '';
|
|
@@ -720,7 +725,9 @@
|
|
|
720
725
|
.reveal {
|
|
721
726
|
opacity: 0;
|
|
722
727
|
transform: translateY(14px);
|
|
723
|
-
transition:
|
|
728
|
+
transition:
|
|
729
|
+
opacity 0.6s ease,
|
|
730
|
+
transform 0.6s ease;
|
|
724
731
|
}
|
|
725
732
|
|
|
726
733
|
.reveal.visible {
|
|
@@ -792,9 +799,7 @@
|
|
|
792
799
|
</p>
|
|
793
800
|
<ul class="flat reveal" style="margin-top: 2rem">
|
|
794
801
|
<li><strong>Conversation history evaporates.</strong> Compaction summarizes; the nuance is lost.</li>
|
|
795
|
-
<li>
|
|
796
|
-
<strong>Each agent has its own memory.</strong> Switching from Codex to Claude means starting over.
|
|
797
|
-
</li>
|
|
802
|
+
<li><strong>Each agent has its own memory.</strong> Switching from Codex to Claude means starting over.</li>
|
|
798
803
|
<li>
|
|
799
804
|
<strong>CLAUDE.md/AGENTS.md is per-repo and static.</strong> It can't carry an in-flight feature's design
|
|
800
805
|
decisions across sessions, much less across agents or repos.
|
|
@@ -1050,8 +1055,8 @@
|
|
|
1050
1055
|
<h3>Secret-pattern scrubber</h3>
|
|
1051
1056
|
<p>
|
|
1052
1057
|
Candidate files are skipped if common token shapes survive redaction. The
|
|
1053
|
-
<code>share publish</code> path refuses to push memories that contain PEM keys,
|
|
1054
|
-
<code>
|
|
1058
|
+
<code>share publish</code> path refuses to push memories that contain PEM keys, <code>sk-…</code> /
|
|
1059
|
+
<code>github_pat_…</code> / <code>glpat-…</code>, JWTs, AWS keys, or Slack tokens.
|
|
1055
1060
|
</p>
|
|
1056
1061
|
</div>
|
|
1057
1062
|
<div class="card reveal">
|
|
@@ -1067,8 +1072,8 @@
|
|
|
1067
1072
|
<span class="card-kicker">Transactional</span>
|
|
1068
1073
|
<h3>No half-published state</h3>
|
|
1069
1074
|
<p>
|
|
1070
|
-
|
|
1071
|
-
|
|
1075
|
+
<code>share publish</code> writes, commits, and pushes the shared copy before removing the personal
|
|
1076
|
+
source. A git failure leaves the original memory in place with an actionable error.
|
|
1072
1077
|
</p>
|
|
1073
1078
|
</div>
|
|
1074
1079
|
</div>
|
|
@@ -1081,8 +1086,8 @@
|
|
|
1081
1086
|
<span class="slide-eyebrow">06 · Install</span>
|
|
1082
1087
|
<h2>One command. Then point your agents at it.</h2>
|
|
1083
1088
|
<p class="lead">
|
|
1084
|
-
The installer wires up the npm package, the OpenViking Python environment, and the local server. After
|
|
1085
|
-
|
|
1089
|
+
The installer wires up the npm package, the OpenViking Python environment, and the local server. After that,
|
|
1090
|
+
<code>mcp-install</code> per agent and you're done.
|
|
1086
1091
|
</p>
|
|
1087
1092
|
|
|
1088
1093
|
<div class="grid grid-2" style="margin-top: 1.5rem">
|
|
@@ -1274,8 +1279,9 @@ projects:
|
|
|
1274
1279
|
<span class="card-kicker">status: archived</span>
|
|
1275
1280
|
<h3>Provenance only</h3>
|
|
1276
1281
|
<p>
|
|
1277
|
-
Old handoffs that helped at the time but shouldn't be current working context.
|
|
1278
|
-
moves them out of the active recall scope; <code>--include-archived</code> still
|
|
1282
|
+
Old handoffs that helped at the time but shouldn't be current working context.
|
|
1283
|
+
<code>archive</code> moves them out of the active recall scope; <code>--include-archived</code> still
|
|
1284
|
+
finds them.
|
|
1279
1285
|
</p>
|
|
1280
1286
|
</div>
|
|
1281
1287
|
</div>
|
|
@@ -1408,8 +1414,10 @@ threadnote remember \
|
|
|
1408
1414
|
<div class="vignette reveal">
|
|
1409
1415
|
<div class="v-say">Continue where we left off on this branch.</div>
|
|
1410
1416
|
<pre class="v-call">recall_context({query: "<branch> latest handoff durable feature memory"})</pre>
|
|
1411
|
-
<pre class="v-response"
|
|
1412
|
-
→ viking://user/you/memories/
|
|
1417
|
+
<pre class="v-response">
|
|
1418
|
+
→ viking://user/you/memories/handoffs/active/<branch>/auto-precompact.md
|
|
1419
|
+
→ viking://user/you/memories/durable/projects/<repo>/<feature>.md</pre
|
|
1420
|
+
>
|
|
1413
1421
|
<div class="v-answer">
|
|
1414
1422
|
Fresh session, fresh agent. It reads both pointers, picks up the design decisions, the open PR, what's
|
|
1415
1423
|
left to test, and what just failed in CI. No re-explaining.
|
|
@@ -1418,19 +1426,27 @@ threadnote remember \
|
|
|
1418
1426
|
|
|
1419
1427
|
<div class="vignette reveal">
|
|
1420
1428
|
<div class="v-say">Save where we are — I'm switching to another agent.</div>
|
|
1421
|
-
<pre class="v-call">
|
|
1422
|
-
|
|
1429
|
+
<pre class="v-call">
|
|
1430
|
+
remember_context({kind: "handoff", project: "<repo>", topic: "<feature>", text: "..."})</pre
|
|
1431
|
+
>
|
|
1432
|
+
<pre class="v-response">
|
|
1433
|
+
Stored: viking://user/you/memories/handoffs/active/<repo>/<feature>.md</pre
|
|
1434
|
+
>
|
|
1423
1435
|
<div class="v-answer">
|
|
1424
|
-
Open the next agent — the SessionStart hook recalls the same handoff and the durable memory. It picks
|
|
1425
|
-
|
|
1436
|
+
Open the next agent — the SessionStart hook recalls the same handoff and the durable memory. It picks up
|
|
1437
|
+
the test command and the open blocker without you retyping them.
|
|
1426
1438
|
</div>
|
|
1427
1439
|
</div>
|
|
1428
1440
|
|
|
1429
1441
|
<div class="vignette reveal">
|
|
1430
1442
|
<div class="v-say">Share this feature's design memory with the team.</div>
|
|
1431
|
-
<pre class="v-call">
|
|
1432
|
-
|
|
1433
|
-
|
|
1443
|
+
<pre class="v-call">
|
|
1444
|
+
share_publish({uri: "viking://user/you/memories/durable/projects/<repo>/<feature>.md"})</pre
|
|
1445
|
+
>
|
|
1446
|
+
<pre class="v-response">
|
|
1447
|
+
Published → shared/<team>/durable/projects/<repo>/<feature>.md
|
|
1448
|
+
git push: ok</pre
|
|
1449
|
+
>
|
|
1434
1450
|
<div class="v-answer">
|
|
1435
1451
|
The memory lands in the team git repo. Their agent's next recall/read auto-syncs clean incoming changes
|
|
1436
1452
|
and surfaces it alongside their own memories — no DM forwarding, no PDF dumping.
|
|
@@ -1439,8 +1455,12 @@ git push: ok</pre>
|
|
|
1439
1455
|
|
|
1440
1456
|
<div class="vignette reveal">
|
|
1441
1457
|
<div class="v-say v-auto">(automatic — the PreCompact hook fires before context compaction)</div>
|
|
1442
|
-
<pre class="v-call">
|
|
1443
|
-
|
|
1458
|
+
<pre class="v-call">
|
|
1459
|
+
remember_context({kind: "handoff", project: "<repo>", topic: "auto-precompact", text: "..."})</pre
|
|
1460
|
+
>
|
|
1461
|
+
<pre class="v-response">
|
|
1462
|
+
Stored: viking://user/you/memories/handoffs/active/<repo>/auto-precompact.md</pre
|
|
1463
|
+
>
|
|
1444
1464
|
<div class="v-answer">
|
|
1445
1465
|
Compaction summarizes the conversation arc but loses the durable facts. Threadnote's hook captures them
|
|
1446
1466
|
first; the post-compaction turn recalls them and resumes without amnesia.
|
|
@@ -1449,8 +1469,12 @@ git push: ok</pre>
|
|
|
1449
1469
|
|
|
1450
1470
|
<div class="vignette reveal">
|
|
1451
1471
|
<div class="v-say">Remember that this repo cuts release notes from CI via gh release create.</div>
|
|
1452
|
-
<pre class="v-call">
|
|
1453
|
-
|
|
1472
|
+
<pre class="v-call">
|
|
1473
|
+
remember_context({kind: "durable", project: "<repo>", topic: "release-process", text: "..."})</pre
|
|
1474
|
+
>
|
|
1475
|
+
<pre class="v-response">
|
|
1476
|
+
Stored: viking://user/you/memories/durable/projects/<repo>/release-process.md</pre
|
|
1477
|
+
>
|
|
1454
1478
|
<div class="v-answer">
|
|
1455
1479
|
Next time anyone asks where releases happen, the agent finds it in two seconds. No grepping the wiki.
|
|
1456
1480
|
</div>
|
|
@@ -1459,7 +1483,9 @@ git push: ok</pre>
|
|
|
1459
1483
|
<div class="vignette reveal">
|
|
1460
1484
|
<div class="v-say">What did we conclude about the export-workflow timeout?</div>
|
|
1461
1485
|
<pre class="v-call">recall_context({query: "export workflow timeout findings"})</pre>
|
|
1462
|
-
<pre class="v-response"
|
|
1486
|
+
<pre class="v-response">
|
|
1487
|
+
→ viking://user/you/memories/durable/projects/<repo>/export-timeout.md (score 0.71)</pre
|
|
1488
|
+
>
|
|
1463
1489
|
<div class="v-answer">
|
|
1464
1490
|
Re-open the same investigation three weeks later; the durable memory points your agent at the right
|
|
1465
1491
|
files and the resolution. The trail doesn't decay.
|
|
@@ -1481,9 +1507,7 @@ threadnote mcp-install codex --apply # or claude / cursor / copilot
|
|
|
1481
1507
|
threadnote doctor --dry-run</code></pre>
|
|
1482
1508
|
|
|
1483
1509
|
<div class="cta-row">
|
|
1484
|
-
<a class="cta" href="https://github.com/Kashkovsky/threadnote" target="_blank" rel="noopener">
|
|
1485
|
-
GitHub →
|
|
1486
|
-
</a>
|
|
1510
|
+
<a class="cta" href="https://github.com/Kashkovsky/threadnote" target="_blank" rel="noopener"> GitHub → </a>
|
|
1487
1511
|
<a class="cta outline" href="https://www.npmjs.com/package/threadnote" target="_blank" rel="noopener">
|
|
1488
1512
|
npm
|
|
1489
1513
|
</a>
|
package/docs/share.md
CHANGED
|
@@ -61,9 +61,9 @@ threadnote share publish viking://user/you/memories/durable/projects/foo/bar.md
|
|
|
61
61
|
# --team <name>, --message "...", --no-push, --dry-run.
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
`share publish`
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
`share publish` writes the memory into the team's shared subtree, commits with
|
|
65
|
+
the message `share: publish <relative-path>`, pushes, then removes the personal
|
|
66
|
+
copy after the push succeeds. The memory's recall path becomes
|
|
67
67
|
`viking://user/you/memories/shared/<team>/durable/projects/foo/bar.md`.
|
|
68
68
|
|
|
69
69
|
Before writing, `share publish` strips `supersedes:` and `archived_from:`
|
|
@@ -126,11 +126,25 @@ shared repo.
|
|
|
126
126
|
```bash
|
|
127
127
|
threadnote share remove --team friends # deletes worktree + gitdir
|
|
128
128
|
threadnote share remove --team friends --keep-files
|
|
129
|
+
threadnote share remove --team friends --preserve-local
|
|
129
130
|
```
|
|
130
131
|
|
|
131
|
-
`share remove
|
|
132
|
-
|
|
133
|
-
|
|
132
|
+
`share remove --preserve-local` copies shared durable memories back into the
|
|
133
|
+
personal durable tree before removing the team config. It does not delete remote
|
|
134
|
+
git history. `share remove` without `--keep-files` deletes the local checkout.
|
|
135
|
+
Push any unpushed commits first (`threadnote share sync` or
|
|
136
|
+
`git -C <worktree> push`), otherwise unpublished work is lost.
|
|
137
|
+
|
|
138
|
+
### Rename or move a team remote
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
threadnote share rename --team friends --to platform
|
|
142
|
+
threadnote share set-url --team platform git@github.com:org/platform-threadnote.git
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
`share rename` moves the local worktree/gitdir, updates `teams.json`, and
|
|
146
|
+
reindexes the shared memory namespace under the new team name. `share set-url`
|
|
147
|
+
updates the git `origin` URL and verifies it with `git fetch`.
|
|
134
148
|
|
|
135
149
|
## Privacy & safety rules
|
|
136
150
|
|