-
-
Notifications
You must be signed in to change notification settings - Fork 0
fix(release): cut v0.15.1 after Phase 0 DevOps stabilization #297
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
9a48ab2
3d49703
b6c0d96
403642e
628b16b
a9fde10
26401e3
db02671
535d53c
4055595
305bcb5
fcd26b9
a88f19d
488359e
f34ab5e
4d2c4ac
fff8cd8
0782ea8
1375fcd
51e8112
2e60230
26f2757
043148c
e8250b8
c913465
26bccb5
31a880e
63610e4
73f9938
cd01862
e1eb092
cb9a82e
aa2bbf6
46ae6de
fbb5448
4a087e7
3902345
47fec79
614b26f
06a147d
f5f8f25
5fe153e
56ba2a5
1f61ed7
bf58f4a
7bda4c1
b44fc75
9e16eec
78a20cd
3d16297
d8f8ca6
589fe17
9f6f229
48195ab
8ea9877
016a524
0cd1214
308c229
d1c3cb7
2cb58bd
fcc9d96
9f137d3
36e1a5b
d104dd1
a6b3558
0e435e2
080cb68
3646cb2
57d4303
8153c78
fc9ab96
99b3f56
f4e904c
1e1a44c
5af6419
71bf473
249a2ad
801a738
17c9ff2
3dabece
38a5170
c099dbd
b8a4e81
e013638
c87de4e
2c753b3
6948a26
ff0e19b
35c346e
35f3804
09cf396
d773955
bc424cb
c8d8833
d8846d9
188c7d8
d86c2ec
d096658
65abbd6
d6783af
df64ff5
f9766d3
452f3bd
3f7b49d
5d112ff
3d41f25
5e3af25
4b08f07
7344281
b429ab3
3ed08b4
cdd2db0
177091d
9f2ba75
cbe39c8
38b8128
592d889
09ac09a
5cd5520
2ef5a9a
a8bf258
0999107
40c5216
d65eb5c
8dc7079
024e46c
193bbce
d5cd8ed
cfe513d
21be0a5
b959a25
00e25bf
04e4e18
21af479
4ccab57
e908280
8a1f5c8
a24a231
64d7010
f686ab6
9d64ea9
a472580
6e05279
b2f65aa
01b51cb
f6ddcad
41c811c
078c8f4
7030149
ad325d8
1680e01
31c5474
7fd0ee1
2bf9c1e
20e101c
e80caf8
e3b2ef8
1e20308
fb0dafc
3b01d4b
3f0bc7f
578ad70
ab4a486
dc5bc73
075995d
0e85b24
472bc4e
4e36788
d2d763f
52a2bbe
68c56b6
2672cdc
4ace564
9bccc62
a1f8422
ef6c615
549339d
19bf2ca
920cad9
321da87
ebb4c17
b0700b4
b5d2733
0dfe6db
6328c4b
e366f10
a1a6679
8deb73a
1ab1400
d58dbf8
4f17e78
807a8e4
f0e2715
49f5662
a63fad9
120ce15
67a0831
d4ce973
bb88da2
550f1c2
272c85f
1836b02
0514398
32f522a
3c7fab8
f825e30
b0131e5
8092edd
a704dc2
e269dff
cfa59e0
9b2911a
fbd3b11
f3369e3
75fedfe
fb987c1
5829d6c
6ae469e
34ebc47
b54541a
d05ff2b
ce850c2
047d020
1705e9f
79f9b55
f5adb62
57895f0
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 |
|---|---|---|
|
|
@@ -13,7 +13,6 @@ env: | |
| NODE_VERSION: '22' | ||
| ELECTRON_CACHE: ~/.cache/electron | ||
| ELECTRON_BUILDER_CACHE: ~/.cache/electron-builder | ||
| FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true | ||
|
|
||
| jobs: | ||
| build: | ||
|
|
@@ -23,7 +22,10 @@ jobs: | |
| include: | ||
| - os: macos-14 | ||
| platform: mac | ||
| - os: windows-latest | ||
| # Pin Windows runner explicitly. `windows-latest` migrates to | ||
| # `windows-2025-vs2026` on 2026-06-15; pinning ahead avoids a | ||
| # surprise toolchain swap mid-release. Revisit on each new GA. | ||
| - os: windows-2025-vs2026 | ||
| platform: win | ||
| - os: ubuntu-latest | ||
| platform: linux | ||
|
|
@@ -32,7 +34,7 @@ jobs: | |
|
|
||
| steps: | ||
| - name: Checkout tag | ||
| uses: actions/checkout@v4 | ||
| uses: actions/checkout@v5 | ||
| with: | ||
| ref: ${{ github.ref }} | ||
| fetch-depth: 0 | ||
|
Comment on lines
+37
to
40
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. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
# Show the workflow header + around the referenced lines
echo "=== build.yml (lines 1-120) ==="
nl -ba .github/workflows/build.yml | sed -n '1,120p'
# Focus on around line 37-40
echo
echo "=== build.yml (lines 25-60) ==="
nl -ba .github/workflows/build.yml | sed -n '25,60p'
# Check for permissions and persist-credentials usage
echo
echo "=== Search: contents: write ==="
rg -n "contents:\s*write" .github/workflows/build.yml || true
echo
echo "=== Search: persist-credentials ==="
rg -n "persist-credentials" .github/workflows/build.yml || trueRepository: tomymaritano/readide Length of output: 157 🏁 Script executed: #!/bin/bash
set -euo pipefail
# Fallback line-numbering without nl
awk_print_range() {
local file="$1"
local start="$2"
local end="$3"
awk -v s="$start" -v e="$end" '{ if (NR>=s && NR<=e) printf "%5d\t%s\n", NR, $0 }' "$file"
}
echo "=== build.yml (lines 1-120) ==="
awk_print_range .github/workflows/build.yml 1 120
echo
echo "=== build.yml (lines 25-60) ==="
awk_print_range .github/workflows/build.yml 25 60
echo
echo "=== Search: permissions.contents write ==="
rg -n "contents:\s*write" .github/workflows/build.yml || true
echo
echo "=== Search: persist-credentials ==="
rg -n "persist-credentials" .github/workflows/build.yml || trueRepository: tomymaritano/readide Length of output: 5757 Disable persisted checkout credentials in this write-scoped workflow. 🧰 Tools🪛 zizmor (1.25.2)[warning] 36-40: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false (artipacked) [error] 37-37: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy) (unpinned-uses) 🤖 Prompt for AI AgentsSource: Linters/SAST tools |
||
|
|
@@ -41,20 +43,20 @@ jobs: | |
| uses: pnpm/action-setup@v5 | ||
|
|
||
| - name: Setup Node.js | ||
| uses: actions/setup-node@v4 | ||
| uses: actions/setup-node@v5 | ||
| with: | ||
| node-version: ${{ env.NODE_VERSION }} | ||
| cache: 'pnpm' | ||
|
|
||
| - name: Cache pnpm store | ||
| uses: actions/cache@v4 | ||
| uses: actions/cache@v5 | ||
| with: | ||
| path: ~/.pnpm-store | ||
| key: pnpm-${{ matrix.platform }}-${{ hashFiles('pnpm-lock.yaml') }} | ||
| restore-keys: pnpm-${{ matrix.platform }}- | ||
|
|
||
| - name: Cache Electron downloads | ||
| uses: actions/cache@v4 | ||
| uses: actions/cache@v5 | ||
| with: | ||
| path: ${{ env.ELECTRON_CACHE }} | ||
| key: electron-v3-${{ matrix.platform }}-${{ hashFiles('apps/desktop/package.json') }} | ||
|
|
@@ -105,7 +107,7 @@ jobs: | |
| run: pnpm dist:linux --publish always | ||
|
|
||
| - name: Upload artifacts (backup) | ||
| uses: actions/upload-artifact@v4 | ||
| uses: actions/upload-artifact@v5 | ||
| with: | ||
| name: ${{ matrix.platform }}-build | ||
| path: | | ||
|
|
@@ -116,7 +118,11 @@ jobs: | |
| apps/desktop/release/*.deb | ||
| apps/desktop/release/latest*.yml | ||
| apps/desktop/release/*.blockmap | ||
| if-no-files-found: ignore | ||
| # `error` (was `ignore`) — if the build silently produced zero | ||
| # artefacts (signing failure, electron-builder swallowed an | ||
| # error, wrong working-directory, etc.) we want the job to fail | ||
| # loud here, not let the release un-draft with no installers. | ||
| if-no-files-found: error | ||
| retention-days: 30 | ||
|
|
||
| publish: | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -19,25 +19,32 @@ jobs: | |
| runs-on: ubuntu-latest | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
| uses: actions/checkout@v5 | ||
|
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. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
# Inspect workflow file and relevant lines
FILE=".github/workflows/ci.yml"
echo "=== File: $FILE ==="
ls -l "$FILE" || true
echo
if [ -f "$FILE" ]; then
# Print with line numbers around the referenced lines
for L in 22 28 47 60 62 67 90 92 97 113 126 128 133 159 161 166 189 200 202 207 228 230 235; do
echo "---- $FILE:$L ----"
sed -n "$((L-2)),$((L+2))p" "$FILE" | nl -ba -w2 -s':'
echo
done
# Show all uses: lines with their line numbers (avoid huge output by filtering)
echo "=== All uses: entries (line-numbered) ==="
rg -n '^\s*uses:\s*' "$FILE" || true
# Collect any uses with `@v`* (mutable tags)
echo
echo "=== uses with `@v`* tags (line-numbered) ==="
rg -n '^\s*uses:\s*[^#\n]+@v[0-9]+' "$FILE" || true
# Collect uses with SHAs (pinned)
echo
echo "=== uses with commit SHA pinning (line-numbered) ==="
rg -n '^\s*uses:\s*[^#\n]+@([0-9a-f]{7,40})\b' "$FILE" || true
fi
# Search repository for an existing guideline/policy about pinning actions
echo "=== Search for pinning policy mentions ==="
rg -n --hidden --glob '!.git/*' \
-S 'pin(ned)? actions|unpinned uses|require.*pinned|github-actions.*pin|dependabot.*pin|supply chain.*actions' . \
|| trueRepository: tomymaritano/readide Length of output: 278 🏁 Script executed: #!/bin/bash
set -euo pipefail
FILE=".github/workflows/ci.yml"
echo "=== File: $FILE ==="
ls -l "$FILE" || true
echo
if [ -f "$FILE" ]; then
# Print with line numbers around specific lines
for L in 22 28 47 60 62 67 90 92 97 113 126 128 133 159 161 166 189 200 202 207 228 230 235; do
echo "---- $FILE:$L ----"
start=$((L-2)); end=$((L+2))
awk -v s="$start" -v e="$end" 'NR>=s && NR<=e {printf "%4d:%s\n", NR, $0}' "$FILE"
echo
done
echo "=== All uses: entries (line-numbered) ==="
awk '/^[[:space:]]*uses:[[:space:]]*/ {printf "%4d:%s\n", NR, $0}' "$FILE" || true
echo
echo "=== uses with `@v`* tags (line-numbered) ==="
awk '/^[[:space:]]*uses:[[:space:]]*[^#]+@v[0-9]+/{printf "%4d:%s\n", NR, $0}' "$FILE" || true
echo
echo "=== uses with commit SHA pinning (line-numbered) ==="
awk '/^[[:space:]]*uses:[[:space:]]*[^#]+@[0-9a-f]{7,40}\b/ {printf "%4d:%s\n", NR, $0}' "$FILE" || true
fi
echo
echo "=== Search for pinning policy mentions ==="
rg -n --hidden --glob '!.git/*' \
-S 'pin(ned)? actions|unpinned uses|require.*pinned|github-actions.*pin|dependabot.*pin|supply chain.*actions' . \
|| trueRepository: tomymaritano/readide Length of output: 6024 🏁 Script executed: #!/bin/bash
set -euo pipefail
FILE=".github/workflows/ci.yml"
echo "=== All uses: entries including '- uses:' (line-numbered) ==="
awk '/^[[:space:]]*-[[:space:]]*uses:[[:space:]]/ || /^[[:space:]]*uses:[[:space:]]/ {printf "%4d:%s\n", NR, $0}' "$FILE" || true
echo
echo "=== uses with `@v`* tags (line-numbered) ==="
awk '/^[[:space:]]*-[[:space:]]*uses:[[:space:]]/ || /^[[:space:]]*uses:[[:space:]]/ {
if ($0 ~ /@v[0-9]+/) {printf "%4d:%s\n", NR, $0}
}' "$FILE" || true
echo
echo "=== Search for pinning policy mentions ==="
rg -n --hidden --glob '!.git/*' \
-S 'pin(ned)? actions|unpinned uses|require.*pinned|github-actions.*pin|dependabot.*pin|supply chain.*actions' . \
|| trueRepository: tomymaritano/readide Length of output: 2764 Replace mutable GitHub Action tags with commit-pinned Unpinned 🧰 Tools🪛 zizmor (1.25.2)[warning] 21-22: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false (artipacked) [error] 22-22: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy) (unpinned-uses) 🤖 Prompt for AI AgentsSource: Linters/SAST tools |
||
|
|
||
| - name: Setup pnpm | ||
| uses: pnpm/action-setup@v5 | ||
|
|
||
| - name: Setup Node.js | ||
| uses: actions/setup-node@v4 | ||
| uses: actions/setup-node@v5 | ||
| with: | ||
| node-version: ${{ env.NODE_VERSION }} | ||
| cache: 'pnpm' | ||
|
|
||
| - name: Force HTTPS for GitHub git dependencies | ||
| run: git config --global 'url.https://github.com/.insteadOf' 'git@github.com:' | ||
|
|
||
| # CI only runs lint/test/typecheck/build — none of those exercise | ||
| # better-sqlite3 at runtime. Skipping postinstall avoids apps/desktop's | ||
| # electron-builder install-app-deps step, which rebuilds better-sqlite3 | ||
| # against the bundled Electron headers — that rebuild can break the | ||
| # whole setup job when better-sqlite3 lags an Electron major (see the | ||
| # v0.15.0 incident where Electron 42's V8 API broke better-sqlite3 | ||
| # 12.10.0). Same pattern used in release.yml and deploy-api.yml. | ||
| - name: Install dependencies | ||
| run: pnpm install --frozen-lockfile | ||
| run: pnpm install --frozen-lockfile --ignore-scripts | ||
|
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.
This setup cache is restored by the Useful? React with 👍 / 👎. |
||
|
|
||
| - name: Cache node_modules | ||
| uses: actions/cache/save@v4 | ||
| uses: actions/cache/save@v5 | ||
| with: | ||
| path: | | ||
| node_modules | ||
|
|
@@ -50,14 +57,14 @@ jobs: | |
| needs: setup | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: actions/checkout@v5 | ||
| - uses: pnpm/action-setup@v5 | ||
| - uses: actions/setup-node@v4 | ||
| - uses: actions/setup-node@v5 | ||
| with: | ||
| node-version: ${{ env.NODE_VERSION }} | ||
|
|
||
| - name: Restore node_modules | ||
| uses: actions/cache/restore@v4 | ||
| uses: actions/cache/restore@v5 | ||
| with: | ||
| path: | | ||
| node_modules | ||
|
|
@@ -71,25 +78,23 @@ jobs: | |
| - name: Prettier | ||
| run: pnpm format:check | ||
|
|
||
| - name: Commitlint (PR title) | ||
| if: github.event_name == 'pull_request' | ||
| env: | ||
| PR_TITLE: ${{ github.event.pull_request.title }} | ||
| run: echo "$PR_TITLE" | pnpm commitlint | ||
| # PR title commitlint moved to .github/workflows/pr-title.yml so it | ||
| # exposes a stable, standalone status-check name for branch protection | ||
| # (squash-merge makes the PR title the release-trigger commit message). | ||
|
|
||
| # ── Tier 1: Tests + Coverage ─────────────────────── | ||
| test: | ||
| needs: setup | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: actions/checkout@v5 | ||
| - uses: pnpm/action-setup@v5 | ||
| - uses: actions/setup-node@v4 | ||
| - uses: actions/setup-node@v5 | ||
| with: | ||
| node-version: ${{ env.NODE_VERSION }} | ||
|
|
||
| - name: Restore node_modules | ||
| uses: actions/cache/restore@v4 | ||
| uses: actions/cache/restore@v5 | ||
| with: | ||
| path: | | ||
| node_modules | ||
|
|
@@ -105,7 +110,7 @@ jobs: | |
|
|
||
| - name: Upload coverage | ||
| if: always() | ||
| uses: actions/upload-artifact@v4 | ||
| uses: actions/upload-artifact@v5 | ||
| with: | ||
| name: coverage-report | ||
| path: | | ||
|
|
@@ -118,14 +123,14 @@ jobs: | |
| needs: setup | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: actions/checkout@v5 | ||
| - uses: pnpm/action-setup@v5 | ||
| - uses: actions/setup-node@v4 | ||
| - uses: actions/setup-node@v5 | ||
| with: | ||
| node-version: ${{ env.NODE_VERSION }} | ||
|
|
||
| - name: Restore node_modules | ||
| uses: actions/cache/restore@v4 | ||
| uses: actions/cache/restore@v5 | ||
| with: | ||
| path: | | ||
| node_modules | ||
|
|
@@ -151,14 +156,14 @@ jobs: | |
| runs-on: ubuntu-latest | ||
| continue-on-error: true | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: actions/checkout@v5 | ||
| - uses: pnpm/action-setup@v5 | ||
| - uses: actions/setup-node@v4 | ||
| - uses: actions/setup-node@v5 | ||
| with: | ||
| node-version: ${{ env.NODE_VERSION }} | ||
|
|
||
| - name: Restore node_modules | ||
| uses: actions/cache/restore@v4 | ||
| uses: actions/cache/restore@v5 | ||
| with: | ||
| path: | | ||
| node_modules | ||
|
|
@@ -181,7 +186,7 @@ jobs: | |
|
|
||
| - name: Upload Playwright report on failure | ||
| if: failure() | ||
| uses: actions/upload-artifact@v4 | ||
| uses: actions/upload-artifact@v5 | ||
| with: | ||
| name: playwright-report | ||
| path: apps/desktop/playwright-report/ | ||
|
|
@@ -192,14 +197,14 @@ jobs: | |
| needs: setup | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: actions/checkout@v5 | ||
| - uses: pnpm/action-setup@v5 | ||
| - uses: actions/setup-node@v4 | ||
| - uses: actions/setup-node@v5 | ||
| with: | ||
| node-version: ${{ env.NODE_VERSION }} | ||
|
|
||
| - name: Restore node_modules | ||
| uses: actions/cache/restore@v4 | ||
| uses: actions/cache/restore@v5 | ||
| with: | ||
| path: | | ||
| node_modules | ||
|
|
@@ -220,14 +225,14 @@ jobs: | |
| runs-on: ubuntu-latest | ||
| if: github.event_name == 'pull_request' | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: actions/checkout@v5 | ||
| - uses: pnpm/action-setup@v5 | ||
| - uses: actions/setup-node@v4 | ||
| - uses: actions/setup-node@v5 | ||
| with: | ||
| node-version: ${{ env.NODE_VERSION }} | ||
|
|
||
| - name: Restore node_modules | ||
| uses: actions/cache/restore@v4 | ||
| uses: actions/cache/restore@v5 | ||
| with: | ||
| path: | | ||
| node_modules | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -20,7 +20,7 @@ jobs: | |
| security-events: write | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
| uses: actions/checkout@v5 | ||
|
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. Pin all GitHub Actions in
🧰 Tools🪛 zizmor (1.25.2)[warning] 22-23: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false (artipacked) [error] 23-23: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy) (unpinned-uses) 🤖 Prompt for AI Agents |
||
|
|
||
| - name: Initialize CodeQL | ||
| uses: github/codeql-action/init@v4 | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -17,16 +17,23 @@ on: | |
| - staging | ||
| - production | ||
|
|
||
| # Minimum-privilege default. The Cloudflare deploy doesn't push commits | ||
| # or create issues; checkout + read of the workflow definition is all | ||
| # the GITHUB_TOKEN side needs. Wrangler authenticates via the | ||
| # CLOUDFLARE_API_TOKEN secret separately. | ||
| permissions: | ||
| contents: read | ||
|
|
||
| jobs: | ||
| test: | ||
| name: Test API | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: actions/checkout@v5 | ||
|
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. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
FILE=".github/workflows/deploy-api.yml"
if [ ! -f "$FILE" ]; then
echo "Missing file: $FILE" >&2
exit 1
fi
echo "== File: $FILE =="
nl -ba "$FILE" | sed -n '1,120p'
echo "== Search for unpinned uses =="
rg -n "uses:\s*[^@]+@v" "$FILE" || true
echo "== Search for any uses not pinned to a SHA =="
# Rough heuristic: flags uses with tags like v5/v4/main/master, but allows full SHAs (40 hex) and includes
rg -n "uses:\s*[^@]+@(?![0-9a-f]{40,})(v[0-9]+|main|master|master|latest|head|refs)" "$FILE" || trueRepository: tomymaritano/readide Length of output: 171 🏁 Script executed: #!/bin/bash
set -euo pipefail
FILE=".github/workflows/deploy-api.yml"
if [ ! -f "$FILE" ]; then
echo "Missing file: $FILE" >&2
exit 1
fi
echo "== File: $FILE =="
awk '{printf "%5d %s\n", NR, $0}' "$FILE" | sed -n '1,160p'
echo "== Search for uses refs like actions/*`@v5` (non-SHA tags) =="
rg -n "uses:\s*actions/[^@]+@v[0-9]+" "$FILE" || true
echo "== Search for any uses not pinned to a full 40-hex SHA =="
# Allow full SHAs only; flag other ref forms (v*, main, master, latest, heads, etc.)
rg -n "uses:\s*[^@]+@(?![0-9a-f]{40}$)[^ \t]+" "$FILE" || trueRepository: tomymaritano/readide Length of output: 3663 🏁 Script executed: #!/bin/bash
set -euo pipefail
FILE=".github/workflows/deploy-api.yml"
echo "== All uses: lines =="
rg -n "^\s*-\s+uses:" "$FILE" || true
echo "== uses not pinned to a 40-hex SHA (PCRE2) =="
rg --pcre2 -n "^\s*-\s+uses:\s*[^@]+@(?!(?:[0-9a-f]{40})$)[^\s]+" "$FILE" || true
echo "== uses pinned to 40-hex SHA (sanity check) =="
rg --pcre2 -n "^\s*-\s+uses:\s*[^@]+@[0-9a-f]{40}$" "$FILE" || trueRepository: tomymaritano/readide Length of output: 635 Pin GitHub Actions in deploy-api workflow to immutable SHAs 🧰 Tools🪛 zizmor (1.25.2)[warning] 32-32: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false (artipacked) [error] 32-32: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy) (unpinned-uses) 🤖 Prompt for AI AgentsSource: Linters/SAST tools |
||
|
|
||
| - uses: pnpm/action-setup@v5 | ||
|
|
||
| - uses: actions/setup-node@v4 | ||
| - uses: actions/setup-node@v5 | ||
| with: | ||
| node-version: '22' | ||
| cache: 'pnpm' | ||
|
|
@@ -49,11 +56,11 @@ jobs: | |
| needs: test | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: actions/checkout@v5 | ||
|
|
||
| - uses: pnpm/action-setup@v5 | ||
|
|
||
| - uses: actions/setup-node@v4 | ||
| - uses: actions/setup-node@v5 | ||
| with: | ||
| node-version: '22' | ||
| cache: 'pnpm' | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -9,31 +9,39 @@ on: | |
| - '.github/workflows/docs.yml' | ||
| workflow_dispatch: | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| jobs: | ||
| deploy: | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: actions/checkout@v5 | ||
|
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. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
FILE=".github/workflows/docs.yml"
echo "== File: $FILE =="
[ -f "$FILE" ] || { echo "Missing $FILE"; exit 1; }
echo "== Total lines =="
wc -l < "$FILE"
echo "== Lines 1-60 (with numbers) =="
nl -ba "$FILE" | sed -n '1,60p'
echo "== Lines 15-30 (with numbers) =="
nl -ba "$FILE" | sed -n '15,30p'
echo "== All uses: lines (with line numbers) =="
nl -ba "$FILE" | rg -n "^\s*[-]?\s*uses:\s*"
echo "== uses: refs only (no line numbers) =="
rg -n "uses:\s*" "$FILE"Repository: tomymaritano/readide Length of output: 218 🏁 Script executed: #!/bin/bash
set -euo pipefail
FILE=".github/workflows/docs.yml"
[ -f "$FILE" ] || { echo "Missing $FILE"; exit 1; }
echo "== Total lines =="
wc -l < "$FILE"
echo "== Lines 1-40 (cat -n) =="
cat -n "$FILE" | sed -n '1,40p'
echo "== Lines 16-28 (cat -n) =="
cat -n "$FILE" | sed -n '16,28p'
echo "== All uses: with line numbers =="
rg -n '^\s*uses:\s*' "$FILE" || true
echo "== Extract uses refs =="
rg '^\s*uses:\s*' "$FILE" | sed -E 's/^\s*uses:\s*//'Repository: tomymaritano/readide Length of output: 1945 Pin GitHub Actions to commit SHAs in 🧰 Tools🪛 zizmor (1.25.2)[warning] 19-19: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false (artipacked) [error] 19-19: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy) (unpinned-uses) 🤖 Prompt for AI AgentsSource: Linters/SAST tools |
||
|
|
||
| - uses: pnpm/action-setup@v5 | ||
|
|
||
| - uses: actions/setup-node@v4 | ||
| - uses: actions/setup-node@v5 | ||
| with: | ||
| node-version: '22' | ||
| cache: 'pnpm' | ||
|
|
||
| - name: Force HTTPS for GitHub git dependencies | ||
| run: git config --global 'url.https://github.com/.insteadOf' 'git@github.com:' | ||
|
|
||
| - run: pnpm install | ||
| # Marketing site only needs @readied/web + product-config's transitive | ||
| # deps. Plain `pnpm install` would also run apps/desktop's postinstall | ||
| # (electron-builder install-app-deps -> better-sqlite3 native rebuild), | ||
| # which fails on the Linux + Node 22 runner. See #287 for the | ||
| # deploy-api workflow and #288 for release.yml — same fix shape. | ||
| - run: pnpm install --filter '@readied/web...' --ignore-scripts | ||
|
|
||
| - name: Build web app | ||
| working-directory: apps/web | ||
| env: | ||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| run: | | ||
| cd apps/web | ||
| pnpm exec fumadocs-mdx | ||
| pnpm exec next build | ||
| env: | ||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
|
|
||
| - name: Deploy to Cloudflare Pages | ||
| env: | ||
|
|
||
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.
🧩 Analysis chain
🏁 Script executed:
Repository: tomymaritano/readide
Length of output: 107
🏁 Script executed:
Repository: tomymaritano/readide
Length of output: 5529
Pin GitHub Actions to immutable SHAs and disable checkout credential persistence in write-scoped workflows.
@v5tags (lines 37, 46, 52, 59, 110). Pin these actions to immutable commit SHAs.persist-credentials: false, while workflow permissions grantcontents: write, increasing blast radius if a step is compromised.Also applies to: 46-46, 52-52, 59-59, 110-110
🧰 Tools
🪛 zizmor (1.25.2)
[error] 37-37: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)
(unpinned-uses)
🤖 Prompt for AI Agents
Source: Linters/SAST tools