create-windy 0.1.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 +114 -0
- package/assets/LICENSE-Apache-2.0.txt +201 -0
- package/dist/cli.js +1662 -0
- package/package.json +37 -0
- package/template/.dockerignore +11 -0
- package/template/.oxfmtrc.json +9 -0
- package/template/.oxlintrc.json +119 -0
- package/template/.windy-template.json +71 -0
- package/template/AGENTS.md +87 -0
- package/template/README.md +128 -0
- package/template/apps/server/Dockerfile +34 -0
- package/template/apps/server/package.json +30 -0
- package/template/apps/server/src/access-guards.ts +112 -0
- package/template/apps/server/src/admin/routes.test.ts +105 -0
- package/template/apps/server/src/admin/routes.ts +95 -0
- package/template/apps/server/src/agent/data-scope-routes.test.ts +143 -0
- package/template/apps/server/src/agent/routes.test.ts +244 -0
- package/template/apps/server/src/agent/routes.ts +257 -0
- package/template/apps/server/src/api-app.ts +32 -0
- package/template/apps/server/src/application-services.ts +154 -0
- package/template/apps/server/src/audit/contracts.ts +21 -0
- package/template/apps/server/src/audit/drizzle-log-store.ts +150 -0
- package/template/apps/server/src/audit/policy.ts +18 -0
- package/template/apps/server/src/audit/recovery-queue.test.ts +42 -0
- package/template/apps/server/src/audit/recovery-queue.ts +63 -0
- package/template/apps/server/src/audit/redaction.ts +55 -0
- package/template/apps/server/src/audit/reliable-writer.test.ts +200 -0
- package/template/apps/server/src/audit/reliable-writer.ts +201 -0
- package/template/apps/server/src/audit/search-summary.ts +32 -0
- package/template/apps/server/src/auth/actor-resolver.test.ts +138 -0
- package/template/apps/server/src/auth/actor-resolver.ts +109 -0
- package/template/apps/server/src/auth/authentication-provider.test.ts +180 -0
- package/template/apps/server/src/auth/authentication-provider.ts +117 -0
- package/template/apps/server/src/auth/authorization-snapshot.test.ts +117 -0
- package/template/apps/server/src/auth/authorization-snapshot.ts +98 -0
- package/template/apps/server/src/auth/bearer-token.ts +5 -0
- package/template/apps/server/src/auth/bootstrap-admin.ts +33 -0
- package/template/apps/server/src/auth/credential-restriction.ts +29 -0
- package/template/apps/server/src/auth/credential-routes.test.ts +190 -0
- package/template/apps/server/src/auth/credential-service.ts +165 -0
- package/template/apps/server/src/auth/development-bypass.ts +22 -0
- package/template/apps/server/src/auth/drizzle-repository.ts +315 -0
- package/template/apps/server/src/auth/drizzle-session-operations.ts +119 -0
- package/template/apps/server/src/auth/login-routes.ts +121 -0
- package/template/apps/server/src/auth/own-session-routes.test.ts +248 -0
- package/template/apps/server/src/auth/own-session-routes.ts +110 -0
- package/template/apps/server/src/auth/password.test.ts +30 -0
- package/template/apps/server/src/auth/password.ts +46 -0
- package/template/apps/server/src/auth/repository.test.ts +61 -0
- package/template/apps/server/src/auth/repository.ts +305 -0
- package/template/apps/server/src/auth/routes.test.ts +350 -0
- package/template/apps/server/src/auth/routes.ts +237 -0
- package/template/apps/server/src/auth/runtime.ts +20 -0
- package/template/apps/server/src/auth/service.ts +329 -0
- package/template/apps/server/src/auth/session-service.ts +123 -0
- package/template/apps/server/src/background/task-guard.test.ts +66 -0
- package/template/apps/server/src/background/task-guard.ts +49 -0
- package/template/apps/server/src/bulk-data/artifact-store.ts +82 -0
- package/template/apps/server/src/bulk-data/dictionary-handler.ts +122 -0
- package/template/apps/server/src/bulk-data/drizzle-repository.integration.test.ts +156 -0
- package/template/apps/server/src/bulk-data/drizzle-repository.ts +298 -0
- package/template/apps/server/src/bulk-data/helpers.ts +36 -0
- package/template/apps/server/src/bulk-data/input-validation.ts +99 -0
- package/template/apps/server/src/bulk-data/repository.ts +246 -0
- package/template/apps/server/src/bulk-data/resource-handler.ts +27 -0
- package/template/apps/server/src/bulk-data/routes.test.ts +169 -0
- package/template/apps/server/src/bulk-data/routes.ts +248 -0
- package/template/apps/server/src/bulk-data/scheduler-integration.test.ts +142 -0
- package/template/apps/server/src/bulk-data/service.test.ts +347 -0
- package/template/apps/server/src/bulk-data/service.ts +319 -0
- package/template/apps/server/src/bulk-data/types.ts +73 -0
- package/template/apps/server/src/configuration/bootstrap.ts +59 -0
- package/template/apps/server/src/configuration/definition.ts +89 -0
- package/template/apps/server/src/configuration/drizzle-repository.ts +166 -0
- package/template/apps/server/src/configuration/repository.ts +138 -0
- package/template/apps/server/src/configuration/routes.test.ts +178 -0
- package/template/apps/server/src/configuration/routes.ts +260 -0
- package/template/apps/server/src/configuration/service.test.ts +128 -0
- package/template/apps/server/src/configuration/service.ts +187 -0
- package/template/apps/server/src/data-access/context.ts +162 -0
- package/template/apps/server/src/data-access/department-tree.ts +27 -0
- package/template/apps/server/src/data-access/drizzle-predicate.test.ts +86 -0
- package/template/apps/server/src/data-access/drizzle-predicate.ts +50 -0
- package/template/apps/server/src/data-access/errors.ts +5 -0
- package/template/apps/server/src/data-access/platform-actor.ts +25 -0
- package/template/apps/server/src/data-access/query-specification.test.ts +82 -0
- package/template/apps/server/src/data-access/query-specification.ts +77 -0
- package/template/apps/server/src/data-access/scoped-repository.integration.test.ts +203 -0
- package/template/apps/server/src/data-access/scoped-repository.ts +268 -0
- package/template/apps/server/src/data-access/scoped-resource.test.ts +158 -0
- package/template/apps/server/src/data-access/scoped-resource.ts +141 -0
- package/template/apps/server/src/data-governance/export/approval-port.ts +84 -0
- package/template/apps/server/src/data-governance/export/authorization-port.test.ts +103 -0
- package/template/apps/server/src/data-governance/export/authorization-port.ts +69 -0
- package/template/apps/server/src/data-governance/export/drizzle-repository.integration.test.ts +88 -0
- package/template/apps/server/src/data-governance/export/drizzle-repository.ts +97 -0
- package/template/apps/server/src/data-governance/export/job-runtime.test.ts +339 -0
- package/template/apps/server/src/data-governance/export/job-runtime.ts +242 -0
- package/template/apps/server/src/data-governance/export/ndjson-stream.ts +62 -0
- package/template/apps/server/src/data-governance/export/postgres-api-actors.ts +140 -0
- package/template/apps/server/src/data-governance/export/postgres-api-assertions.ts +76 -0
- package/template/apps/server/src/data-governance/export/postgres-api-fixture.ts +265 -0
- package/template/apps/server/src/data-governance/export/postgres-api.integration.test.ts +298 -0
- package/template/apps/server/src/data-governance/export/postgres-recovery.integration.test.ts +344 -0
- package/template/apps/server/src/data-governance/export/repository.test.ts +55 -0
- package/template/apps/server/src/data-governance/export/repository.ts +83 -0
- package/template/apps/server/src/data-governance/export/request-fingerprint.test.ts +51 -0
- package/template/apps/server/src/data-governance/export/request-fingerprint.ts +45 -0
- package/template/apps/server/src/data-governance/export/routes-integrity.test.ts +90 -0
- package/template/apps/server/src/data-governance/export/routes-test-fixture.ts +239 -0
- package/template/apps/server/src/data-governance/export/routes.test.ts +182 -0
- package/template/apps/server/src/data-governance/export/routes.ts +215 -0
- package/template/apps/server/src/data-governance/export/scope-snapshot.test.ts +45 -0
- package/template/apps/server/src/data-governance/export/scope-snapshot.ts +27 -0
- package/template/apps/server/src/data-governance/export/service.ts +337 -0
- package/template/apps/server/src/data-governance/export/source.ts +69 -0
- package/template/apps/server/src/data-governance/export/types.ts +55 -0
- package/template/apps/server/src/data-governance/plaintext-access.test.ts +70 -0
- package/template/apps/server/src/data-governance/plaintext-access.ts +88 -0
- package/template/apps/server/src/data-governance/plaintext-postgres.integration.test.ts +223 -0
- package/template/apps/server/src/data-governance/user-plaintext-routes.test.ts +287 -0
- package/template/apps/server/src/data-governance/user-plaintext-routes.ts +181 -0
- package/template/apps/server/src/data-governance/user-projection.ts +54 -0
- package/template/apps/server/src/data-governance/user-sensitive-read-service.ts +54 -0
- package/template/apps/server/src/example-modules.ts +62 -0
- package/template/apps/server/src/example-permissions.ts +5 -0
- package/template/apps/server/src/feature/manifest-feature-repository.test.ts +187 -0
- package/template/apps/server/src/feature/manifest-feature-repository.ts +200 -0
- package/template/apps/server/src/feature/routes.authorization.test.ts +199 -0
- package/template/apps/server/src/feature/routes.ts +193 -0
- package/template/apps/server/src/foundation-access.test.ts +50 -0
- package/template/apps/server/src/foundation-access.ts +34 -0
- package/template/apps/server/src/foundation-route.ts +55 -0
- package/template/apps/server/src/foundation.ts +85 -0
- package/template/apps/server/src/guards.test.ts +74 -0
- package/template/apps/server/src/guards.ts +214 -0
- package/template/apps/server/src/http-app.test.ts +77 -0
- package/template/apps/server/src/http-app.ts +51 -0
- package/template/apps/server/src/index.ts +374 -0
- package/template/apps/server/src/jobs/artifact-service.test.ts +78 -0
- package/template/apps/server/src/jobs/artifact-service.ts +94 -0
- package/template/apps/server/src/jobs/drizzle-artifact.ts +63 -0
- package/template/apps/server/src/jobs/drizzle-claim.ts +111 -0
- package/template/apps/server/src/jobs/drizzle-execution-repository.ts +299 -0
- package/template/apps/server/src/jobs/drizzle-execution.integration.test.ts +232 -0
- package/template/apps/server/src/jobs/drizzle-lease.ts +21 -0
- package/template/apps/server/src/jobs/drizzle-mappers.ts +121 -0
- package/template/apps/server/src/jobs/drizzle-recovery-repository.ts +214 -0
- package/template/apps/server/src/jobs/drizzle-repository.integration.test.ts +135 -0
- package/template/apps/server/src/jobs/drizzle-repository.ts +268 -0
- package/template/apps/server/src/jobs/execution-repository.ts +72 -0
- package/template/apps/server/src/jobs/execution.test.ts +303 -0
- package/template/apps/server/src/jobs/handler-registry.ts +81 -0
- package/template/apps/server/src/jobs/in-memory-claim.ts +96 -0
- package/template/apps/server/src/jobs/in-memory-execution.ts +336 -0
- package/template/apps/server/src/jobs/in-memory-lease.ts +66 -0
- package/template/apps/server/src/jobs/legacy-adapter.integration.test.ts +177 -0
- package/template/apps/server/src/jobs/legacy-adapter.test.ts +199 -0
- package/template/apps/server/src/jobs/legacy-adapter.ts +109 -0
- package/template/apps/server/src/jobs/legacy-service-runtime.ts +95 -0
- package/template/apps/server/src/jobs/repository.ts +141 -0
- package/template/apps/server/src/jobs/service.test.ts +64 -0
- package/template/apps/server/src/jobs/service.ts +44 -0
- package/template/apps/server/src/jobs/types.ts +180 -0
- package/template/apps/server/src/jobs/worker.ts +258 -0
- package/template/apps/server/src/license/legacy-license-resolver.ts +23 -0
- package/template/apps/server/src/license/license-resolver.test.ts +55 -0
- package/template/apps/server/src/license/license-resolver.ts +122 -0
- package/template/apps/server/src/license/reminder.test.ts +61 -0
- package/template/apps/server/src/license/reminder.ts +33 -0
- package/template/apps/server/src/license/restriction.test.ts +54 -0
- package/template/apps/server/src/license/restriction.ts +80 -0
- package/template/apps/server/src/license/routes-offline-code.test.ts +173 -0
- package/template/apps/server/src/license/routes.ts +99 -0
- package/template/apps/server/src/license/runtime-audit-reliability.test.ts +96 -0
- package/template/apps/server/src/license/runtime-reminder.test.ts +147 -0
- package/template/apps/server/src/license/runtime-service-test-http.ts +28 -0
- package/template/apps/server/src/license/runtime-service.test.ts +334 -0
- package/template/apps/server/src/license/runtime-service.ts +308 -0
- package/template/apps/server/src/module-composition.test.ts +70 -0
- package/template/apps/server/src/module-composition.ts +28 -0
- package/template/apps/server/src/notification/drizzle-repository.ts +233 -0
- package/template/apps/server/src/notification/repository.ts +160 -0
- package/template/apps/server/src/notification/routes.test.ts +151 -0
- package/template/apps/server/src/notification/routes.ts +185 -0
- package/template/apps/server/src/observability/bootstrap.ts +56 -0
- package/template/apps/server/src/observability/http-observability.test.ts +53 -0
- package/template/apps/server/src/observability/http-observability.ts +54 -0
- package/template/apps/server/src/observability/metrics.test.ts +36 -0
- package/template/apps/server/src/observability/metrics.ts +105 -0
- package/template/apps/server/src/observability/readiness.test.ts +36 -0
- package/template/apps/server/src/observability/readiness.ts +43 -0
- package/template/apps/server/src/observability/routes.test.ts +61 -0
- package/template/apps/server/src/observability/routes.ts +44 -0
- package/template/apps/server/src/pagination.ts +31 -0
- package/template/apps/server/src/persistence.integration.test.ts +54 -0
- package/template/apps/server/src/persistence.ts +118 -0
- package/template/apps/server/src/profile/routes.test.ts +190 -0
- package/template/apps/server/src/profile/routes.ts +173 -0
- package/template/apps/server/src/request-restriction.ts +29 -0
- package/template/apps/server/src/route-guards.test.ts +148 -0
- package/template/apps/server/src/route-guards.ts +63 -0
- package/template/apps/server/src/runtime-audit-list.test.ts +98 -0
- package/template/apps/server/src/runtime-config.ts +11 -0
- package/template/apps/server/src/runtime-development.ts +68 -0
- package/template/apps/server/src/runtime-license.ts +50 -0
- package/template/apps/server/src/runtime.test.ts +264 -0
- package/template/apps/server/src/runtime.ts +324 -0
- package/template/apps/server/src/scheduler/audit.ts +38 -0
- package/template/apps/server/src/scheduler/definitions.test.ts +35 -0
- package/template/apps/server/src/scheduler/definitions.ts +79 -0
- package/template/apps/server/src/scheduler/drizzle-durable-links.ts +52 -0
- package/template/apps/server/src/scheduler/drizzle-mappers.ts +36 -0
- package/template/apps/server/src/scheduler/drizzle-repository.integration.test.ts +174 -0
- package/template/apps/server/src/scheduler/drizzle-repository.ts +348 -0
- package/template/apps/server/src/scheduler/execution-context.ts +24 -0
- package/template/apps/server/src/scheduler/execution-recorder.ts +101 -0
- package/template/apps/server/src/scheduler/feature-preflight.ts +40 -0
- package/template/apps/server/src/scheduler/history.ts +22 -0
- package/template/apps/server/src/scheduler/overview.test.ts +89 -0
- package/template/apps/server/src/scheduler/overview.ts +125 -0
- package/template/apps/server/src/scheduler/recovery-conflict.ts +19 -0
- package/template/apps/server/src/scheduler/recovery-service.test.ts +238 -0
- package/template/apps/server/src/scheduler/recovery-service.ts +152 -0
- package/template/apps/server/src/scheduler/repository.ts +274 -0
- package/template/apps/server/src/scheduler/routes.test.ts +347 -0
- package/template/apps/server/src/scheduler/routes.ts +222 -0
- package/template/apps/server/src/scheduler/sensitive-text.ts +20 -0
- package/template/apps/server/src/scheduler/service-idle.test.ts +73 -0
- package/template/apps/server/src/scheduler/service.test.ts +330 -0
- package/template/apps/server/src/scheduler/service.ts +339 -0
- package/template/apps/server/src/scheduler/types.ts +103 -0
- package/template/apps/server/src/scheduler/worker.ts +38 -0
- package/template/apps/server/src/search/config.test.ts +43 -0
- package/template/apps/server/src/search/config.ts +62 -0
- package/template/apps/server/src/search/contracts.ts +127 -0
- package/template/apps/server/src/search/cursor.ts +39 -0
- package/template/apps/server/src/search/errors.ts +11 -0
- package/template/apps/server/src/search/host.ts +36 -0
- package/template/apps/server/src/search/masking.ts +6 -0
- package/template/apps/server/src/search/provider-execution.ts +195 -0
- package/template/apps/server/src/search/rate-limiter.ts +23 -0
- package/template/apps/server/src/search/registry.ts +105 -0
- package/template/apps/server/src/search/routes.test.ts +156 -0
- package/template/apps/server/src/search/routes.ts +95 -0
- package/template/apps/server/src/search/service.test.ts +314 -0
- package/template/apps/server/src/search/service.ts +257 -0
- package/template/apps/server/src/search/test-support.ts +122 -0
- package/template/apps/server/src/session/routes.test.ts +111 -0
- package/template/apps/server/src/session/routes.ts +56 -0
- package/template/apps/server/src/settings/drizzle-repository.ts +66 -0
- package/template/apps/server/src/settings/repository.ts +29 -0
- package/template/apps/server/src/settings/routes.test.ts +250 -0
- package/template/apps/server/src/settings/routes.ts +175 -0
- package/template/apps/server/src/settings/runtime.ts +13 -0
- package/template/apps/server/src/storage/blob-reference-registry.test.ts +25 -0
- package/template/apps/server/src/storage/blob-reference-registry.ts +15 -0
- package/template/apps/server/src/storage/drizzle-upload-repository.integration.test.ts +136 -0
- package/template/apps/server/src/storage/drizzle-upload-repository.ts +248 -0
- package/template/apps/server/src/storage/route-support.ts +84 -0
- package/template/apps/server/src/storage/routes.test.ts +288 -0
- package/template/apps/server/src/storage/routes.ts +297 -0
- package/template/apps/server/src/storage/runtime.ts +86 -0
- package/template/apps/server/src/system/audit-query.ts +17 -0
- package/template/apps/server/src/system/audit-routes.test.ts +139 -0
- package/template/apps/server/src/system/audit-routes.ts +113 -0
- package/template/apps/server/src/system/built-in-roles.ts +116 -0
- package/template/apps/server/src/system/department-routes.test.ts +80 -0
- package/template/apps/server/src/system/department-routes.ts +90 -0
- package/template/apps/server/src/system/drizzle-mapping.ts +53 -0
- package/template/apps/server/src/system/drizzle-repository.ts +298 -0
- package/template/apps/server/src/system/drizzle-scoped-repository.ts +235 -0
- package/template/apps/server/src/system/drizzle-system.ts +361 -0
- package/template/apps/server/src/system/entities.ts +78 -0
- package/template/apps/server/src/system/feature-routes.test.ts +55 -0
- package/template/apps/server/src/system/identity-route-config.ts +73 -0
- package/template/apps/server/src/system/interface-catalog.test.ts +103 -0
- package/template/apps/server/src/system/interface-catalog.ts +82 -0
- package/template/apps/server/src/system/menu-registry.test.ts +125 -0
- package/template/apps/server/src/system/menu-registry.ts +259 -0
- package/template/apps/server/src/system/menu-routes.test.ts +68 -0
- package/template/apps/server/src/system/menu-routes.ts +200 -0
- package/template/apps/server/src/system/mutation-runner.ts +33 -0
- package/template/apps/server/src/system/operation-monitoring.test.ts +78 -0
- package/template/apps/server/src/system/operation-monitoring.ts +233 -0
- package/template/apps/server/src/system/operations.test.ts +269 -0
- package/template/apps/server/src/system/operations.ts +155 -0
- package/template/apps/server/src/system/postgres-monitoring.ts +31 -0
- package/template/apps/server/src/system/redis-health.test.ts +116 -0
- package/template/apps/server/src/system/redis-health.ts +230 -0
- package/template/apps/server/src/system/repository.ts +234 -0
- package/template/apps/server/src/system/resource-access-response.ts +47 -0
- package/template/apps/server/src/system/resource-export-route.ts +64 -0
- package/template/apps/server/src/system/resource-route-support.ts +50 -0
- package/template/apps/server/src/system/response-projection.ts +24 -0
- package/template/apps/server/src/system/route-helpers.ts +104 -0
- package/template/apps/server/src/system/route-test-app.ts +27 -0
- package/template/apps/server/src/system/route-types.ts +52 -0
- package/template/apps/server/src/system/routes-validation.test.ts +61 -0
- package/template/apps/server/src/system/routes.test.ts +311 -0
- package/template/apps/server/src/system/routes.ts +354 -0
- package/template/apps/server/src/system/seed.test.ts +129 -0
- package/template/apps/server/src/system/seed.ts +237 -0
- package/template/apps/server/src/system/user-account-policy.test.ts +158 -0
- package/template/apps/server/src/system/user-account-policy.ts +103 -0
- package/template/apps/server/src/system/user-data-scope.ts +10 -0
- package/template/apps/server/src/system/user-department-validation.ts +17 -0
- package/template/apps/server/src/system/user-projection.test.ts +40 -0
- package/template/apps/server/src/system/user-projection.ts +35 -0
- package/template/apps/server/src/work-order/data-scope.integration.test.ts +171 -0
- package/template/apps/server/src/work-order/drizzle-repository.integration.test.ts +78 -0
- package/template/apps/server/src/work-order/drizzle-repository.ts +67 -0
- package/template/apps/server/src/work-order/foundation-modules.test.ts +85 -0
- package/template/apps/server/src/work-order/repository.ts +46 -0
- package/template/apps/server/src/work-order/routes.test.ts +209 -0
- package/template/apps/server/src/work-order/routes.ts +159 -0
- package/template/apps/server/src/work-order/search-api.test.ts +121 -0
- package/template/apps/server/src/work-order/search-provider.test.ts +201 -0
- package/template/apps/server/src/work-order/search-provider.ts +59 -0
- package/template/apps/server/src/work-order/service.ts +82 -0
- package/template/apps/server/src/work-order/task.test.ts +79 -0
- package/template/apps/server/src/work-order/task.ts +30 -0
- package/template/apps/server/src/workflow/assignee-directory.ts +23 -0
- package/template/apps/server/src/workflow/drizzle-repository.integration.test.ts +213 -0
- package/template/apps/server/src/workflow/drizzle-repository.ts +299 -0
- package/template/apps/server/src/workflow/effects.test.ts +64 -0
- package/template/apps/server/src/workflow/effects.ts +112 -0
- package/template/apps/server/src/workflow/repository.ts +160 -0
- package/template/apps/server/src/workflow/routes.test.ts +256 -0
- package/template/apps/server/src/workflow/routes.ts +249 -0
- package/template/apps/server/src/workflow/service.ts +196 -0
- package/template/apps/server/src/workflow/timeout-runtime.test.ts +96 -0
- package/template/apps/server/src/workflow/timeout-runtime.ts +66 -0
- package/template/apps/server/tsconfig.json +17 -0
- package/template/apps/web/Dockerfile +41 -0
- package/template/apps/web/components.json +24 -0
- package/template/apps/web/dev/dev-identity.ts +58 -0
- package/template/apps/web/dev/dev-port.test.ts +53 -0
- package/template/apps/web/dev/dev-port.ts +68 -0
- package/template/apps/web/dev/start.ts +37 -0
- package/template/apps/web/index.html +14 -0
- package/template/apps/web/package.json +44 -0
- package/template/apps/web/runtime-server.test.ts +86 -0
- package/template/apps/web/runtime-server.ts +143 -0
- package/template/apps/web/server.ts +21 -0
- package/template/apps/web/src/App.vue +22 -0
- package/template/apps/web/src/app/home/HomePage.vue +75 -0
- package/template/apps/web/src/app/home/HomeWelcome.vue +85 -0
- package/template/apps/web/src/app/home/HomeWelcome.webtest.ts +32 -0
- package/template/apps/web/src/app/layouts/AppLayout.vue +10 -0
- package/template/apps/web/src/components/auth/DevelopmentAuthWarning.vue +15 -0
- package/template/apps/web/src/components/auth/LoginForm.vue +80 -0
- package/template/apps/web/src/components/auth/LoginForm.webtest.ts +33 -0
- package/template/apps/web/src/components/auth/PasswordChangeForm.vue +90 -0
- package/template/apps/web/src/components/auth/UserSessionMenu.vue +60 -0
- package/template/apps/web/src/components/auth/UserSessionMenu.webtest.ts +45 -0
- package/template/apps/web/src/components/common/ConfirmDialog.vue +75 -0
- package/template/apps/web/src/components/common/DataPagination.vue +79 -0
- package/template/apps/web/src/components/common/DataPagination.webtest.ts +28 -0
- package/template/apps/web/src/components/common/EmptyState.vue +43 -0
- package/template/apps/web/src/components/common/FormDialog.vue +86 -0
- package/template/apps/web/src/components/common/ModalBody.vue +19 -0
- package/template/apps/web/src/components/common/ModalLayout.webtest.ts +54 -0
- package/template/apps/web/src/components/common/PageError.vue +46 -0
- package/template/apps/web/src/components/common/PageLoading.vue +41 -0
- package/template/apps/web/src/components/common/StatusSummary.vue +37 -0
- package/template/apps/web/src/components/common/UnsavedChangesDialog.vue +60 -0
- package/template/apps/web/src/components/common/UnsavedChangesDialog.webtest.ts +60 -0
- package/template/apps/web/src/components/license/LicenseActivationCodeForm.vue +80 -0
- package/template/apps/web/src/components/license/LicenseExpiryBanner.vue +54 -0
- package/template/apps/web/src/components/license/LicenseFlow.webtest.ts +170 -0
- package/template/apps/web/src/components/license/LicenseStatusCard.vue +95 -0
- package/template/apps/web/src/components/license/LicenseUploadForm.vue +79 -0
- package/template/apps/web/src/components/license/license-display.ts +12 -0
- package/template/apps/web/src/components/ui/alert/Alert.vue +21 -0
- package/template/apps/web/src/components/ui/alert/AlertAction.vue +17 -0
- package/template/apps/web/src/components/ui/alert/AlertDescription.vue +22 -0
- package/template/apps/web/src/components/ui/alert/AlertTitle.vue +22 -0
- package/template/apps/web/src/components/ui/alert/index.ts +25 -0
- package/template/apps/web/src/components/ui/badge/Badge.vue +29 -0
- package/template/apps/web/src/components/ui/badge/index.ts +28 -0
- package/template/apps/web/src/components/ui/breadcrumb/Breadcrumb.vue +18 -0
- package/template/apps/web/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +26 -0
- package/template/apps/web/src/components/ui/breadcrumb/BreadcrumbItem.vue +17 -0
- package/template/apps/web/src/components/ui/breadcrumb/BreadcrumbLink.vue +24 -0
- package/template/apps/web/src/components/ui/breadcrumb/BreadcrumbList.vue +22 -0
- package/template/apps/web/src/components/ui/breadcrumb/BreadcrumbPage.vue +20 -0
- package/template/apps/web/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +23 -0
- package/template/apps/web/src/components/ui/breadcrumb/index.ts +7 -0
- package/template/apps/web/src/components/ui/button/Button.vue +31 -0
- package/template/apps/web/src/components/ui/button/index.ts +42 -0
- package/template/apps/web/src/components/ui/card/Card.vue +29 -0
- package/template/apps/web/src/components/ui/card/CardAction.vue +22 -0
- package/template/apps/web/src/components/ui/card/CardContent.vue +17 -0
- package/template/apps/web/src/components/ui/card/CardDescription.vue +17 -0
- package/template/apps/web/src/components/ui/card/CardFooter.vue +22 -0
- package/template/apps/web/src/components/ui/card/CardHeader.vue +22 -0
- package/template/apps/web/src/components/ui/card/CardTitle.vue +22 -0
- package/template/apps/web/src/components/ui/card/index.ts +7 -0
- package/template/apps/web/src/components/ui/checkbox/Checkbox.vue +41 -0
- package/template/apps/web/src/components/ui/checkbox/index.ts +1 -0
- package/template/apps/web/src/components/ui/dialog/Dialog.vue +15 -0
- package/template/apps/web/src/components/ui/dialog/DialogClose.vue +12 -0
- package/template/apps/web/src/components/ui/dialog/DialogContent.vue +62 -0
- package/template/apps/web/src/components/ui/dialog/DialogDescription.vue +30 -0
- package/template/apps/web/src/components/ui/dialog/DialogFooter.vue +33 -0
- package/template/apps/web/src/components/ui/dialog/DialogHeader.vue +17 -0
- package/template/apps/web/src/components/ui/dialog/DialogOverlay.vue +28 -0
- package/template/apps/web/src/components/ui/dialog/DialogScrollContent.vue +67 -0
- package/template/apps/web/src/components/ui/dialog/DialogTitle.vue +27 -0
- package/template/apps/web/src/components/ui/dialog/DialogTrigger.vue +12 -0
- package/template/apps/web/src/components/ui/dialog/index.ts +10 -0
- package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenu.vue +19 -0
- package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +50 -0
- package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuContent.vue +48 -0
- package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +12 -0
- package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuItem.vue +41 -0
- package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +30 -0
- package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +21 -0
- package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +51 -0
- package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +23 -0
- package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +22 -0
- package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuSub.vue +19 -0
- package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +34 -0
- package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +36 -0
- package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +17 -0
- package/template/apps/web/src/components/ui/dropdown-menu/index.ts +16 -0
- package/template/apps/web/src/components/ui/input/Input.vue +33 -0
- package/template/apps/web/src/components/ui/input/index.ts +1 -0
- package/template/apps/web/src/components/ui/select/Select.vue +15 -0
- package/template/apps/web/src/components/ui/select/SelectContent.vue +61 -0
- package/template/apps/web/src/components/ui/select/SelectGroup.vue +23 -0
- package/template/apps/web/src/components/ui/select/SelectItem.vue +49 -0
- package/template/apps/web/src/components/ui/select/SelectItemText.vue +12 -0
- package/template/apps/web/src/components/ui/select/SelectLabel.vue +19 -0
- package/template/apps/web/src/components/ui/select/SelectScrollDownButton.vue +34 -0
- package/template/apps/web/src/components/ui/select/SelectScrollUpButton.vue +34 -0
- package/template/apps/web/src/components/ui/select/SelectSeparator.vue +21 -0
- package/template/apps/web/src/components/ui/select/SelectTrigger.vue +43 -0
- package/template/apps/web/src/components/ui/select/SelectValue.vue +12 -0
- package/template/apps/web/src/components/ui/select/index.ts +11 -0
- package/template/apps/web/src/components/ui/separator/Separator.vue +30 -0
- package/template/apps/web/src/components/ui/separator/index.ts +1 -0
- package/template/apps/web/src/components/ui/sheet/Sheet.vue +15 -0
- package/template/apps/web/src/components/ui/sheet/SheetClose.vue +12 -0
- package/template/apps/web/src/components/ui/sheet/SheetContent.vue +62 -0
- package/template/apps/web/src/components/ui/sheet/SheetDescription.vue +23 -0
- package/template/apps/web/src/components/ui/sheet/SheetFooter.vue +15 -0
- package/template/apps/web/src/components/ui/sheet/SheetHeader.vue +15 -0
- package/template/apps/web/src/components/ui/sheet/SheetOverlay.vue +28 -0
- package/template/apps/web/src/components/ui/sheet/SheetTitle.vue +25 -0
- package/template/apps/web/src/components/ui/sheet/SheetTrigger.vue +12 -0
- package/template/apps/web/src/components/ui/sheet/index.ts +8 -0
- package/template/apps/web/src/components/ui/sidebar/Sidebar.vue +114 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarContent.vue +23 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarFooter.vue +18 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarGroup.vue +18 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarGroupAction.vue +29 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarGroupContent.vue +18 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarGroupLabel.vue +29 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarHeader.vue +18 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarInput.vue +19 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarInset.vue +22 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarMenu.vue +18 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarMenuAction.vue +37 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarMenuBadge.vue +23 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarMenuButton.vue +60 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarMenuButtonChild.vue +36 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarMenuItem.vue +18 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarMenuSkeleton.vue +35 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarMenuSub.vue +23 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarMenuSubButton.vue +39 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarMenuSubItem.vue +18 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarProvider.vue +128 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarRail.vue +94 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarSeparator.vue +19 -0
- package/template/apps/web/src/components/ui/sidebar/SidebarTrigger.vue +28 -0
- package/template/apps/web/src/components/ui/sidebar/index.ts +62 -0
- package/template/apps/web/src/components/ui/sidebar/sidebar-width.ts +29 -0
- package/template/apps/web/src/components/ui/sidebar/sidebar-width.webtest.ts +28 -0
- package/template/apps/web/src/components/ui/sidebar/utils.ts +26 -0
- package/template/apps/web/src/components/ui/skeleton/Skeleton.vue +17 -0
- package/template/apps/web/src/components/ui/skeleton/index.ts +1 -0
- package/template/apps/web/src/components/ui/sonner/Sonner.vue +70 -0
- package/template/apps/web/src/components/ui/sonner/index.ts +1 -0
- package/template/apps/web/src/components/ui/switch/Switch.vue +47 -0
- package/template/apps/web/src/components/ui/switch/Switch.webtest.ts +23 -0
- package/template/apps/web/src/components/ui/switch/index.ts +1 -0
- package/template/apps/web/src/components/ui/table/Table.vue +19 -0
- package/template/apps/web/src/components/ui/table/TableBody.vue +17 -0
- package/template/apps/web/src/components/ui/table/TableCaption.vue +17 -0
- package/template/apps/web/src/components/ui/table/TableCell.vue +22 -0
- package/template/apps/web/src/components/ui/table/TableEmpty.vue +37 -0
- package/template/apps/web/src/components/ui/table/TableFooter.vue +19 -0
- package/template/apps/web/src/components/ui/table/TableHead.vue +22 -0
- package/template/apps/web/src/components/ui/table/TableHeader.vue +14 -0
- package/template/apps/web/src/components/ui/table/TableRow.vue +22 -0
- package/template/apps/web/src/components/ui/table/index.ts +9 -0
- package/template/apps/web/src/components/ui/table/utils.ts +10 -0
- package/template/apps/web/src/components/ui/tabs/Tabs.vue +27 -0
- package/template/apps/web/src/components/ui/tabs/TabsContent.vue +23 -0
- package/template/apps/web/src/components/ui/tabs/TabsList.vue +34 -0
- package/template/apps/web/src/components/ui/tabs/TabsTrigger.vue +33 -0
- package/template/apps/web/src/components/ui/tabs/index.ts +24 -0
- package/template/apps/web/src/components/ui/tooltip/Tooltip.vue +15 -0
- package/template/apps/web/src/components/ui/tooltip/TooltipContent.vue +49 -0
- package/template/apps/web/src/components/ui/tooltip/TooltipProvider.vue +14 -0
- package/template/apps/web/src/components/ui/tooltip/TooltipTrigger.vue +12 -0
- package/template/apps/web/src/components/ui/tooltip/index.ts +4 -0
- package/template/apps/web/src/composables/useAccessSnapshot.ts +55 -0
- package/template/apps/web/src/composables/useAccessSnapshot.webtest.ts +39 -0
- package/template/apps/web/src/composables/useAppToast.ts +30 -0
- package/template/apps/web/src/composables/useAuthSession.ts +127 -0
- package/template/apps/web/src/composables/useAuthSession.webtest.ts +48 -0
- package/template/apps/web/src/composables/useLicenseReminderRefresh.ts +27 -0
- package/template/apps/web/src/composables/useLicenseReminderRefresh.webtest.ts +30 -0
- package/template/apps/web/src/composables/useLicenseRuntime.ts +90 -0
- package/template/apps/web/src/composables/useLoginFlow.ts +39 -0
- package/template/apps/web/src/composables/useModuleConfigurations.ts +116 -0
- package/template/apps/web/src/composables/usePasswordChange.ts +31 -0
- package/template/apps/web/src/composables/usePlatformSettings.ts +90 -0
- package/template/apps/web/src/composables/useSessionContext.ts +56 -0
- package/template/apps/web/src/composables/useTheme.ts +123 -0
- package/template/apps/web/src/composables/useUnsavedChangesConfirmation.ts +55 -0
- package/template/apps/web/src/composables/useWatermarkSettings.ts +56 -0
- package/template/apps/web/src/composables/watermark-settings.ts +45 -0
- package/template/apps/web/src/composables/watermark-settings.webtest.ts +38 -0
- package/template/apps/web/src/env.d.ts +17 -0
- package/template/apps/web/src/layout/AppHeader.vue +107 -0
- package/template/apps/web/src/layout/AppShell.vue +55 -0
- package/template/apps/web/src/layout/AppShell.webtest.ts +75 -0
- package/template/apps/web/src/layout/AppSidebar.vue +262 -0
- package/template/apps/web/src/layout/AppSidebar.webtest.ts +167 -0
- package/template/apps/web/src/layout/GlobalWatermark.vue +38 -0
- package/template/apps/web/src/layout/NavigationSearchDialog.vue +166 -0
- package/template/apps/web/src/layout/NavigationSearchDialog.webtest.ts +84 -0
- package/template/apps/web/src/layout/NotificationMenu.vue +174 -0
- package/template/apps/web/src/layout/NotificationMenu.webtest.ts +102 -0
- package/template/apps/web/src/layout/ThemeToggle.vue +44 -0
- package/template/apps/web/src/layout/navigation.ts +103 -0
- package/template/apps/web/src/layout/navigation.webtest.ts +99 -0
- package/template/apps/web/src/lib/date-time.ts +21 -0
- package/template/apps/web/src/lib/date-time.webtest.ts +14 -0
- package/template/apps/web/src/lib/utils.ts +7 -0
- package/template/apps/web/src/main.ts +11 -0
- package/template/apps/web/src/pages/AccessDeniedPage.vue +61 -0
- package/template/apps/web/src/pages/auth/ChangePasswordPage.vue +46 -0
- package/template/apps/web/src/pages/auth/LoginPage.vue +63 -0
- package/template/apps/web/src/pages/configuration/ModuleConfigurationPage.vue +15 -0
- package/template/apps/web/src/pages/configuration/components/ModuleConfigRollbackDialog.vue +51 -0
- package/template/apps/web/src/pages/configuration/components/ModuleConfigVersionList.vue +116 -0
- package/template/apps/web/src/pages/configuration/components/ModuleConfigurationEditor.vue +126 -0
- package/template/apps/web/src/pages/configuration/components/ModuleConfigurationEditor.webtest.ts +73 -0
- package/template/apps/web/src/pages/configuration/components/ModuleConfigurationWorkbench.vue +236 -0
- package/template/apps/web/src/pages/dashboard/DashboardPage.vue +39 -0
- package/template/apps/web/src/pages/dashboard/DashboardPage.webtest.ts +37 -0
- package/template/apps/web/src/pages/dashboard/components/DashboardAttention.vue +36 -0
- package/template/apps/web/src/pages/dashboard/components/DashboardMetricCards.vue +28 -0
- package/template/apps/web/src/pages/dashboard/dashboard-presenter.ts +115 -0
- package/template/apps/web/src/pages/dashboard/dashboard-presenter.webtest.ts +92 -0
- package/template/apps/web/src/pages/license/LicensePage.vue +65 -0
- package/template/apps/web/src/pages/profile/PersonalSettingsPage.vue +177 -0
- package/template/apps/web/src/pages/profile/PersonalSettingsPage.webtest.ts +78 -0
- package/template/apps/web/src/pages/settings/BrandingSettingsSection.vue +198 -0
- package/template/apps/web/src/pages/settings/GlobalSettingsPage.vue +195 -0
- package/template/apps/web/src/pages/settings/GlobalSettingsPage.webtest.ts +314 -0
- package/template/apps/web/src/pages/settings/WatermarkSettingsSection.vue +115 -0
- package/template/apps/web/src/pages/settings/logo-file.ts +23 -0
- package/template/apps/web/src/pages/settings/logo-file.webtest.ts +14 -0
- package/template/apps/web/src/pages/system/SystemNotificationsPage.vue +262 -0
- package/template/apps/web/src/pages/system/SystemNotificationsPage.webtest.ts +88 -0
- package/template/apps/web/src/pages/system/SystemOperationsPage.vue +151 -0
- package/template/apps/web/src/pages/system/SystemOperationsPage.webtest.ts +146 -0
- package/template/apps/web/src/pages/system/SystemResourceRoutePage.vue +80 -0
- package/template/apps/web/src/pages/system/SystemResourceRoutePage.webtest.ts +100 -0
- package/template/apps/web/src/pages/system/components/AuditActionCell.vue +87 -0
- package/template/apps/web/src/pages/system/components/AuditActionCell.webtest.ts +66 -0
- package/template/apps/web/src/pages/system/components/AuditLogFilters.vue +119 -0
- package/template/apps/web/src/pages/system/components/AuditLogFilters.webtest.ts +59 -0
- package/template/apps/web/src/pages/system/components/DiskUsageChart.vue +62 -0
- package/template/apps/web/src/pages/system/components/FeatureLicensePolicyDialog.vue +136 -0
- package/template/apps/web/src/pages/system/components/FeatureLicensePolicyDialog.webtest.ts +67 -0
- package/template/apps/web/src/pages/system/components/NotificationPublishForm.vue +57 -0
- package/template/apps/web/src/pages/system/components/OperationCacheMonitor.vue +73 -0
- package/template/apps/web/src/pages/system/components/OperationOnlineUsers.vue +60 -0
- package/template/apps/web/src/pages/system/components/OperationOnlineUsers.webtest.ts +35 -0
- package/template/apps/web/src/pages/system/components/OperationServiceMonitor.vue +118 -0
- package/template/apps/web/src/pages/system/components/OperationServiceMonitor.webtest.ts +64 -0
- package/template/apps/web/src/pages/system/components/SchedulerOperationsPanel.vue +297 -0
- package/template/apps/web/src/pages/system/components/SchedulerOperationsPanel.webtest.ts +145 -0
- package/template/apps/web/src/pages/system/components/SchedulerRunTable.vue +127 -0
- package/template/apps/web/src/pages/system/components/SchedulerRunTable.webtest.ts +75 -0
- package/template/apps/web/src/pages/system/components/SchedulerStaleRecoveryForm.vue +125 -0
- package/template/apps/web/src/pages/system/components/SchedulerStaleRecoveryForm.webtest.ts +84 -0
- package/template/apps/web/src/pages/system/components/SystemResourceFilters.vue +64 -0
- package/template/apps/web/src/pages/system/components/SystemResourceForm.vue +102 -0
- package/template/apps/web/src/pages/system/components/SystemResourcePage.vue +360 -0
- package/template/apps/web/src/pages/system/components/SystemResourcePage.webtest.ts +263 -0
- package/template/apps/web/src/pages/system/components/SystemResourceTable.vue +242 -0
- package/template/apps/web/src/pages/system/components/SystemResourceTable.webtest.ts +196 -0
- package/template/apps/web/src/pages/system/components/dictionary-bulk/DictionaryBulkActions.vue +142 -0
- package/template/apps/web/src/pages/system/components/dictionary-bulk/DictionaryBulkJobDetail.vue +109 -0
- package/template/apps/web/src/pages/system/components/dictionary-bulk/DictionaryBulkJobList.vue +127 -0
- package/template/apps/web/src/pages/system/components/dictionary-bulk/DictionaryBulkPanel.vue +72 -0
- package/template/apps/web/src/pages/system/components/dictionary-bulk/DictionaryBulkPanel.webtest.ts +255 -0
- package/template/apps/web/src/pages/system/components/feature-license-policy.ts +12 -0
- package/template/apps/web/src/pages/system/components/menu-management/MenuManagementPage.vue +131 -0
- package/template/apps/web/src/pages/system/components/menu-management/MenuManagementPage.webtest.ts +228 -0
- package/template/apps/web/src/pages/system/components/menu-management/MenuStructureTable.vue +230 -0
- package/template/apps/web/src/pages/system/components/menu-management/menu-model.ts +161 -0
- package/template/apps/web/src/pages/system/components/menu-management/menu-model.webtest.ts +133 -0
- package/template/apps/web/src/pages/system/components/menu-management/useMenuManagement.ts +117 -0
- package/template/apps/web/src/pages/system/components/role-policy/RolePermissionTree.vue +144 -0
- package/template/apps/web/src/pages/system/components/role-policy/RolePermissionTree.webtest.ts +55 -0
- package/template/apps/web/src/pages/system/components/role-policy/RolePolicyForm.vue +134 -0
- package/template/apps/web/src/pages/system/components/role-policy/permission-tree.ts +58 -0
- package/template/apps/web/src/pages/system/components/role-policy/permission-tree.webtest.ts +80 -0
- package/template/apps/web/src/pages/system/components/user-account/UserAccountForm.vue +307 -0
- package/template/apps/web/src/pages/system/components/user-account/UserRoleSelector.vue +111 -0
- package/template/apps/web/src/pages/system/components/user-account/UserRoleSelector.webtest.ts +45 -0
- package/template/apps/web/src/pages/system/components/user-account/save-user-account.ts +47 -0
- package/template/apps/web/src/pages/system/composables/useDictionaryBulkJobs.ts +152 -0
- package/template/apps/web/src/pages/system/composables/useFeatureLicenseEditor.ts +38 -0
- package/template/apps/web/src/pages/system/composables/useSchedulerOperations.ts +141 -0
- package/template/apps/web/src/pages/system/composables/useSchedulerOperations.webtest.ts +224 -0
- package/template/apps/web/src/pages/system/composables/useSystemResource.ts +269 -0
- package/template/apps/web/src/pages/system/composables/useSystemResource.webtest.ts +51 -0
- package/template/apps/web/src/pages/system/dictionary-bulk-presenter.ts +126 -0
- package/template/apps/web/src/pages/system/resource-config.ts +233 -0
- package/template/apps/web/src/router/auth-navigation.ts +76 -0
- package/template/apps/web/src/router/index.ts +246 -0
- package/template/apps/web/src/router/index.webtest.ts +396 -0
- package/template/apps/web/src/router/manifest-routes.ts +59 -0
- package/template/apps/web/src/services/access-api.ts +26 -0
- package/template/apps/web/src/services/auth-api.ts +72 -0
- package/template/apps/web/src/services/bulk-data-api.ts +105 -0
- package/template/apps/web/src/services/configuration-api.ts +43 -0
- package/template/apps/web/src/services/http.ts +145 -0
- package/template/apps/web/src/services/http.webtest.ts +73 -0
- package/template/apps/web/src/services/license-api.ts +53 -0
- package/template/apps/web/src/services/notification-api.ts +51 -0
- package/template/apps/web/src/services/operations-api.ts +128 -0
- package/template/apps/web/src/services/platform-settings-api.ts +21 -0
- package/template/apps/web/src/services/profile-api.ts +17 -0
- package/template/apps/web/src/services/session-context-api.ts +20 -0
- package/template/apps/web/src/services/system-api.ts +156 -0
- package/template/apps/web/src/style.css +142 -0
- package/template/apps/web/src/style.webtest.ts +18 -0
- package/template/apps/web/tsconfig.json +23 -0
- package/template/apps/web/vite.config.ts +26 -0
- package/template/apps/web/vitest.config.ts +14 -0
- package/template/bunfig.toml +2 -0
- package/template/docker-compose.yml +74 -0
- package/template/docs/adapters/ruoyi-vue-compatibility.md +93 -0
- package/template/docs/architecture/admin-surface-boundary.md +24 -0
- package/template/docs/architecture/data-scope-query-enforcement.md +26 -0
- package/template/docs/architecture/durable-jobs.md +101 -0
- package/template/docs/architecture/minimal-approval-workflow.md +60 -0
- package/template/docs/architecture/module-manifest-composition.md +47 -0
- package/template/docs/architecture/object-storage.md +65 -0
- package/template/docs/architecture/search-provider-protocol.md +59 -0
- package/template/docs/development/crud-generator.md +57 -0
- package/template/docs/license/license-offline-activation-code.md +67 -0
- package/template/docs/operations/observability.md +50 -0
- package/template/docs/platform/agent-tools.md +37 -0
- package/template/docs/platform/audit-reliability.md +95 -0
- package/template/docs/platform/bulk-data-jobs.md +156 -0
- package/template/docs/platform/data-access-control.md +62 -0
- package/template/docs/platform/module-configuration.md +98 -0
- package/template/docs/platform/navigation-registry.md +36 -0
- package/template/docs/platform/notifications.md +33 -0
- package/template/docs/platform/operations-overview.md +35 -0
- package/template/docs/platform/organization-membership.md +31 -0
- package/template/docs/platform/platform-authentication.md +127 -0
- package/template/docs/platform/platform-shell-settings.md +88 -0
- package/template/docs/platform/scheduled-task-executor.md +89 -0
- package/template/docs/platform/system-crud-api.md +100 -0
- package/template/docs/platform/web-system-crud.md +96 -0
- package/template/docs/product/built-in-roles.md +26 -0
- package/template/drizzle.config.ts +16 -0
- package/template/examples/inventory-item.crud.json +55 -0
- package/template/package.json +55 -0
- package/template/packages/config/index.test.ts +114 -0
- package/template/packages/config/index.ts +4 -0
- package/template/packages/config/package.json +13 -0
- package/template/packages/config/src/definition.ts +109 -0
- package/template/packages/config/src/environment-loader.ts +240 -0
- package/template/packages/config/src/platform.ts +185 -0
- package/template/packages/config/src/secrets.ts +69 -0
- package/template/packages/crud-generator/index.ts +3 -0
- package/template/packages/crud-generator/package.json +12 -0
- package/template/packages/crud-generator/src/cli.ts +31 -0
- package/template/packages/crud-generator/src/definition.ts +48 -0
- package/template/packages/crud-generator/src/generator.test.ts +180 -0
- package/template/packages/crud-generator/src/generator.ts +99 -0
- package/template/packages/crud-generator/src/template-helpers.ts +72 -0
- package/template/packages/crud-generator/src/templates/domain.ts +27 -0
- package/template/packages/crud-generator/src/templates/drizzle-repository.ts +126 -0
- package/template/packages/crud-generator/src/templates/dto.ts +19 -0
- package/template/packages/crud-generator/src/templates/index.ts +8 -0
- package/template/packages/crud-generator/src/templates/manifest.ts +69 -0
- package/template/packages/crud-generator/src/templates/project.ts +161 -0
- package/template/packages/crud-generator/src/templates/repository.ts +23 -0
- package/template/packages/crud-generator/src/templates/routes.ts +158 -0
- package/template/packages/crud-generator/src/templates/schema.ts +45 -0
- package/template/packages/crud-generator/src/templates/service.ts +32 -0
- package/template/packages/crud-generator/src/validation.ts +205 -0
- package/template/packages/crud-generator/tsconfig.json +15 -0
- package/template/packages/database/drizzle/0000_organic_madame_web.sql +136 -0
- package/template/packages/database/drizzle/0001_flawless_senator_kelly.sql +80 -0
- package/template/packages/database/drizzle/0002_woozy_squadron_supreme.sql +53 -0
- package/template/packages/database/drizzle/0003_far_carnage.sql +17 -0
- package/template/packages/database/drizzle/0004_flat_bastion.sql +2 -0
- package/template/packages/database/drizzle/0005_fixed_enchantress.sql +6 -0
- package/template/packages/database/drizzle/0006_groovy_overlord.sql +146 -0
- package/template/packages/database/drizzle/0007_chubby_may_parker.sql +9 -0
- package/template/packages/database/drizzle/0008_secret_toxin.sql +21 -0
- package/template/packages/database/drizzle/0009_ambiguous_adam_warlock.sql +46 -0
- package/template/packages/database/drizzle/0010_complex_orphan.sql +42 -0
- package/template/packages/database/drizzle/0011_lowly_maria_hill.sql +42 -0
- package/template/packages/database/drizzle/0012_serious_marvex.sql +11 -0
- package/template/packages/database/drizzle/0013_mysterious_miek.sql +48 -0
- package/template/packages/database/drizzle/0014_graceful_husk.sql +1 -0
- package/template/packages/database/drizzle/0015_illegal_jazinda.sql +29 -0
- package/template/packages/database/drizzle/0016_seed_platform_roles.sql +21 -0
- package/template/packages/database/drizzle/0017_silly_thunderbolt.sql +35 -0
- package/template/packages/database/drizzle/0018_cheerful_alex_power.sql +22 -0
- package/template/packages/database/drizzle/0019_omniscient_luckman.sql +3 -0
- package/template/packages/database/drizzle/0020_handy_vertigo.sql +18 -0
- package/template/packages/database/drizzle/0021_plain_paladin.sql +51 -0
- package/template/packages/database/drizzle/0022_icy_rhodey.sql +2 -0
- package/template/packages/database/drizzle/0023_fresh_thunderbolt_ross.sql +138 -0
- package/template/packages/database/drizzle/0024_misty_lizard.sql +13 -0
- package/template/packages/database/drizzle/0025_premium_songbird.sql +6 -0
- package/template/packages/database/drizzle/0026_aberrant_doctor_octopus.sql +42 -0
- package/template/packages/database/drizzle/0027_tiny_diamondback.sql +5 -0
- package/template/packages/database/drizzle/0028_condemned_ulik.sql +27 -0
- package/template/packages/database/drizzle/0029_clean_nightshade.sql +5 -0
- package/template/packages/database/drizzle/0030_governed_export_constraints.sql +84 -0
- package/template/packages/database/drizzle/meta/0000_snapshot.json +973 -0
- package/template/packages/database/drizzle/meta/0001_snapshot.json +1559 -0
- package/template/packages/database/drizzle/meta/0002_snapshot.json +1911 -0
- package/template/packages/database/drizzle/meta/0003_snapshot.json +2047 -0
- package/template/packages/database/drizzle/meta/0004_snapshot.json +2059 -0
- package/template/packages/database/drizzle/meta/0005_snapshot.json +2084 -0
- package/template/packages/database/drizzle/meta/0006_snapshot.json +3192 -0
- package/template/packages/database/drizzle/meta/0007_snapshot.json +3208 -0
- package/template/packages/database/drizzle/meta/0008_snapshot.json +3367 -0
- package/template/packages/database/drizzle/meta/0009_snapshot.json +3629 -0
- package/template/packages/database/drizzle/meta/0010_snapshot.json +3955 -0
- package/template/packages/database/drizzle/meta/0011_snapshot.json +4299 -0
- package/template/packages/database/drizzle/meta/0012_snapshot.json +4368 -0
- package/template/packages/database/drizzle/meta/0013_snapshot.json +4483 -0
- package/template/packages/database/drizzle/meta/0014_snapshot.json +4489 -0
- package/template/packages/database/drizzle/meta/0015_snapshot.json +4771 -0
- package/template/packages/database/drizzle/meta/0016_snapshot.json +4694 -0
- package/template/packages/database/drizzle/meta/0017_snapshot.json +4731 -0
- package/template/packages/database/drizzle/meta/0018_snapshot.json +4978 -0
- package/template/packages/database/drizzle/meta/0019_snapshot.json +4996 -0
- package/template/packages/database/drizzle/meta/0020_snapshot.json +5140 -0
- package/template/packages/database/drizzle/meta/0021_snapshot.json +5535 -0
- package/template/packages/database/drizzle/meta/0022_snapshot.json +5541 -0
- package/template/packages/database/drizzle/meta/0023_snapshot.json +6667 -0
- package/template/packages/database/drizzle/meta/0024_snapshot.json +6780 -0
- package/template/packages/database/drizzle/meta/0025_snapshot.json +6849 -0
- package/template/packages/database/drizzle/meta/0026_snapshot.json +7185 -0
- package/template/packages/database/drizzle/meta/0027_snapshot.json +7225 -0
- package/template/packages/database/drizzle/meta/0028_snapshot.json +7454 -0
- package/template/packages/database/drizzle/meta/0029_snapshot.json +7460 -0
- package/template/packages/database/drizzle/meta/0030_snapshot.json +7473 -0
- package/template/packages/database/drizzle/meta/_journal.json +223 -0
- package/template/packages/database/index.ts +5 -0
- package/template/packages/database/package.json +17 -0
- package/template/packages/database/src/dialects.test.ts +33 -0
- package/template/packages/database/src/dialects.ts +139 -0
- package/template/packages/database/src/runner.test.ts +96 -0
- package/template/packages/database/src/runner.ts +175 -0
- package/template/packages/database/src/schema/bulk-data.ts +87 -0
- package/template/packages/database/src/schema/common.ts +33 -0
- package/template/packages/database/src/schema/durable-jobs.ts +266 -0
- package/template/packages/database/src/schema/file-storage.ts +94 -0
- package/template/packages/database/src/schema/governance.ts +195 -0
- package/template/packages/database/src/schema/governed-exports.ts +90 -0
- package/template/packages/database/src/schema/identity.ts +169 -0
- package/template/packages/database/src/schema/index.ts +33 -0
- package/template/packages/database/src/schema/license-legacy.ts +93 -0
- package/template/packages/database/src/schema/license-v1.ts +246 -0
- package/template/packages/database/src/schema/migration-history.ts +30 -0
- package/template/packages/database/src/schema/notifications.ts +60 -0
- package/template/packages/database/src/schema/platform-settings.ts +55 -0
- package/template/packages/database/src/schema/scheduler.ts +89 -0
- package/template/packages/database/src/schema/work-orders.ts +23 -0
- package/template/packages/database/src/schema/workflow.ts +86 -0
- package/template/packages/database/src/schema-durable-links.test.ts +27 -0
- package/template/packages/database/src/schema-governed-exports.test.ts +49 -0
- package/template/packages/database/src/schema-workflow-notification.test.ts +63 -0
- package/template/packages/database/src/schema.test.ts +343 -0
- package/template/packages/database/src/sql-store.test.ts +92 -0
- package/template/packages/database/src/sql-store.ts +101 -0
- package/template/packages/database/src/store.ts +32 -0
- package/template/packages/database/tsconfig.json +17 -0
- package/template/packages/example-work-order/index.ts +3 -0
- package/template/packages/example-work-order/package.json +13 -0
- package/template/packages/example-work-order/src/contract.ts +50 -0
- package/template/packages/example-work-order/src/manifest.test.ts +54 -0
- package/template/packages/example-work-order/src/manifest.ts +120 -0
- package/template/packages/example-work-order/src/schema.ts +27 -0
- package/template/packages/license-sdk/index.ts +13 -0
- package/template/packages/license-sdk/package.json +18 -0
- package/template/packages/license-sdk/src/bounded-json-body.test.ts +65 -0
- package/template/packages/license-sdk/src/bounded-json-body.ts +135 -0
- package/template/packages/license-sdk/src/canonical-json.test.ts +28 -0
- package/template/packages/license-sdk/src/canonical-json.ts +104 -0
- package/template/packages/license-sdk/src/client.test.ts +82 -0
- package/template/packages/license-sdk/src/client.ts +86 -0
- package/template/packages/license-sdk/src/device.ts +46 -0
- package/template/packages/license-sdk/src/file-storage.test.ts +80 -0
- package/template/packages/license-sdk/src/file-storage.ts +77 -0
- package/template/packages/license-sdk/src/installation.test.ts +241 -0
- package/template/packages/license-sdk/src/installation.ts +150 -0
- package/template/packages/license-sdk/src/license-parser.ts +56 -0
- package/template/packages/license-sdk/src/offline-code-base32.ts +57 -0
- package/template/packages/license-sdk/src/offline-code-decompression.ts +55 -0
- package/template/packages/license-sdk/src/offline-code-limits.ts +10 -0
- package/template/packages/license-sdk/src/offline-code-wire.ts +72 -0
- package/template/packages/license-sdk/src/offline-code.test.ts +172 -0
- package/template/packages/license-sdk/src/offline-code.ts +319 -0
- package/template/packages/license-sdk/src/payload.test.ts +72 -0
- package/template/packages/license-sdk/src/payload.ts +201 -0
- package/template/packages/license-sdk/src/storage.ts +64 -0
- package/template/packages/license-sdk/src/test-fixtures.ts +59 -0
- package/template/packages/license-sdk/src/v1-test-vector.ts +49 -0
- package/template/packages/license-sdk/src/validation.test.ts +62 -0
- package/template/packages/license-sdk/src/validation.ts +143 -0
- package/template/packages/license-sdk/src/verification.test.ts +97 -0
- package/template/packages/license-sdk/src/verification.ts +199 -0
- package/template/packages/license-sdk/tsconfig.json +17 -0
- package/template/packages/modules/index.ts +8 -0
- package/template/packages/modules/package.json +13 -0
- package/template/packages/modules/src/composition.test.ts +267 -0
- package/template/packages/modules/src/composition.ts +342 -0
- package/template/packages/modules/src/installed-business-modules.ts +10 -0
- package/template/packages/modules/src/manifest.ts +97 -0
- package/template/packages/modules/src/menu-composition.test.ts +64 -0
- package/template/packages/modules/src/menu-composition.ts +54 -0
- package/template/packages/modules/src/registry.ts +53 -0
- package/template/packages/modules/src/system-admin-routes.ts +134 -0
- package/template/packages/modules/src/system-agent-tools.ts +28 -0
- package/template/packages/modules/src/system-api-binding.ts +37 -0
- package/template/packages/modules/src/system-api-data-governance.ts +21 -0
- package/template/packages/modules/src/system-api-permissions.ts +344 -0
- package/template/packages/modules/src/system-audit-actions.ts +70 -0
- package/template/packages/modules/src/system-data-governance.ts +30 -0
- package/template/packages/modules/src/system-features.ts +143 -0
- package/template/packages/modules/src/system-governed-export-bindings.ts +31 -0
- package/template/packages/modules/src/system-module-catalog.test.ts +145 -0
- package/template/packages/modules/src/system-module-catalog.ts +250 -0
- package/template/packages/modules/src/system-modules.test.ts +344 -0
- package/template/packages/modules/src/system-modules.ts +335 -0
- package/template/packages/modules/src/system-permissions.ts +142 -0
- package/template/packages/modules/user/module.ts +72 -0
- package/template/packages/shared/index.ts +16 -0
- package/template/packages/shared/package.json +9 -0
- package/template/packages/shared/src/audit.test.ts +17 -0
- package/template/packages/shared/src/audit.ts +237 -0
- package/template/packages/shared/src/correlation.test.ts +10 -0
- package/template/packages/shared/src/correlation.ts +11 -0
- package/template/packages/shared/src/data-governance.test.ts +44 -0
- package/template/packages/shared/src/data-governance.ts +89 -0
- package/template/packages/shared/src/database.ts +67 -0
- package/template/packages/shared/src/feature.test.ts +54 -0
- package/template/packages/shared/src/feature.ts +104 -0
- package/template/packages/shared/src/license-legacy.ts +153 -0
- package/template/packages/shared/src/license.test.ts +63 -0
- package/template/packages/shared/src/license.ts +267 -0
- package/template/packages/shared/src/module-configuration.ts +50 -0
- package/template/packages/shared/src/notification.ts +46 -0
- package/template/packages/shared/src/platform-settings.ts +5 -0
- package/template/packages/shared/src/primitives.ts +47 -0
- package/template/packages/shared/src/profile.ts +13 -0
- package/template/packages/shared/src/rbac.ts +117 -0
- package/template/packages/shared/src/ruoyi.ts +98 -0
- package/template/packages/shared/src/scheduler.ts +108 -0
- package/template/packages/shared/src/search-provider.ts +24 -0
- package/template/packages/shared/src/workflow.test.ts +225 -0
- package/template/packages/shared/src/workflow.ts +307 -0
- package/template/packages/storage/index.ts +11 -0
- package/template/packages/storage/package.json +12 -0
- package/template/packages/storage/src/blob-store.ts +64 -0
- package/template/packages/storage/src/content-hash.ts +24 -0
- package/template/packages/storage/src/file-service.test.ts +100 -0
- package/template/packages/storage/src/file-service.ts +59 -0
- package/template/packages/storage/src/in-memory-upload-repository.ts +154 -0
- package/template/packages/storage/src/local-file-blob-store.test.ts +175 -0
- package/template/packages/storage/src/local-file-blob-store.ts +344 -0
- package/template/packages/storage/src/local-file-maintenance.ts +133 -0
- package/template/packages/storage/src/memory-blob-store.test.ts +16 -0
- package/template/packages/storage/src/memory-blob-store.ts +100 -0
- package/template/packages/storage/src/upload-repository.ts +43 -0
- package/template/packages/storage/src/upload-service.test.ts +246 -0
- package/template/packages/storage/src/upload-service.ts +334 -0
- package/template/packages/storage/src/upload-streams.ts +123 -0
- package/template/packages/storage/src/upload-types.ts +110 -0
- package/template/packages/storage/tsconfig.json +16 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
|
|
3
|
+
@import "tw-animate-css";
|
|
4
|
+
|
|
5
|
+
@custom-variant dark (&:is(.dark *));
|
|
6
|
+
|
|
7
|
+
:root {
|
|
8
|
+
font-family:
|
|
9
|
+
Inter,
|
|
10
|
+
ui-sans-serif,
|
|
11
|
+
system-ui,
|
|
12
|
+
-apple-system,
|
|
13
|
+
BlinkMacSystemFont,
|
|
14
|
+
"Segoe UI",
|
|
15
|
+
sans-serif;
|
|
16
|
+
--radius: 0.625rem;
|
|
17
|
+
--background: oklch(1 0 0);
|
|
18
|
+
--foreground: oklch(0.145 0 0);
|
|
19
|
+
--card: oklch(1 0 0);
|
|
20
|
+
--card-foreground: oklch(0.145 0 0);
|
|
21
|
+
--popover: oklch(1 0 0);
|
|
22
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
23
|
+
--primary: oklch(0.205 0 0);
|
|
24
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
25
|
+
--secondary: oklch(0.97 0 0);
|
|
26
|
+
--secondary-foreground: oklch(0.205 0 0);
|
|
27
|
+
--muted: oklch(0.97 0 0);
|
|
28
|
+
--muted-foreground: oklch(0.556 0 0);
|
|
29
|
+
--accent: oklch(0.97 0 0);
|
|
30
|
+
--accent-foreground: oklch(0.205 0 0);
|
|
31
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
32
|
+
--border: oklch(0.922 0 0);
|
|
33
|
+
--input: oklch(0.922 0 0);
|
|
34
|
+
--ring: oklch(0.708 0 0);
|
|
35
|
+
--chart-1: oklch(0.646 0.222 41.116);
|
|
36
|
+
--chart-2: oklch(0.6 0.118 184.704);
|
|
37
|
+
--chart-3: oklch(0.398 0.07 227.392);
|
|
38
|
+
--chart-4: oklch(0.828 0.189 84.429);
|
|
39
|
+
--chart-5: oklch(0.769 0.188 70.08);
|
|
40
|
+
--sidebar: oklch(0.985 0 0);
|
|
41
|
+
--sidebar-foreground: oklch(0.145 0 0);
|
|
42
|
+
--sidebar-primary: oklch(0.205 0 0);
|
|
43
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
44
|
+
--sidebar-accent: oklch(0.97 0 0);
|
|
45
|
+
--sidebar-accent-foreground: oklch(0.205 0 0);
|
|
46
|
+
--sidebar-border: oklch(0.922 0 0);
|
|
47
|
+
--sidebar-ring: oklch(0.708 0 0);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
body {
|
|
51
|
+
margin: 0;
|
|
52
|
+
min-width: 320px;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@theme inline {
|
|
56
|
+
--font-heading: var(--font-sans);
|
|
57
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
58
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
59
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
60
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
61
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
62
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
63
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
64
|
+
--color-sidebar: var(--sidebar);
|
|
65
|
+
--color-chart-5: var(--chart-5);
|
|
66
|
+
--color-chart-4: var(--chart-4);
|
|
67
|
+
--color-chart-3: var(--chart-3);
|
|
68
|
+
--color-chart-2: var(--chart-2);
|
|
69
|
+
--color-chart-1: var(--chart-1);
|
|
70
|
+
--color-ring: var(--ring);
|
|
71
|
+
--color-input: var(--input);
|
|
72
|
+
--color-border: var(--border);
|
|
73
|
+
--color-destructive: var(--destructive);
|
|
74
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
75
|
+
--color-accent: var(--accent);
|
|
76
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
77
|
+
--color-muted: var(--muted);
|
|
78
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
79
|
+
--color-secondary: var(--secondary);
|
|
80
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
81
|
+
--color-primary: var(--primary);
|
|
82
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
83
|
+
--color-popover: var(--popover);
|
|
84
|
+
--color-card-foreground: var(--card-foreground);
|
|
85
|
+
--color-card: var(--card);
|
|
86
|
+
--color-foreground: var(--foreground);
|
|
87
|
+
--color-background: var(--background);
|
|
88
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
89
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
90
|
+
--radius-lg: var(--radius);
|
|
91
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.dark {
|
|
95
|
+
--background: oklch(0.145 0 0);
|
|
96
|
+
--foreground: oklch(0.985 0 0);
|
|
97
|
+
--card: oklch(0.205 0 0);
|
|
98
|
+
--card-foreground: oklch(0.985 0 0);
|
|
99
|
+
--popover: oklch(0.205 0 0);
|
|
100
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
101
|
+
--primary: oklch(0.922 0 0);
|
|
102
|
+
--primary-foreground: oklch(0.205 0 0);
|
|
103
|
+
--secondary: oklch(0.269 0 0);
|
|
104
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
105
|
+
--muted: oklch(0.269 0 0);
|
|
106
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
107
|
+
--accent: oklch(0.269 0 0);
|
|
108
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
109
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
110
|
+
--border: oklch(1 0 0 / 10%);
|
|
111
|
+
--input: oklch(1 0 0 / 15%);
|
|
112
|
+
--ring: oklch(0.556 0 0);
|
|
113
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
|
114
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
|
115
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
|
116
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
|
117
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
|
118
|
+
--sidebar: oklch(0.205 0 0);
|
|
119
|
+
--sidebar-foreground: oklch(0.985 0 0);
|
|
120
|
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
121
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
122
|
+
--sidebar-accent: oklch(0.269 0 0);
|
|
123
|
+
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
124
|
+
--sidebar-border: oklch(1 0 0 / 10%);
|
|
125
|
+
--sidebar-ring: oklch(0.556 0 0);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
@layer base {
|
|
129
|
+
* {
|
|
130
|
+
@apply border-border outline-ring/50;
|
|
131
|
+
}
|
|
132
|
+
html,
|
|
133
|
+
body,
|
|
134
|
+
#app {
|
|
135
|
+
@apply bg-background text-foreground;
|
|
136
|
+
min-height: 100%;
|
|
137
|
+
}
|
|
138
|
+
body,
|
|
139
|
+
#app {
|
|
140
|
+
min-height: 100svh;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
// @ts-expect-error Vitest runs this contract test in Node; the browser bundle omits Node types.
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
// @ts-expect-error Vitest runs this contract test in Node; the browser bundle omits Node types.
|
|
5
|
+
import { resolve } from "node:path";
|
|
6
|
+
|
|
7
|
+
declare const process: { cwd(): string };
|
|
8
|
+
|
|
9
|
+
const styles = readFileSync(resolve(process.cwd(), "src/style.css"), "utf8");
|
|
10
|
+
|
|
11
|
+
describe("全局页面背景", () => {
|
|
12
|
+
test("html、body 与应用根节点共同使用主题背景,避免深色滚动露白", () => {
|
|
13
|
+
expect(styles).toMatch(
|
|
14
|
+
/html,\s*body,\s*#app\s*{\s*@apply bg-background text-foreground;/,
|
|
15
|
+
);
|
|
16
|
+
expect(styles).toMatch(/body,\s*#app\s*{\s*min-height: 100svh;/);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "esnext",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"module": "esnext",
|
|
6
|
+
"moduleResolution": "bundler",
|
|
7
|
+
"baseUrl": ".",
|
|
8
|
+
"paths": {
|
|
9
|
+
"@/*": ["./src/*"]
|
|
10
|
+
},
|
|
11
|
+
"strict": true,
|
|
12
|
+
"jsx": "preserve",
|
|
13
|
+
"sourceMap": true,
|
|
14
|
+
"resolveJsonModule": true,
|
|
15
|
+
"isolatedModules": true,
|
|
16
|
+
"esModuleInterop": true,
|
|
17
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
18
|
+
"skipLibCheck": true,
|
|
19
|
+
"types": ["vite/client"]
|
|
20
|
+
},
|
|
21
|
+
"include": ["src/**/*"],
|
|
22
|
+
"exclude": ["dist", "node_modules"]
|
|
23
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { fileURLToPath, URL } from "node:url";
|
|
2
|
+
import tailwindcss from "@tailwindcss/vite";
|
|
3
|
+
import vue from "@vitejs/plugin-vue";
|
|
4
|
+
import { defineConfig } from "vite";
|
|
5
|
+
import { projectFingerprint, windyDevIdentityPlugin } from "./dev/dev-identity";
|
|
6
|
+
|
|
7
|
+
const fingerprint =
|
|
8
|
+
process.env.WINDY_DEV_FINGERPRINT || projectFingerprint(process.cwd());
|
|
9
|
+
const devPort = Number(process.env.WINDY_DEV_PORT || 8_746);
|
|
10
|
+
|
|
11
|
+
export default defineConfig({
|
|
12
|
+
plugins: [vue(), tailwindcss(), windyDevIdentityPlugin(fingerprint)],
|
|
13
|
+
resolve: {
|
|
14
|
+
alias: {
|
|
15
|
+
"@": fileURLToPath(new URL("./src", import.meta.url)),
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
server: {
|
|
19
|
+
host: process.env.VITE_DEV_HOST ?? "127.0.0.1",
|
|
20
|
+
port: devPort,
|
|
21
|
+
strictPort: true,
|
|
22
|
+
proxy: {
|
|
23
|
+
"/api": process.env.API_UPSTREAM ?? "http://localhost:3000",
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { mergeConfig, defineConfig } from "vitest/config";
|
|
2
|
+
import viteConfig from "./vite.config";
|
|
3
|
+
|
|
4
|
+
export default mergeConfig(
|
|
5
|
+
viteConfig,
|
|
6
|
+
defineConfig({
|
|
7
|
+
test: {
|
|
8
|
+
environment: "happy-dom",
|
|
9
|
+
include: ["src/**/*.webtest.ts"],
|
|
10
|
+
clearMocks: true,
|
|
11
|
+
restoreMocks: true,
|
|
12
|
+
},
|
|
13
|
+
}),
|
|
14
|
+
);
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
services:
|
|
2
|
+
postgres:
|
|
3
|
+
image: postgres:17-alpine
|
|
4
|
+
environment:
|
|
5
|
+
POSTGRES_DB: windy
|
|
6
|
+
POSTGRES_USER: windy
|
|
7
|
+
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}
|
|
8
|
+
ports:
|
|
9
|
+
- "5432:5432"
|
|
10
|
+
volumes:
|
|
11
|
+
- postgres-data:/var/lib/postgresql/data
|
|
12
|
+
healthcheck:
|
|
13
|
+
test: ["CMD-SHELL", "pg_isready -U windy -d windy"]
|
|
14
|
+
interval: 10s
|
|
15
|
+
timeout: 5s
|
|
16
|
+
retries: 5
|
|
17
|
+
|
|
18
|
+
migrate:
|
|
19
|
+
build:
|
|
20
|
+
context: .
|
|
21
|
+
dockerfile: apps/server/Dockerfile
|
|
22
|
+
command: ["bun", "run", "db:migrate"]
|
|
23
|
+
environment:
|
|
24
|
+
DATABASE_URL: postgresql://windy:${POSTGRES_PASSWORD}@postgres:5432/windy
|
|
25
|
+
volumes:
|
|
26
|
+
- ./packages:/app/packages
|
|
27
|
+
depends_on:
|
|
28
|
+
postgres:
|
|
29
|
+
condition: service_healthy
|
|
30
|
+
|
|
31
|
+
server:
|
|
32
|
+
build:
|
|
33
|
+
context: .
|
|
34
|
+
dockerfile: apps/server/Dockerfile
|
|
35
|
+
command: ["bun", "run", "--cwd", "apps/server", "dev"]
|
|
36
|
+
environment:
|
|
37
|
+
NODE_ENV: development
|
|
38
|
+
PORT: 3000
|
|
39
|
+
DATABASE_URL: postgresql://windy:${POSTGRES_PASSWORD}@postgres:5432/windy
|
|
40
|
+
WINDY_BOOTSTRAP_ADMIN_PASSWORD: ${WINDY_BOOTSTRAP_ADMIN_PASSWORD:?请在 .env 中设置管理员初始密码}
|
|
41
|
+
WINDY_AUDIT_QUEUE_FILE: /app/data/audit/recovery-queue.json
|
|
42
|
+
WINDY_CONTAINERIZED: "1"
|
|
43
|
+
WINDY_SYSTEM_USAGE_PATHS: /app/data/audit
|
|
44
|
+
ports:
|
|
45
|
+
- "3000:3000"
|
|
46
|
+
volumes:
|
|
47
|
+
- ./apps/server:/app/apps/server
|
|
48
|
+
- ./packages:/app/packages
|
|
49
|
+
- server-audit-data:/app/data/audit
|
|
50
|
+
depends_on:
|
|
51
|
+
migrate:
|
|
52
|
+
condition: service_completed_successfully
|
|
53
|
+
|
|
54
|
+
web:
|
|
55
|
+
build:
|
|
56
|
+
context: .
|
|
57
|
+
dockerfile: apps/web/Dockerfile
|
|
58
|
+
command: ["bun", "run", "--cwd", "apps/web", "dev"]
|
|
59
|
+
environment:
|
|
60
|
+
NODE_ENV: development
|
|
61
|
+
WINDY_DEV_PORT: 9746
|
|
62
|
+
API_UPSTREAM: http://server:3000
|
|
63
|
+
VITE_DEV_HOST: 0.0.0.0
|
|
64
|
+
ports:
|
|
65
|
+
- "9746:9746"
|
|
66
|
+
volumes:
|
|
67
|
+
- ./apps/web:/app/apps/web
|
|
68
|
+
- ./packages:/app/packages
|
|
69
|
+
depends_on:
|
|
70
|
+
- server
|
|
71
|
+
|
|
72
|
+
volumes:
|
|
73
|
+
postgres-data:
|
|
74
|
+
server-audit-data:
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# RuoYi-Vue 兼容与迁移设计
|
|
2
|
+
|
|
3
|
+
## 背景
|
|
4
|
+
|
|
5
|
+
Windy Platform Template 需要替代两个现有 RuoYi-Vue 项目。存量项目为 Vue2 版本,运行依赖 MySQL 和 Redis。迁移目标以一次性导入新库为主,但在客户单机服务器场景中,仍需要具备连接旧 MySQL / Redis 运行的能力。
|
|
6
|
+
|
|
7
|
+
密码不要求兼容旧 hash,迁移后可以统一重置密码。兼容重点是系统数据、权限链路、菜单路由、日志审计和后台能力闭环。
|
|
8
|
+
|
|
9
|
+
## 设计结论
|
|
10
|
+
|
|
11
|
+
采用“新平台 canonical schema + 可插拔 RuoYi-Vue Adapter”的方案。
|
|
12
|
+
|
|
13
|
+
新项目默认不启用 RuoYi-Vue 兼容能力。旧项目通过独立 Adapter 接入迁移或运行时兼容,业务模块不得直接依赖旧 `sys_*` 表,也不得把 RuoYi-Vue 字段设计扩散到平台核心模型。
|
|
14
|
+
|
|
15
|
+
## 兼容层职责
|
|
16
|
+
|
|
17
|
+
RuoYi-Vue 兼容层是一个独立 Module,向平台暴露小而稳定的 Interface,内部隐藏旧库结构、字段差异、状态映射和迁移细节。
|
|
18
|
+
|
|
19
|
+
兼容层至少包含三类 Adapter:
|
|
20
|
+
|
|
21
|
+
- `import adapter`:从旧 MySQL 一次性导入用户、角色、部门、菜单、权限、字典、参数、通知、日志和任务数据。
|
|
22
|
+
- `legacy runtime adapter`:在客户单机服务器过渡期连接旧 MySQL / Redis;本轮只允许只读能力,受控写入明确延期。
|
|
23
|
+
- `report adapter`:输出 dry-run、迁移差异、失败行、权限映射、菜单树映射和回滚建议。
|
|
24
|
+
|
|
25
|
+
## 迁移对象
|
|
26
|
+
|
|
27
|
+
第一阶段迁移 RuoYi-Vue 的系统基础表:
|
|
28
|
+
|
|
29
|
+
- 用户、角色、用户角色关系。
|
|
30
|
+
- 部门、岗位、用户岗位关系。
|
|
31
|
+
- 菜单、按钮权限、角色菜单关系。
|
|
32
|
+
- 角色部门关系和数据权限范围。
|
|
33
|
+
- 字典类型、字典数据。
|
|
34
|
+
- 参数配置、通知公告。
|
|
35
|
+
- 登录日志、操作日志。
|
|
36
|
+
- 定时任务定义和任务执行日志。
|
|
37
|
+
|
|
38
|
+
任务执行器、在线用户、服务监控、缓存监控不能直接迁移实现,只迁移必要配置和历史记录,运行时能力由新平台重新实现。
|
|
39
|
+
|
|
40
|
+
## 权限与菜单
|
|
41
|
+
|
|
42
|
+
权限链路是迁移验收重点。迁移后,同一个用户应尽量保持原有菜单可见性、按钮权限和部门数据范围。
|
|
43
|
+
|
|
44
|
+
兼容层必须显式处理:
|
|
45
|
+
|
|
46
|
+
- 超级管理员规则。
|
|
47
|
+
- 用户启用/停用/删除状态。
|
|
48
|
+
- 角色启用/停用状态。
|
|
49
|
+
- 目录、菜单、按钮三类菜单节点。
|
|
50
|
+
- 路由路径、组件路径、权限标识、图标、排序、显示/隐藏。
|
|
51
|
+
- 角色菜单授权和角色部门数据范围。
|
|
52
|
+
|
|
53
|
+
新平台内部可以拆分导航、权限、路由绑定、模块绑定和功能开关,但迁移报告必须能追踪到原始 RuoYi-Vue 行。
|
|
54
|
+
|
|
55
|
+
## 运行时兼容
|
|
56
|
+
|
|
57
|
+
运行时兼容只服务旧项目过渡,不作为新项目默认路径。
|
|
58
|
+
|
|
59
|
+
在客户单机服务器上允许配置旧 MySQL / Redis 连接,用于:
|
|
60
|
+
|
|
61
|
+
- 读取旧系统基础数据。
|
|
62
|
+
- 对比新旧权限和菜单差异。
|
|
63
|
+
- 迁移前 dry-run。
|
|
64
|
+
- 必要时短期读取旧日志或旧配置。
|
|
65
|
+
|
|
66
|
+
默认不允许新业务直接写旧库。旧库运行时受控写入、双写、补偿和 Redis 运行态兼容已明确延期;当前只保留未来 Adapter 边界,不实现写接口。
|
|
67
|
+
|
|
68
|
+
## 若依能力吸收
|
|
69
|
+
|
|
70
|
+
新底座应吸收 RuoYi-Vue 的产品闭环思路,而不是复刻其实现。
|
|
71
|
+
|
|
72
|
+
优先吸收:
|
|
73
|
+
|
|
74
|
+
- 用户、部门、岗位、角色、菜单、字典、参数、通知公告。
|
|
75
|
+
- 操作日志、登录日志、在线用户。
|
|
76
|
+
- 服务监控、缓存监控、数据库连接状态。
|
|
77
|
+
- 定时任务和执行日志。
|
|
78
|
+
- 代码生成或 CRUD 生成。
|
|
79
|
+
- 系统接口文档。
|
|
80
|
+
|
|
81
|
+
每个业务 Module 默认具备列表、查询、详情、新增、编辑、删除、导入、导出、权限、审计和错误闭环。
|
|
82
|
+
|
|
83
|
+
当前平台已提供 `/api/system/operations` 和 Web 端 `/system/operations` 运维总览入口,用于承接在线用户、服务监控、缓存监控、定时任务、代码生成和系统接口这些闭环能力的产品位置。平台 Redis 探活、任务调度执行器、canonical CRUD 代码生成器和基于已注册 Module Manifest 的接口权限明细已接入;它们属于平台 canonical 能力,不等于启用本轮明确延期的 RuoYi 旧库运行时受控写入或旧 Redis 兼容。
|
|
84
|
+
|
|
85
|
+
## 验收标准
|
|
86
|
+
|
|
87
|
+
- 新项目可以完全不安装、不配置 RuoYi-Vue 兼容层。
|
|
88
|
+
- 旧项目可以从 RuoYi-Vue MySQL 执行 dry-run,并得到迁移报告。
|
|
89
|
+
- 用户、角色、部门、菜单、按钮权限和数据权限可以一次性导入新库。
|
|
90
|
+
- 迁移后可对比指定用户在新旧系统中的菜单树和权限标识。
|
|
91
|
+
- 迁移过程不要求兼容旧密码 hash,可统一重置密码。
|
|
92
|
+
- 单机部署时可以配置旧 MySQL / Redis 连接用于过渡兼容。
|
|
93
|
+
- 当前所有兼容读取必须经过 Adapter,并写入审计日志;受控写入重新立项后另行定义验收标准。
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# 管理面准入与业务面隔离
|
|
2
|
+
|
|
3
|
+
Windy Web 是 Platform Core 的管理控制面,只服务平台管理员、运维人员和授权审计人员。普通业务账号即使拥有某个业务 Module 的 API 权限,也不能进入 Windy AppShell。业务应用应拥有独立品牌、首页、导航、域名和工作区,并通过受 Guard 保护的 Windy Server API 使用平台能力。
|
|
4
|
+
|
|
5
|
+
## 准入契约
|
|
6
|
+
|
|
7
|
+
- `system.admin` Feature 表示 Windy 管理面能力,`system.admin.access` Permission 表示进入管理面的明确授权。
|
|
8
|
+
- Web 在进入任意 AppShell 路由前调用 `GET /api/admin/bootstrap`;这包括没有页面级 Guard 的 `/` 根路由。
|
|
9
|
+
- Server 按 License、Feature、Permission 顺序执行 Guard。License 限制期只放行这次准入判定本身,成功后 Web 仍会进入 License 恢复页,不能访问其它管理 API。
|
|
10
|
+
- bootstrap 只返回 Module Manifest 声明的 Admin Route、与这些路由匹配的菜单树,以及管理面完成 RBAC/Feature 判断所需的元数据;不返回业务资源数据。
|
|
11
|
+
- 缺少准入权限返回 403。Web 拒绝页不提供“返回工作台”,只允许退出登录,以及在配置 `VITE_BUSINESS_APP_URL` 时进入外部业务应用。
|
|
12
|
+
|
|
13
|
+
## Module composition seam
|
|
14
|
+
|
|
15
|
+
`ModuleManifest.adminRoutes` 是业务能力进入 Windy Web 的唯一显式 seam。API、Repository、Task、Feature、Permission、License 和 Audit 可以在没有 Admin Route 的情况下独立存在;这正是普通业务 Module 的默认形态。Windy Web 不应因为 Server 安装了业务 Module 就自动导入其 Vue 页面。
|
|
16
|
+
|
|
17
|
+
示例工单不声明菜单或 Admin Route,Windy Web 也不依赖其 package、Vue 页面或 API client。其 Server API、Repository、Task 和数据范围契约继续保留,用于证明业务能力可以独立消费平台底座;若要提供工单界面,应在独立业务应用中实现并调用这些 API。
|
|
18
|
+
|
|
19
|
+
## 失败与恢复
|
|
20
|
+
|
|
21
|
+
- 401:会话失效,清理本地会话并返回登录页。
|
|
22
|
+
- 403 且 bootstrap 拒绝:进入管理面拒绝页,不渲染 AppShell。
|
|
23
|
+
- bootstrap 不可用:fail closed,进入快照不可用拒绝态。
|
|
24
|
+
- License 限制:已通过 Admin 准入的账号进入 License 恢复页;普通业务账号仍先被 Admin 准入拒绝。
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Repository 级 Data Scope 强制
|
|
2
|
+
|
|
3
|
+
## 目标与安全不变量
|
|
4
|
+
|
|
5
|
+
Windy 只接受 Server 根据已验证会话、用户、启用角色和组织关系构造的 `ScopeContext`。HTTP query、body、Agent Tool 参数和导出请求都不是授权来源,不得从客户端覆盖 `actorId`、`departmentId` 或 ownership dimension。
|
|
6
|
+
|
|
7
|
+
范围必须在 Repository 查询中与状态、搜索、排序、count 和分页同时生效。先读取候选集再在 service 内存过滤不是可接受的大数据路径。详情、更新和删除也必须把 ID 与同一 scope predicate 合并,不允许先执行裸 `get(id)` 再依赖调用者补一层判断。
|
|
8
|
+
|
|
9
|
+
## 深模块接口
|
|
10
|
+
|
|
11
|
+
1. [`context.ts`](../../apps/server/src/data-access/context.ts) 构造 nominal `ScopeContext`。它表达 `all`、`tenant`、`department`、`department-and-children`、`self` 和 `custom` grant,并对多角色授权去重。品牌实例由非枚举 Symbol 标记,普通 JSON 或对象展开不能冒充 Server context。
|
|
12
|
+
2. [`query-specification.ts`](../../apps/server/src/data-access/query-specification.ts) 将 context 编译为与存储无关的 `DataScopeQuerySpecification`。多角色生成 union branches;部门后代由 Server 组织 Adapter 解析。
|
|
13
|
+
3. [`drizzle-predicate.ts`](../../apps/server/src/data-access/drizzle-predicate.ts) 将 specification 编译为 Drizzle SQL predicate。无 grant 时固定 `false`,需要的 owner、tenant 或 dimension 未绑定时 fail fast,不会退回全量查询。
|
|
14
|
+
4. [`drizzle-scoped-repository.ts`](../../apps/server/src/system/drizzle-scoped-repository.ts) 在 Repository 内把 scope 与软删除、状态和搜索条件合成同一个 `WHERE`。列表数据与 `count(*)` 复用该条件后再分页;详情、更新和软删除把 ID 与 scope 合并,直接 ID 越权返回稳定拒绝。写入还会校验变更后的 ownership,不能把可管理记录迁到范围之外。
|
|
15
|
+
|
|
16
|
+
Core 只理解 ownership dimension 的稳定 key/value 契约,不知道下游项目或行业模型。测试 fixture 以 `projectId` 证明模块可显式绑定自有维度;`projectId` 不是 Windy Core 字段或内建范围。
|
|
17
|
+
|
|
18
|
+
## 交付切片
|
|
19
|
+
|
|
20
|
+
- D1:已完成 `ScopeContext`、Query Specification、Drizzle predicate compiler 和范围编译单元测试。
|
|
21
|
+
- D2:已完成用户与示例 Work Order 的 list/count/search/pagination/get/update/delete Repository/SQL 下推;`bun run test:db:data-scope` 在临时 PostgreSQL 17 上验证搜索、分页总数、多角色并集、直接 ID 越权和写入不变性。
|
|
22
|
+
- D3:已封堵 Agent Tool、导出、bulk/job 与工单定时任务旁路。用户 Tool 和导出只读取 Server Actor 上的 nominal context,忽略客户端提交的 `userId`、`departmentId`、`projectId` 等 ownership 参数;请求级 Tool 缺少 context 时 fail closed,Tool Manifest 与 Handler 在启动时必须一一对应。
|
|
23
|
+
|
|
24
|
+
通用资源路由的 `dataAccess` 是必填判别联合:资源必须明确声明 `request` 并提供 scoped access,或声明 `platform`,不能因漏配可选字段静默回退裸 Repository。V1 异步 bulk handler 只接受显式 `platform` 资源,由服务端构造 nominal `all` context;需要继承申请人数据范围的异步资源必须先设计不可篡改的 context snapshot,不允许套用当前平台模式。工单运营快照同样使用服务端平台任务 Actor,不再暴露或调用裸 Repository。
|
|
25
|
+
|
|
26
|
+
Search Provider 只能在 D1–D3 全部闭环后接入,不得先用 Provider 内存裁剪冒充 Repository 级强制。
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Durable Job 深模块
|
|
2
|
+
|
|
3
|
+
更新时间:2026-07-16。
|
|
4
|
+
|
|
5
|
+
## 目标与边界
|
|
6
|
+
|
|
7
|
+
Durable Job 是 Scheduler、批量导入导出和后续后台任务共享的持久化执行内核。核心只识别稳定的 `handlerKey`、JSON payload 和阶段,不依赖字典、报表或其它业务 DTO。业务 handler 通过注册表接入执行内核;领取、租约、心跳、取消、超时、重试和恢复都由 Execution Repository 状态机推进。
|
|
8
|
+
|
|
9
|
+
它不是消息队列替代品,也不保存 artifact 二进制。任务表只保存 `ArtifactRef` 与完整性元数据,字节继续由 `BlobStore` 管理。
|
|
10
|
+
|
|
11
|
+
## 持久化事实
|
|
12
|
+
|
|
13
|
+
一次任务由八类可独立审计的事实组成:
|
|
14
|
+
|
|
15
|
+
| 事实 | 责任 |
|
|
16
|
+
| -------- | ------------------------------------------------------------------- |
|
|
17
|
+
| Job | handler、payload、队列、优先级、幂等域、最终状态与执行策略 |
|
|
18
|
+
| Stage | 有序执行单元及其当前尝试次数 |
|
|
19
|
+
| Attempt | 某阶段的一次真实执行,记录 worker、超时边界和结果 |
|
|
20
|
+
| Lease | worker 的有限期所有权;数据库只保存 token hash 和单调 fencing token |
|
|
21
|
+
| Progress | 以 attempt 内 sequence 追加的进度事实,不覆盖历史 |
|
|
22
|
+
| Artifact | BlobStore 引用、Owner、hash、大小、类型和留存时间 |
|
|
23
|
+
| Failure | 结构化错误码、可重试性、详情及发生位置 |
|
|
24
|
+
| Recovery | 人工恢复的原状态、操作者、理由与幂等请求号 |
|
|
25
|
+
|
|
26
|
+
外键统一使用 `ON DELETE RESTRICT`。任务历史不能因删除父记录被静默级联抹去;后续留存清理由显式策略处理。
|
|
27
|
+
|
|
28
|
+
## 幂等与模块接口
|
|
29
|
+
|
|
30
|
+
提交幂等域为 `requestedBy + handlerKey + idempotencyKey`。同一用户重放同一个业务请求会返回原任务,不会用重放 payload 覆盖已持久化事实;不同用户或不同 handler 可以安全复用外部请求号。
|
|
31
|
+
|
|
32
|
+
`DurableJobRepository` 是事实持久化端口,当前提供内存和 Drizzle/PostgreSQL Adapter。`DurableExecutionRepository` 独占所有状态迁移和租约校验。`DurableJobService` 只负责提交输入不变量、聚合快照读取和列表边界。调用方读取 Job snapshot 时会同时获得 stages、attempts、leases、progress、artifacts、failures 和 recoveries,避免把多表拼装规则泄漏到业务模块。
|
|
33
|
+
|
|
34
|
+
## Handler registry 与 Worker
|
|
35
|
+
|
|
36
|
+
业务模块用稳定 `handlerKey` 注册 payload parser 和 executor。重复 key 会阻止 composition;未知 key 被领取后形成不可重试的 `HANDLER_NOT_REGISTERED` failure,不会把任务永久留在 running。parser 必须先把 `Record<string, unknown>` 收窄为业务 DTO,Durable Job 核心不引入业务类型。
|
|
37
|
+
|
|
38
|
+
Worker 为 handler 提供 `AbortSignal`、heartbeat 和追加 progress。Worker 自动按 lease 时长的三分之一续租,同时允许长步骤主动 heartbeat。进程内 timeout 会触发 abort 和结构化失败;进程直接退出时,PostgreSQL 中的 `expiresAt` / `timeoutAt` 由下一实例 sweep,不依赖旧进程执行 finally。
|
|
39
|
+
|
|
40
|
+
Handler 必须满足:
|
|
41
|
+
|
|
42
|
+
- 以 Job ID 或业务幂等键保护外部副作用;租约只能防止同一时刻重复领取,不能撤销已发出的外部调用。
|
|
43
|
+
- 在长循环、外部调用前后检查 `AbortSignal` 或 heartbeat,取消和 fencing 后立即停止。
|
|
44
|
+
- 限流写 progress;progress sequence 由 Repository 在租约行锁内分配。
|
|
45
|
+
- 用 `DurableHandlerError` 明确稳定错误码和是否可重试;未知异常默认可重试,但受 `maxAttempts` 限制。
|
|
46
|
+
|
|
47
|
+
任务产物读取统一经过 `DurableArtifactService`:先按 `jobId + kind` 回读持久化元数据,再校验 Owner 或显式 manage 能力、留存时间、Blob 大小和 SHA-256。调用方不能凭 `ArtifactRef` 猜测下载;API 层仍需执行对应 RBAC Guard 并记录下载审计。
|
|
48
|
+
|
|
49
|
+
## 数据库并发基础
|
|
50
|
+
|
|
51
|
+
- `durable_jobs` 具有提交幂等唯一索引和按 queue/status/available/priority 的领取索引。
|
|
52
|
+
- 每个 Job 的 stage key 与 ordinal 均唯一。
|
|
53
|
+
- 每个 Stage 的 attempt number 唯一。
|
|
54
|
+
- 每个 Stage 同时最多一个 `active` lease;租约过期不依赖进程内存判断。
|
|
55
|
+
- progress sequence 在 attempt 内唯一;artifact kind 在 Job 内唯一。
|
|
56
|
+
- `maxAttempts`、`timeoutSeconds`、ordinal、attempt number、fencing token 和数量字段由数据库检查约束保护。
|
|
57
|
+
|
|
58
|
+
Claim 使用 `FOR UPDATE SKIP LOCKED`,多实例只会得到一个任务。数据库只保存 lease token 的 SHA-256;worker 后续写入还必须同时匹配 job/stage/attempt/lease、token hash、active 状态、未过期时间和单调 fencing token。旧 worker 即使晚到也不能完成新 attempt。
|
|
59
|
+
|
|
60
|
+
Lease 或 timeout sweep 会终结旧 attempt 并写 Failure;只有 `currentAttempt < maxAttempts` 才按 `availableAt` 重排。queued 取消立即进入最终状态;running 取消先记录请求,协作 worker 或 expiry sweep 负责最终收口。人工恢复只接受 failed/cancelled 且没有 active lease 的任务,保留历史 attempts/failures,并在 `durable_job_recoveries` 记录带幂等键的恢复事实。
|
|
61
|
+
|
|
62
|
+
## Scheduler 与 Bulk 兼容接入
|
|
63
|
+
|
|
64
|
+
`LegacyDurableAdapter` 让旧 Scheduler/Bulk API 继续读取原有执行表,同时把真实执行所有权交给 durable lease runtime。`scheduled_task_runs` 与 `bulk_data_jobs` 只新增 nullable `durable_job_id`;旧状态、分页、重试次数、行级结果和下载接口均不改名,也不要求一次性回填历史记录。
|
|
65
|
+
|
|
66
|
+
每个旧执行代次使用 `legacyId + generation` 作为 durable 幂等键,payload 只保存这两个稳定标识。handler 在每次领取时重新读取旧记录,不捕获提交进程的内存回调,因此新实例可以回收过期 lease 后继续执行。兼容规则如下:
|
|
67
|
+
|
|
68
|
+
- 新 Scheduler run 和 Bulk attempt 在执行前关联 durable job;并发重复启动会命中同一提交事实和同一 lease claim。
|
|
69
|
+
- 升级前已经处于 running、但尚无 `durable_job_id` 的记录由下一次 Scheduler tick 或 Bulk dispatch 自动采用。
|
|
70
|
+
- handler 只有在旧记录仍为 running 且 generation 一致时执行;旧记录已完成、失败或进入 retry-pending 时,恢复重放是空操作,避免重复完成和重复生成 artifact。
|
|
71
|
+
- durable runtime 只负责进程崩溃、租约和 fencing;Scheduler 的历史重试 run 与 Bulk 的业务失败重试状态仍由原服务维护,保持既有 API 可观察行为。
|
|
72
|
+
- Bulk attempt 进入下一次业务重试时清空旧关联并创建新的代次幂等任务;旧 durable attempts/failures 仍保留审计历史。
|
|
73
|
+
|
|
74
|
+
这是一条渐进迁移边界:新业务应直接注册 durable handler,不再新增另一套 `running` 状态机;Scheduler/Bulk Adapter 只服务现有接口兼容。
|
|
75
|
+
|
|
76
|
+
## 审批超时接入
|
|
77
|
+
|
|
78
|
+
最小审批注册稳定 handler `system.workflow.timeout` 和独立 queue。创建审批时以 WorkItem ID 作为提交幂等键,把 Job 的 `availableAt` 固定为审批 `dueAt`;payload 只保存 WorkItem ID。handler 到期后重新读取当前 WorkItem 与版本,只有 `pending` 或 `claimed` 才执行服务账号专用的 `timeout` 命令,已终结任务重复执行为空操作。
|
|
79
|
+
|
|
80
|
+
启动与每次派发前会分页扫描尚未终结的审批并幂等补交 Job,用于覆盖“审批事实已提交、进程在 durable submit 前退出”的短窗口。调度器只负责唤醒派发,真实任务、可用时间、重试和执行结果都在 Durable Job 表中;新实例重建 Repository、Registry 和 Worker 后可以继续领取,不依赖旧进程 timer 或闭包。完整审批边界见[最小审批工作流](./minimal-approval-workflow.md)。
|
|
81
|
+
|
|
82
|
+
## 运维与验证
|
|
83
|
+
|
|
84
|
+
事实模型、执行恢复与兼容关联分别使用 `0023_fresh_thunderbolt_ross.sql`、`0024_misty_lizard.sql`、`0025_premium_songbird.sql`;审批事实和通知目标分别由 `0026_aberrant_doctor_octopus.sql`、`0027_tiny_diamondback.sql` 前向演进。上线前执行:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
bun run db:migrate
|
|
88
|
+
bun run test:db:migrations
|
|
89
|
+
bun run typecheck
|
|
90
|
+
bun test apps/server/src/jobs packages/database/src/schema.test.ts
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
PostgreSQL Repository 集成测试通过 `JOBS_TEST_DATABASE_URL` 启用,覆盖并发幂等提交、重复 claim、伪造 token、进程重建后的 lease recovery、timeout、cancel 和幂等人工恢复。兼容集成测试还需覆盖 running Bulk 在重建服务后的 lease 回收、旧记录关联、重复启动和重复完成空操作。迁移回归必须在全新 PostgreSQL 上执行一次并重复执行一次,第二次不得改变 Drizzle tracker 指纹。
|
|
94
|
+
|
|
95
|
+
## 取舍
|
|
96
|
+
|
|
97
|
+
- payload 使用类型化边界上的 `Record<string, unknown>`,核心不解释业务字段;业务 handler 必须在注册时自行校验 DTO。
|
|
98
|
+
- 进度保留追加历史而不是只存百分比,便于定位卡点和恢复;高频任务需由 handler 限流,避免逐条业务记录写进度。
|
|
99
|
+
- token 原文只允许短暂存在于 worker 进程,持久化层保存 SHA-256;数据库泄露不能直接伪造心跳或完成请求。
|
|
100
|
+
- 自动重试有界,但人工恢复可产生新的 attempt;每次人工恢复都需要理由和幂等请求号,由运维/RBAC/审计入口在接入层约束。
|
|
101
|
+
- 当前使用 PostgreSQL 作为 durable runtime 的并发真相。其它数据库必须实现同等 claim/lease 语义后才能声明兼容。
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# 最小审批工作流
|
|
2
|
+
|
|
3
|
+
更新时间:2026-07-16。
|
|
4
|
+
|
|
5
|
+
## 目标与边界
|
|
6
|
+
|
|
7
|
+
本模块提供业务模块可复用的最小审批原语,而不是 BPMN 或完整流程平台。业务模块提交标题、候选角色、截止时间和通用 `TargetRef`,审批模块负责领取、转交、决定、取消、超时、持久化事实、授权、审计和通知。它不解释采购、合同等业务 DTO,也不新增业务详情页。
|
|
8
|
+
|
|
9
|
+
当前不支持多步骤编排、条件分支、会签/或签、加签、抄送、代理人、流程设计器和可视化审批中心。需要这些能力时必须先建立独立领域模型,不能向当前状态机不断追加可选字段。
|
|
10
|
+
|
|
11
|
+
## 状态机与命令
|
|
12
|
+
|
|
13
|
+
`WorkItem` 聚合包含请求人、候选角色、可选领取人、截止时间、版本和 TargetRef。状态仅有 `pending`、`claimed`、`approved`、`rejected`、`cancelled`、`timed-out`;命令仅有 `claim`、`transfer`、`approve`、`reject`、`cancel`、`timeout`。
|
|
14
|
+
|
|
15
|
+
- 候选角色用户可以领取 pending 任务;领取后只有当前领取人可以决定。
|
|
16
|
+
- transfer 需要管理权限,并把任务保持在 claimed;目标领取人从服务端账号目录解析,客户端不能提交角色快照。
|
|
17
|
+
- approve/reject 产生类型化 Decision;reject、transfer 和 cancel 要求 Reason。
|
|
18
|
+
- 请求人可以取消未终结任务;服务账号专用 timeout 只能在截止时间到达后终结 pending/claimed。
|
|
19
|
+
- 所有终态不可再次迁移;每个命令使用 expectedVersion,旧版本写入返回冲突。
|
|
20
|
+
|
|
21
|
+
纯领域函数不依赖 HTTP、数据库、通知或定时器。完整转换和不变量由单元测试覆盖。
|
|
22
|
+
|
|
23
|
+
## 持久化、幂等与并发
|
|
24
|
+
|
|
25
|
+
`workflow_work_items` 保存聚合当前快照,`workflow_transitions` 追加不可变流转事实。事实包含命令、前后状态、Actor、发生时间、Decision、Reason、前后领取人、TargetRef 和结果快照;外键禁止级联删除。
|
|
26
|
+
|
|
27
|
+
创建幂等域为“请求人 + idempotency key”,命令幂等域为“Actor + idempotency key”。PostgreSQL Adapter 在事务中取得幂等 advisory lock,再锁定 WorkItem 行并检查 expectedVersion;并发领取同一版本时只有一个成功。重放同一请求返回已经持久化的结果,不重复写流转事实。
|
|
28
|
+
|
|
29
|
+
## Feature、RBAC、可见范围与审计
|
|
30
|
+
|
|
31
|
+
能力基础 Key 是 `system.workflow`。Manifest 同时注册 Feature、`read/create/approve/manage` 权限、九个 API 绑定、隐藏入口和审计动作。列表、详情、历史、创建与全部命令均先执行服务端 Feature/RBAC Guard;直接调用 API 不能绕过。
|
|
32
|
+
|
|
33
|
+
Repository 还执行对象级可见范围:请求人、候选角色用户、当前领取人和具有 manage 权限的用户可以读取;其他用户按不存在处理。领域状态机再次验证候选角色、当前领取人、请求人、管理权限和服务账号,避免只依赖列表过滤或前端按钮。
|
|
34
|
+
|
|
35
|
+
mutation 在写入前记录关键 intent,成功后审计命令、前后状态、Decision 和 TargetRef。完整 Reason 保存在受保护的流转历史中,不复制到普通日志或审计 metadata,避免敏感审批说明扩散。
|
|
36
|
+
|
|
37
|
+
## 通知与业务跳转
|
|
38
|
+
|
|
39
|
+
审批通过站内通知的窄业务端口发送消息。新任务按候选角色投递;转交按新领取人投递;其它迁移通知请求人。通知携带原始通用 `TargetRef`,由消费端决定如何打开已有业务路由,审批模块不依赖业务页面。
|
|
40
|
+
|
|
41
|
+
每条业务通知使用工作项 ID 和版本构造稳定 `sourceKey`,进程重试不会重复发布。收件箱和已读入口都按当前用户与角色重新校验受众;普通通知管理 API 不接受受众、TargetRef 或 source key。该扩展不是通知中心 P1:组织范围、管理端定向/定时发布、偏好、合并策略和外部渠道仍未实现。
|
|
42
|
+
|
|
43
|
+
## Durable 超时与重启恢复
|
|
44
|
+
|
|
45
|
+
创建 WorkItem 后,以 WorkItem ID 幂等提交 `system.workflow.timeout` Durable Job,`availableAt` 等于 `dueAt`。Job payload 只包含 WorkItem ID。到期 handler 重新读取 PostgreSQL 当前状态与版本,再以服务 Actor 执行 timeout;终态重复处理为空操作。
|
|
46
|
+
|
|
47
|
+
服务启动和每次 timeout 派发前会扫描 pending/claimed WorkItem 并幂等补交任务。这同时覆盖两类恢复:旧进程已经提交 Job 后退出,新实例从持久化 queue 继续领取;或旧进程在 WorkItem 提交后、Job 提交前退出,新实例通过 reconcile 补齐。任务最多尝试五次,单次 timeout 为 30 秒。
|
|
48
|
+
|
|
49
|
+
## 运维与验证
|
|
50
|
+
|
|
51
|
+
上线必须执行 migration `0026_aberrant_doctor_octopus.sql` 和 `0027_tiny_diamondback.sql`。建议门禁:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
bun run db:migrate
|
|
55
|
+
bun run test:db:migrations
|
|
56
|
+
bun run typecheck
|
|
57
|
+
bun test apps/server/src/workflow packages/database/src
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
真实 PostgreSQL 集成测试通过 `WORKFLOW_TEST_DATABASE_URL` 启用,覆盖创建/命令幂等、并发领取仅一方成功、候选角色与对象可见范围,以及重建 Durable Repository/Registry/Worker 后执行到期任务。迁移回归必须在全新数据库执行一次并重复执行一次,第二次不得改变 tracker 指纹。
|