spirewise 1.6.3 → 1.7.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/bin/cli.js
CHANGED
|
@@ -223,7 +223,7 @@ function box(lines) {
|
|
|
223
223
|
}
|
|
224
224
|
|
|
225
225
|
// --- Interactive full-width selector ---------------------------------------
|
|
226
|
-
function interactiveSelect({ title, subtitle, items, multi = true, preselected = [] }) {
|
|
226
|
+
function interactiveSelect({ title, subtitle, items, multi = true, preselected = [], pageSize = 5 }) {
|
|
227
227
|
return new Promise((resolve) => {
|
|
228
228
|
const stdin = process.stdin, stdout = process.stdout;
|
|
229
229
|
if (!stdin.isTTY) { resolve(null); return; }
|
|
@@ -243,17 +243,34 @@ function interactiveSelect({ title, subtitle, items, multi = true, preselected =
|
|
|
243
243
|
};
|
|
244
244
|
|
|
245
245
|
function render() {
|
|
246
|
+
// Windowed viewport: show at most `pageSize` rows and keep the cursor
|
|
247
|
+
// centered so long lists (e.g. skills) scroll smoothly with up/down.
|
|
248
|
+
const PAGE = Math.min(pageSize, items.length);
|
|
249
|
+
const half = Math.floor(PAGE / 2);
|
|
250
|
+
let start = index - half;
|
|
251
|
+
if (start < 0) start = 0;
|
|
252
|
+
if (start > items.length - PAGE) start = items.length - PAGE;
|
|
253
|
+
const end = start + PAGE;
|
|
254
|
+
|
|
246
255
|
const lines = ['', bar(title)];
|
|
247
256
|
if (subtitle) lines.push(paint(RAW.dim, ' ' + subtitle));
|
|
257
|
+
if (items.length > PAGE) {
|
|
258
|
+
const above = start > 0 ? '▲ more' : ' ';
|
|
259
|
+
lines.push(paint(RAW.dim, ` ${above} ${index + 1}/${items.length}`));
|
|
260
|
+
}
|
|
248
261
|
lines.push('');
|
|
249
|
-
|
|
262
|
+
for (let i = start; i < end; i++) {
|
|
263
|
+
const it = items[i];
|
|
250
264
|
const cur = i === index ? paint(RAW.cyan, '❯') : ' ';
|
|
251
265
|
const mark = multi ? (selected.has(i) ? paint(RAW.green, '◉') : paint(RAW.dim, '◯'))
|
|
252
266
|
: (i === index ? paint(RAW.green, '◉') : paint(RAW.dim, '◯'));
|
|
253
267
|
const label = i === index ? paint(RAW.bold, it.label) : it.label;
|
|
254
268
|
const hint = it.hint ? paint(RAW.dim, ' ' + it.hint) : '';
|
|
255
269
|
lines.push(` ${cur} ${mark} ${label}${hint}`);
|
|
256
|
-
}
|
|
270
|
+
}
|
|
271
|
+
if (items.length > PAGE) {
|
|
272
|
+
lines.push(paint(RAW.dim, ` ${end < items.length ? '▼ more' : ' '}`));
|
|
273
|
+
}
|
|
257
274
|
lines.push('');
|
|
258
275
|
lines.push(paint(RAW.dim, ' ' + (multi
|
|
259
276
|
? '↑/↓ move · space toggle · a all/none · enter confirm · esc cancel'
|
|
@@ -392,7 +409,7 @@ async function main() {
|
|
|
392
409
|
title: `Step 1/3 · Select skills to ${verb}`,
|
|
393
410
|
subtitle: action === 'remove' ? 'These will be deleted from the chosen agents' : 'Copy templates to install into your agents',
|
|
394
411
|
items: available.map((s) => ({ value: s, label: s, hint: skillHint(s) })),
|
|
395
|
-
multi: true, preselected:
|
|
412
|
+
multi: true, preselected: [],
|
|
396
413
|
});
|
|
397
414
|
if (skills === null) die('Cancelled.');
|
|
398
415
|
if (!skills.length) die('No skills selected.');
|
|
@@ -407,7 +424,7 @@ async function main() {
|
|
|
407
424
|
title: `Step 2/3 · Select agents`,
|
|
408
425
|
subtitle: action === 'remove' ? 'Skills are removed from each agent’s folder' : 'Each agent gets the skills in its own folder + format',
|
|
409
426
|
items: Object.entries(AGENTS).map(([k, a]) => ({ value: k, label: a.label, hint: `(${k}) · ${a.format}` })),
|
|
410
|
-
multi: true, preselected:
|
|
427
|
+
multi: true, preselected: [],
|
|
411
428
|
});
|
|
412
429
|
if (agentKeys === null) die('Cancelled.');
|
|
413
430
|
if (!agentKeys.length) die('No agents selected.');
|
|
@@ -424,7 +441,7 @@ async function main() {
|
|
|
424
441
|
{ value: 'global', label: 'Global', hint: 'your home folders — applies to all projects' },
|
|
425
442
|
{ value: 'both', label: 'Both', hint: 'workspace + global' },
|
|
426
443
|
],
|
|
427
|
-
multi: false, preselected: [
|
|
444
|
+
multi: false, preselected: [],
|
|
428
445
|
});
|
|
429
446
|
if (scope === null) die('Cancelled.');
|
|
430
447
|
} else if (!scope) { warn('No terminal; defaulting scope to "workspace".'); scope = 'project'; }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spirewise",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.1",
|
|
4
4
|
"description": "Installable Agent Skills for GitHub Copilot, Claude Code, and Cursor — copywriting (F6S & LinkedIn), NVIDIA Inception tooling, and 35 website design-system architect skills modeled on real SaaS sites.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"spirewise": "bin/cli.js"
|
|
@@ -43,7 +43,8 @@ products_raw/
|
|
|
43
43
|
├── <Product1>/
|
|
44
44
|
│ ├── product.md
|
|
45
45
|
│ ├── logo-brief.md
|
|
46
|
-
│
|
|
46
|
+
│ ├── <Product1>-logo-dark-1080x1080.png # dark bg + light mark
|
|
47
|
+
│ └── <Product1>-logo-light-1080x1080.png # light bg + dark mark
|
|
47
48
|
├── <Product2>/…
|
|
48
49
|
└── … # 3–6 products total
|
|
49
50
|
```
|
|
@@ -51,7 +52,8 @@ products_raw/
|
|
|
51
52
|
Each `product.md` covers the problem, what it does, **why GPU compute is
|
|
52
53
|
essential**, the NVIDIA stack (hardware → SDKs → software), physical/edge angle,
|
|
53
54
|
moat, market, Inception fit, and MVP scope. Each product also ships a **real
|
|
54
|
-
1080×1080 PNG logo mark** (abstract symbol only, no letters, centered)
|
|
55
|
+
1080×1080 PNG logo mark** (abstract symbol only, no letters, centered) in **two
|
|
56
|
+
high-contrast variants** — dark bg + light mark, and light bg + dark mark.
|
|
55
57
|
|
|
56
58
|
## Rules it enforces
|
|
57
59
|
|
|
@@ -72,8 +74,9 @@ moat, market, Inception fit, and MVP scope. Each product also ships a **real
|
|
|
72
74
|
- Every product must genuinely need accelerated compute (no AI wrappers).
|
|
73
75
|
- Each product gets a **proper designed logo MARK** — 1080×1080 PNG, **mark/symbol
|
|
74
76
|
only and center-aligned** (no full wordmark or name text, **no letters,
|
|
75
|
-
initials, or monogram**), **
|
|
76
|
-
|
|
77
|
-
or
|
|
77
|
+
initials, or monogram**), in **two high-contrast variants** (dark bg + light
|
|
78
|
+
mark, and light bg + dark mark — never low-contrast), each on a **solid
|
|
79
|
+
background** (no transparency or gradient), a letter-free custom brand symbol
|
|
80
|
+
(not an SVG/UI icon or emoji), saved in the product's folder.
|
|
78
81
|
|
|
79
82
|
See `SKILL.md` for the full method and the per-product template.
|
|
@@ -176,7 +176,7 @@ Generated: <YYYY-MM-DD>
|
|
|
176
176
|
- Inception Approval Fit: 10/10 — <one-line justification vs. the six approval qualities>
|
|
177
177
|
- Same-Space Fit: 10/10 — <one-line justification it stays in the locked space>
|
|
178
178
|
## Build notes / MVP scope
|
|
179
|
-
## Logo (mark only) (see logo-brief.md +
|
|
179
|
+
## Logo (mark only) (see logo-brief.md + dark & light 1080×1080 PNG variants)
|
|
180
180
|
## Open questions / [UNKNOWN]
|
|
181
181
|
```
|
|
182
182
|
|
|
@@ -207,34 +207,52 @@ icon, emoji, or clip-art glyph.
|
|
|
207
207
|
meaning and geometry). No typography — the mark contains no text.
|
|
208
208
|
|
|
209
209
|
### Hard output rules
|
|
210
|
-
- Format **PNG**, exactly **1080 × 1080 px
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
210
|
+
- Format **PNG**, exactly **1080 × 1080 px**, **two variants required** (same mark
|
|
211
|
+
geometry, inverted color scheme):
|
|
212
|
+
1. **Dark variant** — a **dark solid background with a LIGHT mark**
|
|
213
|
+
(e.g. mark in white / very light brand tint on a near-black or deep brand-dark bg).
|
|
214
|
+
2. **Light variant** — a **light solid background with a DARK mark**
|
|
215
|
+
(e.g. mark in near-black / deep brand-dark on a white or very light brand-tint bg).
|
|
216
|
+
- **Strong contrast is mandatory.** Background and mark must be clearly opposite in
|
|
217
|
+
luminance — aim for a contrast ratio of **≥ 4.5:1** (the higher the better). Never
|
|
218
|
+
ship low-contrast combinations (light-on-light, dark-on-dark, or a mark that
|
|
219
|
+
blends into the bg). The mark must read instantly at a glance.
|
|
220
|
+
- **Solid background** — a single flat color with NO transparency and NO gradient
|
|
221
|
+
in each variant. State the exact bg hex AND mark hex (with the contrast pairing)
|
|
222
|
+
in the brief.
|
|
214
223
|
- **Mark only**, **center-aligned** both horizontally and vertically, sized large
|
|
215
224
|
with balanced safe padding — not a tiny icon on a big canvas, and not the full
|
|
216
|
-
name spelled out. The mark must contain **no letters or initials**.
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
225
|
+
name spelled out. The mark must contain **no letters or initials**. The mark is
|
|
226
|
+
**identical** in both variants — only the bg/mark colors flip.
|
|
227
|
+
- Save both **inside that product's folder**:
|
|
228
|
+
`products_raw/<ProductName>/<ProductName>-logo-dark-1080x1080.png` (dark bg, light mark)
|
|
229
|
+
`products_raw/<ProductName>/<ProductName>-logo-light-1080x1080.png` (light bg, dark mark)
|
|
230
|
+
- Also write `products_raw/<ProductName>/logo-brief.md` with: symbol concept, the
|
|
231
|
+
**dark-variant** bg+mark hex, the **light-variant** bg+mark hex, the contrast
|
|
232
|
+
ratio of each pairing, and references consulted. (No monogram/lettermark option
|
|
233
|
+
and no typography — the mark is a letter-free symbol.)
|
|
222
234
|
|
|
223
235
|
### How to generate it
|
|
224
236
|
1. **Preferred:** if an image-generation tool/model is available, prompt it for a
|
|
225
237
|
*professional brand logo mark / symbol* (specify: abstract symbol only — no
|
|
226
238
|
letters, no initials, no text, no wordmark — the concept, color palette, solid
|
|
227
|
-
background, flat vector-style, centered, no photographic texture)
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
239
|
+
background, flat vector-style, centered, no photographic texture). Generate the
|
|
240
|
+
**dark variant** (light mark on dark bg) and the **light variant** (dark mark on
|
|
241
|
+
light bg), each a 1080×1080 PNG on a solid background with the mark centered and
|
|
242
|
+
high contrast.
|
|
243
|
+
2. **Fallback (always works):** render both variants programmatically — e.g.
|
|
244
|
+
Python + Pillow — drawing the **same** custom geometric/abstract symbol (no
|
|
245
|
+
letters or initials) centered on a solid-color 1080×1080 canvas, once as a light
|
|
246
|
+
mark on a dark bg and once as a dark mark on a light bg. This must look designed
|
|
247
|
+
(composition, weight, balance), not like a stock icon. Verify dimensions, that
|
|
248
|
+
the mark is centered, that each background is fully solid, and that both pairings
|
|
249
|
+
are high-contrast (light↔dark).
|
|
234
250
|
|
|
235
251
|
Do **not** ship: lettermarks/monograms/initials, full wordmarks/the spelled-out
|
|
236
|
-
name, taglines, transparent PNGs, gradients,
|
|
237
|
-
|
|
252
|
+
name, taglines, transparent PNGs, gradients, **low-contrast color schemes**
|
|
253
|
+
(light-on-light or dark-on-dark), generic icon-font glyphs, stock emoji, or
|
|
254
|
+
screenshots. Ship **one letter-free brand symbol per product in two high-contrast
|
|
255
|
+
variants**: dark bg + light mark, and light bg + dark mark.
|
|
238
256
|
|
|
239
257
|
## Quality bar
|
|
240
258
|
|
|
@@ -266,9 +284,11 @@ emoji, or screenshots. One clean, centered letter-free brand **symbol** per prod
|
|
|
266
284
|
and trips none of the hard disqualifiers (AI wrapper, consulting, crypto, reseller).
|
|
267
285
|
8. `products_raw/_overview.md` opens with the locked space, then summarizes all
|
|
268
286
|
products with both scores.
|
|
269
|
-
9. Every product folder has
|
|
270
|
-
(non-transparent, non-gradient)
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
287
|
+
9. Every product folder has **two 1080×1080 PNG logo MARK variants on solid
|
|
288
|
+
(non-transparent, non-gradient) backgrounds** — a **dark bg + light mark** and a
|
|
289
|
+
**light bg + dark mark**, both high-contrast (≥ 4.5:1), the **mark centered and
|
|
290
|
+
identical** across variants, with no full wordmark/name text and **no letters,
|
|
291
|
+
initials, or monogram**, plus `logo-brief.md` recording both color pairings — a
|
|
292
|
+
real letter-free custom symbol, not an SVG/UI icon or emoji. Verify dimensions,
|
|
293
|
+
centering, and that each pairing is genuinely light↔dark.
|
|
274
294
|
10. No marketing/website copy; unknowns marked `[UNKNOWN]`, not invented.
|