Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "lich",
"description": "Claude Code plugin for the lich harness",
"version": "0.14.0",
"version": "0.15.0",
"author": {
"name": "omartelo"
}
Expand Down
2 changes: 1 addition & 1 deletion .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "lich",
"version": "0.14.0",
"version": "0.15.0",
"description": "Codex CLI plugin for the lich harness",
"author": {
"name": "omartelo"
Expand Down
6 changes: 4 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.15.0] - 2026-10-05

### Added

- **Claude Code's status line counts the lich workers a session waits on.**
Expand All @@ -17,7 +19,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
background agent, Esc leaves it running and the model's TaskStop ends it: a
worker in the asking session's checkout is closed, and one on a worktree of
its own has its turn stopped and keeps its card and worktree.

- **lich can run a Claude Code session's slash commands.** The mod takes a
`command` naming one (`/compact`, `/clear`, …) and its arguments, runs it once
the session is idle, and acks it with Claude Code's own error when the name is
Expand Down Expand Up @@ -538,7 +539,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
plugin is safe to install globally. Requests time out after ~1s and errors
are swallowed — the hook never blocks or fails the turn.

[Unreleased]: https://github.com/omartelo/lich-plugin/compare/v0.14.0...HEAD
[Unreleased]: https://github.com/omartelo/lich-plugin/compare/v0.15.0...HEAD
[0.15.0]: https://github.com/omartelo/lich-plugin/compare/v0.14.0...v0.15.0
[0.14.0]: https://github.com/omartelo/lich-plugin/compare/v0.13.2...v0.14.0
[0.13.2]: https://github.com/omartelo/lich-plugin/compare/v0.13.1...v0.13.2
[0.13.1]: https://github.com/omartelo/lich-plugin/compare/v0.13.0...v0.13.1
Expand Down
2 changes: 1 addition & 1 deletion hooks/mod-control.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
// a module that hands `$` to a nested function.

// Sent as X-Lich-Plugin on every request; bumped at release (CLAUDE.md, Release).
const PLUGIN_VERSION = "0.14.0"
const PLUGIN_VERSION = "0.15.0"

const SETTLE_WHEN_IDLE = new Set(["prompt", "command"])

Expand Down
2 changes: 1 addition & 1 deletion hooks/mod-usage.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
// refuses a module that hands `$` to a nested function.

// Sent as X-Lich-Plugin on every request; bumped at release (CLAUDE.md, Release).
const PLUGIN_VERSION = "0.14.0"
const PLUGIN_VERSION = "0.15.0"

/**
* @typedef {import('claude-code').EngineInterface} Engine
Expand Down
2 changes: 1 addition & 1 deletion hooks/report-session-start.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
[ -n "$LICH_PORT" ] && [ -n "$LICH_TOKEN" ] && [ -n "$LICH_SESSION_ID" ] || exit 0

# Sent as X-Lich-Plugin on every report; bumped at release (CLAUDE.md, Release).
plugin_version=0.14.0
plugin_version=0.15.0
provider=${1:-claude}
# Parse session_id from the stdin payload. Prefer jq; fall back to sed so the
# hook works on Windows, where jq is usually absent but sed (Git Bash) is not.
Expand Down
2 changes: 1 addition & 1 deletion hooks/report-state.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
[ -n "$LICH_PORT" ] && [ -n "$LICH_TOKEN" ] && [ -n "$LICH_SESSION_ID" ] || exit 0

# Sent as X-Lich-Plugin on every report; bumped at release (CLAUDE.md, Release).
plugin_version=0.14.0
plugin_version=0.15.0

state=$1
body="{\"session_id\":\"${LICH_SESSION_ID}\",\"state\":\"${state}\"}"
Expand Down
2 changes: 1 addition & 1 deletion hooks/report-title.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
[ -n "$LICH_PORT" ] && [ -n "$LICH_TOKEN" ] && [ -n "$LICH_SESSION_ID" ] || exit 0

# Sent as X-Lich-Plugin on every report; bumped at release (CLAUDE.md, Release).
plugin_version=0.14.0
plugin_version=0.15.0
command -v jq >/dev/null 2>&1 || exit 0

# Checked before stdin is read, because it is the whole point: finding a title
Expand Down
2 changes: 1 addition & 1 deletion hooks/report-tool.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
[ -n "$LICH_PORT" ] && [ -n "$LICH_TOKEN" ] && [ -n "$LICH_SESSION_ID" ] || exit 0

# Sent as X-Lich-Plugin on every report; bumped at release (CLAUDE.md, Release).
plugin_version=0.14.0
plugin_version=0.15.0

here=$(dirname "$0")
payload=$(cat)
Expand Down
2 changes: 1 addition & 1 deletion hooks/report-touched.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
[ -n "$LICH_PORT" ] && [ -n "$LICH_TOKEN" ] && [ -n "$LICH_SESSION_ID" ] || exit 0

# Sent as X-Lich-Plugin on every report; bumped at release (CLAUDE.md, Release).
plugin_version=0.14.0
plugin_version=0.15.0

curl -s -o /dev/null --max-time 1 \
-X POST "http://127.0.0.1:${LICH_PORT}/session-touched?token=${LICH_TOKEN}" \
Expand Down
2 changes: 1 addition & 1 deletion omp/lich.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
// environment is read per report rather than at import, so a module loaded
// outside lich stays a no-op instead of a cached decision.
// Sent as X-Lich-Plugin on every report; bumped at release (CLAUDE.md, Release).
const PLUGIN_VERSION = "0.14.0"
const PLUGIN_VERSION = "0.15.0"

function report(path, body) {
const port = process.env.LICH_PORT
Expand Down
2 changes: 1 addition & 1 deletion opencode/lich.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
// environment is read per report rather than at import, so a module loaded
// outside lich stays a no-op instead of a cached decision.
// Sent as X-Lich-Plugin on every report; bumped at release (CLAUDE.md, Release).
const PLUGIN_VERSION = "0.14.0"
const PLUGIN_VERSION = "0.15.0"

function report(path, body) {
const port = process.env.LICH_PORT
Expand Down
2 changes: 1 addition & 1 deletion tests/lich-ref
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v0.57.0
v0.58.0
22 changes: 1 addition & 21 deletions tests/refresh-fixtures.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,27 +18,7 @@ ref=$(tr -d '[:space:]' <"$here/lich-ref")
base=https://raw.githubusercontent.com/omartelo/lich/$ref/docs/hooks/fixtures

for file in session-state.jsonl session-start.jsonl session-title.jsonl \
session-touched.jsonl; do
session-touched.jsonl mod-usage.jsonl mod-control.jsonl mod-commands.json; do
curl -fsSL "$base/$file" -o "$here/fixtures/$file"
echo "refreshed $file at $ref"
done

# The mod-usage contract is in no lich release yet either: its fixture is read
# at a lich main commit that carries it, on the same terms as
# the block below, and folds into the first list once a release ships it.
usage=6476d2d27ebdb5716fd369647d383dbd13a00936
curl -fsSL "https://raw.githubusercontent.com/omartelo/lich/$usage/docs/hooks/fixtures/mod-usage.jsonl" \
-o "$here/fixtures/mod-usage.jsonl"
echo "refreshed mod-usage.jsonl at $usage (unreleased)"

# The mod-control `command` and `ask` kinds are in no lich release yet: these two files are
# read at a lich main commit that carries them, so the
# module is held to the contract lich is about to ship rather than to the one
# it replaces. Once a release ships it, move tests/lich-ref there, fold these
# files back into the list above and delete this block.
pending=6476d2d27ebdb5716fd369647d383dbd13a00936
for file in mod-control.jsonl mod-commands.json; do
curl -fsSL "https://raw.githubusercontent.com/omartelo/lich/$pending/docs/hooks/fixtures/$file" \
-o "$here/fixtures/$file"
echo "refreshed $file at $pending (unreleased)"
done
Loading