Skill: blammectrappora/pet-renaissance-portrait-generator (version 1.0.0)

--- name: pet-renaissance-portrait-generator description: your pet into a royal Renaissance masterpiece — AI-powered royal pet portrait generator creates museum-quality oil painting portraits of dogs, cats, and any pet as 17th-century aristocrats, medieval knights, or baroque nobility. Perfect for pet lovers, custom pet art, viral social media content, unique gift ideas, and personalized wall art via the Neta AI image generation API (free trial at neta.art/open). tools: Bash --- # Pet Renaissance Portrait Generator your pet into a royal Renaissance masterpiece — AI-powered royal pet portrait generator creates museum-quality oil painting portraits of dogs, cats, and any pet as 17th-century aristocrats, medieval knights, or baroque nobility. Perfect for pet lovers, custom pet art, viral social media content, unique gift ideas, and personalized wall art. ## 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 royal pet portrait ai generator images. ## Quick start ```bash node petrenaissanceportraitgenerator.js "your description here" --token YOUR_TOKEN ``` ## Options - `--size` — `portrait`, `landscape`, `square`, `tall` (default: `portrait`) - `--ref` — reference image UUID for style inheritance ## Install ```bash npx skills add blammectrappora/pet-renaissance-portrait-generator ```

path: README.md
content: # Pet Renaissance Portrait Generator

Generate stunning royal Renaissance oil painting portraits of any pet from text descriptions. Describe your dog, cat, rabbit, or any pet, and receive a museum-quality baroque masterpiece depicting them as 17th-century aristocrats, medieval knights, or baroque nobility — complete with velvet robes, ornate gold jewelry, and dramatic Rembrandt lighting.

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

---

## Install

**Via npx skills:**
```bash
npx skills add blammectrappora/pet-renaissance-portrait-generator
```

**Via ClawHub:**
```bash
clawhub install pet-renaissance-portrait-generator
```

---

## 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
```

## Usage

```bash
node petrenaissanceportraitgenerator.js "<prompt>" --token YOUR_TOKEN [--size <size>] [--ref <uuid>]
```

### Examples

Generate a portrait of a golden retriever as a Renaissance nobleman:
```bash
node petrenaissanceportraitgenerator.js \
  "a majestic golden retriever dressed in elaborate 17th-century aristocratic clothing, velvet robes, ornate gold jewelry, regal pose, dramatic Rembrandt lighting, baroque oil painting style" \
  --token "$NETA_TOKEN"
```

Generate a landscape-format portrait of a Persian cat as a royal duchess:
```bash
node petrenaissanceportraitgenerator.js \
  "a regal Persian cat in the style of a baroque duchess portrait, wearing an ornate lace collar and pearl necklace, rich jewel-toned background, old master painting" \
  --token "$NETA_TOKEN" \
  --size landscape
```

Use a reference image UUID for style inheritance:
```bash
node petrenaissanceportraitgenerator.js \
  "a noble beagle in a 17th-century military uniform, dramatic lighting, Renaissance oil painting" \
  --token "$NETA_TOKEN" \
  --ref "some-picture-uuid-here"
```

### Output

Returns a direct image URL printed to stdout. Redirect or pipe it as needed:

```bash
IMAGE_URL=$(node petrenaissanceportraitgenerator.js "a majestic tabby cat in velvet robes" --token "$NETA_TOKEN")
echo "$IMAGE_URL"
```

---

## Options

| Flag | Values | Default | Description |
|------|--------|---------|-------------|
| `--token` | string | *(required)* | Your Neta API token |
| `--size` | `portrait`, `landscape`, `square`, `tall` | `portrait` | Output image dimensions |
| `--ref` | UUID string | *(none)* | Reference image UUID for style inheritance |

### Size Dimensions

| Size | Width | Height |
|------|-------|--------|
| `portrait` | 832 | 1216 |
| `landscape` | 1216 | 832 |
| `square` | 1024 | 1024 |
| `tall` | 704 | 1408 |

---

## Default Prompt

If you want a ready-made starting point, try this default prompt (replace `[pet breed]` with your pet's breed):

```
a majestic Renaissance oil painting portrait of a [pet breed], dressed in elaborate 17th-century aristocratic clothing, velvet robes, ornate gold jewelry and collar, regal dignified pose, dramatic Rembrandt lighting, rich jewel-toned background, museum-quality baroque masterpiece, highly detailed brushwork, old master painting style
```

---

## How It Works

1. Your text description is sent to the Neta AI image generation API.
2. The API queues a generation job and returns a task UUID.
3. The script polls for completion every 2 seconds (up to 90 attempts / ~3 minutes).
4. When the image is ready, the direct image URL is printed to stdout.



path: package.json
content: {"name":[REDACTED_SECRET],"version":"1.0.0","type":"module","description":"Pet Renaissance Portrait Generator — AI-powered royal pet portrait ai generator","license":"MIT"}


path: petrenaissanceportraitgenerator.js
content: #!/usr/bin/env node
// Pet Renaissance Portrait Generator
// Generates royal Renaissance oil painting portraits of pets via the Neta AI image generation API.

const args = process.argv.slice(2);

// Parse CLI arguments
let prompt = null;
let size = 'portrait';
let tokenFlag = null;
let refUuid = null;

for (let i = 0; i < args.length; i++) {
  if (args[i] === '--token' && args[i + 1]) {
    tokenFlag = args[++i];
  } else if (args[i] === '--size' && args[i + 1]) {
    size = args[++i];
  } else if (args[i] === '--ref' && args[i + 1]) {
    refUuid = args[++i];
  } else if (!args[i].startsWith('--') && prompt === null) {
    prompt = args[i];
  }
}

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);
}

if (!prompt) {
  console.error('\n✗ Prompt required as the first positional argument.');
  console.error('  Example: node petrenaissanceportraitgenerator.js "a majestic golden retriever in velvet robes" --token YOUR_TOKEN');
  process.exit(1);
}

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

const dimensions = SIZES[size] || SIZES.portrait;

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

async function makeImage() {
  const body = {
    storyId: 'DO_NOT_USE',
    jobType: 'universal',
    rawPrompt: [{ type: 'freetext', value: prompt, weight: 1 }],
    width: dimensions.width,
    height: dimensions.height,
    meta: { entrance: 'PICTURE,VERSE' },
    context_model_series: '8_image_edit',
  };

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

  const res = await fetch('https://api.talesofai.com/v3/make_image', {
    method: 'POST',
    headers: HEADERS,
    body: JSON.stringify(body),
  });

  if (!res.ok) {
    const text = await res.text();
    console.error(`✗ Failed to start image generation (HTTP ${res.status}): ${text}`);
    process.exit(1);
  }

  const data = await res.json();
  const taskUuid = typeof data === 'string' ? data : data.task_uuid;

  if (!taskUuid) {
    console.error('✗ No task_uuid returned from API.');
    console.error(JSON.stringify(data, null, 2));
    process.exit(1);
  }

  console.error(`Generating image... (task: ${taskUuid})`);
  return taskUuid;
}

async function pollTask(taskUuid) {
  const maxAttempts = 90;
  const delayMs = 2000;

  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
    await new Promise(resolve => setTimeout(resolve, delayMs));

    const res = await fetch(`https://api.talesofai.com/v1/artifact/task/${taskUuid}`, {
      headers: HEADERS,
    });

    if (!res.ok) {
      const text = await res.text();
      console.error(`✗ Poll request failed (HTTP ${res.status}): ${text}`);
      process.exit(1);
    }

    const data = await res.json();
    const status = data.task_status;

    if (status === 'PENDING' || status === 'MODERATION') {
      process.stderr.write('.');
      continue;
    }

    // Done — extract image URL
    process.stderr.write('\n');
    const url =
      (data.artifacts && data.artifacts[0] && data.artifacts[0].url) ||
      data.result_image_url;

    if (!url) {
      console.error('✗ No image URL found in response.');
      console.error(JSON.stringify(data, null, 2));
      process.exit(1);
    }

    console.log(url);
    process.exit(0);
  }

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

const taskUuid = await makeImage();
await pollTask(taskUuid);


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