@hivecommons/promptargs 0.6.0 → 0.8.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/parser.d.ts CHANGED
@@ -7,5 +7,6 @@ export interface TemplateVar {
7
7
  defaultValue?: string;
8
8
  raw: string;
9
9
  }
10
+ export declare const VAR_PATTERN: RegExp;
10
11
  export declare function parseVars(template: string): TemplateVar[];
11
12
  export declare function expand(template: string, values: Record<string, string>): string;
package/dist/parser.js CHANGED
@@ -3,15 +3,51 @@
3
3
  * Uses Mustache for expansion, with a promptargs extension for defaults.
4
4
  */
5
5
  import Mustache from 'mustache';
6
- const VAR_PATTERN = /\{\{(\w+)(?:=([^}]*))?\}\}/g;
6
+ // Kept local (not imported from flags.ts) because ui.html loads parser.js in the browser,
7
+ // where only parser.js/iterate.js/mustache.mjs are served (see STATIC_JS_ROUTES in ui.ts).
8
+ function usageError(message) {
9
+ const e = new Error(message);
10
+ e.name = 'UsageError';
11
+ return e;
12
+ }
13
+ // Exported so any code that needs to recognize the same {{var}} / {{var=default}}
14
+ // grammar (e.g. CLI syntax highlighting) reuses this single definition instead
15
+ // of re-declaring the pattern and risking drift.
16
+ //
17
+ // Whitespace padding inside the delimiters ({{ name }}, {{ name=default }}) is
18
+ // accepted because Mustache accepts it: a padded tag that this pattern did not
19
+ // recognize would still be handed to Mustache as a variable, which renders it
20
+ // as an empty string — the blank silently vanished instead of being asked for,
21
+ // filled from --flags, highlighted by `show`, or preserved as {{name}}.
22
+ // Trailing padding after a default is not part of the default.
23
+ export const VAR_PATTERN = /\{\{\s*([\w-]+)(?:=([^}]*?))?\s*\}\}/g;
24
+ // Dotted names ({{repo.owner}}) are Mustache context paths, which promptargs
25
+ // never fills; they would silently render empty, so they are rejected.
26
+ // The lookbehind skips triple-mustache tags; sigil tags ({{#x}}, {{!c}}) do
27
+ // not start with a name character and never match.
28
+ const DOTTED_PATTERN = /(?<!\{)\{\{\s*([\w-]+\.[\w.-]*)\s*(?:=[^}]*)?\}\}/;
7
29
  export function parseVars(template) {
8
- const seen = new Set();
9
30
  const vars = [];
31
+ // The first offending tag aborts; the message is built from the name only
32
+ // (restricted to [\w.-]) so raw template bytes never reach the terminal.
33
+ const dotted = DOTTED_PATTERN.exec(template);
34
+ if (dotted) {
35
+ const name = dotted[1];
36
+ throw usageError(`Unsupported variable name "${name}": dotted names are not supported; use {{${name.replace(/\./g, '_')}}}`);
37
+ }
10
38
  for (const match of template.matchAll(VAR_PATTERN)) {
11
39
  const name = match[1];
12
- if (seen.has(name))
40
+ const existing = vars.find((v) => v.name === name);
41
+ if (existing) {
42
+ const dflt = match[2];
43
+ if (dflt === undefined)
44
+ continue;
45
+ // First default wins; later occurrences may restate it (e.g. a code
46
+ // fence using a different casing) without being an error.
47
+ if (existing.defaultValue === undefined)
48
+ existing.defaultValue = dflt;
13
49
  continue;
14
- seen.add(name);
50
+ }
15
51
  vars.push({
16
52
  name,
17
53
  defaultValue: match[2],
@@ -22,20 +58,22 @@ export function parseVars(template) {
22
58
  }
23
59
  export function expand(template, values) {
24
60
  const vars = parseVars(template);
25
- const view = { ...values };
61
+ const view = Object.assign(Object.create(null), values);
26
62
  for (const v of vars) {
27
- if (!(v.name in view) && v.defaultValue !== undefined) {
63
+ if (!Object.hasOwn(view, v.name) && v.defaultValue !== undefined) {
28
64
  view[v.name] = v.defaultValue;
29
65
  }
30
66
  // Preserve unfilled vars as {{name}} in output
31
- if (!(v.name in view)) {
67
+ if (!Object.hasOwn(view, v.name)) {
32
68
  view[v.name] = `{{${v.name}}}`;
33
69
  }
34
70
  }
35
71
  // Convert {{var=default}} to {{var}} so Mustache can handle it
36
72
  const normalized = template.replace(VAR_PATTERN, (_match, name) => `{{${name}}}`);
37
- // Disable HTML escaping — we want raw text output
38
- Mustache.escape = (text) => text;
39
- return Mustache.render(normalized, view);
73
+ // Disable HTML escaping for this render only — we want raw text output.
74
+ // Passed via the per-call config (4th arg) rather than assigning to the
75
+ // module-level Mustache.escape, which would permanently disable escaping
76
+ // for every other consumer of the shared `mustache` module in this process.
77
+ return Mustache.render(normalized, view, undefined, { escape: (text) => text });
40
78
  }
41
79
  //# sourceMappingURL=parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,UAAU,CAAC;AAQhC,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAElD,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,IAAI,GAAkB,EAAE,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC;YACR,IAAI;YACJ,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;YACtB,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;SACd,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,QAAgB,EAAE,MAA8B;IACrE,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,IAAI,GAA2B,EAAE,GAAG,MAAM,EAAE,CAAC;IAEnD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACtD,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC;QAChC,CAAC;QACD,+CAA+C;QAC/C,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC;QACjC,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,IAAY,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;IAE1F,kDAAkD;IAClD,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC;IAEzC,OAAO,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
@@ -6,5 +6,7 @@ import type { TemplateVar } from './parser.js';
6
6
  export interface ResolvedValues {
7
7
  values: Record<string, string>;
8
8
  iterations: Record<string, string>[];
9
+ /** Names whose value was filled from the template default. */
10
+ defaulted: Set<string>;
9
11
  }
10
12
  export declare function resolve(vars: TemplateVar[], flags: Record<string, string>, interactive: boolean, cross?: boolean): Promise<ResolvedValues>;
package/dist/resolver.js CHANGED
@@ -3,69 +3,114 @@
3
3
  * Handles array expansion (comma-separated, globs, @file, stdin).
4
4
  */
5
5
  import { createInterface } from 'node:readline';
6
- import { readFileSync, existsSync } from 'node:fs';
7
- import { execSync } from 'node:child_process';
6
+ import { readFileSync, readdirSync, existsSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
8
  import { autodetect } from './autodetect.js';
9
- function expandArrayValue(raw) {
9
+ import { UsageError } from './flags.js';
10
+ import { cartesian, zip } from './iterate.js';
11
+ function expandPiece(piece) {
12
+ // Glob pattern — expanded in-process (never via a shell) to avoid
13
+ // command injection through crafted values.
14
+ if (piece.includes('*') || piece.includes('?')) {
15
+ const files = expandGlob(piece);
16
+ if (files.length > 0)
17
+ return files;
18
+ // Not a valid glob, treat as literal
19
+ }
20
+ return [piece];
21
+ }
22
+ function expandArrayValue(raw, varName) {
10
23
  // @file — read lines from file
11
24
  if (raw.startsWith('@') && existsSync(raw.slice(1))) {
12
- return readFileSync(raw.slice(1), 'utf8')
13
- .split('\n')
14
- .map((l) => l.trim())
15
- .filter(Boolean);
16
- }
17
- // - (stdin) handled at CLI level before this
18
- if (raw === '-')
19
- return [raw];
20
- // Glob pattern
21
- if (raw.includes('*') || raw.includes('?')) {
25
+ const filePath = raw.slice(1);
22
26
  try {
23
- const files = execSync(`ls -1 ${raw}`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] })
24
- .trim()
27
+ return readFileSync(filePath, 'utf8')
25
28
  .split('\n')
26
- .filter(Boolean);
27
- if (files.length > 0)
28
- return files;
29
+ .map((l) => l.trim())
30
+ .filter(Boolean)
31
+ .flatMap(expandPiece);
29
32
  }
30
- catch {
31
- // Not a valid glob, treat as literal
33
+ catch (err) {
34
+ const e = err;
35
+ if (e.code === 'EISDIR') {
36
+ throw new UsageError(`Variable "${varName}": @${filePath} is a directory, not a file; pass @FILE with one value per line`);
37
+ }
38
+ throw new UsageError(`Variable "${varName}": could not read @${filePath}: ${e.message}`);
32
39
  }
33
40
  }
34
- // Comma-separated
41
+ // - (stdin) handled at CLI level before this
42
+ if (raw === '-')
43
+ return [raw];
44
+ // Comma-separated: split first so each piece can be a glob
35
45
  if (raw.includes(',')) {
36
- return raw.split(',').map(s => s.trim()).filter(Boolean);
46
+ return raw.split(',').map(s => s.trim()).filter(Boolean).flatMap(expandPiece);
37
47
  }
38
- return [raw];
48
+ return expandPiece(raw);
49
+ }
50
+ function segmentToRegExp(segment) {
51
+ const escaped = segment
52
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
53
+ .replace(/\*/g, '[^/]*')
54
+ .replace(/\?/g, '.');
55
+ return new RegExp(`^${escaped}$`);
39
56
  }
40
- function cartesian(arrays) {
41
- if (arrays.length === 0)
42
- return [[]];
43
- const [first, ...rest] = arrays;
44
- const restCombos = cartesian(rest);
45
- const result = [];
46
- for (const val of first) {
47
- for (const combo of restCombos) {
48
- result.push([val, ...combo]);
57
+ function expandGlob(pattern) {
58
+ const absolute = pattern.startsWith('/');
59
+ const segments = pattern.split('/').filter(Boolean);
60
+ let bases = [absolute ? '/' : ''];
61
+ for (const segment of segments) {
62
+ const next = [];
63
+ if (!segment.includes('*') && !segment.includes('?')) {
64
+ for (const base of bases) {
65
+ const p = base === '' ? segment : join(base, segment);
66
+ if (existsSync(p))
67
+ next.push(p);
68
+ }
69
+ }
70
+ else {
71
+ const re = segmentToRegExp(segment);
72
+ const matchHidden = segment.startsWith('.');
73
+ for (const base of bases) {
74
+ let entries;
75
+ try {
76
+ entries = readdirSync(base === '' ? '.' : base);
77
+ }
78
+ catch {
79
+ continue;
80
+ }
81
+ for (const entry of entries) {
82
+ if (!matchHidden && entry.startsWith('.'))
83
+ continue;
84
+ if (re.test(entry))
85
+ next.push(base === '' ? entry : join(base, entry));
86
+ }
87
+ }
49
88
  }
89
+ bases = next;
90
+ if (bases.length === 0)
91
+ break;
50
92
  }
51
- return result;
93
+ return bases.sort();
52
94
  }
53
95
  export async function resolve(vars, flags, interactive, cross = false) {
54
- const values = {};
55
- const arrayVars = {};
96
+ const values = Object.create(null);
97
+ const arrayVars = Object.create(null);
98
+ const defaulted = new Set();
56
99
  let hasArrays = false;
57
100
  for (const v of vars) {
58
101
  // 1. Check flags
59
- if (v.name in flags) {
60
- const expanded = expandArrayValue(flags[v.name]);
102
+ if (Object.hasOwn(flags, v.name)) {
103
+ const expanded = expandArrayValue(flags[v.name], v.name);
61
104
  if (expanded.length > 1) {
62
105
  arrayVars[v.name] = expanded;
63
106
  hasArrays = true;
107
+ continue;
64
108
  }
65
- else {
109
+ // An empty expansion falls through as if the flag were absent
110
+ if (expanded.length === 1) {
66
111
  values[v.name] = expanded[0];
112
+ continue;
67
113
  }
68
- continue;
69
114
  }
70
115
  // 2. Auto-detect
71
116
  const auto = autodetect(v.name);
@@ -76,55 +121,54 @@ export async function resolve(vars, flags, interactive, cross = false) {
76
121
  // 3. Default
77
122
  if (v.defaultValue !== undefined) {
78
123
  values[v.name] = v.defaultValue;
124
+ defaulted.add(v.name);
79
125
  continue;
80
126
  }
81
127
  // 4. Ask interactively
82
128
  if (interactive) {
83
- const answer = await ask(` ${v.name}: `);
84
- const expanded = expandArrayValue(answer);
129
+ const answer = await ask(` ${v.name}: `, v.name);
130
+ const expanded = expandArrayValue(answer, v.name);
85
131
  if (expanded.length > 1) {
86
132
  arrayVars[v.name] = expanded;
87
133
  hasArrays = true;
88
134
  }
89
135
  else {
90
- values[v.name] = expanded[0];
136
+ values[v.name] = expanded[0] ?? '';
91
137
  }
92
138
  }
93
139
  }
94
140
  // Build iterations
95
141
  if (!hasArrays) {
96
- return { values, iterations: [values] };
142
+ return { values, iterations: [values], defaulted };
97
143
  }
98
144
  const arrayNames = Object.keys(arrayVars);
99
145
  const iterations = [];
100
- if (cross) {
101
- const arrays = arrayNames.map(n => arrayVars[n]);
102
- const combos = cartesian(arrays);
103
- for (const combo of combos) {
104
- const iter = { ...values };
105
- for (let j = 0; j < arrayNames.length; j++) {
106
- iter[arrayNames[j]] = combo[j];
107
- }
108
- iterations.push(iter);
146
+ const arrays = arrayNames.map(n => arrayVars[n]);
147
+ const combos = cross ? cartesian(arrays) : zip(arrays);
148
+ for (const combo of combos) {
149
+ const iter = Object.assign(Object.create(null), values);
150
+ for (let j = 0; j < arrayNames.length; j++) {
151
+ iter[arrayNames[j]] = combo[j];
109
152
  }
153
+ iterations.push(iter);
110
154
  }
111
- else {
112
- const maxLen = Math.max(...arrayNames.map(n => arrayVars[n].length));
113
- for (let i = 0; i < maxLen; i++) {
114
- const iter = { ...values };
115
- for (const name of arrayNames) {
116
- const arr = arrayVars[name];
117
- iter[name] = arr[i % arr.length];
118
- }
119
- iterations.push(iter);
120
- }
121
- }
122
- return { values, iterations };
155
+ return { values, iterations, defaulted };
123
156
  }
124
- function ask(prompt) {
157
+ function ask(prompt, name) {
125
158
  const rl = createInterface({ input: process.stdin, output: process.stderr });
126
- return new Promise(resolve => {
159
+ return new Promise((resolve, reject) => {
160
+ let settled = false;
161
+ // Fires on stdin EOF before an answer; without it the Promise never settles.
162
+ rl.on('close', () => {
163
+ if (settled)
164
+ return;
165
+ settled = true;
166
+ reject(new UsageError(`Variable "${name}" has no value and stdin is closed; pass --${name}=<value> or --no-interactive`));
167
+ });
127
168
  rl.question(prompt, (answer) => {
169
+ if (settled)
170
+ return;
171
+ settled = true;
128
172
  rl.close();
129
173
  resolve(answer.trim());
130
174
  });
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Strip terminal escape sequences and control characters from text that is
3
+ * displayed in the user's terminal but originates from untrusted sources
4
+ * (repo-checked-in .prompts/ templates, git diff output, env values).
5
+ *
6
+ * Without this, a cloned repository's template could embed OSC/CSI sequences
7
+ * that retitle the window, write to the clipboard (OSC 52), or overwrite
8
+ * previously printed lines when the user runs `promptargs list` or `show`.
9
+ */
10
+ export declare function sanitizeForTerminal(text: string): string;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Strip terminal escape sequences and control characters from text that is
3
+ * displayed in the user's terminal but originates from untrusted sources
4
+ * (repo-checked-in .prompts/ templates, git diff output, env values).
5
+ *
6
+ * Without this, a cloned repository's template could embed OSC/CSI sequences
7
+ * that retitle the window, write to the clipboard (OSC 52), or overwrite
8
+ * previously printed lines when the user runs `promptargs list` or `show`.
9
+ */
10
+ // ESC-initiated sequences: CSI, OSC (BEL- or ST-terminated), DCS/SOS/PM/APC,
11
+ // and single-character escapes.
12
+ const ANSI_SEQ =
13
+ // eslint-disable-next-line no-control-regex
14
+ /\x1b(?:\[[0-?]*[ -/]*[@-~]|\][^\x07\x1b]*(?:\x07|\x1b\\)?|[PX^_][^\x1b]*(?:\x1b\\)?|[0-~])/g;
15
+ // Remaining C0 controls (except \t and \n), DEL, and the C1 CSI byte.
16
+ // eslint-disable-next-line no-control-regex
17
+ const CONTROL_CHARS = /[\x00-\x08\x0b-\x1f\x7f\u0080-\u009f]/g;
18
+ export function sanitizeForTerminal(text) {
19
+ return text.replace(ANSI_SEQ, '').replace(CONTROL_CHARS, '');
20
+ }
21
+ //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,6EAA6E;AAC7E,gCAAgC;AAChC,MAAM,QAAQ;AACZ,4CAA4C;AAC5C,6FAA6F,CAAC;AAEhG,sEAAsE;AACtE,4CAA4C;AAC5C,MAAM,aAAa,GAAG,wCAAwC,CAAC;AAE/D,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AAC/D,CAAC"}
package/dist/status.d.ts CHANGED
@@ -6,4 +6,4 @@ import type { TemplateVar } from './parser.js';
6
6
  export declare function renderStatus(templateName: string, vars: TemplateVar[], values: Record<string, string>, iteration?: {
7
7
  current: number;
8
8
  total: number;
9
- }): string;
9
+ }, defaulted?: ReadonlySet<string>): string;
package/dist/status.js CHANGED
@@ -2,21 +2,25 @@
2
2
  * Status line rendering for Claude Code's status area.
3
3
  * Shows current template state: filled vars, unfilled vars, progress.
4
4
  */
5
- export function renderStatus(templateName, vars, values, iteration) {
5
+ import { sanitizeForTerminal } from './sanitize.js';
6
+ export function renderStatus(templateName, vars, values, iteration, defaulted) {
6
7
  const parts = [];
7
8
  for (const v of vars) {
8
- const val = values[v.name];
9
+ const val = Object.hasOwn(values, v.name) ? values[v.name] : undefined;
9
10
  if (val !== undefined) {
10
- const source = v.defaultValue === val ? '(default)' : '';
11
+ const isDefault = defaulted ? defaulted.has(v.name) : v.defaultValue === val;
12
+ const source = isDefault ? '(default)' : '';
11
13
  parts.push(`${v.name}=${val}${source}`);
12
14
  }
13
15
  else {
14
16
  parts.push(`${v.name}=___`);
15
17
  }
16
18
  }
17
- const allFilled = vars.every(v => v.name in values);
19
+ const allFilled = vars.every(v => Object.hasOwn(values, v.name));
18
20
  const icon = allFilled ? '✅' : '📋';
19
21
  const progress = iteration ? ` [${iteration.current}/${iteration.total}]` : '';
20
- return `${icon} ${templateName}${progress}: ${parts.join(' ')}`;
22
+ // Values may come from repo-controlled sources (templates, git diff);
23
+ // never let them inject escape sequences into the status line.
24
+ return sanitizeForTerminal(`${icon} ${templateName}${progress}: ${parts.join(' ')}`);
21
25
  }
22
26
  //# sourceMappingURL=status.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,UAAU,YAAY,CAC1B,YAAoB,EACpB,IAAmB,EACnB,MAA8B,EAC9B,SAA8C;IAE9C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACpC,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/E,OAAO,GAAG,IAAI,IAAI,YAAY,GAAG,QAAQ,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACnE,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,UAAU,YAAY,CAC1B,YAAoB,EACpB,IAAmB,EACnB,MAA8B,EAC9B,SAA8C,EAC9C,SAA+B;IAE/B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC;YAC7E,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACpC,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/E,sEAAsE;IACtE,+DAA+D;IAC/D,OAAO,mBAAmB,CAAC,GAAG,IAAI,IAAI,YAAY,GAAG,QAAQ,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxF,CAAC"}
package/dist/ui.d.ts CHANGED
@@ -1 +1,13 @@
1
- export declare function startUI(port?: number): void;
1
+ import { type Server } from 'node:http';
2
+ export declare function shouldSkipEnv(key: string): boolean;
3
+ export declare function truncateValue(val: string, max: number): string;
4
+ export interface EnvData {
5
+ git: Record<string, string>;
6
+ terminal: Record<string, string>;
7
+ }
8
+ export declare function collectEnvVars(): EnvData;
9
+ export interface StartUIOptions {
10
+ openBrowser?: boolean;
11
+ }
12
+ export declare function buildUIHtml(rawHtml: string, envVars: EnvData): string;
13
+ export declare function startUI(port?: number, options?: StartUIOptions): Server;