@onlooker-community/ecosystem 0.29.0 → 0.29.1

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ecosystem",
3
- "version": "0.29.0",
3
+ "version": "0.29.1",
4
4
  "description": "Observability substrate for Claude Code. Provides the shared $ONLOOKER_DIR storage root (default $HOME/.onlooker), canonical schema-validated event emission, session and tool tracking hooks, and prompt rules. Required by all other Onlooker plugins.",
5
5
  "author": {
6
6
  "name": "Onlooker Community",
@@ -1,5 +1,5 @@
1
1
  {
2
- ".": "0.29.0",
2
+ ".": "0.29.1",
3
3
  "plugins/archivist": "0.1.0",
4
4
  "plugins/tribunal": "1.0.1",
5
5
  "plugins/echo": "0.2.0",
@@ -14,5 +14,6 @@
14
14
  "plugins/historian": "0.2.0",
15
15
  "plugins/assayer": "1.0.0",
16
16
  "plugins/bursar": "0.1.0",
17
- "plugins/lineage": "0.1.0"
17
+ "plugins/lineage": "0.1.0",
18
+ "plugins/inspector": "0.2.0"
18
19
  }
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.29.1](https://github.com/onlooker-community/ecosystem/compare/ecosystem-v0.29.0...ecosystem-v0.29.1) (2026-06-15)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **cartographer:** correct typo in release-please bump-patch key :face_with_spiral_eyes: ([#91](https://github.com/onlooker-community/ecosystem/issues/91)) ([dfab160](https://github.com/onlooker-community/ecosystem/commit/dfab1602afda2b6255a72b0975ebab9289d75b8e))
9
+
3
10
  ## [0.29.0](https://github.com/onlooker-community/ecosystem/compare/ecosystem-v0.28.1...ecosystem-v0.29.0) (2026-06-15)
4
11
 
5
12
 
package/README.md CHANGED
@@ -1,31 +1,101 @@
1
1
  # Onlooker Ecosystem
2
2
 
3
3
  [![Test](https://github.com/onlooker-community/ecosystem/actions/workflows/test.yml/badge.svg)](https://github.com/onlooker-community/ecosystem/actions/workflows/test.yml)
4
+ [![Coverage](https://github.com/onlooker-community/ecosystem/actions/workflows/coverage.yml/badge.svg)](https://github.com/onlooker-community/ecosystem/actions/workflows/coverage.yml)
5
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)
6
+ [![Plugins](https://img.shields.io/badge/plugins-17-8A2BE2)](#plugins)
7
+ [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://www.conventionalcommits.org)
4
8
 
5
- Agents, skills, hooks, commands, rules, and MCP configurations that power [Onlooker](https://onlooker.dev).
9
+ Composable observability, memory, and quality-gate plugins for [Claude Code](https://docs.claude.com/en/docs/claude-code) all built on the [Onlooker](https://onlooker.dev) event substrate.
6
10
 
7
- The ecosystem is a **Claude Code plugin marketplace** built around a shared observability substrate. Every plugin writes to a common event log, derives stable project keys from your git remote, and stores artifacts under `~/.onlooker/` — so plugins compose without stepping on each other, and every event is queryable in one place.
11
+ The ecosystem is a **Claude Code plugin marketplace**. Every plugin writes to a shared, schema-validated event log, derives a stable project key from your git remote, and stores artifacts under `~/.onlooker/` — so plugins compose without stepping on each other, and every event is queryable in one place.
12
+
13
+ ---
14
+
15
+ ## Core concepts
16
+
17
+ - **Shared event substrate.** The `ecosystem` plugin is always-on infrastructure. Every other plugin emits [canonical Onlooker events](https://github.com/onlooker-community/schema) through `scripts/lib/onlooker-event.mjs`; nothing writes the log directly. Event types follow `<plugin>.<noun>.<verb>` (e.g. `tribunal.gate.blocked`, `inspector.run.completed`).
18
+ - **Plugins compose, they don't couple.** Plugins coordinate only by reading and writing the JSONL event bus — no plugin calls another directly. Every plugin depends on `ecosystem`; none depends on another plugin. So `bursar` can roll up `governor.session.complete` events without importing governor, and degrade gracefully when it's absent.
19
+ - **Stable project keys.** Artifacts are partitioned by a project key — the first 12 hex chars of `SHA256(remote:<origin-url>)`, falling back to the repo root for remote-less checkouts — so history stays attached to a project across clones and worktrees.
20
+ - **One storage root.** Runtime artifacts live under `$ONLOOKER_DIR` (default `$HOME/.onlooker/`), namespaced per plugin and project. Plugins fail soft when it's absent — a plugin never blocks a session it wasn't invited to.
21
+ - **Opt-in by default.** Most plugins ship disabled and are enabled per-project or globally via `settings.json`. The substrate, and a couple of low-cost reporters, are the exceptions (see the [table](#plugins)).
22
+
23
+ For how these fit together, see [docs/architecture.md](docs/architecture.md) and the [ecosystem-level ADRs](docs/adr/).
8
24
 
9
25
  ---
10
26
 
11
27
  ## Plugins
12
28
 
13
- | Plugin | Description | Opt-in? |
29
+ Seventeen plugins, grouped by what they do. Each links to its own README and config.
30
+
31
+ ### Substrate
32
+
33
+ | Plugin | Description | Default |
34
+ |--------|-------------|---------|
35
+ | [`ecosystem`](./) | Observability substrate: `$ONLOOKER_DIR` storage, canonical schema-validated event emission, session/tool tracking hooks, and prompt rules. Required by every other plugin. | Always on |
36
+
37
+ ### Memory & context
38
+
39
+ | Plugin | Description | Default |
40
+ |--------|-------------|---------|
41
+ | [`archivist`](./plugins/archivist) | Structured session memory across context truncation. Extracts decisions, dead ends, and open questions on `PreCompact`; reinjects the most relevant items at the next `SessionStart`. | Opt-in |
42
+ | [`librarian`](./plugins/librarian) | Consolidation layer between archivist's per-session artifacts and your durable typed memory store. Detects which decisions deserve to persist, classifies them, and queues proposals for explicit confirmation. | Opt-in |
43
+ | [`curator`](./plugins/curator) | Maintenance layer for the typed auto-memory store. Runs cheap heuristic checks (date-decayed, broken paths, orphaned entries) within a wall-clock budget and points you at `/curator review`. Never edits memory directly. | Opt-in |
44
+ | [`historian`](./plugins/historian) | Episodic memory. Chunks and sanitizes the transcript at `SessionEnd`, then embeds each prompt on `UserPromptSubmit` to retrieve relevant past context. | Opt-in |
45
+ | [`scribe`](./plugins/scribe) | Intent documentation from agent activity. Captures *why* changes were made — problem context, decisions, tradeoffs — and distills them into readable artifacts at session end. | Enabled |
46
+ | [`cartographer`](./plugins/cartographer) | Proactive auditor of the instruction layer (`CLAUDE.md`, `AGENTS.md`, `.claude/rules/`). Maps relationships and surfaces contradictions, shadowing, gaps, and drift before they cause misbehavior. | Opt-in |
47
+
48
+ ### Quality & verification
49
+
50
+ | Plugin | Description | Default |
51
+ |--------|-------------|---------|
52
+ | [`tribunal`](./plugins/tribunal) | Multi-agent quality gates. Wraps a task in an Actor → Jury → Meta-Judge → Gate loop and retries the Actor with critique until the gate passes or `max_iterations` is reached. Grounded in LLM-as-a-Judge (Zheng et al. 2023) and LLM-as-a-Meta-Judge (Wu et al. 2024). | Skill always on; Stop hook opt-in |
53
+ | [`echo`](./plugins/echo) | Prompt-change regression detection. When a watched agent file is modified, runs a single-judge quality pass and compares against a stored baseline to report improved, degraded, or neutral. | Opt-in |
54
+ | [`assayer`](./plugins/assayer) | Claim verification. Parses the agent's final message for testable claims ("tests pass", "build is green") and checks each against the actual command results in the transcript. Catches lying-without-malice. Advisory when on. | Opt-in |
55
+ | [`inspector`](./plugins/inspector) | Per-edit lint and typecheck gate. Runs the project's configured checks on just the touched file after every `Write`/`Edit`/`MultiEdit`, so the agent sees its own type errors before claiming success. Cheaper than a full project verify; complements assayer. | Opt-in |
56
+
57
+ ### Safety & alignment
58
+
59
+ | Plugin | Description | Default |
14
60
  |--------|-------------|---------|
15
- | [`ecosystem`](./) | Observability substrate: session tracking, canonical events, prompt rules, tool history. Required by all other plugins. | No always on |
16
- | [`archivist`](./plugins/archivist) | Structured session memory across context truncation. Extracts decisions, dead ends, and open questions; reinjects the most relevant items at the start of the next session. | Yes disabled by default |
17
- | [`tribunal`](./plugins/tribunal) | Multi-agent quality gates. Wraps a task in an Actor → Jury → Meta-Judge → Gate loop; retries the Actor with critique until the gate passes or `max_iterations` is reached. | Yes — skill always available; Stop hook opt-in |
18
- | [`echo`](./plugins/echo) | Prompt-change regression detection. When a watched agent file is modified, runs a quality pass and reports whether the change improved, degraded, or had no measurable effect. | Yes — disabled by default |
19
- | [`cartographer`](./plugins/cartographer) | Proactive instruction-file auditor. Discovers all `CLAUDE.md`, `AGENTS.md`, and `.claude/rules/` files, maps their relationships, and surfaces contradictions, dead rules, stale references, and scope collisions before they cause agent misbehavior. | Yes — disabled by default |
61
+ | [`compass`](./plugins/compass) | Pre-write intent clarity gate. Intercepts write-class tool calls and requires a confidence threshold before allowing them, evaluating the pending write against the prior assistant turn to avoid false positives on question-answer turns. | Opt-in |
62
+ | [`warden`](./plugins/warden) | Untrusted-content gate. Scans `WebFetch`/`Read` content for prompt-injection patterns and, on a hit, closes a session-scoped gate that blocks `Write`/`Edit`/`Bash` until you clear it. Applies Meta's Agents Rule of Two by removing external actions while untrusted content is in play. | Opt-in |
20
63
 
21
- For how these fit together, see [docs/architecture.md](docs/architecture.md).
64
+ ### Cost & governance
65
+
66
+ | Plugin | Description | Default |
67
+ |--------|-------------|---------|
68
+ | [`governor`](./plugins/governor) | Resource governance and budget enforcement. Tracks per-session token and cost spend and gates `Task` spawns before they exceed a configurable ceiling. Named for the steam-engine governor that regulates output. | Opt-in |
69
+ | [`bursar`](./plugins/bursar) | Multi-session, per-project budget accounting. Rolls each session's spend into a per-project ledger on `SessionEnd` and surfaces "this project burned $X this week" at `SessionStart`. The cross-session rollup to governor's single-session view. | Opt-in |
70
+
71
+ ### Observability & insight
72
+
73
+ | Plugin | Description | Default |
74
+ |--------|-------------|---------|
75
+ | [`lineage`](./plugins/lineage) | Per-change provenance — answers "why does this line exist?". Records session/turn metadata plus a redacted, size-capped snippet for every edit, then traces a file or line back to the change (and prompt) that introduced it. | Opt-in |
76
+ | [`counsel`](./plugins/counsel) | Weekly synthesis across the full observability stack. Reads every plugin's event log, produces a structured improvement brief, and injects it at session start when the last brief is stale. | Enabled |
22
77
 
23
78
  ---
24
79
 
25
80
  ## Quick start
26
81
 
82
+ ### Use it in Claude Code
83
+
84
+ Add the marketplace, then install the plugins you want:
85
+
86
+ ```text
87
+ /plugin marketplace add onlooker-community/ecosystem
88
+ /plugin install ecosystem@onlooker-community
89
+ /plugin install inspector@onlooker-community
90
+ ```
91
+
92
+ `ecosystem` is the substrate every other plugin builds on — install it first. Most plugins are disabled by default; enable and tune them under their namespace key in `~/.claude/settings.json` (global) or `.claude/settings.json` (per-project). See [ADR-004](docs/adr/004-plugin-config-with-settings-overlay.md) for the configuration model.
93
+
94
+ ### Onlooker CLI
95
+
96
+ The companion CLI reads the shared event log for cross-session reporting:
97
+
27
98
  ```bash
28
- # Install the Onlooker CLI
29
99
  brew tap onlooker-community/tap
30
100
  brew install onlooker
31
101
 
@@ -35,6 +105,22 @@ onlooker setup
35
105
 
36
106
  ---
37
107
 
108
+ ## Configuration
109
+
110
+ Each plugin ships defaults in its own `config.json`. Override them per-namespace in `settings.json`:
111
+
112
+ ```jsonc
113
+ {
114
+ // ~/.claude/settings.json (global) or .claude/settings.json (per-project)
115
+ "inspector": { "enabled": true },
116
+ "tribunal": { "enabled": true, "stop_hook": { "enabled": true } }
117
+ }
118
+ ```
119
+
120
+ Project-level settings override global by the plugin's namespace key.
121
+
122
+ ---
123
+
38
124
  ## Development
39
125
 
40
126
  Install tools with [mise](https://mise.jdx.dev/) (`mise install`), then install dependencies:
@@ -46,15 +132,24 @@ npm run test:shellcheck
46
132
  npm run test:ci # shellcheck + bats + schema + lint
47
133
  ```
48
134
 
49
- Hooks emit [canonical Onlooker events](https://github.com/onlooker-community/schema) via `scripts/lib/onlooker-event.mjs`. Bash helpers live in `scripts/lib/`.
135
+ Tests live under `test/bats/` and `test/node/` and use an isolated temp home, so nothing writes to your real `~/.onlooker/`.
136
+
137
+ Hooks emit [canonical Onlooker events](https://github.com/onlooker-community/schema) via `scripts/lib/onlooker-event.mjs`; shared bash helpers live in `scripts/lib/`. New event types must be registered in `@onlooker-community/schema` before a plugin emits them — the emitter validates the envelope.
138
+
139
+ ### Adding a plugin
50
140
 
51
- Tests live under `test/bats/` and `test/node/` and use an isolated temp home so nothing writes to your real `~/.onlooker/`.
141
+ 1. Create `plugins/<name>/` with `.claude-plugin/plugin.json`, `config.json`, and `hooks/hooks.json`.
142
+ 2. Emit only through `scripts/lib/onlooker-event.mjs`, and register your event types in `@onlooker-community/schema` first.
143
+ 3. Store artifacts under `${ONLOOKER_DIR:-$HOME/.onlooker}/<name>/<project-key>/` — never hardcode the path.
144
+ 4. Register the plugin in `.claude-plugin/marketplace.json`, `release-please-config.json`, and `.release-please-manifest.json`.
145
+
146
+ Commits follow [Conventional Commits](https://www.conventionalcommits.org); releases are automated with [release-please](https://github.com/googleapis/release-please) per plugin.
52
147
 
53
148
  ---
54
149
 
55
150
  ## Prompt rules
56
151
 
57
- The ecosystem plugin ships a `UserPromptSubmit` hook that injects declarative guidance when a user prompt matches a regex. Rules fire deterministically on literal prompt-text patterns, filling the niche that skills can't: guidance that must fire regardless of whether the model would have chosen a skill.
152
+ The ecosystem plugin ships a `UserPromptSubmit` hook that injects declarative guidance when a user prompt matches a regex. Rules fire deterministically on literal prompt-text patterns, filling the niche skills can't: guidance that must fire regardless of whether the model would have chosen a skill.
58
153
 
59
154
  Rules live in two files:
60
155
 
@@ -76,3 +171,9 @@ Rules live in two files:
76
171
  ```
77
172
 
78
173
  `pattern` is POSIX ERE (`[[ =~ ]]` semantics). Run `/list-prompt-rules` to see active rules and per-session fire state.
174
+
175
+ ---
176
+
177
+ ## License
178
+
179
+ [MIT](./LICENSE) © Onlooker Community
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onlooker-community/ecosystem",
3
- "version": "0.29.0",
3
+ "version": "0.29.1",
4
4
  "description": "Agents, skills, hooks, commands, rules, and MCP configurations that power [Onlooker](https://onlooker.dev)",
5
5
  "author": {
6
6
  "name": "Onlooker Community",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "inspector",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Per-edit lint and typecheck gate. Runs the project's configured checks on just the touched file after every Write / Edit / MultiEdit, so the agent sees its own type errors before claiming success. Cheaper than proctor (which runs project-wide verification at Stop); complements assayer (which catches the agent lying about claims). Builds on the Onlooker ecosystem plugin.",
5
5
  "author": {
6
6
  "name": "Onlooker Community",
@@ -0,0 +1,8 @@
1
+ # Changelog
2
+
3
+ ## [0.2.0](https://github.com/onlooker-community/ecosystem/compare/inspector-v0.1.0...inspector-v0.2.0) (2026-06-15)
4
+
5
+
6
+ ### Features
7
+
8
+ * **inspector:** ship the per-edit lint/typecheck plugin ([#88](https://github.com/onlooker-community/ecosystem/issues/88)) ([2018243](https://github.com/onlooker-community/ecosystem/commit/201824384abd6a4fc5f4395266924aa413a2ffd1))
@@ -67,7 +67,7 @@
67
67
  "changelog-path": "CHANGELOG.md",
68
68
  "release-type": "simple",
69
69
  "bump-minor-pre-major": true,
70
- "bump-patch-for-bump-minor-pre-major": false,
70
+ "bump-patch-for-minor-pre-major": false,
71
71
  "component": "cartographer",
72
72
  "draft": false,
73
73
  "prerelease": false,
@@ -254,6 +254,22 @@
254
254
  "jsonpath": "$.version"
255
255
  }
256
256
  ]
257
+ },
258
+ "plugins/inspector": {
259
+ "changelog-path": "CHANGELOG.md",
260
+ "release-type": "simple",
261
+ "bump-minor-pre-major": true,
262
+ "bump-patch-for-minor-pre-major": false,
263
+ "component": "inspector",
264
+ "draft": false,
265
+ "prerelease": false,
266
+ "extra-files": [
267
+ {
268
+ "type": "json",
269
+ "path": ".claude-plugin/plugin.json",
270
+ "jsonpath": "$.version"
271
+ }
272
+ ]
257
273
  }
258
274
  },
259
275
  "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json"
@@ -62,11 +62,18 @@ STUB
62
62
  export PATH="${STUB_BIN}:${PATH}"
63
63
 
64
64
  HOOK="${PLUGIN_ROOT}/scripts/hooks/librarian-session-end.sh"
65
+
66
+ # On its first scan the hook has no watermark and falls back to a relative
67
+ # "now - bootstrap_lookback_days" window (default 14 days). Fixtures must be
68
+ # dated inside that window or the scan sees nothing. Compute a recent
69
+ # timestamp at runtime — a hardcoded date silently ages out of the window
70
+ # and turns these tests into a time bomb. One day back keeps a wide margin.
71
+ FIXTURE_CREATED_AT=$(python3 -c "import datetime; print((datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=1)).strftime('%Y-%m-%dT%H:%M:%SZ'))")
65
72
  }
66
73
 
67
74
  # Helper: write an archivist artifact for the project.
68
75
  _seed_artifact() {
69
- local kind="$1" id="$2" summary="$3" detail="$4" created_at="${5:-2026-06-01T12:00:00Z}"
76
+ local kind="$1" id="$2" summary="$3" detail="$4" created_at="${5:-$FIXTURE_CREATED_AT}"
70
77
  local dir="${ARCHIVIST_DIR}/${kind}"
71
78
  mkdir -p "$dir"
72
79
  jq -n \