@aurorajs.dev/catalyst-cli 1.0.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/commands/generate/index.js +33 -1
- package/dist/commands/sheets/diff.js +2 -4
- package/dist/commands/sheets/pull.d.ts +0 -1
- package/dist/commands/sheets/pull.js +2 -14
- package/dist/commands/sheets/push.d.ts +0 -1
- package/dist/commands/sheets/push.js +2 -14
- package/dist/commands/sheets/validate.js +3 -4
- package/dist/generator/domain/column-width.d.ts +2 -2
- package/dist/generator/domain/column-width.js +20 -15
- package/dist/generator/domain/config.d.ts +45 -6
- package/dist/generator/domain/config.js +152 -48
- package/dist/generator/domain/cross-bc-relations-discovery.d.ts +38 -0
- package/dist/generator/domain/cross-bc-relations-discovery.js +89 -0
- package/dist/generator/domain/cross-schema-resolver.d.ts +54 -1
- package/dist/generator/domain/cross-schema-resolver.js +52 -3
- package/dist/generator/domain/custom-field-value.d.ts +124 -0
- package/dist/generator/domain/custom-field-value.js +206 -0
- package/dist/generator/domain/declared-surface.d.ts +45 -0
- package/dist/generator/domain/declared-surface.js +106 -0
- package/dist/generator/domain/dialog-width.d.ts +46 -0
- package/dist/generator/domain/dialog-width.js +70 -0
- package/dist/generator/domain/display-field.d.ts +28 -3
- package/dist/generator/domain/display-field.js +53 -3
- package/dist/generator/domain/form-id.d.ts +3 -0
- package/dist/generator/domain/form-id.js +21 -0
- package/dist/generator/domain/i18n-embedded.d.ts +102 -0
- package/dist/generator/domain/i18n-embedded.js +112 -0
- package/dist/generator/domain/i18n-table.d.ts +112 -0
- package/dist/generator/domain/i18n-table.js +189 -0
- package/dist/generator/domain/model.d.ts +59 -17
- package/dist/generator/domain/model.js +1 -3
- package/dist/generator/domain/module-resolution.d.ts +17 -0
- package/dist/generator/domain/module-resolution.js +23 -0
- package/dist/generator/domain/operation-names.d.ts +17 -0
- package/dist/generator/domain/operation-names.js +27 -0
- package/dist/generator/domain/pivot.js +11 -1
- package/dist/generator/domain/property-filters.d.ts +168 -6
- package/dist/generator/domain/property-filters.js +257 -13
- package/dist/generator/domain/property-mappers.d.ts +69 -5
- package/dist/generator/domain/property-mappers.js +155 -61
- package/dist/generator/domain/property-pick-model.d.ts +12 -0
- package/dist/generator/domain/property-pick-model.js +47 -0
- package/dist/generator/domain/property-predicates.d.ts +57 -17
- package/dist/generator/domain/property-predicates.js +58 -18
- package/dist/generator/domain/property-validators.d.ts +20 -0
- package/dist/generator/domain/property-validators.js +71 -0
- package/dist/generator/domain/property-width.js +4 -2
- package/dist/generator/domain/readonly-payload-types.d.ts +72 -0
- package/dist/generator/domain/readonly-payload-types.js +96 -0
- package/dist/generator/domain/relation-search-eligibility.d.ts +15 -0
- package/dist/generator/domain/relation-search-eligibility.js +50 -0
- package/dist/generator/domain/relations-builder.d.ts +113 -0
- package/dist/generator/domain/relations-builder.js +422 -0
- package/dist/generator/domain/schema-loader.d.ts +41 -0
- package/dist/generator/domain/schema-loader.js +414 -4
- package/dist/generator/domain/widget-type.d.ts +1 -0
- package/dist/generator/domain/widget-type.js +1 -0
- package/dist/generator/engine/code-writer/code-writer.d.ts +334 -23
- package/dist/generator/engine/code-writer/code-writer.js +1052 -145
- package/dist/generator/engine/code-writer/drivers/import.driver.d.ts +22 -0
- package/dist/generator/engine/code-writer/drivers/import.driver.js +64 -0
- package/dist/generator/engine/code-writer/drivers/object.driver.d.ts +30 -0
- package/dist/generator/engine/code-writer/drivers/object.driver.js +58 -0
- package/dist/generator/engine/file-manager.d.ts +29 -2
- package/dist/generator/engine/file-manager.js +8 -2
- package/dist/generator/engine/file-writer.d.ts +3 -3
- package/dist/generator/engine/file-writer.js +58 -58
- package/dist/generator/engine/ignored-file.d.ts +6 -0
- package/dist/generator/engine/ignored-file.js +31 -0
- package/dist/generator/engine/lock-file.d.ts +36 -54
- package/dist/generator/engine/lock-file.js +74 -168
- package/dist/generator/engine/template-engine.js +9 -1
- package/dist/generator/handlers/back.handler.d.ts +72 -0
- package/dist/generator/handlers/back.handler.js +354 -59
- package/dist/generator/handlers/front.handler.d.ts +54 -0
- package/dist/generator/handlers/front.handler.js +247 -29
- package/dist/generator/handlers/handler-utils.js +2 -1
- package/dist/generator/packages/front-package-helpers.d.ts +8 -1
- package/dist/generator/packages/front-package-helpers.js +26 -5
- package/dist/generator/packages/installers/auditing.js +3 -3
- package/dist/generator/packages/installers/authorization-code.js +2 -5
- package/dist/generator/packages/installers/common.js +3 -3
- package/dist/generator/packages/installers/front/identity.js +8 -17
- package/dist/generator/packages/installers/front/queue-manager.d.ts +23 -0
- package/dist/generator/packages/installers/front/queue-manager.js +35 -0
- package/dist/generator/packages/installers/identity.js +4 -0
- package/dist/generator/packages/installers/mcp.js +1 -1
- package/dist/generator/packages/installers/message.js +1 -1
- package/dist/generator/packages/installers/ms-email.js +1 -1
- package/dist/generator/packages/installers/ms-entra-id.js +3 -3
- package/dist/generator/packages/installers/queue-manager.js +2 -3
- package/dist/generator/packages/installers/storage-account-azure.js +2 -2
- package/dist/generator/packages/installers/storage-account.js +4 -4
- package/dist/generator/packages/installers/support.js +1 -1
- package/dist/generator/packages/installers/tools.js +1 -1
- package/dist/generator/packages/installers/whatsapp.js +1 -1
- package/dist/generator/packages/package-helpers.js +10 -10
- package/dist/generator/utils/code-gen.d.ts +14 -3
- package/dist/generator/utils/code-gen.js +77 -27
- package/dist/generator/utils/mocker.js +19 -10
- package/dist/generator/utils/path-allowed.js +23 -2
- package/dist/generator/utils/relations-file.d.ts +127 -0
- package/dist/generator/utils/relations-file.js +310 -0
- package/dist/generator/utils/string-utils.d.ts +7 -0
- package/dist/generator/utils/string-utils.js +13 -0
- package/dist/origin/domain/actions.d.ts +13 -0
- package/dist/origin/domain/actions.js +13 -1
- package/dist/origin/domain/diff.js +9 -1
- package/dist/sheets/domain/auth.d.ts +15 -1
- package/dist/sheets/domain/auth.js +25 -2
- package/dist/sheets/domain/retry.d.ts +61 -0
- package/dist/sheets/domain/retry.js +76 -0
- package/dist/sheets/domain/types.d.ts +148 -2
- package/dist/sheets/domain/types.js +252 -12
- package/dist/sheets/sync/diff-engine.js +62 -5
- package/dist/sheets/sync/sheet-to-yaml.d.ts +21 -0
- package/dist/sheets/sync/sheet-to-yaml.js +238 -58
- package/dist/sheets/sync/yaml-to-sheet.d.ts +62 -0
- package/dist/sheets/sync/yaml-to-sheet.js +277 -30
- package/dist/sheets/transformers/property-transformer.d.ts +39 -0
- package/dist/sheets/transformers/property-transformer.js +121 -23
- package/dist/sheets/validators/schema-validator.js +54 -38
- package/dist/templates/ai/claude/.claude/settings.json +1 -4
- package/dist/templates/backend/application/.claude/skills/catalyst-backend-testing/SKILL.md +264 -234
- package/dist/templates/backend/application/.claude/skills/catalyst-cross-bounded-context-ports/SKILL.md +40 -10
- package/dist/templates/backend/application/.claude/skills/catalyst-field-schema/SKILL.md +80 -55
- package/dist/templates/backend/application/.claude/skills/catalyst-field-schema/references/field-schema-and-decorators.md +91 -62
- package/dist/templates/backend/application/.claude/skills/catalyst-field-schema/references/query-statement.md +206 -200
- package/dist/templates/backend/application/.claude/skills/catalyst-handler-composer/SKILL.md +66 -64
- package/dist/templates/backend/application/.claude/skills/catalyst-handler-composer/references/additional-apis-workflow.md +81 -22
- package/dist/templates/backend/application/.claude/skills/catalyst-handler-composer/references/cli-first-workflow.md +17 -17
- package/dist/templates/backend/application/.claude/skills/catalyst-handler-composer/references/create-handler.md +10 -8
- package/dist/templates/backend/application/.claude/skills/catalyst-handler-composer/references/delete-handler.md +7 -7
- package/dist/templates/backend/application/.claude/skills/catalyst-handler-composer/references/read-handler.md +27 -17
- package/dist/templates/backend/application/.claude/skills/catalyst-handler-composer/references/update-handler.md +35 -20
- package/dist/templates/backend/application/.claude/skills/catalyst-nestjs-primitives/SKILL.md +151 -27
- package/dist/templates/backend/application/.claude/skills/catalyst-nestjs-primitives/references/minimum-templates.md +1 -1
- package/dist/templates/backend/application/.claude/skills/catalyst-project-structure/SKILL.md +210 -246
- package/dist/templates/backend/application/.claude/skills/catalyst-provider-composition/SKILL.md +263 -0
- package/dist/templates/backend/application/.claude/skills/catalyst-schema-migrations/SKILL.md +308 -0
- package/dist/templates/backend/application/.claude/skills/catalyst-tools/SKILL.md +266 -0
- package/dist/templates/backend/application/.oxlintrc.json +171 -0
- package/dist/templates/backend/application/CLAUDE.md +27 -1
- package/dist/templates/backend/application/README.md +6 -4
- package/dist/templates/backend/application/drizzle.config.ts +46 -0
- package/dist/templates/backend/application/nest-cli.json +7 -2
- package/dist/templates/backend/application/package.json +56 -73
- package/dist/templates/backend/application/scripts/db/check.ts +80 -0
- package/dist/templates/backend/application/scripts/db/generate.ts +55 -0
- package/dist/templates/backend/application/scripts/db/migrate.ts +101 -0
- package/dist/templates/backend/application/scripts/db/query.spec.ts +497 -0
- package/dist/templates/backend/application/scripts/db/query.ts +410 -0
- package/dist/templates/backend/application/scripts/iam/permissions-without-role.ts +178 -0
- package/dist/templates/backend/application/scripts/tz-pin.spec.ts +10 -0
- package/dist/templates/backend/application/src/@aurora/core.module.ts +52 -32
- package/dist/templates/backend/application/src/@aurora/decorators/auth.decorator.ts +0 -4
- package/dist/templates/backend/application/src/@aurora/decorators/index.ts +1 -1
- package/dist/templates/backend/application/src/@aurora/modules/authentication/authentication.module.spec.ts +7 -27
- package/dist/templates/backend/application/src/@aurora/modules/authentication/authentication.module.ts +17 -12
- package/dist/templates/backend/application/src/@aurora/modules/authentication/domain/anonymous-account.spec.ts +1 -1
- package/dist/templates/backend/application/src/@aurora/modules/authentication/domain/anonymous-account.ts +3 -1
- package/dist/templates/backend/application/src/@aurora/modules/authentication/domain/errors/index.ts +1 -0
- package/dist/templates/backend/application/src/@aurora/modules/authentication/domain/errors/token-issuance-disabled.error.ts +20 -0
- package/dist/templates/backend/application/src/@aurora/modules/authentication/domain/index.ts +1 -0
- package/dist/templates/backend/application/src/@aurora/modules/authentication/domain/ports/account-cache-invalidator.port.ts +17 -0
- package/dist/templates/backend/application/src/@aurora/modules/authentication/domain/ports/account-cache-invalidator.token.ts +1 -0
- package/dist/templates/backend/application/src/@aurora/modules/authentication/domain/ports/account-loader.port.ts +55 -1
- package/dist/templates/backend/application/src/@aurora/modules/authentication/domain/ports/authentication-strategy.port.ts +10 -1
- package/dist/templates/backend/application/src/@aurora/modules/authentication/domain/ports/index.ts +12 -10
- package/dist/templates/backend/application/src/@aurora/modules/authentication/domain/ports/jwt-signer.port.ts +10 -1
- package/dist/templates/backend/application/src/@aurora/modules/authentication/domain/resolve-authentication-mode.spec.ts +1 -1
- package/dist/templates/backend/application/src/@aurora/modules/authentication/index.ts +5 -4
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/factory/authentication-strategy.factory.spec.ts +14 -27
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/factory/authentication-strategy.factory.ts +9 -5
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/guards/authentication-jwt.guard.spec.ts +16 -17
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/guards/authentication-jwt.guard.ts +2 -2
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/guards/authorization-permissions.guard.ts +1 -2
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/guards/index.ts +2 -2
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/providers/hub-session-manager.provider.ts +2 -2
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/providers/jwt-signer.provider.ts +2 -2
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/strategies/aurora-hub/aurora-hub-consumer.adapter.ts +18 -5
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/strategies/aurora-hub/index.ts +1 -0
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/strategies/authentication-cache-invalidator.adapter.spec.ts +56 -0
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/strategies/authentication-cache-invalidator.adapter.ts +28 -0
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/strategies/cache-key.ts +9 -0
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/strategies/index.ts +11 -0
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/strategies/jwt-passport.strategy.ts +1 -1
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/strategies/local-provider/anonymous-account-loader.adapter.spec.ts +3 -3
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/strategies/local-provider/anonymous-account-loader.adapter.ts +2 -2
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/strategies/local-provider/jwt-signer.adapter.spec.ts +222 -25
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/strategies/local-provider/jwt-signer.adapter.ts +62 -12
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/strategies/local-provider/local-provider-cache-invalidation.spec.ts +84 -0
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/strategies/local-provider/local-provider.adapter.spec.ts +158 -0
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/strategies/local-provider/local-provider.adapter.ts +30 -5
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/warnings/authentication-boot-warning.spec.ts +9 -8
- package/dist/templates/backend/application/src/@aurora/modules/authentication/infrastructure/warnings/authentication-boot-warning.ts +1 -1
- package/dist/templates/backend/application/src/@aurora/modules/criteria/criteria-config.module.ts +15 -8
- package/dist/templates/backend/application/src/@aurora/modules/criteria/index.ts +1 -1
- package/dist/templates/backend/application/src/@aurora/modules/graphql/core.graphql +197 -252
- package/dist/templates/backend/application/src/@aurora/modules/graphql/graphql-config.module.ts +3 -3
- package/dist/templates/backend/application/src/@aurora/modules/graphql/guards/gql-throttler.guard.spec.ts +7 -6
- package/dist/templates/backend/application/src/@aurora/modules/graphql/index.ts +3 -3
- package/dist/templates/backend/application/src/@aurora/modules/graphql/schema-store.module.ts +1 -1
- package/dist/templates/backend/application/src/@aurora/modules/handler-registry/event-dispatcher.spec.ts +175 -0
- package/dist/templates/backend/application/src/@aurora/modules/handler-registry/event-dispatcher.ts +37 -0
- package/dist/templates/backend/application/src/@aurora/modules/handler-registry/handler-registry.module.ts +24 -0
- package/dist/templates/backend/application/src/@aurora/modules/handler-registry/handler.decorator.ts +21 -0
- package/dist/templates/backend/application/src/@aurora/modules/handler-registry/index.ts +4 -0
- package/dist/templates/backend/application/src/@aurora/modules/handler-registry/keyed-handler-registry.spec.ts +171 -0
- package/dist/templates/backend/application/src/@aurora/modules/handler-registry/keyed-handler-registry.ts +46 -0
- package/dist/templates/backend/application/src/@aurora/modules/health/app-version.provider.spec.ts +65 -0
- package/dist/templates/backend/application/src/@aurora/modules/health/app-version.provider.ts +113 -0
- package/dist/templates/backend/application/src/@aurora/modules/health/health.controller.spec.ts +50 -0
- package/dist/templates/backend/application/src/@aurora/modules/health/health.controller.ts +33 -0
- package/dist/templates/backend/application/src/@aurora/modules/health/health.module.ts +20 -0
- package/dist/templates/backend/application/src/@aurora/modules/health/index.ts +3 -0
- package/dist/templates/backend/application/src/@aurora/modules/index.ts +10 -5
- package/dist/templates/backend/application/src/@aurora/modules/lang/core-get-fallback-lang-from-json.service.ts +5 -3
- package/dist/templates/backend/application/src/@aurora/modules/lang/core-get-langs-from-json.service.ts +2 -2
- package/dist/templates/backend/application/src/@aurora/modules/lang/core-langs.ts +1 -1
- package/dist/templates/backend/application/src/@aurora/modules/lang/index.ts +3 -3
- package/dist/templates/backend/application/src/@aurora/modules/mailer/index.ts +2 -1
- package/dist/templates/backend/application/src/@aurora/modules/mailer/mailer-client.module.spec.ts +41 -33
- package/dist/templates/backend/application/src/@aurora/modules/mailer/mailer-client.module.ts +4 -4
- package/dist/templates/backend/application/src/@aurora/modules/mailer/mailer-smtp-transport.service.ts +4 -2
- package/dist/templates/backend/application/src/@aurora/modules/pdf/index.ts +7 -0
- package/dist/templates/backend/application/src/@aurora/modules/pdf/pdf-document.types.ts +48 -0
- package/dist/templates/backend/application/src/@aurora/modules/pdf/pdf-isolation.spec.ts +17 -0
- package/dist/templates/backend/application/src/@aurora/modules/pdf/pdf-renderer.service.ts +12 -0
- package/dist/templates/backend/application/src/@aurora/modules/pdf/pdfmake/index.ts +5 -0
- package/dist/templates/backend/application/src/@aurora/modules/pdf/pdfmake/pdfmake-renderer.service.spec.ts +58 -0
- package/dist/templates/backend/application/src/@aurora/modules/pdf/pdfmake/pdfmake-renderer.service.ts +123 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/aurora-report.token.ts +11 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/execute-report.service.spec.ts +154 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/execute-report.service.ts +112 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/index.ts +82 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-cardinality.guard.spec.ts +297 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-cardinality.guard.ts +180 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-cube.types.ts +409 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-cube.validator.spec.ts +289 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-cube.validator.ts +98 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-db-pool.preflight.spec.ts +241 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-db-pool.provider.spec.ts +95 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-db-pool.provider.ts +74 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-db-pool.token.ts +17 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-engine.module.spec.ts +119 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-engine.module.ts +105 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-preflight.service.ts +152 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-query.builder.spec.ts +451 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-query.builder.ts +319 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-registry.spec.ts +176 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-registry.ts +47 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-selection.validator.spec.ts +104 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-selection.validator.ts +64 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-tenant.scoper.spec.ts +232 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/report-tenant.scoper.ts +132 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/result-modes/client-mode.spec.ts +157 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/result-modes/client-mode.ts +93 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/result-modes/server-mode.spec.ts +289 -0
- package/dist/templates/backend/application/src/@aurora/modules/report-engine/result-modes/server-mode.ts +259 -0
- package/dist/templates/backend/application/src/@aurora/modules/server-static/index.ts +1 -1
- package/dist/templates/backend/application/src/@aurora/services/index.ts +2 -3
- package/dist/templates/backend/application/src/@aurora/services/logger.service.ts +20 -6
- package/dist/templates/backend/application/src/@aurora/shared.module.ts +11 -10
- package/dist/templates/backend/application/src/@bridges/bridges.module.ts +33 -4
- package/dist/templates/backend/application/src/@bridges/production-planning/operator-account/index.ts +1 -0
- package/dist/templates/backend/application/src/@bridges/production-planning/operator-account/ports/index.ts +2 -0
- package/dist/templates/backend/application/src/@bridges/production-planning/operator-account/ports/production-planning-operator-account-reader.port.ts +29 -0
- package/dist/templates/backend/application/src/@bridges/production-planning/operator-account/ports/production-planning-operator-account-reader.token.ts +3 -0
- package/dist/templates/backend/application/src/@bridges/storage-account/file-manager/adapters/index.ts +1 -0
- package/dist/templates/backend/application/src/@bridges/storage-account/file-manager/adapters/storage-account-file-manager.adapter.spec.ts +90 -0
- package/dist/templates/backend/application/src/@bridges/storage-account/file-manager/adapters/storage-account-file-manager.adapter.ts +36 -0
- package/dist/templates/backend/application/src/@bridges/storage-account/file-manager/index.ts +1 -0
- package/dist/templates/backend/application/src/@bridges/storage-account/file-manager/ports/index.ts +2 -0
- package/dist/templates/backend/application/src/@bridges/storage-account/file-manager/ports/storage-account-file-manager.port.ts +47 -0
- package/dist/templates/backend/application/src/@bridges/storage-account/file-manager/ports/storage-account-file-manager.token.ts +1 -0
- package/dist/templates/backend/application/src/@bridges/storage-account/signed-url/adapters/index.ts +1 -0
- package/dist/templates/backend/application/src/@bridges/storage-account/signed-url/adapters/storage-account-signed-url.adapter.spec.ts +69 -0
- package/dist/templates/backend/application/src/@bridges/storage-account/signed-url/adapters/storage-account-signed-url.adapter.ts +37 -0
- package/dist/templates/backend/application/src/@bridges/storage-account/signed-url/index.ts +1 -0
- package/dist/templates/backend/application/src/@bridges/storage-account/signed-url/ports/index.ts +2 -0
- package/dist/templates/backend/application/src/@bridges/storage-account/signed-url/ports/storage-account-signed-url.port.ts +21 -0
- package/dist/templates/backend/application/src/@bridges/storage-account/signed-url/ports/storage-account-signed-url.token.ts +1 -0
- package/dist/templates/backend/application/src/@config/bullmq/index.ts +1 -0
- package/dist/templates/backend/application/src/@config/drizzle/aurora-drizzle-schema.spec.ts +238 -0
- package/dist/templates/backend/application/src/@config/drizzle/aurora-drizzle-schema.ts +335 -0
- package/dist/templates/backend/application/src/@config/drizzle/aurora-field-schemas.spec.ts +92 -0
- package/dist/templates/backend/application/src/@config/drizzle/aurora-field-schemas.ts +158 -0
- package/dist/templates/backend/application/src/@config/drizzle/drizzle-migrations-journal.config.ts +31 -0
- package/dist/templates/backend/application/src/@config/drizzle/drizzle-migrations.module.spec.ts +153 -0
- package/dist/templates/backend/application/src/@config/drizzle/drizzle-migrations.module.ts +91 -0
- package/dist/templates/backend/application/src/@config/drizzle/index.ts +3 -0
- package/dist/templates/backend/application/src/@config/index.ts +6 -1
- package/dist/templates/backend/application/src/@config/lang/index.ts +1 -0
- package/dist/templates/backend/application/src/@config/lang/lang.providers.ts +26 -0
- package/dist/templates/backend/application/src/@config/mailer/index.ts +1 -1
- package/dist/templates/backend/application/src/@config/mailer/mailer-transport.module.ts +5 -1
- package/dist/templates/backend/application/src/@config/pdf/index.ts +1 -0
- package/dist/templates/backend/application/src/@config/pdf/pdf-renderer.module.spec.ts +53 -0
- package/dist/templates/backend/application/src/@config/pdf/pdf-renderer.module.ts +17 -0
- package/dist/templates/backend/application/src/@config/storage-account/index.ts +1 -0
- package/dist/templates/backend/application/src/@config/storage-account/storage-account.providers.spec.ts +48 -0
- package/dist/templates/backend/application/src/@config/storage-account/storage-account.providers.ts +34 -0
- package/dist/templates/backend/application/src/app.controller.spec.ts +2 -2
- package/dist/templates/backend/application/src/app.controller.ts +1 -1
- package/dist/templates/backend/application/src/app.module.ts +39 -7
- package/dist/templates/backend/application/src/database/migrations/0001_create_example_demo_table.sql +9 -0
- package/dist/templates/backend/application/src/database/migrations/0002_backfill_custom_field_group_entity_types.sql +19 -0
- package/dist/templates/backend/application/src/database/migrations/0003_create_production_order_header_code_sequence.sql +22 -0
- package/dist/templates/backend/application/src/database/migrations/0004_remove_null_elements_from_array_columns.sql +37 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260705093120_baseline/migration.sql +503 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260705093120_baseline/snapshot.json +6287 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260705095048_gap-finder/migration.sql +482 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260705095048_gap-finder/snapshot.json +12646 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260705144001_gap-finder-fixes/migration.sql +38 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260705144001_gap-finder-fixes/snapshot.json +12853 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260706090131_gap-finder-fx-normalization/migration.sql +17 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260706090131_gap-finder-fx-normalization/snapshot.json +13090 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260706102144_gap-finder-reported-currency/migration.sql +1 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260706102144_gap-finder-reported-currency/snapshot.json +13103 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260706104434_gap-finder-market-share-engine-version/migration.sql +4 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260706104434_gap-finder-market-share-engine-version/snapshot.json +13123 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260706121044_gap-finder-historical-price/migration.sql +17 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260706121044_gap-finder-historical-price/snapshot.json +13357 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260706143916_gap-finder-backtest-run-state-block/migration.sql +7 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260706143916_gap-finder-backtest-run-state-block/snapshot.json +13443 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260707080202_business-partner-portal/migration.sql +266 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260707080202_business-partner-portal/snapshot.json +17183 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260710072059_bpp-supplier-document-invoice-unique/migration.sql +18 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260710072059_bpp-supplier-document-invoice-unique/snapshot.json +17183 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260712072603_busy_mystique/migration.sql +177 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260712072603_busy_mystique/snapshot.json +19569 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260714215357_custom-fields/migration.sql +85 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260714215357_custom-fields/snapshot.json +20741 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260715072820_gap-finder-source-registry-latency/migration.sql +1 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260715072820_gap-finder-source-registry-latency/snapshot.json +20754 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260715110357_gap-finder-peer-group-curation-reason/migration.sql +1 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260715110357_gap-finder-peer-group-curation-reason/snapshot.json +20767 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260715151843_add-common-lang/migration.sql +22 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260715151843_add-common-lang/snapshot.json +21066 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260716165704_add_pivot_table_equipment_process/migration.sql +8 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260716165704_add_pivot_table_equipment_process/snapshot.json +21089 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260717132829_common-country/migration.sql +42 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260717132829_common-country/snapshot.json +21661 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260719084905_custom-field-group-label-i18n-embedded/migration.sql +5 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260719084905_custom-field-group-label-i18n-embedded/snapshot.json +21661 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260719175835_add-custom-field-group-entity-types/migration.sql +2 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260719175835_add-custom-field-group-entity-types/snapshot.json +21695 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260719235605_add-custom-field-entity-registry/migration.sql +13 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260719235605_add-custom-field-entity-registry/snapshot.json +21866 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260720094932_drop-custom-field-group-entity-pivot/migration.sql +1 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260720094932_drop-custom-field-group-entity-pivot/snapshot.json +21701 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260722150640_close-labeli18n-rename-and-tag-index-drift/migration.sql +12 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260722150640_close-labeli18n-rename-and-tag-index-drift/snapshot.json +21706 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260722165358_normalize-legacy-index-names/migration.sql +470 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260722165358_normalize-legacy-index-names/snapshot.json +21767 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260728173835_drop-iam-tag-custom-field-value/migration.sql +1 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260728173835_drop-iam-tag-custom-field-value/snapshot.json +21391 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260804193217_align-custom-field-option-i18n/migration.sql +3 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260804193217_align-custom-field-option-i18n/snapshot.json +21394 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260818175624_drop-gap-finder-tables/migration.sql +46 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260818175624_drop-gap-finder-tables/snapshot.json +14170 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260822160309_rename-position-total-processed-weight/migration.sql +1 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260822160309_rename-position-total-processed-weight/snapshot.json +14172 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260830220002_add-impersonation-credential/migration.sql +32 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260830220002_add-impersonation-credential/snapshot.json +14204 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260902105452_mask-oauth-token-columns/migration.sql +2 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260902105452_mask-oauth-token-columns/snapshot.json +14204 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260903214717_add-biller-master-data-tables/migration.sql +145 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260903214717_add-biller-master-data-tables/snapshot.json +16167 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260904195613_simplify-biller-tariff-model/migration.sql +42 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260904195613_simplify-biller-tariff-model/snapshot.json +15944 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260904235448_add-biller-billing-run-pipeline/migration.sql +144 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260904235448_add-biller-billing-run-pipeline/snapshot.json +17910 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260904235725_add-biller-invoice-number-sequence/migration.sql +1 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260904235725_add-biller-invoice-number-sequence/snapshot.json +17921 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260905090449_make-remittance-run-index-non-unique/migration.sql +2 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260905090449_make-remittance-run-index-non-unique/snapshot.json +17921 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260907223122_normalize-tools-native-enums/migration.sql +37 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260907223122_normalize-tools-native-enums/snapshot.json +17921 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260907224811_normalize-lacrem-native-enums/migration.sql +19 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260907224811_normalize-lacrem-native-enums/snapshot.json +17921 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260907225915_normalize-sap-integration-native-enums/migration.sql +58 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260907225915_normalize-sap-integration-native-enums/snapshot.json +17921 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260907231830_normalize-iam-native-enums/migration.sql +19 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260907231830_normalize-iam-native-enums/snapshot.json +17921 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260907232903_normalize-o-auth-native-enums/migration.sql +37 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260907232903_normalize-o-auth-native-enums/snapshot.json +17921 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260914212920_add-biller-billing-cycle-master/migration.sql +79 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260914212920_add-biller-billing-cycle-master/snapshot.json +17983 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260915072010_add-biller-charge-billed-by-billing-run/migration.sql +11 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260915072010_add-biller-charge-billed-by-billing-run/snapshot.json +18017 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260915113209_add-iam-account-has-add-child-tenants/migration.sql +1 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260915113209_add-iam-account-has-add-child-tenants/snapshot.json +17760 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260916230702_date-columns-to-real-date/migration.sql +22 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260916230702_date-columns-to-real-date/snapshot.json +18031 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260918120918_drop-biller-tables/migration.sql +14 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260918120918_drop-biller-tables/snapshot.json +14217 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260918121214_purge-biller-rows/migration.sql +28 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/20260918121214_purge-biller-rows/snapshot.json +14217 -0
- package/dist/templates/backend/application/src/database/migrations/drizzle/README.md +199 -0
- package/dist/templates/backend/application/src/database/procedures/calculate_order_total/1.sql +18 -0
- package/dist/templates/backend/application/src/database/procedures/production_planning_set_production_order_header_code/1.sql +38 -0
- package/dist/templates/backend/application/src/database/procedures/production_planning_set_production_order_position_code/1.sql +33 -0
- package/dist/templates/backend/application/src/database/procedures/production_planning_trg_set_production_order_header_code/1.sql +8 -0
- package/dist/templates/backend/application/src/database/procedures/production_planning_trg_set_production_order_position_code/1.sql +8 -0
- package/dist/templates/backend/application/src/main.ts +27 -19
- package/dist/templates/backend/application/src/repl.ts +2 -2
- package/dist/templates/backend/application/test/app.e2e-spec.ts +2 -1
- package/dist/templates/backend/application/test/vitest-setup.ts +13 -0
- package/dist/templates/backend/application/tsconfig.build.json +3 -1
- package/dist/templates/backend/application/tsconfig.json +8 -17
- package/dist/templates/backend/application/vitest.config.e2e.ts +24 -0
- package/dist/templates/backend/application/vitest.config.ts +18 -0
- package/dist/templates/backend/env/.env +8 -0
- package/dist/templates/backend/packages/authorization-code/src/@api/authorization-code/authorization-code.module.ts +3 -3
- package/dist/templates/backend/packages/authorization-code/src/@api/authorization-code/controllers/auth.controller.spec.ts +24 -38
- package/dist/templates/backend/packages/authorization-code/src/@api/authorization-code/controllers/auth.controller.ts +2 -3
- package/dist/templates/backend/packages/authorization-code/src/@api/authorization-code/controllers/index.ts +1 -0
- package/dist/templates/backend/packages/authorization-code/src/@api/authorization-code/pkce/index.ts +2 -0
- package/dist/templates/backend/packages/authorization-code/src/@api/authorization-code/pkce/pkce-helpers.spec.ts +2 -4
- package/dist/templates/backend/packages/authorization-code/src/@api/authorization-code/pkce/pkce-verifier-store.service.spec.ts +1 -1
- package/dist/templates/backend/packages/hub/src/@api/hub/app/controllers/hub-create-app.controller.ts +31 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/controllers/hub-delete-app-by-id.controller.ts +32 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/controllers/hub-find-app-by-id.controller.ts +31 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/controllers/hub-find-app.controller.ts +33 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/controllers/hub-get-apps.controller.ts +41 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/controllers/hub-my-preferences-app.controller.ts +31 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/controllers/hub-paginate-apps.controller.ts +32 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/controllers/hub-save-my-launchpad-layout-app.controller.ts +41 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/controllers/hub-toggle-favorite-app.controller.ts +34 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/controllers/hub-update-app-by-id.controller.ts +32 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/dto/hub-app.dto.ts +115 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/dto/hub-create-app.dto.ts +85 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/dto/hub-update-app-by-id.dto.ts +78 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/dto/hub-update-apps.dto.ts +78 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/dto/index.ts +8 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/graphql/hub-app.graphql +256 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/index.ts +87 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/resolvers/hub-create-app.resolver.ts +27 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/resolvers/hub-delete-app-by-id.resolver.ts +28 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/resolvers/hub-find-app-by-id.resolver.ts +26 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/resolvers/hub-find-app.resolver.ts +26 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/resolvers/hub-get-apps.resolver.ts +33 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/resolvers/hub-my-preferences-app.resolver.ts +27 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/resolvers/hub-paginate-apps.resolver.ts +26 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/resolvers/hub-save-my-launchpad-layout-app.resolver.ts +34 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/resolvers/hub-toggle-favorite-app.resolver.ts +30 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app/resolvers/hub-update-app-by-id.resolver.ts +28 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/controllers/hub-create-app-account.controller.ts +29 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/controllers/hub-create-apps-accounts.controller.ts +30 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/controllers/hub-delete-app-account-by-id.controller.ts +34 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/controllers/hub-delete-apps-accounts.controller.ts +35 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/controllers/hub-find-app-account-by-id.controller.ts +35 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/controllers/hub-find-app-account.controller.ts +36 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/controllers/hub-get-apps-accounts.controller.ts +36 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/controllers/hub-paginate-apps-accounts.controller.ts +32 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/controllers/hub-update-app-account-by-id.controller.ts +33 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/dto/hub-app-account.dto.ts +59 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/dto/hub-create-app-account.dto.ts +44 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/dto/hub-update-app-account-by-id.dto.ts +44 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/dto/hub-update-apps-accounts.dto.ts +44 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/dto/index.ts +8 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/graphql/hub-app-account.graphql +82 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/index.ts +81 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/resolvers/hub-create-app-account.resolver.ts +25 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/resolvers/hub-create-apps-accounts.resolver.ts +25 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/resolvers/hub-delete-app-account-by-id.resolver.ts +27 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/resolvers/hub-delete-apps-accounts.resolver.ts +26 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/resolvers/hub-find-app-account-by-id.resolver.ts +27 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/resolvers/hub-find-app-account.resolver.ts +26 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/resolvers/hub-get-apps-accounts.resolver.ts +26 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/resolvers/hub-paginate-apps-accounts.resolver.ts +26 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/app-account/resolvers/hub-update-app-account-by-id.resolver.ts +26 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/hub-per-app-permission.seeder.spec.ts +224 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/hub-per-app-permission.seeder.ts +131 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/hub.module.ts +34 -0
- package/dist/templates/backend/packages/hub/src/@api/hub/hub.seeder.ts +33 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/create/hub-create-app.handler.spec.ts +521 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/create/hub-create-app.handler.ts +234 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/create/hub-create-app.service.ts +19 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/delete/hub-delete-app-by-id.handler.spec.ts +419 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/delete/hub-delete-app-by-id.handler.ts +164 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/delete/hub-delete-app-by-id.service.ts +24 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/find/hub-find-app-by-id.handler.spec.ts +132 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/find/hub-find-app-by-id.handler.ts +35 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/find/hub-find-app-by-id.service.ts +22 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/find/hub-find-app.handler.spec.ts +172 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/find/hub-find-app.handler.ts +43 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/find/hub-find-app.service.ts +27 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/get/hub-get-apps.handler.spec.ts +331 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/get/hub-get-apps.handler.ts +84 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/get/hub-get-apps.service.ts +27 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/my-preferences/hub-my-preferences-app.handler.spec.ts +146 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/my-preferences/hub-my-preferences-app.handler.ts +38 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/paginate/hub-paginate-apps.handler.spec.ts +179 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/paginate/hub-paginate-apps.handler.ts +38 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/paginate/hub-paginate-apps.service.ts +27 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/save-my-launchpad-layout/hub-save-my-launchpad-layout-app.handler.spec.ts +354 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/save-my-launchpad-layout/hub-save-my-launchpad-layout-app.handler.ts +161 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/toggle-favorite/hub-toggle-favorite-app.handler.spec.ts +192 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/toggle-favorite/hub-toggle-favorite-app.handler.ts +60 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/update/hub-update-app-by-id.handler.spec.ts +274 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/update/hub-update-app-by-id.handler.ts +82 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/application/update/hub-update-app-by-id.service.ts +25 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/domain/hub-app-permission.ts +18 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/domain/hub-app.field-schema.ts +101 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/domain/index.ts +2 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/index.ts +79 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/infrastructure/drizzle/hub-drizzle-app.repository.ts +43 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/infrastructure/drizzle/hub-drizzle-app.schema.ts +40 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/shared/functions/hub-assert-no-accounts-reference.function.spec.ts +230 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/shared/functions/hub-assert-no-accounts-reference.function.ts +106 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/shared/functions/hub-sanitize-eager-loads-vs-relation-order.spec.ts +226 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/shared/functions/hub-sanitize-eager-loads.function.spec.ts +73 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/shared/functions/hub-sanitize-eager-loads.function.ts +27 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/shared/functions/hub-validate-redirect-uri.function.spec.ts +41 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/shared/functions/hub-validate-redirect-uri.function.ts +49 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/shared/functions/index.ts +3 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app/shared/index.ts +1 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/create/hub-create-app-account.handler.ts +28 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/create/hub-create-app-account.service.ts +25 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/create/hub-create-apps-accounts.handler.ts +26 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/create/hub-create-apps-accounts.service.ts +19 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/delete/hub-delete-app-account-by-id.handler.ts +41 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/delete/hub-delete-app-account-by-id.service.ts +37 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/delete/hub-delete-apps-accounts.handler.ts +34 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/delete/hub-delete-apps-accounts.service.ts +33 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/find/hub-find-app-account-by-id.handler.ts +32 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/find/hub-find-app-account-by-id.service.ts +31 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/find/hub-find-app-account.handler.ts +29 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/find/hub-find-app-account.service.ts +27 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/get/hub-get-apps-accounts.handler.ts +23 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/get/hub-get-apps-accounts.service.ts +27 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/paginate/hub-paginate-apps-accounts.handler.ts +23 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/paginate/hub-paginate-apps-accounts.service.ts +27 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/update/hub-update-app-account-by-id.handler.ts +64 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/application/update/hub-update-app-account-by-id.service.ts +33 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/domain/hub-app-account.field-schema.ts +53 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/domain/index.ts +1 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/index.ts +82 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/infrastructure/drizzle/hub-drizzle-app-account.repository.ts +40 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/app-account/infrastructure/drizzle/hub-drizzle-app-account.schema.ts +17 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/hub.relations.ts +23 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/hub.seed.ts +117 -0
- package/dist/templates/backend/packages/hub/src/@app/hub/index.ts +14 -0
- package/dist/templates/backend/packages/hub/src/@bridges/providers/iam-bounded-context-writer.bridge.ts +8 -0
- package/dist/templates/backend/packages/hub/src/@bridges/providers/iam-permission-writer.bridge.ts +8 -0
- package/dist/templates/backend/packages/hub/src/@bridges/providers/o-auth-application-provisioner.bridge.ts +8 -0
- package/dist/templates/backend/packages/hub/test/acceptance/hub/hub-app-account-composite-key.e2e-spec.ts +282 -0
- package/dist/templates/backend/packages/hub/test/acceptance/hub/hub-app-deprovisioning.e2e-spec.ts +472 -0
- package/dist/templates/backend/packages/hub/test/acceptance/hub/hub-app-provisioning.e2e-spec.ts +345 -0
- package/dist/templates/backend/packages/hub/test/acceptance/hub/hub-per-app-access.e2e-spec.ts +655 -0
- package/dist/templates/backend/packages/iam/src/@api/iam/account/controllers/iam-check-password-me-account.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/controllers/iam-check-unique-email-account.controller.ts +2 -2
- package/dist/templates/backend/packages/iam/src/@api/iam/account/controllers/iam-check-unique-username-account.controller.ts +2 -2
- package/dist/templates/backend/packages/iam/src/@api/iam/account/controllers/iam-count-account.controller.ts +32 -0
- package/dist/templates/backend/packages/iam/src/@api/iam/account/controllers/iam-create-account.controller.ts +6 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/account/controllers/iam-delete-account-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/controllers/iam-delete-accounts.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/account/controllers/iam-find-account-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/controllers/iam-find-account.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/account/controllers/iam-get-accounts.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/account/controllers/iam-me-account.controller.ts +6 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/account/controllers/iam-paginate-accounts.controller.ts +5 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/account/controllers/iam-paginate-with-tenant-constraint-accounts.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/controllers/iam-update-account-by-id.controller.ts +13 -8
- package/dist/templates/backend/packages/iam/src/@api/iam/account/controllers/iam-update-accounts.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/controllers/iam-update-me-account.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/dto/iam-account.dto.ts +20 -11
- package/dist/templates/backend/packages/iam/src/@api/iam/account/dto/iam-create-account.dto.ts +9 -29
- package/dist/templates/backend/packages/iam/src/@api/iam/account/dto/iam-update-account-by-id.dto.ts +9 -29
- package/dist/templates/backend/packages/iam/src/@api/iam/account/dto/iam-update-accounts.dto.ts +9 -21
- package/dist/templates/backend/packages/iam/src/@api/iam/account/dto/index.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@api/iam/account/graphql/iam-account.graphql +47 -44
- package/dist/templates/backend/packages/iam/src/@api/iam/account/index.ts +40 -34
- package/dist/templates/backend/packages/iam/src/@api/iam/account/resolvers/iam-check-password-me-account.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/resolvers/iam-check-unique-email-account.resolver.ts +2 -2
- package/dist/templates/backend/packages/iam/src/@api/iam/account/resolvers/iam-check-unique-username-account.resolver.ts +2 -2
- package/dist/templates/backend/packages/iam/src/@api/iam/account/resolvers/iam-count-account.resolver.ts +25 -0
- package/dist/templates/backend/packages/iam/src/@api/iam/account/resolvers/iam-create-account.resolver.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/resolvers/iam-delete-account-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/resolvers/iam-delete-accounts.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/resolvers/iam-find-account-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/resolvers/iam-find-account.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/resolvers/iam-get-accounts.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/resolvers/iam-me-account.resolver.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/resolvers/iam-paginate-accounts.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/resolvers/iam-paginate-with-tenant-constraint-accounts.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/resolvers/iam-update-account-by-id.resolver.ts +12 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/account/resolvers/iam-update-accounts.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/account/resolvers/iam-update-me-account.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/controllers/iam-create-bounded-context.controller.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/controllers/iam-create-bounded-contexts.controller.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/controllers/iam-delete-bounded-context-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/controllers/iam-delete-bounded-contexts.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/controllers/iam-find-bounded-context-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/controllers/iam-find-bounded-context.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/controllers/iam-get-bounded-contexts.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/controllers/iam-paginate-bounded-contexts.controller.ts +5 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/controllers/iam-update-bounded-context-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/controllers/iam-update-bounded-contexts.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/dto/iam-bounded-context.dto.ts +3 -2
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/dto/index.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/graphql/iam-bounded-context.graphql +24 -12
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/index.ts +24 -24
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/resolvers/iam-create-bounded-context.resolver.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/resolvers/iam-create-bounded-contexts.resolver.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/resolvers/iam-delete-bounded-context-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/resolvers/iam-delete-bounded-contexts.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/resolvers/iam-find-bounded-context-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/resolvers/iam-find-bounded-context.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/resolvers/iam-get-bounded-contexts.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/resolvers/iam-paginate-bounded-contexts.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/resolvers/iam-update-bounded-context-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/bounded-context/resolvers/iam-update-bounded-contexts.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/iam-bootstrap.seeder.spec.ts +46 -22
- package/dist/templates/backend/packages/iam/src/@api/iam/iam-bootstrap.seeder.ts +36 -23
- package/dist/templates/backend/packages/iam/src/@api/iam/iam.module.ts +46 -20
- package/dist/templates/backend/packages/iam/src/@api/iam/iam.seeder.ts +7 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/controllers/iam-create-permission.controller.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/controllers/iam-create-permissions.controller.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/controllers/iam-delete-permission-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/controllers/iam-delete-permissions.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/controllers/iam-find-permission-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/controllers/iam-find-permission.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/controllers/iam-get-permissions.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/controllers/iam-paginate-permissions.controller.ts +5 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/controllers/iam-update-permission-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/controllers/iam-update-permissions.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/dto/iam-permission.dto.ts +5 -4
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/dto/index.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/graphql/iam-permission.graphql +18 -15
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/index.ts +24 -24
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/resolvers/iam-create-permission.resolver.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/resolvers/iam-create-permissions.resolver.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/resolvers/iam-delete-permission-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/resolvers/iam-delete-permissions.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/resolvers/iam-find-permission-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/resolvers/iam-find-permission.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/resolvers/iam-get-permissions.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/resolvers/iam-paginate-permissions.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/resolvers/iam-update-permission-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission/resolvers/iam-update-permissions.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/controllers/iam-create-permission-role.controller.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/controllers/iam-create-permissions-roles.controller.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/controllers/iam-delete-permission-role-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/controllers/iam-delete-permissions-roles.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/controllers/iam-find-permission-role-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/controllers/iam-find-permission-role.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/controllers/iam-get-permissions-roles.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/controllers/iam-paginate-permissions-roles.controller.ts +5 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/controllers/iam-update-permission-role-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/controllers/iam-update-permissions-roles.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/dto/iam-permission-role.dto.ts +5 -4
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/dto/index.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/graphql/iam-permission-role.graphql +21 -9
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/index.ts +24 -24
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/resolvers/iam-create-permission-role.resolver.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/resolvers/iam-create-permissions-roles.resolver.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/resolvers/iam-delete-permission-role-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/resolvers/iam-delete-permissions-roles.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/resolvers/iam-find-permission-role-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/resolvers/iam-find-permission-role.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/resolvers/iam-get-permissions-roles.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/resolvers/iam-paginate-permissions-roles.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/resolvers/iam-update-permission-role-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/permission-role/resolvers/iam-update-permissions-roles.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role/controllers/iam-create-role.controller.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/role/controllers/iam-create-roles.controller.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/role/controllers/iam-delete-role-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role/controllers/iam-delete-roles.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/role/controllers/iam-find-role-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role/controllers/iam-find-role.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/role/controllers/iam-get-roles.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/role/controllers/iam-inherit-permissions-role-role.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role/controllers/iam-paginate-roles.controller.ts +5 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/role/controllers/iam-update-role-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role/controllers/iam-update-roles.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role/dto/iam-role.dto.ts +5 -4
- package/dist/templates/backend/packages/iam/src/@api/iam/role/dto/index.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@api/iam/role/graphql/iam-role.graphql +19 -19
- package/dist/templates/backend/packages/iam/src/@api/iam/role/index.ts +26 -26
- package/dist/templates/backend/packages/iam/src/@api/iam/role/resolvers/iam-create-role.resolver.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/role/resolvers/iam-create-roles.resolver.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/role/resolvers/iam-delete-role-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role/resolvers/iam-delete-roles.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role/resolvers/iam-find-role-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role/resolvers/iam-find-role.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role/resolvers/iam-get-roles.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role/resolvers/iam-inherit-permissions-role-role.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role/resolvers/iam-paginate-roles.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role/resolvers/iam-update-role-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role/resolvers/iam-update-roles.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/controllers/iam-create-role-account.controller.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/controllers/iam-create-roles-accounts.controller.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/controllers/iam-delete-role-account-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/controllers/iam-delete-roles-accounts.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/controllers/iam-find-role-account-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/controllers/iam-find-role-account.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/controllers/iam-get-roles-accounts.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/controllers/iam-paginate-roles-accounts.controller.ts +5 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/controllers/iam-update-role-account-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/controllers/iam-update-roles-accounts.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/dto/iam-role-account.dto.ts +5 -4
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/dto/index.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/graphql/iam-role-account.graphql +19 -9
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/index.ts +24 -24
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/resolvers/iam-create-role-account.resolver.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/resolvers/iam-create-roles-accounts.resolver.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/resolvers/iam-delete-role-account-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/resolvers/iam-delete-roles-accounts.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/resolvers/iam-find-role-account-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/resolvers/iam-find-role-account.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/resolvers/iam-get-roles-accounts.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/resolvers/iam-paginate-roles-accounts.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/resolvers/iam-update-role-account-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/role-account/resolvers/iam-update-roles-accounts.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/controllers/iam-create-tag.controller.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/controllers/iam-delete-tag-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/controllers/iam-find-tag-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/controllers/iam-find-tag.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/controllers/iam-get-tags.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/controllers/iam-paginate-tags.controller.ts +5 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/controllers/iam-update-tag-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/dto/index.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/graphql/iam-tag.graphql +9 -9
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/index.ts +18 -18
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/resolvers/iam-create-tag.resolver.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/resolvers/iam-delete-tag-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/resolvers/iam-find-tag-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/resolvers/iam-find-tag.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/resolvers/iam-get-tags.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/resolvers/iam-paginate-tags.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tag/resolvers/iam-update-tag-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/controllers/iam-create-tenant.controller.ts +7 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/controllers/iam-create-tenants.controller.ts +7 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/controllers/iam-delete-tenant-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/controllers/iam-delete-tenants.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/controllers/iam-find-tenant-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/controllers/iam-find-tenant.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/controllers/iam-get-tenants.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/controllers/iam-get-with-tenant-constraint-tenants.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/controllers/iam-paginate-tenants.controller.ts +5 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/controllers/iam-paginate-with-tenant-constraint-tenants.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/controllers/iam-update-tenant-by-id.controller.ts +13 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/controllers/iam-update-tenants.controller.ts +13 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/dto/iam-tenant.dto.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/dto/index.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/graphql/iam-tenant.graphql +24 -18
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/index.ts +28 -28
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/resolvers/iam-create-tenant.resolver.ts +6 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/resolvers/iam-create-tenants.resolver.ts +6 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/resolvers/iam-delete-tenant-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/resolvers/iam-delete-tenants.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/resolvers/iam-find-tenant-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/resolvers/iam-find-tenant.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/resolvers/iam-get-tenants.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/resolvers/iam-get-with-tenant-constraint-tenants.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/resolvers/iam-paginate-tenants.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/resolvers/iam-paginate-with-tenant-constraint-tenants.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/resolvers/iam-update-tenant-by-id.resolver.ts +12 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant/resolvers/iam-update-tenants.resolver.ts +12 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/controllers/iam-create-tenant-account.controller.ts +7 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/controllers/iam-create-tenants-accounts.controller.ts +7 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/controllers/iam-delete-tenant-account-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/controllers/iam-delete-tenants-accounts.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/controllers/iam-find-tenant-account-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/controllers/iam-find-tenant-account.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/controllers/iam-get-tenants-accounts.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/controllers/iam-paginate-tenants-accounts.controller.ts +5 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/controllers/iam-update-tenant-account-by-id.controller.ts +13 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/controllers/iam-update-tenants-accounts.controller.ts +13 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/dto/iam-tenant-account.dto.ts +5 -4
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/dto/index.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/graphql/iam-tenant-account.graphql +21 -9
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/index.ts +24 -24
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/resolvers/iam-create-tenant-account.resolver.ts +6 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/resolvers/iam-create-tenants-accounts.resolver.ts +6 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/resolvers/iam-delete-tenant-account-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/resolvers/iam-delete-tenants-accounts.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/resolvers/iam-find-tenant-account-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/resolvers/iam-find-tenant-account.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/resolvers/iam-get-tenants-accounts.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/resolvers/iam-paginate-tenants-accounts.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/resolvers/iam-update-tenant-account-by-id.resolver.ts +12 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/tenant-account/resolvers/iam-update-tenants-accounts.resolver.ts +12 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/user/controllers/iam-count-user.controller.ts +32 -0
- package/dist/templates/backend/packages/iam/src/@api/iam/user/controllers/iam-delete-user-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/user/controllers/iam-delete-users.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/user/controllers/iam-find-user-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/user/controllers/iam-find-user.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/user/controllers/iam-forgot-password-user.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/user/controllers/iam-get-users.controller.ts +6 -7
- package/dist/templates/backend/packages/iam/src/@api/iam/user/controllers/iam-paginate-users.controller.ts +5 -6
- package/dist/templates/backend/packages/iam/src/@api/iam/user/controllers/iam-reset-password-user.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/user/controllers/iam-update-user-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/user/controllers/iam-update-users.controller.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/user/dto/iam-user.dto.ts +3 -2
- package/dist/templates/backend/packages/iam/src/@api/iam/user/dto/index.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@api/iam/user/graphql/iam-user.graphql +20 -18
- package/dist/templates/backend/packages/iam/src/@api/iam/user/index.ts +30 -24
- package/dist/templates/backend/packages/iam/src/@api/iam/user/resolvers/iam-count-user.resolver.ts +25 -0
- package/dist/templates/backend/packages/iam/src/@api/iam/user/resolvers/iam-delete-user-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/user/resolvers/iam-delete-users.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/user/resolvers/iam-find-user-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/user/resolvers/iam-find-user.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/user/resolvers/iam-forgot-password-user.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/user/resolvers/iam-get-users.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/user/resolvers/iam-paginate-users.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/user/resolvers/iam-reset-password-user.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/user/resolvers/iam-update-user-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@api/iam/user/resolvers/iam-update-users.resolver.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/check-password-me/iam-check-password-me-account.handler.ts +4 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/check-unique-email/iam-check-unique-email-account.handler.spec.ts +75 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/check-unique-email/iam-check-unique-email-account.handler.ts +5 -2
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/check-unique-username/iam-check-unique-username-account.handler.spec.ts +75 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/check-unique-username/iam-check-unique-username-account.handler.ts +5 -2
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/count/iam-count-account.handler.ts +2 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/count/iam-count-account.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/create/iam-create-account.handler.spec.ts +236 -51
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/create/iam-create-account.handler.ts +99 -42
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/create/iam-create-account.service.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/create/iam-create-accounts.service.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/delete/iam-delete-account-by-id.handler.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/delete/iam-delete-account-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/delete/iam-delete-accounts.handler.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/delete/iam-delete-accounts.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/find/iam-find-account-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/find/iam-find-account-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/find/iam-find-account.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/find/iam-find-account.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/get/iam-get-accounts.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/get/iam-get-accounts.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/iam-account.payload-types.ts +34 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/me/iam-me-account.handler.spec.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/me/iam-me-account.handler.ts +2 -2
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/paginate/iam-paginate-accounts.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/paginate/iam-paginate-accounts.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/paginate-with-tenant-constraint/iam-paginate-with-tenant-constraint-accounts.handler.ts +4 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/update/iam-update-account-by-id.handler.spec.ts +497 -38
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/update/iam-update-account-by-id.handler.ts +171 -51
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/update/iam-update-account-by-id.service.ts +9 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/update/iam-update-accounts.handler.spec.ts +299 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/update/iam-update-accounts.handler.ts +107 -7
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/update/iam-update-accounts.service.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/update/subscribers/iam-account-updated-cache-invalidator.subscriber.spec.ts +62 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/update/subscribers/iam-account-updated-cache-invalidator.subscriber.ts +59 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/update-me/iam-update-me-account.handler.ts +5 -7
- package/dist/templates/backend/packages/iam/src/@app/iam/account/domain/iam-account.field-schema.ts +15 -7
- package/dist/templates/backend/packages/iam/src/@app/iam/account/domain/index.ts +1 -1
- package/dist/templates/backend/packages/iam/src/@app/iam/account/index.ts +45 -38
- package/dist/templates/backend/packages/iam/src/@app/iam/account/infrastructure/drizzle/iam-drizzle-account.repository.ts +144 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/account/infrastructure/drizzle/iam-drizzle-account.schema.ts +46 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/create/iam-create-bounded-context.handler.ts +5 -7
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/create/iam-create-bounded-context.service.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/create/iam-create-bounded-contexts.handler.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/create/iam-create-bounded-contexts.service.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/delete/iam-delete-bounded-context-by-id.handler.ts +5 -8
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/delete/iam-delete-bounded-context-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/delete/iam-delete-bounded-contexts.handler.ts +5 -8
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/delete/iam-delete-bounded-contexts.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/find/iam-find-bounded-context-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/find/iam-find-bounded-context-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/find/iam-find-bounded-context.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/find/iam-find-bounded-context.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/get/iam-get-bounded-contexts.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/get/iam-get-bounded-contexts.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/paginate/iam-paginate-bounded-contexts.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/paginate/iam-paginate-bounded-contexts.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/update/iam-update-bounded-context-by-id.handler.ts +12 -11
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/update/iam-update-bounded-context-by-id.service.ts +9 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/update/iam-update-bounded-contexts.handler.ts +6 -9
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/application/update/iam-update-bounded-contexts.service.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/domain/iam-bounded-context.field-schema.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/domain/index.ts +1 -1
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/index.ts +29 -29
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/infrastructure/drizzle/iam-drizzle-bounded-context.repository.ts +40 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/infrastructure/drizzle/iam-drizzle-bounded-context.schema.ts +33 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/iam.relations.ts +116 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/iam.seed.ts +45 -45
- package/dist/templates/backend/packages/iam/src/@app/iam/index.ts +25 -52
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/create/iam-create-permission.handler.ts +5 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/create/iam-create-permission.service.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/create/iam-create-permissions.handler.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/create/iam-create-permissions.service.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/delete/iam-delete-permission-by-id.handler.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/delete/iam-delete-permission-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/delete/iam-delete-permissions.handler.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/delete/iam-delete-permissions.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/find/iam-find-permission-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/find/iam-find-permission-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/find/iam-find-permission.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/find/iam-find-permission.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/get/iam-get-permissions.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/get/iam-get-permissions.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/get-permissions-without-role/iam-get-permissions-without-role.handler.spec.ts +121 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/get-permissions-without-role/iam-get-permissions-without-role.handler.ts +73 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/paginate/iam-paginate-permissions.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/paginate/iam-paginate-permissions.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/update/iam-update-permission-by-id.handler.ts +12 -8
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/update/iam-update-permission-by-id.service.ts +9 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/update/iam-update-permissions.handler.ts +6 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/application/update/iam-update-permissions.service.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/domain/iam-permission.field-schema.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/domain/index.ts +1 -1
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/index.ts +32 -29
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/infrastructure/drizzle/iam-drizzle-permission.repository.ts +100 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/infrastructure/drizzle/iam-drizzle-permission.schema.ts +23 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/create/iam-create-permission-role.handler.ts +5 -7
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/create/iam-create-permission-role.service.ts +6 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/create/iam-create-permissions-roles.handler.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/create/iam-create-permissions-roles.service.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/delete/iam-delete-permission-role-by-id.handler.ts +5 -8
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/delete/iam-delete-permission-role-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/delete/iam-delete-permissions-roles.handler.ts +5 -8
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/delete/iam-delete-permissions-roles.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/find/iam-find-permission-role-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/find/iam-find-permission-role-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/find/iam-find-permission-role.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/find/iam-find-permission-role.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/get/iam-get-permissions-roles.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/get/iam-get-permissions-roles.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/paginate/iam-paginate-permissions-roles.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/paginate/iam-paginate-permissions-roles.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/update/iam-update-permission-role-by-id.handler.ts +12 -11
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/update/iam-update-permission-role-by-id.service.ts +9 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/update/iam-update-permissions-roles.handler.ts +6 -9
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/application/update/iam-update-permissions-roles.service.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/domain/iam-permission-role.field-schema.ts +2 -2
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/domain/index.ts +1 -1
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/index.ts +29 -29
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/infrastructure/drizzle/iam-drizzle-permission-role.repository.ts +40 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/infrastructure/drizzle/iam-drizzle-permission-role.schema.ts +14 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/create/iam-create-role.handler.ts +5 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/create/iam-create-role.service.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/create/iam-create-roles.handler.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/create/iam-create-roles.service.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/delete/iam-delete-role-by-id.handler.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/delete/iam-delete-role-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/delete/iam-delete-roles.handler.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/delete/iam-delete-roles.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/find/iam-find-role-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/find/iam-find-role-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/find/iam-find-role.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/find/iam-find-role.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/get/iam-get-roles.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/get/iam-get-roles.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/inherit-permissions-role/iam-inherit-permissions-role-role.handler.ts +5 -7
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/paginate/iam-paginate-roles.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/paginate/iam-paginate-roles.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/update/iam-update-role-by-id.handler.ts +12 -8
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/update/iam-update-role-by-id.service.ts +9 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/update/iam-update-roles.handler.ts +6 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/role/application/update/iam-update-roles.service.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/role/domain/iam-role.field-schema.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/role/domain/index.ts +1 -1
- package/dist/templates/backend/packages/iam/src/@app/iam/role/index.ts +30 -30
- package/dist/templates/backend/packages/iam/src/@app/iam/role/infrastructure/drizzle/iam-drizzle-role.repository.ts +149 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/role/infrastructure/drizzle/iam-drizzle-role.schema.ts +33 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/create/iam-create-role-account.handler.ts +5 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/create/iam-create-role-account.service.ts +6 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/create/iam-create-roles-accounts.handler.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/create/iam-create-roles-accounts.service.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/delete/iam-delete-role-account-by-id.handler.ts +5 -8
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/delete/iam-delete-role-account-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/delete/iam-delete-roles-accounts.handler.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/delete/iam-delete-roles-accounts.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/find/iam-find-role-account-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/find/iam-find-role-account-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/find/iam-find-role-account.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/find/iam-find-role-account.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/get/iam-get-roles-accounts.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/get/iam-get-roles-accounts.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/paginate/iam-paginate-roles-accounts.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/paginate/iam-paginate-roles-accounts.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/update/iam-update-role-account-by-id.handler.ts +12 -11
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/update/iam-update-role-account-by-id.service.ts +9 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/update/iam-update-roles-accounts.handler.ts +6 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/application/update/iam-update-roles-accounts.service.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/domain/iam-role-account.field-schema.ts +2 -2
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/domain/index.ts +1 -1
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/index.ts +29 -29
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/infrastructure/drizzle/iam-drizzle-role-account.repository.ts +40 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/infrastructure/drizzle/iam-drizzle-role-account.schema.ts +14 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/shared/functions/iam-create-permissions-from-roles.function.ts +2 -2
- package/dist/templates/backend/packages/iam/src/@app/iam/shared/functions/iam-resolve-account-tenants.function.spec.ts +100 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/shared/functions/iam-resolve-account-tenants.function.ts +59 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/shared/iam-bootstrap.constants.ts +19 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/shared/index.ts +4 -2
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/application/create/iam-create-tag.handler.ts +5 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/application/create/iam-create-tag.service.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/application/delete/iam-delete-tag-by-id.handler.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/application/delete/iam-delete-tag-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/application/find/iam-find-tag-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/application/find/iam-find-tag-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/application/find/iam-find-tag.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/application/find/iam-find-tag.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/application/get/iam-get-tags.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/application/get/iam-get-tags.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/application/paginate/iam-paginate-tags.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/application/paginate/iam-paginate-tags.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/application/update/iam-update-tag-by-id.handler.ts +12 -8
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/application/update/iam-update-tag-by-id.service.ts +9 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/domain/iam-tag.field-schema.ts +3 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/domain/index.ts +1 -1
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/index.ts +23 -23
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/infrastructure/drizzle/iam-drizzle-tag.repository.ts +35 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/infrastructure/drizzle/iam-drizzle-tag.schema.ts +21 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/create/iam-create-tenant.handler.spec.ts +195 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/create/iam-create-tenant.handler.ts +85 -7
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/create/iam-create-tenant.service.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/create/iam-create-tenants.handler.spec.ts +98 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/create/iam-create-tenants.handler.ts +53 -7
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/create/iam-create-tenants.service.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/delete/iam-delete-tenant-by-id.handler.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/delete/iam-delete-tenant-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/delete/iam-delete-tenants.handler.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/delete/iam-delete-tenants.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/find/iam-find-tenant-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/find/iam-find-tenant-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/find/iam-find-tenant.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/find/iam-find-tenant.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/get/iam-get-tenants.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/get/iam-get-tenants.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/get-with-tenant-constraint/iam-get-with-tenant-constraint-tenants.handler.ts +4 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/paginate/iam-paginate-tenants.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/paginate/iam-paginate-tenants.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/paginate-with-tenant-constraint/iam-paginate-with-tenant-constraint-tenants.handler.ts +4 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/update/iam-update-tenant-by-id.handler.spec.ts +222 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/update/iam-update-tenant-by-id.handler.ts +83 -8
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/update/iam-update-tenant-by-id.service.ts +9 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/update/iam-update-tenants.handler.spec.ts +75 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/update/iam-update-tenants.handler.ts +28 -7
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/application/update/iam-update-tenants.service.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/domain/iam-tenant.field-schema.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/domain/index.ts +1 -1
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/index.ts +31 -31
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/infrastructure/drizzle/iam-drizzle-tenant.repository.ts +108 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/infrastructure/drizzle/iam-drizzle-tenant.schema.ts +35 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/create/iam-create-tenant-account.handler.spec.ts +115 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/create/iam-create-tenant-account.handler.ts +38 -9
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/create/iam-create-tenant-account.service.ts +6 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/create/iam-create-tenants-accounts.handler.spec.ts +105 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/create/iam-create-tenants-accounts.handler.ts +43 -7
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/create/iam-create-tenants-accounts.service.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/delete/iam-delete-tenant-account-by-id.handler.ts +5 -8
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/delete/iam-delete-tenant-account-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/delete/iam-delete-tenants-accounts.handler.ts +5 -8
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/delete/iam-delete-tenants-accounts.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/find/iam-find-tenant-account-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/find/iam-find-tenant-account-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/find/iam-find-tenant-account.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/find/iam-find-tenant-account.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/get/iam-get-tenants-accounts.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/get/iam-get-tenants-accounts.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/paginate/iam-paginate-tenants-accounts.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/paginate/iam-paginate-tenants-accounts.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/update/iam-update-tenant-account-by-id.handler.spec.ts +83 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/update/iam-update-tenant-account-by-id.handler.ts +33 -11
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/update/iam-update-tenant-account-by-id.service.ts +9 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/update/iam-update-tenants-accounts.handler.spec.ts +78 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/update/iam-update-tenants-accounts.handler.ts +27 -10
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/application/update/iam-update-tenants-accounts.service.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/domain/iam-tenant-account.field-schema.ts +2 -2
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/domain/index.ts +1 -1
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/index.ts +29 -29
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/infrastructure/drizzle/iam-drizzle-tenant-account.repository.ts +40 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/infrastructure/drizzle/iam-drizzle-tenant-account.schema.ts +14 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/count/iam-count-user.handler.ts +2 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/count/iam-count-user.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/create/iam-create-user.handler.ts +5 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/create/iam-create-user.service.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/create/iam-create-users.handler.ts +4 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/create/iam-create-users.service.ts +4 -3
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/delete/iam-delete-user-by-id.handler.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/delete/iam-delete-user-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/delete/iam-delete-users.handler.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/delete/iam-delete-users.service.ts +3 -4
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/find/iam-find-user-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/find/iam-find-user-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/find/iam-find-user-by-username-password.service.spec.ts +24 -14
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/find/iam-find-user-by-username-password.service.ts +23 -21
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/find/iam-find-user.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/find/iam-find-user.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/forgot-password/iam-forgot-password-user.handler.ts +5 -7
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/get/iam-get-users.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/get/iam-get-users.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/paginate/iam-paginate-users.handler.ts +4 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/paginate/iam-paginate-users.service.ts +7 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/reset-password/iam-reset-password-user.handler.ts +5 -7
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/update/iam-update-user-by-id.handler.ts +12 -8
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/update/iam-update-user-by-id.service.ts +9 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/update/iam-update-users.handler.ts +6 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/user/application/update/iam-update-users.service.ts +5 -5
- package/dist/templates/backend/packages/iam/src/@app/iam/user/domain/iam-user.field-schema.spec.ts +36 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/user/domain/iam-user.field-schema.ts +6 -6
- package/dist/templates/backend/packages/iam/src/@app/iam/user/domain/index.ts +1 -1
- package/dist/templates/backend/packages/iam/src/@app/iam/user/index.ts +42 -35
- package/dist/templates/backend/packages/iam/src/@app/iam/user/infrastructure/drizzle/iam-drizzle-user.repository.ts +40 -0
- package/dist/templates/backend/packages/iam/src/@app/iam/user/infrastructure/drizzle/iam-drizzle-user.schema.ts +42 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/account/adapters/iam-account-loader.adapter.spec.ts +827 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/account/adapters/iam-account-loader.adapter.ts +223 -20
- package/dist/templates/backend/packages/iam/src/@bridges/iam/account/adapters/iam-account-provisioner.adapter.spec.ts +282 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/account/adapters/iam-account-provisioner.adapter.ts +121 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/account/adapters/iam-operator-account-reader.adapter.spec.ts +63 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/account/adapters/iam-operator-account-reader.adapter.ts +39 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/account/adapters/index.ts +3 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/account/index.ts +1 -1
- package/dist/templates/backend/packages/iam/src/@bridges/iam/account/ports/iam-account-provisioner.port.ts +88 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/account/ports/iam-account-provisioner.token.ts +1 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/account/ports/index.ts +2 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/bounded-context/adapters/iam-bounded-context-seeder.adapter.ts +2 -2
- package/dist/templates/backend/packages/iam/src/@bridges/iam/bounded-context/adapters/iam-bounded-context-writer.adapter.spec.ts +156 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/bounded-context/adapters/iam-bounded-context-writer.adapter.ts +75 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/bounded-context/adapters/index.ts +2 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/bounded-context/index.ts +1 -1
- package/dist/templates/backend/packages/iam/src/@bridges/iam/bounded-context/ports/iam-bounded-context-writer.port.ts +49 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/bounded-context/ports/iam-bounded-context-writer.token.ts +1 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/bounded-context/ports/index.ts +4 -2
- package/dist/templates/backend/packages/iam/src/@bridges/iam/client/index.ts +1 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/client/ports/index.ts +2 -2
- package/dist/templates/backend/packages/iam/src/@bridges/iam/permission/adapters/iam-permission-seeder.adapter.ts +2 -2
- package/dist/templates/backend/packages/iam/src/@bridges/iam/permission/adapters/iam-permission-writer.adapter.spec.ts +315 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/permission/adapters/iam-permission-writer.adapter.ts +147 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/permission/adapters/index.ts +2 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/permission/index.ts +1 -1
- package/dist/templates/backend/packages/iam/src/@bridges/iam/permission/ports/iam-permission-writer.port.ts +70 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/permission/ports/iam-permission-writer.token.ts +1 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/permission/ports/index.ts +4 -2
- package/dist/templates/backend/packages/iam/src/@bridges/iam/tenant/adapters/iam-tenant-writer.adapter.spec.ts +173 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/tenant/adapters/iam-tenant-writer.adapter.ts +63 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/tenant/adapters/index.ts +1 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/tenant/index.ts +1 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/tenant/ports/iam-tenant-writer.port.ts +54 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/tenant/ports/iam-tenant-writer.token.ts +1 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/tenant/ports/index.ts +2 -0
- package/dist/templates/backend/packages/iam/src/@bridges/iam/user/adapters/iam-credential-verifier.adapter.ts +2 -2
- package/dist/templates/backend/packages/iam/src/@bridges/iam/user/adapters/index.ts +1 -0
- package/dist/templates/backend/packages/iam/src/@bridges/providers/account-loader.bridge.ts +2 -2
- package/dist/templates/backend/packages/iam/src/@bridges/providers/credential-verifier.bridge.ts +2 -2
- package/dist/templates/backend/packages/iam/src/@bridges/providers/iam-bounded-context-seeder.bridge.ts +2 -2
- package/dist/templates/backend/packages/iam/src/@bridges/providers/iam-permission-seeder.bridge.ts +2 -2
- package/dist/templates/backend/packages/iam/test/acceptance/iam/core-back-exception-status.e2e-spec.ts +286 -0
- package/dist/templates/backend/packages/iam/test/acceptance/iam/user-sensitive-fields-masking.e2e-spec.ts +289 -0
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/controllers/o-auth-count-access-token.controller.ts +32 -0
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/controllers/o-auth-delete-access-token-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/controllers/o-auth-find-access-token-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/controllers/o-auth-find-access-token.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/controllers/o-auth-get-access-tokens.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/controllers/o-auth-paginate-access-tokens.controller.ts +5 -6
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/dto/index.ts +4 -4
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/dto/o-auth-access-token.dto.ts +6 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/dto/o-auth-create-access-token.dto.ts +5 -4
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/dto/o-auth-update-access-token-by-id.dto.ts +5 -4
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/dto/o-auth-update-access-tokens.dto.ts +5 -4
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/graphql/o-auth-access-token.graphql +25 -14
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/index.ts +20 -14
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/resolvers/o-auth-count-access-token.resolver.ts +25 -0
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/resolvers/o-auth-delete-access-token-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/resolvers/o-auth-find-access-token-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/resolvers/o-auth-find-access-token.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/resolvers/o-auth-get-access-tokens.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/access-token/resolvers/o-auth-paginate-access-tokens.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/controllers/o-auth-create-application.controller.ts +3 -3
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/controllers/o-auth-delete-application-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/controllers/o-auth-find-application-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/controllers/o-auth-find-application.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/controllers/o-auth-get-applications.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/controllers/o-auth-paginate-applications.controller.ts +5 -6
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/controllers/o-auth-update-application-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/dto/index.ts +4 -4
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/dto/o-auth-application.dto.ts +4 -3
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/dto/o-auth-create-application.dto.ts +1 -1
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/dto/o-auth-update-application-by-id.dto.ts +1 -1
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/dto/o-auth-update-applications.dto.ts +1 -1
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/graphql/o-auth-application.graphql +23 -14
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/index.ts +18 -18
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/resolvers/o-auth-create-application.resolver.ts +3 -3
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/resolvers/o-auth-delete-application-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/resolvers/o-auth-find-application-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/resolvers/o-auth-find-application.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/resolvers/o-auth-get-applications.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/resolvers/o-auth-paginate-applications.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application/resolvers/o-auth-update-application-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/controllers/o-auth-create-application-client.controller.ts +3 -3
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/controllers/o-auth-create-applications-clients.controller.ts +3 -3
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/controllers/o-auth-delete-application-client-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/controllers/o-auth-delete-applications-clients.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/controllers/o-auth-find-application-client-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/controllers/o-auth-find-application-client.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/controllers/o-auth-get-applications-clients.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/controllers/o-auth-paginate-applications-clients.controller.ts +5 -6
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/controllers/o-auth-update-application-client-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/dto/index.ts +4 -4
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/dto/o-auth-application-client.dto.ts +5 -4
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/graphql/o-auth-application-client.graphql +13 -10
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/index.ts +22 -22
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/resolvers/o-auth-create-application-client.resolver.ts +3 -3
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/resolvers/o-auth-create-applications-clients.resolver.ts +3 -3
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/resolvers/o-auth-delete-application-client-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/resolvers/o-auth-delete-applications-clients.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/resolvers/o-auth-find-application-client-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/resolvers/o-auth-find-application-client.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/resolvers/o-auth-get-applications-clients.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/resolvers/o-auth-paginate-applications-clients.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/application-client/resolvers/o-auth-update-application-client-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/controllers/o-auth-create-authorization-code.controller.ts +3 -3
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/controllers/o-auth-delete-authorization-code-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/controllers/o-auth-delete-authorization-codes.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/controllers/o-auth-find-authorization-code-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/controllers/o-auth-find-authorization-code.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/controllers/o-auth-get-authorization-codes.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/controllers/o-auth-paginate-authorization-codes.controller.ts +5 -6
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/controllers/o-auth-update-authorization-code-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/dto/index.ts +4 -4
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/dto/o-auth-authorization-code.dto.ts +3 -2
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/graphql/o-auth-authorization-code.graphql +20 -17
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/index.ts +20 -20
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/resolvers/o-auth-create-authorization-code.resolver.ts +3 -3
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/resolvers/o-auth-delete-authorization-code-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/resolvers/o-auth-delete-authorization-codes.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/resolvers/o-auth-find-authorization-code-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/resolvers/o-auth-find-authorization-code.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/resolvers/o-auth-get-authorization-codes.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/resolvers/o-auth-paginate-authorization-codes.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/authorization-code/resolvers/o-auth-update-authorization-code-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/controllers/o-auth-create-client.controller.ts +3 -3
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/controllers/o-auth-delete-client-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/controllers/o-auth-find-client-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/controllers/o-auth-find-client.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/controllers/o-auth-get-clients.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/controllers/o-auth-paginate-clients.controller.ts +5 -6
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/controllers/o-auth-update-client-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/dto/index.ts +4 -4
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/dto/o-auth-client.dto.ts +6 -12
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/dto/o-auth-create-client.dto.ts +1 -8
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/dto/o-auth-update-client-by-id.dto.ts +1 -8
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/dto/o-auth-update-clients.dto.ts +1 -8
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/graphql/o-auth-client.graphql +16 -23
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/index.ts +18 -18
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/resolvers/o-auth-create-client.resolver.ts +3 -3
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/resolvers/o-auth-delete-client-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/resolvers/o-auth-find-client-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/resolvers/o-auth-find-client.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/resolvers/o-auth-get-clients.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/resolvers/o-auth-paginate-clients.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/client/resolvers/o-auth-update-client-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/credential/controllers/o-auth-find-credential-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/credential/controllers/o-auth-find-credential.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/credential/controllers/o-auth-get-credentials.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/credential/controllers/o-auth-paginate-credentials.controller.ts +5 -6
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/credential/dto/index.ts +1 -1
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/credential/dto/o-auth-credential.dto.ts +24 -9
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/credential/graphql/o-auth-credential.graphql +31 -6
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/credential/index.ts +9 -9
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/credential/resolvers/o-auth-find-credential-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/credential/resolvers/o-auth-find-credential.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/credential/resolvers/o-auth-get-credentials.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/credential/resolvers/o-auth-paginate-credentials.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/controllers/o-auth-authorize.controller.spec.ts +33 -25
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/controllers/o-auth-authorize.controller.ts +2 -6
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/controllers/o-auth-create-impersonate-token.controller.ts +73 -0
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/controllers/o-auth-create-token.controller.spec.ts +5 -4
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/controllers/o-auth-create-token.controller.ts +3 -6
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/controllers/o-auth-get-jwks.controller.spec.ts +5 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/controllers/o-auth-get-jwks.controller.ts +1 -4
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/controllers/o-auth-logout.controller.spec.ts +52 -31
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/controllers/o-auth-logout.controller.ts +6 -9
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/controllers/o-auth-revoke-token.controller.spec.ts +5 -4
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/controllers/o-auth-revoke-token.controller.ts +2 -2
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/controllers/o-auth-session.controller.spec.ts +13 -12
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/controllers/o-auth-session.controller.ts +1 -1
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/graphql/flows.graphql +32 -0
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/index.ts +18 -10
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/resolvers/o-auth-create-impersonate-token.resolver.ts +89 -0
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/resolvers/o-auth-create-token.resolver.spec.ts +10 -6
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/resolvers/o-auth-create-token.resolver.ts +8 -8
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/resolvers/o-auth-revoke-token.resolver.spec.ts +10 -8
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/flows/resolvers/o-auth-revoke-token.resolver.ts +7 -4
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/o-auth-bootstrap.seeder.spec.ts +111 -41
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/o-auth-bootstrap.seeder.ts +38 -23
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/o-auth.module.ts +20 -20
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/o-auth.seeder.ts +18 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/controllers/o-auth-delete-refresh-token-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/controllers/o-auth-find-refresh-token-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/controllers/o-auth-find-refresh-token.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/controllers/o-auth-get-refresh-tokens.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/controllers/o-auth-paginate-refresh-tokens.controller.ts +5 -6
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/dto/index.ts +4 -4
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/dto/o-auth-create-refresh-token.dto.ts +1 -1
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/dto/o-auth-refresh-token.dto.ts +4 -3
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/dto/o-auth-update-refresh-token-by-id.dto.ts +1 -1
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/dto/o-auth-update-refresh-tokens.dto.ts +1 -1
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/graphql/o-auth-refresh-token.graphql +23 -14
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/index.ts +14 -14
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/resolvers/o-auth-delete-refresh-token-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/resolvers/o-auth-find-refresh-token-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/resolvers/o-auth-find-refresh-token.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/resolvers/o-auth-get-refresh-tokens.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/refresh-token/resolvers/o-auth-paginate-refresh-tokens.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/controllers/o-auth-create-scope.controller.ts +3 -3
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/controllers/o-auth-delete-scope-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/controllers/o-auth-find-scope-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/controllers/o-auth-find-scope.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/controllers/o-auth-get-scopes.controller.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/controllers/o-auth-paginate-scopes.controller.ts +5 -6
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/controllers/o-auth-update-scope-by-id.controller.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/dto/index.ts +4 -4
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/graphql/o-auth-scope.graphql +16 -13
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/index.ts +18 -18
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/resolvers/o-auth-create-scope.resolver.ts +3 -3
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/resolvers/o-auth-delete-scope-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/resolvers/o-auth-find-scope-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/resolvers/o-auth-find-scope.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/resolvers/o-auth-get-scopes.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/resolvers/o-auth-paginate-scopes.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@api/o-auth/scope/resolvers/o-auth-update-scope-by-id.resolver.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/application/count/o-auth-count-access-token.handler.ts +20 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/application/count/o-auth-count-access-token.service.ts +24 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/application/create/o-auth-create-access-token.handler.ts +5 -7
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/application/create/o-auth-create-access-token.service.ts +4 -3
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/application/delete/o-auth-delete-access-token-by-id.handler.ts +5 -8
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/application/delete/o-auth-delete-access-token-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/application/find/o-auth-find-access-token-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/application/find/o-auth-find-access-token-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/application/find/o-auth-find-access-token.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/application/find/o-auth-find-access-token.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/application/get/o-auth-get-access-tokens.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/application/get/o-auth-get-access-tokens.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/application/paginate/o-auth-paginate-access-tokens.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/application/paginate/o-auth-paginate-access-tokens.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/domain/index.ts +1 -1
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/domain/o-auth-access-token.field-schema.ts +8 -7
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/index.ts +27 -21
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/infrastructure/drizzle/o-auth-drizzle-access-token.repository.ts +40 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/infrastructure/drizzle/o-auth-drizzle-access-token.schema.ts +35 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/application/create/o-auth-create-application.handler.ts +5 -7
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/application/create/o-auth-create-application.service.ts +4 -3
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/application/delete/o-auth-delete-application-by-id.handler.ts +5 -8
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/application/delete/o-auth-delete-application-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/application/find/o-auth-find-application-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/application/find/o-auth-find-application-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/application/find/o-auth-find-application.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/application/find/o-auth-find-application.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/application/get/o-auth-get-applications.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/application/get/o-auth-get-applications.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/application/paginate/o-auth-paginate-applications.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/application/paginate/o-auth-paginate-applications.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/application/update/o-auth-update-application-by-id.handler.spec.ts +144 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/application/update/o-auth-update-application-by-id.handler.ts +12 -11
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/application/update/o-auth-update-application-by-id.service.ts +9 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/domain/index.ts +1 -1
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/domain/o-auth-application.field-schema.spec.ts +20 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/domain/o-auth-application.field-schema.ts +6 -7
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/index.ts +23 -23
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/infrastructure/drizzle/o-auth-drizzle-application.repository.ts +102 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/infrastructure/drizzle/o-auth-drizzle-application.schema.ts +32 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/create/o-auth-create-application-client.handler.ts +5 -7
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/create/o-auth-create-application-client.service.ts +6 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/create/o-auth-create-applications-clients.handler.ts +4 -4
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/create/o-auth-create-applications-clients.service.ts +7 -3
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/delete/o-auth-delete-application-client-by-id.handler.ts +5 -8
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/delete/o-auth-delete-application-client-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/delete/o-auth-delete-applications-clients.handler.ts +5 -8
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/delete/o-auth-delete-applications-clients.service.ts +3 -4
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/find/o-auth-find-application-client-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/find/o-auth-find-application-client-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/find/o-auth-find-application-client.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/find/o-auth-find-application-client.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/get/o-auth-get-applications-clients.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/get/o-auth-get-applications-clients.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/paginate/o-auth-paginate-applications-clients.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/paginate/o-auth-paginate-applications-clients.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/update/o-auth-update-application-client-by-id.handler.ts +12 -11
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/application/update/o-auth-update-application-client-by-id.service.ts +9 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/domain/index.ts +1 -1
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/domain/o-auth-application-client.field-schema.ts +2 -2
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/index.ts +27 -27
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/infrastructure/drizzle/o-auth-drizzle-application-client.repository.ts +40 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/infrastructure/drizzle/o-auth-drizzle-application-client.schema.ts +14 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/application/create/o-auth-create-authorization-code.handler.ts +5 -7
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/application/create/o-auth-create-authorization-code.service.ts +4 -3
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/application/delete/o-auth-delete-authorization-code-by-id.handler.ts +5 -8
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/application/delete/o-auth-delete-authorization-code-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/application/delete/o-auth-delete-authorization-codes.handler.ts +5 -8
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/application/delete/o-auth-delete-authorization-codes.service.ts +3 -4
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/application/find/o-auth-find-authorization-code-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/application/find/o-auth-find-authorization-code-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/application/find/o-auth-find-authorization-code.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/application/find/o-auth-find-authorization-code.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/application/get/o-auth-get-authorization-codes.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/application/get/o-auth-get-authorization-codes.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/application/paginate/o-auth-paginate-authorization-codes.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/application/paginate/o-auth-paginate-authorization-codes.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/application/update/o-auth-update-authorization-code-by-id.handler.ts +12 -11
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/application/update/o-auth-update-authorization-code-by-id.service.ts +9 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/domain/index.ts +1 -1
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/domain/o-auth-authorization-code.field-schema.ts +5 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/index.ts +25 -25
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/infrastructure/drizzle/o-auth-drizzle-authorization-code.repository.ts +66 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/infrastructure/drizzle/o-auth-drizzle-authorization-code.schema.ts +42 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/application/create/o-auth-create-client.handler.ts +5 -4
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/application/create/o-auth-create-client.service.ts +4 -3
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/application/delete/o-auth-delete-client-by-id.handler.ts +5 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/application/delete/o-auth-delete-client-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/application/find/o-auth-find-client-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/application/find/o-auth-find-client-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/application/find/o-auth-find-client.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/application/find/o-auth-find-client.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/application/get/o-auth-get-clients.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/application/get/o-auth-get-clients.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/application/paginate/o-auth-paginate-clients.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/application/paginate/o-auth-paginate-clients.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/application/update/o-auth-update-client-by-id.handler.ts +14 -8
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/application/update/o-auth-update-client-by-id.service.ts +9 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/domain/index.ts +1 -1
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/domain/o-auth-client.field-schema.ts +5 -12
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/index.ts +23 -23
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/infrastructure/drizzle/o-auth-drizzle-client.repository.ts +109 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/infrastructure/drizzle/o-auth-drizzle-client.schema.ts +35 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/application/create/o-auth-create-credential.service.spec.ts +62 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/application/create/o-auth-create-credential.service.ts +4 -3
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/application/find/o-auth-find-credential-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/application/find/o-auth-find-credential-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/application/find/o-auth-find-credential.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/application/find/o-auth-find-credential.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/application/get/o-auth-get-credentials.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/application/get/o-auth-get-credentials.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/application/paginate/o-auth-paginate-credentials.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/application/paginate/o-auth-paginate-credentials.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/domain/index.ts +1 -1
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/domain/o-auth-credential.field-schema.ts +19 -7
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/index.ts +18 -18
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/infrastructure/drizzle/o-auth-drizzle-credential.repository.ts +38 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/infrastructure/drizzle/o-auth-drizzle-credential.schema.ts +31 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/authorize/o-auth-authorize.handler.spec.ts +37 -35
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/authorize/o-auth-authorize.handler.ts +9 -18
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/create-token/o-auth-create-token.handler.spec.ts +12 -11
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/create-token/o-auth-create-token.handler.ts +5 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/create-token/services/o-auth-create-token-authorization-code.service.spec.ts +72 -36
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/create-token/services/o-auth-create-token-authorization-code.service.ts +26 -16
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/create-token/services/o-auth-create-token-password.service.spec.ts +58 -24
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/create-token/services/o-auth-create-token-password.service.ts +20 -11
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/create-token/services/o-auth-create-token-refresh.service.spec.ts +126 -66
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/create-token/services/o-auth-create-token-refresh.service.ts +50 -33
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/get-jwks/o-auth-get-jwks.handler.spec.ts +3 -3
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/get-jwks/o-auth-get-jwks.handler.ts +4 -1
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/impersonate-token/o-auth-create-impersonate-token.handler.spec.ts +351 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/impersonate-token/o-auth-create-impersonate-token.handler.ts +117 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/impersonate-token/services/o-auth-create-impersonate-token.service.spec.ts +242 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/impersonate-token/services/o-auth-create-impersonate-token.service.ts +156 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/revoke-token/o-auth-revoke-token.handler.spec.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/revoke-token/o-auth-revoke-token.handler.ts +2 -2
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/revoke-token/services/o-auth-revoke-token.service.spec.ts +134 -37
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/revoke-token/services/o-auth-revoke-token.service.ts +67 -28
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/session/o-auth-hub-session.service.spec.ts +22 -18
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/application/session/o-auth-hub-session.service.ts +4 -1
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/domain/errors/impersonation-chain.error.ts +26 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/domain/errors/impersonation-permission-refresh-failed.error.ts +34 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/domain/errors/impersonation-self.error.ts +25 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/domain/errors/impersonation-target-no-client.error.ts +26 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/domain/errors/impersonation-target-not-found.error.ts +27 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/domain/errors/impersonation-target-privileged.error.ts +26 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/domain/errors/impersonation-unavailable.error.ts +36 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/domain/errors/impersonation.errors.spec.ts +132 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/domain/errors/index.ts +12 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/domain/flows.types.ts +38 -3
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/domain/impersonation-privilege-denylist.spec.ts +281 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/domain/impersonation-privilege-denylist.ts +239 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/domain/index.ts +2 -2
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/index.ts +36 -28
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/shared/pkce/o-auth-verify-pkce-s256.spec.ts +3 -3
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/flows/shared/pkce/o-auth-verify-pkce-s256.ts +2 -2
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/index.ts +22 -48
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/o-auth.relations.ts +81 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/o-auth.seed.ts +80 -46
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/application/create/o-auth-create-refresh-token.handler.ts +5 -7
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/application/create/o-auth-create-refresh-token.service.ts +4 -3
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/application/delete/o-auth-delete-refresh-token-by-id.handler.ts +5 -8
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/application/delete/o-auth-delete-refresh-token-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/application/find/o-auth-find-refresh-token-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/application/find/o-auth-find-refresh-token-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/application/find/o-auth-find-refresh-token.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/application/find/o-auth-find-refresh-token.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/application/get/o-auth-get-refresh-tokens.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/application/get/o-auth-get-refresh-tokens.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/application/paginate/o-auth-paginate-refresh-tokens.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/application/paginate/o-auth-paginate-refresh-tokens.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/domain/index.ts +1 -1
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/domain/o-auth-refresh-token.field-schema.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/index.ts +20 -20
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/infrastructure/drizzle/o-auth-drizzle-refresh-token.repository.ts +40 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/infrastructure/drizzle/o-auth-drizzle-refresh-token.schema.ts +33 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/application/create/o-auth-create-scope.handler.ts +5 -4
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/application/create/o-auth-create-scope.service.ts +4 -3
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/application/delete/o-auth-delete-scope-by-id.handler.ts +5 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/application/delete/o-auth-delete-scope-by-id.service.ts +3 -4
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/application/find/o-auth-find-scope-by-id.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/application/find/o-auth-find-scope-by-id.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/application/find/o-auth-find-scope.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/application/find/o-auth-find-scope.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/application/get/o-auth-get-scopes.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/application/get/o-auth-get-scopes.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/application/paginate/o-auth-paginate-scopes.handler.ts +4 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/application/paginate/o-auth-paginate-scopes.service.ts +7 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/application/update/o-auth-update-scope-by-id.handler.ts +12 -8
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/application/update/o-auth-update-scope-by-id.service.ts +9 -6
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/domain/index.ts +1 -1
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/domain/o-auth-scope.field-schema.ts +3 -3
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/index.ts +23 -23
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/infrastructure/drizzle/o-auth-drizzle-scope.repository.ts +40 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/infrastructure/drizzle/o-auth-drizzle-scope.schema.ts +23 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/shared/functions/o-auth-authenticate-application.function.spec.ts +72 -25
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/shared/functions/o-auth-authenticate-application.function.ts +31 -16
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/shared/functions/o-auth-generate-application-secret.function.spec.ts +30 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/shared/functions/o-auth-generate-application-secret.function.ts +21 -0
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/shared/functions/o-auth-resolve-application-client.function.spec.ts +43 -32
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/shared/functions/o-auth-resolve-application-client.function.ts +13 -9
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/shared/index.ts +6 -5
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/shared/services/token-retention.service.spec.ts +70 -79
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/shared/services/token-retention.service.ts +44 -38
- package/dist/templates/backend/packages/o-auth/src/@bridges/o-auth/application/adapters/index.ts +1 -0
- package/dist/templates/backend/packages/o-auth/src/@bridges/o-auth/application/adapters/o-auth-application-provisioner.adapter.spec.ts +727 -0
- package/dist/templates/backend/packages/o-auth/src/@bridges/o-auth/application/adapters/o-auth-application-provisioner.adapter.ts +274 -0
- package/dist/templates/backend/packages/o-auth/src/@bridges/o-auth/application/index.ts +1 -0
- package/dist/templates/backend/packages/o-auth/src/@bridges/o-auth/application/ports/index.ts +2 -0
- package/dist/templates/backend/packages/o-auth/src/@bridges/o-auth/application/ports/o-auth-application-provisioner.port.ts +79 -0
- package/dist/templates/backend/packages/o-auth/src/@bridges/o-auth/application/ports/o-auth-application-provisioner.token.ts +1 -0
- package/dist/templates/backend/packages/o-auth/src/@bridges/o-auth/client/adapters/index.ts +1 -0
- package/dist/templates/backend/packages/o-auth/src/@bridges/o-auth/client/adapters/o-auth-client-reader.adapter.spec.ts +58 -0
- package/dist/templates/backend/packages/o-auth/src/@bridges/o-auth/client/adapters/o-auth-client-reader.adapter.ts +6 -4
- package/dist/templates/backend/packages/o-auth/src/@bridges/providers/iam-client-reader.bridge.ts +2 -2
- package/dist/templates/backend/packages/o-auth/test/acceptance/o-auth/impersonate-token-guarded-transports.e2e-spec.ts +365 -0
- package/dist/templates/backend/packages/o-auth/test/acceptance/o-auth/masked-property-query-guard.e2e-spec.ts +936 -0
- package/dist/templates/backend/packages/o-auth/test/acceptance/o-auth/oauth-bootstrap-seeder-idempotency.e2e-spec.ts +211 -0
- package/dist/templates/backend/packages/o-auth/test/acceptance/o-auth/token-masking.e2e-spec.ts +232 -0
- package/dist/templates/backend/packages/queue-manager/src/@api/queue-manager/flows/graphql/queue-manager.graphql +149 -0
- package/dist/templates/backend/packages/queue-manager/src/@api/queue-manager/flows/index.ts +24 -0
- package/dist/templates/backend/packages/queue-manager/src/@api/queue-manager/flows/resolvers/queue-manager.resolver.auth-metadata.spec.ts +84 -0
- package/dist/templates/backend/packages/queue-manager/src/@api/queue-manager/flows/resolvers/queue-manager.resolver.spec.ts +210 -0
- package/dist/templates/backend/packages/queue-manager/src/@api/queue-manager/flows/resolvers/queue-manager.resolver.ts +228 -0
- package/dist/templates/backend/packages/queue-manager/src/@api/queue-manager/queue-manager.module.ts +84 -0
- package/dist/templates/backend/packages/queue-manager/src/@api/queue-manager/queue-manager.seeder.ts +33 -0
- package/dist/templates/backend/packages/queue-manager/src/@app/queue-manager/domain/ports/index.ts +20 -0
- package/dist/templates/backend/packages/queue-manager/src/@app/queue-manager/domain/ports/queue-inspector.port.ts +144 -0
- package/dist/templates/backend/packages/queue-manager/src/@app/queue-manager/domain/ports/queue-registry.token.ts +30 -0
- package/dist/templates/backend/packages/queue-manager/src/@app/queue-manager/infrastructure/adapters/bull-board-queue-inspector.adapter.spec.ts +261 -0
- package/dist/templates/backend/packages/queue-manager/src/@app/queue-manager/infrastructure/adapters/bull-board-queue-inspector.adapter.ts +388 -0
- package/dist/templates/backend/packages/queue-manager/src/@app/queue-manager/infrastructure/adapters/index.ts +1 -0
- package/dist/templates/backend/packages/queue-manager/src/@app/queue-manager/infrastructure/index.ts +1 -0
- package/dist/templates/backend/packages/queue-manager/src/@app/queue-manager/queue-manager.seed.ts +51 -0
- package/dist/templates/backend/packages/queue-manager/src/@app/queue-manager/queue-registry.providers.ts +37 -0
- package/dist/templates/codegen/backend/@api/__bounded_context_name__.module.ts.eta +2 -4
- package/dist/templates/codegen/backend/@api/__bounded_context_name__.seeder.ts.eta +7 -7
- package/dist/templates/codegen/backend/@api/__module_name__/controllers/__bounded_context_name__-count-__module_name__.controller.ts.eta +69 -0
- package/dist/templates/codegen/backend/@api/__module_name__/controllers/__bounded_context_name__-create-__module_name__.controller.ts.eta +17 -18
- package/dist/templates/codegen/backend/@api/__module_name__/controllers/__bounded_context_name__-create-__module_names__.controller.ts.eta +12 -12
- package/dist/templates/codegen/backend/@api/__module_name__/controllers/__bounded_context_name__-delete-__module_name__-by-id.controller.ts.eta +16 -17
- package/dist/templates/codegen/backend/@api/__module_name__/controllers/__bounded_context_name__-delete-__module_names__.controller.ts.eta +15 -23
- package/dist/templates/codegen/backend/@api/__module_name__/controllers/__bounded_context_name__-find-__module_name__-by-id.controller.ts.eta +14 -17
- package/dist/templates/codegen/backend/@api/__module_name__/controllers/__bounded_context_name__-find-__module_name__.controller.ts.eta +16 -19
- package/dist/templates/codegen/backend/@api/__module_name__/controllers/__bounded_context_name__-get-__module_names__.controller.ts.eta +16 -19
- package/dist/templates/codegen/backend/@api/__module_name__/controllers/__bounded_context_name__-get-raw-__module_names__.controller.ts.eta +3 -28
- package/dist/templates/codegen/backend/@api/__module_name__/controllers/__bounded_context_name__-max-__module_name__.controller.ts.eta +72 -0
- package/dist/templates/codegen/backend/@api/__module_name__/controllers/__bounded_context_name__-min-__module_name__.controller.ts.eta +72 -0
- package/dist/templates/codegen/backend/@api/__module_name__/controllers/__bounded_context_name__-paginate-__module_names__.controller.ts.eta +15 -18
- package/dist/templates/codegen/backend/@api/__module_name__/controllers/__bounded_context_name__-sum-__module_name__.controller.ts.eta +72 -0
- package/dist/templates/codegen/backend/@api/__module_name__/controllers/__bounded_context_name__-update-__module_name__-by-id.controller.ts.eta +21 -19
- package/dist/templates/codegen/backend/@api/__module_name__/controllers/__bounded_context_name__-update-__module_names__.controller.ts.eta +20 -23
- package/dist/templates/codegen/backend/@api/__module_name__/controllers/__bounded_context_name__-upsert-__module_name__.controller.ts.eta +12 -21
- package/dist/templates/codegen/backend/@api/__module_name__/dto/__bounded_context_name__-__module_name__.dto.ts.eta +45 -14
- package/dist/templates/codegen/backend/@api/__module_name__/dto/__bounded_context_name__-create-__module_name__.dto.ts.eta +17 -6
- package/dist/templates/codegen/backend/@api/__module_name__/dto/__bounded_context_name__-update-__module_name__-by-id.dto.ts.eta +17 -6
- package/dist/templates/codegen/backend/@api/__module_name__/dto/__bounded_context_name__-update-__module_names__.dto.ts.eta +17 -6
- package/dist/templates/codegen/backend/@api/__module_name__/dto/index.ts.eta +4 -4
- package/dist/templates/codegen/backend/@api/__module_name__/graphql/__bounded_context_name__-__module_name__.graphql.eta +185 -52
- package/dist/templates/codegen/backend/@api/__module_name__/index.ts.eta +102 -30
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-__module_name__-custom-field-value.resolver.ts.eta +32 -0
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-count-__module_name__.resolver.ts.eta +62 -0
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-create-__module_name__.resolver.ts.eta +16 -18
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-create-__module_names__.resolver.ts.eta +12 -12
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-delete-__module_name__-by-id.resolver.ts.eta +17 -17
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-delete-__module_names__.resolver.ts.eta +14 -21
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-find-__module_name__-by-id.resolver.ts.eta +14 -17
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-find-__module_name__.resolver.ts.eta +14 -17
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-get-__module_names__.resolver.ts.eta +14 -17
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-get-raw-__module_names__.resolver.ts.eta +3 -28
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-max-__module_name__.resolver.ts.eta +64 -0
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-min-__module_name__.resolver.ts.eta +64 -0
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-paginate-__module_names__.resolver.ts.eta +14 -17
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-sum-__module_name__.resolver.ts.eta +64 -0
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-update-__module_name__-by-id.resolver.ts.eta +23 -19
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-update-__module_names__.resolver.ts.eta +23 -23
- package/dist/templates/codegen/backend/@api/__module_name__/resolvers/__bounded_context_name__-upsert-__module_name__.resolver.ts.eta +12 -21
- package/dist/templates/codegen/backend/@app/__bounded_context_name__.seed.ts.eta +6 -4
- package/dist/templates/codegen/backend/@app/__module_name__/application/__bounded_context_name__-__module_name__.payload-types.ts.eta +53 -0
- package/dist/templates/codegen/backend/@app/__module_name__/application/count/__bounded_context_name__-count-__module_name__.handler.ts.eta +6 -44
- package/dist/templates/codegen/backend/@app/__module_name__/application/count/__bounded_context_name__-count-__module_name__.service.ts.eta +5 -6
- package/dist/templates/codegen/backend/@app/__module_name__/application/create/__bounded_context_name__-create-__module_name__.handler.ts.eta +61 -49
- package/dist/templates/codegen/backend/@app/__module_name__/application/create/__bounded_context_name__-create-__module_name__.service.ts.eta +100 -82
- package/dist/templates/codegen/backend/@app/__module_name__/application/create/__bounded_context_name__-create-__module_names__.handler.ts.eta +51 -9
- package/dist/templates/codegen/backend/@app/__module_name__/application/create/__bounded_context_name__-create-__module_names__.service.ts.eta +111 -31
- package/dist/templates/codegen/backend/@app/__module_name__/application/delete/__bounded_context_name__-delete-__module_name__-by-id.handler.ts.eta +37 -50
- package/dist/templates/codegen/backend/@app/__module_name__/application/delete/__bounded_context_name__-delete-__module_name__-by-id.service.ts.eta +100 -80
- package/dist/templates/codegen/backend/@app/__module_name__/application/delete/__bounded_context_name__-delete-__module_names__.handler.ts.eta +14 -52
- package/dist/templates/codegen/backend/@app/__module_name__/application/delete/__bounded_context_name__-delete-__module_names__.service.ts.eta +39 -61
- package/dist/templates/codegen/backend/@app/__module_name__/application/find/__bounded_context_name__-find-__module_name__-by-id.handler.ts.eta +21 -39
- package/dist/templates/codegen/backend/@app/__module_name__/application/find/__bounded_context_name__-find-__module_name__-by-id.service.ts.eta +35 -11
- package/dist/templates/codegen/backend/@app/__module_name__/application/find/__bounded_context_name__-find-__module_name__.handler.ts.eta +21 -40
- package/dist/templates/codegen/backend/@app/__module_name__/application/find/__bounded_context_name__-find-__module_name__.service.ts.eta +35 -10
- package/dist/templates/codegen/backend/@app/__module_name__/application/get/__bounded_context_name__-get-__module_names__.handler.ts.eta +24 -41
- package/dist/templates/codegen/backend/@app/__module_name__/application/get/__bounded_context_name__-get-__module_names__.service.ts.eta +35 -10
- package/dist/templates/codegen/backend/@app/__module_name__/application/get/__bounded_context_name__-get-raw-__module_names__.handler.ts.eta +15 -46
- package/dist/templates/codegen/backend/@app/__module_name__/application/get/__bounded_context_name__-get-raw-__module_names__.service.ts.eta +5 -7
- package/dist/templates/codegen/backend/@app/__module_name__/application/max/__bounded_context_name__-max-__module_name__.handler.ts.eta +43 -0
- package/dist/templates/codegen/backend/@app/__module_name__/application/max/__bounded_context_name__-max-__module_name__.service.ts.eta +5 -6
- package/dist/templates/codegen/backend/@app/__module_name__/application/min/__bounded_context_name__-min-__module_name__.handler.ts.eta +43 -0
- package/dist/templates/codegen/backend/@app/__module_name__/application/min/__bounded_context_name__-min-__module_name__.service.ts.eta +5 -6
- package/dist/templates/codegen/backend/@app/__module_name__/application/paginate/__bounded_context_name__-paginate-__module_names__.handler.ts.eta +24 -40
- package/dist/templates/codegen/backend/@app/__module_name__/application/paginate/__bounded_context_name__-paginate-__module_names__.service.ts.eta +39 -10
- package/dist/templates/codegen/backend/@app/__module_name__/application/sum/__bounded_context_name__-sum-__module_name__.handler.ts.eta +43 -0
- package/dist/templates/codegen/backend/@app/__module_name__/application/sum/__bounded_context_name__-sum-__module_name__.service.ts.eta +5 -6
- package/dist/templates/codegen/backend/@app/__module_name__/application/update/__bounded_context_name__-update-__module_name__-by-id.handler.ts.eta +78 -64
- package/dist/templates/codegen/backend/@app/__module_name__/application/update/__bounded_context_name__-update-__module_name__-by-id.service.ts.eta +71 -35
- package/dist/templates/codegen/backend/@app/__module_name__/application/update/__bounded_context_name__-update-__module_names__.handler.ts.eta +36 -52
- package/dist/templates/codegen/backend/@app/__module_name__/application/update/__bounded_context_name__-update-__module_names__.service.ts.eta +25 -41
- package/dist/templates/codegen/backend/@app/__module_name__/application/update/__bounded_context_name__-update-and-increment-__module_names__.service.ts.eta +24 -41
- package/dist/templates/codegen/backend/@app/__module_name__/application/upsert/__bounded_context_name__-upsert-__module_name__.handler.ts.eta +28 -52
- package/dist/templates/codegen/backend/@app/__module_name__/application/upsert/__bounded_context_name__-upsert-__module_name__.service.ts.eta +23 -83
- package/dist/templates/codegen/backend/@app/__module_name__/domain/__bounded_context_name__-__module_name__.field-schema.ts.eta +41 -2
- package/dist/templates/codegen/backend/@app/__module_name__/domain/index.ts.eta +1 -1
- package/dist/templates/codegen/backend/@app/__module_name__/index.ts.eta +117 -122
- package/dist/templates/codegen/backend/@app/__module_name__/infrastructure/drizzle/__bounded_context_name__-drizzle-__module_name__-custom-field-value.schema.ts.eta +37 -0
- package/dist/templates/codegen/backend/@app/__module_name__/infrastructure/drizzle/__bounded_context_name__-drizzle-__module_name__-i18n.repository.ts.eta +65 -0
- package/dist/templates/codegen/backend/@app/__module_name__/infrastructure/drizzle/__bounded_context_name__-drizzle-__module_name__-i18n.schema.ts.eta +47 -0
- package/dist/templates/codegen/backend/@app/__module_name__/infrastructure/drizzle/__bounded_context_name__-drizzle-__module_name__.repository.ts.eta +180 -0
- package/dist/templates/codegen/backend/@app/__module_name__/infrastructure/drizzle/__bounded_context_name__-drizzle-__module_name__.schema.ts.eta +154 -0
- package/dist/templates/codegen/backend/@app/index.ts.eta +0 -1
- package/dist/templates/codegen/backend/additional-@api/__module_name__/controllers/__additional_api_name__.controller.ts.eta +30 -25
- package/dist/templates/codegen/backend/additional-@api/__module_name__/resolvers/__additional_api_name__.resolver.ts.eta +33 -25
- package/dist/templates/codegen/backend/additional-@app/__module_name__/application/__additional_api_action__/__additional_api_name__.handler.ts.eta +30 -11
- package/dist/templates/codegen/frontend/module/__bounded_context_name__.navigation.ts.eta +1 -0
- package/dist/templates/codegen/frontend/module/__module_name__/__module_name__.columns.ts.eta +233 -30
- package/dist/templates/codegen/frontend/module/__module_name__/data-access/__module_name__.detail-config.ts.eta +18 -2
- package/dist/templates/codegen/frontend/module/__module_name__/data-access/__module_name__.graphql.ts.eta +223 -71
- package/dist/templates/codegen/frontend/module/__module_name__/data-access/__module_name__.list-config.ts.eta +11 -2
- package/dist/templates/codegen/frontend/module/__module_name__/data-access/__module_name__.resolvers.ts.eta +168 -58
- package/dist/templates/codegen/frontend/module/__module_name__/data-access/index.ts.eta +8 -0
- package/dist/templates/codegen/frontend/module/__module_name__/features/__module_name__-detail.component.ts.eta +257 -57
- package/dist/templates/codegen/frontend/module/__module_name__/features/__module_name__-form-embed.component.ts.eta +336 -89
- package/dist/templates/codegen/frontend/module/__module_name__/features/__module_name__-form.component.ts.eta +348 -141
- package/dist/templates/codegen/frontend/module/__module_name__/features/__module_name__-list-actions-cell.component.ts.eta +35 -12
- package/dist/templates/codegen/frontend/module/__module_name__/features/__module_name__-list-translations-cell.component.ts.eta +91 -0
- package/dist/templates/codegen/frontend/module/__module_name__/features/__module_name__-list.component.ts.eta +153 -52
- package/dist/templates/codegen/frontend/module/__module_name__/features/index.ts.eta +19 -0
- package/dist/templates/codegen/frontend/module/__module_name__/index.ts.eta +7 -5
- package/dist/templates/codegen/partials/fields/boolean-field.eta +11 -4
- package/dist/templates/codegen/partials/fields/color-picker-field.eta +8 -0
- package/dist/templates/codegen/partials/fields/date-field.eta +6 -16
- package/dist/templates/codegen/partials/fields/datetime-field.eta +8 -0
- package/dist/templates/codegen/partials/fields/enum-field.eta +16 -10
- package/dist/templates/codegen/partials/fields/number-field.eta +2 -4
- package/dist/templates/codegen/partials/fields/password-field.eta +14 -18
- package/dist/templates/codegen/partials/fields/text-field.eta +2 -7
- package/dist/templates/codegen/partials/fields/varchar-field.eta +2 -7
- package/dist/templates/codegen/partials/form/dialog-frame.eta +14 -11
- package/dist/templates/codegen/partials/form/field-errors.eta +10 -0
- package/dist/templates/codegen/partials/form/field-label.eta +21 -6
- package/dist/templates/codegen/partials/form/form-body.eta +32 -28
- package/dist/templates/codegen/partials/form/view-frame-tabbed.eta +54 -4
- package/dist/templates/codegen/partials/form/view-frame.eta +62 -4
- package/dist/templates/codegen/partials/i18n-recompute.eta +72 -0
- package/dist/templates/codegen/partials/i18n-validate.eta +51 -0
- package/dist/templates/codegen/partials/relationships/async-multiple-search-select.eta +4 -8
- package/dist/templates/codegen/partials/relationships/async-search-select.eta +4 -8
- package/dist/templates/codegen/partials/relationships/grid-elements-manager.eta +1 -0
- package/dist/templates/codegen/partials/relationships/grid-select-element.eta +5 -7
- package/dist/templates/codegen/partials/relationships/multiple-search-select.eta +4 -8
- package/dist/templates/codegen/partials/relationships/multiple-select.eta +17 -8
- package/dist/templates/codegen/partials/relationships/search-select.eta +5 -8
- package/dist/templates/codegen/partials/relationships/select.eta +14 -6
- package/dist/templates/frontend/application/.claude/skills/catalyst-data-layer/SKILL.md +67 -51
- package/dist/templates/frontend/application/.claude/skills/catalyst-data-layer/references/known-patterns.md +24 -20
- package/dist/templates/frontend/application/.claude/skills/catalyst-data-table-management/SKILL.md +38 -33
- package/dist/templates/frontend/application/.claude/skills/catalyst-form-composer-auditor/SKILL.md +133 -73
- package/dist/templates/frontend/application/.claude/skills/catalyst-form-composer-auditor/references/catalyst-detail-form-rules.md +308 -253
- package/dist/templates/frontend/application/.claude/skills/catalyst-project-structure/SKILL.md +281 -173
- package/dist/templates/frontend/application/.claude/skills/catalyst-review-module/SKILL.md +1 -1
- package/dist/templates/frontend/application/.claude/skills/catalyst-widget-creator/SKILL.md +288 -0
- package/dist/templates/frontend/application/.claude/skills/layout-design-system/SKILL.md +69 -10
- package/dist/templates/frontend/application/.claude/skills/transloco-i18n/SKILL.md +21 -0
- package/dist/templates/frontend/application/CLAUDE.md +18 -3
- package/dist/templates/frontend/application/angular.json +6 -4
- package/dist/templates/frontend/application/codegen.ts +2 -1
- package/dist/templates/frontend/application/libs/ui/accordion/src/lib/hlm-accordion-trigger.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/alert/src/lib/hlm-alert.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/alert-dialog/src/index.ts +3 -0
- package/dist/templates/frontend/application/libs/ui/alert-dialog/src/lib/hlm-alert-dialog-action.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/alert-dialog/src/lib/hlm-alert-dialog-cancel.ts +3 -4
- package/dist/templates/frontend/application/libs/ui/alert-dialog/src/lib/hlm-alert-dialog-content.ts +5 -2
- package/dist/templates/frontend/application/libs/ui/alert-dialog/src/lib/hlm-alert-dialog-description.ts +5 -4
- package/dist/templates/frontend/application/libs/ui/alert-dialog/src/lib/hlm-alert-dialog-footer.ts +5 -4
- package/dist/templates/frontend/application/libs/ui/alert-dialog/src/lib/hlm-alert-dialog-header.ts +5 -4
- package/dist/templates/frontend/application/libs/ui/alert-dialog/src/lib/hlm-alert-dialog-media.ts +15 -0
- package/dist/templates/frontend/application/libs/ui/alert-dialog/src/lib/hlm-alert-dialog-overlay.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/alert-dialog/src/lib/hlm-alert-dialog-title.ts +5 -4
- package/dist/templates/frontend/application/libs/ui/alert-dialog/src/lib/hlm-alert-dialog-trigger.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/autocomplete/src/lib/hlm-autocomplete-content.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/autocomplete/src/lib/hlm-autocomplete-empty.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/autocomplete/src/lib/hlm-autocomplete-group.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/autocomplete/src/lib/hlm-autocomplete-input.ts +45 -44
- package/dist/templates/frontend/application/libs/ui/autocomplete/src/lib/hlm-autocomplete-item.ts +3 -5
- package/dist/templates/frontend/application/libs/ui/autocomplete/src/lib/hlm-autocomplete-label.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/autocomplete/src/lib/hlm-autocomplete-list.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/autocomplete/src/lib/hlm-autocomplete-search.ts +8 -18
- package/dist/templates/frontend/application/libs/ui/autocomplete/src/lib/hlm-autocomplete-separator.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/autocomplete/src/lib/hlm-autocomplete-status.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/autocomplete/src/lib/hlm-autocomplete.ts +8 -18
- package/dist/templates/frontend/application/libs/ui/avatar/src/lib/hlm-avatar-badge.ts +2 -2
- package/dist/templates/frontend/application/libs/ui/avatar/src/lib/hlm-avatar-fallback.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/avatar/src/lib/hlm-avatar-image.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/badge/src/lib/hlm-badge.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/breadcrumb/src/index.ts +0 -5
- package/dist/templates/frontend/application/libs/ui/breadcrumb/src/lib/hlm-breadcrumb-ellipsis.ts +12 -25
- package/dist/templates/frontend/application/libs/ui/breadcrumb/src/lib/hlm-breadcrumb-separator.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/button/src/lib/hlm-button.ts +6 -8
- package/dist/templates/frontend/application/libs/ui/button-group/src/lib/hlm-button-group-separator.ts +5 -4
- package/dist/templates/frontend/application/libs/ui/button-group/src/lib/hlm-button-group-text.ts +4 -1
- package/dist/templates/frontend/application/libs/ui/button-group/src/lib/hlm-button-group.ts +4 -4
- package/dist/templates/frontend/application/libs/ui/calendar/src/index.ts +8 -1
- package/dist/templates/frontend/application/libs/ui/calendar/src/lib/hlm-calendar-multi.ts +189 -223
- package/dist/templates/frontend/application/libs/ui/calendar/src/lib/hlm-calendar-range.ts +188 -218
- package/dist/templates/frontend/application/libs/ui/calendar/src/lib/hlm-calendar.ts +184 -212
- package/dist/templates/frontend/application/libs/ui/calendar/src/lib/hlm-month-year-calendar.ts +139 -0
- package/dist/templates/frontend/application/libs/ui/card/src/lib/hlm-card-action.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/card/src/lib/hlm-card-content.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/card/src/lib/hlm-card-description.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/card/src/lib/hlm-card-footer.ts +2 -5
- package/dist/templates/frontend/application/libs/ui/card/src/lib/hlm-card-header.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/card/src/lib/hlm-card-title.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/card/src/lib/hlm-card.token.ts +19 -0
- package/dist/templates/frontend/application/libs/ui/card/src/lib/hlm-card.ts +4 -2
- package/dist/templates/frontend/application/libs/ui/carousel/src/lib/hlm-carousel-next.ts +5 -7
- package/dist/templates/frontend/application/libs/ui/carousel/src/lib/hlm-carousel-previous.ts +5 -7
- package/dist/templates/frontend/application/libs/ui/carousel/src/lib/hlm-carousel.ts +8 -6
- package/dist/templates/frontend/application/libs/ui/checkbox/src/lib/hlm-checkbox.ts +13 -14
- package/dist/templates/frontend/application/libs/ui/collapsible/src/lib/hlm-collapsible-content.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/collapsible/src/lib/hlm-collapsible-trigger.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/collapsible/src/lib/hlm-collapsible.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-chip-input.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-chip-remove.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-chip.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-chips.ts +12 -12
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-content.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-empty.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-group.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-input.ts +58 -43
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-item.ts +3 -5
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-label.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-list.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-multiple.ts +8 -18
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-placeholder.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-separator.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-status.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-trigger.ts +17 -2
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox-value.ts +1 -0
- package/dist/templates/frontend/application/libs/ui/combobox/src/lib/hlm-combobox.ts +8 -18
- package/dist/templates/frontend/application/libs/ui/command/src/lib/hlm-command-dialog.ts +2 -2
- package/dist/templates/frontend/application/libs/ui/command/src/lib/hlm-command-group-label.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/command/src/lib/hlm-command-group.ts +4 -1
- package/dist/templates/frontend/application/libs/ui/command/src/lib/hlm-command-input.ts +10 -4
- package/dist/templates/frontend/application/libs/ui/command/src/lib/hlm-command-item.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/command/src/lib/hlm-command-list.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/command/src/lib/hlm-command-separator.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/command/src/lib/hlm-command-shortcut.ts +4 -1
- package/dist/templates/frontend/application/libs/ui/command/src/lib/hlm-command.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/context-menu/src/lib/hlm-context-menu-trigger.ts +25 -14
- package/dist/templates/frontend/application/libs/ui/date-picker/src/index.ts +24 -3
- package/dist/templates/frontend/application/libs/ui/date-picker/src/lib/hlm-date-multi-input.ts +104 -0
- package/dist/templates/frontend/application/libs/ui/date-picker/src/lib/hlm-date-picker-anchor.ts +23 -0
- package/dist/templates/frontend/application/libs/ui/date-picker/src/lib/hlm-date-picker-input.ts +105 -0
- package/dist/templates/frontend/application/libs/ui/date-picker/src/lib/hlm-date-picker-multi.token.ts +61 -0
- package/dist/templates/frontend/application/libs/ui/date-picker/src/lib/hlm-date-picker-multi.ts +70 -85
- package/dist/templates/frontend/application/libs/ui/date-picker/src/lib/hlm-date-picker-trigger.ts +104 -0
- package/dist/templates/frontend/application/libs/ui/date-picker/src/lib/hlm-date-picker.token.ts +22 -0
- package/dist/templates/frontend/application/libs/ui/date-picker/src/lib/hlm-date-picker.ts +83 -97
- package/dist/templates/frontend/application/libs/ui/date-picker/src/lib/hlm-date-range-input.ts +107 -0
- package/dist/templates/frontend/application/libs/ui/date-picker/src/lib/hlm-date-range-picker.token.ts +36 -1
- package/dist/templates/frontend/application/libs/ui/date-picker/src/lib/hlm-date-range-picker.ts +90 -89
- package/dist/templates/frontend/application/libs/ui/date-picker/src/lib/hlm-month-year-input.ts +105 -0
- package/dist/templates/frontend/application/libs/ui/date-picker/src/lib/hlm-month-year-picker.token.ts +89 -0
- package/dist/templates/frontend/application/libs/ui/date-picker/src/lib/hlm-month-year-picker.ts +199 -0
- package/dist/templates/frontend/application/libs/ui/dialog/src/lib/hlm-dialog-close.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/dialog/src/lib/hlm-dialog-content.ts +21 -13
- package/dist/templates/frontend/application/libs/ui/dialog/src/lib/hlm-dialog-description.ts +5 -4
- package/dist/templates/frontend/application/libs/ui/dialog/src/lib/hlm-dialog-footer.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/dialog/src/lib/hlm-dialog-header.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/dialog/src/lib/hlm-dialog-overlay.ts +4 -3
- package/dist/templates/frontend/application/libs/ui/dialog/src/lib/hlm-dialog-title.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/dialog/src/lib/hlm-dialog-trigger.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/dialog/src/lib/hlm-dialog.service.ts +7 -4
- package/dist/templates/frontend/application/libs/ui/dropdown-menu/src/index.ts +4 -0
- package/dist/templates/frontend/application/libs/ui/dropdown-menu/src/lib/hlm-dropdown-menu-checkbox-indicator.ts +3 -5
- package/dist/templates/frontend/application/libs/ui/dropdown-menu/src/lib/hlm-dropdown-menu-checkbox.ts +30 -12
- package/dist/templates/frontend/application/libs/ui/dropdown-menu/src/lib/hlm-dropdown-menu-focus-on-hover.ts +35 -0
- package/dist/templates/frontend/application/libs/ui/dropdown-menu/src/lib/hlm-dropdown-menu-group.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/dropdown-menu/src/lib/hlm-dropdown-menu-item-sub-indicator.ts +2 -2
- package/dist/templates/frontend/application/libs/ui/dropdown-menu/src/lib/hlm-dropdown-menu-item.ts +4 -2
- package/dist/templates/frontend/application/libs/ui/dropdown-menu/src/lib/hlm-dropdown-menu-label.ts +4 -4
- package/dist/templates/frontend/application/libs/ui/dropdown-menu/src/lib/hlm-dropdown-menu-radio-indicator.ts +5 -7
- package/dist/templates/frontend/application/libs/ui/dropdown-menu/src/lib/hlm-dropdown-menu-radio.ts +26 -13
- package/dist/templates/frontend/application/libs/ui/dropdown-menu/src/lib/hlm-dropdown-menu-separator.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/dropdown-menu/src/lib/hlm-dropdown-menu-shortcut.ts +5 -4
- package/dist/templates/frontend/application/libs/ui/dropdown-menu/src/lib/hlm-dropdown-menu-sub-trigger.ts +52 -0
- package/dist/templates/frontend/application/libs/ui/dropdown-menu/src/lib/hlm-dropdown-menu-sub.ts +21 -26
- package/dist/templates/frontend/application/libs/ui/dropdown-menu/src/lib/hlm-dropdown-menu-trigger.ts +14 -17
- package/dist/templates/frontend/application/libs/ui/dropdown-menu/src/lib/hlm-dropdown-menu.ts +21 -26
- package/dist/templates/frontend/application/libs/ui/empty/src/lib/hlm-empty-content.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/empty/src/lib/hlm-empty-description.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/empty/src/lib/hlm-empty-header.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/empty/src/lib/hlm-empty-media.ts +4 -3
- package/dist/templates/frontend/application/libs/ui/empty/src/lib/hlm-empty-title.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/empty/src/lib/hlm-empty.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/field/src/lib/hlm-field-content.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/field/src/lib/hlm-field-description.ts +2 -5
- package/dist/templates/frontend/application/libs/ui/field/src/lib/hlm-field-error.ts +2 -6
- package/dist/templates/frontend/application/libs/ui/field/src/lib/hlm-field-group.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/field/src/lib/hlm-field-label.ts +3 -7
- package/dist/templates/frontend/application/libs/ui/field/src/lib/hlm-field-separator.ts +3 -5
- package/dist/templates/frontend/application/libs/ui/field/src/lib/hlm-field-set.ts +5 -7
- package/dist/templates/frontend/application/libs/ui/field/src/lib/hlm-field-title.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/field/src/lib/hlm-field.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/hover-card/src/lib/hlm-hover-card-content.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/input/src/lib/hlm-input.ts +10 -27
- package/dist/templates/frontend/application/libs/ui/input-group/src/lib/hlm-input-group-addon.ts +6 -6
- package/dist/templates/frontend/application/libs/ui/input-group/src/lib/hlm-input-group-button.ts +3 -3
- package/dist/templates/frontend/application/libs/ui/input-group/src/lib/hlm-input-group-input.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/input-group/src/lib/hlm-input-group-text.ts +2 -2
- package/dist/templates/frontend/application/libs/ui/input-group/src/lib/hlm-input-group-textarea.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/input-group/src/lib/hlm-input-group.ts +5 -24
- package/dist/templates/frontend/application/libs/ui/input-otp/src/lib/hlm-input-otp-fake-caret.ts +7 -4
- package/dist/templates/frontend/application/libs/ui/input-otp/src/lib/hlm-input-otp-group.ts +6 -5
- package/dist/templates/frontend/application/libs/ui/input-otp/src/lib/hlm-input-otp-separator.ts +3 -7
- package/dist/templates/frontend/application/libs/ui/input-otp/src/lib/hlm-input-otp-slot.ts +22 -10
- package/dist/templates/frontend/application/libs/ui/input-otp/src/lib/hlm-input-otp.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/item/src/lib/hlm-item-actions.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/item/src/lib/hlm-item-content.ts +5 -4
- package/dist/templates/frontend/application/libs/ui/item/src/lib/hlm-item-description.ts +6 -8
- package/dist/templates/frontend/application/libs/ui/item/src/lib/hlm-item-footer.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/item/src/lib/hlm-item-group.ts +4 -1
- package/dist/templates/frontend/application/libs/ui/item/src/lib/hlm-item-header.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/item/src/lib/hlm-item-media.ts +4 -3
- package/dist/templates/frontend/application/libs/ui/item/src/lib/hlm-item-separator.ts +3 -2
- package/dist/templates/frontend/application/libs/ui/item/src/lib/hlm-item-title.ts +5 -4
- package/dist/templates/frontend/application/libs/ui/item/src/lib/hlm-item.ts +7 -6
- package/dist/templates/frontend/application/libs/ui/kbd/src/lib/hlm-kbd-group.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/kbd/src/lib/hlm-kbd.ts +4 -5
- package/dist/templates/frontend/application/libs/ui/label/src/lib/hlm-label.ts +3 -10
- package/dist/templates/frontend/application/libs/ui/menubar/src/lib/hlm-menubar-trigger.ts +23 -15
- package/dist/templates/frontend/application/libs/ui/menubar/src/lib/hlm-menubar.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/native-select/src/lib/hlm-native-select-opt-group.ts +8 -5
- package/dist/templates/frontend/application/libs/ui/native-select/src/lib/hlm-native-select-option.ts +8 -5
- package/dist/templates/frontend/application/libs/ui/native-select/src/lib/hlm-native-select.ts +17 -11
- package/dist/templates/frontend/application/libs/ui/navigation-menu/src/lib/hlm-navigation-menu-content.ts +10 -3
- package/dist/templates/frontend/application/libs/ui/navigation-menu/src/lib/hlm-navigation-menu-item.ts +4 -1
- package/dist/templates/frontend/application/libs/ui/navigation-menu/src/lib/hlm-navigation-menu-link.ts +7 -4
- package/dist/templates/frontend/application/libs/ui/navigation-menu/src/lib/hlm-navigation-menu-list.ts +4 -1
- package/dist/templates/frontend/application/libs/ui/navigation-menu/src/lib/hlm-navigation-menu-trigger.ts +18 -4
- package/dist/templates/frontend/application/libs/ui/navigation-menu/src/lib/hlm-navigation-menu.ts +3 -0
- package/dist/templates/frontend/application/libs/ui/pagination/src/lib/hlm-numbered-pagination-query-params.ts +68 -67
- package/dist/templates/frontend/application/libs/ui/pagination/src/lib/hlm-numbered-pagination.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/pagination/src/lib/hlm-pagination-content.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/pagination/src/lib/hlm-pagination-ellipsis.ts +12 -18
- package/dist/templates/frontend/application/libs/ui/pagination/src/lib/hlm-pagination-item.ts +2 -9
- package/dist/templates/frontend/application/libs/ui/pagination/src/lib/hlm-pagination-link.ts +2 -1
- package/dist/templates/frontend/application/libs/ui/pagination/src/lib/hlm-pagination-next.ts +10 -9
- package/dist/templates/frontend/application/libs/ui/pagination/src/lib/hlm-pagination-previous.ts +11 -9
- package/dist/templates/frontend/application/libs/ui/popover/src/index.ts +9 -0
- package/dist/templates/frontend/application/libs/ui/popover/src/lib/hlm-popover-content.ts +2 -1
- package/dist/templates/frontend/application/libs/ui/popover/src/lib/hlm-popover-description.ts +12 -0
- package/dist/templates/frontend/application/libs/ui/popover/src/lib/hlm-popover-header.ts +12 -0
- package/dist/templates/frontend/application/libs/ui/popover/src/lib/hlm-popover-title.ts +12 -0
- package/dist/templates/frontend/application/libs/ui/popover/src/lib/hlm-popover-trigger.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/popover/src/lib/hlm-popover.ts +2 -3
- package/dist/templates/frontend/application/libs/ui/progress/src/lib/hlm-progress-indicator.ts +10 -4
- package/dist/templates/frontend/application/libs/ui/progress/src/lib/hlm-progress.ts +2 -1
- package/dist/templates/frontend/application/libs/ui/radio-group/src/lib/hlm-radio.ts +3 -4
- package/dist/templates/frontend/application/libs/ui/resizable/src/lib/hlm-resizable-handle.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/scroll-area/src/lib/hlm-scroll-area.ts +6 -4
- package/dist/templates/frontend/application/libs/ui/select/src/lib/hlm-select-content.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/select/src/lib/hlm-select-group.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/select/src/lib/hlm-select-item.ts +3 -5
- package/dist/templates/frontend/application/libs/ui/select/src/lib/hlm-select-label.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/select/src/lib/hlm-select-multiple.ts +8 -18
- package/dist/templates/frontend/application/libs/ui/select/src/lib/hlm-select-placeholder.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/select/src/lib/hlm-select-scroll-down.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/select/src/lib/hlm-select-scroll-up.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/select/src/lib/hlm-select-separator.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/select/src/lib/hlm-select-trigger.ts +16 -4
- package/dist/templates/frontend/application/libs/ui/select/src/lib/hlm-select-values-content.ts +4 -1
- package/dist/templates/frontend/application/libs/ui/select/src/lib/hlm-select.ts +8 -18
- package/dist/templates/frontend/application/libs/ui/separator/src/lib/hlm-separator.ts +4 -1
- package/dist/templates/frontend/application/libs/ui/sheet/src/lib/hlm-sheet-close.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/sheet/src/lib/hlm-sheet-content.ts +14 -30
- package/dist/templates/frontend/application/libs/ui/sheet/src/lib/hlm-sheet-description.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/sheet/src/lib/hlm-sheet-footer.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/sheet/src/lib/hlm-sheet-header.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/sheet/src/lib/hlm-sheet-overlay.ts +1 -4
- package/dist/templates/frontend/application/libs/ui/sheet/src/lib/hlm-sheet-title.ts +2 -4
- package/dist/templates/frontend/application/libs/ui/sheet/src/lib/hlm-sheet-trigger.ts +1 -3
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-content.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-footer.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-group-action.ts +4 -6
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-group-content.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-group-label.ts +4 -4
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-group.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-header.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-input.ts +4 -7
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-inset.ts +5 -7
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-menu-action.ts +2 -8
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-menu-badge.ts +4 -8
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-menu-button.ts +3 -3
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-menu-skeleton.ts +3 -3
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-menu-sub-button.ts +8 -6
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-menu-sub.ts +8 -4
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-menu.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-rail.ts +2 -2
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-separator.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-trigger.ts +8 -19
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar-wrapper.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar.service.ts +28 -11
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar.token.ts +2 -0
- package/dist/templates/frontend/application/libs/ui/sidebar/src/lib/hlm-sidebar.ts +11 -15
- package/dist/templates/frontend/application/libs/ui/slider/src/lib/hlm-slider.ts +3 -3
- package/dist/templates/frontend/application/libs/ui/sonner/src/lib/hlm-toaster.ts +12 -1
- package/dist/templates/frontend/application/libs/ui/spinner/src/lib/hlm-spinner.ts +2 -1
- package/dist/templates/frontend/application/libs/ui/switch/src/lib/hlm-switch-thumb.ts +2 -1
- package/dist/templates/frontend/application/libs/ui/switch/src/lib/hlm-switch.ts +15 -9
- package/dist/templates/frontend/application/libs/ui/tabs/src/lib/hlm-tabs-list.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/tabs/src/lib/hlm-tabs-paginated-list.ts +8 -20
- package/dist/templates/frontend/application/libs/ui/tabs/src/lib/hlm-tabs-trigger.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/textarea/src/lib/hlm-textarea.ts +10 -28
- package/dist/templates/frontend/application/libs/ui/toggle/src/lib/hlm-toggle.ts +1 -1
- package/dist/templates/frontend/application/libs/ui/tooltip/src/lib/hlm-tooltip.ts +3 -2
- package/dist/templates/frontend/application/libs/ui/utils/src/index.ts +1 -0
- package/dist/templates/frontend/application/libs/ui/utils/src/lib/provide-spartan-hlm.ts +34 -0
- package/dist/templates/frontend/application/package.json +38 -29
- package/dist/templates/frontend/application/public/i18n/en.json +18 -2
- package/dist/templates/frontend/application/public/i18n/es.json +18 -2
- package/dist/templates/frontend/application/public/i18n/navigation/en.json +22 -29
- package/dist/templates/frontend/application/public/i18n/navigation/es.json +22 -29
- package/dist/templates/frontend/application/src/@aurora/components/async-multiple-search-select/async-multiple-search-select.component.spec.ts +11 -10
- package/dist/templates/frontend/application/src/@aurora/components/async-multiple-search-select/async-multiple-search-select.component.ts +12 -15
- package/dist/templates/frontend/application/src/@aurora/components/async-multiple-search-select/async-multiple-search-select.stories.ts +0 -2
- package/dist/templates/frontend/application/src/@aurora/components/async-search-select/async-search-select.component.spec.ts +19 -11
- package/dist/templates/frontend/application/src/@aurora/components/async-search-select/async-search-select.component.ts +12 -15
- package/dist/templates/frontend/application/src/@aurora/components/async-search-select/async-search-select.stories.ts +0 -22
- package/dist/templates/frontend/application/src/@aurora/components/breadcrumb/breadcrumb.service.ts +2 -2
- package/dist/templates/frontend/application/src/@aurora/components/chart/chart.component.spec.ts +663 -0
- package/dist/templates/frontend/application/src/@aurora/components/chart/chart.component.ts +334 -0
- package/dist/templates/frontend/application/src/@aurora/components/chart/chart.stories.ts +103 -0
- package/dist/templates/frontend/application/src/@aurora/components/chart/index.ts +1 -0
- package/dist/templates/frontend/application/src/@aurora/components/color-picker/color-picker.component.spec.ts +671 -0
- package/dist/templates/frontend/application/src/@aurora/components/color-picker/color-picker.component.ts +802 -0
- package/dist/templates/frontend/application/src/@aurora/components/color-picker/color-picker.stories.ts +180 -0
- package/dist/templates/frontend/application/src/@aurora/components/color-picker/color-utils.spec.ts +270 -0
- package/dist/templates/frontend/application/src/@aurora/components/color-picker/color-utils.ts +177 -0
- package/dist/templates/frontend/application/src/@aurora/components/color-picker/index.ts +2 -0
- package/dist/templates/frontend/application/src/@aurora/components/custom-field-capture-form/custom-field-capture-form.component.spec.ts +344 -0
- package/dist/templates/frontend/application/src/@aurora/components/custom-field-capture-form/custom-field-capture-form.component.ts +366 -0
- package/dist/templates/frontend/application/src/@aurora/components/custom-field-capture-form/index.ts +4 -0
- package/dist/templates/frontend/application/src/@aurora/components/custom-field-capture-form/lib/build-custom-field-capture-model.spec.ts +82 -0
- package/dist/templates/frontend/application/src/@aurora/components/custom-field-capture-form/lib/build-custom-field-capture-model.ts +49 -0
- package/dist/templates/frontend/application/src/@aurora/components/custom-field-capture-form/lib/custom-field-capture-form.types.ts +57 -0
- package/dist/templates/frontend/application/src/@aurora/components/custom-field-capture-form/lib/custom-field-capture-value-equality.spec.ts +28 -0
- package/dist/templates/frontend/application/src/@aurora/components/custom-field-capture-form/lib/custom-field-capture-value-equality.ts +24 -0
- package/dist/templates/frontend/application/src/@aurora/components/custom-field-capture-form/lib/validate-custom-field-capture-value.spec.ts +50 -0
- package/dist/templates/frontend/application/src/@aurora/components/custom-field-capture-form/lib/validate-custom-field-capture-value.ts +30 -0
- package/dist/templates/frontend/application/src/@aurora/components/data-table/cells/boolean-cell.component.ts +3 -6
- package/dist/templates/frontend/application/src/@aurora/components/data-table/cells/date-cell.component.ts +62 -0
- package/dist/templates/frontend/application/src/@aurora/components/data-table/cells/date-cell.stories.ts +117 -0
- package/dist/templates/frontend/application/src/@aurora/components/data-table/cells/enum-cell.component.ts +23 -0
- package/dist/templates/frontend/application/src/@aurora/components/data-table/cells/index.ts +2 -0
- package/dist/templates/frontend/application/src/@aurora/components/data-table/components/column-toggle.component.ts +7 -29
- package/dist/templates/frontend/application/src/@aurora/components/data-table/components/data-table.component.spec.ts +460 -0
- package/dist/templates/frontend/application/src/@aurora/components/data-table/components/data-table.component.ts +17 -3
- package/dist/templates/frontend/application/src/@aurora/components/data-table/components/head-selection.component.ts +2 -1
- package/dist/templates/frontend/application/src/@aurora/components/data-table/components/row-selection.component.ts +2 -1
- package/dist/templates/frontend/application/src/@aurora/components/data-table/components/sort-button.component.ts +44 -14
- package/dist/templates/frontend/application/src/@aurora/components/data-table/components/table-export.component.ts +5 -9
- package/dist/templates/frontend/application/src/@aurora/components/data-table/components/table-filters.component.ts +2 -11
- package/dist/templates/frontend/application/src/@aurora/components/data-table/components/table-pagination.component.ts +16 -26
- package/dist/templates/frontend/application/src/@aurora/components/data-table/components/table-search.component.ts +1 -11
- package/dist/templates/frontend/application/src/@aurora/components/data-table/index.ts +5 -1
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/build-filter-where.spec.ts +123 -8
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/build-filter-where.ts +55 -33
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/build-search-where.spec.ts +141 -17
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/build-search-where.ts +50 -21
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/build-sort-order.spec.ts +22 -11
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/build-sort-order.ts +25 -19
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/column-helpers.spec.ts +72 -0
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/column-helpers.ts +8 -1
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/custom-field-column.ts +141 -0
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/get-relations-node.spec.ts +157 -0
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/get-relations-node.ts +69 -0
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/merge-custom-field-columns.spec.ts +217 -0
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/merge-custom-field-columns.ts +146 -0
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/nested-column.ts +24 -23
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/relation-cell.spec.ts +33 -0
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/relation-cell.ts +13 -0
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/resolve-custom-field-filter.spec.ts +140 -0
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/resolve-custom-field-filter.ts +119 -0
- package/dist/templates/frontend/application/src/@aurora/components/data-table/services/in-memory-column-config-storage.ts +2 -2
- package/dist/templates/frontend/application/src/@aurora/components/data-table/types.ts +57 -8
- package/dist/templates/frontend/application/src/@aurora/components/date-picker/date-picker.component.spec.ts +189 -0
- package/dist/templates/frontend/application/src/@aurora/components/date-picker/date-picker.component.ts +137 -0
- package/dist/templates/frontend/application/src/@aurora/components/date-picker/index.ts +1 -0
- package/dist/templates/frontend/application/src/@aurora/components/datetime-picker/datetime-picker.component.spec.ts +296 -0
- package/dist/templates/frontend/application/src/@aurora/components/datetime-picker/datetime-picker.component.ts +223 -0
- package/dist/templates/frontend/application/src/@aurora/components/datetime-picker/datetime-picker.stories.ts +143 -0
- package/dist/templates/frontend/application/src/@aurora/components/datetime-picker/index.ts +1 -0
- package/dist/templates/frontend/application/src/@aurora/components/grid-pick-dialog/grid-pick-dialog.component.ts +22 -26
- package/dist/templates/frontend/application/src/@aurora/components/grid-select-element/grid-select-element.component.spec.ts +98 -10
- package/dist/templates/frontend/application/src/@aurora/components/grid-select-element/grid-select-element.component.ts +41 -10
- package/dist/templates/frontend/application/src/@aurora/components/grid-select-element/grid-select-element.stories.ts +6 -0
- package/dist/templates/frontend/application/src/@aurora/components/grid-select-multiple-elements/grid-select-multiple-elements.component.spec.ts +80 -0
- package/dist/templates/frontend/application/src/@aurora/components/grid-select-multiple-elements/grid-select-multiple-elements.component.ts +10 -26
- package/dist/templates/frontend/application/src/@aurora/components/grid-select-multiple-elements/grid-select-multiple-elements.stories.ts +2 -2
- package/dist/templates/frontend/application/src/@aurora/components/hlm-badge-icon-cell/hlm-badge-icon-cell.component.ts +4 -7
- package/dist/templates/frontend/application/src/@aurora/components/hlm-password-strength/hlm-password-strength.component.ts +1 -2
- package/dist/templates/frontend/application/src/@aurora/components/index.ts +11 -0
- package/dist/templates/frontend/application/src/@aurora/components/multiple-search-select/multiple-search-select.component.spec.ts +14 -15
- package/dist/templates/frontend/application/src/@aurora/components/multiple-search-select/multiple-search-select.component.ts +12 -15
- package/dist/templates/frontend/application/src/@aurora/components/multiple-search-select/multiple-search-select.stories.ts +0 -9
- package/dist/templates/frontend/application/src/@aurora/components/password-input/index.ts +1 -0
- package/dist/templates/frontend/application/src/@aurora/components/password-input/password-input.component.spec.ts +271 -0
- package/dist/templates/frontend/application/src/@aurora/components/password-input/password-input.component.ts +181 -0
- package/dist/templates/frontend/application/src/@aurora/components/password-input/password-input.stories.ts +189 -0
- package/dist/templates/frontend/application/src/@aurora/components/progress-uploader/index.ts +2 -0
- package/dist/templates/frontend/application/src/@aurora/components/progress-uploader/progress-uploader.component.ts +76 -0
- package/dist/templates/frontend/application/src/@aurora/components/progress-uploader/progress-uploader.service.ts +105 -0
- package/dist/templates/frontend/application/src/@aurora/components/search-select/search-select.component.spec.ts +14 -15
- package/dist/templates/frontend/application/src/@aurora/components/search-select/search-select.component.ts +17 -18
- package/dist/templates/frontend/application/src/@aurora/components/search-select/search-select.stories.ts +0 -14
- package/dist/templates/frontend/application/src/@aurora/components/status-badge/index.ts +3 -0
- package/dist/templates/frontend/application/src/@aurora/components/status-badge/status-badge-cell.component.ts +37 -0
- package/dist/templates/frontend/application/src/@aurora/components/status-badge/status-badge-cell.stories.ts +74 -0
- package/dist/templates/frontend/application/src/@aurora/components/status-badge/status-badge.component.ts +63 -0
- package/dist/templates/frontend/application/src/@aurora/components/status-badge/status-badge.spec.ts +93 -0
- package/dist/templates/frontend/application/src/@aurora/components/status-badge/status-badge.stories.ts +107 -0
- package/dist/templates/frontend/application/src/@aurora/components/status-badge/status-badge.types.ts +43 -0
- package/dist/templates/frontend/application/src/@aurora/composables/atoms/data-table/use-table-data.ts +3 -2
- package/dist/templates/frontend/application/src/@aurora/composables/atoms/graphql/use-graphql-find-by-id.ts +12 -2
- package/dist/templates/frontend/application/src/@aurora/composables/atoms/graphql/use-graphql-find.ts +14 -2
- package/dist/templates/frontend/application/src/@aurora/composables/atoms/graphql/use-graphql-get.ts +11 -2
- package/dist/templates/frontend/application/src/@aurora/composables/atoms/graphql/use-graphql-paginate.ts +9 -2
- package/dist/templates/frontend/application/src/@aurora/composables/presets/use-aggregate-shell.spec.ts +191 -0
- package/dist/templates/frontend/application/src/@aurora/composables/presets/use-aggregate-shell.ts +24 -4
- package/dist/templates/frontend/application/src/@aurora/composables/presets/use-graphql-detail.ts +23 -14
- package/dist/templates/frontend/application/src/@aurora/composables/presets/use-graphql-list.ts +14 -10
- package/dist/templates/frontend/application/src/@aurora/composables/presets/use-paginated-data-table.spec.ts +251 -0
- package/dist/templates/frontend/application/src/@aurora/composables/presets/use-paginated-data-table.ts +64 -19
- package/dist/templates/frontend/application/src/@aurora/composables/presets/use-pivot-membership.spec.ts +142 -0
- package/dist/templates/frontend/application/src/@aurora/composables/presets/use-pivot-membership.ts +7 -9
- package/dist/templates/frontend/application/src/@aurora/directives/index.ts +1 -0
- package/dist/templates/frontend/application/src/@aurora/directives/scroll-fade.directive.ts +150 -0
- package/dist/templates/frontend/application/src/@aurora/index.ts +1 -0
- package/dist/templates/frontend/application/src/@aurora/lib/calendar-i18n.spec.ts +138 -0
- package/dist/templates/frontend/application/src/@aurora/lib/calendar-i18n.ts +93 -0
- package/dist/templates/frontend/application/src/@aurora/lib/expand-display-field-template.ts +30 -0
- package/dist/templates/frontend/application/src/@aurora/lib/format-iso-date.spec.ts +50 -0
- package/dist/templates/frontend/application/src/@aurora/lib/format-iso-date.ts +43 -0
- package/dist/templates/frontend/application/src/@aurora/lib/format-iso-datetime.spec.ts +42 -0
- package/dist/templates/frontend/application/src/@aurora/lib/format-iso-datetime.ts +34 -0
- package/dist/templates/frontend/application/src/@aurora/lib/format-local-date.spec.ts +28 -0
- package/dist/templates/frontend/application/src/@aurora/lib/format-local-date.ts +23 -0
- package/dist/templates/frontend/application/src/@aurora/lib/format-utc-date.spec.ts +47 -0
- package/dist/templates/frontend/application/src/@aurora/lib/format-utc-date.ts +25 -0
- package/dist/templates/frontend/application/src/@aurora/lib/index.ts +12 -0
- package/dist/templates/frontend/application/src/@aurora/lib/item-label-of.spec.ts +45 -0
- package/dist/templates/frontend/application/src/@aurora/lib/item-label-of.ts +17 -7
- package/dist/templates/frontend/application/src/@aurora/lib/local-time.spec.ts +54 -0
- package/dist/templates/frontend/application/src/@aurora/lib/local-time.ts +40 -0
- package/dist/templates/frontend/application/src/@aurora/lib/resolve-enum-label.spec.ts +130 -0
- package/dist/templates/frontend/application/src/@aurora/lib/resolve-enum-label.ts +61 -0
- package/dist/templates/frontend/application/src/@aurora/lib/resolve-i18n-value.spec.ts +101 -0
- package/dist/templates/frontend/application/src/@aurora/lib/resolve-i18n-value.ts +30 -0
- package/dist/templates/frontend/application/src/@aurora/lib/resolve-storage-file-url.spec.ts +39 -0
- package/dist/templates/frontend/application/src/@aurora/lib/resolve-storage-file-url.ts +38 -0
- package/dist/templates/frontend/application/src/@aurora/lib/scroll-fade.spec.ts +94 -0
- package/dist/templates/frontend/application/src/@aurora/lib/scroll-fade.ts +51 -0
- package/dist/templates/frontend/application/src/@aurora/lib/use-async-search-list.spec.ts +133 -0
- package/dist/templates/frontend/application/src/@aurora/lib/use-async-search-list.ts +1 -6
- package/dist/templates/frontend/application/src/@aurora/lib/utc-date-prefix.ts +24 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/README.md +59 -2
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/data-access/authentication.graphql.ts +15 -15
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/guards/permission.guard.spec.ts +195 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/guards/permission.guard.ts +65 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/index.ts +7 -2
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/adapters/anonymous-current-account.adapter.spec.ts +92 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/adapters/anonymous-current-account.adapter.ts +36 -2
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/adapters/authentication-aurora-adapter.service.spec.ts +494 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/adapters/authentication-aurora-adapter.service.ts +99 -50
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/adapters/authentication-disabled.service.ts +8 -4
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/authenticated-initializer.ts +8 -7
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/authentication.provider.ts +2 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/authentication.service.ts +27 -1
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/authentication.spec.ts +113 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/authentication.ts +56 -3
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/authentication.types.ts +6 -2
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/current-account.service.ts +68 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/landing-resolver-permission-bounce.spec.ts +80 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/landing-resolver.service.spec.ts +440 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/landing-resolver.service.ts +156 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/resolve-landing-route.spec.ts +75 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/resolve-landing-route.ts +27 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/safe-redirect-path.spec.ts +41 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/safe-redirect-path.ts +21 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/session-recovery-coordinator.service.spec.ts +759 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/session-recovery-coordinator.service.ts +310 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/token-store.service.spec.ts +293 -0
- package/dist/templates/frontend/application/src/@aurora/modules/authentication/shared/token-store.service.ts +116 -1
- package/dist/templates/frontend/application/src/@aurora/modules/dashboard/components/dashboard-grid/dashboard-grid.component.css +150 -0
- package/dist/templates/frontend/application/src/@aurora/modules/dashboard/components/dashboard-grid/dashboard-grid.component.spec.ts +288 -0
- package/dist/templates/frontend/application/src/@aurora/modules/dashboard/components/dashboard-grid/dashboard-grid.component.ts +776 -0
- package/dist/templates/frontend/application/src/@aurora/modules/dashboard/components/dashboard-grid/dashboard-grid.gridstack.css +15 -0
- package/dist/templates/frontend/application/src/@aurora/modules/dashboard/components/dashboard-grid/dashboard-grid.helpers.ts +174 -0
- package/dist/templates/frontend/application/src/@aurora/modules/dashboard/components/dashboard-grid/index.ts +2 -0
- package/dist/templates/frontend/application/src/@aurora/modules/dashboard/components/dashboard-tile/dashboard-tile.component.spec.ts +261 -0
- package/dist/templates/frontend/application/src/@aurora/modules/dashboard/components/dashboard-tile/dashboard-tile.component.ts +306 -0
- package/dist/templates/frontend/application/src/@aurora/modules/dashboard/components/dashboard-tile/index.ts +1 -0
- package/dist/templates/frontend/application/src/@aurora/modules/dashboard/components/index.ts +2 -0
- package/dist/templates/frontend/application/src/@aurora/modules/dashboard/index.ts +1 -0
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/apollo.factory.spec.ts +1001 -530
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/apollo.factory.ts +108 -34
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/fetchers/mutate-create.ts +17 -8
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/fetchers/mutate-delete-by-id.ts +14 -8
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/fetchers/mutate-delete-by-keys.ts +15 -7
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/fetchers/mutate-delete.ts +18 -9
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/fetchers/mutate-insert.ts +14 -8
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/fetchers/mutate-update.ts +14 -8
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/fetchers/query-find-by-id.spec.ts +6 -4
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/fetchers/query-find-by-id.ts +12 -11
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/fetchers/query-find.spec.ts +7 -5
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/fetchers/query-find.ts +16 -13
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/fetchers/query-get.spec.ts +6 -4
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/fetchers/query-get.ts +13 -14
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/fetchers/query-paginate.spec.ts +8 -5
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/fetchers/query-paginate.ts +11 -9
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/fetchers/types.ts +5 -3
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/graphql.spec.ts +170 -0
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/graphql.ts +36 -6
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/graphql.types.ts +24 -12
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/handlers/aurora-graphql-auth.handler.spec.ts +30 -108
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/handlers/aurora-graphql-auth.handler.ts +9 -76
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/handlers/aurora-graphql-error.handler.spec.ts +12 -3
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/index.ts +5 -0
- package/dist/templates/frontend/application/src/@aurora/modules/health/health.service.spec.ts +138 -0
- package/dist/templates/frontend/application/src/@aurora/modules/health/health.service.ts +60 -0
- package/dist/templates/frontend/application/src/@aurora/modules/health/index.ts +1 -0
- package/dist/templates/frontend/application/src/@aurora/modules/index.ts +5 -0
- package/dist/templates/frontend/application/src/@aurora/modules/lang/index.ts +1 -0
- package/dist/templates/frontend/application/src/@aurora/modules/lang/lang-flag-icons.ts +34 -0
- package/dist/templates/frontend/application/src/@aurora/modules/lang/lang.service.spec.ts +129 -0
- package/dist/templates/frontend/application/src/@aurora/modules/lang/lang.service.ts +37 -3
- package/dist/templates/frontend/application/src/@aurora/modules/report-viewer/build-report-columns.spec.ts +367 -0
- package/dist/templates/frontend/application/src/@aurora/modules/report-viewer/build-report-columns.ts +186 -0
- package/dist/templates/frontend/application/src/@aurora/modules/report-viewer/index.ts +24 -0
- package/dist/templates/frontend/application/src/@aurora/modules/report-viewer/report-cell-renderer.registry.ts +52 -0
- package/dist/templates/frontend/application/src/@aurora/modules/report-viewer/report-fetch-adapter.spec.ts +148 -0
- package/dist/templates/frontend/application/src/@aurora/modules/report-viewer/report-fetch-adapter.ts +68 -0
- package/dist/templates/frontend/application/src/@aurora/modules/report-viewer/report-filter-form.component.ts +154 -0
- package/dist/templates/frontend/application/src/@aurora/modules/report-viewer/report-filter-form.spec.ts +181 -0
- package/dist/templates/frontend/application/src/@aurora/modules/report-viewer/report-viewer.types.ts +230 -0
- package/dist/templates/frontend/application/src/@aurora/modules/session/session.service.ts +2 -2
- package/dist/templates/frontend/application/src/@aurora/modules/theme/index.ts +2 -0
- package/dist/templates/frontend/application/src/@aurora/modules/theme/theme-palette.service.spec.ts +240 -0
- package/dist/templates/frontend/application/src/@aurora/modules/theme/theme-palette.service.ts +128 -0
- package/dist/templates/frontend/application/src/@aurora/modules/theme/theme-palette.type.ts +4 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/archetypes/chart-widget-component-i18n.spec.ts +217 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/archetypes/chart-widget-i18n.spec.ts +221 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/archetypes/chart-widget.component.ts +318 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/archetypes/chart-widget.spec.ts +274 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/archetypes/chart-widget.ts +89 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/archetypes/stat-widget.component.ts +200 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/archetypes/stat-widget.spec.ts +373 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/archetypes/stat-widget.ts +80 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/archetypes/table-widget-i18n.spec.ts +176 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/archetypes/table-widget.component.ts +230 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/archetypes/table-widget.spec.ts +332 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/archetypes/table-widget.ts +67 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/aurora-widget-def.ts +101 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/index.ts +17 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/refreshable-widget.spec.ts +75 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/refreshable-widget.ts +32 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/widget-category.ts +16 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/widget-data-source-runner.spec.ts +298 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/widget-data-source-runner.ts +103 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/widget-data-source.ts +68 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/widget-permission-filter.spec.ts +195 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/widget-permission-filter.ts +84 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/widget-registry.spec.ts +91 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/widget-registry.ts +38 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/widget-scope-deriver.spec.ts +85 -0
- package/dist/templates/frontend/application/src/@aurora/modules/widget/widget-scope-deriver.ts +41 -0
- package/dist/templates/frontend/application/src/@aurora/pipes/index.ts +1 -0
- package/dist/templates/frontend/application/src/@aurora/pipes/to-options.pipe.ts +2 -5
- package/dist/templates/frontend/application/src/@aurora/pipes/validation-message-legacy.pipe.spec.ts +81 -0
- package/dist/templates/frontend/application/src/@aurora/pipes/validation-message-legacy.pipe.ts +50 -0
- package/dist/templates/frontend/application/src/@aurora/pipes/validation-message.pipe.spec.ts +197 -0
- package/dist/templates/frontend/application/src/@aurora/pipes/validation-message.pipe.ts +97 -21
- package/dist/templates/frontend/application/src/@aurora/query-dsl/index.ts +32 -0
- package/dist/templates/frontend/application/src/@aurora/query-dsl/query-statement.spec.ts +94 -0
- package/dist/templates/frontend/application/src/@aurora/query-dsl/query-statement.type-contract.ts +38 -0
- package/dist/templates/frontend/application/src/app/app.config.ts +18 -6
- package/dist/templates/frontend/application/src/app/app.routes.ts +1 -1
- package/dist/templates/frontend/application/src/app/app.ts +1 -2
- package/dist/templates/frontend/application/src/app/aurora-widget.providers.ts +21 -0
- package/dist/templates/frontend/application/src/app/aurora.provider.spec.ts +1 -2
- package/dist/templates/frontend/application/src/app/aurora.provider.ts +12 -5
- package/dist/templates/frontend/application/src/app/domains/admin/home/home.component.ts +15 -0
- package/dist/templates/frontend/application/src/app/domains/admin/layout/layout.component.ts +2 -3
- package/dist/templates/frontend/application/src/app/domains/admin/layout/sidebar/app-sidebar.spec.ts +111 -0
- package/dist/templates/frontend/application/src/app/domains/admin/layout/sidebar/app-sidebar.ts +74 -21
- package/dist/templates/frontend/application/src/app/domains/admin/layout/sidebar/nav-active.spec.ts +124 -0
- package/dist/templates/frontend/application/src/app/domains/admin/layout/sidebar/nav-active.ts +48 -0
- package/dist/templates/frontend/application/src/app/domains/admin/layout/sidebar/nav-filter.spec.ts +203 -0
- package/dist/templates/frontend/application/src/app/domains/admin/layout/sidebar/nav-filter.ts +122 -0
- package/dist/templates/frontend/application/src/app/domains/admin/layout/sidebar/nav-main.ts +19 -28
- package/dist/templates/frontend/application/src/app/domains/admin/layout/sidebar/nav-secondary.ts +1 -2
- package/dist/templates/frontend/application/src/app/domains/admin/layout/sidebar/nav-sub-items.ts +10 -23
- package/dist/templates/frontend/application/src/app/domains/admin/layout/sidebar/nav-user.ts +1 -2
- package/dist/templates/frontend/application/src/app/domains/admin/layout/sidebar/types.ts +4 -0
- package/dist/templates/frontend/application/src/app/domains/admin/layout/site-header.spec.ts +153 -0
- package/dist/templates/frontend/application/src/app/domains/admin/layout/site-header.ts +109 -31
- package/dist/templates/frontend/application/src/app/domains/admin/navigation-data.ts +4 -20
- package/dist/templates/frontend/application/src/app/domains/admin/routes.ts +4 -3
- package/dist/templates/frontend/application/src/app/domains/auth/callback-error/callback-error.component.ts +1 -2
- package/dist/templates/frontend/application/src/app/domains/auth/layout.ts +1 -2
- package/dist/templates/frontend/application/src/app/domains/auth/sign-in/login-form.spec.ts +32 -31
- package/dist/templates/frontend/application/src/app/domains/auth/sign-in/login-form.ts +23 -33
- package/dist/templates/frontend/application/src/app/domains/auth/sign-in/oauth-session.service.ts +2 -4
- package/dist/templates/frontend/application/src/app/domains/auth/sign-in/sign-in.component.ts +1 -2
- package/dist/templates/frontend/application/src/app/domains/auth/sign-out/sign-out.component.spec.ts +13 -11
- package/dist/templates/frontend/application/src/app/domains/auth/sign-out/sign-out.component.ts +6 -9
- package/dist/templates/frontend/application/src/app/domains/auth/sign-up/sign-up.component.ts +1 -2
- package/dist/templates/frontend/application/src/app/domains/auth/sign-up/signup-form.spec.ts +60 -0
- package/dist/templates/frontend/application/src/app/domains/auth/sign-up/signup-form.ts +25 -16
- package/dist/templates/frontend/application/src/app/domains/auth/signed-out/signed-out.component.ts +1 -2
- package/dist/templates/frontend/application/src/app/transloco-lang.factory.spec.ts +40 -0
- package/dist/templates/frontend/application/src/app/transloco-lang.factory.ts +28 -0
- package/dist/templates/frontend/application/src/app/transloco-loader.ts +2 -2
- package/dist/templates/frontend/application/src/environments/environment.dev.ts +46 -3
- package/dist/templates/frontend/application/src/environments/environment.local.ts +47 -4
- package/dist/templates/frontend/application/src/environments/environment.prod.ts +46 -3
- package/dist/templates/frontend/application/src/environments/environment.qa.ts +46 -3
- package/dist/templates/frontend/application/src/environments/environment.ts +46 -3
- package/dist/templates/frontend/application/src/environments/environment.type.ts +61 -0
- package/dist/templates/frontend/application/src/index.html +21 -1
- package/dist/templates/frontend/application/src/styles.css +772 -8
- package/dist/templates/frontend/application/tsconfig.app.json +3 -9
- package/dist/templates/frontend/application/tsconfig.json +17 -1
- package/dist/templates/frontend/packages/dashboard/public/i18n/dashboard/en.json +41 -0
- package/dist/templates/frontend/packages/dashboard/public/i18n/dashboard/es.json +41 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/dashboard.routes.ts +8 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/features/dashboard-i18n.spec.ts +342 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/features/dashboard.component.spec.ts +349 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/features/dashboard.component.ts +622 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/features/dashboard.helpers.spec.ts +152 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/features/dashboard.helpers.ts +79 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/features/dashboard.orchestration.ts +159 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/features/index.ts +1 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/features/widget-catalog-dialog.component.ts +295 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/features/widget-catalog.helpers.spec.ts +202 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/features/widget-catalog.helpers.ts +58 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/layout/data-access/index.ts +3 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/layout/data-access/layout.graphql.spec.ts +142 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/layout/data-access/layout.graphql.ts +48 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/layout/data-access/layout.service.ts +71 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/layout/data-access/layout.types.ts +44 -0
- package/dist/templates/frontend/packages/dashboard/src/app/domains/admin/apps/dashboard/layout/index.ts +1 -0
- package/dist/templates/frontend/packages/hub/public/i18n/hub/en.json +50 -0
- package/dist/templates/frontend/packages/hub/public/i18n/hub/es.json +50 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/app/app.columns.ts +113 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/app/app.cross-context.spec.ts +56 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/app/data-access/app.detail-config.ts +12 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/app/data-access/app.graphql.ts +157 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/app/data-access/app.list-config.ts +13 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/app/data-access/app.resolvers.ts +39 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/app/data-access/index.ts +8 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/app/features/app-form.component.ts +326 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/app/features/app-list-actions-cell.component.ts +75 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/app/features/app-list.component.ts +429 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/app/features/index.ts +7 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/app/index.ts +7 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/app-account/data-access/app-account.detail-config.ts +13 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/app-account/data-access/app-account.graphql.ts +156 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/app-account/data-access/app-account.list-config.ts +14 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/hub-icons.providers.ts +11 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/hub.navigation.ts +39 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/hub.routes.ts +35 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/hub.types.ts +5 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/index.ts +6 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/launchpad/data-access/launchpad.graphql.ts +48 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/launchpad/features/hub-app-card.component.spec.ts +259 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/launchpad/features/hub-app-card.component.ts +228 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/launchpad/features/hub-app-card.helpers.ts +21 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/launchpad/features/hub-launchpad-keyboard.helpers.ts +148 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/launchpad/features/hub-launchpad.component.spec.ts +493 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/launchpad/features/hub-launchpad.component.ts +612 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/launchpad/features/hub-launchpad.helpers.spec.ts +328 -0
- package/dist/templates/frontend/packages/hub/src/app/domains/admin/apps/hub/launchpad/features/hub-launchpad.helpers.ts +167 -0
- package/dist/templates/frontend/packages/iam/public/i18n/iam/en.json +6 -1
- package/dist/templates/frontend/packages/iam/public/i18n/iam/es.json +6 -1
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/adapters/current-account.adapter.spec.ts +459 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/adapters/current-account.adapter.ts +140 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/adapters/index.ts +1 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/data-access/account.derive.spec.ts +63 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/data-access/account.derive.ts +32 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/data-access/account.detail-config.ts +12 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/data-access/account.graphql.ts +288 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/data-access/account.list-config.ts +13 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/data-access/account.resolvers.spec.ts +72 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/data-access/account.resolvers.ts +123 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/data-access/index.ts +12 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/features/account-detail.component.spec.ts +78 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/features/account-detail.component.ts +170 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/features/account-form.component.spec.ts +914 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/features/account-form.component.ts +896 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/features/account-list-actions-cell.component.ts +113 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/features/account-list.component.ts +261 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/features/index.ts +6 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/account/index.ts +11 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/bounded-context/data-access/bounded-context.detail-config.ts +12 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/bounded-context/data-access/bounded-context.graphql.ts +171 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/bounded-context/data-access/bounded-context.list-config.ts +13 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/bounded-context/data-access/bounded-context.resolvers.ts +39 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/bounded-context/data-access/index.ts +8 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/bounded-context/features/bounded-context-detail.component.ts +160 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/bounded-context/features/bounded-context-form.component.ts +150 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/bounded-context/features/bounded-context-list-actions-cell.component.ts +75 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/bounded-context/features/bounded-context-list.component.ts +242 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/bounded-context/features/index.ts +8 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/bounded-context/index.ts +7 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/iam-icons.providers.ts +23 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/iam.navigation.ts +59 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/iam.routes.ts +92 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/permission/data-access/index.ts +8 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/permission/data-access/permission.detail-config.ts +12 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/permission/data-access/permission.graphql.ts +181 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/permission/data-access/permission.list-config.ts +13 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/permission/data-access/permission.resolvers.ts +72 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/permission/features/index.ts +8 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/permission/features/permission-form-embed.component.ts +97 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/permission/features/permission-form.component.ts +130 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/permission/features/permission-list-actions-cell.component.ts +75 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/permission/features/permission-list.component.ts +398 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/permission/index.ts +7 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/permission/permission.columns.ts +73 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/permission-role/data-access/permission-role.detail-config.ts +12 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/permission-role/data-access/permission-role.graphql.ts +200 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/permission-role/data-access/permission-role.list-config.ts +13 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/role/data-access/index.ts +8 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/role/data-access/role.detail-config.ts +12 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/role/data-access/role.graphql.ts +195 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/role/data-access/role.list-config.ts +13 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/role/data-access/role.resolvers.ts +39 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/role/features/index.ts +8 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/role/features/role-detail.component.ts +295 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/role/features/role-form.component.ts +185 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/role/features/role-list-actions-cell.component.ts +75 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/role/features/role-list.component.ts +236 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/role/index.ts +7 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/role/role.columns.ts +119 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/role-account/data-access/role-account.detail-config.ts +12 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/role-account/data-access/role-account.graphql.ts +199 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/role-account/data-access/role-account.list-config.ts +13 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/shared/validators/unique-email.validator.ts +31 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/shared/validators/unique-username.validator.ts +29 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tag/data-access/index.ts +8 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tag/data-access/tag.detail-config.ts +12 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tag/data-access/tag.graphql.ts +113 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tag/data-access/tag.list-config.ts +13 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tag/data-access/tag.resolvers.ts +39 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tag/features/index.ts +7 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tag/features/tag-form.component.ts +88 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tag/features/tag-list-actions-cell.component.ts +75 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tag/features/tag-list.component.ts +318 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tag/index.ts +7 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tenant/data-access/index.ts +8 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tenant/data-access/tenant.detail-config.ts +12 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tenant/data-access/tenant.graphql.ts +224 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tenant/data-access/tenant.list-config.ts +13 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tenant/data-access/tenant.resolvers.ts +65 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tenant/features/index.ts +7 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tenant/features/tenant-form.component.ts +168 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tenant/features/tenant-list-actions-cell.component.ts +75 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tenant/features/tenant-list.component.ts +330 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tenant/index.ts +7 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tenant/tenant.columns.ts +103 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tenant-account/data-access/tenant-account.detail-config.ts +12 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tenant-account/data-access/tenant-account.graphql.ts +204 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/tenant-account/data-access/tenant-account.list-config.ts +13 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/user/data-access/index.ts +8 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/user/data-access/user.detail-config.ts +11 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/user/data-access/user.graphql.ts +180 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/user/data-access/user.list-config.ts +13 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/user/data-access/user.resolvers.ts +39 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/user/features/index.ts +5 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/user/index.ts +6 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/widgets/iam.widgets.spec.ts +262 -0
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/apps/iam/widgets/iam.widgets.ts +156 -0
- package/dist/templates/frontend/packages/o-auth/public/i18n/o-auth/en.json +7 -5
- package/dist/templates/frontend/packages/o-auth/public/i18n/o-auth/es.json +8 -6
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/access-token/access-token.columns.ts +86 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/access-token/data-access/access-token.detail-config.ts +10 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/access-token/data-access/access-token.graphql.ts +117 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/access-token/data-access/access-token.list-config.ts +13 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/access-token/data-access/access-token.resolvers.ts +43 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/access-token/data-access/index.ts +8 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/access-token/features/access-token-list-actions-cell.component.ts +60 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/access-token/features/access-token-list.component.ts +224 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/access-token/features/index.ts +6 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/access-token/index.ts +7 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/application/application.columns.ts +78 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/application/data-access/application.detail-config.ts +12 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/application/data-access/application.graphql.ts +140 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/application/data-access/application.list-config.ts +13 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/application/data-access/application.resolvers.ts +39 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/application/data-access/index.ts +8 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/application/features/application-form.component.ts +198 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/application/features/application-list-actions-cell.component.ts +75 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/application/features/application-list.component.ts +322 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/application/features/index.ts +7 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/application/index.ts +7 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/application-client/data-access/application-client.graphql.ts +158 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/authorization-code/authorization-code.columns.ts +123 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/authorization-code/data-access/authorization-code.detail-config.ts +12 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/authorization-code/data-access/authorization-code.graphql.ts +168 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/authorization-code/data-access/authorization-code.list-config.ts +13 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/authorization-code/data-access/authorization-code.resolvers.ts +47 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/authorization-code/data-access/index.ts +8 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/authorization-code/features/authorization-code-form.component.ts +218 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/authorization-code/features/authorization-code-list-actions-cell.component.ts +76 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/authorization-code/features/authorization-code-list.component.ts +333 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/authorization-code/features/index.ts +7 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/authorization-code/index.ts +7 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/client/client.columns.ts +145 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/client/data-access/client.detail-config.ts +12 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/client/data-access/client.graphql.ts +134 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/client/data-access/client.list-config.ts +13 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/client/data-access/client.resolvers.ts +69 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/client/data-access/index.ts +8 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/client/features/client-form.component.ts +291 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/client/features/client-list-actions-cell.component.ts +75 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/client/features/client-list.component.ts +335 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/client/features/index.ts +7 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/client/index.ts +7 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/o-auth-icons.providers.ts +21 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/o-auth.navigation.ts +59 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/o-auth.routes.ts +44 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/refresh-token/data-access/index.ts +8 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/refresh-token/data-access/refresh-token.detail-config.ts +10 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/refresh-token/data-access/refresh-token.graphql.ts +104 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/refresh-token/data-access/refresh-token.list-config.ts +13 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/refresh-token/data-access/refresh-token.resolvers.ts +39 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/refresh-token/features/index.ts +6 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/refresh-token/features/refresh-token-list-actions-cell.component.ts +60 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/refresh-token/features/refresh-token-list.component.ts +221 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/refresh-token/index.ts +7 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/refresh-token/refresh-token.columns.ts +60 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/scope/data-access/index.ts +8 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/scope/data-access/scope.detail-config.ts +12 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/scope/data-access/scope.graphql.ts +120 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/scope/data-access/scope.list-config.ts +13 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/scope/data-access/scope.resolvers.ts +39 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/scope/features/index.ts +7 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/scope/features/scope-form.component.spec.ts +75 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/scope/features/scope-form.component.ts +116 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/scope/features/scope-list-actions-cell.component.ts +75 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/scope/features/scope-list.component.ts +318 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/scope/index.ts +7 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/widgets/o-auth.widgets.spec.ts +338 -0
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/apps/o-auth/widgets/o-auth.widgets.ts +230 -0
- package/dist/templates/frontend/packages/queue-manager/public/i18n/queue-manager/en.json +92 -0
- package/dist/templates/frontend/packages/queue-manager/public/i18n/queue-manager/es.json +92 -0
- package/dist/templates/frontend/packages/queue-manager/src/app/domains/admin/apps/queue-manager/index.ts +1 -0
- package/dist/templates/frontend/packages/queue-manager/src/app/domains/admin/apps/queue-manager/queue/data-access/queue.graphql.ts +214 -0
- package/dist/templates/frontend/packages/queue-manager/src/app/domains/admin/apps/queue-manager/queue/data-access/queue.service.ts +301 -0
- package/dist/templates/frontend/packages/queue-manager/src/app/domains/admin/apps/queue-manager/queue/data-access/use-queue-polling.spec.ts +281 -0
- package/dist/templates/frontend/packages/queue-manager/src/app/domains/admin/apps/queue-manager/queue/data-access/use-queue-polling.ts +87 -0
- package/dist/templates/frontend/packages/queue-manager/src/app/domains/admin/apps/queue-manager/queue/features/job-data-dialog.component.spec.ts +345 -0
- package/dist/templates/frontend/packages/queue-manager/src/app/domains/admin/apps/queue-manager/queue/features/job-data-dialog.component.ts +246 -0
- package/dist/templates/frontend/packages/queue-manager/src/app/domains/admin/apps/queue-manager/queue/features/job-drawer.component.ts +492 -0
- package/dist/templates/frontend/packages/queue-manager/src/app/domains/admin/apps/queue-manager/queue/features/queue-detail.component.ts +666 -0
- package/dist/templates/frontend/packages/queue-manager/src/app/domains/admin/apps/queue-manager/queue/features/queue-list.component.ts +547 -0
- package/dist/templates/frontend/packages/queue-manager/src/app/domains/admin/apps/queue-manager/queue/index.ts +6 -0
- package/dist/templates/frontend/packages/queue-manager/src/app/domains/admin/apps/queue-manager/queue-manager-icons.providers.ts +5 -0
- package/dist/templates/frontend/packages/queue-manager/src/app/domains/admin/apps/queue-manager/queue-manager.navigation.ts +11 -0
- package/dist/templates/frontend/packages/queue-manager/src/app/domains/admin/apps/queue-manager/queue-manager.routes.ts +15 -0
- package/dist/templates/frontend/packages/queue-manager/src/app/domains/admin/apps/queue-manager/queue-manager.types.spec.ts +154 -0
- package/dist/templates/frontend/packages/queue-manager/src/app/domains/admin/apps/queue-manager/queue-manager.types.ts +192 -0
- package/dist/templates/monorepo/.backlog/config.yml +41 -0
- package/dist/templates/monorepo/.claude/agents/jd-fix-agent.md +35 -0
- package/dist/templates/monorepo/.claude/agents/jd-judge-a.md +41 -0
- package/dist/templates/monorepo/.claude/agents/jd-judge-b.md +41 -0
- package/dist/templates/monorepo/.claude/commands/business-rules/audit.md +2 -0
- package/dist/templates/monorepo/.claude/commands/business-rules/check.md +2 -0
- package/dist/templates/monorepo/.claude/commands/business-rules/document.md +4 -1
- package/dist/templates/monorepo/.claude/commands/business-rules/promote.md +2 -0
- package/dist/templates/monorepo/.claude/commands/opsx/apply.md +36 -7
- package/dist/templates/monorepo/.claude/commands/opsx/archive.md +91 -26
- package/dist/templates/monorepo/.claude/commands/opsx/explore.md +51 -27
- package/dist/templates/monorepo/.claude/commands/opsx/propose.md +64 -26
- package/dist/templates/monorepo/.claude/commands/opsx/sync.md +258 -0
- package/dist/templates/monorepo/.claude/hooks/__fixtures__/br-hr-regression-baseline.txt +263 -0
- package/dist/templates/monorepo/.claude/hooks/architecture-checkpoint.test.ts +470 -0
- package/dist/templates/monorepo/.claude/hooks/architecture-checkpoint.ts +395 -43
- package/dist/templates/monorepo/.claude/hooks/auto-allow-readonly-bash.test.ts +158 -0
- package/dist/templates/monorepo/.claude/hooks/auto-allow-readonly-bash.ts +314 -0
- package/dist/templates/monorepo/.claude/hooks/business-rules-injector.test.ts +387 -0
- package/dist/templates/monorepo/.claude/hooks/business-rules-injector.ts +231 -0
- package/dist/templates/monorepo/.claude/hooks/catalyst-regen-review.test.ts +114 -0
- package/dist/templates/monorepo/.claude/hooks/catalyst-regen-review.ts +260 -0
- package/dist/templates/monorepo/.claude/hooks/check-required-setup.test.ts +183 -0
- package/dist/templates/monorepo/.claude/hooks/check-required-setup.ts +304 -0
- package/dist/templates/monorepo/.claude/hooks/format-with-prettier.ts +98 -0
- package/dist/templates/monorepo/.claude/hooks/harness-rules-content-guard.ts +12 -7
- package/dist/templates/monorepo/.claude/hooks/inject-prompt-context.test.ts +453 -0
- package/dist/templates/monorepo/.claude/hooks/inject-prompt-context.ts +526 -0
- package/dist/templates/monorepo/.claude/hooks/instructions-loaded-log.test.ts +131 -0
- package/dist/templates/monorepo/.claude/hooks/instructions-loaded-log.ts +132 -0
- package/dist/templates/monorepo/.claude/hooks/lint-barrels.test.ts +237 -0
- package/dist/templates/monorepo/.claude/hooks/lint-barrels.ts +319 -0
- package/dist/templates/monorepo/.claude/rules/route-aurora-components.md +24 -0
- package/dist/templates/monorepo/.claude/rules/route-aurora-yaml.md +29 -0
- package/dist/templates/monorepo/.claude/rules/route-backend-test.md +31 -0
- package/dist/templates/monorepo/.claude/rules/route-drizzle-schema.md +35 -0
- package/dist/templates/monorepo/.claude/rules/route-eta.md +17 -0
- package/dist/templates/monorepo/.claude/rules/route-skill-md.md +28 -0
- package/dist/templates/monorepo/.claude/rules/scope-backend.md +39 -0
- package/dist/templates/monorepo/.claude/rules/scope-cli.md +28 -0
- package/dist/templates/monorepo/.claude/rules/scope-frontend.md +34 -0
- package/dist/templates/monorepo/.claude/scheduled_tasks.lock +1 -0
- package/dist/templates/monorepo/.claude/scripts/catalyst-dev-mode.sh +2 -3
- package/dist/templates/monorepo/.claude/scripts/daily-tips.txt +1 -0
- package/dist/templates/monorepo/.claude/scripts/generate-skills-index.test.ts +397 -0
- package/dist/templates/monorepo/.claude/scripts/generate-skills-index.ts +196 -23
- package/dist/templates/monorepo/.claude/scripts/status-line.sh +13 -2
- package/dist/templates/monorepo/.claude/settings.json +106 -17
- package/dist/templates/monorepo/.claude/skills/REGISTRY.md +61 -28
- package/dist/templates/monorepo/.claude/skills/business-rules-guard/SKILL.md +15 -2
- package/dist/templates/monorepo/.claude/skills/business-rules-guard/references/audit.md +9 -7
- package/dist/templates/monorepo/.claude/skills/business-rules-guard/references/format.md +70 -2
- package/dist/templates/monorepo/.claude/skills/business-rules-guard/references/workflow.md +2 -1
- package/dist/templates/monorepo/.claude/skills/catalyst-backlog/SKILL.md +954 -0
- package/dist/templates/monorepo/.claude/skills/catalyst-backlog/frontier-worker-addendum.md +145 -0
- package/dist/templates/monorepo/.claude/skills/catalyst-backlog/worker-system-prompt.md +88 -0
- package/dist/templates/monorepo/.claude/skills/catalyst-cli/SKILL.md +117 -38
- package/dist/templates/monorepo/.claude/skills/catalyst-cli/references/origin-conciliation.md +188 -20
- package/dist/templates/monorepo/.claude/skills/catalyst-cli/references/schema-versioning.md +1 -1
- package/dist/templates/monorepo/.claude/skills/catalyst-delegation/SKILL.md +180 -0
- package/dist/templates/monorepo/.claude/skills/catalyst-langs/SKILL.md +241 -0
- package/dist/templates/monorepo/.claude/skills/catalyst-query-dsl/SKILL.md +236 -0
- package/dist/templates/monorepo/.claude/skills/catalyst-query-dsl/references/query-language.md +265 -0
- package/dist/templates/monorepo/.claude/skills/catalyst-report-creator/SKILL.md +232 -0
- package/dist/templates/monorepo/.claude/skills/catalyst-report-creator/references/cube-authoring.md +155 -0
- package/dist/templates/monorepo/.claude/skills/catalyst-schema/SKILL.md +94 -30
- package/dist/templates/monorepo/.claude/skills/catalyst-schema/front-presentation.md +209 -0
- package/dist/templates/monorepo/.claude/skills/catalyst-schema/patterns-workflow.md +26 -2
- package/dist/templates/monorepo/.claude/skills/catalyst-schema/types-reference.md +184 -2
- package/dist/templates/monorepo/.claude/skills/catalyst-skill-creator/SKILL.md +10 -2
- package/dist/templates/monorepo/.claude/skills/catalyst-update-skill-registry/SKILL.md +54 -16
- package/dist/templates/monorepo/.claude/skills/harness-rules-guard/SKILL.md +24 -14
- package/dist/templates/monorepo/.claude/skills/harness-rules-guard/references/audit.md +384 -0
- package/dist/templates/monorepo/.claude/skills/harness-rules-guard/references/enforcement.md +7 -6
- package/dist/templates/monorepo/.claude/skills/harness-rules-guard/references/format.md +140 -6
- package/dist/templates/monorepo/.claude/skills/judgment-day/SKILL.md +26 -15
- package/dist/templates/monorepo/.claude/skills/judgment-day/references/prompts-and-formats.md +46 -21
- package/dist/templates/monorepo/.claude/skills/openspec-apply-change/SKILL.md +35 -6
- package/dist/templates/monorepo/.claude/skills/openspec-archive-change/SKILL.md +87 -22
- package/dist/templates/monorepo/.claude/skills/openspec-explore/SKILL.md +89 -65
- package/dist/templates/monorepo/.claude/skills/openspec-propose/SKILL.md +62 -24
- package/dist/templates/monorepo/.claude/skills/openspec-sync-specs/SKILL.md +262 -0
- package/dist/templates/monorepo/.claude/skills/typescript/SKILL.md +5 -0
- package/dist/templates/monorepo/.claude/skills-triggers-index.json +135 -0
- package/dist/templates/monorepo/.husky/post-checkout +17 -0
- package/dist/templates/monorepo/.husky/post-merge +15 -0
- package/dist/templates/monorepo/.husky/pre-commit +26 -0
- package/dist/templates/monorepo/.mcp.json +7 -0
- package/dist/templates/monorepo/CLAUDE.md +274 -327
- package/dist/templates/monorepo/cliter/business-rules-index.json +9252 -269
- package/dist/templates/monorepo/cliter/harness-rules/barrels.md +414 -0
- package/dist/templates/monorepo/cliter/harness-rules/bridges.md +211 -0
- package/dist/templates/monorepo/cliter/harness-rules/dev-modes.md +85 -0
- package/dist/templates/monorepo/cliter/harness-rules/docs-location.md +67 -0
- package/dist/templates/monorepo/cliter/harness-rules/generated-artifacts.md +104 -0
- package/dist/templates/monorepo/cliter/harness-rules/generated-code.md +77 -0
- package/dist/templates/monorepo/cliter/harness-rules/module-graph.md +89 -0
- package/dist/templates/monorepo/cliter/harness-rules/modules.md +78 -0
- package/dist/templates/monorepo/cliter/harness-rules/persistence-integrity.md +92 -0
- package/dist/templates/monorepo/cliter/harness-rules/ports-adapters.md +82 -0
- package/dist/templates/monorepo/cliter/harness-rules/protocol-flows.md +88 -0
- package/dist/templates/monorepo/cliter/harness-rules/types-acl.md +93 -0
- package/dist/templates/monorepo/cliter/harness-rules-index.json +1117 -0
- package/dist/templates/monorepo/docs/AURORA-CATALYST-BRIEF.md +253 -0
- package/dist/templates/monorepo/docs/_catalog-schema-base.json +1 -1
- package/dist/templates/monorepo/docs/business-rules/ARCHITECTURE.md +14 -11
- package/dist/templates/monorepo/docs/business-rules/INDEX.md +84 -5
- package/dist/templates/monorepo/docs/business-rules/MIGRATION.md +11 -52
- package/dist/templates/monorepo/docs/business-rules/README.md +42 -925
- package/dist/templates/monorepo/docs/harness-rules/INDEX.md +14 -7
- package/dist/templates/monorepo/docs/harness-rules/README.md +37 -393
- package/dist/templates/monorepo/docs/langs/README.md +260 -0
- package/dist/templates/monorepo/docs/superpowers/specs/2026-07-02-report-creator-skill-design.md +176 -0
- package/dist/templates/monorepo/openspec/config.yaml +38 -10
- package/dist/templates/monorepo/package.json +16 -3
- package/dist/templates/monorepo/pnpm-workspace.yaml +10 -2
- package/dist/templates/monorepo/scripts/_catalog-runtime/README.md +30 -0
- package/dist/templates/monorepo/scripts/_catalog-runtime/build-index.determinism.test.ts +81 -0
- package/dist/templates/monorepo/scripts/_catalog-runtime/build-index.ts +214 -0
- package/dist/templates/monorepo/scripts/_catalog-runtime/catalog-index.test.ts +146 -0
- package/dist/templates/monorepo/scripts/_catalog-runtime/catalog-index.ts +120 -0
- package/dist/templates/monorepo/scripts/_catalog-runtime/check-core.ts +280 -0
- package/dist/templates/monorepo/scripts/_catalog-runtime/cli.ts +26 -0
- package/dist/templates/monorepo/scripts/_catalog-runtime/frontmatter.ts +15 -0
- package/dist/templates/monorepo/scripts/_catalog-runtime/glob.ts +86 -0
- package/dist/templates/monorepo/scripts/_catalog-runtime/index.ts +74 -0
- package/dist/templates/monorepo/scripts/_catalog-runtime/parse.ts +159 -0
- package/dist/templates/monorepo/scripts/_catalog-runtime/repo-root.ts +36 -0
- package/dist/templates/monorepo/scripts/_catalog-runtime/types.ts +154 -0
- package/dist/templates/monorepo/scripts/_catalog-runtime/validate.ts +254 -0
- package/dist/templates/monorepo/scripts/backlog/README.md +689 -0
- package/dist/templates/monorepo/scripts/backlog/__fixtures__/stream-budget.jsonl +10 -0
- package/dist/templates/monorepo/scripts/backlog/__fixtures__/stream-crash.jsonl +9 -0
- package/dist/templates/monorepo/scripts/backlog/__fixtures__/stream-max-turns.jsonl +10 -0
- package/dist/templates/monorepo/scripts/backlog/__fixtures__/stream-needs-guidance-prose.jsonl +5 -0
- package/dist/templates/monorepo/scripts/backlog/__fixtures__/stream-needs-guidance.jsonl +10 -0
- package/dist/templates/monorepo/scripts/backlog/__fixtures__/stream-success.jsonl +10 -0
- package/dist/templates/monorepo/scripts/backlog/attempt.test.ts +290 -0
- package/dist/templates/monorepo/scripts/backlog/attempt.ts +181 -0
- package/dist/templates/monorepo/scripts/backlog/close.test.ts +3932 -0
- package/dist/templates/monorepo/scripts/backlog/close.ts +2499 -0
- package/dist/templates/monorepo/scripts/backlog/contract.test.ts +174 -0
- package/dist/templates/monorepo/scripts/backlog/dev.aurora.backlog-dispatch.plist +81 -0
- package/dist/templates/monorepo/scripts/backlog/dispatch.test.ts +3270 -0
- package/dist/templates/monorepo/scripts/backlog/dispatch.ts +2718 -0
- package/dist/templates/monorepo/scripts/backlog/entry.test.ts +1654 -0
- package/dist/templates/monorepo/scripts/backlog/entry.ts +791 -0
- package/dist/templates/monorepo/scripts/backlog/graph-cli.ts +70 -0
- package/dist/templates/monorepo/scripts/backlog/graph.test.ts +800 -0
- package/dist/templates/monorepo/scripts/backlog/graph.ts +386 -0
- package/dist/templates/monorepo/scripts/backlog/guards.test.ts +2259 -0
- package/dist/templates/monorepo/scripts/backlog/guards.ts +1452 -0
- package/dist/templates/monorepo/scripts/backlog/lanes/frontier.settings.json +116 -0
- package/dist/templates/monorepo/scripts/backlog/lanes/local.settings.json +64 -0
- package/dist/templates/monorepo/scripts/backlog/lanes.json +28 -0
- package/dist/templates/monorepo/scripts/backlog/launch.test.ts +3126 -0
- package/dist/templates/monorepo/scripts/backlog/launch.ts +1125 -0
- package/dist/templates/monorepo/scripts/backlog/maintenance.test.ts +2642 -0
- package/dist/templates/monorepo/scripts/backlog/maintenance.ts +1483 -0
- package/dist/templates/monorepo/scripts/backlog/notify.test.ts +60 -0
- package/dist/templates/monorepo/scripts/backlog/notify.ts +47 -0
- package/dist/templates/monorepo/scripts/backlog/parent.test.ts +221 -0
- package/dist/templates/monorepo/scripts/backlog/parent.ts +174 -0
- package/dist/templates/monorepo/scripts/backlog/prompt.test.ts +928 -0
- package/dist/templates/monorepo/scripts/backlog/prompt.ts +622 -0
- package/dist/templates/monorepo/scripts/backlog/render.test.ts +318 -0
- package/dist/templates/monorepo/scripts/backlog/render.ts +351 -0
- package/dist/templates/monorepo/scripts/backlog/reviewer.test.ts +354 -0
- package/dist/templates/monorepo/scripts/backlog/reviewer.ts +308 -0
- package/dist/templates/monorepo/scripts/backlog/slots.test.ts +1179 -0
- package/dist/templates/monorepo/scripts/backlog/slots.ts +752 -0
- package/dist/templates/monorepo/scripts/backlog/task-view.test.ts +918 -0
- package/dist/templates/monorepo/scripts/backlog/task-view.ts +513 -0
- package/dist/templates/monorepo/scripts/backlog/types.ts +286 -0
- package/dist/templates/monorepo/scripts/backlog/watch.test.ts +505 -0
- package/dist/templates/monorepo/scripts/backlog/watch.ts +449 -0
- package/dist/templates/monorepo/scripts/backlog/worker-edit.test.ts +484 -0
- package/dist/templates/monorepo/scripts/backlog/worker-edit.ts +477 -0
- package/dist/templates/monorepo/scripts/business-rules/document.ts +2 -1
- package/dist/templates/monorepo/scripts/business-rules/parse-catalog.ts +2 -1
- package/dist/templates/monorepo/scripts/catalyst/regen-review.test.ts +313 -0
- package/dist/templates/monorepo/scripts/catalyst/regen-review.ts +287 -0
- package/dist/templates/monorepo/scripts/harness-rules/audit.ts +620 -0
- package/dist/templates/monorepo/scripts/harness-rules/check.ts +37 -0
- package/dist/templates/monorepo/scripts/harness-rules/generate-index.ts +215 -0
- package/dist/templates/monorepo/scripts/harness-rules/lint-barrels.test.ts +1125 -0
- package/dist/templates/monorepo/scripts/harness-rules/lint-barrels.ts +1059 -0
- package/dist/templates/monorepo/scripts/harness-rules/types.ts +62 -0
- package/dist/templates/monorepo/scripts/harness-rules/validate-catalog.ts +121 -0
- package/oclif.manifest.json +74 -74
- package/package.json +14 -10
- package/dist/generator/engine/code-writer/export-references.d.ts +0 -10
- package/dist/generator/engine/code-writer/export-references.js +0 -69
- package/dist/templates/backend/application/eslint.config.mjs +0 -40
- package/dist/templates/backend/application/src/@aurora/services/bootstrap.service.ts +0 -20
- package/dist/templates/backend/application/src/i18n/en/iam.json +0 -18
- package/dist/templates/backend/application/src/i18n/es/iam.json +0 -18
- package/dist/templates/backend/application/test/authentication-none-mode.e2e-spec.ts +0 -138
- package/dist/templates/backend/application/test/jest-e2e.json +0 -18
- package/dist/templates/backend/application/test/mocks/mime.mock.ts +0 -10
- package/dist/templates/backend/application/test/mocks/uuid.mock.ts +0 -17
- package/dist/templates/backend/packages/iam/src/@app/iam/account/application/create/iam-create-accounts.handler.ts +0 -26
- package/dist/templates/backend/packages/iam/src/@app/iam/account/infrastructure/sequelize/iam-sequelize-account.model.ts +0 -197
- package/dist/templates/backend/packages/iam/src/@app/iam/account/infrastructure/sequelize/iam-sequelize-account.repository.ts +0 -71
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/infrastructure/sequelize/iam-sequelize-bounded-context.model.ts +0 -94
- package/dist/templates/backend/packages/iam/src/@app/iam/bounded-context/infrastructure/sequelize/iam-sequelize-bounded-context.repository.ts +0 -24
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/infrastructure/sequelize/iam-sequelize-permission.model.ts +0 -93
- package/dist/templates/backend/packages/iam/src/@app/iam/permission/infrastructure/sequelize/iam-sequelize-permission.repository.ts +0 -61
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/infrastructure/sequelize/iam-sequelize-permission-role.model.ts +0 -48
- package/dist/templates/backend/packages/iam/src/@app/iam/permission-role/infrastructure/sequelize/iam-sequelize-permission-role.repository.ts +0 -24
- package/dist/templates/backend/packages/iam/src/@app/iam/role/infrastructure/sequelize/iam-sequelize-role.model.ts +0 -116
- package/dist/templates/backend/packages/iam/src/@app/iam/role/infrastructure/sequelize/iam-sequelize-role.repository.ts +0 -68
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/infrastructure/sequelize/iam-sequelize-role-account.model.ts +0 -48
- package/dist/templates/backend/packages/iam/src/@app/iam/role-account/infrastructure/sequelize/iam-sequelize-role-account.repository.ts +0 -24
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/infrastructure/sequelize/iam-sequelize-tag.model.ts +0 -70
- package/dist/templates/backend/packages/iam/src/@app/iam/tag/infrastructure/sequelize/iam-sequelize-tag.repository.ts +0 -21
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/infrastructure/sequelize/iam-sequelize-tenant.model.ts +0 -121
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant/infrastructure/sequelize/iam-sequelize-tenant.repository.ts +0 -57
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/infrastructure/sequelize/iam-sequelize-tenant-account.model.ts +0 -48
- package/dist/templates/backend/packages/iam/src/@app/iam/tenant-account/infrastructure/sequelize/iam-sequelize-tenant-account.repository.ts +0 -24
- package/dist/templates/backend/packages/iam/src/@app/iam/user/infrastructure/sequelize/iam-sequelize-user.model.ts +0 -144
- package/dist/templates/backend/packages/iam/src/@app/iam/user/infrastructure/sequelize/iam-sequelize-user.repository.ts +0 -21
- package/dist/templates/backend/packages/iam/src/@bridges/iam/index.ts +0 -3
- package/dist/templates/backend/packages/iam/src/@bridges/iam/user/index.ts +0 -1
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/infrastructure/sequelize/o-auth-sequelize-access-token.model.ts +0 -118
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/access-token/infrastructure/sequelize/o-auth-sequelize-access-token.repository.ts +0 -24
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/infrastructure/sequelize/o-auth-sequelize-application.model.ts +0 -101
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application/infrastructure/sequelize/o-auth-sequelize-application.repository.ts +0 -61
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/infrastructure/sequelize/o-auth-sequelize-application-client.model.ts +0 -48
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/application-client/infrastructure/sequelize/o-auth-sequelize-application-client.repository.ts +0 -24
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/infrastructure/sequelize/o-auth-sequelize-authorization-code.model.ts +0 -146
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/authorization-code/infrastructure/sequelize/o-auth-sequelize-authorization-code.repository.ts +0 -44
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/infrastructure/sequelize/o-auth-sequelize-client.model.ts +0 -146
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/client/infrastructure/sequelize/o-auth-sequelize-client.repository.ts +0 -57
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/infrastructure/sequelize/o-auth-sequelize-credential.model.ts +0 -139
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/credential/infrastructure/sequelize/o-auth-sequelize-credential.repository.ts +0 -24
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/infrastructure/sequelize/o-auth-sequelize-refresh-token.model.ts +0 -98
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/refresh-token/infrastructure/sequelize/o-auth-sequelize-refresh-token.repository.ts +0 -24
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/infrastructure/sequelize/o-auth-sequelize-scope.model.ts +0 -84
- package/dist/templates/backend/packages/o-auth/src/@app/o-auth/scope/infrastructure/sequelize/o-auth-sequelize-scope.repository.ts +0 -24
- package/dist/templates/backend/packages/o-auth/src/@bridges/o-auth/client/index.ts +0 -1
- package/dist/templates/codegen/backend/@app/__module_name__/infrastructure/sequelize/__bounded_context_name__-sequelize-__module_name__.model.ts.eta +0 -213
- package/dist/templates/codegen/backend/@app/__module_name__/infrastructure/sequelize/__bounded_context_name__-sequelize-__module_name__.repository.ts.eta +0 -94
- package/dist/templates/codegen/partials/declare-i18n-repository.eta +0 -3
- package/dist/templates/codegen/partials/import-i18n-repository.eta +0 -3
- package/dist/templates/frontend/application/libs/ui/icon/src/index.ts +0 -7
- package/dist/templates/frontend/application/libs/ui/icon/src/lib/hlm-icon.token.ts +0 -20
- package/dist/templates/frontend/application/libs/ui/icon/src/lib/hlm-icon.ts +0 -42
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/get-relation-includes.spec.ts +0 -141
- package/dist/templates/frontend/application/src/@aurora/components/data-table/lib/get-relation-includes.ts +0 -47
- package/dist/templates/frontend/application/src/@aurora/modules/graphql/parse-gql-fields.ts +0 -32
- package/dist/templates/frontend/application/src/app/aurora.types.ts +0 -2671
- package/dist/templates/frontend/application/src/app/domains/admin/bounded-contexts/dashboard/dashboard.routes.ts +0 -8
- package/dist/templates/frontend/application/src/app/domains/admin/bounded-contexts/dashboard/features/dashboard.component.ts +0 -13
- package/dist/templates/frontend/application/src/app/domains/admin/layout/sidebar/nav-projects.ts +0 -106
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/account/data-access/account.detail-config.ts +0 -13
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/account/data-access/account.graphql.ts +0 -291
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/account/data-access/account.list-config.ts +0 -12
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/account/data-access/account.resolvers.ts +0 -121
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/account/data-access/current-account.adapter.ts +0 -34
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/account/features/account-detail.component.ts +0 -165
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/account/features/account-form.component.ts +0 -915
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/account/features/account-list-actions-cell.component.ts +0 -85
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/account/features/account-list.component.ts +0 -260
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/account/index.ts +0 -8
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/bounded-context/data-access/bounded-context.detail-config.ts +0 -18
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/bounded-context/data-access/bounded-context.graphql.ts +0 -158
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/bounded-context/data-access/bounded-context.list-config.ts +0 -12
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/bounded-context/data-access/bounded-context.resolvers.ts +0 -36
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/bounded-context/features/bounded-context-detail.component.ts +0 -157
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/bounded-context/features/bounded-context-form.component.ts +0 -154
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/bounded-context/features/bounded-context-list-actions-cell.component.ts +0 -85
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/bounded-context/features/bounded-context-list.component.ts +0 -247
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/bounded-context/index.ts +0 -7
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/iam-icons.providers.ts +0 -23
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/iam.navigation.ts +0 -42
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/iam.routes.ts +0 -98
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/permission/data-access/permission.detail-config.ts +0 -13
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/permission/data-access/permission.graphql.ts +0 -163
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/permission/data-access/permission.list-config.ts +0 -12
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/permission/data-access/permission.resolvers.ts +0 -72
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/permission/features/permission-form-embed.component.ts +0 -99
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/permission/features/permission-form.component.ts +0 -141
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/permission/features/permission-list-actions-cell.component.ts +0 -85
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/permission/features/permission-list.component.ts +0 -404
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/permission/index.ts +0 -7
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/permission/permission.columns.ts +0 -56
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/permission-role/data-access/permission-role.detail-config.ts +0 -18
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/permission-role/data-access/permission-role.graphql.ts +0 -148
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/permission-role/data-access/permission-role.list-config.ts +0 -12
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/permission-role/data-access/permission-role.resolvers.ts +0 -40
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/permission-role/index.ts +0 -7
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/permission-role/permission-role.columns.ts +0 -38
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/role/data-access/role.detail-config.ts +0 -13
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/role/data-access/role.graphql.ts +0 -207
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/role/data-access/role.list-config.ts +0 -12
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/role/data-access/role.resolvers.ts +0 -68
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/role/features/role-detail.component.ts +0 -312
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/role/features/role-form.component.ts +0 -162
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/role/features/role-list-actions-cell.component.ts +0 -85
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/role/features/role-list.component.ts +0 -248
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/role/index.ts +0 -7
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/role/role.columns.ts +0 -85
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/role-account/data-access/role-account.detail-config.ts +0 -13
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/role-account/data-access/role-account.graphql.ts +0 -158
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/role-account/data-access/role-account.list-config.ts +0 -12
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/shared/validators/unique-email.validator.ts +0 -31
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/shared/validators/unique-username.validator.ts +0 -29
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tag/data-access/tag.detail-config.ts +0 -13
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tag/data-access/tag.graphql.ts +0 -129
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tag/data-access/tag.list-config.ts +0 -14
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tag/data-access/tag.resolvers.ts +0 -36
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tag/features/tag-form.component.ts +0 -93
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tag/features/tag-list-actions-cell.component.ts +0 -85
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tag/features/tag-list.component.ts +0 -321
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tag/index.ts +0 -7
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tenant/data-access/tenant.detail-config.ts +0 -13
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tenant/data-access/tenant.graphql.ts +0 -203
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tenant/data-access/tenant.list-config.ts +0 -12
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tenant/data-access/tenant.resolvers.ts +0 -71
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tenant/features/tenant-form.component.ts +0 -169
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tenant/features/tenant-list-actions-cell.component.ts +0 -85
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tenant/features/tenant-list.component.ts +0 -333
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tenant/index.ts +0 -7
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tenant/tenant.columns.ts +0 -86
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tenant-account/data-access/tenant-account.detail-config.ts +0 -18
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tenant-account/data-access/tenant-account.graphql.ts +0 -158
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tenant-account/data-access/tenant-account.list-config.ts +0 -12
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tenant-account/data-access/tenant-account.resolvers.ts +0 -40
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tenant-account/index.ts +0 -7
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/tenant-account/tenant-account.columns.ts +0 -38
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/user/data-access/user.detail-config.ts +0 -13
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/user/data-access/user.graphql.ts +0 -152
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/user/data-access/user.list-config.ts +0 -12
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/user/data-access/user.resolvers.ts +0 -36
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/user/features/user-detail.component.ts +0 -124
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/user/features/user-form.component.ts +0 -215
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/user/features/user-list-actions-cell.component.ts +0 -85
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/user/features/user-list.component.ts +0 -237
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/user/index.ts +0 -7
- package/dist/templates/frontend/packages/iam/src/app/domains/admin/bounded-contexts/iam/user/user.columns.ts +0 -124
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/access-token/access-token.columns.ts +0 -97
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/access-token/data-access/access-token.detail-config.ts +0 -13
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/access-token/data-access/access-token.graphql.ts +0 -155
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/access-token/data-access/access-token.list-config.ts +0 -12
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/access-token/data-access/access-token.resolvers.ts +0 -40
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/access-token/features/access-token-form.component.ts +0 -152
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/access-token/features/access-token-list-actions-cell.component.ts +0 -85
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/access-token/features/access-token-list.component.ts +0 -331
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/access-token/index.ts +0 -7
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/application/application.columns.ts +0 -73
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/application/data-access/application.detail-config.ts +0 -13
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/application/data-access/application.graphql.ts +0 -146
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/application/data-access/application.list-config.ts +0 -14
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/application/data-access/application.resolvers.ts +0 -36
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/application/features/application-form.component.ts +0 -160
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/application/features/application-list-actions-cell.component.ts +0 -85
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/application/features/application-list.component.ts +0 -326
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/application/index.ts +0 -7
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/application-client/data-access/application-client.graphql.ts +0 -155
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/authorization-code/authorization-code.columns.ts +0 -123
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/authorization-code/data-access/authorization-code.detail-config.ts +0 -18
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/authorization-code/data-access/authorization-code.graphql.ts +0 -146
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/authorization-code/data-access/authorization-code.list-config.ts +0 -19
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/authorization-code/data-access/authorization-code.resolvers.ts +0 -44
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/authorization-code/features/authorization-code-form.component.ts +0 -202
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/authorization-code/features/authorization-code-list-actions-cell.component.ts +0 -86
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/authorization-code/features/authorization-code-list.component.ts +0 -337
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/authorization-code/index.ts +0 -7
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/client/client.columns.ts +0 -140
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/client/data-access/client.detail-config.ts +0 -13
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/client/data-access/client.graphql.ts +0 -141
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/client/data-access/client.list-config.ts +0 -14
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/client/data-access/client.resolvers.ts +0 -97
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/client/features/client-form.component.ts +0 -358
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/client/features/client-list-actions-cell.component.ts +0 -85
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/client/features/client-list.component.ts +0 -359
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/client/index.ts +0 -7
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/o-auth-icons.providers.ts +0 -21
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/o-auth.navigation.ts +0 -52
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/o-auth.routes.ts +0 -44
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/refresh-token/data-access/refresh-token.detail-config.ts +0 -13
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/refresh-token/data-access/refresh-token.graphql.ts +0 -132
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/refresh-token/data-access/refresh-token.list-config.ts +0 -12
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/refresh-token/data-access/refresh-token.resolvers.ts +0 -36
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/refresh-token/features/refresh-token-form.component.ts +0 -131
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/refresh-token/features/refresh-token-list-actions-cell.component.ts +0 -85
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/refresh-token/features/refresh-token-list.component.ts +0 -330
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/refresh-token/index.ts +0 -7
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/refresh-token/refresh-token.columns.ts +0 -59
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/scope/data-access/scope.detail-config.ts +0 -13
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/scope/data-access/scope.graphql.ts +0 -131
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/scope/data-access/scope.list-config.ts +0 -14
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/scope/data-access/scope.resolvers.ts +0 -36
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/scope/features/scope-form.component.ts +0 -119
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/scope/features/scope-list-actions-cell.component.ts +0 -85
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/scope/features/scope-list.component.ts +0 -321
- package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/bounded-contexts/o-auth/scope/index.ts +0 -7
- package/dist/templates/monorepo/.claude/hooks/check-required-plugins.ts +0 -112
- package/dist/templates/monorepo/.claude/hooks/inject-rules-context.ts +0 -267
- package/dist/templates/monorepo/.vscode/settings.json +0 -10
- /package/dist/templates/frontend/packages/iam/src/app/domains/admin/{bounded-contexts → apps}/iam/account/account.columns.ts +0 -0
- /package/dist/templates/frontend/packages/iam/src/app/domains/admin/{bounded-contexts → apps}/iam/bounded-context/bounded-context.columns.ts +0 -0
- /package/dist/templates/frontend/packages/iam/src/app/domains/admin/{bounded-contexts → apps}/iam/iam.types.ts +0 -0
- /package/dist/templates/frontend/packages/iam/src/app/domains/admin/{bounded-contexts → apps}/iam/index.ts +0 -0
- /package/dist/templates/frontend/packages/iam/src/app/domains/admin/{bounded-contexts → apps}/iam/shared/index.ts +0 -0
- /package/dist/templates/frontend/packages/iam/src/app/domains/admin/{bounded-contexts → apps}/iam/tag/tag.columns.ts +0 -0
- /package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/{bounded-contexts → apps}/o-auth/application-client/data-access/application-client.detail-config.ts +0 -0
- /package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/{bounded-contexts → apps}/o-auth/application-client/data-access/application-client.list-config.ts +0 -0
- /package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/{bounded-contexts → apps}/o-auth/index.ts +0 -0
- /package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/{bounded-contexts → apps}/o-auth/o-auth.types.ts +0 -0
- /package/dist/templates/frontend/packages/o-auth/src/app/domains/admin/{bounded-contexts → apps}/o-auth/scope/scope.columns.ts +0 -0
|
@@ -0,0 +1,3932 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TDD spec for `scripts/backlog/close.ts` (tasks 3.11/3.12).
|
|
3
|
+
*
|
|
4
|
+
* Runner: `node --import tsx --test scripts/backlog/close.test.ts`
|
|
5
|
+
*
|
|
6
|
+
* Covers `planClose`'s ordering per `specs/backlog-task-dispatcher/spec.md` — "Dispatch close
|
|
7
|
+
* ordering" (success path), "Failure path preserves work before blocking" (save-before-release,
|
|
8
|
+
* push-failure keeps the slot, the terminal attempt cap); `checkScope`'s per-lane mechanical
|
|
9
|
+
* verification (local: declared-files allowlist + security paths; frontier: forbidden-paths list)
|
|
10
|
+
* per "Retry reuses the same branch and prior context" and
|
|
11
|
+
* `specs/headless-harness-execution/spec.md` — "Security paths never dispatch to the local lane"
|
|
12
|
+
* (the close-time re-check against the real diff); and `executeClose`'s actual save-before-release
|
|
13
|
+
* call ordering through a recording runner, for both a mechanical-step failure mid-plan and a
|
|
14
|
+
* session-level failure that starts the plan directly at `save-work`.
|
|
15
|
+
*/
|
|
16
|
+
import assert from 'node:assert/strict';
|
|
17
|
+
import { execFileSync } from 'node:child_process';
|
|
18
|
+
import fs from 'node:fs';
|
|
19
|
+
import path from 'node:path';
|
|
20
|
+
import { describe, it } from 'node:test';
|
|
21
|
+
import {
|
|
22
|
+
buildAttemptCommitMessage,
|
|
23
|
+
buildExecutionRecordBlock,
|
|
24
|
+
buildPrCreateArgs,
|
|
25
|
+
buildPrLabelArgs,
|
|
26
|
+
buildPrReviewerArgs,
|
|
27
|
+
buildPrTitle,
|
|
28
|
+
buildWipCommitMessage,
|
|
29
|
+
checkBoardIntegrity,
|
|
30
|
+
checkBranchNotMerged,
|
|
31
|
+
checkScope,
|
|
32
|
+
collectAttemptDiff,
|
|
33
|
+
collectChangedFiles,
|
|
34
|
+
collectLeftoverFiles,
|
|
35
|
+
composePrBody,
|
|
36
|
+
EXECUTION_RECORD_HEADING,
|
|
37
|
+
evaluateAcceptanceGate,
|
|
38
|
+
evaluateMechanicalCheckResult,
|
|
39
|
+
executeClose,
|
|
40
|
+
findOpenPrUrl,
|
|
41
|
+
formatBlockComment,
|
|
42
|
+
hasExecutionRecordBlock,
|
|
43
|
+
HUMAN_REVIEW_SECTION_END,
|
|
44
|
+
HUMAN_REVIEW_SECTION_START,
|
|
45
|
+
needsGuidanceQuestion,
|
|
46
|
+
parseMirroredRoots,
|
|
47
|
+
planClose,
|
|
48
|
+
planMechanicalChecks,
|
|
49
|
+
resolveBaseBranch,
|
|
50
|
+
resolveBaseRef,
|
|
51
|
+
runMirrorRegen,
|
|
52
|
+
runScopeCheck,
|
|
53
|
+
sanitizeCommentBody,
|
|
54
|
+
touchesMirroredRoot,
|
|
55
|
+
upsertHumanReviewSection,
|
|
56
|
+
type CloseRunners,
|
|
57
|
+
type ExecutionRecordInput,
|
|
58
|
+
} from './close.js';
|
|
59
|
+
import { HUMAN_REVIEW_PATHS } from './guards.js';
|
|
60
|
+
import { STREAM_OUTCOME } from './render.js';
|
|
61
|
+
import { resolveBranch } from './slots.js';
|
|
62
|
+
import { EXECUTION_PATH, LANE, TASK_STATUS, TIER, type Task } from './types.js';
|
|
63
|
+
|
|
64
|
+
/** This checkout's root — `scripts/backlog/` is two levels down from it. */
|
|
65
|
+
const REPO_ROOT = path.resolve(import.meta.dirname, '..', '..');
|
|
66
|
+
|
|
67
|
+
// ── planClose: success ordering ────────────────────────────────────────────────
|
|
68
|
+
|
|
69
|
+
describe('planClose — success path', () => {
|
|
70
|
+
it('orders the local lane through board-check, scope, format/lint/test, reviewer, ac-check, PR, release, recompute, drain', () => {
|
|
71
|
+
const plan = planClose({ outcome: 'success', lane: LANE.LOCAL });
|
|
72
|
+
assert.deepEqual(
|
|
73
|
+
plan.map((step) => step.kind),
|
|
74
|
+
[
|
|
75
|
+
'board-check',
|
|
76
|
+
'scope-check',
|
|
77
|
+
'format-lint-test',
|
|
78
|
+
'mirror-regen',
|
|
79
|
+
'reviewer',
|
|
80
|
+
'ac-check',
|
|
81
|
+
'open-pr',
|
|
82
|
+
'release-slot',
|
|
83
|
+
'recompute-parent',
|
|
84
|
+
'drain',
|
|
85
|
+
],
|
|
86
|
+
);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('skips the extra reviewer on the frontier lane, going straight to ac-check', () => {
|
|
90
|
+
const plan = planClose({ outcome: 'success', lane: LANE.FRONTIER });
|
|
91
|
+
assert.deepEqual(
|
|
92
|
+
plan.map((step) => step.kind),
|
|
93
|
+
[
|
|
94
|
+
'board-check',
|
|
95
|
+
'scope-check',
|
|
96
|
+
'format-lint-test',
|
|
97
|
+
'mirror-regen',
|
|
98
|
+
'ac-check',
|
|
99
|
+
'open-pr',
|
|
100
|
+
'release-slot',
|
|
101
|
+
'recompute-parent',
|
|
102
|
+
'drain',
|
|
103
|
+
],
|
|
104
|
+
);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// J5: it runs FIRST because every step after it trusts the board — the scope check reads the
|
|
108
|
+
// declared files, the triad the test command, the gate and the reviewer the criteria.
|
|
109
|
+
it('checks the board before any step that trusts what the board says', () => {
|
|
110
|
+
const kinds = planClose({ outcome: 'success', lane: LANE.LOCAL }).map((step) => step.kind);
|
|
111
|
+
assert.equal(kinds[0], 'board-check');
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// The mirror regen sits between the triad and the reviewer, and BOTH edges are load-bearing:
|
|
115
|
+
// - AFTER `format-lint-test`, because that step runs `prettier --write` over the attempt's own
|
|
116
|
+
// source files. A mirror regenerated before it would be a byte-copy of the UNFORMATTED source
|
|
117
|
+
// and would be stale again the moment the triad rewrote it.
|
|
118
|
+
// - BEFORE `reviewer` and `ac-check`, because the reviewer judges the diff that will actually be
|
|
119
|
+
// pushed. Regenerating after it would put files in the PR that no reviewer ever saw.
|
|
120
|
+
// - AFTER `scope-check`, which is what keeps `packages/cli/` forbidden for the WORKER: the scope
|
|
121
|
+
// verdict is taken over the pre-regen file set, so a hand-written mirror edit is still a
|
|
122
|
+
// violation and the dispatcher-owned output arrives after the judging is done.
|
|
123
|
+
for (const lane of [LANE.LOCAL, LANE.FRONTIER] as const) {
|
|
124
|
+
it(`places mirror-regen after the triad and before the reviewer/AC gate on the ${lane} lane`, () => {
|
|
125
|
+
const kinds = planClose({ outcome: 'success', lane }).map((step) => step.kind);
|
|
126
|
+
assert.equal(kinds[kinds.indexOf('format-lint-test') + 1], 'mirror-regen');
|
|
127
|
+
assert.ok(kinds.indexOf('scope-check') < kinds.indexOf('mirror-regen'));
|
|
128
|
+
assert.ok(kinds.indexOf('mirror-regen') < kinds.indexOf('ac-check'));
|
|
129
|
+
assert.ok(kinds.indexOf('mirror-regen') < kinds.indexOf('open-pr'));
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
// ── planClose: failure ordering ────────────────────────────────────────────────
|
|
135
|
+
|
|
136
|
+
describe('planClose — failure path', () => {
|
|
137
|
+
it('a push success returns save-then-block-then-release (never release-then-save)', () => {
|
|
138
|
+
const plan = planClose({
|
|
139
|
+
outcome: 'failure',
|
|
140
|
+
lane: LANE.LOCAL,
|
|
141
|
+
reason: 'scope-check-failed',
|
|
142
|
+
branch: 'task/T-1',
|
|
143
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
144
|
+
attempt: 1,
|
|
145
|
+
pushSucceeded: true,
|
|
146
|
+
});
|
|
147
|
+
assert.deepEqual(
|
|
148
|
+
plan.map((step) => step.kind),
|
|
149
|
+
['save-work', 'block', 'release-slot'],
|
|
150
|
+
);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('a failed push keeps the slot held: save-work then block-keep-slot, no release-slot at all', () => {
|
|
154
|
+
const plan = planClose({
|
|
155
|
+
outcome: 'failure',
|
|
156
|
+
lane: LANE.LOCAL,
|
|
157
|
+
reason: 'scope-check-failed',
|
|
158
|
+
branch: 'task/T-1',
|
|
159
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
160
|
+
attempt: 1,
|
|
161
|
+
pushSucceeded: false,
|
|
162
|
+
});
|
|
163
|
+
assert.deepEqual(
|
|
164
|
+
plan.map((step) => step.kind),
|
|
165
|
+
['save-work', 'block-keep-slot'],
|
|
166
|
+
);
|
|
167
|
+
assert.ok(!plan.some((step) => step.kind === 'release-slot'));
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it('carries the block comment fields: reason, branch, compareUrl, logPath, whatToDo, attempt+1', () => {
|
|
171
|
+
const plan = planClose({
|
|
172
|
+
outcome: 'failure',
|
|
173
|
+
lane: LANE.LOCAL,
|
|
174
|
+
reason: 'scope-check-failed',
|
|
175
|
+
question: '¿el fichero X estaba fuera de alcance a propósito?',
|
|
176
|
+
branch: 'task/T-1',
|
|
177
|
+
compareUrl: 'https://github.com/org/repo/compare/main...task/T-1',
|
|
178
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
179
|
+
attempt: 1,
|
|
180
|
+
pushSucceeded: true,
|
|
181
|
+
});
|
|
182
|
+
const block = plan.find((step) => step.kind === 'block');
|
|
183
|
+
assert.ok(block && block.kind === 'block');
|
|
184
|
+
assert.equal(block.details.reason, 'scope-check-failed');
|
|
185
|
+
assert.equal(block.details.question, '¿el fichero X estaba fuera de alcance a propósito?');
|
|
186
|
+
assert.equal(block.details.branch, 'task/T-1');
|
|
187
|
+
assert.equal(block.details.compareUrl, 'https://github.com/org/repo/compare/main...task/T-1');
|
|
188
|
+
assert.equal(block.details.logPath, '.backlog/.dispatch/T-1/intento-1/run.log');
|
|
189
|
+
assert.equal(block.details.attempt, 2);
|
|
190
|
+
assert.equal(block.details.terminal, false);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('the third failed attempt sets a terminal block flag (no further retry)', () => {
|
|
194
|
+
const plan = planClose({
|
|
195
|
+
outcome: 'failure',
|
|
196
|
+
lane: LANE.LOCAL,
|
|
197
|
+
reason: 'scoped-test-failed',
|
|
198
|
+
branch: 'task/T-1',
|
|
199
|
+
logPath: '.backlog/.dispatch/T-1/intento-3/run.log',
|
|
200
|
+
attempt: 3,
|
|
201
|
+
pushSucceeded: true,
|
|
202
|
+
});
|
|
203
|
+
const block = plan.find((step) => step.kind === 'block');
|
|
204
|
+
assert.ok(block && block.kind === 'block');
|
|
205
|
+
assert.equal(block.details.terminal, true);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it('an attempt below the cap is not terminal', () => {
|
|
209
|
+
const plan = planClose({
|
|
210
|
+
outcome: 'failure',
|
|
211
|
+
lane: LANE.LOCAL,
|
|
212
|
+
reason: 'scoped-test-failed',
|
|
213
|
+
branch: 'task/T-1',
|
|
214
|
+
logPath: '.backlog/.dispatch/T-1/intento-2/run.log',
|
|
215
|
+
attempt: 2,
|
|
216
|
+
pushSucceeded: true,
|
|
217
|
+
});
|
|
218
|
+
const block = plan.find((step) => step.kind === 'block');
|
|
219
|
+
assert.ok(block && block.kind === 'block');
|
|
220
|
+
assert.equal(block.details.terminal, false);
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
// ── checkBranchNotMerged (T-8 point 4) ─────────────────────────────────────────
|
|
225
|
+
|
|
226
|
+
// Measured incident: two late commits of T-6.3 were pushed to a branch whose PR was already
|
|
227
|
+
// merged, so they never reached the parent and were silently lost. `checkBranchNotMerged` is the
|
|
228
|
+
// gate a caller runs BEFORE any push: it reuses the SAME `isPrMerged(branch): boolean` seam
|
|
229
|
+
// `maintenance.ts` already asks GitHub with (`realGh`'s collaborator), rather than adding a second
|
|
230
|
+
// way to ask the same question.
|
|
231
|
+
describe('checkBranchNotMerged', () => {
|
|
232
|
+
it('returns null (proceed as normal) when the branch has no merged PR', () => {
|
|
233
|
+
const asked: string[] = [];
|
|
234
|
+
const plan = checkBranchNotMerged({
|
|
235
|
+
branch: 'task/T-12',
|
|
236
|
+
isPrMerged: (branch) => {
|
|
237
|
+
asked.push(branch);
|
|
238
|
+
return false;
|
|
239
|
+
},
|
|
240
|
+
logPath: '.backlog/.dispatch/T-12/intento-1/run.log',
|
|
241
|
+
attempt: 1,
|
|
242
|
+
});
|
|
243
|
+
assert.equal(plan, null);
|
|
244
|
+
assert.deepEqual(asked, ['task/T-12']);
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
it('returns a block-keep-slot-only plan when the branch already has a merged PR — no save-work, no release', () => {
|
|
248
|
+
const plan = checkBranchNotMerged({
|
|
249
|
+
branch: 'task/T-12',
|
|
250
|
+
isPrMerged: () => true,
|
|
251
|
+
logPath: '.backlog/.dispatch/T-12/intento-2/run.log',
|
|
252
|
+
attempt: 2,
|
|
253
|
+
});
|
|
254
|
+
assert.ok(plan);
|
|
255
|
+
assert.deepEqual(
|
|
256
|
+
plan.map((step) => step.kind),
|
|
257
|
+
['block-keep-slot'],
|
|
258
|
+
);
|
|
259
|
+
const step = plan[0];
|
|
260
|
+
assert.ok(step.kind === 'block-keep-slot');
|
|
261
|
+
assert.equal(step.details.reason, 'branch-already-merged');
|
|
262
|
+
assert.match(step.details.question ?? '', /task\/T-12/);
|
|
263
|
+
assert.equal(step.details.branch, 'task/T-12');
|
|
264
|
+
assert.equal(step.details.logPath, '.backlog/.dispatch/T-12/intento-2/run.log');
|
|
265
|
+
// The attempt that DISCOVERED the merge is 2; a retry (were one ever queued from here) would
|
|
266
|
+
// be attempt 3 — same `attempt + 1` convention `buildBlockDetails` uses everywhere else.
|
|
267
|
+
assert.equal(step.details.attempt, 3);
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
it('marks the block terminal once the discovering attempt already reached the cap', () => {
|
|
271
|
+
const plan = checkBranchNotMerged({
|
|
272
|
+
branch: 'task/T-1',
|
|
273
|
+
isPrMerged: () => true,
|
|
274
|
+
logPath: '.backlog/.dispatch/T-1/intento-3/run.log',
|
|
275
|
+
attempt: 3,
|
|
276
|
+
maxAttempts: 3,
|
|
277
|
+
});
|
|
278
|
+
assert.ok(plan);
|
|
279
|
+
const step = plan[0];
|
|
280
|
+
assert.ok(step.kind === 'block-keep-slot');
|
|
281
|
+
assert.equal(step.details.terminal, true);
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
describe('executeClose — a plan that starts directly at block-keep-slot (branch already merged)', () => {
|
|
286
|
+
it('calls ONLY blockKeepSlot — never saveWork (that would push), never releaseSlot', () => {
|
|
287
|
+
const { calls, runners } = recordingRunners();
|
|
288
|
+
const plan = checkBranchNotMerged({
|
|
289
|
+
branch: 'task/T-12',
|
|
290
|
+
isPrMerged: () => true,
|
|
291
|
+
logPath: '.backlog/.dispatch/T-12/intento-1/run.log',
|
|
292
|
+
attempt: 1,
|
|
293
|
+
});
|
|
294
|
+
assert.ok(plan);
|
|
295
|
+
|
|
296
|
+
const executed = executeClose(plan, runners, {
|
|
297
|
+
lane: LANE.LOCAL,
|
|
298
|
+
attempt: 1,
|
|
299
|
+
branch: 'task/T-12',
|
|
300
|
+
logPath: '.backlog/.dispatch/T-12/intento-1/run.log',
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
assert.deepEqual(executed, ['blockKeepSlot']);
|
|
304
|
+
assert.deepEqual(calls, ['blockKeepSlot']);
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
// `block` (as opposed to `block-keep-slot`) is not produced by `checkBranchNotMerged` today — it
|
|
308
|
+
// always keeps the slot, since nothing was ever pushed to release safely against — but the
|
|
309
|
+
// executor's handling of a plan that starts directly at `block` is exercised here anyway: it used
|
|
310
|
+
// to be dead code (`planClose` always put `save-work` ahead of it), and a plan reaching it
|
|
311
|
+
// directly now must still call the runner instead of silently doing nothing.
|
|
312
|
+
it('a plan starting directly at block (no save-work ahead of it) still calls the block runner', () => {
|
|
313
|
+
const { calls, runners } = recordingRunners();
|
|
314
|
+
const details = {
|
|
315
|
+
reason: 'example',
|
|
316
|
+
branch: 'task/T-12',
|
|
317
|
+
logPath: '.backlog/.dispatch/T-12/intento-1/run.log',
|
|
318
|
+
whatToDo: 'n/a',
|
|
319
|
+
attempt: 2,
|
|
320
|
+
terminal: false,
|
|
321
|
+
};
|
|
322
|
+
const executed = executeClose([{ kind: 'block', details }], runners, {
|
|
323
|
+
lane: LANE.LOCAL,
|
|
324
|
+
attempt: 1,
|
|
325
|
+
branch: 'task/T-12',
|
|
326
|
+
logPath: '.backlog/.dispatch/T-12/intento-1/run.log',
|
|
327
|
+
});
|
|
328
|
+
assert.deepEqual(executed, ['block']);
|
|
329
|
+
assert.deepEqual(calls, ['block']);
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
// ── checkScope ─────────────────────────────────────────────────────────────────
|
|
334
|
+
|
|
335
|
+
describe('checkScope', () => {
|
|
336
|
+
it('local: passes when every changed file was declared and none is a security path', () => {
|
|
337
|
+
const result = checkScope({
|
|
338
|
+
lane: LANE.LOCAL,
|
|
339
|
+
changedFiles: [
|
|
340
|
+
'backend/src/@app/some-bc/x.service.ts',
|
|
341
|
+
'backend/src/@app/some-bc/x.service.spec.ts',
|
|
342
|
+
],
|
|
343
|
+
declaredFiles: [
|
|
344
|
+
'backend/src/@app/some-bc/x.service.ts',
|
|
345
|
+
'backend/src/@app/some-bc/x.service.spec.ts',
|
|
346
|
+
],
|
|
347
|
+
});
|
|
348
|
+
assert.equal(result.ok, true);
|
|
349
|
+
assert.deepEqual(result.violatingFiles, []);
|
|
350
|
+
assert.deepEqual(result.humanReviewFiles, []);
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
it('local: fails on an undeclared changed file', () => {
|
|
354
|
+
const result = checkScope({
|
|
355
|
+
lane: LANE.LOCAL,
|
|
356
|
+
changedFiles: ['backend/src/@app/some-bc/x.service.ts', 'backend/src/@app/some-bc/extra.ts'],
|
|
357
|
+
declaredFiles: ['backend/src/@app/some-bc/x.service.ts'],
|
|
358
|
+
});
|
|
359
|
+
assert.equal(result.ok, false);
|
|
360
|
+
assert.deepEqual(result.violatingFiles, ['backend/src/@app/some-bc/extra.ts']);
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
it('local: fails on a declared-but-security-path file (close-time re-check)', () => {
|
|
364
|
+
const result = checkScope({
|
|
365
|
+
lane: LANE.LOCAL,
|
|
366
|
+
changedFiles: ['backend/src/@app/o-auth/module.ts'],
|
|
367
|
+
declaredFiles: ['backend/src/@app/o-auth/module.ts'],
|
|
368
|
+
});
|
|
369
|
+
assert.equal(result.ok, false);
|
|
370
|
+
assert.deepEqual(result.violatingFiles, ['backend/src/@app/o-auth/module.ts']);
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
// K6: `.backlog/` used to be stripped from the diff before the check, on the theory that a slot
|
|
374
|
+
// never touches its own board copy. Nothing enforced that theory — and a worker that DID write
|
|
375
|
+
// there rewrote the criteria the close judges it against, silently. It is a violation on both
|
|
376
|
+
// lanes now: the dispatcher owns board state, and the wrapper is the only way in.
|
|
377
|
+
for (const lane of [LANE.LOCAL, LANE.FRONTIER]) {
|
|
378
|
+
it(`${lane}: reports a change to the slot own .backlog copy as a violation`, () => {
|
|
379
|
+
const result = checkScope({
|
|
380
|
+
lane,
|
|
381
|
+
changedFiles: ['backend/src/@app/some-bc/x.service.ts', '.backlog/tasks/t-1.md'],
|
|
382
|
+
declaredFiles: ['backend/src/@app/some-bc/x.service.ts'],
|
|
383
|
+
});
|
|
384
|
+
assert.equal(result.ok, false);
|
|
385
|
+
assert.deepEqual(result.violatingFiles, ['.backlog/tasks/t-1.md']);
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
it('frontier: passes when nothing touches the forbidden-paths list, even undeclared files', () => {
|
|
390
|
+
const result = checkScope({
|
|
391
|
+
lane: LANE.FRONTIER,
|
|
392
|
+
changedFiles: ['backend/src/@app/some-bc/module.ts', 'backend/src/@app/some-bc/new-file.ts'],
|
|
393
|
+
declaredFiles: ['backend/src/@app/some-bc/module.ts'],
|
|
394
|
+
});
|
|
395
|
+
assert.equal(result.ok, true);
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
// H5: the local lane checked only the DECLARED-files allowlist plus security paths, so a task
|
|
399
|
+
// that declared `.husky/pre-commit` (or `package.json`, or `scripts/`) passed the close — and the
|
|
400
|
+
// dispatcher's own commits then executed hooks the worker had just written. All of these stay on
|
|
401
|
+
// the HARD list (or a local-lane extra that still catches them) after the split.
|
|
402
|
+
for (const forbidden of [
|
|
403
|
+
'.husky/pre-commit',
|
|
404
|
+
'.claude/settings.json',
|
|
405
|
+
'.claude/hooks/inject-prompt-context.ts',
|
|
406
|
+
// `scripts/` is a LOCAL_FORBIDDEN_PATHS extra: the local lane refuses every `scripts/`
|
|
407
|
+
// subtree, declared or not, whether or not it is refused everywhere else too.
|
|
408
|
+
'scripts/bump-version.ts',
|
|
409
|
+
'package.json',
|
|
410
|
+
'backend/package.json',
|
|
411
|
+
'pnpm-lock.yaml',
|
|
412
|
+
]) {
|
|
413
|
+
it(`local: fails on ${forbidden} even when the task declared it`, () => {
|
|
414
|
+
const result = checkScope({
|
|
415
|
+
lane: LANE.LOCAL,
|
|
416
|
+
changedFiles: [forbidden],
|
|
417
|
+
declaredFiles: [forbidden],
|
|
418
|
+
});
|
|
419
|
+
assert.equal(result.ok, false);
|
|
420
|
+
assert.deepEqual(result.violatingFiles, [forbidden]);
|
|
421
|
+
assert.deepEqual(result.humanReviewFiles, []);
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
// Spec scenario "A local-lane refusal that predates the split still applies": the local lane's
|
|
426
|
+
// three EXTRAS (`.claude/`, `scripts/`, `.git/`) refuse on their own, declared or not, and
|
|
427
|
+
// regardless of the split. `scripts/bump-version.ts` above covers `scripts/`; these are the
|
|
428
|
+
// other two, each with a path that ONLY the broad extra catches — `.claude/skills/…` is not under
|
|
429
|
+
// any hard `.claude/` entry, and `.git/` appears on no other list at all.
|
|
430
|
+
//
|
|
431
|
+
// The `.git/` cases DOCUMENT INTENT and cover no reachable behaviour (design.md gap (a), and the
|
|
432
|
+
// spec scenario "The git-directory refusal is unreachable through the real diff sources"): they
|
|
433
|
+
// feed `checkScope` an input `collectChangedFiles` cannot produce, because neither
|
|
434
|
+
// `git diff --name-only` nor `git status --porcelain` ever reports a path inside that directory.
|
|
435
|
+
// They pin the predicate so a future refactor cannot drop the entry silently; they are NOT evidence
|
|
436
|
+
// that a write there is caught. What bounds that is the lane deny rules and `prepareSlot`'s hard
|
|
437
|
+
// reset.
|
|
438
|
+
for (const declared of [true, false]) {
|
|
439
|
+
for (const forbidden of [
|
|
440
|
+
'.claude/skills/catalyst-backlog/SKILL.md',
|
|
441
|
+
'.claude/agents/jd-judge-a.md',
|
|
442
|
+
'.git/config',
|
|
443
|
+
'.git/hooks/pre-commit',
|
|
444
|
+
]) {
|
|
445
|
+
it(`local: fails on ${forbidden} (${declared ? 'declared' : 'undeclared'}) — a local-lane extra`, () => {
|
|
446
|
+
const result = checkScope({
|
|
447
|
+
lane: LANE.LOCAL,
|
|
448
|
+
changedFiles: [forbidden],
|
|
449
|
+
declaredFiles: declared ? [forbidden] : [],
|
|
450
|
+
});
|
|
451
|
+
assert.equal(result.ok, false);
|
|
452
|
+
assert.deepEqual(result.violatingFiles, [forbidden]);
|
|
453
|
+
assert.deepEqual(result.humanReviewFiles, []);
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// The same two paths on the FRONTIER lane, which has no extras: neither list reaches them, so the
|
|
459
|
+
// attempt passes unmarked. This is what makes the tests above a LANE rule rather than a global one.
|
|
460
|
+
//
|
|
461
|
+
// GAP (b), PINNED AND NOT ENDORSED (design.md, "The gaps, recorded by name rather than closed").
|
|
462
|
+
// `.claude/skills/catalyst-backlog/SKILL.md` passing GREEN and UNMARKED on the frontier lane is a
|
|
463
|
+
// frontier attempt rewriting its own skills with nothing said about it on the pull request, and
|
|
464
|
+
// mechanism (2) then restores that rewrite into the slot for the retry's executor to boot on. That
|
|
465
|
+
// is present behaviour, recorded because the round-2 measurement made it worse than "a reviewer is
|
|
466
|
+
// not told" — it is NOT a settled decision that the instruction corners of `.claude/` may stay off
|
|
467
|
+
// both lists. Closing the gap (a soft, or hard, entry for `skills/`, `rules/`, `agents/`,
|
|
468
|
+
// `commands/`) will turn this assertion red, and that will be the fix landing, not a regression.
|
|
469
|
+
// The `.git/config` half is gap (a), pinned the same way (see the note above).
|
|
470
|
+
for (const allowed of ['.claude/skills/catalyst-backlog/SKILL.md', '.git/config']) {
|
|
471
|
+
it(`frontier: passes ${allowed} — the extras are the local lane's alone`, () => {
|
|
472
|
+
const result = checkScope({
|
|
473
|
+
lane: LANE.FRONTIER,
|
|
474
|
+
changedFiles: [allowed],
|
|
475
|
+
declaredFiles: [],
|
|
476
|
+
});
|
|
477
|
+
assert.equal(result.ok, true);
|
|
478
|
+
assert.deepEqual(result.humanReviewFiles, []);
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
// T-31, design.md decision 6: `packages/cli/` is soft and no local-lane extra covers it, so a
|
|
483
|
+
// DECLARED attempt is now admissible — a real behavioural change on the local lane, stated here
|
|
484
|
+
// rather than discovered later — and marks its pull request exactly like a frontier one.
|
|
485
|
+
it('local: admits a declared packages/cli/ file, marking it for human review', () => {
|
|
486
|
+
const file = 'packages/cli/src/generator.ts';
|
|
487
|
+
const result = checkScope({ lane: LANE.LOCAL, changedFiles: [file], declaredFiles: [file] });
|
|
488
|
+
assert.equal(result.ok, true);
|
|
489
|
+
assert.deepEqual(result.violatingFiles, []);
|
|
490
|
+
assert.deepEqual(result.humanReviewFiles, [file]);
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
// An UNDECLARED soft-list file still fails as undeclared — declaring it is necessary, and it was
|
|
494
|
+
// never sufficient for the hard list either (design.md decision 6, "a soft path is NOT
|
|
495
|
+
// automatically admissible on the local lane").
|
|
496
|
+
it('local: fails on an undeclared packages/cli/ file, same as any other undeclared file', () => {
|
|
497
|
+
const file = 'packages/cli/src/generator.ts';
|
|
498
|
+
const result = checkScope({ lane: LANE.LOCAL, changedFiles: [file], declaredFiles: [] });
|
|
499
|
+
assert.equal(result.ok, false);
|
|
500
|
+
assert.deepEqual(result.violatingFiles, [file]);
|
|
501
|
+
});
|
|
502
|
+
|
|
503
|
+
it('local: still passes ordinary declared product code', () => {
|
|
504
|
+
const result = checkScope({
|
|
505
|
+
lane: LANE.LOCAL,
|
|
506
|
+
changedFiles: ['backend/src/@app/some-bc/x.service.ts'],
|
|
507
|
+
declaredFiles: ['backend/src/@app/some-bc/x.service.ts'],
|
|
508
|
+
});
|
|
509
|
+
assert.equal(result.ok, true);
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
// The generator package is SOFT because nothing reads it as instructions and the close never
|
|
513
|
+
// invokes it, so the frontier lane admits it, marking the pull request instead of failing.
|
|
514
|
+
//
|
|
515
|
+
// SOFT is not INERT, and design.md decision 1 records the two measured mechanisms that make it
|
|
516
|
+
// not: (1) admitting the diff here is exactly what unlocks the triad, whose last step spawns the
|
|
517
|
+
// task's declared `Test command:` with `cwd` = the slot, and `ALLOWED_TEST_SCRIPT` admits
|
|
518
|
+
// `cli:test` — a runner over the SLOT's own copy of the generator; (2) a failed attempt's
|
|
519
|
+
// tree is pushed to `task/<id>` by `saveWipAndPush` and restored by the retry's
|
|
520
|
+
// `checkout -B task/<id> origin/task/<id>`, a path that opens no pull request and applies no mark.
|
|
521
|
+
for (const forbidden of [
|
|
522
|
+
'packages/cli/src/generator/emit.ts',
|
|
523
|
+
'packages/cli/src/generator/schema.ts',
|
|
524
|
+
'packages/cli/src/templates/codegen/module.aurora.eta',
|
|
525
|
+
'packages/cli/bin/run.js',
|
|
526
|
+
]) {
|
|
527
|
+
it(`frontier: admits ${forbidden} — soft list, marks the PR for human review`, () => {
|
|
528
|
+
const result = checkScope({
|
|
529
|
+
lane: LANE.FRONTIER,
|
|
530
|
+
changedFiles: [forbidden],
|
|
531
|
+
declaredFiles: [],
|
|
532
|
+
});
|
|
533
|
+
assert.equal(result.ok, true);
|
|
534
|
+
assert.deepEqual(result.violatingFiles, []);
|
|
535
|
+
assert.deepEqual(result.humanReviewFiles, [forbidden]);
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
// `scripts/backlog/` is supervised-only (guard 1e): a change to the dispatcher's own machinery is
|
|
540
|
+
// an architectural decision, and it ships to every scaffolded application, where no solution task
|
|
541
|
+
// has any business touching it — so the close refuses it on BOTH lanes, declared or not, exactly
|
|
542
|
+
// like the two core packages.
|
|
543
|
+
for (const lane of [LANE.LOCAL, LANE.FRONTIER]) {
|
|
544
|
+
for (const forbidden of [
|
|
545
|
+
'scripts/backlog/close.ts',
|
|
546
|
+
'scripts/backlog/guards.ts',
|
|
547
|
+
'scripts/backlog/worker-edit.ts',
|
|
548
|
+
'scripts/backlog/lanes/local.settings.json',
|
|
549
|
+
]) {
|
|
550
|
+
it(`${lane}: fails on ${forbidden} — supervised-only, never soft`, () => {
|
|
551
|
+
const result = checkScope({
|
|
552
|
+
lane,
|
|
553
|
+
changedFiles: [forbidden],
|
|
554
|
+
declaredFiles: [forbidden],
|
|
555
|
+
});
|
|
556
|
+
assert.equal(result.ok, false);
|
|
557
|
+
assert.deepEqual(result.violatingFiles, [forbidden]);
|
|
558
|
+
assert.deepEqual(result.humanReviewFiles, []);
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
// N1: the project `PostToolUse` hook executes `$CLAUDE_PROJECT_DIR/.claude/hooks/format-with-prettier.ts`
|
|
564
|
+
// on every Write/Edit, and `CLAUDE_PROJECT_DIR` is the SLOT — so a hook the worker writes there is
|
|
565
|
+
// code the harness runs as the worker on its very next edit. `.claude/scripts/` runs the same way
|
|
566
|
+
// from `SessionStart`. Both stay refused on BOTH lanes, declared or not — like `CLAUDE.md` below,
|
|
567
|
+
// which is HARD on both lanes as `SLOT_EXECUTED_BASENAMES` (design.md decision 7).
|
|
568
|
+
for (const lane of [LANE.LOCAL, LANE.FRONTIER]) {
|
|
569
|
+
for (const forbidden of [
|
|
570
|
+
'.claude/hooks/format-with-prettier.ts',
|
|
571
|
+
'.claude/hooks/x.ts',
|
|
572
|
+
'.claude/scripts/generate-skills-index.ts',
|
|
573
|
+
// P2 (round 9): `.claude/settings.json` is a substring pattern and `settings.local.json` is
|
|
574
|
+
// NOT a superstring of it, so the local overlay — same hooks, same permissions, and the file
|
|
575
|
+
// Claude Code actually reads last — went unchecked on both lanes.
|
|
576
|
+
'.claude/settings.local.json',
|
|
577
|
+
]) {
|
|
578
|
+
it(`${lane}: fails on ${forbidden} — it governs or runs the harness itself`, () => {
|
|
579
|
+
const result = checkScope({ lane, changedFiles: [forbidden], declaredFiles: [forbidden] });
|
|
580
|
+
assert.equal(result.ok, false);
|
|
581
|
+
assert.deepEqual(result.violatingFiles, [forbidden]);
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
// T-31 review: the close's own `mirrorRegen` step runs `node scripts/packager/publish.mjs` with
|
|
587
|
+
// `cwd` = the slot, and that script globs `monorepo.mjs`, `backend/*.mjs` and `frontend/*.mjs`
|
|
588
|
+
// inside its OWN directory (derived from `import.meta.url`, i.e. the slot's copy) and spawns each
|
|
589
|
+
// match with the dispatcher's inherited environment. It executes in the slot, so it is HARD on
|
|
590
|
+
// both lanes — a different cause from `scripts/backlog/`'s own supervised-only refusal.
|
|
591
|
+
for (const lane of [LANE.LOCAL, LANE.FRONTIER]) {
|
|
592
|
+
for (const forbidden of [
|
|
593
|
+
'scripts/packager/publish.mjs',
|
|
594
|
+
'scripts/packager/monorepo.mjs',
|
|
595
|
+
'scripts/packager/backend/anything.mjs',
|
|
596
|
+
'scripts/packager/lib/helpers.mjs',
|
|
597
|
+
// Same mechanism, one step removed: the triad runs `pnpm hr:lint-barrels` in the slot and the
|
|
598
|
+
// root package.json maps that script to `tsx scripts/harness-rules/lint-barrels.ts`.
|
|
599
|
+
'scripts/harness-rules/lint-barrels.ts',
|
|
600
|
+
]) {
|
|
601
|
+
it(`${lane}: fails on ${forbidden} — the close spawns it from the slot`, () => {
|
|
602
|
+
const result = checkScope({ lane, changedFiles: [forbidden], declaredFiles: [forbidden] });
|
|
603
|
+
assert.equal(result.ok, false);
|
|
604
|
+
assert.deepEqual(result.violatingFiles, [forbidden]);
|
|
605
|
+
assert.deepEqual(result.humanReviewFiles, []);
|
|
606
|
+
});
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
// T-31 round 2: the instruction file is HARD on BOTH lanes, and the two mechanisms behind that
|
|
611
|
+
// were measured, not reasoned about.
|
|
612
|
+
//
|
|
613
|
+
// - LOCAL: its close runs an AI reviewer (`planClose`'s `reviewer` step) with `cwd` = the slot,
|
|
614
|
+
// and `buildReviewerCommand` (`reviewer.ts`) passes no `--bare`, the only flag that
|
|
615
|
+
// disables instruction-file auto-discovery. The executor would be authoring its own
|
|
616
|
+
// examiner's brief.
|
|
617
|
+
// - BOTH lanes: the failure plan is `save-work` then `block`, with NO `open-pr` step — so a
|
|
618
|
+
// failed attempt applies no mark at all, while `saveWipAndPush` pushes the whole slot tree to
|
|
619
|
+
// `task/<id>` and the retry's `checkout -B task/<id> origin/task/<id>` restores it. Attempt 2
|
|
620
|
+
// boots reading what attempt 1 wrote. Marking a file in a channel that only exists on the
|
|
621
|
+
// green path is not a control.
|
|
622
|
+
//
|
|
623
|
+
// Declared or not, and whatever the casing (`matchesBasename` lowercases both sides).
|
|
624
|
+
for (const lane of [LANE.LOCAL, LANE.FRONTIER]) {
|
|
625
|
+
for (const forbidden of ['CLAUDE.md', 'backend/CLAUDE.md', 'frontend/claude.md']) {
|
|
626
|
+
it(`${lane}: fails on ${forbidden} even when declared — an instruction file the next attempt reads`, () => {
|
|
627
|
+
const result = checkScope({
|
|
628
|
+
lane,
|
|
629
|
+
changedFiles: [forbidden],
|
|
630
|
+
declaredFiles: [forbidden],
|
|
631
|
+
});
|
|
632
|
+
assert.equal(result.ok, false);
|
|
633
|
+
assert.deepEqual(result.violatingFiles, [forbidden]);
|
|
634
|
+
assert.deepEqual(result.humanReviewFiles, []);
|
|
635
|
+
});
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
// `CLAUDE.md` is matched by BASENAME, not as a substring: a substring pattern would also swallow
|
|
640
|
+
// an unrelated file whose name merely contains it, which is ordinary work.
|
|
641
|
+
it('frontier: still passes a file whose name only contains the CLAUDE.md pattern, with no mark', () => {
|
|
642
|
+
const result = checkScope({
|
|
643
|
+
lane: LANE.FRONTIER,
|
|
644
|
+
changedFiles: ['docs/claude.mdx'],
|
|
645
|
+
declaredFiles: ['docs/claude.mdx'],
|
|
646
|
+
});
|
|
647
|
+
assert.equal(result.ok, true);
|
|
648
|
+
assert.deepEqual(result.humanReviewFiles, []);
|
|
649
|
+
});
|
|
650
|
+
|
|
651
|
+
it('frontier: admits a soft-list file with no declared-files allowlist to pass at all', () => {
|
|
652
|
+
const result = checkScope({
|
|
653
|
+
lane: LANE.FRONTIER,
|
|
654
|
+
changedFiles: ['packages/cli/src/generator.ts'],
|
|
655
|
+
declaredFiles: [],
|
|
656
|
+
});
|
|
657
|
+
assert.equal(result.ok, true);
|
|
658
|
+
assert.deepEqual(result.humanReviewFiles, ['packages/cli/src/generator.ts']);
|
|
659
|
+
});
|
|
660
|
+
|
|
661
|
+
// A diff mixing both lists still fails, naming the hard-list file, and the soft-list file never
|
|
662
|
+
// softens the verdict (spec: "A diff mixing both lists still fails").
|
|
663
|
+
it('frontier: a mix of hard and soft files still fails, naming the hard file only', () => {
|
|
664
|
+
const result = checkScope({
|
|
665
|
+
lane: LANE.FRONTIER,
|
|
666
|
+
changedFiles: ['package.json', 'packages/cli/src/generator.ts'],
|
|
667
|
+
declaredFiles: [],
|
|
668
|
+
});
|
|
669
|
+
assert.equal(result.ok, false);
|
|
670
|
+
assert.deepEqual(result.violatingFiles, ['package.json']);
|
|
671
|
+
assert.deepEqual(result.humanReviewFiles, []);
|
|
672
|
+
});
|
|
673
|
+
|
|
674
|
+
// M3: the dependency graph and the installed tree are the ENVIRONMENT the close itself runs in —
|
|
675
|
+
// its Prettier, its barrels lint, its `pnpm test`. A worker that rewrites a `package.json`
|
|
676
|
+
// script or the lockfile changes what the dispatcher executes moments later, so this is a
|
|
677
|
+
// both-lanes rule; it used to be local-only, leaving the frontier lane (the wider grant) able to
|
|
678
|
+
// do it. The nested case is the one a prefix match would miss: patterns are matched as
|
|
679
|
+
// SUBSTRINGS, which is what makes `backend/package.json` a hit.
|
|
680
|
+
for (const forbidden of [
|
|
681
|
+
'package.json',
|
|
682
|
+
'backend/package.json',
|
|
683
|
+
'packages/core-front/package.json',
|
|
684
|
+
'pnpm-lock.yaml',
|
|
685
|
+
'node_modules/.bin/prettier',
|
|
686
|
+
'backend/node_modules/tsx/package.json',
|
|
687
|
+
]) {
|
|
688
|
+
it(`frontier: fails on ${forbidden} — the close runs in the environment those files define`, () => {
|
|
689
|
+
const result = checkScope({
|
|
690
|
+
lane: LANE.FRONTIER,
|
|
691
|
+
changedFiles: [forbidden],
|
|
692
|
+
declaredFiles: [forbidden],
|
|
693
|
+
});
|
|
694
|
+
assert.equal(result.ok, false);
|
|
695
|
+
assert.deepEqual(result.violatingFiles, [forbidden]);
|
|
696
|
+
});
|
|
697
|
+
}
|
|
698
|
+
});
|
|
699
|
+
|
|
700
|
+
// ── executeClose: save-before-release ordering via a recording runner ────────
|
|
701
|
+
|
|
702
|
+
function recordingRunners(overrides: Partial<CloseRunners> = {}): {
|
|
703
|
+
calls: string[];
|
|
704
|
+
runners: CloseRunners;
|
|
705
|
+
} {
|
|
706
|
+
const calls: string[] = [];
|
|
707
|
+
const runners: CloseRunners = {
|
|
708
|
+
boardCheck: () => {
|
|
709
|
+
calls.push('boardCheck');
|
|
710
|
+
return { ok: true };
|
|
711
|
+
},
|
|
712
|
+
scopeCheck: () => {
|
|
713
|
+
calls.push('scopeCheck');
|
|
714
|
+
return { ok: true, humanReviewFiles: [] };
|
|
715
|
+
},
|
|
716
|
+
formatLintTest: () => {
|
|
717
|
+
calls.push('formatLintTest');
|
|
718
|
+
return { ok: true };
|
|
719
|
+
},
|
|
720
|
+
mirrorRegen: () => {
|
|
721
|
+
calls.push('mirrorRegen');
|
|
722
|
+
return { ok: true };
|
|
723
|
+
},
|
|
724
|
+
reviewer: () => {
|
|
725
|
+
calls.push('reviewer');
|
|
726
|
+
return { ok: true };
|
|
727
|
+
},
|
|
728
|
+
acCheck: () => {
|
|
729
|
+
calls.push('acCheck');
|
|
730
|
+
return { ok: true };
|
|
731
|
+
},
|
|
732
|
+
openPr: () => {
|
|
733
|
+
calls.push('openPr');
|
|
734
|
+
return { ok: true };
|
|
735
|
+
},
|
|
736
|
+
releaseSlot: () => {
|
|
737
|
+
calls.push('releaseSlot');
|
|
738
|
+
},
|
|
739
|
+
recomputeParent: () => {
|
|
740
|
+
calls.push('recomputeParent');
|
|
741
|
+
},
|
|
742
|
+
drain: () => {
|
|
743
|
+
calls.push('drain');
|
|
744
|
+
},
|
|
745
|
+
saveWork: () => {
|
|
746
|
+
calls.push('saveWork');
|
|
747
|
+
return { pushSucceeded: true };
|
|
748
|
+
},
|
|
749
|
+
leftoverFiles: () => {
|
|
750
|
+
calls.push('leftoverFiles');
|
|
751
|
+
return { forbiddenFiles: [], humanReviewFiles: [] };
|
|
752
|
+
},
|
|
753
|
+
block: () => {
|
|
754
|
+
calls.push('block');
|
|
755
|
+
},
|
|
756
|
+
blockKeepSlot: () => {
|
|
757
|
+
calls.push('blockKeepSlot');
|
|
758
|
+
},
|
|
759
|
+
...overrides,
|
|
760
|
+
};
|
|
761
|
+
return { calls, runners };
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
describe('executeClose', () => {
|
|
765
|
+
it('runs the full happy path in order when every mechanical step passes', () => {
|
|
766
|
+
const { calls, runners } = recordingRunners();
|
|
767
|
+
const plan = planClose({ outcome: 'success', lane: LANE.LOCAL });
|
|
768
|
+
|
|
769
|
+
executeClose(plan, runners, {
|
|
770
|
+
lane: LANE.LOCAL,
|
|
771
|
+
attempt: 1,
|
|
772
|
+
branch: 'task/T-1',
|
|
773
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
assert.deepEqual(calls, [
|
|
777
|
+
'boardCheck',
|
|
778
|
+
'scopeCheck',
|
|
779
|
+
'formatLintTest',
|
|
780
|
+
'mirrorRegen',
|
|
781
|
+
'reviewer',
|
|
782
|
+
'acCheck',
|
|
783
|
+
'openPr',
|
|
784
|
+
'releaseSlot',
|
|
785
|
+
'recomputeParent',
|
|
786
|
+
'drain',
|
|
787
|
+
]);
|
|
788
|
+
});
|
|
789
|
+
|
|
790
|
+
// J5: a tampered board fails the attempt like any other mechanical step — work saved, task
|
|
791
|
+
// blocked — and nothing that reads the board afterwards ever runs.
|
|
792
|
+
it('stops the whole close at board-check and saves before blocking', () => {
|
|
793
|
+
const { calls, runners } = recordingRunners({
|
|
794
|
+
boardCheck: () => {
|
|
795
|
+
calls.push('boardCheck');
|
|
796
|
+
return { ok: false, reason: 'ac-tampered', question: 'los criterios cambiaron' };
|
|
797
|
+
},
|
|
798
|
+
});
|
|
799
|
+
|
|
800
|
+
const executed = executeClose(planClose({ outcome: 'success', lane: LANE.LOCAL }), runners, {
|
|
801
|
+
lane: LANE.LOCAL,
|
|
802
|
+
attempt: 1,
|
|
803
|
+
branch: 'task/T-1',
|
|
804
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
805
|
+
});
|
|
806
|
+
|
|
807
|
+
assert.deepEqual(executed, ['boardCheck', 'saveWork', 'block', 'releaseSlot']);
|
|
808
|
+
assert.ok(!calls.includes('scopeCheck'));
|
|
809
|
+
assert.ok(!calls.includes('openPr'));
|
|
810
|
+
});
|
|
811
|
+
|
|
812
|
+
// T-31 round 4: `board-check` is the one mechanical step that diverts BEFORE `scope-check`, so on
|
|
813
|
+
// that failure nothing has classified the tree either — and the promise ("EVERY close that fails
|
|
814
|
+
// records the leftover files") is unconditional in three documents. The probe is therefore keyed on
|
|
815
|
+
// "has the scope check reported yet", not on "did the plan start at save-work".
|
|
816
|
+
it('probes the leftover files when board-check diverts, since no scope check ran there either', () => {
|
|
817
|
+
let seen: readonly string[] | undefined;
|
|
818
|
+
let seenForbidden: readonly string[] | undefined;
|
|
819
|
+
const { calls, runners } = recordingRunners({
|
|
820
|
+
boardCheck: () => {
|
|
821
|
+
calls.push('boardCheck');
|
|
822
|
+
return { ok: false, reason: 'ac-tampered' };
|
|
823
|
+
},
|
|
824
|
+
leftoverFiles: () => {
|
|
825
|
+
calls.push('leftoverFiles');
|
|
826
|
+
return {
|
|
827
|
+
forbiddenFiles: ['.claude/settings.json'],
|
|
828
|
+
humanReviewFiles: ['packages/cli/src/index.ts'],
|
|
829
|
+
};
|
|
830
|
+
},
|
|
831
|
+
block: (details) => {
|
|
832
|
+
calls.push('block');
|
|
833
|
+
seen = details.humanReviewFiles;
|
|
834
|
+
seenForbidden = details.forbiddenFiles;
|
|
835
|
+
},
|
|
836
|
+
});
|
|
837
|
+
|
|
838
|
+
executeClose(planClose({ outcome: 'success', lane: LANE.FRONTIER }), runners, {
|
|
839
|
+
lane: LANE.FRONTIER,
|
|
840
|
+
attempt: 1,
|
|
841
|
+
branch: 'task/T-1',
|
|
842
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
843
|
+
});
|
|
844
|
+
|
|
845
|
+
assert.deepEqual(seen, ['packages/cli/src/index.ts']);
|
|
846
|
+
assert.deepEqual(seenForbidden, ['.claude/settings.json']);
|
|
847
|
+
assert.ok(
|
|
848
|
+
calls.indexOf('leftoverFiles') < calls.indexOf('saveWork'),
|
|
849
|
+
'the probe must read the diff BEFORE the WIP commit rewrites the tree',
|
|
850
|
+
);
|
|
851
|
+
});
|
|
852
|
+
|
|
853
|
+
// T-31 round 2: the soft-list verdict has to reach the FAILURE path too, not only `openPr`. The
|
|
854
|
+
// scope check runs before every other step that can fail, so by the time a later step diverts the
|
|
855
|
+
// close, `executeClose` already knows which soft-list files were admitted — and the block comment
|
|
856
|
+
// is the only channel left, since the failure plan opens no pull request to mark.
|
|
857
|
+
it('carries the scope check soft-list files into the block details when a LATER step fails', () => {
|
|
858
|
+
let seen: readonly string[] | undefined;
|
|
859
|
+
const { calls, runners } = recordingRunners({
|
|
860
|
+
scopeCheck: () => {
|
|
861
|
+
calls.push('scopeCheck');
|
|
862
|
+
return { ok: true, humanReviewFiles: ['scripts/backlog/close.ts'] };
|
|
863
|
+
},
|
|
864
|
+
acCheck: () => {
|
|
865
|
+
calls.push('acCheck');
|
|
866
|
+
return { ok: false, reason: 'ac-not-met' };
|
|
867
|
+
},
|
|
868
|
+
block: (details) => {
|
|
869
|
+
calls.push('block');
|
|
870
|
+
seen = details.humanReviewFiles;
|
|
871
|
+
},
|
|
872
|
+
});
|
|
873
|
+
|
|
874
|
+
executeClose(planClose({ outcome: 'success', lane: LANE.FRONTIER }), runners, {
|
|
875
|
+
lane: LANE.FRONTIER,
|
|
876
|
+
attempt: 1,
|
|
877
|
+
branch: 'task/T-1',
|
|
878
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
879
|
+
});
|
|
880
|
+
|
|
881
|
+
assert.deepEqual(seen, ['scripts/backlog/close.ts']);
|
|
882
|
+
});
|
|
883
|
+
|
|
884
|
+
it('leaves the block details soft-list empty when the scope check reported none', () => {
|
|
885
|
+
let seen: readonly string[] | undefined;
|
|
886
|
+
const { calls, runners } = recordingRunners({
|
|
887
|
+
acCheck: () => {
|
|
888
|
+
calls.push('acCheck');
|
|
889
|
+
return { ok: false, reason: 'ac-not-met' };
|
|
890
|
+
},
|
|
891
|
+
block: (details) => {
|
|
892
|
+
calls.push('block');
|
|
893
|
+
seen = details.humanReviewFiles;
|
|
894
|
+
},
|
|
895
|
+
});
|
|
896
|
+
|
|
897
|
+
executeClose(planClose({ outcome: 'success', lane: LANE.FRONTIER }), runners, {
|
|
898
|
+
lane: LANE.FRONTIER,
|
|
899
|
+
attempt: 1,
|
|
900
|
+
branch: 'task/T-1',
|
|
901
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
902
|
+
});
|
|
903
|
+
|
|
904
|
+
assert.deepEqual(seen, []);
|
|
905
|
+
});
|
|
906
|
+
|
|
907
|
+
it('saves work BEFORE releasing when a mechanical step fails mid-plan (never release-then-save)', () => {
|
|
908
|
+
const { calls, runners } = recordingRunners({
|
|
909
|
+
scopeCheck: () => {
|
|
910
|
+
calls.push('scopeCheck');
|
|
911
|
+
return { ok: false, reason: 'scope-check-failed', humanReviewFiles: [] };
|
|
912
|
+
},
|
|
913
|
+
});
|
|
914
|
+
const plan = planClose({ outcome: 'success', lane: LANE.LOCAL });
|
|
915
|
+
|
|
916
|
+
executeClose(plan, runners, {
|
|
917
|
+
lane: LANE.LOCAL,
|
|
918
|
+
attempt: 1,
|
|
919
|
+
branch: 'task/T-1',
|
|
920
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
921
|
+
});
|
|
922
|
+
|
|
923
|
+
assert.deepEqual(calls, ['boardCheck', 'scopeCheck', 'saveWork', 'block', 'releaseSlot']);
|
|
924
|
+
});
|
|
925
|
+
|
|
926
|
+
it('keeps the slot held when the WIP push fails (no releaseSlot call at all)', () => {
|
|
927
|
+
const { calls, runners } = recordingRunners({
|
|
928
|
+
formatLintTest: () => {
|
|
929
|
+
calls.push('formatLintTest');
|
|
930
|
+
return { ok: false, reason: 'lint-failed' };
|
|
931
|
+
},
|
|
932
|
+
saveWork: () => {
|
|
933
|
+
calls.push('saveWork');
|
|
934
|
+
return { pushSucceeded: false };
|
|
935
|
+
},
|
|
936
|
+
});
|
|
937
|
+
const plan = planClose({ outcome: 'success', lane: LANE.LOCAL });
|
|
938
|
+
|
|
939
|
+
executeClose(plan, runners, {
|
|
940
|
+
lane: LANE.LOCAL,
|
|
941
|
+
attempt: 1,
|
|
942
|
+
branch: 'task/T-1',
|
|
943
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
944
|
+
});
|
|
945
|
+
|
|
946
|
+
assert.deepEqual(calls, [
|
|
947
|
+
'boardCheck',
|
|
948
|
+
'scopeCheck',
|
|
949
|
+
'formatLintTest',
|
|
950
|
+
'saveWork',
|
|
951
|
+
'blockKeepSlot',
|
|
952
|
+
]);
|
|
953
|
+
assert.ok(!calls.includes('releaseSlot'));
|
|
954
|
+
});
|
|
955
|
+
|
|
956
|
+
it('a rejected local reviewer also saves before blocking', () => {
|
|
957
|
+
const { calls, runners } = recordingRunners({
|
|
958
|
+
reviewer: () => {
|
|
959
|
+
calls.push('reviewer');
|
|
960
|
+
return {
|
|
961
|
+
ok: false,
|
|
962
|
+
reason: 'reviewer-rejected',
|
|
963
|
+
question: 'AC 2 no cubierto, ¿se descarta?',
|
|
964
|
+
};
|
|
965
|
+
},
|
|
966
|
+
});
|
|
967
|
+
const plan = planClose({ outcome: 'success', lane: LANE.LOCAL });
|
|
968
|
+
|
|
969
|
+
executeClose(plan, runners, {
|
|
970
|
+
lane: LANE.LOCAL,
|
|
971
|
+
attempt: 2,
|
|
972
|
+
branch: 'task/T-1',
|
|
973
|
+
logPath: '.backlog/.dispatch/T-1/intento-2/run.log',
|
|
974
|
+
});
|
|
975
|
+
|
|
976
|
+
assert.deepEqual(calls, [
|
|
977
|
+
'boardCheck',
|
|
978
|
+
'scopeCheck',
|
|
979
|
+
'formatLintTest',
|
|
980
|
+
'mirrorRegen',
|
|
981
|
+
'reviewer',
|
|
982
|
+
'saveWork',
|
|
983
|
+
'block',
|
|
984
|
+
'releaseSlot',
|
|
985
|
+
]);
|
|
986
|
+
});
|
|
987
|
+
|
|
988
|
+
it('a session-level failure (needs-guidance/timeout/crash) starts the plan directly at save-work', () => {
|
|
989
|
+
const { calls, runners } = recordingRunners();
|
|
990
|
+
const plan = planClose({
|
|
991
|
+
outcome: 'failure',
|
|
992
|
+
lane: LANE.LOCAL,
|
|
993
|
+
reason: 'needs-guidance',
|
|
994
|
+
question: 'no pude resolver el permiso denegado',
|
|
995
|
+
branch: 'task/T-1',
|
|
996
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
997
|
+
attempt: 1,
|
|
998
|
+
pushSucceeded: true,
|
|
999
|
+
});
|
|
1000
|
+
|
|
1001
|
+
executeClose(plan, runners, {
|
|
1002
|
+
lane: LANE.LOCAL,
|
|
1003
|
+
attempt: 1,
|
|
1004
|
+
branch: 'task/T-1',
|
|
1005
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
1006
|
+
});
|
|
1007
|
+
|
|
1008
|
+
assert.deepEqual(calls, ['leftoverFiles', 'saveWork', 'block', 'releaseSlot']);
|
|
1009
|
+
});
|
|
1010
|
+
|
|
1011
|
+
// T-31 round 3. `needs-guidance`, a timeout, an exhausted budget and a crash are the MOST COMMON
|
|
1012
|
+
// non-green outcomes of a headless dispatch, and their plan starts at `save-work` — no
|
|
1013
|
+
// `scope-check` step ever runs, so the soft-list files `executeClose` carries from that step are
|
|
1014
|
+
// empty and the `Blocked` comment named nothing. Meanwhile `saveWipAndPush` still pushes the whole
|
|
1015
|
+
// slot tree to `task/<id>` and the retry restores it. The promise three documents make ("a FAILED
|
|
1016
|
+
// close names the soft-list files in the `Blocked` comment instead") has to hold for EVERY failure,
|
|
1017
|
+
// so the executor asks for them itself before diverting.
|
|
1018
|
+
it('probes the leftover files before diverting when the plan starts at save-work', () => {
|
|
1019
|
+
let seen: readonly string[] | undefined;
|
|
1020
|
+
let seenForbidden: readonly string[] | undefined;
|
|
1021
|
+
const { calls, runners } = recordingRunners({
|
|
1022
|
+
leftoverFiles: () => {
|
|
1023
|
+
calls.push('leftoverFiles');
|
|
1024
|
+
return {
|
|
1025
|
+
forbiddenFiles: ['.claude/settings.json'],
|
|
1026
|
+
humanReviewFiles: ['scripts/backlog/close.ts', 'packages/cli/src/index.ts'],
|
|
1027
|
+
};
|
|
1028
|
+
},
|
|
1029
|
+
block: (details) => {
|
|
1030
|
+
calls.push('block');
|
|
1031
|
+
seen = details.humanReviewFiles;
|
|
1032
|
+
seenForbidden = details.forbiddenFiles;
|
|
1033
|
+
},
|
|
1034
|
+
});
|
|
1035
|
+
|
|
1036
|
+
executeClose(
|
|
1037
|
+
planClose({
|
|
1038
|
+
outcome: 'failure',
|
|
1039
|
+
lane: LANE.FRONTIER,
|
|
1040
|
+
reason: 'needs-guidance',
|
|
1041
|
+
branch: 'task/T-1',
|
|
1042
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
1043
|
+
attempt: 1,
|
|
1044
|
+
pushSucceeded: true,
|
|
1045
|
+
}),
|
|
1046
|
+
runners,
|
|
1047
|
+
{
|
|
1048
|
+
lane: LANE.FRONTIER,
|
|
1049
|
+
attempt: 1,
|
|
1050
|
+
branch: 'task/T-1',
|
|
1051
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
1052
|
+
},
|
|
1053
|
+
);
|
|
1054
|
+
|
|
1055
|
+
assert.deepEqual(seen, ['scripts/backlog/close.ts', 'packages/cli/src/index.ts']);
|
|
1056
|
+
// The hard half of the record travels too, and as a VIOLATION rather than as an admitted file:
|
|
1057
|
+
// this is the tree the retry restores from `task/<id>`.
|
|
1058
|
+
assert.deepEqual(seenForbidden, ['.claude/settings.json']);
|
|
1059
|
+
assert.ok(
|
|
1060
|
+
calls.indexOf('leftoverFiles') < calls.indexOf('saveWork'),
|
|
1061
|
+
'the probe must read the diff BEFORE the WIP commit rewrites the tree',
|
|
1062
|
+
);
|
|
1063
|
+
});
|
|
1064
|
+
|
|
1065
|
+
it('records an empty soft-list and still blocks when the probe THROWS', () => {
|
|
1066
|
+
let seen: readonly string[] | undefined;
|
|
1067
|
+
const { calls, runners } = recordingRunners({
|
|
1068
|
+
leftoverFiles: () => {
|
|
1069
|
+
calls.push('leftoverFiles');
|
|
1070
|
+
throw new Error('git no se pudo ejecutar');
|
|
1071
|
+
},
|
|
1072
|
+
block: (details) => {
|
|
1073
|
+
calls.push('block');
|
|
1074
|
+
seen = details.humanReviewFiles;
|
|
1075
|
+
},
|
|
1076
|
+
});
|
|
1077
|
+
|
|
1078
|
+
executeClose(
|
|
1079
|
+
planClose({
|
|
1080
|
+
outcome: 'failure',
|
|
1081
|
+
lane: LANE.FRONTIER,
|
|
1082
|
+
reason: 'crash',
|
|
1083
|
+
branch: 'task/T-1',
|
|
1084
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
1085
|
+
attempt: 1,
|
|
1086
|
+
pushSucceeded: true,
|
|
1087
|
+
}),
|
|
1088
|
+
runners,
|
|
1089
|
+
{
|
|
1090
|
+
lane: LANE.FRONTIER,
|
|
1091
|
+
attempt: 1,
|
|
1092
|
+
branch: 'task/T-1',
|
|
1093
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
1094
|
+
},
|
|
1095
|
+
);
|
|
1096
|
+
|
|
1097
|
+
assert.deepEqual(seen, []);
|
|
1098
|
+
assert.deepEqual(calls, ['leftoverFiles', 'saveWork', 'block', 'releaseSlot']);
|
|
1099
|
+
});
|
|
1100
|
+
|
|
1101
|
+
// The probe exists only for the plan that skips `scope-check`. A mechanical failure already knows
|
|
1102
|
+
// the answer, and asking git a second time after a step failed would report a DIFFERENT file set
|
|
1103
|
+
// (`mirrorRegen` may have written the mirror by then) — the exact recomputation design.md
|
|
1104
|
+
// decision 8 forbids for the PR mark.
|
|
1105
|
+
it('does NOT probe when a mechanical step failed — the scope check already reported', () => {
|
|
1106
|
+
const { calls, runners } = recordingRunners({
|
|
1107
|
+
scopeCheck: () => {
|
|
1108
|
+
calls.push('scopeCheck');
|
|
1109
|
+
return { ok: true, humanReviewFiles: ['scripts/backlog/close.ts'] };
|
|
1110
|
+
},
|
|
1111
|
+
acCheck: () => {
|
|
1112
|
+
calls.push('acCheck');
|
|
1113
|
+
return { ok: false, reason: 'ac-not-met' };
|
|
1114
|
+
},
|
|
1115
|
+
});
|
|
1116
|
+
|
|
1117
|
+
executeClose(planClose({ outcome: 'success', lane: LANE.FRONTIER }), runners, {
|
|
1118
|
+
lane: LANE.FRONTIER,
|
|
1119
|
+
attempt: 1,
|
|
1120
|
+
branch: 'task/T-1',
|
|
1121
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
1122
|
+
});
|
|
1123
|
+
|
|
1124
|
+
assert.ok(!calls.includes('leftoverFiles'));
|
|
1125
|
+
});
|
|
1126
|
+
});
|
|
1127
|
+
|
|
1128
|
+
// ── resolveBaseRef / runScopeCheck / buildPrCreateArgs / planMechanicalChecks ──
|
|
1129
|
+
|
|
1130
|
+
const baseTask = (overrides: Partial<Task> = {}): Task => ({
|
|
1131
|
+
id: 'T-12',
|
|
1132
|
+
status: TASK_STATUS.QUEUED,
|
|
1133
|
+
tier: TIER.MINOR,
|
|
1134
|
+
lane: LANE.LOCAL,
|
|
1135
|
+
path: EXECUTION_PATH.DIRECT,
|
|
1136
|
+
filesToTouch: [],
|
|
1137
|
+
testCommand: null,
|
|
1138
|
+
acceptanceCriteria: [],
|
|
1139
|
+
definitionOfDone: [],
|
|
1140
|
+
dependsOn: [],
|
|
1141
|
+
attempts: 0,
|
|
1142
|
+
priority: 0,
|
|
1143
|
+
createdAt: 0,
|
|
1144
|
+
updatedAt: 0,
|
|
1145
|
+
...overrides,
|
|
1146
|
+
});
|
|
1147
|
+
|
|
1148
|
+
// ── J5: the board still says what it said at launch ───────────────────────────
|
|
1149
|
+
|
|
1150
|
+
const boardView = (
|
|
1151
|
+
parts: {
|
|
1152
|
+
status?: string;
|
|
1153
|
+
ac?: string[];
|
|
1154
|
+
dod?: string[];
|
|
1155
|
+
title?: string;
|
|
1156
|
+
files?: string[];
|
|
1157
|
+
test?: string;
|
|
1158
|
+
parent?: string;
|
|
1159
|
+
} = {},
|
|
1160
|
+
): string =>
|
|
1161
|
+
[
|
|
1162
|
+
`Task T-12 - ${parts.title ?? 'A task'}`,
|
|
1163
|
+
'',
|
|
1164
|
+
`Status: ${parts.status ?? 'In Progress'}`,
|
|
1165
|
+
...(parts.parent ? [`Parent: ${parts.parent} - The parent task`] : []),
|
|
1166
|
+
'',
|
|
1167
|
+
`Files to touch: ${(parts.files ?? ['backend/src/@app/x.service.ts']).join(', ')}`,
|
|
1168
|
+
`Test command: ${parts.test ?? 'pnpm --filter aurora-back test'}`,
|
|
1169
|
+
'',
|
|
1170
|
+
'Acceptance Criteria:',
|
|
1171
|
+
'--------------------------------------------------',
|
|
1172
|
+
...(parts.ac ?? ['AC one', 'AC two']).map((text, index) => `- [x] #${index + 1} ${text}`),
|
|
1173
|
+
'',
|
|
1174
|
+
'Definition of Done:',
|
|
1175
|
+
'--------------------------------------------------',
|
|
1176
|
+
...(parts.dod ?? ['Scoped tests pass']).map((text, index) => `- [x] #${index + 1} ${text}`),
|
|
1177
|
+
'',
|
|
1178
|
+
].join('\n');
|
|
1179
|
+
|
|
1180
|
+
const snapshotTask = (overrides: Partial<Task> = {}): Task =>
|
|
1181
|
+
baseTask({
|
|
1182
|
+
title: 'A task',
|
|
1183
|
+
filesToTouch: ['backend/src/@app/x.service.ts'],
|
|
1184
|
+
testCommand: 'pnpm --filter aurora-back test',
|
|
1185
|
+
acceptanceCriteria: ['AC one', 'AC two'],
|
|
1186
|
+
definitionOfDone: ['Scoped tests pass'],
|
|
1187
|
+
...overrides,
|
|
1188
|
+
});
|
|
1189
|
+
|
|
1190
|
+
describe('checkBoardIntegrity', () => {
|
|
1191
|
+
it('passes when the status is still In Progress and no checklist text moved', () => {
|
|
1192
|
+
assert.deepEqual(checkBoardIntegrity({ taskText: boardView(), task: snapshotTask() }), {
|
|
1193
|
+
ok: true,
|
|
1194
|
+
});
|
|
1195
|
+
});
|
|
1196
|
+
|
|
1197
|
+
// J5(c): the worker holds a `backlog task edit` grant on its own task for its whole run. Setting
|
|
1198
|
+
// itself to Done makes the maintenance sweep read a finished task nobody verified; setting itself
|
|
1199
|
+
// to Queued makes the next pass dispatch it again while this close is still running.
|
|
1200
|
+
for (const status of ['Done', 'Queued', 'Blocked', 'To Do']) {
|
|
1201
|
+
it(`fails the attempt when the worker left the task in ${status}`, () => {
|
|
1202
|
+
const result = checkBoardIntegrity({ taskText: boardView({ status }), task: snapshotTask() });
|
|
1203
|
+
assert.equal(result.ok, false);
|
|
1204
|
+
assert.equal(result.reason, 'status-changed-by-worker');
|
|
1205
|
+
assert.match(result.question ?? '', new RegExp(status));
|
|
1206
|
+
});
|
|
1207
|
+
}
|
|
1208
|
+
|
|
1209
|
+
// J5(b): rewriting a criterion is grading your own exam — the pre-PR gate and the reviewer both
|
|
1210
|
+
// judge the attempt against exactly these texts.
|
|
1211
|
+
it('fails when an acceptance criterion was rewritten', () => {
|
|
1212
|
+
const result = checkBoardIntegrity({
|
|
1213
|
+
taskText: boardView({ ac: ['AC one', 'AC two but easier'] }),
|
|
1214
|
+
task: snapshotTask(),
|
|
1215
|
+
});
|
|
1216
|
+
assert.equal(result.ok, false);
|
|
1217
|
+
assert.equal(result.reason, 'ac-tampered');
|
|
1218
|
+
assert.match(result.question ?? '', /AC two/);
|
|
1219
|
+
});
|
|
1220
|
+
|
|
1221
|
+
it('fails when an acceptance criterion was removed', () => {
|
|
1222
|
+
const result = checkBoardIntegrity({
|
|
1223
|
+
taskText: boardView({ ac: ['AC one'] }),
|
|
1224
|
+
task: snapshotTask(),
|
|
1225
|
+
});
|
|
1226
|
+
assert.equal(result.ok, false);
|
|
1227
|
+
assert.equal(result.reason, 'ac-tampered');
|
|
1228
|
+
});
|
|
1229
|
+
|
|
1230
|
+
it('fails when a Definition-of-Done item was rewritten', () => {
|
|
1231
|
+
const result = checkBoardIntegrity({
|
|
1232
|
+
taskText: boardView({ dod: ['Nothing in particular'] }),
|
|
1233
|
+
task: snapshotTask(),
|
|
1234
|
+
});
|
|
1235
|
+
assert.equal(result.ok, false);
|
|
1236
|
+
assert.equal(result.reason, 'ac-tampered');
|
|
1237
|
+
});
|
|
1238
|
+
|
|
1239
|
+
// K1: the criteria were not the only text the attempt is judged against. The TITLE is what the PR
|
|
1240
|
+
// is named after, `Files to touch:` is the allowlist the scope check runs, and `Test command:` is
|
|
1241
|
+
// what the triad executes — a worker that rewrote any of the three would be judged against a
|
|
1242
|
+
// contract it authored itself, so the gate compares them against the launch snapshot too.
|
|
1243
|
+
it('fails when the title was rewritten', () => {
|
|
1244
|
+
const result = checkBoardIntegrity({
|
|
1245
|
+
taskText: boardView({ title: 'Something easier' }),
|
|
1246
|
+
task: snapshotTask(),
|
|
1247
|
+
});
|
|
1248
|
+
assert.equal(result.ok, false);
|
|
1249
|
+
assert.equal(result.reason, 'ac-tampered');
|
|
1250
|
+
assert.match(result.question ?? '', /Something easier/);
|
|
1251
|
+
});
|
|
1252
|
+
|
|
1253
|
+
it('fails when the declared Files to touch changed', () => {
|
|
1254
|
+
const result = checkBoardIntegrity({
|
|
1255
|
+
taskText: boardView({
|
|
1256
|
+
files: ['backend/src/@app/x.service.ts', 'backend/src/@app/y.service.ts'],
|
|
1257
|
+
}),
|
|
1258
|
+
task: snapshotTask(),
|
|
1259
|
+
});
|
|
1260
|
+
assert.equal(result.ok, false);
|
|
1261
|
+
assert.equal(result.reason, 'ac-tampered');
|
|
1262
|
+
assert.match(result.question ?? '', /y\.service\.ts/);
|
|
1263
|
+
});
|
|
1264
|
+
|
|
1265
|
+
it('fails when the declared Test command changed', () => {
|
|
1266
|
+
const result = checkBoardIntegrity({
|
|
1267
|
+
taskText: boardView({ test: 'pnpm --filter aurora-back test -- nothing.spec.ts' }),
|
|
1268
|
+
task: snapshotTask(),
|
|
1269
|
+
});
|
|
1270
|
+
assert.equal(result.ok, false);
|
|
1271
|
+
assert.equal(result.reason, 'ac-tampered');
|
|
1272
|
+
assert.match(result.question ?? '', /nothing\.spec\.ts/);
|
|
1273
|
+
});
|
|
1274
|
+
|
|
1275
|
+
// M2: the parent is the rest of the contract nothing re-read. It decides the PR's base branch
|
|
1276
|
+
// (`resolveBaseBranch`) and the ref the attempt is diffed against, so a `Parent:` that appeared
|
|
1277
|
+
// after launch opens the PR against a branch the task never declared — and one that vanished
|
|
1278
|
+
// diffs a child against `main`, reporting every file the parent already changed as this
|
|
1279
|
+
// attempt's scope violation.
|
|
1280
|
+
it('fails when a Parent appeared on the board after launch', () => {
|
|
1281
|
+
const result = checkBoardIntegrity({
|
|
1282
|
+
taskText: boardView({ parent: 'T-42' }),
|
|
1283
|
+
task: snapshotTask(),
|
|
1284
|
+
});
|
|
1285
|
+
assert.equal(result.ok, false);
|
|
1286
|
+
assert.equal(result.reason, 'ac-tampered');
|
|
1287
|
+
assert.match(result.question ?? '', /Parent/);
|
|
1288
|
+
assert.match(result.question ?? '', /T-42/);
|
|
1289
|
+
});
|
|
1290
|
+
|
|
1291
|
+
it('fails when the Parent the task was launched with disappeared', () => {
|
|
1292
|
+
const result = checkBoardIntegrity({
|
|
1293
|
+
taskText: boardView(),
|
|
1294
|
+
task: snapshotTask({ parentId: 'T-10' }),
|
|
1295
|
+
});
|
|
1296
|
+
assert.equal(result.ok, false);
|
|
1297
|
+
assert.equal(result.reason, 'ac-tampered');
|
|
1298
|
+
assert.match(result.question ?? '', /Parent/);
|
|
1299
|
+
});
|
|
1300
|
+
|
|
1301
|
+
it('passes when the Parent still reads as it did at launch', () => {
|
|
1302
|
+
assert.deepEqual(
|
|
1303
|
+
checkBoardIntegrity({
|
|
1304
|
+
taskText: boardView({ parent: 'T-10' }),
|
|
1305
|
+
task: snapshotTask({ parentId: 'T-10' }),
|
|
1306
|
+
}),
|
|
1307
|
+
{ ok: true },
|
|
1308
|
+
);
|
|
1309
|
+
});
|
|
1310
|
+
|
|
1311
|
+
// K10: `ac-tampered` used to blame the worker outright. A person editing the board while an
|
|
1312
|
+
// attempt runs produces exactly the same drift, and the remedy is the same either way.
|
|
1313
|
+
it('attributes the drift to the worker OR a person, and says re-queueing re-snapshots it', () => {
|
|
1314
|
+
const result = checkBoardIntegrity({
|
|
1315
|
+
taskText: boardView({ title: 'Renamed by a person' }),
|
|
1316
|
+
task: snapshotTask(),
|
|
1317
|
+
});
|
|
1318
|
+
assert.match(result.question ?? '', /persona/i);
|
|
1319
|
+
assert.match(result.question ?? '', /instantánea|encolar/i);
|
|
1320
|
+
});
|
|
1321
|
+
|
|
1322
|
+
// The whole point of re-reading: the worker is SUPPOSED to tick its criteria as it works.
|
|
1323
|
+
it('ignores the checked state entirely — ticking is the worker job, not tampering', () => {
|
|
1324
|
+
const unticked = boardView().replace(/- \[x\]/g, '- [ ]');
|
|
1325
|
+
assert.deepEqual(checkBoardIntegrity({ taskText: unticked, task: snapshotTask() }), {
|
|
1326
|
+
ok: true,
|
|
1327
|
+
});
|
|
1328
|
+
});
|
|
1329
|
+
|
|
1330
|
+
it('fails closed on an unreadable view rather than passing an attempt it could not verify', () => {
|
|
1331
|
+
const result = checkBoardIntegrity({ taskText: '', task: snapshotTask() });
|
|
1332
|
+
assert.equal(result.ok, false);
|
|
1333
|
+
assert.equal(result.reason, 'status-changed-by-worker');
|
|
1334
|
+
});
|
|
1335
|
+
});
|
|
1336
|
+
|
|
1337
|
+
describe('resolveBaseBranch / resolveBaseRef', () => {
|
|
1338
|
+
it('resolves a top-level task to main, and diffs it against the REMOTE-tracking ref', () => {
|
|
1339
|
+
assert.equal(resolveBaseBranch(baseTask()), 'main');
|
|
1340
|
+
assert.equal(resolveBaseRef(baseTask()), 'origin/main');
|
|
1341
|
+
});
|
|
1342
|
+
|
|
1343
|
+
it("resolves a subtask to its parent's branch, never to main", () => {
|
|
1344
|
+
assert.equal(resolveBaseBranch(baseTask({ parentId: 'T-10' })), 'task/T-10');
|
|
1345
|
+
assert.equal(resolveBaseRef(baseTask({ parentId: 'T-10' })), 'origin/task/T-10');
|
|
1346
|
+
});
|
|
1347
|
+
|
|
1348
|
+
// T-14 regression (T-4.1, 2026-09-08): the close used to assume `task/<parentId>` unconditionally
|
|
1349
|
+
// while `slots.ts`'s `resolveBranch` silently fell back to `origin/main` when that branch was not
|
|
1350
|
+
// yet on the remote — so dispatch branched a subtask off ONE ref and the close measured its diff
|
|
1351
|
+
// and opened its PR against ANOTHER.
|
|
1352
|
+
//
|
|
1353
|
+
// What this test actually locks: for a subtask whose parent branch IS on the remote, `slots.ts`'s
|
|
1354
|
+
// `resolveBranch` and `close.ts`'s `resolveBaseRef` produce the SAME string. That is a black-box
|
|
1355
|
+
// equality check on the happy path — it catches a future regression where either function's OUTPUT
|
|
1356
|
+
// changes, but it does NOT prove the two share one implementation: a reviewer (T-14 fix round)
|
|
1357
|
+
// replaced `resolveBaseBranch`'s body with an independent copy of the same `task.parentId ? … :
|
|
1358
|
+
// …` expression, reimplementing rather than calling `taskBaseBranch`, and this test kept passing —
|
|
1359
|
+
// the two answers still agreed, they just agreed by coincidence instead of by construction. The
|
|
1360
|
+
// "one place" property is enforced by code review of `resolveBaseBranch`'s body (it calls
|
|
1361
|
+
// `guards.ts`'s `taskBaseBranch`), not by this assertion; nothing here — deliberately, since this
|
|
1362
|
+
// suite has no module-mocking convention — verifies that call actually happens.
|
|
1363
|
+
it("never diverges from slots.ts's resolveBranch on a subtask whose parent branch exists", () => {
|
|
1364
|
+
const task = baseTask({ parentId: 'T-10' });
|
|
1365
|
+
const dispatchBase = resolveBranch({
|
|
1366
|
+
taskId: task.id,
|
|
1367
|
+
parentId: task.parentId,
|
|
1368
|
+
remoteBranches: ['main', 'task/T-10'],
|
|
1369
|
+
}).base;
|
|
1370
|
+
assert.equal(dispatchBase, resolveBaseRef(task));
|
|
1371
|
+
});
|
|
1372
|
+
|
|
1373
|
+
});
|
|
1374
|
+
|
|
1375
|
+
// ── mirror-regen: the CLI scaffold mirror the drift gate compares against ─────
|
|
1376
|
+
|
|
1377
|
+
/**
|
|
1378
|
+
* Measured defect (PR #96, dispatched task T-3): the worker edited `backend/src/@app/iam/**` and
|
|
1379
|
+
* `frontend/src/app/domains/admin/apps/iam/**`, both of which the packager mirrors into
|
|
1380
|
+
* `packages/cli/src/templates/**`. The PR failed the `Check mirror <-> source drift` CI gate, and
|
|
1381
|
+
* the worker could not possibly fix it — that prefix is refused on both lanes regardless of the
|
|
1382
|
+
* T-31 split (`packages/cli/` itself is soft; its own generated mirror never is). Nobody
|
|
1383
|
+
* regenerated the mirror either, so any dispatched task touching a mirrored root could never pass
|
|
1384
|
+
* CI on its own.
|
|
1385
|
+
*/
|
|
1386
|
+
const DRIFT_CHECK_WORKFLOW_FIXTURE = `name: CLI template drift check
|
|
1387
|
+
|
|
1388
|
+
on:
|
|
1389
|
+
pull_request:
|
|
1390
|
+
paths:
|
|
1391
|
+
- 'backend/**'
|
|
1392
|
+
- 'frontend/**'
|
|
1393
|
+
- 'package.json'
|
|
1394
|
+
- 'docs/**'
|
|
1395
|
+
- 'cliter/harness-rules-index.json'
|
|
1396
|
+
- '.github/workflows/cli-template-drift-check.yml'
|
|
1397
|
+
|
|
1398
|
+
jobs:
|
|
1399
|
+
check:
|
|
1400
|
+
runs-on: ubuntu-latest
|
|
1401
|
+
`;
|
|
1402
|
+
|
|
1403
|
+
describe('parseMirroredRoots', () => {
|
|
1404
|
+
it("reads the roots off the drift-check workflow's own paths: filter", () => {
|
|
1405
|
+
assert.deepEqual(parseMirroredRoots(DRIFT_CHECK_WORKFLOW_FIXTURE), [
|
|
1406
|
+
'backend/**',
|
|
1407
|
+
'frontend/**',
|
|
1408
|
+
'package.json',
|
|
1409
|
+
'docs/**',
|
|
1410
|
+
'cliter/harness-rules-index.json',
|
|
1411
|
+
'.github/workflows/cli-template-drift-check.yml',
|
|
1412
|
+
]);
|
|
1413
|
+
});
|
|
1414
|
+
|
|
1415
|
+
// The mirror is the packager's OUTPUT, never one of its source roots: were `packages/cli/**` ever
|
|
1416
|
+
// added to that filter, a mirror file appearing in the diff would make the step regenerate again.
|
|
1417
|
+
it('drops packages/cli/** — the mirror is output, not a source root', () => {
|
|
1418
|
+
const withMirrorRoot = DRIFT_CHECK_WORKFLOW_FIXTURE.replace(
|
|
1419
|
+
" - 'backend/**'",
|
|
1420
|
+
" - 'backend/**'\n - 'packages/cli/**'",
|
|
1421
|
+
);
|
|
1422
|
+
const roots = parseMirroredRoots(withMirrorRoot);
|
|
1423
|
+
assert.ok(roots.includes('backend/**'));
|
|
1424
|
+
assert.ok(!roots.includes('packages/cli/**'));
|
|
1425
|
+
});
|
|
1426
|
+
|
|
1427
|
+
it('returns nothing when the workflow carries no paths: list at all', () => {
|
|
1428
|
+
assert.deepEqual(parseMirroredRoots('name: something else\non:\n pull_request:\n'), []);
|
|
1429
|
+
});
|
|
1430
|
+
|
|
1431
|
+
// The real file, not a fixture: `scripts/packager/drift-check-paths.test.mjs` already keeps that
|
|
1432
|
+
// list in lockstep with `copyMonorepo()`, which is exactly why it is the runtime source of truth
|
|
1433
|
+
// here instead of a second hardcoded copy of the roots inside the dispatcher.
|
|
1434
|
+
it('parses the repository real workflow, covering backend and frontend', () => {
|
|
1435
|
+
const roots = parseMirroredRoots(
|
|
1436
|
+
fs.readFileSync(
|
|
1437
|
+
path.join(REPO_ROOT, '.github', 'workflows', 'cli-template-drift-check.yml'),
|
|
1438
|
+
'utf8',
|
|
1439
|
+
),
|
|
1440
|
+
);
|
|
1441
|
+
assert.ok(roots.includes('backend/**'), 'backend/** must be a mirrored root');
|
|
1442
|
+
assert.ok(roots.includes('frontend/**'), 'frontend/** must be a mirrored root');
|
|
1443
|
+
assert.ok(!roots.some((root) => root.startsWith('packages/cli')));
|
|
1444
|
+
});
|
|
1445
|
+
});
|
|
1446
|
+
|
|
1447
|
+
describe('touchesMirroredRoot', () => {
|
|
1448
|
+
const roots = parseMirroredRoots(DRIFT_CHECK_WORKFLOW_FIXTURE);
|
|
1449
|
+
|
|
1450
|
+
it('is false when nothing the attempt changed lives under a mirrored root', () => {
|
|
1451
|
+
assert.equal(
|
|
1452
|
+
touchesMirroredRoot(['openspec/changes/x/design.md', 'cliter/foo.aurora.yaml'], roots),
|
|
1453
|
+
false,
|
|
1454
|
+
);
|
|
1455
|
+
});
|
|
1456
|
+
|
|
1457
|
+
it('is true for a file under a /** root', () => {
|
|
1458
|
+
assert.equal(touchesMirroredRoot(['backend/src/@app/iam/x.ts'], roots), true);
|
|
1459
|
+
});
|
|
1460
|
+
|
|
1461
|
+
it('is true for an exact-file root', () => {
|
|
1462
|
+
assert.equal(touchesMirroredRoot(['package.json'], roots), true);
|
|
1463
|
+
});
|
|
1464
|
+
|
|
1465
|
+
// `package.json` is an EXACT entry in that filter, not a prefix: the packager copies the root one
|
|
1466
|
+
// and nothing else, so `backend/package.json` is not what makes the mirror stale (a worker cannot
|
|
1467
|
+
// touch either — both are in `SLOT_EXECUTED_PATHS` — but the matcher must not over-claim).
|
|
1468
|
+
it('does not read an exact-file root as a prefix', () => {
|
|
1469
|
+
assert.equal(touchesMirroredRoot(['backend-tools/package.json.bak'], roots), false);
|
|
1470
|
+
});
|
|
1471
|
+
|
|
1472
|
+
it('is false with no roots at all rather than matching everything', () => {
|
|
1473
|
+
assert.equal(touchesMirroredRoot(['backend/src/@app/iam/x.ts'], []), false);
|
|
1474
|
+
});
|
|
1475
|
+
});
|
|
1476
|
+
|
|
1477
|
+
describe('runMirrorRegen', () => {
|
|
1478
|
+
// NUL-separated and NUL-terminated, like the real `-z` output `collectChangedFiles` parses. Every
|
|
1479
|
+
// call site here passes a single path, so no fixture in this suite would notice a wrong separator
|
|
1480
|
+
// today — the shape is right because the parser under test is the real one, and a suite that grows a
|
|
1481
|
+
// two-path case must not have to rediscover the format. (Round 3's comment claimed a measured
|
|
1482
|
+
// several-paths-into-one defect; the fixtures never named several.)
|
|
1483
|
+
const gitAnswering = (changed: readonly string[]) => (args: string[]) =>
|
|
1484
|
+
args[0] === 'diff' ? `${changed.join('\0')}\0` : '';
|
|
1485
|
+
|
|
1486
|
+
it('never runs the packager when nothing under a mirrored root changed', () => {
|
|
1487
|
+
let packagerRuns = 0;
|
|
1488
|
+
const result = runMirrorRegen({
|
|
1489
|
+
base: 'origin/main',
|
|
1490
|
+
runGit: gitAnswering(['openspec/changes/x/design.md']),
|
|
1491
|
+
driftCheckWorkflow: DRIFT_CHECK_WORKFLOW_FIXTURE,
|
|
1492
|
+
runPackager: () => {
|
|
1493
|
+
packagerRuns += 1;
|
|
1494
|
+
},
|
|
1495
|
+
});
|
|
1496
|
+
|
|
1497
|
+
assert.deepEqual(result, { ok: true, regenerated: false, mirrorFiles: [] });
|
|
1498
|
+
assert.equal(
|
|
1499
|
+
packagerRuns,
|
|
1500
|
+
0,
|
|
1501
|
+
'the packager is a whole repo-wide copy: it must not run for nothing',
|
|
1502
|
+
);
|
|
1503
|
+
});
|
|
1504
|
+
|
|
1505
|
+
it('runs the packager when a mirrored root changed, and reports the mirror files it produced', () => {
|
|
1506
|
+
const gitCalls: string[][] = [];
|
|
1507
|
+
let packagerRuns = 0;
|
|
1508
|
+
const result = runMirrorRegen({
|
|
1509
|
+
base: 'origin/main',
|
|
1510
|
+
runGit: (args) => {
|
|
1511
|
+
gitCalls.push(args);
|
|
1512
|
+
if (args[0] !== 'diff') {
|
|
1513
|
+
return packagerRuns === 0
|
|
1514
|
+
? ''
|
|
1515
|
+
: ' M packages/cli/src/templates/backend/packages/iam/x.ts\0';
|
|
1516
|
+
}
|
|
1517
|
+
return 'backend/src/@app/iam/x.ts\0';
|
|
1518
|
+
},
|
|
1519
|
+
driftCheckWorkflow: DRIFT_CHECK_WORKFLOW_FIXTURE,
|
|
1520
|
+
runPackager: () => {
|
|
1521
|
+
packagerRuns += 1;
|
|
1522
|
+
},
|
|
1523
|
+
});
|
|
1524
|
+
|
|
1525
|
+
assert.equal(packagerRuns, 1);
|
|
1526
|
+
assert.equal(result.ok, true);
|
|
1527
|
+
assert.equal(result.regenerated, true);
|
|
1528
|
+
assert.deepEqual(result.mirrorFiles, ['packages/cli/src/templates/backend/packages/iam/x.ts']);
|
|
1529
|
+
// Re-collected AFTER the regen: that second read is what makes the mirror part of the attempt.
|
|
1530
|
+
assert.equal(gitCalls.filter((args) => args[0] === 'diff').length, 2);
|
|
1531
|
+
});
|
|
1532
|
+
|
|
1533
|
+
it('fails the step with the packager stderr when the regen blows up', () => {
|
|
1534
|
+
const result = runMirrorRegen({
|
|
1535
|
+
base: 'origin/main',
|
|
1536
|
+
runGit: gitAnswering(['frontend/src/app/domains/admin/apps/iam/x.ts']),
|
|
1537
|
+
driftCheckWorkflow: DRIFT_CHECK_WORKFLOW_FIXTURE,
|
|
1538
|
+
runPackager: () => {
|
|
1539
|
+
throw new Error(
|
|
1540
|
+
'Command failed: node scripts/packager/publish.mjs — stderr: ENOENT fast-glob',
|
|
1541
|
+
);
|
|
1542
|
+
},
|
|
1543
|
+
});
|
|
1544
|
+
|
|
1545
|
+
assert.equal(result.ok, false);
|
|
1546
|
+
assert.equal(result.reason, 'mirror-regen-failed');
|
|
1547
|
+
assert.match(result.question ?? '', /ENOENT fast-glob/);
|
|
1548
|
+
assert.equal(result.regenerated, false);
|
|
1549
|
+
});
|
|
1550
|
+
|
|
1551
|
+
it('fails the step when git cannot be read, rather than assuming nothing was mirrored', () => {
|
|
1552
|
+
const result = runMirrorRegen({
|
|
1553
|
+
base: 'origin/main',
|
|
1554
|
+
runGit: () => {
|
|
1555
|
+
throw new Error('fatal: not a git repository');
|
|
1556
|
+
},
|
|
1557
|
+
driftCheckWorkflow: DRIFT_CHECK_WORKFLOW_FIXTURE,
|
|
1558
|
+
runPackager: () => assert.fail('the packager must not run on an unreadable diff'),
|
|
1559
|
+
});
|
|
1560
|
+
|
|
1561
|
+
assert.equal(result.ok, false);
|
|
1562
|
+
assert.equal(result.reason, 'mirror-regen-failed');
|
|
1563
|
+
assert.match(result.question ?? '', /not a git repository/);
|
|
1564
|
+
});
|
|
1565
|
+
|
|
1566
|
+
// A generated project has no `.github/` and no packager at all (`copyMonorepo()` ships
|
|
1567
|
+
// `scripts/backlog/**` but not `scripts/packager/**`), so there is no mirror to keep there. The
|
|
1568
|
+
// gate does not apply, and failing every close in a scaffolded project would be an alarm about
|
|
1569
|
+
// this repository's own CI ringing in someone else's.
|
|
1570
|
+
it('skips entirely when the repo has no drift-check workflow', () => {
|
|
1571
|
+
const result = runMirrorRegen({
|
|
1572
|
+
base: 'origin/main',
|
|
1573
|
+
runGit: () => assert.fail('nothing to ask git about when the gate does not exist'),
|
|
1574
|
+
driftCheckWorkflow: null,
|
|
1575
|
+
runPackager: () => assert.fail('there is no packager in a scaffolded project'),
|
|
1576
|
+
});
|
|
1577
|
+
|
|
1578
|
+
assert.deepEqual(result, { ok: true, regenerated: false, mirrorFiles: [] });
|
|
1579
|
+
});
|
|
1580
|
+
|
|
1581
|
+
// The workflow is THERE but its `paths:` list did not parse: the roots are unknown, so whether
|
|
1582
|
+
// the mirror needs regenerating is unknowable — the same case `runScopeCheck` refuses to trust.
|
|
1583
|
+
it('fails when the workflow exists but its paths: list cannot be read', () => {
|
|
1584
|
+
const result = runMirrorRegen({
|
|
1585
|
+
base: 'origin/main',
|
|
1586
|
+
runGit: () => '',
|
|
1587
|
+
driftCheckWorkflow: 'name: CLI template drift check\non:\n pull_request:\n',
|
|
1588
|
+
runPackager: () => assert.fail('unknown roots must not trigger a repo-wide copy'),
|
|
1589
|
+
});
|
|
1590
|
+
|
|
1591
|
+
assert.equal(result.ok, false);
|
|
1592
|
+
assert.equal(result.reason, 'mirror-regen-failed');
|
|
1593
|
+
assert.match(result.question ?? '', /paths:/);
|
|
1594
|
+
});
|
|
1595
|
+
});
|
|
1596
|
+
|
|
1597
|
+
// The regen's exemption is the STEP ORDER, not a hole in the forbidden list: `scope-check` returns
|
|
1598
|
+
// its verdict over the pre-regen file set, so a mirror path the WORKER wrote by hand is still a
|
|
1599
|
+
// violation — and the dispatcher-owned output that appears afterwards is never re-judged.
|
|
1600
|
+
describe('checkScope — the mirror stays forbidden for the worker itself', () => {
|
|
1601
|
+
for (const lane of [LANE.LOCAL, LANE.FRONTIER] as const) {
|
|
1602
|
+
it(`flags a hand-written packages/cli/src/templates/ edit on the ${lane} lane`, () => {
|
|
1603
|
+
const file = 'packages/cli/src/templates/backend/packages/iam/x.ts';
|
|
1604
|
+
const result = checkScope({ lane, changedFiles: [file], declaredFiles: [file] });
|
|
1605
|
+
assert.equal(result.ok, false, 'declaring the mirror must not authorise writing it');
|
|
1606
|
+
assert.deepEqual(result.violatingFiles, [file]);
|
|
1607
|
+
});
|
|
1608
|
+
|
|
1609
|
+
// design.md decision 5: `packages/cli/src/templates/monorepo/scripts/backlog/close.ts` matches
|
|
1610
|
+
// BOTH `packages/cli/` (soft) and the mirror prefix. The mirror prefix must be tested FIRST, or
|
|
1611
|
+
// this would silently become a marked PR instead of a violation.
|
|
1612
|
+
it(`${lane}: a mirror path that also matches the soft packages/cli/ pattern is still a violation`, () => {
|
|
1613
|
+
const file = 'packages/cli/src/templates/monorepo/scripts/backlog/close.ts';
|
|
1614
|
+
const result = checkScope({ lane, changedFiles: [file], declaredFiles: [file] });
|
|
1615
|
+
assert.equal(
|
|
1616
|
+
result.ok,
|
|
1617
|
+
false,
|
|
1618
|
+
'the mirror prefix must win over the soft packages/cli/ pattern',
|
|
1619
|
+
);
|
|
1620
|
+
assert.deepEqual(result.violatingFiles, [file]);
|
|
1621
|
+
assert.deepEqual(result.humanReviewFiles, []);
|
|
1622
|
+
});
|
|
1623
|
+
|
|
1624
|
+
// T-31 round 2: `isMirrorOutput` was the one matcher in this module that compared
|
|
1625
|
+
// case-SENSITIVELY while every sibling lowercases both sides. On a case-insensitive filesystem
|
|
1626
|
+
// — which macOS is, and this repo is developed on — a casing variant of the mirror prefix names
|
|
1627
|
+
// the same file on disk, missed the anchored prefix and escaped into the soft branch as a
|
|
1628
|
+
// marked PR. Same inversion as the quoting one, different cause.
|
|
1629
|
+
it(`${lane}: a mirror path in a different casing is still a violation, not a soft mark`, () => {
|
|
1630
|
+
const file = 'Packages/CLI/src/Templates/monorepo/scripts/backlog/close.ts';
|
|
1631
|
+
const result = checkScope({ lane, changedFiles: [file], declaredFiles: [file] });
|
|
1632
|
+
assert.equal(result.ok, false, 'the mirror prefix must match case-insensitively');
|
|
1633
|
+
assert.deepEqual(result.violatingFiles, [file]);
|
|
1634
|
+
assert.deepEqual(result.humanReviewFiles, []);
|
|
1635
|
+
});
|
|
1636
|
+
}
|
|
1637
|
+
});
|
|
1638
|
+
|
|
1639
|
+
// T-93: `packages/cli/src/templates/codegen/` is 944 KB of hand-written `.eta` templates — the
|
|
1640
|
+
// CLI's OWN source, not packager output — and `cli-template-drift-check.yml` excludes it from its
|
|
1641
|
+
// own drift check by name for that reason. Before this fix `MIRROR_OUTPUT_PREFIXES`' predecessor
|
|
1642
|
+
// covered the WHOLE `packages/cli/src/templates/` tree, so a task that declared a `codegen/` file
|
|
1643
|
+
// (T-76 intento-1) was rejected as a mirror violation on a legitimate write.
|
|
1644
|
+
describe('checkScope — packages/cli/src/templates/codegen/ is hand-written source, not the mirror (T-93)', () => {
|
|
1645
|
+
for (const lane of [LANE.LOCAL, LANE.FRONTIER] as const) {
|
|
1646
|
+
it(`${lane}: a hand-written codegen/ template is admitted, not a mirror violation`, () => {
|
|
1647
|
+
const file = 'packages/cli/src/templates/codegen/some-template.ts.eta';
|
|
1648
|
+
const result = checkScope({ lane, changedFiles: [file], declaredFiles: [file] });
|
|
1649
|
+
assert.equal(result.ok, true, 'codegen/ is CLI source, not packager output');
|
|
1650
|
+
assert.deepEqual(result.violatingFiles, []);
|
|
1651
|
+
assert.deepEqual(result.humanReviewFiles, [file]);
|
|
1652
|
+
});
|
|
1653
|
+
}
|
|
1654
|
+
});
|
|
1655
|
+
|
|
1656
|
+
// T-93, the other direction of the same narrowing: the three directories the packager actually
|
|
1657
|
+
// writes must stay a hard violation exactly as before, even though `codegen/` next to them no
|
|
1658
|
+
// longer is.
|
|
1659
|
+
describe('checkScope — the real packager mirror stays refused after the codegen/ narrowing (T-93)', () => {
|
|
1660
|
+
for (const lane of [LANE.LOCAL, LANE.FRONTIER] as const) {
|
|
1661
|
+
for (const dir of ['backend', 'frontend', 'monorepo']) {
|
|
1662
|
+
it(`${lane}: a hand-written packages/cli/src/templates/${dir}/ edit is still a mirror violation`, () => {
|
|
1663
|
+
const file = `packages/cli/src/templates/${dir}/some-file.ts`;
|
|
1664
|
+
const result = checkScope({ lane, changedFiles: [file], declaredFiles: [file] });
|
|
1665
|
+
assert.equal(result.ok, false, `${dir}/ is real packager output and must stay refused`);
|
|
1666
|
+
assert.deepEqual(result.violatingFiles, [file]);
|
|
1667
|
+
assert.deepEqual(result.humanReviewFiles, []);
|
|
1668
|
+
});
|
|
1669
|
+
}
|
|
1670
|
+
}
|
|
1671
|
+
});
|
|
1672
|
+
|
|
1673
|
+
// T-49: the plain `status` half never carries `--ignored`, so a gitignored write (measured incident:
|
|
1674
|
+
// `packages/cli/dist/commands/**`, which `packages/cli/.gitignore` hides and `packages/cli/bin/run.js`
|
|
1675
|
+
// loads) never reaches `changedFiles` at all — not a hard-list hit, not a soft-list mark, invisible.
|
|
1676
|
+
// The fix is a THIRD, pathspec-scoped `--ignored` read, never a blanket one: `git status --ignored
|
|
1677
|
+
// --untracked-files=all` over the repo root was measured (2026-09-10, this checkout) at 138184
|
|
1678
|
+
// entries, almost all of it pre-existing `node_modules/` content installed at slot provisioning —
|
|
1679
|
+
// not written by the attempt — plus `backend/.env` and `backend/.keys` surfacing as "changed" simply
|
|
1680
|
+
// for existing. Scoping the pathspec to `packages/cli/dist` avoids both: the volume explosion and the
|
|
1681
|
+
// false positives on baseline files no attempt touched.
|
|
1682
|
+
describe('collectChangedFiles — the ignored scan (T-49)', () => {
|
|
1683
|
+
it('sees a file written under the gitignored packages/cli/dist, which the plain status call cannot', () => {
|
|
1684
|
+
const calls: string[][] = [];
|
|
1685
|
+
const files = collectChangedFiles({
|
|
1686
|
+
base: 'main',
|
|
1687
|
+
runGit: (args) => {
|
|
1688
|
+
calls.push(args);
|
|
1689
|
+
if (args[0] === 'diff') return '';
|
|
1690
|
+
if (args.includes('--ignored')) return '!! packages/cli/dist/commands/evil.js\0';
|
|
1691
|
+
return ''; // the plain status call never sees an ignored path — the bug this closes.
|
|
1692
|
+
},
|
|
1693
|
+
});
|
|
1694
|
+
|
|
1695
|
+
assert.deepEqual(files, ['packages/cli/dist/commands/evil.js']);
|
|
1696
|
+
assert.deepEqual(calls[2], [
|
|
1697
|
+
'status',
|
|
1698
|
+
'--porcelain',
|
|
1699
|
+
'-z',
|
|
1700
|
+
'--untracked-files=all',
|
|
1701
|
+
'--ignored',
|
|
1702
|
+
'--',
|
|
1703
|
+
'packages/cli/dist',
|
|
1704
|
+
]);
|
|
1705
|
+
});
|
|
1706
|
+
|
|
1707
|
+
it('does not invent a file when nothing ignored changed', () => {
|
|
1708
|
+
const files = collectChangedFiles({ base: 'main', runGit: () => '' });
|
|
1709
|
+
assert.deepEqual(files, []);
|
|
1710
|
+
});
|
|
1711
|
+
|
|
1712
|
+
it('does not duplicate a path the plain status call already reports', () => {
|
|
1713
|
+
const files = collectChangedFiles({
|
|
1714
|
+
base: 'main',
|
|
1715
|
+
runGit: (args) => {
|
|
1716
|
+
if (args[0] === 'diff') return '';
|
|
1717
|
+
// Same path from both the plain and the ignored call — a rename out of `dist/` mid-attempt
|
|
1718
|
+
// is not plausible, but a Set union must not report it twice regardless of how it got there.
|
|
1719
|
+
return '!! packages/cli/dist/commands/evil.js\0';
|
|
1720
|
+
},
|
|
1721
|
+
});
|
|
1722
|
+
assert.deepEqual(files, ['packages/cli/dist/commands/evil.js']);
|
|
1723
|
+
});
|
|
1724
|
+
});
|
|
1725
|
+
|
|
1726
|
+
describe('runScopeCheck', () => {
|
|
1727
|
+
it('asks git for the committed diff and the working tree, and passes when everything checks out', () => {
|
|
1728
|
+
const calls: string[][] = [];
|
|
1729
|
+
const result = runScopeCheck({
|
|
1730
|
+
lane: LANE.LOCAL,
|
|
1731
|
+
declaredFiles: ['backend/src/@app/some-bc/x.service.ts'],
|
|
1732
|
+
base: 'main',
|
|
1733
|
+
runGit: (args) => {
|
|
1734
|
+
calls.push(args);
|
|
1735
|
+
return args[0] === 'diff' ? 'backend/src/@app/some-bc/x.service.ts\0' : '';
|
|
1736
|
+
},
|
|
1737
|
+
});
|
|
1738
|
+
|
|
1739
|
+
assert.deepEqual(calls, [
|
|
1740
|
+
['diff', '--name-only', '-z', 'main...HEAD'],
|
|
1741
|
+
['status', '--porcelain', '-z', '--untracked-files=all'],
|
|
1742
|
+
[
|
|
1743
|
+
'status',
|
|
1744
|
+
'--porcelain',
|
|
1745
|
+
'-z',
|
|
1746
|
+
'--untracked-files=all',
|
|
1747
|
+
'--ignored',
|
|
1748
|
+
'--',
|
|
1749
|
+
'packages/cli/dist',
|
|
1750
|
+
],
|
|
1751
|
+
]);
|
|
1752
|
+
assert.deepEqual(result, { ok: true, humanReviewFiles: [] });
|
|
1753
|
+
});
|
|
1754
|
+
|
|
1755
|
+
// T-31 review, corrected in round 2: `core.quotepath=false` governs only NON-ASCII bytes. A path
|
|
1756
|
+
// holding a `"`, a backslash or a newline still comes back wrapped in `"…"` with C-escapes under
|
|
1757
|
+
// that option (measured), and the escaped string fails `isMirrorOutput`'s anchored `startsWith`
|
|
1758
|
+
// while still matching the unanchored soft pattern `packages/cli/` — a hand-written mirror edit
|
|
1759
|
+
// ADMITTED and merely marked, exactly inverting the mirror-first precedence design.md decision 5
|
|
1760
|
+
// makes load-bearing. `-z` is what actually turns quoting off for the whole class, and
|
|
1761
|
+
// `--name-only` DOES accept it (measured; the note this replaces claimed otherwise) — the same
|
|
1762
|
+
// fix the `status` half already carries.
|
|
1763
|
+
//
|
|
1764
|
+
// The file is reported DIRTY here (the plain `status` call), not only committed: T-79 stopped
|
|
1765
|
+
// treating a mirror path found ONLY in `<base>...HEAD` as this attempt's violation — that shape is
|
|
1766
|
+
// indistinguishable from a PRIOR close's own `mirror-regen` output, already sitting in the
|
|
1767
|
+
// branch's history (see the `describe` block below). A worker's hand-write is still caught because
|
|
1768
|
+
// it is dirty on the very attempt that made it, before any close ever commits it — so the quoting
|
|
1769
|
+
// defect this test guards against is exercised on the dirty half, the one still live for a worker.
|
|
1770
|
+
for (const mirrorPath of [
|
|
1771
|
+
'packages/cli/src/templates/monorepo/backend/src/café.ts',
|
|
1772
|
+
'packages/cli/src/templates/monorepo/backend/src/we"ird.ts',
|
|
1773
|
+
]) {
|
|
1774
|
+
it(`reads paths verbatim with -z, so a hand-written ${mirrorPath} stays a violation`, () => {
|
|
1775
|
+
const calls: string[][] = [];
|
|
1776
|
+
const result = runScopeCheck({
|
|
1777
|
+
lane: LANE.FRONTIER,
|
|
1778
|
+
declaredFiles: [],
|
|
1779
|
+
base: 'main',
|
|
1780
|
+
runGit: (args) => {
|
|
1781
|
+
calls.push(args);
|
|
1782
|
+
if (args[0] === 'diff') return '';
|
|
1783
|
+
if (args.includes('--ignored')) return '';
|
|
1784
|
+
return `?? ${mirrorPath}\0`;
|
|
1785
|
+
},
|
|
1786
|
+
});
|
|
1787
|
+
|
|
1788
|
+
assert.deepEqual(
|
|
1789
|
+
calls[0],
|
|
1790
|
+
['diff', '--name-only', '-z', 'main...HEAD'],
|
|
1791
|
+
'the diff must still be asked with -z',
|
|
1792
|
+
);
|
|
1793
|
+
assert.equal(result.ok, false, 'a dirty mirror path is a violation, never a soft mark');
|
|
1794
|
+
assert.deepEqual(result.humanReviewFiles, []);
|
|
1795
|
+
});
|
|
1796
|
+
}
|
|
1797
|
+
|
|
1798
|
+
// T-79: the incident this closes. Attempt 1 touched a mirrored root, so its close's `mirror-regen`
|
|
1799
|
+
// step committed the scaffold mirror into the branch (it can only have arrived there THROUGH a
|
|
1800
|
+
// close — the executor is forbidden from running `git` at all). Attempt 2 resumes on that same
|
|
1801
|
+
// branch and writes nothing new; its own `scope-check` must not re-litigate the previous close's
|
|
1802
|
+
// own output as if the worker had just written it by hand.
|
|
1803
|
+
it('T-79: a mirror file committed by a PRIOR close is not this attempt\'s violation', () => {
|
|
1804
|
+
const priorMirrorFile = 'packages/cli/src/templates/monorepo/scripts/backlog/dispatch.ts';
|
|
1805
|
+
// Acceptance criterion #3's exact shape: the branch carries the previous close's own commit
|
|
1806
|
+
// (the regenerated mirror) PLUS this attempt's own new work — this attempt only marked
|
|
1807
|
+
// acceptance criteria and ran the suite, no code, so its "own work" is a task-view edit left
|
|
1808
|
+
// dirty in the slot (`.backlog/` is not scope-checked, so any dirty leftover file stands in for
|
|
1809
|
+
// it here), never anything under the mirror prefix.
|
|
1810
|
+
const currentAttemptFile = 'backend/src/@app/some-bc/x.service.ts';
|
|
1811
|
+
const result = runScopeCheck({
|
|
1812
|
+
lane: LANE.FRONTIER,
|
|
1813
|
+
declaredFiles: [],
|
|
1814
|
+
base: 'main',
|
|
1815
|
+
runGit: (args) => {
|
|
1816
|
+
// Committed by attempt 1's close: present in the cumulative diff, absent from the working
|
|
1817
|
+
// tree — attempt 2 never touched it.
|
|
1818
|
+
if (args[0] === 'diff') return `${priorMirrorFile}\0`;
|
|
1819
|
+
if (args.includes('--ignored')) return '';
|
|
1820
|
+
// This attempt's own, still-uncommitted change.
|
|
1821
|
+
return `?? ${currentAttemptFile}\0`;
|
|
1822
|
+
},
|
|
1823
|
+
});
|
|
1824
|
+
|
|
1825
|
+
assert.equal(result.ok, true, "a retry must not be blocked by its own close's prior output");
|
|
1826
|
+
assert.deepEqual(result.humanReviewFiles, []);
|
|
1827
|
+
});
|
|
1828
|
+
|
|
1829
|
+
// The complement: a mirror file the CURRENT attempt commits nothing about but leaves DIRTY (a
|
|
1830
|
+
// worker writing to it by hand, undeclared and unauthorised on every lane) is still rejected —
|
|
1831
|
+
// T-79's acceptance criterion #2. Committed history is what earns the exemption, not mere presence.
|
|
1832
|
+
it('T-79: a mirror file the CURRENT attempt writes by hand (dirty) is still rejected', () => {
|
|
1833
|
+
const handWritten = 'packages/cli/src/templates/monorepo/scripts/backlog/rogue.ts';
|
|
1834
|
+
const result = runScopeCheck({
|
|
1835
|
+
lane: LANE.FRONTIER,
|
|
1836
|
+
declaredFiles: [],
|
|
1837
|
+
base: 'main',
|
|
1838
|
+
runGit: (args) => {
|
|
1839
|
+
if (args[0] === 'diff') return '';
|
|
1840
|
+
if (args.includes('--ignored')) return '';
|
|
1841
|
+
return `?? ${handWritten}\0`;
|
|
1842
|
+
},
|
|
1843
|
+
});
|
|
1844
|
+
|
|
1845
|
+
assert.equal(result.ok, false, 'a dirty mirror write is always a violation, on every lane');
|
|
1846
|
+
assert.equal(result.reason, 'scope-check-failed');
|
|
1847
|
+
assert.match(result.question ?? '', new RegExp(handWritten.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')));
|
|
1848
|
+
});
|
|
1849
|
+
|
|
1850
|
+
it("diffs against the parent branch for a subtask, so the parent's own commits are not the child's diff", () => {
|
|
1851
|
+
const calls: string[][] = [];
|
|
1852
|
+
runScopeCheck({
|
|
1853
|
+
lane: LANE.LOCAL,
|
|
1854
|
+
declaredFiles: [],
|
|
1855
|
+
base: 'task/T-10',
|
|
1856
|
+
runGit: (args) => {
|
|
1857
|
+
calls.push(args);
|
|
1858
|
+
return '';
|
|
1859
|
+
},
|
|
1860
|
+
});
|
|
1861
|
+
assert.deepEqual(calls[0], ['diff', '--name-only', '-z', 'task/T-10...HEAD']);
|
|
1862
|
+
});
|
|
1863
|
+
|
|
1864
|
+
it('catches an UNCOMMITTED out-of-scope file: the worker never commits, so HEAD alone proves nothing', () => {
|
|
1865
|
+
const result = runScopeCheck({
|
|
1866
|
+
lane: LANE.LOCAL,
|
|
1867
|
+
declaredFiles: ['scripts/backlog/close.ts'],
|
|
1868
|
+
base: 'main',
|
|
1869
|
+
runGit: (args) => (args[0] === 'diff' ? '' : ' M scripts/backlog/entry.ts\0'),
|
|
1870
|
+
});
|
|
1871
|
+
|
|
1872
|
+
assert.equal(result.ok, false);
|
|
1873
|
+
assert.match(result.question ?? '', /scripts\/backlog\/entry\.ts/);
|
|
1874
|
+
});
|
|
1875
|
+
|
|
1876
|
+
it('catches an untracked new file, which never shows up in a git diff at all', () => {
|
|
1877
|
+
const result = runScopeCheck({
|
|
1878
|
+
lane: LANE.LOCAL,
|
|
1879
|
+
declaredFiles: [],
|
|
1880
|
+
base: 'main',
|
|
1881
|
+
runGit: (args) => (args[0] === 'diff' ? '' : '?? backend/src/@app/o-auth/sneaky.ts\0'),
|
|
1882
|
+
});
|
|
1883
|
+
|
|
1884
|
+
assert.equal(result.ok, false);
|
|
1885
|
+
assert.match(result.question ?? '', /sneaky\.ts/);
|
|
1886
|
+
});
|
|
1887
|
+
|
|
1888
|
+
// J10: verbatim `status --porcelain -z --untracked-files=all` capture, measured in a scratch
|
|
1889
|
+
// repo — a rename is ONE entry carrying TWO NUL-separated paths, new first, source second. Read
|
|
1890
|
+
// as newline-separated lines, that source path came back as a phantom changed file of its own.
|
|
1891
|
+
it('reads the new path of a rename and drops the source path, which is not a changed file', () => {
|
|
1892
|
+
const result = runScopeCheck({
|
|
1893
|
+
lane: LANE.LOCAL,
|
|
1894
|
+
declaredFiles: ['new name.txt'],
|
|
1895
|
+
base: 'main',
|
|
1896
|
+
runGit: (args) => (args[0] === 'diff' ? '' : 'R new name.txt\0old.txt\0'),
|
|
1897
|
+
});
|
|
1898
|
+
|
|
1899
|
+
assert.deepEqual(result, { ok: true, humanReviewFiles: [] });
|
|
1900
|
+
});
|
|
1901
|
+
|
|
1902
|
+
// The whole measured capture at once: a modification, a rename, and an untracked file.
|
|
1903
|
+
it('parses a real -z capture: a path with a space survives whole, and every entry is read', () => {
|
|
1904
|
+
const result = runScopeCheck({
|
|
1905
|
+
lane: LANE.LOCAL,
|
|
1906
|
+
declaredFiles: [],
|
|
1907
|
+
base: 'main',
|
|
1908
|
+
runGit: (args) =>
|
|
1909
|
+
args[0] === 'diff' ? '' : ' M keep.txt\0R new name.txt\0old.txt\0?? untracked.txt\0',
|
|
1910
|
+
});
|
|
1911
|
+
|
|
1912
|
+
assert.equal(result.ok, false);
|
|
1913
|
+
assert.equal(
|
|
1914
|
+
result.question,
|
|
1915
|
+
'Ficheros fuera del alcance declarado: keep.txt, new name.txt, untracked.txt',
|
|
1916
|
+
);
|
|
1917
|
+
});
|
|
1918
|
+
|
|
1919
|
+
// A newline INSIDE a filename is what `-z` exists for: the line-based format quoted and escaped
|
|
1920
|
+
// such a path, so what the close compared against the allowlist was not the path on disk.
|
|
1921
|
+
it('keeps a filename containing a newline intact', () => {
|
|
1922
|
+
const result = runScopeCheck({
|
|
1923
|
+
lane: LANE.LOCAL,
|
|
1924
|
+
declaredFiles: [],
|
|
1925
|
+
base: 'main',
|
|
1926
|
+
runGit: (args) => (args[0] === 'diff' ? '' : '?? we\nird.ts\0'),
|
|
1927
|
+
});
|
|
1928
|
+
|
|
1929
|
+
assert.equal(result.ok, false);
|
|
1930
|
+
assert.equal(result.question, 'Ficheros fuera del alcance declarado: we\nird.ts');
|
|
1931
|
+
});
|
|
1932
|
+
|
|
1933
|
+
it('does not report the same file twice when it is both committed and dirty', () => {
|
|
1934
|
+
const result = runScopeCheck({
|
|
1935
|
+
lane: LANE.LOCAL,
|
|
1936
|
+
declaredFiles: [],
|
|
1937
|
+
base: 'main',
|
|
1938
|
+
runGit: (args) => (args[0] === 'diff' ? 'a.ts\0' : ' M a.ts\0'),
|
|
1939
|
+
});
|
|
1940
|
+
|
|
1941
|
+
assert.equal(result.ok, false);
|
|
1942
|
+
assert.equal(result.question, 'Ficheros fuera del alcance declarado: a.ts');
|
|
1943
|
+
});
|
|
1944
|
+
|
|
1945
|
+
it('names the violating files in the failure reason, so the Blocked comment says what went out of scope', () => {
|
|
1946
|
+
const result = runScopeCheck({
|
|
1947
|
+
lane: LANE.LOCAL,
|
|
1948
|
+
declaredFiles: ['scripts/backlog/close.ts'],
|
|
1949
|
+
base: 'main',
|
|
1950
|
+
runGit: (args) =>
|
|
1951
|
+
args[0] === 'diff'
|
|
1952
|
+
? 'scripts/backlog/close.ts\0backend/src/@app/o-auth/guard.ts\0'
|
|
1953
|
+
: '',
|
|
1954
|
+
});
|
|
1955
|
+
|
|
1956
|
+
assert.equal(result.ok, false);
|
|
1957
|
+
assert.match(result.reason ?? '', /scope/);
|
|
1958
|
+
assert.match(result.question ?? '', /backend\/src\/@app\/o-auth\/guard\.ts/);
|
|
1959
|
+
});
|
|
1960
|
+
|
|
1961
|
+
it('ignores empty entries in either git output rather than treating "" as a changed file', () => {
|
|
1962
|
+
const result = runScopeCheck({
|
|
1963
|
+
lane: LANE.LOCAL,
|
|
1964
|
+
declaredFiles: [],
|
|
1965
|
+
base: 'main',
|
|
1966
|
+
runGit: () => '\0\0',
|
|
1967
|
+
});
|
|
1968
|
+
assert.deepEqual(result, { ok: true, humanReviewFiles: [] });
|
|
1969
|
+
});
|
|
1970
|
+
|
|
1971
|
+
// T-31 round 3: the committed half used to `trim()` every entry, which silently rewrote exactly
|
|
1972
|
+
// the paths `-z` exists to preserve — and the `status` half never trimmed, so the two halves
|
|
1973
|
+
// disagreed about the same file. A leading or trailing space in a filename is legal, and the
|
|
1974
|
+
// string the path lists and the declared allowlist are compared against must be the path on disk.
|
|
1975
|
+
it('keeps a path with surrounding whitespace verbatim, like the status half already does', () => {
|
|
1976
|
+
const result = runScopeCheck({
|
|
1977
|
+
lane: LANE.LOCAL,
|
|
1978
|
+
declaredFiles: [' spaced.ts '],
|
|
1979
|
+
base: 'main',
|
|
1980
|
+
runGit: (args) => (args[0] === 'diff' ? ' spaced.ts \0' : ''),
|
|
1981
|
+
});
|
|
1982
|
+
assert.deepEqual(result, { ok: true, humanReviewFiles: [] });
|
|
1983
|
+
});
|
|
1984
|
+
|
|
1985
|
+
it('fails closed when git itself fails: an unverifiable diff is not a passing scope check', () => {
|
|
1986
|
+
const result = runScopeCheck({
|
|
1987
|
+
lane: LANE.LOCAL,
|
|
1988
|
+
declaredFiles: [],
|
|
1989
|
+
base: 'main',
|
|
1990
|
+
runGit: () => {
|
|
1991
|
+
throw new Error('fatal: bad revision');
|
|
1992
|
+
},
|
|
1993
|
+
});
|
|
1994
|
+
|
|
1995
|
+
assert.equal(result.ok, false);
|
|
1996
|
+
assert.match(result.reason ?? '', /scope/);
|
|
1997
|
+
});
|
|
1998
|
+
|
|
1999
|
+
// T-49: `packages/cli/.gitignore` hides `dist/`, and `packages/cli/bin/run.js` LOADS `dist/`, not
|
|
2000
|
+
// `src/`. Before this fix neither git read carried `--ignored`, so a worker writing straight into
|
|
2001
|
+
// `packages/cli/dist/commands/**` and running it left a clean diff — no scope-check hit, no
|
|
2002
|
+
// human-review mark, no trace in a `Blocked` comment. This is the same soft classification a
|
|
2003
|
+
// TRACKED `packages/cli/` file already gets (`HUMAN_REVIEW_PATHS`), which is why a legitimate
|
|
2004
|
+
// `pnpm cli:build` (also writing under `packages/cli/dist`) does not fail the attempt either.
|
|
2005
|
+
it('marks a write under the gitignored packages/cli/dist for human review, never a hard failure', () => {
|
|
2006
|
+
const result = runScopeCheck({
|
|
2007
|
+
lane: LANE.FRONTIER,
|
|
2008
|
+
declaredFiles: [],
|
|
2009
|
+
base: 'main',
|
|
2010
|
+
runGit: (args) =>
|
|
2011
|
+
args[0] === 'diff'
|
|
2012
|
+
? ''
|
|
2013
|
+
: args.includes('--ignored')
|
|
2014
|
+
? '!! packages/cli/dist/commands/generate.js\0'
|
|
2015
|
+
: '',
|
|
2016
|
+
});
|
|
2017
|
+
|
|
2018
|
+
assert.deepEqual(result, {
|
|
2019
|
+
ok: true,
|
|
2020
|
+
humanReviewFiles: ['packages/cli/dist/commands/generate.js'],
|
|
2021
|
+
});
|
|
2022
|
+
});
|
|
2023
|
+
});
|
|
2024
|
+
|
|
2025
|
+
// T-75: `pnpm cli:build` writes `packages/cli/dist/templates/`, a gitignored COPY of the packager's
|
|
2026
|
+
// scaffold (distinct from `MIRROR_OUTPUT_PREFIXES`, `packages/cli/src/templates/{backend,frontend,
|
|
2027
|
+
// monorepo}/`, the committed SOURCE mirror). Before this fix, `matchesAnyPathPattern`/
|
|
2028
|
+
// `matchesBasename` compared by substring/basename, so
|
|
2029
|
+
// `packages/cli/dist/templates/monorepo/package.json` matched the hard
|
|
2030
|
+
// `package.json` entry and `.../CLAUDE.md` matched `SLOT_EXECUTED_BASENAMES` — even though neither
|
|
2031
|
+
// file is the repo's own `package.json` or `CLAUDE.md`, and `templates/` is never executed inside the
|
|
2032
|
+
// slot. Measured incident: T-73's close failed `scope-check-failed` on ~55 such files despite a
|
|
2033
|
+
// correct diff, 1930 green tests and an APPROVED review.
|
|
2034
|
+
describe('checkScope — packages/cli/dist/templates/ is inert build output, not a hard violation', () => {
|
|
2035
|
+
for (const lane of [LANE.LOCAL, LANE.FRONTIER] as const) {
|
|
2036
|
+
it(`${lane}: a package.json under packages/cli/dist/templates/ is admitted, not a hard violation`, () => {
|
|
2037
|
+
const file = 'packages/cli/dist/templates/monorepo/package.json';
|
|
2038
|
+
const result = checkScope({ lane, changedFiles: [file], declaredFiles: [file] });
|
|
2039
|
+
assert.equal(result.ok, true, 'a scaffold copy is not the repo\'s own package.json');
|
|
2040
|
+
assert.deepEqual(result.violatingFiles, []);
|
|
2041
|
+
assert.deepEqual(result.humanReviewFiles, [file], 'still a packages/cli/ soft-list file');
|
|
2042
|
+
});
|
|
2043
|
+
|
|
2044
|
+
it(`${lane}: a CLAUDE.md under packages/cli/dist/templates/ is admitted, not a hard violation`, () => {
|
|
2045
|
+
const file = 'packages/cli/dist/templates/monorepo/CLAUDE.md';
|
|
2046
|
+
const result = checkScope({ lane, changedFiles: [file], declaredFiles: [file] });
|
|
2047
|
+
assert.equal(result.ok, true, 'a scaffold copy is not the repo\'s own instruction file');
|
|
2048
|
+
assert.deepEqual(result.violatingFiles, []);
|
|
2049
|
+
assert.deepEqual(result.humanReviewFiles, [file], 'still a packages/cli/ soft-list file');
|
|
2050
|
+
});
|
|
2051
|
+
|
|
2052
|
+
// AC #2: the exemption is scoped to `templates/` alone — `packages/cli/bin/run.js` loads the
|
|
2053
|
+
// REST of `dist/` (T-49), so a hard-list name reappearing there must still be caught.
|
|
2054
|
+
it(`${lane}: a package.json under packages/cli/dist/ OUTSIDE templates/ still hard-violates`, () => {
|
|
2055
|
+
const file = 'packages/cli/dist/commands/package.json';
|
|
2056
|
+
const result = checkScope({ lane, changedFiles: [file], declaredFiles: [file] });
|
|
2057
|
+
assert.equal(result.ok, false, 'only templates/ is exempted, not the rest of dist/');
|
|
2058
|
+
assert.deepEqual(result.violatingFiles, [file]);
|
|
2059
|
+
});
|
|
2060
|
+
}
|
|
2061
|
+
|
|
2062
|
+
// AC #4: the hard list still blocks the repo's own package.json/CLAUDE.md, root or workspace,
|
|
2063
|
+
// anywhere OUTSIDE the exempted prefix.
|
|
2064
|
+
for (const file of ['package.json', 'backend/package.json', 'CLAUDE.md', 'backend/CLAUDE.md']) {
|
|
2065
|
+
it(`frontier: ${file} outside packages/cli/dist/templates/ still hard-violates`, () => {
|
|
2066
|
+
const result = checkScope({ lane: LANE.FRONTIER, changedFiles: [file], declaredFiles: [file] });
|
|
2067
|
+
assert.equal(result.ok, false);
|
|
2068
|
+
assert.deepEqual(result.violatingFiles, [file]);
|
|
2069
|
+
});
|
|
2070
|
+
}
|
|
2071
|
+
});
|
|
2072
|
+
|
|
2073
|
+
// ── collectLeftoverFiles (T-31 round 4) ───────────────────────────────────────
|
|
2074
|
+
//
|
|
2075
|
+
// The record the FAILURE path leaves when no scope check ever ran. Round 3 filtered the leftover
|
|
2076
|
+
// tree through the SOFT list alone, which both misreported and under-reported: a mirror-output path
|
|
2077
|
+
// — refused on both lanes by three documents — was named as a soft-list file the close admits, and
|
|
2078
|
+
// `.claude/settings.json`, which the retry restores into the slot from `task/<id>`, was named
|
|
2079
|
+
// nowhere at all. The record now classifies with the SAME per-file order `checkScope` uses, from the
|
|
2080
|
+
// same function, so the two cannot disagree by construction.
|
|
2081
|
+
|
|
2082
|
+
describe('collectLeftoverFiles', () => {
|
|
2083
|
+
// Reports every file as DIRTY (untracked), not merely committed: `collectLeftoverFiles` runs on
|
|
2084
|
+
// paths that reach a session-level failure or `board-check` BEFORE this attempt's close has ever
|
|
2085
|
+
// committed anything, so its own leftovers are realistically uncommitted — and (T-79) only a
|
|
2086
|
+
// DIRTY mirror path is this attempt's own doing; one found solely in `<base>...HEAD` is a prior
|
|
2087
|
+
// close's own `mirror-regen` output, which `runGit` here never produces on its own.
|
|
2088
|
+
const gitAnswering = (changed: readonly string[]) => (args: string[]) =>
|
|
2089
|
+
args[0] === 'diff'
|
|
2090
|
+
? `${changed.join('\0')}\0`
|
|
2091
|
+
: args.includes('--ignored')
|
|
2092
|
+
? ''
|
|
2093
|
+
: `${changed.map((file) => `?? ${file}`).join('\0')}\0`;
|
|
2094
|
+
|
|
2095
|
+
const MIRROR_PATH = 'packages/cli/src/templates/monorepo/scripts/backlog/close.ts';
|
|
2096
|
+
|
|
2097
|
+
it('reports the mirror output as a VIOLATION, never as a soft-list file the close admits', () => {
|
|
2098
|
+
const record = collectLeftoverFiles({
|
|
2099
|
+
lane: LANE.FRONTIER,
|
|
2100
|
+
base: 'origin/main',
|
|
2101
|
+
runGit: gitAnswering([MIRROR_PATH]),
|
|
2102
|
+
});
|
|
2103
|
+
|
|
2104
|
+
assert.deepEqual(record.forbiddenFiles, [MIRROR_PATH]);
|
|
2105
|
+
assert.deepEqual(record.humanReviewFiles, []);
|
|
2106
|
+
});
|
|
2107
|
+
|
|
2108
|
+
// T-79: the record must agree with the check's own exemption — a mirror file that is ONLY in the
|
|
2109
|
+
// committed diff, never dirty, is a prior close's own output, not something this attempt left
|
|
2110
|
+
// behind. Naming it as a leftover to clean up would be exactly as wrong as `scope-check` failing
|
|
2111
|
+
// the retry over it.
|
|
2112
|
+
it('T-79: does not report a mirror file committed by a PRIOR close as a leftover', () => {
|
|
2113
|
+
const record = collectLeftoverFiles({
|
|
2114
|
+
lane: LANE.FRONTIER,
|
|
2115
|
+
base: 'origin/main',
|
|
2116
|
+
runGit: (args) => (args[0] === 'diff' ? `${MIRROR_PATH}\0` : ''),
|
|
2117
|
+
});
|
|
2118
|
+
|
|
2119
|
+
assert.deepEqual(record.forbiddenFiles, []);
|
|
2120
|
+
assert.deepEqual(record.humanReviewFiles, []);
|
|
2121
|
+
});
|
|
2122
|
+
|
|
2123
|
+
it('reports a hard-list file the retry would restore, instead of saying nothing about it', () => {
|
|
2124
|
+
const record = collectLeftoverFiles({
|
|
2125
|
+
lane: LANE.FRONTIER,
|
|
2126
|
+
base: 'origin/main',
|
|
2127
|
+
runGit: gitAnswering(['.claude/settings.json', 'CLAUDE.md']),
|
|
2128
|
+
});
|
|
2129
|
+
|
|
2130
|
+
assert.deepEqual(record.forbiddenFiles, ['.claude/settings.json', 'CLAUDE.md']);
|
|
2131
|
+
assert.deepEqual(record.humanReviewFiles, []);
|
|
2132
|
+
});
|
|
2133
|
+
|
|
2134
|
+
it('splits a MIXED tree into the two kinds, each in exactly one bucket', () => {
|
|
2135
|
+
const record = collectLeftoverFiles({
|
|
2136
|
+
lane: LANE.FRONTIER,
|
|
2137
|
+
base: 'origin/main',
|
|
2138
|
+
runGit: gitAnswering([
|
|
2139
|
+
MIRROR_PATH,
|
|
2140
|
+
'.claude/settings.json',
|
|
2141
|
+
'backend/src/@app/iam/x.ts',
|
|
2142
|
+
'scripts/backlog/close.ts',
|
|
2143
|
+
'packages/cli/src/generator/emit.ts',
|
|
2144
|
+
]),
|
|
2145
|
+
});
|
|
2146
|
+
|
|
2147
|
+
assert.deepEqual(record.forbiddenFiles, [
|
|
2148
|
+
MIRROR_PATH,
|
|
2149
|
+
'.claude/settings.json',
|
|
2150
|
+
'scripts/backlog/close.ts',
|
|
2151
|
+
]);
|
|
2152
|
+
assert.deepEqual(record.humanReviewFiles, ['packages/cli/src/generator/emit.ts']);
|
|
2153
|
+
});
|
|
2154
|
+
|
|
2155
|
+
// The point of sharing the classification: for the same tree, what the record calls forbidden is
|
|
2156
|
+
// exactly what the verdict calls violating (on the frontier lane, where no declaration rule
|
|
2157
|
+
// applies), and what it calls soft is what the verdict would have admitted.
|
|
2158
|
+
it('agrees with checkScope on the same tree, both kinds', () => {
|
|
2159
|
+
const changed = [MIRROR_PATH, '.claude/settings.json', 'packages/cli/src/generator/emit.ts'];
|
|
2160
|
+
const record = collectLeftoverFiles({
|
|
2161
|
+
lane: LANE.FRONTIER,
|
|
2162
|
+
base: 'origin/main',
|
|
2163
|
+
runGit: gitAnswering(changed),
|
|
2164
|
+
});
|
|
2165
|
+
const verdict = checkScope({ lane: LANE.FRONTIER, changedFiles: changed, declaredFiles: [] });
|
|
2166
|
+
|
|
2167
|
+
assert.deepEqual(record.forbiddenFiles, verdict.violatingFiles);
|
|
2168
|
+
assert.deepEqual(record.humanReviewFiles, ['packages/cli/src/generator/emit.ts']);
|
|
2169
|
+
});
|
|
2170
|
+
|
|
2171
|
+
// `scripts/backlog/` is supervised-only (guard 1e): the close refuses it on BOTH lanes, so a
|
|
2172
|
+
// leftover under it is forbidden regardless of which lane left it behind — never the soft bucket.
|
|
2173
|
+
for (const lane of [LANE.LOCAL, LANE.FRONTIER]) {
|
|
2174
|
+
it(`${lane}: reports a scripts/backlog/ leftover as forbidden, never soft`, () => {
|
|
2175
|
+
const record = collectLeftoverFiles({
|
|
2176
|
+
lane,
|
|
2177
|
+
base: 'origin/main',
|
|
2178
|
+
runGit: gitAnswering(['scripts/backlog/close.ts']),
|
|
2179
|
+
});
|
|
2180
|
+
|
|
2181
|
+
assert.deepEqual(record.forbiddenFiles, ['scripts/backlog/close.ts']);
|
|
2182
|
+
assert.deepEqual(record.humanReviewFiles, []);
|
|
2183
|
+
});
|
|
2184
|
+
}
|
|
2185
|
+
|
|
2186
|
+
// The local lane refuses three path extras the frontier lane does not (`scripts/`, `.claude/`,
|
|
2187
|
+
// `.git/`), so the same leftover tree is classified differently there — by the same function
|
|
2188
|
+
// `checkScope` asks, never by a second opinion. An ORDINARY `scripts/` file (never on the soft
|
|
2189
|
+
// list at all) is what demonstrates this: it fails on the local lane by that extra alone, and
|
|
2190
|
+
// passes clean on the frontier lane, which has no such extra.
|
|
2191
|
+
it('applies the local lane own extras, so an ordinary scripts/ file is forbidden there but not on the frontier lane', () => {
|
|
2192
|
+
const record = collectLeftoverFiles({
|
|
2193
|
+
lane: LANE.LOCAL,
|
|
2194
|
+
base: 'origin/main',
|
|
2195
|
+
runGit: gitAnswering(['scripts/bump-version.ts', 'packages/cli/src/generator/emit.ts']),
|
|
2196
|
+
});
|
|
2197
|
+
|
|
2198
|
+
assert.deepEqual(record.forbiddenFiles, ['scripts/bump-version.ts']);
|
|
2199
|
+
assert.deepEqual(record.humanReviewFiles, ['packages/cli/src/generator/emit.ts']);
|
|
2200
|
+
});
|
|
2201
|
+
|
|
2202
|
+
it('reads the slot changes with the exact argv the scope check uses, base included', () => {
|
|
2203
|
+
const calls: string[][] = [];
|
|
2204
|
+
collectLeftoverFiles({
|
|
2205
|
+
lane: LANE.FRONTIER,
|
|
2206
|
+
base: 'origin/task/T-10',
|
|
2207
|
+
runGit: (args) => {
|
|
2208
|
+
calls.push(args);
|
|
2209
|
+
return '';
|
|
2210
|
+
},
|
|
2211
|
+
});
|
|
2212
|
+
|
|
2213
|
+
assert.deepEqual(calls[0], ['diff', '--name-only', '-z', 'origin/task/T-10...HEAD']);
|
|
2214
|
+
assert.deepEqual(calls[1], ['status', '--porcelain', '-z', '--untracked-files=all']);
|
|
2215
|
+
});
|
|
2216
|
+
});
|
|
2217
|
+
|
|
2218
|
+
describe('buildPrCreateArgs', () => {
|
|
2219
|
+
it('targets main for a top-level task', () => {
|
|
2220
|
+
assert.deepEqual(
|
|
2221
|
+
buildPrCreateArgs({ task: baseTask(), branch: 'task/T-12', attempt: 1, title: 'T-12' }),
|
|
2222
|
+
[
|
|
2223
|
+
'pr',
|
|
2224
|
+
'create',
|
|
2225
|
+
'--base',
|
|
2226
|
+
'main',
|
|
2227
|
+
'--head',
|
|
2228
|
+
'task/T-12',
|
|
2229
|
+
'--title',
|
|
2230
|
+
'T-12',
|
|
2231
|
+
'--body',
|
|
2232
|
+
'Dispatched attempt 1 for T-12.',
|
|
2233
|
+
],
|
|
2234
|
+
);
|
|
2235
|
+
});
|
|
2236
|
+
|
|
2237
|
+
it("targets the parent's branch for a subtask (the parent's own PR is what reaches main)", () => {
|
|
2238
|
+
const args = buildPrCreateArgs({
|
|
2239
|
+
task: baseTask({ parentId: 'T-10' }),
|
|
2240
|
+
branch: 'task/T-12',
|
|
2241
|
+
attempt: 2,
|
|
2242
|
+
title: 'T-12',
|
|
2243
|
+
});
|
|
2244
|
+
const baseIndex = args.indexOf('--base');
|
|
2245
|
+
assert.equal(args[baseIndex + 1], 'task/T-10');
|
|
2246
|
+
});
|
|
2247
|
+
|
|
2248
|
+
// T-8 point 2: with a `taskText` to compose from, the body is `composePrBody`'s rich body, not
|
|
2249
|
+
// the old one-liner.
|
|
2250
|
+
it('composes the rich body from taskText when one is given, instead of the bare one-liner', () => {
|
|
2251
|
+
const taskText = [
|
|
2252
|
+
'Task T-12 - Fix session expiry redirect',
|
|
2253
|
+
'==================================================',
|
|
2254
|
+
'',
|
|
2255
|
+
'Status: In Progress',
|
|
2256
|
+
'',
|
|
2257
|
+
'Description:',
|
|
2258
|
+
'--------------------------------------------------',
|
|
2259
|
+
'Users are bounced to /login with no message when the session token expires.',
|
|
2260
|
+
'',
|
|
2261
|
+
'Acceptance Criteria:',
|
|
2262
|
+
'--------------------------------------------------',
|
|
2263
|
+
'- [x] #1 Expired-token requests redirect to /login with a visible message',
|
|
2264
|
+
'',
|
|
2265
|
+
].join('\n');
|
|
2266
|
+
const args = buildPrCreateArgs({
|
|
2267
|
+
task: baseTask(),
|
|
2268
|
+
branch: 'task/T-12',
|
|
2269
|
+
attempt: 1,
|
|
2270
|
+
title: 'T-12: Fix session expiry redirect',
|
|
2271
|
+
taskText,
|
|
2272
|
+
});
|
|
2273
|
+
const body = args[args.indexOf('--body') + 1];
|
|
2274
|
+
assert.notEqual(body, 'Dispatched attempt 1 for T-12.');
|
|
2275
|
+
assert.match(body, /Users are bounced to \/login/);
|
|
2276
|
+
assert.match(body, /Expired-token requests redirect to \/login/);
|
|
2277
|
+
});
|
|
2278
|
+
|
|
2279
|
+
// T-31: the mark's unfailable half — a section in the body naming the soft-list files, applied
|
|
2280
|
+
// as part of `gh pr create` itself.
|
|
2281
|
+
it('names the soft-list files in the body when the scope check reported humanReviewFiles', () => {
|
|
2282
|
+
const taskText = [
|
|
2283
|
+
'Task T-12 - Fix session expiry redirect',
|
|
2284
|
+
'==================================================',
|
|
2285
|
+
'',
|
|
2286
|
+
'Status: In Progress',
|
|
2287
|
+
'',
|
|
2288
|
+
].join('\n');
|
|
2289
|
+
const args = buildPrCreateArgs({
|
|
2290
|
+
task: baseTask(),
|
|
2291
|
+
branch: 'task/T-12',
|
|
2292
|
+
attempt: 1,
|
|
2293
|
+
title: 'T-12',
|
|
2294
|
+
taskText,
|
|
2295
|
+
humanReviewFiles: ['scripts/backlog/close.ts'],
|
|
2296
|
+
});
|
|
2297
|
+
const body = args[args.indexOf('--body') + 1];
|
|
2298
|
+
assert.match(body, /scripts\/backlog\/close\.ts/);
|
|
2299
|
+
});
|
|
2300
|
+
|
|
2301
|
+
it('emits nothing extra when no humanReviewFiles are given', () => {
|
|
2302
|
+
const args = buildPrCreateArgs({
|
|
2303
|
+
task: baseTask(),
|
|
2304
|
+
branch: 'task/T-12',
|
|
2305
|
+
attempt: 1,
|
|
2306
|
+
title: 'T-12',
|
|
2307
|
+
});
|
|
2308
|
+
assert.equal(
|
|
2309
|
+
args[args.indexOf('--body') + 1],
|
|
2310
|
+
'Dispatched attempt 1 for T-12.',
|
|
2311
|
+
'the legacy one-liner must stay exactly as it was with no mark to add',
|
|
2312
|
+
);
|
|
2313
|
+
});
|
|
2314
|
+
});
|
|
2315
|
+
|
|
2316
|
+
// ── composePrBody (T-8 point 2) ────────────────────────────────────────────────
|
|
2317
|
+
|
|
2318
|
+
describe('composePrBody', () => {
|
|
2319
|
+
const view = (overrides: { description?: string; notes?: string; ac?: string[] } = {}): string =>
|
|
2320
|
+
[
|
|
2321
|
+
'Task T-12 - Fix session expiry redirect',
|
|
2322
|
+
'==================================================',
|
|
2323
|
+
'',
|
|
2324
|
+
'Status: In Progress',
|
|
2325
|
+
'',
|
|
2326
|
+
'Description:',
|
|
2327
|
+
'--------------------------------------------------',
|
|
2328
|
+
overrides.description ?? 'Users are bounced to /login with no message on expiry.',
|
|
2329
|
+
'',
|
|
2330
|
+
'Acceptance Criteria:',
|
|
2331
|
+
'--------------------------------------------------',
|
|
2332
|
+
...(overrides.ac ?? ['- [x] #1 AC one', '- [ ] #2 AC two']),
|
|
2333
|
+
'',
|
|
2334
|
+
...(overrides.notes
|
|
2335
|
+
? [
|
|
2336
|
+
'Implementation Notes:',
|
|
2337
|
+
'--------------------------------------------------',
|
|
2338
|
+
overrides.notes,
|
|
2339
|
+
'',
|
|
2340
|
+
]
|
|
2341
|
+
: []),
|
|
2342
|
+
].join('\n');
|
|
2343
|
+
|
|
2344
|
+
it('carries the title, the description, the AC with their checked state, and the attempt count', () => {
|
|
2345
|
+
const body = composePrBody({
|
|
2346
|
+
title: 'T-12: Fix session expiry redirect',
|
|
2347
|
+
taskId: 'T-12',
|
|
2348
|
+
taskText: view(),
|
|
2349
|
+
attempt: 1,
|
|
2350
|
+
});
|
|
2351
|
+
// Anchored to the exact H1 line: `title` here is already the COMPOSED PR title (as every real
|
|
2352
|
+
// caller passes it — see `buildPrCreateArgs`), so a loose substring match
|
|
2353
|
+
// (`/T-12: Fix session expiry redirect/`) would also pass on the doubled defect-6 heading
|
|
2354
|
+
// `# T-12: T-12: Fix session expiry redirect`, since that string still contains the substring.
|
|
2355
|
+
assert.match(body, /^# T-12: Fix session expiry redirect$/m);
|
|
2356
|
+
assert.match(body, /Users are bounced to \/login with no message on expiry\./);
|
|
2357
|
+
assert.match(body, /\[x\].*AC one/);
|
|
2358
|
+
assert.match(body, /\[ \].*AC two/);
|
|
2359
|
+
// Anchored to the attempt-statistics section itself, always the body's last section — a bare
|
|
2360
|
+
// `/1/` match is tautological here: "T-12" itself contains a "1", so it passed even with the
|
|
2361
|
+
// whole "## Estadísticas del intento" section deleted.
|
|
2362
|
+
assert.ok(body.endsWith('## Estadísticas del intento\n\nIntento 1.'));
|
|
2363
|
+
});
|
|
2364
|
+
|
|
2365
|
+
it('includes implementation notes when the worker left any', () => {
|
|
2366
|
+
const body = composePrBody({
|
|
2367
|
+
title: 'T-12',
|
|
2368
|
+
taskId: 'T-12',
|
|
2369
|
+
taskText: view({ notes: 'Switched the guard to compare against the refreshed token.' }),
|
|
2370
|
+
attempt: 2,
|
|
2371
|
+
});
|
|
2372
|
+
assert.match(body, /Switched the guard to compare against the refreshed token\./);
|
|
2373
|
+
});
|
|
2374
|
+
|
|
2375
|
+
it('omits the implementation-notes section entirely when the worker left none', () => {
|
|
2376
|
+
const body = composePrBody({ title: 'T-12', taskId: 'T-12', taskText: view(), attempt: 1 });
|
|
2377
|
+
assert.doesNotMatch(body, /Notas de implementaci[oó]n/i);
|
|
2378
|
+
});
|
|
2379
|
+
|
|
2380
|
+
// T-8 defect 13: Implementation Notes is WORKER-authored prose, written mid-run with no length
|
|
2381
|
+
// limit of its own, spliced into a PUBLIC PR body. Reuses `sanitizeCommentBody` — the same
|
|
2382
|
+
// discipline the module already applies to the `Blocked` comment — rather than a second cap.
|
|
2383
|
+
it('caps very long implementation notes instead of splicing worker-authored prose unbounded (defect 13)', () => {
|
|
2384
|
+
const longNotes = 'x'.repeat(5000);
|
|
2385
|
+
const body = composePrBody({
|
|
2386
|
+
title: 'T-12',
|
|
2387
|
+
taskId: 'T-12',
|
|
2388
|
+
taskText: view({ notes: longNotes }),
|
|
2389
|
+
attempt: 1,
|
|
2390
|
+
});
|
|
2391
|
+
assert.ok(
|
|
2392
|
+
!body.includes(longNotes),
|
|
2393
|
+
'the raw 5000-char notes must not reach the PR body whole',
|
|
2394
|
+
);
|
|
2395
|
+
assert.match(body, /\(truncado; ver las notas completas en el tablero\)/);
|
|
2396
|
+
});
|
|
2397
|
+
|
|
2398
|
+
it('strips a standalone --- line inside implementation notes, same as every other comment body', () => {
|
|
2399
|
+
const body = composePrBody({
|
|
2400
|
+
title: 'T-12',
|
|
2401
|
+
taskId: 'T-12',
|
|
2402
|
+
taskText: view({ notes: 'Switched the guard.\n---\nAlso removed the stale env flag.' }),
|
|
2403
|
+
attempt: 1,
|
|
2404
|
+
});
|
|
2405
|
+
assert.doesNotMatch(body, /^-{3,}$/m);
|
|
2406
|
+
assert.match(body, /Switched the guard\./);
|
|
2407
|
+
assert.match(body, /Also removed the stale env flag\./);
|
|
2408
|
+
});
|
|
2409
|
+
|
|
2410
|
+
it('carries attempt statistics, including the cap when one is given', () => {
|
|
2411
|
+
const body = composePrBody({
|
|
2412
|
+
title: 'T-12',
|
|
2413
|
+
taskId: 'T-12',
|
|
2414
|
+
taskText: view(),
|
|
2415
|
+
attempt: 2,
|
|
2416
|
+
maxAttempts: 3,
|
|
2417
|
+
});
|
|
2418
|
+
// Anchored to the section itself: the loose `/2/` this replaced was tautological — "T-12"
|
|
2419
|
+
// itself contains a "2", so it passed even with the whole attempt-statistics section deleted.
|
|
2420
|
+
// `/3/` alone was the only load-bearing half, since no other "3" appears anywhere in the body.
|
|
2421
|
+
assert.ok(body.endsWith('## Estadísticas del intento\n\nIntento 2 de 3.'));
|
|
2422
|
+
});
|
|
2423
|
+
|
|
2424
|
+
// F7 (2026-09-08): the previous assertions here (`typeof body === 'string'` and `body.length >
|
|
2425
|
+
// 0`) passed even with BOTH fallback strings below deleted from `composePrBody` — `# ${heading}`
|
|
2426
|
+
// is pushed unconditionally, so any non-empty heading alone satisfies them. Anchored to the two
|
|
2427
|
+
// fallbacks themselves, the exact behaviour this test claims to cover.
|
|
2428
|
+
it('degrades gracefully when the task declares no description and no AC at all', () => {
|
|
2429
|
+
const bareText = [
|
|
2430
|
+
'Task T-12 - Bare task',
|
|
2431
|
+
'==================================================',
|
|
2432
|
+
'',
|
|
2433
|
+
'Status: In Progress',
|
|
2434
|
+
'',
|
|
2435
|
+
].join('\n');
|
|
2436
|
+
const body = composePrBody({ title: 'T-12', taskId: 'T-12', taskText: bareText, attempt: 1 });
|
|
2437
|
+
assert.match(body, /\(la tarea no declara descripción\)/);
|
|
2438
|
+
assert.match(body, /\(sin criterios de aceptación declarados\)/);
|
|
2439
|
+
});
|
|
2440
|
+
|
|
2441
|
+
it('falls back to the bare task id when no title is given', () => {
|
|
2442
|
+
const body = composePrBody({ title: null, taskId: 'T-12', taskText: view(), attempt: 1 });
|
|
2443
|
+
assert.match(body, /T-12/);
|
|
2444
|
+
});
|
|
2445
|
+
|
|
2446
|
+
// T-31: the human-review mark's unfailable half.
|
|
2447
|
+
it('names every soft-list file under its own section when humanReviewFiles is given', () => {
|
|
2448
|
+
const body = composePrBody({
|
|
2449
|
+
title: 'T-12',
|
|
2450
|
+
taskId: 'T-12',
|
|
2451
|
+
taskText: view(),
|
|
2452
|
+
attempt: 1,
|
|
2453
|
+
humanReviewFiles: ['scripts/backlog/close.ts', 'packages/cli/src/generator.ts'],
|
|
2454
|
+
});
|
|
2455
|
+
assert.match(body, /scripts\/backlog\/close\.ts/);
|
|
2456
|
+
assert.match(body, /packages\/cli\/src\/generator\.ts/);
|
|
2457
|
+
});
|
|
2458
|
+
|
|
2459
|
+
it('adds no human-review section at all when humanReviewFiles is empty or omitted', () => {
|
|
2460
|
+
const withEmpty = composePrBody({
|
|
2461
|
+
title: 'T-12',
|
|
2462
|
+
taskId: 'T-12',
|
|
2463
|
+
taskText: view(),
|
|
2464
|
+
attempt: 1,
|
|
2465
|
+
humanReviewFiles: [],
|
|
2466
|
+
});
|
|
2467
|
+
const withOmitted = composePrBody({
|
|
2468
|
+
title: 'T-12',
|
|
2469
|
+
taskId: 'T-12',
|
|
2470
|
+
taskText: view(),
|
|
2471
|
+
attempt: 1,
|
|
2472
|
+
});
|
|
2473
|
+
assert.doesNotMatch(withEmpty, /[Rr]evisión humana/);
|
|
2474
|
+
assert.doesNotMatch(withOmitted, /[Rr]evisión humana/);
|
|
2475
|
+
});
|
|
2476
|
+
|
|
2477
|
+
// T-31 round 2: the section's prose used to spell out the soft-list membership by hand
|
|
2478
|
+
// ("dispatcher, generador o `CLAUDE.md`"), which went stale the moment `CLAUDE.md` went back to
|
|
2479
|
+
// hard. It is rendered from `HUMAN_REVIEW_PATHS` instead, so the list and the sentence cannot
|
|
2480
|
+
// disagree again.
|
|
2481
|
+
it('renders the soft-list membership from HUMAN_REVIEW_PATHS, never from hand-written prose', () => {
|
|
2482
|
+
const body = composePrBody({
|
|
2483
|
+
title: 'T-12',
|
|
2484
|
+
taskId: 'T-12',
|
|
2485
|
+
taskText: view(),
|
|
2486
|
+
attempt: 1,
|
|
2487
|
+
humanReviewFiles: ['scripts/backlog/close.ts'],
|
|
2488
|
+
});
|
|
2489
|
+
for (const pattern of HUMAN_REVIEW_PATHS) {
|
|
2490
|
+
assert.ok(body.includes(pattern), `the section must name the soft entry ${pattern}`);
|
|
2491
|
+
}
|
|
2492
|
+
assert.doesNotMatch(body, /CLAUDE\.md/);
|
|
2493
|
+
});
|
|
2494
|
+
|
|
2495
|
+
// T-8 point 13's discipline, applied to the other worker-influenced list this body splices: the
|
|
2496
|
+
// file list comes from the attempt's own diff, so a wide refactor under `packages/cli/` produces
|
|
2497
|
+
// hundreds of entries in a PUBLIC body and in the `gh` argv. The sibling notes section is capped
|
|
2498
|
+
// through `sanitizeCommentBody` for exactly that reason.
|
|
2499
|
+
it('caps the soft-list file list and says how many it dropped', () => {
|
|
2500
|
+
const many = Array.from({ length: 120 }, (_, index) => `packages/cli/src/f${index}.ts`);
|
|
2501
|
+
const body = composePrBody({
|
|
2502
|
+
title: 'T-12',
|
|
2503
|
+
taskId: 'T-12',
|
|
2504
|
+
taskText: view(),
|
|
2505
|
+
attempt: 1,
|
|
2506
|
+
humanReviewFiles: many,
|
|
2507
|
+
});
|
|
2508
|
+
assert.ok(body.includes('packages/cli/src/f0.ts'));
|
|
2509
|
+
assert.ok(!body.includes('packages/cli/src/f119.ts'), 'the tail must be dropped, not spliced');
|
|
2510
|
+
assert.match(body, /y \d+ ficheros más/);
|
|
2511
|
+
});
|
|
2512
|
+
|
|
2513
|
+
// T-31 round 3. The paths come VERBATIM from `git diff -z`, so every byte a filename may legally
|
|
2514
|
+
// hold reaches this splice: `<`, `>`, a newline, a control character. A path holding the literal
|
|
2515
|
+
// END marker put a second copy of that marker INSIDE the list, so the first `indexOf(END)` in
|
|
2516
|
+
// `upsertHumanReviewSection` landed mid-list and the next rewrite sliced at the wrong offset —
|
|
2517
|
+
// destroying the very human text the delimited section exists to preserve. The renderer escapes
|
|
2518
|
+
// `<` and `>`, so no rendered path can spell either marker.
|
|
2519
|
+
it('neutralises a path that spells the section END marker, keeping exactly one marker pair', () => {
|
|
2520
|
+
const hostile = `packages/cli/src/${HUMAN_REVIEW_SECTION_END}.ts`;
|
|
2521
|
+
const body = composePrBody({
|
|
2522
|
+
title: 'T-12',
|
|
2523
|
+
taskId: 'T-12',
|
|
2524
|
+
taskText: view(),
|
|
2525
|
+
attempt: 1,
|
|
2526
|
+
humanReviewFiles: [hostile],
|
|
2527
|
+
});
|
|
2528
|
+
assert.equal(
|
|
2529
|
+
body.split(HUMAN_REVIEW_SECTION_END).length - 1,
|
|
2530
|
+
1,
|
|
2531
|
+
'the hostile path must not put a second END marker in the body',
|
|
2532
|
+
);
|
|
2533
|
+
assert.equal(body.split(HUMAN_REVIEW_SECTION_START).length - 1, 1);
|
|
2534
|
+
assert.match(body, /<!-- dispatcher:human-review:end -->/);
|
|
2535
|
+
});
|
|
2536
|
+
|
|
2537
|
+
// T-31 round 4: the previous version of this test counted the lines that both start with `- ` and
|
|
2538
|
+
// name `packages/cli`, which is 1 whether or not the control characters are escaped — the orphan
|
|
2539
|
+
// second line (`b\tc.ts`) matches neither filter. It asserts the RENDERED entries between the
|
|
2540
|
+
// markers instead, so deleting any part of the escape range makes it fail.
|
|
2541
|
+
it('strips control characters from a rendered path so one entry cannot become several lines', () => {
|
|
2542
|
+
const body = composePrBody({
|
|
2543
|
+
title: 'T-12',
|
|
2544
|
+
taskId: 'T-12',
|
|
2545
|
+
taskText: view(),
|
|
2546
|
+
attempt: 1,
|
|
2547
|
+
humanReviewFiles: ['packages/cli/a\nb\tc.ts'],
|
|
2548
|
+
});
|
|
2549
|
+
const section = body.slice(
|
|
2550
|
+
body.indexOf(HUMAN_REVIEW_SECTION_START),
|
|
2551
|
+
body.indexOf(HUMAN_REVIEW_SECTION_END),
|
|
2552
|
+
);
|
|
2553
|
+
const listLines = section.split('\n').filter((line) => line.startsWith('- '));
|
|
2554
|
+
|
|
2555
|
+
assert.deepEqual(listLines, ['- packages/cli/a?b?c.ts']);
|
|
2556
|
+
});
|
|
2557
|
+
|
|
2558
|
+
// T-31 round 4: `MAX_MARKED_FILES` had no test of its own — both existing cap tests splice paths
|
|
2559
|
+
// long enough for the CHARACTER cap to stop the list first, so raising the count cap to a billion
|
|
2560
|
+
// left the suite green. Sixty SHORT paths (~1 KB in total, well inside the 2000-char budget) can
|
|
2561
|
+
// only be cut by the count.
|
|
2562
|
+
it('caps the section by entry COUNT even when the whole list fits the character budget', () => {
|
|
2563
|
+
const many = Array.from({ length: 60 }, (_, index) => `packages/cli/f${index}.ts`);
|
|
2564
|
+
const body = composePrBody({
|
|
2565
|
+
title: 'T-12',
|
|
2566
|
+
taskId: 'T-12',
|
|
2567
|
+
taskText: view(),
|
|
2568
|
+
attempt: 1,
|
|
2569
|
+
humanReviewFiles: many,
|
|
2570
|
+
});
|
|
2571
|
+
const section = body.slice(
|
|
2572
|
+
body.indexOf(HUMAN_REVIEW_SECTION_START),
|
|
2573
|
+
body.indexOf(HUMAN_REVIEW_SECTION_END),
|
|
2574
|
+
);
|
|
2575
|
+
const listLines = section.split('\n').filter((line) => line.startsWith('- packages/cli/f'));
|
|
2576
|
+
|
|
2577
|
+
assert.equal(listLines.length, 40, 'the count cap is 40, and the length cap cannot reach here');
|
|
2578
|
+
assert.ok(section.length < 2000, 'the character budget was never the binding constraint');
|
|
2579
|
+
assert.match(section, /y 20 ficheros más/);
|
|
2580
|
+
});
|
|
2581
|
+
|
|
2582
|
+
// The count cap alone bounds the number of entries and not their SIZE: 40 paths of 4 KB each is a
|
|
2583
|
+
// 160 KB section spliced into a public body and into the `gh` argv. The sibling `Blocked` comment
|
|
2584
|
+
// goes through `sanitizeCommentBody`'s char cap for exactly this reason; the section carries its
|
|
2585
|
+
// own.
|
|
2586
|
+
it('caps the section by total LENGTH, not only by entry count', () => {
|
|
2587
|
+
const long = Array.from(
|
|
2588
|
+
{ length: 40 },
|
|
2589
|
+
(_, index) => `packages/cli/src/${'d'.repeat(600)}/f${index}.ts`,
|
|
2590
|
+
);
|
|
2591
|
+
const body = composePrBody({
|
|
2592
|
+
title: 'T-12',
|
|
2593
|
+
taskId: 'T-12',
|
|
2594
|
+
taskText: view(),
|
|
2595
|
+
attempt: 1,
|
|
2596
|
+
humanReviewFiles: long,
|
|
2597
|
+
});
|
|
2598
|
+
const start = body.indexOf(HUMAN_REVIEW_SECTION_START);
|
|
2599
|
+
const section = body.slice(start);
|
|
2600
|
+
assert.ok(
|
|
2601
|
+
section.length < 4000,
|
|
2602
|
+
`the section must stay bounded; it was ${section.length} chars`,
|
|
2603
|
+
);
|
|
2604
|
+
assert.match(section, /ficheros más/);
|
|
2605
|
+
assert.ok(section.endsWith(HUMAN_REVIEW_SECTION_END), 'the END marker must survive the cap');
|
|
2606
|
+
});
|
|
2607
|
+
|
|
2608
|
+
// The section is DELIMITED so a later rewrite can find and replace exactly it — see
|
|
2609
|
+
// `upsertHumanReviewSection`.
|
|
2610
|
+
it('wraps the section in the markers a later body rewrite locates it by', () => {
|
|
2611
|
+
const body = composePrBody({
|
|
2612
|
+
title: 'T-12',
|
|
2613
|
+
taskId: 'T-12',
|
|
2614
|
+
taskText: view(),
|
|
2615
|
+
attempt: 1,
|
|
2616
|
+
humanReviewFiles: ['scripts/backlog/close.ts'],
|
|
2617
|
+
});
|
|
2618
|
+
assert.ok(body.includes(HUMAN_REVIEW_SECTION_START));
|
|
2619
|
+
assert.ok(body.includes(HUMAN_REVIEW_SECTION_END));
|
|
2620
|
+
});
|
|
2621
|
+
});
|
|
2622
|
+
|
|
2623
|
+
// ── upsertHumanReviewSection (T-31 round 2) ────────────────────────────────────
|
|
2624
|
+
//
|
|
2625
|
+
// `gh pr edit --body` is a full REPLACEMENT, and the pull requests this mark rewrites are by
|
|
2626
|
+
// construction the ones a person was asked to read and annotate. Recomposing the body from the
|
|
2627
|
+
// board erased every word that person had added — "the body is a deterministic function of the
|
|
2628
|
+
// task" is true of the dispatcher-authored half and false of any human addition. So the rewrite
|
|
2629
|
+
// edits only its own delimited section and leaves the rest of the body byte-for-byte.
|
|
2630
|
+
|
|
2631
|
+
describe('upsertHumanReviewSection', () => {
|
|
2632
|
+
it('appends the section to a body that has none, keeping every other line', () => {
|
|
2633
|
+
const current = '# T-12: something\n\n## Resumen\n\nlo que hace.\n\nNota de una persona: ojo con X.';
|
|
2634
|
+
const updated = upsertHumanReviewSection(current, ['scripts/backlog/close.ts']);
|
|
2635
|
+
assert.ok(updated.startsWith(current), 'the existing body must survive verbatim at the front');
|
|
2636
|
+
assert.match(updated, /## Revisión humana requerida/);
|
|
2637
|
+
assert.match(updated, /scripts\/backlog\/close\.ts/);
|
|
2638
|
+
});
|
|
2639
|
+
|
|
2640
|
+
it('replaces an existing section in place and preserves human text on BOTH sides of it', () => {
|
|
2641
|
+
const before = '# T-12\n\n## Resumen\n\nlo que hace.';
|
|
2642
|
+
const after = '## Revisión de Ana\n\nEsto hay que mirarlo con calma.';
|
|
2643
|
+
const current = upsertHumanReviewSection(before, ['scripts/backlog/close.ts']) + `\n\n${after}`;
|
|
2644
|
+
|
|
2645
|
+
const updated = upsertHumanReviewSection(current, ['packages/cli/src/generator.ts']);
|
|
2646
|
+
|
|
2647
|
+
assert.ok(updated.startsWith(before), 'text before the section must survive');
|
|
2648
|
+
assert.ok(updated.includes(after), 'text a person added AFTER the section must survive');
|
|
2649
|
+
assert.match(updated, /packages\/cli\/src\/generator\.ts/);
|
|
2650
|
+
assert.doesNotMatch(updated, /scripts\/backlog\/close\.ts/);
|
|
2651
|
+
assert.equal(
|
|
2652
|
+
updated.split(HUMAN_REVIEW_SECTION_START).length - 1,
|
|
2653
|
+
1,
|
|
2654
|
+
'exactly one section, never a second one appended beside the first',
|
|
2655
|
+
);
|
|
2656
|
+
});
|
|
2657
|
+
|
|
2658
|
+
// The caller (`dispatch.ts`'s `applyHumanReviewBody`) does not even call `gh` when the attempt
|
|
2659
|
+
// reached nothing, so this is the belt to that braces: an empty list never rewrites a body.
|
|
2660
|
+
it('returns the body untouched when there is no soft-list file to name', () => {
|
|
2661
|
+
const current = '# T-12\n\nNota de una persona.';
|
|
2662
|
+
assert.equal(upsertHumanReviewSection(current, []), current);
|
|
2663
|
+
});
|
|
2664
|
+
|
|
2665
|
+
// T-31 round 3: a MALFORMED marker pair used to fall through to the append branch, so every retry
|
|
2666
|
+
// added another section to the same body. Three shapes, each handled deterministically and each
|
|
2667
|
+
// idempotent under a second rewrite.
|
|
2668
|
+
it('never accumulates a second section on a body whose END precedes its START', () => {
|
|
2669
|
+
const current = `${HUMAN_REVIEW_SECTION_END}\n\nNota de una persona.\n\n${HUMAN_REVIEW_SECTION_START}`;
|
|
2670
|
+
const once = upsertHumanReviewSection(current, ['scripts/backlog/close.ts']);
|
|
2671
|
+
const twice = upsertHumanReviewSection(once, ['packages/cli/src/generator.ts']);
|
|
2672
|
+
|
|
2673
|
+
assert.equal(twice.split(HUMAN_REVIEW_SECTION_START).length - 1, 1);
|
|
2674
|
+
assert.equal(twice.split(HUMAN_REVIEW_SECTION_END).length - 1, 1);
|
|
2675
|
+
assert.ok(twice.includes('Nota de una persona.'), 'human text must survive both rewrites');
|
|
2676
|
+
assert.match(twice, /packages\/cli\/src\/generator\.ts/);
|
|
2677
|
+
});
|
|
2678
|
+
|
|
2679
|
+
it('replaces a truncated section (a START with no END) instead of appending beside it', () => {
|
|
2680
|
+
const before = '# T-12\n\nNota de una persona.\n\n';
|
|
2681
|
+
const current = `${before}${HUMAN_REVIEW_SECTION_START}\n## Revisión humana requerida\n\n- a medio escribir`;
|
|
2682
|
+
|
|
2683
|
+
const updated = upsertHumanReviewSection(current, ['scripts/backlog/close.ts']);
|
|
2684
|
+
|
|
2685
|
+
assert.equal(updated.split(HUMAN_REVIEW_SECTION_START).length - 1, 1);
|
|
2686
|
+
assert.equal(updated.split(HUMAN_REVIEW_SECTION_END).length - 1, 1);
|
|
2687
|
+
assert.ok(updated.startsWith(before));
|
|
2688
|
+
assert.doesNotMatch(updated, /a medio escribir/);
|
|
2689
|
+
});
|
|
2690
|
+
|
|
2691
|
+
// T-31 round 4, measured defect: on a body holding TWO full pairs — the shape the pre-round-3 code
|
|
2692
|
+
// produced on every retry, so open pull requests already hold it — the `lastIndexOf(END)` slice ran
|
|
2693
|
+
// from the first START to the LAST END and swallowed everything between the two sections, including
|
|
2694
|
+
// a person's note. "Everything outside the markers is returned byte-for-byte" is the headline
|
|
2695
|
+
// promise of this function, and a mark that destroys the review it asks for is worse than no mark.
|
|
2696
|
+
it('keeps the human text BETWEEN two full marker pairs, collapsing them into one section', () => {
|
|
2697
|
+
const note = 'Nota de Ana: esto hay que mirarlo con calma.';
|
|
2698
|
+
const current =
|
|
2699
|
+
`# T-12\n\n${HUMAN_REVIEW_SECTION_START}\nprimera\n${HUMAN_REVIEW_SECTION_END}\n\n${note}\n\n` +
|
|
2700
|
+
`${HUMAN_REVIEW_SECTION_START}\nsegunda\n${HUMAN_REVIEW_SECTION_END}\n\ncola de la PR.`;
|
|
2701
|
+
|
|
2702
|
+
const updated = upsertHumanReviewSection(current, ['packages/cli/src/generator.ts']);
|
|
2703
|
+
|
|
2704
|
+
assert.ok(updated.includes(note), 'the note between the two sections must survive');
|
|
2705
|
+
assert.ok(updated.includes('cola de la PR.'), 'the tail must survive too');
|
|
2706
|
+
assert.ok(updated.startsWith('# T-12\n\n'));
|
|
2707
|
+
assert.doesNotMatch(updated, /primera|segunda/);
|
|
2708
|
+
assert.match(updated, /packages\/cli\/src\/generator\.ts/);
|
|
2709
|
+
assert.equal(updated.split(HUMAN_REVIEW_SECTION_START).length - 1, 1);
|
|
2710
|
+
assert.equal(updated.split(HUMAN_REVIEW_SECTION_END).length - 1, 1);
|
|
2711
|
+
// Idempotent: the collapsed body is the ordinary one-pair case, so a second rewrite changes only
|
|
2712
|
+
// the section again and still loses nothing.
|
|
2713
|
+
const twice = upsertHumanReviewSection(updated, ['scripts/backlog/close.ts']);
|
|
2714
|
+
assert.ok(twice.includes(note));
|
|
2715
|
+
assert.ok(twice.includes('cola de la PR.'));
|
|
2716
|
+
assert.equal(twice.split(HUMAN_REVIEW_SECTION_START).length - 1, 1);
|
|
2717
|
+
});
|
|
2718
|
+
|
|
2719
|
+
// T-31 round 4: the docstring claims the result always holds exactly ONE well-ordered pair, and
|
|
2720
|
+
// this arrangement (a full pair, human text, then a truncated START) is the one that used to leave
|
|
2721
|
+
// two STARTs and one END behind.
|
|
2722
|
+
it('leaves exactly one well-ordered pair when a truncated START follows a full pair', () => {
|
|
2723
|
+
const note = 'Nota de una persona.';
|
|
2724
|
+
const current =
|
|
2725
|
+
`${HUMAN_REVIEW_SECTION_START}\nprimera\n${HUMAN_REVIEW_SECTION_END}\n\n${note}\n\n${HUMAN_REVIEW_SECTION_START}`;
|
|
2726
|
+
|
|
2727
|
+
const updated = upsertHumanReviewSection(current, ['scripts/backlog/close.ts']);
|
|
2728
|
+
|
|
2729
|
+
assert.equal(updated.split(HUMAN_REVIEW_SECTION_START).length - 1, 1);
|
|
2730
|
+
assert.equal(updated.split(HUMAN_REVIEW_SECTION_END).length - 1, 1);
|
|
2731
|
+
assert.ok(updated.includes(note), 'human text between the pair and the stray START survives');
|
|
2732
|
+
assert.ok(
|
|
2733
|
+
updated.indexOf(HUMAN_REVIEW_SECTION_START) < updated.indexOf(HUMAN_REVIEW_SECTION_END),
|
|
2734
|
+
);
|
|
2735
|
+
});
|
|
2736
|
+
|
|
2737
|
+
it('drops a stray END marker rather than letting it pair with the section it appends', () => {
|
|
2738
|
+
const current = `# T-12\n\n${HUMAN_REVIEW_SECTION_END}\n\nNota de una persona.`;
|
|
2739
|
+
const updated = upsertHumanReviewSection(current, ['scripts/backlog/close.ts']);
|
|
2740
|
+
|
|
2741
|
+
assert.equal(updated.split(HUMAN_REVIEW_SECTION_END).length - 1, 1);
|
|
2742
|
+
assert.ok(updated.includes('Nota de una persona.'));
|
|
2743
|
+
assert.ok(
|
|
2744
|
+
updated.indexOf(HUMAN_REVIEW_SECTION_START) < updated.indexOf(HUMAN_REVIEW_SECTION_END),
|
|
2745
|
+
'the surviving pair must be well ordered',
|
|
2746
|
+
);
|
|
2747
|
+
});
|
|
2748
|
+
});
|
|
2749
|
+
|
|
2750
|
+
// ── buildPrLabelArgs / buildPrReviewerArgs (T-31) ──────────────────────────────
|
|
2751
|
+
//
|
|
2752
|
+
// The mark's two best-effort halves: a `gh pr edit` call each, kept SEPARATE from each other (a
|
|
2753
|
+
// rejected reviewer must not take the label down with it) and from `pr create` (a label the
|
|
2754
|
+
// repository does not have would otherwise fail the PR creation itself, per design.md decision 8).
|
|
2755
|
+
|
|
2756
|
+
describe('buildPrLabelArgs', () => {
|
|
2757
|
+
it('produces the exact gh pr edit argv for the harness-review label', () => {
|
|
2758
|
+
assert.deepEqual(buildPrLabelArgs('task/T-12'), [
|
|
2759
|
+
'pr',
|
|
2760
|
+
'edit',
|
|
2761
|
+
'task/T-12',
|
|
2762
|
+
'--add-label',
|
|
2763
|
+
'harness-review',
|
|
2764
|
+
]);
|
|
2765
|
+
});
|
|
2766
|
+
});
|
|
2767
|
+
|
|
2768
|
+
describe('buildPrReviewerArgs', () => {
|
|
2769
|
+
it('produces the exact gh pr edit argv for the configured reviewer handle', () => {
|
|
2770
|
+
assert.deepEqual(buildPrReviewerArgs('task/T-12', 'octocat'), [
|
|
2771
|
+
'pr',
|
|
2772
|
+
'edit',
|
|
2773
|
+
'task/T-12',
|
|
2774
|
+
'--add-reviewer',
|
|
2775
|
+
'octocat',
|
|
2776
|
+
]);
|
|
2777
|
+
});
|
|
2778
|
+
});
|
|
2779
|
+
|
|
2780
|
+
// K3: a retry pushes to the SAME branch, so the second attempt's `pr create` hit "a pull request
|
|
2781
|
+
// for branch … already exists" and failed the whole close — with the code already on the remote and
|
|
2782
|
+
// a perfectly good PR open. This lookup is what turns that into a reuse.
|
|
2783
|
+
describe('findOpenPrUrl', () => {
|
|
2784
|
+
it('returns the URL of the PR already open on the branch', () => {
|
|
2785
|
+
const asked: string[][] = [];
|
|
2786
|
+
const url = findOpenPrUrl({
|
|
2787
|
+
branch: 'task/T-12',
|
|
2788
|
+
runGh: (args) => {
|
|
2789
|
+
asked.push(args);
|
|
2790
|
+
return JSON.stringify({ url: 'https://github.com/o/r/pull/7', state: 'OPEN' });
|
|
2791
|
+
},
|
|
2792
|
+
});
|
|
2793
|
+
|
|
2794
|
+
assert.deepEqual(asked, [['pr', 'view', 'task/T-12', '--json', 'url,state']]);
|
|
2795
|
+
assert.equal(url, 'https://github.com/o/r/pull/7');
|
|
2796
|
+
});
|
|
2797
|
+
|
|
2798
|
+
it('reports no PR when gh says none was found, so the caller creates one', () => {
|
|
2799
|
+
const url = findOpenPrUrl({
|
|
2800
|
+
branch: 'task/T-12',
|
|
2801
|
+
runGh: () => {
|
|
2802
|
+
throw new Error('no pull requests found for branch "task/T-12"');
|
|
2803
|
+
},
|
|
2804
|
+
});
|
|
2805
|
+
assert.equal(url, null);
|
|
2806
|
+
});
|
|
2807
|
+
|
|
2808
|
+
// A merged or closed PR is not reusable: pushing to the branch again would leave the attempt with
|
|
2809
|
+
// no open PR at all, and the DoD item this ticks would be a lie.
|
|
2810
|
+
it('reports no PR when the only one on the branch is already closed or merged', () => {
|
|
2811
|
+
for (const state of ['CLOSED', 'MERGED']) {
|
|
2812
|
+
assert.equal(
|
|
2813
|
+
findOpenPrUrl({
|
|
2814
|
+
branch: 'task/T-12',
|
|
2815
|
+
runGh: () => JSON.stringify({ url: 'https://x/1', state }),
|
|
2816
|
+
}),
|
|
2817
|
+
null,
|
|
2818
|
+
`a ${state} PR must not be reused`,
|
|
2819
|
+
);
|
|
2820
|
+
}
|
|
2821
|
+
});
|
|
2822
|
+
|
|
2823
|
+
// Anything that is not "none found" — a revoked token, no network — is NOT an absent PR. Swallowing
|
|
2824
|
+
// it would make the close create a duplicate PR the moment `gh` came back.
|
|
2825
|
+
it('rethrows an unrelated gh failure instead of reading it as an absent PR', () => {
|
|
2826
|
+
assert.throws(
|
|
2827
|
+
() =>
|
|
2828
|
+
findOpenPrUrl({
|
|
2829
|
+
branch: 'task/T-12',
|
|
2830
|
+
runGh: () => {
|
|
2831
|
+
throw new Error('gh: could not authenticate to github.com');
|
|
2832
|
+
},
|
|
2833
|
+
}),
|
|
2834
|
+
/authenticate/,
|
|
2835
|
+
);
|
|
2836
|
+
});
|
|
2837
|
+
});
|
|
2838
|
+
|
|
2839
|
+
describe('planMechanicalChecks', () => {
|
|
2840
|
+
const changed = ['backend/src/@app/o-auth/session.service.ts', 'frontend/src/app/x.component.ts'];
|
|
2841
|
+
|
|
2842
|
+
it("scopes prettier to the attempt's own changed files, one run per workspace that has prettier", () => {
|
|
2843
|
+
const plan = planMechanicalChecks({
|
|
2844
|
+
testCommand: 'pnpm --filter aurora-back test session.spec.ts',
|
|
2845
|
+
lintBarrels: true,
|
|
2846
|
+
changedFiles: changed,
|
|
2847
|
+
exists: () => true,
|
|
2848
|
+
});
|
|
2849
|
+
assert.deepEqual(plan.checks, [
|
|
2850
|
+
{
|
|
2851
|
+
label: 'prettier --write (aurora-back)',
|
|
2852
|
+
command: 'pnpm',
|
|
2853
|
+
args: [
|
|
2854
|
+
'--filter',
|
|
2855
|
+
'aurora-back',
|
|
2856
|
+
'exec',
|
|
2857
|
+
'prettier',
|
|
2858
|
+
'--write',
|
|
2859
|
+
'--ignore-unknown',
|
|
2860
|
+
'--',
|
|
2861
|
+
'src/@app/o-auth/session.service.ts',
|
|
2862
|
+
],
|
|
2863
|
+
},
|
|
2864
|
+
{
|
|
2865
|
+
label: 'prettier --check (aurora-back)',
|
|
2866
|
+
command: 'pnpm',
|
|
2867
|
+
args: [
|
|
2868
|
+
'--filter',
|
|
2869
|
+
'aurora-back',
|
|
2870
|
+
'exec',
|
|
2871
|
+
'prettier',
|
|
2872
|
+
'--check',
|
|
2873
|
+
'--ignore-unknown',
|
|
2874
|
+
'--',
|
|
2875
|
+
'src/@app/o-auth/session.service.ts',
|
|
2876
|
+
],
|
|
2877
|
+
},
|
|
2878
|
+
{
|
|
2879
|
+
label: 'prettier --write (aurora-front)',
|
|
2880
|
+
command: 'pnpm',
|
|
2881
|
+
args: [
|
|
2882
|
+
'--filter',
|
|
2883
|
+
'aurora-front',
|
|
2884
|
+
'exec',
|
|
2885
|
+
'prettier',
|
|
2886
|
+
'--write',
|
|
2887
|
+
'--ignore-unknown',
|
|
2888
|
+
'--',
|
|
2889
|
+
'src/app/x.component.ts',
|
|
2890
|
+
],
|
|
2891
|
+
},
|
|
2892
|
+
{
|
|
2893
|
+
label: 'prettier --check (aurora-front)',
|
|
2894
|
+
command: 'pnpm',
|
|
2895
|
+
args: [
|
|
2896
|
+
'--filter',
|
|
2897
|
+
'aurora-front',
|
|
2898
|
+
'exec',
|
|
2899
|
+
'prettier',
|
|
2900
|
+
'--check',
|
|
2901
|
+
'--ignore-unknown',
|
|
2902
|
+
'--',
|
|
2903
|
+
'src/app/x.component.ts',
|
|
2904
|
+
],
|
|
2905
|
+
},
|
|
2906
|
+
{
|
|
2907
|
+
label: 'lint-barrels',
|
|
2908
|
+
command: 'pnpm',
|
|
2909
|
+
args: ['hr:lint-barrels', '--', 'backend/src/@app/o-auth/session.service.ts'],
|
|
2910
|
+
advisoryStatuses: [2],
|
|
2911
|
+
},
|
|
2912
|
+
{
|
|
2913
|
+
label: 'test',
|
|
2914
|
+
command: 'pnpm',
|
|
2915
|
+
args: ['--filter', 'aurora-back', 'test', 'session.spec.ts'],
|
|
2916
|
+
},
|
|
2917
|
+
]);
|
|
2918
|
+
assert.equal(plan.refusal, null);
|
|
2919
|
+
});
|
|
2920
|
+
|
|
2921
|
+
// J12: design.md decision (h) — "the format and guard hooks run in the close, where a
|
|
2922
|
+
// deterministic script ENFORCES them". A bare `--check` only reports; the executor is not asked
|
|
2923
|
+
// to format, so a formatting nit failed the whole attempt over something the close can fix in
|
|
2924
|
+
// place. `--write` first, and the `--check` after it is what proves the write actually took.
|
|
2925
|
+
it('formats before it verifies: --write precedes --check for every workspace', () => {
|
|
2926
|
+
const plan = planMechanicalChecks({
|
|
2927
|
+
testCommand: null,
|
|
2928
|
+
lintBarrels: false,
|
|
2929
|
+
changedFiles: ['backend/src/@api/x.ts'],
|
|
2930
|
+
exists: () => true,
|
|
2931
|
+
});
|
|
2932
|
+
const prettierRuns = plan.checks.filter((check) => check.label.startsWith('prettier'));
|
|
2933
|
+
assert.deepEqual(
|
|
2934
|
+
prettierRuns.map((check) => check.args[4]),
|
|
2935
|
+
['--write', '--check'],
|
|
2936
|
+
);
|
|
2937
|
+
});
|
|
2938
|
+
|
|
2939
|
+
it('never runs prettier over the whole repo — an empty diff plans no prettier run at all', () => {
|
|
2940
|
+
const plan = planMechanicalChecks({
|
|
2941
|
+
testCommand: null,
|
|
2942
|
+
lintBarrels: false,
|
|
2943
|
+
changedFiles: [],
|
|
2944
|
+
exists: () => true,
|
|
2945
|
+
});
|
|
2946
|
+
assert.deepEqual(plan.checks, []);
|
|
2947
|
+
assert.deepEqual(plan.skippedPrettierFiles, []);
|
|
2948
|
+
});
|
|
2949
|
+
|
|
2950
|
+
it('reports files outside every prettier workspace as skipped instead of failing on them', () => {
|
|
2951
|
+
const plan = planMechanicalChecks({
|
|
2952
|
+
testCommand: null,
|
|
2953
|
+
lintBarrels: false,
|
|
2954
|
+
changedFiles: ['scripts/backlog/close.ts', '.claude/hooks/x.ts'],
|
|
2955
|
+
exists: () => true,
|
|
2956
|
+
});
|
|
2957
|
+
assert.deepEqual(plan.checks, []);
|
|
2958
|
+
assert.deepEqual(plan.skippedPrettierFiles, ['scripts/backlog/close.ts', '.claude/hooks/x.ts']);
|
|
2959
|
+
});
|
|
2960
|
+
|
|
2961
|
+
// T-6.1: measured on the first real frontier dispatch — Prettier exits 2 on a `.sql` file with
|
|
2962
|
+
// "No parser could be inferred", failing the whole triad over a file Prettier was never going to
|
|
2963
|
+
// format anyway. `--ignore-unknown` makes it skip such a file instead.
|
|
2964
|
+
it('passes --ignore-unknown to both prettier invocations, so an unrecognised file skips rather than fails', () => {
|
|
2965
|
+
const plan = planMechanicalChecks({
|
|
2966
|
+
testCommand: null,
|
|
2967
|
+
lintBarrels: false,
|
|
2968
|
+
changedFiles: ['backend/src/database/seed.sql'],
|
|
2969
|
+
exists: () => true,
|
|
2970
|
+
});
|
|
2971
|
+
const prettierRuns = plan.checks.filter((check) => check.label.startsWith('prettier'));
|
|
2972
|
+
assert.equal(prettierRuns.length, 2);
|
|
2973
|
+
for (const check of prettierRuns) {
|
|
2974
|
+
assert.ok(
|
|
2975
|
+
check.args.includes('--ignore-unknown'),
|
|
2976
|
+
`${check.label} must carry --ignore-unknown`,
|
|
2977
|
+
);
|
|
2978
|
+
}
|
|
2979
|
+
});
|
|
2980
|
+
|
|
2981
|
+
// T-6.1: the drizzle-kit OUTPUT under a migration folder (`migration.sql` and the 432 KB
|
|
2982
|
+
// `snapshot.json`) is tool-owned, not hand-written, and is not Prettier-formatted in this repo
|
|
2983
|
+
// (measured: `prettier --check` warns on every shipped `snapshot.json`). A `--write` over one
|
|
2984
|
+
// would turn a generated artifact into a huge noise-only diff, so it is excluded from BOTH
|
|
2985
|
+
// prettier buckets — and, being genuinely covered by the `backend/` workspace, it is not reported
|
|
2986
|
+
// as "no prettier workspace covers this" either, which would misname a deliberate exclusion as a
|
|
2987
|
+
// coverage gap.
|
|
2988
|
+
it('excludes tool-owned drizzle migration output from prettier entirely, without flagging it as skipped', () => {
|
|
2989
|
+
const plan = planMechanicalChecks({
|
|
2990
|
+
testCommand: null,
|
|
2991
|
+
lintBarrels: false,
|
|
2992
|
+
changedFiles: [
|
|
2993
|
+
'backend/src/database/migrations/drizzle/20260905090449_x/migration.sql',
|
|
2994
|
+
'backend/src/database/migrations/drizzle/20260905090449_x/snapshot.json',
|
|
2995
|
+
],
|
|
2996
|
+
exists: () => true,
|
|
2997
|
+
});
|
|
2998
|
+
assert.deepEqual(plan.checks, []);
|
|
2999
|
+
assert.deepEqual(plan.skippedPrettierFiles, []);
|
|
3000
|
+
});
|
|
3001
|
+
|
|
3002
|
+
it('lints barrels only over the .ts files under the roots HR-BARRELS actually governs', () => {
|
|
3003
|
+
const plan = planMechanicalChecks({
|
|
3004
|
+
testCommand: null,
|
|
3005
|
+
lintBarrels: true,
|
|
3006
|
+
changedFiles: [
|
|
3007
|
+
'scripts/backlog/close.ts',
|
|
3008
|
+
'backend/src/@api/x.ts',
|
|
3009
|
+
'backend/src/config/y.ts',
|
|
3010
|
+
],
|
|
3011
|
+
exists: () => true,
|
|
3012
|
+
});
|
|
3013
|
+
assert.deepEqual(
|
|
3014
|
+
plan.checks.filter((check) => check.label === 'lint-barrels'),
|
|
3015
|
+
[
|
|
3016
|
+
{
|
|
3017
|
+
label: 'lint-barrels',
|
|
3018
|
+
command: 'pnpm',
|
|
3019
|
+
args: ['hr:lint-barrels', '--', 'backend/src/@api/x.ts'],
|
|
3020
|
+
advisoryStatuses: [2],
|
|
3021
|
+
},
|
|
3022
|
+
],
|
|
3023
|
+
);
|
|
3024
|
+
});
|
|
3025
|
+
|
|
3026
|
+
it('drops the barrels lint when the repo does not expose the script', () => {
|
|
3027
|
+
const plan = planMechanicalChecks({
|
|
3028
|
+
testCommand: null,
|
|
3029
|
+
lintBarrels: false,
|
|
3030
|
+
changedFiles: ['backend/src/@api/x.ts'],
|
|
3031
|
+
exists: () => true,
|
|
3032
|
+
});
|
|
3033
|
+
assert.ok(!plan.checks.some((check) => check.label === 'lint-barrels'));
|
|
3034
|
+
});
|
|
3035
|
+
|
|
3036
|
+
it('drops the test step when the task declares no command (the caller logs the warning)', () => {
|
|
3037
|
+
const plan = planMechanicalChecks({
|
|
3038
|
+
testCommand: null,
|
|
3039
|
+
lintBarrels: false,
|
|
3040
|
+
changedFiles: [],
|
|
3041
|
+
exists: () => true,
|
|
3042
|
+
});
|
|
3043
|
+
assert.equal(plan.refusal, null);
|
|
3044
|
+
assert.ok(!plan.checks.some((check) => check.label === 'test'));
|
|
3045
|
+
});
|
|
3046
|
+
|
|
3047
|
+
it('refuses a disallowed test command outright, so the triad fails instead of running it', () => {
|
|
3048
|
+
const plan = planMechanicalChecks({
|
|
3049
|
+
testCommand: 'bash ./do-it.sh',
|
|
3050
|
+
lintBarrels: false,
|
|
3051
|
+
changedFiles: [],
|
|
3052
|
+
exists: () => true,
|
|
3053
|
+
});
|
|
3054
|
+
assert.equal(plan.refusal, 'test command no permitido');
|
|
3055
|
+
assert.ok(!plan.checks.some((check) => check.label === 'test'));
|
|
3056
|
+
});
|
|
3057
|
+
|
|
3058
|
+
// G8: a file the attempt DELETED is still a changed file. Handing it to `prettier --check` or to
|
|
3059
|
+
// the barrels linter fails the triad on a path that is correctly gone.
|
|
3060
|
+
it('drops a deleted file from both the prettier and the barrels runs', () => {
|
|
3061
|
+
const deleted = 'backend/src/@api/gone.ts';
|
|
3062
|
+
const plan = planMechanicalChecks({
|
|
3063
|
+
testCommand: null,
|
|
3064
|
+
lintBarrels: true,
|
|
3065
|
+
changedFiles: [deleted, 'backend/src/@api/kept.ts'],
|
|
3066
|
+
exists: (file) => file !== deleted,
|
|
3067
|
+
});
|
|
3068
|
+
|
|
3069
|
+
assert.deepEqual(plan.checks, [
|
|
3070
|
+
{
|
|
3071
|
+
label: 'prettier --write (aurora-back)',
|
|
3072
|
+
command: 'pnpm',
|
|
3073
|
+
args: [
|
|
3074
|
+
'--filter',
|
|
3075
|
+
'aurora-back',
|
|
3076
|
+
'exec',
|
|
3077
|
+
'prettier',
|
|
3078
|
+
'--write',
|
|
3079
|
+
'--ignore-unknown',
|
|
3080
|
+
'--',
|
|
3081
|
+
'src/@api/kept.ts',
|
|
3082
|
+
],
|
|
3083
|
+
},
|
|
3084
|
+
{
|
|
3085
|
+
label: 'prettier --check (aurora-back)',
|
|
3086
|
+
command: 'pnpm',
|
|
3087
|
+
args: [
|
|
3088
|
+
'--filter',
|
|
3089
|
+
'aurora-back',
|
|
3090
|
+
'exec',
|
|
3091
|
+
'prettier',
|
|
3092
|
+
'--check',
|
|
3093
|
+
'--ignore-unknown',
|
|
3094
|
+
'--',
|
|
3095
|
+
'src/@api/kept.ts',
|
|
3096
|
+
],
|
|
3097
|
+
},
|
|
3098
|
+
{
|
|
3099
|
+
label: 'lint-barrels',
|
|
3100
|
+
command: 'pnpm',
|
|
3101
|
+
args: ['hr:lint-barrels', '--', 'backend/src/@api/kept.ts'],
|
|
3102
|
+
advisoryStatuses: [2],
|
|
3103
|
+
},
|
|
3104
|
+
]);
|
|
3105
|
+
});
|
|
3106
|
+
|
|
3107
|
+
// H12: a changed path that begins with a dash is read as a FLAG by prettier and by the barrels
|
|
3108
|
+
// linter. One `--` token makes the file list unambiguously a file list, for both.
|
|
3109
|
+
it('separates the file arguments from the flags with --, in every file-taking check', () => {
|
|
3110
|
+
const plan = planMechanicalChecks({
|
|
3111
|
+
testCommand: null,
|
|
3112
|
+
lintBarrels: true,
|
|
3113
|
+
changedFiles: ['backend/src/@api/x.ts', 'frontend/src/app/y.ts'],
|
|
3114
|
+
exists: () => true,
|
|
3115
|
+
});
|
|
3116
|
+
|
|
3117
|
+
assert.ok(plan.checks.length > 0);
|
|
3118
|
+
for (const check of plan.checks) {
|
|
3119
|
+
assert.ok(
|
|
3120
|
+
check.args.includes('--'),
|
|
3121
|
+
`${check.label} must separate its file arguments with --`,
|
|
3122
|
+
);
|
|
3123
|
+
}
|
|
3124
|
+
});
|
|
3125
|
+
|
|
3126
|
+
it('does not report a deleted file as an unformattable skip either — it simply is not there', () => {
|
|
3127
|
+
const plan = planMechanicalChecks({
|
|
3128
|
+
testCommand: null,
|
|
3129
|
+
lintBarrels: false,
|
|
3130
|
+
changedFiles: ['scripts/backlog/gone.ts'],
|
|
3131
|
+
exists: () => false,
|
|
3132
|
+
});
|
|
3133
|
+
assert.deepEqual(plan.skippedPrettierFiles, []);
|
|
3134
|
+
});
|
|
3135
|
+
|
|
3136
|
+
// T-56: HR-BARRELS-004's exit 2 is `informational`, not `blocking` (`computeExitCode`,
|
|
3137
|
+
// scripts/harness-rules/lint-barrels.ts) — `.husky/pre-commit` already lets it through. Only the
|
|
3138
|
+
// lint-barrels check may declare that tolerance; prettier and the task's own test command have no
|
|
3139
|
+
// such contract and must keep failing on any non-zero status.
|
|
3140
|
+
it('declares exit 2 advisory on the lint-barrels check, and no advisory status on any other check', () => {
|
|
3141
|
+
const plan = planMechanicalChecks({
|
|
3142
|
+
testCommand: 'pnpm --filter aurora-back test session.spec.ts',
|
|
3143
|
+
lintBarrels: true,
|
|
3144
|
+
changedFiles: changed,
|
|
3145
|
+
exists: () => true,
|
|
3146
|
+
});
|
|
3147
|
+
const lintBarrels = plan.checks.find((check) => check.label === 'lint-barrels');
|
|
3148
|
+
assert.deepEqual(lintBarrels?.advisoryStatuses, [2]);
|
|
3149
|
+
|
|
3150
|
+
for (const check of plan.checks) {
|
|
3151
|
+
if (check.label === 'lint-barrels') continue;
|
|
3152
|
+
assert.equal(
|
|
3153
|
+
check.advisoryStatuses,
|
|
3154
|
+
undefined,
|
|
3155
|
+
`${check.label} must declare no advisory status`,
|
|
3156
|
+
);
|
|
3157
|
+
}
|
|
3158
|
+
});
|
|
3159
|
+
});
|
|
3160
|
+
|
|
3161
|
+
describe('evaluateMechanicalCheckResult', () => {
|
|
3162
|
+
const lintBarrelsCheck = {
|
|
3163
|
+
label: 'lint-barrels',
|
|
3164
|
+
command: 'pnpm',
|
|
3165
|
+
args: ['hr:lint-barrels', '--', 'backend/src/@api/x.ts'],
|
|
3166
|
+
advisoryStatuses: [2],
|
|
3167
|
+
};
|
|
3168
|
+
const prettierCheck = {
|
|
3169
|
+
label: 'prettier --check (aurora-back)',
|
|
3170
|
+
command: 'pnpm',
|
|
3171
|
+
args: ['--filter', 'aurora-back', 'exec', 'prettier', '--check'],
|
|
3172
|
+
};
|
|
3173
|
+
|
|
3174
|
+
it('passes any check on exit 0', () => {
|
|
3175
|
+
assert.deepEqual(evaluateMechanicalCheckResult(lintBarrelsCheck, 0), {
|
|
3176
|
+
ok: true,
|
|
3177
|
+
advisory: false,
|
|
3178
|
+
});
|
|
3179
|
+
assert.deepEqual(evaluateMechanicalCheckResult(prettierCheck, 0), {
|
|
3180
|
+
ok: true,
|
|
3181
|
+
advisory: false,
|
|
3182
|
+
});
|
|
3183
|
+
});
|
|
3184
|
+
|
|
3185
|
+
// AC2, direction 1: a blocking barrels finding (exit 1) still fails the attempt.
|
|
3186
|
+
it('fails lint-barrels on exit 1 — a blocking finding is not declared advisory', () => {
|
|
3187
|
+
assert.deepEqual(evaluateMechanicalCheckResult(lintBarrelsCheck, 1), {
|
|
3188
|
+
ok: false,
|
|
3189
|
+
advisory: false,
|
|
3190
|
+
});
|
|
3191
|
+
});
|
|
3192
|
+
|
|
3193
|
+
// AC2, direction 2: an informational barrels finding (exit 2) is tolerated.
|
|
3194
|
+
it('passes lint-barrels on exit 2 — the declared advisory status', () => {
|
|
3195
|
+
assert.deepEqual(evaluateMechanicalCheckResult(lintBarrelsCheck, 2), {
|
|
3196
|
+
ok: true,
|
|
3197
|
+
advisory: true,
|
|
3198
|
+
});
|
|
3199
|
+
});
|
|
3200
|
+
|
|
3201
|
+
// AC3: prettier declares no advisory status, so it fails on the very same exit code that
|
|
3202
|
+
// lint-barrels tolerates — the tolerance never leaks to a check that did not ask for it.
|
|
3203
|
+
it('fails a check with no advisory contract on exit 2, unlike lint-barrels', () => {
|
|
3204
|
+
assert.deepEqual(evaluateMechanicalCheckResult(prettierCheck, 2), {
|
|
3205
|
+
ok: false,
|
|
3206
|
+
advisory: false,
|
|
3207
|
+
});
|
|
3208
|
+
});
|
|
3209
|
+
});
|
|
3210
|
+
|
|
3211
|
+
describe('collectAttemptDiff', () => {
|
|
3212
|
+
// J2: a plain `diff HEAD` cannot see an UNTRACKED file, and a dispatched attempt's created files
|
|
3213
|
+
// are all untracked (the executor may not run git at all). The reviewer was therefore handed a
|
|
3214
|
+
// diff with every new file missing from it — and duly approved code it never saw. The
|
|
3215
|
+
// intent-to-add registers them so the very next diff renders them in full.
|
|
3216
|
+
it('marks untracked files intent-to-add BEFORE diffing, so created files reach the reviewer', () => {
|
|
3217
|
+
const calls: string[][] = [];
|
|
3218
|
+
const diff = collectAttemptDiff({
|
|
3219
|
+
base: 'main',
|
|
3220
|
+
runGit: (args) => {
|
|
3221
|
+
calls.push(args);
|
|
3222
|
+
return args.includes('main...HEAD') ? 'committed hunk\n' : 'uncommitted hunk\n';
|
|
3223
|
+
},
|
|
3224
|
+
});
|
|
3225
|
+
|
|
3226
|
+
assert.deepEqual(calls, [
|
|
3227
|
+
['add', '-N', '-A', '--', '.'],
|
|
3228
|
+
['diff', 'main...HEAD'],
|
|
3229
|
+
['diff', 'HEAD'],
|
|
3230
|
+
]);
|
|
3231
|
+
assert.ok(diff.includes('committed hunk'));
|
|
3232
|
+
assert.ok(diff.includes('uncommitted hunk'));
|
|
3233
|
+
});
|
|
3234
|
+
|
|
3235
|
+
it('never returns an empty string: a reviewer given no diff would approve nothing at all', () => {
|
|
3236
|
+
const diff = collectAttemptDiff({ base: 'main', runGit: () => '' });
|
|
3237
|
+
assert.match(diff, /sin cambios/i);
|
|
3238
|
+
});
|
|
3239
|
+
|
|
3240
|
+
it('fails the step when the intent-to-add itself fails, rather than reviewing a partial diff', () => {
|
|
3241
|
+
assert.throws(
|
|
3242
|
+
() =>
|
|
3243
|
+
collectAttemptDiff({
|
|
3244
|
+
base: 'main',
|
|
3245
|
+
runGit: (args) => {
|
|
3246
|
+
if (args[0] === 'add') {
|
|
3247
|
+
throw new Error('fatal: index file corrupt');
|
|
3248
|
+
}
|
|
3249
|
+
return '';
|
|
3250
|
+
},
|
|
3251
|
+
}),
|
|
3252
|
+
/index file corrupt/,
|
|
3253
|
+
);
|
|
3254
|
+
});
|
|
3255
|
+
|
|
3256
|
+
// G10: a note in place of the diff was handed to the reviewer as if it WERE the diff, and the
|
|
3257
|
+
// reviewer then judged an empty change set. An uncollectable diff has to fail the step instead.
|
|
3258
|
+
it('throws when git fails, so the caller fails the reviewer step instead of reviewing a note', () => {
|
|
3259
|
+
assert.throws(
|
|
3260
|
+
() =>
|
|
3261
|
+
collectAttemptDiff({
|
|
3262
|
+
base: 'main',
|
|
3263
|
+
runGit: () => {
|
|
3264
|
+
throw new Error('fatal: not a git repository');
|
|
3265
|
+
},
|
|
3266
|
+
}),
|
|
3267
|
+
/not a git repository/,
|
|
3268
|
+
);
|
|
3269
|
+
});
|
|
3270
|
+
});
|
|
3271
|
+
|
|
3272
|
+
// ── F1: the WIP commit message must survive commitlint ────────────────────────
|
|
3273
|
+
|
|
3274
|
+
describe('buildWipCommitMessage', () => {
|
|
3275
|
+
it('is a Conventional Commit whose scope is the task id in lowercase', () => {
|
|
3276
|
+
assert.equal(buildWipCommitMessage('T-12'), 'chore(t-12): wip dispatcher auto-save');
|
|
3277
|
+
});
|
|
3278
|
+
|
|
3279
|
+
it("stays inside commitlint's 100-character header limit for a dotted subtask id", () => {
|
|
3280
|
+
assert.ok(buildWipCommitMessage('T-123.45').length <= 100);
|
|
3281
|
+
});
|
|
3282
|
+
|
|
3283
|
+
// The husky `commit-msg` hook runs in every worktree slot, so THIS repo's real commitlint config
|
|
3284
|
+
// is the only authority on whether the auto-save commit lands. Skipped (not failed) where the
|
|
3285
|
+
// binary is unavailable — a unit suite must not depend on a node_modules install.
|
|
3286
|
+
it("passes this repo's own commitlint, the hook the slot's commit actually goes through", () => {
|
|
3287
|
+
let output: { status: number };
|
|
3288
|
+
try {
|
|
3289
|
+
execFileSync('npx', ['--no', '--', 'commitlint', '--quiet'], {
|
|
3290
|
+
input: buildWipCommitMessage('T-12'),
|
|
3291
|
+
encoding: 'utf8',
|
|
3292
|
+
stdio: ['pipe', 'ignore', 'ignore'],
|
|
3293
|
+
});
|
|
3294
|
+
output = { status: 0 };
|
|
3295
|
+
} catch (error) {
|
|
3296
|
+
const failure = error as { status?: number; code?: string };
|
|
3297
|
+
if (failure.code === 'ENOENT' || failure.status === 127) {
|
|
3298
|
+
return; // commitlint not installed in this environment.
|
|
3299
|
+
}
|
|
3300
|
+
output = { status: failure.status ?? 1 };
|
|
3301
|
+
}
|
|
3302
|
+
assert.equal(output.status, 0, 'commitlint rejected the dispatcher WIP commit message');
|
|
3303
|
+
});
|
|
3304
|
+
});
|
|
3305
|
+
|
|
3306
|
+
describe('executeClose — a runner that THROWS', () => {
|
|
3307
|
+
it('still saves work before releasing, instead of escaping the close entirely', () => {
|
|
3308
|
+
const { calls, runners } = recordingRunners({
|
|
3309
|
+
formatLintTest: () => {
|
|
3310
|
+
calls.push('formatLintTest');
|
|
3311
|
+
throw new Error('git: command not found');
|
|
3312
|
+
},
|
|
3313
|
+
});
|
|
3314
|
+
|
|
3315
|
+
const executed = executeClose(planClose({ outcome: 'success', lane: LANE.FRONTIER }), runners, {
|
|
3316
|
+
lane: LANE.FRONTIER,
|
|
3317
|
+
attempt: 1,
|
|
3318
|
+
branch: 'task/T-1',
|
|
3319
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
3320
|
+
});
|
|
3321
|
+
|
|
3322
|
+
assert.deepEqual(calls, [
|
|
3323
|
+
'boardCheck',
|
|
3324
|
+
'scopeCheck',
|
|
3325
|
+
'formatLintTest',
|
|
3326
|
+
'saveWork',
|
|
3327
|
+
'block',
|
|
3328
|
+
'releaseSlot',
|
|
3329
|
+
]);
|
|
3330
|
+
assert.deepEqual(executed, [
|
|
3331
|
+
'boardCheck',
|
|
3332
|
+
'scopeCheck',
|
|
3333
|
+
'formatLintTest',
|
|
3334
|
+
'saveWork',
|
|
3335
|
+
'block',
|
|
3336
|
+
'releaseSlot',
|
|
3337
|
+
]);
|
|
3338
|
+
});
|
|
3339
|
+
|
|
3340
|
+
it('keeps the slot when saveWork itself throws — the work may never have been committed', () => {
|
|
3341
|
+
const { calls, runners } = recordingRunners({
|
|
3342
|
+
scopeCheck: () => {
|
|
3343
|
+
calls.push('scopeCheck');
|
|
3344
|
+
return { ok: false, reason: 'scope-check-failed', humanReviewFiles: [] };
|
|
3345
|
+
},
|
|
3346
|
+
saveWork: () => {
|
|
3347
|
+
calls.push('saveWork');
|
|
3348
|
+
throw new Error('git push exploded');
|
|
3349
|
+
},
|
|
3350
|
+
});
|
|
3351
|
+
|
|
3352
|
+
executeClose(planClose({ outcome: 'success', lane: LANE.FRONTIER }), runners, {
|
|
3353
|
+
lane: LANE.FRONTIER,
|
|
3354
|
+
attempt: 1,
|
|
3355
|
+
branch: 'task/T-1',
|
|
3356
|
+
logPath: '.backlog/.dispatch/T-1/intento-1/run.log',
|
|
3357
|
+
});
|
|
3358
|
+
|
|
3359
|
+
assert.deepEqual(calls, ['boardCheck', 'scopeCheck', 'saveWork', 'blockKeepSlot']);
|
|
3360
|
+
});
|
|
3361
|
+
});
|
|
3362
|
+
|
|
3363
|
+
// ── F3: the pre-PR gate is about ACCEPTANCE CRITERIA ──────────────────────────
|
|
3364
|
+
|
|
3365
|
+
const gateTask = (acLines: string[], dodLines: string[]): string =>
|
|
3366
|
+
[
|
|
3367
|
+
'Acceptance Criteria:',
|
|
3368
|
+
'--------------------------------------------------',
|
|
3369
|
+
...acLines,
|
|
3370
|
+
'',
|
|
3371
|
+
'Definition of Done:',
|
|
3372
|
+
'--------------------------------------------------',
|
|
3373
|
+
...dodLines,
|
|
3374
|
+
'',
|
|
3375
|
+
].join('\n');
|
|
3376
|
+
|
|
3377
|
+
describe('evaluateAcceptanceGate', () => {
|
|
3378
|
+
it('passes when every acceptance criterion is checked and the dispatcher already ticked its own DoD', () => {
|
|
3379
|
+
const result = evaluateAcceptanceGate(
|
|
3380
|
+
gateTask(
|
|
3381
|
+
['- [x] #1 Uno'],
|
|
3382
|
+
['- [x] #1 Scoped tests pass with the command declared in the task'],
|
|
3383
|
+
),
|
|
3384
|
+
);
|
|
3385
|
+
assert.deepEqual(result, { ok: true });
|
|
3386
|
+
});
|
|
3387
|
+
|
|
3388
|
+
// J6: the gate runs AFTER the triad, and the triad ticks "scoped tests pass" only when a test
|
|
3389
|
+
// actually ran and passed. Still unticked here means no test ran — and the gate used to let that
|
|
3390
|
+
// through, because the item is dispatcher-owned and therefore excluded from the human list. An
|
|
3391
|
+
// attempt reached its PR with the tests-pass box ticked by nobody and verified by nothing.
|
|
3392
|
+
it('fails when the dispatcher-owned "scoped tests pass" item is still unticked at the gate', () => {
|
|
3393
|
+
const result = evaluateAcceptanceGate(
|
|
3394
|
+
gateTask(
|
|
3395
|
+
['- [x] #1 Uno'],
|
|
3396
|
+
['- [ ] #1 Scoped tests pass with the command declared in the task'],
|
|
3397
|
+
),
|
|
3398
|
+
);
|
|
3399
|
+
assert.equal(result.ok, false);
|
|
3400
|
+
assert.match(result.question ?? '', /no declara Test command/);
|
|
3401
|
+
});
|
|
3402
|
+
|
|
3403
|
+
it('passes a task whose Definition of Done never mentions scoped tests at all', () => {
|
|
3404
|
+
const result = evaluateAcceptanceGate(
|
|
3405
|
+
gateTask(['- [x] #1 Uno'], ['- [x] #1 PR opened to main']),
|
|
3406
|
+
);
|
|
3407
|
+
assert.deepEqual(result, { ok: true });
|
|
3408
|
+
});
|
|
3409
|
+
|
|
3410
|
+
it('fails naming the acceptance criteria the worker left unchecked', () => {
|
|
3411
|
+
const result = evaluateAcceptanceGate(gateTask(['- [x] #1 Uno', '- [ ] #2 Dos'], []));
|
|
3412
|
+
assert.equal(result.ok, false);
|
|
3413
|
+
assert.match(result.question ?? '', /Dos/);
|
|
3414
|
+
});
|
|
3415
|
+
|
|
3416
|
+
it('fails on an unchecked DoD item no close step proves', () => {
|
|
3417
|
+
const result = evaluateAcceptanceGate(
|
|
3418
|
+
gateTask(['- [x] #1 Uno'], ['- [ ] #1 Un humano revisa el diseno']),
|
|
3419
|
+
);
|
|
3420
|
+
assert.equal(result.ok, false);
|
|
3421
|
+
assert.match(result.question ?? '', /humano/);
|
|
3422
|
+
});
|
|
3423
|
+
|
|
3424
|
+
it('fails a task that declares no acceptance criteria at all', () => {
|
|
3425
|
+
const result = evaluateAcceptanceGate(gateTask([], []));
|
|
3426
|
+
assert.equal(result.ok, false);
|
|
3427
|
+
assert.equal(result.question, 'la tarea no declara criterios de aceptación');
|
|
3428
|
+
});
|
|
3429
|
+
});
|
|
3430
|
+
|
|
3431
|
+
// ── F16: a Blocked comment body the backlog CLI actually accepts ──────────────
|
|
3432
|
+
|
|
3433
|
+
describe('sanitizeCommentBody', () => {
|
|
3434
|
+
it('replaces a standalone --- line, which `backlog task edit --comment` rejects outright', () => {
|
|
3435
|
+
assert.equal(sanitizeCommentBody('antes\n---\ndespués'), 'antes\n___\ndespués');
|
|
3436
|
+
});
|
|
3437
|
+
|
|
3438
|
+
it('leaves a dash run inside a line alone — only a STANDALONE --- is reserved', () => {
|
|
3439
|
+
assert.equal(sanitizeCommentBody('a --- b'), 'a --- b');
|
|
3440
|
+
});
|
|
3441
|
+
|
|
3442
|
+
it('truncates a very long body and says where the rest lives', () => {
|
|
3443
|
+
const sanitized = sanitizeCommentBody('x'.repeat(6000));
|
|
3444
|
+
assert.ok(sanitized.length <= 4000);
|
|
3445
|
+
assert.match(sanitized, /\(truncado; ver review\.md\)$/);
|
|
3446
|
+
});
|
|
3447
|
+
|
|
3448
|
+
it('truncates with a CALLER-given tail instead, when one is passed', () => {
|
|
3449
|
+
const sanitized = sanitizeCommentBody('x'.repeat(6000), '\n\n(truncado; ver run.log)');
|
|
3450
|
+
assert.ok(sanitized.length <= 4000);
|
|
3451
|
+
assert.match(sanitized, /\(truncado; ver run\.log\)$/);
|
|
3452
|
+
assert.ok(!/review\.md/.test(sanitized));
|
|
3453
|
+
});
|
|
3454
|
+
});
|
|
3455
|
+
|
|
3456
|
+
// ── needsGuidanceQuestion: the Blocked comment's `question` for a needs-guidance outcome ──────
|
|
3457
|
+
//
|
|
3458
|
+
// T-6 measured a `Blocked` comment carrying only the reason, the branch and the log path for a
|
|
3459
|
+
// needs-guidance outcome — never the worker's own report (the split summary and its three design
|
|
3460
|
+
// decisions), which survived only in `stream.jsonl`/`run.log`. This is what fixes that: the
|
|
3461
|
+
// terminal `result` event's own text becomes the question, sanitized and capped like every other
|
|
3462
|
+
// one — but pointing at `run.log`, where the FULL report lives, not `review.md`.
|
|
3463
|
+
describe('needsGuidanceQuestion', () => {
|
|
3464
|
+
it('returns undefined for an absent or blank result text — the comment then names just the outcome', () => {
|
|
3465
|
+
assert.equal(needsGuidanceQuestion(undefined), undefined);
|
|
3466
|
+
assert.equal(needsGuidanceQuestion(' '), undefined);
|
|
3467
|
+
});
|
|
3468
|
+
|
|
3469
|
+
it("carries the worker's own report through verbatim when it fits", () => {
|
|
3470
|
+
assert.equal(
|
|
3471
|
+
needsGuidanceQuestion('status: needs-guidance (ver preguntas en el texto)'),
|
|
3472
|
+
'status: needs-guidance (ver preguntas en el texto)',
|
|
3473
|
+
);
|
|
3474
|
+
});
|
|
3475
|
+
|
|
3476
|
+
it('sanitizes a standalone --- line, exactly like every other comment body', () => {
|
|
3477
|
+
assert.equal(needsGuidanceQuestion('antes\n---\ndespués'), 'antes\n___\ndespués');
|
|
3478
|
+
});
|
|
3479
|
+
|
|
3480
|
+
it('truncates an over-long report and points at run.log, never review.md', () => {
|
|
3481
|
+
const question = needsGuidanceQuestion('x'.repeat(6000));
|
|
3482
|
+
assert.ok((question?.length ?? 0) <= 4000);
|
|
3483
|
+
assert.match(question ?? '', /\(truncado; ver run\.log\)$/);
|
|
3484
|
+
assert.ok(!/review\.md/.test(question ?? ''));
|
|
3485
|
+
});
|
|
3486
|
+
});
|
|
3487
|
+
|
|
3488
|
+
describe('formatBlockComment', () => {
|
|
3489
|
+
it('sanitizes the reviewer verdict it embeds, so the whole comment is postable', () => {
|
|
3490
|
+
const comment = formatBlockComment({
|
|
3491
|
+
reason: 'reviewer-rejected',
|
|
3492
|
+
question: 'VERDICT: fail\n---\nEl test no falla si rompes la lógica.',
|
|
3493
|
+
branch: 'task/T-12',
|
|
3494
|
+
logPath: '.backlog/.dispatch/T-12/intento-1/run.log',
|
|
3495
|
+
whatToDo: 'Corrige y reencola.',
|
|
3496
|
+
attempt: 2,
|
|
3497
|
+
terminal: false,
|
|
3498
|
+
});
|
|
3499
|
+
assert.ok(!/^---$/m.test(comment));
|
|
3500
|
+
assert.match(comment, /task\/T-12/);
|
|
3501
|
+
});
|
|
3502
|
+
|
|
3503
|
+
// T-31 round 2. The soft-list mark lives on the pull request, and a FAILED close opens none: the
|
|
3504
|
+
// failure plan is `save-work` then `block`, with no `open-pr` step at all. So the one channel
|
|
3505
|
+
// that reaches a person on that path — this comment — must name the soft-list files the scope
|
|
3506
|
+
// check admitted, or an attempt that touched the dispatcher's own sources and then failed leaves
|
|
3507
|
+
// no record of having done so anywhere.
|
|
3508
|
+
it('names the soft-list files the scope check admitted, since a failed close opens no PR to mark', () => {
|
|
3509
|
+
const comment = formatBlockComment({
|
|
3510
|
+
reason: 'format-lint-test-failed',
|
|
3511
|
+
branch: 'task/T-12',
|
|
3512
|
+
logPath: '.backlog/.dispatch/T-12/intento-1/run.log',
|
|
3513
|
+
whatToDo: 'Corrige y reencola.',
|
|
3514
|
+
attempt: 2,
|
|
3515
|
+
terminal: false,
|
|
3516
|
+
humanReviewFiles: ['scripts/backlog/close.ts', 'packages/cli/src/index.ts'],
|
|
3517
|
+
});
|
|
3518
|
+
assert.match(comment, /scripts\/backlog\/close\.ts/);
|
|
3519
|
+
assert.match(comment, /packages\/cli\/src\/index\.ts/);
|
|
3520
|
+
});
|
|
3521
|
+
|
|
3522
|
+
it('adds no soft-list section when the attempt reached none', () => {
|
|
3523
|
+
const comment = formatBlockComment({
|
|
3524
|
+
reason: 'format-lint-test-failed',
|
|
3525
|
+
branch: 'task/T-12',
|
|
3526
|
+
logPath: '.backlog/.dispatch/T-12/intento-1/run.log',
|
|
3527
|
+
whatToDo: 'Corrige y reencola.',
|
|
3528
|
+
attempt: 2,
|
|
3529
|
+
terminal: false,
|
|
3530
|
+
humanReviewFiles: [],
|
|
3531
|
+
});
|
|
3532
|
+
assert.ok(!/lista blanda/i.test(comment));
|
|
3533
|
+
});
|
|
3534
|
+
|
|
3535
|
+
// T-31 round 3: the equivalent of the PR body's 120-file cap test, on the OTHER channel. Both
|
|
3536
|
+
// existing block-comment tests pass two files, so `MAX_MARKED_FILES` and the dropped-count tail
|
|
3537
|
+
// would pass here whether or not the cap applied — and this is the ONLY channel the failure path
|
|
3538
|
+
// reaches. `sanitizeCommentBody` truncates the whole comment at 4000 chars, so an uncapped list
|
|
3539
|
+
// does not merely bloat the comment: it pushes `whatToDo` (the one actionable line) off the end.
|
|
3540
|
+
//
|
|
3541
|
+
// Round 4: both tests passed `question: undefined`, so the risk they name — the actionable line
|
|
3542
|
+
// evicted by the list — could not be reproduced by either. A `needs-guidance` question IS the
|
|
3543
|
+
// worker's whole final report (`needsGuidanceQuestion`), routinely a couple of kilobytes, and with
|
|
3544
|
+
// one of those in place the 2000-char list budget alone (half the comment's own 4000) still evicted
|
|
3545
|
+
// the actionable line. Both tests now carry one.
|
|
3546
|
+
it('caps the soft-list file list and keeps the actionable line inside the 4000-char body', () => {
|
|
3547
|
+
const many = Array.from({ length: 120 }, (_, index) => `packages/cli/src/f${index}.ts`);
|
|
3548
|
+
const comment = formatBlockComment({
|
|
3549
|
+
reason: 'format-lint-test-failed',
|
|
3550
|
+
question: `informe del worker: ${'x'.repeat(1900)}`,
|
|
3551
|
+
branch: 'task/T-12',
|
|
3552
|
+
logPath: '.backlog/.dispatch/T-12/intento-1/run.log',
|
|
3553
|
+
whatToDo: 'Corrige y reencola.',
|
|
3554
|
+
attempt: 2,
|
|
3555
|
+
terminal: false,
|
|
3556
|
+
humanReviewFiles: many,
|
|
3557
|
+
});
|
|
3558
|
+
assert.ok(comment.includes('packages/cli/src/f0.ts'));
|
|
3559
|
+
assert.ok(!comment.includes('packages/cli/src/f119.ts'), 'the tail must be dropped, not spliced');
|
|
3560
|
+
assert.match(comment, /y \d+ más/);
|
|
3561
|
+
assert.ok(comment.includes('Corrige y reencola.'), 'the actionable line must survive the splice');
|
|
3562
|
+
assert.ok(comment.length <= 4000);
|
|
3563
|
+
});
|
|
3564
|
+
|
|
3565
|
+
it('caps the block comment list by total LENGTH too, not only by entry count', () => {
|
|
3566
|
+
const long = Array.from(
|
|
3567
|
+
{ length: 40 },
|
|
3568
|
+
(_, index) => `packages/cli/src/${'d'.repeat(600)}/f${index}.ts`,
|
|
3569
|
+
);
|
|
3570
|
+
const comment = formatBlockComment({
|
|
3571
|
+
reason: 'format-lint-test-failed',
|
|
3572
|
+
question: `informe del worker: ${'x'.repeat(1900)}`,
|
|
3573
|
+
branch: 'task/T-12',
|
|
3574
|
+
logPath: '.backlog/.dispatch/T-12/intento-1/run.log',
|
|
3575
|
+
whatToDo: 'Corrige y reencola.',
|
|
3576
|
+
attempt: 2,
|
|
3577
|
+
terminal: false,
|
|
3578
|
+
humanReviewFiles: long,
|
|
3579
|
+
});
|
|
3580
|
+
assert.match(comment, /y \d+ más/);
|
|
3581
|
+
assert.ok(comment.includes('Corrige y reencola.'), 'the actionable line must survive the splice');
|
|
3582
|
+
assert.ok(comment.length <= 4000);
|
|
3583
|
+
});
|
|
3584
|
+
|
|
3585
|
+
// The measured eviction (T-31 round 4): 40 soft paths of ~60 chars fill the list budget (2000) and a
|
|
3586
|
+
// 1900-char worker report fills most of the rest, and the comment reached EXACTLY 4000 chars with
|
|
3587
|
+
// `whatToDo` cut off — because the list budget is half the comment budget and knows nothing about
|
|
3588
|
+
// what the rest of the comment already used. The list is budgeted against what is left instead.
|
|
3589
|
+
it('keeps the actionable line when a full soft list meets a full worker report', () => {
|
|
3590
|
+
const sixtyish = Array.from(
|
|
3591
|
+
{ length: 40 },
|
|
3592
|
+
(_, index) => `packages/cli/src/${'d'.repeat(40)}/f${index}.ts`,
|
|
3593
|
+
);
|
|
3594
|
+
const comment = formatBlockComment({
|
|
3595
|
+
reason: 'needs-guidance',
|
|
3596
|
+
question: `informe del worker: ${'x'.repeat(1900)}`,
|
|
3597
|
+
branch: 'task/T-12',
|
|
3598
|
+
logPath: '.backlog/.dispatch/T-12/intento-1/run.log',
|
|
3599
|
+
whatToDo: 'Corrige y reencola.',
|
|
3600
|
+
attempt: 2,
|
|
3601
|
+
terminal: false,
|
|
3602
|
+
humanReviewFiles: sixtyish,
|
|
3603
|
+
});
|
|
3604
|
+
|
|
3605
|
+
assert.ok(comment.length <= 4000, `the comment was ${comment.length} chars`);
|
|
3606
|
+
assert.ok(comment.endsWith('Corrige y reencola.'), 'the actionable line is the last thing said');
|
|
3607
|
+
assert.match(comment, /lista blanda/, 'and the soft-list record is still there');
|
|
3608
|
+
});
|
|
3609
|
+
|
|
3610
|
+
// The other half of the same budget: when the worker's own report is what does not fit, the report
|
|
3611
|
+
// is the part that gets truncated, never the line telling a person what to do next.
|
|
3612
|
+
it('truncates the QUESTION rather than the actionable line when the report alone overflows', () => {
|
|
3613
|
+
const comment = formatBlockComment({
|
|
3614
|
+
reason: 'needs-guidance',
|
|
3615
|
+
question: 'y'.repeat(6000),
|
|
3616
|
+
branch: 'task/T-12',
|
|
3617
|
+
logPath: '.backlog/.dispatch/T-12/intento-1/run.log',
|
|
3618
|
+
whatToDo: 'Corrige y reencola.',
|
|
3619
|
+
attempt: 2,
|
|
3620
|
+
terminal: false,
|
|
3621
|
+
humanReviewFiles: ['scripts/backlog/close.ts'],
|
|
3622
|
+
});
|
|
3623
|
+
|
|
3624
|
+
assert.ok(comment.length <= 4000);
|
|
3625
|
+
assert.ok(comment.endsWith('Corrige y reencola.'), 'the actionable line is the last thing said');
|
|
3626
|
+
assert.match(comment, /truncad/, 'a truncated report must say so');
|
|
3627
|
+
assert.match(comment, /scripts\/backlog\/close\.ts/, 'the soft-list record survives too');
|
|
3628
|
+
});
|
|
3629
|
+
|
|
3630
|
+
// T-31 round 4: the failure-path record carries BOTH kinds, and the comment must not present a
|
|
3631
|
+
// mirror-output or hard-list leftover as a soft-list file the close admitted — the retry restores
|
|
3632
|
+
// that tree into the slot from `task/<id>`, so this line is what tells the person releasing the
|
|
3633
|
+
// task to clean it up.
|
|
3634
|
+
it('names the forbidden leftovers apart from the soft-list ones, never as admitted files', () => {
|
|
3635
|
+
const comment = formatBlockComment({
|
|
3636
|
+
reason: 'needs-guidance',
|
|
3637
|
+
branch: 'task/T-12',
|
|
3638
|
+
logPath: '.backlog/.dispatch/T-12/intento-1/run.log',
|
|
3639
|
+
whatToDo: 'Corrige y reencola.',
|
|
3640
|
+
attempt: 2,
|
|
3641
|
+
terminal: false,
|
|
3642
|
+
forbiddenFiles: ['packages/cli/src/templates/monorepo/x.ts', '.claude/settings.json'],
|
|
3643
|
+
humanReviewFiles: ['scripts/backlog/entry.ts'],
|
|
3644
|
+
});
|
|
3645
|
+
|
|
3646
|
+
const forbiddenLine = comment
|
|
3647
|
+
.split('\n')
|
|
3648
|
+
.find((line) => line.includes('.claude/settings.json'));
|
|
3649
|
+
const softLine = comment.split('\n').find((line) => line.includes('lista blanda'));
|
|
3650
|
+
|
|
3651
|
+
assert.ok(forbiddenLine !== undefined, 'the forbidden leftovers must be named');
|
|
3652
|
+
assert.match(forbiddenLine ?? '', /prohibid/i, 'and named as forbidden, not as admitted');
|
|
3653
|
+
assert.ok(forbiddenLine?.includes('packages/cli/src/templates/monorepo/x.ts'));
|
|
3654
|
+
assert.ok(
|
|
3655
|
+
!forbiddenLine?.includes('scripts/backlog/entry.ts'),
|
|
3656
|
+
'the two kinds must not share a line',
|
|
3657
|
+
);
|
|
3658
|
+
assert.ok(softLine !== undefined && softLine.includes('scripts/backlog/entry.ts'));
|
|
3659
|
+
assert.ok(!softLine?.includes('.claude/settings.json'));
|
|
3660
|
+
});
|
|
3661
|
+
|
|
3662
|
+
it('adds no forbidden section when the attempt left none', () => {
|
|
3663
|
+
const comment = formatBlockComment({
|
|
3664
|
+
reason: 'format-lint-test-failed',
|
|
3665
|
+
branch: 'task/T-12',
|
|
3666
|
+
logPath: '.backlog/.dispatch/T-12/intento-1/run.log',
|
|
3667
|
+
whatToDo: 'Corrige y reencola.',
|
|
3668
|
+
attempt: 2,
|
|
3669
|
+
terminal: false,
|
|
3670
|
+
forbiddenFiles: [],
|
|
3671
|
+
humanReviewFiles: [],
|
|
3672
|
+
});
|
|
3673
|
+
assert.ok(!/prohibid/i.test(comment));
|
|
3674
|
+
});
|
|
3675
|
+
|
|
3676
|
+
// T-83: `classifyStreamOutcome` never hands out the literal 'success' as a failure cause (an
|
|
3677
|
+
// `is_error: true` result whose own subtype says 'success' becomes `STREAM_OUTCOME.UNNAMED_FAILURE`
|
|
3678
|
+
// instead). `formatBlockComment` echoes `details.reason` verbatim as the comment's first line, so
|
|
3679
|
+
// this is the one test proving that name — not the raw subtype — is what a person actually reads.
|
|
3680
|
+
it('shows the unnamed-failure name as the reason, never the success subtype it replaces', () => {
|
|
3681
|
+
const comment = formatBlockComment({
|
|
3682
|
+
reason: STREAM_OUTCOME.UNNAMED_FAILURE,
|
|
3683
|
+
branch: 'task/T-13',
|
|
3684
|
+
logPath: '.backlog/.dispatch/T-13/intento-1/run.log',
|
|
3685
|
+
whatToDo: 'Corrige y reencola.',
|
|
3686
|
+
attempt: 1,
|
|
3687
|
+
terminal: false,
|
|
3688
|
+
});
|
|
3689
|
+
assert.match(comment, /unnamed-failure/);
|
|
3690
|
+
assert.ok(!/\bsuccess\b/.test(comment), 'a failed attempt must never read as a success in the reason');
|
|
3691
|
+
});
|
|
3692
|
+
});
|
|
3693
|
+
|
|
3694
|
+
// ── H14/H15: the PR title, and one casing across both dispatcher-authored commits ─────────────
|
|
3695
|
+
|
|
3696
|
+
describe('buildPrTitle', () => {
|
|
3697
|
+
it("uses '<id>: <title>' so a board of PRs is readable without opening any of them", () => {
|
|
3698
|
+
assert.equal(
|
|
3699
|
+
buildPrTitle('T-12', 'Refresh an expired session token'),
|
|
3700
|
+
'T-12: Refresh an expired session token',
|
|
3701
|
+
);
|
|
3702
|
+
});
|
|
3703
|
+
|
|
3704
|
+
it('falls back to the bare id when the task title could not be read', () => {
|
|
3705
|
+
assert.equal(buildPrTitle('T-12', null), 'T-12');
|
|
3706
|
+
assert.equal(buildPrTitle('T-12', ' '), 'T-12');
|
|
3707
|
+
});
|
|
3708
|
+
});
|
|
3709
|
+
|
|
3710
|
+
describe('buildAttemptCommitMessage', () => {
|
|
3711
|
+
it('scopes the commit with the task id in the SAME casing the WIP auto-save uses', () => {
|
|
3712
|
+
assert.equal(buildAttemptCommitMessage('T-12', 3), 'feat(t-12): dispatched attempt 3');
|
|
3713
|
+
assert.match(buildWipCommitMessage('T-12'), /^chore\(t-12\)/);
|
|
3714
|
+
});
|
|
3715
|
+
});
|
|
3716
|
+
|
|
3717
|
+
// ── T-68: the «Registro de ejecución» block (`catalyst-backlog/SKILL.md` §12) ────────────────
|
|
3718
|
+
|
|
3719
|
+
describe('hasExecutionRecordBlock', () => {
|
|
3720
|
+
it('is true once the notes carry the heading on its own line', () => {
|
|
3721
|
+
assert.ok(hasExecutionRecordBlock(`Some earlier note.\n\n${EXECUTION_RECORD_HEADING}\n\n- **Modo:** headless`));
|
|
3722
|
+
});
|
|
3723
|
+
|
|
3724
|
+
it('is false for notes with no heading, empty notes, and no notes at all', () => {
|
|
3725
|
+
assert.ok(!hasExecutionRecordBlock('Just a regular progress note.'));
|
|
3726
|
+
assert.ok(!hasExecutionRecordBlock(''));
|
|
3727
|
+
assert.ok(!hasExecutionRecordBlock(null));
|
|
3728
|
+
assert.ok(!hasExecutionRecordBlock(undefined));
|
|
3729
|
+
});
|
|
3730
|
+
|
|
3731
|
+
// Fix 4: the heading must be a WHOLE LINE, never a substring — a worker's own progress note can
|
|
3732
|
+
// legitimately mention it in prose without that being the block itself.
|
|
3733
|
+
it('is false when the heading appears only as part of a longer line, never on its own', () => {
|
|
3734
|
+
assert.ok(!hasExecutionRecordBlock(`texto ${EXECUTION_RECORD_HEADING} aquí, no es el bloque real`));
|
|
3735
|
+
assert.ok(!hasExecutionRecordBlock(`${EXECUTION_RECORD_HEADING} — nota al margen`));
|
|
3736
|
+
});
|
|
3737
|
+
});
|
|
3738
|
+
|
|
3739
|
+
describe('buildExecutionRecordBlock', () => {
|
|
3740
|
+
const baseInput: ExecutionRecordInput = {
|
|
3741
|
+
lane: LANE.LOCAL,
|
|
3742
|
+
attempts: 1,
|
|
3743
|
+
attemptOutcomes: ['completed'],
|
|
3744
|
+
reviewVerdicts: ['pass'],
|
|
3745
|
+
sourcePath: '.backlog/.dispatch/T-12/intento-1',
|
|
3746
|
+
};
|
|
3747
|
+
|
|
3748
|
+
it('writes the heading first, then all eight fields in the fixed §12.1 order', () => {
|
|
3749
|
+
const block = buildExecutionRecordBlock(baseInput);
|
|
3750
|
+
const lines = block.split('\n');
|
|
3751
|
+
assert.equal(lines[0], EXECUTION_RECORD_HEADING);
|
|
3752
|
+
assert.deepEqual(
|
|
3753
|
+
lines.filter((line) => line.startsWith('- **')).map((line) => line.match(/^- \*\*([^*]+):\*\*/)?.[1]),
|
|
3754
|
+
[
|
|
3755
|
+
'Modo',
|
|
3756
|
+
'Resultado del intento 1',
|
|
3757
|
+
'Rondas de corrección',
|
|
3758
|
+
'Arreglos posteriores al merge',
|
|
3759
|
+
'Intervenciones humanas',
|
|
3760
|
+
'Fallos de entorno',
|
|
3761
|
+
'Tiempo de ciclo',
|
|
3762
|
+
'Fuente',
|
|
3763
|
+
],
|
|
3764
|
+
);
|
|
3765
|
+
});
|
|
3766
|
+
|
|
3767
|
+
it('a single completed, PASSED-review attempt on the local lane: Done, zero rounds, no interventions', () => {
|
|
3768
|
+
const block = buildExecutionRecordBlock(baseInput);
|
|
3769
|
+
assert.match(block, /\*\*Modo:\*\* headless — lane:local/);
|
|
3770
|
+
assert.match(block, /\*\*Resultado del intento 1:\*\* Done/);
|
|
3771
|
+
assert.match(block, /\*\*Rondas de corrección:\*\* 0 — revisor: code-review/);
|
|
3772
|
+
assert.match(block, /\*\*Intervenciones humanas:\*\* 0 — tipo: ninguna/);
|
|
3773
|
+
assert.match(block, /\*\*Fuente:\*\* \.backlog\/\.dispatch\/T-12\/intento-1/);
|
|
3774
|
+
});
|
|
3775
|
+
|
|
3776
|
+
it('a retried task (3 attempts) with an unknown first-attempt outcome reads "reintento", never an invented cause', () => {
|
|
3777
|
+
const block = buildExecutionRecordBlock({
|
|
3778
|
+
...baseInput,
|
|
3779
|
+
attempts: 3,
|
|
3780
|
+
attemptOutcomes: [],
|
|
3781
|
+
reviewVerdicts: ['fail', 'fail', 'pass'],
|
|
3782
|
+
sourcePath: '.backlog/.dispatch/T-12/intento-3',
|
|
3783
|
+
});
|
|
3784
|
+
assert.match(block, /\*\*Resultado del intento 1:\*\* reintento/);
|
|
3785
|
+
// "Intervenciones humanas" is its OWN count (attempts - 1 = 2, every retry passes through a
|
|
3786
|
+
// human-released Blocked, §10) — deliberately independent of the review-verdict count below.
|
|
3787
|
+
assert.match(block, /\*\*Intervenciones humanas:\*\* 2 — tipo: respuesta a Blocked/);
|
|
3788
|
+
});
|
|
3789
|
+
|
|
3790
|
+
it('a KNOWN first-attempt failure carries its real cause, not just the retry count', () => {
|
|
3791
|
+
const block = buildExecutionRecordBlock({
|
|
3792
|
+
...baseInput,
|
|
3793
|
+
attempts: 2,
|
|
3794
|
+
attemptOutcomes: ['needs-guidance', 'completed'],
|
|
3795
|
+
reviewVerdicts: [null, 'pass'],
|
|
3796
|
+
sourcePath: '.backlog/.dispatch/T-12/intento-2',
|
|
3797
|
+
});
|
|
3798
|
+
assert.match(block, /\*\*Resultado del intento 1:\*\* Blocked \(needs-guidance\)/);
|
|
3799
|
+
});
|
|
3800
|
+
|
|
3801
|
+
it('a first attempt whose stream said is_error:true with subtype "success" (T-83) never shows "success" as the cause', () => {
|
|
3802
|
+
const block = buildExecutionRecordBlock({
|
|
3803
|
+
...baseInput,
|
|
3804
|
+
attempts: 2,
|
|
3805
|
+
attemptOutcomes: [STREAM_OUTCOME.UNNAMED_FAILURE, 'completed'],
|
|
3806
|
+
reviewVerdicts: [null, 'pass'],
|
|
3807
|
+
sourcePath: '.backlog/.dispatch/T-12/intento-2',
|
|
3808
|
+
});
|
|
3809
|
+
assert.match(block, /\*\*Resultado del intento 1:\*\* Blocked \(unnamed-failure\)/);
|
|
3810
|
+
assert.doesNotMatch(block, /Blocked \(success\)/);
|
|
3811
|
+
});
|
|
3812
|
+
|
|
3813
|
+
it('a budget cutoff on any attempt is reported as "cuota"', () => {
|
|
3814
|
+
const block = buildExecutionRecordBlock({
|
|
3815
|
+
...baseInput,
|
|
3816
|
+
attempts: 2,
|
|
3817
|
+
attemptOutcomes: ['budget', 'completed'],
|
|
3818
|
+
reviewVerdicts: [null, 'pass'],
|
|
3819
|
+
sourcePath: '.backlog/.dispatch/T-12/intento-2',
|
|
3820
|
+
});
|
|
3821
|
+
assert.match(block, /\*\*Resultado del intento 1:\*\* Blocked \(budget\)/);
|
|
3822
|
+
assert.match(block, /\*\*Fallos de entorno:\*\* cuota/);
|
|
3823
|
+
});
|
|
3824
|
+
|
|
3825
|
+
it('rule 3 (§12.2): a field with no measured data reads "desconocido", never a guessed "ninguno"', () => {
|
|
3826
|
+
const block = buildExecutionRecordBlock(baseInput);
|
|
3827
|
+
// No budget outcome was ever observed, but LM Studio/network failures are untraceable after
|
|
3828
|
+
// the fact — the field must not claim "ninguno" (measured: it did not happen) for a cause this
|
|
3829
|
+
// module never actually checked.
|
|
3830
|
+
assert.match(block, /\*\*Fallos de entorno:\*\* desconocido/);
|
|
3831
|
+
// §12.2 rule 4: no status-transition timestamp is recorded anywhere today.
|
|
3832
|
+
assert.match(block, /\*\*Tiempo de ciclo:\*\* desconocido/);
|
|
3833
|
+
});
|
|
3834
|
+
|
|
3835
|
+
// ── T-68 latest: `attempts === 0` means the task was never dispatched at all — the dispatcher's
|
|
3836
|
+
// Worktree Gate forces even a SUPERVISADA (interactive) session onto a `task/T-nn` branch, so
|
|
3837
|
+
// step 3 closes it out exactly like a headless one the instant its PR merges. That absence of any
|
|
3838
|
+
// attempt is itself a measurement, not a headless task with zero attempts. ────────────────────
|
|
3839
|
+
|
|
3840
|
+
it('never dispatched (attempts: 0) with a known PR number: supervisada, desconocido interventions, PR as Fuente', () => {
|
|
3841
|
+
const block = buildExecutionRecordBlock({
|
|
3842
|
+
lane: LANE.FRONTIER,
|
|
3843
|
+
attempts: 0,
|
|
3844
|
+
attemptOutcomes: [],
|
|
3845
|
+
reviewVerdicts: [],
|
|
3846
|
+
sourcePath: null,
|
|
3847
|
+
prNumber: 188,
|
|
3848
|
+
});
|
|
3849
|
+
assert.match(block, /\*\*Modo:\*\* supervisada — desconocido/);
|
|
3850
|
+
assert.match(block, /\*\*Resultado del intento 1:\*\* desconocido/);
|
|
3851
|
+
assert.match(block, /\*\*Rondas de corrección:\*\* desconocido — revisor: desconocido/);
|
|
3852
|
+
assert.match(block, /\*\*Intervenciones humanas:\*\* desconocido — tipo: desconocido/);
|
|
3853
|
+
assert.match(block, /\*\*Fuente:\*\* PR #188/);
|
|
3854
|
+
});
|
|
3855
|
+
|
|
3856
|
+
it('never dispatched, PR confirmed to exist but its number could not be read: Fuente reads desconocido, never sin evidencia', () => {
|
|
3857
|
+
const block = buildExecutionRecordBlock({
|
|
3858
|
+
lane: LANE.FRONTIER,
|
|
3859
|
+
attempts: 0,
|
|
3860
|
+
attemptOutcomes: [],
|
|
3861
|
+
reviewVerdicts: [],
|
|
3862
|
+
sourcePath: null,
|
|
3863
|
+
prNumber: 'read-failed',
|
|
3864
|
+
});
|
|
3865
|
+
assert.match(block, /\*\*Fuente:\*\* desconocido/);
|
|
3866
|
+
});
|
|
3867
|
+
|
|
3868
|
+
it('never dispatched, no PR at all: the attempt-derived fields and the source all read "desconocido"/"sin evidencia"', () => {
|
|
3869
|
+
const block = buildExecutionRecordBlock({
|
|
3870
|
+
lane: LANE.FRONTIER,
|
|
3871
|
+
attempts: 0,
|
|
3872
|
+
attemptOutcomes: [],
|
|
3873
|
+
reviewVerdicts: [],
|
|
3874
|
+
sourcePath: null,
|
|
3875
|
+
prNumber: null,
|
|
3876
|
+
});
|
|
3877
|
+
assert.match(block, /\*\*Modo:\*\* supervisada — desconocido/);
|
|
3878
|
+
assert.match(block, /\*\*Resultado del intento 1:\*\* desconocido/);
|
|
3879
|
+
assert.match(block, /\*\*Rondas de corrección:\*\* desconocido — revisor: desconocido/);
|
|
3880
|
+
assert.match(block, /\*\*Intervenciones humanas:\*\* desconocido — tipo: desconocido/);
|
|
3881
|
+
assert.match(block, /\*\*Fuente:\*\* sin evidencia/);
|
|
3882
|
+
});
|
|
3883
|
+
|
|
3884
|
+
it('§12.2 rule 4: "Arreglos posteriores al merge" is always the fixed at-close value', () => {
|
|
3885
|
+
const block = buildExecutionRecordBlock(baseInput);
|
|
3886
|
+
assert.match(block, /\*\*Arreglos posteriores al merge:\*\* ninguno conocido al cierre/);
|
|
3887
|
+
});
|
|
3888
|
+
|
|
3889
|
+
it('an unknown lane degrades ONLY the Modo field to "desconocido" — revisor no longer reads the lane', () => {
|
|
3890
|
+
const block = buildExecutionRecordBlock({ ...baseInput, lane: undefined });
|
|
3891
|
+
assert.match(block, /\*\*Modo:\*\* headless — desconocido/);
|
|
3892
|
+
assert.match(block, /\*\*Rondas de corrección:\*\* 0 — revisor: code-review/);
|
|
3893
|
+
});
|
|
3894
|
+
|
|
3895
|
+
// ── Fix 2: "Rondas de corrección"/"revisor" come from MEASURED review.md data, never a guess ──
|
|
3896
|
+
|
|
3897
|
+
it('a quota-only retry (no review.md on the cut-off attempt, PASS on the real one) reads 0 rounds, not 1', () => {
|
|
3898
|
+
const block = buildExecutionRecordBlock({
|
|
3899
|
+
lane: LANE.LOCAL,
|
|
3900
|
+
attempts: 2,
|
|
3901
|
+
attemptOutcomes: ['budget', 'completed'],
|
|
3902
|
+
// Attempt 1 hit the budget cap before the close's reviewer step ever ran — no review.md.
|
|
3903
|
+
// Attempt 2 completed and passed review. The OLD `attempts - 1` logic would have reported
|
|
3904
|
+
// this as "1 correction round" — a round that never happened.
|
|
3905
|
+
reviewVerdicts: [null, 'pass'],
|
|
3906
|
+
sourcePath: '.backlog/.dispatch/T-12/intento-2',
|
|
3907
|
+
});
|
|
3908
|
+
assert.match(block, /\*\*Rondas de corrección:\*\* 0 — revisor: code-review/);
|
|
3909
|
+
});
|
|
3910
|
+
|
|
3911
|
+
it('one FAIL review.md then a PASS: exactly one correction round, revisor code-review', () => {
|
|
3912
|
+
const block = buildExecutionRecordBlock({
|
|
3913
|
+
lane: LANE.LOCAL,
|
|
3914
|
+
attempts: 2,
|
|
3915
|
+
attemptOutcomes: ['completed', 'completed'],
|
|
3916
|
+
reviewVerdicts: ['fail', 'pass'],
|
|
3917
|
+
sourcePath: '.backlog/.dispatch/T-12/intento-2',
|
|
3918
|
+
});
|
|
3919
|
+
assert.match(block, /\*\*Rondas de corrección:\*\* 1 — revisor: code-review/);
|
|
3920
|
+
});
|
|
3921
|
+
|
|
3922
|
+
it('no review.md at all (typical frontier-lane task): both halves read "desconocido"', () => {
|
|
3923
|
+
const block = buildExecutionRecordBlock({
|
|
3924
|
+
lane: LANE.FRONTIER,
|
|
3925
|
+
attempts: 2,
|
|
3926
|
+
attemptOutcomes: ['completed', 'completed'],
|
|
3927
|
+
reviewVerdicts: [null, null],
|
|
3928
|
+
sourcePath: '.backlog/.dispatch/T-12/intento-2',
|
|
3929
|
+
});
|
|
3930
|
+
assert.match(block, /\*\*Rondas de corrección:\*\* desconocido — revisor: desconocido/);
|
|
3931
|
+
});
|
|
3932
|
+
});
|