Community생산성 & 협업github.com

paulstraw/g-scheduler

Google Workspace 사용자 그룹의 근무 시간과 시간대를 고려하여 모두가 참석 가능한 회의 시간을 찾고, 요청 시 초대장을 발송합니다.

g-scheduler란 무엇인가요?

g-scheduler는 여러 Google Workspace 사용자가 모두 참석할 수 있는 회의 시간을 찾아주는 AI 에이전트 스킬입니다. 각 사용자의 Google 캘린더에 기록된 근무 시간과 시간대를 자동으로 고려하여 최적의 슬롯을 제안하며, 사용자가 직접 시간대나 DST(일광 절약 시간제) 계산을 할 필요가 없도록 설계되었습니다. 이 스킬은 Claude Code, Cursor, Codex 등 AI 코딩 에이전트와 함께 사용할 수 있으며, 셸 환경과 gws CLI 도구가 필요합니다. 참석자는 Slack 메시지, 사용자 목록, 문서 등 다양한 출처에서 가져올 수 있으며, Google Workspace 디렉토리 검색을 통해 이메일 주소를 찾아냅니다. 기본 동작은 읽기 전용으로, 사용자가 명시적으로 승인하기 전까지는 초대장을 발송하지 않습니다. g-scheduler는 두 개의 Python 스크립트(gcal.py, slots.py)를 사용하여 Google 캘린더 API 호출과 시간 계산을 처리하며, 사용자에게 최대 5개의 회의 슬롯을 제시하고 각 슬롯별 참석 가능 여부와 경고를 상세히 알려줍니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/paulstraw/g-scheduler/tree/HEAD/skills/g-scheduler

Installed? Explore more 생산성 & 협업 skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

g-scheduler은(는) 무엇을 하나요?

모든 참석자가 자유롭고 각자의 근무 시간 내에 있는 회의 슬롯을 찾은 다음, 요청이 있을 때만 초대장을 생성합니다. 두 개의 번들 스크립트가 Google 호출과 시간 계산을 처리합니다. 시간대나 DST 계산을 직접 하지 말고, 스크립트의 출력을 사용하세요.

스크립트는 이 스킬의 디렉토리에서 python3(Windows에서는 python 또는 py)으로 실행하세요: scripts/gcal.py 및 scripts/slots.py. Python 3.9+가 필요합니다.

1. 접근 확인

python3 scripts/gcal.py check를 실행하세요.

  • gws가 없거나 로그인되지 않았거나, Python 오류가 tzdata를 요구하는 경우, 중단하고 사용자가 SETUP.md의 단계를 하나씩 따르도록 안내하세요. 이것 없이는 계속할 수 없습니다.
  • 성공하면 계속하세요. my_working_hours: "not set"는 괜찮습니다.

2. 입력 수집

  • 참석자: 모든 사람을 Google Workspace 이메일 주소로 확인합니다. 이메일이 없는 이름의 경우 python3 scripts/gcal.py find "에이다 러브레이스" "그레이스"를 실행하면 조직 디렉토리를 검색합니다. 다른 도구(Slack, 사용자 메시지)도 작동합니다. find가 실패하면(범위 누락, accessNotConfigured, 또는 관리자가 디렉토리 공유를 비활성화한 경우), 이름 조회를 사용할 수 없습니다: 한 번 이유를 언급하고, SETUP.md 문제 해결을 가리킨 후 다른 도구를 사용하세요. 이메일이 없거나, 모호하거나, 사용자 조직 외부로 보이면 물어보세요. 사용자는 자동으로 추가되며, 사용자가 참석하지 않겠다고 말한 경우에만 --exclude-me를 전달하세요.
  • 날짜 범위: 간단하게 유지하세요. "다음 2주"는 오늘부터 약 18일 후까지를 의미합니다 (더 이른 슬롯이 먼저 순위가 매겨집니다). 특정 날짜는 해당 날짜만 의미합니다. 날짜는 YYYY-MM-DD 형식입니다. 종료 날짜는 포함됩니다.
  • 길이: 기본값 60분입니다. 묻지 말고, 기본값을 가정했다고 말하세요.
  • 선택적 참석자: 미리 묻지 마세요. 모든 사람을 필수로 취급하세요.

3. 슬롯 찾기

python3 scripts/gcal.py gather [email protected] [email protected] --start 2026-11-10 --end 2026-11-27 \
  | python3 scripts/slots.py

gather 옵션: --duration MIN, --optional EMAIL (반복 가능), --exclude-me, --time-zone TZ (사용자 캘린더 시간대 기본값, 순위 지정 및 표시에도 사용됨).

출력에는 slots (최대 5개, 하루 최대 2개, 가장 이른 것부터), all_required_free, attendees, warnings가 포함됩니다. 각 슬롯에는 모든 참석자의 local 시간과 사용자 시간대, missing, missing_optional, at_day_edge (해당 시간이 하루의 첫 30분 또는 마지막 30분에 있는 사람)가 있습니다.

전체 출력을 읽으세요. warnings가 손실되므로 jq 또는 python -c 등으로 필터링하지 마세요.

특정 시간을 확인하려면(사용자가 시간을 제안하거나, 슬롯이 나열되지 않았거나, 참석자가 늦게 추가된 경우) 모든 참석자에 대해 동일한 파이프라인을 --start 및 --end를 정확히 해당 회의 시간(RFC3339 형식, 오프셋 포함)으로 설정하여 실행하세요: --start 2026-11-19T11:00:00-08:00 --end 2026-11-19T12:00:00-08:00. 출력의 단일 슬롯에 누가 누락되었는지 표시됩니다. 원시 바쁜 시간으로부터 직접 가용성을 계산하지 마세요.

4. 결과 표시

  • 사용자 시간대의 슬롯을 나열하고, 시간대가 다른 경우 각 참석자의 현지 시간을 함께 표시하세요.
  • 모든 경고를 일반 언어로 반복하세요. 근무 시간이 가정된 사람(해당 시간대의 평일 09:00-17:00)과 캘린더를 읽을 수 없어 제외된 사람의 이름을 명시하세요.
  • 사용자가 길이를 지정하지 않은 경우 가정된 길이를 명시하세요.
  • all_required_free가 false인 경우, 각 슬롯에서 누가 누락되었는지 말하고, 그 중 일부를 --optional로 하여 다시 실행할지 물어보세요. 사용자만이 누가 선택적인지 결정합니다. 직접 선택적이라고 표시하지 마세요.
  • slots가 비어 있으면 그렇게 말하고 더 넓은 범위나 더 짧은 회의를 제안하세요.

5. 초대장 생성 (요청 시에만)

  1. 컨텍스트에서 제목을 작성하고, 소스 링크(예: Slack 스레드)가 있는 경우 이를 포함한 짧은 설명을 작성하세요.

  2. 화상 회의 링크를 추가할지 물어보세요. 제공된 경우 location과 설명에 넣으세요. Meet 또는 Zoom 회의를 직접 만들지 마세요.

  3. 정확한 이벤트(제목, 현지 시간, 참석자, 설명, 위치)를 보여주고 명시적인 "네, 보내주세요"를 기다리세요. 이메일은 모든 사람에게 전송되며 취소할 수 없습니다.

  4. 이벤트를 사용자 시간대의 시간과 함께 Calendar Events 리소스로 임시 JSON 파일에 작성하세요:

    {
      "summary": "프로젝트 킥오프",
      "description": "https://example.slack.com/archives/...에서 예약됨",
      "location": "https://zoom.us/j/123",
      "start": {"dateTime": "2026-11-18T10:00:00", "timeZone": "America/Los_Angeles"},
      "end": {"dateTime": "2026-11-18T11:00:00", "timeZone": "America/Los_Angeles"},
      "attendees": [{"email": "[email protected]"}, {"email": "[email protected]"}]
    }
    
  5. python3 scripts/gcal.py invite EVENT.json을 실행하세요. 항상 모든 참석자에게 초대장을 보냅니다. 요청을 확인하려면 --dry-run을 먼저 사용하세요.

  6. 출력에서 htmlLink를 사용자에게 제공하고 임시 파일을 삭제하세요.

규칙

  • invite를 제외한 모든 것은 읽기 전용입니다. 누군가의 캘린더나 근무 시간을 변경하지 마세요.
  • 미리 본 이벤트에 대한 사용자의 명시적 확인 없이 초대장을 보내지 마세요.
  • 특정 시간대의 시간이 한 시간 차이가 나는 경우, 시스템의 시간대 데이터가 오래된 것일 수 있습니다(시간대 규칙은 변경됩니다, 예: 2026년 브리티시컬럼비아의 경우). SETUP.md의 문제 해결을 참조하세요.

관련 스킬