macro-agent 0.1.0 → 0.1.2
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/.claude/settings.local.json +3 -1
- package/.sudocode/issues.jsonl +28 -0
- package/.sudocode/specs.jsonl +8 -0
- package/CLAUDE.md +25 -17
- package/README.md +11 -29
- package/dist/acp/macro-agent.d.ts +15 -0
- package/dist/acp/macro-agent.d.ts.map +1 -1
- package/dist/acp/macro-agent.js +131 -35
- package/dist/acp/macro-agent.js.map +1 -1
- package/dist/acp/types.d.ts +32 -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 +65 -1
- package/dist/agent/agent-manager.d.ts.map +1 -1
- package/dist/agent/agent-manager.js +544 -200
- package/dist/agent/agent-manager.js.map +1 -1
- package/dist/agent/types.d.ts +8 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/api/server.d.ts +8 -1
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +136 -8
- package/dist/api/server.js.map +1 -1
- package/dist/api/types.d.ts +1 -1
- package/dist/api/types.d.ts.map +1 -1
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/token.d.ts +41 -0
- package/dist/auth/token.d.ts.map +1 -0
- package/dist/auth/token.js +73 -0
- package/dist/auth/token.js.map +1 -0
- package/dist/cli/acp.d.ts +2 -23
- package/dist/cli/acp.d.ts.map +1 -1
- package/dist/cli/acp.js +197 -61
- package/dist/cli/acp.js.map +1 -1
- package/dist/cli/index.js +152 -16
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp.d.ts +6 -0
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +279 -173
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/parse-args.d.ts +20 -0
- package/dist/cli/parse-args.d.ts.map +1 -0
- package/dist/cli/parse-args.js +43 -0
- package/dist/cli/parse-args.js.map +1 -0
- package/dist/cli/stable-instance-id.d.ts +8 -0
- package/dist/cli/stable-instance-id.d.ts.map +1 -0
- package/dist/cli/stable-instance-id.js +14 -0
- package/dist/cli/stable-instance-id.js.map +1 -0
- package/dist/config/project-config.d.ts +85 -7
- package/dist/config/project-config.d.ts.map +1 -1
- package/dist/config/project-config.js +133 -20
- package/dist/config/project-config.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lifecycle/handlers/index.d.ts +7 -3
- package/dist/lifecycle/handlers/index.d.ts.map +1 -1
- package/dist/lifecycle/handlers/index.js +25 -8
- package/dist/lifecycle/handlers/index.js.map +1 -1
- package/dist/lifecycle/types.d.ts +2 -0
- package/dist/lifecycle/types.d.ts.map +1 -1
- package/dist/lifecycle/types.js.map +1 -1
- package/dist/map/adapter/acp-over-map.d.ts +17 -0
- package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
- package/dist/map/adapter/acp-over-map.js +384 -23
- package/dist/map/adapter/acp-over-map.js.map +1 -1
- package/dist/map/adapter/connection-manager.d.ts.map +1 -1
- package/dist/map/adapter/connection-manager.js +3 -0
- package/dist/map/adapter/connection-manager.js.map +1 -1
- package/dist/map/adapter/event-log.d.ts +87 -0
- package/dist/map/adapter/event-log.d.ts.map +1 -0
- package/dist/map/adapter/event-log.js +122 -0
- package/dist/map/adapter/event-log.js.map +1 -0
- package/dist/map/adapter/event-translator.js +6 -6
- package/dist/map/adapter/event-translator.js.map +1 -1
- package/dist/map/adapter/extensions/agent-lifecycle.d.ts +82 -0
- package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +1 -0
- package/dist/map/adapter/extensions/agent-lifecycle.js +164 -0
- package/dist/map/adapter/extensions/agent-lifecycle.js.map +1 -0
- package/dist/map/adapter/extensions/index.d.ts +13 -1
- package/dist/map/adapter/extensions/index.d.ts.map +1 -1
- package/dist/map/adapter/extensions/index.js +61 -0
- package/dist/map/adapter/extensions/index.js.map +1 -1
- package/dist/map/adapter/extensions/mcp-bridge.d.ts +57 -0
- package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +1 -0
- package/dist/map/adapter/extensions/mcp-bridge.js +745 -0
- package/dist/map/adapter/extensions/mcp-bridge.js.map +1 -0
- package/dist/map/adapter/extensions/rename.d.ts +29 -0
- package/dist/map/adapter/extensions/rename.d.ts.map +1 -0
- package/dist/map/adapter/extensions/rename.js +49 -0
- package/dist/map/adapter/extensions/rename.js.map +1 -0
- package/dist/map/adapter/extensions/streams.d.ts +95 -0
- package/dist/map/adapter/extensions/streams.d.ts.map +1 -0
- package/dist/map/adapter/extensions/streams.js +515 -0
- package/dist/map/adapter/extensions/streams.js.map +1 -0
- package/dist/map/adapter/extensions/task.d.ts.map +1 -1
- package/dist/map/adapter/extensions/task.js +10 -0
- package/dist/map/adapter/extensions/task.js.map +1 -1
- package/dist/map/adapter/extensions/update-metadata.d.ts +29 -0
- package/dist/map/adapter/extensions/update-metadata.d.ts.map +1 -0
- package/dist/map/adapter/extensions/update-metadata.js +67 -0
- package/dist/map/adapter/extensions/update-metadata.js.map +1 -0
- package/dist/map/adapter/index.d.ts +2 -1
- package/dist/map/adapter/index.d.ts.map +1 -1
- package/dist/map/adapter/index.js +10 -2
- package/dist/map/adapter/index.js.map +1 -1
- package/dist/map/adapter/interface.d.ts +2 -0
- package/dist/map/adapter/interface.d.ts.map +1 -1
- package/dist/map/adapter/map-adapter.d.ts +3 -0
- package/dist/map/adapter/map-adapter.d.ts.map +1 -1
- package/dist/map/adapter/map-adapter.js +258 -35
- package/dist/map/adapter/map-adapter.js.map +1 -1
- package/dist/map/adapter/subscription-manager.d.ts.map +1 -1
- package/dist/map/adapter/subscription-manager.js +5 -1
- package/dist/map/adapter/subscription-manager.js.map +1 -1
- package/dist/map/adapter/types.d.ts +3 -1
- package/dist/map/adapter/types.d.ts.map +1 -1
- package/dist/mcp/map-client.d.ts +39 -0
- package/dist/mcp/map-client.d.ts.map +1 -0
- package/dist/mcp/map-client.js +129 -0
- package/dist/mcp/map-client.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +16 -0
- package/dist/mcp/mcp-server.d.ts.map +1 -1
- package/dist/mcp/mcp-server.js +125 -88
- package/dist/mcp/mcp-server.js.map +1 -1
- package/dist/mcp/tools/done.d.ts.map +1 -1
- package/dist/mcp/tools/done.js +18 -0
- package/dist/mcp/tools/done.js.map +1 -1
- package/dist/mcp/types.d.ts +9 -1
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/metrics/metrics.js +1 -1
- package/dist/metrics/metrics.js.map +1 -1
- package/dist/roles/builtin/coordinator.d.ts.map +1 -1
- package/dist/roles/builtin/coordinator.js +2 -1
- package/dist/roles/builtin/coordinator.js.map +1 -1
- package/dist/roles/builtin/integrator.d.ts.map +1 -1
- package/dist/roles/builtin/integrator.js +2 -1
- package/dist/roles/builtin/integrator.js.map +1 -1
- package/dist/roles/builtin/worker.d.ts.map +1 -1
- package/dist/roles/builtin/worker.js +3 -1
- package/dist/roles/builtin/worker.js.map +1 -1
- package/dist/roles/capabilities.d.ts +9 -1
- package/dist/roles/capabilities.d.ts.map +1 -1
- package/dist/roles/capabilities.js +27 -7
- package/dist/roles/capabilities.js.map +1 -1
- package/dist/roles/config-loader.d.ts +6 -6
- package/dist/roles/config-loader.d.ts.map +1 -1
- package/dist/roles/config-loader.js +8 -7
- package/dist/roles/config-loader.js.map +1 -1
- package/dist/roles/registry.d.ts +2 -2
- package/dist/roles/registry.js +2 -2
- package/dist/roles/types.d.ts +3 -1
- package/dist/roles/types.d.ts.map +1 -1
- package/dist/server/combined-server.d.ts +28 -1
- package/dist/server/combined-server.d.ts.map +1 -1
- package/dist/server/combined-server.js +111 -8
- package/dist/server/combined-server.js.map +1 -1
- package/dist/store/event-store.d.ts +2 -1
- package/dist/store/event-store.d.ts.map +1 -1
- package/dist/store/event-store.js +80 -24
- package/dist/store/event-store.js.map +1 -1
- package/dist/store/instance.d.ts +1 -1
- package/dist/store/instance.d.ts.map +1 -1
- package/dist/store/instance.js +2 -2
- package/dist/store/instance.js.map +1 -1
- package/dist/store/types/agents.d.ts +23 -0
- 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/task/backend/index.d.ts +47 -29
- package/dist/task/backend/index.d.ts.map +1 -1
- package/dist/task/backend/index.js +109 -71
- package/dist/task/backend/index.js.map +1 -1
- package/dist/task/backend/memory.d.ts +1 -0
- package/dist/task/backend/memory.d.ts.map +1 -1
- package/dist/task/backend/memory.js +3 -0
- package/dist/task/backend/memory.js.map +1 -1
- package/dist/task/backend/opentasks/backend.d.ts +140 -0
- package/dist/task/backend/opentasks/backend.d.ts.map +1 -0
- package/dist/task/backend/opentasks/backend.js +1023 -0
- package/dist/task/backend/opentasks/backend.js.map +1 -0
- package/dist/task/backend/opentasks/client.d.ts +337 -0
- package/dist/task/backend/opentasks/client.d.ts.map +1 -0
- package/dist/task/backend/opentasks/client.js +225 -0
- package/dist/task/backend/opentasks/client.js.map +1 -0
- package/dist/task/backend/opentasks/daemon-manager.d.ts +89 -0
- package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -0
- package/dist/task/backend/opentasks/daemon-manager.js +195 -0
- package/dist/task/backend/opentasks/daemon-manager.js.map +1 -0
- package/dist/task/backend/opentasks/index.d.ts +21 -0
- package/dist/task/backend/opentasks/index.d.ts.map +1 -0
- package/dist/task/backend/opentasks/index.js +21 -0
- package/dist/task/backend/opentasks/index.js.map +1 -0
- package/dist/task/backend/opentasks/mapping.d.ts +48 -0
- package/dist/task/backend/opentasks/mapping.d.ts.map +1 -0
- package/dist/task/backend/opentasks/mapping.js +77 -0
- package/dist/task/backend/opentasks/mapping.js.map +1 -0
- package/dist/task/backend/types.d.ts +33 -53
- package/dist/task/backend/types.d.ts.map +1 -1
- package/dist/task/backend/types.js +7 -11
- package/dist/task/backend/types.js.map +1 -1
- package/dist/task/backend/unified-tool-provider.d.ts +57 -0
- package/dist/task/backend/unified-tool-provider.d.ts.map +1 -0
- package/dist/task/backend/unified-tool-provider.js +623 -0
- package/dist/task/backend/unified-tool-provider.js.map +1 -0
- package/dist/teams/index.d.ts +3 -1
- package/dist/teams/index.d.ts.map +1 -1
- package/dist/teams/index.js +2 -0
- package/dist/teams/index.js.map +1 -1
- package/dist/teams/seed-defaults.d.ts +20 -0
- package/dist/teams/seed-defaults.d.ts.map +1 -0
- package/dist/teams/seed-defaults.js +71 -0
- package/dist/teams/seed-defaults.js.map +1 -0
- package/dist/teams/team-loader.d.ts +7 -3
- package/dist/teams/team-loader.d.ts.map +1 -1
- package/dist/teams/team-loader.js +156 -164
- package/dist/teams/team-loader.js.map +1 -1
- package/dist/teams/team-manager.d.ts +112 -0
- package/dist/teams/team-manager.d.ts.map +1 -0
- package/dist/teams/team-manager.js +305 -0
- package/dist/teams/team-manager.js.map +1 -0
- package/dist/teams/team-runtime.d.ts +125 -19
- package/dist/teams/team-runtime.d.ts.map +1 -1
- package/dist/teams/team-runtime.js +529 -119
- package/dist/teams/team-runtime.js.map +1 -1
- package/dist/teams/types.d.ts +41 -151
- package/dist/teams/types.d.ts.map +1 -1
- package/dist/teams/types.js +2 -3
- package/dist/teams/types.js.map +1 -1
- package/docs/architecture.md +7 -6
- package/docs/configuration.md +26 -62
- package/docs/implementation-details.md +5 -5
- package/docs/implementation-summary.md +17 -17
- package/docs/plan-self-driving-support.md +4 -4
- package/docs/spec-self-driving-support.md +10 -10
- package/docs/team-templates.md +2 -2
- package/docs/teams.md +76 -3
- package/docs/troubleshooting.md +10 -11
- package/package.json +7 -4
- package/references/minimem/.claude/settings.json +7 -0
- package/references/minimem/.sudocode/issues.jsonl +18 -0
- package/references/minimem/.sudocode/specs.jsonl +1 -0
- package/references/minimem/CLAUDE.md +310 -0
- package/references/minimem/README.md +562 -0
- package/references/minimem/claude-plugin/.claude-plugin/plugin.json +10 -0
- package/references/minimem/claude-plugin/.mcp.json +7 -0
- package/references/minimem/claude-plugin/README.md +158 -0
- package/references/minimem/claude-plugin/commands/recall.md +47 -0
- package/references/minimem/claude-plugin/commands/remember.md +41 -0
- package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +272 -0
- package/references/minimem/claude-plugin/hooks/hooks.json +27 -0
- package/references/minimem/claude-plugin/hooks/session-end.sh +86 -0
- package/references/minimem/claude-plugin/hooks/session-start.sh +85 -0
- package/references/minimem/claude-plugin/skills/memory/SKILL.md +108 -0
- package/references/minimem/media/banner.png +0 -0
- package/references/minimem/package-lock.json +5373 -0
- package/references/minimem/package.json +72 -0
- package/references/minimem/scripts/postbuild.js +35 -0
- package/references/minimem/src/__tests__/edge-cases.test.ts +371 -0
- package/references/minimem/src/__tests__/errors.test.ts +265 -0
- package/references/minimem/src/__tests__/helpers.ts +199 -0
- package/references/minimem/src/__tests__/internal.test.ts +407 -0
- package/references/minimem/src/__tests__/knowledge.test.ts +287 -0
- package/references/minimem/src/__tests__/minimem.integration.test.ts +1127 -0
- package/references/minimem/src/__tests__/session.test.ts +190 -0
- package/references/minimem/src/cli/__tests__/commands.test.ts +759 -0
- package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +141 -0
- package/references/minimem/src/cli/commands/append.ts +76 -0
- package/references/minimem/src/cli/commands/config.ts +262 -0
- package/references/minimem/src/cli/commands/conflicts.ts +413 -0
- package/references/minimem/src/cli/commands/daemon.ts +169 -0
- package/references/minimem/src/cli/commands/index.ts +12 -0
- package/references/minimem/src/cli/commands/init.ts +88 -0
- package/references/minimem/src/cli/commands/mcp.ts +177 -0
- package/references/minimem/src/cli/commands/push-pull.ts +213 -0
- package/references/minimem/src/cli/commands/search.ts +158 -0
- package/references/minimem/src/cli/commands/status.ts +84 -0
- package/references/minimem/src/cli/commands/sync-init.ts +290 -0
- package/references/minimem/src/cli/commands/sync.ts +70 -0
- package/references/minimem/src/cli/commands/upsert.ts +197 -0
- package/references/minimem/src/cli/config.ts +584 -0
- package/references/minimem/src/cli/index.ts +264 -0
- package/references/minimem/src/cli/shared.ts +161 -0
- package/references/minimem/src/cli/sync/__tests__/central.test.ts +152 -0
- package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +209 -0
- package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +118 -0
- package/references/minimem/src/cli/sync/__tests__/detection.test.ts +207 -0
- package/references/minimem/src/cli/sync/__tests__/integration.test.ts +476 -0
- package/references/minimem/src/cli/sync/__tests__/registry.test.ts +363 -0
- package/references/minimem/src/cli/sync/__tests__/state.test.ts +255 -0
- package/references/minimem/src/cli/sync/__tests__/validation.test.ts +193 -0
- package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +178 -0
- package/references/minimem/src/cli/sync/central.ts +292 -0
- package/references/minimem/src/cli/sync/conflicts.ts +204 -0
- package/references/minimem/src/cli/sync/daemon.ts +407 -0
- package/references/minimem/src/cli/sync/detection.ts +138 -0
- package/references/minimem/src/cli/sync/index.ts +107 -0
- package/references/minimem/src/cli/sync/operations.ts +373 -0
- package/references/minimem/src/cli/sync/registry.ts +279 -0
- package/references/minimem/src/cli/sync/state.ts +355 -0
- package/references/minimem/src/cli/sync/validation.ts +206 -0
- package/references/minimem/src/cli/sync/watcher.ts +234 -0
- package/references/minimem/src/cli/version.ts +34 -0
- package/references/minimem/src/core/index.ts +9 -0
- package/references/minimem/src/core/indexer.ts +628 -0
- package/references/minimem/src/core/searcher.ts +221 -0
- package/references/minimem/src/db/schema.ts +183 -0
- package/references/minimem/src/db/sqlite-vec.ts +24 -0
- package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +431 -0
- package/references/minimem/src/embeddings/batch-gemini.ts +392 -0
- package/references/minimem/src/embeddings/batch-openai.ts +409 -0
- package/references/minimem/src/embeddings/embeddings.ts +434 -0
- package/references/minimem/src/index.ts +109 -0
- package/references/minimem/src/internal.ts +299 -0
- package/references/minimem/src/minimem.ts +1276 -0
- package/references/minimem/src/search/__tests__/hybrid.test.ts +247 -0
- package/references/minimem/src/search/graph.ts +234 -0
- package/references/minimem/src/search/hybrid.ts +151 -0
- package/references/minimem/src/search/search.ts +256 -0
- package/references/minimem/src/server/__tests__/mcp.test.ts +341 -0
- package/references/minimem/src/server/__tests__/tools.test.ts +364 -0
- package/references/minimem/src/server/mcp.ts +326 -0
- package/references/minimem/src/server/tools.ts +720 -0
- package/references/minimem/src/session.ts +460 -0
- package/references/minimem/tsconfig.json +19 -0
- package/references/minimem/tsup.config.ts +26 -0
- package/references/minimem/vitest.config.ts +24 -0
- package/references/openteams/.claude/settings.json +6 -0
- package/references/openteams/README.md +1 -0
- package/references/openteams/SKILL.md +341 -0
- package/references/openteams/design.md +411 -0
- package/references/openteams/examples/bmad-method/prompts/analyst/ROLE.md +16 -0
- package/references/openteams/examples/bmad-method/prompts/analyst/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/architect/ROLE.md +24 -0
- package/references/openteams/examples/bmad-method/prompts/architect/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/developer/ROLE.md +25 -0
- package/references/openteams/examples/bmad-method/prompts/developer/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/master/ROLE.md +21 -0
- package/references/openteams/examples/bmad-method/prompts/master/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/pm/ROLE.md +20 -0
- package/references/openteams/examples/bmad-method/prompts/pm/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/qa/ROLE.md +17 -0
- package/references/openteams/examples/bmad-method/prompts/qa/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/ROLE.md +23 -0
- package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/scrum-master/ROLE.md +27 -0
- package/references/openteams/examples/bmad-method/prompts/scrum-master/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/tech-writer/ROLE.md +21 -0
- package/references/openteams/examples/bmad-method/prompts/tech-writer/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/ux-designer/ROLE.md +16 -0
- package/references/openteams/examples/bmad-method/prompts/ux-designer/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/roles/analyst.yaml +9 -0
- package/references/openteams/examples/bmad-method/roles/architect.yaml +9 -0
- package/references/openteams/examples/bmad-method/roles/developer.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/master.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/pm.yaml +9 -0
- package/references/openteams/examples/bmad-method/roles/qa.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/quick-flow-dev.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/scrum-master.yaml +9 -0
- package/references/openteams/examples/bmad-method/roles/tech-writer.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/ux-designer.yaml +8 -0
- package/references/openteams/examples/bmad-method/team.yaml +161 -0
- package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/ROLE.md +17 -0
- package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/prompts/debugger/ROLE.md +25 -0
- package/references/openteams/examples/get-shit-done/prompts/debugger/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/prompts/executor/ROLE.md +34 -0
- package/references/openteams/examples/get-shit-done/prompts/executor/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/prompts/integration-checker/ROLE.md +18 -0
- package/references/openteams/examples/get-shit-done/prompts/integration-checker/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/orchestrator/ROLE.md +42 -0
- package/references/openteams/examples/get-shit-done/prompts/orchestrator/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/prompts/phase-researcher/ROLE.md +15 -0
- package/references/openteams/examples/get-shit-done/prompts/phase-researcher/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/plan-checker/ROLE.md +17 -0
- package/references/openteams/examples/get-shit-done/prompts/plan-checker/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/planner/ROLE.md +28 -0
- package/references/openteams/examples/get-shit-done/prompts/planner/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/prompts/project-researcher/ROLE.md +16 -0
- package/references/openteams/examples/get-shit-done/prompts/project-researcher/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/ROLE.md +13 -0
- package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/roadmapper/ROLE.md +14 -0
- package/references/openteams/examples/get-shit-done/prompts/roadmapper/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/verifier/ROLE.md +19 -0
- package/references/openteams/examples/get-shit-done/prompts/verifier/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/roles/codebase-mapper.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/debugger.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/executor.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/integration-checker.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/orchestrator.yaml +9 -0
- package/references/openteams/examples/get-shit-done/roles/phase-researcher.yaml +7 -0
- package/references/openteams/examples/get-shit-done/roles/plan-checker.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/planner.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/project-researcher.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/research-synthesizer.yaml +7 -0
- package/references/openteams/examples/get-shit-done/roles/roadmapper.yaml +7 -0
- package/references/openteams/examples/get-shit-done/roles/verifier.yaml +8 -0
- package/references/openteams/examples/get-shit-done/team.yaml +154 -0
- package/references/openteams/package-lock.json +2181 -0
- package/references/openteams/package.json +48 -0
- package/references/openteams/schema/role.schema.json +125 -0
- package/references/openteams/schema/team.schema.json +284 -0
- package/references/openteams/src/cli/agent.ts +104 -0
- package/references/openteams/src/cli/cli.test.ts +381 -0
- package/references/openteams/src/cli/generate.ts +220 -0
- package/references/openteams/src/cli/message.ts +241 -0
- package/references/openteams/src/cli/task.ts +154 -0
- package/references/openteams/src/cli/team.ts +104 -0
- package/references/openteams/src/cli/template.ts +207 -0
- package/references/openteams/src/cli.ts +45 -0
- package/references/openteams/src/db/database.test.ts +185 -0
- package/references/openteams/src/db/database.ts +240 -0
- package/references/openteams/src/generators/agent-prompt-generator.test.ts +332 -0
- package/references/openteams/src/generators/agent-prompt-generator.ts +521 -0
- package/references/openteams/src/generators/package-generator.test.ts +129 -0
- package/references/openteams/src/generators/package-generator.ts +102 -0
- package/references/openteams/src/generators/skill-generator.test.ts +246 -0
- package/references/openteams/src/generators/skill-generator.ts +374 -0
- package/references/openteams/src/index.ts +104 -0
- package/references/openteams/src/services/agent-service.test.ts +158 -0
- package/references/openteams/src/services/agent-service.ts +84 -0
- package/references/openteams/src/services/communication-service.test.ts +455 -0
- package/references/openteams/src/services/communication-service.ts +371 -0
- package/references/openteams/src/services/message-service.test.ts +342 -0
- package/references/openteams/src/services/message-service.ts +203 -0
- package/references/openteams/src/services/task-service.test.ts +434 -0
- package/references/openteams/src/services/task-service.ts +239 -0
- package/references/openteams/src/services/team-service.test.ts +181 -0
- package/references/openteams/src/services/team-service.ts +139 -0
- package/references/openteams/src/services/template-service.test.ts +306 -0
- package/references/openteams/src/services/template-service.ts +182 -0
- package/references/openteams/src/spawner/acp-factory.ts +96 -0
- package/references/openteams/src/spawner/interface.ts +31 -0
- package/references/openteams/src/spawner/mock.test.ts +93 -0
- package/references/openteams/src/spawner/mock.ts +59 -0
- package/references/openteams/src/template/loader.test.ts +1319 -0
- package/references/openteams/src/template/loader.ts +698 -0
- package/references/openteams/src/template/types.ts +200 -0
- package/references/openteams/src/types.ts +205 -0
- package/references/openteams/tsconfig.json +18 -0
- package/references/openteams/vitest.config.ts +9 -0
- package/references/skill-tree/.claude/settings.json +6 -0
- package/references/skill-tree/.sudocode/issues.jsonl +11 -0
- package/references/skill-tree/.sudocode/specs.jsonl +1 -0
- package/references/skill-tree/CLAUDE.md +150 -0
- package/references/skill-tree/README.md +324 -0
- package/references/skill-tree/docs/GAPS_v1.md +221 -0
- package/references/skill-tree/docs/INTEGRATION_PLAN.md +467 -0
- package/references/skill-tree/docs/TODOS.md +91 -0
- package/references/skill-tree/docs/anthropic_skill_guide.md +1364 -0
- package/references/skill-tree/docs/design/federated-skill-trees.md +524 -0
- package/references/skill-tree/docs/design/multi-agent-sync.md +759 -0
- package/references/skill-tree/docs/scraper/BRAINSTORM.md +583 -0
- package/references/skill-tree/docs/scraper/POC_PLAN.md +420 -0
- package/references/skill-tree/docs/scraper/README.md +170 -0
- package/references/skill-tree/examples/basic-usage.ts +190 -0
- package/references/skill-tree/package-lock.json +1509 -0
- package/references/skill-tree/package.json +66 -0
- package/references/skill-tree/scraper/README.md +123 -0
- package/references/skill-tree/scraper/docs/DESIGN.md +683 -0
- package/references/skill-tree/scraper/docs/PLAN.md +336 -0
- package/references/skill-tree/scraper/drizzle.config.ts +10 -0
- package/references/skill-tree/scraper/package-lock.json +6329 -0
- package/references/skill-tree/scraper/package.json +68 -0
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +7 -0
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +7 -0
- package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +27 -0
- package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +21 -0
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +54 -0
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +24 -0
- package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +93 -0
- package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +22 -0
- package/references/skill-tree/scraper/tsup.config.ts +14 -0
- package/references/skill-tree/scraper/vitest.config.ts +17 -0
- package/references/skill-tree/scripts/convert-to-vitest.ts +166 -0
- package/references/skill-tree/skills/skill-writer/SKILL.md +339 -0
- package/references/skill-tree/skills/skill-writer/references/examples.md +326 -0
- package/references/skill-tree/skills/skill-writer/references/patterns.md +210 -0
- package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +123 -0
- package/references/skill-tree/test/run-all.ts +106 -0
- package/references/skill-tree/test/utils.ts +128 -0
- package/references/skill-tree/vitest.config.ts +16 -0
- package/src/__tests__/e2e/agent-spawn-visibility.e2e.test.ts +761 -0
- package/src/__tests__/e2e/full-agent-conflict-resolution.e2e.test.ts +2 -2
- package/src/__tests__/e2e/mcp-thin-client-bridge.e2e.test.ts +304 -0
- package/src/__tests__/e2e/mcp-tools-available.e2e.test.ts +324 -0
- package/src/__tests__/e2e/multi-agent.e2e.test.ts +5 -5
- package/src/__tests__/e2e/spawn-session-streaming.e2e.test.ts +563 -0
- package/src/acp/__tests__/integration.test.ts +56 -31
- package/src/acp/__tests__/macro-agent.test.ts +16 -7
- package/src/acp/macro-agent.ts +170 -36
- package/src/acp/types.ts +46 -1
- package/src/agent/__tests__/agent-manager.test.ts +228 -2
- package/src/agent/agent-manager.ts +809 -285
- package/src/agent/types.ts +12 -1
- package/src/api/__tests__/server.test.ts +203 -4
- package/src/api/server.ts +169 -10
- package/src/api/types.ts +3 -1
- package/src/auth/__tests__/token.test.ts +100 -0
- package/src/auth/index.ts +1 -0
- package/src/auth/token.ts +82 -0
- package/src/cli/__tests__/acp.test.ts +1 -1
- package/src/cli/__tests__/stable-instance-id.test.ts +1 -1
- package/src/cli/acp.ts +197 -72
- package/src/cli/index.ts +125 -15
- package/src/cli/mcp.ts +315 -197
- package/src/cli/parse-args.ts +54 -0
- package/src/cli/stable-instance-id.ts +14 -0
- package/src/config/project-config.ts +214 -27
- package/src/index.ts +3 -0
- package/src/lifecycle/__tests__/cascade-termination.test.ts +1 -1
- package/src/lifecycle/__tests__/handlers.test.ts +53 -0
- package/src/lifecycle/handlers/index.ts +25 -8
- package/src/lifecycle/types.ts +3 -0
- package/src/map/adapter/__tests__/acp-over-map-cancel.test.ts +22 -4
- package/src/map/adapter/__tests__/acp-over-map-getmodels.test.ts +355 -0
- package/src/map/adapter/__tests__/acp-over-map-history.test.ts +263 -0
- package/src/map/adapter/__tests__/acp-over-map-persistence.e2e.test.ts +1 -1
- package/src/map/adapter/__tests__/event-broadcast.test.ts +420 -0
- package/src/map/adapter/__tests__/event-log.test.ts +527 -0
- package/src/map/adapter/__tests__/event-translator.test.ts +3 -3
- package/src/map/adapter/__tests__/extensions.test.ts +408 -0
- package/src/map/adapter/__tests__/map-adapter.test.ts +99 -0
- package/src/map/adapter/__tests__/mcp-bridge.test.ts +1187 -0
- package/src/map/adapter/__tests__/multi-client-broadcast.test.ts +711 -0
- package/src/map/adapter/__tests__/stream-extensions.test.ts +494 -0
- package/src/map/adapter/__tests__/websocket-integration.test.ts +218 -0
- package/src/map/adapter/acp-over-map.ts +678 -66
- package/src/map/adapter/connection-manager.ts +3 -0
- package/src/map/adapter/event-log.ts +208 -0
- package/src/map/adapter/event-translator.ts +6 -6
- package/src/map/adapter/extensions/agent-lifecycle.ts +267 -0
- package/src/map/adapter/extensions/index.ts +96 -0
- package/src/map/adapter/extensions/mcp-bridge.ts +995 -0
- package/src/map/adapter/extensions/streams.ts +839 -0
- package/src/map/adapter/extensions/task.ts +11 -0
- package/src/map/adapter/extensions/update-metadata.ts +126 -0
- package/src/map/adapter/index.ts +33 -0
- package/src/map/adapter/interface.ts +2 -0
- package/src/map/adapter/map-adapter.ts +312 -47
- package/src/map/adapter/subscription-manager.ts +5 -1
- package/src/map/adapter/types.ts +10 -1
- package/src/mcp/__tests__/map-client.test.ts +386 -0
- package/src/mcp/__tests__/mcp-server-thin-client.test.ts +368 -0
- package/src/mcp/__tests__/mcp-server.test.ts +100 -1
- package/src/mcp/map-client.ts +177 -0
- package/src/mcp/mcp-server.ts +205 -103
- package/src/mcp/tools/done.ts +19 -0
- package/src/mcp/types.ts +6 -1
- package/src/metrics/metrics.ts +1 -1
- package/src/monitor/__tests__/stale-agent-flow.integration.test.ts +1 -1
- package/src/roles/__tests__/config-loader.test.ts +7 -7
- package/src/roles/builtin/coordinator.ts +2 -0
- package/src/roles/builtin/integrator.ts +2 -0
- package/src/roles/builtin/worker.ts +3 -0
- package/src/roles/capabilities.ts +28 -7
- package/src/roles/config-loader.ts +8 -7
- package/src/roles/registry.ts +2 -2
- package/src/roles/types.ts +7 -0
- package/src/server/__tests__/combined-server.test.ts +94 -21
- package/src/server/combined-server.ts +203 -33
- package/src/steering/__tests__/steering-integration.test.ts +1 -1
- package/src/store/__tests__/event-store-oob.test.ts +109 -0
- package/src/store/__tests__/event-store.test.ts +196 -1
- package/src/store/__tests__/instance.test.ts +3 -3
- package/src/store/event-store.ts +92 -23
- package/src/store/instance.ts +2 -2
- package/src/store/types/agents.ts +20 -0
- package/src/store/types/events.ts +1 -1
- package/src/task/backend/__tests__/create-task-backend.test.ts +225 -0
- package/src/task/backend/__tests__/e2e/unified-tool-provider-opentasks.e2e.test.ts +524 -0
- package/src/task/backend/__tests__/memory-pull-mode.test.ts +153 -0
- package/src/task/backend/__tests__/unified-tool-provider.test.ts +579 -0
- package/src/task/backend/index.ts +156 -106
- package/src/task/backend/memory.ts +4 -0
- package/src/task/backend/opentasks/__tests__/backend.test.ts +968 -0
- package/src/task/backend/opentasks/__tests__/daemon-manager.test.ts +406 -0
- package/src/task/backend/opentasks/__tests__/mapping.test.ts +84 -0
- package/src/task/backend/opentasks/__tests__/opentasks-backend.e2e.test.ts +1338 -0
- package/src/task/backend/opentasks/backend.ts +1323 -0
- package/src/task/backend/opentasks/client.ts +652 -0
- package/src/task/backend/opentasks/daemon-manager.ts +256 -0
- package/src/task/backend/opentasks/index.ts +69 -0
- package/src/task/backend/opentasks/mapping.ts +94 -0
- package/src/task/backend/types.ts +42 -66
- package/src/task/backend/unified-tool-provider.ts +779 -0
- package/src/teams/CLAUDE.md +180 -0
- package/src/teams/__tests__/cross-subsystem.integration.test.ts +1 -1
- package/src/teams/__tests__/e2e/workspace-isolation.e2e.test.ts +1263 -0
- package/src/teams/__tests__/team-manager.test.ts +814 -0
- package/src/teams/__tests__/team-system.test.ts +1291 -8
- package/src/teams/index.ts +21 -3
- package/src/teams/seed-defaults.ts +79 -0
- package/src/teams/team-loader.ts +202 -236
- package/src/teams/team-manager.ts +387 -0
- package/src/teams/team-runtime.ts +592 -121
- package/src/teams/types.ts +99 -200
- package/test_fixtures/README.md +2 -3
- package/test_fixtures/fixtures/index.ts +0 -3
- package/test_fixtures/fixtures/projects/project-with-specs.ts +7 -149
- package/test_fixtures/fixtures/repos/index.ts +1 -3
- package/test_fixtures/fixtures/repos/temp-repo-factory.ts +0 -116
- package/test_fixtures/fixtures/repos/types.ts +0 -11
- package/test_fixtures/harness/__tests__/fixtures.test.ts +10 -102
- package/test_fixtures/harness/__tests__/temp-repo-and-simulator.test.ts +0 -33
- package/test_fixtures/harness/simulator/agent-simulator.ts +4 -4
- package/vitest.config.ts +1 -1
- package/vitest.e2e.config.ts +1 -1
- package/vitest.setup.ts +1 -30
- package/.macro-agent/teams/self-driving/prompts/grinder.md +0 -27
- package/.macro-agent/teams/self-driving/prompts/judge.md +0 -27
- package/.macro-agent/teams/self-driving/prompts/planner.md +0 -33
- package/.macro-agent/teams/self-driving/roles/grinder.yaml +0 -17
- package/.macro-agent/teams/self-driving/roles/judge.yaml +0 -24
- package/.macro-agent/teams/self-driving/roles/planner.yaml +0 -18
- package/.macro-agent/teams/self-driving/team.yaml +0 -103
- package/.macro-agent/teams/structured/prompts/developer.md +0 -26
- package/.macro-agent/teams/structured/prompts/lead.md +0 -25
- package/.macro-agent/teams/structured/prompts/reviewer.md +0 -24
- package/.macro-agent/teams/structured/roles/developer.yaml +0 -12
- package/.macro-agent/teams/structured/roles/lead.yaml +0 -11
- package/.macro-agent/teams/structured/roles/reviewer.yaml +0 -19
- package/.macro-agent/teams/structured/team.yaml +0 -89
- package/docs/sudocode-integration.md +0 -383
- package/src/task/backend/__tests__/backend-parity.test.ts +0 -451
- package/src/task/backend/__tests__/tool-provider-edge-cases.test.ts +0 -430
- package/src/task/backend/__tests__/tool-provider.test.ts +0 -983
- package/src/task/backend/sudocode/__tests__/backend-edge-cases.test.ts +0 -575
- package/src/task/backend/sudocode/__tests__/backend.test.ts +0 -1194
- package/src/task/backend/sudocode/__tests__/client-integration.test.ts +0 -418
- package/src/task/backend/sudocode/__tests__/client.test.ts +0 -345
- package/src/task/backend/sudocode/__tests__/e2e/backend.e2e.test.ts +0 -753
- package/src/task/backend/sudocode/__tests__/e2e/server-client.e2e.test.ts +0 -680
- package/src/task/backend/sudocode/__tests__/e2e-workflow.test.ts +0 -666
- package/src/task/backend/sudocode/__tests__/integration/standalone-client.integration.test.ts +0 -396
- package/src/task/backend/sudocode/__tests__/integration/sudocode-cli.integration.test.ts +0 -328
- package/src/task/backend/sudocode/__tests__/integration/test-utils.ts +0 -175
- package/src/task/backend/sudocode/__tests__/mapping-edge-cases.test.ts +0 -265
- package/src/task/backend/sudocode/__tests__/server-client.test.ts +0 -675
- package/src/task/backend/sudocode/__tests__/sync-policy-edge-cases.test.ts +0 -521
- package/src/task/backend/sudocode/__tests__/sync-policy.test.ts +0 -519
- package/src/task/backend/sudocode/__tests__/tools.test.ts +0 -471
- package/src/task/backend/sudocode/backend.ts +0 -1237
- package/src/task/backend/sudocode/client.ts +0 -515
- package/src/task/backend/sudocode/index.ts +0 -120
- package/src/task/backend/sudocode/mapping.ts +0 -93
- package/src/task/backend/sudocode/server-client.ts +0 -522
- package/src/task/backend/sudocode/standalone-client.ts +0 -623
- package/src/task/backend/sudocode/sync-policy.ts +0 -387
- package/src/task/backend/sudocode/tools.ts +0 -896
- package/src/task/backend/tool-provider.ts +0 -506
- package/test_fixtures/fixtures/sudocode/index.ts +0 -29
- package/test_fixtures/fixtures/sudocode/issues.ts +0 -185
- package/test_fixtures/fixtures/sudocode/specs.ts +0 -159
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Configuration Loader
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Layered configuration system with priority (highest to lowest):
|
|
5
|
+
* 1. Environment variables (MACRO_*, OPENTASKS_*)
|
|
6
|
+
* 2. Project config: .multiagent/config.json
|
|
7
|
+
* 3. Global config: ~/.multiagent/config.json
|
|
5
8
|
*
|
|
6
9
|
* @module config/project-config
|
|
7
10
|
*/
|
|
8
11
|
|
|
9
12
|
import * as fs from "fs";
|
|
13
|
+
import * as os from "os";
|
|
10
14
|
import * as path from "path";
|
|
11
15
|
|
|
12
16
|
// =============================================================================
|
|
@@ -14,9 +18,62 @@ import * as path from "path";
|
|
|
14
18
|
// =============================================================================
|
|
15
19
|
|
|
16
20
|
/**
|
|
17
|
-
*
|
|
21
|
+
* Entry in the `teams` config for declaring additional team templates.
|
|
22
|
+
*/
|
|
23
|
+
export interface TeamConfigEntry {
|
|
24
|
+
/** Template name (defaults to the key) */
|
|
25
|
+
template?: string;
|
|
26
|
+
/** Auto-start on server boot (default: false) */
|
|
27
|
+
autoStart?: boolean;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Typed configuration schema for multiagent.
|
|
18
32
|
*
|
|
19
|
-
* Loaded from .
|
|
33
|
+
* Loaded from .multiagent/config.json (project or global).
|
|
34
|
+
* Environment variables override file-based config.
|
|
35
|
+
*/
|
|
36
|
+
export interface MultiagentConfig {
|
|
37
|
+
/** Default team template name to load on startup */
|
|
38
|
+
team?: string;
|
|
39
|
+
|
|
40
|
+
/** Additional teams available for dynamic or auto-start loading */
|
|
41
|
+
teams?: Record<string, TeamConfigEntry>;
|
|
42
|
+
|
|
43
|
+
/** Server port (default: 3001) */
|
|
44
|
+
port?: number;
|
|
45
|
+
|
|
46
|
+
/** Server host (default: "localhost") */
|
|
47
|
+
host?: string;
|
|
48
|
+
|
|
49
|
+
/** Authentication config */
|
|
50
|
+
auth?: {
|
|
51
|
+
/** Disable auth entirely */
|
|
52
|
+
disabled?: boolean;
|
|
53
|
+
/** Server secret token */
|
|
54
|
+
secret?: string;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/** Task backend config */
|
|
58
|
+
task?: {
|
|
59
|
+
/** Backend type: "memory" | "opentasks" */
|
|
60
|
+
backend?: string;
|
|
61
|
+
/** OpenTasks-specific config */
|
|
62
|
+
opentasks?: {
|
|
63
|
+
/** Path to OpenTasks daemon socket */
|
|
64
|
+
socket_path?: string;
|
|
65
|
+
/** Auto-start central daemon (default: true) */
|
|
66
|
+
auto_start?: boolean;
|
|
67
|
+
/** Central daemon location (default: ~/.multiagent/opentasks) */
|
|
68
|
+
central_path?: string;
|
|
69
|
+
/** Auto-connect project .opentasks/ on agent spawn (default: true) */
|
|
70
|
+
connect_on_spawn?: boolean;
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Legacy project config interface (backwards compatibility).
|
|
20
77
|
*/
|
|
21
78
|
export interface ProjectConfig {
|
|
22
79
|
/** Team template name to load on startup */
|
|
@@ -31,38 +88,21 @@ export interface ProjectConfig {
|
|
|
31
88
|
// =============================================================================
|
|
32
89
|
|
|
33
90
|
/** Config directory name */
|
|
34
|
-
export const CONFIG_DIR = ".
|
|
91
|
+
export const CONFIG_DIR = ".multiagent";
|
|
35
92
|
|
|
36
93
|
/** Config file name */
|
|
37
94
|
export const CONFIG_FILE = "config.json";
|
|
38
95
|
|
|
39
96
|
// =============================================================================
|
|
40
|
-
// Loader
|
|
97
|
+
// JSON Loader (shared)
|
|
41
98
|
// =============================================================================
|
|
42
99
|
|
|
43
100
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* @param projectPath - Project root directory (default: process.cwd())
|
|
47
|
-
* @returns Absolute path to .macro-agent/config.json
|
|
48
|
-
*/
|
|
49
|
-
export function getProjectConfigPath(projectPath?: string): string {
|
|
50
|
-
const root = projectPath ?? process.cwd();
|
|
51
|
-
return path.join(root, CONFIG_DIR, CONFIG_FILE);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Load project configuration from .macro-agent/config.json.
|
|
56
|
-
*
|
|
57
|
-
* Returns empty config if the file doesn't exist.
|
|
101
|
+
* Load and parse a JSON config file.
|
|
102
|
+
* Returns empty object if file doesn't exist.
|
|
58
103
|
* Throws on invalid JSON.
|
|
59
|
-
*
|
|
60
|
-
* @param projectPath - Project root directory (default: process.cwd())
|
|
61
|
-
* @returns Parsed ProjectConfig
|
|
62
104
|
*/
|
|
63
|
-
|
|
64
|
-
const configPath = getProjectConfigPath(projectPath);
|
|
65
|
-
|
|
105
|
+
function loadJsonConfig(configPath: string): Record<string, unknown> {
|
|
66
106
|
if (!fs.existsSync(configPath)) {
|
|
67
107
|
return {};
|
|
68
108
|
}
|
|
@@ -78,7 +118,7 @@ export function loadProjectConfig(projectPath?: string): ProjectConfig {
|
|
|
78
118
|
configPath
|
|
79
119
|
);
|
|
80
120
|
}
|
|
81
|
-
return parsed as
|
|
121
|
+
return parsed as Record<string, unknown>;
|
|
82
122
|
} catch (error) {
|
|
83
123
|
if (error instanceof ProjectConfigError) throw error;
|
|
84
124
|
throw new ProjectConfigError(
|
|
@@ -89,6 +129,153 @@ export function loadProjectConfig(projectPath?: string): ProjectConfig {
|
|
|
89
129
|
}
|
|
90
130
|
}
|
|
91
131
|
|
|
132
|
+
// =============================================================================
|
|
133
|
+
// Path Resolution
|
|
134
|
+
// =============================================================================
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Get the project config file path.
|
|
138
|
+
*
|
|
139
|
+
* @param projectPath - Project root directory (default: process.cwd())
|
|
140
|
+
* @returns Absolute path to .multiagent/config.json
|
|
141
|
+
*/
|
|
142
|
+
export function getProjectConfigPath(projectPath?: string): string {
|
|
143
|
+
const root = projectPath ?? process.cwd();
|
|
144
|
+
return path.join(root, CONFIG_DIR, CONFIG_FILE);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Get the global config file path.
|
|
149
|
+
*
|
|
150
|
+
* @returns Absolute path to ~/.multiagent/config.json (or MACRO_AGENT_HOME/config.json)
|
|
151
|
+
*/
|
|
152
|
+
export function getGlobalConfigPath(): string {
|
|
153
|
+
const globalDir = process.env.MACRO_AGENT_HOME || path.join(os.homedir(), CONFIG_DIR);
|
|
154
|
+
return path.join(globalDir, CONFIG_FILE);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// =============================================================================
|
|
158
|
+
// Individual Loaders
|
|
159
|
+
// =============================================================================
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Load project configuration from .multiagent/config.json.
|
|
163
|
+
*
|
|
164
|
+
* Returns empty config if the file doesn't exist.
|
|
165
|
+
* Throws on invalid JSON.
|
|
166
|
+
*
|
|
167
|
+
* @param projectPath - Project root directory (default: process.cwd())
|
|
168
|
+
* @returns Parsed ProjectConfig
|
|
169
|
+
*/
|
|
170
|
+
export function loadProjectConfig(projectPath?: string): ProjectConfig {
|
|
171
|
+
return loadJsonConfig(getProjectConfigPath(projectPath)) as ProjectConfig;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Load global configuration from ~/.multiagent/config.json.
|
|
176
|
+
*
|
|
177
|
+
* Returns empty config if the file doesn't exist.
|
|
178
|
+
* Throws on invalid JSON.
|
|
179
|
+
*
|
|
180
|
+
* @returns Parsed config
|
|
181
|
+
*/
|
|
182
|
+
export function loadGlobalConfig(): MultiagentConfig {
|
|
183
|
+
return loadJsonConfig(getGlobalConfigPath()) as MultiagentConfig;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// =============================================================================
|
|
187
|
+
// Merged Config (layered)
|
|
188
|
+
// =============================================================================
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Deep merge two objects. Source values override target values.
|
|
192
|
+
* Only merges plain objects recursively; arrays and primitives are replaced.
|
|
193
|
+
*/
|
|
194
|
+
function deepMerge<T extends Record<string, unknown>>(target: T, source: Record<string, unknown>): T {
|
|
195
|
+
const result = { ...target };
|
|
196
|
+
|
|
197
|
+
for (const key of Object.keys(source)) {
|
|
198
|
+
const sourceVal = source[key];
|
|
199
|
+
const targetVal = (result as Record<string, unknown>)[key];
|
|
200
|
+
|
|
201
|
+
if (
|
|
202
|
+
sourceVal !== undefined &&
|
|
203
|
+
sourceVal !== null &&
|
|
204
|
+
typeof sourceVal === "object" &&
|
|
205
|
+
!Array.isArray(sourceVal) &&
|
|
206
|
+
typeof targetVal === "object" &&
|
|
207
|
+
targetVal !== null &&
|
|
208
|
+
!Array.isArray(targetVal)
|
|
209
|
+
) {
|
|
210
|
+
(result as Record<string, unknown>)[key] = deepMerge(
|
|
211
|
+
targetVal as Record<string, unknown>,
|
|
212
|
+
sourceVal as Record<string, unknown>
|
|
213
|
+
);
|
|
214
|
+
} else if (sourceVal !== undefined) {
|
|
215
|
+
(result as Record<string, unknown>)[key] = sourceVal;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Load merged configuration with layered priority:
|
|
224
|
+
* 1. Environment variables (highest)
|
|
225
|
+
* 2. Project .multiagent/config.json
|
|
226
|
+
* 3. Global ~/.multiagent/config.json (lowest)
|
|
227
|
+
*
|
|
228
|
+
* Only server-level settings are merged. Agent-level env vars
|
|
229
|
+
* (MACRO_AGENT_ID, MACRO_SERVER_URL, etc.) are internal wiring
|
|
230
|
+
* and not part of this config.
|
|
231
|
+
*
|
|
232
|
+
* @param projectPath - Project root directory (default: process.cwd())
|
|
233
|
+
* @returns Fully merged MultiagentConfig
|
|
234
|
+
*/
|
|
235
|
+
export function loadMergedConfig(projectPath?: string): MultiagentConfig {
|
|
236
|
+
const globalConfig = loadGlobalConfig();
|
|
237
|
+
const projectConfig = loadProjectConfig(projectPath);
|
|
238
|
+
|
|
239
|
+
// Layer 1: global (lowest priority)
|
|
240
|
+
// Layer 2: project overrides global
|
|
241
|
+
const merged: MultiagentConfig = deepMerge(
|
|
242
|
+
globalConfig as Record<string, unknown>,
|
|
243
|
+
projectConfig as Record<string, unknown>,
|
|
244
|
+
) as MultiagentConfig;
|
|
245
|
+
|
|
246
|
+
// Layer 3: env vars override everything (server-level only)
|
|
247
|
+
if (process.env.MACRO_TASK_BACKEND) {
|
|
248
|
+
merged.task = { ...(merged.task ?? {}), backend: process.env.MACRO_TASK_BACKEND };
|
|
249
|
+
}
|
|
250
|
+
if (process.env.OPENTASKS_SOCKET_PATH) {
|
|
251
|
+
merged.task = {
|
|
252
|
+
...(merged.task ?? {}),
|
|
253
|
+
opentasks: {
|
|
254
|
+
...(merged.task?.opentasks ?? {}),
|
|
255
|
+
socket_path: process.env.OPENTASKS_SOCKET_PATH,
|
|
256
|
+
},
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
if (process.env.MACRO_SERVER_SECRET) {
|
|
260
|
+
merged.auth = { ...(merged.auth ?? {}), secret: process.env.MACRO_SERVER_SECRET };
|
|
261
|
+
}
|
|
262
|
+
if (process.env.MACRO_NO_AUTH === "true") {
|
|
263
|
+
merged.auth = { ...(merged.auth ?? {}), disabled: true };
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// MACRO_TEAMS: comma-separated template names to auto-start
|
|
267
|
+
if (process.env.MACRO_TEAMS) {
|
|
268
|
+
const names = process.env.MACRO_TEAMS.split(",").map(s => s.trim()).filter(Boolean);
|
|
269
|
+
const teams: Record<string, TeamConfigEntry> = { ...(merged.teams ?? {}) };
|
|
270
|
+
for (const name of names) {
|
|
271
|
+
teams[name] = { ...teams[name], autoStart: true };
|
|
272
|
+
}
|
|
273
|
+
merged.teams = teams;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
return merged;
|
|
277
|
+
}
|
|
278
|
+
|
|
92
279
|
// =============================================================================
|
|
93
280
|
// Errors
|
|
94
281
|
// =============================================================================
|
package/src/index.ts
CHANGED
|
@@ -74,7 +74,7 @@ function createCascadeAdapter(harness: TestHarness): CascadeAgentManager {
|
|
|
74
74
|
}
|
|
75
75
|
// Update agent state in EventStore
|
|
76
76
|
harness.eventStore.emit({
|
|
77
|
-
type: "
|
|
77
|
+
type: "stop",
|
|
78
78
|
source: { agent_id: agentId },
|
|
79
79
|
payload: { agent_id: agentId, reason },
|
|
80
80
|
});
|
|
@@ -1752,6 +1752,37 @@ describe("handlers", () => {
|
|
|
1752
1752
|
|
|
1753
1753
|
expect(handler).toBeDefined();
|
|
1754
1754
|
});
|
|
1755
|
+
|
|
1756
|
+
it("should return worker handler for team role with workspace.worktree capability", () => {
|
|
1757
|
+
const deps = createMockDeps();
|
|
1758
|
+
const registry = createHandlerRegistry(deps as any);
|
|
1759
|
+
|
|
1760
|
+
// "developer" extends "worker" — gets workspace.worktree capability
|
|
1761
|
+
const handler = getHandler("developer", registry, deps as any, ["workspace.worktree"]);
|
|
1762
|
+
|
|
1763
|
+
// Should be the worker handler, not generic
|
|
1764
|
+
expect(handler).toBe(registry.get("worker"));
|
|
1765
|
+
});
|
|
1766
|
+
|
|
1767
|
+
it("should return integrator handler for team role with workspace.integrate capability", () => {
|
|
1768
|
+
const deps = createMockDeps();
|
|
1769
|
+
const registry = createHandlerRegistry(deps as any);
|
|
1770
|
+
|
|
1771
|
+
const handler = getHandler("merger", registry, deps as any, ["workspace.integrate"]);
|
|
1772
|
+
|
|
1773
|
+
expect(handler).toBe(registry.get("integrator"));
|
|
1774
|
+
});
|
|
1775
|
+
|
|
1776
|
+
it("should return generic handler when capabilities have no workspace match", () => {
|
|
1777
|
+
const deps = createMockDeps();
|
|
1778
|
+
const registry = createHandlerRegistry(deps as any);
|
|
1779
|
+
|
|
1780
|
+
const handler = getHandler("watcher", registry, deps as any, ["msg.send", "file.read"]);
|
|
1781
|
+
|
|
1782
|
+
// No workspace capability → falls through to generic
|
|
1783
|
+
expect(handler).not.toBe(registry.get("worker"));
|
|
1784
|
+
expect(handler).not.toBe(registry.get("integrator"));
|
|
1785
|
+
});
|
|
1755
1786
|
});
|
|
1756
1787
|
|
|
1757
1788
|
describe("dispatchDone", () => {
|
|
@@ -1795,6 +1826,28 @@ describe("handlers", () => {
|
|
|
1795
1826
|
expect(result.signalsEmitted).toContain("STATUS");
|
|
1796
1827
|
});
|
|
1797
1828
|
|
|
1829
|
+
it("should dispatch team role with workspace.worktree to worker handler", async () => {
|
|
1830
|
+
const deps = createMockDeps();
|
|
1831
|
+
const context: LifecycleContext = {
|
|
1832
|
+
agentId: "developer-1",
|
|
1833
|
+
role: "developer",
|
|
1834
|
+
capabilities: ["workspace.worktree", "lifecycle.done", "file.read"],
|
|
1835
|
+
};
|
|
1836
|
+
const args: DoneArgs = { status: "completed" };
|
|
1837
|
+
const cleanupStatus: CleanupStatus = { ready: true };
|
|
1838
|
+
|
|
1839
|
+
const result = await dispatchDone(
|
|
1840
|
+
context,
|
|
1841
|
+
args,
|
|
1842
|
+
cleanupStatus,
|
|
1843
|
+
deps as any,
|
|
1844
|
+
);
|
|
1845
|
+
|
|
1846
|
+
// Should have gone through the worker handler path
|
|
1847
|
+
expect(result.shouldTerminate).toBe(true);
|
|
1848
|
+
expect(result.signalsEmitted).toContain("WORKER_DONE");
|
|
1849
|
+
});
|
|
1850
|
+
|
|
1798
1851
|
it("should use custom registry when provided", async () => {
|
|
1799
1852
|
const deps = createMockDeps();
|
|
1800
1853
|
const customHandler = vi.fn().mockResolvedValue({
|
|
@@ -111,29 +111,46 @@ export function createHandlerRegistry(
|
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
/**
|
|
114
|
-
* Get the handler for a given role
|
|
114
|
+
* Get the handler for a given role.
|
|
115
115
|
*
|
|
116
|
-
*
|
|
116
|
+
* Resolution order:
|
|
117
|
+
* 1. Exact role name match (e.g., "worker", "integrator")
|
|
118
|
+
* 2. Dot-prefix match (e.g., "worker.resolver" → "worker")
|
|
119
|
+
* 3. Capability-based match (e.g., "developer" with workspace.worktree → worker handler)
|
|
120
|
+
* 4. Generic fallback handler
|
|
117
121
|
*/
|
|
118
122
|
export function getHandler(
|
|
119
123
|
role: string,
|
|
120
124
|
registry: DoneHandlerRegistry,
|
|
121
|
-
deps: AllHandlerDeps
|
|
125
|
+
deps: AllHandlerDeps,
|
|
126
|
+
capabilities?: string[],
|
|
122
127
|
): DoneHandler {
|
|
123
|
-
//
|
|
128
|
+
// 1. Exact match
|
|
124
129
|
const handler = registry.get(role);
|
|
125
130
|
if (handler) {
|
|
126
131
|
return handler;
|
|
127
132
|
}
|
|
128
133
|
|
|
129
|
-
//
|
|
134
|
+
// 2. Dot-prefix match (e.g., "worker.resolver" → "worker")
|
|
130
135
|
const baseRole = role.split(".")[0];
|
|
131
136
|
const baseHandler = registry.get(baseRole);
|
|
132
137
|
if (baseHandler) {
|
|
133
138
|
return baseHandler;
|
|
134
139
|
}
|
|
135
140
|
|
|
136
|
-
//
|
|
141
|
+
// 3. Capability-based match (for team-defined roles like "developer" extending "worker")
|
|
142
|
+
if (capabilities) {
|
|
143
|
+
if (capabilities.includes("workspace.worktree")) {
|
|
144
|
+
const workerHandler = registry.get("worker");
|
|
145
|
+
if (workerHandler) return workerHandler;
|
|
146
|
+
}
|
|
147
|
+
if (capabilities.includes("workspace.integrate")) {
|
|
148
|
+
const integratorHandler = registry.get("integrator");
|
|
149
|
+
if (integratorHandler) return integratorHandler;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// 4. Generic fallback
|
|
137
154
|
const genericDeps: GenericHandlerDeps = {
|
|
138
155
|
messageRouter: deps.messageRouter,
|
|
139
156
|
};
|
|
@@ -158,8 +175,8 @@ export async function dispatchDone(
|
|
|
158
175
|
// Use provided registry or create default
|
|
159
176
|
const handlers = registry ?? createHandlerRegistry(deps);
|
|
160
177
|
|
|
161
|
-
// Get the handler for this role
|
|
162
|
-
const handler = getHandler(context.role, handlers, deps);
|
|
178
|
+
// Get the handler for this role (pass capabilities for team role resolution)
|
|
179
|
+
const handler = getHandler(context.role, handlers, deps, context.capabilities);
|
|
163
180
|
|
|
164
181
|
// Execute the handler
|
|
165
182
|
return handler(context, args, cleanupStatus);
|
package/src/lifecycle/types.ts
CHANGED
|
@@ -117,6 +117,9 @@ export interface LifecycleContext {
|
|
|
117
117
|
|
|
118
118
|
/** Merge request ID (for resolver workers to track which MR they're resolving) */
|
|
119
119
|
mrId?: string;
|
|
120
|
+
|
|
121
|
+
/** Resolved capabilities for the agent's role (for capability-based handler dispatch) */
|
|
122
|
+
capabilities?: string[];
|
|
120
123
|
}
|
|
121
124
|
|
|
122
125
|
/**
|
|
@@ -742,8 +742,26 @@ describe("MAPAdapter handleStopAgent (map/agents/stop)", () => {
|
|
|
742
742
|
).rejects.toThrow("Failed to stop agent: Agent not found");
|
|
743
743
|
});
|
|
744
744
|
|
|
745
|
-
it("should emit agent.state.changed event via
|
|
746
|
-
|
|
745
|
+
it("should emit agent.state.changed event via lifecycle listener", async () => {
|
|
746
|
+
// Capture lifecycle callback so we can fire it from the mock terminate
|
|
747
|
+
let lifecycleCallback: ((event: unknown) => void) | undefined;
|
|
748
|
+
|
|
749
|
+
await setupAdapter({
|
|
750
|
+
onLifecycleEvent: vi.fn().mockImplementation((cb: (event: unknown) => void) => {
|
|
751
|
+
lifecycleCallback = cb;
|
|
752
|
+
return () => {};
|
|
753
|
+
}),
|
|
754
|
+
terminate: vi.fn().mockImplementation(async () => {
|
|
755
|
+
// Simulate what real agentManager.terminate() does: fire lifecycle
|
|
756
|
+
if (lifecycleCallback) {
|
|
757
|
+
lifecycleCallback({
|
|
758
|
+
type: "stopped",
|
|
759
|
+
agent: { id: "agent-1", name: "test-agent", role: "worker", state: "stopped" },
|
|
760
|
+
reason: "user stopped",
|
|
761
|
+
});
|
|
762
|
+
}
|
|
763
|
+
}),
|
|
764
|
+
} as unknown as Partial<AgentManager>);
|
|
747
765
|
|
|
748
766
|
const impl = adapter as unknown as {
|
|
749
767
|
handleStopAgent: (
|
|
@@ -761,10 +779,10 @@ describe("MAPAdapter handleStopAgent (map/agents/stop)", () => {
|
|
|
761
779
|
{ agentId: "agent-1" as AgentId, reason: "user stopped" },
|
|
762
780
|
);
|
|
763
781
|
|
|
764
|
-
// Verify emitEvent was called with the right event shape
|
|
782
|
+
// Verify emitEvent was called with the right event shape via lifecycle
|
|
765
783
|
expect(emitSpy).toHaveBeenCalledWith(
|
|
766
784
|
expect.objectContaining({
|
|
767
|
-
type: "
|
|
785
|
+
type: "agent_state_changed",
|
|
768
786
|
agentId: "agent-1",
|
|
769
787
|
data: expect.objectContaining({
|
|
770
788
|
agentId: "agent-1",
|