diff --git a/README.md b/README.md
index cd0f90af6a..9267bf1703 100644
--- a/README.md
+++ b/README.md
@@ -451,3 +451,15 @@ Steps:
## LICENSE
- [MIT](https://github.com/kintone/cli-kintone/blob/main/LICENSE)
+
+## Author
+
+Cybozu, Inc.
+
+## Contributors
+
+
+
+[](https://github.com/tasshi-me) [](https://github.com/hung-cybo) [](https://github.com/tuanphamcybozu) [](https://github.com/chick-p) [](https://github.com/shisama) [](https://github.com/zaki-yama) [](https://github.com/koba04) [](https://github.com/b4h0-c4t) [](https://github.com/nakajmg) [](https://github.com/shintaroNagata) [](https://github.com/kjmnmt) [](https://github.com/ueokande) [](https://github.com/ksm-cy) [](https://github.com/ryounasso) [](https://github.com/jesslynvc) [](https://github.com/ahandsel)
+
+
diff --git a/package.json b/package.json
index 73f5166a5d..1a1288d838 100644
--- a/package.json
+++ b/package.json
@@ -38,7 +38,8 @@
"clean": "rimraf lib bin artifacts dist",
"clean:test": "rimraf allure-results allure-report",
"doc:start": "pnpm --filter ./website start",
- "doc:build": "pnpm --filter ./website build"
+ "doc:build": "pnpm --filter ./website build",
+ "update-contributors": "ts-node ./scripts/update-contributors.ts"
},
"repository": {
"type": "git",
@@ -68,15 +69,21 @@
"@cucumber/cucumber": "^10.8.0",
"@cybozu/eslint-config": "^23.0.0",
"@cybozu/license-manager": "^1.2.1",
+ "@octokit/rest": "^20.1.1",
"@types/inquirer": "^8.2.10",
"@types/jest": "^29.5.12",
"@types/node": "^18.19.34",
"@types/rollup-plugin-auto-external": "^2.0.5",
"@types/yargs": "^17.0.32",
"@vercel/ncc": "^0.38.1",
+ "ajv": "^8.16.0",
+ "allure-commandline": "^2.29.0",
+ "allure-cucumberjs": "^2.15.1",
+ "allure-jest": "^2.15.1",
"babel-jest": "^29.7.0",
"cross-env": "^7.0.3",
"eslint": "^8.57.0",
+ "glob": "^10.4.1",
"jest": "^29.7.0",
"npm-run-all": "^4.1.5",
"pkg": "^5.8.1",
@@ -84,12 +91,7 @@
"rimraf": "^5.0.7",
"ts-node": "^10.9.2",
"typescript": "^5.4.5",
- "zx": "^8.1.2",
- "ajv": "^8.16.0",
- "allure-commandline": "^2.29.0",
- "allure-cucumberjs": "^2.15.1",
- "allure-jest": "^2.15.1",
- "glob": "^10.4.1"
+ "zx": "^8.1.2"
},
"dependencies": {
"@kintone/rest-api-client": "^5.5.2",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f375aafd99..8c35b30934 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -54,6 +54,9 @@ importers:
'@cybozu/license-manager':
specifier: ^1.2.1
version: 1.2.1
+ '@octokit/rest':
+ specifier: ^20.1.1
+ version: 20.1.1
'@types/inquirer':
specifier: ^8.2.10
version: 8.2.10
@@ -4465,6 +4468,109 @@ packages:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.15.0
+ /@octokit/auth-token@4.0.0:
+ resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==}
+ engines: {node: '>= 18'}
+ dev: true
+
+ /@octokit/core@5.2.0:
+ resolution: {integrity: sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==}
+ engines: {node: '>= 18'}
+ dependencies:
+ '@octokit/auth-token': 4.0.0
+ '@octokit/graphql': 7.1.0
+ '@octokit/request': 8.4.0
+ '@octokit/request-error': 5.1.0
+ '@octokit/types': 13.5.0
+ before-after-hook: 2.2.3
+ universal-user-agent: 6.0.1
+ dev: true
+
+ /@octokit/endpoint@9.0.5:
+ resolution: {integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==}
+ engines: {node: '>= 18'}
+ dependencies:
+ '@octokit/types': 13.5.0
+ universal-user-agent: 6.0.1
+ dev: true
+
+ /@octokit/graphql@7.1.0:
+ resolution: {integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==}
+ engines: {node: '>= 18'}
+ dependencies:
+ '@octokit/request': 8.4.0
+ '@octokit/types': 13.5.0
+ universal-user-agent: 6.0.1
+ dev: true
+
+ /@octokit/openapi-types@22.2.0:
+ resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==}
+ dev: true
+
+ /@octokit/plugin-paginate-rest@11.3.1(@octokit/core@5.2.0):
+ resolution: {integrity: sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ '@octokit/core': '5'
+ dependencies:
+ '@octokit/core': 5.2.0
+ '@octokit/types': 13.5.0
+ dev: true
+
+ /@octokit/plugin-request-log@4.0.1(@octokit/core@5.2.0):
+ resolution: {integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ '@octokit/core': '5'
+ dependencies:
+ '@octokit/core': 5.2.0
+ dev: true
+
+ /@octokit/plugin-rest-endpoint-methods@13.2.2(@octokit/core@5.2.0):
+ resolution: {integrity: sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ '@octokit/core': ^5
+ dependencies:
+ '@octokit/core': 5.2.0
+ '@octokit/types': 13.5.0
+ dev: true
+
+ /@octokit/request-error@5.1.0:
+ resolution: {integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==}
+ engines: {node: '>= 18'}
+ dependencies:
+ '@octokit/types': 13.5.0
+ deprecation: 2.3.1
+ once: 1.4.0
+ dev: true
+
+ /@octokit/request@8.4.0:
+ resolution: {integrity: sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==}
+ engines: {node: '>= 18'}
+ dependencies:
+ '@octokit/endpoint': 9.0.5
+ '@octokit/request-error': 5.1.0
+ '@octokit/types': 13.5.0
+ universal-user-agent: 6.0.1
+ dev: true
+
+ /@octokit/rest@20.1.1:
+ resolution: {integrity: sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==}
+ engines: {node: '>= 18'}
+ dependencies:
+ '@octokit/core': 5.2.0
+ '@octokit/plugin-paginate-rest': 11.3.1(@octokit/core@5.2.0)
+ '@octokit/plugin-request-log': 4.0.1(@octokit/core@5.2.0)
+ '@octokit/plugin-rest-endpoint-methods': 13.2.2(@octokit/core@5.2.0)
+ dev: true
+
+ /@octokit/types@13.5.0:
+ resolution: {integrity: sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==}
+ dependencies:
+ '@octokit/openapi-types': 22.2.0
+ dev: true
+
/@pkgjs/parseargs@0.11.0:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
@@ -6021,6 +6127,10 @@ packages:
/batch@0.6.1:
resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==}
+ /before-after-hook@2.2.3:
+ resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==}
+ dev: true
+
/big.js@5.2.2:
resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
@@ -7073,6 +7183,10 @@ packages:
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
engines: {node: '>= 0.8'}
+ /deprecation@2.3.1:
+ resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==}
+ dev: true
+
/dequal@2.0.3:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
@@ -13889,6 +14003,10 @@ packages:
unist-util-is: 6.0.0
unist-util-visit-parents: 6.0.1
+ /universal-user-agent@6.0.1:
+ resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==}
+ dev: true
+
/universalify@0.2.0:
resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
engines: {node: '>= 4.0.0'}
diff --git a/scripts/update-contributors.ts b/scripts/update-contributors.ts
new file mode 100644
index 0000000000..be8e0bfea0
--- /dev/null
+++ b/scripts/update-contributors.ts
@@ -0,0 +1,50 @@
+// eslint-disable-next-line node/no-unpublished-import
+import { Octokit } from "@octokit/rest";
+import * as fs from "fs/promises";
+
+const ignoredUsers = [
+ "renovate[bot]",
+ "github-actions[bot]",
+ "trigger-github-actions-release[bot]",
+ "renovate-bot",
+];
+
+const file = "README.md";
+
+(async () => {
+ const octokit = new Octokit();
+
+ // We use stats because the response of octokit.repos.listContributors is missing some contributors.
+ const resp = await octokit.repos.getContributorsStats({
+ owner: "kintone",
+ repo: "cli-kintone",
+ });
+
+ const contributors = resp.data
+ .filter(
+ (c) =>
+ c.author?.type === "User" && !ignoredUsers.includes(c.author.login),
+ )
+ .sort((c1, c2) => c2.total - c1.total)
+ .map((c) => ({
+ login: c.author?.login,
+ avatar_url: c.author?.avatar_url,
+ html_url: c.author?.html_url,
+ }));
+
+ const contributorIcons = contributors
+ .map(
+ (contributor) =>
+ `[](${contributor.html_url})`,
+ )
+ .join(" ");
+ const newCredits = `\n\n${contributorIcons}\n\n`;
+
+ const content = await fs.readFile(file, { encoding: "utf-8" });
+ const newContent = content.replace(
+ /.+/gs,
+ newCredits,
+ );
+
+ await fs.writeFile(file, newContent);
+})();