macro-agent 0.1.1 → 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/.sudocode/issues.jsonl +28 -0
- package/.sudocode/specs.jsonl +4 -0
- package/CLAUDE.md +9 -3
- package/dist/agent/agent-manager.d.ts.map +1 -1
- package/dist/agent/agent-manager.js +111 -48
- package/dist/agent/agent-manager.js.map +1 -1
- package/dist/agent/types.d.ts +7 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/api/server.d.ts +5 -1
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +100 -3
- 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/cli/acp.d.ts.map +1 -1
- package/dist/cli/acp.js +71 -1
- package/dist/cli/acp.js.map +1 -1
- package/dist/cli/index.js +5 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp.js +27 -8
- package/dist/cli/mcp.js.map +1 -1
- package/dist/config/project-config.d.ts +13 -2
- package/dist/config/project-config.d.ts.map +1 -1
- package/dist/config/project-config.js +12 -2
- 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/extensions/index.d.ts +4 -1
- package/dist/map/adapter/extensions/index.d.ts.map +1 -1
- package/dist/map/adapter/extensions/index.js +27 -0
- package/dist/map/adapter/extensions/index.js.map +1 -1
- 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/index.d.ts +1 -1
- package/dist/map/adapter/index.d.ts.map +1 -1
- package/dist/map/adapter/index.js +3 -1
- package/dist/map/adapter/index.js.map +1 -1
- package/dist/map/adapter/types.d.ts +1 -1
- package/dist/map/adapter/types.d.ts.map +1 -1
- package/dist/mcp/mcp-server.d.ts +2 -0
- package/dist/mcp/mcp-server.d.ts.map +1 -1
- package/dist/mcp/mcp-server.js +12 -3
- 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/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 +6 -0
- package/dist/roles/capabilities.d.ts.map +1 -1
- package/dist/roles/capabilities.js +10 -0
- package/dist/roles/capabilities.js.map +1 -1
- package/dist/roles/config-loader.d.ts +1 -1
- package/dist/roles/config-loader.d.ts.map +1 -1
- package/dist/roles/config-loader.js +3 -2
- package/dist/roles/config-loader.js.map +1 -1
- package/dist/roles/types.d.ts +3 -1
- package/dist/roles/types.d.ts.map +1 -1
- package/dist/server/combined-server.d.ts +8 -1
- package/dist/server/combined-server.d.ts.map +1 -1
- package/dist/server/combined-server.js +6 -2
- package/dist/server/combined-server.js.map +1 -1
- package/dist/store/event-store.d.ts.map +1 -1
- package/dist/store/event-store.js +12 -5
- 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 +5 -0
- package/dist/store/types/agents.d.ts.map +1 -1
- package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -1
- package/dist/task/backend/opentasks/daemon-manager.js +1 -1
- package/dist/task/backend/opentasks/daemon-manager.js.map +1 -1
- 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 +6 -2
- package/dist/teams/team-loader.d.ts.map +1 -1
- package/dist/teams/team-loader.js +154 -162
- 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 +527 -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/teams.md +73 -0
- package/package.json +2 -1
- 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/agent/agent-manager.ts +143 -72
- package/src/agent/types.ts +9 -0
- package/src/api/__tests__/server.test.ts +203 -4
- package/src/api/server.ts +130 -5
- package/src/api/types.ts +3 -1
- package/src/cli/acp.ts +68 -1
- package/src/cli/index.ts +5 -1
- package/src/cli/mcp.ts +27 -13
- package/src/config/project-config.ts +27 -3
- package/src/index.ts +3 -0
- 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__/stream-extensions.test.ts +494 -0
- package/src/map/adapter/extensions/index.ts +36 -0
- package/src/map/adapter/extensions/streams.ts +839 -0
- package/src/map/adapter/index.ts +5 -0
- package/src/map/adapter/types.ts +8 -1
- package/src/mcp/mcp-server.ts +14 -3
- package/src/mcp/tools/done.ts +19 -0
- 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 +11 -0
- package/src/roles/config-loader.ts +3 -2
- package/src/roles/types.ts +7 -0
- package/src/server/combined-server.ts +15 -1
- package/src/store/__tests__/event-store-oob.test.ts +109 -0
- package/src/store/event-store.ts +13 -3
- package/src/store/instance.ts +2 -2
- package/src/store/types/agents.ts +5 -0
- package/src/task/backend/__tests__/memory-pull-mode.test.ts +153 -0
- package/src/task/backend/opentasks/daemon-manager.ts +4 -1
- package/src/teams/CLAUDE.md +180 -0
- 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 +200 -234
- package/src/teams/team-manager.ts +387 -0
- package/src/teams/team-runtime.ts +590 -121
- package/src/teams/types.ts +99 -200
package/src/teams/team-loader.ts
CHANGED
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Team Template Loader
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Thin wrapper around openteams TemplateLoader that maps the result
|
|
5
|
+
* into macro-agent's TeamManifest format with enforcement-enriched roles.
|
|
6
6
|
*
|
|
7
7
|
* @module teams/team-loader
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import * as fs from "fs";
|
|
11
10
|
import * as path from "path";
|
|
12
|
-
import
|
|
11
|
+
import { TemplateLoader } from "openteams";
|
|
12
|
+
import type {
|
|
13
|
+
ResolvedRole,
|
|
14
|
+
TeamManifest as OpenTeamsManifest,
|
|
15
|
+
} from "openteams";
|
|
13
16
|
import type { RoleRegistry, RoleDefinition, Capability } from "../roles/types.js";
|
|
14
17
|
import {
|
|
15
18
|
TeamLoadError,
|
|
16
19
|
type TeamManifest,
|
|
17
|
-
type
|
|
18
|
-
type TeamCommunication,
|
|
20
|
+
type TeamRoleMacroAgent,
|
|
19
21
|
type MacroAgentExtensions,
|
|
20
|
-
type TeamRoleDefinition,
|
|
21
22
|
type ResolvedTeamRole,
|
|
22
|
-
type
|
|
23
|
+
type CommunicationConfig,
|
|
23
24
|
} from "./types.js";
|
|
24
25
|
|
|
25
26
|
// =============================================================================
|
|
@@ -27,11 +28,6 @@ import {
|
|
|
27
28
|
// =============================================================================
|
|
28
29
|
|
|
29
30
|
const TEAMS_DIR = ".multiagent/teams";
|
|
30
|
-
const MANIFEST_FILE = "team.yaml";
|
|
31
|
-
const ROLES_DIR = "roles";
|
|
32
|
-
const PROMPTS_DIR = "prompts";
|
|
33
|
-
const TOOLS_DIR = "tools";
|
|
34
|
-
const MCP_SERVERS_FILE = "mcp-servers.json";
|
|
35
31
|
|
|
36
32
|
// =============================================================================
|
|
37
33
|
// TeamLoader
|
|
@@ -40,6 +36,10 @@ const MCP_SERVERS_FILE = "mcp-servers.json";
|
|
|
40
36
|
/**
|
|
41
37
|
* Load a team template from disk and resolve all references.
|
|
42
38
|
*
|
|
39
|
+
* Delegates to openteams TemplateLoader for YAML parsing, role resolution,
|
|
40
|
+
* prompt loading, and MCP server config. Enriches the result with macro-agent
|
|
41
|
+
* specific enforcement (workspace, lifecycle, spawn rules).
|
|
42
|
+
*
|
|
43
43
|
* @param teamName - Team name (directory name under .multiagent/teams/)
|
|
44
44
|
* @param roleRegistry - Role registry for resolving extends chains
|
|
45
45
|
* @param basePath - Project root (default: process.cwd())
|
|
@@ -53,248 +53,206 @@ export async function loadTeam(
|
|
|
53
53
|
const root = basePath ?? process.cwd();
|
|
54
54
|
const teamDir = path.join(root, TEAMS_DIR, teamName);
|
|
55
55
|
|
|
56
|
-
// 1.
|
|
57
|
-
|
|
58
|
-
throw new TeamLoadError(
|
|
59
|
-
`Team directory not found: ${teamDir}`,
|
|
60
|
-
"MANIFEST_NOT_FOUND",
|
|
61
|
-
teamName
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// 2. Read and parse team.yaml
|
|
66
|
-
const manifestPath = path.join(teamDir, MANIFEST_FILE);
|
|
67
|
-
if (!fs.existsSync(manifestPath)) {
|
|
68
|
-
throw new TeamLoadError(
|
|
69
|
-
`Team manifest not found: ${manifestPath}`,
|
|
70
|
-
"MANIFEST_NOT_FOUND",
|
|
71
|
-
teamName
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const raw = fs.readFileSync(manifestPath, "utf-8");
|
|
76
|
-
let parsed: Record<string, unknown>;
|
|
56
|
+
// 1. Load via openteams TemplateLoader with hooks
|
|
57
|
+
let template;
|
|
77
58
|
try {
|
|
78
|
-
|
|
59
|
+
template = await TemplateLoader.loadAsync(teamDir, {
|
|
60
|
+
resolveExternalRole: (name) => mapRegistryRole(roleRegistry, name),
|
|
61
|
+
postProcessRole: (role, manifest) =>
|
|
62
|
+
enrichRoleWithSpawnRules(role, manifest),
|
|
63
|
+
});
|
|
79
64
|
} catch (err) {
|
|
80
|
-
throw
|
|
81
|
-
`Failed to parse ${manifestPath}: ${err instanceof Error ? err.message : String(err)}`,
|
|
82
|
-
"INVALID_MANIFEST",
|
|
83
|
-
teamName
|
|
84
|
-
);
|
|
65
|
+
throw mapToTeamLoadError(err, teamName, teamDir);
|
|
85
66
|
}
|
|
86
67
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const topology = parsed.topology as TeamTopology;
|
|
91
|
-
const communication = (parsed.communication ?? {}) as TeamCommunication;
|
|
92
|
-
const macroAgent = (parsed.macro_agent ?? {}) as MacroAgentExtensions;
|
|
93
|
-
const roleNames = parsed.roles as string[];
|
|
68
|
+
const manifest = template.manifest;
|
|
69
|
+
const communication = (manifest.communication ?? {}) as CommunicationConfig;
|
|
70
|
+
const macroAgent = parseMacroAgentExtensions(manifest.macro_agent);
|
|
94
71
|
|
|
95
|
-
//
|
|
72
|
+
// 2. Build enforcement-enriched roles
|
|
96
73
|
const resolvedRoles = new Map<string, ResolvedTeamRole>();
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
for (const roleName of roleNames) {
|
|
100
|
-
const resolved = resolveTeamRole(
|
|
74
|
+
for (const [roleName, openteamsRole] of template.roles) {
|
|
75
|
+
resolvedRoles.set(
|
|
101
76
|
roleName,
|
|
102
|
-
|
|
103
|
-
roleRegistry,
|
|
104
|
-
spawnRules
|
|
77
|
+
buildResolvedTeamRole(roleName, openteamsRole, roleRegistry)
|
|
105
78
|
);
|
|
106
|
-
resolvedRoles.set(roleName, resolved);
|
|
107
79
|
}
|
|
108
80
|
|
|
109
|
-
//
|
|
81
|
+
// 3. Build loaded prompts map (backward compat: path → assembled content)
|
|
82
|
+
// Assembles multi-file prompts (primary + additional sections) into a single
|
|
83
|
+
// string so the runtime can use it transparently.
|
|
110
84
|
const loadedPrompts = new Map<string, string>();
|
|
85
|
+
for (const [roleName, resolvedPrompts] of template.prompts) {
|
|
86
|
+
if (!resolvedPrompts.primary) continue;
|
|
87
|
+
const role = template.roles.get(roleName);
|
|
88
|
+
|
|
89
|
+
// Assemble full prompt: primary + additional sections
|
|
90
|
+
let fullPrompt = resolvedPrompts.primary;
|
|
91
|
+
for (const section of resolvedPrompts.additional) {
|
|
92
|
+
fullPrompt += `\n\n## ${section.name}\n\n${section.content}`;
|
|
93
|
+
}
|
|
111
94
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
95
|
+
// Store under role's promptFile key (used by getPromptForRole)
|
|
96
|
+
if (role?.promptFile) {
|
|
97
|
+
loadedPrompts.set(role.promptFile, fullPrompt);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Store under topology node prompt keys (used by getPromptForTopologyNode)
|
|
101
|
+
if (manifest.topology.root.role === roleName && manifest.topology.root.prompt) {
|
|
102
|
+
loadedPrompts.set(manifest.topology.root.prompt, fullPrompt);
|
|
103
|
+
}
|
|
104
|
+
for (const comp of manifest.topology.companions ?? []) {
|
|
105
|
+
if (comp.role === roleName && comp.prompt) {
|
|
106
|
+
loadedPrompts.set(comp.prompt, fullPrompt);
|
|
107
|
+
}
|
|
122
108
|
}
|
|
123
|
-
loadedPrompts.set(promptPath, fs.readFileSync(fullPath, "utf-8"));
|
|
124
|
-
}
|
|
125
109
|
|
|
126
|
-
|
|
127
|
-
|
|
110
|
+
// Convention fallback key
|
|
111
|
+
if (!role?.promptFile) {
|
|
112
|
+
loadedPrompts.set(`prompts/${roleName}.md`, fullPrompt);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
128
115
|
|
|
129
|
-
//
|
|
130
|
-
validateCommunication(communication,
|
|
116
|
+
// 4. Validate communication topology
|
|
117
|
+
validateCommunication(communication, manifest.roles, teamName);
|
|
131
118
|
|
|
132
119
|
return {
|
|
133
|
-
name:
|
|
134
|
-
description: (
|
|
135
|
-
version:
|
|
136
|
-
roles:
|
|
137
|
-
topology,
|
|
120
|
+
name: manifest.name,
|
|
121
|
+
description: (manifest.description as string) ?? "",
|
|
122
|
+
version: manifest.version ?? 1,
|
|
123
|
+
roles: manifest.roles,
|
|
124
|
+
topology: manifest.topology,
|
|
138
125
|
communication,
|
|
139
126
|
macro_agent: macroAgent,
|
|
140
127
|
_resolvedRoles: resolvedRoles,
|
|
141
128
|
_loadedPrompts: loadedPrompts,
|
|
142
|
-
_mcpServers: mcpServers,
|
|
129
|
+
_mcpServers: template.mcpServers,
|
|
143
130
|
};
|
|
144
131
|
}
|
|
145
132
|
|
|
146
133
|
// =============================================================================
|
|
147
|
-
//
|
|
134
|
+
// Hook: Map RoleRegistry → openteams ResolvedRole
|
|
148
135
|
// =============================================================================
|
|
149
136
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
);
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
137
|
+
/**
|
|
138
|
+
* Convert a macro-agent RoleRegistry entry to an openteams ResolvedRole.
|
|
139
|
+
* Used as the resolveExternalRole hook for TemplateLoader.
|
|
140
|
+
*/
|
|
141
|
+
function mapRegistryRole(
|
|
142
|
+
roleRegistry: RoleRegistry,
|
|
143
|
+
name: string
|
|
144
|
+
): ResolvedRole | null {
|
|
145
|
+
try {
|
|
146
|
+
const rd = roleRegistry.resolveRole(name);
|
|
147
|
+
return {
|
|
148
|
+
name: rd.name,
|
|
149
|
+
displayName: rd.displayName ?? rd.name,
|
|
150
|
+
description: rd.description ?? `Role: ${rd.name}`,
|
|
151
|
+
capabilities: [...rd.capabilities],
|
|
152
|
+
raw: { name: rd.name, capabilities: [...rd.capabilities] },
|
|
153
|
+
};
|
|
154
|
+
} catch {
|
|
155
|
+
return null;
|
|
168
156
|
}
|
|
157
|
+
}
|
|
169
158
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
"INVALID_MANIFEST",
|
|
174
|
-
teamName
|
|
175
|
-
);
|
|
176
|
-
}
|
|
159
|
+
// =============================================================================
|
|
160
|
+
// Hook: Enrich roles with spawn_rules capabilities
|
|
161
|
+
// =============================================================================
|
|
177
162
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
163
|
+
/**
|
|
164
|
+
* Translate team topology spawn_rules into agent.spawn.* capabilities.
|
|
165
|
+
* Used as the postProcessRole hook for TemplateLoader.
|
|
166
|
+
*/
|
|
167
|
+
function enrichRoleWithSpawnRules(
|
|
168
|
+
role: ResolvedRole,
|
|
169
|
+
manifest: OpenTeamsManifest
|
|
170
|
+
): ResolvedRole {
|
|
171
|
+
const spawnRules = manifest.topology.spawn_rules;
|
|
172
|
+
if (!spawnRules) return role;
|
|
173
|
+
|
|
174
|
+
const allowedSpawns = spawnRules[role.name];
|
|
175
|
+
if (!allowedSpawns || allowedSpawns.length === 0) return role;
|
|
176
|
+
|
|
177
|
+
const capabilities = [...role.capabilities];
|
|
178
|
+
for (const target of allowedSpawns) {
|
|
179
|
+
const cap = `agent.spawn.${target}`;
|
|
180
|
+
if (!capabilities.includes(cap)) {
|
|
181
|
+
capabilities.push(cap);
|
|
182
|
+
}
|
|
184
183
|
}
|
|
185
184
|
|
|
186
|
-
|
|
187
|
-
if (!topology.root || typeof topology.root !== "object") {
|
|
188
|
-
throw new TeamLoadError(
|
|
189
|
-
"Team topology requires a 'root' object",
|
|
190
|
-
"INVALID_MANIFEST",
|
|
191
|
-
teamName
|
|
192
|
-
);
|
|
193
|
-
}
|
|
185
|
+
return { ...role, capabilities };
|
|
194
186
|
}
|
|
195
187
|
|
|
196
188
|
// =============================================================================
|
|
197
|
-
//
|
|
189
|
+
// Build ResolvedTeamRole
|
|
198
190
|
// =============================================================================
|
|
199
191
|
|
|
200
192
|
/**
|
|
201
|
-
*
|
|
202
|
-
*
|
|
193
|
+
* Build a macro-agent ResolvedTeamRole from an openteams ResolvedRole.
|
|
194
|
+
* Enriches with enforcement-specific fields (workspace, lifecycle, tools, etc.)
|
|
195
|
+
* from the parent RoleDefinition and macro_agent overrides from role YAML.
|
|
203
196
|
*/
|
|
204
|
-
function
|
|
197
|
+
function buildResolvedTeamRole(
|
|
205
198
|
roleName: string,
|
|
206
|
-
|
|
207
|
-
roleRegistry: RoleRegistry
|
|
208
|
-
spawnRules: Record<string, string[]>
|
|
199
|
+
openteamsRole: ResolvedRole,
|
|
200
|
+
roleRegistry: RoleRegistry
|
|
209
201
|
): ResolvedTeamRole {
|
|
210
|
-
|
|
211
|
-
const roleFilePath = path.join(teamDir, ROLES_DIR, `${roleName}.yaml`);
|
|
212
|
-
let teamRoleDef: TeamRoleDefinition | null = null;
|
|
213
|
-
|
|
214
|
-
if (fs.existsSync(roleFilePath)) {
|
|
215
|
-
const raw = fs.readFileSync(roleFilePath, "utf-8");
|
|
216
|
-
try {
|
|
217
|
-
teamRoleDef = yaml.load(raw) as TeamRoleDefinition;
|
|
218
|
-
} catch (err) {
|
|
219
|
-
throw new TeamLoadError(
|
|
220
|
-
`Failed to parse role file ${roleFilePath}: ${err instanceof Error ? err.message : String(err)}`,
|
|
221
|
-
"INVALID_ROLE",
|
|
222
|
-
roleName
|
|
223
|
-
);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
202
|
+
const baseRoleName = openteamsRole.extends ?? roleName;
|
|
226
203
|
|
|
227
|
-
// Determine base role
|
|
228
|
-
const baseRoleName = teamRoleDef?.extends ?? roleName;
|
|
229
204
|
let parentRole: RoleDefinition;
|
|
230
205
|
try {
|
|
231
206
|
parentRole = roleRegistry.resolveRole(baseRoleName);
|
|
232
207
|
} catch {
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
208
|
+
// Fallback for roles without a registry parent
|
|
209
|
+
parentRole = {
|
|
210
|
+
name: baseRoleName,
|
|
211
|
+
displayName: baseRoleName,
|
|
212
|
+
description: `Role: ${baseRoleName}`,
|
|
213
|
+
capabilities: [],
|
|
214
|
+
} as RoleDefinition;
|
|
238
215
|
}
|
|
239
216
|
|
|
240
|
-
|
|
241
|
-
let capabilities
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
for (const cap of teamRoleDef.capabilities_remove ?? []) {
|
|
252
|
-
base.delete(cap as Capability);
|
|
253
|
-
}
|
|
254
|
-
capabilities = Array.from(base);
|
|
255
|
-
} else {
|
|
256
|
-
// Inherit parent capabilities
|
|
257
|
-
capabilities = [...parentRole.capabilities];
|
|
217
|
+
const macroAgent = openteamsRole.raw.macro_agent as TeamRoleMacroAgent | undefined;
|
|
218
|
+
let capabilities = openteamsRole.capabilities as Capability[];
|
|
219
|
+
|
|
220
|
+
// If the role YAML had no capability specification (no capabilities,
|
|
221
|
+
// capabilities_add, or capabilities_remove), openteams leaves capabilities
|
|
222
|
+
// empty. In that case, inherit all parent capabilities. Spawn-rule enrichment
|
|
223
|
+
// may have already added some caps, so merge with parent.
|
|
224
|
+
const hasExplicitCapabilitySpec = openteamsRole.raw.capabilities !== undefined;
|
|
225
|
+
if (!hasExplicitCapabilitySpec && parentRole.capabilities.length > 0) {
|
|
226
|
+
const merged = new Set<string>([...parentRole.capabilities, ...capabilities]);
|
|
227
|
+
capabilities = [...merged] as Capability[];
|
|
258
228
|
}
|
|
259
229
|
|
|
260
|
-
// Translate spawn_rules into capability additions (RD3)
|
|
261
|
-
const allowedSpawns = spawnRules[roleName];
|
|
262
|
-
if (allowedSpawns) {
|
|
263
|
-
for (const targetRole of allowedSpawns) {
|
|
264
|
-
const spawnCap = `agent.spawn.${targetRole}` as Capability;
|
|
265
|
-
if (!capabilities.includes(spawnCap)) {
|
|
266
|
-
capabilities.push(spawnCap);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// Build the resolved RoleDefinition for registry
|
|
272
230
|
const roleDefinition: RoleDefinition = {
|
|
273
231
|
name: roleName,
|
|
274
|
-
displayName:
|
|
275
|
-
description:
|
|
232
|
+
displayName: openteamsRole.displayName,
|
|
233
|
+
description: openteamsRole.description,
|
|
276
234
|
capabilities,
|
|
277
|
-
workspace:
|
|
235
|
+
workspace: macroAgent?.workspace
|
|
278
236
|
? {
|
|
279
|
-
type: (
|
|
280
|
-
branchPattern:
|
|
281
|
-
cleanupOnTerminate:
|
|
237
|
+
type: (macroAgent.workspace.type ?? "own") as "own" | "shared" | "mount" | "none",
|
|
238
|
+
branchPattern: macroAgent.workspace.branch_pattern,
|
|
239
|
+
cleanupOnTerminate: macroAgent.workspace.cleanup_on_terminate,
|
|
282
240
|
}
|
|
283
241
|
: parentRole.workspace,
|
|
284
|
-
lifecycle:
|
|
242
|
+
lifecycle: macroAgent?.lifecycle
|
|
285
243
|
? {
|
|
286
|
-
type: (
|
|
287
|
-
cascadeTerminate:
|
|
288
|
-
selfCleanup:
|
|
289
|
-
taskBound:
|
|
290
|
-
parentBound:
|
|
291
|
-
maxDurationMs:
|
|
244
|
+
type: (macroAgent.lifecycle.type ?? "ephemeral") as "ephemeral" | "persistent" | "daemon" | "event-driven",
|
|
245
|
+
cascadeTerminate: macroAgent.lifecycle.cascade_terminate,
|
|
246
|
+
selfCleanup: macroAgent.lifecycle.self_cleanup,
|
|
247
|
+
taskBound: macroAgent.lifecycle.task_bound,
|
|
248
|
+
parentBound: macroAgent.lifecycle.parent_bound,
|
|
249
|
+
maxDurationMs: macroAgent.lifecycle.max_duration_ms,
|
|
292
250
|
}
|
|
293
251
|
: parentRole.lifecycle,
|
|
294
252
|
tools: parentRole.tools,
|
|
295
253
|
protocol: parentRole.protocol,
|
|
296
254
|
permissions: parentRole.permissions,
|
|
297
|
-
extends:
|
|
255
|
+
extends: openteamsRole.extends,
|
|
298
256
|
systemPrompt: parentRole.systemPrompt,
|
|
299
257
|
};
|
|
300
258
|
|
|
@@ -302,69 +260,77 @@ function resolveTeamRole(
|
|
|
302
260
|
name: roleName,
|
|
303
261
|
baseRole: baseRoleName,
|
|
304
262
|
capabilities,
|
|
305
|
-
prompt:
|
|
263
|
+
prompt: openteamsRole.promptFile,
|
|
306
264
|
roleDefinition,
|
|
307
265
|
};
|
|
308
266
|
}
|
|
309
267
|
|
|
310
268
|
// =============================================================================
|
|
311
|
-
//
|
|
269
|
+
// Parse macro_agent extensions
|
|
312
270
|
// =============================================================================
|
|
313
271
|
|
|
314
272
|
/**
|
|
315
|
-
*
|
|
273
|
+
* Parse the opaque macro_agent field from the manifest into typed extensions.
|
|
316
274
|
*/
|
|
317
|
-
function
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
)
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
// From topology nodes
|
|
324
|
-
if (topology.root.prompt) refs.add(topology.root.prompt);
|
|
325
|
-
for (const companion of topology.companions ?? []) {
|
|
326
|
-
if (companion.prompt) refs.add(companion.prompt);
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
// From role definitions
|
|
330
|
-
for (const resolved of resolvedRoles.values()) {
|
|
331
|
-
if (resolved.prompt) refs.add(resolved.prompt);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
return refs;
|
|
275
|
+
function parseMacroAgentExtensions(
|
|
276
|
+
raw: Record<string, unknown> | undefined
|
|
277
|
+
): MacroAgentExtensions {
|
|
278
|
+
if (!raw) return {};
|
|
279
|
+
return raw as MacroAgentExtensions;
|
|
335
280
|
}
|
|
336
281
|
|
|
337
282
|
// =============================================================================
|
|
338
|
-
//
|
|
283
|
+
// Error Mapping
|
|
339
284
|
// =============================================================================
|
|
340
285
|
|
|
341
286
|
/**
|
|
342
|
-
*
|
|
343
|
-
* Returns a map of role name → MCP server entries.
|
|
287
|
+
* Map openteams loader errors to macro-agent TeamLoadError for backward compat.
|
|
344
288
|
*/
|
|
345
|
-
function
|
|
289
|
+
function mapToTeamLoadError(
|
|
290
|
+
err: unknown,
|
|
291
|
+
teamName: string,
|
|
346
292
|
teamDir: string
|
|
347
|
-
):
|
|
348
|
-
const
|
|
349
|
-
|
|
293
|
+
): TeamLoadError {
|
|
294
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
295
|
+
|
|
296
|
+
if (message.includes("not found") || message.includes("not exist")) {
|
|
297
|
+
return new TeamLoadError(
|
|
298
|
+
`Team directory or manifest not found: ${teamDir}`,
|
|
299
|
+
"MANIFEST_NOT_FOUND",
|
|
300
|
+
teamName
|
|
301
|
+
);
|
|
302
|
+
}
|
|
350
303
|
|
|
351
|
-
if (
|
|
352
|
-
return
|
|
304
|
+
if (message.includes("parse") || message.includes("YAML")) {
|
|
305
|
+
return new TeamLoadError(
|
|
306
|
+
`Failed to parse team manifest: ${message}`,
|
|
307
|
+
"INVALID_MANIFEST",
|
|
308
|
+
teamName
|
|
309
|
+
);
|
|
353
310
|
}
|
|
354
311
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
312
|
+
if (message.includes("role") && message.includes("not in")) {
|
|
313
|
+
return new TeamLoadError(
|
|
314
|
+
message,
|
|
315
|
+
"INVALID_MANIFEST",
|
|
316
|
+
teamName
|
|
317
|
+
);
|
|
318
|
+
}
|
|
360
319
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
320
|
+
if (message.includes("Circular")) {
|
|
321
|
+
return new TeamLoadError(
|
|
322
|
+
message,
|
|
323
|
+
"INVALID_ROLE",
|
|
324
|
+
teamName
|
|
325
|
+
);
|
|
365
326
|
}
|
|
366
327
|
|
|
367
|
-
|
|
328
|
+
// Default: treat as invalid manifest
|
|
329
|
+
return new TeamLoadError(
|
|
330
|
+
`Failed to load team '${teamName}': ${message}`,
|
|
331
|
+
"INVALID_MANIFEST",
|
|
332
|
+
teamName
|
|
333
|
+
);
|
|
368
334
|
}
|
|
369
335
|
|
|
370
336
|
// =============================================================================
|
|
@@ -375,7 +341,7 @@ function loadMcpServers(
|
|
|
375
341
|
* Validate communication topology references.
|
|
376
342
|
*/
|
|
377
343
|
function validateCommunication(
|
|
378
|
-
communication:
|
|
344
|
+
communication: CommunicationConfig,
|
|
379
345
|
roleNames: string[],
|
|
380
346
|
teamName: string
|
|
381
347
|
): void {
|