@onlooker-community/ecosystem 0.30.0 → 0.31.0
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/.gitattributes +18 -0
- package/.release-please-manifest.json +17 -17
- package/CHANGELOG.md +19 -0
- package/CLAUDE.md +10 -0
- package/package.json +2 -3
- package/plugins/archivist/.claude-plugin/plugin.json +1 -1
- package/plugins/archivist/CHANGELOG.md +7 -0
- package/plugins/archivist/README.md +4 -10
- package/plugins/archivist/config.json +0 -1
- package/plugins/archivist/scripts/hooks/archivist-extract.sh +0 -6
- package/plugins/archivist/scripts/hooks/archivist-inject.sh +2 -7
- package/plugins/archivist/scripts/lib/archivist-config.sh +0 -8
- package/plugins/assayer/.claude-plugin/plugin.json +1 -1
- package/plugins/assayer/CHANGELOG.md +7 -0
- package/plugins/assayer/README.md +4 -10
- package/plugins/assayer/config.json +0 -1
- package/plugins/assayer/scripts/hooks/assayer-stop.sh +1 -3
- package/plugins/assayer/scripts/lib/assayer-config.sh +0 -6
- package/plugins/bursar/.claude-plugin/plugin.json +1 -1
- package/plugins/bursar/CHANGELOG.md +7 -0
- package/plugins/bursar/README.md +3 -11
- package/plugins/bursar/config.json +0 -1
- package/plugins/bursar/scripts/hooks/bursar-session-end.sh +4 -6
- package/plugins/bursar/scripts/hooks/bursar-session-start.sh +3 -5
- package/plugins/bursar/scripts/lib/bursar-config.sh +1 -7
- package/plugins/cartographer/.claude-plugin/plugin.json +1 -1
- package/plugins/cartographer/CHANGELOG.md +7 -0
- package/plugins/cartographer/README.md +3 -10
- package/plugins/cartographer/config.json +0 -1
- package/plugins/cartographer/scripts/hooks/cartographer-post-write.sh +0 -2
- package/plugins/cartographer/scripts/hooks/cartographer-session-start.sh +0 -2
- package/plugins/cartographer/scripts/lib/cartographer-config.sh +0 -7
- package/plugins/cartographer/skills/cartographer/SKILL.md +0 -5
- package/plugins/compass/.claude-plugin/plugin.json +1 -1
- package/plugins/compass/CHANGELOG.md +7 -0
- package/plugins/compass/README.md +4 -10
- package/plugins/compass/config.json +0 -1
- package/plugins/compass/scripts/hooks/compass-bash-gate.sh +0 -4
- package/plugins/compass/scripts/hooks/compass-pre-tool-use.sh +0 -4
- package/plugins/compass/scripts/hooks/compass-record-write.sh +0 -4
- package/plugins/compass/scripts/hooks/compass-session-start.sh +1 -6
- package/plugins/compass/scripts/lib/compass-config.sh +0 -7
- package/plugins/counsel/.claude-plugin/plugin.json +1 -1
- package/plugins/counsel/CHANGELOG.md +7 -0
- package/plugins/counsel/README.md +6 -10
- package/plugins/counsel/config.json +0 -1
- package/plugins/counsel/scripts/hooks/counsel-session-start.sh +1 -7
- package/plugins/counsel/scripts/lib/counsel-config.sh +0 -6
- package/plugins/counsel/skills/counsel/SKILL.md +0 -5
- package/plugins/curator/.claude-plugin/plugin.json +1 -1
- package/plugins/curator/CHANGELOG.md +7 -0
- package/plugins/curator/README.md +1 -11
- package/plugins/curator/config.json +0 -1
- package/plugins/curator/scripts/hooks/curator-session-start.sh +0 -6
- package/plugins/curator/scripts/lib/curator-config.sh +0 -7
- package/plugins/echo/.claude-plugin/plugin.json +1 -1
- package/plugins/echo/CHANGELOG.md +7 -0
- package/plugins/echo/README.md +3 -9
- package/plugins/echo/config.json +0 -1
- package/plugins/echo/scripts/hooks/echo-stop-gate.sh +1 -3
- package/plugins/echo/scripts/lib/echo-config.sh +0 -6
- package/plugins/governor/.claude-plugin/plugin.json +1 -1
- package/plugins/governor/CHANGELOG.md +7 -0
- package/plugins/governor/README.md +4 -10
- package/plugins/governor/config.json +0 -1
- package/plugins/governor/scripts/hooks/governor-post-tool-use.sh +0 -5
- package/plugins/governor/scripts/hooks/governor-pre-tool-use.sh +0 -5
- package/plugins/governor/scripts/hooks/governor-session-start.sh +4 -9
- package/plugins/governor/scripts/hooks/governor-stop.sh +0 -5
- package/plugins/governor/scripts/lib/governor-config.sh +0 -7
- package/plugins/historian/.claude-plugin/plugin.json +1 -1
- package/plugins/historian/CHANGELOG.md +14 -0
- package/plugins/historian/README.md +3 -7
- package/plugins/historian/config.json +0 -1
- package/plugins/historian/scripts/hooks/historian-prompt-submit.sh +1 -6
- package/plugins/historian/scripts/hooks/historian-session-end.sh +2 -6
- package/plugins/historian/scripts/lib/historian-config.sh +0 -6
- package/plugins/historian/scripts/lib/historian-embedder.sh +10 -6
- package/plugins/inspector/.claude-plugin/plugin.json +1 -1
- package/plugins/inspector/CHANGELOG.md +7 -0
- package/plugins/inspector/README.md +9 -5
- package/plugins/inspector/config.json +0 -1
- package/plugins/inspector/scripts/hooks/inspector-post-write.sh +0 -7
- package/plugins/inspector/scripts/lib/inspector-config.sh +0 -7
- package/plugins/librarian/.claude-plugin/plugin.json +1 -1
- package/plugins/librarian/CHANGELOG.md +7 -0
- package/plugins/librarian/README.md +5 -9
- package/plugins/librarian/config.json +0 -1
- package/plugins/librarian/scripts/hooks/librarian-session-end.sh +0 -2
- package/plugins/librarian/scripts/hooks/librarian-session-start.sh +0 -6
- package/plugins/librarian/scripts/lib/librarian-config.sh +0 -8
- package/plugins/lineage/.claude-plugin/plugin.json +1 -1
- package/plugins/lineage/CHANGELOG.md +7 -1
- package/plugins/lineage/README.md +3 -12
- package/plugins/lineage/config.json +0 -1
- package/plugins/lineage/scripts/hooks/lineage-post-tool-use.sh +0 -1
- package/plugins/lineage/scripts/lib/lineage-config.sh +0 -7
- package/plugins/lineage/skills/lineage/SKILL.md +1 -4
- package/plugins/scribe/.claude-plugin/plugin.json +1 -1
- package/plugins/scribe/CHANGELOG.md +7 -0
- package/plugins/scribe/README.md +4 -12
- package/plugins/scribe/config.json +0 -1
- package/plugins/scribe/scripts/hooks/scribe-capture.sh +0 -4
- package/plugins/scribe/scripts/hooks/scribe-session-start.sh +2 -7
- package/plugins/scribe/scripts/hooks/scribe-stop.sh +0 -5
- package/plugins/scribe/scripts/lib/scribe-config.sh +1 -8
- package/plugins/scribe/scripts/lib/scribe-extract.sh +16 -12
- package/plugins/tribunal/.claude-plugin/plugin.json +1 -1
- package/plugins/tribunal/CHANGELOG.md +7 -0
- package/plugins/tribunal/README.md +7 -1
- package/plugins/tribunal/config.json +0 -1
- package/plugins/tribunal/scripts/hooks/tribunal-stop-gate.sh +3 -14
- package/plugins/tribunal/scripts/lib/tribunal-config.sh +0 -8
- package/plugins/warden/.claude-plugin/plugin.json +1 -1
- package/plugins/warden/CHANGELOG.md +7 -0
- package/plugins/warden/README.md +3 -12
- package/plugins/warden/config.json +0 -1
- package/plugins/warden/scripts/hooks/warden-post-tool-use.sh +0 -4
- package/plugins/warden/scripts/hooks/warden-pre-tool-use.sh +0 -4
- package/plugins/warden/scripts/hooks/warden-session-start.sh +1 -6
- package/plugins/warden/scripts/lib/warden-config.sh +1 -8
- package/renovate.json +34 -0
- package/test/bats/archivist-config-files.bats +2 -2
- package/test/bats/archivist-config.bats +0 -25
- package/test/bats/archivist-inject.bats +1 -13
- package/test/bats/assayer-config.bats +0 -13
- package/test/bats/assayer-stop-hook.bats +3 -17
- package/test/bats/bursar-config.bats +0 -25
- package/test/bats/bursar-session-end.bats +0 -20
- package/test/bats/bursar-session-start.bats +1 -18
- package/test/bats/cartographer-config.bats +0 -25
- package/test/bats/compass-config.bats +1 -26
- package/test/bats/compass-gate.bats +1 -3
- package/test/bats/curator-session-start.bats +2 -12
- package/test/bats/echo-config.bats +0 -24
- package/test/bats/echo-stop-hook.bats +3 -15
- package/test/bats/governor-config.bats +0 -36
- package/test/bats/historian-prompt-submit.bats +2 -8
- package/test/bats/historian-session-end.bats +4 -14
- package/test/bats/inspector-config.bats +0 -13
- package/test/bats/inspector-post-write-hook.bats +10 -17
- package/test/bats/librarian-session-end.bats +0 -11
- package/test/bats/librarian-session-start.bats +1 -11
- package/test/bats/lineage-config.bats +0 -25
- package/test/bats/lineage-post-tool-use.bats +1 -7
- package/test/bats/scribe-extract.bats +6 -6
- package/test/bats/tribunal-config.bats +0 -25
- package/test/bats/warden-config.bats +0 -25
- package/test/bats/warden-scanner.bats +1 -1
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
# governor_config_load <repo_root> # populates _GOVERNOR_CONFIG (JSON)
|
|
11
11
|
# governor_config_get <jq-path> # echoes string value (empty if unset)
|
|
12
12
|
# governor_config_get_json <jq-path> # echoes JSON value (null if unset)
|
|
13
|
-
# governor_config_enabled # 0 if governor.enabled is true
|
|
14
13
|
# governor_config_enforcement # echoes "soft" or "hard"
|
|
15
14
|
|
|
16
15
|
_GOVERNOR_CONFIG="{}"
|
|
@@ -66,12 +65,6 @@ governor_config_get_json() {
|
|
|
66
65
|
printf '%s' "$_GOVERNOR_CONFIG" | jq -c "${path}" 2>/dev/null
|
|
67
66
|
}
|
|
68
67
|
|
|
69
|
-
governor_config_enabled() {
|
|
70
|
-
local v
|
|
71
|
-
v=$(governor_config_get '.governor.enabled')
|
|
72
|
-
[[ "$v" == "true" ]]
|
|
73
|
-
}
|
|
74
|
-
|
|
75
68
|
governor_config_enforcement() {
|
|
76
69
|
local v
|
|
77
70
|
v=$(governor_config_get '.governor.enforcement')
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "historian",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Episodic memory layer. At SessionEnd, chunks and sanitizes the session transcript and stores chunks under $ONLOOKER_DIR/historian/<project-key>/sessions/ (default $HOME/.onlooker). On UserPromptSubmit, embeds the prompt and performs similarity retrieval over stored chunks to surface relevant past context. Builds on the Onlooker ecosystem plugin.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Onlooker Community",
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.3.0](https://github.com/onlooker-community/ecosystem/compare/historian-v0.2.1...historian-v0.3.0) (2026-07-03)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **plugins:** installation enables plugins — remove per-plugin 'enabled' config key ([#108](https://github.com/onlooker-community/ecosystem/issues/108)) ([45e4e6b](https://github.com/onlooker-community/ecosystem/commit/45e4e6bd29a0a7545dbd5007bf3f09600e1be391))
|
|
9
|
+
|
|
10
|
+
## [0.2.1](https://github.com/onlooker-community/ecosystem/compare/historian-v0.2.0...historian-v0.2.1) (2026-06-28)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Performance Improvements
|
|
14
|
+
|
|
15
|
+
* **historian:** fix O(n²) chunk loop and embedder false-positive :relieved: ([4ef130a](https://github.com/onlooker-community/ecosystem/commit/4ef130a4c01ec378da5b4d8baeeb7b4fb6059272))
|
|
16
|
+
|
|
3
17
|
## [0.2.0](https://github.com/onlooker-community/ecosystem/compare/historian-v0.1.0...historian-v0.2.0) (2026-06-04)
|
|
4
18
|
|
|
5
19
|
|
|
@@ -17,14 +17,10 @@ See [`docs/design.md`](docs/design.md) and [ADR-001](docs/adr/001-local-embeddin
|
|
|
17
17
|
|
|
18
18
|
## Activation
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
Install via the marketplace:
|
|
21
21
|
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
"historian": {
|
|
25
|
-
"enabled": true
|
|
26
|
-
}
|
|
27
|
-
}
|
|
22
|
+
```
|
|
23
|
+
/plugin install historian@onlooker-community
|
|
28
24
|
```
|
|
29
25
|
|
|
30
26
|
See [`config.json`](config.json) for the full set of tunable defaults.
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
# Hook contract:
|
|
18
18
|
# - Always exits 0. Never blocks the prompt.
|
|
19
19
|
# - Emits valid hookSpecificOutput JSON even when nothing to inject.
|
|
20
|
-
# - No-ops when
|
|
20
|
+
# - No-ops when retrieval is disabled.
|
|
21
21
|
# - Lifecycle events: historian.retrieval.started fires when the rate
|
|
22
22
|
# gate clears and we are about to embed. All outcomes flow through
|
|
23
23
|
# historian.retrieval.complete with `outcome: surfaced | empty |
|
|
@@ -81,11 +81,6 @@ PROMPT=$(printf '%s' "$INPUT" | jq -r '.prompt // .user_message // .message // "
|
|
|
81
81
|
REPO_ROOT=$(historian_project_repo_root "$CWD")
|
|
82
82
|
historian_config_load "$REPO_ROOT"
|
|
83
83
|
|
|
84
|
-
if ! historian_config_enabled; then
|
|
85
|
-
_emit_context ""
|
|
86
|
-
exit 0
|
|
87
|
-
fi
|
|
88
|
-
|
|
89
84
|
RETRIEVAL_ENABLED=$(historian_config_get '.historian.retrieval.enabled')
|
|
90
85
|
if [[ "$RETRIEVAL_ENABLED" == "false" ]]; then
|
|
91
86
|
_emit_context ""
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
#
|
|
9
9
|
# Hook contract:
|
|
10
10
|
# - Always exits 0. Never blocks session shutdown.
|
|
11
|
-
# - No-ops when historian.enabled is not true.
|
|
12
11
|
# - No-ops when there is no project key, no transcript path, or the
|
|
13
12
|
# transcript is shorter than min_transcript_chars_to_index.
|
|
14
13
|
# - Indexing failures are fail-soft: an emitted historian.indexing.complete
|
|
@@ -59,7 +58,6 @@ TRANSCRIPT_PATH=$(printf '%s' "$INPUT" | jq -r '.transcript_path // ""' 2>/dev/n
|
|
|
59
58
|
|
|
60
59
|
REPO_ROOT=$(historian_project_repo_root "$CWD")
|
|
61
60
|
historian_config_load "$REPO_ROOT"
|
|
62
|
-
historian_config_enabled || exit 0
|
|
63
61
|
|
|
64
62
|
PROJECT_KEY=$(historian_project_key "$CWD")
|
|
65
63
|
[[ -z "$PROJECT_KEY" ]] && exit 0
|
|
@@ -162,10 +160,8 @@ historian_storage_reset_session "$PROJECT_KEY" "$SESSION_ID"
|
|
|
162
160
|
|
|
163
161
|
NOW_TS=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
164
162
|
CHUNKS_INDEXED=0
|
|
165
|
-
KEPT_COUNT=$(printf '%s' "$KEPT" | jq 'length' 2>/dev/null) || KEPT_COUNT=0
|
|
166
163
|
|
|
167
|
-
|
|
168
|
-
CHUNK=$(printf '%s' "$KEPT" | jq -c ".[$i]")
|
|
164
|
+
while IFS= read -r CHUNK; do
|
|
169
165
|
[[ -z "$CHUNK" || "$CHUNK" == "null" ]] && continue
|
|
170
166
|
|
|
171
167
|
CHUNK_ID=$(historian_ulid)
|
|
@@ -203,7 +199,7 @@ for ((i = 0; i < KEPT_COUNT; i++)); do
|
|
|
203
199
|
'{ chunk_id: $chunk_id, redaction_count: $redaction_count }')"
|
|
204
200
|
fi
|
|
205
201
|
fi
|
|
206
|
-
done
|
|
202
|
+
done < <(printf '%s' "$KEPT" | jq -c '.[]' 2>/dev/null)
|
|
207
203
|
|
|
208
204
|
# Emit one chunk.dropped event per skip reason summary (caps at the
|
|
209
205
|
# number of unique reasons; per-chunk emission would spam the log).
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
# Exposes:
|
|
10
10
|
# historian_config_load <repo_root> # populates _HISTORIAN_CONFIG (JSON)
|
|
11
11
|
# historian_config_get <jq-path> # echoes string value (empty if unset)
|
|
12
|
-
# historian_config_enabled # 0 if historian.enabled is true
|
|
13
12
|
#
|
|
14
13
|
# Settings overlay only touches the `historian.*` subtree of settings.json.
|
|
15
14
|
|
|
@@ -59,8 +58,3 @@ historian_config_get() {
|
|
|
59
58
|
| jq -r "${path} | if . == null then empty else . end" 2>/dev/null
|
|
60
59
|
}
|
|
61
60
|
|
|
62
|
-
historian_config_enabled() {
|
|
63
|
-
local v
|
|
64
|
-
v=$(historian_config_get '.historian.enabled')
|
|
65
|
-
[[ "$v" == "true" ]]
|
|
66
|
-
}
|
|
@@ -43,8 +43,8 @@ _historian_embedder_ollama_timeout() {
|
|
|
43
43
|
printf '%s' "$v"
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
# Returns 0 if the currently-configured embedder is reachable
|
|
47
|
-
#
|
|
46
|
+
# Returns 0 if the currently-configured embedder is reachable AND the
|
|
47
|
+
# target model is installed. A side-effect-free probe.
|
|
48
48
|
historian_embedder_available() {
|
|
49
49
|
local backend
|
|
50
50
|
backend=$(_historian_embedder_backend)
|
|
@@ -54,12 +54,16 @@ historian_embedder_available() {
|
|
|
54
54
|
;;
|
|
55
55
|
ollama)
|
|
56
56
|
command -v curl >/dev/null 2>&1 || return 1
|
|
57
|
-
local host timeout
|
|
57
|
+
local host model timeout tags
|
|
58
58
|
host=$(_historian_embedder_ollama_host)
|
|
59
|
+
model=$(_historian_embedder_ollama_model)
|
|
59
60
|
timeout=$(_historian_embedder_ollama_timeout)
|
|
60
|
-
#
|
|
61
|
-
#
|
|
62
|
-
curl -fsS --max-time "$timeout"
|
|
61
|
+
# Fetch the model list and verify the configured model is present.
|
|
62
|
+
# An empty models list (ollama running but no models pulled) returns 1.
|
|
63
|
+
tags=$(curl -fsS --max-time "$timeout" "${host}/api/tags" 2>/dev/null) || return 1
|
|
64
|
+
printf '%s' "$tags" | jq -e --arg m "$model" \
|
|
65
|
+
'.models[]? | select(.name == $m or (.name | startswith($m + ":")))' \
|
|
66
|
+
>/dev/null 2>&1
|
|
63
67
|
;;
|
|
64
68
|
*)
|
|
65
69
|
# fastembed / remote backends not implemented yet — treat as
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "inspector",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.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",
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.3.0](https://github.com/onlooker-community/ecosystem/compare/inspector-v0.2.0...inspector-v0.3.0) (2026-07-03)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **plugins:** installation enables plugins — remove per-plugin 'enabled' config key ([#108](https://github.com/onlooker-community/ecosystem/issues/108)) ([45e4e6b](https://github.com/onlooker-community/ecosystem/commit/45e4e6bd29a0a7545dbd5007bf3f09600e1be391))
|
|
9
|
+
|
|
3
10
|
## [0.2.0](https://github.com/onlooker-community/ecosystem/compare/inspector-v0.1.0...inspector-v0.2.0) (2026-06-15)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -51,13 +51,18 @@ checks too. The agent sees this on its next turn.
|
|
|
51
51
|
|
|
52
52
|
## Activation
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
Install the plugin from the marketplace:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
/plugin install inspector@onlooker-community
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Once installed, inspector is active. Configure it per project (or globally) by
|
|
61
|
+
adding the `inspector` block to `.claude/settings.json`:
|
|
56
62
|
|
|
57
63
|
```jsonc
|
|
58
64
|
{
|
|
59
65
|
"inspector": {
|
|
60
|
-
"enabled": true,
|
|
61
66
|
"checks": {
|
|
62
67
|
".ts": [{ "name": "biome", "kind": "lint", "argv": ["biome", "check", "${file}"] },
|
|
63
68
|
{ "name": "tsc", "kind": "typecheck", "argv": ["tsc", "--noEmit"] }],
|
|
@@ -87,7 +92,6 @@ A bare argv array (`["shellcheck", "${file}"]`) is also accepted as a shorthand
|
|
|
87
92
|
|
|
88
93
|
| Field | Default | Meaning |
|
|
89
94
|
|---|---|---|
|
|
90
|
-
| `enabled` | `false` | Master switch. |
|
|
91
95
|
| `timeout_seconds_per_check` | `10` | Wall-clock cap per check. Exceeded → `inspector.check.skipped` with `reason: "timeout"`. |
|
|
92
96
|
| `total_timeout_seconds` | `30` | Wall-clock cap for the whole run. Remaining checks emit `.skipped` with `reason: "total_budget_exhausted"`. |
|
|
93
97
|
| `output_excerpt_max_bytes` | `4096` | Cap on captured output, both in the event and shown to the agent. Excess is replaced with `…[truncated]`. |
|
|
@@ -108,7 +112,7 @@ All events are registered in `@onlooker-community/schema`.
|
|
|
108
112
|
|---|---|---|
|
|
109
113
|
| `inspector.check.passed` | A check returned exit 0 | `file_path`, `tool_name`, `check_name`, `check_kind`, `argv`, `duration_ms` |
|
|
110
114
|
| `inspector.check.failed` | A check returned non-zero | `exit_code`, `issue_count` (best-effort, may be `null`), `output_excerpt`, `output_truncated` |
|
|
111
|
-
| `inspector.check.skipped` | A check or whole file was not run | `reason`: one of `
|
|
115
|
+
| `inspector.check.skipped` | A check or whole file was not run | `reason`: one of `excluded_path`, `no_extension_match`, `not_in_repo`, `tool_missing`, `timeout`, `total_budget_exhausted` |
|
|
112
116
|
| `inspector.run.completed` | Once per hook fire after all checks | `checks_run`, `checks_passed`, `checks_failed`, `checks_skipped`, `duration_ms` |
|
|
113
117
|
|
|
114
118
|
Downstream consumers that just want "did this edit produce broken code?" read
|
|
@@ -61,7 +61,6 @@ export INSPECTOR_PROJECT_KEY="$PROJECT_KEY"
|
|
|
61
61
|
if [[ "$CANONICAL" != "$REPO_ROOT"/* && "$CANONICAL" != "$REPO_ROOT" ]]; then
|
|
62
62
|
export INSPECTOR_FILE_RELATIVE="$CANONICAL"
|
|
63
63
|
inspector_config_load "$REPO_ROOT"
|
|
64
|
-
inspector_config_enabled || exit 0
|
|
65
64
|
inspector_emit_whole_file_skipped "not_in_repo"
|
|
66
65
|
exit 0
|
|
67
66
|
fi
|
|
@@ -69,12 +68,6 @@ export INSPECTOR_FILE_RELATIVE="${CANONICAL#"$REPO_ROOT"/}"
|
|
|
69
68
|
|
|
70
69
|
inspector_config_load "$REPO_ROOT"
|
|
71
70
|
|
|
72
|
-
if ! inspector_config_enabled; then
|
|
73
|
-
# Silent skip — do not even emit an event when disabled. Disabled means
|
|
74
|
-
# "this plugin is dormant," not "this file was uninteresting."
|
|
75
|
-
exit 0
|
|
76
|
-
fi
|
|
77
|
-
|
|
78
71
|
# Excluded path containment check.
|
|
79
72
|
EXCLUDES=$(inspector_config_exclude_paths)
|
|
80
73
|
if [[ -n "$EXCLUDES" && "$EXCLUDES" != "null" && "$EXCLUDES" != "[]" ]]; then
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
#
|
|
9
9
|
# Usage:
|
|
10
10
|
# inspector_config_load <repo_root>
|
|
11
|
-
# inspector_config_enabled
|
|
12
11
|
# inspector_config_get ".inspector.timeout_seconds_per_check"
|
|
13
12
|
# inspector_config_get_json ".inspector.exclude_paths"
|
|
14
13
|
# inspector_config_checks_for_extension ".ts"
|
|
@@ -54,12 +53,6 @@ inspector_config_get_json() {
|
|
|
54
53
|
printf '%s' "$_INSPECTOR_CONFIG" | jq -c "$path // empty" 2>/dev/null
|
|
55
54
|
}
|
|
56
55
|
|
|
57
|
-
inspector_config_enabled() {
|
|
58
|
-
local v
|
|
59
|
-
v=$(inspector_config_get '.inspector.enabled')
|
|
60
|
-
[[ "$v" == "true" ]]
|
|
61
|
-
}
|
|
62
|
-
|
|
63
56
|
inspector_config_show_clean_runs() {
|
|
64
57
|
local v
|
|
65
58
|
v=$(inspector_config_get '.inspector.show_clean_runs')
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "librarian",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Consolidation layer between archivist's per-session artifacts and the user's durable typed memory store. Detects which session decisions, dead-ends, and open questions deserve to live across sessions, classifies them into the user/feedback/project/reference types, and queues them as proposals for explicit confirmation. Auto-promotion is opt-in. 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.4.0](https://github.com/onlooker-community/ecosystem/compare/librarian-v0.3.0...librarian-v0.4.0) (2026-07-03)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **plugins:** installation enables plugins — remove per-plugin 'enabled' config key ([#108](https://github.com/onlooker-community/ecosystem/issues/108)) ([45e4e6b](https://github.com/onlooker-community/ecosystem/commit/45e4e6bd29a0a7545dbd5007bf3f09600e1be391))
|
|
9
|
+
|
|
3
10
|
## [0.3.0](https://github.com/onlooker-community/ecosystem/compare/librarian-v0.2.0...librarian-v0.3.0) (2026-06-24)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -15,17 +15,13 @@ Librarian is a sibling plugin to [`ecosystem`](../../) and assumes the Onlooker
|
|
|
15
15
|
|
|
16
16
|
## Activation
|
|
17
17
|
|
|
18
|
-
Librarian
|
|
19
|
-
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
"librarian": {
|
|
23
|
-
"enabled": true
|
|
24
|
-
}
|
|
25
|
-
}
|
|
18
|
+
Install Librarian from the marketplace:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
/plugin install librarian@onlooker-community
|
|
26
22
|
```
|
|
27
23
|
|
|
28
|
-
|
|
24
|
+
Installing the plugin enables it. See [`config.json`](config.json) for the full set of tunable defaults.
|
|
29
25
|
|
|
30
26
|
## Storage layout
|
|
31
27
|
|
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
#
|
|
8
8
|
# Hook contract:
|
|
9
9
|
# - Always exits 0. Never blocks session shutdown.
|
|
10
|
-
# - No-ops when librarian.enabled is not true.
|
|
11
10
|
# - No-ops when no project key (no git context) or no archivist artifacts.
|
|
12
11
|
# - Classifier failures degrade gracefully: the affected candidate is
|
|
13
12
|
# dropped, the rest of the scan proceeds.
|
|
@@ -56,7 +55,6 @@ SESSION_ID=$(printf '%s' "$INPUT" | jq -r '.session_id // ""' 2>/dev/null) || SE
|
|
|
56
55
|
[[ -z "$SESSION_ID" ]] && SESSION_ID="unknown"
|
|
57
56
|
|
|
58
57
|
librarian_config_load "$(librarian_project_repo_root "$CWD")"
|
|
59
|
-
librarian_config_enabled || exit 0
|
|
60
58
|
|
|
61
59
|
PROJECT_KEY=$(librarian_project_key "$CWD")
|
|
62
60
|
[[ -z "$PROJECT_KEY" ]] && exit 0
|
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
# Hook contract:
|
|
12
12
|
# - Always exits 0. Never blocks session start.
|
|
13
13
|
# - Emits valid hookSpecificOutput JSON, even when nothing to say.
|
|
14
|
-
# - No-ops when librarian.enabled is not true.
|
|
15
14
|
# - No-ops when there is no project key (no git context).
|
|
16
15
|
|
|
17
16
|
set -uo pipefail
|
|
@@ -59,11 +58,6 @@ CWD=$(printf '%s' "$INPUT" | jq -r '.cwd // ""' 2>/dev/null) || CWD=""
|
|
|
59
58
|
REPO_ROOT=$(librarian_project_repo_root "$CWD")
|
|
60
59
|
librarian_config_load "$REPO_ROOT"
|
|
61
60
|
|
|
62
|
-
if ! librarian_config_enabled; then
|
|
63
|
-
_emit ""
|
|
64
|
-
exit 0
|
|
65
|
-
fi
|
|
66
|
-
|
|
67
61
|
PROJECT_KEY=$(librarian_project_key "$CWD")
|
|
68
62
|
if [[ -z "$PROJECT_KEY" ]]; then
|
|
69
63
|
_emit ""
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
# Exposes:
|
|
10
10
|
# librarian_config_load <repo_root> # populates _LIBRARIAN_CONFIG (JSON)
|
|
11
11
|
# librarian_config_get <jq-path> # echoes string value (empty if unset)
|
|
12
|
-
# librarian_config_enabled # 0 if librarian.enabled is true
|
|
13
12
|
# librarian_config_auto_promote # 0 if librarian.auto_promote is true
|
|
14
13
|
#
|
|
15
14
|
# Settings overlay only touches the `librarian.*` subtree of settings.json so
|
|
@@ -59,13 +58,6 @@ librarian_config_get() {
|
|
|
59
58
|
printf '%s' "$_LIBRARIAN_CONFIG" | jq -r "${path} // empty" 2>/dev/null
|
|
60
59
|
}
|
|
61
60
|
|
|
62
|
-
# Returns 0 if librarian.enabled is true, 1 otherwise.
|
|
63
|
-
librarian_config_enabled() {
|
|
64
|
-
local v
|
|
65
|
-
v=$(librarian_config_get '.librarian.enabled')
|
|
66
|
-
[[ "$v" == "true" ]]
|
|
67
|
-
}
|
|
68
|
-
|
|
69
61
|
# Returns 0 if librarian.auto_promote is true, 1 otherwise.
|
|
70
62
|
librarian_config_auto_promote() {
|
|
71
63
|
local v
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lineage",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Per-change provenance for the Onlooker ecosystem. Records session/turn metadata plus a secret-redacted, size-capped snippet for every Edit/Write/MultiEdit at PostToolUse, then answers \"why does this line exist?\" via /lineage by joining change records to historian-preserved transcripts. Emits lineage.* events for audit. Builds on the Onlooker ecosystem plugin.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Onlooker Community",
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.2.0](https://github.com/onlooker-community/ecosystem/compare/lineage-v0.1.0...lineage-v0.2.0) (2026-07-03)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **plugins:** installation enables plugins — remove per-plugin 'enabled' config key ([#108](https://github.com/onlooker-community/ecosystem/issues/108)) ([45e4e6b](https://github.com/onlooker-community/ecosystem/commit/45e4e6bd29a0a7545dbd5007bf3f09600e1be391))
|
|
9
|
+
|
|
3
10
|
## [0.1.0](https://github.com/onlooker-community/ecosystem/compare/lineage-v0.0.1...lineage-v0.1.0) (2026-06-12)
|
|
4
11
|
|
|
5
12
|
|
|
6
13
|
### Features
|
|
7
14
|
|
|
8
15
|
* **lineage:** introduce per-change provenance plugin ([#83](https://github.com/onlooker-community/ecosystem/issues/83)) ([86b00d3](https://github.com/onlooker-community/ecosystem/commit/86b00d3d7393e2b63c5b04d60692fc89f202bf6c))
|
|
9
|
-
|
|
@@ -49,18 +49,11 @@ the substrate's turn counter.
|
|
|
49
49
|
|
|
50
50
|
## Activation
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
Install the plugin in Claude from the marketplace with:
|
|
53
53
|
|
|
54
|
-
```json
|
|
55
|
-
{
|
|
56
|
-
"lineage": {
|
|
57
|
-
"enabled": true
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
54
|
```
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
and no ledger is written.
|
|
55
|
+
/plugin install lineage@onlooker-community
|
|
56
|
+
```
|
|
64
57
|
|
|
65
58
|
## Configuration
|
|
66
59
|
|
|
@@ -69,7 +62,6 @@ All keys are optional. Unset keys fall back to the plugin's `config.json` defaul
|
|
|
69
62
|
```json
|
|
70
63
|
{
|
|
71
64
|
"lineage": {
|
|
72
|
-
"enabled": false,
|
|
73
65
|
"max_snippet_chars": 4000,
|
|
74
66
|
"redact_secrets": true,
|
|
75
67
|
"ignore_globs": ["**/.git/**", "**/node_modules/**", "**/dist/**", "**/*.lock"],
|
|
@@ -80,7 +72,6 @@ All keys are optional. Unset keys fall back to the plugin's `config.json` defaul
|
|
|
80
72
|
|
|
81
73
|
| Key | Default | Description |
|
|
82
74
|
|-----|---------|-------------|
|
|
83
|
-
| `enabled` | `false` | Must be `true` for recording, querying, or event emission to run. |
|
|
84
75
|
| `max_snippet_chars` | `4000` | Cap on the added-content snippet stored per change. |
|
|
85
76
|
| `redact_secrets` | `true` | Scrub secret-shaped substrings (AWS/GitHub/Anthropic/OpenAI keys, bearer tokens, KEY=value secrets) before storing a snippet. |
|
|
86
77
|
| `ignore_globs` | `[".git", "node_modules", "dist", "*.lock"]` | Paths matching these are not recorded. Supports `**/<dir>/**` (path segment) and `**/*.<ext>` (suffix) shapes. |
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
# lineage_config_load <repo_root> # populates _LINEAGE_CONFIG (JSON)
|
|
11
11
|
# lineage_config_get <jq-path> # echoes string value (empty if unset)
|
|
12
12
|
# lineage_config_get_json <jq-path> # echoes JSON value (null if unset)
|
|
13
|
-
# lineage_config_enabled # 0 if lineage.enabled is true
|
|
14
13
|
# lineage_config_max_snippet_chars # echoes the snippet cap (default 4000)
|
|
15
14
|
# lineage_config_redact_enabled # 0 unless redact_secrets is false
|
|
16
15
|
# lineage_config_prompt_source # echoes the prompt-source strategy
|
|
@@ -69,12 +68,6 @@ lineage_config_get_json() {
|
|
|
69
68
|
printf '%s' "$_LINEAGE_CONFIG" | jq -c "${path}" 2>/dev/null
|
|
70
69
|
}
|
|
71
70
|
|
|
72
|
-
lineage_config_enabled() {
|
|
73
|
-
local v
|
|
74
|
-
v=$(lineage_config_get '.lineage.enabled')
|
|
75
|
-
[[ "$v" == "true" ]]
|
|
76
|
-
}
|
|
77
|
-
|
|
78
71
|
lineage_config_max_snippet_chars() {
|
|
79
72
|
local v
|
|
80
73
|
v=$(lineage_config_get '.lineage.max_snippet_chars')
|
|
@@ -29,10 +29,7 @@ source "$PLUGIN_ROOT/scripts/lib/lineage-query.sh"
|
|
|
29
29
|
|
|
30
30
|
REPO_ROOT=$(lineage_project_repo_root "$(pwd)")
|
|
31
31
|
lineage_config_load "$REPO_ROOT"
|
|
32
|
-
|
|
33
|
-
echo "Lineage is disabled. Set lineage.enabled=true in .claude/settings.json to enable."
|
|
34
|
-
exit 0
|
|
35
|
-
fi
|
|
32
|
+
|
|
36
33
|
PROJECT_KEY=$(lineage_project_key "$(pwd)")
|
|
37
34
|
if [[ -z "$PROJECT_KEY" ]]; then
|
|
38
35
|
echo "No project key — lineage needs a git repository (remote or root) to scope its ledger."
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "scribe",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Intent documentation from agent activity. Captures why changes were made — problem context, decisions, tradeoffs — and distills them into readable artifacts at session end.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Onlooker Community",
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.4.0](https://github.com/onlooker-community/ecosystem/compare/scribe-v0.3.0...scribe-v0.4.0) (2026-07-03)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **plugins:** installation enables plugins — remove per-plugin 'enabled' config key ([#108](https://github.com/onlooker-community/ecosystem/issues/108)) ([45e4e6b](https://github.com/onlooker-community/ecosystem/commit/45e4e6bd29a0a7545dbd5007bf3f09600e1be391))
|
|
9
|
+
|
|
3
10
|
## [0.3.0](https://github.com/onlooker-community/ecosystem/compare/scribe-v0.2.1...scribe-v0.3.0) (2026-06-24)
|
|
4
11
|
|
|
5
12
|
|
package/plugins/scribe/README.md
CHANGED
|
@@ -14,21 +14,15 @@ Scribe is a sibling plugin to [`ecosystem`](../../) and assumes the Onlooker obs
|
|
|
14
14
|
| `UserPromptSubmit` | On the first turn of a session (when `captured_prompt` is still null), stores the prompt text — truncated to `capture.prompt_max_chars` — as the problem-statement seed. Subsequent turns are ignored, since the full transcript is available at Stop time. |
|
|
15
15
|
| `Stop` | Reads the full session transcript, runs a single Haiku extraction pass via `claude -p` to identify the problem, decisions, tradeoffs, constraints, and out-of-scope items, formats the result as a Markdown intent document, and writes it under `~/.onlooker/scribe/<project-key>/`. Emits `scribe.distill.complete`. |
|
|
16
16
|
|
|
17
|
-
The Stop hook silently skips when the session has fewer than `capture.min_turns` user turns
|
|
17
|
+
The Stop hook silently skips when the session has fewer than `capture.min_turns` user turns or when no readable `transcript_path` is present in the hook input. Every hook always exits 0 — Scribe never blocks a session.
|
|
18
18
|
|
|
19
19
|
## Activation
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Install the plugin in Claude from the marketplace with:
|
|
22
22
|
|
|
23
|
-
```json
|
|
24
|
-
{
|
|
25
|
-
"scribe": {
|
|
26
|
-
"enabled": false
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
23
|
```
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
/plugin install scribe@onlooker-community
|
|
25
|
+
```
|
|
32
26
|
|
|
33
27
|
## Configuration
|
|
34
28
|
|
|
@@ -37,7 +31,6 @@ All keys are optional. Unset keys fall back to the plugin's `config.json` defaul
|
|
|
37
31
|
```json
|
|
38
32
|
{
|
|
39
33
|
"scribe": {
|
|
40
|
-
"enabled": true,
|
|
41
34
|
"evaluator": {
|
|
42
35
|
"model": "claude-haiku-4-5-20251001",
|
|
43
36
|
"timeout": 60,
|
|
@@ -59,7 +52,6 @@ All keys are optional. Unset keys fall back to the plugin's `config.json` defaul
|
|
|
59
52
|
|
|
60
53
|
| Key | Default | Description |
|
|
61
54
|
|-----|---------|-------------|
|
|
62
|
-
| `enabled` | `true` | Must be `true` for any capture or distillation to run. |
|
|
63
55
|
| `evaluator.model` | `claude-haiku-4-5-20251001` | Model used for the intent-extraction pass. Haiku is fast and cheap; the extraction prompt is structured and does not require deep reasoning. |
|
|
64
56
|
| `evaluator.timeout` | `60` | Wall-clock timeout in seconds passed to the `timeout` command around the `claude -p` call. |
|
|
65
57
|
| `evaluator.max_tokens` | `2048` | Token ceiling for the extraction response. |
|