@fitlab-ai/agent-infra 0.7.0 → 0.7.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 (156) hide show
  1. package/bin/cli.ts +12 -1
  2. package/dist/bin/cli.js +13 -1
  3. package/dist/lib/builtin-tuis.js +45 -0
  4. package/dist/lib/defaults.json +3 -0
  5. package/dist/lib/init.js +62 -23
  6. package/dist/lib/prompt.js +49 -1
  7. package/dist/lib/sandbox/commands/create.js +10 -2
  8. package/dist/lib/sandbox/commands/enter.js +8 -7
  9. package/dist/lib/sandbox/commands/list-running.js +62 -28
  10. package/dist/lib/sandbox/commands/ls.js +20 -22
  11. package/dist/lib/sandbox/commands/rebuild.js +3 -11
  12. package/dist/lib/sandbox/commands/rm.js +2 -0
  13. package/dist/lib/sandbox/image-prune.js +18 -0
  14. package/dist/lib/sandbox/index.js +7 -3
  15. package/dist/lib/sandbox/task-resolver.js +18 -0
  16. package/dist/lib/sandbox/tools.js +1 -1
  17. package/dist/lib/table.js +29 -0
  18. package/dist/lib/task/commands/ls.js +122 -0
  19. package/dist/lib/task/commands/show.js +135 -0
  20. package/dist/lib/task/frontmatter.js +32 -0
  21. package/dist/lib/task/index.js +41 -0
  22. package/dist/lib/task/short-id.js +80 -0
  23. package/dist/lib/update.js +59 -18
  24. package/lib/builtin-tuis.ts +55 -0
  25. package/lib/defaults.json +3 -0
  26. package/lib/init.ts +87 -35
  27. package/lib/prompt.ts +54 -1
  28. package/lib/sandbox/commands/create.ts +11 -2
  29. package/lib/sandbox/commands/enter.ts +8 -7
  30. package/lib/sandbox/commands/list-running.ts +70 -31
  31. package/lib/sandbox/commands/ls.ts +25 -25
  32. package/lib/sandbox/commands/rebuild.ts +3 -12
  33. package/lib/sandbox/commands/rm.ts +3 -0
  34. package/lib/sandbox/image-prune.ts +23 -0
  35. package/lib/sandbox/index.ts +7 -3
  36. package/lib/sandbox/task-resolver.ts +23 -1
  37. package/lib/sandbox/tools.ts +1 -1
  38. package/lib/table.ts +32 -0
  39. package/lib/task/commands/ls.ts +138 -0
  40. package/lib/task/commands/show.ts +139 -0
  41. package/lib/task/frontmatter.ts +30 -0
  42. package/lib/task/index.ts +44 -0
  43. package/lib/task/short-id.ts +97 -0
  44. package/lib/update.ts +71 -30
  45. package/package.json +1 -1
  46. package/templates/.agents/README.en.md +32 -0
  47. package/templates/.agents/README.zh-CN.md +32 -0
  48. package/templates/.agents/hooks/auto-resume.sh +87 -0
  49. package/templates/.agents/rules/create-issue.github.en.md +1 -1
  50. package/templates/.agents/rules/create-issue.github.zh-CN.md +1 -1
  51. package/templates/.agents/rules/milestone-inference.github.en.md +4 -1
  52. package/templates/.agents/rules/milestone-inference.github.zh-CN.md +4 -1
  53. package/templates/.agents/rules/next-step-output.en.md +59 -0
  54. package/templates/.agents/rules/next-step-output.zh-CN.md +59 -0
  55. package/templates/.agents/rules/task-short-id.en.md +133 -0
  56. package/templates/.agents/rules/task-short-id.zh-CN.md +105 -0
  57. package/templates/.agents/scripts/platform-adapters/platform-sync.github.js +17 -0
  58. package/templates/.agents/scripts/task-short-id.js +556 -0
  59. package/templates/.agents/skills/analyze-task/SKILL.en.md +13 -11
  60. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +13 -12
  61. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -1
  62. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -1
  63. package/templates/.agents/skills/block-task/SKILL.en.md +17 -5
  64. package/templates/.agents/skills/block-task/SKILL.zh-CN.md +17 -6
  65. package/templates/.agents/skills/block-task/config/verify.json +1 -1
  66. package/templates/.agents/skills/cancel-task/SKILL.en.md +17 -5
  67. package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +17 -6
  68. package/templates/.agents/skills/cancel-task/config/verify.json +1 -1
  69. package/templates/.agents/skills/check-task/SKILL.en.md +15 -9
  70. package/templates/.agents/skills/check-task/SKILL.zh-CN.md +15 -10
  71. package/templates/.agents/skills/close-codescan/SKILL.en.md +16 -5
  72. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +16 -5
  73. package/templates/.agents/skills/close-dependabot/SKILL.en.md +16 -5
  74. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +16 -5
  75. package/templates/.agents/skills/code-task/SKILL.en.md +13 -5
  76. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +14 -6
  77. package/templates/.agents/skills/code-task/config/verify.en.json +2 -1
  78. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +2 -1
  79. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +10 -5
  80. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +10 -5
  81. package/templates/.agents/skills/code-task/reference/output-template.en.md +3 -3
  82. package/templates/.agents/skills/code-task/reference/output-template.zh-CN.md +3 -3
  83. package/templates/.agents/skills/code-task/reference/report-template.en.md +8 -0
  84. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +8 -0
  85. package/templates/.agents/skills/commit/SKILL.en.md +5 -1
  86. package/templates/.agents/skills/commit/SKILL.zh-CN.md +5 -1
  87. package/templates/.agents/skills/commit/reference/task-status-update.en.md +9 -9
  88. package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +9 -9
  89. package/templates/.agents/skills/complete-task/SKILL.en.md +17 -1
  90. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +17 -2
  91. package/templates/.agents/skills/complete-task/config/verify.en.json +1 -1
  92. package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +1 -1
  93. package/templates/.agents/skills/create-pr/SKILL.en.md +9 -5
  94. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +9 -5
  95. package/templates/.agents/skills/create-pr/config/verify.json +2 -1
  96. package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +1 -1
  97. package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +1 -1
  98. package/templates/.agents/skills/create-pr/reference/pr-body-template.en.md +3 -3
  99. package/templates/.agents/skills/create-pr/reference/pr-body-template.zh-CN.md +3 -3
  100. package/templates/.agents/skills/create-task/SKILL.en.md +29 -15
  101. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +29 -16
  102. package/templates/.agents/skills/create-task/config/verify.json +1 -1
  103. package/templates/.agents/skills/import-codescan/SKILL.en.md +20 -6
  104. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +20 -6
  105. package/templates/.agents/skills/import-codescan/config/verify.json +1 -1
  106. package/templates/.agents/skills/import-dependabot/SKILL.en.md +20 -6
  107. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +20 -6
  108. package/templates/.agents/skills/import-dependabot/config/verify.json +1 -1
  109. package/templates/.agents/skills/import-issue/SKILL.en.md +19 -5
  110. package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +19 -5
  111. package/templates/.agents/skills/plan-task/SKILL.en.md +13 -11
  112. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +13 -12
  113. package/templates/.agents/skills/plan-task/config/verify.en.json +1 -1
  114. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +1 -1
  115. package/templates/.agents/skills/restore-task/SKILL.en.md +12 -0
  116. package/templates/.agents/skills/restore-task/SKILL.zh-CN.md +12 -1
  117. package/templates/.agents/skills/review-analysis/SKILL.en.md +7 -1
  118. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +7 -2
  119. package/templates/.agents/skills/review-analysis/config/verify.en.json +3 -2
  120. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +3 -2
  121. package/templates/.agents/skills/review-analysis/reference/output-templates.en.md +15 -15
  122. package/templates/.agents/skills/review-analysis/reference/output-templates.zh-CN.md +15 -15
  123. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +7 -1
  124. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +7 -1
  125. package/templates/.agents/skills/review-analysis/reference/review-criteria.en.md +2 -0
  126. package/templates/.agents/skills/review-analysis/reference/review-criteria.zh-CN.md +2 -0
  127. package/templates/.agents/skills/review-code/SKILL.en.md +8 -1
  128. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +8 -2
  129. package/templates/.agents/skills/review-code/config/verify.en.json +3 -2
  130. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +3 -2
  131. package/templates/.agents/skills/review-code/reference/output-templates.en.md +9 -9
  132. package/templates/.agents/skills/review-code/reference/output-templates.zh-CN.md +9 -9
  133. package/templates/.agents/skills/review-code/reference/report-template.en.md +7 -1
  134. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +7 -1
  135. package/templates/.agents/skills/review-code/reference/review-criteria.en.md +2 -0
  136. package/templates/.agents/skills/review-code/reference/review-criteria.zh-CN.md +2 -0
  137. package/templates/.agents/skills/review-plan/SKILL.en.md +7 -1
  138. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +7 -2
  139. package/templates/.agents/skills/review-plan/config/verify.en.json +3 -2
  140. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +3 -2
  141. package/templates/.agents/skills/review-plan/reference/output-templates.en.md +15 -15
  142. package/templates/.agents/skills/review-plan/reference/output-templates.zh-CN.md +15 -15
  143. package/templates/.agents/skills/review-plan/reference/report-template.en.md +7 -1
  144. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +7 -1
  145. package/templates/.agents/skills/review-plan/reference/review-criteria.en.md +2 -0
  146. package/templates/.agents/skills/review-plan/reference/review-criteria.zh-CN.md +2 -0
  147. package/templates/.agents/skills/update-agent-infra/SKILL.en.md +1 -0
  148. package/templates/.agents/skills/update-agent-infra/SKILL.zh-CN.md +1 -0
  149. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +112 -21
  150. package/templates/.agents/workflows/bug-fix.en.yaml +1 -1
  151. package/templates/.agents/workflows/bug-fix.zh-CN.yaml +1 -1
  152. package/templates/.agents/workflows/feature-development.en.yaml +1 -1
  153. package/templates/.agents/workflows/feature-development.zh-CN.yaml +1 -1
  154. package/templates/.agents/workflows/refactoring.en.yaml +1 -1
  155. package/templates/.agents/workflows/refactoring.zh-CN.yaml +1 -1
  156. package/templates/.claude/settings.json +11 -0
@@ -42,6 +42,9 @@ const DEFAULTS = {
42
42
  "disk": null
43
43
  }
44
44
  },
45
+ "task": {
46
+ "shortIdLength": 2
47
+ },
45
48
  "labels": {
46
49
  "in": {}
47
50
  },
@@ -88,6 +91,39 @@ const PACKAGE_NAME = '@fitlab-ai/agent-infra';
88
91
  const KNOWN_PLATFORMS = new Set(['github']);
89
92
  const KNOWN_LANGUAGES = new Set(['en', 'zh-CN']);
90
93
 
94
+ // Single source of truth for built-in TUI ids and owned path prefixes.
95
+ // Keep in sync with lib/builtin-tuis.ts (enforced by tests/unit/scripts/sync-templates-consts.test.ts).
96
+ const BUILTIN_TUI_IDS = ['claude-code', 'codex', 'gemini-cli', 'opencode'];
97
+ const BUILTIN_TUI_OWNED_PATH_PREFIXES = {
98
+ 'claude-code': ['.claude/'],
99
+ 'codex': ['.codex/'],
100
+ 'gemini-cli': ['.gemini/'],
101
+ 'opencode': ['.opencode/']
102
+ };
103
+
104
+ function resolveEnabledTUIs(value) {
105
+ // Missing field / null / non-array → full set (backward compat).
106
+ if (!Array.isArray(value)) return new Set(BUILTIN_TUI_IDS);
107
+ // Empty array is a meaningful user choice: no built-in TUI managed.
108
+ const set = new Set();
109
+ for (const v of value) {
110
+ if (typeof v === 'string' && BUILTIN_TUI_IDS.includes(v)) set.add(v);
111
+ }
112
+ return set;
113
+ }
114
+
115
+ function isPathOwnedByDisabledTUI(rel, enabledSet) {
116
+ const normalized = String(rel || '').replace(/\\/g, '/').replace(/^\.\//, '');
117
+ for (const tui of BUILTIN_TUI_IDS) {
118
+ if (enabledSet.has(tui)) continue;
119
+ for (const prefix of BUILTIN_TUI_OWNED_PATH_PREFIXES[tui]) {
120
+ const trimmed = prefix.replace(/\/$/, '');
121
+ if (normalized === trimmed || normalized.startsWith(prefix)) return true;
122
+ }
123
+ }
124
+ return false;
125
+ }
126
+
91
127
  function norm(p) { return p.replace(/\\/g, '/'); }
92
128
 
93
129
  function normDir(p) {
@@ -654,26 +690,32 @@ function learnAndGenerateCommands(projectRoot, customSkills, tool, templateSkill
654
690
  }
655
691
  }
656
692
 
657
- function generateCustomCommands(projectRoot, customSkills, project, lang, report, customTUIs, templateSkillNames) {
693
+ function generateCustomCommands(projectRoot, customSkills, project, lang, report, customTUIs, templateSkillNames, enabledTUIs) {
658
694
  for (const skill of customSkills) {
659
- writeIfChanged(
660
- projectRoot,
661
- `.claude/commands/${skill.dirName}.md`,
662
- generateClaudeCommand(skill, lang),
663
- report.custom.commands
664
- );
665
- writeIfChanged(
666
- projectRoot,
667
- '.gemini/commands/' + project + '/' + skill.dirName + '.toml',
668
- generateGeminiCommand(skill, lang),
669
- report.custom.commands
670
- );
671
- writeIfChanged(
672
- projectRoot,
673
- `.opencode/commands/${skill.dirName}.md`,
674
- generateOpenCodeCommand(skill, lang),
675
- report.custom.commands
676
- );
695
+ if (enabledTUIs.has('claude-code')) {
696
+ writeIfChanged(
697
+ projectRoot,
698
+ `.claude/commands/${skill.dirName}.md`,
699
+ generateClaudeCommand(skill, lang),
700
+ report.custom.commands
701
+ );
702
+ }
703
+ if (enabledTUIs.has('gemini-cli')) {
704
+ writeIfChanged(
705
+ projectRoot,
706
+ '.gemini/commands/' + project + '/' + skill.dirName + '.toml',
707
+ generateGeminiCommand(skill, lang),
708
+ report.custom.commands
709
+ );
710
+ }
711
+ if (enabledTUIs.has('opencode')) {
712
+ writeIfChanged(
713
+ projectRoot,
714
+ `.opencode/commands/${skill.dirName}.md`,
715
+ generateOpenCodeCommand(skill, lang),
716
+ report.custom.commands
717
+ );
718
+ }
677
719
  }
678
720
 
679
721
  const tools = Array.isArray(customTUIs) ? customTUIs : [];
@@ -969,6 +1011,7 @@ function syncTemplates(projectRoot, templateRootOverride) {
969
1011
 
970
1012
  const { project, org, language: lang = 'en' } = cfg;
971
1013
  const platformType = cfg.platform?.type || DEFAULTS.platform.type;
1014
+ const enabledTUIs = resolveEnabledTUIs(cfg.tuis);
972
1015
  const customTUIsConfig = Array.isArray(cfg.customTUIs) ? cfg.customTUIs : [];
973
1016
  const vars = { project, org };
974
1017
  const templateSkillNames = listTemplateSkillNames(templateRoot);
@@ -989,7 +1032,7 @@ function syncTemplates(projectRoot, templateRootOverride) {
989
1032
  errors: [],
990
1033
  conflicts: []
991
1034
  },
992
- managed: { written: [], created: [], unchanged: [], skippedMerged: [], skippedPlatform: [], removed: [] },
1035
+ managed: { written: [], created: [], unchanged: [], skippedMerged: [], skippedPlatform: [], skippedTUI: [], removed: [] },
993
1036
  custom: {
994
1037
  detected: [],
995
1038
  generated: [],
@@ -1016,10 +1059,12 @@ function syncTemplates(projectRoot, templateRootOverride) {
1016
1059
  const known = new Set([...managed, ...merged, ...ejected]);
1017
1060
  for (const e of (DEFAULTS.files.managed || [])) {
1018
1061
  if (isPathOwnedByOtherPlatform(e, platformType)) continue;
1062
+ if (isPathOwnedByDisabledTUI(e, enabledTUIs)) continue;
1019
1063
  if (!known.has(e)) { managed.push(e); known.add(e); report.registryAdded.push({ entry: e, list: 'managed' }); }
1020
1064
  }
1021
1065
  for (const e of (DEFAULTS.files.merged || [])) {
1022
1066
  if (isPathOwnedByOtherPlatform(e, platformType)) continue;
1067
+ if (isPathOwnedByDisabledTUI(e, enabledTUIs)) continue;
1023
1068
  if (!known.has(e)) { merged.push(e); known.add(e); report.registryAdded.push({ entry: e, list: 'merged' }); }
1024
1069
  }
1025
1070
 
@@ -1050,11 +1095,50 @@ function syncTemplates(projectRoot, templateRootOverride) {
1050
1095
  report.managed.removed.push(norm(path.relative(projectRoot, target)));
1051
1096
  }
1052
1097
 
1098
+ // Cleanup files owned by disabled built-in TUIs. Iterates managed + merged
1099
+ // only (ejected entries are explicitly user-retained, see ejected loop below).
1100
+ //
1101
+ // Protection rule: only skip files registered as customTUI command targets
1102
+ // (e.g. a customTUI configured with dir=.codex/commands/ when codex is
1103
+ // disabled). Built-in TUI custom-skill commands like
1104
+ // .gemini/commands/<project>/<dirName>.toml are intentionally NOT protected
1105
+ // here so that disabling gemini-cli actually frees the gemini directory —
1106
+ // they will be regenerated only for still-enabled TUIs (see
1107
+ // generateCustomCommands).
1108
+ for (const entry of [...managed, ...merged]) {
1109
+ if (!isPathOwnedByDisabledTUI(entry, enabledTUIs)) continue;
1110
+
1111
+ if (entry.endsWith('/')) {
1112
+ const dir = path.join(projectRoot, entry);
1113
+ if (!fs.existsSync(dir)) continue;
1114
+
1115
+ for (const filePath of walkDir(dir)) {
1116
+ const relProj = norm(path.relative(projectRoot, filePath));
1117
+ if (customTUICommandTargets.has(relProj)) continue;
1118
+ fs.unlinkSync(filePath);
1119
+ report.managed.removed.push(relProj);
1120
+ }
1121
+ removeEmptyDirs(dir);
1122
+ continue;
1123
+ }
1124
+
1125
+ const target = path.join(projectRoot, renderPathname(entry, project));
1126
+ if (!fs.existsSync(target)) continue;
1127
+ const relProj = norm(path.relative(projectRoot, target));
1128
+ if (customTUICommandTargets.has(relProj)) continue;
1129
+ fs.unlinkSync(target);
1130
+ report.managed.removed.push(relProj);
1131
+ }
1132
+
1053
1133
  for (const entry of managed) {
1054
1134
  if (isPathOwnedByOtherPlatform(entry, platformType)) {
1055
1135
  report.managed.skippedPlatform.push(entry);
1056
1136
  continue;
1057
1137
  }
1138
+ if (isPathOwnedByDisabledTUI(entry, enabledTUIs)) {
1139
+ report.managed.skippedTUI.push(entry);
1140
+ continue;
1141
+ }
1058
1142
 
1059
1143
  const isDir = entry.endsWith('/');
1060
1144
  let entryRels;
@@ -1140,7 +1224,7 @@ function syncTemplates(projectRoot, templateRootOverride) {
1140
1224
 
1141
1225
  const customSkills = detectCustomSkills(projectRoot, templateSkillNames);
1142
1226
  report.custom.detected = customSkills.map((skill) => skill.dirName);
1143
- generateCustomCommands(projectRoot, customSkills, project, lang, report, customTUIs, templateSkillNames);
1227
+ generateCustomCommands(projectRoot, customSkills, project, lang, report, customTUIs, templateSkillNames, enabledTUIs);
1144
1228
 
1145
1229
  for (const entry of ejected) {
1146
1230
  const dstFull = path.join(projectRoot, entry);
@@ -1148,6 +1232,9 @@ function syncTemplates(projectRoot, templateRootOverride) {
1148
1232
  report.ejected.skipped.push(entry);
1149
1233
  continue;
1150
1234
  }
1235
+ // Do not (re)create ejected files for disabled TUIs. Existing files are
1236
+ // never touched by sync (handled above); this guard only blocks creation.
1237
+ if (isPathOwnedByDisabledTUI(entry, enabledTUIs)) continue;
1151
1238
 
1152
1239
  const selected = platformSelect(langSelect(entryVariantRels(entry, allSet, platformType), lang, allSet, project), platformType, project);
1153
1240
  const target = norm(renderPathname(entry, project));
@@ -1168,6 +1255,10 @@ function syncTemplates(projectRoot, templateRootOverride) {
1168
1255
  report.managed.skippedPlatform.push(entry);
1169
1256
  continue;
1170
1257
  }
1258
+ if (isPathOwnedByDisabledTUI(entry, enabledTUIs)) {
1259
+ report.managed.skippedTUI.push(entry);
1260
+ continue;
1261
+ }
1171
1262
 
1172
1263
  if (entry.includes('*')) {
1173
1264
  const hits = allRels.filter(r => {
@@ -139,7 +139,7 @@ steps:
139
139
  rule: "Read the highest-round plan review artifact and confirm feedback is approved or handled"
140
140
  - name: review-code
141
141
  pattern: "review-code.md | review-code-r{N}.md"
142
- rule: "In fix mode, read the highest-round code review artifact and verify it matches the latest Code Review entry in task.md Activity Log"
142
+ rule: "In fix mode, read the highest-round code review artifact and verify it matches the latest Review Code entry in task.md Activity Log"
143
143
  outputs:
144
144
  - name: code
145
145
  pattern: "code.md | code-r{N}.md"
@@ -139,7 +139,7 @@ steps:
139
139
  rule: "读取最高轮次的方案审查产物,确认方案已获通过或已处理反馈"
140
140
  - name: review-code
141
141
  pattern: "review-code.md | review-code-r{N}.md"
142
- rule: "修复模式读取最高轮次的代码审查产物,并校验其与 task.md Activity Log 中最近一条 Code Review 记录一致"
142
+ rule: "修复模式读取最高轮次的代码审查产物,并校验其与 task.md Activity Log 中最近一条 Review Code 记录一致"
143
143
  outputs:
144
144
  - name: code
145
145
  pattern: "code.md | code-r{N}.md"
@@ -139,7 +139,7 @@ steps:
139
139
  rule: "Read the highest-round plan review artifact and confirm feedback is approved or handled"
140
140
  - name: review-code
141
141
  pattern: "review-code.md | review-code-r{N}.md"
142
- rule: "In fix mode, read the highest-round code review artifact and verify it matches the latest Code Review entry in task.md Activity Log"
142
+ rule: "In fix mode, read the highest-round code review artifact and verify it matches the latest Review Code entry in task.md Activity Log"
143
143
  outputs:
144
144
  - name: code
145
145
  pattern: "code.md | code-r{N}.md"
@@ -139,7 +139,7 @@ steps:
139
139
  rule: "读取最高轮次的方案审查产物,确认方案已获通过或已处理反馈"
140
140
  - name: review-code
141
141
  pattern: "review-code.md | review-code-r{N}.md"
142
- rule: "修复模式读取最高轮次的代码审查产物,并校验其与 task.md Activity Log 中最近一条 Code Review 记录一致"
142
+ rule: "修复模式读取最高轮次的代码审查产物,并校验其与 task.md Activity Log 中最近一条 Review Code 记录一致"
143
143
  outputs:
144
144
  - name: code
145
145
  pattern: "code.md | code-r{N}.md"
@@ -141,7 +141,7 @@ steps:
141
141
  rule: "Read the highest-round plan review artifact and confirm feedback is approved or handled"
142
142
  - name: review-code
143
143
  pattern: "review-code.md | review-code-r{N}.md"
144
- rule: "In fix mode, read the highest-round code review artifact and verify it matches the latest Code Review entry in task.md Activity Log"
144
+ rule: "In fix mode, read the highest-round code review artifact and verify it matches the latest Review Code entry in task.md Activity Log"
145
145
  outputs:
146
146
  - name: code
147
147
  pattern: "code.md | code-r{N}.md"
@@ -141,7 +141,7 @@ steps:
141
141
  rule: "读取最高轮次的方案审查产物,确认方案已获通过或已处理反馈"
142
142
  - name: review-code
143
143
  pattern: "review-code.md | review-code-r{N}.md"
144
- rule: "修复模式读取最高轮次的代码审查产物,并校验其与 task.md Activity Log 中最近一条 Code Review 记录一致"
144
+ rule: "修复模式读取最高轮次的代码审查产物,并校验其与 task.md Activity Log 中最近一条 Review Code 记录一致"
145
145
  outputs:
146
146
  - name: code
147
147
  pattern: "code.md | code-r{N}.md"
@@ -29,6 +29,17 @@
29
29
  }
30
30
  ]
31
31
  }
32
+ ],
33
+ "StopFailure": [
34
+ {
35
+ "matcher": "",
36
+ "hooks": [
37
+ {
38
+ "type": "command",
39
+ "command": "sh \"$(git rev-parse --show-toplevel)/.agents/hooks/auto-resume.sh\""
40
+ }
41
+ ]
42
+ }
32
43
  ]
33
44
  }
34
45
  }