@thebassclef/lite 1.0.3 → 1.1.0

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 (275) hide show
  1. package/dist/cli.cjs +92 -6
  2. package/dist/cli.js +92 -6
  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/agents/architect.md +70 -0
  7. package/dist/lite/.claude/agents/builder.md +114 -0
  8. package/dist/lite/.claude/agents/designer.md +156 -0
  9. package/dist/lite/.claude/agents/reviewer.md +88 -0
  10. package/dist/lite/.claude/hooks/bassclef-sync.sh +85 -27
  11. package/dist/lite/.claude/hooks/longrun-prep-compounding-axis-check.sh +492 -0
  12. package/dist/lite/.claude/hooks/longrun-prep-render-check.sh +236 -0
  13. package/dist/lite/.claude/hooks/persona-name-scrub-check.sh +105 -0
  14. package/dist/lite/.claude/hooks/skill-step-list-check.sh +171 -0
  15. package/dist/lite/.claude/luminaries/alan-cooper.md +170 -0
  16. package/dist/lite/.claude/luminaries/alistair-cockburn.md +140 -0
  17. package/dist/lite/.claude/luminaries/amazon-pr-faq.md +34 -0
  18. package/dist/lite/.claude/luminaries/andreas-zeller.md +74 -0
  19. package/dist/lite/.claude/luminaries/ash-maurya.md +121 -0
  20. package/dist/lite/.claude/luminaries/bill-buxton.md +210 -0
  21. package/dist/lite/.claude/luminaries/charles-sanders-peirce.md +150 -0
  22. package/dist/lite/.claude/luminaries/david-ogilvy.md +192 -0
  23. package/dist/lite/.claude/luminaries/don-norman.md +173 -0
  24. package/dist/lite/.claude/luminaries/edward-tufte.md +179 -0
  25. package/dist/lite/.claude/luminaries/eric-evans.md +160 -0
  26. package/dist/lite/.claude/luminaries/frederick-brooks.md +50 -0
  27. package/dist/lite/.claude/luminaries/gang-of-four.md +157 -0
  28. package/dist/lite/.claude/luminaries/glenford-myers.md +230 -0
  29. package/dist/lite/.claude/luminaries/hunt-thomas.md +115 -0
  30. package/dist/lite/.claude/luminaries/hyrum-wright.md +94 -0
  31. package/dist/lite/.claude/luminaries/jason-fried-dhh.md +46 -0
  32. package/dist/lite/.claude/luminaries/jesse-james-garrett.md +154 -0
  33. package/dist/lite/.claude/luminaries/john-ousterhout.md +94 -0
  34. package/dist/lite/.claude/luminaries/karl-popper.md +132 -0
  35. package/dist/lite/.claude/luminaries/kent-beck.md +168 -0
  36. package/dist/lite/.claude/luminaries/linus-torvalds.md +218 -0
  37. package/dist/lite/.claude/luminaries/martin-fowler.md +164 -0
  38. package/dist/lite/.claude/luminaries/michael-feathers.md +125 -0
  39. package/dist/lite/.claude/luminaries/michael-nygard.md +118 -0
  40. package/dist/lite/.claude/luminaries/robert-c-martin.md +164 -0
  41. package/dist/lite/.claude/luminaries/saltzer-schroeder.md +194 -0
  42. package/dist/lite/.claude/luminaries/sophia-prater.md +193 -0
  43. package/dist/lite/.claude/luminaries/stephen-toulmin.md +131 -0
  44. package/dist/lite/.claude/luminaries/tony-hoare.md +170 -0
  45. package/dist/lite/.claude/luminaries/vaughn-vernon.md +50 -0
  46. package/dist/lite/.claude/luminaries/w-edwards-deming.md +158 -0
  47. package/dist/lite/.claude/rules/accessor-library-discipline.md +110 -0
  48. package/dist/lite/.claude/rules/adr-discipline.md +96 -0
  49. package/dist/lite/.claude/rules/api-conventions.md +115 -0
  50. package/dist/lite/.claude/rules/artifact-ingestion.md +137 -0
  51. package/dist/lite/.claude/rules/assert-only-after-verify.md +111 -0
  52. package/dist/lite/.claude/rules/blocked-items.md +139 -0
  53. package/dist/lite/.claude/rules/bootstrap-pair-discipline.md +106 -0
  54. package/dist/lite/.claude/rules/branching.md +28 -0
  55. package/dist/lite/.claude/rules/cold-adopter-harness-discipline.md +93 -0
  56. package/dist/lite/.claude/rules/commit-conventions.md +22 -0
  57. package/dist/lite/.claude/rules/compounding-axis-fresh-analysis.md +173 -0
  58. package/dist/lite/.claude/rules/compounding-sequence-fresh-analysis.md +173 -0
  59. package/dist/lite/.claude/rules/context-engineering.md +155 -0
  60. package/dist/lite/.claude/rules/context-management.md +85 -0
  61. package/dist/lite/.claude/rules/defensive-bash.md +52 -0
  62. package/dist/lite/.claude/rules/deferred-actions.md +233 -0
  63. package/dist/lite/.claude/rules/destructive-operations.md +69 -0
  64. package/dist/lite/.claude/rules/diagnosis.md +38 -0
  65. package/dist/lite/.claude/rules/github-issue-flash-tweet.md +114 -0
  66. package/dist/lite/.claude/rules/guardrails.md +73 -0
  67. package/dist/lite/.claude/rules/hook-wire-on-author.md +77 -0
  68. package/dist/lite/.claude/rules/identifier-leak-prevention.md +73 -0
  69. package/dist/lite/.claude/rules/iteration-bet-brief-completeness.md +43 -0
  70. package/dist/lite/.claude/rules/lite-manifest-schema-change-discipline.md +79 -0
  71. package/dist/lite/.claude/rules/longrun-prep-plan-doc-compression.md +77 -0
  72. package/dist/lite/.claude/rules/loop-discipline.md +71 -0
  73. package/dist/lite/.claude/rules/manual-prod-approval.md +100 -0
  74. package/dist/lite/.claude/rules/marker-enrichment-discipline.md +72 -0
  75. package/dist/lite/.claude/rules/mobile-ephemeral-session.md +109 -0
  76. package/dist/lite/.claude/rules/new-dependency-check.md +44 -0
  77. package/dist/lite/.claude/rules/oo-ad-entry-point.md +95 -0
  78. package/dist/lite/.claude/rules/operator-facing-prose.md +177 -0
  79. package/dist/lite/.claude/rules/option-label-discipline.md +82 -0
  80. package/dist/lite/.claude/rules/pattern-annotation.md +83 -0
  81. package/dist/lite/.claude/rules/persona-name-leak-scrub.md +90 -0
  82. package/dist/lite/.claude/rules/plain-english-discipline.md +132 -0
  83. package/dist/lite/.claude/rules/plan-enumeration-needs-value-props.md +177 -0
  84. package/dist/lite/.claude/rules/pr-body-shape.md +195 -0
  85. package/dist/lite/.claude/rules/pr-strategy.md +142 -0
  86. package/dist/lite/.claude/rules/pr-title-shape.md +90 -0
  87. package/dist/lite/.claude/rules/prototype-workflow.md +53 -0
  88. package/dist/lite/.claude/rules/reserved-skill-names.md +103 -0
  89. package/dist/lite/.claude/rules/schema-management.md +42 -0
  90. package/dist/lite/.claude/rules/sdlc-gates.md +149 -0
  91. package/dist/lite/.claude/rules/security.md +37 -0
  92. package/dist/lite/.claude/rules/session-artifacts.md +236 -0
  93. package/dist/lite/.claude/rules/skill-composition-declarations.md +105 -0
  94. package/dist/lite/.claude/rules/skill-description-clarity.md +196 -0
  95. package/dist/lite/.claude/rules/skill-procedure-step-list.md +119 -0
  96. package/dist/lite/.claude/rules/sprint-prep-preset-picker.md +76 -0
  97. package/dist/lite/.claude/rules/state-schema-validation.md +156 -0
  98. package/dist/lite/.claude/rules/stuck-signal-diagnostic.md +111 -0
  99. package/dist/lite/.claude/rules/substrate-config-schema.md +85 -0
  100. package/dist/lite/.claude/rules/test-list-discipline.md +129 -0
  101. package/dist/lite/.claude/rules/test-sufficiency.md +186 -0
  102. package/dist/lite/.claude/rules/testing-tier-config.md +125 -0
  103. package/dist/lite/.claude/rules/testing.md +38 -0
  104. package/dist/lite/.claude/rules/turn-estimate-grounding.md +82 -0
  105. package/dist/lite/.claude/rules/visual-hierarchy.md +427 -0
  106. package/dist/lite/.claude/rules/we-dont-break-adopters.md +103 -0
  107. package/dist/lite/.claude/rules/whereami-load-bearing.md +184 -0
  108. package/dist/lite/.claude/rules/writing-craft-discipline.md +72 -0
  109. package/dist/lite/.claude/rules/wu-sequencing-compounds.md +119 -0
  110. package/dist/lite/.claude/skills/build/SKILL.md +640 -0
  111. package/dist/lite/.claude/skills/chronicle/SKILL.md +55 -0
  112. package/dist/lite/.claude/skills/clean-artifacts/SKILL.md +249 -0
  113. package/dist/lite/.claude/skills/decompose/SKILL.md +280 -0
  114. package/dist/lite/.claude/skills/diagnose/SKILL.md +297 -0
  115. package/dist/lite/.claude/skills/feynman/SKILL.md +90 -0
  116. package/dist/lite/.claude/skills/howdoi/SKILL.md +105 -0
  117. package/dist/lite/.claude/skills/ia-model/SKILL.md +108 -0
  118. package/dist/lite/.claude/skills/interaction-design/SKILL.md +112 -0
  119. package/dist/lite/.claude/skills/interpret-input/SKILL.md +180 -0
  120. package/dist/lite/.claude/skills/journal/SKILL.md +209 -0
  121. package/dist/lite/.claude/skills/kiss/SKILL.md +449 -0
  122. package/dist/lite/.claude/skills/launch/SKILL.md +915 -0
  123. package/dist/lite/.claude/skills/lean-canvas/SKILL.md +332 -0
  124. package/dist/lite/.claude/skills/longrun/SKILL.md +512 -0
  125. package/dist/lite/.claude/skills/luminary/SKILL.md +481 -0
  126. package/dist/lite/.claude/skills/ogilvy-writing-audit/SKILL.md +177 -0
  127. package/dist/lite/.claude/skills/onboard-repo/SKILL.md +1640 -0
  128. package/dist/lite/.claude/skills/pattern-review/SKILL.md +99 -0
  129. package/dist/lite/.claude/skills/personas/SKILL.md +207 -0
  130. package/dist/lite/.claude/skills/promote/SKILL.md +283 -0
  131. package/dist/lite/.claude/skills/requirement/SKILL.md +98 -0
  132. package/dist/lite/.claude/skills/retro/SKILL.md +117 -0
  133. package/dist/lite/.claude/skills/riff/SKILL.md +114 -0
  134. package/dist/lite/.claude/skills/roadmap-reconcile/SKILL.md +163 -0
  135. package/dist/lite/.claude/skills/session-end/SKILL.md +309 -0
  136. package/dist/lite/.claude/skills/session-log/SKILL.md +299 -0
  137. package/dist/lite/.claude/skills/skills/SKILL.md +228 -0
  138. package/dist/lite/.claude/skills/spec/SKILL.md +105 -0
  139. package/dist/lite/.claude/skills/sprint/SKILL.md +418 -0
  140. package/dist/lite/.claude/skills/stage/SKILL.md +384 -0
  141. package/dist/lite/.claude/skills/state-a-problem/SKILL.md +185 -0
  142. package/dist/lite/.claude/skills/temperance/SKILL.md +108 -0
  143. package/dist/lite/.claude/skills/use-case/SKILL.md +417 -0
  144. package/dist/lite/.claude/skills/user-stories/SKILL.md +268 -0
  145. package/dist/lite/.claude/skills/value-prop/SKILL.md +251 -0
  146. package/dist/lite/.claude/skills/verify/SKILL.md +160 -0
  147. package/dist/lite/.claude/skills/visual-review/SKILL.md +503 -0
  148. package/dist/lite/.claude/skills/whats-the-plan/SKILL.md +202 -0
  149. package/dist/lite/.claude/skills/whereami/SKILL.md +307 -0
  150. package/dist/lite/AGENTS.md +79 -0
  151. package/dist/lite/CLAUDE-lite.md +85 -0
  152. package/dist/lite/CODE_OF_CONDUCT.md +28 -0
  153. package/dist/lite/CONTRIBUTING.md +177 -0
  154. package/dist/lite/README.md +173 -0
  155. package/dist/lite/SECURITY.md +19 -0
  156. package/dist/lite/architecture/decisions/ADR-029-release-pipeline.md +79 -0
  157. package/dist/lite/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +139 -0
  158. package/dist/lite/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +192 -0
  159. package/dist/lite/architecture/decisions/ADR-039-release-tagging-scheme.md +145 -0
  160. package/dist/lite/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +155 -0
  161. package/dist/lite/architecture/decisions/ADR-044-unified-skill-body-template.md +162 -0
  162. package/dist/lite/lib/clean-artifacts-sweep.sh +112 -0
  163. package/dist/lite/lib/code-comment-discipline.sh +144 -0
  164. package/dist/lite/lib/composer-preflight.sh +459 -0
  165. package/dist/lite/lib/deferred-actions.sh +146 -0
  166. package/dist/lite/lib/hook-header-parser.sh +61 -0
  167. package/dist/lite/lib/hook-heartbeat.sh +152 -0
  168. package/dist/lite/lib/hook-inject.sh +255 -0
  169. package/dist/lite/lib/hook-installer.sh +195 -0
  170. package/dist/lite/lib/luminary-pick.sh +96 -0
  171. package/dist/lite/lib/output-discipline.sh +143 -0
  172. package/dist/lite/lib/prose-scan-boundary.sh +171 -0
  173. package/dist/lite/lib/rewrite-check.sh +214 -0
  174. package/dist/lite/lib/session-rescue.sh +151 -0
  175. package/dist/lite/lib/source-graph-walker.sh +277 -0
  176. package/dist/lite/lib/state.sh +1372 -0
  177. package/dist/lite/lib/telemetry.sh +205 -0
  178. package/dist/lite/lib/tier-check.sh +187 -0
  179. package/dist/lite/lib/tier-dependency-audit.sh +1088 -0
  180. package/dist/lite/presence/install/bassclef-hook-connect.sh +178 -0
  181. package/dist/lite/presence/install/bassclef-sync.dispatcher.template.sh +841 -0
  182. package/dist/lite/presence/install/bassclef-sync.template.sh +2278 -0
  183. package/dist/lite/presence/install/schedule-auto-save.cron.sh +88 -0
  184. package/dist/lite/presence/install/schedule-auto-save.taskscheduler.md +122 -0
  185. package/dist/lite/scripts/aggregate-telemetry.sh +217 -0
  186. package/dist/lite/scripts/analyze-tier-dependencies.sh +239 -0
  187. package/dist/lite/scripts/generate-lite-manifest.sh +505 -0
  188. package/dist/lite/scripts/generate-tier-manifest.sh +28 -0
  189. package/dist/lite/scripts/intent-drift-check.sh +456 -0
  190. package/dist/lite/scripts/lite-manifest-drift-check.sh +146 -0
  191. package/dist/lite/scripts/render-lite-manifest-doc.sh +150 -0
  192. package/dist/lite/standards/adr-template.md +86 -0
  193. package/dist/lite/standards/api-conventions/nextjs.md +84 -0
  194. package/dist/lite/standards/artifact-composition.md +209 -0
  195. package/dist/lite/standards/bash-hook-safety.md +246 -0
  196. package/dist/lite/standards/bassclef-configs-schema.md +232 -0
  197. package/dist/lite/standards/bassclef-evolution.md +143 -0
  198. package/dist/lite/standards/bassclef-internal-jargon.md +244 -0
  199. package/dist/lite/standards/bassclef-managed-sentinel.md +96 -0
  200. package/dist/lite/standards/bassclef-source-config.md +228 -0
  201. package/dist/lite/standards/branch-stacking.md +408 -0
  202. package/dist/lite/standards/code-safety-principles.md +176 -0
  203. package/dist/lite/standards/composer-prerequisites.md +155 -0
  204. package/dist/lite/standards/deferred-actions-schema.md +204 -0
  205. package/dist/lite/standards/dependency-discipline/cargo.md +39 -0
  206. package/dist/lite/standards/dependency-discipline/gem.md +43 -0
  207. package/dist/lite/standards/dependency-discipline/go-mod.md +41 -0
  208. package/dist/lite/standards/dependency-discipline/npm.md +42 -0
  209. package/dist/lite/standards/dependency-discipline/pip.md +42 -0
  210. package/dist/lite/standards/deployment-topology/ec2-tailscale.md +225 -0
  211. package/dist/lite/standards/deployment-topology.md +69 -0
  212. package/dist/lite/standards/docs-sync-allowlist.md +76 -0
  213. package/dist/lite/standards/domain-and-dns.md +145 -0
  214. package/dist/lite/standards/frontend-stack.md +67 -0
  215. package/dist/lite/standards/frontmatter-schema.md +154 -0
  216. package/dist/lite/standards/graceful-exit.md +227 -0
  217. package/dist/lite/standards/hook-idempotency.md +102 -0
  218. package/dist/lite/standards/hook-injection-discipline.md +202 -0
  219. package/dist/lite/standards/hook-install-class.md +215 -0
  220. package/dist/lite/standards/input-handler-interface.md +152 -0
  221. package/dist/lite/standards/lite-manifest-schema-changes.md +180 -0
  222. package/dist/lite/standards/lite-manifest.json +2797 -0
  223. package/dist/lite/standards/luminary-matching.md +105 -0
  224. package/dist/lite/standards/luminary-problem-patterns.md +481 -0
  225. package/dist/lite/standards/migration-discipline/active-record.md +50 -0
  226. package/dist/lite/standards/migration-discipline/alembic.md +43 -0
  227. package/dist/lite/standards/migration-discipline/gorm.md +50 -0
  228. package/dist/lite/standards/migration-discipline/prisma.md +53 -0
  229. package/dist/lite/standards/migration-discipline/sqlalchemy.md +51 -0
  230. package/dist/lite/standards/mobile-ephemeral-session.md +167 -0
  231. package/dist/lite/standards/model-routing-discipline.md +160 -0
  232. package/dist/lite/standards/ogilvy-writing-rules.md +225 -0
  233. package/dist/lite/standards/opener-discipline.md +96 -0
  234. package/dist/lite/standards/operator-facing-prose-discipline.md +201 -0
  235. package/dist/lite/standards/persona-schema.md +229 -0
  236. package/dist/lite/standards/pluggable-luminaries.md +323 -0
  237. package/dist/lite/standards/pr-body-discipline.md +115 -0
  238. package/dist/lite/standards/preview-state-schema.md +189 -0
  239. package/dist/lite/standards/project-directory-layout.md +276 -0
  240. package/dist/lite/standards/release-tagging.md +137 -0
  241. package/dist/lite/standards/reserved-skill-names.md +120 -0
  242. package/dist/lite/standards/scannable-multi-option-output.md +265 -0
  243. package/dist/lite/standards/sdlc-compliance.md +286 -0
  244. package/dist/lite/standards/sdlc-gates/typescript.md +57 -0
  245. package/dist/lite/standards/secrets-lifecycle.md +210 -0
  246. package/dist/lite/standards/security-scanner-adapter.md +145 -0
  247. package/dist/lite/standards/session-board.md +256 -0
  248. package/dist/lite/standards/skill-output-discipline.md +121 -0
  249. package/dist/lite/standards/state-spine-contract.md +255 -0
  250. package/dist/lite/standards/state-spine.md +511 -0
  251. package/dist/lite/standards/steering-hints/kiss-words.md +11 -0
  252. package/dist/lite/standards/substrate-config-schema.md +267 -0
  253. package/dist/lite/standards/tech-stack-config.md +109 -0
  254. package/dist/lite/standards/tier-dependency-analysis.md +167 -0
  255. package/dist/lite/standards/tier-runtime-deps/lite.md +57 -0
  256. package/dist/lite/standards/tier-tag-schema.md +155 -0
  257. package/dist/lite/standards/two-layer-config.md +99 -0
  258. package/dist/lite/standards/use-case-format.md +292 -0
  259. package/dist/lite/standards/user-story-invest.md +268 -0
  260. package/dist/lite/standards/velocity-and-appetite.md +229 -0
  261. package/dist/lite/standards/voice-input-pattern.md +119 -0
  262. package/dist/lite/standards/whereami-schema.md +301 -0
  263. package/dist/lite/standards/worktree-management.md +211 -0
  264. package/dist/lite/standards/writing-guide.md +213 -0
  265. package/dist/lite/templates/chronicle-template.md +75 -0
  266. package/dist/lite/templates/deferred-action-template.md +45 -0
  267. package/dist/lite/templates/memory-proposal-template.md +77 -0
  268. package/dist/lite/templates/persona-template.md +200 -0
  269. package/dist/lite/templates/pr-faq.md +45 -0
  270. package/dist/lite/templates/secret-rotation-template.md +162 -0
  271. package/dist/lite/templates/spec-template.md +131 -0
  272. package/dist/lite/templates/use-case-template.md +194 -0
  273. package/dist/lite/templates/user-story-template.md +107 -0
  274. package/dist/lite/templates/whereami-template.md +101 -0
  275. package/package.json +1 -1
@@ -0,0 +1,505 @@
1
+ #!/usr/bin/env bash
2
+ # tier: lite
3
+ # Generate lite-manifest.json at repo root.
4
+ #
5
+ # Reads tier: lite frontmatter across the 7 substrate surfaces and emits
6
+ # the manifest per standards/lite-manifest.schema.json v1.0.0.
7
+ #
8
+ # Per bassclef-upstream#1020 (partner packaging manifest) + #1030 (root
9
+ # location + generator). Session 2026-08-01d option b — standalone
10
+ # generator; release-script integration deferred per bet doc Out of scope.
11
+ #
12
+ # Cures per pre-mortem risk ledger docs/risk-ledgers/2026-08-01c-lite-manifest.md:
13
+ # F-b.H1 — resolves repo root via git rev-parse; writes to ${ROOT}/lite-manifest.json
14
+ # F1.1 — real substrate paths (not synthetic); tests iterate all project surfaces
15
+ # F1.3 — iterates ALL 7 surfaces (skills + rules + hooks + luminaries + agents + standards + ADRs)
16
+ # F2.1/2/6/7 — schema validates output at CI drift-check (Step 5)
17
+ #
18
+ # Usage:
19
+ # scripts/generate-lite-manifest.sh # writes lite-manifest.json at repo root
20
+ # scripts/generate-lite-manifest.sh --dry-run # prints JSON to stdout; no file write
21
+ # scripts/generate-lite-manifest.sh --output PATH # writes to specified path (test harness)
22
+ # scripts/generate-lite-manifest.sh --root PATH # override repo root (test harness)
23
+ #
24
+ # Exit codes:
25
+ # 0 — manifest written or dry-run printed
26
+ # 1 — invalid arg or missing dependency (jq, git, shasum/sha256sum)
27
+ # 2 — no lite entries found (schema requires minItems: 1)
28
+
29
+ set -euo pipefail
30
+
31
+ MANIFEST_VERSION="1.6.1"
32
+
33
+ # --- arg parse ---
34
+ DRY_RUN=0
35
+ OUTPUT_PATH=""
36
+ REPO_ROOT_OVERRIDE=""
37
+ TARGET_TIER="lite" # per #1295 — script now tier-parameterizable; default preserves prior API
38
+
39
+ while [[ $# -gt 0 ]]; do
40
+ case "$1" in
41
+ --dry-run) DRY_RUN=1; shift ;;
42
+ --output) OUTPUT_PATH="${2:-}"; shift 2 ;;
43
+ --root) REPO_ROOT_OVERRIDE="${2:-}"; shift 2 ;;
44
+ --tier) TARGET_TIER="${2:-}"; shift 2 ;;
45
+ -h|--help)
46
+ grep -E '^# ' "$0" | sed 's/^# \?//'
47
+ exit 0
48
+ ;;
49
+ *) echo "Unknown arg: $1 (use --help)" >&2; exit 1 ;;
50
+ esac
51
+ done
52
+
53
+ # --- validate tier arg per ADR-043 D1 ---
54
+ case "$TARGET_TIER" in
55
+ lite|standard|ultra|standard-pro) ;;
56
+ *) echo "generate-tier-manifest: invalid --tier '$TARGET_TIER' (allowed: lite, standard, ultra, standard-pro)" >&2; exit 1 ;;
57
+ esac
58
+
59
+ # --- resolve repo root ---
60
+ if [[ -n "$REPO_ROOT_OVERRIDE" ]]; then
61
+ REPO_ROOT="$REPO_ROOT_OVERRIDE"
62
+ else
63
+ REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || true)"
64
+ fi
65
+
66
+ if [[ -z "$REPO_ROOT" || ! -d "$REPO_ROOT" ]]; then
67
+ echo "generate-lite-manifest: cannot resolve repo root (not in a git tree; use --root)" >&2
68
+ exit 1
69
+ fi
70
+
71
+ # --- dependency check ---
72
+ for cmd in jq git; do
73
+ if ! command -v "$cmd" >/dev/null 2>&1; then
74
+ echo "generate-lite-manifest: missing dependency: $cmd" >&2
75
+ exit 1
76
+ fi
77
+ done
78
+
79
+ if command -v shasum >/dev/null 2>&1; then
80
+ SHA_CMD="shasum -a 256"
81
+ elif command -v sha256sum >/dev/null 2>&1; then
82
+ SHA_CMD="sha256sum"
83
+ else
84
+ echo "generate-lite-manifest: missing dependency: shasum or sha256sum" >&2
85
+ exit 1
86
+ fi
87
+
88
+ # --- default output path (root of the resolved repo; per-tier filename) ---
89
+ if [[ -z "$OUTPUT_PATH" ]]; then
90
+ OUTPUT_PATH="${REPO_ROOT}/${TARGET_TIER}-manifest.json"
91
+ fi
92
+
93
+ # --- generation metadata ---
94
+ GENERATED_AT="$(date -u +'%Y-%m-%dT%H:%M:%SZ')"
95
+ UPSTREAM_COMMIT="$(cd "$REPO_ROOT" && git rev-parse HEAD 2>/dev/null || echo '0000000000000000000000000000000000000000')"
96
+
97
+ # --- extractors ---
98
+
99
+ # Extract tier from markdown YAML frontmatter (skills, rules, luminaries, agents, standards, ADRs).
100
+ extract_yaml_tier() {
101
+ awk '
102
+ /^---$/ { c++; if (c == 2) exit; next }
103
+ c == 1 && /^tier:[[:space:]]/ {
104
+ sub(/^tier:[[:space:]]*/, "")
105
+ gsub(/[[:space:]]/, "")
106
+ print
107
+ exit
108
+ }
109
+ ' "$1"
110
+ }
111
+
112
+ # Extract tier from bash hook file # tier: header.
113
+ extract_hook_tier() {
114
+ grep -m1 -E '^#[[:space:]]*tier:[[:space:]]' "$1" 2>/dev/null \
115
+ | sed -E 's/^#[[:space:]]*tier:[[:space:]]*//' \
116
+ | sed -E 's/[[:space:]]*$//' \
117
+ || true
118
+ }
119
+
120
+ # Normalize `—` YAML escape to literal em-dash character. Closes
121
+ # bassclef-upstream#1548 — YAML frontmatter with double-quoted strings can
122
+ # carry `—` as a 6-char literal; jq preserves it as `\\u2014` in JSON
123
+ # output, which downstream renderers write verbatim into MDX. Adopters see
124
+ # raw `—` on the live site. Normalizing at extraction time lets jq
125
+ # emit the standard `—` JSON escape sequence, which parses cleanly to
126
+ # em-dash at every consumer.
127
+ normalize_em_dash() {
128
+ local val="$1"
129
+ echo "${val//\\u2014/—}"
130
+ }
131
+
132
+ # Extract description from markdown YAML frontmatter (first line of description: field).
133
+ extract_yaml_description() {
134
+ local val
135
+ val=$(awk '
136
+ /^---$/ { c++; if (c == 2) exit; next }
137
+ c == 1 && /^description:[[:space:]]/ {
138
+ sub(/^description:[[:space:]]*/, "")
139
+ sub(/^"/, "")
140
+ sub(/"$/, "")
141
+ sub(/^\047/, "")
142
+ sub(/\047$/, "")
143
+ print
144
+ exit
145
+ }
146
+ ' "$1")
147
+ normalize_em_dash "$val"
148
+ }
149
+
150
+ # Extract a `<field>:` inline YAML list from the frontmatter as a JSON array string.
151
+ # Handles shape `<field>: [foo, bar]` — bassclef's convention. Returns `[]` when absent or malformed.
152
+ _extract_yaml_inline_list() {
153
+ local file="$1" field="$2" raw
154
+ raw=$(awk -v f="$field" '
155
+ /^---$/ { c++; if (c == 2) exit; next }
156
+ c == 1 && $0 ~ ("^" f ":[[:space:]]*\\[") {
157
+ sub("^" f ":[[:space:]]*", "")
158
+ print
159
+ exit
160
+ }
161
+ ' "$file" 2>/dev/null)
162
+ if [[ -z "$raw" ]]; then
163
+ echo "[]"
164
+ return
165
+ fi
166
+ # Strip enclosing brackets, split on comma, trim, quote each, join. Always output valid JSON.
167
+ echo "$raw" | jq -Rc '
168
+ ltrimstr("[") | rtrimstr("]")
169
+ | split(",")
170
+ | map(sub("^\\s+"; "") | sub("\\s+$"; ""))
171
+ | map(select(length > 0))
172
+ ' 2>/dev/null || echo "[]"
173
+ }
174
+
175
+ extract_yaml_composes_with() {
176
+ _extract_yaml_inline_list "$1" "composes_with"
177
+ }
178
+
179
+ extract_yaml_depends_on() {
180
+ _extract_yaml_inline_list "$1" "depends_on"
181
+ }
182
+
183
+ # Per bassclef-web#268 — inputs + outputs read as inline YAML lists from
184
+ # frontmatter. Stage 1 = frontmatter-declared (deterministic). Stage 2 =
185
+ # body-section extraction (deferred per L169 awk-portability note).
186
+ extract_yaml_inputs() {
187
+ _extract_yaml_inline_list "$1" "inputs"
188
+ }
189
+
190
+ extract_yaml_outputs() {
191
+ _extract_yaml_inline_list "$1" "outputs"
192
+ }
193
+
194
+ # Extract a `<field>:` YAML string value from the frontmatter. Handles inline
195
+ # form `<field>: some text`. Multi-line block scalars (`|` / `>`) are not
196
+ # supported today — Feathers F3 single-line contract per goal 2026-09-07c.
197
+ # Returns empty string when the field is absent, quoting normalized like
198
+ # extract_yaml_description does.
199
+ _extract_yaml_string_field() {
200
+ local val
201
+ val=$(awk -v f="$2" '
202
+ /^---$/ { c++; if (c == 2) exit; next }
203
+ c == 1 && $0 ~ ("^" f ":[[:space:]]") {
204
+ sub("^" f ":[[:space:]]*", "")
205
+ sub(/^"/, "")
206
+ sub(/"$/, "")
207
+ sub(/^\047/, "")
208
+ sub(/\047$/, "")
209
+ print
210
+ exit
211
+ }
212
+ ' "$1")
213
+ normalize_em_dash "$val"
214
+ }
215
+
216
+ # Extract `problem:` frontmatter field per bassclef-web#268 + web#265 Stage 1
217
+ # (frontmatter-first path per Peirce disposition c on bassclef-upstream#1533).
218
+ # Skill-surface-only per Hoare H5 pre-mortem. Empty when absent — jq guard
219
+ # drops the key.
220
+ extract_yaml_problem() {
221
+ _extract_yaml_string_field "$1" "problem"
222
+ }
223
+
224
+ # Extract `value:` frontmatter field per bassclef-web#268 + web#265 Stage 1.
225
+ # Skill-surface-only per Hoare H5 pre-mortem. Empty when absent.
226
+ extract_yaml_value() {
227
+ _extract_yaml_string_field "$1" "value"
228
+ }
229
+
230
+ # Body-anchor extraction for problem + value deferred per bassclef-web#265
231
+ # Stage 2 note. Stage 1 awk section extraction proved non-deterministic
232
+ # across BSD (macOS) and GNU (Linux) awk implementations. Schema fields
233
+ # remain defined for Stage 2 hand-authored `data/skill-pitches.json`
234
+ # overrides. Frontmatter path above ships today (goal 2026-09-07c Step 3).
235
+ # See PR discussion on bassclef-upstream#1480.
236
+
237
+ # Extract description from bash hook file — first non-shebang, non-tier, non-metadata comment.
238
+ extract_hook_description() {
239
+ grep -E '^#' "$1" 2>/dev/null \
240
+ | grep -vE '^#!' \
241
+ | grep -vE '^#[[:space:]]*(tier|install-class|matcher|event|luminary|@)' \
242
+ | grep -vE '^#[[:space:]]*$' \
243
+ | head -1 \
244
+ | sed -E 's/^#[[:space:]]*//' \
245
+ | sed -E 's/[[:space:]]*$//' \
246
+ || true
247
+ }
248
+
249
+ sha256_file() {
250
+ $SHA_CMD "$1" | awk '{print "sha256:"$1}'
251
+ }
252
+
253
+ # --- emit entries for a single surface ---
254
+ # Args:
255
+ # $1 = surface type ("skill", "rule", etc.)
256
+ # $2 = tier extractor function name
257
+ # $3 = description extractor function name
258
+ # $4 = slug source ("dirname" | "basename" | "adr")
259
+ # $5+ = file paths (already expanded)
260
+ emit_entries() {
261
+ local surface_type="$1"; shift
262
+ local tier_fn="$1"; shift
263
+ local desc_fn="$1"; shift
264
+ local slug_from="$1"; shift
265
+
266
+ local f slug tier path hash desc
267
+ # Per #1295 — for standard/ultra manifests, ships derives as SUPERSET of
268
+ # lite. So standard includes {lite, standard}; ultra includes {lite, standard, ultra}.
269
+ # Adopters at a given tier see everything their tier plus lower tiers ship.
270
+ local include_lite=0 include_standard=0 include_ultra=0
271
+ case "$TARGET_TIER" in
272
+ lite) include_lite=1 ;;
273
+ standard) include_lite=1; include_standard=1 ;;
274
+ standard-pro) include_lite=1; include_standard=1 ;;
275
+ ultra) include_lite=1; include_standard=1; include_ultra=1 ;;
276
+ esac
277
+ for f in "$@"; do
278
+ [[ -f "$f" ]] || continue
279
+ # Skip TEMPLATE + Index files — scaffolding not real substrate;
280
+ # they carry uppercase slugs that violate schema pattern.
281
+ case "$(basename "$f")" in
282
+ TEMPLATE.md|ADR-Index.md) continue ;;
283
+ esac
284
+ tier=$("$tier_fn" "$f" || true)
285
+ case "$tier" in
286
+ lite) [[ "$include_lite" == "1" ]] || continue ;;
287
+ standard) [[ "$include_standard" == "1" ]] || continue ;;
288
+ standard-pro) [[ "$include_standard" == "1" ]] || continue ;;
289
+ ultra) [[ "$include_ultra" == "1" ]] || continue ;;
290
+ *) continue ;;
291
+ esac
292
+
293
+ case "$slug_from" in
294
+ dirname)
295
+ slug=$(basename "$(dirname "$f")")
296
+ ;;
297
+ adr)
298
+ slug=$(basename "$f" .md | sed -E 's/^ADR-//')
299
+ ;;
300
+ *)
301
+ slug=$(basename "$f")
302
+ slug="${slug%.md}"
303
+ slug="${slug%.sh}"
304
+ slug="${slug%.json}" # #1295 embedding entries
305
+ # Lowercase + normalize (schema pattern: ^[a-z0-9][a-z0-9-]*[a-z0-9]$)
306
+ slug=$(echo "$slug" | tr '[:upper:]' '[:lower:]' | sed -E 's/^ADR-//i' | sed -E 's/[^a-z0-9-]/-/g' | sed -E 's/^-+//;s/-+$//;s/-+/-/g')
307
+ ;;
308
+ esac
309
+
310
+ path="${f#$REPO_ROOT/}"
311
+ hash=$(sha256_file "$f")
312
+ desc=$("$desc_fn" "$f" || true)
313
+
314
+ # Extract additive graph fields per bassclef-web#104 partial.
315
+ # composes_with + depends_on read from YAML frontmatter via jq (deterministic).
316
+ # Every markdown surface with frontmatter carries these.
317
+ local composes_with_json="[]"
318
+ local depends_on_json="[]"
319
+ case "$surface_type" in
320
+ skill|rule|luminary|agent|standard|adr|template|root-doc)
321
+ composes_with_json=$(extract_yaml_composes_with "$f" 2>/dev/null || echo "[]")
322
+ depends_on_json=$(extract_yaml_depends_on "$f" 2>/dev/null || echo "[]")
323
+ ;;
324
+ esac
325
+
326
+ # inputs + outputs + problem + value are skill-surface-only per Hoare H5
327
+ # pre-mortem (docs/risk-ledgers/2026-09-07c-lite-manifest-schema-extractor-
328
+ # backfill-ledger.md). Other surfaces (rules, luminaries, etc) do not
329
+ # semantically carry "what to feed" / "what comes back" — they are steering,
330
+ # not tool-like. Per goal 2026-09-07c Step 3.
331
+ local inputs_json="[]"
332
+ local outputs_json="[]"
333
+ local problem=""
334
+ local value=""
335
+ if [ "$surface_type" = "skill" ]; then
336
+ inputs_json=$(extract_yaml_inputs "$f" 2>/dev/null || echo "[]")
337
+ outputs_json=$(extract_yaml_outputs "$f" 2>/dev/null || echo "[]")
338
+ problem=$(extract_yaml_problem "$f" 2>/dev/null || true)
339
+ value=$(extract_yaml_value "$f" 2>/dev/null || true)
340
+ fi
341
+
342
+ jq -c -n \
343
+ --arg slug "$slug" \
344
+ --arg type "$surface_type" \
345
+ --arg path "$path" \
346
+ --arg tier "$tier" \
347
+ --arg hash "$hash" \
348
+ --arg desc "${desc:-}" \
349
+ --arg problem "${problem:-}" \
350
+ --arg value "${value:-}" \
351
+ --argjson composes_with "${composes_with_json:-[]}" \
352
+ --argjson depends_on "${depends_on_json:-[]}" \
353
+ --argjson inputs "${inputs_json:-[]}" \
354
+ --argjson outputs "${outputs_json:-[]}" \
355
+ '{slug:$slug, type:$type, path:$path, tier:$tier, content_hash:$hash}
356
+ + (if $desc == "" then {} else {description:$desc} end)
357
+ + (if ($composes_with | length) == 0 then {} else {composes_with:$composes_with} end)
358
+ + (if ($depends_on | length) == 0 then {} else {depends_on:$depends_on} end)
359
+ + (if ($inputs | length) == 0 then {} else {inputs:$inputs} end)
360
+ + (if ($outputs | length) == 0 then {} else {outputs:$outputs} end)
361
+ + (if $problem == "" then {} else {problem:$problem} end)
362
+ + (if $value == "" then {} else {value:$value} end)'
363
+ done
364
+ }
365
+
366
+ # --- collect entries from 13 surfaces per #1392 Shape 3 (goal 2026-08-27a) ---
367
+ # Original 8 (7 doc + 1 embedding per #1295 Step 5) plus 5 new install surfaces:
368
+ # lib (lib/*.sh) + script (scripts/*.sh) + presence-template (presence/install/*)
369
+ # + template (templates/*.md) + root-doc (root-level *.md)
370
+ # The extension makes the manifest the definitive install list for bassclef-cli.
371
+ # Note: `readarray` is bash 4.0+; macOS ships bash 3.2. Use while-read loop.
372
+ STANDARDS_FILES=()
373
+ while IFS= read -r f; do
374
+ STANDARDS_FILES+=("$f")
375
+ done < <(find "$REPO_ROOT/standards" -type f -name '*.md' | sort)
376
+
377
+ # Embedding files (JSON) — per #1295 Step 5; ultra tier ships Voyage vectors
378
+ EMBEDDING_FILES=()
379
+ while IFS= read -r f; do
380
+ EMBEDDING_FILES+=("$f")
381
+ done < <(find "$REPO_ROOT/.claude/embeddings" -type f -name '*.json' 2>/dev/null | sort)
382
+
383
+ # Lib files (bash) — per #1392 Shape 3; adopter runtime needs lib/state.sh + lib/hook-inject.sh etc
384
+ LIB_FILES=()
385
+ while IFS= read -r f; do
386
+ LIB_FILES+=("$f")
387
+ done < <(find "$REPO_ROOT/lib" -maxdepth 1 -type f -name '*.sh' 2>/dev/null | sort)
388
+
389
+ # Script files (bash) — per #1392 Shape 3; adopter runtime needs scripts/bassclef-*.sh helpers
390
+ SCRIPT_FILES=()
391
+ while IFS= read -r f; do
392
+ SCRIPT_FILES+=("$f")
393
+ done < <(find "$REPO_ROOT/scripts" -maxdepth 1 -type f -name '*.sh' 2>/dev/null | sort)
394
+
395
+ # Presence templates (bash + md) — per #1392 Shape 3; adopter install dispatches through these
396
+ PRESENCE_TEMPLATE_SH_FILES=()
397
+ while IFS= read -r f; do
398
+ PRESENCE_TEMPLATE_SH_FILES+=("$f")
399
+ done < <(find "$REPO_ROOT/presence/install" -maxdepth 1 -type f -name '*.sh' 2>/dev/null | sort)
400
+
401
+ PRESENCE_TEMPLATE_MD_FILES=()
402
+ while IFS= read -r f; do
403
+ PRESENCE_TEMPLATE_MD_FILES+=("$f")
404
+ done < <(find "$REPO_ROOT/presence/install" -maxdepth 1 -type f -name '*.md' 2>/dev/null | sort)
405
+
406
+ # Templates (md) — per #1392 Shape 3; chronicle-template + iteration-goal etc adopters copy
407
+ TEMPLATE_FILES=()
408
+ while IFS= read -r f; do
409
+ TEMPLATE_FILES+=("$f")
410
+ done < <(find "$REPO_ROOT/templates" -maxdepth 1 -type f -name '*.md' 2>/dev/null | sort)
411
+
412
+ # Root docs (md) — per #1392 Shape 3; README + CLAUDE + AGENTS adopters read on install
413
+ ROOT_DOC_FILES=()
414
+ while IFS= read -r f; do
415
+ ROOT_DOC_FILES+=("$f")
416
+ done < <(find "$REPO_ROOT" -maxdepth 1 -type f -name '*.md' 2>/dev/null | sort)
417
+
418
+ # Extract tier from JSON root-key `"tier"` or `"_tier"` — per #1295
419
+ extract_json_tier() {
420
+ head -5 "$1" 2>/dev/null | awk '
421
+ /"tier"[[:space:]]*:[[:space:]]*"/ {
422
+ match($0, /"tier"[[:space:]]*:[[:space:]]*"[^"]+"/)
423
+ v=substr($0, RSTART, RLENGTH)
424
+ sub(/^"tier"[[:space:]]*:[[:space:]]*"/,"",v); sub(/"$/,"",v)
425
+ print v; exit
426
+ }
427
+ /"_tier"[[:space:]]*:[[:space:]]*"/ {
428
+ match($0, /"_tier"[[:space:]]*:[[:space:]]*"[^"]+"/)
429
+ v=substr($0, RSTART, RLENGTH)
430
+ sub(/^"_tier"[[:space:]]*:[[:space:]]*"/,"",v); sub(/"$/,"",v)
431
+ print v; exit
432
+ }'
433
+ }
434
+
435
+ # Embeddings have no description field; return empty
436
+ extract_json_description() {
437
+ echo ""
438
+ }
439
+
440
+ ENTRIES_JSON=$(
441
+ {
442
+ emit_entries "skill" extract_yaml_tier extract_yaml_description dirname "$REPO_ROOT/.claude/skills/"*/SKILL.md
443
+ emit_entries "rule" extract_yaml_tier extract_yaml_description basename "$REPO_ROOT/.claude/rules/"*.md
444
+ emit_entries "hook" extract_hook_tier extract_hook_description basename "$REPO_ROOT/.claude/hooks/"*.sh
445
+ emit_entries "luminary" extract_yaml_tier extract_yaml_description basename "$REPO_ROOT/.claude/luminaries/"*.md
446
+ emit_entries "agent" extract_yaml_tier extract_yaml_description basename "$REPO_ROOT/.claude/agents/"*.md
447
+ emit_entries "standard" extract_yaml_tier extract_yaml_description basename "${STANDARDS_FILES[@]}"
448
+ emit_entries "adr" extract_yaml_tier extract_yaml_description adr "$REPO_ROOT/architecture/decisions/"ADR-*.md
449
+ if [[ ${#EMBEDDING_FILES[@]} -gt 0 ]]; then
450
+ emit_entries "embedding" extract_json_tier extract_json_description basename "${EMBEDDING_FILES[@]}"
451
+ fi
452
+ # Per #1392 Shape 3 — 5 new install surfaces for bassclef-cli
453
+ if [[ ${#LIB_FILES[@]} -gt 0 ]]; then
454
+ emit_entries "lib" extract_hook_tier extract_hook_description basename "${LIB_FILES[@]}"
455
+ fi
456
+ if [[ ${#SCRIPT_FILES[@]} -gt 0 ]]; then
457
+ emit_entries "script" extract_hook_tier extract_hook_description basename "${SCRIPT_FILES[@]}"
458
+ fi
459
+ if [[ ${#PRESENCE_TEMPLATE_SH_FILES[@]} -gt 0 ]]; then
460
+ emit_entries "presence-template" extract_hook_tier extract_hook_description basename "${PRESENCE_TEMPLATE_SH_FILES[@]}"
461
+ fi
462
+ if [[ ${#PRESENCE_TEMPLATE_MD_FILES[@]} -gt 0 ]]; then
463
+ emit_entries "presence-template" extract_yaml_tier extract_yaml_description basename "${PRESENCE_TEMPLATE_MD_FILES[@]}"
464
+ fi
465
+ if [[ ${#TEMPLATE_FILES[@]} -gt 0 ]]; then
466
+ emit_entries "template" extract_yaml_tier extract_yaml_description basename "${TEMPLATE_FILES[@]}"
467
+ fi
468
+ if [[ ${#ROOT_DOC_FILES[@]} -gt 0 ]]; then
469
+ emit_entries "root-doc" extract_yaml_tier extract_yaml_description basename "${ROOT_DOC_FILES[@]}"
470
+ fi
471
+ } | jq -s 'sort_by(.type, .slug)'
472
+ )
473
+
474
+ ENTRY_COUNT=$(echo "$ENTRIES_JSON" | jq 'length')
475
+
476
+ if [[ "$ENTRY_COUNT" -lt 1 ]]; then
477
+ echo "generate-tier-manifest: no entries found for tier '$TARGET_TIER' (schema requires minItems: 1)" >&2
478
+ exit 2
479
+ fi
480
+
481
+ # --- assemble manifest ---
482
+ # Includes tier root-key per #1295 — the manifest itself carries its own tier tag
483
+ # so tier-tag-required-at-write.sh recognizes it. Per Saltzer-Schroeder complete
484
+ # mediation — no derived artifact escapes the tier system.
485
+ MANIFEST_JSON=$(jq -n \
486
+ --arg tier "$TARGET_TIER" \
487
+ --arg mv "$MANIFEST_VERSION" \
488
+ --arg ga "$GENERATED_AT" \
489
+ --argjson entries "$ENTRIES_JSON" \
490
+ '{tier:$tier, manifest_version:$mv, generated_at:$ga, entries:$entries}')
491
+
492
+ # Per bassclef-upstream#1508 Cure a: upstream_commit dropped from manifest
493
+ # content. Every rebase over a merged sibling PR guaranteed a conflict
494
+ # because the hash changes per parent. Traceability now comes from git
495
+ # log on the manifest file itself. `generated_at` still causes minor
496
+ # timestamp conflicts but is human-scannable; drop deferred if the class
497
+ # still recurs.
498
+
499
+ # --- emit ---
500
+ if [[ "$DRY_RUN" == "1" ]]; then
501
+ echo "$MANIFEST_JSON"
502
+ else
503
+ echo "$MANIFEST_JSON" > "$OUTPUT_PATH"
504
+ echo "Wrote $OUTPUT_PATH ($ENTRY_COUNT entries; commit ${UPSTREAM_COMMIT:0:7})" >&2
505
+ fi
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env bash
2
+ # tier: lite
3
+ # generate-tier-manifest.sh — thin wrapper over generate-lite-manifest.sh
4
+ # for the tier-agnostic API per bassclef-upstream#1295.
5
+ #
6
+ # generate-lite-manifest.sh keeps its historical name for backward compat.
7
+ # This wrapper exposes the new API: `generate-tier-manifest.sh <tier>`.
8
+ #
9
+ # Usage:
10
+ # bash scripts/generate-tier-manifest.sh lite # writes lite-manifest.json
11
+ # bash scripts/generate-tier-manifest.sh standard # writes standard-manifest.json (superset of lite)
12
+ # bash scripts/generate-tier-manifest.sh ultra # writes ultra-manifest.json (superset of lite + standard)
13
+ # bash scripts/generate-tier-manifest.sh <tier> --dry-run
14
+ #
15
+ # Per #1295 body L23 — standard + ultra manifests derived as supersets of lite.
16
+
17
+ set -euo pipefail
18
+
19
+ if [ $# -lt 1 ]; then
20
+ echo "usage: $0 <tier> [--dry-run] [--output PATH] [--root PATH]" >&2
21
+ echo " tier: lite | standard | ultra | standard-pro" >&2
22
+ exit 1
23
+ fi
24
+
25
+ TIER="$1"; shift
26
+
27
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
28
+ exec bash "${SCRIPT_DIR}/generate-lite-manifest.sh" --tier "$TIER" "$@"