diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 0eee445..563e307 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -9,7 +9,7 @@ "name": "superloopy", "source": "./", "description": "Strict evidence loop harness: repo-local loop state, success criteria, append-only ledgers, evidence-gated completion, plus skills (loop, research, frontend, clone) and a read-only/worker crew. Works on Claude Code and Codex from one repo.", - "version": "0.11.1", + "version": "0.12.0", "license": "MIT", "keywords": [ "claude-code", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index b515fee..01a89f9 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "superloopy", - "version": "0.11.1", + "version": "0.12.0", "description": "Lightweight loop harness with strict evidence gates — Claude Code edition.", "homepage": "https://github.com/beefiker/superloopy#readme", "repository": "https://github.com/beefiker/superloopy", diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 17e1ee2..4f41fc7 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "superloopy", - "version": "0.11.1", + "version": "0.12.0", "description": "Lightweight loop harness with strict evidence gates.", "homepage": "https://github.com/beefiker/superloopy#readme", "repository": "https://github.com/beefiker/superloopy", diff --git a/docs/superloopy-design-audit.md b/docs/superloopy-design-audit.md index fc10967..98338eb 100644 --- a/docs/superloopy-design-audit.md +++ b/docs/superloopy-design-audit.md @@ -16,7 +16,7 @@ This doctor-verified audit records Superloopy's own design decisions. It exists | `frontend-quality-overlays` | StyleGallery is unrelated to the user-reported UX fixes already owned by the shared frontend base, but its architecture research exposed independent quality gaps in spatial ownership, temporal review, visual-reference authority, high-impact rationale, and bounded debt. | Superloopy adds a StyleGallery-informed but independently authored quality overlay: target routing remains unchanged; `layout.md`, `motion-core.md`, and visual-reference discipline activate only from changed claims; rationale, task-based usability evidence, and accepted debt scale by consequence; Web implementation guidance remains a specialization; and campaign heuristics cannot become unsupported universal blockers. Spatial disclosure uses target-derived exposure modes with generic source/summary and disclosed/destination state proof; collapsed/expanded proof applies only when that mechanism is selected. The overlay rejects fixed Web breakpoint matrices, CSS pattern catalogs, mandatory image generation, and universal motion values as cross-platform defaults. It does not add motion or haptic artifact kinds because file existence is not proof of temporal behavior or physical output; a future performance claim should wait for a machine-validated structured report tied to raw-trace hash, target, build, metric, and threshold. The reviewed StyleGallery revision is pinned only as research provenance because no root license was identified, so no code, prose, schema, pattern, generated file, or dependency is copied. | `skills/superloopy-frontend/SKILL.md`, `skills/superloopy-frontend/references/layout.md`, `skills/superloopy-frontend/references/motion-core.md`, `skills/superloopy-frontend/references/motion.md`, `skills/superloopy-frontend/references/image-first.md`, `skills/superloopy-frontend/references/anti-slop.md`, `skills/superloopy-frontend/references/ux.md`, `skills/superloopy-frontend/references/upstream-notice.md`, `test/frontend-quality-overlays.test.js`, and the file-audit/golden-set inventories. | | `frontend-context-routing` | Existing Web guidance had no bounded lane for verified platform design-system contracts, implementation-level scroll motion, or redesigns that must preserve a living product. | The Web route classifies product/application DOM, marketing/editorial, PWA/extension, custom-rendered, and embedded-client delivery before loading optional references or selecting evidence. SEO is conditional on the current Web target being public and crawlable; native or embedded work scores only a distinct public Web deployment. Design-system and brand references remain subordinate to the repository's authoritative source and express color, type, spacing, component states, and motion in project-native tokens, units, and APIs rather than imposing CSS/hex/4px conventions on every target; image-first and motion routes activate only for affected visual/motion claims and derive proof from the target. System adoption requires an actual contract, current official-doc/package verification, and dependency approval; approved implementation executes one verified package-manager command and validates integration, while advice only presents it. Redesigns mark unavailable facts unverified, preserve IA by default, and change broken IA only when separately in scope and explicitly approved. Selected mechanisms are adapted from Taste Skill under MIT with the full notice packaged locally. | `skills/superloopy-frontend/references/design-system.md`, `skills/superloopy-frontend/references/design/_INDEX.md`, `skills/superloopy-frontend/references/image-first.md`, `skills/superloopy-frontend/references/web.md`, `skills/superloopy-frontend/references/system-map.md`, `skills/superloopy-frontend/references/motion.md`, `skills/superloopy-frontend/references/redesign.md`, `skills/superloopy-frontend/references/upstream-notice.md`, and `test/plugin.test.js`. | | `korean-humanizer-skill` | Korean users need a Codex-native AI-tone-removal workflow with stronger proof than a prompt-only port. | Superloopy ships a local `humanize-korean` skill with packaged references, attribution, deterministic audit metrics, and evidence artifacts. | `skills/humanize-korean/SKILL.md`, `skills/humanize-korean/scripts/audit-humanize-output.mjs`, `test/humanize-korean.test.js`, `test/plugin.test.js`, and the file-audit/golden-set inventories. | -| `slides-skill` | Presentation work needs the same show-don't-tell style discovery and rendered-screenshot proof as other visual lanes, and rebuilding a mature template library from scratch would be weaker than adapting one. | A bundled `superloopy-slides` skill generates zero-dependency single-file HTML decks on a fixed 16:9 stage: three rendered style previews the user picks from, a vendored MIT `frontend-slides` template pack (audited by provenance and exempt from the line cap, like the landing-page orbit bundles), and completion gated on rendered-screenshot visual QA under `.superloopy/evidence/slides/`. | `skills/superloopy-slides/SKILL.md`, `skills/superloopy-slides/LICENSE`, `test/plugin.test.js`, `test/doctor.test.js`, and the file-audit/golden-set inventories. | +| `slides-skill` | Presentation work needs the same show-don't-tell style discovery and rendered-screenshot proof as other visual lanes, and rebuilding a mature template library from scratch would be weaker than adapting one. | A bundled `superloopy-slides` skill generates zero-dependency single-file HTML decks on a fixed 16:9 stage: three rendered style previews the user picks from (a user-named brand may inform one slot via a single frontend StyleGallery teardown as scoped reference input), a vendored MIT `frontend-slides` template pack (audited by provenance and exempt from the line cap, like the landing-page orbit bundles), and completion gated on rendered-screenshot visual QA under `.superloopy/evidence/slides/` — the run root created via the shared portable evidence helper's slides lane, with the frontend anti-slop non-waivable core and motion floor binding every deck. | `skills/superloopy-slides/SKILL.md`, `skills/superloopy-slides/LICENSE`, `test/plugin.test.js`, `test/doctor.test.js`, and the file-audit/golden-set inventories. | | `dual-host-support` | Superloopy's core is host-agnostic and users want it on Claude Code as well as Codex. | A parallel `.claude-plugin/` manifest + marketplace, `hooks/hooks.json`, `agents/*.md`, and a Claude model-policy doc let one repo install on both hosts; a shared `src/receipt.js` recovers the SubagentStop receipt from last_assistant_message or the subagent transcript tail, and `isClaudeHost` makes bootstrap a no-op on Claude — the deterministic floor stays host-agnostic. | `.claude-plugin/plugin.json`, `src/receipt.js`, `src/agents.js`, `test/host-adapter.test.js`, and the file-audit/golden-set inventories. | ## Compatibility Boundary diff --git a/docs/superloopy-file-audit.md b/docs/superloopy-file-audit.md index 6a278a2..6b8d9fd 100644 --- a/docs/superloopy-file-audit.md +++ b/docs/superloopy-file-audit.md @@ -329,14 +329,14 @@ Superloopy is its own lightweight loop harness: one small CLI, repo-local `.supe | `skills/superloopy-frontend/references/qt-quick.md` | Qt Quick/QML contract for one Controls style route, module and geometry/state ownership, accessibility and tooling, target-specific desktop versus mobile transitions, and mixed QQuickWidget boundaries. | Superloopy-native; original prose grounded in linked official [Qt Quick Controls style documentation](https://doc.qt.io/qt-6/qtquickcontrols-styles.html) and related Qt Quick references; no external source files vendored. | | `skills/superloopy-frontend/references/qt-qa.md` | Claim- and risk-scoped Qt command, state, behavioral, optional visual-capture, screenshot-interpretation, and unverified-surface disclosure gate. | Superloopy-native; original prose grounded in linked official [Qt Test documentation](https://doc.qt.io/qt-6/qttest-best-practices.html) and related Qt tooling references; a visual artifact is required only for changed visual or visibly consequential interaction claims, and browser/offscreen proof cannot substitute for native evidence. | | `skills/superloopy-frontend/scripts/ds-compliance.mjs` | Dependency-free partial token lint for undeclared 3/4/6/8-digit hex and off-scale integer, fractional, or negative px values on exact CSS spacing properties, including multiline declarations, while allowing absolute 0/1px and ignoring border-side lookalikes. | Superloopy-native Node-built-in helper with value-line reporting and a Windows-safe CLI entry guard; non-zero violations remain bounded color/spacing proof, not typography, semantics, accessibility, or design-system adoption. | -| `skills/superloopy-frontend/scripts/evidence-root.mjs` | Dependency-free cross-shell helper that creates one portable timestamped frontend evidence root and verifies non-empty regular artifacts confined beneath it. | Superloopy-native Node-built-in helper; rejects invalid or Windows-reserved slugs, duplicate run roots, traversal, symlink ancestors/leaves, empty files, and out-of-root evidence without adding a project dependency. | +| `skills/superloopy-frontend/scripts/evidence-root.mjs` | Dependency-free cross-shell helper that creates one portable timestamped frontend or slides evidence root and verifies non-empty regular artifacts confined beneath it. | Superloopy-native Node-built-in helper; rejects invalid or Windows-reserved slugs, duplicate run roots, traversal, symlink ancestors/leaves, empty files, and out-of-root evidence without adding a project dependency. | | `skills/superloopy-frontend/scripts/visual-diff.mjs` | Dependency-free PNG visual-diff for the frontend visual-QA gate: similarityScore, alpha intactness, and ranked grid hotspots as review evidence. | Superloopy-native; uses only node:zlib/node:fs, no external image library or vendored code. | | `skills/superloopy-loop/SKILL.md` | Skill instructions for Superloopy guide, proof, capture, evidence, check, finish, review, checkpoint, and doctor flow. | Uses Superloopy-native workflow terms. | | `skills/superloopy-loop/agents/openai.yaml` | Minimal agent metadata for Superloopy discovery. | Search terms are Superloopy-native. | | `skills/superloopy-research/SKILL.md` | Explicit-invocation-gated skill instructions for deep research with EXPAND waves, claim verification, cited synthesis, and Superloopy evidence artifacts. | Superloopy-native research workflow; workers return text and parent-owned artifacts remain authoritative. | | `skills/superloopy-research/agents/openai.yaml` | Minimal explicit-only agent metadata for discovering the Superloopy research skill without implicit activation. | Superloopy-native skill metadata only. | | `skills/superloopy-slides/LICENSE` | Upstream MIT license for the adapted frontend-slides skill content. | License text only; records third-party provenance and no executable plugin logic. | -| `skills/superloopy-slides/SKILL.md` | Skill instructions for zero-dependency HTML slide decks: style discovery, fixed 16:9 stage, PPT conversion, PDF export, and a visual-QA evidence gate. | Superloopy-native evidence gate on `.superloopy/evidence/slides/`; adapted from the MIT frontend-slides skill with attribution. | +| `skills/superloopy-slides/SKILL.md` | Skill instructions for zero-dependency HTML slide decks: style discovery with an optional brand-gallery route, fixed 16:9 stage, PPT conversion, PDF export, the frontend anti-slop core, and a visual-QA evidence gate on the shared portable evidence helper. | Superloopy-native evidence gate on `.superloopy/evidence/slides/`; adapted from the MIT frontend-slides skill with attribution. | | `skills/superloopy-slides/STYLE_PRESETS.md` | Twelve curated slide style presets with palettes, fonts, and signature elements. | Design reference content for deck generation only; no executable plugin logic. | | `skills/superloopy-slides/agents/openai.yaml` | Minimal agent metadata for discovering the Superloopy slides skill. | Superloopy-native skill metadata only. | | `skills/superloopy-slides/animation-patterns.md` | CSS/JS animation snippets and effect-to-feeling guide for slide generation. | Design reference content for deck generation only; no executable plugin logic. | diff --git a/docs/superloopy-loop-golden-set.md b/docs/superloopy-loop-golden-set.md index d59c33a..7a5c832 100644 --- a/docs/superloopy-loop-golden-set.md +++ b/docs/superloopy-loop-golden-set.md @@ -349,14 +349,14 @@ Total: 100 points. | `skills/superloopy-frontend/references/qt-quick.md` | Original-prose contract; `test/frontend-qt-contract.test.js` and official [Qt Quick Controls style documentation](https://doc.qt.io/qt-6/qtquickcontrols-styles.html). | Must select one Controls style route before loading QML, keep module/layout/state ownership singular, preserve accessibility, use desktop resize/mixed-DPR checks only where exposed, use mobile window/orientation/posture/inset transitions on mobile/tablet, and disclose QQuickWidget limits. | | `skills/superloopy-frontend/references/qt-qa.md` | Original-prose contract; `test/frontend-qt-contract.test.js` and official [Qt Test documentation](https://doc.qt.io/qt-6/qttest-best-practices.html). | Must classify repository gates, require executable builds and real-target behavioral proof, select states by changed journey/risk, require native capture only for changed visual or visibly consequential interaction claims, retain human screenshot judgment, disclose unverified surfaces, and never accept browser/offscreen proof as native evidence. | | `skills/superloopy-frontend/scripts/ds-compliance.mjs` | `test/ds-compliance.test.js` and `test/plugin.test.js`. | Must remain dependency-free, normalize 3/4/6/8-digit hex, flag undeclared colors and off-scale integer/fractional/negative values only on exact CSS spacing properties including multiline declarations, report the value line, ignore border-side lookalikes, avoid partial px matches, allow absolute 0/1px, invoke correctly on Windows, and exit non-zero on violations without claiming broader design compliance. | -| `skills/superloopy-frontend/scripts/evidence-root.mjs` | `test/frontend-routing-scenarios.test.js`, `test/plugin.test.js`, and package inventory. | Must create one portable `.superloopy/evidence/frontend/YYYYMMDDTHHMMSSZ-` root from an external target project and verify non-empty regular artifacts while rejecting reserved/unsafe slugs, duplicate roots, traversal, symlink paths, empty files, and out-of-root proof without dependencies. | +| `skills/superloopy-frontend/scripts/evidence-root.mjs` | `test/frontend-routing-scenarios.test.js`, `test/plugin.test.js`, and package inventory. | Must create one portable `.superloopy/evidence//YYYYMMDDTHHMMSSZ-` root from an external target project and verify non-empty regular artifacts while rejecting unknown lanes, reserved/unsafe slugs, duplicate roots, traversal, symlink paths, empty files, and out-of-root proof without dependencies. | | `skills/superloopy-frontend/scripts/visual-diff.mjs` | `test/visual-diff.test.js`. | Must decode 8-bit PNGs and emit dimensionsMatch, diffRatio, similarityScore, alphaChannelIntact, and ranked grid hotspots with no dependencies. | | `skills/superloopy-loop/SKILL.md` | `test/docs.test.js`, doctor skill check. | Must describe guide, proof, capture, evidence, check, finish, gates, and receipt rules accurately. | | `skills/superloopy-loop/agents/openai.yaml` | Audit coverage and reviewability check. | Must remain minimal Superloopy discovery metadata. | | `skills/superloopy-research/SKILL.md` | `test/plugin.test.js`, audit coverage. | Must require explicit invocation (`$superloopy:superloopy-research`, `/superloopy:superloopy-research`, or a leading `loopy`/`루피`), reject plain research/investigate/summarize vocabulary as activation, and describe exhaustive deep research with EXPAND waves, claim verification, cited synthesis, and Superloopy evidence receipts. | | `skills/superloopy-research/agents/openai.yaml` | Audit coverage and reviewability check. | Must remain minimal explicit-only Superloopy discovery metadata for deep research. | | `skills/superloopy-slides/LICENSE` | Audit coverage and reviewability check. | Must remain Superloopy-native slides skill support content with no plugin runtime coupling. | -| `skills/superloopy-slides/SKILL.md` | Audit coverage and reviewability check. | Must gate deck completion on a real-browser visual-QA artifact under `.superloopy/evidence/slides/` with a `SUPERLOOPY_EVIDENCE` receipt. | +| `skills/superloopy-slides/SKILL.md` | `test/plugin.test.js`, audit coverage, and reviewability check. | Must gate deck completion on a real-browser visual-QA artifact under `.superloopy/evidence/slides/` (created via the shared portable evidence helper) with a `SUPERLOOPY_EVIDENCE` receipt, bind the frontend anti-slop non-waivable core, and open the brand gallery only for a user-named brand or mood as scoped reference input. | | `skills/superloopy-slides/STYLE_PRESETS.md` | Audit coverage and reviewability check. | Must remain Superloopy-native slides skill support content with no plugin runtime coupling. | | `skills/superloopy-slides/agents/openai.yaml` | Audit coverage and reviewability check. | Must remain Superloopy-native slides skill support content with no plugin runtime coupling. | | `skills/superloopy-slides/animation-patterns.md` | Audit coverage and reviewability check. | Must remain Superloopy-native slides skill support content with no plugin runtime coupling. | diff --git a/package-lock.json b/package-lock.json index 60697c3..6773744 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "superloopy", - "version": "0.11.1", + "version": "0.12.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "superloopy", - "version": "0.11.1", + "version": "0.12.0", "license": "MIT", "bin": { "superloopy": "src/cli.js" diff --git a/package.json b/package.json index d1a5821..7d411ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "superloopy", - "version": "0.11.1", + "version": "0.12.0", "description": "A lightweight loop harness for Codex and Claude Code with strict evidence gates.", "type": "module", "bin": { diff --git a/skills/superloopy-frontend/scripts/evidence-root.mjs b/skills/superloopy-frontend/scripts/evidence-root.mjs index 5612c5a..2193dae 100644 --- a/skills/superloopy-frontend/scripts/evidence-root.mjs +++ b/skills/superloopy-frontend/scripts/evidence-root.mjs @@ -1,6 +1,7 @@ #!/usr/bin/env node -// Create and verify cross-shell frontend evidence roots without relying on a -// platform-specific date command, path separator, or mkdir syntax. +// Create and verify cross-shell skill evidence roots (frontend or slides lane) +// without relying on a platform-specific date command, path separator, or +// mkdir syntax. import { lstatSync, mkdirSync, realpathSync } from "node:fs"; import { isAbsolute, relative, resolve } from "node:path"; @@ -8,7 +9,8 @@ import { fileURLToPath } from "node:url"; const PORTABLE_SLUG = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u; const WINDOWS_RESERVED = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$/iu; -const RUN_ROOT = /^\.superloopy\/evidence\/frontend\/\d{8}T\d{6}Z-([a-z0-9]+(?:-[a-z0-9]+)*)$/u; +const RUN_LANE = /^(?:frontend|slides)$/u; +const RUN_ROOT = /^\.superloopy\/evidence\/(frontend|slides)\/\d{8}T\d{6}Z-([a-z0-9]+(?:-[a-z0-9]+)*)$/u; export function validateSlug(value) { if (typeof value !== "string" || value.length > 48 || !PORTABLE_SLUG.test(value) || WINDOWS_RESERVED.test(value)) { @@ -17,10 +19,18 @@ export function validateSlug(value) { return value; } -export function createEvidenceRoot(slug, cwd = process.cwd(), now = new Date()) { +export function validateLane(value) { + if (typeof value !== "string" || !RUN_LANE.test(value)) { + throw new Error("lane must be frontend or slides"); + } + return value; +} + +export function createEvidenceRoot(slug, lane = "frontend", cwd = process.cwd(), now = new Date()) { const safeSlug = validateSlug(slug); + const safeLane = validateLane(lane); const stamp = now.toISOString().replaceAll("-", "").replaceAll(":", "").replace(/\.\d{3}Z$/u, "Z"); - const root = `.superloopy/evidence/frontend/${stamp}-${safeSlug}`; + const root = `.superloopy/evidence/${safeLane}/${stamp}-${safeSlug}`; const base = realpathSync(cwd); ensureDirectoryTree(base, root.split("/")); return root; @@ -29,8 +39,8 @@ export function createEvidenceRoot(slug, cwd = process.cwd(), now = new Date()) export function verifyEvidenceFiles(root, files, cwd = process.cwd()) { const normalizedRoot = root.replaceAll("\\", "/"); const match = normalizedRoot.match(RUN_ROOT); - if (!match) throw new Error("evidence root must match .superloopy/evidence/frontend/YYYYMMDDTHHMMSSZ-"); - validateSlug(match[1]); + if (!match) throw new Error("evidence root must match .superloopy/evidence//YYYYMMDDTHHMMSSZ-"); + validateSlug(match[2]); if (!Array.isArray(files) || files.length === 0) throw new Error("at least one evidence file is required"); const base = realpathSync(cwd); @@ -87,15 +97,15 @@ function requireNoSymlinkPath(base, relativePath) { function main(argv) { const [command, value, ...files] = argv; - if (command === "create" && value && files.length === 0) { - process.stdout.write(`${createEvidenceRoot(value)}\n`); + if (command === "create" && value && files.length <= 1) { + process.stdout.write(`${createEvidenceRoot(value, files[0] ?? "frontend")}\n`); return; } if (command === "verify" && value) { process.stdout.write(`${verifyEvidenceFiles(value, files)}\n`); return; } - throw new Error("usage: evidence-root.mjs create | verify "); + throw new Error("usage: evidence-root.mjs create [frontend|slides] | verify "); } function isCliEntry(argvPath) { diff --git a/skills/superloopy-slides/SKILL.md b/skills/superloopy-slides/SKILL.md index 00432bf..14dd70c 100644 --- a/skills/superloopy-slides/SKILL.md +++ b/skills/superloopy-slides/SKILL.md @@ -15,7 +15,7 @@ This is a Superloopy skill: the deck is done only when a real-browser visual art Open your reply with `SUPERLOOPY SLIDES ENABLED`. If another active Superloopy mode mandates its own first line, print that first and this marker on the next line. -The anti-slop design rules below are this skill's own instance of the `superloopy-frontend` rule set, specialized for the fixed 1920×1080 slide stage. Do not open a second superloopy-frontend pass on top of a deck — this skill owns the visual layer for presentations, including the evidence gate. +The anti-slop design rules below are this skill's own instance of the `superloopy-frontend` [anti-slop contract](../superloopy-frontend/references/anti-slop.md), specialized for the fixed 1920×1080 slide stage. A presentation is campaign/editorial surface, so that contract's non-waivable core binds every deck: honest assets (no div-mock passed off as a product capture, no unauthorized marks, no invented metrics or testimonials), no shipped placeholder names/brands/filler copy, and a named authority for every kept default or waived check. Do not open a second superloopy-frontend pass on top of a deck — this skill owns the visual layer for presentations, including the evidence gate. ## Core Principles @@ -131,7 +131,7 @@ If user provides an image folder: 1. **Scan** — List all image files (.png, .jpg, .svg, .webp, etc.) 2. **Inspect each image** — Use the agent's available image-understanding capability. If image reading is unavailable, use filenames/metadata and ask the user to clarify only when needed -3. **Evaluate** — For each: what it shows, USABLE or NOT USABLE (with reason), what concept it represents, dominant colors +3. **Evaluate** — For each: what it shows, USABLE or NOT USABLE (with reason), what concept it represents, dominant colors. Classify each asset's authority the way [`image-first.md`](../superloopy-frontend/references/image-first.md) does — authorized capture, approved generated asset, or supplied reference — and never present a rebuilt mock as a real product screenshot or use marks the user is not authorized to show 4. **Co-design the outline** — Curated images inform slide structure alongside text. This is NOT "plan slides then add images" — design around both from the start (e.g., 3 screenshots → 3 feature slides, 1 logo → title/closing slide) 5. **Confirm the outline** using the same structured-question mechanism when available: "Does this slide outline and image selection look right?" Options: Looks good / Adjust images / Adjust outline @@ -155,6 +155,8 @@ If the user explicitly names a preset or bold template, honor that as one option Read [STYLE_PRESETS.md](STYLE_PRESETS.md) for safe preset candidates. If [bold-template-pack/selection-index.json](bold-template-pack/selection-index.json) exists, read that compact index too, but do not read any `design.md` files yet. +**Brand-named direction (StyleGallery):** when the user names a specific brand — directly or as a mood reference ("Stripe 느낌", "Linear처럼", "like Notion") — consult the frontend skill's brand library index at [`design/_INDEX.md`](../superloopy-frontend/references/design/_INDEX.md), pick ONE matching teardown, and derive one preview slot's tokens from it — palette, type scale and weight attitude, radius, and motion tone — translated into 1920×1080 stage proportions. Inherit that library's contract: a teardown is scoped reference input, never automatic token authority; use public brand facts only, never clone a logo or trade dress, and name the teardown file in your message (and later in `VISUAL_QA.md`) as the provenance of that direction. Without a user-named brand or mood, do not open the gallery — the preset/bold-template mix below stays the default. + | Mood | Suggested Presets | | ------------------- | -------------------------------------------------- | | Impressed/Confident | Bold Signal, Electric Studio, Dark Botanical | @@ -249,7 +251,7 @@ If the user selected a self-generated custom wildcard, treat that preview's CSS - [html-template.md](html-template.md) — HTML architecture and JS features - [viewport-base.css](viewport-base.css) — Mandatory CSS (include in full) -- [animation-patterns.md](animation-patterns.md) — Animation reference for the chosen feeling +- [animation-patterns.md](animation-patterns.md) — Animation reference for the chosen feeling. Its patterns follow the frontend skill's shared motion floor ([`motion-core.md`](../superloopy-frontend/references/motion-core.md)): animate transform/opacity/filter only, and respect `prefers-reduced-motion` **Key requirements:** @@ -276,12 +278,12 @@ When converting PowerPoint files: ## Phase 5: Visual-QA Evidence Gate + Delivery -A deck that parses is not verified. Before declaring done, capture real-browser evidence under `.superloopy/evidence/slides/-/`: +A deck that parses is not verified. Before declaring done, capture real-browser evidence under `.superloopy/evidence/slides/-/`. Create and verify that run root with the frontend skill's portable helper so path rules stay identical across skills — `node "$SKILL_DIR/../superloopy-frontend/scripts/evidence-root.mjs" create slides` to create it (`$SKILL_DIR` is this skill's base directory, announced when the skill loads, and `superloopy-frontend` is packaged as its sibling), and `... verify ` to prove each artifact is a non-empty regular file confined beneath it: 1. **Screenshot representative slides** — title slide, one content-heavy slide, and any slide with a complex layout (grid, table, image composition), rendered headless at 1280×720. Also capture one narrow viewport (e.g. 390×844) to prove the stage letterboxes instead of reflowing. 2. **Prove embed mode** — write a throwaway harness page with the deck in an iframe at a collapsed initial height (e.g. `width="900" height="60"`), serve the directory over local HTTP (`python3 -m http.server`; `file://` iframes are opaque-origin and skip the same-origin resize path), and screenshot it: the deck must grow the iframe to 16:9 of its width with no overlap and with chrome scaled. Delete the harness after capture or keep it in the evidence directory. 3. **Inspect every screenshot** — no text overflow, no overlapping panels, stage stays 16:9, fonts actually loaded (not fallback serif). `scrollHeight` checks alone are not enough; grid panels can visually cover each other. -4. **Write `VISUAL_QA.md`** in the evidence directory listing each screenshot, what it proves, and any finding fixed. An open finding is a FAIL — fix and re-capture. +4. **Write `VISUAL_QA.md`** in the evidence directory listing each screenshot, what it proves, and any finding fixed. An open finding is a FAIL — fix and re-capture. Also record the non-waivable core check (assets honest, no placeholder names/brands/filler copy shipped) and, when a StyleGallery teardown informed the style, name that teardown file as provenance. 5. **Record the evidence** — end completed deck work with a Superloopy record, e.g. `superloopy loop evidence --status pass --artifact .superloopy/evidence/slides//VISUAL_QA.md --notes ""`, and end the reply with `SUPERLOOPY_EVIDENCE: `. Then deliver: diff --git a/skills/superloopy-slides/animation-patterns.md b/skills/superloopy-slides/animation-patterns.md index 19bb61a..56d1033 100644 --- a/skills/superloopy-slides/animation-patterns.md +++ b/skills/superloopy-slides/animation-patterns.md @@ -2,6 +2,8 @@ Use this reference when generating presentations. Match animations to the intended feeling. +Every pattern here follows the frontend skill's shared motion floor (`../superloopy-frontend/references/motion-core.md`): animate transform, opacity, and filter only — never layout properties — and respect `prefers-reduced-motion`. This file adds the slide-stage-specific pattern vocabulary on top of that floor. + ## Effect-to-Feeling Guide | Feeling | Animations | Visual Cues | diff --git a/test/frontend-routing-scenarios.test.js b/test/frontend-routing-scenarios.test.js index fa88f75..b9103f2 100644 --- a/test/frontend-routing-scenarios.test.js +++ b/test/frontend-routing-scenarios.test.js @@ -118,6 +118,17 @@ test("frontend evidence helper creates and verifies portable run-scoped roots", encoding: "utf8" }); assert.notEqual(escaped.status, 0); + + const slidesLane = spawnSync(process.execPath, [helper, "create", "deck-check", "slides"], { cwd: sandbox, encoding: "utf8" }); + assert.equal(slidesLane.status, 0, slidesLane.stderr); + const slidesRoot = slidesLane.stdout.trim(); + assert.match(slidesRoot, /^\.superloopy\/evidence\/slides\/\d{8}T\d{6}Z-deck-check$/u); + await writeFile(join(sandbox, slidesRoot, "VISUAL_QA.md"), "visual qa proof\n", "utf8"); + const slidesVerified = spawnSync(process.execPath, [helper, "verify", slidesRoot, "VISUAL_QA.md"], { cwd: sandbox, encoding: "utf8" }); + assert.equal(slidesVerified.status, 0, slidesVerified.stderr); + const badLane = spawnSync(process.execPath, [helper, "create", "deck-check", "backend"], { cwd: sandbox, encoding: "utf8" }); + assert.notEqual(badLane.status, 0); + assert.match(badLane.stderr, /lane must be frontend or slides/u); }); test("frontend evidence helper rejects symlinked proofs and roots while running through a linked entrypoint", { diff --git a/test/plugin.test.js b/test/plugin.test.js index 4270d79..561e9eb 100644 --- a/test/plugin.test.js +++ b/test/plugin.test.js @@ -402,3 +402,29 @@ test("plugin packages the Superloopy Korean humanizer skill with measurable safe assert.equal(existsSync(file), true); } }); + +test("plugin slides skill inherits frontend gallery, anti-slop core, motion floor, and evidence lane", async () => { + const skill = await readFile("skills/superloopy-slides/SKILL.md", "utf8"); + const animation = await readFile("skills/superloopy-slides/animation-patterns.md", "utf8"); + + for (const target of [ + "skills/superloopy-frontend/references/design/_INDEX.md", + "skills/superloopy-frontend/references/anti-slop.md", + "skills/superloopy-frontend/references/image-first.md", + "skills/superloopy-frontend/references/motion-core.md", + "skills/superloopy-frontend/scripts/evidence-root.mjs" + ]) { + assert.equal(existsSync(target), true, `slides cross-reference target missing: ${target}`); + } + + assert.match(skill, /design\/_INDEX\.md/u); + assert.match(skill, /scoped reference input, never automatic token authority/u); + assert.match(skill, /Without a user-named brand or mood, do not open the gallery/u); + assert.match(skill, /anti-slop contract\]\(\.\.\/superloopy-frontend\/references\/anti-slop\.md\)/u); + assert.match(skill, /non-waivable core/iu); + assert.match(skill, /image-first\.md/u); + assert.match(skill, /motion-core\.md/u); + assert.match(skill, /evidence-root\.mjs" create slides/u); + assert.match(animation, /motion-core\.md/u); + assert.match(animation, /prefers-reduced-motion/u); +});