@onlooker-community/ecosystem 0.28.1 → 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/marketplace.json +13 -0
- package/.claude-plugin/plugin.json +1 -1
- package/.release-please-manifest.json +4 -3
- package/CHANGELOG.md +14 -0
- package/CLAUDE.md +2 -0
- package/README.md +114 -13
- package/docs/plugin-catalog.md +125 -0
- package/package.json +3 -3
- package/plugins/compass/.claude-plugin/plugin.json +1 -1
- package/plugins/compass/CHANGELOG.md +7 -0
- package/plugins/compass/README.md +1 -3
- package/plugins/compass/config.json +1 -2
- package/plugins/compass/docs/design.md +1 -2
- package/plugins/compass/scripts/hooks/compass-bash-gate.sh +8 -1
- package/plugins/compass/scripts/hooks/compass-pre-tool-use.sh +8 -1
- package/plugins/compass/scripts/hooks/compass-record-write.sh +5 -0
- package/plugins/compass/scripts/hooks/compass-session-start.sh +0 -8
- package/plugins/compass/scripts/lib/compass-evaluator.sh +58 -98
- package/plugins/compass/scripts/lib/compass-gate.sh +15 -18
- package/plugins/compass/scripts/lib/compass-sanitizer.sh +4 -4
- package/plugins/compass/scripts/lib/compass-transcript.sh +79 -112
- package/plugins/inspector/.claude-plugin/plugin.json +14 -0
- package/plugins/inspector/CHANGELOG.md +8 -0
- package/plugins/inspector/README.md +155 -0
- package/plugins/inspector/config.json +25 -0
- package/plugins/inspector/docs/design.md +286 -0
- package/plugins/inspector/hooks/hooks.json +33 -0
- package/plugins/inspector/scripts/hooks/inspector-post-write.sh +124 -0
- package/plugins/inspector/scripts/lib/inspector-config.sh +108 -0
- package/plugins/inspector/scripts/lib/inspector-events.sh +82 -0
- package/plugins/inspector/scripts/lib/inspector-project-key.sh +55 -0
- package/plugins/inspector/scripts/lib/inspector-run.sh +305 -0
- package/plugins/inspector/scripts/lib/inspector-ulid.sh +45 -0
- package/release-please-config.json +17 -1
- package/test/bats/archivist-project-key.bats +79 -0
- package/test/bats/archivist-storage.bats +79 -0
- package/test/bats/compact-tracker.bats +125 -0
- package/test/bats/compass-config.bats +65 -0
- package/test/bats/compass-gate.bats +129 -0
- package/test/bats/compass-sanitizer.bats +69 -0
- package/test/bats/compass-symbolic-skip.bats +88 -0
- package/test/bats/compass-transcript.bats +80 -0
- package/test/bats/inspector-config.bats +118 -0
- package/test/bats/inspector-events.bats +156 -0
- package/test/bats/inspector-post-write-hook.bats +164 -0
- package/test/bats/inspector-project-key.bats +68 -0
- package/test/bats/inspector-ulid.bats +34 -0
- package/test/bats/librarian-session-end.bats +8 -1
- package/test/bats/onlooker-schema.bats +111 -0
- package/test/bats/prompt-rules.bats +98 -0
- package/test/bats/session-tracker.bats +260 -0
- package/test/bats/skill-usage-tracker.bats +63 -0
- package/test/bats/task-tracker.bats +102 -0
- package/test/bats/turn-tracker.bats +180 -0
- package/test/bats/validate-path.bats +125 -0
- package/test/bats/worktree-tracker.bats +167 -0
|
@@ -215,6 +215,19 @@
|
|
|
215
215
|
"license": "MIT",
|
|
216
216
|
"keywords": ["provenance", "blame", "history", "tool-use", "transcript", "audit"],
|
|
217
217
|
"tags": ["observability", "provenance"]
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"name": "inspector",
|
|
221
|
+
"source": "./plugins/inspector",
|
|
222
|
+
"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 lint and type errors before claiming success. Cheaper than running the full project verify; complements assayer (which catches the agent lying about claims). Emits inspector.* events for downstream analysis. Requires the ecosystem plugin.",
|
|
223
|
+
"author": {
|
|
224
|
+
"name": "Onlooker Community"
|
|
225
|
+
},
|
|
226
|
+
"homepage": "https://onlooker.dev",
|
|
227
|
+
"repository": "https://github.com/onlooker-community/ecosystem",
|
|
228
|
+
"license": "MIT",
|
|
229
|
+
"keywords": ["verification", "lint", "typecheck", "post-tool-use", "audit", "feedback"],
|
|
230
|
+
"tags": ["verification", "observability"]
|
|
218
231
|
}
|
|
219
232
|
]
|
|
220
233
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ecosystem",
|
|
3
|
-
"version": "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,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
".": "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",
|
|
6
6
|
"plugins/cartographer": "0.2.1",
|
|
7
7
|
"plugins/governor": "0.2.1",
|
|
8
|
-
"plugins/compass": "0.
|
|
8
|
+
"plugins/compass": "0.3.0",
|
|
9
9
|
"plugins/scribe": "0.2.1",
|
|
10
10
|
"plugins/counsel": "0.3.1",
|
|
11
11
|
"plugins/warden": "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,19 @@
|
|
|
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
|
+
|
|
10
|
+
## [0.29.0](https://github.com/onlooker-community/ecosystem/compare/ecosystem-v0.28.1...ecosystem-v0.29.0) (2026-06-15)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
* **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))
|
|
16
|
+
|
|
3
17
|
## [0.28.1](https://github.com/onlooker-community/ecosystem/compare/ecosystem-v0.28.0...ecosystem-v0.28.1) (2026-06-12)
|
|
4
18
|
|
|
5
19
|
|
package/CLAUDE.md
CHANGED
|
@@ -16,6 +16,7 @@ plugins/
|
|
|
16
16
|
compass/ ← pre-write alignment gate (design phase)
|
|
17
17
|
echo/ ← prompt-change regression detection
|
|
18
18
|
governor/ ← resource governance and budget enforcement
|
|
19
|
+
inspector/ ← per-edit lint and typecheck gate
|
|
19
20
|
lineage/ ← per-change provenance ("why does this line exist?")
|
|
20
21
|
tribunal/ ← multi-agent quality gate (Actor → Jury → Meta-Judge → Gate)
|
|
21
22
|
|
|
@@ -42,6 +43,7 @@ scripts/lib/onlooker-event.mjs ← canonical event builder; all plugins route t
|
|
|
42
43
|
| assayer | Stop | Verifies the agent's final-message claims against actual command results in the transcript; advisory |
|
|
43
44
|
| bursar | SessionStart, SessionEnd | Rolls each session's spend into a per-project ledger on SessionEnd; surfaces "this project burned $X this week" at SessionStart. Governor is per-session; bursar is the cross-session rollup |
|
|
44
45
|
| lineage | PostToolUse (Edit, Write, MultiEdit) + skill invocation | Records per-change provenance (session_id/turn + redacted, size-capped snippets) into a per-project ledger; `/lineage <file>:<line>` answers "why does this line exist?" by joining records to historian transcripts to recover prompt context |
|
|
46
|
+
| inspector | PostToolUse (Write, Edit, MultiEdit) | Per-edit verification: runs the project's configured lint + typecheck commands on just the touched file and emits `inspector.check.*` / `inspector.run.completed`. Surfaces issues to the agent for the next turn. Cheaper than the planned proctor (which runs the full project verify at Stop); complements assayer (which catches claims the agent makes without running anything) |
|
|
45
47
|
|
|
46
48
|
Plugins communicate by emitting events to the JSONL log — they do not call each other directly. All plugins depend on the ecosystem substrate; no plugin depends on another plugin directly.
|
|
47
49
|
|
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
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Plugin Catalog
|
|
2
|
+
|
|
3
|
+
The full set of Onlooker plugins — shipped and planned — grouped by the layer of agent behavior they address. Each entry is a sketch: name, status, hook surface, one-line purpose. Full design docs land in each plugin's own directory as the plugin is built.
|
|
4
|
+
|
|
5
|
+
**Status legend**
|
|
6
|
+
|
|
7
|
+
- **shipped** — code lives under `plugins/<name>/` and is exercised by the test suite
|
|
8
|
+
- **design** — design doc exists, no implementation
|
|
9
|
+
- **planned** — named only; this catalog is the first reference
|
|
10
|
+
|
|
11
|
+
**Layer map**
|
|
12
|
+
|
|
13
|
+
| Layer | What it does |
|
|
14
|
+
|---|---|
|
|
15
|
+
| quality | Judges output after the fact |
|
|
16
|
+
| governance | Enforces resource and policy limits |
|
|
17
|
+
| testing | Detects regressions in agents and prompts |
|
|
18
|
+
| safety | Blocks harmful or ambiguous actions before they land |
|
|
19
|
+
| analysis | Produces structured artifacts about the session and the repo |
|
|
20
|
+
| memory | Persists context across compaction and across sessions |
|
|
21
|
+
| discovery / routing | Surfaces the right ecosystem affordance for the moment |
|
|
22
|
+
| verification / execution | Runs the agent's output and reports whether it actually worked |
|
|
23
|
+
| feedback / adaptation | Detects user signals (corrections, reverts) and feeds them back |
|
|
24
|
+
| provenance | Links artifacts (files, decisions, commits) back to the prompts and agents that produced them |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Quality
|
|
29
|
+
|
|
30
|
+
Post-hoc judgment of agent output.
|
|
31
|
+
|
|
32
|
+
- **tribunal** — shipped — Stop + skill. Multi-agent quality gate: Actor → typed Judges → Meta-Judge → gate decides accept / retry / exhaust.
|
|
33
|
+
- **muse** — planned — UserPromptSubmit. Optional prompt-clarification pass that rewrites a vague prompt into a sharper one before the agent acts. Distinct from compass (which blocks) — muse reshapes.
|
|
34
|
+
- **rubric** — planned — skill only. Manages and versions the scoring rubrics that tribunal and echo consume; `/rubric` diffs or rolls back rubric revisions.
|
|
35
|
+
|
|
36
|
+
## Governance
|
|
37
|
+
|
|
38
|
+
Resource and policy enforcement.
|
|
39
|
+
|
|
40
|
+
- **governor** — shipped — SessionStart, PreToolUse(Task), PostToolUse(Task), Stop. Per-session token and cost spend tracking; gates Task spawns against a configurable budget ceiling.
|
|
41
|
+
- **bursar** — planned — SessionEnd. Per-project, multi-session budget accounting; surfaces "this project burned $X this week" at SessionStart. Governor is per-session; bursar is the rollup.
|
|
42
|
+
- **arbiter** — planned — PreToolUse. Resolves cross-plugin conflicts (e.g., warden gate is closed but tribunal wants to spawn an Actor) using a declared precedence policy.
|
|
43
|
+
|
|
44
|
+
## Testing
|
|
45
|
+
|
|
46
|
+
Regression detection for agents and prompts.
|
|
47
|
+
|
|
48
|
+
- **echo** — shipped — Stop. Single-judge quality pass when a watched agent file changes; compares the score against a stored baseline to report improved / degraded / neutral.
|
|
49
|
+
- **canary** — planned — cron / scheduled. Synthetic prompts run against watched agents on a schedule; detects drift without waiting for a file edit.
|
|
50
|
+
- **gauntlet** — planned — skill only. Adversarial fixture suite (jailbreaks, ambiguous prompts, edge cases) run on demand against a chosen agent.
|
|
51
|
+
|
|
52
|
+
## Safety
|
|
53
|
+
|
|
54
|
+
Block harmful or ambiguous actions before they land.
|
|
55
|
+
|
|
56
|
+
- **compass** — shipped — PreToolUse(Write, Edit, MultiEdit, Bash). Pre-write intent clarity gate. N=5 parallel Haiku evaluators score whether two independent readers would converge on the same interpretation; blocks below threshold.
|
|
57
|
+
- **warden** — shipped — PostToolUse(WebFetch, Read), PreToolUse(Write, Edit, MultiEdit, Bash), SessionStart. Scans ingested content for prompt-injection patterns; closes a session-scoped gate that blocks write-class tools until cleared.
|
|
58
|
+
|
|
59
|
+
## Analysis
|
|
60
|
+
|
|
61
|
+
Structured artifacts describing the session and the repo.
|
|
62
|
+
|
|
63
|
+
- **cartographer** — shipped — SessionStart, PostToolUse(Write, Edit, MultiEdit). Audits the persistent instruction layer (CLAUDE.md, AGENTS.md, .claude/rules/) for contradictions, shadowing, and drift.
|
|
64
|
+
- **counsel** — shipped — SessionStart. Weekly synthesis brief across all plugin event logs; injected when the last brief is stale.
|
|
65
|
+
- **scribe** — shipped — SessionEnd. Distills the session's "why" — problem context, decisions, tradeoffs — into a readable artifact.
|
|
66
|
+
|
|
67
|
+
## Memory
|
|
68
|
+
|
|
69
|
+
Context that survives compaction and sessions.
|
|
70
|
+
|
|
71
|
+
- **archivist** — shipped — PreCompact, SessionStart. Extracts decisions, dead-ends, and open questions on compaction; reinjects the most important ones at the next SessionStart.
|
|
72
|
+
- **historian** — shipped — SessionEnd. Chunks and sanitizes the session transcript and stores chunks locally for future retrieval. Indexing pipeline only; retrieval lands in a follow-up.
|
|
73
|
+
- **librarian** — shipped — SessionEnd, skill. Consolidates archivist's per-session artifacts into the user's durable typed memory store; queues classified proposals for explicit confirmation.
|
|
74
|
+
- **curator** — shipped — SessionStart, skill. Maintenance pass over the typed memory store: four cheap heuristic checks (date decay, broken paths, broken index, orphaned memory) inside a wall-clock budget; surfaces findings, never edits the store directly.
|
|
75
|
+
|
|
76
|
+
## Discovery / Routing
|
|
77
|
+
|
|
78
|
+
Help the agent and the user find the right affordance for the moment.
|
|
79
|
+
|
|
80
|
+
- **wayfinder** — planned — UserPromptSubmit. Ranks ecosystem plugins, skills, and agents against the current prompt; surfaces the top 1–2 as a `wayfinder.suggestion` event.
|
|
81
|
+
- **herald** — planned — SessionStart. Announces plugins, skills, or agents added since the user's last session in this project. One-time per item, dismissable.
|
|
82
|
+
- **dispatcher** — planned — UserPromptSubmit. Narrow intent classifier ("commit", "ship a PR", "review changes") that maps directly to the canonical skill. Narrower than wayfinder; fewer false positives.
|
|
83
|
+
|
|
84
|
+
## Verification / Execution
|
|
85
|
+
|
|
86
|
+
Run the agent's output. Report what actually happened.
|
|
87
|
+
|
|
88
|
+
- **proctor** — planned — Stop, PostToolUse(Edit, Write). Runs the project's verification command (configurable: `npm test`, `mise run check`, `cargo test`, …) after writes or at Stop; emits `proctor.verify.passed` or `.failed`.
|
|
89
|
+
- **assayer** — planned — Stop. Parses the agent's final message for testable claims ("I ran the tests", "the build passes") and verifies them against actual exit codes in the session log. Catches lying-without-malice.
|
|
90
|
+
- **inspector** — planned — PostToolUse(Edit, Write). Runs lint and typecheck on just the touched files. Cheaper than proctor; fires far more often.
|
|
91
|
+
|
|
92
|
+
## Feedback / Adaptation
|
|
93
|
+
|
|
94
|
+
Detect user signals and feed them back into the system.
|
|
95
|
+
|
|
96
|
+
- **attendant** — planned — UserPromptSubmit. Detects course-corrections in the user's prompt ("no", "stop", "don't", revert patterns); emits `attendant.pushback.detected` for other plugins to consume.
|
|
97
|
+
- **interpreter** — planned — consumes attendant events. Classifies pushback tone (frustrated / clarifying / neutral) so downstream plugins don't overreact to clarifying questions.
|
|
98
|
+
- **adept** — planned — SessionStart. Accumulates pushback patterns over sessions; injects "you've corrected this pattern N times" hints. Closes the loop that echo opens for prompt files.
|
|
99
|
+
|
|
100
|
+
## Provenance
|
|
101
|
+
|
|
102
|
+
Link artifacts back to the prompts and agents that produced them.
|
|
103
|
+
|
|
104
|
+
- **lineage** — planned — PostToolUse(Edit, Write, MultiEdit). Records the prompt + agent + session that produced each file change; builds a queryable graph by joining historian transcripts with tool-use events. Answers "why does this line exist?"
|
|
105
|
+
- **ledger** — planned — PostToolUse(*) write-class. Append-only audit record of every write-class tool call with the prompt and agent context attached. `/ledger` queries by file, prompt substring, or time range.
|
|
106
|
+
- **witness** — planned — Stop. Captures the deciding assistant turn — the moment the agent committed to a course of action — and stores it as a discrete artifact. Distinct from scribe (which writes a narrative) — witness preserves the pivot itself.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Coverage check
|
|
111
|
+
|
|
112
|
+
| Layer | Plugins |
|
|
113
|
+
|---|---|
|
|
114
|
+
| quality | tribunal, muse, rubric |
|
|
115
|
+
| governance | governor, bursar, arbiter |
|
|
116
|
+
| testing | echo, canary, gauntlet |
|
|
117
|
+
| safety | compass, warden |
|
|
118
|
+
| analysis | cartographer, counsel, scribe |
|
|
119
|
+
| memory | archivist, historian, librarian, curator |
|
|
120
|
+
| discovery / routing | wayfinder, herald, dispatcher |
|
|
121
|
+
| verification / execution | proctor, assayer, inspector |
|
|
122
|
+
| feedback / adaptation | attendant, interpreter, adept |
|
|
123
|
+
| provenance | lineage, ledger, witness |
|
|
124
|
+
|
|
125
|
+
Every layer holds at least two plugins; most hold three. Total: 12 shipped, 0 design, 17 planned.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onlooker-community/ecosystem",
|
|
3
|
-
"version": "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",
|
|
@@ -19,14 +19,14 @@
|
|
|
19
19
|
"onlooker-install": "install.sh"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@onlooker-community/schema": "^2.
|
|
22
|
+
"@onlooker-community/schema": "^2.9.0"
|
|
23
23
|
},
|
|
24
24
|
"scripts": {
|
|
25
25
|
"postinstall": "echo '\\n onlooker-ecosystem installed!\\n Run: npx onlooker-install typescript\\n Docs: https://github.com/onlooker-community/ecosystem\\n'",
|
|
26
26
|
"test": "npm run test:bats && npm run test:schema",
|
|
27
27
|
"test:bats": "bats test/bats",
|
|
28
28
|
"test:schema": "node --test test/node/*.test.mjs",
|
|
29
|
-
"test:shellcheck": "shellcheck -S error -x install.sh scripts/common.sh scripts/hooks/*.sh scripts/lib/*.sh plugins/archivist/scripts/hooks/*.sh plugins/archivist/scripts/lib/*.sh plugins/tribunal/scripts/hooks/*.sh plugins/tribunal/scripts/lib/*.sh plugins/echo/scripts/hooks/*.sh plugins/echo/scripts/lib/*.sh plugins/governor/scripts/hooks/*.sh plugins/governor/scripts/lib/*.sh plugins/compass/scripts/hooks/*.sh plugins/compass/scripts/lib/*.sh plugins/scribe/scripts/hooks/*.sh plugins/scribe/scripts/lib/*.sh plugins/counsel/scripts/hooks/*.sh plugins/counsel/scripts/lib/*.sh plugins/warden/scripts/hooks/*.sh plugins/warden/scripts/lib/*.sh plugins/librarian/scripts/hooks/*.sh plugins/librarian/scripts/lib/*.sh plugins/curator/scripts/hooks/*.sh plugins/curator/scripts/lib/*.sh plugins/historian/scripts/hooks/*.sh plugins/historian/scripts/lib/*.sh plugins/assayer/scripts/hooks/*.sh plugins/assayer/scripts/lib/*.sh plugins/cartographer/scripts/hooks/*.sh plugins/cartographer/scripts/lib/*.sh plugins/bursar/scripts/hooks/*.sh plugins/bursar/scripts/lib/*.sh plugins/lineage/scripts/hooks/*.sh plugins/lineage/scripts/lib/*.sh",
|
|
29
|
+
"test:shellcheck": "shellcheck -S error -x install.sh scripts/common.sh scripts/hooks/*.sh scripts/lib/*.sh plugins/archivist/scripts/hooks/*.sh plugins/archivist/scripts/lib/*.sh plugins/tribunal/scripts/hooks/*.sh plugins/tribunal/scripts/lib/*.sh plugins/echo/scripts/hooks/*.sh plugins/echo/scripts/lib/*.sh plugins/governor/scripts/hooks/*.sh plugins/governor/scripts/lib/*.sh plugins/compass/scripts/hooks/*.sh plugins/compass/scripts/lib/*.sh plugins/scribe/scripts/hooks/*.sh plugins/scribe/scripts/lib/*.sh plugins/counsel/scripts/hooks/*.sh plugins/counsel/scripts/lib/*.sh plugins/warden/scripts/hooks/*.sh plugins/warden/scripts/lib/*.sh plugins/librarian/scripts/hooks/*.sh plugins/librarian/scripts/lib/*.sh plugins/curator/scripts/hooks/*.sh plugins/curator/scripts/lib/*.sh plugins/historian/scripts/hooks/*.sh plugins/historian/scripts/lib/*.sh plugins/assayer/scripts/hooks/*.sh plugins/assayer/scripts/lib/*.sh plugins/cartographer/scripts/hooks/*.sh plugins/cartographer/scripts/lib/*.sh plugins/bursar/scripts/hooks/*.sh plugins/bursar/scripts/lib/*.sh plugins/lineage/scripts/hooks/*.sh plugins/lineage/scripts/lib/*.sh plugins/inspector/scripts/hooks/*.sh plugins/inspector/scripts/lib/*.sh",
|
|
30
30
|
"lint:references": "node scripts/lint/check-references.mjs",
|
|
31
31
|
"lint:manifests": "node scripts/lint/check-manifests.mjs",
|
|
32
32
|
"coverage:node": "node scripts/coverage/run-coverage.mjs",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "compass",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Pre-write intent clarity gate. Intercepts write-class tool calls and requires a confidence threshold before allowing them to proceed. Evaluates the pending write against the prior assistant turn as context to avoid false positives on question-answer turns. Builds on the Onlooker ecosystem plugin.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Onlooker Community",
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.3.0](https://github.com/onlooker-community/ecosystem/compare/compass-v0.2.1...compass-v0.3.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))
|
|
9
|
+
|
|
3
10
|
## [0.2.1](https://github.com/onlooker-community/ecosystem/compare/compass-v0.2.0...compass-v0.2.1) (2026-06-12)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -74,8 +74,7 @@ All keys are optional. Unset keys fall back to the plugin's `config.json` defaul
|
|
|
74
74
|
"identity_match": "dir_plus_stem"
|
|
75
75
|
},
|
|
76
76
|
"transcript": {
|
|
77
|
-
"prior_turn_chars_max": 800
|
|
78
|
-
"transcript_max_age_seconds": 300
|
|
77
|
+
"prior_turn_chars_max": 800
|
|
79
78
|
},
|
|
80
79
|
"skip_patterns": {
|
|
81
80
|
"reply_to_question": {
|
|
@@ -115,7 +114,6 @@ All keys are optional. Unset keys fall back to the plugin's `config.json` defaul
|
|
|
115
114
|
| `cooldown.seconds` | `120` | A write whose path shares a parent directory and filename stem with a recent successful write is skipped within this window. |
|
|
116
115
|
| `cooldown.identity_match` | `dir_plus_stem` | Cooldown identity strategy. Stem comparison strips only the final extension; the cooldown does not carry across a rename. |
|
|
117
116
|
| `transcript.prior_turn_chars_max` | `800` | Maximum characters of the prior assistant turn fed into the evaluator. Set to `0` to omit the prior turn for near-zero egress. |
|
|
118
|
-
| `transcript.transcript_max_age_seconds` | `300` | Maximum age of the transcript file Compass will read the prior turn from. |
|
|
119
117
|
| `skip_patterns.reply_to_question.enabled` | `true` | Enables the symbolic skip layer. When disabled, every write that passes the trigger gate reaches the LLM evaluator. |
|
|
120
118
|
| `max_checks_per_turn` | `3` | Per-turn evaluation budget. Writes beyond this skip with reason `turn_budget_exhausted`. |
|
|
121
119
|
| `min_context_chars` | `80` | Minimum sanitized context length. Shorter context skips with reason `insufficient_context`. |
|
|
@@ -223,8 +223,7 @@ The re-check is capped at one per intervention. After one re-check, the three pa
|
|
|
223
223
|
"identity_match": "dir_plus_stem"
|
|
224
224
|
},
|
|
225
225
|
"transcript": {
|
|
226
|
-
"prior_turn_chars_max": 800
|
|
227
|
-
"transcript_max_age_seconds": 300
|
|
226
|
+
"prior_turn_chars_max": 800
|
|
228
227
|
},
|
|
229
228
|
"skip_patterns": {
|
|
230
229
|
"reply_to_question": {
|
|
@@ -13,6 +13,12 @@
|
|
|
13
13
|
|
|
14
14
|
set -uo pipefail
|
|
15
15
|
|
|
16
|
+
# Recursion guard — must be first.
|
|
17
|
+
# When the evaluator shells out to `claude -p`, that subprocess can
|
|
18
|
+
# trigger its own Bash hooks, which would re-enter Compass.
|
|
19
|
+
[[ "${COMPASS_NESTED:-}" == "1" ]] && exit 0
|
|
20
|
+
export COMPASS_NESTED=1
|
|
21
|
+
|
|
16
22
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
17
23
|
PLUGIN_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
|
18
24
|
|
|
@@ -35,6 +41,7 @@ INPUT=$(cat)
|
|
|
35
41
|
SESSION_ID=$(printf '%s' "$INPUT" | jq -r '.session_id // ""' 2>/dev/null) || SESSION_ID=""
|
|
36
42
|
CWD=$(printf '%s' "$INPUT" | jq -r '.cwd // ""' 2>/dev/null) || CWD=""
|
|
37
43
|
COMMAND=$(printf '%s' "$INPUT" | jq -r '.tool_input.command // ""' 2>/dev/null) || COMMAND=""
|
|
44
|
+
TRANSCRIPT_PATH=$(printf '%s' "$INPUT" | jq -r '.transcript_path // ""' 2>/dev/null) || TRANSCRIPT_PATH=""
|
|
38
45
|
|
|
39
46
|
export _HOOK_SESSION_ID="$SESSION_ID"
|
|
40
47
|
|
|
@@ -91,5 +98,5 @@ if ! _is_write_command "$COMMAND"; then
|
|
|
91
98
|
exit 0
|
|
92
99
|
fi
|
|
93
100
|
|
|
94
|
-
compass_run_gate "Bash" "" "bash_write" "$COMMAND" "$SESSION_ID" "$CWD"
|
|
101
|
+
compass_run_gate "Bash" "" "bash_write" "$COMMAND" "$SESSION_ID" "$CWD" "$TRANSCRIPT_PATH"
|
|
95
102
|
exit $?
|
|
@@ -12,6 +12,12 @@
|
|
|
12
12
|
|
|
13
13
|
set -uo pipefail
|
|
14
14
|
|
|
15
|
+
# Recursion guard — must be first.
|
|
16
|
+
# When the evaluator shells out to `claude -p`, that subprocess can
|
|
17
|
+
# trigger its own Write/Edit hooks, which would re-enter Compass.
|
|
18
|
+
[[ "${COMPASS_NESTED:-}" == "1" ]] && exit 0
|
|
19
|
+
export COMPASS_NESTED=1
|
|
20
|
+
|
|
15
21
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
16
22
|
PLUGIN_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
|
17
23
|
|
|
@@ -34,6 +40,7 @@ INPUT=$(cat)
|
|
|
34
40
|
SESSION_ID=$(printf '%s' "$INPUT" | jq -r '.session_id // ""' 2>/dev/null) || SESSION_ID=""
|
|
35
41
|
CWD=$(printf '%s' "$INPUT" | jq -r '.cwd // ""' 2>/dev/null) || CWD=""
|
|
36
42
|
TOOL_NAME=$(printf '%s' "$INPUT" | jq -r '.tool_name // ""' 2>/dev/null) || TOOL_NAME=""
|
|
43
|
+
TRANSCRIPT_PATH=$(printf '%s' "$INPUT" | jq -r '.transcript_path // ""' 2>/dev/null) || TRANSCRIPT_PATH=""
|
|
37
44
|
|
|
38
45
|
export _HOOK_SESSION_ID="$SESSION_ID"
|
|
39
46
|
|
|
@@ -87,5 +94,5 @@ case "$TOOL_NAME" in
|
|
|
87
94
|
;;
|
|
88
95
|
esac
|
|
89
96
|
|
|
90
|
-
compass_run_gate "$TOOL_NAME" "$FILE_PATH" "$OPERATION" "$CONTEXT" "$SESSION_ID" "$CWD"
|
|
97
|
+
compass_run_gate "$TOOL_NAME" "$FILE_PATH" "$OPERATION" "$CONTEXT" "$SESSION_ID" "$CWD" "$TRANSCRIPT_PATH"
|
|
91
98
|
exit $?
|
|
@@ -11,6 +11,11 @@
|
|
|
11
11
|
|
|
12
12
|
set -uo pipefail
|
|
13
13
|
|
|
14
|
+
# Recursion guard — must be first.
|
|
15
|
+
# A nested `claude -p` Write would otherwise re-enter the cooldown writer.
|
|
16
|
+
[[ "${COMPASS_NESTED:-}" == "1" ]] && exit 0
|
|
17
|
+
export COMPASS_NESTED=1
|
|
18
|
+
|
|
14
19
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
15
20
|
PLUGIN_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
|
16
21
|
|
|
@@ -18,14 +18,6 @@ set -uo pipefail
|
|
|
18
18
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
19
19
|
PLUGIN_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
|
20
20
|
|
|
21
|
-
_ECOSYSTEM_ROOT="${ONLOOKER_ECOSYSTEM_ROOT:-}"
|
|
22
|
-
if [[ -z "$_ECOSYSTEM_ROOT" ]]; then
|
|
23
|
-
_candidate="$(cd "${PLUGIN_ROOT}/../.." 2>/dev/null && pwd)"
|
|
24
|
-
if [[ -f "${_candidate}/scripts/lib/validate-path.sh" ]]; then
|
|
25
|
-
_ECOSYSTEM_ROOT="$_candidate"
|
|
26
|
-
fi
|
|
27
|
-
fi
|
|
28
|
-
|
|
29
21
|
export CLAUDE_PLUGIN_ROOT="$PLUGIN_ROOT"
|
|
30
22
|
|
|
31
23
|
# shellcheck source=../lib/compass-config.sh
|