Files
Agent-System/deploy/postgres/goose/00048_2026-09-16-software-project-bootstrap-fields.sql
T
weichenandCursor d661af71d5 feat(db): SWBOOT-01 additive project type and compliance schema
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>
2026-09-16 15:36:13 +00:00

141 lines
6.9 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- +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';