| #!/usr/bin/env bun |
|
|
| import { rm } from "fs/promises" |
| import path from "path" |
| import { parseArgs } from "util" |
|
|
| const root = path.resolve(import.meta.dir, "..") |
| const file = path.join(root, "UPCOMING_CHANGELOG.md") |
| const { values, positionals } = parseArgs({ |
| args: Bun.argv.slice(2), |
| options: { |
| from: { type: "string", short: "f" }, |
| to: { type: "string", short: "t" }, |
| variant: { type: "string", default: "low" }, |
| quiet: { type: "boolean", default: false }, |
| print: { type: "boolean", default: false }, |
| help: { type: "boolean", short: "h", default: false }, |
| }, |
| allowPositionals: true, |
| }) |
| const args = [...positionals] |
|
|
| if (values.from) args.push("--from", values.from) |
| if (values.to) args.push("--to", values.to) |
|
|
| if (values.help) { |
| console.log(` |
| Usage: bun script/changelog.ts [options] |
| |
| Generates UPCOMING_CHANGELOG.md by running the opencode changelog command. |
| |
| Options: |
| -f, --from <version> Starting version (default: latest non-draft GitHub release) |
| -t, --to <ref> Ending ref (default: HEAD) |
| --variant <name> Thinking variant for opencode run (default: low) |
| --quiet Suppress opencode command output unless it fails |
| --print Print the generated UPCOMING_CHANGELOG.md after success |
| -h, --help Show this help message |
| |
| Examples: |
| bun script/changelog.ts |
| bun script/changelog.ts --from 1.0.200 |
| bun script/changelog.ts -f 1.0.200 -t 1.0.205 |
| `) |
| process.exit(0) |
| } |
|
|
| await rm(file, { force: true }) |
|
|
| const quiet = values.quiet |
| const cmd = ["opencode", "run"] |
| cmd.push("--variant", values.variant) |
| cmd.push("--command", "changelog", "--", ...args) |
|
|
| const proc = Bun.spawn(cmd, { |
| cwd: root, |
| stdin: "inherit", |
| stdout: quiet ? "pipe" : "inherit", |
| stderr: quiet ? "pipe" : "inherit", |
| }) |
|
|
| const [out, err] = quiet |
| ? await Promise.all([new Response(proc.stdout).text(), new Response(proc.stderr).text()]) |
| : ["", ""] |
| const code = await proc.exited |
| if (code === 0) { |
| if (values.print) process.stdout.write(await Bun.file(file).text()) |
| process.exit(0) |
| } |
|
|
| if (quiet) { |
| if (out) process.stdout.write(out) |
| if (err) process.stderr.write(err) |
| } |
|
|
| process.exit(code) |
|
|