@slamb2k/mad-skills 2.0.58 → 2.0.59
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/.claude-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/skills/build/SKILL.md +4 -4
- package/skills/ferry/SKILL.md +23 -23
- package/skills/ferry/references/{cargo-template.md → waybill-template.md} +4 -4
- package/skills/ferry/scripts/ferry.sh +12 -12
- package/skills/ferry/tests/evals.json +2 -2
- package/skills/manifest.json +2 -2
package/package.json
CHANGED
package/skills/build/SKILL.md
CHANGED
|
@@ -208,7 +208,7 @@ So there is exactly one execution-mode decision, and subagents are always on
|
|
|
208
208
|
underneath either choice:
|
|
209
209
|
|
|
210
210
|
- **Run here now** — orchestrate the build in this session, stages in subagents.
|
|
211
|
-
- **Hand off to a clean session** — ferry the state across (write a
|
|
211
|
+
- **Hand off to a clean session** — ferry the state across (write a waybill),
|
|
212
212
|
arm the resume signal, and let a fresh session run the *same* `/build` with its
|
|
213
213
|
own subagents.
|
|
214
214
|
|
|
@@ -230,9 +230,9 @@ the run-now decision.
|
|
|
230
230
|
orchestrator would start bloated. A fresh `/build` invocation in an empty
|
|
231
231
|
session does not need this — just run here now.
|
|
232
232
|
- **Plan is self-contained** — PLAN is a spec file or a complete written plan
|
|
233
|
-
that a
|
|
233
|
+
that a waybill can capture losslessly. If the plan leans on nuance from
|
|
234
234
|
*this* conversation (decisions made live, things looked at together), the
|
|
235
|
-
|
|
235
|
+
waybill is lossy — prefer run-here-now so that context isn't thrown away.
|
|
236
236
|
|
|
237
237
|
If **both** hold, ask via `AskUserQuestion`:
|
|
238
238
|
```
|
|
@@ -246,7 +246,7 @@ the run-now decision.
|
|
|
246
246
|
If either condition fails, don't ask — run here now.
|
|
247
247
|
|
|
248
248
|
**If handing off:** capture the resolved PLAN and any Stage-2 clarifications
|
|
249
|
-
gathered so far, then invoke the `ferry` skill. The
|
|
249
|
+
gathered so far, then invoke the `ferry` skill. The waybill's
|
|
250
250
|
"next steps" MUST be a single resume action: re-run this exact build in the
|
|
251
251
|
fresh session, e.g. `/build {original PLAN argument}` (plus any active flags,
|
|
252
252
|
minus `--handoff`). Include the resolved plan content and PROJECT_CONFIG so the
|
package/skills/ferry/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ferry
|
|
3
|
-
description: Ferry a session's live state across a context reset — persist a
|
|
3
|
+
description: Ferry a session's live state across a context reset — persist a waybill document and signal the next fresh session to resume from it. Use when the user types /ferry, says they want to hand off, checkpoint, wrap up, clear context, or start fresh while preserving state, or asks to carry work into a new session with clean optimised context. Captures everything a brand-new session needs — task, status, next steps, key files, decisions, gotchas, git state — writes it to disk as waybill.md, arms a one-shot signal, and tells the user to /clear so the next session auto-loads it.
|
|
4
4
|
argument-hint: repo, tmp, commit (optional target; default repo)
|
|
5
5
|
allowed-tools: Bash, Read, Write
|
|
6
6
|
---
|
|
@@ -23,10 +23,10 @@ CRITICAL: Reproduce the banner EXACTLY character-for-character, preserving all l
|
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
Taglines:
|
|
26
|
-
-
|
|
26
|
+
- 📋 Filing the waybill for the crossing...
|
|
27
27
|
- 🧳 All aboard — carrying the context across!
|
|
28
|
-
- 🤝 Passing the
|
|
29
|
-
-
|
|
28
|
+
- 🤝 Passing the waybill to a fresh crew!
|
|
29
|
+
- 📋 Waybill stamped, casting off to a clean session!
|
|
30
30
|
- 🌊 Ferrying the thread over calm water!
|
|
31
31
|
- 🛟 Nobody's work goes overboard on my watch!
|
|
32
32
|
- 🌅 New session on the far shore, same voyage!
|
|
@@ -36,24 +36,24 @@ Taglines:
|
|
|
36
36
|
## What this does
|
|
37
37
|
|
|
38
38
|
Ferry the live state of this session across a context reset: capture it into a
|
|
39
|
-
**
|
|
40
|
-
a clean session that will automatically resume from the
|
|
39
|
+
**waybill document** (`waybill.md`), arm a one-shot signal, and hand the user off to
|
|
40
|
+
a clean session that will automatically resume from the waybill. The point is to
|
|
41
41
|
**reset the context window without losing the thread** — the next session starts
|
|
42
42
|
lean but fully briefed.
|
|
43
43
|
|
|
44
44
|
Long sessions accumulate noise: dead ends, superseded plans, stale file reads. A
|
|
45
45
|
fresh session is faster and sharper, but naively starting over loses hard-won
|
|
46
46
|
context. `/ferry` distills only what the *next* session needs, persists it, and
|
|
47
|
-
signals that session to pick it up — once. It will not re-read old
|
|
47
|
+
signals that session to pick it up — once. It will not re-read old waybill on
|
|
48
48
|
unrelated future sessions, because the signal is consumed on first read.
|
|
49
49
|
|
|
50
50
|
## Usage
|
|
51
51
|
|
|
52
52
|
```
|
|
53
|
-
/ferry # default:
|
|
53
|
+
/ferry # default: waybill.md in repo root, kept OUT of git
|
|
54
54
|
/ferry repo # same as default (explicit)
|
|
55
55
|
/ferry tmp # write under /tmp — never touches the repo at all
|
|
56
|
-
/ferry commit # write docs/ferry/
|
|
56
|
+
/ferry commit # write docs/ferry/waybill-<timestamp>.md, meant to be committed
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
Read the argument from what the user typed. If none given, use `repo`.
|
|
@@ -88,24 +88,24 @@ date +%Y-%m-%d-%H%M
|
|
|
88
88
|
|
|
89
89
|
Then pick the path based on the argument:
|
|
90
90
|
|
|
91
|
-
- **`repo`** (default): `<repo_root>/
|
|
91
|
+
- **`repo`** (default): `<repo_root>/waybill.md`. If not inside a git repo, use the
|
|
92
92
|
current working directory instead. After writing, keep it out of version control
|
|
93
|
-
by appending `
|
|
93
|
+
by appending `waybill.md` to `<repo_root>/.git/info/exclude` if it's a git repo
|
|
94
94
|
and not already listed there. This is a *local* ignore — it never modifies the
|
|
95
95
|
tracked `.gitignore`, so it won't show up in anyone else's checkout or your diffs.
|
|
96
|
-
- **`tmp`**: `/tmp/claude-ferry/<key>/
|
|
96
|
+
- **`tmp`**: `/tmp/claude-ferry/<key>/waybill.md` where `<key>` is
|
|
97
97
|
`printf '%s' "$(pwd)" | cksum | cut -d' ' -f1`. Create the directory first.
|
|
98
98
|
Nothing is written inside the repo.
|
|
99
|
-
- **`commit`**: `<repo_root>/docs/ferry/
|
|
99
|
+
- **`commit`**: `<repo_root>/docs/ferry/waybill-<timestamp>.md`. Create the
|
|
100
100
|
`docs/ferry/` directory if needed. Do **not** ignore it — this variant exists
|
|
101
|
-
precisely so the
|
|
101
|
+
precisely so the waybill lands in git history as a durable checkpoint. Mention to
|
|
102
102
|
the user that they'll want to commit it.
|
|
103
103
|
|
|
104
|
-
### 2. Write the
|
|
104
|
+
### 2. Write the waybill document
|
|
105
105
|
|
|
106
106
|
This is the core of the skill — the document quality determines whether the next
|
|
107
107
|
session is productive or lost. Follow the structure in
|
|
108
|
-
`references/
|
|
108
|
+
`references/waybill-template.md`. Read that file now if you haven't.
|
|
109
109
|
|
|
110
110
|
Fill it from the **actual conversation and repo state**, not generic boilerplate.
|
|
111
111
|
Be concrete: real file paths, real function names, real commands, real decisions.
|
|
@@ -129,22 +129,22 @@ dead end is a genuine landmine worth a warning.
|
|
|
129
129
|
After the document is written, run (using the `PLUGIN_ROOT` resolved in pre-flight):
|
|
130
130
|
|
|
131
131
|
```bash
|
|
132
|
-
bash "$PLUGIN_ROOT/skills/ferry/scripts/ferry.sh" signal "<
|
|
132
|
+
bash "$PLUGIN_ROOT/skills/ferry/scripts/ferry.sh" signal "<absolute_path_to_waybill>"
|
|
133
133
|
```
|
|
134
134
|
|
|
135
135
|
This drops a signal keyed to the current project directory. The next session's
|
|
136
136
|
`SessionStart` hook — shipped with this plugin in `hooks/hooks.json` — detects it,
|
|
137
|
-
injects the
|
|
137
|
+
injects the waybill as context, and deletes the signal so it fires exactly once.
|
|
138
138
|
Use the **absolute** path.
|
|
139
139
|
|
|
140
140
|
### 4. Hand off to a fresh session
|
|
141
141
|
|
|
142
|
-
Tell the user plainly that the
|
|
142
|
+
Tell the user plainly that the waybill is ready and they should start the fresh
|
|
143
143
|
session themselves. You **cannot** trigger `/clear` programmatically — it is a
|
|
144
144
|
user-only command — so the final step is theirs. Say something like:
|
|
145
145
|
|
|
146
|
-
>
|
|
147
|
-
> (or **`/new`**) now — the fresh session will automatically load this
|
|
146
|
+
> Waybill written to `<path>` and the next session is armed. Type **`/clear`**
|
|
147
|
+
> (or **`/new`**) now — the fresh session will automatically load this waybill and
|
|
148
148
|
> pick up where we left off. Nothing else gets auto-loaded; the signal is consumed
|
|
149
149
|
> on first read.
|
|
150
150
|
|
|
@@ -156,8 +156,8 @@ need to take.
|
|
|
156
156
|
- **`/clear` is the user's to type.** No skill, hook, or command can clear the
|
|
157
157
|
context window automatically. Always end by asking them to do it.
|
|
158
158
|
- **The signal is one-shot and project-scoped.** It's keyed to the working
|
|
159
|
-
directory and deleted on first read, so
|
|
160
|
-
sessions. A `
|
|
159
|
+
directory and deleted on first read, so waybill never leaks into unrelated
|
|
160
|
+
sessions. A `waybill.md` left sitting in a repo is inert unless re-armed.
|
|
161
161
|
- **Don't pollute git by default.** Only the `commit` variant is meant to be
|
|
162
162
|
tracked. `repo` mode relies on `.git/info/exclude`; `tmp` mode stays entirely
|
|
163
163
|
outside the repo.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Waybill document template
|
|
2
2
|
|
|
3
3
|
Fill every section that applies. Drop sections that genuinely don't (e.g. no open
|
|
4
4
|
questions). Lead with what unblocks action; a fresh session should be able to make
|
|
@@ -6,12 +6,12 @@ its **next move within the first minute** of reading this.
|
|
|
6
6
|
|
|
7
7
|
Write concretely. "Fix the bug in the parser" is useless; "`parseImportFile()` in
|
|
8
8
|
`src/import.js:42` throws on empty `days` — needs a guard before the `Object.entries`
|
|
9
|
-
loop" is
|
|
9
|
+
loop" is waybill worth carrying. Prefer absolute or repo-relative file paths with line numbers.
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
13
13
|
```markdown
|
|
14
|
-
#
|
|
14
|
+
# Waybill — <short task title>
|
|
15
15
|
|
|
16
16
|
**Date:** <YYYY-MM-DD HH:MM> · **Branch:** <git branch> · **Repo:** <path>
|
|
17
17
|
|
|
@@ -83,7 +83,7 @@ ticket numbers, people involved.
|
|
|
83
83
|
think it works but didn't check, say "assumed — not yet run". A fresh session has
|
|
84
84
|
no way to tell otherwise and false confidence is expensive.
|
|
85
85
|
- **Link, don't paste:** point to files and line ranges rather than dumping large
|
|
86
|
-
code blocks. The next session can read them on demand; bloating the
|
|
86
|
+
code blocks. The next session can read them on demand; bloating the waybill just
|
|
87
87
|
refills the context window you're trying to clear.
|
|
88
88
|
- **Keep it skimmable:** headers, short bullets, code spans for paths/commands. A
|
|
89
89
|
wall of prose defeats the purpose.
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# ferry.sh — companion to the `ferry` skill.
|
|
3
3
|
#
|
|
4
|
-
# ferry.sh signal <
|
|
4
|
+
# ferry.sh signal <abs_waybill_path> [cwd]
|
|
5
5
|
# Drop a one-shot signal keyed to the current project (cwd) pointing at
|
|
6
|
-
# the
|
|
6
|
+
# the waybill document. The next session's SessionStart hook consumes it.
|
|
7
7
|
#
|
|
8
8
|
# ferry.sh load
|
|
9
9
|
# SessionStart hook entrypoint. Reads the event JSON on stdin; if a signal
|
|
10
|
-
# exists for this cwd, emits the
|
|
11
|
-
# the signal (one-shot — a stale
|
|
10
|
+
# exists for this cwd, emits the waybill as additionalContext and deletes
|
|
11
|
+
# the signal (one-shot — a stale waybill.md is never re-injected).
|
|
12
12
|
#
|
|
13
13
|
# The signal is keyed on the working directory, NOT the session id, because the
|
|
14
14
|
# session id changes after /clear. cwd is stable across a clear, so the fresh
|
|
@@ -26,12 +26,12 @@ cmd="${1:-load}"
|
|
|
26
26
|
|
|
27
27
|
case "$cmd" in
|
|
28
28
|
signal)
|
|
29
|
-
|
|
29
|
+
waybill_path="${2:?usage: ferry.sh signal <abs_waybill_path> [cwd]}"
|
|
30
30
|
cwd="${3:-$(pwd)}"
|
|
31
31
|
mkdir -p "$SIGNAL_DIR"
|
|
32
32
|
key="$(_key "$cwd")"
|
|
33
|
-
printf '%s\n' "$
|
|
34
|
-
printf 'ferry: signal armed for %s -> %s\n' "$cwd" "$
|
|
33
|
+
printf '%s\n' "$waybill_path" > "$SIGNAL_DIR/$key.signal"
|
|
34
|
+
printf 'ferry: signal armed for %s -> %s\n' "$cwd" "$waybill_path"
|
|
35
35
|
;;
|
|
36
36
|
|
|
37
37
|
load)
|
|
@@ -46,14 +46,14 @@ case "$cmd" in
|
|
|
46
46
|
|
|
47
47
|
key="$(_key "$cwd")"
|
|
48
48
|
signal="$SIGNAL_DIR/$key.signal"
|
|
49
|
-
[ -f "$signal" ] || exit 0 # no
|
|
49
|
+
[ -f "$signal" ] || exit 0 # no waybill pending — silent no-op
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
waybill_path="$(head -n1 "$signal")"
|
|
52
52
|
rm -f "$signal" # one-shot: consume the signal
|
|
53
|
-
[ -f "$
|
|
53
|
+
[ -f "$waybill_path" ] || exit 0 # document vanished — nothing to inject
|
|
54
54
|
|
|
55
|
-
content="$(cat "$
|
|
56
|
-
preamble="The previous session left a
|
|
55
|
+
content="$(cat "$waybill_path")"
|
|
56
|
+
preamble="The previous session left a waybill document at ${waybill_path} and signalled that this session should resume from it. Treat it as your primary context for continuing the work. Read any files it references before acting. This is one-shot: do not seek out or re-read waybill documents in future sessions unless signalled again."
|
|
57
57
|
|
|
58
58
|
if command -v jq >/dev/null 2>&1; then
|
|
59
59
|
jq -n --arg pre "$preamble" --arg body "$content" \
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"prompt": "/ferry",
|
|
7
7
|
"expect_skill": "ferry",
|
|
8
8
|
"assertions": [
|
|
9
|
-
"Writes a
|
|
9
|
+
"Writes a waybill document to waybill.md in the repo root by default",
|
|
10
10
|
"Arms the one-shot signal via scripts/ferry.sh signal with an absolute path",
|
|
11
11
|
"Tells the user to type /clear to start the fresh session themselves"
|
|
12
12
|
]
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"prompt": "/ferry commit",
|
|
27
27
|
"expect_skill": "ferry",
|
|
28
28
|
"assertions": [
|
|
29
|
-
"Writes to docs/ferry/
|
|
29
|
+
"Writes to docs/ferry/waybill-<timestamp>.md instead of the ignored repo-root file",
|
|
30
30
|
"Does not add the file to .git/info/exclude",
|
|
31
31
|
"Notes the user will want to commit the checkpoint"
|
|
32
32
|
]
|
package/skills/manifest.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generated": "2026-07-
|
|
2
|
+
"generated": "2026-07-07T11:12:00.649Z",
|
|
3
3
|
"count": 13,
|
|
4
4
|
"skills": [
|
|
5
5
|
{
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
{
|
|
46
46
|
"name": "ferry",
|
|
47
47
|
"directory": "ferry",
|
|
48
|
-
"description": "Ferry a session's live state across a context reset — persist a
|
|
48
|
+
"description": "Ferry a session's live state across a context reset — persist a waybill document and signal the next fresh session to resume from it. Use when the user types /ferry, says they want to hand off, checkpoint, wrap up, clear context, or start fresh while preserving state, or asks to carry work into a new session with clean optimised context. Captures everything a brand-new session needs — task, status, next steps, key files, decisions, gotchas, git state — writes it to disk as waybill.md, arms a one-shot signal, and tells the user to /clear so the next session auto-loads it.",
|
|
49
49
|
"lines": 166,
|
|
50
50
|
"hasScripts": true,
|
|
51
51
|
"hasReferences": true,
|