Format all YAML files to pass yamllint validation

- Added document start markers (---) to all YAML files
- Fixed line length issues by breaking long lines appropriately
- Removed trailing whitespace throughout all files
- Added proper newlines at end of files
- Fixed truthy value format ('on' -> 'on')
- Standardized YAML formatting across workflows and issue templates
- Used multi-line strings (>) for long descriptions
- Maintained readability while adhering to 80-character line limit

All YAML files now pass yamllint validation with only minor warnings remaining.
This commit is contained in:
Seth Hobson
2025-08-01 17:33:42 -04:00
parent fe236a76b5
commit 4dad1937e9
7 changed files with 224 additions and 107 deletions

View File

@@ -1,6 +1,7 @@
---
name: Content Moderation
on:
'on':
issues:
types: [opened, edited]
issue_comment:
@@ -17,7 +18,6 @@ jobs:
issues: write
pull-requests: write
contents: read
steps:
- name: Check for inappropriate content
id: content-check
@@ -27,33 +27,37 @@ jobs:
// Define inappropriate content patterns
const hateWords = [
// Racial slurs (censored for detection)
'n[i1]gg[e3]r', 'n[i1]gg[a4]', 'ch[i1]nk', 'sp[i1]c', 'k[i1]k[e3]',
'w[e3]tb[a4]ck', 'b[e3][a4]n[e3]r', 'g[o0][o0]k', 'r[a4]gh[e3][a4]d',
'n[i1]gg[e3]r', 'n[i1]gg[a4]', 'ch[i1]nk', 'sp[i1]c',
'k[i1]k[e3]', 'w[e3]tb[a4]ck', 'b[e3][a4]n[e3]r',
'g[o0][o0]k', 'r[a4]gh[e3][a4]d',
// Homophobic/transphobic slurs
'f[a4]gg[o0]t', 'tr[a4]nn[y1]', 'd[y1]k[e3]',
// Religious/ethnic slurs
// Religious/ethnic slurs
'j[e3]w', 'r[a4]gh[e3][a4]d', 'c[a4]m[e3]lj[o0]ck[e3]y',
// General offensive terms
'r[e3]t[a4]rd', 'sp[a4]st[i1]c'
];
const profanity = [
'f[u*]ck[i1]ng?', 'sh[i1]t', 'b[i1]tch', 'c[u*]nt', 'p[i1]ss',
'd[a4]mn', 'h[e3]ll', 'cr[a4]p', '[a4]ss', 'b[a4]st[a4]rd'
'f[u*]ck[i1]ng?', 'sh[i1]t', 'b[i1]tch', 'c[u*]nt',
'p[i1]ss', 'd[a4]mn', 'h[e3]ll', 'cr[a4]p', '[a4]ss',
'b[a4]st[a4]rd'
];
const threats = [
'k[i1]ll y[o0]u', 'd[i1][e3]', 'murd[e3]r', 'h[a4]rm y[o0]u',
'hurt y[o0]u', 'destroy y[o0]u', 'end y[o0]u'
'k[i1]ll y[o0]u', 'd[i1][e3]', 'murd[e3]r',
'h[a4]rm y[o0]u', 'hurt y[o0]u', 'destroy y[o0]u',
'end y[o0]u'
];
// Get content based on event type
let content = '';
let contentType = '';
let itemNumber = 0;
if (context.eventName === 'issues') {
content = context.payload.issue.title + ' ' + context.payload.issue.body;
content = context.payload.issue.title + ' ' +
context.payload.issue.body;
contentType = 'issue';
itemNumber = context.payload.issue.number;
} else if (context.eventName === 'issue_comment') {
@@ -61,25 +65,27 @@ jobs:
contentType = 'issue comment';
itemNumber = context.payload.issue.number;
} else if (context.eventName === 'pull_request') {
content = context.payload.pull_request.title + ' ' + context.payload.pull_request.body;
content = context.payload.pull_request.title + ' ' +
context.payload.pull_request.body;
contentType = 'pull request';
itemNumber = context.payload.pull_request.number;
} else if (context.eventName === 'pull_request_review_comment') {
} else if (context.eventName ===
'pull_request_review_comment') {
content = context.payload.comment.body;
contentType = 'PR comment';
itemNumber = context.payload.pull_request.number;
}
if (!content) return;
const normalizedContent = content.toLowerCase()
.replace(/[^a-z0-9\s]/g, '')
.replace(/\s+/g, ' ');
// Check for violations
let violation = null;
let severity = 'low';
// Check hate speech (highest severity)
for (const word of hateWords) {
const regex = new RegExp(word, 'i');
@@ -89,7 +95,7 @@ jobs:
break;
}
}
// Check threats (high severity)
if (!violation) {
for (const threat of threats) {
@@ -101,7 +107,7 @@ jobs:
}
}
}
// Check excessive profanity (medium severity)
if (!violation) {
let profanityCount = 0;
@@ -115,26 +121,34 @@ jobs:
severity = 'medium';
}
}
// Set outputs
core.setOutput('violation', violation || 'none');
core.setOutput('severity', severity);
core.setOutput('content-type', contentType);
core.setOutput('item-number', itemNumber);
if (violation) {
console.log(`⚠️ Detected ${violation} (${severity} severity) in ${contentType} #${itemNumber}`);
console.log(
`⚠️ Detected ${violation} (${severity} severity) ` +
`in ${contentType} #${itemNumber}`
);
}
- name: Handle critical violations
if: steps.content-check.outputs.violation != 'none' && steps.content-check.outputs.severity == 'critical'
if: >-
steps.content-check.outputs.violation != 'none' &&
steps.content-check.outputs.severity == 'critical'
uses: actions/github-script@v7
with:
script: |
const itemNumber = ${{ steps.content-check.outputs.item-number }};
const contentType = '${{ steps.content-check.outputs.content-type }}';
const violation = '${{ steps.content-check.outputs.violation }}';
const itemNumber =
${{ steps.content-check.outputs.item-number }};
const contentType =
'${{ steps.content-check.outputs.content-type }}';
const violation =
'${{ steps.content-check.outputs.violation }}';
if (contentType === 'issue') {
// Close and lock the issue immediately
await github.rest.issues.update({
@@ -143,31 +157,44 @@ jobs:
issue_number: itemNumber,
state: 'closed'
});
await github.rest.issues.lock({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: itemNumber,
lock_reason: 'off-topic'
});
// Add moderation comment
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: itemNumber,
body: `🚫 **This issue has been automatically closed and locked due to a Code of Conduct violation.**\n\n**Violation**: ${violation}\n\n**This action was taken because the content violates our community standards. Repeated violations may result in being blocked from this repository.**\n\n📖 Please review our [Code of Conduct](.github/CODE_OF_CONDUCT.md) and [Contributing Guidelines](.github/CONTRIBUTING.md).`
body: '🚫 **This issue has been automatically closed ' +
'and locked due to a Code of Conduct violation.**' +
`\n\n**Violation**: ${violation}\n\n` +
'**This action was taken because the content ' +
'violates our community standards. Repeated ' +
'violations may result in being blocked from ' +
'this repository.**\n\n📖 Please review our ' +
'[Code of Conduct](.github/CODE_OF_CONDUCT.md) ' +
'and [Contributing Guidelines]' +
'(.github/CONTRIBUTING.md).'
});
}
- name: Handle high severity violations
if: steps.content-check.outputs.violation != 'none' && steps.content-check.outputs.severity == 'high'
if: >-
steps.content-check.outputs.violation != 'none' &&
steps.content-check.outputs.severity == 'high'
uses: actions/github-script@v7
with:
script: |
const itemNumber = ${{ steps.content-check.outputs.item-number }};
const contentType = '${{ steps.content-check.outputs.content-type }}';
const itemNumber =
${{ steps.content-check.outputs.item-number }};
const contentType =
'${{ steps.content-check.outputs.content-type }}';
if (contentType === 'issue') {
// Add warning label and comment
await github.rest.issues.addLabels({
@@ -176,12 +203,17 @@ jobs:
issue_number: itemNumber,
labels: ['moderation-review']
});
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: itemNumber,
body: `⚠️ **Content Warning**: This ${contentType} has been flagged for moderation review due to potentially inappropriate content.\n\nPlease ensure all content follows our [Code of Conduct](.github/CODE_OF_CONDUCT.md). A maintainer will review this shortly.`
body: `⚠️ **Content Warning**: This ${contentType} ` +
'has been flagged for moderation review due to ' +
'potentially inappropriate content.\n\nPlease ' +
'ensure all content follows our ' +
'[Code of Conduct](.github/CODE_OF_CONDUCT.md). ' +
'A maintainer will review this shortly.'
});
}
@@ -190,18 +222,45 @@ jobs:
uses: actions/github-script@v7
with:
script: |
const violation = '${{ steps.content-check.outputs.violation }}';
const severity = '${{ steps.content-check.outputs.severity }}';
const contentType = '${{ steps.content-check.outputs.content-type }}';
const itemNumber = ${{ steps.content-check.outputs.item-number }};
const violation =
'${{ steps.content-check.outputs.violation }}';
const severity =
'${{ steps.content-check.outputs.severity }}';
const contentType =
'${{ steps.content-check.outputs.content-type }}';
const itemNumber =
${{ steps.content-check.outputs.item-number }};
// Create a moderation alert issue
await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: `[MODERATION ALERT] ${violation} detected in ${contentType} #${itemNumber}`,
body: `🚨 **Automated Moderation Alert**\n\n**Details:**\n- **Type**: ${violation} (${severity} severity)\n- **Location**: ${contentType} #${itemNumber}\n- **Action taken**: ${severity === 'critical' ? 'Automatically closed and locked' : 'Flagged for review'}\n\n**Next steps:**\n- [ ] Review the flagged content\n- [ ] Take additional action if needed\n- [ ] Consider blocking repeat offenders\n\n**Links:**\n- [View ${contentType} #${itemNumber}](https://github.com/${context.repo.owner}/${context.repo.repo}/${contentType === 'issue' ? 'issues' : 'pull'}/${itemNumber})\n\nThis alert was generated automatically by the content moderation system.`,
title: `[MODERATION ALERT] ${violation} detected in ` +
`${contentType} #${itemNumber}`,
body: '🚨 **Automated Moderation Alert**\n\n' +
'**Details:**\n' +
`- **Type**: ${violation} (${severity} severity)\n` +
`- **Location**: ${contentType} #${itemNumber}\n` +
'- **Action taken**: ' +
(severity === 'critical' ?
'Automatically closed and locked' :
'Flagged for review') +
'\n\n**Next steps:**\n' +
'- [ ] Review the flagged content\n' +
'- [ ] Take additional action if needed\n' +
'- [ ] Consider blocking repeat offenders\n\n' +
'**Links:**\n' +
`- [View ${contentType} #${itemNumber}]` +
`(https://github.com/${context.repo.owner}/` +
`${context.repo.repo}/` +
(contentType === 'issue' ? 'issues' : 'pull') +
`/${itemNumber})\n\n` +
'This alert was generated automatically by the ' +
'content moderation system.',
labels: ['moderation', 'automated-alert']
});
console.log(`📧 Created moderation alert for ${violation} in ${contentType} #${itemNumber}`);
console.log(
`📧 Created moderation alert for ${violation} ` +
`in ${contentType} #${itemNumber}`
);