DashboardsentrySession 0QyJbcFVhlQm

Session 0QyJbcFVhlQm

Full ID: 0QyJbcFVhlQmPfYjt
Messages: 12
Distillations: 0
Time range: 2026-06-07 21:13:26 — 2026-06-07 21:16:29

Conversation (12 messages)

I 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:

  1. actionlint — the most popular GitHub Actions linter. Check:

    • How to install it in CI (is there a pre-built binary? A GitHub Action?)
    • What does it catch? (schema validation, expression errors, deprecated actions, etc.)
    • Can it run as a pre-commit hook or CI step?
    • Can it be added to the existing lint script in package.json?
  2. 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?

  3. Check if biome or any existing tool already validates YAML files. Look at biome.json for any YAML config.

  4. Check the project's package.json for any existing YAML-related tools or scripts.

  5. Look at pnpm-workspace.yaml and other YAML files in the repo to understand the YAML surface area.

  6. Check .github/workflows/ directory — how many workflow files are there? List them all.

Report back with:

  • The recommended approach (actionlint is almost certainly the answer, but verify)
  • Where to add it in the CI pipeline (new step in the existing test job? new job? separate workflow?)
  • Whether it should also be a local dev tool (npm script or pre-commit hook)
  • Any configuration needed (e.g. .actionlint.yml config file)
  • The exact CI step YAML to add
gateway · 2026-06-07 21:13:26

I'll research all of these areas in parallel to give you a comprehensive recommendation.

claude-opus-4-6 · 2026-06-07 21:13:26 · ~30 tokens
result
/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
result
No files found
result
/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
result
/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
result
/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
result
/home/byk/.local/share/opencode/worktree/51d1015fd1f616acf9a5ffaad9331ec6b304586b/witty-wolf/biome.json
result
No files found
result
No files found
gateway · 2026-06-07 21:15:04

Now let me read all the key files in parallel:

claude-opus-4-6 · 2026-06-07 21:15:04 · ~16 tokens
result
<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:       ...
result
<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' ...
result
<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:   ...
result
<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>
result
<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 ...
gateway · 2026-06-07 21:15:13

Now let me read the remaining workflow files to complete the picture of the YAML surface area:

claude-opus-4-6 · 2026-06-07 21:15:13 · ~32 tokens
result
<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: ...
result
<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 ...
result
<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:       ...
result
<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: ...
result
<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 ...
result
<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: ...
result
<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>
gateway · 2026-06-07 21:15:19

Now let me check if there are any existing YAML-related npm packages or tools, and look at what actionlint offers:

claude-opus-4-6 · 2026-06-07 21:15:19 · ~39 tokens
result
No files found
result
No files found
gateway · 2026-06-07 21:15:24

Let me also quickly check what actionlint's GitHub Action and installation options look like:

claude-opus-4-6 · 2026-06-07 21:15:24 · ~32 tokens
result
                       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
            
            ...
gateway · 2026-06-07 21:16:29

Now I have all the information needed. Here is my complete research report.


Research Findings

1. YAML Surface Area in the Repository

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.yaml

2. Existing Lint Infrastructure

Biome (current linter):

  • The lint script in package.json (line 27) is: "lint": "biome check ."
  • Biome's includes in biome.json (lines 10-24) covers only *.{ts,tsx,js,mjs,cjs,json,jsonc} -- **no ...
claude-opus-4-6 · 2026-06-07 21:16:29 · ~3.2K tokens