Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
8571bf3
refactor(apphost): extract WithClearDatabaseCommand into MongoDbResou…
mpaulosky May 8, 2026
976ec57
fix(ci): use GH_PROJECT_TOKEN for Projects V2 access in squad-mark-re…
mpaulosky May 8, 2026
924edfc
feat(AppHost): add WithSeedDataCommand for local dev seeding (#263)
mpaulosky May 8, 2026
002b5bb
feat(AppHost): add WithShowStatsCommand for local dev stats (#264)
mpaulosky May 8, 2026
d1d7e79
refactor: rename _clearMutex to _dbMutex in MongoDbResourceBuilderExt…
mpaulosky May 8, 2026
3c309d2
fix(ci): Blog → README Sync — push to dev instead of main (#270)
mpaulosky May 8, 2026
c272feb
fix(ci): add pre-flight token validation and fix permissions block in…
mpaulosky May 8, 2026
c074b8f
test: harden AppHost.Tests flaky timing
mpaulosky May 8, 2026
3547113
docs(squad): merge 4 inbox decisions into decisions.md
mpaulosky May 8, 2026
5b1828f
docs(squad): merge Sprint 18 decisions and Ralph board sweep log (#275)
mpaulosky May 8, 2026
7c1fea2
fix(profile): fall back to authenticated email claims on /profile (#279)
mpaulosky May 10, 2026
80a2ef1
fix(build): clear remaining Release analyzer warnings (#283)
mpaulosky May 10, 2026
f680a57
fix(headers): preserve original year when normalizing headers (#285)
mpaulosky May 10, 2026
7541e68
ci(hooks): add dotnet format gate before Release build (#290)
mpaulosky May 11, 2026
158815e
feat(theme): centralise table, form, and alert CSS into input.css (#277)
mpaulosky May 11, 2026
3215029
chore(deps): bump actions/github-script from 7 to 9 in the all-action…
dependabot[bot] May 11, 2026
4a9b754
Bump MongoDB.Driver from 3.6.0 to 3.8.0 (#282)
dependabot[bot] May 11, 2026
97a3221
ci: add markdown and YAML lint workflows (#288)
mpaulosky May 11, 2026
2ba0886
fix(ui): correct dark-mode colours, add PageHeadingComponent, style b…
mpaulosky May 11, 2026
4b5d0d2
feat(app): add L1+L2 caching to UserManagement Auth0 API calls (#297)
mpaulosky May 11, 2026
3c4ed03
feat(domain): introduce PostAuthor value object for blog post authors…
mpaulosky May 11, 2026
628110f
fix(process): add AppHost.Tests to pre-push Gate 5, align docs (#301)
mpaulosky May 11, 2026
292fd26
feat(ui): restrict blog post editing to post author or Admin (#302)
mpaulosky May 11, 2026
7e15cdd
feat(app): restrict blog post editing to post author or Admin (#300) …
mpaulosky May 11, 2026
9fcf7dc
Merge dev: resolve project board automation option IDs conflict (#305)
mpaulosky May 11, 2026
5e176dc
fix(ui): clear loading state when Edit page gets null post result (#3…
mpaulosky May 11, 2026
a1ad0c9
fix(ui): refresh Edit page loading state on post-ID changes (#310)
mpaulosky May 12, 2026
dc34ce9
fix(ui): refresh edit page state on route changes
mpaulosky May 12, 2026
8aef7ee
fix(blogposts): align author claims, publish checkbox, and seed schem…
mpaulosky May 12, 2026
8fa725d
feat(314): add RTBlazorfied rich text editor + HtmlSanitizer backend …
mpaulosky May 12, 2026
d517f20
chore: upgrade from .NET 9 to .NET 10 (#317)
mpaulosky May 12, 2026
8aadab2
docs(squad): Sprint 19 execution rails for markdown migration (#322)
May 13, 2026
97129fa
docs(squad): update Aragorn history with #322 execution rails learnings
May 13, 2026
12f32f1
fix(docs): resolve markdownlint MD022/MD012/MD051 failures in assessm…
May 13, 2026
fe0634d
fix(docs): resolve markdownlint failures in execution-log.md and scen…
May 13, 2026
377162c
fix(docs): resolve all remaining markdownlint failures across upgrade…
May 13, 2026
6d9ffd0
[Sprint 19] Milestone/worktree execution rails for markdown migration…
mpaulosky May 13, 2026
a269e2a
[Sprint 19] Restore markdown editor compile path (#329)
mpaulosky May 13, 2026
cbc3aaa
feat(ui): replace InputTextArea with TextEditor markdown editor in Cr…
May 13, 2026
2a75eb4
feat(web): Edit flow markdown authoring slice (#325) (#331)
mpaulosky May 13, 2026
a5a1000
feat(ui): UX parity hardening for Create/Edit markdown editor (#326)
May 13, 2026
036aac2
test(bunit): add Sprint 19 markdown editor lifecycle and interop vali…
May 13, 2026
21a173a
test(bunit): Sprint 19 markdown editor lifecycle and interop validati…
mpaulosky May 13, 2026
171b6c5
docs(sprint-20): Sprint 19 markdown editor completion - Aragorn histo…
mpaulosky May 13, 2026
abd7e4b
chore(318): add markdownlint gate to pre-push hook and align docs (#319)
mpaulosky May 13, 2026
6d30cde
chore(deps): upgrade Aspire and markdown packages (#336)
mpaulosky May 14, 2026
be27b50
chore(squad): archive self-authored PR gate skill (#337) (#338)
mpaulosky May 15, 2026
ec92657
feat(categories): Categories CRUD UI + blog post category assignment …
mpaulosky May 15, 2026
b3cb66a
[Sprint 19] Polish category UX, test naming, and documentation (#342)
mpaulosky May 15, 2026
0474891
chore(deps): bump dotnet-sdk from 10.0.203 to 10.0.300 in the all-act…
dependabot[bot] May 17, 2026
30da76c
Bump the all-actions group with 6 updates (#344)
dependabot[bot] May 17, 2026
c0a44c7
fix(apphost): pin MongoDB to mongo:7 with mongo-data-v7 volume (#346)
mpaulosky May 17, 2026
883137f
docs(squad): correct Sam MongoDB guidance (#347)
mpaulosky May 17, 2026
b079c0d
fix(infra): resolve remaining database runtime issues (#348) (#349)
mpaulosky May 18, 2026
41c20a7
fix(#350): repair Aspire startup on fresh-machine clone (#351)
mpaulosky May 23, 2026
30fe262
chore(release): merge PR #352 conflict fix into dev (#354)
mpaulosky May 23, 2026
bf8919a
chore(release): merge main into dev to unblock PR #352 (#356)
mpaulosky May 23, 2026
3b1f1dc
Merge origin/main into dev for release PR #352 ancestry
mpaulosky May 23, 2026
e0a46c6
Merge pull request #358 from mpaulosky/squad/355-merge-main-into-dev-…
mpaulosky May 23, 2026
b1567ac
feat(#360): establish ObjectId foundation and AppHost seeding rules
mpaulosky May 24, 2026
053109e
chore(deps): bump actions/github-script from 7 to 9 in the all-action…
dependabot[bot] May 24, 2026
3827e57
docs(process): enforce issue checkout alignment (#374) (#376)
mpaulosky May 24, 2026
ae53f86
chore(#367): remove squad-heartbeat workflow (#378)
mpaulosky May 24, 2026
857060d
docs: recover outdated blog and release content (#371) (#375)
mpaulosky May 24, 2026
78826d6
feat(sprint-20): migrate Category/BlogPost to ObjectId, fix cache ser…
mpaulosky May 24, 2026
6755388
test(#369): add UserManagementCacheService unit tests (coverage gap) …
mpaulosky May 24, 2026
4430f72
docs(#370): update squad charters to use gpt-5.4 (#379)
mpaulosky May 24, 2026
470f77e
Bump Aspire.Hosting.Testing and 5 others (#373)
dependabot[bot] May 24, 2026
13798a8
fix: remove refresh-open-prs job from dependabot-auto-merge workflow …
mpaulosky May 24, 2026
4975908
chore: backmerge Sprint 20 release (d89e955) from main into dev
mpaulosky May 25, 2026
20ad6dc
docs(squad): record Sprint 20 recovery session in agent histories
mpaulosky May 25, 2026
8bce638
chore: backmerge Sprint 20 release from main into dev
mpaulosky May 25, 2026
94356a6
fix: pre-push hook tag passthrough (#387)
mpaulosky May 25, 2026
d1009f4
fix: pre-push hook tag passthrough (#388)
mpaulosky May 25, 2026
4b8a293
docs(#389): update README, RELEASE.md, and blog for Sprint 20 (v1.7.0)
mpaulosky May 25, 2026
57382ed
docs(#389): update README, RELEASE.md, and blog for Sprint 20 (v1.7.0…
mpaulosky May 25, 2026
af6e86c
docs(readme): add blog post references and release history links #391
mpaulosky May 25, 2026
0532dfd
Merge branch 'dev' into squad/391-add-readme-blog-references
mpaulosky May 25, 2026
bb0a948
docs(readme): Add blog post references and release history (#391) (#392)
mpaulosky May 25, 2026
2b45266
Scribe: Merge decision inbox and record Sprint 20 board update
mpaulosky May 25, 2026
a632667
fix(ci): scope released board promotion to shipped items (#393)
mpaulosky May 25, 2026
bd83cdc
fix(ci): scope released board promotion to shipped items (#394)
mpaulosky May 25, 2026
7107862
fix(ci): include release/hotfix PR body in shipped-issue discovery (#…
mpaulosky May 25, 2026
3dac6f1
fix(auth): bypass OIDC challenge when placeholder Auth0 config is act…
mpaulosky May 25, 2026
305bbf0
fix(auth): preserve returnUrl in local fallback login (#399)
mpaulosky May 25, 2026
b331753
[Sprint 20] Review and land current app tweaks (#401)
mpaulosky May 27, 2026
8eb9b5d
Reduce analyzer warning backlog across tests and targeted src (#403)
mpaulosky May 28, 2026
dd2866f
chore(#405): sync dependency packages and configure local developer e…
mpaulosky May 29, 2026
1e0b815
chore(deps): bump actions/checkout from 4 to 6 in the all-actions gro…
dependabot[bot] May 31, 2026
bf40f7d
[Sprint 21] Resolve Aspire local startup (#409)
mpaulosky Jun 3, 2026
bcd1aae
ci: auto-discover root *.slnx in CI workflows (#411)
mpaulosky Jun 3, 2026
000e7e0
chore(deps): bump codecov/codecov-action from 6 to 7 in the all-actio…
dependabot[bot] Jun 7, 2026
cb53464
chore(deps): bump dotnet-sdk from 10.0.300 to 10.0.301 in the all-act…
dependabot[bot] Jul 1, 2026
0847fa5
chore(deps): bump the all-actions group across 1 directory with 3 upd…
dependabot[bot] Jul 1, 2026
2a96dc6
chore: standardize squad governance workflows (#421)
mpaulosky Jul 1, 2026
30e9427
Bump the all-actions group with 18 updates (#419)
dependabot[bot] Jul 1, 2026
ecdf823
ci: upgrade Node.js from 20 to 22 in squad-standard-lint-markdown
mpaulosky Jul 1, 2026
325d6e4
fix(tests): add required Arguments parameter to ExecuteCommandContext…
mpaulosky Jul 1, 2026
6cf21d8
fix(ci): resolve YAML and line-length linting errors
mpaulosky Jul 1, 2026
bfa829e
fix(docs): add language specs to unlabeled code blocks
mpaulosky Jul 1, 2026
fde1a8d
fix(ci): remove trailing blank lines from workflow files
mpaulosky Jul 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .copilot/skills/auth0-token-forwarding/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public sealed class TokenForwardingHandler : DelegatingHandler
return await base.SendAsync(request, cancellationToken);
}
}
```
```text

### Step 2: Register Handler and Attach to HttpClients

Expand All @@ -76,7 +76,7 @@ builder.Services.AddHttpClient<IApiClient, ApiClient>(client =>
client.BaseAddress = new Uri("https+http://api"))
.AddServiceDiscovery()
.AddHttpMessageHandler<TokenForwardingHandler>();
```
```text

Repeat `.AddHttpMessageHandler<TokenForwardingHandler>()` for **all HttpClient registrations** that call protected APIs.

Expand All @@ -92,7 +92,7 @@ builder.Services.AddAuth0WebAppAuthentication(options =>
options.ClientSecret = clientSecret;
options.SaveTokens = true; // CRITICAL: Enables GetTokenAsync("access_token")
});
```
```text

## How It Works

Expand Down Expand Up @@ -165,7 +165,7 @@ public async Task TokenForwardingHandler_AttachesTokenWhenPresent()
request.Headers.Authorization.Scheme.Should().Be("Bearer");
request.Headers.Authorization.Parameter.Should().Be("fake-jwt-token");
}
```
```text

## Common Pitfalls

Expand Down
6 changes: 3 additions & 3 deletions .copilot/skills/cli-wiring/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@
await run<Name>(process.cwd(), options);
return;
}
```
```text

3. **Add help text** in the help section of `cli-entry.ts` (search for `Commands:`):

```ts
console.log(` ${BOLD}<name>${RESET} <description>`);
console.log(` Usage: <name> [flags]`);
```
```text

4. **Verify both exist** — the recurring bug is doing step 1 but missing steps 2-3.

Expand All @@ -40,7 +40,7 @@

```ts
import { BOLD, RESET, DIM, RED, GREEN, YELLOW } from './cli/core/output.js';
```
```text

Use dynamic `await import()` for command modules to keep startup fast (lazy loading).

Expand Down
26 changes: 13 additions & 13 deletions .copilot/skills/git-workflow/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,19 @@ Examples:
git checkout dev
git pull origin dev
git checkout -b squad/{issue-number}-{slug}
```
```text

2. **Mark issue in-progress:**

```bash
gh issue edit {number} --add-label "status:in-progress"
```
```text

3. **Create draft PR targeting dev:**

```bash
gh pr create --base dev --title "{description}" --body "Closes #{issue-number}" --draft
```
```text

4. **Do the work.** Make changes, write tests, commit with issue reference.

Expand All @@ -54,7 +54,7 @@ Examples:
```bash
git push -u origin squad/{issue-number}-{slug}
gh pr ready
```
```text

6. **After merge to dev:**

Expand All @@ -63,7 +63,7 @@ Examples:
git pull origin dev
git branch -d squad/{issue-number}-{slug}
git push origin --delete squad/{issue-number}-{slug}
```
```text

## Parallel Multi-Issue Work (Worktrees)

Expand All @@ -88,7 +88,7 @@ git fetch origin dev
# Create a worktree per issue — siblings to the main clone
git worktree add ../squad-195 -b squad/195-fix-stamp-bug origin/dev
git worktree add ../squad-193 -b squad/193-refactor-loader origin/dev
```
```text

**Naming convention:** `../{repo-name}-{issue-number}` (e.g., `../squad-195`, `../squad-pr-42`).

Expand All @@ -111,7 +111,7 @@ git push -u origin squad/195-fix-stamp-bug

# Create PR targeting dev
gh pr create --base dev --title "fix: stamp bug" --body "Closes #195" --draft
```
```text

All PRs target `dev` independently. Agents never interfere with each other's filesystem.

Expand All @@ -133,7 +133,7 @@ git worktree remove ../squad-195
git worktree prune # clean stale metadata
git branch -d squad/195-fix-stamp-bug
git push origin --delete squad/195-fix-stamp-bug
```
```text

If a worktree was deleted manually (rm -rf), `git worktree prune` recovers the state.

Expand All @@ -147,12 +147,12 @@ When work spans multiple repositories (e.g., squad-cli changes need squad-sdk ch

Clone downstream repos as siblings to the main repo:

```
```text
~/work/
squad-pr/ # main repo
squad-sdk/ # downstream dependency
user-app/ # consumer project
```
```text

Each repo gets its own issue branch following its own naming convention. If the downstream repo also uses Squad conventions, use `squad/{issue-number}-{slug}`.

Expand All @@ -161,11 +161,11 @@ Each repo gets its own issue branch following its own naming convention. If the
- Create PRs in each repo independently
- Link them in PR descriptions:

```
```markdown
Closes #42

**Depends on:** squad-sdk PR #17 (squad-sdk changes required for this feature)
```
```text

- Merge order: dependencies first (e.g., squad-sdk), then dependents (e.g., squad-cli)

Expand All @@ -184,7 +184,7 @@ cd ../squad-pr && npm link squad-sdk

# Python
cd ../squad-sdk && pip install -e .
```
```text

**Important:** Remove local links before committing. `npm link` and `go replace` are dev-only — CI must use published packages or PR-specific refs.

Expand Down
6 changes: 3 additions & 3 deletions .copilot/skills/model-selection/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ After resolving the model and including it in the spawn template, this skill is
"mcmanus": "claude-haiku-4.5"
}
}
```
```text

- `defaultModel` — applies to ALL agents unless overridden by `agentModelOverrides`
- `agentModelOverrides` — per-agent overrides that take priority over `defaultModel`
Expand All @@ -112,11 +112,11 @@ After resolving the model and including it in the spawn template, this skill is
If a model is unavailable (rate limit, plan restriction), retry within the same
tier until the documented chain is exhausted:

```
```text
Premium: claude-opus-4.6 → claude-opus-4.5 → claude-sonnet-4.6 → claude-sonnet-4.5
Standard: claude-sonnet-4.6 → gpt-5.4 → claude-sonnet-4.5 → gpt-5.3-codex → claude-sonnet-4
Fast: claude-haiku-4.5 → gpt-5.4-mini → gpt-4.1 → gpt-5-mini
```
```text

If the user explicitly selects `claude-opus-4.7`, start at the top of the
premium chain with `claude-opus-4.6` as the first fallback.
Expand Down
24 changes: 12 additions & 12 deletions .copilot/skills/mongodb-filter-pattern/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ Task<Result<(IReadOnlyList<TDto> Items, long Total)>> GetAllAsync(
string? searchTerm = null,
string? authorName = null,
CancellationToken cancellationToken = default);
```
```text

**Key principles:**

Expand Down Expand Up @@ -68,7 +68,7 @@ var entities = await _collection
.Skip((page - 1) * pageSize)
.Limit(pageSize)
.ToListAsync(cancellationToken);
```
```text

**Key principles:**

Expand All @@ -93,7 +93,7 @@ RuleFor(x => x.AuthorName)
.MaximumLength(200)
.When(x => !string.IsNullOrWhiteSpace(x.AuthorName))
.WithMessage("Author name must not exceed 200 characters.");
```
```text

**Key principles:**

Expand Down Expand Up @@ -122,7 +122,7 @@ group.MapGet("", async (
var result = await handler.Handle(query);
return Results.Ok(result);
})
```
```text

**Key principles:**

Expand All @@ -146,7 +146,7 @@ if (!string.IsNullOrWhiteSpace(authorName))
}

var result = await _httpClient.GetFromJsonAsync<TResponse>(url, cancellationToken);
```
```text

**Key principles:**

Expand All @@ -162,7 +162,7 @@ Update test mocks to match new interface signature:
```csharp
_repository.GetAllAsync(1, 20, null, null, Arg.Any<CancellationToken>())
.Returns(((IReadOnlyList<TDto>)items, total));
```
```text

**Key principles:**

Expand All @@ -187,13 +187,13 @@ Combine flags: `"im"` for case-insensitive multi-line

```csharp
filterBuilder.Eq(x => x.Status, "Active")
```
```text

### Text search (case-insensitive)

```csharp
filterBuilder.Regex(x => x.Title, new BsonRegularExpression(searchTerm, "i"))
```
```text

### Multi-field search (OR)

Expand All @@ -202,13 +202,13 @@ filterBuilder.Or(
filterBuilder.Regex(x => x.Title, new BsonRegularExpression(term, "i")),
filterBuilder.Regex(x => x.Description, new BsonRegularExpression(term, "i"))
)
```
```text

### Nested field search

```csharp
filterBuilder.Regex(x => x.Author.Name, new BsonRegularExpression(name, "i"))
```
```text

### Date range

Expand All @@ -217,13 +217,13 @@ filterBuilder.And(
filterBuilder.Gte(x => x.CreatedAt, startDate),
filterBuilder.Lte(x => x.CreatedAt, endDate)
)
```
```text

### Array contains

```csharp
filterBuilder.AnyEq(x => x.Tags, tagValue)
```
```text

## Gotchas

Expand Down
6 changes: 3 additions & 3 deletions .copilot/skills/personal-squad/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ A personal squad is a user-level collection of AI agents that travel with you ac

## Directory Structure

```
```text
~/.config/squad/personal-squad/ # Linux/macOS
%APPDATA%/squad/personal-squad/ # Windows
├── agents/
Expand All @@ -15,7 +15,7 @@ A personal squad is a user-level collection of AI agents that travel with you ac
│ │ └── history.md
│ └── ...
└── config.json # Optional: personal squad config
```
```text

## How It Works

Expand Down Expand Up @@ -51,7 +51,7 @@ Optional `config.json` in the personal squad directory:
"ghostProtocol": true,
"agents": {}
}
```
```text

## Environment Variables

Expand Down
10 changes: 5 additions & 5 deletions .copilot/skills/pre-push-test-gate/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,16 @@ The pre-push hook (`.github/hooks/pre-push`) enforces **5 gates** that mirror CI

### Gate 3 — Unit Test Projects (2 total)

```
```text
tests/Architecture.Tests/Architecture.Tests.csproj
tests/Unit.Tests/Unit.Tests.csproj
```
```text

### Gate 4 — Integration Test Projects (1 total, Docker required)

```
```text
tests/Integration.Tests/Integration.Tests.csproj
```
```text

These use Testcontainers (MongoDb) and Aspire DCP. Docker daemon MUST be running.

Expand All @@ -53,7 +53,7 @@ The hook source is committed at `.github/hooks/pre-push`. Install once per clone
```bash
cp .github/hooks/pre-push .git/hooks/pre-push
chmod +x .git/hooks/pre-push
```
```text

> ⚠️ Do NOT create inline hook scripts. Always copy from `.github/hooks/pre-push` to get the full 5-gate version.

Expand Down
Loading
Loading