Skip to content
Open
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
5 changes: 3 additions & 2 deletions .env.development.example
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,9 @@ VITE_ENVIRONMENT=development
# GA Measurement Protocol API secret
VITE_GA_API_SECRET=

# 우리 Backend 주소
VITE_API_BASE_URL=https://this-is-linku-backend.example/api
# Supabase CLI의 `supabase status` 출력에서 복사합니다.
VITE_SUPABASE_URL=http://127.0.0.1:54321
VITE_SUPABASE_PUBLISHABLE_KEY=your_local_publishable_key

# VoC Google Apps Script Web App의 /exec URL
VITE_VOC_ENDPOINT=https://script.google.com/macros/s/your_deployment_id/exec
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/deploy-gh-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ jobs:

- name: Build for GitHub Pages
env:
VITE_API_BASE_URL: ${{ secrets.VITE_API_BASE_URL }}
VITE_VOC_ENDPOINT: ${{ vars.VITE_VOC_ENDPOINT }}
run: pnpm run build:gh-pages

Expand Down
26 changes: 8 additions & 18 deletions .github/workflows/pr-build-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,26 +25,16 @@ jobs:
- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Lint
run: pnpm run lint

- name: Build project
env:
VITE_API_BASE_URL: ${{ secrets.VITE_API_BASE_URL }}
VITE_VOC_ENDPOINT: ${{ vars.VITE_VOC_ENDPOINT }}
run: pnpm run build:local

- name: Test monitoring boundaries
run: pnpm run test:monitoring

- name: Test analytics transport
run: pnpm run test:analytics

- name: Verify production Sentry bundle metadata
run: pnpm run test:sentry-bundle

- name: Test stateless template sharing
run: pnpm run test:template-share

- name: Build GitHub Pages share viewer
run: pnpm run build:gh-pages

- name: Build success
run: echo "✅ Build completed successfully!"
- name: Test local-first and monitoring contracts
run: |
pnpm run test:monitoring
pnpm run test:sentry-bundle
pnpm run test:templates
30 changes: 26 additions & 4 deletions .github/workflows/upload-chrome-extension-draft.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,25 @@ jobs:
exit 1
fi

- name: Validate Supabase public configuration
env:
SUPABASE_URL: ${{ vars.VITE_SUPABASE_URL }}
SUPABASE_PUBLISHABLE_KEY: ${{ vars.VITE_SUPABASE_PUBLISHABLE_KEY }}
shell: bash
run: |
if [ -z "$SUPABASE_URL" ] || [ -z "$SUPABASE_PUBLISHABLE_KEY" ]; then
echo "::error::Configure VITE_SUPABASE_URL and VITE_SUPABASE_PUBLISHABLE_KEY"
exit 1
fi

curl --fail --silent --show-error --max-time 10 \
"${SUPABASE_URL%/}/rest/v1/rpc/browse_publications" \
-H "apikey: $SUPABASE_PUBLISHABLE_KEY" \
-H "Authorization: Bearer $SUPABASE_PUBLISHABLE_KEY" \
-H "Content-Type: application/json" \
--data '{"p_query":"","p_sort":"latest","p_offset":0,"p_limit":1}' \
--output /dev/null

- name: Setup pnpm
uses: pnpm/action-setup@v6

Expand All @@ -81,9 +100,11 @@ jobs:
run: |
node scripts/updateVersion.js
VERSION=$(node -p "require('./public/manifest.json').version")
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "tag=v$VERSION" >> "$GITHUB_OUTPUT"
echo "sentry_release=linku@$VERSION" >> "$GITHUB_OUTPUT"
{
echo "version=$VERSION"
echo "tag=v$VERSION"
echo "sentry_release=linku@$VERSION"
} >> "$GITHUB_OUTPUT"

- name: Configure direct analytics transport
env:
Expand All @@ -100,7 +121,8 @@ jobs:

- name: Build extension
env:
VITE_API_BASE_URL: ${{ secrets.VITE_API_BASE_URL }}
VITE_SUPABASE_URL: ${{ vars.VITE_SUPABASE_URL }}
VITE_SUPABASE_PUBLISHABLE_KEY: ${{ vars.VITE_SUPABASE_PUBLISHABLE_KEY }}
VITE_VOC_ENDPOINT: ${{ vars.VITE_VOC_ENDPOINT }}
VITE_SENTRY_DSN: ${{ vars.VITE_SENTRY_DSN }}
VITE_SENTRY_ENVIRONMENT: production
Expand Down
24 changes: 15 additions & 9 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@

LinKU는 건국대학교 학생을 위한 Manifest V3 Chrome Extension입니다.
팝업 UI에서 학교 및 학생 서비스 링크, 공지, todo, banner, template 편집과
공유, 도서관 좌석 현황, QR 생성 같은 Labs 기능을 제공합니다.
게시, 도서관 좌석 현황, QR 생성 같은 Labs 기능을 제공합니다.

이 저장소는 프론트엔드 확장 프로그램 코드만 포함합니다. LinKU backend와의
통신은 `VITE_API_BASE_URL`을 기준으로 이루어지며, 학교 및 외부 사이트 접근은
`public/manifest.json`의 `host_permissions`가 제어합니다.
이 저장소는 확장 프로그램과 Supabase schema를 함께 포함합니다. 계정 동기화와
커뮤니티는 `VITE_SUPABASE_URL`, `VITE_SUPABASE_PUBLISHABLE_KEY`를 사용하고,
학교 및 외부 사이트 접근은 `public/manifest.json`의 `host_permissions`가
제어합니다.

## 읽는 순서

Expand Down Expand Up @@ -41,6 +42,7 @@ pnpm install
pnpm run dev
pnpm run build:local
pnpm run lint
pnpm run test:templates
pnpm run test:timetable
```

Expand Down Expand Up @@ -89,8 +91,10 @@ Chrome에서 확장 프로그램을 검증하기 전에는 `pnpm run build:local
- `src/layouts/`: route layout wrapper.
- `src/contexts/`: React Context 기반 상태 container.
- `src/hooks/`: feature 단위 hook.
- `src/apis/`: LinKU backend API wrapper.
- `src/apis/supabase/`: Auth, account sync와 community adapter.
- `src/apis/external/`: 학교 또는 외부 서비스 연동.
- `src/storage/`: IndexedDB schema와 feature별 repository.
- `src/sync/`: 로컬 template과 cloud document 변환.
- `src/background/`: Manifest V3 service worker와 message handling.
- `src/utils/`: storage, auth, analytics, template, Chrome helper utility.
- `src/types/`: 공유 TypeScript data contract.
Expand All @@ -112,12 +116,14 @@ Chrome에서 확장 프로그램을 검증하기 전에는 `pnpm run build:local
병합하는 side-effect 없는 도메인 로직을 담당합니다.
- `src/utils/timetableStorage.ts`: snapshot asset과 별도 override index의 저장,
schema migration, 삭제 시 정리를 담당합니다.
- `src/apis/client.ts`: auth interceptor, backend response parsing,
silent reauth를 담당합니다.
- `src/apis/supabase/client.ts`: publishable configuration, PKCE session과
`chrome.storage.local` adapter를 담당합니다.
- `src/apis/external/`: third-party 또는 school page markup에 의존하는 parsing
logic이 있습니다.
- `src/utils/templateStorage.ts`: local draft persistence와 migration risk가
있습니다.
- `src/storage/templates/repository.ts`: local template persistence와 migration
risk가 있습니다.
- `src/storage/account/syncRepository.ts`: outbox race와 account binding을
담당합니다.

## 검증 기준

Expand Down
Loading