@hmanlab/hl-plugins 0.1.0

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/dist/lib/ui.js ADDED
@@ -0,0 +1,103 @@
1
+ // Tiny terminal UI helpers -- colors, spinners, hidden prompts.
2
+ // No third-party deps; ANSI escape codes only. Stays readable in dumb terminals.
3
+ import { createInterface } from "node:readline/promises";
4
+ import { stdin, stdout } from "node:process";
5
+ const isTTY = stdout.isTTY;
6
+ const c = (code) => (isTTY ? `\x1b[${code}m` : "");
7
+ const RESET = isTTY ? "\x1b[0m" : "";
8
+ const wrap = (code, s) => `${c(code)}${s}${RESET}`;
9
+ export const ui = {
10
+ bold: (s) => wrap("1", s),
11
+ dim: (s) => wrap("2", s),
12
+ red: (s) => wrap("31", s),
13
+ green: (s) => wrap("32", s),
14
+ yellow: (s) => wrap("33", s),
15
+ blue: (s) => wrap("34", s),
16
+ cyan: (s) => wrap("36", s),
17
+ gray: (s) => wrap("90", s),
18
+ ok: (s) => `${c("32")}✓${RESET} ${s}`,
19
+ fail: (s) => `${c("31")}✗${RESET} ${s}`,
20
+ warn: (s) => `${c("33")}!${RESET} ${s}`,
21
+ header: (s) => `\n${c("1")}${s}${RESET}\n`,
22
+ rule: () => (isTTY ? `${c("90")}${"─".repeat(60)}${RESET}` : "─".repeat(60)),
23
+ step: (n, total, label) => `${c("90")}[${n}/${total}]${RESET} ${c("1")}${label}${RESET}`,
24
+ info: (s) => console.log(s),
25
+ error: (s) => console.error(`${c("31")}error:${RESET} ${s}`),
26
+ /**
27
+ * Run an async task with a simple braille spinner. Animates only when
28
+ * stdout is a TTY; otherwise just prints "label..." and runs silently.
29
+ * Always clears the spinner line on completion.
30
+ */
31
+ async spinner(label, fn) {
32
+ if (!isTTY) {
33
+ stdout.write(` ${c("36")}•${RESET} ${label}...`);
34
+ try {
35
+ const result = await fn();
36
+ stdout.write(`\r${c("32")}✓${RESET} ${label}\n`);
37
+ return result;
38
+ }
39
+ catch (err) {
40
+ stdout.write(`\r${c("31")}✗${RESET} ${label}\n`);
41
+ throw err;
42
+ }
43
+ }
44
+ const FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
45
+ let i = 0;
46
+ const write = (frame) => {
47
+ stdout.write(`\r${c("36")}${frame}${RESET} ${label}`);
48
+ };
49
+ write(FRAMES[0]);
50
+ const timer = setInterval(() => {
51
+ i = (i + 1) % FRAMES.length;
52
+ write(FRAMES[i]);
53
+ }, 80);
54
+ try {
55
+ const result = await fn();
56
+ clearInterval(timer);
57
+ stdout.write(`\r${c("32")}✓${RESET} ${label}\n`);
58
+ return result;
59
+ }
60
+ catch (err) {
61
+ clearInterval(timer);
62
+ stdout.write(`\r${c("31")}✗${RESET} ${label}\n`);
63
+ throw err;
64
+ }
65
+ },
66
+ /** Section header inside a command, e.g. "[3/7] Authenticate". */
67
+ section: (label) => {
68
+ stdout.write(`\n${ui.bold(label)}\n`);
69
+ },
70
+ /** Prompt for a hidden string (e.g. API key). Echoes nothing. */
71
+ async promptHidden(question) {
72
+ if (!stdin.isTTY) {
73
+ throw new Error("Cannot prompt for hidden input: stdin is not a TTY. " +
74
+ "Pipe the value via env or --key instead.");
75
+ }
76
+ const rl = createInterface({ input: stdin, output: stdout, terminal: true });
77
+ try {
78
+ // Best-effort: turn off echo if the TTY supports it.
79
+ // process.stdin.setRawMode?.(true) would block line-mode semantics;
80
+ // readline + write("\x1b[8m") is a portable approximation.
81
+ stdout.write(question);
82
+ stdout.write("\x1b[8m"); // hide cursor / attempt to hide input
83
+ const answer = await rl.question("");
84
+ stdout.write("\x1b[0m");
85
+ stdout.write("\n");
86
+ return answer.trim();
87
+ }
88
+ finally {
89
+ rl.close();
90
+ }
91
+ },
92
+ async promptVisible(question) {
93
+ const rl = createInterface({ input: stdin, output: stdout, terminal: true });
94
+ try {
95
+ const answer = await rl.question(question);
96
+ return answer.trim();
97
+ }
98
+ finally {
99
+ rl.close();
100
+ }
101
+ },
102
+ };
103
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/lib/ui.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@hmanlab/hl-plugins",
3
+ "version": "0.1.0",
4
+ "description": "Install curated OpenCode plugins with one command.",
5
+ "type": "module",
6
+ "bin": {
7
+ "hl-plugins": "bin/hl-plugins.js"
8
+ },
9
+ "files": [
10
+ "bin",
11
+ "dist",
12
+ "opencode",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc -p tsconfig.json",
18
+ "clean": "rm -rf dist",
19
+ "help": "node ./bin/hl-plugins.js help"
20
+ },
21
+ "engines": {
22
+ "node": ">=18"
23
+ },
24
+ "keywords": [
25
+ "opencode",
26
+ "plugin",
27
+ "cli"
28
+ ],
29
+ "license": "MIT",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/hmanlab/hl-plugins.git",
33
+ "directory": "packages/cli"
34
+ },
35
+ "homepage": "https://github.com/hmanlab/hl-plugins#readme",
36
+ "bugs": {
37
+ "url": "https://github.com/hmanlab/hl-plugins/issues"
38
+ }
39
+ }