Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
b394aca
commit planning artefacts (briefs and plans)
darko-mijic Aug 21, 2026
c0a309d
Record omo native implementation plan
darko-mijic Aug 21, 2026
fce5717
feat(senpi): vendor senpi 2026.8.19 contract artifacts with pin and s…
darko-mijic Aug 21, 2026
39e7f90
feat(senpi): agent-home resolution
darko-mijic Aug 21, 2026
8045ee7
feat(senpi): hooks configuration validator with pinned diagnostics
darko-mijic Aug 22, 2026
6f53ea4
feat(senpi): session v3 entry and message schemas
darko-mijic Aug 22, 2026
c396a9a
feat(senpi): known/unknown/invalid entry parser
darko-mijic Aug 22, 2026
bf278a9
feat(senpi): internal bounded jsonl cursor
darko-mijic Aug 22, 2026
977aa3e
test(senpi): sanitized real and synthetic session fixtures
darko-mijic Aug 22, 2026
44ba86d
feat(senpi): revisioned checkpoint markers with root gating
darko-mijic Aug 22, 2026
f7e085f
test(senpi): two-way drift tests against vendored 2026.8.19 artifacts
darko-mijic Aug 22, 2026
9f0b962
feat(senpi): v3 tree index, leaf resolution, compaction-aware projection
darko-mijic Aug 22, 2026
c40bf3f
feat(senpi): session discovery and listing with header verification
darko-mijic Aug 22, 2026
2af5da1
feat(senpi): native block reduction and folding
darko-mijic Aug 22, 2026
d76a048
feat(senpi): leaf-linear session tail with splice mutations
darko-mijic Aug 22, 2026
3d180be
feat(senpi): watch generator with stable-cursor quiescence
darko-mijic Aug 22, 2026
e0f5670
feat(senpi): public barrels and package export surface
darko-mijic Aug 22, 2026
5c9996a
feat(senpi): read-only trust state inspection and hash parity
darko-mijic Aug 22, 2026
21fadbc
fix(senpi): decouple watch reconcile progress from fs event delivery …
darko-mijic Aug 22, 2026
7f777ef
feat(senpi): hook input/output wire schemas with alias normalization
darko-mijic Aug 22, 2026
5909092
feat(senpi): typed hook output builder
darko-mijic Aug 22, 2026
6eb6477
docs(senpi): cockpit phase-c cross-repo execution brief
darko-mijic Aug 22, 2026
28d13ed
feat(senpi): consent-gated hook trust writer
darko-mijic Aug 22, 2026
c2e3c0f
feat(senpi): hook command runner with senpi exit semantics
darko-mijic Aug 22, 2026
ebbf0e3
feat(senpi): observe forwarder asset and hooks registration helper
darko-mijic Aug 22, 2026
32b8af3
feat(senpi): finalize public hooks barrel surface
darko-mijic Aug 22, 2026
eacf1d3
docs(senpi): adapter reference
darko-mijic Aug 22, 2026
9c27960
refactor(senpi): dispose F2 review warnings (wire skip constants, dro…
darko-mijic Aug 22, 2026
a2e11ab
chore: record plan completion state and close gitignore scratch gap
darko-mijic Aug 22, 2026
36a6287
docs: make push protocol https-first, demote ssh to fallback
darko-mijic Aug 22, 2026
f813f96
feat(senpi): live-store smoke probe script (pnpm senpi:smoke)
darko-mijic Aug 22, 2026
20702c8
fix(packaging): run build before tests in prepack so clean checkouts …
darko-mijic Aug 22, 2026
63c512a
test(senpi): stabilize watch event synchronization
darko-mijic Aug 22, 2026
da4014e
test(senpi): acknowledge watcher lifecycle cycles
darko-mijic Aug 22, 2026
b895f16
fix(senpi): reset watch after observed replacement
darko-mijic Aug 22, 2026
bfdb1c8
fix(senpi): bound session discovery scans
darko-mijic Aug 22, 2026
a04dddc
fix(senpi): tighten discovery bounds contract
darko-mijic Aug 22, 2026
8f616f5
chore(release): prepare agent-harness-kit 0.3.0
darko-mijic Aug 23, 2026
ef6b302
fix(processing): type checkpoint conflicts and protect smoke input
darko-mijic Aug 23, 2026
2b82a3a
refactor(processing): share cursor and watch mechanics
darko-mijic Aug 23, 2026
e85ebd9
merge(todo-04): kit 0.3.0 contract into wave0-kit-integration
darko-mijic Aug 23, 2026
029cf04
merge(todo-05): typed checkpoint conflicts into wave0-kit-integration
darko-mijic Aug 23, 2026
aca13b1
merge(todo-06): incremental tailing into wave0-kit-integration
darko-mijic Aug 23, 2026
df502a0
feat(senpi): finalize hook and trust contracts
darko-mijic Aug 23, 2026
34b2e6f
merge(todo-07): senpi contract freeze into wave0-kit-integration
darko-mijic Aug 23, 2026
e465d78
test(package): verify 0.3.0 clean consumers
darko-mijic Aug 23, 2026
4fb001f
merge(todo-08): prove 0.3.0 as a clean consumer
darko-mijic Aug 23, 2026
95f44d5
test(senpi): add non-mutating compatibility probe
darko-mijic Aug 23, 2026
52b7621
merge(todo-29): Senpi compatibility probe into acceptance candidate
darko-mijic Aug 23, 2026
a410216
refactor(internal): extract bounded timed stdin reader from senpi exe…
darko-mijic Aug 27, 2026
79325ef
refactor(internal): relocate shared cursor, scheduler, and discovery …
darko-mijic Aug 27, 2026
a8a3f21
refactor(internal): relocate the bounded line reader
darko-mijic Aug 27, 2026
ee4f826
refactor(internal): extract marker-store and marker-lock mechanics
darko-mijic Aug 27, 2026
17d80d7
test(senpi): pin output wire, trust state, and settings surface again…
darko-mijic Aug 28, 2026
6f51a0a
feat(internal): bound jsonl cursor scans by bytes and lines
darko-mijic Aug 28, 2026
1a7631f
fix(grok): bound stdin and discovery reads
darko-mijic Aug 28, 2026
001dddb
fix(listing): never parse unterminated EOF tails
darko-mijic Aug 28, 2026
ff49692
fix(senpi): skip root-level artifacts directories in session listing
darko-mijic Aug 28, 2026
ba2744e
test(grok): pin per-event fields and SessionUpdate tags against vendo…
darko-mijic Aug 28, 2026
cfa3da0
fix(senpi): position-based tail movement with bounded passes and blan…
darko-mijic Aug 28, 2026
d23dd69
fix(security): loopback-default senpi forwarder with redirect refusal…
darko-mijic Aug 28, 2026
ec325a4
docs(senpi): document executeSenpiHook trust requirements
darko-mijic Aug 28, 2026
af03ec6
test(senpi): cover child exit 1 and other non-zero codes in the execu…
darko-mijic Aug 28, 2026
10dd3cd
docs: add the senpi adapter to the AGENTS open-when index
darko-mijic Aug 28, 2026
ff430a6
docs(decisions): record the noble-hashes BLAKE3-parity ADR
darko-mijic Aug 28, 2026
c0622be
fix(senpi): return checkpoint failures as status data with a typed mi…
darko-mijic Aug 28, 2026
3c88df6
fix(senpi): quiesce watch on position stability without noise re-arm
darko-mijic Aug 28, 2026
2ef4703
fix(grok): wake on null-filename events and add a poll backstop
darko-mijic Aug 28, 2026
95432b8
docs(changelog): record the review-fix batch under Unreleased
darko-mijic Aug 28, 2026
2a5857e
fix(senpi): validate registration documents fail-closed
darko-mijic Aug 28, 2026
9e5560e
fix(security): resolve symlinks in marker-root containment
darko-mijic Aug 28, 2026
ae9852c
fix(security): identity-verify marker lock stale reclamation
darko-mijic Aug 28, 2026
c281b31
test: replace wall-clock timing with injected clocks
darko-mijic Aug 28, 2026
5cbcb92
test: pin conflict shape and export public cursor equality
darko-mijic Aug 28, 2026
c88f462
docs(changelog): record the residual batch
darko-mijic Aug 28, 2026
012aa13
fix(security): single-winner stale marker-lock reclamation
darko-mijic Aug 28, 2026
ca3e4de
fix(packaging): tolerate missing git metadata in compatibility probe
darko-mijic Aug 28, 2026
c92419b
fix(packaging): parse npm pack JSON around lifecycle script output
darko-mijic Aug 28, 2026
27de0ff
test: force exec spawn in senpi real-signal cases
darko-mijic Aug 28, 2026
1190319
test: drop inode-reuse assertion from marker-lock replacement case
darko-mijic Aug 28, 2026
5f92343
docs(changelog): record the CI robustness fixes
darko-mijic Aug 28, 2026
8575eef
fix(security): verify marker lock ownership at release
darko-mijic Aug 28, 2026
49ab6c5
fix(security): verify trust lock ownership at release
darko-mijic Aug 28, 2026
da79c3d
chore(ci): pin action references to commit SHAs
darko-mijic Aug 28, 2026
a291b62
style: format trust-writer lock test
darko-mijic Aug 28, 2026
90d4cb2
fix(processing): never advance a checkpoint past incomplete rebuilt s…
darko-mijic Aug 28, 2026
c871c55
docs(changelog): record the Greptile P1 fixes
darko-mijic Aug 28, 2026
6f7cb66
fix(security): fail safe on unparseable trust lock content at release
darko-mijic Aug 28, 2026
b50488f
refactor(processing): drop unreachable checkpoint state arm
darko-mijic Aug 28, 2026
802011b
fix(security): claim locks atomically before release and stale reclam…
darko-mijic Aug 28, 2026
949dfa7
feat(internal): add lock characterization hooks (observation-only)
darko-mijic Aug 28, 2026
eb7699f
test(locks): add failing three-party ownership schedules (RED)
darko-mijic Aug 28, 2026
2f0466e
feat(internal): token-lease lock core (no-rename protocol)
darko-mijic Aug 28, 2026
6311a0b
refactor(internal): port marker lock to token-lease core
darko-mijic Aug 28, 2026
6190f7f
refactor(senpi): port trust lock to token-lease core
darko-mijic Aug 28, 2026
22f0cd8
refactor(processing): port raw-transcript lock to token-lease core
darko-mijic Aug 28, 2026
111e7d0
test(locks): green schedules + cross-adapter conformance suite
darko-mijic Aug 28, 2026
b08b7b0
docs(locks): token-lease protocol changelog + invariant JSDoc
darko-mijic Aug 28, 2026
2b889b8
fix(internal): detect lock directory replacement despite inode reuse
darko-mijic Aug 28, 2026
e3e1569
fix(internal): reverify legacy lock captures before unlink; drop cros…
darko-mijic Aug 28, 2026
0d9d53f
fix(senpi,processing): revalidate trust lease before state deletion; …
darko-mijic Aug 28, 2026
7191855
fix(internal): claim legacy lock objects atomically before reclassifi…
darko-mijic Aug 28, 2026
edde146
fix(senpi): renew trust lease at the destructive commit point
darko-mijic Aug 28, 2026
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
74 changes: 71 additions & 3 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@ jobs:

steps:
- name: Check out repository
uses: actions/checkout@v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Set up pnpm
uses: pnpm/action-setup@v4
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
with:
version: 10.4.1

- name: Set up Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: ${{ matrix.node-version }}
cache: pnpm
Expand All @@ -46,3 +46,71 @@ jobs:

- name: Run build
run: pnpm run build

clean-consumer:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: [22, 24]

steps:
- name: Check out repository
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Set up pnpm
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
with:
version: 10.4.1

- name: Set up Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: ${{ matrix.node-version }}
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Build package
run: pnpm run build

- name: Pack and exercise clean consumer
run: node scripts/clean-consumer.mjs --mode happy

engine-mismatch:
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Set up pnpm
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
with:
version: 10.4.1

- name: Set up Node.js for pack
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 22
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Build package
run: pnpm run build

- name: Pack release candidate
run: |
mkdir -p "$RUNNER_TEMP/kit-pack"
npm pack --ignore-scripts --pack-destination "$RUNNER_TEMP/kit-pack"
echo "TARBALL=$(ls "$RUNNER_TEMP/kit-pack"/*.tgz)" >> "$GITHUB_ENV"

- name: Set up Node.js 20
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 20

- name: Surface declared engine mismatch
run: node scripts/clean-consumer.mjs --mode engine-mismatch --tarball "$TARBALL"
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -79,5 +79,7 @@ session-exports/
!.omo/plans/

# Local agent planning outside OmO
/plans/
/.grok/

# Prometheus scratch context (repo AGENTS.md public-tree list)
/prometheus-implementation-context.md
345 changes: 345 additions & 0 deletions .omo/plans/omo-native-adapter.md

Large diffs are not rendered by default.

7 changes: 4 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Agent harness kit

`@libar-dev/agent-harness-kit` is a TypeScript library for Claude Code hooks, session export/tail CLIs, and a Grok Build adapter. Claude Code has 30 hook events. `CLAUDE.md` is a symlink to this file. Edit this file.
`@libar-dev/agent-harness-kit` is a TypeScript library for Claude Code hooks, session export/tail CLIs, and attach-only Grok Build and OmO-native (senpi) observe adapters. Claude Code has 30 hook events. `CLAUDE.md` is a symlink to this file. Edit this file.

## `any`

Expand All @@ -22,6 +22,7 @@ Imports use `.js` extensions (NodeNext).
| [docs/guides/configuring-settings-json.md](docs/guides/configuring-settings-json.md) | handler types, matcher, `if` / `once` / `timeout` |
| [docs/guides/writing-your-first-hook.md](docs/guides/writing-your-first-hook.md) | `executeHook` module pattern |
| [docs/reference/grok-adapter.md](docs/reference/grok-adapter.md) | Grok envelopes, settings, or processing |
| [docs/reference/senpi-adapter.md](docs/reference/senpi-adapter.md) | senpi hook input/output shapes, trust model, forwarder, or tail/watch APIs |
| [docs/internal/tail-session.md](docs/internal/tail-session.md) | tail markers or `CLAUDE_TAIL_MARKER_ROOTS` |
| [docs/upstream/hooks-reference.md](docs/upstream/hooks-reference.md) | mirrored official hook contract |
| [tests/docs-round-trip.test.ts](tests/docs-round-trip.test.ts) | changing JSON examples in `docs/upstream/hooks-*.md` |
Expand Down Expand Up @@ -50,7 +51,7 @@ Greptile reviews this public repo. After a commit: `greptile review -b main --js

## Public tree

Keep scratch out of the index: `prometheus-implementation-context.md`, `.omo/notepads/`, `.omo/senpi-task/`, `.omo/start-work/`, `.omo/run-continuation/`, `boulder.json`, root `plans/`, `.grok/`. Product law goes in `docs/` or `docs/decisions/`.
Keep scratch out of the index: `prometheus-implementation-context.md`, `.omo/notepads/`, `.omo/senpi-task/`, `.omo/start-work/`, `.omo/run-continuation/`, `boulder.json`, root `plans/`, `.grok/`. Product law goes in `docs/` or `docs/decisions/`. The `@noble/hashes` BLAKE3-parity exception is `docs/decisions/0001-noble-hashes-blake3-parity.md`.

`.omo/` is live. At most one unchecked plan in `.omo/plans/`. Archive to `.plans/NN-slug.md`. Workstation copy: `~/.agents/AGENTS.md` (skill `omo-workspace-state`).

Expand All @@ -60,6 +61,6 @@ Unslop every reply, commit message, PR body, and new doc. Skill: `~/.agents/skil

Commits are recovery boundaries. A plan's commit strategy authorizes commits on that work branch. Otherwise ask. Push only when asked. No `git stash`.

Before a push, the remote must be `git@github.com:<owner>/<repo>.git` and `gh auth status` must report `Git operations protocol: ssh`. Ask before changing remotes or credentials.
Push over the existing remote and protocol - HTTPS + gh token works here. Treat SSH + key checks as a fallback only when HTTPS/token auth fails (the old ssh-first rule came from a Fedora machine where tokens kept breaking, not this one). Ask before changing remotes or credentials.

The user owns `~/dev-admin/oh-my-openagent` and `~/.omo/omo.jsonc`. Inspect and report. Do not checkout, pull, build, install, or edit OmO unless asked.
133 changes: 133 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,121 @@ Categories per release: **Added**, **Changed**, **Deprecated**, **Removed**, **F

### Added

- Exported `byteCursorsEqual` from the Grok processing barrel so
consumers can compare per-source cursors without an internal barrel.
Contract tests pin `StaleCheckpointConflict` shape (`name`,
constructor fields, and `isStaleCheckpointConflict`) as a cross-repo
contract.

### Changed

- Token-lease lock protocol replaces the rename-based claim/release
mechanism at the marker, trust, and raw-transcript lock sites.
Canonical lock directories hold immutable `owner.<ownerId>.<leaseId>`
token files. Expiry is age-based (`now - token.mtimeMs > staleMs`).
The trust lock is a directory (`<statePath>.lock`), not a file;
pre-existing FILE-shaped locks are still captured when mtime-stale.
Pre-protocol sibling debris (`.release.*` / `.reclaim.*` / `.stale.*`)
is inert: the protocol never creates those names, and leftover debris
is left alone (no automatic cleanup). Renewal is explicit
(`Lease.renew()` / `assertHeld()`) at commit points, not a heartbeat.
`removeStaleStateLock` in `src/senpi/trust-writer.ts` is async
(`Promise<boolean>`). Direct importers of that module should treat
the return as a Promise; the symbol is not on the package barrel.
- Relocated the shared JSONL cursor, incremental resume, watch scheduler,
discovery primitives, and bounded-line reader into unbarreled
`src/internal/`. Type-only `JsonlCursor` re-exports from the Grok and
Senpi processing barrels keep the public surface unchanged.
- Timing-sensitive CLI, Senpi trust-writer, and lifecycle tests use
injected clocks and fake timers instead of wall-clock waits. The
trust writer accepts an optional `clock` so lock-budget assertions
never sleep.

### Fixed

- Grok tail full-state rebuilds ignore the steady-state scan bounds
(`maxScanBytes`/`maxScanLines`; per-line `maxLineBytes` still applies), and a
rebuild that still cannot complete returns a non-advancing result
(additive `stateComplete: false`, checkpoint rewound to previous cursors)
instead of persisting a checkpoint past incomplete reconstructed state.
- Marker lock and Senpi trust-state lock releases and stale reclamations
claim the lock atomically (rename to a private uuid path) and verify the
ownership token there before removal: a releasing owner whose stale lease
was reclaimed no longer deletes the replacement's lock, and a reclaimer
that races a fresh replacement restores it instead of deleting it.
- Clean-consumer pack parsing survives npm < 11 running the `prepare` script during `npm pack` despite `--ignore-scripts` (npm/cli#3080): the JSON report is extracted from stdout instead of parsed from byte zero. Same fix in the packed package contract test.
- Senpi execute real-signal cases spawn the self-killing child through `exec` so the observed close is signal death on shells that fork and wait (dash).
- Marker-lock replacement case no longer asserts an inode number difference; ext4/overlayfs reuse inodes after rm+mkdir, and the nonce mismatch is the property under test.
- Compatibility probe tolerates missing git metadata in codeload/tarball installs: `candidateSha` falls back to `unknown` when `git rev-parse HEAD` fails, so `prepack` no longer fails on archive pins.
- Bound stdin to 1 MiB in Senpi execute, Grok execute, both hook
forwarders, and Claude `readStdin`.
- Bound shared JSONL cursor scans to 32 MiB and 10_000 lines per pass.
Senpi and Grok tail results expose additive `scanStatus` (`complete` or
`limited`) when a pass stops early.
- Senpi tail reports `reset: false` on a first-ever scan, treats movement
as cursor and projection position change, and skips complete blank lines
so a trailing blank is not `terminalMalformed`.
- Senpi automatic checkpoint writes return additive `checkpointStatus`
(`committed`, `unchanged`, `manual`, `failed`, or `deferred`) instead of
throwing on write failure.
- Senpi watch quiesces on position stability. Reset, mtime, size beyond
the cursor, and filesystem noise no longer count as movement or re-arm
the quiet window.
- Grok watch wakes on null-filename `fs.watch` events and supports an
optional `pollMs` backstop.
- Bound Grok discovery reads of `summary.json` (64 KiB) and `.cwd` (4 KiB).
Oversized files take the existing invalid or diagnostic path.
- Senpi listing never yields or parses an unterminated final line. The
newline commits the entry on the next listing pass.
- `listAllSenpiSessions` skips root-level `*-artifacts/` directories,
matching the nested-directory filter.
- Senpi registration-document reads reject unknown hook-event keys,
groups without handlers, empty commands, and arbitrary hooks objects.
Inspect surfaces the existing malformed-shape read-error union.

### Security

- Senpi hook forwarder accepts only loopback `http`/`https` URLs
(`127.0.0.1`, `localhost`, `::1`) unless
`SENPI_HOOK_FORWARD_ALLOW_REMOTE=1` is set. Redirects are refused and
stdin is capped at 1 MiB.
- Marker-root containment realpath-walks the candidate and allowed
roots so a symlink inside a root that points outward is rejected.
Write-path re-verification (`assertMarkerDirStillAllowed`) rejects a
directory swapped for an outward symlink after resolve.
- Marker-lock stale reclamation writes `owner.json` `{ nonce }` after
`mkdir`, atomically rename-claims a stale lock, and re-checks `{dev, ino}`
plus nonce after the claim. Exactly one concurrent reclaimer can remove a
captured stale lock, and a recreated lock is restored rather than deleted.

## [0.3.0] - 2026-08-23

First public contract freeze. This release documents the Claude, Grok, and
Senpi library surfaces that ship in the package. It is not a desktop product
integration and does not publish itself; npm publication with provenance is a
separate owner-authorized step.

Supported runtime: Node.js `>=22.0.0`. Development and CI also run on Node 24.
Node 20 and Windows are not supported.

### Added

- Added the attach-only Grok Build surface on `/grok` (hook validation, output
builder, runner, JSON/TOML settings) and `/grok/processing` (discovery, parse,
tail, watch, checkpoint commit, block reduction).
- Added the attach-only OmO-native (senpi) surface on `/senpi` (agent-home
resolution, hook wire/validation, output builder, runner, read-only trust
inspection, consent-gated trust grant/revoke, observe-only hooks.json
register/inspect/unregister) and `/senpi/processing` (discovery, listing,
parse, projection, tail, watch, checkpoint commit, native block reduction).
Mutating primitives require `{ consent: true, reason, target }` and never
run at module import.
- Added the standalone Senpi hook forwarder at
`dist/standalone/hook-forwarder-senpi.mjs` alongside the existing Claude
forwarder at `dist/standalone/hook-forwarder.mjs`. `/forwarder` exports the
pack-relative asset paths and `RUN_HOOK_WRAPPER_SH`; it does not install.
- Added a packed-tarball clean-consumer CI matrix on Node 22 and 24, plus a
Node 20 engine-mismatch job that must surface `engines.node >=22.0.0`.
- Added Claude Code hook parity for optional `prompt_id`, eight Notification
types, Stop/SubagentStop background-task and session-cron registries, six
permission-update variants, the `manual` set-mode alias, `disableAllHooks`,
Expand All @@ -30,6 +145,8 @@ Categories per release: **Added**, **Changed**, **Deprecated**, **Removed**, **F

### Changed

- Package version is exact `0.3.0`. `publishConfig.provenance` is enabled so
the owner-gated release workflow can attest the npm tarball.
- Notification output is restricted to universal hook fields.
- Stop and SubagentStop block outputs require a present `reason` string (empty
string accepted) and remain distinct from non-error `additionalContext`
Expand All @@ -50,6 +167,19 @@ Categories per release: **Added**, **Changed**, **Deprecated**, **Removed**, **F
- `sessionStartContext(options)` preserves empty strings and empty `watchPaths`
via presence checks rather than truthiness.

### Compatibility

- Runtime floor remains Node.js `>=22.0.0`. It is not raised and not broadened.
- Grok and Senpi are observe/attach contracts only. This library does not spawn,
drive, Commit, or translate Claude hook scripts to those engines.
- Claude `/processing` stays the session parse/tail/export surface. Marker
helpers remain public; JSONL cursor internals and Senpi marker-schema helpers
stay unexported and resolve as `ERR_PACKAGE_PATH_NOT_EXPORTED`.
- There is no public plugin ABI and no shared cross-harness `SessionBlock`.
- This package is a library. It does not ship a Cockpit (or any other) product
integration, daemon, or UI. Cockpit is observe-only for OmO/Senpi and must
not call kit hook/trust writers or install the Senpi forwarder.

### Fixed

- Canonicalized existing hook-event working directories before project-root
Expand Down Expand Up @@ -180,4 +310,7 @@ Development milestone for `@libar-dev/claude-code-hooks` before the first public
- Exact `--format raw-records` payloads and `rawLine` bytes are gated behind the explicit
`--unsafe-raw-unredacted` opt-in; without it, raw records are redacted.

[Unreleased]: https://github.com/libar-dev/agent-harness-kit/compare/v0.3.0...HEAD
[0.3.0]: https://github.com/libar-dev/agent-harness-kit/releases/tag/v0.3.0
[0.2.0]: https://github.com/libar-dev/agent-harness-kit/releases/tag/v0.2.0
[0.1.0]: https://github.com/libar-dev/agent-harness-kit/releases/tag/v0.1.0
Loading
Loading