Add project domain/governance fields, catalog tables, source bindings, and repo allowlist stub table without backfilling legacy classification. Co-authored-by: Cursor <cursoragent@cursor.com>
141 lines
6.9 KiB
SQL
141 lines
6.9 KiB
SQL
-- +goose Up
|
||
-- SWBOOT-01: additive project domain / type / compliance / governance fields.
|
||
-- Does NOT backfill product_domain or project_type for legacy rows (avoid misclassification).
|
||
|
||
ALTER TABLE projects
|
||
ADD COLUMN IF NOT EXISTS product_domain TEXT NOT NULL DEFAULT '',
|
||
ADD COLUMN IF NOT EXISTS project_type_key TEXT NOT NULL DEFAULT '',
|
||
ADD COLUMN IF NOT EXISTS compliance_profile_key TEXT NOT NULL DEFAULT '',
|
||
ADD COLUMN IF NOT EXISTS governance_profile TEXT NOT NULL DEFAULT '',
|
||
ADD COLUMN IF NOT EXISTS team_mode TEXT NOT NULL DEFAULT '',
|
||
ADD COLUMN IF NOT EXISTS execution_mode TEXT NOT NULL DEFAULT '',
|
||
ADD COLUMN IF NOT EXISTS data_sensitivity TEXT NOT NULL DEFAULT '',
|
||
ADD COLUMN IF NOT EXISTS network_policy TEXT NOT NULL DEFAULT '',
|
||
ADD COLUMN IF NOT EXISTS budget_class TEXT NOT NULL DEFAULT '',
|
||
ADD COLUMN IF NOT EXISTS problem_statement TEXT NOT NULL DEFAULT '',
|
||
ADD COLUMN IF NOT EXISTS target_users TEXT NOT NULL DEFAULT '',
|
||
ADD COLUMN IF NOT EXISTS target_outcome TEXT NOT NULL DEFAULT '',
|
||
ADD COLUMN IF NOT EXISTS product_shape TEXT NOT NULL DEFAULT '';
|
||
|
||
CREATE TABLE IF NOT EXISTS project_types (
|
||
id BIGSERIAL PRIMARY KEY,
|
||
type_key TEXT NOT NULL UNIQUE,
|
||
name TEXT NOT NULL,
|
||
product_domain TEXT NOT NULL,
|
||
description TEXT NOT NULL DEFAULT '',
|
||
default_governance TEXT NOT NULL DEFAULT 'standard',
|
||
default_workflow_key TEXT NOT NULL DEFAULT '',
|
||
status TEXT NOT NULL DEFAULT 'active',
|
||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS compliance_profiles (
|
||
id BIGSERIAL PRIMARY KEY,
|
||
profile_key TEXT NOT NULL UNIQUE,
|
||
name TEXT NOT NULL,
|
||
description TEXT NOT NULL DEFAULT '',
|
||
ruleset_version TEXT NOT NULL DEFAULT 'v1',
|
||
requires_independent_review BOOLEAN NOT NULL DEFAULT false,
|
||
status TEXT NOT NULL DEFAULT 'active',
|
||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS project_type_workflows (
|
||
id BIGSERIAL PRIMARY KEY,
|
||
project_type_key TEXT NOT NULL REFERENCES project_types(type_key) ON DELETE CASCADE,
|
||
workflow_key TEXT NOT NULL,
|
||
compliance_profile_key TEXT NOT NULL DEFAULT '',
|
||
recommended BOOLEAN NOT NULL DEFAULT false,
|
||
allowed BOOLEAN NOT NULL DEFAULT true,
|
||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||
CONSTRAINT uq_project_type_workflow UNIQUE (project_type_key, workflow_key, compliance_profile_key)
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS project_source_bindings (
|
||
id BIGSERIAL PRIMARY KEY,
|
||
project_id BIGINT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
||
source_type TEXT NOT NULL,
|
||
source_ref TEXT NOT NULL DEFAULT '',
|
||
revision TEXT NOT NULL DEFAULT '',
|
||
content_hash TEXT NOT NULL DEFAULT '',
|
||
permission_scope TEXT NOT NULL DEFAULT 'read_only',
|
||
secret_ref TEXT NOT NULL DEFAULT '',
|
||
exclude_globs TEXT NOT NULL DEFAULT '',
|
||
ingested_at TIMESTAMPTZ,
|
||
created_by BIGINT REFERENCES users(id) ON DELETE SET NULL,
|
||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||
);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_project_source_bindings_project
|
||
ON project_source_bindings(project_id, created_at DESC);
|
||
|
||
CREATE TABLE IF NOT EXISTS repo_path_allowlist (
|
||
id BIGSERIAL PRIMARY KEY,
|
||
path_prefix TEXT NOT NULL UNIQUE,
|
||
description TEXT NOT NULL DEFAULT '',
|
||
enabled BOOLEAN NOT NULL DEFAULT true,
|
||
created_by BIGINT REFERENCES users(id) ON DELETE SET NULL,
|
||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||
);
|
||
|
||
INSERT INTO project_types (type_key, name, product_domain, description, default_governance, default_workflow_key)
|
||
VALUES
|
||
('greenfield', '绿地立项', 'non_medical_software', '从零规划新软件', 'standard', 'software_bootstrap'),
|
||
('existing_product', '既有产品梳理', 'non_medical_software', '梳理已有产品与仓库', 'standard', 'software_bootstrap'),
|
||
('legacy_modernization', '遗留现代化', 'non_medical_software', '遗留系统改造与迁移', 'standard', 'software_bootstrap'),
|
||
('existing_self_bootstrap', '系统自举', 'non_medical_software', '用 Agent-System 梳理并建设自身', 'standard', 'software_bootstrap')
|
||
ON CONFLICT (type_key) DO NOTHING;
|
||
|
||
INSERT INTO compliance_profiles (profile_key, name, description, ruleset_version, requires_independent_review)
|
||
VALUES
|
||
('none', '无外部合规预设', '不预设外部法规步骤;鉴权/审计/安全基线仍生效', 'v1', false),
|
||
('internal_control', '内部控制', '内部流程、权限与审计约束', 'v1', false),
|
||
('security_baseline', '安全基线', '威胁建模、依赖与 secret 边界', 'v1', false),
|
||
('privacy', '隐私保护', '数据分类与最小权限', 'v1', true),
|
||
('custom', '自定义合规', '项目自定义合规包', 'v1', true)
|
||
ON CONFLICT (profile_key) DO NOTHING;
|
||
|
||
INSERT INTO project_type_workflows (project_type_key, workflow_key, compliance_profile_key, recommended, allowed)
|
||
VALUES
|
||
('greenfield', 'software_bootstrap', '', true, true),
|
||
('greenfield', 'software_delivery', '', false, true),
|
||
('existing_product', 'software_bootstrap', '', true, true),
|
||
('existing_product', 'software_delivery', '', false, true),
|
||
('legacy_modernization', 'software_bootstrap', '', true, true),
|
||
('legacy_modernization', 'software_delivery', '', false, true),
|
||
('existing_self_bootstrap', 'software_bootstrap', '', true, true),
|
||
('existing_self_bootstrap', 'software_delivery', '', false, true)
|
||
ON CONFLICT (project_type_key, workflow_key, compliance_profile_key) DO NOTHING;
|
||
|
||
INSERT INTO workflow_executor_registry (executor_key, description) VALUES
|
||
('software.doc.v1', '软件领域通用文档执行器(bootstrap/delivery)')
|
||
ON CONFLICT (executor_key) DO NOTHING;
|
||
|
||
-- +goose Down
|
||
DROP TABLE IF EXISTS repo_path_allowlist;
|
||
DROP TABLE IF EXISTS project_source_bindings;
|
||
DROP TABLE IF EXISTS project_type_workflows;
|
||
DROP TABLE IF EXISTS compliance_profiles;
|
||
DROP TABLE IF EXISTS project_types;
|
||
|
||
ALTER TABLE projects
|
||
DROP COLUMN IF EXISTS product_shape,
|
||
DROP COLUMN IF EXISTS target_outcome,
|
||
DROP COLUMN IF EXISTS target_users,
|
||
DROP COLUMN IF EXISTS problem_statement,
|
||
DROP COLUMN IF EXISTS budget_class,
|
||
DROP COLUMN IF EXISTS network_policy,
|
||
DROP COLUMN IF EXISTS data_sensitivity,
|
||
DROP COLUMN IF EXISTS execution_mode,
|
||
DROP COLUMN IF EXISTS team_mode,
|
||
DROP COLUMN IF EXISTS governance_profile,
|
||
DROP COLUMN IF EXISTS compliance_profile_key,
|
||
DROP COLUMN IF EXISTS project_type_key,
|
||
DROP COLUMN IF EXISTS product_domain;
|
||
|
||
DELETE FROM workflow_executor_registry WHERE executor_key = 'software.doc.v1';
|