* [misc] define ai story review agent.

This commit is contained in:
sunhao
2025-10-09 13:34:50 +08:00
parent 6fca2a9472
commit bd06dc72da
+47
View File
@@ -1,3 +1,50 @@
function registerZentaoAIPlugin(lang)
{
const ONE_BREAK = '\n';
const TWO_BREAKS = ONE_BREAK + ONE_BREAK;
const plugin = zui.AIPlugin.define('zentao', {name: lang.name, icon: 'zentao'});
plugin.defineAgent('storyReviewer',
{
name: lang.storyReview,
alias: [lang.storyReview, 'storyReview'],
welcome: [
'👋 您好,欢迎使用禅道需求评审专家。',
'我将帮助您精准分析需求,提升质量并确保可执行性。',
'',
'请提供您想要评审的需求内容,我将立即开始评审并提供针对性建议。',
'',
'我们的目标是:',
'- 快速识别需求中的关键问题',
'- 提供清晰的改进方向',
'- 使需求更具可实现性与高效交付性',
'',
'请随时向我提出任何问题, 我将在每一步为您提供帮助。',
].join(ONE_BREAK),
prompt: '# 角色定位\n\n\n\n你是一位资深的需求评审专家,专注于帮助项目管理团队提升需求条目的完整性、逻辑性与可实现性。\n\n你的职责是基于专业评审方法,在一次完整分析中,系统性提出归类清晰、重点突出的评审建议,引导用户高效完善需求。如果用户问询需求评审以外的问题,可以给与简单响应后,拉回需求评审中\n\n\n\n# 核心专业能力\n\n- 结构完整性分析(角色、动作、目标、约束要素)\n\n- 逻辑一致性分析(单条及多条需求之间的合理性)\n\n- 评审标准适配(INVEST、SMART或自定义标准)\n\n- 优先级归类评审建议(突出最关键问题,辅助次要优化)\n\n- 正式、清晰、专业的输出风格(无emoji,注重结构)\n\n\n\n# 工作风格\n\n- 一轮输出,结构化归类\n\n- 引导用户先聚焦最关键问题\n\n- 提供清晰、专业、可操作的完善方向\n\n- 语言正式、客观,保持体验流畅且不压迫\n\n\n\n\n\n# 评审交互流程\n\n1. 接收需求文本(来源于需求详情点击或输入)\n\n2. 进行结构与逻辑完整性检查\n\n3. 按重要性将评审建议归为两大类:\n\n- 核心优先改进项(必须优先处理)\n\n- 次要优化建议(在有时间或资源时进一步完善)\n\n4. 一次性输出完整评审结果,不进行多轮追问\n\n5. 引导用户先集中处理核心问题,如有余力再逐步优化次要问题\n\n\n\n# 输出结构要求\n\n\n\n- 统一使用正式Markdown结构,分清主次\n\n- 首先输出【评审总结】,概述整体需求状态\n\n- 然后分为两个部分输出:\n\n- 第一部分:核心优先改进项\n\n- 第二部分:次要优化建议\n\n- 每个建议应简明扼要,突出问题与优化方向\n\n- 不使用emoji或花哨符号,保持专业正式风格\n\n\n\n# 输出示范结构\n\n\n\n# 需求评审结果总结\n\n\n\n本次评审分析显示,需求整体情况如下:\n\n- 结构完整性:基本完整/存在缺失\n\n- 逻辑一致性:连贯/存在冲突\n\n- 标准符合性(如INVEST):符合/部分符合/存在明显缺口\n\n\n\n# 核心优先改进项\n\n\n\n以下问题建议优先处理,以保证需求的可实现性与后续交付质量:\n\n\n\n1. (最重要问题简述)\n\n2. (次重要问题简述)\n\n3. (其他关键问题简述)\n\n\n\n# 次要优化建议\n\n\n\n在核心问题处理完毕后,可进一步关注以下细节优化:\n\n\n\n1. (次要问题简述)\n\n2. (细节补充建议)\n\n3. (未来增强方向提示)\n\n\n\n# 小结\n\n\n\n根据用户本次的改进项目,给出总结。\n\n\n\n# 附加控制策略\n\n- 若检测到需求长度或复杂度超出正常范围,可适度缩减次要优化建议,只列出最相关的补充方向。\n\n- 若累计对话Token数接近10000时,友好提示建议保存成果并新开对话,避免性能下降',
].join(ONE_BREAK)
});
plugin.defineMethod('reviewStory', function({state, panel}, story)
{
if(!story)
{
const page$ = $.apps.getLastApp().iframe.contentWindow.$;
story = state?.story || {
title: page$('#mainContent').find('.detail-header .entity-title-text').text(),
spec: page$('#mainContent').find('.detail-body').find('.detail-section[zui-key="spec"],.detail-section[zui-key="需求描述"],.detail-section[zui-key="Description"]').find('.detail-section-content').text(),
verify: page$('#mainContent').find('.detail-body').find('.detail-section[zui-key="verify"],.detail-section[zui-key="验收标准"],.detail-section[zui-key="Acceptance"]').find('.detail-section-content').text(),
};
}
panel && panel.openPopup({
viewType: 'chat',
postMessage: `/storyReviewer ${zui.formatString(lang.storyReviewMessage, story)}`,
viewProps: {mode: 'simple'}
});
});
}
$(() => {
const AIPanel = zui.AIPanel;
const ZentaoAIStore = zui.ZentaoAIStore;