Phase 0 scaffold: SvelteKit 5 + Drizzle + auth + storage interface
Stack matches sibling buildfor_life_* apps: SvelteKit 5 with adapter-node, Svelte 5 runes, TypeScript, Tailwind v4 with @theme inline tokens, PostgreSQL via Drizzle ORM, Argon2id sessions via @node-rs/argon2 and @oslojs/crypto, EasyMDE ready for wiki/decision markdown, Sharp for thumbnails. Included in this commit: - Config: package.json, svelte.config.js, vite.config.ts, tsconfig.json, drizzle.config.ts, .gitignore, .env.example, .gitattributes, .npmrc - Tenancy schema: companies, users, company_users, sessions (10 enums pre-declared for the full domain so downstream migrations don't re-diff them; decision_scope widened to include asset + work_package per product decision) - Auth: password hashing + SHA-256-hashed session cookies, session lifetime 30d with sliding renewal at T-15d, login + logout + session refresh in hooks - Storage: StorageAdapter interface + LocalDiskStorage with HMAC-signed URLs served by /api/files, S3 drop-in with zero schema change - UI shell: dark-mode bootstrap in app.html identical to siblings, sidebar (w-64, h-14 header, amber attention band pattern from repair), topbar with breadcrumbs, theme toggle with cross-tab sync via storage event, blue-600 primary, responsive drawer - Routes: (app) authed group with auto-redirect to /login, (auth) login group, dashboard placeholder, error page, signed-file API - Scripts: create-user script for bootstrapping first admin user - Drizzle: initial migration generated (0000_init.sql) - Shared agents and skills committed under .claude/; per-user permissions gitignored Typecheck: 0 errors / 0 warnings across 555 files. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
CREATE TYPE "public"."audit_action" AS ENUM('create', 'update', 'delete', 'move', 'assign', 'complete', 'login', 'logout');--> statement-breakpoint
|
||||
CREATE TYPE "public"."checklist_scope" AS ENUM('task', 'subtask', 'maintenance_event', 'ad_hoc');--> statement-breakpoint
|
||||
CREATE TYPE "public"."container_kind" AS ENUM('project', 'property');--> statement-breakpoint
|
||||
CREATE TYPE "public"."decision_scope" AS ENUM('project', 'property', 'asset', 'work_package');--> statement-breakpoint
|
||||
CREATE TYPE "public"."doc_scope" AS ENUM('project', 'property', 'asset', 'work_package', 'decision_event');--> statement-breakpoint
|
||||
CREATE TYPE "public"."field_type" AS ENUM('text', 'textarea', 'int', 'float', 'bool', 'date', 'ip', 'cidr', 'mac', 'enum', 'multi_enum', 'url', 'email', 'asset_ref');--> statement-breakpoint
|
||||
CREATE TYPE "public"."interval_unit" AS ENUM('days', 'months', 'years', 'hours', 'cycles', 'km');--> statement-breakpoint
|
||||
CREATE TYPE "public"."role" AS ENUM('admin', 'manager', 'user', 'viewer');--> statement-breakpoint
|
||||
CREATE TYPE "public"."schedule_kind" AS ENUM('time', 'usage');--> statement-breakpoint
|
||||
CREATE TYPE "public"."task_status" AS ENUM('todo', 'doing', 'done', 'blocked');--> statement-breakpoint
|
||||
CREATE TYPE "public"."wiki_scope" AS ENUM('global', 'project', 'property');--> statement-breakpoint
|
||||
CREATE TABLE "companies" (
|
||||
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
||||
"name" varchar(255) NOT NULL,
|
||||
"slug" varchar(128) NOT NULL,
|
||||
"settings_json" text,
|
||||
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||
"updated_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||
"deleted_at" timestamp with time zone,
|
||||
CONSTRAINT "companies_slug_unique" UNIQUE("slug")
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE "company_users" (
|
||||
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
||||
"company_id" uuid NOT NULL,
|
||||
"user_id" uuid NOT NULL,
|
||||
"role" "role" DEFAULT 'user' NOT NULL,
|
||||
"created_at" timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE "sessions" (
|
||||
"id" varchar(128) PRIMARY KEY NOT NULL,
|
||||
"user_id" uuid NOT NULL,
|
||||
"active_company_id" uuid,
|
||||
"user_agent" text,
|
||||
"ip" varchar(64),
|
||||
"expires_at" timestamp with time zone NOT NULL,
|
||||
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||
"last_seen_at" timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE "users" (
|
||||
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
||||
"email" varchar(320) NOT NULL,
|
||||
"email_normalized" varchar(320) NOT NULL,
|
||||
"display_name" varchar(255) NOT NULL,
|
||||
"password_hash" text,
|
||||
"oidc_subject" varchar(255),
|
||||
"oidc_issuer" varchar(255),
|
||||
"is_active" boolean DEFAULT true NOT NULL,
|
||||
"last_login_at" timestamp with time zone,
|
||||
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||
"updated_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||
"deleted_at" timestamp with time zone
|
||||
);
|
||||
--> statement-breakpoint
|
||||
ALTER TABLE "company_users" ADD CONSTRAINT "company_users_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
||||
ALTER TABLE "company_users" ADD CONSTRAINT "company_users_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
||||
ALTER TABLE "sessions" ADD CONSTRAINT "sessions_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
||||
ALTER TABLE "sessions" ADD CONSTRAINT "sessions_active_company_id_companies_id_fk" FOREIGN KEY ("active_company_id") REFERENCES "public"."companies"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
|
||||
CREATE UNIQUE INDEX "company_users_uq" ON "company_users" USING btree ("company_id","user_id");--> statement-breakpoint
|
||||
CREATE INDEX "company_users_by_user" ON "company_users" USING btree ("user_id");--> statement-breakpoint
|
||||
CREATE INDEX "sessions_by_user" ON "sessions" USING btree ("user_id");--> statement-breakpoint
|
||||
CREATE INDEX "sessions_by_expiry" ON "sessions" USING btree ("expires_at");--> statement-breakpoint
|
||||
CREATE UNIQUE INDEX "users_email_norm_uq" ON "users" USING btree ("email_normalized");--> statement-breakpoint
|
||||
CREATE UNIQUE INDEX "users_oidc_uq" ON "users" USING btree ("oidc_issuer","oidc_subject");
|
||||
@@ -0,0 +1,18 @@
|
||||
# drizzle migrations
|
||||
|
||||
This directory holds SQL migrations generated by `drizzle-kit generate` from the
|
||||
TypeScript schema in `src/lib/server/db/schema/`.
|
||||
|
||||
Commands:
|
||||
|
||||
- `npm run db:generate` — diff the schema vs. the latest snapshot and emit a new `.sql` file
|
||||
- `npm run db:migrate` — apply pending migrations to `DATABASE_URL`
|
||||
- `npm run db:push` — skip migrations and sync the schema directly (**dev only**)
|
||||
- `npm run db:studio` — open the Drizzle Studio UI
|
||||
|
||||
After every generate, review the SQL for surprises — especially around:
|
||||
|
||||
- enum additions (non-blocking) vs. removals (require a separate data migration)
|
||||
- index changes on large tables (use `CONCURRENTLY` in production rollouts)
|
||||
- anything touching `assets.custom_fields` — see `project_buildfor_life_ops.md`
|
||||
memory for the immutable-key policy.
|
||||
@@ -0,0 +1,566 @@
|
||||
{
|
||||
"id": "6c1750b0-e7c3-4bfd-af22-25dd7db8f073",
|
||||
"prevId": "00000000-0000-0000-0000-000000000000",
|
||||
"version": "7",
|
||||
"dialect": "postgresql",
|
||||
"tables": {
|
||||
"public.companies": {
|
||||
"name": "companies",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "uuid",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"default": "gen_random_uuid()"
|
||||
},
|
||||
"name": {
|
||||
"name": "name",
|
||||
"type": "varchar(255)",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"slug": {
|
||||
"name": "slug",
|
||||
"type": "varchar(128)",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"settings_json": {
|
||||
"name": "settings_json",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"created_at": {
|
||||
"name": "created_at",
|
||||
"type": "timestamp with time zone",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"default": "now()"
|
||||
},
|
||||
"updated_at": {
|
||||
"name": "updated_at",
|
||||
"type": "timestamp with time zone",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"default": "now()"
|
||||
},
|
||||
"deleted_at": {
|
||||
"name": "deleted_at",
|
||||
"type": "timestamp with time zone",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {
|
||||
"companies_slug_unique": {
|
||||
"name": "companies_slug_unique",
|
||||
"nullsNotDistinct": false,
|
||||
"columns": [
|
||||
"slug"
|
||||
]
|
||||
}
|
||||
},
|
||||
"policies": {},
|
||||
"checkConstraints": {},
|
||||
"isRLSEnabled": false
|
||||
},
|
||||
"public.company_users": {
|
||||
"name": "company_users",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "uuid",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"default": "gen_random_uuid()"
|
||||
},
|
||||
"company_id": {
|
||||
"name": "company_id",
|
||||
"type": "uuid",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"user_id": {
|
||||
"name": "user_id",
|
||||
"type": "uuid",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"role": {
|
||||
"name": "role",
|
||||
"type": "role",
|
||||
"typeSchema": "public",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"default": "'user'"
|
||||
},
|
||||
"created_at": {
|
||||
"name": "created_at",
|
||||
"type": "timestamp with time zone",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"default": "now()"
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"company_users_uq": {
|
||||
"name": "company_users_uq",
|
||||
"columns": [
|
||||
{
|
||||
"expression": "company_id",
|
||||
"isExpression": false,
|
||||
"asc": true,
|
||||
"nulls": "last"
|
||||
},
|
||||
{
|
||||
"expression": "user_id",
|
||||
"isExpression": false,
|
||||
"asc": true,
|
||||
"nulls": "last"
|
||||
}
|
||||
],
|
||||
"isUnique": true,
|
||||
"concurrently": false,
|
||||
"method": "btree",
|
||||
"with": {}
|
||||
},
|
||||
"company_users_by_user": {
|
||||
"name": "company_users_by_user",
|
||||
"columns": [
|
||||
{
|
||||
"expression": "user_id",
|
||||
"isExpression": false,
|
||||
"asc": true,
|
||||
"nulls": "last"
|
||||
}
|
||||
],
|
||||
"isUnique": false,
|
||||
"concurrently": false,
|
||||
"method": "btree",
|
||||
"with": {}
|
||||
}
|
||||
},
|
||||
"foreignKeys": {
|
||||
"company_users_company_id_companies_id_fk": {
|
||||
"name": "company_users_company_id_companies_id_fk",
|
||||
"tableFrom": "company_users",
|
||||
"tableTo": "companies",
|
||||
"columnsFrom": [
|
||||
"company_id"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
},
|
||||
"company_users_user_id_users_id_fk": {
|
||||
"name": "company_users_user_id_users_id_fk",
|
||||
"tableFrom": "company_users",
|
||||
"tableTo": "users",
|
||||
"columnsFrom": [
|
||||
"user_id"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"policies": {},
|
||||
"checkConstraints": {},
|
||||
"isRLSEnabled": false
|
||||
},
|
||||
"public.sessions": {
|
||||
"name": "sessions",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "varchar(128)",
|
||||
"primaryKey": true,
|
||||
"notNull": true
|
||||
},
|
||||
"user_id": {
|
||||
"name": "user_id",
|
||||
"type": "uuid",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"active_company_id": {
|
||||
"name": "active_company_id",
|
||||
"type": "uuid",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"user_agent": {
|
||||
"name": "user_agent",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"ip": {
|
||||
"name": "ip",
|
||||
"type": "varchar(64)",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"expires_at": {
|
||||
"name": "expires_at",
|
||||
"type": "timestamp with time zone",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"created_at": {
|
||||
"name": "created_at",
|
||||
"type": "timestamp with time zone",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"default": "now()"
|
||||
},
|
||||
"last_seen_at": {
|
||||
"name": "last_seen_at",
|
||||
"type": "timestamp with time zone",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"default": "now()"
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"sessions_by_user": {
|
||||
"name": "sessions_by_user",
|
||||
"columns": [
|
||||
{
|
||||
"expression": "user_id",
|
||||
"isExpression": false,
|
||||
"asc": true,
|
||||
"nulls": "last"
|
||||
}
|
||||
],
|
||||
"isUnique": false,
|
||||
"concurrently": false,
|
||||
"method": "btree",
|
||||
"with": {}
|
||||
},
|
||||
"sessions_by_expiry": {
|
||||
"name": "sessions_by_expiry",
|
||||
"columns": [
|
||||
{
|
||||
"expression": "expires_at",
|
||||
"isExpression": false,
|
||||
"asc": true,
|
||||
"nulls": "last"
|
||||
}
|
||||
],
|
||||
"isUnique": false,
|
||||
"concurrently": false,
|
||||
"method": "btree",
|
||||
"with": {}
|
||||
}
|
||||
},
|
||||
"foreignKeys": {
|
||||
"sessions_user_id_users_id_fk": {
|
||||
"name": "sessions_user_id_users_id_fk",
|
||||
"tableFrom": "sessions",
|
||||
"tableTo": "users",
|
||||
"columnsFrom": [
|
||||
"user_id"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
},
|
||||
"sessions_active_company_id_companies_id_fk": {
|
||||
"name": "sessions_active_company_id_companies_id_fk",
|
||||
"tableFrom": "sessions",
|
||||
"tableTo": "companies",
|
||||
"columnsFrom": [
|
||||
"active_company_id"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "set null",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"policies": {},
|
||||
"checkConstraints": {},
|
||||
"isRLSEnabled": false
|
||||
},
|
||||
"public.users": {
|
||||
"name": "users",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "uuid",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"default": "gen_random_uuid()"
|
||||
},
|
||||
"email": {
|
||||
"name": "email",
|
||||
"type": "varchar(320)",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"email_normalized": {
|
||||
"name": "email_normalized",
|
||||
"type": "varchar(320)",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"display_name": {
|
||||
"name": "display_name",
|
||||
"type": "varchar(255)",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"password_hash": {
|
||||
"name": "password_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"oidc_subject": {
|
||||
"name": "oidc_subject",
|
||||
"type": "varchar(255)",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"oidc_issuer": {
|
||||
"name": "oidc_issuer",
|
||||
"type": "varchar(255)",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"is_active": {
|
||||
"name": "is_active",
|
||||
"type": "boolean",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"default": true
|
||||
},
|
||||
"last_login_at": {
|
||||
"name": "last_login_at",
|
||||
"type": "timestamp with time zone",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"created_at": {
|
||||
"name": "created_at",
|
||||
"type": "timestamp with time zone",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"default": "now()"
|
||||
},
|
||||
"updated_at": {
|
||||
"name": "updated_at",
|
||||
"type": "timestamp with time zone",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"default": "now()"
|
||||
},
|
||||
"deleted_at": {
|
||||
"name": "deleted_at",
|
||||
"type": "timestamp with time zone",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"users_email_norm_uq": {
|
||||
"name": "users_email_norm_uq",
|
||||
"columns": [
|
||||
{
|
||||
"expression": "email_normalized",
|
||||
"isExpression": false,
|
||||
"asc": true,
|
||||
"nulls": "last"
|
||||
}
|
||||
],
|
||||
"isUnique": true,
|
||||
"concurrently": false,
|
||||
"method": "btree",
|
||||
"with": {}
|
||||
},
|
||||
"users_oidc_uq": {
|
||||
"name": "users_oidc_uq",
|
||||
"columns": [
|
||||
{
|
||||
"expression": "oidc_issuer",
|
||||
"isExpression": false,
|
||||
"asc": true,
|
||||
"nulls": "last"
|
||||
},
|
||||
{
|
||||
"expression": "oidc_subject",
|
||||
"isExpression": false,
|
||||
"asc": true,
|
||||
"nulls": "last"
|
||||
}
|
||||
],
|
||||
"isUnique": true,
|
||||
"concurrently": false,
|
||||
"method": "btree",
|
||||
"with": {}
|
||||
}
|
||||
},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"policies": {},
|
||||
"checkConstraints": {},
|
||||
"isRLSEnabled": false
|
||||
}
|
||||
},
|
||||
"enums": {
|
||||
"public.audit_action": {
|
||||
"name": "audit_action",
|
||||
"schema": "public",
|
||||
"values": [
|
||||
"create",
|
||||
"update",
|
||||
"delete",
|
||||
"move",
|
||||
"assign",
|
||||
"complete",
|
||||
"login",
|
||||
"logout"
|
||||
]
|
||||
},
|
||||
"public.checklist_scope": {
|
||||
"name": "checklist_scope",
|
||||
"schema": "public",
|
||||
"values": [
|
||||
"task",
|
||||
"subtask",
|
||||
"maintenance_event",
|
||||
"ad_hoc"
|
||||
]
|
||||
},
|
||||
"public.container_kind": {
|
||||
"name": "container_kind",
|
||||
"schema": "public",
|
||||
"values": [
|
||||
"project",
|
||||
"property"
|
||||
]
|
||||
},
|
||||
"public.decision_scope": {
|
||||
"name": "decision_scope",
|
||||
"schema": "public",
|
||||
"values": [
|
||||
"project",
|
||||
"property",
|
||||
"asset",
|
||||
"work_package"
|
||||
]
|
||||
},
|
||||
"public.doc_scope": {
|
||||
"name": "doc_scope",
|
||||
"schema": "public",
|
||||
"values": [
|
||||
"project",
|
||||
"property",
|
||||
"asset",
|
||||
"work_package",
|
||||
"decision_event"
|
||||
]
|
||||
},
|
||||
"public.field_type": {
|
||||
"name": "field_type",
|
||||
"schema": "public",
|
||||
"values": [
|
||||
"text",
|
||||
"textarea",
|
||||
"int",
|
||||
"float",
|
||||
"bool",
|
||||
"date",
|
||||
"ip",
|
||||
"cidr",
|
||||
"mac",
|
||||
"enum",
|
||||
"multi_enum",
|
||||
"url",
|
||||
"email",
|
||||
"asset_ref"
|
||||
]
|
||||
},
|
||||
"public.interval_unit": {
|
||||
"name": "interval_unit",
|
||||
"schema": "public",
|
||||
"values": [
|
||||
"days",
|
||||
"months",
|
||||
"years",
|
||||
"hours",
|
||||
"cycles",
|
||||
"km"
|
||||
]
|
||||
},
|
||||
"public.role": {
|
||||
"name": "role",
|
||||
"schema": "public",
|
||||
"values": [
|
||||
"admin",
|
||||
"manager",
|
||||
"user",
|
||||
"viewer"
|
||||
]
|
||||
},
|
||||
"public.schedule_kind": {
|
||||
"name": "schedule_kind",
|
||||
"schema": "public",
|
||||
"values": [
|
||||
"time",
|
||||
"usage"
|
||||
]
|
||||
},
|
||||
"public.task_status": {
|
||||
"name": "task_status",
|
||||
"schema": "public",
|
||||
"values": [
|
||||
"todo",
|
||||
"doing",
|
||||
"done",
|
||||
"blocked"
|
||||
]
|
||||
},
|
||||
"public.wiki_scope": {
|
||||
"name": "wiki_scope",
|
||||
"schema": "public",
|
||||
"values": [
|
||||
"global",
|
||||
"project",
|
||||
"property"
|
||||
]
|
||||
}
|
||||
},
|
||||
"schemas": {},
|
||||
"sequences": {},
|
||||
"roles": {},
|
||||
"policies": {},
|
||||
"views": {},
|
||||
"_meta": {
|
||||
"columns": {},
|
||||
"schemas": {},
|
||||
"tables": {}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"version": "7",
|
||||
"dialect": "postgresql",
|
||||
"entries": [
|
||||
{
|
||||
"idx": 0,
|
||||
"version": "7",
|
||||
"when": 1776760498088,
|
||||
"tag": "0000_init",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user