@team-semicolon/semicolony-cli 4.18.51

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.
Files changed (164) hide show
  1. package/LICENSE +200 -0
  2. package/NOTICE +8 -0
  3. package/README.md +152 -0
  4. package/dist/bundle.js +2887 -0
  5. package/dist/templates/launchd/ai.semicolony.host-signals-sidecar.plist +40 -0
  6. package/migrations/001_initial.sql +280 -0
  7. package/migrations/002_add_indexes.sql +11 -0
  8. package/migrations/003_add_fk.sql +32 -0
  9. package/migrations/004_session_count_trigger.sql +35 -0
  10. package/migrations/005_bot_workspace_audits.sql +16 -0
  11. package/migrations/006_bot_kb_subscriptions.sql +24 -0
  12. package/migrations/007_flatten_skill_names.sql +16 -0
  13. package/migrations/008_bot_workspace_files.sql +14 -0
  14. package/migrations/009_enforce_flat_skill_names.sql +53 -0
  15. package/migrations/010_bot_delegation.sql +27 -0
  16. package/migrations/011_drop_legacy_tables.sql +35 -0
  17. package/migrations/012_drop_bot_knowledge.sql +16 -0
  18. package/migrations/013_kb_workspace_domains.sql +88 -0
  19. package/migrations/014_timestamp_to_timestamptz.sql +33 -0
  20. package/migrations/015_kb_domain_enforcement.sql +83 -0
  21. package/migrations/016_ontology_redesign.sql +108 -0
  22. package/migrations/017_ontology_instance_model.sql +151 -0
  23. package/migrations/018_type_schema.sql +11 -0
  24. package/migrations/019_test_management.sql +69 -0
  25. package/migrations/020_bot_workspace_standard.sql +174 -0
  26. package/migrations/021_drop_dead_tables.sql +8 -0
  27. package/migrations/021_test_declarative.sql +19 -0
  28. package/migrations/022_bot_ontology_type.sql +38 -0
  29. package/migrations/022_kb_schema_enforcement.sql +77 -0
  30. package/migrations/023_decision_key_cleanup.ts +154 -0
  31. package/migrations/024_embedding_backfill.ts +137 -0
  32. package/migrations/025_kb_flat_keys.sql +33 -0
  33. package/migrations/026_drop_session_log.sql +19 -0
  34. package/migrations/027_kb_manager_skill.sql +22 -0
  35. package/migrations/028_skill_definitions_to_semicolony.sql +19 -0
  36. package/migrations/029_agents_citation_max_lines.sql +6 -0
  37. package/migrations/030_team_ontology.sql +54 -0
  38. package/migrations/031_gfp_tables.sql +101 -0
  39. package/migrations/031_kb_manager_domain_register.sql +12 -0
  40. package/migrations/032_gfp_skill_and_callback.sql +40 -0
  41. package/migrations/032_kebab_case_keys.sql +33 -0
  42. package/migrations/033_skill_workspace_rules.sql +10 -0
  43. package/migrations/034_current_to_date_keys.sql +13 -0
  44. package/migrations/034_current_to_date_keys.ts +104 -0
  45. package/migrations/035_bot_budgets.sql +51 -0
  46. package/migrations/036_gfp_stitch_design.sql +35 -0
  47. package/migrations/037_gfp_qa_sections.sql +13 -0
  48. package/migrations/038_gfp_phase_split.sql +26 -0
  49. package/migrations/039_meeting_audio_data.sql +2 -0
  50. package/migrations/040_bot_commitments.sql +68 -0
  51. package/migrations/041_palette_previews.sql +13 -0
  52. package/migrations/042_gfp_parallel_tracks.sql +37 -0
  53. package/migrations/043_blocker_key.sql +13 -0
  54. package/migrations/044_gfp_stitch_screenshots.sql +9 -0
  55. package/migrations/045_service_table_rename_and_projection.sql +150 -0
  56. package/migrations/046_service_ops_tables.sql +75 -0
  57. package/migrations/047_update_gfp_manager_skill.sql +16 -0
  58. package/migrations/048_service_migration_skill.sql +23 -0
  59. package/migrations/049_service_features.sql +39 -0
  60. package/migrations/050_service_kpi_action_items.sql +87 -0
  61. package/migrations/051_update_service_migration_skill_prompt.sql +9 -0
  62. package/migrations/052_feature_iteration_link.sql +11 -0
  63. package/migrations/052_services_table_rename.sql +149 -0
  64. package/migrations/053_feature_discovery.sql +47 -0
  65. package/migrations/054_deploy_verification.sql +17 -0
  66. package/migrations/055_feature_lifecycle.sql +37 -0
  67. package/migrations/056_service_incident_schema.sql +16 -0
  68. package/migrations/057_decision_date_to_metadata.ts +173 -0
  69. package/migrations/058_incubator_kb_schema.sql +8 -0
  70. package/migrations/059_incubator_sessions.sql +29 -0
  71. package/migrations/060_skill_reference_files.sql +8 -0
  72. package/migrations/061_cron_trigger_bridge.sql +7 -0
  73. package/migrations/062_bot_slack_profiles.sql +21 -0
  74. package/migrations/063_rename_gfp_skills.sql +7 -0
  75. package/migrations/064_bot_cost_log.sql +11 -0
  76. package/migrations/065_hub_spoke_orchestration.sql +35 -0
  77. package/migrations/066_cost_log_commitment.sql +9 -0
  78. package/migrations/067_module_ontology_type.sql +44 -0
  79. package/migrations/068_migrate_incubator_data.sql +32 -0
  80. package/migrations/069_action_items_sot.sql +156 -0
  81. package/migrations/069_cost_log_tokens.sql +45 -0
  82. package/migrations/070_services_sot_columns.sql +78 -0
  83. package/migrations/071_cleanup_deprecated_service_kb.sql +38 -0
  84. package/migrations/072_incubator_heartbeat.sql +12 -0
  85. package/migrations/072_service_role_schema.sql +57 -0
  86. package/migrations/073_service_type_and_platform.sql +8 -0
  87. package/migrations/074_schema_ref_type.sql +16 -0
  88. package/migrations/075_routing_delegation.sql +34 -0
  89. package/migrations/076_meeting_service_link.sql +5 -0
  90. package/migrations/077_agents_ontology_type.sql +93 -0
  91. package/migrations/078_incubator_agent.sql +45 -0
  92. package/migrations/079_drop_audio_blob_url.sql +4 -0
  93. package/migrations/080_kb_metadata_indexing.sql +9 -0
  94. package/migrations/081_person_unification.sql +41 -0
  95. package/migrations/082_discord_channel.sql +3 -0
  96. package/migrations/084_deprecate_kpi_metrics_table.sql +5 -0
  97. package/migrations/085_meeting_target_domain.sql +37 -0
  98. package/migrations/086_skill_routing_new_skills.sql +23 -0
  99. package/migrations/087_skill_routing_second_opinion.sql +8 -0
  100. package/migrations/088_meeting_notion_sync.sql +10 -0
  101. package/migrations/089_bot_commitments_dedup.sql +17 -0
  102. package/migrations/090_incubator_discord_guild.sql +8 -0
  103. package/migrations/091_drop_deprecated_gfp_kpi_views.sql +65 -0
  104. package/migrations/092_ontology_channel_mapping.sql +28 -0
  105. package/migrations/093_update_bot_workspace_paths.sql +15 -0
  106. package/migrations/094_cron_run_tracking.sql +28 -0
  107. package/migrations/095_drop_bot_cron_runs.sql +7 -0
  108. package/migrations/096_kb_pipeline_keys.sql +66 -0
  109. package/migrations/097_drop_empty_service_tables.sql +83 -0
  110. package/migrations/098_migrate_features_materials_drop.sql +119 -0
  111. package/migrations/099_migrate_sections_drop.sql +52 -0
  112. package/migrations/099_seed_cron_poller_tick.sql +14 -0
  113. package/migrations/100_migrate_services_drop.sql +57 -0
  114. package/migrations/101_drop_services.sql +5 -0
  115. package/migrations/102_cost_log_session_dedup.sql +13 -0
  116. package/migrations/103_board.sql +57 -0
  117. package/migrations/104_agent_factory.sql +284 -0
  118. package/migrations/105_kb_notify.sql +44 -0
  119. package/migrations/106_office_id_agents_commands.sql +73 -0
  120. package/migrations/107_agent_service_credentials.sql +79 -0
  121. package/migrations/108_drop_l2_ontology_seeds.sql +16 -0
  122. package/migrations/109_generic_ontology_descriptions.sql +21 -0
  123. package/migrations/110_kb_manager_skill_l2_cleanup.sql +34 -0
  124. package/migrations/111_drop_l2_team_ontology_seeds.sql +20 -0
  125. package/migrations/112_fix_pipeline_schema_and_role_trigger.sql +83 -0
  126. package/migrations/113_kb_history.sql +53 -0
  127. package/migrations/114_runtime_target_columns.sql +26 -0
  128. package/migrations/115_runtime_source_columns.sql +52 -0
  129. package/migrations/116_commitment_pattern_health.sql +81 -0
  130. package/migrations/117_commitment_pattern_alert_claims.sql +33 -0
  131. package/migrations/118_retire_semiclaw_semicolonybot_alias.sql +30 -0
  132. package/migrations/119_commitment_events.sql +51 -0
  133. package/migrations/120_host_signals.sql +51 -0
  134. package/migrations/121_agent_spec_derived_runtime_metadata.sql +68 -0
  135. package/migrations/122_agent_spec_derived_fk_policy.sql +18 -0
  136. package/migrations/123_agent_spec_projection_skip_targets.sql +24 -0
  137. package/migrations/124_bot_commitments_notify.sql +26 -0
  138. package/migrations/125_agent_personas.sql +36 -0
  139. package/migrations/128_entity_relations.sql +125 -0
  140. package/migrations/129_kb_multitenant_gateway.sql +86 -0
  141. package/migrations/130_jewelry_relation_types.sql +36 -0
  142. package/migrations/131_concierge_requests.sql +38 -0
  143. package/migrations/132_kb_supersession.sql +27 -0
  144. package/migrations/133_kb_claims.sql +52 -0
  145. package/migrations/134_migration_registry.sql +18 -0
  146. package/migrations/135_sc_roles.sql +102 -0
  147. package/migrations/136_runtime_tenant_columns.sql +71 -0
  148. package/migrations/137_runtime_backfill_team_semicolon.sql +131 -0
  149. package/migrations/138_runtime_constraints_not_valid.sql +56 -0
  150. package/migrations/139_tenant_vms.sql +31 -0
  151. package/migrations/140_fleet_slots.sql +23 -0
  152. package/migrations/141_provisioning_jobs.sql +29 -0
  153. package/migrations/142_rls_enable_semicolony.sql +129 -0
  154. package/migrations/143_rls_enable_public.sql +54 -0
  155. package/migrations/144_worker_device_registry.sql +211 -0
  156. package/migrations/145_workspace_profile_workstation_policy.sql +39 -0
  157. package/migrations/146_worker_profile_repo_scope.sql +24 -0
  158. package/migrations/147_worker_profile_semo_ops_repo_rename.sql +18 -0
  159. package/migrations/148_momo_runtime_convergence.sql +92 -0
  160. package/migrations/README.md +88 -0
  161. package/migrations-sqlite/kb/001_initial.sql +56 -0
  162. package/migrations-sqlite/ops/001_initial.sql +53 -0
  163. package/migrations-sqlite/ops/002_action_items.sql +48 -0
  164. package/package.json +78 -0
@@ -0,0 +1,37 @@
1
+ -- 042: GFP Parallel Tracks — SemiClaw 시작점 + InfraClaw 병렬 트랙
2
+ -- Track A (plan): PlanClaw Phase 1-9
3
+ -- Track B (infra): InfraClaw Phase 0-2
4
+
5
+ -- gfp_phase_sections에 track 컬럼 추가
6
+ ALTER TABLE semicolony.gfp_phase_sections
7
+ ADD COLUMN track VARCHAR(10) NOT NULL DEFAULT 'plan';
8
+
9
+ -- UNIQUE 제약조건 변경: track 포함
10
+ ALTER TABLE semicolony.gfp_phase_sections
11
+ DROP CONSTRAINT gfp_phase_sections_gfp_id_phase_section_key_key;
12
+ ALTER TABLE semicolony.gfp_phase_sections
13
+ ADD CONSTRAINT gfp_phase_sections_gfp_id_track_phase_section_key_key
14
+ UNIQUE(gfp_id, track, phase, section_key);
15
+
16
+ -- gfp_projects에 infra_phase 컬럼 추가
17
+ ALTER TABLE semicolony.gfp_projects
18
+ ADD COLUMN infra_phase SMALLINT DEFAULT NULL;
19
+
20
+ -- 인프라 요구사항 테이블
21
+ CREATE TABLE semicolony.gfp_infra_requests (
22
+ request_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
23
+ gfp_id UUID NOT NULL REFERENCES semicolony.gfp_projects(gfp_id) ON DELETE CASCADE,
24
+ source_phase SMALLINT NOT NULL,
25
+ source_section_id UUID REFERENCES semicolony.gfp_phase_sections(section_id),
26
+ category VARCHAR(50) NOT NULL,
27
+ title VARCHAR(200) NOT NULL,
28
+ description TEXT,
29
+ priority VARCHAR(10) NOT NULL DEFAULT 'normal',
30
+ status VARCHAR(20) NOT NULL DEFAULT 'pending',
31
+ slack_thread_ts VARCHAR(50),
32
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
33
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
34
+ );
35
+
36
+ CREATE INDEX idx_gfp_infra_requests_project
37
+ ON semicolony.gfp_infra_requests(gfp_id, status);
@@ -0,0 +1,13 @@
1
+ -- 043_blocker_key.sql
2
+ -- service 타입에 blocker collection 키 추가
3
+ -- 블로커 추적: 상태(active/resolved), 시작일, 해결일, 담당자, 출처
4
+ -- sub_key 패턴: blocker/{YYYY-MM-DD}/{slug}
5
+
6
+ INSERT INTO semicolony.kb_type_schema
7
+ (type_key, scheme_key, scheme_description, required, value_hint, sort_order, key_type)
8
+ VALUES
9
+ ('service', 'blocker', '블로커 추적 (active/resolved 상태, 시작일/해결일 관리)',
10
+ false,
11
+ 'blocker/{YYYY-MM-DD}/{slug}',
12
+ 200, 'collection')
13
+ ON CONFLICT (type_key, scheme_key) DO NOTHING;
@@ -0,0 +1,9 @@
1
+ -- 044: GFP Stitch screenshot storage
2
+ -- Stitch SDK에서 생성된 스크린샷 base64 데이터 + 공유 URL 저장
3
+
4
+ ALTER TABLE semicolony.gfp_materials
5
+ ADD COLUMN IF NOT EXISTS screenshot_data TEXT,
6
+ ADD COLUMN IF NOT EXISTS stitch_share_url VARCHAR(500);
7
+
8
+ COMMENT ON COLUMN semicolony.gfp_materials.screenshot_data IS 'Base64-encoded PNG screenshot from Stitch getImage()';
9
+ COMMENT ON COLUMN semicolony.gfp_materials.stitch_share_url IS 'Public shareable URL from Stitch getShareUrl()';
@@ -0,0 +1,150 @@
1
+ -- 045: GFP → Service 테이블 리네이밍 + Projection Key 시스템
2
+ --
3
+ -- 변경 사항:
4
+ -- A. gfp_* 테이블 → service_* 리네이밍
5
+ -- B. 제약조건 / 인덱스 / 트리거 리네이밍
6
+ -- C. 하위 호환 VIEW (gfp_* → service_*)
7
+ -- D. service_domain → ontology.domain FK 연계 (기존 데이터 정합성 보장)
8
+ -- E. kb_type_schema에 source 컬럼 + projection 키 등록
9
+ -- F. lifecycle / launched_at 컬럼 추가
10
+ --
11
+ -- PK 컬럼명 gfp_id는 이 마이그레이션에서 유지 (코드 변경 최소화).
12
+ -- 후속 마이그레이션에서 project_id로 rename 가능.
13
+ --
14
+ -- 선행 조건: 044_gfp_stitch_screenshots.sql 적용 완료
15
+
16
+ BEGIN;
17
+
18
+ -- ============================================================
19
+ -- A. 테이블 리네이밍
20
+ -- ============================================================
21
+
22
+ ALTER TABLE semicolony.gfp_projects RENAME TO service_projects;
23
+ ALTER TABLE semicolony.gfp_phase_sections RENAME TO service_sections;
24
+ ALTER TABLE semicolony.gfp_materials RENAME TO service_materials;
25
+ ALTER TABLE semicolony.gfp_research_tasks RENAME TO service_research_tasks;
26
+ ALTER TABLE semicolony.gfp_infra_requests RENAME TO service_infra_requests;
27
+
28
+ -- ============================================================
29
+ -- B. 제약조건 / 인덱스 / 트리거 리네이밍
30
+ -- ============================================================
31
+
32
+ -- B-1. UNIQUE 제약조건
33
+ ALTER TABLE semicolony.service_sections
34
+ RENAME CONSTRAINT gfp_phase_sections_gfp_id_track_phase_section_key_key
35
+ TO service_sections_gfp_id_track_phase_section_key_key;
36
+
37
+ -- B-2. FK 제약조건
38
+ ALTER TABLE semicolony.service_sections
39
+ RENAME CONSTRAINT gfp_phase_sections_gfp_id_fkey
40
+ TO service_sections_project_fkey;
41
+
42
+ ALTER TABLE semicolony.service_materials
43
+ RENAME CONSTRAINT gfp_materials_gfp_id_fkey
44
+ TO service_materials_project_fkey;
45
+
46
+ ALTER TABLE semicolony.service_research_tasks
47
+ RENAME CONSTRAINT gfp_research_tasks_gfp_id_fkey
48
+ TO service_research_tasks_project_fkey;
49
+
50
+ ALTER TABLE semicolony.service_infra_requests
51
+ RENAME CONSTRAINT gfp_infra_requests_gfp_id_fkey
52
+ TO service_infra_requests_project_fkey;
53
+
54
+ ALTER TABLE semicolony.service_infra_requests
55
+ RENAME CONSTRAINT gfp_infra_requests_source_section_id_fkey
56
+ TO service_infra_requests_section_fkey;
57
+
58
+ -- B-3. 인덱스
59
+ ALTER INDEX semicolony.idx_gfp_sections_project
60
+ RENAME TO idx_service_sections_project;
61
+
62
+ ALTER INDEX semicolony.idx_gfp_infra_requests_project
63
+ RENAME TO idx_service_infra_requests_project;
64
+
65
+ -- B-4. 트리거
66
+ ALTER TRIGGER trg_gfp_projects_updated ON semicolony.service_projects
67
+ RENAME TO trg_service_projects_updated;
68
+
69
+ ALTER TRIGGER trg_gfp_sections_updated ON semicolony.service_sections
70
+ RENAME TO trg_service_sections_updated;
71
+
72
+ ALTER TRIGGER trg_gfp_research_updated ON semicolony.service_research_tasks
73
+ RENAME TO trg_service_research_tasks_updated;
74
+
75
+ -- B-5. 트리거 함수 리네이밍
76
+ ALTER FUNCTION semicolony.gfp_set_updated_at() RENAME TO service_set_updated_at;
77
+
78
+ -- ============================================================
79
+ -- C. 하위 호환 VIEW (전환 기간 2주 후 제거 예정)
80
+ -- ============================================================
81
+
82
+ CREATE VIEW semicolony.gfp_projects AS SELECT * FROM semicolony.service_projects;
83
+ CREATE VIEW semicolony.gfp_phase_sections AS SELECT * FROM semicolony.service_sections;
84
+ CREATE VIEW semicolony.gfp_materials AS SELECT * FROM semicolony.service_materials;
85
+ CREATE VIEW semicolony.gfp_research_tasks AS SELECT * FROM semicolony.service_research_tasks;
86
+ CREATE VIEW semicolony.gfp_infra_requests AS SELECT * FROM semicolony.service_infra_requests;
87
+
88
+ -- ============================================================
89
+ -- D. service_domain → ontology FK 연계
90
+ -- ============================================================
91
+
92
+ -- D-1. 기존 데이터 정합성 보장:
93
+ -- service_domain이 NOT NULL인데 ontology에 없는 경우 자동 등록
94
+ INSERT INTO semicolony.ontology (domain, entity_type, service, schema, description, tags)
95
+ SELECT DISTINCT
96
+ sp.service_domain,
97
+ 'service',
98
+ sp.service_domain,
99
+ '{}'::jsonb,
100
+ sp.project_name || ' (auto-registered by migration 045)',
101
+ ARRAY['gfp-migrated']
102
+ FROM semicolony.service_projects sp
103
+ WHERE sp.service_domain IS NOT NULL
104
+ AND NOT EXISTS (
105
+ SELECT 1 FROM semicolony.ontology o WHERE o.domain = sp.service_domain
106
+ );
107
+
108
+ -- D-2. FK 추가 (NULL 허용 — service_domain이 nullable)
109
+ ALTER TABLE semicolony.service_projects
110
+ ADD CONSTRAINT service_projects_ontology_domain_fkey
111
+ FOREIGN KEY (service_domain) REFERENCES semicolony.ontology(domain);
112
+
113
+ -- ============================================================
114
+ -- E. kb_type_schema — source 컬럼 + projection 키 등록
115
+ -- ============================================================
116
+
117
+ -- E-1. source 컬럼 추가
118
+ ALTER TABLE semicolony.kb_type_schema
119
+ ADD COLUMN IF NOT EXISTS source VARCHAR(20) NOT NULL DEFAULT 'manual';
120
+
121
+ -- E-2. service 타입에 projection 키 등록
122
+ INSERT INTO semicolony.kb_type_schema
123
+ (type_key, scheme_key, scheme_description, required, value_hint, sort_order, key_type, source)
124
+ VALUES
125
+ ('service', 'spec', 'PM 파이프라인 스펙 산출물 (자동 동기화)', false, 'spec/discovery, spec/prd, spec/design-system', 20, 'collection', 'projection'),
126
+ ('service', 'pm-status', '프로젝트 진행 상태 (자동 동기화)', false, NULL, 21, 'singleton', 'projection'),
127
+ ('service', 'infra-status', '인프라 트랙 진행 상태 (자동 동기화)', false, NULL, 22, 'singleton', 'projection'),
128
+ ('service', 'pm-summary', '프로젝트 라이프사이클 요약 (자동 동기화)', false, NULL, 23, 'singleton', 'projection'),
129
+ ('service', 'gfp-id', '(레거시) 프로젝트 ID 참조 — pm-status로 통합 예정', false, NULL, 24, 'singleton', 'projection'),
130
+ ('service', 'gfp-status', '(레거시) 진행 상태 — pm-status로 통합 예정', false, NULL, 25, 'singleton', 'projection')
131
+ ON CONFLICT (type_key, scheme_key) DO UPDATE SET
132
+ source = EXCLUDED.source,
133
+ key_type = EXCLUDED.key_type,
134
+ scheme_description = EXCLUDED.scheme_description,
135
+ sort_order = EXCLUDED.sort_order;
136
+
137
+ -- ============================================================
138
+ -- F. lifecycle / launched_at 컬럼
139
+ -- ============================================================
140
+
141
+ ALTER TABLE semicolony.service_projects
142
+ ADD COLUMN IF NOT EXISTS lifecycle VARCHAR(20) NOT NULL DEFAULT 'build',
143
+ ADD COLUMN IF NOT EXISTS launched_at TIMESTAMPTZ;
144
+
145
+ -- 완료된 프로젝트는 lifecycle = 'ops'로 마이그레이션
146
+ UPDATE semicolony.service_projects
147
+ SET lifecycle = 'ops', launched_at = updated_at
148
+ WHERE status = 'completed';
149
+
150
+ COMMIT;
@@ -0,0 +1,75 @@
1
+ -- 046: Service Ops Phase Tables — 운영 라이프사이클 확장
2
+ --
3
+ -- build → ops → sunset 전환을 위한 이터레이션/인시던트 테이블.
4
+ -- service_sections.iteration_id로 build/ops phase 섹션을 구분.
5
+ --
6
+ -- 선행 조건: 045_service_table_rename_and_projection.sql 적용 완료
7
+
8
+ BEGIN;
9
+
10
+ -- ============================================================
11
+ -- 1. service_iterations — 운영 이터레이션 사이클
12
+ -- ============================================================
13
+
14
+ CREATE TABLE IF NOT EXISTS semicolony.service_iterations (
15
+ iteration_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
16
+ project_id UUID NOT NULL REFERENCES semicolony.service_projects(gfp_id) ON DELETE CASCADE,
17
+ title VARCHAR(200) NOT NULL,
18
+ goal TEXT,
19
+ status VARCHAR(20) NOT NULL DEFAULT 'planned',
20
+ started_at TIMESTAMPTZ,
21
+ completed_at TIMESTAMPTZ,
22
+ retrospective TEXT,
23
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
24
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
25
+ );
26
+
27
+ -- status: planned | active | completed
28
+ CREATE INDEX idx_service_iterations_project
29
+ ON semicolony.service_iterations(project_id, status);
30
+
31
+ -- updated_at 트리거 연결
32
+ CREATE TRIGGER trg_service_iterations_updated
33
+ BEFORE UPDATE ON semicolony.service_iterations
34
+ FOR EACH ROW EXECUTE FUNCTION semicolony.service_set_updated_at();
35
+
36
+ -- ============================================================
37
+ -- 2. service_incidents — 운영 인시던트
38
+ -- ============================================================
39
+
40
+ CREATE TABLE IF NOT EXISTS semicolony.service_incidents (
41
+ incident_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
42
+ project_id UUID NOT NULL REFERENCES semicolony.service_projects(gfp_id) ON DELETE CASCADE,
43
+ iteration_id UUID REFERENCES semicolony.service_iterations(iteration_id),
44
+ severity VARCHAR(10) NOT NULL DEFAULT 'medium',
45
+ title VARCHAR(200) NOT NULL,
46
+ description TEXT,
47
+ root_cause TEXT,
48
+ resolution TEXT,
49
+ status VARCHAR(20) NOT NULL DEFAULT 'open',
50
+ occurred_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
51
+ resolved_at TIMESTAMPTZ,
52
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
53
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
54
+ );
55
+
56
+ -- severity: low | medium | high | critical
57
+ -- status: open | investigating | resolved | postmortem
58
+ CREATE INDEX idx_service_incidents_project
59
+ ON semicolony.service_incidents(project_id, status);
60
+
61
+ CREATE TRIGGER trg_service_incidents_updated
62
+ BEFORE UPDATE ON semicolony.service_incidents
63
+ FOR EACH ROW EXECUTE FUNCTION semicolony.service_set_updated_at();
64
+
65
+ -- ============================================================
66
+ -- 3. service_sections.iteration_id — ops phase 섹션 연결
67
+ -- ============================================================
68
+
69
+ ALTER TABLE semicolony.service_sections
70
+ ADD COLUMN IF NOT EXISTS iteration_id UUID REFERENCES semicolony.service_iterations(iteration_id);
71
+
72
+ -- iteration_id IS NULL = build phase 섹션 (기존 동작 유지)
73
+ -- iteration_id IS NOT NULL = ops phase 작업 항목
74
+
75
+ COMMIT;
@@ -0,0 +1,16 @@
1
+ -- 047: gfp-manager 스킬 → service-project-manager 리프레이밍
2
+ --
3
+ -- GFP는 이제 "프로젝트 관리 시스템"이 아니라 "신규 서비스를 띄우는 파이프라인".
4
+ -- service_* 테이블이 모든 서비스의 SoT.
5
+ -- 스킬 프롬프트를 이 맥락으로 업데이트.
6
+ --
7
+ -- 선행 조건: 045_service_table_rename_and_projection.sql 적용 완료
8
+
9
+ UPDATE semicolony.skill_definitions
10
+ SET
11
+ display_name = 'Service Project Manager',
12
+ description = '서비스 프로젝트 관리 — service_* 테이블 CRUD. GFP(신규 서비스 파이프라인) + 기존 서비스 운영 공통.',
13
+ prompt = E'---\nname: service-project-manager\ndescription: 서비스 프로젝트 관리 — service_* 테이블 CRUD, 섹션 생성/수정, 리서치 결과 반영.\n---\n\n# Service Project Manager\n\nservice_* 테이블(구 gfp_*)의 프로젝트/섹션/리서치 관리 스킬.\n봇(PlanClaw, DesignClaw, GrowthClaw, InfraClaw 등)이 대시보드 API를 통해 접근.\n\n## 핵심 개념\n\n- **service_projects**: 모든 서비스의 메타데이터 (lifecycle: build → ops → sunset)\n- **GFP Pipeline**: 신규 서비스를 service_projects에 등록하고 Phase 0~9를 진행하는 파이프라인\n- **Projection Key**: KB의 spec/*, pm-status 등은 파이프라인이 자동 동기화 — 봇이 직접 쓰면 CLI가 거부\n\n## API Endpoints\n\nBase URL: `${SEMICOLONY_DASHBOARD_URL}` (default: http://localhost:3000)\n\n### 프로젝트 조회\n```bash\n# 프로젝트 목록\ncurl -s ${SEMICOLONY_DASHBOARD_URL}/api/gfp | jq\n\n# 프로젝트 상세 (progress 포함)\ncurl -s ${SEMICOLONY_DASHBOARD_URL}/api/gfp/{gfp_id} | jq\n```\n\n### 섹션 조회/수정\n```bash\n# 섹션 목록 (페이즈별, 트랙별)\ncurl -s \"${SEMICOLONY_DASHBOARD_URL}/api/gfp/{gfp_id}/sections?phase=1&track=plan\" | jq\n\n# 섹션 생성/수정 (upsert)\ncurl -X POST ${SEMICOLONY_DASHBOARD_URL}/api/gfp/{gfp_id}/sections \\\n -H \"Content-Type: application/json\" \\\n -d ''{ \"phase\": 1, \"section_key\": \"overview\", \"title\": \"Overview\", \"content\": \"...\", \"status\": \"pending-review\", \"source\": \"planclaw\" }''\n\n# 섹션 내용 업데이트\ncurl -X PATCH ${SEMICOLONY_DASHBOARD_URL}/api/gfp/{gfp_id}/sections \\\n -H \"Content-Type: application/json\" \\\n -d ''{ \"section_id\": \"...\", \"action\": \"update-content\", \"content\": \"수정된 내용\", \"status\": \"pending-review\" }''\n```\n\n### 봇 콜백 (결과 반영)\n```bash\n# PlanClaw: 재생성 결과\ncurl -X POST ${SEMICOLONY_DASHBOARD_URL}/api/gfp/callback \\\n -H \"Content-Type: application/json\" \\\n -d ''{ \"type\": \"section-regeneration\", \"section_id\": \"...\", \"content\": \"...\", \"bot_id\": \"planclaw\" }''\n\n# GrowthClaw: 리서치 결과\ncurl -X POST ${SEMICOLONY_DASHBOARD_URL}/api/gfp/callback \\\n -H \"Content-Type: application/json\" \\\n -d ''{ \"type\": \"research-result\", \"task_id\": \"...\", \"result\": \"...\", \"bot_id\": \"growthclaw\" }''\n\n# DesignClaw: Stitch 디자인 결과\ncurl -X POST ${SEMICOLONY_DASHBOARD_URL}/api/gfp/callback \\\n -H \"Content-Type: application/json\" \\\n -d ''{ \"type\": \"stitch-export\", \"gfp_id\": \"...\", \"content\": \"...\", \"bot_id\": \"designclaw\" }''\n```\n\n### 인프라 요청 (Track B)\n```bash\n# 인프라 요구사항 생성\ncurl -X POST ${SEMICOLONY_DASHBOARD_URL}/api/gfp/{gfp_id}/infra-requests \\\n -H \"Content-Type: application/json\" \\\n -d ''{ \"source_phase\": 2, \"category\": \"oauth\", \"title\": \"OAuth 설정 필요\" }''\n```\n\n## Data Routing 규칙\n\n| 데이터 | 쓰기 대상 | 금지 |\n|--------|-----------|------|\n| 섹션 콘텐츠 | PM API (이 스킬) | KB spec/* 직접 쓰기 ✗ |\n| 서비스 메타데이터 | KB (`semicolony kb upsert`) | PM 테이블 직접 수정 ✗ |\n| 진행 상태 | (자동) pm-pipeline | 봇이 pm-status 직접 쓰기 ✗ |\n\n## 규칙\n- 섹션 수정 시 status를 반드시 \"pending-review\"로 설정\n- source 필드로 출처 명시: planclaw / growthclaw / designclaw / infraclaw / imported / manual\n- 콜백 API 사용 시 bot_id 필수\n- **Projection Key 쓰기 금지**: spec/*, pm-status, gfp-status, infra-status는 파이프라인이 자동 관리\n',
14
+ metadata = '{"bot_ids": ["planclaw", "growthclaw", "designclaw", "infraclaw"]}',
15
+ version = '2.0'
16
+ WHERE name = 'gfp-manager';
@@ -0,0 +1,23 @@
1
+ -- 048: service-migration 스킬 등록
2
+ --
3
+ -- 기존 운영 서비스를 service_projects 테이블에 이식하는 스킬.
4
+ -- SemiClaw가 Slack에서 트리거하거나 CLI에서 직접 실행.
5
+
6
+ INSERT INTO semicolony.skill_definitions (name, display_name, description, prompt, package, is_active, metadata, version)
7
+ VALUES (
8
+ 'service-migration',
9
+ 'Service Migration',
10
+ '기존 운영 서비스를 service_projects 테이블에 이식. KB 엔트리 감사(audit) + 자동 매핑.',
11
+ E'---\nname: service-migration\ndescription: 기존 운영 서비스를 service_projects 테이블에 이식\n---\n\n# Service Migration\n\n기존 운영 서비스를 `service_projects` 테이블에 등록하는 스킬.\nGFP(신규 서비스 파이프라인)를 거치지 않은 서비스를 경량 온보딩.\n\n## 트리거\n- \"기존 서비스 등록해줘 {domain}\"\n- \"미등록 서비스 전체 등록해줘\"\n- \"서비스 목록 보여줘\"\n\n## CLI 실행\n```bash\n# 단일 서비스 이식\nsemicolony service migrate --domain {domain}\n\n# 미등록 전체 일괄 이식\nsemicolony service migrate --all\n\n# 미리보기 (DB 변경 없음)\nsemicolony service migrate --all --dry-run\n\n# 서비스 목록 (등록/미등록)\nsemicolony service list\n```\n\n## 이식 흐름\n1. KB에서 base-information, po, status, tech-stack 등 자동 수집\n2. KB status → lifecycle+status 매핑 (active→ops, hold→paused, deprecated→sunset)\n3. service_projects INSERT (lifecycle=''ops'')\n4. pm-summary projection key 자동 생성\n5. 감사(audit) 리포트 출력\n\n## 감사 리포트 해석\n- **mapped**: service_projects 컬럼에 매핑된 KB 엔트리\n- **metadata**: JSONB에 저장된 추가 정보 (repo, slack-channel 등)\n- **kb-only**: KB에만 존재하는 정상 엔트리 (kpi, milestone 등)\n- **warnings**: 비표준 키 → kb_type_schema 등록 제안\n- **missingRequired**: 필수 키 누락 → 사용자에게 보완 요청\n\n## Data Routing\n- service_projects 테이블 = 실행 상태 SoT\n- KB = 서비스 참조 지식 SoT\n- projection key (spec/*, pm-status 등)는 파이프라인만 쓰기 가능\n',
12
+ 'core',
13
+ true,
14
+ '{"bot_ids": ["semiclaw"]}',
15
+ '1.0'
16
+ )
17
+ ON CONFLICT (name, office_id) DO UPDATE SET
18
+ prompt = EXCLUDED.prompt,
19
+ display_name = EXCLUDED.display_name,
20
+ description = EXCLUDED.description,
21
+ version = EXCLUDED.version,
22
+ metadata = EXCLUDED.metadata,
23
+ is_active = true;
@@ -0,0 +1,39 @@
1
+ -- 049: service_features — 서비스 기능 관리 테이블
2
+ --
3
+ -- 운영 중인 서비스의 기능 목록을 DB 기반으로 관리.
4
+ -- 계층 구조(parent_id), 카테고리별 분류, 기능 개선 → GitHub Issue 연동.
5
+ --
6
+ -- 선행 조건: 045_service_table_rename_and_projection.sql
7
+
8
+ BEGIN;
9
+
10
+ CREATE TABLE IF NOT EXISTS semicolony.service_features (
11
+ feature_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
12
+ project_id UUID NOT NULL REFERENCES semicolony.service_projects(gfp_id) ON DELETE CASCADE,
13
+ name VARCHAR(200) NOT NULL,
14
+ description TEXT,
15
+ category VARCHAR(50) NOT NULL DEFAULT 'core',
16
+ status VARCHAR(20) NOT NULL DEFAULT 'active',
17
+ parent_id UUID REFERENCES semicolony.service_features(feature_id) ON DELETE SET NULL,
18
+ sort_order SMALLINT NOT NULL DEFAULT 0,
19
+ metadata JSONB DEFAULT '{}',
20
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
21
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
22
+ );
23
+
24
+ -- category: core | growth | infra | ux | integration
25
+ -- status: active | planned | in-dev | deprecated
26
+ -- metadata: { endpoints: [], github_issue_url, tech_notes }
27
+
28
+ CREATE INDEX idx_service_features_project
29
+ ON semicolony.service_features(project_id, category, sort_order);
30
+
31
+ CREATE INDEX idx_service_features_parent
32
+ ON semicolony.service_features(parent_id)
33
+ WHERE parent_id IS NOT NULL;
34
+
35
+ CREATE TRIGGER trg_service_features_updated
36
+ BEFORE UPDATE ON semicolony.service_features
37
+ FOR EACH ROW EXECUTE FUNCTION semicolony.service_set_updated_at();
38
+
39
+ COMMIT;
@@ -0,0 +1,87 @@
1
+ -- 050: service_kpi_metrics & service_action_items
2
+ --
3
+ -- KPI 지표와 액션 아이템을 개별 레코드로 관리.
4
+ -- KB markdown blob → DB 구조화 레코드 전환.
5
+ --
6
+ -- 선행 조건: 046_service_ops_tables.sql (iterations, incidents)
7
+
8
+ BEGIN;
9
+
10
+ -- ============================================================
11
+ -- 1. service_kpi_metrics — 개별 KPI 지표 레코드
12
+ -- ============================================================
13
+
14
+ CREATE TABLE IF NOT EXISTS semicolony.service_kpi_metrics (
15
+ metric_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
16
+ project_id UUID NOT NULL REFERENCES semicolony.service_projects(gfp_id) ON DELETE CASCADE,
17
+ iteration_id UUID REFERENCES semicolony.service_iterations(iteration_id),
18
+ period DATE NOT NULL,
19
+ metric_name VARCHAR(100) NOT NULL,
20
+ metric_label VARCHAR(200),
21
+ category VARCHAR(50) NOT NULL DEFAULT 'common',
22
+ current_value NUMERIC,
23
+ baseline_value NUMERIC,
24
+ target_value NUMERIC,
25
+ unit VARCHAR(30),
26
+ wow_change NUMERIC,
27
+ signal VARCHAR(10) NOT NULL DEFAULT 'neutral',
28
+ achieved BOOLEAN DEFAULT FALSE,
29
+ source VARCHAR(50) DEFAULT 'bot',
30
+ metadata JSONB DEFAULT '{}',
31
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
32
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
33
+ );
34
+
35
+ -- category: common | service-specific | search | engagement
36
+ -- signal: green | yellow | red | neutral
37
+ -- source: bot | manual | api | import
38
+
39
+ CREATE INDEX idx_service_kpi_metrics_project_period
40
+ ON semicolony.service_kpi_metrics(project_id, period DESC);
41
+
42
+ CREATE INDEX idx_service_kpi_metrics_lookup
43
+ ON semicolony.service_kpi_metrics(project_id, metric_name, period DESC);
44
+
45
+ CREATE TRIGGER trg_service_kpi_metrics_updated
46
+ BEFORE UPDATE ON semicolony.service_kpi_metrics
47
+ FOR EACH ROW EXECUTE FUNCTION semicolony.service_set_updated_at();
48
+
49
+ -- ============================================================
50
+ -- 2. service_action_items — 개별 액션 아이템 레코드
51
+ -- ============================================================
52
+
53
+ CREATE TABLE IF NOT EXISTS semicolony.service_action_items (
54
+ action_item_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
55
+ project_id UUID NOT NULL REFERENCES semicolony.service_projects(gfp_id) ON DELETE CASCADE,
56
+ iteration_id UUID REFERENCES semicolony.service_iterations(iteration_id),
57
+ description TEXT NOT NULL,
58
+ assignee VARCHAR(100),
59
+ deadline DATE,
60
+ status VARCHAR(20) NOT NULL DEFAULT 'open',
61
+ priority VARCHAR(10) NOT NULL DEFAULT 'normal',
62
+ category VARCHAR(50),
63
+ source VARCHAR(50) DEFAULT 'manual',
64
+ related_url TEXT,
65
+ sort_order SMALLINT NOT NULL DEFAULT 0,
66
+ completed_at TIMESTAMPTZ,
67
+ metadata JSONB DEFAULT '{}',
68
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
69
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
70
+ );
71
+
72
+ -- status: open | completed | cancelled
73
+ -- priority: low | normal | high | urgent
74
+ -- source: manual | bot | dashboard | import
75
+
76
+ CREATE INDEX idx_service_action_items_project_status
77
+ ON semicolony.service_action_items(project_id, status);
78
+
79
+ CREATE INDEX idx_service_action_items_assignee
80
+ ON semicolony.service_action_items(assignee, status)
81
+ WHERE assignee IS NOT NULL;
82
+
83
+ CREATE TRIGGER trg_service_action_items_updated
84
+ BEFORE UPDATE ON semicolony.service_action_items
85
+ FOR EACH ROW EXECUTE FUNCTION semicolony.service_set_updated_at();
86
+
87
+ COMMIT;
@@ -0,0 +1,9 @@
1
+ -- 051: service-migration 스킬 프롬프트 강화
2
+ --
3
+ -- 문제: 봇이 KB 엔트리만 보고 "이미 등록됨"으로 판단 → 실제 service_projects 미등록 서비스를 놓침
4
+ -- 해결: CLI 실행 필수 지시 + KB ≠ 등록 경고 + 판단 기준 명확화
5
+
6
+ UPDATE semicolony.skill_definitions
7
+ SET prompt = E'---\nname: service-migration\ndescription: 기존 운영 서비스를 service_projects 테이블에 이식\n---\n\n# Service Migration\n\n기존 운영 서비스를 `service_projects` 테이블에 등록하는 스킬.\nGFP(신규 서비스 파이프라인)를 거치지 않은 서비스를 경량 온보딩.\n\n## ⚠️ 핵심 원칙 (NON-NEGOTIABLE)\n\n1. **\"등록됨\" = `service_projects` 테이블에 행이 있는 것**. KB 엔트리가 있다고 등록된 것이 아님.\n2. **판단 금지**: KB를 조회해서 자체적으로 등록 여부를 판단하지 마라.\n3. **반드시 CLI 실행**: 아래 CLI 명령을 직접 실행하고, 그 결과로 응답하라.\n\n## 트리거\n- \"기존 서비스 등록해줘 {domain}\"\n- \"미등록 서비스 전체 등록해줘\"\n- \"서비스 목록 보여줘\"\n\n## 실행 방법 (반드시 CLI 실행)\n\n### 단일 서비스 이식\n```bash\nsemicolony service migrate --domain {domain}\n```\nCLI가 내부적으로: service_projects 중복 체크 → KB audit → INSERT → pm-summary 생성\n\n### 미등록 전체 일괄 이식\n```bash\nsemicolony service migrate --all\n```\n\n### 미리보기 (DB 변경 없음)\n```bash\nsemicolony service migrate --all --dry-run\n```\n\n### 서비스 목록 (등록/미등록 확인)\n```bash\nsemicolony service list\n```\n\n## 올바른 워크플로우\n1. 사용자가 \"기존 서비스 등록해줘 {domain}\" 요청\n2. `semicolony service migrate --domain {domain}` CLI 실행\n3. CLI 출력 결과를 그대로 사용자에게 전달\n4. 이미 등록된 경우 CLI가 \"이미 등록됨\" 메시지를 출력함 — 이것만 신뢰\n\n## ❌ 잘못된 워크플로우\n1. 사용자가 \"기존 서비스 등록해줘 {domain}\" 요청\n2. `semicolony kb get {domain} base-information` 등 KB 조회\n3. KB 엔트리가 있으니 \"이미 등록됨\"이라고 판단 ← **이것이 버그**\n\n## 이식 흐름 (CLI 내부 동작)\n1. service_projects 테이블에서 중복 체크\n2. KB에서 base-information, po, status, tech-stack 등 자동 수집\n3. KB status → lifecycle+status 매핑 (active→ops, hold→paused, deprecated→sunset)\n4. service_projects INSERT (lifecycle=''ops'')\n5. pm-summary projection key 자동 생성\n6. 감사(audit) 리포트 출력\n\n## 감사 리포트 해석\n- **mapped**: service_projects 컬럼에 매핑된 KB 엔트리\n- **metadata**: JSONB에 저장된 추가 정보 (repo, slack-channel 등)\n- **kb-only**: KB에만 존재하는 정상 엔트리 (kpi, milestone 등)\n- **warnings**: 비표준 키 → kb_type_schema 등록 제안\n- **missingRequired**: 필수 키 누락 → 사용자에게 보완 요청\n\n## Data Routing\n- service_projects 테이블 = 실행 상태 SoT\n- KB = 서비스 참조 지식 SoT\n- projection key (spec/*, pm-status 등)는 파이프라인만 쓰기 가능\n',
8
+ version = '1.1'
9
+ WHERE name = 'service-migration';
@@ -0,0 +1,11 @@
1
+ -- 052: service_features에 iteration_id FK 추가 (스프린트 기반 기능 관리)
2
+ BEGIN;
3
+
4
+ ALTER TABLE semicolony.service_features
5
+ ADD COLUMN IF NOT EXISTS iteration_id UUID REFERENCES semicolony.service_iterations(iteration_id);
6
+
7
+ CREATE INDEX IF NOT EXISTS idx_service_features_iteration
8
+ ON semicolony.service_features(iteration_id)
9
+ WHERE iteration_id IS NOT NULL;
10
+
11
+ COMMIT;
@@ -0,0 +1,149 @@
1
+ -- 052: service_projects → services 테이블 리네이밍 + PK gfp_id → service_id
2
+ --
3
+ -- 변경 사항:
4
+ -- A. service_projects → services 리네이밍
5
+ -- B. PK/FK 컬럼 gfp_id/project_id → service_id 통일
6
+ -- C. 제약조건 / 인덱스 리네이밍
7
+ -- D. 트리거 리네이밍
8
+ -- E. 하위 호환 VIEW 재생성 (gfp_id alias 포함)
9
+ --
10
+ -- 선행 조건: 051 이하 모든 마이그레이션 적용 완료
11
+
12
+ BEGIN;
13
+
14
+ -- ============================================================
15
+ -- A. 테이블 리네이밍
16
+ -- ============================================================
17
+
18
+ -- 기존 하위 호환 VIEW 제거 (테이블 리네임 시 CASCADE 방지)
19
+ DROP VIEW IF EXISTS semicolony.gfp_projects CASCADE;
20
+ DROP VIEW IF EXISTS semicolony.gfp_phase_sections CASCADE;
21
+ DROP VIEW IF EXISTS semicolony.gfp_materials CASCADE;
22
+ DROP VIEW IF EXISTS semicolony.gfp_research_tasks CASCADE;
23
+ DROP VIEW IF EXISTS semicolony.gfp_infra_requests CASCADE;
24
+
25
+ ALTER TABLE semicolony.service_projects RENAME TO services;
26
+
27
+ -- ============================================================
28
+ -- B. PK/FK 컬럼 리네이밍: gfp_id / project_id → service_id
29
+ -- ============================================================
30
+
31
+ -- B-1. 메인 테이블 PK
32
+ ALTER TABLE semicolony.services RENAME COLUMN gfp_id TO service_id;
33
+
34
+ -- B-2. 자식 테이블 (gfp_id → service_id)
35
+ ALTER TABLE semicolony.service_sections RENAME COLUMN gfp_id TO service_id;
36
+ ALTER TABLE semicolony.service_materials RENAME COLUMN gfp_id TO service_id;
37
+ ALTER TABLE semicolony.service_research_tasks RENAME COLUMN gfp_id TO service_id;
38
+ ALTER TABLE semicolony.service_infra_requests RENAME COLUMN gfp_id TO service_id;
39
+
40
+ -- B-3. 자식 테이블 (project_id → service_id)
41
+ ALTER TABLE semicolony.service_iterations RENAME COLUMN project_id TO service_id;
42
+ ALTER TABLE semicolony.service_incidents RENAME COLUMN project_id TO service_id;
43
+ ALTER TABLE semicolony.service_features RENAME COLUMN project_id TO service_id;
44
+
45
+ -- ============================================================
46
+ -- C. 제약조건 리네이밍
47
+ -- ============================================================
48
+
49
+ -- C-1. services 테이블
50
+ ALTER TABLE semicolony.services
51
+ RENAME CONSTRAINT gfp_projects_pkey TO services_pkey;
52
+ ALTER TABLE semicolony.services
53
+ RENAME CONSTRAINT service_projects_ontology_domain_fkey TO services_ontology_domain_fkey;
54
+
55
+ -- C-2. service_sections
56
+ ALTER TABLE semicolony.service_sections
57
+ RENAME CONSTRAINT service_sections_gfp_id_track_phase_section_key_key
58
+ TO service_sections_service_id_track_phase_section_key_key;
59
+ ALTER TABLE semicolony.service_sections
60
+ RENAME CONSTRAINT service_sections_project_fkey TO service_sections_service_fkey;
61
+
62
+ -- C-3. service_materials
63
+ ALTER TABLE semicolony.service_materials
64
+ RENAME CONSTRAINT service_materials_project_fkey TO service_materials_service_fkey;
65
+
66
+ -- C-4. service_research_tasks
67
+ ALTER TABLE semicolony.service_research_tasks
68
+ RENAME CONSTRAINT service_research_tasks_project_fkey TO service_research_tasks_service_fkey;
69
+
70
+ -- C-5. service_infra_requests
71
+ ALTER TABLE semicolony.service_infra_requests
72
+ RENAME CONSTRAINT service_infra_requests_project_fkey TO service_infra_requests_service_fkey;
73
+
74
+ -- C-6. service_iterations
75
+ ALTER TABLE semicolony.service_iterations
76
+ RENAME CONSTRAINT service_iterations_project_id_fkey TO service_iterations_service_fkey;
77
+
78
+ -- C-7. service_incidents
79
+ ALTER TABLE semicolony.service_incidents
80
+ RENAME CONSTRAINT service_incidents_project_id_fkey TO service_incidents_service_fkey;
81
+
82
+ -- C-8. service_features
83
+ ALTER TABLE semicolony.service_features
84
+ RENAME CONSTRAINT service_features_project_id_fkey TO service_features_service_fkey;
85
+
86
+ -- C-9. 인덱스 리네이밍 (project → service)
87
+ ALTER INDEX semicolony.idx_service_sections_project RENAME TO idx_service_sections_service;
88
+ ALTER INDEX semicolony.idx_service_infra_requests_project RENAME TO idx_service_infra_requests_service;
89
+ ALTER INDEX semicolony.idx_service_iterations_project RENAME TO idx_service_iterations_service;
90
+ ALTER INDEX semicolony.idx_service_incidents_project RENAME TO idx_service_incidents_service;
91
+ ALTER INDEX semicolony.idx_service_features_project RENAME TO idx_service_features_service;
92
+
93
+ -- (PK constraint rename이 backing index도 자동 rename하므로 별도 인덱스 rename 불필요)
94
+
95
+ -- ============================================================
96
+ -- D. 트리거 리네이밍
97
+ -- ============================================================
98
+
99
+ ALTER TRIGGER trg_service_projects_updated ON semicolony.services
100
+ RENAME TO trg_services_updated;
101
+
102
+ -- ============================================================
103
+ -- E. 하위 호환 VIEW (gfp_id alias 포함)
104
+ -- ============================================================
105
+
106
+ -- service_projects → services (gfp_id alias)
107
+ CREATE VIEW semicolony.service_projects AS
108
+ SELECT service_id AS gfp_id,
109
+ project_name, service_domain, owner_name, owner_contact,
110
+ current_phase, infra_phase, status, lifecycle, launched_at,
111
+ metadata, created_at, updated_at
112
+ FROM semicolony.services;
113
+
114
+ -- gfp_projects → services (레거시)
115
+ CREATE VIEW semicolony.gfp_projects AS
116
+ SELECT * FROM semicolony.service_projects;
117
+
118
+ -- gfp_phase_sections → service_sections (gfp_id alias)
119
+ CREATE VIEW semicolony.gfp_phase_sections AS
120
+ SELECT service_id AS gfp_id,
121
+ section_id, phase, track, section_key, title, content,
122
+ ordinal, status, reviewer_note, source,
123
+ kb_written_at, qa_items, slack_thread_ts,
124
+ iteration_id, created_at, updated_at
125
+ FROM semicolony.service_sections;
126
+
127
+ -- gfp_materials → service_materials (gfp_id alias)
128
+ CREATE VIEW semicolony.gfp_materials AS
129
+ SELECT service_id AS gfp_id,
130
+ material_id, content, phase_mapping, material_type,
131
+ screenshot_data, stitch_share_url, created_at
132
+ FROM semicolony.service_materials;
133
+
134
+ -- gfp_research_tasks → service_research_tasks (gfp_id alias)
135
+ CREATE VIEW semicolony.gfp_research_tasks AS
136
+ SELECT service_id AS gfp_id,
137
+ task_id, task_type, reference_urls, input_prompt,
138
+ status, result, created_at, updated_at
139
+ FROM semicolony.service_research_tasks;
140
+
141
+ -- gfp_infra_requests → service_infra_requests (gfp_id alias)
142
+ CREATE VIEW semicolony.gfp_infra_requests AS
143
+ SELECT service_id AS gfp_id,
144
+ request_id, source_phase, source_section_id, category,
145
+ title, description, priority, status,
146
+ slack_thread_ts, created_at, updated_at
147
+ FROM semicolony.service_infra_requests;
148
+
149
+ COMMIT;