@fitlab-ai/agent-infra 0.5.2 → 0.5.3
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.
- package/README.md +3 -3
- package/README.zh-CN.md +3 -3
- package/lib/merge.js +22 -7
- package/lib/sandbox/commands/rm.js +1 -1
- package/lib/sandbox/runtimes/base.dockerfile +17 -1
- package/package.json +1 -1
- package/templates/.agents/scripts/validate-artifact.js +3 -3
- package/templates/.agents/skills/analyze-task/SKILL.en.md +2 -2
- package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/archive-tasks/scripts/archive-tasks.sh +1 -1
- package/templates/.agents/skills/block-task/SKILL.en.md +2 -2
- package/templates/.agents/skills/block-task/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/cancel-task/SKILL.en.md +12 -12
- package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +12 -12
- package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
- package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
- package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/commit/SKILL.en.md +1 -1
- package/templates/.agents/skills/commit/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/commit/reference/task-status-update.en.md +2 -2
- package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +2 -2
- package/templates/.agents/skills/complete-task/SKILL.en.md +11 -11
- package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +11 -11
- package/templates/.agents/skills/create-issue/SKILL.en.md +1 -1
- package/templates/.agents/skills/create-issue/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/create-pr/SKILL.en.md +1 -1
- package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/create-task/SKILL.en.md +4 -4
- package/templates/.agents/skills/create-task/SKILL.zh-CN.md +4 -4
- package/templates/.agents/skills/implement-task/SKILL.en.md +2 -2
- package/templates/.agents/skills/implement-task/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/import-codescan/SKILL.en.md +2 -2
- package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/import-dependabot/SKILL.en.md +2 -2
- package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/import-issue/SKILL.en.md +4 -4
- package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +4 -4
- package/templates/.agents/skills/plan-task/SKILL.en.md +2 -2
- package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/refine-task/SKILL.en.md +2 -2
- package/templates/.agents/skills/refine-task/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/restore-task/SKILL.en.md +2 -2
- package/templates/.agents/skills/restore-task/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/review-task/SKILL.en.md +2 -2
- package/templates/.agents/skills/review-task/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +1 -1
- package/templates/.agents/templates/task.en.md +3 -3
- package/templates/.agents/templates/task.zh-CN.md +3 -3
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<h1 align="center">Agent Infra</h1>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
|
|
8
|
+
Collaboration infrastructure for AI coding agents — skills, workflows, and sandboxes for Claude Code, Codex, Gemini CLI, and OpenCode.
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
|
|
30
30
|
Teams increasingly mix Claude Code, Codex, Gemini CLI, OpenCode, and other AI TUIs in the same repository, but each tool tends to introduce its own commands, prompts, and local conventions. Without a shared layer, the result is fragmented workflows, duplicated setup, and task history that is difficult to audit.
|
|
31
31
|
|
|
32
|
-
agent-infra standardizes that
|
|
32
|
+
agent-infra standardizes that shared infrastructure. It gives every supported AI TUI the same task lifecycle, the same skill vocabulary, the same project governance files, isolated development sandboxes, and the same upgrade path, so teams can switch tools without rebuilding process from scratch.
|
|
33
33
|
|
|
34
34
|
<a id="see-it-in-action"></a>
|
|
35
35
|
|
|
@@ -410,7 +410,7 @@ The generated `.agents/.airc.json` file is the central contract between the boot
|
|
|
410
410
|
"project": "my-project",
|
|
411
411
|
"org": "my-org",
|
|
412
412
|
"language": "en",
|
|
413
|
-
"templateVersion": "v0.5.
|
|
413
|
+
"templateVersion": "v0.5.3",
|
|
414
414
|
"files": {
|
|
415
415
|
"managed": [
|
|
416
416
|
".agents/workspace/README.md",
|
package/README.zh-CN.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<h1 align="center">Agent Infra</h1>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
AI
|
|
8
|
+
AI 编程代理的协作基础设施 —— 为 Claude Code、Codex、Gemini CLI、OpenCode 提供 skills、工作流和沙箱。
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
|
|
30
30
|
越来越多的团队会在同一个仓库里混用 Claude Code、Codex、Gemini CLI、OpenCode 等 AI TUI,但每个工具往往都会带来自己的命令体系、提示词习惯和本地约定。缺少共享层时,结果通常是工作流割裂、初始化重复、任务历史难以追踪。
|
|
31
31
|
|
|
32
|
-
agent-infra
|
|
32
|
+
agent-infra 的目标就是把这层共享基础设施标准化。它为所有支持的 AI TUI 提供统一的任务生命周期、统一的 skill 词汇、统一的项目治理文件、隔离的开发沙箱以及统一的升级路径,让团队切换工具时不必重新发明流程。
|
|
33
33
|
|
|
34
34
|
<a id="see-it-in-action"></a>
|
|
35
35
|
|
|
@@ -410,7 +410,7 @@ import-issue #42 从 GitHub Issue 导入任务
|
|
|
410
410
|
"project": "my-project",
|
|
411
411
|
"org": "my-org",
|
|
412
412
|
"language": "en",
|
|
413
|
-
"templateVersion": "v0.5.
|
|
413
|
+
"templateVersion": "v0.5.3",
|
|
414
414
|
"files": {
|
|
415
415
|
"managed": [
|
|
416
416
|
".agents/workspace/README.md",
|
package/lib/merge.js
CHANGED
|
@@ -404,15 +404,22 @@ function removeManifestFiles(rootDir) {
|
|
|
404
404
|
}
|
|
405
405
|
|
|
406
406
|
function formatTimestamp(date) {
|
|
407
|
+
const pad = (value) => String(value).padStart(2, '0');
|
|
408
|
+
const offsetMinutes = -date.getTimezoneOffset();
|
|
409
|
+
const sign = offsetMinutes >= 0 ? '+' : '-';
|
|
410
|
+
const absoluteOffsetMinutes = Math.abs(offsetMinutes);
|
|
411
|
+
const offsetHours = Math.floor(absoluteOffsetMinutes / 60);
|
|
412
|
+
const offsetRemainderMinutes = absoluteOffsetMinutes % 60;
|
|
413
|
+
|
|
407
414
|
return [
|
|
408
415
|
date.getFullYear(),
|
|
409
|
-
|
|
410
|
-
|
|
416
|
+
pad(date.getMonth() + 1),
|
|
417
|
+
pad(date.getDate())
|
|
411
418
|
].join('-') + ' ' + [
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
].join(':')
|
|
419
|
+
pad(date.getHours()),
|
|
420
|
+
pad(date.getMinutes()),
|
|
421
|
+
pad(date.getSeconds())
|
|
422
|
+
].join(':') + `${sign}${pad(offsetHours)}:${pad(offsetRemainderMinutes)}`;
|
|
416
423
|
}
|
|
417
424
|
|
|
418
425
|
function formatBackupTimestamp(date) {
|
|
@@ -485,7 +492,15 @@ function getTaskTimestamp(taskDir) {
|
|
|
485
492
|
}
|
|
486
493
|
|
|
487
494
|
function compareTimestamps(left, right) {
|
|
488
|
-
|
|
495
|
+
const normalizeTimestamp = (timestamp) => (timestamp.includes('T') ? timestamp : timestamp.replace(' ', 'T'));
|
|
496
|
+
const leftMs = Date.parse(normalizeTimestamp(left.value));
|
|
497
|
+
const rightMs = Date.parse(normalizeTimestamp(right.value));
|
|
498
|
+
|
|
499
|
+
if (Number.isNaN(leftMs) || Number.isNaN(rightMs)) {
|
|
500
|
+
return left.value.localeCompare(right.value);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
return leftMs - rightMs;
|
|
489
504
|
}
|
|
490
505
|
|
|
491
506
|
function scanWorkspaceSection(rootDir, sectionName) {
|
|
@@ -87,7 +87,7 @@ async function rmOne(config, tools, branch) {
|
|
|
87
87
|
|
|
88
88
|
const shouldDeleteBranch = await p.confirm({
|
|
89
89
|
message: `Also delete local branch '${effectiveBranch}'?`,
|
|
90
|
-
initialValue:
|
|
90
|
+
initialValue: true
|
|
91
91
|
});
|
|
92
92
|
|
|
93
93
|
if (!p.isCancel(shouldDeleteBranch) && shouldDeleteBranch) {
|
|
@@ -11,8 +11,10 @@ RUN (groupadd -g ${HOST_GID} devuser || true) && \
|
|
|
11
11
|
useradd -u ${HOST_UID} -g ${HOST_GID} -m -s /bin/bash devuser
|
|
12
12
|
|
|
13
13
|
RUN apt-get update && apt-get install -y \
|
|
14
|
-
curl wget git vim
|
|
14
|
+
curl wget git vim file \
|
|
15
15
|
build-essential ca-certificates gnupg lsb-release \
|
|
16
|
+
libevent-core-2.1-7 libncursesw6 libtinfo6 \
|
|
17
|
+
pkg-config bison libevent-dev libncurses-dev \
|
|
16
18
|
locales \
|
|
17
19
|
&& locale-gen en_US.UTF-8 \
|
|
18
20
|
&& (curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \
|
|
@@ -20,6 +22,19 @@ RUN apt-get update && apt-get install -y \
|
|
|
20
22
|
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" \
|
|
21
23
|
> /etc/apt/sources.list.d/github-cli.list \
|
|
22
24
|
&& apt-get update && apt-get install -y gh \
|
|
25
|
+
&& TMUX_VERSION=3.6a \
|
|
26
|
+
&& wget -qO /tmp/tmux.tar.gz \
|
|
27
|
+
"https://github.com/tmux/tmux/releases/download/${TMUX_VERSION}/tmux-${TMUX_VERSION}.tar.gz" \
|
|
28
|
+
&& tar xzf /tmp/tmux.tar.gz -C /tmp \
|
|
29
|
+
&& cd /tmp/tmux-${TMUX_VERSION} \
|
|
30
|
+
&& ./configure --prefix=/usr/local \
|
|
31
|
+
&& make -j"$(nproc)" \
|
|
32
|
+
&& make install \
|
|
33
|
+
&& cd / \
|
|
34
|
+
&& rm -rf /tmp/tmux.tar.gz /tmp/tmux-${TMUX_VERSION} \
|
|
35
|
+
&& apt-get purge -y pkg-config bison libevent-dev libncurses-dev \
|
|
36
|
+
&& apt-get autoremove -y \
|
|
37
|
+
&& apt-get clean \
|
|
23
38
|
&& rm -rf /var/lib/apt/lists/*
|
|
24
39
|
|
|
25
40
|
# Enable extended keys in CSI u format so Shift+Enter and other modified
|
|
@@ -30,6 +45,7 @@ RUN printf '%s\n' \
|
|
|
30
45
|
'set -g extended-keys-format csi-u' \
|
|
31
46
|
"set -as terminal-features 'xterm*:extkeys'" \
|
|
32
47
|
"set -ga update-environment 'TERM_PROGRAM TERM_PROGRAM_VERSION LC_TERMINAL LC_TERMINAL_VERSION'" \
|
|
48
|
+
'set -g mouse on' \
|
|
33
49
|
> /etc/tmux.conf
|
|
34
50
|
|
|
35
51
|
ENV LANG=en_US.UTF-8
|
package/package.json
CHANGED
|
@@ -29,8 +29,8 @@ const DEFAULT_REQUIRED_FIELDS = [
|
|
|
29
29
|
|
|
30
30
|
const DEFAULT_RETRY_DELAYS_MS = [3000, 10000];
|
|
31
31
|
const DEFAULT_FRESHNESS_MINUTES = 30;
|
|
32
|
-
const DATE_TIME_PATTERN = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}
|
|
33
|
-
const ACTIVITY_LOG_PATTERN = /^- (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) — \*\*(.+?)\*\* by (.+?) — (.+)$/;
|
|
32
|
+
const DATE_TIME_PATTERN = /^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(?:[+-]\d{2}:\d{2})?$/;
|
|
33
|
+
const ACTIVITY_LOG_PATTERN = /^- (\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(?:[+-]\d{2}:\d{2})?) — \*\*(.+?)\*\* by (.+?) — (.+)$/;
|
|
34
34
|
const BRANCH_SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
35
35
|
|
|
36
36
|
const scriptPath = fileURLToPath(import.meta.url);
|
|
@@ -1351,7 +1351,7 @@ function sleep(delayMs) {
|
|
|
1351
1351
|
// === Utilities ===
|
|
1352
1352
|
|
|
1353
1353
|
function minutesSinceTimestamp(timestamp) {
|
|
1354
|
-
const normalized = timestamp.replace(" ", "T");
|
|
1354
|
+
const normalized = timestamp.includes("T") ? timestamp : timestamp.replace(" ", "T");
|
|
1355
1355
|
const parsed = Date.parse(normalized);
|
|
1356
1356
|
if (Number.isNaN(parsed)) {
|
|
1357
1357
|
return Number.POSITIVE_INFINITY;
|
|
@@ -103,7 +103,7 @@ Create `.agents/workspace/active/{task-id}/{analysis-artifact}`.
|
|
|
103
103
|
Get the current time:
|
|
104
104
|
|
|
105
105
|
```bash
|
|
106
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
106
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
107
107
|
```
|
|
108
108
|
|
|
109
109
|
Update `.agents/workspace/active/{task-id}/task.md`:
|
|
@@ -115,7 +115,7 @@ Update `.agents/workspace/active/{task-id}/task.md`:
|
|
|
115
115
|
- Mark requirement-analysis as complete in workflow progress and include the actual round when the task template supports it
|
|
116
116
|
- **Append** to `## Activity Log` (do NOT overwrite previous entries):
|
|
117
117
|
```
|
|
118
|
-
- {
|
|
118
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Requirement Analysis (Round {N})** by {agent} — Analysis completed → {analysis-artifact}
|
|
119
119
|
```
|
|
120
120
|
|
|
121
121
|
If task.md contains a valid `issue_number`, perform these sync actions (skip and continue on any failure):
|
|
@@ -103,7 +103,7 @@ description: "分析任务并输出需求分析文档"
|
|
|
103
103
|
获取当前时间:
|
|
104
104
|
|
|
105
105
|
```bash
|
|
106
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
106
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
107
107
|
```
|
|
108
108
|
|
|
109
109
|
更新 `.agents/workspace/active/{task-id}/task.md`:
|
|
@@ -115,7 +115,7 @@ date "+%Y-%m-%d %H:%M:%S"
|
|
|
115
115
|
- 在工作流进度中标记 requirement-analysis 为已完成,并注明实际轮次(如果任务模板支持)
|
|
116
116
|
- **追加**到 `## Activity Log`(不要覆盖之前的记录):
|
|
117
117
|
```
|
|
118
|
-
- {
|
|
118
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Requirement Analysis (Round {N})** by {agent} — Analysis completed → {analysis-artifact}
|
|
119
119
|
```
|
|
120
120
|
|
|
121
121
|
如果 task.md 中存在有效的 `issue_number`,执行以下同步操作(任一失败则跳过并继续):
|
|
@@ -210,7 +210,7 @@ rebuild_manifest() {
|
|
|
210
210
|
entries_file="$tmpdir/manifest.tsv"
|
|
211
211
|
month_keys_file="$tmpdir/manifest-months.tsv"
|
|
212
212
|
year_keys_file="$tmpdir/manifest-years.tsv"
|
|
213
|
-
generated_at=$(date "+%Y-%m-%d %H:%M:%S")
|
|
213
|
+
generated_at=$(date "+%Y-%m-%d %H:%M:%S%:z")
|
|
214
214
|
|
|
215
215
|
mkdir -p "$ARCHIVE_DIR"
|
|
216
216
|
: > "$entries_file"
|
|
@@ -40,7 +40,7 @@ Before blocking, thoroughly analyze:
|
|
|
40
40
|
Get the current time:
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
43
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
Update `.agents/workspace/active/{task-id}/task.md`:
|
|
@@ -49,7 +49,7 @@ Update `.agents/workspace/active/{task-id}/task.md`:
|
|
|
49
49
|
- `updated_at`: {current timestamp}
|
|
50
50
|
- **Append** to `## Activity Log` (do NOT overwrite previous entries):
|
|
51
51
|
```
|
|
52
|
-
- {
|
|
52
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Blocked** by {agent} — {one-line reason}
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
Add a blocking information section to task.md.
|
|
@@ -40,7 +40,7 @@ description: "标记任务为阻塞状态并记录原因"
|
|
|
40
40
|
获取当前时间:
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
43
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
更新 `.agents/workspace/active/{task-id}/task.md`:
|
|
@@ -49,7 +49,7 @@ date "+%Y-%m-%d %H:%M:%S"
|
|
|
49
49
|
- `updated_at`:{当前时间戳}
|
|
50
50
|
- **追加**到 `## Activity Log`(不要覆盖之前的记录):
|
|
51
51
|
```
|
|
52
|
-
- {
|
|
52
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Blocked** by {agent} — {一行原因}
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
在 task.md 中添加阻塞信息部分。
|
|
@@ -7,7 +7,7 @@ description: "Cancel an unneeded task and archive it"
|
|
|
7
7
|
|
|
8
8
|
## Boundary / Critical Rules
|
|
9
9
|
|
|
10
|
-
- This command terminates a task that no longer needs to continue and
|
|
10
|
+
- This command terminates a task that no longer needs to continue and moves it into `completed/`
|
|
11
11
|
- Cancel only when the task no longer needs implementation, review, or follow-up work
|
|
12
12
|
- When a valid `issue_number` exists, Issue sync is required
|
|
13
13
|
|
|
@@ -22,7 +22,7 @@ Check these directories in order:
|
|
|
22
22
|
|
|
23
23
|
Handling rules:
|
|
24
24
|
- If found in `active/` or `blocked/`: continue
|
|
25
|
-
- If found only in `completed/`: inform the user the task is already
|
|
25
|
+
- If found only in `completed/`: inform the user the task is already moved and stop
|
|
26
26
|
- If not found anywhere: prompt `Task {task-id} not found`
|
|
27
27
|
|
|
28
28
|
### 2. Choose the Cancellation Label
|
|
@@ -40,7 +40,7 @@ When syncing to the Issue, replace any existing `status:` labels with the inferr
|
|
|
40
40
|
Get the current time:
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
43
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
Update `task.md` in the task directory:
|
|
@@ -50,16 +50,16 @@ Update `task.md` in the task directory:
|
|
|
50
50
|
- `updated_at`: {current timestamp}
|
|
51
51
|
- **Append** to `## Activity Log` (do NOT overwrite previous entries):
|
|
52
52
|
```
|
|
53
|
-
- {
|
|
53
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Cancelled** by {agent} — {one-line cancellation reason}
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
### 4.
|
|
56
|
+
### 4. Move the Task
|
|
57
57
|
|
|
58
58
|
Move the task directory into `.agents/workspace/completed/{task-id}`.
|
|
59
59
|
|
|
60
60
|
If the source directory is `blocked/`, move it from `blocked/`; if it is `active/`, move it from `active/`.
|
|
61
61
|
|
|
62
|
-
### 5. Verify the
|
|
62
|
+
### 5. Verify the Move
|
|
63
63
|
|
|
64
64
|
```bash
|
|
65
65
|
ls .agents/workspace/completed/{task-id}/task.md
|
|
@@ -89,7 +89,7 @@ The cancellation comment must include at least:
|
|
|
89
89
|
|
|
90
90
|
### 7. Verification Gate
|
|
91
91
|
|
|
92
|
-
Run the verification gate to confirm the
|
|
92
|
+
Run the verification gate to confirm the moved task and sync state are valid:
|
|
93
93
|
|
|
94
94
|
```bash
|
|
95
95
|
node .agents/scripts/validate-artifact.js gate cancel-task .agents/workspace/completed/{task-id} --format text
|
|
@@ -110,13 +110,13 @@ Keep the gate output in your reply as fresh evidence. Do not claim completion wi
|
|
|
110
110
|
|
|
111
111
|
Output format:
|
|
112
112
|
```
|
|
113
|
-
Task {task-id} cancelled
|
|
113
|
+
Task {task-id} cancelled; task directory moved to completed/.
|
|
114
114
|
|
|
115
115
|
Cancellation reason: {reason}
|
|
116
116
|
Status label: {status-label or skipped}
|
|
117
|
-
|
|
117
|
+
Target path: .agents/workspace/completed/{task-id}/
|
|
118
118
|
|
|
119
|
-
Next step - inspect the
|
|
119
|
+
Next step - inspect the moved task:
|
|
120
120
|
- Claude Code / OpenCode: /check-task {task-id}
|
|
121
121
|
- Gemini CLI: /{{project}}:check-task {task-id}
|
|
122
122
|
- Codex CLI: $check-task {task-id}
|
|
@@ -139,5 +139,5 @@ Next step - inspect the archived task:
|
|
|
139
139
|
## Error Handling
|
|
140
140
|
|
|
141
141
|
- Task not found: `Task {task-id} not found`
|
|
142
|
-
- Task already
|
|
143
|
-
- Issue sync failed: keep the local
|
|
142
|
+
- Task already moved: inform the user it is already in `completed/`
|
|
143
|
+
- Issue sync failed: keep the local move result and tell the user manual platform follow-up is required
|
|
@@ -7,7 +7,7 @@ description: "取消不再需要的任务并归档"
|
|
|
7
7
|
|
|
8
8
|
## 行为边界 / 关键规则
|
|
9
9
|
|
|
10
|
-
-
|
|
10
|
+
- 本命令用于终止一个不再需要继续执行的任务,并转移到 `completed/`
|
|
11
11
|
- 只有在确认该任务无需继续实现、审查或修复时才可取消
|
|
12
12
|
- 有效 `issue_number` 存在时,Issue 同步属于必做项
|
|
13
13
|
|
|
@@ -22,7 +22,7 @@ description: "取消不再需要的任务并归档"
|
|
|
22
22
|
|
|
23
23
|
处理规则:
|
|
24
24
|
- 如果在 `active/` 或 `blocked/` 中找到:继续
|
|
25
|
-
- 如果只在 `completed/`
|
|
25
|
+
- 如果只在 `completed/` 中找到:告知用户任务已转移,停止
|
|
26
26
|
- 如果都不存在:提示 `Task {task-id} not found`
|
|
27
27
|
|
|
28
28
|
### 2. 判断取消标签
|
|
@@ -40,7 +40,7 @@ description: "取消不再需要的任务并归档"
|
|
|
40
40
|
获取当前时间:
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
43
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
更新任务目录中的 `task.md`:
|
|
@@ -50,16 +50,16 @@ date "+%Y-%m-%d %H:%M:%S"
|
|
|
50
50
|
- `updated_at`:{当前时间戳}
|
|
51
51
|
- **追加**到 `## Activity Log`(不要覆盖之前记录):
|
|
52
52
|
```
|
|
53
|
-
- {
|
|
53
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Cancelled** by {agent} — {一行取消原因}
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
### 4.
|
|
56
|
+
### 4. 转移任务
|
|
57
57
|
|
|
58
58
|
将任务目录移动到 `.agents/workspace/completed/{task-id}`。
|
|
59
59
|
|
|
60
60
|
如果源目录在 `blocked/`,从 `blocked/` 移动;如果源目录在 `active/`,从 `active/` 移动。
|
|
61
61
|
|
|
62
|
-
### 5.
|
|
62
|
+
### 5. 验证转移
|
|
63
63
|
|
|
64
64
|
```bash
|
|
65
65
|
ls .agents/workspace/completed/{task-id}/task.md
|
|
@@ -89,7 +89,7 @@ ls .agents/workspace/completed/{task-id}/task.md
|
|
|
89
89
|
|
|
90
90
|
### 7. 完成校验
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
运行完成校验,确认任务转移和同步状态符合规范:
|
|
93
93
|
|
|
94
94
|
```bash
|
|
95
95
|
node .agents/scripts/validate-artifact.js gate cancel-task .agents/workspace/completed/{task-id} --format text
|
|
@@ -110,13 +110,13 @@ node .agents/scripts/validate-artifact.js gate cancel-task .agents/workspace/com
|
|
|
110
110
|
|
|
111
111
|
输出格式:
|
|
112
112
|
```
|
|
113
|
-
任务 {task-id}
|
|
113
|
+
任务 {task-id} 已取消,任务目录已转移到 completed/。
|
|
114
114
|
|
|
115
115
|
取消原因:{reason}
|
|
116
116
|
状态标签:{status-label 或 skipped}
|
|
117
|
-
|
|
117
|
+
目标路径:.agents/workspace/completed/{task-id}/
|
|
118
118
|
|
|
119
|
-
下一步 -
|
|
119
|
+
下一步 - 查看已转移任务:
|
|
120
120
|
- Claude Code / OpenCode:/check-task {task-id}
|
|
121
121
|
- Gemini CLI:/{{project}}:check-task {task-id}
|
|
122
122
|
- Codex CLI:$check-task {task-id}
|
|
@@ -139,5 +139,5 @@ node .agents/scripts/validate-artifact.js gate cancel-task .agents/workspace/com
|
|
|
139
139
|
## 错误处理
|
|
140
140
|
|
|
141
141
|
- 任务未找到:`Task {task-id} not found`
|
|
142
|
-
-
|
|
143
|
-
- Issue
|
|
142
|
+
- 任务已转移:提示任务已在 `completed/` 中
|
|
143
|
+
- Issue 同步失败:保留本地转移结果,并告知用户需要人工补齐平台操作
|
|
@@ -72,13 +72,13 @@ If a related task exists (search for `codescan_alert_number: <alert-number>`):
|
|
|
72
72
|
Get the current time:
|
|
73
73
|
|
|
74
74
|
```bash
|
|
75
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
75
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
76
76
|
```
|
|
77
77
|
|
|
78
78
|
- Add the dismissal record to task.md
|
|
79
79
|
- **Append** to `## Activity Log` (do NOT overwrite previous entries):
|
|
80
80
|
```
|
|
81
|
-
- {
|
|
81
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Alert Closed** by {agent} — Code Scanning alert #{alert-number} dismissed: {reason}
|
|
82
82
|
```
|
|
83
83
|
- Archive the task
|
|
84
84
|
|
|
@@ -72,13 +72,13 @@ Code Scanning 告警 #{alert-number}
|
|
|
72
72
|
获取当前时间:
|
|
73
73
|
|
|
74
74
|
```bash
|
|
75
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
75
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
76
76
|
```
|
|
77
77
|
|
|
78
78
|
- 添加关闭记录到 task.md
|
|
79
79
|
- **追加**到 `## Activity Log`(不要覆盖之前的记录):
|
|
80
80
|
```
|
|
81
|
-
- {
|
|
81
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Alert Closed** by {agent} — Code Scanning alert #{alert-number} dismissed: {reason}
|
|
82
82
|
```
|
|
83
83
|
- 归档任务
|
|
84
84
|
|
|
@@ -80,13 +80,13 @@ If a related task exists (search for `security_alert_number: <alert-number>`):
|
|
|
80
80
|
Get the current time:
|
|
81
81
|
|
|
82
82
|
```bash
|
|
83
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
83
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
84
84
|
```
|
|
85
85
|
|
|
86
86
|
- Add the dismissal record to task.md
|
|
87
87
|
- **Append** to `## Activity Log` (do NOT overwrite previous entries):
|
|
88
88
|
```
|
|
89
|
-
- {
|
|
89
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Alert Closed** by {agent} — Dependabot alert #{alert-number} dismissed: {reason}
|
|
90
90
|
```
|
|
91
91
|
- Archive the task
|
|
92
92
|
|
|
@@ -80,13 +80,13 @@ CVE:{cve-id}
|
|
|
80
80
|
获取当前时间:
|
|
81
81
|
|
|
82
82
|
```bash
|
|
83
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
83
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
84
84
|
```
|
|
85
85
|
|
|
86
86
|
- 添加关闭记录到 task.md
|
|
87
87
|
- **追加**到 `## Activity Log`(不要覆盖之前的记录):
|
|
88
88
|
```
|
|
89
|
-
- {
|
|
89
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Alert Closed** by {agent} — Dependabot alert #{alert-number} dismissed: {reason}
|
|
90
90
|
```
|
|
91
91
|
- 归档任务
|
|
92
92
|
|
|
@@ -39,7 +39,7 @@ Stage specific files only and run `git commit` with the prepared message.
|
|
|
39
39
|
Get the current time:
|
|
40
40
|
|
|
41
41
|
```bash
|
|
42
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
42
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
43
43
|
```
|
|
44
44
|
|
|
45
45
|
> The full four-case status matrix, prerequisite checks, and multi-TUI next-step commands live in `reference/task-status-update.md`. Read `reference/task-status-update.md` before updating task state.
|
|
@@ -7,13 +7,13 @@ Read this file before choosing the post-commit task-state branch.
|
|
|
7
7
|
Get the current time first:
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
10
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
For every task-related commit, append this Activity Log entry in `task.md`:
|
|
14
14
|
|
|
15
15
|
```text
|
|
16
|
-
- {
|
|
16
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Commit** by {agent} — {commit hash short} {commit subject}
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
Before selecting the next step, verify:
|
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
先获取当前时间:
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
10
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
对于每一次与任务相关的提交,都要在 `task.md` 中追加以下 Activity Log:
|
|
14
14
|
|
|
15
15
|
```text
|
|
16
|
-
- {
|
|
16
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Commit** by {agent} — {commit hash short} {commit subject}
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
在决定下一步之前,先确认:
|
|
@@ -8,7 +8,7 @@ description: "Mark a task as completed and archive it"
|
|
|
8
8
|
## Boundary / Critical Rules
|
|
9
9
|
|
|
10
10
|
- This command updates task metadata AND physically moves the task directory
|
|
11
|
-
- Do not
|
|
11
|
+
- Do not move a task that has incomplete workflow steps unless forced
|
|
12
12
|
|
|
13
13
|
## Steps
|
|
14
14
|
|
|
@@ -36,7 +36,7 @@ Before marking complete, verify ALL of these:
|
|
|
36
36
|
> - If any condition is missing -> **stop by default** and output the prerequisite warning
|
|
37
37
|
> - Only continue with unmet prerequisites when the user explicitly requested `--force`
|
|
38
38
|
>
|
|
39
|
-
> **Do not continue to Steps 3-7 when prerequisites are not met, and do not output "Task {task-id} completed
|
|
39
|
+
> **Do not continue to Steps 3-7 when prerequisites are not met, and do not output "Task {task-id} completed; task directory moved to completed/."**
|
|
40
40
|
|
|
41
41
|
If any prerequisite is not met, warn the user:
|
|
42
42
|
```
|
|
@@ -53,7 +53,7 @@ If prerequisites are not met and the user did not explicitly provide `--force`,
|
|
|
53
53
|
Get the current time:
|
|
54
54
|
|
|
55
55
|
```bash
|
|
56
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
56
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
Update `.agents/workspace/active/{task-id}/task.md`:
|
|
@@ -64,10 +64,10 @@ Update `.agents/workspace/active/{task-id}/task.md`:
|
|
|
64
64
|
- Verify and check off all items in `## Completion Checklist` (change `- [ ]` to `- [x]`)
|
|
65
65
|
- **Append** to `## Activity Log` (do NOT overwrite previous entries):
|
|
66
66
|
```
|
|
67
|
-
- {
|
|
67
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Completed** by {agent} — Task moved to completed/
|
|
68
68
|
```
|
|
69
69
|
|
|
70
|
-
### 4.
|
|
70
|
+
### 4. Move Task
|
|
71
71
|
|
|
72
72
|
Move the task directory from active to completed:
|
|
73
73
|
|
|
@@ -75,7 +75,7 @@ Move the task directory from active to completed:
|
|
|
75
75
|
mv .agents/workspace/active/{task-id} .agents/workspace/completed/{task-id}
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
-
### 5. Verify
|
|
78
|
+
### 5. Verify Move
|
|
79
79
|
|
|
80
80
|
```bash
|
|
81
81
|
ls .agents/workspace/completed/{task-id}/task.md
|
|
@@ -116,12 +116,12 @@ Keep the gate output in your reply as fresh evidence. Do not claim completion wi
|
|
|
116
116
|
|
|
117
117
|
Output format:
|
|
118
118
|
```
|
|
119
|
-
Task {task-id} completed
|
|
119
|
+
Task {task-id} completed; task directory moved to completed/.
|
|
120
120
|
|
|
121
121
|
Task info:
|
|
122
122
|
- Title: {title}
|
|
123
123
|
- Completed at: {timestamp}
|
|
124
|
-
-
|
|
124
|
+
- Target path: .agents/workspace/completed/{task-id}/
|
|
125
125
|
|
|
126
126
|
Deliverables:
|
|
127
127
|
- {List of key outputs: files modified, tests added, etc.}
|
|
@@ -132,18 +132,18 @@ Deliverables:
|
|
|
132
132
|
- [ ] Verified all workflow steps are complete
|
|
133
133
|
- [ ] Updated task.md with completed status and timestamp
|
|
134
134
|
- [ ] Moved task directory to `.agents/workspace/completed/`
|
|
135
|
-
- [ ] Verified
|
|
135
|
+
- [ ] Verified move succeeded
|
|
136
136
|
- [ ] Informed user of completion
|
|
137
137
|
|
|
138
138
|
## Notes
|
|
139
139
|
|
|
140
|
-
1. **Premature completion**: Do not
|
|
140
|
+
1. **Premature completion**: Do not move a task that has incomplete steps. Examples of incomplete situations:
|
|
141
141
|
- Code is written but not committed
|
|
142
142
|
- Code is committed but not reviewed
|
|
143
143
|
- Review found blockers that haven't been fixed
|
|
144
144
|
- PR is created but not merged
|
|
145
145
|
|
|
146
|
-
2. **Rollback**: If a task was
|
|
146
|
+
2. **Rollback**: If a task was incorrectly moved:
|
|
147
147
|
```bash
|
|
148
148
|
mv .agents/workspace/completed/{task-id} .agents/workspace/active/{task-id}
|
|
149
149
|
```
|
|
@@ -8,7 +8,7 @@ description: "标记任务完成并归档"
|
|
|
8
8
|
## 行为边界 / 关键规则
|
|
9
9
|
|
|
10
10
|
- 本命令更新任务元数据并物理移动任务目录
|
|
11
|
-
-
|
|
11
|
+
- 除非强制执行,不要转移有未完成工作流步骤的任务
|
|
12
12
|
|
|
13
13
|
## 执行步骤
|
|
14
14
|
|
|
@@ -36,7 +36,7 @@ description: "标记任务完成并归档"
|
|
|
36
36
|
> - 如果任意一个条件不满足 → **默认停止**,输出前置条件未满足的警告
|
|
37
37
|
> - 只有用户明确要求 `--force` 时,才可以在前置条件未满足时继续
|
|
38
38
|
>
|
|
39
|
-
> **禁止在前置条件未满足时继续执行步骤 3-7,也不要输出「任务 {task-id}
|
|
39
|
+
> **禁止在前置条件未满足时继续执行步骤 3-7,也不要输出「任务 {task-id} 已完成,任务目录已转移到 completed/。」**
|
|
40
40
|
|
|
41
41
|
如果任何前置条件未满足,警告用户:
|
|
42
42
|
```
|
|
@@ -53,7 +53,7 @@ Please complete the missing steps first, or use --force to override.
|
|
|
53
53
|
获取当前时间:
|
|
54
54
|
|
|
55
55
|
```bash
|
|
56
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
56
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
更新 `.agents/workspace/active/{task-id}/task.md`:
|
|
@@ -64,10 +64,10 @@ date "+%Y-%m-%d %H:%M:%S"
|
|
|
64
64
|
- 逐项验证并勾选 `## 完成检查清单` 中的所有条目(将 `- [ ]` 改为 `- [x]`)
|
|
65
65
|
- **追加**到 `## Activity Log`(不要覆盖之前的记录):
|
|
66
66
|
```
|
|
67
|
-
- {
|
|
67
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Completed** by {agent} — Task moved to completed/
|
|
68
68
|
```
|
|
69
69
|
|
|
70
|
-
### 4.
|
|
70
|
+
### 4. 转移任务
|
|
71
71
|
|
|
72
72
|
将任务目录从 active 移动到 completed:
|
|
73
73
|
|
|
@@ -75,7 +75,7 @@ date "+%Y-%m-%d %H:%M:%S"
|
|
|
75
75
|
mv .agents/workspace/active/{task-id} .agents/workspace/completed/{task-id}
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
-
### 5.
|
|
78
|
+
### 5. 验证转移
|
|
79
79
|
|
|
80
80
|
```bash
|
|
81
81
|
ls .agents/workspace/completed/{task-id}/task.md
|
|
@@ -116,12 +116,12 @@ node .agents/scripts/validate-artifact.js gate complete-task .agents/workspace/c
|
|
|
116
116
|
|
|
117
117
|
输出格式:
|
|
118
118
|
```
|
|
119
|
-
任务 {task-id}
|
|
119
|
+
任务 {task-id} 已完成,任务目录已转移到 completed/。
|
|
120
120
|
|
|
121
121
|
任务信息:
|
|
122
122
|
- 标题:{title}
|
|
123
123
|
- 完成时间:{timestamp}
|
|
124
|
-
-
|
|
124
|
+
- 目标路径:.agents/workspace/completed/{task-id}/
|
|
125
125
|
|
|
126
126
|
交付物:
|
|
127
127
|
- {关键产出列表:修改的文件、添加的测试等}
|
|
@@ -132,18 +132,18 @@ node .agents/scripts/validate-artifact.js gate complete-task .agents/workspace/c
|
|
|
132
132
|
- [ ] 验证了所有工作流步骤已完成
|
|
133
133
|
- [ ] 更新了 task.md 的完成状态和时间戳
|
|
134
134
|
- [ ] 将任务目录移动到 `.agents/workspace/completed/`
|
|
135
|
-
- [ ]
|
|
135
|
+
- [ ] 验证了转移成功
|
|
136
136
|
- [ ] 告知了用户完成情况
|
|
137
137
|
|
|
138
138
|
## 注意事项
|
|
139
139
|
|
|
140
|
-
1.
|
|
140
|
+
1. **过早完成**:不要转移有未完成步骤的任务。未完成的情况示例:
|
|
141
141
|
- 代码已编写但未提交
|
|
142
142
|
- 代码已提交但未审查
|
|
143
143
|
- 审查发现阻塞项但未修复
|
|
144
144
|
- PR 已创建但未合并
|
|
145
145
|
|
|
146
|
-
2.
|
|
146
|
+
2. **回滚**:如果任务被错误转移:
|
|
147
147
|
```bash
|
|
148
148
|
mv .agents/workspace/completed/{task-id} .agents/workspace/active/{task-id}
|
|
149
149
|
```
|
|
@@ -46,7 +46,7 @@ Create and enrich the Issue by following the "Create Issue" and "Set the Issue T
|
|
|
46
46
|
Get the current time:
|
|
47
47
|
|
|
48
48
|
```bash
|
|
49
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
49
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
Write back `issue_number`, update `updated_at`, and append the Create Issue Activity Log entry.
|
|
@@ -69,7 +69,7 @@ Aggregate a reviewer-facing summary from those artifacts and maintain a single i
|
|
|
69
69
|
Get the current time:
|
|
70
70
|
|
|
71
71
|
```bash
|
|
72
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
72
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
73
73
|
```
|
|
74
74
|
|
|
75
75
|
If `{task-id}` is available, update task.md with `pr_number`, `updated_at`, and append the PR Created Activity Log entry including metadata-sync and summary results.
|
|
@@ -71,8 +71,8 @@ type: feature|bugfix|refactor|docs|chore
|
|
|
71
71
|
branch: <project>-<type>-<slug>
|
|
72
72
|
workflow: feature-development|bug-fix|refactoring
|
|
73
73
|
status: active
|
|
74
|
-
created_at: {
|
|
75
|
-
updated_at: {
|
|
74
|
+
created_at: {YYYY-MM-DD HH:mm:ss±HH:MM}
|
|
75
|
+
updated_at: {YYYY-MM-DD HH:mm:ss±HH:MM}
|
|
76
76
|
created_by: human
|
|
77
77
|
current_step: requirement-analysis
|
|
78
78
|
assigned_to: {current AI agent}
|
|
@@ -85,7 +85,7 @@ Note: `created_by` is `human` because the task comes from the user's description
|
|
|
85
85
|
Get the current time:
|
|
86
86
|
|
|
87
87
|
```bash
|
|
88
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
88
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
89
89
|
```
|
|
90
90
|
|
|
91
91
|
Update `.agents/workspace/active/{task-id}/task.md`:
|
|
@@ -95,7 +95,7 @@ Update `.agents/workspace/active/{task-id}/task.md`:
|
|
|
95
95
|
- `## Context` -> `- **Branch**:`: update it to the generated branch name
|
|
96
96
|
- **Append** to `## Activity Log` (do NOT overwrite previous entries):
|
|
97
97
|
```
|
|
98
|
-
- {
|
|
98
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Task Created** by {agent} — Task created from description
|
|
99
99
|
```
|
|
100
100
|
|
|
101
101
|
### 4. Verification Gate
|
|
@@ -71,8 +71,8 @@ type: feature|bugfix|refactor|docs|chore
|
|
|
71
71
|
branch: <project>-<type>-<slug>
|
|
72
72
|
workflow: feature-development|bug-fix|refactoring
|
|
73
73
|
status: active
|
|
74
|
-
created_at: {
|
|
75
|
-
updated_at: {
|
|
74
|
+
created_at: {YYYY-MM-DD HH:mm:ss±HH:MM}
|
|
75
|
+
updated_at: {YYYY-MM-DD HH:mm:ss±HH:MM}
|
|
76
76
|
created_by: human
|
|
77
77
|
current_step: requirement-analysis
|
|
78
78
|
assigned_to: {当前 AI 代理}
|
|
@@ -85,7 +85,7 @@ assigned_to: {当前 AI 代理}
|
|
|
85
85
|
获取当前时间:
|
|
86
86
|
|
|
87
87
|
```bash
|
|
88
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
88
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
89
89
|
```
|
|
90
90
|
|
|
91
91
|
更新 `.agents/workspace/active/{task-id}/task.md`:
|
|
@@ -95,7 +95,7 @@ date "+%Y-%m-%d %H:%M:%S"
|
|
|
95
95
|
- `## 上下文` 中的 `- **分支**:`:更新为生成的分支名
|
|
96
96
|
- **追加**到 `## Activity Log`(不要覆盖之前的记录):
|
|
97
97
|
```
|
|
98
|
-
- {
|
|
98
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Task Created** by {agent} — Task created from description
|
|
99
99
|
```
|
|
100
100
|
|
|
101
101
|
### 4. 完成校验
|
|
@@ -81,7 +81,7 @@ Create `.agents/workspace/active/{task-id}/{implementation-artifact}`.
|
|
|
81
81
|
Get the current time:
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
84
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
85
85
|
```
|
|
86
86
|
|
|
87
87
|
Update `.agents/workspace/active/{task-id}/task.md`:
|
|
@@ -91,7 +91,7 @@ Update `.agents/workspace/active/{task-id}/task.md`:
|
|
|
91
91
|
- review the `## Requirements` section and only change items from `- [ ]` to `- [x]` when they are clearly satisfied by this round's implemented code and passing tests
|
|
92
92
|
- record `{implementation-artifact}` for Round `{implementation-round}`
|
|
93
93
|
- append:
|
|
94
|
-
`- {
|
|
94
|
+
`- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Implementation (Round {N})** by {agent} — Code implemented, {n} files modified, {n} tests passed → {implementation-artifact}`
|
|
95
95
|
|
|
96
96
|
If task.md contains a valid `issue_number`, perform these sync actions (skip and continue on any failure; read `.agents/rules/issue-sync.md` first):
|
|
97
97
|
- Set `status: in-progress` and refine `in:` labels from the branch diff by following `.agents/rules/issue-sync.md` (add/remove when a mapping exists, add-only when it does not)
|
|
@@ -81,7 +81,7 @@ description: "根据技术方案实施任务并输出报告"
|
|
|
81
81
|
获取当前时间:
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
84
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
85
85
|
```
|
|
86
86
|
|
|
87
87
|
更新 `.agents/workspace/active/{task-id}/task.md`:
|
|
@@ -91,7 +91,7 @@ date "+%Y-%m-%d %H:%M:%S"
|
|
|
91
91
|
- 审查 `## 需求` 段落,仅把本轮已由代码实现且有测试通过支撑的条目从 `- [ ]` 勾为 `- [x]`
|
|
92
92
|
- 记录 Round `{implementation-round}` 的 `{implementation-artifact}`
|
|
93
93
|
- 追加:
|
|
94
|
-
`- {
|
|
94
|
+
`- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Implementation (Round {N})** by {agent} — Code implemented, {n} files modified, {n} tests passed → {implementation-artifact}`
|
|
95
95
|
|
|
96
96
|
如果 task.md 中存在有效的 `issue_number`,执行以下同步操作(任一失败则跳过并继续;执行前先读取 `.agents/rules/issue-sync.md`):
|
|
97
97
|
- 设置 `status: in-progress`,并按 `.agents/rules/issue-sync.md` 的 `in:` label 同步规则,基于分支改动精修 `in:` label(有映射时可增可删,无映射时仅补充)
|
|
@@ -47,13 +47,13 @@ tool: <tool-name>
|
|
|
47
47
|
Get the current time:
|
|
48
48
|
|
|
49
49
|
```bash
|
|
50
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
50
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
Update task.md: `current_step` -> `requirement-analysis`.
|
|
54
54
|
- **Append** to `## Activity Log` (do NOT overwrite previous entries):
|
|
55
55
|
```
|
|
56
|
-
- {
|
|
56
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Import Code Scanning Alert** by {agent} — Code Scanning alert #{alert-number} imported
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
### 4. Verification Gate
|
|
@@ -47,13 +47,13 @@ tool: <tool-name>
|
|
|
47
47
|
获取当前时间:
|
|
48
48
|
|
|
49
49
|
```bash
|
|
50
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
50
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
更新 task.md:`current_step` -> `requirement-analysis`。
|
|
54
54
|
- **追加**到 `## Activity Log`(不要覆盖之前的记录):
|
|
55
55
|
```
|
|
56
|
-
- {
|
|
56
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Import Code Scanning Alert** by {agent} — Code Scanning alert #{alert-number} imported
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
### 4. 完成校验
|
|
@@ -48,13 +48,13 @@ ghsa_id: <GHSA-ID>
|
|
|
48
48
|
Get the current time:
|
|
49
49
|
|
|
50
50
|
```bash
|
|
51
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
51
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
52
52
|
```
|
|
53
53
|
|
|
54
54
|
Update task.md: `current_step` -> `requirement-analysis`.
|
|
55
55
|
- **Append** to `## Activity Log` (do NOT overwrite previous entries):
|
|
56
56
|
```
|
|
57
|
-
- {
|
|
57
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Import Dependabot Alert** by {agent} — Dependabot alert #{alert-number} imported
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
### 4. Verification Gate
|
|
@@ -48,13 +48,13 @@ ghsa_id: <GHSA-ID>
|
|
|
48
48
|
获取当前时间:
|
|
49
49
|
|
|
50
50
|
```bash
|
|
51
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
51
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
52
52
|
```
|
|
53
53
|
|
|
54
54
|
更新 task.md:`current_step` -> `requirement-analysis`。
|
|
55
55
|
- **追加**到 `## Activity Log`(不要覆盖之前的记录):
|
|
56
56
|
```
|
|
57
|
-
- {
|
|
57
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Import Dependabot Alert** by {agent} — Dependabot alert #{alert-number} imported
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
### 4. 完成校验
|
|
@@ -45,8 +45,8 @@ type: feature|bugfix|refactor|docs|chore
|
|
|
45
45
|
branch: <project>-<type>-<slug>
|
|
46
46
|
workflow: feature-development|bug-fix|refactoring
|
|
47
47
|
status: active
|
|
48
|
-
created_at: {
|
|
49
|
-
updated_at: {
|
|
48
|
+
created_at: {YYYY-MM-DD HH:mm:ss±HH:MM}
|
|
49
|
+
updated_at: {YYYY-MM-DD HH:mm:ss±HH:MM}
|
|
50
50
|
created_by: human
|
|
51
51
|
current_step: requirement-analysis
|
|
52
52
|
assigned_to: {current AI agent}
|
|
@@ -57,7 +57,7 @@ assigned_to: {current AI agent}
|
|
|
57
57
|
Get the current time:
|
|
58
58
|
|
|
59
59
|
```bash
|
|
60
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
60
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
61
61
|
```
|
|
62
62
|
|
|
63
63
|
Update `.agents/workspace/active/{task-id}/task.md`:
|
|
@@ -67,7 +67,7 @@ Update `.agents/workspace/active/{task-id}/task.md`:
|
|
|
67
67
|
- `## Context` -> `- **Branch**:`: update it to the generated branch name
|
|
68
68
|
- **Append** to `## Activity Log` (do NOT overwrite previous entries):
|
|
69
69
|
```
|
|
70
|
-
- {
|
|
70
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Import Issue** by {agent} — Issue #{number} imported
|
|
71
71
|
```
|
|
72
72
|
|
|
73
73
|
### 5. Assign the Issue Assignee
|
|
@@ -45,8 +45,8 @@ type: feature|bugfix|refactor|docs|chore
|
|
|
45
45
|
branch: <project>-<type>-<slug>
|
|
46
46
|
workflow: feature-development|bug-fix|refactoring
|
|
47
47
|
status: active
|
|
48
|
-
created_at: {
|
|
49
|
-
updated_at: {
|
|
48
|
+
created_at: {YYYY-MM-DD HH:mm:ss±HH:MM}
|
|
49
|
+
updated_at: {YYYY-MM-DD HH:mm:ss±HH:MM}
|
|
50
50
|
created_by: human
|
|
51
51
|
current_step: requirement-analysis
|
|
52
52
|
assigned_to: {当前 AI 代理}
|
|
@@ -57,7 +57,7 @@ assigned_to: {当前 AI 代理}
|
|
|
57
57
|
获取当前时间:
|
|
58
58
|
|
|
59
59
|
```bash
|
|
60
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
60
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
61
61
|
```
|
|
62
62
|
|
|
63
63
|
更新 `.agents/workspace/active/{task-id}/task.md`:
|
|
@@ -67,7 +67,7 @@ date "+%Y-%m-%d %H:%M:%S"
|
|
|
67
67
|
- `## 上下文` 中的 `- **分支**:`:更新为生成的分支名
|
|
68
68
|
- **追加**到 `## Activity Log`(不要覆盖之前的记录):
|
|
69
69
|
```
|
|
70
|
-
- {
|
|
70
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Import Issue** by {agent} — Issue #{number} imported
|
|
71
71
|
```
|
|
72
72
|
|
|
73
73
|
### 5. 分配 Issue Assignee
|
|
@@ -81,7 +81,7 @@ Create `.agents/workspace/active/{task-id}/{plan-artifact}`.
|
|
|
81
81
|
Get the current time:
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
84
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
85
85
|
```
|
|
86
86
|
|
|
87
87
|
Update `.agents/workspace/active/{task-id}/task.md`:
|
|
@@ -93,7 +93,7 @@ Update `.agents/workspace/active/{task-id}/task.md`:
|
|
|
93
93
|
- Mark technical-design as complete in workflow progress and include the actual round when the task template supports it
|
|
94
94
|
- **Append** to `## Activity Log` (do NOT overwrite previous entries):
|
|
95
95
|
```
|
|
96
|
-
- {
|
|
96
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Technical Design (Round {N})** by {agent} — Plan completed, awaiting human review → {artifact-filename}
|
|
97
97
|
```
|
|
98
98
|
|
|
99
99
|
If task.md contains a valid `issue_number`, perform these sync actions (skip and continue on any failure):
|
|
@@ -81,7 +81,7 @@ description: "为任务设计技术方案和实施计划"
|
|
|
81
81
|
获取当前时间:
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
84
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
85
85
|
```
|
|
86
86
|
|
|
87
87
|
更新 `.agents/workspace/active/{task-id}/task.md`:
|
|
@@ -93,7 +93,7 @@ date "+%Y-%m-%d %H:%M:%S"
|
|
|
93
93
|
- 在工作流进度中标记 technical-design 为已完成,并注明实际轮次(如果任务模板支持)
|
|
94
94
|
- **追加**到 `## Activity Log`(不要覆盖之前的记录):
|
|
95
95
|
```
|
|
96
|
-
- {
|
|
96
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Technical Design (Round {N})** by {agent} — Plan completed, awaiting human review → {artifact-filename}
|
|
97
97
|
```
|
|
98
98
|
|
|
99
99
|
如果 task.md 中存在有效的 `issue_number`,执行以下同步操作(任一失败则跳过并继续):
|
|
@@ -51,13 +51,13 @@ Create `.agents/workspace/active/{task-id}/{refinement-artifact}`.
|
|
|
51
51
|
Get the current time:
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
54
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
Update task.md:
|
|
58
58
|
- review the `## Requirements` section and only change items from `- [ ]` to `- [x]` when they are newly satisfied by this round's fixes and passing tests
|
|
59
59
|
- append:
|
|
60
|
-
`- {
|
|
60
|
+
`- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Refinement (Round {N}, for {review-artifact})** by {agent} — Fixed {n} blockers, {n} major, {n} minor issues → {refinement-artifact}`
|
|
61
61
|
|
|
62
62
|
If task.md contains a valid `issue_number`, perform these sync actions (skip and continue on any failure):
|
|
63
63
|
- Read `.agents/rules/issue-sync.md` before syncing
|
|
@@ -51,13 +51,13 @@ description: "处理代码审查反馈并修复问题"
|
|
|
51
51
|
获取当前时间:
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
54
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
更新 task.md:
|
|
58
58
|
- 审查 `## 需求` 段落,仅把因本轮修复而新满足且有测试通过支撑的条目从 `- [ ]` 勾为 `- [x]`
|
|
59
59
|
- 追加:
|
|
60
|
-
`- {
|
|
60
|
+
`- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Refinement (Round {N}, for {review-artifact})** by {agent} — Fixed {n} blockers, {n} major, {n} minor issues → {refinement-artifact}`
|
|
61
61
|
|
|
62
62
|
如果 task.md 中存在有效的 `issue_number`,执行以下同步操作(任一失败则跳过并继续):
|
|
63
63
|
- 执行前先读取 `.agents/rules/issue-sync.md`
|
|
@@ -81,7 +81,7 @@ Write only files that were actually recovered from Issue comments. Do not invent
|
|
|
81
81
|
Get the current time:
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
84
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
85
85
|
```
|
|
86
86
|
|
|
87
87
|
Update the restored `task.md`:
|
|
@@ -91,7 +91,7 @@ Update the restored `task.md`:
|
|
|
91
91
|
- keep the original `current_step`
|
|
92
92
|
- append this entry to `## Activity Log`:
|
|
93
93
|
```
|
|
94
|
-
- {
|
|
94
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Restore Task** by {agent} — Restored task from Issue #{issue-number}
|
|
95
95
|
```
|
|
96
96
|
|
|
97
97
|
### 7. Verification Gate
|
|
@@ -81,7 +81,7 @@ description: "从平台 Issue 评论还原本地任务文件"
|
|
|
81
81
|
获取当前时间:
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
84
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
85
85
|
```
|
|
86
86
|
|
|
87
87
|
更新恢复出的 `task.md`:
|
|
@@ -91,7 +91,7 @@ date "+%Y-%m-%d %H:%M:%S"
|
|
|
91
91
|
- 保留原 `current_step`
|
|
92
92
|
- 在 `## 活动日志` 追加:
|
|
93
93
|
```
|
|
94
|
-
- {
|
|
94
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Restore Task** by {agent} — Restored task from Issue #{issue-number}
|
|
95
95
|
```
|
|
96
96
|
|
|
97
97
|
### 7. 完成校验
|
|
@@ -47,11 +47,11 @@ Create `.agents/workspace/active/{task-id}/{review-artifact}`.
|
|
|
47
47
|
Get the current time:
|
|
48
48
|
|
|
49
49
|
```bash
|
|
50
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
50
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
Update task.md and append:
|
|
54
|
-
`- {
|
|
54
|
+
`- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Code Review (Round {N})** by {agent} — Verdict: {Approved/Changes Requested/Rejected}, blockers: {n}, major: {n}, minor: {n} → {artifact-filename}`
|
|
55
55
|
|
|
56
56
|
If task.md contains a valid `issue_number`, perform these sync actions (skip and continue on any failure):
|
|
57
57
|
- Read `.agents/rules/issue-sync.md` before syncing
|
|
@@ -47,11 +47,11 @@ description: "审查任务实现并输出代码审查报告"
|
|
|
47
47
|
获取当前时间:
|
|
48
48
|
|
|
49
49
|
```bash
|
|
50
|
-
date "+%Y-%m-%d %H:%M:%S"
|
|
50
|
+
date "+%Y-%m-%d %H:%M:%S%:z"
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
更新 task.md,并追加:
|
|
54
|
-
`- {
|
|
54
|
+
`- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Code Review (Round {N})** by {agent} — Verdict: {Approved/Changes Requested/Rejected}, blockers: {n}, major: {n}, minor: {n} → {artifact-filename}`
|
|
55
55
|
|
|
56
56
|
如果 task.md 中存在有效的 `issue_number`,执行以下同步操作(任一失败则跳过并继续):
|
|
57
57
|
- 执行前先读取 `.agents/rules/issue-sync.md`
|
|
@@ -76,7 +76,7 @@ const DEFAULTS = {
|
|
|
76
76
|
}
|
|
77
77
|
};
|
|
78
78
|
|
|
79
|
-
const INSTALLER_VERSION = "v0.5.
|
|
79
|
+
const INSTALLER_VERSION = "v0.5.3";
|
|
80
80
|
const PACKAGE_NAME = '@fitlab-ai/agent-infra';
|
|
81
81
|
// Add a new identifier here only after shipping matching .{platform}. template variants.
|
|
82
82
|
const KNOWN_PLATFORMS = new Set(['github']);
|
|
@@ -4,8 +4,8 @@ type: feature # feature | bugfix | refactor | docs | review
|
|
|
4
4
|
branch: "" # <project>-<type>-<slug>
|
|
5
5
|
workflow: feature-development # feature-development | bug-fix | code-review | refactoring
|
|
6
6
|
status: open # open | in-progress | review | blocked | completed
|
|
7
|
-
created_at: YYYY-MM-
|
|
8
|
-
updated_at: YYYY-MM-
|
|
7
|
+
created_at: YYYY-MM-DDTHH:mm:ss±HH:MM
|
|
8
|
+
updated_at: YYYY-MM-DDTHH:mm:ss±HH:MM
|
|
9
9
|
current_step: analysis # analysis | design | implementation | review | fix | commit
|
|
10
10
|
assigned_to: "" # claude | codex | gemini | opencode | human
|
|
11
11
|
---
|
|
@@ -50,7 +50,7 @@ assigned_to: "" # claude | codex | gemini | opencode | human
|
|
|
50
50
|
## Activity Log
|
|
51
51
|
|
|
52
52
|
<!-- Append a new entry for each workflow step. Do NOT overwrite previous entries. -->
|
|
53
|
-
<!-- Format: - {
|
|
53
|
+
<!-- Format: - {YYYY-MM-DD HH:mm:ss±HH:MM} — **{step}** by {agent} — {brief summary} -->
|
|
54
54
|
|
|
55
55
|
## Completion Checklist
|
|
56
56
|
|
|
@@ -4,8 +4,8 @@ type: feature # feature | bugfix | refactor | docs | review
|
|
|
4
4
|
branch: "" # <project>-<type>-<slug>
|
|
5
5
|
workflow: feature-development # feature-development | bug-fix | code-review | refactoring
|
|
6
6
|
status: open # open | in-progress | review | blocked | completed
|
|
7
|
-
created_at: YYYY-MM-
|
|
8
|
-
updated_at: YYYY-MM-
|
|
7
|
+
created_at: YYYY-MM-DDTHH:mm:ss±HH:MM
|
|
8
|
+
updated_at: YYYY-MM-DDTHH:mm:ss±HH:MM
|
|
9
9
|
current_step: analysis # analysis | design | implementation | review | fix | commit
|
|
10
10
|
assigned_to: "" # claude | codex | gemini | opencode | human
|
|
11
11
|
---
|
|
@@ -50,7 +50,7 @@ assigned_to: "" # claude | codex | gemini | opencode | human
|
|
|
50
50
|
## 活动日志
|
|
51
51
|
|
|
52
52
|
<!-- 每个工作流步骤追加一条新记录,不要覆盖之前的记录。 -->
|
|
53
|
-
<!-- 格式:- {
|
|
53
|
+
<!-- 格式:- {YYYY-MM-DD HH:mm:ss±HH:MM} — **{步骤}** by {执行者} — {简要说明} -->
|
|
54
54
|
|
|
55
55
|
## 完成检查清单
|
|
56
56
|
|