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
- items.forEach((it, i) => {
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: available,
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: Object.keys(AGENTS),
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: ['project'],
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.6.3",
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
- └── <Product1>-logo-1080x1080.png
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) on a solid background.
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**), **solid background** (primary/white/black/other, no
76
- transparency or gradient), a letter-free custom brand symbol (not an SVG/UI icon
77
- or emoji), saved in the product's folder.
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 + <ProductName>-logo-1080x1080.png)
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
- - **Solid background** — a single flat color with NO transparency and NO gradient.
212
- Use the brand **primary color**, or white, or black, or another solid color that
213
- gives strong contrast with the mark. State the exact bg hex in the brief.
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
- - Save it **inside that product's folder**:
218
- `products_raw/<ProductName>/<ProductName>-logo-1080x1080.png`
219
- - Also write `products_raw/<ProductName>/logo-brief.md` with: symbol concept,
220
- background hex, mark/accent hex, and references consulted. (No monogram/
221
- lettermark option and no typography the mark is a letter-free symbol.)
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), then ensure
228
- the saved file is a 1080×1080 PNG on a solid background with the mark centered.
229
- 2. **Fallback (always works):** render a deliberate brand mark programmatically
230
- e.g. Python + Pillow — drawing a custom geometric/abstract symbol (no letters
231
- or initials), centered on a solid-color 1080×1080 canvas. This must look
232
- designed (composition, weight, balance), not like a stock icon. Verify
233
- dimensions, that the mark is centered, and that the background is fully solid.
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, generic icon-font glyphs, stock
237
- emoji, or screenshots. One clean, centered letter-free brand **symbol** per product.
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 a **1080×1080 PNG logo MARK on a solid
270
- (non-transparent, non-gradient) background**, the **mark centered** with no full
271
- wordmark/name text and **no letters, initials, or monogram**, plus
272
- `logo-brief.md` a real letter-free custom symbol, not an SVG/UI icon or
273
- emoji. Verify dimensions and that the mark is centered.
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.