@htekdev/actions-debugger 1.0.85 → 1.0.86

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,76 @@
1
+ id: caching-artifacts-050
2
+ title: "upload-artifact@v4 fails when artifact storage quota is exceeded"
3
+ category: caching-artifacts
4
+ severity: error
5
+ tags:
6
+ - upload-artifact
7
+ - storage-quota
8
+ - v4
9
+ - billing
10
+ - artifact-cleanup
11
+ patterns:
12
+ - regex: 'Artifact storage quota has been hit'
13
+ flags: i
14
+ - regex: 'unable to upload any new artifacts'
15
+ flags: i
16
+ - regex: 'storage limit.*exceeded'
17
+ flags: i
18
+ error_messages:
19
+ - "Artifact storage quota has been hit, unable to upload any new artifacts. Please remove some old artifacts or increase storage for the repo."
20
+ root_cause: |
21
+ GitHub Actions artifact storage has per-account limits (500 MB for free plans, 2 GB for Pro,
22
+ 50 GB for Teams, and custom limits for Enterprise). Unlike actions/upload-artifact@v3 which
23
+ used a legacy backend, v4 strictly enforces storage quotas and fails hard when the limit
24
+ is exceeded. Old artifacts from previous workflow runs accumulate over time and are not
25
+ automatically purged unless a retention policy is set. Once the quota is hit, all subsequent
26
+ artifact uploads fail immediately with no partial upload.
27
+ fix: |
28
+ 1. Set retention-days on all upload-artifact steps to automatically expire old artifacts.
29
+ 2. Delete old artifacts programmatically using the GitHub REST API via actions/github-script.
30
+ 3. Increase artifact and log storage in GitHub billing settings (Org/User Settings -> Billing -> Storage).
31
+ 4. Audit artifact size — only upload what is necessary for debugging or downstream jobs.
32
+ fix_code:
33
+ - language: yaml
34
+ label: "Set retention-days to auto-expire artifacts"
35
+ code: |
36
+ - name: Upload build artifacts
37
+ uses: actions/upload-artifact@v4
38
+ with:
39
+ name: build-output
40
+ path: dist/
41
+ retention-days: 7 # auto-delete after 7 days; default is 90
42
+
43
+ - language: yaml
44
+ label: "Delete artifacts older than 30 days via GitHub API script"
45
+ code: |
46
+ - name: Clean up old artifacts
47
+ uses: actions/github-script@v7
48
+ with:
49
+ script: |
50
+ const cutoff = new Date();
51
+ cutoff.setDate(cutoff.getDate() - 30);
52
+ const artifacts = await github.paginate(
53
+ github.rest.actions.listArtifactsForRepo,
54
+ { owner: context.repo.owner, repo: context.repo.repo, per_page: 100 }
55
+ );
56
+ for (const artifact of artifacts) {
57
+ if (new Date(artifact.created_at) < cutoff) {
58
+ await github.rest.actions.deleteArtifact({
59
+ owner: context.repo.owner,
60
+ repo: context.repo.repo,
61
+ artifact_id: artifact.id,
62
+ });
63
+ }
64
+ }
65
+ prevention:
66
+ - "Always set retention-days on upload-artifact steps — default is 90 days which fills storage quickly"
67
+ - "Upload only the minimum files needed for debugging or downstream jobs, not entire build directories"
68
+ - "Add a weekly scheduled workflow to delete artifacts older than your retention window"
69
+ - "Monitor storage usage under GitHub Settings -> Billing & plans -> Storage"
70
+ docs:
71
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/storing-workflow-data-as-artifacts#configuring-a-custom-artifact-retention-period"
72
+ label: "GitHub Docs: Custom artifact retention period"
73
+ - url: "https://docs.github.com/en/billing/managing-billing-for-your-products/managing-billing-for-github-actions/about-billing-for-github-actions#included-storage-and-minutes"
74
+ label: "GitHub Docs: Included storage and minutes"
75
+ - url: "https://github.com/actions/upload-artifact/issues/577"
76
+ label: "actions/upload-artifact#577: Storage quota exceeded on v4"
@@ -0,0 +1,75 @@
1
+ id: permissions-auth-050
2
+ title: "Fine-grained PAT with wrong resource owner causes 'repository not found' in checkout"
3
+ category: permissions-auth
4
+ severity: error
5
+ tags:
6
+ - fine-grained-pat
7
+ - checkout
8
+ - resource-owner
9
+ - PAT
10
+ - authentication
11
+ patterns:
12
+ - regex: 'repository.*not found'
13
+ flags: i
14
+ - regex: 'remote: Repository not found'
15
+ flags: i
16
+ - regex: 'fatal: unable to access.*403'
17
+ flags: i
18
+ error_messages:
19
+ - "fatal: repository 'https://github.com/org/repo.git/' not found"
20
+ - "remote: Repository not found."
21
+ - "Error: fatal: unable to access 'https://github.com/org/repo.git/': The requested URL returned error: 403"
22
+ root_cause: |
23
+ Fine-grained personal access tokens (PATs) require selecting a resource owner when created —
24
+ either your personal account or a specific organization. A token scoped to a personal account
25
+ (e.g., user alice) cannot authenticate to repositories owned by an organization (e.g., myorg),
26
+ even if alice is a member of myorg with full access. Attempting to use such a PAT in
27
+ actions/checkout, actions/github-script REST calls, or any GitHub API call targeting the
28
+ organization's repos results in a misleading "repository not found" or HTTP 403 error. The
29
+ repository is accessible through the web UI because browser sessions use OAuth-based auth —
30
+ but the fine-grained PAT token is strictly limited to its configured resource owner scope.
31
+ Classic PATs (without granular resource scope) do not have this restriction, which is why
32
+ the problem only appears after migrating to fine-grained PATs.
33
+ fix: |
34
+ Regenerate the fine-grained PAT selecting the correct resource owner — the organization or
35
+ user account that owns the target repository. If you need to access repositories across
36
+ multiple organizations, create one PAT per organization, or use a GitHub App installation
37
+ token which supports cross-repo access without resource-owner restrictions.
38
+ fix_code:
39
+ - language: yaml
40
+ label: "Checkout org repo — PAT must have org as resource owner"
41
+ code: |
42
+ # The secret ORG_SCOPED_PAT must be a fine-grained PAT created with
43
+ # Resource owner = myorg (not your personal account)
44
+ - uses: actions/checkout@v4
45
+ with:
46
+ repository: myorg/private-repo
47
+ token: ${{ secrets.ORG_SCOPED_PAT }}
48
+
49
+ - language: yaml
50
+ label: "Use a GitHub App installation token to avoid resource-owner scope issues"
51
+ code: |
52
+ - name: Generate app installation token
53
+ id: app-token
54
+ uses: actions/create-github-app-token@v2
55
+ with:
56
+ app-id: ${{ vars.APP_ID }}
57
+ private-key: ${{ secrets.APP_PRIVATE_KEY }}
58
+ owner: myorg
59
+
60
+ - uses: actions/checkout@v4
61
+ with:
62
+ repository: myorg/private-repo
63
+ token: ${{ steps.app-token.outputs.token }}
64
+ prevention:
65
+ - "When creating a fine-grained PAT, verify the Resource owner dropdown matches the organization or user that OWNS the target repository"
66
+ - "Name secrets descriptively: ORG_SCOPED_PAT vs USER_SCOPED_PAT to avoid mixing tokens with different owners"
67
+ - "Prefer GitHub App installation tokens for multi-repo or cross-org access — they have no resource-owner scoping restriction"
68
+ - "Classic PATs (repo scope) remain an option if fine-grained token resource-owner scoping is causing confusion"
69
+ docs:
70
+ - url: "https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-fine-grained-personal-access-token"
71
+ label: "GitHub Docs: Creating a fine-grained personal access token"
72
+ - url: "https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#about-fine-grained-personal-access-tokens"
73
+ label: "GitHub Docs: About fine-grained PATs and resource owner scope"
74
+ - url: "https://github.com/actions/checkout?tab=readme-ov-file#checkout-a-different-private-repository"
75
+ label: "actions/checkout: Checkout a different private repository"
@@ -0,0 +1,74 @@
1
+ id: runner-environment-150
2
+ title: "actions/github-script relative require() fails — CWD is not GITHUB_WORKSPACE"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - github-script
7
+ - require
8
+ - nodejs
9
+ - working-directory
10
+ - module-not-found
11
+ patterns:
12
+ - regex: 'Cannot find module'
13
+ flags: i
14
+ - regex: 'MODULE_NOT_FOUND'
15
+ flags: ''
16
+ error_messages:
17
+ - "Error: Cannot find module './my-helper'"
18
+ - "Error: Cannot find module '../utils/helper'"
19
+ - "{ code: 'MODULE_NOT_FOUND' }"
20
+ root_cause: |
21
+ The actions/github-script action evaluates the script: block in a Node.js context where the
22
+ current working directory (CWD) is a temporary internal directory used by the action runtime —
23
+ NOT $GITHUB_WORKSPACE. As a result, relative require() calls like require('./helpers/my-util')
24
+ fail with "Cannot find module" even when the file exists in the repository workspace. This
25
+ surprises developers who assume the script evaluates from the repository root directory.
26
+ Note: This is distinct from missing npm packages (runner-environment-136) — the file exists
27
+ on disk but is not found because Node.js resolves the relative path from the wrong base directory.
28
+ fix: |
29
+ Construct an absolute path using process.env.GITHUB_WORKSPACE before calling require(). The
30
+ GITHUB_WORKSPACE environment variable is always set to the repository root in hosted runners.
31
+ Alternatively, use the recommended pattern from the actions/github-script docs: point to the
32
+ absolute path via a template literal.
33
+ fix_code:
34
+ - language: yaml
35
+ label: "Use absolute path via process.env.GITHUB_WORKSPACE"
36
+ code: |
37
+ - uses: actions/github-script@v7
38
+ with:
39
+ script: |
40
+ const myHelper = require(`${process.env.GITHUB_WORKSPACE}/scripts/my-helper.js`);
41
+ await myHelper.run(github, context);
42
+
43
+ - language: yaml
44
+ label: "Pass workspace as env var for explicit clarity"
45
+ code: |
46
+ - uses: actions/github-script@v7
47
+ env:
48
+ WORKSPACE: ${{ github.workspace }}
49
+ with:
50
+ script: |
51
+ const helper = require(`${process.env.WORKSPACE}/scripts/helper.js`);
52
+ const result = helper.compute();
53
+ core.setOutput('result', result);
54
+
55
+ - language: yaml
56
+ label: "Use path.resolve for cross-platform safety"
57
+ code: |
58
+ - uses: actions/github-script@v7
59
+ with:
60
+ script: |
61
+ const path = require('path');
62
+ const utils = require(path.resolve(process.env.GITHUB_WORKSPACE, 'lib', 'utils.js'));
63
+ utils.run();
64
+ prevention:
65
+ - "Never use relative require() paths in github-script — always construct absolute paths with process.env.GITHUB_WORKSPACE"
66
+ - "Print process.cwd() in debug runs to confirm the actual CWD — it will not be your repo root"
67
+ - "For complex shared logic, consider a composite action or a dedicated JS action that has proper module resolution"
68
+ docs:
69
+ - url: "https://github.com/actions/github-script?tab=readme-ov-file#run-a-separate-file"
70
+ label: "actions/github-script: Run a separate file (recommended pattern)"
71
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/store-information-in-variables#default-environment-variables"
72
+ label: "GitHub Docs: GITHUB_WORKSPACE default environment variable"
73
+ - url: "https://github.com/actions/github-script/issues/390"
74
+ label: "actions/github-script#390: Cannot find module with relative path"
@@ -0,0 +1,91 @@
1
+ id: silent-failures-079
2
+ title: "actions/checkout path: input doesn't change GITHUB_WORKSPACE — subsequent steps use wrong directory"
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - checkout
7
+ - path
8
+ - GITHUB_WORKSPACE
9
+ - working-directory
10
+ - subdirectory
11
+ patterns:
12
+ - regex: 'No such file or directory'
13
+ flags: i
14
+ - regex: 'ENOENT.*no such file'
15
+ flags: i
16
+ error_messages:
17
+ - "No such file or directory"
18
+ - "ENOENT: no such file or directory"
19
+ root_cause: |
20
+ When actions/checkout is used with a path: input (e.g., path: app), the repository is
21
+ checked out into $GITHUB_WORKSPACE/app. However, the GITHUB_WORKSPACE environment variable
22
+ continues to point to the root workspace directory (/home/runner/work/repo-name/repo-name),
23
+ not to the path: subdirectory. Any subsequent run: steps that use ${{ github.workspace }}
24
+ or rely on the default working directory will NOT operate inside the checkout subdirectory.
25
+ This causes file-not-found errors that are hard to debug because the checkout step succeeds
26
+ and the files do exist — just not at the location subsequent steps expect. This is a
27
+ particularly common footgun when checking out multiple repositories into different subdirs.
28
+ fix: |
29
+ Explicitly specify working-directory on all run: steps that operate on the checked-out code,
30
+ OR set a job-level defaults.run.working-directory. Alternatively, avoid path: unless you
31
+ need multiple checkouts — the default checkout places files directly at $GITHUB_WORKSPACE.
32
+ fix_code:
33
+ - language: yaml
34
+ label: "Use working-directory to point to the checkout subdirectory"
35
+ code: |
36
+ - uses: actions/checkout@v4
37
+ with:
38
+ path: app
39
+
40
+ - name: Build
41
+ working-directory: ${{ github.workspace }}/app
42
+ run: npm install && npm run build
43
+
44
+ - language: yaml
45
+ label: "Set job-level default working-directory"
46
+ code: |
47
+ jobs:
48
+ build:
49
+ runs-on: ubuntu-latest
50
+ defaults:
51
+ run:
52
+ working-directory: ./app
53
+ steps:
54
+ - uses: actions/checkout@v4
55
+ with:
56
+ path: app
57
+ - run: npm install && npm run build
58
+
59
+ - language: yaml
60
+ label: "Multiple checkouts — use explicit paths for each"
61
+ code: |
62
+ steps:
63
+ - uses: actions/checkout@v4
64
+ with:
65
+ repository: myorg/frontend
66
+ path: frontend
67
+
68
+ - uses: actions/checkout@v4
69
+ with:
70
+ repository: myorg/backend
71
+ path: backend
72
+
73
+ - name: Build frontend
74
+ working-directory: frontend
75
+ run: npm ci && npm run build
76
+
77
+ - name: Build backend
78
+ working-directory: backend
79
+ run: go build ./...
80
+ prevention:
81
+ - "Prefer the default checkout (no path:) unless checking out multiple repos in the same job"
82
+ - "When path: is used, always add defaults.run.working-directory at the job level"
83
+ - "Never use ${{ github.workspace }} to reference files from a path:-redirected checkout without appending the path value"
84
+ - "Use echo $GITHUB_WORKSPACE and ls $GITHUB_WORKSPACE in debug steps to verify directory contents"
85
+ docs:
86
+ - url: "https://github.com/actions/checkout?tab=readme-ov-file#usage"
87
+ label: "actions/checkout: path input documentation"
88
+ - url: "https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_iddefaultsrun"
89
+ label: "GitHub Docs: jobs.defaults.run.working-directory"
90
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/store-information-in-variables#default-environment-variables"
91
+ label: "GitHub Docs: GITHUB_WORKSPACE default environment variable"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@htekdev/actions-debugger",
3
- "version": "1.0.85",
3
+ "version": "1.0.86",
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",