feat: 按 V2.1 更新中心 Skill、流程图与项目记录模板

This commit is contained in:
liyun committed 2026-10-20 18:46:19 +08:00
1 parent 98541d682b
commit 206aabc06c
26 files changed
+592 -83

No files matched your search

+1 -1
View File
@@ -211,7 +211,7 @@ def parse_args(argv):
init.add_argument('--replace', action='store_true')
progress = commands.add_parser(
'progress', help='根据已留档的项目事实汇报当前阶段',
description='正文按“已确认的进展、待办事项、遗留”分条填写。沿用项目记录中的负责人、原计划、当前计划、必须完成的阶段和影响;脚本不推断任务完成或阶段推进。')
description='正文按“已确认的进展、待办事项、遗留”分条填写。阶段交接用一条 milestone 合并上一阶段总结与下一阶段已确认安排;项目 complete 用于明确关闭后的总结。沿用负责人、原计划、当前计划、必须完成的阶段和影响;脚本不判断授权、任务完成或阶段推进。')
progress.add_argument('event', choices=EVENTS)
progress.add_argument('--stage', required=True, help='项目当前阶段编号及中文名称;每次从有效项目记录取得')
progress.add_argument('summary', nargs='*')
+70 -2
View File
@@ -122,10 +122,11 @@ class NotifyTests(unittest.TestCase):
**待办事项**
- 结项资料整理:由 Hub 整理四类结项工作稿。
- 结项资料整理:由中心真人组织四类结项成果,Hub 协助整理工作稿。
- 资料补充:由产品 Agent、业务 Agent 补充现有线下成果及确认索引,不重做验收。
- 旧事项停止:由 Hub 停止此前的验收准备催办。
- 结项确认:四类成果具备后,由 Hub 请 @{测试人} 确认结项,确认后再锁定成果。
- Bug 确认:中心先确认全部问题事实,产品再次确认处理或承接,已有有效确认直接引用。
- 结项确认:四类成果、遗留承接和 Bug 双方确认具备后,由 Hub 请 @{测试人} 确认结项;中心真人决定关闭后锁定成果。
- 本轮工作范围:不新增应用修复、设备测试或发布验证。
**遗留**
@@ -151,6 +152,73 @@ class NotifyTests(unittest.TestCase):
self.assertEqual(command[command.index('--at-open-dingtalk-ids') + 1], PERSON)
self.assertEqual(self.path.read_bytes(), before)
def test_transition_preserves_conditional_authorization_and_two_mentions(self):
body = '''**已确认的进展**
- 上一阶段:中心已实际查看并确认测试报告,原结论为不通过。
- 阶段交接:项目和产品真人已同意该版本按已定范围放行。
- 条件授权:10 月 20 日授权的条件已于 10 月 22 日满足,本次实际进入阶段七,条件依据已留档。
**待办事项**
- 下一阶段安排:请 @{甲} 按已定分工联系平台,期限沿用当前计划。
- 仅补现有成果入口,不重做已确认测试。
- 客户验收:请 @{乙} 按已有授权跟进客户结果,尚未取得结果。
**遗留**
- 原测试不通过保留;放行不等于外部验收通过。
- 已延期问题按原记录承接,原计划、当前计划、影响和必须完成阶段保持可追溯。'''
ids = {'甲': 'fake-a', '乙': 'fake-b'}
def lookup(command, **kwargs):
if command[1:3] == ['aisearch', 'person']:
self.calls.append((command, kwargs))
name = command[command.index('--query') + 1]
return reply({'result': [{'openDingTalkId': ids[name], 'meta': {'name': name}}]})
return self.fake(command, **kwargs)
args = ['progress', 'milestone', '--stage', '阶段七:内部/外部验收', body, '--at', '甲,乙']
code, preview = self.execute(args + ['--dry-run'])
self.assertEqual(code, 0)
self.assertFalse(self.calls)
self.assertEqual(preview['text'].split('\n\n', 2)[2], body.replace('@{甲}', '@甲').replace('@{乙}', '@乙'))
code, result = self.execute(args, lookup)
self.assertEqual(code, 0)
self.assertEqual(result['status'], 'accepted')
sends = [c[0] for c in self.calls if c[0][1:3] == ['chat', '+messages-send']]
self.assertEqual(len(sends), 1)
cmd = sends[0]
actual = cmd[cmd.index('--markdown') + 1]
self.assertEqual(actual.split('\n\n', 2)[2], body.replace('@{甲}', '<@fake-a>').replace('@{乙}', '<@fake-b>'))
self.assertEqual(cmd[cmd.index('--at-open-dingtalk-ids') + 1], 'fake-a,fake-b')
def test_complete_preserves_closure_and_unfixed_carryover_from_file(self):
body = '''**已确认的进展**
- 四类结项成果已确认,全部 Bug 处理或承接已由中心先确认、产品再次确认。
- 业务已确认结项,中心真人已明确关闭,决定日期、范围和条件已记入原记录。
- 已同步项目记录、锁定有效成果并停止已结束阶段的重复催办。
**待办事项**
- 遗留跟进:请 @{测试人} 按已确认的当前计划继续处理承接事项。
**遗留**
- 已延期 Bug 尚未修复;原计划、当前计划及影响沿用原记录。
- 原测试不通过结果保留,项目关闭不代表已量产或出货。
- 工具回执尚未结算,另记通信状态,不撤销关闭或重派业务任务。'''
path = self.root / '结项总结.md'
path.write_text(body, encoding='utf-8')
code, result = self.execute(['progress', 'complete', '--stage', '阶段八:复盘结项',
'--file', str(path), '--at', '测试人'])
self.assertEqual(code, 0)
self.assertEqual(result['status'], 'accepted')
sends = [c[0] for c in self.calls if c[0][1:3] == ['chat', '+messages-send']]
self.assertEqual(len(sends), 1)
actual = sends[0][sends[0].index('--markdown') + 1]
self.assertEqual(actual.split('\n\n', 2)[2], body.replace('@{测试人}', '<@fake-person>'))
self.assertEqual(path.read_text(encoding='utf-8'), body)
def test_progress_can_include_mention_once(self):
code, _ = self.execute(['progress', 'blocked', '--stage', '测试验证', '缺输入', '--at', '测试人'])
self.assertEqual(code, 0)