@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,39 @@
1
+ -- Add workstation-first always-on policy to the SEMO Ops worker profile.
2
+ -- Worker devices are operator kits; 24/7 workloads should be placed on workstation/service hives first.
3
+
4
+ UPDATE semicolony.workspace_profiles AS wp
5
+ SET version = '2026-07-10',
6
+ repo_remotes = repo_remotes || jsonb_build_object(
7
+ 'semicolon_ops',
8
+ 'https://gitlab.semi-colon.space/semicolon-devteam/semicolon-ops.git'
9
+ ),
10
+ tool_adapters = ARRAY(
11
+ SELECT DISTINCT adapter
12
+ FROM unnest(tool_adapters || ARRAY['kb-mcp']) AS adapter
13
+ ),
14
+ guidance_template_version = '2026-07-10',
15
+ required_smokes = (
16
+ SELECT jsonb_agg(smoke)
17
+ FROM (
18
+ SELECT DISTINCT ON (smoke ->> 'id') smoke
19
+ FROM jsonb_array_elements(
20
+ wp.required_smokes || jsonb_build_array(
21
+ jsonb_build_object('id', 'worker:workstation-first-policy', 'label', 'workstation-first always-on policy')
22
+ )
23
+ ) AS items(smoke)
24
+ ORDER BY smoke ->> 'id'
25
+ ) AS deduped
26
+ ),
27
+ metadata = metadata || jsonb_build_object(
28
+ 'control_repo',
29
+ 'https://gitlab.semi-colon.space/semicolon-devteam/semicolon-ops.git',
30
+ 'always_on_policy',
31
+ jsonb_build_object(
32
+ 'rule',
33
+ '24시간 돌아가야 하는 서비스, 에이전트, 크론잡 등은 가급적 워크스테이션에 세팅하는 것을 최우선적으로 고려한다. Worker PC는 상시 서비스 호스트가 아니다.',
34
+ 'priority',
35
+ jsonb_build_array('hive@workstation', 'hive@hermes', 'hive@oke', 'local_hive_exception')
36
+ )
37
+ ),
38
+ updated_at = now()
39
+ WHERE profile_id = 'semo-ops-worker';
@@ -0,0 +1,24 @@
1
+ -- Clarify SEMO Ops worker profile repository scope.
2
+ -- The required worker control context is semicolon-ops; the SemiColony product monorepo is only an optional CLI bootstrap source.
3
+
4
+ UPDATE semicolony.workspace_profiles
5
+ SET repo_remotes = jsonb_build_object(
6
+ 'semicolon_ops',
7
+ 'https://gitlab.semi-colon.space/semicolon-devteam/semicolon-ops.git'
8
+ ),
9
+ tool_adapters = ARRAY(
10
+ SELECT DISTINCT adapter
11
+ FROM unnest(tool_adapters || ARRAY['kb-mcp']) AS adapter
12
+ ),
13
+ metadata = metadata
14
+ || jsonb_build_object(
15
+ 'repo_scope_note',
16
+ 'SEMO Ops worker setup does not require cloning the SemiColony product monorepo. The semicolon-ops repo is the worker control context; project repos are cloned only when a task needs them.',
17
+ 'optional_bootstrap_repos',
18
+ jsonb_build_object(
19
+ 'semicolony_cli_source',
20
+ 'https://gitlab.semi-colon.space/semicolon-devteam/semicolony.git'
21
+ )
22
+ ),
23
+ updated_at = now()
24
+ WHERE profile_id = 'semo-ops-worker';
@@ -0,0 +1,18 @@
1
+ -- Rename SEMO Ops worker control repository from semicolon-ops to semo-ops.
2
+
3
+ UPDATE semicolony.workspace_profiles
4
+ SET repo_remotes = jsonb_build_object(
5
+ 'semo_ops',
6
+ 'https://gitlab.semi-colon.space/semicolon-devteam/semo-ops.git'
7
+ ),
8
+ metadata = metadata
9
+ || jsonb_build_object(
10
+ 'control_repo',
11
+ 'https://gitlab.semi-colon.space/semicolon-devteam/semo-ops.git',
12
+ 'repo_name',
13
+ 'semo-ops',
14
+ 'repo_scope_note',
15
+ 'SEMO Ops worker setup does not require cloning the SemiColony product monorepo. The semo-ops repo is the worker control context; project repos are cloned only when a task needs them.'
16
+ ),
17
+ updated_at = now()
18
+ WHERE profile_id = 'semo-ops-worker';
@@ -0,0 +1,92 @@
1
+ -- 148_momo_runtime_convergence.sql
2
+ -- Momo(캘린더 비서) 런타임 수렴: 고객 표면의 canonical agent 는 bi-seo(모모) 하나.
3
+ --
4
+ -- 배경: packages/semicolony-dashboard/migrations/029_momo_single_agent_convergence.sql 가
5
+ -- public.agent_listings/agent_installs 를 이미 bi-seo 로 수렴시켰다(display_name/role_label 등).
6
+ -- 본 마이그레이션은 그 짝으로, semicolony.* 내부 런타임 부기(bot_status/agent_personas —
7
+ -- Architecture-B 봇 세션·serve-worker 가 참조하는 SoT)를 동일하게 수렴시킨다.
8
+ --
9
+ -- 스키마 검증 메모(작성 전 실측):
10
+ -- - semicolony.bot_status 에는 001_initial.sql/104/114/121/136 을 통틀어 `config` JSONB
11
+ -- 컬럼이 존재하지 않는다(런타임 컨트롤 코드가 기대하는 컬럼이지만 이 저장소 마이그레이션
12
+ -- 히스토리에는 추가된 적이 없다 — 별도 이슈). 따라서 브리프가 제시한
13
+ -- `config->>'agent_slug'='momo-calendar'` 매칭은 이 저장소 스키마와 맞지 않아 그대로
14
+ -- 쓸 수 없다. 대신 137_runtime_backfill_team_semicolon.sql 이 이미 확립한
15
+ -- `bot_id LIKE 'ag-' || tenant.slug || '-' || agent_slug` 프로젝션 명명 규약을 그대로
16
+ -- 따라 bot_id 접미사로 momo-calendar/bi-seo 런타임 행을 동적으로 식별한다(테넌트 목록
17
+ -- 하드코딩 없음). 플랫폼-글로벌 템플릿 행(bot_id 그 자체가 'momo-calendar'/'bi-seo')도 함께 매칭.
18
+ -- - semicolony.agent_personas.status 는 125_agent_personas.sql 의 CHECK 제약상
19
+ -- ('active','deprecated') 만 허용한다 — 'archived' 는 위반이므로 'deprecated' 를 사용한다.
20
+ -- - semicolony.bot_status 는 name/role/tenant_id/scope/install_id 컬럼을 모두 갖고 있다
21
+ -- (001_initial.sql + 136_runtime_tenant_columns.sql) — "bi-seo 프로젝션에 name/role/scope
22
+ -- 설정 + tenant_id/install_id 채우기"는 agent_personas(해당 컬럼 없음)가 아니라 이 테이블을
23
+ -- 가리킨다.
24
+ -- - public.agent_installs / public.agent_listings / public.tenants 존재는
25
+ -- 135_sc_roles.sql / 143_rls_enable_public.sql 의 to_regclass 가드 및
26
+ -- packages/semicolony-dashboard/migrations/010_customer_tables.sql 정의로 확인됨.
27
+ -- - 실행 호스트 설정(runtime_hint/tool_capabilities/projection_targets/workspace_path 등)은
28
+ -- 건드리지 않는다(브리프 지시).
29
+ --
30
+ -- 멱등: 전부 WHERE 가드가 있는 UPDATE 뿐이라 재실행 안전.
31
+ -- 트랜잭션: 러너(packages/cli/src/commands/db.ts runMigration)가 파일 전체를
32
+ -- BEGIN → sql → schema_migrations INSERT → COMMIT 으로 감싼다. 파일 안에 BEGIN/COMMIT 을
33
+ -- 두면 러너 트랜잭션을 조기 커밋해 북키핑 INSERT 가 autocommit 으로 빠지고 실패 시
34
+ -- ROLLBACK 이 무력화된다(136 헤더 규약과 동일) — 트랜잭션 구문을 넣지 않는다.
35
+
36
+ -- ── 1) 과거 momo-calendar 런타임 프로젝션(플랫폼-글로벌 또는 테넌트별 파생 행) retire ──
37
+ UPDATE semicolony.bot_status
38
+ SET status = 'retired',
39
+ synced_at = now()
40
+ WHERE (bot_id = 'momo-calendar' OR bot_id LIKE '%-momo-calendar')
41
+ AND status IS DISTINCT FROM 'retired';
42
+
43
+ -- ── 2) 대응하는 agent_personas 행 archive(스키마 CHECK 상 'deprecated') ──
44
+ UPDATE semicolony.agent_personas
45
+ SET status = 'deprecated',
46
+ updated_at = now()
47
+ WHERE slug IN (
48
+ SELECT bot_id FROM semicolony.bot_status
49
+ WHERE bot_id = 'momo-calendar' OR bot_id LIKE '%-momo-calendar'
50
+ )
51
+ AND status IS DISTINCT FROM 'deprecated';
52
+
53
+ -- ── 3) 활성 bi-seo(모모) 런타임 프로젝션 수렴 ──
54
+ -- ag-{tenantSlug}-bi-seo 명명 규약(137_runtime_backfill_team_semicolon.sql 과 동일 패턴)으로
55
+ -- 테넌트를 동적 매칭하고, public.agent_installs/agent_listings 를 조인해 install_id 를 채운다.
56
+ -- agent_installs 는 (tenant_id, listing_id, instance_name) 유니크라 같은 listing 의 active
57
+ -- install 이 복수일 수 있다 → LATERAL + ORDER BY 로 결정적으로 1행 선택
58
+ -- (029_momo_single_agent_convergence.sql 의 canonical 선호와 동일한 tie-break:
59
+ -- instance_name='모모' 우선 → installed_at 오름차순 → id).
60
+ -- 실행 호스트 설정 컬럼(runtime_hint 등)은 SET 절에서 제외 — 변경하지 않는다.
61
+ UPDATE semicolony.bot_status b
62
+ SET name = '모모',
63
+ role = '일정·회의 비서',
64
+ scope = 'tenant-local',
65
+ tenant_id = m.tenant_id,
66
+ install_id = m.install_id,
67
+ synced_at = now()
68
+ FROM (
69
+ SELECT b2.bot_id, t.id AS tenant_id, i.install_id
70
+ FROM semicolony.bot_status b2
71
+ JOIN LATERAL (
72
+ SELECT t.id, t.slug
73
+ FROM public.tenants t
74
+ WHERE b2.bot_id LIKE 'ag-' || t.slug || '-%'
75
+ ORDER BY length(t.slug) DESC
76
+ LIMIT 1
77
+ ) t ON true
78
+ JOIN public.agent_listings l
79
+ ON l.agent_slug = 'bi-seo'
80
+ LEFT JOIN LATERAL (
81
+ SELECT i.id AS install_id
82
+ FROM public.agent_installs i
83
+ WHERE i.tenant_id = t.id
84
+ AND i.listing_id = l.id
85
+ AND i.install_status = 'active'
86
+ ORDER BY (i.instance_name = '모모') DESC, i.installed_at, i.id
87
+ LIMIT 1
88
+ ) i ON true
89
+ WHERE b2.bot_id = 'ag-' || t.slug || '-bi-seo'
90
+ AND b2.status = 'active'
91
+ ) m
92
+ WHERE b.bot_id = m.bot_id;
@@ -0,0 +1,88 @@
1
+ # Migrations
2
+
3
+ SEMICOLONY CLI의 PostgreSQL 마이그레이션 파일들.
4
+ `semicolony db migrate` 명령으로 순차 적용됩니다.
5
+
6
+ ## 마이그레이션 목록
7
+
8
+ | 파일 | 설명 |
9
+ |------|------|
10
+ | `001_initial.sql` | 초기 스키마 (skill/agent/command_definitions, bot_status 등) |
11
+ | `002_add_indexes.sql` | 조회 성능 인덱스 추가 |
12
+ | `003_add_fk.sql` | FK 제약조건 추가 |
13
+ | `004_session_count_trigger.sql` | 봇 세션 카운트 트리거 |
14
+ | `005_bot_workspace_audits.sql` | Bot workspace 감사 테이블 |
15
+ | `006_bot_kb_subscriptions.sql` | 봇별 KB 구독 테이블 |
16
+ | `007_flatten_skill_names.sql` | Flat skill naming 마이그레이션 |
17
+
18
+ ## 007: Flat Skill Naming
19
+
20
+ `skill_definitions` 테이블의 스킬 이름/메타데이터 구조를 변경합니다.
21
+
22
+ ### 배경
23
+
24
+ Claude Code는 `~/.claude/skills/{skillName}/SKILL.md` (1-depth)만 인식합니다.
25
+ 기존에는 `{botId}/{skillName}` (예: `semiclaw/kb-manager`)으로 저장하여 2-depth 구조가 되어 로드 불가했습니다.
26
+
27
+ ### 변경 내용
28
+
29
+ **Step 1: `metadata.bot_id` → `metadata.bot_ids` 배열 변환**
30
+
31
+ ```sql
32
+ -- Before: { "bot_id": "semiclaw" }
33
+ -- After: { "bot_ids": ["semiclaw"] }
34
+
35
+ UPDATE skill_definitions
36
+ SET metadata = (metadata - 'bot_id')
37
+ || jsonb_build_object('bot_ids', jsonb_build_array(metadata->>'bot_id'))
38
+ WHERE metadata ? 'bot_id';
39
+ ```
40
+
41
+ **Step 2: name에서 `botId/` 프리픽스 제거**
42
+
43
+ ```sql
44
+ -- Before: 'semiclaw/kb-manager'
45
+ -- After: 'kb-manager'
46
+
47
+ UPDATE skill_definitions
48
+ SET name = SUBSTRING(name FROM POSITION('/' IN name) + 1)
49
+ WHERE name LIKE '%/%'
50
+ AND office_id IS NULL;
51
+ ```
52
+
53
+ ### 적용
54
+
55
+ ```bash
56
+ semicolony db migrate
57
+ ```
58
+
59
+ ### 검증
60
+
61
+ ```bash
62
+ # DB 확인: flat name + bot_ids
63
+ psql -c "SELECT name, metadata->'bot_ids' FROM skill_definitions WHERE office_id IS NULL;"
64
+
65
+ # 글로벌 캐시 재생성
66
+ semicolony context sync
67
+
68
+ # 1-depth 구조 확인
69
+ ls ~/.claude/skills/
70
+ ```
71
+
72
+ ### 롤백
73
+
74
+ 이 마이그레이션은 비파괴적이지만 되돌리려면:
75
+
76
+ ```sql
77
+ -- bot_ids → bot_id 복원 (첫 번째 봇만)
78
+ UPDATE skill_definitions
79
+ SET metadata = (metadata - 'bot_ids')
80
+ || jsonb_build_object('bot_id', metadata->'bot_ids'->>0)
81
+ WHERE metadata ? 'bot_ids';
82
+
83
+ -- name에 botId/ 프리픽스 복원
84
+ UPDATE skill_definitions
85
+ SET name = (metadata->>'bot_id') || '/' || name
86
+ WHERE metadata ? 'bot_id'
87
+ AND office_id IS NULL;
88
+ ```
@@ -0,0 +1,56 @@
1
+ -- SQLite DDL for SEMICOLONY KB (mirrors semicolony.knowledge_base on PG).
2
+ -- Solo profiles: used by SqliteKbStore.
3
+ --
4
+ -- Phase 2 initial: FTS5 keyword search. Vector search is wired separately via
5
+ -- sqlite-vec extension if loadable; otherwise `search()` falls back to FTS5.
6
+
7
+ CREATE TABLE IF NOT EXISTS knowledge_base (
8
+ kb_id INTEGER PRIMARY KEY AUTOINCREMENT,
9
+ domain TEXT NOT NULL,
10
+ key TEXT NOT NULL,
11
+ sub_key TEXT NOT NULL DEFAULT '',
12
+ content TEXT NOT NULL,
13
+ metadata TEXT,
14
+ created_by TEXT,
15
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
16
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
17
+ UNIQUE(domain, key, sub_key)
18
+ );
19
+
20
+ CREATE INDEX IF NOT EXISTS idx_kb_domain ON knowledge_base(domain);
21
+ CREATE INDEX IF NOT EXISTS idx_kb_created_by ON knowledge_base(created_by);
22
+
23
+ -- FTS5 full-text index over content + key (no porter — multilingual content).
24
+ CREATE VIRTUAL TABLE IF NOT EXISTS knowledge_base_fts USING fts5(
25
+ key,
26
+ sub_key,
27
+ content,
28
+ content='knowledge_base',
29
+ content_rowid='kb_id'
30
+ );
31
+
32
+ -- Optional vector column (binary blob). Populated by sqlite-vec when available;
33
+ -- otherwise left NULL and search falls back to FTS5.
34
+ CREATE TABLE IF NOT EXISTS knowledge_base_vectors (
35
+ kb_id INTEGER PRIMARY KEY REFERENCES knowledge_base(kb_id) ON DELETE CASCADE,
36
+ embedding BLOB NOT NULL,
37
+ dim INTEGER NOT NULL
38
+ );
39
+
40
+ -- Triggers: keep FTS in sync.
41
+ CREATE TRIGGER IF NOT EXISTS knowledge_base_ai AFTER INSERT ON knowledge_base BEGIN
42
+ INSERT INTO knowledge_base_fts(rowid, key, sub_key, content)
43
+ VALUES (new.kb_id, new.key, new.sub_key, new.content);
44
+ END;
45
+
46
+ CREATE TRIGGER IF NOT EXISTS knowledge_base_ad AFTER DELETE ON knowledge_base BEGIN
47
+ INSERT INTO knowledge_base_fts(knowledge_base_fts, rowid, key, sub_key, content)
48
+ VALUES ('delete', old.kb_id, old.key, old.sub_key, old.content);
49
+ END;
50
+
51
+ CREATE TRIGGER IF NOT EXISTS knowledge_base_au AFTER UPDATE ON knowledge_base BEGIN
52
+ INSERT INTO knowledge_base_fts(knowledge_base_fts, rowid, key, sub_key, content)
53
+ VALUES ('delete', old.kb_id, old.key, old.sub_key, old.content);
54
+ INSERT INTO knowledge_base_fts(rowid, key, sub_key, content)
55
+ VALUES (new.kb_id, new.key, new.sub_key, new.content);
56
+ END;
@@ -0,0 +1,53 @@
1
+ -- SQLite DDL for SEMICOLONY OperationalStore (mirrors PG semicolony.bot_commitments /
2
+ -- bot_cron_jobs / bot_seats at minimum).
3
+ --
4
+ -- Solo profiles use this schema via SqliteOperationalStore. Distributed
5
+ -- concurrency primitives (LISTEN/NOTIFY, SKIP LOCKED) are replaced with
6
+ -- BEGIN IMMEDIATE + polling in the adapter.
7
+
8
+ CREATE TABLE IF NOT EXISTS bot_commitments (
9
+ id TEXT PRIMARY KEY,
10
+ bot_id TEXT NOT NULL,
11
+ title TEXT NOT NULL,
12
+ status TEXT NOT NULL DEFAULT 'active',
13
+ source_type TEXT NOT NULL,
14
+ session_owner TEXT,
15
+ pipeline_context TEXT,
16
+ metadata TEXT,
17
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
18
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
19
+ );
20
+
21
+ CREATE INDEX IF NOT EXISTS idx_bc_bot ON bot_commitments(bot_id);
22
+ CREATE INDEX IF NOT EXISTS idx_bc_status ON bot_commitments(status);
23
+ CREATE INDEX IF NOT EXISTS idx_bc_updated_at ON bot_commitments(updated_at);
24
+
25
+ CREATE TABLE IF NOT EXISTS bot_cron_jobs (
26
+ bot_id TEXT NOT NULL,
27
+ job_id TEXT NOT NULL,
28
+ name TEXT,
29
+ schedule TEXT,
30
+ enabled INTEGER NOT NULL DEFAULT 1,
31
+ last_run TEXT,
32
+ next_run TEXT,
33
+ session_target TEXT,
34
+ payload TEXT,
35
+ synced_at TEXT NOT NULL DEFAULT (datetime('now')),
36
+ PRIMARY KEY (bot_id, job_id)
37
+ );
38
+
39
+ CREATE INDEX IF NOT EXISTS idx_cron_next_run ON bot_cron_jobs(next_run);
40
+
41
+ CREATE TABLE IF NOT EXISTS bot_seats (
42
+ seat_id TEXT PRIMARY KEY,
43
+ claude_config_dir TEXT NOT NULL,
44
+ max_concurrent INTEGER NOT NULL DEFAULT 1,
45
+ current_bot_id TEXT,
46
+ allocated_at TEXT,
47
+ status TEXT NOT NULL DEFAULT 'available'
48
+ CHECK (status IN ('available','allocated','quarantined')),
49
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
50
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
51
+ );
52
+
53
+ CREATE INDEX IF NOT EXISTS idx_seats_status ON bot_seats(status);
@@ -0,0 +1,48 @@
1
+ -- 002: action_items — Personal 프로파일용 SQLite 스키마.
2
+ --
3
+ -- PG semicolony.action_items (migration 069 이후) 의 SQLite 등가 변환:
4
+ -- UUID/VARCHAR/TEXT → TEXT
5
+ -- SMALLINT/INTEGER → INTEGER
6
+ -- TIMESTAMPTZ/DATE → TEXT (ISO 8601 / YYYY-MM-DD, UTC)
7
+ -- JSONB → TEXT (JSON string, 앱 레이어에서 parse)
8
+ -- NOW() → datetime('now') — UTC
9
+ -- FK to semicolony.ontology → 제거 (Personal ops.db 엔 ontology 테이블 없음)
10
+ --
11
+ -- UUID 생성은 앱 레이어(`crypto.randomUUID()`) 가 담당. SQLite DEFAULT 로는 생성 못 함.
12
+
13
+ CREATE TABLE IF NOT EXISTS action_items (
14
+ action_item_id TEXT PRIMARY KEY,
15
+ owner_domain TEXT NOT NULL,
16
+ target_domain TEXT,
17
+ iteration_id TEXT,
18
+ description TEXT NOT NULL,
19
+ assignee TEXT,
20
+ deadline TEXT,
21
+ status TEXT NOT NULL DEFAULT 'open',
22
+ priority TEXT NOT NULL DEFAULT 'normal',
23
+ category TEXT,
24
+ source TEXT NOT NULL DEFAULT 'manual',
25
+ related_url TEXT,
26
+ sort_order INTEGER NOT NULL DEFAULT 0,
27
+ completed_at TEXT,
28
+ metadata TEXT NOT NULL DEFAULT '{}',
29
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
30
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
31
+ );
32
+
33
+ CREATE INDEX IF NOT EXISTS idx_ai_owner_status
34
+ ON action_items(owner_domain, status);
35
+
36
+ CREATE INDEX IF NOT EXISTS idx_ai_target_status
37
+ ON action_items(target_domain, status)
38
+ WHERE target_domain IS NOT NULL;
39
+
40
+ CREATE INDEX IF NOT EXISTS idx_ai_created
41
+ ON action_items(created_at DESC);
42
+
43
+ CREATE INDEX IF NOT EXISTS idx_ai_deadline
44
+ ON action_items(deadline)
45
+ WHERE deadline IS NOT NULL;
46
+
47
+ CREATE INDEX IF NOT EXISTS idx_ai_sort
48
+ ON action_items(sort_order);
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "@team-semicolon/semicolony-cli",
3
+ "version": "4.18.51",
4
+ "description": "SemiColony CLI - AI operations and agent orchestration installer",
5
+ "main": "dist/bundle.js",
6
+ "bin": {
7
+ "semicolony": "dist/bundle.js",
8
+ "semicolony-cli": "dist/bundle.js",
9
+ "semo": "dist/bundle.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc --noEmit && node scripts/bundle.mjs && rm -rf dist/templates && cp -r src/templates dist/templates && xattr -cr dist/ 2>/dev/null || true",
13
+ "build:tsc": "tsc --noEmit",
14
+ "bundle": "node scripts/bundle.mjs",
15
+ "start": "node dist/bundle.js",
16
+ "dev": "ts-node src/index.ts",
17
+ "lint": "eslint src/",
18
+ "test": "vitest run"
19
+ },
20
+ "keywords": [
21
+ "semicolony",
22
+ "cli",
23
+ "ai-agent",
24
+ "claude",
25
+ "semicolon"
26
+ ],
27
+ "author": "Semicolon DevTeam",
28
+ "license": "Apache-2.0",
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://gitlab.semi-colon.space/semicolon-devteam/semicolony.git",
35
+ "directory": "packages/cli"
36
+ },
37
+ "dependencies": {
38
+ "better-sqlite3": "^11.0.0",
39
+ "chalk": "^4.1.2",
40
+ "commander": "^12.0.0",
41
+ "cron-parser": "^4.9.0",
42
+ "inquirer": "^8.2.6",
43
+ "ora": "^5.4.1",
44
+ "smol-toml": "^1.6.1"
45
+ },
46
+ "optionalDependencies": {
47
+ "@team-semicolon/semicolony-common": "*",
48
+ "@team-semicolon/semicolony-discord-router": "*",
49
+ "@team-semicolon/semicolony-kb-core": "*",
50
+ "@team-semicolon/semicolony-kb-pg": "*",
51
+ "@team-semicolon/semicolony-ops-store": "*",
52
+ "pg": "^8.17.2"
53
+ },
54
+ "devDependencies": {
55
+ "@eslint/js": "^9.39.4",
56
+ "@types/better-sqlite3": "^7.6.0",
57
+ "@types/inquirer": "^8.2.0",
58
+ "@types/node": "^20.0.0",
59
+ "@types/pg": "^8.16.0",
60
+ "esbuild": "^0.24.0",
61
+ "eslint": "^9.39.4",
62
+ "ts-node": "^10.0.0",
63
+ "typescript": "^5.0.0",
64
+ "typescript-eslint": "^8.58.0"
65
+ },
66
+ "engines": {
67
+ "node": ">=18.0.0"
68
+ },
69
+ "files": [
70
+ "dist",
71
+ "migrations",
72
+ "migrations-sqlite",
73
+ "README.md",
74
+ "PERSONAL_TESTING.md",
75
+ "LICENSE",
76
+ "NOTICE"
77
+ ]
78
+ }