Files
marketplaces/docs/PACKAGE-EXTRACTION.md
sdarbinyan 551a22a245
Some checks failed
Architecture Governance / architecture (push) Has been cancelled
fix: install shared packages over git, unbreaking CI
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>
2026-08-18 02:08:05 +04:00

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 to main, two jobs:
    • release-branches (matrix over auth/payment): builds each package and force-pushes its output to release/<pkg>. Skips cleanly when nothing changed.
    • version-pr: opens/updates a "Version Packages" PR when unreleased changesets exist. Merging it bumps versions on main, 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.