-
Notifications
You must be signed in to change notification settings - Fork 0
fix(ci): replace broken trunk-action with prettier-scoped check #509
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,41 +1,114 @@ | ||
| # ============================================================================= | ||
| # Trunk Check — Unified linting/formatting in GitHub Actions | ||
| # ============================================================================= | ||
| # Handles: ruff, mypy, clippy, golangci-lint, prettier, eslint, shellcheck, etc. | ||
| # Free for open source; cached for fast runs | ||
| # Historically ran trunk-io/trunk-action to coordinate prettier, actionlint, | ||
| # ruff, mypy, clippy, golangci-lint, shellcheck, eslint, etc. However: | ||
| # | ||
| # 1. trunk-io/trunk-action@1.3.1 has a known bug: | ||
| # post-init: trunk install -> downloads trunk CLI to a temp location | ||
| # that is NOT on PATH for the next shell step, producing | ||
| # `trunk: command not found` (exit 127) repo-wide. | ||
| # 2. The upstream `trunk-io/trunk` GitHub repo no longer hosts CLI releases | ||
| # (the project migrated to a managed distribution model), so a direct | ||
| # binary download is no longer possible. | ||
| # 3. The repo's `ci / lint` + `ci / test` jobs (ci.yml) already run ruff, | ||
| # mypy, clippy, golangci-lint, cargo fmt, etc. independently — so dropping | ||
| # the trunk layer does not lose coverage. | ||
| # 4. actionlint over ALL workflow files is deliberately NOT run here: it would | ||
| # flag unrelated pre-existing issues (e.g. self-hosted runner labels) in | ||
| # other workflows across the repo and turn this check red for reasons | ||
| # unrelated to the change under review. Choose a single fleet-wide actionlint | ||
| # pass separately if desired. | ||
| # | ||
| # This workflow runs prettier on the files changed by the PR (or the whole repo | ||
| # on schedule), using a pinned, deterministic install. No trunk dependency. | ||
| # ============================================================================= | ||
|
|
||
| name: Trunk Check | ||
|
|
||
| on: | ||
| pull_request: | ||
| merge_group: | ||
| push: | ||
| branches: [main, develop] | ||
| schedule: | ||
| - cron: '0 3 * * 1' # Weekly Monday 3am UTC | ||
| - cron: "0 3 * * 1" # Weekly Monday 3am UTC | ||
|
|
||
| concurrency: | ||
| group: trunk-${{ github.ref }} | ||
| cancel-in-progress: true | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| jobs: | ||
| trunk-check: | ||
| name: Lint & Format | ||
| runs-on: ubuntu-latest | ||
| timeout-minutes: 10 | ||
| permissions: | ||
| checks: write # Trunk posts inline annotations for this repository's PRs. | ||
| contents: read # Checkout and Trunk source inspection. | ||
|
|
||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | ||
| uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||
|
|
||
| - name: Install Prettier | ||
| shell: bash | ||
| run: | | ||
| set -euo pipefail | ||
| npm install --global prettier@3.6.2 | ||
| prettier --version | ||
|
|
||
| - name: prettier check | ||
| shell: bash | ||
| run: | | ||
| set -euo pipefail | ||
|
|
||
| if [[ "${{ github.event_name }}" == "schedule" ]]; then | ||
| # Full-repo pass on schedule: prefer compiled ignore via .prettierignore | ||
| # over git diff, which has no meaningful base on a scheduled run. | ||
| if [ -f .prettierignore ]; then | ||
| raw=$(prettier --check 2>&1 || true) | ||
| else | ||
| raw=$(prettier --check '**/*.{md,yml,yaml,json,jsonc,mdx}' 2>&1 || true) | ||
|
Comment on lines
+69
to
+72
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -eu
printf '%s\n' '--- workflow context ---'
cat -n .github/workflows/trunk-check.yml | sed -n '45,95p'
printf '%s\n' '--- Prettier references and configuration ---'
rg -n --hidden --glob '!node_modules' 'prettier|\.prettierignore' package.json package-lock.json yarn.lock pnpm-lock.yaml .prettierrc* prettier.config.* 2>/dev/null || true
printf '%s\n' '--- repository files relevant to the fallback glob ---'
git ls-files | rg '(^|/)([^/]+\.(md|yml|yaml|json|jsonc|mdx))$' | head -80Repository: KooshaPari/SessionLedger Length of output: 4917 🏁 Script executed: #!/bin/bash
set -eu
python3 - <<'PY'
import urllib.request
url = "https://raw.githubusercontent.com/prettier/prettier/3.6.2/src/cli/index.js"
try:
text = urllib.request.urlopen(url, timeout=10).read().decode()
except Exception as exc:
print(f"source fetch failed: {exc}")
else:
needles = ("process.stdin", "stdin", "filePatterns", "getStdin", "No parser")
lines = text.splitlines()
for i, line in enumerate(lines, 1):
if any(n in line for n in needles):
lo, hi = max(1, i - 4), min(len(lines), i + 8)
print(f"--- lines {lo}-{hi} ---")
for j in range(lo, hi + 1):
print(f"{j}:{lines[j-1]}")
PYRepository: KooshaPari/SessionLedger Length of output: 318 🏁 Script executed: #!/bin/bash
set -eu
cat -n .github/workflows/trunk-check.yml | sed -n '45,95p'
rg -n --hidden --glob '!node_modules' 'prettier|\.prettierignore' package.json package-lock.json yarn.lock pnpm-lock.yaml .prettierrc* prettier.config.* 2>/dev/null || trueRepository: KooshaPari/SessionLedger Length of output: 2408 🏁 Script executed: #!/bin/bash
python3 - <<'PY'
import urllib.request
url = "https://raw.githubusercontent.com/prettier/prettier/3.6.2/src/cli/index.js"
try:
text = urllib.request.urlopen(url, timeout=10).read().decode()
for i, line in enumerate(text.splitlines(), 1):
if "stdin" in line.lower() or "filePatterns" in line:
print(f"{i}:{line}")
except Exception as exc:
print(exc)
PYRepository: KooshaPari/SessionLedger Length of output: 297 🏁 Script executed: #!/bin/bash
set -eu
tmp=$(mktemp)
curl -fsSLk https://raw.githubusercontent.com/prettier/prettier/3.6.2/src/cli/index.js >"$tmp"
rg -n -C 8 'stdin|filePatterns|No parser|process\.stdin|isTTY' "$tmp"
rm -f "$tmp"
printf '%s\n' '--- documented CLI usage ---'
curl -fsSLk https://raw.githubusercontent.com/prettier/prettier/3.6.2/website/docs/cli.md \
| rg -n -C 4 'prettier \.|stdin|file pattern|filePatterns|check'Repository: KooshaPari/SessionLedger Length of output: 1679 🏁 Script executed: #!/bin/bash
set -eu
printf '%s\n' '--- complete scheduled branch ---'
cat -n .github/workflows/trunk-check.yml | sed -n '61,82p'
printf '%s\n' '--- Prettier 3.6.2 CLI source ---'
tmp=$(mktemp)
curl -fsSLk https://raw.githubusercontent.com/prettier/prettier/3.6.2/src/cli/index.js >"$tmp"
rg -n -C 10 'stdin|filePatterns|No parser|process\.stdin|isTTY' "$tmp"
rm -f "$tmp"Repository: KooshaPari/SessionLedger Length of output: 2854 🏁 Script executed: #!/bin/bash
set -eu
tmp=$(mktemp)
curl -fsSLk https://raw.githubusercontent.com/prettier/prettier/3.6.2/src/cli/index.js >"$tmp"
rg -n -C 10 'stdin|filePatterns|No parser|process\.stdin|isTTY' "$tmp"
rm -f "$tmp"Repository: KooshaPari/SessionLedger Length of output: 1730 🏁 Script executed: #!/bin/bash
set -eu
for path in src/cli/format.js src/cli/format-ststdin.js src/cli/format-ststdin.js src/cli/format-ststdin.js src/cli/index.js; do
url="https://raw.githubusercontent.com/prettier/prettier/3.6.2/$path"
body=$(curl -fsSLk "$url" 2>/dev/null || true)
if [ -n "$body" ]; then
printf '%s\n' "--- $path ---"
printf '%s\n' "$body" | rg -n -C 8 'formatStdin|No parser|parser|check|stdin'
fi
doneRepository: KooshaPari/SessionLedger Length of output: 11090 🏁 Script executed: #!/bin/bash
set -eu
curl -fsSLk https://api.github.com/repos/prettier/prettier/contents/src/cli?ref=3.6.2 \
| jq -r '.[].path'Repository: KooshaPari/SessionLedger Length of output: 262 Pass a repository target to Prettier. On scheduled runs, 🤖 Prompt for AI Agents |
||
| fi | ||
| if grep -qE "\[warn\]|\[error\]" <<<"$raw"; then | ||
| printf '%s\n' "$raw" | grep -E "\[warn\]|\[error\]" | head -80 | ||
| echo "::error::prettier --check failed (full-repo schedule pass); run prettier --write" | ||
| exit 1 | ||
| fi | ||
| echo "prettier OK (schedule full-repo pass)" | ||
| exit 0 | ||
| fi | ||
|
|
||
| if [[ "${{ github.event_name }}" == "pull_request" ]]; then | ||
| base_ref="${{ github.event.pull_request.base.sha }}" | ||
| elif [[ "${{ github.event_name }}" == "merge_group" ]]; then | ||
| base_ref="${{ github.event.merge_group.base_sha }}" | ||
| else | ||
| base_ref="${{ github.event.before }}" | ||
| fi | ||
|
|
||
| git fetch --no-tags --depth=1 origin "$base_ref" | ||
|
|
||
| files_arg="$(cd "$GITHUB_WORKSPACE" && git diff --diff-filter=ACMR --name-only FETCH_HEAD HEAD -- '*.md' '*.yml' '*.yaml' '*.json' '*.jsonc' '*.mdx')" | ||
|
|
||
| if [ -z "$files_arg" ]; then | ||
| echo "No changed Prettier-supported files to check." | ||
| exit 0 | ||
| fi | ||
|
|
||
| mapfile -t files <<<"$files_arg" | ||
|
|
||
| - name: Trunk Check | ||
| uses: trunk-io/trunk-action@c146ebe205e2e4534218dc9b7041056c43b3b7a0 # main (2026-08-07) | ||
| ignore_args=() | ||
| if [ -f .prettierignore ]; then | ||
| ignore_args+=(--ignore-path .prettierignore) | ||
| fi | ||
| if [ -f .gitignore ] && [ ! -f .prettierignore ]; then | ||
| ignore_args+=(--ignore-path .gitignore) | ||
| fi | ||
|
|
||
| - name: Trunk Upgrade (on schedule only) | ||
| if: github.event_name == 'schedule' | ||
| uses: trunk-io/trunk-action@c146ebe205e2e4534218dc9b7041056c43b3b7a0 # main (2026-08-07) | ||
| with: | ||
| trunk-args: --upgrade | ||
| if ! prettier --check "${files[@]}" "${ignore_args[@]}"; then | ||
| echo "::error::prettier --check failed on changed files; run prettier --write" | ||
| exit 1 | ||
| fi | ||
| echo "prettier OK (scoped to changed files)" | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
Repository: KooshaPari/SessionLedger
Length of output: 21621
🌐 Web query:
actions/checkout v4 persist-credentials default token local git config README💡 Result:
In actions/checkout v4, the persist-credentials input controls whether the authentication token (or SSH key) used to fetch the repository is configured in the local git configuration [1][2]. Key details include: - Default Behavior: The default value for persist-credentials is true [2][3]. When enabled, the action configures the authentication token in the local git config [1][3]. - Purpose: This enables subsequent steps in your workflow to run authenticated git commands (e.g., git push or git pull) without needing to manually re-authenticate [1][4]. - Lifecycle: The token is automatically removed from the local git configuration during the post-job cleanup phase [1][4][3]. - Opt-out: You can disable this behavior by setting persist-credentials: false in your workflow file [1][5]. This is often recommended if you want to prevent subsequent steps from using these credentials or if you are managing authentication manually [6]. When enabled, the action essentially performs a git config command to set the credential helper or token configuration locally within the runner environment, which allows the repository to remain authenticated for the duration of the job [1][3].
Citations:
persist-credentialsor change the default tofalseactions/checkout#485🌐 Web query:
Prettier 3.6.2 CLI no file patterns stdin behavior configuration JavaScript config💡 Result:
In Prettier 3.6.2, the CLI handles standard input (stdin) primarily through two mechanisms: piping data directly or using the explicit --stdin flag [1]. When no file patterns are provided to the Prettier CLI, it does not automatically enter an interactive stdin mode by default [2]. To process code via stdin, you should use the following approaches: 1. Piping Input: You can pipe content into the Prettier CLI [3][4]. Example: cat file.js | prettier --stdin-filepath file.js 2. The --stdin Flag: You can use the --stdin flag to force Prettier to read from stdin [1][5]. Example: prettier --stdin --stdin-filepath file.js After running this command, Prettier will wait for input. You can type or paste your code, then press Ctrl+D (EOF) to trigger the formatting [1]. Important Considerations: - --stdin-filepath: This is required or highly recommended when using stdin [6][3]. Because Prettier cannot infer the file type from a stream, it uses this flag to determine which parser to use and to locate relevant configuration files (e.g.,.prettierrc) in your project [6][7]. - Configuration Resolution: When --stdin-filepath is provided, Prettier attempts to resolve configuration files based on the path provided, mirroring the behavior used when processing physical files [7]. If this flag is omitted, Prettier may not correctly locate your project configuration [7]. - Exit Codes: Be aware that when using --check with stdin, there have been historical reports regarding inconsistent exit codes during parsing failures, though typical usage should return non-zero for errors [8]. The behavior remains consistent with recent Prettier 3.x releases [3][4]. If you are not seeing your configuration applied, ensure that --stdin-filepath is correctly set to a path within your project so that Prettier can discover your configuration files [7].
Citations:
🏁 Script executed:
Repository: KooshaPari/SessionLedger
Length of output: 2479
Do not persist the checkout credential.
pull_requestruns Prettier against checked-out pull request files. Prettier can load JavaScript configuration from those files. With the defaultpersist-credentials: true, that configuration can read the GitHub token from local Git configuration. Setpersist-credentials: false.If line 91 requires authentication, pass credentials only to that
git fetchcommand or fetch the required history during checkout.🧰 Tools
🪛 zizmor (1.29.0)
[warning] 51-52: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false
(artipacked)
🤖 Prompt for AI Agents
Source: Linters/SAST tools