Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

81 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Scratchpad — Modular Dependency Slices (Billing ↔ Clients)
- Plan folder: `ee/docs/plans/2026-01-20-modularity-dependency-slices/`
- Date started: `2026-01-20`
## Current State (Discovery)
- There is an active effort to break a circular dependency between `@alga-psa/billing` and `@alga-psa/clients`.
- Temporary mitigation already introduced: dynamic import wrappers in billing:
- `packages/billing/src/lib/clientsHelpers.ts`
- Used by billing backend (e.g. `packages/billing/src/services/invoiceService.ts`) and billing UI (e.g. `packages/billing/src/components/billing-dashboard/BillingCycles.tsx`).
- There is also a clients→billing dynamic import:
- `packages/clients/src/actions/clientContractActions.ts` dynamically imports `@alga-psa/billing/models/contract` to call `checkAndReactivateExpiredContract(...)`.
## Goal
Replace dynamic-import “escape hatches” with a new shared slice so dependencies flow down:
- `billing``shared-cross-slice`
- `clients``shared-cross-slice`
- No `billing``clients` imports.
## Candidate “Cross Slice” Responsibilities
- Client contract assignment APIs (create/update/get/list) currently in clients but used by billing screens.
- Client lookup APIs used by billing screens (paginated + billing-cycle-range filtered).
- Default client tax region lookup currently in clients but used by billing invoice generation.
- Contract reactivation logic currently in billing contract model but invoked from clients.
## Decisions (Pending)
### Confirmed
- “Cross-dependencies” live in the existing lower slice `@alga-psa/shared` (not a new domain package).
- Move `ClientPicker` into `@alga-psa/ui` as part of this effort.
- Keep “default client tax region lookup” in `@alga-psa/shared` for now (no separate tax slice in this scope).
- Move contract reactivation-on-assignment-update logic into `@alga-psa/shared` so no billing import is needed from clients/shared.
- Pragmatic rule: limited *copying* of code is allowed to break dependencies without exploding package boundaries; if the same logic is copied >4 times, centralize it.
### Still open
- Exact `@alga-psa/shared` export/module path for these APIs (chosen: `@alga-psa/shared/billingClients`).
## Notes / Commands
- Find remaining billing imports of clients: `rg -n \"@alga-psa/clients\" packages/billing/src`
- Find remaining clients imports of billing: `rg -n \"@alga-psa/billing\" packages/clients/src`
- Existing plan folder format example: `ee/docs/plans/2026-01-09-billing-cycle-anchors/`
- Some code duplication and intentional copying is permissible if it simplifies modularization. We should be pragmatic!
## Scope Adjustment (2026-01-20)
- Validation focus: **build/typecheck checks only** to ensure deterministic builds and a clean dependency graph. Comprehensive new business-logic tests are intentionally deferred for this effort.
## Build Gotcha (2026-01-20)
- `npm run build` was failing in `server/src/invoice-templates/assemblyscript` because the installed `assemblyscript@0.27.36` package was missing its `dist/` folder (so `bin/asc.js` could not import `../dist/asc.js`).
- Fix: pin `assemblyscript` to the local tarball `assemblyscript-0.27.36.tgz` and run `npm install` with a repo-local cache (`--cache ../../../../.npm-cache`) to avoid global npm cache permission issues.
## Nx Cycle Follow-up (2026-01-20)
- `nx run-many -t build` revealed an additional cycle: `auth -> ui -> onboarding -> licensing -> auth`.
- Root cause: `@alga-psa/ui` contained onboarding-specific UI (wizard + dashboard onboarding widgets) and imported `@alga-psa/onboarding`.
- Fix: move onboarding-specific UI into `@alga-psa/onboarding` and keep `@alga-psa/ui` limited to shared UI primitives (wizard chrome, shared components).
- Also moved the onboarding wizard data shape (`WizardData`, etc.) down into `@alga-psa/types` to avoid `tenancy <-> onboarding` cycles.
## Nx Cycle Follow-up — UI Vertical Imports (2026-01-20)
- Additional cycle observed: `... -> auth -> ui -> tenancy -> client-portal -> clients -> ui`.
- Root cause: `@alga-psa/ui` contains multiple “feature” components that import vertical slice actions/components, including:
- `@alga-psa/tenancy/actions` (branding + locale + tenant settings UIs)
- `@alga-psa/users/actions` (user settings/profile/admin UIs; mentions search in editor; notification dropdown user lookup)
- `@alga-psa/clients/actions` and `@alga-psa/clients/components` (settings and activity UIs)
- `@alga-psa/client-portal/*` (domain settings entry, invitation flows)
- Fix strategy: move those “feature” components out of `@alga-psa/ui` into the owning vertical slice (e.g. `users`, `tenancy`, `client-portal`) or into top-level app (`server`), leaving `@alga-psa/ui` as pure, reusable UI primitives only.
## Nx Tooling Note (2026-01-20)
- On this worktree, `npx nx ...` frequently hangs while “Calculating the project graph on the Nx Daemon” under `node v25.1.0`, and `NX_DAEMON=false` can fail with `Failed to start plugin worker.`.
- Mitigation: the repo now pins Node to a supported range via `.nvmrc` (`20`) and root `package.json` `engines` (`>=20 <25`).
- Validation for this effort therefore relies on:
- package typechecks (`tsc --noEmit`) for touched packages, and
- import-greps confirming the key layering breaks (e.g. no `@alga-psa/ui` imports of `@alga-psa/tenancy|users|clients|client-portal`).
## Build Fixes (2026-01-20)
- Added CE stub component for EE policy settings so `server:build` can typecheck:
- `server/src/empty/components/settings/policy/PolicyManagement.tsx`
- Fixed CE build typing for Temporal runner factory:
- `server/src/lib/jobs/JobRunnerFactory.ts` casts the dynamically-imported `TemporalJobRunner` to `IJobRunner` (CE stubs dont structurally match the server interface).
- Made Nx build fully offline-friendly by avoiding networked installs during sample component builds:
- `sdk/samples/component/secrets-demo/package.json` uses `alga build --skip-install`.
- Fixed `workflow-worker:build` in CE by resolving `@ee/*` imports to the `@alga-psa/ee-stubs` sources instead of `server/src/empty`:
- `services/workflow-worker/tsconfig.json` maps `@ee/*``packages/ee/src/*`.