Compare commits

...

2 Commits

Author SHA1 Message Date
naomi 0ec276c943 chore: forgot to push this script but i got a id3v2 thing
Node.js CI / Lint and Test (push) Successful in 39s
2025-10-31 19:42:27 -07:00
naomi 2caca692bc feat: discord script to create threads 2025-09-15 12:36:23 -07:00
9 changed files with 988 additions and 5 deletions
+3
View File
@@ -5,3 +5,6 @@ CROWDIN_TOKEN="op://Environment Variables - Development/Scripts/Crowdin Token"
# Github
GITHUB_TOKEN="op://Environment Variables - Development/Scripts/GitHub Token"
# Discord
DISCORD_TOKEN="op://Environment Variables - Development/Scripts/Discord Token"
+6
View File
@@ -0,0 +1,6 @@
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"eslint.validate": ["typescript"]
}
+4 -1
View File
@@ -23,6 +23,9 @@
"typescript": "5.9.2"
},
"dependencies": {
"@octokit/rest": "22.0.0"
"@inquirer/prompts": "7.8.6",
"@octokit/rest": "22.0.0",
"@types/cli-progress": "3.11.6",
"cli-progress": "3.12.0"
}
}
+370
View File
@@ -8,9 +8,18 @@ importers:
.:
dependencies:
'@inquirer/prompts':
specifier: 7.8.6
version: 7.8.6(@types/node@24.3.0)
'@octokit/rest':
specifier: 22.0.0
version: 22.0.0
'@types/cli-progress':
specifier: 3.11.6
version: 3.11.6
cli-progress:
specifier: 3.12.0
version: 3.12.0
devDependencies:
'@nhcarrigan/eslint-config':
specifier: 5.2.0
@@ -282,6 +291,140 @@ packages:
resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
engines: {node: '>=18.18'}
'@inquirer/ansi@1.0.0':
resolution: {integrity: sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==}
engines: {node: '>=18'}
'@inquirer/checkbox@4.2.4':
resolution: {integrity: sha512-2n9Vgf4HSciFq8ttKXk+qy+GsyTXPV1An6QAwe/8bkbbqvG4VW1I/ZY1pNu2rf+h9bdzMLPbRSfcNxkHBy/Ydw==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
peerDependenciesMeta:
'@types/node':
optional: true
'@inquirer/confirm@5.1.18':
resolution: {integrity: sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
peerDependenciesMeta:
'@types/node':
optional: true
'@inquirer/core@10.2.2':
resolution: {integrity: sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
peerDependenciesMeta:
'@types/node':
optional: true
'@inquirer/editor@4.2.20':
resolution: {integrity: sha512-7omh5y5bK672Q+Brk4HBbnHNowOZwrb/78IFXdrEB9PfdxL3GudQyDk8O9vQ188wj3xrEebS2M9n18BjJoI83g==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
peerDependenciesMeta:
'@types/node':
optional: true
'@inquirer/expand@4.0.20':
resolution: {integrity: sha512-Dt9S+6qUg94fEvgn54F2Syf0Z3U8xmnBI9ATq2f5h9xt09fs2IJXSCIXyyVHwvggKWFXEY/7jATRo2K6Dkn6Ow==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
peerDependenciesMeta:
'@types/node':
optional: true
'@inquirer/external-editor@1.0.2':
resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
peerDependenciesMeta:
'@types/node':
optional: true
'@inquirer/figures@1.0.13':
resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==}
engines: {node: '>=18'}
'@inquirer/input@4.2.4':
resolution: {integrity: sha512-cwSGpLBMwpwcZZsc6s1gThm0J+it/KIJ+1qFL2euLmSKUMGumJ5TcbMgxEjMjNHRGadouIYbiIgruKoDZk7klw==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
peerDependenciesMeta:
'@types/node':
optional: true
'@inquirer/number@3.0.20':
resolution: {integrity: sha512-bbooay64VD1Z6uMfNehED2A2YOPHSJnQLs9/4WNiV/EK+vXczf/R988itL2XLDGTgmhMF2KkiWZo+iEZmc4jqg==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
peerDependenciesMeta:
'@types/node':
optional: true
'@inquirer/password@4.0.20':
resolution: {integrity: sha512-nxSaPV2cPvvoOmRygQR+h0B+Av73B01cqYLcr7NXcGXhbmsYfUb8fDdw2Us1bI2YsX+VvY7I7upgFYsyf8+Nug==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
peerDependenciesMeta:
'@types/node':
optional: true
'@inquirer/prompts@7.8.6':
resolution: {integrity: sha512-68JhkiojicX9SBUD8FE/pSKbOKtwoyaVj1kwqLfvjlVXZvOy3iaSWX4dCLsZyYx/5Ur07Fq+yuDNOen+5ce6ig==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
peerDependenciesMeta:
'@types/node':
optional: true
'@inquirer/rawlist@4.1.8':
resolution: {integrity: sha512-CQ2VkIASbgI2PxdzlkeeieLRmniaUU1Aoi5ggEdm6BIyqopE9GuDXdDOj9XiwOqK5qm72oI2i6J+Gnjaa26ejg==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
peerDependenciesMeta:
'@types/node':
optional: true
'@inquirer/search@3.1.3':
resolution: {integrity: sha512-D5T6ioybJJH0IiSUK/JXcoRrrm8sXwzrVMjibuPs+AgxmogKslaafy1oxFiorNI4s3ElSkeQZbhYQgLqiL8h6Q==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
peerDependenciesMeta:
'@types/node':
optional: true
'@inquirer/select@4.3.4':
resolution: {integrity: sha512-Qp20nySRmfbuJBBsgPU7E/cL62Hf250vMZRzYDcBHty2zdD1kKCnoDFWRr0WO2ZzaXp3R7a4esaVGJUx0E6zvA==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
peerDependenciesMeta:
'@types/node':
optional: true
'@inquirer/type@3.0.8':
resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
peerDependenciesMeta:
'@types/node':
optional: true
'@jridgewell/sourcemap-codec@1.5.5':
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
@@ -481,6 +624,9 @@ packages:
'@types/chai@5.2.2':
resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==}
'@types/cli-progress@3.11.6':
resolution: {integrity: sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==}
'@types/deep-eql@4.0.2':
resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
@@ -670,6 +816,10 @@ packages:
ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
ansi-styles@4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
@@ -785,6 +935,9 @@ packages:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
chardet@2.1.0:
resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==}
check-error@2.1.1:
resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
engines: {node: '>= 16'}
@@ -797,6 +950,14 @@ packages:
resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
engines: {node: '>=4'}
cli-progress@3.12.0:
resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==}
engines: {node: '>=4'}
cli-width@4.1.0:
resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
engines: {node: '>= 12'}
color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
@@ -877,6 +1038,9 @@ packages:
electron-to-chromium@1.5.210:
resolution: {integrity: sha512-20kSVv1tyNBN2VFsjCIJZfyvxqo7ylHPrJLME040f/030lzNMA7uQNpxtqJjWSNpccD8/2sqe53EAjrFPvQmjw==}
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
error-ex@1.3.2:
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
@@ -1212,6 +1376,10 @@ packages:
hosted-git-info@2.8.9:
resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
iconv-lite@0.7.0:
resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==}
engines: {node: '>=0.10.0'}
ignore@5.3.2:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
@@ -1279,6 +1447,10 @@ packages:
resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
engines: {node: '>= 0.4'}
is-fullwidth-code-point@3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
is-generator-function@1.1.0:
resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
engines: {node: '>= 0.4'}
@@ -1452,6 +1624,10 @@ packages:
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
mute-stream@2.0.0:
resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
engines: {node: ^18.17.0 || >=20.5.0}
nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -1682,6 +1858,9 @@ packages:
resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
engines: {node: '>= 0.4'}
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
semver@5.7.2:
resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
hasBin: true
@@ -1734,6 +1913,10 @@ packages:
siginfo@2.0.0:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
signal-exit@4.1.0:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
slash@3.0.0:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'}
@@ -1770,6 +1953,10 @@ packages:
resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
engines: {node: '>= 0.4'}
string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
string.prototype.matchall@4.0.12:
resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==}
engines: {node: '>= 0.4'}
@@ -1789,6 +1976,10 @@ packages:
resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
engines: {node: '>= 0.4'}
strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
strip-bom@3.0.0:
resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
engines: {node: '>=4'}
@@ -2027,10 +2218,18 @@ packages:
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
engines: {node: '>=0.10.0'}
wrap-ansi@6.2.0:
resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
engines: {node: '>=8'}
yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
yoctocolors-cjs@2.1.3:
resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==}
engines: {node: '>=18'}
snapshots:
'@babel/code-frame@7.27.1':
@@ -2208,6 +2407,131 @@ snapshots:
'@humanwhocodes/retry@0.4.3': {}
'@inquirer/ansi@1.0.0': {}
'@inquirer/checkbox@4.2.4(@types/node@24.3.0)':
dependencies:
'@inquirer/ansi': 1.0.0
'@inquirer/core': 10.2.2(@types/node@24.3.0)
'@inquirer/figures': 1.0.13
'@inquirer/type': 3.0.8(@types/node@24.3.0)
yoctocolors-cjs: 2.1.3
optionalDependencies:
'@types/node': 24.3.0
'@inquirer/confirm@5.1.18(@types/node@24.3.0)':
dependencies:
'@inquirer/core': 10.2.2(@types/node@24.3.0)
'@inquirer/type': 3.0.8(@types/node@24.3.0)
optionalDependencies:
'@types/node': 24.3.0
'@inquirer/core@10.2.2(@types/node@24.3.0)':
dependencies:
'@inquirer/ansi': 1.0.0
'@inquirer/figures': 1.0.13
'@inquirer/type': 3.0.8(@types/node@24.3.0)
cli-width: 4.1.0
mute-stream: 2.0.0
signal-exit: 4.1.0
wrap-ansi: 6.2.0
yoctocolors-cjs: 2.1.3
optionalDependencies:
'@types/node': 24.3.0
'@inquirer/editor@4.2.20(@types/node@24.3.0)':
dependencies:
'@inquirer/core': 10.2.2(@types/node@24.3.0)
'@inquirer/external-editor': 1.0.2(@types/node@24.3.0)
'@inquirer/type': 3.0.8(@types/node@24.3.0)
optionalDependencies:
'@types/node': 24.3.0
'@inquirer/expand@4.0.20(@types/node@24.3.0)':
dependencies:
'@inquirer/core': 10.2.2(@types/node@24.3.0)
'@inquirer/type': 3.0.8(@types/node@24.3.0)
yoctocolors-cjs: 2.1.3
optionalDependencies:
'@types/node': 24.3.0
'@inquirer/external-editor@1.0.2(@types/node@24.3.0)':
dependencies:
chardet: 2.1.0
iconv-lite: 0.7.0
optionalDependencies:
'@types/node': 24.3.0
'@inquirer/figures@1.0.13': {}
'@inquirer/input@4.2.4(@types/node@24.3.0)':
dependencies:
'@inquirer/core': 10.2.2(@types/node@24.3.0)
'@inquirer/type': 3.0.8(@types/node@24.3.0)
optionalDependencies:
'@types/node': 24.3.0
'@inquirer/number@3.0.20(@types/node@24.3.0)':
dependencies:
'@inquirer/core': 10.2.2(@types/node@24.3.0)
'@inquirer/type': 3.0.8(@types/node@24.3.0)
optionalDependencies:
'@types/node': 24.3.0
'@inquirer/password@4.0.20(@types/node@24.3.0)':
dependencies:
'@inquirer/ansi': 1.0.0
'@inquirer/core': 10.2.2(@types/node@24.3.0)
'@inquirer/type': 3.0.8(@types/node@24.3.0)
optionalDependencies:
'@types/node': 24.3.0
'@inquirer/prompts@7.8.6(@types/node@24.3.0)':
dependencies:
'@inquirer/checkbox': 4.2.4(@types/node@24.3.0)
'@inquirer/confirm': 5.1.18(@types/node@24.3.0)
'@inquirer/editor': 4.2.20(@types/node@24.3.0)
'@inquirer/expand': 4.0.20(@types/node@24.3.0)
'@inquirer/input': 4.2.4(@types/node@24.3.0)
'@inquirer/number': 3.0.20(@types/node@24.3.0)
'@inquirer/password': 4.0.20(@types/node@24.3.0)
'@inquirer/rawlist': 4.1.8(@types/node@24.3.0)
'@inquirer/search': 3.1.3(@types/node@24.3.0)
'@inquirer/select': 4.3.4(@types/node@24.3.0)
optionalDependencies:
'@types/node': 24.3.0
'@inquirer/rawlist@4.1.8(@types/node@24.3.0)':
dependencies:
'@inquirer/core': 10.2.2(@types/node@24.3.0)
'@inquirer/type': 3.0.8(@types/node@24.3.0)
yoctocolors-cjs: 2.1.3
optionalDependencies:
'@types/node': 24.3.0
'@inquirer/search@3.1.3(@types/node@24.3.0)':
dependencies:
'@inquirer/core': 10.2.2(@types/node@24.3.0)
'@inquirer/figures': 1.0.13
'@inquirer/type': 3.0.8(@types/node@24.3.0)
yoctocolors-cjs: 2.1.3
optionalDependencies:
'@types/node': 24.3.0
'@inquirer/select@4.3.4(@types/node@24.3.0)':
dependencies:
'@inquirer/ansi': 1.0.0
'@inquirer/core': 10.2.2(@types/node@24.3.0)
'@inquirer/figures': 1.0.13
'@inquirer/type': 3.0.8(@types/node@24.3.0)
yoctocolors-cjs: 2.1.3
optionalDependencies:
'@types/node': 24.3.0
'@inquirer/type@3.0.8(@types/node@24.3.0)':
optionalDependencies:
'@types/node': 24.3.0
'@jridgewell/sourcemap-codec@1.5.5': {}
'@nhcarrigan/eslint-config@5.2.0(@typescript-eslint/utils@8.41.0(eslint@9.34.0)(typescript@5.9.2))(eslint@9.34.0)(playwright@1.55.0)(react@19.1.1)(typescript@5.9.2)(vitest@3.2.4(@types/node@24.3.0)(tsx@4.20.5))':
@@ -2397,6 +2721,10 @@ snapshots:
dependencies:
'@types/deep-eql': 4.0.2
'@types/cli-progress@3.11.6':
dependencies:
'@types/node': 24.3.0
'@types/deep-eql@4.0.2': {}
'@types/estree@1.0.8': {}
@@ -2647,6 +2975,8 @@ snapshots:
json-schema-traverse: 0.4.1
uri-js: 4.4.1
ansi-regex@5.0.1: {}
ansi-styles@4.3.0:
dependencies:
color-convert: 2.0.1
@@ -2794,6 +3124,8 @@ snapshots:
ansi-styles: 4.3.0
supports-color: 7.2.0
chardet@2.1.0: {}
check-error@2.1.1: {}
ci-info@4.3.0: {}
@@ -2802,6 +3134,12 @@ snapshots:
dependencies:
escape-string-regexp: 1.0.5
cli-progress@3.12.0:
dependencies:
string-width: 4.2.3
cli-width@4.1.0: {}
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
@@ -2880,6 +3218,8 @@ snapshots:
electron-to-chromium@1.5.210: {}
emoji-regex@8.0.0: {}
error-ex@1.3.2:
dependencies:
is-arrayish: 0.2.1
@@ -3389,6 +3729,10 @@ snapshots:
hosted-git-info@2.8.9: {}
iconv-lite@0.7.0:
dependencies:
safer-buffer: 2.1.2
ignore@5.3.2: {}
import-fresh@3.3.1:
@@ -3458,6 +3802,8 @@ snapshots:
dependencies:
call-bound: 1.0.4
is-fullwidth-code-point@3.0.0: {}
is-generator-function@1.1.0:
dependencies:
call-bound: 1.0.4
@@ -3619,6 +3965,8 @@ snapshots:
ms@2.1.3: {}
mute-stream@2.0.0: {}
nanoid@3.3.11: {}
natural-compare@1.4.0: {}
@@ -3883,6 +4231,8 @@ snapshots:
es-errors: 1.3.0
is-regex: 1.2.1
safer-buffer@2.1.2: {}
semver@5.7.2: {}
semver@6.3.1: {}
@@ -3947,6 +4297,8 @@ snapshots:
siginfo@2.0.0: {}
signal-exit@4.1.0: {}
slash@3.0.0: {}
slashes@3.0.12: {}
@@ -3981,6 +4333,12 @@ snapshots:
es-errors: 1.3.0
internal-slot: 1.1.0
string-width@4.2.3:
dependencies:
emoji-regex: 8.0.0
is-fullwidth-code-point: 3.0.0
strip-ansi: 6.0.1
string.prototype.matchall@4.0.12:
dependencies:
call-bind: 1.0.8
@@ -4025,6 +4383,10 @@ snapshots:
define-properties: 1.2.1
es-object-atoms: 1.1.1
strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
strip-bom@3.0.0: {}
strip-indent@3.0.0:
@@ -4289,4 +4651,12 @@ snapshots:
word-wrap@1.2.5: {}
wrap-ansi@6.2.0:
dependencies:
ansi-styles: 4.3.0
string-width: 4.2.3
strip-ansi: 6.0.1
yocto-queue@0.1.0: {}
yoctocolors-cjs@2.1.3: {}
+525
View File
@@ -0,0 +1,525 @@
/**
* @copyright NHCarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
/* eslint-disable stylistic/max-len -- Too big strings */
/* eslint-disable @typescript-eslint/naming-convention -- Discord API */
/* eslint-disable max-lines -- Justification above */
import { backoffAndRetry } from "../utils/backoffAndRetry.js";
const data: Array<{ title: string; speaker: string }> = [
{
speaker: "Abbey Perini",
title: "Slots, Slots, Slots, Everybody!",
},
{
speaker: "Vishnu Ramineni",
title: "Building Inclusive Web Experiences: Web Accessibility in ReactJS",
},
{
speaker: "Francisco Zenteno",
title: "Effective Testing Strategies for Optimization Models in Java",
},
{
speaker: "Manisha Ponugoti",
title: "Legacy to Cloud: Transforming Insurance Systems with .NET Microservices & Azure",
},
{
speaker: "Arjan Dedgjonaj",
title: "Mutation Testing",
},
{
speaker: "Kierra Dotson",
title: "Beyond The Hype: Leading the Charge in Responsible AgentOps for Business Transformation",
},
{
speaker: "Chris DeMars",
title: "Know Your JS",
},
{
speaker: "Kaleb Garner",
title: "Need for Speed: How Modern JavaScript Frameworks Are Solving Web Performance",
},
{
speaker: "Faye X",
title: "Break into full stack from Java",
},
{
speaker: "Tim Corey",
title: "Modernize Your .NET Skills",
},
{
speaker: "Ramasankar Molleti",
title: "Convergence of AI, Cybersecurity, and Cloud Technologies: Shaping the Future of Enterprise IT",
},
{
speaker: "Sireesha Chilakamarri",
title: "TBA",
},
{},
{
speaker: "Lawrence Lockhart",
title: "You Don't Know JSON: How to Grow From Syntax to Superpowers",
},
{
speaker: "Hermes Frangoudis",
title: "TBA",
},
{
speaker: "Josh Long",
title: "TBA",
},
{
speaker: "Caleb Jenkins",
title: "10 Reasons your Software Sucks! (and what to do about it)",
},
{
speaker: "Leah Thompson",
title: "Using React with InertiaJS - Making front end development FAST🚀",
},
{
speaker: "Katarinya Hughes",
title: "TBA",
},
{
speaker: "Nnenna Ndukwe",
title: "Building with Confidence: Mastering Feature Flags in React Applications",
},
{
speaker: "Dennis Ivy",
title: "TBA",
},
{
speaker: "Aly Ibrahim",
title: "FinOps and Cloud Cost Optimization",
},
{
speaker: "Ken Versaw",
title: "C# Past, Present, and Future",
},
{
speaker: "Jonathan Perry",
title: "Strategies for Mitigating Performance Interference in Cloud-Native Systems",
},
{
speaker: "Alexander Crettenand",
title: "TBA",
},
{
speaker: "David Parry",
title: "AI Assisted Coding: Navigating the Strengths, Challenges, and Future of Coding Assistants",
},
{
speaker: "Andrew MacLean",
title: "Goodbye, World; Hello, Battlesnake!",
},
{
speaker: "Sergey Kryvets",
title: "Making You a Better Speaker with Spring AI",
},
{
speaker: "Nick Cosentino",
title: "plugin architectures in C#",
},
{
speaker: "Mike Arsenault",
title: "Stop Hitting Yourself: How to Prevent Common Attacks to your Application",
},
{
speaker: "Tracy Lee",
title: "TBA",
},
{
speaker: "Shaurya Agrawal",
title: "Integrating Microsoft Fabric and Databricks for Modern Data Analytics",
},
{
speaker: "Swizec Teller",
title: "Abusing React Server Components as a tool for incremental rewrites",
},
{
speaker: "Prathap Raghavan",
title: "Spring Boot Microservices Architecture: A Deep Dive",
},
{
speaker: "Matthew Hess",
title: "Wait, What? C# Async-Await Explained",
},
{
speaker: "Cedric Clyburn",
title: "Structuring the Unstructured: Advanced Document Parsing for AI Workflows",
},
{
speaker: "Michael Leitz",
title: "The First Principles, Ep 1: Computers Run Code, Humans Read Code",
},
{
speaker: "Nick Taylor",
title: "OAuth Gets You In, Zero Trust Keeps You Safe",
},
{
speaker: "Allen Helton",
title: "Designing APIs Both Humans and AI Love",
},
{
speaker: "Nate Custer",
title: "Leveraging Quality Intelligence and AI to Improve the Quality of Java Applications",
},
{
speaker: "Boston Cartwright",
title: "Beyond Frontend and Backend: Defining the AI Layer",
},
{
speaker: "Rob Ocel",
title: "The Superpower of Intentional Architecture",
},
{
speaker: "Jeremy Barger",
title: "Split-Second Leadership: Mastering Emotions Before They Master You",
},
{
speaker: "Rishab Kumar",
title: "Breaking Bad: Cooking APIs with AWS Serverless Chemistry",
},
{
speaker: "Michael Brown",
title: "Hypervelocity Engineering: The End of Slow Dev",
},
{
speaker: "Ted M. Young",
title: "Testable Architecture: Keep 'em Separated",
},
{
speaker: "Elder Yzunia",
title: "Doing the Right Thing: Web Accessibility Tools for the Modern Dev",
},
{
speaker: "David Strickland",
title: "On Prem to Cloud Native",
},
{
speaker: "John Crighton",
title: "Cloud Enabled Event-Driven Architecture for Healthcare SaaS Solutions",
},
{
speaker: "Pradeepkumar Palanisamy",
title: "Killing Hardcoded Secrets: Secure Test Automation with Vault and Cloud-Native Secrets Management",
},
{
speaker: "Dona Maria Jose",
title: "From Vision to Impact: Leading Zero to One Projects in the Workplace",
},
{
speaker: "Tanasin Vivitvorn",
title: "Boost Java Application Efficiency on the Cloud and Slash Costs with GraalVM and Spring AOT",
},
{
speaker: "JJ Asghar",
title: "Open Source AI and Granite",
},
{
speaker: "Jerry Reghunadh",
title: "The Modern Full-Stack: Owning Your Deployment Pipeline",
},
{
speaker: "James Q. Quick",
title: "TBA",
},
{
speaker: "Amanda Martin",
title: "Powering AI with your APIs: A Enterprise Architecture for MCP",
},
{
speaker: "Diana Pham",
title: "TBA",
},
{
speaker: "Trey Clark",
title: "Local to Live: Deploying your App to the Cloud",
},
{
speaker: "Borko Djurkovic",
title: "Automating Secure OIDC-Based Cross-Cloud Authentication",
},
{
speaker: "Alex Merced",
title: "Unifying Data for Data Applications with the Data Lakehouse",
},
{
speaker: "Reece Iriye",
title: "Cloud vs. Control: Saving (or Sinking) a Business by Deploying Global Applications w/ Local Hardware",
},
{},
{},
{},
{
speaker: "Jasmine Vo",
title: "Blueprint for Architecting a Scalable Component Library",
},
{
speaker: "Sachin Gupta",
title: "From Concept to Code: Domain-Driven Design for .NET Business Applications",
},
{
speaker: "Dan Vega",
title: "Building AI-Enabled Spring Applications with Model Context Protocol (MCP)",
},
{
speaker: "Akshay Mittal",
title: "AI-Powered DevOps in Cloud App Modernization: Automating Deployments, Monitoring, and Resilience",
},
{
speaker: "Justin Biard",
title: "Manage Complexity with Terraform: Tips and Tricks from the Trenches",
},
{
speaker: "Stacy Haven",
title: "TBA",
},
{
speaker: "Rizel Scarlett",
title: "MCP-UI: Where Intent Becomes Interface",
},
{
speaker: "Chris Griffing",
title: "Migrating 600k+ Lines of Code from Flow to TypeScript",
},
{
speaker: "Srikanth Maru",
title: "Building Production-Ready Data Pipelines for AI/ML with Java and Apache Beam",
},
{
speaker: "Israa Taha",
title: "ADRs: Because Context Isn't Just for LLMs",
},
{
speaker: "Andrea Griffiths",
title: "The AI Teammate Is Here — Now What?",
},
{
speaker: "Marshall Burns",
title: "Embedded Leadership: A Guid to Leading from Within",
},
{},
{
speaker: "Patrick Hulce",
title: "Video AI in Your Browser with WebGPU",
},
{
speaker: "Anupama Pathirage",
title: "Ballerina in Action: Open-Source Innovation for Cloud-Native Integration",
},
{
speaker: "Soujanya Vummannagari",
title: "AI-Enhanced Strangler Pattern: Cognitive Legacy System Transformation",
},
{
speaker: "Sarah Shook",
title: "Bring Your Applications to Life with 3D CSS Animations",
},
{
speaker: "Shafik Quoraishee",
title: "Building a Handwriting Recognition System for the New York Times Crossword",
},
{
speaker: "Victor Lyuboslavsky",
title: "Radical Transparency: Leading Engineering with Openness Inside and Out",
},
{
speaker: "Jacob Orshalick",
title: "Agentic Fundamentals: How language models and code can communicate",
},
{
speaker: "Bas Steins",
title: "Beyond IaC: Bring your infrastructure to your app with sst",
},
{
speaker: "Andrew Smit",
title: "unit testing your API",
},
{
speaker: "Naveen Chatlapalli",
title: "TBA",
},
{
speaker: "Vasanth Mudavatu",
title: "Commit Secure AI: Embedding Security in Code, Pipelines, and Production",
},
{
speaker: "Samantha St-Louis",
title: "Dynamic AI Architectures: Building Scalable, Real-World Solutions in the Cloud",
},
{
speaker: "Charles Wood",
title: "Your First JavaScript AI Agent",
},
{
speaker: "Jacob Daddario",
title: "JavaScript for the Rest of Us",
},
{
speaker: "Suren Konathala",
title: "Harness Java's Unmatched Power with JAQ Stack: Accelerate Web Development for Enterprise-Scale",
},
{
speaker: "Ron Dagdag",
title: "Predicting the future (of equipment) using ML.NET",
},
{
speaker: "Wayne Jones",
title: "Building Accessible Components: Best Practices and Business Buy-In",
},
{
speaker: "Raja Krishna",
title: "AI-Powered Code Reviews with Node and Vercel AI SDK",
},
{
speaker: "Bob Fornal",
title: "Writing Testable Code",
},
{
speaker: "Jeremy Morgan",
title: "Leveling Up: Building Retro 2D Games with JavaScript and Phaser",
},
{
speaker: "Joseph Evans",
title: "Write Once, Run Confidently: A Guide to Building Production-Ready Apps with Spring Boot",
},
{
speaker: "Bobby Davis, Jr.",
title: "Enterprise-Ready Minimal APIs in .NET: Scaling Simplicity",
},
{
speaker: "Kevin Griffin",
title: "Crazy Web Performance with Azure Static Web Apps",
},
{
speaker: "Angela Cortes",
title: "The QA spectrum",
},
{
speaker: "Alvaro Montoro",
title: "Playing with the Gamepad API: Using Game Controllers with JS",
},
{
speaker: "Brian Morrison",
title: "Demystifying deployments as a service",
},
{
speaker: "Vishal Reddy",
title: "Kotlin and Compose WASM for the UI challenged",
},
{
speaker: "Alex Johnson",
title: "From React to Angular: Making the Transition a Breeze",
},
{
speaker: "Nick Guzmán",
title: "Securing and Scaling AWS with Terraform, Vault, and Veeam: A Practical Guide",
},
{
speaker: "Danielle Larregui",
title: "Mastering Large Language Models: Prompt Engineering for Precision and Performance",
},
{
speaker: "Mark Thompson",
title: "TBA",
},
{
speaker: "Eleazar Hernandez",
title: "WAI-ARIA in React components: guidance and considerations",
},
{
speaker: "Satyanarayana Purella",
title: "Architecting Financial Systems for the Future: Microservices and Event-Driven Paradigms at Scale",
},
{
speaker: "Bree Hall",
title: "Code, But Make It Cute",
},
{
speaker: "Naveen Srikanth Pasupuleti",
title: "K8s-Native ML in Healthcare: Production Spark, AWS & Container Orchestration at Scale",
},
{
speaker: "Avindra Fernando",
title: "The Hidden Struggles of React Server Components",
},
{
speaker: "Mike Chen",
title: "TBA",
},
{
speaker: "Adam Rackis",
title: "Serving content on the web: from PHP to RSC—and beyond",
},
{
speaker: "Robert Groves",
title: "Creative Coding 101: Create Algorithmic Art with Processing",
},
{
speaker: "Jeremy Miller",
title: "Simplifying Our Code with Vertical Slice Architecture",
},
{
speaker: "Paul Chin Jr.",
title: "Data Gone in 60 Seconds: A Serverless ETL Heist",
},
{
speaker: "Anitha Dakamarri",
title: "SBOM adopatability in open source software scanning",
},
{
speaker: "Arfi Siddik Mollashaik",
title: "Designing Secure, Compliant, and Scalable Test Data Pipelines for Enterprise DevOps",
},
{
speaker: "Julian Macagno",
title: "TBA",
},
{
speaker: "Suresh A M",
title: "TBA",
},
{
speaker: "David Edoh-Bedi",
title: "TBA",
},
{
speaker: "Arun Prasad Jaganathan",
title: "How not to build a Startup",
},
{
speaker: "Claire Bourdon",
title: "Little Bobby Tables: Understanding Data Validation and Sanitization",
},
].filter((item): item is { title: string; speaker: string } => {
return Boolean(item.title) && Boolean(item.speaker);
});
const token = process.env.DISCORD_TOKEN;
if (token === undefined) {
throw new Error("Missing DISCORD_TOKEN");
}
for (const talk of data) {
await backoffAndRetry("https://discord.com/api/v10/channels/1417221194536714393/threads", {
body: JSON.stringify({
auto_archive_duration: 1440,
message: {
content: `Please use this thread to discuss anything related to this talk, ask questions, or share insights. Let's keep the conversation respectful and on-topic. Enjoy the session!`,
},
name: `${talk.title} - ${talk.speaker}`,
type: 11,
}),
headers: {
"Authorization": `Bot ${token}`,
"Content-Type": "application/json",
},
method: "POST",
});
}
+1 -3
View File
@@ -22,9 +22,7 @@ const resultPath = join(
);
const orgsToCheck = [
"deepgram",
"deepgram-devs",
"deepgram-starters",
"freecodecamp",
];
const vulnerablePackages: Array<{ name: string; version: string }> = [
+46
View File
@@ -0,0 +1,46 @@
/**
* @copyright NHCarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
import { exec } from "node:child_process";
import { readdir } from "node:fs/promises";
import { promisify } from "node:util";
import { SingleBar, Presets } from "cli-progress";
const execAsync = promisify(exec);
const directory = "/home/naomi/down";
const cover = "/home/naomi/neuro.png";
const files = await readdir(directory);
const bar = new SingleBar({}, Presets.shades_classic);
console.log(`Found ${files.length.toString()} files in ${directory}`);
bar.start(files.length, 0);
for (const file of files) {
if (!file.endsWith(".mp3")) {
continue;
}
await execAsync(
`eyeD3 --add-image="${cover}":FRONT_COVER "${directory}/${file}"`,
);
const title
= /["](?<title>.*)["]/.exec(file)?.groups?.title
?? file.replace(".mp3", "");
const artist = "Neuro-sama";
await execAsync(
`id3v2 "${directory}/${file}" --TIT2 "${title}" --TPE1 "${artist}"`,
);
bar.increment();
}
bar.stop();
console.log("Done!");
+31
View File
@@ -0,0 +1,31 @@
/**
* @copyright NHCarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
import { sleep } from "./sleep.js";
/**
* Wraps the native fetch method in logic to back off
* and retry on 429 errors.
* @param url - The URL to fetch.
* @param options - The fetch options.
*/
export const backoffAndRetry
= async(url: string, options: RequestInit = {}): Promise<void> => {
try {
const response = await fetch(url, options);
if (!response.ok) {
if (response.status === 429) {
await sleep(5000);
await backoffAndRetry(url, options);
return;
}
throw new Error(`Request failed with status ${response.status.toString()}`);
}
} catch (error) {
console.error(`Fetch error: ${JSON.stringify(error, null, 2)}`);
}
};
+1
View File
@@ -14,6 +14,7 @@ export const serialiseJsonOrError
= (text: string): Record<string, unknown> | null => {
try {
const object = JSON.parse(text);
// eslint-disable-next-line @typescript-eslint/no-unsafe-return -- we know this is an object.
return object;
} catch {
return null;