@hasna/skills 0.1.38 → 0.1.40

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/index.js CHANGED
@@ -1910,7 +1910,7 @@ var package_default;
1910
1910
  var init_package = __esm(() => {
1911
1911
  package_default = {
1912
1912
  name: "@hasna/skills",
1913
- version: "0.1.38",
1913
+ version: "0.1.40",
1914
1914
  description: "Skills library for AI coding agents",
1915
1915
  type: "module",
1916
1916
  bin: {
@@ -3286,6 +3286,13 @@ var init_media_processing = __esm(() => {
3286
3286
  var DESIGN_BRANDING_SKILLS;
3287
3287
  var init_design_branding = __esm(() => {
3288
3288
  DESIGN_BRANDING_SKILLS = [
3289
+ {
3290
+ name: "brand-assets",
3291
+ displayName: "Brand Assets",
3292
+ description: "Fetch official brand assets from a website or brand name with logos, PNG sizes, palette, typography, source metadata, and manifests",
3293
+ category: "Design & Branding",
3294
+ tags: ["brand", "logo", "assets", "palette", "typography", "premium", "remote"]
3295
+ },
3289
3296
  {
3290
3297
  name: "icon-pack",
3291
3298
  displayName: "Icon Pack",
@@ -6661,6 +6668,7 @@ var init_pricing = __esm(() => {
6661
6668
  init_skill_aliases();
6662
6669
  MUSIC_ALBUM_SONG_COUNTS = [7, 14, 21];
6663
6670
  PREMIUM_SKILLS = [
6671
+ { slug: "brand-assets", displayName: "Brand Assets", tier: "premium", costCents: 200, providers: ["hosted"], description: "Hosted brand asset discovery package with logos, PNG sizes, palette, typography, source metadata, and manifest" },
6664
6672
  { slug: "icon-pack", displayName: "Icon Pack", tier: "premium", costCents: 200, providers: ["hosted"], description: "Hosted coordinated icon pack with SVGs, transparent PNGs, size variants, and manifest" },
6665
6673
  { slug: "logo-design", displayName: "Logo Design", tier: "premium", costCents: 50, providers: ["hosted"], description: "Hosted multi-variant logo package with transparent PNGs, vector-style SVGs, usage notes, and manifest" },
6666
6674
  { slug: "deepresearch", displayName: "Deep Research", tier: "premium", costCents: 20, providers: ["exa"], description: "Agentic web research with semantic search and synthesis" },
package/bin/mcp.js CHANGED
@@ -6934,6 +6934,7 @@ var init_pricing = __esm(() => {
6934
6934
  init_skill_aliases();
6935
6935
  MUSIC_ALBUM_SONG_COUNTS = [7, 14, 21];
6936
6936
  PREMIUM_SKILLS = [
6937
+ { slug: "brand-assets", displayName: "Brand Assets", tier: "premium", costCents: 200, providers: ["hosted"], description: "Hosted brand asset discovery package with logos, PNG sizes, palette, typography, source metadata, and manifest" },
6937
6938
  { slug: "icon-pack", displayName: "Icon Pack", tier: "premium", costCents: 200, providers: ["hosted"], description: "Hosted coordinated icon pack with SVGs, transparent PNGs, size variants, and manifest" },
6938
6939
  { slug: "logo-design", displayName: "Logo Design", tier: "premium", costCents: 50, providers: ["hosted"], description: "Hosted multi-variant logo package with transparent PNGs, vector-style SVGs, usage notes, and manifest" },
6939
6940
  { slug: "deepresearch", displayName: "Deep Research", tier: "premium", costCents: 20, providers: ["exa"], description: "Agentic web research with semantic search and synthesis" },
@@ -21796,7 +21797,7 @@ class StdioServerTransport {
21796
21797
  // package.json
21797
21798
  var package_default = {
21798
21799
  name: "@hasna/skills",
21799
- version: "0.1.38",
21800
+ version: "0.1.40",
21800
21801
  description: "Skills library for AI coding agents",
21801
21802
  type: "module",
21802
21803
  bin: {
@@ -30709,6 +30710,13 @@ var MEDIA_PROCESSING_SKILLS = [
30709
30710
 
30710
30711
  // src/lib/registry-data/design-branding.ts
30711
30712
  var DESIGN_BRANDING_SKILLS = [
30713
+ {
30714
+ name: "brand-assets",
30715
+ displayName: "Brand Assets",
30716
+ description: "Fetch official brand assets from a website or brand name with logos, PNG sizes, palette, typography, source metadata, and manifests",
30717
+ category: "Design & Branding",
30718
+ tags: ["brand", "logo", "assets", "palette", "typography", "premium", "remote"]
30719
+ },
30712
30720
  {
30713
30721
  name: "icon-pack",
30714
30722
  displayName: "Icon Pack",
package/dist/index.js CHANGED
@@ -1275,6 +1275,13 @@ var MEDIA_PROCESSING_SKILLS = [
1275
1275
 
1276
1276
  // src/lib/registry-data/design-branding.ts
1277
1277
  var DESIGN_BRANDING_SKILLS = [
1278
+ {
1279
+ name: "brand-assets",
1280
+ displayName: "Brand Assets",
1281
+ description: "Fetch official brand assets from a website or brand name with logos, PNG sizes, palette, typography, source metadata, and manifests",
1282
+ category: "Design & Branding",
1283
+ tags: ["brand", "logo", "assets", "palette", "typography", "premium", "remote"]
1284
+ },
1278
1285
  {
1279
1286
  name: "icon-pack",
1280
1287
  displayName: "Icon Pack",
@@ -2658,6 +2665,7 @@ var MUSIC_ALBUM_SLUG = "music-album";
2658
2665
  var MUSIC_ALBUM_SONG_COUNTS = [7, 14, 21];
2659
2666
  var MUSIC_ALBUM_COST_CENTS_PER_SONG = 150;
2660
2667
  var PREMIUM_SKILLS = [
2668
+ { slug: "brand-assets", displayName: "Brand Assets", tier: "premium", costCents: 200, providers: ["hosted"], description: "Hosted brand asset discovery package with logos, PNG sizes, palette, typography, source metadata, and manifest" },
2661
2669
  { slug: "icon-pack", displayName: "Icon Pack", tier: "premium", costCents: 200, providers: ["hosted"], description: "Hosted coordinated icon pack with SVGs, transparent PNGs, size variants, and manifest" },
2662
2670
  { slug: "logo-design", displayName: "Logo Design", tier: "premium", costCents: 50, providers: ["hosted"], description: "Hosted multi-variant logo package with transparent PNGs, vector-style SVGs, usage notes, and manifest" },
2663
2671
  { slug: "deepresearch", displayName: "Deep Research", tier: "premium", costCents: 20, providers: ["exa"], description: "Agentic web research with semantic search and synthesis" },
@@ -18035,7 +18043,7 @@ import { dirname as dirname3, relative as relative2 } from "path";
18035
18043
  // package.json
18036
18044
  var package_default = {
18037
18045
  name: "@hasna/skills",
18038
- version: "0.1.38",
18046
+ version: "0.1.40",
18039
18047
  description: "Skills library for AI coding agents",
18040
18048
  type: "module",
18041
18049
  bin: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/skills",
3
- "version": "0.1.38",
3
+ "version": "0.1.40",
4
4
  "description": "Skills library for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: brand-assets
3
+ description: Fetch official brand assets from a website or brand name, then return logos, palette, typography, source metadata, and a clean asset manifest. Use when a user asks to find, extract, download, package, or normalize a brand's logo and visual identity assets.
4
+ ---
5
+
6
+ # Brand Assets
7
+
8
+ Discover official brand identity material for a company, product, or website and package it into a clean handoff folder.
9
+
10
+ ## Requirements
11
+
12
+ - Hosted premium execution requires `SKILLS_API_KEY`.
13
+ - Provider keys stay server-side in the hosted runtime.
14
+ - Provide either a brand name, a website URL, or both. A URL is preferred when the brand name is ambiguous.
15
+
16
+ ## Usage
17
+
18
+ ```bash
19
+ skills run brand-assets --url https://example.com
20
+ skills run brand-assets --brand "Acme Ledger" --sizes 64,128,256,512,1024
21
+ skills run brand-assets "Acme Ledger" --url https://example.com --include-screenshot
22
+ ```
23
+
24
+ ## Options
25
+
26
+ | Option | Description | Default |
27
+ |--------|-------------|---------|
28
+ | `--brand <text>` | Brand, product, or company name. Positional text also works. | inferred when possible |
29
+ | `--url <url>` | Official website or landing page to inspect. | optional |
30
+ | `--sizes <list>` | Comma-separated PNG export sizes. | `64,128,256,512,1024` |
31
+ | `--include-screenshot` | Include a visual reference screenshot when available. | false |
32
+
33
+ ## Hosted Workflow
34
+
35
+ 1. Resolve the most likely official website and brand pages from the supplied brand or URL.
36
+ 2. Inspect the selected pages for linked logos, favicon assets, social preview images, brand colors, fonts, typography, and structured metadata.
37
+ 3. Prefer official vector logos, then normalize fallback image assets into the requested PNG sizes.
38
+ 4. Name every asset with a stable brand slug, file role, variant, and size.
39
+ 5. Include source URLs and confidence notes so downstream users know where each asset came from.
40
+
41
+ ## Outputs
42
+
43
+ - `manifest.json`
44
+ - `brand-profile.json`
45
+ - `brand-profile.md`
46
+ - `palette.json`
47
+ - `typography.md`
48
+ - `logo-usage.md`
49
+ - `sources.json`
50
+ - `logos/svg/<brand>-logo.svg`
51
+ - `logos/png/<brand>-logo-64.png`
52
+ - `logos/png/<brand>-logo-128.png`
53
+ - `logos/png/<brand>-logo-256.png`
54
+ - `logos/png/<brand>-logo-512.png`
55
+ - `logos/png/<brand>-logo-1024.png`
56
+
57
+ After submitting a hosted run, poll with `skills runs status <run-id>` and download outputs with `skills exports download <run-id>`.
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "brand-assets",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "description": "Hosted premium brand asset discovery package",
6
+ "type": "module",
7
+ "skills": {
8
+ "runtime": "hosted",
9
+ "source": "remote"
10
+ }
11
+ }
@@ -37,17 +37,6 @@ import {
37
37
  requiresAI,
38
38
  getFormatCategory,
39
39
  } from './types';
40
- import {
41
- convertImage,
42
- convertDocument,
43
- convertData,
44
- convertWithAI,
45
- pdfToText,
46
- imagesToPdf,
47
- getPdfMetadata,
48
- getImageMetadata,
49
- } from './converters';
50
-
51
40
  // Parse command line arguments
52
41
  function parseArgs(): {
53
42
  command: string;
@@ -285,6 +274,7 @@ async function showInfo(filePath: string): Promise<void> {
285
274
  // Format-specific info
286
275
  if (category === 'image') {
287
276
  try {
277
+ const { getImageMetadata } = await import('./converters/image');
288
278
  const metadata = await getImageMetadata(filePath);
289
279
  console.log(`Dimensions: ${metadata.width}x${metadata.height}`);
290
280
  console.log(`Channels: ${metadata.channels}`);
@@ -293,6 +283,7 @@ async function showInfo(filePath: string): Promise<void> {
293
283
  }
294
284
  } else if (format === 'pdf') {
295
285
  try {
286
+ const { getPdfMetadata } = await import('./converters/pdf');
296
287
  const metadata = await getPdfMetadata(filePath);
297
288
  console.log(`Pages: ${metadata.pageCount}`);
298
289
  if (metadata.title) console.log(`Title: ${metadata.title}`);
@@ -335,11 +326,13 @@ async function convert(options: ConvertOptions): Promise<ConvertResult> {
335
326
  duration: 0,
336
327
  };
337
328
  }
329
+ const { convertWithAI } = await import('./converters/ai');
338
330
  return convertWithAI(options);
339
331
  }
340
332
 
341
333
  // Image to image
342
334
  if (inputCategory === 'image' && outputCategory === 'image') {
335
+ const { convertImage } = await import('./converters/image');
343
336
  return convertImage(options);
344
337
  }
345
338
 
@@ -351,21 +344,25 @@ async function convert(options: ConvertOptions): Promise<ConvertResult> {
351
344
 
352
345
  // PDF to text
353
346
  if (inputFormat === 'pdf' && outputFormat === 'txt') {
347
+ const { pdfToText } = await import('./converters/pdf');
354
348
  return pdfToText(options);
355
349
  }
356
350
 
357
351
  // Document conversions
358
352
  if (inputCategory === 'document' || outputCategory === 'document') {
353
+ const { convertDocument } = await import('./converters/document');
359
354
  return convertDocument(options);
360
355
  }
361
356
 
362
357
  // Data conversions
363
358
  if (inputCategory === 'data' || outputCategory === 'data') {
359
+ const { convertData } = await import('./converters/data');
364
360
  return convertData(options);
365
361
  }
366
362
 
367
363
  // Markup conversions
368
364
  if (inputCategory === 'markup' || outputCategory === 'markup') {
365
+ const { convertDocument } = await import('./converters/document');
369
366
  return convertDocument(options);
370
367
  }
371
368
 
@@ -400,6 +397,7 @@ async function main(): Promise<void> {
400
397
 
401
398
  // Check if multiple inputs for PDF creation
402
399
  if (args.inputs && args.inputs.length > 1 && args.format === 'pdf') {
400
+ const { imagesToPdf } = await import('./converters/pdf');
403
401
  console.log(`\nCombining ${args.inputs.length} images into PDF...`);
404
402
  const result = await imagesToPdf(
405
403
  args.inputs,