macro-agent 0.1.0 → 0.1.1
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/specs.jsonl +4 -0
- package/CLAUDE.md +16 -14
- 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 +464 -183
- package/dist/agent/agent-manager.js.map +1 -1
- package/dist/agent/types.d.ts +1 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/api/server.d.ts +3 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +37 -6
- package/dist/api/server.js.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 +127 -61
- package/dist/cli/acp.js.map +1 -1
- package/dist/cli/index.js +147 -15
- 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 +268 -181
- 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 +74 -7
- package/dist/config/project-config.d.ts.map +1 -1
- package/dist/config/project-config.js +123 -20
- package/dist/config/project-config.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 +10 -1
- package/dist/map/adapter/extensions/index.d.ts.map +1 -1
- package/dist/map/adapter/extensions/index.js +34 -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/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 +8 -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 +2 -0
- 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 +14 -0
- package/dist/mcp/mcp-server.d.ts.map +1 -1
- package/dist/mcp/mcp-server.js +113 -85
- package/dist/mcp/mcp-server.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/capabilities.d.ts +3 -1
- package/dist/roles/capabilities.d.ts.map +1 -1
- package/dist/roles/capabilities.js +17 -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 +6 -6
- 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/server/combined-server.d.ts +20 -0
- package/dist/server/combined-server.d.ts.map +1 -1
- package/dist/server/combined-server.js +107 -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 +69 -20
- package/dist/store/event-store.js.map +1 -1
- package/dist/store/types/agents.d.ts +18 -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/team-loader.d.ts +2 -2
- package/dist/teams/team-loader.js +3 -3
- package/dist/teams/team-loader.js.map +1 -1
- package/dist/teams/team-runtime.d.ts.map +1 -1
- package/dist/teams/team-runtime.js +2 -0
- package/dist/teams/team-runtime.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 +3 -3
- package/docs/troubleshooting.md +10 -11
- package/package.json +6 -4
- 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 +714 -261
- package/src/agent/types.ts +3 -1
- package/src/api/server.ts +41 -7
- 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 +130 -72
- package/src/cli/index.ts +120 -14
- package/src/cli/mcp.ts +311 -207
- package/src/cli/parse-args.ts +54 -0
- package/src/cli/stable-instance-id.ts +14 -0
- package/src/config/project-config.ts +190 -27
- package/src/lifecycle/__tests__/cascade-termination.test.ts +1 -1
- 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__/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 +60 -0
- package/src/map/adapter/extensions/mcp-bridge.ts +995 -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 +28 -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 +2 -0
- 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 +191 -100
- 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/capabilities.ts +17 -7
- package/src/roles/config-loader.ts +6 -6
- package/src/roles/registry.ts +2 -2
- package/src/server/__tests__/combined-server.test.ts +94 -21
- package/src/server/combined-server.ts +189 -33
- package/src/steering/__tests__/steering-integration.test.ts +1 -1
- 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 +80 -21
- package/src/store/types/agents.ts +15 -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__/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 +253 -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/__tests__/cross-subsystem.integration.test.ts +1 -1
- package/src/teams/team-loader.ts +3 -3
- package/src/teams/team-runtime.ts +2 -0
- 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,265 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mapping and Transformation Edge Case Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for edge cases in status mapping between sudocode issues and macro-agent tasks.
|
|
5
|
-
*
|
|
6
|
-
* @module task/backend/sudocode/__tests__/mapping-edge-cases.test
|
|
7
|
-
* @see s-8472 Pluggable Task Backend Integration
|
|
8
|
-
* @see s-1zcx Multi-Agent Orchestration Testing Strategy
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { describe, it, expect } from "vitest";
|
|
12
|
-
import {
|
|
13
|
-
mapSudocodeStatus,
|
|
14
|
-
mapTaskStatus,
|
|
15
|
-
mapIssuePriority,
|
|
16
|
-
isIssueComplete,
|
|
17
|
-
isIssueBlocked,
|
|
18
|
-
} from "../mapping.js";
|
|
19
|
-
import type { IssueStatus } from "../client.js";
|
|
20
|
-
import type { TaskStatus } from "../../../../store/types/index.js";
|
|
21
|
-
|
|
22
|
-
describe("Status Mapping", () => {
|
|
23
|
-
describe("mapSudocodeStatus", () => {
|
|
24
|
-
it("should map 'open' to 'pending'", () => {
|
|
25
|
-
expect(mapSudocodeStatus("open")).toBe("pending");
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it("should map 'in_progress' to 'in_progress'", () => {
|
|
29
|
-
expect(mapSudocodeStatus("in_progress")).toBe("in_progress");
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it("should map 'blocked' to 'pending'", () => {
|
|
33
|
-
// Blocked status maps to pending because isBlocked flag handles blocking
|
|
34
|
-
expect(mapSudocodeStatus("blocked")).toBe("pending");
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it("should map 'closed' to 'completed'", () => {
|
|
38
|
-
expect(mapSudocodeStatus("closed")).toBe("completed");
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it("should default to 'pending' for unknown status", () => {
|
|
42
|
-
// TypeScript won't allow this at compile time, but test runtime behavior
|
|
43
|
-
expect(mapSudocodeStatus("unknown" as IssueStatus)).toBe("pending");
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it("should handle all valid IssueStatus values", () => {
|
|
47
|
-
const statuses: IssueStatus[] = ["open", "in_progress", "blocked", "closed"];
|
|
48
|
-
|
|
49
|
-
for (const status of statuses) {
|
|
50
|
-
const result = mapSudocodeStatus(status);
|
|
51
|
-
expect(["pending", "in_progress", "completed"]).toContain(result);
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
describe("mapTaskStatus", () => {
|
|
57
|
-
it("should map 'pending' to 'open'", () => {
|
|
58
|
-
expect(mapTaskStatus("pending")).toBe("open");
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it("should map 'assigned' to 'in_progress'", () => {
|
|
62
|
-
// Note: assigned has no direct sudocode equivalent
|
|
63
|
-
expect(mapTaskStatus("assigned")).toBe("in_progress");
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it("should map 'in_progress' to 'in_progress'", () => {
|
|
67
|
-
expect(mapTaskStatus("in_progress")).toBe("in_progress");
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it("should map 'completed' to 'closed'", () => {
|
|
71
|
-
expect(mapTaskStatus("completed")).toBe("closed");
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it("should map 'failed' to 'closed'", () => {
|
|
75
|
-
// Note: failed also maps to closed (failure tracked in outputs)
|
|
76
|
-
expect(mapTaskStatus("failed")).toBe("closed");
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it("should default to 'open' for unknown status", () => {
|
|
80
|
-
expect(mapTaskStatus("unknown" as TaskStatus)).toBe("open");
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it("should handle all valid TaskStatus values", () => {
|
|
84
|
-
const statuses: TaskStatus[] = [
|
|
85
|
-
"pending",
|
|
86
|
-
"assigned",
|
|
87
|
-
"in_progress",
|
|
88
|
-
"completed",
|
|
89
|
-
"failed",
|
|
90
|
-
];
|
|
91
|
-
|
|
92
|
-
for (const status of statuses) {
|
|
93
|
-
const result = mapTaskStatus(status);
|
|
94
|
-
expect(["open", "in_progress", "closed"]).toContain(result);
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
describe("round-trip mapping consistency", () => {
|
|
100
|
-
it("pending should round-trip correctly", () => {
|
|
101
|
-
const taskStatus: TaskStatus = "pending";
|
|
102
|
-
const issueStatus = mapTaskStatus(taskStatus);
|
|
103
|
-
const backToTask = mapSudocodeStatus(issueStatus);
|
|
104
|
-
expect(backToTask).toBe(taskStatus);
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it("in_progress should round-trip correctly", () => {
|
|
108
|
-
const taskStatus: TaskStatus = "in_progress";
|
|
109
|
-
const issueStatus = mapTaskStatus(taskStatus);
|
|
110
|
-
const backToTask = mapSudocodeStatus(issueStatus);
|
|
111
|
-
expect(backToTask).toBe(taskStatus);
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
it("completed should round-trip correctly", () => {
|
|
115
|
-
const taskStatus: TaskStatus = "completed";
|
|
116
|
-
const issueStatus = mapTaskStatus(taskStatus);
|
|
117
|
-
const backToTask = mapSudocodeStatus(issueStatus);
|
|
118
|
-
expect(backToTask).toBe(taskStatus);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it("assigned loses precision on round-trip (becomes in_progress)", () => {
|
|
122
|
-
// This is expected behavior - assigned maps to in_progress which maps back to in_progress
|
|
123
|
-
const taskStatus: TaskStatus = "assigned";
|
|
124
|
-
const issueStatus = mapTaskStatus(taskStatus);
|
|
125
|
-
const backToTask = mapSudocodeStatus(issueStatus);
|
|
126
|
-
expect(backToTask).toBe("in_progress"); // Not "assigned"
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it("failed loses precision on round-trip (becomes completed)", () => {
|
|
130
|
-
// This is expected behavior - failed maps to closed which maps back to completed
|
|
131
|
-
const taskStatus: TaskStatus = "failed";
|
|
132
|
-
const issueStatus = mapTaskStatus(taskStatus);
|
|
133
|
-
const backToTask = mapSudocodeStatus(issueStatus);
|
|
134
|
-
expect(backToTask).toBe("completed"); // Not "failed"
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
it("blocked loses information (becomes pending)", () => {
|
|
138
|
-
// blocked status doesn't have a task equivalent
|
|
139
|
-
const issueStatus: IssueStatus = "blocked";
|
|
140
|
-
const taskStatus = mapSudocodeStatus(issueStatus);
|
|
141
|
-
expect(taskStatus).toBe("pending");
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
describe("Priority Mapping", () => {
|
|
147
|
-
describe("mapIssuePriority", () => {
|
|
148
|
-
it("should pass through valid priorities 0-4", () => {
|
|
149
|
-
expect(mapIssuePriority(0)).toBe(0);
|
|
150
|
-
expect(mapIssuePriority(1)).toBe(1);
|
|
151
|
-
expect(mapIssuePriority(2)).toBe(2);
|
|
152
|
-
expect(mapIssuePriority(3)).toBe(3);
|
|
153
|
-
expect(mapIssuePriority(4)).toBe(4);
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
it("should clamp negative values to 0", () => {
|
|
157
|
-
expect(mapIssuePriority(-1)).toBe(0);
|
|
158
|
-
expect(mapIssuePriority(-100)).toBe(0);
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
it("should clamp values above 4 to 4", () => {
|
|
162
|
-
expect(mapIssuePriority(5)).toBe(4);
|
|
163
|
-
expect(mapIssuePriority(100)).toBe(4);
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it("should handle floating point values", () => {
|
|
167
|
-
// This is edge case behavior - what happens with floats?
|
|
168
|
-
expect(mapIssuePriority(2.5)).toBe(2.5); // Passes through because Math.max/min don't round
|
|
169
|
-
expect(mapIssuePriority(0.1)).toBe(0.1);
|
|
170
|
-
expect(mapIssuePriority(-0.5)).toBe(0); // Clamped
|
|
171
|
-
expect(mapIssuePriority(4.5)).toBe(4); // Clamped
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
describe("Issue Status Helpers", () => {
|
|
177
|
-
describe("isIssueComplete", () => {
|
|
178
|
-
it("should return true for 'closed'", () => {
|
|
179
|
-
expect(isIssueComplete("closed")).toBe(true);
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
it("should return false for 'open'", () => {
|
|
183
|
-
expect(isIssueComplete("open")).toBe(false);
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
it("should return false for 'in_progress'", () => {
|
|
187
|
-
expect(isIssueComplete("in_progress")).toBe(false);
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
it("should return false for 'blocked'", () => {
|
|
191
|
-
expect(isIssueComplete("blocked")).toBe(false);
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
it("should return false for unknown status", () => {
|
|
195
|
-
expect(isIssueComplete("unknown" as IssueStatus)).toBe(false);
|
|
196
|
-
});
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
describe("isIssueBlocked", () => {
|
|
200
|
-
it("should return true for 'blocked'", () => {
|
|
201
|
-
expect(isIssueBlocked("blocked")).toBe(true);
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
it("should return false for 'open'", () => {
|
|
205
|
-
expect(isIssueBlocked("open")).toBe(false);
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
it("should return false for 'in_progress'", () => {
|
|
209
|
-
expect(isIssueBlocked("in_progress")).toBe(false);
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
it("should return false for 'closed'", () => {
|
|
213
|
-
expect(isIssueBlocked("closed")).toBe(false);
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
it("should return false for unknown status", () => {
|
|
217
|
-
expect(isIssueBlocked("unknown" as IssueStatus)).toBe(false);
|
|
218
|
-
});
|
|
219
|
-
});
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
describe("Mapping Documentation", () => {
|
|
223
|
-
/**
|
|
224
|
-
* This test documents the mapping behavior for reference.
|
|
225
|
-
* It's not really testing anything - it's a living documentation of the mapping.
|
|
226
|
-
*/
|
|
227
|
-
it("should document the complete status mapping", () => {
|
|
228
|
-
// Sudocode -> Task mapping
|
|
229
|
-
const sudocodeToTask = {
|
|
230
|
-
open: "pending",
|
|
231
|
-
in_progress: "in_progress",
|
|
232
|
-
blocked: "pending", // Note: isBlocked flag handles this
|
|
233
|
-
closed: "completed",
|
|
234
|
-
};
|
|
235
|
-
|
|
236
|
-
// Task -> Sudocode mapping
|
|
237
|
-
const taskToSudocode = {
|
|
238
|
-
pending: "open",
|
|
239
|
-
assigned: "in_progress", // Lossy: no sudocode equivalent
|
|
240
|
-
in_progress: "in_progress",
|
|
241
|
-
completed: "closed",
|
|
242
|
-
failed: "closed", // Lossy: failure tracked in outputs
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
// Verify mappings match
|
|
246
|
-
for (const [sudocode, task] of Object.entries(sudocodeToTask)) {
|
|
247
|
-
expect(mapSudocodeStatus(sudocode as IssueStatus)).toBe(task);
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
for (const [task, sudocode] of Object.entries(taskToSudocode)) {
|
|
251
|
-
expect(mapTaskStatus(task as TaskStatus)).toBe(sudocode);
|
|
252
|
-
}
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
it("should document lossy mappings", () => {
|
|
256
|
-
// These mappings lose information
|
|
257
|
-
const lossyMappings = [
|
|
258
|
-
{ from: "assigned", to: "in_progress", note: "No sudocode equivalent" },
|
|
259
|
-
{ from: "failed", to: "closed", note: "Failure info in outputs" },
|
|
260
|
-
{ from: "blocked", to: "pending", note: "isBlocked flag used instead" },
|
|
261
|
-
];
|
|
262
|
-
|
|
263
|
-
expect(lossyMappings).toHaveLength(3);
|
|
264
|
-
});
|
|
265
|
-
});
|