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. 초대장 생성 (요청 시에만)
-
컨텍스트에서 제목을 작성하고, 소스 링크(예: Slack 스레드)가 있는 경우 이를 포함한 짧은 설명을 작성하세요.
-
화상 회의 링크를 추가할지 물어보세요. 제공된 경우
location과 설명에 넣으세요. Meet 또는 Zoom 회의를 직접 만들지 마세요. -
정확한 이벤트(제목, 현지 시간, 참석자, 설명, 위치)를 보여주고 명시적인 "네, 보내주세요"를 기다리세요. 이메일은 모든 사람에게 전송되며 취소할 수 없습니다.
-
이벤트를 사용자 시간대의 시간과 함께 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]"}] } -
python3 scripts/gcal.py invite EVENT.json을 실행하세요. 항상 모든 참석자에게 초대장을 보냅니다. 요청을 확인하려면--dry-run을 먼저 사용하세요. -
출력에서
htmlLink를 사용자에게 제공하고 임시 파일을 삭제하세요.
규칙
invite를 제외한 모든 것은 읽기 전용입니다. 누군가의 캘린더나 근무 시간을 변경하지 마세요.- 미리 본 이벤트에 대한 사용자의 명시적 확인 없이 초대장을 보내지 마세요.
- 특정 시간대의 시간이 한 시간 차이가 나는 경우, 시스템의 시간대 데이터가 오래된 것일 수 있습니다(시간대 규칙은 변경됩니다, 예: 2026년 브리티시컬럼비아의 경우). SETUP.md의 문제 해결을 참조하세요.