/** * 会话内 /skill: 加载金蝶产品线 skill 时,只做只读一致性检查。`kcode init` 是唯一产品线写入入口。 */ import type { ExtensionAPI } from "@kingdee-kcode/coding-agent"; import { SKILL_PROMPT_MESSAGE_TYPE, type SkillPromptDetails } from "@kingdee-kcode/coding-agent/session/messages"; import type { CustomMessageEntry, SessionEntry } from "@kingdee-kcode/coding-agent/session/session-entries"; import { getSkillProductBinding } from "../src/project/product-line-registry"; import { checkProductsFromSkillNames } from "../src/project/product-line-check"; function collectSkillNamesFromBranch(entries: SessionEntry[]): string[] { const names: string[] = []; for (const entry of entries) { if (entry.type !== "custom_message") continue; const cm = entry as CustomMessageEntry; if (cm.customType !== SKILL_PROMPT_MESSAGE_TYPE) continue; const name = cm.details?.name?.trim(); if (name) names.push(name); } return names; } export default function (pi: ExtensionAPI) { let lastCheckedKey = ""; pi.on("turn_start", async (_event, ctx) => { const skillNames = collectSkillNamesFromBranch(ctx.sessionManager.getBranch()); const productSkills = skillNames.filter((n) => getSkillProductBinding(n)); if (productSkills.length === 0) return; const key = productSkills.slice().sort().join(","); if (key === lastCheckedKey) return; checkProductsFromSkillNames(ctx.cwd, productSkills); lastCheckedKey = key; }); }