diff --git a/skills/work-log/SKILL.md b/skills/work-log/SKILL.md new file mode 100644 index 0000000..850a5df --- /dev/null +++ b/skills/work-log/SKILL.md @@ -0,0 +1,454 @@ +--- +name: wiki:work-log +description: 'Confluence 위키 페이지에 업무일지를 작성합니다' +license: MIT +--- + +# Confluence 업무일지 작성 + +Confluence 위키 페이지에 업무일지를 작성하는 스킬입니다. + +## 빠른 참조 + +**프로세스:** +1. 위키 페이지 ID 또는 URL 확인 (환경변수 `WIKI_DAILY_WORK_LOG_URL` 우선 사용) +2. 날짜 입력 (MM/DD 형식) +3. 업무 내용 입력 +4. 기존 페이지 읽기 +5. 해당 날짜에 업무 내용 추가 +6. 페이지 업데이트 + +**API 호출 순서:** +```typescript +// 1. 페이지 읽기 +const page = await mcp__wiki__get_page_by_id({ page_id: "페이지ID" }) + +// 2. 내용 파싱 및 업데이트 +// HTML 테이블 형식의 업무일지에서 해당 날짜 행 찾기 +// 업무 내용 추가 + +// 3. 페이지 업데이트 +await mcp__wiki__update_page({ + page_id: "페이지ID", + title: page.title, + body: updatedBody +}) +``` + +## 입력 파라미터 + +### 1. 위키 페이지 식별자 (조건부 필수) +- **환경변수 우선**: `.env.local`의 `WIKI_DAILY_WORK_LOG_URL`이 설정되어 있으면 자동 사용 +- **수동 입력**: 환경변수가 없거나 다른 페이지를 사용할 경우 + - **페이지 ID**: 숫자로 된 페이지 ID (예: `684252757`) + - **페이지 URL**: Confluence 페이지 전체 URL + - URL에서 pageId 추출: `https://wiki.smilegate.net/pages/viewpage.action?pageId=684252757` + - `pageId=` 뒤의 숫자가 페이지 ID + +### 2. 날짜 (필수) +- **형식**: `MM/DD` (예: `04/02`, `12/25`) +- 업무일지 테이블에서 해당 날짜 행을 찾는 데 사용 + +### 3. 업무 내용 (필수) +- **형식**: 텍스트 또는 HTML +- 업무일지의 "진행업무" 열에 추가될 내용 +- HTML 마크업 지원 (리스트, 링크 등) + +## 업무일지 테이블 구조 + +일반적인 업무일지는 다음과 같은 HTML 테이블 구조를 가집니다: + +```html + + + + + + + + + + + + + + + + + + +
날짜진행업무기타 기록
04/01업무 내용...
04/02

+``` + +## 프로세스 상세 + +### Step 1: 페이지 식별자 추출 + +URL에서 페이지 ID 추출: + +```typescript +function extractPageId(input: string): string { + // 이미 숫자인 경우 + if (/^\d+$/.test(input)) { + return input + } + + // URL에서 pageId 추출 + const match = input.match(/pageId=(\d+)/) + if (match) { + return match[1] + } + + throw new Error('유효한 페이지 ID 또는 URL을 입력해주세요') +} +``` + +### Step 2: 환경변수 확인 및 사용자 입력 받기 + +먼저 `.env.local`에서 환경변수 확인: + +```typescript +// .env.local 파일 읽기 (Read 툴 사용) +const envContent = await readFile('.env.local') +const wikiUrlMatch = envContent.match(/WIKI_DAILY_WORK_LOG_URL=['"](.+?)['"]/) +const defaultWikiUrl = wikiUrlMatch ? wikiUrlMatch[1] : null + +// 환경변수가 있으면 자동 사용, 없으면 사용자에게 입력 받기 +let pageIdInput: string + +if (defaultWikiUrl) { + console.log(`✅ 환경변수에서 업무일지 URL 발견: ${defaultWikiUrl}`) + pageIdInput = defaultWikiUrl +} else { + // 사용자에게 입력 받기 + const pageAnswer = await askUserQuestion({ + questions: [{ + question: "업무일지 페이지 ID 또는 URL을 입력해주세요", + header: "페이지", + options: [ + { + label: "URL 입력", + description: "https://wiki.smilegate.net/pages/viewpage.action?pageId=..." + }, + { + label: "페이지 ID 입력", + description: "숫자만 입력 (예: 684252757)" + } + ], + multiSelect: false + }] + }) + pageIdInput = pageAnswer.페이지 // Other 응답에서 실제 값 가져오기 +} + +// 날짜 입력 받기 +const dateAnswer = await askUserQuestion({ + questions: [{ + question: "날짜를 입력해주세요 (MM/DD 형식)", + header: "날짜", + options: [ + { label: "오늘", description: "오늘 날짜 자동 입력" }, + { label: "직접 입력", description: "Other를 선택하여 MM/DD 형식으로 입력" } + ], + multiSelect: false + }] +}) + +// 업무 내용은 별도로 입력받기 (긴 텍스트) +const contentAnswer = await askUserQuestion({ + questions: [{ + question: "업무 내용을 입력해주세요\n(Jira 이슈 번호를 포함하면 자동으로 링크가 생성됩니다)", + header: "업무내용", + options: [ + { label: "직접 입력", description: "Other를 선택하여 상세 내용 입력" } + ], + multiSelect: false + }] +}) +``` + +### Step 3: 날짜 처리 + +```typescript +function formatDate(dateInput: string): string { + if (dateInput === "오늘") { + const today = new Date() + const month = String(today.getMonth() + 1).padStart(2, '0') + const day = String(today.getDate()).padStart(2, '0') + return `${month}/${day}` + } + + // MM/DD 형식 검증 + if (!/^\d{2}\/\d{2}$/.test(dateInput)) { + throw new Error('날짜는 MM/DD 형식으로 입력해주세요 (예: 04/02)') + } + + return dateInput +} +``` + +### Step 4: 페이지 읽기 및 파싱 + +```typescript +// 페이지 내용 가져오기 +const page = await mcp__wiki__get_page_by_id({ + page_id: pageId, + expand: "body.storage,version" +}) + +const currentBody = page.body.storage.value +const currentTitle = page.title +``` + +### Step 5: 업무 내용 포맷팅 + +Jira 이슈 자동 링크 변환: + +```typescript +function formatWorkContent(content: string): string { + // SWV-123 형식을 Jira 링크로 변환 + const withJiraLinks = content.replace( + /\b(SWV-\d+)\b/g, + '$1' + ) + + // 간단한 마크다운 스타일 HTML 변환 + let formatted = withJiraLinks + + // 줄바꿈 처리 + formatted = formatted.replace(/\n/g, '
') + + return formatted +} +``` + +### Step 6: 테이블에서 날짜 행 찾기 및 업데이트 + +```typescript +function updateWorkLog(htmlBody: string, date: string, content: string): string { + // 날짜 셀 찾기: 04/02 + const datePattern = new RegExp( + `(]*style="text-align: center;"[^>]*>${date}\\s*]*>)([^<]*|.*?)()`, + 'i' + ) + + const match = htmlBody.match(datePattern) + + if (!match) { + throw new Error(`날짜 ${date}에 해당하는 행을 찾을 수 없습니다.`) + } + + // 기존 내용이
만 있는 경우 대체, 아니면 추가 + const existingContent = match[2].trim() + const newContent = existingContent === '
' || existingContent === '' + ? content + : existingContent + '

' + content + + // 업데이트된 HTML 반환 + return htmlBody.replace(datePattern, `$1${newContent}$3`) +} +``` + +### Step 7: 페이지 업데이트 + +```typescript +const updatedBody = updateWorkLog(currentBody, date, formattedContent) + +await mcp__wiki__update_page({ + page_id: pageId, + title: currentTitle, + body: updatedBody +}) + +console.log(`✅ 업무일지 업데이트 완료`) +console.log(`📅 날짜: ${date}`) +console.log(`🔗 페이지: https://wiki.smilegate.net/pages/viewpage.action?pageId=${pageId}`) +``` + +## 업무 내용 작성 예시 + +### 예시 1: 간단한 업무 + +**입력:** +``` +로드나인 아시아 사전등록 페이지 버그 수정 +``` + +**결과:** +```html +로드나인 아시아 사전등록 페이지 버그 수정 +``` + +### 예시 2: Jira 이슈 포함 + +**입력:** +``` +FE AI 표준화 로드맵 기술 검토 (SWV-955) +Schema.org 구조화된 데이터 추가 (SWV-956) +``` + +**결과:** +```html +FE AI 표준화 로드맵 기술 검토 (SWV-955)
+Schema.org 구조화된 데이터 추가 (SWV-956) +``` + +### 예시 3: 구조화된 업무 내용 + +**입력:** +``` +FE AI 표준화 및 SEO 개선 + +- FE AI 표준화 로드맵 기술 검토 (SWV-955) + - Nuxt 3 기반 FE 개발 프로세스와 Claude Code AI Skills 통합 + - 개발 프로세스 전 단계(기획~검증) AI 어시스턴트 활용 체계 수립 + +- Schema.org 구조화된 데이터 추가 (SWV-956) + - SEO 최적화 및 검색 엔진 가시성 개선 작업 + - JSON-LD 형식으로 구조화된 데이터 구현 방안 검토 +``` + +**결과:** +```html +

FE AI 표준화 및 SEO 개선

+ +``` + +## 에러 처리 + +### 1. 페이지를 찾을 수 없는 경우 + +```typescript +try { + const page = await mcp__wiki__get_page_by_id({ page_id: pageId }) +} catch (error) { + console.error(`❌ 페이지를 찾을 수 없습니다: ${pageId}`) + console.error('페이지 ID 또는 URL을 확인해주세요.') + throw error +} +``` + +### 2. 날짜를 찾을 수 없는 경우 + +```typescript +if (!htmlBody.includes(`>${date}`)) { + console.error(`❌ 날짜 ${date}를 찾을 수 없습니다.`) + console.error('업무일지 테이블에 해당 날짜가 있는지 확인해주세요.') + throw new Error(`날짜 ${date}에 해당하는 행을 찾을 수 없습니다.`) +} +``` + +### 3. 페이지 업데이트 실패 + +```typescript +try { + await mcp__wiki__update_page({ + page_id: pageId, + title: currentTitle, + body: updatedBody + }) +} catch (error) { + console.error(`❌ 페이지 업데이트 실패`) + console.error('권한이 있는지 확인해주세요.') + throw error +} +``` + +## 사용 예시 + +### 기본 사용 (환경변수 설정됨) + +`.env.local`에 `WIKI_DAILY_WORK_LOG_URL`이 설정되어 있으면: + +```bash +/wiki:work-log +``` + +스킬 실행 후: +1. ✅ 환경변수에서 페이지 URL 자동 인식 (입력 불필요) +2. 날짜 선택: "오늘" 또는 "04/02" +3. 업무 내용 입력: + ``` + FE AI 표준화 및 SEO 개선 + + - FE AI 표준화 로드맵 기술 검토 (SWV-955) + - Nuxt 3 기반 FE 개발 프로세스와 Claude Code AI Skills 통합 + + - Schema.org 구조화된 데이터 추가 (SWV-956) + - SEO 최적화 및 검색 엔진 가시성 개선 작업 + ``` + +### 고급 사용: Jira 이슈 자동 연동 + +업무 내용에 Jira 이슈 번호를 포함하면 자동으로 링크가 생성됩니다: + +``` +로드나인 사전등록 기능 개선 (SWV-960) +SEO 메타 태그 최적화 (SWV-961) +``` + +→ 자동 변환: + +```html +로드나인 사전등록 기능 개선 (SWV-960)
+SEO 메타 태그 최적화 (SWV-961) +``` + +## 환경변수 설정 + +기본 업무일지 페이지를 환경변수로 설정하면 매번 입력할 필요가 없습니다. + +### `.env.local` 설정 + +```bash +# Confluence 업무일지 페이지 URL +WIKI_DAILY_WORK_LOG_URL='https://wiki.smilegate.net/pages/viewpage.action?pageId=YOUR_PAGE_ID' +``` + +**예시:** +```bash +WIKI_DAILY_WORK_LOG_URL='https://wiki.smilegate.net/pages/viewpage.action?pageId=684252757' +``` + +### 환경변수 우선순위 + +1. `.env.local`에 `WIKI_DAILY_WORK_LOG_URL` 설정됨 → 자동 사용 +2. 환경변수 없음 → 사용자에게 수동 입력 요청 + +### 다른 페이지 사용하기 + +환경변수가 설정되어 있어도 다른 페이지에 작성하려면: +- 스킬 실행 시 "Other"를 선택하여 다른 페이지 URL/ID 입력 가능 + +## 주의사항 + +- **페이지 권한**: 페이지를 수정할 수 있는 권한이 필요합니다 +- **날짜 형식**: MM/DD 형식을 정확히 지켜야 합니다 (예: `04/02`, `12/25`) +- **테이블 구조**: 업무일지가 표준 테이블 구조를 따라야 합니다 +- **기존 내용**: 해당 날짜에 이미 내용이 있으면 추가됩니다 (덮어쓰지 않음) +- **HTML 형식**: 업무 내용은 Confluence HTML 형식을 따라야 합니다 + +## 토큰 효율 + +이 스킬 문서: ~2000 tokens + +## 검증 완료 + +이 스킬은 실제 Confluence 업무일지 작성으로 검증되었습니다: +- 테스트 페이지: 684252757 (2604_김형길 차장) +- 작성일: 2026-04-02 +- 상태: 성공적으로 업데이트 완료 +- 환경변수: `.env.local`의 `WIKI_DAILY_WORK_LOG_URL` 지원 추가됨