threadnote 1.2.0 → 1.3.0
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 +8 -0
- package/dist/mcp_server.cjs +2175 -1022
- package/dist/threadnote.cjs +1076 -18
- package/docs/index.html +11 -0
- package/docs/share.md +102 -0
- package/package.json +1 -1
package/docs/index.html
CHANGED
|
@@ -1474,6 +1474,17 @@ threadnote remember \
|
|
|
1474
1474
|
</p>
|
|
1475
1475
|
|
|
1476
1476
|
<div class="vignettes">
|
|
1477
|
+
<div class="vignette reveal">
|
|
1478
|
+
<div class="v-say">What can I do with Threadnote?</div>
|
|
1479
|
+
<pre class="v-call">threadnote_guide({})</pre>
|
|
1480
|
+
<pre class="v-response">→ a short, setup-aware tour: recall · capture · tidy · share · skills</pre>
|
|
1481
|
+
<div class="v-answer">
|
|
1482
|
+
The agent calls the onboarding tool and walks you through Threadnote one capability at a time — offering
|
|
1483
|
+
to run each (recall your last handoff, save a durable note, set up team sharing) rather than dumping a
|
|
1484
|
+
manual. The walkthrough loads only when you ask, so it never sits in your context otherwise.
|
|
1485
|
+
</div>
|
|
1486
|
+
</div>
|
|
1487
|
+
|
|
1477
1488
|
<div class="vignette reveal">
|
|
1478
1489
|
<div class="v-say">Continue where we left off on this branch.</div>
|
|
1479
1490
|
<pre class="v-call">recall_context({query: "<branch> latest handoff durable feature memory"})</pre>
|
package/docs/share.md
CHANGED
|
@@ -126,6 +126,100 @@ under `agent-artifacts/`, ingests it into OpenViking under the shared team
|
|
|
126
126
|
namespace, commits, and pushes. Existing artifacts with different content are
|
|
127
127
|
not overwritten unless `--force` is passed.
|
|
128
128
|
|
|
129
|
+
#### Multi-file skills (bundles)
|
|
130
|
+
|
|
131
|
+
A skill is shared as its **whole directory**, not just `SKILL.md`. When companion
|
|
132
|
+
files sit beside the `SKILL.md` (reference docs, scripts, templates), they travel
|
|
133
|
+
with the skill:
|
|
134
|
+
|
|
135
|
+
```text
|
|
136
|
+
agent-artifacts/skills/codex/<name>/
|
|
137
|
+
SKILL.md # recall anchor (OpenViking-ingested)
|
|
138
|
+
scripts/run.ts # companion, carried in git
|
|
139
|
+
reference.md
|
|
140
|
+
.threadnote-bundle.json # generated member manifest (sha + binary flags)
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Notes:
|
|
144
|
+
|
|
145
|
+
- A lone `SKILL.md` with no companions publishes exactly as before — no manifest,
|
|
146
|
+
one file.
|
|
147
|
+
- Every **text** member runs through the scrubber, so a leaked credential or local
|
|
148
|
+
path in a companion script blocks the publish just like it would in `SKILL.md`.
|
|
149
|
+
- Only `SKILL.md` (and any sibling `.md`) is OpenViking-ingested for recall;
|
|
150
|
+
companions ride in git and are materialized on install.
|
|
151
|
+
- Runtime/scratch dirs and local junk are never bundled: `reviews/`, `repos/`,
|
|
152
|
+
`node_modules/`, `.git/`, `.DS_Store`, `*.log`.
|
|
153
|
+
- **Binary** members are blocked by default because the scrubber cannot inspect
|
|
154
|
+
them; pass `--allow-binary` (CLI) / `allowBinary: true` (MCP) to include them.
|
|
155
|
+
A credential detected in the bytes still blocks regardless.
|
|
156
|
+
- A skill whose helpers live **outside** its own directory (a multi-skill
|
|
157
|
+
constellation with shared code at the repo root) is shared as a **pack** — see
|
|
158
|
+
below.
|
|
159
|
+
|
|
160
|
+
#### Constellation packs
|
|
161
|
+
|
|
162
|
+
When several skills share code that lives outside any single skill directory
|
|
163
|
+
(e.g. repo-root `scripts/` and `lib/`), publish them together as a **pack** from
|
|
164
|
+
a `threadnote-bundle.json` manifest at the repo root:
|
|
165
|
+
|
|
166
|
+
```json
|
|
167
|
+
{
|
|
168
|
+
"version": 1,
|
|
169
|
+
"name": "review-pr-suite",
|
|
170
|
+
"agent": "claude",
|
|
171
|
+
"description": "PR/MR review constellation.",
|
|
172
|
+
"skills": [".claude/skills/review-pr", ".claude/skills/pr-action"],
|
|
173
|
+
"include": ["scripts", "lib", "package.json", "tsconfig.json"],
|
|
174
|
+
"deps": {"runtime": ["bun"], "cli": ["gh", "glab", "jq"], "mcp": ["mcp__pal__clink"]},
|
|
175
|
+
"pathRewrites": [{"from": "/Users/alex/code/reviewer"}]
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
threadnote share publish-bundle ./threadnote-bundle.json --preview
|
|
181
|
+
threadnote share publish-bundle ./threadnote-bundle.json
|
|
182
|
+
threadnote share install-artifacts --kind pack --name review-pr-suite --apply
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
```text
|
|
186
|
+
share_bundle({"path":"~/src/reviewer/threadnote-bundle.json"})
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
How packs work:
|
|
190
|
+
|
|
191
|
+
- Every declared skill plus the `include` paths are gathered, preserving the
|
|
192
|
+
author's repo-relative layout, and written under
|
|
193
|
+
`agent-artifacts/packs/<agent>/<name>/files/...` next to a generated
|
|
194
|
+
`<name>.pack.md` recall index and a `<name>.pack.json` manifest.
|
|
195
|
+
- Install materializes the **whole tree under one root**
|
|
196
|
+
(`~/.{codex,claude}/skills/threadnote-packs/<team>/<name>/` — a dedicated
|
|
197
|
+
namespace so a pack and a same-named skill never share an install directory),
|
|
198
|
+
preserving the source repo layout (so a skill declared at
|
|
199
|
+
`.claude/skills/<name>` lands at `<root>/.claude/skills/<name>/SKILL.md` beside
|
|
200
|
+
`<root>/scripts/...`). This keeps **file-anchored** references working
|
|
201
|
+
unchanged: relative imports (`../lib/types`) and `import.meta.dir`-relative
|
|
202
|
+
paths resolve exactly as they did in the source repo.
|
|
203
|
+
- **CWD-relative invocations do not auto-resolve.** A bare `bun run scripts/...`
|
|
204
|
+
in a skill body is resolved against the agent's working directory, not the
|
|
205
|
+
pack root, so anchor such paths to the token:
|
|
206
|
+
`bun run ${THREADNOTE_PACK_ROOT}/scripts/vcs-detect.ts`. The token is expanded
|
|
207
|
+
to the absolute install root in every text member at install.
|
|
208
|
+
- Hardcoded absolute repo-root paths are rewritten to that
|
|
209
|
+
`${THREADNOTE_PACK_ROOT}` token at publish (the manifest dir plus any declared
|
|
210
|
+
`pathRewrites`, which must be absolute repo-root paths) and expanded back to
|
|
211
|
+
the real install directory at install. A residual `/Users` or `/home` path
|
|
212
|
+
that no rewrite covers trips the scrubber and blocks the publish. Other
|
|
213
|
+
machine-local absolute paths (`/opt`, `/srv`, `/private`, Windows `C:\…`) are
|
|
214
|
+
**not** auto-detected — declare them in `pathRewrites` or strip them, and
|
|
215
|
+
`--preview` before publishing. Binary members included via `--allow-binary`
|
|
216
|
+
are scanned for embedded home paths and declared roots but are otherwise
|
|
217
|
+
shipped byte-for-byte with no rewrite.
|
|
218
|
+
- `deps` are declared, not bundled: Threadnote installs files, not runtimes or
|
|
219
|
+
MCP servers. After install it prints a loud "this pack will NOT run until these
|
|
220
|
+
exist" notice listing the runtime/CLI/OS tools and any MCP servers to
|
|
221
|
+
configure separately.
|
|
222
|
+
|
|
129
223
|
Agents can do the same through MCP:
|
|
130
224
|
|
|
131
225
|
```text
|
|
@@ -175,6 +269,14 @@ installed shared hash in a sidecar metadata file next to the installed
|
|
|
175
269
|
artifact. Start a new agent session after installing if that agent snapshots
|
|
176
270
|
skills or commands at startup.
|
|
177
271
|
|
|
272
|
+
For a multi-file skill, the whole `~/.{codex,claude}/skills/threadnote/<team>/<name>/`
|
|
273
|
+
tree is installed (companions included) and the install is atomic — it is staged
|
|
274
|
+
in a temporary directory and swapped into place, so an interrupted install never
|
|
275
|
+
leaves a half-written, mixed-version skill. Bundle status folds every member into
|
|
276
|
+
one verdict: a local edit to any member plus an upstream change to a different
|
|
277
|
+
member reports `remote_changed_and_local_modified` and refuses to overwrite
|
|
278
|
+
without `--force`.
|
|
279
|
+
|
|
178
280
|
### Keep teammates' updates current
|
|
179
281
|
|
|
180
282
|
Threadnote does a periodic background `git fetch` for configured share teams.
|