25 Commits

Author SHA1 Message Date
hikari f406b2b48c chore: replace .npmrc with pnpm-workspace.yaml
Node.js CI / CI (push) Successful in 30s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m42s
2026-03-02 16:27:22 -08:00
minori 47b686cdf7 Merge pull request 'deps: update typescript to 5.9.3' (#12) from dependencies/update-typescript into main
Node.js CI / CI (push) Successful in 22s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 56s
2026-03-02 07:01:19 -08:00
minori 866ede7542 Merge pull request 'deps: update @types/node-schedule to 2.1.8' (#9) from dependencies/update--types-node-schedule into main
Node.js CI / CI (push) Successful in 28s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m51s
2026-02-25 07:01:22 -08:00
minori c3346f7519 Merge pull request 'deps: update @nhcarrigan/logger to 1.1.1' (#6) from dependencies/update--nhcarrigan-logger into main
Node.js CI / CI (push) Successful in 31s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m18s
2026-02-23 20:44:43 -08:00
minori 668c304731 deps: update typescript to 5.9.3
Node.js CI / CI (pull_request) Successful in 28s
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 1m39s
2026-02-04 08:22:40 -08:00
minori 35e2bbf16a deps: update @types/node-schedule to 2.1.8
Node.js CI / CI (pull_request) Successful in 27s
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 1m28s
2026-02-04 08:22:19 -08:00
minori 1801f8d1de deps: update @nhcarrigan/logger to 1.1.1
Node.js CI / CI (pull_request) Successful in 29s
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 1m22s
2026-02-04 08:22:03 -08:00
hikari 2a8f9bd7ae docs: update feedback section to use support forum
Node.js CI / CI (push) Successful in 19s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m33s
2026-01-26 12:37:05 -08:00
naomi f11b8273c2 feat: automated upload of .gitea/workflows/ci.yml
Node.js CI / CI (push) Successful in 22s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 58s
2025-12-22 19:42:19 +01:00
naomi 9c0d38f61a feat: automated upload of .gitea/workflows/ci.yml
Node.js CI / CI (push) Has been cancelled
Security Scan and Upload / Security & DefectDojo Upload (push) Has been cancelled
2025-12-22 19:35:47 +01:00
naomi 7ebb556d1b feat: automated upload of .gitea/workflows/ci.yml
Node.js CI / Lint and Test (push) Has been cancelled
Security Scan and Upload / Security & DefectDojo Upload (push) Has been cancelled
2025-12-22 19:25:36 +01:00
naomi bfe7f682c0 feat: automated upload of .npmrc
Node.js CI / Lint and Test (push) Has been cancelled
Security Scan and Upload / Security & DefectDojo Upload (push) Has been cancelled
2025-12-22 19:16:26 +01:00
naomi 24e3793eec feat: automated upload of .gitea/workflows/security.yml
Node.js CI / Lint and Test (push) Successful in 22s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m1s
2025-12-18 03:08:18 +01:00
naomi 61ecc80e9a feat: automated upload of .gitea/workflows/security.yml
Node.js CI / Lint and Test (push) Successful in 22s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m0s
2025-12-17 23:26:18 +01:00
naomi 2c46672a81 feat: automated upload of .gitea/workflows/security.yml
Node.js CI / Lint and Test (push) Successful in 20s
Security Scan / Security Audit (push) Failing after 6m54s
2025-12-12 03:38:03 +01:00
naomi 0387262581 feat: automated delete of .gitea/workflows/sonar.yml
Node.js CI / Lint and Test (push) Successful in 18s
Security Scan / Trivy Security Scan (push) Failing after 4m48s
2025-12-12 00:15:15 +01:00
naomi efa6028b4c feat: automated upload of .gitea/workflows/security.yml
Node.js CI / Lint and Test (push) Successful in 19s
Security Scan / Trivy Security Scan (push) Failing after 4m48s
Code Analysis / SonarQube (push) Failing after 4m47s
2025-12-11 20:12:08 +01:00
naomi d56d5dcbfc chore: cyc cohort is over
Code Analysis / SonarQube (push) Failing after 18s
Node.js CI / Lint and Test (push) Successful in 38s
2025-08-14 09:55:50 -07:00
naomi efaf3dce16 feat: add mentorship channel
Code Analysis / SonarQube (push) Failing after 17s
Node.js CI / Lint and Test (push) Successful in 38s
2025-07-31 17:05:29 -07:00
naomi 0441f1c68a chore: remove freecodecamp channels
Code Analysis / SonarQube (push) Failing after 22s
Node.js CI / Lint and Test (push) Successful in 45s
2025-07-29 10:02:53 -07:00
naomi fa1d627178 feat: add support for dsd cohort channels
Code Analysis / SonarQube (push) Failing after 17s
Node.js CI / Lint and Test (push) Successful in 36s
2025-07-14 17:44:55 -07:00
naomi c0b21ce82f feat: confirm participation
Code Analysis / SonarQube (push) Failing after 14s
Node.js CI / Lint and Test (push) Successful in 34s
2025-07-02 14:48:50 -07:00
naomi 8121f3bb6d feat: only assign participation in Maribelle's threads
Code Analysis / SonarQube (push) Failing after 16s
Node.js CI / Lint and Test (push) Successful in 35s
2025-07-02 14:29:18 -07:00
naomi a632f2b924 feat: make fallback ping use guild instead of hardcoded value
Code Analysis / SonarQube (push) Failing after 17s
Node.js CI / Lint and Test (push) Successful in 38s
So we can reuse this bot for other utilities
2025-07-01 13:47:07 -07:00
naomi 5a8e56d188 feat: allow pinging roles 2025-07-01 13:39:45 -07:00
10 changed files with 338 additions and 226 deletions
+13 -4
View File
@@ -8,23 +8,32 @@ on:
- main - main
jobs: jobs:
lint: ci:
name: Lint and Test name: CI
runs-on: ubuntu-latest
steps: steps:
- name: Checkout Source Files - name: Checkout Source Files
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Use Node.js v22 - name: Use Node.js v24
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: 22 node-version: 24
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v2 uses: pnpm/action-setup@v2
with: with:
version: 10 version: 10
- name: Ensure Dependencies are Pinned
uses: naomi-lgbt/dependency-pin-check@main
with:
language: javascript
dev-dependencies: true
peer-dependencies: true
optional-dependencies: true
- name: Install Dependencies - name: Install Dependencies
run: pnpm install run: pnpm install
+177
View File
@@ -0,0 +1,177 @@
name: Security Scan and Upload
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
schedule:
- cron: '0 0 * * 1'
workflow_dispatch:
jobs:
security-audit:
name: Security & DefectDojo Upload
runs-on: ubuntu-latest
continue-on-error: true
steps:
- name: Checkout code
uses: actions/checkout@v4
# --- AUTO-SETUP PROJECT ---
- name: Ensure DefectDojo Product Exists
env:
DD_URL: ${{ secrets.DD_URL }}
DD_TOKEN: ${{ secrets.DD_TOKEN }}
PRODUCT_NAME: ${{ github.repository }}
PRODUCT_TYPE_ID: 1
run: |
sudo apt-get install jq -y > /dev/null
echo "Checking connection to $DD_URL..."
# Check if product exists - capture HTTP code to debug connection issues
RESPONSE=$(curl --write-out "%{http_code}" --silent --output /tmp/response.json \
-H "Authorization: Token $DD_TOKEN" \
"$DD_URL/api/v2/products/?name=$PRODUCT_NAME")
# If response is not 200, print error
if [ "$RESPONSE" != "200" ]; then
echo "::error::Failed to query DefectDojo. HTTP Code: $RESPONSE"
cat /tmp/response.json
exit 1
fi
COUNT=$(cat /tmp/response.json | jq -r '.count')
if [ "$COUNT" = "0" ]; then
echo "Creating product '$PRODUCT_NAME'..."
curl -s -X POST "$DD_URL/api/v2/products/" \
-H "Authorization: Token $DD_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "name": "'"$PRODUCT_NAME"'", "description": "Auto-created by Gitea Actions", "prod_type": '$PRODUCT_TYPE_ID' }'
else
echo "Product '$PRODUCT_NAME' already exists."
fi
# --- 1. TRIVY (Dependencies & Misconfig) ---
- name: Install Trivy
run: |
sudo apt-get install wget apt-transport-https gnupg lsb-release -y
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo "deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update && sudo apt-get install trivy -y
- name: Run Trivy (FS Scan)
run: |
trivy fs . --scanners vuln,misconfig --format json --output trivy-results.json --exit-code 0
- name: Upload Trivy to DefectDojo
env:
DD_URL: ${{ secrets.DD_URL }}
DD_TOKEN: ${{ secrets.DD_TOKEN }}
run: |
echo "Uploading Trivy results..."
# Generate today's date in YYYY-MM-DD format
TODAY=$(date +%Y-%m-%d)
HTTP_CODE=$(curl --write-out "%{http_code}" --output response.txt --silent -X POST "$DD_URL/api/v2/import-scan/" \
-H "Authorization: Token $DD_TOKEN" \
-F "active=true" \
-F "verified=true" \
-F "scan_type=Trivy Scan" \
-F "engagement_name=CI/CD Pipeline" \
-F "product_name=${{ github.repository }}" \
-F "scan_date=$TODAY" \
-F "auto_create_context=true" \
-F "file=@trivy-results.json")
if [[ "$HTTP_CODE" != "200" && "$HTTP_CODE" != "201" ]]; then
echo "::error::Upload Failed with HTTP $HTTP_CODE"
echo "--- SERVER RESPONSE ---"
cat response.txt
echo "-----------------------"
exit 1
else
echo "Upload Success!"
fi
# --- 2. GITLEAKS (Secrets) ---
- name: Install Gitleaks
run: |
wget -qO gitleaks.tar.gz https://github.com/gitleaks/gitleaks/releases/download/v8.18.0/gitleaks_8.18.0_linux_x64.tar.gz
tar -xzf gitleaks.tar.gz
sudo mv gitleaks /usr/local/bin/ && chmod +x /usr/local/bin/gitleaks
- name: Run Gitleaks
run: gitleaks detect --source . -v --report-path gitleaks-results.json --report-format json --no-git || true
- name: Upload Gitleaks to DefectDojo
env:
DD_URL: ${{ secrets.DD_URL }}
DD_TOKEN: ${{ secrets.DD_TOKEN }}
run: |
echo "Uploading Gitleaks results..."
TODAY=$(date +%Y-%m-%d)
HTTP_CODE=$(curl --write-out "%{http_code}" --output response.txt --silent -X POST "$DD_URL/api/v2/import-scan/" \
-H "Authorization: Token $DD_TOKEN" \
-F "active=true" \
-F "verified=true" \
-F "scan_type=Gitleaks Scan" \
-F "engagement_name=CI/CD Pipeline" \
-F "product_name=${{ github.repository }}" \
-F "scan_date=$TODAY" \
-F "auto_create_context=true" \
-F "file=@gitleaks-results.json")
if [[ "$HTTP_CODE" != "200" && "$HTTP_CODE" != "201" ]]; then
echo "::error::Upload Failed with HTTP $HTTP_CODE"
echo "--- SERVER RESPONSE ---"
cat response.txt
echo "-----------------------"
exit 1
else
echo "Upload Success!"
fi
# --- 3. SEMGREP (SAST) ---
- name: Install Semgrep (via pipx)
run: |
sudo apt-get install pipx -y
pipx install semgrep
# Add pipx binary path to GITHUB_PATH so next steps can see 'semgrep'
echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: Run Semgrep
run: semgrep scan --config=p/security-audit --config=p/owasp-top-ten --json --output semgrep-results.json . || true
- name: Upload Semgrep to DefectDojo
env:
DD_URL: ${{ secrets.DD_URL }}
DD_TOKEN: ${{ secrets.DD_TOKEN }}
run: |
echo "Uploading Semgrep results..."
TODAY=$(date +%Y-%m-%d)
HTTP_CODE=$(curl --write-out "%{http_code}" --output response.txt --silent -X POST "$DD_URL/api/v2/import-scan/" \
-H "Authorization: Token $DD_TOKEN" \
-F "active=true" \
-F "verified=true" \
-F "scan_type=Semgrep JSON Report" \
-F "engagement_name=CI/CD Pipeline" \
-F "product_name=${{ github.repository }}" \
-F "scan_date=$TODAY" \
-F "auto_create_context=true" \
-F "file=@semgrep-results.json")
if [[ "$HTTP_CODE" != "200" && "$HTTP_CODE" != "201" ]]; then
echo "::error::Upload Failed with HTTP $HTTP_CODE"
echo "--- SERVER RESPONSE ---"
cat response.txt
echo "-----------------------"
exit 1
else
echo "Upload Success!"
fi
-34
View File
@@ -1,34 +0,0 @@
name: Code Analysis
on:
push:
branches:
- main
jobs:
sonar:
name: SonarQube
steps:
- name: Checkout Source Files
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: SonarCube Scan
uses: SonarSource/sonarqube-scan-action@v4
timeout-minutes: 10
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: "https://quality.nhcarrigan.com"
with:
args: >
-Dsonar.sources=.
-Dsonar.projectKey=standup-bot
- name: SonarQube Quality Gate check
uses: sonarsource/sonarqube-quality-gate-action@v1
with:
pollingTimeoutSec: 600
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: "https://quality.nhcarrigan.com"
+1 -1
View File
@@ -18,7 +18,7 @@ This page is currently deployed. [View the live website.]
## Feedback and Bugs ## Feedback and Bugs
If you have feedback or a bug report, please feel free to open a GitHub issue! If you have feedback or a bug report, please [log a ticket on our forum](https://support.nhcarrigan.com).
## Contributing ## Contributing
+3 -3
View File
@@ -17,14 +17,14 @@
"@nhcarrigan/eslint-config": "5.2.0", "@nhcarrigan/eslint-config": "5.2.0",
"@nhcarrigan/typescript-config": "4.0.0", "@nhcarrigan/typescript-config": "4.0.0",
"@types/node": "24.0.6", "@types/node": "24.0.6",
"@types/node-schedule": "2.1.7", "@types/node-schedule": "2.1.8",
"@vitest/coverage-istanbul": "3.2.4", "@vitest/coverage-istanbul": "3.2.4",
"eslint": "9.30.0", "eslint": "9.30.0",
"typescript": "5.8.3", "typescript": "5.9.3",
"vitest": "3.2.4" "vitest": "3.2.4"
}, },
"dependencies": { "dependencies": {
"@nhcarrigan/logger": "1.0.0", "@nhcarrigan/logger": "1.1.1",
"discord.js": "14.21.0", "discord.js": "14.21.0",
"node-schedule": "2.1.1" "node-schedule": "2.1.1"
} }
+86 -76
View File
@@ -9,8 +9,8 @@ importers:
.: .:
dependencies: dependencies:
'@nhcarrigan/logger': '@nhcarrigan/logger':
specifier: 1.0.0 specifier: 1.1.1
version: 1.0.0 version: 1.1.1
discord.js: discord.js:
specifier: 14.21.0 specifier: 14.21.0
version: 14.21.0 version: 14.21.0
@@ -20,16 +20,16 @@ importers:
devDependencies: devDependencies:
'@nhcarrigan/eslint-config': '@nhcarrigan/eslint-config':
specifier: 5.2.0 specifier: 5.2.0
version: 5.2.0(@typescript-eslint/utils@8.25.0(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0)(playwright@1.50.1)(react@19.0.0)(typescript@5.8.3)(vitest@3.2.4(@types/node@24.0.6)) version: 5.2.0(@typescript-eslint/utils@8.25.0(eslint@9.30.0)(typescript@5.9.3))(eslint@9.30.0)(playwright@1.50.1)(react@19.0.0)(typescript@5.9.3)(vitest@3.2.4(@types/node@24.0.6))
'@nhcarrigan/typescript-config': '@nhcarrigan/typescript-config':
specifier: 4.0.0 specifier: 4.0.0
version: 4.0.0(typescript@5.8.3) version: 4.0.0(typescript@5.9.3)
'@types/node': '@types/node':
specifier: 24.0.6 specifier: 24.0.6
version: 24.0.6 version: 24.0.6
'@types/node-schedule': '@types/node-schedule':
specifier: 2.1.7 specifier: 2.1.8
version: 2.1.7 version: 2.1.8
'@vitest/coverage-istanbul': '@vitest/coverage-istanbul':
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(vitest@3.2.4(@types/node@24.0.6)) version: 3.2.4(vitest@3.2.4(@types/node@24.0.6))
@@ -37,8 +37,8 @@ importers:
specifier: 9.30.0 specifier: 9.30.0
version: 9.30.0 version: 9.30.0
typescript: typescript:
specifier: 5.8.3 specifier: 5.9.3
version: 5.8.3 version: 5.9.3
vitest: vitest:
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(@types/node@24.0.6) version: 3.2.4(@types/node@24.0.6)
@@ -415,8 +415,8 @@ packages:
typescript: '>=5' typescript: '>=5'
vitest: '>=2' vitest: '>=2'
'@nhcarrigan/logger@1.0.0': '@nhcarrigan/logger@1.1.1':
resolution: {integrity: sha512-2e19Bie+ZKb6yKPKjhawqsENkhHatYkvBAmFZx9eToOXdOca+CYi51tldRMtejg6e0+4hOOf2bo5zdBQKmH0dw==} resolution: {integrity: sha512-P6OEQFHDtf6psybYGljuCxkSW6DLQCsx1aZZ3w4YKBXHBFjDbhuvpM9K1kPhVN48hakitx2WPLEoIFr6YZELYw==}
'@nhcarrigan/typescript-config@4.0.0': '@nhcarrigan/typescript-config@4.0.0':
resolution: {integrity: sha512-969HVha7A/Sg77fuMwOm6p14a+7C5iE6g55OD71srqwKIgksQl+Ex/hAI/pyzTQFDQ/FBJbpnHlR4Ov25QV/rw==} resolution: {integrity: sha512-969HVha7A/Sg77fuMwOm6p14a+7C5iE6g55OD71srqwKIgksQl+Ex/hAI/pyzTQFDQ/FBJbpnHlR4Ov25QV/rw==}
@@ -478,51 +478,61 @@ packages:
resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm-musleabihf@4.34.8': '@rollup/rollup-linux-arm-musleabihf@4.34.8':
resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-arm64-gnu@4.34.8': '@rollup/rollup-linux-arm64-gnu@4.34.8':
resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm64-musl@4.34.8': '@rollup/rollup-linux-arm64-musl@4.34.8':
resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-loongarch64-gnu@4.34.8': '@rollup/rollup-linux-loongarch64-gnu@4.34.8':
resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==}
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-powerpc64le-gnu@4.34.8': '@rollup/rollup-linux-powerpc64le-gnu@4.34.8':
resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-gnu@4.34.8': '@rollup/rollup-linux-riscv64-gnu@4.34.8':
resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-s390x-gnu@4.34.8': '@rollup/rollup-linux-s390x-gnu@4.34.8':
resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.34.8': '@rollup/rollup-linux-x64-gnu@4.34.8':
resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-musl@4.34.8': '@rollup/rollup-linux-x64-musl@4.34.8':
resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-win32-arm64-msvc@4.34.8': '@rollup/rollup-win32-arm64-msvc@4.34.8':
resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==}
@@ -575,8 +585,8 @@ packages:
'@types/json5@0.0.29': '@types/json5@0.0.29':
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
'@types/node-schedule@2.1.7': '@types/node-schedule@2.1.8':
resolution: {integrity: sha512-G7Z3R9H7r3TowoH6D2pkzUHPhcJrDF4Jz1JOQ80AX0K2DWTHoN9VC94XzFAPNMdbW9TBzMZ3LjpFi7RYdbxtXA==} resolution: {integrity: sha512-k00g6Yj/oUg/CDC+MeLHUzu0+OFxWbIqrFfDiLi6OPKxTujvpv29mHGM8GtKr7B+9Vv92FcK/8mRqi1DK5f3hA==}
'@types/node@24.0.6': '@types/node@24.0.6':
resolution: {integrity: sha512-ZOyn+gOs749xU7ovp+Ibj0g1o3dFRqsfPnT22C2t5JzcRvgsEDpGawPbCISGKLudJk9Y0wiu9sYd6kUh0pc9TA==} resolution: {integrity: sha512-ZOyn+gOs749xU7ovp+Ibj0g1o3dFRqsfPnT22C2t5JzcRvgsEDpGawPbCISGKLudJk9Y0wiu9sYd6kUh0pc9TA==}
@@ -2144,8 +2154,8 @@ packages:
resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
typescript@5.8.3: typescript@5.9.3:
resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
hasBin: true hasBin: true
@@ -2650,19 +2660,19 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2 '@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/sourcemap-codec': 1.5.0
'@nhcarrigan/eslint-config@5.2.0(@typescript-eslint/utils@8.25.0(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0)(playwright@1.50.1)(react@19.0.0)(typescript@5.8.3)(vitest@3.2.4(@types/node@24.0.6))': '@nhcarrigan/eslint-config@5.2.0(@typescript-eslint/utils@8.25.0(eslint@9.30.0)(typescript@5.9.3))(eslint@9.30.0)(playwright@1.50.1)(react@19.0.0)(typescript@5.9.3)(vitest@3.2.4(@types/node@24.0.6))':
dependencies: dependencies:
'@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.30.0) '@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.30.0)
'@eslint/compat': 1.2.4(eslint@9.30.0) '@eslint/compat': 1.2.4(eslint@9.30.0)
'@eslint/eslintrc': 3.2.0 '@eslint/eslintrc': 3.2.0
'@eslint/js': 9.17.0 '@eslint/js': 9.17.0
'@stylistic/eslint-plugin': 2.12.1(eslint@9.30.0)(typescript@5.8.3) '@stylistic/eslint-plugin': 2.12.1(eslint@9.30.0)(typescript@5.9.3)
'@typescript-eslint/eslint-plugin': 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0)(typescript@5.8.3) '@typescript-eslint/eslint-plugin': 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.9.3))(eslint@9.30.0)(typescript@5.9.3)
'@typescript-eslint/parser': 8.19.0(eslint@9.30.0)(typescript@5.8.3) '@typescript-eslint/parser': 8.19.0(eslint@9.30.0)(typescript@5.9.3)
'@vitest/eslint-plugin': 1.1.24(@typescript-eslint/utils@8.25.0(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0)(typescript@5.8.3)(vitest@3.2.4(@types/node@24.0.6)) '@vitest/eslint-plugin': 1.1.24(@typescript-eslint/utils@8.25.0(eslint@9.30.0)(typescript@5.9.3))(eslint@9.30.0)(typescript@5.9.3)(vitest@3.2.4(@types/node@24.0.6))
eslint: 9.30.0 eslint: 9.30.0
eslint-plugin-deprecation: 3.0.0(eslint@9.30.0)(typescript@5.8.3) eslint-plugin-deprecation: 3.0.0(eslint@9.30.0)(typescript@5.9.3)
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.9.3))(eslint@9.30.0)
eslint-plugin-jsdoc: 50.6.1(eslint@9.30.0) eslint-plugin-jsdoc: 50.6.1(eslint@9.30.0)
eslint-plugin-playwright: 2.1.0(eslint@9.30.0) eslint-plugin-playwright: 2.1.0(eslint@9.30.0)
eslint-plugin-react: 7.37.3(eslint@9.30.0) eslint-plugin-react: 7.37.3(eslint@9.30.0)
@@ -2671,7 +2681,7 @@ snapshots:
globals: 15.14.0 globals: 15.14.0
playwright: 1.50.1 playwright: 1.50.1
react: 19.0.0 react: 19.0.0
typescript: 5.8.3 typescript: 5.9.3
vitest: 3.2.4(@types/node@24.0.6) vitest: 3.2.4(@types/node@24.0.6)
transitivePeerDependencies: transitivePeerDependencies:
- '@typescript-eslint/utils' - '@typescript-eslint/utils'
@@ -2679,11 +2689,11 @@ snapshots:
- eslint-import-resolver-webpack - eslint-import-resolver-webpack
- supports-color - supports-color
'@nhcarrigan/logger@1.0.0': {} '@nhcarrigan/logger@1.1.1': {}
'@nhcarrigan/typescript-config@4.0.0(typescript@5.8.3)': '@nhcarrigan/typescript-config@4.0.0(typescript@5.9.3)':
dependencies: dependencies:
typescript: 5.8.3 typescript: 5.9.3
'@nodelib/fs.scandir@2.1.5': '@nodelib/fs.scandir@2.1.5':
dependencies: dependencies:
@@ -2770,9 +2780,9 @@ snapshots:
'@sapphire/snowflake@3.5.3': {} '@sapphire/snowflake@3.5.3': {}
'@stylistic/eslint-plugin@2.12.1(eslint@9.30.0)(typescript@5.8.3)': '@stylistic/eslint-plugin@2.12.1(eslint@9.30.0)(typescript@5.9.3)':
dependencies: dependencies:
'@typescript-eslint/utils': 8.25.0(eslint@9.30.0)(typescript@5.8.3) '@typescript-eslint/utils': 8.25.0(eslint@9.30.0)(typescript@5.9.3)
eslint: 9.30.0 eslint: 9.30.0
eslint-visitor-keys: 4.2.0 eslint-visitor-keys: 4.2.0
espree: 10.3.0 espree: 10.3.0
@@ -2794,7 +2804,7 @@ snapshots:
'@types/json5@0.0.29': {} '@types/json5@0.0.29': {}
'@types/node-schedule@2.1.7': '@types/node-schedule@2.1.8':
dependencies: dependencies:
'@types/node': 24.0.6 '@types/node': 24.0.6
@@ -2808,32 +2818,32 @@ snapshots:
dependencies: dependencies:
'@types/node': 24.0.6 '@types/node': 24.0.6
'@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0)(typescript@5.8.3)': '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.9.3))(eslint@9.30.0)(typescript@5.9.3)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.12.1 '@eslint-community/regexpp': 4.12.1
'@typescript-eslint/parser': 8.19.0(eslint@9.30.0)(typescript@5.8.3) '@typescript-eslint/parser': 8.19.0(eslint@9.30.0)(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.19.0 '@typescript-eslint/scope-manager': 8.19.0
'@typescript-eslint/type-utils': 8.19.0(eslint@9.30.0)(typescript@5.8.3) '@typescript-eslint/type-utils': 8.19.0(eslint@9.30.0)(typescript@5.9.3)
'@typescript-eslint/utils': 8.19.0(eslint@9.30.0)(typescript@5.8.3) '@typescript-eslint/utils': 8.19.0(eslint@9.30.0)(typescript@5.9.3)
'@typescript-eslint/visitor-keys': 8.19.0 '@typescript-eslint/visitor-keys': 8.19.0
eslint: 9.30.0 eslint: 9.30.0
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 5.3.2 ignore: 5.3.2
natural-compare: 1.4.0 natural-compare: 1.4.0
ts-api-utils: 1.4.3(typescript@5.8.3) ts-api-utils: 1.4.3(typescript@5.9.3)
typescript: 5.8.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.8.3)': '@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.9.3)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 8.19.0 '@typescript-eslint/scope-manager': 8.19.0
'@typescript-eslint/types': 8.19.0 '@typescript-eslint/types': 8.19.0
'@typescript-eslint/typescript-estree': 8.19.0(typescript@5.8.3) '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.9.3)
'@typescript-eslint/visitor-keys': 8.19.0 '@typescript-eslint/visitor-keys': 8.19.0
debug: 4.4.0 debug: 4.4.0
eslint: 9.30.0 eslint: 9.30.0
typescript: 5.8.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -2852,14 +2862,14 @@ snapshots:
'@typescript-eslint/types': 8.25.0 '@typescript-eslint/types': 8.25.0
'@typescript-eslint/visitor-keys': 8.25.0 '@typescript-eslint/visitor-keys': 8.25.0
'@typescript-eslint/type-utils@8.19.0(eslint@9.30.0)(typescript@5.8.3)': '@typescript-eslint/type-utils@8.19.0(eslint@9.30.0)(typescript@5.9.3)':
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 8.19.0(typescript@5.8.3) '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.9.3)
'@typescript-eslint/utils': 8.19.0(eslint@9.30.0)(typescript@5.8.3) '@typescript-eslint/utils': 8.19.0(eslint@9.30.0)(typescript@5.9.3)
debug: 4.4.0 debug: 4.4.0
eslint: 9.30.0 eslint: 9.30.0
ts-api-utils: 1.4.3(typescript@5.8.3) ts-api-utils: 1.4.3(typescript@5.9.3)
typescript: 5.8.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -2869,7 +2879,7 @@ snapshots:
'@typescript-eslint/types@8.25.0': {} '@typescript-eslint/types@8.25.0': {}
'@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.3)': '@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.3)':
dependencies: dependencies:
'@typescript-eslint/types': 7.18.0 '@typescript-eslint/types': 7.18.0
'@typescript-eslint/visitor-keys': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0
@@ -2878,13 +2888,13 @@ snapshots:
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.7.1 semver: 7.7.1
ts-api-utils: 1.4.3(typescript@5.8.3) ts-api-utils: 1.4.3(typescript@5.9.3)
optionalDependencies: optionalDependencies:
typescript: 5.8.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/typescript-estree@8.19.0(typescript@5.8.3)': '@typescript-eslint/typescript-estree@8.19.0(typescript@5.9.3)':
dependencies: dependencies:
'@typescript-eslint/types': 8.19.0 '@typescript-eslint/types': 8.19.0
'@typescript-eslint/visitor-keys': 8.19.0 '@typescript-eslint/visitor-keys': 8.19.0
@@ -2893,12 +2903,12 @@ snapshots:
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.7.1 semver: 7.7.1
ts-api-utils: 1.4.3(typescript@5.8.3) ts-api-utils: 1.4.3(typescript@5.9.3)
typescript: 5.8.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/typescript-estree@8.25.0(typescript@5.8.3)': '@typescript-eslint/typescript-estree@8.25.0(typescript@5.9.3)':
dependencies: dependencies:
'@typescript-eslint/types': 8.25.0 '@typescript-eslint/types': 8.25.0
'@typescript-eslint/visitor-keys': 8.25.0 '@typescript-eslint/visitor-keys': 8.25.0
@@ -2907,41 +2917,41 @@ snapshots:
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.7.1 semver: 7.7.1
ts-api-utils: 2.0.1(typescript@5.8.3) ts-api-utils: 2.0.1(typescript@5.9.3)
typescript: 5.8.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@7.18.0(eslint@9.30.0)(typescript@5.8.3)': '@typescript-eslint/utils@7.18.0(eslint@9.30.0)(typescript@5.9.3)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.30.0) '@eslint-community/eslint-utils': 4.4.1(eslint@9.30.0)
'@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/scope-manager': 7.18.0
'@typescript-eslint/types': 7.18.0 '@typescript-eslint/types': 7.18.0
'@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3)
eslint: 9.30.0 eslint: 9.30.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
- typescript - typescript
'@typescript-eslint/utils@8.19.0(eslint@9.30.0)(typescript@5.8.3)': '@typescript-eslint/utils@8.19.0(eslint@9.30.0)(typescript@5.9.3)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.30.0) '@eslint-community/eslint-utils': 4.4.1(eslint@9.30.0)
'@typescript-eslint/scope-manager': 8.19.0 '@typescript-eslint/scope-manager': 8.19.0
'@typescript-eslint/types': 8.19.0 '@typescript-eslint/types': 8.19.0
'@typescript-eslint/typescript-estree': 8.19.0(typescript@5.8.3) '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.9.3)
eslint: 9.30.0 eslint: 9.30.0
typescript: 5.8.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@8.25.0(eslint@9.30.0)(typescript@5.8.3)': '@typescript-eslint/utils@8.25.0(eslint@9.30.0)(typescript@5.9.3)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.30.0) '@eslint-community/eslint-utils': 4.4.1(eslint@9.30.0)
'@typescript-eslint/scope-manager': 8.25.0 '@typescript-eslint/scope-manager': 8.25.0
'@typescript-eslint/types': 8.25.0 '@typescript-eslint/types': 8.25.0
'@typescript-eslint/typescript-estree': 8.25.0(typescript@5.8.3) '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.9.3)
eslint: 9.30.0 eslint: 9.30.0
typescript: 5.8.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -2976,12 +2986,12 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@vitest/eslint-plugin@1.1.24(@typescript-eslint/utils@8.25.0(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0)(typescript@5.8.3)(vitest@3.2.4(@types/node@24.0.6))': '@vitest/eslint-plugin@1.1.24(@typescript-eslint/utils@8.25.0(eslint@9.30.0)(typescript@5.9.3))(eslint@9.30.0)(typescript@5.9.3)(vitest@3.2.4(@types/node@24.0.6))':
dependencies: dependencies:
'@typescript-eslint/utils': 8.25.0(eslint@9.30.0)(typescript@5.8.3) '@typescript-eslint/utils': 8.25.0(eslint@9.30.0)(typescript@5.9.3)
eslint: 9.30.0 eslint: 9.30.0
optionalDependencies: optionalDependencies:
typescript: 5.8.3 typescript: 5.9.3
vitest: 3.2.4(@types/node@24.0.6) vitest: 3.2.4(@types/node@24.0.6)
'@vitest/expect@3.2.4': '@vitest/expect@3.2.4':
@@ -3472,27 +3482,27 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-module-utils@2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.0): eslint-module-utils@2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.0):
dependencies: dependencies:
debug: 3.2.7 debug: 3.2.7
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 8.19.0(eslint@9.30.0)(typescript@5.8.3) '@typescript-eslint/parser': 8.19.0(eslint@9.30.0)(typescript@5.9.3)
eslint: 9.30.0 eslint: 9.30.0
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-plugin-deprecation@3.0.0(eslint@9.30.0)(typescript@5.8.3): eslint-plugin-deprecation@3.0.0(eslint@9.30.0)(typescript@5.9.3):
dependencies: dependencies:
'@typescript-eslint/utils': 7.18.0(eslint@9.30.0)(typescript@5.8.3) '@typescript-eslint/utils': 7.18.0(eslint@9.30.0)(typescript@5.9.3)
eslint: 9.30.0 eslint: 9.30.0
ts-api-utils: 1.4.3(typescript@5.8.3) ts-api-utils: 1.4.3(typescript@5.9.3)
tslib: 2.8.1 tslib: 2.8.1
typescript: 5.8.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0): eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.9.3))(eslint@9.30.0):
dependencies: dependencies:
'@rtsao/scc': 1.1.0 '@rtsao/scc': 1.1.0
array-includes: 3.1.8 array-includes: 3.1.8
@@ -3503,7 +3513,7 @@ snapshots:
doctrine: 2.1.0 doctrine: 2.1.0
eslint: 9.30.0 eslint: 9.30.0
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.0) eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.0)
hasown: 2.0.2 hasown: 2.0.2
is-core-module: 2.16.1 is-core-module: 2.16.1
is-glob: 4.0.3 is-glob: 4.0.3
@@ -3515,7 +3525,7 @@ snapshots:
string.prototype.trimend: 1.0.9 string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0 tsconfig-paths: 3.15.0
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 8.19.0(eslint@9.30.0)(typescript@5.8.3) '@typescript-eslint/parser': 8.19.0(eslint@9.30.0)(typescript@5.9.3)
transitivePeerDependencies: transitivePeerDependencies:
- eslint-import-resolver-typescript - eslint-import-resolver-typescript
- eslint-import-resolver-webpack - eslint-import-resolver-webpack
@@ -4634,13 +4644,13 @@ snapshots:
dependencies: dependencies:
is-number: 7.0.0 is-number: 7.0.0
ts-api-utils@1.4.3(typescript@5.8.3): ts-api-utils@1.4.3(typescript@5.9.3):
dependencies: dependencies:
typescript: 5.8.3 typescript: 5.9.3
ts-api-utils@2.0.1(typescript@5.8.3): ts-api-utils@2.0.1(typescript@5.9.3):
dependencies: dependencies:
typescript: 5.8.3 typescript: 5.9.3
ts-mixer@6.0.4: {} ts-mixer@6.0.4: {}
@@ -4696,7 +4706,7 @@ snapshots:
possible-typed-array-names: 1.1.0 possible-typed-array-names: 1.1.0
reflect.getprototypeof: 1.0.10 reflect.getprototypeof: 1.0.10
typescript@5.8.3: {} typescript@5.9.3: {}
unbox-primitive@1.1.0: unbox-primitive@1.1.0:
dependencies: dependencies:
+21
View File
@@ -0,0 +1,21 @@
# Security
# Do not execute any scripts of installed packages (project scripts still run)
ignoreDepScripts: true
# Do not automatically run pre/post scripts (e.g. preinstall, postbuild)
enablePrePostScripts: false
# Only allow packages published at least 10 days ago (reduces risk of compromised packages)
minimumReleaseAge: 14400
# Fail if a package's trust level has decreased compared to previous releases
trustPolicy: no-downgrade
# Ignore trust policy for packages published more than 1 year ago (predates provenance signing)
trustPolicyIgnoreAfter: 525960
# Fail if there are missing or invalid peer dependencies
strictPeerDependencies: true
# Prevent transitive dependencies from using exotic sources (git repos, direct tarball URLs)
blockExoticSubdeps: true
# Lockfile
# Allow the lockfile to be updated during install (set to true in CI for stricter reproducibility)
preferFrozenLockfile: false
+18 -103
View File
@@ -4,112 +4,27 @@
* @author Naomi Carrigan * @author Naomi Carrigan
*/ */
/** interface Channel {
* The channels to post standup reminders in.
*/
export const channels: Array<{
channelId: string; channelId: string;
roleId: string; roleId: string;
name: string; name: string;
}> = [ }
const nhcarriganMentorshipChannels: Array<Channel> = [
{ {
channelId: "1382093555228606484", channelId: "1400630073010163792",
name: "red-script", name: "accountability",
roleId: "1382091453987029144", roleId: "1400588705273745550",
},
{
channelId: "1382093583963656223",
name: "orange-bytes",
roleId: "1382091462707122186",
},
{
channelId: "1382093618017337574",
name: "yellow-packet",
roleId: "1382091466767208538",
},
{
channelId: "1382093654885138439",
name: "green-loop",
roleId: "1382091470877491364",
},
{
channelId: "1382093684925005935",
name: "blue-stack",
roleId: "1382091474560356393",
},
{
channelId: "1382093724200210522",
name: "purple-array",
roleId: "1382091477710012456",
},
{
channelId: "1382093753489162330",
name: "pink-protocol",
roleId: "1382091502255341568",
},
{
channelId: "1382093785973915820",
name: "cyan-branch",
roleId: "1382091520533856337",
},
{
channelId: "1382093811693387867",
name: "teal-cache",
roleId: "1382091525873336400",
},
{
channelId: "1382093843918225520",
name: "mint-syntax",
roleId: "1382091530428219603",
},
{
channelId: "1382093883722174605",
name: "lime-variable",
roleId: "1382091534538641458",
},
{
channelId: "1382093910259798046",
name: "rose-token",
roleId: "1382091538900979762",
},
{
channelId: "1382093973488799886",
name: "lavender-query",
roleId: "1382091542961066014",
},
{
channelId: "1382094002526097489",
name: "indigo-class",
roleId: "1382091547742568559",
},
{
channelId: "1382094051360116837",
name: "golden-index",
roleId: "1382091551982882936",
},
{
channelId: "1382094088739754096",
name: "silver-promise",
roleId: "1382091556613394443",
},
{
channelId: "1382094114467745912",
name: "bronze-thread",
roleId: "1382091560367292536",
},
{
channelId: "1382094146206044181",
name: "maroon-socket",
roleId: "1382091564498681907",
},
{
channelId: "1382094200211771522",
name: "violet-function",
roleId: "1382091568252719205",
},
{
channelId: "1382094311264616670",
name: "grey-database",
roleId: "1382091572602212622",
}, },
]; ];
const freeCodeCampHackathonChannels: Array<Channel> = [];
const dallasSoftwareDevelopersCohortChannels: Array<Channel> = [];
/**
* The channels to post standup reminders in.
*/
export const channels: Array<Channel> = [
...freeCodeCampHackathonChannels,
...dallasSoftwareDevelopersCohortChannels,
...nhcarriganMentorshipChannels,
];
+13 -1
View File
@@ -38,7 +38,8 @@ client.on(Events.ClientReady, () => {
}); });
}); });
client.on(Events.MessageCreate, (message) => { // eslint-disable-next-line @typescript-eslint/no-misused-promises -- sod off this is going away next month.
client.on(Events.MessageCreate, async(message) => {
if (!message.channel.isThread() || !message.inGuild()) { if (!message.channel.isThread() || !message.inGuild()) {
return; return;
} }
@@ -54,8 +55,19 @@ client.on(Events.MessageCreate, (message) => {
if (message.author.bot) { if (message.author.bot) {
return; return;
} }
const threadOwner = await message.channel.fetchOwner();
// Check if thread owner is Maribelle (to indicate it is progress thread)
if (threadOwner?.id !== "1386862413936328796") {
return;
}
if (!activeIds.includes(message.author.id)) { if (!activeIds.includes(message.author.id)) {
activeIds.push(message.author.id); activeIds.push(message.author.id);
await message.channel.send({
allowedMentions: {
parse: [],
},
content: `-# Thank you for your progress update, <@${message.author.id}>! Your participation for today has been recorded.`,
});
} }
}); });
+6 -4
View File
@@ -66,17 +66,19 @@ export const standup = async(
await Promise.all( await Promise.all(
filtered.map(async(channel) => { filtered.map(async(channel) => {
const sent = await channel. const sent = await channel.
send( send({ allowedMentions: {
parse: [ "roles" ],
},
content:
`Good morning <@&${ `Good morning <@&${
channels.find((c) => { channels.find((c) => {
return c.channelId === channel.id; return c.channelId === channel.id;
})?.roleId ?? "692816967895220344" })?.roleId ?? channel.guildId
}> It is time for your daily progress update. Please share the following in this thread: }> It is time for your daily progress update. Please share the following in this thread:
1️⃣ What did you accomplish yesterday? 1️⃣ What did you accomplish yesterday?
2️⃣ What are you working on today? 2️⃣ What are you working on today?
3️⃣ Are there any blockers or issues you need help with?`, 3️⃣ Are there any blockers or issues you need help with?` }).
).
catch(() => { catch(() => {
void logger.log( void logger.log(
"warn", "warn",