spirewise 1.9.2 → 1.9.4
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/bin/cli.js +15 -8
- package/install.sh +1 -1
- package/package.json +1 -1
package/bin/cli.js
CHANGED
|
@@ -56,7 +56,7 @@ const BANNER = [
|
|
|
56
56
|
function banner() {
|
|
57
57
|
console.log('');
|
|
58
58
|
for (const line of BANNER) console.log(paint(RAW.cyan, line));
|
|
59
|
-
console.log(paint(RAW.magenta, ` Agent Skills ·
|
|
59
|
+
console.log(paint(RAW.magenta, ` Agent Skills · That Startup Founders Love ${PKG_VERSION ? ' · v' + PKG_VERSION : ''}`));
|
|
60
60
|
console.log('');
|
|
61
61
|
}
|
|
62
62
|
|
|
@@ -225,7 +225,7 @@ const live = (s) => { if (IS_TTY) process.stdout.write('\r\x1b[2K' + s); };
|
|
|
225
225
|
const liveEnd = (s) => { if (IS_TTY) process.stdout.write('\r\x1b[2K' + s + '\n'); else console.log(s); };
|
|
226
226
|
|
|
227
227
|
// --- Interactive prompt (Clack / Appwrite style) ---------------------------
|
|
228
|
-
function interactiveSelect({ title, subtitle, items, multi = true, preselected = [], pageSize =
|
|
228
|
+
function interactiveSelect({ title, subtitle, items, multi = true, preselected = [], pageSize = 5, step = 1 }) {
|
|
229
229
|
return new Promise((resolve) => {
|
|
230
230
|
const stdin = process.stdin, stdout = process.stdout;
|
|
231
231
|
if (!stdin.isTTY) { resolve(null); return; }
|
|
@@ -251,11 +251,11 @@ function interactiveSelect({ title, subtitle, items, multi = true, preselected =
|
|
|
251
251
|
: '↑/↓ move enter confirm';
|
|
252
252
|
|
|
253
253
|
const lines = [];
|
|
254
|
-
lines.push(rail());
|
|
255
254
|
lines.push(`${paint(RAW.cyan, G.step)} ${paint(RAW.bold, `${num} - ${title}`)}`);
|
|
255
|
+
lines.push(rail()); // space under the header
|
|
256
256
|
if (subtitle) lines.push(railLn(paint(RAW.dim, subtitle)));
|
|
257
257
|
lines.push(railLn(paint(RAW.dim, nav)));
|
|
258
|
-
|
|
258
|
+
lines.push(rail()); // space before the list
|
|
259
259
|
for (let i = start; i < end; i++) {
|
|
260
260
|
const it = items[i];
|
|
261
261
|
const on = i === index;
|
|
@@ -267,15 +267,21 @@ function interactiveSelect({ title, subtitle, items, multi = true, preselected =
|
|
|
267
267
|
const hint = it.hint ? paint(RAW.dim, ' ' + it.hint) : '';
|
|
268
268
|
lines.push(`${rail()} ${ptr} ${mark} ${label}${hint}`);
|
|
269
269
|
}
|
|
270
|
-
if (items.length > PAGE)
|
|
271
|
-
|
|
270
|
+
if (items.length > PAGE) {
|
|
271
|
+
lines.push(rail()); // space below the list
|
|
272
|
+
const atEnd = end >= items.length;
|
|
273
|
+
const note = atEnd ? 'end of list · move up' : '↓ more · move up / down';
|
|
274
|
+
lines.push(railLn(paint(RAW.dim, `${note} ${index + 1}/${items.length}`)));
|
|
275
|
+
}
|
|
276
|
+
lines.push(rail()); // trailing space below the step
|
|
272
277
|
|
|
273
278
|
if (lastLines > 0) stdout.write(`\x1b[${lastLines}A`);
|
|
274
279
|
stdout.write('\x1b[0J' + lines.join('\n') + '\n');
|
|
275
280
|
lastLines = lines.length;
|
|
276
281
|
}
|
|
277
282
|
|
|
278
|
-
// Replace the live frame with a compact, persisted transcript line
|
|
283
|
+
// Replace the live frame with a compact, persisted transcript line — followed
|
|
284
|
+
// by a blank rail line so completed steps are spaced one line apart.
|
|
279
285
|
function persist() {
|
|
280
286
|
const summary = multi
|
|
281
287
|
? (() => { const l = items.filter((_, i) => selected.has(i)).map((it) => it.label);
|
|
@@ -284,6 +290,7 @@ function interactiveSelect({ title, subtitle, items, multi = true, preselected =
|
|
|
284
290
|
const out = [
|
|
285
291
|
`${paint(RAW.green, G.done)} ${paint(RAW.bold, `${num} - ${title}`)}`,
|
|
286
292
|
railLn(paint(RAW.cyan, summary)),
|
|
293
|
+
rail(),
|
|
287
294
|
];
|
|
288
295
|
if (lastLines > 0) stdout.write(`\x1b[${lastLines}A`);
|
|
289
296
|
stdout.write('\x1b[0J' + out.join('\n') + '\n');
|
|
@@ -470,7 +477,7 @@ async function main() {
|
|
|
470
477
|
const scopes = scope === 'both' ? ['project', 'global'] : [scope];
|
|
471
478
|
|
|
472
479
|
// ACTION
|
|
473
|
-
if (framed) console.log(
|
|
480
|
+
if (!framed) console.log(''); // framed mode already ends with a │ rail line from the last step
|
|
474
481
|
|
|
475
482
|
const pl = (n, w) => `${n} ${w}${n === 1 ? '' : 's'}`;
|
|
476
483
|
const where = { project: 'workspace', global: 'global', both: 'workspace + global' }[scope];
|
package/install.sh
CHANGED
|
@@ -54,7 +54,7 @@ banner() {
|
|
|
54
54
|
color '1;36' ' ╚════██║██╔═══╝ ██║██╔══██╗██╔══╝ ██║███╗██║██║╚════██║██╔══╝ '; printf '\n'
|
|
55
55
|
color '1;36' ' ███████║██║ ██║██║ ██║███████╗╚███╔███╔╝██║███████║███████╗'; printf '\n'
|
|
56
56
|
color '1;36' ' ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚══╝╚══╝ ╚═╝╚══════╝╚══════╝'; printf '\n'
|
|
57
|
-
color '1;35' ' Agent Skills ·
|
|
57
|
+
color '1;35' ' Agent Skills · That Startup Founders Love'; printf '\n\n'
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
usage() {
|
package/package.json
CHANGED