Repository navigation
v1.0.0
Version 1.0.0 is the first release of the starter under the fork-distribution model, and it consolidates everything merged since 1.0.0-beta.3. It replaces .env files with a validated environment contract, completes the password flows, adds a user detail page, a public landing page and end-to-end coverage of the reference app, and makes the dashboard usable on phones. Many of these changes ask something of every fork: read Fork migration below before merging.
The first area is environment configuration. Every backend variable is now declared in one of six Zod-validated schemas under src/api/config/ and read through a <domain>Env object such as dbEnv.PG_CONNECTION_STRING; a missing or invalid value stops the process at start-up with a clear message (#354). The work landed in steps: configuration is injected where tests need other values (#440), every production read moves to the new objects (#441), the database scripts and drizzle-kit read them too (#442), and the old validation code is removed (#443). A lint rule now rejects any other process.env read (#444), and a guard fails the commit hook and npm run ci when a .env* file is in the tree (#354). @resetshop/hono-core no longer carries app-specific configuration (#258). The token-cleanup interval is now a duration string such as 24h, like the other time settings (#259), and the production build no longer fails because a rate limiter read the configuration too early (#450).
The second is authentication. Users flagged to change their password are sent to a change-password page before they reach the dashboard (#388). A user who forgot their password can request a single-use reset link by email (#428). The request answers the same way, and just as fast, whether or not the account exists (#433), and its confirmation no longer lingers when the user comes back to the page (#434). The login and reset pages show a countdown while an account is locked or requests are rate-limited (#436). The login response now carries the user's roles and permissions, so permission-gated navigation is right from the first page (#322). Behind these, AuthService is split into focused services (#420) and password hashing sits behind one module (#385). Generating a temporary password no longer fails in development (#371) or makes a test fail at random (#429).
The third is user and role administration. Admins can reset a user's password; the new temporary password is emailed, never returned or logged (#214). Editing a user moves from a drawer to a detail page at /dashboard/users/:id, which stops admins from removing their own admin role (#212). The user API moves to plural paths, /api/users*, like its siblings (#455). Creating a user writes the identity, the password and the roles in one transaction, so a failure leaves nothing half-created (#387). Row actions move into a ⋮ menu (#401), and actions an admin cannot take on their own account are hidden (#389). The Spanish copy of the welcome email and the interface is corrected (#251).
The fourth is navigation and feedback. The root path / now serves a public, server-rendered landing page instead of redirecting to the login page (#19), and its unreachable "Go to dashboard" link is removed (#468). The placeholder Welcome page is removed (#458). A user denied a page sees a toast that says why, and a user with no permissions sees an explanation instead of an empty dashboard (#323). The deny toast now appears exactly once (#471), the 403 toast appears on every page (#480), and the sidebar no longer flickers on logout (#325).
The fifth is responsive layout. The dashboard now works on phones. Form inputs no longer trigger the iOS zoom and touch targets reach 44 px (#338), the auth pages fill the screen (#339), the sidebar behaves as an overlay (#340), and data tables switch to cards on narrow screens, with an optional table/cards toggle (#341). Pagination (#342, #366), page layout and breadcrumbs (#343, #368), and drawers, dialogs, toasts and dropdowns (#344) are sized for small screens. Shared packages/ui components show English text when no translations are loaded, as in Storybook (#363), and the reason ToastNotification has no unit test is documented (#369).
The sixth is end-to-end testing. The reference app gains a Playwright suite that runs against a seeded test database (#261). It covers authentication (#459), the landing page (#460), the dashboard shell and permission filtering (#461), users (#462), roles (#463), permissions (#464), theme and language (#465) and the health page (#466). It runs with npm run test:e2e and in its own CI job, outside npm run ci.
The seventh is toolchain and CI. Nx moves to 22.7.5 and Angular to 21.2 (#424). Integration tests no longer need Docker: they start an embedded Postgres 17 when no test database is configured (#321). npm run ci now checks formatting first (#374), and npm run ci:verify runs the same checks through the Nx cache for repeated runs (#404). CI uses the Nx Cloud remote cache (#406), reads its test-database settings from repository Variables, and runs test, lint and a new type-check job over every project (#319). Bugs left over from the monorepo restructure, including stale README paths, are fixed (#313, #315).
The last is generators, agents and documentation. A new ui-component generator scaffolds shared components, and a lint rule requires every Storybook story to show its source (#348). The drizzle-schema and page generators write kebab-case paths (#330, #331), every generator has unit tests (#317), and the generators are documented for people and agents (#333). The /issue-workflow skill takes an issue from branch to pull request, and npm install offers to install the Angular agent skill (#349). The agents load their references in parallel and only as needed (#407, #410), run independent advisors in parallel (#408), verify with the cached CI (#405), and review with a new maintainability lens (#409). The domain-model reference gains strategic DDD patterns and corrected examples (#207, #380), and the Bruno error cases use cookie authentication (#384).
Fork migration
Every fork:
- #354, #441, #444 - Copy
apps/reference-app/src/api/config/(thedb,auth,email,http,appandcron*.env.tsfiles andenv-utils.ts) into your app, add"@config/*": ["src/api/config/*"]to itstsconfig.jsonandtsconfig.spec.json, and add'@config': '/src/api/config'to theresolve.aliasof itsvitest.config.ts. Then replace everyprocess.envread outsidesrc/api/config/,src/test-setup.tsandsrc/api/integration/with the matching<domain>Env.<VAR>, for examplehttpEnv.CORS_ORIGIN,httpEnv.CORS_MAX_AGEandhttpEnv.PORTinserver.ts.npm run lintnow fails on every such read, not only on new ones. - #258, #441, #443 -
@resetshop/hono-coreno longer exportsenvironment,isServerlessorEnvironmentConfig, and your app imports them incron-jobs.ts,refresh-token.repository.ts,helpers/drizzle-postgres-connector.ts,db/seed.tsanddb/sync-permissions.ts. ImportisServerlessfrom@config/http.env, replaceenvironment.database.pg.connectionStringwithdbEnv.PG_CONNECTION_STRING(@config/db.env) andenvironment.basePathwithhttpEnv.BASE_HREF(@config/http.env), and useDbEnv,HttpEnvorAuthEnvwhere you typedEnvironmentConfig. - #354 - Move every
.env*file out of the repository root and out ofapps/<your-app>/: the pre-commit hook,npm run ciandnpm run ci:verifyfail while one exists. Deliver values with an env file outside the repository and Node's--env-file, an IDE run configuration, a shell export ordirenv, asdocs/environment-variables.mddescribes. That document also lists every variable, replacing the deleted.env.example. - #259 - Rename
TOKEN_CLEANUP_INTERVAL_MStoTOKEN_CLEANUP_INTERVALand give it a duration string (86400000becomes24h) wherever you set it (your env file outside the repository, CI variables, deployment). If only the old name is set, the cleanup job silently uses the 24-hour default. - #428 - Run
npm run drizzle:push-migrationsagainst each database (npm installalso runs it) to create the newpassword_reset_tokentable. - #319, #459 - In your repository's Settings → Secrets and variables → Actions → Variables, add
PG_TEST_CONNECTION_STRING=postgresql://postgres:postgres@localhost:5432/test_dbandINTEGRATION_TEST_ADMIN_PASSWORD= any test-only password. Thetest-integrationande2ejobs inci.ymlread them asvars.*. Then delete the Secrets of the same names. - #406 - In
nx.json, replacenxCloudIdwith your own Nx Cloud workspace and add its token, copied verbatim from the dashboard, as theNX_CLOUD_ACCESS_TOKENActions secret, or leave the secret unset to use only the local cache. A token that does not match the workspace makes the cacheable CI jobs fail with401. - #325 - In your app's
app.config.ts, replace the inlineNAVIGATION_PERMISSION_CHECKprovider withprovideAuth(withNavigationPermissionCheck()), copyingwithNavigationPermissionCheck()from the reference app'sproviders/auth/auth.provider.ts. The inline provider makes the sidebar flicker on logout. - #348 - Add
parameters: { docs: { canvas: { sourceState: 'shown' } } }to the default export of every*.stories.tsin your app;npm run lintfails on stories without it. - #424 - In your app's
vitest.config.ts, setserver.fs.allowto[searchForWorkspaceRoot(process.cwd())], imported fromvite. Under Angular 21.2, specs that renderpackages/uicomponents otherwise fail withDenied ID …?raw. - #321 - In your app's
project.json, removenode scripts/skip-if-no-db.mjs &&from thetest-integrationcommand; the script is deleted. To run without Docker as the reference app does, copysrc/api/integration/setup/embedded-pg-test-db.tsand the embedded-Postgres branch ofglobal-setup.ts. - #319 - In your app's
playwright.config.ts, setwebServer.commandtonx run <your-app>:serve --port=3000; the copiednx run app:servenames a project that does not exist. - #374 - Expect
npm run cito fail on any file Prettier would reformat; runnpm run formatonce. - #321 - Expect
npm run ciandnpm run test:integrationto run the reference app's integration tests against an embedded Postgres 17 instead of skipping them whenPG_TEST_CONNECTION_STRINGis unset. ExportINTEGRATION_TEST_ADMIN_PASSWORDin your shell, or the run fails. - #319 - Expect GitHub CI's
testandlintjobs, and the newtypecheckjob, to run over every project, including your own app, on your first run.
If your fork ships its own language files (the TranslationSchema type-check lists every missing or unknown key):
- #388, #428, #436 - Add
AUTH.CHANGE_PASSWORD.*,AUTH.RESET_PASSWORD.{DESCRIPTION,CONFIRMATION},AUTH.RESET_PASSWORD_CONFIRM.*andAUTH.ERRORS.{OLD_PASSWORD_MISMATCH,RESET_TOKEN_INVALID,ACCOUNT_LOCKED_UNTIL,RATE_LIMITED_UNTIL}. - #19, #323 - Add
LANDING.*,PERMISSIONS.ERRORS.ACCESS_DENIEDandDASHBOARD.HOME.NO_ACCESS_{TITLE,MESSAGE}. - #214, #212 - Add
USERS.PAGE.RESET_PASSWORD_BUTTON,USERS.PAGE.RESET_PASSWORD_DIALOG.{TITLE,MESSAGE},USERS.RESET_PASSWORD_TOASTandUSERS.DETAIL.*, and removeUSERS.EDIT_DRAWER.*. - #341, #342, #401 - Add
DATA_TABLE.TOGGLE.{TABLE,CARDS,GROUP_LABEL},PAGINATION.PAGE_OFandROW_ACTIONS.TRIGGER_LABEL. - #458 - Remove
DASHBOARD.HOME.NAVandDASHBOARD.HOME.DESCRIPTIONS.WELCOME. Your app's Welcome page and itswelcomenavigation entry use them: remove both, or give them keys of your own. - #212, #458 - Search your templates (
| translate) and navigation names forUSERS.EDIT_DRAWER.*,DASHBOARD.HOME.NAVandDASHBOARD.HOME.DESCRIPTIONS.WELCOME. Those uses compile, and render the raw key. - #19, #212, #214, #323, #341, #342, #388, #401, #428, #436 - Copy the matching entries into your
translation.mock.tsfor every key your specs assert. It is an openRecord, so the type-check does not report missing entries.
If your fork changed or reuses any of the following:
- #455 - Calls to the reference app's
/api/user*endpoints (scripts, your Bruno collection, other clients): use/api/users*; the old paths have no alias. To align your own app, change its mount insrc/api/routes.tsfrom/userto/userstogether with itsHttpUsersApibase path. - #212 - The edit-user drawer: it is replaced by the user detail page at
/dashboard/users/:id(pages/dashboard/users/user-detail-page/). Move your changes there. - #471, #480 -
provideToast()orforbiddenInterceptor: copy the reference app'scomponents/toast/toast.provider.tsandtoast-bridge.service.ts.provideToast()now only activates the rootToastBridgeServiceand no longer listsprovideToastConfig,NgpToastManagerorToastBridgeService, which rendered a deny toast twice; the bridge passes placement, duration and dismissal to eachshow(). InforbiddenInterceptor, callinjector.get(ToastBridgeService)in the 403 branch beforeshowNotification, so the toast also renders on routes that never callprovideToast(). - #371 - Your app's password generation (
src/api/utils/password.ts): import the word lists with?rawand addwordlists.d.ts, as the reference app does, then delete thecopy-server-assetstarget from yourproject.json. The file-system loader fails withWord list file not foundwhen a user is created. - #420, #385, #387, #322 - Code that constructs
AuthServiceorUserManagementServiceoutside the container:AuthServicealso takesuserRoleServiceandauthPasswordService. Build the latter asnew AuthPasswordService({ authRepository, verifyPassword, hashPassword }), withverifyPasswordfromcreatePasswordVerifier()andhashPasswordfromcreatePasswordHasher(), both inservices/password/password-hasher.ts. Token cleanup moved fromAuthServicetoTokenMaintenanceService, which takes{ refreshTokenRepository }.UserManagementServicealso takesuserRoleRepository,authRepositoryandhashPassword(fromcreatePasswordHasher()), which replaces the no-longer-exportedgetBcryptSaltRounds.UserManagementRepository.createtakes the identity-onlyCreateUserIdentityParams({ email, firstName, lastName }) instead ofCreateUserWithHashedPasswordParams; write the password withAuthenticationRepository.createInitialPassword(...). - #440 - Code that constructs
PasetoServiceor importsdrizzlePgConnector: pass{ pasetoConfig: createPasetoConfig() }tonew PasetoService(), and callcreateDrizzlePgConnector()instead of importing the connector. - #442 - Scripts that run
drizzle-kit generateorpushoutsidenpm run drizzle:create-migrationsanddrizzle:push-migrations: run them astsx --tsconfig apps/<your-app>/tsconfig.json ./node_modules/drizzle-kit/bin.cjs <command>, so the@config/*import indrizzle.config.tsresolves, and deliverPG_CONNECTION_STRINGfirst. - #401 - Specs in your app that render
RowActionsMenuor anotherng-primitivesoverlay: add theElement.prototype.getAnimationspolyfill from the reference app'ssrc/test-setup.tsto your app's test setup. - #363 - Specs that use
TranslationMockfrom@resetshop/angular-core: thepackages/uiPagination,DataTableandFormFieldcomponents now show their English fallback text under it instead of the raw key, so update assertions that expect keys. The reference app'sprovideTranslationMockis unchanged.
Behaviour that changes with no action needed:
- #19 - The reference app serves a public landing page at
/; before,/redirected to/auth/login. Your own app keeps its routes. - #322, #388 -
POST /api/auth/loginreturns the user's roles and permissions, likeGET /api/auth/me, and/meaddsmustChangePassword. Users with that flag are sent to/auth/change-password. - #436 - The login
401 ACCOUNT_LOCKEDresponse addslockedUntil. - #428 - The reset link in the forgot-password email is built from
CORS_ORIGIN, falling back tohttp://localhost:4200. - #387 -
POST /api/usersanswers400instead of500for unknown role ids. - #212 - The temporary-password email of an admin reset is sent after the response.
- #313 -
LoadingSpinnerComponentshows "Loading..." instead of "Cargando..."; bind[message]for localized text. - #349 -
npm installoffers to clone the Angular Claude Code skill into.claude/skills/angular. Non-interactive installs clone it by default, and a failed clone does not fail the install.
Full changes
See every merged pull request in v1.0.0.
Changes
Environment configuration
- #354 - Replaces
.envfiles with six Zod-validated environment schemas read through@config/<domain>.env, and fails the commit hook andnpm run ciwhen a.env*file is in the tree. - #440 - Injects the PASETO, authentication and database configuration so tests can supply their own values.
- #441 - Moves every production
process.envread to the<domain>Envobjects. - #442 - Runs the database scripts and
drizzle-kitagainst the validated configuration, so they stop at start-up whenPG_CONNECTION_STRINGis missing. - #443 - Removes the old environment validation code and updates the configuration documentation.
- #444 - Adds a lint rule that rejects
process.envreads outside the configuration modules and test setup. - #258 - Moves app-specific configuration out of
@resetshop/hono-core. - #259 - Replaces the remaining millisecond constants with duration strings and renames
TOKEN_CLEANUP_INTERVAL_MStoTOKEN_CLEANUP_INTERVAL. - #450 - Fixes the production build, which failed because a rate limiter read the configuration when its module loaded.
Authentication
- #388 - Sends users flagged with
mustChangePasswordthrough a change-password page after login. - #428 - Adds the self-service forgot-password flow with single-use, hashed reset tokens.
- #433 - Answers forgot-password requests immediately and identically, so response time no longer reveals whether an account exists.
- #434 - Clears the password-reset confirmation and errors when the user returns to the reset pages.
- #436 - Shows a countdown and disables submit while an account is locked or requests are rate-limited.
- #322 - Returns the user's roles and permissions from
POST /api/auth/login. - #420 - Splits
AuthServiceintoAuthService,AuthPasswordServiceandTokenMaintenanceService. - #385 - Injects password hashing into
UserManagementServicethroughcreatePasswordHasher(). - #371 - Embeds the password word lists at build time, so generating a temporary password no longer fails in development.
- #429 - Removes hyphenated words from the English password word list, which made a test fail at random.
User and role administration
- #214 - Adds admin-initiated password resets that email a new temporary password.
- #212 - Replaces the edit-user drawer with a user detail page at
/dashboard/users/:id. - #455 - Moves the user API from
/api/user*to/api/users*. - #387 - Moves password and role writes out of the user-management repository and creates a user in one transaction.
- #401 - Replaces inline row action buttons with a ⋮ row actions menu.
- #389 - Hides the Delete action on the signed-in user's own row and adds a shared
CurrentUserservice. - #251 - Corrects the Spanish copy of the welcome email and interface labels.
Navigation and feedback
- #19 - Adds a public, server-rendered landing page at
/. - #468 - Removes the landing header's unreachable "Go to dashboard" link.
- #458 - Removes the placeholder
/dashboard/welcomepage. - #323 - Shows a toast when a route denies access, and explains an empty dashboard to users without permissions.
- #471 - Shows the access-denied toast once when a detail route is deep-linked.
- #480 - Shows the 403 toast on routes that never set up toasts.
- #325 - Stops the sidebar navigation from flickering on logout.
Responsive layout
- #338 - Stops the iOS zoom on form inputs and adds a 44 px touch-target utility.
- #339 - Makes the auth pages full-screen on mobile with the new
ImmersivePanel. - #340 - Fixes the sidebar's mobile behaviour, overlay width and brand truncation.
- #341 - Adds a card display mode to
DataTable, with breakpoint switching and a table/cards toggle. - #342 - Stacks pagination on mobile and shows a "Page N of M" indicator.
- #366 - Refines pagination page windowing and ellipses.
- #343 - Adapts page padding, headings, breadcrumbs and action bars to small screens.
- #368 - Truncates long breadcrumb segments on mobile.
- #344 - Sizes drawers, toasts, the confirm dialog and select dropdowns for small screens.
- #363 - Gives shared
packages/uicomponents English fallback text when no translations are loaded. - #369 - Documents why
ToastNotificationhas no unit test.
End-to-end testing
- #261 - Completes the end-to-end epic with a Playwright suite for every page of the reference app.
- #459 - Adds the Playwright harness, the seeded test database and authentication coverage.
- #460 - Covers the landing page.
- #461 - Covers the dashboard shell, permission filtering and the access-denied flow.
- #462 - Covers the users list, the create drawer and the user detail page.
- #463 - Covers role management.
- #464 - Covers the permissions list.
- #465 - Covers theme and language switching.
- #466 - Covers the health page.
Toolchain and CI
- #424 - Updates Nx to 22.7.5 and Angular to 21.2.
- #321 - Runs integration tests against an embedded Postgres 17 when no test database is configured.
- #319 - Fixes the seed script aliases and the CI workflow, and reads the CI test-database settings from repository Variables.
- #374 - Adds a Prettier check to
npm run ci. - #404 - Adds
npm run ci:verify, which runs the CI checks through the Nx cache. - #406 - Enables the Nx Cloud remote cache in CI.
- #313 - Fixes bugs left over from the monorepo restructure, including the spinner's hard-coded Spanish text.
- #315 - Corrects stale file paths in the README.
Generators, agents and documentation
- #348 - Adds the
ui-componentgenerator and a lint rule that requires stories to show their source. - #330 - Makes the
drizzle-schemagenerator write kebab-case file names. - #331 - Makes the
pagegenerator write kebab-case directories. - #317 - Adds unit tests for every generator.
- #333 - Documents the generators in the README and for agents.
- #349 - Adds the
/issue-workflowskill and apostinstallstep that installs the Angular agent skill. - #405 - Makes the
code-revieweragent verify withnpm run ci:verify. - #407 - Loads each agent's references in one parallel batch.
- #408 - Runs independent advisor agents in parallel.
- #409 - Adds a maintainability review lens to the
code-reviewerandrefactoring-specialistagents. - #410 - Loads the planning agents' references according to the diff.
- #207 - Adds strategic DDD patterns to the domain-model reference.
- #380 - Fixes stale examples in the domain-model reference.
- #384 - Switches the Bruno error-case requests to cookie authentication.
What's Changed
- [#61] - Add rate limiting to login and refresh auth endpoints by @rolivencia in #242
- [#243] - Add date input support to app-form-field by @rolivencia in #245
- [#79] - Add audit logging for sensitive RBAC and user management operations by @rolivencia in #244
- [#246] - Pass actorId to all RBAC mutation service methods for audit traceability by @rolivencia in #247
- [#248] - Add audit history tables for auth/authz entities by @rolivencia in #249
- [#159] - Full English/Spanish i18n with runtime language switching by @rolivencia in #250
- [#254] - Replace set-environment.ts with Angular builder define option by @rolivencia in #255
- [#256] - Embed wordlists as TypeScript constants, remove copy-server-assets by @rolivencia in #257
- [#262] - Add coding agent collaboration policies by @rolivencia in #295
- [#265] - Step 1: Prepare workspace root for monorepo structure by @rolivencia in #296
- [#266] - Step 2: Create @resetshop/util package by @rolivencia in #297
- [#298] - PR 1.1.5: Remove dead @libs/* aliases and tsconfig paths duplication by @rolivencia in #299
- [#269] - PR 1.5: Create @resetshop/hono-core package by @rolivencia in #300
- [#268] - PR 1.4: Create @resetshop/angular-core package (boundary-decoupled from day one) by @rolivencia in #301
- [#267] - PR 1.3: Create @resetshop/ui package with 14 generic components by @rolivencia in #302
- [#275] - PR 1.6: Create @resetshop/generators package (6 working generators + app stub) by @rolivencia in #303
- [#273] - PR 1.7: Create apps/reference-app with full app code consolidated under src/ by @rolivencia in #304
- [#285][#286] - PR 1.12+1.13: Add skip-if-no-db.mjs + uniform typecheck targets by @rolivencia in #305
- [#290] - PR 2.1: Add @resetshop/generators:app schematic by @rolivencia in #306
- [#307] - Fix-up: Address retrospective code review findings on PRs 299-306 by @rolivencia in #308
- [#291] - PR 2.2: Add docs/forking.md + CHANGELOG.md + README forking section by @rolivencia in #309
- [#292] - PR 2.3: Enforce starter/app boundary via Nx tags + ESLint + nx.json cleanup by @rolivencia in #310
- [#293] - PR 2.4: Add upstream CI guards (boundary + changelog) and PR template by @rolivencia in #311
- [#294] - PR 2.5: Holistic cross-cutting fix-up (final Epic 2 PR) by @rolivencia in #312
- #313 - Audit fix-up: real bugs from review-file audit + tag all Discovered statuses by @rolivencia in #314
- #315 - README: fix 8 stale file paths from pre-restructure single-app layout by @rolivencia in #316
- #319 - Fix drizzle:seed tsx alias resolution and align local CI with GitHub Actions by @rolivencia in #320
- [Milestone] - Monorepo restructure + fork distribution by @rolivencia in #318
- #322 - Login response includes user roles + permissions; collapse meResponseSchema into authUserSchema by @rolivencia in #324
- [HF] - Sidebar logout flicker: opt-in withNavigationPermissionCheck() feature on provideAuth() by @rolivencia in #325
- #323 - permissionGuard deny toast + dashboard-home no-module-access alert by @rolivencia in #326
- #321 - Add embedded-postgres for zero-config local integration tests by @rolivencia in #329
- #317 - Add unit test coverage for store, page, api-provider, backend-module, drizzle-schema generators by @rolivencia in #332
- #330 - Fix drizzle-schema generator to write kebab-case filenames by @rolivencia in #334
- #331 - Fix page generator inner name-list/ directory to use kebab-case by @rolivencia in #335
- #333 - Document generators for humans (README) and agents (.claude/references) by @rolivencia in #336
- #259 - Migrate hardcoded millisecond constants to duration string utilities by @rolivencia in #337
- #338 - Mobile form interaction quality: iOS zoom fix, data-touch-target utility, selector layout, drawer responsiveness by @rolivencia in #345
- #339 - Fix auth pages overflow on mobile with ImmersivePanel layout by @rolivencia in #347
- #349 - Add /issue-workflow skill and postinstall hook for third-party skill auto-installation by @rolivencia in #350
- #348 - Add ui-component generator with Storybook sourceState enforcement by @rolivencia in #352
- #340 - Responsiveness — C: Sidebar mobile semantics, overlay width, brand truncation by @rolivencia in #353
- #341 - Responsiveness D iteration 2: built-in viewport detection, display-mode toggle, grouped card rendering, per-list card components by @rolivencia in #359
- #341 - Responsiveness — D: Data-table card display mode, cell whitespace, row action labels by @rolivencia in #358
- [hotfix] - Remove Translation from Storybook stories by @rolivencia in #362
- [hotfix] - Storybook: scan packages/ui stories and remove app-level duplicates by @rolivencia in #364
- #342 - Responsiveness E: Pagination single-row mobile layout, native select font size, DataTable+Pagination story coverage, and CardView render fix by @rolivencia in #365
- #343 - Responsiveness F: Page-level layout chrome (header, breadcrumb, main, page-shell, action bars, card) by @rolivencia in #367
- [hotfix] - Embed password wordlists at build time, remove runtime filesystem read by @rolivencia in #371
- #344 - Responsiveness G: Modal-stack mobile sizing (drawer, toast, confirm-dialog, select dropdown) by @rolivencia in #370
- #363 - Responsiveness H: Default fallback strings for reusable components when Translation is unavailable by @rolivencia in #372
- #369 - Document decision to skip unit test for ToastNotification by @rolivencia in #376
- #366 - Responsiveness I: pagination page-number windowing and ellipsis by @rolivencia in #375
- #368 - Responsiveness — J: Breadcrumb long-segment overflow on mobile by @rolivencia in #373
- #374 - Add format:check step to npm run ci to catch Prettier drift by @rolivencia in #377
- #251 - Review email template text copies and translations by @rolivencia in #379
- #214 - Add password reset feature for admin-initiated resets by @rolivencia in #383
- #207 - Enrich domain-model.md with strategic DDD patterns from ddd-by-examples/library by @rolivencia in #382
- #389 - Hide Delete user button on self-row in users-list and user-card by @rolivencia in #391
- #380 - Fix stale code examples in domain-model.md tactical sections by @rolivencia in #396
- #384 - Align Bruno error-case docs to auth: none cookie convention by @rolivencia in #397
- #258 - [hono-core] Split environment.ts: separate isServerless() from app-specific environment constant by @rolivencia in #398
- #385 - Hide bcrypt salt rounds behind a hashPassword helper at the service layer by @rolivencia in #400
- #401 - Replace inline data-table row actions with a vertical ellipsis (⋮) row-actions menu (NgpMenu) by @rolivencia in #402
- #404 - Leverage Nx local cache in
npm run ci(cache-aware ci:verify) by @rolivencia in #411 - #405 - Cache-aware code-reviewer CI (B2) by @rolivencia in #412
- feat: set up nx workspace by @rolivencia in #421
- #406 - Enable Nx Cloud remote caching + DTE evaluation (runbook) by @rolivencia in #413
- #387 - Decouple User-management from authentication and authorization writes by @rolivencia in #418
- #407 - Parallelize reference-file loading in agents (D-parallel) by @rolivencia in #414
- #410 - Conditional reference loading for planning agents (D-conditional) by @rolivencia in #415
- #408 - Parallelize independent advisor agents in the documented pipelines by @rolivencia in #416
- #409 - Evaluate /thermo-nuclear-code-quality-review for the code-reviewer agent + references by @rolivencia in #417
- #424 - Update Nx to 22.7.5 and Angular to 21.2 by @rolivencia in #425
- #19 - Add SSR Landing Page with public access and login entry point by @rolivencia in #426
- #420 - Decompose AuthService into AuthService + TokenMaintenanceService + AuthPasswordService by @rolivencia in #423
- #388 - Forced password change flow after login (
mustChangePassword: true) by @rolivencia in #427 - #429 - Fix flaky generatePassword ASCII-words test by @rolivencia in #430
- #428 - Self-service forgot-password / reset flow (request + token reset) by @rolivencia in #431
- #433 - Forgot-password flow leaks account existence via response timing by @rolivencia in #435
- #434 - Fix stale password-reset confirmation persisting across navigation by @rolivencia in #437
- #436 - Timer-based lockout & rate-limit countdown UX for the auth pages by @rolivencia in #438
- #354 - Add env sub-schema modules + createEnvHandler factory + CI guard against .env* files (PR A) by @rolivencia in #357
- #440 - Introduce DI patterns enabling per-test env values (PasetoConfig, AuthConfig.cronSecret, DrizzlePgConnector factory, cors deferral) — #354 PR B1 by @rolivencia in #445
- #441 - Migrate production consumers to Env + delete src/api/environment.ts + collapse duplicate isServerless() — #354 PR B2 by @rolivencia in #446
- #442 - Gate entry-point scripts and drizzle-kit on @config/* via tsx wrap — #354 PR B3 by @rolivencia in #447
- #443 - Delete legacy env-handling code and update consumer docs (validateEnvironment, EnvironmentConfig, AUTHENTICATION.md, README) — #354 PR B4 by @rolivencia in #448
- #444 - Enforce no-process-env via ESLint with @config-only allowlist (FINAL) — #354 PR B5 by @rolivencia in #449
- #450 - Defer changePasswordRateLimiter env read so the SSR prerender worker can import the server env-less by @rolivencia in #451
- [hotfix] - Guide users to EMAIL_PROVIDER=ethereal when SMTP credentials are missing by @rolivencia in #452
- #212 - Migrate Edit User from drawer to full detail page by @rolivencia in #439
- #455 - Align user API to plural collection routes (/api/user -> /api/users) by @rolivencia in #456
- #459 - E2E foundation + Auth coverage (Playwright base config, fixtures, CI) by @rolivencia in #467
- #460 - E2E Landing page coverage by @rolivencia in #469
- #461 - E2E Dashboard shell coverage by @rolivencia in #470
- #462 - E2E Users coverage (list, create drawer, detail page) by @rolivencia in #472
- #463 - E2E Roles CRUD coverage by @rolivencia in #473
- #464 - E2E Permissions read-only coverage by @rolivencia in #474
- #465 - E2E Theme and i18n coverage by @rolivencia in #475
- #466 - E2E Health page coverage by @rolivencia in #476
- #468 - Remove unreachable 'Go to dashboard' link from the public landing header by @rolivencia in #477
- #471 - Fix permission deny toast firing twice when deep-linking a gated detail route by @rolivencia in #478
- #480 - Activate the toast bridge on demand so forbiddenInterceptor 403 toasts render on any route by @rolivencia in #481
- #458 - Remove the placeholder /dashboard/welcome route and Welcome component by @rolivencia in #483
- [hotfix] - Regroup dashboard nav (Settings under Settings & Maintenance) + add Dashboard home link by @rolivencia in #484
- [#485] - Cut the 1.0.0 release: changelog, GitHub release notes, and the first v1.0.0 tag by @rolivencia in #487
- [#508] - Source INTEGRATION_TEST_ADMIN_PASSWORD from a Secret in CI by @rolivencia in https://github.com/ResetShop/angular-nx-standalone-starter/pull/#501
Full Changelog: https://github.com/ResetShop/angular-nx-standalone-starter/commits/v1.0.0