From 77b63f54b389902bdd1fbd9d304e6772d751fe35 Mon Sep 17 00:00:00 2001 From: asyouplz <136051230+asyouplz@users.noreply.github.com> Date: Mon, 16 Mar 2026 15:50:28 +0900 Subject: [PATCH] chore(repo): remove ignored repo files (#83) --- .gitignore | 4 + .releaserc.json | 11 +- CHANGELOG.md | 149 ------------- CLAUDE.md | 14 -- CONTRIBUTING.md | 2 +- README.md | 2 +- RELEASING.md | 2 +- SECURITY.md | 21 -- docs/BRANCH_PROTECTION.md | 134 ----------- docs/LINT_RULES.md | 205 ----------------- ...ian-review-8004-issuecomment-3840783932.md | 135 ----------- ...eview-8004-issuecomment-4007884875-plan.md | 56 ----- ...review-8004-sentence-case-followup-plan.md | 209 ------------------ package-lock.json | 35 --- package.json | 3 - release.config.js | 9 +- scripts/open-coverage.js | 11 - 17 files changed, 10 insertions(+), 992 deletions(-) delete mode 100644 CHANGELOG.md delete mode 100644 CLAUDE.md delete mode 100644 SECURITY.md delete mode 100644 docs/BRANCH_PROTECTION.md delete mode 100644 docs/LINT_RULES.md delete mode 100644 docs/obsidian-review-8004-issuecomment-3840783932.md delete mode 100644 docs/obsidian-review-8004-issuecomment-4007884875-plan.md delete mode 100644 docs/obsidian-review-8004-sentence-case-followup-plan.md delete mode 100644 scripts/open-coverage.js diff --git a/.gitignore b/.gitignore index 0e05061..a187d9b 100644 --- a/.gitignore +++ b/.gitignore @@ -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/ diff --git a/.releaserc.json b/.releaserc.json index 700a618..f1411df 100644 --- a/.releaserc.json +++ b/.releaserc.json @@ -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 @@ } ] ] -} \ No newline at end of file +} diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 7a4d13e..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -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). - - diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 8a38673..0000000 --- a/CLAUDE.md +++ /dev/null @@ -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. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8965814..ad683ce 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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) diff --git a/README.md b/README.md index a16ca2d..f6f805c 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/RELEASING.md b/RELEASING.md index 8b499e9..801a00f 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -20,7 +20,7 @@ SpeechNote ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋ฆด๋ฆฌ์Šค ํ”„๋กœ์„ธ์Šค ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. 3. GitHub Actions๊ฐ€ ์ž๋™์œผ๋กœ: - ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ - - CHANGELOG.md ์ƒ์„ฑ + - GitHub Release ๋…ธํŠธ ์ƒ์„ฑ - GitHub Release ์ƒ์„ฑ - ๋นŒ๋“œ ์•„ํ‹ฐํŒฉํŠธ ์—…๋กœ๋“œ diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 034e848..0000000 --- a/SECURITY.md +++ /dev/null @@ -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. diff --git a/docs/BRANCH_PROTECTION.md b/docs/BRANCH_PROTECTION.md deleted file mode 100644 index dfd139c..0000000 --- a/docs/BRANCH_PROTECTION.md +++ /dev/null @@ -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) diff --git a/docs/LINT_RULES.md b/docs/LINT_RULES.md deleted file mode 100644 index a3727cb..0000000 --- a/docs/LINT_RULES.md +++ /dev/null @@ -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/) diff --git a/docs/obsidian-review-8004-issuecomment-3840783932.md b/docs/obsidian-review-8004-issuecomment-3840783932.md deleted file mode 100644 index 9837cda..0000000 --- a/docs/obsidian-review-8004-issuecomment-3840783932.md +++ /dev/null @@ -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 NOT 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 NOT rebase this PR, this will be handled by the reviewer once the plugin has been approved. -``` diff --git a/docs/obsidian-review-8004-issuecomment-4007884875-plan.md b/docs/obsidian-review-8004-issuecomment-4007884875-plan.md deleted file mode 100644 index 52c698b..0000000 --- a/docs/obsidian-review-8004-issuecomment-4007884875-plan.md +++ /dev/null @@ -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 ` `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` diff --git a/package-lock.json b/package-lock.json index d62dde9..3f863b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index 4b6d395..ebba473 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/release.config.js b/release.config.js index 9e34f64..0818a92 100644 --- a/release.config.js +++ b/release.config.js @@ -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}', }, ], diff --git a/scripts/open-coverage.js b/scripts/open-coverage.js deleted file mode 100644 index 7204e98..0000000 --- a/scripts/open-coverage.js +++ /dev/null @@ -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}`);