[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M77MM3EXM5S17FP3ZPQRBTPY":3,"skill-same:01M77MM3EXM5S17FP3ZPQRBTPY":655},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":16,"sourceHtmlUrl":17,"categories":18,"keywords":19,"publishedAt":20,"linkOnly":21,"markdownContent":22,"markdownBody":23,"frontMatter":24,"refName":25,"commitSha":26,"skillDirectory":5,"forksCount":14,"repositoryHtmlUrl":27,"repositoryHomepageUrl":6,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":29,"install":30,"resources":43},"01M77MM3EXM5S17FP3ZPQRBTPY","kami",null,"Typeset professional documents and product landing pages: resumes, one-pagers, white papers, letters, portfolios, slide decks, landing pages. Warm parchment, ink-blue accent, serif-led hierarchy. CN uses TsangerJinKai02, EN uses Charter, JA uses YuMincho (best-effort). Triggers on \"做 PDF \u002F 排版 \u002F 一页纸 \u002F 白皮书 \u002F 作品集 \u002F 简历 \u002F PPT \u002F slides \u002F Marp \u002F markdown slides \u002F マークダウンのスライド \u002F 落地页 \u002F 官网 \u002F landing page \u002F product page\", or \"build me a resume \u002F make a one-pager \u002F design a slide deck \u002F turn this into a PDF \u002F make this presentable \u002F create a landing page\".","prkvw\u002Frp_build","prkvw","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F140225174?v=4","01M77MK8161MZ5579QRP1RJEYR","sB","01M77MK81V6BW8B6DD0ZBBBG7V",0,"MIT","https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: kami\ndescription: 'Typeset professional documents and product landing pages: resumes, one-pagers, white papers, letters, portfolios, slide decks, landing pages. Warm parchment, ink-blue accent, serif-led hierarchy. CN uses TsangerJinKai02, EN uses Charter, JA uses YuMincho (best-effort). Triggers on \"做 PDF \u002F 排版 \u002F 一页纸 \u002F 白皮书 \u002F 作品集 \u002F 简历 \u002F PPT \u002F slides \u002F Marp \u002F markdown slides \u002F マークダウンのスライド \u002F 落地页 \u002F 官网 \u002F landing page \u002F product page\", or \"build me a resume \u002F make a one-pager \u002F design a slide deck \u002F turn this into a PDF \u002F make this presentable \u002F create a landing page\".'\n---\n\n# kami · 紙\n\n**紙 · かみ** - the paper your deliverables land on.\n\nGood content deserves good paper. One design language across eight document types: warm parchment canvas, ink-blue accent, serif-led hierarchy, tight editorial rhythm.\n\nPart of `Kaku · Waza · Kami` - Kaku writes code, Waza drills habits, **Kami delivers documents**.\n\n**Update check (non-blocking).** At the start of a task, run `bash scripts\u002Fcheck-update.sh`. It does a read-only version check at most once per day and prints one line when a newer kami is available; relay that line to the user, then continue. It sends no data, and fails silently when offline, sandboxed, or without `curl`. Never let it block the work.\n\n## Step 0 · Load brand profile (if exists)\n\nCheck `~\u002F.config\u002Fkami\u002Fbrand.md` (preferred) or `~\u002F.kami\u002Fbrand.md` (legacy fallback). If found, read `references\u002Fbrand-profile.md` for the full four-layer application spec (placeholder substitution, session defaults, visual customization, habit notes) and its six guardrails. If no profile exists, continue without interruption.\n\nKey rule: explicit prompt > editorial judgment > habit notes > frontmatter defaults > built-in defaults. Profile fills gaps silently; it never overrides the current conversation.\n\n## Step 0.5 · User project style scan (opt-in)\n\nRun this only when the user explicitly references a sibling project as a visual reference: \"like my \u003Cproject> site\", \"match the style of \u003Crepo>\", \"use the look from \u003Cdirectory>\". Skip silently when no such reference exists.\n\nWhen triggered, before generating:\n\n1. Locate the referenced project's style files:\n   ```bash\n   find \u003Creferenced-path> -maxdepth 4 \\( -name \"*.css\" -o -name \"tailwind.config.*\" -o -name \"theme.*\" -o -name \"tokens.*\" \\) | head -20\n   ```\n2. Extract: dominant color values (hex \u002F hsl), font stack, spacing scale, border-radius scale. Prefer values declared in CSS variables or design tokens over inline literals.\n3. Merge into the in-session brand profile as Layer C (visual customization), not Layer B (session defaults). Do not override an explicit `--brand` flag or values that the user typed in this turn.\n4. Report back in one line before continuing: \"scanned \u003Cproject>, extracted N colors \u002F M fonts; using as visual reference.\"\n\nSkip and fall back to the brand profile defaults if the referenced path does not exist, no CSS-like files are found, or the extraction would conflict with the user's explicit values in the current message.\n\n---\n\n## Step 1 · Decide the language\n\n**Match the user's language.** Chinese -> `*.html` \u002F `slides-weasy.html`. English -> `*-en.html` \u002F `slides-weasy-en.html`. Japanese -> CJK path (`.html` \u002F `slides-weasy.html`) as best-effort, JP Mincho first, visual QA before shipping. Korean -> dedicated `*-ko.html` \u002F `slides-weasy-ko.html` family as best-effort, visual QA before shipping. Reference docs are shared English specs.\n\nWhen ambiguous (e.g. a one-word command like \"resume\"), ask a one-liner rather than guess.\n\n| User language | HTML templates | Slides (PDF default) | Slides (PPTX fallback) |\n|---|---|---|---|\n| Chinese (primary) | `*.html` | `slides-weasy.html` | `slides.py` |\n| English | `*-en.html` | `slides-weasy-en.html` | `slides-en.py` |\n| Japanese (best-effort) | `*.html` | `slides-weasy.html` | `slides.py` |\n| Korean (best-effort) | `*-ko.html` | `slides-weasy-ko.html` | n\u002Fa (use `slides-en.py` only if PPTX is required) |\n| Other languages (best-effort) | choose CJK or EN path by script coverage, then verify manually | choose `slides-weasy.html` or `slides-weasy-en.html`, then verify manually | use `slides.py` \u002F `slides-en.py` only if PPTX is required |\n\n> Default to the WeasyPrint HTML path; fall back to PPTX (`slides*.py`) only when the user explicitly needs an editable deck.\n\nAlways use `CHEATSHEET.md` and `references\u002F*.md` for design, writing, production, and diagram guidance.\n\nCode blocks with `class=\"language-*\"` are highlighted only when optional `Pygments` is installed in the build environment. Without it, PDFs still render and code blocks stay monochrome.\n\n## Step 1.5 · Intent extraction (silent checklist)\n\nBefore choosing a template, verify these four dimensions are clear. Do not ask unless 2+ are missing and cannot be inferred from context.\n\n| Dimension | What to extract | Example |\n|---|---|---|\n| **Purpose** | Why this document exists | Persuade investor vs. align internal team vs. close a candidate |\n| **Audience** | Who reads it, what they already know | Technical CTO (skip basics) vs. non-technical board (explain terms) |\n| **Constraint** | Hard limits on length, format, tone, or delivery | \"One page max\", \"formal English\", \"print-ready A4\" |\n| **Success** | What outcome counts as success | They schedule a meeting \u002F they approve the budget \u002F they understand the architecture |\n\nRules:\n- If the conversation already answered a dimension, skip it silently.\n- If a dimension can be inferred from the document type (e.g. resume purpose is always \"get an interview\"), skip it.\n- If 2+ dimensions are genuinely unclear, ask in a single compact question (max 2 sub-questions).\n- Never ask all four as a checklist. This is a background verification, not a form.\n\n## Execution contract\n\nBefore creating or modifying an output, lock the contract: language, template, output format, page or length target, visual acceptance check, and verification command. Infer from the user's request when clear; ask only when missing fields materially change the deliverable.\n\nUse the nearest existing template and verification path. Do not add a new template, shared CSS layer, dependency, script flag, or optional mode unless the current request cannot be satisfied without it.\n\nIf a change touches `SKILL.md`, templates, scripts, references, or package inputs, decide whether `dist\u002Fkami.zip` must be refreshed before handoff. Shipped behavior is not ready until the package contains the changed files.\n\n---\n\n## Step 2 · Pick the document type\n\n| User says | Document | CN template | EN template | KO template |\n|---|---|---|---|---|\n| \"one-pager \u002F 方案 \u002F 执行摘要 \u002F exec summary\" | One-Pager | `one-pager.html` | `one-pager-en.html` | `one-pager-ko.html` |\n| \"white paper \u002F 白皮书 \u002F 长文 \u002F 年度总结 \u002F technical report\" | Long Doc | `long-doc.html` | `long-doc-en.html` | `long-doc-ko.html` |\n| \"formal letter \u002F 信件 \u002F 辞职信 \u002F 推荐信 \u002F memo\" | Letter | `letter.html` | `letter-en.html` | `letter-ko.html` |\n| \"portfolio \u002F 作品集 \u002F case studies\" | Portfolio | `portfolio.html` | `portfolio-en.html` | `portfolio-ko.html` |\n| \"resume \u002F CV \u002F 简历 \u002F 履歴書\" | Resume | `resume.html` | `resume-en.html` | `resume-ko.html` |\n| \"slides \u002F PPT \u002F deck \u002F 演示\" | Slides | `slides-weasy.html` | `slides-weasy-en.html` | `slides-weasy-ko.html` |\n| \"个股研报 \u002F equity report \u002F 估值分析 \u002F investment memo \u002F 股票分析\" | Equity Report | `equity-report.html` | `equity-report-en.html` | `equity-report-ko.html` |\n| \"更新日志 \u002F changelog \u002F release notes \u002F 版本记录\" | Changelog | `changelog.html` | `changelog-en.html` | `changelog-ko.html` |\n| \"landing page \u002F 落地页 \u002F 官网 \u002F product page \u002F 产品页\" | Landing Page | `landing-page.html` | `landing-page-en.html` | `landing-page-ko.html` |\n\n> **Changelog vs. release notes**: The changelog template above is for styled document output. GitHub release notes are a separate deliverable; use `\u002Fwrite` with Release Note Template Mode.\n\n> **Landing Page**: Screen-first interactive template. No PDF output. Includes gallery carousel with auto-rotate, hero entrance animation, responsive breakpoints (880px \u002F 480px), and prefers-reduced-motion support. Deploy as static HTML to Vercel \u002F Netlify \u002F any host. The agent fills {{PLACEHOLDER}} values and HTML comment blocks, then saves as a ready-to-serve `.html` file.\n\n> **Landing Page companion files**: For a production multilingual deploy, copy the five `landing-page-*.example` files alongside the main HTML, remove the `.example` suffix, and fill the placeholders. They cover Vercel rewrites and headers, sitemap hreflang, robots AI allowlist, and llms.txt + llms-full.txt for AI assistants. The main HTML already ships matching hreflang and og:locale in `\u003Chead>`; an Accept-Language redirect at the end of `landing-page-en.html` is commented out for opt-in. `{{SITE_ORIGIN}}` is the scheme + host of your `{{CANONICAL_URL}}` (e.g. `https:\u002F\u002Fexample.com`). See `references\u002Fdesign.md` Section 11 «Companion assets».\n\n> **Production product site mode**: If the user needs docs, help, releases, changelog, roadmap, legal pages, or more than two locales, treat it as a site system. Lock product category, real screenshot slots, locale list, companion files, long-content pages, and generator\u002Fcheck needs before filling templates. Keep project-specific release artifacts, payment providers, appcast rules, and private local paths out of Kami. See `references\u002Fdesign.md` Section 11 «Product site system».\n\n> **Documentation pages**: When a landing page grows into a docs or help site, use the doc shell in `references\u002Fdesign.md` Section 11 «Documentation site»: a sticky sidebar nav with a 2px brand rail (not a dark underline), an on-this-page TOC hidden below the tablet breakpoint, a constrained prose measure, and a quiet borderless prev\u002Fnext pager (text links, not bordered cards). Highlight code at build time with zero runtime JS on a dark code surface; plain code stays the source of truth.\n\n> Slides: default to `slides-weasy.html` \u002F `slides-weasy-en.html` \u002F `slides-weasy-ko.html` (WeasyPrint HTML → PDF). Use `slides.py` \u002F `slides-en.py` only when the user explicitly requires an editable PPTX file. Use `assets\u002Ftemplates\u002Fmarp\u002Fslides-marp(.md|.css)` only when the user explicitly asks for Marp \u002F markdown slides \u002F a deck that lives in a `.md` file.\n\n> Deck recipe: read design.md Section 8 before drafting slides. Sketch title sequence, evidence shape, and image slot before generating or cropping visuals. Keep audience copy separate from visual briefs. Marp-specific constraints live in design.md §8 «Marp variant».\n\n### Decision tree (use before asking)\n\nWalk this tree before reaching for a one-liner question. Ask only when two cells genuinely both fit.\n\n| Signal | Document |\n|---|---|\n| Length target unknown | Ask \"how many pages\" before classifying |\n| ≤ 1 page + investor \u002F recruiter \u002F exec summary audience | one-pager |\n| ≤ 1 page + formal correspondence (sales, hiring, resignation, memo) | letter |\n| 1.5-2 pages + career narrative + project bullets | resume |\n| 3-6 pages + project showcase + visual heavy | portfolio |\n| 6-15 pages + sustained argument + low visual density | long-doc |\n| Presentation flow + speaker support + per-slide assertion | slides |\n| Financial \u002F metrics dashboard + thesis + price or risk view | equity-report |\n| Version-by-version log + release facts | changelog |\n| Product showcase + pricing + screenshots + FAQ for browser | landing-page |\n\nAmbiguity examples that justify a one-liner:\n- \"1.5 page career story with heavy visuals\" -> ask \"resume or portfolio?\"\n- \"2 page exec summary with metric tiles\" -> ask \"one-pager or equity-report?\"\n- \"5 page argument with several charts\" -> ask \"long-doc or portfolio?\"\n\nPick from the tree first. Ask only when the tree is genuinely silent.\n\n### Diagrams (primitives, not a separate template type)\n\nWhen the user asks for **a diagram inside** a long-doc \u002F portfolio \u002F slide (not a standalone document), route to `assets\u002Fdiagrams\u002F` rather than a template:\n\n| User says | Diagram | Template |\n|---|---|---|\n| \"架构图 \u002F architecture \u002F 系统图 \u002F components diagram\" | Architecture | `assets\u002Fdiagrams\u002Farchitecture.html` |\n| \"流程图 \u002F flowchart \u002F 决策流 \u002F branching logic\" | Flowchart | `assets\u002Fdiagrams\u002Fflowchart.html` |\n| \"象限图 \u002F quadrant \u002F 优先级矩阵 \u002F 2×2 matrix\" | Quadrant | `assets\u002Fdiagrams\u002Fquadrant.html` |\n| \"柱状图 \u002F bar chart \u002F 分类对比 \u002F grouped bars\" | Bar Chart | `assets\u002Fdiagrams\u002Fbar-chart.html` |\n| \"折线图 \u002F line chart \u002F 趋势 \u002F 股价 \u002F time series\" | Line Chart | `assets\u002Fdiagrams\u002Fline-chart.html` |\n| \"环形图 \u002F donut \u002F pie \u002F 占比 \u002F 分布结构\" | Donut Chart | `assets\u002Fdiagrams\u002Fdonut-chart.html` |\n| \"状态机 \u002F state machine \u002F 状态图 \u002F lifecycle\" | State Machine | `assets\u002Fdiagrams\u002Fstate-machine.html` |\n| \"时间线 \u002F timeline \u002F 里程碑 \u002F milestones \u002F roadmap\" | Timeline | `assets\u002Fdiagrams\u002Ftimeline.html` |\n| \"泳道图 \u002F swimlane \u002F 跨角色流程 \u002F cross-team flow\" | Swimlane | `assets\u002Fdiagrams\u002Fswimlane.html` |\n| \"树状图 \u002F tree \u002F hierarchy \u002F 层级 \u002F 组织架构\" | Tree | `assets\u002Fdiagrams\u002Ftree.html` |\n| \"分层图 \u002F layer stack \u002F 分层架构 \u002F OSI \u002F stack\" | Layer Stack | `assets\u002Fdiagrams\u002Flayer-stack.html` |\n| \"维恩图 \u002F venn \u002F 交集 \u002F overlap \u002F 集合关系\" | Venn | `assets\u002Fdiagrams\u002Fvenn.html` |\n| \"K 线 \u002F candlestick \u002F OHLC \u002F 股价走势 \u002F price history\" | Candlestick | `assets\u002Fdiagrams\u002Fcandlestick.html` |\n| \"瀑布图 \u002F waterfall \u002F 收入桥 \u002F revenue bridge \u002F decomposition\" | Waterfall | `assets\u002Fdiagrams\u002Fwaterfall.html` |\n\nRead `references\u002Fdiagrams.md` before drawing - it has the selection guide, kami token map, and the AI-slop anti-pattern table. Extract the `\u003Csvg>` block from the template and drop it into a `\u003Cfigure>` inside long-doc \u002F portfolio.\n\nBefore drawing, always ask: **would a well-written paragraph teach the reader less than this diagram?** If no, don't draw.\n\n**Auto-select charts from data.** When content contains numerical data, choose the chart type and embed it without waiting for the user to specify. Decision tree (first match wins):\n\n| Data shape | Chart |\n|---|---|\n| Has open\u002Fhigh\u002Flow\u002Fclose fields, or per-day price | Candlestick |\n| Has + and - contributions that sum to a total (bridge, waterfall, P&L) | Waterfall |\n| One series, values sum to ~100%, items ≤ 6 | Donut |\n| One series, values sum to ~100%, items ≥ 7 | Horizontal bar |\n| Two or more series across time (months, quarters, years) | Line |\n| One series across time, large count changes dominate (not rate) | Bar |\n| Multiple categories, same time snapshot, 2+ series | Grouped bar |\n| 2×2 strategic or priority positioning | Quadrant |\n| Hierarchical data with depth ≥ 2 | Tree |\n| Process with decision branches | Flowchart |\n| Cross-team or cross-role process with ≥ 3 actors | Swimlane |\n| Set overlaps or shared attributes between 2-3 groups | Venn |\n| Category comparison, single series, no time axis | Bar |\n\nWhen data fits multiple types, prefer the one that shows variance most clearly. Always embed inside a `\u003Cfigure>` with a caption that states the insight, not just the data range.\n\n## Step 2.1 · Source and material pass\n\nRun this before distilling or filling content when the document depends on facts or materials outside the user's draft. Skip it only for personal drafts where the user already supplied everything needed.\n\n### Source check\n\nTrigger when the document mentions a specific company, product, person, release date, version, funding round, metric, market fact, technical spec, or any current fact likely to change.\n\n- Use primary sources before writing: user-provided material, official site, docs, filings, press release, app store page, or repo release\n- Keep a short note of source names and dates for facts that drive the document\n- If sources conflict or a fact cannot be checked quickly, ask the user instead of choosing silently\n- Avoid current-sounding claims such as \"latest\", \"recent\", \"new\", version numbers, launch dates, or financial figures unless they are checked\n\n### Material check\n\nTrigger when the document is about a company, product, project, venue, or personal brand.\n\nConfirm the materials that make the subject recognizable before layout:\n\n| Need | Required when | Accept |\n|---|---|---|\n| Logo | Any branded document | User file or official SVG\u002FPNG |\n| Product image | Physical product \u002F venue \u002F object | Official image, user image, or marked gap |\n| UI screenshot | App \u002F SaaS \u002F website \u002F tool | Current screenshot, official product image, or user capture |\n| Brand colors | Branded one-pager \u002F portfolio \u002F deck | Official value, extracted asset value, or keep kami ink-blue |\n| Fonts | Only if brand typography matters | Official font, close system fallback, or kami default |\n\nIf a required item is missing, use a compact gap table and ask once. Do not replace missing material with generic imagery, approximate logo drawings, or invented values.\n\nLogo fallback: when the request names no logo but the brand profile has a `logo` path, fill the commented `.brand-logo` slot in `one-pager` \u002F `portfolio` \u002F `slides-weasy` per `references\u002Fbrand-profile.md` Layer C. Expand `~` to an absolute path, and if the file is missing or the template has no slot, leave it commented and render without a logo (never insert a broken image). An explicit logo in the current request always wins.\n\n### Materials status block\n\nAfter the material check, output a structured status block before continuing. This is a one-shot transparency display, not a question:\n\n```\nMaterials status:\n- Logo: OK assets\u002Fclient-logo.svg\n- Brand colors: OK #1B365D mapped to --brand\n- Product screenshot: MISSING (proceeding with kami default placeholder)\n- UI screenshot: not required for this doc type\n```\n\nUse `OK`, `MISSING`, or `not required`. If a required item is missing and no user input arrived, ask once with the gap table; otherwise continue silently.\n\n## Step 2.5 · Distill raw content (if applicable)\n\n**Auto-detect whether to distill.** Do not ask the user; judge from the input:\n\n| Skip distill (fill directly) | Run distill |\n|---|---|\n| Content has explicit section labels matching template structure | Raw prose without section structure |\n| Metrics already quantified with units in place | Numbers scattered or implied, not extracted |\n| User wrote \"use this as-is\" \u002F \"直接用这个\" \u002F \"原封不动\" | User pasted multi-source dump (chat \u002F email thread \u002F multiple docs) |\n| Content count matches template (e.g. 4 metrics for 4 metric cards) | Content count mismatches template (too many or too few items) |\n| One coherent voice with consistent claims | Conflicting claims or duplicate facts across sources |\n\nWhen in doubt, run distill. Distill is cheap; rebuilding a misaligned doc is not.\n\nWhen the user hands over **raw material** (meeting notes, brain dump, existing doc in different format, chat transcript, scattered points):\n\n1. **Extract**: pull out every factual claim, number, date, name, source, material reference, and action item\n2. **Classify**: map each extract to the target template's sections (see `references\u002Fwriting.md` for section structure per doc type)\n3. **Gap-check**: list what the template needs but the raw content doesn't have - include missing facts, missing proof, and missing materials\n4. **Ask once**: share the gap table with the user. Do not guess to fill gaps.\n\nExample gap-check:\n\n| Template needs | Found | Missing |\n|---|---|---|\n| 4 metric cards | \"8 years\", \"50-person team\" | 2 more quantifiable results |\n| 3-5 core projects | 2 mentioned | at least 1 more with outcome |\n| Materials | logo file provided | product screenshot source |\n\nThen proceed to Step 2.6 (slides) or the layout note (all other doc types) with structured, distilled content.\n\n## Step 2.6 · Deck pre-flight (slides only)\n\nSkip this step for every doc type except slides.\n\n### Path selection\n\nDefault to the WeasyPrint HTML path. Switch to pptx only if the user explicitly requires an editable PPTX file. Switch to Marp only when the user explicitly asks for Marp \u002F markdown slides.\n\n| Path | Template | When |\n|---|---|---|\n| WeasyPrint HTML → PDF (default) | `slides-weasy.html` \u002F `slides-weasy-en.html` \u002F `slides-weasy-ko.html` | All cases unless PPTX or Marp is required |\n| python-pptx → PPTX (fallback) | `slides.py` \u002F `slides-en.py` | User explicitly requires editable PPTX |\n| Marp Markdown (variant) | `assets\u002Ftemplates\u002Fmarp\u002Fslides-marp.md` (+ `slides-marp.css`) \u002F `slides-marp-en.md` (+ `slides-marp-en.css`) | User explicitly asks for Marp, \"markdown slides\", or a `.md` deck. Shipped `.md` is a working demo of Kami Marp itself; copy it, swap content, keep the structure. Renders via local `marp` CLI; not bundled. |\n\n### Page size\n\nDefault is `280mm 158mm`. Ask only if the user has mentioned length or density constraints.\n\n| Size | When |\n|---|---|\n| `280mm 158mm` | Default; fits most decks |\n| `297mm 167mm` | User wants a bit more room |\n| `338mm 190mm` | Heavy content slide or many data points per page |\n\n### Content pre-flight\n\nBefore drafting any slide, confirm these points with the user. Ask all at once, skip any already answered:\n\n| # | Question |\n|---|---|\n| 1 | **Audience + venue** - who is in the room, and is it live keynote, investor 1:1, or async share link? |\n| 2 | **Length target** - presentation time or slide count? (15 min: ~10 slides \u002F 30 min: ~20 slides \u002F 45 min: ~25-30 slides) |\n| 3 | **Source material** - what content is already ready: outline, doc, notes, data? |\n| 4 | **Images** - are screenshots, charts, logos, or product images available; which slides need real evidence slots; and is a separate visual brief needed? |\n| 5 | **Hard constraints** - brand colors, required logo, PPTX required, any slides that must exist? |\n| 6 | **Format confirmation** - slides deck, or a one-pager that looks like a deck? |\n\nBefore drafting any landing page or product site, lock these points from the source material. Ask once only when a missing item would change the deliverable:\n\n| # | Lock |\n|---|---|\n| 1 | **Product category** - first-viewport category: app, CLI, terminal, utility, skill, template system, or another user-provided label. |\n| 2 | **Real assets** - available product screenshots, logo, icon, or UI captures, mapped to hero\u002Fgallery\u002Ffeature\u002Fsocial slots. Missing assets must stay marked, not replaced with stock imagery. |\n| 3 | **Site shape** - single page, or home plus docs\u002Fhelp\u002Freleases\u002Fchangelog\u002Froadmap\u002Flegal pages? |\n| 4 | **Locales** - exact locale list, canonical paths, and whether a generator\u002Fcheck mode is needed. |\n| 5 | **Truth surfaces** - install path, price, version, support route, FAQ, `llms.txt`, and `llms-full.txt` that must stay synchronized. |\n\n### Content rules for slides\n\n- Ghost deck test: read only the slide titles in order. They must tell the argument; if not, fix titles or structure before styling\n- One evidence shape per slide: chart, table, screenshot, code, quote, or conclusion. Split mixed evidence instead of crowding one slide\n- Audience copy stays clean: titles, body, and captions never contain image prompts, crop instructions, or generation notes\n- No section divider slides: use `.eyebrow` for section numbering, not a dedicated blue-background page\n- No CJK parentheses: replace `（...）` with `·` or `,`\n- Each bullet fits one line: trim until it does\n- 2×2 layouts: use `table.t2x2`, not CSS Grid\n- Pinned conclusions: use `.co` at `position: absolute; bottom: 12mm`\n\nThese rules apply identically to Marp decks. Marp-specific syntax: see `references\u002Fdesign.md` §8 «Marp variant».\n\n## Step 2.7 · Layout note (transparent, non-blocking)\n\nBefore loading specs and filling the template, write a short editor-style note stating the layout intent: template choice, length target, narrative arc, embedded diagrams, material status, and output formats. Match the document's language. Keep it under 80 words, written as prose, not a status panel. Continue immediately after; do not wait.\n\nExample (CN):\n\n> 排版意图：Equity Report 中文版，2 页 A4。先立论与目标价，进入估值 (DCF 与可比公司)，落于催化剂与风险。中段嵌一张营收趋势折线和 FY26 收入桥瀑布。Logo 已就位，产品图暂缺，header 改走纯文字。输出 HTML 与 PDF。\n\nExample (EN):\n\n> Layout intent: Equity Report (EN), two pages A4. Open with thesis and price target, run through valuation (DCF and comparables), close on catalysts and risks. A revenue line chart and an FY26 waterfall sit mid-doc. Logo is in hand; product image is absent, so the header stays text-only. Output: HTML and PDF.\n\nThe note is for transparency, not approval. If the user pushes back, adjust; otherwise proceed to Step 3.\n\n---\n\n## Step 3 · Load the right amount of spec\n\nPick the tier that matches the task. Default to the lowest tier that covers the work.\n\n| Tier | When | Read |\n|---|---|---|\n| **Content-only** | Updating text, swapping bullets, translating an existing doc. CSS stays untouched. | `CHEATSHEET.md` only |\n| **Layout tweak** | Adjusting spacing, moving sections, changing font size within spec. CSS touched. | `CHEATSHEET.md` + template (tokens already inline) |\n| **New document** | Building from scratch or from raw content. | Full design spec + writing spec + template |\n| **Resume content** | Resume-specific bullet structure, project framing, scope-result-outcome rules. | `resume-writing.md` + template |\n| **Sources \u002F materials** | Company, product, market, launch, funding, specs, or branded subject. | `writing.md` source rules + user\u002Fsource material |\n| **Deck (>20 slides)** | Long presentation needing Part Divider, Code Cards, section headers. | Full design spec + Deck Recipe (design.md section 8) |\n| **Troubleshoot** | Rendering bug, font issue, page overflow. | `production.md` (+ design spec if CSS is the cause) |\n| **Anti-patterns** | Reviewing AI-generated drafts before shipping. | `anti-patterns.md` (six-category checklist) |\n| **Diagram** | Embedding SVG in a doc. | `diagrams.md` only (has its own token map) |\n\nYou can always escalate mid-task if the work turns out to need more than the initial tier.\n\nThe full spec files for reference:\n- Design: `references\u002Fdesign.md`\n- Writing (general): `references\u002Fwriting.md`\n- Writing (resume-specific): `references\u002Fresume-writing.md`\n- Production: `references\u002Fproduction.md`\n- Diagrams: `references\u002Fdiagrams.md`\n- Anti-patterns: `references\u002Fanti-patterns.md`\n\n## Step 4 · Fill content into the template\n\n- Copy the template into your working directory; don't write HTML from scratch\n- **CSS stays untouched**, only edit the body\n- Content follows `writing.md`: data over adjectives, distinctive phrasing over industry clichés\n- Avoid patterns listed in `references\u002Fanti-patterns.md`: emptiness, fabrication, mimicry, excess, source gaps, tone contamination\n- **Before filling, read the quality bar for your document type** in `writing.md` section \"Quality bars by document type\". Structure is necessary but not sufficient: a resume bullet needs Action + Scope + Result + Business Outcome; an equity report needs variant perception + quantified catalysts; slides need assertion-evidence titles. Meeting the quality bar is as important as filling every placeholder.\n\n### Do not generate\n\nThese are the most common AI document failures. Cross-reference `references\u002Fanti-patterns.md` for the full list.\n\n- Do not leave placeholder text in the final document (\"Lorem ipsum\", \"[Insert here]\", \"TBD\")\n- Do not invent metrics, financial data, or statistics; mark gaps with `[DATA NEEDED: description]`\n- Do not use stock-image descriptions as image placeholders (\"A diverse team collaborating in a modern office\")\n- Do not pad content to fill template slots (a resume with 3 real projects does not need 5 fabricated ones)\n- Do not write a paragraph that merely restates its own heading in sentence form\n\n### Fill PDF metadata (WeasyPrint reads these into the PDF)\n\nEvery template has meta placeholders in `\u003Chead>`. Fill all four before building:\n\n| Placeholder (CN) | Placeholder (EN) | Rule |\n|---|---|---|\n| `{{作者}}` | `{{AUTHOR}}` | Resume\u002Fletter\u002Fportfolio: use the person's name from the doc. All others: leave as-is (build script infers from git config or env) |\n| `{{摘要}}` | `{{DESCRIPTION}}` | Extract one sentence (≤150 chars) from the first 2 paragraphs |\n| `{{关键词}}` | `{{KEYWORDS}}` | 3-5 keywords from the title + section headings, comma-separated |\n| `{{文档标题}}` \u002F `{{信件主题}}` etc. | `{{DOC_TITLE}}` \u002F `{{LETTER_SUBJECT}}` etc. | Infer from the H1 or `.header .title` text |\n\n`\u003Cmeta name=\"generator\" content=\"Kami\">` is already fixed in the template; do not change it.\n\n**Author inference**: `build.py` automatically sets PDF `\u002FAuthor` metadata from:\n1. `git config user.name` (primary)\n2. `KAMI_AUTHOR` environment variable (fallback)\n3. `\"Kami\"` (final fallback)\n\nFor personal documents (resume\u002Fletter\u002Fportfolio), the HTML `\u003Cmeta name=\"author\">` should match the person's name in the content. For non-personal documents (one-pager\u002Flong-doc), leave the placeholder as-is and let the build script infer it.\n\n## Step 4.1 · Per-page density target (multi-page templates only)\n\n适用：slides-weasy \u002F long-doc \u002F portfolio \u002F equity-report \u002F changelog。不适用 resume \u002F one-pager \u002F letter（这些有独立的长度合约）。\n\n正文页填充率目标 60-80%。封面 \u002F 目录 \u002F 末尾署名页豁免。这条规则解决的是 AI 生成多页文档时最常见的 draft 缺陷：把内容拆得太散，结果几页都填不满。\n\n### Items-per-page contract\n\n| Template | Typical body page | Hard floor (merge if below) |\n|---|---|---|\n| slides-weasy | 1 assertion title + 3-5 supporting items, or 1 chart + 2-3 callouts | \u003C3 items and no chart → merge into adjacent slide |\n| long-doc | 1 chapter heading + 2-4 paragraphs + at most 1 figure | Chapter renders to \u003C40% page → merge into neighbor chapter |\n| portfolio | 1 project header + 1 hero image + 3-5 outcome bullets | No image and \u003C3 outcomes → merge with adjacent project |\n| equity-report | 1 section + 1 table\u002Fchart + supporting prose | Only a 2-row table on the page → combine sections |\n| changelog | 1 version block + 4-8 entries | Version has \u003C4 entries → place on the same page as the prior version |\n\n### Sparse-page merge rule\n\nBefore finalizing, scan the draft. Any body page that would render under 50% full → apply one of, in order:\n\n1. Merge upward into the previous section.\n2. Merge downward into the next section.\n3. Promote a list to a small diagram or table that earns the space.\n4. Pin a `.co` callout to bottom (slides-weasy only). Whitespace above a pinned callout is intentional, not sparse.\n\nForbidden ways to \"fill\" a sparse page: padding with filler prose, repeating the heading as a sentence, inventing statistics, restating the prior page in different words. If the merge options don't apply, the page itself shouldn't exist.\n\n### Last-page exemption\n\nThe last body page is allowed to run 40-60% fill. Forcing balance on the last page usually means padding. The colophon \u002F closing slide may have any fill level.\n\n### Verify after build\n\n```bash\npython3 scripts\u002Fbuild.py --check-density   # flags >25% (WARN) \u002F >50% (SPARSE) trailing whitespace\n```\n\nIf a body page (not cover, not last page) gets a SPARSE warning, treat it as a draft defect and re-author with the merge rule.\n\n## Step 4.5 · Auto-select output format\n\nDo not ask the user which format to export. Decide from context:\n\n| Signal | Output | Why |\n|---|---|---|\n| Any document request | HTML + PDF | PDF is the default deliverable, HTML is the source |\n| Slides \u002F PPT \u002F deck | HTML + PDF + PPTX | Presentations need a projectable format |\n| \"分享\" \u002F \"发朋友圈\" \u002F \"share\" \u002F \"post\" \u002F \"preview\" | + PNG | Social platforms and messaging need images |\n| \"嵌入\" \u002F \"插图\" \u002F \"embed in another doc\" | PNG only | Used as material inside other documents |\n| User explicitly says a format | Follow the user | Explicit request overrides auto-selection |\n\nPDF always ships for document templates. Landing pages ship as a ready-to-serve static HTML file. PPTX follows slides. PNG follows sharing context. The user should never need to think about formats.\n\n## Step 5 · Build & verify\n\n```bash\npython3 scripts\u002Fbuild.py --verify           # build all templates + page count + font check + slides\npython3 scripts\u002Fbuild.py --verify resume-en # single target full verification\npython3 scripts\u002Fbuild.py landing-page        # screen-first static HTML template check\npython3 scripts\u002Fbuild.py --verify slides    # single slide deck verification\npython3 scripts\u002Fbuild.py --check-placeholders path\u002Fto\u002Ffilled.html\npython3 scripts\u002Fbuild.py --check-resume-balance path\u002Fto\u002Fresume.pdf\npython3 scripts\u002Fbuild.py --check-density              # page whitespace scanner (skips cover)\npython3 scripts\u002Fbuild.py --check            # CSS rule violations only (fast, no build)\npython3 scripts\u002Fbuild_metadata.py --check   # Codex plugin mirror + marketplace drift check\n```\n\n> **Screen verify**: `--check-density` is a print gate. For screen output (landing or docs pages) instead screenshot the rendered page at 375px and 1280px in every locale and scan for line widows before shipping. See `references\u002Fdesign.md` Section 11 «Responsive screenshot verification».\n\nSource templates intentionally keep `{{...}}` fields. Run placeholder checks on completed documents, not on the template library.\n\nVisual anomalies (tag double rectangle, font fallback, page break issues) -> `production.md` Part 4.\n\n### Maintainer-mode checks\n\nUse these only when maintaining this repository or release package, not for ordinary document generation.\n\n- If marketplace metadata, generated plugin mirrors, version selection, or install paths change, run `python3 scripts\u002Fbuild_metadata.py --check`; for Codex install behavior, also smoke with an isolated `CODEX_HOME=\u002Ftmp\u002F...` using `codex plugin marketplace add \u003Cpath>`, `codex plugin add kami@kami`, and `codex plugin list`.\n- If `SKILL.md`, templates, scripts, references, or other package inputs change and the behavior ships through the skill package, run `bash scripts\u002Fpackage-skill.sh` and inspect `dist\u002Fkami.zip` before handoff.\n- If a GitHub release asset is refreshed, download the uploaded `kami.zip` and compare ZIP entry names plus per-entry SHA-256 digests against local `dist\u002Fkami.zip`; page text, file size, and the container hash are not enough.\n\n## Fonts\n\n**Chinese**\n- Main serif: TsangerJinKai02-W04.ttf (400 weight) + TsangerJinKai02-W05.ttf (500 weight, real bold)\n- Templates use dual @font-face declarations: W04 for body text, W05 for headings\n- Both files are commercial fonts. Keep them available in the repository for local preview and CDN fallback, but do not bundle them inside Claude Desktop skill ZIPs\n- Fallback chain baked into templates: Source Han Serif SC -> Noto Serif CJK SC -> Songti SC -> STSong -> Georgia\n\n**Japanese (best-effort)**\n- Uses CJK template path, no dedicated `-ja` templates yet\n- JP Mincho-first stack: YuMincho -> Hiragino Mincho ProN -> Noto Serif CJK JP -> Source Han Serif JP -> TsangerJinKai02 -> serif\n- Visually verify line breaks, punctuation rhythm, and emphasis weight before shipping\n\n**Korean (best-effort)**\n- Dedicated `-ko` templates use Source Han Serif K Regular \u002F Medium, with the real OTF family name `Source Han Serif KR` kept in every fallback stack\n- Fallback: Noto Serif KR \u002F Apple SD Gothic Neo \u002F AppleMyungjo \u002F Charter \u002F Georgia\n- The OTFs are OFL-licensed and tracked for local preview \u002F CDN fallback, but excluded from Claude Desktop skill ZIPs to keep the package small\n\n**English**\n- Single serif: Charter (system-bundled, macOS\u002FiOS), used for both headlines and body\n- No separate sans: `--sans: var(--serif)`, one font per page\n- Fallback: Georgia (cross-platform) \u002F Palatino \u002F Times New Roman\n\nFont files next to HTML with relative `@font-face` paths is the most stable setup. `scripts\u002Fpackage-skill.sh` excludes large CJK font files from the Claude Desktop ZIP, so the uploaded package stays under the 6MB package ceiling. Always upload that `package-skill.sh` output, never a hand-zipped checkout (the tracked CJK fonts make it too large and Claude Desktop rejects the upload).\n\n**Font auto-recovery (Claude Desktop)**\n\nBefore building Chinese or Korean documents, ensure fonts are present. The script tries multiple CDN sources with retry and size validation:\n\n```bash\nbash scripts\u002Fensure-fonts.sh\n```\n\nIt downloads to the XDG user font dir (`${XDG_DATA_HOME:-~\u002F.local\u002Fshare}\u002Ffonts\u002Fkami`, override with `KAMI_FONT_DIR`), **not** into the skill's `assets\u002Ffonts` -- that keeps the installed skill small so Claude Desktop never trips its size limit. fontconfig scans that dir by default, so WeasyPrint finds `TsangerJinKai02` and `Source Han Serif K` there; online renders fall back to the jsDelivr `@font-face` URL. Run once before building. If all sources fail, the script prints per-language alternatives.\n\n## Feedback protocol\n\nWhen the user gives **vague visual feedback** (\"looks off\", \"太挤了\", \"not elegant\"), do not guess. Ask back with current values:\n\n| User says | Ask about |\n|---|---|\n| \"太挤了\" \u002F \"too cramped\" | Which element? Line-height (current: X)? Padding (current: Y)? Page margin? |\n| \"太松了\" \u002F \"too loose\" | Same direction, reversed |\n| \"颜色不对\" \u002F \"color feels wrong\" | Which element? Brand blue overused? A gray reading too cool? |\n| \"不够好看\" \u002F \"not polished\" | Font rendering? Alignment? Whitespace distribution? Hierarchy unclear? |\n| \"看着不专业\" \u002F \"unprofessional\" | Content wording? Or layout (alignment, consistency)? |\n\nTemplate response: \"X is currently set to Y. Would you like (a) [specific alternative within spec] or (b) [another option]?\"\n\nNever say \"I'll adjust the spacing\" without naming the exact property and its new value.\n\n---\n\n## When not to use this skill\n\n- User explicitly wants Material \u002F Fluent \u002F Tailwind default - different design language\n- Need dark \u002F cyberpunk \u002F futurist aesthetic (this is deliberately anti-future)\n- Need saturated multi-color (this has one accent)\n- Need cartoon \u002F animation \u002F illustration style (this is editorial)\n- Web dynamic app UI (this is for print \u002F static documents)\n\n---\n\nNext: **apply Step 3's tier table to decide what to read**, then copy the matching template and start filling.\n","# kami · 紙\n\n**紙 · かみ** - the paper your deliverables land on.\n\nGood content deserves good paper. One design language across eight document types: warm parchment canvas, ink-blue accent, serif-led hierarchy, tight editorial rhythm.\n\nPart of `Kaku · Waza · Kami` - Kaku writes code, Waza drills habits, **Kami delivers documents**.\n\n**Update check (non-blocking).** At the start of a task, run `bash scripts\u002Fcheck-update.sh`. It does a read-only version check at most once per day and prints one line when a newer kami is available; relay that line to the user, then continue. It sends no data, and fails silently when offline, sandboxed, or without `curl`. Never let it block the work.\n\n## Step 0 · Load brand profile (if exists)\n\nCheck `~\u002F.config\u002Fkami\u002Fbrand.md` (preferred) or `~\u002F.kami\u002Fbrand.md` (legacy fallback). If found, read `references\u002Fbrand-profile.md` for the full four-layer application spec (placeholder substitution, session defaults, visual customization, habit notes) and its six guardrails. If no profile exists, continue without interruption.\n\nKey rule: explicit prompt > editorial judgment > habit notes > frontmatter defaults > built-in defaults. Profile fills gaps silently; it never overrides the current conversation.\n\n## Step 0.5 · User project style scan (opt-in)\n\nRun this only when the user explicitly references a sibling project as a visual reference: \"like my \u003Cproject> site\", \"match the style of \u003Crepo>\", \"use the look from \u003Cdirectory>\". Skip silently when no such reference exists.\n\nWhen triggered, before generating:\n\n1. Locate the referenced project's style files:\n   ```bash\n   find \u003Creferenced-path> -maxdepth 4 \\( -name \"*.css\" -o -name \"tailwind.config.*\" -o -name \"theme.*\" -o -name \"tokens.*\" \\) | head -20\n   ```\n2. Extract: dominant color values (hex \u002F hsl), font stack, spacing scale, border-radius scale. Prefer values declared in CSS variables or design tokens over inline literals.\n3. Merge into the in-session brand profile as Layer C (visual customization), not Layer B (session defaults). Do not override an explicit `--brand` flag or values that the user typed in this turn.\n4. Report back in one line before continuing: \"scanned \u003Cproject>, extracted N colors \u002F M fonts; using as visual reference.\"\n\nSkip and fall back to the brand profile defaults if the referenced path does not exist, no CSS-like files are found, or the extraction would conflict with the user's explicit values in the current message.\n\n---\n\n## Step 1 · Decide the language\n\n**Match the user's language.** Chinese -> `*.html` \u002F `slides-weasy.html`. English -> `*-en.html` \u002F `slides-weasy-en.html`. Japanese -> CJK path (`.html` \u002F `slides-weasy.html`) as best-effort, JP Mincho first, visual QA before shipping. Korean -> dedicated `*-ko.html` \u002F `slides-weasy-ko.html` family as best-effort, visual QA before shipping. Reference docs are shared English specs.\n\nWhen ambiguous (e.g. a one-word command like \"resume\"), ask a one-liner rather than guess.\n\n| User language | HTML templates | Slides (PDF default) | Slides (PPTX fallback) |\n|---|---|---|---|\n| Chinese (primary) | `*.html` | `slides-weasy.html` | `slides.py` |\n| English | `*-en.html` | `slides-weasy-en.html` | `slides-en.py` |\n| Japanese (best-effort) | `*.html` | `slides-weasy.html` | `slides.py` |\n| Korean (best-effort) | `*-ko.html` | `slides-weasy-ko.html` | n\u002Fa (use `slides-en.py` only if PPTX is required) |\n| Other languages (best-effort) | choose CJK or EN path by script coverage, then verify manually | choose `slides-weasy.html` or `slides-weasy-en.html`, then verify manually | use `slides.py` \u002F `slides-en.py` only if PPTX is required |\n\n> Default to the WeasyPrint HTML path; fall back to PPTX (`slides*.py`) only when the user explicitly needs an editable deck.\n\nAlways use `CHEATSHEET.md` and `references\u002F*.md` for design, writing, production, and diagram guidance.\n\nCode blocks with `class=\"language-*\"` are highlighted only when optional `Pygments` is installed in the build environment. Without it, PDFs still render and code blocks stay monochrome.\n\n## Step 1.5 · Intent extraction (silent checklist)\n\nBefore choosing a template, verify these four dimensions are clear. Do not ask unless 2+ are missing and cannot be inferred from context.\n\n| Dimension | What to extract | Example |\n|---|---|---|\n| **Purpose** | Why this document exists | Persuade investor vs. align internal team vs. close a candidate |\n| **Audience** | Who reads it, what they already know | Technical CTO (skip basics) vs. non-technical board (explain terms) |\n| **Constraint** | Hard limits on length, format, tone, or delivery | \"One page max\", \"formal English\", \"print-ready A4\" |\n| **Success** | What outcome counts as success | They schedule a meeting \u002F they approve the budget \u002F they understand the architecture |\n\nRules:\n- If the conversation already answered a dimension, skip it silently.\n- If a dimension can be inferred from the document type (e.g. resume purpose is always \"get an interview\"), skip it.\n- If 2+ dimensions are genuinely unclear, ask in a single compact question (max 2 sub-questions).\n- Never ask all four as a checklist. This is a background verification, not a form.\n\n## Execution contract\n\nBefore creating or modifying an output, lock the contract: language, template, output format, page or length target, visual acceptance check, and verification command. Infer from the user's request when clear; ask only when missing fields materially change the deliverable.\n\nUse the nearest existing template and verification path. Do not add a new template, shared CSS layer, dependency, script flag, or optional mode unless the current request cannot be satisfied without it.\n\nIf a change touches `SKILL.md`, templates, scripts, references, or package inputs, decide whether `dist\u002Fkami.zip` must be refreshed before handoff. Shipped behavior is not ready until the package contains the changed files.\n\n---\n\n## Step 2 · Pick the document type\n\n| User says | Document | CN template | EN template | KO template |\n|---|---|---|---|---|\n| \"one-pager \u002F 方案 \u002F 执行摘要 \u002F exec summary\" | One-Pager | `one-pager.html` | `one-pager-en.html` | `one-pager-ko.html` |\n| \"white paper \u002F 白皮书 \u002F 长文 \u002F 年度总结 \u002F technical report\" | Long Doc | `long-doc.html` | `long-doc-en.html` | `long-doc-ko.html` |\n| \"formal letter \u002F 信件 \u002F 辞职信 \u002F 推荐信 \u002F memo\" | Letter | `letter.html` | `letter-en.html` | `letter-ko.html` |\n| \"portfolio \u002F 作品集 \u002F case studies\" | Portfolio | `portfolio.html` | `portfolio-en.html` | `portfolio-ko.html` |\n| \"resume \u002F CV \u002F 简历 \u002F 履歴書\" | Resume | `resume.html` | `resume-en.html` | `resume-ko.html` |\n| \"slides \u002F PPT \u002F deck \u002F 演示\" | Slides | `slides-weasy.html` | `slides-weasy-en.html` | `slides-weasy-ko.html` |\n| \"个股研报 \u002F equity report \u002F 估值分析 \u002F investment memo \u002F 股票分析\" | Equity Report | `equity-report.html` | `equity-report-en.html` | `equity-report-ko.html` |\n| \"更新日志 \u002F changelog \u002F release notes \u002F 版本记录\" | Changelog | `changelog.html` | `changelog-en.html` | `changelog-ko.html` |\n| \"landing page \u002F 落地页 \u002F 官网 \u002F product page \u002F 产品页\" | Landing Page | `landing-page.html` | `landing-page-en.html` | `landing-page-ko.html` |\n\n> **Changelog vs. release notes**: The changelog template above is for styled document output. GitHub release notes are a separate deliverable; use `\u002Fwrite` with Release Note Template Mode.\n\n> **Landing Page**: Screen-first interactive template. No PDF output. Includes gallery carousel with auto-rotate, hero entrance animation, responsive breakpoints (880px \u002F 480px), and prefers-reduced-motion support. Deploy as static HTML to Vercel \u002F Netlify \u002F any host. The agent fills {{PLACEHOLDER}} values and HTML comment blocks, then saves as a ready-to-serve `.html` file.\n\n> **Landing Page companion files**: For a production multilingual deploy, copy the five `landing-page-*.example` files alongside the main HTML, remove the `.example` suffix, and fill the placeholders. They cover Vercel rewrites and headers, sitemap hreflang, robots AI allowlist, and llms.txt + llms-full.txt for AI assistants. The main HTML already ships matching hreflang and og:locale in `\u003Chead>`; an Accept-Language redirect at the end of `landing-page-en.html` is commented out for opt-in. `{{SITE_ORIGIN}}` is the scheme + host of your `{{CANONICAL_URL}}` (e.g. `https:\u002F\u002Fexample.com`). See `references\u002Fdesign.md` Section 11 «Companion assets».\n\n> **Production product site mode**: If the user needs docs, help, releases, changelog, roadmap, legal pages, or more than two locales, treat it as a site system. Lock product category, real screenshot slots, locale list, companion files, long-content pages, and generator\u002Fcheck needs before filling templates. Keep project-specific release artifacts, payment providers, appcast rules, and private local paths out of Kami. See `references\u002Fdesign.md` Section 11 «Product site system».\n\n> **Documentation pages**: When a landing page grows into a docs or help site, use the doc shell in `references\u002Fdesign.md` Section 11 «Documentation site»: a sticky sidebar nav with a 2px brand rail (not a dark underline), an on-this-page TOC hidden below the tablet breakpoint, a constrained prose measure, and a quiet borderless prev\u002Fnext pager (text links, not bordered cards). Highlight code at build time with zero runtime JS on a dark code surface; plain code stays the source of truth.\n\n> Slides: default to `slides-weasy.html` \u002F `slides-weasy-en.html` \u002F `slides-weasy-ko.html` (WeasyPrint HTML → PDF). Use `slides.py` \u002F `slides-en.py` only when the user explicitly requires an editable PPTX file. Use `assets\u002Ftemplates\u002Fmarp\u002Fslides-marp(.md|.css)` only when the user explicitly asks for Marp \u002F markdown slides \u002F a deck that lives in a `.md` file.\n\n> Deck recipe: read design.md Section 8 before drafting slides. Sketch title sequence, evidence shape, and image slot before generating or cropping visuals. Keep audience copy separate from visual briefs. Marp-specific constraints live in design.md §8 «Marp variant».\n\n### Decision tree (use before asking)\n\nWalk this tree before reaching for a one-liner question. Ask only when two cells genuinely both fit.\n\n| Signal | Document |\n|---|---|\n| Length target unknown | Ask \"how many pages\" before classifying |\n| ≤ 1 page + investor \u002F recruiter \u002F exec summary audience | one-pager |\n| ≤ 1 page + formal correspondence (sales, hiring, resignation, memo) | letter |\n| 1.5-2 pages + career narrative + project bullets | resume |\n| 3-6 pages + project showcase + visual heavy | portfolio |\n| 6-15 pages + sustained argument + low visual density | long-doc |\n| Presentation flow + speaker support + per-slide assertion | slides |\n| Financial \u002F metrics dashboard + thesis + price or risk view | equity-report |\n| Version-by-version log + release facts | changelog |\n| Product showcase + pricing + screenshots + FAQ for browser | landing-page |\n\nAmbiguity examples that justify a one-liner:\n- \"1.5 page career story with heavy visuals\" -> ask \"resume or portfolio?\"\n- \"2 page exec summary with metric tiles\" -> ask \"one-pager or equity-report?\"\n- \"5 page argument with several charts\" -> ask \"long-doc or portfolio?\"\n\nPick from the tree first. Ask only when the tree is genuinely silent.\n\n### Diagrams (primitives, not a separate template type)\n\nWhen the user asks for **a diagram inside** a long-doc \u002F portfolio \u002F slide (not a standalone document), route to `assets\u002Fdiagrams\u002F` rather than a template:\n\n| User says | Diagram | Template |\n|---|---|---|\n| \"架构图 \u002F architecture \u002F 系统图 \u002F components diagram\" | Architecture | `assets\u002Fdiagrams\u002Farchitecture.html` |\n| \"流程图 \u002F flowchart \u002F 决策流 \u002F branching logic\" | Flowchart | `assets\u002Fdiagrams\u002Fflowchart.html` |\n| \"象限图 \u002F quadrant \u002F 优先级矩阵 \u002F 2×2 matrix\" | Quadrant | `assets\u002Fdiagrams\u002Fquadrant.html` |\n| \"柱状图 \u002F bar chart \u002F 分类对比 \u002F grouped bars\" | Bar Chart | `assets\u002Fdiagrams\u002Fbar-chart.html` |\n| \"折线图 \u002F line chart \u002F 趋势 \u002F 股价 \u002F time series\" | Line Chart | `assets\u002Fdiagrams\u002Fline-chart.html` |\n| \"环形图 \u002F donut \u002F pie \u002F 占比 \u002F 分布结构\" | Donut Chart | `assets\u002Fdiagrams\u002Fdonut-chart.html` |\n| \"状态机 \u002F state machine \u002F 状态图 \u002F lifecycle\" | State Machine | `assets\u002Fdiagrams\u002Fstate-machine.html` |\n| \"时间线 \u002F timeline \u002F 里程碑 \u002F milestones \u002F roadmap\" | Timeline | `assets\u002Fdiagrams\u002Ftimeline.html` |\n| \"泳道图 \u002F swimlane \u002F 跨角色流程 \u002F cross-team flow\" | Swimlane | `assets\u002Fdiagrams\u002Fswimlane.html` |\n| \"树状图 \u002F tree \u002F hierarchy \u002F 层级 \u002F 组织架构\" | Tree | `assets\u002Fdiagrams\u002Ftree.html` |\n| \"分层图 \u002F layer stack \u002F 分层架构 \u002F OSI \u002F stack\" | Layer Stack | `assets\u002Fdiagrams\u002Flayer-stack.html` |\n| \"维恩图 \u002F venn \u002F 交集 \u002F overlap \u002F 集合关系\" | Venn | `assets\u002Fdiagrams\u002Fvenn.html` |\n| \"K 线 \u002F candlestick \u002F OHLC \u002F 股价走势 \u002F price history\" | Candlestick | `assets\u002Fdiagrams\u002Fcandlestick.html` |\n| \"瀑布图 \u002F waterfall \u002F 收入桥 \u002F revenue bridge \u002F decomposition\" | Waterfall | `assets\u002Fdiagrams\u002Fwaterfall.html` |\n\nRead `references\u002Fdiagrams.md` before drawing - it has the selection guide, kami token map, and the AI-slop anti-pattern table. Extract the `\u003Csvg>` block from the template and drop it into a `\u003Cfigure>` inside long-doc \u002F portfolio.\n\nBefore drawing, always ask: **would a well-written paragraph teach the reader less than this diagram?** If no, don't draw.\n\n**Auto-select charts from data.** When content contains numerical data, choose the chart type and embed it without waiting for the user to specify. Decision tree (first match wins):\n\n| Data shape | Chart |\n|---|---|\n| Has open\u002Fhigh\u002Flow\u002Fclose fields, or per-day price | Candlestick |\n| Has + and - contributions that sum to a total (bridge, waterfall, P&L) | Waterfall |\n| One series, values sum to ~100%, items ≤ 6 | Donut |\n| One series, values sum to ~100%, items ≥ 7 | Horizontal bar |\n| Two or more series across time (months, quarters, years) | Line |\n| One series across time, large count changes dominate (not rate) | Bar |\n| Multiple categories, same time snapshot, 2+ series | Grouped bar |\n| 2×2 strategic or priority positioning | Quadrant |\n| Hierarchical data with depth ≥ 2 | Tree |\n| Process with decision branches | Flowchart |\n| Cross-team or cross-role process with ≥ 3 actors | Swimlane |\n| Set overlaps or shared attributes between 2-3 groups | Venn |\n| Category comparison, single series, no time axis | Bar |\n\nWhen data fits multiple types, prefer the one that shows variance most clearly. Always embed inside a `\u003Cfigure>` with a caption that states the insight, not just the data range.\n\n## Step 2.1 · Source and material pass\n\nRun this before distilling or filling content when the document depends on facts or materials outside the user's draft. Skip it only for personal drafts where the user already supplied everything needed.\n\n### Source check\n\nTrigger when the document mentions a specific company, product, person, release date, version, funding round, metric, market fact, technical spec, or any current fact likely to change.\n\n- Use primary sources before writing: user-provided material, official site, docs, filings, press release, app store page, or repo release\n- Keep a short note of source names and dates for facts that drive the document\n- If sources conflict or a fact cannot be checked quickly, ask the user instead of choosing silently\n- Avoid current-sounding claims such as \"latest\", \"recent\", \"new\", version numbers, launch dates, or financial figures unless they are checked\n\n### Material check\n\nTrigger when the document is about a company, product, project, venue, or personal brand.\n\nConfirm the materials that make the subject recognizable before layout:\n\n| Need | Required when | Accept |\n|---|---|---|\n| Logo | Any branded document | User file or official SVG\u002FPNG |\n| Product image | Physical product \u002F venue \u002F object | Official image, user image, or marked gap |\n| UI screenshot | App \u002F SaaS \u002F website \u002F tool | Current screenshot, official product image, or user capture |\n| Brand colors | Branded one-pager \u002F portfolio \u002F deck | Official value, extracted asset value, or keep kami ink-blue |\n| Fonts | Only if brand typography matters | Official font, close system fallback, or kami default |\n\nIf a required item is missing, use a compact gap table and ask once. Do not replace missing material with generic imagery, approximate logo drawings, or invented values.\n\nLogo fallback: when the request names no logo but the brand profile has a `logo` path, fill the commented `.brand-logo` slot in `one-pager` \u002F `portfolio` \u002F `slides-weasy` per `references\u002Fbrand-profile.md` Layer C. Expand `~` to an absolute path, and if the file is missing or the template has no slot, leave it commented and render without a logo (never insert a broken image). An explicit logo in the current request always wins.\n\n### Materials status block\n\nAfter the material check, output a structured status block before continuing. This is a one-shot transparency display, not a question:\n\n```\nMaterials status:\n- Logo: OK assets\u002Fclient-logo.svg\n- Brand colors: OK #1B365D mapped to --brand\n- Product screenshot: MISSING (proceeding with kami default placeholder)\n- UI screenshot: not required for this doc type\n```\n\nUse `OK`, `MISSING`, or `not required`. If a required item is missing and no user input arrived, ask once with the gap table; otherwise continue silently.\n\n## Step 2.5 · Distill raw content (if applicable)\n\n**Auto-detect whether to distill.** Do not ask the user; judge from the input:\n\n| Skip distill (fill directly) | Run distill |\n|---|---|\n| Content has explicit section labels matching template structure | Raw prose without section structure |\n| Metrics already quantified with units in place | Numbers scattered or implied, not extracted |\n| User wrote \"use this as-is\" \u002F \"直接用这个\" \u002F \"原封不动\" | User pasted multi-source dump (chat \u002F email thread \u002F multiple docs) |\n| Content count matches template (e.g. 4 metrics for 4 metric cards) | Content count mismatches template (too many or too few items) |\n| One coherent voice with consistent claims | Conflicting claims or duplicate facts across sources |\n\nWhen in doubt, run distill. Distill is cheap; rebuilding a misaligned doc is not.\n\nWhen the user hands over **raw material** (meeting notes, brain dump, existing doc in different format, chat transcript, scattered points):\n\n1. **Extract**: pull out every factual claim, number, date, name, source, material reference, and action item\n2. **Classify**: map each extract to the target template's sections (see `references\u002Fwriting.md` for section structure per doc type)\n3. **Gap-check**: list what the template needs but the raw content doesn't have - include missing facts, missing proof, and missing materials\n4. **Ask once**: share the gap table with the user. Do not guess to fill gaps.\n\nExample gap-check:\n\n| Template needs | Found | Missing |\n|---|---|---|\n| 4 metric cards | \"8 years\", \"50-person team\" | 2 more quantifiable results |\n| 3-5 core projects | 2 mentioned | at least 1 more with outcome |\n| Materials | logo file provided | product screenshot source |\n\nThen proceed to Step 2.6 (slides) or the layout note (all other doc types) with structured, distilled content.\n\n## Step 2.6 · Deck pre-flight (slides only)\n\nSkip this step for every doc type except slides.\n\n### Path selection\n\nDefault to the WeasyPrint HTML path. Switch to pptx only if the user explicitly requires an editable PPTX file. Switch to Marp only when the user explicitly asks for Marp \u002F markdown slides.\n\n| Path | Template | When |\n|---|---|---|\n| WeasyPrint HTML → PDF (default) | `slides-weasy.html` \u002F `slides-weasy-en.html` \u002F `slides-weasy-ko.html` | All cases unless PPTX or Marp is required |\n| python-pptx → PPTX (fallback) | `slides.py` \u002F `slides-en.py` | User explicitly requires editable PPTX |\n| Marp Markdown (variant) | `assets\u002Ftemplates\u002Fmarp\u002Fslides-marp.md` (+ `slides-marp.css`) \u002F `slides-marp-en.md` (+ `slides-marp-en.css`) | User explicitly asks for Marp, \"markdown slides\", or a `.md` deck. Shipped `.md` is a working demo of Kami Marp itself; copy it, swap content, keep the structure. Renders via local `marp` CLI; not bundled. |\n\n### Page size\n\nDefault is `280mm 158mm`. Ask only if the user has mentioned length or density constraints.\n\n| Size | When |\n|---|---|\n| `280mm 158mm` | Default; fits most decks |\n| `297mm 167mm` | User wants a bit more room |\n| `338mm 190mm` | Heavy content slide or many data points per page |\n\n### Content pre-flight\n\nBefore drafting any slide, confirm these points with the user. Ask all at once, skip any already answered:\n\n| # | Question |\n|---|---|\n| 1 | **Audience + venue** - who is in the room, and is it live keynote, investor 1:1, or async share link? |\n| 2 | **Length target** - presentation time or slide count? (15 min: ~10 slides \u002F 30 min: ~20 slides \u002F 45 min: ~25-30 slides) |\n| 3 | **Source material** - what content is already ready: outline, doc, notes, data? |\n| 4 | **Images** - are screenshots, charts, logos, or product images available; which slides need real evidence slots; and is a separate visual brief needed? |\n| 5 | **Hard constraints** - brand colors, required logo, PPTX required, any slides that must exist? |\n| 6 | **Format confirmation** - slides deck, or a one-pager that looks like a deck? |\n\nBefore drafting any landing page or product site, lock these points from the source material. Ask once only when a missing item would change the deliverable:\n\n| # | Lock |\n|---|---|\n| 1 | **Product category** - first-viewport category: app, CLI, terminal, utility, skill, template system, or another user-provided label. |\n| 2 | **Real assets** - available product screenshots, logo, icon, or UI captures, mapped to hero\u002Fgallery\u002Ffeature\u002Fsocial slots. Missing assets must stay marked, not replaced with stock imagery. |\n| 3 | **Site shape** - single page, or home plus docs\u002Fhelp\u002Freleases\u002Fchangelog\u002Froadmap\u002Flegal pages? |\n| 4 | **Locales** - exact locale list, canonical paths, and whether a generator\u002Fcheck mode is needed. |\n| 5 | **Truth surfaces** - install path, price, version, support route, FAQ, `llms.txt`, and `llms-full.txt` that must stay synchronized. |\n\n### Content rules for slides\n\n- Ghost deck test: read only the slide titles in order. They must tell the argument; if not, fix titles or structure before styling\n- One evidence shape per slide: chart, table, screenshot, code, quote, or conclusion. Split mixed evidence instead of crowding one slide\n- Audience copy stays clean: titles, body, and captions never contain image prompts, crop instructions, or generation notes\n- No section divider slides: use `.eyebrow` for section numbering, not a dedicated blue-background page\n- No CJK parentheses: replace `（...）` with `·` or `,`\n- Each bullet fits one line: trim until it does\n- 2×2 layouts: use `table.t2x2`, not CSS Grid\n- Pinned conclusions: use `.co` at `position: absolute; bottom: 12mm`\n\nThese rules apply identically to Marp decks. Marp-specific syntax: see `references\u002Fdesign.md` §8 «Marp variant».\n\n## Step 2.7 · Layout note (transparent, non-blocking)\n\nBefore loading specs and filling the template, write a short editor-style note stating the layout intent: template choice, length target, narrative arc, embedded diagrams, material status, and output formats. Match the document's language. Keep it under 80 words, written as prose, not a status panel. Continue immediately after; do not wait.\n\nExample (CN):\n\n> 排版意图：Equity Report 中文版，2 页 A4。先立论与目标价，进入估值 (DCF 与可比公司)，落于催化剂与风险。中段嵌一张营收趋势折线和 FY26 收入桥瀑布。Logo 已就位，产品图暂缺，header 改走纯文字。输出 HTML 与 PDF。\n\nExample (EN):\n\n> Layout intent: Equity Report (EN), two pages A4. Open with thesis and price target, run through valuation (DCF and comparables), close on catalysts and risks. A revenue line chart and an FY26 waterfall sit mid-doc. Logo is in hand; product image is absent, so the header stays text-only. Output: HTML and PDF.\n\nThe note is for transparency, not approval. If the user pushes back, adjust; otherwise proceed to Step 3.\n\n---\n\n## Step 3 · Load the right amount of spec\n\nPick the tier that matches the task. Default to the lowest tier that covers the work.\n\n| Tier | When | Read |\n|---|---|---|\n| **Content-only** | Updating text, swapping bullets, translating an existing doc. CSS stays untouched. | `CHEATSHEET.md` only |\n| **Layout tweak** | Adjusting spacing, moving sections, changing font size within spec. CSS touched. | `CHEATSHEET.md` + template (tokens already inline) |\n| **New document** | Building from scratch or from raw content. | Full design spec + writing spec + template |\n| **Resume content** | Resume-specific bullet structure, project framing, scope-result-outcome rules. | `resume-writing.md` + template |\n| **Sources \u002F materials** | Company, product, market, launch, funding, specs, or branded subject. | `writing.md` source rules + user\u002Fsource material |\n| **Deck (>20 slides)** | Long presentation needing Part Divider, Code Cards, section headers. | Full design spec + Deck Recipe (design.md section 8) |\n| **Troubleshoot** | Rendering bug, font issue, page overflow. | `production.md` (+ design spec if CSS is the cause) |\n| **Anti-patterns** | Reviewing AI-generated drafts before shipping. | `anti-patterns.md` (six-category checklist) |\n| **Diagram** | Embedding SVG in a doc. | `diagrams.md` only (has its own token map) |\n\nYou can always escalate mid-task if the work turns out to need more than the initial tier.\n\nThe full spec files for reference:\n- Design: `references\u002Fdesign.md`\n- Writing (general): `references\u002Fwriting.md`\n- Writing (resume-specific): `references\u002Fresume-writing.md`\n- Production: `references\u002Fproduction.md`\n- Diagrams: `references\u002Fdiagrams.md`\n- Anti-patterns: `references\u002Fanti-patterns.md`\n\n## Step 4 · Fill content into the template\n\n- Copy the template into your working directory; don't write HTML from scratch\n- **CSS stays untouched**, only edit the body\n- Content follows `writing.md`: data over adjectives, distinctive phrasing over industry clichés\n- Avoid patterns listed in `references\u002Fanti-patterns.md`: emptiness, fabrication, mimicry, excess, source gaps, tone contamination\n- **Before filling, read the quality bar for your document type** in `writing.md` section \"Quality bars by document type\". Structure is necessary but not sufficient: a resume bullet needs Action + Scope + Result + Business Outcome; an equity report needs variant perception + quantified catalysts; slides need assertion-evidence titles. Meeting the quality bar is as important as filling every placeholder.\n\n### Do not generate\n\nThese are the most common AI document failures. Cross-reference `references\u002Fanti-patterns.md` for the full list.\n\n- Do not leave placeholder text in the final document (\"Lorem ipsum\", \"[Insert here]\", \"TBD\")\n- Do not invent metrics, financial data, or statistics; mark gaps with `[DATA NEEDED: description]`\n- Do not use stock-image descriptions as image placeholders (\"A diverse team collaborating in a modern office\")\n- Do not pad content to fill template slots (a resume with 3 real projects does not need 5 fabricated ones)\n- Do not write a paragraph that merely restates its own heading in sentence form\n\n### Fill PDF metadata (WeasyPrint reads these into the PDF)\n\nEvery template has meta placeholders in `\u003Chead>`. Fill all four before building:\n\n| Placeholder (CN) | Placeholder (EN) | Rule |\n|---|---|---|\n| `{{作者}}` | `{{AUTHOR}}` | Resume\u002Fletter\u002Fportfolio: use the person's name from the doc. All others: leave as-is (build script infers from git config or env) |\n| `{{摘要}}` | `{{DESCRIPTION}}` | Extract one sentence (≤150 chars) from the first 2 paragraphs |\n| `{{关键词}}` | `{{KEYWORDS}}` | 3-5 keywords from the title + section headings, comma-separated |\n| `{{文档标题}}` \u002F `{{信件主题}}` etc. | `{{DOC_TITLE}}` \u002F `{{LETTER_SUBJECT}}` etc. | Infer from the H1 or `.header .title` text |\n\n`\u003Cmeta name=\"generator\" content=\"Kami\">` is already fixed in the template; do not change it.\n\n**Author inference**: `build.py` automatically sets PDF `\u002FAuthor` metadata from:\n1. `git config user.name` (primary)\n2. `KAMI_AUTHOR` environment variable (fallback)\n3. `\"Kami\"` (final fallback)\n\nFor personal documents (resume\u002Fletter\u002Fportfolio), the HTML `\u003Cmeta name=\"author\">` should match the person's name in the content. For non-personal documents (one-pager\u002Flong-doc), leave the placeholder as-is and let the build script infer it.\n\n## Step 4.1 · Per-page density target (multi-page templates only)\n\n适用：slides-weasy \u002F long-doc \u002F portfolio \u002F equity-report \u002F changelog。不适用 resume \u002F one-pager \u002F letter（这些有独立的长度合约）。\n\n正文页填充率目标 60-80%。封面 \u002F 目录 \u002F 末尾署名页豁免。这条规则解决的是 AI 生成多页文档时最常见的 draft 缺陷：把内容拆得太散，结果几页都填不满。\n\n### Items-per-page contract\n\n| Template | Typical body page | Hard floor (merge if below) |\n|---|---|---|\n| slides-weasy | 1 assertion title + 3-5 supporting items, or 1 chart + 2-3 callouts | \u003C3 items and no chart → merge into adjacent slide |\n| long-doc | 1 chapter heading + 2-4 paragraphs + at most 1 figure | Chapter renders to \u003C40% page → merge into neighbor chapter |\n| portfolio | 1 project header + 1 hero image + 3-5 outcome bullets | No image and \u003C3 outcomes → merge with adjacent project |\n| equity-report | 1 section + 1 table\u002Fchart + supporting prose | Only a 2-row table on the page → combine sections |\n| changelog | 1 version block + 4-8 entries | Version has \u003C4 entries → place on the same page as the prior version |\n\n### Sparse-page merge rule\n\nBefore finalizing, scan the draft. Any body page that would render under 50% full → apply one of, in order:\n\n1. Merge upward into the previous section.\n2. Merge downward into the next section.\n3. Promote a list to a small diagram or table that earns the space.\n4. Pin a `.co` callout to bottom (slides-weasy only). Whitespace above a pinned callout is intentional, not sparse.\n\nForbidden ways to \"fill\" a sparse page: padding with filler prose, repeating the heading as a sentence, inventing statistics, restating the prior page in different words. If the merge options don't apply, the page itself shouldn't exist.\n\n### Last-page exemption\n\nThe last body page is allowed to run 40-60% fill. Forcing balance on the last page usually means padding. The colophon \u002F closing slide may have any fill level.\n\n### Verify after build\n\n```bash\npython3 scripts\u002Fbuild.py --check-density   # flags >25% (WARN) \u002F >50% (SPARSE) trailing whitespace\n```\n\nIf a body page (not cover, not last page) gets a SPARSE warning, treat it as a draft defect and re-author with the merge rule.\n\n## Step 4.5 · Auto-select output format\n\nDo not ask the user which format to export. Decide from context:\n\n| Signal | Output | Why |\n|---|---|---|\n| Any document request | HTML + PDF | PDF is the default deliverable, HTML is the source |\n| Slides \u002F PPT \u002F deck | HTML + PDF + PPTX | Presentations need a projectable format |\n| \"分享\" \u002F \"发朋友圈\" \u002F \"share\" \u002F \"post\" \u002F \"preview\" | + PNG | Social platforms and messaging need images |\n| \"嵌入\" \u002F \"插图\" \u002F \"embed in another doc\" | PNG only | Used as material inside other documents |\n| User explicitly says a format | Follow the user | Explicit request overrides auto-selection |\n\nPDF always ships for document templates. Landing pages ship as a ready-to-serve static HTML file. PPTX follows slides. PNG follows sharing context. The user should never need to think about formats.\n\n## Step 5 · Build & verify\n\n```bash\npython3 scripts\u002Fbuild.py --verify           # build all templates + page count + font check + slides\npython3 scripts\u002Fbuild.py --verify resume-en # single target full verification\npython3 scripts\u002Fbuild.py landing-page        # screen-first static HTML template check\npython3 scripts\u002Fbuild.py --verify slides    # single slide deck verification\npython3 scripts\u002Fbuild.py --check-placeholders path\u002Fto\u002Ffilled.html\npython3 scripts\u002Fbuild.py --check-resume-balance path\u002Fto\u002Fresume.pdf\npython3 scripts\u002Fbuild.py --check-density              # page whitespace scanner (skips cover)\npython3 scripts\u002Fbuild.py --check            # CSS rule violations only (fast, no build)\npython3 scripts\u002Fbuild_metadata.py --check   # Codex plugin mirror + marketplace drift check\n```\n\n> **Screen verify**: `--check-density` is a print gate. For screen output (landing or docs pages) instead screenshot the rendered page at 375px and 1280px in every locale and scan for line widows before shipping. See `references\u002Fdesign.md` Section 11 «Responsive screenshot verification».\n\nSource templates intentionally keep `{{...}}` fields. Run placeholder checks on completed documents, not on the template library.\n\nVisual anomalies (tag double rectangle, font fallback, page break issues) -> `production.md` Part 4.\n\n### Maintainer-mode checks\n\nUse these only when maintaining this repository or release package, not for ordinary document generation.\n\n- If marketplace metadata, generated plugin mirrors, version selection, or install paths change, run `python3 scripts\u002Fbuild_metadata.py --check`; for Codex install behavior, also smoke with an isolated `CODEX_HOME=\u002Ftmp\u002F...` using `codex plugin marketplace add \u003Cpath>`, `codex plugin add kami@kami`, and `codex plugin list`.\n- If `SKILL.md`, templates, scripts, references, or other package inputs change and the behavior ships through the skill package, run `bash scripts\u002Fpackage-skill.sh` and inspect `dist\u002Fkami.zip` before handoff.\n- If a GitHub release asset is refreshed, download the uploaded `kami.zip` and compare ZIP entry names plus per-entry SHA-256 digests against local `dist\u002Fkami.zip`; page text, file size, and the container hash are not enough.\n\n## Fonts\n\n**Chinese**\n- Main serif: TsangerJinKai02-W04.ttf (400 weight) + TsangerJinKai02-W05.ttf (500 weight, real bold)\n- Templates use dual @font-face declarations: W04 for body text, W05 for headings\n- Both files are commercial fonts. Keep them available in the repository for local preview and CDN fallback, but do not bundle them inside Claude Desktop skill ZIPs\n- Fallback chain baked into templates: Source Han Serif SC -> Noto Serif CJK SC -> Songti SC -> STSong -> Georgia\n\n**Japanese (best-effort)**\n- Uses CJK template path, no dedicated `-ja` templates yet\n- JP Mincho-first stack: YuMincho -> Hiragino Mincho ProN -> Noto Serif CJK JP -> Source Han Serif JP -> TsangerJinKai02 -> serif\n- Visually verify line breaks, punctuation rhythm, and emphasis weight before shipping\n\n**Korean (best-effort)**\n- Dedicated `-ko` templates use Source Han Serif K Regular \u002F Medium, with the real OTF family name `Source Han Serif KR` kept in every fallback stack\n- Fallback: Noto Serif KR \u002F Apple SD Gothic Neo \u002F AppleMyungjo \u002F Charter \u002F Georgia\n- The OTFs are OFL-licensed and tracked for local preview \u002F CDN fallback, but excluded from Claude Desktop skill ZIPs to keep the package small\n\n**English**\n- Single serif: Charter (system-bundled, macOS\u002FiOS), used for both headlines and body\n- No separate sans: `--sans: var(--serif)`, one font per page\n- Fallback: Georgia (cross-platform) \u002F Palatino \u002F Times New Roman\n\nFont files next to HTML with relative `@font-face` paths is the most stable setup. `scripts\u002Fpackage-skill.sh` excludes large CJK font files from the Claude Desktop ZIP, so the uploaded package stays under the 6MB package ceiling. Always upload that `package-skill.sh` output, never a hand-zipped checkout (the tracked CJK fonts make it too large and Claude Desktop rejects the upload).\n\n**Font auto-recovery (Claude Desktop)**\n\nBefore building Chinese or Korean documents, ensure fonts are present. The script tries multiple CDN sources with retry and size validation:\n\n```bash\nbash scripts\u002Fensure-fonts.sh\n```\n\nIt downloads to the XDG user font dir (`${XDG_DATA_HOME:-~\u002F.local\u002Fshare}\u002Ffonts\u002Fkami`, override with `KAMI_FONT_DIR`), **not** into the skill's `assets\u002Ffonts` -- that keeps the installed skill small so Claude Desktop never trips its size limit. fontconfig scans that dir by default, so WeasyPrint finds `TsangerJinKai02` and `Source Han Serif K` there; online renders fall back to the jsDelivr `@font-face` URL. Run once before building. If all sources fail, the script prints per-language alternatives.\n\n## Feedback protocol\n\nWhen the user gives **vague visual feedback** (\"looks off\", \"太挤了\", \"not elegant\"), do not guess. Ask back with current values:\n\n| User says | Ask about |\n|---|---|\n| \"太挤了\" \u002F \"too cramped\" | Which element? Line-height (current: X)? Padding (current: Y)? Page margin? |\n| \"太松了\" \u002F \"too loose\" | Same direction, reversed |\n| \"颜色不对\" \u002F \"color feels wrong\" | Which element? Brand blue overused? A gray reading too cool? |\n| \"不够好看\" \u002F \"not polished\" | Font rendering? Alignment? Whitespace distribution? Hierarchy unclear? |\n| \"看着不专业\" \u002F \"unprofessional\" | Content wording? Or layout (alignment, consistency)? |\n\nTemplate response: \"X is currently set to Y. Would you like (a) [specific alternative within spec] or (b) [another option]?\"\n\nNever say \"I'll adjust the spacing\" without naming the exact property and its new value.\n\n---\n\n## When not to use this skill\n\n- User explicitly wants Material \u002F Fluent \u002F Tailwind default - different design language\n- Need dark \u002F cyberpunk \u002F futurist aesthetic (this is deliberately anti-future)\n- Need saturated multi-color (this has one accent)\n- Need cartoon \u002F animation \u002F illustration style (this is editorial)\n- Web dynamic app UI (this is for print \u002F static documents)\n\n---\n\nNext: **apply Step 3's tier table to decide what to read**, then copy the matching template and start filling.\n",{"name":5,"description":7},"main","73048d34954caed346162b43d62671e10bc5515d","https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build","https:\u002F\u002Fgithub.com\u002Fprkvw","2026-06-25 16:52:32",{"source":8,"skillName":5,"commands":31,"prompt":41,"zipAvailable":42},[32,35,38],{"tool":33,"command":34},"npx","npx skills add prkvw\u002Frp_build --skill kami",{"tool":36,"command":37},"bunx","bunx skills add prkvw\u002Frp_build --skill kami",{"tool":39,"command":40},"pnpm","pnpm dlx skills add prkvw\u002Frp_build --skill kami","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002FSKILL.md",true,[44,50,54,58,62,66,70,76,80,86,90,94,98,102,106,110,114,118,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,292,296,300,304,308,312,316,320,324,328,332,336,340,344,348,352,356,360,364,368,372,376,380,384,388,392,396,400,404,408,412,416,420,424,428,432,436,440,444,448,452,456,460,466,470,474,478,482,486,490,494,498,502,506,510,514,516,520,524,528,532,536,540,544,548,552,556,560,564,568,572,576,580,584,588,592,596,600,604,608,612,616,620,624,628,632,636,640,644,648,651],{"path":45,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":48,"sourceHtmlUrl":49},".agents\u002Fplugins\u002Fmarketplace.json","REFERENCE","参考文档",346,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002F.agents\u002Fplugins\u002Fmarketplace.json",{"path":51,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":52,"sourceHtmlUrl":53},".claude-plugin\u002Fmarketplace.json",516,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002F.claude-plugin\u002Fmarketplace.json",{"path":55,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":56,"sourceHtmlUrl":57},".claude\u002Flaunch.json",200,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002F.claude\u002Flaunch.json",{"path":59,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":60,"sourceHtmlUrl":61},".github\u002FFUNDING.yml",61,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002F.github\u002FFUNDING.yml",{"path":63,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":64,"sourceHtmlUrl":65},".github\u002Fworkflows\u002Fcheck.yml",2782,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002F.github\u002Fworkflows\u002Fcheck.yml",{"path":67,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":68,"sourceHtmlUrl":69},".github\u002Fworkflows\u002Frelease.yml",2191,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002F.github\u002Fworkflows\u002Frelease.yml",{"path":71,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},".gitignore","OTHER","其他",387,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002F.gitignore",{"path":77,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":78,"sourceHtmlUrl":79},"AGENTS.md",24397,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002FAGENTS.md",{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"assets\u002Fdemos\u002Fdemo-agent-slides.html","ASSET","资产文件",26985,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-agent-slides.html",{"path":87,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":88,"sourceHtmlUrl":89},"assets\u002Fdemos\u002Fdemo-agent-slides.pdf",103283,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-agent-slides.pdf",{"path":91,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":92,"sourceHtmlUrl":93},"assets\u002Fdemos\u002Fdemo-agent-slides.png",187317,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-agent-slides.png",{"path":95,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":96,"sourceHtmlUrl":97},"assets\u002Fdemos\u002Fdemo-changelog.html",7774,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-changelog.html",{"path":99,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":100,"sourceHtmlUrl":101},"assets\u002Fdemos\u002Fdemo-changelog.pdf",104641,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-changelog.pdf",{"path":103,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":104,"sourceHtmlUrl":105},"assets\u002Fdemos\u002Fdemo-changelog.png",283052,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-changelog.png",{"path":107,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":108,"sourceHtmlUrl":109},"assets\u002Fdemos\u002Fdemo-kaku.html",28546,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-kaku.html",{"path":111,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":112,"sourceHtmlUrl":113},"assets\u002Fdemos\u002Fdemo-kaku.pdf",1120836,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-kaku.pdf",{"path":115,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":116,"sourceHtmlUrl":117},"assets\u002Fdemos\u002Fdemo-kaku.png",88619,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-kaku.png",{"path":119,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":120,"sourceHtmlUrl":121},"assets\u002Fdemos\u002Fdemo-letter.html",6369,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-letter.html",{"path":123,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":124,"sourceHtmlUrl":125},"assets\u002Fdemos\u002Fdemo-letter.pdf",110612,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-letter.pdf",{"path":127,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":128,"sourceHtmlUrl":129},"assets\u002Fdemos\u002Fdemo-letter.png",291905,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-letter.png",{"path":131,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":132,"sourceHtmlUrl":133},"assets\u002Fdemos\u002Fdemo-mole-clean.jpg",152425,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-mole-clean.jpg",{"path":135,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":136,"sourceHtmlUrl":137},"assets\u002Fdemos\u002Fdemo-mole.html",7975,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-mole.html",{"path":139,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":140,"sourceHtmlUrl":141},"assets\u002Fdemos\u002Fdemo-mole.pdf",187894,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-mole.pdf",{"path":143,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":144,"sourceHtmlUrl":145},"assets\u002Fdemos\u002Fdemo-mole.png",451237,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-mole.png",{"path":147,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":148,"sourceHtmlUrl":149},"assets\u002Fdemos\u002Fdemo-musk-resume.html",24511,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-musk-resume.html",{"path":151,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":152,"sourceHtmlUrl":153},"assets\u002Fdemos\u002Fdemo-musk-resume.pdf",344140,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-musk-resume.pdf",{"path":155,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":156,"sourceHtmlUrl":157},"assets\u002Fdemos\u002Fdemo-musk-resume.png",427486,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-musk-resume.png",{"path":159,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":160,"sourceHtmlUrl":161},"assets\u002Fdemos\u002Fdemo-resume-ko.html",30702,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-resume-ko.html",{"path":163,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":164,"sourceHtmlUrl":165},"assets\u002Fdemos\u002Fdemo-resume-ko.pdf",606011,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-resume-ko.pdf",{"path":167,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":168,"sourceHtmlUrl":169},"assets\u002Fdemos\u002Fdemo-resume-ko.png",483503,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-resume-ko.png",{"path":171,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":172,"sourceHtmlUrl":173},"assets\u002Fdemos\u002Fdemo-tesla.html",23073,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-tesla.html",{"path":175,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":176,"sourceHtmlUrl":177},"assets\u002Fdemos\u002Fdemo-tesla.pdf",309366,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-tesla.pdf",{"path":179,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":180,"sourceHtmlUrl":181},"assets\u002Fdemos\u002Fdemo-tesla.png",324346,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-tesla.png",{"path":183,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":184,"sourceHtmlUrl":185},"assets\u002Fdemos\u002Fdemo-waza.html",14699,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-waza.html",{"path":187,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":188,"sourceHtmlUrl":189},"assets\u002Fdemos\u002Fdemo-waza.pdf",138932,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-waza.pdf",{"path":191,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":192,"sourceHtmlUrl":193},"assets\u002Fdemos\u002Fdemo-waza.png",277186,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fdemo-waza.png",{"path":195,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":196,"sourceHtmlUrl":197},"assets\u002Fdemos\u002Fimages\u002Fkaku-action.jpg",972008,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fimages\u002Fkaku-action.jpg",{"path":199,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":200,"sourceHtmlUrl":201},"assets\u002Fdemos\u002Fimages\u002Fkaku-hero.jpg",471577,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdemos\u002Fimages\u002Fkaku-hero.jpg",{"path":203,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":204,"sourceHtmlUrl":205},"assets\u002Fdiagrams\u002Farchitecture.html",9355,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Farchitecture.html",{"path":207,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":208,"sourceHtmlUrl":209},"assets\u002Fdiagrams\u002Fbar-chart.html",8501,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Fbar-chart.html",{"path":211,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":212,"sourceHtmlUrl":213},"assets\u002Fdiagrams\u002Fcandlestick.html",10233,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Fcandlestick.html",{"path":215,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":216,"sourceHtmlUrl":217},"assets\u002Fdiagrams\u002Fclass.html",9109,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Fclass.html",{"path":219,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":220,"sourceHtmlUrl":221},"assets\u002Fdiagrams\u002Fdonut-chart.html",7941,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Fdonut-chart.html",{"path":223,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":224,"sourceHtmlUrl":225},"assets\u002Fdiagrams\u002Fer.html",9703,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Fer.html",{"path":227,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":228,"sourceHtmlUrl":229},"assets\u002Fdiagrams\u002Fflowchart.html",7863,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Fflowchart.html",{"path":231,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":232,"sourceHtmlUrl":233},"assets\u002Fdiagrams\u002Flayer-stack.html",8113,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Flayer-stack.html",{"path":235,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":236,"sourceHtmlUrl":237},"assets\u002Fdiagrams\u002Fline-chart.html",10317,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Fline-chart.html",{"path":239,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":240,"sourceHtmlUrl":241},"assets\u002Fdiagrams\u002Fquadrant.html",7855,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Fquadrant.html",{"path":243,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":244,"sourceHtmlUrl":245},"assets\u002Fdiagrams\u002Fsequence.html",6995,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Fsequence.html",{"path":247,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":248,"sourceHtmlUrl":249},"assets\u002Fdiagrams\u002Fsrc\u002Fclass.mmd",241,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Fsrc\u002Fclass.mmd",{"path":251,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":252,"sourceHtmlUrl":253},"assets\u002Fdiagrams\u002Fsrc\u002Fer.mmd",121,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Fsrc\u002Fer.mmd",{"path":255,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":256,"sourceHtmlUrl":257},"assets\u002Fdiagrams\u002Fsrc\u002Fsequence.mmd",184,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Fsrc\u002Fsequence.mmd",{"path":259,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":260,"sourceHtmlUrl":261},"assets\u002Fdiagrams\u002Fstate-machine.html",9711,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Fstate-machine.html",{"path":263,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":264,"sourceHtmlUrl":265},"assets\u002Fdiagrams\u002Fswimlane.html",9026,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Fswimlane.html",{"path":267,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":268,"sourceHtmlUrl":269},"assets\u002Fdiagrams\u002Ftimeline.html",7356,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Ftimeline.html",{"path":271,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":272,"sourceHtmlUrl":273},"assets\u002Fdiagrams\u002Ftree.html",10167,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Ftree.html",{"path":275,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":276,"sourceHtmlUrl":277},"assets\u002Fdiagrams\u002Fvenn.html",5777,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Fvenn.html",{"path":279,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":280,"sourceHtmlUrl":281},"assets\u002Fdiagrams\u002Fwaterfall.html",9150,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fdiagrams\u002Fwaterfall.html",{"path":283,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":284,"sourceHtmlUrl":285},"assets\u002Ffonts\u002FJetBrainsMono.woff2",55672,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ffonts\u002FJetBrainsMono.woff2",{"path":287,"resourceType":288,"resourceTypeDesc":289,"sizeBytes":290,"sourceHtmlUrl":291},"assets\u002Ffonts\u002FLICENSE-SourceHanSerifK.txt","LICENSE","许可证",5120,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ffonts\u002FLICENSE-SourceHanSerifK.txt",{"path":293,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":294,"sourceHtmlUrl":295},"assets\u002Ffonts\u002FTsangerJinKai02-W04.ttf",18948244,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ffonts\u002FTsangerJinKai02-W04.ttf",{"path":297,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":298,"sourceHtmlUrl":299},"assets\u002Ffonts\u002FTsangerJinKai02-W05.ttf",18953516,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ffonts\u002FTsangerJinKai02-W05.ttf",{"path":301,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":302,"sourceHtmlUrl":303},"assets\u002Fillustrations\u002Ftravel-3d-representations.png",2046062,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fillustrations\u002Ftravel-3d-representations.png",{"path":305,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":306,"sourceHtmlUrl":307},"assets\u002Fillustrations\u002Ftravel-spatialvla.png",1870903,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fillustrations\u002Ftravel-spatialvla.png",{"path":309,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":310,"sourceHtmlUrl":311},"assets\u002Fillustrations\u002Ftravel-tesla-optimus.png",1888175,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fillustrations\u002Ftravel-tesla-optimus.png",{"path":313,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":314,"sourceHtmlUrl":315},"assets\u002Fimages\u002Flogo.svg",8869,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fimages\u002Flogo.svg",{"path":317,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":318,"sourceHtmlUrl":319},"assets\u002Fshowcase\u002Fkami-landing.png",2664832,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fshowcase\u002Fkami-landing.png",{"path":321,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":322,"sourceHtmlUrl":323},"assets\u002Fshowcase\u002Fluo-landing.png",2373825,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fshowcase\u002Fluo-landing.png",{"path":325,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":326,"sourceHtmlUrl":327},"assets\u002Fshowcase\u002Fmole-landing.png",3063912,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Fshowcase\u002Fmole-landing.png",{"path":329,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":330,"sourceHtmlUrl":331},"assets\u002Ftemplates\u002Fchangelog-en.html",6780,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fchangelog-en.html",{"path":333,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":334,"sourceHtmlUrl":335},"assets\u002Ftemplates\u002Fchangelog-ko.html",7419,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fchangelog-ko.html",{"path":337,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":338,"sourceHtmlUrl":339},"assets\u002Ftemplates\u002Fchangelog.html",6868,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fchangelog.html",{"path":341,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":342,"sourceHtmlUrl":343},"assets\u002Ftemplates\u002Fequity-report-en.html",13113,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fequity-report-en.html",{"path":345,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":346,"sourceHtmlUrl":347},"assets\u002Ftemplates\u002Fequity-report-ko.html",14972,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fequity-report-ko.html",{"path":349,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":350,"sourceHtmlUrl":351},"assets\u002Ftemplates\u002Fequity-report.html",14206,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fequity-report.html",{"path":353,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":354,"sourceHtmlUrl":355},"assets\u002Ftemplates\u002Flanding-page-en.html",30239,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Flanding-page-en.html",{"path":357,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":358,"sourceHtmlUrl":359},"assets\u002Ftemplates\u002Flanding-page-ko.html",29212,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Flanding-page-ko.html",{"path":361,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":362,"sourceHtmlUrl":363},"assets\u002Ftemplates\u002Flanding-page-llms-full.txt.example",2450,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Flanding-page-llms-full.txt.example",{"path":365,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":366,"sourceHtmlUrl":367},"assets\u002Ftemplates\u002Flanding-page-llms.txt.example",1468,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Flanding-page-llms.txt.example",{"path":369,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":370,"sourceHtmlUrl":371},"assets\u002Ftemplates\u002Flanding-page-robots.txt.example",1128,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Flanding-page-robots.txt.example",{"path":373,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":374,"sourceHtmlUrl":375},"assets\u002Ftemplates\u002Flanding-page-sitemap.xml.example",2403,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Flanding-page-sitemap.xml.example",{"path":377,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":378,"sourceHtmlUrl":379},"assets\u002Ftemplates\u002Flanding-page-vercel.json.example",1109,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Flanding-page-vercel.json.example",{"path":381,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":382,"sourceHtmlUrl":383},"assets\u002Ftemplates\u002Flanding-page.html",28955,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Flanding-page.html",{"path":385,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":386,"sourceHtmlUrl":387},"assets\u002Ftemplates\u002Fletter-en.html",7352,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fletter-en.html",{"path":389,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":390,"sourceHtmlUrl":391},"assets\u002Ftemplates\u002Fletter-ko.html",8756,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fletter-ko.html",{"path":393,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":394,"sourceHtmlUrl":395},"assets\u002Ftemplates\u002Fletter.html",8473,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fletter.html",{"path":397,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":398,"sourceHtmlUrl":399},"assets\u002Ftemplates\u002Flong-doc-en.html",14518,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Flong-doc-en.html",{"path":401,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":402,"sourceHtmlUrl":403},"assets\u002Ftemplates\u002Flong-doc-ko.html",16453,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Flong-doc-ko.html",{"path":405,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":406,"sourceHtmlUrl":407},"assets\u002Ftemplates\u002Flong-doc.html",20641,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Flong-doc.html",{"path":409,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":410,"sourceHtmlUrl":411},"assets\u002Ftemplates\u002Fmarp\u002Fslides-marp-en.css",4804,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fmarp\u002Fslides-marp-en.css",{"path":413,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":414,"sourceHtmlUrl":415},"assets\u002Ftemplates\u002Fmarp\u002Fslides-marp-en.md",3272,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fmarp\u002Fslides-marp-en.md",{"path":417,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":418,"sourceHtmlUrl":419},"assets\u002Ftemplates\u002Fmarp\u002Fslides-marp.css",5674,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fmarp\u002Fslides-marp.css",{"path":421,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":422,"sourceHtmlUrl":423},"assets\u002Ftemplates\u002Fmarp\u002Fslides-marp.md",3295,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fmarp\u002Fslides-marp.md",{"path":425,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":426,"sourceHtmlUrl":427},"assets\u002Ftemplates\u002Fone-pager-en.html",11415,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fone-pager-en.html",{"path":429,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":430,"sourceHtmlUrl":431},"assets\u002Ftemplates\u002Fone-pager-ko.html",12696,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fone-pager-ko.html",{"path":433,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":434,"sourceHtmlUrl":435},"assets\u002Ftemplates\u002Fone-pager.html",12903,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fone-pager.html",{"path":437,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":438,"sourceHtmlUrl":439},"assets\u002Ftemplates\u002Fportfolio-en.html",16740,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fportfolio-en.html",{"path":441,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":442,"sourceHtmlUrl":443},"assets\u002Ftemplates\u002Fportfolio-ko.html",17095,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fportfolio-ko.html",{"path":445,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":446,"sourceHtmlUrl":447},"assets\u002Ftemplates\u002Fportfolio.html",21601,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fportfolio.html",{"path":449,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":450,"sourceHtmlUrl":451},"assets\u002Ftemplates\u002Fresume-en.html",24218,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fresume-en.html",{"path":453,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":454,"sourceHtmlUrl":455},"assets\u002Ftemplates\u002Fresume-ko.html",26761,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fresume-ko.html",{"path":457,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":458,"sourceHtmlUrl":459},"assets\u002Ftemplates\u002Fresume.html",26419,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fresume.html",{"path":461,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":464,"sourceHtmlUrl":465},"assets\u002Ftemplates\u002Fslides-en.py","SCRIPT","脚本",14044,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fslides-en.py",{"path":467,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":468,"sourceHtmlUrl":469},"assets\u002Ftemplates\u002Fslides-weasy-en.html",7725,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fslides-weasy-en.html",{"path":471,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":472,"sourceHtmlUrl":473},"assets\u002Ftemplates\u002Fslides-weasy-ko.html",8824,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fslides-weasy-ko.html",{"path":475,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":476,"sourceHtmlUrl":477},"assets\u002Ftemplates\u002Fslides-weasy.html",12874,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fslides-weasy.html",{"path":479,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":480,"sourceHtmlUrl":481},"assets\u002Ftemplates\u002Fslides.py",15201,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fassets\u002Ftemplates\u002Fslides.py",{"path":483,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":484,"sourceHtmlUrl":485},"CHEATSHEET.md",16840,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002FCHEATSHEET.md",{"path":487,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":488,"sourceHtmlUrl":489},"CLAUDE.md",3411,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002FCLAUDE.md",{"path":491,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":492,"sourceHtmlUrl":493},"index-en.html",485,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Findex-en.html",{"path":495,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":496,"sourceHtmlUrl":497},"index-ja.html",48125,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Findex-ja.html",{"path":499,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":500,"sourceHtmlUrl":501},"index-ko.html",48417,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Findex-ko.html",{"path":503,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":504,"sourceHtmlUrl":505},"index-tw.html",45672,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Findex-tw.html",{"path":507,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":508,"sourceHtmlUrl":509},"index-zh.html",45658,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Findex-zh.html",{"path":511,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":512,"sourceHtmlUrl":513},"index.html",45782,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Findex.html",{"path":288,"resourceType":288,"resourceTypeDesc":289,"sizeBytes":515,"sourceHtmlUrl":16},1061,{"path":517,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":518,"sourceHtmlUrl":519},"llms.txt",1900,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fllms.txt",{"path":521,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":522,"sourceHtmlUrl":523},"plugins\u002Fkami\u002F.codex-plugin\u002Fplugin.json",1315,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fplugins\u002Fkami\u002F.codex-plugin\u002Fplugin.json",{"path":525,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":526,"sourceHtmlUrl":527},"README.md",13744,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002FREADME.md",{"path":529,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":530,"sourceHtmlUrl":531},"references\u002Fanti-patterns.md",9925,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Freferences\u002Fanti-patterns.md",{"path":533,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":534,"sourceHtmlUrl":535},"references\u002Fbrand-profile.md",5627,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Freferences\u002Fbrand-profile.md",{"path":537,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":538,"sourceHtmlUrl":539},"references\u002Fbrand.example.md",2954,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Freferences\u002Fbrand.example.md",{"path":541,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":542,"sourceHtmlUrl":543},"references\u002Fchecks_thresholds.json",337,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Freferences\u002Fchecks_thresholds.json",{"path":545,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":546,"sourceHtmlUrl":547},"references\u002Fdesign.md",65517,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Freferences\u002Fdesign.md",{"path":549,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":550,"sourceHtmlUrl":551},"references\u002Fdiagrams.md",19787,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Freferences\u002Fdiagrams.md",{"path":553,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":554,"sourceHtmlUrl":555},"references\u002Fmermaid-theme.json",1072,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Freferences\u002Fmermaid-theme.json",{"path":557,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":558,"sourceHtmlUrl":559},"references\u002Fmermaid.md",4589,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Freferences\u002Fmermaid.md",{"path":561,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":562,"sourceHtmlUrl":563},"references\u002Fproduction.md",38292,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Freferences\u002Fproduction.md",{"path":565,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":566,"sourceHtmlUrl":567},"references\u002Fresume-writing.md",13489,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Freferences\u002Fresume-writing.md",{"path":569,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":570,"sourceHtmlUrl":571},"references\u002Ftokens.json",507,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Freferences\u002Ftokens.json",{"path":573,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":574,"sourceHtmlUrl":575},"references\u002Fwriting.md",30953,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Freferences\u002Fwriting.md",{"path":577,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":578,"sourceHtmlUrl":579},"robots.txt",708,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Frobots.txt",{"path":581,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":582,"sourceHtmlUrl":583},"scripts\u002Fbuild_metadata.py",10507,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fscripts\u002Fbuild_metadata.py",{"path":585,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":586,"sourceHtmlUrl":587},"scripts\u002Fbuild.py",11518,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fscripts\u002Fbuild.py",{"path":589,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":590,"sourceHtmlUrl":591},"scripts\u002Fcheck-update.sh",1901,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fscripts\u002Fcheck-update.sh",{"path":593,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":594,"sourceHtmlUrl":595},"scripts\u002Fchecks.py",14316,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fscripts\u002Fchecks.py",{"path":597,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":598,"sourceHtmlUrl":599},"scripts\u002Fdraft-release-notes.py",5707,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fscripts\u002Fdraft-release-notes.py",{"path":601,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":602,"sourceHtmlUrl":603},"scripts\u002Fensure-fonts.sh",7562,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fscripts\u002Fensure-fonts.sh",{"path":605,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":606,"sourceHtmlUrl":607},"scripts\u002Fhighlight.py",3728,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fscripts\u002Fhighlight.py",{"path":609,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":610,"sourceHtmlUrl":611},"scripts\u002Flint.py",15881,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fscripts\u002Flint.py",{"path":613,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":614,"sourceHtmlUrl":615},"scripts\u002Fmermaid_normalize.py",13366,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fscripts\u002Fmermaid_normalize.py",{"path":617,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":618,"sourceHtmlUrl":619},"scripts\u002Foptional_deps.py",2559,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fscripts\u002Foptional_deps.py",{"path":621,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":622,"sourceHtmlUrl":623},"scripts\u002Fpackage-skill.sh",1862,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fscripts\u002Fpackage-skill.sh",{"path":625,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":626,"sourceHtmlUrl":627},"scripts\u002Fshared.py",7185,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fscripts\u002Fshared.py",{"path":629,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":630,"sourceHtmlUrl":631},"scripts\u002Ftests\u002Ftest_build.py",38146,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fscripts\u002Ftests\u002Ftest_build.py",{"path":633,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":634,"sourceHtmlUrl":635},"scripts\u002Ftokens.py",3603,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fscripts\u002Ftokens.py",{"path":637,"resourceType":462,"resourceTypeDesc":463,"sizeBytes":638,"sourceHtmlUrl":639},"scripts\u002Fverify.py",10576,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fscripts\u002Fverify.py",{"path":641,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":642,"sourceHtmlUrl":643},"sitemap.xml",1215,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fsitemap.xml",{"path":645,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":646,"sourceHtmlUrl":647},"styles.css",29561,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fstyles.css",{"path":649,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":252,"sourceHtmlUrl":650},"vercel.json","https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fvercel.json",{"path":652,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":653,"sourceHtmlUrl":654},"VERSION",6,"https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002FVERSION",[656,662],{"skillNo":657,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":658,"sourceHtmlUrl":659,"categories":660,"keywords":661,"publishedAt":20},"01M77MMF6MMTTCKS0109WE7T4K","https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fplugins\u002Fkami\u002Fskills\u002Fkami\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Fkami\u002Fplugins\u002Fkami\u002Fskills\u002Fkami\u002FSKILL.md",[],[],{"skillNo":663,"name":664,"nameZh":6,"description":665,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":666,"sourceHtmlUrl":667,"categories":668,"keywords":669,"publishedAt":20},"01M77MKPVWGCF94DBGDVS1M8YA","frontend-slides","Create stunning, animation-rich HTML presentations from scratch or by converting PowerPoint files. Use when the user wants to build a presentation, convert a PPT\u002FPPTX to web, or create slides for a talk\u002Fpitch. Helps non-designers discover their aesthetic through visual exploration rather than abstract choices.","https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Ffrontend-slides\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fprkvw\u002Frp_build\u002Fblob\u002Fmain\u002Ffrontend-slides\u002FSKILL.md",[],[]]