@thebassclef/lite 1.0.1 → 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.
- package/dist/cli.cjs +24 -1
- package/dist/cli.js +24 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.claude/hooks/bassclef-sync.sh +98 -16
- package/dist/lite/.claude/hooks/longrun-prep-compounding-sequence-check.sh +3 -3
- package/dist/lite/.claude/hooks/session-reflection.d/00-bassclef-hook-connect.sh +63 -0
- package/dist/lite/.claude/hooks/session-reflection.d/05-active-bet.sh +113 -0
- package/dist/lite/.claude/hooks/session-reflection.d/08-settings-drift.sh +62 -0
- package/dist/lite/.claude/hooks/session-reflection.d/10-abrupt-stop-recovery.sh +78 -0
- package/dist/lite/.claude/hooks/session-reflection.d/12-session-lock.sh +63 -0
- package/dist/lite/.claude/hooks/session-reflection.d/15-substrate-config-validate.sh +91 -0
- package/dist/lite/.claude/hooks/session-reflection.d/20-artifact-staleness.sh +98 -0
- package/dist/lite/.claude/hooks/session-reflection.d/30-metrics-staleness.sh +61 -0
- package/dist/lite/.claude/hooks/session-reflection.d/35-post-merge-whereami-self-heal.sh +180 -0
- package/dist/lite/.claude/hooks/session-reflection.d/36-whereami-size-check.sh +117 -0
- package/dist/lite/.claude/hooks/session-reflection.d/40-gate-compliance.sh +108 -0
- package/dist/lite/.claude/hooks/session-reflection.d/45-auto-sync-status.sh +99 -0
- package/dist/lite/.claude/hooks/session-reflection.d/50-evolution-issues.sh +44 -0
- package/dist/lite/.claude/hooks/session-reflection.d/55-orientation-gate.sh +187 -0
- package/dist/lite/.claude/hooks/session-reflection.d/56-roadmap-reconcile-gate.sh +88 -0
- package/dist/lite/.claude/hooks/session-reflection.d/60-deferred-actions.sh +212 -0
- package/dist/lite/.claude/hooks/session-reflection.d/70-recent-strategic-artifacts.sh +101 -0
- package/dist/lite/.claude/hooks/session-reflection.d/75-prior-r8-findings.sh +100 -0
- package/dist/lite/.claude/hooks/session-reflection.d/80-hook-heartbeat-check.sh +87 -0
- package/dist/lite/.claude/hooks/session-reflection.d/80-workflow-staleness.sh +141 -0
- package/dist/lite/.claude/hooks/session-reflection.d/81-hook-manifest-staleness.sh +67 -0
- package/dist/lite/.claude/hooks/session-reflection.d/90-release-backlog.sh +140 -0
- package/dist/lite/.claude/hooks/session-reflection.d/90-secrets-expiry.sh +104 -0
- package/dist/lite/.claude/hooks/session-reflection.d/95-settings-hook-verify.sh +131 -0
- package/dist/lite/.claude/hooks/session-reflection.d/95-telemetry-emit.sh +66 -0
- package/dist/lite/.claude/hooks/session-reflection.d/97-install-class-dispatch.sh +57 -0
- package/dist/lite/.claude/hooks/session-reflection.d/tests/00-bassclef-hook-connect.test.sh +492 -0
- package/dist/lite/.claude/hooks/session-reflection.d/tests/05-active-bet.test.sh +336 -0
- package/dist/lite/.claude/hooks/session-reflection.d/tests/12-session-lock.test.sh +216 -0
- package/dist/lite/.claude/hooks/session-reflection.d/tests/15-substrate-config-validate.test.sh +50 -0
- package/dist/lite/.claude/hooks/session-reflection.d/tests/20-artifact-staleness.test.sh +348 -0
- package/dist/lite/.claude/hooks/session-reflection.d/tests/36-whereami-size-check.test.sh +189 -0
- package/dist/lite/.claude/hooks/session-reflection.d/tests/45-auto-sync-status.test.sh +263 -0
- package/dist/lite/.claude/hooks/session-reflection.d/tests/55-orientation-gate.test.sh +595 -0
- package/dist/lite/.claude/hooks/session-reflection.d/tests/56-roadmap-reconcile-gate.test.sh +227 -0
- package/dist/lite/.claude/hooks/session-reflection.d/tests/75-prior-r8-findings.test.sh +142 -0
- package/dist/lite/.claude/hooks/session-reflection.d/tests/90-release-backlog.test.sh +44 -0
- package/dist/lite/.claude/hooks/trace-helper.sh +22 -0
- 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
|