chore(repo): remove ignored repo files (#83)

This commit is contained in:
asyouplz 2026-03-16 15:50:28 +09:00 committed by GitHub
parent f54c91b255
commit 77b63f54b3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 10 additions and 992 deletions

4
.gitignore vendored
View file

@ -162,9 +162,12 @@ docs/BRANCH_PROTECTION.md
docs/LINT_RULES.md
docs/obsidian-review-8004-issuecomment-3839142330.md
docs/obsidian-review-8004-issuecomment-3839840641.md
docs/obsidian-review-8004-issuecomment-3840783932.md
docs/obsidian-review-8004-issuecomment-3885815068-detailed-response.md
docs/obsidian-review-8004-issuecomment-3885815068.md
docs/obsidian-review-8004-issuecomment-4007884875-plan.md
docs/obsidian-review-8004.md
docs/obsidian-review-8004-sentence-case-followup-plan.md
# Lint and typecheck output files
lint-output.txt
@ -181,6 +184,7 @@ AGENTS.md
CODE_OF_CONDUCT.md
CLAUDE.md
CHANGELOG.md
SECURITY.md
# Semantic Release
.semantic-release-cache/

View file

@ -65,12 +65,6 @@
}
}
],
[
"@semantic-release/changelog",
{
"changelogFile": "CHANGELOG.md"
}
],
[
"@semantic-release/npm",
{
@ -96,8 +90,7 @@
"manifest.json",
"package.json",
"package-lock.json",
"versions.json",
"CHANGELOG.md"
"versions.json"
],
"message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
}
@ -122,4 +115,4 @@
}
]
]
}
}

View file

@ -1,149 +0,0 @@
## [4.0.15](https://github.com/asyouplz/SpeechNote/compare/v4.0.14...v4.0.15) (2026-03-16)
### 🐛 Bug Fixes
* address obsidian review bot settings copy ([#82](https://github.com/asyouplz/SpeechNote/issues/82)) ([de37e9f](https://github.com/asyouplz/SpeechNote/commit/de37e9f814e063f3a6d74808199dd20a2ae38b99))
## [4.0.14](https://github.com/asyouplz/SpeechNote/compare/v4.0.13...v4.0.14) (2026-03-15)
### 🐛 Bug Fixes
* **settings:** normalize review bot sentence case text ([90e5026](https://github.com/asyouplz/SpeechNote/commit/90e502638618bc659cc396d7e1807c088e0f1cac))
## [4.0.13](https://github.com/asyouplz/SpeechNote/compare/v4.0.12...v4.0.13) (2026-03-15)
### 🐛 Bug Fixes
* **release:** trigger patch release for sentence case follow-ups ([d420ecc](https://github.com/asyouplz/SpeechNote/commit/d420ecc67bfa9a4798778dd915678b361f80e569)), closes [#80](https://github.com/asyouplz/SpeechNote/issues/80)
## [4.0.12](https://github.com/asyouplz/SpeechNote/compare/v4.0.11...v4.0.12) (2026-03-14)
### 🐛 Bug Fixes
* **ui:** use lowercase openai key placeholders ([#79](https://github.com/asyouplz/SpeechNote/issues/79)) ([fcae62a](https://github.com/asyouplz/SpeechNote/commit/fcae62a84512f91b9b4b35cb4afb973a75cc9686))
## [4.0.11](https://github.com/asyouplz/SpeechNote/compare/v4.0.10...v4.0.11) (2026-03-14)
### 🐛 Bug Fixes
* **ui:** use lowercase openai key placeholders ([#78](https://github.com/asyouplz/SpeechNote/issues/78)) ([e7f4139](https://github.com/asyouplz/SpeechNote/commit/e7f4139979eeb5a249911c6f8b5058b88e807ada))
### 🔧 Maintenance
* **ci:** update actions for node 24 runners ([#77](https://github.com/asyouplz/SpeechNote/issues/77)) ([cbdb374](https://github.com/asyouplz/SpeechNote/commit/cbdb374e9d778587da555c1928e16a3599d90308))
* **deps:** bump undici and @actions/http-client ([#74](https://github.com/asyouplz/SpeechNote/issues/74)) ([68312a2](https://github.com/asyouplz/SpeechNote/commit/68312a2b1fb2f4282abf49a464c17b4f4afdd79e))
## [4.0.10](https://github.com/asyouplz/SpeechNote/compare/v4.0.9...v4.0.10) (2026-03-13)
### 🐛 Bug Fixes
* **ui:** align settings review follow-ups ([#73](https://github.com/asyouplz/SpeechNote/issues/73)) ([1686d84](https://github.com/asyouplz/SpeechNote/commit/1686d84e85e5c4a69316121ae4874f4eb7ae0e60))
### 🔧 Maintenance
* **deps:** bump minimatch ([#72](https://github.com/asyouplz/SpeechNote/issues/72)) ([f5638bf](https://github.com/asyouplz/SpeechNote/commit/f5638bf4a4535ba97648e2fef2d3a57c65c18a04))
* **deps:** bump tar and npm ([#71](https://github.com/asyouplz/SpeechNote/issues/71)) ([e1e6521](https://github.com/asyouplz/SpeechNote/commit/e1e6521b5e8bfe7d8f37d4b8ab90b8b32fad38dd))
## [4.0.9](https://github.com/asyouplz/SpeechNote/compare/v4.0.8...v4.0.9) (2026-03-10)
### 🐛 Bug Fixes
* **ui:** address pr 8004 human review feedback ([#70](https://github.com/asyouplz/SpeechNote/issues/70)) ([0f6c3ac](https://github.com/asyouplz/SpeechNote/commit/0f6c3ac21809720c38418ec7f4e86a5a21b9ef58))
### 🔧 Maintenance
* **deps:** bump @tootallnate/once and jest-environment-jsdom ([#69](https://github.com/asyouplz/SpeechNote/issues/69)) ([fee0dde](https://github.com/asyouplz/SpeechNote/commit/fee0dde35cdf1cc23cdee592044e9749e24c2ac7))
## [4.0.8](https://github.com/asyouplz/SpeechNote/compare/v4.0.7...v4.0.8) (2026-02-19)
### ♻️ Code Refactoring
* **ui:** consolidate settings architecture and wave3 fixes ([#67](https://github.com/asyouplz/SpeechNote/issues/67)) ([f62f8ee](https://github.com/asyouplz/SpeechNote/commit/f62f8eec5adee5c0c4a22498102490a3851d7e61))
## [4.0.7](https://github.com/asyouplz/SpeechNote/compare/v4.0.6...v4.0.7) (2026-02-04)
### 🐛 Bug Fixes
* address obsidian review findings ([#65](https://github.com/asyouplz/SpeechNote/issues/65)) ([e28c350](https://github.com/asyouplz/SpeechNote/commit/e28c35058125dab6eda98f53708634ca658cfa3c))
## [4.0.6](https://github.com/asyouplz/SpeechNote/compare/v4.0.5...v4.0.6) (2026-02-03)
### 🐛 Bug Fixes
* **ui:** align emoji labels with sentence case ([#64](https://github.com/asyouplz/SpeechNote/issues/64)) ([2bcaa6a](https://github.com/asyouplz/SpeechNote/commit/2bcaa6a07e81ad23d39c1645b76262e23f3b8a84))
## [4.0.5](https://github.com/asyouplz/SpeechNote/compare/v4.0.4...v4.0.5) (2026-02-03)
### 🐛 Bug Fixes
* **ui:** apply sentence case to provider labels ([#63](https://github.com/asyouplz/SpeechNote/issues/63)) ([3645309](https://github.com/asyouplz/SpeechNote/commit/3645309b5f5db4e028922337c163516b22851fbd))
## [4.0.4](https://github.com/asyouplz/SpeechNote/compare/v4.0.3...v4.0.4) (2026-02-03)
### 🐛 Bug Fixes
* address reviewbot required issues ([#62](https://github.com/asyouplz/SpeechNote/issues/62)) ([a87dc8f](https://github.com/asyouplz/SpeechNote/commit/a87dc8f9d994a3f7d5c48483db21ac25c9ce5c6b))
## [4.0.3](https://github.com/asyouplz/SpeechNote/compare/v4.0.2...v4.0.3) (2026-02-02)
### 🐛 Bug Fixes
* address reviewbot feedback and update tests ([#61](https://github.com/asyouplz/SpeechNote/issues/61)) ([eefd7f1](https://github.com/asyouplz/SpeechNote/commit/eefd7f136d3751733c30e0da02989bebbb62ac3c))
## [4.0.2](https://github.com/asyouplz/SpeechNote/compare/v4.0.1...v4.0.2) (2026-01-29)
### 🐛 Bug Fixes
* address review feedback and stabilize tests ([#60](https://github.com/asyouplz/SpeechNote/issues/60)) ([2d8bc68](https://github.com/asyouplz/SpeechNote/commit/2d8bc686154d28ca68d67c5889a2cfc6f8ecf07c))
* **ci:** add semantic-release configuration ([#59](https://github.com/asyouplz/SpeechNote/issues/59)) ([cb98d70](https://github.com/asyouplz/SpeechNote/commit/cb98d70ce80e9c19c0b03410cc0b0ceafb7d5fc1))
* **ci:** use github app token to bypass repository rulesets ([537a4bb](https://github.com/asyouplz/SpeechNote/commit/537a4bb9561378896143fa679ec435011ac7f562))
* **review:** resolve obsidian bot validation errors (metadata, lint, ui) ([#58](https://github.com/asyouplz/SpeechNote/issues/58)) ([c6df377](https://github.com/asyouplz/SpeechNote/commit/c6df37736221b619a02b1f9c36ce0979c4d4eec9))
## [4.0.0](https://github.com/asyouplz/SpeechNote/compare/v3.0.14...v4.0.0) (2026-01-26)
### ⚠ BREAKING CHANGES
* Manual version updates via version-bump.mjs will be deprecated.
Use Conventional Commits format for all commits going forward.
* fix: address code review feedback from Claude bot
Addressing 8 issues identified in PR #54:
- [P0/Critical] Disable version-bump.yml to prevent workflow conflicts
- [P0/Critical] Remove persist-credentials: false from release-auto.yml
- [P0/Critical] Remove deprecated version lifecycle hook in package.json
- [P1/Important] Add semver and manifest validation to update-version.mjs
- [P1/Important] Fix JSON formatting consistency in scripts
- [P2/Optional] Enhance build artifact verification with file size checks
- [P2/Optional] Rename release.sh to release-emergency.sh and add warning
* fix: address final code review points and documentation updates
* fix: address third round of code review feedback
- Revert pre-commit hook to use lint-staged
- Add file existence checks to update-version.mjs
- Remove unnecessary npm override in package.json
- Add syntax verification for build artifacts in release workflow
### 🚀 Features
* implement semantic-release automation ([#54](https://github.com/asyouplz/SpeechNote/issues/54)) ([240e125](https://github.com/asyouplz/SpeechNote/commit/240e125df5479cda9c084164494756ea87eafb38))
### 🐛 Bug Fixes
* make lint step resilient to eslint crashes ([2e3adc8](https://github.com/asyouplz/SpeechNote/commit/2e3adc8a5301bbd7b4c92e8b2b61dc8bd3746d51))
* upgrade nodejs to v20 for semantic-release ([4dc3ae9](https://github.com/asyouplz/SpeechNote/commit/4dc3ae9abdf25ed9233f50b9c92c45fcbebaeb26))
* upgrade nodejs to v22 for semantic-release v24 ([8c5ec24](https://github.com/asyouplz/SpeechNote/commit/8c5ec24f1b8c49996cb6df5f8bed5d88cee10e8f))
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
<!--
This file will be automatically updated by semantic-release.
Change history will be generated from conventional commit messages.
-->

View file

@ -1,14 +0,0 @@
## Project Work Principles
- If you have existing code, first check if it's workable by modifying it.
- Always find and update related documentation after code modifications are complete.
- Actively collaborate with other agents.
## Code and Script Work Principles
1. When modifying code, first consult @agent-mentor-educational-guide for guidance.
2. @agent-systems-architect seeks advice from @agent-backend-api-infrastructure and @agent-code-refactorer.
3. Then, @agent-documentation-expert modifies the related documentation.
4. @agent-backend-api-infrastructure and @agent-code-refactorer restructure the code.
5. @qa-testing-expert code restructuring end, Always restructure the code only when QA passes. If pass fails, restructure the code again.
6. Always find and update related documentation after code modifications are complete.

View file

@ -179,7 +179,7 @@ Fixes #456
Releases are managed by maintainers:
1. Version bump in `package.json` and `manifest.json`
2. Update `CHANGELOG.md`
2. Publish release notes on GitHub
3. Create a GitHub release with release notes
4. Publish to Obsidian Community Plugins (maintainers only)

View file

@ -1058,7 +1058,7 @@ This project uses **semantic-release** for fully automated versioning and releas
2. **CI/CD Pipeline**: GitHub Actions triggered on push to `main` will:
- Analyze commits to determine the next version (feat -> minor, fix -> patch, BREAKING CHANGE -> major).
- Update `manifest.json`, `package.json`, and `versions.json`.
- Generate `CHANGELOG.md`.
- Generate GitHub Release notes.
- Create a git tag and GitHub Release with built assets.
### 📝 Conventional Commits

View file

@ -20,7 +20,7 @@ SpeechNote 플러그인의 릴리스 프로세스 문서입니다.
3. GitHub Actions가 자동으로:
- 버전 업데이트
- CHANGELOG.md 생성
- GitHub Release 노트 생성
- GitHub Release 생성
- 빌드 아티팩트 업로드

View file

@ -1,21 +0,0 @@
# Security Policy
## Supported Versions
Use this section to tell people about which versions of your project are
currently being supported with security updates.
| Version | Supported |
| ------- | ------------------ |
| 5.1.x | :white_check_mark: |
| 5.0.x | :x: |
| 4.0.x | :white_check_mark: |
| < 4.0 | :x: |
## Reporting a Vulnerability
Use this section to tell people how to report a vulnerability.
Tell them where to go, how often they can expect to get an update on a
reported vulnerability, what to expect if the vulnerability is accepted or
declined, etc.

View file

@ -1,134 +0,0 @@
# Branch Protection 설정 가이드
GitHub repository의 main 브랜치를 보호하기 위한 설정 가이드입니다.
## 왜 Branch Protection이 필요한가?
Branch Protection은 다음을 보장합니다:
- ✅ 모든 코드가 리뷰를 거쳐 merge됨
- ✅ CI 파이프라인 통과 없이는 merge 불가
- ✅ 직접 main 브랜치에 push 방지
- ✅ 코드 품질 유지
## 설정 방법
### 1. GitHub Repository 설정 접근
1. **GitHub Repository로 이동**: https://github.com/asyouplz/SpeechNote
2. **Settings 탭 클릭** (repository 상단 메뉴)
3. 왼쪽 사이드바에서 **"Branches"** 클릭 (Code and automation 섹션)
### 2. Branch Protection Rule 추가
1. **"Add branch protection rule"** 버튼 클릭
2. **Branch name pattern**: `main` 입력
### 3. 보호 규칙 설정
다음 옵션들을 체크:
#### Required (필수)
- ✅ **Require a pull request before merging**
- ✅ "Require approvals" 체크
- Approvals 수: `1` 입력
- ✅ **Require status checks to pass before merging**
- ✅ "Require branches to be up to date before merging" 체크
- 검색창에서 다음 status checks 추가:
- `Code Quality Check`
- `Build Test`
> **참고**: Status checks는 최소 한 번 이상 CI가 실행된 후에야 선택 가능합니다.
> PR을 하나 생성하고 CI를 실행한 후 이 설정을 추가하세요.
#### Optional but Recommended (선택적, 권장)
- ✅ **Do not allow bypassing the above settings**
- 관리자도 규칙을 우회할 수 없도록 강제
- ✅ **Require conversation resolution before merging**
- PR 코멘트가 모두 resolved되어야 merge 가능
- ✅ **Lock branch**
- main 브랜치를 read-only로 만들기 (선택적)
### 4. 설정 저장
- 페이지 하단의 **"Create"** 버튼 클릭
## 설정 검증
Branch Protection이 올바르게 설정되었는지 확인:
1. **새 PR 생성**:
```bash
git checkout -b test-branch
echo "test" >> test.txt
git add test.txt
git commit -m "test: branch protection"
git push origin test-branch
```
2. **GitHub에서 PR 생성**
3. **다음 사항 확인**:
- [ ] CI가 자동으로 실행됨
- [ ] CI 통과 전에는 merge 버튼이 비활성화됨
- [ ] "Merge" 대신 "Merge when checks pass" 표시
- [ ] 1명의 approval 필요 표시
## Status Checks가 안 보일 때
Status checks는 CI가 최소 한 번 실행된 후에만 선택 가능합니다:
1. **먼저 PR 생성하고 CI 실행**:
- 아무 변경사항으로 PR을 생성
- CI가 완료될 때까지 대기
2. **다시 Branch Protection 설정으로 이동**:
- Settings → Branches → Edit rule
- "Require status checks to pass" 섹션에서
- 검색창에 체크할 항목들이 나타남
3. **필요한 checks 선택**:
- `Code Quality Check`
- `Build Test`
## Troubleshooting
### "Settings" 탭이 안 보여요
- Repository의 owner 또는 admin 권한이 필요합니다
- Collaborator라면 owner에게 admin 권한을 요청하세요
### Status checks를 추가할 수 없어요
- CI 워크플로우가 최소 한 번 실행되어야 합니다
- PR을 생성하고 CI가 완료된 후 다시 시도하세요
### CI를 우회하고 싶어요
- **권장하지 않습니다**. Branch protection의 목적을 훼손합니다
- 긴급 hotfix가 필요한 경우:
1. "Allow specified actors to bypass required pull requests" 체크
2. 특정 사용자/팀만 우회 허용 (최소한으로 제한)
## 다음 단계
Branch Protection 설정 후:
1. ✅ 팀원들에게 새로운 워크플로우 안내
2. ✅ [docs/RELEASE.md](RELEASE.md) 참조하여 릴리즈 프로세스 숙지
3. ✅ Pre-commit hooks 설정: `npm install`
## 참고 자료
- [GitHub Branch Protection 공식 문서](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches)
- [Status Checks 설정](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/about-status-checks)

View file

@ -1,205 +0,0 @@
# Obsidian Plugin Lint Rules Guide
이 문서는 Obsidian 플러그인 개발 시 준수해야 하는 린트 규칙을 설명합니다. 이 규칙들은 [Obsidian 플러그인 리뷰 프로세스](https://github.com/obsidianmd/obsidian-releases)에서 자동으로 체크되는 항목들입니다.
## 로컬에서 린트 실행 방법
```bash
# 기본 린트 체크
npm run lint
# 자동 수정 가능한 항목 수정
npm run lint:fix
# Obsidian 특화 린트 (상세 리포트)
npm run lint:obsidian
# 경고도 에러로 처리 (CI와 동일한 엄격함)
npm run lint:verbose
```
## 주요 Required 규칙 (필수 수정)
### 1. Async/Await 사용
**규칙**: `@typescript-eslint/require-await`
async 함수는 반드시 `await` 표현식을 포함해야 합니다.
```typescript
// ❌ 잘못된 예
async function loadSettings() {
return this.settings;
}
// ✅ 올바른 예
async function loadSettings() {
const data = await this.loadData();
return data || DEFAULT_SETTINGS;
}
// ✅ 또는 async 제거
function loadSettings() {
return this.settings;
}
```
### 2. 불필요한 Type Assertion 제거
**규칙**: `@typescript-eslint/no-unnecessary-type-assertion`
타입을 변경하지 않는 불필요한 type assertion은 제거해야 합니다.
```typescript
// ❌ 잘못된 예
const value = someValue as string as string;
const element = document.createElement('div') as HTMLDivElement;
// ✅ 올바른 예
const value = someValue as string;
const element = document.createElement('div');
```
### 3. Empty Object Type 사용 금지
**규칙**: `@typescript-eslint/ban-types`
빈 객체 타입 `{}`는 사용하지 않고 `object` 또는 `unknown`을 사용해야 합니다.
```typescript
// ❌ 잘못된 예
function processData(data: {}) {
// ...
}
// ✅ 올바른 예
function processData(data: object) {
// ...
}
// 또는 더 명확하게
function processData(data: unknown) {
// ...
}
```
### 4. Floating Promises 처리
**규칙**: `@typescript-eslint/no-floating-promises`
Promise를 반환하는 함수는 적절히 처리해야 합니다.
```typescript
// ❌ 잘못된 예
someAsyncFunction(); // Promise가 처리되지 않음
// ✅ 올바른 예
await someAsyncFunction();
// 또는 명시적으로 무시
void someAsyncFunction();
// 또는 catch 처리
someAsyncFunction().catch((error) => {
console.error('Error:', error);
});
```
### 5. Deprecated API 사용 금지
Obsidian API의 deprecated 항목은 사용하지 않아야 합니다:
- `noticeEl``messageEl` 사용
- `createElement` → Obsidian의 `createEl` 또는 `createDiv` 사용
```typescript
// ❌ 잘못된 예
const notice = new Notice('Message');
notice.noticeEl.addClass('custom-class');
// ✅ 올바른 예
const notice = new Notice('Message');
notice.messageEl?.addClass('custom-class');
```
## Obsidian 플러그인 특화 규칙
### UI Sentence Case
**규칙**: `obsidian/ui/sentence-case`
UI 텍스트는 sentence case를 사용해야 합니다 (첫 글자만 대문자).
```typescript
// ❌ 잘못된 예
addCommand({
id: 'my-command',
name: 'Convert Audio To Text', // Title Case
});
// ✅ 올바른 예
addCommand({
id: 'my-command',
name: 'Convert audio to text', // Sentence case
});
```
### Sample Code 제거
**규칙**: `obsidian/no-sample-code`
샘플 코드나 placeholder는 제거해야 합니다:
- `MyPlugin` → 실제 플러그인 이름으로 변경
- `SampleSettingTab` → 실제 이름으로 변경
- 샘플 커맨드 제거
### HTML Heading 금지
**규칙**: `obsidian/settings-tab/no-manual-html-headings`
Settings 탭에서 HTML heading 태그를 직접 사용하지 않아야 합니다.
```typescript
// ❌ 잘못된 예
containerEl.createEl('h2', { text: 'General Settings' });
// ✅ 올바른 예
new Setting(containerEl).setName('General settings').setHeading();
```
## Optional 규칙 (경고)
### 미사용 변수 및 Imports
**규칙**: `unused-imports/no-unused-vars`, `unused-imports/no-unused-imports`
사용되지 않는 변수나 imports는 자동으로 제거됩니다:
```bash
npm run lint:fix
```
underscore(`_`)로 시작하는 변수는 미사용으로 허용됩니다:
```typescript
// ✅ 허용됨
const _unusedVariable = someValue;
function handler(_event: Event) {
// event를 사용하지 않지만 signature가 필요한 경우
}
```
## CI 파이프라인 통합
모든 PR은 자동으로 이 린트 규칙들을 체크합니다:
1. GitHub PR 생성 시 자동 실행
2. `Code Quality Check` job에서 린트 체크
3. 에러 발생 시 PR 머지 차단
## 추가 리소스
- [Obsidian Plugin Guidelines](https://docs.obsidian.md/Plugins/Releasing/Plugin+guidelines)
- [eslint-plugin-obsidian](https://github.com/obsidianmd/eslint-plugin)
- [Obsidian Developer Docs](https://docs.obsidian.md/)

View file

@ -1,135 +0,0 @@
# Obsidian Review Bot Comment (PR #8004) — main 브랜치 기준
- Source: https://github.com/obsidianmd/obsidian-releases/pull/8004#issuecomment-3840783932
- GitHub main SHA: 7531c3d2410fa964d6023fde75db6b234b34542c
- Updated (UTC): 2026-02-03T11:34:35Z
---
## Required Findings (main 브랜치 기준)
> [!IMPORTANT]
> 아래 링크는 **GitHub main 브랜치 커밋** 기준입니다.
---
### 'audio.sampleRate' may use Object's default stringification format ('[object Object]') when stringified.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/infrastructure/api/SettingsValidator.ts#L299-L299](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/infrastructure/api/SettingsValidator.ts#L299-L299)
수정 주석: 객체가 될 수 있는 값은 String(...) 또는 JSON.stringify(...)로 명시 변환하고 타입을 좁힙니다.
### 'value' may use Object's default stringification format ('[object Object]') when stringified.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/progress/StatusMessage.ts#L273-L273](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/progress/StatusMessage.ts#L273-L273)
수정 주석: 객체가 될 수 있는 값은 String(...) 또는 JSON.stringify(...)로 명시 변환하고 타입을 좁힙니다.
### Use sentence case for UI text.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L395-L395](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L395-L395)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L512-L512](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L512-L512)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L586-L586](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L586-L586)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L623-L623](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L623-L623)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L710-L710](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L710-L710)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L759-L759](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L759-L759)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L155-L155](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L155-L155)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L319-L319](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L319-L319)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L357-L357](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L357-L357)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L368-L368](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L368-L368)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L369-L369](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L369-L369)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L380-L380](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L380-L380)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L403-L403](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L403-L403)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L405-L405](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L405-L405)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTabOptimized.ts#L473-L473](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTabOptimized.ts#L473-L473)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTabOptimized.ts#L482-L482](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTabOptimized.ts#L482-L482)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTabRefactored.ts#L156-L156](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTabRefactored.ts#L156-L156)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L42-L42](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L42-L42)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L64-L64](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L64-L64)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L65-L65](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L65-L65)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L81-L81](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L81-L81)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L84-L84](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L84-L84)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L96-L96](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L96-L96)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/components/DeepgramSettings.ts#L581-L581](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/components/DeepgramSettings.ts#L581-L581)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/components/ProviderSettings.ts#L83-L83](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/components/ProviderSettings.ts#L83-L83)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/components/ProviderSettings.ts#L84-L84](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/components/ProviderSettings.ts#L84-L84)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/components/ProviderSettings.ts#L85-L85](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/components/ProviderSettings.ts#L85-L85)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/components/ProviderSettings.ts#L309-L309](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/components/ProviderSettings.ts#L309-L309)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainer.ts#L197-L197](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainer.ts#L197-L197)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainer.ts#L198-L198](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainer.ts#L198-L198)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainer.ts#L199-L199](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainer.ts#L199-L199)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainerRefactored.ts#L289-L289](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainerRefactored.ts#L289-L289)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainerRefactored.ts#L290-L290](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainerRefactored.ts#L290-L290)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
- [7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainerRefactored.ts#L291-L291](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainerRefactored.ts#L291-L291)
수정 주석: UI 문구를 sentence case(첫 단어만 대문자)로 통일하되, 고유명사 표기는 유지합니다.
---
## Optional Findings (main 브랜치 기준)
- (없음)
---
## Original Review Comment
```markdown
Thank you for your submission, an automated scan of your plugin code's revealed the following issues:
### Required
[\[1\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/infrastructure/api/SettingsValidator.ts#L299-L299)
'audio.sampleRate' may use Object's default stringification format ('[object Object]') when stringified.
[\[1\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/progress/StatusMessage.ts#L273-L273)
'value' may use Object's default stringification format ('[object Object]') when stringified.
[\[1\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L395-L395)[\[2\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L512-L512)[\[3\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L586-L586)[\[4\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L623-L623)[\[5\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L710-L710)[\[6\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/EnhancedSettingsTab.ts#L759-L759)[\[7\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L155-L155)[\[8\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L319-L319)[\[9\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L357-L357)[\[10\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L368-L368)[\[11\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L369-L369)[\[12\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L380-L380)[\[13\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L403-L403)[\[14\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTab.ts#L405-L405)[\[15\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTabOptimized.ts#L473-L473)[\[16\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTabOptimized.ts#L482-L482)[\[17\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SettingsTabRefactored.ts#L156-L156)[\[18\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L42-L42)[\[19\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L64-L64)[\[20\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L65-L65)[\[21\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L81-L81)[\[22\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L84-L84)[\[23\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/SimpleSettingsTab.ts#L96-L96)[\[24\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/components/DeepgramSettings.ts#L581-L581)[\[25\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/components/ProviderSettings.ts#L83-L83)[\[26\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/components/ProviderSettings.ts#L84-L84)[\[27\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/components/ProviderSettings.ts#L85-L85)[\[28\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/components/ProviderSettings.ts#L309-L309)[\[29\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainer.ts#L197-L197)[\[30\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainer.ts#L198-L198)[\[31\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainer.ts#L199-L199)[\[32\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainerRefactored.ts#L289-L289)[\[33\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainerRefactored.ts#L290-L290)[\[34\]](https://github.com/asyouplz/SpeechNote/blob/7531c3d2410fa964d6023fde75db6b234b34542c/src/ui/settings/provider/ProviderSettingsContainerRefactored.ts#L291-L291)
Use sentence case for UI text.
---
### Optional
---
Do <b>NOT</b> open a new PR for re-validation.
Once you have pushed some changes to your repository the bot will rescan within 6 hours
If you think some of the required changes are incorrect, please comment with `/skip` and the reason why you think the results are incorrect.
To run these checks locally, install the [eslint plugin](https://github.com/obsidianmd/eslint-plugin) in your project.
Do <b>NOT</b> rebase this PR, this will be handled by the reviewer once the plugin has been approved.
```

View file

@ -1,56 +0,0 @@
# Plan for PR #8004 Follow-up
- Source comment: https://github.com/obsidianmd/obsidian-releases/pull/8004#issuecomment-4007884875
- Comment date: 2026-03-05
- Branch baseline: `fix/pr8004-human-review`
## Review Summary
The reviewer has no more line-level comments for now, but asked for three remaining cleanup areas before a broader review:
1. Choose either Korean or English for the UI and logs.
2. Prefix CSS selectors to avoid leaking styles outside the plugin.
3. Review SVG creation.
## Decisions
### 1. UI and log language
- Choose English as the canonical language for user-facing UI copy and runtime logs.
- Translate remaining Korean notices, labels, button text, ARIA labels, and log messages in the active settings and shared UI paths.
- Leave developer comments unchanged unless they affect runtime text.
### 2. CSS selector prefixing
- Prefix provider-settings selectors with the existing `sn-` namespace.
- Update the corresponding DOM class names in `ProviderSettings.ts`.
- Keep selectors scoped under `.speech-to-text-settings` where practical.
### 3. SVG creation
- Audit the codebase for raw SVG HTML injection.
- Keep using Obsidian's `setIcon(...)` helper and `document.createElementNS(...)` for programmatic SVG.
- Only change code if a non-namespaced or string-based SVG path is found.
## Execution Order
1. Update shared settings/UI text and logs to English.
2. Prefix provider-settings CSS classes and sync the TypeScript renderers.
3. Finish the SVG audit and document whether code changes were needed.
4. Run targeted validation: typecheck, lint, and focused tests if string or selector changes affect coverage.
## Validation Notes
- Search for remaining Korean runtime strings in `src/`.
- Search for remaining unprefixed provider-settings selectors.
- Search for raw `<svg` or `createEl('svg')` usage and confirm only safe creation paths remain.
## Additional Bot Follow-up
- Follow-up comment: https://github.com/obsidianmd/obsidian-releases/pull/8004#issuecomment-4029277995
- Comment date: 2026-03-10
Applied follow-up cleanup:
1. Use sentence case for the `DragDropZone` helper text.
2. Remove the unused `safeJsonParse` import flagged in `StatisticsDashboard.ts`.

View file

@ -1,209 +0,0 @@
# PR #8004 Sentence Case Follow-up Plan
- Source comments:
- https://github.com/obsidianmd/obsidian-releases/pull/8004#issuecomment-4060715550
- https://github.com/obsidianmd/obsidian-releases/pull/8004#issuecomment-4061036624
- Branch baseline: `origin/fix/pr8004-settings-sentence-case-followups`
- Local verification date: 2026-03-15
## Goal
The review bot is still flagging UI copy that is not in sentence case.
For this follow-up, treat "sentence case" as:
- Capitalize only the first word of a sentence or label.
- Keep brand names and acronyms as proper nouns when needed.
- Avoid title-case nouns inside labels and dropdown options unless they are brand names.
## Current status
The issue is not fully fixed on the current remote follow-up branch.
The remaining work falls into two groups:
1. Active settings UI that the user can still reach now.
2. Secondary settings components that are still present in the repository and may still be scanned by the review bot.
## Group 1: Active settings UI
### `src/ui/settings/SettingsTab.ts`
These strings still look likely to trigger the review bot:
- `Auto (intelligent selection)` -> `Automatic (recommended)`
- `OpenAI whisper` -> `OpenAI Whisper`
- `Cost optimized` -> `Cost-optimized`
- `Performance optimized` -> `Performance-optimized`
- `Quality optimized` -> `Quality-optimized`
- `Round robin` -> `Round-robin`
- `A/B testing` -> `A/B testing`
- Keep as-is only if the rule accepts acronym-style casing.
- If the bot still flags it, change to `A/B tests`.
- `Provider API keys` -> `Provider API keys`
- This may still be flagged because of internal capitalization.
- Safer alternative: `API keys for providers`
- `OpenAI API key` -> `OpenAI API key`
- Keep brand capitalization, but verify whether the rule tolerates this.
- If not, use `API key for OpenAI`.
- `Enter your OpenAI API key for whisper transcription` -> `Enter your OpenAI API key for Whisper transcription`
- `Saved the OpenAI API key.` -> `Saved the OpenAI API key.`
- If still flagged, use `Saved the API key for OpenAI.`
- `Deepgram API key saved.` -> `Saved the Deepgram API key.`
- `Whisper model` -> `Whisper model`
- `Debug information` -> `Debug information`
- `Buy me a coffee` -> `Buy me a coffee`
Representative lines to revisit:
- [SettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SettingsTab.ts:155)
- [SettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SettingsTab.ts:156)
- [SettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SettingsTab.ts:262)
- [SettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SettingsTab.ts:263)
- [SettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SettingsTab.ts:264)
- [SettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SettingsTab.ts:265)
- [SettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SettingsTab.ts:266)
- [SettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SettingsTab.ts:298)
- [SettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SettingsTab.ts:369)
- [SettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SettingsTab.ts:370)
- [SettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SettingsTab.ts:381)
- [SettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SettingsTab.ts:414)
- [SettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SettingsTab.ts:527)
- [SettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SettingsTab.ts:652)
### `src/ui/settings/SimpleSettingsTab.ts`
These are the same issue in a smaller settings surface:
- `Auto (intelligent selection)` -> `Automatic (recommended)`
- `OpenAI whisper` -> `OpenAI Whisper`
- `OpenAI API key` -> `OpenAI API key`
- Fallback if flagged: `API key for OpenAI`
- `Enter your OpenAI API key for whisper` -> `Enter your OpenAI API key for Whisper`
- `Deepgram model` -> `Deepgram model`
- `Debug information` -> `Debug information`
- `Enhanced` -> `Enhanced`
- `Base (economy)` -> `Base (economy)`
- These may be acceptable if treated as product labels; verify after the first pass.
Representative lines to revisit:
- [SimpleSettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SimpleSettingsTab.ts:41)
- [SimpleSettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SimpleSettingsTab.ts:42)
- [SimpleSettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SimpleSettingsTab.ts:64)
- [SimpleSettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SimpleSettingsTab.ts:65)
- [SimpleSettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SimpleSettingsTab.ts:95)
- [SimpleSettingsTab.ts](/home/tslee/SpeechNote/src/ui/settings/SimpleSettingsTab.ts:155)
## Group 2: Secondary settings components still in the repository
These are still present on the branch and were explicitly referenced by the review bot comment.
### `src/ui/settings/components/ApiKeyValidator.ts`
Potentially problematic sentence-case copy:
- `The API key is valid, but it may not have access to whisper.` -> `The API key is valid, but it may not have access to Whisper.`
Representative line:
- [ApiKeyValidator.ts](/home/tslee/SpeechNote/src/ui/settings/components/ApiKeyValidator.ts:73)
### `src/ui/settings/components/AudioSettings.ts`
Potentially problematic copy:
- `Whisper-1 (default)` -> `Whisper-1 (default)`
- Likely acceptable, but the bot has flagged this area before.
- `Verbose JSON (detailed output)` -> `Verbose JSON (detailed output)`
- If flagged, change to `Detailed JSON output`
- `WebVTT format (VTT)` -> `WebVTT format (VTT)`
- Likely acceptable because of the proper acronym.
- `Maximum file size` and `25 MB` are fine semantically; only change if the bot flags exact casing nearby.
Representative lines:
- [AudioSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/AudioSettings.ts:40)
- [AudioSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/AudioSettings.ts:44)
- [AudioSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/AudioSettings.ts:63)
- [AudioSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/AudioSettings.ts:65)
- [AudioSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/AudioSettings.ts:103)
- [AudioSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/AudioSettings.ts:114)
### `src/ui/settings/components/ProviderSettings.ts`
Still contains sentence-case candidates:
- `Automatic (recommended)` is already improved, but verify whether the bot still flags brand-heavy option labels.
- `OpenAI whisper` -> `OpenAI Whisper`
- `Cost optimized` -> `Cost-optimized`
- `Performance optimized` -> `Performance-optimized`
- `Quality optimized` -> `Quality-optimized`
- `Round robin` -> `Round-robin`
- `A/B testing` -> `A/B tests` if needed
- `Performance metrics` -> `Performance metrics`
- `Provider comparison` -> `Provider comparison`
Representative lines:
- [ProviderSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/ProviderSettings.ts:83)
- [ProviderSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/ProviderSettings.ts:84)
- [ProviderSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/ProviderSettings.ts:85)
- [ProviderSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/ProviderSettings.ts:222)
- [ProviderSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/ProviderSettings.ts:223)
- [ProviderSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/ProviderSettings.ts:224)
- [ProviderSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/ProviderSettings.ts:225)
- [ProviderSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/ProviderSettings.ts:226)
- [ProviderSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/ProviderSettings.ts:285)
- [ProviderSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/ProviderSettings.ts:352)
- [ProviderSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/ProviderSettings.ts:410)
### `src/ui/settings/components/ShortcutSettings.ts`
Representative flagged copy:
- `Shortcut conflicts detected` -> `Shortcut conflicts detected`
- `Recording... (press Escape to cancel)` -> `Recording... (press Escape to cancel)`
These already look sentence-case compliant, so this file should be rechecked carefully before changing anything.
Representative lines:
- [ShortcutSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/ShortcutSettings.ts:153)
- [ShortcutSettings.ts](/home/tslee/SpeechNote/src/ui/settings/components/ShortcutSettings.ts:488)
## Proposed execution order
1. Fix the active settings surfaces first:
- `SettingsTab.ts`
- `SimpleSettingsTab.ts`
2. Fix the explicitly referenced secondary components:
- `ApiKeyValidator.ts`
- `AudioSettings.ts`
- `ProviderSettings.ts`
- `ShortcutSettings.ts` only if a real sentence-case issue is confirmed
3. Re-run repository-wide copy checks with targeted grep:
- `OpenAI whisper`
- `Auto (intelligent selection)`
- `Cost optimized`
- `Performance optimized`
- `Quality optimized`
- `Round robin`
- `Debug information`
4. Run full validation:
- `npm run build:css`
- `npm run typecheck`
- `npm run build`
- `npx jest --runInBand`
## Notes
- The local ESLint setup in this repository does not currently expose the review bot's `obsidianmd/ui/sentence-case` rule, so validation here must be done by direct string audit plus normal build/test checks.
- Prefer minimal wording changes over broad copy rewrites.
- Preserve proper nouns:
- `OpenAI`
- `Deepgram`
- `Whisper`
- `WebVTT`
- `JSON`
- `API`

35
package-lock.json generated
View file

@ -12,7 +12,6 @@
"@commitlint/cli": "^20.3.1",
"@commitlint/config-conventional": "^20.3.1",
"@deepgram/sdk": "^3.9.0",
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/exec": "^7.1.0",
"@semantic-release/git": "^10.0.1",
"@semantic-release/github": "^12.0.2",
@ -3007,40 +3006,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/@semantic-release/changelog": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz",
"integrity": "sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==",
"dev": true,
"license": "MIT",
"dependencies": {
"@semantic-release/error": "^3.0.0",
"aggregate-error": "^3.0.0",
"fs-extra": "^11.0.0",
"lodash": "^4.17.4"
},
"engines": {
"node": ">=14.17"
},
"peerDependencies": {
"semantic-release": ">=18.0.0"
}
},
"node_modules/@semantic-release/changelog/node_modules/fs-extra": {
"version": "11.3.3",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz",
"integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=14.14"
}
},
"node_modules/@semantic-release/commit-analyzer": {
"version": "13.0.1",
"resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-13.0.1.tgz",

View file

@ -26,14 +26,12 @@
"test:debug": "DEBUG=true node --inspect-brk ./node_modules/.bin/jest --runInBand",
"test:changed": "jest -o",
"test:update-snapshots": "jest -u",
"coverage:report": "node scripts/open-coverage.js",
"coverage:clean": "rm -rf coverage .jest-cache",
"pretest": "npm run lint && npm run typecheck",
"version:update": "node scripts/update-version.mjs",
"semantic-release": "semantic-release",
"release:dry-run": "semantic-release --dry-run",
"release:debug": "semantic-release --debug",
"posttest": "npm run coverage:report",
"clean": "rm -rf main.js main.js.map coverage .jest-cache",
"clean:all": "npm run clean && rm -rf node_modules",
"typecheck": "npx tsc -noEmit",
@ -55,7 +53,6 @@
"@commitlint/cli": "^20.3.1",
"@commitlint/config-conventional": "^20.3.1",
"@deepgram/sdk": "^3.9.0",
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/exec": "^7.1.0",
"@semantic-release/git": "^10.0.1",
"@semantic-release/github": "^12.0.2",

View file

@ -3,7 +3,6 @@ module.exports = {
plugins: [
'@semantic-release/commit-analyzer',
'@semantic-release/release-notes-generator',
'@semantic-release/changelog',
[
'@semantic-release/npm',
{
@ -19,13 +18,7 @@ module.exports = {
[
'@semantic-release/git',
{
assets: [
'CHANGELOG.md',
'package.json',
'package-lock.json',
'manifest.json',
'versions.json',
],
assets: ['package.json', 'package-lock.json', 'manifest.json', 'versions.json'],
message: 'chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}',
},
],

View file

@ -1,11 +0,0 @@
const fs = require('fs');
const path = require('path');
const reportPath = path.join(__dirname, '..', 'coverage', 'lcov-report', 'index.html');
if (!fs.existsSync(reportPath)) {
console.warn('Coverage report not found. Skipping open step.');
process.exit(0);
}
console.log(`Coverage report: ${reportPath}`);