@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.
- package/.claude-plugin/plugin.json +1 -1
- package/.release-please-manifest.json +3 -2
- package/CHANGELOG.md +7 -0
- package/README.md +114 -13
- package/package.json +1 -1
- package/plugins/inspector/.claude-plugin/plugin.json +1 -1
- package/plugins/inspector/CHANGELOG.md +8 -0
- package/release-please-config.json +17 -1
- package/test/bats/librarian-session-end.bats +8 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ecosystem",
|
|
3
|
-
"version": "0.29.
|
|
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.
|
|
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
|
[](https://github.com/onlooker-community/ecosystem/actions/workflows/test.yml)
|
|
4
|
+
[](https://github.com/onlooker-community/ecosystem/actions/workflows/coverage.yml)
|
|
5
|
+
[](./LICENSE)
|
|
6
|
+
[](#plugins)
|
|
7
|
+
[](https://www.conventionalcommits.org)
|
|
4
8
|
|
|
5
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
| [`
|
|
16
|
-
| [`
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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": "inspector",
|
|
3
|
-
"version": "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-
|
|
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
|
|
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 \
|