@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.
- package/dist/cli.cjs +431 -135
- package/dist/cli.js +433 -137
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.bassclef-source.json +10 -0
- package/{substrate → dist/lite}/.claude/hooks/artifact-ingestion-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/assert-verify-steering.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/bassclef-source-config-validate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/bassclef-sync.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/compound-noun-scrub.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/kiss-expansion-inject.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/longrun-prep-compounding-sequence-check.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/plain-english-steering.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/post-skill-friction-check.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/post-skill-telemetry.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/pre-build-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/pre-commit-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/session-end.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/session-reflection.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/skill-body-grade-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/skill-body-intent-drift.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/state-validate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/substrate-clarity-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/temperance-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/testing-tier-enforce.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/turn-prose-grade-measure.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/turn-prose-kiss-check.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/vocabulary-migration-check.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/whereami-utc-gate.sh +0 -0
- package/dist/lite/.claude/settings.json +212 -0
- package/dist/lite/CLAUDE.md +41 -0
- package/dist/lite/gitignore +58 -0
- package/dist/lite/standards/bassclef-wiring-manifest.json +497 -0
- package/dist/lite/whereami.md +24 -0
- package/package.json +8 -2
- package/substrate/.bassclef/lite-manifest.json +0 -2701
- package/substrate/.claude/agents/architect.md +0 -70
- package/substrate/.claude/agents/builder.md +0 -114
- package/substrate/.claude/agents/designer.md +0 -156
- package/substrate/.claude/agents/reviewer.md +0 -88
- package/substrate/.claude/hooks/longrun-prep-compounding-axis-check.sh +0 -492
- package/substrate/.claude/hooks/skill-step-list-check.sh +0 -171
- package/substrate/.claude/luminaries/alan-cooper.md +0 -170
- package/substrate/.claude/luminaries/alistair-cockburn.md +0 -140
- package/substrate/.claude/luminaries/amazon-pr-faq.md +0 -34
- package/substrate/.claude/luminaries/ash-maurya.md +0 -121
- package/substrate/.claude/luminaries/bill-buxton.md +0 -210
- package/substrate/.claude/luminaries/charles-sanders-peirce.md +0 -150
- package/substrate/.claude/luminaries/david-ogilvy.md +0 -192
- package/substrate/.claude/luminaries/don-norman.md +0 -173
- package/substrate/.claude/luminaries/edward-tufte.md +0 -179
- package/substrate/.claude/luminaries/eric-evans.md +0 -160
- package/substrate/.claude/luminaries/frederick-brooks.md +0 -50
- package/substrate/.claude/luminaries/gang-of-four.md +0 -157
- package/substrate/.claude/luminaries/glenford-myers.md +0 -230
- package/substrate/.claude/luminaries/hunt-thomas.md +0 -115
- package/substrate/.claude/luminaries/hyrum-wright.md +0 -94
- package/substrate/.claude/luminaries/jason-fried-dhh.md +0 -46
- package/substrate/.claude/luminaries/jesse-james-garrett.md +0 -154
- package/substrate/.claude/luminaries/john-ousterhout.md +0 -94
- package/substrate/.claude/luminaries/karl-popper.md +0 -132
- package/substrate/.claude/luminaries/kent-beck.md +0 -168
- package/substrate/.claude/luminaries/linus-torvalds.md +0 -218
- package/substrate/.claude/luminaries/martin-fowler.md +0 -164
- package/substrate/.claude/luminaries/michael-feathers.md +0 -125
- package/substrate/.claude/luminaries/michael-nygard.md +0 -118
- package/substrate/.claude/luminaries/robert-c-martin.md +0 -164
- package/substrate/.claude/luminaries/saltzer-schroeder.md +0 -194
- package/substrate/.claude/luminaries/sophia-prater.md +0 -193
- package/substrate/.claude/luminaries/stephen-toulmin.md +0 -131
- package/substrate/.claude/luminaries/tony-hoare.md +0 -170
- package/substrate/.claude/luminaries/vaughn-vernon.md +0 -50
- package/substrate/.claude/luminaries/w-edwards-deming.md +0 -158
- package/substrate/.claude/rules/accessor-library-discipline.md +0 -138
- package/substrate/.claude/rules/adr-discipline.md +0 -120
- package/substrate/.claude/rules/api-conventions.md +0 -125
- package/substrate/.claude/rules/artifact-ingestion.md +0 -179
- package/substrate/.claude/rules/assert-only-after-verify.md +0 -137
- package/substrate/.claude/rules/blocked-items.md +0 -146
- package/substrate/.claude/rules/bootstrap-pair-discipline.md +0 -141
- package/substrate/.claude/rules/branching.md +0 -28
- package/substrate/.claude/rules/cold-adopter-harness-discipline.md +0 -129
- package/substrate/.claude/rules/commit-conventions.md +0 -22
- package/substrate/.claude/rules/compounding-axis-fresh-analysis.md +0 -188
- package/substrate/.claude/rules/compounding-sequence-fresh-analysis.md +0 -188
- package/substrate/.claude/rules/context-engineering.md +0 -202
- package/substrate/.claude/rules/context-management.md +0 -85
- package/substrate/.claude/rules/defensive-bash.md +0 -68
- package/substrate/.claude/rules/deferred-actions.md +0 -233
- package/substrate/.claude/rules/destructive-operations.md +0 -69
- package/substrate/.claude/rules/diagnosis.md +0 -38
- package/substrate/.claude/rules/github-issue-flash-tweet.md +0 -156
- package/substrate/.claude/rules/guardrails.md +0 -73
- package/substrate/.claude/rules/hook-wire-on-author.md +0 -103
- package/substrate/.claude/rules/identifier-leak-prevention.md +0 -104
- package/substrate/.claude/rules/iteration-bet-brief-completeness.md +0 -54
- package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +0 -98
- package/substrate/.claude/rules/longrun-prep-plan-doc-compression.md +0 -89
- package/substrate/.claude/rules/loop-discipline.md +0 -81
- package/substrate/.claude/rules/manual-prod-approval.md +0 -100
- package/substrate/.claude/rules/marker-enrichment-discipline.md +0 -99
- package/substrate/.claude/rules/mobile-ephemeral-session.md +0 -109
- package/substrate/.claude/rules/new-dependency-check.md +0 -51
- package/substrate/.claude/rules/oo-ad-entry-point.md +0 -117
- package/substrate/.claude/rules/operator-facing-prose.md +0 -196
- package/substrate/.claude/rules/option-label-discipline.md +0 -108
- package/substrate/.claude/rules/pattern-annotation.md +0 -100
- package/substrate/.claude/rules/plain-english-discipline.md +0 -156
- package/substrate/.claude/rules/plan-enumeration-needs-value-props.md +0 -211
- package/substrate/.claude/rules/pr-body-shape.md +0 -317
- package/substrate/.claude/rules/pr-strategy.md +0 -167
- package/substrate/.claude/rules/pr-title-shape.md +0 -161
- package/substrate/.claude/rules/prototype-workflow.md +0 -65
- package/substrate/.claude/rules/reserved-skill-names.md +0 -123
- package/substrate/.claude/rules/schema-management.md +0 -49
- package/substrate/.claude/rules/sdlc-gates.md +0 -149
- package/substrate/.claude/rules/security.md +0 -37
- package/substrate/.claude/rules/session-artifacts.md +0 -236
- package/substrate/.claude/rules/skill-composition-declarations.md +0 -124
- package/substrate/.claude/rules/skill-description-clarity.md +0 -247
- package/substrate/.claude/rules/skill-procedure-step-list.md +0 -137
- package/substrate/.claude/rules/state-schema-validation.md +0 -162
- package/substrate/.claude/rules/stuck-signal-diagnostic.md +0 -140
- package/substrate/.claude/rules/substrate-config-schema.md +0 -98
- package/substrate/.claude/rules/test-list-discipline.md +0 -175
- package/substrate/.claude/rules/test-sufficiency.md +0 -210
- package/substrate/.claude/rules/testing-tier-config.md +0 -145
- package/substrate/.claude/rules/testing.md +0 -38
- package/substrate/.claude/rules/turn-estimate-grounding.md +0 -134
- package/substrate/.claude/rules/visual-hierarchy.md +0 -437
- package/substrate/.claude/rules/we-dont-break-adopters.md +0 -126
- package/substrate/.claude/rules/whereami-load-bearing.md +0 -202
- package/substrate/.claude/rules/writing-craft-discipline.md +0 -92
- package/substrate/.claude/rules/wu-sequencing-compounds.md +0 -145
- package/substrate/.claude/skills/build/SKILL.md +0 -640
- package/substrate/.claude/skills/chronicle/SKILL.md +0 -55
- package/substrate/.claude/skills/clean-artifacts/SKILL.md +0 -249
- package/substrate/.claude/skills/decompose/SKILL.md +0 -280
- package/substrate/.claude/skills/diagnose/SKILL.md +0 -297
- package/substrate/.claude/skills/feynman/SKILL.md +0 -90
- package/substrate/.claude/skills/howdoi/SKILL.md +0 -105
- package/substrate/.claude/skills/ia-model/SKILL.md +0 -108
- package/substrate/.claude/skills/interaction-design/SKILL.md +0 -112
- package/substrate/.claude/skills/interpret-input/SKILL.md +0 -180
- package/substrate/.claude/skills/journal/SKILL.md +0 -209
- package/substrate/.claude/skills/kiss/SKILL.md +0 -449
- package/substrate/.claude/skills/launch/SKILL.md +0 -915
- package/substrate/.claude/skills/lean-canvas/SKILL.md +0 -332
- package/substrate/.claude/skills/longrun/SKILL.md +0 -463
- package/substrate/.claude/skills/luminary/SKILL.md +0 -481
- package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +0 -177
- package/substrate/.claude/skills/onboard-repo/SKILL.md +0 -1624
- package/substrate/.claude/skills/pattern-review/SKILL.md +0 -99
- package/substrate/.claude/skills/personas/SKILL.md +0 -207
- package/substrate/.claude/skills/promote/SKILL.md +0 -283
- package/substrate/.claude/skills/requirement/SKILL.md +0 -98
- package/substrate/.claude/skills/retro/SKILL.md +0 -117
- package/substrate/.claude/skills/riff/SKILL.md +0 -114
- package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +0 -163
- package/substrate/.claude/skills/session-end/SKILL.md +0 -309
- package/substrate/.claude/skills/session-log/SKILL.md +0 -299
- package/substrate/.claude/skills/skills/SKILL.md +0 -228
- package/substrate/.claude/skills/spec/SKILL.md +0 -105
- package/substrate/.claude/skills/sprint/SKILL.md +0 -392
- package/substrate/.claude/skills/stage/SKILL.md +0 -384
- package/substrate/.claude/skills/state-a-problem/SKILL.md +0 -185
- package/substrate/.claude/skills/temperance/SKILL.md +0 -108
- package/substrate/.claude/skills/use-case/SKILL.md +0 -417
- package/substrate/.claude/skills/user-stories/SKILL.md +0 -268
- package/substrate/.claude/skills/value-prop/SKILL.md +0 -251
- package/substrate/.claude/skills/verify/SKILL.md +0 -160
- package/substrate/.claude/skills/visual-review/SKILL.md +0 -503
- package/substrate/.claude/skills/whats-the-plan/SKILL.md +0 -202
- package/substrate/.claude/skills/whereami/SKILL.md +0 -307
- package/substrate/AGENTS.md +0 -79
- package/substrate/CLAUDE-lite.md +0 -85
- package/substrate/CODE_OF_CONDUCT.md +0 -28
- package/substrate/CONTRIBUTING.md +0 -177
- package/substrate/README.md +0 -173
- package/substrate/SECURITY.md +0 -19
- package/substrate/architecture/decisions/ADR-029-release-pipeline.md +0 -79
- package/substrate/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +0 -139
- package/substrate/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +0 -192
- package/substrate/architecture/decisions/ADR-039-release-tagging-scheme.md +0 -145
- package/substrate/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +0 -155
- package/substrate/architecture/decisions/ADR-044-unified-skill-body-template.md +0 -162
- package/substrate/lib/clean-artifacts-sweep.sh +0 -112
- package/substrate/lib/code-comment-discipline.sh +0 -144
- package/substrate/lib/composer-preflight.sh +0 -459
- package/substrate/lib/hook-inject.sh +0 -255
- package/substrate/lib/luminary-pick.sh +0 -96
- package/substrate/lib/output-discipline.sh +0 -143
- package/substrate/lib/prose-scan-boundary.sh +0 -171
- package/substrate/lib/rewrite-check.sh +0 -214
- package/substrate/lib/state.sh +0 -1372
- package/substrate/lib/telemetry.sh +0 -205
- package/substrate/lib/tier-check.sh +0 -187
- package/substrate/lib/tier-dependency-audit.sh +0 -1088
- package/substrate/presence/install/bassclef-hook-connect.sh +0 -178
- package/substrate/presence/install/bassclef-sync.dispatcher.template.sh +0 -841
- package/substrate/presence/install/bassclef-sync.template.sh +0 -2076
- package/substrate/presence/install/schedule-auto-save.cron.sh +0 -88
- package/substrate/presence/install/schedule-auto-save.taskscheduler.md +0 -122
- package/substrate/scripts/aggregate-telemetry.sh +0 -217
- package/substrate/scripts/analyze-tier-dependencies.sh +0 -239
- package/substrate/scripts/generate-lite-manifest.sh +0 -505
- package/substrate/scripts/generate-tier-manifest.sh +0 -28
- package/substrate/scripts/intent-drift-check.sh +0 -456
- package/substrate/scripts/lite-manifest-drift-check.sh +0 -146
- package/substrate/scripts/render-lite-manifest-doc.sh +0 -150
- package/substrate/standards/adr-template.md +0 -86
- package/substrate/standards/api-conventions/nextjs.md +0 -84
- package/substrate/standards/artifact-composition.md +0 -209
- package/substrate/standards/bash-hook-safety.md +0 -246
- package/substrate/standards/bassclef-configs-schema.md +0 -232
- package/substrate/standards/bassclef-evolution.md +0 -143
- package/substrate/standards/bassclef-internal-jargon.md +0 -244
- package/substrate/standards/bassclef-managed-sentinel.md +0 -96
- package/substrate/standards/bassclef-source-config.md +0 -228
- package/substrate/standards/branch-stacking.md +0 -408
- package/substrate/standards/code-safety-principles.md +0 -176
- package/substrate/standards/composer-prerequisites.md +0 -155
- package/substrate/standards/deferred-actions-schema.md +0 -204
- package/substrate/standards/dependency-discipline/cargo.md +0 -39
- package/substrate/standards/dependency-discipline/gem.md +0 -43
- package/substrate/standards/dependency-discipline/go-mod.md +0 -41
- package/substrate/standards/dependency-discipline/npm.md +0 -42
- package/substrate/standards/dependency-discipline/pip.md +0 -42
- package/substrate/standards/deployment-topology/ec2-tailscale.md +0 -225
- package/substrate/standards/deployment-topology.md +0 -69
- package/substrate/standards/docs-sync-allowlist.md +0 -76
- package/substrate/standards/domain-and-dns.md +0 -145
- package/substrate/standards/frontend-stack.md +0 -67
- package/substrate/standards/frontmatter-schema.md +0 -154
- package/substrate/standards/graceful-exit.md +0 -227
- package/substrate/standards/hook-idempotency.md +0 -102
- package/substrate/standards/hook-injection-discipline.md +0 -202
- package/substrate/standards/hook-install-class.md +0 -215
- package/substrate/standards/input-handler-interface.md +0 -152
- package/substrate/standards/lite-manifest-schema-changes.md +0 -135
- package/substrate/standards/luminary-matching.md +0 -105
- package/substrate/standards/luminary-problem-patterns.md +0 -481
- package/substrate/standards/migration-discipline/active-record.md +0 -50
- package/substrate/standards/migration-discipline/alembic.md +0 -43
- package/substrate/standards/migration-discipline/gorm.md +0 -50
- package/substrate/standards/migration-discipline/prisma.md +0 -53
- package/substrate/standards/migration-discipline/sqlalchemy.md +0 -51
- package/substrate/standards/mobile-ephemeral-session.md +0 -167
- package/substrate/standards/model-routing-discipline.md +0 -160
- package/substrate/standards/ogilvy-writing-rules.md +0 -225
- package/substrate/standards/opener-discipline.md +0 -96
- package/substrate/standards/operator-facing-prose-discipline.md +0 -201
- package/substrate/standards/persona-schema.md +0 -229
- package/substrate/standards/pluggable-luminaries.md +0 -323
- package/substrate/standards/pr-body-discipline.md +0 -115
- package/substrate/standards/preview-state-schema.md +0 -189
- package/substrate/standards/project-directory-layout.md +0 -276
- package/substrate/standards/release-tagging.md +0 -137
- package/substrate/standards/reserved-skill-names.md +0 -120
- package/substrate/standards/scannable-multi-option-output.md +0 -261
- package/substrate/standards/sdlc-compliance.md +0 -286
- package/substrate/standards/sdlc-gates/typescript.md +0 -57
- package/substrate/standards/secrets-lifecycle.md +0 -210
- package/substrate/standards/security-scanner-adapter.md +0 -145
- package/substrate/standards/session-board.md +0 -256
- package/substrate/standards/skill-output-discipline.md +0 -90
- package/substrate/standards/state-spine-contract.md +0 -255
- package/substrate/standards/state-spine.md +0 -511
- package/substrate/standards/steering-hints/kiss-words.md +0 -11
- package/substrate/standards/substrate-config-schema.md +0 -267
- package/substrate/standards/tech-stack-config.md +0 -109
- package/substrate/standards/tier-dependency-analysis.md +0 -167
- package/substrate/standards/tier-runtime-deps/lite.md +0 -57
- package/substrate/standards/tier-tag-schema.md +0 -155
- package/substrate/standards/two-layer-config.md +0 -99
- package/substrate/standards/use-case-format.md +0 -292
- package/substrate/standards/user-story-invest.md +0 -268
- package/substrate/standards/velocity-and-appetite.md +0 -229
- package/substrate/standards/voice-input-pattern.md +0 -119
- package/substrate/standards/whereami-schema.md +0 -301
- package/substrate/standards/worktree-management.md +0 -211
- package/substrate/standards/writing-guide.md +0 -213
- package/substrate/templates/chronicle-template.md +0 -75
- package/substrate/templates/deferred-action-template.md +0 -45
- package/substrate/templates/memory-proposal-template.md +0 -77
- package/substrate/templates/persona-template.md +0 -200
- package/substrate/templates/pr-faq.md +0 -45
- package/substrate/templates/secret-rotation-template.md +0 -162
- package/substrate/templates/spec-template.md +0 -131
- package/substrate/templates/use-case-template.md +0 -194
- package/substrate/templates/user-story-template.md +0 -107
- 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
|
-
}
|