From f9af7981a234feaa37b7c6dddfae1daee8470924 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Mon, 6 Apr 2026 23:20:47 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=9F=20Enhance=20commit=20script=20with?= =?UTF-8?q?=20AI=20summarization=20and=20add=20new=20script=20metadata?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libraries/deno-ai-mod.ts | 36 +++++++++++++++++++++++++ script-meta-v2.json | 15 ++++++++--- single-scripts/commit.ts | 43 +++--------------------------- single-scripts/git-ai-summarize.ts | 23 ++++++++++++++++ 4 files changed, 74 insertions(+), 43 deletions(-) create mode 100644 libraries/deno-ai-mod.ts create mode 100755 single-scripts/git-ai-summarize.ts diff --git a/libraries/deno-ai-mod.ts b/libraries/deno-ai-mod.ts new file mode 100644 index 0000000..ec55152 --- /dev/null +++ b/libraries/deno-ai-mod.ts @@ -0,0 +1,36 @@ +import { + execCommand, + fetchDataWithTimeout, + getSecretValue, + term, +} from "https://script.hatter.ink/@67/deno-commons-mod.ts"; + +export async function summarizeGitStatusDiff(): Promise { + const gitStatus = (await execCommand("git", ["status"])) + .assertSuccess().getStdoutAsStringThenTrim(); + const gitDiff = (await execCommand("git", ["diff"])) + .assertSuccess().getStdoutAsStringThenTrim(); + const response = await fetchDataWithTimeout( + "https://hatter.ink/ai/commit-summarize.json", + { + method: "POST", + headers: { + "Authorization": "Bearer " + + await getSecretValue("ai-commit-summarize-token"), + }, + body: new URLSearchParams({ + "gitStatus": gitStatus, + "gitDiff": gitDiff, + }), + }, + ); + if (response.status != 200) { + console.log( + term.yellow( + `Summarize commit message failed, status: ${response.status}`, + ), + ); + return null; + } + return (await response.json())["data"]["summary"]; +} diff --git a/script-meta-v2.json b/script-meta-v2.json index 60b6879..a824c20 100644 --- a/script-meta-v2.json +++ b/script-meta-v2.json @@ -63,12 +63,12 @@ }, "commit.ts": { "script_name": "commit.ts", - "script_length": 4194, - "script_sha256": "2436bfbe5aae9e3a2c881959e3855eaee986142d547ccf04a5741e9c20d0addd", + "script_length": 3222, + "script_sha256": "81cc7d465fdf97591e1f1ff71a8a454fa538a308a929efe968736c2e12ae0c62", "script_full_url": "https://git.hatter.ink/hatter/ts-scripts/raw/branch/main/single-scripts/commit.ts", "single_script_file": true, "publish_time": 1769318306585, - "update_time": 1775315385172 + "update_time": 1775488837666 }, "decode-uri-component.ts": { "script_name": "decode-uri-component.ts", @@ -124,6 +124,15 @@ "publish_time": 1775239056991, "update_time": 1775487544902 }, + "git-ai-summarize.ts": { + "script_name": "git-ai-summarize.ts", + "script_length": 766, + "script_sha256": "7eab10eade8daa55c5f831114a1998bd8dc9a4c9d44bc5bd0f13e786b19d34da", + "script_full_url": "https://git.hatter.ink/hatter/ts-scripts/raw/branch/main/single-scripts/git-ai-summarize.ts", + "single_script_file": true, + "publish_time": 1775488837668, + "update_time": 1775488837668 + }, "git-check.ts": { "script_name": "git-check.ts", "script_length": 3107, diff --git a/single-scripts/commit.ts b/single-scripts/commit.ts index 52e2fdc..61a0054 100755 --- a/single-scripts/commit.ts +++ b/single-scripts/commit.ts @@ -2,15 +2,8 @@ import {createInterface} from "node:readline/promises"; import {stdin, stdout} from "node:process"; -import { - execCommand, - execCommandShell, - fetchDataWithTimeout, - getSecretValue, - log, - ProcessBar, - term, -} from "https://script.hatter.ink/@61/deno-commons-mod.ts"; +import {execCommandShell, log, ProcessBar, term,} from "https://script.hatter.ink/@61/deno-commons-mod.ts"; +import {summarizeGitStatusDiff} from "https://script.hatter.ink/@0/deno-ai-mod.ts"; import {getGitLocalRev, getGitRemoteRev, getGitStatus,} from "https://script.hatter.ink/@2/deno-git-mod.ts"; async function checkRev(): Promise { @@ -27,36 +20,6 @@ async function checkRev(): Promise { } } -async function summarize(): Promise { - const gitStatus = (await execCommand("git", ["status"])) - .assertSuccess().getStdoutAsStringThenTrim(); - const gitDiff = (await execCommand("git", ["diff"])) - .assertSuccess().getStdoutAsStringThenTrim(); - const response = await fetchDataWithTimeout( - "https://hatter.ink/ai/commit-summarize.json", - { - method: "POST", - headers: { - "Authorization": "Bearer " + - await getSecretValue("ai-commit-summarize-token"), - }, - body: new URLSearchParams({ - "gitStatus": gitStatus, - "gitDiff": gitDiff, - }), - }, - ); - if (response.status != 200) { - console.log( - term.yellow( - `Summarize commit message failed, status: ${response.status}`, - ), - ); - return null; - } - return (await response.json())["data"]["summary"]; -} - async function main() { await checkRev(); // check local rev <--> remote rev equals const gitStatus = await getGitStatus(); @@ -68,7 +31,7 @@ async function main() { const summary = await new ProcessBar("AI summarizing").call( async (): Promise => { - return await summarize(); + return await summarizeGitStatusDiff(); }, ); if (summary != null) { diff --git a/single-scripts/git-ai-summarize.ts b/single-scripts/git-ai-summarize.ts new file mode 100755 index 0000000..964a274 --- /dev/null +++ b/single-scripts/git-ai-summarize.ts @@ -0,0 +1,23 @@ +#!/usr/bin/env runts -- --allow-all + +import {log, ProcessBar,} from "https://script.hatter.ink/@67/deno-commons-mod.ts"; +import {summarizeGitStatusDiff} from "https://script.hatter.ink/@0/deno-ai-mod.ts"; + +async function main() { + const summary = await new ProcessBar("AI summarizing").call( + async (): Promise => { + return await summarizeGitStatusDiff(); + }, + ); + if (summary != null) { + log.success(`AI summarized git commit message: ${summary}`); + } +} + +main().catch((err) => { + log.error(err); + process.exit(0); +}).then(() => process.exit(0)); + +// @SCRIPT-SIGNATURE-V1: yk-r1.ES256.20260406T231949+08:00.MEYCIQCvhjoBTNBaFA6ElSS8 +// m6XruooQW8iNLQSRt0HObj3t/wIhAJLotqm8Ccdbb0MZTOvbhdQlD1+qS2wx9yrRd9lhi7Op