add-skill-kit 3.2.1 → 3.2.2

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.
@@ -130,15 +130,34 @@ export async function run(spec) {
130
130
  if (skillsDir) {
131
131
  for (const e of fs.readdirSync(skillsDir)) {
132
132
  const sp = path.join(skillsDir, e);
133
- if (fs.statSync(sp).isDirectory() && fs.existsSync(path.join(sp, "SKILL.md"))) {
134
- const m = parseSkillMdFrontmatter(path.join(sp, "SKILL.md"));
135
- skillsInRepo.push({
136
- title: e, // Only show folder name
137
- value: e,
138
- description: m.description || "",
139
- selected: singleSkill ? e === singleSkill : true,
140
- _path: sp
141
- });
133
+ if (fs.statSync(sp).isDirectory()) {
134
+ // Check if this directory has SKILL.md (top-level skill)
135
+ if (fs.existsSync(path.join(sp, "SKILL.md"))) {
136
+ const m = parseSkillMdFrontmatter(path.join(sp, "SKILL.md"));
137
+ skillsInRepo.push({
138
+ title: e, // Only show folder name
139
+ value: e,
140
+ description: m.description || "",
141
+ selected: singleSkill ? e === singleSkill : true,
142
+ _path: sp
143
+ });
144
+ }
145
+
146
+ // Also scan nested directories (2 levels deep) for sub-skills
147
+ for (const sub of fs.readdirSync(sp)) {
148
+ const subPath = path.join(sp, sub);
149
+ if (fs.statSync(subPath).isDirectory() && fs.existsSync(path.join(subPath, "SKILL.md"))) {
150
+ const m = parseSkillMdFrontmatter(path.join(subPath, "SKILL.md"));
151
+ const skillName = `${e}/${sub}`; // e.g. "game-development/2d-games"
152
+ skillsInRepo.push({
153
+ title: skillName,
154
+ value: skillName,
155
+ description: m.description || "",
156
+ selected: singleSkill ? skillName === singleSkill : true,
157
+ _path: subPath
158
+ });
159
+ }
160
+ }
142
161
  }
143
162
  }
144
163
  }
@@ -168,19 +187,31 @@ export async function run(spec) {
168
187
  stepLine();
169
188
  step(`Auto-selected: ${c.cyan(singleSkill)}`);
170
189
  } else {
171
- // Group skills by category - expanded keywords for 75+ skills
190
+ // Group skills by category - 5 main categories (all skills covered, no Other)
191
+ // NOTE: Order matters! Mobile is before Security so mobile-security-coder goes to Mobile
172
192
  const CATEGORY_KEYWORDS = {
173
- "⚙️ Backend & API": ["backend", "api", "nodejs", "server", "database", "prisma", "mcp", "python", "cache", "input-validator"],
174
- "🎨 Frontend & UI": ["frontend", "react", "nextjs", "tailwind", "css", "ui", "ux", "design", "visual", "studio", "web-core"],
175
- "🧪 Testing & Quality": ["test", "tdd", "testing", "lint", "review", "code-review", "clean", "validate", "webapp-testing", "e2e", "integration-tester", "load-tester", "code-quality", "code-craft"],
176
- "🔒 Security & DevOps": ["security", "vulnerability", "deploy", "git", "docker", "server-management", "red-team", "governance", "offensive", "gitops", "cicd", "pipeline", "incident", "chaos"],
177
- "📱 Mobile": ["mobile", "react-native", "flutter", "ios", "android"],
178
- "🧠 AI & Agents": ["agent", "routing", "brainstorm", "behavioral", "intelligent", "parallel", "reasoning", "creative", "idea", "context", "self-evolution", "auto-learn", "smart", "multi-agent"],
179
- "📦 Architecture": ["architecture", "system", "pattern", "app-builder", "performance", "profiling", "perf", "scaffold", "workflow", "lifecycle", "state", "execution"],
180
- "📝 Documentation": ["documentation", "plan", "writing", "geo", "seo", "i18n", "localization", "global", "doc-", "requirement", "diagram"],
181
- "🎮 Game Development": ["game"],
182
- "🖥️ CLI & Tools": ["bash", "linux", "powershell", "windows", "debugging", "systematic", "debug", "shell", "script", "logging", "tracing", "metrics", "observability"],
183
- "🔧 Code Tools": ["skill-forge", "code-constitution", "typescript", "problem", "checker"]
193
+ "⚙️ Backend & API": [
194
+ // Core backend
195
+ "backend", "api", "nodejs", "server", "database", "prisma", "mcp", "python", "cache",
196
+ // Architecture & patterns
197
+ "architecture", "pattern", "app-builder", "performance", "profiling",
198
+ // Testing & quality
199
+ "testing", "test", "tdd", "lint", "validate", "debugging", "systematic", "debug",
200
+ "code-review", "code-quality", "e2e", "integration", "webapp", "checklist", "reviewer", "clean",
201
+ // Documentation & tools
202
+ "documentation", "plan", "writing", "geo", "seo", "i18n", "localization", "template",
203
+ // CLI & scripting
204
+ "bash", "linux", "powershell", "windows", "shell", "script",
205
+ // AI & automation
206
+ "agent", "routing", "brainstorm", "behavioral", "intelligent", "parallel", "modes",
207
+ // Other skills
208
+ "typescript", "problem", "workflow", "builder", "conventions", "fundamentals",
209
+ "best-practices", "procedures", "management"
210
+ ],
211
+ "🎨 Frontend & UI": ["frontend", "nextjs", "tailwind", "css", "ui", "ux", "visual", "studio", "web-core", "design-system", "react-architect", "react"],
212
+ "🎮 Game Development": ["game", "development", "engine", "unity", "unreal", "godot", "phaser", "game-dev"],
213
+ "📱 Mobile": ["mobile", "first", "developer", "react-native", "flutter", "ios", "android", "swift", "kotlin"],
214
+ "🔒 Security & DevOps": ["security", "vulnerability", "deploy", "git", "docker", "red-team", "governance", "offensive", "gitops", "cicd", "pipeline", "incident", "chaos", "scanner"]
184
215
  };
185
216
 
186
217
  function categorizeSkill(skillName) {
@@ -190,7 +221,7 @@ export async function run(spec) {
190
221
  return category;
191
222
  }
192
223
  }
193
- return "📚 Other";
224
+ return "⚙️ Backend & API"; // Default fallback (no "Other" category)
194
225
  }
195
226
 
196
227
  // Group skills by category
package/bin/lib/ui.js CHANGED
@@ -12,12 +12,11 @@ export { intro, outro, multiselect, select, confirm, isCancel, cancel, text };
12
12
 
13
13
  // --- ASCII Art Banner ---
14
14
  const PIKAKIT_BANNER = `
15
- ██████╗ ██╗██╗ ██╗ █████╗ ██╗ ██╗██╗████████╗
16
- ██╔══██╗██║██║ ██╔╝██╔══██╗██║ ██╔╝██║╚══██╔══╝
17
- ██████╔╝██║█████╔╝ ███████║█████╔╝ ██║ ██║
18
- ██╔═══╝ ██║██╔═██╗ ██╔══██║██╔═██╗ ██║ ██║
19
- ██║ ██║██║ ██╗██║ ██║██║ ██╗██║ ██║
20
- ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝
15
+ ____ _ _ _ ___ _
16
+ | _ \\(_) | ____ _| |/ (_) |_
17
+ | |_) | | |/ / _\` | ' /| | __|
18
+ | __/| | < (_| | . \\| | |_
19
+ |_| |_|_|\\_\\__,_|_|\\_\\_|\\__|
21
20
  `;
22
21
 
23
22
  // Custom gradient: white → gray (like vercel style)
@@ -167,11 +166,18 @@ export function box(message, options = {}) {
167
166
  * @param {string} [status] - Optional status text
168
167
  */
169
168
  export function brandedIntro(version, status = "") {
170
- // Print ASCII art banner with gradient
171
- console.log(pikaGradient(PIKAKIT_BANNER));
169
+ // Split banner and filter to get content lines only
170
+ const bannerLines = PIKAKIT_BANNER.split('\n').filter(line => line.trim() !== '');
172
171
 
173
- // Version info
174
- console.log(c.dim(` v${version}\n`));
172
+ // Print all lines except the last with gradient
173
+ for (let i = 0; i < bannerLines.length - 1; i++) {
174
+ console.log(pikaGradient(bannerLines[i]));
175
+ }
176
+
177
+ // Last line: gradient ASCII + dim version (aligned at bottom)
178
+ const lastLine = bannerLines[bannerLines.length - 1];
179
+ console.log(pikaGradient(lastLine) + ` ${c.dim(`v${version}`)}`);
180
+ console.log(''); // Empty line after banner
175
181
 
176
182
  if (status) {
177
183
  console.log(`${c.dim(status)}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "add-skill-kit",
3
- "version": "3.2.1",
3
+ "version": "3.2.2",
4
4
  "description": "Enterprise-grade Agent Skill Manager with Antigravity Skills support, Progressive Disclosure detection, and semantic routing validation",
5
5
  "license": "MIT",
6
6
  "author": "agentskillkit <agentskillkit@gmail.com>",