threadnote 1.1.2 → 1.1.4
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/LICENSE +67 -80
- package/README.md +19 -2
- package/THIRD_PARTY.md +36 -0
- package/dist/mcp_server.cjs +618 -19
- package/dist/threadnote.cjs +519 -32
- package/docs/agent-instructions.md +22 -5
- package/docs/index.html +2 -2
- package/docs/share.md +100 -10
- package/docs/troubleshooting.md +11 -3
- package/package.json +4 -3
- package/scripts/install.sh +5 -1
|
@@ -119,11 +119,12 @@ compact_context({"project":"my-repo","topic":"active-bug","dryRun":true})
|
|
|
119
119
|
|
|
120
120
|
Never compact secrets, credentials, customer data, raw production logs, or checked-in canonical docs into memory.
|
|
121
121
|
|
|
122
|
-
## Sharing
|
|
122
|
+
## Sharing context with teammates
|
|
123
123
|
|
|
124
|
-
Threadnote can publish a curated subset of durable memories
|
|
125
|
-
|
|
126
|
-
|
|
124
|
+
Threadnote can publish a curated subset of durable memories and agent artifacts (Codex/Claude skills and Claude
|
|
125
|
+
commands) into a team git repo so other engineers' agents can pull them. The mechanism lives under the
|
|
126
|
+
`viking://user/<you>/memories/shared/<team>/...` subtree; only content that is explicitly published leaves the machine.
|
|
127
|
+
Personal handoffs, preferences, and unpublished durable notes always stay local.
|
|
127
128
|
|
|
128
129
|
Publish a durable memory when its content is useful to other engineers working on the same project (intended behavior,
|
|
129
130
|
design decisions, API contracts, gotchas) and is safe to share. Do NOT publish:
|
|
@@ -136,6 +137,16 @@ The MCP tool `share_publish` runs the same scrubber as the CLI and refuses to pu
|
|
|
136
137
|
patterns (PEM private keys, `sk-...`, `gh[pousr]_...`, `Bearer ...`, `AKIA...`, `xox[abprs]-...`). It writes and pushes
|
|
137
138
|
the shared copy first, then removes the personal copy after the push succeeds.
|
|
138
139
|
|
|
140
|
+
The MCP tool `share_skill` shares a local Codex/Claude `SKILL.md` file or Claude command markdown file into the team's
|
|
141
|
+
`agent-artifacts/` catalog after the same scrubber checks. Shared artifacts are recallable after sync, but local
|
|
142
|
+
installation remains opt-in with `threadnote share install-artifacts --apply`.
|
|
143
|
+
|
|
144
|
+
When the user asks whether shared skills exist, call `list_shared_skills`. When the user asks to install one, call
|
|
145
|
+
`install_shared_skill` with the selected `name`; include `agent` and `kind` from the list result when available.
|
|
146
|
+
`list_shared_skills` syncs shared repos before listing and reports `not_installed`, `current`, `update_available`,
|
|
147
|
+
`local_modified`, or `remote_changed_and_local_modified`. Install/update selected shared skills only when the user asks;
|
|
148
|
+
use `force:true` only when the user explicitly accepts overwriting local modifications.
|
|
149
|
+
|
|
139
150
|
Incoming shared memories are normally fetched and synced automatically before MCP `recall_context` / `read_context` and
|
|
140
151
|
CLI `threadnote recall` / `threadnote read` return. If automatic sync reports a dirty worktree, a conflict, or another
|
|
141
152
|
git issue, run `threadnote share sync` after resolving the local state to pull, reindex, and push explicitly.
|
|
@@ -144,9 +155,13 @@ git issue, run `threadnote share sync` after resolving the local state to pull,
|
|
|
144
155
|
# MCP call shape
|
|
145
156
|
share_publish({"uri":"viking://user/you/memories/durable/projects/foo/bar.md"})
|
|
146
157
|
share_publish({"uri":"viking://user/you/memories/durable/projects/foo/bar.md","team":"friends","push":false})
|
|
158
|
+
share_skill({"path":"~/.codex/skills/reviewer/SKILL.md"})
|
|
159
|
+
list_shared_skills({})
|
|
160
|
+
install_shared_skill({"name":"reviewer","agent":"codex","kind":"skill"})
|
|
147
161
|
```
|
|
148
162
|
|
|
149
|
-
Before publishing, confirm with the user unless they have already instructed you to share durable memories
|
|
163
|
+
Before publishing, confirm with the user unless they have already instructed you to share durable memories or agent
|
|
164
|
+
artifacts autonomously.
|
|
150
165
|
|
|
151
166
|
## Handoff
|
|
152
167
|
|
|
@@ -184,5 +199,7 @@ threadnote forget viking://user/example/memories/events/duplicate.md
|
|
|
184
199
|
threadnote handoff --project example --topic active-issue --task "short task summary" --tests "checks run" --next-step "what to do next"
|
|
185
200
|
threadnote share init git@github.com:org/team-memories.git
|
|
186
201
|
threadnote share publish viking://user/example/memories/durable/projects/foo/bar.md
|
|
202
|
+
threadnote share publish-artifact ~/.codex/skills/example/SKILL.md
|
|
203
|
+
threadnote share install-artifacts --name example --agent codex --kind skill --apply
|
|
187
204
|
threadnote share sync
|
|
188
205
|
```
|
package/docs/index.html
CHANGED
|
@@ -783,7 +783,7 @@
|
|
|
783
783
|
team-shared decisions — recallable from any session, on any agent, in any worktree.
|
|
784
784
|
</p>
|
|
785
785
|
<div class="cta-row">
|
|
786
|
-
<span class="pill"><span id="version-tag">v0.6.1</span> · local-first ·
|
|
786
|
+
<span class="pill"><span id="version-tag">v0.6.1</span> · local-first · AGPL-3.0-or-later</span>
|
|
787
787
|
</div>
|
|
788
788
|
</div>
|
|
789
789
|
<div class="scroll-cue">scroll ↓ · <span class="kbd">↓</span> / <span class="kbd">j</span></div>
|
|
@@ -1585,7 +1585,7 @@ threadnote doctor --dry-run</code></pre>
|
|
|
1585
1585
|
</div>
|
|
1586
1586
|
|
|
1587
1587
|
<p class="colophon">
|
|
1588
|
-
threadnote ·
|
|
1588
|
+
threadnote · AGPL-3.0-or-later · built on OpenViking 0.3.24 · use <span class="kbd">↑</span>
|
|
1589
1589
|
<span class="kbd">↓</span> / <span class="kbd">j</span> <span class="kbd">k</span> to navigate
|
|
1590
1590
|
</p>
|
|
1591
1591
|
</div>
|
package/docs/share.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# Sharing
|
|
1
|
+
# Sharing context with teammates
|
|
2
2
|
|
|
3
|
-
`threadnote share` lets a small team keep
|
|
4
|
-
git repository so every member's local agent can recall them.
|
|
5
|
-
preferences, and unpublished durable notes stay local; only
|
|
6
|
-
explicitly publish
|
|
3
|
+
`threadnote share` lets a small team keep curated durable memories and agent
|
|
4
|
+
artifacts in a git repository so every member's local agent can recall them.
|
|
5
|
+
Personal handoffs, preferences, and unpublished durable notes stay local; only
|
|
6
|
+
content you explicitly publish leaves your machine.
|
|
7
7
|
|
|
8
8
|
## Model in one screen
|
|
9
9
|
|
|
@@ -34,7 +34,7 @@ threadnote share init --team friends git@github.com:you/friends-memories.git
|
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
`share init` clones the remote into your local memory tree and ingests any
|
|
37
|
-
existing markdown
|
|
37
|
+
existing shareable markdown into OpenViking.
|
|
38
38
|
|
|
39
39
|
### See what's configured
|
|
40
40
|
|
|
@@ -86,6 +86,95 @@ Threadnote rewrites the shared memory in place, strips local-only provenance
|
|
|
86
86
|
headers, commits, and pushes the shared repo. You do not need to store a
|
|
87
87
|
personal replacement and run `share publish` again.
|
|
88
88
|
|
|
89
|
+
### Share a skill or command
|
|
90
|
+
|
|
91
|
+
Shared agent artifacts live in the same team repo, but outside `durable/`:
|
|
92
|
+
|
|
93
|
+
```text
|
|
94
|
+
agent-artifacts/
|
|
95
|
+
skills/codex/<name>/SKILL.md
|
|
96
|
+
skills/claude/<name>/SKILL.md
|
|
97
|
+
commands/claude/<name>.md
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Publish a local artifact:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
threadnote share publish-artifact ~/.codex/skills/reviewer/SKILL.md
|
|
104
|
+
threadnote share publish-artifact ~/.claude/skills/triage/SKILL.md
|
|
105
|
+
threadnote share publish-artifact ~/.claude/commands/review-pr.md
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Path inference handles the common Codex and Claude locations. If the file is
|
|
109
|
+
somewhere else, pass metadata explicitly:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
threadnote share publish-artifact ./SKILL.md --agent codex --kind skill --name reviewer
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Useful flags:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
threadnote share publish-artifact <path> --preview
|
|
119
|
+
threadnote share publish-artifact <path> --redact
|
|
120
|
+
threadnote share publish-artifact <path> --force
|
|
121
|
+
threadnote share publish-artifact <path> --no-push
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
`publish-artifact` runs the same scrubber as memory publish, writes the artifact
|
|
125
|
+
under `agent-artifacts/`, ingests it into OpenViking under the shared team
|
|
126
|
+
namespace, commits, and pushes. Existing artifacts with different content are
|
|
127
|
+
not overwritten unless `--force` is passed.
|
|
128
|
+
|
|
129
|
+
Agents can do the same through MCP:
|
|
130
|
+
|
|
131
|
+
```text
|
|
132
|
+
share_skill({"path":"~/.codex/skills/reviewer/SKILL.md"})
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Agents can also list and install shared artifacts through MCP:
|
|
136
|
+
|
|
137
|
+
```text
|
|
138
|
+
list_shared_skills({})
|
|
139
|
+
install_shared_skill({"name":"reviewer","agent":"codex","kind":"skill"})
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
`list_shared_skills` syncs configured shared repos before listing and reports
|
|
143
|
+
one of:
|
|
144
|
+
|
|
145
|
+
- `not_installed`
|
|
146
|
+
- `current`
|
|
147
|
+
- `update_available`
|
|
148
|
+
- `local_modified`
|
|
149
|
+
- `remote_changed_and_local_modified`
|
|
150
|
+
|
|
151
|
+
### Install shared artifacts locally
|
|
152
|
+
|
|
153
|
+
Shared artifacts are recallable after sync, but they are not installed into
|
|
154
|
+
agent-native locations automatically. Installation is opt-in:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
threadnote share install-artifacts # preview only
|
|
158
|
+
threadnote share install-artifacts --apply # write files locally
|
|
159
|
+
threadnote share install-artifacts --name reviewer --agent codex --kind skill --apply
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Install targets are namespaced by Threadnote team to avoid colliding with
|
|
163
|
+
personal files:
|
|
164
|
+
|
|
165
|
+
```text
|
|
166
|
+
~/.codex/skills/threadnote/<team>/<name>/SKILL.md
|
|
167
|
+
~/.claude/skills/threadnote/<team>/<name>/SKILL.md
|
|
168
|
+
~/.claude/commands/threadnote/<team>/<name>.md
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
If a target already exists with different content, installation refuses to
|
|
172
|
+
overwrite local modifications unless `--force` is passed. Remote updates are
|
|
173
|
+
applied by running the same install command again; Threadnote tracks the last
|
|
174
|
+
installed shared hash in a sidecar metadata file next to the installed
|
|
175
|
+
artifact. Start a new agent session after installing if that agent snapshots
|
|
176
|
+
skills or commands at startup.
|
|
177
|
+
|
|
89
178
|
### Keep teammates' updates current
|
|
90
179
|
|
|
91
180
|
Threadnote does a periodic background `git fetch` for configured share teams.
|
|
@@ -176,10 +265,11 @@ updates the git `origin` URL and verifies it with `git fetch`.
|
|
|
176
265
|
- linux home paths (`/home/<you>/...`) → `<local-path>`
|
|
177
266
|
- The scrubber complements but does not replace human review. Strip the value,
|
|
178
267
|
preview with `--preview`, and then publish.
|
|
179
|
-
- Only
|
|
180
|
-
`incidents/`, and other lifecycle
|
|
181
|
-
|
|
182
|
-
skip any file outside
|
|
268
|
+
- Only `durable/` memories and `agent-artifacts/` markdown files are
|
|
269
|
+
shareable. `handoffs/`, `preferences/`, `incidents/`, and other lifecycle
|
|
270
|
+
kinds stay local by construction — both the initial ingest (`share init`) and
|
|
271
|
+
the sync-pull reindex (`share sync`) skip any file outside the shareable
|
|
272
|
+
top-level directories.
|
|
183
273
|
- `share publish` deletes the personal copy after publishing. If you want to
|
|
184
274
|
keep both, copy the memory to a new URI first (`ov read` then
|
|
185
275
|
`threadnote remember`).
|
package/docs/troubleshooting.md
CHANGED
|
@@ -8,7 +8,9 @@ Run:
|
|
|
8
8
|
threadnote install
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
The installer prefers `uv`, then `pipx`, then `python3 -m pip install --user`.
|
|
11
|
+
The installer prefers `uv`, then `pipx`, then `python3 -m pip install --user`. For `curl | sh` installs, the wrapper
|
|
12
|
+
reattaches `threadnote install` to your terminal when possible so it can prompt to install `uv` and continue instead of
|
|
13
|
+
falling straight through to the pip fallback.
|
|
12
14
|
|
|
13
15
|
## `uv` Fails With `UnknownIssuer`
|
|
14
16
|
|
|
@@ -83,8 +85,14 @@ For detached starts, logs are written to:
|
|
|
83
85
|
~/.openviking/logs/server.log
|
|
84
86
|
```
|
|
85
87
|
|
|
86
|
-
If `start` reports that OpenViking did not become healthy,
|
|
87
|
-
|
|
88
|
+
If `start` reports that OpenViking did not become healthy, first check whether it finished shortly after the timeout:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
threadnote doctor --dry-run
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
If it still is not healthy, open that log. Certificate failures during the first embedding model download are covered
|
|
95
|
+
above.
|
|
88
96
|
|
|
89
97
|
## Port Already In Use
|
|
90
98
|
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "threadnote",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.4",
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"main": "dist/threadnote.cjs",
|
|
6
6
|
"description": "Shared local context and handoffs for development agents",
|
|
7
|
-
"license": "
|
|
7
|
+
"license": "AGPL-3.0-or-later",
|
|
8
8
|
"homepage": "https://github.com/Kashkovsky/threadnote#readme",
|
|
9
9
|
"bugs": {
|
|
10
10
|
"url": "https://github.com/Kashkovsky/threadnote/issues"
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
"dist/",
|
|
36
36
|
"docs/",
|
|
37
37
|
"LICENSE",
|
|
38
|
+
"THIRD_PARTY.md",
|
|
38
39
|
"manager/",
|
|
39
40
|
"README.md",
|
|
40
41
|
"scripts/"
|
|
@@ -71,7 +72,7 @@
|
|
|
71
72
|
"@types/react": "^19.2.16",
|
|
72
73
|
"@types/react-dom": "^19.2.3",
|
|
73
74
|
"@vitest/coverage-v8": "^4.1.7",
|
|
74
|
-
"commander": "^
|
|
75
|
+
"commander": "^15.0.0",
|
|
75
76
|
"esbuild": "^0.27.7",
|
|
76
77
|
"eslint": "^10.3.0",
|
|
77
78
|
"globals": "^17.6.0",
|
package/scripts/install.sh
CHANGED
|
@@ -116,7 +116,11 @@ install_package "$runtime"
|
|
|
116
116
|
threadnote_bin="$(find_threadnote "$runtime")" || die "Installed $PACKAGE, but could not find the threadnote command."
|
|
117
117
|
|
|
118
118
|
say "Running threadnote install"
|
|
119
|
-
|
|
119
|
+
if { true </dev/tty; } 2>/dev/null; then
|
|
120
|
+
"$threadnote_bin" install "$@" </dev/tty
|
|
121
|
+
else
|
|
122
|
+
"$threadnote_bin" install "$@"
|
|
123
|
+
fi
|
|
120
124
|
|
|
121
125
|
if ! have threadnote; then
|
|
122
126
|
say ""
|