luckiest-co 1.0.28 → 1.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/skills/luckiest-ad-creative/CHANGELOG.md +6 -0
- package/skills/luckiest-ad-creative/SKILL.md +7 -3
- package/skills/luckiest-brandkit/ATTRIBUTION.md +8 -0
- package/skills/luckiest-brandkit/CHANGELOG.md +39 -0
- package/skills/luckiest-brandkit/SKILL.md +208 -0
- package/skills/luckiest-brandkit/references/picks-and-review.md +48 -0
- package/skills/luckiest-brandkit/references/prompt-recipes.md +79 -0
- package/skills/luckiest-brandkit/scripts/build_review.mjs +134 -0
- package/skills/luckiest-brandkit/scripts/build_review.test.mjs +43 -0
- package/skills/luckiest-brandkit/scripts/composite_mark.py +36 -0
- package/skills/luckiest-brandkit/scripts/composite_screen.py +37 -0
- package/skills/luckiest-brandkit/scripts/contact_sheet.py +31 -0
- package/skills/luckiest-brandkit/scripts/make_refs.mjs +25 -0
- package/skills/luckiest-design-website/CHANGELOG.md +4 -0
- package/skills/luckiest-design-website/SKILL.md +11 -4
- package/skills/luckiest-image/CHANGELOG.md +5 -0
- package/skills/luckiest-image/SKILL.md +14 -5
- package/skills/luckiest-plan/SKILL.md +2 -0
- package/skills/luckiest-social/CHANGELOG.md +3 -0
- package/skills/luckiest-social/SKILL.md +5 -3
- package/skills/luckiest-video/CHANGELOG.md +6 -0
- package/skills/luckiest-video/SKILL.md +7 -3
- package/skills/luckiest-video-studio/CHANGELOG.md +8 -0
- package/skills/luckiest-video-studio/SKILL.md +14 -3
- package/skills/luckiest-video-studio-art-director/ATTRIBUTION.md +24 -0
- package/skills/luckiest-video-studio-art-director/CHANGELOG.md +41 -0
- package/skills/luckiest-video-studio-art-director/LICENSE-iart +21 -0
- package/skills/luckiest-video-studio-art-director/LICENSE-replicate +190 -0
- package/skills/luckiest-video-studio-art-director/LICENSE-skillme +21 -0
- package/skills/luckiest-video-studio-art-director/SKILL.md +324 -0
- package/skills/luckiest-video-studio-art-director/references/shot-prompting.md +86 -0
- package/skills/luckiest-video-studio-cards/CHANGELOG.md +3 -0
- package/skills/luckiest-video-studio-cards/SKILL.md +5 -3
- package/skills/luckiest-video-studio-director/ATTRIBUTION.md +16 -0
- package/skills/luckiest-video-studio-director/CHANGELOG.md +18 -0
- package/skills/luckiest-video-studio-director/LICENSE-iart +21 -0
- package/skills/luckiest-video-studio-director/LICENSE-skillme +21 -0
- package/skills/luckiest-video-studio-director/SKILL.md +198 -0
- package/skills/luckiest-video-studio-director/scripts/breakdown.mjs +160 -0
- package/skills/luckiest-video-studio-recreate/CHANGELOG.md +3 -0
- package/skills/luckiest-video-studio-recreate/SKILL.md +6 -4
- package/skills/luckiest-video-studio-reel/CHANGELOG.md +3 -0
- package/skills/luckiest-video-studio-reel/SKILL.md +5 -3
- package/skills/luckiest-video-studio-script/CHANGELOG.md +3 -0
- package/skills/luckiest-video-studio-script/SKILL.md +8 -3
- package/skills/luckiest-video-studio-talk/CHANGELOG.md +3 -0
- package/skills/luckiest-video-studio-talk/SKILL.md +5 -3
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Print a real logo mark onto a surface (fabric, paper) that the model drew wrong.
|
|
3
|
+
|
|
4
|
+
Erase the bad mark first (image retouch, mode erase), then:
|
|
5
|
+
composite_mark.py <erased.png> <mark-ink-on-white.png> <out.png> --x X --y Y --height H
|
|
6
|
+
[--rotate DEG] [--squash 0.86] [--dot "#EE425C"]
|
|
7
|
+
|
|
8
|
+
Multiply blend keeps folds and shading. --squash fakes top-down foreshortening.
|
|
9
|
+
--dot adds a small accent circle right of the mark's foot.
|
|
10
|
+
"""
|
|
11
|
+
import argparse
|
|
12
|
+
from PIL import Image, ImageChops, ImageDraw, ImageFilter
|
|
13
|
+
|
|
14
|
+
a = argparse.ArgumentParser()
|
|
15
|
+
a.add_argument("base"); a.add_argument("mark"); a.add_argument("out")
|
|
16
|
+
a.add_argument("--x", type=int, required=True); a.add_argument("--y", type=int, required=True)
|
|
17
|
+
a.add_argument("--height", type=int, required=True)
|
|
18
|
+
a.add_argument("--rotate", type=float, default=0); a.add_argument("--squash", type=float, default=1.0)
|
|
19
|
+
a.add_argument("--dot", default=None)
|
|
20
|
+
o = a.parse_args()
|
|
21
|
+
|
|
22
|
+
base = Image.open(o.base).convert("RGB")
|
|
23
|
+
m = Image.open(o.mark).convert("L")
|
|
24
|
+
m = m.crop(Image.eval(m, lambda p: 255 - p).getbbox())
|
|
25
|
+
m = m.resize((max(1, int(m.width * o.height / m.height)), o.height), Image.LANCZOS)
|
|
26
|
+
art = Image.new("L", (m.width + (40 if o.dot else 0), m.height), 255); art.paste(m, (0, 0))
|
|
27
|
+
art = Image.merge("RGB", [art] * 3)
|
|
28
|
+
if o.dot:
|
|
29
|
+
r = max(3, o.height // 16); cx, cy = m.width + 22, int(o.height * 0.80)
|
|
30
|
+
ImageDraw.Draw(art).ellipse((cx - r, cy - r, cx + r, cy + r), fill=o.dot)
|
|
31
|
+
art = art.resize((art.width, max(1, int(art.height * o.squash))), Image.LANCZOS)
|
|
32
|
+
art = art.rotate(o.rotate, Image.BICUBIC, expand=True, fillcolor=(255, 255, 255)).filter(ImageFilter.GaussianBlur(0.6))
|
|
33
|
+
region = base.crop((o.x, o.y, o.x + art.width, o.y + art.height))
|
|
34
|
+
base.paste(ImageChops.multiply(region, art), (o.x, o.y))
|
|
35
|
+
base.save(o.out)
|
|
36
|
+
print(o.out)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Warp exact artwork onto a flat surface in a photo (billboard, screen, poster, sign).
|
|
3
|
+
|
|
4
|
+
composite_screen.py <photo.png> <art.png> <out.png> TLx,TLy TRx,TRy BRx,BRy BLx,BLy [--fit crop|stretch]
|
|
5
|
+
|
|
6
|
+
Corners are the surface's inner corners in photo pixels, clockwise from top left.
|
|
7
|
+
--fit crop (default) center-crops the art to the surface's aspect. The art is lit by
|
|
8
|
+
the surface's own smoothed light falloff, so old text on the surface never shows through.
|
|
9
|
+
"""
|
|
10
|
+
import argparse, math
|
|
11
|
+
import numpy as np
|
|
12
|
+
from PIL import Image, ImageChops, ImageFilter
|
|
13
|
+
|
|
14
|
+
a = argparse.ArgumentParser()
|
|
15
|
+
a.add_argument("photo"); a.add_argument("art"); a.add_argument("out")
|
|
16
|
+
a.add_argument("corners", nargs=4); a.add_argument("--fit", choices=["crop", "stretch"], default="crop")
|
|
17
|
+
o = a.parse_args()
|
|
18
|
+
|
|
19
|
+
bg = Image.open(o.photo).convert("RGB"); art = Image.open(o.art).convert("RGB")
|
|
20
|
+
dst = [tuple(map(float, c.split(","))) for c in o.corners]
|
|
21
|
+
if o.fit == "crop": # aspect from the average edge lengths of the quad
|
|
22
|
+
d = lambda p, q: math.dist(p, q)
|
|
23
|
+
ratio = (d(dst[0], dst[1]) + d(dst[3], dst[2])) / (d(dst[0], dst[3]) + d(dst[1], dst[2]))
|
|
24
|
+
w, h = art.size
|
|
25
|
+
if w / h > ratio: nw = int(h * ratio); art = art.crop(((w - nw) // 2, 0, (w + nw) // 2, h))
|
|
26
|
+
else: nh = int(w / ratio); art = art.crop((0, (h - nh) // 2, w, (h + nh) // 2))
|
|
27
|
+
src = [(0, 0), (art.width, 0), (art.width, art.height), (0, art.height)]
|
|
28
|
+
A, B = [], []
|
|
29
|
+
for (x, y), (u, v) in zip(dst, src): # PIL maps output -> input
|
|
30
|
+
A += [[x, y, 1, 0, 0, 0, -u * x, -u * y], [0, 0, 0, x, y, 1, -v * x, -v * y]]; B += [u, v]
|
|
31
|
+
k = tuple(np.linalg.solve(np.array(A, float), np.array(B, float)))
|
|
32
|
+
warped = art.transform(bg.size, Image.PERSPECTIVE, k, Image.BICUBIC)
|
|
33
|
+
mask = Image.new("L", art.size, 255).transform(bg.size, Image.PERSPECTIVE, k, Image.BICUBIC).filter(ImageFilter.GaussianBlur(1))
|
|
34
|
+
# max filter removes dark text from the light map, blur keeps only the falloff
|
|
35
|
+
lum = bg.convert("L").filter(ImageFilter.MaxFilter(31)).filter(ImageFilter.GaussianBlur(40)).point(lambda p: min(255, int(p * 255 / 225)))
|
|
36
|
+
Image.composite(ImageChops.multiply(warped, Image.merge("RGB", [lum] * 3)), bg, mask).save(o.out)
|
|
37
|
+
print(o.out)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Grid every image in a folder onto a near-black sheet with tracked labels.
|
|
3
|
+
|
|
4
|
+
contact_sheet.py <dir> <out.png> [--cols 5] [--cell 640]
|
|
5
|
+
|
|
6
|
+
Files sort by name, so prefix shots with 01-, 02-, ... Labels come from the file name.
|
|
7
|
+
"""
|
|
8
|
+
import argparse, glob, os
|
|
9
|
+
from PIL import Image, ImageDraw, ImageFont
|
|
10
|
+
|
|
11
|
+
a = argparse.ArgumentParser()
|
|
12
|
+
a.add_argument("dir"); a.add_argument("out")
|
|
13
|
+
a.add_argument("--cols", type=int, default=5); a.add_argument("--cell", type=int, default=640)
|
|
14
|
+
o = a.parse_args()
|
|
15
|
+
fs = sorted(f for f in glob.glob(os.path.join(o.dir, "*")) if f.lower().endswith((".png", ".jpg", ".jpeg", ".webp"))
|
|
16
|
+
and os.path.abspath(f) != os.path.abspath(o.out))
|
|
17
|
+
if not fs: raise SystemExit("no images")
|
|
18
|
+
cols, cell, g, lab = o.cols, o.cell, 32, 40
|
|
19
|
+
rows = -(-len(fs) // cols)
|
|
20
|
+
sheet = Image.new("RGB", (cols * cell + (cols + 1) * g, rows * (cell + lab) + (rows + 1) * g), (14, 14, 14))
|
|
21
|
+
d = ImageDraw.Draw(sheet)
|
|
22
|
+
try: font = ImageFont.truetype("/System/Library/Fonts/Supplemental/Arial.ttf", 20)
|
|
23
|
+
except OSError: font = ImageFont.load_default()
|
|
24
|
+
for i, f in enumerate(fs):
|
|
25
|
+
im = Image.open(f).convert("RGB"); im.thumbnail((cell, cell), Image.LANCZOS)
|
|
26
|
+
x0 = g + (i % cols) * (cell + g); y0 = g + (i // cols) * (cell + lab + g)
|
|
27
|
+
sheet.paste(im, (x0 + (cell - im.width) // 2, y0 + (cell - im.height) // 2))
|
|
28
|
+
name = os.path.splitext(os.path.basename(f))[0].upper().replace("-", " · ")
|
|
29
|
+
d.text((x0, y0 + cell + 10), " ".join(name), fill=(150, 150, 150), font=font)
|
|
30
|
+
sheet.save(o.out)
|
|
31
|
+
print(o.out, len(fs))
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Rasterize brand SVGs into padded reference PNGs for image models.
|
|
3
|
+
// usage: node make_refs.mjs <out-dir> <file.svg>[:bg] ... (bg = hex like #FFFFFF, omit for transparent)
|
|
4
|
+
// Each SVG is wrapped with 12% padding and rendered ~3000px wide by macOS `sips`.
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { execFileSync } from "node:child_process";
|
|
8
|
+
const [out, ...items] = process.argv.slice(2);
|
|
9
|
+
if (!out || !items.length) { console.error("usage: make_refs.mjs <out-dir> <file.svg>[:#bg] ..."); process.exit(1); }
|
|
10
|
+
fs.mkdirSync(out, { recursive: true });
|
|
11
|
+
for (const item of items) {
|
|
12
|
+
const [file, bg] = item.split(/:(?=#)/);
|
|
13
|
+
const svg = fs.readFileSync(file, "utf8");
|
|
14
|
+
const vb = (svg.match(/viewBox="([^"]+)"/) || [])[1];
|
|
15
|
+
if (!vb) { console.error(`no viewBox in ${file}`); process.exit(1); }
|
|
16
|
+
const [x, y, w, h] = vb.trim().split(/[\s,]+/).map(Number);
|
|
17
|
+
const p = Math.max(w, h) * 0.12, W = w + 2 * p, H = h + 2 * p, S = 3000 / W;
|
|
18
|
+
const inner = svg.replace(/^[\s\S]*?<svg[^>]*>/, "").replace(/<\/svg>\s*$/, "");
|
|
19
|
+
const rect = bg ? `<rect x="${x - p}" y="${y - p}" width="${W}" height="${H}" fill="${bg}"/>` : "";
|
|
20
|
+
const wrapped = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="${x - p} ${y - p} ${W} ${H}" width="${Math.round(W * S)}" height="${Math.round(H * S)}">${rect}${inner}</svg>`;
|
|
21
|
+
const base = path.join(out, path.basename(file, ".svg") + (bg ? `-on-${bg.slice(1).toLowerCase()}` : ""));
|
|
22
|
+
fs.writeFileSync(base + ".svg", wrapped);
|
|
23
|
+
execFileSync("sips", ["-s", "format", "png", base + ".svg", "--out", base + ".png"], { stdio: "ignore" });
|
|
24
|
+
console.log(base + ".png");
|
|
25
|
+
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Changelog — luckiest-design-website
|
|
2
2
|
|
|
3
|
+
## 1.1.0 — 2026-10-05
|
|
4
|
+
- Step 3 adds "Real, not generated": apply `luckiest-video-studio-art-director`
|
|
5
|
+
section 3b and its shot prompting reference to every generated still and clip.
|
|
6
|
+
|
|
3
7
|
## 1.0.1 — 2026-10-03
|
|
4
8
|
- Points at `luckiest-video-studio-composition` (when installed) for focal point, grid, white space, and safe areas.
|
|
5
9
|
|
|
@@ -4,7 +4,7 @@ description: "Builds a premium, scroll-driven landing page for any business and
|
|
|
4
4
|
license: See ATTRIBUTION.md
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep, AskUserQuestion
|
|
6
6
|
metadata:
|
|
7
|
-
version: "1.0
|
|
7
|
+
version: "1.1.0"
|
|
8
8
|
listing_id: luckiest-design-website
|
|
9
9
|
author: luckiest
|
|
10
10
|
---
|
|
@@ -23,13 +23,13 @@ screenshots proving it holds at every scroll position.
|
|
|
23
23
|
## Staying current
|
|
24
24
|
|
|
25
25
|
On activation, call the Luckiest MCP `check_updates` tool with
|
|
26
|
-
`{ listingId: "c17e533c-42eb-48f2-a0ed-6ef717051512", installedSemver: "1.
|
|
26
|
+
`{ listingId: "c17e533c-42eb-48f2-a0ed-6ef717051512", installedSemver: "1.1.0" }`. If it
|
|
27
27
|
returns `upToDate: false`, surface the `notice` to the user once, then continue.
|
|
28
28
|
Do nothing further if `upToDate: true`. Never block on this check; if the tool
|
|
29
29
|
is unavailable, proceed.
|
|
30
30
|
|
|
31
31
|
When the skill's work is done, call the Luckiest MCP `report_usage` tool once
|
|
32
|
-
with `{ listing_id: "luckiest-design-website", skill_version: "1.0
|
|
32
|
+
with `{ listing_id: "luckiest-design-website", skill_version: "1.1.0", matched: true, success: <true if the skill completed, false otherwise> }`.
|
|
33
33
|
Metadata only, never prompt text. Never block on it; if the tool is
|
|
34
34
|
unavailable, skip silently.
|
|
35
35
|
|
|
@@ -180,12 +180,18 @@ Route by the spend cap from question 9:
|
|
|
180
180
|
| Small | Stills from `luckiest-image` or kie.ai, at most two clips. |
|
|
181
181
|
| Real budget | kie.ai stills and camera moves via `scripts/kie.mjs`, or `luckiest-video` for a model the user already pays for. |
|
|
182
182
|
|
|
183
|
-
Whatever generates them,
|
|
183
|
+
Whatever generates them, four things decide premium versus generated:
|
|
184
184
|
|
|
185
185
|
- **One style preamble, reused verbatim in every prompt.** Six images become
|
|
186
186
|
one shoot. Write it once, never paraphrase.
|
|
187
187
|
- **Look at every asset before using it.** Rerolling is cheaper than shipping a
|
|
188
188
|
bad frame.
|
|
189
|
+
- **Real, not generated.** Before writing the style preamble, apply
|
|
190
|
+
`luckiest-video-studio-art-director` section 3b (directional light, film texture,
|
|
191
|
+
off-center framing, a specific place, no "perfect" or "8k") and write each
|
|
192
|
+
scene with its `references/shot-prompting.md`. Skip its motion, timing, and
|
|
193
|
+
`art-direction.json` sections. If it is not installed, say so in one line and
|
|
194
|
+
follow references/assets.md.
|
|
189
195
|
- **Encode for scrubbing, not playback.** `scripts/encode.sh` sets a dense GOP;
|
|
190
196
|
a normal web encode scrubs like mud. Cut phone clips portrait.
|
|
191
197
|
|
|
@@ -344,6 +350,7 @@ test on the peak or the close via `luckiest-ab-testing`.
|
|
|
344
350
|
|---|---|---|
|
|
345
351
|
| 0 | `luckiest-extract-design-system` | Tokens from an existing site when there is no brand kit |
|
|
346
352
|
| 3 | `luckiest-image`, `luckiest-video` | Asset generation on models the user already has, instead of kie.ai |
|
|
353
|
+
| 3 | `luckiest-video-studio-art-director` | Section 3b and shot prompting so hero stills and clips do not look generated, if installed |
|
|
347
354
|
| 3 | `luckiest-video-studio-composition` | Focal point, grid, and white space for hero stills and clips, if installed |
|
|
348
355
|
| 4 | `luckiest-copywriting`, `luckiest-copywriting-humanize` | Act headlines, belief sentence, CTA label, de-slop pass |
|
|
349
356
|
| 4 | `luckiest-schema` | JSON-LD and head metadata |
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Changelog — luckiest-image
|
|
2
2
|
|
|
3
|
+
## 1.2.0 — 2026-10-05
|
|
4
|
+
- Uses `luckiest-video-studio-art-director` section 3b and its shot prompting
|
|
5
|
+
reference before any prompt, so images do not look AI-made. Prompt example
|
|
6
|
+
drops "4K" and gets a named light direction and film grain.
|
|
7
|
+
|
|
3
8
|
## 1.1.1 — 2026-10-03
|
|
4
9
|
- Points at `luckiest-video-studio-composition` (when installed) for focal point, grid, white space, and safe areas.
|
|
5
10
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-image
|
|
|
3
3
|
description: "When the user wants to create, generate, edit, or optimize images for marketing — blog heroes, social graphics, product mockups, profile banners, listing visuals, or brand assets. Also use when the user mentions 'AI image generation,' 'generate an image,' 'create a graphic,' 'product mockup,' 'hero image,' 'social media graphic,' 'banner image,' 'cover photo,' 'profile banner,' 'listing screenshot,' 'Flux,' 'Flux Kontext,' 'Midjourney,' 'DALL-E,' 'GPT Image,' 'ChatGPT Images,' 'Ideogram,' 'Gemini image,' 'Nano Banana,' 'Recraft,' 'Stable Diffusion,' 'Canva,' 'Figma,' 'image optimization,' 'compress images,' 'WebP,' or 'OG image.' Use this for general-purpose marketing image creation and optimization. For paid ad image creative and platform-specific ad specs, see luckiest-ad-creative. For video production, see luckiest-video."
|
|
4
4
|
license: See ATTRIBUTION.md
|
|
5
5
|
metadata:
|
|
6
|
-
version: "1.
|
|
6
|
+
version: "1.2.0"
|
|
7
7
|
listing_id: luckiest-image
|
|
8
8
|
author: luckiest
|
|
9
9
|
---
|
|
@@ -14,9 +14,9 @@ An expert visual content producer that helps create marketing images using AI ge
|
|
|
14
14
|
|
|
15
15
|
## Staying current
|
|
16
16
|
|
|
17
|
-
On activation, call the Luckiest MCP check_updates tool with { listingId: "bab8f465-a6db-49db-9623-87a62e2c6893", installedSemver: "1.
|
|
17
|
+
On activation, call the Luckiest MCP check_updates tool with { listingId: "bab8f465-a6db-49db-9623-87a62e2c6893", installedSemver: "1.2.0" }. If it returns upToDate: false, surface the notice to the user once, then continue. Do nothing further if upToDate: true. Never block on this check — if the tool is unavailable, proceed.
|
|
18
18
|
|
|
19
|
-
When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-image", skill_version: "1.
|
|
19
|
+
When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-image", skill_version: "1.2.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
|
|
20
20
|
|
|
21
21
|
## Before Starting
|
|
22
22
|
|
|
@@ -107,8 +107,8 @@ A strong image prompt follows: **Subject + Setting + Style + Lighting + Composit
|
|
|
107
107
|
|
|
108
108
|
```
|
|
109
109
|
A laptop on a minimal white desk showing a dashboard UI,
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
late afternoon window light from the left casting hard shadows,
|
|
111
|
+
35mm at f/2, shallow depth of field, fine film grain, 16:9 aspect ratio
|
|
112
112
|
```
|
|
113
113
|
|
|
114
114
|
**Common mistakes:**
|
|
@@ -117,6 +117,15 @@ clean commercial photography style, 16:9 aspect ratio, 4K
|
|
|
117
117
|
- Requesting complex text — use overlays instead for anything beyond short headlines
|
|
118
118
|
- No style direction — "photorealistic," "flat illustration," "3D render"
|
|
119
119
|
|
|
120
|
+
**Sub-skills:**
|
|
121
|
+
|
|
122
|
+
| Step | Sub-skill | Owns |
|
|
123
|
+
|---|---|---|
|
|
124
|
+
| Before writing any prompt | `luckiest-video-studio-art-director` | Section 3b (Real, not generated): light, film and texture, framing, place, banned words, model settings. Write each prompt with its `references/shot-prompting.md`. Use section 0 for brand colors and faces when the image carries the brand. Skip its motion, timing, and `art-direction.json` sections |
|
|
125
|
+
| Composition | `luckiest-video-studio-composition` | Focal point, grid, white space, safe areas |
|
|
126
|
+
|
|
127
|
+
If a sub-skill is not installed, say so in one line and use the prompting basics above. The "AI Content Provenance & Disclosure" rules below still apply to every generated image.
|
|
128
|
+
|
|
120
129
|
**Composition:** if `luckiest-video-studio-composition` is installed, read it to place the focal point, pick the grid, and keep white space and platform safe areas before writing the Composition part of the prompt or cropping to size.
|
|
121
130
|
|
|
122
131
|
For detailed prompting guides per model, see [references/ai-image-prompting.md](references/ai-image-prompting.md).
|
|
@@ -82,6 +82,8 @@ Include non-coding work too. Marketing, content, design, research, and ops tasks
|
|
|
82
82
|
|
|
83
83
|
Route all draft tasks in ONE `skill_router` call from the luckiest MCP server: pass `prompts` as an array of every task title. It returns `results`, one entry per task with `skills` (matching owned skills) and `who` (up to 3 tribe members who finished a similar task before). Attach the suggested skill(s) to each task, and attach `who` so the plan can carry who has done this kind of work. If the server rejects `prompts` (older server), fall back to one `skill_router` call per task, issued in parallel in a single message, never one at a time.
|
|
84
84
|
|
|
85
|
+
For any task that makes a video, reel, demo, explainer, or video ad, add a task before it routed to **luckiest-video-studio-director** (intent, angle, hook, shot list) and **luckiest-video-studio-art-director** (look and motion language), when those skills are installed and `skill_router` did not already suggest them. Make the video task build on it.
|
|
86
|
+
|
|
85
87
|
Then tag each task with a model tier. If the `luckiest-model-router` skill is installed, route every task in one batch call: `python3 <luckiest-model-router dir>/scripts/route.py --model --batch` with a JSON array of `{ title, skill, depends_on }` on stdin. `skill` is the task's first suggested skill, and `depends_on` lists the indexes of earlier tasks it builds on. Add `--prefer cheap` when the user asked to keep costs down, or `--prefer quality` when they asked for the best result. Keep each task's returned `model` and `reason`. If the skill is not installed or the script fails, skip tagging and let the server pick the model. Show the tier next to the task's skill as **Haiku**, **Sonnet** or **Opus**, with the task type, for example "**Copywriting** · **Sonnet** (implement)".
|
|
86
88
|
|
|
87
89
|
For each task, write a one-line "done means..." in chat (not in the title). Give every coding task a check it can run: one of the commands found in Step 4, narrowed to that task when possible (for example `npm test -- billing`). Give non-coding tasks a plain check the user can look at (for example "the FAQ section shows on /pricing with 5 questions"). When `who` is not empty, add a short line naming those people, for example "Done before by: **Sam**, **Alex**."
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# Changelog — luckiest-social
|
|
2
2
|
|
|
3
|
+
## 1.2.0 — 2026-10-05
|
|
4
|
+
- Generated post images, thumbnails, and clips apply `luckiest-video-studio-art-director` section 3b and its shot prompting reference. Bundle ships the art director.
|
|
5
|
+
|
|
3
6
|
## 1.1.1 — 2026-10-03
|
|
4
7
|
- Points at `luckiest-video-studio-composition` (when installed) for focal point, grid, white space, and safe areas.
|
|
5
8
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-social
|
|
|
3
3
|
description: "When the user wants help creating, scheduling, or optimizing social media content for LinkedIn, Twitter/X, Instagram, TikTok, Facebook, or other platforms, or wants to do social listening and engagement triage. Also use when the user mentions 'LinkedIn post,' 'Twitter thread,' 'social media,' 'content calendar,' 'social scheduling,' 'engagement,' 'viral content,' 'what should I post,' 'repurpose this content,' 'tweet ideas,' 'LinkedIn carousel,' 'social media strategy,' 'grow my following,' 'TikTok video,' 'Reels,' 'Shorts,' 'video script,' 'video hook,' 'short-form video,' 'create a reel,' 'social listening,' 'brand mentions,' 'competitor monitoring,' 'top posts to comment on,' or 'find people asking for.' Use this for social media content creation, repurposing, scheduling, short-form video scripting, and social listening. For broader content strategy, see luckiest-content-strategy. For paid ads, see luckiest-ad-creative. For earned media, see luckiest-public-relations."
|
|
4
4
|
license: See ATTRIBUTION.md
|
|
5
5
|
metadata:
|
|
6
|
-
version: "1.
|
|
6
|
+
version: "1.2.0"
|
|
7
7
|
listing_id: luckiest-social
|
|
8
8
|
author: luckiest
|
|
9
9
|
---
|
|
@@ -14,9 +14,9 @@ An expert social media strategist skill. The goal is to help create engaging con
|
|
|
14
14
|
|
|
15
15
|
## Staying current
|
|
16
16
|
|
|
17
|
-
On activation, call the Luckiest MCP check_updates tool with { listingId: "e1b9c06a-7c04-4127-977c-9eb15cbac02f", installedSemver: "1.
|
|
17
|
+
On activation, call the Luckiest MCP check_updates tool with { listingId: "e1b9c06a-7c04-4127-977c-9eb15cbac02f", installedSemver: "1.2.0" }. If it returns upToDate: false, surface the notice to the user once, then continue. Do nothing further if upToDate: true. Never block on this check — if the tool is unavailable, proceed.
|
|
18
18
|
|
|
19
|
-
When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-social", skill_version: "1.
|
|
19
|
+
When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-social", skill_version: "1.2.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
|
|
20
20
|
|
|
21
21
|
## Human-in-the-loop guardrail
|
|
22
22
|
|
|
@@ -63,6 +63,8 @@ Gather this context (ask if not provided):
|
|
|
63
63
|
|
|
64
64
|
**For detailed platform strategies**: See [references/platforms.md](references/platforms.md)
|
|
65
65
|
|
|
66
|
+
**Real, not generated**: for any generated post image, thumbnail, or clip, if `luckiest-video-studio-art-director` is installed, apply its section 3b and write each prompt with its `references/shot-prompting.md`. Skip its motion and `art-direction.json` sections. If it is not installed, say so in one line and continue.
|
|
67
|
+
|
|
66
68
|
**For post images, thumbnails, and video frames**: if `luckiest-video-studio-composition` is installed, read it to place the focal point, pick the grid, and keep white space and platform safe areas for 9:16, 1:1, and 4:5.
|
|
67
69
|
|
|
68
70
|
**For hashtag limits and character counts**: See [references/platform-limits.md](references/platform-limits.md)
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog — luckiest-video
|
|
2
2
|
|
|
3
|
+
## 1.3.0 — 2026-10-05
|
|
4
|
+
- Every generated shot applies `luckiest-video-studio-art-director` section 3b and its shot prompting reference. Bundle ships the art director.
|
|
5
|
+
|
|
6
|
+
## 1.2.0 — 2026-10-05
|
|
7
|
+
- Runs the director and art director before multi-shot prompts when installed.
|
|
8
|
+
|
|
3
9
|
## 1.1.1 — 2026-10-03
|
|
4
10
|
- Points at `luckiest-video-studio-composition` (when installed) for focal point, grid, white space, and safe areas.
|
|
5
11
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-video
|
|
|
3
3
|
description: "When the user wants to create, generate, or produce video content using AI tools or programmatic frameworks. Also use when the user mentions 'video production,' 'AI video,' 'Remotion,' 'Hyperframes,' 'HeyGen,' 'Synthesia,' 'Veo,' 'Sora,' 'Runway,' 'Kling,' 'Seedance,' 'Hailuo,' 'MiniMax,' 'Pika,' 'Hunyuan,' 'Wan,' 'video generation,' 'AI avatar,' 'talking head video,' 'faceless video,' 'UGC-style video,' 'AI dubbing,' 'video translation,' 'batch video,' 'programmatic video,' 'video template,' 'explainer video,' 'product demo video,' 'video pipeline,' or 'make me a video.' Use this for video creation, generation, and production workflows. For video content strategy and what to post, see luckiest-social. For paid video ad creative, see luckiest-ad-creative."
|
|
4
4
|
license: See ATTRIBUTION.md
|
|
5
5
|
metadata:
|
|
6
|
-
version: "1.
|
|
6
|
+
version: "1.3.0"
|
|
7
7
|
listing_id: luckiest-video
|
|
8
8
|
author: luckiest
|
|
9
9
|
---
|
|
@@ -14,9 +14,9 @@ An expert video producer that helps create marketing videos using AI generation
|
|
|
14
14
|
|
|
15
15
|
## Staying current
|
|
16
16
|
|
|
17
|
-
On activation, call the Luckiest MCP check_updates tool with { listingId: "2991a487-dd00-4f65-a9cd-b51fc34fedd1", installedSemver: "1.
|
|
17
|
+
On activation, call the Luckiest MCP check_updates tool with { listingId: "2991a487-dd00-4f65-a9cd-b51fc34fedd1", installedSemver: "1.3.0" }. If it returns upToDate: false, surface the notice to the user once, then continue. Do nothing further if upToDate: true. Never block on this check — if the tool is unavailable, proceed.
|
|
18
18
|
|
|
19
|
-
When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-video", skill_version: "1.
|
|
19
|
+
When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-video", skill_version: "1.3.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
|
|
20
20
|
|
|
21
21
|
## Before Starting
|
|
22
22
|
|
|
@@ -173,6 +173,10 @@ cinematic color grading, 4K
|
|
|
173
173
|
- Forgetting style — "cinematic," "documentary," "commercial"
|
|
174
174
|
- Requesting text in video — AI models struggle with readable text
|
|
175
175
|
|
|
176
|
+
**Direction:** for a multi-shot video or ad, if `luckiest-video-studio-director` is installed, run its steps 1 to 4 (intent, scored angle, hook, shot list) before writing prompts, and if `luckiest-video-studio-art-director` is installed, lock the palette, texture, and motion personality so every shot matches.
|
|
177
|
+
|
|
178
|
+
**Real, not generated:** if `luckiest-video-studio-art-director` is installed, apply its section 3b to every generated shot (one named light direction, film texture, off-center candid framing, a specific place, no "perfect" or "8k") and write each prompt with its `references/shot-prompting.md`. If it is not installed, say so in one line and continue.
|
|
179
|
+
|
|
176
180
|
**Composition:** if `luckiest-video-studio-composition` is installed, read it to place the focal point, pick the grid, and keep white space and platform safe areas for each shot's framing before you write the camera part of the prompt.
|
|
177
181
|
|
|
178
182
|
**For detailed prompting guides**: load [references/ai-video-prompting.md](references/ai-video-prompting.md) when writing or refining a generation prompt, choosing camera vocabulary, or troubleshooting weak results.
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog — luckiest-video-studio
|
|
2
2
|
|
|
3
|
+
## 1.8.1 — 2026-10-05
|
|
4
|
+
- Bundle ships art director 1.4.0 (section 3b Real, not generated, and shot prompting).
|
|
5
|
+
|
|
6
|
+
## 1.8.0 — 2026-10-05
|
|
7
|
+
- Step 2 hands off to `luckiest-video-studio-director` (intent, hook, shot list)
|
|
8
|
+
and `luckiest-video-studio-art-director` (`art-direction.json`) before planning.
|
|
9
|
+
- Step 4 adds the art-direction review and the director's score loop (all 8+).
|
|
10
|
+
|
|
3
11
|
## 1.7.2 (2026-10-05)
|
|
4
12
|
From a real luckiest.co launch video run end to end (storyboard approvals, render, QA gates, Concat export matching the render at 58 dB PSNR):
|
|
5
13
|
- Step 2b: capture live site pages with headless Chrome (wait budget, crop out cookie banners); the style frame is now a `hyperframes snapshot` still, no video render.
|
|
@@ -4,7 +4,7 @@ description: "Make product launch videos, product demos with motion design betwe
|
|
|
4
4
|
license: See ATTRIBUTION.md
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep, AskUserQuestion
|
|
6
6
|
metadata:
|
|
7
|
-
version: "1.
|
|
7
|
+
version: "1.8.1"
|
|
8
8
|
listing_id: luckiest-video-studio
|
|
9
9
|
author: luckiest
|
|
10
10
|
---
|
|
@@ -19,13 +19,13 @@ an MP4.
|
|
|
19
19
|
## Staying current
|
|
20
20
|
|
|
21
21
|
On activation, call the Luckiest MCP `check_updates` tool with
|
|
22
|
-
`{ listingId: "aff888e4-9ee9-4f73-af08-74d5d09d3c10", installedSemver: "1.
|
|
22
|
+
`{ listingId: "aff888e4-9ee9-4f73-af08-74d5d09d3c10", installedSemver: "1.8.1" }`. If it returns
|
|
23
23
|
`upToDate: false`, surface the `notice` to the user once, then continue. Do nothing
|
|
24
24
|
further if `upToDate: true`. Never block on this check; if the tool is unavailable,
|
|
25
25
|
proceed.
|
|
26
26
|
|
|
27
27
|
When the skill's work is done, call the Luckiest MCP `report_usage` tool once with
|
|
28
|
-
`{ listing_id: "luckiest-video-studio", skill_version: "1.
|
|
28
|
+
`{ listing_id: "luckiest-video-studio", skill_version: "1.8.1", matched: true, success: <true if the skill completed, false otherwise> }`.
|
|
29
29
|
Metadata only, never prompt text. Never block on it; if the tool is unavailable,
|
|
30
30
|
skip silently.
|
|
31
31
|
|
|
@@ -153,6 +153,11 @@ voiceover) and runs 30 seconds or longer, hand the script to the
|
|
|
153
153
|
line per scene with estimated seconds; copy each into `scenes[].line` and its
|
|
154
154
|
`duration`.
|
|
155
155
|
|
|
156
|
+
Before writing the plan, hand the request to the `luckiest-video-studio-director`
|
|
157
|
+
sub-skill for the creative intent, angle, hook, energy map, and shot list, then to
|
|
158
|
+
`luckiest-video-studio-art-director` for `art-direction.json` (tone cell, palette,
|
|
159
|
+
faces, motion language). Every scene obeys that file.
|
|
160
|
+
|
|
156
161
|
Write `plan.md`, then `storyboard.json` with one entry per scene. Each scene is
|
|
157
162
|
`motion` (built in HyperFrames), `demo` (screen recording or supplied footage), or
|
|
158
163
|
`logo` (a recipe from [references/logo-recipes.md](references/logo-recipes.md)).
|
|
@@ -227,6 +232,12 @@ node <skill-dir>/scripts/qa.mjs motion <output-dir>/composition # ease-in
|
|
|
227
232
|
Then run `luckiest-video-studio-composition --review` on the run. It writes
|
|
228
233
|
`qa/composition-review.md` with a verdict per scene. Fix every scene it blocks.
|
|
229
234
|
|
|
235
|
+
Then run `luckiest-video-studio-art-director --review` on the run. It writes
|
|
236
|
+
`qa/art-direction-review.md`. Fix every scene it blocks.
|
|
237
|
+
|
|
238
|
+
Then run `luckiest-video-studio-director --score` on the clips. Fix the three
|
|
239
|
+
lowest scores and repeat until every score is 8 or higher before the judge.
|
|
240
|
+
|
|
230
241
|
Then run `luckiest-video-studio-motion --review` on the run. It writes
|
|
231
242
|
`qa/motion-review.md` with a verdict per scene. Fix and re-render every scene it
|
|
232
243
|
blocks before the judge.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Attribution
|
|
2
|
+
|
|
3
|
+
`luckiest-video-studio-art-director` is a Luckiest sub-skill of `luckiest-video-studio`.
|
|
4
|
+
|
|
5
|
+
| Source | License | What this sub-skill uses | License file |
|
|
6
|
+
|---|---|---|---|
|
|
7
|
+
| **motion-art-direction** by iart.ai (`iart-ai/motion-design-skills`, https://github.com/iart-ai/motion-design-skills/tree/main/skills/motion-art-direction) | MIT, Copyright (c) 2026 iart.ai | Tone and energy matrix, motion personality table, motion-language spec rows, hero/support/texture hierarchy, restraint rules, consistency checklist | `LICENSE-iart` |
|
|
8
|
+
| **motion-color-and-light** and **kinetic-typography** by Skill Me (`SkillMedev/motion-video-direction`, https://github.com/SkillMedev/motion-video-direction) | MIT, Copyright (c) 2026 Alexander Ouellet | Video-safe color rules (near-black and near-white, accent saturation, anti-banding), reading-time hold formula, type hierarchy ratio, one-property entrances | `LICENSE-skillme` |
|
|
9
|
+
| **"AI finally designs like me"** by The Design Guy (YouTube, 2026-09-27, https://www.youtube.com/watch?v=E3Lgtf4xjeM) | Video, all rights reserved | Ideas only: DESIGN.md as a file of decisions already made, rules as choice plus reason plus example, locked/guided/open freedom levels, mining repeated review corrections for rules, pointing to existing assets instead of describing them, and checking that the agent read the file. No text or footage is copied | n/a |
|
|
10
|
+
| **prompt-images** by Replicate (`replicate/skills`, https://github.com/replicate/skills/tree/main/skills/prompt-images) | Apache-2.0, Copyright 2025 Replicate, Inc. | Adapted into `references/shot-prompting.md`: natural-language shot descriptions, naming subjects, camera, film, lighting and composition vocabulary, quoted text, editing and consistency rules, guidance and negative-prompt pitfalls. Rewritten and reordered, not copied verbatim | `LICENSE-replicate` |
|
|
11
|
+
| **"How to make AI images look less like AI"** by Pixova (https://www.pixova.io/blog/how-to-make-ai-images-look-less-like-ai) | Article, all rights reserved | Ideas only, in section 3b: directional light with hard shadows, film stock and grain, skin texture, off-center candid framing, specific environments, banned prompt words, lower CFG. No text is copied | n/a |
|
|
12
|
+
|
|
13
|
+
## Changes in this edition
|
|
14
|
+
|
|
15
|
+
- 1.4.0: section 3b "Real, not generated", `references/shot-prompting.md`, and the "Looks generated" check.
|
|
16
|
+
|
|
17
|
+
- 1.3.0: rule format, freedom levels, corrections loop, and the "repeats a logged correction" review column.
|
|
18
|
+
|
|
19
|
+
- 1.1.0: added video-safe color and type-in-motion rules, and two review columns.
|
|
20
|
+
|
|
21
|
+
- Added the look lock (palette, accent budget, two faces, texture, banned defaults).
|
|
22
|
+
- Added `art-direction.json` as a file the studio and other sub-skills read.
|
|
23
|
+
- Mapped studio tone presets to tone cells.
|
|
24
|
+
- Added style-frame approval at studio Step 2b and `--review` with Approve or Block.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Changelog — luckiest-video-studio-art-director
|
|
2
|
+
|
|
3
|
+
## 1.4.0 — 2026-10-05
|
|
4
|
+
- Section 3b "Real, not generated": named light direction with hard shadows,
|
|
5
|
+
film stock and grain, skin texture, off-center candid framing, specific
|
|
6
|
+
places, banned prompt words, guidance near 3.5 to 4, real assets first.
|
|
7
|
+
Never hides provenance.
|
|
8
|
+
- `references/shot-prompting.md`, adapted from Replicate `prompt-images`
|
|
9
|
+
(Apache-2.0): shot written as sentences, vocabulary, quoted text, edits,
|
|
10
|
+
consistency, model settings, before and after.
|
|
11
|
+
- "Looks generated" in style-frame approval, the review table (Block), and
|
|
12
|
+
anti-patterns.
|
|
13
|
+
- Now a sub-skill of luckiest-image, luckiest-brandkit, and
|
|
14
|
+
luckiest-design-website.
|
|
15
|
+
|
|
16
|
+
## 1.3.0 — 2026-10-05
|
|
17
|
+
- Section 0: point to existing files instead of describing them; read
|
|
18
|
+
`.luckiest/corrections.md` first.
|
|
19
|
+
- Section 0b: every rule is choice, reason, example path, with a freedom level
|
|
20
|
+
(locked, guided, open). The concept is never locked. No "in the style of" names.
|
|
21
|
+
- `art-direction.json` adds `freedom`.
|
|
22
|
+
- Section 9: log every correction, diagnose repeats (missing, unclear,
|
|
23
|
+
unreachable example, wrong rule), and offer to add the fixed rules to
|
|
24
|
+
`DESIGN.md` with one yes. Review blocks a scene that repeats a logged correction.
|
|
25
|
+
|
|
26
|
+
## 1.2.0 — 2026-10-05
|
|
27
|
+
- Section 0: find the project's design system first (DESIGN.md, tokens, CSS
|
|
28
|
+
variables, Tailwind theme, shadcn/ui, fonts, motion constants). It wins over
|
|
29
|
+
every default; video-only changes are logged under `designSystem.overrides`.
|
|
30
|
+
- Review adds a "Matches design system" column.
|
|
31
|
+
|
|
32
|
+
## 1.1.0 — 2026-10-05
|
|
33
|
+
- Video-safe color rules and type-in-motion hold formula, from Skill Me (MIT).
|
|
34
|
+
- Review adds Color safe and Type holds columns.
|
|
35
|
+
|
|
36
|
+
## 1.0.0 — 2026-10-05
|
|
37
|
+
- New sub-skill of luckiest-video-studio, based on iart.ai `motion-art-direction` (MIT).
|
|
38
|
+
- Writes `art-direction.json`: tone cell, motion personality, palette, faces,
|
|
39
|
+
texture, easing pair, base unit, transition family, stagger, intensity, wow scene.
|
|
40
|
+
- Style-frame check before the user sees it. `--review` writes
|
|
41
|
+
`qa/art-direction-review.md` with Approve or Block per scene.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 iart.ai
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|