refactor: rename apps/mobile to apps/client and update project structure

- Rename mobile app directory to client throughout the project
- Restructure client app code into feature-based organization
  - Move code to src/features/workspaces/domain/presentation
  - Move services to src/integrations/ (mattermost, workspace, proto_socket)
  - Add app bootstrap and main entry point
- Add push notification integration (Mattermost push client/host/plugin)
- Add proto socket integration for real-time communication
- Add integration tests for push and socket components
- Archive old milestone: client-integration-standardization.md
- Add new workflow core milestone: roadmap-driven-agent-ops-automation.md
- Update agent-ops rules (project, core, mobile, contracts, workspace-ops)
- Update roadmap files (ROADMAP.md, current.md, phase PHASE.md files)
- Update bin scripts (build, dev, lint, test)
- Add test environments documentation
- Update contracts notes for Flutter Core API
This commit is contained in:
toki 2026-05-25 22:10:43 +09:00
parent 3dd5f5de2e
commit 217c17dfef
196 changed files with 1295 additions and 280 deletions

View file

@ -7,7 +7,7 @@ NomadCode는 IOP를 사용하는 개발 워크플로우 셸입니다. 사용자
## 현재 상태 ## 현재 상태
- `services/core`는 health/readiness endpoint, task API, PostgreSQL persistence, goose migration, sqlc query 생성 구조, River job, IOP OpenAI-compatible Responses client 경로, 향후 A2A agent delegation scaffolding, Plane/Mattermost adapter stub을 포함합니다. - `services/core`는 health/readiness endpoint, task API, PostgreSQL persistence, goose migration, sqlc query 생성 구조, River job, IOP OpenAI-compatible Responses client 경로, 향후 A2A agent delegation scaffolding, Plane/Mattermost adapter stub을 포함합니다.
- `apps/mobile`은 NomadCode 제품 UI의 기준 Flutter 앱이며 모바일/데스크톱/선택적 web target, Firebase Messaging, local notifications, HTTP client 의존성을 포함합니다. - `apps/client`는 NomadCode 제품 UI의 기준 Flutter 앱이며 모바일/데스크톱/선택적 web target, Firebase Messaging, local notifications, HTTP client 의존성을 포함합니다.
- `apps/web`은 이전 React/Vite 운영 콘솔 scaffold였으며, Flutter-first 통합에 따라 완전히 폐기 및 제거되었습니다. - `apps/web`은 이전 React/Vite 운영 콘솔 scaffold였으며, Flutter-first 통합에 따라 완전히 폐기 및 제거되었습니다.
- `packages/contracts`는 향후 OpenAPI, protobuf, generated client, fixture, compatibility asset을 담을 공유 계약 공간입니다. - `packages/contracts`는 향후 OpenAPI, protobuf, generated client, fixture, compatibility asset을 담을 공유 계약 공간입니다.
- 활성 계획과 Milestone 상태는 `agent-ops/roadmap/`에서 관리합니다. README에는 현재 작업 상태를 복사하지 않고 진입 문서만 연결합니다. - 활성 계획과 Milestone 상태는 `agent-ops/roadmap/`에서 관리합니다. README에는 현재 작업 상태를 복사하지 않고 진입 문서만 연결합니다.
@ -56,7 +56,7 @@ cd services/core
Flutter 앱을 실행합니다. Flutter 앱을 실행합니다.
```bash ```bash
cd apps/mobile cd apps/client
flutter pub get flutter pub get
flutter run flutter run
``` ```
@ -73,14 +73,14 @@ flutter run
| core DB migration | `cd services/core && ./bin/migrate-up` | goose로 PostgreSQL migration을 적용합니다. | | core DB migration | `cd services/core && ./bin/migrate-up` | goose로 PostgreSQL migration을 적용합니다. |
| core 테스트 | `cd services/core && ./bin/test` | `go test ./...` wrapper입니다. | | core 테스트 | `cd services/core && ./bin/test` | `go test ./...` wrapper입니다. |
| core build | `cd services/core && ./bin/build` | 기본 출력 경로는 `.build/nomadcode-core`입니다. | | core build | `cd services/core && ./bin/build` | 기본 출력 경로는 `.build/nomadcode-core`입니다. |
| mobile 테스트 | `cd apps/mobile && flutter test` | Flutter test suite입니다. | | client 테스트 | `cd apps/client && flutter test` | Flutter test suite입니다. |
## 구조 ## 구조
| 경로 | 역할 | | 경로 | 역할 |
|------|------| |------|------|
| `services/core/` | Go backend. orchestration, persistence, scheduling, HTTP API, 외부 service adapter를 담당합니다. | | `services/core/` | Go backend. orchestration, persistence, scheduling, HTTP API, 외부 service adapter를 담당합니다. |
| `apps/mobile/` | Flutter 기반 제품 UI source of truth, 모바일/데스크톱 클라이언트와 notification 연동 표면입니다. | | `apps/client/` | Flutter 기반 제품 UI source of truth, 모바일/데스크톱/선택적 web 클라이언트와 notification 연동 표면입니다. |
| `apps/web/` | [Legacy/Retired] React/Vite 운영 콘솔 scaffold입니다. Flutter-first 클라이언트 통합에 따라 완전히 폐기 및 제거되었습니다. | | `apps/web/` | [Legacy/Retired] React/Vite 운영 콘솔 scaffold입니다. Flutter-first 클라이언트 통합에 따라 완전히 폐기 및 제거되었습니다. |
| `packages/contracts/` | 서비스와 클라이언트가 공유할 API/schema 계약 공간입니다. | | `packages/contracts/` | 서비스와 클라이언트가 공유할 API/schema 계약 공간입니다. |
| `docs/` | 아키텍처와 운영 문서입니다. | | `docs/` | 아키텍처와 운영 문서입니다. |
@ -129,6 +129,6 @@ IOP 경계가 걸린 작업은 같은 workspace에 sibling IOP repository가 있
- `docs/monorepo.md` - `docs/monorepo.md`
- `services/core/README.md` - `services/core/README.md`
- `apps/mobile/README.md` - `apps/client/README.md`
- `packages/contracts/README.md` - `packages/contracts/README.md`
- `agent-ops/roadmap/current.md` - `agent-ops/roadmap/current.md`

View file

@ -4,7 +4,7 @@
NomadCode는 Flutter 기반 앱, core 서비스, 공유 계약, agent-operation 규칙을 하나의 원레포로 묶어 AI-assisted development workflow를 조율하는 프로젝트다. NomadCode는 Flutter 기반 앱, core 서비스, 공유 계약, agent-operation 규칙을 하나의 원레포로 묶어 AI-assisted development workflow를 조율하는 프로젝트다.
현재 로드맵은 `ROADMAP.md -> phase/<phase-slug>/PHASE.md -> phase/<phase-slug>/milestones/<milestone-slug>.md` scaffold를 기준으로 관리한다. React/Vite 웹 콘솔 제거, 서버/Plane/provider 기반 작업, Flutter-first 클라이언트 정리, Mattermost push plugin extraction은 완료되었다. 이후 client 표준화, core workflow 안정화, 외부 통합, Flutter-first 프로젝트 제어 UX를 이어간다. 현재 로드맵은 `ROADMAP.md -> phase/<phase-slug>/PHASE.md -> phase/<phase-slug>/milestones/<milestone-slug>.md` scaffold를 기준으로 관리한다. React/Vite 웹 콘솔 제거, 서버/Plane/provider 기반 작업, Flutter-first 클라이언트 정리, Mattermost push plugin extraction, client integration 표준화는 완료되었다. 이후 core workflow 안정화와 외부 통합을 먼저 정리하고, 실제 Flutter-first 프로젝트 제어 UX 구현은 가장 뒤로 미룬다.
## Phase 흐름 ## Phase 흐름
@ -27,15 +27,15 @@ NomadCode는 Flutter 기반 앱, core 서비스, 공유 계약, agent-operation
- [완료] Mattermost Push Plugin Extraction - [완료] Mattermost Push Plugin Extraction
- 경로: `agent-ops/roadmap/archive/phase/mattermost-push-plugin-extraction/PHASE.md` - 경로: `agent-ops/roadmap/archive/phase/mattermost-push-plugin-extraction/PHASE.md`
- 요약: Flutter 앱에 섞인 Mattermost push notification migration을 `../mattermost-push-plugin` Flutter plugin repo로 분리했다. - 요약: Flutter 앱에 섞인 Mattermost push notification migration을 `../mattermost-push-plugin` Flutter plugin repo로 분리했다.
- [진행중] Project Workspace Management UX
- 경로: `agent-ops/roadmap/phase/project-workspace-management-ux/PHASE.md`
- 요약: Flutter client 모듈명과 bootstrap, proto-socket, host integration 표준을 먼저 정리하고 이후 프로젝트 단위 제어 UX로 확장한다.
- [진행중] Workflow Core - [진행중] Workflow Core
- 경로: `agent-ops/roadmap/phase/workflow-core/PHASE.md` - 경로: `agent-ops/roadmap/phase/workflow-core/PHASE.md`
- 요약: 실제 e2e 흐름을 기준으로 task lifecycle, retry, timeout, notification event를 안정화한다. - 요약: 실제 e2e 흐름을 기준으로 task lifecycle, retry, timeout, notification event를 안정화한다.
- [계획] External Integration - [계획] External Integration
- 경로: `agent-ops/roadmap/phase/external-integration/PHASE.md` - 경로: `agent-ops/roadmap/phase/external-integration/PHASE.md`
- 요약: Plane 확장, Mattermost, Agent Integrator, IOP OpenAI API Responses-compatible 호출을 실제 통합 흐름으로 확장한다. - 요약: Plane 확장, Mattermost, Agent Integrator, IOP OpenAI API Responses-compatible 호출을 실제 통합 흐름으로 확장한다.
- [계획] Project Workspace Management UX
- 경로: `agent-ops/roadmap/phase/project-workspace-management-ux/PHASE.md`
- 요약: client integration 표준화는 완료했고, 실제 프로젝트 단위 앱 UX 구현은 core workflow와 외부 통합 기준 이후로 미룬다.
## 로딩 정책 ## 로딩 정책

View file

@ -7,11 +7,11 @@
## 목표 ## 목표
NomadCode Flutter client를 `../iop``../alt`에 복제 가능한 기준 구현으로 정리한다. `apps/client` 모듈명, Web + Android 우선 Dart bootstrap, proto-socket, Mattermost push host integration, cloning handoff 문서를 먼저 표준화하고 iOS는 같은 Dart API 위에 확장 가능한 후속 대상으로 남긴다. NomadCode Flutter client를 `../iop``../alt`에 복제 가능한 기준 구현으로 정리한다. `apps/client` 모듈명, Web + Android 우선 Dart bootstrap, proto-socket, Mattermost push host integration, cloning handoff 문서를 먼저 표준화한다. iOS native 확장은 이번 범위에서 제외하고 후속 대상으로 남긴다.
## 상태 ## 상태
[진행중] [완료]
## 구현 잠금 ## 구현 잠금
@ -20,12 +20,12 @@ NomadCode Flutter client를 `../iop`와 `../alt`에 복제 가능한 기준 구
## 범위 ## 범위
- `apps/mobile``apps/client` 기준 구조로 정리하거나 동등한 client 모듈 표준을 명확히 문서화 - Flutter host를 `apps/client` 기준 구조로 정리하고 동등한 client 모듈 표준을 명확히 문서화
- web/mobile 공통 Dart bootstrap 계층 정리 - web/mobile 공통 Dart bootstrap 계층 정리
- proto-socket Dart client 설정, connection bootstrap, 환경 주입 기준 정리 - proto-socket Dart client 설정, connection bootstrap, 환경 주입 기준 정리
- Mattermost push host integration 표준화 - Mattermost push host integration 표준화
- Firebase host 설정과 plugin 초기화 책임 경계 정리 - Firebase host 설정과 plugin 초기화 책임 경계 정리
- Web과 Android를 1차 target으로 검증하고 iOS 확장 지점을 명확히 문서화 - Web과 Android를 1차 target으로 검증하고 iOS native 확장은 이번 범위 제외로 명시
- `../iop`, `../alt`로 복제할 client skeleton, integration boundary, handoff 체크리스트 작성 - `../iop`, `../alt`로 복제할 client skeleton, integration boundary, handoff 체크리스트 작성
## 필수 기능 ## 필수 기능
@ -34,61 +34,71 @@ NomadCode Flutter client를 `../iop`와 `../alt`에 복제 가능한 기준 구
NomadCode client를 다른 프로젝트가 따라올 수 있는 구조 기준으로 정리한다. NomadCode client를 다른 프로젝트가 따라올 수 있는 구조 기준으로 정리한다.
- [ ] [module-name] Flutter host 모듈명을 `client` 기준으로 정리하고 package/app 표시 이름의 프로젝트별 유지 기준을 문서화한다. - [x] [module-name] Flutter host 모듈명을 `client` 기준으로 정리하고 package/app 표시 이름의 프로젝트별 유지 기준을 문서화한다.
- [ ] [bootstrap] web/mobile 공통 Dart bootstrap과 platform-specific 초기화 guard를 정의한다. - [x] [bootstrap] web/mobile 공통 Dart bootstrap과 platform-specific 초기화 guard를 정의한다.
- [ ] [folder-layout] `src/app`, `src/integrations`, `src/features` 기준의 client skeleton을 정리한다. - [x] [folder-layout] `src/app`, `src/integrations`, `src/features` 기준의 client skeleton을 정리한다.
### Epic: [integration-standard] Integration boundaries ### Epic: [integration-standard] Integration boundaries
proto-socket과 Mattermost push를 같은 client integration 방식으로 소비하도록 표준화한다. proto-socket과 Mattermost push를 같은 client integration 방식으로 소비하도록 표준화한다.
- [ ] [proto-socket] proto-socket Dart dependency, endpoint configuration, connection lifecycle 기준을 client integration으로 정리한다. - [x] [proto-socket] proto-socket Dart dependency, endpoint configuration, connection lifecycle 기준을 client integration으로 정리한다.
- [ ] [mattermost-push] Mattermost push는 plugin이 runtime을 소유하고 host는 Firebase config, auth/token/signing key, routing callback만 소유하도록 정리한다. - [x] [mattermost-push] Mattermost push는 plugin이 runtime을 소유하고 host는 Firebase config, auth/token/signing key, routing callback만 소유하도록 정리한다.
- [ ] [platform-targets] Web과 Android를 1차 target으로 검증하고 iOS는 동일 Dart API 위의 후속 native 확장 지점으로 남긴다. - [x] [platform-targets] Web과 Android를 1차 target으로 검증하고 iOS native 확장은 이번 범위 제외로 남긴다.
### Epic: [clone-handoff] Clone handoff ### Epic: [clone-handoff] Clone handoff
`../iop``../alt`가 같은 수준으로 따라올 수 있도록 복제 단위와 차이를 문서화한다. `../iop``../alt`가 같은 수준으로 따라올 수 있도록 복제 단위와 차이를 문서화한다.
- [ ] [clone-notes] `../iop``../alt`에 전달할 cloning checklist와 프로젝트별 치환 항목을 작성한다. - [x] [clone-notes] `../iop``../alt`에 전달할 cloning checklist와 프로젝트별 치환 항목을 작성한다.
- [ ] [iop-naming] `../iop`에서는 Portal 명칭을 강조하지 않고 `client` 모듈과 IOP product surface 기준으로 정리한다. - [x] [iop-naming] `../iop`에서는 Portal 명칭을 강조하지 않고 `client` 모듈과 IOP product surface 기준으로 정리한다.
- [ ] [alt-alignment] `../alt`의 기존 `apps/client` 구조와 Riverpod/go_router 경계를 유지하면서 공통 integration skeleton만 맞추는 기준을 작성한다. - [x] [alt-alignment] `../alt`의 기존 `apps/client` 구조와 Riverpod/go_router 경계를 유지하면서 공통 integration skeleton만 맞추는 기준을 작성한다.
## 완료 기준 ## 완료 기준
- [ ] NomadCode Flutter host가 client 표준 구조와 명명 기준을 따른다. - [x] NomadCode Flutter host가 client 표준 구조와 명명 기준을 따른다.
- [ ] Web build와 Android integration이 같은 Dart bootstrap 기준에서 설명되고 검증된다. - [x] Web build와 Android integration이 같은 Dart bootstrap 기준에서 설명되고 검증된다.
- [ ] proto-socket과 Mattermost push integration의 책임 경계가 host/plugin/server 사이에서 충돌 없이 설명된다. - [x] proto-socket과 Mattermost push integration의 책임 경계가 host/plugin/server 사이에서 충돌 없이 설명된다.
- [ ] iOS가 Android-only 예외가 아니라 동일 Dart API 위의 후속 확장 대상으로 문서화된다. - [x] iOS native 확장이 이번 범위 제외이며 후속 대상으로 남는다는 점이 문서화된다.
- [ ] `../iop``../alt`에 클로닝할 파일/구조/설정/문서 체크리스트가 남아 있다. - [x] `../iop``../alt`에 클로닝할 파일/구조/설정/문서 체크리스트가 남아 있다.
- [ ] `apps/client` 또는 현행 client host에서 `flutter test`와 필요한 analyze/build 검증이 통과하거나 환경 제약이 명확히 기록된다. - [x] `apps/client` 또는 현행 client host에서 `flutter test`와 필요한 analyze/build 검증이 통과하거나 환경 제약이 명확히 기록된다.
## 완료 리뷰 ## 완료 리뷰
- 상태: 없음 - 상태: 승인됨
- 요청일: 없음 - 요청일: 2026-05-25
- 완료 근거: 없음 - 완료 근거:
- `apps/client` 구조, bootstrap, proto-socket, Mattermost push host boundary, clone handoff 문서가 정리되었다.
- 로컬에서 `flutter test`, `flutter analyze --no-fatal-infos`, `flutter build web`가 통과했다.
- `ssh toki@toki-labs.com`의 공용 Android SDK 환경에서 `flutter build apk --debug`가 통과했다.
- 리뷰 필요: - 리뷰 필요:
- [ ] 사용자가 완료 결과를 확인했다 - [x] 사용자가 완료 결과를 확인했다
- [ ] archive 이동을 승인했다 - [x] archive 이동을 승인했다
- 리뷰 코멘트: 없음 - 리뷰 코멘트: 2026-05-25 사용자 확인에 따라 완료 전환 및 archive 이동을 승인했다.
## 범위 제외 ## 범위 제외
- `../iop`, `../alt` 코드 변경 직접 반영 - `../iop`, `../alt` 코드 변경 직접 반영
- Mattermost push plugin 자체의 native runtime 대규모 재작성 - Mattermost push plugin 자체의 native runtime 대규모 재작성
- iOS native push full implementation - iOS native push full implementation과 iOS target 검증
- 각 프로젝트의 제품별 feature 화면을 동일하게 복제 - 각 프로젝트의 제품별 feature 화면을 동일하게 복제
- IOP 내부 모델 라우팅, ALT quant feature, NomadCode project UX 상세 화면 확정 - IOP 내부 모델 라우팅, ALT quant feature, NomadCode project UX 상세 화면 확정
## 작업 컨텍스트 ## 작업 컨텍스트
- 관련 경로: `apps/mobile/`, `packages/contracts/`, `docs/`, `README.md`, `../mattermost-push-plugin/` - 관련 경로: `apps/client/`, `packages/contracts/`, `docs/`, `README.md`, `../mattermost-push-plugin/`, `../../../proto-socket/dart`
- 클로닝 대상: `../iop/apps/client`, `../alt/apps/client` - 클로닝 대상: `../iop/apps/client`, `../alt/apps/client`
- 표준선(선택): repo별 Flutter host 경로는 `apps/client`로 맞추고, Dart package/app 표시 이름은 프로젝트 정체성을 유지한다. - 표준선(선택): repo별 Flutter host 경로는 `apps/client`로 맞추고, Dart package/app 표시 이름은 프로젝트 정체성을 유지한다.
- 표준선(선택): `mattermost_push_plugin`은 별도 plugin 이름을 유지하고, host app은 plugin consumer 책임만 갖는다. - 표준선(선택): `mattermost_push_plugin`은 별도 plugin 이름을 유지하고, host app은 plugin consumer 책임만 갖는다.
- 표준선(선택): Web과 Android를 1차 target으로 두며, iOS는 같은 Dart API와 integration boundary 위에서 후속 native implementation으로 확장한다. - 표준선(선택): Web과 Android를 1차 target으로 두며, iOS native implementation과 iOS target 검증은 후속 범위로 분리한다.
- 표준선(선택): `../iop`는 Portal 명칭을 강조하지 않고 IOP client/product surface로 정리한다. - 표준선(선택): `../iop`는 Portal 명칭을 강조하지 않고 IOP client/product surface로 정리한다.
- 선행 작업: Mattermost Push Plugin Extraction - 선행 작업: Mattermost Push Plugin Extraction
- 후속 작업: Project Workspace Management UX, External Integration - 후속 작업: Project Workspace Management UX, External Integration
- 공용 테스트 환경: `docs/test-environments.md#android-sdk-remote-runner`
- 2026-05-25 갱신 근거:
- `apps/client` 경로와 root helper/docs/rules가 client 기준으로 정리되었다.
- `apps/client/lib/src/app`, `apps/client/lib/src/features`, `apps/client/lib/src/integrations` skeleton과 proto-socket/Mattermost push integration facade가 추가되었다.
- `apps/client/README.md`, `apps/client/push-notification-todo.md`, `packages/contracts/notes/flutter-core-api-candidates.md`에 host/plugin/transport 책임 경계와 clone handoff가 정리되었다.
- `flutter test`, `flutter analyze --no-fatal-infos`, `flutter build web`가 통과했다. analyze의 `avoid_print`는 기존 mobile rule의 baseline info로 남긴다.
- `ssh toki@toki-labs.com`의 공용 Android SDK 환경에서 `flutter build apk --debug`가 통과했다.
- 확인 필요: 없음 - 확인 필요: 없음

View file

@ -2,19 +2,17 @@
## 활성 Phase ## 활성 Phase
- [진행중] Project Workspace Management UX
- 경로: `agent-ops/roadmap/phase/project-workspace-management-ux/PHASE.md`
- [진행중] Workflow Core - [진행중] Workflow Core
- 경로: `agent-ops/roadmap/phase/workflow-core/PHASE.md` - 경로: `agent-ops/roadmap/phase/workflow-core/PHASE.md`
## 활성 Milestone ## 활성 Milestone
- [진행중] Client Integration Standardization
- Phase: `agent-ops/roadmap/phase/project-workspace-management-ux/PHASE.md`
- 경로: `agent-ops/roadmap/phase/project-workspace-management-ux/milestones/client-integration-standardization.md`
- [진행중] Workflow Core - [진행중] Workflow Core
- Phase: `agent-ops/roadmap/phase/workflow-core/PHASE.md` - Phase: `agent-ops/roadmap/phase/workflow-core/PHASE.md`
- 경로: `agent-ops/roadmap/phase/workflow-core/milestones/workflow-core.md` - 경로: `agent-ops/roadmap/phase/workflow-core/milestones/workflow-core.md`
- [스케치] Roadmap Driven Agent-Ops Automation
- Phase: `agent-ops/roadmap/phase/workflow-core/PHASE.md`
- 경로: `agent-ops/roadmap/phase/workflow-core/milestones/roadmap-driven-agent-ops-automation.md`
## 선택 규칙 ## 선택 규칙
@ -22,6 +20,7 @@
- 활성 Phase는 `agent-ops/roadmap/phase/<phase-slug>/PHASE.md`를 가리킨다. - 활성 Phase는 `agent-ops/roadmap/phase/<phase-slug>/PHASE.md`를 가리킨다.
- 활성 Milestone은 `agent-ops/roadmap/phase/<phase-slug>/milestones/<milestone-slug>.md`를 가리킨다. - 활성 Milestone은 `agent-ops/roadmap/phase/<phase-slug>/milestones/<milestone-slug>.md`를 가리킨다.
- 활성 항목은 아카이브 경로를 포함하지 않는다. - 활성 항목은 아카이브 경로를 포함하지 않는다.
- `[스케치]` 항목은 컨셉 보강과 `[계획]` 승격 후보이며, 구현 계획 생성 대상은 아니다.
- `[검토중]` 항목은 사용자 완료 확인 전까지 활성 항목으로 남길 수 있다. - `[검토중]` 항목은 사용자 완료 확인 전까지 활성 항목으로 남길 수 있다.
- `[완료]` 또는 `[폐기]` 항목은 archive 링크를 남긴 뒤 활성 항목에서 제거한다. - `[완료]` 또는 `[폐기]` 항목은 archive 링크를 남긴 뒤 활성 항목에서 제거한다.
- 요청 내용, 현재 브랜치, 변경 파일, 관련 코드 경로를 보고 가장 관련 있는 Phase와 Milestone을 선택하고 같은 세션에서 1회 읽는다. - 요청 내용, 현재 브랜치, 변경 파일, 관련 코드 경로를 보고 가장 관련 있는 Phase와 Milestone을 선택하고 같은 세션에서 1회 읽는다.

View file

@ -2,7 +2,7 @@
## 상태 ## 상태
[진행중] [계획]
## 목표 ## 목표
@ -13,9 +13,9 @@ Flutter-first 클라이언트 구조 위에서 `apps/client` 모듈, web/mobile
완료된 Milestone은 archive 경로를 가리키고, 검토중, 진행중, 계획 또는 보류 Milestone은 이 Phase 하위 `milestones/` 경로를 가리킨다. 완료된 Milestone은 archive 경로를 가리키고, 검토중, 진행중, 계획 또는 보류 Milestone은 이 Phase 하위 `milestones/` 경로를 가리킨다.
완료, 검토중, 진행중, 계획 순서로 두어 아래로 갈수록 미래 작업에 가까워지게 정렬한다. 완료, 검토중, 진행중, 계획 순서로 두어 아래로 갈수록 미래 작업에 가까워지게 정렬한다.
- [진행중] Client Integration Standardization - [완료] Client Integration Standardization
- 경로: `agent-ops/roadmap/phase/project-workspace-management-ux/milestones/client-integration-standardization.md` - 경로: `agent-ops/roadmap/archive/phase/project-workspace-management-ux/milestones/client-integration-standardization.md`
- 요약: NomadCode client를 기준으로 `apps/client` 모듈명, Web + Android 우선 bootstrap, proto-socket, Mattermost push host integration, cloning handoff를 표준화다. - 요약: NomadCode client를 기준으로 `apps/client` 모듈명, Web + Android 우선 bootstrap, proto-socket, Mattermost push host integration, cloning handoff를 표준화다.
- [계획] Project Workspace Management UX - [계획] Project Workspace Management UX
- 경로: `agent-ops/roadmap/phase/project-workspace-management-ux/milestones/project-workspace-management-ux.md` - 경로: `agent-ops/roadmap/phase/project-workspace-management-ux/milestones/project-workspace-management-ux.md`
@ -24,6 +24,7 @@ Flutter-first 클라이언트 구조 위에서 `apps/client` 모듈, web/mobile
## Phase 경계 ## Phase 경계
- 기존 Project/Session/Workspace 방향을 대체하지 않고 보강한다. - 기존 Project/Session/Workspace 방향을 대체하지 않고 보강한다.
- 실제 앱 UX 구현과 상세 화면 작업은 공통 모듈, workflow/core 안정화, 외부 통합 기준이 먼저 정리된 뒤 후순위로 진행한다.
- IOP 내부 모델 라우팅, 외부 agent 추가 흐름, 상세 화면/API/DB schema 확정은 이 Phase의 결정 전 범위에서 제외한다. - IOP 내부 모델 라우팅, 외부 agent 추가 흐름, 상세 화면/API/DB schema 확정은 이 Phase의 결정 전 범위에서 제외한다.
- UX 책임 경계와 우선순위는 사용자 결정이 필요한 잠금 항목으로 유지한다. - UX 책임 경계와 우선순위는 사용자 결정이 필요한 잠금 항목으로 유지한다.
- `../iop``../alt`로 복제할 내용은 제품 feature 전체가 아니라 client skeleton, integration boundary, bootstrap convention, 문서화된 handoff 기준으로 제한한다. - `../iop``../alt`로 복제할 내용은 제품 feature 전체가 아니라 client skeleton, integration boundary, bootstrap convention, 문서화된 handoff 기준으로 제한한다.

View file

@ -70,8 +70,8 @@ Flutter-first 앱에서 project/session/workspace 제어 표면과 desktop/mobil
## 작업 컨텍스트 ## 작업 컨텍스트
- 관련 경로: `apps/mobile/`, `packages/contracts/`, `services/core/` - 관련 경로: `apps/client/`, `packages/contracts/`, `services/core/`
- 전환 참고 경로: [Legacy/Retired] `apps/web/` (제거됨) - 전환 참고 경로: [Legacy/Retired] `apps/web/` (제거됨)
- 선행 작업: Flutter-first Client Consolidation, External Integration - 선행 작업: Flutter-first Client Consolidation, Client Integration Standardization
- 후속 작업: 확인 필요 - 후속 작업: 확인 필요
- 확인 필요: `구현 잠금`의 결정 필요 항목 참고. - 확인 필요: `구현 잠금`의 결정 필요 항목 참고.

View file

@ -10,13 +10,17 @@ Plane 통신 토대와 provider-neutral pipeline 설계 이후 실제 상태 변
## Milestone 흐름 ## Milestone 흐름
완료된 Milestone은 archive 경로를 가리키고, 검토중, 진행중, 계획 또는 보류 Milestone은 이 Phase 하위 `milestones/` 경로를 가리킨다. 완료된 Milestone은 archive 경로를 가리키고, 검토중, 진행중, 계획, 스케치 또는 보류 Milestone은 이 Phase 하위 `milestones/` 경로를 가리킨다.
완료, 검토중, 진행중, 계획 순서로 두어 아래로 갈수록 미래 작업에 가까워지게 정렬한다. 완료, 검토중, 진행중, 계획, 스케치 순서로 두어 아래로 갈수록 미래 작업에 가까워지게 정렬한다.
- [진행중] Workflow Core - [진행중] Workflow Core
- 경로: `agent-ops/roadmap/phase/workflow-core/milestones/workflow-core.md` - 경로: `agent-ops/roadmap/phase/workflow-core/milestones/workflow-core.md`
- 요약: task lifecycle, 상태 전이 책임, 실패 정책, retry/timeout, notification event 모델을 안정화한다. - 요약: task lifecycle, 상태 전이 책임, 실패 정책, retry/timeout, notification event 모델을 안정화한다.
- [스케치] Roadmap Driven Agent-Ops Automation
- 경로: `agent-ops/roadmap/phase/workflow-core/milestones/roadmap-driven-agent-ops-automation.md`
- 요약: 사용자가 중요 판단과 상위 계획을 맡고, 에이전트가 로드맵-마일스톤-계획-리뷰 루프를 자동으로 이어가는 운영 컨셉을 구현 가능한 계획으로 구체화한다.
## Phase 경계 ## Phase 경계
- Workflow Core는 canonical task lifecycle, retry/timeout envelope, heartbeat, terminal 상태 기록을 소유한다. - Workflow Core는 canonical task lifecycle, retry/timeout envelope, heartbeat, terminal 상태 기록을 소유한다.

View file

@ -0,0 +1,86 @@
# Milestone: Roadmap Driven Agent-Ops Automation
## 위치
- Roadmap: `agent-ops/roadmap/ROADMAP.md`
- Phase: `agent-ops/roadmap/phase/workflow-core/PHASE.md`
## 목표
NomadCode가 로드맵을 중심으로 판단, 실행, 리뷰 루프를 끊기지 않게 운영하는 컨셉을 정리한다. 사용자는 중요 판단과 상위 계획을 결정하고, 에이전트는 그 판단을 바탕으로 마일스톤 구체화, plan 생성, 작업, code-review, 재계획, 완료 반영을 표준 루프로 이어가도록 만드는 방향을 다듬는다.
## 상태
[스케치]
## 승격 조건
- [ ] 로드맵, Phase, Milestone, plan, code-review, runtime 완료 이벤트 사이의 책임 경계를 정의한다.
- [ ] 사용자가 반드시 결정해야 하는 항목과 에이전트가 표준선으로 채워도 되는 항목을 구분한다.
- [ ] `[스케치]`, `[계획]`, `[진행중]`, `[검토중]`, `[완료]` 상태 전환 조건을 NomadCode 자동화 흐름에 맞게 검증한다.
- [ ] `[계획]` 이상으로 승격된 후속 Milestone에서 사용할 `agent-task/m-<milestone-slug>` 생성, 반복 리뷰, `complete.log`, roadmap 갱신, archive 승인 흐름의 최소 계약을 정한다.
- [ ] 자동 실행 범위와 중단 조건, `USER_REVIEW.md` 사용자 확인 지점, 실패 또는 보완 필요 시 되돌아가는 정책을 정한다.
- [ ] 첫 구현 Milestone으로 쪼갤 후보와 완료 기준을 나눈다.
## 구현 잠금
- 상태: 잠금
- 결정 필요:
- [ ] 사용자가 직접 승인해야 하는 경계가 milestone 생성, plan 생성, 작업 시작, 검토중 전환, 완료 archive 중 어디까지인지 정한다.
- [ ] NomadCode가 백그라운드에서 자동 진행해도 되는 작업 단위와 명시 확인이 필요한 작업 단위를 정한다.
- [ ] "현재 작업" 질의가 스케치/계획/진행중 후보를 어떤 우선순위로 보여줘야 하는지 정한다.
## 범위
- roadmap 중심 운영 루프의 제품 컨셉 정리
- Milestone 상태 전환과 구현 잠금의 운용 기준
- `[계획]` 이상 Milestone에서 사용할 milestone 기반 plan/code-review 반복 루프의 자동화 후보 정의
- 완료 이벤트가 roadmap에 반영되는 방식과 사용자 최종 확인 지점 정리
- NomadCode 내부 agent orchestration 후보 정리
## 필수 기능
### Epic: [roadmap-loop] Roadmap-led operation loop
로드맵과 마일스톤을 기준으로 에이전트가 다음 작업을 판단하고, 계획/작업/리뷰/재계획을 반복하는 운영 루프를 구체화한다.
- [ ] [loop-map] 초기 컨셉에서 roadmap, milestone, plan, code-review, complete.log, archive까지 이어지는 상태 흐름을 정의한다.
- [ ] [decision-boundary] 사용자 판단 영역과 에이전트 자동 보강 영역을 구분한다.
- [ ] [automation-contract] 자동으로 진행 가능한 단계와 중단 또는 사용자 확인이 필요한 단계를 정한다.
- [ ] [user-review-stop] 반복 실패와 테스트 환경 차단 상황에서 `USER_REVIEW.md`로 루프를 멈추는 조건과 템플릿 계약을 정한다.
- [ ] [runtime-routing] `[계획]` 이상 Milestone의 task group과 완료 이벤트가 roadmap 갱신으로 이어지는 routing 계약을 정한다.
- [ ] [first-slice] 구현 가능한 첫 Milestone 또는 Epic 후보를 분리한다.
## 완료 기준
- [ ] 컨셉이 `[계획]` Milestone으로 승격 가능한 목표, 범위, 완료 기준을 갖춘다.
- [ ] 사용자 결정 항목과 에이전트 표준 처리 항목이 분리된다.
- [ ] plan/code-review 반복 루프와 roadmap 갱신 루프의 최소 계약이 문서화된다.
- [ ] 자동 루프 중단 조건과 사용자 리뷰 파일 계약이 문서화된다.
- [ ] 첫 구현 단위 후보가 하나 이상 도출된다.
## 완료 리뷰
- 상태: 없음
- 요청일: 없음
- 완료 근거: 없음
- 리뷰 필요:
- [ ] 사용자가 완료 결과를 확인했다
- [ ] archive 이동을 승인했다
- 리뷰 코멘트: 없음
## 범위 제외
- 실제 runtime scheduler 구현
- 백그라운드 agent 실행 큐 구현
- UI 화면/API/DB schema 확정
- 외부 provider 또는 IOP 세부 통합
- 사용자 승인 없는 자동 archive 이동
## 작업 컨텍스트
- 관련 경로: `agent-ops/roadmap/`, `agent-ops/skills/common/plan/SKILL.md`, `agent-ops/skills/common/code-review/SKILL.md`, `agent-ops/skills/common/update-roadmap/SKILL.md`
- 표준선(선택): 로드맵은 판단과 방향의 source of truth로 둔다. 이 `[스케치]` 자체는 구현 계획 대상이 아니며, 승격 이후 구현 작업만 milestone 기반 `agent-task/m-<milestone-slug>/` 루프로 분리한다.
- 선행 작업: Workflow Core
- 후속 작업: `[계획]` 승격 후 runtime, roadmap updater, UI/agent interaction 중 첫 구현 Milestone 후보를 결정한다.
- 확인 필요: 이 스케치를 `[계획]`으로 올릴 때 실제 구현 Milestone을 runtime, roadmap updater, UI/agent interaction 중 어디부터 나눌지 결정해야 한다.

View file

@ -17,7 +17,7 @@ NomadCode 런타임 사이의 공유 계약 도메인이다. API schema, event s
## 제외 경로 ## 제외 경로
- `services/core/internal/http/` — API implementation은 core 도메인이다. - `services/core/internal/http/` — API implementation은 core 도메인이다.
- `apps/mobile/lib/` — mobile-specific client/service code는 mobile 도메인이다. - `apps/client/lib/` — Flutter client/service code는 mobile 도메인이다.
- `apps/web/` — [Legacy/Retired] 이전 React/Vite web scaffold 경로는 완전히 제거되어 제외 대상입니다. - `apps/web/` — [Legacy/Retired] 이전 React/Vite web scaffold 경로는 완전히 제거되어 제외 대상입니다.
## 주요 구성 요소 ## 주요 구성 요소

View file

@ -30,7 +30,7 @@ NomadCode의 백엔드 오케스트레이션 도메인이다. workflow, scheduli
## 제외 경로 ## 제외 경로
- `apps/mobile/` — Flutter-first 제품 클라이언트이며 core 내부 패키지를 직접 참조하지 않는다. - `apps/client/` — Flutter-first 제품 클라이언트이며 core 내부 패키지를 직접 참조하지 않는다.
- `apps/web/` — [Legacy/Retired] React/Vite scaffold 경로는 완전히 제거되어 제외 대상입니다. - `apps/web/` — [Legacy/Retired] React/Vite scaffold 경로는 완전히 제거되어 제외 대상입니다.
- `packages/contracts/` — 공유 API/schema 계약의 소유 영역이다. - `packages/contracts/` — 공유 API/schema 계약의 소유 영역이다.

View file

@ -12,12 +12,12 @@ NomadCode의 Flutter-first 제품 UI 도메인이다. 모바일/데스크톱/선
## 포함 경로 ## 포함 경로
- `apps/mobile/lib/` — Flutter application code. - `apps/client/lib/` — Flutter application code.
- `apps/mobile/lib/services/` — auth, notification, background handlers. - `apps/client/lib/services/` — auth, notification, background handlers.
- `apps/mobile/test/` — Flutter widget/service tests. - `apps/client/test/` — Flutter widget/service tests.
- `apps/mobile/android/`, `apps/mobile/ios/`, `apps/mobile/macos/`, `apps/mobile/linux/`, `apps/mobile/windows/`, `apps/mobile/web/` — platform-specific runner/config. - `apps/client/android/`, `apps/client/ios/`, `apps/client/macos/`, `apps/client/linux/`, `apps/client/windows/`, `apps/client/web/` — platform-specific runner/config.
- `apps/mobile/pubspec.yaml`, `apps/mobile/pubspec.lock`, `apps/mobile/analysis_options.yaml` — Dart/Flutter dependencies and analysis. - `apps/client/pubspec.yaml`, `apps/client/pubspec.lock`, `apps/client/analysis_options.yaml` — Dart/Flutter dependencies and analysis.
- `apps/mobile/README.md`, `apps/mobile/push-notification-todo.md` — mobile 운영 메모와 push notification 작업 메모. - `apps/client/README.md`, `apps/client/push-notification-todo.md` — mobile 운영 메모와 push notification 작업 메모.
## 제외 경로 ## 제외 경로

View file

@ -27,7 +27,7 @@ NomadCode 원레포 운영 도메인이다. 루트 helper, 문서, ignore 정책
- `agent-ops/rules/common/` — agentic-framework에서 동기화되는 공통 rules. - `agent-ops/rules/common/` — agentic-framework에서 동기화되는 공통 rules.
- `agent-ops/skills/common/` — agentic-framework에서 동기화되는 공통 skills. - `agent-ops/skills/common/` — agentic-framework에서 동기화되는 공통 skills.
- `services/core/`, `apps/web/` (Legacy/Retired), `apps/mobile/`, `packages/contracts/` — 각 제품 도메인 소유 코드. - `services/core/`, `apps/web/` (Legacy/Retired), `apps/client/`, `packages/contracts/` — 각 제품 도메인 소유 코드.
## 주요 구성 요소 ## 주요 구성 요소

View file

@ -12,7 +12,7 @@ NomadCode는 AI 병렬 작업 운용을 위한 원레포다. 백엔드 오케스
## 주요 구조 ## 주요 구조
- `services/core/` — Go 기반 백엔드, workflow, scheduler, persistence, 외부 adapter. - `services/core/` — Go 기반 백엔드, workflow, scheduler, persistence, 외부 adapter.
- `apps/mobile/` — Flutter 기반 제품 UI source of truth, 모바일/데스크톱 클라이언트와 알림 연동. - `apps/client/` — Flutter 기반 제품 UI source of truth, 모바일/데스크톱/선택적 web 클라이언트와 알림 연동.
- `packages/contracts/` — 서비스와 클라이언트가 공유하는 API/schema 계약. - `packages/contracts/` — 서비스와 클라이언트가 공유하는 API/schema 계약.
- `bin/` — 원레포 공통 test/build/lint/dev entrypoint. - `bin/` — 원레포 공통 test/build/lint/dev entrypoint.
- `docs/` — 아키텍처와 운영 문서. - `docs/` — 아키텍처와 운영 문서.
@ -29,7 +29,7 @@ NomadCode는 AI 병렬 작업 운용을 위한 원레포다. 백엔드 오케스
- 원레포 루트에서 가능한 작업은 `bin/test`, `bin/lint`, `bin/build`, `bin/dev`를 우선 사용한다. - 원레포 루트에서 가능한 작업은 `bin/test`, `bin/lint`, `bin/build`, `bin/dev`를 우선 사용한다.
- cross-boundary 변경은 계약, 서비스, 클라이언트 반영을 같은 브랜치에서 닫는다. - cross-boundary 변경은 계약, 서비스, 클라이언트 반영을 같은 브랜치에서 닫는다.
- `services/core` 변경은 `go test ./...` 또는 `bin/test`로 확인한다. - `services/core` 변경은 `go test ./...` 또는 `bin/test`로 확인한다.
- `apps/mobile` 변경은 `flutter test`와 필요 시 `flutter analyze --no-fatal-infos`로 확인한다. - `apps/client` 변경은 `flutter test`와 필요 시 `flutter analyze --no-fatal-infos`로 확인한다.
- `packages/contracts`가 실제 계약을 갖기 전에는 API 형태를 서비스/클라이언트에 중복 고정하지 말고 계약 후보를 문서화한다. - `packages/contracts`가 실제 계약을 갖기 전에는 API 형태를 서비스/클라이언트에 중복 고정하지 말고 계약 후보를 문서화한다.
- 하위 앱/서비스에 별도 `agent-ops`나 AI entry 파일을 만들지 않는다. 루트 `agent-ops`와 루트 entry 파일만 사용한다. - 하위 앱/서비스에 별도 `agent-ops`나 AI entry 파일을 만들지 않는다. 루트 `agent-ops`와 루트 entry 파일만 사용한다.
- Plane 관련 core 작업은 `agent-ops/rules/project/domain/core/rules.md``Plane dev 작업 메모`를 먼저 확인한다. Plane API 토큰은 ignored local secret file `.env.plane.local`에서 로드하며, 토큰 값은 규칙/로드맵/문서에 직접 기록하지 않는다. - Plane 관련 core 작업은 `agent-ops/rules/project/domain/core/rules.md``Plane dev 작업 메모`를 먼저 확인한다. Plane API 토큰은 ignored local secret file `.env.plane.local`에서 로드하며, 토큰 값은 규칙/로드맵/문서에 직접 기록하지 않는다.
@ -39,7 +39,7 @@ NomadCode는 AI 병렬 작업 운용을 위한 원레포다. 백엔드 오케스
| 경로 패턴 | 도메인 | rules.md | | 경로 패턴 | 도메인 | rules.md |
|----------|--------|----------| |----------|--------|----------|
| `services/core/**` | core | `agent-ops/rules/project/domain/core/rules.md` | | `services/core/**` | core | `agent-ops/rules/project/domain/core/rules.md` |
| `apps/mobile/**` | mobile | `agent-ops/rules/project/domain/mobile/rules.md` | | `apps/client/**` | mobile | `agent-ops/rules/project/domain/mobile/rules.md` |
| `packages/contracts/**` | contracts | `agent-ops/rules/project/domain/contracts/rules.md` | | `packages/contracts/**` | contracts | `agent-ops/rules/project/domain/contracts/rules.md` |
| `bin/**`, `docs/**`, `README.md`, `.gitignore`, `AGENTS.md`, `CLAUDE.md`, `GEMINI.md`, `opencode.json`, `agent-ops/.version`, `agent-ops/bin/**`, `agent-ops/roadmap/**`, `agent-ops/rules/project/**` | workspace-ops | `agent-ops/rules/project/domain/workspace-ops/rules.md` | | `bin/**`, `docs/**`, `README.md`, `.gitignore`, `AGENTS.md`, `CLAUDE.md`, `GEMINI.md`, `opencode.json`, `agent-ops/.version`, `agent-ops/bin/**`, `agent-ops/roadmap/**`, `agent-ops/rules/project/**` | workspace-ops | `agent-ops/rules/project/domain/workspace-ops/rules.md` |

102
apps/client/README.md Normal file
View file

@ -0,0 +1,102 @@
# nomadcode-app
The Flutter-first NomadCode client application.
## Client Module Standard
The Flutter host application in this monorepo is standardized under `apps/client/`. This directory serves as the reference architecture for other projects (such as `../iop` and `../alt`) to replicate.
### Directory Layout
- **`lib/src/app/`**: Root application routing, bootstrap settings (`bootstrap.dart`), global configurations, and state setup.
- **`lib/src/features/`**: Feature-specific UI surfaces, business logic, and local UI state. Keep layout decoupled from shared integration protocols.
- **`lib/src/integrations/`**: Adapters and lifecycle hooks for external system boundaries. Any connection initialization or platform-specific service logic should reside here under strict interfaces.
### Naming Conventions
- **Flutter Host Path**: Always kept as `apps/client/` to act as the primary client skeleton.
- **Dart Package Name**: Standardized as `nomadcode_app`. When cloning, this package name can be customized to match target project identities (e.g. `iop_client_app`, `alt_client_app`) in `pubspec.yaml`, while maintaining the same directory layout.
---
## Bootstrap
NomadCode features a standardized, platform-safe bootstrap layer in `lib/src/app/bootstrap.dart`:
- **Common Initialization Path**: `bootstrapNomadCodeClient()` performs synchronous preparation, setups UI configurations (e.g., fullscreen system overlays), and initializes Firebase + Mattermost push notification boundaries.
- **Platform-Specific Guard**: Native modules and background tasks (such as Firebase Messaging background handlers) are cleanly guarded inside integration-specific or native layers, preventing background crashes or initialization collision.
- **No-Op Defaults**: External transport components (such as the proto-socket lifecycle engine) initialize with safe no-op adapters by default to guarantee bootstrap safety.
---
## Platform Targets
We prioritize and validate two primary platforms in this milestone, while ensuring others can be added seamlessly:
- **Web & Android (Primary Targets)**: Fully validated in the main bootstrap configuration. Local notification integration and web socket configurations are verified to build and bootstrap without compilation errors.
- **iOS (Future Expansion)**: iOS is treated as a first-class citizen using the same Dart APIs and integration facade boundaries (`MattermostPushClient`, `ProtoSocketLifecycle`). Native iOS APNS and notification delegate handlers can be wired later into the same Dart interfaces without modifying the core bootstrap logic.
---
## Integration Boundaries
`apps/client/lib/src/integrations/` groups all external-system adapters behind small Dart interfaces:
- `integrations/mattermost/``MattermostPushClient` interface, `MattermostPushPluginClient` adapter (the only production reference to `MattermostPushPlugin.instance`), `MattermostPushHostIntegration` (initialize + auth handoff + navigation callbacks), and `MattermostAuthService`.
- `integrations/proto_socket/``ProtoSocketEndpointConfig` and `ProtoSocketLifecycle` facade over the local `proto_socket` Dart path dependency. Bootstrap does not auto-connect; enabling and wiring a real connector are deferred to the next milestone.
For detailed integration boundaries, platform targets, and clone handoff guidelines, see [push-notification-todo.md](push-notification-todo.md).
---
## Mattermost Push Notification Integration
Mattermost push notification delivery is implemented via the local `mattermost_push_plugin` path dependency.
### Architecture & Responsibility Split
To maintain a clean and maintainable codebase, the responsibilities are split between the host application and the plugin as follows:
#### Host Application (`apps/client`) Responsibilities:
- **Firebase Configuration**: Contains the standard Firebase configuration files (`android/app/google-services.json`) and performs the standard `Firebase.initializeApp()` call in Dart main.
- **Mattermost Authentication**: Handles login and session lifecycles, and passes the user authentication token and server signing key through the `MattermostPushClient` boundary. The production `MattermostPushPluginClient` adapter owns the plugin singleton calls.
- **Navigation Callbacks**: Registers standard Flutter navigation callbacks `onNavigateToChannel` and `onNavigateToThread` to handle workspace channel and CRT thread routing upon user interaction.
- **FCM Token Sync**: Listens to device token registrations via `onDeviceTokenReady` and registers the token with the Mattermost server.
#### Mattermost Push Plugin (`mattermost_push_plugin`) Responsibilities:
- **Native Android FCM Service**: Intercepts background/foreground FCM notifications securely via a custom Kotlin FCM service.
- **Signature Verification**: Validates incoming push payload signatures against stored public signing keys (using `JJWT`).
- **System Notification Builder**: Displays structured notifications with local avatar caches, thread summaries, and action buttons.
- **Inline Reply / Dismiss Actions**: Receives native background actions, records responses in a Room database, and forwards replies/ACKs directly to the Mattermost API via custom OkHttp adapters.
---
## Cloning & Handoff Checklist
For sibling repositories (`../iop` and `../alt`) aiming to align with this standard structure:
### Sibling Specific Alignment Guidelines:
- **`../iop`**: Avoid emphasizing legacy Portal naming conventions. Reorganize/rename legacy mobile paths to the `apps/client` standard. Align folder structures under `src/app`, `src/features`, and `src/integrations`. Do not clone NomadCode product-specific screens—only the integration and bootstrap skeletons.
- **`../alt`**: Retain ALT-specific Riverpod-based dependency graph and `go_router` for app routing. However, extract external adapters into `lib/src/integrations/` matching the common Dart facade interfaces (`MattermostPushClient`, `ProtoSocketLifecycle`) to align the bootstrap pipeline.
### Common Replacement Checklist:
When cloning this host template into a new environment, replace the following values:
1. **Dart Package Name**: Rename `nomadcode_app` to your target app package identifier in `pubspec.yaml`.
2. **Display & App Naming**: Adjust launcher configurations, bundle identifiers, and target product names in native assets (`android/app/src/main/AndroidManifest.xml`, `ios/Runner/Info.plist`).
3. **Firebase Configuration**: Replace `google-services.json` (Android) and `GoogleService-Info.plist` (iOS) with target project project credentials.
4. **Endpoint Defaults**: Update `ProtoSocketEndpointConfig` initialization defaults in environment configurations to route to your target backends.
5. **Mattermost Server Configurations**: Update server URLs, authentications, and asymmetrical public keys matching the target deployment environment.
---
## Verification
To ensure code stability and structure correctness, run the following verification checks within this directory:
- **Unit Tests**:
```bash
flutter test
```
- **Static Analysis**:
```bash
flutter analyze --no-fatal-infos
```
- **Web Build Validation**:
```bash
flutter build web
```

View file

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View file

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View file

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Some files were not shown because too many files have changed in this diff Show more