Skip to content

Commit b73d404

Browse files
elbrunoCopilot
andauthored
fix: MAF v1.0 GA upgrade - align docs, auth, packages, and config keys (#512)
* chore: create MAF v1 upgrade branch with squad setup - Branch for upgrading all 26 MAF samples from preview to v1.0 GA - Add .lscache and .copilot/skills/ to .gitignore - Initialize Squad templates and configuration Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: add MAF v1 upgrade plan Comprehensive plan for upgrading all 26 MAF samples from preview to v1.0 GA, creating 2 new Hosted Agent scenarios, updating docs, and improvement suggestions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: upgrade Tier 1 MAF samples to v1.0 GA + update Lesson 01 - Upgrade 6 MAF samples from preview to stable v1.0.0 packages - Fix v1 breaking API changes: CreateAIAgent→AsAIAgent, AgentRunResponse→AgentResponse, AsAgent→AsAIAgent, GetNewThread→CreateSessionAsync, Serialize/DeserializeThread→Session - Update Microsoft.Extensions.AI to 10.4.0 (required by v1) - Remove 'Coming Later' text from Lesson 01, add MAF v1.0 reference Samples: MAF01, MAF02, MAF-Ollama-01, MAF-FoundryClaude-01, MAF-FoundryClaude-Persisting-01, MAF-MultiModel Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Upgrade Tier 2 MAF samples (9 projects) to v1.0 stable packages - Microsoft.Agents.AI.AzureAI -> Microsoft.Agents.AI.Foundry 1.0.0 - Microsoft.Agents.AI, Abstractions, OpenAI -> 1.0.0 - Microsoft.Extensions.AI/OpenAI -> 10.4.0 - OpenAI -> 2.9.1, Azure.Identity -> 1.20.0 API renames applied: - CreateAIAgent() -> AsAIAgent() - AgentRunResponse -> AgentResponse - AgentRunResponseUpdate -> AgentResponseUpdate - AgentThread -> AgentSession - GetNewThread() -> await CreateSessionAsync() - thread.Serialize() -> await agent.SerializeSessionAsync() - agent.DeserializeThread() -> await agent.DeserializeSessionAsync() Added NoWarn MEAI001 for experimental ContinuationToken in BackgroundResponses projects. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: add MAF-HostedAgent-01-TimeZone sample + update CLAUDE README - New hosted agent sample: TimeZone agent with GetCurrentTime tool supporting Azure OpenAI and Ollama providers - Includes Dockerfile, agent.yaml manifest, and comprehensive README - Added to MAF-Demos.slnx under Hosted Agents folder - Updated CLAUDE-SAMPLES-README.md to v1.0 GA package versions Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Upgrade Tier 4 MAF web chat samples to latest MAF packages Update 6 Aspire-based web chat apps to latest MAF package versions: - Microsoft.Agents.AI/Abstractions/OpenAI/Workflows: 1.0.0 - Microsoft.Agents.AI.Hosting: 1.0.0-preview.260402.1 - Microsoft.Agents.AI.Hosting.OpenAI: 1.0.0-alpha.260402.1 - Microsoft.Agents.AI.DevUI: 1.0.0-preview.260402.1 - Microsoft.Agents.AI.Hosting.AGUI.AspNetCore: 1.0.0-preview.260402.1 - Microsoft.Agents.AI.AGUI: 1.0.0-preview.260402.1 - Microsoft.Agents.AI.Workflows.Declarative: 1.0.0-rc6 - Microsoft.Extensions.AI/OpenAI: 10.4.0 Apply v1 API renames across all samples: - CreateAIAgent() -> AsAIAgent() - AgentThread -> AgentSession - GetNewThread() -> CreateSessionAsync() - thread.Serialize() -> agent.SerializeSessionAsync(session) - agent.DeserializeThread() -> agent.DeserializeSessionAsync() Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Upgrade MAF Tier 3 samples to v1.0 GA stable packages - Replace preview MAF packages with v1.0 stable releases: - Microsoft.Agents.AI 1.0.0 - Microsoft.Agents.AI.Foundry 1.0.0 (replaces AzureAI + AzureAI.Persistent) - Microsoft.Agents.AI.Workflows 1.0.0 - Microsoft.Agents.AI.Abstractions 1.0.0 - Microsoft.Agents.AI.Declarative 1.0.0-rc6 - Migrate from PersistentAgentsClient to AIProjectClient + Responses API: - Projects 1-3: Replace GetAIAgentAsync() with AsAIAgent(model, instructions) - Project 4: Rewrite AIFoundryAgentsProvider to use AIProjectClient - Apply v1.0 API renames: - CreateAIAgent -> AsAIAgent - AsAgent() -> AsAIAgent() - AgentRunResponse -> AgentResponse - AgentRunUpdateEvent -> AgentResponseUpdateEvent - InProcessExecution.StreamAsync -> InProcessExecution.Default.RunStreamingAsync - Microsoft.Bot.ObjectModel -> Microsoft.Agents.ObjectModel - Remove unused Azure.AI.Agents.Persistent dependency from all projects - Suppress MAAIW001 for experimental handoff API in Factory sample - Run dotnet format on all projects Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: add MAF-HostedAgent-02-MultiAgent sample - New multi-agent Research Assistant: Researcher → Writer → Reviewer workflow - Uses MAF v1.0 AgentWorkflow for sequential pipeline orchestration - Supports Azure OpenAI and Ollama providers - Includes Dockerfile, agent.yaml, and comprehensive README - Added to MAF-Demos.slnx under Hosted Agents folder Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: update Lesson 04, What's New, and create MAF samples index - Remove --prerelease flags from Lesson 04 install instructions - Add Hosted Agents section to Lesson 04 with links to new samples - Update sample reference table to 28 total samples - Add MAF v1.0 GA entry to root README What's New section - Create 10-WhatsNew/readme.md archive with migration guide - Create samples/MAF/README.md unified index (10 categories, 28 samples) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: update translations for MAF v1.0 GA (8 languages) Add MAF v1.0 GA What's New entry to all translated READMEs: de, es, fr, ja, ko, pt, tw, zh Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: align MAF v1.0 docs, package versions, and config keys Documentation fixes: - Replace CreateAIAgent() with AsAIAgent() across all Lesson 04 docs (41 occurrences) - Replace AgentRunResponse with AgentResponse (4 occurrences) - Fix Microsoft.Agents.AI.Core to Microsoft.Agents.AI in CLAUDE-SAMPLES-README.md - Fix user secrets key deploymentName to AzureOpenAI:Deployment in README.md Package version alignment: - Aspire.Azure.AI.OpenAI: 9.5.2-preview → 13.1.0-preview (3 web apps) - Azure.AI.OpenAI: 2.8.0-beta.1 → 2.9.0-beta.1 (14 projects) - Azure.Identity: 1.18.0 → 1.20.0 (6 projects) - OpenAI SDK: 2.9.1 → 2.10.0 (11 projects) - PdfPig: 0.1.14-alpha → 0.1.13 stable (MutliAgent) Model name standardization: - Standardize gpt-4o-mini → gpt-5-mini in HostedAgent samples and README Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chore(squad): log MAF v1.0 fix session Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: standardize MAF auth to AzureCliCredential + AzureOpenAI:Endpoint Migrate all MAF console samples from ApiKeyCredential + config['endpoint'] to AzureCliCredential + config['AzureOpenAI:Endpoint'] for consistency with CoreSamples (BasicChat-01MEAI) and Azure passwordless best practices. Files changed: - MAF01, MAF02: Switch to AzureCliCredential, add Azure.Identity pkg - MAF-AIFoundry-01: Remove dead apiKey code, fix endpoint key - MAF-AIFoundry-02: Switch to AzureCliCredential, fix endpoint key - BackgroundResponses-01-Simple: Simplify providers to AzureCliCredential only - MAF-ImageGen-01/02: Switch ChatClientProvider to AzureCliCredential - MAF-MultiModel: Simplify to DefaultAzureCredential only All 26 projects build successfully, 11 samples tested end-to-end. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: standardize auth pattern to AzureCliCredential across MAF docs Update all Azure OpenAI documentation sections to match the new standardized authentication pattern used by MAF console samples: - config["AzureOpenAI:Endpoint"] (not config["endpoint"]) - config["AzureOpenAI:Deployment"] (not hardcoded model names) - AzureCliCredential (not ApiKeyCredential — no API key needed) - az login required before running samples Files updated: - samples/MAF/README.md (6 sections) - 04-AgentsWithMAF/01-building-first-agent.md (package name + 2 snippets) - 04-AgentsWithMAF/03-multi-agent-workflows.md (1 snippet) - 04-AgentsWithMAF/04-model-context-protocol.md (1 snippet + imports) Claude/Foundry and HostedAgent sections left unchanged (different auth). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: standardize remaining config keys and docs to AzureOpenAI pattern - Fix MAF-MultiAgents/AppConfigurationService.cs: config[endpoint] -> config[AzureOpenAI:Endpoint], config[apikey] -> config[AzureOpenAI:ApiKey] - Fix MAF-MultiAgents/Program.cs comment and README.md setup instructions - Fix MAF-MultiModel/README.md to show AzureOpenAI:Endpoint + DefaultAzureCredential - Fix MAF-Persisting-01-Simple/README.md and MAF-Persisting-02-Menu/README.md - Fix MAF-ImageGen-02/ImageGenerator.cs: config[endpoint] -> config[AzureOpenAI:Endpoint] - Remove unused 'using System.ClientModel' from StreamConsoleHelper.cs - All remaining 'endpoint'/'apikey' refs are Claude-specific (correct) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chore: remove .squad/ from PR (forbidden on main) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: address Copilot PR review suggestions - Add null guards with setup hints for config values (MAF01, MAF02, AIFoundry-01, ImageGen-02) - Fix AsAgent() -> AsAIAgent() in Lesson 04 workflow docs (7 instances) - Fix XML doc comment AgentThread -> AgentSession in Persisting-02-Menu - Localize Spanish translation (April -> abril, production-ready -> listos para producción) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 97cf36b commit b73d404

140 files changed

Lines changed: 2272 additions & 1732 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/agents/squad.agent.md

Lines changed: 155 additions & 14 deletions
Large diffs are not rendered by default.

.github/workflows/squad-heartbeat.yml

Lines changed: 53 additions & 197 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
name: Squad Heartbeat (Ralph)
2+
# ⚠️ SYNC: This workflow is maintained in 4 locations. Changes must be applied to all:
3+
# - templates/workflows/squad-heartbeat.yml (source template)
4+
# - packages/squad-cli/templates/workflows/squad-heartbeat.yml (CLI package)
5+
# - .squad/templates/workflows/squad-heartbeat.yml (installed template)
6+
# - .github/workflows/squad-heartbeat.yml (active workflow)
7+
# Run 'squad upgrade' to sync installed copies from source templates.
28

39
on:
410
schedule:
5-
# Every 30 minutes — adjust or remove if not needed
11+
# Every 30 minutes — adjust via cron expression as needed
612
- cron: '*/30 * * * *'
713

814
# React to completed work or new squad work
@@ -25,225 +31,75 @@ jobs:
2531
steps:
2632
- uses: actions/checkout@v4
2733

28-
- name: Ralph — Check for squad work
34+
- name: Check triage script
35+
id: check-script
36+
run: |
37+
if [ -f ".squad/templates/ralph-triage.js" ]; then
38+
echo "has_script=true" >> $GITHUB_OUTPUT
39+
else
40+
echo "has_script=false" >> $GITHUB_OUTPUT
41+
echo "⚠️ ralph-triage.js not found — run 'squad upgrade' to install"
42+
fi
43+
44+
- name: Ralph — Smart triage
45+
if: steps.check-script.outputs.has_script == 'true'
46+
env:
47+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
48+
run: |
49+
node .squad/templates/ralph-triage.js \
50+
--squad-dir .squad \
51+
--output triage-results.json
52+
53+
- name: Ralph — Apply triage decisions
54+
if: steps.check-script.outputs.has_script == 'true' && hashFiles('triage-results.json') != ''
2955
uses: actions/github-script@v7
3056
with:
3157
script: |
3258
const fs = require('fs');
33-
34-
// Read team roster — check .squad/ first, fall back to .ai-team/
35-
let teamFile = '.squad/team.md';
36-
if (!fs.existsSync(teamFile)) {
37-
teamFile = '.ai-team/team.md';
38-
}
39-
if (!fs.existsSync(teamFile)) {
40-
core.info('No .squad/team.md or .ai-team/team.md found — Ralph has nothing to monitor');
59+
const path = 'triage-results.json';
60+
if (!fs.existsSync(path)) {
61+
core.info('No triage results — board is clear');
4162
return;
4263
}
43-
44-
const content = fs.readFileSync(teamFile, 'utf8');
45-
46-
// Check if Ralph is on the roster
47-
if (!content.includes('Ralph') || !content.includes('🔄')) {
48-
core.info('Ralph not on roster — heartbeat disabled');
64+
65+
const results = JSON.parse(fs.readFileSync(path, 'utf8'));
66+
if (results.length === 0) {
67+
core.info('📋 Board is clear — Ralph found no untriaged issues');
4968
return;
5069
}
51-
52-
// Parse members from roster
53-
const lines = content.split('\n');
54-
const members = [];
55-
let inMembersTable = false;
56-
for (const line of lines) {
57-
if (line.match(/^##\s+(Members|Team Roster)/i)) {
58-
inMembersTable = true;
59-
continue;
60-
}
61-
if (inMembersTable && line.startsWith('## ')) break;
62-
if (inMembersTable && line.startsWith('|') && !line.includes('---') && !line.includes('Name')) {
63-
const cells = line.split('|').map(c => c.trim()).filter(Boolean);
64-
if (cells.length >= 2 && !['Scribe', 'Ralph'].includes(cells[0])) {
65-
members.push({
66-
name: cells[0],
67-
role: cells[1],
68-
label: `squad:${cells[0].toLowerCase()}`
69-
});
70-
}
71-
}
72-
}
73-
74-
if (members.length === 0) {
75-
core.info('No squad members found — nothing to monitor');
76-
return;
77-
}
78-
79-
// 1. Find untriaged issues (labeled "squad" but no "squad:{member}" label)
80-
const { data: squadIssues } = await github.rest.issues.listForRepo({
81-
owner: context.repo.owner,
82-
repo: context.repo.repo,
83-
labels: 'squad',
84-
state: 'open',
85-
per_page: 20
86-
});
87-
88-
const memberLabels = members.map(m => m.label);
89-
const untriaged = squadIssues.filter(issue => {
90-
const issueLabels = issue.labels.map(l => l.name);
91-
return !memberLabels.some(ml => issueLabels.includes(ml));
92-
});
93-
94-
// 2. Find assigned but unstarted issues (has squad:{member} label, no assignee)
95-
const unstarted = [];
96-
for (const member of members) {
70+
71+
for (const decision of results) {
9772
try {
98-
const { data: memberIssues } = await github.rest.issues.listForRepo({
99-
owner: context.repo.owner,
100-
repo: context.repo.repo,
101-
labels: member.label,
102-
state: 'open',
103-
per_page: 10
104-
});
105-
for (const issue of memberIssues) {
106-
if (!issue.assignees || issue.assignees.length === 0) {
107-
unstarted.push({ issue, member });
108-
}
109-
}
110-
} catch (e) {
111-
// Label may not exist yet
112-
}
113-
}
114-
115-
// 3. Find squad issues missing triage verdict (no go:* label)
116-
const missingVerdict = squadIssues.filter(issue => {
117-
const labels = issue.labels.map(l => l.name);
118-
return !labels.some(l => l.startsWith('go:'));
119-
});
120-
121-
// 4. Find go:yes issues missing release target
122-
const goYesIssues = squadIssues.filter(issue => {
123-
const labels = issue.labels.map(l => l.name);
124-
return labels.includes('go:yes') && !labels.some(l => l.startsWith('release:'));
125-
});
126-
127-
// 4b. Find issues missing type: label
128-
const missingType = squadIssues.filter(issue => {
129-
const labels = issue.labels.map(l => l.name);
130-
return !labels.some(l => l.startsWith('type:'));
131-
});
132-
133-
// 5. Find open PRs that need attention
134-
const { data: openPRs } = await github.rest.pulls.list({
135-
owner: context.repo.owner,
136-
repo: context.repo.repo,
137-
state: 'open',
138-
per_page: 20
139-
});
140-
141-
const squadPRs = openPRs.filter(pr =>
142-
pr.labels.some(l => l.name.startsWith('squad'))
143-
);
144-
145-
// Build status summary
146-
const summary = [];
147-
if (untriaged.length > 0) {
148-
summary.push(`🔴 **${untriaged.length} untriaged issue(s)** need triage`);
149-
}
150-
if (unstarted.length > 0) {
151-
summary.push(`🟡 **${unstarted.length} assigned issue(s)** have no assignee`);
152-
}
153-
if (missingVerdict.length > 0) {
154-
summary.push(`⚪ **${missingVerdict.length} issue(s)** missing triage verdict (no \`go:\` label)`);
155-
}
156-
if (goYesIssues.length > 0) {
157-
summary.push(`⚪ **${goYesIssues.length} approved issue(s)** missing release target (no \`release:\` label)`);
158-
}
159-
if (missingType.length > 0) {
160-
summary.push(`⚪ **${missingType.length} issue(s)** missing \`type:\` label`);
161-
}
162-
if (squadPRs.length > 0) {
163-
const drafts = squadPRs.filter(pr => pr.draft).length;
164-
const ready = squadPRs.length - drafts;
165-
if (drafts > 0) summary.push(`🟡 **${drafts} draft PR(s)** in progress`);
166-
if (ready > 0) summary.push(`🟢 **${ready} PR(s)** open for review/merge`);
167-
}
168-
169-
if (summary.length === 0) {
170-
core.info('📋 Board is clear — Ralph found no pending work');
171-
return;
172-
}
173-
174-
core.info(`🔄 Ralph found work:\n${summary.join('\n')}`);
175-
176-
// Auto-triage untriaged issues
177-
for (const issue of untriaged) {
178-
const issueText = `${issue.title}\n${issue.body || ''}`.toLowerCase();
179-
let assignedMember = null;
180-
let reason = '';
181-
182-
// Simple keyword-based routing
183-
for (const member of members) {
184-
const role = member.role.toLowerCase();
185-
if ((role.includes('frontend') || role.includes('ui')) &&
186-
(issueText.includes('ui') || issueText.includes('frontend') ||
187-
issueText.includes('css') || issueText.includes('component'))) {
188-
assignedMember = member;
189-
reason = 'Matches frontend/UI domain';
190-
break;
191-
}
192-
if ((role.includes('backend') || role.includes('api') || role.includes('server')) &&
193-
(issueText.includes('api') || issueText.includes('backend') ||
194-
issueText.includes('database') || issueText.includes('endpoint'))) {
195-
assignedMember = member;
196-
reason = 'Matches backend/API domain';
197-
break;
198-
}
199-
if ((role.includes('test') || role.includes('qa')) &&
200-
(issueText.includes('test') || issueText.includes('bug') ||
201-
issueText.includes('fix') || issueText.includes('regression'))) {
202-
assignedMember = member;
203-
reason = 'Matches testing/QA domain';
204-
break;
205-
}
206-
}
207-
208-
// Default to Lead
209-
if (!assignedMember) {
210-
const lead = members.find(m =>
211-
m.role.toLowerCase().includes('lead') ||
212-
m.role.toLowerCase().includes('architect')
213-
);
214-
if (lead) {
215-
assignedMember = lead;
216-
reason = 'No domain match — routed to Lead';
217-
}
218-
}
219-
220-
if (assignedMember) {
221-
// Add member label
22273
await github.rest.issues.addLabels({
22374
owner: context.repo.owner,
22475
repo: context.repo.repo,
225-
issue_number: issue.number,
226-
labels: [assignedMember.label]
76+
issue_number: decision.issueNumber,
77+
labels: [decision.label]
22778
});
228-
229-
// Post triage comment
79+
23080
await github.rest.issues.createComment({
23181
owner: context.repo.owner,
23282
repo: context.repo.repo,
233-
issue_number: issue.number,
83+
issue_number: decision.issueNumber,
23484
body: [
235-
`### 🔄 Ralph — Auto-Triage`,
85+
'### 🔄 Ralph — Auto-Triage',
23686
'',
237-
`**Assigned to:** ${assignedMember.name} (${assignedMember.role})`,
238-
`**Reason:** ${reason}`,
87+
`**Assigned to:** ${decision.assignTo}`,
88+
`**Reason:** ${decision.reason}`,
89+
`**Source:** ${decision.source}`,
23990
'',
240-
`> Ralph auto-triaged this issue via the squad heartbeat. To reassign, swap the \`squad:*\` label.`
91+
'> Ralph auto-triaged this issue using routing rules.',
92+
'> To reassign, swap the `squad:*` label.'
24193
].join('\n')
24294
});
243-
244-
core.info(`Auto-triaged #${issue.number} → ${assignedMember.name}`);
95+
96+
core.info(`Triaged #${decision.issueNumber} → ${decision.assignTo} (${decision.source})`);
97+
} catch (e) {
98+
core.warning(`Failed to triage #${decision.issueNumber}: ${e.message}`);
24599
}
246100
}
101+
102+
core.info(`🔄 Ralph triaged ${results.length} issue(s)`);
247103
248104
# Copilot auto-assign step (uses PAT if available)
249105
- name: Ralph — Assign @copilot issues

.github/workflows/squad-promote.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ jobs:
3636
echo "=== dev HEAD ===" && git log origin/dev -1 --oneline
3737
echo "=== preview HEAD ===" && git log origin/preview -1 --oneline
3838
echo "=== Files that would be stripped ==="
39-
git diff origin/preview..origin/dev --name-only | grep -E "^(\.(ai-team|squad|ai-team-templates|squad-templates)|team-docs/|docs/proposals/)" || echo "(none)"
39+
git diff origin/preview..origin/dev --name-only | grep -E "^(\.(ai-team|squad|ai-team-templates)|team-docs/|docs/proposals/)" || echo "(none)"
4040
4141
- name: Merge dev → preview (strip forbidden paths)
4242
if: ${{ inputs.dry_run == 'false' }}
@@ -49,7 +49,6 @@ jobs:
4949
.ai-team/ \
5050
.squad/ \
5151
.ai-team-templates/ \
52-
.squad-templates/ \
5352
team-docs/ \
5453
"docs/proposals/" || true
5554
@@ -101,7 +100,7 @@ jobs:
101100
echo "✅ Version $VERSION has CHANGELOG entry"
102101
103102
# Verify no forbidden files on preview
104-
FORBIDDEN=$(git ls-files | grep -E "^(\.(ai-team|squad|ai-team-templates|squad-templates)/|team-docs/|docs/proposals/)" || true)
103+
FORBIDDEN=$(git ls-files | grep -E "^(\.(ai-team|squad|ai-team-templates)/|team-docs/|docs/proposals/)" || true)
105104
if [ -n "$FORBIDDEN" ]; then
106105
echo "::error::Forbidden files found on preview: $FORBIDDEN"
107106
exit 1

.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,3 +404,10 @@ FodyWeavers.xsd
404404
# Squad: ignore generated logs
405405
.squad/orchestration-log/
406406
.squad/log/
407+
.squad/decisions/inbox/
408+
.squad/sessions/
409+
.squad-workstream
410+
411+
# IDE / build cache
412+
*.lscache
413+
.copilot/skills/

.squad/.first-run

Lines changed: 0 additions & 1 deletion
This file was deleted.

.squad/agents/dozer/charter.md

Lines changed: 0 additions & 33 deletions
This file was deleted.

.squad/agents/dozer/history.md

Lines changed: 0 additions & 16 deletions
This file was deleted.

.squad/agents/morpheus/charter.md

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)