@@ -20,6 +20,13 @@ YAML_FIXTURES := $(shell find tests/fixtures -type f \( -name '*.yaml' -o -name
2020SCHEMA_ARTIFACT_VERSION := $(shell tr -d '\r\n' < SCHEMA_VERSION)
2121SCHEMA_FILE := schemas/envgen.schema.v$(SCHEMA_ARTIFACT_VERSION ) .json
2222VERSION_BUMP_SCRIPT := scripts/version_bump.py
23+ HOMEBREW_TAP_SCRIPT := scripts/homebrew/tap_release.py
24+ HOMEBREW_SOURCE_REPO ?= smorinlabs/envgen
25+ HOMEBREW_TAP_REPO ?= smorinlabs/homebrew-tap
26+ HOMEBREW_TAP_REPO_DIR ?= /Users/stevemorin/c/homebrew-tap
27+ HOMEBREW_TAP_FORMULA ?= Formula/envgen.rb
28+ HOMEBREW_SOURCE_JSON ?= $(CURDIR ) /.homebrew/source-$(TAG ) .json
29+ TAP_REPO_DIR ?= $(HOMEBREW_TAP_REPO_DIR )
2330
2431# ─── Build & Test ────────────────────────────────────────────────
2532
@@ -351,6 +358,97 @@ tag-schema: ## Create local schema tag schema-vA.B.C (SCHEMA_VERSION can overrid
351358push-tag-schema : # # Push schema tag schema-vA.B.C to origin (SCHEMA_VERSION can override file-derived value)
352359 SCHEMA_VERSION=" $( SCHEMA_VERSION) " python3 $(VERSION_BUMP_SCRIPT ) push-tag-schema $(if $(DRY_RUN ) ,--dry-run,)
353360
361+ # ─── Homebrew Tap Release ───────────────────────────────────────
362+
363+ .PHONY : homebrew-status
364+ homebrew-status : # # Show Homebrew release/tap status for TAG=vX.Y.Z
365+ @if [ -z " $( TAG) " ]; then \
366+ echo " ERROR: TAG is required (example: make homebrew-status TAG=v1.0.0)" ; \
367+ exit 1; \
368+ fi
369+ python3 $(HOMEBREW_TAP_SCRIPT ) status \
370+ --tag " $( TAG) " \
371+ --source-repo " $( HOMEBREW_SOURCE_REPO) " \
372+ --source-json " $( HOMEBREW_SOURCE_JSON) " \
373+ --tap-repo " $( HOMEBREW_TAP_REPO) " \
374+ --tap-repo-dir " $( HOMEBREW_TAP_REPO_DIR) " \
375+ --formula-path " $( HOMEBREW_TAP_FORMULA) "
376+
377+ .PHONY : homebrew-source
378+ homebrew-source : # # Download and hash source tarball for TAG=vX.Y.Z
379+ @if [ -z " $( TAG) " ]; then \
380+ echo " ERROR: TAG is required (example: make homebrew-source TAG=v1.0.0)" ; \
381+ exit 1; \
382+ fi
383+ python3 $(HOMEBREW_TAP_SCRIPT ) resolve-source \
384+ --tag " $( TAG) " \
385+ --source-repo " $( HOMEBREW_SOURCE_REPO) " \
386+ --out-json " $( HOMEBREW_SOURCE_JSON) "
387+
388+ .PHONY : homebrew-sync-formula
389+ homebrew-sync-formula : # # Sync tap formula from source metadata (TAG=vX.Y.Z TAP_REPO_DIR=/path/to/homebrew-tap)
390+ @if [ -z " $( TAG) " ]; then \
391+ echo " ERROR: TAG is required (example: make homebrew-sync-formula TAG=v1.0.0 TAP_REPO_DIR=/path/to/homebrew-tap)" ; \
392+ exit 1; \
393+ fi
394+ @if [ -z " $( TAP_REPO_DIR) " ]; then \
395+ echo " ERROR: TAP_REPO_DIR is required" ; \
396+ exit 1; \
397+ fi
398+ python3 $(HOMEBREW_TAP_SCRIPT ) sync-formula \
399+ --tag " $( TAG) " \
400+ --formula-path " $( TAP_REPO_DIR) /$( HOMEBREW_TAP_FORMULA) " \
401+ --source-json " $( HOMEBREW_SOURCE_JSON) " \
402+ $(if $(DRY_RUN ) ,--dry-run,)
403+
404+ .PHONY : homebrew-verify-formula
405+ homebrew-verify-formula : # # Run brew style/audit/install/test on tap formula (TAG=vX.Y.Z TAP_REPO_DIR=/path/to/homebrew-tap)
406+ @if [ -z " $( TAG) " ]; then \
407+ echo " ERROR: TAG is required (example: make homebrew-verify-formula TAG=v1.0.0 TAP_REPO_DIR=/path/to/homebrew-tap)" ; \
408+ exit 1; \
409+ fi
410+ @if [ -z " $( TAP_REPO_DIR) " ]; then \
411+ echo " ERROR: TAP_REPO_DIR is required" ; \
412+ exit 1; \
413+ fi
414+ python3 $(HOMEBREW_TAP_SCRIPT ) verify-formula \
415+ --tag " $( TAG) " \
416+ --tap-repo-dir " $( TAP_REPO_DIR) " \
417+ --tap-repo " $( HOMEBREW_TAP_REPO) " \
418+ --formula-path " $( HOMEBREW_TAP_FORMULA) "
419+
420+ .PHONY : homebrew-open-tap-pr
421+ homebrew-open-tap-pr : # # Open/update tap PR for TAG=vX.Y.Z (requires GH auth; TAP_REPO_DIR=/path/to/homebrew-tap)
422+ @if [ -z " $( TAG) " ]; then \
423+ echo " ERROR: TAG is required (example: make homebrew-open-tap-pr TAG=v1.0.0 TAP_REPO_DIR=/path/to/homebrew-tap)" ; \
424+ exit 1; \
425+ fi
426+ @if [ -z " $( TAP_REPO_DIR) " ]; then \
427+ echo " ERROR: TAP_REPO_DIR is required" ; \
428+ exit 1; \
429+ fi
430+ python3 $(HOMEBREW_TAP_SCRIPT ) open-pr \
431+ --tag " $( TAG) " \
432+ --tap-repo " $( HOMEBREW_TAP_REPO) " \
433+ --tap-repo-dir " $( TAP_REPO_DIR) " \
434+ --formula-path " $( HOMEBREW_TAP_FORMULA) " \
435+ $(if $(DRY_RUN ) ,--dry-run,)
436+
437+ .PHONY : homebrew-release-tap
438+ homebrew-release-tap : # # End-to-end tap release flow (TAG=vX.Y.Z TAP_REPO_DIR=/path/to/homebrew-tap)
439+ @if [ -z " $( TAG) " ]; then \
440+ echo " ERROR: TAG is required (example: make homebrew-release-tap TAG=v1.0.0 TAP_REPO_DIR=/path/to/homebrew-tap)" ; \
441+ exit 1; \
442+ fi
443+ @if [ -z " $( TAP_REPO_DIR) " ]; then \
444+ echo " ERROR: TAP_REPO_DIR is required" ; \
445+ exit 1; \
446+ fi
447+ $(MAKE ) homebrew-source TAG=" $( TAG) " HOMEBREW_SOURCE_JSON=" $( HOMEBREW_SOURCE_JSON) " HOMEBREW_SOURCE_REPO=" $( HOMEBREW_SOURCE_REPO) "
448+ $(MAKE ) homebrew-sync-formula TAG=" $( TAG) " TAP_REPO_DIR=" $( TAP_REPO_DIR) " HOMEBREW_SOURCE_JSON=" $( HOMEBREW_SOURCE_JSON) " HOMEBREW_TAP_FORMULA=" $( HOMEBREW_TAP_FORMULA) " $(if $(DRY_RUN ) ,DRY_RUN=$(DRY_RUN ) ,)
449+ $(MAKE ) homebrew-verify-formula TAG=" $( TAG) " TAP_REPO_DIR=" $( TAP_REPO_DIR) " HOMEBREW_TAP_FORMULA=" $( HOMEBREW_TAP_FORMULA) "
450+ $(MAKE ) homebrew-open-tap-pr TAG=" $( TAG) " TAP_REPO_DIR=" $( TAP_REPO_DIR) " HOMEBREW_TAP_REPO=" $( HOMEBREW_TAP_REPO) " HOMEBREW_TAP_FORMULA=" $( HOMEBREW_TAP_FORMULA) " $(if $(DRY_RUN ) ,DRY_RUN=$(DRY_RUN ) ,)
451+
354452# ─── Commit Message ──────────────────────────────────────────────
355453
356454CLAUDE ?= claude
0 commit comments