Skill: blammectrappora/mascot-generator (version 1.0.0)

--- name: mascot-generator description: Generate custom brand mascots and cartoon characters with AI. Perfect for small businesses, startups, sports teams, schools, gaming clans, esports crews, and YouTube channels that need a unique company mascot, brand character, cute logo mascot, team figure, or memorable brand identity illustration via the Neta AI image generation API (free trial at neta.art/open). tools: Bash --- # Mascot Generator Generate custom brand mascots and cartoon characters with AI. Perfect for small businesses, startups, sports teams, schools, gaming clans, esports crews, and YouTube channels that need a unique company mascot, brand character, cute logo mascot, team figure, or memorable brand identity illustration. ## Token Requires a Neta API token (free trial at <https://www.neta.art/open/>). Pass it via the `--token` flag. ```bash node <script> "your prompt" --token YOUR_TOKEN ``` ## When to use Use when someone asks to generate or create brand mascot generator images. ## Quick start ```bash node mascotgenerator.js "your description here" --token YOUR_TOKEN ``` ## Options - `--size` — `portrait`, `landscape`, `square`, `tall` (default: `square`) - `--ref` — reference image UUID for style inheritance ## Install ```bash npx skills add blammectrappora/mascot-generator ```

path: README.md
content: # Mascot Generator

Generate custom brand mascots and cartoon characters from text descriptions using AI. Perfect for small businesses, startups, sports teams, schools, gaming clans, esports crews, and YouTube channels that need a unique company mascot, brand character, cute logo mascot, team figure, or memorable brand identity illustration — all created from a simple written prompt.

Powered by the Neta AI image generation API (api.talesofai.com) — the same service as neta.art/open.

## Install

Using the ClawHub skills CLI:

```bash
npx skills add blammectrappora/mascot-generator
```

Or using clawhub directly:

```bash
clawhub install mascot-generator
```

## Usage

```bash
node mascotgenerator.js "your description here" --token YOUR_TOKEN
```

### Examples

Generate a coffee shop mascot:

```bash
node mascotgenerator.js "a smiling coffee bean character wearing a barista apron, holding a tiny cup" --token YOUR_TOKEN
```

Generate an esports team mascot in landscape:

```bash
node mascotgenerator.js "fierce wolf mascot for an esports team, wearing headphones, neon accents" \
  --token YOUR_TOKEN \
  --size landscape
```

Use a reference image UUID for style inheritance:

```bash
node mascotgenerator.js "friendly robot mascot for a tech startup" \
  --token YOUR_TOKEN \
  --ref 123e4567-e89b-12d3-a456-426614174000
```

## Options

| Flag       | Description                                                       | Default  |
| ---------- | ----------------------------------------------------------------- | -------- |
| `--token`  | Neta API token (required)                                         | —        |
| `--size`   | Output aspect: `square`, `portrait`, `landscape`, `tall`          | `square` |
| `--ref`    | Reference image UUID for style inheritance                        | —        |
| `-h`, `--help` | Show help                                                     | —        |

### Sizes

| Name        | Dimensions   |
| ----------- | ------------ |
| `square`    | 1024 × 1024  |
| `portrait`  | 832 × 1216   |
| `landscape` | 1216 × 832   |
| `tall`      | 704 × 1408   |

## Token setup

This skill requires a Neta API token (free trial available at <https://www.neta.art/open/>).

Pass it via the `--token` flag:

```bash
node <script> "your prompt" --token YOUR_TOKEN
```

## Output

Returns a direct image URL.



path: mascotgenerator.js
content: #!/usr/bin/env node
import process from 'node:process';

const DEFAULT_PROMPT = 'cute friendly brand mascot character, full body pose, clean bold outlines, vibrant colors, professional mascot design, commercial character art, memorable and expressive, centered composition, plain background';
const STYLE = 'cinematic';

const SIZES = {
  square: { width: 1024, height: 1024 },
  portrait: { width: 832, height: 1216 },
  landscape: { width: 1216, height: 832 },
  tall: { width: 704, height: 1408 },
};

const API_BASE = 'https://api.talesofai.com';

function parseArgs(argv) {
  const args = { _: [] };
  for (let i = 0; i < argv.length; i++) {
    const a = argv[i];
    if (a === '--size') args.size = argv[++i];
    else if (a === '--token') args.[REDACTED_SECRET];
    else if (a === '--ref') args.ref = argv[++i];
    else if (a === '--help' || a === '-h') args.help = true;
    else args._.push(a);
  }
  return args;
}

function printHelp() {
  console.log(`Mascot Generator

Usage:
  node mascotgenerator.js "your prompt" --token YOUR_TOKEN [options]

Options:
  --size <size>   square (default), portrait, landscape, tall
  --token <tok>   Neta API token (required) — get one at https://www.neta.art/open/
  --ref <uuid>    Reference image UUID for style inheritance
  -h, --help      Show this help
`);
}

async function main() {
  const args = parseArgs(process.argv.slice(2));
  if (args.help) {
    printHelp();
    process.exit(0);
  }

  const userPrompt = args._[0];
  const PROMPT = userPrompt && userPrompt.trim().length > 0
    ? `${userPrompt.trim()}, ${DEFAULT_PROMPT}`
    : DEFAULT_PROMPT;

  const tokenFlag = args.token;
  const [REDACTED_SECRET];

  if (!TOKEN) {
    console.error('\n✗ Token required. Pass via: --token YOUR_TOKEN');
    console.error('  Get yours at: https://www.neta.art/open/');
    process.exit(1);
  }

  const sizeKey = (args.size || 'square').toLowerCase();
  const size = SIZES[sizeKey];
  if (!size) {
    console.error(`✗ Invalid size "${sizeKey}". Valid: ${Object.keys(SIZES).join(', ')}`);
    process.exit(1);
  }

  const headers = {
    'x-token': TOKEN,
    'x-platform': 'nieta-app/web',
    'content-type': 'application/json',
  };

  const body = {
    storyId: 'DO_NOT_USE',
    jobType: 'universal',
    rawPrompt: [{ type: 'freetext', value: PROMPT, weight: 1 }],
    width: size.width,
    height: size.height,
    meta: { entrance: 'PICTURE,VERSE' },
    context_model_series: '8_image_edit',
  };

  if (args.ref) {
    body.inherit_params = {
      collection_uuid: args.ref,
      picture_uuid: args.ref,
    };
  }

  console.error(`→ Submitting mascot generation request (${size.width}×${size.height}, style: ${STYLE})...`);

  let submitRes;
  try {
    submitRes = await fetch(`https://api.talesofai.com/v3/make_image`, {
      method: 'POST',
      headers,
      body: JSON.stringify(body),
    });
  } catch (err) {
    console.error(`✗ Network error: ${err.message}`);
    process.exit(1);
  }

  if (!submitRes.ok) {
    const text = await submitRes.text().catch(() => '');
    console.error(`✗ Submit failed (${submitRes.status}): ${text}`);
    process.exit(1);
  }

  const submitText = await submitRes.text();
  let taskUuid;
  const trimmed = submitText.trim();
  try {
    const parsed = JSON.parse(trimmed);
    if (typeof parsed === 'string') taskUuid = parsed;
    else if (parsed && typeof parsed === 'object') taskUuid = parsed.task_uuid || parsed.taskUuid;
  } catch {
    taskUuid = trimmed.replace(/^"|"$/g, '');
  }

  if (!taskUuid) {
    console.error(`✗ Could not parse task_uuid from response: ${submitText}`);
    process.exit(1);
  }

  console.error(`→ Task submitted: ${taskUuid}`);
  console.error('→ Polling for result...');

  const maxAttempts = 90;
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
    await new Promise((r) => setTimeout(r, 2000));

    let pollRes;
    try {
      pollRes = await fetch(`https://api.talesofai.com/v1/artifact/task/${taskUuid}`, { headers });
    } catch (err) {
      console.error(`  (attempt ${attempt}) network error: ${err.message}`);
      continue;
    }

    if (!pollRes.ok) {
      console.error(`  (attempt ${attempt}) poll failed: ${pollRes.status}`);
      continue;
    }

    let data;
    try {
      data = await pollRes.json();
    } catch {
      continue;
    }

    const status = data.task_status;
    if (status === 'PENDING' || status === 'MODERATION') {
      if (attempt % 5 === 0) console.error(`  ...still ${status.toLowerCase()} (${attempt}/${maxAttempts})`);
      continue;
    }

    const url = (data.artifacts && data.artifacts[0] && data.artifacts[0].url) || data.result_image_url;
    if (url) {
      console.log(url);
      process.exit(0);
    }

    console.error(`✗ Task finished with status "${status}" but no image URL found.`);
    console.error(JSON.stringify(data, null, 2));
    process.exit(1);
  }

  console.error('✗ Timed out waiting for image generation.');
  process.exit(1);
}

main().catch((err) => {
  console.error(`✗ Unexpected error: ${err.message}`);
  process.exit(1);
});


path: package.json
content: name: mascot-generator
version: 1.0.0
type: module
description: Mascot Generator — AI-powered brand mascot generator ai
license: MIT

Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (HIGH)