feat: add linting
Node.js CI / CI (push) Failing after 3s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 47s

This commit is contained in:
2025-12-22 17:05:51 -08:00
parent f5dbe93168
commit 059c24be31
9 changed files with 368 additions and 191 deletions
+5 -26
View File
@@ -16,32 +16,11 @@ jobs:
- name: Checkout Source Files - name: Checkout Source Files
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Use Node.js v24 - name: Install yamllint
uses: actions/setup-node@v4 run: sudo apt-get install yamllint
with:
node-version: 24
- name: Setup pnpm - name: Run Linter
uses: pnpm/action-setup@v2 run: make lint
with:
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
run: pnpm install
- name: Lint Source Files
run: pnpm run lint
- name: Verify Build
run: pnpm run build
- name: Run Tests - name: Run Tests
run: pnpm run test run: make test
+69
View File
@@ -0,0 +1,69 @@
yaml-files:
- '*.yaml'
- '*.yml'
- '.yamllint'
rules:
anchors:
forbid-undeclared-aliases: true
forbid-duplicated-anchors: true
forbid-unused-anchors: true
braces:
forbid: true
brackets:
forbid: true
colons:
max-spaces-before: 0
max-spaces-after: 1
commas:
max-spaces-before: 0
min-spaces-after: 1
max-spaces-after: 1
comments:
require-starting-space: true
ignore-shebangs: true
min-spaces-from-content: 2
comments-indentation: enable
document-end:
present: false
document-start:
present: false
empty-lines:
max: 2
max-start: 0
max-end: 0
empty-values:
forbid-in-block-mappings: true
forbid-in-flow-mappings: true
forbid-in-block-sequences: true
rules:
float-values:
forbid-inf: true
forbid-nan: true
forbid-scientific-notation: true
require-numeral-before-decimal: true
hyphens:
max-spaces-after: 1
indentation:
spaces: 2
indent-sequences: true
check-multi-line-strings: true
key-duplicates: enable
key-ordering: enable
line-length: disable
new-line-at-end-of-file: enable
new-lines:
type: unix
octal-values:
forbid-implicit-octal: true
forbid-explicit-octal: false
quoted-strings:
quote-type: double
required: true
extra-required: []
extra-allowed: []
allow-quoted-quotes: false
trailing-spaces: enable
truthy:
allowed-values: ['true', 'false']
check-keys: true
+5 -1
View File
@@ -1,4 +1,4 @@
.PHONY: help push pull test .PHONY: help push pull test lint
# Colors for pretty output # Colors for pretty output
CYAN := \033[0;36m CYAN := \033[0;36m
@@ -22,6 +22,7 @@ help: ## Show this help message
@echo " $(YELLOW)$(BOLD)make push$(NC) $(CYAN)$(NC) Push the local match directory to the remote Espanso config" @echo " $(YELLOW)$(BOLD)make push$(NC) $(CYAN)$(NC) Push the local match directory to the remote Espanso config"
@echo " $(YELLOW)$(BOLD)make pull$(NC) $(CYAN)$(NC) Pull the remote match directory to the local Espanso config" @echo " $(YELLOW)$(BOLD)make pull$(NC) $(CYAN)$(NC) Pull the remote match directory to the local Espanso config"
@echo " $(YELLOW)$(BOLD)make test$(NC) $(CYAN)$(NC) Test the Espanso config for duplicate triggers and replace values" @echo " $(YELLOW)$(BOLD)make test$(NC) $(CYAN)$(NC) Test the Espanso config for duplicate triggers and replace values"
@echo " $(YELLOW)$(BOLD)make lint$(NC) $(CYAN)$(NC) Lint YAML files in the match directory"
@echo "" @echo ""
@echo "$(CYAN)$(BOLD)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━$(NC)" @echo "$(CYAN)$(BOLD)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━$(NC)"
@echo "" @echo ""
@@ -34,3 +35,6 @@ pull: ## Pull the remote match directory to the local Espanso config
test: ## Test the Espanso config for duplicate triggers and replace values test: ## Test the Espanso config for duplicate triggers and replace values
./test.sh ./test.sh
lint: ## Lint YAML files in the match directory
./lint.sh
Executable
+125
View File
@@ -0,0 +1,125 @@
#!/bin/bash
# Color definitions
RESET='\033[0m'
BOLD='\033[1m'
RED='\033[91m'
GREEN='\033[92m'
YELLOW='\033[93m'
BLUE='\033[94m'
MAGENTA='\033[95m'
CYAN='\033[96m'
# Directory containing YAML files
MATCH_DIR="match"
# Check if directory exists
if [ ! -d "$MATCH_DIR" ]; then
echo -e "${RED}${BOLD}Error:${RESET} ${RED}Directory '$MATCH_DIR' not found!${RESET}"
exit 1
fi
# Find all YAML files
YAML_FILES=$(find "$MATCH_DIR" -name "*.yml" -o -name "*.yaml" | sort)
if [ -z "$YAML_FILES" ]; then
echo -e "${YELLOW}${BOLD}Warning:${RESET} ${YELLOW}No YAML files found in $MATCH_DIR directory!${RESET}"
exit 0
fi
# Function to check if yamllint is available
check_yamllint() {
if command -v yamllint &> /dev/null; then
echo "yamllint"
return 0
fi
if command -v pipx &> /dev/null && pipx list | grep -q yamllint; then
echo "pipx run yamllint"
return 0
fi
if python3 -m yamllint --version &> /dev/null 2>&1; then
echo "python3 -m yamllint"
return 0
fi
return 1
}
# Function to use Python's yaml module for basic validation
validate_with_python() {
local file="$1"
python3 << EOF
import yaml
import sys
try:
with open("$file", 'r') as f:
yaml.safe_load(f)
sys.exit(0)
except yaml.YAMLError as e:
print(f"$file: {e}", file=sys.stderr)
sys.exit(1)
except Exception as e:
print(f"$file: Error reading file - {e}", file=sys.stderr)
sys.exit(1)
EOF
}
# Try to find yamllint
YAMLLINT_CMD=$(check_yamllint)
if [ -n "$YAMLLINT_CMD" ]; then
echo -e "${CYAN}${BOLD}Using yamllint for YAML linting...${RESET}"
echo ""
# Run yamllint on all files
ERRORS=0
for file in $YAML_FILES; do
echo -e "${BLUE}Linting:${RESET} ${BOLD}$(basename "$file")${RESET}"
if ! $YAMLLINT_CMD "$file"; then
ERRORS=$((ERRORS + 1))
fi
done
if [ $ERRORS -eq 0 ]; then
echo ""
echo -e "${GREEN}${BOLD}✓ Success:${RESET} ${GREEN}All YAML files passed linting!${RESET}"
exit 0
else
echo ""
echo -e "${RED}${BOLD}✗ Error:${RESET} ${RED}Found linting errors in $ERRORS file(s)${RESET}"
exit 1
fi
else
echo -e "${YELLOW}${BOLD}Warning:${RESET} ${YELLOW}yamllint not found. Falling back to basic YAML syntax validation...${RESET}"
echo ""
echo -e "${CYAN}${BOLD}Tip:${RESET} ${CYAN}Install yamllint for better linting:${RESET}"
echo -e " ${BLUE}${RESET} ${MAGENTA}pipx install yamllint${RESET} (recommended - avoids system package conflicts)"
echo -e " ${BLUE}${RESET} ${MAGENTA}pip install --user yamllint${RESET}"
echo ""
# Fall back to Python yaml validation
ERRORS=0
for file in $YAML_FILES; do
echo -e "${BLUE}Validating:${RESET} ${BOLD}$(basename "$file")${RESET}"
if ! validate_with_python "$file" 2>&1; then
ERRORS=$((ERRORS + 1))
else
echo -e " ${GREEN}${RESET} Valid YAML syntax"
fi
done
if [ $ERRORS -eq 0 ]; then
echo ""
echo -e "${GREEN}${BOLD}✓ Success:${RESET} ${GREEN}All YAML files have valid syntax!${RESET}"
echo -e "${YELLOW}${BOLD}Note:${RESET} ${YELLOW}Install yamllint for style and best-practice checks${RESET}"
exit 0
else
echo ""
echo -e "${RED}${BOLD}✗ Error:${RESET} ${RED}Found syntax errors in $ERRORS file(s)${RESET}"
exit 1
fi
fi
+12 -12
View File
@@ -1,13 +1,13 @@
matches: matches:
- trigger: "d.promo" - replace: "Please do not self-promote. This includes advertising your social media, projects, blogs, and anything else where you are gaining benefits from leveraging our community to drive traffic to your site."
replace: "Please do not self-promote. This includes advertising your social media, projects, blogs, and anything else where you are gaining benefits from leveraging our community to drive traffic to your site." trigger: "d.promo"
- trigger: "d.modping" - replace: "Please do not ping the entire moderation team for non-urgent situations."
replace: "Please do not ping the entire moderation team for non-urgent situations." trigger: "d.modping"
- trigger: "d.everyone" - replace: "Please do not try to mention everyone in the server. We have users all around the world, across many timezones. Trying to mention all of them to address your query is self-centred and rude."
replace: "Please do not try to mention everyone in the server. We have users all around the world, across many timezones. Trying to mention all of them to address your query is self-centred and rude." trigger: "d.everyone"
- trigger: "d.dm" - replace: "Hello there! Before continuing this conversation, please note that direct messages are billed at $25 per incoming message as indicated in our communication policy: https://docs.nhcarrigan.com/about/contact/#8-direct-messages. Continuing to contact us through this channel will trigger your first invoice. If you prefer a free method of communication, join our public server: https://chat.nhcarrigan.com"
replace: "Hello there! Before continuing this conversation, please note that direct messages are billed at $25 per incoming message as indicated in our communication policy: https://docs.nhcarrigan.com/about/contact/#8-direct-messages. Continuing to contact us through this channel will trigger your first invoice. If you prefer a free method of communication, join our public server: https://chat.nhcarrigan.com" trigger: "d.dm"
- trigger: "d.invoice" - replace: "Thank you for confirming these charges. Here is your invoice, including all previously sent messages and an additional buffer of 5 messages:"
replace: "Thank you for confirming these charges. Here is your invoice, including all previously sent messages and an additional buffer of 5 messages:" trigger: "d.invoice"
- trigger: "d.block" - replace: "Valued consumer, we appreciate your business. However, due to outstanding invoice charges for our DM services, your access has been suspended until payment is made in full. You may still reach us via our chat server: https://chat.nhcarrigan.com"
replace: "Valued consumer, we appreciate your business. However, due to outstanding invoice charges for our DM services, your access has been suspended until payment is made in full. You may still reach us via our chat server: https://chat.nhcarrigan.com" trigger: "d.block"
+10 -10
View File
@@ -1,11 +1,11 @@
matches: matches:
- trigger: "docs.contribute" - replace: "https://docs.nhcarrigan.com/dev/contributing/"
replace: "https://docs.nhcarrigan.com/dev/contributing/" trigger: "docs.contribute"
- trigger: "docs.coc" - replace: "https://docs.nhcarrigan.com/community/coc/"
replace: "https://docs.nhcarrigan.com/community/coc/" trigger: "docs.coc"
- trigger: "docs.terms" - replace: "https://docs.nhcarrigan.com/legal/terms/"
replace: "https://docs.nhcarrigan.com/legal/terms/" trigger: "docs.terms"
- trigger: "docs.privacy" - replace: "https://docs.nhcarrigan.com/legal/privacy/"
replace: "https://docs.nhcarrigan.com/legal/privacy/" trigger: "docs.privacy"
- trigger: "docs.community" - replace: "https://docs.nhcarrigan.com/community/guide/"
replace: "https://docs.nhcarrigan.com/community/guide/" trigger: "docs.community"
+104 -104
View File
@@ -1,105 +1,105 @@
matches: matches:
- trigger: "gif.waltz" - replace: "https://c.tenor.com/kO5ruOuFkiYAAAAC/tenor.gif"
replace: "https://c.tenor.com/kO5ruOuFkiYAAAAC/tenor.gif" trigger: "gif.waltz"
- trigger: "gif.kiss" - replace: "https://c.tenor.com/hdFfH-A8UwoAAAAd/tenor.gif"
replace: "https://c.tenor.com/hdFfH-A8UwoAAAAd/tenor.gif" trigger: "gif.kiss"
- trigger: "gif.jinx" - replace: "https://c.tenor.com/rgPmLy-LrrgAAAAC/tenor.gif"
replace: "https://c.tenor.com/rgPmLy-LrrgAAAAC/tenor.gif" trigger: "gif.jinx"
- trigger: "gif.fabulous" - replace: "https://c.tenor.com/jKIq-XwBErgAAAAC/tenor.gif"
replace: "https://c.tenor.com/jKIq-XwBErgAAAAC/tenor.gif" trigger: "gif.fabulous"
- trigger: "gif.wake" - replace: "https://c.tenor.com/feKcxglGTmEAAAAd/tenor.gif"
replace: "https://c.tenor.com/feKcxglGTmEAAAAd/tenor.gif" trigger: "gif.wake"
- trigger: "gif.fix" - replace: "https://c.tenor.com/rbmuthchA8cAAAAC/tenor.gif"
replace: "https://c.tenor.com/rbmuthchA8cAAAAC/tenor.gif" trigger: "gif.fix"
- trigger: "gif.comfort" - replace: "https://c.tenor.com/Hgt-mT0KXN0AAAAd/tenor.gif"
replace: "https://c.tenor.com/Hgt-mT0KXN0AAAAd/tenor.gif" trigger: "gif.comfort"
- trigger: "gif.error" - replace: "https://c.tenor.com/9p1NW-ml_rYAAAAC/tenor.gif"
replace: "https://c.tenor.com/9p1NW-ml_rYAAAAC/tenor.gif" trigger: "gif.error"
- trigger: "gif.tired" - replace: "https://c.tenor.com/EAKYKQFu4BAAAAAC/tenor.gif"
replace: "https://c.tenor.com/EAKYKQFu4BAAAAAC/tenor.gif" trigger: "gif.tired"
- trigger: "gif.bored" - replace: "https://c.tenor.com/GX7e2p31RlQAAAAC/tenor.gif"
replace: "https://c.tenor.com/GX7e2p31RlQAAAAC/tenor.gif" trigger: "gif.bored"
- trigger: "gif.praise" - replace: "https://c.tenor.com/4-yCmKYkVgoAAAAC/tenor.gif"
replace: "https://c.tenor.com/4-yCmKYkVgoAAAAC/tenor.gif" trigger: "gif.praise"
- trigger: "gif.wait" - replace: "https://c.tenor.com/gEpKdawu7moAAAAd/tenor.gif"
replace: "https://c.tenor.com/gEpKdawu7moAAAAd/tenor.gif" trigger: "gif.wait"
- trigger: "gif.reverse" - replace: "https://c.tenor.com/0d_aB3xxWroAAAAd/tenor.gif"
replace: "https://c.tenor.com/0d_aB3xxWroAAAAd/tenor.gif" trigger: "gif.reverse"
- trigger: "gif.annoyed" - replace: "https://c.tenor.com/MvKZZ7JCkUMAAAAC/tenor.gif"
replace: "https://c.tenor.com/MvKZZ7JCkUMAAAAC/tenor.gif" trigger: "gif.annoyed"
- trigger: "gif.sword" - replace: "https://c.tenor.com/EWhFGCTfmucAAAAC/tenor.gif"
replace: "https://c.tenor.com/EWhFGCTfmucAAAAC/tenor.gif" trigger: "gif.sword"
- trigger: "gif.blush" - replace: "https://c.tenor.com/CEkiOjpsylwAAAAd/tenor.gif"
replace: "https://c.tenor.com/CEkiOjpsylwAAAAd/tenor.gif" trigger: "gif.blush"
- trigger: "gif.smart" - replace: "https://c.tenor.com/hPsNhgYicFMAAAAC/tenor.gif"
replace: "https://c.tenor.com/hPsNhgYicFMAAAAC/tenor.gif" trigger: "gif.smart"
- trigger: "gif.ignore" - replace: "https://c.tenor.com/AlUkiGkR2j8AAAAC/tenor.gif"
replace: "https://c.tenor.com/AlUkiGkR2j8AAAAC/tenor.gif" trigger: "gif.ignore"
- trigger: "gif.shh" - replace: "https://c.tenor.com/P32p3dPsEgkAAAAC/tenor.gif"
replace: "https://c.tenor.com/P32p3dPsEgkAAAAC/tenor.gif" trigger: "gif.shh"
- trigger: "gif.giggle" - replace: "https://c.tenor.com/3_Yh8BaRLAIAAAAC/tenor.gif"
replace: "https://c.tenor.com/3_Yh8BaRLAIAAAAC/tenor.gif" trigger: "gif.giggle"
- trigger: "gif.wave" - replace: "https://c.tenor.com/FvthnLepGgAAAAAC/tenor.gif"
replace: "https://c.tenor.com/FvthnLepGgAAAAAC/tenor.gif" trigger: "gif.wave"
- trigger: "gif.salute" - replace: "https://c.tenor.com/NahzVADyncsAAAAd/tenor.gif"
replace: "https://c.tenor.com/NahzVADyncsAAAAd/tenor.gif" trigger: "gif.salute"
- trigger: "gif.thank" - replace: "https://c.tenor.com/oEFpzFipXvcAAAAd/tenor.gif"
replace: "https://c.tenor.com/oEFpzFipXvcAAAAd/tenor.gif" trigger: "gif.thank"
- trigger: "gif.peek" - replace: "https://c.tenor.com/X7tqC1BVu4sAAAAC/tenor.gif"
replace: "https://c.tenor.com/X7tqC1BVu4sAAAAC/tenor.gif" trigger: "gif.peek"
- trigger: "gif.pout" - replace: "https://c.tenor.com/03VCLMyKfL4AAAAC/tenor.gif"
replace: "https://c.tenor.com/03VCLMyKfL4AAAAC/tenor.gif" trigger: "gif.pout"
- trigger: "gif.sing" - replace: "https://c.tenor.com/D4Z50s-YFkoAAAAC/tenor.gif"
replace: "https://c.tenor.com/D4Z50s-YFkoAAAAC/tenor.gif" trigger: "gif.sing"
- trigger: "gif.objection" - replace: "https://c.tenor.com/kHS2x_pJVrwAAAAC/tenor.gif"
replace: "https://c.tenor.com/kHS2x_pJVrwAAAAC/tenor.gif" trigger: "gif.objection"
- trigger: "gif.dance" - replace: "https://c.tenor.com/g9xOFVXmNx0AAAAd/tenor.gif"
replace: "https://c.tenor.com/g9xOFVXmNx0AAAAd/tenor.gif" trigger: "gif.dance"
- trigger: "gif.dancy" - replace: "https://c.tenor.com/m21RwoBHceEAAAAd/tenor.gif"
replace: "https://c.tenor.com/m21RwoBHceEAAAAd/tenor.gif" trigger: "gif.dancy"
- trigger: "gif.cheer" - replace: "https://c.tenor.com/fKjC8KynhWYAAAAC/tenor.gif"
replace: "https://c.tenor.com/fKjC8KynhWYAAAAC/tenor.gif" trigger: "gif.cheer"
- trigger: "gif.hype" - replace: "https://c.tenor.com/_eWYkZnqjwcAAAAC/tenor.gif"
replace: "https://c.tenor.com/_eWYkZnqjwcAAAAC/tenor.gif" trigger: "gif.hype"
- trigger: "gif.noted" - replace: "https://c.tenor.com/tHswBoYy_HIAAAAd/tenor.gif"
replace: "https://c.tenor.com/tHswBoYy_HIAAAAd/tenor.gif" trigger: "gif.noted"
- trigger: "gif.smug" - replace: "https://c.tenor.com/amMMuaTS1bsAAAAC/tenor.gif"
replace: "https://c.tenor.com/amMMuaTS1bsAAAAC/tenor.gif" trigger: "gif.smug"
- trigger: "gif.vibe" - replace: "https://c.tenor.com/_aiabJq9CdoAAAAd/tenor.gif"
replace: "https://c.tenor.com/_aiabJq9CdoAAAAd/tenor.gif" trigger: "gif.vibe"
- trigger: "gif.laugh" - replace: "https://c.tenor.com/jz9aJI4fys4AAAAC/tenor.gif"
replace: "https://c.tenor.com/jz9aJI4fys4AAAAC/tenor.gif" trigger: "gif.laugh"
- trigger: "gif.shrug" - replace: "https://c.tenor.com/0GOwPHgcUj0AAAAC/tenor.gif"
replace: "https://c.tenor.com/0GOwPHgcUj0AAAAC/tenor.gif" trigger: "gif.shrug"
- trigger: "gif.block" - replace: "https://c.tenor.com/Fym_4yzyu0IAAAAC/tenor.gif"
replace: "https://c.tenor.com/Fym_4yzyu0IAAAAC/tenor.gif" trigger: "gif.block"
- trigger: "gif.pray" - replace: "https://c.tenor.com/d8vq5hthkAoAAAAC/tenor.gif"
replace: "https://c.tenor.com/d8vq5hthkAoAAAAC/tenor.gif" trigger: "gif.pray"
- trigger: "gif.psychic" - replace: "https://c.tenor.com/ETmw31CyCmQAAAAd/tenor.gif"
replace: "https://c.tenor.com/ETmw31CyCmQAAAAd/tenor.gif" trigger: "gif.psychic"
- trigger: "gif.wiggle" - replace: "https://c.tenor.com/6bGvizlex6oAAAAd/tenor.gif"
replace: "https://c.tenor.com/6bGvizlex6oAAAAd/tenor.gif" trigger: "gif.wiggle"
- trigger: "gif.lurk" - replace: "https://c.tenor.com/Bh5FPIsK2xEAAAAd/tenor.gif"
replace: "https://c.tenor.com/Bh5FPIsK2xEAAAAd/tenor.gif" trigger: "gif.lurk"
- trigger: "gif.stare" - replace: "https://c.tenor.com/VC3EDnfJmKEAAAAd/tenor.gif"
replace: "https://c.tenor.com/VC3EDnfJmKEAAAAd/tenor.gif" trigger: "gif.stare"
- trigger: "gif.bow" - replace: "https://c.tenor.com/lpxKv7slwfgAAAAd/tenor.gif"
replace: "https://c.tenor.com/lpxKv7slwfgAAAAd/tenor.gif" trigger: "gif.bow"
- trigger: "gif.excited" - replace: "https://c.tenor.com/CtJ_SVFoh4cAAAAd/tenor.gif"
replace: "https://c.tenor.com/CtJ_SVFoh4cAAAAd/tenor.gif" trigger: "gif.excited"
- trigger: "gif.think" - replace: "https://c.tenor.com/keB3oG-he3AAAAAC/tenor.gif"
replace: "https://c.tenor.com/keB3oG-he3AAAAAC/tenor.gif" trigger: "gif.think"
- trigger: "gif.paper" - replace: "https://c.tenor.com/ai682TGdyQAAAAAC/tenor.gif"
replace: "https://c.tenor.com/ai682TGdyQAAAAAC/tenor.gif" trigger: "gif.paper"
- trigger: "gif.thonk" - replace: "https://c.tenor.com/4o4SzmfxiBAAAAAd/tenor.gif"
replace: "https://c.tenor.com/4o4SzmfxiBAAAAAd/tenor.gif" trigger: "gif.thonk"
- trigger: "gif.money" - replace: "https://c.tenor.com/uPAvHo2xmN8AAAAC/tenor.gif"
replace: "https://c.tenor.com/uPAvHo2xmN8AAAAC/tenor.gif" trigger: "gif.money"
- trigger: "gif.nod" - replace: "https://c.tenor.com/fNkIorwhEacAAAAC/tenor.gif"
replace: "https://c.tenor.com/fNkIorwhEacAAAAC/tenor.gif" trigger: "gif.nod"
- trigger: "gif.oops" - replace: "https://c.tenor.com/VWi9_CJrUc8AAAAd/tenor.gif"
replace: "https://c.tenor.com/VWi9_CJrUc8AAAAd/tenor.gif" trigger: "gif.oops"
- trigger: "gif.lewd" - replace: "https://c.tenor.com/aRhrMeBzkd0AAAAd/tenor.gif"
replace: "https://c.tenor.com/aRhrMeBzkd0AAAAd/tenor.gif" trigger: "gif.lewd"
- trigger: "gif.exhausted" - replace: "https://c.tenor.com/lwyR-BEUeD4AAAAd/tenor.gif"
replace: "https://c.tenor.com/lwyR-BEUeD4AAAAd/tenor.gif" trigger: "gif.exhausted"
+6 -6
View File
@@ -1,7 +1,7 @@
matches: matches:
- trigger: "hf.ps" - replace: "Please keep all projects to <#1280522731963547759>."
replace: "Please keep all projects to <#1280522731963547759>." trigger: "hf.ps"
- trigger: "hf.invalid" - replace: "That project has been reported by the community for violating Hacktoberfest's values. Repositories which are designed to facilitate easy pull requests for the sake of 'winning' Hacktoberfest, including arbitrary collections of content like algorithms and code snippets, are ineligible to participate."
replace: "That project has been reported by the community for violating Hacktoberfest's values. Repositories which are designed to facilitate easy pull requests for the sake of 'winning' Hacktoberfest, including arbitrary collections of content like algorithms and code snippets, are ineligible to participate." trigger: "hf.invalid"
- trigger: "hf.spam" - replace: "Maintainers are free to use the `spam` label to indicate that a pull request is low effort and does not follow their contributing guide. If you receive two or more `spam` labels across any of your pull requests, you will be permanently ineligible to participate in Hacktoberfest."
replace: "Maintainers are free to use the `spam` label to indicate that a pull request is low effort and does not follow their contributing guide. If you receive two or more `spam` labels across any of your pull requests, you will be permanently ineligible to participate in Hacktoberfest." trigger: "hf.spam"
+30 -30
View File
@@ -1,31 +1,31 @@
matches: matches:
- trigger: "img.bad" - replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-13-52-26-Render.png"
replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-13-52-26-Render.png" trigger: "img.bad"
- trigger: "img.magic" - replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-14-20-40-Render.png"
replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-14-20-40-Render.png" trigger: "img.magic"
- trigger: "img.dance" - replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-14-24-02-Render.png"
replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-14-24-02-Render.png" trigger: "img.dance"
- trigger: "img.smart" - replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-14-34-17-Render.png"
replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-14-34-17-Render.png" trigger: "img.smart"
- trigger: "img.nom" - replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-14-35-27-Render.png"
replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-14-35-27-Render.png" trigger: "img.nom"
- trigger: "img.fight" - replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-16-29-08-Render.png"
replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-16-29-08-Render.png" trigger: "img.fight"
- trigger: "img.shh" - replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-16-45-58-Render.png"
replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-16-45-58-Render.png" trigger: "img.shh"
- trigger: "img.hug" - replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-15-36-09-Render.png"
replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-15-36-09-Render.png" trigger: "img.hug"
- trigger: "img.point" - replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-16-56-41-Render.png"
replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-16-56-41-Render.png" trigger: "img.point"
- trigger: "img.work" - replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-17-02-27-Render.png"
replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-17-02-27-Render.png" trigger: "img.work"
- trigger: "img.innocent" - replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-16-15-56-Render.png"
replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-16-15-56-Render.png" trigger: "img.innocent"
- trigger: "img.read" - replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-14-55-30-Render.png"
replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-14-55-30-Render.png" trigger: "img.read"
- trigger: "img.peek" - replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-14-23-32-Render.png"
replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-14-23-32-Render.png" trigger: "img.peek"
- trigger: "img.queen" - replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-15-18-49-Render.png"
replace: "https://cdn.nhcarrigan.com/koikatsu/CharaStudio-2025-04-06-15-18-49-Render.png" trigger: "img.queen"
- trigger: "img.stonks" - replace: "https://cdn.nhcarrigan.com/stonks.png"
replace: "https://cdn.nhcarrigan.com/stonks.png" trigger: "img.stonks"