@thebassclef/lite 1.0.2 → 1.0.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.
Files changed (44) hide show
  1. package/dist/cli.cjs +24 -1
  2. package/dist/cli.js +24 -1
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/lite/.claude/hooks/session-reflection.d/00-bassclef-hook-connect.sh +63 -0
  7. package/dist/lite/.claude/hooks/session-reflection.d/05-active-bet.sh +113 -0
  8. package/dist/lite/.claude/hooks/session-reflection.d/08-settings-drift.sh +62 -0
  9. package/dist/lite/.claude/hooks/session-reflection.d/10-abrupt-stop-recovery.sh +78 -0
  10. package/dist/lite/.claude/hooks/session-reflection.d/12-session-lock.sh +63 -0
  11. package/dist/lite/.claude/hooks/session-reflection.d/15-substrate-config-validate.sh +91 -0
  12. package/dist/lite/.claude/hooks/session-reflection.d/20-artifact-staleness.sh +98 -0
  13. package/dist/lite/.claude/hooks/session-reflection.d/30-metrics-staleness.sh +61 -0
  14. package/dist/lite/.claude/hooks/session-reflection.d/35-post-merge-whereami-self-heal.sh +180 -0
  15. package/dist/lite/.claude/hooks/session-reflection.d/36-whereami-size-check.sh +117 -0
  16. package/dist/lite/.claude/hooks/session-reflection.d/40-gate-compliance.sh +108 -0
  17. package/dist/lite/.claude/hooks/session-reflection.d/45-auto-sync-status.sh +99 -0
  18. package/dist/lite/.claude/hooks/session-reflection.d/50-evolution-issues.sh +44 -0
  19. package/dist/lite/.claude/hooks/session-reflection.d/55-orientation-gate.sh +187 -0
  20. package/dist/lite/.claude/hooks/session-reflection.d/56-roadmap-reconcile-gate.sh +88 -0
  21. package/dist/lite/.claude/hooks/session-reflection.d/60-deferred-actions.sh +212 -0
  22. package/dist/lite/.claude/hooks/session-reflection.d/70-recent-strategic-artifacts.sh +101 -0
  23. package/dist/lite/.claude/hooks/session-reflection.d/75-prior-r8-findings.sh +100 -0
  24. package/dist/lite/.claude/hooks/session-reflection.d/80-hook-heartbeat-check.sh +87 -0
  25. package/dist/lite/.claude/hooks/session-reflection.d/80-workflow-staleness.sh +141 -0
  26. package/dist/lite/.claude/hooks/session-reflection.d/81-hook-manifest-staleness.sh +67 -0
  27. package/dist/lite/.claude/hooks/session-reflection.d/90-release-backlog.sh +140 -0
  28. package/dist/lite/.claude/hooks/session-reflection.d/90-secrets-expiry.sh +104 -0
  29. package/dist/lite/.claude/hooks/session-reflection.d/95-settings-hook-verify.sh +131 -0
  30. package/dist/lite/.claude/hooks/session-reflection.d/95-telemetry-emit.sh +66 -0
  31. package/dist/lite/.claude/hooks/session-reflection.d/97-install-class-dispatch.sh +57 -0
  32. package/dist/lite/.claude/hooks/session-reflection.d/tests/00-bassclef-hook-connect.test.sh +492 -0
  33. package/dist/lite/.claude/hooks/session-reflection.d/tests/05-active-bet.test.sh +336 -0
  34. package/dist/lite/.claude/hooks/session-reflection.d/tests/12-session-lock.test.sh +216 -0
  35. package/dist/lite/.claude/hooks/session-reflection.d/tests/15-substrate-config-validate.test.sh +50 -0
  36. package/dist/lite/.claude/hooks/session-reflection.d/tests/20-artifact-staleness.test.sh +348 -0
  37. package/dist/lite/.claude/hooks/session-reflection.d/tests/36-whereami-size-check.test.sh +189 -0
  38. package/dist/lite/.claude/hooks/session-reflection.d/tests/45-auto-sync-status.test.sh +263 -0
  39. package/dist/lite/.claude/hooks/session-reflection.d/tests/55-orientation-gate.test.sh +595 -0
  40. package/dist/lite/.claude/hooks/session-reflection.d/tests/56-roadmap-reconcile-gate.test.sh +227 -0
  41. package/dist/lite/.claude/hooks/session-reflection.d/tests/75-prior-r8-findings.test.sh +142 -0
  42. package/dist/lite/.claude/hooks/session-reflection.d/tests/90-release-backlog.test.sh +44 -0
  43. package/dist/lite/.claude/hooks/trace-helper.sh +22 -0
  44. package/package.json +1 -1
@@ -0,0 +1,263 @@
1
+ #!/usr/bin/env bash
2
+ # tier: standard
3
+ # Tests for .claude/hooks/session-reflection.d/45-auto-sync-status.sh
4
+ #
5
+ # V3 of bassclef bet 2026-06-15b — refactored from earned-banner Layer 2
6
+ # to always-on version-status line per operator decision (always-on subsumes
7
+ # earned-banner).
8
+ #
9
+ # New behavior:
10
+ # - Silent when no .bassclef-source.json (bassclef's own repo)
11
+ # - Always emits version-status line when .bassclef-source.json + V1 fields exist
12
+ # - Critical-fix entries from adopter-notable-releases.json surface as
13
+ # additional warning lines BYPASSING age threshold
14
+ #
15
+ # Run: bash .claude/hooks/session-reflection.d/tests/45-auto-sync-status.test.sh
16
+
17
+ set -u
18
+
19
+ REPO_ROOT="$(cd "$(dirname "$0")/../../../.." && pwd)"
20
+ HOOK="${REPO_ROOT}/.claude/hooks/session-reflection.d/45-auto-sync-status.sh"
21
+ PASS=0
22
+ FAIL=0
23
+ FAILED_TESTS=()
24
+
25
+ assert() {
26
+ local name="$1"
27
+ local result="$2"
28
+ if [ "$result" = "ok" ]; then
29
+ PASS=$((PASS + 1))
30
+ echo " PASS $name"
31
+ else
32
+ FAIL=$((FAIL + 1))
33
+ FAILED_TESTS+=("$name")
34
+ echo " FAIL $name — $result"
35
+ fi
36
+ }
37
+
38
+ setup_tmpdir() {
39
+ TMPDIR_TEST="$(mktemp -d)"
40
+ mkdir -p "$TMPDIR_TEST/state" "$TMPDIR_TEST/.claude/hooks"
41
+ }
42
+
43
+ teardown_tmpdir() {
44
+ rm -rf "$TMPDIR_TEST"
45
+ }
46
+
47
+ # Run hook with CWD=$TMPDIR_TEST + CLAUDE_PROJECT_DIR=$TMPDIR_TEST
48
+ run_hook() {
49
+ HOOK_STDOUT=$(cd "$TMPDIR_TEST" && CLAUDE_PROJECT_DIR="$TMPDIR_TEST" bash "$HOOK" 2>&1)
50
+ HOOK_EXIT=$?
51
+ }
52
+
53
+ if [ ! -x "$HOOK" ]; then
54
+ chmod +x "$HOOK"
55
+ fi
56
+
57
+ echo "Testing $HOOK"
58
+ echo "---"
59
+
60
+ # === Silent paths ===
61
+
62
+ setup_tmpdir
63
+ # No .bassclef-source.json
64
+ run_hook
65
+ [ "$HOOK_EXIT" = "0" ] && [ -z "$HOOK_STDOUT" ] && \
66
+ assert "silent when .bassclef-source.json missing" "ok" || \
67
+ assert "silent when .bassclef-source.json missing" "exit=$HOOK_EXIT output=$HOOK_STDOUT"
68
+ teardown_tmpdir
69
+
70
+ # === Always-on version-status line ===
71
+
72
+ setup_tmpdir
73
+ cat > "$TMPDIR_TEST/.bassclef-source.json" <<EOF
74
+ {
75
+ "source_url": "https://api.github.com/repos/sunj-labs/bassclef/tarball/main",
76
+ "auto_sync": false,
77
+ "installed_sha": "abc1234",
78
+ "installed_at": "2026-06-10T12:00:00Z"
79
+ }
80
+ EOF
81
+ run_hook
82
+ [ "$HOOK_EXIT" = "0" ] && echo "$HOOK_STDOUT" | grep -q "version status" && \
83
+ assert "always-on line fires with installed_sha + installed_at" "ok" || \
84
+ assert "always-on line fires with installed_sha + installed_at" "exit=$HOOK_EXIT output=$HOOK_STDOUT"
85
+ teardown_tmpdir
86
+
87
+ setup_tmpdir
88
+ cat > "$TMPDIR_TEST/.bassclef-source.json" <<EOF
89
+ {
90
+ "auto_sync": true,
91
+ "installed_sha": "abc1234",
92
+ "installed_at": "2026-06-15T12:00:00Z"
93
+ }
94
+ EOF
95
+ run_hook
96
+ [ "$HOOK_EXIT" = "0" ] && echo "$HOOK_STDOUT" | grep -q "version status" && \
97
+ assert "always-on line fires even with auto_sync ON" "ok" || \
98
+ assert "always-on line fires even with auto_sync ON" "exit=$HOOK_EXIT output=$HOOK_STDOUT"
99
+ teardown_tmpdir
100
+
101
+ # === Status line content ===
102
+
103
+ setup_tmpdir
104
+ cat > "$TMPDIR_TEST/.bassclef-source.json" <<EOF
105
+ {
106
+ "auto_sync": false,
107
+ "installed_sha": "abc1234",
108
+ "installed_at": "2026-06-10T12:00:00Z"
109
+ }
110
+ EOF
111
+ run_hook
112
+ [ "$HOOK_EXIT" = "0" ] && echo "$HOOK_STDOUT" | grep -q "abc1234" && \
113
+ assert "status line includes installed_sha" "ok" || \
114
+ assert "status line includes installed_sha" "exit=$HOOK_EXIT output=$HOOK_STDOUT"
115
+ teardown_tmpdir
116
+
117
+ setup_tmpdir
118
+ cat > "$TMPDIR_TEST/.bassclef-source.json" <<EOF
119
+ {
120
+ "auto_sync": false,
121
+ "installed_sha": "abc1234",
122
+ "installed_at": "2026-06-10T12:00:00Z"
123
+ }
124
+ EOF
125
+ run_hook
126
+ [ "$HOOK_EXIT" = "0" ] && echo "$HOOK_STDOUT" | grep -qE "[0-9]+ day" && \
127
+ assert "status line includes days-behind" "ok" || \
128
+ assert "status line includes days-behind" "exit=$HOOK_EXIT output=$HOOK_STDOUT"
129
+ teardown_tmpdir
130
+
131
+ # === Auto-sync state surfaced ===
132
+
133
+ setup_tmpdir
134
+ cat > "$TMPDIR_TEST/.bassclef-source.json" <<EOF
135
+ {
136
+ "auto_sync": false,
137
+ "installed_sha": "abc1234",
138
+ "installed_at": "2026-06-10T12:00:00Z"
139
+ }
140
+ EOF
141
+ run_hook
142
+ [ "$HOOK_EXIT" = "0" ] && echo "$HOOK_STDOUT" | grep -qiE "auto.update.*off|auto.sync.*off" && \
143
+ assert "auto_sync OFF surfaced in status" "ok" || \
144
+ assert "auto_sync OFF surfaced in status" "exit=$HOOK_EXIT output=$HOOK_STDOUT"
145
+ teardown_tmpdir
146
+
147
+ setup_tmpdir
148
+ cat > "$TMPDIR_TEST/.bassclef-source.json" <<EOF
149
+ {
150
+ "auto_sync": true,
151
+ "installed_sha": "abc1234",
152
+ "installed_at": "2026-06-15T12:00:00Z"
153
+ }
154
+ EOF
155
+ run_hook
156
+ [ "$HOOK_EXIT" = "0" ] && echo "$HOOK_STDOUT" | grep -qiE "auto.update.*on|auto.sync.*on" && \
157
+ assert "auto_sync ON surfaced in status" "ok" || \
158
+ assert "auto_sync ON surfaced in status" "exit=$HOOK_EXIT output=$HOOK_STDOUT"
159
+ teardown_tmpdir
160
+
161
+ # === Critical-fix bypass ===
162
+ # Critical-fix entries shipped after install date should fire the warning,
163
+ # regardless of age threshold (which previously gated the earned-banner).
164
+
165
+ setup_tmpdir
166
+ cat > "$TMPDIR_TEST/.bassclef-source.json" <<EOF
167
+ {
168
+ "auto_sync": false,
169
+ "installed_sha": "abc1234",
170
+ "installed_at": "2026-06-10T12:00:00Z"
171
+ }
172
+ EOF
173
+ cat > "$TMPDIR_TEST/state/adopter-notable-releases.json" <<EOF
174
+ {
175
+ "releases": [
176
+ {
177
+ "published_at": "2026-06-15T12:00:00Z",
178
+ "kind": "critical_fix",
179
+ "summary": "fix: serious bug in auto-save"
180
+ }
181
+ ]
182
+ }
183
+ EOF
184
+ run_hook
185
+ [ "$HOOK_EXIT" = "0" ] && echo "$HOOK_STDOUT" | grep -qiE "critical.fix|critical fix" && \
186
+ assert "critical-fix entry surfaces warning" "ok" || \
187
+ assert "critical-fix entry surfaces warning" "exit=$HOOK_EXIT output=$HOOK_STDOUT"
188
+ teardown_tmpdir
189
+
190
+ # Critical-fix BEFORE install date should NOT fire.
191
+ setup_tmpdir
192
+ cat > "$TMPDIR_TEST/.bassclef-source.json" <<EOF
193
+ {
194
+ "auto_sync": false,
195
+ "installed_sha": "abc1234",
196
+ "installed_at": "2026-06-15T12:00:00Z"
197
+ }
198
+ EOF
199
+ cat > "$TMPDIR_TEST/state/adopter-notable-releases.json" <<EOF
200
+ {
201
+ "releases": [
202
+ {
203
+ "published_at": "2026-06-10T12:00:00Z",
204
+ "kind": "critical_fix",
205
+ "summary": "fix: older bug"
206
+ }
207
+ ]
208
+ }
209
+ EOF
210
+ run_hook
211
+ [ "$HOOK_EXIT" = "0" ] && ! echo "$HOOK_STDOUT" | grep -qiE "critical.fix|critical fix" && \
212
+ assert "critical-fix before install does NOT fire" "ok" || \
213
+ assert "critical-fix before install does NOT fire" "exit=$HOOK_EXIT output=$HOOK_STDOUT"
214
+ teardown_tmpdir
215
+
216
+ # === Override path ===
217
+
218
+ setup_tmpdir
219
+ cat > "$TMPDIR_TEST/.bassclef-source.json" <<EOF
220
+ {
221
+ "auto_sync": false,
222
+ "installed_sha": "abc1234",
223
+ "installed_at": "2026-06-10T12:00:00Z"
224
+ }
225
+ EOF
226
+ HOOK_STDOUT=$(cd "$TMPDIR_TEST" && CLAUDE_PROJECT_DIR="$TMPDIR_TEST" SKIP_AUTO_SYNC_STATUS=1 bash "$HOOK" 2>&1)
227
+ HOOK_EXIT=$?
228
+ [ "$HOOK_EXIT" = "0" ] && [ -z "$HOOK_STDOUT" ] && \
229
+ assert "SKIP_AUTO_SYNC_STATUS=1 silences" "ok" || \
230
+ assert "SKIP_AUTO_SYNC_STATUS=1 silences" "exit=$HOOK_EXIT output=$HOOK_STDOUT"
231
+ teardown_tmpdir
232
+
233
+ # === Backward-compat: no V1 fields ===
234
+ # Adopter that hasn't yet adopted V1 (no installed_sha/installed_at) —
235
+ # hook should still be silent (not crash, not emit garbage).
236
+
237
+ setup_tmpdir
238
+ cat > "$TMPDIR_TEST/.bassclef-source.json" <<EOF
239
+ {
240
+ "auto_sync": false
241
+ }
242
+ EOF
243
+ run_hook
244
+ [ "$HOOK_EXIT" = "0" ] && \
245
+ assert "hook does not crash on missing V1 fields" "ok" || \
246
+ assert "hook does not crash on missing V1 fields" "exit=$HOOK_EXIT output=$HOOK_STDOUT"
247
+ teardown_tmpdir
248
+
249
+ # === Summary ===
250
+
251
+ echo "---"
252
+ echo "Results: $PASS passed, $FAIL failed"
253
+
254
+ if [ "$FAIL" -gt 0 ]; then
255
+ echo ""
256
+ echo "Failed tests:"
257
+ for t in "${FAILED_TESTS[@]}"; do
258
+ echo " - $t"
259
+ done
260
+ exit 1
261
+ fi
262
+
263
+ exit 0