@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 +9 -1
- package/bin/mcp.js +9 -1
- package/dist/index.js +9 -1
- package/package.json +1 -1
- package/skills/brand-assets/SKILL.md +57 -0
- package/skills/brand-assets/package.json +11 -0
- package/skills/convert/src/index-local.ts +9 -11
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.
|
|
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.
|
|
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.
|
|
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
|
@@ -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>`.
|
|
@@ -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,
|