@htekdev/actions-debugger 1.0.41 → 1.0.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,100 @@
1
+ id: runner-environment-098
2
+ title: "runner.workspace is the parent of the repo root — not the checked-out repo"
3
+ category: runner-environment
4
+ severity: silent-failure
5
+ tags:
6
+ - runner.workspace
7
+ - github.workspace
8
+ - path
9
+ - working-directory
10
+ - context
11
+ patterns:
12
+ - regex: 'runner\.workspace'
13
+ flags: i
14
+ - regex: '\$\{\{\s*runner\.workspace\s*\}\}'
15
+ flags: i
16
+ error_messages:
17
+ - "No such file or directory"
18
+ - "Error: Path does not exist"
19
+ - "ENOENT: no such file or directory"
20
+ root_cause: |
21
+ Two similarly-named contexts point to DIFFERENT directories on GitHub-hosted
22
+ runners:
23
+
24
+ github.workspace = /home/runner/work/REPO/REPO ← the checked-out repo root
25
+ runner.workspace = /home/runner/work/REPO ← one level ABOVE the repo root
26
+
27
+ runner.workspace is the "runner work directory" that CONTAINS the repo clone
28
+ folder, not the repo itself. The official documentation describes this distinction,
29
+ but the names are confusingly similar and many developers assume runner.workspace
30
+ is equivalent to "where my code is" — which is github.workspace.
31
+
32
+ Consequences:
33
+ - working-directory: ${{ runner.workspace }} silently points one level above
34
+ the repo, causing file-not-found errors on relative paths inside the repo.
35
+ - Path-building expressions like runner.workspace + '/src' resolve to a
36
+ path that doesn't exist.
37
+ - The error surfaces as "No such file or directory" or a missing file, not as
38
+ a context resolution failure, making the root cause hard to identify.
39
+
40
+ On some self-hosted runner configurations both paths may resolve to the same
41
+ directory, masking the bug until the workflow runs on a GitHub-hosted runner.
42
+
43
+ Source: GitHub Actions contexts documentation; GitHub Community/15327;
44
+ Stack Overflow path confusion questions with 100K+ combined views.
45
+ fix: |
46
+ Replace runner.workspace with github.workspace (or the $GITHUB_WORKSPACE
47
+ environment variable) when the intent is to reference the checked-out repo root.
48
+
49
+ Use runner.workspace only when intentionally targeting the parent directory
50
+ that contains the repo clone — for example, creating a sibling directory for
51
+ build artifacts that should live outside the repo tree.
52
+ fix_code:
53
+ - language: yaml
54
+ label: "Use github.workspace for the repo root"
55
+ code: |
56
+ jobs:
57
+ build:
58
+ runs-on: ubuntu-latest
59
+ steps:
60
+ - uses: actions/checkout@v4
61
+
62
+ # ❌ WRONG — runner.workspace is one level ABOVE the repo
63
+ # - name: Wrong path
64
+ # working-directory: ${{ runner.workspace }}
65
+
66
+ # ✅ CORRECT — github.workspace is the repo root
67
+ - name: List repo files
68
+ run: ls ${{ github.workspace }}
69
+
70
+ # ✅ ALSO CORRECT — $GITHUB_WORKSPACE env var is identical
71
+ - name: Build from repo root
72
+ working-directory: ${{ github.workspace }}
73
+ run: ls .
74
+
75
+ # ✅ Intentional use of runner.workspace — sibling dir outside repo
76
+ - name: Create output dir alongside repo
77
+ run: mkdir ${{ runner.workspace }}/build-output
78
+ - language: yaml
79
+ label: "Directory layout reference"
80
+ code: |
81
+ # GitHub-hosted runner path layout:
82
+ #
83
+ # /home/runner/work/
84
+ # └── my-repo/ ← runner.workspace (${{ runner.workspace }})
85
+ # └── my-repo/ ← github.workspace (${{ github.workspace }})
86
+ # ├── src/
87
+ # ├── package.json
88
+ # └── .github/
89
+ #
90
+ # $GITHUB_WORKSPACE == ${{ github.workspace }} (same value, two access methods)
91
+ prevention:
92
+ - "Always use github.workspace (or $GITHUB_WORKSPACE) to reference the checked-out repo root"
93
+ - "Reserve runner.workspace for intentional parent-directory operations such as sibling build directories"
94
+ - "When debugging path issues, print both: echo $GITHUB_WORKSPACE and echo ${{ runner.workspace }}"
95
+ - "Self-hosted runner paths may differ from GitHub-hosted runners — use named contexts rather than hardcoded absolute paths"
96
+ docs:
97
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/accessing-contextual-information-about-workflow-runs#github-context"
98
+ label: "GitHub Actions — github context (workspace)"
99
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/accessing-contextual-information-about-workflow-runs#runner-context"
100
+ label: "GitHub Actions — runner context (workspace)"
@@ -0,0 +1,90 @@
1
+ id: silent-failures-045
2
+ title: "ACTIONS_RUNNER_DEBUG / ACTIONS_STEP_DEBUG typo — debug logging silently disabled"
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - debug
7
+ - ACTIONS_RUNNER_DEBUG
8
+ - ACTIONS_STEP_DEBUG
9
+ - secrets
10
+ - diagnostic
11
+ patterns:
12
+ - regex: 'RUNNER_DEBUG'
13
+ flags: ''
14
+ - regex: 'ACTIONS_DEBUG'
15
+ flags: i
16
+ error_messages: []
17
+ root_cause: |
18
+ GitHub Actions debug logging is controlled by two specific repository secrets
19
+ (or repository variables since October 2023):
20
+
21
+ ACTIONS_RUNNER_DEBUG = "true" — runner diagnostic logs (runner.diag.log,
22
+ Worker_*.log files attached to the run as a downloadable zip)
23
+ ACTIONS_STEP_DEBUG = "true" — verbose step-level debug output shown
24
+ inline in each step log section
25
+
26
+ When developers set secrets with incorrect names such as RUNNER_DEBUG, DEBUG,
27
+ ACTIONS_DEBUG, or ENABLE_DEBUG, GitHub silently ignores them. The workflow
28
+ runs normally with no indication that debug logging was never activated.
29
+ The developer sees only standard log output and assumes there is nothing more
30
+ to inspect.
31
+
32
+ A secondary failure mode: setting these as workflow-level env: variables has
33
+ no effect — debug logging requires them as repository secrets or repository
34
+ variables, not env: entries.
35
+
36
+ Source: GitHub Docs — Enabling debug logging; GitHub Community recurring
37
+ reports of debug logs not appearing despite secrets being set.
38
+ fix: |
39
+ Set repository secrets or repository variables with the EXACT names:
40
+ ACTIONS_RUNNER_DEBUG (value: true)
41
+ ACTIONS_STEP_DEBUG (value: true)
42
+
43
+ Path: Repository Settings → Secrets and variables → Actions → New repository secret.
44
+
45
+ These can also be set at the organization level to apply across all repos.
46
+
47
+ Runner diagnostic logs from ACTIONS_RUNNER_DEBUG are available as a
48
+ downloadable zip file attached to the workflow run — not shown inline.
49
+ Step debug logs from ACTIONS_STEP_DEBUG appear inline in each step as
50
+ collapsed "##[debug]" lines.
51
+ fix_code:
52
+ - language: yaml
53
+ label: "workflow_dispatch input to enable debug for a single run without changing secrets"
54
+ code: |
55
+ on:
56
+ workflow_dispatch:
57
+ inputs:
58
+ debug_enabled:
59
+ type: boolean
60
+ description: 'Enable step debug logging for this run'
61
+ default: false
62
+
63
+ jobs:
64
+ build:
65
+ runs-on: ubuntu-latest
66
+ steps:
67
+ - name: Enable step debug mode
68
+ if: ${{ inputs.debug_enabled }}
69
+ run: echo "ACTIONS_STEP_DEBUG=true" >> $GITHUB_ENV
70
+
71
+ - name: Build step (verbose when debug enabled)
72
+ run: echo "Build running"
73
+ - language: yaml
74
+ label: "Check which debug secrets are active"
75
+ code: |
76
+ - name: Show debug context
77
+ run: |
78
+ echo "Runner debug: $ACTIONS_RUNNER_DEBUG"
79
+ echo "Step debug: $ACTIONS_STEP_DEBUG"
80
+ # If these print empty string, the secrets are not set or named incorrectly
81
+ prevention:
82
+ - "Use exactly 'ACTIONS_RUNNER_DEBUG' and 'ACTIONS_STEP_DEBUG' as the secret names — no other names work"
83
+ - "Set these as repository secrets or repository variables, not as env: in workflow YAML"
84
+ - "ACTIONS_RUNNER_DEBUG logs are in a separate zip download — check the run's uploaded artifacts section"
85
+ - "Both secrets can be enabled simultaneously; they control independent output streams"
86
+ docs:
87
+ - url: "https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/troubleshooting-workflows/enabling-debug-logging"
88
+ label: "GitHub Docs — Enabling debug logging"
89
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/store-information-in-variables"
90
+ label: "GitHub Docs — Storing information in variables"
@@ -0,0 +1,96 @@
1
+ id: silent-failures-047
2
+ title: "GITHUB_ENV variables are job-scoped — not shared with downstream needs: jobs"
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - GITHUB_ENV
7
+ - environment-variables
8
+ - job-outputs
9
+ - cross-job
10
+ - silent-failure
11
+ patterns:
12
+ - regex: 'GITHUB_ENV'
13
+ flags: ''
14
+ - regex: 'echo\s+".+=.+"\s*>>\s*\$GITHUB_ENV'
15
+ flags: i
16
+ error_messages: []
17
+ root_cause: |
18
+ Environment variables written to $GITHUB_ENV are scoped to the CURRENT JOB
19
+ only. They persist across all subsequent steps within that job, but are NOT
20
+ propagated to any other job — including jobs that depend on the producing
21
+ job via needs:.
22
+
23
+ This is a silent failure because:
24
+ 1. The producing step exits 0 with no warning
25
+ 2. The downstream job runs normally with no error message
26
+ 3. The variable evaluates to empty string in the downstream job
27
+ 4. Steps that depend on the value produce wrong results or silently skip
28
+ based on the empty string condition
29
+
30
+ Common scenario (silently broken):
31
+ Job A: echo "VERSION=1.2.3" >> $GITHUB_ENV
32
+ Job B (needs: job-a): echo $VERSION → prints empty string
33
+
34
+ The correct mechanism for sharing values across job boundaries is job outputs
35
+ combined with the needs context. GITHUB_ENV is appropriate only for values
36
+ that need to persist across multiple steps within the same job.
37
+
38
+ Source: GitHub Docs — Passing information between jobs; GitHub Community and
39
+ Stack Overflow cross-job environment variable questions.
40
+ fix: |
41
+ To pass a value from one job to a downstream job:
42
+
43
+ 1. Write the value to $GITHUB_OUTPUT (not $GITHUB_ENV) in the producing step
44
+ 2. Declare the step output in the producing job's outputs: block
45
+ 3. Reference the value in the consuming job via ${{ needs.job-id.outputs.key }}
46
+
47
+ Continue using $GITHUB_ENV when the value only needs to be available to later
48
+ steps within the same job.
49
+ fix_code:
50
+ - language: yaml
51
+ label: "Correct cross-job value sharing via GITHUB_OUTPUT and job outputs"
52
+ code: |
53
+ jobs:
54
+ build:
55
+ runs-on: ubuntu-latest
56
+ outputs:
57
+ # Expose the step output as a job output
58
+ version: ${{ steps.get-version.outputs.version }}
59
+ steps:
60
+ - id: get-version
61
+ # Write to GITHUB_OUTPUT for cross-job sharing, not GITHUB_ENV
62
+ run: echo "version=1.2.3" >> $GITHUB_OUTPUT
63
+
64
+ deploy:
65
+ needs: build
66
+ runs-on: ubuntu-latest
67
+ steps:
68
+ - name: Use version from build job
69
+ run: echo "Deploying version ${{ needs.build.outputs.version }}"
70
+ - language: yaml
71
+ label: "GITHUB_ENV is correct for within-job cross-step sharing"
72
+ code: |
73
+ jobs:
74
+ build:
75
+ runs-on: ubuntu-latest
76
+ steps:
77
+ - name: Set version for this job's steps
78
+ run: echo "VERSION=1.2.3" >> $GITHUB_ENV
79
+
80
+ - name: Step 2 in same job — $VERSION is available
81
+ run: echo "Building $VERSION"
82
+
83
+ - name: Step 3 in same job — $VERSION is still available
84
+ run: echo "Packaging $VERSION"
85
+
86
+ # $VERSION is NOT available in any other job
87
+ prevention:
88
+ - "Use GITHUB_OUTPUT + job outputs: for any value that must cross a job boundary"
89
+ - "Use GITHUB_ENV only for values shared between steps within the same job"
90
+ - "Add a verification step in the consuming job that echoes the value and fails if empty"
91
+ - "Avoid setting both GITHUB_ENV and GITHUB_OUTPUT for the same value — use GITHUB_OUTPUT as the single source of truth"
92
+ docs:
93
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/passing-information-between-jobs"
94
+ label: "GitHub Docs — Passing information between jobs"
95
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/store-information-in-variables"
96
+ label: "GitHub Docs — Storing information in variables (GITHUB_ENV)"
@@ -0,0 +1,96 @@
1
+ id: silent-failures-046
2
+ title: "matrix.exclude silently ignored when value doesn't exactly match matrix dimension"
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - matrix
7
+ - exclude
8
+ - strategy
9
+ - configuration
10
+ - silent-failure
11
+ patterns:
12
+ - regex: 'exclude:'
13
+ flags: ''
14
+ - regex: 'strategy:\s*\n\s*matrix:'
15
+ flags: im
16
+ error_messages: []
17
+ root_cause: |
18
+ GitHub Actions matrix exclude: uses exact string equality. An exclude entry
19
+ removes a combination only when ALL specified key-value pairs exactly match
20
+ a generated matrix combination. If any pair fails to match, the combination
21
+ is silently kept.
22
+
23
+ Three common silent-failure patterns:
24
+
25
+ 1. Value substring mismatch:
26
+ matrix: {os: [ubuntu-latest, windows-latest]}
27
+ exclude: [{os: ubuntu}] # 'ubuntu' != 'ubuntu-latest' → ignored
28
+
29
+ 2. Key not present in matrix dimensions:
30
+ matrix: {os: [ubuntu-latest], node: [18, 20]}
31
+ exclude: [{os: ubuntu-latest, version: 18}] # 'version' not a matrix key → ignored
32
+
33
+ 3. Type mismatch in some expression contexts:
34
+ matrix: {node: [18, 20]}
35
+ exclude: [{node: "18"}] # string "18" may not equal integer 18
36
+
37
+ GitHub produces no warning when an exclude entry matches zero combinations.
38
+ The unwanted job continues to run, consuming CI minutes with no indication
39
+ that the exclude rule was ineffective.
40
+
41
+ Source: GitHub Docs matrix strategy; GitHub Community/26957; Stack Overflow
42
+ questions about matrix exclude not working as expected.
43
+ fix: |
44
+ Use the exact string that appears in your matrix definition when writing
45
+ exclude entries. Run a matrix debug step to confirm the actual values
46
+ GitHub generates before relying on exclusions.
47
+
48
+ For complex exclusion logic involving substring matching or multiple
49
+ conditions, use the if: condition on the job instead of exclude:.
50
+ The if: condition can use contains(), startsWith(), and other expression
51
+ functions that exact-match exclude cannot.
52
+ fix_code:
53
+ - language: yaml
54
+ label: "Correct exclude — exact value match required"
55
+ code: |
56
+ jobs:
57
+ test:
58
+ strategy:
59
+ matrix:
60
+ os: [ubuntu-latest, windows-latest, macos-latest]
61
+ node: [18, 20, 22]
62
+ exclude:
63
+ # Value must match EXACTLY what appears in the matrix list above
64
+ - os: windows-latest # ✅ exact match
65
+ node: 18
66
+ # Incorrect examples (silently ignored):
67
+ # - os: windows # ❌ 'windows' != 'windows-latest'
68
+ # - os: windows-latest
69
+ # version: 18 # ❌ 'version' not a matrix dimension key
70
+ runs-on: ${{ matrix.os }}
71
+ steps:
72
+ - name: Debug matrix combination
73
+ run: echo '${{ toJSON(matrix) }}'
74
+ - language: yaml
75
+ label: "Alternative — use if: for flexible exclusion"
76
+ code: |
77
+ jobs:
78
+ test:
79
+ # Use if: when you need startsWith / contains logic
80
+ if: >-
81
+ !(matrix.os == 'windows-latest' && matrix.node == 18)
82
+ strategy:
83
+ matrix:
84
+ os: [ubuntu-latest, windows-latest]
85
+ node: [18, 20]
86
+ runs-on: ${{ matrix.os }}
87
+ prevention:
88
+ - "Use the exact strings from your matrix definition in exclude entries — copy-paste, do not retype"
89
+ - "Add a debug step printing toJSON(matrix) to verify which combinations GitHub actually generates"
90
+ - "Use if: conditions for substring matching, contains(), or multi-condition exclusion logic"
91
+ - "Test matrix changes on a branch and review the job list before merging to confirm excluded combinations are gone"
92
+ docs:
93
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/running-variations-of-jobs-in-a-workflow#excluding-matrix-configurations"
94
+ label: "GitHub Docs — Excluding matrix configurations"
95
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/using-conditions-to-control-job-execution"
96
+ label: "GitHub Docs — Using conditions to control job execution"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@htekdev/actions-debugger",
3
- "version": "1.0.41",
3
+ "version": "1.0.42",
4
4
  "description": "65+ real GitHub Actions errors, queryable by agents. CLI + MCP server + Copilot skills + error database.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",