├── .node-version ├── .gitattributes ├── .prettierignore ├── .devcontainer ├── post-create └── devcontainer.json ├── tsconfig.json ├── .yaml-lint.yml ├── .prettierrc.yml ├── CODEOWNERS ├── tsconfig.eslint.json ├── .markdown-lint.yml ├── .vscode └── launch.json ├── .github ├── workflows │ ├── release-new-action-version.yml │ ├── linter.yml │ ├── licensed.yml │ ├── check-dist.yml │ └── ci.yml ├── dependabot.yml └── prompts │ └── example-custom.prompt.yml ├── SUPPORT.md ├── tsconfig.base.json ├── rollup.config.ts ├── src ├── github.ts ├── content-extractor.ts ├── index.ts └── prompt.ts ├── .licenses └── npm │ ├── once.dep.yml │ ├── wrappy.dep.yml │ ├── deprecation.dep.yml │ ├── universal-user-agent.dep.yml │ ├── @actions │ ├── io.dep.yml │ ├── core.dep.yml │ ├── exec.dep.yml │ ├── github.dep.yml │ └── http-client.dep.yml │ ├── estree-walker.dep.yml │ ├── @octokit │ ├── openapi-types-20.0.0.dep.yml │ ├── openapi-types-24.2.0.dep.yml │ ├── types-12.6.0.dep.yml │ ├── types-13.10.0.dep.yml │ ├── plugin-paginate-rest.dep.yml │ ├── plugin-rest-endpoint-methods.dep.yml │ ├── core.dep.yml │ ├── graphql.dep.yml │ ├── request-error.dep.yml │ ├── endpoint.dep.yml │ ├── auth-token.dep.yml │ └── request.dep.yml │ ├── js-yaml.dep.yml │ ├── @fastify │ └── busboy.dep.yml │ ├── zod.dep.yml │ ├── undici.dep.yml │ ├── @types │ ├── estree.dep.yml │ └── js-yaml.dep.yml │ ├── @rollup │ ├── plugin-json.dep.yml │ └── pluginutils.dep.yml │ ├── tunnel.dep.yml │ ├── picomatch.dep.yml │ ├── openai.dep.yml │ ├── before-after-hook.dep.yml │ ├── argparse.dep.yml │ └── rollup.dep.yml ├── badges └── coverage.svg ├── LICENSE ├── .licensed.yml ├── jest.config.js ├── SECURITY.md ├── action.yml ├── .env.example ├── .gitignore ├── __tests__ ├── github.test.ts ├── index.test.ts └── content-extractor.test.ts ├── package.json ├── eslint.config.mjs ├── prompts ├── link-spam-detection.prompt.yml ├── spam-detection.prompt.yml └── ai-detection.prompt.yml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── script └── release └── README.md /.node-version: -------------------------------------------------------------------------------- 1 | 20.9.0 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | dist/** -diff linguist-generated=true 4 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .licenses/ 3 | dist/ 4 | node_modules/ 5 | coverage/ 6 | -------------------------------------------------------------------------------- /.devcontainer/post-create: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -euxo pipefail 4 | 5 | # Setup licensed 6 | sudo apt update 7 | sudo apt install -y \ 8 | cmake pkg-config 9 | 10 | gem install licensed 11 | 12 | # NPM install 13 | npm install 14 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "./tsconfig.base.json", 4 | "compilerOptions": { 5 | "module": "NodeNext", 6 | "moduleResolution": "NodeNext", 7 | "outDir": "./dist" 8 | }, 9 | "exclude": ["__tests__", "coverage", "dist", "node_modules"], 10 | "include": ["src"] 11 | } 12 | -------------------------------------------------------------------------------- /.yaml-lint.yml: -------------------------------------------------------------------------------- 1 | # See: https://yamllint.readthedocs.io/en/stable/ 2 | 3 | rules: 4 | document-end: disable 5 | document-start: 6 | level: warning 7 | present: false 8 | line-length: 9 | level: warning 10 | max: 80 11 | allow-non-breakable-words: true 12 | allow-non-breakable-inline-mappings: true 13 | ignore: 14 | - .licenses/ 15 | -------------------------------------------------------------------------------- /.prettierrc.yml: -------------------------------------------------------------------------------- 1 | # See: https://prettier.io/docs/en/configuration 2 | 3 | printWidth: 80 4 | tabWidth: 2 5 | useTabs: false 6 | semi: false 7 | singleQuote: true 8 | quoteProps: as-needed 9 | jsxSingleQuote: false 10 | trailingComma: none 11 | bracketSpacing: true 12 | bracketSameLine: true 13 | arrowParens: always 14 | proseWrap: always 15 | htmlWhitespaceSensitivity: css 16 | endOfLine: lf 17 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | ############################################################################ 2 | # Repository CODEOWNERS # 3 | # Order is important! The last matching pattern takes the most precedence. # 4 | ############################################################################ 5 | 6 | # Default owners, unless a later match takes precedence. 7 | * @github/github-models-reviewers 8 | -------------------------------------------------------------------------------- /tsconfig.eslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "./tsconfig.base.json", 4 | "compilerOptions": { 5 | "allowJs": true, 6 | "noEmit": true 7 | }, 8 | "exclude": ["dist", "node_modules"], 9 | "include": [ 10 | "__fixtures__", 11 | "__tests__", 12 | "src", 13 | "eslint.config.mjs", 14 | "jest.config.js", 15 | "rollup.config.ts" 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /.markdown-lint.yml: -------------------------------------------------------------------------------- 1 | # See: https://github.com/DavidAnson/markdownlint 2 | 3 | # Unordered list style 4 | MD004: 5 | style: dash 6 | 7 | # Disable line length for tables 8 | MD013: 9 | tables: false 10 | 11 | # Ordered list item prefix 12 | MD029: 13 | style: one 14 | 15 | # Spaces after list markers 16 | MD030: 17 | ul_single: 1 18 | ol_single: 1 19 | ul_multi: 1 20 | ol_multi: 1 21 | 22 | # Code block style 23 | MD046: 24 | style: fenced 25 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Debug Action", 6 | "type": "node", 7 | "request": "launch", 8 | "runtimeExecutable": "npx", 9 | "cwd": "${workspaceRoot}", 10 | "args": ["@github/local-action", ".", "src/main.ts", ".env"], 11 | "console": "integratedTerminal", 12 | "skipFiles": ["/**", "node_modules/**"] 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /.github/workflows/release-new-action-version.yml: -------------------------------------------------------------------------------- 1 | name: Release new action version 2 | 3 | on: 4 | release: 5 | types: [released] 6 | 7 | env: 8 | TAG_NAME: ${{ github.event.release.tag_name }} 9 | permissions: 10 | contents: write 11 | 12 | jobs: 13 | update_tag: 14 | name: 15 | Update the major tag to include the ${{ github.event.release.tag_name }} 16 | changes 17 | runs-on: ubuntu-latest 18 | steps: 19 | - name: Update the ${{ env.TAG_NAME }} tag 20 | uses: actions/publish-action@v0.2.2 21 | with: 22 | source-tag: ${{ env.TAG_NAME }} 23 | -------------------------------------------------------------------------------- /SUPPORT.md: -------------------------------------------------------------------------------- 1 | # Support 2 | 3 | ## How to file issues and get help 4 | 5 | This project uses GitHub issues to track bugs and feature requests. Please 6 | search the existing issues before filing new issues to avoid duplicates. For new 7 | issues, file your bug or feature request as a new issue. 8 | 9 | For help or questions about using this project, please file an issue. 10 | 11 | This project is under active development and maintained by GitHub staff and the 12 | community. We will do our best to respond to support, feature requests, and 13 | community questions in a timely manner. 14 | 15 | ## GitHub Support Policy 16 | 17 | Support for this project is limited to the resources listed above. 18 | -------------------------------------------------------------------------------- /tsconfig.base.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "compilerOptions": { 4 | "allowSyntheticDefaultImports": true, 5 | "declaration": false, 6 | "declarationMap": false, 7 | "esModuleInterop": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "lib": ["ES2022", "DOM"], 10 | "types": ["node", "jest"], 11 | "module": "NodeNext", 12 | "moduleResolution": "NodeNext", 13 | "newLine": "lf", 14 | "noImplicitAny": true, 15 | "noUnusedLocals": true, 16 | "noUnusedParameters": false, 17 | "pretty": true, 18 | "resolveJsonModule": true, 19 | "strict": true, 20 | "strictNullChecks": true, 21 | "target": "ES2022", 22 | "isolatedModules": true 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: github-actions 4 | directory: / 5 | schedule: 6 | interval: weekly 7 | groups: 8 | actions-minor: 9 | update-types: 10 | - minor 11 | - patch 12 | 13 | - package-ecosystem: npm 14 | directory: / 15 | schedule: 16 | interval: weekly 17 | ignore: 18 | - dependency-name: '@types/node' 19 | update-types: 20 | - 'version-update:semver-major' 21 | groups: 22 | npm-development: 23 | dependency-type: development 24 | update-types: 25 | - minor 26 | - patch 27 | npm-production: 28 | dependency-type: production 29 | update-types: 30 | - patch 31 | -------------------------------------------------------------------------------- /rollup.config.ts: -------------------------------------------------------------------------------- 1 | // See: https://rollupjs.org/introduction/ 2 | import { builtinModules } from 'node:module' 3 | import commonjs from '@rollup/plugin-commonjs' 4 | import nodeResolve from '@rollup/plugin-node-resolve' 5 | import typescript from '@rollup/plugin-typescript' 6 | import json from '@rollup/plugin-json' 7 | 8 | const config = { 9 | input: 'src/index.ts', 10 | output: { 11 | esModule: true, 12 | file: 'dist/index.js', 13 | format: 'es', 14 | sourcemap: true, 15 | inlineDynamicImports: true 16 | }, 17 | external: [...builtinModules, /^node:/], 18 | plugins: [ 19 | typescript(), 20 | nodeResolve({ 21 | preferBuiltins: true, 22 | browser: false, 23 | exportConditions: ['node'] 24 | }), 25 | commonjs({ 26 | include: /node_modules/ 27 | }), 28 | json() 29 | ] 30 | } 31 | 32 | export default config 33 | -------------------------------------------------------------------------------- /src/github.ts: -------------------------------------------------------------------------------- 1 | import * as github from '@actions/github' 2 | 3 | /** 4 | * Add labels to an issue or PR (they share the same issue number). 5 | */ 6 | export async function addLabels( 7 | octokit: ReturnType, 8 | context: typeof github.context, 9 | issueNumber: number, 10 | labels: string[] 11 | ): Promise { 12 | if (labels.length === 0) return 13 | 14 | await octokit.rest.issues.addLabels({ 15 | ...context.repo, 16 | issue_number: issueNumber, 17 | labels 18 | }) 19 | } 20 | 21 | /** 22 | * Hide (minimize) a comment using the GraphQL API. 23 | */ 24 | export async function minimizeComment( 25 | octokit: ReturnType, 26 | nodeId: string 27 | ): Promise { 28 | const query = /* GraphQL */ ` 29 | mutation ($nodeId: ID!) { 30 | minimizeComment(input: { subjectId: $nodeId, classifier: SPAM }) { 31 | minimizedComment { 32 | isMinimized 33 | } 34 | } 35 | } 36 | ` 37 | 38 | await octokit.graphql(query, { nodeId }) 39 | } 40 | -------------------------------------------------------------------------------- /.licenses/npm/once.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: once 3 | version: 1.4.0 4 | type: npm 5 | summary: Run a function exactly one time 6 | homepage: 7 | license: isc 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | The ISC License 12 | 13 | Copyright (c) Isaac Z. Schlueter and Contributors 14 | 15 | Permission to use, copy, modify, and/or distribute this software for any 16 | purpose with or without fee is hereby granted, provided that the above 17 | copyright notice and this permission notice appear in all copies. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 20 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 21 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 22 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 23 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 24 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 25 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 26 | notices: [] 27 | -------------------------------------------------------------------------------- /badges/coverage.svg: -------------------------------------------------------------------------------- 1 | Coverage: 15.21%Coverage15.21% -------------------------------------------------------------------------------- /.licenses/npm/wrappy.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: wrappy 3 | version: 1.0.2 4 | type: npm 5 | summary: Callback wrapping utility 6 | homepage: https://github.com/npm/wrappy 7 | license: isc 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | The ISC License 12 | 13 | Copyright (c) Isaac Z. Schlueter and Contributors 14 | 15 | Permission to use, copy, modify, and/or distribute this software for any 16 | purpose with or without fee is hereby granted, provided that the above 17 | copyright notice and this permission notice appear in all copies. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 20 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 21 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 22 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 23 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 24 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 25 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 26 | notices: [] 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright GitHub, Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.licenses/npm/deprecation.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: deprecation 3 | version: 2.3.1 4 | type: npm 5 | summary: Log a deprecation message with stack 6 | homepage: 7 | license: isc 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | The ISC License 12 | 13 | Copyright (c) Gregor Martynus and contributors 14 | 15 | Permission to use, copy, modify, and/or distribute this software for any 16 | purpose with or without fee is hereby granted, provided that the above 17 | copyright notice and this permission notice appear in all copies. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 20 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 21 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 22 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 23 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 24 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 25 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 26 | - sources: README.md 27 | text: "[ISC](LICENSE)" 28 | notices: [] 29 | -------------------------------------------------------------------------------- /.licenses/npm/universal-user-agent.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: universal-user-agent 3 | version: 6.0.1 4 | type: npm 5 | summary: Get a user agent string in both browser and node 6 | homepage: 7 | license: isc 8 | licenses: 9 | - sources: LICENSE.md 10 | text: | 11 | # [ISC License](https://spdx.org/licenses/ISC) 12 | 13 | Copyright (c) 2018, Gregor Martynus (https://github.com/gr2m) 14 | 15 | Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 | - sources: README.md 19 | text: "[ISC](LICENSE.md)" 20 | notices: [] 21 | -------------------------------------------------------------------------------- /.licensed.yml: -------------------------------------------------------------------------------- 1 | # See: https://github.com/licensee/licensed/blob/main/docs/configuration.md 2 | 3 | sources: 4 | npm: true 5 | 6 | allowed: 7 | - apache-2.0 8 | - bsd-2-clause 9 | - bsd-3-clause 10 | - isc 11 | - mit 12 | - cc0-1.0 13 | - other 14 | 15 | ignored: 16 | npm: 17 | # Used by Rollup.js when building in GitHub Actions 18 | - '@rollup/rollup-linux-x64-gnu' 19 | - '@rollup/rollup-linux-x64-musl' 20 | - '@rollup/rollup-android-arm-eabi' 21 | - '@rollup/rollup-android-arm64' 22 | - '@rollup/rollup-darwin-arm64' 23 | - '@rollup/rollup-darwin-x64' 24 | - '@rollup/rollup-freebsd-arm64' 25 | - '@rollup/rollup-freebsd-x64' 26 | - '@rollup/rollup-linux-arm-gnueabihf' 27 | - '@rollup/rollup-linux-arm-musleabihf' 28 | - '@rollup/rollup-linux-arm64-gnu' 29 | - '@rollup/rollup-linux-arm64-musl' 30 | - '@rollup/rollup-linux-loongarch64-gnu' 31 | - '@rollup/rollup-linux-powerpc64le-gnu' 32 | - '@rollup/rollup-linux-ppc64-gnu' 33 | - '@rollup/rollup-linux-riscv64-gnu' 34 | - '@rollup/rollup-linux-riscv64-musl' 35 | - '@rollup/rollup-linux-s390x-gnu' 36 | - '@rollup/rollup-win32-arm64-msvc' 37 | - '@rollup/rollup-win32-ia32-msvc' 38 | - '@rollup/rollup-win32-x64-msvc' 39 | - 'fsevents' 40 | - 'mime-db' 41 | - 'mime-types' 42 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | // See: https://jestjs.io/docs/configuration 2 | 3 | /** @type {import('ts-jest').JestConfigWithTsJest} **/ 4 | export default { 5 | clearMocks: true, 6 | collectCoverage: true, 7 | collectCoverageFrom: ['./src/**'], 8 | coverageDirectory: './coverage', 9 | coveragePathIgnorePatterns: ['/node_modules/', '/dist/'], 10 | coverageReporters: ['json-summary', 'text', 'lcov'], 11 | // Uncomment the below lines if you would like to enforce a coverage threshold 12 | // for your action. This will fail the build if the coverage is below the 13 | // specified thresholds. 14 | // coverageThreshold: { 15 | // global: { 16 | // branches: 100, 17 | // functions: 100, 18 | // lines: 100, 19 | // statements: 100 20 | // } 21 | // }, 22 | extensionsToTreatAsEsm: ['.ts'], 23 | moduleFileExtensions: ['ts', 'js'], 24 | preset: 'ts-jest', 25 | reporters: ['default'], 26 | resolver: 'ts-jest-resolver', 27 | testEnvironment: 'node', 28 | testMatch: ['**/*.test.ts'], 29 | testPathIgnorePatterns: ['/dist/', '/node_modules/'], 30 | globals: { 31 | 'ts-jest': { 32 | tsconfig: 'tsconfig.eslint.json', 33 | useESM: true, 34 | isolatedModules: true 35 | } 36 | }, 37 | transform: { 38 | '^.+\\.ts$': 'ts-jest' 39 | }, 40 | verbose: true 41 | } 42 | -------------------------------------------------------------------------------- /.licenses/npm/@actions/io.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@actions/io" 3 | version: 1.1.3 4 | type: npm 5 | summary: Actions io lib 6 | homepage: https://github.com/actions/toolkit/tree/main/packages/io 7 | license: mit 8 | licenses: 9 | - sources: LICENSE.md 10 | text: |- 11 | The MIT License (MIT) 12 | 13 | Copyright 2019 GitHub 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 | notices: [] 21 | -------------------------------------------------------------------------------- /.licenses/npm/@actions/core.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@actions/core" 3 | version: 1.11.1 4 | type: npm 5 | summary: Actions core lib 6 | homepage: https://github.com/actions/toolkit/tree/main/packages/core 7 | license: mit 8 | licenses: 9 | - sources: LICENSE.md 10 | text: |- 11 | The MIT License (MIT) 12 | 13 | Copyright 2019 GitHub 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 | notices: [] 21 | -------------------------------------------------------------------------------- /.licenses/npm/@actions/exec.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@actions/exec" 3 | version: 1.1.1 4 | type: npm 5 | summary: Actions exec lib 6 | homepage: https://github.com/actions/toolkit/tree/main/packages/exec 7 | license: mit 8 | licenses: 9 | - sources: LICENSE.md 10 | text: |- 11 | The MIT License (MIT) 12 | 13 | Copyright 2019 GitHub 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 | notices: [] 21 | -------------------------------------------------------------------------------- /.licenses/npm/@actions/github.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@actions/github" 3 | version: 6.0.1 4 | type: npm 5 | summary: Actions github lib 6 | homepage: https://github.com/actions/toolkit/tree/main/packages/github 7 | license: mit 8 | licenses: 9 | - sources: LICENSE.md 10 | text: |- 11 | The MIT License (MIT) 12 | 13 | Copyright 2019 GitHub 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 | notices: [] 21 | -------------------------------------------------------------------------------- /.licenses/npm/estree-walker.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: estree-walker 3 | version: 2.0.2 4 | type: npm 5 | summary: Traverse an ESTree-compliant AST 6 | homepage: 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: |- 11 | Copyright (c) 2015-20 [these people](https://github.com/Rich-Harris/estree-walker/graphs/contributors) 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 18 | - sources: README.md 19 | text: MIT 20 | notices: [] 21 | -------------------------------------------------------------------------------- /.licenses/npm/@octokit/openapi-types-20.0.0.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@octokit/openapi-types" 3 | version: 20.0.0 4 | type: npm 5 | summary: Generated TypeScript definitions based on GitHub's OpenAPI spec for api.github.com 6 | homepage: 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: |- 11 | Copyright 2020 Gregor Martynus 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 18 | - sources: README.md 19 | text: "[MIT](LICENSE)" 20 | notices: [] 21 | -------------------------------------------------------------------------------- /.licenses/npm/@octokit/openapi-types-24.2.0.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@octokit/openapi-types" 3 | version: 24.2.0 4 | type: npm 5 | summary: Generated TypeScript definitions based on GitHub's OpenAPI spec for api.github.com 6 | homepage: 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: |- 11 | Copyright 2020 Gregor Martynus 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 18 | - sources: README.md 19 | text: "[MIT](LICENSE)" 20 | notices: [] 21 | -------------------------------------------------------------------------------- /.licenses/npm/@octokit/types-12.6.0.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@octokit/types" 3 | version: 12.6.0 4 | type: npm 5 | summary: Shared TypeScript definitions for Octokit projects 6 | homepage: 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | MIT License Copyright (c) 2019 Octokit contributors 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 18 | - sources: README.md 19 | text: "[MIT](LICENSE)" 20 | notices: [] 21 | -------------------------------------------------------------------------------- /.licenses/npm/@octokit/types-13.10.0.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@octokit/types" 3 | version: 13.10.0 4 | type: npm 5 | summary: Shared TypeScript definitions for Octokit projects 6 | homepage: 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | MIT License Copyright (c) 2019 Octokit contributors 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 18 | - sources: README.md 19 | text: "[MIT](LICENSE)" 20 | notices: [] 21 | -------------------------------------------------------------------------------- /.licenses/npm/js-yaml.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: js-yaml 3 | version: 4.1.0 4 | type: npm 5 | summary: YAML 1.2 parser and serializer 6 | homepage: 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | (The MIT License) 12 | 13 | Copyright (C) 2011-2015 by Vitaly Puzrin 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy 16 | of this software and associated documentation files (the "Software"), to deal 17 | in the Software without restriction, including without limitation the rights 18 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 19 | copies of the Software, and to permit persons to whom the Software is 20 | furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in 23 | all copies or substantial portions of the Software. 24 | 25 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 31 | THE SOFTWARE. 32 | notices: [] 33 | -------------------------------------------------------------------------------- /.licenses/npm/@fastify/busboy.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@fastify/busboy" 3 | version: 2.1.1 4 | type: npm 5 | summary: A streaming parser for HTML form data for node.js 6 | homepage: 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: |- 11 | Copyright Brian White. All rights reserved. 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy 14 | of this software and associated documentation files (the "Software"), to 15 | deal in the Software without restriction, including without limitation the 16 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 17 | sell copies of the Software, and to permit persons to whom the Software is 18 | furnished to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included in 21 | all copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 28 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 29 | IN THE SOFTWARE. 30 | notices: [] 31 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "GitHub Actions (TypeScript)", 3 | "image": "mcr.microsoft.com/devcontainers/typescript-node:20", 4 | "postCreateCommand": ".devcontainer/post-create", 5 | "customizations": { 6 | "codespaces": { 7 | "openFiles": ["README.md"] 8 | }, 9 | "vscode": { 10 | "extensions": [ 11 | "bierner.markdown-preview-github-styles", 12 | "davidanson.vscode-markdownlint", 13 | "dbaeumer.vscode-eslint", 14 | "esbenp.prettier-vscode", 15 | "github.copilot", 16 | "github.copilot-chat", 17 | "github.vscode-github-actions", 18 | "github.vscode-pull-request-github", 19 | "me-dutour-mathieu.vscode-github-actions", 20 | "redhat.vscode-yaml", 21 | "rvest.vs-code-prettier-eslint", 22 | "yzhang.markdown-all-in-one" 23 | ], 24 | "settings": { 25 | "editor.defaultFormatter": "esbenp.prettier-vscode", 26 | "editor.tabSize": 2, 27 | "editor.formatOnSave": true, 28 | "markdown.extension.list.indentationSize": "adaptive", 29 | "markdown.extension.italic.indicator": "_", 30 | "markdown.extension.orderedList.marker": "one" 31 | } 32 | } 33 | }, 34 | "remoteEnv": { 35 | "GITHUB_TOKEN": "${localEnv:GITHUB_TOKEN}" 36 | }, 37 | "features": { 38 | "ghcr.io/devcontainers/features/github-cli:1": {}, 39 | "ghcr.io/devcontainers/features/ruby:1": {} 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /.licenses/npm/@octokit/plugin-paginate-rest.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@octokit/plugin-paginate-rest" 3 | version: 9.2.2 4 | type: npm 5 | summary: Octokit plugin to paginate REST API endpoint responses 6 | homepage: 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | MIT License Copyright (c) 2019 Octokit contributors 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 18 | - sources: README.md 19 | text: "[MIT](LICENSE)" 20 | notices: [] 21 | -------------------------------------------------------------------------------- /.licenses/npm/zod.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: zod 3 | version: 3.25.76 4 | type: npm 5 | summary: TypeScript-first schema declaration and validation library with static type 6 | inference 7 | homepage: https://zod.dev 8 | license: mit 9 | licenses: 10 | - sources: LICENSE 11 | text: | 12 | MIT License 13 | 14 | Copyright (c) 2025 Colin McDonnell 15 | 16 | Permission is hereby granted, free of charge, to any person obtaining a copy 17 | of this software and associated documentation files (the "Software"), to deal 18 | in the Software without restriction, including without limitation the rights 19 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 20 | copies of the Software, and to permit persons to whom the Software is 21 | furnished to do so, subject to the following conditions: 22 | 23 | The above copyright notice and this permission notice shall be included in all 24 | copies or substantial portions of the Software. 25 | 26 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 27 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 28 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 29 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 30 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 31 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32 | SOFTWARE. 33 | notices: [] 34 | -------------------------------------------------------------------------------- /.licenses/npm/@octokit/plugin-rest-endpoint-methods.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@octokit/plugin-rest-endpoint-methods" 3 | version: 10.4.1 4 | type: npm 5 | summary: Octokit plugin adding one method for all of api.github.com REST API endpoints 6 | homepage: 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | MIT License Copyright (c) 2019 Octokit contributors 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 18 | - sources: README.md 19 | text: "[MIT](LICENSE)" 20 | notices: [] 21 | -------------------------------------------------------------------------------- /.licenses/npm/@octokit/core.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@octokit/core" 3 | version: 5.2.1 4 | type: npm 5 | summary: Extendable client for GitHub's REST & GraphQL APIs 6 | homepage: 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | The MIT License 12 | 13 | Copyright (c) 2019 Octokit contributors 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy 16 | of this software and associated documentation files (the "Software"), to deal 17 | in the Software without restriction, including without limitation the rights 18 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 19 | copies of the Software, and to permit persons to whom the Software is 20 | furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in 23 | all copies or substantial portions of the Software. 24 | 25 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 31 | THE SOFTWARE. 32 | - sources: README.md 33 | text: "[MIT](LICENSE)" 34 | notices: [] 35 | -------------------------------------------------------------------------------- /.licenses/npm/@octokit/graphql.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@octokit/graphql" 3 | version: 7.1.1 4 | type: npm 5 | summary: GitHub GraphQL API client for browsers and Node 6 | homepage: 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | The MIT License 12 | 13 | Copyright (c) 2018 Octokit contributors 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy 16 | of this software and associated documentation files (the "Software"), to deal 17 | in the Software without restriction, including without limitation the rights 18 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 19 | copies of the Software, and to permit persons to whom the Software is 20 | furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in 23 | all copies or substantial portions of the Software. 24 | 25 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 31 | THE SOFTWARE. 32 | - sources: README.md 33 | text: "[MIT](LICENSE)" 34 | notices: [] 35 | -------------------------------------------------------------------------------- /.licenses/npm/@octokit/request-error.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@octokit/request-error" 3 | version: 5.1.1 4 | type: npm 5 | summary: Error class for Octokit request errors 6 | homepage: 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | The MIT License 12 | 13 | Copyright (c) 2019 Octokit contributors 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy 16 | of this software and associated documentation files (the "Software"), to deal 17 | in the Software without restriction, including without limitation the rights 18 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 19 | copies of the Software, and to permit persons to whom the Software is 20 | furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in 23 | all copies or substantial portions of the Software. 24 | 25 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 31 | THE SOFTWARE. 32 | - sources: README.md 33 | text: "[MIT](LICENSE)" 34 | notices: [] 35 | -------------------------------------------------------------------------------- /.licenses/npm/@octokit/endpoint.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@octokit/endpoint" 3 | version: 9.0.6 4 | type: npm 5 | summary: Turns REST API endpoints into generic request options 6 | homepage: 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | The MIT License 12 | 13 | Copyright (c) 2018 Octokit contributors 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy 16 | of this software and associated documentation files (the "Software"), to deal 17 | in the Software without restriction, including without limitation the rights 18 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 19 | copies of the Software, and to permit persons to whom the Software is 20 | furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in 23 | all copies or substantial portions of the Software. 24 | 25 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 31 | THE SOFTWARE. 32 | - sources: README.md 33 | text: "[MIT](LICENSE)" 34 | notices: [] 35 | -------------------------------------------------------------------------------- /.licenses/npm/undici.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: undici 3 | version: 5.29.0 4 | type: npm 5 | summary: An HTTP/1.1 client, written from scratch for Node.js 6 | homepage: https://undici.nodejs.org 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | MIT License 12 | 13 | Copyright (c) Matteo Collina and Undici contributors 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy 16 | of this software and associated documentation files (the "Software"), to deal 17 | in the Software without restriction, including without limitation the rights 18 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 19 | copies of the Software, and to permit persons to whom the Software is 20 | furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in all 23 | copies or substantial portions of the Software. 24 | 25 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 | SOFTWARE. 32 | - sources: README.md 33 | text: MIT 34 | notices: [] 35 | -------------------------------------------------------------------------------- /.licenses/npm/@octokit/auth-token.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@octokit/auth-token" 3 | version: 4.0.0 4 | type: npm 5 | summary: GitHub API token authentication for browsers and Node.js 6 | homepage: 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | The MIT License 12 | 13 | Copyright (c) 2019 Octokit contributors 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy 16 | of this software and associated documentation files (the "Software"), to deal 17 | in the Software without restriction, including without limitation the rights 18 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 19 | copies of the Software, and to permit persons to whom the Software is 20 | furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in 23 | all copies or substantial portions of the Software. 24 | 25 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 31 | THE SOFTWARE. 32 | - sources: README.md 33 | text: "[MIT](LICENSE)" 34 | notices: [] 35 | -------------------------------------------------------------------------------- /.licenses/npm/@actions/http-client.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@actions/http-client" 3 | version: 2.2.3 4 | type: npm 5 | summary: Actions Http Client 6 | homepage: https://github.com/actions/toolkit/tree/main/packages/http-client 7 | license: other 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | Actions Http Client for Node.js 12 | 13 | Copyright (c) GitHub, Inc. 14 | 15 | All rights reserved. 16 | 17 | MIT License 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and 20 | associated documentation files (the "Software"), to deal in the Software without restriction, 21 | including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 22 | and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, 23 | subject to the following conditions: 24 | 25 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 26 | 27 | THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 28 | LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 29 | NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 30 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 31 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 32 | notices: [] 33 | -------------------------------------------------------------------------------- /.github/workflows/linter.yml: -------------------------------------------------------------------------------- 1 | name: Lint Codebase 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | push: 8 | branches: 9 | - main 10 | 11 | permissions: 12 | contents: read 13 | packages: read 14 | statuses: write 15 | 16 | jobs: 17 | lint: 18 | name: Lint Codebase 19 | runs-on: ubuntu-latest 20 | 21 | steps: 22 | - name: Checkout 23 | id: checkout 24 | uses: actions/checkout@v5 25 | with: 26 | fetch-depth: 0 27 | 28 | - name: Setup Node.js 29 | id: setup-node 30 | uses: actions/setup-node@v4 31 | with: 32 | node-version-file: .node-version 33 | cache: npm 34 | 35 | - name: Install Dependencies 36 | id: install 37 | run: npm ci 38 | 39 | - name: Lint Codebase 40 | id: super-linter 41 | uses: super-linter/super-linter/slim@5119dcd8011e92182ce8219d9e9efc82f16fddb6 42 | env: 43 | DEFAULT_BRANCH: main 44 | FILTER_REGEX_EXCLUDE: dist/**/* 45 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 46 | LINTER_RULES_PATH: ${{ github.workspace }} 47 | VALIDATE_ALL_CODEBASE: true 48 | VALIDATE_JAVASCRIPT_ES: false 49 | VALIDATE_JAVASCRIPT_STANDARD: false 50 | VALIDATE_JSCPD: false 51 | VALIDATE_TYPESCRIPT_ES: false 52 | VALIDATE_JSON: false 53 | VALIDATE_TYPESCRIPT_STANDARD: false 54 | VALIDATE_GITHUB_ACTIONS: false # false until linter schemas are updated to include the models permission 55 | -------------------------------------------------------------------------------- /.licenses/npm/@octokit/request.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@octokit/request" 3 | version: 8.4.1 4 | type: npm 5 | summary: Send parameterized requests to GitHub's APIs with sensible defaults in browsers 6 | and Node 7 | homepage: 8 | license: mit 9 | licenses: 10 | - sources: LICENSE 11 | text: | 12 | The MIT License 13 | 14 | Copyright (c) 2018 Octokit contributors 15 | 16 | Permission is hereby granted, free of charge, to any person obtaining a copy 17 | of this software and associated documentation files (the "Software"), to deal 18 | in the Software without restriction, including without limitation the rights 19 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 20 | copies of the Software, and to permit persons to whom the Software is 21 | furnished to do so, subject to the following conditions: 22 | 23 | The above copyright notice and this permission notice shall be included in 24 | all copies or substantial portions of the Software. 25 | 26 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 27 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 28 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 29 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 30 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 31 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 32 | THE SOFTWARE. 33 | - sources: README.md 34 | text: "[MIT](LICENSE)" 35 | notices: [] 36 | -------------------------------------------------------------------------------- /.licenses/npm/@types/estree.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@types/estree" 3 | version: 1.0.8 4 | type: npm 5 | summary: TypeScript definitions for estree 6 | homepage: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/estree 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: |2 11 | MIT License 12 | 13 | Copyright (c) Microsoft Corporation. 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy 16 | of this software and associated documentation files (the "Software"), to deal 17 | in the Software without restriction, including without limitation the rights 18 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 19 | copies of the Software, and to permit persons to whom the Software is 20 | furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in all 23 | copies or substantial portions of the Software. 24 | 25 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 | SOFTWARE 32 | notices: [] 33 | -------------------------------------------------------------------------------- /.licenses/npm/@types/js-yaml.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@types/js-yaml" 3 | version: 4.0.9 4 | type: npm 5 | summary: TypeScript definitions for js-yaml 6 | homepage: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/js-yaml 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: |2 11 | MIT License 12 | 13 | Copyright (c) Microsoft Corporation. 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy 16 | of this software and associated documentation files (the "Software"), to deal 17 | in the Software without restriction, including without limitation the rights 18 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 19 | copies of the Software, and to permit persons to whom the Software is 20 | furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in all 23 | copies or substantial portions of the Software. 24 | 25 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 | SOFTWARE 32 | notices: [] 33 | -------------------------------------------------------------------------------- /.licenses/npm/@rollup/plugin-json.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@rollup/plugin-json" 3 | version: 6.1.0 4 | type: npm 5 | summary: Convert .json files to ES6 modules 6 | homepage: https://github.com/rollup/plugins/tree/master/packages/json#readme 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | The MIT License (MIT) 12 | 13 | Copyright (c) 2019 RollupJS Plugin Contributors (https://github.com/rollup/plugins/graphs/contributors) 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy 16 | of this software and associated documentation files (the "Software"), to deal 17 | in the Software without restriction, including without limitation the rights 18 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 19 | copies of the Software, and to permit persons to whom the Software is 20 | furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in 23 | all copies or substantial portions of the Software. 24 | 25 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 31 | THE SOFTWARE. 32 | notices: [] 33 | -------------------------------------------------------------------------------- /.licenses/npm/tunnel.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: tunnel 3 | version: 0.0.6 4 | type: npm 5 | summary: Node HTTP/HTTPS Agents for tunneling proxies 6 | homepage: https://github.com/koichik/node-tunnel/ 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | The MIT License (MIT) 12 | 13 | Copyright (c) 2012 Koichi Kobayashi 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy 16 | of this software and associated documentation files (the "Software"), to deal 17 | in the Software without restriction, including without limitation the rights 18 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 19 | copies of the Software, and to permit persons to whom the Software is 20 | furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in 23 | all copies or substantial portions of the Software. 24 | 25 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 31 | THE SOFTWARE. 32 | - sources: README.md 33 | text: Licensed under the [MIT](https://github.com/koichik/node-tunnel/blob/master/LICENSE) 34 | license. 35 | notices: [] 36 | -------------------------------------------------------------------------------- /.licenses/npm/@rollup/pluginutils.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "@rollup/pluginutils" 3 | version: 5.1.4 4 | type: npm 5 | summary: A set of utility functions commonly used by Rollup plugins 6 | homepage: https://github.com/rollup/plugins/tree/master/packages/pluginutils#readme 7 | license: mit 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | The MIT License (MIT) 12 | 13 | Copyright (c) 2019 RollupJS Plugin Contributors (https://github.com/rollup/plugins/graphs/contributors) 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a copy 16 | of this software and associated documentation files (the "Software"), to deal 17 | in the Software without restriction, including without limitation the rights 18 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 19 | copies of the Software, and to permit persons to whom the Software is 20 | furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in 23 | all copies or substantial portions of the Software. 24 | 25 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 31 | THE SOFTWARE. 32 | notices: [] 33 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security 2 | 3 | GitHub takes the security of our software products and services seriously, 4 | including all of the open source code repositories managed through our GitHub 5 | organizations, such as [GitHub](https://github.com/GitHub). 6 | 7 | Even though 8 | [open source repositories are outside of the scope of our bug bounty program](https://bounty.github.com/index.html#scope) 9 | and therefore not eligible for bounty rewards, we will ensure that your finding 10 | gets passed along to the appropriate maintainers for remediation. 11 | 12 | ## Reporting Security Issues 13 | 14 | If you believe you have found a security vulnerability in any GitHub-owned 15 | repository, please report it to us through coordinated disclosure. 16 | 17 | **Please do not report security vulnerabilities through public GitHub issues, 18 | discussions, or pull requests.** 19 | 20 | Instead, please send an email to opensource-security[@]github.com. 21 | 22 | Please include as much of the information listed below as you can to help us 23 | better understand and resolve the issue: 24 | 25 | - The type of issue (e.g., buffer overflow, SQL injection, or cross-site 26 | scripting) 27 | - Full paths of source file(s) related to the manifestation of the issue 28 | - The location of the affected source code (tag/branch/commit or direct URL) 29 | - Any special configuration required to reproduce the issue 30 | - Step-by-step instructions to reproduce the issue 31 | - Proof-of-concept or exploit code (if possible) 32 | - Impact of the issue, including how an attacker might exploit the issue 33 | 34 | This information will help us triage your report more quickly. 35 | 36 | ## Policy 37 | 38 | See 39 | [GitHub's Safe Harbor Policy](https://docs.github.com/en/site-policy/security-policies/github-bug-bounty-program-legal-safe-harbor#1-safe-harbor-terms) 40 | -------------------------------------------------------------------------------- /.licenses/npm/picomatch.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: picomatch 3 | version: 4.0.2 4 | type: npm 5 | summary: Blazing fast and accurate glob matcher written in JavaScript, with no dependencies 6 | and full support for standard and extended Bash glob features, including braces, 7 | extglobs, POSIX brackets, and regular expressions. 8 | homepage: https://github.com/micromatch/picomatch 9 | license: mit 10 | licenses: 11 | - sources: LICENSE 12 | text: | 13 | The MIT License (MIT) 14 | 15 | Copyright (c) 2017-present, Jon Schlinkert. 16 | 17 | Permission is hereby granted, free of charge, to any person obtaining a copy 18 | of this software and associated documentation files (the "Software"), to deal 19 | in the Software without restriction, including without limitation the rights 20 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 21 | copies of the Software, and to permit persons to whom the Software is 22 | furnished to do so, subject to the following conditions: 23 | 24 | The above copyright notice and this permission notice shall be included in 25 | all copies or substantial portions of the Software. 26 | 27 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 28 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 29 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 30 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 31 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 32 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 33 | THE SOFTWARE. 34 | - sources: README.md 35 | text: |- 36 | Copyright © 2017-present, [Jon Schlinkert](https://github.com/jonschlinkert). 37 | Released under the [MIT License](LICENSE). 38 | notices: [] 39 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: 'AI Issue and Comment Moderator' 2 | description: 3 | 'Scan new issues and comments with GitHub Models AI prompts; label or hide 4 | spam automatically.' 5 | author: 'GitHub' 6 | branding: 7 | icon: 'shield' 8 | color: 'purple' 9 | 10 | inputs: 11 | token: 12 | description: 13 | 'GitHub token with `issues`, `pull-requests`, and `models: read` 14 | permissions' 15 | required: false 16 | default: ${{ github.token }} 17 | spam-label: 18 | description: 'Label to add when generic spam is detected' 19 | required: false 20 | default: 'spam' 21 | ai-label: 22 | description: 'Label to add when AI-generated content is detected' 23 | required: false 24 | default: 'ai-generated' 25 | minimize-detected-comments: 26 | description: 'Whether to minimize comments detected as spam' 27 | required: false 28 | default: 'true' 29 | dry-run: 30 | description: 31 | 'If true, only evaluate without adding labels or minimizing comments' 32 | required: false 33 | default: 'false' 34 | custom-prompt-path: 35 | description: 36 | 'Path to a custom YAML prompt file in your repository (relative to 37 | repository root)' 38 | required: false 39 | enable-spam-detection: 40 | description: 'Enable built-in spam detection prompt' 41 | required: false 42 | default: 'true' 43 | enable-link-spam-detection: 44 | description: 'Enable built-in link spam detection prompt' 45 | required: false 46 | default: 'true' 47 | enable-ai-detection: 48 | description: 'Enable built-in AI-generated content detection prompt' 49 | required: false 50 | default: 'true' 51 | endpoint: 52 | description: The endpoint to use for inference 53 | required: false 54 | default: 'https://models.github.ai/inference' 55 | 56 | runs: 57 | using: 'node16' 58 | main: 'dist/index.js' 59 | -------------------------------------------------------------------------------- /src/content-extractor.ts: -------------------------------------------------------------------------------- 1 | import * as github from '@actions/github' 2 | 3 | export interface ContentInfo { 4 | content: string 5 | issueNumber: number | null 6 | commentNodeId: string | null 7 | } 8 | 9 | /** 10 | * Extract content and identifiers from GitHub webhook events 11 | */ 12 | export function extractFromEvent(context: typeof github.context): ContentInfo { 13 | const event = context.eventName 14 | 15 | let content = '' 16 | let issueNumber: number | null = null 17 | let commentNodeId: string | null = null 18 | 19 | if (event === 'issues' && context.payload.action === 'opened') { 20 | content = `${context.payload.issue?.title}\n${context.payload.issue?.body}` 21 | issueNumber = context.payload.issue?.number ?? null 22 | } else if ( 23 | event === 'issue_comment' && 24 | context.payload.action === 'created' 25 | ) { 26 | content = context.payload.comment?.body || '' 27 | issueNumber = context.payload.issue?.number ?? null 28 | commentNodeId = context.payload.comment?.node_id 29 | } else if ( 30 | event === 'pull_request_review_comment' && 31 | context.payload.action === 'created' 32 | ) { 33 | content = context.payload.comment?.body || '' 34 | issueNumber = context.payload.pull_request?.number ?? null 35 | commentNodeId = context.payload.comment?.node_id 36 | } 37 | 38 | return { 39 | content, 40 | issueNumber, 41 | commentNodeId 42 | } 43 | } 44 | 45 | /** 46 | * Check if the current event should be processed 47 | */ 48 | export function shouldProcess(context: typeof github.context): boolean { 49 | const event = context.eventName 50 | 51 | return ( 52 | (event === 'issues' && context.payload.action === 'opened') || 53 | (event === 'issue_comment' && context.payload.action === 'created') || 54 | (event === 'pull_request_review_comment' && 55 | context.payload.action === 'created') 56 | ) 57 | } 58 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # dotenv-linter:off IncorrectDelimiter 2 | 3 | # Do not commit your actual .env file to Git! This may contain secrets or other 4 | # private information. 5 | 6 | # Enable/disable step debug logging (default: `false`). For local debugging, it 7 | # may be useful to set it to `true`. 8 | ACTIONS_STEP_DEBUG=true 9 | 10 | # GitHub Actions inputs should follow `INPUT_` format (case-sensitive). 11 | # Hyphens should not be converted to underscores! 12 | INPUT_PROMPT=hello 13 | 14 | # GitHub Actions default environment variables. These are set for every run of a 15 | # workflow and can be used in your actions. Setting the value here will override 16 | # any value set by the local-action tool. 17 | # https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables 18 | 19 | # CI="true" 20 | # GITHUB_ACTION="" 21 | # GITHUB_ACTION_PATH="" 22 | # GITHUB_ACTION_REPOSITORY="" 23 | # GITHUB_ACTIONS="" 24 | # GITHUB_ACTOR="" 25 | # GITHUB_ACTOR_ID="" 26 | # GITHUB_API_URL="" 27 | # GITHUB_BASE_REF="" 28 | # GITHUB_ENV="" 29 | # GITHUB_EVENT_NAME="" 30 | # GITHUB_EVENT_PATH="" 31 | # GITHUB_GRAPHQL_URL="" 32 | # GITHUB_HEAD_REF="" 33 | # GITHUB_JOB="" 34 | # GITHUB_OUTPUT="" 35 | # GITHUB_PATH="" 36 | # GITHUB_REF="" 37 | # GITHUB_REF_NAME="" 38 | # GITHUB_REF_PROTECTED="" 39 | # GITHUB_REF_TYPE="" 40 | # GITHUB_REPOSITORY="" 41 | # GITHUB_REPOSITORY_ID="" 42 | # GITHUB_REPOSITORY_OWNER="" 43 | # GITHUB_REPOSITORY_OWNER_ID="" 44 | # GITHUB_RETENTION_DAYS="" 45 | # GITHUB_RUN_ATTEMPT="" 46 | # GITHUB_RUN_ID="" 47 | # GITHUB_RUN_NUMBER="" 48 | # GITHUB_SERVER_URL="" 49 | # GITHUB_SHA="" 50 | # GITHUB_STEP_SUMMARY="" 51 | # GITHUB_TRIGGERING_ACTOR="" 52 | # GITHUB_WORKFLOW="" 53 | # GITHUB_WORKFLOW_REF="" 54 | # GITHUB_WORKFLOW_SHA="" 55 | # GITHUB_WORKSPACE="" 56 | # RUNNER_ARCH="" 57 | # RUNNER_DEBUG="" 58 | # RUNNER_NAME="" 59 | # RUNNER_OS="" 60 | # RUNNER_TEMP="" 61 | # RUNNER_TOOL_CACHE="" 62 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependency directory 2 | node_modules 3 | 4 | # Rest pulled from https://github.com/github/gitignore/blob/master/Node.gitignore 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | lerna-debug.log* 12 | 13 | # Diagnostic reports (https://nodejs.org/api/report.html) 14 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 15 | 16 | # Runtime data 17 | pids 18 | *.pid 19 | *.seed 20 | *.pid.lock 21 | 22 | # Directory for instrumented libs generated by jscoverage/JSCover 23 | lib-cov 24 | 25 | # Coverage directory used by tools like istanbul 26 | coverage 27 | *.lcov 28 | 29 | # nyc test coverage 30 | .nyc_output 31 | 32 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 33 | .grunt 34 | 35 | # Bower dependency directory (https://bower.io/) 36 | bower_components 37 | 38 | # node-waf configuration 39 | .lock-wscript 40 | 41 | # Compiled binary addons (https://nodejs.org/api/addons.html) 42 | build/Release 43 | 44 | # Dependency directories 45 | jspm_packages/ 46 | 47 | # TypeScript v1 declaration files 48 | typings/ 49 | 50 | # TypeScript cache 51 | *.tsbuildinfo 52 | 53 | # Optional npm cache directory 54 | .npm 55 | 56 | # Optional eslint cache 57 | .eslintcache 58 | 59 | # Optional REPL history 60 | .node_repl_history 61 | 62 | # Output of 'npm pack' 63 | *.tgz 64 | 65 | # Yarn Integrity file 66 | .yarn-integrity 67 | 68 | # dotenv environment variables file 69 | .env 70 | .env.test 71 | 72 | # parcel-bundler cache (https://parceljs.org/) 73 | .cache 74 | 75 | # next.js build output 76 | .next 77 | 78 | # nuxt.js build output 79 | .nuxt 80 | 81 | # vuepress build output 82 | .vuepress/dist 83 | 84 | # Serverless directories 85 | .serverless/ 86 | 87 | # FuseBox cache 88 | .fusebox/ 89 | 90 | # DynamoDB Local files 91 | .dynamodb/ 92 | 93 | # OS metadata 94 | .DS_Store 95 | Thumbs.db 96 | 97 | # Ignore built ts files 98 | __tests__/runner/* 99 | 100 | # IDE files 101 | .idea 102 | *.code-workspace 103 | -------------------------------------------------------------------------------- /__tests__/github.test.ts: -------------------------------------------------------------------------------- 1 | import { jest } from '@jest/globals' 2 | import * as github from '@actions/github' 3 | import { addLabels } from '../src/github' 4 | 5 | // Mock the @actions/github module 6 | const mockAddLabels = jest.fn<() => Promise>() 7 | const mockGraphql = jest.fn<() => Promise>() 8 | 9 | const mockOctokit = { 10 | rest: { 11 | issues: { 12 | addLabels: mockAddLabels 13 | } 14 | }, 15 | graphql: mockGraphql 16 | } as unknown as ReturnType 17 | 18 | // Type for our mock context 19 | type MockContext = typeof github.context 20 | 21 | const mockContext = { 22 | repo: { 23 | owner: 'test-owner', 24 | repo: 'test-repo' 25 | } 26 | } as MockContext 27 | 28 | describe('GitHub Service Functions', () => { 29 | beforeEach(() => { 30 | mockAddLabels.mockClear() 31 | mockGraphql.mockClear() 32 | }) 33 | 34 | describe('addLabels', () => { 35 | it('should add labels to an issue', async () => { 36 | const issueNumber = 123 37 | const labels = ['spam', 'needs-review'] 38 | 39 | mockAddLabels.mockResolvedValue({} as unknown) 40 | 41 | await addLabels(mockOctokit, mockContext, issueNumber, labels) 42 | 43 | expect(mockAddLabels).toHaveBeenCalledWith({ 44 | owner: 'test-owner', 45 | repo: 'test-repo', 46 | issue_number: issueNumber, 47 | labels 48 | }) 49 | }) 50 | 51 | it('should not call API when labels array is empty', async () => { 52 | const issueNumber = 123 53 | const labels: string[] = [] 54 | 55 | await addLabels(mockOctokit, mockContext, issueNumber, labels) 56 | 57 | expect(mockAddLabels).not.toHaveBeenCalled() 58 | }) 59 | 60 | it('should handle API errors', async () => { 61 | const issueNumber = 123 62 | const labels = ['spam'] 63 | const error = new Error('API Error') 64 | 65 | mockAddLabels.mockRejectedValue(error) 66 | 67 | await expect( 68 | addLabels(mockOctokit, mockContext, issueNumber, labels) 69 | ).rejects.toThrow('API Error') 70 | }) 71 | }) 72 | }) 73 | -------------------------------------------------------------------------------- /.github/workflows/licensed.yml: -------------------------------------------------------------------------------- 1 | # This workflow checks the statuses of cached dependencies used in this action 2 | # with the help of the Licensed tool. If any licenses are invalid or missing, 3 | # this workflow will fail. See: https://github.com/licensee/licensed 4 | 5 | name: Licensed 6 | 7 | on: 8 | # Uncomment the below lines to run this workflow on pull requests and pushes 9 | # to the default branch. This is useful for checking licenses before merging 10 | # changes into the default branch. 11 | pull_request: 12 | branches: 13 | - main 14 | push: 15 | branches: 16 | - main 17 | workflow_dispatch: 18 | 19 | permissions: 20 | contents: write 21 | 22 | jobs: 23 | licensed: 24 | name: Check Licenses 25 | runs-on: ubuntu-latest 26 | 27 | steps: 28 | - name: Checkout 29 | id: checkout 30 | uses: actions/checkout@v5 31 | 32 | - name: Setup Node.js 33 | id: setup-node 34 | uses: actions/setup-node@v4 35 | with: 36 | node-version-file: .node-version 37 | cache: npm 38 | 39 | - name: Install Dependencies 40 | id: npm-ci 41 | run: npm ci 42 | 43 | - name: Setup Ruby 44 | id: setup-ruby 45 | uses: ruby/setup-ruby@v1 46 | with: 47 | ruby-version: ruby 48 | 49 | - uses: licensee/setup-licensed@v1.3.2 50 | with: 51 | version: 4.x 52 | github_token: ${{ secrets.GITHUB_TOKEN }} 53 | 54 | # If this is a workflow_dispatch event, update the cached licenses. 55 | - if: ${{ github.event_name == 'workflow_dispatch' }} 56 | name: Update Licenses 57 | id: update-licenses 58 | run: licensed cache 59 | 60 | # Then, commit the updated licenses to the repository. 61 | - if: ${{ github.event_name == 'workflow_dispatch' }} 62 | name: Commit Licenses 63 | id: commit-licenses 64 | run: | 65 | git config --local user.email "licensed-ci@users.noreply.github.com" 66 | git config --local user.name "licensed-ci" 67 | git add . 68 | git commit -m "Auto-update license files" 69 | git push 70 | 71 | # Last, check the status of the cached licenses. 72 | - name: Check Licenses 73 | id: check-licenses 74 | run: licensed status 75 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ai-moderator", 3 | "version": "1.0.0", 4 | "type": "module", 5 | "exports": { 6 | ".": "./dist/index.js" 7 | }, 8 | "engines": { 9 | "node": ">=20" 10 | }, 11 | "scripts": { 12 | "bundle": "npm run format:write && npm run package", 13 | "ci-test": "NODE_OPTIONS=--experimental-vm-modules NODE_NO_WARNINGS=1 npx jest", 14 | "coverage": "npx make-coverage-badge --output-path ./badges/coverage.svg", 15 | "format:write": "npx prettier --write .", 16 | "format:check": "npx prettier --check .", 17 | "lint": "npx eslint .", 18 | "local-action": "npx @github/local-action . src/main.ts .env", 19 | "package": "npx rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript", 20 | "package:watch": "npm run package -- --watch", 21 | "test": "npx cross-env NODE_OPTIONS=--experimental-vm-modules NODE_NO_WARNINGS=1 npx jest", 22 | "all": "npm run format:write && npm run lint && npm run test && npm run coverage && npm run package" 23 | }, 24 | "license": "MIT", 25 | "dependencies": { 26 | "@actions/core": "^1.11.1", 27 | "@actions/github": "^6.0.0", 28 | "@rollup/plugin-json": "^6.1.0", 29 | "@types/js-yaml": "^4.0.9", 30 | "js-yaml": "^4.1.0", 31 | "openai": "^5.12.2" 32 | }, 33 | "devDependencies": { 34 | "@eslint/compat": "^1.3.2", 35 | "@github/local-action": "^5.1.0", 36 | "@jest/globals": "^30.0.5", 37 | "@rollup/plugin-commonjs": "^28.0.6", 38 | "@rollup/plugin-node-resolve": "^16.0.1", 39 | "@rollup/plugin-typescript": "^12.1.4", 40 | "@types/jest": "^30.0.0", 41 | "@types/node": "^22.18.0", 42 | "@typescript-eslint/eslint-plugin": "^8.40.0", 43 | "@typescript-eslint/parser": "^8.32.1", 44 | "eslint": "^9.34.0", 45 | "eslint-config-prettier": "^10.1.8", 46 | "eslint-import-resolver-typescript": "^4.4.4", 47 | "eslint-plugin-import": "^2.32.0", 48 | "eslint-plugin-jest": "^28.14.0", 49 | "eslint-plugin-prettier": "^5.5.4", 50 | "jest": "^30.0.5", 51 | "make-coverage-badge": "^1.2.0", 52 | "prettier": "^3.6.2", 53 | "prettier-eslint": "^16.4.2", 54 | "rollup": "^4.48.1", 55 | "ts-jest": "^29.4.1", 56 | "ts-jest-resolver": "^2.0.1", 57 | "typescript": "^5.9.2" 58 | }, 59 | "optionalDependencies": { 60 | "@rollup/rollup-linux-x64-gnu": "*" 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /.github/workflows/check-dist.yml: -------------------------------------------------------------------------------- 1 | # In TypeScript actions, `dist/` is a special directory. When you reference 2 | # an action with the `uses:` property, `dist/index.js` is the code that will be 3 | # run. For this project, the `dist/index.js` file is transpiled from other 4 | # source files. This workflow ensures the `dist/` directory contains the 5 | # expected transpiled code. 6 | # 7 | # If this workflow is run from a feature branch, it will act as an additional CI 8 | # check and fail if the checked-in `dist/` directory does not match what is 9 | # expected from the build. 10 | name: Check Transpiled JavaScript 11 | 12 | on: 13 | pull_request: 14 | branches: 15 | - main 16 | push: 17 | branches: 18 | - main 19 | 20 | permissions: 21 | contents: read 22 | 23 | jobs: 24 | check-dist: 25 | name: Check dist/ 26 | runs-on: ubuntu-latest 27 | 28 | steps: 29 | - name: Checkout 30 | id: checkout 31 | uses: actions/checkout@v5 32 | 33 | - name: Setup Node.js 34 | id: setup-node 35 | uses: actions/setup-node@v4 36 | with: 37 | node-version-file: .node-version 38 | cache: npm 39 | 40 | - name: Install Dependencies 41 | id: install 42 | run: npm ci 43 | 44 | - name: Build dist/ Directory 45 | id: build 46 | run: npm run bundle 47 | 48 | # This will fail the workflow if the `dist/` directory is different than 49 | # expected. 50 | - name: Compare Directories 51 | id: diff 52 | run: | 53 | if [ ! -d dist/ ]; then 54 | echo "Expected dist/ directory does not exist. See status below:" 55 | ls -la ./ 56 | exit 1 57 | fi 58 | if [ "$(git diff --ignore-space-at-eol --text dist/ | wc -l)" -gt "0" ]; then 59 | echo "Detected uncommitted changes after build. See status below:" 60 | git diff --ignore-space-at-eol --text dist/ 61 | exit 1 62 | fi 63 | 64 | # If `dist/` was different than expected, upload the expected version as a 65 | # workflow artifact. 66 | - if: ${{ failure() && steps.diff.outcome == 'failure' }} 67 | name: Upload Artifact 68 | id: upload 69 | uses: actions/upload-artifact@v4 70 | with: 71 | name: dist 72 | path: dist/ 73 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | // See: https://eslint.org/docs/latest/use/configure/configuration-files 2 | 3 | import { fixupPluginRules } from '@eslint/compat' 4 | import { FlatCompat } from '@eslint/eslintrc' 5 | import js from '@eslint/js' 6 | import typescriptEslint from '@typescript-eslint/eslint-plugin' 7 | import tsParser from '@typescript-eslint/parser' 8 | import _import from 'eslint-plugin-import' 9 | import jest from 'eslint-plugin-jest' 10 | import prettier from 'eslint-plugin-prettier' 11 | import globals from 'globals' 12 | import path from 'node:path' 13 | import { fileURLToPath } from 'node:url' 14 | 15 | const __filename = fileURLToPath(import.meta.url) 16 | const __dirname = path.dirname(__filename) 17 | const compat = new FlatCompat({ 18 | baseDirectory: __dirname, 19 | recommendedConfig: js.configs.recommended, 20 | allConfig: js.configs.all 21 | }) 22 | 23 | export default [ 24 | { 25 | ignores: ['**/coverage', '**/dist', '**/linter', '**/node_modules'] 26 | }, 27 | ...compat.extends( 28 | 'eslint:recommended', 29 | 'plugin:@typescript-eslint/eslint-recommended', 30 | 'plugin:@typescript-eslint/recommended', 31 | 'plugin:jest/recommended', 32 | 'plugin:prettier/recommended' 33 | ), 34 | { 35 | plugins: { 36 | import: fixupPluginRules(_import), 37 | jest, 38 | prettier, 39 | '@typescript-eslint': typescriptEslint 40 | }, 41 | 42 | languageOptions: { 43 | globals: { 44 | ...globals.node, 45 | ...globals.jest, 46 | Atomics: 'readonly', 47 | SharedArrayBuffer: 'readonly' 48 | }, 49 | 50 | parser: tsParser, 51 | ecmaVersion: 2023, 52 | sourceType: 'module', 53 | 54 | parserOptions: { 55 | project: ['tsconfig.eslint.json'], 56 | tsconfigRootDir: '.' 57 | } 58 | }, 59 | 60 | settings: { 61 | 'import/resolver': { 62 | typescript: { 63 | alwaysTryTypes: true, 64 | project: 'tsconfig.eslint.json' 65 | } 66 | } 67 | }, 68 | 69 | rules: { 70 | camelcase: 'off', 71 | 'eslint-comments/no-use': 'off', 72 | 'eslint-comments/no-unused-disable': 'off', 73 | 'i18n-text/no-en': 'off', 74 | 'import/no-namespace': 'off', 75 | 'no-console': 'off', 76 | 'no-shadow': 'off', 77 | 'no-unused-vars': 'off', 78 | 'prettier/prettier': 'error' 79 | } 80 | } 81 | ] 82 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Continuous Integration 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | push: 8 | branches: 9 | - main 10 | 11 | permissions: 12 | contents: read 13 | models: read 14 | 15 | jobs: 16 | test-typescript: 17 | name: TypeScript Tests 18 | runs-on: ubuntu-latest 19 | 20 | steps: 21 | - name: Checkout 22 | id: checkout 23 | uses: actions/checkout@v5 24 | 25 | - name: Setup Node.js 26 | id: setup-node 27 | uses: actions/setup-node@v4 28 | with: 29 | node-version-file: .node-version 30 | cache: npm 31 | 32 | - name: Install Dependencies 33 | id: npm-ci 34 | run: npm ci 35 | 36 | - name: Check Format 37 | id: npm-format-check 38 | run: npm run format:check 39 | 40 | - name: Lint 41 | id: npm-lint 42 | run: npm run lint 43 | 44 | - name: Test 45 | id: npm-ci-test 46 | run: npm run ci-test 47 | env: 48 | GITHUB_TOKEN: ${{ github.token }} 49 | 50 | test-action: 51 | name: GitHub Actions Test 52 | runs-on: ubuntu-latest 53 | 54 | steps: 55 | - name: Checkout 56 | id: checkout 57 | uses: actions/checkout@v5 58 | 59 | - name: Test Local Action 60 | id: test-action 61 | continue-on-error: true 62 | uses: ./ 63 | with: 64 | prompt: hello 65 | env: 66 | GITHUB_TOKEN: ${{ github.token }} 67 | 68 | - name: Print Output 69 | id: output 70 | continue-on-error: true 71 | run: echo "${{ steps.test-action.outputs.response }}" 72 | 73 | test-action-prompt-file: 74 | name: GitHub Actions Test with Prompt File 75 | runs-on: ubuntu-latest 76 | 77 | steps: 78 | - name: Checkout 79 | id: checkout 80 | uses: actions/checkout@v5 81 | 82 | - name: Create Prompt File 83 | run: echo "hello" > prompt.txt 84 | 85 | - name: Create System Prompt File 86 | run: 87 | echo "You are a helpful AI assistant for testing." > system-prompt.txt 88 | 89 | - name: Test Local Action with Prompt File 90 | id: test-action-prompt-file 91 | continue-on-error: true 92 | uses: ./ 93 | with: 94 | prompt-file: prompt.txt 95 | system-prompt-file: system-prompt.txt 96 | env: 97 | GITHUB_TOKEN: ${{ github.token }} 98 | 99 | - name: Print Output 100 | continue-on-error: true 101 | run: | 102 | echo "Response saved to: ${{ steps.test-action-prompt-file.outputs.response-file }}" 103 | cat "${{ steps.test-action-prompt-file.outputs.response-file }}" 104 | -------------------------------------------------------------------------------- /.github/prompts/example-custom.prompt.yml: -------------------------------------------------------------------------------- 1 | messages: 2 | - role: system 3 | content: | 4 | You are a content moderation system for the "username/miner" repository - a video game project. 5 | This repository is frequently confused with cryptocurrency mining repositories like "bitcoin/miner". 6 | 7 | Your primary task is to identify content that belongs to cryptocurrency/blockchain discussions 8 | rather than this video game development project. 9 | 10 | SPAM INDICATORS - Flag as spam if content mentions: 11 | - Bitcoin, Ethereum, or other cryptocurrencies 12 | - Mining pools, hash rates, or mining difficulty 13 | - GPU mining rigs, ASIC miners, or mining hardware 14 | - Blockchain technology, smart contracts, or DeFi 15 | - Crypto wallets, exchanges, or trading 16 | - Mining profitability calculators or electricity costs 17 | - References to mining software like CGMiner, NBMiner, etc. 18 | - Questions about cryptocurrency market prices or investments 19 | 20 | LEGITIMATE CONTENT - Keep if discussing: 21 | - Video game mechanics, gameplay, or level design 22 | - Game development tools, engines, or frameworks 23 | - In-game mining mechanics (if part of the game) 24 | - Bug reports related to game features 25 | - Feature requests for game improvements 26 | - Graphics, audio, or user interface issues 27 | - Game installation, compatibility, or performance 28 | 29 | EDGE CASES - Use judgment for: 30 | - Discussions about in-game economies that might use mining themes 31 | - References to "mining" in a gaming context (resource gathering) 32 | - Technical discussions that could apply to both domains 33 | 34 | Provide your analysis in the specified JSON format. 35 | - role: user 36 | content: | 37 | Analyze this content to determine if it belongs to cryptocurrency mining discussions 38 | rather than this video game development repository: 39 | 40 | {{stdin}} 41 | model: gpt-4o 42 | responseFormat: json_schema 43 | jsonSchema: |- 44 | { 45 | "name": "spam_detection_result", 46 | "strict": true, 47 | "schema": { 48 | "type": "object", 49 | "properties": { 50 | "reasoning": { 51 | "type": "string", 52 | "description": "Detailed explanation analyzing whether this content is related to cryptocurrency mining (spam) or video game development (legitimate), including specific indicators that led to the conclusion" 53 | }, 54 | "is_spam": { 55 | "type": "boolean", 56 | "description": "Whether the content is cryptocurrency-related spam (true) or legitimate content for this video game repository (false)" 57 | } 58 | }, 59 | "additionalProperties": false, 60 | "required": [ 61 | "reasoning", 62 | "is_spam" 63 | ] 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /prompts/link-spam-detection.prompt.yml: -------------------------------------------------------------------------------- 1 | messages: 2 | - role: system 3 | content: | 4 | You are a link spam detection system for GitHub issues and comments. 5 | Analyze the provided content and determine if it contains suspicious or spam links. 6 | 7 | Consider these link spam indicators: 8 | - Multiple unrelated links 9 | - Links to promotional websites 10 | - Short URL services used to hide destinations (bit.ly, tinyurl, etc.) 11 | - Links to cryptocurrency, gambling, or adult content 12 | - Links that don't relate to the repository or issue topic 13 | - Suspicious domains or newly registered domains 14 | - Links to download executables or suspicious files 15 | 16 | Provide your analysis in the specified JSON format. 17 | - role: user 18 | content: | 19 | Analyze this content for link spam: 20 | 21 | {{stdin}} 22 | model: gpt-4o 23 | responseFormat: json_schema 24 | jsonSchema: |- 25 | { 26 | "name": "link_spam_detection_result", 27 | "strict": true, 28 | "schema": { 29 | "type": "object", 30 | "properties": { 31 | "reasoning": { 32 | "type": "string", 33 | "description": "Detailed explanation of the analysis, including which link spam indicators were considered and why the conclusion was reached" 34 | }, 35 | "is_spam": { 36 | "type": "boolean", 37 | "description": "Whether the content contains link spam (true) or legitimate links (false)" 38 | } 39 | }, 40 | "additionalProperties": false, 41 | "required": [ 42 | "reasoning", 43 | "is_spam" 44 | ] 45 | } 46 | } 47 | testData: 48 | - stdin: >- 49 | Check out this amazing deal! Get 50% off crypto trading at 50 | bit.ly/cryptodeal and also visit tinyurl.com/easymoney for more 51 | opportunities! 52 | expected: 'true' 53 | - stdin: >- 54 | Visit our casino website for guaranteed wins! 55 | http://newdomain123.com/casino Download our app at 56 | http://suspicious-site.exe/download 57 | expected: 'true' 58 | - stdin: >- 59 | Hey, I found a solution to this issue in the official documentation: 60 | https://github.com/owner/repo/wiki/troubleshooting 61 | expected: 'false' 62 | - stdin: >- 63 | You might want to check the Stack Overflow discussion about this: 64 | https://stackoverflow.com/questions/12345/similar-issue 65 | expected: 'false' 66 | - stdin: >- 67 | This looks like a bug in the library. See the related issue: 68 | https://github.com/library/issues/456 69 | expected: 'false' 70 | - stdin: >- 71 | URGENT! Make money fast with our new system! Visit http://quickmoney.biz 72 | and http://earnfast.net for details. Also check bit.ly/fastcash 73 | expected: 'true' 74 | evaluators: 75 | - name: is-link-spam 76 | string: 77 | contains: '{{expected}}' 78 | -------------------------------------------------------------------------------- /prompts/spam-detection.prompt.yml: -------------------------------------------------------------------------------- 1 | messages: 2 | - role: system 3 | content: | 4 | You are a spam detection system for GitHub issues and comments. 5 | Analyze the provided content and determine if it's spam. 6 | 7 | Consider these spam indicators: 8 | - Promotional content or advertisements 9 | - Irrelevant links or URLs 10 | - Repetitive text patterns 11 | - Low-quality or nonsensical content 12 | - Requests for personal information 13 | - Cryptocurrency or financial scams 14 | - Content that doesn't relate to the repository's purpose 15 | 16 | Provide your analysis in the specified JSON format. 17 | - role: user 18 | content: | 19 | Analyze this content for spam: 20 | 21 | {{stdin}} 22 | model: gpt-4o 23 | responseFormat: json_schema 24 | jsonSchema: |- 25 | { 26 | "name": "spam_detection_result", 27 | "strict": true, 28 | "schema": { 29 | "type": "object", 30 | "properties": { 31 | "reasoning": { 32 | "type": "string", 33 | "description": "Detailed explanation of the analysis, including which spam indicators were considered and why the conclusion was reached" 34 | }, 35 | "is_spam": { 36 | "type": "boolean", 37 | "description": "Whether the content is determined to be spam (true) or legitimate (false)" 38 | } 39 | }, 40 | "additionalProperties": false, 41 | "required": [ 42 | "reasoning", 43 | "is_spam" 44 | ] 45 | } 46 | } 47 | testData: 48 | - stdin: >- 49 | 🚀 AMAZING OPPORTUNITY! 🚀 Make $1000 daily from home! 💰 Contact me for 50 | exclusive crypto trading secrets! Send your email and phone number! 51 | expected: 'true' 52 | - stdin: >- 53 | BUY BUY BUY! Hot stocks alert! Don't miss out on this incredible deal! 54 | Visit our premium investment site now! Limited time offer! 55 | expected: 'true' 56 | - stdin: >- 57 | asdfjaslkdfj alskdjflaskdjf random text here askljdflasd qwerty qwerty 58 | qwerty nonsense content here 59 | expected: 'true' 60 | - stdin: >- 61 | I'm experiencing the same issue described in this bug report. The 62 | application crashes when I try to import large CSV files. Any suggestions 63 | for a workaround? 64 | expected: 'false' 65 | - stdin: >- 66 | Thanks for the fix! This resolves the memory leak I was seeing in 67 | production. The performance improvement is significant. 68 | expected: 'false' 69 | - stdin: >- 70 | Could you please add support for TypeScript in the next release? I'd be 71 | happy to contribute if you need help with the implementation. 72 | expected: 'false' 73 | - stdin: >- 74 | FREE MONEY! FREE MONEY! FREE MONEY! Click here now! Send me your bank 75 | details and I'll transfer $10,000 immediately! This is not a scam! This is 76 | not a scam! This is not a scam! 77 | expected: 'true' 78 | evaluators: 79 | - name: is-spam 80 | string: 81 | contains: '{{expected}}' 82 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to make participation in our project and our 7 | community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and 9 | expression, level of experience, education, socio-economic status, nationality, 10 | personal appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | - Using welcoming and inclusive language 18 | - Being respectful of differing viewpoints and experiences 19 | - Gracefully accepting constructive criticism 20 | - Focusing on what is best for the community 21 | - Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | - The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | - Trolling, insulting/derogatory comments, and personal or political attacks 28 | - Public or private harassment 29 | - Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | - Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or reject 41 | comments, commits, code, wiki edits, issues, and other contributions that are 42 | not aligned to this Code of Conduct, or to ban temporarily or permanently any 43 | contributor for other behaviors that they deem inappropriate, threatening, 44 | offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies within all project spaces, and it also applies when 49 | an individual is representing the project or its community in public spaces. 50 | Examples of representing a project or community include using an official 51 | project email address, posting via an official social media account, or acting 52 | as an appointed representative at an online or offline event. Representation of 53 | a project may be further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at `opensource@github.com`. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an 62 | incident. Further details of specific enforcement policies may be posted 63 | separately. 64 | 65 | Project maintainers who do not follow or enforce the Code of Conduct in good 66 | faith may face temporary or permanent repercussions as determined by other 67 | members of the project's leadership. 68 | 69 | ## Attribution 70 | 71 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 72 | version 1.4, available at 73 | `https://www.contributor-covenant.org/version/1/4/code-of-conduct.html` 74 | 75 | [homepage]: `https://www.contributor-covenant.org` 76 | 77 | For answers to common questions about this code of conduct, see 78 | `https://www.contributor-covenant.org/faq` 79 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import * as core from '@actions/core' 2 | import * as github from '@actions/github' 3 | import * as path from 'path' 4 | import { fileURLToPath } from 'url' 5 | import { OpenAI } from 'openai' 6 | import { evaluateContent } from './prompt.js' 7 | import { addLabels, minimizeComment } from './github.js' 8 | import { extractFromEvent, shouldProcess } from './content-extractor.js' 9 | 10 | async function run(): Promise { 11 | try { 12 | const token = core.getInput('token') 13 | const __filename = fileURLToPath(import.meta.url) 14 | const __dirname = path.dirname(__filename) 15 | const promptsDir = path.resolve(__dirname, '..', 'prompts') // Use built-in prompts 16 | const spamLabel = core.getInput('spam-label') 17 | const aiLabel = core.getInput('ai-label') 18 | const minimizeComments = core.getBooleanInput('minimize-detected-comments') 19 | const customPromptPath = core.getInput('custom-prompt-path') 20 | const endpoint = core.getInput('endpoint') 21 | const dryRun = core.getBooleanInput('dry-run') 22 | 23 | // Built-in prompt configuration 24 | const enableSpamDetection = core.getBooleanInput('enable-spam-detection') 25 | const enableLinkSpamDetection = core.getBooleanInput( 26 | 'enable-link-spam-detection' 27 | ) 28 | const enableAiDetection = core.getBooleanInput('enable-ai-detection') 29 | 30 | const openai = new OpenAI({ 31 | apiKey: token, 32 | baseURL: endpoint 33 | }) 34 | const octokit = github.getOctokit(token) 35 | 36 | if (!shouldProcess(github.context)) { 37 | const event = github.context.eventName 38 | core.info(`Nothing to do for event ${event}.`) 39 | return 40 | } 41 | 42 | const { content, issueNumber, commentNodeId } = extractFromEvent( 43 | github.context 44 | ) 45 | 46 | if (!content.trim()) { 47 | core.info('No text content found, skipping.') 48 | return 49 | } 50 | 51 | core.info('Evaluating content for spam and AI-generated content...') 52 | const flags = await evaluateContent( 53 | openai, 54 | promptsDir, 55 | content, 56 | customPromptPath, 57 | { 58 | enableSpamDetection, 59 | enableLinkSpamDetection, 60 | enableAiDetection 61 | } 62 | ) 63 | 64 | if (!flags.spam && !flags.ai) { 65 | core.info('No spam or AI-generated content detected ✅') 66 | return 67 | } 68 | 69 | const labels: string[] = [] 70 | 71 | // Only add labels to issues if the issue content itself has the problem 72 | // (not if it's just a comment on the issue) 73 | if (issueNumber && !commentNodeId) { 74 | if (flags.spam) labels.push(spamLabel) 75 | if (flags.ai) labels.push(aiLabel) 76 | } 77 | 78 | if (issueNumber && labels.length > 0) { 79 | if (dryRun) { 80 | core.info( 81 | `[DRY RUN] Would add labels [${labels.join(', ')}] to issue #${issueNumber}` 82 | ) 83 | } else { 84 | await addLabels(octokit, github.context, issueNumber, labels) 85 | core.info( 86 | `Added labels [${labels.join(', ')}] to issue #${issueNumber}` 87 | ) 88 | } 89 | } 90 | 91 | // Only minimize comments if they are spam, not just AI-generated 92 | // and if minimize-detected-comments is enabled 93 | if (commentNodeId && flags.spam && minimizeComments) { 94 | if (dryRun) { 95 | core.info(`[DRY RUN] Would minimize comment ${commentNodeId} as spam`) 96 | } else { 97 | await minimizeComment(octokit, commentNodeId) 98 | core.info(`Comment ${commentNodeId} minimized as spam`) 99 | } 100 | } 101 | } catch (error) { 102 | core.setFailed((error as Error).message) 103 | } 104 | } 105 | 106 | run() 107 | 108 | export default run 109 | -------------------------------------------------------------------------------- /prompts/ai-detection.prompt.yml: -------------------------------------------------------------------------------- 1 | messages: 2 | - role: system 3 | content: > 4 | You are an AI-generated content detection system for GitHub issues and 5 | comments. 6 | 7 | Analyze the provided content and determine if it was likely generated by 8 | AI. 9 | 10 | 11 | Human-written content typically has: 12 | 13 | - Natural imperfections in grammar and spelling 14 | 15 | - Casual internet language and slang 16 | 17 | - Specific technical details and personal experiences 18 | 19 | - Natural conversational flow with genuine questions or frustrations 20 | 21 | - Authentic emotional reactions to technical problems 22 | 23 | 24 | AI-generated content often exhibits artificial patterns that try to mimic 25 | human enthusiasm but lack genuine substance. 26 | 27 | 28 | Consider these AI-generated content indicators: 29 | 30 | - Use of em-dashes (—) in casual contexts 31 | 32 | - Excessive use of emoji, especially in technical discussions 33 | 34 | - Perfect grammar and punctuation in informal settings 35 | 36 | - Constructions like "it's not X - it's Y" or "X isn't just Y - it's Z" 37 | 38 | - Overly formal paragraph responses to casual questions 39 | 40 | - Enthusiastic but content-free responses ("That's incredible!", 41 | "Amazing!") 42 | 43 | - "Snappy" quips that sound clever but add little substance 44 | 45 | - Generic excitement without specific technical engagement 46 | 47 | - Perfectly structured responses that lack natural conversational flow 48 | 49 | - Responses that sound like they're trying too hard to be engaging 50 | 51 | 52 | Provide your analysis in the specified JSON format. 53 | - role: user 54 | content: | 55 | Analyze this content to determine if it's AI-generated: 56 | 57 | {{stdin}} 58 | model: openai/gpt-4o 59 | responseFormat: json_schema 60 | jsonSchema: |- 61 | { 62 | "name": "ai_detection_result", 63 | "strict": true, 64 | "schema": { 65 | "type": "object", 66 | "properties": { 67 | "reasoning": { 68 | "type": "string", 69 | "description": "Detailed explanation of the analysis, including which AI-generated content indicators were considered and why the conclusion was reached" 70 | }, 71 | "is_spam": { 72 | "type": "boolean", 73 | "description": "Whether the content is determined to be AI-generated (true) or human-written (false)" 74 | } 75 | }, 76 | "additionalProperties": false, 77 | "required": [ 78 | "reasoning", 79 | "is_spam" 80 | ] 81 | } 82 | } 83 | testData: 84 | - stdin: >- 85 | That's incredible! A 1M+ context window could unlock more coherent and 86 | nuanced responses. Subagents definitely seem like a promising 87 | direction—excited to see how this evolves and what people build with it! 88 | expected: spam 89 | - stdin: Looks like Claude just leveled up! Time to unleash the chaos! 90 | expected: 'true' 91 | - stdin: >- 92 | Damn, Claude out here remembering my childhood trauma just to roast me 93 | better. Next-level AI. 94 | expected: 'true' 95 | - stdin: >- 96 | Where are my sub-sub agents? I want a bro who just fixes padding and 97 | alignment issues 😆 98 | expected: 'false' 99 | - stdin: >- 100 | Ive been testing multiple agents and as my code base grew larger, the 101 | multi agents haven’t been so much effective. Then I went back to a single 102 | agent creating code with baby steps. How it’s going for you? 103 | expected: 'false' 104 | - stdin: 105 | this beast with claude 4 opus just gonna eat through your bank account :) 106 | expected: 'false' 107 | evaluators: 108 | - name: is-ai 109 | string: 110 | contains: '{{expected}}' 111 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | [fork]: https://github.com/github/ai-moderator/fork 4 | [pr]: https://github.com/github/ai-moderator/compare 5 | [code-of-conduct]: CODE_OF_CONDUCT.md 6 | 7 | Hi there! We're thrilled that you'd like to contribute to this project. Your 8 | help is essential for keeping it great. 9 | 10 | Contributions to this project are 11 | [released](https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license) 12 | to the public under the [project's open source license](LICENSE). 13 | 14 | Please note that this project is released with a [Contributor Code of 15 | Conduct][code-of-conduct]. By participating in this project you agree to abide 16 | by its terms. 17 | 18 | ## Found a bug? 19 | 20 | - **Ensure the bug was not already reported** by searching on GitHub under 21 | [Issues](https://github.com/github/ai-moderator/issues). 22 | - If you're unable to find an open issue addressing the problem, 23 | [open a new one](https://github.com/github/ai-moderator/issues/new). Be sure 24 | to include a **title and clear description**, as much relevant information as 25 | possible, and a **code sample** or a **reproducible test case** demonstrating 26 | the expected behavior that is not occurring. 27 | - If possible, use the relevant bug report templates to create the issue. 28 | 29 | ## What should I know before submitting a pull request or issue 30 | 31 | This project is written in [TypeScript](https://www.typescriptlang.org/), a 32 | typed variant of JavaScript, and we use [Prettier](https://prettier.io/) to get 33 | a consistent code style. 34 | 35 | Because of how GitHub Actions are run, the source code of this project is 36 | transpiled from TypeScript into JavaScript. The transpiled code (found in 37 | `lib/`) is subsequently compiled using 38 | [NCC](https://github.com/vercel/ncc/blob/master/readme.md) (found in `dist/`) to 39 | avoid having to include the `node_modules/` directory in the repository. 40 | 41 | ## Submitting a pull request 42 | 43 | 1. [Fork][fork] and clone the repository 44 | 1. Configure and install the dependencies: `npm install` 45 | 1. Create a new branch: `git checkout -b my-branch-name` 46 | 1. Make your change, add tests, and make sure the tests still pass: 47 | `npm run test` 48 | 1. Make sure your code is correctly formatted: `npm run format` 49 | 1. Update `dist/index.js` using `npm run bundle`. This creates a single 50 | JavaScript file that is used as an entrypoint for the action 51 | 1. Push to your fork and [submit a pull request][pr] 52 | 1. Pat yourself on the back and wait for your pull request to be reviewed and 53 | merged. 54 | 55 | Here are a few things you can do that will increase the likelihood of your pull 56 | request being accepted: 57 | 58 | - Write tests. 59 | - Keep your change as focused as possible. If there are multiple changes you 60 | would like to make that are not dependent upon each other, consider submitting 61 | them as separate pull requests. 62 | 63 | ## Releasing a new version 64 | 65 | All the concepts from 66 | [the actions/toolkit release docs](https://github.com/actions/toolkit/blob/main/docs/action-versioning.md) 67 | apply. Please read that first! 68 | 69 | Once the changes are merged into main, a repository maintainer should 70 | [draft a new release](https://github.com/github/ai-moderator/releases/new) 71 | pointing to the ref of the version bump you just made. Publish the release to 72 | the marketplace when complete. The corresponding major tag (v1, v2, etc) should 73 | be automatically updated. 74 | 75 | ## Licensed 76 | 77 | This repository uses a tool called 78 | [Licensed](https://github.com/github/licensed) to verify third party 79 | dependencies. You may need to locally install licensed and run `licensed cache` 80 | to update the dependency cache if you install or update a production dependency. 81 | If licensed cache is unable to determine the dependency, you may need to modify 82 | the cache file yourself to put the correct license. You should still verify the 83 | dependency, licensed is a tool to help, but is not a substitute for human review 84 | of dependencies. 85 | 86 | ## Resources 87 | 88 | - [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/) 89 | - [Using Pull Requests](https://help.github.com/articles/about-pull-requests/) 90 | - [GitHub Help](https://help.github.com) 91 | - [Writing good commit messages](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) 92 | 93 | Thanks! :heart: :heart: :heart: 94 | -------------------------------------------------------------------------------- /__tests__/index.test.ts: -------------------------------------------------------------------------------- 1 | import { jest } from '@jest/globals' 2 | import * as core from '@actions/core' 3 | import * as github from '@actions/github' 4 | 5 | // Mock only the external dependencies we need 6 | jest.mock('@actions/core') 7 | jest.mock('@actions/github') 8 | 9 | const mockCore = core as jest.Mocked 10 | 11 | // Import the functions we want to test directly 12 | import { extractFromEvent, shouldProcess } from '../src/content-extractor.js' 13 | 14 | // Helper to create minimal context objects 15 | const createMockContext = ( 16 | eventName: string, 17 | payload: unknown 18 | ): typeof github.context => 19 | ({ 20 | eventName, 21 | payload, 22 | // Add minimal required properties to satisfy the Context type 23 | sha: 'fake-sha', 24 | ref: 'refs/heads/main', 25 | workflow: 'test', 26 | action: 'test', 27 | actor: 'test', 28 | job: 'test', 29 | runNumber: 1, 30 | runId: 1, 31 | apiUrl: 'https://api.github.com', 32 | serverUrl: 'https://github.com', 33 | graphqlUrl: 'https://api.github.com/graphql', 34 | repo: { owner: 'test', repo: 'test' } 35 | }) as typeof github.context 36 | 37 | describe('Content Extraction', () => { 38 | describe('shouldProcess', () => { 39 | it('should process issue opened events', () => { 40 | const context = createMockContext('issues', { action: 'opened' }) 41 | expect(shouldProcess(context)).toBe(true) 42 | }) 43 | 44 | it('should process issue comment created events', () => { 45 | const context = createMockContext('issue_comment', { action: 'created' }) 46 | expect(shouldProcess(context)).toBe(true) 47 | }) 48 | 49 | it('should not process other events', () => { 50 | const context = createMockContext('push', {}) 51 | expect(shouldProcess(context)).toBe(false) 52 | }) 53 | 54 | it('should not process issue closed events', () => { 55 | const context = createMockContext('issues', { action: 'closed' }) 56 | expect(shouldProcess(context)).toBe(false) 57 | }) 58 | }) 59 | 60 | describe('extractFromEvent', () => { 61 | it('should extract content from issue opened event', () => { 62 | const context = createMockContext('issues', { 63 | action: 'opened', 64 | issue: { 65 | number: 123, 66 | node_id: 'issue-node-id', 67 | title: 'Test Issue', 68 | body: 'Issue body content', 69 | user: { login: 'testuser' } 70 | } 71 | }) 72 | 73 | const result = extractFromEvent(context) 74 | 75 | expect(result).toEqual({ 76 | content: 'Test Issue\nIssue body content', 77 | issueNumber: 123, 78 | commentNodeId: null 79 | }) 80 | }) 81 | 82 | it('should extract content from issue comment event', () => { 83 | const context = createMockContext('issue_comment', { 84 | action: 'created', 85 | issue: { number: 456 }, 86 | comment: { 87 | node_id: 'comment-node-id', 88 | body: 'This is a comment', 89 | user: { login: 'commenter' } 90 | } 91 | }) 92 | 93 | const result = extractFromEvent(context) 94 | 95 | expect(result).toEqual({ 96 | content: 'This is a comment', 97 | issueNumber: 456, 98 | commentNodeId: 'comment-node-id' 99 | }) 100 | }) 101 | 102 | it('should handle missing issue body', () => { 103 | const context = createMockContext('issues', { 104 | action: 'opened', 105 | issue: { 106 | number: 123, 107 | node_id: 'issue-node-id', 108 | title: 'Test Issue', 109 | body: null, 110 | user: { login: 'testuser' } 111 | } 112 | }) 113 | 114 | const result = extractFromEvent(context) 115 | 116 | expect(result).toEqual({ 117 | content: 'Test Issue\nnull', 118 | issueNumber: 123, 119 | commentNodeId: null 120 | }) 121 | }) 122 | 123 | it('should handle missing comment body', () => { 124 | const context = createMockContext('issue_comment', { 125 | action: 'created', 126 | issue: { number: 456 }, 127 | comment: { 128 | node_id: 'comment-node-id', 129 | body: null, 130 | user: { login: 'commenter' } 131 | } 132 | }) 133 | 134 | const result = extractFromEvent(context) 135 | 136 | expect(result).toEqual({ 137 | content: '', 138 | issueNumber: 456, 139 | commentNodeId: 'comment-node-id' 140 | }) 141 | }) 142 | }) 143 | }) 144 | 145 | describe('Core Actions Integration', () => { 146 | beforeEach(() => { 147 | jest.clearAllMocks() 148 | }) 149 | 150 | it('should read input values correctly', () => { 151 | // Since we're just testing that the mocked core module works, 152 | // we don't need complex implementation tests 153 | expect(mockCore.getInput).toBeDefined() 154 | expect(mockCore.setFailed).toBeDefined() 155 | expect(mockCore.info).toBeDefined() 156 | expect(mockCore.warning).toBeDefined() 157 | }) 158 | }) 159 | -------------------------------------------------------------------------------- /script/release: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Exit early 4 | # See: https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#The-Set-Builtin 5 | set -e 6 | 7 | # About: 8 | # 9 | # This is a helper script to tag and push a new release. GitHub Actions use 10 | # release tags to allow users to select a specific version of the action to use. 11 | # 12 | # See: https://github.com/actions/typescript-action#publishing-a-new-release 13 | # See: https://github.com/actions/toolkit/blob/master/docs/action-versioning.md#recommendations 14 | # 15 | # This script will do the following: 16 | # 17 | # 1. Retrieve the latest release tag 18 | # 2. Display the latest release tag 19 | # 3. Prompt the user for a new release tag 20 | # 4. Validate the new release tag 21 | # 5. Remind user to update the version field in package.json 22 | # 6. Tag a new release 23 | # 7. Set 'is_major_release' variable 24 | # 8. Point separate major release tag (e.g. v1, v2) to the new release 25 | # 9. Push the new tags (with commits, if any) to remote 26 | # 10. If this is a major release, create a 'releases/v#' branch and push 27 | # 28 | # Usage: 29 | # 30 | # script/release 31 | 32 | # Variables 33 | semver_tag_regex='v[0-9]+\.[0-9]+\.[0-9]+$' 34 | semver_tag_glob='v[0-9].[0-9].[0-9]*' 35 | git_remote='origin' 36 | major_semver_tag_regex='\(v[0-9]*\)' 37 | 38 | # Terminal colors 39 | OFF='\033[0m' 40 | BOLD_RED='\033[1;31m' 41 | BOLD_GREEN='\033[1;32m' 42 | BOLD_BLUE='\033[1;34m' 43 | BOLD_PURPLE='\033[1;35m' 44 | BOLD_UNDERLINED='\033[1;4m' 45 | BOLD='\033[1m' 46 | 47 | # 1. Retrieve the latest release tag 48 | if ! latest_tag=$(git describe --abbrev=0 --match="$semver_tag_glob"); then 49 | # There are no existing release tags 50 | echo -e "No tags found (yet) - Continue to create and push your first tag" 51 | latest_tag="[unknown]" 52 | fi 53 | 54 | # 2. Display the latest release tag 55 | echo -e "The latest release tag is: ${BOLD_BLUE}${latest_tag}${OFF}" 56 | 57 | # 3. Prompt the user for a new release tag 58 | read -r -p 'Enter a new release tag (vX.X.X format): ' new_tag 59 | 60 | # 4. Validate the new release tag 61 | if echo "$new_tag" | grep -q -E "$semver_tag_regex"; then 62 | # Release tag is valid 63 | echo -e "Tag: ${BOLD_BLUE}$new_tag${OFF} is valid syntax" 64 | else 65 | # Release tag is not in `vX.X.X` format 66 | echo -e "Tag: ${BOLD_BLUE}$new_tag${OFF} is ${BOLD_RED}not valid${OFF} (must be in ${BOLD}vX.X.X${OFF} format)" 67 | exit 1 68 | fi 69 | 70 | # 5. Remind user to update the version field in package.json 71 | echo -e -n "Make sure the version field in package.json is ${BOLD_BLUE}$new_tag${OFF}. Yes? [Y/${BOLD_UNDERLINED}n${OFF}] " 72 | read -r YN 73 | 74 | if [[ ! ($YN == "y" || $YN == "Y") ]]; then 75 | # Package.json version field is not up to date 76 | echo -e "Please update the package.json version to ${BOLD_PURPLE}$new_tag${OFF} and commit your changes" 77 | exit 1 78 | fi 79 | 80 | # 6. Tag a new release 81 | git tag "$new_tag" --annotate --message "$new_tag Release" 82 | echo -e "Tagged: ${BOLD_GREEN}$new_tag${OFF}" 83 | 84 | # 7. Set 'is_major_release' variable 85 | new_major_release_tag=$(expr "$new_tag" : "$major_semver_tag_regex") 86 | 87 | if [[ "$latest_tag" = "[unknown]" ]]; then 88 | # This is the first major release 89 | is_major_release='yes' 90 | else 91 | # Compare the major version of the latest tag with the new tag 92 | latest_major_release_tag=$(expr "$latest_tag" : "$major_semver_tag_regex") 93 | 94 | if ! [[ "$new_major_release_tag" = "$latest_major_release_tag" ]]; then 95 | is_major_release='yes' 96 | else 97 | is_major_release='no' 98 | fi 99 | fi 100 | 101 | # 8. Point separate major release tag (e.g. v1, v2) to the new release 102 | if [ $is_major_release = 'yes' ]; then 103 | # Create a new major version tag and point it to this release 104 | git tag "$new_major_release_tag" --annotate --message "$new_major_release_tag Release" 105 | echo -e "New major version tag: ${BOLD_GREEN}$new_major_release_tag${OFF}" 106 | else 107 | # Update the major version tag to point it to this release 108 | git tag "$latest_major_release_tag" --force --annotate --message "Sync $latest_major_release_tag tag with $new_tag" 109 | echo -e "Synced ${BOLD_GREEN}$latest_major_release_tag${OFF} with ${BOLD_GREEN}$new_tag${OFF}" 110 | fi 111 | 112 | # 9. Push the new tags (with commits, if any) to remote 113 | git push --follow-tags 114 | 115 | if [ $is_major_release = 'yes' ]; then 116 | # New major version tag is pushed with the '--follow-tags' flags 117 | echo -e "Tags: ${BOLD_GREEN}$new_major_release_tag${OFF} and ${BOLD_GREEN}$new_tag${OFF} pushed to remote" 118 | else 119 | # Force push the updated major version tag 120 | git push $git_remote "$latest_major_release_tag" --force 121 | echo -e "Tags: ${BOLD_GREEN}$latest_major_release_tag${OFF} and ${BOLD_GREEN}$new_tag${OFF} pushed to remote" 122 | fi 123 | 124 | # 10. If this is a major release, create a 'releases/v#' branch and push 125 | if [ $is_major_release = 'yes' ]; then 126 | git branch "releases/$new_major_release_tag" "$new_major_release_tag" 127 | echo -e "Branch: ${BOLD_BLUE}releases/$new_major_release_tag${OFF} created from ${BOLD_BLUE}$new_major_release_tag${OFF} tag" 128 | git push --set-upstream $git_remote "releases/$new_major_release_tag" 129 | echo -e "Branch: ${BOLD_GREEN}releases/$new_major_release_tag${OFF} pushed to remote" 130 | fi 131 | 132 | # Completed 133 | echo -e "${BOLD_GREEN}Done!${OFF}" 134 | -------------------------------------------------------------------------------- /__tests__/content-extractor.test.ts: -------------------------------------------------------------------------------- 1 | import * as github from '@actions/github' 2 | import { extractFromEvent, shouldProcess } from '../src/content-extractor.js' 3 | 4 | // Helper type for creating mock GitHub context objects 5 | type MockContext = Pick 6 | 7 | describe('Content Extractor Functions', () => { 8 | describe('extractFromEvent', () => { 9 | it('should extract content from issue opened event', () => { 10 | const context: MockContext = { 11 | eventName: 'issues', 12 | payload: { 13 | action: 'opened', 14 | issue: { 15 | number: 123, 16 | title: 'Bug Report', 17 | body: 'This is a bug description' 18 | } 19 | } 20 | } 21 | 22 | const result = extractFromEvent(context as typeof github.context) 23 | 24 | expect(result).toEqual({ 25 | content: 'Bug Report\nThis is a bug description', 26 | issueNumber: 123, 27 | commentNodeId: null 28 | }) 29 | }) 30 | 31 | it('should extract content from issue comment created event', () => { 32 | const context: MockContext = { 33 | eventName: 'issue_comment', 34 | payload: { 35 | action: 'created', 36 | comment: { 37 | id: 1, 38 | body: 'This is a comment', 39 | node_id: 'comment-node-123' 40 | }, 41 | issue: { 42 | number: 456 43 | } 44 | } 45 | } 46 | 47 | const result = extractFromEvent(context as typeof github.context) 48 | 49 | expect(result).toEqual({ 50 | content: 'This is a comment', 51 | issueNumber: 456, 52 | commentNodeId: 'comment-node-123' 53 | }) 54 | }) 55 | 56 | it('should extract content from pull request review comment created event', () => { 57 | const context: MockContext = { 58 | eventName: 'pull_request_review_comment', 59 | payload: { 60 | action: 'created', 61 | comment: { 62 | id: 2, 63 | body: 'Consider refactoring this', 64 | node_id: 'review-comment-node-789' 65 | }, 66 | pull_request: { 67 | number: 789 68 | } 69 | } 70 | } 71 | 72 | const result = extractFromEvent(context as typeof github.context) 73 | 74 | expect(result).toEqual({ 75 | content: 'Consider refactoring this', 76 | issueNumber: 789, 77 | commentNodeId: 'review-comment-node-789' 78 | }) 79 | }) 80 | 81 | it('should handle missing body content', () => { 82 | const context: MockContext = { 83 | eventName: 'issues', 84 | payload: { 85 | action: 'opened', 86 | issue: { 87 | number: 123, 88 | title: 'Issue without body', 89 | body: undefined 90 | } 91 | } 92 | } 93 | 94 | const result = extractFromEvent(context as typeof github.context) 95 | 96 | expect(result).toEqual({ 97 | content: 'Issue without body\nundefined', 98 | issueNumber: 123, 99 | commentNodeId: null 100 | }) 101 | }) 102 | 103 | it('should handle unsupported events by returning empty content', () => { 104 | const context: MockContext = { 105 | eventName: 'star', 106 | payload: { 107 | action: 'created' 108 | } 109 | } 110 | 111 | const result = extractFromEvent(context as typeof github.context) 112 | 113 | expect(result).toEqual({ 114 | content: '', 115 | issueNumber: null, 116 | commentNodeId: null 117 | }) 118 | }) 119 | }) 120 | 121 | describe('shouldProcess', () => { 122 | it('should return true for issues opened event', () => { 123 | const context: MockContext = { 124 | eventName: 'issues', 125 | payload: { action: 'opened' } 126 | } 127 | 128 | const result = shouldProcess(context as typeof github.context) 129 | expect(result).toBe(true) 130 | }) 131 | 132 | it('should return true for issue comment created event', () => { 133 | const context: MockContext = { 134 | eventName: 'issue_comment', 135 | payload: { action: 'created' } 136 | } 137 | 138 | const result = shouldProcess(context as typeof github.context) 139 | expect(result).toBe(true) 140 | }) 141 | 142 | it('should return true for pull request review comment created event', () => { 143 | const context: MockContext = { 144 | eventName: 'pull_request_review_comment', 145 | payload: { action: 'created' } 146 | } 147 | 148 | const result = shouldProcess(context as typeof github.context) 149 | expect(result).toBe(true) 150 | }) 151 | 152 | it('should return false for unsupported events', () => { 153 | const context: MockContext = { 154 | eventName: 'star', 155 | payload: { action: 'created' } 156 | } 157 | 158 | const result = shouldProcess(context as typeof github.context) 159 | expect(result).toBe(false) 160 | }) 161 | 162 | it('should return false for unsupported actions', () => { 163 | const context: MockContext = { 164 | eventName: 'issues', 165 | payload: { action: 'closed' } 166 | } 167 | 168 | const result = shouldProcess(context as typeof github.context) 169 | expect(result).toBe(false) 170 | }) 171 | }) 172 | }) 173 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AI Moderator 2 | 3 | An AI-powered GitHub Action that automatically detects spam in issues and 4 | comments using LLMs. Detected issues are tagged as spam and detected comments 5 | are (optionally) minimized. 6 | 7 | Each new issue and comment is passed through a series of prompts: by default 8 | checking for link spam, regular spam, and AI-generated content, but you can 9 | [write your own custom prompt](#custom-prompts) if you've got more specific 10 | requirements. 11 | 12 | ## Usage 13 | 14 | Add this action to your repository's workflow file (e.g., 15 | `.github/workflows/moderator.yml`): 16 | 17 | ```yaml 18 | name: AI Moderator 19 | on: 20 | issues: 21 | types: [opened] 22 | issue_comment: 23 | types: [created] 24 | pull_request_review_comment: 25 | types: [created] 26 | 27 | jobs: 28 | spam-detection: 29 | runs-on: ubuntu-latest 30 | permissions: 31 | issues: write 32 | pull-requests: write 33 | models: read 34 | contents: read 35 | steps: 36 | - uses: actions/checkout@v4 37 | - uses: github/ai-moderator@v1 38 | with: 39 | token: ${{ secrets.GITHUB_TOKEN }} 40 | spam-label: 'spam' 41 | ai-label: 'ai-generated' 42 | minimize-detected-comments: true 43 | # Built-in prompt configuration (all enabled by default) 44 | enable-spam-detection: true 45 | enable-link-spam-detection: true 46 | enable-ai-detection: true 47 | # custom-prompt-path: '.github/prompts/my-custom.prompt.yml' # Optional 48 | ``` 49 | 50 | ### Configuration 51 | 52 | | Input | Description | Default | Required | 53 | | ---------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------ | -------- | 54 | | `token` | GitHub token with issues and pull-requests permissions | `${{ github.token }}` | No | 55 | | `spam-label` | Label to add when generic spam is detected | `spam` | No | 56 | | `ai-label` | Label to add when AI-generated content is detected | `ai-generated` | No | 57 | | `minimize-detected-comments` | Whether to minimize comments detected as spam | `true` | No | 58 | | `dry-run` | If true, only evaluate without adding labels or minimizing comments | `false` | No | 59 | | `custom-prompt-path` | Path to a custom YAML prompt file in your repository (relative to repository root) | (none) | No | 60 | | `enable-spam-detection` | Enable built-in spam detection prompt | `true` | No | 61 | | `enable-link-spam-detection` | Enable built-in link spam detection prompt | `true` | No | 62 | | `enable-ai-detection` | Enable built-in AI-generated content detection prompt | `true` | No | 63 | | `endpoint` | The endpoint to use for inference | `https://models.github.ai/inference` | No | 64 | 65 | ## Inference 66 | 67 | The action does not require any external API keys for inference - it uses the 68 | built-in GitHub token with `models: read` permission to access GitHub Models. 69 | 70 | Every GitHub user has GitHub Models inference for free, but if you're running 71 | into rate limiting issues you can choose to 72 | [opt in to paid usage](https://docs.github.com/en/billing/managing-billing-for-your-products/about-billing-for-github-models). 73 | 74 | ### Default prompts 75 | 76 | The action uses built-in YAML prompts located in the `prompts/` directory. Each 77 | prompt can be individually enabled or disabled using the configuration options: 78 | 79 | - **`spam-detection.prompt.yml`**: Detects promotional content, scams, and 80 | irrelevant posts (controlled by `enable-spam-detection`) 81 | - **`ai-detection.prompt.yml`**: Identifies AI-generated content patterns 82 | (controlled by `enable-ai-detection`) 83 | - **`link-spam-detection.prompt.yml`**: Focuses on suspicious links and URLs 84 | (controlled by `enable-link-spam-detection`) 85 | 86 | All prompts are enabled by default. You can selectively disable them based on 87 | your repository's moderation needs: 88 | 89 | ```yaml 90 | - uses: github/ai-moderator 91 | with: 92 | token: ${{ secrets.GITHUB_TOKEN }} 93 | enable-spam-detection: true # Enable general spam detection 94 | enable-link-spam-detection: false # Disable link spam detection 95 | enable-ai-detection: true # Enable AI content detection 96 | ``` 97 | 98 | You can iterate on or tweak these prompts via the 99 | [Models tab](https://github.com/github/ai-moderator/models) on this repository. 100 | If you want to push an update to this prompt, please also include updated test 101 | data so we can see the effect of the prompt update. 102 | 103 | ### Custom prompts 104 | 105 | You can also provide your own custom prompt file in your repository using the 106 | `custom-prompt-path` input: 107 | 108 | ```yaml 109 | - uses: github/ai-moderator 110 | with: 111 | token: ${{ secrets.GITHUB_TOKEN }} 112 | custom-prompt-path: '.github/prompts/my-custom-spam-detection.prompt.yml' 113 | ``` 114 | 115 | Custom prompt files should follow the same YAML format as the built-in prompts. 116 | An example custom prompt file is included at 117 | `.github/prompts/example-custom.prompt.yml` that demonstrates the proper format 118 | and shows how to create repository-specific spam detection rules. 119 | 120 | ## Development 121 | 122 | ```bash 123 | # Install dependencies 124 | npm install 125 | 126 | # Run tests 127 | npm test 128 | 129 | # Build the action 130 | npm run package 131 | 132 | # Run linting 133 | npm run lint 134 | ``` 135 | 136 | ### Testing 137 | 138 | The action includes comprehensive tests for all modules: 139 | 140 | ```bash 141 | # Run all tests with coverage 142 | npm run test 143 | 144 | # Run tests in watch mode 145 | npm run test:watch 146 | ``` 147 | 148 | ## License 149 | 150 | This project is licensed under the terms of the MIT open source license. Please 151 | refer to [LICENSE](./LICENSE) for the full terms. 152 | -------------------------------------------------------------------------------- /src/prompt.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs/promises' 2 | import { join, basename } from 'path' 3 | import * as yaml from 'js-yaml' 4 | import type { OpenAI } from 'openai' 5 | 6 | interface PromptMessage { 7 | role: 'system' | 'user' | 'assistant' 8 | content: string 9 | } 10 | 11 | interface PromptConfig { 12 | messages: PromptMessage[] 13 | model?: string 14 | responseFormat?: string 15 | jsonSchema?: string 16 | } 17 | 18 | interface BuiltInPromptConfig { 19 | enableSpamDetection: boolean 20 | enableLinkSpamDetection: boolean 21 | enableAiDetection: boolean 22 | } 23 | 24 | // Response interfaces for different detection types 25 | interface SpamDetectionResult { 26 | reasoning: string 27 | is_spam: boolean 28 | confidence: number 29 | spam_indicators: string[] 30 | } 31 | 32 | interface AIDetectionResult { 33 | reasoning: string 34 | is_ai_generated: boolean 35 | confidence: number 36 | ai_indicators: string[] 37 | } 38 | 39 | interface LinkSpamDetectionResult { 40 | reasoning: string 41 | contains_link_spam: boolean 42 | confidence: number 43 | suspicious_links: string[] 44 | spam_indicators: string[] 45 | } 46 | 47 | interface BotDetectionResult { 48 | reasoning: string 49 | is_bot_like: boolean 50 | confidence: number 51 | bot_indicators: string[] 52 | } 53 | 54 | type DetectionResult = 55 | | SpamDetectionResult 56 | | AIDetectionResult 57 | | LinkSpamDetectionResult 58 | | BotDetectionResult 59 | 60 | /** 61 | * Load and parse a prompt YAML file 62 | */ 63 | async function loadPrompt(promptPath: string): Promise { 64 | const content = await fs.readFile(promptPath, 'utf-8') 65 | const config = yaml.load(content) as PromptConfig 66 | 67 | if (!config?.messages || !Array.isArray(config.messages)) { 68 | throw new Error( 69 | `Invalid prompt format in ${promptPath}: missing messages array` 70 | ) 71 | } 72 | 73 | return config 74 | } 75 | 76 | /** 77 | * Run a single prompt through OpenAI and return the parsed JSON result 78 | */ 79 | export async function runPrompt( 80 | openai: OpenAI, 81 | promptPath: string, 82 | content: string 83 | ): Promise { 84 | try { 85 | const promptConfig = await loadPrompt(promptPath) 86 | 87 | // Prepare messages by replacing {{stdin}} template with actual content 88 | const messages = promptConfig.messages.map((msg) => { 89 | return { 90 | ...msg, 91 | content: msg.content.replace('{{stdin}}', content) 92 | } 93 | }) 94 | 95 | // Prepare the API call parameters 96 | const params: OpenAI.Chat.Completions.ChatCompletionCreateParams = { 97 | model: promptConfig.model || 'gpt-4o', 98 | messages: messages, 99 | temperature: 0 // Make responses deterministic 100 | } 101 | 102 | // Add JSON schema parameters if present 103 | if ( 104 | promptConfig.responseFormat === 'json_schema' && 105 | promptConfig.jsonSchema 106 | ) { 107 | params.response_format = { 108 | type: 'json_schema', 109 | json_schema: JSON.parse(promptConfig.jsonSchema) 110 | } 111 | } 112 | 113 | const response = await openai.chat.completions.create(params) 114 | 115 | const output = response.choices[0]?.message?.content?.trim() || '' 116 | 117 | try { 118 | return JSON.parse(output) as DetectionResult 119 | } catch (parseError) { 120 | console.error( 121 | `Error parsing JSON response from ${promptPath}:`, 122 | parseError 123 | ) 124 | console.error(`Raw response: ${output}`) 125 | throw new Error(`Invalid JSON response from prompt: ${output}`) 126 | } 127 | } catch (error) { 128 | console.error(`Error running prompt ${promptPath}:`, error) 129 | throw error 130 | } 131 | } 132 | 133 | /** 134 | * Get all prompt files from a directory 135 | */ 136 | export async function getPromptFiles(promptsDir: string): Promise { 137 | const files = await fs.readdir(promptsDir) 138 | return files 139 | .filter((f: string) => f.endsWith('.prompt.yml')) 140 | .map((f: string) => join(promptsDir, f)) 141 | } 142 | 143 | /** 144 | * Evaluate content against all prompts in a directory 145 | */ 146 | export async function evaluateContent( 147 | openai: OpenAI, 148 | promptsDir: string, 149 | content: string, 150 | customPromptPath?: string, 151 | builtInConfig?: BuiltInPromptConfig 152 | ): Promise<{ spam: boolean; ai: boolean }> { 153 | const files = await getPromptFiles(promptsDir) 154 | const flags = { spam: false, ai: false } 155 | 156 | // Filter built-in prompts based on configuration 157 | const filteredFiles = files.filter((file) => { 158 | const filename = basename(file).toLowerCase() 159 | 160 | if (filename.includes('ai-detection')) { 161 | return builtInConfig?.enableAiDetection !== false 162 | } else if (filename.includes('spam-detection')) { 163 | return builtInConfig?.enableSpamDetection !== false 164 | } else if (filename.includes('link-spam')) { 165 | return builtInConfig?.enableLinkSpamDetection !== false 166 | } 167 | 168 | // Include unknown prompt types by default 169 | return true 170 | }) 171 | 172 | // Add custom prompt file if provided 173 | const allFiles = [...filteredFiles] 174 | if (customPromptPath && customPromptPath.trim()) { 175 | try { 176 | // Resolve custom prompt path relative to workspace root 177 | const workspaceRoot = process.env.GITHUB_WORKSPACE || process.cwd() 178 | const resolvedCustomPath = join(workspaceRoot, customPromptPath.trim()) 179 | 180 | // Check if custom prompt file exists 181 | await fs.access(resolvedCustomPath) 182 | allFiles.unshift(resolvedCustomPath) // Add custom prompt first so it runs before built-in prompts 183 | console.log(`Using custom prompt: ${resolvedCustomPath}`) 184 | } catch (error) { 185 | console.warn( 186 | `Custom prompt file not found or inaccessible: ${customPromptPath}` 187 | ) 188 | console.warn(`Error: ${error}`) 189 | } 190 | } 191 | 192 | for (const file of allFiles) { 193 | const filename = basename(file).toLowerCase() 194 | const isCustomPrompt = 195 | file === allFiles[0] && customPromptPath && customPromptPath.trim() 196 | const isAIPrompt = filename.includes('ai-detection') 197 | const isSpamPrompt = 198 | filename.includes('spam-detection') || 199 | filename.includes('bot-detection') || 200 | filename.includes('link-spam') || 201 | isCustomPrompt // Custom prompts are treated as spam detection by default 202 | 203 | if (!isAIPrompt && !isSpamPrompt) { 204 | continue // Skip unknown prompt types 205 | } 206 | 207 | try { 208 | const result = await runPrompt(openai, file, content) 209 | 210 | let isDetected = false 211 | if ('is_spam' in result) { 212 | isDetected = result.is_spam 213 | } 214 | 215 | // Log the detailed results 216 | console.log(`\n=== ${basename(file)} ===`) 217 | console.log(`Result: ${isDetected}`) 218 | console.log(`Reasoning: ${result.reasoning}`) 219 | 220 | if (isDetected) { 221 | if (isAIPrompt) { 222 | flags.ai = true 223 | } else if (isSpamPrompt) { 224 | flags.spam = true 225 | } 226 | } 227 | } catch (error) { 228 | // Continue with other prompts even if one fails 229 | console.error(`Error evaluating prompt ${basename(file)}:`, error) 230 | } 231 | } 232 | 233 | return flags 234 | } 235 | -------------------------------------------------------------------------------- /.licenses/npm/openai.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: openai 3 | version: 5.12.2 4 | type: npm 5 | summary: The official TypeScript library for the OpenAI API 6 | homepage: 7 | license: apache-2.0 8 | licenses: 9 | - sources: LICENSE 10 | text: |2 11 | Apache License 12 | Version 2.0, January 2004 13 | http://www.apache.org/licenses/ 14 | 15 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 16 | 17 | 1. Definitions. 18 | 19 | "License" shall mean the terms and conditions for use, reproduction, 20 | and distribution as defined by Sections 1 through 9 of this document. 21 | 22 | "Licensor" shall mean the copyright owner or entity authorized by 23 | the copyright owner that is granting the License. 24 | 25 | "Legal Entity" shall mean the union of the acting entity and all 26 | other entities that control, are controlled by, or are under common 27 | control with that entity. For the purposes of this definition, 28 | "control" means (i) the power, direct or indirect, to cause the 29 | direction or management of such entity, whether by contract or 30 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 31 | outstanding shares, or (iii) beneficial ownership of such entity. 32 | 33 | "You" (or "Your") shall mean an individual or Legal Entity 34 | exercising permissions granted by this License. 35 | 36 | "Source" form shall mean the preferred form for making modifications, 37 | including but not limited to software source code, documentation 38 | source, and configuration files. 39 | 40 | "Object" form shall mean any form resulting from mechanical 41 | transformation or translation of a Source form, including but 42 | not limited to compiled object code, generated documentation, 43 | and conversions to other media types. 44 | 45 | "Work" shall mean the work of authorship, whether in Source or 46 | Object form, made available under the License, as indicated by a 47 | copyright notice that is included in or attached to the work 48 | (an example is provided in the Appendix below). 49 | 50 | "Derivative Works" shall mean any work, whether in Source or Object 51 | form, that is based on (or derived from) the Work and for which the 52 | editorial revisions, annotations, elaborations, or other modifications 53 | represent, as a whole, an original work of authorship. For the purposes 54 | of this License, Derivative Works shall not include works that remain 55 | separable from, or merely link (or bind by name) to the interfaces of, 56 | the Work and Derivative Works thereof. 57 | 58 | "Contribution" shall mean any work of authorship, including 59 | the original version of the Work and any modifications or additions 60 | to that Work or Derivative Works thereof, that is intentionally 61 | submitted to Licensor for inclusion in the Work by the copyright owner 62 | or by an individual or Legal Entity authorized to submit on behalf of 63 | the copyright owner. For the purposes of this definition, "submitted" 64 | means any form of electronic, verbal, or written communication sent 65 | to the Licensor or its representatives, including but not limited to 66 | communication on electronic mailing lists, source code control systems, 67 | and issue tracking systems that are managed by, or on behalf of, the 68 | Licensor for the purpose of discussing and improving the Work, but 69 | excluding communication that is conspicuously marked or otherwise 70 | designated in writing by the copyright owner as "Not a Contribution." 71 | 72 | "Contributor" shall mean Licensor and any individual or Legal Entity 73 | on behalf of whom a Contribution has been received by Licensor and 74 | subsequently incorporated within the Work. 75 | 76 | 2. Grant of Copyright License. Subject to the terms and conditions of 77 | this License, each Contributor hereby grants to You a perpetual, 78 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 79 | copyright license to reproduce, prepare Derivative Works of, 80 | publicly display, publicly perform, sublicense, and distribute the 81 | Work and such Derivative Works in Source or Object form. 82 | 83 | 3. Grant of Patent License. Subject to the terms and conditions of 84 | this License, each Contributor hereby grants to You a perpetual, 85 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 86 | (except as stated in this section) patent license to make, have made, 87 | use, offer to sell, sell, import, and otherwise transfer the Work, 88 | where such license applies only to those patent claims licensable 89 | by such Contributor that are necessarily infringed by their 90 | Contribution(s) alone or by combination of their Contribution(s) 91 | with the Work to which such Contribution(s) was submitted. If You 92 | institute patent litigation against any entity (including a 93 | cross-claim or counterclaim in a lawsuit) alleging that the Work 94 | or a Contribution incorporated within the Work constitutes direct 95 | or contributory patent infringement, then any patent licenses 96 | granted to You under this License for that Work shall terminate 97 | as of the date such litigation is filed. 98 | 99 | 4. Redistribution. You may reproduce and distribute copies of the 100 | Work or Derivative Works thereof in any medium, with or without 101 | modifications, and in Source or Object form, provided that You 102 | meet the following conditions: 103 | 104 | (a) You must give any other recipients of the Work or 105 | Derivative Works a copy of this License; and 106 | 107 | (b) You must cause any modified files to carry prominent notices 108 | stating that You changed the files; and 109 | 110 | (c) You must retain, in the Source form of any Derivative Works 111 | that You distribute, all copyright, patent, trademark, and 112 | attribution notices from the Source form of the Work, 113 | excluding those notices that do not pertain to any part of 114 | the Derivative Works; and 115 | 116 | (d) If the Work includes a "NOTICE" text file as part of its 117 | distribution, then any Derivative Works that You distribute must 118 | include a readable copy of the attribution notices contained 119 | within such NOTICE file, excluding those notices that do not 120 | pertain to any part of the Derivative Works, in at least one 121 | of the following places: within a NOTICE text file distributed 122 | as part of the Derivative Works; within the Source form or 123 | documentation, if provided along with the Derivative Works; or, 124 | within a display generated by the Derivative Works, if and 125 | wherever such third-party notices normally appear. The contents 126 | of the NOTICE file are for informational purposes only and 127 | do not modify the License. You may add Your own attribution 128 | notices within Derivative Works that You distribute, alongside 129 | or as an addendum to the NOTICE text from the Work, provided 130 | that such additional attribution notices cannot be construed 131 | as modifying the License. 132 | 133 | You may add Your own copyright statement to Your modifications and 134 | may provide additional or different license terms and conditions 135 | for use, reproduction, or distribution of Your modifications, or 136 | for any such Derivative Works as a whole, provided Your use, 137 | reproduction, and distribution of the Work otherwise complies with 138 | the conditions stated in this License. 139 | 140 | 5. Submission of Contributions. Unless You explicitly state otherwise, 141 | any Contribution intentionally submitted for inclusion in the Work 142 | by You to the Licensor shall be under the terms and conditions of 143 | this License, without any additional terms or conditions. 144 | Notwithstanding the above, nothing herein shall supersede or modify 145 | the terms of any separate license agreement you may have executed 146 | with Licensor regarding such Contributions. 147 | 148 | 6. Trademarks. This License does not grant permission to use the trade 149 | names, trademarks, service marks, or product names of the Licensor, 150 | except as required for reasonable and customary use in describing the 151 | origin of the Work and reproducing the content of the NOTICE file. 152 | 153 | 7. Disclaimer of Warranty. Unless required by applicable law or 154 | agreed to in writing, Licensor provides the Work (and each 155 | Contributor provides its Contributions) on an "AS IS" BASIS, 156 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 157 | implied, including, without limitation, any warranties or conditions 158 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 159 | PARTICULAR PURPOSE. You are solely responsible for determining the 160 | appropriateness of using or redistributing the Work and assume any 161 | risks associated with Your exercise of permissions under this License. 162 | 163 | 8. Limitation of Liability. In no event and under no legal theory, 164 | whether in tort (including negligence), contract, or otherwise, 165 | unless required by applicable law (such as deliberate and grossly 166 | negligent acts) or agreed to in writing, shall any Contributor be 167 | liable to You for damages, including any direct, indirect, special, 168 | incidental, or consequential damages of any character arising as a 169 | result of this License or out of the use or inability to use the 170 | Work (including but not limited to damages for loss of goodwill, 171 | work stoppage, computer failure or malfunction, or any and all 172 | other commercial damages or losses), even if such Contributor 173 | has been advised of the possibility of such damages. 174 | 175 | 9. Accepting Warranty or Additional Liability. While redistributing 176 | the Work or Derivative Works thereof, You may choose to offer, 177 | and charge a fee for, acceptance of support, warranty, indemnity, 178 | or other liability obligations and/or rights consistent with this 179 | License. However, in accepting such obligations, You may act only 180 | on Your own behalf and on Your sole responsibility, not on behalf 181 | of any other Contributor, and only if You agree to indemnify, 182 | defend, and hold each Contributor harmless for any liability 183 | incurred by, or claims asserted against, such Contributor by reason 184 | of your accepting any such warranty or additional liability. 185 | 186 | END OF TERMS AND CONDITIONS 187 | 188 | APPENDIX: How to apply the Apache License to your work. 189 | 190 | To apply the Apache License to your work, attach the following 191 | boilerplate notice, with the fields enclosed by brackets "[]" 192 | replaced with your own identifying information. (Don't include 193 | the brackets!) The text should be enclosed in the appropriate 194 | comment syntax for the file format. We also recommend that a 195 | file or class name and description of purpose be included on the 196 | same "printed page" as the copyright notice for easier 197 | identification within third-party archives. 198 | 199 | Copyright 2025 OpenAI 200 | 201 | Licensed under the Apache License, Version 2.0 (the "License"); 202 | you may not use this file except in compliance with the License. 203 | You may obtain a copy of the License at 204 | 205 | http://www.apache.org/licenses/LICENSE-2.0 206 | 207 | Unless required by applicable law or agreed to in writing, software 208 | distributed under the License is distributed on an "AS IS" BASIS, 209 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 210 | See the License for the specific language governing permissions and 211 | limitations under the License. 212 | notices: [] 213 | -------------------------------------------------------------------------------- /.licenses/npm/before-after-hook.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: before-after-hook 3 | version: 2.2.3 4 | type: npm 5 | summary: asynchronous before/error/after hooks for internal functionality 6 | homepage: 7 | license: apache-2.0 8 | licenses: 9 | - sources: LICENSE 10 | text: |2 11 | Apache License 12 | Version 2.0, January 2004 13 | http://www.apache.org/licenses/ 14 | 15 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 16 | 17 | 1. Definitions. 18 | 19 | "License" shall mean the terms and conditions for use, reproduction, 20 | and distribution as defined by Sections 1 through 9 of this document. 21 | 22 | "Licensor" shall mean the copyright owner or entity authorized by 23 | the copyright owner that is granting the License. 24 | 25 | "Legal Entity" shall mean the union of the acting entity and all 26 | other entities that control, are controlled by, or are under common 27 | control with that entity. For the purposes of this definition, 28 | "control" means (i) the power, direct or indirect, to cause the 29 | direction or management of such entity, whether by contract or 30 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 31 | outstanding shares, or (iii) beneficial ownership of such entity. 32 | 33 | "You" (or "Your") shall mean an individual or Legal Entity 34 | exercising permissions granted by this License. 35 | 36 | "Source" form shall mean the preferred form for making modifications, 37 | including but not limited to software source code, documentation 38 | source, and configuration files. 39 | 40 | "Object" form shall mean any form resulting from mechanical 41 | transformation or translation of a Source form, including but 42 | not limited to compiled object code, generated documentation, 43 | and conversions to other media types. 44 | 45 | "Work" shall mean the work of authorship, whether in Source or 46 | Object form, made available under the License, as indicated by a 47 | copyright notice that is included in or attached to the work 48 | (an example is provided in the Appendix below). 49 | 50 | "Derivative Works" shall mean any work, whether in Source or Object 51 | form, that is based on (or derived from) the Work and for which the 52 | editorial revisions, annotations, elaborations, or other modifications 53 | represent, as a whole, an original work of authorship. For the purposes 54 | of this License, Derivative Works shall not include works that remain 55 | separable from, or merely link (or bind by name) to the interfaces of, 56 | the Work and Derivative Works thereof. 57 | 58 | "Contribution" shall mean any work of authorship, including 59 | the original version of the Work and any modifications or additions 60 | to that Work or Derivative Works thereof, that is intentionally 61 | submitted to Licensor for inclusion in the Work by the copyright owner 62 | or by an individual or Legal Entity authorized to submit on behalf of 63 | the copyright owner. For the purposes of this definition, "submitted" 64 | means any form of electronic, verbal, or written communication sent 65 | to the Licensor or its representatives, including but not limited to 66 | communication on electronic mailing lists, source code control systems, 67 | and issue tracking systems that are managed by, or on behalf of, the 68 | Licensor for the purpose of discussing and improving the Work, but 69 | excluding communication that is conspicuously marked or otherwise 70 | designated in writing by the copyright owner as "Not a Contribution." 71 | 72 | "Contributor" shall mean Licensor and any individual or Legal Entity 73 | on behalf of whom a Contribution has been received by Licensor and 74 | subsequently incorporated within the Work. 75 | 76 | 2. Grant of Copyright License. Subject to the terms and conditions of 77 | this License, each Contributor hereby grants to You a perpetual, 78 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 79 | copyright license to reproduce, prepare Derivative Works of, 80 | publicly display, publicly perform, sublicense, and distribute the 81 | Work and such Derivative Works in Source or Object form. 82 | 83 | 3. Grant of Patent License. Subject to the terms and conditions of 84 | this License, each Contributor hereby grants to You a perpetual, 85 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 86 | (except as stated in this section) patent license to make, have made, 87 | use, offer to sell, sell, import, and otherwise transfer the Work, 88 | where such license applies only to those patent claims licensable 89 | by such Contributor that are necessarily infringed by their 90 | Contribution(s) alone or by combination of their Contribution(s) 91 | with the Work to which such Contribution(s) was submitted. If You 92 | institute patent litigation against any entity (including a 93 | cross-claim or counterclaim in a lawsuit) alleging that the Work 94 | or a Contribution incorporated within the Work constitutes direct 95 | or contributory patent infringement, then any patent licenses 96 | granted to You under this License for that Work shall terminate 97 | as of the date such litigation is filed. 98 | 99 | 4. Redistribution. You may reproduce and distribute copies of the 100 | Work or Derivative Works thereof in any medium, with or without 101 | modifications, and in Source or Object form, provided that You 102 | meet the following conditions: 103 | 104 | (a) You must give any other recipients of the Work or 105 | Derivative Works a copy of this License; and 106 | 107 | (b) You must cause any modified files to carry prominent notices 108 | stating that You changed the files; and 109 | 110 | (c) You must retain, in the Source form of any Derivative Works 111 | that You distribute, all copyright, patent, trademark, and 112 | attribution notices from the Source form of the Work, 113 | excluding those notices that do not pertain to any part of 114 | the Derivative Works; and 115 | 116 | (d) If the Work includes a "NOTICE" text file as part of its 117 | distribution, then any Derivative Works that You distribute must 118 | include a readable copy of the attribution notices contained 119 | within such NOTICE file, excluding those notices that do not 120 | pertain to any part of the Derivative Works, in at least one 121 | of the following places: within a NOTICE text file distributed 122 | as part of the Derivative Works; within the Source form or 123 | documentation, if provided along with the Derivative Works; or, 124 | within a display generated by the Derivative Works, if and 125 | wherever such third-party notices normally appear. The contents 126 | of the NOTICE file are for informational purposes only and 127 | do not modify the License. You may add Your own attribution 128 | notices within Derivative Works that You distribute, alongside 129 | or as an addendum to the NOTICE text from the Work, provided 130 | that such additional attribution notices cannot be construed 131 | as modifying the License. 132 | 133 | You may add Your own copyright statement to Your modifications and 134 | may provide additional or different license terms and conditions 135 | for use, reproduction, or distribution of Your modifications, or 136 | for any such Derivative Works as a whole, provided Your use, 137 | reproduction, and distribution of the Work otherwise complies with 138 | the conditions stated in this License. 139 | 140 | 5. Submission of Contributions. Unless You explicitly state otherwise, 141 | any Contribution intentionally submitted for inclusion in the Work 142 | by You to the Licensor shall be under the terms and conditions of 143 | this License, without any additional terms or conditions. 144 | Notwithstanding the above, nothing herein shall supersede or modify 145 | the terms of any separate license agreement you may have executed 146 | with Licensor regarding such Contributions. 147 | 148 | 6. Trademarks. This License does not grant permission to use the trade 149 | names, trademarks, service marks, or product names of the Licensor, 150 | except as required for reasonable and customary use in describing the 151 | origin of the Work and reproducing the content of the NOTICE file. 152 | 153 | 7. Disclaimer of Warranty. Unless required by applicable law or 154 | agreed to in writing, Licensor provides the Work (and each 155 | Contributor provides its Contributions) on an "AS IS" BASIS, 156 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 157 | implied, including, without limitation, any warranties or conditions 158 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 159 | PARTICULAR PURPOSE. You are solely responsible for determining the 160 | appropriateness of using or redistributing the Work and assume any 161 | risks associated with Your exercise of permissions under this License. 162 | 163 | 8. Limitation of Liability. In no event and under no legal theory, 164 | whether in tort (including negligence), contract, or otherwise, 165 | unless required by applicable law (such as deliberate and grossly 166 | negligent acts) or agreed to in writing, shall any Contributor be 167 | liable to You for damages, including any direct, indirect, special, 168 | incidental, or consequential damages of any character arising as a 169 | result of this License or out of the use or inability to use the 170 | Work (including but not limited to damages for loss of goodwill, 171 | work stoppage, computer failure or malfunction, or any and all 172 | other commercial damages or losses), even if such Contributor 173 | has been advised of the possibility of such damages. 174 | 175 | 9. Accepting Warranty or Additional Liability. While redistributing 176 | the Work or Derivative Works thereof, You may choose to offer, 177 | and charge a fee for, acceptance of support, warranty, indemnity, 178 | or other liability obligations and/or rights consistent with this 179 | License. However, in accepting such obligations, You may act only 180 | on Your own behalf and on Your sole responsibility, not on behalf 181 | of any other Contributor, and only if You agree to indemnify, 182 | defend, and hold each Contributor harmless for any liability 183 | incurred by, or claims asserted against, such Contributor by reason 184 | of your accepting any such warranty or additional liability. 185 | 186 | END OF TERMS AND CONDITIONS 187 | 188 | APPENDIX: How to apply the Apache License to your work. 189 | 190 | To apply the Apache License to your work, attach the following 191 | boilerplate notice, with the fields enclosed by brackets "{}" 192 | replaced with your own identifying information. (Don't include 193 | the brackets!) The text should be enclosed in the appropriate 194 | comment syntax for the file format. We also recommend that a 195 | file or class name and description of purpose be included on the 196 | same "printed page" as the copyright notice for easier 197 | identification within third-party archives. 198 | 199 | Copyright 2018 Gregor Martynus and other contributors. 200 | 201 | Licensed under the Apache License, Version 2.0 (the "License"); 202 | you may not use this file except in compliance with the License. 203 | You may obtain a copy of the License at 204 | 205 | http://www.apache.org/licenses/LICENSE-2.0 206 | 207 | Unless required by applicable law or agreed to in writing, software 208 | distributed under the License is distributed on an "AS IS" BASIS, 209 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 210 | See the License for the specific language governing permissions and 211 | limitations under the License. 212 | - sources: README.md 213 | text: "[Apache 2.0](LICENSE)" 214 | notices: [] 215 | -------------------------------------------------------------------------------- /.licenses/npm/argparse.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: argparse 3 | version: 2.0.1 4 | type: npm 5 | summary: CLI arguments parser. Native port of python's argparse. 6 | homepage: 7 | license: other 8 | licenses: 9 | - sources: LICENSE 10 | text: | 11 | A. HISTORY OF THE SOFTWARE 12 | ========================== 13 | 14 | Python was created in the early 1990s by Guido van Rossum at Stichting 15 | Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands 16 | as a successor of a language called ABC. Guido remains Python's 17 | principal author, although it includes many contributions from others. 18 | 19 | In 1995, Guido continued his work on Python at the Corporation for 20 | National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) 21 | in Reston, Virginia where he released several versions of the 22 | software. 23 | 24 | In May 2000, Guido and the Python core development team moved to 25 | BeOpen.com to form the BeOpen PythonLabs team. In October of the same 26 | year, the PythonLabs team moved to Digital Creations, which became 27 | Zope Corporation. In 2001, the Python Software Foundation (PSF, see 28 | https://www.python.org/psf/) was formed, a non-profit organization 29 | created specifically to own Python-related Intellectual Property. 30 | Zope Corporation was a sponsoring member of the PSF. 31 | 32 | All Python releases are Open Source (see http://www.opensource.org for 33 | the Open Source Definition). Historically, most, but not all, Python 34 | releases have also been GPL-compatible; the table below summarizes 35 | the various releases. 36 | 37 | Release Derived Year Owner GPL- 38 | from compatible? (1) 39 | 40 | 0.9.0 thru 1.2 1991-1995 CWI yes 41 | 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes 42 | 1.6 1.5.2 2000 CNRI no 43 | 2.0 1.6 2000 BeOpen.com no 44 | 1.6.1 1.6 2001 CNRI yes (2) 45 | 2.1 2.0+1.6.1 2001 PSF no 46 | 2.0.1 2.0+1.6.1 2001 PSF yes 47 | 2.1.1 2.1+2.0.1 2001 PSF yes 48 | 2.1.2 2.1.1 2002 PSF yes 49 | 2.1.3 2.1.2 2002 PSF yes 50 | 2.2 and above 2.1.1 2001-now PSF yes 51 | 52 | Footnotes: 53 | 54 | (1) GPL-compatible doesn't mean that we're distributing Python under 55 | the GPL. All Python licenses, unlike the GPL, let you distribute 56 | a modified version without making your changes open source. The 57 | GPL-compatible licenses make it possible to combine Python with 58 | other software that is released under the GPL; the others don't. 59 | 60 | (2) According to Richard Stallman, 1.6.1 is not GPL-compatible, 61 | because its license has a choice of law clause. According to 62 | CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 63 | is "not incompatible" with the GPL. 64 | 65 | Thanks to the many outside volunteers who have worked under Guido's 66 | direction to make these releases possible. 67 | 68 | 69 | B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON 70 | =============================================================== 71 | 72 | PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 73 | -------------------------------------------- 74 | 75 | 1. This LICENSE AGREEMENT is between the Python Software Foundation 76 | ("PSF"), and the Individual or Organization ("Licensee") accessing and 77 | otherwise using this software ("Python") in source or binary form and 78 | its associated documentation. 79 | 80 | 2. Subject to the terms and conditions of this License Agreement, PSF hereby 81 | grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, 82 | analyze, test, perform and/or display publicly, prepare derivative works, 83 | distribute, and otherwise use Python alone or in any derivative version, 84 | provided, however, that PSF's License Agreement and PSF's notice of copyright, 85 | i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 86 | 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation; 87 | All Rights Reserved" are retained in Python alone or in any derivative version 88 | prepared by Licensee. 89 | 90 | 3. In the event Licensee prepares a derivative work that is based on 91 | or incorporates Python or any part thereof, and wants to make 92 | the derivative work available to others as provided herein, then 93 | Licensee hereby agrees to include in any such work a brief summary of 94 | the changes made to Python. 95 | 96 | 4. PSF is making Python available to Licensee on an "AS IS" 97 | basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR 98 | IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND 99 | DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS 100 | FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT 101 | INFRINGE ANY THIRD PARTY RIGHTS. 102 | 103 | 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 104 | FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS 105 | A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, 106 | OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. 107 | 108 | 6. This License Agreement will automatically terminate upon a material 109 | breach of its terms and conditions. 110 | 111 | 7. Nothing in this License Agreement shall be deemed to create any 112 | relationship of agency, partnership, or joint venture between PSF and 113 | Licensee. This License Agreement does not grant permission to use PSF 114 | trademarks or trade name in a trademark sense to endorse or promote 115 | products or services of Licensee, or any third party. 116 | 117 | 8. By copying, installing or otherwise using Python, Licensee 118 | agrees to be bound by the terms and conditions of this License 119 | Agreement. 120 | 121 | 122 | BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 123 | ------------------------------------------- 124 | 125 | BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 126 | 127 | 1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an 128 | office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the 129 | Individual or Organization ("Licensee") accessing and otherwise using 130 | this software in source or binary form and its associated 131 | documentation ("the Software"). 132 | 133 | 2. Subject to the terms and conditions of this BeOpen Python License 134 | Agreement, BeOpen hereby grants Licensee a non-exclusive, 135 | royalty-free, world-wide license to reproduce, analyze, test, perform 136 | and/or display publicly, prepare derivative works, distribute, and 137 | otherwise use the Software alone or in any derivative version, 138 | provided, however, that the BeOpen Python License is retained in the 139 | Software, alone or in any derivative version prepared by Licensee. 140 | 141 | 3. BeOpen is making the Software available to Licensee on an "AS IS" 142 | basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR 143 | IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND 144 | DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS 145 | FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT 146 | INFRINGE ANY THIRD PARTY RIGHTS. 147 | 148 | 4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE 149 | SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS 150 | AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY 151 | DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. 152 | 153 | 5. This License Agreement will automatically terminate upon a material 154 | breach of its terms and conditions. 155 | 156 | 6. This License Agreement shall be governed by and interpreted in all 157 | respects by the law of the State of California, excluding conflict of 158 | law provisions. Nothing in this License Agreement shall be deemed to 159 | create any relationship of agency, partnership, or joint venture 160 | between BeOpen and Licensee. This License Agreement does not grant 161 | permission to use BeOpen trademarks or trade names in a trademark 162 | sense to endorse or promote products or services of Licensee, or any 163 | third party. As an exception, the "BeOpen Python" logos available at 164 | http://www.pythonlabs.com/logos.html may be used according to the 165 | permissions granted on that web page. 166 | 167 | 7. By copying, installing or otherwise using the software, Licensee 168 | agrees to be bound by the terms and conditions of this License 169 | Agreement. 170 | 171 | 172 | CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 173 | --------------------------------------- 174 | 175 | 1. This LICENSE AGREEMENT is between the Corporation for National 176 | Research Initiatives, having an office at 1895 Preston White Drive, 177 | Reston, VA 20191 ("CNRI"), and the Individual or Organization 178 | ("Licensee") accessing and otherwise using Python 1.6.1 software in 179 | source or binary form and its associated documentation. 180 | 181 | 2. Subject to the terms and conditions of this License Agreement, CNRI 182 | hereby grants Licensee a nonexclusive, royalty-free, world-wide 183 | license to reproduce, analyze, test, perform and/or display publicly, 184 | prepare derivative works, distribute, and otherwise use Python 1.6.1 185 | alone or in any derivative version, provided, however, that CNRI's 186 | License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) 187 | 1995-2001 Corporation for National Research Initiatives; All Rights 188 | Reserved" are retained in Python 1.6.1 alone or in any derivative 189 | version prepared by Licensee. Alternately, in lieu of CNRI's License 190 | Agreement, Licensee may substitute the following text (omitting the 191 | quotes): "Python 1.6.1 is made available subject to the terms and 192 | conditions in CNRI's License Agreement. This Agreement together with 193 | Python 1.6.1 may be located on the Internet using the following 194 | unique, persistent identifier (known as a handle): 1895.22/1013. This 195 | Agreement may also be obtained from a proxy server on the Internet 196 | using the following URL: http://hdl.handle.net/1895.22/1013". 197 | 198 | 3. In the event Licensee prepares a derivative work that is based on 199 | or incorporates Python 1.6.1 or any part thereof, and wants to make 200 | the derivative work available to others as provided herein, then 201 | Licensee hereby agrees to include in any such work a brief summary of 202 | the changes made to Python 1.6.1. 203 | 204 | 4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" 205 | basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR 206 | IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND 207 | DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS 208 | FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT 209 | INFRINGE ANY THIRD PARTY RIGHTS. 210 | 211 | 5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 212 | 1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS 213 | A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, 214 | OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. 215 | 216 | 6. This License Agreement will automatically terminate upon a material 217 | breach of its terms and conditions. 218 | 219 | 7. This License Agreement shall be governed by the federal 220 | intellectual property law of the United States, including without 221 | limitation the federal copyright law, and, to the extent such 222 | U.S. federal law does not apply, by the law of the Commonwealth of 223 | Virginia, excluding Virginia's conflict of law provisions. 224 | Notwithstanding the foregoing, with regard to derivative works based 225 | on Python 1.6.1 that incorporate non-separable material that was 226 | previously distributed under the GNU General Public License (GPL), the 227 | law of the Commonwealth of Virginia shall govern this License 228 | Agreement only as to issues arising under or with respect to 229 | Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this 230 | License Agreement shall be deemed to create any relationship of 231 | agency, partnership, or joint venture between CNRI and Licensee. This 232 | License Agreement does not grant permission to use CNRI trademarks or 233 | trade name in a trademark sense to endorse or promote products or 234 | services of Licensee, or any third party. 235 | 236 | 8. By clicking on the "ACCEPT" button where indicated, or by copying, 237 | installing or otherwise using Python 1.6.1, Licensee agrees to be 238 | bound by the terms and conditions of this License Agreement. 239 | 240 | ACCEPT 241 | 242 | 243 | CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 244 | -------------------------------------------------- 245 | 246 | Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, 247 | The Netherlands. All rights reserved. 248 | 249 | Permission to use, copy, modify, and distribute this software and its 250 | documentation for any purpose and without fee is hereby granted, 251 | provided that the above copyright notice appear in all copies and that 252 | both that copyright notice and this permission notice appear in 253 | supporting documentation, and that the name of Stichting Mathematisch 254 | Centrum or CWI not be used in advertising or publicity pertaining to 255 | distribution of the software without specific, written prior 256 | permission. 257 | 258 | STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO 259 | THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 260 | FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE 261 | FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 262 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 263 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 264 | OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 265 | notices: [] 266 | -------------------------------------------------------------------------------- /.licenses/npm/rollup.dep.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: rollup 3 | version: 4.48.1 4 | type: npm 5 | summary: Next-generation ES module bundler 6 | homepage: https://rollupjs.org/ 7 | license: other 8 | licenses: 9 | - sources: LICENSE.md 10 | text: "# Rollup core license\nRollup is released under the MIT license:\n\nThe MIT 11 | License (MIT)\n\nCopyright (c) 2017 [these people](https://github.com/rollup/rollup/graphs/contributors)\n\nPermission 12 | is hereby granted, free of charge, to any person obtaining a copy of this software 13 | and associated documentation files (the \"Software\"), to deal in the Software 14 | without restriction, including without limitation the rights to use, copy, modify, 15 | merge, publish, distribute, sublicense, and/or sell copies of the Software, and 16 | to permit persons to whom the Software is furnished to do so, subject to the following 17 | conditions:\n\nThe above copyright notice and this permission notice shall be 18 | included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE 19 | IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 20 | BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 21 | PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 22 | BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR 24 | THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n# Licenses of bundled dependencies\nThe 25 | published Rollup artifact additionally contains code with the following licenses:\nMIT, 26 | ISC, 0BSD\n\n# Bundled dependencies:\n## @jridgewell/sourcemap-codec\nLicense: 27 | MIT\nBy: Justin Ridgewell\nRepository: git+https://github.com/jridgewell/sourcemaps.git\n\n> 28 | Copyright 2024 Justin Ridgewell \n> \n> Permission is hereby 29 | granted, free of charge, to any person obtaining a copy\n> of this software and 30 | associated documentation files (the \"Software\"), to deal\n> in the Software 31 | without restriction, including without limitation the rights\n> to use, copy, 32 | modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software, 33 | and to permit persons to whom the Software is\n> furnished to do so, subject to 34 | the following conditions:\n> \n> The above copyright notice and this permission 35 | notice shall be included in\n> all copies or substantial portions of the Software.\n> 36 | \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS 37 | OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> 38 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> 39 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, 40 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR 41 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n---------------------------------------\n\n## 42 | @rollup/pluginutils\nLicense: MIT\nBy: Rich Harris\nRepository: rollup/plugins\n\n> 43 | The MIT License (MIT)\n> \n> Copyright (c) 2019 RollupJS Plugin Contributors (https://github.com/rollup/plugins/graphs/contributors)\n> 44 | \n> Permission is hereby granted, free of charge, to any person obtaining a copy\n> 45 | of this software and associated documentation files (the \"Software\"), to deal\n> 46 | in the Software without restriction, including without limitation the rights\n> 47 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies 48 | of the Software, and to permit persons to whom the Software is\n> furnished to 49 | do so, subject to the following conditions:\n> \n> The above copyright notice 50 | and this permission notice shall be included in\n> all copies or substantial portions 51 | of the Software.\n> \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF 52 | ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 53 | MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO 54 | EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES 55 | OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 56 | FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 57 | IN\n> THE SOFTWARE.\n\n---------------------------------------\n\n## anymatch\nLicense: 58 | ISC\nBy: Elan Shanker\nRepository: https://github.com/micromatch/anymatch\n\n> 59 | The ISC License\n> \n> Copyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.com)\n> 60 | \n> Permission to use, copy, modify, and/or distribute this software for any\n> 61 | purpose with or without fee is hereby granted, provided that the above\n> copyright 62 | notice and this permission notice appear in all copies.\n> \n> THE SOFTWARE IS 63 | PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS 64 | SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN 65 | NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 66 | DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 67 | WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 68 | OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n---------------------------------------\n\n## 69 | binary-extensions\nLicense: MIT\nBy: Sindre Sorhus\nRepository: sindresorhus/binary-extensions\n\n> 70 | MIT License\n> \n> Copyright (c) Sindre Sorhus (https://sindresorhus.com)\n> 71 | Copyright (c) Paul Miller (https://paulmillr.com)\n> \n> Permission is hereby 72 | granted, free of charge, to any person obtaining a copy of this software and associated 73 | documentation files (the \"Software\"), to deal in the Software without restriction, 74 | including without limitation the rights to use, copy, modify, merge, publish, 75 | distribute, sublicense, and/or sell copies of the Software, and to permit persons 76 | to whom the Software is furnished to do so, subject to the following conditions:\n> 77 | \n> The above copyright notice and this permission notice shall be included in 78 | all copies or substantial portions of the Software.\n> \n> THE SOFTWARE IS PROVIDED 79 | \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 80 | LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE 81 | AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 82 | FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT 83 | OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 84 | OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------\n\n## 85 | braces\nLicense: MIT\nBy: Jon Schlinkert, Brian Woodward, Elan Shanker, Eugene 86 | Sharygin, hemanth.hm\nRepository: micromatch/braces\n\n> The MIT License (MIT)\n> 87 | \n> Copyright (c) 2014-present, Jon Schlinkert.\n> \n> Permission is hereby granted, 88 | free of charge, to any person obtaining a copy\n> of this software and associated 89 | documentation files (the \"Software\"), to deal\n> in the Software without restriction, 90 | including without limitation the rights\n> to use, copy, modify, merge, publish, 91 | distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons 92 | to whom the Software is\n> furnished to do so, subject to the following conditions:\n> 93 | \n> The above copyright notice and this permission notice shall be included in\n> 94 | all copies or substantial portions of the Software.\n> \n> THE SOFTWARE IS PROVIDED 95 | \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT 96 | NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR 97 | PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS 98 | BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF 99 | CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE 100 | SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n---------------------------------------\n\n## 101 | builtin-modules\nLicense: MIT\nBy: Sindre Sorhus\nRepository: sindresorhus/builtin-modules\n\n> 102 | MIT License\n> \n> Copyright (c) Sindre Sorhus (https://sindresorhus.com)\n> 103 | \n> Permission is hereby granted, free of charge, to any person obtaining a copy 104 | of this software and associated documentation files (the \"Software\"), to deal 105 | in the Software without restriction, including without limitation the rights to 106 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 107 | of the Software, and to permit persons to whom the Software is furnished to do 108 | so, subject to the following conditions:\n> \n> The above copyright notice and 109 | this permission notice shall be included in all copies or substantial portions 110 | of the Software.\n> \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF 111 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 112 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS 113 | OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 114 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 115 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------\n\n## 116 | chokidar\nLicense: MIT\nBy: Paul Miller, Elan Shanker\nRepository: git+https://github.com/paulmillr/chokidar.git\n\n> 117 | The MIT License (MIT)\n> \n> Copyright (c) 2012-2019 Paul Miller (https://paulmillr.com), 118 | Elan Shanker\n> \n> Permission is hereby granted, free of charge, to any person 119 | obtaining a copy\n> of this software and associated documentation files (the “Software”), 120 | to deal\n> in the Software without restriction, including without limitation the 121 | rights\n> to use, copy, modify, merge, publish, distribute, sublicense, and/or 122 | sell\n> copies of the Software, and to permit persons to whom the Software is\n> 123 | furnished to do so, subject to the following conditions:\n> \n> The above copyright 124 | notice and this permission notice shall be included in\n> all copies or substantial 125 | portions of the Software.\n> \n> THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY 126 | OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 127 | OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 128 | NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES 129 | OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 130 | FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 131 | IN\n> THE SOFTWARE.\n\n---------------------------------------\n\n## date-time\nLicense: 132 | MIT\nBy: Sindre Sorhus\nRepository: sindresorhus/date-time\n\n> MIT License\n> 133 | \n> Copyright (c) Sindre Sorhus (https://sindresorhus.com)\n> 134 | \n> Permission is hereby granted, free of charge, to any person obtaining a copy 135 | of this software and associated documentation files (the \"Software\"), to deal 136 | in the Software without restriction, including without limitation the rights to 137 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 138 | of the Software, and to permit persons to whom the Software is furnished to do 139 | so, subject to the following conditions:\n> \n> The above copyright notice and 140 | this permission notice shall be included in all copies or substantial portions 141 | of the Software.\n> \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF 142 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 143 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS 144 | OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 145 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 146 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------\n\n## 147 | fill-range\nLicense: MIT\nBy: Jon Schlinkert, Edo Rivai, Paul Miller, Rouven Weßling\nRepository: 148 | jonschlinkert/fill-range\n\n> The MIT License (MIT)\n> \n> Copyright (c) 2014-present, 149 | Jon Schlinkert.\n> \n> Permission is hereby granted, free of charge, to any person 150 | obtaining a copy\n> of this software and associated documentation files (the \"Software\"), 151 | to deal\n> in the Software without restriction, including without limitation the 152 | rights\n> to use, copy, modify, merge, publish, distribute, sublicense, and/or 153 | sell\n> copies of the Software, and to permit persons to whom the Software is\n> 154 | furnished to do so, subject to the following conditions:\n> \n> The above copyright 155 | notice and this permission notice shall be included in\n> all copies or substantial 156 | portions of the Software.\n> \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY 157 | OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 158 | OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 159 | NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES 160 | OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 161 | FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 162 | IN\n> THE SOFTWARE.\n\n---------------------------------------\n\n## flru\nLicense: 163 | MIT\nBy: Luke Edwards\nRepository: lukeed/flru\n\n> MIT License\n> \n> Copyright 164 | (c) Luke Edwards (lukeed.com)\n> \n> Permission is 165 | hereby granted, free of charge, to any person obtaining a copy of this software 166 | and associated documentation files (the \"Software\"), to deal in the Software 167 | without restriction, including without limitation the rights to use, copy, modify, 168 | merge, publish, distribute, sublicense, and/or sell copies of the Software, and 169 | to permit persons to whom the Software is furnished to do so, subject to the following 170 | conditions:\n> \n> The above copyright notice and this permission notice shall 171 | be included in all copies or substantial portions of the Software.\n> \n> THE 172 | SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 173 | INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 174 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 175 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 176 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 177 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------\n\n## 178 | glob-parent\nLicense: ISC\nBy: Gulp Team, Elan Shanker, Blaine Bublitz\nRepository: 179 | gulpjs/glob-parent\n\n> The ISC License\n> \n> Copyright (c) 2015, 2019 Elan Shanker\n> 180 | \n> Permission to use, copy, modify, and/or distribute this software for any\n> 181 | purpose with or without fee is hereby granted, provided that the above\n> copyright 182 | notice and this permission notice appear in all copies.\n> \n> THE SOFTWARE IS 183 | PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS 184 | SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN 185 | NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 186 | DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 187 | WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 188 | OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n---------------------------------------\n\n## 189 | is-binary-path\nLicense: MIT\nBy: Sindre Sorhus\nRepository: sindresorhus/is-binary-path\n\n> 190 | MIT License\n> \n> Copyright (c) 2019 Sindre Sorhus (https://sindresorhus.com), 191 | Paul Miller (https://paulmillr.com)\n> \n> Permission is hereby granted, free 192 | of charge, to any person obtaining a copy of this software and associated documentation 193 | files (the \"Software\"), to deal in the Software without restriction, including 194 | without limitation the rights to use, copy, modify, merge, publish, distribute, 195 | sublicense, and/or sell copies of the Software, and to permit persons to whom 196 | the Software is furnished to do so, subject to the following conditions:\n> \n> 197 | The above copyright notice and this permission notice shall be included in all 198 | copies or substantial portions of the Software.\n> \n> THE SOFTWARE IS PROVIDED 199 | \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 200 | LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE 201 | AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 202 | FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT 203 | OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 204 | OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------\n\n## 205 | is-extglob\nLicense: MIT\nBy: Jon Schlinkert\nRepository: jonschlinkert/is-extglob\n\n> 206 | The MIT License (MIT)\n> \n> Copyright (c) 2014-2016, Jon Schlinkert\n> \n> Permission 207 | is hereby granted, free of charge, to any person obtaining a copy\n> of this software 208 | and associated documentation files (the \"Software\"), to deal\n> in the Software 209 | without restriction, including without limitation the rights\n> to use, copy, 210 | modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software, 211 | and to permit persons to whom the Software is\n> furnished to do so, subject to 212 | the following conditions:\n> \n> The above copyright notice and this permission 213 | notice shall be included in\n> all copies or substantial portions of the Software.\n> 214 | \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS 215 | OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> 216 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> 217 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, 218 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR 219 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n---------------------------------------\n\n## 220 | is-glob\nLicense: MIT\nBy: Jon Schlinkert, Brian Woodward, Daniel Perez\nRepository: 221 | micromatch/is-glob\n\n> The MIT License (MIT)\n> \n> Copyright (c) 2014-2017, 222 | Jon Schlinkert.\n> \n> Permission is hereby granted, free of charge, to any person 223 | obtaining a copy\n> of this software and associated documentation files (the \"Software\"), 224 | to deal\n> in the Software without restriction, including without limitation the 225 | rights\n> to use, copy, modify, merge, publish, distribute, sublicense, and/or 226 | sell\n> copies of the Software, and to permit persons to whom the Software is\n> 227 | furnished to do so, subject to the following conditions:\n> \n> The above copyright 228 | notice and this permission notice shall be included in\n> all copies or substantial 229 | portions of the Software.\n> \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY 230 | OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 231 | OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 232 | NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES 233 | OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 234 | FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 235 | IN\n> THE SOFTWARE.\n\n---------------------------------------\n\n## is-number\nLicense: 236 | MIT\nBy: Jon Schlinkert, Olsten Larck, Rouven Weßling\nRepository: jonschlinkert/is-number\n\n> 237 | The MIT License (MIT)\n> \n> Copyright (c) 2014-present, Jon Schlinkert.\n> \n> 238 | Permission is hereby granted, free of charge, to any person obtaining a copy\n> 239 | of this software and associated documentation files (the \"Software\"), to deal\n> 240 | in the Software without restriction, including without limitation the rights\n> 241 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies 242 | of the Software, and to permit persons to whom the Software is\n> furnished to 243 | do so, subject to the following conditions:\n> \n> The above copyright notice 244 | and this permission notice shall be included in\n> all copies or substantial portions 245 | of the Software.\n> \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF 246 | ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 247 | MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO 248 | EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES 249 | OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 250 | FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 251 | IN\n> THE SOFTWARE.\n\n---------------------------------------\n\n## is-reference\nLicense: 252 | MIT\nBy: Rich Harris\nRepository: git+https://github.com/Rich-Harris/is-reference.git\n\n---------------------------------------\n\n## 253 | locate-character\nLicense: MIT\nBy: Rich Harris\nRepository: git+https://gitlab.com/Rich-Harris/locate-character.git\n\n---------------------------------------\n\n## 254 | magic-string\nLicense: MIT\nBy: Rich Harris\nRepository: https://github.com/rich-harris/magic-string.git\n\n> 255 | Copyright 2018 Rich Harris\n> \n> Permission is hereby granted, free of charge, 256 | to any person obtaining a copy of this software and associated documentation files 257 | (the \"Software\"), to deal in the Software without restriction, including without 258 | limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 259 | and/or sell copies of the Software, and to permit persons to whom the Software 260 | is furnished to do so, subject to the following conditions:\n> \n> The above copyright 261 | notice and this permission notice shall be included in all copies or substantial 262 | portions of the Software.\n> \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY 263 | OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 264 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 265 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 266 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 267 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 268 | SOFTWARE.\n\n---------------------------------------\n\n## normalize-path\nLicense: 269 | MIT\nBy: Jon Schlinkert, Blaine Bublitz\nRepository: jonschlinkert/normalize-path\n\n> 270 | The MIT License (MIT)\n> \n> Copyright (c) 2014-2018, Jon Schlinkert.\n> \n> Permission 271 | is hereby granted, free of charge, to any person obtaining a copy\n> of this software 272 | and associated documentation files (the \"Software\"), to deal\n> in the Software 273 | without restriction, including without limitation the rights\n> to use, copy, 274 | modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software, 275 | and to permit persons to whom the Software is\n> furnished to do so, subject to 276 | the following conditions:\n> \n> The above copyright notice and this permission 277 | notice shall be included in\n> all copies or substantial portions of the Software.\n> 278 | \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS 279 | OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> 280 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> 281 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, 282 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR 283 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n---------------------------------------\n\n## 284 | parse-ms\nLicense: MIT\nBy: Sindre Sorhus\nRepository: sindresorhus/parse-ms\n\n> 285 | MIT License\n> \n> Copyright (c) Sindre Sorhus (https://sindresorhus.com)\n> 286 | \n> Permission is hereby granted, free of charge, to any person obtaining a copy 287 | of this software and associated documentation files (the \"Software\"), to deal 288 | in the Software without restriction, including without limitation the rights to 289 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 290 | of the Software, and to permit persons to whom the Software is furnished to do 291 | so, subject to the following conditions:\n> \n> The above copyright notice and 292 | this permission notice shall be included in all copies or substantial portions 293 | of the Software.\n> \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF 294 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 295 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS 296 | OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 297 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 298 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------\n\n## 299 | picocolors\nLicense: ISC\nBy: Alexey Raspopov\nRepository: alexeyraspopov/picocolors\n\n> 300 | ISC License\n> \n> Copyright (c) 2021-2024 Oleksii Raspopov, Kostiantyn Denysov, 301 | Anton Verinov\n> \n> Permission to use, copy, modify, and/or distribute this software 302 | for any\n> purpose with or without fee is hereby granted, provided that the above\n> 303 | copyright notice and this permission notice appear in all copies.\n> \n> THE SOFTWARE 304 | IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO 305 | THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. 306 | IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR 307 | CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, 308 | DATA OR PROFITS, WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 309 | ACTION, ARISING OUT OF\n> OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 310 | SOFTWARE.\n\n---------------------------------------\n\n## picomatch\nLicense: 311 | MIT\nBy: Jon Schlinkert\nRepository: micromatch/picomatch\n\n> The MIT License 312 | (MIT)\n> \n> Copyright (c) 2017-present, Jon Schlinkert.\n> \n> Permission is 313 | hereby granted, free of charge, to any person obtaining a copy\n> of this software 314 | and associated documentation files (the \"Software\"), to deal\n> in the Software 315 | without restriction, including without limitation the rights\n> to use, copy, 316 | modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software, 317 | and to permit persons to whom the Software is\n> furnished to do so, subject to 318 | the following conditions:\n> \n> The above copyright notice and this permission 319 | notice shall be included in\n> all copies or substantial portions of the Software.\n> 320 | \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS 321 | OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> 322 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> 323 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, 324 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR 325 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n---------------------------------------\n\n## 326 | pretty-bytes\nLicense: MIT\nBy: Sindre Sorhus\nRepository: sindresorhus/pretty-bytes\n\n> 327 | MIT License\n> \n> Copyright (c) Sindre Sorhus (https://sindresorhus.com)\n> 328 | \n> Permission is hereby granted, free of charge, to any person obtaining a copy 329 | of this software and associated documentation files (the \"Software\"), to deal 330 | in the Software without restriction, including without limitation the rights to 331 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 332 | of the Software, and to permit persons to whom the Software is furnished to do 333 | so, subject to the following conditions:\n> \n> The above copyright notice and 334 | this permission notice shall be included in all copies or substantial portions 335 | of the Software.\n> \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF 336 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 337 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS 338 | OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 339 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 340 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------\n\n## 341 | pretty-ms\nLicense: MIT\nBy: Sindre Sorhus\nRepository: sindresorhus/pretty-ms\n\n> 342 | MIT License\n> \n> Copyright (c) Sindre Sorhus (https://sindresorhus.com)\n> 343 | \n> Permission is hereby granted, free of charge, to any person obtaining a copy 344 | of this software and associated documentation files (the \"Software\"), to deal 345 | in the Software without restriction, including without limitation the rights to 346 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 347 | of the Software, and to permit persons to whom the Software is furnished to do 348 | so, subject to the following conditions:\n> \n> The above copyright notice and 349 | this permission notice shall be included in all copies or substantial portions 350 | of the Software.\n> \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF 351 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 352 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS 353 | OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 354 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 355 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------\n\n## 356 | readdirp\nLicense: MIT\nBy: Thorsten Lorenz, Paul Miller\nRepository: git://github.com/paulmillr/readdirp.git\n\n> 357 | MIT License\n> \n> Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller (https://paulmillr.com)\n> 358 | \n> Permission is hereby granted, free of charge, to any person obtaining a copy\n> 359 | of this software and associated documentation files (the \"Software\"), to deal\n> 360 | in the Software without restriction, including without limitation the rights\n> 361 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies 362 | of the Software, and to permit persons to whom the Software is\n> furnished to 363 | do so, subject to the following conditions:\n> \n> The above copyright notice 364 | and this permission notice shall be included in all\n> copies or substantial portions 365 | of the Software.\n> \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF 366 | ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 367 | MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO 368 | EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES 369 | OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 370 | FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 371 | IN THE\n> SOFTWARE.\n\n---------------------------------------\n\n## signal-exit\nLicense: 372 | ISC\nBy: Ben Coe\nRepository: https://github.com/tapjs/signal-exit.git\n\n> The 373 | ISC License\n> \n> Copyright (c) 2015-2023 Benjamin Coe, Isaac Z. Schlueter, and 374 | Contributors\n> \n> Permission to use, copy, modify, and/or distribute this software\n> 375 | for any purpose with or without fee is hereby granted, provided\n> that the above 376 | copyright notice and this permission notice\n> appear in all copies.\n> \n> THE 377 | SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH 378 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES\n> OF MERCHANTABILITY 379 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE\n> LIABLE FOR ANY SPECIAL, DIRECT, 380 | INDIRECT, OR CONSEQUENTIAL DAMAGES\n> OR ANY DAMAGES WHATSOEVER RESULTING FROM 381 | LOSS OF USE, DATA OR PROFITS,\n> WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 382 | OR OTHER TORTIOUS ACTION,\n> ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 383 | OF THIS SOFTWARE.\n\n---------------------------------------\n\n## time-zone\nLicense: 384 | MIT\nBy: Sindre Sorhus\nRepository: sindresorhus/time-zone\n\n> MIT License\n> 385 | \n> Copyright (c) Sindre Sorhus (https://sindresorhus.com)\n> 386 | \n> Permission is hereby granted, free of charge, to any person obtaining a copy 387 | of this software and associated documentation files (the \"Software\"), to deal 388 | in the Software without restriction, including without limitation the rights to 389 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 390 | of the Software, and to permit persons to whom the Software is furnished to do 391 | so, subject to the following conditions:\n> \n> The above copyright notice and 392 | this permission notice shall be included in all copies or substantial portions 393 | of the Software.\n> \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF 394 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 395 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS 396 | OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 397 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 398 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------\n\n## 399 | to-regex-range\nLicense: MIT\nBy: Jon Schlinkert, Rouven Weßling\nRepository: 400 | micromatch/to-regex-range\n\n> The MIT License (MIT)\n> \n> Copyright (c) 2015-present, 401 | Jon Schlinkert.\n> \n> Permission is hereby granted, free of charge, to any person 402 | obtaining a copy\n> of this software and associated documentation files (the \"Software\"), 403 | to deal\n> in the Software without restriction, including without limitation the 404 | rights\n> to use, copy, modify, merge, publish, distribute, sublicense, and/or 405 | sell\n> copies of the Software, and to permit persons to whom the Software is\n> 406 | furnished to do so, subject to the following conditions:\n> \n> The above copyright 407 | notice and this permission notice shall be included in\n> all copies or substantial 408 | portions of the Software.\n> \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY 409 | OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 410 | OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 411 | NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES 412 | OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 413 | FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 414 | IN\n> THE SOFTWARE.\n\n---------------------------------------\n\n## tslib\nLicense: 415 | 0BSD\nBy: Microsoft Corp.\nRepository: https://github.com/Microsoft/tslib.git\n\n> 416 | Copyright (c) Microsoft Corporation.\n> \n> Permission to use, copy, modify, and/or 417 | distribute this software for any\n> purpose with or without fee is hereby granted.\n> 418 | \n> THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 419 | WITH\n> REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n> 420 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n> 421 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n> 422 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n> 423 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n> PERFORMANCE 424 | OF THIS SOFTWARE.\n\n---------------------------------------\n\n## yargs-parser\nLicense: 425 | ISC\nBy: Ben Coe\nRepository: https://github.com/yargs/yargs-parser.git\n\n> Copyright 426 | (c) 2016, Contributors\n> \n> Permission to use, copy, modify, and/or distribute 427 | this software\n> for any purpose with or without fee is hereby granted, provided\n> 428 | that the above copyright notice and this permission notice\n> appear in all copies.\n> 429 | \n> THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> 430 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES\n> OF MERCHANTABILITY 431 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE\n> LIABLE FOR ANY SPECIAL, DIRECT, 432 | INDIRECT, OR CONSEQUENTIAL DAMAGES\n> OR ANY DAMAGES WHATSOEVER RESULTING FROM 433 | LOSS OF USE, DATA OR PROFITS,\n> WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 434 | OR OTHER TORTIOUS ACTION,\n> ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 435 | OF THIS SOFTWARE.\n" 436 | - sources: README.md 437 | text: "[MIT](https://github.com/rollup/rollup/blob/master/LICENSE.md)" 438 | notices: [] 439 | --------------------------------------------------------------------------------