blippy 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ /node_modules
2
+
package/CHANGELOG.md ADDED
@@ -0,0 +1,144 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.1.1](https://github.com/AksharP5/blippy/compare/v0.1.0...v0.1.1) - 2026-02-12
11
+
12
+ ### Fixed
13
+
14
+ - *(build)* bundle sqlite for windows release builds
15
+
16
+ ## [0.1.0](https://github.com/AksharP5/blippy/releases/tag/v0.1.0) - 2026-02-12
17
+
18
+ ### Added
19
+
20
+ - *(ui)* refine issue preview context and assignee reset flow
21
+ - *(repo)* enforce metadata permissions and load label colors
22
+ - *(linked)* cache linked jumps and suggest repo assignees
23
+ - *(ui)* improve PR diff workflows and linked metadata visibility
24
+ - *(ui)* add bidirectional linked issue/pr navigation chips
25
+ - *(theme)* add configurable palettes and theme-aware UI rendering
26
+ - expand mouse controls and revise diff pan keys
27
+ - add configurable input and horizontal diff panning
28
+ - add side-aware multiline review and github thread resolution
29
+ - improve pr review ui for visual selection
30
+ - support multiline and side-aware pr review comments
31
+ - add split diff review workspace for pull requests
32
+ - add inline pull request review comment workflow
33
+ - open linked pull requests in tui first
34
+ - improve PR navigation and linked PR actions
35
+ - add full PR changes view and context-aware help
36
+ - show pull request file changes in detail view
37
+ - add pull request mode and checkout action
38
+ - add comment edit/delete controls in comments view
39
+ - simplify repo picker and improve issue pickers
40
+ - add popup label and assignee pickers
41
+ - improve repo picker and add label/assignee actions
42
+ - add etag-aware incremental issue sync
43
+ - show pending issue badges and sort closed by recency
44
+ - increase sync progress refresh responsiveness
45
+ - stream issue sync progress during refresh
46
+ - toggle through assignees
47
+ - improve issue triage flow and editor controls
48
+ - render markdown and improve issue detail UI
49
+ - enhance issue list and comments view
50
+ - improve issue metadata and comment browsing
51
+ - add dd close presets
52
+ - add dd close presets
53
+ - add dd close flow and browser open
54
+ - add comment defaults config
55
+ - add vim jumps and browser open
56
+ - add vim-style navigation hints
57
+ - scope sync to repo discovery
58
+ - add issue detail and comment polling
59
+ - add comment retention fields
60
+ - sync issues only
61
+ - refine scan and sync triggers
62
+ - add repo picker and issues view
63
+ - add repo lookup by slug
64
+ - add sync command flow
65
+ - implement sync mapping and repo sync
66
+ - add github api client and sync mapping
67
+ - index local repos
68
+ - add repo discovery scanning
69
+ - detect repo roots and remotes
70
+ - add local repo cache table
71
+ - add git remote parsing helpers
72
+ - add cache read/write layer
73
+ - add sqlite cache schema scaffold
74
+ - add cache reset command
75
+ - add auth reset command
76
+ - expose auth source for debugging
77
+ - add secure auth token resolution
78
+ - bootstrap TUI scaffold and config loading
79
+
80
+ ### Fixed
81
+
82
+ - *(pr-diff)* keep expanded mode when jumping to top
83
+ - *(store)* configure sqlite to wait and use wal mode
84
+ - improve repo picker mouse targeting and scrolling
85
+ - align pr diff rows with github layout
86
+ - restore compact pr diff row layout
87
+ - surface unanchored pr comments in review mapping
88
+ - load existing pr review comments and strengthen visual highlighting
89
+ - clarify pr visual selection and side comment rendering
90
+ - sync github review threads and server-side resolution
91
+ - clarify pr diff side targeting and empty-state copy
92
+ - split linked pull request browser and tui shortcuts
93
+ - open comments when pressing enter on pr description
94
+ - reduce issue view keybind duplicates
95
+ - remove dd status hint
96
+ - simplify comments navigation and close wording
97
+ - remove focus labels and improve preview scrolling
98
+ - make issue detail focus state visually unambiguous
99
+ - apply issue state changes immediately after actions
100
+ - start sync immediately after background events
101
+ - order issues newest-first like GitHub
102
+ - persist partial issue sync on paged API failures
103
+ - issue closing
104
+ - clamp comment scroll to content
105
+ - keep comments visible while scrolling
106
+ - auto-sync on empty cache
107
+ - trigger sync on repo open
108
+
109
+ ### Other
110
+
111
+ - *(release)* automate release pipeline with release-plz and cargo-dist
112
+ - *(cleanup)* normalize auth debug env and remove dead code
113
+ - *(rename)* rename project identifiers to blippy
114
+ - *(status)* preserve centered mode badge padding
115
+ - *(ui)* show full selected issue title in preview
116
+ - *(ui)* prioritize linked metadata and expand label readability
117
+ - *(ui)* move linked badges to metadata and remove ellipses
118
+ - *(ui)* refine help overlays and diff navigation cues
119
+ - change styling, keybinds, add '?'
120
+ - update to add header/better design
121
+ - *(ui)* add linked PR action chips and compact footer hints
122
+ - *(ui)* improve picker selection visibility and counts
123
+ - *(ui)* improve issue metadata hierarchy and status segmentation
124
+ - use pure black surfaces and cleaner active labels
125
+ - review theme
126
+ - refresh opencode palette and inline pr diff comments
127
+ - tighten diff layout and inline review comment contrast
128
+ - redesign pr review pane and simplify key hints
129
+ - simplify footer hints and declutter review comment labels
130
+ - apply tokyo-night palette and clearer focus states
131
+ - update UI and keybinds for pull request review
132
+ - trim keybind help to primary controls
133
+ - poll issues faster with cached incremental sync
134
+ - polish GitHub-like TUI visuals
135
+ - mention arrow key navigation
136
+ - clarify sync behavior
137
+ - add repo picker shortcuts
138
+ - add sync command
139
+ - add cache reset info
140
+ - readme
141
+ - add auth setup and testing guide
142
+ - hardcode github.com auth host
143
+ - update gitignore
144
+ - Initial commit
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Akshar Patel
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.
package/README.md ADDED
@@ -0,0 +1,180 @@
1
+ # blippy
2
+
3
+ Maintainer-first TUI for triaging GitHub Issues and PRs.
4
+
5
+ ## Requirements
6
+ - Rust toolchain (Rust 1.93+ recommended)
7
+ - GitHub CLI (optional, used for auth if available)
8
+ - OS keychain available (macOS Keychain, Windows Credential Manager, Linux Secret Service)
9
+
10
+ ## Quick Start
11
+ ```bash
12
+ cargo run
13
+ ```
14
+
15
+ Press `q` to quit.
16
+
17
+ ## Install
18
+
19
+ ### npm (global)
20
+ ```bash
21
+ npm i -g blippy
22
+ ```
23
+
24
+ ### Homebrew
25
+ ```bash
26
+ brew install AksharP5/tap/blippy
27
+ ```
28
+
29
+ ### Shell installer (macOS/Linux)
30
+ ```bash
31
+ curl --proto '=https' --tlsv1.2 -LsSf https://github.com/AksharP5/blippy/releases/latest/download/blippy-installer.sh | sh
32
+ ```
33
+
34
+ ### PowerShell installer (Windows)
35
+ ```powershell
36
+ irm https://github.com/AksharP5/blippy/releases/latest/download/blippy-installer.ps1 | iex
37
+ ```
38
+
39
+ ### Build from source
40
+ ```bash
41
+ cargo install --git https://github.com/AksharP5/blippy
42
+ ```
43
+
44
+ ## Authentication (v0.1)
45
+ On startup, auth is resolved in this order:
46
+ 1. `gh auth token --hostname github.com`
47
+ 2. OS keychain (`service=blippy`, `account=github.com`)
48
+ 3. Prompt for PAT (input hidden), then store in keychain
49
+
50
+ Tokens are never written to config or db.
51
+
52
+ ## Personal Access Token (PAT)
53
+ If prompted for a PAT, create one in GitHub settings:
54
+
55
+ ### Fine-grained token (recommended by GitHub)
56
+ Settings → Developer settings → Personal access tokens → Fine-grained tokens → Generate new token
57
+
58
+ Suggested permissions:
59
+ - Repository metadata: Read
60
+ - Issues: Read/Write
61
+ - Pull requests: Read/Write
62
+
63
+ ### Classic token (simpler)
64
+ Settings → Developer settings → Personal access tokens → Tokens (classic) → Generate new token
65
+
66
+ Suggested scopes:
67
+ - `repo` (required for private repos and full Issues/PR access)
68
+ - `read:org` (needed if you access org repositories)
69
+
70
+ ## Testing Auth
71
+ ```bash
72
+ gh auth status
73
+ gh auth token --hostname github.com
74
+ ```
75
+
76
+ To see which auth source was used (development only):
77
+ ```bash
78
+ BLIPPY_AUTH_DEBUG=1 cargo run
79
+ ```
80
+
81
+ To force the PAT prompt:
82
+ - Temporarily log out of GitHub CLI: `gh auth logout`
83
+ - Remove the keychain entry for `blippy` / `github.com` using your OS keychain UI
84
+
85
+ To reset stored auth from the CLI:
86
+ ```bash
87
+ blippy auth reset
88
+ ```
89
+
90
+ ## Tests
91
+ ```bash
92
+ cargo test
93
+ ```
94
+
95
+ ## Cache
96
+ - Cache lives in your OS user data directory as `blippy.db`
97
+ - Reset cache: `blippy cache reset`
98
+
99
+ ## Sync
100
+ - Run `blippy sync` to scan local repos and cache GitHub remotes
101
+ - Issues are fetched when you open a repo in the TUI
102
+
103
+ ## Navigation
104
+ - Ctrl+G: open repo picker
105
+ - Ctrl+R: rescan repos
106
+ - / in repo picker: search repos (owner/repo/path/remote)
107
+ - Ctrl+h/j/k/l: switch focus between panes (issues list/preview, issue description/recent comments)
108
+ - j/k: move or scroll focused pane
109
+ - Ctrl+u / Ctrl+d: page up/down in focused pane
110
+ - gg/G: jump top/bottom in focused pane
111
+ - p: toggle issues / pull requests list mode
112
+ - f: cycle issue filter (open/closed)
113
+ - 1/2: switch issue tab (open/closed)
114
+ - a: cycle assignee filter (all/unassigned/users)
115
+ - /: search issues by number/title/body/labels/assignees (Enter keep, Esc clear)
116
+ - m: add comment to selected issue
117
+ - l: edit issue labels (comma-separated)
118
+ - Shift+A: edit issue assignees
119
+ - u: reopen selected closed issue/pull request
120
+ - Enter: open selected issue
121
+ - r: refresh issues/comments
122
+ - o: open in browser
123
+ - Shift+P: open linked pull request for selected issue in TUI
124
+ - Shift+O: open linked pull request for selected issue in browser
125
+ - v: checkout selected pull request locally (`gh pr checkout`)
126
+ - dd: close selected issue/pull request with preset
127
+ - c: open full comments from detail view
128
+ - j/k: jump next/previous comment in full comments view
129
+ - e: edit selected comment in full comments view
130
+ - x: delete selected comment in full comments view
131
+ - PR detail: right pane shows changed files + patch snippets (no checkout required)
132
+ - Enter on PR changes pane: open full-screen PR changes viewer
133
+ - PR review view: Ctrl+h/l switch files/diff, j/k navigate, w mark/unmark file viewed on GitHub, m add inline GitHub review comment
134
+ - PR review view: h/l choose old/new side, z collapse/expand current hunk, Shift+V visual multiline range, e edit, x delete, Shift+R resolve/reopen thread on GitHub, n/p cycle comments on selected line
135
+ - PR review view: `[`/`]` pan horizontally for long lines, `0` resets horizontal pan
136
+ - Ctrl+y: copy current status message to clipboard
137
+ - b or Esc: back from issue detail/comments
138
+ - Mouse/trackpad: wheel scrolls lists/diffs, horizontal wheel pans PR diff, click rows to select/open, click global `[Repos]`, click `[Back]`, `[Files]`, `[Diff]`, Open/Closed tabs, and picker `[Apply]/[Cancel]`
139
+ - comment editor: `Enter` submit, `Shift+Enter` newline (`Ctrl+j` fallback)
140
+
141
+ Search supports simple GitHub-like qualifiers:
142
+ - `is:open` or `is:closed`
143
+ - `label:bug`
144
+ - `assignee:alex`
145
+ - `assignee:none` for unassigned
146
+ - `#123` for exact issue number
147
+
148
+ ## Comment Defaults
149
+ Configure close/comment presets in `config.toml`:
150
+ ```toml
151
+ [[comment_defaults]]
152
+ name = "close_default"
153
+ body = "Closing this issue as resolved."
154
+ ```
155
+
156
+ ## Themes
157
+ blippy supports built-in UI themes via `~/.config/blippy/config.toml`:
158
+
159
+ ```toml
160
+ theme = "midnight"
161
+ ```
162
+
163
+ Available built-in themes:
164
+ - `github_dark` (default)
165
+ - `midnight`
166
+ - `graphite`
167
+
168
+ ## Keybind Configuration
169
+ - Every keyboard shortcut can be overridden.
170
+ - Copy `keybinds.example.toml` to `~/.config/blippy/keybinds.toml` and edit values.
171
+ - You can also place the same `[keybinds]` table inside `~/.config/blippy/config.toml`.
172
+
173
+ Example:
174
+ ```toml
175
+ [keybinds]
176
+ quit = "ctrl+q"
177
+ refresh = "ctrl+s"
178
+ diff_scroll_left = "alt+h"
179
+ diff_scroll_right = "alt+l"
180
+ ```
@@ -0,0 +1,212 @@
1
+ const { createWriteStream, existsSync, mkdirSync, mkdtemp } = require("fs");
2
+ const { join, sep } = require("path");
3
+ const { spawnSync } = require("child_process");
4
+ const { tmpdir } = require("os");
5
+
6
+ const axios = require("axios");
7
+ const rimraf = require("rimraf");
8
+ const tmpDir = tmpdir();
9
+
10
+ const error = (msg) => {
11
+ console.error(msg);
12
+ process.exit(1);
13
+ };
14
+
15
+ class Package {
16
+ constructor(platform, name, url, filename, zipExt, binaries) {
17
+ let errors = [];
18
+ if (typeof url !== "string") {
19
+ errors.push("url must be a string");
20
+ } else {
21
+ try {
22
+ new URL(url);
23
+ } catch (e) {
24
+ errors.push(e);
25
+ }
26
+ }
27
+ if (name && typeof name !== "string") {
28
+ errors.push("package name must be a string");
29
+ }
30
+ if (!name) {
31
+ errors.push("You must specify the name of your package");
32
+ }
33
+ if (binaries && typeof binaries !== "object") {
34
+ errors.push("binaries must be a string => string map");
35
+ }
36
+ if (!binaries) {
37
+ errors.push("You must specify the binaries in the package");
38
+ }
39
+
40
+ if (errors.length > 0) {
41
+ let errorMsg =
42
+ "One or more of the parameters you passed to the Binary constructor are invalid:\n";
43
+ errors.forEach((error) => {
44
+ errorMsg += error;
45
+ });
46
+ errorMsg +=
47
+ '\n\nCorrect usage: new Package("my-binary", "https://example.com/binary/download.tar.gz", {"my-binary": "my-binary"})';
48
+ error(errorMsg);
49
+ }
50
+
51
+ this.platform = platform;
52
+ this.url = url;
53
+ this.name = name;
54
+ this.filename = filename;
55
+ this.zipExt = zipExt;
56
+ this.installDirectory = join(__dirname, "node_modules", ".bin_real");
57
+ this.binaries = binaries;
58
+
59
+ if (!existsSync(this.installDirectory)) {
60
+ mkdirSync(this.installDirectory, { recursive: true });
61
+ }
62
+ }
63
+
64
+ exists() {
65
+ for (const binaryName in this.binaries) {
66
+ const binRelPath = this.binaries[binaryName];
67
+ const binPath = join(this.installDirectory, binRelPath);
68
+ if (!existsSync(binPath)) {
69
+ return false;
70
+ }
71
+ }
72
+ return true;
73
+ }
74
+
75
+ install(fetchOptions, suppressLogs = false) {
76
+ if (this.exists()) {
77
+ if (!suppressLogs) {
78
+ console.error(
79
+ `${this.name} is already installed, skipping installation.`,
80
+ );
81
+ }
82
+ return Promise.resolve();
83
+ }
84
+
85
+ if (existsSync(this.installDirectory)) {
86
+ rimraf.sync(this.installDirectory);
87
+ }
88
+
89
+ mkdirSync(this.installDirectory, { recursive: true });
90
+
91
+ if (!suppressLogs) {
92
+ console.error(`Downloading release from ${this.url}`);
93
+ }
94
+
95
+ return axios({ ...fetchOptions, url: this.url, responseType: "stream" })
96
+ .then((res) => {
97
+ return new Promise((resolve, reject) => {
98
+ mkdtemp(`${tmpDir}${sep}`, (err, directory) => {
99
+ let tempFile = join(directory, this.filename);
100
+ const sink = res.data.pipe(createWriteStream(tempFile));
101
+ sink.on("error", (err) => reject(err));
102
+ sink.on("close", () => {
103
+ if (/\.tar\.*/.test(this.zipExt)) {
104
+ const result = spawnSync("tar", [
105
+ "xf",
106
+ tempFile,
107
+ // The tarballs are stored with a leading directory
108
+ // component; we strip one component in the
109
+ // shell installers too.
110
+ "--strip-components",
111
+ "1",
112
+ "-C",
113
+ this.installDirectory,
114
+ ]);
115
+ if (result.status == 0) {
116
+ resolve();
117
+ } else if (result.error) {
118
+ reject(result.error);
119
+ } else {
120
+ reject(
121
+ new Error(
122
+ `An error occurred untarring the artifact: stdout: ${result.stdout}; stderr: ${result.stderr}`,
123
+ ),
124
+ );
125
+ }
126
+ } else if (this.zipExt == ".zip") {
127
+ let result;
128
+ if (this.platform.artifactName.includes("windows")) {
129
+ // Windows does not have "unzip" by default on many installations, instead
130
+ // we use Expand-Archive from powershell
131
+ result = spawnSync("powershell.exe", [
132
+ "-NoProfile",
133
+ "-NonInteractive",
134
+ "-Command",
135
+ `& {
136
+ param([string]$LiteralPath, [string]$DestinationPath)
137
+ Expand-Archive -LiteralPath $LiteralPath -DestinationPath $DestinationPath -Force
138
+ }`,
139
+ tempFile,
140
+ this.installDirectory,
141
+ ]);
142
+ } else {
143
+ result = spawnSync("unzip", [
144
+ "-q",
145
+ tempFile,
146
+ "-d",
147
+ this.installDirectory,
148
+ ]);
149
+ }
150
+
151
+ if (result.status == 0) {
152
+ resolve();
153
+ } else if (result.error) {
154
+ reject(result.error);
155
+ } else {
156
+ reject(
157
+ new Error(
158
+ `An error occurred unzipping the artifact: stdout: ${result.stdout}; stderr: ${result.stderr}`,
159
+ ),
160
+ );
161
+ }
162
+ } else {
163
+ reject(
164
+ new Error(`Unrecognized file extension: ${this.zipExt}`),
165
+ );
166
+ }
167
+ });
168
+ });
169
+ });
170
+ })
171
+ .then(() => {
172
+ if (!suppressLogs) {
173
+ console.error(`${this.name} has been installed!`);
174
+ }
175
+ })
176
+ .catch((e) => {
177
+ error(`Error fetching release: ${e.message}`);
178
+ });
179
+ }
180
+
181
+ run(binaryName, fetchOptions) {
182
+ const promise = !this.exists()
183
+ ? this.install(fetchOptions, true)
184
+ : Promise.resolve();
185
+
186
+ promise
187
+ .then(() => {
188
+ const [, , ...args] = process.argv;
189
+
190
+ const options = { cwd: process.cwd(), stdio: "inherit" };
191
+
192
+ const binRelPath = this.binaries[binaryName];
193
+ if (!binRelPath) {
194
+ error(`${binaryName} is not a known binary in ${this.name}`);
195
+ }
196
+ const binPath = join(this.installDirectory, binRelPath);
197
+ const result = spawnSync(binPath, args, options);
198
+
199
+ if (result.error) {
200
+ error(result.error);
201
+ }
202
+
203
+ process.exit(result.status);
204
+ })
205
+ .catch((e) => {
206
+ error(e.message);
207
+ process.exit(1);
208
+ });
209
+ }
210
+ }
211
+
212
+ module.exports.Package = Package;
package/binary.js ADDED
@@ -0,0 +1,126 @@
1
+ const { Package } = require("./binary-install");
2
+ const os = require("os");
3
+ const cTable = require("console.table");
4
+ const libc = require("detect-libc");
5
+ const { configureProxy } = require("axios-proxy-builder");
6
+
7
+ const error = (msg) => {
8
+ console.error(msg);
9
+ process.exit(1);
10
+ };
11
+
12
+ const {
13
+ name,
14
+ artifactDownloadUrl,
15
+ supportedPlatforms,
16
+ glibcMinimum,
17
+ } = require("./package.json");
18
+
19
+ const builderGlibcMajorVersion = glibcMinimum.major;
20
+ const builderGlibcMInorVersion = glibcMinimum.series;
21
+
22
+ const getPlatform = () => {
23
+ const rawOsType = os.type();
24
+ const rawArchitecture = os.arch();
25
+
26
+ // We want to use rust-style target triples as the canonical key
27
+ // for a platform, so translate the "os" library's concepts into rust ones
28
+ let osType = "";
29
+ switch (rawOsType) {
30
+ case "Windows_NT":
31
+ osType = "pc-windows-msvc";
32
+ break;
33
+ case "Darwin":
34
+ osType = "apple-darwin";
35
+ break;
36
+ case "Linux":
37
+ osType = "unknown-linux-gnu";
38
+ break;
39
+ }
40
+
41
+ let arch = "";
42
+ switch (rawArchitecture) {
43
+ case "x64":
44
+ arch = "x86_64";
45
+ break;
46
+ case "arm64":
47
+ arch = "aarch64";
48
+ break;
49
+ }
50
+
51
+ if (rawOsType === "Linux") {
52
+ if (libc.familySync() == "musl") {
53
+ osType = "unknown-linux-musl-dynamic";
54
+ } else if (libc.isNonGlibcLinuxSync()) {
55
+ console.warn(
56
+ "Your libc is neither glibc nor musl; trying static musl binary instead",
57
+ );
58
+ osType = "unknown-linux-musl-static";
59
+ } else {
60
+ let libcVersion = libc.versionSync();
61
+ let splitLibcVersion = libcVersion.split(".");
62
+ let libcMajorVersion = splitLibcVersion[0];
63
+ let libcMinorVersion = splitLibcVersion[1];
64
+ if (
65
+ libcMajorVersion != builderGlibcMajorVersion ||
66
+ libcMinorVersion < builderGlibcMInorVersion
67
+ ) {
68
+ // We can't run the glibc binaries, but we can run the static musl ones
69
+ // if they exist
70
+ console.warn(
71
+ "Your glibc isn't compatible; trying static musl binary instead",
72
+ );
73
+ osType = "unknown-linux-musl-static";
74
+ }
75
+ }
76
+ }
77
+
78
+ // Assume the above succeeded and build a target triple to look things up with.
79
+ // If any of it failed, this lookup will fail and we'll handle it like normal.
80
+ let targetTriple = `${arch}-${osType}`;
81
+ let platform = supportedPlatforms[targetTriple];
82
+
83
+ if (!platform) {
84
+ error(
85
+ `Platform with type "${rawOsType}" and architecture "${rawArchitecture}" is not supported by ${name}.\nYour system must be one of the following:\n\n${Object.keys(
86
+ supportedPlatforms,
87
+ ).join(",")}`,
88
+ );
89
+ }
90
+
91
+ return platform;
92
+ };
93
+
94
+ const getPackage = () => {
95
+ const platform = getPlatform();
96
+ const url = `${artifactDownloadUrl}/${platform.artifactName}`;
97
+ let filename = platform.artifactName;
98
+ let ext = platform.zipExt;
99
+ let binary = new Package(platform, name, url, filename, ext, platform.bins);
100
+
101
+ return binary;
102
+ };
103
+
104
+ const install = (suppressLogs) => {
105
+ if (!artifactDownloadUrl || artifactDownloadUrl.length === 0) {
106
+ console.warn("in demo mode, not installing binaries");
107
+ return;
108
+ }
109
+ const package = getPackage();
110
+ const proxy = configureProxy(package.url);
111
+
112
+ return package.install(proxy, suppressLogs);
113
+ };
114
+
115
+ const run = (binaryName) => {
116
+ const package = getPackage();
117
+ const proxy = configureProxy(package.url);
118
+
119
+ package.run(binaryName, proxy);
120
+ };
121
+
122
+ module.exports = {
123
+ install,
124
+ run,
125
+ getPackage,
126
+ };
package/install.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { install } = require("./binary");
4
+ install(false);
@@ -0,0 +1,518 @@
1
+ {
2
+ "lockfileVersion": 3,
3
+ "name": "blippy",
4
+ "packages": {
5
+ "": {
6
+ "bin": {
7
+ "blippy": "run-blippy.js"
8
+ },
9
+ "dependencies": {
10
+ "axios": "^1.13.2",
11
+ "axios-proxy-builder": "^0.1.2",
12
+ "console.table": "^0.10.0",
13
+ "detect-libc": "^2.1.2",
14
+ "rimraf": "^6.1.2"
15
+ },
16
+ "devDependencies": {
17
+ "prettier": "^3.7.4"
18
+ },
19
+ "engines": {
20
+ "node": ">=14",
21
+ "npm": ">=6"
22
+ },
23
+ "hasInstallScript": true,
24
+ "name": "blippy",
25
+ "version": "0.1.1"
26
+ },
27
+ "node_modules/@isaacs/balanced-match": {
28
+ "engines": {
29
+ "node": "20 || >=22"
30
+ },
31
+ "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==",
32
+ "license": "MIT",
33
+ "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
34
+ "version": "4.0.1"
35
+ },
36
+ "node_modules/@isaacs/brace-expansion": {
37
+ "dependencies": {
38
+ "@isaacs/balanced-match": "^4.0.1"
39
+ },
40
+ "engines": {
41
+ "node": "20 || >=22"
42
+ },
43
+ "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==",
44
+ "license": "MIT",
45
+ "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz",
46
+ "version": "5.0.0"
47
+ },
48
+ "node_modules/asynckit": {
49
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
50
+ "license": "MIT",
51
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
52
+ "version": "0.4.0"
53
+ },
54
+ "node_modules/axios": {
55
+ "dependencies": {
56
+ "follow-redirects": "^1.15.6",
57
+ "form-data": "^4.0.4",
58
+ "proxy-from-env": "^1.1.0"
59
+ },
60
+ "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
61
+ "license": "MIT",
62
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
63
+ "version": "1.13.2"
64
+ },
65
+ "node_modules/axios-proxy-builder": {
66
+ "dependencies": {
67
+ "tunnel": "^0.0.6"
68
+ },
69
+ "integrity": "sha512-6uBVsBZzkB3tCC8iyx59mCjQckhB8+GQrI9Cop8eC7ybIsvs/KtnNgEBfRMSEa7GqK2VBGUzgjNYMdPIfotyPA==",
70
+ "license": "MIT",
71
+ "resolved": "https://registry.npmjs.org/axios-proxy-builder/-/axios-proxy-builder-0.1.2.tgz",
72
+ "version": "0.1.2"
73
+ },
74
+ "node_modules/call-bind-apply-helpers": {
75
+ "dependencies": {
76
+ "es-errors": "^1.3.0",
77
+ "function-bind": "^1.1.2"
78
+ },
79
+ "engines": {
80
+ "node": ">= 0.4"
81
+ },
82
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
83
+ "license": "MIT",
84
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
85
+ "version": "1.0.2"
86
+ },
87
+ "node_modules/clone": {
88
+ "engines": {
89
+ "node": ">=0.8"
90
+ },
91
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
92
+ "license": "MIT",
93
+ "optional": true,
94
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
95
+ "version": "1.0.4"
96
+ },
97
+ "node_modules/combined-stream": {
98
+ "dependencies": {
99
+ "delayed-stream": "~1.0.0"
100
+ },
101
+ "engines": {
102
+ "node": ">= 0.8"
103
+ },
104
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
105
+ "license": "MIT",
106
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
107
+ "version": "1.0.8"
108
+ },
109
+ "node_modules/console.table": {
110
+ "dependencies": {
111
+ "easy-table": "1.1.0"
112
+ },
113
+ "engines": {
114
+ "node": "> 0.10"
115
+ },
116
+ "integrity": "sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==",
117
+ "license": "MIT",
118
+ "resolved": "https://registry.npmjs.org/console.table/-/console.table-0.10.0.tgz",
119
+ "version": "0.10.0"
120
+ },
121
+ "node_modules/defaults": {
122
+ "dependencies": {
123
+ "clone": "^1.0.2"
124
+ },
125
+ "funding": {
126
+ "url": "https://github.com/sponsors/sindresorhus"
127
+ },
128
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
129
+ "license": "MIT",
130
+ "optional": true,
131
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
132
+ "version": "1.0.4"
133
+ },
134
+ "node_modules/delayed-stream": {
135
+ "engines": {
136
+ "node": ">=0.4.0"
137
+ },
138
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
139
+ "license": "MIT",
140
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
141
+ "version": "1.0.0"
142
+ },
143
+ "node_modules/detect-libc": {
144
+ "engines": {
145
+ "node": ">=8"
146
+ },
147
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
148
+ "license": "Apache-2.0",
149
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
150
+ "version": "2.1.2"
151
+ },
152
+ "node_modules/dunder-proto": {
153
+ "dependencies": {
154
+ "call-bind-apply-helpers": "^1.0.1",
155
+ "es-errors": "^1.3.0",
156
+ "gopd": "^1.2.0"
157
+ },
158
+ "engines": {
159
+ "node": ">= 0.4"
160
+ },
161
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
162
+ "license": "MIT",
163
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
164
+ "version": "1.0.1"
165
+ },
166
+ "node_modules/easy-table": {
167
+ "integrity": "sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA==",
168
+ "license": "MIT",
169
+ "optionalDependencies": {
170
+ "wcwidth": ">=1.0.1"
171
+ },
172
+ "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.1.0.tgz",
173
+ "version": "1.1.0"
174
+ },
175
+ "node_modules/es-define-property": {
176
+ "engines": {
177
+ "node": ">= 0.4"
178
+ },
179
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
180
+ "license": "MIT",
181
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
182
+ "version": "1.0.1"
183
+ },
184
+ "node_modules/es-errors": {
185
+ "engines": {
186
+ "node": ">= 0.4"
187
+ },
188
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
189
+ "license": "MIT",
190
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
191
+ "version": "1.3.0"
192
+ },
193
+ "node_modules/es-object-atoms": {
194
+ "dependencies": {
195
+ "es-errors": "^1.3.0"
196
+ },
197
+ "engines": {
198
+ "node": ">= 0.4"
199
+ },
200
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
201
+ "license": "MIT",
202
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
203
+ "version": "1.1.1"
204
+ },
205
+ "node_modules/es-set-tostringtag": {
206
+ "dependencies": {
207
+ "es-errors": "^1.3.0",
208
+ "get-intrinsic": "^1.2.6",
209
+ "has-tostringtag": "^1.0.2",
210
+ "hasown": "^2.0.2"
211
+ },
212
+ "engines": {
213
+ "node": ">= 0.4"
214
+ },
215
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
216
+ "license": "MIT",
217
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
218
+ "version": "2.1.0"
219
+ },
220
+ "node_modules/follow-redirects": {
221
+ "engines": {
222
+ "node": ">=4.0"
223
+ },
224
+ "funding": [
225
+ {
226
+ "type": "individual",
227
+ "url": "https://github.com/sponsors/RubenVerborgh"
228
+ }
229
+ ],
230
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
231
+ "license": "MIT",
232
+ "peerDependenciesMeta": {
233
+ "debug": {
234
+ "optional": true
235
+ }
236
+ },
237
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
238
+ "version": "1.15.6"
239
+ },
240
+ "node_modules/form-data": {
241
+ "dependencies": {
242
+ "asynckit": "^0.4.0",
243
+ "combined-stream": "^1.0.8",
244
+ "es-set-tostringtag": "^2.1.0",
245
+ "hasown": "^2.0.2",
246
+ "mime-types": "^2.1.12"
247
+ },
248
+ "engines": {
249
+ "node": ">= 6"
250
+ },
251
+ "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
252
+ "license": "MIT",
253
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
254
+ "version": "4.0.4"
255
+ },
256
+ "node_modules/function-bind": {
257
+ "funding": {
258
+ "url": "https://github.com/sponsors/ljharb"
259
+ },
260
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
261
+ "license": "MIT",
262
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
263
+ "version": "1.1.2"
264
+ },
265
+ "node_modules/get-intrinsic": {
266
+ "dependencies": {
267
+ "call-bind-apply-helpers": "^1.0.2",
268
+ "es-define-property": "^1.0.1",
269
+ "es-errors": "^1.3.0",
270
+ "es-object-atoms": "^1.1.1",
271
+ "function-bind": "^1.1.2",
272
+ "get-proto": "^1.0.1",
273
+ "gopd": "^1.2.0",
274
+ "has-symbols": "^1.1.0",
275
+ "hasown": "^2.0.2",
276
+ "math-intrinsics": "^1.1.0"
277
+ },
278
+ "engines": {
279
+ "node": ">= 0.4"
280
+ },
281
+ "funding": {
282
+ "url": "https://github.com/sponsors/ljharb"
283
+ },
284
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
285
+ "license": "MIT",
286
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
287
+ "version": "1.3.0"
288
+ },
289
+ "node_modules/get-proto": {
290
+ "dependencies": {
291
+ "dunder-proto": "^1.0.1",
292
+ "es-object-atoms": "^1.0.0"
293
+ },
294
+ "engines": {
295
+ "node": ">= 0.4"
296
+ },
297
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
298
+ "license": "MIT",
299
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
300
+ "version": "1.0.1"
301
+ },
302
+ "node_modules/glob": {
303
+ "dependencies": {
304
+ "minimatch": "^10.1.1",
305
+ "minipass": "^7.1.2",
306
+ "path-scurry": "^2.0.0"
307
+ },
308
+ "engines": {
309
+ "node": "20 || >=22"
310
+ },
311
+ "funding": {
312
+ "url": "https://github.com/sponsors/isaacs"
313
+ },
314
+ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==",
315
+ "license": "BlueOak-1.0.0",
316
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz",
317
+ "version": "13.0.0"
318
+ },
319
+ "node_modules/gopd": {
320
+ "engines": {
321
+ "node": ">= 0.4"
322
+ },
323
+ "funding": {
324
+ "url": "https://github.com/sponsors/ljharb"
325
+ },
326
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
327
+ "license": "MIT",
328
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
329
+ "version": "1.2.0"
330
+ },
331
+ "node_modules/has-symbols": {
332
+ "engines": {
333
+ "node": ">= 0.4"
334
+ },
335
+ "funding": {
336
+ "url": "https://github.com/sponsors/ljharb"
337
+ },
338
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
339
+ "license": "MIT",
340
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
341
+ "version": "1.1.0"
342
+ },
343
+ "node_modules/has-tostringtag": {
344
+ "dependencies": {
345
+ "has-symbols": "^1.0.3"
346
+ },
347
+ "engines": {
348
+ "node": ">= 0.4"
349
+ },
350
+ "funding": {
351
+ "url": "https://github.com/sponsors/ljharb"
352
+ },
353
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
354
+ "license": "MIT",
355
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
356
+ "version": "1.0.2"
357
+ },
358
+ "node_modules/hasown": {
359
+ "dependencies": {
360
+ "function-bind": "^1.1.2"
361
+ },
362
+ "engines": {
363
+ "node": ">= 0.4"
364
+ },
365
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
366
+ "license": "MIT",
367
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
368
+ "version": "2.0.2"
369
+ },
370
+ "node_modules/lru-cache": {
371
+ "engines": {
372
+ "node": "20 || >=22"
373
+ },
374
+ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==",
375
+ "license": "BlueOak-1.0.0",
376
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz",
377
+ "version": "11.2.4"
378
+ },
379
+ "node_modules/math-intrinsics": {
380
+ "engines": {
381
+ "node": ">= 0.4"
382
+ },
383
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
384
+ "license": "MIT",
385
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
386
+ "version": "1.1.0"
387
+ },
388
+ "node_modules/mime-db": {
389
+ "engines": {
390
+ "node": ">= 0.6"
391
+ },
392
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
393
+ "license": "MIT",
394
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
395
+ "version": "1.52.0"
396
+ },
397
+ "node_modules/mime-types": {
398
+ "dependencies": {
399
+ "mime-db": "1.52.0"
400
+ },
401
+ "engines": {
402
+ "node": ">= 0.6"
403
+ },
404
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
405
+ "license": "MIT",
406
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
407
+ "version": "2.1.35"
408
+ },
409
+ "node_modules/minimatch": {
410
+ "dependencies": {
411
+ "@isaacs/brace-expansion": "^5.0.0"
412
+ },
413
+ "engines": {
414
+ "node": "20 || >=22"
415
+ },
416
+ "funding": {
417
+ "url": "https://github.com/sponsors/isaacs"
418
+ },
419
+ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
420
+ "license": "BlueOak-1.0.0",
421
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
422
+ "version": "10.1.1"
423
+ },
424
+ "node_modules/minipass": {
425
+ "engines": {
426
+ "node": ">=16 || 14 >=14.17"
427
+ },
428
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
429
+ "license": "ISC",
430
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
431
+ "version": "7.1.2"
432
+ },
433
+ "node_modules/package-json-from-dist": {
434
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
435
+ "license": "BlueOak-1.0.0",
436
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
437
+ "version": "1.0.1"
438
+ },
439
+ "node_modules/path-scurry": {
440
+ "dependencies": {
441
+ "lru-cache": "^11.0.0",
442
+ "minipass": "^7.1.2"
443
+ },
444
+ "engines": {
445
+ "node": "20 || >=22"
446
+ },
447
+ "funding": {
448
+ "url": "https://github.com/sponsors/isaacs"
449
+ },
450
+ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==",
451
+ "license": "BlueOak-1.0.0",
452
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz",
453
+ "version": "2.0.1"
454
+ },
455
+ "node_modules/prettier": {
456
+ "bin": {
457
+ "prettier": "bin/prettier.cjs"
458
+ },
459
+ "dev": true,
460
+ "engines": {
461
+ "node": ">=14"
462
+ },
463
+ "funding": {
464
+ "url": "https://github.com/prettier/prettier?sponsor=1"
465
+ },
466
+ "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==",
467
+ "license": "MIT",
468
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz",
469
+ "version": "3.7.4"
470
+ },
471
+ "node_modules/proxy-from-env": {
472
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
473
+ "license": "MIT",
474
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
475
+ "version": "1.1.0"
476
+ },
477
+ "node_modules/rimraf": {
478
+ "bin": {
479
+ "rimraf": "dist/esm/bin.mjs"
480
+ },
481
+ "dependencies": {
482
+ "glob": "^13.0.0",
483
+ "package-json-from-dist": "^1.0.1"
484
+ },
485
+ "engines": {
486
+ "node": "20 || >=22"
487
+ },
488
+ "funding": {
489
+ "url": "https://github.com/sponsors/isaacs"
490
+ },
491
+ "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==",
492
+ "license": "BlueOak-1.0.0",
493
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz",
494
+ "version": "6.1.2"
495
+ },
496
+ "node_modules/tunnel": {
497
+ "engines": {
498
+ "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
499
+ },
500
+ "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
501
+ "license": "MIT",
502
+ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
503
+ "version": "0.0.6"
504
+ },
505
+ "node_modules/wcwidth": {
506
+ "dependencies": {
507
+ "defaults": "^1.0.3"
508
+ },
509
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
510
+ "license": "MIT",
511
+ "optional": true,
512
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
513
+ "version": "1.0.1"
514
+ }
515
+ },
516
+ "requires": true,
517
+ "version": "0.1.1"
518
+ }
package/package.json ADDED
@@ -0,0 +1,83 @@
1
+ {
2
+ "artifactDownloadUrl": "https://github.com/AksharP5/blippy/releases/download/v0.1.1",
3
+ "bin": {
4
+ "blippy": "run-blippy.js"
5
+ },
6
+ "dependencies": {
7
+ "axios": "^1.13.2",
8
+ "axios-proxy-builder": "^0.1.2",
9
+ "console.table": "^0.10.0",
10
+ "detect-libc": "^2.1.2",
11
+ "rimraf": "^6.1.2"
12
+ },
13
+ "description": "Maintainer-first TUI for triaging GitHub issues and pull requests",
14
+ "devDependencies": {
15
+ "prettier": "^3.7.4"
16
+ },
17
+ "engines": {
18
+ "node": ">=14",
19
+ "npm": ">=6"
20
+ },
21
+ "glibcMinimum": {
22
+ "major": 2,
23
+ "series": 35
24
+ },
25
+ "homepage": "https://github.com/AksharP5/blippy",
26
+ "name": "blippy",
27
+ "preferUnplugged": true,
28
+ "repository": "https://github.com/AksharP5/blippy",
29
+ "scripts": {
30
+ "fmt": "prettier --write **/*.js",
31
+ "fmt:check": "prettier --check **/*.js",
32
+ "postinstall": "node ./install.js"
33
+ },
34
+ "supportedPlatforms": {
35
+ "aarch64-apple-darwin": {
36
+ "artifactName": "blippy-aarch64-apple-darwin.tar.gz",
37
+ "bins": {
38
+ "blippy": "blippy"
39
+ },
40
+ "zipExt": ".tar.gz"
41
+ },
42
+ "aarch64-pc-windows-msvc": {
43
+ "artifactName": "blippy-x86_64-pc-windows-msvc.zip",
44
+ "bins": {
45
+ "blippy": "blippy.exe"
46
+ },
47
+ "zipExt": ".zip"
48
+ },
49
+ "x86_64-apple-darwin": {
50
+ "artifactName": "blippy-x86_64-apple-darwin.tar.gz",
51
+ "bins": {
52
+ "blippy": "blippy"
53
+ },
54
+ "zipExt": ".tar.gz"
55
+ },
56
+ "x86_64-pc-windows-gnu": {
57
+ "artifactName": "blippy-x86_64-pc-windows-msvc.zip",
58
+ "bins": {
59
+ "blippy": "blippy.exe"
60
+ },
61
+ "zipExt": ".zip"
62
+ },
63
+ "x86_64-pc-windows-msvc": {
64
+ "artifactName": "blippy-x86_64-pc-windows-msvc.zip",
65
+ "bins": {
66
+ "blippy": "blippy.exe"
67
+ },
68
+ "zipExt": ".zip"
69
+ },
70
+ "x86_64-unknown-linux-gnu": {
71
+ "artifactName": "blippy-x86_64-unknown-linux-gnu.tar.gz",
72
+ "bins": {
73
+ "blippy": "blippy"
74
+ },
75
+ "zipExt": ".tar.gz"
76
+ }
77
+ },
78
+ "version": "0.1.1",
79
+ "volta": {
80
+ "node": "18.14.1",
81
+ "npm": "9.5.0"
82
+ }
83
+ }
package/run-blippy.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { run } = require("./binary");
4
+ run("blippy");