@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/README.md +139 -14
- package/dist/autodetect.d.ts +2 -0
- package/dist/autodetect.js +72 -7
- package/dist/autodetect.js.map +1 -1
- package/dist/cli.js +50 -141
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts +4 -0
- package/dist/commands.js +130 -0
- package/dist/commands.js.map +1 -0
- package/dist/flags.d.ts +14 -0
- package/dist/flags.js +57 -0
- package/dist/flags.js.map +1 -0
- package/dist/iterate.d.ts +8 -0
- package/dist/iterate.js +28 -0
- package/dist/iterate.js.map +1 -0
- package/dist/loader.d.ts +2 -0
- package/dist/loader.js +64 -11
- package/dist/loader.js.map +1 -1
- package/dist/log.d.ts +19 -0
- package/dist/log.js +41 -0
- package/dist/log.js.map +1 -0
- package/dist/mustache.mjs +764 -0
- package/dist/parser.d.ts +1 -0
- package/dist/parser.js +48 -10
- package/dist/parser.js.map +1 -1
- package/dist/resolver.d.ts +2 -0
- package/dist/resolver.js +110 -66
- package/dist/resolver.js.map +1 -1
- package/dist/sanitize.d.ts +10 -0
- package/dist/sanitize.js +21 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/status.d.ts +1 -1
- package/dist/status.js +9 -5
- package/dist/status.js.map +1 -1
- package/dist/ui.d.ts +13 -1
- package/dist/ui.html +46 -60
- package/dist/ui.js +89 -21
- package/dist/ui.js.map +1 -1
- package/package.json +16 -6
- package/dist/parser.test.d.ts +0 -1
- package/dist/parser.test.js +0 -56
- package/dist/parser.test.js.map +0 -1
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
61
|
+
const view = Object.assign(Object.create(null), values);
|
|
26
62
|
for (const v of vars) {
|
|
27
|
-
if (!(v.name
|
|
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
|
|
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
|
-
|
|
39
|
-
|
|
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
|
package/dist/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
package/dist/resolver.d.ts
CHANGED
|
@@ -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 {
|
|
6
|
+
import { readFileSync, readdirSync, existsSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
8
|
import { autodetect } from './autodetect.js';
|
|
9
|
-
|
|
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
|
-
|
|
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
|
-
|
|
24
|
-
.trim()
|
|
27
|
+
return readFileSync(filePath, 'utf8')
|
|
25
28
|
.split('\n')
|
|
26
|
-
.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
.map((l) => l.trim())
|
|
30
|
+
.filter(Boolean)
|
|
31
|
+
.flatMap(expandPiece);
|
|
29
32
|
}
|
|
30
|
-
catch {
|
|
31
|
-
|
|
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
|
-
//
|
|
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
|
|
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
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
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
|
});
|
package/dist/resolver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
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;
|
package/dist/sanitize.js
ADDED
|
@@ -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
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
package/dist/status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
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
|
-
|
|
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;
|