.agents/skills/nakafa-content/SKILL.md
Create educational content (MDX) and exercises for Nakafa platform. Use when creating or editing subject materials, exercises, questions, answers/explanations, or any educational content in MDX format.
npx skillsauth add nakafaai/nakafa.com nakafa-contentInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Guidelines for creating educational content and exercises for the Nakafa platform.
Use normal English - clear and straightforward.
Indonesian (id.mdx): Use proper Indonesian grammar with natural, engaging tone
English (en.mdx): Use proper English grammar with natural, engaging tone
packages/contents/subject/)Educational materials organized by level:
subject/
├── high-school/
│ ├── 10/mathematics/{topic}/
│ ├── 11/mathematics/{topic}/
│ └── 12/mathematics/{topic}/
└── university/
└── bachelor/
└── ai-ds/
Each topic contains:
id.mdx: Indonesian version (Source of Truth) - natural, engaging toneen.mdx: English translation - natural, engaging tonegraph.tsx: Shared graph component (if needed)packages/contents/exercises/)exercises/
├── high-school/
│ ├── tka/mathematics/{material}/{set}/{number}/
│ └── snbt/{subject}/{material}/{set}/{number}/
└── middle-school/
Exercise structure per number:
{number}/
├── _question/
│ ├── id.mdx
│ └── en.mdx
├── _answer/
│ ├── id.mdx
│ └── en.mdx
└── choices.ts
Available in all MDX files without importing:
<BlockMath math="x^2 + y^2 = r^2" />
<InlineMath math="5" />
<MathContainer>
<BlockMath math="a = b" />
<BlockMath math="c = d" />
</MathContainer>
<CodeBlock
data={[
{ language: "typescript", filename: "example.ts", code: "const x = 1;" },
]}
/>
<Mermaid chart="graph TD; A-->B;" />
From @repo/design-system/components/contents/*:
import { LineEquation } from "@repo/design-system/components/contents/line-equation";
import { NumberLine } from "@repo/design-system/components/contents/number-line";
import { Triangle } from "@repo/design-system/components/contents/triangle";
import { UnitCircle } from "@repo/design-system/components/contents/unit-circle";
import { Vector3d } from "@repo/design-system/components/contents/vector-3d";
import { VectorChart } from "@repo/design-system/components/contents/vector-chart";
import { Inequality } from "@repo/design-system/components/contents/inequality";
import { FunctionChart } from "@repo/design-system/components/contents/function-chart";
import { ScatterDiagram } from "@repo/design-system/components/contents/scatter-diagram";
import { BarChart } from "@repo/design-system/components/contents/bar-chart";
import { AnimationBacterial } from "@repo/design-system/components/contents/animation-bacterial";
Always use getColor() for deterministic colors:
import { getColor } from "@repo/design-system/lib/color";
// Available colors: RED, ORANGE, AMBER, YELLOW, LIME, GREEN, EMERALD,
// TEAL, CYAN, SKY, BLUE, INDIGO, VIOLET, PURPLE, FUCHSIA, PINK, ROSE
<LineEquation
data={[{
points: Array.from({ length: 100 }, (_, i) => {
const x = -5 + (i / 99) * 10;
return { x, y: x * x, z: 0 };
}),
color: getColor("INDIGO"),
smooth: true,
showPoints: false,
}]}
/>
Never use default RED, GREEN, or BLUE for lines.
<InlineMath math="x + y" /><BlockMath math="x^2 + y^2 = r^2" /><MathContainer><InlineMath math="5" /> for numbers in text (not plain 5)<InlineMath math="(1)" /> for numbered references<InlineMath math="5 \text{ cm}" />Italicize variables: x, y, f(x)
Use comma: 3,14 (not 3.14)
MDX files (InlineMath/BlockMath): Use single backslash
<InlineMath math="\frac{a}{b}" />
<BlockMath math="\sqrt{x}" />
choices.ts (TypeScript strings): Use escaped double backslash
{ label: "$$\\frac{a}{b}$$", value: true }
##)####)Correct:
## Finding the Value of x
#### Analysis 1
Incorrect:
## Step 1: Finding <InlineMath math="x" />
#### Analysis (1)
Use hyphens -:
- First item
- Second item
- Third item
No nested lists. No blank lines between items.
Always add blank line between text and math:
Some text here.
<BlockMath math="x = 5" />
More text here.
_question/id.mdx)export const metadata = {
title: "Soal 1",
authors: [{ name: "Author Name" }],
date: "06/11/2025", // MM/DD/YYYY format
};
Diketahui <InlineMath math="a = 5" /> dan <InlineMath math="b = 3" />.
Hitunglah nilai dari <InlineMath math="a + b" />.
_answer/id.mdx)export const metadata = {
title: "Pembahasan Soal 1",
authors: [{ name: "Author Name" }],
date: "06/11/2025",
};
#### Analisis Soal
Diketahui <InlineMath math="a = 5" /> dan <InlineMath math="b = 3" />.
<MathContainer>
<BlockMath math="a + b = 5 + 3" />
<BlockMath math="a + b = 8" />
</MathContainer>
Jadi, nilai <InlineMath math="a + b" /> adalah <InlineMath math="8" />.
choices.ts)import type { ExercisesChoices } from "@repo/contents/_types/exercises/choices";
const choices: ExercisesChoices = {
id: [
{ label: "$$7$$", value: false },
{ label: "$$8$$", value: true }, // correct answer
{ label: "$$9$$", value: false },
{ label: "$$10$$", value: false },
{ label: "Tidak ada jawaban", value: false }, // plain text
],
en: [
{ label: "$$7$$", value: false },
{ label: "$$8$$", value: true },
{ label: "$$9$$", value: false },
{ label: "$$10$$", value: false },
{ label: "No answer", value: false },
],
};
export default choices;
Math in choices: Use $$...$$ for math expressions and numbers, plain text for normal labels.
Important: In TypeScript strings, backslashes must be escaped with an additional backslash. For example:
// CORRECT - escape the backslash
{ label: "$$\\frac{a}{b}$$", value: true }
{ label: "$$\\sqrt{x}$$", value: false }
{ label: "$$\\infty$$", value: false }
// WRONG - unescaped backslash causes error
{ label: "$$\frac{a}{b}$$", value: true }
MM/DD/YYYY (e.g., "06/11/2025")<InlineMath math="(1)" /> not (1)Never hard-code points. Use Array.from() with math calculations:
// For a parabola y = x^2 from x=-5 to x=5
points: Array.from({ length: 100 }, (_, i) => {
const x = -5 + (i / 99) * 10; // Range from -5 to 5
const y = x * x;
return { x, y, z: 0 };
})
// For a circle
points: Array.from({ length: 100 }, (_, i) => {
const angle = (i / 99) * 2 * Math.PI;
const x = Math.cos(angle);
const y = Math.sin(angle);
return { x, y, z: 0 };
})
For 2D visualizations:
<LineEquation
title={<>Graph of f(x)</>}
description="Visualization of the function"
showZAxis={false}
cameraPosition={[0, 0, 15]} // Perpendicular to plane
data={[{
points: [...],
color: getColor("TEAL"),
smooth: true,
showPoints: false,
}]}
/>
Ensure labels don't overlap:
labels: [
{ text: "y = x²", at: 50, offset: [1, 0.5, 0] }
]
`const x = 5`)<InlineMath math="5" /><InlineMath math="f(x)" />`function()`)Before submitting content:
<InlineMath />getColor() not hard-coded valuesArray.from(), not hard-codedpnpm lint before submittingtools
Next.js 16 Cache Components - PPR, use cache directive, cacheLife, cacheTag, updateTag
development
Next.js best practices - file conventions, RSC boundaries, data patterns, async APIs, metadata, error handling, route handlers, image/font optimization, bundling
testing
When the user wants to apply psychological principles, mental models, or behavioral science to marketing. Also use when the user mentions 'psychology,' 'mental models,' 'cognitive bias,' 'persuasion,' 'behavioral science,' 'why people buy,' 'decision-making,' 'consumer behavior,' 'anchoring,' 'social proof,' 'scarcity,' 'loss aversion,' 'framing,' or 'nudge.' Use this whenever someone wants to understand or leverage how people think and make decisions in a marketing context.
development
Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.