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
|
@@ -0,0 +1,839 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stream/Checkpoint/DiffStack/MergeQueue Extension Methods (_macro/streams/*, _macro/checkpoints/*, etc.)
|
|
3
|
+
*
|
|
4
|
+
* Exposes macro-agent's git-cascade stream, checkpoint, diff stack, and merge queue
|
|
5
|
+
* features to external MAP clients (e.g., the OpenSwarm TUI).
|
|
6
|
+
*
|
|
7
|
+
* Methods:
|
|
8
|
+
* - _macro/streams/list - List streams with optional filters
|
|
9
|
+
* - _macro/streams/get - Get stream details with optional children
|
|
10
|
+
* - _macro/streams/hierarchy - Get stream tree structure
|
|
11
|
+
* - _macro/streams/createPR - Create PR for entire stream branch
|
|
12
|
+
* - _macro/checkpoints/list - List checkpoints for a stream
|
|
13
|
+
* - _macro/checkpoints/get - Get checkpoint details
|
|
14
|
+
* - _macro/checkpoints/select - Fork stream from a checkpoint
|
|
15
|
+
* - _macro/diffStacks/list - List diff stacks
|
|
16
|
+
* - _macro/diffStacks/get - Get diff stack with checkpoints
|
|
17
|
+
* - _macro/diffStacks/create - Create diff stack from checkpoints
|
|
18
|
+
* - _macro/diffStacks/createPR - Create PR from diff stack
|
|
19
|
+
* - _macro/mergeQueue/status - Get merge queue status
|
|
20
|
+
* - _macro/mergeQueue/get - Get merge request details
|
|
21
|
+
*
|
|
22
|
+
* @see specs/s-2b92_stream_checkpoint_merge_queue_tui_integration.md
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import type { MAPAdapter, ExtensionHandler, ExtensionContext } from "../interface.js";
|
|
26
|
+
import type { EventNotification } from "../types.js";
|
|
27
|
+
import type {
|
|
28
|
+
Stream,
|
|
29
|
+
StreamStatus,
|
|
30
|
+
StreamNode,
|
|
31
|
+
Checkpoint,
|
|
32
|
+
DiffStack,
|
|
33
|
+
DiffStackWithCheckpoints,
|
|
34
|
+
DiffStackReviewStatus,
|
|
35
|
+
} from "git-cascade";
|
|
36
|
+
import type { MergeRequest } from "../../../workspace/merge-queue/types.js";
|
|
37
|
+
import { RPCError } from "../rpc-handler.js";
|
|
38
|
+
import { ulid } from "ulid";
|
|
39
|
+
|
|
40
|
+
/** Event emitter function type */
|
|
41
|
+
type EmitEvent = (event: EventNotification) => void;
|
|
42
|
+
|
|
43
|
+
// =============================================================================
|
|
44
|
+
// Error Codes
|
|
45
|
+
// =============================================================================
|
|
46
|
+
|
|
47
|
+
const STREAM_NOT_FOUND = -32040;
|
|
48
|
+
const CHECKPOINT_NOT_FOUND = -32041;
|
|
49
|
+
const DIFF_STACK_NOT_FOUND = -32042;
|
|
50
|
+
const MERGE_REQUEST_NOT_FOUND = -32043;
|
|
51
|
+
|
|
52
|
+
// =============================================================================
|
|
53
|
+
// Request Types
|
|
54
|
+
// =============================================================================
|
|
55
|
+
|
|
56
|
+
interface StreamListParams {
|
|
57
|
+
filter?: {
|
|
58
|
+
status?: string;
|
|
59
|
+
agentId?: string;
|
|
60
|
+
parentStream?: string;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
interface StreamGetParams {
|
|
65
|
+
streamId: string;
|
|
66
|
+
includeChildren?: boolean;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
interface StreamHierarchyParams {
|
|
70
|
+
streamId?: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
interface StreamCreatePRParams {
|
|
74
|
+
streamId: string;
|
|
75
|
+
title?: string;
|
|
76
|
+
body?: string;
|
|
77
|
+
draft?: boolean;
|
|
78
|
+
targetBranch?: string;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
interface CheckpointListParams {
|
|
82
|
+
streamId: string;
|
|
83
|
+
limit?: number;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
interface CheckpointGetParams {
|
|
87
|
+
checkpointId: string;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
interface CheckpointSelectParams {
|
|
91
|
+
streamId: string;
|
|
92
|
+
checkpointId: string;
|
|
93
|
+
name?: string;
|
|
94
|
+
agentId?: string;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
interface DiffStackListParams {
|
|
98
|
+
streamId?: string;
|
|
99
|
+
reviewStatus?: string;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
interface DiffStackGetParams {
|
|
103
|
+
diffStackId: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
interface DiffStackCreateParams {
|
|
107
|
+
name: string;
|
|
108
|
+
streamId: string;
|
|
109
|
+
checkpointIds: string[];
|
|
110
|
+
targetBranch: string;
|
|
111
|
+
description?: string;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
interface DiffStackCreatePRParams {
|
|
115
|
+
diffStackId: string;
|
|
116
|
+
title?: string;
|
|
117
|
+
body?: string;
|
|
118
|
+
draft?: boolean;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
interface MergeQueueStatusParams {
|
|
122
|
+
streamId?: string;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
interface MergeQueueGetParams {
|
|
126
|
+
requestId: string;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// =============================================================================
|
|
130
|
+
// Response Types
|
|
131
|
+
// =============================================================================
|
|
132
|
+
|
|
133
|
+
interface StreamInfo {
|
|
134
|
+
id: string;
|
|
135
|
+
name: string;
|
|
136
|
+
agentId: string;
|
|
137
|
+
status: string;
|
|
138
|
+
parentStream: string | null;
|
|
139
|
+
baseCommit: string;
|
|
140
|
+
branchName: string;
|
|
141
|
+
checkpointCount: number;
|
|
142
|
+
latestCheckpoint?: string;
|
|
143
|
+
createdAt: number;
|
|
144
|
+
updatedAt: number;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
interface StreamNodeInfo {
|
|
148
|
+
stream: StreamInfo;
|
|
149
|
+
children: StreamNodeInfo[];
|
|
150
|
+
taskCount: number;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
interface CheckpointInfo {
|
|
154
|
+
id: string;
|
|
155
|
+
streamId: string;
|
|
156
|
+
commitSha: string;
|
|
157
|
+
commitShaShort: string;
|
|
158
|
+
parentCommit: string | null;
|
|
159
|
+
changeId: string | null;
|
|
160
|
+
message: string | null;
|
|
161
|
+
createdAt: number;
|
|
162
|
+
createdBy: string | null;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
interface DiffStackInfo {
|
|
166
|
+
id: string;
|
|
167
|
+
name: string | null;
|
|
168
|
+
description: string | null;
|
|
169
|
+
targetBranch: string;
|
|
170
|
+
reviewStatus: string;
|
|
171
|
+
queuePosition: number | null;
|
|
172
|
+
checkpointCount?: number;
|
|
173
|
+
createdAt: number;
|
|
174
|
+
createdBy: string | null;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
interface MergeRequestInfo {
|
|
178
|
+
id: string;
|
|
179
|
+
streamId: string;
|
|
180
|
+
taskId: string;
|
|
181
|
+
workerBranch: string;
|
|
182
|
+
workerAgentId: string;
|
|
183
|
+
status: string;
|
|
184
|
+
priority: number;
|
|
185
|
+
position: number;
|
|
186
|
+
submittedAt: number;
|
|
187
|
+
startedAt?: number;
|
|
188
|
+
completedAt?: number;
|
|
189
|
+
mergeCommit?: string;
|
|
190
|
+
conflictFiles?: string[];
|
|
191
|
+
resolverTaskId?: string;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
interface PRResult {
|
|
195
|
+
prUrl: string;
|
|
196
|
+
prNumber: number;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// =============================================================================
|
|
200
|
+
// Extension Services
|
|
201
|
+
// =============================================================================
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Services required for stream/checkpoint/diffStack/mergeQueue extensions.
|
|
205
|
+
*
|
|
206
|
+
* The combined-server.ts binds these to DataplaneAdapter and git-cascade operations.
|
|
207
|
+
*/
|
|
208
|
+
export interface StreamExtensionServices {
|
|
209
|
+
// Stream operations (DataplaneAdapter methods)
|
|
210
|
+
getStream: (streamId: string) => Stream | null;
|
|
211
|
+
listStreams: (options?: { agentId?: string; status?: StreamStatus }) => Stream[];
|
|
212
|
+
getStreamBranchName: (streamId: string) => string;
|
|
213
|
+
getStreamHierarchy: (rootStreamId?: string) => StreamNode | StreamNode[];
|
|
214
|
+
|
|
215
|
+
// Checkpoint operations (git-cascade checkpoints module)
|
|
216
|
+
getCheckpoint: (checkpointId: string) => Checkpoint | null;
|
|
217
|
+
getCheckpointsForStream: (streamId: string) => Checkpoint[];
|
|
218
|
+
|
|
219
|
+
// Checkpoint selection (git-cascade streams.forkFromCheckpoint)
|
|
220
|
+
forkFromCheckpoint: (options: {
|
|
221
|
+
checkpointId: string;
|
|
222
|
+
name?: string;
|
|
223
|
+
agentId: string;
|
|
224
|
+
}) => string;
|
|
225
|
+
|
|
226
|
+
// DiffStack operations (git-cascade diffStacks module)
|
|
227
|
+
getDiffStack: (diffStackId: string) => DiffStack | null;
|
|
228
|
+
getDiffStackWithCheckpoints: (diffStackId: string) => DiffStackWithCheckpoints | null;
|
|
229
|
+
listDiffStacks: (options?: { reviewStatus?: DiffStackReviewStatus; targetBranch?: string }) => DiffStack[];
|
|
230
|
+
createDiffStack: (options: { name?: string; targetBranch?: string; description?: string; createdBy?: string }) => DiffStack;
|
|
231
|
+
addCheckpointToStack: (options: { stackId: string; checkpointId: string; position?: number }) => void;
|
|
232
|
+
|
|
233
|
+
// Merge queue operations (read-only)
|
|
234
|
+
getMergeQueueRequests: (streamId?: string) => MergeRequest[];
|
|
235
|
+
getMergeQueueDepth: (streamId?: string) => number;
|
|
236
|
+
getMergeRequest: (requestId: string) => MergeRequest | null;
|
|
237
|
+
|
|
238
|
+
// PR creation
|
|
239
|
+
createPR: (options: {
|
|
240
|
+
branch: string;
|
|
241
|
+
targetBranch: string;
|
|
242
|
+
title: string;
|
|
243
|
+
body?: string;
|
|
244
|
+
draft?: boolean;
|
|
245
|
+
}) => Promise<PRResult>;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// =============================================================================
|
|
249
|
+
// Conversion Helpers
|
|
250
|
+
// =============================================================================
|
|
251
|
+
|
|
252
|
+
function streamToInfo(
|
|
253
|
+
stream: Stream,
|
|
254
|
+
branchName: string,
|
|
255
|
+
checkpointCount: number,
|
|
256
|
+
latestCheckpoint?: string,
|
|
257
|
+
): StreamInfo {
|
|
258
|
+
return {
|
|
259
|
+
id: stream.id,
|
|
260
|
+
name: stream.name,
|
|
261
|
+
agentId: stream.agentId,
|
|
262
|
+
status: stream.status,
|
|
263
|
+
parentStream: stream.parentStream,
|
|
264
|
+
baseCommit: stream.baseCommit,
|
|
265
|
+
branchName,
|
|
266
|
+
checkpointCount,
|
|
267
|
+
latestCheckpoint,
|
|
268
|
+
createdAt: stream.createdAt,
|
|
269
|
+
updatedAt: stream.updatedAt,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
function streamNodeToInfo(
|
|
274
|
+
node: StreamNode,
|
|
275
|
+
services: StreamExtensionServices,
|
|
276
|
+
): StreamNodeInfo {
|
|
277
|
+
const checkpoints = services.getCheckpointsForStream(node.stream.id);
|
|
278
|
+
const latestCp = checkpoints.length > 0 ? checkpoints[checkpoints.length - 1] : undefined;
|
|
279
|
+
let branchName: string;
|
|
280
|
+
try {
|
|
281
|
+
branchName = services.getStreamBranchName(node.stream.id);
|
|
282
|
+
} catch {
|
|
283
|
+
branchName = `stream/${node.stream.id}`;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
return {
|
|
287
|
+
stream: streamToInfo(
|
|
288
|
+
node.stream,
|
|
289
|
+
branchName,
|
|
290
|
+
checkpoints.length,
|
|
291
|
+
latestCp?.commitSha?.slice(0, 8),
|
|
292
|
+
),
|
|
293
|
+
children: node.children.map((child) => streamNodeToInfo(child, services)),
|
|
294
|
+
taskCount: node.tasks.length,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function checkpointToInfo(cp: Checkpoint): CheckpointInfo {
|
|
299
|
+
return {
|
|
300
|
+
id: cp.id,
|
|
301
|
+
streamId: cp.streamId,
|
|
302
|
+
commitSha: cp.commitSha,
|
|
303
|
+
commitShaShort: cp.commitSha.slice(0, 8),
|
|
304
|
+
parentCommit: cp.parentCommit,
|
|
305
|
+
changeId: cp.changeId,
|
|
306
|
+
message: cp.message,
|
|
307
|
+
createdAt: cp.createdAt,
|
|
308
|
+
createdBy: cp.createdBy,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
function diffStackToInfo(ds: DiffStack, checkpointCount?: number): DiffStackInfo {
|
|
313
|
+
return {
|
|
314
|
+
id: ds.id,
|
|
315
|
+
name: ds.name,
|
|
316
|
+
description: ds.description,
|
|
317
|
+
targetBranch: ds.targetBranch,
|
|
318
|
+
reviewStatus: ds.reviewStatus,
|
|
319
|
+
queuePosition: ds.queuePosition,
|
|
320
|
+
checkpointCount,
|
|
321
|
+
createdAt: ds.createdAt,
|
|
322
|
+
createdBy: ds.createdBy,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
function mergeRequestToInfo(mr: MergeRequest): MergeRequestInfo {
|
|
327
|
+
return {
|
|
328
|
+
id: mr.id,
|
|
329
|
+
streamId: mr.streamId,
|
|
330
|
+
taskId: mr.taskId,
|
|
331
|
+
workerBranch: mr.workerBranch,
|
|
332
|
+
workerAgentId: mr.workerAgentId,
|
|
333
|
+
status: mr.status,
|
|
334
|
+
priority: mr.priority,
|
|
335
|
+
position: mr.position ?? 0,
|
|
336
|
+
submittedAt: mr.submittedAt,
|
|
337
|
+
startedAt: mr.startedAt ?? undefined,
|
|
338
|
+
completedAt: mr.completedAt ?? undefined,
|
|
339
|
+
mergeCommit: mr.mergeCommit ?? undefined,
|
|
340
|
+
conflictFiles: mr.conflictFiles ?? undefined,
|
|
341
|
+
resolverTaskId: mr.resolverTaskId ?? undefined,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// =============================================================================
|
|
346
|
+
// Stream Handlers
|
|
347
|
+
// =============================================================================
|
|
348
|
+
|
|
349
|
+
function createStreamListHandler(services: StreamExtensionServices): ExtensionHandler {
|
|
350
|
+
return async (_context: ExtensionContext, params: unknown) => {
|
|
351
|
+
const { filter } = (params ?? {}) as StreamListParams;
|
|
352
|
+
|
|
353
|
+
const streams = services.listStreams(
|
|
354
|
+
filter
|
|
355
|
+
? {
|
|
356
|
+
agentId: filter.agentId,
|
|
357
|
+
status: filter.status as StreamStatus | undefined,
|
|
358
|
+
}
|
|
359
|
+
: undefined,
|
|
360
|
+
);
|
|
361
|
+
|
|
362
|
+
const results: StreamInfo[] = streams.map((stream) => {
|
|
363
|
+
const checkpoints = services.getCheckpointsForStream(stream.id);
|
|
364
|
+
const latestCp = checkpoints.length > 0 ? checkpoints[checkpoints.length - 1] : undefined;
|
|
365
|
+
let branchName: string;
|
|
366
|
+
try {
|
|
367
|
+
branchName = services.getStreamBranchName(stream.id);
|
|
368
|
+
} catch {
|
|
369
|
+
branchName = `stream/${stream.id}`;
|
|
370
|
+
}
|
|
371
|
+
return streamToInfo(stream, branchName, checkpoints.length, latestCp?.commitSha?.slice(0, 8));
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
// Optional parentStream filter (not in git-cascade's listStreams options)
|
|
375
|
+
const filtered = filter?.parentStream
|
|
376
|
+
? results.filter((s) => s.parentStream === filter.parentStream)
|
|
377
|
+
: results;
|
|
378
|
+
|
|
379
|
+
return { streams: filtered };
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
function createStreamGetHandler(services: StreamExtensionServices): ExtensionHandler {
|
|
384
|
+
return async (_context: ExtensionContext, params: unknown) => {
|
|
385
|
+
const { streamId, includeChildren } = params as StreamGetParams;
|
|
386
|
+
|
|
387
|
+
if (!streamId) {
|
|
388
|
+
throw RPCError.invalidParams("streamId is required");
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
const stream = services.getStream(streamId);
|
|
392
|
+
if (!stream) {
|
|
393
|
+
throw new RPCError(STREAM_NOT_FOUND, `Stream not found: ${streamId}`);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
const checkpoints = services.getCheckpointsForStream(streamId);
|
|
397
|
+
const latestCp = checkpoints.length > 0 ? checkpoints[checkpoints.length - 1] : undefined;
|
|
398
|
+
let branchName: string;
|
|
399
|
+
try {
|
|
400
|
+
branchName = services.getStreamBranchName(streamId);
|
|
401
|
+
} catch {
|
|
402
|
+
branchName = `stream/${streamId}`;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
const result: Record<string, unknown> = {
|
|
406
|
+
stream: streamToInfo(stream, branchName, checkpoints.length, latestCp?.commitSha?.slice(0, 8)),
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
if (includeChildren) {
|
|
410
|
+
const hierarchy = services.getStreamHierarchy(streamId);
|
|
411
|
+
const node = Array.isArray(hierarchy) ? hierarchy[0] : hierarchy;
|
|
412
|
+
if (node) {
|
|
413
|
+
result.children = node.children.map((child) => {
|
|
414
|
+
const childCps = services.getCheckpointsForStream(child.stream.id);
|
|
415
|
+
const childLatest = childCps.length > 0 ? childCps[childCps.length - 1] : undefined;
|
|
416
|
+
let childBranch: string;
|
|
417
|
+
try {
|
|
418
|
+
childBranch = services.getStreamBranchName(child.stream.id);
|
|
419
|
+
} catch {
|
|
420
|
+
childBranch = `stream/${child.stream.id}`;
|
|
421
|
+
}
|
|
422
|
+
return streamToInfo(child.stream, childBranch, childCps.length, childLatest?.commitSha?.slice(0, 8));
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
return result;
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
function createStreamHierarchyHandler(services: StreamExtensionServices): ExtensionHandler {
|
|
432
|
+
return async (_context: ExtensionContext, params: unknown) => {
|
|
433
|
+
const { streamId } = (params ?? {}) as StreamHierarchyParams;
|
|
434
|
+
|
|
435
|
+
const hierarchy = services.getStreamHierarchy(streamId);
|
|
436
|
+
const nodes = Array.isArray(hierarchy) ? hierarchy : [hierarchy];
|
|
437
|
+
|
|
438
|
+
return {
|
|
439
|
+
roots: nodes.map((node) => streamNodeToInfo(node, services)),
|
|
440
|
+
};
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
function createStreamCreatePRHandler(services: StreamExtensionServices, emit: EmitEvent): ExtensionHandler {
|
|
445
|
+
return async (_context: ExtensionContext, params: unknown) => {
|
|
446
|
+
const { streamId, title, body, draft, targetBranch } = params as StreamCreatePRParams;
|
|
447
|
+
|
|
448
|
+
if (!streamId) {
|
|
449
|
+
throw RPCError.invalidParams("streamId is required");
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
const stream = services.getStream(streamId);
|
|
453
|
+
if (!stream) {
|
|
454
|
+
throw new RPCError(STREAM_NOT_FOUND, `Stream not found: ${streamId}`);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
let branchName: string;
|
|
458
|
+
try {
|
|
459
|
+
branchName = services.getStreamBranchName(streamId);
|
|
460
|
+
} catch {
|
|
461
|
+
branchName = `stream/${streamId}`;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
const result = await services.createPR({
|
|
465
|
+
branch: branchName,
|
|
466
|
+
targetBranch: targetBranch ?? "main",
|
|
467
|
+
title: title ?? `Merge stream: ${stream.name}`,
|
|
468
|
+
body,
|
|
469
|
+
draft,
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
emit({
|
|
473
|
+
eventId: ulid(),
|
|
474
|
+
type: "stream.updated",
|
|
475
|
+
timestamp: Date.now(),
|
|
476
|
+
data: { streamId, action: "pr_created", result },
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
return result;
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// =============================================================================
|
|
484
|
+
// Checkpoint Handlers
|
|
485
|
+
// =============================================================================
|
|
486
|
+
|
|
487
|
+
function createCheckpointListHandler(services: StreamExtensionServices): ExtensionHandler {
|
|
488
|
+
return async (_context: ExtensionContext, params: unknown) => {
|
|
489
|
+
const { streamId, limit } = params as CheckpointListParams;
|
|
490
|
+
|
|
491
|
+
if (!streamId) {
|
|
492
|
+
throw RPCError.invalidParams("streamId is required");
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
const stream = services.getStream(streamId);
|
|
496
|
+
if (!stream) {
|
|
497
|
+
throw new RPCError(STREAM_NOT_FOUND, `Stream not found: ${streamId}`);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
let checkpoints = services.getCheckpointsForStream(streamId);
|
|
501
|
+
|
|
502
|
+
if (limit && limit > 0) {
|
|
503
|
+
checkpoints = checkpoints.slice(-limit);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
return { checkpoints: checkpoints.map(checkpointToInfo) };
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
function createCheckpointGetHandler(services: StreamExtensionServices): ExtensionHandler {
|
|
511
|
+
return async (_context: ExtensionContext, params: unknown) => {
|
|
512
|
+
const { checkpointId } = params as CheckpointGetParams;
|
|
513
|
+
|
|
514
|
+
if (!checkpointId) {
|
|
515
|
+
throw RPCError.invalidParams("checkpointId is required");
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
const checkpoint = services.getCheckpoint(checkpointId);
|
|
519
|
+
if (!checkpoint) {
|
|
520
|
+
throw new RPCError(CHECKPOINT_NOT_FOUND, `Checkpoint not found: ${checkpointId}`);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
return { checkpoint: checkpointToInfo(checkpoint) };
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
function createCheckpointSelectHandler(services: StreamExtensionServices, emit: EmitEvent): ExtensionHandler {
|
|
528
|
+
return async (context: ExtensionContext, params: unknown) => {
|
|
529
|
+
const { streamId, checkpointId, name, agentId } = params as CheckpointSelectParams;
|
|
530
|
+
|
|
531
|
+
if (!streamId) {
|
|
532
|
+
throw RPCError.invalidParams("streamId is required");
|
|
533
|
+
}
|
|
534
|
+
if (!checkpointId) {
|
|
535
|
+
throw RPCError.invalidParams("checkpointId is required");
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
// Verify stream exists
|
|
539
|
+
const stream = services.getStream(streamId);
|
|
540
|
+
if (!stream) {
|
|
541
|
+
throw new RPCError(STREAM_NOT_FOUND, `Stream not found: ${streamId}`);
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
// Verify checkpoint exists and belongs to stream
|
|
545
|
+
const checkpoint = services.getCheckpoint(checkpointId);
|
|
546
|
+
if (!checkpoint) {
|
|
547
|
+
throw new RPCError(CHECKPOINT_NOT_FOUND, `Checkpoint not found: ${checkpointId}`);
|
|
548
|
+
}
|
|
549
|
+
if (checkpoint.streamId !== streamId) {
|
|
550
|
+
throw RPCError.invalidParams(
|
|
551
|
+
`Checkpoint ${checkpointId} does not belong to stream ${streamId}`,
|
|
552
|
+
);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
const forkAgentId = agentId ?? `external:${context.participantId}`;
|
|
556
|
+
|
|
557
|
+
const newStreamId = services.forkFromCheckpoint({
|
|
558
|
+
checkpointId,
|
|
559
|
+
name: name ?? `fork-from-${checkpointId.slice(0, 8)}`,
|
|
560
|
+
agentId: forkAgentId,
|
|
561
|
+
});
|
|
562
|
+
|
|
563
|
+
emit({
|
|
564
|
+
eventId: ulid(),
|
|
565
|
+
type: "stream.updated",
|
|
566
|
+
timestamp: Date.now(),
|
|
567
|
+
data: { streamId, newStreamId, action: "forked", checkpointId },
|
|
568
|
+
});
|
|
569
|
+
|
|
570
|
+
return {
|
|
571
|
+
success: true,
|
|
572
|
+
newStreamId,
|
|
573
|
+
commitSha: checkpoint.commitSha,
|
|
574
|
+
};
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
// =============================================================================
|
|
579
|
+
// DiffStack Handlers
|
|
580
|
+
// =============================================================================
|
|
581
|
+
|
|
582
|
+
function createDiffStackListHandler(services: StreamExtensionServices): ExtensionHandler {
|
|
583
|
+
return async (_context: ExtensionContext, params: unknown) => {
|
|
584
|
+
const { streamId, reviewStatus } = (params ?? {}) as DiffStackListParams;
|
|
585
|
+
|
|
586
|
+
let stacks = services.listDiffStacks({
|
|
587
|
+
reviewStatus: reviewStatus as DiffStackReviewStatus | undefined,
|
|
588
|
+
});
|
|
589
|
+
|
|
590
|
+
// Filter by streamId if provided (need to check checkpoints in each stack)
|
|
591
|
+
if (streamId) {
|
|
592
|
+
const streamCheckpoints = new Set(
|
|
593
|
+
services.getCheckpointsForStream(streamId).map((cp) => cp.id),
|
|
594
|
+
);
|
|
595
|
+
stacks = stacks.filter((stack) => {
|
|
596
|
+
const withCps = services.getDiffStackWithCheckpoints(stack.id);
|
|
597
|
+
if (!withCps) return false;
|
|
598
|
+
return withCps.checkpoints.some((cp) => streamCheckpoints.has(cp.id));
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
const results = stacks.map((stack) => {
|
|
603
|
+
const withCps = services.getDiffStackWithCheckpoints(stack.id);
|
|
604
|
+
return diffStackToInfo(stack, withCps?.checkpoints.length ?? 0);
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
return { diffStacks: results };
|
|
608
|
+
};
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
function createDiffStackGetHandler(services: StreamExtensionServices): ExtensionHandler {
|
|
612
|
+
return async (_context: ExtensionContext, params: unknown) => {
|
|
613
|
+
const { diffStackId } = params as DiffStackGetParams;
|
|
614
|
+
|
|
615
|
+
if (!diffStackId) {
|
|
616
|
+
throw RPCError.invalidParams("diffStackId is required");
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
const withCheckpoints = services.getDiffStackWithCheckpoints(diffStackId);
|
|
620
|
+
if (!withCheckpoints) {
|
|
621
|
+
throw new RPCError(DIFF_STACK_NOT_FOUND, `DiffStack not found: ${diffStackId}`);
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
return {
|
|
625
|
+
diffStack: diffStackToInfo(withCheckpoints, withCheckpoints.checkpoints.length),
|
|
626
|
+
checkpoints: withCheckpoints.checkpoints.map(checkpointToInfo),
|
|
627
|
+
};
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
function createDiffStackCreateHandler(services: StreamExtensionServices, emit: EmitEvent): ExtensionHandler {
|
|
632
|
+
return async (context: ExtensionContext, params: unknown) => {
|
|
633
|
+
const { name, streamId, checkpointIds, targetBranch, description } =
|
|
634
|
+
params as DiffStackCreateParams;
|
|
635
|
+
|
|
636
|
+
if (!name) {
|
|
637
|
+
throw RPCError.invalidParams("name is required");
|
|
638
|
+
}
|
|
639
|
+
if (!checkpointIds || checkpointIds.length === 0) {
|
|
640
|
+
throw RPCError.invalidParams("checkpointIds is required and must not be empty");
|
|
641
|
+
}
|
|
642
|
+
if (!targetBranch) {
|
|
643
|
+
throw RPCError.invalidParams("targetBranch is required");
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
// Verify all checkpoints exist
|
|
647
|
+
for (const cpId of checkpointIds) {
|
|
648
|
+
const cp = services.getCheckpoint(cpId);
|
|
649
|
+
if (!cp) {
|
|
650
|
+
throw new RPCError(CHECKPOINT_NOT_FOUND, `Checkpoint not found: ${cpId}`);
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
const createdBy = `external:${context.participantId}`;
|
|
655
|
+
|
|
656
|
+
// Create the stack
|
|
657
|
+
const stack = services.createDiffStack({
|
|
658
|
+
name,
|
|
659
|
+
targetBranch,
|
|
660
|
+
description,
|
|
661
|
+
createdBy,
|
|
662
|
+
});
|
|
663
|
+
|
|
664
|
+
// Add checkpoints to the stack
|
|
665
|
+
for (let i = 0; i < checkpointIds.length; i++) {
|
|
666
|
+
services.addCheckpointToStack({
|
|
667
|
+
stackId: stack.id,
|
|
668
|
+
checkpointId: checkpointIds[i],
|
|
669
|
+
position: i,
|
|
670
|
+
});
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
// Return the stack with checkpoints
|
|
674
|
+
const withCps = services.getDiffStackWithCheckpoints(stack.id);
|
|
675
|
+
|
|
676
|
+
emit({
|
|
677
|
+
eventId: ulid(),
|
|
678
|
+
type: "diffstack.created",
|
|
679
|
+
timestamp: Date.now(),
|
|
680
|
+
data: { diffStackId: stack.id, name, checkpointCount: checkpointIds.length },
|
|
681
|
+
});
|
|
682
|
+
|
|
683
|
+
return {
|
|
684
|
+
diffStack: diffStackToInfo(stack, withCps?.checkpoints.length ?? checkpointIds.length),
|
|
685
|
+
};
|
|
686
|
+
};
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
function createDiffStackCreatePRHandler(services: StreamExtensionServices, emit: EmitEvent): ExtensionHandler {
|
|
690
|
+
return async (_context: ExtensionContext, params: unknown) => {
|
|
691
|
+
const { diffStackId, title, body, draft } = params as DiffStackCreatePRParams;
|
|
692
|
+
|
|
693
|
+
if (!diffStackId) {
|
|
694
|
+
throw RPCError.invalidParams("diffStackId is required");
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
const withCheckpoints = services.getDiffStackWithCheckpoints(diffStackId);
|
|
698
|
+
if (!withCheckpoints) {
|
|
699
|
+
throw new RPCError(DIFF_STACK_NOT_FOUND, `DiffStack not found: ${diffStackId}`);
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
if (withCheckpoints.checkpoints.length === 0) {
|
|
703
|
+
throw RPCError.invalidParams("DiffStack has no checkpoints");
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
// Determine branch name from the first checkpoint's stream
|
|
707
|
+
const firstCp = withCheckpoints.checkpoints[0];
|
|
708
|
+
let branchName: string;
|
|
709
|
+
try {
|
|
710
|
+
branchName = services.getStreamBranchName(firstCp.streamId);
|
|
711
|
+
} catch {
|
|
712
|
+
branchName = `stream/${firstCp.streamId}`;
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
const result = await services.createPR({
|
|
716
|
+
branch: branchName,
|
|
717
|
+
targetBranch: withCheckpoints.targetBranch,
|
|
718
|
+
title: title ?? `PR: ${withCheckpoints.name ?? diffStackId}`,
|
|
719
|
+
body,
|
|
720
|
+
draft,
|
|
721
|
+
});
|
|
722
|
+
|
|
723
|
+
emit({
|
|
724
|
+
eventId: ulid(),
|
|
725
|
+
type: "diffstack.updated",
|
|
726
|
+
timestamp: Date.now(),
|
|
727
|
+
data: { diffStackId, action: "pr_created", result },
|
|
728
|
+
});
|
|
729
|
+
|
|
730
|
+
return result;
|
|
731
|
+
};
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
// =============================================================================
|
|
735
|
+
// MergeQueue Handlers
|
|
736
|
+
// =============================================================================
|
|
737
|
+
|
|
738
|
+
function createMergeQueueStatusHandler(services: StreamExtensionServices): ExtensionHandler {
|
|
739
|
+
return async (_context: ExtensionContext, params: unknown) => {
|
|
740
|
+
const { streamId } = (params ?? {}) as MergeQueueStatusParams;
|
|
741
|
+
|
|
742
|
+
const requests = services.getMergeQueueRequests(streamId);
|
|
743
|
+
const queueDepth = services.getMergeQueueDepth(streamId);
|
|
744
|
+
|
|
745
|
+
return {
|
|
746
|
+
requests: requests.map(mergeRequestToInfo),
|
|
747
|
+
queueDepth,
|
|
748
|
+
};
|
|
749
|
+
};
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
function createMergeQueueGetHandler(services: StreamExtensionServices): ExtensionHandler {
|
|
753
|
+
return async (_context: ExtensionContext, params: unknown) => {
|
|
754
|
+
const { requestId } = params as MergeQueueGetParams;
|
|
755
|
+
|
|
756
|
+
if (!requestId) {
|
|
757
|
+
throw RPCError.invalidParams("requestId is required");
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
const request = services.getMergeRequest(requestId);
|
|
761
|
+
if (!request) {
|
|
762
|
+
throw new RPCError(MERGE_REQUEST_NOT_FOUND, `Merge request not found: ${requestId}`);
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
return { request: mergeRequestToInfo(request) };
|
|
766
|
+
};
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
// =============================================================================
|
|
770
|
+
// Registration
|
|
771
|
+
// =============================================================================
|
|
772
|
+
|
|
773
|
+
/** All stream-related extension method names */
|
|
774
|
+
export const STREAM_EXTENSION_METHODS = [
|
|
775
|
+
"_macro/streams/list",
|
|
776
|
+
"_macro/streams/get",
|
|
777
|
+
"_macro/streams/hierarchy",
|
|
778
|
+
"_macro/streams/createPR",
|
|
779
|
+
"_macro/checkpoints/list",
|
|
780
|
+
"_macro/checkpoints/get",
|
|
781
|
+
"_macro/checkpoints/select",
|
|
782
|
+
"_macro/diffStacks/list",
|
|
783
|
+
"_macro/diffStacks/get",
|
|
784
|
+
"_macro/diffStacks/create",
|
|
785
|
+
"_macro/diffStacks/createPR",
|
|
786
|
+
"_macro/mergeQueue/status",
|
|
787
|
+
"_macro/mergeQueue/get",
|
|
788
|
+
] as const;
|
|
789
|
+
|
|
790
|
+
/**
|
|
791
|
+
* Register all stream/checkpoint/diffStack/mergeQueue extension methods.
|
|
792
|
+
*
|
|
793
|
+
* @param adapter - MAPAdapter instance
|
|
794
|
+
* @param services - Stream extension services
|
|
795
|
+
*/
|
|
796
|
+
export function registerStreamExtensions(
|
|
797
|
+
adapter: MAPAdapter,
|
|
798
|
+
services: StreamExtensionServices,
|
|
799
|
+
): void {
|
|
800
|
+
const emit: EmitEvent = (event) => adapter.emitEvent(event);
|
|
801
|
+
|
|
802
|
+
// Stream queries (canQuery)
|
|
803
|
+
adapter.registerExtension("_macro/streams/list", createStreamListHandler(services));
|
|
804
|
+
adapter.registerExtension("_macro/streams/get", createStreamGetHandler(services));
|
|
805
|
+
adapter.registerExtension("_macro/streams/hierarchy", createStreamHierarchyHandler(services));
|
|
806
|
+
|
|
807
|
+
// Stream PR (canManageTasks)
|
|
808
|
+
adapter.registerExtension("_macro/streams/createPR", createStreamCreatePRHandler(services, emit));
|
|
809
|
+
|
|
810
|
+
// Checkpoint queries (canQuery)
|
|
811
|
+
adapter.registerExtension("_macro/checkpoints/list", createCheckpointListHandler(services));
|
|
812
|
+
adapter.registerExtension("_macro/checkpoints/get", createCheckpointGetHandler(services));
|
|
813
|
+
|
|
814
|
+
// Checkpoint select (canManageTasks)
|
|
815
|
+
adapter.registerExtension("_macro/checkpoints/select", createCheckpointSelectHandler(services, emit));
|
|
816
|
+
|
|
817
|
+
// DiffStack queries (canQuery)
|
|
818
|
+
adapter.registerExtension("_macro/diffStacks/list", createDiffStackListHandler(services));
|
|
819
|
+
adapter.registerExtension("_macro/diffStacks/get", createDiffStackGetHandler(services));
|
|
820
|
+
|
|
821
|
+
// DiffStack management (canManageTasks)
|
|
822
|
+
adapter.registerExtension("_macro/diffStacks/create", createDiffStackCreateHandler(services, emit));
|
|
823
|
+
adapter.registerExtension("_macro/diffStacks/createPR", createDiffStackCreatePRHandler(services, emit));
|
|
824
|
+
|
|
825
|
+
// MergeQueue queries (canQuery)
|
|
826
|
+
adapter.registerExtension("_macro/mergeQueue/status", createMergeQueueStatusHandler(services));
|
|
827
|
+
adapter.registerExtension("_macro/mergeQueue/get", createMergeQueueGetHandler(services));
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
/**
|
|
831
|
+
* Unregister all stream/checkpoint/diffStack/mergeQueue extension methods.
|
|
832
|
+
*
|
|
833
|
+
* @param adapter - MAPAdapter instance
|
|
834
|
+
*/
|
|
835
|
+
export function unregisterStreamExtensions(adapter: MAPAdapter): void {
|
|
836
|
+
for (const method of STREAM_EXTENSION_METHODS) {
|
|
837
|
+
adapter.unregisterExtension(method);
|
|
838
|
+
}
|
|
839
|
+
}
|