The Verdaccio registry introduced earlier is unreachable from CI (listens on 127.0.0.1:4873 behind a firewall allowing only 80/443/SSH), which broke the architecture-governance workflow - its npm ci step could no longer resolve @marketplaces/auth. Packages are now published to git release branches (release/auth, release/payment in vitanovaPackages) whose root is the package itself, and installed with git+<repo>#release/auth. No registry, token, tunnel, or CI secret - anonymous git read is enough. - package.json: git dependency; .npmrc removed (no scope mapping needed) - vitanovaPackages release.yml rebuilt to force-push release branches - ADR-0001 amended with the distribution change and why the registry lost - BACKEND-HANDOFF: added the multi-tenancy section (hostname -> tenantKey -> per-tenant bootstrap config), corrected the install and deploy notes, and recorded that no CD pipeline exists - PACKAGE-EXTRACTION / PACKAGES-USAGE rewritten for the git-branch flow Verified: npm ci, arch:check:boundaries, ng build, 103/103 tests, all with no credentials configured. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
4.2 KiB
@marketplaces/auth & @marketplaces/payment — build, version, release, infrastructure
See ADR-0001 for why. This doc is the how. For consuming the packages (install, DI providers, exported API), see PACKAGES-USAGE.md.
Current state
Working end to end with no credentials. marketplaces has no local copy of either package and no .npmrc — it installs @marketplaces/auth directly over git. A fresh clone plus npm install builds and tests green on any machine or CI runner.
1. Source repo
sources.vitanova.network/sdarbinyan/vitanovaPackages — npm workspaces monorepo, packages/auth + packages/payment, source on main.
2. How releases work
npm cannot install a subdirectory of a git repo, so each package is published to its own release branch where the repo root is the package: release/auth, release/payment. Each contains only package.json, the built dist/, and a generated README.
"@marketplaces/auth": "git+https://sources.vitanova.network/sdarbinyan/vitanovaPackages.git#release/auth"
This was chosen over a registry because it needs nothing: no npm registry, no token, no tunnel, no CI secret. Anonymous git read is the only requirement, which is what makes CI and fresh clones work unattended.
release/* branches are generated and force-pushed. Never commit to them by hand.
3. Versioning
Changesets. A PR that changes a package adds a changeset file (npx changeset at the repo root — pick package, bump type, one-line description). ci.yml rejects PRs without one.
4. CI/CD (vitanovaPackages)
ci.yml— on PRs and non-main pushes: install, build, test, require a changeset.release.yml— on push tomain, two jobs:release-branches(matrix overauth/payment): builds each package and force-pushes its output torelease/<pkg>. Skips cleanly when nothing changed.version-pr: opens/updates a "Version Packages" PR when unreleased changesets exist. Merging it bumps versions onmain, which re-triggers the release.
Only the checkout token is needed — no secrets to configure.
Workflows use GitHub Actions syntax; Gitea/Forgejo Actions are compatible. Other CI needs translating (steps are: install, build, test, force-push a branch).
5. The Verdaccio registry (superseded, still running)
A private Verdaccio instance runs on the dev server: Docker container verdaccio, port 4873, config and storage at /srv/marketplaces/verdaccio/, registry user marketplaces-ci. It holds @marketplaces/auth@0.1.0 and @marketplaces/payment@0.1.0.
Nothing uses it. It was the original plan, but it listens on 127.0.0.1:4873 and the server firewall allows only 80/443/SSH — so no CI runner and no developer could reach it without an SSH tunnel, which defeats the point. The git-release-branch approach (§2) replaced it.
Keep it or remove it; no code or workflow depends on it. To reach it manually:
ssh -L 4873:127.0.0.1:4873 seto@213.21.246.138
Making it the primary path again would need a reverse proxy through nginx plus TLS (no certificate exists on that box), or an open port carrying credentials over plain HTTP — neither is done, and neither is necessary now.
6. Migration status
Auth: done. @marketplaces/auth holds the real implementation — telegram/ (live QR/session auth, customer + admin) and ed25519/ (challenge/response admin auth, backend not shipped). Environment coupling was replaced with AUTH_API_URL/TELEGRAM_BOT_USERNAME injection tokens; environment.production became Angular's isDevMode(). AdminPermissionsService and requireAdminPermission stayed in marketplaces (core/admin-auth/) — they read this app's mock Users domain, not a portable auth concern. All ~30 call sites import from the package; the old in-app auth files are deleted. Build, boundary checks, and 103/103 tests pass.
Payment: not started. core/finance/core/pricing still live in marketplaces. @marketplaces/payment is published as an empty scaffold and is not a dependency of anything.