Files
superwork/vscode/src/cc/promptTemplate.ts
T
cruldra 7bac5c8b03 ✨ feat(vscode): 七份提示词统一走 Handlebars,头脑风暴三档合一
- 模板引擎换成 Handlebars(noEscape,提示词是纯文本不能被转义),单花括号写法彻底退场
- brainstorm-continue / brainstorm-continue-prototype 两份并进 brainstorm.md,
  用 {{#if issueNumber}} 分新建 / 续聊,续聊里用 {{#if prototypeFile}} 嵌原型段落,
  设置面板对应的两个 textarea 一并删掉
- 模板上下文 = 工单 state JSON 全量字段 + issueNumber / userRequest / nonce /
  planFile / prNumber / prRef,以后模板想用新字段不用改扩展代码
- 各会话入口共用一条 state 读取路径,读失败只记 warn 按空状态继续,不拦开会话
- 升级后首次启动把存量自定义提示词迁到双花括号并合并成一份,改写前把
  settings.json 备份成 settings.json.bak-<时间戳>,迁移动作全写日志
- 装 handlebars 时给 vsce 传递依赖的老 semver 加 trustPolicyExclude 豁免,
  否则 no-downgrade 策略卡住整个装包

Claude-Session: https://claude.ai/code/session_01Kgmb1LvrPmFX3NoUDB4zZC
2026-09-15 00:44:28 +08:00

33 lines
1.1 KiB
TypeScript

/**
* 提示词模板的渲染内核:七份模板统一走 Handlebars。
*
* `noEscape` 是必须的——提示词是打进终端的纯文本,默认的 HTML 转义会把
* 引号、`&`、`<` 变成实体,cc 收到的就是一堆 `&quot;`。
*
* 这个模块刻意不碰 vscode / 文件系统,方便单测直接跑。
*/
import Handlebars from 'handlebars'
export type PromptContext = Record<string, unknown>
/**
* 模板上下文 = 工单 state JSON 全量字段 + 调用方补的那几个变量。
*
* `extra` 里值为 undefined 的键直接丢掉:否则 `{ planFile: undefined }` 会把
* state 里真有的 planFile 盖成空。
*/
export function buildPromptContext(state: PromptContext | undefined, extra: PromptContext): PromptContext {
const out: PromptContext = { ...(state ?? {}) }
for (const [k, v] of Object.entries(extra)) {
if (v !== undefined)
out[k] = v
}
return out
}
/** 渲染模板;模板有语法错误时抛错,由调用方决定怎么兜。 */
export function renderPromptTemplate(tpl: string, context: PromptContext): string {
return Handlebars.compile(tpl, { noEscape: true })(context)
}