# dart-app-core

`dart-app-core`는 Dart 애플리케이션에서 반복해서 쓰는 공통 기능을 모아둔 라이브러리 패키지다. 패키지 이름은 `dart_framework`이며, 앱 초기화, 플랫폼별 I/O 추상화, 문자셋 변환, 자막 파싱, Slack 전송, 간단한 암호화/유틸리티 기능을 제공한다.

## 현재 상태

- Dart SDK `>=3.2.3 <4.0.0`을 기준으로 한다.
- `lib/dart_framework.dart`가 주요 공개 API 진입점이다.
- 플랫폼 분기는 `lib/platform/platform_stub.dart`, `lib/platform/platform_io.dart`, `lib/platform/platform_web.dart`의 조건부 import 구조를 사용한다.
- `lib/charset/**`에는 EUC-KR, EUC-JP, GBK, Shift-JIS, UTF 계열 문자셋 처리 코드와 매핑 테이블이 있다.
- `lib/subtitle/**`에는 SMI, SRT, VTT 파서가 있다.
- `lib/utils/slack/**`에는 Slack message 전송 helper가 있다.
- `*.g.dart` 파일은 `json_serializable` 기반 생성물이며 직접 수정하지 않는다.

## 빠른 시작

의존성을 가져온다.

```bash
dart pub get
```

테스트를 실행한다.

```bash
dart test
```

예제 코드를 실행한다.

```bash
dart run example/dart_framework_example.dart
```

## 주요 명령

| 목적 | 명령 | 비고 |
|------|------|------|
| 의존성 설치 | `dart pub get` | `pubspec.yaml` 기준으로 패키지를 가져온다. |
| 테스트 실행 | `dart test` | `test/` 아래 테스트를 실행한다. |
| 예제 실행 | `dart run example/dart_framework_example.dart` | 공개 API 사용 예시를 확인한다. |
| 생성 코드 갱신 | `dart run build_runner build` | `json_serializable` 생성물이 바뀔 때만 실행한다. |

## 구조

| 경로 | 역할 |
|------|------|
| `lib/dart_framework.dart` | 패키지 공개 API 진입점 |
| `lib/core/` | 애플리케이션, 앱 데이터, 예외 관리 기본 구조 |
| `lib/platform/` | I/O, Web, stub 플랫폼 분기와 process/isolate helper |
| `lib/charset/` | 문자셋 변환과 코드 페이지 매핑 |
| `lib/subtitle/` | 자막 파서 |
| `lib/utils/` | path, string, system, startup, Slack helper |
| `lib/encrypt/` | 암호화 helper |
| `lib/model/`, `lib/data/` | 공유 데이터 모델과 생성 코드 |
| `test/` | 패키지 테스트 |
| `example/` | 사용 예시 |
| `agent-ops/` | AI agent 작업 규칙과 공통 skill |

## 작업 맥락

- 작업 전 `AGENTS.md`와 `agent-ops/rules/project/rules.md`를 읽는다.
- 변경 경로에 맞는 domain rule이 있으면 `agent-ops/rules/project/domain/*/rules.md`를 먼저 확인한다.
- `lib/charset/**`의 문자셋 테이블과 매핑 파일은 대량 데이터 성격이 있으므로 불필요한 포맷 변경을 피한다.
- 공개 API를 바꾸면 `lib/dart_framework.dart`와 관련 top-level export 파일을 함께 확인한다.
- 생성 파일인 `*.g.dart`는 소스 변경 후 build runner로 갱신하며 손으로 고치지 않는다.

## 개발 흐름

1. 변경할 경로의 domain rule을 확인한다.
2. 공개 API, 플랫폼 분기, 생성 코드 여부를 먼저 판단한다.
3. 변경 범위에 맞는 최소 테스트를 실행한다.
4. 필요한 경우 `dart test`로 전체 테스트를 확인한다.

## 참고 문서

- `AGENTS.md`
- `agent-ops/rules/project/rules.md`
- `pubspec.yaml`
- `CHANGELOG.md`
