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