Initial JAE-IMAGE-SKILL rebrand
This commit is contained in:
commit
5c1694ffb9
23 changed files with 194412 additions and 0 deletions
5
.clawhubignore
Normal file
5
.clawhubignore
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
node_modules/
|
||||
dist/
|
||||
.env
|
||||
.git/
|
||||
pnpm-lock.yaml
|
||||
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
node_modules/
|
||||
dist/
|
||||
.env
|
||||
references/.last-updated
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2026 YouMind-OpenLab
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
12
NOTICE
Normal file
12
NOTICE
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
JAE-IMAGE-SKILL NOTICE
|
||||
======================
|
||||
|
||||
JAE-IMAGE-SKILL is a JaeSwift-maintained derivative of the MIT-licensed
|
||||
ai-image-prompts-skill project originally published by YouMind-OpenLab.
|
||||
|
||||
The original MIT copyright notice is retained in LICENSE as required by the
|
||||
licence. JaeSwift modifications include rebranding, installer documentation,
|
||||
Agent Zero/generic-agent installation guidance, JAE-controlled reference
|
||||
hosting, and public install instructions.
|
||||
|
||||
Additional modifications Copyright (c) 2026 JaeSwift.
|
||||
82
README.md
Normal file
82
README.md
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
# JAE-IMAGE-SKILL — Curated Image Prompt Recommender for AI Agents
|
||||
|
||||
JAE-IMAGE-SKILL is an installable AI-agent skill for finding, recommending, and customising proven image-generation prompts. It works with Agent Zero / Agent JAE, Claude-style skill loaders, Cursor, Codex, Gemini CLI, Windsurf, and other agents that can read a `SKILL.md` file and local JSON references.
|
||||
|
||||
The skill is model-agnostic. The prompts can be adapted for Midjourney, DALL-E, GPT Image, Flux, Stable Diffusion, Gemini image models, Seedream, and other text-to-image systems.
|
||||
|
||||
## Canonical install link
|
||||
|
||||
Give this URL to an AI agent and tell it to install the skill:
|
||||
|
||||
```text
|
||||
https://jaeswift.xyz/skills/JAE-image-skill/Jae-Image-Skill.MD
|
||||
```
|
||||
|
||||
The installer markdown explains how to clone or download the skill, where to place it, how to validate it, and how to use it.
|
||||
|
||||
## Repository contents
|
||||
|
||||
```text
|
||||
jae-image-skill/
|
||||
SKILL.md # instructions loaded by the AI agent
|
||||
package.json # optional Node package metadata + setup scripts
|
||||
scripts/setup.js # refreshes reference JSON from JaeSwift static hosting
|
||||
references/manifest.json # dynamic category manifest
|
||||
references/*.json # prompt reference data
|
||||
LICENSE # MIT licence retained from upstream
|
||||
NOTICE # derivative/provenance notice
|
||||
```
|
||||
|
||||
## Quick manual install
|
||||
|
||||
```bash
|
||||
SKILLS_DIR="${SKILLS_DIR:-$HOME/.agent-zero/skills}"
|
||||
mkdir -p "$SKILLS_DIR"
|
||||
git clone https://github.com/JaeSwift/JAE-IMAGE-SKILL.git "$SKILLS_DIR/jae-image-skill"
|
||||
cd "$SKILLS_DIR/jae-image-skill"
|
||||
node scripts/setup.js --check || node scripts/setup.js
|
||||
```
|
||||
|
||||
If your agent uses a different skills root, install the folder there instead. The required file is `SKILL.md`; the references are JSON files under `references/`.
|
||||
|
||||
## Usage examples
|
||||
|
||||
Ask your agent:
|
||||
|
||||
```text
|
||||
Use JAE Image Skill to find a cyberpunk avatar prompt with sample images.
|
||||
```
|
||||
|
||||
```text
|
||||
Use JAE Image Skill to find three YouTube thumbnail prompt styles for a Solana market update video.
|
||||
```
|
||||
|
||||
```text
|
||||
Here is my article. Use JAE Image Skill to recommend a matching cover-image prompt, then remix it for my topic.
|
||||
```
|
||||
|
||||
The agent should return up to three prompt recommendations with sample image URLs and a concise reason each one matches.
|
||||
|
||||
## Reference refresh
|
||||
|
||||
References are hosted under:
|
||||
|
||||
```text
|
||||
https://jaeswift.xyz/skills/JAE-image-skill/references/
|
||||
```
|
||||
|
||||
Refresh manually:
|
||||
|
||||
```bash
|
||||
node scripts/setup.js --force
|
||||
```
|
||||
|
||||
Override the source if mirroring elsewhere:
|
||||
|
||||
```bash
|
||||
JAE_IMAGE_SKILL_BASE_URL=https://example.com/references node scripts/setup.js --force
|
||||
```
|
||||
|
||||
## Licence
|
||||
|
||||
MIT. This is a JaeSwift-maintained derivative of an MIT-licensed upstream project. The original copyright notice is retained in `LICENSE`; derivative details are in `NOTICE`.
|
||||
234
SKILL.md
Normal file
234
SKILL.md
Normal file
|
|
@ -0,0 +1,234 @@
|
|||
---
|
||||
name: jae-image-skill
|
||||
description: |
|
||||
Recommend curated image-generation prompts from a large local JSON prompt library.
|
||||
Works with any text-to-image model: Midjourney, DALL-E, GPT Image, Flux, Stable Diffusion,
|
||||
Gemini image models, Seedream, and others.
|
||||
|
||||
Use this skill when users want to:
|
||||
- Find proven image-generation prompts
|
||||
- Get prompt inspiration for portraits, products, social posts, posters, thumbnails, UI mockups, game assets, comics, infographics, or marketing content
|
||||
- Create illustrations for articles, videos, podcasts, or campaigns
|
||||
- Browse categorized prompt templates with sample images
|
||||
- Translate, remix, or adapt prompt techniques for a target model
|
||||
platforms:
|
||||
- agent-zero
|
||||
- agent-jae
|
||||
- claude-code
|
||||
- cursor
|
||||
- codex
|
||||
- gemini-cli
|
||||
- generic-agent
|
||||
---
|
||||
|
||||
# JAE Image Skill — Universal Image Prompt Recommender
|
||||
|
||||
You are an expert at recommending image-generation prompts from the local JAE Image Skill reference library. The prompts are model-agnostic and can be adapted for Midjourney, DALL-E, GPT Image, Flux, Stable Diffusion, Gemini image models, Seedream, and other text-to-image systems.
|
||||
|
||||
## Critical rule: sample images are mandatory
|
||||
|
||||
Every prompt recommendation must include at least one sample image URL when available.
|
||||
|
||||
- Each prompt usually has `sourceMedia[]`.
|
||||
- Prefer `sourceMedia[0]` as the preview image.
|
||||
- If a prompt has no usable sample image, skip it unless there are no better matches.
|
||||
- Never present recommendations as text-only when sample images exist.
|
||||
|
||||
## Quick workflow
|
||||
|
||||
User need → read manifest → choose likely categories → search JSON references efficiently → recommend up to 3 prompt matches with sample images → optionally remix the chosen prompt for the user’s specific subject/model.
|
||||
|
||||
## Setup check
|
||||
|
||||
The skill directory is the folder containing this `SKILL.md` file. References should exist in:
|
||||
|
||||
```text
|
||||
references/manifest.json
|
||||
references/*.json
|
||||
```
|
||||
|
||||
If references are missing or stale, run:
|
||||
|
||||
```bash
|
||||
node <skill_dir>/scripts/setup.js --check
|
||||
```
|
||||
|
||||
To force-refresh from JaeSwift hosting:
|
||||
|
||||
```bash
|
||||
node <skill_dir>/scripts/setup.js --force
|
||||
```
|
||||
|
||||
The default reference source is:
|
||||
|
||||
```text
|
||||
https://jaeswift.xyz/skills/JAE-image-skill/references
|
||||
```
|
||||
|
||||
## Available reference files
|
||||
|
||||
Do not hardcode categories. Always read `references/manifest.json` first. It contains:
|
||||
|
||||
```json
|
||||
{
|
||||
"updatedAt": "...",
|
||||
"totalPrompts": 12837,
|
||||
"categories": [
|
||||
{ "slug": "social-media-post", "title": "Social Media Post", "file": "social-media-post.json", "count": 7972 }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Current common categories include:
|
||||
|
||||
- Profile / Avatar
|
||||
- Social Media Post
|
||||
- Infographic / Edu Visual
|
||||
- YouTube Thumbnail
|
||||
- Comic / Storyboard
|
||||
- Product Marketing
|
||||
- E-commerce Main Image
|
||||
- Game Asset
|
||||
- Poster / Flyer
|
||||
- App / Web Design
|
||||
- Uncategorized
|
||||
|
||||
## Category matching guidance
|
||||
|
||||
After reading the manifest, infer the best file from category titles:
|
||||
|
||||
- avatar, profile, headshot, selfie → Profile / Avatar
|
||||
- infographic, diagram, chart, educational visual → Infographic / Edu Visual
|
||||
- youtube, thumbnail, video cover → YouTube Thumbnail
|
||||
- product, ad, promo, campaign, marketing → Product Marketing
|
||||
- poster, flyer, banner, event → Poster / Flyer
|
||||
- e-commerce, product photo, listing → E-commerce Main Image
|
||||
- game, sprite, character, asset → Game Asset
|
||||
- comic, manga, storyboard → Comic / Storyboard
|
||||
- app, UI, web, dashboard, interface → App / Web Design
|
||||
- instagram, twitter, x post, linkedin, social → Social Media Post
|
||||
- unclear or experimental → Uncategorized and/or search multiple files
|
||||
|
||||
## Token and performance rules
|
||||
|
||||
Never load entire large category JSON files into model context.
|
||||
|
||||
Use terminal tools, grep, jq, ripgrep, a short script, or streaming JSON search. Load only the matching records you need.
|
||||
|
||||
Recommended search process:
|
||||
|
||||
1. Read `references/manifest.json`.
|
||||
2. Pick one to three likely category files.
|
||||
3. Search for keywords from the user request.
|
||||
4. Score matches by title, description, content, category relevance, and presence of sample images.
|
||||
5. Return up to 3 best matches.
|
||||
|
||||
Example shell search:
|
||||
|
||||
```bash
|
||||
cd <skill_dir>
|
||||
rg -i "cyberpunk|avatar|neon|portrait" references/profile-avatar.json references/others.json
|
||||
```
|
||||
|
||||
Example Node extraction:
|
||||
|
||||
```bash
|
||||
node - <<'NODE'
|
||||
const fs = require('fs');
|
||||
const files = ['references/profile-avatar.json', 'references/others.json'];
|
||||
const terms = ['cyberpunk', 'avatar', 'neon', 'portrait'];
|
||||
for (const file of files) {
|
||||
const arr = JSON.parse(fs.readFileSync(file, 'utf8'));
|
||||
for (const p of arr) {
|
||||
const hay = `${p.title} ${p.description} ${p.content}`.toLowerCase();
|
||||
const score = terms.reduce((n,t)=>n+(hay.includes(t)?1:0),0);
|
||||
if (score >= 2 && Array.isArray(p.sourceMedia) && p.sourceMedia.length) {
|
||||
console.log(JSON.stringify({file, score, id:p.id, title:p.title, image:p.sourceMedia[0], prompt:p.content.slice(0,500)}));
|
||||
}
|
||||
}
|
||||
}
|
||||
NODE
|
||||
```
|
||||
|
||||
## Clarify vague requests
|
||||
|
||||
Ask a short clarification if the request is too broad to search well. Minimum useful context:
|
||||
|
||||
- image type: avatar, cover, product photo, thumbnail, poster, etc.
|
||||
- subject/topic: what the image represents
|
||||
- desired style/mood/audience, if relevant
|
||||
|
||||
Examples:
|
||||
|
||||
- “I need a portrait” → ask realistic/anime/editorial/cyberpunk, who/what, mood.
|
||||
- “Make an infographic” → ask topic/data/process/timeline/comparison.
|
||||
- “Generate a product photo” → ask product, background, use case.
|
||||
- “Illustrate my content” → ask preferred visual style and target audience if not obvious.
|
||||
|
||||
## Direct search mode
|
||||
|
||||
Use when the user describes the desired image.
|
||||
|
||||
Return up to 3 recommendations. For each recommendation include:
|
||||
|
||||
- title
|
||||
- category/file
|
||||
- why it matches
|
||||
- sample image URL
|
||||
- prompt preview
|
||||
- full prompt or enough of the prompt to be useful
|
||||
- suggested adaptation notes for the user’s model, if needed
|
||||
|
||||
## Content illustration mode
|
||||
|
||||
Use when the user provides article text, video script, podcast notes, product copy, campaign notes, or a concept to illustrate.
|
||||
|
||||
Process:
|
||||
|
||||
1. Identify the content theme, tone, audience, and required format.
|
||||
2. Search for visual styles that fit the content.
|
||||
3. Recommend up to 3 style/prompt candidates with sample images.
|
||||
4. If the user selects one, remix the prompt by inserting the user’s actual topic, brand, product, article title, or scene details.
|
||||
5. Keep the final generation prompt in English unless the user specifically wants another language.
|
||||
|
||||
## Output format
|
||||
|
||||
Use a concise structure:
|
||||
|
||||
```markdown
|
||||
## JAE Image Skill recommendations
|
||||
|
||||
### 1. <Title>
|
||||
- **Best for:** <use case>
|
||||
- **Why it matches:** <reason>
|
||||
- **Sample image:** <url>
|
||||
- **Prompt:** <prompt or useful excerpt>
|
||||
- **Adaptation notes:** <optional>
|
||||
```
|
||||
|
||||
If your platform supports image attachments or markdown images, show the sample image inline:
|
||||
|
||||
```markdown
|
||||

|
||||
```
|
||||
|
||||
## Model adaptation rules
|
||||
|
||||
- Remove model-specific flags that the target model does not support.
|
||||
- Convert aspect-ratio syntax when needed.
|
||||
- Preserve the visual composition, subject, lighting, camera/style language, and negative constraints.
|
||||
- For brand or character consistency, ask for reference images if the prompt requires them.
|
||||
- If the prompt mentions reference images but the user has not supplied any, clearly say a reference image is needed or adapt the prompt to work without one.
|
||||
|
||||
## No-match fallback
|
||||
|
||||
If no strong match is found:
|
||||
|
||||
1. Say no strong library match was found.
|
||||
2. Offer the closest 1–2 partial matches if useful.
|
||||
3. Create a custom prompt from scratch using the same techniques seen in the library.
|
||||
4. Ask one targeted clarification if needed.
|
||||
|
||||
## Licence note
|
||||
|
||||
This skill is distributed under MIT. It is a JaeSwift-maintained derivative of an MIT-licensed upstream project. Keep `LICENSE` and `NOTICE` with the skill package.
|
||||
4
_meta.json
Normal file
4
_meta.json
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"ownerId": "jaeswift",
|
||||
"slug": "jae-image-skill"
|
||||
}
|
||||
44
package.json
Normal file
44
package.json
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
{
|
||||
"name": "jae-image-skill",
|
||||
"version": "1.0.0",
|
||||
"description": "JAE Image Skill: an installable AI-agent skill for finding, recommending, and customising curated image-generation prompts with sample images for any text-to-image model.",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"postinstall": "node scripts/setup.js",
|
||||
"setup": "node scripts/setup.js",
|
||||
"sync": "node scripts/setup.js --force"
|
||||
},
|
||||
"keywords": [
|
||||
"jaeswift",
|
||||
"jae-image-skill",
|
||||
"agent-zero",
|
||||
"agent-jae",
|
||||
"ai-agent-skill",
|
||||
"image-generation",
|
||||
"prompt-library",
|
||||
"prompt-engineering",
|
||||
"prompt-templates",
|
||||
"image-prompts",
|
||||
"text-to-image",
|
||||
"ai-art",
|
||||
"ai-image",
|
||||
"midjourney-prompts",
|
||||
"dall-e-prompts",
|
||||
"flux-prompts",
|
||||
"stable-diffusion-prompts",
|
||||
"gpt-image",
|
||||
"gemini-image",
|
||||
"content-creation",
|
||||
"image-prompt-recommend"
|
||||
],
|
||||
"author": "JaeSwift",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/JaeSwift/JAE-IMAGE-SKILL.git"
|
||||
},
|
||||
"homepage": "https://jaeswift.xyz/skills/JAE-image-skill/",
|
||||
"bugs": {
|
||||
"url": "https://github.com/JaeSwift/JAE-IMAGE-SKILL/issues"
|
||||
}
|
||||
}
|
||||
171
public/Jae-Image-Skill.MD
Normal file
171
public/Jae-Image-Skill.MD
Normal file
|
|
@ -0,0 +1,171 @@
|
|||
# JAE Image Skill — Agent Install File
|
||||
|
||||
This markdown file is designed for AI agents to read and execute. Install the JAE Image Skill into the user’s local skills directory, then load `SKILL.md` whenever the user asks for image-prompt recommendations.
|
||||
|
||||
## Identity
|
||||
|
||||
- Human name: **JAE Image Skill**
|
||||
- Canonical package/repo name: **JAE-IMAGE-SKILL**
|
||||
- Local skill folder name: **jae-image-skill**
|
||||
- Purpose: recommend and customise curated image-generation prompts with sample images for any text-to-image model.
|
||||
- Canonical install document: `https://jaeswift.xyz/skills/JAE-image-skill/Jae-Image-Skill.MD`
|
||||
- Canonical reference base: `https://jaeswift.xyz/skills/JAE-image-skill/references`
|
||||
- Preferred Git repo: `https://github.com/JaeSwift/JAE-IMAGE-SKILL.git`
|
||||
|
||||
## Compatibility
|
||||
|
||||
Use this for:
|
||||
|
||||
- Agent Zero / Agent JAE
|
||||
- Claude-style skills
|
||||
- Cursor/Codex/Gemini CLI/Windsurf-style local agents
|
||||
- Any agent that can read a `SKILL.md` file and local JSON references
|
||||
|
||||
## Required runtime
|
||||
|
||||
- Node.js 18+ minimum; Node.js 20+ recommended.
|
||||
- `git`, `curl`, and `bash` recommended.
|
||||
- `pnpm` is optional and only needed for development scripts.
|
||||
|
||||
## Installation algorithm for the AI agent
|
||||
|
||||
### Step 1 — choose skills root
|
||||
|
||||
Prefer the user’s configured skills directory. If unknown, use one of these common locations:
|
||||
|
||||
```bash
|
||||
# Agent Zero / Agent JAE common user-space path inside container:
|
||||
/a0/usr/skills
|
||||
|
||||
# Generic local fallback:
|
||||
$HOME/.agent-zero/skills
|
||||
|
||||
# Generic agent fallback:
|
||||
$HOME/.ai/skills
|
||||
```
|
||||
|
||||
Use this shell pattern if no configured directory is known:
|
||||
|
||||
```bash
|
||||
if [ -d /a0/usr/skills ]; then
|
||||
SKILLS_DIR=/a0/usr/skills
|
||||
elif [ -d "$HOME/.agent-zero/skills" ]; then
|
||||
SKILLS_DIR="$HOME/.agent-zero/skills"
|
||||
else
|
||||
SKILLS_DIR="$HOME/.ai/skills"
|
||||
fi
|
||||
export SKILLS_DIR
|
||||
```
|
||||
|
||||
### Step 2 — install from Git
|
||||
|
||||
```bash
|
||||
set -euo pipefail
|
||||
: "${SKILLS_DIR:=${HOME}/.ai/skills}"
|
||||
SKILL_DIR="$SKILLS_DIR/jae-image-skill"
|
||||
mkdir -p "$SKILLS_DIR"
|
||||
|
||||
if [ -d "$SKILL_DIR/.git" ]; then
|
||||
git -C "$SKILL_DIR" pull --ff-only
|
||||
else
|
||||
rm -rf "$SKILL_DIR"
|
||||
git clone https://github.com/JaeSwift/JAE-IMAGE-SKILL.git "$SKILL_DIR"
|
||||
fi
|
||||
|
||||
cd "$SKILL_DIR"
|
||||
node scripts/setup.js --check || node scripts/setup.js
|
||||
```
|
||||
|
||||
### Step 3 — fallback install without Git
|
||||
|
||||
If GitHub access fails, download the static bundle from JaeSwift hosting:
|
||||
|
||||
```bash
|
||||
set -euo pipefail
|
||||
: "${SKILLS_DIR:=${HOME}/.ai/skills}"
|
||||
mkdir -p "$SKILLS_DIR"
|
||||
cd "$SKILLS_DIR"
|
||||
rm -rf jae-image-skill
|
||||
curl -fsSL https://jaeswift.xyz/skills/JAE-image-skill/jae-image-skill.tar.gz | tar -xz
|
||||
cd jae-image-skill
|
||||
node scripts/setup.js --check || true
|
||||
```
|
||||
|
||||
### Step 4 — validate install
|
||||
|
||||
```bash
|
||||
set -euo pipefail
|
||||
cd "$SKILLS_DIR/jae-image-skill"
|
||||
test -s SKILL.md
|
||||
test -s package.json
|
||||
test -s scripts/setup.js
|
||||
test -s references/manifest.json
|
||||
node - <<'NODE'
|
||||
const fs = require('fs');
|
||||
const m = JSON.parse(fs.readFileSync('references/manifest.json','utf8'));
|
||||
if (!Array.isArray(m.categories) || m.categories.length === 0) throw new Error('No categories in manifest');
|
||||
if (typeof m.totalPrompts !== 'number') throw new Error('Bad totalPrompts');
|
||||
for (const c of m.categories) {
|
||||
if (!c.file || !fs.existsSync(`references/${c.file}`)) throw new Error(`Missing ${c.file}`);
|
||||
const arr = JSON.parse(fs.readFileSync(`references/${c.file}`,'utf8'));
|
||||
if (!Array.isArray(arr) || arr.length !== c.count) throw new Error(`Bad count for ${c.file}`);
|
||||
}
|
||||
console.log(`JAE Image Skill OK: ${m.categories.length} categories, ${m.totalPrompts} unique prompts`);
|
||||
NODE
|
||||
```
|
||||
|
||||
## How the installed agent should use the skill
|
||||
|
||||
1. Read `SKILL.md`.
|
||||
2. Read `references/manifest.json` first.
|
||||
3. Pick relevant category files from the manifest.
|
||||
4. Do **not** load huge JSON files wholesale into model context.
|
||||
5. Search using `rg`, `grep`, `jq`, Node.js, Python, or streaming JSON parsing.
|
||||
6. Return up to 3 prompt recommendations.
|
||||
7. Include sample image URLs from `sourceMedia[0]` whenever available.
|
||||
8. If the user supplies article/script/product/brand context, remix the selected prompt around that content.
|
||||
|
||||
## Minimum file layout after install
|
||||
|
||||
```text
|
||||
jae-image-skill/
|
||||
SKILL.md
|
||||
README.md
|
||||
package.json
|
||||
LICENSE
|
||||
NOTICE
|
||||
scripts/setup.js
|
||||
references/manifest.json
|
||||
references/*.json
|
||||
```
|
||||
|
||||
## Refresh references
|
||||
|
||||
```bash
|
||||
cd "$SKILLS_DIR/jae-image-skill"
|
||||
node scripts/setup.js --force
|
||||
```
|
||||
|
||||
The default refresh source is:
|
||||
|
||||
```text
|
||||
https://jaeswift.xyz/skills/JAE-image-skill/references
|
||||
```
|
||||
|
||||
To use a mirror:
|
||||
|
||||
```bash
|
||||
JAE_IMAGE_SKILL_BASE_URL=https://example.com/references node scripts/setup.js --force
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
- `node: fetch is not defined` — upgrade to Node.js 18+; Node.js 20+ recommended.
|
||||
- `HTTP 404` — check URL case. The public path is case-sensitive: `/skills/JAE-image-skill/`.
|
||||
- `references/manifest.json missing` — run `node scripts/setup.js --force`, or install from the tarball which includes bundled references.
|
||||
- Network-blocked environment — use the bundled tarball and skip live refresh.
|
||||
- Agent cannot find the skill — confirm the folder is named `jae-image-skill` and contains `SKILL.md` at the top level.
|
||||
|
||||
## Licence
|
||||
|
||||
JAE-IMAGE-SKILL is distributed under the MIT licence. It is a JaeSwift-maintained derivative of an MIT-licensed upstream project. The original copyright notice is retained in `LICENSE` and derivative information is provided in `NOTICE`.
|
||||
0
references/.gitkeep
Normal file
0
references/.gitkeep
Normal file
2137
references/app-web-design.json
Normal file
2137
references/app-web-design.json
Normal file
File diff suppressed because one or more lines are too long
4265
references/comic-storyboard.json
Normal file
4265
references/comic-storyboard.json
Normal file
File diff suppressed because one or more lines are too long
5738
references/ecommerce-main-image.json
Normal file
5738
references/ecommerce-main-image.json
Normal file
File diff suppressed because one or more lines are too long
5916
references/game-asset.json
Normal file
5916
references/game-asset.json
Normal file
File diff suppressed because one or more lines are too long
5727
references/infographic-edu-visual.json
Normal file
5727
references/infographic-edu-visual.json
Normal file
File diff suppressed because one or more lines are too long
72
references/manifest.json
Normal file
72
references/manifest.json
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
{
|
||||
"updatedAt": "2026-05-01T01:59:02.889Z",
|
||||
"totalPrompts": 12837,
|
||||
"categories": [
|
||||
{
|
||||
"slug": "profile-avatar",
|
||||
"title": "Profile / Avatar",
|
||||
"file": "profile-avatar.json",
|
||||
"count": 1386
|
||||
},
|
||||
{
|
||||
"slug": "social-media-post",
|
||||
"title": "Social Media Post",
|
||||
"file": "social-media-post.json",
|
||||
"count": 7972
|
||||
},
|
||||
{
|
||||
"slug": "infographic-edu-visual",
|
||||
"title": "Infographic / Edu Visual",
|
||||
"file": "infographic-edu-visual.json",
|
||||
"count": 531
|
||||
},
|
||||
{
|
||||
"slug": "youtube-thumbnail",
|
||||
"title": "YouTube Thumbnail",
|
||||
"file": "youtube-thumbnail.json",
|
||||
"count": 203
|
||||
},
|
||||
{
|
||||
"slug": "comic-storyboard",
|
||||
"title": "Comic / Storyboard",
|
||||
"file": "comic-storyboard.json",
|
||||
"count": 402
|
||||
},
|
||||
{
|
||||
"slug": "product-marketing",
|
||||
"title": "Product Marketing",
|
||||
"file": "product-marketing.json",
|
||||
"count": 4715
|
||||
},
|
||||
{
|
||||
"slug": "ecommerce-main-image",
|
||||
"title": "E-commerce Main Image",
|
||||
"file": "ecommerce-main-image.json",
|
||||
"count": 509
|
||||
},
|
||||
{
|
||||
"slug": "game-asset",
|
||||
"title": "Game Asset",
|
||||
"file": "game-asset.json",
|
||||
"count": 545
|
||||
},
|
||||
{
|
||||
"slug": "poster-flyer",
|
||||
"title": "Poster / Flyer",
|
||||
"file": "poster-flyer.json",
|
||||
"count": 642
|
||||
},
|
||||
{
|
||||
"slug": "app-web-design",
|
||||
"title": "App / Web Design",
|
||||
"file": "app-web-design.json",
|
||||
"count": 195
|
||||
},
|
||||
{
|
||||
"slug": "others",
|
||||
"title": "Uncategorized",
|
||||
"file": "others.json",
|
||||
"count": 1045
|
||||
}
|
||||
]
|
||||
}
|
||||
11156
references/others.json
Normal file
11156
references/others.json
Normal file
File diff suppressed because one or more lines are too long
6824
references/poster-flyer.json
Normal file
6824
references/poster-flyer.json
Normal file
File diff suppressed because one or more lines are too long
50753
references/product-marketing.json
Normal file
50753
references/product-marketing.json
Normal file
File diff suppressed because one or more lines are too long
14611
references/profile-avatar.json
Normal file
14611
references/profile-avatar.json
Normal file
File diff suppressed because one or more lines are too long
84335
references/social-media-post.json
Normal file
84335
references/social-media-post.json
Normal file
File diff suppressed because one or more lines are too long
2182
references/youtube-thumbnail.json
Normal file
2182
references/youtube-thumbnail.json
Normal file
File diff suppressed because one or more lines are too long
119
scripts/setup.js
Executable file
119
scripts/setup.js
Executable file
|
|
@ -0,0 +1,119 @@
|
|||
#!/usr/bin/env node
|
||||
/**
|
||||
* setup.js - Downloads/updates the JAE Image Skill reference library.
|
||||
*
|
||||
* Fully dynamic: reads manifest.json first to discover all categories.
|
||||
* New/renamed/removed categories are handled automatically — no hardcoding.
|
||||
*
|
||||
* Usage:
|
||||
* node scripts/setup.js # Download missing files only
|
||||
* node scripts/setup.js --force # Force re-download all references
|
||||
* node scripts/setup.js --check # Auto-update if stale (> 24h)
|
||||
*
|
||||
* Override source if needed:
|
||||
* JAE_IMAGE_SKILL_BASE_URL=https://example.com/references node scripts/setup.js --force
|
||||
*/
|
||||
|
||||
import { existsSync, mkdirSync, statSync, writeFileSync, readFileSync, readdirSync, unlinkSync } from 'fs';
|
||||
import { join, dirname } from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const refsDir = join(__dirname, '..', 'references');
|
||||
const stampFile = join(refsDir, '.last-updated');
|
||||
|
||||
const BASE_URL = (process.env.JAE_IMAGE_SKILL_BASE_URL || 'https://jaeswift.xyz/skills/JAE-image-skill/references').replace(/\/$/, '');
|
||||
const STALE_HOURS = Number(process.env.JAE_IMAGE_SKILL_STALE_HOURS || 24);
|
||||
|
||||
function isStale() {
|
||||
if (!existsSync(stampFile)) return true;
|
||||
const ts = parseInt(readFileSync(stampFile, 'utf8').trim(), 10);
|
||||
return (Date.now() - ts) / 1000 / 3600 > STALE_HOURS;
|
||||
}
|
||||
|
||||
async function fetchText(url) {
|
||||
if (typeof fetch !== 'function') {
|
||||
throw new Error('This installer requires Node.js 18+ with global fetch. Node 20+ is recommended.');
|
||||
}
|
||||
const res = await fetch(url);
|
||||
if (!res.ok) throw new Error(`HTTP ${res.status} — ${url}`);
|
||||
return res.text();
|
||||
}
|
||||
|
||||
async function setup() {
|
||||
const args = process.argv.slice(2);
|
||||
const forceMode = args.includes('--force');
|
||||
const checkMode = args.includes('--check');
|
||||
|
||||
if (checkMode && !isStale()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!existsSync(refsDir)) mkdirSync(refsDir, { recursive: true });
|
||||
|
||||
const label = forceMode ? 'Updating' : 'Downloading';
|
||||
console.log(`[setup] ${label} JAE Image Skill reference library from ${BASE_URL} ...`);
|
||||
|
||||
let categories;
|
||||
try {
|
||||
const manifestText = await fetchText(`${BASE_URL}/manifest.json`);
|
||||
const manifest = JSON.parse(manifestText);
|
||||
categories = manifest.categories;
|
||||
if (!Array.isArray(categories) || categories.length === 0) throw new Error('manifest has no categories');
|
||||
writeFileSync(join(refsDir, 'manifest.json'), manifestText, 'utf8');
|
||||
console.log(` manifest: ${categories.length} categories, ${manifest.totalPrompts} prompts total`);
|
||||
} catch (err) {
|
||||
console.warn(`[setup] Could not fetch manifest: ${err.message}`);
|
||||
console.warn('[setup] Falling back to existing local manifest...');
|
||||
const localManifest = join(refsDir, 'manifest.json');
|
||||
if (!existsSync(localManifest)) {
|
||||
console.error('[setup] No manifest available. Install from the bundled repo/archive or retry with --force.');
|
||||
process.exit(0);
|
||||
}
|
||||
categories = JSON.parse(readFileSync(localManifest, 'utf8')).categories;
|
||||
}
|
||||
|
||||
const validFiles = new Set([...categories.map(c => c.file), 'manifest.json', '.last-updated', '.gitkeep']);
|
||||
if (forceMode && existsSync(refsDir)) {
|
||||
for (const f of readdirSync(refsDir)) {
|
||||
if (!validFiles.has(f)) {
|
||||
unlinkSync(join(refsDir, f));
|
||||
console.log(` removed stale: ${f}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let downloaded = 0, skipped = 0, failed = 0;
|
||||
for (const cat of categories) {
|
||||
const dest = join(refsDir, cat.file);
|
||||
if (!forceMode && existsSync(dest) && statSync(dest).size > 100) {
|
||||
skipped++;
|
||||
continue;
|
||||
}
|
||||
process.stdout.write(` → ${cat.file} (${cat.title}, ${cat.count} prompts) ... `);
|
||||
try {
|
||||
const text = await fetchText(`${BASE_URL}/${cat.file}`);
|
||||
JSON.parse(text);
|
||||
writeFileSync(dest, text, 'utf8');
|
||||
console.log('✓');
|
||||
downloaded++;
|
||||
} catch (err) {
|
||||
console.log(`✗ (${err.message})`);
|
||||
failed++;
|
||||
}
|
||||
}
|
||||
|
||||
if (failed === 0) writeFileSync(stampFile, String(Date.now()), 'utf8');
|
||||
|
||||
if (downloaded > 0) {
|
||||
console.log(`[setup] Done! ${downloaded} file(s) ${forceMode ? 'updated' : 'downloaded'}. JAE Image Skill is ready.`);
|
||||
} else if (skipped === categories.length) {
|
||||
console.log('[setup] All references up to date. Use --force to refresh.');
|
||||
}
|
||||
if (failed > 0) console.warn(`[setup] ${failed} file(s) failed. Run again to retry.`);
|
||||
}
|
||||
|
||||
setup().catch(err => {
|
||||
console.warn('[setup] Warning (non-fatal):', err.message);
|
||||
process.exit(0);
|
||||
});
|
||||
Loading…
Add table
Reference in a new issue