@fitlab-ai/agent-infra 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/README.md +23 -15
  2. package/README.zh-CN.md +23 -15
  3. package/lib/defaults.json +5 -9
  4. package/lib/init.js +1 -6
  5. package/lib/update.js +0 -55
  6. package/package.json +1 -1
  7. package/templates/.agents/QUICKSTART.md +17 -7
  8. package/templates/.agents/QUICKSTART.zh-CN.md +23 -13
  9. package/templates/.agents/README.md +33 -27
  10. package/templates/.agents/README.zh-CN.md +35 -29
  11. package/templates/.agents/skills/analyze-task/SKILL.md +1 -4
  12. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +1 -3
  13. package/templates/.agents/skills/block-task/SKILL.md +1 -5
  14. package/templates/.agents/skills/block-task/SKILL.zh-CN.md +1 -4
  15. package/templates/.agents/skills/check-task/SKILL.md +1 -5
  16. package/templates/.agents/skills/check-task/SKILL.zh-CN.md +1 -3
  17. package/templates/.agents/skills/close-codescan/SKILL.md +1 -4
  18. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +1 -3
  19. package/templates/.agents/skills/close-dependabot/SKILL.md +1 -4
  20. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +1 -3
  21. package/templates/.agents/skills/commit/SKILL.md +26 -198
  22. package/templates/.agents/skills/commit/SKILL.zh-CN.md +26 -197
  23. package/templates/.agents/skills/commit/reference/commit-message.md +60 -0
  24. package/templates/.agents/skills/commit/reference/commit-message.zh-CN.md +60 -0
  25. package/templates/.agents/skills/commit/reference/copyright-check.md +39 -0
  26. package/templates/.agents/skills/commit/reference/copyright-check.zh-CN.md +39 -0
  27. package/templates/.agents/skills/commit/reference/task-status-update.md +88 -0
  28. package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +88 -0
  29. package/templates/.agents/skills/complete-task/SKILL.md +1 -6
  30. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +1 -4
  31. package/templates/.agents/skills/create-issue/SKILL.md +32 -251
  32. package/templates/.agents/skills/create-issue/SKILL.zh-CN.md +33 -252
  33. package/templates/.agents/skills/create-issue/reference/label-and-type.md +77 -0
  34. package/templates/.agents/skills/create-issue/reference/label-and-type.zh-CN.md +77 -0
  35. package/templates/.agents/skills/create-issue/reference/template-matching.md +45 -0
  36. package/templates/.agents/skills/create-issue/reference/template-matching.zh-CN.md +45 -0
  37. package/templates/.agents/skills/create-pr/SKILL.md +39 -221
  38. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +39 -220
  39. package/templates/.agents/skills/create-pr/reference/branch-strategy.md +29 -0
  40. package/templates/.agents/skills/create-pr/reference/branch-strategy.zh-CN.md +29 -0
  41. package/templates/.agents/skills/create-pr/reference/pr-body-template.md +86 -0
  42. package/templates/.agents/skills/create-pr/reference/pr-body-template.zh-CN.md +86 -0
  43. package/templates/.agents/skills/create-release-note/SKILL.md +10 -13
  44. package/templates/.agents/skills/create-release-note/SKILL.zh-CN.md +10 -12
  45. package/templates/.agents/skills/create-task/SKILL.md +2 -5
  46. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +2 -4
  47. package/templates/.agents/skills/implement-task/SKILL.md +47 -176
  48. package/templates/.agents/skills/implement-task/SKILL.zh-CN.md +43 -170
  49. package/templates/.agents/skills/implement-task/reference/implementation-rules.md +58 -0
  50. package/templates/.agents/skills/implement-task/reference/implementation-rules.zh-CN.md +58 -0
  51. package/templates/.agents/skills/implement-task/reference/report-template.md +63 -0
  52. package/templates/.agents/skills/implement-task/reference/report-template.zh-CN.md +63 -0
  53. package/templates/.agents/skills/import-codescan/SKILL.md +1 -4
  54. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -3
  55. package/templates/.agents/skills/import-dependabot/SKILL.md +1 -4
  56. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -3
  57. package/templates/.agents/skills/import-issue/SKILL.md +2 -3
  58. package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +2 -3
  59. package/templates/.agents/skills/init-labels/SKILL.md +1 -4
  60. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +1 -4
  61. package/templates/.agents/skills/init-milestones/SKILL.md +1 -3
  62. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +1 -3
  63. package/templates/.agents/skills/plan-task/SKILL.md +1 -5
  64. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +1 -3
  65. package/templates/.agents/skills/refine-task/SKILL.md +40 -162
  66. package/templates/.agents/skills/refine-task/SKILL.zh-CN.md +38 -158
  67. package/templates/.agents/skills/refine-task/reference/fix-workflow.md +76 -0
  68. package/templates/.agents/skills/refine-task/reference/fix-workflow.zh-CN.md +76 -0
  69. package/templates/.agents/skills/refine-task/reference/report-template.md +38 -0
  70. package/templates/.agents/skills/refine-task/reference/report-template.zh-CN.md +38 -0
  71. package/templates/.agents/skills/refine-title/SKILL.md +1 -4
  72. package/templates/.agents/skills/refine-title/SKILL.zh-CN.md +1 -3
  73. package/templates/.agents/skills/release/SKILL.md +10 -12
  74. package/templates/.agents/skills/release/SKILL.zh-CN.md +10 -11
  75. package/templates/.agents/skills/review-task/SKILL.md +37 -239
  76. package/templates/.agents/skills/review-task/SKILL.zh-CN.md +37 -238
  77. package/templates/.agents/skills/review-task/reference/output-templates.md +72 -0
  78. package/templates/.agents/skills/review-task/reference/output-templates.zh-CN.md +72 -0
  79. package/templates/.agents/skills/review-task/reference/report-template.md +63 -0
  80. package/templates/.agents/skills/review-task/reference/report-template.zh-CN.md +63 -0
  81. package/templates/.agents/skills/review-task/reference/review-criteria.md +24 -0
  82. package/templates/.agents/skills/review-task/reference/review-criteria.zh-CN.md +24 -0
  83. package/templates/.agents/skills/sync-issue/SKILL.md +34 -490
  84. package/templates/.agents/skills/sync-issue/SKILL.zh-CN.md +34 -489
  85. package/templates/.agents/skills/sync-issue/reference/comment-publish.md +84 -0
  86. package/templates/.agents/skills/sync-issue/reference/comment-publish.zh-CN.md +84 -0
  87. package/templates/.agents/skills/sync-issue/reference/label-sync.md +62 -0
  88. package/templates/.agents/skills/sync-issue/reference/label-sync.zh-CN.md +62 -0
  89. package/templates/.agents/skills/sync-issue/reference/milestone-sync.md +37 -0
  90. package/templates/.agents/skills/sync-issue/reference/milestone-sync.zh-CN.md +37 -0
  91. package/templates/.agents/skills/sync-pr/SKILL.md +37 -284
  92. package/templates/.agents/skills/sync-pr/SKILL.zh-CN.md +41 -288
  93. package/templates/.agents/skills/sync-pr/reference/comment-publish.md +82 -0
  94. package/templates/.agents/skills/sync-pr/reference/comment-publish.zh-CN.md +82 -0
  95. package/templates/.agents/skills/sync-pr/reference/delivery-detection.md +54 -0
  96. package/templates/.agents/skills/sync-pr/reference/delivery-detection.zh-CN.md +54 -0
  97. package/templates/.agents/skills/test/SKILL.md +1 -3
  98. package/templates/.agents/skills/test/SKILL.zh-CN.md +1 -3
  99. package/templates/.agents/skills/test-integration/SKILL.md +1 -4
  100. package/templates/.agents/skills/test-integration/SKILL.zh-CN.md +1 -3
  101. package/templates/.agents/skills/update-agent-infra/SKILL.md +2 -6
  102. package/templates/.agents/skills/update-agent-infra/SKILL.zh-CN.md +2 -4
  103. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +45 -55
  104. package/templates/.agents/skills/upgrade-dependency/SKILL.md +1 -4
  105. package/templates/.agents/skills/upgrade-dependency/SKILL.zh-CN.md +1 -3
  106. package/templates/.claude/commands/analyze-task.md +1 -1
  107. package/templates/.claude/commands/analyze-task.zh-CN.md +1 -1
  108. package/templates/.claude/commands/block-task.md +2 -1
  109. package/templates/.claude/commands/block-task.zh-CN.md +2 -1
  110. package/templates/.claude/commands/check-task.md +2 -1
  111. package/templates/.claude/commands/check-task.zh-CN.md +2 -1
  112. package/templates/.claude/commands/close-codescan.md +2 -1
  113. package/templates/.claude/commands/close-codescan.zh-CN.md +2 -1
  114. package/templates/.claude/commands/close-dependabot.md +2 -1
  115. package/templates/.claude/commands/close-dependabot.zh-CN.md +2 -1
  116. package/templates/.claude/commands/commit.md +1 -1
  117. package/templates/.claude/commands/commit.zh-CN.md +1 -1
  118. package/templates/.claude/commands/complete-task.md +1 -1
  119. package/templates/.claude/commands/complete-task.zh-CN.md +1 -1
  120. package/templates/.claude/commands/create-issue.md +1 -1
  121. package/templates/.claude/commands/create-issue.zh-CN.md +1 -1
  122. package/templates/.claude/commands/create-pr.md +2 -2
  123. package/templates/.claude/commands/create-pr.zh-CN.md +2 -2
  124. package/templates/.claude/commands/create-release-note.md +2 -1
  125. package/templates/.claude/commands/create-release-note.zh-CN.md +2 -1
  126. package/templates/.claude/commands/create-task.md +1 -1
  127. package/templates/.claude/commands/create-task.zh-CN.md +1 -1
  128. package/templates/.claude/commands/implement-task.md +1 -1
  129. package/templates/.claude/commands/implement-task.zh-CN.md +1 -1
  130. package/templates/.claude/commands/import-codescan.md +1 -0
  131. package/templates/.claude/commands/import-codescan.zh-CN.md +2 -1
  132. package/templates/.claude/commands/import-dependabot.md +1 -0
  133. package/templates/.claude/commands/import-dependabot.zh-CN.md +2 -1
  134. package/templates/.claude/commands/import-issue.md +1 -1
  135. package/templates/.claude/commands/import-issue.zh-CN.md +1 -1
  136. package/templates/.claude/commands/init-labels.md +1 -0
  137. package/templates/.claude/commands/init-labels.zh-CN.md +2 -1
  138. package/templates/.claude/commands/init-milestones.md +2 -1
  139. package/templates/.claude/commands/init-milestones.zh-CN.md +2 -1
  140. package/templates/.claude/commands/plan-task.md +1 -1
  141. package/templates/.claude/commands/plan-task.zh-CN.md +1 -1
  142. package/templates/.claude/commands/refine-task.zh-CN.md +1 -1
  143. package/templates/.claude/commands/refine-title.md +2 -1
  144. package/templates/.claude/commands/refine-title.zh-CN.md +2 -1
  145. package/templates/.claude/commands/release.md +2 -1
  146. package/templates/.claude/commands/release.zh-CN.md +2 -1
  147. package/templates/.claude/commands/review-task.md +1 -1
  148. package/templates/.claude/commands/review-task.zh-CN.md +1 -1
  149. package/templates/.claude/commands/sync-issue.md +1 -1
  150. package/templates/.claude/commands/sync-issue.zh-CN.md +1 -1
  151. package/templates/.claude/commands/sync-pr.md +2 -2
  152. package/templates/.claude/commands/sync-pr.zh-CN.md +2 -2
  153. package/templates/.claude/commands/test-integration.md +2 -1
  154. package/templates/.claude/commands/test-integration.zh-CN.md +2 -1
  155. package/templates/.claude/commands/test.md +1 -1
  156. package/templates/.claude/commands/test.zh-CN.md +1 -1
  157. package/templates/.claude/commands/update-agent-infra.md +2 -1
  158. package/templates/.claude/commands/update-agent-infra.zh-CN.md +2 -1
  159. package/templates/.claude/commands/upgrade-dependency.md +2 -1
  160. package/templates/.claude/commands/upgrade-dependency.zh-CN.md +2 -1
  161. package/templates/.gemini/commands/_project_/analyze-task.toml +1 -1
  162. package/templates/.gemini/commands/_project_/analyze-task.zh-CN.toml +1 -1
  163. package/templates/.gemini/commands/_project_/block-task.toml +1 -1
  164. package/templates/.gemini/commands/_project_/block-task.zh-CN.toml +1 -1
  165. package/templates/.gemini/commands/_project_/check-task.toml +1 -1
  166. package/templates/.gemini/commands/_project_/check-task.zh-CN.toml +1 -1
  167. package/templates/.gemini/commands/_project_/close-codescan.toml +1 -1
  168. package/templates/.gemini/commands/_project_/close-codescan.zh-CN.toml +1 -1
  169. package/templates/.gemini/commands/_project_/close-dependabot.toml +1 -1
  170. package/templates/.gemini/commands/_project_/close-dependabot.zh-CN.toml +1 -1
  171. package/templates/.gemini/commands/_project_/commit.toml +1 -1
  172. package/templates/.gemini/commands/_project_/commit.zh-CN.toml +1 -1
  173. package/templates/.gemini/commands/_project_/complete-task.toml +1 -1
  174. package/templates/.gemini/commands/_project_/complete-task.zh-CN.toml +1 -1
  175. package/templates/.gemini/commands/_project_/create-issue.zh-CN.toml +1 -1
  176. package/templates/.gemini/commands/_project_/create-pr.toml +1 -1
  177. package/templates/.gemini/commands/_project_/create-pr.zh-CN.toml +1 -1
  178. package/templates/.gemini/commands/_project_/create-release-note.toml +1 -1
  179. package/templates/.gemini/commands/_project_/create-release-note.zh-CN.toml +1 -1
  180. package/templates/.gemini/commands/_project_/create-task.toml +1 -1
  181. package/templates/.gemini/commands/_project_/create-task.zh-CN.toml +1 -1
  182. package/templates/.gemini/commands/_project_/implement-task.toml +1 -1
  183. package/templates/.gemini/commands/_project_/implement-task.zh-CN.toml +1 -1
  184. package/templates/.gemini/commands/_project_/import-codescan.zh-CN.toml +1 -1
  185. package/templates/.gemini/commands/_project_/import-dependabot.zh-CN.toml +1 -1
  186. package/templates/.gemini/commands/_project_/import-issue.toml +1 -1
  187. package/templates/.gemini/commands/_project_/import-issue.zh-CN.toml +1 -1
  188. package/templates/.gemini/commands/_project_/init-labels.zh-CN.toml +1 -1
  189. package/templates/.gemini/commands/_project_/init-milestones.toml +1 -1
  190. package/templates/.gemini/commands/_project_/init-milestones.zh-CN.toml +1 -1
  191. package/templates/.gemini/commands/_project_/plan-task.toml +1 -1
  192. package/templates/.gemini/commands/_project_/plan-task.zh-CN.toml +1 -1
  193. package/templates/.gemini/commands/_project_/refine-task.zh-CN.toml +1 -1
  194. package/templates/.gemini/commands/_project_/refine-title.toml +1 -1
  195. package/templates/.gemini/commands/_project_/refine-title.zh-CN.toml +1 -1
  196. package/templates/.gemini/commands/_project_/release.toml +1 -1
  197. package/templates/.gemini/commands/_project_/release.zh-CN.toml +1 -1
  198. package/templates/.gemini/commands/_project_/review-task.toml +1 -1
  199. package/templates/.gemini/commands/_project_/review-task.zh-CN.toml +1 -1
  200. package/templates/.gemini/commands/_project_/sync-issue.toml +1 -1
  201. package/templates/.gemini/commands/_project_/sync-issue.zh-CN.toml +1 -1
  202. package/templates/.gemini/commands/_project_/sync-pr.toml +2 -2
  203. package/templates/.gemini/commands/_project_/sync-pr.zh-CN.toml +2 -2
  204. package/templates/.gemini/commands/_project_/test-integration.toml +1 -1
  205. package/templates/.gemini/commands/_project_/test-integration.zh-CN.toml +1 -1
  206. package/templates/.gemini/commands/_project_/test.toml +1 -1
  207. package/templates/.gemini/commands/_project_/test.zh-CN.toml +1 -1
  208. package/templates/.gemini/commands/_project_/update-agent-infra.toml +1 -1
  209. package/templates/.gemini/commands/_project_/update-agent-infra.zh-CN.toml +1 -1
  210. package/templates/.gemini/commands/_project_/upgrade-dependency.toml +1 -1
  211. package/templates/.gemini/commands/_project_/upgrade-dependency.zh-CN.toml +1 -1
  212. package/templates/.github/hooks/check-version-format.sh +29 -0
  213. package/templates/.github/hooks/pre-commit +8 -0
  214. package/templates/.opencode/commands/analyze-task.md +1 -1
  215. package/templates/.opencode/commands/analyze-task.zh-CN.md +1 -1
  216. package/templates/.opencode/commands/block-task.md +1 -1
  217. package/templates/.opencode/commands/block-task.zh-CN.md +1 -1
  218. package/templates/.opencode/commands/check-task.md +1 -1
  219. package/templates/.opencode/commands/check-task.zh-CN.md +1 -1
  220. package/templates/.opencode/commands/close-codescan.md +1 -1
  221. package/templates/.opencode/commands/close-codescan.zh-CN.md +1 -1
  222. package/templates/.opencode/commands/close-dependabot.md +1 -1
  223. package/templates/.opencode/commands/close-dependabot.zh-CN.md +1 -1
  224. package/templates/.opencode/commands/commit.md +1 -1
  225. package/templates/.opencode/commands/commit.zh-CN.md +1 -1
  226. package/templates/.opencode/commands/complete-task.md +1 -1
  227. package/templates/.opencode/commands/complete-task.zh-CN.md +1 -1
  228. package/templates/.opencode/commands/create-issue.zh-CN.md +1 -1
  229. package/templates/.opencode/commands/create-pr.md +1 -1
  230. package/templates/.opencode/commands/create-pr.zh-CN.md +1 -1
  231. package/templates/.opencode/commands/create-release-note.md +1 -1
  232. package/templates/.opencode/commands/create-release-note.zh-CN.md +1 -1
  233. package/templates/.opencode/commands/create-task.md +1 -1
  234. package/templates/.opencode/commands/create-task.zh-CN.md +1 -1
  235. package/templates/.opencode/commands/implement-task.md +1 -1
  236. package/templates/.opencode/commands/implement-task.zh-CN.md +1 -1
  237. package/templates/.opencode/commands/import-codescan.zh-CN.md +1 -1
  238. package/templates/.opencode/commands/import-dependabot.zh-CN.md +1 -1
  239. package/templates/.opencode/commands/import-issue.md +1 -1
  240. package/templates/.opencode/commands/import-issue.zh-CN.md +1 -1
  241. package/templates/.opencode/commands/init-labels.zh-CN.md +1 -1
  242. package/templates/.opencode/commands/init-milestones.md +1 -1
  243. package/templates/.opencode/commands/init-milestones.zh-CN.md +1 -1
  244. package/templates/.opencode/commands/plan-task.md +1 -1
  245. package/templates/.opencode/commands/plan-task.zh-CN.md +1 -1
  246. package/templates/.opencode/commands/refine-task.zh-CN.md +1 -1
  247. package/templates/.opencode/commands/refine-title.md +1 -1
  248. package/templates/.opencode/commands/refine-title.zh-CN.md +1 -1
  249. package/templates/.opencode/commands/release.md +1 -1
  250. package/templates/.opencode/commands/release.zh-CN.md +1 -1
  251. package/templates/.opencode/commands/review-task.md +1 -1
  252. package/templates/.opencode/commands/review-task.zh-CN.md +1 -1
  253. package/templates/.opencode/commands/sync-issue.md +1 -1
  254. package/templates/.opencode/commands/sync-issue.zh-CN.md +1 -1
  255. package/templates/.opencode/commands/sync-pr.md +2 -2
  256. package/templates/.opencode/commands/sync-pr.zh-CN.md +2 -2
  257. package/templates/.opencode/commands/test-integration.md +1 -1
  258. package/templates/.opencode/commands/test-integration.zh-CN.md +1 -1
  259. package/templates/.opencode/commands/test.md +1 -1
  260. package/templates/.opencode/commands/test.zh-CN.md +1 -1
  261. package/templates/.opencode/commands/update-agent-infra.md +1 -1
  262. package/templates/.opencode/commands/update-agent-infra.zh-CN.md +1 -1
  263. package/templates/.opencode/commands/upgrade-dependency.md +1 -1
  264. package/templates/.opencode/commands/upgrade-dependency.zh-CN.md +1 -1
  265. package/templates/.claude/CLAUDE.md +0 -176
  266. package/templates/.claude/CLAUDE.zh-CN.md +0 -176
  267. package/templates/.claude/project-rules.md +0 -65
  268. package/templates/.claude/project-rules.zh-CN.md +0 -65
  269. package/templates/.codex/README.md +0 -38
  270. package/templates/.codex/README.zh-CN.md +0 -37
  271. package/templates/.opencode/COMMAND_STYLE_GUIDE.md +0 -232
  272. package/templates/.opencode/COMMAND_STYLE_GUIDE.zh-CN.md +0 -232
  273. package/templates/.opencode/README.md +0 -76
  274. package/templates/.opencode/README.zh-CN.md +0 -77
  275. package/templates/AGENTS.md +0 -104
  276. package/templates/AGENTS.zh-CN.md +0 -104
@@ -0,0 +1,84 @@
1
+ # 评论发布规则
2
+
3
+ 在创建或更新 Issue 评论之前先读取本文件。
4
+
5
+ ## 拉取已有评论并构建已发布产物集合
6
+
7
+ 使用如下隐藏标记:
8
+
9
+ ```html
10
+ <!-- sync-issue:{task-id}:{file-stem} -->
11
+ ```
12
+
13
+ 产物提取规则:
14
+ - 用 `/→\s+(\S+\.md)\s*$/` 从 Activity Log 中提取产物文件名
15
+ - 去掉 `.md` 后缀得到 `{file-stem}`
16
+ - 按 Activity Log 顺序构建产物时间线
17
+ - 固定把 `summary` 追加到最后
18
+
19
+ 产物时间线必须按 Activity Log 顺序构建。只包含任务目录中仍然存在的产物文件。
20
+ 常见产物文件名包括 `implementation-r*.md` 和 `review-r*.md`。
21
+
22
+ 已发布集合检测:
23
+
24
+ ```bash
25
+ grep -qF "<!-- sync-issue:{task-id}:{file-stem} -->" "$comments_jsonl"
26
+ ```
27
+
28
+ 含义:
29
+ - 找到匹配 -> 该产物已经发布过
30
+ - 没有匹配 -> 该产物本轮可以创建
31
+
32
+ 在开始发布评论前,先定义 `has_unpublished_artifacts`:即时间线中是否还存在任何未发布的非 `summary` 产物。该标志在本轮同步过程中保持不变。
33
+
34
+ 推荐标题映射:
35
+
36
+ | file-stem | title |
37
+ |---|---|
38
+ | `analysis` | `需求分析` |
39
+ | `analysis-r{N}` | `需求分析(Round {N})` |
40
+ | `plan` | `技术方案` |
41
+ | `plan-r{N}` | `技术方案(Round {N})` |
42
+ | `implementation` | `实现报告(Round 1)` |
43
+ | `implementation-r{N}` | `实现报告(Round {N})` |
44
+ | `refinement` | `修复报告(Round 1)` |
45
+ | `refinement-r{N}` | `修复报告(Round {N})` |
46
+ | `review` | `审查报告(Round 1)` |
47
+ | `review-r{N}` | `审查报告(Round {N})` |
48
+ | `summary` | `交付摘要` |
49
+
50
+ ## 按时间线顺序逐个发布上下文产物
51
+
52
+ 始终把 `summary` 放在最后。不要把多个轮次折叠成一条评论。
53
+
54
+ 统一评论格式:
55
+
56
+ ```markdown
57
+ <!-- sync-issue:{task-id}:{file-stem} -->
58
+ ## {artifact-title}
59
+
60
+ {artifact original body or summary body}
61
+
62
+ ---
63
+ *由 AI 自动生成 · 内部追踪:{task-id}*
64
+ ```
65
+
66
+ `summary` 处理规则:
67
+ - 如果 `summary` 不存在,就创建它
68
+ - 如果 `summary` 已存在且 `has_unpublished_artifacts=true`,删除旧的 `summary`,并在最后重新创建
69
+ - 如果 `summary` 已存在、`has_unpublished_artifacts=false`,且内容发生变化,则原地 patch 该评论
70
+ - 如果 `summary` 已存在、`has_unpublished_artifacts=false`,且内容没有变化,则不做任何操作
71
+
72
+ 零操作规则:
73
+ - 如果所有产物都已同步,且 `summary` 内容未变化,则不要发布任何内容,并报告 `所有产物已同步,无新内容`
74
+
75
+ 更新已有 `summary` 评论时,使用:
76
+
77
+ ```bash
78
+ gh api "repos/$repo/issues/comments/{summary_comment_id}" -X PATCH -f body="$(cat <<'EOF'
79
+ {comment-body}
80
+ EOF
81
+ )"
82
+ ```
83
+
84
+ 不要回退到固定的 `analysis -> plan -> implementation -> review -> summary` 顺序。
@@ -0,0 +1,62 @@
1
+ # Label and Issue Type Sync
2
+
3
+ Read this file before editing `status:`, `in:`, or Issue Type metadata.
4
+
5
+ ## Sync Labels and Issue Type
6
+
7
+ Initialize labels when needed:
8
+
9
+ ```bash
10
+ gh label list --search "type:" --limit 1 --json name --jq 'length'
11
+ ```
12
+
13
+ If the result is `0`, run `init-labels` and retry this step.
14
+
15
+ Status label workflow:
16
+
17
+ ```bash
18
+ gh issue view {issue-number} --json labels --jq '.labels[].name | select(startswith("status:"))'
19
+ gh issue edit {issue-number} --remove-label "{status-label}"
20
+ gh issue edit {issue-number} --add-label "{status-label}"
21
+ ```
22
+
23
+ Status decision table:
24
+
25
+ | Condition | Action |
26
+ |---|---|
27
+ | Issue is closed (`state = CLOSED`) | add no new `status:` label |
28
+ | task lives under `completed/` | add no new `status:` label |
29
+ | task lives under `blocked/` | add `status: blocked` |
30
+ | `current_step` ∈ {`requirement-analysis`, `technical-design`} | add `status: pending-design-work` |
31
+ | `current_step` ∈ {`implementation`, `code-review`, `refinement`} | add `status: in-progress` |
32
+
33
+ `in:` label workflow:
34
+
35
+ ```bash
36
+ gh label list --search "in: {module}" --limit 10 --json name --jq '.[].name'
37
+ gh issue edit {issue-number} --add-label "in: {module}"
38
+ ```
39
+
40
+ `in:` label flow:
41
+ 1. extract changed file paths from implementation artifacts first; fall back to analysis artifacts only when implementation artifacts do not exist
42
+ 2. take the first path segment as `{module}`
43
+ 3. de-duplicate all inferred modules
44
+ 4. check whether each exact `in: {module}` label exists before adding it
45
+ 5. add matching labels only; never remove existing `in:` labels
46
+
47
+ Issue Type workflow:
48
+
49
+ ```bash
50
+ gh api "orgs/$owner/issue-types" --jq '.[].name'
51
+ gh api "repos/$repo/issues/{issue-number}" -X PATCH -f type="{name}"
52
+ ```
53
+
54
+ Issue Type mapping:
55
+
56
+ | task.md type | GitHub Issue Type |
57
+ |---|---|
58
+ | `bug`, `bugfix` | `Bug` |
59
+ | `feature`, `enhancement` | `Feature` |
60
+ | `task`, `documentation`, `dependency-upgrade`, `chore`, `docs`, `refactor`, `refactoring`, and all other values | `Task` |
61
+
62
+ If Issue Types are unavailable, record `Issue Type: skipped (not enabled)` and continue.
@@ -0,0 +1,62 @@
1
+ # Label 和 Issue 类型同步
2
+
3
+ 在编辑 `status:`、`in:` 或 Issue 类型元数据之前先读取本文件。
4
+
5
+ ## 同步 Label 和 Issue 类型
6
+
7
+ 必要时先初始化 label:
8
+
9
+ ```bash
10
+ gh label list --search "type:" --limit 1 --json name --jq 'length'
11
+ ```
12
+
13
+ 如果结果是 `0`,先执行 `init-labels`,然后重新执行本步骤。
14
+
15
+ `status:` label 工作流:
16
+
17
+ ```bash
18
+ gh issue view {issue-number} --json labels --jq '.labels[].name | select(startswith("status:"))'
19
+ gh issue edit {issue-number} --remove-label "{status-label}"
20
+ gh issue edit {issue-number} --add-label "{status-label}"
21
+ ```
22
+
23
+ `status:` 判断表:
24
+
25
+ | 条件 | 操作 |
26
+ |---|---|
27
+ | Issue 已关闭(`state = CLOSED`) | 不新增 `status:` label |
28
+ | 任务位于 `completed/` 目录下 | 不新增 `status:` label |
29
+ | 任务位于 `blocked/` 目录下 | 添加 `status: blocked` |
30
+ | `current_step` ∈ {`requirement-analysis`, `technical-design`} | 添加 `status: pending-design-work` |
31
+ | `current_step` ∈ {`implementation`, `code-review`, `refinement`} | 添加 `status: in-progress` |
32
+
33
+ `in:` label 工作流:
34
+
35
+ ```bash
36
+ gh label list --search "in: {module}" --limit 10 --json name --jq '.[].name'
37
+ gh issue edit {issue-number} --add-label "in: {module}"
38
+ ```
39
+
40
+ `in:` label 流程:
41
+ 1. 优先从实现产物中提取改动文件路径;只有在不存在实现产物时,才回退到分析产物
42
+ 2. 取路径的第一级目录作为 `{module}`
43
+ 3. 对推断出的所有模块去重
44
+ 4. 仅在对应的精确 `in: {module}` label 存在时才添加
45
+ 5. 只添加匹配的 label;绝不移除已有的 `in:` label
46
+
47
+ Issue 类型工作流:
48
+
49
+ ```bash
50
+ gh api "orgs/$owner/issue-types" --jq '.[].name'
51
+ gh api "repos/$repo/issues/{issue-number}" -X PATCH -f type="{name}"
52
+ ```
53
+
54
+ Issue 类型映射:
55
+
56
+ | task.md 类型 | GitHub Issue 类型 |
57
+ |---|---|
58
+ | `bug`, `bugfix` | `Bug` |
59
+ | `feature`, `enhancement` | `Feature` |
60
+ | `task`, `documentation`, `dependency-upgrade`, `chore`, `docs`, `refactor`, `refactoring` 以及其他所有值 | `Task` |
61
+
62
+ 如果 Issue 类型不可用,记录 `Issue Type: skipped (not enabled)`,然后继续执行。
@@ -0,0 +1,37 @@
1
+ # Milestone Sync
2
+
3
+ Read this file before selecting or editing the Issue milestone.
4
+
5
+ ## Sync the Milestone
6
+
7
+ Milestone priority:
8
+ 1. existing Issue milestone
9
+ 2. explicit `milestone` field in task.md
10
+ 3. inferred version line from the current branch
11
+ 4. `General Backlog`
12
+
13
+ Inference scenarios when `task.md` does not set `milestone` explicitly:
14
+ 1. detect the current branch with `git branch --show-current`
15
+ 2. Scenario A: if the current branch matches `{major}.{minor}.x`, use that exact line milestone
16
+ 3. Scenario B: if the current branch is `main` or `master`, inspect existing `{major}.{minor}.x` branches
17
+ 4. Scenario B result: when a highest existing line `X.Y.x` exists, target `(X+1).0.x`
18
+ 5. Scenario C: if no branch rule yields a version line, inspect the latest `vX.Y.Z` tag and fall back to `X.Y.x`
19
+ 6. Scenario C fallback: if no branch or tag rule yields a version line, fall back to `General Backlog`
20
+
21
+ Fallback and assignment logic:
22
+ 1. preserve an existing Issue milestone when one is already set
23
+ 2. otherwise prefer an explicit `milestone` field from `task.md`
24
+ 3. otherwise apply the branch/tag scenario inference above
25
+ 4. if the inferred target milestone does not exist, downgrade to `General Backlog`
26
+ 5. if `General Backlog` also does not exist, record `Milestone: skipped (not found)` and stop milestone sync
27
+ 6. once a milestone title is resolved, assign it and record either `{target} (assigned)` or `General Backlog (fallback)`
28
+
29
+ Useful commands:
30
+
31
+ ```bash
32
+ gh issue view {issue-number} --json milestone
33
+ git branch --show-current
34
+ git branch -a | grep -oE '[0-9]+\.[0-9]+\.x'
35
+ git tag --list 'v*' --sort=-v:refname | head -1
36
+ gh issue edit {issue-number} --milestone "{milestone-title}"
37
+ ```
@@ -0,0 +1,37 @@
1
+ # 里程碑同步
2
+
3
+ 在选择或编辑 Issue 里程碑之前先读取本文件。
4
+
5
+ ## 同步里程碑
6
+
7
+ 里程碑优先级:
8
+ 1. Issue 当前已有的里程碑
9
+ 2. task.md 中显式设置的 `milestone` 字段
10
+ 3. 从当前分支推断出的版本线里程碑
11
+ 4. `General Backlog`
12
+
13
+ 当 task.md 没有显式设置 `milestone` 时,按以下场景推断:
14
+ 1. 用 `git branch --show-current` 检测当前分支
15
+ 2. 场景 A:如果当前分支匹配 `{major}.{minor}.x`,直接使用该版本线里程碑
16
+ 3. 场景 B:如果当前分支是 `main` 或 `master`,检查现有的 `{major}.{minor}.x` 分支
17
+ 4. 场景 B 结果:当存在最高版本线 `X.Y.x` 时,目标使用 `(X+1).0.x`
18
+ 5. 场景 C:如果分支规则无法得出版本线,则检查最新的 `vX.Y.Z` tag,并回退到 `X.Y.x`
19
+ 6. 场景 C 回退:如果分支和 tag 规则都无法得出版本线,则回退到 `General Backlog`
20
+
21
+ 回退与赋值逻辑:
22
+ 1. 如果 Issue 已经有里程碑,优先保留
23
+ 2. 否则优先使用 task.md 中显式设置的 `milestone`
24
+ 3. 否则应用上面的分支 / tag 场景推断规则
25
+ 4. 如果推断出的目标里程碑不存在,则降级为 `General Backlog`
26
+ 5. 如果 `General Backlog` 也不存在,则记录 `Milestone: skipped (not found)`,并停止 milestone 同步
27
+ 6. 一旦解析出里程碑标题,就执行赋值,并记录 `{target} (assigned)` 或 `General Backlog (fallback)`
28
+
29
+ 常用命令:
30
+
31
+ ```bash
32
+ gh issue view {issue-number} --json milestone
33
+ git branch --show-current
34
+ git branch -a | grep -oE '[0-9]+\.[0-9]+\.x'
35
+ git tag --list 'v*' --sort=-v:refname | head -1
36
+ gh issue edit {issue-number} --milestone "{milestone-title}"
37
+ ```
@@ -1,296 +1,63 @@
1
1
  ---
2
2
  name: sync-pr
3
- description: >
4
- Sync task progress to the related Pull Request, including PR metadata sync and a single idempotent review summary.
5
- Triggered when the user asks to sync progress to PR. Argument: task-id.
3
+ description: "Sync task progress to a Pull Request"
6
4
  ---
7
5
 
8
6
  # Sync Progress to PR
9
7
 
10
- Sync task progress to the related Pull Request. Argument: task-id.
8
+ Sync PR metadata and keep one reviewer-facing summary comment up to date.
11
9
 
12
10
  ## Execution Flow
13
11
 
14
- ### 1. Verify the Task Exists
12
+ ### 1. Parse the Argument
15
13
 
16
- Search for the task in this order:
17
- - `.agents/workspace/active/{task-id}/task.md`
18
- - `.agents/workspace/completed/{task-id}/task.md`
19
- - `.agents/workspace/blocked/{task-id}/task.md`
20
-
21
- Note: `{task-id}` format is `TASK-{yyyyMMdd-HHmmss}`, for example `TASK-20260306-143022`
22
-
23
- ### 2. Read Task Information
24
-
25
- Extract from task.md:
26
- - `pr_number` (required; if missing, prompt the user)
27
- - `type`
28
- - `issue_number` (if applicable)
29
- - `current_step`
30
- - task title, description, status
31
- - `created_at`, `updated_at`, `last_synced_to_pr_at` (if present)
32
-
33
- ### 3. Read Context Files
34
-
35
- Check and read these files if they exist:
36
- - highest-round `plan.md` / `plan-r{N}.md` - technical plan
37
- - `implementation.md`, `implementation-r{N}.md` - implementation reports
38
- - `review.md`, `review-r{N}.md` - review reports
39
- - `refinement.md`, `refinement-r{N}.md` - refinement reports
40
- - highest-round `analysis.md` / `analysis-r{N}.md` - analysis input only as fallback for `in:` labels
41
-
42
- ### 4. Resolve Repository Coordinates and Check Whether the Label System Has Been Initialized
43
-
44
- Resolve repository coordinates first so later milestone queries and comment sync steps can reuse them:
45
-
46
- ```bash
47
- repo="$(gh repo view --json nameWithOwner --jq '.nameWithOwner')"
48
- owner="${repo%%/*}"
49
- ```
50
-
51
- Run:
52
-
53
- ```bash
54
- gh label list --search "type:" --limit 1 --json name --jq 'length'
55
- ```
56
-
57
- Rules:
58
- - returns `0` -> standard labels are missing; run the `init-labels` skill first, then retry this step
59
- - returns non-zero -> continue with PR metadata sync
60
-
61
- ### 5. Sync the Type Label
62
-
63
- Map task.md `type` using this table:
64
-
65
- | task.md type | GitHub label |
66
- |---|---|
67
- | bug, bugfix | `type: bug` |
68
- | feature | `type: feature` |
69
- | enhancement | `type: enhancement` |
70
- | refactor, refactoring | `type: enhancement` |
71
- | documentation | `type: documentation` |
72
- | dependency-upgrade | `type: dependency-upgrade` |
73
- | task | `type: task` |
74
- | anything else | skip |
75
-
76
- If the value maps to a label, run:
77
-
78
- ```bash
79
- gh pr edit {pr-number} --add-label "{type-label}"
80
- ```
81
-
82
- Do not create new type labels.
83
-
84
- ### 6. Sync `in:` Labels
85
-
86
- Extract affected modules from implementation reports first, or analysis as fallback:
87
- - prefer file paths listed under `## Modified Files`, especially `### New Files` / `### Modified Files`, in `implementation.md` and `implementation-r{N}.md`
88
- - if implementation reports do not exist yet, fall back to affected files from analysis
89
-
90
- For each file path:
91
- 1. take the first-level directory as `{module}`
92
- 2. deduplicate
93
- 3. verify that the label exists:
94
-
95
- ```bash
96
- gh label list --search "in: {module}" --limit 10 --json name --jq '.[].name'
97
- ```
98
-
99
- 4. only when the exact `in: {module}` label exists, run:
100
-
101
- ```bash
102
- gh pr edit {pr-number} --add-label "in: {module}"
103
- ```
104
-
105
- 5. only add labels; do not remove existing `in:` labels
106
-
107
- ### 7. Sync the Milestone
108
-
109
- Assign a line milestone to the PR using the same inference strategy as `sync-issue`.
110
-
111
- **a) Check whether the PR already has a milestone**
112
-
113
- Run:
114
-
115
- ```bash
116
- gh pr view {pr-number} --json milestone --jq '.milestone.title // empty'
117
- ```
118
-
119
- If the result is non-empty, preserve it and record `Milestone: {existing} (preserved)`.
120
-
121
- **b) Check whether task.md explicitly sets `milestone`**
122
-
123
- If frontmatter contains a non-empty `milestone`, use it as the target milestone.
124
-
125
- **c) Infer the target line milestone**
126
-
127
- When task.md does not explicitly set `milestone`, infer in this order:
128
-
129
- 1. Detect the current branch:
130
-
131
- ```bash
132
- git branch --show-current
133
- ```
134
-
135
- - if the branch name matches `{major}.{minor}.x`, use `{major}.{minor}.x`
136
-
137
- 2. If the current branch is `main` or `master`, detect existing release branches:
14
+ Accept either `task-id` or PR number. For PR-number input, resolve the task with:
138
15
 
139
16
  ```bash
140
- git branch -a | grep -oE '[0-9]+\.[0-9]+\.x' | sort -V | tail -1
17
+ grep -rl "^pr_number: {pr-number}$" \
18
+ .agents/workspace/active/ \
19
+ .agents/workspace/blocked/ \
20
+ .agents/workspace/completed/ \
21
+ 2>/dev/null | head -1
141
22
  ```
142
23
 
143
- - if the highest release branch is `X.Y.x`, target `(X+1).0.x`
144
- - otherwise inspect the latest tag:
24
+ If no task matches, output `No task found associated with PR #{pr-number}`.
145
25
 
146
- ```bash
147
- git tag --list 'v*' --sort=-v:refname | head -1
148
- ```
149
-
150
- - when the latest tag parses as `X.Y.Z`, target `X.Y.x`
151
-
152
- 3. If none of the above yields a result, fall back to `General Backlog`
153
-
154
- **d) Find and set the milestone**
155
-
156
- Run:
157
-
158
- ```bash
159
- gh api "repos/$repo/milestones" --paginate \
160
- --jq '.[] | select(.title=="{target}") | .title' | head -1
161
- ```
162
-
163
- - if the target does not exist, fall back to `General Backlog`
164
- - if `General Backlog` also does not exist, record `Milestone: skipped (not found)`
165
- - once a milestone title is found, run:
166
-
167
- ```bash
168
- gh pr edit {pr-number} --milestone "{milestone-title}"
169
- ```
170
-
171
- ### 8. Sync Development Linking
172
-
173
- If task.md contains `issue_number`, ensure the PR body links the Issue.
174
-
175
- 1. Read the PR body:
176
-
177
- ```bash
178
- gh pr view {pr-number} --json body --jq '.body // ""'
179
- ```
180
-
181
- 2. Check whether the body already contains any of:
182
- - `Closes #{issue-number}`
183
- - `Fixes #{issue-number}`
184
- - `Resolves #{issue-number}`
185
-
186
- 3. If any keyword already exists, skip the update
187
- 4. Otherwise append this to the end of the body:
188
-
189
- ```bash
190
- gh pr edit {pr-number} --body "$(cat <<'EOF'
191
- {existing-body}
192
-
193
- Closes #{issue-number}
194
- EOF
195
- )"
196
- ```
197
-
198
- 5. If task.md does not contain `issue_number`, record `Development: N/A`
26
+ ### 2. Verify the Task Exists
199
27
 
200
- ### 9. Create or Update the Single Idempotent Review Summary
28
+ Search active, blocked, and completed task directories and lock onto the matching task folder before continuing.
201
29
 
202
- Reuse the repository coordinates resolved in step 4, then fetch existing PR comments:
30
+ ### 3. Read Task Information
203
31
 
204
- ```bash
205
- pr_comments_jsonl="$(mktemp)"
206
-
207
- gh api "repos/$repo/issues/{pr-number}/comments" \
208
- --paginate \
209
- --jq '.[] | {id, body}' > "$pr_comments_jsonl"
210
- ```
211
-
212
- Use this hidden marker to identify the unique summary comment:
213
-
214
- ```html
215
- <!-- sync-pr:{task-id}:summary -->
216
- ```
217
-
218
- Extract the existing summary comment id:
219
-
220
- ```bash
221
- summary_comment_id="$(
222
- jq -r 'select(.body | contains("<!-- sync-pr:{task-id}:summary -->")) | .id' \
223
- "$pr_comments_jsonl" | head -1
224
- )"
225
- ```
226
-
227
- Summary requirements:
228
- - target reviewers instead of restating the full PR diff
229
- - extract 2-4 key technical decisions from `## Decision`, `## Technical Approach`, and `## Implementation Steps` in `plan.md`
230
- - each key technical decision must be self-contained; do not reference internal document labels or jargon such as `Option A/B`
231
- - build a review-history table from `review.md`, `review-r{N}.md`, `refinement.md`, and `refinement-r{N}.md`
232
- - extract test results from `implementation.md` or `refinement.md`
233
-
234
- Recommended review-history columns:
235
- - `Round`
236
- - `Verdict`
237
- - `Issue Counts`, for example `B:1 M:2 m:0`
238
- - `Fix Status`
239
-
240
- If no review artifacts exist yet, use a placeholder row such as `Round 1 | Pending | N/A | N/A`.
32
+ Extract `pr_number`, `issue_number`, task title, type, and the latest timestamps from task.md.
241
33
 
242
- Candidate comment format:
34
+ ### 4. Read Context Files
243
35
 
244
- ```markdown
245
- <!-- sync-pr:{task-id}:summary -->
246
- ## Review Summary
36
+ Read the latest plan, implementation, review, and refinement artifacts that will inform PR metadata and the reviewer summary.
247
37
 
248
- **Task**: {task-id}
249
- **Updated At**: {current-time}
38
+ ### 5. Resolve Repository Coordinates and Label Readiness
250
39
 
251
- ### Key Technical Decisions
40
+ Resolve `repo="$(gh repo view --json nameWithOwner --jq '.nameWithOwner')"` and verify whether `type:` labels have been initialized.
252
41
 
253
- - {decision-1}
254
- - {decision-2}
42
+ ### 6. Sync Metadata
255
43
 
256
- ### Review History
44
+ Sync the mapped type label, relevant `in:` labels, and milestone onto the PR.
257
45
 
258
- | Round | Verdict | Issue Counts | Fix Status |
259
- |-------|---------|--------------|------------|
260
- | Round 1 | Pending | N/A | N/A |
46
+ > PR-state safeguards, milestone inference, and metadata skip rules for closed or merged PRs live in `reference/delivery-detection.md`. Read `reference/delivery-detection.md` before editing PR metadata.
261
47
 
262
- ### Test Results
48
+ ### 7. Sync Development Linking
263
49
 
264
- - {test-summary}
50
+ If `issue_number` exists, ensure the PR body contains `Closes #{issue-number}` or an equivalent closing keyword.
265
51
 
266
- ---
267
- *Generated by AI · Internal Tracking: {task-id}*
268
- ```
52
+ ### 8. Publish the Reviewer Summary
269
53
 
270
- Idempotency rules:
271
- - if `summary_comment_id` is empty -> create a new comment
272
- - if `summary_comment_id` exists and content changed -> update the existing comment
273
- - if `summary_comment_id` exists and content did not change -> skip
54
+ > Hidden markers, idempotent summary comment updates, review-history formatting, and comment create/update rules live in `reference/comment-publish.md`. Read `reference/comment-publish.md` before publishing the summary.
274
55
 
275
- To create a new comment, run:
56
+ > **Shell Safety Rules** (read before publishing comments):
57
+ > 1. `{comment-body}` must be replaced with **actual inline text**. Read the file with the Read tool first, then paste the full content into the heredoc body. **Do NOT** use `$(cat ...)`, `$(< ...)`, `$(...)`, or `${...}` inside `<<'EOF'`. Quoted heredocs suppress all command substitution and variable expansion, so those expressions will be output as literal text.
58
+ > 2. When constructing strings that contain `<!-- -->`, **do NOT use `echo`**. In bash/zsh, `echo` escapes `!` as `\!`, which makes hidden markers visible. Build all comment content with `cat <<'EOF'` heredocs or `printf '%s\n'`.
276
59
 
277
- ```bash
278
- gh api "repos/$repo/issues/{pr-number}/comments" -X POST -f body="$(cat <<'EOF'
279
- {comment-body}
280
- EOF
281
- )"
282
- ```
283
-
284
- To update the existing comment, run:
285
-
286
- ```bash
287
- gh api "repos/$repo/issues/comments/{comment-id}" -X PATCH -f body="$(cat <<'EOF'
288
- {comment-body}
289
- EOF
290
- )"
291
- ```
292
-
293
- ### 10. Update Task Status
60
+ ### 9. Update Task Status
294
61
 
295
62
  Get the current time:
296
63
 
@@ -298,37 +65,23 @@ Get the current time:
298
65
  date "+%Y-%m-%d %H:%M:%S"
299
66
  ```
300
67
 
301
- Add or update `last_synced_to_pr_at` in task.md with `{current-time}`.
302
- - **Append** to `## Activity Log` (do NOT overwrite previous entries):
303
- ```
304
- - {yyyy-MM-dd HH:mm:ss} — **Sync to PR** by {agent} — PR metadata synced, summary {created|updated|skipped} on PR #{pr-number}
305
- ```
306
-
307
- ### 11. Inform the User
68
+ Update `last_synced_to_pr_at` and append the Sync to PR Activity Log entry.
308
69
 
309
- ```
310
- Progress synced to PR #{pr-number}.
311
-
312
- Synchronized:
313
- - Labels: {type-label-result}, {in-label-result}
314
- - Milestone: {milestone-result}
315
- - Development: {development-result}
316
- - Summary: {created|updated|skipped}
70
+ ### 10. Inform the User
317
71
 
318
- View: https://github.com/{owner}/{repo}/pull/{pr-number}
319
- ```
72
+ Report the synchronized labels, milestone, development status, summary result, and PR URL.
320
73
 
321
74
  ## Notes
322
75
 
323
- 1. `sync-pr` is reviewer-facing. Keep one summary comment only, rather than publishing every artifact round to the PR.
324
- 2. PR metadata sync must be safe to repeat. Re-runs should fill gaps without creating noise.
325
- 3. Because Pull Requests share the Issue comments API, create the summary comment through `issues/{pr-number}/comments`.
326
- 4. If `issue_number` is missing, record `Development: N/A` instead of failing the whole flow.
76
+ - The hidden summary marker must stay `<!-- sync-pr:{task-id}:summary -->`
77
+ - Keep exactly one summary comment for reviewers
78
+ - If the PR is already closed or merged, report `PR #{number} is closed/merged, metadata sync skipped`
79
+ - Follow the Step 8 shell safety rules when publishing comments: do not rely on command substitution inside quoted heredocs, and do not use `echo` for HTML comment markers
327
80
 
328
81
  ## Error Handling
329
82
 
83
+ - No task found for the PR: `No task found associated with PR #{pr-number}`
330
84
  - Task not found: `Task {task-id} not found`
331
85
  - Missing PR number: `Task has no pr_number field`
332
86
  - PR not found: `PR #{number} not found`
333
- - PR is closed or merged: `PR #{number} is closed/merged, metadata sync skipped`
334
87
  - GitHub CLI auth failed: `Please check GitHub CLI authentication`