@zeyue0329/xiaoma-cli 1.15.1 → 1.16.1-next.0
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/package.json +1 -1
- package/src/xmc-skills/4-implementation/xiaoma-agent-dev/customize.toml +10 -0
- package/src/xmc-skills/4-implementation/xiaoma-bug-resolve/SKILL.md +6 -0
- package/src/xmc-skills/4-implementation/xiaoma-bug-resolve/customize.toml +67 -0
- package/src/xmc-skills/4-implementation/xiaoma-bug-resolve/workflow.md +265 -0
- package/src/xmc-skills/4-implementation/xiaoma-bug-resolve-batch/SKILL.md +6 -0
- package/src/xmc-skills/4-implementation/xiaoma-bug-resolve-batch/customize.toml +34 -0
- package/src/xmc-skills/4-implementation/xiaoma-bug-resolve-batch/workflow.md +277 -0
- package/src/xmc-skills/module-help.csv +3 -1
package/package.json
CHANGED
|
@@ -129,3 +129,13 @@ skill = "xiaoma-auto-full-pipeline"
|
|
|
129
129
|
code = "APS"
|
|
130
130
|
description = "Auto PRD-to-Stories: from an existing prd.md, generate epics + per-story detailed files"
|
|
131
131
|
skill = "xiaoma-auto-prd-to-stories"
|
|
132
|
+
|
|
133
|
+
[[agent.menu]]
|
|
134
|
+
code = "BR"
|
|
135
|
+
description = "Resolve a single bug end-to-end: intake, root-cause, fix, verify, close with a fix report"
|
|
136
|
+
skill = "xiaoma-bug-resolve"
|
|
137
|
+
|
|
138
|
+
[[agent.menu]]
|
|
139
|
+
code = "BB"
|
|
140
|
+
description = "Bug Resolve Batch: drain ALL pending bugs from the queue using Agent subprocess isolation"
|
|
141
|
+
skill = "xiaoma-bug-resolve-batch"
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: xiaoma-bug-resolve
|
|
3
|
+
description: "Resolve a single bug end-to-end: intake from a defect platform, a bug-queue file, or the user's description; root-cause analysis; real-defect vs false-positive verdict; minimal-scope fix; verification with tests or browser automation; fix report plus status write-back. Use when the user says 'resolve bug', 'fix bug', 'fix test bug', 'BR', or '处理bug'."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Follow the instructions in [workflow.md](workflow.md).
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# DO NOT EDIT -- overwritten on every update.
|
|
2
|
+
#
|
|
3
|
+
# Workflow customization surface for xiaoma-bug-resolve. Mirrors the
|
|
4
|
+
# agent customization shape under the [workflow] namespace.
|
|
5
|
+
# Override in {project-root}/_xiaoma/custom/xiaoma-bug-resolve.toml
|
|
6
|
+
# (team, committed) or xiaoma-bug-resolve.user.toml (personal).
|
|
7
|
+
|
|
8
|
+
[workflow]
|
|
9
|
+
|
|
10
|
+
# --- Configurable below. Overrides merge per XiaoMa structural rules: ---
|
|
11
|
+
# scalars: override wins • arrays (persistent_facts, activation_steps_*): append
|
|
12
|
+
# arrays-of-tables with `code`/`id`: replace matching items, append new ones.
|
|
13
|
+
|
|
14
|
+
# Steps to run before the standard activation (config load, source resolution).
|
|
15
|
+
# Overrides append. Use for pre-flight loads, compliance checks, etc.
|
|
16
|
+
|
|
17
|
+
activation_steps_prepend = []
|
|
18
|
+
|
|
19
|
+
# Steps to run after activation but before the workflow begins.
|
|
20
|
+
# Overrides append.
|
|
21
|
+
|
|
22
|
+
activation_steps_append = []
|
|
23
|
+
|
|
24
|
+
# Persistent facts the workflow keeps in mind for the whole run: coding
|
|
25
|
+
# standards, architecture constraints, known fragile areas. Each entry is
|
|
26
|
+
# either a literal sentence or a `file:` reference (globs supported).
|
|
27
|
+
# Overrides append.
|
|
28
|
+
|
|
29
|
+
persistent_facts = [
|
|
30
|
+
"file:{project-root}/**/project-context.md",
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
# Bug intake source. "auto" picks: platform when platform_spec is non-empty,
|
|
34
|
+
# else file when bug_list_file exists, else interactive.
|
|
35
|
+
# Explicit values: "interactive" | "file" | "platform"
|
|
36
|
+
|
|
37
|
+
bug_source = "auto"
|
|
38
|
+
|
|
39
|
+
# File mode: the bug-queue file (format: see workflow.md appendix).
|
|
40
|
+
|
|
41
|
+
bug_list_file = "{implementation_artifacts}/bug-queue.md"
|
|
42
|
+
|
|
43
|
+
# Platform mode: free-form instructions teaching the workflow how to operate
|
|
44
|
+
# your defect platform (queue query, detail fetch, status write-back, scope
|
|
45
|
+
# filter, data-verification tools). Contract and a complete MySQL-MCP example:
|
|
46
|
+
# workflow.md appendix "Platform Spec Contract".
|
|
47
|
+
|
|
48
|
+
platform_spec = ""
|
|
49
|
+
|
|
50
|
+
# Frontend base URL for browser-automation verification of interaction bugs.
|
|
51
|
+
# Can also be passed per-run as a `testUrl=...` arg. Empty = ask when needed.
|
|
52
|
+
|
|
53
|
+
test_url = ""
|
|
54
|
+
|
|
55
|
+
# Max fix-verify iterations before halting with a report.
|
|
56
|
+
|
|
57
|
+
max_fix_iterations = 3
|
|
58
|
+
|
|
59
|
+
# Subdirectory under {implementation_artifacts} where fix reports land.
|
|
60
|
+
|
|
61
|
+
fix_report_subdir = "bug-fixes"
|
|
62
|
+
|
|
63
|
+
# Executed after the closure summary. Override wins. Use for post-fix
|
|
64
|
+
# automation: notify a channel, link the report to a ticket, trigger CI.
|
|
65
|
+
# Leave empty for no custom post-completion behavior.
|
|
66
|
+
|
|
67
|
+
on_complete = ""
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bug-resolve
|
|
3
|
+
description: "Single-bug resolution workflow: intake from a defect platform, a bug-queue file, or the user's description; root-cause analysis; real-defect vs false-positive verdict; minimal-scope fix; verification; fix report and status write-back."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Bug Resolve Workflow
|
|
7
|
+
|
|
8
|
+
**Goal:** Take ONE bug from intake to closure — locate the root cause, judge whether it is a real defect or a false positive,
|
|
9
|
+
apply a minimal-scope fix, verify it, write a fix report, and update the bug's status at its source.
|
|
10
|
+
|
|
11
|
+
**Your Role:** You are a senior full-stack engineer handling defect resolution. You pinpoint root causes precisely, write
|
|
12
|
+
surgical fixes, and prove them with verification evidence. You never guess: every verdict cites `path:line` evidence.
|
|
13
|
+
|
|
14
|
+
- Communicate all responses in {communication_language} and generate all documents in {document_output_language}
|
|
15
|
+
- The user invoked this skill to get a bug FIXED. Present your analysis, then proceed to the fix without waiting for
|
|
16
|
+
ceremony — pause only at the decision points marked below
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## INITIALIZATION
|
|
21
|
+
|
|
22
|
+
### Resolve the Workflow Block
|
|
23
|
+
|
|
24
|
+
Run: `node {project-root}/_xiaoma/scripts/resolve_customization.js --skill {skill-root} --key workflow`
|
|
25
|
+
|
|
26
|
+
If the script fails, perform the merge manually: read `{skill-root}/customize.toml`, then overlay
|
|
27
|
+
`{project-root}/_xiaoma/custom/xiaoma-bug-resolve.toml` and `xiaoma-bug-resolve.user.toml` (scalars: override wins;
|
|
28
|
+
arrays: append).
|
|
29
|
+
|
|
30
|
+
Then:
|
|
31
|
+
|
|
32
|
+
1. Execute each entry in `{workflow.activation_steps_prepend}` in order.
|
|
33
|
+
2. Treat each entry in `{workflow.persistent_facts}` as foundational context. `file:` prefixes are paths or globs under
|
|
34
|
+
`{project-root}` (load contents); other entries are facts verbatim.
|
|
35
|
+
3. Execute each entry in `{workflow.activation_steps_append}` in order.
|
|
36
|
+
|
|
37
|
+
### Load Config
|
|
38
|
+
|
|
39
|
+
Load `{project-root}/_xiaoma/xmc/config.yaml` and resolve: `user_name`, `communication_language`,
|
|
40
|
+
`document_output_language`, `implementation_artifacts`, `project_knowledge`, and `date` as system-generated current
|
|
41
|
+
datetime. If `{implementation_artifacts}` is unresolved, fall back to `.` (the project root) and surface the fallback.
|
|
42
|
+
|
|
43
|
+
Set `{max_fix_iterations}` = `{workflow.max_fix_iterations}` (default 3) and `{fix_report_dir}` =
|
|
44
|
+
`{implementation_artifacts}/{workflow.fix_report_subdir}`. Initialize `fix_iteration` = 0.
|
|
45
|
+
|
|
46
|
+
### Resolve the Bug Source Mode
|
|
47
|
+
|
|
48
|
+
Determine `{bug_source}` from `{workflow.bug_source}`:
|
|
49
|
+
|
|
50
|
+
- `"platform"` — an external defect platform operated per `{workflow.platform_spec}` (see the Platform Spec Contract
|
|
51
|
+
appendix). If the spec is empty, HALT: "bug_source is 'platform' but platform_spec is empty — configure it in
|
|
52
|
+
`_xiaoma/custom/xiaoma-bug-resolve.toml`."
|
|
53
|
+
- `"file"` — a bug-queue file at `{workflow.bug_list_file}` (see the Bug-Queue File Format appendix). If the file does
|
|
54
|
+
not exist, fall through to `interactive` and tell the user which path was checked.
|
|
55
|
+
- `"interactive"` — the bug comes from the user: their description, an error log, a stack trace, or an issue reference.
|
|
56
|
+
- `"auto"` (default) — pick the first that applies: `platform_spec` non-empty → `platform`; `{workflow.bug_list_file}`
|
|
57
|
+
exists → `file`; otherwise → `interactive`.
|
|
58
|
+
|
|
59
|
+
### Parse Args
|
|
60
|
+
|
|
61
|
+
Optional args: a bug ID (platform/file mode — resolve that specific bug instead of the oldest pending one) or free text
|
|
62
|
+
(interactive mode — treat as the bug description). `testUrl=...` and `authToken=...` tokens override
|
|
63
|
+
`{workflow.test_url}` and supply credentials for browser verification.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## WORKFLOW
|
|
68
|
+
|
|
69
|
+
<workflow>
|
|
70
|
+
|
|
71
|
+
<step n="1" goal="Intake: acquire exactly one bug and its complete context">
|
|
72
|
+
|
|
73
|
+
**Platform mode:** Query the pending-bug queue per the platform spec (apply the spec's scope filter if it declares
|
|
74
|
+
one). Pick the bug matching the args bug ID, or the oldest pending bug. Fetch its full record. If the queue is empty,
|
|
75
|
+
tell the user there is nothing to process and stop.
|
|
76
|
+
|
|
77
|
+
**File mode:** Parse `{workflow.bug_list_file}`. Pick the entry matching the args bug ID, or the first entry with
|
|
78
|
+
status `pending`. If none, tell the user the queue is empty and stop.
|
|
79
|
+
|
|
80
|
+
**Interactive mode:** Collect from args and conversation: symptom description, reproduction steps, expected vs actual
|
|
81
|
+
behavior, error logs / stack traces / failing test names, affected page or module. Ask only for what is missing and
|
|
82
|
+
truly needed to start.
|
|
83
|
+
|
|
84
|
+
Output a bug summary: ID (or a short slug agreed with the user), title, severity (if known), type (frontend / backend /
|
|
85
|
+
data / infra), reproduction steps, error evidence.
|
|
86
|
+
|
|
87
|
+
Set `{slug}` = the bug ID when one exists, otherwise a short descriptive name, sanitized to lowercase alphanumeric with
|
|
88
|
+
hyphens.
|
|
89
|
+
|
|
90
|
+
</step>
|
|
91
|
+
|
|
92
|
+
<step n="2" goal="Root-cause analysis and verdict">
|
|
93
|
+
|
|
94
|
+
1. Map the bug to code regions using every available signal: module / page URL → component or route; stack trace →
|
|
95
|
+
exact file and line; failing API → controller / service / data access chain; error text → grep target.
|
|
96
|
+
2. Explore in parallel (use Explore subagents for broad sweeps; keep raw file dumps out of the main context): the
|
|
97
|
+
implicated frontend components, the backend call chain, recent `git log` for the touched area, and existing tests
|
|
98
|
+
covering it.
|
|
99
|
+
3. Reproduce when feasible: a failing test, a script, or browser automation against `{test_url}` following the
|
|
100
|
+
reproduction steps. A confirmed reproduction upgrades the verdict's confidence; say so when reproduction is not
|
|
101
|
+
feasible.
|
|
102
|
+
4. Reach ONE verdict:
|
|
103
|
+
- **Real defect** — the code is wrong; cite the defective `path:line` and explain the mechanism.
|
|
104
|
+
- **False positive** — the code is correct; the report stems from a wrong test expectation, bad test data, or an
|
|
105
|
+
environment issue. Cite the evidence proving correctness.
|
|
106
|
+
- **Need more info** — state exactly what evidence is missing and how to obtain it. In interactive use, ask the
|
|
107
|
+
user. When running as a delegated subprocess (batch mode), do NOT guess: report verdict `blocked` and stop.
|
|
108
|
+
5. Present the verdict: root cause (`path:line`), mechanism, and — for real defects — the fix plan (files to change and
|
|
109
|
+
how). For false positives, skip to Step 5.
|
|
110
|
+
|
|
111
|
+
</step>
|
|
112
|
+
|
|
113
|
+
<step n="3" goal="Fix (real defects only)">
|
|
114
|
+
|
|
115
|
+
- Apply the fix with Edit, strictly scoped to the defect: no drive-by refactoring, no unrelated cleanup.
|
|
116
|
+
- Follow the project's conventions: CLAUDE.md, `project-context.md`, and `{workflow.persistent_facts}`.
|
|
117
|
+
- When the project has a test setup, add or extend a regression test that fails on the old code and passes on the fix.
|
|
118
|
+
- List every modified file with a one-line summary of the change.
|
|
119
|
+
|
|
120
|
+
</step>
|
|
121
|
+
|
|
122
|
+
<step n="4" goal="Verify the fix">
|
|
123
|
+
|
|
124
|
+
Run every verification lane that applies, in this order:
|
|
125
|
+
|
|
126
|
+
1. **Tests** — discover the project's test command (package.json scripts, Makefile, CI config, project-context.md) and
|
|
127
|
+
run the suite scoped to the affected area, plus the new regression test.
|
|
128
|
+
2. **Data layer** — if the fix changes a query or data logic and the platform spec declares a data-verification tool,
|
|
129
|
+
execute the corrected logic through it and compare against expectations.
|
|
130
|
+
3. **Browser** — for bugs involving page interaction, when `{test_url}` is configured or provided: drive the page with
|
|
131
|
+
the available browser automation tooling (Playwright MCP or equivalent), follow the original reproduction steps, and
|
|
132
|
+
confirm the expected behavior. If the bug is interaction-related but no `{test_url}` is available, ask for it once
|
|
133
|
+
(interactive) or record the gap (batch); never block on it.
|
|
134
|
+
4. If nothing can be executed locally (no test setup, no URL, no data tool), say so explicitly and downgrade the
|
|
135
|
+
closure claim to "fix applied, verification pending deployment".
|
|
136
|
+
|
|
137
|
+
If verification FAILS: return to Step 3 with the failure evidence. Increment `fix_iteration`; when it exceeds
|
|
138
|
+
`{max_fix_iterations}`, HALT — present the remaining failure, the attempts made, and hand back to the user (interactive)
|
|
139
|
+
or report verdict `failed` (batch).
|
|
140
|
+
|
|
141
|
+
Summarize the verification evidence: commands run, results, screenshots or response snippets where relevant.
|
|
142
|
+
|
|
143
|
+
</step>
|
|
144
|
+
|
|
145
|
+
<step n="5" goal="Close: fix report and status write-back">
|
|
146
|
+
|
|
147
|
+
1. Write the fix report to `{fix_report_dir}/{slug}-fix.md` (create the directory if needed):
|
|
148
|
+
|
|
149
|
+
```markdown
|
|
150
|
+
# Bug Fix Report: {slug}
|
|
151
|
+
|
|
152
|
+
| Field | Value |
|
|
153
|
+
| --- | --- |
|
|
154
|
+
| Bug ID / Title | ... |
|
|
155
|
+
| Source | platform / file / interactive |
|
|
156
|
+
| Verdict | real-defect / false-positive |
|
|
157
|
+
| Severity | ... |
|
|
158
|
+
| Date | {date} |
|
|
159
|
+
|
|
160
|
+
## Root Cause
|
|
161
|
+
|
|
162
|
+
{mechanism, defective path:line citations}
|
|
163
|
+
|
|
164
|
+
## Fix
|
|
165
|
+
|
|
166
|
+
{modified files with per-file change summary; regression test added}
|
|
167
|
+
|
|
168
|
+
## Verification
|
|
169
|
+
|
|
170
|
+
{lanes run and their evidence; explicit gaps if any}
|
|
171
|
+
|
|
172
|
+
## Residual Risk / Follow-ups
|
|
173
|
+
|
|
174
|
+
{anything the next engineer should know; empty if none}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
For false positives, the Fix section instead documents why the code is correct and what in the report was wrong
|
|
178
|
+
(test expectation, data, environment).
|
|
179
|
+
|
|
180
|
+
2. Write the status back to the source:
|
|
181
|
+
- **Platform mode:** execute the spec's status write-back — `fixed` for verified real defects, `false-positive` for
|
|
182
|
+
misreports. Re-query to confirm the update took effect.
|
|
183
|
+
- **File mode:** update the bug's entry in `{workflow.bug_list_file}` — status to `fixed` or `false-positive`, plus
|
|
184
|
+
the report path.
|
|
185
|
+
- **Interactive mode:** nothing to write back; the report is the artifact.
|
|
186
|
+
|
|
187
|
+
3. Output the closure summary: verdict, modified files, verification result, report path.
|
|
188
|
+
|
|
189
|
+
4. **Platform / file mode:** report how many pending bugs remain. If more than one remains, mention that
|
|
190
|
+
`xiaoma-bug-resolve-batch` (menu code BB) can drain the whole queue automatically.
|
|
191
|
+
|
|
192
|
+
5. Execute `{workflow.on_complete}` if non-empty.
|
|
193
|
+
|
|
194
|
+
</step>
|
|
195
|
+
|
|
196
|
+
</workflow>
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Appendix: Platform Spec Contract
|
|
201
|
+
|
|
202
|
+
`{workflow.platform_spec}` is a free-form instruction block (TOML multi-line string) that teaches this workflow how to
|
|
203
|
+
operate your defect platform through the tools available in the session (typically MCP tools). A usable spec answers:
|
|
204
|
+
|
|
205
|
+
1. **Queue query** — how to list pending bugs, oldest first: exact tool name plus the query or call template.
|
|
206
|
+
2. **Detail fetch** — how to fetch one bug's complete record by ID, and what the key fields mean (title, reproduction
|
|
207
|
+
steps, error logs, module, page URL, severity).
|
|
208
|
+
3. **Status write-back** — how to mark a bug `fixed` and `false-positive` (and any other states the platform tracks).
|
|
209
|
+
4. **Scope filter** *(optional)* — the field that isolates this project's bugs when the platform hosts several projects
|
|
210
|
+
(e.g. a JIRA project ID). If batch processing MUST be scope-filtered, the spec must say "scope is REQUIRED" — the
|
|
211
|
+
batch scheduler enforces it.
|
|
212
|
+
5. **Data verification** *(optional)* — extra tools for verifying business data while reproducing or verifying (e.g. a
|
|
213
|
+
business-database query tool).
|
|
214
|
+
|
|
215
|
+
### Example: an AI-test-platform defect library over a MySQL MCP tool
|
|
216
|
+
|
|
217
|
+
```toml
|
|
218
|
+
platform_spec = """
|
|
219
|
+
Defect platform: AI test platform, MySQL defect library via the `mcp__dev-mysql__mysql_query` tool.
|
|
220
|
+
Table `t_defect_info`; status enum: 0=new, 1=verified, 2=fixed, 3=false-positive; soft delete flag `is_del`.
|
|
221
|
+
Scope is REQUIRED for batch: every SELECT/UPDATE/COUNT must carry AND jira_id = '<scope>' (JIRA project ID).
|
|
222
|
+
|
|
223
|
+
Queue query (oldest first):
|
|
224
|
+
SELECT defect_id, title, severity, defect_type, module_path, discover_time
|
|
225
|
+
FROM t_defect_info WHERE is_del = 0 AND defect_status = 0 [AND jira_id = '<scope>']
|
|
226
|
+
ORDER BY create_time ASC;
|
|
227
|
+
|
|
228
|
+
Detail fetch:
|
|
229
|
+
SELECT * FROM t_defect_info WHERE defect_id = '<id>' AND is_del = 0;
|
|
230
|
+
Key fields: steps (reproduction), error_front (frontend log), error_apis (API errors), url (page).
|
|
231
|
+
|
|
232
|
+
Status write-back (re-select afterwards to confirm):
|
|
233
|
+
fixed: UPDATE t_defect_info SET defect_status = 2 WHERE defect_id = '<id>' [AND jira_id = '<scope>'] AND is_del = 0;
|
|
234
|
+
false-positive: UPDATE t_defect_info SET defect_status = 3 WHERE defect_id = '<id>' [AND jira_id = '<scope>'] AND is_del = 0;
|
|
235
|
+
|
|
236
|
+
Data verification: business Oracle DB via `mcp__business-oracle__execute_query` for validating query logic and data.
|
|
237
|
+
"""
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Adapt tool names, table, and fields to your environment; paste the result into
|
|
241
|
+
`{project-root}/_xiaoma/custom/xiaoma-bug-resolve.toml` under `[workflow]`.
|
|
242
|
+
|
|
243
|
+
## Appendix: Bug-Queue File Format
|
|
244
|
+
|
|
245
|
+
`{workflow.bug_list_file}` is a markdown file owned by the team — any tracker export or hand-written list works. One
|
|
246
|
+
`##` section per bug:
|
|
247
|
+
|
|
248
|
+
```markdown
|
|
249
|
+
# Bug Queue
|
|
250
|
+
|
|
251
|
+
## BUG-001: Search returns no results for partial keywords
|
|
252
|
+
|
|
253
|
+
- status: pending <!-- pending | fixed | false-positive | blocked -->
|
|
254
|
+
- severity: high
|
|
255
|
+
- module: search
|
|
256
|
+
- steps: open /search, type "auth", press Enter
|
|
257
|
+
- expected: items whose names contain "auth"
|
|
258
|
+
- actual: empty list; works only on exact match
|
|
259
|
+
- evidence: logs/search-20260610.log
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
The workflow reads the first `pending` entry (or the args-specified ID) and, at closure, rewrites that entry's
|
|
263
|
+
`status` line and appends `- report: {fix_report_dir}/{slug}-fix.md`. `blocked` is a human-set parking value: the
|
|
264
|
+
workflow itself only ever writes `fixed` or `false-positive` (a blocked verdict leaves the entry `pending`), and it
|
|
265
|
+
never picks entries whose status is anything other than `pending`.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: xiaoma-bug-resolve-batch
|
|
3
|
+
description: "Batch bug resolution with Agent subprocess isolation. Drains ALL pending bugs from the defect platform or bug-queue file, each resolved in an independent full-tool Agent context, until the queue is empty. Use when the user says 'batch resolve bugs', 'resolve all bugs', 'BB', '批量修复bug', or '循环处理bug'."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Follow the instructions in [workflow.md](workflow.md).
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# DO NOT EDIT -- overwritten on every update.
|
|
2
|
+
#
|
|
3
|
+
# Workflow customization surface for xiaoma-bug-resolve-batch (the scheduler).
|
|
4
|
+
# Bug-source settings (platform_spec, bug_list_file, test_url, ...) live in the
|
|
5
|
+
# sibling xiaoma-bug-resolve/customize.toml — configure them ONCE there; this
|
|
6
|
+
# scheduler resolves and inherits them. Override this file's keys in
|
|
7
|
+
# {project-root}/_xiaoma/custom/xiaoma-bug-resolve-batch.toml (team) or
|
|
8
|
+
# xiaoma-bug-resolve-batch.user.toml (personal).
|
|
9
|
+
|
|
10
|
+
[workflow]
|
|
11
|
+
|
|
12
|
+
# --- Configurable below. Overrides merge per XiaoMa structural rules: ---
|
|
13
|
+
# scalars: override wins • arrays (persistent_facts, activation_steps_*): append
|
|
14
|
+
# arrays-of-tables with `code`/`id`: replace matching items, append new ones.
|
|
15
|
+
|
|
16
|
+
# Steps to run before the scheduler initializes. Overrides append.
|
|
17
|
+
|
|
18
|
+
activation_steps_prepend = []
|
|
19
|
+
|
|
20
|
+
# Steps to run after initialization but before the batch loop. Overrides append.
|
|
21
|
+
|
|
22
|
+
activation_steps_append = []
|
|
23
|
+
|
|
24
|
+
# Persistent facts for the scheduler itself. Kept empty by default — the
|
|
25
|
+
# scheduler stays lightweight; project context is passed to each Agent
|
|
26
|
+
# subprocess instead. Overrides append.
|
|
27
|
+
|
|
28
|
+
persistent_facts = []
|
|
29
|
+
|
|
30
|
+
# Executed after the final batch report. Override wins. Use for post-batch
|
|
31
|
+
# automation: notify a channel, file a summary ticket, trigger CI.
|
|
32
|
+
# Leave empty for no custom post-completion behavior.
|
|
33
|
+
|
|
34
|
+
on_complete = ""
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bug-resolve-batch
|
|
3
|
+
description: "Batch bug resolution scheduler with Agent subprocess isolation. Drains all pending bugs from the defect platform or bug-queue file, each resolved in an independent full-tool Agent context."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Bug Resolve — Batch Mode (Agent Subprocess Isolation)
|
|
7
|
+
|
|
8
|
+
**Goal:** Process ALL pending bugs in the queue — each one resolved end-to-end (analyze → fix → verify → close) in an
|
|
9
|
+
**independent Agent subprocess** — fully automatic from start to finish, zero human intervention until the queue is
|
|
10
|
+
empty.
|
|
11
|
+
|
|
12
|
+
**Your Role:** Bug Batch Scheduler. You coordinate the loop and delegate each bug's full lifecycle to an independent
|
|
13
|
+
Agent subprocess. You stay lightweight — query queue, launch Agent, read results, continue or finalize.
|
|
14
|
+
|
|
15
|
+
- Communicate all responses in {communication_language} and generate all documents in {document_output_language}
|
|
16
|
+
- Absolutely DO NOT stop because of "milestones", "significant progress", or "session boundaries". Continue in a single
|
|
17
|
+
execution until ALL bugs are processed or a HALT condition is triggered
|
|
18
|
+
- **Fully automatic, no human intervention** — from start to finish, the user needs no commands
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Core Architecture: Agent-Isolated Processing
|
|
23
|
+
|
|
24
|
+
Each bug is delegated to an **independent Agent subprocess**. Agents naturally have isolated context spaces, releasing
|
|
25
|
+
upon completion without polluting the main conversation — no `/clear` needed. The main conversation only handles the
|
|
26
|
+
lightweight scheduling loop.
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
Main conversation (scheduler, minimal context)
|
|
30
|
+
├── Agent #1 → Resolve Bug A (isolated context, released after completion)
|
|
31
|
+
├── Agent #2 → Resolve Bug B (isolated context, released after completion)
|
|
32
|
+
├── Agent #3 → Resolve Bug C (isolated context, released after completion)
|
|
33
|
+
└── ...until the queue is empty
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Core Rules (Strictly Follow)
|
|
37
|
+
|
|
38
|
+
1. **Each bug processed by an independent Agent** — Use the Agent tool to launch a **general-purpose subprocess with
|
|
39
|
+
FULL tool-execution capability** (the complete tool set: file read/write/edit, shell/command execution, and test
|
|
40
|
+
running — **NOT** a restricted or read-only subagent such as an explore/plan/search-only type). Pass complete bug
|
|
41
|
+
info and processing instructions; the Agent independently completes analyze → fix → verify → close
|
|
42
|
+
2. **Main loop stays lightweight** — the scheduler only: queries the queue → launches an Agent → reads results →
|
|
43
|
+
queries remaining → continues or ends
|
|
44
|
+
3. **Serial processing** — one bug at a time; wait for Agent completion before the next, avoiding concurrent
|
|
45
|
+
modification conflicts
|
|
46
|
+
4. **Scope is a hard isolation boundary** — when a scope filter is in effect, EVERY queue query, detail fetch, and
|
|
47
|
+
status write-back (scheduler-side and Agent-side) must carry it
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## INITIALIZATION
|
|
52
|
+
|
|
53
|
+
### Resolve Configuration
|
|
54
|
+
|
|
55
|
+
1. **Single-bug workflow block** (the single source of truth for bug-source settings):
|
|
56
|
+
run `node {project-root}/_xiaoma/scripts/resolve_customization.js --skill {skill-root}/../xiaoma-bug-resolve --key workflow`
|
|
57
|
+
→ yields `bug_source`, `bug_list_file`, `platform_spec`, `test_url`, `max_fix_iterations`, `fix_report_subdir`, and
|
|
58
|
+
the sibling's `persistent_facts` (project knowledge destined for every Agent subprocess — resolve `file:` entries
|
|
59
|
+
to their contents now, keep literal entries verbatim).
|
|
60
|
+
2. **Own workflow block:** run the same script with `--skill {skill-root}` → yields this scheduler's
|
|
61
|
+
`activation_steps_*`, `persistent_facts`, `on_complete`. Execute prepend steps, load facts, execute append steps.
|
|
62
|
+
3. Load `{project-root}/_xiaoma/xmc/config.yaml` and resolve: `user_name`, `communication_language`,
|
|
63
|
+
`document_output_language`, `implementation_artifacts`, `project_knowledge`, and `date` as system-generated current
|
|
64
|
+
datetime.
|
|
65
|
+
|
|
66
|
+
If the resolver script fails, perform the merges manually (customize.toml + `_xiaoma/custom/<skill-name>.toml` +
|
|
67
|
+
`<skill-name>.user.toml`; scalars override, arrays append).
|
|
68
|
+
|
|
69
|
+
### Paths
|
|
70
|
+
|
|
71
|
+
- `single_bug_workflow` = `{skill-root}/../xiaoma-bug-resolve/workflow.md` (the sibling single-bug skill — each Agent
|
|
72
|
+
subprocess follows its Step 2–5 procedure)
|
|
73
|
+
- `batch_status_file` = `{implementation_artifacts}/bug-batch-status.json`
|
|
74
|
+
|
|
75
|
+
### Parse Args
|
|
76
|
+
|
|
77
|
+
This scheduler accepts at most ONE positional token: the **scope filter** (e.g. a JIRA project ID isolating this
|
|
78
|
+
project's bugs on a shared platform). Rules:
|
|
79
|
+
|
|
80
|
+
- A token containing `=` is NOT a scope — treat scope as not provided and tell the user (key=value args such as
|
|
81
|
+
`testUrl=...` belong to the single-bug skill, not to batch mode). If args contain more than one token, HALT and
|
|
82
|
+
explain that batch mode takes a single scope token only.
|
|
83
|
+
- If `{platform_spec}` declares "scope is REQUIRED" and no scope token was provided: HALT —
|
|
84
|
+
"This platform requires a scope filter. Re-run as: `/xiaoma-bug-resolve-batch <scope>` (e.g. a JIRA project ID)."
|
|
85
|
+
- When a scope is in effect, it is a hard constraint inherited by every query and every Agent subprocess.
|
|
86
|
+
- File mode ignores scope (a bug-queue file is already project-local).
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## WORKFLOW
|
|
91
|
+
|
|
92
|
+
<workflow>
|
|
93
|
+
|
|
94
|
+
<step n="1" goal="Validate the source is batchable and display the queue overview">
|
|
95
|
+
|
|
96
|
+
1. Resolve the bug source exactly as the single-bug workflow does (`auto`: platform_spec non-empty → platform; else
|
|
97
|
+
bug_list_file exists → file). **Interactive is not batchable** — if neither platform nor file resolves, HALT:
|
|
98
|
+
"Batch mode needs a queue: configure platform_spec or create {bug_list_file}. For a single described bug, use
|
|
99
|
+
xiaoma-bug-resolve (BR)."
|
|
100
|
+
2. Query queue statistics (scope-filtered when in effect): pending / fixed / false-positive counts.
|
|
101
|
+
3. If pending == 0: go to Step 3 (final report).
|
|
102
|
+
4. List the pending bugs (ID, title, severity, module) oldest first.
|
|
103
|
+
5. Output the overview — include the scope line whenever a scope is in effect:
|
|
104
|
+
|
|
105
|
+
```text
|
|
106
|
+
===============================================
|
|
107
|
+
Bug Resolve — Batch Mode
|
|
108
|
+
(Agent Subprocess Isolation)
|
|
109
|
+
===============================================
|
|
110
|
+
Scope: {scope or "—"}
|
|
111
|
+
Pending: {pending} | Fixed: {fixed} | False-positive: {false_positive}
|
|
112
|
+
|
|
113
|
+
Processing all {pending} bugs sequentially, each in an
|
|
114
|
+
independent Agent subprocess. Starting now...
|
|
115
|
+
-----------------------------------------------
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
6. Initialize tracking: `bugs_fixed` = 0, `bugs_false_positive` = 0, `bugs_failed` = 0, `failed_bug_keys` = [],
|
|
119
|
+
`bug_results` = [].
|
|
120
|
+
|
|
121
|
+
</step>
|
|
122
|
+
|
|
123
|
+
<step n="2" goal="Loop: resolve each bug in an independent Agent subprocess (fully automatic)">
|
|
124
|
+
|
|
125
|
+
### 2.1 Find the Next Pending Bug
|
|
126
|
+
|
|
127
|
+
Query the queue fresh (scope-filtered when in effect), oldest first, skipping any key in `failed_bug_keys`. If no
|
|
128
|
+
processable bug remains, go to Step 3. Fetch the bug's complete record (platform detail fetch / full file entry).
|
|
129
|
+
|
|
130
|
+
Output: `Processing bug: {bug_key} — {title}`
|
|
131
|
+
|
|
132
|
+
### 2.2 Launch the Independent Agent Subprocess
|
|
133
|
+
|
|
134
|
+
<critical>
|
|
135
|
+
|
|
136
|
+
Use the Agent tool to launch a **general-purpose subprocess with FULL tool-execution capability** to resolve this bug.
|
|
137
|
+
This subprocess **MUST** have the complete tool set enabled — file read/write/edit, shell/command execution, and test
|
|
138
|
+
execution — because it runs the entire bug lifecycle (analyze → fix → verify → close). Do **NOT** delegate to a
|
|
139
|
+
restricted or read-only subagent (e.g. an explore-, plan-, or search-only type): such agents cannot edit files or run
|
|
140
|
+
commands, so the lifecycle would fail. When the host tool exposes a subagent-type selector, choose the type whose
|
|
141
|
+
toolset is the full/unrestricted set (in Claude Code this is the `general-purpose` type).
|
|
142
|
+
|
|
143
|
+
The Agent's prompt MUST contain, so it can work fully independently:
|
|
144
|
+
|
|
145
|
+
**1. Bug record:** every field fetched in 2.1 (ID, title, reproduction steps, error logs, module, page URL, severity,
|
|
146
|
+
type) — pass actual content, not references. **Plus the scope value as a hard constraint when in effect: every
|
|
147
|
+
platform query and status write-back must carry it.**
|
|
148
|
+
|
|
149
|
+
**2. Configuration (inline all resolved values):** `communication_language`, `document_output_language`,
|
|
150
|
+
`implementation_artifacts`, `max_fix_iterations`, `fix_report_subdir`, `test_url`, the resolved bug-source mode, and —
|
|
151
|
+
verbatim — `platform_spec` (platform mode) or the `bug_list_file` path (file mode).
|
|
152
|
+
|
|
153
|
+
**3. Procedure:** read `{single_bug_workflow}` and execute its Step 2 (root-cause analysis and verdict), Step 3 (fix —
|
|
154
|
+
real defects only), Step 4 (verify), and Step 5 items 1–3 ONLY (fix report, status write-back, closure summary — skip
|
|
155
|
+
items 4–5: queue reporting and `on_complete` belong to this scheduler). Intake (Step 1) is already done — the record
|
|
156
|
+
above is authoritative. Operating constraints:
|
|
157
|
+
|
|
158
|
+
- You are running unattended: never wait for a user. Where the single-bug workflow says "ask the user", instead record
|
|
159
|
+
the gap; if the verdict cannot be reached without missing evidence, return verdict `blocked` — do NOT guess
|
|
160
|
+
- Fix strictly within the defect's scope; follow project conventions (CLAUDE.md, project-context.md)
|
|
161
|
+
- Track every file you modify. If you finish with verdict `blocked` or `failed`, restore the files you modified to
|
|
162
|
+
their pre-run state (leave files that already had unrelated local changes alone) and say so in `error` — the next
|
|
163
|
+
bug must start from a clean tree
|
|
164
|
+
- Write the fix report and execute the status write-back exactly as Step 5 specifies (status updates carry the scope
|
|
165
|
+
when in effect)
|
|
166
|
+
|
|
167
|
+
**4. Project context:** include the content of `project-context.md` if it exists (actual content, not just the path),
|
|
168
|
+
plus the sibling `persistent_facts` resolved during INITIALIZATION (file contents inlined, literal entries verbatim).
|
|
169
|
+
|
|
170
|
+
**5. Return format** — when done, return exactly:
|
|
171
|
+
|
|
172
|
+
```text
|
|
173
|
+
BUG_RESULT:
|
|
174
|
+
- bug_key: {bug_key}
|
|
175
|
+
- verdict: fixed | false-positive | blocked | failed
|
|
176
|
+
- files_modified: [list of files, empty for false-positive/blocked]
|
|
177
|
+
- report_file: {path to the fix report, empty if not written}
|
|
178
|
+
- verification: {one-line verification outcome or gap}
|
|
179
|
+
- summary: {one-line description of what was done}
|
|
180
|
+
- error: {message if blocked/failed, empty otherwise}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
</critical>
|
|
184
|
+
|
|
185
|
+
### 2.3 Read the Agent Result and Handle Errors
|
|
186
|
+
|
|
187
|
+
- `verdict: fixed` → increment `bugs_fixed`
|
|
188
|
+
- `verdict: false-positive` → increment `bugs_false_positive`
|
|
189
|
+
- `verdict: blocked`, `failed`, or no parseable BUG_RESULT → increment `bugs_failed`, append the bug key to
|
|
190
|
+
`failed_bug_keys` (prevents re-selecting it this run — its source status stays pending, so a later run can retry),
|
|
191
|
+
output `Bug {bug_key} blocked/failed — skipping and continuing.` — do NOT halt the batch
|
|
192
|
+
- Append the result to `bug_results`; output a one-line result for this bug
|
|
193
|
+
|
|
194
|
+
### 2.4 Refresh and Continue
|
|
195
|
+
|
|
196
|
+
Re-query the queue statistics (fresh, scope-filtered when in effect) and output a checkpoint:
|
|
197
|
+
|
|
198
|
+
```text
|
|
199
|
+
--- Batch checkpoint: fixed {bugs_fixed} | false-positive {bugs_false_positive} | failed {bugs_failed} | remaining {pending} ---
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
If a processable bug remains (pending minus `failed_bug_keys`): return to 2.1. Otherwise go to Step 3.
|
|
203
|
+
|
|
204
|
+
</step>
|
|
205
|
+
|
|
206
|
+
<step n="3" goal="Final report and machine-readable batch status">
|
|
207
|
+
|
|
208
|
+
1. Query the final queue state (scope-filtered when in effect).
|
|
209
|
+
2. Write `{batch_status_file}` atomically (write `.tmp`, then rename):
|
|
210
|
+
|
|
211
|
+
```json
|
|
212
|
+
{
|
|
213
|
+
"pipeline": "bug-resolve-batch",
|
|
214
|
+
"date": "{date}",
|
|
215
|
+
"scope": "{scope_or_empty}",
|
|
216
|
+
"source_mode": "platform|file",
|
|
217
|
+
"bugs_fixed": 0,
|
|
218
|
+
"bugs_false_positive": 0,
|
|
219
|
+
"bugs_failed": 0,
|
|
220
|
+
"failed_bug_keys": [],
|
|
221
|
+
"bug_results": [
|
|
222
|
+
{
|
|
223
|
+
"bug_key": "...",
|
|
224
|
+
"verdict": "fixed|false-positive|blocked|failed",
|
|
225
|
+
"files_modified": ["..."],
|
|
226
|
+
"report_file": "...",
|
|
227
|
+
"verification": "...",
|
|
228
|
+
"summary": "...",
|
|
229
|
+
"error": ""
|
|
230
|
+
}
|
|
231
|
+
]
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
If the batch is halted early, still write this file — the partial run is auditable.
|
|
236
|
+
|
|
237
|
+
3. Output the final report:
|
|
238
|
+
|
|
239
|
+
```text
|
|
240
|
+
===============================================
|
|
241
|
+
Bug Resolve Batch — COMPLETE
|
|
242
|
+
===============================================
|
|
243
|
+
Scope: {scope or "—"}
|
|
244
|
+
|
|
245
|
+
Fixed: {bugs_fixed}
|
|
246
|
+
False-positive: {bugs_false_positive}
|
|
247
|
+
Blocked/Failed (skipped, still pending at source): {bugs_failed}
|
|
248
|
+
Remaining pending: {pending}
|
|
249
|
+
|
|
250
|
+
Details:
|
|
251
|
+
| Bug | Verdict | Files | Report |
|
|
252
|
+
|-----|---------|-------|--------|
|
|
253
|
+
| ... | ... | ... | ... |
|
|
254
|
+
|
|
255
|
+
Batch status: {batch_status_file}
|
|
256
|
+
===============================================
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
4. If `bugs_failed` > 0: list each failed/blocked bug with its `error` and what evidence or access would unblock it.
|
|
260
|
+
5. Execute `{workflow.on_complete}` if non-empty. **HALT** — batch complete.
|
|
261
|
+
|
|
262
|
+
</step>
|
|
263
|
+
|
|
264
|
+
</workflow>
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## Important Notes
|
|
269
|
+
|
|
270
|
+
1. **Agent isolation is key** — each bug runs in an independent subprocess with isolated context; bugs never interfere
|
|
271
|
+
2. **Serial safety** — one bug at a time avoids concurrent modifications to the same codebase
|
|
272
|
+
3. **No infinite retries** — blocked/failed bugs go into `failed_bug_keys` and are skipped for the rest of THIS run;
|
|
273
|
+
their source status remains pending so the next run (or a human) can pick them up with fresh context
|
|
274
|
+
4. **Scope discipline** — on shared defect platforms, running without the required scope would pull other projects'
|
|
275
|
+
bugs and mis-edit code and statuses; that is why the platform spec can make scope mandatory
|
|
276
|
+
5. **Agent prompt quality** — each subprocess prompt must carry the complete bug record + resolved config + the
|
|
277
|
+
platform spec or file path + the return format, so it can work with zero callbacks
|
|
@@ -29,4 +29,6 @@ XiaoMa Method,xiaoma-code-review,Code Review,CR,Story cycle: If issues back to D
|
|
|
29
29
|
XiaoMa Method,xiaoma-checkpoint-preview,Checkpoint,CK,Guided walkthrough of a change from purpose and context into details. Use for human review of commits branches or PRs.,,,4-implementation,,,false,,
|
|
30
30
|
XiaoMa Method,xiaoma-qa-generate-e2e-tests,QA Automation Test,QA,Generate automated API and E2E tests for implemented code. NOT for code review or story validation — use CR for that.,,,4-implementation,xiaoma-dev-story,,false,implementation_artifacts,test suite
|
|
31
31
|
XiaoMa Method,xiaoma-retrospective,Retrospective,ER,Optional at epic end: Review completed work lessons learned and next epic or if major issues consider CC.,,,4-implementation,xiaoma-code-review,,false,implementation_artifacts,retrospective
|
|
32
|
-
XiaoMa Method,xiaoma-investigate,Investigate,IN,Forensic case investigation calibrated to the input. Evidence-graded analysis with hypothesis tracking. Produces a structured case file
|
|
32
|
+
XiaoMa Method,xiaoma-investigate,Investigate,IN,Forensic case investigation calibrated to the input. Evidence-graded analysis with hypothesis tracking. Produces a structured case file.,,,4-implementation,,,false,implementation_artifacts,investigation report
|
|
33
|
+
XiaoMa Method,xiaoma-bug-resolve,Bug Resolve,BR,Resolve one bug end-to-end: intake from defect platform / bug-queue file / user description then root-cause fix verify and close with a fix report.,,,4-implementation,,,false,implementation_artifacts,fix report
|
|
34
|
+
XiaoMa Method,xiaoma-bug-resolve-batch,Bug Resolve Batch,BB,Drain ALL pending bugs sequentially with Agent subprocess isolation until the queue is empty.,,,4-implementation,xiaoma-bug-resolve,,false,implementation_artifacts,fix reports and batch status
|