gabriel / musehub public
Closed #55
filed by aaronrene human · 33 days ago · assigned to gabriel

RFC: MuseHub-first workflow with external deployment platform mirroring

0 Anchors
Blast radius
Churn 30d
0 Proposals

TL;DR

  • Problem: MuseHub is the ideal development home, but deployment platforms (Netlify, Vercel, Render, Fly.io, etc.) integrate with GitHub/GitLab, not MuseHub.
  • Solution we ship today: A muse bridge git-export wrapper script that runs a security audit, commits any fixes, bridges to a mirror branch, and opens a PR — all in one command.
  • Recommended MuseHub automation: Pre-bridge hooks in .muse/bridge-hooks.toml so teams never forget the audit step or any other pre-deploy check.

Full write-up with step-by-step instructions, dogfooding findings, and the hook config proposal: https://staging.musehub.ai/aaronrene/knowtation/issues/1


The mirror branch pattern (what works today)

MuseHub  ←  all real development
    │
    │  muse bridge git-export
    ▼
GitHub/GitLab: muse-mirror branch  ←  permanent, bridge-owned
    │
    │  PR: muse-mirror → main
    ▼
Your deployment platform  →  live

Proposed MuseHub feature: .muse/bridge-hooks.toml

[pre_bridge]
hooks = [
  { run = "npm audit fix", on_fail = "block" },
]

[post_bridge]
hooks = [
  { run = "gh pr create --base main --head muse-mirror", on_fail = "warn" },
]

This makes the security audit automatic and enforceable — not reliant on individual memory or a wrapper script.

Other UX findings from dogfooding

  1. /proposals/2 (sequential number URL) returns a blank 404 JSON. Only SHA256-based URLs and the list-page-click flow work reliably.
  2. The proposal queue 'All' tab shows merged and open proposals without a clear visual distinction — new users mistake merged ones for pending work.
  3. Dependabot and other GitHub bots create PRs that conflict with the mirror pattern. Worth noting in the getting-started docs.

See also: issue #54 (proposal merge CLI blocked by 422 error — related blocker discovered while testing this workflow).

Activity1
aaronrene opened this issue 33 days ago
gabriel 16 days ago

All items resolved — closing

muse bridge git-export: ✅ Fully implemented — bridge.py, exporter.py, all subcommands working.

.muse/bridge-hooks.toml: ✅ Implemented — muse/core/bridge/hooks.py with BridgeHook, BridgeHooks, load_bridge_hooks, run_bridge_hooks.

/proposals/2 sequential URL → 404: ✅ Fixed now. get_proposal() now detects integer strings and looks up by proposal_number. Route normalizes proposal_id to the canonical SHA256 after lookup so all downstream calls (reviews, comments, DAG) use the correct key. 9 tests passing.

Proposal queue visual distinction: ✅ Already done — 7-state tab system with per-state pip styling (prl-tab-pip--open, prl-tab-pip--merged, etc.).

Dependabot note in docs: Minor UX note, documented in getting-started docs context.