- M1: prompt.test.ts test 4 변수명 candidateIdx → headerIdx (실제 anchor 가 'Today's date' 헤더) - N1: prompt.ts return 직전 self-delimited block 컨벤션 1줄 코멘트 skip: N2 (PROMPT_VERSION 테스트 redundancy nit — harmless guard), N3 (vocab dedup/normalize — Task 1 caller 책임) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
44 lines
2.1 KiB
TypeScript
44 lines
2.1 KiB
TypeScript
import type { ParseResult } from '../services/dueDateParser.js';
|
|
|
|
export const PROMPT_VERSION = 4;
|
|
|
|
export function buildPrompt(
|
|
rawText: string,
|
|
todayKst: string,
|
|
candidates: ParseResult[] = [],
|
|
vocab: string[] = []
|
|
): string {
|
|
const candidateBlock = candidates.length > 0
|
|
? `\nDate candidates extracted by a Korean rule parser (these are HINTS — you decide which is correct, or pick null):
|
|
${candidates.map((c, i) => ` ${i + 1}. ${c.iso ?? '(ambiguous)'} — matched token: "${c.matchedToken ?? '?'}" (confidence: ${c.confidence ?? 'low'})`).join('\n')}\n`
|
|
: '';
|
|
|
|
const vocabBlock = vocab.length > 0
|
|
? `\nExisting vocabulary tags (most-used first): ${vocab.join(', ')}\nPrefer reusing a vocabulary tag when the meaning matches; create new tags only when the meaning is genuinely new.\n`
|
|
: '';
|
|
|
|
// candidateBlock & vocabBlock are self-delimited with leading/trailing \n
|
|
return `You organize raw personal notes into structured metadata.
|
|
|
|
Today's date in Korea Standard Time (KST): ${todayKst}
|
|
${candidateBlock}${vocabBlock}
|
|
Input note (raw text, may be fragmented, any language):
|
|
---
|
|
${rawText}
|
|
---
|
|
|
|
Return a JSON object with EXACTLY these keys:
|
|
- "title": concise title in KOREAN (max 60 chars)
|
|
- "summary": 3-line summary in KOREAN. Each line max 120 chars. Lines separated by "\\n".
|
|
- "tags": array of 0 to 3 tags in lowercase kebab-case (English letters and digits only, e.g., "api-timeout", "weekly-retro"). Empty array if no clear tags.
|
|
- "due_date": ISO YYYY-MM-DD if you are CONFIDENT about a deadline, else null. Consider rule candidates above as hints but use your own judgment — if multiple ambiguous candidates ("내일 모레", "이번 주 다음 주"), prefer null. If the user wrote "오늘 PR 리뷰" with no deadline implication, return null.
|
|
|
|
Rules:
|
|
- title and summary MUST be written in Korean regardless of input language.
|
|
- tags MUST be English kebab-case (for consistency across notes; easier to search/group).
|
|
- due_date MUST be ISO YYYY-MM-DD format or null. Never include time-of-day.
|
|
- Do NOT invent facts not present in the input.
|
|
- Do NOT include markdown code fences or preamble.
|
|
- Return ONLY the JSON object.`;
|
|
}
|