Skip to content

Commit c59565a

Browse files
Oortonautclaude
andcommitted
Prepare v0.3.0 release
Bump version to 0.3.0. Resolve all clippy warnings, update README tools/features/workflows tables to match codebase, rewrite stale SCHEMA.md, and add 67 new tests covering feedback tools, overlay management, offset pagination, and connect overlays. Set up MCP registry publishing with MCPB bundles in the release workflow and server.json template. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent b6789cf commit c59565a

17 files changed

Lines changed: 2742 additions & 101 deletions

.github/workflows/release.yml

Lines changed: 183 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,19 @@ jobs:
2020
- target: x86_64-unknown-linux-gnu
2121
os: ubuntu-latest
2222
archive: tar.gz
23+
binary: task-graph-mcp
2324
- target: x86_64-apple-darwin
2425
os: macos-latest
2526
archive: tar.gz
27+
binary: task-graph-mcp
2628
- target: aarch64-apple-darwin
2729
os: macos-latest
2830
archive: tar.gz
31+
binary: task-graph-mcp
2932
- target: x86_64-pc-windows-msvc
3033
os: windows-latest
3134
archive: zip
35+
binary: task-graph-mcp.exe
3236

3337
steps:
3438
- uses: actions/checkout@v4
@@ -55,11 +59,109 @@ jobs:
5559
7z a ../../../task-graph-mcp-${{ matrix.target }}.zip task-graph-mcp.exe
5660
cd ../../..
5761
62+
- name: Extract version from tag
63+
id: version
64+
shell: bash
65+
run: |
66+
if [[ "${{ github.ref }}" == refs/tags/v* ]]; then
67+
echo "version=${GITHUB_REF#refs/tags/v}" >> "$GITHUB_OUTPUT"
68+
else
69+
echo "version=$(grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')" >> "$GITHUB_OUTPUT"
70+
fi
71+
72+
- name: Create MCPB bundle
73+
shell: bash
74+
run: |
75+
VERSION="${{ steps.version.outputs.version }}"
76+
TARGET="${{ matrix.target }}"
77+
BINARY="${{ matrix.binary }}"
78+
79+
mkdir -p mcpb-staging
80+
cp "target/${TARGET}/release/${BINARY}" mcpb-staging/
81+
82+
cat > mcpb-staging/manifest.json << EOF
83+
{
84+
"manifest_version": "0.3",
85+
"name": "task-graph-mcp",
86+
"version": "${VERSION}",
87+
"description": "MCP server for agent task workflows with phases, prompts, gates, and multi-agent coordination",
88+
"author": {
89+
"name": "Oortonaut",
90+
"url": "https://github.com/Oortonaut"
91+
},
92+
"license": "Apache-2.0",
93+
"repository": "https://github.com/Oortonaut/task-graph-mcp",
94+
"server": {
95+
"type": "binary",
96+
"entry_point": "${BINARY}",
97+
"mcp_config": {
98+
"command": "${BINARY}",
99+
"args": [],
100+
"env": {}
101+
}
102+
},
103+
"tools": [
104+
{"name": "connect", "description": "Register agent and join workflow"},
105+
{"name": "create", "description": "Create a new task"},
106+
{"name": "create_tree", "description": "Create a task hierarchy from YAML"},
107+
{"name": "update", "description": "Update task state, description, or dependencies"},
108+
{"name": "get", "description": "Get full task details"},
109+
{"name": "list_tasks", "description": "List and filter tasks"},
110+
{"name": "delete", "description": "Delete a task"},
111+
{"name": "rename", "description": "Rename a task ID"},
112+
{"name": "claim", "description": "Claim a ready task"},
113+
{"name": "scan", "description": "Get task tree with agent context"},
114+
{"name": "thinking", "description": "Record agent reasoning"},
115+
{"name": "query", "description": "Run read-only SQL queries"},
116+
{"name": "link", "description": "Add dependency between tasks"},
117+
{"name": "unlink", "description": "Remove dependency between tasks"},
118+
{"name": "mark_file", "description": "Lock a file for an agent"},
119+
{"name": "unmark_file", "description": "Release a file lock"},
120+
{"name": "list_marks", "description": "List active file locks"},
121+
{"name": "check_gates", "description": "Evaluate workflow gate conditions"},
122+
{"name": "list_workflows", "description": "List available workflows"},
123+
{"name": "add_overlay", "description": "Add a dynamic workflow overlay"},
124+
{"name": "remove_overlay", "description": "Remove a workflow overlay"},
125+
{"name": "give_feedback", "description": "Record inter-agent feedback"},
126+
{"name": "list_feedback", "description": "List recorded agent feedback"},
127+
{"name": "list_skills", "description": "List available bundled skills"},
128+
{"name": "get_skill", "description": "Get bundled skill content"},
129+
{"name": "cleanup_stale", "description": "Evict stale workers"}
130+
],
131+
"keywords": ["mcp", "agent-workflow", "multi-agent", "task-management", "coordination"]
132+
}
133+
EOF
134+
135+
cd mcpb-staging
136+
if command -v zip &> /dev/null; then
137+
zip -r "../task-graph-mcp-${TARGET}.mcpb" .
138+
elif command -v 7z &> /dev/null; then
139+
7z a -tzip "../task-graph-mcp-${TARGET}.mcpb" .
140+
else
141+
echo "No zip tool available" && exit 1
142+
fi
143+
cd ..
144+
145+
# Compute SHA-256
146+
if command -v sha256sum &> /dev/null; then
147+
SHA=$(sha256sum "task-graph-mcp-${TARGET}.mcpb" | awk '{print $1}')
148+
elif command -v shasum &> /dev/null; then
149+
SHA=$(shasum -a 256 "task-graph-mcp-${TARGET}.mcpb" | awk '{print $1}')
150+
else
151+
SHA=$(openssl dgst -sha256 "task-graph-mcp-${TARGET}.mcpb" | awk '{print $NF}')
152+
fi
153+
echo "sha256=${SHA}" >> "$GITHUB_OUTPUT"
154+
echo "${TARGET}=${SHA}" > "mcpb-sha256-${TARGET}.txt"
155+
id: mcpb
156+
58157
- name: Upload artifact
59158
uses: actions/upload-artifact@v4
60159
with:
61160
name: task-graph-mcp-${{ matrix.target }}
62-
path: task-graph-mcp-${{ matrix.target }}.${{ matrix.archive }}
161+
path: |
162+
task-graph-mcp-${{ matrix.target }}.${{ matrix.archive }}
163+
task-graph-mcp-${{ matrix.target }}.mcpb
164+
mcpb-sha256-${{ matrix.target }}.txt
63165
64166
release:
65167
name: Create Release
@@ -68,6 +170,7 @@ jobs:
68170
if: startsWith(github.ref, 'refs/tags/')
69171
permissions:
70172
contents: write
173+
id-token: write
71174

72175
steps:
73176
- uses: actions/checkout@v4
@@ -77,11 +180,89 @@ jobs:
77180
with:
78181
path: artifacts
79182

183+
- name: Extract version from tag
184+
id: version
185+
run: echo "version=${GITHUB_REF#refs/tags/v}" >> "$GITHUB_OUTPUT"
186+
187+
- name: Generate server.json with SHA-256 hashes
188+
run: |
189+
VERSION="${{ steps.version.outputs.version }}"
190+
191+
# Read SHA-256 hashes
192+
SHA_LINUX=$(cat artifacts/task-graph-mcp-x86_64-unknown-linux-gnu/mcpb-sha256-x86_64-unknown-linux-gnu.txt | cut -d= -f2)
193+
SHA_MACOS_X86=$(cat artifacts/task-graph-mcp-x86_64-apple-darwin/mcpb-sha256-x86_64-apple-darwin.txt | cut -d= -f2)
194+
SHA_MACOS_ARM=$(cat artifacts/task-graph-mcp-aarch64-apple-darwin/mcpb-sha256-aarch64-apple-darwin.txt | cut -d= -f2)
195+
SHA_WINDOWS=$(cat artifacts/task-graph-mcp-x86_64-pc-windows-msvc/mcpb-sha256-x86_64-pc-windows-msvc.txt | cut -d= -f2)
196+
197+
cat > server.json << EOF
198+
{
199+
"\$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
200+
"name": "io.github.Oortonaut/task-graph-mcp",
201+
"description": "MCP server for agent task workflows with phases, prompts, gates, and multi-agent coordination",
202+
"version": "${VERSION}",
203+
"repository": {
204+
"url": "https://github.com/Oortonaut/task-graph-mcp",
205+
"source": "github"
206+
},
207+
"packages": [
208+
{
209+
"registryType": "mcpb",
210+
"identifier": "https://github.com/Oortonaut/task-graph-mcp/releases/download/v${VERSION}/task-graph-mcp-x86_64-unknown-linux-gnu.mcpb",
211+
"version": "${VERSION}",
212+
"fileSha256": "${SHA_LINUX}",
213+
"transport": { "type": "stdio" }
214+
},
215+
{
216+
"registryType": "mcpb",
217+
"identifier": "https://github.com/Oortonaut/task-graph-mcp/releases/download/v${VERSION}/task-graph-mcp-x86_64-apple-darwin.mcpb",
218+
"version": "${VERSION}",
219+
"fileSha256": "${SHA_MACOS_X86}",
220+
"transport": { "type": "stdio" }
221+
},
222+
{
223+
"registryType": "mcpb",
224+
"identifier": "https://github.com/Oortonaut/task-graph-mcp/releases/download/v${VERSION}/task-graph-mcp-aarch64-apple-darwin.mcpb",
225+
"version": "${VERSION}",
226+
"fileSha256": "${SHA_MACOS_ARM}",
227+
"transport": { "type": "stdio" }
228+
},
229+
{
230+
"registryType": "mcpb",
231+
"identifier": "https://github.com/Oortonaut/task-graph-mcp/releases/download/v${VERSION}/task-graph-mcp-x86_64-pc-windows-msvc.mcpb",
232+
"version": "${VERSION}",
233+
"fileSha256": "${SHA_WINDOWS}",
234+
"transport": { "type": "stdio" }
235+
}
236+
]
237+
}
238+
EOF
239+
240+
echo "Generated server.json:"
241+
cat server.json
242+
80243
- name: Upload release artifacts
81244
uses: softprops/action-gh-release@v2
82245
with:
83246
draft: false
84247
files: |
85-
artifacts/**/*
248+
artifacts/**/*.tar.gz
249+
artifacts/**/*.zip
250+
artifacts/**/*.mcpb
251+
server.json
86252
env:
87253
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
254+
255+
- name: Install mcp-publisher
256+
run: |
257+
curl -fsSL https://registry.modelcontextprotocol.io/publisher/install.sh | sh || true
258+
which mcp-publisher || echo "mcp-publisher not available, skipping registry publish"
259+
260+
- name: Publish to MCP Registry
261+
if: success()
262+
run: |
263+
if command -v mcp-publisher &> /dev/null; then
264+
mcp-publisher login github-oidc
265+
mcp-publisher publish
266+
else
267+
echo "::warning::mcp-publisher not installed. Publish server.json manually after release."
268+
fi

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ nul
88
*.db-shm
99
*.db-wal
1010
*.log
11+
.mcpregistry_*

CHANGELOG.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,43 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [Unreleased]
9+
10+
## [0.3.0] - 2026-01-31
11+
12+
### Added
13+
14+
- **Agent feedback tools**: `give_feedback` and `list_feedback` for inter-agent communication during workflows
15+
- **Dynamic overlay management**: `add_overlay` and `remove_overlay` tools for runtime workflow customization
16+
- **Worker overlays**: Agents can request overlays on `connect` for role-specific workflow behavior
17+
- **Troubleshooting overlay**: Pre-built overlay for debugging agent issues (`overlay-troubleshooting.yaml`)
18+
- **Git overlay**: Pre-built overlay for git-aware workflows (`overlay-git.yaml`)
19+
- **Offset pagination**: `offset` parameter for `list_tasks` with `has_more` metadata
20+
- **Skill frontmatter parsing**: Skill index listings now include `description` from SKILL.md frontmatter
21+
- **Kanban workflow**: New `workflow-kanban.yaml` topology for board-style task management
22+
- **Sprint workflow**: New `workflow-sprint.yaml` topology for time-boxed iteration planning
23+
- **MCP registry publishing**: MCPB bundle generation and `server.json` in release workflow
24+
- **Browser project template**: Template for coordination experiments
25+
- **Experiment and design documentation**: Distributed swarm, authorization, database backends, experiment framework
26+
27+
### Changed
28+
29+
- Basics skill rewritten to v2.0.0 with unified coordinator/worker guidance
30+
- Workflow role sections expanded across all topologies (solo, swarm, relay, hierarchical, push)
31+
- Agent feedback enabled in default project config
32+
- Overlay file changes detected by config watcher and hot-reloaded
33+
34+
### Removed
35+
36+
- `task-graph-coordinator` skill (merged into basics v2.0.0)
37+
- `task-graph-worker` skill (merged into basics v2.0.0)
38+
39+
### Fixed
40+
41+
- Flaky child ordering test (deterministic rowid tiebreaker)
42+
- Release notes preservation in CI workflow
43+
- Clippy warnings: `map_or``is_some_and`, `len() > 0``!is_empty()`, field reassignment, unnecessary deref
44+
845
## [0.2.2] - 2026-01-29
946

1047
### Added

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "task-graph-mcp"
3-
version = "0.2.2"
3+
version = "0.3.0"
44
edition = "2024"
55
description = "MCP server for agent task workflows with phases, prompts, gates, and multi-agent coordination"
66
license = "Apache-2.0"

README.md

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ When you have AI agents working on complex tasks, things go wrong fast. Agents l
3636
| **Live Status** | Real-time "current thought" visible to other agents |
3737
| **Full-text Search** | FTS5-powered search across tasks and attachments |
3838
| **Attachments** | Inline content, file references, or media storage |
39+
| **Agent Feedback** | Inter-agent communication with categorized feedback (conditional on config) |
40+
| **Dynamic Overlays** | Runtime workflow customization via add/remove overlay tools |
3941

4042
## Quick Start
4143

@@ -283,9 +285,12 @@ Environment variables:
283285
284286
| Tool | Description |
285287
|------|-------------|
286-
| `connect(worker_id?, tags?, workflow?, force?, db_path?, media_dir?, log_dir?, config_path?)` | Register a worker. Optional `workflow` selects named workflow (solo, swarm, relay, hierarchical). Returns `worker_id` and active `paths`. |
288+
| `connect(worker_id?, tags?, workflow?, force?, db_path?, media_dir?, log_dir?, config_path?, overlays?: str[])` | Register a worker. Optional `workflow` selects named workflow (solo, swarm, relay, hierarchical). Returns `worker_id` and active `paths`. |
287289
| `disconnect(worker_id: worker_str, final_status?: status_str = "pending")` | Unregister worker and release all claims/locks. |
288-
| `list_workers(tags?: str[], file?: filename, task?: task_str, depth?: int)` | List connected workers with filters. |
290+
| `list_agents(tags?: str[], file?: filename, task?: task_str, depth?: int, stale_timeout?: int)` | List connected workers with filters. |
291+
| `cleanup_stale(worker_id: str, stale_timeout?: int)` | Evict stale workers and release their claims. |
292+
| `add_overlay(worker_id: str, overlay: str)` | Add a dynamic workflow overlay to a connected worker. |
293+
| `remove_overlay(worker_id: str, overlay: str)` | Remove a workflow overlay from a connected worker. |
289294
290295
### Task CRUD
291296
@@ -294,7 +299,7 @@ Environment variables:
294299
| `create(description: str, id?: task_str, parent?: task_str, priority?: int = 5, points?: int, time_estimate_ms?: int, tags?: str[])` | Create a task. Priority 0-10 (higher = more important). |
295300
| `create_tree(tree, parent?, child_type?, sibling_type?)` | Create nested task tree. `child_type` (default: "contains") for parent→child deps, `sibling_type` for sibling deps. |
296301
| `get(task: task_str)` | Get task by ID with attachment metadata and counts. |
297-
| `list_tasks(status?: status_str[], ready?: bool, blocked?: bool, claimed?: bool, owner?: worker_str, parent?: task_str, worker_id?: worker_str, tags_any?: str[], tags_all?: str[], sort_by?: str, sort_order?: str, limit?: int)` | Query tasks with filters. Use `ready=true` for claimable tasks. |
302+
| `list_tasks(status?: status_str[], ready?: bool, blocked?: bool, claimed?: bool, owner?: worker_str, parent?: task_str, worker_id?: worker_str, tags_any?: str[], tags_all?: str[], sort_by?: str, sort_order?: str, limit?: int, offset?: int, recursive?: bool)` | Query tasks with filters. Use `ready=true` for claimable tasks. |
298303
| `update(worker_id: worker_str, task: task_str, status?: status_str, phase?: str, assignee?: worker_str, title?: str, description?: str, priority?: int, points?: int, tags?: str[], needed_tags?: str[], wanted_tags?: str[], time_estimate_ms?: int, reason?: str, force?: bool, attachments?: object[])` | Update task. Status/phase changes auto-manage ownership and trigger prompts. Include `attachments` to record commits/changelists. |
299304
| `delete(worker_id: worker_str, task: task_str, cascade?: bool, reason?: str, obliterate?: bool, force?: bool)` | Delete task. Soft delete by default; `obliterate=true` for permanent. |
300305
| `scan(task: task_str, before?: int, after?: int, above?: int, below?: int)` | Scan task graph in multiple directions. Depth: 0=none, N=levels, -1=all. |
@@ -326,6 +331,8 @@ Environment variables:
326331
| `project_history(from?: datetime_str, to?: datetime_str, states?: status_str[], limit?: int = 100)` | Project-wide history with date range filters. |
327332
| `log_metrics(worker_id: worker_str, task: task_str, cost_usd?: float, values?: int[8])` | Log metrics (aggregated). |
328333
| `get_metrics(task: task_str\|task_str[])` | Get metrics for task(s). |
334+
| `give_feedback(agent: str, target_agent?: str, category: str, sentiment: str, message: str, tool_name?: str, task_id?: str)` | Record feedback between agents (conditional on config). |
335+
| `list_feedback()` | List all recorded agent feedback. |
329336
330337
### File Coordination
331338
@@ -352,6 +359,8 @@ Environment variables:
352359
| `query(sql: str, params?: str[], limit?: int = 100, format?: str)` | Execute read-only SQL. SELECT only. Requires permission. |
353360
| `get_schema(table?: str, include_sql?: bool)` | Get database schema. Returns table names, columns, types, and foreign keys. |
354361
| `list_workflows()` | List available workflow configurations (solo, swarm, relay, hierarchical, etc.). |
362+
| `list_skills()` | List available bundled skills with descriptions. |
363+
| `get_skill(name: str)` | Get full content of a bundled skill. |
355364
356365
## MCP Resources
357366
@@ -507,6 +516,9 @@ Pre-built workflow topologies optimize for different coordination patterns:
507516
| `swarm` | Parallel generalists, pull-based | High throughput, independent tasks |
508517
| `relay` | Sequential specialists, handoffs | Complex tasks, domain expertise |
509518
| `hierarchical` | Lead/worker delegation | Large projects, team coordination |
519+
| `push` | Push-based task distribution topology | Centralized assignment, load balancing |
520+
| `kanban` | Board-style task management with WIP limits | Continuous flow, visual tracking |
521+
| `sprint` | Time-boxed iteration planning | Scrum teams, fixed cadence |
510522

511523
Select a workflow on connect:
512524

@@ -619,6 +631,8 @@ Worker B: mark_file("worker-b", "src/main.rs", "adding tests")
619631
| [WORKFLOW_TOPOLOGIES.md](docs/WORKFLOW_TOPOLOGIES.md) | Multi-agent workflow patterns (solo, swarm, relay, hierarchical) |
620632
| [EXPORT_IMPORT.md](docs/EXPORT_IMPORT.md) | Data export and import functionality |
621633
| [PROCESSES.md](docs/PROCESSES.md) | Release process, changelog maintenance |
634+
| [GATES.md](docs/GATES.md) | Workflow gate conditions and enforcement |
635+
| [METRICS.md](docs/METRICS.md) | Experiment metrics definitions and SQL examples |
622636
623637
## License
624638

0 commit comments

Comments
 (0)