diff --git a/.claude/settings.json b/.claude/settings.json index b40e0dad..03c5d4e4 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -3,7 +3,7 @@ "allow": [ "Bash(gh issue:*)", "Bash(node */skills/hermit-scribe/file-issue.js*)", - "Bash(node */scripts/cron-tz-shift.js *)", + "Bash(bun */scripts/routines.ts tz-shift *)", "Bash(node */scripts/resolve-outbound-channel.js *)" ], "deny": [] diff --git a/.claude/skills/stale-proposals/SKILL.md b/.claude/skills/stale-proposals/SKILL.md index 468e8bb0..aa32bc79 100644 --- a/.claude/skills/stale-proposals/SKILL.md +++ b/.claude/skills/stale-proposals/SKILL.md @@ -62,7 +62,7 @@ Skip this entire step under `--no-apply`. For each `SHIPPED-STRONG` verdict, resolve the ID to a filename, then close it the same way `/claude-code-hermit:proposal-act` does — the metrics event goes first so the summary regen reflects it: ```bash -bun plugins/claude-code-hermit/scripts/resolve-prop.ts .claude-code-hermit "" +bun plugins/claude-code-hermit/scripts/proposal.ts resolve-id .claude-code-hermit "" bun plugins/claude-code-hermit/scripts/append-metrics.ts \ .claude-code-hermit/state/proposal-metrics.jsonl \ @@ -76,7 +76,7 @@ HERMIT_PATCH Writing the evidence into the Decision line is what makes an automatic flip auditable: the operator can later see exactly which bullet closed the proposal and reopen it if the match was wrong. -`resolve-prop.ts` returning `AMBIGUOUS` or `NONE` means don't guess — move that proposal into the Step 4 list instead. `proposal.ts` returning `ERROR|` means nothing was patched; report it and continue with the rest. +`proposal.ts resolve-id` returning `AMBIGUOUS` or `NONE` means don't guess — move that proposal into the Step 4 list instead. `proposal.ts` returning `ERROR|` means nothing was patched; report it and continue with the rest. ## Step 4 — Ask about the rest diff --git a/plugins/claude-code-dev-hermit/.claude-plugin/hermit-meta.json b/plugins/claude-code-dev-hermit/.claude-plugin/hermit-meta.json index f25928d6..f500913a 100644 --- a/plugins/claude-code-dev-hermit/.claude-plugin/hermit-meta.json +++ b/plugins/claude-code-dev-hermit/.claude-plugin/hermit-meta.json @@ -1,7 +1,7 @@ { - "required_core_version": ">=1.2.30", + "required_core_version": ">=1.2.34", "requires": { - "claude-code-hermit": ">=1.2.30" + "claude-code-hermit": ">=1.2.34" }, "min_claude_code_version": ">=2.1.172" } diff --git a/plugins/claude-code-dev-hermit/.claude-plugin/plugin.json b/plugins/claude-code-dev-hermit/.claude-plugin/plugin.json index 4beece81..af5711bb 100644 --- a/plugins/claude-code-dev-hermit/.claude-plugin/plugin.json +++ b/plugins/claude-code-dev-hermit/.claude-plugin/plugin.json @@ -4,7 +4,7 @@ "dependencies": [ { "name": "claude-code-hermit", - "version": "^1.2.30" + "version": "^1.2.34" } ], "description": "Language-agnostic safety layer + dev conventions for any agent your hermit uses to write code", diff --git a/plugins/claude-code-dev-hermit/CHANGELOG.md b/plugins/claude-code-dev-hermit/CHANGELOG.md index 251630dc..9693f69f 100644 --- a/plugins/claude-code-dev-hermit/CHANGELOG.md +++ b/plugins/claude-code-dev-hermit/CHANGELOG.md @@ -8,6 +8,7 @@ - `hatch`'s CLAUDE-APPEND version gate said to "extract the stamped version from the existing block", but no template or renderer ever wrote a version into the block — the gate degenerated to marker-present-only, so a plugin version bump alone never refreshed an already-hatched install. It now reads the stamp from `_hermit_versions["claude-code-dev-hermit"]` in `config.json`, which `hatch` itself already writes on every run. ### Changed +- Requires core `>=1.2.34`. Core absorbed its proposal satellites into `proposal.ts` verbs, so the shared route this plugin calls through `bin/hermit-run` is now `proposal metrics …`. `bin/hermit-run` resolves a script by bare filesystem probe, so pairing this version with an older core fails with a misleading "plugin may predate this command" error. - The CLAUDE-APPEND template gained a closing marker (``), placed outside both mode regions so it survives both renderings. Lets core's `hermit-evolve` bound the block exactly instead of a heuristic that used to mistake the template's own `` annotation for the block marker. - `domain-brainstorm` reads core's proposal-metrics report via `.claude-code-hermit/bin/hermit-run` (a path relative to this plugin can't reach core's install), and a kill-criteria breach now escalates to the operator as a class-level signal instead of instructing the skill to self-retire (the shared segment can't attribute noise to one skill). - §Tests Before PR folded into §Implementation Flow (both stated one ordering, and `dev-pr` Gate 0 enforces the test-freshness half mechanically), the slug algorithm and its worked examples became one naming line, and the harness built-ins left §Dev Quick Reference. Rendered standard block 9,330 B → ~6,158 B, safety 6,338 B → ~4,703 B. No git-safety rule was removed. diff --git a/plugins/claude-code-dev-hermit/skills/domain-brainstorm/SKILL.md b/plugins/claude-code-dev-hermit/skills/domain-brainstorm/SKILL.md index 0e344a20..4ae9a7a6 100644 --- a/plugins/claude-code-dev-hermit/skills/domain-brainstorm/SKILL.md +++ b/plugins/claude-code-dev-hermit/skills/domain-brainstorm/SKILL.md @@ -7,7 +7,7 @@ description: On-demand dev-voice brainstorm — reads codebase friction signals ## Kill criteria (read before running) -After ≥8 invocations, check the `capability-brainstorm` segment of core's proposal metrics report — run `.claude-code-hermit/bin/hermit-run proposal-metrics-report .claude-code-hermit --source=capability-brainstorm` (the project-resident `bin/hermit-run` resolves core's plugin root, which a path relative to this plugin can't reach), or read the `capability-brainstorm` row of the table `/claude-code-hermit:hermit-evolution` prints. If triage-survival < 25% or PROP-acceptance < 30%, treat it as a class-level signal that brainstorm output is noisy and raise it with the operator — the segment is shared with core's `capability-brainstorm` and the other domain brainstorm skills, so it cannot by itself say which skill to cut. +After ≥8 invocations, check the `capability-brainstorm` segment of core's proposal metrics report — run `.claude-code-hermit/bin/hermit-run proposal metrics .claude-code-hermit --source=capability-brainstorm` (the project-resident `bin/hermit-run` resolves core's plugin root, which a path relative to this plugin can't reach), or read the `capability-brainstorm` row of the table `/claude-code-hermit:hermit-evolution` prints. If triage-survival < 25% or PROP-acceptance < 30%, treat it as a class-level signal that brainstorm output is noisy and raise it with the operator — the segment is shared with core's `capability-brainstorm` and the other domain brainstorm skills, so it cannot by itself say which skill to cut. ### Gate 0 — Gather inputs diff --git a/plugins/claude-code-fitness-hermit/.claude-plugin/hermit-meta.json b/plugins/claude-code-fitness-hermit/.claude-plugin/hermit-meta.json index 77e21845..a91e590c 100644 --- a/plugins/claude-code-fitness-hermit/.claude-plugin/hermit-meta.json +++ b/plugins/claude-code-fitness-hermit/.claude-plugin/hermit-meta.json @@ -1,6 +1,6 @@ { - "required_core_version": ">=1.2.30", + "required_core_version": ">=1.2.34", "requires": { - "claude-code-hermit": ">=1.2.30" + "claude-code-hermit": ">=1.2.34" } } diff --git a/plugins/claude-code-fitness-hermit/.claude-plugin/plugin.json b/plugins/claude-code-fitness-hermit/.claude-plugin/plugin.json index 1d50763d..12c7f85f 100644 --- a/plugins/claude-code-fitness-hermit/.claude-plugin/plugin.json +++ b/plugins/claude-code-fitness-hermit/.claude-plugin/plugin.json @@ -4,7 +4,7 @@ "dependencies": [ { "name": "claude-code-hermit", - "version": "^1.2.30" + "version": "^1.2.34" } ], "description": "Fitness/training layer for claude-code-hermit — Strava MCP integration, activity analysis skills, and routine templates for an autonomous training assistant", diff --git a/plugins/claude-code-fitness-hermit/CHANGELOG.md b/plugins/claude-code-fitness-hermit/CHANGELOG.md index bacb0313..1b78a53b 100644 --- a/plugins/claude-code-fitness-hermit/CHANGELOG.md +++ b/plugins/claude-code-fitness-hermit/CHANGELOG.md @@ -11,6 +11,7 @@ - `hatch` no longer tells the operator to `cp .env.example .env`; a `.env.example` does not ship with the plugin. ### Changed +- Requires core `>=1.2.34`. Core absorbed its proposal satellites into `proposal.ts` verbs, so the shared route this plugin calls through `bin/hermit-run` is now `proposal metrics …`. `bin/hermit-run` resolves a script by bare filesystem probe, so pairing this version with an older core fails with a misleading "plugin may predate this command" error. - `domain-brainstorm` reads core's proposal-metrics report via `.claude-code-hermit/bin/hermit-run` (a path relative to this plugin can't reach core's install), and a kill-criteria breach now escalates to the operator as a class-level signal instead of instructing the skill to self-retire (the shared segment can't attribute noise to one skill). - `strava-sync` and `strava-health-check` routines removed — `fitness-brief` (morning + evening) now owns Strava connectivity, activity sync, RPE binding, and Run deep-dive as the plugin's two daily beats. - Activity notes carry `cardiac_drift_bpm` in frontmatter; `weekly-patterns` reads it there and falls back to the rendered line for older notes. diff --git a/plugins/claude-code-fitness-hermit/skills/domain-brainstorm/SKILL.md b/plugins/claude-code-fitness-hermit/skills/domain-brainstorm/SKILL.md index c39c843d..585a181d 100644 --- a/plugins/claude-code-fitness-hermit/skills/domain-brainstorm/SKILL.md +++ b/plugins/claude-code-fitness-hermit/skills/domain-brainstorm/SKILL.md @@ -7,7 +7,7 @@ description: On-demand fitness-voice brainstorm — reads Strava history and tra ## Kill criteria (read before running) -After ≥8 invocations, check the `capability-brainstorm` segment of core's proposal metrics report — run `.claude-code-hermit/bin/hermit-run proposal-metrics-report .claude-code-hermit --source=capability-brainstorm` (the project-resident `bin/hermit-run` resolves core's plugin root, which a path relative to this plugin can't reach), or read the `capability-brainstorm` row of the table `/claude-code-hermit:hermit-evolution` prints. If triage-survival < 25% or PROP-acceptance < 30%, treat it as a class-level signal that brainstorm output is noisy and raise it with the operator — the segment is shared with core's `capability-brainstorm` and the other domain brainstorm skills, so it cannot by itself say which skill to cut. +After ≥8 invocations, check the `capability-brainstorm` segment of core's proposal metrics report — run `.claude-code-hermit/bin/hermit-run proposal metrics .claude-code-hermit --source=capability-brainstorm` (the project-resident `bin/hermit-run` resolves core's plugin root, which a path relative to this plugin can't reach), or read the `capability-brainstorm` row of the table `/claude-code-hermit:hermit-evolution` prints. If triage-survival < 25% or PROP-acceptance < 30%, treat it as a class-level signal that brainstorm output is noisy and raise it with the operator — the segment is shared with core's `capability-brainstorm` and the other domain brainstorm skills, so it cannot by itself say which skill to cut. ### Gate 0 — Gather inputs diff --git a/plugins/claude-code-hermit/.claude-plugin/hermit-meta.json b/plugins/claude-code-hermit/.claude-plugin/hermit-meta.json index 60c1e903..060cd813 100644 --- a/plugins/claude-code-hermit/.claude-plugin/hermit-meta.json +++ b/plugins/claude-code-hermit/.claude-plugin/hermit-meta.json @@ -4,7 +4,7 @@ "credentials": [ { "name": "setup-token", - "expiry_probe": "bun ${CLAUDE_PLUGIN_ROOT}/scripts/setup-token-probe.ts", + "expiry_probe": "bun ${CLAUDE_PLUGIN_ROOT}/scripts/setup-token-mint.ts probe", "warn_days": 14, "reauth_skill": "/claude-code-hermit:relogin" } diff --git a/plugins/claude-code-hermit/CHANGELOG.md b/plugins/claude-code-hermit/CHANGELOG.md index 544035a4..d0f57716 100644 --- a/plugins/claude-code-hermit/CHANGELOG.md +++ b/plugins/claude-code-hermit/CHANGELOG.md @@ -5,10 +5,12 @@ ### Added - Channel-originated harness commands: an exact `/model `, `/effort `, `/compact`, or `/clear` from a trusted channel sender is recorded by a new `UserPromptSubmit` hook and typed into the session's pane when the turn ends. Args are passed through to Claude Code rather than checked against a fixed list, so new models and effort levels work without a plugin change. - `config.effort` — passed as `--effort` on every `hermit-start`, mirroring `config.model`, so a channel effort change reverts on restart instead of persisting. Ships `null` (no flag, model default); set it to opt into the revert-on-restart guarantee. Not the same lever as `config.env.CLAUDE_CODE_EFFORT_LEVEL`, which pins the session and makes a runtime `/effort` a no-op. -- `micro-proposal.ts brief-cycle` — ages the whole micro-approval queue in one call (re-nudges `follow_up_count` 1 entries, expires 2+ entries, records each expiry) and returns a JSON verdict, replacing the per-entry `nudge`/`resolve` calls both briefs used to issue one at a time. -- Two `Bash(.claude-code-hermit/bin/hermit-run