@thebassclef/lite 1.9.2 → 1.9.3
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/README.md +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/bassclef-version.json +4 -4
- package/dist/lite/presence/install/bassclef-hook-connect.sh +124 -2
- package/dist/lite/standards/lite-manifest.json +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -63,7 +63,7 @@ your browser.
|
|
|
63
63
|
|
|
64
64
|
## Current release
|
|
65
65
|
|
|
66
|
-
<!-- version-start -->1.9.
|
|
66
|
+
<!-- version-start -->1.9.3<!-- version-end -->
|
|
67
67
|
|
|
68
68
|
See [CHANGELOG.md](CHANGELOG.md) for the full changelog. Adopter-facing
|
|
69
69
|
release notes live at [docs.bassclef.dev/docs/whats-new/releases](https://docs.bassclef.dev/docs/whats-new/releases).
|
package/dist/index.cjs
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version: "1.9.
|
|
1
|
+
export declare const version: "1.9.3";
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": "v1.5.2",
|
|
3
|
-
"marker_tag": "release-2026-09-
|
|
4
|
-
"release_date": "2026-09-
|
|
5
|
-
"release_sha": "
|
|
6
|
-
"release_tag": "release-2026-09-
|
|
3
|
+
"marker_tag": "release-2026-09-25-26328f36",
|
|
4
|
+
"release_date": "2026-09-25T17:01:41Z",
|
|
5
|
+
"release_sha": "26328f36",
|
|
6
|
+
"release_tag": "release-2026-09-25-26328f36"
|
|
7
7
|
}
|
|
@@ -31,6 +31,102 @@
|
|
|
31
31
|
# If this list changes, update sync.template.sh L777 in the same PR.
|
|
32
32
|
LANE_3_HOOKS=(vendored-dispatcher-refresh.sh session-reflection.sh session-start-recap-inject.sh)
|
|
33
33
|
|
|
34
|
+
# _bhc_resolve_adopter_tier <adopter_cwd> — private helper (per RFC Ousterhout 3a).
|
|
35
|
+
# Precedence: BASSCLEF_TIER env → .bassclef-source.json `tier` field →
|
|
36
|
+
# .claude/bassclef-configs.jsonc `adopter.tier` → empty.
|
|
37
|
+
# Prints tier value to stdout; empty on no-tier-declared.
|
|
38
|
+
_bhc_resolve_adopter_tier() {
|
|
39
|
+
local adopter_cwd="$1"
|
|
40
|
+
|
|
41
|
+
# 1. Env override (test-only + peer coordination)
|
|
42
|
+
if [ -n "${BASSCLEF_TIER:-}" ]; then
|
|
43
|
+
echo "$BASSCLEF_TIER"
|
|
44
|
+
return 0
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
# 2. .bassclef-source.json tier field
|
|
48
|
+
local source_json="$adopter_cwd/.bassclef-source.json"
|
|
49
|
+
if [ -f "$source_json" ] && command -v jq >/dev/null 2>&1; then
|
|
50
|
+
local t
|
|
51
|
+
t=$(jq -r '.tier // empty' "$source_json" 2>/dev/null)
|
|
52
|
+
if [ -n "$t" ]; then
|
|
53
|
+
echo "$t"
|
|
54
|
+
return 0
|
|
55
|
+
fi
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
# 3. .claude/bassclef-configs.jsonc adopter.tier — reuse lib/tier-check.sh
|
|
59
|
+
# precedent: strip comments + jsonc → json parse via python3.
|
|
60
|
+
local configs="$adopter_cwd/.claude/bassclef-configs.jsonc"
|
|
61
|
+
if [ -f "$configs" ] && command -v python3 >/dev/null 2>&1; then
|
|
62
|
+
local t
|
|
63
|
+
t=$(python3 - "$configs" 2>/dev/null <<'PYEOF'
|
|
64
|
+
import json, re, sys
|
|
65
|
+
try:
|
|
66
|
+
with open(sys.argv[1]) as f:
|
|
67
|
+
content = f.read()
|
|
68
|
+
content = re.sub(r'/\*.*?\*/', '', content, flags=re.DOTALL)
|
|
69
|
+
content = re.sub(r'//[^\n]*', '', content)
|
|
70
|
+
d = json.loads(content)
|
|
71
|
+
t = d.get('adopter', {}).get('tier', '') or d.get('tier', '')
|
|
72
|
+
if t:
|
|
73
|
+
print(t)
|
|
74
|
+
except Exception:
|
|
75
|
+
pass
|
|
76
|
+
PYEOF
|
|
77
|
+
)
|
|
78
|
+
if [ -n "$t" ]; then
|
|
79
|
+
echo "$t"
|
|
80
|
+
return 0
|
|
81
|
+
fi
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
# 4. No tier declared
|
|
85
|
+
return 0
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
# _bhc_tier_rank <tier> — bassclef tier ordering per ADR-052 D6.
|
|
89
|
+
# Higher rank = broader hook set. lite < standard < ultra < upstream.
|
|
90
|
+
# Prints rank integer to stdout; 0 on unknown.
|
|
91
|
+
_bhc_tier_rank() {
|
|
92
|
+
case "$1" in
|
|
93
|
+
lite) echo 1 ;;
|
|
94
|
+
standard) echo 2 ;;
|
|
95
|
+
ultra) echo 3 ;;
|
|
96
|
+
upstream) echo 4 ;;
|
|
97
|
+
*) echo 0 ;;
|
|
98
|
+
esac
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
# _bhc_load_tier_hook_basenames <bassclef_root> <tier> — private helper (per RFC Ousterhout 3a).
|
|
102
|
+
# Prints newline-delimited set of hook basenames in the tier's manifest.
|
|
103
|
+
# Two source patterns per adopter-simulator-lite Assertion 7 pattern:
|
|
104
|
+
# 1. Direct hook — `.claude/hooks/<name>.sh` → basename `<name>.sh`
|
|
105
|
+
# 2. Install template — `presence/install/<name>.template.sh` → basename `<name>.sh`
|
|
106
|
+
# Empty output when manifest missing or malformed (fail-soft per Nygard).
|
|
107
|
+
_bhc_load_tier_hook_basenames() {
|
|
108
|
+
local bassclef_root="$1"
|
|
109
|
+
local tier="$2"
|
|
110
|
+
local manifest="$bassclef_root/${tier}-manifest.json"
|
|
111
|
+
|
|
112
|
+
if [ ! -f "$manifest" ]; then
|
|
113
|
+
return 0
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
117
|
+
return 0
|
|
118
|
+
fi
|
|
119
|
+
|
|
120
|
+
if ! jq -e . "$manifest" >/dev/null 2>&1; then
|
|
121
|
+
return 0
|
|
122
|
+
fi
|
|
123
|
+
|
|
124
|
+
{
|
|
125
|
+
jq -r '.entries[]? | .path | select(test("^\\.claude/hooks/[^/]+\\.sh$"))' "$manifest" 2>/dev/null | sed -E 's#^\.claude/hooks/##'
|
|
126
|
+
jq -r '.entries[]? | .path | select(test("^presence/install/[^/]+\\.template\\.sh$"))' "$manifest" 2>/dev/null | sed -E 's#^presence/install/##; s#\.template\.sh$#.sh#'
|
|
127
|
+
} | sort -u
|
|
128
|
+
}
|
|
129
|
+
|
|
34
130
|
# bassclef_hook_connect_apply <adopter_cwd> [<bassclef_root>]
|
|
35
131
|
#
|
|
36
132
|
# Reads $bassclef_root/.claude/settings.json (or $BASSCLEF_SOURCE_ROOT if
|
|
@@ -125,12 +221,33 @@ bassclef_hook_connect_apply() {
|
|
|
125
221
|
local lane3_re
|
|
126
222
|
lane3_re=$(printf '%s\n' "${LANE_3_HOOKS[@]}" | sed 's/\.sh$//' | paste -sd'|' -)
|
|
127
223
|
|
|
224
|
+
# === Tier filter (bassclef-upstream#1946) ===
|
|
225
|
+
# Resolve adopter tier + load in-tier hook basenames. Empty tier OR empty
|
|
226
|
+
# basename set → fallback merge-all (grace preserved per ADR-031); stderr
|
|
227
|
+
# signal for observability.
|
|
228
|
+
local adopter_tier tier_basenames tier_re
|
|
229
|
+
adopter_tier=$(_bhc_resolve_adopter_tier "$adopter_cwd" 2>/dev/null || true)
|
|
230
|
+
tier_basenames=""
|
|
231
|
+
tier_re=""
|
|
232
|
+
if [ -n "$adopter_tier" ]; then
|
|
233
|
+
tier_basenames=$(_bhc_load_tier_hook_basenames "$bassclef_root" "$adopter_tier" 2>/dev/null || true)
|
|
234
|
+
if [ -z "$tier_basenames" ]; then
|
|
235
|
+
echo "[bassclef-hook-connect] tier=$adopter_tier but manifest missing/empty — merging all wires" >&2
|
|
236
|
+
else
|
|
237
|
+
# Build regex alternation from basenames (strip .sh for pattern building).
|
|
238
|
+
tier_re=$(printf '%s\n' "$tier_basenames" | sed 's/\.sh$//' | paste -sd'|' -)
|
|
239
|
+
fi
|
|
240
|
+
else
|
|
241
|
+
echo "[bassclef-hook-connect] no tier declared in .bassclef-source.json — merging all wires (grace window). Set tier: lite to filter." >&2
|
|
242
|
+
fi
|
|
243
|
+
|
|
128
244
|
# Merge every hook entry from every event type. Preserves operator-owned
|
|
129
245
|
# entries. Adds bassclef entries under matching (event, matcher) pairs
|
|
130
246
|
# without duplicating commands. Skips Lane 3 hooks at $CLAUDE_PROJECT_DIR
|
|
131
|
-
# per <consumer-repo>#1262.
|
|
247
|
+
# per <consumer-repo>#1262. Filters off-tier entries when tier_re non-empty
|
|
248
|
+
# per bassclef-upstream#1946.
|
|
132
249
|
local merged
|
|
133
|
-
merged=$(jq --slurpfile bassclef "$bassclef_settings" --arg lane3re "$lane3_re" '
|
|
250
|
+
merged=$(jq --slurpfile bassclef "$bassclef_settings" --arg lane3re "$lane3_re" --arg tierre "$tier_re" '
|
|
134
251
|
. as $adopter
|
|
135
252
|
| ($bassclef[0].hooks // {}) as $bhooks
|
|
136
253
|
| .hooks //= {}
|
|
@@ -142,6 +259,11 @@ bassclef_hook_connect_apply() {
|
|
|
142
259
|
($bentry.matcher // "") as $bmatcher |
|
|
143
260
|
($bentry.hooks // [] | map(select(
|
|
144
261
|
(.command // "") | test("\\$CLAUDE_PROJECT_DIR/\\.claude/hooks/(" + $lane3re + ")\\.sh") | not
|
|
262
|
+
)) | map(select(
|
|
263
|
+
# Tier filter: keep only entries whose command basename is in the
|
|
264
|
+
# tier manifest set. Empty tier_re means no filter (fallback).
|
|
265
|
+
($tierre == "") or
|
|
266
|
+
((.command // "") | test("\\.claude/hooks/(" + $tierre + ")\\.sh"))
|
|
145
267
|
))) as $bhookslist |
|
|
146
268
|
if ($bhookslist | length) == 0 then .
|
|
147
269
|
elif any(.hooks[$event][]; (.matcher // "") == $bmatcher) then
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"tier": "lite",
|
|
3
3
|
"manifest_version": "1.11.1",
|
|
4
|
-
"generated_at": "2026-09-
|
|
4
|
+
"generated_at": "2026-09-25T15:57:21Z",
|
|
5
5
|
"entries": [
|
|
6
6
|
{
|
|
7
7
|
"slug": "029-release-pipeline",
|
|
@@ -1303,7 +1303,7 @@
|
|
|
1303
1303
|
"type": "presence-template",
|
|
1304
1304
|
"path": "presence/install/bassclef-hook-connect.sh",
|
|
1305
1305
|
"tier": "lite",
|
|
1306
|
-
"content_hash": "sha256:
|
|
1306
|
+
"content_hash": "sha256:7ac3148028a5f2fd1ca35b84812c664d2ff10b475026f278c78c490f6b12fa21",
|
|
1307
1307
|
"description": "description: Dynamic-derive hook connect — closes bassclef-upstream#625."
|
|
1308
1308
|
},
|
|
1309
1309
|
{
|