A shareable AI evolution recap app built with Next-style App Router on vinext.
The user-facing app supports one flow:
- A bilingual Korean/English web test that creates a self-assessed AI level score.
The programmatic API accepts public-safe JSON reports from the local AI
Operator skill. The generated local HTML report lets the user press a final
Share button to upload the derived JSON and create a public /r/:id URL.
Both flows save a sanitized report and render it as an interactive scroll story. The web test uses query string state so refresh and browser back work across the landing, question, and result views.
The visual direction and image specs live in docs/design-system.md.
The local Claude Code/Codex skill can make the shared recap feel personal by uploading public-safe summary fields, not raw logs. Supported fields:
summary.habitRead: one custom paragraph about how the user's real sessions show they work with AI.summary.evidence: 1-2 short, sanitized session signals for the habit card.dimensions[].levelLabel: a custom level name for that skill area.dimensions[].personalizedRead: a custom paragraph for that skill card.dimensions[].observedPattern: a short public-safe pattern seen in sessions.dimensions[].evidence: 1-3 short public-safe moments for that skill card.dimensions[].nextAction: one concrete next move for that skill area.
Keep these fields free of raw prompts, secrets, local paths, private filenames, and long quotes. The server still sanitizes strings before saving.
pnpm install
pnpm run dev
pnpm testInstall the analyzer as a plain skill:
npx --yes skills add pecklabs/ai-level --skill ai-operator-score -gOr install it as a Claude Code plugin with the /ai-level:score command:
/plugin marketplace add pecklabs/ai-level
/plugin install ai-level@ai-level
/ai-level:score --lang ko
The default command analyzes ~/.claude/projects, writes JSON/HTML to
./ai-operator-report, and keeps analysis local. Open the generated HTML report
to reveal the score and use its final Share button to create the public URL.
Raw logs stay local.
Default terminal output is intentionally spoiler-free:
================================================================
ASCII AI EVOLUTION REPORT
█████╗ ██╗ ██╗ ███████╗██╗ ██╗███████╗██╗
██╔══██╗██║ ██║ ██╔════╝██║ ██║██╔════╝██║
███████║██║ ██║ █████╗ ██║ ██║█████╗ ██║
██╔══██║██║ ██║ ██╔══╝ ╚██╗ ██╔╝██╔══╝ ██║
██║ ██║██║ ███████╗███████╗ ╚████╔╝ ███████╗███████╗
╚═╝ ╚═╝╚═╝ ╚══════╝╚══════╝ ╚═══╝ ╚══════╝╚══════╝
LOCAL REPORT READY : file:///Users/example/ai-operator-report/ai-operator-report.html
================================================================
ARTIFACTS
- HTML : file:///Users/example/ai-operator-report/ai-operator-report.html
- JSON : ./ai-operator-report/ai-operator-report.json
Useful variants:
/ai-level:score ~/my/session/logs --lang ko
/ai-level:score ~/.claude/projects --json
The script also supports direct execution:
python3 skills/ai-operator-score/scripts/score_sessions.py \
--input ~/.claude/projects \
--output ./ai-operator-report \
--language auto \
--terminal-format recappnpm run dev: start local developmentpnpm run build: verify the vinext build outputpnpm test: build and verify rendered outputpnpm run db:generate: generate Drizzle migrations after schema changespnpm run deploy: build and deploy tohttps://ai-level.pecklabs.org
app/page.tsx: bilingual web test journeyapp/r/[id]/page.tsx: shared recap routecomponents/report-story.tsx: interactive recap slideslib/web-test-report.ts: web test scoring rubriclib/report-store.ts: report sanitization and D1 persistencelib/analytics-store.ts: D1 event logging for funnel/share events