공개: KoTalk 최신 기준선

This commit is contained in:
Ian 2026-04-16 09:24:26 +09:00
commit debf62f76e
572 changed files with 41689 additions and 0 deletions

39
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View file

@ -0,0 +1,39 @@
---
name: Bug report
about: 버그나 회귀를 기록합니다
title: "[bug] "
labels: bug
assignees: ''
---
## 요약
문제를 한 문장으로 적어 주세요.
## 재현 절차
1.
2.
3.
## 기대 결과
원래 기대한 동작을 적어 주세요.
## 실제 결과
실제 나타난 동작을 적어 주세요.
## 관련 문서 / 스크린샷
상태 문서, README, 스크린샷, 릴리즈 링크가 있으면 같이 적어 주세요.
## 환경
- OS:
- 앱 버전:
- 빌드 경로:
## 추가 정보
스크린샷, 로그, 관련 문서를 적어 주세요.

14
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View file

@ -0,0 +1,14 @@
blank_issues_enabled: false
contact_links:
- name: Live web
url: https://vstalk.phy.kr
about: 현재 공개 중인 모바일 웹 진입점을 직접 확인할 수 있습니다.
- name: Download mirror
url: https://download-vstalk.phy.kr
about: 공식 다운로드 미러 주소입니다.
- name: Release channels
url: https://github.com/werther24601/kotalk/releases
about: 공개 저장소 릴리즈 경로를 확인할 수 있습니다.
- name: Security contact
url: mailto:ian@physia.kr
about: 보안 이슈는 공개 이슈 대신 메일로 먼저 알려 주세요.

View file

@ -0,0 +1,35 @@
---
name: Feature request
about: 기능 제안이나 개선안을 기록합니다
title: "[feature] "
labels: enhancement
assignees: ''
---
## 배경
왜 필요한지 적어 주세요.
## 제안
원하는 동작을 구체적으로 적어 주세요.
## 기대 효과
누가 어떤 점에서 더 편해지는지 적어 주세요.
## 영향 채널
- Windows
- Mobile Web
- Android
- Release / Deploy
- Docs
## 현재 한계와의 관계
`PROJECT_STATUS.md`, `ROADMAP.md`, `문서/` 중 관련 항목이 있으면 적어 주세요.
## 관련 문서
관련된 `문서/` 파일이 있으면 링크해 주세요.

34
.github/ISSUE_TEMPLATE/ux_review.md vendored Normal file
View file

@ -0,0 +1,34 @@
---
name: UX review
about: 사용 흐름, 정보구조, 문구, 피로도 관점의 리뷰를 남깁니다
title: "[ux] "
labels: enhancement
assignees: ''
---
## 어떤 흐름인가요
- 온보딩 / 가입
- 대화 목록
- 검색 / 재탐색
- 대화 / 답장
- 세션 복구
- 릴리즈 / 다운로드
## 현재 불편한 점
사용자 입장에서 어떤 지점이 막히거나 피로한지 적어 주세요.
## 기대하는 방향
더 간편해지기 위해 어떤 변화가 필요하다고 보는지 적어 주세요.
## 영향 채널
- Windows
- Mobile Web
- Android
## 관련 근거
스크린샷, 영상, 문서 링크, 실제 사용 사례가 있으면 같이 남겨 주세요.

17
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View file

@ -0,0 +1,17 @@
## Summary
- 무엇을 바꿨는지
- 왜 바꿨는지
## Scope
- 영향 채널: Windows / Mobile Web / Android / Release / Docs
- 관련 문서:
- UI 변경 시 스크린샷:
## Checklist
- [ ] README 또는 `문서/` 반영 여부 확인
- [ ] CHANGELOG 반영 여부 확인
- [ ] 가입/보안/릴리즈 정책 영향 확인
- [ ] 다운로드 경로 영향 확인 (`download-vstalk.phy.kr`)

52
.github/workflows/ci.yml vendored Normal file
View file

@ -0,0 +1,52 @@
name: ci
on:
push:
branches:
- main
- feat/**
- release/**
pull_request:
jobs:
server:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: global.json
- name: Restore
run: dotnet restore PhysOn.sln
- name: Build API
run: dotnet build src/PhysOn.Api/PhysOn.Api.csproj -c Release --no-restore
- name: Build Worker
run: dotnet build src/PhysOn.Worker/PhysOn.Worker.csproj -c Release --no-restore
- name: Run API integration tests
run: dotnet test tests/PhysOn.Api.IntegrationTests/PhysOn.Api.IntegrationTests.csproj -c Release --no-restore
desktop-windows:
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: global.json
- name: Restore desktop project
run: dotnet restore src/PhysOn.Desktop/PhysOn.Desktop.csproj
- name: Build desktop project
run: dotnet build src/PhysOn.Desktop/PhysOn.Desktop.csproj -c Release --no-restore

231
.github/workflows/release-portable.yml vendored Normal file
View file

@ -0,0 +1,231 @@
name: release-clients
on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
version:
description: "릴리즈 버전. 예: v0.1.0-alpha.1"
required: true
type: string
channel:
description: "릴리즈 채널"
required: true
default: alpha
type: choice
options:
- alpha
- beta
- rc
- stable
upload_to_vps:
description: "준비된 릴리즈 번들을 VPS 다운로드 호스트로 업로드"
required: true
default: false
type: boolean
permissions:
contents: read
jobs:
build-windows:
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: global.json
- name: Restore desktop project
run: dotnet restore src/VsMessenger.Desktop/VsMessenger.Desktop.csproj
- name: Publish portable desktop build
run: dotnet publish src/VsMessenger.Desktop/VsMessenger.Desktop.csproj -c Release -r win-x64 --self-contained true -o out/win-x64
- name: Create portable ZIP
shell: pwsh
run: Compress-Archive -Path out/win-x64/* -DestinationPath out/VsMessenger-win-x64.zip
- name: Upload Windows artifact
uses: actions/upload-artifact@v4
with:
name: windows-portable
path: out/VsMessenger-win-x64.zip
build-android:
if: ${{ hashFiles('src/VsMessenger.Mobile.Android/*.csproj') != '' }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: global.json
- name: Install Android workload
run: dotnet workload install android
- name: Restore Android project
run: dotnet restore src/VsMessenger.Mobile.Android/VsMessenger.Mobile.Android.csproj
- name: Publish Android APK
run: |
dotnet publish src/VsMessenger.Mobile.Android/VsMessenger.Mobile.Android.csproj \
-c Release \
-f net8.0-android \
-p:AndroidPackageFormat=apk \
-p:AndroidKeyStore=false \
-o out/android
- name: Collect Android artifact
run: |
apk_path="$(find out/android -type f -name '*.apk' | head -n 1)"
test -n "$apk_path"
cp "$apk_path" out/VsMessenger-android-universal.apk
- name: Upload Android artifact
uses: actions/upload-artifact@v4
with:
name: android-apk
path: out/VsMessenger-android-universal.apk
assemble-release:
if: ${{ always() && needs.build-windows.result == 'success' && (needs.build-android.result == 'success' || needs.build-android.result == 'skipped') }}
needs:
- build-windows
- build-android
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download Windows artifact
uses: actions/download-artifact@v4
with:
name: windows-portable
path: incoming/windows
- name: Download Android artifact
continue-on-error: true
uses: actions/download-artifact@v4
with:
name: android-apk
path: incoming/android
- name: Prepare release bundle
env:
VERSION_INPUT: ${{ github.event_name == 'workflow_dispatch' && inputs.version || github.ref_name }}
CHANNEL_INPUT: ${{ github.event_name == 'workflow_dispatch' && inputs.channel || '' }}
run: |
chmod +x scripts/release/release-prepare-assets.sh
channel="${CHANNEL_INPUT}"
if [[ -z "$channel" ]]; then
case "$VERSION_INPUT" in
*alpha*) channel="alpha" ;;
*beta*) channel="beta" ;;
*rc*) channel="rc" ;;
*) channel="stable" ;;
esac
fi
prepare_args=(
--version "$VERSION_INPUT"
--channel "$channel"
--windows-zip incoming/windows/VsMessenger-win-x64.zip
--force
)
if [[ -f incoming/android/VsMessenger-android-universal.apk ]]; then
prepare_args+=(--android-apk incoming/android/VsMessenger-android-universal.apk)
fi
./scripts/release/release-prepare-assets.sh \
"${prepare_args[@]}"
- name: Upload release bundle
uses: actions/upload-artifact@v4
with:
name: release-bundle
path: release-assets
publish-forge-release:
if: ${{ secrets.FORGE_RELEASE_TOKEN != '' }}
needs: assemble-release
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download release bundle
uses: actions/download-artifact@v4
with:
name: release-bundle
path: .
- name: Publish release to forge
env:
VERSION_INPUT: ${{ github.event_name == 'workflow_dispatch' && inputs.version || github.ref_name }}
FORGE_RELEASE_TOKEN: ${{ secrets.FORGE_RELEASE_TOKEN }}
run: |
chmod +x scripts/release/release-publish-forge.sh
./scripts/release/release-publish-forge.sh --version "$VERSION_INPUT"
upload-to-vps:
if: github.event_name == 'workflow_dispatch' && inputs.upload_to_vps
needs: assemble-release
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download release bundle
uses: actions/download-artifact@v4
with:
name: release-bundle
path: .
- name: Configure SSH key
env:
DOWNLOAD_SSH_KEY: ${{ secrets.DOWNLOAD_SSH_KEY }}
run: |
test -n "$DOWNLOAD_SSH_KEY"
install -d -m 700 ~/.ssh
printf '%s\n' "$DOWNLOAD_SSH_KEY" > ~/.ssh/download_host
chmod 600 ~/.ssh/download_host
- name: Upload bundle to download host
env:
VERSION_INPUT: ${{ inputs.version }}
DOWNLOAD_SSH_HOST: ${{ secrets.DOWNLOAD_SSH_HOST }}
DOWNLOAD_SSH_USER: ${{ secrets.DOWNLOAD_SSH_USER }}
DOWNLOAD_ROOT: ${{ secrets.DOWNLOAD_ROOT }}
run: |
test -n "$DOWNLOAD_SSH_HOST"
test -n "$DOWNLOAD_SSH_USER"
test -n "$DOWNLOAD_ROOT"
chmod +x scripts/release/release-upload-assets.sh
./scripts/release/release-upload-assets.sh \
--version "$VERSION_INPUT" \
--host "$DOWNLOAD_SSH_HOST" \
--user "$DOWNLOAD_SSH_USER" \
--target "$DOWNLOAD_ROOT" \
--ssh-key ~/.ssh/download_host