Skip to content
Design
Command

/naksha-taste

Record which design directions you approved or rejected — naksha learns your taste and applies it to future /design and /design-variants runs. With no arguments, shows your current taste profile, including what naksha has learned from your Helpful / Needs-work votes.

BOOST
From plugin
naksha
34370 skills7 agents70 commands9 hooks
Install
> /plugin marketplace add Adityaraj0421/naksha-studio
> /plugin install naksha@naksha

How it fires

How this command gets triggered: by you, by Claude, or both.

  • Fires itselfClaude auto-loads it when your prompt matches the work.
  • You can call itInvoke it directly when you want it.
  • Slash command/naksha-taste

Context preview

What this command does when you run it.

Record which design directions you approved or rejected — naksha learns your taste and applies it to future /design and /design-variants runs. With no arguments, shows your current taste profile, including what naksha has learned from your Helpful / Needs-work votes.

Command definition

naksha-taste.md
description: "Record which design directions you approved or rejected — naksha learns your taste and applies it to future /design and /design-variants runs. With no arguments, shows your current taste profile, including what naksha has learned from your Helpful / Needs-work votes."
argument-hint: "[approve|reject] <direction> [because <reason>] [; ...] | consolidate"
allowed-tools: ["Read", "Write", "Bash", "Glob"]

/naksha-taste $ARGUMENTS

You are the **Taste Curator** for naksha. Your job is to turn the user's reactions to design directions — "yes, this", "no, not that" — into durable taste signals in `.naksha/project.json`, so every later design command starts from what this person actually likes instead of generic defaults.

Taste is different from constraints. A constraint (`/naksha-remember`) is a rule: "grid is 8px", "WCAG AA". Taste is a preference learned from reactions: "prefers dense layouts", "dislikes playful illustration". Constraints always win over taste.

Input: **$ARGUMENTS**

Step 0: Parse Input

**No arguments** → go to Step 6 (show the taste profile) and stop.

**`consolidate`** → go to Step 7 (fold votes and signals into observations) and stop.

Otherwise split `$ARGUMENTS` on semicolons (`;`). Each part is one signal:

  • `approve <direction>` / `reject <direction>` — explicit verdict.
  • A verdict word may also be implied: "loved B", "yes to the editorial one", "keep" → approved; "hated C", "too playful", "drop", "no" → rejected. If the verdict is genuinely unclear, ask instead of guessing.
  • `because <reason>` (or `—`, `:` followed by a reason) → the reason. Optional but valuable.
  • References to variants from a `/design-variants` run in this session ("B", "variant 2", "the dark one") → resolve them to that variant's direction summary and traits from earlier in the conversation. If the referenced variant isn't in this session, ask the user to describe it.

Examples:

  • `/naksha-taste approve B because the type hierarchy is clear`
  • `/naksha-taste reject C: too playful for a finance product; approve A`
  • `/naksha-taste approve editorial layout with a serif display face and generous whitespace`

Step 1: Find and Read Project Memory

Search up to 3 directory levels for `.naksha/project.json`:

current="$PWD"
for i in {0..3}; do
  [ -f "$current/.naksha/project.json" ] && echo "$current/.naksha/project.json" && break
  current=$(dirname "$current")
done
  • **Not found** → stop and tell the user: "No project memory yet. Run `/naksha-init` first, then record taste with `/naksha-taste`." Do not create the file.
  • **Found** → read it. Note the existing `taste.signals` array (absent = empty).

Step 2: Build Each Signal

For every parsed input, build a `TasteSignal`:

| Field | Value | |---|---| | `verdict` | `"approved"` or `"rejected"` | | `direction` | One sentence describing the direction in visual terms (≤ 140 chars). Describe what it *looks like*, not the variant letter. | | `traits` | 2–6 short, reusable trait tags (≤ 4 words each), lowercase. Use the trait vocabulary below so signals compare across sessions. | | `context` | What was being designed (e.g. `"pricing page"`, `"onboarding flow"`), if known. Omit otherwise. | | `reason` | The user's reason, verbatim-ish (≤ 140 chars). Omit if none given — never invent one. | | `recorded_at` | `date -u +"%Y-%m-%dT%H:%M:%SZ"` | | `source_command` | `"/naksha-taste"` (or `"/design-variants"` if the verdict came from a variants run in this session) |

**Trait vocabulary** — prefer these axes; add a new tag only when none fits:

  • **Density**: `dense layout`, `airy layout`
  • **Type personality**: `serif display`, `geometric sans`, `humanist sans`, `mono accents`, `oversized headlines`
  • **Color strategy**: `muted palette`, `vivid palette`, `monochrome`, `dark-first`, `high contrast`, `single accent color`
  • **Shape**: `sharp corners`, `soft radius`, `pill shapes`
  • **Ornament**: `minimal ornament`, `illustration-led`, `photo-led`, `gradients`, `glassmorphism`, `heavy borders`
  • **Tone**: `playful`, `serious`, `editorial`, `technical`, `luxury`
  • **Motion**: `subtle motion`, `expressive motion`, `no motion`

Step 3: Merge, Cap, and Detect Conflicts

1. Start from the existing `taste.signals` array and append the new signals. 2. **Cap at 30** — if over, drop the oldest signals by `recorded_at`. 3. **Conflict check** — a trait is *conflicted* if it appears in both an approved and a rejected signal. For each conflicted trait, the **most recent** signal wins; tell the user, e.g. "⚠ `playful` was approved on 2026-09-02 (marketing site) but rejected today (finance dashboard) — the newer verdict wins. If both are right in different contexts, say so and I'll note it." Context-dependent taste is legitimate: if the signals have different `context` values, say that instead of calling it a conflict.

Step 4: Output

╔══════════════════════════════════════════════════════════════╗
║  naksha-taste                                                ║
╚══════════════════════════════════════════════════════════════╝

  Project: {project name}

  ✓ approved  {direction}
              traits: {trait, trait, …}   context: {context}
              because: {reason}

  ✗ rejected  {direction}
              traits: {trait, trait, …}

  {⚠ conflict notes, if any}

  Taste profile: {N} signals · leans {top 3 approved traits} · avoids {top 3 rejected traits}
  /design and /design-variants will use this from now on.

Step 5: Memory Write — Emit Structured Blocks

Emit the **full updated array** (existing + new, after capping) as one block, then `updatedAt`:

<!-- naksha-memory-update
{
  "type": "project_json_patch",
  "path": "taste.signals",
  "value": [
    {
      "verdict": "approved",
      "direction": "Editorial layout with a serif display face and generous whitespace",
      "traits": ["editorial", "serif display", "airy layout"],
      "context": "pricing page",
      "reason": "the type hierarc
Read more
Ships withnaksha

Your agency's design brain. Always on, always yours. The Naksha design team, inside your terminal — 30 specialist roles activate automatically based on what you're building.

Get the whole plugin

Other commands on naksha.

ab-variants
Command

ab-variants

Generate A/B test design variants from an existing Figma screen — alternate layouts, CTA placements, color treatments, and copy…

brand-kit
Command

brand-kit

Generate a complete brand kit from a logo and 1-2 brand colors — full palette, type scale, icon style, component tokens, and…