2ea5185cd6
- /weekly: 차주 날짜 입력→금주 자동 역산, Google Tasks 기반 금주/차주 보고서. 버킷팅은 코드(예측 가능), 포맷팅만 LLM. 신규 weeklyPrompt.ts + coordination.ts runWeekly. - 기존 CEO /weekly 리뷰 카드(dashboards.ts) 제거 — 이름 충돌 해소, /weekly 일원화. - /meet: 액션아이템에 '작업 상세' 열 추가, 캘린더 notes 가 실제 작업 내용을 담도록 재구성. - /meet: 발언자 추적 복원 + 비선형 회의 재조립 + 근거/할루시네이션 억제 규칙으로 오귀속 감소. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
97 lines
4.6 KiB
TypeScript
97 lines
4.6 KiB
TypeScript
/**
|
|
* `/weekly` 주간 보고서 LLM 프롬프트.
|
|
*
|
|
* 입력: 캘린더(Google Tasks)에서 버킷팅된 금주/차주 task 목록 + 각 task 의
|
|
* 제목·마감·상태·메모(= /meet·/task 가 넣은 "작업 상세 / 맥락"). 금주/차주 분류는
|
|
* **호출부(coordination.ts)에서 due/completed 날짜로 이미 끝낸 상태**로 들어온다.
|
|
* 이 프롬프트는 *재분류하지 않고* 정해진 포맷으로 **서술만** 한다.
|
|
*
|
|
* 하위 bullet 은 오직 각 task 의 메모에서만 끌어온다 — 없는 사실을 만들지 않는다.
|
|
*/
|
|
|
|
export interface WeeklyTask {
|
|
title: string;
|
|
/** 'YYYY-MM-DD' 또는 '' (마감 미정). */
|
|
due: string;
|
|
status: 'needsAction' | 'completed';
|
|
/** 완료 시각 'YYYY-MM-DD' (status 'completed' 일 때만). */
|
|
completedYmd?: string;
|
|
notes?: string;
|
|
}
|
|
|
|
export interface WeeklyPromptInput {
|
|
thisWeek: WeeklyTask[];
|
|
nextWeek: WeeklyTask[];
|
|
thisRange: [string, string];
|
|
nextRange: [string, string];
|
|
}
|
|
|
|
/** /weekly 전용 시스템 프롬프트 — 기본(UX 분석가) 대신 주간 보고 작성자로 역할 고정. */
|
|
export const WEEKLY_SYSTEM =
|
|
'당신은 팀 주간 업무 보고서를 작성하는 PM 보조다. '
|
|
+ '제공된 task 데이터(제목·마감·상태·메모)에 있는 사실만으로 보고서를 쓴다. '
|
|
+ '메모에 없는 일정·숫자·고유명사·결정을 절대 지어내지 않으며, 모든 출력은 한국어로 작성한다.';
|
|
|
|
function serializeTasks(tasks: WeeklyTask[]): string {
|
|
if (tasks.length === 0) return '(해당 범위에 task 없음)';
|
|
return tasks.map((t, i) => {
|
|
const statusLabel = t.status === 'completed'
|
|
? `완료(${t.completedYmd || '시점 미상'})`
|
|
: '진행/예정';
|
|
const notes = (t.notes || '').trim();
|
|
const notesBlock = notes
|
|
? notes.split('\n').map((l) => ` ${l}`).join('\n')
|
|
: ' (메모 없음)';
|
|
return [
|
|
`${i + 1}. 제목: ${t.title}`,
|
|
` 마감: ${t.due || '미정'} | 상태: ${statusLabel}`,
|
|
` 메모:`,
|
|
notesBlock,
|
|
].join('\n');
|
|
}).join('\n\n');
|
|
}
|
|
|
|
export function buildWeeklyPrompt(input: WeeklyPromptInput): string {
|
|
const { thisWeek, nextWeek, thisRange, nextRange } = input;
|
|
return `# 임무 (Objective)
|
|
캘린더(Google Tasks)에서 추출한 금주·차주 작업 목록을 기반으로, **아래 정확한 포맷**의 주간 업무 보고서를 작성한다. 외부 지식 없이 제공된 데이터만 사용한다.
|
|
|
|
# 분류 규칙 (이미 끝남 — 재분류 금지)
|
|
- 금주/차주 분류는 호출부에서 날짜로 이미 끝냈다. [금주 작업]에 들어온 항목은 [금주] 섹션에, [차주 작업]은 [차주] 섹션에 그대로 배치한다. **임의로 옮기지 말 것.**
|
|
- 금주 기간: ${thisRange[0]} ~ ${thisRange[1]} / 차주 기간: ${nextRange[0]} ~ ${nextRange[1]}
|
|
|
|
# 작성 규칙 (Rules)
|
|
1. 각 task 는 한 줄로: \`: [태그] 작업명 (M/D)\` 형식. 제목 앞의 \`[태그]\`(예: [이머시브], [3D App], [기타])는 그대로 유지한다.
|
|
- 날짜는 M/D 형식(예: 6/12). 완료된 작업은 \`(6/4 완료)\`, 예정은 \`(6/8)\`, 마감이 차주인데 금주에 진행 중이면 \`(6/12 완료 예상)\`처럼 메모 근거가 있을 때만 표기.
|
|
- 제목 끝의 \`(미확정)\` 같은 자동 꼬리표는 빼고 작업명만 쓴다.
|
|
2. 같은 \`[태그]\`끼리 인접하도록 정렬한다.
|
|
3. 각 task 아래에 하위 항목(\` - \`)으로 세부 내용을 2~4개 적는다. **이 세부 내용은 오직 해당 task 의 '메모'에서만** 끌어온다(작업 상세·맥락·기한 표기). 메모를 짧은 서술형으로 다듬되, 날짜·대상·수치는 메모에 적힌 그대로 인용한다.
|
|
4. **메모에 없는 내용을 추가하지 말 것.** 세부 정보가 부족하면 지어내지 말고 "추가 확인 필요" 또는 메모에 적힌 "(확인 필요)"를 그대로 옮긴다.
|
|
5. 해당 섹션에 task 가 하나도 없으면 그 섹션 본문에 \`: (해당 작업 없음)\` 한 줄만 적는다.
|
|
|
|
# 출력 포맷 (정확히 이 구조 — 헤더 문구·대괄호 그대로)
|
|
|
|
[금주]
|
|
[주요 일정]
|
|
: [태그] 작업명 (M/D)
|
|
- 세부 내용
|
|
- 세부 내용
|
|
|
|
: [태그] 작업명 (M/D)
|
|
- 세부 내용
|
|
|
|
[차주]
|
|
[예상 일정]
|
|
: [태그] 작업명 (M/D)
|
|
- 세부 내용
|
|
|
|
---
|
|
[금주 작업] (${thisWeek.length}건)
|
|
${serializeTasks(thisWeek)}
|
|
|
|
[차주 작업] (${nextWeek.length}건)
|
|
${serializeTasks(nextWeek)}
|
|
|
|
위 포맷을 정확히 따르고, 보고서 본문만 출력한다(설명·머리말·코드펜스 금지).`;
|
|
}
|