threadnote 0.7.8 → 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.
@@ -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 is a destructive
137
- operation: it removes the personal copy after the shared copy is committed.
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: radial-gradient(circle at 25% 30%, rgba(94, 224, 197, 0.08), transparent 55%),
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: border-color 0.2s ease, transform 0.2s ease;
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: background-color 0.2s ease, transform 0.2s ease;
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: opacity 0.6s ease, transform 0.6s ease;
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>sk-…</code> / <code>github_pat_…</code> / <code>glpat-…</code>, JWTs, AWS keys, or Slack tokens.
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
- If <code>share publish</code> can't remove the personal copy after writing the shared copy, it rolls the
1071
- shared write back. You either publish cleanly or you publish nothing.
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
- that, <code>mcp-install</code> per agent and you're done.
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. <code>archive</code>
1278
- moves them out of the active recall scope; <code>--include-archived</code> still finds them.
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: "&lt;branch&gt; latest handoff durable feature memory"})</pre>
1411
- <pre class="v-response">→ viking://user/you/memories/handoffs/active/&lt;branch&gt;/auto-precompact.md
1412
- → viking://user/you/memories/durable/projects/&lt;repo&gt;/&lt;feature&gt;.md</pre>
1417
+ <pre class="v-response">
1418
+ → viking://user/you/memories/handoffs/active/&lt;branch&gt;/auto-precompact.md
1419
+ → viking://user/you/memories/durable/projects/&lt;repo&gt;/&lt;feature&gt;.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">remember_context({kind: "handoff", project: "&lt;repo&gt;", topic: "&lt;feature&gt;", text: "..."})</pre>
1422
- <pre class="v-response">Stored: viking://user/you/memories/handoffs/active/&lt;repo&gt;/&lt;feature&gt;.md</pre>
1429
+ <pre class="v-call">
1430
+ remember_context({kind: "handoff", project: "&lt;repo&gt;", topic: "&lt;feature&gt;", text: "..."})</pre
1431
+ >
1432
+ <pre class="v-response">
1433
+ Stored: viking://user/you/memories/handoffs/active/&lt;repo&gt;/&lt;feature&gt;.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
- up the test command and the open blocker without you retyping them.
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">share_publish({uri: "viking://user/you/memories/durable/projects/&lt;repo&gt;/&lt;feature&gt;.md"})</pre>
1432
- <pre class="v-response">Published → shared/&lt;team&gt;/durable/projects/&lt;repo&gt;/&lt;feature&gt;.md
1433
- git push: ok</pre>
1443
+ <pre class="v-call">
1444
+ share_publish({uri: "viking://user/you/memories/durable/projects/&lt;repo&gt;/&lt;feature&gt;.md"})</pre
1445
+ >
1446
+ <pre class="v-response">
1447
+ Published → shared/&lt;team&gt;/durable/projects/&lt;repo&gt;/&lt;feature&gt;.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">remember_context({kind: "handoff", project: "&lt;repo&gt;", topic: "auto-precompact", text: "..."})</pre>
1443
- <pre class="v-response">Stored: viking://user/you/memories/handoffs/active/&lt;repo&gt;/auto-precompact.md</pre>
1458
+ <pre class="v-call">
1459
+ remember_context({kind: "handoff", project: "&lt;repo&gt;", topic: "auto-precompact", text: "..."})</pre
1460
+ >
1461
+ <pre class="v-response">
1462
+ Stored: viking://user/you/memories/handoffs/active/&lt;repo&gt;/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">remember_context({kind: "durable", project: "&lt;repo&gt;", topic: "release-process", text: "..."})</pre>
1453
- <pre class="v-response">Stored: viking://user/you/memories/durable/projects/&lt;repo&gt;/release-process.md</pre>
1472
+ <pre class="v-call">
1473
+ remember_context({kind: "durable", project: "&lt;repo&gt;", topic: "release-process", text: "..."})</pre
1474
+ >
1475
+ <pre class="v-response">
1476
+ Stored: viking://user/you/memories/durable/projects/&lt;repo&gt;/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">→ viking://user/you/memories/durable/projects/&lt;repo&gt;/export-timeout.md (score 0.71)</pre>
1486
+ <pre class="v-response">
1487
+ → viking://user/you/memories/durable/projects/&lt;repo&gt;/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` moves the memory from your personal namespace into the team's
65
- shared subtree, commits with the message
66
- `share: publish <relative-path>`, and pushes. The memory's recall path becomes
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` without `--keep-files` deletes the local checkout. Push any
132
- unpushed commits first (`threadnote share sync` or `git -C <worktree> push`),
133
- otherwise unpublished work is lost.
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