52 lines
3.4 KiB
Markdown
52 lines
3.4 KiB
Markdown
# mattermost_push_plugin 프로젝트 규칙
|
|
|
|
## 응답 언어
|
|
|
|
- 기본 응답은 한국어로 한다.
|
|
- 코드 식별자, 파일 경로, API 이름, 플랫폼 용어는 원문 표기를 유지한다.
|
|
|
|
## 프로젝트 개요
|
|
|
|
- Mattermost push notification을 처리하는 Android-first Flutter plugin이다.
|
|
- Dart 공개 API는 host app과 native Android runtime 사이의 channel/stream 계약을 제공한다.
|
|
- Android runtime은 FCM 수신, 서명 검증, 알림 표시, inline reply, dismiss, ACK 전송, Room 기반 로컬 저장을 담당한다.
|
|
- iOS와 macOS는 현재 no-op scaffold이며, Android 기능 parity를 임의로 가정하지 않는다.
|
|
|
|
## 기술 스택
|
|
|
|
- Flutter / Dart package, `firebase_messaging`
|
|
- Android Gradle Plugin, Kotlin, Java, AndroidX, Room, OkHttp, JJWT, Firebase Messaging
|
|
- iOS UIKit Swift plugin scaffold
|
|
- macOS FlutterMacOS Swift plugin scaffold
|
|
- 테스트: `flutter test`, Android unit test, example integration test scaffold
|
|
|
|
## 프로젝트 특화 컨벤션
|
|
|
|
- Dart channel 이름은 native Android의 `MattermostPushPlugin.CHANNEL_EVENTS`, `CHANNEL_ACTIONS`와 항상 맞춘다.
|
|
- FCM token은 Dart API에서 `android_rn-v2:` prefix를 붙인 값으로 저장하고 host callback에 전달한다.
|
|
- native payload key는 Mattermost/React Native 호환 snake_case key를 유지한다. 예: `server_url`, `channel_id`, `root_id`, `is_crt_enabled`, `ack_id`.
|
|
- Android push 처리에서 `server_url`이 payload에 없으면 저장된 server identifier와 단일 서버 fallback 순서로 해석한다.
|
|
- 서명 검증 실패는 알림 표시 전에 중단한다. backward compatibility 예외는 기존 helper의 조건을 유지한다.
|
|
- `firebase_messaging` 기본 Android service/receiver/provider 제거 manifest 설정은 중복 FCM 처리 방지를 위한 핵심 계약이다.
|
|
- iOS/macOS 변경은 현재 scaffold 상태를 명시하고, Android 전용 기능을 public Dart API에서 무조건 성공으로 보이게 만들지 않는다.
|
|
- build output, IDE 설정, generated Flutter/Gradle 산출물은 수정 범위에 포함하지 않는다.
|
|
|
|
## 검증 기준
|
|
|
|
- Dart API나 event parsing 변경 시 `flutter test`를 우선 실행한다.
|
|
- Android native runtime 변경 시 가능하면 `cd android && ./gradlew testDebugUnitTest` 또는 관련 unit test를 실행한다.
|
|
- FCM 수신, system notification, inline reply, ACK delivery, tap navigation은 headless 자동화가 어려우므로 README의 manual smoke checklist와 연결해 변경 위험을 기록한다.
|
|
- channel 이름, payload key, token format 변경은 Dart test와 native 코드 양쪽을 함께 확인한다.
|
|
|
|
## 도메인 매핑
|
|
|
|
| 경로 패턴 | 도메인 | rules.md |
|
|
|----------|--------|----------|
|
|
| `lib/**`, `test/**` | dart-api | `agent-ops/rules/project/domain/dart-api/rules.md` |
|
|
| `android/src/main/**`, `android/src/test/**`, `android/build.gradle.kts`, `android/settings.gradle*` | android-push-runtime | `agent-ops/rules/project/domain/android-push-runtime/rules.md` |
|
|
| `ios/**`, `macos/**` | apple-stubs | `agent-ops/rules/project/domain/apple-stubs/rules.md` |
|
|
| `example/**`, `pubspec.yaml`, `analysis_options.yaml`, `README.md`, `CHANGELOG.md` | project-support | `agent-ops/rules/project/domain/project-support/rules.md` |
|
|
|
|
## 스킬 라우팅
|
|
|
|
현재 프로젝트 전용 skill은 없다. 반복 작업이 안정화되면 `agent-ops/skills/project/<skill-name>/SKILL.md`를 추가한다.
|