spirewise 1.6.2 → 1.7.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 +18 -2
- package/bin/cli.js +84 -16
- package/install.sh +46 -22
- package/package.json +5 -2
- package/skills/README.md +2 -0
- package/skills/nvidia-product-inventor/README.md +13 -4
- package/skills/nvidia-product-inventor/SKILL.md +105 -36
- package/skills/nvidia-startup-idea-founder/README.md +36 -0
- package/skills/nvidia-startup-idea-founder/SKILL.md +211 -0
- package/skills/website-design-skills/01-proof/README.md +47 -0
- package/skills/website-design-skills/01-proof/SKILL.md +303 -0
- package/skills/website-design-skills/02-kajabi/README.md +42 -0
- package/skills/website-design-skills/02-kajabi/SKILL.md +272 -0
- package/skills/website-design-skills/03-lattice/README.md +42 -0
- package/skills/website-design-skills/03-lattice/SKILL.md +271 -0
- package/skills/website-design-skills/04-petal/README.md +42 -0
- package/skills/website-design-skills/04-petal/SKILL.md +271 -0
- package/skills/website-design-skills/05-dropbox-sign/README.md +42 -0
- package/skills/website-design-skills/05-dropbox-sign/SKILL.md +271 -0
- package/skills/website-design-skills/06-distributional/README.md +42 -0
- package/skills/website-design-skills/06-distributional/SKILL.md +271 -0
- package/skills/website-design-skills/07-appcues/README.md +42 -0
- package/skills/website-design-skills/07-appcues/SKILL.md +271 -0
- package/skills/website-design-skills/08-memberstack/README.md +42 -0
- package/skills/website-design-skills/08-memberstack/SKILL.md +271 -0
- package/skills/website-design-skills/09-flank/README.md +42 -0
- package/skills/website-design-skills/09-flank/SKILL.md +275 -0
- package/skills/website-design-skills/10-slidebean/README.md +42 -0
- package/skills/website-design-skills/10-slidebean/SKILL.md +275 -0
- package/skills/website-design-skills/11-formstack/README.md +42 -0
- package/skills/website-design-skills/11-formstack/SKILL.md +275 -0
- package/skills/website-design-skills/12-thalamus/README.md +42 -0
- package/skills/website-design-skills/12-thalamus/SKILL.md +275 -0
- package/skills/website-design-skills/13-grow/README.md +42 -0
- package/skills/website-design-skills/13-grow/SKILL.md +275 -0
- package/skills/website-design-skills/14-gemnote/README.md +42 -0
- package/skills/website-design-skills/14-gemnote/SKILL.md +275 -0
- package/skills/website-design-skills/15-draftbit/README.md +42 -0
- package/skills/website-design-skills/15-draftbit/SKILL.md +275 -0
- package/skills/website-design-skills/16-payman/README.md +42 -0
- package/skills/website-design-skills/16-payman/SKILL.md +273 -0
- package/skills/website-design-skills/17-effortel/README.md +42 -0
- package/skills/website-design-skills/17-effortel/SKILL.md +272 -0
- package/skills/website-design-skills/18-adopt/README.md +42 -0
- package/skills/website-design-skills/18-adopt/SKILL.md +273 -0
- package/skills/website-design-skills/19-kraftful/README.md +42 -0
- package/skills/website-design-skills/19-kraftful/SKILL.md +273 -0
- package/skills/website-design-skills/20-greenhouse/README.md +42 -0
- package/skills/website-design-skills/20-greenhouse/SKILL.md +273 -0
- package/skills/website-design-skills/21-weavy/README.md +42 -0
- package/skills/website-design-skills/21-weavy/SKILL.md +273 -0
- package/skills/website-design-skills/22-safetykit/README.md +42 -0
- package/skills/website-design-skills/22-safetykit/SKILL.md +273 -0
- package/skills/website-design-skills/23-modulify/README.md +42 -0
- package/skills/website-design-skills/23-modulify/SKILL.md +270 -0
- package/skills/website-design-skills/24-realm/README.md +42 -0
- package/skills/website-design-skills/24-realm/SKILL.md +270 -0
- package/skills/website-design-skills/25-modyfi/README.md +42 -0
- package/skills/website-design-skills/25-modyfi/SKILL.md +269 -0
- package/skills/website-design-skills/26-altitude/README.md +42 -0
- package/skills/website-design-skills/26-altitude/SKILL.md +270 -0
- package/skills/website-design-skills/27-way/README.md +42 -0
- package/skills/website-design-skills/27-way/SKILL.md +270 -0
- package/skills/website-design-skills/28-zentail/README.md +42 -0
- package/skills/website-design-skills/28-zentail/SKILL.md +270 -0
- package/skills/website-design-skills/29-zams/README.md +42 -0
- package/skills/website-design-skills/29-zams/SKILL.md +270 -0
- package/skills/website-design-skills/30-user-interviews/README.md +44 -0
- package/skills/website-design-skills/30-user-interviews/SKILL.md +273 -0
- package/skills/website-design-skills/31-bland/README.md +44 -0
- package/skills/website-design-skills/31-bland/SKILL.md +273 -0
- package/skills/website-design-skills/32-nauto/README.md +44 -0
- package/skills/website-design-skills/32-nauto/SKILL.md +273 -0
- package/skills/website-design-skills/33-bill/README.md +44 -0
- package/skills/website-design-skills/33-bill/SKILL.md +273 -0
- package/skills/website-design-skills/34-localyzer/README.md +44 -0
- package/skills/website-design-skills/34-localyzer/SKILL.md +273 -0
- package/skills/website-design-skills/35-jasper/README.md +44 -0
- package/skills/website-design-skills/35-jasper/SKILL.md +273 -0
- package/skills/website-design-skills/README.md +108 -0
package/README.md
CHANGED
|
@@ -104,9 +104,25 @@ tidied up, and anything already absent is reported as skipped.
|
|
|
104
104
|
| `nvidia-inception-starter` | `nvidia-inception/inception-readiness-report.md` | Scored NVIDIA Inception readiness audit + 90-day plan |
|
|
105
105
|
| `nvidia-inception-idea-booster` | `nvidia-inception/elevated-idea.md` | Reads your idea files and elevates them to NVIDIA's preferences |
|
|
106
106
|
| `nvidia-product-inventor` | `products_raw/<Product>/product.md` | Invents 3–6 GPU-essential products (4–10 letter names) from your idea |
|
|
107
|
+
| `nvidia-startup-idea-founder` | `nvidia-inception/startup-ideas/<Idea>.md` | Crawls NVIDIA RFS + recently funded/accepted Inception startups and invents 10/10-acceptance startup ideas |
|
|
108
|
+
| `website-design-skills/01-proof` … `35-jasper` | `websites/<NN-slug>/` | **35 Website Design System Architect skills**, each modeled on a real, live-scraped SaaS site — generates a production-grade HTML/CSS/JS site with that brand's tokens, components, and pages |
|
|
107
109
|
|
|
108
|
-
|
|
109
|
-
headroom) and
|
|
110
|
+
The copywriting skills keep **every field below** the platform's character limit
|
|
111
|
+
(with ~10% headroom) and verify counts before finishing.
|
|
112
|
+
|
|
113
|
+
### Website-design skills (grouped)
|
|
114
|
+
|
|
115
|
+
The 35 website-design skills live in `skills/website-design-skills/` as numbered
|
|
116
|
+
folders (`01-proof` … `35-jasper`). They are discovered automatically and can be
|
|
117
|
+
installed by their **short leaf name** or full path:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
npx spirewise -s 01-proof -a claude --workspace # short name
|
|
121
|
+
npx spirewise -s website-design-skills/35-jasper -a cursor # full path
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Each installs into the agent's folder as `NN-slug` (e.g. `.claude/skills/01-proof`).
|
|
125
|
+
See `skills/website-design-skills/README.md` for the full index.
|
|
110
126
|
|
|
111
127
|
## Usage after install
|
|
112
128
|
|
package/bin/cli.js
CHANGED
|
@@ -92,15 +92,59 @@ function resolveTarget(agent, scope) {
|
|
|
92
92
|
return scope === 'project' ? path.resolve(process.cwd(), rel) : path.resolve(expandHome(rel));
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
+
// Recursively find every skill folder (a dir containing SKILL.md) at any depth
|
|
96
|
+
// under skills/. Skill ids are POSIX-style relative paths, e.g.
|
|
97
|
+
// "f6s-copywriting" or "website-design-skills/01-proof".
|
|
98
|
+
function walkSkills(dir, baseDir, out) {
|
|
99
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
100
|
+
if (!entry.isDirectory()) continue;
|
|
101
|
+
const abs = path.join(dir, entry.name);
|
|
102
|
+
if (fs.existsSync(path.join(abs, 'SKILL.md'))) {
|
|
103
|
+
out.push(path.relative(baseDir, abs).split(path.sep).join('/'));
|
|
104
|
+
} else {
|
|
105
|
+
walkSkills(abs, baseDir, out); // descend into grouping folders
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
95
109
|
function availableSkills() {
|
|
96
110
|
if (!fs.existsSync(SKILLS_DIR)) return [];
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
111
|
+
const out = [];
|
|
112
|
+
walkSkills(SKILLS_DIR, SKILLS_DIR, out);
|
|
113
|
+
return out.sort();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Source dir and leaf base name for a skill id.
|
|
117
|
+
const skillSrc = (id) => path.join(SKILLS_DIR, ...id.split('/'));
|
|
118
|
+
const skillBase = (id) => id.split('/').pop();
|
|
119
|
+
|
|
120
|
+
// Map every skill id -> the folder/file name it installs as. Leaf basename is
|
|
121
|
+
// used when unique; colliding basenames fall back to the flattened path so two
|
|
122
|
+
// skills never overwrite each other.
|
|
123
|
+
function buildInstallNames(ids) {
|
|
124
|
+
const counts = Object.create(null);
|
|
125
|
+
for (const id of ids) { const b = skillBase(id); counts[b] = (counts[b] || 0) + 1; }
|
|
126
|
+
const map = new Map();
|
|
127
|
+
for (const id of ids) {
|
|
128
|
+
const b = skillBase(id);
|
|
129
|
+
map.set(id, counts[b] > 1 ? id.split('/').join('-') : b);
|
|
130
|
+
}
|
|
131
|
+
return map;
|
|
132
|
+
}
|
|
133
|
+
let NAME_BY_ID = new Map();
|
|
134
|
+
const installName = (id) => NAME_BY_ID.get(id) || skillBase(id);
|
|
135
|
+
|
|
136
|
+
// Resolve a user-supplied token to a full skill id. Accepts the full path
|
|
137
|
+
// ("website-design-skills/01-proof") or the unique leaf name ("01-proof").
|
|
138
|
+
function resolveSkillToken(tok, available) {
|
|
139
|
+
if (available.includes(tok)) return tok;
|
|
140
|
+
const matches = available.filter((id) => skillBase(id) === tok);
|
|
141
|
+
if (matches.length === 1) return matches[0];
|
|
142
|
+
if (matches.length > 1) die(`Ambiguous skill '${tok}': matches ${matches.join(', ')}. Use the full path.`);
|
|
143
|
+
return null;
|
|
100
144
|
}
|
|
101
145
|
|
|
102
146
|
function readSkill(name) {
|
|
103
|
-
const raw = fs.readFileSync(path.join(
|
|
147
|
+
const raw = fs.readFileSync(path.join(skillSrc(name), 'SKILL.md'), 'utf8');
|
|
104
148
|
let description = name, body = raw;
|
|
105
149
|
const m = raw.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
|
|
106
150
|
if (m) {
|
|
@@ -130,14 +174,15 @@ function installToAgent(agentKey, agent, scope, skills) {
|
|
|
130
174
|
const targetDir = resolveTarget(agent, scope);
|
|
131
175
|
fs.mkdirSync(targetDir, { recursive: true });
|
|
132
176
|
for (const skill of skills) {
|
|
177
|
+
const name = installName(skill);
|
|
133
178
|
if (agent.format === 'skill') {
|
|
134
|
-
const dest = path.join(targetDir,
|
|
135
|
-
copyDir(
|
|
179
|
+
const dest = path.join(targetDir, name);
|
|
180
|
+
copyDir(skillSrc(skill), dest);
|
|
136
181
|
console.log(` ${paint(RAW.green, '✓')} ${paint(RAW.bold, agent.label)} ${c.dim}(${scope === 'project' ? 'workspace' : scope})${c.reset} ${skill} ${c.dim}→ ${dest}${c.reset}`);
|
|
137
182
|
} else {
|
|
138
183
|
const { description, body } = readSkill(skill);
|
|
139
184
|
const front = `---\ndescription: ${description}\nalwaysApply: false\n---\n\n`;
|
|
140
|
-
const file = path.join(targetDir,
|
|
185
|
+
const file = path.join(targetDir, name + (agent.ext || '.md'));
|
|
141
186
|
fs.writeFileSync(file, front + body);
|
|
142
187
|
console.log(` ${paint(RAW.green, '✓')} ${paint(RAW.bold, agent.label)} ${c.dim}(${scope === 'project' ? 'workspace' : scope})${c.reset} ${skill} ${c.dim}→ ${file}${c.reset}`);
|
|
143
188
|
}
|
|
@@ -150,9 +195,10 @@ function removeFromAgent(agentKey, agent, scope, skills) {
|
|
|
150
195
|
const tag = scope === 'project' ? 'workspace' : scope;
|
|
151
196
|
let removed = 0;
|
|
152
197
|
for (const skill of skills) {
|
|
198
|
+
const name = installName(skill);
|
|
153
199
|
const target = agent.format === 'skill'
|
|
154
|
-
? path.join(targetDir,
|
|
155
|
-
: path.join(targetDir,
|
|
200
|
+
? path.join(targetDir, name)
|
|
201
|
+
: path.join(targetDir, name + (agent.ext || '.md'));
|
|
156
202
|
if (fs.existsSync(target)) {
|
|
157
203
|
fs.rmSync(target, { recursive: true, force: true });
|
|
158
204
|
removed++;
|
|
@@ -177,7 +223,7 @@ function box(lines) {
|
|
|
177
223
|
}
|
|
178
224
|
|
|
179
225
|
// --- Interactive full-width selector ---------------------------------------
|
|
180
|
-
function interactiveSelect({ title, subtitle, items, multi = true, preselected = [] }) {
|
|
226
|
+
function interactiveSelect({ title, subtitle, items, multi = true, preselected = [], pageSize = 5 }) {
|
|
181
227
|
return new Promise((resolve) => {
|
|
182
228
|
const stdin = process.stdin, stdout = process.stdout;
|
|
183
229
|
if (!stdin.isTTY) { resolve(null); return; }
|
|
@@ -197,17 +243,34 @@ function interactiveSelect({ title, subtitle, items, multi = true, preselected =
|
|
|
197
243
|
};
|
|
198
244
|
|
|
199
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
|
+
|
|
200
255
|
const lines = ['', bar(title)];
|
|
201
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
|
+
}
|
|
202
261
|
lines.push('');
|
|
203
|
-
|
|
262
|
+
for (let i = start; i < end; i++) {
|
|
263
|
+
const it = items[i];
|
|
204
264
|
const cur = i === index ? paint(RAW.cyan, '❯') : ' ';
|
|
205
265
|
const mark = multi ? (selected.has(i) ? paint(RAW.green, '◉') : paint(RAW.dim, '◯'))
|
|
206
266
|
: (i === index ? paint(RAW.green, '◉') : paint(RAW.dim, '◯'));
|
|
207
267
|
const label = i === index ? paint(RAW.bold, it.label) : it.label;
|
|
208
268
|
const hint = it.hint ? paint(RAW.dim, ' ' + it.hint) : '';
|
|
209
269
|
lines.push(` ${cur} ${mark} ${label}${hint}`);
|
|
210
|
-
}
|
|
270
|
+
}
|
|
271
|
+
if (items.length > PAGE) {
|
|
272
|
+
lines.push(paint(RAW.dim, ` ${end < items.length ? '▼ more' : ' '}`));
|
|
273
|
+
}
|
|
211
274
|
lines.push('');
|
|
212
275
|
lines.push(paint(RAW.dim, ' ' + (multi
|
|
213
276
|
? '↑/↓ move · space toggle · a all/none · enter confirm · esc cancel'
|
|
@@ -312,6 +375,7 @@ async function main() {
|
|
|
312
375
|
|
|
313
376
|
const available = availableSkills();
|
|
314
377
|
if (available.length === 0) die('No skills found in package.');
|
|
378
|
+
NAME_BY_ID = buildInstallNames(available);
|
|
315
379
|
|
|
316
380
|
if (command === 'list') {
|
|
317
381
|
info('Available skills:'); available.forEach((s) => console.log(' - ' + s)); return;
|
|
@@ -335,13 +399,17 @@ async function main() {
|
|
|
335
399
|
// 1) SKILLS
|
|
336
400
|
let skills = o.skills;
|
|
337
401
|
if (skills) {
|
|
338
|
-
|
|
402
|
+
skills = skills.map((s) => {
|
|
403
|
+
const id = resolveSkillToken(s, available);
|
|
404
|
+
if (!id) die(`Unknown skill '${s}'. Run "spirewise list".`);
|
|
405
|
+
return id;
|
|
406
|
+
});
|
|
339
407
|
} else if (tty) {
|
|
340
408
|
skills = await interactiveSelect({
|
|
341
409
|
title: `Step 1/3 · Select skills to ${verb}`,
|
|
342
410
|
subtitle: action === 'remove' ? 'These will be deleted from the chosen agents' : 'Copy templates to install into your agents',
|
|
343
411
|
items: available.map((s) => ({ value: s, label: s, hint: skillHint(s) })),
|
|
344
|
-
multi: true, preselected:
|
|
412
|
+
multi: true, preselected: [],
|
|
345
413
|
});
|
|
346
414
|
if (skills === null) die('Cancelled.');
|
|
347
415
|
if (!skills.length) die('No skills selected.');
|
|
@@ -356,7 +424,7 @@ async function main() {
|
|
|
356
424
|
title: `Step 2/3 · Select agents`,
|
|
357
425
|
subtitle: action === 'remove' ? 'Skills are removed from each agent’s folder' : 'Each agent gets the skills in its own folder + format',
|
|
358
426
|
items: Object.entries(AGENTS).map(([k, a]) => ({ value: k, label: a.label, hint: `(${k}) · ${a.format}` })),
|
|
359
|
-
multi: true, preselected:
|
|
427
|
+
multi: true, preselected: [],
|
|
360
428
|
});
|
|
361
429
|
if (agentKeys === null) die('Cancelled.');
|
|
362
430
|
if (!agentKeys.length) die('No agents selected.');
|
|
@@ -373,7 +441,7 @@ async function main() {
|
|
|
373
441
|
{ value: 'global', label: 'Global', hint: 'your home folders — applies to all projects' },
|
|
374
442
|
{ value: 'both', label: 'Both', hint: 'workspace + global' },
|
|
375
443
|
],
|
|
376
|
-
multi: false, preselected: [
|
|
444
|
+
multi: false, preselected: [],
|
|
377
445
|
});
|
|
378
446
|
if (scope === null) die('Cancelled.');
|
|
379
447
|
} else if (!scope) { warn('No terminal; defaulting scope to "workspace".'); scope = 'project'; }
|
package/install.sh
CHANGED
|
@@ -101,23 +101,40 @@ ensure_skills_dir() {
|
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
list_remote_skills() {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
|
107
|
-
|
|
108
|
-
|
|
104
|
+
# Walk the full git tree and surface every "<id>/SKILL.md" under skills/.
|
|
105
|
+
curl -fsSL "https://api.github.com/repos/${REPO_OWNER}/${REPO_NAME}/git/trees/${REPO_BRANCH}?recursive=1" \
|
|
106
|
+
| grep -oE "\"path\": *\"${SKILLS_SUBDIR}/[^\"]+/SKILL.md\"" \
|
|
107
|
+
| sed -E "s/.*\"${SKILLS_SUBDIR}\/(.+)\/SKILL.md\"/\1/" \
|
|
108
|
+
| sort -u
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
available_skills() {
|
|
112
112
|
if [[ -n "$LOCAL_SKILLS_DIR" ]]; then
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
# Any folder containing SKILL.md, at any depth, as a relative id.
|
|
114
|
+
find "$LOCAL_SKILLS_DIR" -name SKILL.md -print \
|
|
115
|
+
| sed -e "s#^${LOCAL_SKILLS_DIR}/##" -e 's#/SKILL.md$##' \
|
|
116
|
+
| sort
|
|
115
117
|
else
|
|
116
118
|
list_remote_skills | sort
|
|
117
119
|
fi
|
|
118
120
|
}
|
|
119
121
|
|
|
120
|
-
#
|
|
122
|
+
# Leaf base name a skill id installs as (e.g. website-design-skills/01-proof -> 01-proof).
|
|
123
|
+
skill_base() { printf '%s' "${1##*/}"; }
|
|
124
|
+
|
|
125
|
+
# Resolve a user token to a full id: exact id, else unique leaf-name match.
|
|
126
|
+
resolve_skill_token() {
|
|
127
|
+
local tok="$1" id match count=0
|
|
128
|
+
for id in "${AVAILABLE[@]}"; do [[ "$id" == "$tok" ]] && { printf '%s' "$id"; return 0; }; done
|
|
129
|
+
for id in "${AVAILABLE[@]}"; do
|
|
130
|
+
if [[ "$(skill_base "$id")" == "$tok" ]]; then match="$id"; count=$((count+1)); fi
|
|
131
|
+
done
|
|
132
|
+
[[ $count -eq 1 ]] && { printf '%s' "$match"; return 0; }
|
|
133
|
+
[[ $count -gt 1 ]] && die "Ambiguous skill '$tok'. Use the full path."
|
|
134
|
+
return 1
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
# Fetch a single SKILL.md into $BASE/<id>/SKILL.md when remote.
|
|
121
138
|
fetch_skill() {
|
|
122
139
|
local skill="$1" base="$2"
|
|
123
140
|
[[ -n "$LOCAL_SKILLS_DIR" ]] && return 0
|
|
@@ -162,16 +179,17 @@ resolve_dir() {
|
|
|
162
179
|
install_for_agent() {
|
|
163
180
|
local key="$1" label="$2" fmt="$3" ext="$4" dir="$5" scope="$6" base="$7"; shift 7
|
|
164
181
|
local skills=("$@")
|
|
165
|
-
local s
|
|
182
|
+
local s iname
|
|
166
183
|
if [[ "$MODE" == "remove" ]]; then
|
|
167
184
|
for s in "${skills[@]}"; do
|
|
185
|
+
iname="$(skill_base "$s")"
|
|
168
186
|
local target
|
|
169
|
-
if [[ "$fmt" == "skill" ]]; then target="$dir/$
|
|
187
|
+
if [[ "$fmt" == "skill" ]]; then target="$dir/$iname"; else target="$dir/$iname$ext"; fi
|
|
170
188
|
if [[ -e "$target" ]]; then
|
|
171
189
|
rm -rf "$target"; REMOVED=$((REMOVED+1))
|
|
172
|
-
substep "$label ($scope) $
|
|
190
|
+
substep "$label ($scope) $iname removed <- $target"
|
|
173
191
|
else
|
|
174
|
-
substep "$label ($scope) $
|
|
192
|
+
substep "$label ($scope) $iname — not found, skipped"
|
|
175
193
|
fi
|
|
176
194
|
done
|
|
177
195
|
[[ -d "$dir" ]] && rmdir "$dir" 2>/dev/null || true
|
|
@@ -179,17 +197,18 @@ install_for_agent() {
|
|
|
179
197
|
fi
|
|
180
198
|
mkdir -p "$dir"
|
|
181
199
|
for s in "${skills[@]}"; do
|
|
200
|
+
iname="$(skill_base "$s")"
|
|
182
201
|
fetch_skill "$s" "$base"
|
|
183
202
|
if [[ "$fmt" == "skill" ]]; then
|
|
184
|
-
mkdir -p "$dir/$
|
|
185
|
-
cp -R "$base/$s/." "$dir/$
|
|
186
|
-
substep "$label ($scope) $
|
|
203
|
+
mkdir -p "$dir/$iname"
|
|
204
|
+
cp -R "$base/$s/." "$dir/$iname/"
|
|
205
|
+
substep "$label ($scope) $iname -> $dir/$iname"
|
|
187
206
|
else
|
|
188
207
|
local desc body file
|
|
189
208
|
desc="$(skill_description "$base/$s/SKILL.md")"
|
|
190
|
-
file="$dir/$
|
|
209
|
+
file="$dir/$iname$ext"
|
|
191
210
|
{ printf -- '---\ndescription: %s\nalwaysApply: false\n---\n\n' "$desc"; skill_body "$base/$s/SKILL.md"; } >"$file"
|
|
192
|
-
substep "$label ($scope) $
|
|
211
|
+
substep "$label ($scope) $iname -> $file"
|
|
193
212
|
fi
|
|
194
213
|
done
|
|
195
214
|
}
|
|
@@ -237,11 +256,16 @@ banner
|
|
|
237
256
|
|
|
238
257
|
# Step 1: skills (default all).
|
|
239
258
|
step 1 "Scanning available skills"
|
|
240
|
-
[[ ${#SELECTED[@]} -eq 0 ]]
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
259
|
+
if [[ ${#SELECTED[@]} -eq 0 ]]; then
|
|
260
|
+
SELECTED=("${AVAILABLE[@]}")
|
|
261
|
+
else
|
|
262
|
+
RESOLVED=()
|
|
263
|
+
for s in "${SELECTED[@]}"; do
|
|
264
|
+
id="$(resolve_skill_token "$s")" || die "Unknown skill '$s'. Use --list."
|
|
265
|
+
RESOLVED+=("$id")
|
|
266
|
+
done
|
|
267
|
+
SELECTED=("${RESOLVED[@]}")
|
|
268
|
+
fi
|
|
245
269
|
substep "${#SELECTED[@]} skill(s): ${SELECTED[*]}"
|
|
246
270
|
|
|
247
271
|
# Step 2: agents
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spirewise",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Installable Agent Skills for copywriting (F6S & LinkedIn
|
|
3
|
+
"version": "1.7.0",
|
|
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"
|
|
7
7
|
},
|
|
@@ -19,6 +19,9 @@
|
|
|
19
19
|
"copywriting",
|
|
20
20
|
"f6s",
|
|
21
21
|
"linkedin",
|
|
22
|
+
"nvidia-inception",
|
|
23
|
+
"website-design",
|
|
24
|
+
"design-system",
|
|
22
25
|
"github-copilot",
|
|
23
26
|
"claude-code",
|
|
24
27
|
"cursor",
|
package/skills/README.md
CHANGED
|
@@ -12,6 +12,8 @@ ready-to-paste copy for company profile pages, with strict character-limit safet
|
|
|
12
12
|
| `nvidia-inception-starter` | `nvidia-inception/inception-readiness-report.md` | Scored NVIDIA Inception readiness audit + 90-day plan |
|
|
13
13
|
| `nvidia-inception-idea-booster` | `nvidia-inception/elevated-idea.md` | Reads your idea files and elevates them to NVIDIA's preferences |
|
|
14
14
|
| `nvidia-product-inventor` | `products_raw/<Product>/product.md` | Invents 3–6 GPU-essential products (4–10 letter names) from your idea |
|
|
15
|
+
| `nvidia-startup-idea-founder` | `nvidia-inception/startup-ideas/<Idea>.md` | Crawls NVIDIA RFS + recently funded/accepted Inception startups and invents 10/10-acceptance startup ideas |
|
|
16
|
+
| `website-design-skills/01-proof` … `35-jasper` | `websites/<NN-slug>/` | 35 design-system skills, each modeled on a real SaaS site (15+ pages, products + per-product pages) |
|
|
15
17
|
|
|
16
18
|
Each skill writes one plain-text file and keeps **every field below** the
|
|
17
19
|
platform's character limit (with ~10% headroom).
|
|
@@ -51,20 +51,29 @@ products_raw/
|
|
|
51
51
|
Each `product.md` covers the problem, what it does, **why GPU compute is
|
|
52
52
|
essential**, the NVIDIA stack (hardware → SDKs → software), physical/edge angle,
|
|
53
53
|
moat, market, Inception fit, and MVP scope. Each product also ships a **real
|
|
54
|
-
1080×1080 PNG logo mark** (symbol only, centered) on a solid background.
|
|
54
|
+
1080×1080 PNG logo mark** (abstract symbol only, no letters, centered) on a solid background.
|
|
55
55
|
|
|
56
56
|
## Rules it enforces
|
|
57
57
|
|
|
58
58
|
- **Same space only** — all products share the startup's industry, category, core
|
|
59
59
|
idea, and users (variations/components of the one idea), never new categories or
|
|
60
60
|
unrelated businesses.
|
|
61
|
+
- **Dual 10/10 gate** — every product must self-score **10/10 on NVIDIA Inception
|
|
62
|
+
approval fit AND 10/10 on same-space fit** (both recorded in `product.md` and
|
|
63
|
+
`_overview.md`); redesign or discard anything below 10 on either axis.
|
|
64
|
+
- **Research-backed approval criteria** — products are engineered to the qualities
|
|
65
|
+
NVIDIA-approved startups share (deep-tech & GPU-essential core, authentic NVIDIA
|
|
66
|
+
platform alignment, physical/agentic AI lean, defensible moat, real market +
|
|
67
|
+
scalability) and trip **zero disqualifiers** (no AI wrappers, consulting, crypto,
|
|
68
|
+
or reseller plays).
|
|
61
69
|
- **3–6 products**, each in its own folder under `products_raw/`.
|
|
62
70
|
- Product names are **4–10 letters, letters only**, brandable; folder name = product name.
|
|
63
71
|
- NVIDIA stack ordered **physical/GPU first**, then SDKs, then software.
|
|
64
72
|
- Every product must genuinely need accelerated compute (no AI wrappers).
|
|
65
73
|
- Each product gets a **proper designed logo MARK** — 1080×1080 PNG, **mark/symbol
|
|
66
|
-
only and center-aligned** (no full wordmark or name text
|
|
67
|
-
(primary/white/black/other, no
|
|
68
|
-
brand symbol (not an SVG/UI icon
|
|
74
|
+
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.
|
|
69
78
|
|
|
70
79
|
See `SKILL.md` for the full method and the per-product template.
|
|
@@ -4,10 +4,11 @@ description: >-
|
|
|
4
4
|
Read a startup's existing idea/notes files and invent 3–6 concrete PRODUCTS
|
|
5
5
|
(not marketing copy) that all stay in the SAME industry, category, and core idea
|
|
6
6
|
as the startup — variations/components of the one idea, never new categories.
|
|
7
|
-
Each product is engineered to
|
|
7
|
+
Each product is engineered to score a perfect 10/10 on NVIDIA Inception
|
|
8
|
+
approval fit AND 10/10 on same-space alignment, gets a short
|
|
8
9
|
brandable name (4–10 letters), an explicit NVIDIA stack (physical/compute
|
|
9
10
|
hardware like GPUs first, then SDKs, then software), and a real 1080×1080 PNG
|
|
10
|
-
logo MARK (symbol only
|
|
11
|
+
logo MARK (abstract symbol only — no letters, no wordmark, centered) on a solid background. Use when the user asks to "invent products", "ideate
|
|
11
12
|
products for NVIDIA", "what should we build for Inception", or "turn our idea
|
|
12
13
|
into products". Writes a `products_raw/` folder with one subfolder per product.
|
|
13
14
|
Builds on nvidia-inception-idea-booster and nvidia-inception-starter. Products
|
|
@@ -29,6 +30,57 @@ marketing copy.
|
|
|
29
30
|
(AI strength, technical innovation, NVIDIA alignment, market, moat). Keep only
|
|
30
31
|
products that would plausibly score well; discard weak/"AI-wrapper" ones.
|
|
31
32
|
|
|
33
|
+
## What NVIDIA Inception actually approves (research-backed)
|
|
34
|
+
|
|
35
|
+
NVIDIA Inception is free, non-dilutive, rolling-admission, and **industry-agnostic
|
|
36
|
+
within emerging/accelerated-computing tech**. Engineer every product so it would
|
|
37
|
+
read as an obvious **accept** to a reviewer. Approved startups consistently show:
|
|
38
|
+
|
|
39
|
+
1. **Deep-tech, GPU-essential core.** The product solves a hard technical problem
|
|
40
|
+
(computer vision, LLMs/agents, RL, simulation, graphics, robotics, genomics,
|
|
41
|
+
edge AI) that **substantially benefits from — or is impossible without — GPU
|
|
42
|
+
acceleration**. State plainly why it can't be built (or would be far worse) on
|
|
43
|
+
CPUs alone.
|
|
44
|
+
2. **Authentic NVIDIA-platform alignment.** Concrete, credible use of NVIDIA
|
|
45
|
+
hardware + SDKs (CUDA, TensorRT, Triton/NIM, Isaac, Omniverse, Metropolis,
|
|
46
|
+
Holoscan, NeMo, Riva, RAPIDS…). The product should **drive demand for NVIDIA
|
|
47
|
+
compute** and act as a reference workload.
|
|
48
|
+
3. **Physical AI / Agentic AI lean.** Robotics, autonomous systems, industrial
|
|
49
|
+
automation, digital twins, embodied AI (physical AI) and/or autonomous
|
|
50
|
+
decision-making agents/copilots (agentic AI). NVIDIA strongly favors these.
|
|
51
|
+
4. **Defensible moat.** Proprietary IP, unique/large proprietary datasets, deep
|
|
52
|
+
technical barriers, or hardware integration — not easily replicated.
|
|
53
|
+
5. **Real market + scalability.** Clear customer ROI, a sharp wedge, and a model
|
|
54
|
+
that scales on GPU cloud or edge fleets. Pilots/traction are a plus to note.
|
|
55
|
+
6. **Research-to-product trajectory.** Credible technical depth (papers/SOTA
|
|
56
|
+
methods) paired with a concrete, buildable product — not a science project.
|
|
57
|
+
|
|
58
|
+
### Hard disqualifiers — never generate products that read as these
|
|
59
|
+
- **AI wrappers / thin API resellers** with no GPU-essential core or moat.
|
|
60
|
+
- **Consulting / outsourced-dev** offerings (sell a product, not services).
|
|
61
|
+
- **Crypto/mining/trading**, pure **cloud-reselling**, or generic
|
|
62
|
+
**reseller/distributor** plays.
|
|
63
|
+
- Anything where the GPU is a "nice-to-have," not a must-have.
|
|
64
|
+
|
|
65
|
+
## The dual 10/10 bar (mandatory gate)
|
|
66
|
+
|
|
67
|
+
Every shipped product MUST score a self-assessed **10/10 on BOTH** axes — this is
|
|
68
|
+
a hard gate, not an average:
|
|
69
|
+
|
|
70
|
+
- **Inception Approval Fit (target 10/10):** maximally hits the six approval
|
|
71
|
+
qualities above, trips **zero** disqualifiers, and would plausibly land at the
|
|
72
|
+
top of the `nvidia-inception-starter` acceptance score.
|
|
73
|
+
- **Same-Space Fit (target 10/10):** stays entirely inside the startup's locked
|
|
74
|
+
industry, category, core idea, and target users (see Step 2) — a variation,
|
|
75
|
+
component, tier, or adjacent feature of the one idea, never a new business.
|
|
76
|
+
|
|
77
|
+
Rules:
|
|
78
|
+
- If a candidate scores **< 10 on either axis, redesign it until both hit 10, or
|
|
79
|
+
discard it.** Do not ship 8s or "good enough" products. Quality over quantity —
|
|
80
|
+
it is better to ship 3 dual-10/10 products than 6 mediocre ones.
|
|
81
|
+
- Record both scores (with a one-line justification each) in every `product.md`
|
|
82
|
+
and in `_overview.md`. Never inflate a score to be nice; be a tough reviewer.
|
|
83
|
+
|
|
32
84
|
## Step 1 — Read the existing idea
|
|
33
85
|
|
|
34
86
|
Discover and read the startup files in the project: `idea*`, `README*`, `pitch*`,
|
|
@@ -37,10 +89,12 @@ Discover and read the startup files in the project: `idea*`, `README*`, `pitch*`
|
|
|
37
89
|
If too little exists, ask 3–5 focused questions first. Mark gaps `[UNKNOWN]` —
|
|
38
90
|
never fabricate. Stay anchored to the founder's domain and intent.
|
|
39
91
|
|
|
40
|
-
## Step 2 — Invent 3–6 products
|
|
41
|
-
|
|
42
92
|
## Step 2 — Invent 3–6 products (stay in the SAME space)
|
|
43
93
|
|
|
94
|
+
**Same space means: every product is ONLY in the startup's same category /
|
|
95
|
+
industry and directly tied to its main idea — never random categories,
|
|
96
|
+
industries, or unrelated products.**
|
|
97
|
+
|
|
44
98
|
**Hard constraint — same space only.** Before inventing, lock the startup's
|
|
45
99
|
**industry, category, and core idea** from Step 1. Every product MUST stay inside
|
|
46
100
|
that exact space:
|
|
@@ -118,6 +172,9 @@ Generated: <YYYY-MM-DD>
|
|
|
118
172
|
## Defensibility / moat
|
|
119
173
|
## Market & wedge
|
|
120
174
|
## Inception fit (1–2 lines: why this scores well)
|
|
175
|
+
## Scorecard (must be 10/10 on both)
|
|
176
|
+
- Inception Approval Fit: 10/10 — <one-line justification vs. the six approval qualities>
|
|
177
|
+
- Same-Space Fit: 10/10 — <one-line justification it stays in the locked space>
|
|
121
178
|
## Build notes / MVP scope
|
|
122
179
|
## Logo (mark only) (see logo-brief.md + <ProductName>-logo-1080x1080.png)
|
|
123
180
|
## Open questions / [UNKNOWN]
|
|
@@ -125,26 +182,29 @@ Generated: <YYYY-MM-DD>
|
|
|
125
182
|
|
|
126
183
|
3. Also write `products_raw/_overview.md` starting with the **locked space**
|
|
127
184
|
(industry, category, core idea, target users), then list every product: name,
|
|
128
|
-
letter count, one-liner, primary NVIDIA hardware,
|
|
185
|
+
letter count, one-liner, primary NVIDIA hardware, its same-space link, and both
|
|
186
|
+
scores (Inception Approval Fit 10/10 + Same-Space Fit 10/10). Confirm every
|
|
187
|
+
listed product is a dual 10/10 — drop any that isn't.
|
|
129
188
|
|
|
130
189
|
## Logo for each product (required)
|
|
131
190
|
|
|
132
191
|
## Logo MARK for each product (required)
|
|
133
192
|
|
|
134
|
-
Every product gets a **real, designed brand logo MARK** —
|
|
135
|
-
the full logo. Do **not** include
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
193
|
+
Every product gets a **real, designed brand logo MARK** — a **custom abstract
|
|
194
|
+
symbol only**, not the full logo. Do **not** include any letters, initials,
|
|
195
|
+
monogram, or lettermark; do **not** include the full product name as a wordmark,
|
|
196
|
+
no tagline, no lockup. Just the **symbol mark**, **center-aligned** on the
|
|
197
|
+
canvas. It must be a proper designed brand mark — not an SVG icon, UI/material
|
|
198
|
+
icon, emoji, or clip-art glyph.
|
|
139
199
|
|
|
140
200
|
### Design (research first)
|
|
141
201
|
- Briefly research 3–5 reference brand marks in the product's space; note the
|
|
142
202
|
visual conventions, then design something distinct (don't copy).
|
|
143
|
-
- The mark
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
- Define a tiny brand spec: palette (hex)
|
|
147
|
-
the
|
|
203
|
+
- The mark must be a **distinctive custom brand symbol** tied to the concept —
|
|
204
|
+
purely abstract/pictorial, containing **no letters or initials**. Ownable,
|
|
205
|
+
memorable, simple, and scalable.
|
|
206
|
+
- Define a tiny brand spec: palette (hex) and the mark concept (the symbol's
|
|
207
|
+
meaning and geometry). No typography — the mark contains no text.
|
|
148
208
|
|
|
149
209
|
### Hard output rules
|
|
150
210
|
- Format **PNG**, exactly **1080 × 1080 px**.
|
|
@@ -153,38 +213,42 @@ clip-art glyph.
|
|
|
153
213
|
gives strong contrast with the mark. State the exact bg hex in the brief.
|
|
154
214
|
- **Mark only**, **center-aligned** both horizontally and vertically, sized large
|
|
155
215
|
with balanced safe padding — not a tiny icon on a big canvas, and not the full
|
|
156
|
-
name spelled out.
|
|
216
|
+
name spelled out. The mark must contain **no letters or initials**.
|
|
157
217
|
- Save it **inside that product's folder**:
|
|
158
218
|
`products_raw/<ProductName>/<ProductName>-logo-1080x1080.png`
|
|
159
|
-
- Also write `products_raw/<ProductName>/logo-brief.md` with:
|
|
160
|
-
|
|
161
|
-
and
|
|
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.)
|
|
162
222
|
|
|
163
223
|
### How to generate it
|
|
164
224
|
1. **Preferred:** if an image-generation tool/model is available, prompt it for a
|
|
165
|
-
*professional brand logo mark / symbol* (specify:
|
|
166
|
-
no wordmark — the concept, color palette, solid
|
|
167
|
-
centered, no photographic texture), then ensure
|
|
168
|
-
PNG on a solid background with the mark centered.
|
|
225
|
+
*professional brand logo mark / symbol* (specify: abstract symbol only — no
|
|
226
|
+
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.
|
|
169
229
|
2. **Fallback (always works):** render a deliberate brand mark programmatically —
|
|
170
|
-
e.g. Python + Pillow — drawing a custom
|
|
171
|
-
|
|
172
|
-
(composition, weight, balance), not like a stock icon. Verify
|
|
173
|
-
the mark is centered, and that the background is fully solid.
|
|
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.
|
|
174
234
|
|
|
175
|
-
Do **not** ship: full wordmarks/the spelled-out
|
|
176
|
-
gradients, generic icon-font glyphs, stock
|
|
177
|
-
emoji, or screenshots. One clean, centered brand **
|
|
235
|
+
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.
|
|
178
238
|
|
|
179
239
|
## Quality bar
|
|
180
240
|
|
|
241
|
+
- **Dual 10/10 gate.** Every shipped product scores 10/10 on Inception Approval
|
|
242
|
+
Fit AND 10/10 on Same-Space Fit. Redesign or discard anything below 10 on
|
|
243
|
+
either axis — quality over quantity.
|
|
181
244
|
- **Same space only.** All products share the startup's industry, category, core
|
|
182
245
|
idea, and users — variations/components/tiers of the one idea, never new
|
|
183
246
|
categories or unrelated businesses.
|
|
184
247
|
- **Products, not copy.** No website/landing/marketing text — concrete product
|
|
185
248
|
concepts and technical plans only.
|
|
186
249
|
- Every product must be GPU-essential and NVIDIA-aligned, with the stack ordered
|
|
187
|
-
physical → SDK → software
|
|
250
|
+
physical → SDK → software, and trip **zero** Inception disqualifiers (no AI
|
|
251
|
+
wrappers, consulting, crypto, or reseller plays).
|
|
188
252
|
- Names obey the 4–10 letter rule (verified) and folder names match.
|
|
189
253
|
- Stay within the founder's domain; elevate, don't fabricate.
|
|
190
254
|
|
|
@@ -197,9 +261,14 @@ emoji, or screenshots. One clean, centered brand **mark** per product.
|
|
|
197
261
|
4. Every product name is **4–10 letters, letters only**, and matches its folder.
|
|
198
262
|
5. Each product lists NVIDIA hardware (GPU/physical) first, then SDKs, then software.
|
|
199
263
|
6. Each product justifies why GPU/accelerated compute is essential.
|
|
200
|
-
7.
|
|
201
|
-
|
|
264
|
+
7. **Every product is a dual 10/10** — Inception Approval Fit 10/10 and Same-Space
|
|
265
|
+
Fit 10/10, both scored with a justification in `product.md` and `_overview.md`,
|
|
266
|
+
and trips none of the hard disqualifiers (AI wrapper, consulting, crypto, reseller).
|
|
267
|
+
8. `products_raw/_overview.md` opens with the locked space, then summarizes all
|
|
268
|
+
products with both scores.
|
|
269
|
+
9. Every product folder has a **1080×1080 PNG logo MARK on a solid
|
|
202
270
|
(non-transparent, non-gradient) background**, the **mark centered** with no full
|
|
203
|
-
wordmark/name text
|
|
204
|
-
not an SVG/UI icon or
|
|
205
|
-
|
|
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.
|
|
274
|
+
10. No marketing/website copy; unknowns marked `[UNKNOWN]`, not invented.
|