Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ CI 또는 릴리즈 검증 시에는 APK 산출물 확인을 반드시 포함한

- `app/build/outputs/apk/debug/app-debug.apk` 파일 존재 여부 확인
- GitHub Release에서 APK 다운로드 가능 여부와 크기가 0보다 큰지 확인
- 태그 전에 `pwsh scripts/verify-release-export.ps1` — `D:\Build`의 AAB·mapping·6개
- 태그 전에 `pwsh scripts/verify-release-export.ps1` — `D:\Build`의 AAB·mapping·7개
로케일 노트가 현재 versionName/versionCode로 존재하고 비어 있지 않은지 확인한다.
**이것이 릴리스 자산의 유일한 영구 사본 검증이다**(D066).
- GitLab 쪽 검증은 `GITLAB_RELEASE_MIRROR=true`일 때만 적용된다. **2026-08-05(v2.32.2)부터
Expand Down Expand Up @@ -108,7 +108,7 @@ Android 프로젝트가 아직 초기화되지 않았다면 먼저 표준 Kotlin

- `markleaf-v<semver>-vc<versionCode>.aab` — `app/build/outputs/bundle/release/app-release.aab`(서명) 복사본
- `markleaf-v<semver>-vc<versionCode>.mapping.txt` — R8 mapping(Play 크래시 deobfuscation; 있으면 복사). AAB가 없으면 task가 예외를 던지지만 mapping은 warn만 남기고 넘어가므로, AAB가 나왔다고 mapping도 나왔다고 볼 수 없다 — `scripts/verify-release-export.ps1`이 이것까지 확인한다
- `markleaf-v<semver>-vc<versionCode>-release-notes.txt` — **모든 스토어 로케일**(ko-KR / en-US / ja-JP / de-DE / fr-FR / es-ES)의 `fastlane/metadata/android/<locale>/changelogs/<versionCode>.txt`를 읽어 하나의 파일에 로케일 태그 블록을 연달아 묶음
- `markleaf-v<semver>-vc<versionCode>-release-notes.txt` — **모든 스토어 로케일**(ko-KR / en-US / ja-JP / zh-CN / de-DE / fr-FR / es-ES)의 `fastlane/metadata/android/<locale>/changelogs/<versionCode>.txt`를 읽어 하나의 파일에 로케일 태그 블록을 연달아 묶음

TXT 파일은 바로 복사/붙여넣기 가능해야 하며, 각 로케일 릴리즈 노트만 아래 태그로 감싼다. 태그 밖에는 어떤 설명이나 문구도 넣지 않는다 (Gradle task가 이 형식을 보장한다).

Expand All @@ -133,7 +133,7 @@ TXT 파일은 바로 복사/붙여넣기 가능해야 하며, 각 로케일 릴
</es-ES>
```

따라서 cut 전에 **6개 스토어 로케일 fastlane changelog 전부**(BCP 47 region 대문자)가 새 versionCode 파일명으로 작성되어 있어야 task가 통과한다. 하나라도 누락되거나 로케일당 500자를 넘으면 task가 명시적으로 실패한다.
따라서 cut 전에 **7개 스토어 로케일 fastlane changelog 전부**(BCP 47 region 대문자)가 새 versionCode 파일명으로 작성되어 있어야 task가 통과한다. 하나라도 누락되거나 로케일당 500자를 넘으면 task가 명시적으로 실패한다.

GitLab CI용 산출물은 `-Pmarkleaf.releaseExportDir=<dir>`와 함께
`:app:exportReleaseArtifacts`를 실행한다. 이 task는 위 3개 파일에 서명 APK를 더해 내보내며,
Expand Down Expand Up @@ -185,7 +185,7 @@ GitLab CI용 산출물은 `-Pmarkleaf.releaseExportDir=<dir>`와 함께
Play 제출용 서명 AAB와 릴리즈 노트 TXT를 내보낸다(서명 AAB는 CI 릴리스 산출물 기준).
업로드는 메인테이너가 수동으로 한다.
5. **마감 + 보고.** 해결된 이슈에 감사 댓글을 달고 닫되, 사용자측 확인이 남으면 열어 둔다.
굵직한 변경이면 README·랜딩 페이지의 버전 표기를 6개 언어 모두 갱신하고
굵직한 변경이면 README·랜딩 페이지의 버전 표기를 7개 언어 모두 갱신하고
`scripts/verify-landing-versions.ps1`로 검증한다. 마지막으로 무엇이 나갔는지,
이슈 상태, 릴리스 링크를 보고한다.

Expand Down Expand Up @@ -258,9 +258,9 @@ Markleaf 사용자 대부분이 영어를 쓰므로 공개 문서의 기본 언
- 이슈 번호(`#123`), 코드 식별자, 파일 경로, 제품명은 번역하지 않고 그대로 둔다.
- v2.16.0 이전 항목은 영어화 대상이 아니다. `CHANGELOG.md`의 "Earlier releases (Korean)" 이후 구간과 `CHANGELOG.ko.md`에 한국어로 보존되어 있으며 소급 번역하지 않는다.

Play/F-Droid용 `fastlane/metadata/android/<locale>/changelogs/<versionCode>.txt`는 기존대로 **6개 스토어 로케일 전부** 작성한다. 이 지침은 [Release Artifact Export](#release-artifact-export)의 6개 로케일 요구사항을 대체하지 않는다.
Play/F-Droid용 `fastlane/metadata/android/<locale>/changelogs/<versionCode>.txt`는 기존대로 **7개 스토어 로케일 전부** 작성한다. 이 지침은 [Release Artifact Export](#release-artifact-export)의 7개 로케일 요구사항을 대체하지 않는다.

README와 GitHub Pages 랜딩도 영어가 기본이며 앱이 지원하는 6개 언어(en · ko · ja · de · es · fr)로 병기한다. 영어판이 canonical이고 `x-default`다. 공개 표면의 버전 표기를 갱신할 때는 6개 언어를 함께 갱신하고 `scripts/verify-landing-versions.ps1`로 검증한다.
README와 GitHub Pages 랜딩도 영어가 기본이며 앱이 지원하는 7개 언어(en · ko · ja · zh · de · es · fr)로 병기한다. 영어판이 canonical이고 `x-default`다. 공개 표면의 버전 표기를 갱신할 때는 7개 언어를 함께 갱신하고 `scripts/verify-landing-versions.ps1`로 검증한다.

### GitHub 공개 표면 콘텐츠 — 영어 기본

Expand Down
2 changes: 1 addition & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ val writeReleaseArtifacts: (File, Boolean) -> Unit = { exportDir, includeApk ->
// Every locale must have a changelog for this versionCode; fail fast so
// a cut never ships notes that silently drop a locale.
val fastlaneRoot = rootProject.file("fastlane/metadata/android")
val noteLocales = listOf("ko-KR", "en-US", "ja-JP", "de-DE", "fr-FR", "es-ES")
val noteLocales = listOf("ko-KR", "en-US", "ja-JP", "zh-CN", "de-DE", "fr-FR", "es-ES")
val sources = noteLocales.associateWith { File(fastlaneRoot, "$it/changelogs/$versionCode.txt") }

val missing = noteLocales.filter { !sources.getValue(it).isFile }
Expand Down
2 changes: 1 addition & 1 deletion fastlane/metadata/android/de-DE/full_description.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Design und Barrierefreiheit:

* Homescreen-Widget, biometrische Sperre, Option zum Blockieren von Screenshots
* Hell / dunkel / Material You, Tablet-Layout mit zwei Spalten
* Oberfläche in 6 Sprachen (Koreanisch, Englisch, Spanisch, Japanisch, Französisch, Deutsch)
* Oberfläche in 7 Sprachen (Koreanisch, Englisch, Spanisch, Japanisch, Französisch, Deutsch, Vereinfachtes Chinesisch)

Datenschutz und Verteilung:

Expand Down
2 changes: 1 addition & 1 deletion fastlane/metadata/android/en-US/full_description.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Design and accessibility:

* Home screen widget, biometric lock, screenshot blocking option
* Light / dark / Material You, tablet two-pane layout
* UI in 6 languages (Korean, English, Spanish, Japanese, French, German)
* UI in 7 languages (Korean, English, Spanish, Japanese, French, German, Simplified Chinese)

Privacy and distribution:

Expand Down
2 changes: 1 addition & 1 deletion fastlane/metadata/android/es-ES/full_description.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Diseño y accesibilidad:

* Widget de pantalla de inicio, bloqueo biométrico, opción de bloqueo de capturas de pantalla
* Claro / oscuro / Material You, diseño de dos paneles para tablets
* Interfaz en 6 idiomas (coreano, inglés, español, japonés, francés, alemán)
* Interfaz en 7 idiomas (coreano, inglés, español, japonés, francés, alemán, chino simplificado)

Privacidad y distribución:

Expand Down
2 changes: 1 addition & 1 deletion fastlane/metadata/android/fr-FR/full_description.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Design et accessibilité :

* Widget d'écran d'accueil, verrouillage biométrique, option de blocage des captures d'écran
* Clair / sombre / Material You, disposition à deux volets pour tablettes
* Interface en 6 langues (coréen, anglais, espagnol, japonais, français, allemand)
* Interface en 7 langues (coréen, anglais, espagnol, japonais, français, allemand, chinois simplifié)

Confidentialité et distribution :

Expand Down
2 changes: 1 addition & 1 deletion fastlane/metadata/android/ja-JP/full_description.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Markleaf は Android 向けのローカルファースト Markdown ノートア

* ホーム画面ウィジェット、生体認証ロック、スクリーンショット遮断オプション
* ライト / ダーク / Material You、タブレット向け 2ペインレイアウト
* 6 言語の UI(韓国語、英語、スペイン語、日本語、フランス語、ドイツ語)
* 7 言語の UI(韓国語、英語、スペイン語、日本語、フランス語、ドイツ語、簡体字中国語)

プライバシーと配布:

Expand Down
2 changes: 1 addition & 1 deletion fastlane/metadata/android/ko-KR/full_description.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Markleaf는 Android용 로컬 우선(local-first) Markdown 메모 앱입니다.

* 홈 화면 위젯, 생체 인증 잠금, 스크린샷 차단 옵션
* 라이트 / 다크 / Material You, 태블릿 2-pane 레이아웃
* 6개 언어 UI (한국어, 영어, 스페인어, 일본어, 프랑스어, 독일어)
* 7개 언어 UI (한국어, 영어, 스페인어, 일본어, 프랑스어, 독일어, 중국어 간체)

개인정보와 배포 원칙:

Expand Down
1 change: 1 addition & 0 deletions fastlane/metadata/android/zh-CN/changelogs/124.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
编辑器中的两处配色修复。引用块和分隔线此前使用固定的灰色,不随主题变化,在浅色页面上的对比度低于正文保持可读所需的程度;现在它们会像编辑器中其他结构标记一样跟随主题。标记笔记已锁定为预览模式的琥珀色徽章,在浅色顶栏上也过淡,现已加深。深色主题不变。
37 changes: 37 additions & 0 deletions fastlane/metadata/android/zh-CN/full_description.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
Markleaf 是一款面向 Android 的本地优先 Markdown 笔记应用。

书写纯 Markdown,用内联标签整理,即时搜索,让笔记始终由你掌控。Markleaf 将笔记保存在本地 Room 数据库中,并且不声明 INTERNET 权限。

书写与预览:

* 实时 Markdown 预览,支持实时语法着色
* GFM 表格、复选框、引用、提示块(> [!NOTE] …)
* 10 种语言的代码块语法高亮
* 脚注引用 ↔ 定义跳转、Wiki 链接与反向链接
* 智能格式化,为选区或单词加上粗体/斜体/删除线/代码
* 专注模式、词数与阅读时长统计、笔记内查找替换

整理与导航:

* 只需在正文中写 #标签 即可自动索引(无需文件夹)
* 快速切换与 SQLite FTS 全文搜索
* 置顶、归档、回收站与恢复流程

同步与导入(No-Cloud):

* 通过 SAF 选择文件夹,把每篇笔记镜像为 .md 文件
* 用打开或分享的方式导入外部 .md / .txt 文件
* 单篇与全部笔记的 Markdown 导出,以及系统分享

设计与无障碍:

* 主屏幕小组件、生物识别锁、屏蔽截屏选项
* 浅色 / 深色 / Material You,平板双栏布局
* 7 种语言界面(韩语、英语、西班牙语、日语、法语、德语、简体中文)

隐私与分发:

* 无需账户,没有 Markleaf 服务器
* 没有分析、广告、跟踪、Firebase 或专有崩溃报告 SDK
* 不声明 INTERNET 权限,已关闭 Android 自动备份
* 只有在你明确执行导出、分享、打开外部链接或选择 SAF 文件夹等由系统中介的操作时,用户数据才会离开设备
1 change: 1 addition & 0 deletions fastlane/metadata/android/zh-CN/short_description.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
本地优先的 Markdown 笔记,支持标签、搜索与文件导出
2 changes: 1 addition & 1 deletion scripts/verify-release-export.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Set-StrictMode -Version Latest

# app/build.gradle.kts 의 noteLocales 와 같은 목록이어야 한다. 릴리스 노트 TXT 는
# 로케일마다 <tag> ... </tag> 블록을 연달아 담는다(writeReleaseArtifacts).
$StoreLocales = @("ko-KR", "en-US", "ja-JP", "de-DE", "fr-FR", "es-ES")
$StoreLocales = @("ko-KR", "en-US", "ja-JP", "zh-CN", "de-DE", "fr-FR", "es-ES")

function Resolve-UnderRoot([string]$Path) {
if ([System.IO.Path]::IsPathRooted($Path)) { return $Path }
Expand Down
2 changes: 1 addition & 1 deletion scripts/verify-release-notes.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ $PlayNoteLimit = 500
$PlayNoteWarnAt = [int][math]::Floor($PlayNoteLimit * 0.9)

# app/build.gradle.kts 의 noteLocales 와 같은 목록이어야 한다.
$StoreLocales = @("ko-KR", "en-US", "ja-JP", "de-DE", "fr-FR", "es-ES")
$StoreLocales = @("ko-KR", "en-US", "ja-JP", "zh-CN", "de-DE", "fr-FR", "es-ES")

function Resolve-UnderRoot([string]$Path) {
if ([System.IO.Path]::IsPathRooted($Path)) { return $Path }
Expand Down