bump-core-req
Updates the minimum core version requirement for a fleet plugin in all three canonical places: `required_core_version` and `requires["claude-code-hermit"]` in…
Generate the weekly review report for the current ISO week. Writes to .claude-code-hermit/compiled/review-weekly-YYYY-Www.md (dev-facing detail) and sends a plain-language channel summary (Delivered / Decisions / Waiting on you / Spend). Runs every Sunday at 23:00 via routine.
$ npx -y skills add gtapps/claude-code-hermit --skill weekly-review --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/weekly-reviewContext preview
The summary Claude sees to decide when to auto-load this skill.
Generate the weekly review report for the current ISO week. Writes to .claude-code-hermit/compiled/review-weekly-YYYY-Www.md (dev-facing detail) and sends a plain-language channel summary (Delivered / Decisions / Waiting on you / Spend). Runs every Sunday at 23:00 via routine.
name: weekly-review description: Generate the weekly review report for the current ISO week. Writes to .claude-code-hermit/compiled/review-weekly-YYYY-Www.md (dev-facing detail) and sends a plain-language channel summary (Delivered / Decisions / Waiting on you / Spend). Runs every Sunday at 23:00 via routine.
Generates the weekly review for the current ISO week.
1. Run:
bun ${CLAUDE_PLUGIN_ROOT}/scripts/weekly-review.ts .claude-code-hermit2. Report the result. On success, output the review filename. If a **Knowledge Health** section appears in the review output, summarize the issues to the operator. If a **Usage** section appears, relay it: the script has already auto-archived the docs with no tracked use in the window (move-only, into `compiled/.archive/` — restoring one is moving the file back, and a restored doc is never archived again). Don't archive anything further yourself, and never on judgment alone: semantic changes (merging or rewriting topic pages, reclassifying a compiled conclusion as raw, tagging `foundational`) always wait for explicit operator approval. Tracked use for this section is compiled/ Reads including subagent reads; startup injection isn't tracked.
3. **Dispatch the week's file-heavy analysis** to the isolated-context runner in one call, so full topic-page bodies and the week's channel rows never land in this session's context. Dispatch `claude-code-hermit:skill-eval-runner` once, passing no `model` parameter so it inherits the session model. Point it at both specs.
Name the absolute path of this session's auto-memory directory in the dispatch — the consolidation spec writes memory files there and has no way to derive that path on its own. Run `bun ${CLAUDE_PLUGIN_ROOT}/scripts/memory-dir.ts` and pass the `dir` it prints; if `exists` is false, say so in the dispatch and tell the runner to return every `kind:"memory"` candidate's rows in `failed_row_ids` rather than creating one. Name the current ISO week in the dispatch too, the value step 1 already produced in the review filename: the consolidation spec's provenance line needs it and has no other way to derive one that matches the review file.
The runner returns one JSON object carrying both specs' keys, `topic_findings` from the first and the consolidation keys from the second:
<!-- weekly-review-eval-schema:start -->
{
"topic_findings": [ "<one-line finding>" ]
}<!-- weekly-review-eval-schema:end -->
<!-- weekly-review-consolidation-schema:start -->
{
"candidates": [ { "kind": "memory", "audience": "shared", "path": "<file written>", "summary": "<durable fact, filed>", "row_ids": [12] } ],
"applied_row_ids": [12],
"failed_row_ids": [],
"reviewed_ids": [10, 11, 12, 13]
}<!-- weekly-review-consolidation-schema:end -->
**Failure policy:** if the runner returns null or malformed JSON, fail-open — carry `topic_findings: []` and continue. Skip step 4's **marking** (an unparseable `reviewed_ids` is not a set you can trust, and the rows are safe left unconsolidated), but still run step 4's prune, and still append the Findings audit line — worded as "the weekly consolidation returned no usable receipt; it may have filed memory or topic-page writes this run". The runner writes before it returns, so a malformed return means writes may already be on disk with nothing naming them. Treat a well-formed object that is missing `applied_row_ids`, `failed_row_ids`, or `reviewed_ids` the same way. Carry `topic_findings` forward to the channel summary (step 6): render a `Topic pages:` line only when non-empty, omit it entirely when `[]` (no topic pages or no findings → skip silently).
4. **Record the consolidation outcome.** The runner already filed the candidates, so this session only marks, prunes, and logs.
Compute the ids to mark: start from `reviewed_ids` and **remove every id in `failed_row_ids`**. Marking a failed candidate's row consolidated would drop it from next week's `list-unconsolidated` and let `prune` delete it before it was ever distilled — permanent data loss. A row that produced no candidate is not a failure: it stays in the set (it was reviewed, nothing to file). Pass only that computed set:
bun ${CLAUDE_PLUGIN_ROOT}/scripts/channel-log.ts .claude-code-hermit mark-consolidated <reviewed_ids minus failed_row_ids, comma-separated>The excluded rows stay unconsolidated for next week's pass. If nothing failed, the set is exactly `reviewed_ids`.
Then, when `applied_row_ids` is non-empty, append **one** SHELL.md Findings line for the run naming the count of candidates filed and each `candidates[].path` of every candidate whose `row_ids` are in `applied_row_ids`. That line is the operator's audit trail for writes distilled from untrusted channel text, so it goes in even when nothing else about the week is notable. One line per run, never one per candidate. Skip it entirely when `applied_row_ids` is empty: nothing was filed, so there is nothing to audit.
**Failure policy:** if `channel-log.ts` exits nonzero (a genuine DB error — not the normal "no DB yet" empty-result case), fail-open: skip the marking for this run and continue to step 5. An empty `reviewed_ids` (no unconsolidated rows) is the ordinary no-channel-activity case, not a failure.
Finally, prune old consolidated rows (never unreviewed ones — see `scripts/lib/channel-log.ts`):
bun ${CLAUDE_PLUGIN_ROOT}/scripts/channel-log.ts .claude-code-hermit prune <kIf you know Claude Tag, the idea will feel familiar: hand Claude work through a channel, such as Discord, Telegram, or your custom integration, and get results back there.
Repo: gtapps/claude-code-hermit
Updates the minimum core version requirement for a fleet plugin in all three canonical places: `required_core_version` and `requires["claude-code-hermit"]` in…
Changelog and commit — lightweight motion for day-to-day plugin dev work in the monorepo. One commit per plugin scope; CHANGELOG and staging routed by detected…
Documentation-drift audit for the plugin monorepo. Audits either each scoped plugin's unreleased changelog claims or its latest shipped release from the…
Explain in plain language what a fix, feature, PR, or plan will actually change for downstream hermits and the operators chatting with them — a before/after…
Use this skill whenever the user wants to release, ship, prep, or cut versions for two or more plugins together on the current branch. Trigger on phrasings…
Daily release-pipeline digest with a change gate — reports which plugins are pending release, whether main's CI is green, which branches went stale, and GitHub…