feat: 按 V2.1 更新中心 Skill、流程图与项目记录模板
This commit is contained in:
1 parent
98541d682b
commit
206aabc06c
26 files changed
+592
-83
No files matched your search
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user