패키지
ObjectOS의 조직 단위 — 버전 관리되고, 설치 가능하며, 공유할 수 있습니다.
패키지
ObjectOS에서 만드는 모든 것은 패키지 안에 존재합니다. 패키지는 버전이 관리되고 자체적으로 완결된 메타데이터 번들입니다. 패키지는 AI Builder가 작업하는 단위이자, marketplace가 배포하는 단위이며, ObjectOS가 업데이트를 추적하는 단위입니다.
패키지의 구성 요소
com.acme.crm@1.2.0
├── manifest id, version, namespace, dependencies
├── objects/ *.object.ts, *.state.ts, *.hook.ts
├── views/ *.view.ts, *.page.ts, *.form.ts
├── actions/ *.action.ts
├── flows/ *.flow.ts, *.approval.ts
├── agents/ *.agent.ts, *.skill.ts
├── permissions/ *.permission.ts
├── sharing/ *.sharing.ts
├── translations/ en.ts, zh-CN.ts, ...
├── apps/ *.app.ts (navigation)
└── data/ defineDataset(...) seed모든 메타데이터 아티팩트(object, action, flow 등)는 정확히 하나의 패키지에 속합니다. 패키지 id는 reverse-DNS(com.acme.crm, org.mycompany.helpdesk) 형식이며, 네임스페이스 접두사(crm_, hd_)는 같은 테넌트에 설치된 여러 패키지 간에 테이블/object 이름이 충돌하지 않도록 합니다.
패키지 생성하기
AI Builder에서
"우리 내부 CRM용 새 패키지를 시작하고, 네임스페이스는
crm으로 해줘."
AI는 create_package와 set_active_package를 호출합니다. 그 이후로 당신이 설명하는 모든 object / field / action은 crm에 들어갑니다.
CLI에서
os init my-crm -t app
cd my-crm
# manifest lives in the `manifest:` block of ./objectstack.config.ts
pnpm devConsole에서
Console → Packages → New Package — 이름, id, 버전, 네임스페이스.
활성 패키지
AI Builder에서는 대화가 **활성 패키지(active package)**를 가지고 있습니다. 이는 새 메타데이터의 기본 컨테이너입니다. 당신이 *"com.acme.helpdesk로 전환해줘."*와 같이 말하면 AI가 set_active_package 도구로 이를 설정합니다. CLI에서 활성 패키지는 단순히 프로젝트의 objectstack.config.ts(manifest: 블록)에 선언된 패키지입니다.
버전 관리
패키지는 semver를 따릅니다. 런타임과 동일한 규칙입니다 — Changelog & Versioning을 참고하세요.
버전을 올리더라도 게시(publish)하기 전까지는 아무것도 바뀌지 않습니다. 런타임은 테넌트별, 패키지별로 installed_version을 추적하며, 카탈로그에 더 최신 버전이 있으면 marketplace에 "Update available" 배지가 표시됩니다.
의존성
패키지는 다른 패키지에 의존할 수 있습니다:
{
"id": "com.acme.helpdesk",
"version": "0.3.0",
"dependencies": {
"com.acme.crm": "^1.0.0",
"sys.feeds": "*"
}
}런타임은 설치 시 의존성을 해석합니다. com.acme.crm이 설치되어 있지 않으면 helpdesk 설치는 명확한 오류와 함께 실패합니다.
시스템 패키지(sys.*)는 항상 존재합니다 — feeds, attachments, audit, identity 등.
게시하기
os compile # → dist/objectstack.json
os package publish # → ObjectStack cloud catalogos package publish는 컴파일된 manifest를 OS_CLOUD_URL로 구성된 클라우드 컨트롤 플레인에 업로드하며, OS_CLOUD_API_KEY로 인증합니다. 비공개/에어갭(air-gapped) 배포의 경우 게시를 건너뛰고 컴파일된 dist/objectstack.json을 대상 설치 환경에 직접 전달하세요(아래 설치 섹션 참조). Marketplace를 참고하세요.
설치하기
| 경로 | 방법 |
|---|---|
| Console | Marketplace 탭 → 패키지 선택 → Install |
| REST | POST /api/v1/marketplace/install-local (본문: { packageId, versionId? }) |
| 에어갭 | 컴파일된 dist/objectstack.json 아티팩트를 마운트 (참고: Air-gapped) |
설치는 패키지의 메타데이터를 실행 중인 커널에 병합하고, 해당 object들을 ObjectQL에 등록하며, 최초 설치 시 초기 데이터를 시드합니다 — 재시작이 필요 없습니다. 캐시된 설치는 다음 부팅 시 다시 등록되므로 프로세스 재시작에도 유지됩니다.
제거하기
제거는 패키지의 캐시된 manifest를 삭제하여 다음 부팅 시 더 이상 재등록되지 않도록 합니다. object 등록은 누적 방식이므로, 이미 실행 중인 패키지의 object를 완전히 언로드하려면 커널 재시작이 필요합니다. 데이터는 기본적으로 유지되므로, 다시 설치하여 이어서 사용할 수 있습니다.
패키지 간 규약
여러 패키지가 공존할 때 충돌을 방지하기 위해:
| 아티팩트 | 규약 |
|---|---|
| Object 이름 | 항상 접두사 사용: crm_account, hd_ticket |
| Action 이름 | 접두사 사용: crm_assign_owner, hd_close_ticket |
| Flow 이름 | 접두사 사용: hd_overdue_alert |
| 번역 키 | 네임스페이스 하위로 스코프 지정: crm.account.label |
시드 externalId | <prefix>:<key>, 예: crm:demo-account-1 |
| 시스템 이름 | 예약됨: sys_* (커스텀 패키지에서 절대 사용 금지) |
CLI와 AI Builder 모두 생성 시 이 규약을 강제합니다.
시스템 패키지
런타임은 항상 존재하면서 다형적(polymorphic) 서비스를 제공하는 소수의 패키지를 함께 제공합니다:
| 패키지 | 제공 항목 |
|---|---|
sys.identity | sys_user, sys_organization, sys_member, 세션, API 키 |
sys.feeds | sys_comment, sys_activity, sys_attachment |
sys.audit | sys_audit_log |
sys.files | sys_file |
sys.ai | ai_conversations, ai_pending_actions |
sys.settings | sys_setting |
object에서 enable: { feeds: true, trackHistory: true, … }를 통해 활성화할 수 있습니다 — Data Model을 참고하세요.
다음으로 볼 곳
- Marketplace — 다른 테넌트에 패키지 배포
- Data Model — 패키지 안에 들어가는 것
os packagecommands — 전체 CLI 레퍼런스