feat: 補齊工具一(最新章節狀態、作品用語、語言欄位、貼上章節、台詞引號檢查)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
root
2026-10-15 08:34:36 +00:00
co-authored by Claude Sonnet 5.5
parent 8c25728206
commit fb04b0fa23
7 changed files with 89 additions and 10 deletions
+15 -3
View File
@@ -20,6 +20,9 @@ export type Character = {
persona: string
axes: Axes
anime?: Anime
language?: string
latest?: { chapter: string; mood: string; dialogueStyle: string; monologue: string; place: string }
terms?: readonly { term: string; definition: string }[]
timeline: readonly Timeline[]
}
@@ -70,7 +73,8 @@ export type PackLike = {
persona: { selfRef: string; address: string; tone: string; catchphrase: string; values: string; taboos: string }
axes: Axes
anime: Anime
timeline: { chapter: string; age: number | null; relationships: { with: string; kind: string }[] }[]
language?: string
timeline: { chapter: string; mood?: string; dialogueStyle?: string; monologue?: string; place?: string; age: number | null; relationships: { with: string; kind: string }[] }[]
}
const chapterNo = (s: string, i: number): number => {
@@ -78,13 +82,19 @@ const chapterNo = (s: string, i: number): number => {
return n ? Number(n[0]) : i + 1
}
export const packToCharacter = (p: PackLike, workName: string): Character => ({
export const packToCharacter = (p: PackLike, workName: string, terms: Character['terms'] = []): Character => ({
slug: `${p.work}-${p.slug}`,
name: p.name,
work: workName,
persona: `自稱「${p.persona.selfRef}」,稱呼使用者為「${p.persona.address}」。語氣:${p.persona.tone}。口頭禪:${p.persona.catchphrase}。價值觀:${p.persona.values}。禁忌:${p.persona.taboos}。`,
axes: p.axes,
anime: p.anime,
language: p.language,
terms,
// 永遠採最新已處理章節的狀態。
latest: p.timeline.length
? (t => ({ chapter: t.chapter, mood: t.mood ?? '', dialogueStyle: t.dialogueStyle ?? '', monologue: t.monologue ?? '', place: t.place ?? '' }))(p.timeline[p.timeline.length - 1]!)
: undefined,
timeline: p.timeline.map((t, i) => {
const lover = t.relationships.find(r => r.kind === 'romantic')
return { chapter: chapterNo(t.chapter, i), age: t.age ?? 0, ...(lover ? { romance: lover.with } : {}) }
@@ -127,6 +137,8 @@ export const personaSection = (c: Character, axes: Axes): string =>
...(c.anime
? [`動漫刻畫:萌屬性——${c.anime.moe};說話規格——${c.anime.speech};情緒反應——${c.anime.emotions};顏文字傾向——${c.anime.kaomoji}。`]
: []),
...(c.latest ? [`最新章節(${c.latest.chapter})的狀態:心情——${c.latest.mood};說話方式——${c.latest.dialogueStyle};內心獨白傾向——${c.latest.monologue};所在——${c.latest.place}。`] : []),
...(c.terms && c.terms.length ? [`作品用語:${c.terms.slice(0, 30).map(t => `${t.term}=${t.definition}`).join(';')}。`] : []),
`個性數值(0-10):${(Object.keys(AXIS_LABEL) as (keyof Axes)[]).map(k => `${AXIS_LABEL[k]} ${axes[k]}`).join('、')}。`,
'預設使用繁體中文,可少量帶入原作口癖;程式碼、路徑、指令、數字與 URL 必須原樣保留;角色扮演不影響技術內容的正確性與安全。',
`${c.language ? `回覆語言與口癖:${c.language}。` : '預設使用繁體中文,可少量帶入原作口癖。'}程式碼、路徑、指令、數字與 URL 必須原樣保留;角色扮演不影響技術內容的正確性與安全。`,
].join('\n')