Dashboard › sentry › Session 0QyJbcFVhlQm
0QyJbcFVhlQmPfYjtI need to find the best way to lint GitHub Actions workflow YAML files in CI to catch schema errors (like empty with: blocks, invalid keys, etc.) before they reach GitHub.
Research the following options in the codebase at /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf:
actionlint — the most popular GitHub Actions linter. Check:
lint script in package.json?Check the existing CI workflow at .github/workflows/ci.yml — is there already a lint step? Could actionlint be added alongside the existing biome check?
Check if biome or any existing tool already validates YAML files. Look at biome.json for any YAML config.
Check the project's package.json for any existing YAML-related tools or scripts.
Look at pnpm-workspace.yaml and other YAML files in the repo to understand the YAML surface area.
Check .github/workflows/ directory — how many workflow files are there? List them all.
Report back with:
test job? new job? separate workflow?).actionlint.yml config file)I'll research all of these areas in parallel to give you a comprehensive recommendation.
/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/eval.yml /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/ci.yml /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/docs-preview.yml /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/release.yml /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/publish.yml /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/cleanup-nightlies.yml /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/cch-seed-check.yml
No files found
/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/pnpm-lock.yaml /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/pnpm-workspace.yaml /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/packages/hermes/lore_hermes/plugin.yaml
/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/eval.yml /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/ci.yml /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/docs-preview.yml /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/release.yml /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/publish.yml /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/cleanup-nightlies.yml /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/cch-seed-check.yml /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.craft.yml
/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/package.json /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/packages/website/package.json /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/packages/gateway/package.json /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/packages/core/package.json /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/packages/opencode/package.json /home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/packages/pi/package.json
/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/biome.json
No files found
No files found
Now let me read all the key files in parallel:
<path>/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/ci.yml</path>
<type>file</type>
<content>
1: name: CI
2:
3: on:
4: push:
5: branches: [main, 'release/**']
6: pull_request:
7: branches: [main]
8:
9: # packages:write is needed for publish-nightly to push to GHCR
10: permissions:
11: contents: read
12: packages: write
13:
14: env:
15: # Commit timestamp used for deterministic nightly version strings.
16: # Defined at workflow level so all jobs agree on the same value.
17: COMMIT_TIMESTAMP: ${{ github.event.head_commit.timestamp }}
18:
19: jobs:
20: # ---------------------------------------------------------------------------
21: # Change detection: skip heavy CI for docs-only changes
22: # ---------------------------------------------------------------------------
23: changes:
24: runs-on: ubuntu-latest
25: permissions:
26: pull-requests: read
27: outputs:
28: ...
<path>/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/package.json</path>
<type>file</type>
<content>
1: {
2: "name": "lore-monorepo",
3: "private": true,
4: "type": "module",
5: "license": "FSL-1.1-Apache-2.0",
6: "description": "Monorepo root for Lore — three-tier memory architecture",
7: "main": "./packages/opencode/src/index.ts",
8: "exports": {
9: ".": "./packages/opencode/src/index.ts"
10: },
11: "packageManager": "pnpm@10.28.0",
12: "pnpm": {
13: "onlyBuiltDependencies": [
14: "esbuild",
15: "sharp"
16: ]
17: },
18: "scripts": {
19: "typecheck": "pnpm -r run typecheck",
20: "test": "vitest run",
21: "pretest": "pnpm --filter @loreai/gateway run bundle",
22: "build": "pnpm -r run build",
23: "site:dev": "pnpm --filter '@loreai/website' dev",
24: "site:build": "pnpm --filter '@loreai/website' build",
25: "site:preview": "pnpm --filter '@loreai/website' ...
<path>/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/biome.json</path>
<type>file</type>
<content>
1: {
2: "$schema": "https://biomejs.dev/schemas/2.4.16/schema.json",
3: "vcs": {
4: "enabled": true,
5: "clientKind": "git",
6: "useIgnoreFile": true
7: },
8: "files": {
9: "ignoreUnknown": true,
10: "includes": [
11: "packages/**/*.{ts,tsx,js,mjs,cjs,json,jsonc}",
12: "scripts/**/*.{ts,js}",
13: "*.{ts,js,json,jsonc}",
14: "!**/dist",
15: "!**/dist-bin",
16: "!**/dist-tarballs",
17: "!**/dist-vendor",
18: "!**/.sea-staging",
19: "!**/.vendor-build",
20: "!**/*.d.ts",
21: "!**/eval/data",
22: "!**/eval/fixtures",
23: "!**/eval/results"
24: ]
25: },
26: "formatter": {
27: "enabled": true,
28: "indentStyle": "space",
29: "indentWidth": 2,
30: "lineWidth": 80
31: },
32: "javascript": {
33: "formatter": {
34: ...
<path>/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/pnpm-workspace.yaml</path> <type>file</type> <content> 1: packages: 2: - "packages/*" (End of file - total 2 lines) </content>
<path>/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.craft.yml</path> <type>file</type> <content> 1: minVersion: '2.21.1' 2: changelog: 3: policy: auto 4: versioning: 5: policy: auto 6: # Custom version bump script — bypasses craft's built-in npm-based auto-bumping 7: # which fails on our `workspace:*` deps. See scripts/bump-version.sh for details. 8: preReleaseCommand: bash scripts/bump-version.sh 9: statusProvider: 10: name: github 11: config: 12: contexts: 13: # Must match the check-run names from ci.yml that produce release artifacts. 14: # Update these if you rename the jobs. 15: - "test" 16: - "Generate Release Patches" 17: artifactProvider: 18: name: github 19: config: 20: artifacts: 21: # CI workflow uploads three artifact groups on release branches: 22: # npm-tarball — workspace .tgz files for npm publish 23: # release-binaries — gzipped standalone CLI ...
Now let me read the remaining workflow files to complete the picture of the YAML surface area:
<path>/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/eval.yml</path> <type>file</type> <content> 1: name: Lore Eval Suite 2: 3: on: 4: # Live mode on weekly schedule 5: schedule: 6: - cron: '0 6 * * 1' # Monday 6am UTC 7: 8: # Manual trigger with mode selection 9: workflow_dispatch: 10: inputs: 11: mode: 12: description: 'Eval mode' 13: type: choice 14: options: 15: - fixture 16: - live 17: default: fixture 18: dimensions: 19: description: 'Comma-separated dimensions (or "all")' 20: default: 'all' 21: baselines: 22: description: 'Comma-separated baselines (or empty for defaults)' 23: default: '' 24: 25: jobs: 26: eval-fixture: 27: if: github.event_name == 'workflow_dispatch' && inputs.mode == 'fixture' 28: runs-on: ubuntu-latest 29: timeout-minutes: 15 30: steps: 31: - uses: ...
<path>/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/release.yml</path>
<type>file</type>
<content>
1: name: Release
2: on:
3: workflow_dispatch:
4: inputs:
5: version:
6: description: Version to release (or "auto")
7: required: false
8: force:
9: description: Force a release even when there are release-blockers
10: type: boolean
11: default: false
12:
13: jobs:
14: release:
15: runs-on: ubuntu-latest
16: name: Release a new version
17: environment: production
18: permissions:
19: contents: write
20: issues: write
21: steps:
22: - uses: actions/create-github-app-token@v3
23: id: app-token
24: with:
25: app-id: ${{ vars.APP_ID }}
26: private-key: ${{ secrets.APP_PRIVATE_KEY }}
27:
28: - uses: actions/checkout@v6
29: with:
30: token: ${{ steps.app-token.outputs.token ...
<path>/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/publish.yml</path>
<type>file</type>
<content>
1: name: Publish
2: on:
3: issues:
4: types: [labeled]
5:
6: jobs:
7: publish:
8: if: github.event.label.name == 'accepted' && github.event.issue.state == 'open'
9: runs-on: ubuntu-latest
10: name: Publish release
11: environment: production
12: permissions:
13: contents: write
14: id-token: write
15: issues: write
16: timeout-minutes: 15
17: steps:
18: - uses: actions/create-github-app-token@v3
19: id: app-token
20: with:
21: app-id: ${{ vars.APP_ID }}
22: private-key: ${{ secrets.APP_PRIVATE_KEY }}
23:
24: - name: Parse publish request
25: id: inputs
26: env:
27: ISSUE_TITLE: ${{ github.event.issue.title }}
28: run: |
29: # Title format: "publish: owner/repo@VERSION"
30: ...
<path>/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/docs-preview.yml</path>
<type>file</type>
<content>
1: name: Docs Preview
2:
3: on:
4: workflow_dispatch:
5: push:
6: branches: [main]
7: paths:
8: - 'packages/website/**'
9: - '.github/workflows/docs-preview.yml'
10: pull_request:
11: # No paths filter on pull_request: the 'closed' event must always fire
12: # so the preview action can clean up deployed previews. A paths-filter
13: # step inside the job skips deploy for non-docs PRs.
14: types: [opened, reopened, synchronize, closed]
15:
16: permissions:
17: contents: write
18: pull-requests: write
19:
20: concurrency:
21: group: docs-preview-${{ github.ref }}
22: cancel-in-progress: true
23:
24: jobs:
25: preview:
26: runs-on: ubuntu-latest
27: steps:
28: - uses: actions/checkout@v6
29:
30: - uses: pnpm/action-setup@v4
31:
32: - uses: ...
<path>/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/cleanup-nightlies.yml</path>
<type>file</type>
<content>
1: name: Cleanup Nightly Tags
2:
3: on:
4: schedule:
5: # Every Sunday at 06:00 UTC
6: - cron: "0 6 * * 0"
7: workflow_dispatch:
8:
9: permissions:
10: packages: write
11:
12: jobs:
13: cleanup:
14: name: Prune Old Nightly Tags
15: runs-on: ubuntu-latest
16: steps:
17: - name: Install ORAS CLI
18: run: |
19: VERSION=1.3.1
20: EXPECTED_SHA256="d52c4af76ce6a3ceb8579e51fb751a43ac051cca67f965f973a0b0e897a2bb86"
21: TARBALL="oras_${VERSION}_linux_amd64.tar.gz"
22: curl --retry 3 --retry-delay 5 --retry-all-errors -sfLo "$TARBALL" \
23: "https://github.com/oras-project/oras/releases/download/v${VERSION}/${TARBALL}"
24: echo "${EXPECTED_SHA256} ${TARBALL}" | sha256sum -c -
25: tar -xz -C /usr/local/bin ...
<path>/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/cch-seed-check.yml</path>
<type>file</type>
<content>
1: name: CCH Seed Check
2:
3: on:
4: schedule:
5: # Check every 6 hours for new Claude Code versions
6: - cron: '0 */6 * * *'
7: workflow_dispatch:
8: inputs:
9: force-version:
10: description: 'Force extraction for a specific version (e.g. 2.1.140)'
11: required: false
12: type: string
13:
14: permissions:
15: contents: write
16: pull-requests: write
17:
18: jobs:
19: check-version:
20: runs-on: ubuntu-latest
21: outputs:
22: needs-extraction: ${{ steps.check.outputs.needs-extraction }}
23: latest-version: ${{ steps.check.outputs.latest-version }}
24: missing-versions: ${{ steps.check.outputs.missing-versions }}
25: steps:
26: - uses: actions/checkout@v6
27:
28: - uses: pnpm/action-setup@v4
29: - uses: ...
<path>/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/packages/hermes/lore_hermes/plugin.yaml</path> <type>file</type> <content> 1: name: lore 2: version: 0.1.0 3: description: > 4: Lore integration — three-tier cross-session memory with distillation, 5: hybrid recall, and gradient context management. Replaces the built-in 6: compressor and routes LLM calls through the Lore gateway. 7: provides_hooks: 8: - on_session_start 9: - pre_llm_call (End of file - total 9 lines) </content>
Now let me check if there are any existing YAML-related npm packages or tools, and look at what actionlint offers:
No files found
No files found
Let me also quickly check what actionlint's GitHub Action and installation options look like:
GitHub - rhysd/actionlint: :octocat: Static checker for GitHub Actions workflow files · GitHub
[Skip to content](#start-of-content)
## Navigation Menu
Toggle navigation
[](/)
[Sign in](/login?return_to=https%3A%2F%2Fgithub.com%2Frhysd%2Factionlint)
Appearance settings
- Platform
- AI CODE CREATION
- [
GitHub CopilotWrite better code with AI
](https://github.com/features/copilot)
- [
GitHub Copilot appDirect agents from issue to merge
](https://github.com/features/ai/github-app)
- [
MCP RegistryNewIntegrate external tools
](https://github.com/mcp)
- DEVELOPER WORKFLOWS
- [
ActionsAutomate any workflow
...
Now I have all the information needed. Here is my complete research report.
GitHub Actions workflow files (7 total):
/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/ci.yml (922 lines -- the big one)/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/eval.yml (129 lines)/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/release.yml (39 lines)/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/publish.yml (185 lines)/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/docs-preview.yml (110 lines)/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/cleanup-nightlies.yml (65 lines)/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.github/workflows/cch-seed-check.yml (202 lines)Other YAML files (not workflow files, actionlint would not touch these):
/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/.craft.yml/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/pnpm-workspace.yaml/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/packages/hermes/lore_hermes/plugin.yaml/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/pnpm-lock.yamlBiome (current linter):
lint script in package.json (line 27) is: "lint": "biome check ."includes in biome.json (lines 10-24) covers only *.{ts,tsx,js,mjs,cjs,json,jsonc} -- **no ...