update-brew-formula.mts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #!/usr/bin/env node
  2. import { execSync } from "node:child_process"
  3. import { createHash } from "node:crypto"
  4. import { readFile, unlink, writeFile } from "node:fs/promises"
  5. import { dirname, join } from "node:path"
  6. import { fileURLToPath } from "node:url"
  7. const __filename = fileURLToPath(import.meta.url)
  8. const __dirname = dirname(__filename)
  9. const CLI_DIR = join(__dirname, "..")
  10. const FORMULA_PATH = join(CLI_DIR, "cline.rb")
  11. interface PackageJson {
  12. version: string
  13. }
  14. async function getLocalVersion(): Promise<string> {
  15. const packageJson = JSON.parse(await readFile(join(CLI_DIR, "package.json"), "utf-8")) as PackageJson
  16. return packageJson.version
  17. }
  18. async function packAndGetSHA256(version: string): Promise<string> {
  19. console.log("Packing local package...")
  20. execSync("npm run package", { cwd: CLI_DIR, stdio: "inherit" })
  21. const tarballPath = join(CLI_DIR, "dist", `cline-cli-${version}.tgz`)
  22. console.log(`Computing SHA256 for ${tarballPath}...`)
  23. const buffer = await readFile(tarballPath)
  24. const sha256 = createHash("sha256").update(buffer).digest("hex")
  25. // Clean up the tarball
  26. await unlink(tarballPath)
  27. return sha256
  28. }
  29. async function updateFormula(version: string, sha256: string) {
  30. console.log("Updating Homebrew formula...")
  31. let formula = await readFile(FORMULA_PATH, "utf-8")
  32. const tarballUrl = `https://registry.npmjs.org/cline/-/cline-${version}.tgz`
  33. // Update URL - matches pattern like: url "https://registry.npmjs.org/cline/-/cline-1.0.10.tgz"
  34. formula = formula.replace(/url "https:\/\/registry\.npmjs\.org\/cline\/-\/cline-[\d.]+\.tgz"/, `url "${tarballUrl}"`)
  35. // Update SHA256
  36. formula = formula.replace(/sha256 "[a-f0-9]+"/, `sha256 "${sha256}"`)
  37. await writeFile(FORMULA_PATH, formula, "utf-8")
  38. }
  39. async function main() {
  40. try {
  41. const version = await getLocalVersion()
  42. console.log(`\nLocal version: ${version}`)
  43. const sha256 = await packAndGetSHA256(version)
  44. console.log(`SHA256: ${sha256}`)
  45. const tarballUrl = `https://registry.npmjs.org/cline/-/cline-${version}.tgz`
  46. console.log(`Tarball URL: ${tarballUrl}`)
  47. await updateFormula(version, sha256)
  48. console.log("\n✓ Homebrew formula updated successfully!")
  49. console.log("\nNext steps:")
  50. console.log("1. Review the changes in cline.rb")
  51. console.log("2. Test locally: brew install --build-from-source ./cline.rb")
  52. console.log("3. Commit and push to your homebrew tap repository")
  53. } catch (error) {
  54. const errorMessage = error instanceof Error ? error.message : String(error)
  55. console.error(`\n✗ Error: ${errorMessage}\n`)
  56. process.exit(1)
  57. }
  58. }
  59. main()