@thebassclef/lite 0.1.3 → 1.0.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.
Files changed (293) hide show
  1. package/dist/cli.cjs +431 -135
  2. package/dist/cli.js +433 -137
  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/.bassclef-source.json +10 -0
  7. package/{substrate → dist/lite}/.claude/hooks/artifact-ingestion-gate.sh +0 -0
  8. package/{substrate → dist/lite}/.claude/hooks/assert-verify-steering.sh +0 -0
  9. package/{substrate → dist/lite}/.claude/hooks/bassclef-source-config-validate.sh +0 -0
  10. package/{substrate → dist/lite}/.claude/hooks/bassclef-sync.sh +0 -0
  11. package/{substrate → dist/lite}/.claude/hooks/compound-noun-scrub.sh +0 -0
  12. package/{substrate → dist/lite}/.claude/hooks/kiss-expansion-inject.sh +0 -0
  13. package/{substrate → dist/lite}/.claude/hooks/longrun-prep-compounding-sequence-check.sh +0 -0
  14. package/{substrate → dist/lite}/.claude/hooks/plain-english-steering.sh +0 -0
  15. package/{substrate → dist/lite}/.claude/hooks/post-skill-friction-check.sh +0 -0
  16. package/{substrate → dist/lite}/.claude/hooks/post-skill-telemetry.sh +0 -0
  17. package/{substrate → dist/lite}/.claude/hooks/pre-build-gate.sh +0 -0
  18. package/{substrate → dist/lite}/.claude/hooks/pre-commit-gate.sh +0 -0
  19. package/{substrate → dist/lite}/.claude/hooks/session-end.sh +0 -0
  20. package/{substrate → dist/lite}/.claude/hooks/session-reflection.sh +0 -0
  21. package/{substrate → dist/lite}/.claude/hooks/skill-body-grade-gate.sh +0 -0
  22. package/{substrate → dist/lite}/.claude/hooks/skill-body-intent-drift.sh +0 -0
  23. package/{substrate → dist/lite}/.claude/hooks/state-validate.sh +0 -0
  24. package/{substrate → dist/lite}/.claude/hooks/substrate-clarity-gate.sh +0 -0
  25. package/{substrate → dist/lite}/.claude/hooks/temperance-gate.sh +0 -0
  26. package/{substrate → dist/lite}/.claude/hooks/testing-tier-enforce.sh +0 -0
  27. package/{substrate → dist/lite}/.claude/hooks/turn-prose-grade-measure.sh +0 -0
  28. package/{substrate → dist/lite}/.claude/hooks/turn-prose-kiss-check.sh +0 -0
  29. package/{substrate → dist/lite}/.claude/hooks/vocabulary-migration-check.sh +0 -0
  30. package/{substrate → dist/lite}/.claude/hooks/whereami-utc-gate.sh +0 -0
  31. package/dist/lite/.claude/settings.json +212 -0
  32. package/dist/lite/CLAUDE.md +41 -0
  33. package/dist/lite/gitignore +58 -0
  34. package/dist/lite/standards/bassclef-wiring-manifest.json +497 -0
  35. package/dist/lite/whereami.md +24 -0
  36. package/package.json +8 -2
  37. package/substrate/.bassclef/lite-manifest.json +0 -2701
  38. package/substrate/.claude/agents/architect.md +0 -70
  39. package/substrate/.claude/agents/builder.md +0 -114
  40. package/substrate/.claude/agents/designer.md +0 -156
  41. package/substrate/.claude/agents/reviewer.md +0 -88
  42. package/substrate/.claude/hooks/longrun-prep-compounding-axis-check.sh +0 -492
  43. package/substrate/.claude/hooks/skill-step-list-check.sh +0 -171
  44. package/substrate/.claude/luminaries/alan-cooper.md +0 -170
  45. package/substrate/.claude/luminaries/alistair-cockburn.md +0 -140
  46. package/substrate/.claude/luminaries/amazon-pr-faq.md +0 -34
  47. package/substrate/.claude/luminaries/ash-maurya.md +0 -121
  48. package/substrate/.claude/luminaries/bill-buxton.md +0 -210
  49. package/substrate/.claude/luminaries/charles-sanders-peirce.md +0 -150
  50. package/substrate/.claude/luminaries/david-ogilvy.md +0 -192
  51. package/substrate/.claude/luminaries/don-norman.md +0 -173
  52. package/substrate/.claude/luminaries/edward-tufte.md +0 -179
  53. package/substrate/.claude/luminaries/eric-evans.md +0 -160
  54. package/substrate/.claude/luminaries/frederick-brooks.md +0 -50
  55. package/substrate/.claude/luminaries/gang-of-four.md +0 -157
  56. package/substrate/.claude/luminaries/glenford-myers.md +0 -230
  57. package/substrate/.claude/luminaries/hunt-thomas.md +0 -115
  58. package/substrate/.claude/luminaries/hyrum-wright.md +0 -94
  59. package/substrate/.claude/luminaries/jason-fried-dhh.md +0 -46
  60. package/substrate/.claude/luminaries/jesse-james-garrett.md +0 -154
  61. package/substrate/.claude/luminaries/john-ousterhout.md +0 -94
  62. package/substrate/.claude/luminaries/karl-popper.md +0 -132
  63. package/substrate/.claude/luminaries/kent-beck.md +0 -168
  64. package/substrate/.claude/luminaries/linus-torvalds.md +0 -218
  65. package/substrate/.claude/luminaries/martin-fowler.md +0 -164
  66. package/substrate/.claude/luminaries/michael-feathers.md +0 -125
  67. package/substrate/.claude/luminaries/michael-nygard.md +0 -118
  68. package/substrate/.claude/luminaries/robert-c-martin.md +0 -164
  69. package/substrate/.claude/luminaries/saltzer-schroeder.md +0 -194
  70. package/substrate/.claude/luminaries/sophia-prater.md +0 -193
  71. package/substrate/.claude/luminaries/stephen-toulmin.md +0 -131
  72. package/substrate/.claude/luminaries/tony-hoare.md +0 -170
  73. package/substrate/.claude/luminaries/vaughn-vernon.md +0 -50
  74. package/substrate/.claude/luminaries/w-edwards-deming.md +0 -158
  75. package/substrate/.claude/rules/accessor-library-discipline.md +0 -138
  76. package/substrate/.claude/rules/adr-discipline.md +0 -120
  77. package/substrate/.claude/rules/api-conventions.md +0 -125
  78. package/substrate/.claude/rules/artifact-ingestion.md +0 -179
  79. package/substrate/.claude/rules/assert-only-after-verify.md +0 -137
  80. package/substrate/.claude/rules/blocked-items.md +0 -146
  81. package/substrate/.claude/rules/bootstrap-pair-discipline.md +0 -141
  82. package/substrate/.claude/rules/branching.md +0 -28
  83. package/substrate/.claude/rules/cold-adopter-harness-discipline.md +0 -129
  84. package/substrate/.claude/rules/commit-conventions.md +0 -22
  85. package/substrate/.claude/rules/compounding-axis-fresh-analysis.md +0 -188
  86. package/substrate/.claude/rules/compounding-sequence-fresh-analysis.md +0 -188
  87. package/substrate/.claude/rules/context-engineering.md +0 -202
  88. package/substrate/.claude/rules/context-management.md +0 -85
  89. package/substrate/.claude/rules/defensive-bash.md +0 -68
  90. package/substrate/.claude/rules/deferred-actions.md +0 -233
  91. package/substrate/.claude/rules/destructive-operations.md +0 -69
  92. package/substrate/.claude/rules/diagnosis.md +0 -38
  93. package/substrate/.claude/rules/github-issue-flash-tweet.md +0 -156
  94. package/substrate/.claude/rules/guardrails.md +0 -73
  95. package/substrate/.claude/rules/hook-wire-on-author.md +0 -103
  96. package/substrate/.claude/rules/identifier-leak-prevention.md +0 -104
  97. package/substrate/.claude/rules/iteration-bet-brief-completeness.md +0 -54
  98. package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +0 -98
  99. package/substrate/.claude/rules/longrun-prep-plan-doc-compression.md +0 -89
  100. package/substrate/.claude/rules/loop-discipline.md +0 -81
  101. package/substrate/.claude/rules/manual-prod-approval.md +0 -100
  102. package/substrate/.claude/rules/marker-enrichment-discipline.md +0 -99
  103. package/substrate/.claude/rules/mobile-ephemeral-session.md +0 -109
  104. package/substrate/.claude/rules/new-dependency-check.md +0 -51
  105. package/substrate/.claude/rules/oo-ad-entry-point.md +0 -117
  106. package/substrate/.claude/rules/operator-facing-prose.md +0 -196
  107. package/substrate/.claude/rules/option-label-discipline.md +0 -108
  108. package/substrate/.claude/rules/pattern-annotation.md +0 -100
  109. package/substrate/.claude/rules/plain-english-discipline.md +0 -156
  110. package/substrate/.claude/rules/plan-enumeration-needs-value-props.md +0 -211
  111. package/substrate/.claude/rules/pr-body-shape.md +0 -317
  112. package/substrate/.claude/rules/pr-strategy.md +0 -167
  113. package/substrate/.claude/rules/pr-title-shape.md +0 -161
  114. package/substrate/.claude/rules/prototype-workflow.md +0 -65
  115. package/substrate/.claude/rules/reserved-skill-names.md +0 -123
  116. package/substrate/.claude/rules/schema-management.md +0 -49
  117. package/substrate/.claude/rules/sdlc-gates.md +0 -149
  118. package/substrate/.claude/rules/security.md +0 -37
  119. package/substrate/.claude/rules/session-artifacts.md +0 -236
  120. package/substrate/.claude/rules/skill-composition-declarations.md +0 -124
  121. package/substrate/.claude/rules/skill-description-clarity.md +0 -247
  122. package/substrate/.claude/rules/skill-procedure-step-list.md +0 -137
  123. package/substrate/.claude/rules/state-schema-validation.md +0 -162
  124. package/substrate/.claude/rules/stuck-signal-diagnostic.md +0 -140
  125. package/substrate/.claude/rules/substrate-config-schema.md +0 -98
  126. package/substrate/.claude/rules/test-list-discipline.md +0 -175
  127. package/substrate/.claude/rules/test-sufficiency.md +0 -210
  128. package/substrate/.claude/rules/testing-tier-config.md +0 -145
  129. package/substrate/.claude/rules/testing.md +0 -38
  130. package/substrate/.claude/rules/turn-estimate-grounding.md +0 -134
  131. package/substrate/.claude/rules/visual-hierarchy.md +0 -437
  132. package/substrate/.claude/rules/we-dont-break-adopters.md +0 -126
  133. package/substrate/.claude/rules/whereami-load-bearing.md +0 -202
  134. package/substrate/.claude/rules/writing-craft-discipline.md +0 -92
  135. package/substrate/.claude/rules/wu-sequencing-compounds.md +0 -145
  136. package/substrate/.claude/skills/build/SKILL.md +0 -640
  137. package/substrate/.claude/skills/chronicle/SKILL.md +0 -55
  138. package/substrate/.claude/skills/clean-artifacts/SKILL.md +0 -249
  139. package/substrate/.claude/skills/decompose/SKILL.md +0 -280
  140. package/substrate/.claude/skills/diagnose/SKILL.md +0 -297
  141. package/substrate/.claude/skills/feynman/SKILL.md +0 -90
  142. package/substrate/.claude/skills/howdoi/SKILL.md +0 -105
  143. package/substrate/.claude/skills/ia-model/SKILL.md +0 -108
  144. package/substrate/.claude/skills/interaction-design/SKILL.md +0 -112
  145. package/substrate/.claude/skills/interpret-input/SKILL.md +0 -180
  146. package/substrate/.claude/skills/journal/SKILL.md +0 -209
  147. package/substrate/.claude/skills/kiss/SKILL.md +0 -449
  148. package/substrate/.claude/skills/launch/SKILL.md +0 -915
  149. package/substrate/.claude/skills/lean-canvas/SKILL.md +0 -332
  150. package/substrate/.claude/skills/longrun/SKILL.md +0 -463
  151. package/substrate/.claude/skills/luminary/SKILL.md +0 -481
  152. package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +0 -177
  153. package/substrate/.claude/skills/onboard-repo/SKILL.md +0 -1624
  154. package/substrate/.claude/skills/pattern-review/SKILL.md +0 -99
  155. package/substrate/.claude/skills/personas/SKILL.md +0 -207
  156. package/substrate/.claude/skills/promote/SKILL.md +0 -283
  157. package/substrate/.claude/skills/requirement/SKILL.md +0 -98
  158. package/substrate/.claude/skills/retro/SKILL.md +0 -117
  159. package/substrate/.claude/skills/riff/SKILL.md +0 -114
  160. package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +0 -163
  161. package/substrate/.claude/skills/session-end/SKILL.md +0 -309
  162. package/substrate/.claude/skills/session-log/SKILL.md +0 -299
  163. package/substrate/.claude/skills/skills/SKILL.md +0 -228
  164. package/substrate/.claude/skills/spec/SKILL.md +0 -105
  165. package/substrate/.claude/skills/sprint/SKILL.md +0 -392
  166. package/substrate/.claude/skills/stage/SKILL.md +0 -384
  167. package/substrate/.claude/skills/state-a-problem/SKILL.md +0 -185
  168. package/substrate/.claude/skills/temperance/SKILL.md +0 -108
  169. package/substrate/.claude/skills/use-case/SKILL.md +0 -417
  170. package/substrate/.claude/skills/user-stories/SKILL.md +0 -268
  171. package/substrate/.claude/skills/value-prop/SKILL.md +0 -251
  172. package/substrate/.claude/skills/verify/SKILL.md +0 -160
  173. package/substrate/.claude/skills/visual-review/SKILL.md +0 -503
  174. package/substrate/.claude/skills/whats-the-plan/SKILL.md +0 -202
  175. package/substrate/.claude/skills/whereami/SKILL.md +0 -307
  176. package/substrate/AGENTS.md +0 -79
  177. package/substrate/CLAUDE-lite.md +0 -85
  178. package/substrate/CODE_OF_CONDUCT.md +0 -28
  179. package/substrate/CONTRIBUTING.md +0 -177
  180. package/substrate/README.md +0 -173
  181. package/substrate/SECURITY.md +0 -19
  182. package/substrate/architecture/decisions/ADR-029-release-pipeline.md +0 -79
  183. package/substrate/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +0 -139
  184. package/substrate/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +0 -192
  185. package/substrate/architecture/decisions/ADR-039-release-tagging-scheme.md +0 -145
  186. package/substrate/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +0 -155
  187. package/substrate/architecture/decisions/ADR-044-unified-skill-body-template.md +0 -162
  188. package/substrate/lib/clean-artifacts-sweep.sh +0 -112
  189. package/substrate/lib/code-comment-discipline.sh +0 -144
  190. package/substrate/lib/composer-preflight.sh +0 -459
  191. package/substrate/lib/hook-inject.sh +0 -255
  192. package/substrate/lib/luminary-pick.sh +0 -96
  193. package/substrate/lib/output-discipline.sh +0 -143
  194. package/substrate/lib/prose-scan-boundary.sh +0 -171
  195. package/substrate/lib/rewrite-check.sh +0 -214
  196. package/substrate/lib/state.sh +0 -1372
  197. package/substrate/lib/telemetry.sh +0 -205
  198. package/substrate/lib/tier-check.sh +0 -187
  199. package/substrate/lib/tier-dependency-audit.sh +0 -1088
  200. package/substrate/presence/install/bassclef-hook-connect.sh +0 -178
  201. package/substrate/presence/install/bassclef-sync.dispatcher.template.sh +0 -841
  202. package/substrate/presence/install/bassclef-sync.template.sh +0 -2076
  203. package/substrate/presence/install/schedule-auto-save.cron.sh +0 -88
  204. package/substrate/presence/install/schedule-auto-save.taskscheduler.md +0 -122
  205. package/substrate/scripts/aggregate-telemetry.sh +0 -217
  206. package/substrate/scripts/analyze-tier-dependencies.sh +0 -239
  207. package/substrate/scripts/generate-lite-manifest.sh +0 -505
  208. package/substrate/scripts/generate-tier-manifest.sh +0 -28
  209. package/substrate/scripts/intent-drift-check.sh +0 -456
  210. package/substrate/scripts/lite-manifest-drift-check.sh +0 -146
  211. package/substrate/scripts/render-lite-manifest-doc.sh +0 -150
  212. package/substrate/standards/adr-template.md +0 -86
  213. package/substrate/standards/api-conventions/nextjs.md +0 -84
  214. package/substrate/standards/artifact-composition.md +0 -209
  215. package/substrate/standards/bash-hook-safety.md +0 -246
  216. package/substrate/standards/bassclef-configs-schema.md +0 -232
  217. package/substrate/standards/bassclef-evolution.md +0 -143
  218. package/substrate/standards/bassclef-internal-jargon.md +0 -244
  219. package/substrate/standards/bassclef-managed-sentinel.md +0 -96
  220. package/substrate/standards/bassclef-source-config.md +0 -228
  221. package/substrate/standards/branch-stacking.md +0 -408
  222. package/substrate/standards/code-safety-principles.md +0 -176
  223. package/substrate/standards/composer-prerequisites.md +0 -155
  224. package/substrate/standards/deferred-actions-schema.md +0 -204
  225. package/substrate/standards/dependency-discipline/cargo.md +0 -39
  226. package/substrate/standards/dependency-discipline/gem.md +0 -43
  227. package/substrate/standards/dependency-discipline/go-mod.md +0 -41
  228. package/substrate/standards/dependency-discipline/npm.md +0 -42
  229. package/substrate/standards/dependency-discipline/pip.md +0 -42
  230. package/substrate/standards/deployment-topology/ec2-tailscale.md +0 -225
  231. package/substrate/standards/deployment-topology.md +0 -69
  232. package/substrate/standards/docs-sync-allowlist.md +0 -76
  233. package/substrate/standards/domain-and-dns.md +0 -145
  234. package/substrate/standards/frontend-stack.md +0 -67
  235. package/substrate/standards/frontmatter-schema.md +0 -154
  236. package/substrate/standards/graceful-exit.md +0 -227
  237. package/substrate/standards/hook-idempotency.md +0 -102
  238. package/substrate/standards/hook-injection-discipline.md +0 -202
  239. package/substrate/standards/hook-install-class.md +0 -215
  240. package/substrate/standards/input-handler-interface.md +0 -152
  241. package/substrate/standards/lite-manifest-schema-changes.md +0 -135
  242. package/substrate/standards/luminary-matching.md +0 -105
  243. package/substrate/standards/luminary-problem-patterns.md +0 -481
  244. package/substrate/standards/migration-discipline/active-record.md +0 -50
  245. package/substrate/standards/migration-discipline/alembic.md +0 -43
  246. package/substrate/standards/migration-discipline/gorm.md +0 -50
  247. package/substrate/standards/migration-discipline/prisma.md +0 -53
  248. package/substrate/standards/migration-discipline/sqlalchemy.md +0 -51
  249. package/substrate/standards/mobile-ephemeral-session.md +0 -167
  250. package/substrate/standards/model-routing-discipline.md +0 -160
  251. package/substrate/standards/ogilvy-writing-rules.md +0 -225
  252. package/substrate/standards/opener-discipline.md +0 -96
  253. package/substrate/standards/operator-facing-prose-discipline.md +0 -201
  254. package/substrate/standards/persona-schema.md +0 -229
  255. package/substrate/standards/pluggable-luminaries.md +0 -323
  256. package/substrate/standards/pr-body-discipline.md +0 -115
  257. package/substrate/standards/preview-state-schema.md +0 -189
  258. package/substrate/standards/project-directory-layout.md +0 -276
  259. package/substrate/standards/release-tagging.md +0 -137
  260. package/substrate/standards/reserved-skill-names.md +0 -120
  261. package/substrate/standards/scannable-multi-option-output.md +0 -261
  262. package/substrate/standards/sdlc-compliance.md +0 -286
  263. package/substrate/standards/sdlc-gates/typescript.md +0 -57
  264. package/substrate/standards/secrets-lifecycle.md +0 -210
  265. package/substrate/standards/security-scanner-adapter.md +0 -145
  266. package/substrate/standards/session-board.md +0 -256
  267. package/substrate/standards/skill-output-discipline.md +0 -90
  268. package/substrate/standards/state-spine-contract.md +0 -255
  269. package/substrate/standards/state-spine.md +0 -511
  270. package/substrate/standards/steering-hints/kiss-words.md +0 -11
  271. package/substrate/standards/substrate-config-schema.md +0 -267
  272. package/substrate/standards/tech-stack-config.md +0 -109
  273. package/substrate/standards/tier-dependency-analysis.md +0 -167
  274. package/substrate/standards/tier-runtime-deps/lite.md +0 -57
  275. package/substrate/standards/tier-tag-schema.md +0 -155
  276. package/substrate/standards/two-layer-config.md +0 -99
  277. package/substrate/standards/use-case-format.md +0 -292
  278. package/substrate/standards/user-story-invest.md +0 -268
  279. package/substrate/standards/velocity-and-appetite.md +0 -229
  280. package/substrate/standards/voice-input-pattern.md +0 -119
  281. package/substrate/standards/whereami-schema.md +0 -301
  282. package/substrate/standards/worktree-management.md +0 -211
  283. package/substrate/standards/writing-guide.md +0 -213
  284. package/substrate/templates/chronicle-template.md +0 -75
  285. package/substrate/templates/deferred-action-template.md +0 -45
  286. package/substrate/templates/memory-proposal-template.md +0 -77
  287. package/substrate/templates/persona-template.md +0 -200
  288. package/substrate/templates/pr-faq.md +0 -45
  289. package/substrate/templates/secret-rotation-template.md +0 -162
  290. package/substrate/templates/spec-template.md +0 -131
  291. package/substrate/templates/use-case-template.md +0 -194
  292. package/substrate/templates/user-story-template.md +0 -107
  293. package/substrate/templates/whereami-template.md +0 -101
@@ -1,205 +0,0 @@
1
- #!/usr/bin/env bash
2
- # lib/telemetry.sh — bassclef telemetry event emission (opt-in, local-only)
3
- # tier: lite
4
- # install-class: dual
5
- #
6
- # Deep module per @luminary john-ousterhout — small interface (5 functions
7
- # + CLI), complex implementation (opt-in gate + UUID session + schema
8
- # validation + append-only write) hidden behind it.
9
- #
10
- # Opt-in default OFF per @luminary alan-cooper (privacy) +
11
- # @luminary donald-norman (affordance — first-session prompt is where
12
- # consent lives).
13
- #
14
- # Schema-enforced no-PII per @luminary tony-hoare (contract — schema
15
- # validates in; append-only out).
16
- #
17
- # Silent-fail wrap per @luminary michael-nygard (stability — telemetry
18
- # never crashes adopter session).
19
- #
20
- # ADR-049 governs the design.
21
-
22
- set -u
23
-
24
- # ---------------------------------------------------------------------------
25
- # Path resolution — respects TELEMETRY_ROOT for tests; falls back to repo
26
- # root discovered from lib/ position.
27
- # ---------------------------------------------------------------------------
28
- if [ -z "${TELEMETRY_ROOT:-}" ]; then
29
- TELEMETRY_ROOT="${REPO_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
30
- fi
31
- _TELEM_CONFIG="${TELEMETRY_ROOT}/state/telemetry/config.json"
32
- _TELEM_SESSION="${TELEMETRY_ROOT}/state/telemetry/current-session.uuid"
33
- _TELEM_EVENTS_DIR="${TELEMETRY_ROOT}/state/telemetry"
34
- _TELEM_SCHEMA="${TELEMETRY_ROOT}/standards/telemetry-event.schema.json"
35
-
36
- # ---------------------------------------------------------------------------
37
- # telemetry_is_enabled — exit 0 when opt-in ON, 1 when OFF.
38
- # Default is OFF (no config file = OFF).
39
- # ---------------------------------------------------------------------------
40
- telemetry_is_enabled() {
41
- [ -f "$_TELEM_CONFIG" ] || return 1
42
- grep -q '"enabled"[[:space:]]*:[[:space:]]*true' "$_TELEM_CONFIG" 2>/dev/null
43
- }
44
-
45
- # ---------------------------------------------------------------------------
46
- # telemetry_enable — write config marking opt-in ON.
47
- # ---------------------------------------------------------------------------
48
- telemetry_enable() {
49
- mkdir -p "$(dirname "$_TELEM_CONFIG")"
50
- printf '{"enabled": true}\n' > "$_TELEM_CONFIG"
51
- echo "telemetry: ENABLED (config at $_TELEM_CONFIG)"
52
- }
53
-
54
- # ---------------------------------------------------------------------------
55
- # telemetry_disable — remove config; opt-in returns to OFF.
56
- # Existing event files stay in place; adopter owns their data.
57
- # ---------------------------------------------------------------------------
58
- telemetry_disable() {
59
- rm -f "$_TELEM_CONFIG"
60
- echo "telemetry: DISABLED (config removed; existing events in $_TELEM_EVENTS_DIR preserved)"
61
- }
62
-
63
- # ---------------------------------------------------------------------------
64
- # telemetry_status — print current opt-in state + storage location.
65
- # ---------------------------------------------------------------------------
66
- telemetry_status() {
67
- if telemetry_is_enabled; then
68
- echo "telemetry: ON"
69
- echo " config: $_TELEM_CONFIG"
70
- echo " events: $_TELEM_EVENTS_DIR/events-YYYYMMDD.jsonl"
71
- echo " share: bash lib/telemetry.sh share (send report to bassclef)"
72
- echo " disable: bash lib/telemetry.sh disable"
73
- else
74
- echo "telemetry: OFF"
75
- echo " enable: bash lib/telemetry.sh enable"
76
- echo " see: docs/telemetry.md for what data ships"
77
- fi
78
- }
79
-
80
- # ---------------------------------------------------------------------------
81
- # telemetry_share — prepare a report share ready to send upstream.
82
- # Adopter runs after aggregate. Opens a gh issue prefilled with the report
83
- # body OR prints a mailto: URL. Adopter is always the sender; the command
84
- # only lowers friction. Never auto-sends. Per ADR-049 §Alternatives Alt B
85
- # (remote share deferred to Iteration 4).
86
- # ---------------------------------------------------------------------------
87
- telemetry_share() {
88
- local report_dir="${TELEMETRY_ROOT}/docs/telemetry-reports"
89
- local latest_report
90
- latest_report=$(ls -1t "$report_dir"/*.md 2>/dev/null | head -1)
91
-
92
- if [ -z "$latest_report" ]; then
93
- echo "telemetry: no report to share — run first:"
94
- echo " bash scripts/aggregate-telemetry.sh"
95
- return 1
96
- fi
97
-
98
- echo "telemetry: latest report is $latest_report"
99
- echo ""
100
-
101
- # Prefer gh CLI if available — prefills a public bassclef issue
102
- if command -v gh >/dev/null 2>&1; then
103
- local target_repo="${BASSCLEF_TELEM_SHARE_REPO:-sunj-labs/bassclef}"
104
- echo "Share via GitHub issue on $target_repo:"
105
- echo ""
106
- echo " gh issue create --repo $target_repo \\"
107
- echo " --title 'telemetry: adopter uptake report — $(date -u +%Y-%m-%d)' \\"
108
- echo " --label 'telemetry-share' \\"
109
- echo " --body-file $latest_report"
110
- echo ""
111
- echo "Override target repo with BASSCLEF_TELEM_SHARE_REPO env var."
112
- fi
113
-
114
- # Also print a mailto: URL for adopters who prefer email
115
- local subject
116
- subject="telemetry: adopter uptake report $(date -u +%Y-%m-%d)"
117
- local body_hint="Report attached at $latest_report — copy the file contents into the email body."
118
- echo ""
119
- echo "Or email:"
120
- echo " mailto:${BASSCLEF_TELEM_SHARE_EMAIL:-hello@bassclef.dev}?subject=$(echo "$subject" | tr ' ' '+')&body=$(echo "$body_hint" | tr ' ' '+')"
121
- echo ""
122
- echo "You send the report yourself. Nothing leaves your machine automatically."
123
- echo "Review $latest_report before sending — it contains only counts, no PII."
124
- }
125
-
126
- # ---------------------------------------------------------------------------
127
- # telemetry_session_id — return current session UUID; generate if absent.
128
- # UUID v4 per ADR-049; never derived from operator identity or repo path.
129
- # ---------------------------------------------------------------------------
130
- telemetry_session_id() {
131
- if [ ! -f "$_TELEM_SESSION" ]; then
132
- mkdir -p "$(dirname "$_TELEM_SESSION")"
133
- if command -v uuidgen >/dev/null 2>&1; then
134
- uuidgen | tr '[:upper:]' '[:lower:]' > "$_TELEM_SESSION"
135
- else
136
- # Fallback bash-only UUID v4 (random hex; v4 variant bits)
137
- printf '%08x-%04x-4%03x-%04x-%012x\n' \
138
- $((RANDOM * RANDOM % 4294967296)) \
139
- $((RANDOM % 65536)) \
140
- $((RANDOM % 4096)) \
141
- $((RANDOM % 65536)) \
142
- $((RANDOM * RANDOM * RANDOM % 281474976710656)) > "$_TELEM_SESSION"
143
- fi
144
- fi
145
- cat "$_TELEM_SESSION"
146
- }
147
-
148
- # ---------------------------------------------------------------------------
149
- # telemetry_reset_session — clear current session UUID.
150
- # Called by session-end hook to close the current session boundary.
151
- # ---------------------------------------------------------------------------
152
- telemetry_reset_session() {
153
- rm -f "$_TELEM_SESSION"
154
- }
155
-
156
- # ---------------------------------------------------------------------------
157
- # telemetry_emit EVENT_JSON — validate against schema + append one line to
158
- # today's JSONL file. Silent skip when opt-in OFF (returns 0).
159
- # Never crashes caller — schema failures silently drop.
160
- # ---------------------------------------------------------------------------
161
- telemetry_emit() {
162
- local event_json="$1"
163
-
164
- # Opt-in gate FIRST — per pre-mortem R5, order matters
165
- telemetry_is_enabled || return 0
166
-
167
- mkdir -p "$_TELEM_EVENTS_DIR"
168
- local today
169
- today=$(date -u +%Y%m%d)
170
- local events_file="$_TELEM_EVENTS_DIR/events-$today.jsonl"
171
-
172
- # Validate against schema when ajv available. Silent skip on schema fail
173
- # or missing binary — telemetry never crashes adopter session (R1).
174
- # Requires ajv-cli + ajv-formats. Both ship together in every bassclef
175
- # CI job that runs this path (per .github/workflows/*.yml). Adopters
176
- # get both via bassclef-onboard or npm bassclef-lite install script.
177
- if command -v ajv >/dev/null 2>&1 && [ -f "$_TELEM_SCHEMA" ]; then
178
- local tmpfile
179
- tmpfile="$(mktemp -t bassclef-telem-XXXXXX).json"
180
- printf '%s\n' "$event_json" > "$tmpfile"
181
- if ! ajv validate --spec=draft2020 -c ajv-formats -s "$_TELEM_SCHEMA" -d "$tmpfile" >/dev/null 2>&1; then
182
- rm -f "$tmpfile"
183
- return 0
184
- fi
185
- rm -f "$tmpfile"
186
- fi
187
-
188
- # Append one line
189
- printf '%s\n' "$event_json" >> "$events_file"
190
- }
191
-
192
- # ---------------------------------------------------------------------------
193
- # CLI dispatch — runs only when invoked directly (bash lib/telemetry.sh ...)
194
- # Sourced use exposes functions without side effects.
195
- # ---------------------------------------------------------------------------
196
- if [ "${BASH_SOURCE[0]}" = "${0:-}" ]; then
197
- cmd="${1:-status}"
198
- case "$cmd" in
199
- enable) telemetry_enable ;;
200
- disable) telemetry_disable ;;
201
- status) telemetry_status ;;
202
- share) telemetry_share ;;
203
- *) echo "usage: bash lib/telemetry.sh {enable|disable|status|share}" >&2; exit 2 ;;
204
- esac
205
- fi
@@ -1,187 +0,0 @@
1
- #!/usr/bin/env bash
2
- # tier: lite
3
- # lib/tier-check.sh — adopter tier resolution + gate.
4
- #
5
- # Deep module per @luminary john-ousterhout. Single interface hides the
6
- # catalog of tier resolution methods (explicit config, probe, env override,
7
- # safe default).
8
- #
9
- # Consumers: /onboard-repo SKILL body, /launch SKILL body, /longrun body,
10
- # release harness, cold-adopter harness Check 6 (planned).
11
- #
12
- # tier: upstream
13
- # install-class: dual
14
- #
15
- # Rules governed by:
16
- # - .claude/rules/testing-tier-config.md (Tier 0 strict TDD)
17
- # - mechanism-fidelity rule (standard tier; interface honored end to end)
18
- #
19
- # Anchor luminaries: ousterhout (deep module), feathers (probe pin behavior)
20
-
21
- # Rank map for tier comparison.
22
- _tier_rank() {
23
- case "$1" in
24
- lite) echo 1 ;;
25
- standard) echo 2 ;;
26
- pro) echo 3 ;;
27
- *) echo 0 ;;
28
- esac
29
- }
30
-
31
- # resolve_adopter_tier [repo_root]
32
- #
33
- # Returns one of: lite | standard | pro
34
- # Resolution order:
35
- # 1. BASSCLEF_TIER env override (test-only; wins over configs)
36
- # 2. adopter.tier field in .claude/bassclef-configs.jsonc
37
- # 3. Probe — provision-deploy-host skill present => standard;
38
- # only lite-tagged skills present => lite
39
- # 4. Safe default => standard
40
- resolve_adopter_tier() {
41
- local repo_root="${1:-$(pwd)}"
42
- local tier=""
43
- local source="default"
44
-
45
- # Method 1: env override
46
- if [ -n "${BASSCLEF_TIER:-}" ]; then
47
- tier="$BASSCLEF_TIER"
48
- source="env BASSCLEF_TIER"
49
- fi
50
-
51
- # Method 2: explicit configs field
52
- if [ -z "$tier" ]; then
53
- local configs="${repo_root}/.claude/bassclef-configs.jsonc"
54
- if [ -f "$configs" ]; then
55
- tier=$(_read_tier_from_configs "$configs" 2>/dev/null || true)
56
- [ -n "$tier" ] && source="configs adopter.tier"
57
- fi
58
- fi
59
-
60
- # Method 3: probe skills present
61
- if [ -z "$tier" ]; then
62
- local skills_dir="${repo_root}/.claude/skills"
63
- if [ -d "$skills_dir/provision-deploy-host" ]; then
64
- tier="standard"
65
- source="probe (provision-deploy-host present)"
66
- elif [ -d "$skills_dir/onboard-repo" ] || [ -d "$skills_dir/session-log" ]; then
67
- # lite-tagged skills present; standard skills absent
68
- tier="lite"
69
- source="probe (lite skills present; standard absent)"
70
- fi
71
- fi
72
-
73
- # Method 4: safe default
74
- if [ -z "$tier" ]; then
75
- tier="standard"
76
- source="safe default (no configs, no skills probe hit)"
77
- fi
78
-
79
- # Validate tier is one of the known names
80
- case "$tier" in
81
- lite|standard|pro) : ;;
82
- *)
83
- tier="standard"
84
- source="safe default (unknown tier '$tier' rejected)"
85
- ;;
86
- esac
87
-
88
- # Debug log to stderr when requested
89
- if [ "${DEBUG_TIER_CHECK:-0}" = "1" ]; then
90
- echo "tier-check: tier=$tier source=$source" >&2
91
- fi
92
-
93
- echo "$tier"
94
- }
95
-
96
- # Parse tier from JSONC configs file. Strips comments then extracts adopter.tier.
97
- _read_tier_from_configs() {
98
- local configs="$1"
99
- python3 - "$configs" << 'PYEOF' 2>/dev/null || true
100
- import json
101
- import re
102
- import sys
103
-
104
- path = sys.argv[1]
105
- try:
106
- with open(path) as f:
107
- content = f.read()
108
- # Strip // line comments and /* block */ comments
109
- content = re.sub(r'/\*.*?\*/', '', content, flags=re.DOTALL)
110
- content = re.sub(r'//[^\n]*', '', content)
111
- d = json.loads(content)
112
- tier = d.get('adopter', {}).get('tier', '') or d.get('tier', '')
113
- if tier:
114
- print(tier)
115
- except Exception:
116
- pass
117
- PYEOF
118
- }
119
-
120
- # resolve_file_tier <path>
121
- #
122
- # Read a file's tier tag and print it to stdout. Returns empty string if
123
- # no tag is present. Supported shapes:
124
- # - .md — YAML frontmatter `tier:` field between --- markers
125
- # - .sh, .py — `# tier:` header line in first 10 lines
126
- # - .yml, .yaml — `# tier:` comment OR top-level `tier:` field in first 30 lines
127
- # - .json — root-key `"tier"` or `"_tier"` in first 30 lines
128
- # - .jsonc — `// tier:` comment or root-key
129
- # - .txt — first-line `# tier:` convention
130
- #
131
- # Mirrors detection shape from .claude/hooks/tier-tag-required-at-write.sh so
132
- # the reader half and the writer half stay consistent.
133
- resolve_file_tier() {
134
- local path="$1"
135
- if [ ! -f "$path" ]; then
136
- return 0
137
- fi
138
-
139
- local tier=""
140
- case "$path" in
141
- *.md)
142
- # Frontmatter between --- markers, first 30 lines
143
- tier=$(awk '
144
- /^---/ { in_fm = !in_fm; if (!in_fm) exit; next }
145
- in_fm && /^tier:[[:space:]]/ { sub(/^tier:[[:space:]]*/, ""); sub(/[[:space:]]*$/, ""); print; exit }
146
- NR > 30 { exit }
147
- ' "$path" 2>/dev/null)
148
- ;;
149
- *.sh|*.py)
150
- tier=$(head -10 "$path" 2>/dev/null | grep -E '^#[[:space:]]*tier:[[:space:]]' | head -1 | sed -E 's/^#[[:space:]]*tier:[[:space:]]*//; s/[[:space:]]*$//')
151
- ;;
152
- *.yml|*.yaml)
153
- tier=$(head -30 "$path" 2>/dev/null | grep -E '^#[[:space:]]*tier:[[:space:]]|^tier:[[:space:]]' | head -1 | sed -E 's/^#?[[:space:]]*tier:[[:space:]]*//; s/[[:space:]]*$//')
154
- ;;
155
- *.json|*.jsonc)
156
- tier=$(head -30 "$path" 2>/dev/null | grep -oE '"(_?tier)"[[:space:]]*:[[:space:]]*"[a-z]+"' | head -1 | sed -E 's/.*:[[:space:]]*"([a-z]+)"/\1/')
157
- if [ -z "$tier" ]; then
158
- tier=$(head -30 "$path" 2>/dev/null | grep -oE '//[[:space:]]*tier:[[:space:]]*[a-z]+' | head -1 | sed -E 's/.*tier:[[:space:]]*//')
159
- fi
160
- ;;
161
- *.txt)
162
- tier=$(head -1 "$path" 2>/dev/null | grep -E '^#[[:space:]]*tier:[[:space:]]' | sed -E 's/^#[[:space:]]*tier:[[:space:]]*//; s/[[:space:]]*$//')
163
- ;;
164
- esac
165
-
166
- echo "$tier"
167
- }
168
-
169
- # tier_at_least <required> [current]
170
- #
171
- # Returns 0 if current tier >= required, 1 otherwise.
172
- # Current tier resolves via resolve_adopter_tier when omitted.
173
- tier_at_least() {
174
- local required="$1"
175
- local current="${2:-$(resolve_adopter_tier)}"
176
- local req_rank cur_rank
177
- req_rank=$(_tier_rank "$required")
178
- cur_rank=$(_tier_rank "$current")
179
- # Unknown tier => reject
180
- if [ "$req_rank" -eq 0 ] || [ "$cur_rank" -eq 0 ]; then
181
- return 1
182
- fi
183
- if [ "$cur_rank" -ge "$req_rank" ]; then
184
- return 0
185
- fi
186
- return 1
187
- }