尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
개인용 한국어 업무 일지와 서버 기반 스톱워치입니다. Next.js, React, TypeScript와 Neon PostgreSQL을 사용합니다. • 날짜별 업무 기록과 시작·일시정지·재개·종료가 가능한 서버 기반 타이머 • 월별 캘린더와 이전·오늘·다음 날짜 이동으로 기록 탐색 • 선택 날짜의 업무 구간을 원호로 보여주는 24시간 활동 시계 • 전역 메모와 날짜별 메모의 자동 저장 • 진행 중인 타이머 상태와 기록 시간을 브라우저 탭 제목에 표시 • 아이디·비밀번호 기반 회원가입·로그인과 여러 기기 간 기록 동기화查看完整 README ↗
개인용 한국어 업무 일지와 서버 기반 스톱워치입니다. Next.js, React, TypeScript와 Neon PostgreSQL을 사용합니다.
elapsed)과 마지막 시작 시각(started)을 DB에 저장하고, 화면은 이 값으로 진행 시간을 계산합니다. 모든 수정은 WHERE ... AND version=? 조건으로 version을 비교해 갱신하며, 다른 기기에서 먼저 바뀐 기록은 409로 거절합니다. 사용자당 진행 중 작업 한 개 제한은 status <> 'done' 조건의 부분 고유 인덱스(tasks_one_active)로 DB가 보장합니다.server/db/raw.ts가 prepare().bind().all()/first()/run(), batch() 형태의 인터페이스를 Neon 서버리스 드라이버 위에 구현합니다. ? 자리표시자를 PostgreSQL의 $n으로 바꾸고, batch()는 하나의 트랜잭션으로 실행하며, UPDATE·DELETE에는 RETURNING을 붙여 변경 행 수를 확인합니다. API 라우트는 이 인터페이스만 사용합니다.node:test와 Node 내장 node:sqlite 메모리 DB로 단일 진행 작업 제약, 오래된 버전 쓰기 거절, 소유자 확인, 일시정지·재개 누적 시간을 검사합니다. 인증 테스트는 typescript로 소스 파일을 바로 변환해 불러온 뒤 잘못된 비밀번호, 세션 만료, 로그아웃, 시도 제한, Origin 검사를 확인합니다. 테스트 DB는 PostgreSQL이 아닌 SQLite 마이그레이션(drizzle/)을 사용합니다.%·_도 글자 그대로)users.username, 비밀번호 해시는 users.password_hash에 PBKDF2 형식으로 저장code_sessions 테이블과 __Host-work_session 쿠키로 관리PATCH /api/auth로 세션을 연장(남은 기간이 절반 이하이면 지금부터 7일로 늘리고 쿠키를 다시 발급). 모바일 앱이 열릴 때 부른다APP_ORIGIN(또는 크롬 확장 EXTENSION_ORIGIN)이 일치하는지 확인. Origin을 보내지 않는 모바일 앱은 X-Work-Timer-Client: mobile 헤더로 허용(브라우저는 다른 사이트에서 이 헤더를 붙이려면 CORS 사전 요청을 거쳐야 하므로 위조 요청에 쓸 수 없음)Work Timer는 원격 MCP 서버(<APP_ORIGIN>/api/mcp)를 제공합니다. Claude 같은 AI 앱이 업무 기록을 조회하고 타이머를 조작할 수 있습니다. 설계와 보안 결정은 docs/mcp-integration.md에 정리했습니다.
tasks:read(업무 기록·메모·통계 보기), tasks:write(타이머 시작·종료와 업무 기록 수정). 삭제 도구와 계정 관련 기능은 제공하지 않습니다.get_current_work, list_tasks, get_stats, get_daily_memos, get_global_memos(작업·메모는 키워드 검색 가능), export_tasks(CSV, 요약 지침 선택) / 작업 단위 start_work, finish_work / 세부 조작 pause_work, resume_work, update_task, save_daily_memo, save_global_memo(새로 만들기·수정)summarize_work(기간의 CSV와 AI 요약 프롬프트를 한 번에 넣기). Claude Desktop·Claude Code 등 프롬프트를 지원하는 앱의 프롬프트 메뉴(슬래시 명령)에서 고릅니다.claude.ai·Claude Desktop·모바일: 설정 > 커넥터 > 커스텀 커넥터 추가에서 URL에 https://<도메인>/api/mcp를 입력합니다. Work Timer 상단의 부가기능 > AI 연결 > Claude에 연결을 누르면 이름과 URL이 채워진 추가 화면이 바로 열립니다.
Claude Code:
claude mcp add --transport http worktimer https://<도메인>/api/mcp
추가한 뒤 Claude Code에서 /mcp를 열어 인증을 진행합니다.
claude.ai worktimer로 보입니다. 이 경우 같은 도구가 두 벌이 되므로 Claude Code의 /mcp에서 한쪽을 끕니다.Codex: 플러그인은 이 저장소의 plugin/codex 브랜치에 있습니다. Work Timer 상단의 부가기능 > AI 연결 > Codex에 연결에서 아래 순서를 안내하고, 입력값 복사와 Codex 앱 화면 열기 버튼을 제공합니다.
rmia4/work_timer, Git ref에 plugin/codex를 입력합니다(Sparse 경로는 비워 둠).서버는 연결할 때 AI에게 다음 규칙을 전달합니다(server/mcp/server.ts의 INSTRUCTIONS).
웹앱과 같은 계정·같은 기록을 씁니다. 상단 부가기능 메뉴와 로그인 화면의 사용 환경 탭에서 설치 링크를 제공합니다.
extensions/* 브랜치에 있습니다.Node.js 22.13 이상과 package.json에 선언된 pnpm 버전을 사용합니다.
의존성을 설치합니다.
pnpm install --frozen-lockfile
.env.local에 Neon 연결 정보와 로컬 Origin을 설정합니다.
DATABASE_URL_POOLED="Neon pooler connection string"
APP_ORIGIN="http://localhost:3000"
DB 연결 변수는 DATABASE_URL_POOLED, DATABASE_URL, CONNECTION_STRING 순서로 사용합니다. 비밀값이 포함된 .env.local은 Git에 커밋하지 않습니다.
개발 서버를 실행합니다.
pnpm dev
브라우저에서 http://localhost:3000을 엽니다.
로컬 환경도 지정한 Neon DB를 직접 사용합니다. 로컬에서 업무나 메모를 수정하면 연결된 DB에 반영됩니다.
빈 Neon DB를 처음 준비할 때만 직접 연결 URL을 DATABASE_URL에 설정한 뒤 스키마를 적용합니다.
pnpm db:neon:apply
drizzle-neon/0000_initial.sql은 빈 데이터베이스용입니다. 기존 Work Timer 테이블과 데이터가 있는 DB에는 적용하지 않습니다.
drizzle/ 폴더는 이전 D1(SQLite)용 마이그레이션입니다. 운영 DB에는 사용하지 않으며, pnpm test의 SQLite 메모리 DB 테스트에서 사용합니다.
스키마를 바꿀 때는 drizzle-neon/에 다음 번호의 SQL 파일을 직접 추가하고 pnpm db:neon:apply로 적용합니다. drizzle이 들어간 폴더 이름은 예전에 Drizzle을 쓰던 때의 이름입니다.
pnpm build
pnpm test
pnpm format:check
프로덕션 빌드는 TypeScript 검사와 페이지 생성을 함께 수행합니다.
배포 환경에는 최소 다음 변수를 설정합니다.
DATABASE_URL_POOLED="Neon pooler connection string"
APP_ORIGIN="https://your-domain.example"
APP_ORIGIN은 실제 HTTPS Origin과 정확히 일치해야 하며 마지막에 /를 붙이지 않습니다. Vercel 배포는 저장소 관리자가 직접 수행합니다.
미기록으로 표시하며 24시간 활동 시계의 원호에서는 제외합니다.이 프로젝트는 AI 코딩 도구(Claude Code, Codex)와 협업해 만들었으며, 코드 작성은 대부분 AI가 했습니다.
저장소 관리자가 직접 한 일은 다음과 같습니다.
docs/)와 향후 작업 항목 문서화커밋 기록의 Co-Authored-By: Claude 표기가 Claude Code와 함께 작업한 커밋을 나타냅니다. Codex로 작업한 커밋에는 별도 표기가 없습니다.