Configuration
Configuration
Section titled “Configuration”Squad Federation uses two configuration files: federate.config.json (federation-wide settings) and .squad/team-registry.json (registered teams).
federate.config.json
Section titled “federate.config.json”Located at the root of your repository. Created when you set up federation using the federation-setup skill.
Schema
Section titled “Schema”interface FederateConfig { // Optional: Federation description description?: string;
// Optional: Human-readable federation persona name // Used as the @handle in Teams — teams-presence listens for // messages containing @<federationName> in the configured channel. federationName?: string;
// Optional: Copilot binary/command for headless sessions // Used by launch.ts and teams-presence ACP session. // Default: 'copilot'. Set to e.g. 'github-copilot' or a full path // if the binary has a different name in your environment. copilotCommand?: string;
// Optional: Telemetry settings telemetry?: { enabled?: boolean; // Default: true aspire?: { endpoint?: string; // OpenTelemetry endpoint }; };
// Optional: Teams channel for meta-squad notifications // When configured, enables teams-presence (persistent Graph API + // ACP bridge) in addition to skill-layer posting. teamsConfig?: { teamId: string; // MS Teams team ID channelId: string; // MS Teams channel ID };
// Optional: Playbook skill name playbookSkill?: string; // Default: 'domain-playbook'
// Optional: Deliverable file name deliverable?: string; // Default: 'deliverable.md'
// Optional: Deliverable schema file deliverableSchema?: string;
// Optional: Import hook for custom initialization importHook?: string;
}Example (Minimal)
Section titled “Example (Minimal)”{ "description": "Development federation for product API", "telemetry": { "enabled": true }, "playbookSkill": "domain-playbook", "deliverable": "deliverable.md"}Example (With Teams Notifications)
Section titled “Example (With Teams Notifications)”{ "description": "Cross-team coordination with Teams updates", "teamsConfig": { "teamId": "19:abc123...", "channelId": "19:xyz789..." }, "telemetry": { "enabled": true, "aspire": { "endpoint": "http://localhost:18888" } }}Fields Reference
Section titled “Fields Reference”description
Section titled “description”Optional. Human-readable description of this federation’s purpose.
federationName
Section titled “federationName”Optional. The federation’s persona name, used as the @ handle in Teams. When teamsConfig is present, the teams-presence bridge listens for messages containing @<federationName> in the configured channel.
Required by: teams-presence.ts (throws if missing when teamsConfig is set)
Example:
{ "federationName": "my-squad"}Users then address the federation with @my-squad tell frontend to skip legacy utils in the Teams channel.
copilotCommand
Section titled “copilotCommand”Optional. The command used to launch headless Copilot sessions. Used by launch.ts (team launches) and teams-presence (ACP session).
Default: 'copilot'
Set this if your Copilot binary has a different name or path:
{ "copilotCommand": "github-copilot"}telemetry
Section titled “telemetry”Optional. OpenTelemetry configuration for monitoring team activity.
Defaults:
telemetry.enabled=truetelemetry.aspire.endpoint=http://localhost:18888(if enabled)
teamsConfig
Section titled “teamsConfig”Optional. Microsoft Teams channel for meta-squad notifications. When configured, the meta-squad skill layer posts summaries and the teams-presence bridge runs as a persistent process polling for @<federationName> messages via the Graph API.
teamId— Teams team GUID (find it in Teams admin or by using theListTeamsMCP tool)channelId— Channel ID within that team (format:19:...@thread.tacv2, find viaListChannelsMCP tool)
How it’s used:
- The federation-orchestration skill reads
teamsConfigand, when present, posts status summaries to the channel after every monitoring cycle - The teams-presence feature polls the channel for messages containing
@<federationName>and acts on them as user commands - This is entirely handled at the skill layer — no Teams SDK or API keys needed, the MCP tools handle authentication natively
Example:
{ "teamsConfig": { "teamId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "channelId": "19:meeting_ABC123@thread.tacv2" }}See Teams Notifications, Teams as meta notification channel, and the Teams Presence guide for usage details.
playbookSkill
Section titled “playbookSkill”Optional. Skill file name for domain-specific team instructions.
Default: domain-playbook
Teams look for .squad/skills/{playbookSkill}.md in their workspace.
deliverable
Section titled “deliverable”Optional. Output file name for team results.
Default: deliverable.md
deliverableSchema
Section titled “deliverableSchema”Optional. Path to JSON schema file for validating deliverable output.
importHook
Section titled “importHook”Optional. Path to custom TypeScript module for federation initialization hooks.
Example:
{ "importHook": "./hooks/federation-setup.ts"}.squad/team-registry.json
Section titled “.squad/team-registry.json”Tracks all registered teams. Managed automatically by the system—do not edit manually.
Schema
Section titled “Schema”interface TeamRegistry { lastUpdated: string; lockVersion: number; teams: TeamRegistryEntry[];}
interface TeamRegistryEntry { domain: string; domainId: string; archetypeId: string; placementType: 'worktree' | 'directory'; onboardedAt: string; location: string; status?: 'active' | 'paused' | 'archived'; lastActive?: string;}Example
Section titled “Example”{ "lastUpdated": "2025-01-30T12:00:00Z", "lockVersion": 5, "teams": [ { "domain": "backend-api", "domainId": "backend-api", "archetypeId": "coding", "placementType": "worktree", "onboardedAt": "2025-01-30T10:00:00Z", "location": "/path/to/repo/.squad/worktrees/backend-api", "status": "active", "lastActive": "2025-01-30T11:50:00Z" }, { "domain": "docs-team", "domainId": "docs-team", "archetypeId": "deliverable", "placementType": "directory", "onboardedAt": "2025-01-30T10:15:00Z", "location": "/path/to/repo/.squad/teams/docs-team", "status": "active" } ]}Fields Reference
Section titled “Fields Reference”lastUpdated
Section titled “lastUpdated”ISO timestamp of last registry modification.
lockVersion
Section titled “lockVersion”Incremented on every write. Used for optimistic concurrency control—prevents simultaneous edits from clobbering each other.
teams[]
Section titled “teams[]”Array of registered team entries.
domain
Section titled “domain”Human-friendly team name (e.g., backend-api).
domainId
Section titled “domainId”Unique team identifier (usually same as domain).
archetypeId
Section titled “archetypeId”Archetype the team was onboarded with (coding, deliverable, consultant, or custom).
placementType
Section titled “placementType”Where the team workspace lives:
worktree— Git worktree (isolated branch)directory— Subdirectory in.squad/teams/
onboardedAt
Section titled “onboardedAt”ISO timestamp when team was created.
location
Section titled “location”Absolute path to team workspace.
status
Section titled “status”Optional. Team status:
active— Currently workingpaused— Manually pausedarchived— Work complete, no longer active
lastActive
Section titled “lastActive”Optional. ISO timestamp of last activity (signal sent, status update, etc.).
Environment Variables
Section titled “Environment Variables”Squad Federation recognizes these environment variables:
SQUAD_TELEMETRY_ENABLED
Section titled “SQUAD_TELEMETRY_ENABLED”Override telemetry.enabled from config.
Values: true | false
Example:
SQUAD_TELEMETRY_ENABLED=false npx tsx scripts/launch.ts --team backend-apiOTEL_EXPORTER_OTLP_ENDPOINT
Section titled “OTEL_EXPORTER_OTLP_ENDPOINT”Override telemetry.aspire.endpoint from config.
Example:
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 npx tsx scripts/monitor.tsValidation
Section titled “Validation”The SDK validates configuration on load:
Checks:
- If
teamsConfigis present,teamsConfig.teamIdandteamsConfig.channelIdare valid strings - Numeric fields (e.g.,
lockVersion) are integers - Timestamps are valid ISO 8601 strings
Throws: ConfigValidationError if validation fails.