macro-agent 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +3 -1
- package/.sudocode/issues.jsonl +28 -0
- package/.sudocode/specs.jsonl +8 -0
- package/CLAUDE.md +25 -17
- package/README.md +11 -29
- package/dist/acp/macro-agent.d.ts +15 -0
- package/dist/acp/macro-agent.d.ts.map +1 -1
- package/dist/acp/macro-agent.js +131 -35
- package/dist/acp/macro-agent.js.map +1 -1
- package/dist/acp/types.d.ts +32 -1
- package/dist/acp/types.d.ts.map +1 -1
- package/dist/acp/types.js.map +1 -1
- package/dist/agent/agent-manager.d.ts +65 -1
- package/dist/agent/agent-manager.d.ts.map +1 -1
- package/dist/agent/agent-manager.js +544 -200
- package/dist/agent/agent-manager.js.map +1 -1
- package/dist/agent/types.d.ts +8 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/api/server.d.ts +8 -1
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +136 -8
- package/dist/api/server.js.map +1 -1
- package/dist/api/types.d.ts +1 -1
- package/dist/api/types.d.ts.map +1 -1
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/token.d.ts +41 -0
- package/dist/auth/token.d.ts.map +1 -0
- package/dist/auth/token.js +73 -0
- package/dist/auth/token.js.map +1 -0
- package/dist/cli/acp.d.ts +2 -23
- package/dist/cli/acp.d.ts.map +1 -1
- package/dist/cli/acp.js +197 -61
- package/dist/cli/acp.js.map +1 -1
- package/dist/cli/index.js +152 -16
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp.d.ts +6 -0
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +279 -173
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/parse-args.d.ts +20 -0
- package/dist/cli/parse-args.d.ts.map +1 -0
- package/dist/cli/parse-args.js +43 -0
- package/dist/cli/parse-args.js.map +1 -0
- package/dist/cli/stable-instance-id.d.ts +8 -0
- package/dist/cli/stable-instance-id.d.ts.map +1 -0
- package/dist/cli/stable-instance-id.js +14 -0
- package/dist/cli/stable-instance-id.js.map +1 -0
- package/dist/config/project-config.d.ts +85 -7
- package/dist/config/project-config.d.ts.map +1 -1
- package/dist/config/project-config.js +133 -20
- package/dist/config/project-config.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lifecycle/handlers/index.d.ts +7 -3
- package/dist/lifecycle/handlers/index.d.ts.map +1 -1
- package/dist/lifecycle/handlers/index.js +25 -8
- package/dist/lifecycle/handlers/index.js.map +1 -1
- package/dist/lifecycle/types.d.ts +2 -0
- package/dist/lifecycle/types.d.ts.map +1 -1
- package/dist/lifecycle/types.js.map +1 -1
- package/dist/map/adapter/acp-over-map.d.ts +17 -0
- package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
- package/dist/map/adapter/acp-over-map.js +384 -23
- package/dist/map/adapter/acp-over-map.js.map +1 -1
- package/dist/map/adapter/connection-manager.d.ts.map +1 -1
- package/dist/map/adapter/connection-manager.js +3 -0
- package/dist/map/adapter/connection-manager.js.map +1 -1
- package/dist/map/adapter/event-log.d.ts +87 -0
- package/dist/map/adapter/event-log.d.ts.map +1 -0
- package/dist/map/adapter/event-log.js +122 -0
- package/dist/map/adapter/event-log.js.map +1 -0
- package/dist/map/adapter/event-translator.js +6 -6
- package/dist/map/adapter/event-translator.js.map +1 -1
- package/dist/map/adapter/extensions/agent-lifecycle.d.ts +82 -0
- package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +1 -0
- package/dist/map/adapter/extensions/agent-lifecycle.js +164 -0
- package/dist/map/adapter/extensions/agent-lifecycle.js.map +1 -0
- package/dist/map/adapter/extensions/index.d.ts +13 -1
- package/dist/map/adapter/extensions/index.d.ts.map +1 -1
- package/dist/map/adapter/extensions/index.js +61 -0
- package/dist/map/adapter/extensions/index.js.map +1 -1
- package/dist/map/adapter/extensions/mcp-bridge.d.ts +57 -0
- package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +1 -0
- package/dist/map/adapter/extensions/mcp-bridge.js +745 -0
- package/dist/map/adapter/extensions/mcp-bridge.js.map +1 -0
- package/dist/map/adapter/extensions/rename.d.ts +29 -0
- package/dist/map/adapter/extensions/rename.d.ts.map +1 -0
- package/dist/map/adapter/extensions/rename.js +49 -0
- package/dist/map/adapter/extensions/rename.js.map +1 -0
- package/dist/map/adapter/extensions/streams.d.ts +95 -0
- package/dist/map/adapter/extensions/streams.d.ts.map +1 -0
- package/dist/map/adapter/extensions/streams.js +515 -0
- package/dist/map/adapter/extensions/streams.js.map +1 -0
- package/dist/map/adapter/extensions/task.d.ts.map +1 -1
- package/dist/map/adapter/extensions/task.js +10 -0
- package/dist/map/adapter/extensions/task.js.map +1 -1
- package/dist/map/adapter/extensions/update-metadata.d.ts +29 -0
- package/dist/map/adapter/extensions/update-metadata.d.ts.map +1 -0
- package/dist/map/adapter/extensions/update-metadata.js +67 -0
- package/dist/map/adapter/extensions/update-metadata.js.map +1 -0
- package/dist/map/adapter/index.d.ts +2 -1
- package/dist/map/adapter/index.d.ts.map +1 -1
- package/dist/map/adapter/index.js +10 -2
- package/dist/map/adapter/index.js.map +1 -1
- package/dist/map/adapter/interface.d.ts +2 -0
- package/dist/map/adapter/interface.d.ts.map +1 -1
- package/dist/map/adapter/map-adapter.d.ts +3 -0
- package/dist/map/adapter/map-adapter.d.ts.map +1 -1
- package/dist/map/adapter/map-adapter.js +258 -35
- package/dist/map/adapter/map-adapter.js.map +1 -1
- package/dist/map/adapter/subscription-manager.d.ts.map +1 -1
- package/dist/map/adapter/subscription-manager.js +5 -1
- package/dist/map/adapter/subscription-manager.js.map +1 -1
- package/dist/map/adapter/types.d.ts +3 -1
- package/dist/map/adapter/types.d.ts.map +1 -1
- package/dist/mcp/map-client.d.ts +39 -0
- package/dist/mcp/map-client.d.ts.map +1 -0
- package/dist/mcp/map-client.js +129 -0
- package/dist/mcp/map-client.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +16 -0
- package/dist/mcp/mcp-server.d.ts.map +1 -1
- package/dist/mcp/mcp-server.js +125 -88
- package/dist/mcp/mcp-server.js.map +1 -1
- package/dist/mcp/tools/done.d.ts.map +1 -1
- package/dist/mcp/tools/done.js +18 -0
- package/dist/mcp/tools/done.js.map +1 -1
- package/dist/mcp/types.d.ts +9 -1
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/metrics/metrics.js +1 -1
- package/dist/metrics/metrics.js.map +1 -1
- package/dist/roles/builtin/coordinator.d.ts.map +1 -1
- package/dist/roles/builtin/coordinator.js +2 -1
- package/dist/roles/builtin/coordinator.js.map +1 -1
- package/dist/roles/builtin/integrator.d.ts.map +1 -1
- package/dist/roles/builtin/integrator.js +2 -1
- package/dist/roles/builtin/integrator.js.map +1 -1
- package/dist/roles/builtin/worker.d.ts.map +1 -1
- package/dist/roles/builtin/worker.js +3 -1
- package/dist/roles/builtin/worker.js.map +1 -1
- package/dist/roles/capabilities.d.ts +9 -1
- package/dist/roles/capabilities.d.ts.map +1 -1
- package/dist/roles/capabilities.js +27 -7
- package/dist/roles/capabilities.js.map +1 -1
- package/dist/roles/config-loader.d.ts +6 -6
- package/dist/roles/config-loader.d.ts.map +1 -1
- package/dist/roles/config-loader.js +8 -7
- package/dist/roles/config-loader.js.map +1 -1
- package/dist/roles/registry.d.ts +2 -2
- package/dist/roles/registry.js +2 -2
- package/dist/roles/types.d.ts +3 -1
- package/dist/roles/types.d.ts.map +1 -1
- package/dist/server/combined-server.d.ts +28 -1
- package/dist/server/combined-server.d.ts.map +1 -1
- package/dist/server/combined-server.js +111 -8
- package/dist/server/combined-server.js.map +1 -1
- package/dist/store/event-store.d.ts +2 -1
- package/dist/store/event-store.d.ts.map +1 -1
- package/dist/store/event-store.js +80 -24
- package/dist/store/event-store.js.map +1 -1
- package/dist/store/instance.d.ts +1 -1
- package/dist/store/instance.d.ts.map +1 -1
- package/dist/store/instance.js +2 -2
- package/dist/store/instance.js.map +1 -1
- package/dist/store/types/agents.d.ts +23 -0
- package/dist/store/types/agents.d.ts.map +1 -1
- package/dist/store/types/events.d.ts +1 -1
- package/dist/store/types/events.d.ts.map +1 -1
- package/dist/task/backend/index.d.ts +47 -29
- package/dist/task/backend/index.d.ts.map +1 -1
- package/dist/task/backend/index.js +109 -71
- package/dist/task/backend/index.js.map +1 -1
- package/dist/task/backend/memory.d.ts +1 -0
- package/dist/task/backend/memory.d.ts.map +1 -1
- package/dist/task/backend/memory.js +3 -0
- package/dist/task/backend/memory.js.map +1 -1
- package/dist/task/backend/opentasks/backend.d.ts +140 -0
- package/dist/task/backend/opentasks/backend.d.ts.map +1 -0
- package/dist/task/backend/opentasks/backend.js +1023 -0
- package/dist/task/backend/opentasks/backend.js.map +1 -0
- package/dist/task/backend/opentasks/client.d.ts +337 -0
- package/dist/task/backend/opentasks/client.d.ts.map +1 -0
- package/dist/task/backend/opentasks/client.js +225 -0
- package/dist/task/backend/opentasks/client.js.map +1 -0
- package/dist/task/backend/opentasks/daemon-manager.d.ts +89 -0
- package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -0
- package/dist/task/backend/opentasks/daemon-manager.js +195 -0
- package/dist/task/backend/opentasks/daemon-manager.js.map +1 -0
- package/dist/task/backend/opentasks/index.d.ts +21 -0
- package/dist/task/backend/opentasks/index.d.ts.map +1 -0
- package/dist/task/backend/opentasks/index.js +21 -0
- package/dist/task/backend/opentasks/index.js.map +1 -0
- package/dist/task/backend/opentasks/mapping.d.ts +48 -0
- package/dist/task/backend/opentasks/mapping.d.ts.map +1 -0
- package/dist/task/backend/opentasks/mapping.js +77 -0
- package/dist/task/backend/opentasks/mapping.js.map +1 -0
- package/dist/task/backend/types.d.ts +33 -53
- package/dist/task/backend/types.d.ts.map +1 -1
- package/dist/task/backend/types.js +7 -11
- package/dist/task/backend/types.js.map +1 -1
- package/dist/task/backend/unified-tool-provider.d.ts +57 -0
- package/dist/task/backend/unified-tool-provider.d.ts.map +1 -0
- package/dist/task/backend/unified-tool-provider.js +623 -0
- package/dist/task/backend/unified-tool-provider.js.map +1 -0
- package/dist/teams/index.d.ts +3 -1
- package/dist/teams/index.d.ts.map +1 -1
- package/dist/teams/index.js +2 -0
- package/dist/teams/index.js.map +1 -1
- package/dist/teams/seed-defaults.d.ts +20 -0
- package/dist/teams/seed-defaults.d.ts.map +1 -0
- package/dist/teams/seed-defaults.js +71 -0
- package/dist/teams/seed-defaults.js.map +1 -0
- package/dist/teams/team-loader.d.ts +7 -3
- package/dist/teams/team-loader.d.ts.map +1 -1
- package/dist/teams/team-loader.js +156 -164
- package/dist/teams/team-loader.js.map +1 -1
- package/dist/teams/team-manager.d.ts +112 -0
- package/dist/teams/team-manager.d.ts.map +1 -0
- package/dist/teams/team-manager.js +305 -0
- package/dist/teams/team-manager.js.map +1 -0
- package/dist/teams/team-runtime.d.ts +125 -19
- package/dist/teams/team-runtime.d.ts.map +1 -1
- package/dist/teams/team-runtime.js +529 -119
- package/dist/teams/team-runtime.js.map +1 -1
- package/dist/teams/types.d.ts +41 -151
- package/dist/teams/types.d.ts.map +1 -1
- package/dist/teams/types.js +2 -3
- package/dist/teams/types.js.map +1 -1
- package/docs/architecture.md +7 -6
- package/docs/configuration.md +26 -62
- package/docs/implementation-details.md +5 -5
- package/docs/implementation-summary.md +17 -17
- package/docs/plan-self-driving-support.md +4 -4
- package/docs/spec-self-driving-support.md +10 -10
- package/docs/team-templates.md +2 -2
- package/docs/teams.md +76 -3
- package/docs/troubleshooting.md +10 -11
- package/package.json +7 -4
- package/references/minimem/.claude/settings.json +7 -0
- package/references/minimem/.sudocode/issues.jsonl +18 -0
- package/references/minimem/.sudocode/specs.jsonl +1 -0
- package/references/minimem/CLAUDE.md +310 -0
- package/references/minimem/README.md +562 -0
- package/references/minimem/claude-plugin/.claude-plugin/plugin.json +10 -0
- package/references/minimem/claude-plugin/.mcp.json +7 -0
- package/references/minimem/claude-plugin/README.md +158 -0
- package/references/minimem/claude-plugin/commands/recall.md +47 -0
- package/references/minimem/claude-plugin/commands/remember.md +41 -0
- package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +272 -0
- package/references/minimem/claude-plugin/hooks/hooks.json +27 -0
- package/references/minimem/claude-plugin/hooks/session-end.sh +86 -0
- package/references/minimem/claude-plugin/hooks/session-start.sh +85 -0
- package/references/minimem/claude-plugin/skills/memory/SKILL.md +108 -0
- package/references/minimem/media/banner.png +0 -0
- package/references/minimem/package-lock.json +5373 -0
- package/references/minimem/package.json +72 -0
- package/references/minimem/scripts/postbuild.js +35 -0
- package/references/minimem/src/__tests__/edge-cases.test.ts +371 -0
- package/references/minimem/src/__tests__/errors.test.ts +265 -0
- package/references/minimem/src/__tests__/helpers.ts +199 -0
- package/references/minimem/src/__tests__/internal.test.ts +407 -0
- package/references/minimem/src/__tests__/knowledge.test.ts +287 -0
- package/references/minimem/src/__tests__/minimem.integration.test.ts +1127 -0
- package/references/minimem/src/__tests__/session.test.ts +190 -0
- package/references/minimem/src/cli/__tests__/commands.test.ts +759 -0
- package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +141 -0
- package/references/minimem/src/cli/commands/append.ts +76 -0
- package/references/minimem/src/cli/commands/config.ts +262 -0
- package/references/minimem/src/cli/commands/conflicts.ts +413 -0
- package/references/minimem/src/cli/commands/daemon.ts +169 -0
- package/references/minimem/src/cli/commands/index.ts +12 -0
- package/references/minimem/src/cli/commands/init.ts +88 -0
- package/references/minimem/src/cli/commands/mcp.ts +177 -0
- package/references/minimem/src/cli/commands/push-pull.ts +213 -0
- package/references/minimem/src/cli/commands/search.ts +158 -0
- package/references/minimem/src/cli/commands/status.ts +84 -0
- package/references/minimem/src/cli/commands/sync-init.ts +290 -0
- package/references/minimem/src/cli/commands/sync.ts +70 -0
- package/references/minimem/src/cli/commands/upsert.ts +197 -0
- package/references/minimem/src/cli/config.ts +584 -0
- package/references/minimem/src/cli/index.ts +264 -0
- package/references/minimem/src/cli/shared.ts +161 -0
- package/references/minimem/src/cli/sync/__tests__/central.test.ts +152 -0
- package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +209 -0
- package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +118 -0
- package/references/minimem/src/cli/sync/__tests__/detection.test.ts +207 -0
- package/references/minimem/src/cli/sync/__tests__/integration.test.ts +476 -0
- package/references/minimem/src/cli/sync/__tests__/registry.test.ts +363 -0
- package/references/minimem/src/cli/sync/__tests__/state.test.ts +255 -0
- package/references/minimem/src/cli/sync/__tests__/validation.test.ts +193 -0
- package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +178 -0
- package/references/minimem/src/cli/sync/central.ts +292 -0
- package/references/minimem/src/cli/sync/conflicts.ts +204 -0
- package/references/minimem/src/cli/sync/daemon.ts +407 -0
- package/references/minimem/src/cli/sync/detection.ts +138 -0
- package/references/minimem/src/cli/sync/index.ts +107 -0
- package/references/minimem/src/cli/sync/operations.ts +373 -0
- package/references/minimem/src/cli/sync/registry.ts +279 -0
- package/references/minimem/src/cli/sync/state.ts +355 -0
- package/references/minimem/src/cli/sync/validation.ts +206 -0
- package/references/minimem/src/cli/sync/watcher.ts +234 -0
- package/references/minimem/src/cli/version.ts +34 -0
- package/references/minimem/src/core/index.ts +9 -0
- package/references/minimem/src/core/indexer.ts +628 -0
- package/references/minimem/src/core/searcher.ts +221 -0
- package/references/minimem/src/db/schema.ts +183 -0
- package/references/minimem/src/db/sqlite-vec.ts +24 -0
- package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +431 -0
- package/references/minimem/src/embeddings/batch-gemini.ts +392 -0
- package/references/minimem/src/embeddings/batch-openai.ts +409 -0
- package/references/minimem/src/embeddings/embeddings.ts +434 -0
- package/references/minimem/src/index.ts +109 -0
- package/references/minimem/src/internal.ts +299 -0
- package/references/minimem/src/minimem.ts +1276 -0
- package/references/minimem/src/search/__tests__/hybrid.test.ts +247 -0
- package/references/minimem/src/search/graph.ts +234 -0
- package/references/minimem/src/search/hybrid.ts +151 -0
- package/references/minimem/src/search/search.ts +256 -0
- package/references/minimem/src/server/__tests__/mcp.test.ts +341 -0
- package/references/minimem/src/server/__tests__/tools.test.ts +364 -0
- package/references/minimem/src/server/mcp.ts +326 -0
- package/references/minimem/src/server/tools.ts +720 -0
- package/references/minimem/src/session.ts +460 -0
- package/references/minimem/tsconfig.json +19 -0
- package/references/minimem/tsup.config.ts +26 -0
- package/references/minimem/vitest.config.ts +24 -0
- package/references/openteams/.claude/settings.json +6 -0
- package/references/openteams/README.md +1 -0
- package/references/openteams/SKILL.md +341 -0
- package/references/openteams/design.md +411 -0
- package/references/openteams/examples/bmad-method/prompts/analyst/ROLE.md +16 -0
- package/references/openteams/examples/bmad-method/prompts/analyst/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/architect/ROLE.md +24 -0
- package/references/openteams/examples/bmad-method/prompts/architect/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/developer/ROLE.md +25 -0
- package/references/openteams/examples/bmad-method/prompts/developer/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/master/ROLE.md +21 -0
- package/references/openteams/examples/bmad-method/prompts/master/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/pm/ROLE.md +20 -0
- package/references/openteams/examples/bmad-method/prompts/pm/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/qa/ROLE.md +17 -0
- package/references/openteams/examples/bmad-method/prompts/qa/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/ROLE.md +23 -0
- package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/scrum-master/ROLE.md +27 -0
- package/references/openteams/examples/bmad-method/prompts/scrum-master/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/tech-writer/ROLE.md +21 -0
- package/references/openteams/examples/bmad-method/prompts/tech-writer/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/ux-designer/ROLE.md +16 -0
- package/references/openteams/examples/bmad-method/prompts/ux-designer/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/roles/analyst.yaml +9 -0
- package/references/openteams/examples/bmad-method/roles/architect.yaml +9 -0
- package/references/openteams/examples/bmad-method/roles/developer.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/master.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/pm.yaml +9 -0
- package/references/openteams/examples/bmad-method/roles/qa.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/quick-flow-dev.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/scrum-master.yaml +9 -0
- package/references/openteams/examples/bmad-method/roles/tech-writer.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/ux-designer.yaml +8 -0
- package/references/openteams/examples/bmad-method/team.yaml +161 -0
- package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/ROLE.md +17 -0
- package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/prompts/debugger/ROLE.md +25 -0
- package/references/openteams/examples/get-shit-done/prompts/debugger/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/prompts/executor/ROLE.md +34 -0
- package/references/openteams/examples/get-shit-done/prompts/executor/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/prompts/integration-checker/ROLE.md +18 -0
- package/references/openteams/examples/get-shit-done/prompts/integration-checker/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/orchestrator/ROLE.md +42 -0
- package/references/openteams/examples/get-shit-done/prompts/orchestrator/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/prompts/phase-researcher/ROLE.md +15 -0
- package/references/openteams/examples/get-shit-done/prompts/phase-researcher/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/plan-checker/ROLE.md +17 -0
- package/references/openteams/examples/get-shit-done/prompts/plan-checker/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/planner/ROLE.md +28 -0
- package/references/openteams/examples/get-shit-done/prompts/planner/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/prompts/project-researcher/ROLE.md +16 -0
- package/references/openteams/examples/get-shit-done/prompts/project-researcher/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/ROLE.md +13 -0
- package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/roadmapper/ROLE.md +14 -0
- package/references/openteams/examples/get-shit-done/prompts/roadmapper/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/verifier/ROLE.md +19 -0
- package/references/openteams/examples/get-shit-done/prompts/verifier/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/roles/codebase-mapper.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/debugger.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/executor.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/integration-checker.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/orchestrator.yaml +9 -0
- package/references/openteams/examples/get-shit-done/roles/phase-researcher.yaml +7 -0
- package/references/openteams/examples/get-shit-done/roles/plan-checker.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/planner.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/project-researcher.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/research-synthesizer.yaml +7 -0
- package/references/openteams/examples/get-shit-done/roles/roadmapper.yaml +7 -0
- package/references/openteams/examples/get-shit-done/roles/verifier.yaml +8 -0
- package/references/openteams/examples/get-shit-done/team.yaml +154 -0
- package/references/openteams/package-lock.json +2181 -0
- package/references/openteams/package.json +48 -0
- package/references/openteams/schema/role.schema.json +125 -0
- package/references/openteams/schema/team.schema.json +284 -0
- package/references/openteams/src/cli/agent.ts +104 -0
- package/references/openteams/src/cli/cli.test.ts +381 -0
- package/references/openteams/src/cli/generate.ts +220 -0
- package/references/openteams/src/cli/message.ts +241 -0
- package/references/openteams/src/cli/task.ts +154 -0
- package/references/openteams/src/cli/team.ts +104 -0
- package/references/openteams/src/cli/template.ts +207 -0
- package/references/openteams/src/cli.ts +45 -0
- package/references/openteams/src/db/database.test.ts +185 -0
- package/references/openteams/src/db/database.ts +240 -0
- package/references/openteams/src/generators/agent-prompt-generator.test.ts +332 -0
- package/references/openteams/src/generators/agent-prompt-generator.ts +521 -0
- package/references/openteams/src/generators/package-generator.test.ts +129 -0
- package/references/openteams/src/generators/package-generator.ts +102 -0
- package/references/openteams/src/generators/skill-generator.test.ts +246 -0
- package/references/openteams/src/generators/skill-generator.ts +374 -0
- package/references/openteams/src/index.ts +104 -0
- package/references/openteams/src/services/agent-service.test.ts +158 -0
- package/references/openteams/src/services/agent-service.ts +84 -0
- package/references/openteams/src/services/communication-service.test.ts +455 -0
- package/references/openteams/src/services/communication-service.ts +371 -0
- package/references/openteams/src/services/message-service.test.ts +342 -0
- package/references/openteams/src/services/message-service.ts +203 -0
- package/references/openteams/src/services/task-service.test.ts +434 -0
- package/references/openteams/src/services/task-service.ts +239 -0
- package/references/openteams/src/services/team-service.test.ts +181 -0
- package/references/openteams/src/services/team-service.ts +139 -0
- package/references/openteams/src/services/template-service.test.ts +306 -0
- package/references/openteams/src/services/template-service.ts +182 -0
- package/references/openteams/src/spawner/acp-factory.ts +96 -0
- package/references/openteams/src/spawner/interface.ts +31 -0
- package/references/openteams/src/spawner/mock.test.ts +93 -0
- package/references/openteams/src/spawner/mock.ts +59 -0
- package/references/openteams/src/template/loader.test.ts +1319 -0
- package/references/openteams/src/template/loader.ts +698 -0
- package/references/openteams/src/template/types.ts +200 -0
- package/references/openteams/src/types.ts +205 -0
- package/references/openteams/tsconfig.json +18 -0
- package/references/openteams/vitest.config.ts +9 -0
- package/references/skill-tree/.claude/settings.json +6 -0
- package/references/skill-tree/.sudocode/issues.jsonl +11 -0
- package/references/skill-tree/.sudocode/specs.jsonl +1 -0
- package/references/skill-tree/CLAUDE.md +150 -0
- package/references/skill-tree/README.md +324 -0
- package/references/skill-tree/docs/GAPS_v1.md +221 -0
- package/references/skill-tree/docs/INTEGRATION_PLAN.md +467 -0
- package/references/skill-tree/docs/TODOS.md +91 -0
- package/references/skill-tree/docs/anthropic_skill_guide.md +1364 -0
- package/references/skill-tree/docs/design/federated-skill-trees.md +524 -0
- package/references/skill-tree/docs/design/multi-agent-sync.md +759 -0
- package/references/skill-tree/docs/scraper/BRAINSTORM.md +583 -0
- package/references/skill-tree/docs/scraper/POC_PLAN.md +420 -0
- package/references/skill-tree/docs/scraper/README.md +170 -0
- package/references/skill-tree/examples/basic-usage.ts +190 -0
- package/references/skill-tree/package-lock.json +1509 -0
- package/references/skill-tree/package.json +66 -0
- package/references/skill-tree/scraper/README.md +123 -0
- package/references/skill-tree/scraper/docs/DESIGN.md +683 -0
- package/references/skill-tree/scraper/docs/PLAN.md +336 -0
- package/references/skill-tree/scraper/drizzle.config.ts +10 -0
- package/references/skill-tree/scraper/package-lock.json +6329 -0
- package/references/skill-tree/scraper/package.json +68 -0
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +7 -0
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +7 -0
- package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +27 -0
- package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +21 -0
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +54 -0
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +24 -0
- package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +93 -0
- package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +22 -0
- package/references/skill-tree/scraper/tsup.config.ts +14 -0
- package/references/skill-tree/scraper/vitest.config.ts +17 -0
- package/references/skill-tree/scripts/convert-to-vitest.ts +166 -0
- package/references/skill-tree/skills/skill-writer/SKILL.md +339 -0
- package/references/skill-tree/skills/skill-writer/references/examples.md +326 -0
- package/references/skill-tree/skills/skill-writer/references/patterns.md +210 -0
- package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +123 -0
- package/references/skill-tree/test/run-all.ts +106 -0
- package/references/skill-tree/test/utils.ts +128 -0
- package/references/skill-tree/vitest.config.ts +16 -0
- package/src/__tests__/e2e/agent-spawn-visibility.e2e.test.ts +761 -0
- package/src/__tests__/e2e/full-agent-conflict-resolution.e2e.test.ts +2 -2
- package/src/__tests__/e2e/mcp-thin-client-bridge.e2e.test.ts +304 -0
- package/src/__tests__/e2e/mcp-tools-available.e2e.test.ts +324 -0
- package/src/__tests__/e2e/multi-agent.e2e.test.ts +5 -5
- package/src/__tests__/e2e/spawn-session-streaming.e2e.test.ts +563 -0
- package/src/acp/__tests__/integration.test.ts +56 -31
- package/src/acp/__tests__/macro-agent.test.ts +16 -7
- package/src/acp/macro-agent.ts +170 -36
- package/src/acp/types.ts +46 -1
- package/src/agent/__tests__/agent-manager.test.ts +228 -2
- package/src/agent/agent-manager.ts +809 -285
- package/src/agent/types.ts +12 -1
- package/src/api/__tests__/server.test.ts +203 -4
- package/src/api/server.ts +169 -10
- package/src/api/types.ts +3 -1
- package/src/auth/__tests__/token.test.ts +100 -0
- package/src/auth/index.ts +1 -0
- package/src/auth/token.ts +82 -0
- package/src/cli/__tests__/acp.test.ts +1 -1
- package/src/cli/__tests__/stable-instance-id.test.ts +1 -1
- package/src/cli/acp.ts +197 -72
- package/src/cli/index.ts +125 -15
- package/src/cli/mcp.ts +315 -197
- package/src/cli/parse-args.ts +54 -0
- package/src/cli/stable-instance-id.ts +14 -0
- package/src/config/project-config.ts +214 -27
- package/src/index.ts +3 -0
- package/src/lifecycle/__tests__/cascade-termination.test.ts +1 -1
- package/src/lifecycle/__tests__/handlers.test.ts +53 -0
- package/src/lifecycle/handlers/index.ts +25 -8
- package/src/lifecycle/types.ts +3 -0
- package/src/map/adapter/__tests__/acp-over-map-cancel.test.ts +22 -4
- package/src/map/adapter/__tests__/acp-over-map-getmodels.test.ts +355 -0
- package/src/map/adapter/__tests__/acp-over-map-history.test.ts +263 -0
- package/src/map/adapter/__tests__/acp-over-map-persistence.e2e.test.ts +1 -1
- package/src/map/adapter/__tests__/event-broadcast.test.ts +420 -0
- package/src/map/adapter/__tests__/event-log.test.ts +527 -0
- package/src/map/adapter/__tests__/event-translator.test.ts +3 -3
- package/src/map/adapter/__tests__/extensions.test.ts +408 -0
- package/src/map/adapter/__tests__/map-adapter.test.ts +99 -0
- package/src/map/adapter/__tests__/mcp-bridge.test.ts +1187 -0
- package/src/map/adapter/__tests__/multi-client-broadcast.test.ts +711 -0
- package/src/map/adapter/__tests__/stream-extensions.test.ts +494 -0
- package/src/map/adapter/__tests__/websocket-integration.test.ts +218 -0
- package/src/map/adapter/acp-over-map.ts +678 -66
- package/src/map/adapter/connection-manager.ts +3 -0
- package/src/map/adapter/event-log.ts +208 -0
- package/src/map/adapter/event-translator.ts +6 -6
- package/src/map/adapter/extensions/agent-lifecycle.ts +267 -0
- package/src/map/adapter/extensions/index.ts +96 -0
- package/src/map/adapter/extensions/mcp-bridge.ts +995 -0
- package/src/map/adapter/extensions/streams.ts +839 -0
- package/src/map/adapter/extensions/task.ts +11 -0
- package/src/map/adapter/extensions/update-metadata.ts +126 -0
- package/src/map/adapter/index.ts +33 -0
- package/src/map/adapter/interface.ts +2 -0
- package/src/map/adapter/map-adapter.ts +312 -47
- package/src/map/adapter/subscription-manager.ts +5 -1
- package/src/map/adapter/types.ts +10 -1
- package/src/mcp/__tests__/map-client.test.ts +386 -0
- package/src/mcp/__tests__/mcp-server-thin-client.test.ts +368 -0
- package/src/mcp/__tests__/mcp-server.test.ts +100 -1
- package/src/mcp/map-client.ts +177 -0
- package/src/mcp/mcp-server.ts +205 -103
- package/src/mcp/tools/done.ts +19 -0
- package/src/mcp/types.ts +6 -1
- package/src/metrics/metrics.ts +1 -1
- package/src/monitor/__tests__/stale-agent-flow.integration.test.ts +1 -1
- package/src/roles/__tests__/config-loader.test.ts +7 -7
- package/src/roles/builtin/coordinator.ts +2 -0
- package/src/roles/builtin/integrator.ts +2 -0
- package/src/roles/builtin/worker.ts +3 -0
- package/src/roles/capabilities.ts +28 -7
- package/src/roles/config-loader.ts +8 -7
- package/src/roles/registry.ts +2 -2
- package/src/roles/types.ts +7 -0
- package/src/server/__tests__/combined-server.test.ts +94 -21
- package/src/server/combined-server.ts +203 -33
- package/src/steering/__tests__/steering-integration.test.ts +1 -1
- package/src/store/__tests__/event-store-oob.test.ts +109 -0
- package/src/store/__tests__/event-store.test.ts +196 -1
- package/src/store/__tests__/instance.test.ts +3 -3
- package/src/store/event-store.ts +92 -23
- package/src/store/instance.ts +2 -2
- package/src/store/types/agents.ts +20 -0
- package/src/store/types/events.ts +1 -1
- package/src/task/backend/__tests__/create-task-backend.test.ts +225 -0
- package/src/task/backend/__tests__/e2e/unified-tool-provider-opentasks.e2e.test.ts +524 -0
- package/src/task/backend/__tests__/memory-pull-mode.test.ts +153 -0
- package/src/task/backend/__tests__/unified-tool-provider.test.ts +579 -0
- package/src/task/backend/index.ts +156 -106
- package/src/task/backend/memory.ts +4 -0
- package/src/task/backend/opentasks/__tests__/backend.test.ts +968 -0
- package/src/task/backend/opentasks/__tests__/daemon-manager.test.ts +406 -0
- package/src/task/backend/opentasks/__tests__/mapping.test.ts +84 -0
- package/src/task/backend/opentasks/__tests__/opentasks-backend.e2e.test.ts +1338 -0
- package/src/task/backend/opentasks/backend.ts +1323 -0
- package/src/task/backend/opentasks/client.ts +652 -0
- package/src/task/backend/opentasks/daemon-manager.ts +256 -0
- package/src/task/backend/opentasks/index.ts +69 -0
- package/src/task/backend/opentasks/mapping.ts +94 -0
- package/src/task/backend/types.ts +42 -66
- package/src/task/backend/unified-tool-provider.ts +779 -0
- package/src/teams/CLAUDE.md +180 -0
- package/src/teams/__tests__/cross-subsystem.integration.test.ts +1 -1
- package/src/teams/__tests__/e2e/workspace-isolation.e2e.test.ts +1263 -0
- package/src/teams/__tests__/team-manager.test.ts +814 -0
- package/src/teams/__tests__/team-system.test.ts +1291 -8
- package/src/teams/index.ts +21 -3
- package/src/teams/seed-defaults.ts +79 -0
- package/src/teams/team-loader.ts +202 -236
- package/src/teams/team-manager.ts +387 -0
- package/src/teams/team-runtime.ts +592 -121
- package/src/teams/types.ts +99 -200
- package/test_fixtures/README.md +2 -3
- package/test_fixtures/fixtures/index.ts +0 -3
- package/test_fixtures/fixtures/projects/project-with-specs.ts +7 -149
- package/test_fixtures/fixtures/repos/index.ts +1 -3
- package/test_fixtures/fixtures/repos/temp-repo-factory.ts +0 -116
- package/test_fixtures/fixtures/repos/types.ts +0 -11
- package/test_fixtures/harness/__tests__/fixtures.test.ts +10 -102
- package/test_fixtures/harness/__tests__/temp-repo-and-simulator.test.ts +0 -33
- package/test_fixtures/harness/simulator/agent-simulator.ts +4 -4
- package/vitest.config.ts +1 -1
- package/vitest.e2e.config.ts +1 -1
- package/vitest.setup.ts +1 -30
- package/.macro-agent/teams/self-driving/prompts/grinder.md +0 -27
- package/.macro-agent/teams/self-driving/prompts/judge.md +0 -27
- package/.macro-agent/teams/self-driving/prompts/planner.md +0 -33
- package/.macro-agent/teams/self-driving/roles/grinder.yaml +0 -17
- package/.macro-agent/teams/self-driving/roles/judge.yaml +0 -24
- package/.macro-agent/teams/self-driving/roles/planner.yaml +0 -18
- package/.macro-agent/teams/self-driving/team.yaml +0 -103
- package/.macro-agent/teams/structured/prompts/developer.md +0 -26
- package/.macro-agent/teams/structured/prompts/lead.md +0 -25
- package/.macro-agent/teams/structured/prompts/reviewer.md +0 -24
- package/.macro-agent/teams/structured/roles/developer.yaml +0 -12
- package/.macro-agent/teams/structured/roles/lead.yaml +0 -11
- package/.macro-agent/teams/structured/roles/reviewer.yaml +0 -19
- package/.macro-agent/teams/structured/team.yaml +0 -89
- package/docs/sudocode-integration.md +0 -383
- package/src/task/backend/__tests__/backend-parity.test.ts +0 -451
- package/src/task/backend/__tests__/tool-provider-edge-cases.test.ts +0 -430
- package/src/task/backend/__tests__/tool-provider.test.ts +0 -983
- package/src/task/backend/sudocode/__tests__/backend-edge-cases.test.ts +0 -575
- package/src/task/backend/sudocode/__tests__/backend.test.ts +0 -1194
- package/src/task/backend/sudocode/__tests__/client-integration.test.ts +0 -418
- package/src/task/backend/sudocode/__tests__/client.test.ts +0 -345
- package/src/task/backend/sudocode/__tests__/e2e/backend.e2e.test.ts +0 -753
- package/src/task/backend/sudocode/__tests__/e2e/server-client.e2e.test.ts +0 -680
- package/src/task/backend/sudocode/__tests__/e2e-workflow.test.ts +0 -666
- package/src/task/backend/sudocode/__tests__/integration/standalone-client.integration.test.ts +0 -396
- package/src/task/backend/sudocode/__tests__/integration/sudocode-cli.integration.test.ts +0 -328
- package/src/task/backend/sudocode/__tests__/integration/test-utils.ts +0 -175
- package/src/task/backend/sudocode/__tests__/mapping-edge-cases.test.ts +0 -265
- package/src/task/backend/sudocode/__tests__/server-client.test.ts +0 -675
- package/src/task/backend/sudocode/__tests__/sync-policy-edge-cases.test.ts +0 -521
- package/src/task/backend/sudocode/__tests__/sync-policy.test.ts +0 -519
- package/src/task/backend/sudocode/__tests__/tools.test.ts +0 -471
- package/src/task/backend/sudocode/backend.ts +0 -1237
- package/src/task/backend/sudocode/client.ts +0 -515
- package/src/task/backend/sudocode/index.ts +0 -120
- package/src/task/backend/sudocode/mapping.ts +0 -93
- package/src/task/backend/sudocode/server-client.ts +0 -522
- package/src/task/backend/sudocode/standalone-client.ts +0 -623
- package/src/task/backend/sudocode/sync-policy.ts +0 -387
- package/src/task/backend/sudocode/tools.ts +0 -896
- package/src/task/backend/tool-provider.ts +0 -506
- package/test_fixtures/fixtures/sudocode/index.ts +0 -29
- package/test_fixtures/fixtures/sudocode/issues.ts +0 -185
- package/test_fixtures/fixtures/sudocode/specs.ts +0 -159
|
@@ -1,680 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2E Tests for ServerClient
|
|
3
|
-
*
|
|
4
|
-
* These tests automatically start a sudocode server, run tests against it,
|
|
5
|
-
* and then shut it down. They are NOT run during regular test execution.
|
|
6
|
-
*
|
|
7
|
-
* Run them explicitly with:
|
|
8
|
-
*
|
|
9
|
-
* npm run test:e2e
|
|
10
|
-
*
|
|
11
|
-
* Or directly:
|
|
12
|
-
*
|
|
13
|
-
* npm test -- src/task/backend/sudocode/__tests__/e2e/
|
|
14
|
-
*
|
|
15
|
-
* The tests will:
|
|
16
|
-
* 1. Create a temporary project directory
|
|
17
|
-
* 2. Initialize sudocode in that directory
|
|
18
|
-
* 3. Start a sudocode server
|
|
19
|
-
* 4. Run all tests against the server
|
|
20
|
-
* 5. Shut down the server and clean up
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
import { describe, it, expect, beforeAll, afterAll, beforeEach, afterEach } from "vitest";
|
|
24
|
-
import { spawn, execSync, ChildProcess } from "child_process";
|
|
25
|
-
import { mkdtempSync, rmSync, existsSync } from "fs";
|
|
26
|
-
import { tmpdir } from "os";
|
|
27
|
-
import { join } from "path";
|
|
28
|
-
import { ServerClient } from "../../server-client.js";
|
|
29
|
-
import type { Issue, Spec } from "../../client.js";
|
|
30
|
-
|
|
31
|
-
// Configuration
|
|
32
|
-
const TEST_PORT = 13579; // Use a non-standard port to avoid conflicts
|
|
33
|
-
const SERVER_URL = `http://localhost:${TEST_PORT}`;
|
|
34
|
-
const WS_URL = `ws://localhost:${TEST_PORT}/ws`;
|
|
35
|
-
const TEST_TIMEOUT = 15000;
|
|
36
|
-
const SERVER_STARTUP_TIMEOUT = 10000;
|
|
37
|
-
|
|
38
|
-
// Global state
|
|
39
|
-
let serverProcess: ChildProcess | null = null;
|
|
40
|
-
let projectDir: string | null = null;
|
|
41
|
-
let projectId: string | null = null;
|
|
42
|
-
|
|
43
|
-
// Track created entities for cleanup
|
|
44
|
-
const createdIssueIds: string[] = [];
|
|
45
|
-
const createdSpecIds: string[] = [];
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Wait for the server to be ready
|
|
49
|
-
*/
|
|
50
|
-
async function waitForServer(
|
|
51
|
-
url: string,
|
|
52
|
-
timeout: number = SERVER_STARTUP_TIMEOUT
|
|
53
|
-
): Promise<boolean> {
|
|
54
|
-
const startTime = Date.now();
|
|
55
|
-
|
|
56
|
-
while (Date.now() - startTime < timeout) {
|
|
57
|
-
try {
|
|
58
|
-
const controller = new AbortController();
|
|
59
|
-
const timeoutId = setTimeout(() => controller.abort(), 1000);
|
|
60
|
-
|
|
61
|
-
const response = await fetch(`${url}/health`, {
|
|
62
|
-
signal: controller.signal,
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
clearTimeout(timeoutId);
|
|
66
|
-
|
|
67
|
-
if (response.ok) {
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
} catch {
|
|
71
|
-
// Server not ready yet, wait and retry
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
await new Promise((r) => setTimeout(r, 200));
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Normalize path to handle macOS symlinks (/var -> /private/var)
|
|
82
|
-
*/
|
|
83
|
-
function normalizePath(p: string): string {
|
|
84
|
-
// On macOS, /var, /tmp, /etc are symlinks to /private/...
|
|
85
|
-
if (p.startsWith("/private/")) {
|
|
86
|
-
return p.substring("/private".length);
|
|
87
|
-
}
|
|
88
|
-
return p;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Get the project ID for our test project from the server (with retry)
|
|
93
|
-
*/
|
|
94
|
-
async function getProjectId(
|
|
95
|
-
serverUrl: string,
|
|
96
|
-
projectPath: string,
|
|
97
|
-
maxRetries: number = 10
|
|
98
|
-
): Promise<string> {
|
|
99
|
-
const normalizedPath = normalizePath(projectPath);
|
|
100
|
-
|
|
101
|
-
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
102
|
-
try {
|
|
103
|
-
const response = await fetch(`${serverUrl}/api/projects`);
|
|
104
|
-
const result = await response.json();
|
|
105
|
-
|
|
106
|
-
if (!result.success || !Array.isArray(result.data)) {
|
|
107
|
-
if (process.env.DEBUG_E2E) {
|
|
108
|
-
console.log(`[getProjectId] API returned: ${JSON.stringify(result)}`);
|
|
109
|
-
}
|
|
110
|
-
await new Promise((r) => setTimeout(r, 500));
|
|
111
|
-
continue;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// Find project matching our path (handle symlinks)
|
|
115
|
-
const project = result.data.find((p: { path: string; id: string }) => {
|
|
116
|
-
const normalizedProjectPath = normalizePath(p.path);
|
|
117
|
-
return normalizedProjectPath === normalizedPath;
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
if (project) {
|
|
121
|
-
return project.id;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
if (process.env.DEBUG_E2E) {
|
|
125
|
-
console.log(`[getProjectId] Looking for: ${normalizedPath}`);
|
|
126
|
-
console.log(`[getProjectId] Available projects: ${result.data.map((p: { path: string }) => normalizePath(p.path)).join(", ")}`);
|
|
127
|
-
}
|
|
128
|
-
} catch (err) {
|
|
129
|
-
if (process.env.DEBUG_E2E) {
|
|
130
|
-
console.log(`[getProjectId] Error: ${err}`);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// Wait before retry
|
|
135
|
-
await new Promise((r) => setTimeout(r, 500));
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
throw new Error(`Project not found for path: ${projectPath} after ${maxRetries} retries`);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Start the sudocode server
|
|
143
|
-
*/
|
|
144
|
-
async function startServer(): Promise<void> {
|
|
145
|
-
// Kill any stale processes on the test port
|
|
146
|
-
try {
|
|
147
|
-
execSync(`lsof -t -i :${TEST_PORT} | xargs kill -9 2>/dev/null || true`, {
|
|
148
|
-
stdio: "ignore",
|
|
149
|
-
});
|
|
150
|
-
} catch {
|
|
151
|
-
// Ignore errors - no stale process to kill
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// Create temporary project directory
|
|
155
|
-
projectDir = mkdtempSync(join(tmpdir(), "sudocode-e2e-"));
|
|
156
|
-
|
|
157
|
-
// Initialize sudocode in the project directory
|
|
158
|
-
await new Promise<void>((resolve, reject) => {
|
|
159
|
-
const initProcess = spawn("npx", ["sudocode", "init"], {
|
|
160
|
-
cwd: projectDir!,
|
|
161
|
-
stdio: "pipe",
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
initProcess.on("close", (code) => {
|
|
165
|
-
if (code === 0) {
|
|
166
|
-
resolve();
|
|
167
|
-
} else {
|
|
168
|
-
reject(new Error(`sudocode init failed with code ${code}`));
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
initProcess.on("error", reject);
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
// Start the server
|
|
176
|
-
serverProcess = spawn(
|
|
177
|
-
"npx",
|
|
178
|
-
["sudocode", "server", "-p", String(TEST_PORT)],
|
|
179
|
-
{
|
|
180
|
-
cwd: projectDir,
|
|
181
|
-
stdio: "pipe",
|
|
182
|
-
env: { ...process.env, FORCE_COLOR: "0" },
|
|
183
|
-
}
|
|
184
|
-
);
|
|
185
|
-
|
|
186
|
-
// Log server output for debugging
|
|
187
|
-
serverProcess.stdout?.on("data", (data) => {
|
|
188
|
-
if (process.env.DEBUG_E2E) {
|
|
189
|
-
console.log(`[server stdout] ${data}`);
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
serverProcess.stderr?.on("data", (data) => {
|
|
194
|
-
if (process.env.DEBUG_E2E) {
|
|
195
|
-
console.error(`[server stderr] ${data}`);
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
serverProcess.on("error", (err) => {
|
|
200
|
-
console.error("Server process error:", err);
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
// Wait for server to be ready
|
|
204
|
-
const ready = await waitForServer(SERVER_URL);
|
|
205
|
-
if (!ready) {
|
|
206
|
-
throw new Error(
|
|
207
|
-
`Server failed to start within ${SERVER_STARTUP_TIMEOUT}ms`
|
|
208
|
-
);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// Get the actual project ID assigned by the server
|
|
212
|
-
projectId = await getProjectId(SERVER_URL, projectDir);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Stop the sudocode server
|
|
217
|
-
*/
|
|
218
|
-
async function stopServer(): Promise<void> {
|
|
219
|
-
if (serverProcess) {
|
|
220
|
-
// Send SIGTERM
|
|
221
|
-
serverProcess.kill("SIGTERM");
|
|
222
|
-
|
|
223
|
-
// Wait for process to exit
|
|
224
|
-
await new Promise<void>((resolve) => {
|
|
225
|
-
const timeout = setTimeout(() => {
|
|
226
|
-
// Force kill if it doesn't exit gracefully
|
|
227
|
-
serverProcess?.kill("SIGKILL");
|
|
228
|
-
resolve();
|
|
229
|
-
}, 5000);
|
|
230
|
-
|
|
231
|
-
serverProcess!.on("close", () => {
|
|
232
|
-
clearTimeout(timeout);
|
|
233
|
-
resolve();
|
|
234
|
-
});
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
serverProcess = null;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// Clean up project directory
|
|
241
|
-
if (projectDir && existsSync(projectDir)) {
|
|
242
|
-
rmSync(projectDir, { recursive: true, force: true });
|
|
243
|
-
projectDir = null;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* Create a test issue via the API
|
|
249
|
-
*/
|
|
250
|
-
async function createTestIssue(
|
|
251
|
-
title: string,
|
|
252
|
-
content?: string
|
|
253
|
-
): Promise<Issue> {
|
|
254
|
-
const response = await fetch(`${SERVER_URL}/api/issues`, {
|
|
255
|
-
method: "POST",
|
|
256
|
-
headers: {
|
|
257
|
-
"Content-Type": "application/json",
|
|
258
|
-
"X-Project-ID": projectId!,
|
|
259
|
-
},
|
|
260
|
-
body: JSON.stringify({
|
|
261
|
-
title,
|
|
262
|
-
content: content ?? `Test content for ${title}`,
|
|
263
|
-
status: "open",
|
|
264
|
-
priority: 2,
|
|
265
|
-
}),
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
const result = await response.json();
|
|
269
|
-
if (!result.success) {
|
|
270
|
-
throw new Error(`Failed to create issue: ${result.message}`);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
createdIssueIds.push(result.data.id);
|
|
274
|
-
return result.data;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
/**
|
|
278
|
-
* Create a test spec via the API
|
|
279
|
-
*/
|
|
280
|
-
async function createTestSpec(title: string, content?: string): Promise<Spec> {
|
|
281
|
-
const response = await fetch(`${SERVER_URL}/api/specs`, {
|
|
282
|
-
method: "POST",
|
|
283
|
-
headers: {
|
|
284
|
-
"Content-Type": "application/json",
|
|
285
|
-
"X-Project-ID": projectId!,
|
|
286
|
-
},
|
|
287
|
-
body: JSON.stringify({
|
|
288
|
-
title,
|
|
289
|
-
file_path: `specs/${title.toLowerCase().replace(/\s+/g, "-")}.md`,
|
|
290
|
-
content: content ?? `Test spec content for ${title}`,
|
|
291
|
-
priority: 2,
|
|
292
|
-
}),
|
|
293
|
-
});
|
|
294
|
-
|
|
295
|
-
const result = await response.json();
|
|
296
|
-
if (!result.success) {
|
|
297
|
-
throw new Error(`Failed to create spec: ${result.message}`);
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
createdSpecIds.push(result.data.id);
|
|
301
|
-
return result.data;
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
describe("ServerClient E2E", () => {
|
|
305
|
-
let client: ServerClient;
|
|
306
|
-
|
|
307
|
-
beforeAll(async () => {
|
|
308
|
-
console.log("\n🚀 Starting sudocode server for E2E tests...");
|
|
309
|
-
await startServer();
|
|
310
|
-
console.log(`✅ Server ready at ${SERVER_URL}\n`);
|
|
311
|
-
}, SERVER_STARTUP_TIMEOUT + 5000);
|
|
312
|
-
|
|
313
|
-
afterAll(async () => {
|
|
314
|
-
console.log("\n🛑 Shutting down sudocode server...");
|
|
315
|
-
await stopServer();
|
|
316
|
-
console.log("✅ Cleanup complete\n");
|
|
317
|
-
}, 10000);
|
|
318
|
-
|
|
319
|
-
beforeEach(async () => {
|
|
320
|
-
client = new ServerClient({
|
|
321
|
-
serverUrl: SERVER_URL,
|
|
322
|
-
wsUrl: WS_URL,
|
|
323
|
-
projectId: projectId!,
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
// Wait for WebSocket connection
|
|
327
|
-
await new Promise<void>((resolve, reject) => {
|
|
328
|
-
const timeout = setTimeout(() => {
|
|
329
|
-
reject(new Error("WebSocket connection timeout"));
|
|
330
|
-
}, 5000);
|
|
331
|
-
|
|
332
|
-
const checkReady = () => {
|
|
333
|
-
if (client.isReady()) {
|
|
334
|
-
clearTimeout(timeout);
|
|
335
|
-
resolve();
|
|
336
|
-
} else {
|
|
337
|
-
setTimeout(checkReady, 50);
|
|
338
|
-
}
|
|
339
|
-
};
|
|
340
|
-
checkReady();
|
|
341
|
-
});
|
|
342
|
-
});
|
|
343
|
-
|
|
344
|
-
afterEach(() => {
|
|
345
|
-
if (client) {
|
|
346
|
-
client.close();
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
describe("Connection", () => {
|
|
351
|
-
it(
|
|
352
|
-
"should connect to the server via WebSocket",
|
|
353
|
-
{ timeout: TEST_TIMEOUT },
|
|
354
|
-
async () => {
|
|
355
|
-
expect(client.isReady()).toBe(true);
|
|
356
|
-
}
|
|
357
|
-
);
|
|
358
|
-
});
|
|
359
|
-
|
|
360
|
-
describe("Issue Operations", () => {
|
|
361
|
-
it(
|
|
362
|
-
"should get an issue by ID",
|
|
363
|
-
{ timeout: TEST_TIMEOUT },
|
|
364
|
-
async () => {
|
|
365
|
-
const created = await createTestIssue("E2E Test Issue - Get");
|
|
366
|
-
|
|
367
|
-
const issue = await client.getIssue(created.id);
|
|
368
|
-
|
|
369
|
-
expect(issue).not.toBeNull();
|
|
370
|
-
expect(issue!.id).toBe(created.id);
|
|
371
|
-
expect(issue!.title).toBe("E2E Test Issue - Get");
|
|
372
|
-
}
|
|
373
|
-
);
|
|
374
|
-
|
|
375
|
-
it(
|
|
376
|
-
"should return null for non-existent issue",
|
|
377
|
-
{ timeout: TEST_TIMEOUT },
|
|
378
|
-
async () => {
|
|
379
|
-
const issue = await client.getIssue("i-nonexistent-12345");
|
|
380
|
-
expect(issue).toBeNull();
|
|
381
|
-
}
|
|
382
|
-
);
|
|
383
|
-
|
|
384
|
-
it(
|
|
385
|
-
"should list issues",
|
|
386
|
-
{ timeout: TEST_TIMEOUT },
|
|
387
|
-
async () => {
|
|
388
|
-
await createTestIssue("E2E Test Issue - List 1");
|
|
389
|
-
await createTestIssue("E2E Test Issue - List 2");
|
|
390
|
-
|
|
391
|
-
const issues = await client.listIssues();
|
|
392
|
-
|
|
393
|
-
expect(Array.isArray(issues)).toBe(true);
|
|
394
|
-
expect(issues.length).toBeGreaterThanOrEqual(2);
|
|
395
|
-
}
|
|
396
|
-
);
|
|
397
|
-
|
|
398
|
-
it(
|
|
399
|
-
"should filter issues by status",
|
|
400
|
-
{ timeout: TEST_TIMEOUT },
|
|
401
|
-
async () => {
|
|
402
|
-
await createTestIssue("E2E Open Issue");
|
|
403
|
-
|
|
404
|
-
const openIssues = await client.listIssues({ status: "open" });
|
|
405
|
-
|
|
406
|
-
expect(Array.isArray(openIssues)).toBe(true);
|
|
407
|
-
expect(openIssues.every((i) => i.status === "open")).toBe(true);
|
|
408
|
-
}
|
|
409
|
-
);
|
|
410
|
-
|
|
411
|
-
it(
|
|
412
|
-
"should search issues by text",
|
|
413
|
-
{ timeout: TEST_TIMEOUT },
|
|
414
|
-
async () => {
|
|
415
|
-
const uniqueText = `unique-search-term-${Date.now()}`;
|
|
416
|
-
await createTestIssue(`E2E Search Issue ${uniqueText}`);
|
|
417
|
-
|
|
418
|
-
const results = await client.listIssues({ search: uniqueText });
|
|
419
|
-
|
|
420
|
-
expect(results.length).toBeGreaterThanOrEqual(1);
|
|
421
|
-
expect(results.some((i) => i.title.includes(uniqueText))).toBe(true);
|
|
422
|
-
}
|
|
423
|
-
);
|
|
424
|
-
|
|
425
|
-
it(
|
|
426
|
-
"should get ready issues",
|
|
427
|
-
{ timeout: TEST_TIMEOUT },
|
|
428
|
-
async () => {
|
|
429
|
-
await createTestIssue("E2E Ready Issue");
|
|
430
|
-
|
|
431
|
-
const readyIssues = await client.getReadyIssues();
|
|
432
|
-
|
|
433
|
-
expect(Array.isArray(readyIssues)).toBe(true);
|
|
434
|
-
}
|
|
435
|
-
);
|
|
436
|
-
|
|
437
|
-
it(
|
|
438
|
-
"should update an issue",
|
|
439
|
-
{ timeout: TEST_TIMEOUT },
|
|
440
|
-
async () => {
|
|
441
|
-
const created = await createTestIssue("E2E Test Issue - Update");
|
|
442
|
-
|
|
443
|
-
const updated = await client.updateIssue(created.id, {
|
|
444
|
-
title: "E2E Test Issue - Updated",
|
|
445
|
-
status: "in_progress",
|
|
446
|
-
});
|
|
447
|
-
|
|
448
|
-
expect(updated.title).toBe("E2E Test Issue - Updated");
|
|
449
|
-
expect(updated.status).toBe("in_progress");
|
|
450
|
-
|
|
451
|
-
// Verify persistence
|
|
452
|
-
const retrieved = await client.getIssue(created.id);
|
|
453
|
-
expect(retrieved!.title).toBe("E2E Test Issue - Updated");
|
|
454
|
-
}
|
|
455
|
-
);
|
|
456
|
-
});
|
|
457
|
-
|
|
458
|
-
describe("Spec Operations", () => {
|
|
459
|
-
it(
|
|
460
|
-
"should get a spec by ID",
|
|
461
|
-
{ timeout: TEST_TIMEOUT },
|
|
462
|
-
async () => {
|
|
463
|
-
const created = await createTestSpec("E2E Test Spec - Get");
|
|
464
|
-
|
|
465
|
-
const spec = await client.getSpec(created.id);
|
|
466
|
-
|
|
467
|
-
expect(spec).not.toBeNull();
|
|
468
|
-
expect(spec!.id).toBe(created.id);
|
|
469
|
-
expect(spec!.title).toBe("E2E Test Spec - Get");
|
|
470
|
-
}
|
|
471
|
-
);
|
|
472
|
-
|
|
473
|
-
it(
|
|
474
|
-
"should return null for non-existent spec",
|
|
475
|
-
{ timeout: TEST_TIMEOUT },
|
|
476
|
-
async () => {
|
|
477
|
-
const spec = await client.getSpec("s-nonexistent-12345");
|
|
478
|
-
expect(spec).toBeNull();
|
|
479
|
-
}
|
|
480
|
-
);
|
|
481
|
-
|
|
482
|
-
it(
|
|
483
|
-
"should list specs",
|
|
484
|
-
{ timeout: TEST_TIMEOUT },
|
|
485
|
-
async () => {
|
|
486
|
-
await createTestSpec("E2E Test Spec - List 1");
|
|
487
|
-
await createTestSpec("E2E Test Spec - List 2");
|
|
488
|
-
|
|
489
|
-
const specs = await client.listSpecs();
|
|
490
|
-
|
|
491
|
-
expect(Array.isArray(specs)).toBe(true);
|
|
492
|
-
expect(specs.length).toBeGreaterThanOrEqual(2);
|
|
493
|
-
}
|
|
494
|
-
);
|
|
495
|
-
|
|
496
|
-
it(
|
|
497
|
-
"should search specs by text",
|
|
498
|
-
{ timeout: TEST_TIMEOUT },
|
|
499
|
-
async () => {
|
|
500
|
-
const uniqueText = `unique-spec-term-${Date.now()}`;
|
|
501
|
-
await createTestSpec(`E2E Search Spec ${uniqueText}`);
|
|
502
|
-
|
|
503
|
-
const results = await client.listSpecs({ search: uniqueText });
|
|
504
|
-
|
|
505
|
-
expect(results.length).toBeGreaterThanOrEqual(1);
|
|
506
|
-
expect(results.some((s) => s.title.includes(uniqueText))).toBe(true);
|
|
507
|
-
}
|
|
508
|
-
);
|
|
509
|
-
});
|
|
510
|
-
|
|
511
|
-
describe("Relationship Operations", () => {
|
|
512
|
-
it(
|
|
513
|
-
"should create and query blocking relationships",
|
|
514
|
-
{ timeout: TEST_TIMEOUT },
|
|
515
|
-
async () => {
|
|
516
|
-
const blocker = await createTestIssue("E2E Blocker Issue");
|
|
517
|
-
const blocked = await createTestIssue("E2E Blocked Issue");
|
|
518
|
-
|
|
519
|
-
// Create blocks relationship
|
|
520
|
-
await client.createLink(blocker.id, blocked.id, "blocks");
|
|
521
|
-
|
|
522
|
-
// Query blockers
|
|
523
|
-
const blockers = await client.getBlockers(blocked.id);
|
|
524
|
-
expect(blockers.some((b) => b.id === blocker.id)).toBe(true);
|
|
525
|
-
|
|
526
|
-
// Query blocking
|
|
527
|
-
const blocking = await client.getBlocking(blocker.id);
|
|
528
|
-
expect(blocking.some((b) => b.id === blocked.id)).toBe(true);
|
|
529
|
-
}
|
|
530
|
-
);
|
|
531
|
-
|
|
532
|
-
it(
|
|
533
|
-
"should remove blocking relationships",
|
|
534
|
-
{ timeout: TEST_TIMEOUT },
|
|
535
|
-
async () => {
|
|
536
|
-
const blocker = await createTestIssue("E2E Blocker to Remove");
|
|
537
|
-
const blocked = await createTestIssue("E2E Blocked to Unblock");
|
|
538
|
-
|
|
539
|
-
// Create and then remove relationship
|
|
540
|
-
await client.createLink(blocker.id, blocked.id, "blocks");
|
|
541
|
-
await client.removeLink(blocker.id, blocked.id, "blocks");
|
|
542
|
-
|
|
543
|
-
// Verify removal
|
|
544
|
-
const blockers = await client.getBlockers(blocked.id);
|
|
545
|
-
expect(blockers.every((b) => b.id !== blocker.id)).toBe(true);
|
|
546
|
-
}
|
|
547
|
-
);
|
|
548
|
-
|
|
549
|
-
it(
|
|
550
|
-
"should create implements relationship",
|
|
551
|
-
{ timeout: TEST_TIMEOUT },
|
|
552
|
-
async () => {
|
|
553
|
-
const spec = await createTestSpec("E2E Spec to Implement");
|
|
554
|
-
const issue = await createTestIssue("E2E Implementing Issue");
|
|
555
|
-
|
|
556
|
-
// Create implements relationship - should complete without error
|
|
557
|
-
await client.createLink(issue.id, spec.id, "implements");
|
|
558
|
-
}
|
|
559
|
-
);
|
|
560
|
-
});
|
|
561
|
-
|
|
562
|
-
describe("Event Subscriptions", () => {
|
|
563
|
-
it(
|
|
564
|
-
"should receive events when issues change",
|
|
565
|
-
{ timeout: TEST_TIMEOUT },
|
|
566
|
-
async () => {
|
|
567
|
-
const events: Array<{ type: string; issueId: string }> = [];
|
|
568
|
-
|
|
569
|
-
const unsubscribe = client.onIssueChange((event) => {
|
|
570
|
-
events.push({ type: event.type, issueId: event.issueId });
|
|
571
|
-
});
|
|
572
|
-
|
|
573
|
-
try {
|
|
574
|
-
// Create an issue to trigger an event
|
|
575
|
-
const issue = await createTestIssue("E2E Event Test Issue");
|
|
576
|
-
|
|
577
|
-
// Wait for the issue to be available via the client (with retry)
|
|
578
|
-
let issueAvailable = false;
|
|
579
|
-
for (let i = 0; i < 10; i++) {
|
|
580
|
-
const found = await client.getIssue(issue.id);
|
|
581
|
-
if (found) {
|
|
582
|
-
issueAvailable = true;
|
|
583
|
-
break;
|
|
584
|
-
}
|
|
585
|
-
await new Promise((r) => setTimeout(r, 200));
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
if (!issueAvailable) {
|
|
589
|
-
// Skip update if issue not available - this is a server sync issue
|
|
590
|
-
console.warn(`Issue ${issue.id} not available via client, skipping update`);
|
|
591
|
-
} else {
|
|
592
|
-
// Update the issue
|
|
593
|
-
await client.updateIssue(issue.id, { title: "E2E Updated Title" });
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
await new Promise((r) => setTimeout(r, 500));
|
|
597
|
-
|
|
598
|
-
// We should have received some events
|
|
599
|
-
// Note: This depends on server WebSocket implementation
|
|
600
|
-
expect(events.length).toBeGreaterThanOrEqual(0);
|
|
601
|
-
} finally {
|
|
602
|
-
unsubscribe();
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
);
|
|
606
|
-
|
|
607
|
-
it(
|
|
608
|
-
"should filter events by issue ID",
|
|
609
|
-
{ timeout: TEST_TIMEOUT },
|
|
610
|
-
async () => {
|
|
611
|
-
const issue1 = await createTestIssue("E2E Event Filter Issue 1");
|
|
612
|
-
const issue2 = await createTestIssue("E2E Event Filter Issue 2");
|
|
613
|
-
|
|
614
|
-
const events: string[] = [];
|
|
615
|
-
|
|
616
|
-
const unsubscribe = client.onIssueChange(issue1.id, (event) => {
|
|
617
|
-
events.push(event.issueId);
|
|
618
|
-
});
|
|
619
|
-
|
|
620
|
-
try {
|
|
621
|
-
// Update both issues
|
|
622
|
-
await client.updateIssue(issue1.id, { title: "Updated 1" });
|
|
623
|
-
await client.updateIssue(issue2.id, { title: "Updated 2" });
|
|
624
|
-
|
|
625
|
-
await new Promise((r) => setTimeout(r, 500));
|
|
626
|
-
|
|
627
|
-
// Should only have events for issue1 (if any)
|
|
628
|
-
expect(events.every((id) => id === issue1.id)).toBe(true);
|
|
629
|
-
} finally {
|
|
630
|
-
unsubscribe();
|
|
631
|
-
}
|
|
632
|
-
}
|
|
633
|
-
);
|
|
634
|
-
});
|
|
635
|
-
|
|
636
|
-
describe("Feedback Operations", () => {
|
|
637
|
-
it(
|
|
638
|
-
"should add feedback to a spec",
|
|
639
|
-
{ timeout: TEST_TIMEOUT },
|
|
640
|
-
async () => {
|
|
641
|
-
const spec = await createTestSpec("E2E Feedback Target Spec");
|
|
642
|
-
const issue = await createTestIssue("E2E Feedback Source Issue");
|
|
643
|
-
|
|
644
|
-
// Add feedback - should complete without error
|
|
645
|
-
await client.addFeedback(issue.id, spec.id, {
|
|
646
|
-
type: "suggestion",
|
|
647
|
-
content: "E2E test feedback content",
|
|
648
|
-
agent: "e2e-test-agent",
|
|
649
|
-
});
|
|
650
|
-
}
|
|
651
|
-
);
|
|
652
|
-
|
|
653
|
-
it(
|
|
654
|
-
"should add anonymous feedback",
|
|
655
|
-
{ timeout: TEST_TIMEOUT },
|
|
656
|
-
async () => {
|
|
657
|
-
const spec = await createTestSpec("E2E Anonymous Feedback Spec");
|
|
658
|
-
|
|
659
|
-
// Add anonymous feedback
|
|
660
|
-
await client.addFeedback(undefined, spec.id, {
|
|
661
|
-
type: "comment",
|
|
662
|
-
content: "E2E anonymous feedback",
|
|
663
|
-
});
|
|
664
|
-
}
|
|
665
|
-
);
|
|
666
|
-
});
|
|
667
|
-
|
|
668
|
-
describe("Error Handling", () => {
|
|
669
|
-
it(
|
|
670
|
-
"should handle server errors gracefully",
|
|
671
|
-
{ timeout: TEST_TIMEOUT },
|
|
672
|
-
async () => {
|
|
673
|
-
// Try to update a non-existent issue
|
|
674
|
-
await expect(
|
|
675
|
-
client.updateIssue("i-nonexistent-99999", { title: "Won't work" })
|
|
676
|
-
).rejects.toThrow();
|
|
677
|
-
}
|
|
678
|
-
);
|
|
679
|
-
});
|
|
680
|
-
});
|