macro-agent 0.0.11 → 0.0.12
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/.macro-agent/teams/self-driving/prompts/grinder.md +27 -0
- package/.macro-agent/teams/self-driving/prompts/judge.md +27 -0
- package/.macro-agent/teams/self-driving/prompts/planner.md +33 -0
- package/.macro-agent/teams/self-driving/roles/grinder.yaml +17 -0
- package/.macro-agent/teams/self-driving/roles/judge.yaml +24 -0
- package/.macro-agent/teams/self-driving/roles/planner.yaml +18 -0
- package/.macro-agent/teams/self-driving/team.yaml +103 -0
- package/.macro-agent/teams/structured/prompts/developer.md +26 -0
- package/.macro-agent/teams/structured/prompts/lead.md +25 -0
- package/.macro-agent/teams/structured/prompts/reviewer.md +24 -0
- package/.macro-agent/teams/structured/roles/developer.yaml +12 -0
- package/.macro-agent/teams/structured/roles/lead.yaml +11 -0
- package/.macro-agent/teams/structured/roles/reviewer.yaml +19 -0
- package/.macro-agent/teams/structured/team.yaml +89 -0
- package/.sudocode/issues.jsonl +6 -0
- package/.sudocode/specs.jsonl +7 -0
- package/CLAUDE.md +110 -30
- package/README.md +60 -3
- package/dist/acp/macro-agent.d.ts +4 -0
- package/dist/acp/macro-agent.d.ts.map +1 -1
- package/dist/acp/macro-agent.js +50 -4
- package/dist/acp/macro-agent.js.map +1 -1
- package/dist/acp/session-mapper.d.ts +20 -1
- package/dist/acp/session-mapper.d.ts.map +1 -1
- package/dist/acp/session-mapper.js +90 -1
- package/dist/acp/session-mapper.js.map +1 -1
- package/dist/acp/types.d.ts +24 -1
- package/dist/acp/types.d.ts.map +1 -1
- package/dist/acp/types.js.map +1 -1
- package/dist/agent/agent-manager.d.ts +25 -1
- package/dist/agent/agent-manager.d.ts.map +1 -1
- package/dist/agent/agent-manager.js +93 -7
- package/dist/agent/agent-manager.js.map +1 -1
- package/dist/agent/types.d.ts +22 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/agent-detection/command-builder.d.ts +30 -0
- package/dist/agent-detection/command-builder.d.ts.map +1 -0
- package/dist/agent-detection/command-builder.js +71 -0
- package/dist/agent-detection/command-builder.js.map +1 -0
- package/dist/agent-detection/detector.d.ts +84 -0
- package/dist/agent-detection/detector.d.ts.map +1 -0
- package/dist/agent-detection/detector.js +240 -0
- package/dist/agent-detection/detector.js.map +1 -0
- package/dist/agent-detection/index.d.ts +12 -0
- package/dist/agent-detection/index.d.ts.map +1 -0
- package/dist/agent-detection/index.js +14 -0
- package/dist/agent-detection/index.js.map +1 -0
- package/dist/agent-detection/registry.d.ts +53 -0
- package/dist/agent-detection/registry.d.ts.map +1 -0
- package/dist/agent-detection/registry.js +177 -0
- package/dist/agent-detection/registry.js.map +1 -0
- package/dist/agent-detection/types.d.ts +121 -0
- package/dist/agent-detection/types.d.ts.map +1 -0
- package/dist/agent-detection/types.js +20 -0
- package/dist/agent-detection/types.js.map +1 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +95 -0
- package/dist/api/server.js.map +1 -1
- package/dist/cli/index.js +29 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp.js +38 -0
- package/dist/cli/mcp.js.map +1 -1
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/project-config.d.ts +46 -0
- package/dist/config/project-config.d.ts.map +1 -0
- package/dist/config/project-config.js +68 -0
- package/dist/config/project-config.js.map +1 -0
- package/dist/lifecycle/cascade.d.ts +1 -1
- package/dist/lifecycle/cascade.d.ts.map +1 -1
- package/dist/lifecycle/handlers/index.d.ts +4 -0
- package/dist/lifecycle/handlers/index.d.ts.map +1 -1
- package/dist/lifecycle/handlers/index.js +2 -0
- package/dist/lifecycle/handlers/index.js.map +1 -1
- package/dist/lifecycle/handlers/worker.d.ts +4 -0
- package/dist/lifecycle/handlers/worker.d.ts.map +1 -1
- package/dist/lifecycle/handlers/worker.js +35 -3
- package/dist/lifecycle/handlers/worker.js.map +1 -1
- package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
- package/dist/map/adapter/acp-over-map.js +32 -2
- package/dist/map/adapter/acp-over-map.js.map +1 -1
- package/dist/map/adapter/event-translator.d.ts.map +1 -1
- package/dist/map/adapter/event-translator.js +1 -0
- package/dist/map/adapter/event-translator.js.map +1 -1
- package/dist/map/adapter/extensions/agent-detection.d.ts +49 -0
- package/dist/map/adapter/extensions/agent-detection.d.ts.map +1 -0
- package/dist/map/adapter/extensions/agent-detection.js +91 -0
- package/dist/map/adapter/extensions/agent-detection.js.map +1 -0
- package/dist/map/adapter/extensions/index.d.ts +10 -1
- package/dist/map/adapter/extensions/index.d.ts.map +1 -1
- package/dist/map/adapter/extensions/index.js +39 -0
- package/dist/map/adapter/extensions/index.js.map +1 -1
- package/dist/map/adapter/extensions/resume.d.ts +47 -0
- package/dist/map/adapter/extensions/resume.d.ts.map +1 -0
- package/dist/map/adapter/extensions/resume.js +59 -0
- package/dist/map/adapter/extensions/resume.js.map +1 -0
- package/dist/map/adapter/extensions/workspace-files.d.ts +42 -0
- package/dist/map/adapter/extensions/workspace-files.d.ts.map +1 -0
- package/dist/map/adapter/extensions/workspace-files.js +338 -0
- package/dist/map/adapter/extensions/workspace-files.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +6 -0
- package/dist/mcp/mcp-server.d.ts.map +1 -1
- package/dist/mcp/mcp-server.js +45 -0
- package/dist/mcp/mcp-server.js.map +1 -1
- package/dist/mcp/tools/claim_task.d.ts +35 -0
- package/dist/mcp/tools/claim_task.d.ts.map +1 -0
- package/dist/mcp/tools/claim_task.js +58 -0
- package/dist/mcp/tools/claim_task.js.map +1 -0
- package/dist/mcp/tools/done.d.ts +11 -2
- package/dist/mcp/tools/done.d.ts.map +1 -1
- package/dist/mcp/tools/done.js +15 -10
- package/dist/mcp/tools/done.js.map +1 -1
- package/dist/mcp/tools/list_claimable_tasks.d.ts +38 -0
- package/dist/mcp/tools/list_claimable_tasks.d.ts.map +1 -0
- package/dist/mcp/tools/list_claimable_tasks.js +63 -0
- package/dist/mcp/tools/list_claimable_tasks.js.map +1 -0
- package/dist/mcp/tools/unclaim_task.d.ts +31 -0
- package/dist/mcp/tools/unclaim_task.d.ts.map +1 -0
- package/dist/mcp/tools/unclaim_task.js +47 -0
- package/dist/mcp/tools/unclaim_task.js.map +1 -0
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +2 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/metrics.d.ts +79 -0
- package/dist/metrics/metrics.d.ts.map +1 -0
- package/dist/metrics/metrics.js +166 -0
- package/dist/metrics/metrics.js.map +1 -0
- package/dist/roles/capabilities.d.ts +1 -0
- package/dist/roles/capabilities.d.ts.map +1 -1
- package/dist/roles/capabilities.js +3 -0
- package/dist/roles/capabilities.js.map +1 -1
- package/dist/roles/types.d.ts +1 -1
- package/dist/roles/types.d.ts.map +1 -1
- package/dist/router/message-router.d.ts +41 -0
- package/dist/router/message-router.d.ts.map +1 -1
- package/dist/router/message-router.js +136 -5
- package/dist/router/message-router.js.map +1 -1
- package/dist/store/event-store.d.ts +8 -1
- package/dist/store/event-store.d.ts.map +1 -1
- package/dist/store/event-store.js +120 -4
- package/dist/store/event-store.js.map +1 -1
- package/dist/store/types/agents.d.ts +1 -1
- package/dist/store/types/agents.d.ts.map +1 -1
- package/dist/store/types/events.d.ts +1 -1
- package/dist/store/types/events.d.ts.map +1 -1
- package/dist/store/types/events.js.map +1 -1
- package/dist/store/types/index.d.ts +1 -0
- package/dist/store/types/index.d.ts.map +1 -1
- package/dist/store/types/index.js +1 -0
- package/dist/store/types/index.js.map +1 -1
- package/dist/store/types/sessions.d.ts +44 -0
- package/dist/store/types/sessions.d.ts.map +1 -0
- package/dist/store/types/sessions.js +9 -0
- package/dist/store/types/sessions.js.map +1 -0
- package/dist/store/types/tasks.d.ts +2 -0
- package/dist/store/types/tasks.d.ts.map +1 -1
- package/dist/task/backend/memory.d.ts +4 -1
- package/dist/task/backend/memory.d.ts.map +1 -1
- package/dist/task/backend/memory.js +81 -0
- package/dist/task/backend/memory.js.map +1 -1
- package/dist/task/backend/types.d.ts +30 -0
- package/dist/task/backend/types.d.ts.map +1 -1
- package/dist/task/backend/types.js.map +1 -1
- package/dist/teams/index.d.ts +4 -0
- package/dist/teams/index.d.ts.map +1 -0
- package/dist/teams/index.js +4 -0
- package/dist/teams/index.js.map +1 -0
- package/dist/teams/team-loader.d.ts +20 -0
- package/dist/teams/team-loader.d.ts.map +1 -0
- package/dist/teams/team-loader.js +293 -0
- package/dist/teams/team-loader.js.map +1 -0
- package/dist/teams/team-runtime.d.ts +139 -0
- package/dist/teams/team-runtime.d.ts.map +1 -0
- package/dist/teams/team-runtime.js +613 -0
- package/dist/teams/team-runtime.js.map +1 -0
- package/dist/teams/types.d.ts +266 -0
- package/dist/teams/types.d.ts.map +1 -0
- package/dist/teams/types.js +20 -0
- package/dist/teams/types.js.map +1 -0
- package/dist/workspace/dataplane-adapter.d.ts +1 -1
- package/dist/workspace/dataplane-adapter.d.ts.map +1 -1
- package/dist/workspace/dataplane-adapter.js +1 -1
- package/dist/workspace/dataplane-adapter.js.map +1 -1
- package/dist/workspace/index.d.ts +1 -1
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/strategies/index.d.ts +6 -0
- package/dist/workspace/strategies/index.d.ts.map +1 -0
- package/dist/workspace/strategies/index.js +5 -0
- package/dist/workspace/strategies/index.js.map +1 -0
- package/dist/workspace/strategies/optimistic.d.ts +26 -0
- package/dist/workspace/strategies/optimistic.d.ts.map +1 -0
- package/dist/workspace/strategies/optimistic.js +121 -0
- package/dist/workspace/strategies/optimistic.js.map +1 -0
- package/dist/workspace/strategies/queue.d.ts +26 -0
- package/dist/workspace/strategies/queue.d.ts.map +1 -0
- package/dist/workspace/strategies/queue.js +67 -0
- package/dist/workspace/strategies/queue.js.map +1 -0
- package/dist/workspace/strategies/registry.d.ts +37 -0
- package/dist/workspace/strategies/registry.d.ts.map +1 -0
- package/dist/workspace/strategies/registry.js +63 -0
- package/dist/workspace/strategies/registry.js.map +1 -0
- package/dist/workspace/strategies/trunk.d.ts +20 -0
- package/dist/workspace/strategies/trunk.d.ts.map +1 -0
- package/dist/workspace/strategies/trunk.js +108 -0
- package/dist/workspace/strategies/trunk.js.map +1 -0
- package/dist/workspace/strategies/types.d.ts +104 -0
- package/dist/workspace/strategies/types.d.ts.map +1 -0
- package/dist/workspace/strategies/types.js +11 -0
- package/dist/workspace/strategies/types.js.map +1 -0
- package/dist/workspace/types.d.ts +1 -1
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/workspace-manager.d.ts +1 -1
- package/dist/workspace/workspace-manager.d.ts.map +1 -1
- package/docs/implementation-details.md +1127 -0
- package/docs/implementation-summary.md +448 -0
- package/docs/plan-self-driving-support.md +433 -0
- package/docs/spec-self-driving-support.md +462 -0
- package/docs/team-templates.md +860 -0
- package/docs/teams.md +233 -0
- package/package.json +4 -2
- package/src/acp/__tests__/integration.test.ts +161 -1
- package/src/acp/__tests__/macro-agent.test.ts +95 -0
- package/src/acp/__tests__/session-persistence.test.ts +276 -0
- package/src/acp/macro-agent.ts +79 -7
- package/src/acp/session-mapper.ts +108 -1
- package/src/acp/types.ts +33 -1
- package/src/agent/agent-manager.ts +158 -6
- package/src/agent/types.ts +27 -0
- package/src/agent-detection/__tests__/command-builder.test.ts +336 -0
- package/src/agent-detection/__tests__/detector.test.ts +768 -0
- package/src/agent-detection/__tests__/registry.test.ts +254 -0
- package/src/agent-detection/command-builder.ts +90 -0
- package/src/agent-detection/detector.ts +307 -0
- package/src/agent-detection/index.ts +36 -0
- package/src/agent-detection/registry.ts +200 -0
- package/src/agent-detection/types.ts +184 -0
- package/src/api/server.ts +110 -0
- package/src/cli/index.ts +44 -0
- package/src/cli/mcp.ts +47 -0
- package/src/config/index.ts +9 -0
- package/src/config/project-config.ts +107 -0
- package/src/lifecycle/cascade.ts +1 -1
- package/src/lifecycle/handlers/index.ts +8 -0
- package/src/lifecycle/handlers/worker.ts +48 -3
- package/src/map/adapter/__tests__/extensions.test.ts +359 -0
- package/src/map/adapter/__tests__/workspace-files.test.ts +673 -0
- package/src/map/adapter/acp-over-map.ts +45 -2
- package/src/map/adapter/event-translator.ts +1 -0
- package/src/map/adapter/extensions/agent-detection.ts +201 -0
- package/src/map/adapter/extensions/index.ts +63 -0
- package/src/map/adapter/extensions/resume.ts +114 -0
- package/src/map/adapter/extensions/workspace-files.ts +449 -0
- package/src/mcp/mcp-server.ts +67 -0
- package/src/mcp/tools/claim_task.ts +86 -0
- package/src/mcp/tools/done.ts +24 -10
- package/src/mcp/tools/list_claimable_tasks.ts +93 -0
- package/src/mcp/tools/unclaim_task.ts +71 -0
- package/src/metrics/index.ts +9 -0
- package/src/metrics/metrics.ts +280 -0
- package/src/roles/capabilities.ts +3 -0
- package/src/roles/types.ts +2 -1
- package/src/router/__tests__/message-router.test.ts +561 -0
- package/src/router/message-router.ts +223 -6
- package/src/store/event-store.ts +151 -3
- package/src/store/types/agents.ts +1 -1
- package/src/store/types/events.ts +2 -1
- package/src/store/types/index.ts +1 -0
- package/src/store/types/sessions.ts +53 -0
- package/src/store/types/tasks.ts +3 -0
- package/src/task/backend/memory.ts +116 -0
- package/src/task/backend/types.ts +43 -0
- package/src/teams/__tests__/cross-subsystem.integration.test.ts +983 -0
- package/src/teams/__tests__/e2e/team-runtime.e2e.test.ts +553 -0
- package/src/teams/__tests__/team-system.test.ts +1280 -0
- package/src/teams/index.ts +13 -0
- package/src/teams/team-loader.ts +434 -0
- package/src/teams/team-runtime.ts +727 -0
- package/src/teams/types.ts +377 -0
- package/src/workspace/dataplane-adapter.ts +1 -1
- package/src/workspace/index.ts +1 -1
- package/src/workspace/strategies/index.ts +18 -0
- package/src/workspace/strategies/optimistic.ts +136 -0
- package/src/workspace/strategies/queue.ts +81 -0
- package/src/workspace/strategies/registry.ts +89 -0
- package/src/workspace/strategies/trunk.ts +123 -0
- package/src/workspace/strategies/types.ts +145 -0
- package/src/workspace/types.ts +1 -1
- package/src/workspace/workspace-manager.ts +1 -1
- package/.claude/settings.local.json +0 -59
- package/dist/map/utils/address-translation.d.ts +0 -99
- package/dist/map/utils/address-translation.d.ts.map +0 -1
- package/dist/map/utils/address-translation.js +0 -285
- package/dist/map/utils/address-translation.js.map +0 -1
- package/dist/map/utils/index.d.ts +0 -7
- package/dist/map/utils/index.d.ts.map +0 -1
- package/dist/map/utils/index.js +0 -7
- package/dist/map/utils/index.js.map +0 -1
- package/references/acp-factory-ref/CHANGELOG.md +0 -33
- package/references/acp-factory-ref/LICENSE +0 -21
- package/references/acp-factory-ref/README.md +0 -341
- package/references/acp-factory-ref/package-lock.json +0 -3102
- package/references/acp-factory-ref/package.json +0 -96
- package/references/acp-factory-ref/python/CHANGELOG.md +0 -33
- package/references/acp-factory-ref/python/LICENSE +0 -21
- package/references/acp-factory-ref/python/Makefile +0 -57
- package/references/acp-factory-ref/python/README.md +0 -253
- package/references/acp-factory-ref/python/pyproject.toml +0 -73
- package/references/acp-factory-ref/python/tests/__init__.py +0 -0
- package/references/acp-factory-ref/python/tests/e2e/__init__.py +0 -1
- package/references/acp-factory-ref/python/tests/e2e/test_codex_e2e.py +0 -349
- package/references/acp-factory-ref/python/tests/e2e/test_gemini_e2e.py +0 -165
- package/references/acp-factory-ref/python/tests/e2e/test_opencode_e2e.py +0 -296
- package/references/acp-factory-ref/python/tests/test_client_handler.py +0 -543
- package/references/acp-factory-ref/python/tests/test_pushable.py +0 -199
- package/references/claude-code-acp/.github/workflows/ci.yml +0 -45
- package/references/claude-code-acp/.github/workflows/publish.yml +0 -34
- package/references/claude-code-acp/.prettierrc.json +0 -4
- package/references/claude-code-acp/CHANGELOG.md +0 -249
- package/references/claude-code-acp/LICENSE +0 -222
- package/references/claude-code-acp/README.md +0 -53
- package/references/claude-code-acp/docs/RELEASES.md +0 -24
- package/references/claude-code-acp/eslint.config.js +0 -48
- package/references/claude-code-acp/package-lock.json +0 -4570
- package/references/claude-code-acp/package.json +0 -88
- package/references/claude-code-acp/scripts/release.sh +0 -119
- package/references/claude-code-acp/src/acp-agent.ts +0 -2065
- package/references/claude-code-acp/src/index.ts +0 -26
- package/references/claude-code-acp/src/lib.ts +0 -38
- package/references/claude-code-acp/src/mcp-server.ts +0 -911
- package/references/claude-code-acp/src/settings.ts +0 -522
- package/references/claude-code-acp/src/tests/.claude/commands/quick-math.md +0 -5
- package/references/claude-code-acp/src/tests/.claude/commands/say-hello.md +0 -6
- package/references/claude-code-acp/src/tests/acp-agent-fork.test.ts +0 -479
- package/references/claude-code-acp/src/tests/acp-agent.test.ts +0 -1502
- package/references/claude-code-acp/src/tests/extract-lines.test.ts +0 -103
- package/references/claude-code-acp/src/tests/fork-session.test.ts +0 -335
- package/references/claude-code-acp/src/tests/replace-and-calculate-location.test.ts +0 -334
- package/references/claude-code-acp/src/tests/settings.test.ts +0 -617
- package/references/claude-code-acp/src/tests/skills-options.test.ts +0 -187
- package/references/claude-code-acp/src/tests/tools.test.ts +0 -318
- package/references/claude-code-acp/src/tests/typescript-declarations.test.ts +0 -558
- package/references/claude-code-acp/src/tools.ts +0 -819
- package/references/claude-code-acp/src/utils.ts +0 -171
- package/references/claude-code-acp/tsconfig.json +0 -18
- package/references/claude-code-acp/vitest.config.ts +0 -19
- package/references/multi-agent-protocol/.sudocode/issues.jsonl +0 -111
- package/references/multi-agent-protocol/.sudocode/specs.jsonl +0 -13
- package/references/multi-agent-protocol/LICENSE +0 -21
- package/references/multi-agent-protocol/README.md +0 -113
- package/references/multi-agent-protocol/docs/00-design-specification.md +0 -496
- package/references/multi-agent-protocol/docs/01-open-questions.md +0 -1050
- package/references/multi-agent-protocol/docs/02-wire-protocol.md +0 -296
- package/references/multi-agent-protocol/docs/03-streaming-semantics.md +0 -252
- package/references/multi-agent-protocol/docs/04-error-handling.md +0 -231
- package/references/multi-agent-protocol/docs/05-connection-model.md +0 -244
- package/references/multi-agent-protocol/docs/06-visibility-permissions.md +0 -243
- package/references/multi-agent-protocol/docs/07-federation.md +0 -259
- package/references/multi-agent-protocol/docs/08-macro-agent-migration.md +0 -253
- package/references/multi-agent-protocol/docs/09-authentication.md +0 -680
- package/references/multi-agent-protocol/docs/10-mail-protocol.md +0 -553
- package/references/multi-agent-protocol/docs/agent-iam-integration.md +0 -877
- package/references/multi-agent-protocol/docs/agentic-mesh-integration-draft.md +0 -459
- package/references/multi-agent-protocol/docs/git-transport-draft.md +0 -251
- package/references/multi-agent-protocol/docs-site/Gemfile +0 -22
- package/references/multi-agent-protocol/docs-site/README.md +0 -82
- package/references/multi-agent-protocol/docs-site/_config.yml +0 -91
- package/references/multi-agent-protocol/docs-site/_includes/head_custom.html +0 -20
- package/references/multi-agent-protocol/docs-site/_sass/color_schemes/map.scss +0 -42
- package/references/multi-agent-protocol/docs-site/_sass/custom/custom.scss +0 -34
- package/references/multi-agent-protocol/docs-site/examples/full-integration.md +0 -510
- package/references/multi-agent-protocol/docs-site/examples/index.md +0 -138
- package/references/multi-agent-protocol/docs-site/examples/simple-chat.md +0 -282
- package/references/multi-agent-protocol/docs-site/examples/task-queue.md +0 -399
- package/references/multi-agent-protocol/docs-site/getting-started/index.md +0 -98
- package/references/multi-agent-protocol/docs-site/getting-started/installation.md +0 -219
- package/references/multi-agent-protocol/docs-site/getting-started/overview.md +0 -172
- package/references/multi-agent-protocol/docs-site/getting-started/quickstart.md +0 -237
- package/references/multi-agent-protocol/docs-site/index.md +0 -136
- package/references/multi-agent-protocol/docs-site/protocol/authentication.md +0 -391
- package/references/multi-agent-protocol/docs-site/protocol/connection-model.md +0 -376
- package/references/multi-agent-protocol/docs-site/protocol/design.md +0 -284
- package/references/multi-agent-protocol/docs-site/protocol/error-handling.md +0 -312
- package/references/multi-agent-protocol/docs-site/protocol/federation.md +0 -449
- package/references/multi-agent-protocol/docs-site/protocol/index.md +0 -129
- package/references/multi-agent-protocol/docs-site/protocol/permissions.md +0 -398
- package/references/multi-agent-protocol/docs-site/protocol/streaming.md +0 -353
- package/references/multi-agent-protocol/docs-site/protocol/wire-protocol.md +0 -369
- package/references/multi-agent-protocol/docs-site/sdk/api/agent.md +0 -357
- package/references/multi-agent-protocol/docs-site/sdk/api/client.md +0 -380
- package/references/multi-agent-protocol/docs-site/sdk/api/index.md +0 -62
- package/references/multi-agent-protocol/docs-site/sdk/api/server.md +0 -453
- package/references/multi-agent-protocol/docs-site/sdk/api/types.md +0 -468
- package/references/multi-agent-protocol/docs-site/sdk/guides/agent.md +0 -375
- package/references/multi-agent-protocol/docs-site/sdk/guides/authentication.md +0 -405
- package/references/multi-agent-protocol/docs-site/sdk/guides/client.md +0 -352
- package/references/multi-agent-protocol/docs-site/sdk/guides/index.md +0 -89
- package/references/multi-agent-protocol/docs-site/sdk/guides/server.md +0 -360
- package/references/multi-agent-protocol/docs-site/sdk/guides/testing.md +0 -446
- package/references/multi-agent-protocol/docs-site/sdk/guides/transports.md +0 -363
- package/references/multi-agent-protocol/docs-site/sdk/index.md +0 -206
- package/references/multi-agent-protocol/package-lock.json +0 -3886
- package/references/multi-agent-protocol/package.json +0 -56
- package/references/multi-agent-protocol/schema/meta.json +0 -467
- package/references/multi-agent-protocol/schema/schema.json +0 -2558
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
# Spec: Self-Driving Codebases Support
|
|
2
|
+
|
|
3
|
+
Implementation specification for adding modular team templates, pluggable integration strategies, task pull model, and session continuations to macro-agent.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Enable macro-agent to support multiple agent team configurations — from the existing structured coordinator/integrator/worker pattern to Cursor-style autonomous self-driving teams with planners, workers, and judges — through a declarative team template layer on top of the existing role-agnostic core.
|
|
8
|
+
|
|
9
|
+
### Companion Documents
|
|
10
|
+
|
|
11
|
+
| Document | Purpose |
|
|
12
|
+
|----------|---------|
|
|
13
|
+
| [plan-self-driving-support.md](plan-self-driving-support.md) | High-level plan, design decisions D1-D5, phase overview |
|
|
14
|
+
| [team-templates.md](team-templates.md) | Team template format, communication topology, examples |
|
|
15
|
+
| [implementation-details.md](implementation-details.md) | Resolved ambiguities A1-A10, concrete code integration points |
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Resolved Design Decisions
|
|
20
|
+
|
|
21
|
+
The following decisions were discussed and agreed upon. They are binding for implementation.
|
|
22
|
+
|
|
23
|
+
### RD1: Fix hardcoded `done()` capability check (Prerequisite)
|
|
24
|
+
|
|
25
|
+
`src/mcp/tools/done.ts:98-103` hardcodes which roles can call `done()`. This blocks team-defined roles from completing.
|
|
26
|
+
|
|
27
|
+
**Decision**: Replace the hardcoded role set with a proper `roleRegistry.hasCapability(role, 'lifecycle.done')` lookup. The `RoleRegistry` must be accessible from the MCP subprocess (it already is via the `roleRegistry` field on `MCPServices`).
|
|
28
|
+
|
|
29
|
+
**Scope**: Prerequisite work before Phase 1. Small, isolated change.
|
|
30
|
+
|
|
31
|
+
### RD2: Team config shared via EventStore
|
|
32
|
+
|
|
33
|
+
The MCP server runs as a subprocess communicating via stdio. It shares state with the main process through a SQLite-backed EventStore (same `instanceId`).
|
|
34
|
+
|
|
35
|
+
**Decision**: Store team configuration in the EventStore as a `team_config` event when the team initializes. The MCP subprocess reads this event to reconstruct team context (integration strategy name, task mode, communication enforcement level). The subprocess instantiates the integration strategy from the default registry using the stored config.
|
|
36
|
+
|
|
37
|
+
**Rationale**: The EventStore is already the cross-process shared state channel. This avoids adding an HTTP API between main process and MCP subprocess. The MCP subprocess already calls `eventStore.reload()` to get fresh data.
|
|
38
|
+
|
|
39
|
+
**Implementation**:
|
|
40
|
+
```
|
|
41
|
+
Main process (TeamRuntime.initialize()):
|
|
42
|
+
1. Store team_config event with { strategy, strategyConfig, taskMode, enforcement, teamName }
|
|
43
|
+
2. Event persists to SQLite
|
|
44
|
+
|
|
45
|
+
MCP subprocess (mcp.ts):
|
|
46
|
+
1. Read team_config event from EventStore (after agent lookup)
|
|
47
|
+
2. If present: instantiate strategy from registry, set taskMode
|
|
48
|
+
3. Pass to MCPServices → DoneToolDeps → handler deps
|
|
49
|
+
4. If absent: existing behavior (mergeQueue fallback)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### RD3: spawn_rules generate capabilities
|
|
53
|
+
|
|
54
|
+
Team manifest `spawn_rules` are syntactic sugar over the capability system.
|
|
55
|
+
|
|
56
|
+
**Decision**: `TeamLoader` translates spawn rules into capability additions on the role definition. `planner: [grinder, planner]` becomes `capabilities_add: ['agent.spawn.grinder', 'agent.spawn.planner']`. The existing `AgentManager.spawn()` capability check runs unchanged.
|
|
57
|
+
|
|
58
|
+
**Why not override**: A single enforcement mechanism is easier to reason about. Spawn rules make the manifest readable; capabilities are the enforcement layer.
|
|
59
|
+
|
|
60
|
+
### RD4: Team prompt replaces base role systemPrompt
|
|
61
|
+
|
|
62
|
+
When a team provides `prompts/planner.md`, it is the sole role-level prompt for that agent.
|
|
63
|
+
|
|
64
|
+
**Decision**: `customPrompt` in `SpawnAgentOptions` replaces `resolvedRole.systemPrompt` in prompt assembly. The base coordinator's `systemPrompt` is not appended. The team author owns the full role prompt — they can include coordinator-like instructions if needed.
|
|
65
|
+
|
|
66
|
+
**Rationale**: The base role's `systemPrompt` will eventually be factored into a dedicated team topology. Keeping it out of team-loaded agents avoids conflicting instructions.
|
|
67
|
+
|
|
68
|
+
### RD5: Optimistic strategy is thin — validation is the judge's job
|
|
69
|
+
|
|
70
|
+
The `OptimisticIntegrationStrategy.land()` pushes changes and emits a `validation:requested` event. It does not run build/test/lint.
|
|
71
|
+
|
|
72
|
+
**Decision**: Validation (build, test, fixup task creation, green branch snapshotting) is the responsibility of the judge agent, driven by its role prompt and the team's communication topology. The strategy is intentionally simple.
|
|
73
|
+
|
|
74
|
+
### RD6: Team selection via macro-agent config, not just CLI flag
|
|
75
|
+
|
|
76
|
+
Rather than requiring `--team` on every invocation, the active team is stored in macro-agent project-level configuration.
|
|
77
|
+
|
|
78
|
+
**Decision**: Add a `team` field to `.macro-agent/config.json` (new file, alongside existing `.macro-agent/roles.json`). The CLI `--team` flag overrides the config. When neither is set, no team is loaded (existing behavior).
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
// .macro-agent/config.json
|
|
82
|
+
{
|
|
83
|
+
"team": "self-driving"
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**Loading priority**: CLI `--team` flag > `.macro-agent/config.json` > no team (default)
|
|
88
|
+
|
|
89
|
+
### RD7: YAML library
|
|
90
|
+
|
|
91
|
+
**Decision**: Use `js-yaml` (MIT license, most widely used, stable). Add as a runtime dependency.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Requirements
|
|
96
|
+
|
|
97
|
+
### Phase 0: Prerequisites
|
|
98
|
+
|
|
99
|
+
#### P0.1: Fix done() capability check
|
|
100
|
+
|
|
101
|
+
| | |
|
|
102
|
+
|---|---|
|
|
103
|
+
| **What** | Replace hardcoded role set in `hasLifecycleDoneCapability()` with `roleRegistry.hasCapability()` lookup |
|
|
104
|
+
| **Where** | `src/mcp/tools/done.ts` |
|
|
105
|
+
| **Input** | Agent ID, EventStore, RoleRegistry |
|
|
106
|
+
| **Output** | `{ hasCapability: boolean, role: string }` using actual capability resolution |
|
|
107
|
+
| **Constraint** | RoleRegistry must be passed through to the done tool. Currently `MCPServices` has an optional `roleRegistry` field — make it required or ensure it's always provided |
|
|
108
|
+
| **Success** | Team-defined roles (planner, grinder, judge) that extend built-in roles and inherit `lifecycle.done` can call `done()` |
|
|
109
|
+
| **Test** | Unit test: register a custom role extending "worker" via RoleRegistry, verify `hasLifecycleDoneCapability` returns true |
|
|
110
|
+
|
|
111
|
+
#### P0.2: Add macro-agent config loader
|
|
112
|
+
|
|
113
|
+
| | |
|
|
114
|
+
|---|---|
|
|
115
|
+
| **What** | Read `.macro-agent/config.json` for project-level settings (starting with `team` field) |
|
|
116
|
+
| **Where** | New: `src/config/project-config.ts` |
|
|
117
|
+
| **Schema** | `{ team?: string, [key: string]: unknown }` |
|
|
118
|
+
| **Loading** | On CLI start/chat, read config file. CLI flags override. Missing file = empty config |
|
|
119
|
+
| **Success** | `loadProjectConfig(projectPath?)` returns parsed config or defaults |
|
|
120
|
+
| **Test** | Unit test: read valid config, missing file, invalid JSON |
|
|
121
|
+
|
|
122
|
+
### Phase 1: Team Template System
|
|
123
|
+
|
|
124
|
+
#### P1.1: TeamManifest types
|
|
125
|
+
|
|
126
|
+
| | |
|
|
127
|
+
|---|---|
|
|
128
|
+
| **What** | TypeScript types for the full team manifest schema |
|
|
129
|
+
| **Where** | New: `src/teams/types.ts` |
|
|
130
|
+
| **Types** | `TeamManifest`, `TeamTopology`, `TopologyNode`, `TeamCommunication`, `ChannelDefinition`, `ChannelSubscription`, `CommunicationRouting`, `PeerConnection`, `MacroAgentExtensions`, `TeamRoleDefinition`, `ResolvedTeamRole` |
|
|
131
|
+
| **Constraint** | Generic fields (name, roles, topology, communication) separated from `macro_agent` namespace per interoperability design in team-templates.md |
|
|
132
|
+
| **Success** | Types compile, accurately represent team.yaml schema |
|
|
133
|
+
| **Test** | Type-level only (compile check) |
|
|
134
|
+
|
|
135
|
+
#### P1.2: TeamLoader
|
|
136
|
+
|
|
137
|
+
| | |
|
|
138
|
+
|---|---|
|
|
139
|
+
| **What** | Reads `.macro-agent/teams/<name>/` directory, parses and validates team.yaml, resolves role inheritance, loads prompts, loads MCP server configs |
|
|
140
|
+
| **Where** | New: `src/teams/team-loader.ts` |
|
|
141
|
+
| **Interface** | `TeamLoader.load(teamName: string, basePath?: string): Promise<TeamManifest>` |
|
|
142
|
+
| **Dependencies** | `js-yaml` (new), `zod` (existing), `RoleRegistry` (for resolving `extends` chains) |
|
|
143
|
+
| **Steps** | 1. Resolve directory path 2. Parse team.yaml 3. Validate with Zod 4. For each role: load YAML, resolve extends, compute capabilities (add/remove), translate spawn_rules to capabilities (RD3) 5. Load prompt files 6. Load tools/mcp-servers.json 7. Validate communication topology (all refs exist) |
|
|
144
|
+
| **Errors** | Typed `TeamLoadError` with codes: `MANIFEST_NOT_FOUND`, `INVALID_MANIFEST`, `ROLE_NOT_FOUND`, `PROMPT_NOT_FOUND`, `INVALID_COMMUNICATION` |
|
|
145
|
+
| **Success** | Given a valid team directory, returns fully resolved `TeamManifest` with computed capabilities, loaded prompts, and MCP server configs |
|
|
146
|
+
| **Test** | Unit tests with fixture directories: valid team, missing manifest, invalid schema, broken extends chain, missing prompt, invalid communication refs |
|
|
147
|
+
|
|
148
|
+
#### P1.3: TeamRuntime
|
|
149
|
+
|
|
150
|
+
| | |
|
|
151
|
+
|---|---|
|
|
152
|
+
| **What** | Wires a loaded TeamManifest into running services |
|
|
153
|
+
| **Where** | New: `src/teams/team-runtime.ts` |
|
|
154
|
+
| **Interface** | `TeamRuntime` class with `initialize()`, `bootstrap()`, `teardown()`, getters for strategy/taskMode/topics/prompts |
|
|
155
|
+
| **initialize()** | 1. Register team roles into RoleRegistry (highest priority layer) 2. Instantiate IntegrationStrategy from registry 3. Store team_config event in EventStore (RD2) 4. Register spawn interceptor on AgentManager |
|
|
156
|
+
| **bootstrap()** | 1. Spawn root agent per `topology.root` 2. Spawn companions per `topology.companions` (parent: null) 3. Set up peer subscriptions between root and companions 4. Return `{ rootId, companionIds }` |
|
|
157
|
+
| **Spawn interceptor** | Modifies `SpawnAgentOptions` to inject: team topics from communication topology, team MCP servers, team prompt (customPrompt), team env vars, role channel subscription |
|
|
158
|
+
| **Dependencies** | RoleRegistry, AgentManager, MessageRouter, EventStore |
|
|
159
|
+
| **Success** | After `initialize()`: team roles resolvable, strategy available, config in EventStore. After `bootstrap()`: root + companion agents running with correct subscriptions/prompts |
|
|
160
|
+
| **Test** | Unit test with mocked services: verify role registration, strategy selection, event emission, spawn interceptor output. Integration test: full load → initialize → bootstrap cycle |
|
|
161
|
+
|
|
162
|
+
#### P1.4: Spawn interceptor hook on AgentManager
|
|
163
|
+
|
|
164
|
+
| | |
|
|
165
|
+
|---|---|
|
|
166
|
+
| **What** | Add optional `spawnInterceptor` to AgentManager that transforms `SpawnAgentOptions` before spawn proceeds |
|
|
167
|
+
| **Where** | Modified: `src/agent/agent-manager.ts` |
|
|
168
|
+
| **Interface** | `setSpawnInterceptor(fn: SpawnInterceptor)` method. `SpawnInterceptor = (options: SpawnAgentOptions) => SpawnAgentOptions \| Promise<SpawnAgentOptions>` |
|
|
169
|
+
| **Hook point** | After options destructuring, before capability checks. Interceptor can modify topics, config, customPrompt, env vars |
|
|
170
|
+
| **New field** | Add `customPrompt?: string` to `SpawnAgentOptions` |
|
|
171
|
+
| **Prompt assembly** | When `customPrompt` is set, use it instead of `resolvedRole.systemPrompt` (RD4) |
|
|
172
|
+
| **Constraint** | When no interceptor is set, spawn behavior is identical to current (backward compatible) |
|
|
173
|
+
| **Success** | Interceptor can inject topics, MCP servers, prompt, env vars into spawn options |
|
|
174
|
+
| **Test** | Unit test: spawn with interceptor, verify modified options are applied. Spawn without interceptor, verify identical behavior |
|
|
175
|
+
|
|
176
|
+
#### P1.5: System prompt team support
|
|
177
|
+
|
|
178
|
+
| | |
|
|
179
|
+
|---|---|
|
|
180
|
+
| **What** | Support `customPrompt` and interaction pattern injection in system prompt generation |
|
|
181
|
+
| **Where** | Modified: `src/agent/agent-manager.ts` (prompt assembly section), optionally `src/agent/system-prompt.ts` |
|
|
182
|
+
| **Change** | When `customPrompt` is provided in spawn options: append it as `# Role Instructions` section, skip `resolvedRole.systemPrompt`. Append interaction pattern sections after role prompt. |
|
|
183
|
+
| **Interaction patterns** | Auto-generated text sections based on team config: pull mode instructions, trunk integration notes, continuation guidelines. Generated by TeamRuntime, passed via spawn interceptor |
|
|
184
|
+
| **Success** | Agent spawned with team prompt has correct system prompt: base sections + team prompt + interaction patterns + tools + guidelines |
|
|
185
|
+
| **Test** | Unit test: generate prompt with customPrompt set, verify structure. Generate without, verify existing behavior |
|
|
186
|
+
|
|
187
|
+
#### P1.6: CLI and config integration
|
|
188
|
+
|
|
189
|
+
| | |
|
|
190
|
+
|---|---|
|
|
191
|
+
| **What** | Add `--team <name>` CLI flag, read `.macro-agent/config.json`, initialize TeamRuntime in start/chat flows |
|
|
192
|
+
| **Where** | Modified: `src/cli/index.ts` |
|
|
193
|
+
| **Flow** | 1. Read project config (P0.2) 2. Determine team name (CLI flag > config > none) 3. If team: load via TeamLoader, create TeamRuntime, initialize, then bootstrap after server starts |
|
|
194
|
+
| **Constraint** | Chat command also supports team loading (interactive mode with team agents) |
|
|
195
|
+
| **Success** | `multiagent-cli start --team self-driving` loads team, bootstraps agents. `multiagent-cli start` with `.macro-agent/config.json` containing `"team": "self-driving"` does the same |
|
|
196
|
+
| **Test** | Integration test: CLI start with team flag, verify agents spawned with correct roles |
|
|
197
|
+
|
|
198
|
+
#### P1.7: MCP subprocess team context
|
|
199
|
+
|
|
200
|
+
| | |
|
|
201
|
+
|---|---|
|
|
202
|
+
| **What** | MCP subprocess reads team config from EventStore and reconstructs team context |
|
|
203
|
+
| **Where** | Modified: `src/cli/mcp.ts`, `src/mcp/mcp-server.ts` |
|
|
204
|
+
| **Flow** | 1. After EventStore connection (mcp.ts:61), query for `team_config` event 2. If found: instantiate strategy from `IntegrationStrategyRegistry`, set taskMode 3. Pass strategy and taskMode through `MCPServices` → `DoneToolDeps` |
|
|
205
|
+
| **New MCPServices fields** | `integrationStrategy?: IntegrationStrategy`, `taskMode?: 'push' \| 'pull'` |
|
|
206
|
+
| **Constraint** | When no team_config event exists, all new fields are undefined (backward compatible) |
|
|
207
|
+
| **Success** | Worker agent in a team calls `done()` → handler dispatches to correct integration strategy |
|
|
208
|
+
| **Test** | Integration test: emit team_config event, start MCP subprocess, verify strategy is available in done handler |
|
|
209
|
+
|
|
210
|
+
#### P1.8: API endpoint
|
|
211
|
+
|
|
212
|
+
| | |
|
|
213
|
+
|---|---|
|
|
214
|
+
| **What** | `GET /api/team` returns active team info |
|
|
215
|
+
| **Where** | Modified: `src/api/server.ts` |
|
|
216
|
+
| **Response** | `{ active: true, name, roles, topology, strategy, taskMode }` or `{ active: false }` |
|
|
217
|
+
| **Success** | Endpoint returns team config when team is loaded, returns inactive otherwise |
|
|
218
|
+
| **Test** | Unit test with mocked APIServices |
|
|
219
|
+
|
|
220
|
+
#### P1.9: Reference self-driving template
|
|
221
|
+
|
|
222
|
+
| | |
|
|
223
|
+
|---|---|
|
|
224
|
+
| **What** | Complete team template for the self-driving pattern |
|
|
225
|
+
| **Where** | New: `.macro-agent/teams/self-driving/` with team.yaml, roles/*.yaml, prompts/*.md |
|
|
226
|
+
| **Roles** | planner (extends coordinator), grinder (extends worker), judge (extends monitor) |
|
|
227
|
+
| **Topology** | Root: planner. Companions: judge. spawn_rules: planner→[grinder,planner], others→[] |
|
|
228
|
+
| **Communication** | Channels: task_updates, work_coordination, health. Peer routes: judge↔planner |
|
|
229
|
+
| **Integration** | trunk strategy |
|
|
230
|
+
| **Task mode** | pull |
|
|
231
|
+
| **Success** | `TeamLoader.load('self-driving')` succeeds and returns a valid manifest |
|
|
232
|
+
| **Test** | Validated by TeamLoader unit tests |
|
|
233
|
+
|
|
234
|
+
### Phase 2: Pluggable Integration Strategies
|
|
235
|
+
|
|
236
|
+
#### P2.1: IntegrationStrategy interface and registry
|
|
237
|
+
|
|
238
|
+
| | |
|
|
239
|
+
|---|---|
|
|
240
|
+
| **What** | Strategy interface, LandRequest/LandResult types, and a registry with factory pattern |
|
|
241
|
+
| **Where** | New: `src/workspace/strategies/types.ts`, `src/workspace/strategies/registry.ts` |
|
|
242
|
+
| **Interface** | `IntegrationStrategy { name, land(request), initialize?(), close?() }` |
|
|
243
|
+
| **Registry** | `IntegrationStrategyRegistry { register(name, factory), get(name, config), has(name), list() }` |
|
|
244
|
+
| **Default instance** | `defaultStrategyRegistry` with queue, trunk, optimistic registered |
|
|
245
|
+
| **Success** | `registry.get('trunk', { maxRetries: 3 })` returns a TrunkIntegrationStrategy instance |
|
|
246
|
+
| **Test** | Unit test: register, get, factory invocation, unknown name throws |
|
|
247
|
+
|
|
248
|
+
#### P2.2: QueueIntegrationStrategy
|
|
249
|
+
|
|
250
|
+
| | |
|
|
251
|
+
|---|---|
|
|
252
|
+
| **What** | Wraps existing MergeQueueInterface — same behavior as current worker done() handler |
|
|
253
|
+
| **Where** | New: `src/workspace/strategies/queue.ts` |
|
|
254
|
+
| **Behavior** | Receives MergeQueueInterface at construction. `land()` submits merge request to queue |
|
|
255
|
+
| **Constraint** | Must produce identical behavior to current worker.ts Step 4 merge queue path |
|
|
256
|
+
| **Success** | Existing merge queue tests pass when routed through QueueIntegrationStrategy |
|
|
257
|
+
| **Test** | Unit test with mocked MergeQueueInterface |
|
|
258
|
+
|
|
259
|
+
#### P2.3: TrunkIntegrationStrategy
|
|
260
|
+
|
|
261
|
+
| | |
|
|
262
|
+
|---|---|
|
|
263
|
+
| **What** | Direct push to integration branch with rebase-and-retry on conflict |
|
|
264
|
+
| **Where** | New: `src/workspace/strategies/trunk.ts` |
|
|
265
|
+
| **Config** | `maxRetries` (default: 3), `conflictAction` ('abandon' \| 'queued_for_resolution') |
|
|
266
|
+
| **Behavior** | fetch → rebase → push. On conflict: abort rebase, retry. On exhaustion: return conflict result |
|
|
267
|
+
| **Git operations** | Thin wrapper around child_process git commands (or reuse workspace git helpers if they exist) |
|
|
268
|
+
| **Success** | Pushes cleanly when no conflict. Retries on conflict. Returns appropriate LandResult |
|
|
269
|
+
| **Test** | Unit test with git repo fixture: clean push, conflict + retry, exhaustion |
|
|
270
|
+
|
|
271
|
+
#### P2.4: OptimisticIntegrationStrategy
|
|
272
|
+
|
|
273
|
+
| | |
|
|
274
|
+
|---|---|
|
|
275
|
+
| **What** | Push immediately, emit validation event. No blocking validation (RD5) |
|
|
276
|
+
| **Where** | New: `src/workspace/strategies/optimistic.ts` |
|
|
277
|
+
| **Behavior** | Push to integration branch. Emit `validation:requested` event via EventStore. Return landed |
|
|
278
|
+
| **Constraint** | Does not run build/test. Validation is the judge's responsibility |
|
|
279
|
+
| **Success** | Push succeeds, event emitted. On push conflict: rebase + retry (same as trunk) |
|
|
280
|
+
| **Test** | Unit test: verify push and event emission |
|
|
281
|
+
|
|
282
|
+
#### P2.5: Worker handler refactor
|
|
283
|
+
|
|
284
|
+
| | |
|
|
285
|
+
|---|---|
|
|
286
|
+
| **What** | Add strategy dispatch to worker done() handler |
|
|
287
|
+
| **Where** | Modified: `src/lifecycle/handlers/worker.ts`, `src/lifecycle/handlers/index.ts` |
|
|
288
|
+
| **New deps** | `integrationStrategy?: IntegrationStrategy`, `taskMode?: 'push' \| 'pull'` on `AllHandlerDeps` and `WorkerHandlerDeps` |
|
|
289
|
+
| **Logic** | If `integrationStrategy`: call `strategy.land()`, handle result. Else if `mergeQueue`: existing path. Pull mode: return `shouldTerminate: false` on completed status |
|
|
290
|
+
| **Constraint** | When neither strategy nor mergeQueue is set, skip integration (log warning). Existing tests pass unchanged |
|
|
291
|
+
| **Success** | Workers with trunk strategy push directly. Workers with queue strategy use merge queue. Pull-mode workers stay alive after completion |
|
|
292
|
+
| **Test** | Unit test: strategy dispatch, pull mode shouldTerminate, fallback to mergeQueue |
|
|
293
|
+
|
|
294
|
+
#### P2.6: Done tool dependency wiring
|
|
295
|
+
|
|
296
|
+
| | |
|
|
297
|
+
|---|---|
|
|
298
|
+
| **What** | Pass integration strategy and task mode through DoneToolDeps → AllHandlerDeps |
|
|
299
|
+
| **Where** | Modified: `src/mcp/tools/done.ts`, `src/mcp/mcp-server.ts` |
|
|
300
|
+
| **New fields** | `integrationStrategy?` and `taskMode?` on `DoneToolDeps` and `MCPServices` |
|
|
301
|
+
| **Success** | Strategy flows from MCPServices → DoneToolDeps → AllHandlerDeps → worker handler |
|
|
302
|
+
| **Test** | Integration test: full done() call with strategy set, verify land() called |
|
|
303
|
+
|
|
304
|
+
### Phase 3: Task Pull Model
|
|
305
|
+
|
|
306
|
+
#### P3.1: Task tags
|
|
307
|
+
|
|
308
|
+
| | |
|
|
309
|
+
|---|---|
|
|
310
|
+
| **What** | Add `tags?: string[]` to task types |
|
|
311
|
+
| **Where** | Modified: `src/store/types/tasks.ts`, `src/task/backend/types.ts` |
|
|
312
|
+
| **Constraint** | Tags set at creation time via `CreateTaskOptions`. Queryable via filters |
|
|
313
|
+
| **Success** | Tasks can be created with tags, filtered by tags in list operations |
|
|
314
|
+
| **Test** | Unit test: create task with tags, filter by tags |
|
|
315
|
+
|
|
316
|
+
#### P3.2: TaskBackend claim/unclaim
|
|
317
|
+
|
|
318
|
+
| | |
|
|
319
|
+
|---|---|
|
|
320
|
+
| **What** | Add `claim()`, `unclaim()`, `listClaimable()` to TaskBackend interface and InMemoryTaskBackend |
|
|
321
|
+
| **Where** | Modified: `src/task/backend/types.ts`, `src/task/backend/memory.ts` |
|
|
322
|
+
| **claim()** | Find first matching pending task, atomically assign to agent. Return null if none available or contention |
|
|
323
|
+
| **unclaim()** | Return claimed task to pending status |
|
|
324
|
+
| **listClaimable()** | Return pending tasks matching optional filters (tags, status) |
|
|
325
|
+
| **Atomicity** | SQLite write serialization ensures no double-claims (see implementation-details.md A6) |
|
|
326
|
+
| **Success** | Agent claims task, task transitions to assigned. Two agents claiming same task: one succeeds, one gets null |
|
|
327
|
+
| **Test** | Unit test: claim, unclaim, contention (two claims on same task), filtered claims |
|
|
328
|
+
|
|
329
|
+
#### P3.3: MCP tools (claim_task, unclaim_task, list_claimable_tasks)
|
|
330
|
+
|
|
331
|
+
| | |
|
|
332
|
+
|---|---|
|
|
333
|
+
| **What** | Three new MCP tools for the pull model |
|
|
334
|
+
| **Where** | New: `src/mcp/tools/claim_task.ts`, `unclaim_task.ts`, `list_claimable_tasks.ts` |
|
|
335
|
+
| **Capability** | Gated by `task.claim` capability |
|
|
336
|
+
| **Registration** | Added to `src/mcp/mcp-server.ts` tool registration, with `task.claim` in capability map (`src/roles/capabilities.ts`) |
|
|
337
|
+
| **Success** | Agent with `task.claim` capability can call `claim_task()` → gets a task → works → `done()` → `claim_task()` again |
|
|
338
|
+
| **Test** | Unit test per tool. Integration test: claim loop cycle |
|
|
339
|
+
|
|
340
|
+
### Phase 4: Session Continuations
|
|
341
|
+
|
|
342
|
+
#### P4.1: Resume mechanism
|
|
343
|
+
|
|
344
|
+
| | |
|
|
345
|
+
|---|---|
|
|
346
|
+
| **What** | `AgentManager.resume(agentId, options?)` loads conversation history and spawns continuation agent |
|
|
347
|
+
| **Where** | Modified: `src/agent/agent-manager.ts` |
|
|
348
|
+
| **Flow** | 1. Load agent record from EventStore 2. Load conversation turns (existing turn infrastructure) 3. Format as resume context (summarized transcript) 4. Spawn new agent with same role/task + resume context as customPrompt prefix |
|
|
349
|
+
| **Config** | `maxMessages` controls how many turns to include (default: 50) |
|
|
350
|
+
| **Success** | Resumed agent has access to prior conversation context |
|
|
351
|
+
| **Test** | Integration test: spawn agent, record turns, terminate, resume, verify context |
|
|
352
|
+
|
|
353
|
+
#### P4.2: Continuation lifecycle config
|
|
354
|
+
|
|
355
|
+
| | |
|
|
356
|
+
|---|---|
|
|
357
|
+
| **What** | Wire `macro_agent.lifecycle.continuations` from team manifest into agent lifecycle |
|
|
358
|
+
| **Where** | Modified: `src/teams/team-runtime.ts` (config propagation) |
|
|
359
|
+
| **Behavior** | When continuations enabled and agent terminates: eligible for resume. TeamRuntime can auto-resume daemon agents that exit unexpectedly |
|
|
360
|
+
| **Success** | Planner agent in self-driving team auto-resumes after unexpected termination |
|
|
361
|
+
| **Test** | Integration test: daemon agent terminates, TeamRuntime detects and resumes |
|
|
362
|
+
|
|
363
|
+
### Phase 5: Autonomous Observability
|
|
364
|
+
|
|
365
|
+
#### P5.1: Metric events and views
|
|
366
|
+
|
|
367
|
+
| | |
|
|
368
|
+
|---|---|
|
|
369
|
+
| **What** | Emit metric events from done handlers and strategies. Materialized views for throughput, utilization, errors |
|
|
370
|
+
| **Where** | Modified: `src/store/event-store.ts` (new views), `src/lifecycle/handlers/` (emit events), `src/workspace/strategies/` (emit events) |
|
|
371
|
+
| **API** | `GET /api/metrics/throughput`, `/utilization`, `/errors` |
|
|
372
|
+
| **Success** | After a multi-agent run, API returns meaningful throughput and error metrics |
|
|
373
|
+
| **Test** | Unit test: view computation. Integration test: run agents, query metrics |
|
|
374
|
+
|
|
375
|
+
### Phase 6: Reference Templates and Documentation
|
|
376
|
+
|
|
377
|
+
#### P6.1: Finalized templates and E2E test
|
|
378
|
+
|
|
379
|
+
| | |
|
|
380
|
+
|---|---|
|
|
381
|
+
| **What** | Finalize self-driving and structured reference templates. Add docs. Run E2E test |
|
|
382
|
+
| **Where** | `.macro-agent/teams/self-driving/`, `.macro-agent/teams/structured/`, `docs/teams.md` |
|
|
383
|
+
| **E2E test** | Full cycle: load self-driving team → planner creates tasks → grinders claim and complete → judge monitors → trunk integration |
|
|
384
|
+
| **Success** | E2E test passes. Documentation covers schema reference, custom strategy guide, examples |
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
## Success Criteria
|
|
389
|
+
|
|
390
|
+
### Phase-level criteria
|
|
391
|
+
|
|
392
|
+
| Phase | Criterion |
|
|
393
|
+
|-------|-----------|
|
|
394
|
+
| **P0** | `done()` works with any role that has `lifecycle.done` capability. `.macro-agent/config.json` is read on startup |
|
|
395
|
+
| **P1** | `multiagent-cli start --team self-driving` loads a team, registers roles, spawns root + companions, agents have correct prompts and topics. MCP subprocess picks up team config from EventStore. Existing behavior without `--team` is unchanged |
|
|
396
|
+
| **P2** | Worker `done()` dispatches to configured integration strategy. `queue` strategy produces identical behavior to current merge queue. `trunk` strategy pushes directly. Existing merge queue tests pass |
|
|
397
|
+
| **P3** | Agents with `task.claim` capability can `claim_task()` → `done()` → `claim_task()` in a loop. Idle timeout triggers graceful exit |
|
|
398
|
+
| **P4** | `AgentManager.resume()` loads conversation history and spawns continuation. Daemon agents auto-resume on unexpected exit |
|
|
399
|
+
| **P5** | Metrics API returns throughput/utilization/error data after multi-agent run |
|
|
400
|
+
| **P6** | E2E test passes. Docs complete |
|
|
401
|
+
|
|
402
|
+
### Cross-cutting criteria
|
|
403
|
+
|
|
404
|
+
| Criterion | Description |
|
|
405
|
+
|-----------|-------------|
|
|
406
|
+
| **Backward compatibility** | All existing tests pass without modification. No team loaded = identical behavior to current codebase |
|
|
407
|
+
| **No core rewrites** | Team system composes on top of existing primitives (RoleRegistry, MessageRouter, EventStore, AgentManager). Core modules receive surgical additions (interceptor hook, new deps fields), not rewrites |
|
|
408
|
+
| **Type safety** | All new types have Zod validation schemas. Team manifest validated at load time. Invalid config fails fast with clear error messages |
|
|
409
|
+
| **Test coverage** | Each phase has unit tests for new modules and integration tests for the wiring. Phase 6 has an E2E test for the full self-driving flow |
|
|
410
|
+
|
|
411
|
+
---
|
|
412
|
+
|
|
413
|
+
## Implementation Order
|
|
414
|
+
|
|
415
|
+
```
|
|
416
|
+
P0 (Prerequisites) ────────────────────────────────────►
|
|
417
|
+
P0.1: Fix done() capability ~1 file, small
|
|
418
|
+
P0.2: Project config loader ~1 new file, small
|
|
419
|
+
|
|
420
|
+
P1 (Team Template System) ─────────────────────────────►
|
|
421
|
+
P1.1: Types ~1 new file
|
|
422
|
+
P1.2: TeamLoader ~1 new file + js-yaml dep
|
|
423
|
+
P1.3: TeamRuntime ~1 new file
|
|
424
|
+
P1.4: Spawn interceptor ~1 modified file
|
|
425
|
+
P1.5: System prompt support ~1 modified file
|
|
426
|
+
P1.6: CLI + config ~1 modified file
|
|
427
|
+
P1.7: MCP subprocess context ~2 modified files
|
|
428
|
+
P1.8: API endpoint ~1 modified file
|
|
429
|
+
P1.9: Reference template ~7 new files (yaml/md)
|
|
430
|
+
|
|
431
|
+
┌──── P2 (Integration) ────────────────────►
|
|
432
|
+
│ P2.1-P2.6 (parallel with P3/P4)
|
|
433
|
+
│
|
|
434
|
+
P1.3 ────┼──── P3 (Task Pull) ──────────────────────►
|
|
435
|
+
done │ P3.1-P3.3 (parallel with P2/P4)
|
|
436
|
+
│
|
|
437
|
+
└──── P4 (Session Continuations) ──────────►
|
|
438
|
+
P4.1-P4.2 (parallel with P2/P3)
|
|
439
|
+
|
|
440
|
+
P2+P3 ──────── P5 (Observability) ──────────────────►
|
|
441
|
+
done P5.1
|
|
442
|
+
|
|
443
|
+
All ────────── P6 (Templates + Docs + E2E) ─────────►
|
|
444
|
+
done P6.1
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
**Total new files**: ~18
|
|
448
|
+
**Total modified files**: ~12
|
|
449
|
+
**New dependency**: `js-yaml`
|
|
450
|
+
|
|
451
|
+
---
|
|
452
|
+
|
|
453
|
+
## Risks and Mitigations
|
|
454
|
+
|
|
455
|
+
| Risk | Impact | Mitigation |
|
|
456
|
+
|------|--------|------------|
|
|
457
|
+
| Spawn interceptor introduces subtle bugs in existing spawns | Agents fail to start or have wrong config | Interceptor is no-op when not set. Guarded by `if (spawnInterceptor)` check. Comprehensive test for both paths |
|
|
458
|
+
| Team config event in EventStore is stale after hot-reload | MCP subprocess uses old config | For Phase 1, no hot-reload. Config is set once at initialize(). Future: re-emit event on config change |
|
|
459
|
+
| SQLite contention on claim() under high worker count | Workers waste cycles retrying claims | Randomize candidate selection. Short retry delay with jitter. Metrics track contention rate for observability |
|
|
460
|
+
| trunk strategy corrupts integration branch on crash mid-push | Integration branch in inconsistent state | All git operations are atomic (push either succeeds or fails cleanly). Rebase is aborted on error before retry |
|
|
461
|
+
| YAML parsing adds a new dependency | Supply chain risk, bundle size | `js-yaml` is MIT, 1.4M weekly downloads, well-audited. Pin version. No native bindings |
|
|
462
|
+
| Companion agents (parent: null) confuse hierarchy queries | `getHierarchy()` shows disconnected nodes | Accept this: companions are intentionally outside the spawn tree. API/CLI can group them under "team companions" label |
|