Compare commits

58 Commits

Author SHA1 Message Date
8ca9c67979 fix(ci): upgrade node to v22 and update docs to reflect vitest usage
Some checks failed
Test / Run Tests (push) Failing after 13m41s
Lint / pre-commit Linting (push) Failing after 14m12s
2025-12-28 04:54:26 +00:00
48f7596789 Merge branch 'main' into add-testing
Some checks failed
Lint / pre-commit Linting (push) Successful in 1m33s
Test / Run Tests (push) Failing after 2m5s
2025-12-28 05:24:28 +01:00
ae87ee6e35 feat: add coverage support for testing and update .gitignore
Some checks failed
Lint / pre-commit Linting (push) Successful in 1m16s
Test / Run Tests (push) Failing after 8m3s
2025-12-27 21:31:19 +00:00
97ecdcbc66 Exclude the dist forlder from pre-commit (#54)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m12s
Reviewed-on: #54
2025-12-27 21:10:44 +01:00
6ff8731e50 chore: remove cached Prettier files from .gitignore
Some checks failed
Lint / pre-commit Linting (push) Successful in 1m12s
Test / Run Tests (push) Failing after 1m41s
2025-12-27 18:57:46 +00:00
b7136de5e2 Merge remote-tracking branch 'origin/main' into add-testing
Some checks failed
Lint / pre-commit Linting (push) Successful in 1m26s
Test / Run Tests (push) Failing after 1m48s
2025-12-27 18:54:57 +00:00
de6b54abe9 feat: use a custom build js step instead of all the dependencies (#53)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m38s
Reviewed-on: #53
2025-12-27 19:25:56 +01:00
60d3342a1c chore: ressort whitespace hooks in pre-commit config (#52)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m24s
Reviewed-on: #52
2025-12-27 01:42:41 +01:00
e5773d3235 chore: format devcontainer.json and lint.yaml for consistency
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m23s
2025-12-27 01:39:31 +01:00
0d97efec68 chore: ressort whitespace hooks in pre-commit config 2025-12-27 01:35:24 +01:00
9e9740b8b1 chore(deps): update mcr.microsoft.com/devcontainers/javascript-node docker tag to v4 (#51)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m24s
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| mcr.microsoft.com/devcontainers/javascript-node | image | major | `1-20` → `4-20` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42Ni4wIiwidXBkYXRlZEluVmVyIjoiNDIuNjYuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Reviewed-on: #51
Co-authored-by: Renovate Bot <renovate@horstenkamp.eu>
Co-committed-by: Renovate Bot <renovate@horstenkamp.eu>
2025-12-27 01:24:56 +01:00
65486738c0 chore: add a devcontainer setup (#50)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m30s
Add a devcontainer setup and remove a few redundent pre-commit hooks

Reviewed-on: #50
2025-12-27 01:02:36 +01:00
a2b753417a Add testing script and vitest as a dev dependency in package.json
Some checks failed
Lint / pre-commit Linting (push) Successful in 1m52s
Test / Run Tests (push) Failing after 8m40s
2025-12-23 16:42:07 +01:00
25e4ba9f71 feat: Add relevant check-jsonschema pre-commit hooks (#48)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m20s
Reviewed-on: #48
2025-12-21 14:03:52 +01:00
76eaa21fb3 Add a npm rebuild option to the renovate.json (#47)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m19s
Reviewed-on: #47
2025-12-21 12:22:25 +01:00
e39a879879 Add a gemini Geminin CLI guid for the LLM and a NPM section that installs npm packages after updates via renovate (#46)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m39s
Reviewed-on: #46
2025-12-21 01:19:31 +01:00
291ffc41bc Add a renovate.json schema validation (#45)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m23s
Reviewed-on: #45
2025-12-19 17:51:59 +01:00
60c6779c64 Add a renovate.json schema validation hook
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m25s
2025-12-19 17:49:54 +01:00
fb80f152df Add a schema validation for the renovate.json 2025-12-19 17:49:28 +01:00
1da1212c8f Run npm-install and add npm install as a post update option (#42)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m35s
Reviewed-on: #42
2025-12-16 19:32:16 +01:00
a892e71b21 run-npm-install (#44)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m30s
Reviewed-on: #44
2025-12-16 01:10:50 +01:00
74d74b73ad Run npm install (#43)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m18s
Reviewed-on: #43
2025-12-16 01:07:55 +01:00
9510650dd1 chore(deps): update actions/checkout action to v6 (#38)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m40s
Co-authored-by: Renovate Bot <renovate@horstenkamp.eu>
Co-committed-by: Renovate Bot <renovate@horstenkamp.eu>
2025-11-20 17:58:48 +01:00
96da456932 chore(deps): update dependency screeps-api to v1.16.1 (#34)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m35s
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [screeps-api](https://github.com/screepers/node-screeps-api) | [`1.7.2` -> `1.16.1`](https://renovatebot.com/diffs/npm/screeps-api/1.7.2/1.16.1) | [![age](https://developer.mend.io/api/mc/badges/age/npm/screeps-api/1.16.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/screeps-api/1.7.2/1.16.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) |

---

### Release Notes

<details>
<summary>screepers/node-screeps-api (screeps-api)</summary>

### [`v1.16.1`](d0f56bfae9...8b6ad48b41)

[Compare Source](d0f56bfae9...8b6ad48b41)

### [`v1.16.0`](01712e09eb...d0f56bfae9)

[Compare Source](01712e09eb...d0f56bfae9)

### [`v1.15.1`](71390f76ab...01712e09eb)

[Compare Source](71390f76ab...01712e09eb)

### [`v1.15.0`](2b10eaebe6...71390f76ab)

[Compare Source](2b10eaebe6...71390f76ab)

### [`v1.14.0`](07dcce7d6d...2b10eaebe6)

[Compare Source](07dcce7d6d...2b10eaebe6)

### [`v1.13.0`](db1ac1e841...07dcce7d6d)

[Compare Source](db1ac1e841...07dcce7d6d)

### [`v1.12.2`](38134ddf1e...db1ac1e841)

[Compare Source](38134ddf1e...db1ac1e841)

### [`v1.12.1`](eacd92956e...38134ddf1e)

[Compare Source](eacd92956e...38134ddf1e)

### [`v1.12.0`](29023be68f...eacd92956e)

[Compare Source](29023be68f...eacd92956e)

### [`v1.11.1`](dd520bc1cf...29023be68f)

[Compare Source](dd520bc1cf...29023be68f)

### [`v1.11.0`](a42856fa88...dd520bc1cf)

[Compare Source](a42856fa88...dd520bc1cf)

### [`v1.10.0`](4e15d49c45...a42856fa88)

[Compare Source](4e15d49c45...a42856fa88)

### [`v1.9.1`](866a7e4c40...4e15d49c45)

[Compare Source](866a7e4c40...4e15d49c45)

### [`v1.9.0`](7d7116d4a7...866a7e4c40)

[Compare Source](7d7116d4a7...866a7e4c40)

### [`v1.8.1`](dd019cb140...7d7116d4a7)

[Compare Source](dd019cb140...7d7116d4a7)

### [`v1.8.0`](4d23ab0dd0...dd019cb140)

[Compare Source](4d23ab0dd0...dd019cb140)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNDAuMCIsInVwZGF0ZWRJblZlciI6IjQxLjE0MC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Reviewed-on: #34
Co-authored-by: Renovate Bot <renovate@horstenkamp.eu>
Co-committed-by: Renovate Bot <renovate@horstenkamp.eu>
2025-11-02 22:46:51 +01:00
d95bfe4b61 chore(deps): update actions/checkout action to v5 (#33)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m37s
Co-authored-by: Renovate Bot <renovate@horstenkamp.eu>
Co-committed-by: Renovate Bot <renovate@horstenkamp.eu>
2025-09-06 15:18:55 +02:00
19259737af chore(deps): update actions/setup-python action to v6 (#29)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m25s
Co-authored-by: Renovate Bot <renovate@horstenkamp.eu>
Co-committed-by: Renovate Bot <renovate@horstenkamp.eu>
2025-09-05 02:50:53 +02:00
ac36a7ab1f chore(deps): update pre-commit hook pre-commit/pre-commit-hooks to v6 (#31)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m33s
Co-authored-by: Renovate Bot <renovate@horstenkamp.eu>
Co-committed-by: Renovate Bot <renovate@horstenkamp.eu>
2025-09-05 02:47:08 +02:00
0780c1e8ab chore(deps): update pre-commit hook macisamuele/language-formatters-pre-commit-hooks to v2.15.0 (#30)
All checks were successful
Lint / pre-commit Linting (push) Successful in 2m3s
Co-authored-by: Renovate Bot <renovate@horstenkamp.eu>
Co-committed-by: Renovate Bot <renovate@horstenkamp.eu>
2025-09-05 02:43:09 +02:00
9d9dc1e822 Update renovate.json (#28)
All checks were successful
Lint / pre-commit Linting (push) Successful in 2m0s
Reviewed-on: #28
2025-09-05 02:40:16 +02:00
82e4d66d61 chore(deps): update actions/setup-python action to v5 (#26)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m43s
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/setup-python](https://github.com/actions/setup-python) | action | major | `v4` -> `v5` |

---

### Release Notes

<details>
<summary>actions/setup-python (actions/setup-python)</summary>

### [`v5`](https://github.com/actions/setup-python/compare/v4...v5)

[Compare Source](https://github.com/actions/setup-python/compare/v4...v5)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4yMS4zIiwidXBkYXRlZEluVmVyIjoiNDEuMjEuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Reviewed-on: #26
Co-authored-by: Renovate Bot <renovate@horstenkamp.eu>
Co-committed-by: Renovate Bot <renovate@horstenkamp.eu>
2025-08-10 16:02:47 +02:00
01deab89cd chore(deps): update dependency glob to v11.0.3 (#24)
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m48s
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [glob](https://github.com/isaacs/node-glob) | dependencies | patch | [`11.0.1` -> `11.0.3`](https://renovatebot.com/diffs/npm/glob/11.0.1/11.0.3) |

---

### Release Notes

<details>
<summary>isaacs/node-glob (glob)</summary>

### [`v11.0.3`](https://github.com/isaacs/node-glob/compare/v11.0.2...v11.0.3)

[Compare Source](https://github.com/isaacs/node-glob/compare/v11.0.2...v11.0.3)

### [`v11.0.2`](https://github.com/isaacs/node-glob/compare/v11.0.1...v11.0.2)

[Compare Source](https://github.com/isaacs/node-glob/compare/v11.0.1...v11.0.2)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4yMS4zIiwidXBkYXRlZEluVmVyIjoiNDEuMjEuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Reviewed-on: #24
Co-authored-by: Renovate Bot <renovate@horstenkamp.eu>
Co-committed-by: Renovate Bot <renovate@horstenkamp.eu>
2025-08-10 15:14:39 +02:00
28b0ab9f02 chore: Configure Renovate (#23)
All checks were successful
Lint / pre-commit Linting (push) Successful in 2m3s
Reviewed-on: #23
2025-08-10 15:01:15 +02:00
0c37ffc7c7 Add renovate.json
All checks were successful
Lint / pre-commit Linting (push) Successful in 1m0s
2025-05-10 08:53:56 +00:00
Philipp Horstenkamp
9c79fe03b0 Delete .gitea/workflows/maintenance.yaml (#22)
All checks were successful
Lint / pre-commit Linting (push) Successful in 59s
Reviewed-on: #22
2025-05-10 10:44:20 +02:00
6f0f75d7ad Fixed glob import (#21)
All checks were successful
Lint / pre-commit Linting (push) Successful in 32s
Glob was not imported as a function

Reviewed-on: #21
Co-authored-by: Philipp Horstenkamp <philipp@horstenkamp.de>
Co-committed-by: Philipp Horstenkamp <philipp@horstenkamp.de>
2025-04-21 21:00:29 +02:00
318515b9c4 Update dependencies (#20)
All checks were successful
Lint / pre-commit Linting (push) Successful in 29s
- @actions/core
- glob
- screeps-api

Reviewed-on: #20
Co-authored-by: Philipp Horstenkamp <philipp@horstenkamp.de>
Co-committed-by: Philipp Horstenkamp <philipp@horstenkamp.de>
2025-04-12 13:43:45 +02:00
1aa7be2b73 Moved execution time (#19)
All checks were successful
Lint / pre-commit Linting (push) Successful in 52s
Auto Maintenance Cycle / pre-commit Autoupdate (push) Successful in 1m52s
Reviewed-on: #19
Co-authored-by: Philipp Horstenkamp <philipp@horstenkamp.de>
Co-committed-by: Philipp Horstenkamp <philipp@horstenkamp.de>
2025-04-02 23:41:12 +02:00
567eb22cd8 Updates to the pre-commit action created at 2025-01-12 (#18)
Some checks failed
Lint / pre-commit Linting (push) Successful in 35s
Auto Maintenance Cycle / pre-commit Autoupdate (push) Failing after 14m52s
Update to the pre-commit action.

Reviewed-on: #18
Co-authored-by: runner <git@horstenkamp.eu>
Co-committed-by: runner <git@horstenkamp.eu>
2025-03-16 21:50:53 +01:00
Philipp Horstenkamp
898a9aae6d Updates to the pre-commit action created at 2024-07-20 (#17)
Some checks failed
Lint / pre-commit Linting (push) Successful in 46s
Auto Maintenance Cycle / pre-commit Autoupdate (push) Failing after 11m47s
Reviewed-on: #17
2024-07-21 14:53:02 +02:00
3b0920a44a chore: update pre-commit hooks
All checks were successful
Lint / pre-commit Linting (push) Successful in 47s
2024-07-20 22:07:01 +00:00
Philipp Horstenkamp
dec00551b1 Set default value to commiter and reviewer (#16)
All checks were successful
Lint / pre-commit Linting (push) Successful in 47s
Auto Maintenance Cycle / pre-commit Autoupdate (push) Successful in 1m52s
Reviewed-on: #16
2024-05-24 02:24:17 +02:00
Philipp Horstenkamp
8309164978 Added an assigne as a variable.
All checks were successful
Lint / pre-commit Linting (push) Successful in 45s
Auto Maintenance Cycle / pre-commit Autoupdate (push) Successful in 1m43s
2024-05-24 02:20:23 +02:00
Philipp Horstenkamp
7f0b32347e Set default value to commiter and reviewer
All checks were successful
Lint / pre-commit Linting (push) Successful in 48s
Auto Maintenance Cycle / pre-commit Autoupdate (push) Successful in 1m37s
2024-05-24 02:09:00 +02:00
508eec34d7 Add an replacement for the {{hostname}} token. (#15)
All checks were successful
Lint / pre-commit Linting (push) Successful in 49s
Reviewed-on: #15
Co-authored-by: Philipp Horstenkamp <philipp@horstenkamp.de>
Co-committed-by: Philipp Horstenkamp <philipp@horstenkamp.de>
2024-05-23 23:47:07 +02:00
bee951fc34 Fixed the copyright note (#14)
All checks were successful
Lint / pre-commit Linting (push) Successful in 45s
Reviewed-on: #14
Co-authored-by: Philipp Horstenkamp <philipp@horstenkamp.de>
Co-committed-by: Philipp Horstenkamp <philipp@horstenkamp.de>
2024-05-23 23:05:59 +02:00
Act Runner
3e3d24f787 Updates to the pre-commit action created at 2024-02-17 (#13)
All checks were successful
Lint / pre-commit Linting (push) Successful in 25s
Auto Maintenance Cycle / pre-commit Autoupdate (push) Successful in 1m10s
Update to the pre-commit action.

Co-authored-by: Philipp <Philipp@users.noreply.github.com>
Reviewed-on: #13
Co-authored-by: Act Runner <runner@np-replay-git@horstenkamp.eu>
Co-committed-by: Act Runner <runner@np-replay-git@horstenkamp.eu>
2024-04-25 22:39:28 +02:00
e342ceca6f Added the ability to replace some placeholders in the screeps code (#12)
All checks were successful
Lint / pre-commit Linting (push) Successful in 29s
added the `git-replace` option.
Replaceing {{gitRef}}, {{deployTime}} and {{gitHash}}.

Reviewed-on: #12
Co-authored-by: Philipp Horstenkamp <philipp@horstenkamp.de>
Co-committed-by: Philipp Horstenkamp <philipp@horstenkamp.de>
2023-12-25 02:22:42 +01:00
Act Runner
a039bc1e28 Updates to the pre-commit action created at 2023-12-23 (#11)
All checks were successful
Lint / pre-commit Linting (push) Successful in 36s
Update to the pre-commit action.

Co-authored-by: Philipp <Philipp@users.noreply.github.com>
Reviewed-on: #11
Co-authored-by: Act Runner <runner@np-replay-git@horstenkamp.eu>
Co-committed-by: Act Runner <runner@np-replay-git@horstenkamp.eu>
2023-12-24 10:55:35 +01:00
Philipp Horstenkamp
0a952729bc Merge pull request 'Updates to the pre-commit action created at 2023-12-09' (#10) from chore/update-pre-commit into main
All checks were successful
Lint / pre-commit Linting (push) Successful in 55s
Reviewed-on: #10
Reviewed-by: Philipp Horstenkamp <philipp@np-replay-git@horstenkamp.eu>
2023-12-09 13:22:43 +01:00
Philipp
f106f83c72 chore: update pre-commit hooks
All checks were successful
Lint / pre-commit Linting (push) Successful in 59s
2023-12-09 12:20:40 +00:00
Philipp Horstenkamp
cd7745d646 Merge pull request 'Reworked the maintance action to use a PAT' (#8) from maintance-action-with-token into main
All checks were successful
Lint / pre-commit Linting (push) Successful in 25s
Auto Maintenance Cycle / pre-commit Autoupdate (push) Successful in 1m24s
Reviewed-on: #8
2023-12-09 13:18:57 +01:00
4951253d52 Reworked the maintance action to use a PAT
All checks were successful
Lint / pre-commit Linting (push) Successful in 55s
Auto Maintenance Cycle / pre-commit Autoupdate (push) Successful in 1m33s
2023-12-09 13:16:49 +01:00
e7678a5f66 Added auth for private servers (#7)
All checks were successful
Lint / pre-commit Linting (push) Successful in 45s
Reviewed-on: #7
Co-authored-by: Philipp Horstenkamp <philipp@horstenkamp.de>
Co-committed-by: Philipp Horstenkamp <philipp@horstenkamp.de>
2023-11-26 22:24:16 +01:00
6f5729c12a First development of the deploy action (#6)
Some checks failed
Lint / pre-commit Linting (push) Has been cancelled
Deploy js code to an instance of screeps.
Some debugging tools are implemented.

Reviewed-on: #6
Co-authored-by: Philipp Horstenkamp <philipp@horstenkamp.de>
Co-committed-by: Philipp Horstenkamp <philipp@horstenkamp.de>
2023-11-26 18:31:49 +01:00
Philipp Horstenkamp
0858cc69be Merge pull request 'Fixed the name of the lint workflow.' (#5) from action-name-fix into main
All checks were successful
Auto Maintenance Cycle / pre-commit Autoupdate (push) Successful in 30s
Lint / pre-commit Linting (push) Successful in 46s
Reviewed-on: #5
2023-11-25 00:31:49 +01:00
df14b016b7 Fixed the name of the lint workflow.
All checks were successful
Lint / pre-commit Linting (push) Successful in 20s
2023-11-25 00:29:16 +01:00
Philipp Horstenkamp
f1581c908b Merge pull request 'Updates to the pre-commit action created at 2023-11-24' (#1) from update/pre-commit-hooks into main
All checks were successful
Auto Maintenance Cycle / pre-commit Linting (push) Successful in 19s
Reviewed-on: #1
2023-11-25 00:28:23 +01:00
Philipp
d04a264bc4 chore: update pre-commit hooks 2023-11-24 21:38:23 +00:00
18 changed files with 61323 additions and 114 deletions

View File

@@ -0,0 +1,37 @@
{
"name": "JS Dev Container",
"image": "mcr.microsoft.com/devcontainers/javascript-node:4-20",
"features": {
"ghcr.io/devcontainers/features/git:1": {},
"ghcr.io/devcontainers/features/git-lfs:1": {},
"ghcr.io/devcontainers-extra/features/pre-commit:2": {},
"ghcr.io/devcontainers-extra/features/npm-packages:1": {
"packages": "@google/gemini-cli"
}
},
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"esbenp.prettier-vscode",
"vitest.explorer",
"google.gemini-cli-vscode-ide-companion",
"google.geminicodeassist"
],
"settings": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}
},
"postStartCommand": "bash .devcontainer/setup.sh",
"remoteUser": "node",
"updateRemoteUserUID": true,
"mounts": [
"source=pipx-venvs,target=/home/node/.local/share/pipx,type=volume",
"source=pipx-bin,target=/home/node/.local/bin,type=volume",
"source=pre-commit-cache,target=/home/node/.cache/pre-commit,type=volume",
"source=${localEnv:USERPROFILE}/.gemini,target=/home/node/.gemini,type=bind",
"source=gvscode-extensions,target=/home/node/.cache/google-vscode-extension,type=volume"
]
}

11
.devcontainer/setup.sh Normal file
View File

@@ -0,0 +1,11 @@
#!/bin/bash
# 1. Fix Git Permissions (Critical in Docker)
git config --global --add safe.directory $(pwd)
# In your setup.sh or postCreateCommand
sudo chown -R node:node /home/node/.cache/
# 2. Re-connect Git Hooks
pre-commit install
pre-commit install-hooks

View File

@@ -1,18 +1,18 @@
name: Lint name: Lint
on: on:
push: push:
workflow_dispatch: workflow_dispatch:
jobs: jobs:
pre-commit-lint: pre-commit-lint:
name: pre-commit Linting name: pre-commit Linting
runs-on: pi runs-on: pi
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v6
- uses: actions/setup-python@v4 - uses: actions/setup-python@v6
- run: pip install pre-commit - run: pip install pre-commit
shell: bash shell: bash
- name: Pre Commit - name: Pre Commit
run: SKIP=no-commit-to-branch pre-commit run -a run: SKIP=no-commit-to-branch pre-commit run -a
shell: bash shell: bash

View File

@@ -1,44 +0,0 @@
name: Auto Maintenance Cycle
on:
push:
paths:
- .gitea/workflows/maintenance.yaml
schedule:
- cron: 0 1 * * 0
workflow_dispatch:
jobs:
auto-update:
name: pre-commit Autoupdate
runs-on: pi64
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
- run: pip install pre-commit
shell: bash
- run: pre-commit autoupdate
shell: bash
- name: Test pre-commit
run: SKIP=no-commit-to-branch pre-commit run -a
- name: Commit
id: auto-commit-action
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: 'chore: update pre-commit hooks'
branch: update/pre-commit-hooks
push_options: --force
create_branch: true
- name: Generate Date
run: echo "CURRENT_DATE=$(date +'%Y-%m-%d')" >> $GITHUB_ENV
- run: echo "${{steps.auto-commit-action.outputs.changes_detected}}"
- name: Create an PR action
if: steps.auto-commit-action.outputs.changes_detected == 'true'
uses: https://git.horstenkamp.eu/Philipp/gitea-act-create-pr@main
with:
token: ${{ secrets.REPO_TOKEN }}
branch: update/pre-commit-hooks
title: Updates to the pre-commit action created at ${{ env.CURRENT_DATE }}
body: Update to the pre-commit action.
assignees: Philipp
reviewers: Philipp

View File

@@ -0,0 +1,19 @@
name: Test
on:
push:
workflow_dispatch:
jobs:
test:
name: Run Tests
runs-on: pi
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v4
with:
node-version: '22'
- run: npm install
shell: bash
- run: npm test
shell: bash

1078
.gitignore vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,50 +1,54 @@
repos: exclude: ^(dist|node_modules)/
- repo: https://github.com/pre-commit/pre-commit-hooks repos:
rev: v4.5.0 - repo: https://github.com/pre-commit/pre-commit-hooks
hooks: rev: v6.0.0
- id: end-of-file-fixer hooks:
exclude: (.txt$|.ipynb$|README.md$|readme.mde$) - id: check-yaml
- id: trailing-whitespace - id: check-json
exclude: (.txt$|README.md$) - id: check-toml
- id: check-yaml - id: check-xml
- id: check-json - id: check-added-large-files
- id: check-toml args: [--enforce-all]
- id: check-xml exclude: ^dist/index\.js$
- id: check-added-large-files - id: name-tests-test
args: [--enforce-all] - id: detect-private-key
- id: name-tests-test - id: check-case-conflict
- id: detect-private-key - id: check-symlinks
- id: check-case-conflict - id: check-docstring-first
- id: check-symlinks - id: pretty-format-json
- id: check-docstring-first args: [--autofix, --no-sort-keys, --no-ensure-ascii]
- id: pretty-format-json - id: check-merge-conflict
args: [--autofix, --no-sort-keys, --no-ensure-ascii] - id: no-commit-to-branch
- id: check-merge-conflict
- id: no-commit-to-branch - repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks
args: [--branch, main] rev: v2.15.0
hooks:
- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks - id: pretty-format-ini
rev: v2.11.0 args: [--autofix]
hooks: - id: pretty-format-toml
- id: pretty-format-ini args: [--autofix]
args: [--autofix] - id: pretty-format-yaml
- id: pretty-format-toml args: [--autofix]
args: [--autofix]
- id: pretty-format-yaml - repo: https://github.com/pre-commit/mirrors-prettier
args: [--autofix] rev: v4.0.0-alpha.8
hooks:
- repo: https://github.com/frnmst/md-toc - id: prettier
rev: 8.2.0 types_or: [css, javascript]
hooks:
- id: md-toc - repo: https://github.com/python-jsonschema/check-jsonschema
rev: 0.36.0
- repo: https://github.com/Lucas-C/pre-commit-hooks-java hooks:
rev: 1.3.10 - id: check-renovate
hooks: - id: check-github-actions
- id: validate-html - id: check-github-workflows
- repo: https://github.com/pre-commit/mirrors-prettier - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.1.0 rev: v6.0.0
hooks: hooks:
- id: prettier - id: end-of-file-fixer
types_or: [css, javascript] exclude: (.txt$|.ipynb$|README.md$|readme.mde$)
- id: trailing-whitespace
exclude: (.txt$|README.md$)
- id: mixed-line-ending
args: [--fix=lf]

13
.vscode/tasks.json vendored Normal file
View File

@@ -0,0 +1,13 @@
{
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "test",
"group": "test",
"problemMatcher": [],
"label": "npm: test",
"detail": "jest"
}
]
}

33
GEMINI.md Normal file
View File

@@ -0,0 +1,33 @@
# Gemini Actions
This repository is maintained by Gemini.
## Development Guidelines
* **Test-Driven Development (TDD):** Wherever possible, Test-Driven Development principles should be followed. Write tests before writing the code they are intended to validate.
* **Pre-commit Hooks:** Ensure that `pre-commit` hooks are installed and active before making any commits. This can be done by running `pre-commit install` in your local repository.
## Repository Comparison
* On request, this repository should be compared against the rules and guidelines specified in the `README.md` of the reference repository: `https://git.horstenkamp.eu/Philipp/template-git`.
## Testing
This project uses [Vitest](https://vitest.dev/) for testing. The tests are located in the `__tests__` directory.
To run the tests locally, use the following command:
```bash
npm test
```
### Testing Pipeline
The tests are automatically run on every push and workflow dispatch using a Gitea workflow. The workflow is defined in `.gitea/workflows/test.yaml`. All testing for this repository is done via Gitea workflows, not GitHub workflows.
The Gitea workflow does the following:
1. Checks out the code.
2. Sets up Node.js.
3. Installs the dependencies using `npm install`.
4. Runs the tests using `npm test`.

View File

@@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2023 Screeps Copyright (c) 2023 Philipp Horstenkamp
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

109
README.md
View File

@@ -1,3 +1,110 @@
# screeps-deploy-action # screeps-deploy-action
This action deploys screeps code via github / gitea actions. ## Introduction
This GitHub Action facilitates the uploading of code to a Screeps server.
It's designed to automate the process of deploying JavaScript code to your Screeps account, ensuring that your game logic is consistently and efficiently updated.
Prerequisites
A Screeps account with an access token.
A GitHub or Gitea repository with your Screeps code.
## Usage
To use this action, you need to set it up in your workflow .yml file located in the .github/workflows directory of your repository.
## Inputs
- `protocol`: The protocol to use (default: https).
- `hostname`: The hostname of the Screeps server (default: screeps.com).
- `port`: The port to use (default: 443).
- `path`: The path for the API (default: /).
- `token`: Authentication token for Screeps.
- `username`: Username for Screeps account (used if no token is provided).
- `password`: Password for Screeps account (used if no token is provided).
- `prefix`: Directory prefix for file paths.
- `pattern`: Glob pattern to match files (default: *.js).
- `branch`: Branch in Screeps to which the code will be uploaded (default: default).
- `git-replace`: Overwrite "{{gitRef}}", "{{gitHash}}" and "{{deployTime}}" values in files matching the pattern.
Example Workflow
Create a `.yml` file (e.g., `screeps-deploy.yml`) in your repository's `.github/workflows` directory or `.gitea/workflows` directory:
```yaml
name: Deploy to Screeps
on: [push]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Upload to Screeps
uses: Screeps/screeps-deploy-action@main
with:
token: ${{ secrets.SCREEPS_TOKEN }}
pattern: '**/*.js'
branch: 'default'
git-replace: /some_options.js
```
In this example:
- The action runs on every push to the repository.
- It checks out your code.
- Then, it uses the "Upload to Screeps" action to deploy the code to your Screeps account.
- You need to set SCREEPS_TOKEN in your repository secrets.
## Advanced Usage
Please note that you can easily filter your deployment branches in the push action.
Multiple deploy steps or jobs are recomended for mulitple deployments.
## Development & Build
This project includes a build step to prepare the action for use.
### Why a Build Step?
We use a build step to compile the JavaScript code and its dependencies into a single, self-contained file (`dist/index.js`). This approach is chosen for the following reasons:
1. **Zero-configuration at Runtime:** By bundling everything, the action runner doesn't need to run `npm install`, which speeds up the action execution.
2. **Reliability:** It guarantees that the exact versions of dependencies tested during development are used in the action, avoiding potential issues with version updates or missing packages.
3. **Standard Practice:** This is a recommended practice for JavaScript-based GitHub/Gitea Actions.
### The Tool: @vercel/ncc
We chose [`@vercel/ncc`](https://github.com/vercel/ncc) as the compiler because:
- It is designed specifically for compiling Node.js modules into a single file.
- It handles native dependencies and dynamic requires intelligently.
- It is zero-config, making the setup simple and maintainable.
### How to Build
If you modify `index.js` or change dependencies, you must rebuild the project before committing:
```bash
npm install
npm run build
```
This will update the `dist/index.js` file, which should be committed to the repository.
### Cross-Platform Compatibility
To ensure this action runs on all platforms (including ARM devices like Raspberry Pi), we explicitly exclude optional native dependencies (`utf-8-validate` and `bufferutil`) from the build. This forces the underlying `ws` library to use its pure JavaScript fallback implementation.
### Build Protocol
| Metric | Status / Value |
| :--- | :--- |
| **Last Build** | Saturday, December 27, 2025 |
| **Build Tool** | `@vercel/ncc` |
| **Target Runtime** | Node.js 20 |
| **Artifact** | `dist/index.js` (Self-contained) |
| **Native Binaries** | None (Excluded for cross-platform support) |
| **Compatibility** | Linux (x64/ARM), Windows, macOS |
| **Build Status** | ✅ Success |

117
__tests__/index.test.js Normal file
View File

@@ -0,0 +1,117 @@
const { validateAuthentication, replacePlaceholders } = require("../index");
const fs = require("fs");
const path = require("path");
const os = require("os");
const { glob } = require("glob");
describe("validateAuthentication", () => {
it("should return null when only token is provided", () => {
expect(validateAuthentication("token", null, null)).toBeNull();
});
it("should return an error message when token and username are provided", () => {
expect(validateAuthentication("token", "user", null)).toBe(
"Token is defined along with username and/or password.",
);
});
it("should return an error message when token and password are provided", () => {
expect(validateAuthentication("token", null, "pass")).toBe(
"Token is defined along with username and/or password.",
);
});
it("should return an error message when token, username, and password are provided", () => {
expect(validateAuthentication("token", "user", "pass")).toBe(
"Token is defined along with username and/or password.",
);
});
it("should return an error message when no credentials are provided", () => {
expect(validateAuthentication(null, null, null)).toBe(
"Neither token nor password and username are defined.",
);
});
it("should return an error message when only username is provided", () => {
expect(validateAuthentication(null, "user", null)).toBe(
"Username is defined but no password is provided.",
);
});
it("should return an error message when only password is provided", () => {
expect(validateAuthentication(null, null, "pass")).toBe(
"Password is defined but no username is provided.",
);
});
it("should return null when username and password are provided", () => {
expect(validateAuthentication(null, "user", "pass")).toBeNull();
});
});
describe("replacePlaceholders", () => {
beforeEach(() => {
process.env.GITHUB_SHA = "test-sha";
process.env.GITHUB_REF = "test-ref";
});
it("should replace all placeholders", () => {
const content =
"hash: {{gitHash}}, ref: {{gitRef}}, time: {{deployTime}}, host: {{hostname}}";
const replacedContent = replacePlaceholders(content, "test-host");
expect(replacedContent).toMatch(/hash: test-sha/);
expect(replacedContent).toMatch(/ref: test-ref/);
expect(replacedContent).toMatch(/time: .*/);
expect(replacedContent).toMatch(/host: test-host/);
});
});
describe("glob functionality", () => {
let tempDir;
beforeEach(async () => {
tempDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "glob-test-"));
await fs.promises.mkdir(path.join(tempDir, "lib"), { recursive: true });
await fs.promises.mkdir(path.join(tempDir, "deep", "folder"), {
recursive: true,
});
await fs.promises.writeFile(path.join(tempDir, "main.js"), "content");
await fs.promises.writeFile(path.join(tempDir, "utils.js"), "content");
await fs.promises.writeFile(
path.join(tempDir, "lib", "helper.js"),
"content",
);
await fs.promises.writeFile(
path.join(tempDir, "lib", "data.json"),
"content",
);
await fs.promises.writeFile(
path.join(tempDir, "deep", "folder", "main.js"),
"content",
);
});
afterEach(async () => {
if (tempDir) {
await fs.promises.rm(tempDir, { recursive: true, force: true });
}
});
it("should find all javascript files in the directory", async () => {
// Ensure pattern uses forward slashes for glob
const pattern = path.join(tempDir, "**", "*.js").split(path.sep).join("/");
const files = await glob(pattern);
// Normalize file paths to system separator (backslashes on Windows)
const normalizedFiles = files.map((f) => path.normalize(f));
const expectedFiles = [
path.join(tempDir, "deep", "folder", "main.js"),
path.join(tempDir, "lib", "helper.js"),
path.join(tempDir, "main.js"),
path.join(tempDir, "utils.js"),
].sort();
expect(normalizedFiles.sort()).toEqual(expectedFiles);
});
});

45
action.yaml Normal file
View File

@@ -0,0 +1,45 @@
name: Upload to Screeps
description: This action uploads code to the Screeps server.
inputs:
protocol:
description: 'The protocol to use (default: https).'
required: false
default: https
hostname:
description: 'The hostname of the Screeps server (default: screeps.com).'
required: false
default: screeps.com
port:
description: 'The port to use (default: 443).'
required: false
default: '443'
path:
description: The path for the API.
required: false
default: /
token:
description: Authentication token for Screeps.
required: true
username:
description: Username for Screeps account. Used if no token is provided.
required: false
password:
description: Password for Screeps account. Used if no token is provided.
required: false
prefix:
description: Directory prefix for file paths.
required: false
pattern:
description: 'Glob pattern to match files (default: *.js).'
required: false
default: '*.js'
branch:
description: 'Branch in Screeps to which the code will be uploaded (default: default).'
required: false
default: default
git-replace:
description: Allows for the overwrite of the "{{gitRef}}", "{{gitHash}}" and "{{deployTime}}" values in the file matching the file pattern. The file pattern will be combined with the prefix.
required: false
runs:
using: node20
main: dist/index.js

56808
dist/index.js vendored Normal file

File diff suppressed because one or more lines are too long

182
index.js Normal file
View File

@@ -0,0 +1,182 @@
const { ScreepsAPI } = require("screeps-api");
const core = require("@actions/core");
const fs = require("fs");
const { glob } = require("glob");
const path = require("path");
/**
* Replaces specific placeholder strings within the provided content with corresponding dynamic values.
*
* This function specifically targets three placeholders:
* - {{gitHash}} is replaced with the current Git commit hash, obtained from the GITHUB_SHA environment variable.
* - {{gitRef}} is replaced with the Git reference (branch or tag) that triggered the workflow, obtained from the GITHUB_REF environment variable.
* - {{deployTime}} is replaced with the current ISO timestamp.
*
* Note: This function is designed for use within a GitHub Actions workflow where GITHUB_SHA and GITHUB_REF environment variables are automatically set.
*
* @param {string} content - The string content in which placeholders are to be replaced.
* @returns {string} The content with placeholders replaced by their respective dynamic values.
*/
function replacePlaceholders(content, hostname) {
const deployTime = new Date().toISOString();
return content
.replace(/{{gitHash}}/g, process.env.GITHUB_SHA)
.replace(/{{gitRef}}/g, process.env.GITHUB_REF)
.replace(/{{deployTime}}/g, deployTime)
.replace(/{{hostname}}/g, hostname);
}
/**
* Reads all files matching a specified pattern, replaces certain placeholders in their content, and writes the updated content back to the files.
*
* This function searches for files in the filesystem using the provided glob pattern, optionally prefixed. It reads each file,
* uses the `replacePlaceholders` function to replace specific placeholders in the file's content, and then writes the modified content
* back to the original file. This is useful for dynamically updating file contents in a batch process, such as during a build or deployment.
*
* @param {string} pattern - The glob pattern used to find files. Example: '*.js' for all JavaScript files.
* @param {string} [prefix] - An optional directory prefix to prepend to the glob pattern. This allows searching within a specific directory.
* @returns {Promise<string[]>} A promise that resolves with an array of file paths that were processed, or rejects with an error if the process fails.
*/
async function readReplaceAndWriteFiles(pattern, prefix, hostname) {
const globPattern = prefix ? path.join(prefix, pattern) : pattern;
const files = await glob(globPattern);
let processPromises = files.map((file) => {
return fs.promises.readFile(file, "utf8").then((content) => {
content = replacePlaceholders(content, hostname);
return fs.promises.writeFile(file, content);
});
});
await Promise.all(processPromises);
return files;
}
/**
* Reads files matching a glob pattern into a dictionary.
* @param {string} pattern - Glob pattern to match files.
* @param {string} prefix - Directory prefix for file paths.
* @returns {Promise<Object>} - Promise resolving to a dictionary of file contents keyed by filenames.
*/
async function readFilesIntoDict(pattern, prefix) {
// Prepend the prefix to the glob pattern
const globPattern = prefix ? path.join(prefix, pattern) : pattern;
const files = await glob(globPattern);
let fileDict = {};
let readPromises = files.map((file) => {
return fs.promises.readFile(file, "utf8").then((content) => {
// Remove the prefix from the filename and drop the file suffix
let key = file;
if (prefix && file.startsWith(prefix)) {
key = key.slice(prefix.length);
}
key = path.basename(key, path.extname(key)); // Drop the file suffix
fileDict[key] = content;
});
});
await Promise.all(readPromises);
return fileDict;
}
/**
* Validates the provided authentication credentials.
* @param {string} token - The authentication token.
* @param {string} username - The username.
* @param {string} password - The password.
* @returns {string|null} - Returns an error message if validation fails, otherwise null.
*/
function validateAuthentication(token, username, password) {
if (token) {
if (username || password) {
return "Token is defined along with username and/or password.";
}
} else {
if (!username && !password) {
return "Neither token nor password and username are defined.";
}
if (username && !password) {
return "Username is defined but no password is provided.";
}
if (!username && password) {
return "Password is defined but no username is provided.";
}
}
return null; // No errors found
}
/**
* Posts code to Screeps server.
*/
async function postCode() {
const protocol = core.getInput("protocol") || "https";
const hostname = core.getInput("hostname") || "screeps.com";
const port = core.getInput("port") || "443";
const path = core.getInput("path") || "/";
const token = core.getInput("token") || undefined;
const username = core.getInput("username") || undefined;
const password = core.getInput("password") || undefined;
const prefix = core.getInput("source-prefix");
const pattern = core.getInput("pattern") || "*.js";
const branch = core.getInput("branch") || "default";
const gitReplace = core.getInput("git-replace") || null;
if (gitReplace) {
await readReplaceAndWriteFiles(gitReplace, prefix, hostname);
}
const files_to_push = await readFilesIntoDict(pattern, prefix);
core.info(`Trying to upload the following files to ${branch}:`);
Object.keys(files_to_push).forEach((key) => {
core.info(`Key: ${key}`);
});
const login_arguments = {
token: token,
username: username,
password: password,
protocol: protocol,
hostname: hostname,
port: port,
path: path,
};
core.info("login_arguments:");
core.info(JSON.stringify(login_arguments, null, 2));
const errorMessage = validateAuthentication(token, username, password);
if (errorMessage) {
core.error(errorMessage);
return;
}
let api = new ScreepsAPI(login_arguments);
if (token) {
const response = await api.code.set(branch, files_to_push);
core.info(JSON.stringify(response, null, 2));
console.log(`Code set successfully to ${branch}`);
} else {
core.info(`Logging in as user ${username}`);
await Promise.resolve()
.then(() => api.auth(username, password, login_arguments))
.then(() => {
api.code.set(branch, files_to_push);
})
.then(() => {
console.log(`Code set successfully to ${branch}`);
})
.catch((err) => {
console.error("Error:", err);
});
}
}
postCode();
module.exports = {
validateAuthentication,
replacePlaceholders,
};

2754
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

21
package.json Normal file
View File

@@ -0,0 +1,21 @@
{
"name": "screeps-deploy-action",
"version": "0.1.1",
"description": "Deploys screeps code to the official game or an pirvate server.",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "vitest run --globals --coverage",
"build": "ncc build index.js -o dist --external utf-8-validate --external bufferutil"
},
"dependencies": {
"@actions/core": "^1.11.1",
"glob": "^11.0.1",
"screeps-api": "^1.7.2"
},
"devDependencies": {
"@vercel/ncc": "^0.38.4",
"@vitest/coverage-v8": "^4.0.16",
"vitest": "^4.0.16"
}
}

24
renovate.json Normal file
View File

@@ -0,0 +1,24 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"local>server/Renovate-Template:renovate.json",
"config:recommended",
":automergeLinters"
],
"packageRules": [
{
"matchManagers": [
"npm"
],
"postUpgradeTasks": {
"commands": [
"npm ci",
"npm run build"
],
"fileFilters": [
"dist/index.js"
]
}
}
]
}