update roadmap and rules

This commit is contained in:
toki 2026-05-26 16:26:07 +09:00
parent 42414b358f
commit 05fd582b2b
13 changed files with 61 additions and 56 deletions

View file

@ -3,9 +3,9 @@
`nexo` is a messaging and notification service workspace that keeps the server
core, Flutter client, and Flutter push-notification package together.
The current goal is to preserve the proven Mattermost-based messaging and push
runtime while moving toward an independent product shape with Nexo-owned service
boundaries.
The current goal is to provide a Nexo-owned messaging service surface while
keeping the current server, client, and push runtime verifiable during the
transition.
## Name
@ -14,10 +14,10 @@ notifications, and service infrastructure meet.
## Current Status
- `services/core/` is a Mattermost `v11.4.2` based server core and compose runtime.
- `services/core/` is the messaging server core and compose runtime.
- `packages/messaging_flutter/` is an Android-first Flutter push-notification plugin.
- `apps/client/` is the Flutter client and integration test host for the plugin.
- The plugin public package name remains `mattermost_push_plugin` for compatibility.
- Public package, import, and native identifiers are being moved to Nexo-owned names.
- iOS and macOS plugin scaffolds exist, but Android is the current implementation target.
## Quick Start
@ -65,7 +65,7 @@ any skipped checks in work reports.
| Path | Role |
| --- | --- |
| `services/core/` | Mattermost `v11.4.2` based messaging server core, webapp, and API docs |
| `services/core/` | Messaging server core, webapp, and API docs |
| `services/core/compose/` | Compose setup for core, Postgres, and push-proxy |
| `packages/messaging_flutter/` | Flutter push notification and messaging plugin |
| `apps/client/` | Flutter client and integration test host |

View file

@ -2,8 +2,8 @@
## 전체 목표
`nexo`Mattermost 기반 메시징 코어에서 검증된 서버/푸시 런타임을 계승하되,
제품 표면과 개발 경계는 독립적인 메시징/알림 서비스로 정리한다.
`nexo`메시지 전체와 알림을 포괄하는 독립 메시징/알림 서비스로 정리한다.
현재 서버/푸시 런타임은 검증 가능한 단위로 유지하되, 제품 표면과 개발 경계는 nexo가 소유한다.
최종 형태는 서버 코어, Flutter 클라이언트, Flutter 플러그인이 한 세트로 움직이며,
여러 앱이 표준화된 메시징 채널과 알림 파이프라인을 사용할 수 있는 서비스다.
@ -22,7 +22,7 @@
- 요약: 플러그인과 서버가 공유할 메시징/알림 계약, 테스트, 앱별 사용 채널 모델을 정리한다.
- [스케치] 독립 서비스화
- 경로: `agent-ops/roadmap/phase/independent-service/PHASE.md`
- 요약: Mattermost 호환 코어를 유지하되 제품 표면, 운영 방식, 불필요 기능을 nexo 목적에 맞게 분리한다.
- 요약: 서버 코어의 제품 표면, 운영 방식, 불필요 기능을 nexo 목적에 맞게 분리한다.
## 로딩 정책

View file

@ -6,7 +6,7 @@
## 목표
nexo가 Mattermost 기반 코어를 사용한다는 구현 사실과, 사용자에게 제공하는 독립 메시징/알림 서비스라는 제품 표면을 분리한다.
nexo가 사용자에게 제공하는 독립 메시징/알림 서비스라는 제품 표면을 서버 구현 세부와 분리한다.
장기적으로는 필요한 메시징 코어만 유지하고 불필요한 UI, 운영 기능, 이름, 문서 표면을 nexo 목적에 맞게 줄인다.
## Milestone 흐름
@ -17,7 +17,7 @@ nexo가 Mattermost 기반 코어를 사용한다는 구현 사실과, 사용자
- [스케치] 서버 코어 독립화 경계
- 경로: `agent-ops/roadmap/phase/independent-service/milestones/core-independence.md`
- 요약: Mattermost core에서 계승할 기능과 제거/숨김/대체할 기능의 경계를 정한다.
- 요약: 서버 core에서 유지할 기능과 제거/숨김/대체할 기능의 경계를 정한다.
- [스케치] 제품화와 운영 모델
- 경로: `agent-ops/roadmap/phase/independent-service/milestones/product-operations.md`
- 요약: nexo를 별도 서비스로 배포, 운영, 확장하기 위한 제품/운영 단위를 검토한다.
@ -25,5 +25,5 @@ nexo가 Mattermost 기반 코어를 사용한다는 구현 사실과, 사용자
## Phase 경계
- 이 Phase는 아직 구현 계획이 아니라 장기 방향성 정리 단계다.
- Mattermost upstream과의 비교 가능성을 잃는 대규모 변경은 경계 결정 전 진행하지 않는다.
- upstream과의 비교 가능성을 잃는 대규모 변경은 경계 결정 전 진행하지 않는다.
- 사용자가 보는 제품 표면을 우선 분리하고, 내부 compatibility layer는 필요한 만큼 유지한다.

View file

@ -7,7 +7,7 @@
## 목표
Mattermost core에서 nexo가 계승할 메시징 기능과 제거, 숨김, 대체할 기능의 경계를 정한다.
nexo 서버 core에서 유지할 메시징 기능과 제거, 숨김, 대체할 기능의 경계를 정한다.
이 결정은 서버 fork 비용과 upstream 추적 가능성에 직접 영향을 주므로 먼저 스케치로 유지한다.
## 상태
@ -17,7 +17,7 @@ Mattermost core에서 nexo가 계승할 메시징 기능과 제거, 숨김, 대
## 승격 조건
- [ ] nexo가 반드시 유지해야 할 core 기능 목록을 정한다.
- [ ] 제거하거나 숨길 Mattermost 기능 목록을 정한다.
- [ ] 제거하거나 숨길 서버 기능 목록을 정한다.
- [ ] upstream merge 가능성을 유지할지, 독립 fork로 갈지 기준을 정한다.
- [ ] 서버 이미지 빌드 방식을 official image 사용, source build, custom image 중 하나로 결정한다.
@ -25,7 +25,7 @@ Mattermost core에서 nexo가 계승할 메시징 기능과 제거, 숨김, 대
- 상태: 잠금
- 결정 필요:
- [ ] Mattermost upstream 추적 가능성을 어느 정도까지 유지할지 결정한다.
- [ ] upstream 추적 가능성을 어느 정도까지 유지할지 결정한다.
- [ ] 웹앱을 유지할지, admin/debug 표면으로만 둘지, 제거할지 결정한다.
- [ ] nexo 서버 이미지를 언제 자체 빌드로 전환할지 결정한다.
@ -40,7 +40,7 @@ Mattermost core에서 nexo가 계승할 메시징 기능과 제거, 숨김, 대
### Epic: [inheritance] 계승 경계
nexo가 Mattermost core에서 계속 가져갈 기능을 정의한다.
nexo가 서버 core에서 계속 가져갈 기능을 정의한다.
- [ ] [keep-list] 메시징, channel, user/session, push 관련 유지 기능 목록을 정리한다.
- [ ] [remove-list] nexo 목적과 맞지 않는 기능의 제거/숨김/보류 후보를 정리한다.
@ -72,7 +72,7 @@ official image에서 custom image로 넘어갈 조건을 정리한다.
## 작업 컨텍스트
- 관련 경로: `services/core/`, `services/core/UPSTREAM.md`, `services/core/compose/`
- 표준선(선택): 검증된 Mattermost core를 유지하면서 nexo 제품 표면부터 분리한다
- 표준선(선택): 검증된 서버 core를 유지하면서 nexo 제품 표면부터 분리한다
- 선행 작업: 메시징 런타임 표준화
- 후속 작업: 제품화와 운영 모델
- 확인 필요: upstream 추적 정책, webapp 처리, server image 전환 시점

View file

@ -8,7 +8,7 @@
## 목표
서버 core와 Flutter 플러그인이 주고받는 메시지, 알림, device token, ACK, navigation event 계약을 정리한다.
초기에는 기존 Mattermost-compatible 계약을 유지하되, nexo가 소유할 API와 compatibility layer를 구분한다.
초기에는 기존 서버/플러그인 계약을 유지하되, nexo가 소유할 API와 compatibility layer를 구분한다.
## 상태
@ -22,7 +22,7 @@
- 상태: 잠금
- 결정 필요:
- [ ] nexo public API를 Mattermost-compatible 형태로 유지할지, nexo wrapper API를 먼저 만들지 결정한다.
- [ ] nexo public API를 기존 호환 형태로 유지할지, nexo wrapper API를 먼저 만들지 결정한다.
- [ ] 메시징 전체 기능 중 Flutter 앱에 우선 노출할 범위를 결정한다.
## 범위

View file

@ -6,7 +6,7 @@
## 목표
nexo를 기존 기술명에 종속된 클론이 아니라 독립적인 메시징/알림 서비스로 정의한다.
nexo를 메시지 전체와 알림을 포괄하는 독립적인 메시징/알림 서비스로 정의한다.
모노레포 구조, core compose, client 검증 흐름, agent-ops 진입 규칙을 정리해 이후 기능 작업이 같은 기준선 위에서 진행되도록 만든다.
## Milestone 흐름
@ -17,7 +17,7 @@ nexo를 기존 기술명에 종속된 클론이 아니라 독립적인 메시징
- [진행중] 정체성 기준선
- 경로: `agent-ops/roadmap/phase/product-foundation/milestones/identity-baseline.md`
- 요약: 제품 이름, 모노레포 경계, 기존 Mattermost/Flutter 의존 표면을 어떤 방식으로 다룰지 문서화한다.
- 요약: 제품 이름, 메시징/알림 서비스 범위, project-owned naming의 nexo 전환 기준을 문서화한다.
- [계획] 운영 기준선
- 경로: `agent-ops/roadmap/phase/product-foundation/milestones/runtime-baseline.md`
- 요약: core compose, 원격 Docker 세팅, 환경 변수, 최소 health check를 안정된 기준선으로 만든다.

View file

@ -44,7 +44,7 @@ client 앱을 플러그인 통합 검증에 필요한 만큼만 유지한다.
자동화하기 어려운 FCM과 서버 ACK 검증을 수동 체크로 분리한다.
- [ ] [fcm-manual] 실제 Firebase FCM delivery와 Mattermost-compatible ACK 검증 절차를 문서화한다.
- [ ] [fcm-manual] 실제 Firebase FCM delivery와 서버 ACK 검증 절차를 문서화한다.
- [ ] [remote-guide] 로컬 Android SDK가 없을 때 원격 테스트 환경 문서가 client README와 연결되도록 유지한다.
## 완료 리뷰

View file

@ -7,8 +7,8 @@
## 목표
이 Milestone은 nexo의 제품 정체성을 "Mattermost 클론"이 아니라 독립 메시징/알림 서비스로 고정한다.
기술적으로는 Mattermost 코어와 Flutter 플러그인을 활용하되, 문서와 작업 경계는 nexo 고유 서비스 기준으로 정리한다.
이 Milestone은 nexo의 제품 정체성을 독립 메시징/알림 서비스로 고정한다.
알림은 메시징 서비스의 하위 경험으로 다루고, 문서, 설정, 코드의 public/project-owned naming은 nexo 기준으로 맞춘다.
## 상태
@ -16,16 +16,20 @@
## 구현 잠금
- 상태: 잠금
- 상태: 해제
- 결정 필요:
- [ ] `mattermost_push_plugin` public package name을 언제 nexo 계열 이름으로 바꿀지 결정한다.
- [ ] 외부 앱이 처음 붙을 때 nexo가 제공할 최소 제품 표면을 "알림 중심"으로 둘지 "메시징 전체"까지 열지 결정한다.
- [ ] 사용자에게 노출되는 Mattermost 관련 이름과 내부 호환 이름의 분리 기준을 결정한다.
- 없음
- 결정 완료:
- [x] 2026-05-26: public package name과 사용자/프로젝트 소유 네이밍은 지금 nexo 계열 이름으로 전환한다.
- [x] 2026-05-26: 제품 표면은 알림 중심이 아니라 메시지 전체를 포함하는 메시징/알림 서비스로 둔다.
- [x] 2026-05-26: 기존 upstream/vendor 명칭은 최종 프로젝트 표면에 남기지 않는 것을 목표로 하며, 가능한 범위에서 코드 내 project-owned naming까지 교체 대상으로 본다.
## 범위
- 제품명 `nexo`와 모노레포 정체성 정리
- 기존 기술 의존 표면과 장기 독립화 방향 기록
- 메시지 전체와 알림을 포괄하는 서비스 범위 정리
- 기존 기술 의존 표면과 nexo naming 전환 방향 기록
- public 문서, 설정, package/import/native package 등 project-owned code naming의 전환 범위 정리
- `agent-ops` 진입 규칙, README, roadmap 사이의 역할 분리
- 현재 구조에서 유지할 모듈 경계 정리
@ -33,10 +37,11 @@
### Epic: [identity] 제품 정체성
nexo가 제공하려는 서비스의 방향과 기존 기술을 대하는 방식을 문서 기준선으로 만든다.
nexo가 제공하려는 서비스의 방향과 기존 기술을 대하는 방식을 문서와 네이밍 기준선으로 만든다.
- [ ] [product-story] nexo를 독립 메시징/알림 서비스로 설명하는 문서 표현을 README, roadmap, domain rule에서 일관되게 유지한다. 검증: 관련 문서에서 제품 목표와 모듈 경계가 충돌하지 않는다.
- [ ] [tech-boundary] Mattermost와 Flutter 관련 용어를 public product identity와 implementation detail로 구분하는 기준을 정리한다.
- [ ] [product-story] nexo를 메시지 전체와 알림을 포괄하는 독립 메시징/알림 서비스로 설명하는 문서 표현을 README, roadmap, domain rule에서 일관되게 유지한다. 검증: 관련 문서에서 제품 목표와 모듈 경계가 충돌하지 않는다.
- [ ] [tech-boundary] 기존 upstream/vendor 명칭을 public product identity에서 제거하고, project-owned 문서/설정/코드 naming의 nexo 전환 기준을 정리한다.
- [ ] [nexo-rename] package/import/native package 등 project-owned code identifier를 nexo 계열 이름으로 전환할 범위와 실행 순서를 정리한다. 검증: repo scan에서 기존 upstream/vendor 명칭이 허용된 compatibility context에만 남는다.
- [ ] [module-shape] 최상위 구조를 `apps/client`, `packages/messaging_flutter`, `services/core` 중심으로 유지하고 과한 scaffold를 만들지 않는 원칙을 문서화한다.
### Epic: [agent-entry] 작업 진입점
@ -58,14 +63,14 @@ AI 에이전트와 사람이 같은 규칙으로 프로젝트에 들어오도록
## 범위 제외
- 실제 package rename, import rename, native package rename은 이 Milestone에서 수행하지 않는다.
- 서버 코드에서 Mattermost 표면을 제거하는 작업은 독립 서비스화 Phase에서 다룬다.
- 프로토콜, 데이터 모델, 인증, 서버 기능 삭제처럼 동작을 바꾸는 독립 서비스화 작업은 이 Milestone에서 수행하지 않는다.
- 외부 호환을 위해 즉시 제거할 수 없는 upstream/vendor 문자열은 허용 근거와 후속 제거 위치를 남긴다.
- 별도 contract 패키지나 infra 모듈은 만들지 않는다.
## 작업 컨텍스트
- 관련 경로: `README.md`, `AGENTS.md`, `agent-ops/rules/project/rules.md`, `agent-ops/roadmap/`
- 표준선(선택): 제품명은 `nexo`, public plugin package name은 결정 전까지 `mattermost_push_plugin` 유지
- 관련 경로: `README.md`, `AGENTS.md`, `agent-ops/rules/project/rules.md`, `agent-ops/rules/project/domain/`, `agent-ops/roadmap/`, `packages/messaging_flutter/`, `apps/client/`, `services/core/`
- 표준선(선택): 제품명은 `nexo`, 제품 표면은 메시지 전체를 포함하는 메시징/알림 서비스, public/project-owned naming은 nexo 계열로 전환
- 선행 작업: 기존 monorepo migration과 README 보완
- 후속 작업: 운영 기준선, 메시징 계약 표준화
- 확인 필요: public package rename 시점과 사용자 노출 이름 분리 기준
- 확인 필요: 없음

View file

@ -8,7 +8,7 @@
## 목표
core compose와 원격 Docker 세팅을 nexo의 반복 가능한 테스트 런타임으로 고정한다.
기존 Mattermost 기반 서버를 유지하되 nexo용 포트, 환경 변수, 데이터 경로, push-proxy 설정을 명확히 분리한다.
nexo용 포트, 환경 변수, 데이터 경로, push-proxy 설정을 명확히 분리한다.
## 상태
@ -62,7 +62,7 @@ local과 원격 Docker에서 같은 shape로 서버 런타임을 올릴 수 있
## 범위 제외
- nginx/domain 연결, TLS, production hardening은 이 Milestone의 필수 범위가 아니다.
- Mattermost 서버 이미지를 nexo 자체 빌드 이미지로 바꾸는 작업은 별도 결정 후 진행한다.
- 서버 이미지를 nexo 자체 빌드 이미지로 바꾸는 작업은 별도 결정 후 진행한다.
- 기존 운영 중인 다른 compose 서비스와의 병합은 이 Milestone에서 자동으로 하지 않는다.
## 작업 컨텍스트

View file

@ -8,7 +8,7 @@ last_rule_updated_at: 2026-05-26
## 목적 / 책임
Flutter 클라이언트와 `mattermost_push_plugin`의 독립 소비 앱, 통합 테스트 호스트를 담당한다. 실제 제품 앱으로 확장되기 전에도 plugin integration이 깨지지 않는지 확인하는 기준점이다.
Flutter 클라이언트와 nexo 메시징 플러그인의 독립 소비 앱, 통합 테스트 호스트를 담당한다. 실제 제품 앱으로 확장되기 전에도 plugin integration이 깨지지 않는지 확인하는 기준점이다.
## 포함 경로
@ -27,7 +27,7 @@ Flutter 클라이언트와 `mattermost_push_plugin`의 독립 소비 앱, 통합
## 주요 구성 요소
- `MyApp` — plugin event stream과 navigation callback을 표시하는 host app shell
- `MattermostPushPlugin.instance` — app이 소비하는 plugin singleton
- plugin singleton — app이 소비하는 plugin public API
- `plugin_integration_test.dart` — plugin integration behavior 검증 진입점
## 유지할 패턴

View file

@ -8,12 +8,12 @@ last_rule_updated_at: 2026-05-26
## 목적 / 책임
Mattermost 기반 메시징 서버 코어와 관련 웹앱, API 문서, 로컬 compose 실행 환경을 담당한다. upstream baseline과 비교 가능한 상태를 유지하는 것이 중요하다.
nexo 메시징 서버 코어와 관련 웹앱, API 문서, 로컬 compose 실행 환경을 담당한다. upstream baseline과 비교 가능한 상태를 유지하는 것이 중요하다.
## 포함 경로
- `services/core/server/` — Go 기반 Mattermost server module
- `services/core/webapp/`Mattermost webapp, platform packages, frontend tooling
- `services/core/server/` — Go 기반 messaging server module
- `services/core/webapp/` — webapp, platform packages, frontend tooling
- `services/core/api/` — API reference tooling
- `services/core/compose/` — local core runtime Docker Compose
- `services/core/e2e-tests/`, `services/core/tools/` — core 검증 및 보조 도구
@ -27,14 +27,14 @@ Mattermost 기반 메시징 서버 코어와 관련 웹앱, API 문서, 로컬 c
## 주요 구성 요소
- `services/core/server/go.mod`Mattermost server Go module 기준
- `services/core/server/go.mod` — server Go module 기준
- `services/core/webapp/package.json` — webapp npm workspace 기준
- `services/core/api/package.json` — API reference tooling 기준
- `services/core/compose/docker-compose.yml` — local core 서비스 구성
## 유지할 패턴
- Mattermost upstream에서 온 구조와 명명은 필요한 경우에만 변경한다.
- upstream에서 온 구조와 명명은 필요한 경우에만 변경한다.
- 제품 특화 변경은 좁은 파일 범위로 유지하고, upstream 재동기화를 방해하지 않게 설명 가능한 단위로 남긴다.
- Go 검증은 기본 `bin/test`에서 skip되며, 필요할 때 `NEXO_CORE_GO_TEST=1` 등 명시적 플래그로 실행한다.
- webapp 변경은 기존 npm workspace와 package script를 따른다.

View file

@ -8,7 +8,7 @@ last_rule_updated_at: 2026-05-26
## 목적 / 책임
Mattermost 호환 푸시 알림 Flutter 플러그인을 담당한다. FCM 수신, 알림 표시, tap/open 이벤트, inline reply, dismiss 처리, ACK 전달, token/key 저장을 앱별 구현으로 흩어지지 않게 모은다.
nexo 메시징/알림 Flutter 플러그인을 담당한다. FCM 수신, 알림 표시, tap/open 이벤트, inline reply, dismiss 처리, ACK 전달, token/key 저장을 앱별 구현으로 흩어지지 않게 모은다.
## 포함 경로
@ -27,15 +27,15 @@ Mattermost 호환 푸시 알림 Flutter 플러그인을 담당한다. FCM 수신
## 주요 구성 요소
- `MattermostPushPlugin` — singleton public API, event stream, token/key action channel
- plugin public API — singleton access, event stream, token/key action channel
- `NotificationOpenedEvent` — notification open payload parsing
- `MattermostFirebaseMessagingService` — Android FCM 수신 진입점
- Android FCM service — Android FCM 수신 진입점
- `NotificationReplyBroadcastReceiver`, `NotificationDismissService` — Android action handling
- `ReceiptDelivery` — ACK delivery 책임
## 유지할 패턴
- public import는 `package:mattermost_push_plugin/mattermost_push_plugin.dart` 경로를 유지한다.
- public package/import/native identifier는 nexo 계열 이름으로 전환하되, host app과 native 등록 지점을 같은 계획 안에서 함께 갱신한다.
- Android가 production target이며 iOS/macOS는 stub 상태임을 명확히 보고한다.
- host app이 해야 할 Firebase 초기화, token 등록, navigation 연결은 README의 Host App Responsibilities와 맞춘다.
- native event type은 Dart API의 `PushNotificationType`과 호환되게 유지한다.
@ -48,6 +48,6 @@ Mattermost 호환 푸시 알림 Flutter 플러그인을 담당한다. FCM 수신
## 금지 사항
- package rename이나 public API breaking change를 사용자 결정 없이 수행하지 않는다.
- package rename이나 public API breaking change는 현재 마일스톤의 nexo 전환 결정과 계획에 맞춰 수행한다.
- host app 전용 navigation, 화면 구성, 제품 UI 상태를 plugin 내부에 넣지 않는다.
- iOS/macOS stub을 production-ready로 단정하지 않는다.

View file

@ -11,8 +11,8 @@
주요 경계는 다음과 같다.
- `services/core/`Mattermost `v11.4.2` 기반 메시징 서버 코어, 웹앱, API 문서, compose 환경
- `packages/messaging_flutter/`Mattermost 호환 푸시 알림 Flutter 플러그인
- `services/core/`nexo 메시징 서버 코어, 웹앱, API 문서, compose 환경
- `packages/messaging_flutter/`nexo 메시징/알림 Flutter 플러그인
- `apps/client/` — 플러그인을 검증하는 Flutter 클라이언트와 통합 테스트 호스트
- `docs/`, `bin/` — 워크스페이스 공통 문서와 helper entrypoint
@ -21,15 +21,15 @@
- Flutter / Dart `sdk: ^3.11.3`
- Android native plugin: Kotlin, Java, Gradle
- iOS / macOS plugin scaffold: Swift
- Server core: Go `1.24.13`, Mattermost server module
- Server core: Go `1.24.13`, messaging server module
- Webapp / API tooling: Node.js, npm workspaces, TypeScript, Redocly
- Local runtime: Docker Compose under `services/core/compose/`
## 작업 원칙
- `services/core/`Mattermost upstream fork 성격이 강하므로 제품 특화 변경은 작고 비교 가능하게 유지한다.
- `services/core/`upstream 계승 구조가 크므로 제품 특화 변경은 작고 비교 가능하게 유지한다.
- `services/core/UPSTREAM.md`의 baseline 정보를 임의로 바꾸지 않는다.
- Flutter 플러그인의 public package name은 현재 `mattermost_push_plugin`이며, 소비 앱과 호환성이 걸려 있으므로 rename은 별도 결정 없이 하지 않는다.
- Flutter 플러그인의 public package/import/native identifier는 nexo 계열 이름으로 전환한다. 전환은 소비 앱과 native 등록 지점을 함께 다루는 계획 작업으로 진행한다.
- 푸시 알림 처리 책임은 `packages/messaging_flutter/`에 두고, `apps/client/`에는 검증과 host integration만 둔다.
- `apps/client/`는 독립 소비 앱 역할을 하므로 플러그인 내부 동작을 복제하지 않는다.
- `build/`, `.dart_tool/`, Android/iOS/macOS 생성물, upstream bulk 파일은 요청 범위 밖이면 건드리지 않는다.