@onlooker-community/ecosystem 0.26.0 → 0.26.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 +2 -2
- package/CHANGELOG.md +8 -0
- package/package.json +1 -1
- package/plugins/counsel/.claude-plugin/plugin.json +1 -1
- package/plugins/counsel/CHANGELOG.md +8 -0
- package/plugins/counsel/scripts/lib/counsel-reader.sh +7 -1
- package/plugins/counsel/scripts/lib/counsel-synthesize.sh +8 -1
- package/test/bats/counsel-reader.bats +28 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ecosystem",
|
|
3
|
-
"version": "0.26.
|
|
3
|
+
"version": "0.26.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.26.
|
|
2
|
+
".": "0.26.1",
|
|
3
3
|
"plugins/archivist": "0.1.0",
|
|
4
4
|
"plugins/tribunal": "1.0.1",
|
|
5
5
|
"plugins/echo": "0.2.0",
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"plugins/governor": "0.2.1",
|
|
8
8
|
"plugins/compass": "0.2.0",
|
|
9
9
|
"plugins/scribe": "0.2.1",
|
|
10
|
-
"plugins/counsel": "0.3.
|
|
10
|
+
"plugins/counsel": "0.3.1",
|
|
11
11
|
"plugins/warden": "0.2.0",
|
|
12
12
|
"plugins/librarian": "0.2.0",
|
|
13
13
|
"plugins/curator": "0.1.0",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.26.1](https://github.com/onlooker-community/ecosystem/compare/ecosystem-v0.26.0...ecosystem-v0.26.1) (2026-06-12)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **counsel:** drop unsupported --max-tokens flag from claude synthesis call :relieved: ([#79](https://github.com/onlooker-community/ecosystem/issues/79)) ([ade85ce](https://github.com/onlooker-community/ecosystem/commit/ade85cecb3243781f47e14fea4990ce31e69e8f4))
|
|
9
|
+
* **counsel:** stop pipefail from discarding all events on large logs :relieved: ([#78](https://github.com/onlooker-community/ecosystem/issues/78)) ([638347d](https://github.com/onlooker-community/ecosystem/commit/638347dec3b9df740b7a85c3e475fa2ffe5d054b))
|
|
10
|
+
|
|
3
11
|
## [0.26.0](https://github.com/onlooker-community/ecosystem/compare/ecosystem-v0.25.1...ecosystem-v0.26.0) (2026-06-11)
|
|
4
12
|
|
|
5
13
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "counsel",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Weekly synthesis and recommendations from the full observability stack. Reads all plugin event logs, produces a structured improvement brief, and injects it at session start when the last brief is stale.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Onlooker Community",
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.3.1](https://github.com/onlooker-community/ecosystem/compare/counsel-v0.3.0...counsel-v0.3.1) (2026-06-12)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **counsel:** drop unsupported --max-tokens flag from claude synthesis call :relieved: ([#79](https://github.com/onlooker-community/ecosystem/issues/79)) ([ade85ce](https://github.com/onlooker-community/ecosystem/commit/ade85cecb3243781f47e14fea4990ce31e69e8f4))
|
|
9
|
+
* **counsel:** stop pipefail from discarding all events on large logs :relieved: ([#78](https://github.com/onlooker-community/ecosystem/issues/78)) ([638347d](https://github.com/onlooker-community/ecosystem/commit/638347dec3b9df740b7a85c3e475fa2ffe5d054b))
|
|
10
|
+
|
|
3
11
|
## [0.3.0](https://github.com/onlooker-community/ecosystem/compare/counsel-v0.2.0...counsel-v0.3.0) (2026-06-11)
|
|
4
12
|
|
|
5
13
|
|
|
@@ -46,9 +46,15 @@ counsel_read_events() {
|
|
|
46
46
|
# Filter to events within the lookback window. If cutoff_ts is empty (date
|
|
47
47
|
# command unavailable) fall through and include all events.
|
|
48
48
|
local summary
|
|
49
|
+
# Run inside a subshell with pipefail disabled. head -c closes the pipe once
|
|
50
|
+
# chars_max bytes have arrived, which sends jq SIGPIPE; under the caller's
|
|
51
|
+
# `set -o pipefail` (the SessionStart hook and the /counsel skill both set it)
|
|
52
|
+
# that marks the whole pipeline failed, and the `|| summary=""` fallback would
|
|
53
|
+
# then discard *every* event on any log large enough to exceed chars_max.
|
|
54
|
+
# Disabling pipefail locally keeps the truncated output.
|
|
49
55
|
# -rc: compact output keeps each object on one line (JSONL-shaped), which
|
|
50
56
|
# downstream counsel_count_events and counsel_sources_from_events require.
|
|
51
|
-
summary=$(jq -rc --arg cutoff "$cutoff_ts" '
|
|
57
|
+
summary=$(set +o pipefail; jq -rc --arg cutoff "$cutoff_ts" '
|
|
52
58
|
select(.timestamp != null) |
|
|
53
59
|
select($cutoff == "" or .timestamp >= $cutoff) |
|
|
54
60
|
{
|
|
@@ -53,7 +53,11 @@ counsel_synthesize() {
|
|
|
53
53
|
local events_text="${1:-}"
|
|
54
54
|
local model="${2:-claude-haiku-4-5-20251001}"
|
|
55
55
|
local timeout_s="${3:-90}"
|
|
56
|
+
# shellcheck disable=SC2034 # accepted for call-site compatibility; the
|
|
57
|
+
# claude CLI print mode exposes no max-tokens/temperature flags, so neither
|
|
58
|
+
# is forwarded (see claude_args below).
|
|
56
59
|
local max_tokens="${4:-4096}"
|
|
60
|
+
# shellcheck disable=SC2034
|
|
57
61
|
local temperature="${5:-0.4}"
|
|
58
62
|
|
|
59
63
|
[[ -z "$events_text" ]] && return 1
|
|
@@ -74,7 +78,10 @@ counsel_synthesize() {
|
|
|
74
78
|
printf '</event_log>\n'
|
|
75
79
|
} > "$prompt_file"
|
|
76
80
|
|
|
77
|
-
|
|
81
|
+
# NOTE: `claude -p` does not accept --max-tokens (it errors with "unknown
|
|
82
|
+
# option") and has no temperature flag, so we pass neither. Output length is
|
|
83
|
+
# governed by the model/prompt; the synthesis prompt asks for terse JSON.
|
|
84
|
+
local claude_args=(-p --max-turns 1 --model "$model")
|
|
78
85
|
|
|
79
86
|
local response=""
|
|
80
87
|
if command -v timeout >/dev/null 2>&1; then
|
|
@@ -114,6 +114,34 @@ setup() {
|
|
|
114
114
|
[ "$output" = "3" ]
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
+
@test "read_events survives caller pipefail when output exceeds chars_max" {
|
|
118
|
+
# Regression: head -c closes the pipe once chars_max bytes arrive, sending jq
|
|
119
|
+
# SIGPIPE. Under the caller's `set -o pipefail` (as the hook and skill run),
|
|
120
|
+
# the reader must still return the truncated output, not discard everything.
|
|
121
|
+
local log="${BATS_TEST_TMPDIR}/big-events.jsonl"
|
|
122
|
+
local ts
|
|
123
|
+
ts=$(date -u '+%Y-%m-%dT%H:%M:%SZ' 2>/dev/null) || ts="2099-01-01T00:00:00Z"
|
|
124
|
+
: > "$log"
|
|
125
|
+
local i
|
|
126
|
+
for ((i = 0; i < 60; i++)); do
|
|
127
|
+
printf '%s\n' \
|
|
128
|
+
"{\"event_type\":\"tribunal.gate.blocked\",\"timestamp\":\"${ts}\",\"session_id\":\"s${i}\",\"payload\":{\"k\":\"vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv\"}}" \
|
|
129
|
+
>> "$log"
|
|
130
|
+
done
|
|
131
|
+
export ONLOOKER_EVENTS_LOG="$log"
|
|
132
|
+
|
|
133
|
+
# Tiny cap so head closes the pipe after the first event or two.
|
|
134
|
+
local out
|
|
135
|
+
set -o pipefail
|
|
136
|
+
out=$(counsel_read_events "30" "200")
|
|
137
|
+
set +o pipefail
|
|
138
|
+
|
|
139
|
+
[ -n "$out" ]
|
|
140
|
+
run counsel_count_events "$out"
|
|
141
|
+
[ "$status" -eq 0 ]
|
|
142
|
+
[ "$output" -ge 1 ]
|
|
143
|
+
}
|
|
144
|
+
|
|
117
145
|
@test "read_events output preserves source types for sources_from_events" {
|
|
118
146
|
local log="${BATS_TEST_TMPDIR}/source-events.jsonl"
|
|
119
147
|
local ts
|