Skill: blammectrappora/impressionist-art-generator (version 1.0.0)

--- name: impressionist-art-generator description: Generate stunning impressionist-style art in the tradition of Monet, Renoir, Van Gogh, Degas, and Pissarro. Perfect for wall art, Etsy prints, art education, painting references, gallery-style landscapes, garden scenes, plein air portraits, and 19th-century French impressionism aesthetics with soft brushstrokes, pastel palettes, and dappled light via the Neta AI image generation API (free trial at neta.art/open). tools: Bash --- # Impressionist Art Generator Generate stunning impressionist-style art in the tradition of Monet, Renoir, Van Gogh, Degas, and Pissarro. Perfect for wall art, Etsy prints, art education, painting references, gallery-style landscapes, garden scenes, plein air portraits, and 19th-century French impressionism aesthetics with soft brushstrokes, pastel palettes, and dappled light. ## 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 impressionist art generator images. ## Quick start ```bash node impressionistartgenerator.js "your description here" --token YOUR_TOKEN ``` ## Options - `--size` — `portrait`, `landscape`, `square`, `tall` (default: `landscape`) - `--ref` — reference image UUID for style inheritance ## Install ```bash npx skills add blammectrappora/impressionist-art-generator ```

path: README.md
content: # Impressionist Art Generator

Generate stunning impressionist-style art from text descriptions in the tradition of Claude Monet, Pierre-Auguste Renoir, Vincent van Gogh, Edgar Degas, and Camille Pissarro. Turn any idea into a gallery-ready painting with soft visible brushstrokes, dappled natural light, pastel palettes with luminous highlights, and the atmospheric feel of late 19th-century French plein air painting — perfect for wall art, Etsy prints, art education, painting references, garden scenes, and portrait studies.

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

## Install

```bash
npx skills add blammectrappora/impressionist-art-generator
```

Or via ClawHub:

```bash
clawhub install impressionist-art-generator
```

## Usage

```bash
node impressionistartgenerator.js "a quiet water-lily pond at sunrise" --token YOUR_TOKEN
```

### Examples

Landscape (default):

```bash
node impressionistartgenerator.js "a field of poppies under a breezy summer sky" --token YOUR_TOKEN
```

Portrait orientation:

```bash
node impressionistartgenerator.js "a young woman reading in a sunlit garden" --size portrait --token YOUR_TOKEN
```

Square for social posts:

```bash
node impressionistartgenerator.js "a Paris café terrace in the afternoon" --size square --token YOUR_TOKEN
```

Inherit style from a reference picture:

```bash
node impressionistartgenerator.js "cliffs overlooking the sea at Étretat" --ref <picture_uuid> --token YOUR_TOKEN
```

## Options

| Flag | Description | Default |
| --- | --- | --- |
| `--token` | Your Neta API token (required) | — |
| `--size` | `portrait` (832×1216), `landscape` (1216×832), `square` (1024×1024), `tall` (704×1408) | `landscape` |
| `--ref` | Reference image UUID for style inheritance | — |

## Output

Returns a direct image URL.

## Token setup

You need a Neta API token to use this skill. Grab a free trial token at <https://www.neta.art/open/>.

Pass your token on every run using the `--token` flag:

```bash
node impressionistartgenerator.js "your prompt here" --token YOUR_TOKEN
```

You can also expand a shell variable yourself if you prefer:

```bash
node impressionistartgenerator.js "your prompt here" --token "$NETA_TOKEN"
```

The `--token` flag is the only way this script accepts a token.

---

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


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

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

const DEFAULT_PROMPT_PREFIX = "impressionist oil painting in the style of Claude Monet and Pierre-Auguste Renoir, soft visible brushstrokes, dappled natural light, pastel palette with luminous highlights, atmospheric plein air scene, textured canvas feel, late 19th century French impressionism";

function parseArgs(argv) {
  const args = { positional: [], size: 'landscape', token: null, ref: null };
  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.startsWith('--size=')) { args.size = a.slice(7); }
    else if (a.startsWith('--token=')) { args.[REDACTED_SECRET]); }
    else if (a.startsWith('--ref=')) { args.ref = a.slice(6); }
    else { args.positional.push(a); }
  }
  return args;
}

async function main() {
  const args = parseArgs(process.argv.slice(2));
  const userPrompt = args.positional.join(' ').trim();

  if (!userPrompt) {
    console.error('\n✗ Prompt required. Usage: node impressionistartgenerator.js "your prompt" --token YOUR_TOKEN');
    process.exit(1);
  }

  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 size = SIZES[args.size] || SIZES.landscape;
  const PROMPT = `${DEFAULT_PROMPT_PREFIX}, ${userPrompt}`;

  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 task (${size.width}×${size.height})...`);

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

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

  const raw = await submitRes.text();
  let taskUuid;
  try {
    const parsed = JSON.parse(raw);
    taskUuid = typeof parsed === 'string' ? parsed : parsed.task_uuid;
  } catch {
    taskUuid = raw.replace(/^"|"$/g, '').trim();
  }

  if (!taskUuid) {
    console.error('\n✗ No task_uuid returned');
    process.exit(1);
  }

  console.error(`→ Task ${taskUuid} submitted. Polling...`);

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

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

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

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

    if (status === 'PENDING' || status === 'MODERATION') {
      if (attempt % 5 === 0) console.error(`  poll ${attempt + 1}: ${status}`);
      continue;
    }

    const url =
      (Array.isArray(data.artifacts) && data.artifacts[0] && data.artifacts[0].url) ||
      data.result_image_url;

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

    console.error(`\n✗ Task ended with status=${status} but no URL found`);
    console.error(JSON.stringify(data, null, 2));
    process.exit(1);
  }

  console.error('\n✗ Timed out waiting for task to complete');
  process.exit(1);
}

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


path: package.json
content: name: impressionist-art-generator
version: 1.0.0
type: module
description: Impressionist Art Generator — AI-powered impressionist art generator
license: MIT

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