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.
@@ -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 memories with teammates
122
+ ## Sharing context with teammates
123
123
 
124
- Threadnote can publish a curated subset of durable memories into a team git repo so other engineers' agents can pull them.
125
- The mechanism lives under the `viking://user/<you>/memories/shared/<team>/...` subtree; only memories that are explicitly
126
- published leave the machine. Personal handoffs, preferences, and unpublished durable notes always stay local.
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 autonomously.
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 · GPL-3.0-or-later</span>
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 ↓ &nbsp;·&nbsp; <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 · GPL-3.0-or-later · built on OpenViking 0.3.24 · use <span class="kbd">↑</span>
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 memories with teammates
1
+ # Sharing context with teammates
2
2
 
3
- `threadnote share` lets a small team keep a curated set of durable memories in a
4
- git repository so every member's local agent can recall them. Personal handoffs,
5
- preferences, and unpublished durable notes stay local; only memories you
6
- explicitly publish leave your machine.
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 memories into OpenViking.
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 the `durable/` kind is shareable. `handoffs/`, `preferences/`,
180
- `incidents/`, and other lifecycle kinds stay local by construction — both
181
- the initial ingest (`share init`) and the sync-pull reindex (`share sync`)
182
- skip any file outside `durable/`.
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`).
@@ -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, open that log. Certificate failures during the first embedding
87
- model download are covered above.
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.2",
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": "GPL-3.0-or-later",
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": "^14.0.3",
75
+ "commander": "^15.0.0",
75
76
  "esbuild": "^0.27.7",
76
77
  "eslint": "^10.3.0",
77
78
  "globals": "^17.6.0",
@@ -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
- "$threadnote_bin" install "$@"
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 ""