aios-core 2.2.2 → 2.3.1
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/.aios-core/.session/current-session.json +14 -14
- package/.aios-core/cli/commands/migrate/validate.js +1 -1
- package/.aios-core/core/docs/session-update-pattern.md +17 -10
- package/.aios-core/core/elicitation/elicitation-engine.js +11 -6
- package/.aios-core/core/elicitation/session-manager.js +2 -1
- package/.aios-core/core/registry/registry-schema.json +166 -166
- package/.aios-core/core/registry/service-registry.json +6585 -6585
- package/.aios-core/core-config.yaml +12 -1
- package/.aios-core/data/agent-config-requirements.yaml +5 -5
- package/.aios-core/development/agents/devops.md +12 -0
- package/.aios-core/development/scripts/squad/README.md +112 -0
- package/.aios-core/development/scripts/squad/index.js +41 -0
- package/.aios-core/development/scripts/squad/squad-loader.js +359 -0
- package/.aios-core/development/scripts/squad/squad-validator.js +685 -0
- package/.aios-core/development/tasks/add-mcp.md +11 -5
- package/.aios-core/development/tasks/search-mcp.md +309 -0
- package/.aios-core/development/tasks/setup-mcp-docker.md +11 -8
- package/.aios-core/development/tasks/squad-creator-validate.md +151 -0
- package/.aios-core/docs/standards/AGENT-PERSONALIZATION-STANDARD-V1.md +3 -3
- package/.aios-core/index.d.ts +7 -7
- package/.aios-core/index.js +1 -1
- package/.aios-core/infrastructure/scripts/batch-creator.js +1 -1
- package/.aios-core/infrastructure/scripts/component-generator.js +1 -1
- package/.aios-core/infrastructure/templates/coderabbit.yaml.template +279 -279
- package/.aios-core/infrastructure/templates/github-workflows/ci.yml.template +169 -169
- package/.aios-core/infrastructure/templates/github-workflows/pr-automation.yml.template +330 -330
- package/.aios-core/infrastructure/templates/github-workflows/release.yml.template +196 -196
- package/.aios-core/infrastructure/templates/gitignore/gitignore-aios-base.tmpl +63 -63
- package/.aios-core/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +18 -18
- package/.aios-core/infrastructure/templates/gitignore/gitignore-node.tmpl +85 -85
- package/.aios-core/infrastructure/templates/gitignore/gitignore-python.tmpl +145 -145
- package/.aios-core/infrastructure/tests/utilities-audit-results.json +500 -500
- package/.aios-core/infrastructure/tools/README.md +1 -1
- package/.aios-core/install-manifest.yaml +4 -1
- package/.aios-core/manifests/schema/manifest-schema.json +190 -190
- package/.aios-core/manifests/workers.csv +203 -203
- package/.aios-core/package.json +102 -102
- package/.aios-core/product/templates/activation-instructions-template.md +7 -7
- package/.aios-core/product/templates/adr.hbs +125 -125
- package/.aios-core/product/templates/component-react-tmpl.tsx +98 -98
- package/.aios-core/product/templates/dbdr.hbs +241 -241
- package/.aios-core/product/templates/engine/schemas/adr.schema.json +102 -102
- package/.aios-core/product/templates/engine/schemas/dbdr.schema.json +205 -205
- package/.aios-core/product/templates/engine/schemas/epic.schema.json +175 -175
- package/.aios-core/product/templates/engine/schemas/pmdr.schema.json +175 -175
- package/.aios-core/product/templates/engine/schemas/prd-v2.schema.json +300 -300
- package/.aios-core/product/templates/engine/schemas/prd.schema.json +152 -152
- package/.aios-core/product/templates/engine/schemas/story.schema.json +222 -222
- package/.aios-core/product/templates/engine/schemas/task.schema.json +154 -154
- package/.aios-core/product/templates/epic.hbs +212 -212
- package/.aios-core/product/templates/eslintrc-security.json +32 -32
- package/.aios-core/product/templates/github-actions-cd.yml +212 -212
- package/.aios-core/product/templates/github-actions-ci.yml +172 -172
- package/.aios-core/product/templates/pmdr.hbs +186 -186
- package/.aios-core/product/templates/prd-v2.0.hbs +216 -216
- package/.aios-core/product/templates/prd.hbs +201 -201
- package/.aios-core/product/templates/shock-report-tmpl.html +502 -502
- package/.aios-core/product/templates/story.hbs +263 -263
- package/.aios-core/product/templates/task.hbs +170 -170
- package/.aios-core/product/templates/tmpl-comment-on-examples.sql +158 -158
- package/.aios-core/product/templates/tmpl-migration-script.sql +91 -91
- package/.aios-core/product/templates/tmpl-rls-granular-policies.sql +104 -104
- package/.aios-core/product/templates/tmpl-rls-kiss-policy.sql +10 -10
- package/.aios-core/product/templates/tmpl-rls-roles.sql +135 -135
- package/.aios-core/product/templates/tmpl-rls-simple.sql +77 -77
- package/.aios-core/product/templates/tmpl-rls-tenant.sql +152 -152
- package/.aios-core/product/templates/tmpl-rollback-script.sql +77 -77
- package/.aios-core/product/templates/tmpl-seed-data.sql +140 -140
- package/.aios-core/product/templates/tmpl-smoke-test.sql +16 -16
- package/.aios-core/product/templates/tmpl-staging-copy-merge.sql +139 -139
- package/.aios-core/product/templates/tmpl-stored-proc.sql +140 -140
- package/.aios-core/product/templates/tmpl-trigger.sql +152 -152
- package/.aios-core/product/templates/tmpl-view-materialized.sql +133 -133
- package/.aios-core/product/templates/tmpl-view.sql +177 -177
- package/.aios-core/product/templates/token-exports-css-tmpl.css +240 -240
- package/.aios-core/quality/schemas/quality-metrics.schema.json +233 -233
- package/.aios-core/schemas/squad-schema.json +185 -0
- package/.aios-core/scripts/README.md +90 -322
- package/.aios-core/scripts/migrate-framework-docs.sh +300 -300
- package/.claude/rules/mcp-usage.md +116 -100
- package/LICENSE +48 -48
- package/README.md +3 -4
- package/bin/aios.js +2 -1
- package/package.json +1 -3
- package/packages/installer/package.json +39 -39
- package/templates/squad/LICENSE +21 -21
- package/templates/squad/README.md +37 -37
- package/templates/squad/agents/example-agent.yaml +36 -36
- package/templates/squad/package.json +19 -19
- package/templates/squad/squad.yaml +25 -25
- package/templates/squad/tasks/example-task.yaml +46 -46
- package/templates/squad/templates/example-template.md +24 -24
- package/templates/squad/tests/example-agent.test.js +53 -53
- package/templates/squad/workflows/example-workflow.yaml +54 -54
- package/tools/diagnose-npx-issue.ps1 +96 -96
- package/tools/quick-diagnose.cmd +85 -85
- package/tools/quick-diagnose.ps1 +117 -117
- package/.aios-core/core/data/agent-config-requirements.yaml +0 -368
- package/.aios-core/core/data/aios-kb.md +0 -924
- package/.aios-core/core/data/workflow-patterns.yaml +0 -267
- package/.aios-core/product/templates/1mcp-config.yaml +0 -225
- package/.aios-core/scripts/context-detector.js +0 -226
- package/.aios-core/scripts/elicitation-engine.js +0 -385
- package/.aios-core/scripts/elicitation-session-manager.js +0 -300
- package/.claude/CLAUDE.md +0 -221
|
@@ -1,152 +1,152 @@
|
|
|
1
|
-
-- Multi-Tenant RLS Policy Template
|
|
2
|
-
-- Table: :table_name
|
|
3
|
-
-- Security Model: Tenant isolation with user permissions
|
|
4
|
-
-- Created: :created_date
|
|
5
|
-
--
|
|
6
|
-
-- This template creates RLS policies for multi-tenant applications
|
|
7
|
-
-- where data is isolated by organization/tenant
|
|
8
|
-
|
|
9
|
-
-- =============================================================================
|
|
10
|
-
-- PREREQUISITES: Tenant Infrastructure
|
|
11
|
-
-- =============================================================================
|
|
12
|
-
|
|
13
|
-
-- Tenants/Organizations table (if not exists)
|
|
14
|
-
CREATE TABLE IF NOT EXISTS tenants (
|
|
15
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
16
|
-
name TEXT NOT NULL,
|
|
17
|
-
slug TEXT UNIQUE NOT NULL,
|
|
18
|
-
settings JSONB DEFAULT '{}'::JSONB,
|
|
19
|
-
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
20
|
-
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
21
|
-
);
|
|
22
|
-
|
|
23
|
-
-- Tenant memberships (which users belong to which tenants)
|
|
24
|
-
CREATE TABLE IF NOT EXISTS tenant_members (
|
|
25
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
26
|
-
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
|
27
|
-
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
28
|
-
role TEXT NOT NULL DEFAULT 'member' CHECK (role IN ('owner', 'admin', 'member', 'viewer')),
|
|
29
|
-
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
30
|
-
|
|
31
|
-
UNIQUE(tenant_id, user_id)
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
CREATE INDEX IF NOT EXISTS idx_tenant_members_user ON tenant_members(user_id);
|
|
35
|
-
CREATE INDEX IF NOT EXISTS idx_tenant_members_tenant ON tenant_members(tenant_id);
|
|
36
|
-
|
|
37
|
-
-- =============================================================================
|
|
38
|
-
-- HELPER FUNCTIONS
|
|
39
|
-
-- =============================================================================
|
|
40
|
-
|
|
41
|
-
-- Get current user's tenant IDs
|
|
42
|
-
CREATE OR REPLACE FUNCTION get_user_tenant_ids()
|
|
43
|
-
RETURNS UUID[] AS $$
|
|
44
|
-
BEGIN
|
|
45
|
-
RETURN ARRAY(
|
|
46
|
-
SELECT tenant_id
|
|
47
|
-
FROM tenant_members
|
|
48
|
-
WHERE user_id = auth.uid()
|
|
49
|
-
);
|
|
50
|
-
END;
|
|
51
|
-
$$ LANGUAGE plpgsql SECURITY DEFINER STABLE;
|
|
52
|
-
|
|
53
|
-
-- Check if user is member of tenant
|
|
54
|
-
CREATE OR REPLACE FUNCTION is_tenant_member(check_tenant_id UUID)
|
|
55
|
-
RETURNS BOOLEAN AS $$
|
|
56
|
-
BEGIN
|
|
57
|
-
RETURN EXISTS (
|
|
58
|
-
SELECT 1
|
|
59
|
-
FROM tenant_members
|
|
60
|
-
WHERE tenant_id = check_tenant_id
|
|
61
|
-
AND user_id = auth.uid()
|
|
62
|
-
);
|
|
63
|
-
END;
|
|
64
|
-
$$ LANGUAGE plpgsql SECURITY DEFINER STABLE;
|
|
65
|
-
|
|
66
|
-
-- Check user's role in tenant
|
|
67
|
-
CREATE OR REPLACE FUNCTION get_tenant_role(check_tenant_id UUID)
|
|
68
|
-
RETURNS TEXT AS $$
|
|
69
|
-
BEGIN
|
|
70
|
-
RETURN (
|
|
71
|
-
SELECT role
|
|
72
|
-
FROM tenant_members
|
|
73
|
-
WHERE tenant_id = check_tenant_id
|
|
74
|
-
AND user_id = auth.uid()
|
|
75
|
-
);
|
|
76
|
-
END;
|
|
77
|
-
$$ LANGUAGE plpgsql SECURITY DEFINER STABLE;
|
|
78
|
-
|
|
79
|
-
-- =============================================================================
|
|
80
|
-
-- TABLE WITH TENANT COLUMN
|
|
81
|
-
-- =============================================================================
|
|
82
|
-
-- Your table should have a tenant_id column:
|
|
83
|
-
--
|
|
84
|
-
-- ALTER TABLE :table_name ADD COLUMN IF NOT EXISTS tenant_id UUID REFERENCES tenants(id);
|
|
85
|
-
-- CREATE INDEX IF NOT EXISTS idx_:table_name_tenant ON :table_name(tenant_id);
|
|
86
|
-
|
|
87
|
-
-- =============================================================================
|
|
88
|
-
-- RLS POLICIES FOR TENANT ISOLATION
|
|
89
|
-
-- =============================================================================
|
|
90
|
-
|
|
91
|
-
ALTER TABLE :table_name ENABLE ROW LEVEL SECURITY;
|
|
92
|
-
|
|
93
|
-
-- SELECT: Users can only see rows from their tenants
|
|
94
|
-
DROP POLICY IF EXISTS ":table_name_tenant_select" ON :table_name;
|
|
95
|
-
CREATE POLICY ":table_name_tenant_select"
|
|
96
|
-
ON :table_name
|
|
97
|
-
FOR SELECT
|
|
98
|
-
TO authenticated
|
|
99
|
-
USING (
|
|
100
|
-
tenant_id = ANY(get_user_tenant_ids())
|
|
101
|
-
);
|
|
102
|
-
|
|
103
|
-
-- INSERT: Users can only insert into tenants they belong to
|
|
104
|
-
DROP POLICY IF EXISTS ":table_name_tenant_insert" ON :table_name;
|
|
105
|
-
CREATE POLICY ":table_name_tenant_insert"
|
|
106
|
-
ON :table_name
|
|
107
|
-
FOR INSERT
|
|
108
|
-
TO authenticated
|
|
109
|
-
WITH CHECK (
|
|
110
|
-
is_tenant_member(tenant_id)
|
|
111
|
-
);
|
|
112
|
-
|
|
113
|
-
-- UPDATE: Only admins/owners can update
|
|
114
|
-
DROP POLICY IF EXISTS ":table_name_tenant_update" ON :table_name;
|
|
115
|
-
CREATE POLICY ":table_name_tenant_update"
|
|
116
|
-
ON :table_name
|
|
117
|
-
FOR UPDATE
|
|
118
|
-
TO authenticated
|
|
119
|
-
USING (
|
|
120
|
-
tenant_id = ANY(get_user_tenant_ids())
|
|
121
|
-
AND get_tenant_role(tenant_id) IN ('owner', 'admin')
|
|
122
|
-
)
|
|
123
|
-
WITH CHECK (
|
|
124
|
-
tenant_id = ANY(get_user_tenant_ids())
|
|
125
|
-
);
|
|
126
|
-
|
|
127
|
-
-- DELETE: Only owners can delete
|
|
128
|
-
DROP POLICY IF EXISTS ":table_name_tenant_delete" ON :table_name;
|
|
129
|
-
CREATE POLICY ":table_name_tenant_delete"
|
|
130
|
-
ON :table_name
|
|
131
|
-
FOR DELETE
|
|
132
|
-
TO authenticated
|
|
133
|
-
USING (
|
|
134
|
-
get_tenant_role(tenant_id) = 'owner'
|
|
135
|
-
);
|
|
136
|
-
|
|
137
|
-
-- =============================================================================
|
|
138
|
-
-- RLS ON TENANT TABLES THEMSELVES
|
|
139
|
-
-- =============================================================================
|
|
140
|
-
|
|
141
|
-
ALTER TABLE tenants ENABLE ROW LEVEL SECURITY;
|
|
142
|
-
ALTER TABLE tenant_members ENABLE ROW LEVEL SECURITY;
|
|
143
|
-
|
|
144
|
-
-- Tenants: Members can see their tenants
|
|
145
|
-
CREATE POLICY "tenants_member_select" ON tenants
|
|
146
|
-
FOR SELECT TO authenticated
|
|
147
|
-
USING (id = ANY(get_user_tenant_ids()));
|
|
148
|
-
|
|
149
|
-
-- Tenant members: Members can see their tenant's members
|
|
150
|
-
CREATE POLICY "tenant_members_select" ON tenant_members
|
|
151
|
-
FOR SELECT TO authenticated
|
|
152
|
-
USING (tenant_id = ANY(get_user_tenant_ids()));
|
|
1
|
+
-- Multi-Tenant RLS Policy Template
|
|
2
|
+
-- Table: :table_name
|
|
3
|
+
-- Security Model: Tenant isolation with user permissions
|
|
4
|
+
-- Created: :created_date
|
|
5
|
+
--
|
|
6
|
+
-- This template creates RLS policies for multi-tenant applications
|
|
7
|
+
-- where data is isolated by organization/tenant
|
|
8
|
+
|
|
9
|
+
-- =============================================================================
|
|
10
|
+
-- PREREQUISITES: Tenant Infrastructure
|
|
11
|
+
-- =============================================================================
|
|
12
|
+
|
|
13
|
+
-- Tenants/Organizations table (if not exists)
|
|
14
|
+
CREATE TABLE IF NOT EXISTS tenants (
|
|
15
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
16
|
+
name TEXT NOT NULL,
|
|
17
|
+
slug TEXT UNIQUE NOT NULL,
|
|
18
|
+
settings JSONB DEFAULT '{}'::JSONB,
|
|
19
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
20
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
-- Tenant memberships (which users belong to which tenants)
|
|
24
|
+
CREATE TABLE IF NOT EXISTS tenant_members (
|
|
25
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
26
|
+
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
|
27
|
+
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
28
|
+
role TEXT NOT NULL DEFAULT 'member' CHECK (role IN ('owner', 'admin', 'member', 'viewer')),
|
|
29
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
30
|
+
|
|
31
|
+
UNIQUE(tenant_id, user_id)
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_tenant_members_user ON tenant_members(user_id);
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_tenant_members_tenant ON tenant_members(tenant_id);
|
|
36
|
+
|
|
37
|
+
-- =============================================================================
|
|
38
|
+
-- HELPER FUNCTIONS
|
|
39
|
+
-- =============================================================================
|
|
40
|
+
|
|
41
|
+
-- Get current user's tenant IDs
|
|
42
|
+
CREATE OR REPLACE FUNCTION get_user_tenant_ids()
|
|
43
|
+
RETURNS UUID[] AS $$
|
|
44
|
+
BEGIN
|
|
45
|
+
RETURN ARRAY(
|
|
46
|
+
SELECT tenant_id
|
|
47
|
+
FROM tenant_members
|
|
48
|
+
WHERE user_id = auth.uid()
|
|
49
|
+
);
|
|
50
|
+
END;
|
|
51
|
+
$$ LANGUAGE plpgsql SECURITY DEFINER STABLE;
|
|
52
|
+
|
|
53
|
+
-- Check if user is member of tenant
|
|
54
|
+
CREATE OR REPLACE FUNCTION is_tenant_member(check_tenant_id UUID)
|
|
55
|
+
RETURNS BOOLEAN AS $$
|
|
56
|
+
BEGIN
|
|
57
|
+
RETURN EXISTS (
|
|
58
|
+
SELECT 1
|
|
59
|
+
FROM tenant_members
|
|
60
|
+
WHERE tenant_id = check_tenant_id
|
|
61
|
+
AND user_id = auth.uid()
|
|
62
|
+
);
|
|
63
|
+
END;
|
|
64
|
+
$$ LANGUAGE plpgsql SECURITY DEFINER STABLE;
|
|
65
|
+
|
|
66
|
+
-- Check user's role in tenant
|
|
67
|
+
CREATE OR REPLACE FUNCTION get_tenant_role(check_tenant_id UUID)
|
|
68
|
+
RETURNS TEXT AS $$
|
|
69
|
+
BEGIN
|
|
70
|
+
RETURN (
|
|
71
|
+
SELECT role
|
|
72
|
+
FROM tenant_members
|
|
73
|
+
WHERE tenant_id = check_tenant_id
|
|
74
|
+
AND user_id = auth.uid()
|
|
75
|
+
);
|
|
76
|
+
END;
|
|
77
|
+
$$ LANGUAGE plpgsql SECURITY DEFINER STABLE;
|
|
78
|
+
|
|
79
|
+
-- =============================================================================
|
|
80
|
+
-- TABLE WITH TENANT COLUMN
|
|
81
|
+
-- =============================================================================
|
|
82
|
+
-- Your table should have a tenant_id column:
|
|
83
|
+
--
|
|
84
|
+
-- ALTER TABLE :table_name ADD COLUMN IF NOT EXISTS tenant_id UUID REFERENCES tenants(id);
|
|
85
|
+
-- CREATE INDEX IF NOT EXISTS idx_:table_name_tenant ON :table_name(tenant_id);
|
|
86
|
+
|
|
87
|
+
-- =============================================================================
|
|
88
|
+
-- RLS POLICIES FOR TENANT ISOLATION
|
|
89
|
+
-- =============================================================================
|
|
90
|
+
|
|
91
|
+
ALTER TABLE :table_name ENABLE ROW LEVEL SECURITY;
|
|
92
|
+
|
|
93
|
+
-- SELECT: Users can only see rows from their tenants
|
|
94
|
+
DROP POLICY IF EXISTS ":table_name_tenant_select" ON :table_name;
|
|
95
|
+
CREATE POLICY ":table_name_tenant_select"
|
|
96
|
+
ON :table_name
|
|
97
|
+
FOR SELECT
|
|
98
|
+
TO authenticated
|
|
99
|
+
USING (
|
|
100
|
+
tenant_id = ANY(get_user_tenant_ids())
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
-- INSERT: Users can only insert into tenants they belong to
|
|
104
|
+
DROP POLICY IF EXISTS ":table_name_tenant_insert" ON :table_name;
|
|
105
|
+
CREATE POLICY ":table_name_tenant_insert"
|
|
106
|
+
ON :table_name
|
|
107
|
+
FOR INSERT
|
|
108
|
+
TO authenticated
|
|
109
|
+
WITH CHECK (
|
|
110
|
+
is_tenant_member(tenant_id)
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
-- UPDATE: Only admins/owners can update
|
|
114
|
+
DROP POLICY IF EXISTS ":table_name_tenant_update" ON :table_name;
|
|
115
|
+
CREATE POLICY ":table_name_tenant_update"
|
|
116
|
+
ON :table_name
|
|
117
|
+
FOR UPDATE
|
|
118
|
+
TO authenticated
|
|
119
|
+
USING (
|
|
120
|
+
tenant_id = ANY(get_user_tenant_ids())
|
|
121
|
+
AND get_tenant_role(tenant_id) IN ('owner', 'admin')
|
|
122
|
+
)
|
|
123
|
+
WITH CHECK (
|
|
124
|
+
tenant_id = ANY(get_user_tenant_ids())
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
-- DELETE: Only owners can delete
|
|
128
|
+
DROP POLICY IF EXISTS ":table_name_tenant_delete" ON :table_name;
|
|
129
|
+
CREATE POLICY ":table_name_tenant_delete"
|
|
130
|
+
ON :table_name
|
|
131
|
+
FOR DELETE
|
|
132
|
+
TO authenticated
|
|
133
|
+
USING (
|
|
134
|
+
get_tenant_role(tenant_id) = 'owner'
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
-- =============================================================================
|
|
138
|
+
-- RLS ON TENANT TABLES THEMSELVES
|
|
139
|
+
-- =============================================================================
|
|
140
|
+
|
|
141
|
+
ALTER TABLE tenants ENABLE ROW LEVEL SECURITY;
|
|
142
|
+
ALTER TABLE tenant_members ENABLE ROW LEVEL SECURITY;
|
|
143
|
+
|
|
144
|
+
-- Tenants: Members can see their tenants
|
|
145
|
+
CREATE POLICY "tenants_member_select" ON tenants
|
|
146
|
+
FOR SELECT TO authenticated
|
|
147
|
+
USING (id = ANY(get_user_tenant_ids()));
|
|
148
|
+
|
|
149
|
+
-- Tenant members: Members can see their tenant's members
|
|
150
|
+
CREATE POLICY "tenant_members_select" ON tenant_members
|
|
151
|
+
FOR SELECT TO authenticated
|
|
152
|
+
USING (tenant_id = ANY(get_user_tenant_ids()));
|
|
@@ -1,77 +1,77 @@
|
|
|
1
|
-
-- Rollback Script Template
|
|
2
|
-
-- Rollback for Migration: :migration_name
|
|
3
|
-
-- Created: :created_date
|
|
4
|
-
-- Author: :author
|
|
5
|
-
-- Description: Reverses the changes made by :migration_name
|
|
6
|
-
--
|
|
7
|
-
-- IMPORTANT: Test this rollback in development before using in production
|
|
8
|
-
-- WARNING: Data migrations may not be fully reversible
|
|
9
|
-
|
|
10
|
-
BEGIN;
|
|
11
|
-
|
|
12
|
-
-- =============================================================================
|
|
13
|
-
-- PRE-ROLLBACK VERIFICATION
|
|
14
|
-
-- =============================================================================
|
|
15
|
-
|
|
16
|
-
DO $$
|
|
17
|
-
BEGIN
|
|
18
|
-
-- Verify we're rolling back the correct migration
|
|
19
|
-
RAISE NOTICE 'Starting rollback of migration: :migration_name';
|
|
20
|
-
|
|
21
|
-
-- Add any safety checks here
|
|
22
|
-
-- Example: Check if dependent objects exist
|
|
23
|
-
END $$;
|
|
24
|
-
|
|
25
|
-
-- =============================================================================
|
|
26
|
-
-- REVERSE DATA MIGRATION (if applicable)
|
|
27
|
-
-- =============================================================================
|
|
28
|
-
|
|
29
|
-
-- If data was migrated, restore from backup or reverse transformation
|
|
30
|
-
-- WARNING: This may result in data loss if no backup exists
|
|
31
|
-
-- INSERT INTO :old_table (old_col1, old_col2)
|
|
32
|
-
-- SELECT col1, col2 FROM :new_table;
|
|
33
|
-
|
|
34
|
-
-- =============================================================================
|
|
35
|
-
-- REVERSE SCHEMA CHANGES
|
|
36
|
-
-- =============================================================================
|
|
37
|
-
|
|
38
|
-
-- Remove triggers
|
|
39
|
-
DROP TRIGGER IF EXISTS trigger_update_:table_name_updated_at ON :table_name;
|
|
40
|
-
|
|
41
|
-
-- Remove indexes
|
|
42
|
-
-- DROP INDEX IF EXISTS idx_:table_:column;
|
|
43
|
-
|
|
44
|
-
-- Remove columns from existing tables
|
|
45
|
-
-- ALTER TABLE :existing_table DROP COLUMN IF EXISTS :new_column;
|
|
46
|
-
|
|
47
|
-
-- Drop tables (DANGEROUS - ensure data is backed up)
|
|
48
|
-
-- DROP TABLE IF EXISTS :table_name CASCADE;
|
|
49
|
-
|
|
50
|
-
-- =============================================================================
|
|
51
|
-
-- POST-ROLLBACK VERIFICATION
|
|
52
|
-
-- =============================================================================
|
|
53
|
-
|
|
54
|
-
DO $$
|
|
55
|
-
BEGIN
|
|
56
|
-
-- Verify rollback was successful
|
|
57
|
-
-- Example: Verify table no longer exists
|
|
58
|
-
-- ASSERT NOT (SELECT EXISTS (
|
|
59
|
-
-- SELECT 1 FROM information_schema.tables
|
|
60
|
-
-- WHERE table_name = ':table_name'
|
|
61
|
-
-- )), 'Table :table_name still exists after rollback';
|
|
62
|
-
|
|
63
|
-
RAISE NOTICE 'Rollback completed successfully';
|
|
64
|
-
END $$;
|
|
65
|
-
|
|
66
|
-
COMMIT;
|
|
67
|
-
|
|
68
|
-
-- =============================================================================
|
|
69
|
-
-- POST-ROLLBACK NOTES
|
|
70
|
-
-- =============================================================================
|
|
71
|
-
--
|
|
72
|
-
-- After running this rollback:
|
|
73
|
-
-- 1. Verify application still functions correctly
|
|
74
|
-
-- 2. Check for any orphaned data
|
|
75
|
-
-- 3. Update migration tracking if applicable
|
|
76
|
-
-- 4. Document reason for rollback
|
|
77
|
-
--
|
|
1
|
+
-- Rollback Script Template
|
|
2
|
+
-- Rollback for Migration: :migration_name
|
|
3
|
+
-- Created: :created_date
|
|
4
|
+
-- Author: :author
|
|
5
|
+
-- Description: Reverses the changes made by :migration_name
|
|
6
|
+
--
|
|
7
|
+
-- IMPORTANT: Test this rollback in development before using in production
|
|
8
|
+
-- WARNING: Data migrations may not be fully reversible
|
|
9
|
+
|
|
10
|
+
BEGIN;
|
|
11
|
+
|
|
12
|
+
-- =============================================================================
|
|
13
|
+
-- PRE-ROLLBACK VERIFICATION
|
|
14
|
+
-- =============================================================================
|
|
15
|
+
|
|
16
|
+
DO $$
|
|
17
|
+
BEGIN
|
|
18
|
+
-- Verify we're rolling back the correct migration
|
|
19
|
+
RAISE NOTICE 'Starting rollback of migration: :migration_name';
|
|
20
|
+
|
|
21
|
+
-- Add any safety checks here
|
|
22
|
+
-- Example: Check if dependent objects exist
|
|
23
|
+
END $$;
|
|
24
|
+
|
|
25
|
+
-- =============================================================================
|
|
26
|
+
-- REVERSE DATA MIGRATION (if applicable)
|
|
27
|
+
-- =============================================================================
|
|
28
|
+
|
|
29
|
+
-- If data was migrated, restore from backup or reverse transformation
|
|
30
|
+
-- WARNING: This may result in data loss if no backup exists
|
|
31
|
+
-- INSERT INTO :old_table (old_col1, old_col2)
|
|
32
|
+
-- SELECT col1, col2 FROM :new_table;
|
|
33
|
+
|
|
34
|
+
-- =============================================================================
|
|
35
|
+
-- REVERSE SCHEMA CHANGES
|
|
36
|
+
-- =============================================================================
|
|
37
|
+
|
|
38
|
+
-- Remove triggers
|
|
39
|
+
DROP TRIGGER IF EXISTS trigger_update_:table_name_updated_at ON :table_name;
|
|
40
|
+
|
|
41
|
+
-- Remove indexes
|
|
42
|
+
-- DROP INDEX IF EXISTS idx_:table_:column;
|
|
43
|
+
|
|
44
|
+
-- Remove columns from existing tables
|
|
45
|
+
-- ALTER TABLE :existing_table DROP COLUMN IF EXISTS :new_column;
|
|
46
|
+
|
|
47
|
+
-- Drop tables (DANGEROUS - ensure data is backed up)
|
|
48
|
+
-- DROP TABLE IF EXISTS :table_name CASCADE;
|
|
49
|
+
|
|
50
|
+
-- =============================================================================
|
|
51
|
+
-- POST-ROLLBACK VERIFICATION
|
|
52
|
+
-- =============================================================================
|
|
53
|
+
|
|
54
|
+
DO $$
|
|
55
|
+
BEGIN
|
|
56
|
+
-- Verify rollback was successful
|
|
57
|
+
-- Example: Verify table no longer exists
|
|
58
|
+
-- ASSERT NOT (SELECT EXISTS (
|
|
59
|
+
-- SELECT 1 FROM information_schema.tables
|
|
60
|
+
-- WHERE table_name = ':table_name'
|
|
61
|
+
-- )), 'Table :table_name still exists after rollback';
|
|
62
|
+
|
|
63
|
+
RAISE NOTICE 'Rollback completed successfully';
|
|
64
|
+
END $$;
|
|
65
|
+
|
|
66
|
+
COMMIT;
|
|
67
|
+
|
|
68
|
+
-- =============================================================================
|
|
69
|
+
-- POST-ROLLBACK NOTES
|
|
70
|
+
-- =============================================================================
|
|
71
|
+
--
|
|
72
|
+
-- After running this rollback:
|
|
73
|
+
-- 1. Verify application still functions correctly
|
|
74
|
+
-- 2. Check for any orphaned data
|
|
75
|
+
-- 3. Update migration tracking if applicable
|
|
76
|
+
-- 4. Document reason for rollback
|
|
77
|
+
--
|