From ebbca53286551efe55142b32f7e28592dcf5d495 Mon Sep 17 00:00:00 2001 From: Boromir Date: Sun, 10 May 2026 16:38:16 -0700 Subject: [PATCH 1/4] ci: add markdown and YAML lint workflows (#287) - lint-markdown.yml: runs markdownlint-cli2-action using existing .markdownlint.json - lint-yaml.yml: runs yamllint with relaxed line-length (200) and truthy rules - Both trigger on push to dev/insider and PRs to dev/preview/main/insider - Path-filtered to only run when relevant files change Closes #287 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/lint-markdown.yml | 26 +++++++++++++++++++++ .github/workflows/lint-yaml.yml | 36 +++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 .github/workflows/lint-markdown.yml create mode 100644 .github/workflows/lint-yaml.yml diff --git a/.github/workflows/lint-markdown.yml b/.github/workflows/lint-markdown.yml new file mode 100644 index 00000000..a736c94a --- /dev/null +++ b/.github/workflows/lint-markdown.yml @@ -0,0 +1,26 @@ +name: Lint Markdown +# Runs markdownlint-cli2 using the repo's .markdownlint.json config + +on: + push: + branches: [dev, insider] + paths: ['**.md'] + pull_request: + branches: [dev, preview, main, insider] + paths: ['**.md'] + +permissions: + contents: read + +jobs: + markdownlint: + name: markdownlint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - name: Run markdownlint + uses: DavidAnson/markdownlint-cli2-action@v23 + with: + globs: '**/*.md' + config: '.markdownlint.json' diff --git a/.github/workflows/lint-yaml.yml b/.github/workflows/lint-yaml.yml new file mode 100644 index 00000000..a4455050 --- /dev/null +++ b/.github/workflows/lint-yaml.yml @@ -0,0 +1,36 @@ +name: Lint YAML +# Validates all workflow and config YAML files + +on: + push: + branches: [dev, insider] + paths: ['**.yml', '**.yaml'] + pull_request: + branches: [dev, preview, main, insider] + paths: ['**.yml', '**.yaml'] + +permissions: + contents: read + +jobs: + yamllint: + name: yamllint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - name: Run yamllint + uses: ibiqlik/action-yamllint@v3 + with: + file_or_dir: . + config_data: | + extends: default + rules: + line-length: + max: 200 + allow-non-breakable-inline-mappings: true + truthy: + allowed-values: ['true', 'false', 'on'] + brackets: + min-spaces-inside: 0 + max-spaces-inside: 1 From cd5a327f1334fe9c7cf136ed6a4efb6267ee8157 Mon Sep 17 00:00:00 2001 From: Boromir Date: Sun, 10 May 2026 16:55:48 -0700 Subject: [PATCH 2/4] ci(lint): exclude .squad/ from markdown and YAML lint scope Both workflows now ignore the .squad/ tree: - markdownlint: added '!.squad/**' negation glob - yamllint: added top-level 'ignore: .squad/' in config_data Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/lint-markdown.yml | 4 +++- .github/workflows/lint-yaml.yml | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/lint-markdown.yml b/.github/workflows/lint-markdown.yml index a736c94a..8af57ce5 100644 --- a/.github/workflows/lint-markdown.yml +++ b/.github/workflows/lint-markdown.yml @@ -22,5 +22,7 @@ jobs: - name: Run markdownlint uses: DavidAnson/markdownlint-cli2-action@v23 with: - globs: '**/*.md' + globs: | + **/*.md + !.squad/** config: '.markdownlint.json' diff --git a/.github/workflows/lint-yaml.yml b/.github/workflows/lint-yaml.yml index a4455050..af66e806 100644 --- a/.github/workflows/lint-yaml.yml +++ b/.github/workflows/lint-yaml.yml @@ -25,6 +25,8 @@ jobs: file_or_dir: . config_data: | extends: default + ignore: | + .squad/ rules: line-length: max: 200 From 62fc931f9f9bd663dde77cfbd92c4813b4bbde83 Mon Sep 17 00:00:00 2001 From: Boromir Date: Sun, 10 May 2026 17:34:54 -0700 Subject: [PATCH 3/4] ci(lint): fix markdownlint exclusions and yamllint errors in PR #288 - lint-markdown.yml: exclude .copilot/, .github/agents/, .github/skills/, and .github/copilot-instructions.md (agent tooling files, not project docs) - dependabot.yml: remove trailing space on line 9 - squad-mark-released.yml: fix extra spaces after colons in env block (lines 16-18) - squad-heartbeat.yml: remove trailing spaces on multiple lines - squad-pr-auto-label.yml: remove trailing space on line 33 - squad-label-enforce.yml: remove trailing spaces on lines 38, 100, 126, 152 - squad-test.yml: remove trailing space on line 465 - code-metrics.yml: add missing newline at end of file Closes #287 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/dependabot.yml | 2 +- .github/workflows/code-metrics.yml | 2 +- .github/workflows/lint-markdown.yml | 4 ++++ .github/workflows/squad-heartbeat.yml | 10 +++++----- .github/workflows/squad-label-enforce.yml | 8 ++++---- .github/workflows/squad-mark-released.yml | 6 +++--- .github/workflows/squad-pr-auto-label.yml | 2 +- .github/workflows/squad-test.yml | 2 +- 8 files changed, 20 insertions(+), 16 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 797c69f0..17a35b1c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,7 +6,7 @@ version: 2 updates: - + # Maintain dependencies for GitHub Actions - package-ecosystem: "github-actions" directory: "/" diff --git a/.github/workflows/code-metrics.yml b/.github/workflows/code-metrics.yml index 9e4fbe24..749e2606 100644 --- a/.github/workflows/code-metrics.yml +++ b/.github/workflows/code-metrics.yml @@ -50,4 +50,4 @@ jobs: with: title: '${{ steps.dotnet-code-metrics.outputs.summary-title }}' body: '${{ steps.dotnet-code-metrics.outputs.summary-details }}' - commit-message: '.NET code metrics, automated pull request.' \ No newline at end of file + commit-message: '.NET code metrics, automated pull request.' diff --git a/.github/workflows/lint-markdown.yml b/.github/workflows/lint-markdown.yml index 8af57ce5..cf6469ec 100644 --- a/.github/workflows/lint-markdown.yml +++ b/.github/workflows/lint-markdown.yml @@ -25,4 +25,8 @@ jobs: globs: | **/*.md !.squad/** + !.copilot/** + !.github/agents/** + !.github/skills/** + !.github/copilot-instructions.md config: '.markdownlint.json' diff --git a/.github/workflows/squad-heartbeat.yml b/.github/workflows/squad-heartbeat.yml index 00b32a1c..6a68a488 100644 --- a/.github/workflows/squad-heartbeat.yml +++ b/.github/workflows/squad-heartbeat.yml @@ -61,13 +61,13 @@ jobs: core.info('No triage results — board is clear'); return; } - + const results = JSON.parse(fs.readFileSync(path, 'utf8')); if (results.length === 0) { core.info('📋 Board is clear — Ralph found no untriaged issues'); return; } - + for (const decision of results) { try { await github.rest.issues.addLabels({ @@ -76,7 +76,7 @@ jobs: issue_number: decision.issueNumber, labels: [decision.label] }); - + await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, @@ -92,13 +92,13 @@ jobs: '> To reassign, swap the `squad:*` label.' ].join('\n') }); - + core.info(`Triaged #${decision.issueNumber} → ${decision.assignTo} (${decision.source})`); } catch (e) { core.warning(`Failed to triage #${decision.issueNumber}: ${e.message}`); } } - + core.info(`🔄 Ralph triaged ${results.length} issue(s)`); # Copilot auto-assign step (uses PAT if available) diff --git a/.github/workflows/squad-label-enforce.yml b/.github/workflows/squad-label-enforce.yml index 147ac130..2cc36a93 100644 --- a/.github/workflows/squad-label-enforce.yml +++ b/.github/workflows/squad-label-enforce.yml @@ -35,7 +35,7 @@ jobs: // Handle go: namespace (mutual exclusivity) if (appliedLabel.startsWith('go:')) { - const otherGoLabels = allLabels.filter(l => + const otherGoLabels = allLabels.filter(l => l.startsWith('go:') && l !== appliedLabel ); @@ -97,7 +97,7 @@ jobs: // Handle release: namespace (mutual exclusivity) if (appliedLabel.startsWith('release:')) { - const otherReleaseLabels = allLabels.filter(l => + const otherReleaseLabels = allLabels.filter(l => l.startsWith('release:') && l !== appliedLabel ); @@ -123,7 +123,7 @@ jobs: // Handle type: namespace (mutual exclusivity) if (appliedLabel.startsWith('type:')) { - const otherTypeLabels = allLabels.filter(l => + const otherTypeLabels = allLabels.filter(l => l.startsWith('type:') && l !== appliedLabel ); @@ -149,7 +149,7 @@ jobs: // Handle priority: namespace (mutual exclusivity) if (appliedLabel.startsWith('priority:')) { - const otherPriorityLabels = allLabels.filter(l => + const otherPriorityLabels = allLabels.filter(l => l.startsWith('priority:') && l !== appliedLabel ); diff --git a/.github/workflows/squad-mark-released.yml b/.github/workflows/squad-mark-released.yml index 7b5b6abc..32138f26 100644 --- a/.github/workflows/squad-mark-released.yml +++ b/.github/workflows/squad-mark-released.yml @@ -13,9 +13,9 @@ permissions: contents: read env: - PROJECT_ID: PVT_kwHOA5k0b84BVFTy - STATUS_FIELD_ID: PVTSSF_lAHOA5k0b84BVFTyzhQjgPk - DONE_OPTION_ID: "98236657" + PROJECT_ID: PVT_kwHOA5k0b84BVFTy + STATUS_FIELD_ID: PVTSSF_lAHOA5k0b84BVFTyzhQjgPk + DONE_OPTION_ID: "98236657" RELEASED_OPTION_ID: "8e246b27" jobs: diff --git a/.github/workflows/squad-pr-auto-label.yml b/.github/workflows/squad-pr-auto-label.yml index c0ff06fe..c918e541 100644 --- a/.github/workflows/squad-pr-auto-label.yml +++ b/.github/workflows/squad-pr-auto-label.yml @@ -30,7 +30,7 @@ jobs: const labelNames = currentLabels.map(l => l.name); // Check if already has squad labels - const hasSquadLabel = labelNames.some(name => + const hasSquadLabel = labelNames.some(name => name === 'squad' || name.startsWith('squad:') ); diff --git a/.github/workflows/squad-test.yml b/.github/workflows/squad-test.yml index 754fe33d..37cfd710 100644 --- a/.github/workflows/squad-test.yml +++ b/.github/workflows/squad-test.yml @@ -462,7 +462,7 @@ jobs: ls -la ~/.cache/ms-playwright/ 2>/dev/null || echo "No playwright cache found" echo "dotnet version:" dotnet --version - + dotnet test tests/AppHost.Tests \ --configuration Release \ --no-build \ From 439720f05af3d752fc67986f2d1cb2f1bbaee244 Mon Sep 17 00:00:00 2001 From: Boromir Date: Sun, 10 May 2026 18:35:11 -0700 Subject: [PATCH 4/4] ci(lint): add config and workflow file to markdown lint trigger paths - Add '.markdownlint.json' to trigger paths so workflow runs when config changes - Add '.github/workflows/lint-markdown.yml' to trigger paths for workflow self-triggers - Ensures lint-markdown workflow properly triggers on config updates and its own changes Closes #288 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/lint-markdown.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint-markdown.yml b/.github/workflows/lint-markdown.yml index cf6469ec..d03c4004 100644 --- a/.github/workflows/lint-markdown.yml +++ b/.github/workflows/lint-markdown.yml @@ -4,10 +4,10 @@ name: Lint Markdown on: push: branches: [dev, insider] - paths: ['**.md'] + paths: ['**.md', '.markdownlint.json', '.github/workflows/lint-markdown.yml'] pull_request: branches: [dev, preview, main, insider] - paths: ['**.md'] + paths: ['**.md', '.markdownlint.json', '.github/workflows/lint-markdown.yml'] permissions: contents: read