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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ wrangler.jsonc Worker 설정과 공개 값(vars)

승인·병합의 공통 규칙은 `utils/prActions.js` 에 있다. 요약하면 Week 가 다르거나 Status 가 `Solving` 인 PR, Draft PR 은 건너뛰고, 승인은 CI 가 통과한 PR 에만, 병합은 승인 리뷰가 있고 `mergeable_state` 가 `clean` 인 PR 에만 한다.

`/resolve-iteration` 이 있는 이유: Actions 의 기본 `GITHUB_TOKEN` 은 org 프로젝트 보드를 읽지 못해서(`read:project` 없음) App 토큰을 가진 이 Worker 가 대신 읽는다. 주차는 보드의 Week(Iteration) 필드에서 오므로 하드코딩하지 않는다.
`/resolve-iteration` 이 있는 이유: Actions 의 기본 `GITHUB_TOKEN` 은 org 프로젝트 보드를 읽지 못해서(`read:project` 없음) App 토큰을 가진 이 Worker 가 대신 읽는다. 주차는 보드의 Week(Iteration) 필드에서 오므로 하드코딩하지 않는다. `Onboarding` iteration 은 0주차(`week: 0`, 릴리즈 태그 `v{기수}.0.0`)로 본다.

## 웹훅

Expand Down
1 change: 1 addition & 0 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 7 additions & 1 deletion utils/iterations.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import { ALLOWED_ORG } from "./constants.js";

const COHORT_TITLE_PATTERN = /^리트코드 스터디 (\d+)기$/;
const WEEK_TITLE_PATTERN = /^Week (\d+)$/;
// 기수 첫 주차 앞의 온보딩 주간. 0주차로 보고 Week 1 앞에 둔다 (릴리즈 태그 v{기수}.0.0)
const ONBOARDING_TITLE = "Onboarding";
const WEEK_FIELD_NAME = "Week";

/**
Expand All @@ -37,11 +39,15 @@ export function parseCohort(title) {
}

/**
* Iteration 제목에서 주차 번호 추출 ("Week 7" → 7)
* Iteration 제목에서 주차 번호 추출 ("Week 7" → 7, "Onboarding" → 0)
*
* @returns {number|null}
*/
export function parseWeek(title) {
if (title === ONBOARDING_TITLE) {
return 0;
}

const matched = WEEK_TITLE_PATTERN.exec(title ?? "");
return matched ? Number(matched[1]) : null;
}
Expand Down
27 changes: 27 additions & 0 deletions utils/iterations.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,14 @@ describe("parseWeek", () => {
expect(parseWeek("Week 15")).toBe(15);
});

it("Onboarding은 0주차로 본다", () => {
expect(parseWeek("Onboarding")).toBe(0);
});

it("형식이 다르면 null을 돌려준다", () => {
expect(parseWeek("Week 7(current)")).toBeNull();
expect(parseWeek("Sprint 3")).toBeNull();
expect(parseWeek("onboarding")).toBeNull();
expect(parseWeek(null)).toBeNull();
});
});
Expand Down Expand Up @@ -123,6 +128,28 @@ describe("findCoveringIteration", () => {
expect(findCoveringIteration(acrossCohorts, "2026-10-10")).toBeNull();
});

it("완료된 Onboarding iteration도 0주차로 판정한다", () => {
const withOnboarding = [
{
number: 30,
title: "리트코드 스터디 9기",
cohort: 9,
iterations: [
iteration("Week 1", "2026-11-09"),
iteration("Onboarding", "2026-11-02"),
],
},
];

expect(findCoveringIteration(withOnboarding, "2026-11-07")).toMatchObject({
cohort: 9,
week: 0,
weekLabel: "Onboarding",
startDate: "2026-11-02",
endDate: "2026-11-08",
});
});

it("Week 형식이 아닌 iteration은 무시한다", () => {
const odd = [
{
Expand Down
Loading