@trygentic/agentloop 0.16.0-alpha.11 → 0.18.0-alpha.11
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 +1 -12
- package/package.json +3 -3
- package/templates/agents/_base/proactive.bt.json +43 -0
- package/templates/agents/_base/reactive-delegation.bt.json +73 -0
- package/templates/agents/_base/reactive-message.bt.json +58 -0
- package/templates/agents/_base/reactive-task.bt.json +51 -0
- package/templates/agents/chat/chat.bt.json +70 -20
- package/templates/agents/chat/chat.md +36 -19
- package/templates/agents/engineer/engineer.bt.json +951 -346
- package/templates/agents/engineer/engineer.md +86 -33
- package/templates/agents/merge-resolver/merge-resolver.bt.json +217 -0
- package/templates/agents/merge-resolver/merge-resolver.md +297 -0
- package/templates/agents/orchestrator/orchestrator.bt.json +1 -0
- package/templates/agents/orchestrator/orchestrator.md +17 -92
- package/templates/agents/product-manager/product-manager.bt.json +215 -25
- package/templates/agents/product-manager/product-manager.md +86 -13
- package/templates/agents/qa-tester/qa-tester.bt.json +299 -88
- package/templates/agents/qa-tester/qa-tester.md +59 -12
- package/templates/agents/release/release.bt.json +219 -0
- package/templates/agents/release/release.md +164 -0
- package/templates/examples/engineer.md.example +4 -4
- package/templates/examples/example-custom-agent.md.example +4 -4
- package/templates/examples/example-plugin.js.example +1 -1
- package/templates/plugins/qa-e2e-maestro/qa-e2e-maestro.bt.json +1191 -0
- package/templates/plugins/qa-e2e-maestro/qa-e2e-maestro.md +923 -0
- package/templates/plugins/qa-e2e-scenario/qa-e2e-scenario.md +85 -0
- package/templates/non-core-templates/container.md +0 -173
- package/templates/non-core-templates/dag-planner.md +0 -96
- package/templates/non-core-templates/internal/cli-tester.md +0 -218
- package/templates/non-core-templates/internal/qa-tester.md +0 -300
- package/templates/non-core-templates/internal/tui-designer.md +0 -370
- package/templates/non-core-templates/internal/tui-tester.md +0 -125
- package/templates/non-core-templates/maestro-qa.md +0 -240
- package/templates/non-core-templates/merge-resolver.md +0 -150
- package/templates/non-core-templates/project-detection.md +0 -75
- package/templates/non-core-templates/questionnaire.md +0 -124
|
@@ -5,7 +5,7 @@ description: >-
|
|
|
5
5
|
Performs all analysis, implementation, and file editing in a single session.
|
|
6
6
|
Requests status changes through orchestrator - does not directly modify task state.
|
|
7
7
|
Can communicate with other agents via messaging to coordinate parallel work.
|
|
8
|
-
|
|
8
|
+
instanceCount: 5
|
|
9
9
|
mcpServers:
|
|
10
10
|
agentloop-memory:
|
|
11
11
|
# Internal MCP server - binary path resolved by the agent worker via findMemoryBinaryPath()
|
|
@@ -21,28 +21,26 @@ mcpServers:
|
|
|
21
21
|
command: npx
|
|
22
22
|
args: ["-y", "git-worktree-toolbox@latest"]
|
|
23
23
|
tools:
|
|
24
|
-
# Base
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
- EnterPlanMode
|
|
38
|
-
- ExitPlanMode
|
|
24
|
+
# Base OpenCode tools
|
|
25
|
+
- read
|
|
26
|
+
- edit
|
|
27
|
+
- write
|
|
28
|
+
- bash
|
|
29
|
+
- glob
|
|
30
|
+
- grep
|
|
31
|
+
- webfetch
|
|
32
|
+
- websearch
|
|
33
|
+
- question
|
|
34
|
+
- skill
|
|
35
|
+
- plan_enter
|
|
36
|
+
- plan_exit
|
|
39
37
|
# MCP tools
|
|
40
|
-
# NOTE:
|
|
38
|
+
# NOTE: report_trigger_result and report_verification are intentionally EXCLUDED
|
|
41
39
|
# from the subagent tool list. These workflow transitions are handled by dedicated
|
|
42
|
-
# BT action nodes (
|
|
43
|
-
# implementation is complete. Including them here causes the LLM
|
|
44
|
-
# them prematurely during ImplementIncrementally/ImplementDirectly,
|
|
45
|
-
# to "review" before the BT's own post-implementation nodes can run.
|
|
40
|
+
# BT action nodes (ReportVerification, ReportTriggerPass/ReportTriggerFail) that
|
|
41
|
+
# execute AFTER implementation is complete. Including them here causes the LLM
|
|
42
|
+
# subagent to call them prematurely during ImplementIncrementally/ImplementDirectly,
|
|
43
|
+
# moving the task to "review" before the BT's own post-implementation nodes can run.
|
|
46
44
|
- mcp__agentloop__get_task
|
|
47
45
|
- mcp__agentloop__list_tasks
|
|
48
46
|
- mcp__agentloop__add_task_comment
|
|
@@ -110,10 +108,11 @@ mcp:
|
|
|
110
108
|
- Tasks with similar descriptions or bug reports
|
|
111
109
|
- Tasks in same feature area
|
|
112
110
|
required: true
|
|
113
|
-
# NOTE: report_verification and
|
|
111
|
+
# NOTE: report_verification and report_trigger_result are NOT listed here.
|
|
114
112
|
# They are handled by dedicated BT action nodes (ReportVerification,
|
|
115
|
-
#
|
|
116
|
-
# subagent should focus on implementation, not
|
|
113
|
+
# ReportTriggerPass/ReportTriggerFail) that run after implementation
|
|
114
|
+
# completes. The LLM subagent should focus on implementation, not
|
|
115
|
+
# workflow transitions.
|
|
117
116
|
- name: add_task_comment
|
|
118
117
|
instructions: |
|
|
119
118
|
Document implementation details before requesting review.
|
|
@@ -235,6 +234,27 @@ Every implementation MUST include tests. This is non-negotiable.
|
|
|
235
234
|
- Place tests near the code they test (e.g., `src/utils/__tests__/helper.test.ts`)
|
|
236
235
|
- Match existing test file naming: if the project uses `.test.ts`, use that; if it uses `.spec.ts`, use that
|
|
237
236
|
|
|
237
|
+
## Test Configuration Best Practices
|
|
238
|
+
|
|
239
|
+
Tests run in non-interactive CI-like environments where there is no terminal for interactive mode. Watch mode will hang until timeout.
|
|
240
|
+
|
|
241
|
+
**Vitest:**
|
|
242
|
+
- When creating `vitest.config.ts` or `vitest.config.js`, always disable watch mode:
|
|
243
|
+
```ts
|
|
244
|
+
export default defineConfig({ test: { watch: false } })
|
|
245
|
+
```
|
|
246
|
+
- When writing `package.json` test scripts, always use the `run` subcommand: `"test": "vitest run"` (NOT `"test": "vitest"`)
|
|
247
|
+
- Never use bare `vitest` in scripts -- it defaults to watch mode
|
|
248
|
+
|
|
249
|
+
**Jest:**
|
|
250
|
+
- When writing `package.json` test scripts, prefer `"test": "jest"` (Jest does not watch by default in CI)
|
|
251
|
+
- Never add `--watch` or `--watchAll` flags to test scripts
|
|
252
|
+
|
|
253
|
+
**General rules:**
|
|
254
|
+
- Never configure any test runner to use watch mode by default
|
|
255
|
+
- Always ensure test commands will exit after running (non-zero exit on failure, zero on success)
|
|
256
|
+
- If a project's existing test script uses watch mode, fix it by adding the appropriate flag (`--run` for vitest, `--watchAll=false` for jest)
|
|
257
|
+
|
|
238
258
|
## Expo / React Native Projects
|
|
239
259
|
|
|
240
260
|
When working on Expo or React Native projects:
|
|
@@ -272,9 +292,17 @@ When fixing bugs or addressing QA feedback, understand the ROOT CAUSE before imp
|
|
|
272
292
|
3. Analyze root cause (read code, understand patterns)
|
|
273
293
|
4. Implement solution (write code directly)
|
|
274
294
|
5. Verify (report_verification with autoRun)
|
|
275
|
-
6.
|
|
295
|
+
6. **MANDATORY — Commit and push ALL changes:**
|
|
296
|
+
a. `git status` — check for any unstaged/untracked files
|
|
297
|
+
b. `git add -A` — stage everything
|
|
298
|
+
c. `git commit -m "feat: descriptive message"` — commit with conventional message
|
|
299
|
+
d. `git push` — push to remote branch
|
|
300
|
+
e. `git status` — verify working tree is clean (nothing to commit)
|
|
301
|
+
**Do NOT proceed to step 7 until git status shows a clean working tree.**
|
|
276
302
|
7. Document (add_task_comment)
|
|
277
|
-
8.
|
|
303
|
+
8. Report result:
|
|
304
|
+
- **If column-triggered**: BT uses `report_trigger_result` with "pass" or "fail"
|
|
305
|
+
- **If standalone**: BT uses `report_trigger_result` to move to review
|
|
278
306
|
|
|
279
307
|
## Code Search (MANDATORY)
|
|
280
308
|
|
|
@@ -289,12 +317,37 @@ Only fall back to Grep/Glob if semantic search fails after 2-3 attempts.
|
|
|
289
317
|
**STEP 2: Analyze Impact**
|
|
290
318
|
Before modifying any existing code, use `mcp__agentloop-memory__analyze_code_impact` to understand dependencies.
|
|
291
319
|
|
|
292
|
-
## Git Workflow
|
|
320
|
+
## Git Workflow — MANDATORY Commit and Push Before Finishing
|
|
321
|
+
|
|
322
|
+
**THIS IS NON-NEGOTIABLE.** Before you report completion, add a task comment, or signal that
|
|
323
|
+
your work is done, you MUST ensure every change is committed and pushed. Unstaged or uncommitted
|
|
324
|
+
changes in a worktree are invisible to QA and will be lost when the worktree is cleaned up.
|
|
325
|
+
|
|
326
|
+
### Pre-Completion Git Checklist (MUST DO — every single time)
|
|
327
|
+
|
|
328
|
+
1. **Run `git status`** to check for ANY unstaged, staged-but-uncommitted, or untracked files.
|
|
329
|
+
2. **Stage ALL changes**: `git add -A` (this catches new files, modifications, AND deletions).
|
|
330
|
+
3. **Commit with a descriptive message**: `git commit -m "feat: <what you did>"` using conventional commit style.
|
|
331
|
+
4. **Push to the remote branch**: `git push` (the worktree branch is already tracking a remote branch).
|
|
332
|
+
5. **Verify**: Run `git status` one more time and confirm it says `nothing to commit, working tree clean`.
|
|
333
|
+
|
|
334
|
+
If `git status` after your push shows ANY modified or untracked files, you are NOT done. Repeat
|
|
335
|
+
steps 2-5 until the working tree is completely clean.
|
|
336
|
+
|
|
337
|
+
### Why This Matters
|
|
338
|
+
|
|
339
|
+
- QA relies on `git diff main...HEAD` and pushed commits to review your changes
|
|
340
|
+
- Unpushed commits are invisible to QA agents running in separate worktrees
|
|
341
|
+
- Uncommitted changes are lost when worktrees are pruned
|
|
342
|
+
- The orchestrator checks pushed state to determine task completion
|
|
343
|
+
- **If you skip this step, your entire implementation is effectively lost**
|
|
344
|
+
|
|
345
|
+
### Common Mistakes to Avoid
|
|
293
346
|
|
|
294
|
-
|
|
295
|
-
-
|
|
296
|
-
-
|
|
297
|
-
-
|
|
347
|
+
- Do NOT assume the behavior tree will commit for you — always commit explicitly yourself
|
|
348
|
+
- Do NOT forget new files — `git add -A` catches them, but `git add .` in a subdirectory may miss files outside that directory. Always use `git add -A` from the repo root
|
|
349
|
+
- Do NOT skip the push — a local commit without a push is invisible to other agents and QA
|
|
350
|
+
- Do NOT finish your work and then add the task comment before committing — commit and push FIRST, comment SECOND
|
|
298
351
|
|
|
299
352
|
## Worktree Environment
|
|
300
353
|
|
|
@@ -304,9 +357,9 @@ worktree automatically on a dedicated feature branch (e.g., `task/{taskId}-{titl
|
|
|
304
357
|
**Key points about your worktree:**
|
|
305
358
|
- Your working directory is isolated from the main repo and other parallel agents
|
|
306
359
|
- Each agent works in its own worktree on a separate branch, preventing conflicts
|
|
307
|
-
-
|
|
360
|
+
- YOU are responsible for committing and pushing — do not rely on the behavior tree to do it for you
|
|
308
361
|
- You can use `git status` and `git diff` to inspect your changes
|
|
309
|
-
- Do NOT checkout other branches or create new ones
|
|
362
|
+
- Do NOT checkout other branches or create new ones — stay on your assigned branch
|
|
310
363
|
|
|
311
364
|
## Dev Server Port
|
|
312
365
|
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "merge-resolver-continuous-agent-tree",
|
|
3
|
+
"description": "Continuous behavior tree for the merge-resolver agent. Handles subproject merge completion and pre-existing bug coordination. Waits for agent messages or task assignments, routes to the appropriate handler, and loops.",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"mode": "reactive",
|
|
6
|
+
"tree": {
|
|
7
|
+
"type": "root",
|
|
8
|
+
"child": {
|
|
9
|
+
"type": "sequence",
|
|
10
|
+
"comment": "Main continuous loop - never exits unless agent is stopped",
|
|
11
|
+
"children": [
|
|
12
|
+
{
|
|
13
|
+
"type": "action",
|
|
14
|
+
"call": "WaitForAgentMessage",
|
|
15
|
+
"comment": "Block until a merge request or coordination message arrives via agent-to-agent messaging (primary) or orchestrator task assignment (fallback). Sets taskTitle, taskDescription, and isAgentMessage on blackboard."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"type": "action",
|
|
19
|
+
"call": "FetchTaskContext",
|
|
20
|
+
"comment": "Load task details if a real DB task was assigned, or use the request data already on the blackboard"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"type": "selector",
|
|
24
|
+
"comment": "Route to appropriate handler based on message type: pre-existing bug coordination or subproject merge",
|
|
25
|
+
"children": [
|
|
26
|
+
{
|
|
27
|
+
"type": "sequence",
|
|
28
|
+
"comment": "Handle pre-existing bug coordination - create fix task, add dependency, reorganize DAG",
|
|
29
|
+
"children": [
|
|
30
|
+
{
|
|
31
|
+
"type": "condition",
|
|
32
|
+
"call": "IsPreExistingBugMessage",
|
|
33
|
+
"comment": "Check if this is a pre-existing bug escalation from an engineer or QA agent"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"type": "llm-action",
|
|
37
|
+
"name": "HandlePreExistingBug",
|
|
38
|
+
"prompt": "You are a merge-resolver agent handling a pre-existing bug escalation. An agent has reported that a pre-existing bug is blocking their task. You need to coordinate the fix.\n\n## Context\nTask Title: {{taskTitle}}\nTask Description: {{taskDescription}}\nTask Comments: {{taskComments}}\nAgent Message: {{custom.agentMessageContent}}\nSender: {{custom.agentMessageSender}}\n\n## Your Workflow\n\n### Turn 1 - Pause Subproject & Gather Context\nCall ALL of these tools in a SINGLE response:\n1. `mcp__agentloop__pause_subproject` with reason: \"Reorganizing DAG for pre-existing bug fix\" and timeoutSeconds: 120\n2. `mcp__agentloop__get_task` - Get the blocked task details (extract the task ID from the message content)\n3. `mcp__agentloop__list_tasks` with `limit: 100` - Check if a fix task already exists for this bug\n\nLook through existing tasks for any that mention the same file, error, or bug. If a fix task already exists, skip to adding the dependency.\n\n### Turn 2 - Create Fix Task (if needed)\nIf no existing fix task was found, call `mcp__agentloop__create_task` with:\n- title: \"fix: <concise bug description from the message>\"\n- description: Include the affected file path, error message, reproduction steps, and which task(s) are blocked. Mention this is a pre-existing bug unrelated to the blocked task's work.\n- priority: \"high\"\n- tags: [\"bug-fix\", \"pre-existing\"]\n- If the blocked task belongs to a subproject, use the same subprojectId\n\nSave the returned task ID.\n\n### Turn 3 - Add Dependencies & Reorganize DAG\nCall ALL of these tools in a SINGLE response:\n1. `mcp__agentloop__add_task_dependency` - Make the blocked task depend on the fix task (dependentTaskId = blocked task, prerequisiteTaskId = fix task)\n2. `mcp__agentloop__update_task_status` - Move the blocked task back to \"todo\" so it will be re-queued after the fix\n3. `mcp__agentloop__add_task_comment` - Add a comment to the blocked task explaining the pre-existing bug and the fix task\n\n### Turn 4 - Resume Subproject, Validate & Notify\nCall ALL of these tools in a SINGLE response:\n1. `mcp__agentloop__resume_subproject` - ALWAYS resume the subproject, even if previous steps failed\n2. `mcp__agentloop__validate_dag` - Ensure no cycles after dependency changes\n3. `mcp__agentloop__respond_to_message` - Reply to the originating agent acknowledging the bug report and explaining what was done\n4. `mcp__agentloop__broadcast_message` - Notify all agents about the pre-existing bug fix being queued\n\n**CRITICAL: You MUST call `mcp__agentloop__resume_subproject` even if earlier steps failed. Failing to resume will leave the subproject permanently paused and block all future task scheduling.**\n\n## Important Rules\n- If a fix task already exists, just add the dependency - do NOT create a duplicate\n- Always validate the DAG after adding dependencies\n- Always respond to the sender so they know their report was handled\n- Use precise error details from the message in the fix task description\n- Set priority to \"high\" so the fix runs soon\n- ALWAYS batch independent tool calls into the SAME response to minimize turns\n- ALWAYS resume the subproject when done, regardless of success or failure",
|
|
39
|
+
"contextKeys": ["taskTitle", "taskDescription", "taskComments", "custom"],
|
|
40
|
+
"subagent": "merge-resolver",
|
|
41
|
+
"allowedTools": [
|
|
42
|
+
"mcp__agentloop__pause_subproject",
|
|
43
|
+
"mcp__agentloop__resume_subproject",
|
|
44
|
+
"mcp__agentloop__get_task",
|
|
45
|
+
"mcp__agentloop__list_tasks",
|
|
46
|
+
"mcp__agentloop__create_task",
|
|
47
|
+
"mcp__agentloop__add_task_dependency",
|
|
48
|
+
"mcp__agentloop__update_task_status",
|
|
49
|
+
"mcp__agentloop__add_task_comment",
|
|
50
|
+
"mcp__agentloop__validate_dag",
|
|
51
|
+
"mcp__agentloop__respond_to_message",
|
|
52
|
+
"mcp__agentloop__broadcast_message"
|
|
53
|
+
],
|
|
54
|
+
"outputSchema": {
|
|
55
|
+
"type": "object",
|
|
56
|
+
"properties": {
|
|
57
|
+
"bugDescription": {
|
|
58
|
+
"type": "string",
|
|
59
|
+
"description": "Brief description of the pre-existing bug"
|
|
60
|
+
},
|
|
61
|
+
"affectedFile": {
|
|
62
|
+
"type": "string",
|
|
63
|
+
"description": "Primary file affected by the bug"
|
|
64
|
+
},
|
|
65
|
+
"blockedTaskId": {
|
|
66
|
+
"type": "number",
|
|
67
|
+
"description": "ID of the task blocked by the bug"
|
|
68
|
+
},
|
|
69
|
+
"fixTaskId": {
|
|
70
|
+
"type": "number",
|
|
71
|
+
"description": "ID of the created or existing fix task"
|
|
72
|
+
},
|
|
73
|
+
"fixTaskCreated": {
|
|
74
|
+
"type": "boolean",
|
|
75
|
+
"description": "Whether a new fix task was created (false if reusing existing)"
|
|
76
|
+
},
|
|
77
|
+
"dagValidated": {
|
|
78
|
+
"type": "boolean",
|
|
79
|
+
"description": "Whether DAG validation passed after changes"
|
|
80
|
+
},
|
|
81
|
+
"summary": {
|
|
82
|
+
"type": "string",
|
|
83
|
+
"description": "Summary of actions taken"
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"required": ["bugDescription", "blockedTaskId", "fixTaskId", "summary"]
|
|
87
|
+
},
|
|
88
|
+
"outputKey": "bugFixResult",
|
|
89
|
+
"temperature": 0.3
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"type": "sequence",
|
|
95
|
+
"comment": "Handle subproject merge completion - merge all worktree branches, resolve conflicts, run tests, create PR",
|
|
96
|
+
"children": [
|
|
97
|
+
{
|
|
98
|
+
"type": "llm-action",
|
|
99
|
+
"name": "MergeSubprojectBranches",
|
|
100
|
+
"prompt": "You are a merge-resolver agent. Your job is to merge all completed task branches from a subproject into a single merge branch, resolve any conflicts, validate the result, and create a pull request.\n\n## Context\nTask Title: {{taskTitle}}\nTask Description: {{taskDescription}}\nTask Comments: {{taskComments}}\n\n## Your Workflow\n\n### Turn 1 - Pause Subproject & Gather Branch Information\nCall ALL of these tools in a SINGLE response:\n1. `mcp__agentloop__pause_subproject` with reason: \"Merging worktree branches\" and timeoutSeconds: 300\n2. `mcp__agentloop__list_tasks` with `limit: 100` - Find all tasks related to this subproject/merge request\n3. `mcp__git-worktree-toolbox__listProjects` - List all worktrees and their branches\n4. `mcp__git-worktree-toolbox__doctorWorktrees` - Check worktree health before merging\n\nFrom the results, identify:\n- Which tasks are completed (status: done)\n- Which branches correspond to those tasks\n- The order to merge them (by DAG level if available, otherwise by task ID)\n\n### Turn 2 - Inspect Changes in Each Branch\nCall `mcp__git-worktree-toolbox__worktreeChanges` for EACH branch in a SINGLE response (parallel calls).\nThis shows you what files each branch modified so you can anticipate conflicts.\n\n### Turn 3 - Use The Prepared Merge-Resolver Worktree\nYou are already running inside a dedicated merge-resolver git worktree on a fresh merge-resolver branch.\nDo NOT create or reuse branches from the project root. Stay inside the provided worktree and only operate there.\n\nUse `bash` to confirm the worktree state before merging:\n\n```bash\ngit fetch origin\ngit rev-parse --abbrev-ref HEAD\ngit status --short --branch\n```\n\nThen for each branch (in DAG-level order, lowest first):\n1. Try: `git merge <branch-name> --no-edit`\n2. If merge succeeds, continue to the next branch\n3. If merge conflicts:\n a. Use `bash` to run `git diff --name-only --diff-filter=U` to list conflicting files\n b. Use `read` to examine each conflicting file\n c. Use `edit` to resolve the conflict by choosing the correct content:\n - For imports: merge both import lists, remove duplicates\n - For adjacent additions: keep both in logical order\n - For same-function changes: carefully merge preserving both modifications\n - For config files: merge entries, use higher versions for version conflicts\n d. After resolving all files: `git add . && git merge --continue --no-edit`\n\n### Turn 4 - Validate Merged Code\nUse `bash` to run validation:\n```bash\n# Run tests if available\nif [ -f \"package.json\" ]; then\n npm test 2>&1 | tail -50 || true\nfi\n\n# Run linting if available \nif [ -f \"Makefile\" ] && grep -q \"^lint:\" Makefile; then\n make lint 2>&1 | tail -50 || true\nfi\n\n# Run type checking if TypeScript\nif [ -f \"tsconfig.json\" ]; then\n npx tsc --noEmit 2>&1 | tail -50 || true\nfi\n```\n\nIf tests/lint fail due to merge issues, fix them using `edit` and commit the fixes.\n\n### Turn 5 - Push Branch & Create PR\nUse `bash` to push:\n```bash\ngit push -u origin HEAD\n```\n\nThen call `mcp__git-worktree-toolbox__generateMrLink` to create the merge request/PR.\n\nAdd a task comment with:\n- PR URL\n- List of branches merged\n- Conflicts resolved (if any)\n- Test results\n\n### Turn 6 - Resume Subproject, Cleanup & Notify\nCall these tools in a SINGLE response:\n1. `mcp__agentloop__resume_subproject` - ALWAYS resume the subproject, even if merge failed\n2. `mcp__agentloop__add_task_comment` - Document the merge result\n3. `mcp__agentloop__broadcast_message` - Notify all agents that the subproject merge is complete\n\nOptionally call `mcp__git-worktree-toolbox__archiveWorktree` for each merged worktree.\n\n**CRITICAL: You MUST call `mcp__agentloop__resume_subproject` even if merge operations failed. Failing to resume will leave the subproject permanently paused and block all future task scheduling.**\n\n## Conflict Resolution Rules\n1. NEVER silently drop changes from any branch - every branch is QA-tested work\n2. When in doubt, keep both changes and add a comment explaining the merge decision\n3. For truly incompatible changes (same line, different intent), review task descriptions to understand which approach is correct\n4. Always test after resolving conflicts\n5. If you cannot resolve a conflict after careful analysis, document the conflict in detail and set the task to \"blocked\" for human review\n\n## Important\n- Batch independent tool calls into the SAME response to minimize turns\n- Document every conflict resolution decision\n- Always run tests after the merge to catch integration issues\n- Push the branch and create a PR even if there were conflicts that you resolved\n- ALWAYS resume the subproject when done, regardless of success or failure",
|
|
101
|
+
"contextKeys": ["taskTitle", "taskDescription", "taskComments"],
|
|
102
|
+
"subagent": "merge-resolver",
|
|
103
|
+
"maxTurns": 500,
|
|
104
|
+
"allowedTools": [
|
|
105
|
+
"Bash",
|
|
106
|
+
"Read",
|
|
107
|
+
"Edit",
|
|
108
|
+
"Write",
|
|
109
|
+
"Glob",
|
|
110
|
+
"Grep",
|
|
111
|
+
"mcp__agentloop__pause_subproject",
|
|
112
|
+
"mcp__agentloop__resume_subproject",
|
|
113
|
+
"mcp__agentloop__list_tasks",
|
|
114
|
+
"mcp__agentloop__add_task_comment",
|
|
115
|
+
"mcp__agentloop__broadcast_message",
|
|
116
|
+
"mcp__git-worktree-toolbox__listProjects",
|
|
117
|
+
"mcp__git-worktree-toolbox__doctorWorktrees",
|
|
118
|
+
"mcp__git-worktree-toolbox__worktreeChanges",
|
|
119
|
+
"mcp__git-worktree-toolbox__mergeRemoteWorktreeChangesIntoLocal",
|
|
120
|
+
"mcp__git-worktree-toolbox__generateMrLink",
|
|
121
|
+
"mcp__git-worktree-toolbox__archiveWorktree",
|
|
122
|
+
"mcp__git-worktree-toolbox__cleanWorktrees"
|
|
123
|
+
],
|
|
124
|
+
"outputSchema": {
|
|
125
|
+
"type": "object",
|
|
126
|
+
"properties": {
|
|
127
|
+
"mergeBranch": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"description": "Name of the merge branch created"
|
|
130
|
+
},
|
|
131
|
+
"branchesMerged": {
|
|
132
|
+
"type": "array",
|
|
133
|
+
"items": { "type": "string" },
|
|
134
|
+
"description": "List of branches that were merged"
|
|
135
|
+
},
|
|
136
|
+
"conflictsFound": {
|
|
137
|
+
"type": "number",
|
|
138
|
+
"minimum": 0,
|
|
139
|
+
"description": "Integer count of merge conflicts encountered (never return an array or object here)"
|
|
140
|
+
},
|
|
141
|
+
"conflictsResolved": {
|
|
142
|
+
"type": "number",
|
|
143
|
+
"minimum": 0,
|
|
144
|
+
"description": "Integer count of conflicts successfully resolved"
|
|
145
|
+
},
|
|
146
|
+
"conflictFiles": {
|
|
147
|
+
"type": "array",
|
|
148
|
+
"items": { "type": "string" },
|
|
149
|
+
"description": "Files that had merge conflicts"
|
|
150
|
+
},
|
|
151
|
+
"testsPass": {
|
|
152
|
+
"type": "boolean",
|
|
153
|
+
"description": "Whether tests passed after merge"
|
|
154
|
+
},
|
|
155
|
+
"prUrl": {
|
|
156
|
+
"type": "string",
|
|
157
|
+
"description": "URL of the created pull request"
|
|
158
|
+
},
|
|
159
|
+
"summary": {
|
|
160
|
+
"type": "string",
|
|
161
|
+
"description": "Summary of the merge operation"
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
"required": ["branchesMerged", "conflictsFound", "summary"]
|
|
165
|
+
},
|
|
166
|
+
"outputKey": "mergeResult",
|
|
167
|
+
"temperature": 0.3
|
|
168
|
+
}
|
|
169
|
+
]
|
|
170
|
+
}
|
|
171
|
+
]
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"type": "action",
|
|
175
|
+
"call": "AddCompletionComment",
|
|
176
|
+
"comment": "Add a completion comment summarizing the merge-resolver's work"
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"type": "action",
|
|
180
|
+
"call": "ReportTriggerPass"
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"type": "action",
|
|
184
|
+
"call": "ClearTaskContext",
|
|
185
|
+
"comment": "Reset task-specific blackboard keys to prepare for next merge request"
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"type": "action",
|
|
189
|
+
"call": "Loop",
|
|
190
|
+
"comment": "Return to start - wait for next merge request or bug coordination message"
|
|
191
|
+
}
|
|
192
|
+
]
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
"blackboardDefaults": {
|
|
196
|
+
"mergeResult": null,
|
|
197
|
+
"bugFixResult": null,
|
|
198
|
+
"taskComments": null,
|
|
199
|
+
"taskDetails": null,
|
|
200
|
+
"requestedStatus": "done",
|
|
201
|
+
"statusChangeReason": "Merge resolution complete",
|
|
202
|
+
"custom": {
|
|
203
|
+
"loopCount": 0,
|
|
204
|
+
"shouldLoop": false,
|
|
205
|
+
"continuousTaskId": null,
|
|
206
|
+
"currentTaskId": null,
|
|
207
|
+
"taskAssignedAt": null,
|
|
208
|
+
"agentMessageId": null,
|
|
209
|
+
"agentMessageContent": null,
|
|
210
|
+
"agentMessageSender": null,
|
|
211
|
+
"agentMessageType": null,
|
|
212
|
+
"isDirectRequest": false,
|
|
213
|
+
"isAgentMessage": false,
|
|
214
|
+
"isColumnTriggered": false
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|