opencode-thrum-pro 0.1.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/assets/commands/thrum-_deviations-protocol.md +87 -0
- package/assets/commands/thrum-_generator-idempotency-protocol.md +15 -0
- package/assets/commands/thrum-_project-rules-protocol.md +18 -0
- package/assets/commands/thrum-_snapshot-protocol.md +265 -0
- package/assets/commands/thrum-_stamp-protocol.md +112 -0
- package/assets/commands/thrum-_verify-before-write-protocol.md +27 -0
- package/assets/commands/thrum-inbox.md +22 -0
- package/assets/commands/thrum-load-context.md +17 -0
- package/assets/commands/thrum-overview.md +17 -0
- package/assets/commands/thrum-prime.md +30 -0
- package/assets/commands/thrum-quickstart.md +14 -0
- package/assets/commands/thrum-reply.md +28 -0
- package/assets/commands/thrum-restart-extended.md +195 -0
- package/assets/commands/thrum-restart.md +293 -0
- package/assets/commands/thrum-send.md +31 -0
- package/assets/commands/thrum-sleep-extended.md +186 -0
- package/assets/commands/thrum-sleep.md +212 -0
- package/assets/commands/thrum-team.md +12 -0
- package/assets/commands/thrum-update-project.md +259 -0
- package/assets/commands/thrum-wait.md +14 -0
- package/assets/skills/adversarial-critique/SKILL.md +242 -0
- package/assets/skills/brainstorm-queue-aware/SKILL.md +167 -0
- package/assets/skills/brainstorm-steward/SKILL.md +181 -0
- package/assets/skills/choosing-subagent-models/SKILL.md +244 -0
- package/assets/skills/closing-findings-while-warm/SKILL.md +104 -0
- package/assets/skills/configure-roles/SKILL.md +229 -0
- package/assets/skills/coordinator-assessing-agent-completion/SKILL.md +205 -0
- package/assets/skills/coordinator-assessing-agent-completion/scan.py +117 -0
- package/assets/skills/coordinator-branch-split-on-block/SKILL.md +168 -0
- package/assets/skills/coordinator-context-monitoring/SKILL.md +674 -0
- package/assets/skills/coordinator-dispatching-work/SKILL.md +288 -0
- package/assets/skills/coordinator-hotpath-merge-gate/SKILL.md +522 -0
- package/assets/skills/coordinator-interacting-with-the-owner/SKILL.md +171 -0
- package/assets/skills/coordinator-maintaining-memory/SKILL.md +89 -0
- package/assets/skills/coordinator-managing-state-and-lifecycle/SKILL.md +192 -0
- package/assets/skills/coordinator-merging-code/SKILL.md +331 -0
- package/assets/skills/coordinator-philosophy-merge-gate/SKILL.md +442 -0
- package/assets/skills/coordinator-plan-reconcile-gate/SKILL.md +198 -0
- package/assets/skills/coordinator-post-restart-sweep/SKILL.md +135 -0
- package/assets/skills/coordinator-running-autonomous-feature-development/SKILL.md +199 -0
- package/assets/skills/coordinator-running-brainstorm-cycles/SKILL.md +654 -0
- package/assets/skills/coordinator-running-review-cycles/SKILL.md +153 -0
- package/assets/skills/coordinator-single-responsibility-merge-gate/SKILL.md +14 -0
- package/assets/skills/diagnosing-fleet-and-daemon/SKILL.md +255 -0
- package/assets/skills/efficient-multi-agent-research/SKILL.md +177 -0
- package/assets/skills/fixing-documentation-errors/SKILL.md +258 -0
- package/assets/skills/implementer-maintaining-memory/SKILL.md +84 -0
- package/assets/skills/implementer-orchestrating-execution/SKILL.md +125 -0
- package/assets/skills/implementer-receiving-dispatch/SKILL.md +127 -0
- package/assets/skills/implementer-receiving-review-feedback/SKILL.md +125 -0
- package/assets/skills/implementer-status-and-handoff/SKILL.md +150 -0
- package/assets/skills/implementer-tdd-and-quality/SKILL.md +99 -0
- package/assets/skills/memory-audit-recover/SKILL.md +153 -0
- package/assets/skills/memory-curate/SKILL.md +139 -0
- package/assets/skills/memory-maintenance/SKILL.md +87 -0
- package/assets/skills/memory-read-discipline/SKILL.md +164 -0
- package/assets/skills/memory-search-advanced/SKILL.md +217 -0
- package/assets/skills/memory-write-discipline/SKILL.md +135 -0
- package/assets/skills/orchestrate/SKILL.md +795 -0
- package/assets/skills/persistent-watcher-archetype/SKILL.md +225 -0
- package/assets/skills/prime-agent/SKILL.md +92 -0
- package/assets/skills/project-hotpath-gate/SKILL.md +255 -0
- package/assets/skills/project-philosophy/SKILL.md +418 -0
- package/assets/skills/project-philosophy/resources/philosophy-template.md +155 -0
- package/assets/skills/project-philosophy/resources/reliability-class-library.md +653 -0
- package/assets/skills/project-setup/SKILL.md +1007 -0
- package/assets/skills/project-setup/resources/implementation-agent.md +826 -0
- package/assets/skills/researcher-answering-queries/SKILL.md +100 -0
- package/assets/skills/researcher-investigating/SKILL.md +152 -0
- package/assets/skills/researcher-maintaining-memory/SKILL.md +176 -0
- package/assets/skills/state-migration/SKILL.md +54 -0
- package/assets/skills/thrum/SKILL.md +161 -0
- package/assets/skills/thrum/resources/ANTI_PATTERNS.md +132 -0
- package/assets/skills/thrum/resources/BOUNDARIES.md +56 -0
- package/assets/skills/thrum/resources/CLI_REFERENCE.md +1066 -0
- package/assets/skills/thrum/resources/IDENTITY.md +49 -0
- package/assets/skills/thrum/resources/LISTENER_PATTERN.md +64 -0
- package/assets/skills/thrum/resources/MESSAGING.md +163 -0
- package/assets/skills/thrum/resources/TMUX_SESSIONS.md +118 -0
- package/assets/skills/thrum/resources/WORKTREES.md +117 -0
- package/assets/skills/thrum-memory/SKILL.md +138 -0
- package/assets/skills/trace-spec-to-plan/SKILL.md +104 -0
- package/assets/skills/trace-spec-to-plan/resources/sweep-agent-prompt.md +57 -0
- package/assets/skills/update-queue/SKILL.md +149 -0
- package/assets/skills/using-the-queue/SKILL.md +172 -0
- package/assets/skills/using-thrum-state/SKILL.md +104 -0
- package/assets/skills/verify-against-plan/SKILL.md +323 -0
- package/assets/skills/verify-against-source/SKILL.md +237 -0
- package/assets/skills/watcher-archetype/SKILL.md +84 -0
- package/assets/skills/writing-durable-markdown/SKILL.md +66 -0
- package/dist/hooks/block-sync-cd.d.ts +9 -0
- package/dist/hooks/block-sync-cd.js +71 -0
- package/dist/hooks/block-sync-cd.test.d.ts +1 -0
- package/dist/hooks/block-sync-cd.test.js +61 -0
- package/dist/hooks/shell-env.d.ts +8 -0
- package/dist/hooks/shell-env.js +22 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +25 -0
- package/dist/installer.d.ts +2 -0
- package/dist/installer.js +86 -0
- package/package.json +49 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
description:
|
|
3
|
+
Shared Deviations-from-Source protocol — canonical block format, the
|
|
4
|
+
required-even-when-empty rule, and derivation discipline. Not
|
|
5
|
+
user-invocable directly.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Deviations from Source Protocol (shared partial)
|
|
9
|
+
|
|
10
|
+
This file is the canonical source-of-truth for the "Deviations from Source"
|
|
11
|
+
block emitted by planning-loop artifacts (plans, implementation prompts). Do
|
|
12
|
+
NOT invoke this file directly; it has no terminal action.
|
|
13
|
+
|
|
14
|
+
(To find what currently points here: `grep -rn "_deviations-protocol.md"
|
|
15
|
+
claude-plugin/` — a hand-listed consumer roster in this file would rot the
|
|
16
|
+
moment a new emitter or reader is added, so none is kept here.)
|
|
17
|
+
|
|
18
|
+
## Purpose
|
|
19
|
+
|
|
20
|
+
Dilution is a deletion: when a reviewer's feasibility objection causes a
|
|
21
|
+
requirement to be quietly dropped or weakened while converting one artifact
|
|
22
|
+
into the next (spec → plan → prompt), the loss leaves no artifact — you
|
|
23
|
+
cannot grep for an absence. Every downstream step remains internally
|
|
24
|
+
consistent with the step directly above it, so every review passes even
|
|
25
|
+
though intent was lost several steps back.
|
|
26
|
+
|
|
27
|
+
The fix is the same move as pairing every zero with a control: since an
|
|
28
|
+
absence cannot be verified, force it to be STATED. An artifact that dropped
|
|
29
|
+
or weakened nothing must say so explicitly ("No deviations from source.");
|
|
30
|
+
an artifact that is silent on deviations is untrustworthy by construction and
|
|
31
|
+
FAILS the gate, whether or not it actually dropped anything.
|
|
32
|
+
|
|
33
|
+
## Format (emitted artifact — verbatim)
|
|
34
|
+
|
|
35
|
+
Every plan and implementation prompt carries this heading, placed immediately
|
|
36
|
+
after its Authored-against stamp block (see `_stamp-protocol.md`):
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
## Deviations from Source
|
|
40
|
+
|
|
41
|
+
No deviations from source.
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
If anything was dropped or weakened relative to the declared source
|
|
45
|
+
artifact(s), replace the single line above with one bullet per deviation:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
## Deviations from Source
|
|
49
|
+
|
|
50
|
+
- DROPPED: <requirement, quoted or closely paraphrased from the source> —
|
|
51
|
+
why: <reason it was dropped/weakened> — source: <file:line or section ref>
|
|
52
|
+
— attribution: <"owner decision" | "reviewer objection unresolved">
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**The heading is REQUIRED even when the list is empty.** "No deviations from
|
|
56
|
+
source." is not boilerplate — it is a claim a human made that a reviewer can
|
|
57
|
+
check against the actual diff between artifact and source. An artifact
|
|
58
|
+
missing this heading entirely has not been checked and must fail the gate
|
|
59
|
+
that looks for it (see `project-setup/SKILL.md` Phase 0).
|
|
60
|
+
|
|
61
|
+
## Derivation rule
|
|
62
|
+
|
|
63
|
+
Derive the block by DIFFING the artifact against its actual, currently-read
|
|
64
|
+
source document or decision list — never by recalling from memory what was
|
|
65
|
+
probably dropped. No git diff can see an absence, so the author must state it
|
|
66
|
+
directly, freshly re-derived at authoring time, not carried forward from a
|
|
67
|
+
prior cycle.
|
|
68
|
+
|
|
69
|
+
## Attribution values
|
|
70
|
+
|
|
71
|
+
Each deviation item is attributed to exactly one of:
|
|
72
|
+
|
|
73
|
+
- `owner decision` — the intent-owner explicitly agreed to cut or weaken the
|
|
74
|
+
requirement.
|
|
75
|
+
- `reviewer objection unresolved` — a reviewer raised a feasibility
|
|
76
|
+
objection that has NOT yet been resolved by the intent-owner; this
|
|
77
|
+
attribution is a FLAG, not a resolution, and must route to the
|
|
78
|
+
intent-owner per the feasibility-escalation rule (see
|
|
79
|
+
`coordinator-running-brainstorm-cycles/SKILL.md`) rather than being folded
|
|
80
|
+
in silently.
|
|
81
|
+
|
|
82
|
+
## Format conventions
|
|
83
|
+
|
|
84
|
+
The `## Deviations from Source` heading is grep -F-matchable: exact case,
|
|
85
|
+
exact text, no variant headings. `project-setup/SKILL.md` Phase 0 gates on
|
|
86
|
+
its literal presence with `grep -F '## Deviations from Source'`. Do not
|
|
87
|
+
reword, recase, or relocate the heading.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
description:
|
|
3
|
+
Shared generator-skill idempotency invariant consumed by config/doc
|
|
4
|
+
generator skills. Not user-invocable directly.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Generator Idempotency Protocol (shared partial)
|
|
8
|
+
|
|
9
|
+
Consumers: run `grep -rl _generator-idempotency-protocol claude-plugin/skills/`
|
|
10
|
+
for the current set — do NOT hardcode it here. A list of consumers inside the
|
|
11
|
+
consumed file is a second copy of a git-answerable fact and rots the moment a
|
|
12
|
+
skill is added or dropped.
|
|
13
|
+
|
|
14
|
+
The modes are idempotent — running the skill repeatedly on a stable project
|
|
15
|
+
should produce no file changes after the first run.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
description:
|
|
3
|
+
Shared project-specific-rules protocol consumed by role skills. Not
|
|
4
|
+
user-invocable directly.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Project-Specific Rules Protocol (shared partial)
|
|
8
|
+
|
|
9
|
+
Consumers: run `grep -rl _project-rules-protocol claude-plugin/skills/` for the
|
|
10
|
+
current set — do NOT hardcode it here. A list of consumers inside the consumed
|
|
11
|
+
file is a second copy of a git-answerable fact and rots the moment a skill is
|
|
12
|
+
added or dropped.
|
|
13
|
+
|
|
14
|
+
Project-local rules of kind `agent_rule` at `--scope role` were loaded at
|
|
15
|
+
session start by your preamble (see your role template's Memory model block).
|
|
16
|
+
If a project-local rule conflicts with a universal rule above, the
|
|
17
|
+
project-local rule wins; surface the conflict in your reply so the user can
|
|
18
|
+
decide whether to graduate or remove the override.
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
---
|
|
2
|
+
description:
|
|
3
|
+
Shared snapshot-composition protocol consumed by the snapshot-save commands.
|
|
4
|
+
Not user-invocable directly.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Snapshot Composition Protocol (shared partial)
|
|
8
|
+
|
|
9
|
+
Consumers: run `grep -rl _snapshot-protocol claude-plugin/commands/` for the
|
|
10
|
+
current set — do NOT hardcode it here. A list of consumers inside the consumed
|
|
11
|
+
file is a second copy of a git-answerable fact and rots the moment a command is
|
|
12
|
+
added or dropped. Note: plain `/thrum:restart` does NOT consume this partial; it
|
|
13
|
+
carries its own inline snapshot template.
|
|
14
|
+
|
|
15
|
+
This is the canonical source-of-truth for snapshot composition discipline. The
|
|
16
|
+
sibling commands that consume this partial compose: read this partial →
|
|
17
|
+
variant-specific terminal action. Do NOT invoke this file directly; it has no
|
|
18
|
+
terminal action.
|
|
19
|
+
|
|
20
|
+
## Step 1 — Resolve identity and your worktree
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# $REPO must be YOUR worktree — the directory `thrum prime` reads the restart
|
|
24
|
+
# snapshot back from. Resolve it from the daemon's authoritative identity, NOT
|
|
25
|
+
# `git rev-parse` (which keys off the current shell CWD and would write to the
|
|
26
|
+
# wrong .thrum/restart/ if a bash step left your worktree). Fall back to git
|
|
27
|
+
# only if whoami can't answer.
|
|
28
|
+
REPO=$(thrum whoami --field worktree 2>/dev/null)
|
|
29
|
+
[ -n "$REPO" ] || REPO=$(git rev-parse --show-toplevel) || { echo "ERROR: cannot resolve your worktree"; exit 1; }
|
|
30
|
+
AGENT=$(thrum whoami --field agent_id) || { echo "ERROR: agent not registered"; exit 1; }
|
|
31
|
+
[ -n "$AGENT" ] || { echo "ERROR: empty agent_id"; exit 1; }
|
|
32
|
+
mkdir -p "${REPO}/.thrum/restart"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Step 2 — Compose your continuation
|
|
36
|
+
|
|
37
|
+
### Composition discipline (always applies)
|
|
38
|
+
|
|
39
|
+
Your context is high (or you are preparing to park) and the goal is to preserve
|
|
40
|
+
all load-bearing decisions across the session boundary. Write a rich
|
|
41
|
+
continuation that future-you will read as the first action after wake.
|
|
42
|
+
|
|
43
|
+
**§1 of your snapshot is REQUIRED FIRST PROSE.** Write the "Big picture — what
|
|
44
|
+
shipped this session" (or, for sleep snapshots, "where work stands at park
|
|
45
|
+
time") section BEFORE anything else. Be specific: name the artifacts, the
|
|
46
|
+
decisions, the cycles closed. Examples:
|
|
47
|
+
|
|
48
|
+
> Locked the session-archive spec v2 with §1 Big picture requirement, five
|
|
49
|
+
> Q-Spec approvals, and Q-Spec-5 deferred to impl-time. Hand-off pending
|
|
50
|
+
> coordinator final review.
|
|
51
|
+
>
|
|
52
|
+
> Investigated rc.9 inbox-race against <implementer>'s hypothesis: confirmed
|
|
53
|
+
> the lock-substrate fence is the right fix. Filed thrum-XXX with 4 BLOCKING
|
|
54
|
+
> evidence points.
|
|
55
|
+
>
|
|
56
|
+
> Closed <epic> brainstormer-third pass. 2 BLOCKING + 5 IMPORTANT + 10 MINOR.
|
|
57
|
+
> All three load-bearing traps PASSed. Standing by for <epic> next batch.
|
|
58
|
+
|
|
59
|
+
This section becomes YOUR OWN log entry, visible in `thrum agent sessions list`
|
|
60
|
+
alongside the archives of every other session you've ever restarted from.
|
|
61
|
+
Future-you (and other agents inspecting your history) skim §1 to decide which
|
|
62
|
+
sessions are worth re-reading. Write it first — before the Resume Plan, before
|
|
63
|
+
file paths, before patterns — because composing the §1 summary forces you to
|
|
64
|
+
identify what was actually load-bearing about this session, and that priority
|
|
65
|
+
shapes everything else you write below it.
|
|
66
|
+
|
|
67
|
+
**Stamp your snapshot with the base it was authored against.**
|
|
68
|
+
Derive and emit the **Authored-against** stamp per
|
|
69
|
+
`claude-plugin/commands/_stamp-protocol.md` and place it at the very top of your
|
|
70
|
+
§1 section (that protocol computes the SHA and merge_target for you — never
|
|
71
|
+
hand-type them). This is what lets `thrum prime` diff your snapshot at the next
|
|
72
|
+
wake and flag which cited files have MOVED; an unstamped snapshot reads as
|
|
73
|
+
"current", indistinguishable from one that never drifted.
|
|
74
|
+
|
|
75
|
+
Any commit your snapshot names as its own stamped SHA must also be readable
|
|
76
|
+
under `_stamp-protocol.md`'s "Read-time provenance re-derivation" section
|
|
77
|
+
(SHA-resolves, then merge-status) — link to that section rather than restating
|
|
78
|
+
its checks here.
|
|
79
|
+
|
|
80
|
+
**Describe commits, don't claim them.** A snapshot's job is to describe what a
|
|
81
|
+
commit's content and effect ARE — that's checkable by anyone re-reading it.
|
|
82
|
+
Prohibit first-person narration of git actions in the body of a snapshot:
|
|
83
|
+
no "I pushed X", "I fixed Y and verified it", "I ran Z". Write instead:
|
|
84
|
+
"commit `<sha>` exists and does `<Y>`" / "`<sha>` addresses `<Y>`". Attribution
|
|
85
|
+
of WHO performed a git action already lives in `command.jsonl` / `hooklog.jsonl`
|
|
86
|
+
— restating it here would assert authorship the snapshot-writer has typically
|
|
87
|
+
never mechanically verified.
|
|
88
|
+
|
|
89
|
+
After the §1 block:
|
|
90
|
+
|
|
91
|
+
CRITICAL DISCIPLINE — compose from your own working context only. To preserve
|
|
92
|
+
the remaining runway:
|
|
93
|
+
|
|
94
|
+
- Do NOT dispatch sub-agents (Agent, Explore, etc.)
|
|
95
|
+
- Do NOT re-read files you've already read this session
|
|
96
|
+
- Do NOT spawn web fetches or external lookups
|
|
97
|
+
- Do NOT run lengthy investigations (git log spelunking, codebase searches,
|
|
98
|
+
multi-file grep walks)
|
|
99
|
+
|
|
100
|
+
Each of those costs context you don't have to spend, and the cost compounds — a
|
|
101
|
+
sub-agent that returns 6K tokens of summary doesn't just cost the dispatch, it
|
|
102
|
+
pollutes the dying session further. If a fact isn't already in your working
|
|
103
|
+
context, label it "unknown" or "verify post-restart" rather than fetching it
|
|
104
|
+
now. Trust your in-context state.
|
|
105
|
+
|
|
106
|
+
Write for a competent stranger in your role — someone who has the runtime
|
|
107
|
+
briefing (`thrum prime`, role preamble, project state) but none of this
|
|
108
|
+
session's conversation context. Refer to the previous session in third person.
|
|
109
|
+
|
|
110
|
+
### Choose your structure
|
|
111
|
+
|
|
112
|
+
The variant skill that invoked this partial tells you which structure to use:
|
|
113
|
+
|
|
114
|
+
- **`/thrum:sleep`** → use the STANDARD 11-section structure below.
|
|
115
|
+
- **`/thrum:restart-extended` and `/thrum:sleep-extended`** → use the EXTENDED
|
|
116
|
+
16-section structure below.
|
|
117
|
+
|
|
118
|
+
The standard structure is the working compact format. The extended structure is
|
|
119
|
+
fundamentally different: a comprehensive technical reference (wire contracts,
|
|
120
|
+
capability matrix, anticipated Q&A, design rationale) appropriate for
|
|
121
|
+
designer/architect-grade handoffs where the next session may be cold and must
|
|
122
|
+
recover the full design grammar from this artifact alone.
|
|
123
|
+
|
|
124
|
+
### Standard structure (11 sections)
|
|
125
|
+
|
|
126
|
+
Use these numbered sections (write each as prose or table — your call — but the
|
|
127
|
+
numbered structure itself should be present):
|
|
128
|
+
|
|
129
|
+
1. **Big picture** — what shipped this session (REQUIRED FIRST, written above
|
|
130
|
+
per the §1 mandate).
|
|
131
|
+
2. **Where every artifact stands** — branches, specs, plans, in-flight PRs,
|
|
132
|
+
partially-landed work. Concrete tips / paths / commit SHAs.
|
|
133
|
+
3. **Players + contributions** — who's working on what, who's standing down,
|
|
134
|
+
what each agent's latest state is.
|
|
135
|
+
4. **Decisions made this session** — with the context that drove each. Just
|
|
136
|
+
listing the decision loses the reasoning future-you needs to judge edge
|
|
137
|
+
cases.
|
|
138
|
+
5. **Questions awaiting repo owner input** — anything queued for the project
|
|
139
|
+
owner's call before work can proceed. Name the question concretely.
|
|
140
|
+
6. **Outstanding work you owe** — commitments still open on your side (pushes,
|
|
141
|
+
merges, dispatches, doc-patches).
|
|
142
|
+
7. **Patterns that worked / burned us** — short reflective section: what to keep
|
|
143
|
+
doing, what to stop. Two sub-sections is enough.
|
|
144
|
+
8. **File paths future-you will reopen** — concrete paths the next session will
|
|
145
|
+
need. Group by purpose (in-flight / queued / reference).
|
|
146
|
+
9. **Numbered resume plan** — concrete first-N-steps the next session should
|
|
147
|
+
take, in order. Step 1 must be actionable from a cold start.
|
|
148
|
+
10. **Honest unknowns — verify post-restart, do NOT fabricate** — list facts you
|
|
149
|
+
suspect changed during the session OR were never confirmed in the first
|
|
150
|
+
place. Future-you must NOT carry these forward as truth until they're
|
|
151
|
+
verified.
|
|
152
|
+
11. **End-of-continuation note** — one short paragraph reflecting on the session
|
|
153
|
+
itself.
|
|
154
|
+
|
|
155
|
+
Skip a section only when it genuinely doesn't apply — an honest "N/A: no
|
|
156
|
+
decisions this session" beats fabrication. The numbered structure itself should
|
|
157
|
+
always be present so future-you can scan for what's covered and what isn't.
|
|
158
|
+
|
|
159
|
+
### Extended structure (16 sections)
|
|
160
|
+
|
|
161
|
+
Numbered `§1.` through `§16.`. The §-prefix is intentional — extended snapshots
|
|
162
|
+
use a visually distinct convention from standard to signal grade difference.
|
|
163
|
+
Each section names a concern; write as prose, a table, or omit with an explicit
|
|
164
|
+
"N/A: <reason>" rather than skipping silently.
|
|
165
|
+
|
|
166
|
+
```text
|
|
167
|
+
§1. Header block — author / date / restart reason / restart-you mandate / context-percent at write time
|
|
168
|
+
§2. Identity — agent_id / worktree path / branch / role / coordinator name / cut-point commit SHA
|
|
169
|
+
§3. Big picture — what shipped this session [REQUIRED FIRST PROSE — mirrors standard §1]
|
|
170
|
+
§4. Mission state — where this work currently sits in its pipeline
|
|
171
|
+
§5. Locked design decisions — operator-LOCKs, design-fork resolutions, with rationale
|
|
172
|
+
§6. Open L-questions parked for the operator — or "NONE: <reason>" with explicit note
|
|
173
|
+
§7. Wire contracts — durable technical reference (types, signatures, file:line cites)
|
|
174
|
+
§8. Capability matrix — per-surface contracts (row-by-row table for fanout work; OMIT if N/A)
|
|
175
|
+
§9. Design inventory — locked taxonomy (entanglement classes, patterns, anti-patterns; OMIT if N/A)
|
|
176
|
+
§10. Cycle history — review cycles run, findings, fold record (OMIT if pre-review-phase)
|
|
177
|
+
§11. Pipeline state — DAG of artifacts (brainstorm → plan → impl → review) with current cursor
|
|
178
|
+
§12. Pre-restart artifacts on disk — durable handoff manifest (table: artifact / path / status)
|
|
179
|
+
§13. Anticipated Q&A — questions restart-you or downstream implementer will ask, pre-answered
|
|
180
|
+
§14. References — bd IDs, commit anchors, memories, file paths, message IDs (load-bearing for transcript recon)
|
|
181
|
+
§15. Honest unknowns — verify post-restart, do NOT fabricate
|
|
182
|
+
§16. Restart-you's immediate next actions — numbered; step 1 actionable from cold start
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Per-section guidance:**
|
|
186
|
+
|
|
187
|
+
- **§1 Header.** Top of file. Author (agent_id), date, restart reason (1-line
|
|
188
|
+
trigger), one-sentence mandate to restart-you ("read this in full, then [N
|
|
189
|
+
specific actions]"), context-% at write time. Read-first prominence.
|
|
190
|
+
- **§2 Identity.** `agent_id` / worktree absolute path / branch / role /
|
|
191
|
+
coordinator name / cut-point commit SHA for any line cites that follow.
|
|
192
|
+
Mechanical; lets a totally cold restart-you orient before reading any prose.
|
|
193
|
+
- **§3 Big picture.** REQUIRED FIRST PROSE. 1–3 sentences summarizing what the
|
|
194
|
+
session accomplished. Specific: artifacts, decisions, cycles closed. Becomes
|
|
195
|
+
the session-archive log entry. Write this BEFORE anything else (composing §3
|
|
196
|
+
forces you to identify what was load-bearing, which shapes what you write
|
|
197
|
+
below). **Sleep variant:** for `/thrum:sleep` and `/thrum:sleep-extended`, §3
|
|
198
|
+
frames as "where work stands at park time" rather than "what shipped" — the
|
|
199
|
+
agent is parking, not completing. Composition discipline (1–3 sentences,
|
|
200
|
+
specific, load-bearing-first) is identical.
|
|
201
|
+
- **§4 Mission state.** Where this work sits in its pipeline. Not the pipeline
|
|
202
|
+
DAG itself (that's §11) — the narrative status.
|
|
203
|
+
- **§5 Locked design decisions.** Each LOCK gets a line: decision + the
|
|
204
|
+
operator's wording (when applicable) + rationale.
|
|
205
|
+
- **§6 Open L-questions.** Numbered Q-list with researcher recommendations. OR
|
|
206
|
+
"NONE: all locked per <evidence>" with the evidence cited.
|
|
207
|
+
- **§7 Wire contracts.** Durable technical reference — types, function
|
|
208
|
+
signatures, struct field lists, file:line cites. Cut from the live tree at
|
|
209
|
+
§2's cut-point SHA. **Format:** use fenced code blocks for type signatures and
|
|
210
|
+
struct fields; use inline `file:line` citations anchored to §2's cut-point SHA
|
|
211
|
+
so future-you can `git show <SHA>:<file>` to reproduce.
|
|
212
|
+
- **§8 Capability matrix.** Row-by-row table when work fans out across N call
|
|
213
|
+
sites / migration surfaces / per-symbol concerns. **OMIT criterion:** OMIT
|
|
214
|
+
when work is single-call-site or single-surface. **REQUIRED criterion:**
|
|
215
|
+
required when the session covered changes across ≥2 independent call sites /
|
|
216
|
+
migration surfaces / per-symbol concerns. When in doubt, include — a one-row
|
|
217
|
+
table is cheaper than a missing one.
|
|
218
|
+
- **§9 Design inventory.** Locked taxonomy: entanglement classes, pattern
|
|
219
|
+
catalogue, anti-patterns. **OMIT criterion:** OMIT when the work hasn't yet
|
|
220
|
+
developed a stable design grammar. **REQUIRED criterion:** required when ≥3
|
|
221
|
+
named classes or patterns recur in the session's decisions.
|
|
222
|
+
- **§10 Cycle history.** Review cycles run, findings (BLOCKING / IMPORTANT /
|
|
223
|
+
MINOR counts), fold record, verify-before-fold spot-checks. **OMIT
|
|
224
|
+
criterion:** OMIT when the snapshot is written before any review cycle has
|
|
225
|
+
run. **REQUIRED criterion:** required after the first dual-review cycle
|
|
226
|
+
closes.
|
|
227
|
+
- **§11 Pipeline state.** DAG of artifacts (brainstorm → plan → impl → review)
|
|
228
|
+
with current cursor position. ASCII tree or table.
|
|
229
|
+
- **§12 Pre-restart artifacts.** Manifest table: each durable artifact's path +
|
|
230
|
+
status. Lets restart-you spot-check all artifacts exist before acting.
|
|
231
|
+
- **§13 Anticipated Q&A.** Pre-answer questions restart-you or downstream
|
|
232
|
+
implementer will ask. Format: Q (bold) + A (short). Answers cite live code so
|
|
233
|
+
downstream agents don't re-derive.
|
|
234
|
+
- **§14 References.** Load-bearing index: bd IDs (with one-line state), commit
|
|
235
|
+
anchors (with SHA + one-line claim), memory keys (with rationale for
|
|
236
|
+
relevance), file paths grouped by purpose, critical message IDs (for
|
|
237
|
+
transcript reconstruction).
|
|
238
|
+
- **§15 Honest unknowns.** List facts you suspect changed during the session OR
|
|
239
|
+
were never confirmed. Future-you must NOT carry these forward as truth until
|
|
240
|
+
verified.
|
|
241
|
+
- **§16 Restart-you's immediate next actions.** Numbered. Step 1 actionable from
|
|
242
|
+
cold start.
|
|
243
|
+
|
|
244
|
+
**Visual-drift note:** Extended template adopts `§N.` prefix convention
|
|
245
|
+
intentionally distinct from standard's `N. **Header**`
|
|
246
|
+
numbered-list-with-bold-lead. The divergence signals grade difference (standard
|
|
247
|
+
= compact, extended = comprehensive). Do NOT align them; the two surfaces stay
|
|
248
|
+
visually distinct on purpose. **Fallback** (Tier 2): if any runtime strips `§`
|
|
249
|
+
characters during rendering or commit-message embedding, the variant skill MAY
|
|
250
|
+
substitute bold-numbered (`**1.**`, `**2.**`, …) matching standard.
|
|
251
|
+
|
|
252
|
+
## Step 3 — Write the continuation directly to your restart file
|
|
253
|
+
|
|
254
|
+
Use your Write tool to save the composed continuation to:
|
|
255
|
+
|
|
256
|
+
```text
|
|
257
|
+
${REPO}/.thrum/restart/${AGENT}.md
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
`thrum prime` will auto-inject this file at next session start (whether wake
|
|
261
|
+
comes from `thrum tmux restart` or `thrum tmux create`). No bash heredoc or
|
|
262
|
+
`cat <<EOF` redirection is needed — write the file directly.
|
|
263
|
+
|
|
264
|
+
After writing, return control to your variant skill (`/thrum:restart-extended`,
|
|
265
|
+
`/thrum:sleep`, or `/thrum:sleep-extended`) for the terminal action.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
description:
|
|
3
|
+
Shared Authored-against stamp protocol — canonical format, derivation
|
|
4
|
+
commands, and never-type rule. Not user-invocable directly.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Authored-against Stamp Protocol (shared partial)
|
|
8
|
+
|
|
9
|
+
This is the canonical source-of-truth for the Authored-against stamp: its format,
|
|
10
|
+
derivation commands, and the never-type rule. Consuming files point here instead of
|
|
11
|
+
restating the recipe. Do NOT invoke this file directly; it has no terminal action.
|
|
12
|
+
(To find what currently points here: `grep -rn "_stamp-protocol.md" claude-plugin/`
|
|
13
|
+
— a hand-listed consumer roster in this file would rot the moment a new emitter or
|
|
14
|
+
reader is added, so none is kept here.)
|
|
15
|
+
|
|
16
|
+
## Purpose
|
|
17
|
+
|
|
18
|
+
A date alone cannot tell a reader whether the tree moved since an artifact was
|
|
19
|
+
authored. The Authored-against stamp embeds the exact commit SHA the author was
|
|
20
|
+
looking at and the configured merge target at authoring time. A reader can later
|
|
21
|
+
run the stamped diff command to detect whether any cited file has changed —
|
|
22
|
+
converting a qualitative suspicion ("is this stale?") into a falsifiable check.
|
|
23
|
+
|
|
24
|
+
## Stamp format (emitted artifact — verbatim)
|
|
25
|
+
|
|
26
|
+
Place these two lines at the appropriate location in the artifact (immediately
|
|
27
|
+
after its own date/frontmatter for brainstorm/plan/prompt; immediately after the
|
|
28
|
+
`Last updated` line for State.md and project_state.md):
|
|
29
|
+
|
|
30
|
+
```text
|
|
31
|
+
**Authored-against:** `<sha>` target: `<merge_target>`
|
|
32
|
+
|
|
33
|
+
> ⚠️ Verify base before acting: `git diff <sha>..origin/<merge_target> -- <files cited>` -- non-empty ⇒ cited code moved. (Resolve `<merge_target>` through its remote-tracking ref, never a bare local branch name — a local branch of the same name can be stale or absent.)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Always resolve `<merge_target>` through its remote-tracking ref
|
|
37
|
+
(`origin/<merge_target>`), never a bare local branch name, in every recipe in
|
|
38
|
+
this file — a local branch of the same name can be stale (last fetched days
|
|
39
|
+
ago) or simply absent on the reader's machine, while `origin/<merge_target>`
|
|
40
|
+
is only ever what's actually on the remote. Fetch before running any of these
|
|
41
|
+
diffs if the remote-tracking ref might be stale.
|
|
42
|
+
|
|
43
|
+
## Derivation commands (run at authoring time)
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# SHA of the current HEAD
|
|
47
|
+
git rev-parse HEAD
|
|
48
|
+
|
|
49
|
+
# Configured merge target
|
|
50
|
+
jq -r '.orchestration.merge_target' .thrum/config.json
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
The author must never type or remember either value by hand — both come from the
|
|
54
|
+
shell commands above, run at authoring time.
|
|
55
|
+
|
|
56
|
+
If either command returns empty or `null`, STOP and report — do NOT emit a stamp
|
|
57
|
+
with a null/empty field. An artifact with no stamp is honest; an artifact stamped
|
|
58
|
+
`null` is a lie the reader cannot detect (the string "null" still matches the
|
|
59
|
+
reader's regex, so it reads as a valid stamp instead of UNVERIFIABLE, and the
|
|
60
|
+
resulting `git diff <sha>..null` then errors).
|
|
61
|
+
|
|
62
|
+
Before emitting the stamp, also verify the derived `<sha>` actually resolves:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
git cat-file -e <sha>
|
|
66
|
+
# or: git rev-parse --verify <sha>^{commit}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
If this fails, STOP and report — do NOT emit a stamp citing an unresolvable SHA.
|
|
70
|
+
This is the same failure class as the null/empty check above (a stamp the
|
|
71
|
+
reader cannot trust), catching a different way to get there: `git rev-parse
|
|
72
|
+
HEAD` itself can't produce a bad SHA, but a stamp isn't always freshly derived
|
|
73
|
+
this way — it can be hand-typed, copied from a stale source, or otherwise
|
|
74
|
+
introduced without running the command above. Treat this resolve-check as a
|
|
75
|
+
mandatory guard regardless of how the SHA was obtained, not an optional sanity
|
|
76
|
+
check.
|
|
77
|
+
|
|
78
|
+
## Format conventions
|
|
79
|
+
|
|
80
|
+
The stamp follows the same literal-match convention as the `THRUM-REVIEW` marker
|
|
81
|
+
(canonical form documented in `coordinator-running-brainstorm-cycles` skill
|
|
82
|
+
§ "Footer → commit → stamp"): fixed field order, case-sensitive, ASCII-only —
|
|
83
|
+
parseable with `grep -F` semantics without regex. The reader-side regex in
|
|
84
|
+
`verify-against-plan` anchors on this fixed format; do not reorder or recase any
|
|
85
|
+
field.
|
|
86
|
+
|
|
87
|
+
## Read-time provenance re-derivation
|
|
88
|
+
|
|
89
|
+
Both checks below are computable from the two fields the stamp already carries
|
|
90
|
+
(`<sha>` and `<merge_target>`) — no new stamped field is needed. A reader running
|
|
91
|
+
either check for the first time, or re-running it on an artifact read before,
|
|
92
|
+
must run them in this exact order; the second is undefined if the first fails
|
|
93
|
+
(short-circuit):
|
|
94
|
+
|
|
95
|
+
1. **SHA-resolves** — `git cat-file -e <sha>` (or
|
|
96
|
+
`git rev-parse --verify <sha>^{commit}`). If this fails, the stamp cites a
|
|
97
|
+
FABRICATED or mistyped SHA — flag RED immediately and do NOT attempt check 2.
|
|
98
|
+
Merge-status has no defined answer for a SHA that does not exist.
|
|
99
|
+
|
|
100
|
+
2. **Merge-status** — only once check 1 has passed:
|
|
101
|
+
`git merge-base --is-ancestor <sha> origin/<merge_target>`. If this succeeds
|
|
102
|
+
(the SHA IS already an ancestor of the merge target) AND the artifact's own
|
|
103
|
+
prose describes that SHA's work as still open ("in-progress", "awaiting a
|
|
104
|
+
gate", "not yet merged", or similar), flag the claim STALE — the work
|
|
105
|
+
described has already landed; whatever gate the artifact was waiting on
|
|
106
|
+
already happened, or was never blocking to begin with.
|
|
107
|
+
|
|
108
|
+
This re-derivation must run EVERY TIME the artifact is read, not only once at
|
|
109
|
+
authoring time — the same diff-at-read discipline this file already establishes
|
|
110
|
+
for the base stamp (`git diff <sha>..origin/<merge_target>`). A check that only
|
|
111
|
+
ran once at write time cannot catch drift that accumulates afterward, as the
|
|
112
|
+
tree keeps moving.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
description:
|
|
3
|
+
Shared "Verify before you write" invariant consumed by state-writing
|
|
4
|
+
skills. Not user-invocable directly.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Verify Before You Write Protocol (shared partial)
|
|
8
|
+
|
|
9
|
+
Consumers: run `grep -rl _verify-before-write-protocol claude-plugin/skills/`
|
|
10
|
+
for the current set — do NOT hardcode it here. A list of consumers inside the
|
|
11
|
+
consumed file is a second copy of a git-answerable fact and rots the moment a
|
|
12
|
+
skill is added or dropped.
|
|
13
|
+
|
|
14
|
+
A written fact is TRUE at the moment it's recorded and can silently become
|
|
15
|
+
FALSE later — the reader can't tell, because a note doesn't present itself as
|
|
16
|
+
a time-bound claim. Before writing anything:
|
|
17
|
+
|
|
18
|
+
- Only write what you've verified against current state — not what you
|
|
19
|
+
remember, assume, or were told once.
|
|
20
|
+
- A note recording an UNEXPLAINED artifact must carry the unexplained-ness
|
|
21
|
+
forward — "not mine, cause unknown, nobody has traced this" — rather than
|
|
22
|
+
resolving it to a disposition like "ignore it." The note isn't wrong to cope
|
|
23
|
+
with noise you can't act on; the defect is closing the question when
|
|
24
|
+
nothing is actually known. "Ignore it" is unfalsifiable by construction —
|
|
25
|
+
an instruction to not look can't be caught by looking, because diligence is
|
|
26
|
+
exactly what it switches off — and it can silently train every future
|
|
27
|
+
session to stop looking at the one visible symptom of a live bug.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Check message inbox
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
List messages in your inbox. Messages are auto-marked as read when displayed.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
thrum inbox # All recent messages (auto-marks as read)
|
|
9
|
+
thrum inbox --unread # Unread only (does not mark as read)
|
|
10
|
+
thrum inbox --json # Machine-readable
|
|
11
|
+
thrum sent --unread # Check sent items with unread recipients
|
|
12
|
+
thrum message read --all # Mark all messages as read
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**Search — do not page through it.** The default page is 10, newest-first, so
|
|
16
|
+
stale unread sorts LAST exactly when it has been waiting longest.
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
thrum message search "<term>" # full-text across all messages
|
|
20
|
+
thrum inbox -q "<term>" # same full-text search, scoped to your inbox
|
|
21
|
+
thrum message reindex # rebuild the FTS index if search looks wrong
|
|
22
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
description:
|
|
3
|
+
Restore saved agent work context after compaction or session restart
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Run `thrum prime` to restore your complete session context. Prime now includes
|
|
7
|
+
project state and session context inline — no separate load step needed.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
thrum prime
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
If you need only the session context (without the full briefing):
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
thrum context show --session
|
|
17
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Combines identity, team, inbox, and sync status
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Show a combined view of agent identity, active team members, inbox messages, and
|
|
6
|
+
sync status.
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
thrum overview # Human-readable
|
|
10
|
+
thrum overview --json # Machine-readable
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
This is equivalent to running `thrum team`, `thrum inbox`, `thrum sent`, and
|
|
14
|
+
`thrum sync status` together.
|
|
15
|
+
|
|
16
|
+
`thrum inbox` here shows only the default page — see `/inbox` for the paging
|
|
17
|
+
caveat and full-text search.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Load AI-optimized session context
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Run `thrum prime` to load your complete session briefing — identity, daemon
|
|
6
|
+
health, role instructions, project state, and session context (plus messaging
|
|
7
|
+
protocol if multi-agent mode).
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
thrum prime
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Use `thrum prime --json` for structured output.
|
|
14
|
+
|
|
15
|
+
## First turn: emit a one-line ack
|
|
16
|
+
|
|
17
|
+
After loading the briefing, your very first action of this turn — before running
|
|
18
|
+
any tools or further reading — is to print one plain-text line in this format:
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
@<agent-name> primed (<role>/<module>). <one-sentence intent>. Standing by.
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Substitute the fields from your own identity (visible at the top of the
|
|
25
|
+
briefing) and write `<intent>` as a brief sentence drawn from your inbox or
|
|
26
|
+
restart snapshot. Drop the `/<module>` segment when no module is set or it
|
|
27
|
+
matches the role.
|
|
28
|
+
|
|
29
|
+
This produces visible scrollback so humans can distinguish a healthy launch from
|
|
30
|
+
a stuck or failed one without probing the daemon.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Register agent and start session
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Register as an agent, start a session, and set intent in one step.
|
|
6
|
+
|
|
7
|
+
If arguments are provided, use them. Otherwise ask the user for role, module,
|
|
8
|
+
and intent.
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
thrum quickstart --name <agent-name> --role <role> --module <module> --intent "<description>"
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Common roles: `implementer`, `planner`, `reviewer`, `tester`, `coordinator`.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Reply to a message
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Reply to a message with the same audience as the original.
|
|
6
|
+
|
|
7
|
+
If arguments are provided, use them. Otherwise ask for the message ID and reply
|
|
8
|
+
content.
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
thrum reply <msg-id> --stdin <<'EOF'
|
|
12
|
+
response text
|
|
13
|
+
EOF
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
The reply inherits the original message's audience (direct or group).
|
|
17
|
+
|
|
18
|
+
If the body has backticks, `$(...)`, `$VAR`, or quotes, pass it via a quoted
|
|
19
|
+
heredoc so the shell doesn't corrupt it:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
thrum reply <msg-id> --stdin <<'EOF'
|
|
23
|
+
Done — see `internal/foo.go`. Cost was $(estimate).
|
|
24
|
+
EOF
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`--body-file <path>` reads from a file; the response argument `-` is a stdin
|
|
28
|
+
alias.
|