@htekdev/actions-debugger 1.0.108 → 1.0.109

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,92 @@
1
+ id: caching-artifacts-064
2
+ title: 'Third-party actions bundling @actions/cache npm v3 return "Cache service responded with 422" after Dec 2024 backend migration'
3
+ category: caching-artifacts
4
+ severity: error
5
+ tags:
6
+ - actions-cache
7
+ - deprecated-api
8
+ - cache-backend
9
+ - 422
10
+ - npm-package
11
+ - third-party-action
12
+ - migration
13
+ patterns:
14
+ - regex: 'Cache service responded with 422'
15
+ flags: 'i'
16
+ - regex: 'Failed to save cache.*422|Failed to restore cache.*422'
17
+ flags: 'i'
18
+ - regex: 'cache.*HTTP 422|HTTP 422.*cache'
19
+ flags: 'i'
20
+ error_messages:
21
+ - "Cache service responded with 422"
22
+ - "Error: Cache service responded with 422"
23
+ - "Failed to save cache: Cache service responded with 422"
24
+ - "Warning: Failed to restore cache: Cache service responded with 422"
25
+ root_cause: |
26
+ In December 2024, GitHub migrated the Actions cache backend to a new service API.
27
+ The deprecated v3 cache API endpoints now return HTTP 422 instead of processing
28
+ cache requests. Any action that embeds `@actions/cache` npm package at v3.x sends
29
+ requests to the old endpoint and receives 422 responses.
30
+
31
+ This affects any action — not just `actions/cache` itself — that bundles the old
32
+ `@actions/cache` npm package internally. Common affected actions:
33
+ - `actions/setup-node@v2` / `@v3` (embed @actions/cache v3)
34
+ - `actions/setup-python@v4` and earlier
35
+ - `actions/setup-go@v4` and earlier
36
+ - Custom or third-party JavaScript/composite actions that haven't updated
37
+ their package-lock.json since early 2024
38
+
39
+ The 422 error appears in the step output but the visible message does not mention
40
+ deprecated API versions or npm package issues — it only shows the HTTP status code.
41
+
42
+ Note: This is distinct from `caching-artifacts-056` (actions/cache v1/v2 hard
43
+ deprecation which shows "automatically failed because it uses a deprecated version").
44
+ That error comes from the version check; this error comes from the actual API call.
45
+ fix: |
46
+ Upgrade the affected action to a version that bundles `@actions/cache` npm v4+.
47
+ For first-party GitHub actions, use the latest major version:
48
+ - `actions/setup-node` → upgrade to @v4 or @v5
49
+ - `actions/setup-python` → upgrade to @v5
50
+ - `actions/setup-go` → upgrade to @v5
51
+ - `actions/cache` used directly → upgrade to @v4
52
+
53
+ For third-party actions, open an issue asking the maintainer to update
54
+ @actions/cache in their package-lock.json and re-bundle the action.
55
+
56
+ As a temporary workaround, disable caching in the action to unblock CI:
57
+ fix_code:
58
+ - language: yaml
59
+ label: 'Upgrade setup-* actions to latest major version with updated cache client'
60
+ code: |
61
+ # Before (bundled @actions/cache v3 — returns 422 after Dec 2024 migration)
62
+ - uses: actions/setup-node@v2
63
+ with:
64
+ node-version: '18'
65
+ cache: 'npm'
66
+
67
+ # After (@actions/cache v4+ bundled — compatible with current cache service)
68
+ - uses: actions/setup-node@v4
69
+ with:
70
+ node-version: '18'
71
+ cache: 'npm'
72
+ - language: yaml
73
+ label: 'Disable caching as temporary workaround if action cannot be upgraded'
74
+ code: |
75
+ - uses: actions/setup-node@v2
76
+ with:
77
+ node-version: '18'
78
+ cache: '' # empty string disables cache, avoids 422 until action is upgraded
79
+ prevention:
80
+ - 'Keep all setup-* actions at their latest major version to stay compatible with the cache service API'
81
+ - 'Audit all uses: references for versions older than January 2024 — they may bundle stale @actions/cache v3'
82
+ - 'Enable Dependabot version updates for GitHub Actions to automatically surface major version bumps'
83
+ - 'After any GitHub changelog cache-migration notice, scan workflows for outdated action pins'
84
+ docs:
85
+ - url: 'https://github.blog/changelog/2024-12-05-notice-of-upcoming-releases-and-breaking-changes-for-github-actions'
86
+ label: 'GitHub Changelog — Notice of cache migration and deprecated action versions (Dec 2024)'
87
+ - url: 'https://github.com/actions/toolkit/tree/main/packages/cache'
88
+ label: 'actions/toolkit — @actions/cache npm package changelog'
89
+ - url: 'https://github.com/actions/setup-node/issues/1275'
90
+ label: 'actions/setup-node#1275 — Cache service 422 errors with older action versions (13 reactions)'
91
+ - url: 'https://github.com/orgs/community/discussions/155534'
92
+ label: 'GitHub Community — Cache service 422 flaky restores during Dec 2024 migration'
@@ -0,0 +1,121 @@
1
+ id: known-unsolved-057
2
+ title: 'Jobs run on separate fresh runners — /tmp and filesystem are not shared between jobs'
3
+ category: known-unsolved
4
+ severity: limitation
5
+ tags:
6
+ - jobs
7
+ - runner
8
+ - filesystem
9
+ - tmp
10
+ - isolation
11
+ - artifacts
12
+ - cross-job
13
+ - runner-environment
14
+ patterns:
15
+ - regex: 'No such file or directory.*/tmp/'
16
+ flags: 'i'
17
+ - regex: 'ENOENT.*no such file.*tmp|cannot.*open.*/tmp/.*no such'
18
+ flags: 'i'
19
+ - regex: 'file.*not found.*/tmp|/tmp/.*does not exist'
20
+ flags: 'i'
21
+ error_messages:
22
+ - "/tmp/output.json: No such file or directory"
23
+ - "Error: ENOENT: no such file or directory, open '/tmp/result.txt'"
24
+ - "/tmp/build-manifest.json: No such file or directory"
25
+ root_cause: |
26
+ Each job in a GitHub Actions workflow runs on a completely separate, freshly
27
+ provisioned runner instance. There is NO shared filesystem between jobs. Files
28
+ written to `/tmp`, `$RUNNER_TEMP`, `$GITHUB_WORKSPACE`, or any other path during
29
+ one job are invisible to all subsequent jobs.
30
+
31
+ This is a fundamental architectural property: GitHub provisions a new virtual machine
32
+ for each job. The previous job's VM is terminated before the next job starts. No
33
+ filesystem state survives the job boundary.
34
+
35
+ Common patterns that fail for this reason:
36
+ 1. Build job writes `/tmp/report.json` → deploy job tries to read `/tmp/report.json`
37
+ 2. Test job saves coverage to `$RUNNER_TEMP/coverage.xml` → reporter job looks for it
38
+ 3. Compile job produces `./dist/app` → signing job tries to use `./dist/app` without
39
+ re-downloading it via artifacts
40
+ 4. First job exports env vars via `$GITHUB_ENV` → second job expects those env vars
41
+ (env vars set via GITHUB_ENV are also job-scoped and do not persist)
42
+ 5. Steps within the SAME job DO share `/tmp` and the workspace — the limitation is
43
+ specifically at the JOB boundary
44
+
45
+ Self-hosted runner pools with persistent workspaces can accidentally appear to share
46
+ state between jobs on the same machine, but this is unreliable (another job may have
47
+ cleaned the directory) and creates security risks (secret leakage between runs).
48
+ fix: |
49
+ There is no mechanism to share filesystem state between jobs without explicitly
50
+ transferring the data. Two patterns solve this:
51
+
52
+ 1. Use `actions/upload-artifact` at the end of the producing job and
53
+ `actions/download-artifact` at the start of the consuming job.
54
+ Best for: files, binaries, test results, build outputs.
55
+
56
+ 2. Use job `outputs:` to pass small string values. The producing job emits
57
+ `echo "key=value" >> $GITHUB_OUTPUT` and declares it under `outputs:`.
58
+ The consuming job reads it as `needs.<job>.outputs.<key>`.
59
+ Best for: version strings, commit SHAs, boolean flags, counts.
60
+ fix_code:
61
+ - language: yaml
62
+ label: 'Pass files between jobs using upload-artifact / download-artifact'
63
+ code: |
64
+ jobs:
65
+ build:
66
+ runs-on: ubuntu-latest
67
+ steps:
68
+ - uses: actions/checkout@v4
69
+
70
+ - name: Build binary
71
+ run: make build # produces ./dist/app
72
+
73
+ - name: Upload for next job
74
+ uses: actions/upload-artifact@v4
75
+ with:
76
+ name: app-binary
77
+ path: ./dist/app # upload so sign job can download it
78
+
79
+ sign:
80
+ needs: build
81
+ runs-on: ubuntu-latest
82
+ steps:
83
+ - name: Download binary
84
+ uses: actions/download-artifact@v4
85
+ with:
86
+ name: app-binary
87
+ path: ./dist
88
+
89
+ - name: Sign binary
90
+ run: cosign sign ./dist/app
91
+ - language: yaml
92
+ label: 'Pass small string data between jobs using job outputs'
93
+ code: |
94
+ jobs:
95
+ compute-version:
96
+ runs-on: ubuntu-latest
97
+ outputs:
98
+ version: ${{ steps.ver.outputs.version }}
99
+ steps:
100
+ - id: ver
101
+ run: echo "version=$(cat VERSION)" >> "$GITHUB_OUTPUT"
102
+
103
+ deploy:
104
+ needs: compute-version
105
+ runs-on: ubuntu-latest
106
+ steps:
107
+ - run: echo "Deploying v${{ needs.compute-version.outputs.version }}"
108
+ prevention:
109
+ - 'Never rely on /tmp, $RUNNER_TEMP, or workspace paths to share data between jobs — use artifacts or job outputs'
110
+ - 'Remember: only steps within the same job share a filesystem; different jobs always get separate runners'
111
+ - 'Use actions/upload-artifact@v4 for files; use job outputs for strings; use caches only for dependency restoration'
112
+ - 'Environment variables set with GITHUB_ENV are also job-scoped and do not persist across job boundaries'
113
+ docs:
114
+ - url: 'https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/storing-and-sharing-data-from-a-workflow'
115
+ label: 'GitHub Docs — Storing and sharing data between jobs using artifacts'
116
+ - url: 'https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/passing-information-between-jobs'
117
+ label: 'GitHub Docs — Passing information between jobs using outputs'
118
+ - url: 'https://docs.github.com/en/actions/writing-workflows/choosing-where-your-workflow-runs/about-github-hosted-runners'
119
+ label: 'GitHub Docs — About GitHub-hosted runners (each job gets a fresh VM)'
120
+ - url: 'https://github.com/orgs/community/discussions/26671'
121
+ label: 'GitHub Community — Sharing files and filesystem data between workflow jobs'
@@ -0,0 +1,94 @@
1
+ id: permissions-auth-062
2
+ title: 'create-github-app-token "Invalid keyData" — private key passed via env var with escaped \\n sequences'
3
+ category: permissions-auth
4
+ severity: error
5
+ tags:
6
+ - github-app
7
+ - private-key
8
+ - invalid-key-data
9
+ - environment-variable
10
+ - newlines
11
+ - create-github-app-token
12
+ - webcrypto
13
+ patterns:
14
+ - regex: 'Invalid keyData'
15
+ flags: 'i'
16
+ - regex: 'DOMException.*Invalid keyData|DataError.*Invalid keyData'
17
+ flags: 'i'
18
+ - regex: 'Failed to create token for .+ \(attempt \d+\): Invalid keyData'
19
+ flags: 'i'
20
+ error_messages:
21
+ - "DOMException [DataError]: Invalid keyData"
22
+ - "Failed to create token for \"repo-name\" (attempt 1): Invalid keyData"
23
+ - "Failed to create token for \"repo-name\" (attempt 2): Invalid keyData"
24
+ - "Error: Invalid keyData"
25
+ root_cause: |
26
+ The `actions/create-github-app-token` action v2+ uses the Web Crypto API
27
+ (`crypto.subtle.importKey()`) to load the GitHub App private key. This API
28
+ is strict about key formatting — it throws `DOMException [DataError]: Invalid keyData`
29
+ if the PEM key material is malformed at the byte level.
30
+
31
+ The most common trigger is passing the private key via an environment variable
32
+ where literal `\n` two-character sequences appear instead of actual newline (0x0A)
33
+ bytes. This happens when:
34
+ 1. The key is constructed inline in YAML with `"-----BEGIN...\nMIIE...\n-----END..."`
35
+ where `\n` is a YAML string escape, not a real newline in the multi-line base64 body
36
+ 2. An external CI system or secrets manager serializes the PEM key as a single line
37
+ with literal backslash-n separators before injecting it into the Actions environment
38
+ 3. Shell variable interpolation collapses the newlines (e.g., `echo $PRIVATE_KEY`)
39
+
40
+ The Web Crypto SubtleCrypto API attempts to Base64-decode the key body. When the
41
+ PEM line breaks are backslash-n characters (0x5C 0x6E) instead of 0x0A, the Base64
42
+ chunks are malformed and importKey() throws "Invalid keyData" immediately — before
43
+ any GitHub API call is made.
44
+
45
+ This is distinct from "A JSON web token could not be decoded" (permissions-auth-021)
46
+ which occurs when the key IS imported successfully but the resulting JWT is rejected
47
+ by GitHub's API — a later-stage failure caused by different formatting issues such
48
+ as trailing whitespace, CRLF endings, or missing PEM headers.
49
+ fix: |
50
+ Pass the private key directly as an action input using the GitHub Actions secret
51
+ expression `${{ secrets.APP_PRIVATE_KEY }}`. When GitHub resolves a secret, it
52
+ preserves the original stored bytes including actual newlines. Do NOT pass the key
53
+ through env: variables or inline string construction.
54
+
55
+ To store the key with correct newlines, set the secret from the downloaded .pem file
56
+ using the GitHub CLI:
57
+ gh secret set APP_PRIVATE_KEY < my-app.private-key.pem
58
+ fix_code:
59
+ - language: yaml
60
+ label: 'Correct: pass private key directly as action input from secret'
61
+ code: |
62
+ - uses: actions/create-github-app-token@v1
63
+ id: app-token
64
+ with:
65
+ app-id: ${{ vars.APP_ID }}
66
+ private-key: ${{ secrets.APP_PRIVATE_KEY }} # newlines preserved by Actions runtime
67
+ - language: yaml
68
+ label: 'Wrong: constructing key inline with \\n escape sequences (causes Invalid keyData)'
69
+ code: |
70
+ # DO NOT DO THIS — \n are literal two-char sequences, not newlines
71
+ - name: Broken token generation
72
+ env:
73
+ KEY: "-----BEGIN RSA PRIVATE KEY-----\nMIIEow...\n-----END RSA PRIVATE KEY-----"
74
+ run: |
75
+ echo "$KEY" > /tmp/key.pem
76
+ # The action will fail with: DOMException [DataError]: Invalid keyData
77
+ - language: shell
78
+ label: 'Set secret from .pem file using GitHub CLI (preserves real newlines)'
79
+ code: |
80
+ gh secret set APP_PRIVATE_KEY < my-app.2024-01-15.private-key.pem
81
+ prevention:
82
+ - 'Always set APP_PRIVATE_KEY secret using `gh secret set KEY < file.pem`, not by pasting the raw PEM text with \\n sequences'
83
+ - 'Pass the key exclusively as `private-key: ${{ secrets.KEY }}` — never via env: or inline string interpolation'
84
+ - 'If importing from an external secrets manager, ensure the manager preserves actual newline bytes (0x0A) when injecting into GitHub Actions secrets'
85
+ - 'Verify the secret was set correctly: run `gh secret list` and confirm the key was recently updated'
86
+ docs:
87
+ - url: 'https://github.com/actions/create-github-app-token'
88
+ label: 'actions/create-github-app-token README'
89
+ - url: 'https://github.com/actions/create-github-app-token/issues/184'
90
+ label: 'actions/create-github-app-token#184 — Invalid keyData when key passed via environment variable'
91
+ - url: 'https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey'
92
+ label: 'MDN — SubtleCrypto.importKey() — DOMException DataError causes'
93
+ - url: 'https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-private-key-for-a-github-app'
94
+ label: 'GitHub Docs — Generating a private key for a GitHub App'
@@ -0,0 +1,84 @@
1
+ id: yaml-syntax-067
2
+ title: 'workflow_dispatch input type: object is not valid — "Unexpected value" validation error'
3
+ category: yaml-syntax
4
+ severity: error
5
+ tags:
6
+ - workflow_dispatch
7
+ - inputs
8
+ - type-object
9
+ - validation-error
10
+ - yaml
11
+ patterns:
12
+ - regex: 'on\.workflow_dispatch\.inputs\.\w+\.type.*Unexpected value'
13
+ flags: 'i'
14
+ - regex: "Unexpected value 'object'"
15
+ flags: 'i'
16
+ - regex: 'Input type .object. is not supported'
17
+ flags: 'i'
18
+ error_messages:
19
+ - "Invalid workflow file: on.workflow_dispatch.inputs.config.type: Unexpected value 'object'"
20
+ - "Invalid workflow file: .github/workflows/deploy.yml: Unexpected value 'object'"
21
+ root_cause: |
22
+ `workflow_dispatch` inputs support only five types: `string`, `boolean`, `choice`,
23
+ `environment`, and `number`. There is no `object` type. Developers attempting to pass
24
+ complex structured data (JSON objects, arrays) via a workflow_dispatch input often
25
+ try `type: object`, which causes an immediate YAML schema validation error and
26
+ prevents the workflow from running at all.
27
+
28
+ The valid type list:
29
+ - string — plain text value
30
+ - boolean — true/false checkbox in UI
31
+ - choice — dropdown from a fixed options list
32
+ - environment — GitHub environment picker
33
+ - number — numeric value (coerced to string at runtime)
34
+
35
+ There is no object, array, list, or json type for workflow_dispatch inputs.
36
+ The workflow file fails validation and does not appear as runnable in the
37
+ Actions UI.
38
+ fix: |
39
+ Use `type: string` and serialize the complex data as a JSON string. Parse it inside
40
+ the workflow using the `fromJSON()` expression function or `jq` in a run step.
41
+ fix_code:
42
+ - language: yaml
43
+ label: 'Pass complex data as a JSON string — use type: string, not type: object'
44
+ code: |
45
+ on:
46
+ workflow_dispatch:
47
+ inputs:
48
+ config:
49
+ type: string # NOT type: object
50
+ description: 'JSON config e.g. {"env":"prod","replicas":3}'
51
+ default: '{}'
52
+ required: false
53
+
54
+ jobs:
55
+ deploy:
56
+ runs-on: ubuntu-latest
57
+ steps:
58
+ - name: Parse config input
59
+ run: |
60
+ ENV=$(echo '${{ inputs.config }}' | jq -r .env)
61
+ REPLICAS=$(echo '${{ inputs.config }}' | jq -r .replicas)
62
+ echo "Deploying to $ENV with $REPLICAS replicas"
63
+ - language: yaml
64
+ label: 'Access nested fields with fromJSON() in expressions'
65
+ code: |
66
+ jobs:
67
+ deploy:
68
+ runs-on: ubuntu-latest
69
+ env:
70
+ ENV_NAME: ${{ fromJSON(inputs.config).env }}
71
+ steps:
72
+ - run: echo "Environment is $ENV_NAME"
73
+ prevention:
74
+ - 'Only use type: string, boolean, choice, environment, or number for workflow_dispatch inputs'
75
+ - 'For structured data, serialize as a JSON string and parse inside the job with jq or fromJSON()'
76
+ - 'Use actionlint to catch unsupported input types before pushing the workflow file'
77
+ - 'Document the expected JSON schema in the input description field so callers know the format'
78
+ docs:
79
+ - url: 'https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#workflow_dispatch'
80
+ label: 'GitHub Docs — workflow_dispatch inputs (valid types: string, boolean, choice, environment, number)'
81
+ - url: 'https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/evaluate-expressions-in-workflows-and-actions#fromjson'
82
+ label: 'GitHub Docs — fromJSON() expression function'
83
+ - url: 'https://stackoverflow.com/questions/76181396/github-actions-workflow-with-input-type-object-not-running'
84
+ label: 'Stack Overflow — workflow_dispatch with input type object not running'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@htekdev/actions-debugger",
3
- "version": "1.0.108",
3
+ "version": "1.0.109",
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",