Skip to content

chore: 오픈소스 운영 인프라 구축 - #86

Merged
6-keem merged 3 commits into
mainfrom
chore/oss-setup
Jun 13, 2026
Merged

chore: 오픈소스 운영 인프라 구축#86
6-keem merged 3 commits into
mainfrom
chore/oss-setup

Conversation

@6-keem

@6-keem 6-keem commented Jun 13, 2026

Copy link
Copy Markdown
Member

Closes #85

변경 내용

오픈소스 운영을 위한 기반 인프라 일괄 구축.

  • 이슈/PR 템플릿: 버그/기능 YAML 폼 + 중복 검색 안내, PR 이슈 참조 필수
  • pr-checks: lint / prettier / build / test + 이슈 참조 가드
  • release 재구성: Environment 승인 게이트, beta/stable prerelease 분기, Chrome Web Store 게시 기반(비활성), repository_dispatch 진입점
  • discord-notify: 릴리즈(베타/스테이블)·이슈·PR·CI 실패 알림
  • issue-dedup: GitHub Models 기반 유사 이슈 자동 댓글
  • CodeRabbit(.coderabbit.yaml), husky + lint-staged + commitlint
  • prettier 일괄 포맷 정규화, 라벨 정리, .gitattributes(LF)

변경 유형

  • ⚙️ 빌드/CI (chore, ci)

체크리스트

⚠️ 머지 시 release 워크플로가 트리거되면 승인 게이트(Environment)에서 대기합니다. 이 인프라 PR은 릴리즈가 불필요하므로 게이트를 승인하지 마세요.

Summary by CodeRabbit

  • Chores

    • CI/CD 및 릴리스 파이프라인 대폭 재구성(릴리즈·버전 관리·PR 검사·이슈 중복 감지·Discord 알림 등)
    • PR 리뷰 자동화 설정 추가(기본 프로필·자동 응답 포함) 및 커밋/훅/lint-staged 도입으로 개발 검증 강화
  • Documentation

    • 기여 가이드·행동강령·LLM 가이드 및 PR/Issue 템플릿 추가
    • 다국어 문서 네비게이션·가독성 개선 및 문서 렌더링 정리
  • Style

    • 코드·테스트·스타일 전반 포맷 통일 및 리포맷 적용

@coderabbitai

coderabbitai Bot commented Jun 13, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

이 PR은 저장소 운영 템플릿·로컬 검수 도구(husky/commitlint/lint-staged), 여러 GitHub Actions(이슈 중복 탐지·PR 검사·릴리즈·알림), 문서·매니페스트 및 코드/테스트 포맷 정리를 포함합니다.

Changes

오픈소스 운영 인프라 구축

Layer / File(s) Summary
전체 변경 사항 검토
*.yml, *.yaml, .husky/*, commitlint.config.js, package.json, .github/workflows/*, manifest.config.ts, docs/.vitepress/**, src/**, docs/**
이 PR은 이슈/PR 템플릿, PR 본문 이슈 참조 가드, 유사 이슈 자동 탐지, Discord 알림, 릴리즈 파이프라인(채널/프리릴리즈/스토어 옵션), husky+commitlint+lint-staged 구성, package 스크립트 및 devDependencies 변경, 매니페스트 베타 이름 분기, 다국어 문서 표·콜아웃 마크업 정리, 그리고 코드·테스트 포맷 정리(동작 불변)를 모두 포함합니다.

Estimated code review effort:
🎯 4 (Complex) | ⏱️ ~45 minutes

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/oss-setup

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Nitpick comments (1)
.github/workflows/pr-checks.yml (1)

38-39: ⚡ Quick win

verify 잡에 needs: issue-link를 추가해 정책 강제와 CI 낭비를 줄여주세요.

현재는 issue-link 실패 여부와 무관하게 verify가 병렬 실행됩니다. Line 38에서 의존성을 걸면 “이슈-먼저” 정책이 실제 실행 순서로도 보장됩니다.

🔧 제안 패치
   verify:
+    needs: issue-link
     runs-on: ubuntu-latest
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/pr-checks.yml around lines 38 - 39, The verify job is
running in parallel with issue-link; add a dependency so verify waits for
issue-link by adding needs: [issue-link] to the verify job definition
(referencing the job name "verify" and the dependency job "issue-link") so the
CI enforces the "issue-first" policy and avoids wasted runs.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/pr-checks.yml:
- Around line 41-42: The checkout step currently uses actions/checkout@v4
without disabling credential persistence; update the checkout step (the step
that uses actions/checkout@v4) to include a with: block setting
persist-credentials: false so the step becomes: uses: actions/checkout@v4 and
under it add with: persist-credentials: false to prevent the runner from
retaining the clone token in git config.
- Line 23: Replace tag-based GitHub Action references with the pinned commit
SHAs at the listed sites: in .github/workflows/pr-checks.yml (23-23) replace
actions/github-script@v7 with
actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b; in
.github/workflows/pr-checks.yml (42-42) replace actions/checkout@v4 with
actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5; in
.github/workflows/pr-checks.yml (45-45) replace actions/setup-node@v4 with
actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020; and in
.github/workflows/issue-dedup.yml (19-19) replace actions/github-script@v7 with
actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b.

In @.github/workflows/release.yaml:
- Around line 74-86: The prepare step currently computes a new version from the
local package.json (variables pkg, base, major/minor/patch, newVersion,
prerelease) before the approval gate which leads to stale identical versions for
concurrent runs; change the workflow so version computation is re-done after the
approval/serialization step using the authoritative main branch state: fetch and
update refs (git fetch origin main --tags), read the package.json from
origin/main (e.g. git show origin/main:package.json or checkout a fresh main)
and then re-split base/version and recompute major/minor/patch and newVersion
(keeping the existing beta logic using context.runNumber) immediately before
running npm version / git tag / git push so each approved run derives its tag
from the latest main.
- Around line 27-29: 상단 워크플로 전체 권한 블록에서 현재 "permissions: contents: write"를 제거하고
전역 권한을 "read" 또는 "none"으로 축소한 다음, 실제로 푸시/태그/릴리즈를 수행하는 release 잡의 job-level
permissions에만 "contents: write"를 명시해 주세요; prepare 잡과 다른 사전/후속 잡들은 전역 축소된 권한을 그대로
사용하도록 하며 prepare 잡은 필요한 경우에만 package.json과 이벤트 payload를 읽을 수 있게 읽기 권한만 유지하도록
변경하세요 (참조: top-level permissions 설정과 prepare job 및 release job 이름).
- Line 44: Replace movable action refs with immutable commit SHAs: for each
listed site, replace the current uses value with the corresponding repository
commit SHA for that tag (e.g. change actions/checkout@v4 to
actions/checkout@<commit-sha>); specifically update
.github/workflows/release.yaml lines 44,50,107,112,154,179,196,210 to pin
actions/checkout@v4, actions/github-script@v7, actions/checkout@v4,
actions/setup-node@v4, actions/github-script@v7, softprops/action-gh-release@v2,
mnao305/chrome-extension-upload@v5.0.0, and actions/github-script@v7
respectively to their verified commit SHAs, and update
.github/workflows/discord-notify.yml line 25, plus the sibling sites in the
consolidated list (.github/workflows/pr-checks.yml lines 23,42,45;
.github/workflows/issue-dedup.yml line 19; .github/workflows/deploy-docs.yml
lines 24,28,33,39,49) to their respective immutable commit SHAs; fetch each SHA
from the action repo (or a trusted source), replace the `@tag` with @<sha>, and
ensure CI runs succeed.
- Around line 68-71: The workflow currently accepts
context.payload.client_payload.channel and .bump without validation (variables
channel and bump) and then uses channel as the environment; add whitelist
validation in the prepare step to allow only channel ∈ {stable, beta} and bump ∈
{patch, minor, major}, and immediately fail the job if values are outside those
sets (e.g., emit an error and exit non‑zero or call the appropriate GH Actions
fail mechanism), ensuring the validated values (not raw inputs) are emitted via
needs.prepare.outputs.channel/bump for downstream jobs to consume.

---

Nitpick comments:
In @.github/workflows/pr-checks.yml:
- Around line 38-39: The verify job is running in parallel with issue-link; add
a dependency so verify waits for issue-link by adding needs: [issue-link] to the
verify job definition (referencing the job name "verify" and the dependency job
"issue-link") so the CI enforces the "issue-first" policy and avoids wasted
runs.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: a58a9259-fc69-43ed-9eb8-d4b73c0135f4

📥 Commits

Reviewing files that changed from the base of the PR and between fe2d3da and 10ea6d0.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json, !package-lock.json
📒 Files selected for processing (80)
  • .coderabbit.yaml
  • .gitattributes
  • .github/ISSUE_TEMPLATE/bug_report.yml
  • .github/ISSUE_TEMPLATE/config.yml
  • .github/ISSUE_TEMPLATE/feature_request.yml
  • .github/workflows/discord-notify.yml
  • .github/workflows/issue-dedup.yml
  • .github/workflows/pr-checks.yml
  • .github/workflows/release.yaml
  • .github/workflows/versioning.yaml
  • .husky/commit-msg
  • .husky/pre-commit
  • commitlint.config.js
  • docs/.vitepress/config.ts
  • docs/.vitepress/theme/AnnouncementBar.vue
  • docs/en/guide/advanced.md
  • docs/en/guide/basic.md
  • docs/en/guide/calendar.md
  • docs/en/guide/notice.md
  • docs/guide/advanced.md
  • docs/guide/notice.md
  • docs/ja/guide/advanced.md
  • docs/ja/guide/basic.md
  • docs/ja/guide/calendar.md
  • docs/ja/guide/notice.md
  • docs/public/google50ccec79ebc1bb24.html
  • docs/zh/guide/advanced.md
  • docs/zh/guide/basic.md
  • docs/zh/guide/calendar.md
  • docs/zh/guide/notice.md
  • eslint.config.js
  • manifest.config.ts
  • package.json
  • postcss.config.js
  • src/__tests__/badge.test.ts
  • src/__tests__/currentWeek.test.ts
  • src/__tests__/filterData.test.ts
  • src/__tests__/generateKey.test.ts
  • src/__tests__/lmsKeywords.test.ts
  • src/__tests__/stringUtils.test.ts
  • src/__tests__/summarizeCourseData.test.ts
  • src/__tests__/transformCalendarEvents.test.ts
  • src/__tests__/transformCourseData.test.ts
  • src/components/ui/border-trail.tsx
  • src/components/ui/card.tsx
  • src/components/ui/context-menu.tsx
  • src/components/ui/dropdown-menu.tsx
  • src/components/ui/label.tsx
  • src/hooks/use-mobile.tsx
  • src/hooks/useCalendarEvents.ts
  • src/hooks/useCardData.ts
  • src/hooks/useCourseData.tsx
  • src/hooks/useGetCourses.ts
  • src/hooks/useHiddenTasks.ts
  • src/lib/calendarUtils.ts
  • src/lib/courseStatus/badge.ts
  • src/lib/courseStatus/currentWeek.ts
  • src/lib/courseStatus/storage.ts
  • src/lib/dateUtils.ts
  • src/lib/deduplicateInto.ts
  • src/lib/fetchAssign.ts
  • src/lib/fetchCourseData.ts
  • src/lib/fetchQuiz.ts
  • src/lib/fetchVodAttendance.ts
  • src/lib/fetchVodProgress.ts
  • src/lib/injectCourseToggles.ts
  • src/lib/logger.ts
  • src/lib/parseCourses.ts
  • src/lib/stringUtils.ts
  • src/lib/transformCalendarEvents.ts
  • src/lib/transformCourseData.ts
  • src/mocks/loadMockData.ts
  • src/popover/dashboard/Dashboard.tsx
  • src/popover/dashboard/components/DashboardHeader.tsx
  • src/popover/dashboard/components/DueDateList.tsx
  • src/popover/dashboard/components/VodList.tsx
  • src/popover/player/components/PlayerIframe.tsx
  • src/popover/player/components/PlayerPopoverContent.tsx
  • src/popover/player/components/SortableItem.tsx
  • src/styles/shadow.css
💤 Files with no reviewable changes (2)
  • .github/workflows/versioning.yaml
  • src/mocks/loadMockData.ts

Comment thread .github/workflows/pr-checks.yml Outdated
Comment thread .github/workflows/pr-checks.yml Outdated
Comment thread .github/workflows/release.yaml Outdated
Comment thread .github/workflows/release.yaml Outdated
Comment thread .github/workflows/release.yaml
Comment thread .github/workflows/release.yaml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/release.yaml (1)

106-113: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

persist-credentials: false를 설정하세요.

RELEASE_TOKEN(PAT)을 사용할 때 기본값 persist-credentials: true로 인해 토큰이 .git/config에 저장됩니다. 이후 단계나 액션에서 의도치 않게 자격 증명에 접근하거나, 아티팩트에 .git 디렉토리가 포함될 경우 토큰 노출 위험이 있습니다.

수정 제안
       - name: 리포지토리 체크아웃
         uses: actions/checkout@v4
         with:
           fetch-depth: 0
+          persist-credentials: false
           # main 브랜치 보호를 우회해 버전 범프 커밋을 push 하려면
           # 관리자 권한 PAT(RELEASE_TOKEN)이 필요하다. 미설정 시 기본 토큰으로
           # 동작하지만 보호된 main push는 거부된다.
           token: ${{ secrets.RELEASE_TOKEN || github.token }}

참고: persist-credentials: false 설정 시 이후 git push 명령에서 토큰을 명시적으로 사용해야 합니다. 현재 워크플로에서는 git push origin main --follow-tags가 토큰 없이 실행되므로, remote URL에 토큰을 주입하거나 Git credential helper를 설정해야 합니다:

git remote set-url origin "https://x-access-token:${{ secrets.RELEASE_TOKEN || github.token }}`@github.com/`${{ github.repository }}"
git push origin main --follow-tags
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yaml around lines 106 - 113, Set the
actions/checkout@v4 step to persist-credentials: false to avoid storing
RELEASE_TOKEN in .git/config; then update the step that runs git push origin
main --follow-tags to supply credentials explicitly (e.g., set the remote URL to
include x-access-token:${{ secrets.RELEASE_TOKEN || github.token }} or configure
a Git credential helper) so pushes still authenticate without persisting the
token. Ensure the change targets the actions/checkout@v4 block (add
persist-credentials: false) and the job/step that executes git push origin main
--follow-tags (inject token into remote or credential helper).

Source: Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In @.github/workflows/release.yaml:
- Around line 106-113: Set the actions/checkout@v4 step to persist-credentials:
false to avoid storing RELEASE_TOKEN in .git/config; then update the step that
runs git push origin main --follow-tags to supply credentials explicitly (e.g.,
set the remote URL to include x-access-token:${{ secrets.RELEASE_TOKEN ||
github.token }} or configure a Git credential helper) so pushes still
authenticate without persisting the token. Ensure the change targets the
actions/checkout@v4 block (add persist-credentials: false) and the job/step that
executes git push origin main --follow-tags (inject token into remote or
credential helper).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 7d147b7f-d2fc-48d0-825e-1153c7bb11f0

📥 Commits

Reviewing files that changed from the base of the PR and between 10ea6d0 and b937e94.

📒 Files selected for processing (1)
  • .github/workflows/release.yaml

@6-keem 6-keem self-assigned this Jun 13, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/release.yaml:
- Around line 117-121: The checkout step using actions/checkout@v4 currently
omits persist-credentials and leaves the app token in the runner; update the
checkout step (the GitHub Action block that names "리포지토리 체크아웃" and uses
actions/checkout@v4) to include persist-credentials: false under its with:
section (alongside fetch-depth and token) so credentials are not persisted to
.git/config after checkout.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 110794c8-c9f9-4141-8bbc-68d6c4f75225

📥 Commits

Reviewing files that changed from the base of the PR and between b937e94 and bfe585d.

📒 Files selected for processing (1)
  • .github/workflows/release.yaml

Comment thread .github/workflows/release.yaml Outdated
@6-keem
6-keem force-pushed the chore/oss-setup branch 2 times, most recently from cf384bc to 4ef09cd Compare June 13, 2026 15:44

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
.github/workflows/pr-checks.yml (1)

38-39: ⚡ Quick win

이슈 참조 검증 실패 시에도 검증 잡이 계속 돌아 CI 리소스를 낭비합니다.

Line 38의 verify 잡에 needs: issue-link를 걸어 실패-조기종료 흐름으로 묶는 게 좋겠습니다.

패치 제안
   verify:
+    needs: issue-link
     runs-on: ubuntu-latest
     steps:
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/pr-checks.yml around lines 38 - 39, Add a dependency on
the issue-link job to prevent wasteful runs: modify the verify job declaration
(job name "verify") to include needs: ["issue-link"] so the verify job will be
skipped/short-circuited when the issue-link job fails; ensure the YAML uses the
correct indentation and array form for the needs field.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/issue-dedup.yml:
- Around line 80-82: The strict comparison in the duplicates filter can miss
matches when the model returns "number" as a string; update the filter that
assigns duplicates (the expression building duplicates from
JSON.parse(content).duplicates and candidates) to normalize types before
comparing — e.g., coerce both d.number and c.number to the same type
(Number(...) or String(...)) or parseInt/parseFloat as appropriate — so
candidates.some((c) => normalize(d.number) === normalize(c.number)) instead of
direct ===, ensuring NaN and null cases are handled consistently.

In `@CONTRIBUTING.md`:
- Line 39: 행 39의 코드 펜스에 언어 식별자가 누락되어 MD040 린트 경고가 발생하므로 해당 코드 블록의 여는 ```을
```text로 변경하고 제안된 예시 내용을 넣어 코드 블록이 텍스트 형식임을 명시하세요; 구체적으로 CONTRIBUTING.md의 해당 블록을
아래 패치 제안과 동일하게 +```text / <type>: <설명> / (예시) feat: 과제 마감 D-day 알림 추가 / fix: VOD
출석 파싱 오류 수정 / docs: 기여 가이드 추가 / ``` 형태로 업데이트하면 경고가 해소됩니다.

---

Nitpick comments:
In @.github/workflows/pr-checks.yml:
- Around line 38-39: Add a dependency on the issue-link job to prevent wasteful
runs: modify the verify job declaration (job name "verify") to include needs:
["issue-link"] so the verify job will be skipped/short-circuited when the
issue-link job fails; ensure the YAML uses the correct indentation and array
form for the needs field.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: fc89d4c6-5454-4f6b-824b-9eeadf48469c

📥 Commits

Reviewing files that changed from the base of the PR and between bfe585d and cf384bc.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json, !package-lock.json
📒 Files selected for processing (84)
  • .coderabbit.yaml
  • .gitattributes
  • .github/ISSUE_TEMPLATE/bug_report.yml
  • .github/ISSUE_TEMPLATE/config.yml
  • .github/ISSUE_TEMPLATE/feature_request.yml
  • .github/PULL_REQUEST_TEMPLATE.md
  • .github/workflows/discord-notify.yml
  • .github/workflows/issue-dedup.yml
  • .github/workflows/pr-checks.yml
  • .github/workflows/release.yaml
  • .github/workflows/versioning.yaml
  • .husky/commit-msg
  • .husky/pre-commit
  • CLAUDE.md
  • CODE_OF_CONDUCT.md
  • CONTRIBUTING.md
  • commitlint.config.js
  • docs/.vitepress/config.ts
  • docs/.vitepress/theme/AnnouncementBar.vue
  • docs/en/guide/advanced.md
  • docs/en/guide/basic.md
  • docs/en/guide/calendar.md
  • docs/en/guide/notice.md
  • docs/guide/advanced.md
  • docs/guide/notice.md
  • docs/ja/guide/advanced.md
  • docs/ja/guide/basic.md
  • docs/ja/guide/calendar.md
  • docs/ja/guide/notice.md
  • docs/public/google50ccec79ebc1bb24.html
  • docs/zh/guide/advanced.md
  • docs/zh/guide/basic.md
  • docs/zh/guide/calendar.md
  • docs/zh/guide/notice.md
  • eslint.config.js
  • manifest.config.ts
  • package.json
  • postcss.config.js
  • src/__tests__/badge.test.ts
  • src/__tests__/currentWeek.test.ts
  • src/__tests__/filterData.test.ts
  • src/__tests__/generateKey.test.ts
  • src/__tests__/lmsKeywords.test.ts
  • src/__tests__/stringUtils.test.ts
  • src/__tests__/summarizeCourseData.test.ts
  • src/__tests__/transformCalendarEvents.test.ts
  • src/__tests__/transformCourseData.test.ts
  • src/components/ui/border-trail.tsx
  • src/components/ui/card.tsx
  • src/components/ui/context-menu.tsx
  • src/components/ui/dropdown-menu.tsx
  • src/components/ui/label.tsx
  • src/hooks/use-mobile.tsx
  • src/hooks/useCalendarEvents.ts
  • src/hooks/useCardData.ts
  • src/hooks/useCourseData.tsx
  • src/hooks/useGetCourses.ts
  • src/hooks/useHiddenTasks.ts
  • src/lib/calendarUtils.ts
  • src/lib/courseStatus/badge.ts
  • src/lib/courseStatus/currentWeek.ts
  • src/lib/courseStatus/storage.ts
  • src/lib/dateUtils.ts
  • src/lib/deduplicateInto.ts
  • src/lib/fetchAssign.ts
  • src/lib/fetchCourseData.ts
  • src/lib/fetchQuiz.ts
  • src/lib/fetchVodAttendance.ts
  • src/lib/fetchVodProgress.ts
  • src/lib/injectCourseToggles.ts
  • src/lib/logger.ts
  • src/lib/parseCourses.ts
  • src/lib/stringUtils.ts
  • src/lib/transformCalendarEvents.ts
  • src/lib/transformCourseData.ts
  • src/mocks/loadMockData.ts
  • src/popover/dashboard/Dashboard.tsx
  • src/popover/dashboard/components/DashboardHeader.tsx
  • src/popover/dashboard/components/DueDateList.tsx
  • src/popover/dashboard/components/VodList.tsx
  • src/popover/player/components/PlayerIframe.tsx
  • src/popover/player/components/PlayerPopoverContent.tsx
  • src/popover/player/components/SortableItem.tsx
  • src/styles/shadow.css
💤 Files with no reviewable changes (2)
  • src/mocks/loadMockData.ts
  • .github/workflows/versioning.yaml
✅ Files skipped from review due to trivial changes (67)
  • .github/ISSUE_TEMPLATE/config.yml
  • .github/ISSUE_TEMPLATE/feature_request.yml
  • src/lib/fetchAssign.ts
  • CLAUDE.md
  • src/popover/dashboard/components/VodList.tsx
  • src/tests/currentWeek.test.ts
  • eslint.config.js
  • postcss.config.js
  • src/hooks/useHiddenTasks.ts
  • docs/zh/guide/basic.md
  • CODE_OF_CONDUCT.md
  • .github/PULL_REQUEST_TEMPLATE.md
  • docs/zh/guide/notice.md
  • docs/ja/guide/basic.md
  • src/popover/player/components/SortableItem.tsx
  • src/tests/badge.test.ts
  • docs/zh/guide/calendar.md
  • docs/ja/guide/notice.md
  • src/tests/lmsKeywords.test.ts
  • docs/en/guide/notice.md
  • src/lib/parseCourses.ts
  • src/lib/courseStatus/currentWeek.ts
  • src/lib/logger.ts
  • src/tests/stringUtils.test.ts
  • src/tests/generateKey.test.ts
  • .gitattributes
  • src/lib/transformCalendarEvents.ts
  • src/lib/fetchCourseData.ts
  • src/popover/dashboard/components/DashboardHeader.tsx
  • src/tests/transformCalendarEvents.test.ts
  • docs/guide/notice.md
  • docs/ja/guide/advanced.md
  • docs/ja/guide/calendar.md
  • docs/en/guide/advanced.md
  • src/lib/transformCourseData.ts
  • src/components/ui/label.tsx
  • src/hooks/use-mobile.tsx
  • src/popover/player/components/PlayerIframe.tsx
  • src/popover/dashboard/Dashboard.tsx
  • src/hooks/useGetCourses.ts
  • src/popover/dashboard/components/DueDateList.tsx
  • src/lib/stringUtils.ts
  • src/lib/fetchVodProgress.ts
  • src/styles/shadow.css
  • docs/en/guide/basic.md
  • src/lib/courseStatus/storage.ts
  • docs/en/guide/calendar.md
  • src/components/ui/card.tsx
  • src/lib/courseStatus/badge.ts
  • src/lib/dateUtils.ts
  • docs/.vitepress/theme/AnnouncementBar.vue
  • src/lib/calendarUtils.ts
  • docs/guide/advanced.md
  • docs/zh/guide/advanced.md
  • src/popover/player/components/PlayerPopoverContent.tsx
  • src/components/ui/border-trail.tsx
  • src/lib/deduplicateInto.ts
  • .github/ISSUE_TEMPLATE/bug_report.yml
  • src/components/ui/dropdown-menu.tsx
  • src/hooks/useCourseData.tsx
  • src/lib/injectCourseToggles.ts
  • src/tests/filterData.test.ts
  • src/lib/fetchQuiz.ts
  • src/tests/summarizeCourseData.test.ts
  • src/components/ui/context-menu.tsx
  • src/lib/fetchVodAttendance.ts
  • src/tests/transformCourseData.test.ts
🚧 Files skipped from review as they are similar to previous changes (9)
  • commitlint.config.js
  • .husky/commit-msg
  • src/hooks/useCalendarEvents.ts
  • .husky/pre-commit
  • .coderabbit.yaml
  • manifest.config.ts
  • package.json
  • docs/.vitepress/config.ts
  • src/hooks/useCardData.ts

Comment thread .github/workflows/issue-dedup.yml Outdated
Comment thread CONTRIBUTING.md Outdated
@6-keem
6-keem force-pushed the chore/oss-setup branch 3 times, most recently from d3348a7 to 1604d6e Compare June 13, 2026 15:57
@6-keem 6-keem added docs 문서 개선 또는 추가 chore 빌드/도구/설정 등 잡일 labels Jun 13, 2026
@6-keem
6-keem force-pushed the chore/oss-setup branch from 1604d6e to 343d1c7 Compare June 13, 2026 15:59
@6-keem 6-keem added the style 포맷/스타일 (동작 변화 없음) label Jun 13, 2026
6-keem added 3 commits June 14, 2026 01:05
- prettier --write 로 미준수 파일 전체 정규화
- 미사용 catch 변수 제거(no-unused-vars), eslint 생성물 ignore 추가
- .gitattributes 로 텍스트 LF 고정
- 이슈(버그/기능 YAML)·PR 템플릿(이슈 참조 필수), config.yml 중복 검색 안내
- CONTRIBUTING / CODE_OF_CONDUCT (코드펜스 언어 명시)
- .gitignore: 모든 마크다운을 막던 *.md 규칙 제거 (문서 추적 가능하도록)
- husky + lint-staged + commitlint(Conventional Commits)
- CodeRabbit 설정(.coderabbit.yaml): 최초 자동 리뷰, 이후 재리뷰는 수동
- pr-checks: lint/prettier/build/test + 이슈 참조 가드(verify→issue-link 의존)
- release: 승인 게이트(Environment), beta/stable prerelease 분기,
  GitHub App 단기 토큰 push(SHA 핀), Chrome 스토어 게시 기반(비활성)
- discord-notify / issue-dedup(GitHub Models) / pr-autolabel
- manifest 베타 채널 이름 분기, CLAUDE.md 갱신

보안 강화(CodeRabbit 리뷰 반영):
- 모든 액션 커밋 SHA 핀 고정 (공급망 리스크)
- repository_dispatch channel/bump 화이트리스트 검증 (승인 게이트 우회 차단)
- contents:write를 release job으로 한정, checkout persist-credentials:false
- release run 직렬화(concurrency)로 동시 머지 버전 충돌 방지
- run 스텝의 변수는 env로 전달 (스크립트 인젝션 방지)
@6-keem
6-keem force-pushed the chore/oss-setup branch from 343d1c7 to 936b053 Compare June 13, 2026 16:05
@6-keem

6-keem commented Jun 13, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 13, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/pr-autolabel.yml:
- Around line 46-61: The removal loop is running even when target is undefined,
causing MANAGED labels to be deleted despite the "라벨 변경 없음" message; modify the
code that iterates currentNames (the for (const name of currentNames) { ... }
block that calls github.rest.issues.removeLabel) so it only runs when target is
truthy—either move that loop to after the existing if (!target) {
core.info(...); return; } check or wrap the loop in if (target) { ... }—keeping
the core.info message and early return behavior unchanged.

In @.github/workflows/release.yaml:
- Around line 12-23: The workflow allows workflow_dispatch from any ref and
checks out an unconstrained ref, so running it from a non-main branch with
channel=stable can push that branch into main; fix by restricting triggers and
checkout/push behavior: add a branches restriction under on.workflow_dispatch to
only allow main, change the actions/checkout step to pin the checked-out ref to
the triggering commit (use github.sha or github.ref instead of an unconstrained
ref), and update the "변경사항 커밋 및 태그 (stable)" step to only run git push "$REMOTE"
HEAD:main when the workflow is actually running on main (e.g., guard with if:
github.ref == 'refs/heads/main' or use needs.prepare.outputs.channel == 'stable'
&& github.ref == 'refs/heads/main'), so non-main manual runs cannot update main;
also consider making stable push logic require an explicit confirmation input if
you want manual cross-branch runs.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: c5630783-efa3-48da-a71f-a72dbc60347d

📥 Commits

Reviewing files that changed from the base of the PR and between cf384bc and 936b053.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json, !package-lock.json
📒 Files selected for processing (87)
  • .coderabbit.yaml
  • .gitattributes
  • .github/ISSUE_TEMPLATE/bug_report.yml
  • .github/ISSUE_TEMPLATE/config.yml
  • .github/ISSUE_TEMPLATE/feature_request.yml
  • .github/PULL_REQUEST_TEMPLATE.md
  • .github/workflows/deploy-docs.yml
  • .github/workflows/discord-notify.yml
  • .github/workflows/issue-dedup.yml
  • .github/workflows/pr-autolabel.yml
  • .github/workflows/pr-checks.yml
  • .github/workflows/release.yaml
  • .github/workflows/versioning.yaml
  • .gitignore
  • .husky/commit-msg
  • .husky/pre-commit
  • CLAUDE.md
  • CODE_OF_CONDUCT.md
  • CONTRIBUTING.md
  • commitlint.config.js
  • docs/.vitepress/config.ts
  • docs/.vitepress/theme/AnnouncementBar.vue
  • docs/en/guide/advanced.md
  • docs/en/guide/basic.md
  • docs/en/guide/calendar.md
  • docs/en/guide/notice.md
  • docs/guide/advanced.md
  • docs/guide/notice.md
  • docs/ja/guide/advanced.md
  • docs/ja/guide/basic.md
  • docs/ja/guide/calendar.md
  • docs/ja/guide/notice.md
  • docs/public/google50ccec79ebc1bb24.html
  • docs/zh/guide/advanced.md
  • docs/zh/guide/basic.md
  • docs/zh/guide/calendar.md
  • docs/zh/guide/notice.md
  • eslint.config.js
  • manifest.config.ts
  • package.json
  • postcss.config.js
  • src/__tests__/badge.test.ts
  • src/__tests__/currentWeek.test.ts
  • src/__tests__/filterData.test.ts
  • src/__tests__/generateKey.test.ts
  • src/__tests__/lmsKeywords.test.ts
  • src/__tests__/stringUtils.test.ts
  • src/__tests__/summarizeCourseData.test.ts
  • src/__tests__/transformCalendarEvents.test.ts
  • src/__tests__/transformCourseData.test.ts
  • src/components/ui/border-trail.tsx
  • src/components/ui/card.tsx
  • src/components/ui/context-menu.tsx
  • src/components/ui/dropdown-menu.tsx
  • src/components/ui/label.tsx
  • src/hooks/use-mobile.tsx
  • src/hooks/useCalendarEvents.ts
  • src/hooks/useCardData.ts
  • src/hooks/useCourseData.tsx
  • src/hooks/useGetCourses.ts
  • src/hooks/useHiddenTasks.ts
  • src/lib/calendarUtils.ts
  • src/lib/courseStatus/badge.ts
  • src/lib/courseStatus/currentWeek.ts
  • src/lib/courseStatus/storage.ts
  • src/lib/dateUtils.ts
  • src/lib/deduplicateInto.ts
  • src/lib/fetchAssign.ts
  • src/lib/fetchCourseData.ts
  • src/lib/fetchQuiz.ts
  • src/lib/fetchVodAttendance.ts
  • src/lib/fetchVodProgress.ts
  • src/lib/injectCourseToggles.ts
  • src/lib/logger.ts
  • src/lib/parseCourses.ts
  • src/lib/stringUtils.ts
  • src/lib/transformCalendarEvents.ts
  • src/lib/transformCourseData.ts
  • src/mocks/loadMockData.ts
  • src/popover/dashboard/Dashboard.tsx
  • src/popover/dashboard/components/DashboardHeader.tsx
  • src/popover/dashboard/components/DueDateList.tsx
  • src/popover/dashboard/components/VodList.tsx
  • src/popover/player/components/PlayerIframe.tsx
  • src/popover/player/components/PlayerPopoverContent.tsx
  • src/popover/player/components/SortableItem.tsx
  • src/styles/shadow.css
💤 Files with no reviewable changes (3)
  • src/mocks/loadMockData.ts
  • .gitignore
  • .github/workflows/versioning.yaml
✅ Files skipped from review due to trivial changes (63)
  • .husky/pre-commit
  • eslint.config.js
  • src/popover/player/components/SortableItem.tsx
  • src/lib/transformCalendarEvents.ts
  • src/lib/fetchAssign.ts
  • src/lib/fetchVodProgress.ts
  • commitlint.config.js
  • docs/guide/notice.md
  • docs/zh/guide/basic.md
  • docs/ja/guide/basic.md
  • .github/ISSUE_TEMPLATE/feature_request.yml
  • src/lib/dateUtils.ts
  • src/popover/dashboard/Dashboard.tsx
  • .coderabbit.yaml
  • .gitattributes
  • docs/en/guide/advanced.md
  • src/lib/stringUtils.ts
  • src/popover/dashboard/components/DashboardHeader.tsx
  • src/tests/generateKey.test.ts
  • src/lib/deduplicateInto.ts
  • .github/ISSUE_TEMPLATE/config.yml
  • docs/en/guide/calendar.md
  • docs/ja/guide/calendar.md
  • src/lib/courseStatus/storage.ts
  • docs/.vitepress/theme/AnnouncementBar.vue
  • .github/PULL_REQUEST_TEMPLATE.md
  • src/hooks/useHiddenTasks.ts
  • docs/en/guide/notice.md
  • src/components/ui/label.tsx
  • docs/guide/advanced.md
  • src/tests/badge.test.ts
  • src/popover/player/components/PlayerIframe.tsx
  • docs/ja/guide/notice.md
  • src/styles/shadow.css
  • docs/zh/guide/notice.md
  • postcss.config.js
  • src/lib/parseCourses.ts
  • src/lib/courseStatus/badge.ts
  • src/lib/courseStatus/currentWeek.ts
  • src/tests/transformCalendarEvents.test.ts
  • docs/en/guide/basic.md
  • docs/zh/guide/advanced.md
  • src/components/ui/border-trail.tsx
  • src/hooks/useCardData.ts
  • src/lib/logger.ts
  • src/tests/currentWeek.test.ts
  • src/popover/dashboard/components/VodList.tsx
  • src/tests/lmsKeywords.test.ts
  • src/lib/fetchCourseData.ts
  • src/hooks/useGetCourses.ts
  • src/tests/summarizeCourseData.test.ts
  • docs/ja/guide/advanced.md
  • CONTRIBUTING.md
  • src/popover/player/components/PlayerPopoverContent.tsx
  • src/components/ui/card.tsx
  • src/hooks/useCourseData.tsx
  • src/lib/calendarUtils.ts
  • src/tests/filterData.test.ts
  • src/lib/fetchQuiz.ts
  • src/components/ui/context-menu.tsx
  • src/tests/transformCourseData.test.ts
  • src/lib/injectCourseToggles.ts
  • src/components/ui/dropdown-menu.tsx
🚧 Files skipped from review as they are similar to previous changes (14)
  • docs/zh/guide/calendar.md
  • .husky/commit-msg
  • CODE_OF_CONDUCT.md
  • src/tests/stringUtils.test.ts
  • src/lib/fetchVodAttendance.ts
  • .github/ISSUE_TEMPLATE/bug_report.yml
  • src/lib/transformCourseData.ts
  • src/hooks/useCalendarEvents.ts
  • manifest.config.ts
  • docs/.vitepress/config.ts
  • .github/workflows/pr-checks.yml
  • package.json
  • .github/workflows/issue-dedup.yml
  • src/hooks/use-mobile.tsx

Comment thread .github/workflows/pr-autolabel.yml
Comment thread .github/workflows/release.yaml
@6-keem
6-keem merged commit 37e07fa into main Jun 13, 2026
5 checks passed
@6-keem
6-keem deleted the chore/oss-setup branch June 13, 2026 16:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

chore 빌드/도구/설정 등 잡일 docs 문서 개선 또는 추가 style 포맷/스타일 (동작 변화 없음)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

오픈소스 운영 인프라 구축 (이슈/PR 템플릿, CI 재구성, Discord, 커밋 도구)

1 participant