Skip to content

update - #5

Merged
zyntromedia merged 1 commit into
mainfrom
zyntromedia-patch-2
Aug 1, 2026
Merged

zyntromedia merged 1 commit into
mainfrom
zyntromedia-patch-2

Conversation

@zyntromedia

@zyntromedia zyntromedia commented Aug 1, 2026

Copy link
Copy Markdown
Member

fix nodejs-matrix-ci

Summary by CodeRabbit

  • Tests
    • Added automated checks for linting, TypeScript validation, and tests across Node.js 18, 20, and 22.
    • Enabled dependency caching to help streamline continuous integration checks.

fix nodejs-matrix-ci

Signed-off-by: Zyntro <zyntro.ai.studio@gmail.com>
@coderabbitai

coderabbitai Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Added a GitHub Actions workflow that runs linting, TypeScript checking, and tests on Node.js 18, 20, and 22. The workflow uses pnpm, frozen-lockfile installation, and dependency caching.

Changes

Node.js matrix CI

Layer / File(s) Summary
Configure matrix checks
.github/workflows/nodejs-matrix-ci.yml
The workflow runs project checks across Node.js 18, 20, and 22. It configures pnpm, dependency caching, frozen-lockfile installation, linting, TypeScript checking, and tests.

Estimated code review effort: 2 (Simple) | ~10 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The title is too generic and does not identify the Node.js matrix CI configuration change. Use a specific title such as "Update Node.js matrix CI configuration".
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch zyntromedia-patch-2

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@zyntromedia
zyntromedia merged commit 8c2d9c1 into main Aug 1, 2026
0 of 7 checks passed

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/nodejs-matrix-ci.yml:
- Around line 27-37: Update the CI steps to invoke the declared package scripts,
replacing the direct TypeScript command with pnpm run typecheck and resolving
the missing test script by either adding a package.json test script and
retaining the test step or removing that step. Also remove the non-JSON markdown
tail from package.json so pnpm can parse the manifest.
- Line 13: Update the actions/checkout@v4 step in the workflow to set
persist-credentials to false, ensuring subsequent pnpm, lint, type-check, and
test steps cannot access stored GitHub credentials; keep credentials enabled
only if a later step explicitly requires authenticated Git operations.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: c9a3ff1c-df2d-47c0-8873-b0ea12bbc7fc

📥 Commits

Reviewing files that changed from the base of the PR and between e6a6e09 and c654651.

📒 Files selected for processing (1)
  • .github/workflows/nodejs-matrix-ci.yml

node-version: [18, 20, 22]

steps:
- uses: actions/checkout@v4

Copy link
Copy Markdown
Contributor

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:

#!/bin/bash
set -euo pipefail

echo "== workflow file =="
if [ -f .github/workflows/nodejs-matrix-ci.yml ]; then
  nl -ba .github/workflows/nodejs-matrix-ci.yml | sed -n '1,220p'
else
  echo "missing .github/workflows/nodejs-matrix-ci.yml"
fi

echo
echo "== checkout occurrences =="
rg -n "actions/checkout|persist-credentials|GITHUB_TOKEN|pnpm install|install|test" .github/workflows/nodejs-matrix-ci.yml .github/workflows 2>/dev/null || true

echo
echo "== package manager / config files =="
git ls-files | rg '(^|/)(package\.json|pnpm-lock\.yaml|package-lock\.json|npm-shrinkwrap\.json|yarn\.lock|release-please|vulnerability)' || true

Repository: zyntromedia/new-crystalcastle

Length of output: 227


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== workflow file summary =="
if [ -f .github/workflows/nodejs-matrix-ci.yml ]; then
  wc -l .github/workflows/nodejs-matrix-ci.yml
  sed -n '1,220p' .github/workflows/nodejs-matrix-ci.yml
else
  echo "missing .github/workflows/nodejs-matrix-ci.yml"
fi

echo
echo "== checkout occurrences =="
grep -nE "actions/checkout|persist-credentials|GITHUB_TOKEN|pnpm install|install|test|npm" .github/workflows/nodejs-matrix-ci.yml 2>/dev/null || true

echo
echo "== workflows checkout occurrences =="
grep -nE "actions/checkout|persist-credentials|GITHUB_TOKEN" .github/workflows 2>/dev/null || true

echo
echo "== package/config files =="
git ls-files | grep -E '(^|/)(package\.json|pnpm-lock\.yaml|package-lock\.json|npm-shrinkwrap\.json|yarn\.lock|release-please|vulnerability)' || true

Repository: zyntromedia/new-crystalcastle

Length of output: 1415


🌐 Web query:

actions/checkout v4 persist-credentials default true README

💡 Result:

In the actions/checkout action, the persist-credentials input defaults to true [1][2][3]. When set to true, this input configures the GitHub Actions authentication token or SSH key within the local git configuration [4][5][6]. This enables subsequent steps in your workflow to run authenticated git commands (such as git push or git fetch) without requiring additional manual configuration [4][5][6]. The credentials are removed during the post-job cleanup process [4][5][6]. You can set persist-credentials to false if you wish to opt out of this behavior [4][5]. Note that starting in version 6.0.0, the mechanism for persisting these credentials was updated to store them in a separate file under $RUNNER_TEMP rather than directly in the local.git/config file, providing improved security [7][8].

Citations:


🌐 Web query:

GitHub Actions runner version actions/checkout v4 persist-credentials git config credential helper

💡 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]. When persist-credentials is set to its default value of true: - The action configures the Git repository's local configuration (.git/config or a linked credential file) with the provided credentials [1][3]. - This enables your workflow steps to execute authenticated Git commands (such as git fetch, git push, or git pull) directly without needing to manually re-authenticate [1][3]. - Recent updates to actions/checkout have improved credential security by storing these credentials in a separate file within $RUNNER_TEMP rather than directly inside the .git/config file, which helps prevent accidental leakage [3]. - These credentials are automatically removed by the action during post-job cleanup [1][2]. If you set persist-credentials: false, the action will not configure the local Git repository with these credentials, meaning subsequent Git commands in your workflow will not have automatic access to the repository via the original token or SSH key [1][4]. You can opt out of this behavior by setting the input explicitly in your workflow YAML: - name: Checkout code uses: actions/checkout@v4 with: persist-credentials: false

Citations:


🌐 Web query:

"actions/checkout" v4 "persist-credentials" "git config" "github_token"

💡 Result:

In actions/checkout v4, the persist-credentials input controls whether the action configures the local git repository with the authentication token or SSH key used for the checkout [1][2]. When persist-credentials is set to its default value of true, the action automatically adds the authentication token (usually the GITHUB_TOKEN) or the provided SSH key to the local git configuration [1][3]. This allows subsequent steps in your workflow to perform authenticated git commands (such as git push or git pull) without needing to manually re-authenticate [1][4]. The action removes these credentials during the post-job cleanup phase [1][5]. To opt out of this behavior, you can set persist-credentials to false in your workflow file [1][2]: - name: Checkout repository uses: actions/checkout@v4 with: persist-credentials: false Setting this to false is often recommended as a security best practice to prevent the credential from being available to other steps in the job, especially if the workflow involves running untrusted code or if the GITHUB_TOKEN has excessive permissions [6][7]. If you require authenticated git operations in later steps while setting persist-credentials to false, you must manually configure authentication using your own credentials or a scoped token [1][6].

Citations:


Disable checkout credential persistence.

actions/checkout@v4 persists GITHUB_TOKEN in the local Git configuration by default. Later pnpm install, lint, type check, and test steps can read the token if they run untrusted code. Set persist-credentials: false unless a later step requires authenticated Git operations.

🧰 Tools
🪛 zizmor (1.28.0)

[warning] 13-13: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/nodejs-matrix-ci.yml at line 13, Update the
actions/checkout@v4 step in the workflow to set persist-credentials to false,
ensuring subsequent pnpm, lint, type-check, and test steps cannot access stored
GitHub credentials; keep credentials enabled only if a later step explicitly
requires authenticated Git operations.

Source: Linters/SAST tools

Comment on lines +27 to +37
- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Lint
run: pnpm lint

- name: Type Check
run: pnpm tsc --noEmit

- name: Run Tests
run: pnpm test

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== repo files =="
git ls-files | sed -n '1,120p'

echo "== package.json =="
if [ -f package.json ]; then
  cat -n package.json
else
  echo "no package.json"
fi

echo "== workflow =="
if [ -f .github/workflows/nodejs-matrix-ci.yml ]; then
  cat -n .github/workflows/nodejs-matrix-ci.yml
else
  echo "no workflow"
fi

echo "== jsconfig/tsconfig files =="
git ls-files | grep -E '(^|/)(jsconfig|tsconfig).*\.json$' | sort | while read -r f; do
  echo "--- $f"
  cat -n "$f"
done

echo "== package scripts =="
python3 - <<'PY'
import json, pathlib, re, sys
p=pathlib.Path('package.json')
if p.exists():
    data=json.load(open(p))
    print("scripts:", data.get("scripts"))
    print("pnpm available:", end=" ")
    if pathlib.Path("/tmp").exists():
        import subprocess, tempfile
        # read-only probe: parse if pnpm is available, do not install
        try:
            out=subprocess.check_output(["/bin/sh","-c","command -v pnpm || true"], text=True)
            print(out.strip() or "not found")
        except FileNotFoundError:
            print("pnpm command not found")
PY

Repository: zyntromedia/new-crystalcastle

Length of output: 8796


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== pnpm availability and package manager files =="
command -v pnpm || true
find . -maxdepth 3 \( -name pnpm-lock.yaml -o -name pnpm-workspace.yaml -o -name package-lock.json -o -name yarn.lock -o -name jsconfig.json -o -name tsconfig.json \) -print

echo "== package scripts =="
python3 - <<'PY'
import json
from pathlib import Path
data = json.loads(Path("package.json").read_text())
print("scripts:", data.get("scripts"))
print("has test script:", "test" in data.get("scripts", {}))
print("has typecheck script:", "typecheck" in data.get("scripts", {}))
PY

echo "== package manager command parser simulation =="
python3 - <<'PY'
import re
commands = ["pnpm tsc --noEmit", "pnpm run typecheck", "pnpm test"]
for cmd in commands:
    parts = cmd.split()
    manager = parts[0]
    run = parts[1] == "run"
    target = parts[2] if run else parts[1]
    args = parts[3:] if run else parts[2:]
    print({"cmd": cmd, "manager": manager, "runs_script": run, "script": target, "args": args})
PY

Repository: zyntromedia/new-crystalcastle

Length of output: 624


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== pnpm and relevant files =="
command -v pnpm || true
find . -maxdepth 3 \( \( -name pnpm-lock.yaml -o -name pnpm-workspace.yaml -o -name package-lock.json -o -name yarn.lock \) -a ! -path '*/.git/*' \) -a ! \( -path '*/node_modules/*' \) -print | sort
find . -maxdepth 3 \( -name jsconfig.json -o -name tsconfig.json \) -a ! -path '*/.git/*' -a ! \( -path '*/node_modules/*' \) -print | sort

echo "== package.json script block =="
python3 - <<'PY'
import json, pathlib, subprocess, re
text = pathlib.Path("package.json").read_text()
lines = text.splitlines()
start = next((i for i, line in enumerate(lines) if '  "scripts"' in line), None)
print("scripts_start", start)
if start is not None:
    # print until first line in scripts is not whitespace and not a script value; rough JSON block
    depth = 0
    for i, line in enumerate(lines[start:], start):
        if line.strip().startswith('{') or '"scripts"' in line:
            depth = max(depth, line.count('{') - line.count('}'))
        print(f"{i+1}:{line}")
        if any(token in line for token in ['"preview"', '"typecheck"', ']']):
            break
PY

echo "== npm/pnpm run parser behavior =="
pnpm install --ignore-scripts --lockfile-only --no-link-store 2>/tmp/pnpm-install-err || true
pnpm exec node - <<'JS'
const fs = require('fs');
const pkg = JSON.parse(new TextDecoder().decode(fs.readFileSync(process.cwd() + "/package.json")));
const cmds = ["pnpm tsc --noEmit", "pnpm run typecheck", "pnpm test"];
const re = /^(?:@[^/]+\/)?pnpm(?::.*)?\s+(?:--silent\s+)?(?:run\s+)?([^\s?]+)(\?:.*)?(?:\?\s+(.*))?(\?|\??)?:\s*(.+)$/;
for (const cmd of cmds) {
  console.log(JSON.stringify({cmd, packageScripts: Object.keys(pkg.scripts || {}), match: {target: /^pnpm(\s+--silent\s+)?run\s+([^\\s]*|\$[^ ]*)/.test(cmd) ? (/^pnpm(\s+--silent\s+)?run\s+([^\\s]*|\$[^ ]*)/.exec(cmd)[2].replace(/^\$\{.+}/m, '')): 'not_run_command'}}));
}
JS

Repository: zyntromedia/new-crystalcastle

Length of output: 857


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== package.json byte ranges =="
wc -c package.json
sed -n '115,130p' package.json | cat -A | sed -n '1,80p'

echo "== npm command parser semantics from pnpm source if available =="
pnpm help 2>&1 | sed -n '1,120p' | grep -A 80 "COMMANDS" | sed -n '1,80p' || true
pnpm help run 2>&1 | sed -n '1,80p' || true

Repository: zyntromedia/new-crystalcastle

Length of output: 1623


🏁 Script executed:

#!/bin/bash
set -u

echo "== exact lines around non-JSON tail in package.json =="
awk 'NR>=120 && NR<=132 { printf "%4d: %s\n", NR, $0 }' package.json | cat -n

echo "== git diff summary =="
git diff --stat HEAD~1..HEAD 2>/dev/null || git diff --stat || true

Repository: zyntromedia/new-crystalcastle

Length of output: 1597


Use the package scripts and fix the broken manifest.

pnpm tsc --noEmit bypasses the declared typecheck script, which runs tsc -p ./jsconfig.json; use pnpm run typecheck. package.json has no test script, so pnpm test fails; add and run a test script or remove this step. Also remove the non-JSON markdown tail at package.json:125 so pnpm can parse the manifest.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/nodejs-matrix-ci.yml around lines 27 - 37, Update the CI
steps to invoke the declared package scripts, replacing the direct TypeScript
command with pnpm run typecheck and resolving the missing test script by either
adding a package.json test script and retaining the test step or removing that
step. Also remove the non-JSON markdown tail from package.json so pnpm can parse
the manifest.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant