Full feature slice for organization-level team visibility.
- Builds a compact organization graph from teams, agents, active task summaries, and cross-team outbox messages.
- Supports a configurable organization tree with arbitrary
containernesting andteamreferences. - Renders the org map as a separate tab by adapting organization DTOs into
@claude-teams/agent-graph'sGraphDataPort. - Renders runtime cross-team communication as an overlay graph. Hierarchy does not restrict which teams can communicate.
- Keeps drill-down in the existing team and team graph screens.
contractsowns DTOs, route/channel constants, and transport normalization.core/domainowns pure policies: configured/default org graph building, agent/task projection, cross-team relation aggregation, and cycle detection helpers.core/applicationowns theGetOrganizationMapUseCaseand source ports.mainadapts JSON organization structure,TeamDataService, andCrossTeamServiceinto compact domain candidates.preloadexposes the Electron bridge.rendererowns view models, hooks, and presentational UI.
- Organization editing is metadata-only. It never creates, launches, deletes, or provisions teams.
- The editor writes
organizations/map.jsonthrough command use cases such asassignTeamToUnit,moveOrganizationUnit, andupsertOrganizationRelation. CreateTeamDialogcan optionally place a team after successful creation, but placement is a separate post-create organization command and is not part ofTeamCreateRequest. Placement failure is reported as a warning and does not roll back team creation.- Organization Map keeps an active organization selection so multi-organization structures can be viewed and edited one organization at a time.
- Drag/drop in the renderer moves containers and team references through the existing
moveOrganizationUnitcommand.
The main-process repository reads an optional JSON file at:
<appData>/data/organizations/map.json
Minimal shape:
{
"schemaVersion": 1,
"organizations": [{ "id": "default", "name": "My Organization", "rootUnitId": "root" }],
"units": [
{ "id": "root", "kind": "organization", "label": "My Organization" },
{ "id": "engineering", "parentId": "root", "kind": "container", "label": "Engineering" },
{
"id": "platform-slot",
"parentId": "engineering",
"kind": "team",
"label": "Platform",
"teamName": "platform"
}
],
"relations": [
{ "sourceTeamName": "platform", "targetTeamName": "growth", "kind": "depends_on" }
]
}kind is structural only: organization, container, or team. Product roles such as lead,
orchestrator, department, pod, or guild belong in label, title, or tags, not as hard-coded
domain enums.
- The map uses
listTeams, cappedgetAllTasks,listAliveProcessTeams, and cross-team outboxes. - It does not read member logs, task log streams, transcript bodies, or full
TeamViewSnapshotfor every team. - Container/team subtrees can be collapsed in the renderer. Cross-team edges are rerouted to the nearest visible ancestor.
- Renderer animation reuses
GraphView's single RAF loop, frustum culling, adaptive particle budget, and zoom/pan controls.