웹 페이지를 읽으며 간편하게 기록하세요.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
웹 메모 웹 페이지를 읽으며 간편하게 기록하세요 안녕하세요! 웹 메모는 웹페이지를 읽으며 느낀 불편함에서 비롯된 프로젝트에요. 여러분도 비슷한 경험이 있으셨을 거에요. 아티클을 읽다 보면 "이건 기록으로 남겨야겠다"는 생각이 들 때가 있어요. 그럴 때마다 노트를 열고 화면을 반으로 나누어 기록해야 하는 것이 번거로웠죠. 이 경험을 통해 따로 노트 앱을 열지 않고 한 번에 기록할 방법이 필요하다고 느꼈어요. 2. 매번 제목과 URL을 작성해야 하는 번거로움 노트를 열고 나면 이 기록이 어떤 아티클을 읽고 작성한 것인지 남기기 위해 제목과 URL을 직접 기입해야 했어요. 이를 자동으로 해결할 방법은 없을까 고민하게 되었죠. 이런 경험들을 바탕으로 아티클을 읽으며 간편하게 기록할 수 있는 확장 프로그램을 개발하게 되었어요! 웹 메모는 제가 겪었던 불편함을 해소하고, 다른 사람들도 더 쉽게 기록할 수 있도록 돕기 위해 만들어졌답니다. 웹 메모는 여러분의 아티클 읽는 시간을 더 여유롭게 만들어줄 거예요. 웹 메모를 통해 아티클을 읽으며 중요한 정보를 놓치지 않고, 나중에 쉽게 찾아볼 수 있는 체계적인 메모 시스템을 구축할 수 있어요.查看完整 README ↗
GitHub Actions 워크플로와, 워크플로가 부르는 스크립트가 있는 폴더입니다. 이 문서는 어느 워크플로가 어느 스크립트를 부르는지를 한곳에 모은 대응표입니다. 워크플로나 스크립트를 추가·이동·삭제하면 이 표도 같은 PR에서 고칩니다.
GitHub Actions는 .github/workflows/ 아래 하위 폴더를 인식하지 않습니다. 그래서 폴더 대신
파일명 앞의 계열 접두사로 묶습니다.
| 접두사 | 계열 |
|---|---|
ci·e2e | PR·push마다 도는 검증 |
cd- | 앱별 빌드·배포 (재사용 워크플로) |
release·versions | 릴리스와 스토어 버전 조회. 웹의 Slack 버튼이 파일명으로 dispatch하므로 이름을 바꾸지 않습니다 |
audit- | 상태를 선언과 대조하는 감사 |
report- | 정기 리포트 |
chore- | 레포 유지보수 자동화 |
| 워크플로 | 트리거 | 실행 주기·시각 | 부르는 스크립트 (.github/scripts/ 기준) |
|---|---|---|---|
ci.yml | push(develop·master), pull_request | 해당 push·PR 이벤트마다 | deploy/resolve-affected-base.sh · deploy/detect-affected-apps.sh · deploy/notify-thread-root.mjs · deploy/notify-thread-reply.mjs · deploy/notify-build-ready.mjs · deploy/notify-staging-deploy.mjs · deploy/comment-pr-extension.mjs · conventions/check-code-conventions.mjs, 그리고 cd-app·cd-extension·cd-web 호출 |
e2e.yml | push(develop·master), pull_request | 해당 push·PR 이벤트마다 | 없음 (Playwright) |
cd-app.yml | workflow_call | 검증된 develop 후보를 큐에서 재판정해 Android APK 빌드·Firebase App Distribution 배포, master·PR은 빌드만, release는 새 빌드·Play 내부 테스트 제출 | deploy/prepareStagingApp.mjs · deploy/appDeploymentState.mjs · deploy/detect-affected-apps.sh (EAS CLI·firebase-tools) |
cd-extension.yml | workflow_call, workflow_dispatch | 다른 워크플로에서 호출하거나 수동 실행할 때마다 | deploy/find-reusable-artifact.sh · deploy/upload-extension-to-store.mjs |
cd-web.yml | workflow_call, workflow_dispatch | 다른 워크플로에서 호출하거나 수동 실행할 때마다 | deploy/find-staged-deployment.mjs · deploy/staged-deployment.mjs · deploy/notify-staging-deploy.mjs |
release.yml | workflow_dispatch | 수동 실행할 때마다 | 없음. cd-app·cd-extension·cd-web·release-notify 호출 |
release-notify.yml | workflow_call | release.yml에서 호출할 때마다 | deploy/notify-release-result.mjs |
release-github.yml | push(tag v*) | v* 태그 push마다 | 없음 |
versions.yml | workflow_dispatch | 수동 실행할 때마다 | deploy/report-store-versions.mjs |
notify-extension-published.yml | schedule, workflow_dispatch | 매시 07·37분 또는 수동 실행마다 | deploy/notify-extension-published.mjs |
audit-env-manifest.yml | pull_request, workflow_dispatch | PR 이벤트 또는 수동 실행마다 | env/check-env-manifest.mjs |
audit-env-registry.yml | pull_request, schedule, workflow_dispatch | 매일 07:30 KST, PR 이벤트 또는 수동 실행마다 | env/audit-env-registry.mjs |
audit-ga-cid-adoption.yml | schedule, workflow_dispatch | 매주 월요일 09:13 KST 또는 수동 실행마다 | 없음 (Playwright, e2e/probes/) |
audit-refactor.yml | schedule, workflow_dispatch | 매주 토요일 10:17 KST 또는 수동 실행마다 | refactor/report-refactor-audit.mjs |
report-ga-daily.yml | schedule, workflow_dispatch | 매일 07:00 KST 또는 수동 실행마다 | ga/report-daily-ga.mjs |
report-ga-weekly.yml | schedule, workflow_dispatch | 매주 월요일 08:00 KST 또는 수동 실행마다 | ga/report-weekly-ga.mjs |
report-seo.yml | schedule, workflow_dispatch | 매일 09:17 KST 또는 수동 실행마다 | pnpm seo:check·seo:gsc·seo:sheets · seo/find-previous-seo-report.mjs · seo/build-seo-ai-context.mjs · seo/send-seo-ai-report.mjs · seo/seo-fix.mjs · seo/notify-seo-slack.mjs |
report-gsc-demand.yml | workflow_dispatch | 수동 실행할 때마다 | pnpm seo:gsc-demand → seo/export-gsc-demand.mjs (조합 페이지 축 판단용 GSC 수요·사이트맵 리포트, 아티팩트만 남김) |
chore-cleanup-unused.yml | schedule, workflow_dispatch | 매주 토요일 10:00 KST 또는 수동 실행마다 | cleanup/cleanup-unused-files.mjs |
chore-e2e-coverage.yml | schedule, workflow_dispatch | 매주 일요일 10:23 KST 또는 수동 실행마다 | e2e-coverage/maintain.mjs |
chore-ga-events.yml | schedule, workflow_dispatch | 매주 수요일 09:41 KST 또는 수동 실행마다 | ga-events/maintain.mjs |
chore-supabase-inventory.yml | schedule, workflow_dispatch | 매일 08:00 KST 또는 수동 실행마다 | supabase/generate-supabase-inventory.mjs · supabase/sync-supabase-inventory-pr.mjs |
chore-sentry-triage.yml | workflow_dispatch | Sentry 웹훅 수신기가 SENTRY_AI_TRIAGE_ENABLED=true일 때 새 이슈·재발마다 디스패치하거나 수동 실행할 때마다 | sentry/triage-inputs.mjs · sentry/triage-guard.mjs · sentry/fetch-sentry-context.mjs · sentry/check-triage-patch.mjs · sentry/build-pr-body.mjs · sentry/report-sentry-triage.mjs |
chore-blog-catalog.yml | schedule, workflow_dispatch | 매일 03:17 KST 토스·당근 전체 재순회, 15분마다 재개 요청 확인, 3시간마다(:37) 긱뉴스 피드 수집 또는 수동 실행(소스 선택·당근 smoke·dry-run)마다 | blog-reading/collect.mjs |
정기 실행 시각은 워크플로의 UTC cron을 한국 시간(KST)으로 환산한 예정 시각입니다. GitHub Actions 사정에 따라 실제 시작은 늦어질 수 있습니다.
chore-cleanup-unused.yml·chore-supabase-inventory.yml·audit-refactor.yml·chore-sentry-triage.yml은 ref: master로 체크아웃합니다. 작업 브랜치에서
dispatch해도 스크립트는 master의 것이 돕니다.
chore-e2e-coverage.yml과 chore-ga-events.yml은 주간 실행에서 master를, 수동 실행에서 선택한 ref를 체크아웃합니다. master 외 ref의 수동 실행은 검증 결과만 남기고 PR을 게시하지 않습니다.
detect-affected-apps.sh는 Turbo 패키지 영향 판정에 더해 CI·앱·릴리스 워크플로와 앱 판정 스크립트 변경을 앱 변경으로 처리합니다. push 실행 전체는 취소하지 않고 develop의 검증·웹·확장 잡만 각각 이전 잡을 취소합니다. 앱의 실제 빌드 잡이 release-app 그룹(cancel-in-progress: false, queue: max)을 단독으로 소유해 운영 요청을 최대 100개까지 대기시킵니다. develop 후보는 실행권을 얻은 뒤 최신 검증 성공 후보와 플랫폼별 마지막 배포 성공 SHA를 확인하고, 오래되었거나 앱 변경이 없는 후보를 EAS 전에 생략합니다. 성공 SHA는 Firebase 배포가 끝난 뒤 staging-app-success-<platform>-<sha>-<run>-<attempt> 아티팩트로 90일간 보관합니다. 기준이 없거나 만료됐으면 전체 앱 빌드하며, 조회 실패는 실패로 처리합니다. Android 운영 릴리스의 master CI 산출물 재사용은 유지합니다.
ci.yml의 notify-staging-app은 deploy/notify-thread-reply.mjs를 REPLY_PHASE=store-submit으로 호출해 develop 앱 App Tester 배포 결과를 머지 스레드에 알립니다. 웹 결과 알림과 독립적으로 실행하며, 앱 댓글에는 배포 버튼 없이 Actions 로그 링크만 붙입니다. 큐에서 생략한 후보는 attempted=false로 결과 댓글을 억제합니다.
릴리스·배포 흐름 전체는 docs/release-flow.md를 봅니다.
.github/scripts/는 도메인 폴더로 나뉩니다. 폴더 안에는 실행 스크립트(위 표에 나오는 파일)와
그 스크립트가 쓰는 모듈, 테스트(*.test.ts)가 함께 있습니다.
| 폴더 | 담당 |
|---|---|
shared/ | 두 도메인 이상이 쓰는 모듈 (run-context·slack-api·slack-blocks·http·jwt·google-auth·repo-versions) |
deploy/ | CI 빌드 판정, Slack 빌드·배포·릴리스 알림, PR 확장 다운로드 댓글, 확장 웹스토어 업로드, 스토어 버전 |
seo/ | SEO 점검·GSC·Sheets 적재·AI 리포트·P0·P1 자동 수정 PR |
ga/ | GA4 일간·주간 리포트, 기능 사용량 측정 |
env/ | 환경 변수 매니페스트 검사와 등록 현황 감사 |
conventions/ | 코드 컨벤션 원장(docs/code-conventions.yaml) 형식 검사 |
supabase/ | 운영 Supabase 인벤토리 문서(docs/supabase-inventory.md) 생성과 갱신 PR |
refactor/ | 주간 리팩토링 점검 |
cleanup/ | 미사용 파일 정리 |
e2e-coverage/ | 핵심 사용자 흐름의 E2E 누락 점검, 새 테스트 검증, 자동 보완 PR 게시 |
blog-reading/ | 블로그 정주행(토스·당근·긱뉴스) 공개 글 카탈로그 수집기. 원본 순회(tossSource·daangnSource), 긱뉴스 Atom 피드 수집(geeknewsSource), 수집 엔드포인트 클라이언트(ingestClient), 실행 진입점(collect) |
ga-events/ | GA 이벤트 누락 점검, 이벤트 추가 패치 검증, 자동 보완 PR 게시 |
shared/ 규칙: 두 도메인 이상이 쓰는 모듈만 shared/에 둡니다. 한 도메인만 쓰면 이름이
범용이어도 그 도메인 폴더에 둡니다(예: seo/google-sheets.mjs). shared/는 다른 도메인 폴더를
import하지 않습니다.
| 진입점 | 경로 | 용도 |
|---|---|---|
pnpm seo:check | seo/check-seo.mjs | SEO 점검 (report-seo.yml도 사용) |
pnpm seo:gsc | seo/check-gsc.mjs | Search Console 색인·성과 조회 |
pnpm seo:gsc-demand | seo/export-gsc-demand.mjs | 도메인 이전일 이후 GSC 수요·사이트맵 상태 리포트 (report-gsc-demand.yml도 사용) |
pnpm seo:sheets | seo/persist-seo-sheets.mjs | SEO 결과를 Google Sheets에 적재 |
| 수동 CLI | ga/measure-feature-usage.mjs | 기간별 기능 사용량 측정 (docs/analytics.md) |
| 수동 CLI | blog-reading/collect.mjs | --dry-run으로 서버 저장 없이 원본 순회만 확인, --smoke로 당근 접근 확인 (종료 코드 3은 원본 사이트의 접근 차단) |
테스트는 pnpm exec vitest run .github/scripts로 돌립니다.