@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 CHANGED
@@ -63,7 +63,7 @@ your browser.
63
63
 
64
64
  ## Current release
65
65
 
66
- <!-- version-start -->1.9.2<!-- version-end -->
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
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const version = "1.9.2";
3
+ const version = "1.9.3";
4
4
  exports.version = version;
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const version: "1.9.2";
1
+ export declare const version: "1.9.3";
2
2
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- const version = "1.9.2";
1
+ const version = "1.9.3";
2
2
  export {
3
3
  version
4
4
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": "v1.5.2",
3
- "marker_tag": "release-2026-09-24-4dc71e87",
4
- "release_date": "2026-09-24T21:29:57Z",
5
- "release_sha": "4dc71e87",
6
- "release_tag": "release-2026-09-24-4dc71e87"
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-24T21:01:31Z",
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:7d029e13d72fa66157105b18684920d12e0b3c4f9d4866c0baa1c3b8227b745c",
1306
+ "content_hash": "sha256:7ac3148028a5f2fd1ca35b84812c664d2ff10b475026f278c78c490f6b12fa21",
1307
1307
  "description": "description: Dynamic-derive hook connect — closes bassclef-upstream#625."
1308
1308
  },
1309
1309
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thebassclef/lite",
3
- "version": "1.9.2",
3
+ "version": "1.9.3",
4
4
  "description": "Bassclef CLI — install and upgrade bassclef in your project with two commands.",
5
5
  "keywords": [
6
6
  "bassclef",