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

--- name: pet-memorial-portrait-generator description: Create heartfelt pet memorial portraits and remembrance keepsakes for dogs, cats, and beloved animals who have passed. AI-generated pet memorial art, rainbow bridge portraits, angel pet paintings, and tribute photos perfect for memorial gifts, sympathy cards, keepsake prints, and honoring the memory of a cherished furry family member via the Neta AI image generation API (free trial at neta.art/open). tools: Bash --- # Pet Memorial Portrait Generator Create heartfelt pet memorial portraits and remembrance keepsakes for dogs, cats, and beloved animals who have passed. AI-generated pet memorial art, rainbow bridge portraits, angel pet paintings, and tribute photos perfect for memorial gifts, sympathy cards, keepsake prints, and honoring the memory of a cherished furry family member. ## 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 pet memorial portrait images. ## Quick start ```bash node petmemorialportraitgenerator.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-memorial-portrait-generator ```

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

Create heartfelt pet memorial portraits and remembrance keepsakes from text descriptions. Generate AI pet memorial art, rainbow bridge portraits, angel pet paintings, and tribute imagery perfect for memorial gifts, sympathy cards, keepsake prints, and honoring the memory of a cherished furry family member — all from a written prompt describing the pet you wish to remember.

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

## Install

Via the skills CLI:

```bash
npx skills add blammectrappora/pet-memorial-portrait-generator
```

Or via ClawHub:

```bash
clawhub install pet-memorial-portrait-generator
```

## Usage

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

### Examples

Generate a default memorial portrait:

```bash
node petmemorialportraitgenerator.js "" --token YOUR_TOKEN
```

Custom remembrance scene:

```bash
node petmemorialportraitgenerator.js \
  "golden retriever with angel wings resting in a sunlit meadow, soft cinematic light, peaceful tribute" \
  --token YOUR_TOKEN
```

Landscape orientation for a keepsake card:

```bash
node petmemorialportraitgenerator.js \
  "tabby cat curled on a cloud, gentle starlight, rainbow bridge background" \
  --size landscape \
  --token YOUR_TOKEN
```

Use a reference image for style inheritance:

```bash
node petmemorialportraitgenerator.js \
  "a beloved beagle in a serene garden of remembrance" \
  --ref <picture_uuid> \
  --token YOUR_TOKEN
```

## Options

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

### Sizes

| Size      | Dimensions  |
| --------- | ----------- |
| portrait  | 832 × 1216  |
| landscape | 1216 × 832  |
| square    | 1024 × 1024 |
| 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: package.json
content: name: pet-memorial-portrait-generator
version: 1.0.0
type: module
description: Pet Memorial Portrait Generator — AI-powered pet memorial portrait ai
license: MIT

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

const DEFAULT_PROMPT = "A serene memorial portrait of a beloved pet, soft golden light streaming from above, peaceful meadow background with gentle clouds, tender cinematic atmosphere, warm nostalgic tones, detailed fur texture, gentle eyes full of love, tasteful remembrance composition, professional pet photography, soft bokeh, dreamy celestial mood";

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

function parseArgs(argv) {
  const args = { size: 'portrait', token: null, ref: null, prompt: null };
  const rest = argv.slice(2);
  for (let i = 0; i < rest.length; i++) {
    const a = rest[i];
    if (a === '--size')        args.size  = rest[++i];
    else if (a === '--token')  args.[REDACTED_SECRET];
    else if (a === '--ref')    args.ref   = rest[++i];
    else if (!args.prompt)     args.prompt = a;
  }
  return args;
}

async function makeImage({ token, prompt, size, ref }) {
  const dims = SIZES[size] || SIZES.portrait;
  const body = {
    storyId: "DO_NOT_USE",
    jobType: "universal",
    rawPrompt: [{ type: "freetext", value: prompt, weight: 1 }],
    width: dims.width,
    height: dims.height,
    meta: { entrance: "PICTURE,VERSE" },
    context_model_series: "8_image_edit",
  };
  if (ref) {
    body.inherit_params = { collection_uuid: ref, picture_uuid: ref };
  }

  const res = await fetch("https://api.talesofai.com/v3/make_image", {
    method: "POST",
    headers: {
      "x-token": token,
      "x-platform": "nieta-app/web",
      "content-type": "application/json",
    },
    body: JSON.stringify(body),
  });

  if (!res.ok) {
    const txt = await res.text();
    throw new Error(`make_image failed: ${res.status} ${txt}`);
  }

  const ct = res.headers.get("content-type") || "";
  if (ct.includes("application/json")) {
    const data = await res.json();
    if (typeof data === "string") return data;
    if (data && data.task_uuid) return data.task_uuid;
    throw new Error(`Unexpected response: ${JSON.stringify(data)}`);
  }
  const txt = (await res.text()).trim().replace(/^"|"$/g, "");
  return txt;
}

async function pollTask({ token, taskUuid }) {
  const url = `https://api.talesofai.com/v1/artifact/task/${taskUuid}`;
  for (let i = 0; i < 90; i++) {
    const res = await fetch(url, {
      headers: {
        "x-token": token,
        "x-platform": "nieta-app/web",
        "content-type": "application/json",
      },
    });
    if (!res.ok) {
      const txt = await res.text();
      throw new Error(`poll failed: ${res.status} ${txt}`);
    }
    const data = await res.json();
    const status = data.task_status;
    if (status !== "PENDING" && status !== "MODERATION") {
      const url0 = (data.artifacts && data.artifacts[0] && data.artifacts[0].url) || data.result_image_url;
      if (!url0) throw new Error(`Task finished but no image URL: ${JSON.stringify(data)}`);
      return url0;
    }
    await new Promise(r => setTimeout(r, 2000));
  }
  throw new Error("Timed out waiting for task to finish");
}

async function main() {
  const { prompt: promptArg, size, [REDACTED_SECRET], ref } = parseArgs(process.argv);
  const PROMPT = promptArg || DEFAULT_PROMPT;
  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);
  }

  try {
    const taskUuid = await makeImage({ token: TOKEN, prompt: PROMPT, size, ref });
    const imageUrl = await pollTask({ token: TOKEN, taskUuid });
    console.log(imageUrl);
    process.exit(0);
  } catch (err) {
    console.error(`\n✗ ${err.message}`);
    process.exit(1);
  }
}

main();


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