From cbdc2f1c257de9f095cd25c13339a1219f73a6ed Mon Sep 17 00:00:00 2001 From: hapo-nghialuu Date: Thu, 4 Jun 2026 09:47:12 +0700 Subject: [PATCH 1/2] feat(web): refresh cafekit landing copy --- .../components/landing/artifact-preview.tsx | 30 +- .../src/components/landing/features.tsx | 4 +- cafekit-web/src/components/landing/hero.tsx | 19 +- .../landing/interactive-runtime-terminal.tsx | 48 +- .../components/landing/outcome-comparison.tsx | 60 +-- .../landing/runtime-install-surface.tsx | 48 +- cafekit-web/src/lib/landing-translations.ts | 420 ++++++++++-------- .../src/lib/site-shell-translations.ts | 34 +- 8 files changed, 363 insertions(+), 300 deletions(-) diff --git a/cafekit-web/src/components/landing/artifact-preview.tsx b/cafekit-web/src/components/landing/artifact-preview.tsx index 4fb2e04d..b054830a 100644 --- a/cafekit-web/src/components/landing/artifact-preview.tsx +++ b/cafekit-web/src/components/landing/artifact-preview.tsx @@ -7,62 +7,62 @@ import { localizeHref } from "@/lib/locale-utils"; const copy = { en: { - heading: "See the artifacts, not just the commands", + heading: "Real Artifacts after every step", subheading: - "A new user trusts CafeKit faster when they can picture the files and receipts it leaves behind.", + "CafeKit leaves files, registries, and receipts so reviewers can see which tasks are ready and which still lack evidence.", cta: "Open documentation", items: [ { title: "spec.json", - description: "Registry-backed state, validation status, and implementation readiness in one place.", + description: "Machine state for phase, validation status, task registry, and readiness gate.", }, { title: "task-R*.md", - description: "Task packets with objective, completion criteria, and exact verification commands.", + description: "Task packets with objective, scope boundary, completion criteria, and Evidence commands.", }, { title: "review + test verdict", - description: "Structured signals that explain whether work is actually ready to merge and ship.", + description: "Structured verdicts that show whether code is ready for merge, Git handoff, or release.", }, ], }, vi: { - heading: "Hãy nhìn artifact thật, không chỉ nhìn command", + heading: "Artifacts thật sau mỗi bước", subheading: - "Người mới tin CafeKit nhanh hơn khi họ hình dung được file và receipt mà runtime để lại.", + "CafeKit để lại file, registry và receipt để reviewer biết task nào đã sẵn sàng, task nào còn thiếu evidence.", cta: "Mở tài liệu", items: [ { title: "spec.json", - description: "State có registry, validation status và implementation readiness trong một chỗ.", + description: "Machine state cho phase, validation status, task registry và readiness gate.", }, { title: "task-R*.md", - description: "Task packet có objective, completion criteria và exact verification commands.", + description: "Task packet có objective, scope boundary, completion criteria và Evidence commands.", }, { title: "review + test verdict", - description: "Structured signals cho biết code đã thật sự sẵn sàng để merge và ship hay chưa.", + description: "Structured verdict cho biết code đã đủ điều kiện merge, Git handoff hoặc release chưa.", }, ], }, ja: { - heading: "command だけでなく artifact も見せる", + heading: "各ステップ後に残る real Artifacts", subheading: - "新規ユーザーは、runtime が残す file と receipt を見たときに CafeKit をより早く信頼します。", + "CafeKit は files、registry、receipt を残し、reviewer が ready な task と evidence 不足の task を判断できるようにします。", cta: "ドキュメントを見る", items: [ { title: "spec.json", - description: "registry-backed state、validation status、implementation readiness をまとめて保持します。", + description: "phase、validation status、task registry、readiness gate の machine state。", }, { title: "task-R*.md", - description: "objective、completion criteria、exact verification commands を持つ task packet。", + description: "objective、scope boundary、completion criteria、Evidence commands を持つ task packet。", }, { title: "review + test verdict", - description: "merge や ship の準備ができているかを示す structured signal。", + description: "merge、Git handoff、release の準備ができているかを示す structured verdict。", }, ], }, diff --git a/cafekit-web/src/components/landing/features.tsx b/cafekit-web/src/components/landing/features.tsx index 125c0799..110a8e38 100644 --- a/cafekit-web/src/components/landing/features.tsx +++ b/cafekit-web/src/components/landing/features.tsx @@ -82,10 +82,10 @@ export function Features() {
- Active Loop + {t.activeLoopLabel}
- install → specs → develop → test → review → git → deploy + {t.activeLoopValue}
diff --git a/cafekit-web/src/components/landing/hero.tsx b/cafekit-web/src/components/landing/hero.tsx index d6314349..76fad7ff 100644 --- a/cafekit-web/src/components/landing/hero.tsx +++ b/cafekit-web/src/components/landing/hero.tsx @@ -14,11 +14,6 @@ export function Hero() { const t = getLandingTranslations(locale).hero; const [copied, setCopied] = useState(false); const installCommand = "npx @haposoft/cafekit"; - const runtimeStats = [ - { label: "Spec gates", value: "validate first" }, - { label: "Task state", value: "registry-backed" }, - { label: "Docs", value: "checkpoint per task" }, - ] as const; const handleCopy = async () => { try { @@ -59,9 +54,9 @@ export function Hero() {

- Claude Code-first + {t.headingLead} - CafeKit runtime + {t.headingAccent}

@@ -72,7 +67,7 @@ export function Hero() {
- Claude Code available now + {t.availability}
@@ -112,16 +107,16 @@ export function Hero() {
- {runtimeStats.map((item) => ( + {t.runtimeStats.map((item) => (
- {item.label} + {item.title}
- {item.value} + {item.description}
))} diff --git a/cafekit-web/src/components/landing/interactive-runtime-terminal.tsx b/cafekit-web/src/components/landing/interactive-runtime-terminal.tsx index 82f359b4..12fcca47 100644 --- a/cafekit-web/src/components/landing/interactive-runtime-terminal.tsx +++ b/cafekit-web/src/components/landing/interactive-runtime-terminal.tsx @@ -2,6 +2,7 @@ import { RotateCcw } from "lucide-react"; import { useEffect, useRef, useState } from "react"; +import { useLocale } from "@/hooks/use-locale"; import { cn } from "@/lib/utils"; type TerminalLine = { @@ -58,6 +59,33 @@ const steps: TerminalStep[] = [ }, ]; +const terminalCopy = { + en: { + replay: "Replay", + labels: ["Install", "Create spec", "Validate", "Develop", "Test"], + activeLoop: "Active Loop", + activeLoopValue: "specs -> develop -> test", + taskPacket: "Task Packet", + taskName: "R0-02 auth setup", + }, + vi: { + replay: "Chạy lại", + labels: ["Cài đặt", "Tạo spec", "Validate", "Develop", "Test"], + activeLoop: "Vòng chạy", + activeLoopValue: "specs -> develop -> test", + taskPacket: "Task packet", + taskName: "R0-02 auth setup", + }, + ja: { + replay: "Replay", + labels: ["Install", "Create spec", "Validate", "Develop", "Test"], + activeLoop: "Active Loop", + activeLoopValue: "specs -> develop -> test", + taskPacket: "Task Packet", + taskName: "R0-02 auth setup", + }, +} as const; + function lineClasses(kind: TerminalLine["kind"]) { if (kind === "command") return "font-semibold text-[#F2EA9D]"; if (kind === "success") return "text-[#6FD4A2]"; @@ -66,7 +94,9 @@ function lineClasses(kind: TerminalLine["kind"]) { } export function InteractiveRuntimeTerminal() { - const [runToken, setRunToken] = useState(0); + const locale = useLocale(); + const t = terminalCopy[locale] ?? terminalCopy.en; + const [replayCycle, setReplayCycle] = useState(0); const [activeStep, setActiveStep] = useState(0); const [completedStep, setCompletedStep] = useState(-1); const [visibleLines, setVisibleLines] = useState([]); @@ -147,7 +177,7 @@ export function InteractiveRuntimeTerminal() { timersRef.current.forEach((timer) => window.clearTimeout(timer)); timersRef.current = []; }; - }, [runToken]); + }, [replayCycle]); const renderedLines = typingLine ? [ @@ -176,11 +206,11 @@ export function InteractiveRuntimeTerminal() { ~ /cafekit-runtime
@@ -198,7 +228,7 @@ export function InteractiveRuntimeTerminal() { : "border-[#A7C5EE]/12 bg-[#13262A] text-[#8EACD0] hover:border-[#A7C5EE]/24 hover:text-[#DDE9F9]", )} > - {step.label} + {t.labels[index] ?? step.label} ))} @@ -224,13 +254,13 @@ export function InteractiveRuntimeTerminal() {
-
Active Loop
-
specs → develop → test
+
{t.activeLoop}
+
{t.activeLoopValue}
-
Task Packet
-
R0-02 auth setup
+
{t.taskPacket}
+
{t.taskName}
diff --git a/cafekit-web/src/components/landing/outcome-comparison.tsx b/cafekit-web/src/components/landing/outcome-comparison.tsx index 1bbf5f31..a42a16dd 100644 --- a/cafekit-web/src/components/landing/outcome-comparison.tsx +++ b/cafekit-web/src/components/landing/outcome-comparison.tsx @@ -5,60 +5,60 @@ import { useLocale } from "@/hooks/use-locale"; const copy = { en: { - heading: "Why this feels different", + heading: "Differentiators", subheading: - "CafeKit is most compelling when people can see the difference between ad-hoc prompting and a runtime with state.", + "CafeKit does not try to make agents smarter with longer prompts. It puts them inside a runtime with state, artifacts, and gates so progress cannot fake green.", before: "Without CafeKit", after: "With CafeKit", beforeItems: [ - "Long prompts that need to be re-explained every session", - "Specs drift away from implementation after the first coding pass", - "Tasks look done in markdown even when builds or tests are still red", - "Docs updates happen late, inconsistently, or never", + "Every session needs the same context, scope, and approach explained again", + "Specs can drift away from implementation after the first coding pass", + "Tasks can be marked done while build, test, or runtime proof is still missing", + "Docs are often pushed to the end, partially updated, or skipped", ], afterItems: [ - "Specs become runtime artifacts with validation and task boundaries", - "Implementation moves through one verified task packet at a time", - "Quality gates block fake progress before state is synced", - "Docs checkpoints happen incrementally instead of as a last-minute scramble", + "Specs become artifacts with validation, task registry, and readiness gates", + "Implementation moves through task packets with completion criteria and Evidence", + "Quality gates block fake progress before state is synced to done", + "Docs checkpoints run after verified tasks instead of piling up at release time", ], }, vi: { - heading: "Điểm khác biệt thật sự", + heading: "Điểm khác biệt", subheading: - "CafeKit thuyết phục nhất khi người dùng nhìn ra sự khác nhau giữa prompt rời rạc và một runtime có state.", + "CafeKit không cố làm agent thông minh hơn bằng prompt dài. Nó đặt agent vào một runtime có state, artifacts và gates để tiến độ không bị giả xanh.", before: "Không có CafeKit", after: "Có CafeKit", beforeItems: [ - "Prompt dài và phải giải thích lại mỗi session", - "Spec lệch khỏi implementation sau lượt code đầu tiên", - "Task nhìn như xong trong markdown dù build hoặc test vẫn đỏ", - "Docs bị dồn cuối, cập nhật thiếu hoặc không có", + "Mỗi session phải giải thích lại context, scope và cách làm", + "Spec dễ lệch khỏi implementation sau lượt code đầu tiên", + "Task có thể bị mark done dù build, test hoặc runtime proof vẫn thiếu", + "Docs thường bị dồn cuối, cập nhật thiếu hoặc bỏ qua", ], afterItems: [ - "Spec trở thành runtime artifact có validate và task boundary", - "Implementation đi theo từng verified task packet", - "Quality gate chặn fake progress trước khi sync state", - "Docs checkpoint chạy tăng dần thay vì dồn cuối", + "Spec trở thành artifact có validation, task registry và readiness gate", + "Implementation đi theo từng task packet đã có completion criteria và Evidence", + "Quality gate chặn fake progress trước khi sync state sang done", + "Docs checkpoint chạy theo task đã verify thay vì dồn vào cuối release", ], }, ja: { - heading: "何が本当に違うのか", + heading: "差別化ポイント", subheading: - "CafeKit の魅力は、ad-hoc prompt と stateful runtime の差が一目で分かることです。", + "CafeKit は長い prompt で agent を賢く見せるのではなく、state、artifacts、gates を持つ runtime に agent を置き、見せかけの進捗を防ぎます。", before: "CafeKit なし", after: "CafeKit あり", beforeItems: [ - "毎回説明し直す長い prompt に頼る", - "最初の実装後に spec と code がずれていく", - "markdown では done に見えても build や test は赤いまま", - "docs 更新が後回しになりがち", + "毎回の session で context、scope、進め方を説明し直す必要がある", + "最初の coding pass 後に spec と implementation がずれやすい", + "build、test、runtime proof が不足していても task が done に見える", + "docs が最後に回され、部分更新または未更新になりやすい", ], afterItems: [ - "spec が validation と task boundary を持つ runtime artifact になる", - "verified task packet 単位で実装が進む", - "quality gate が fake progress を止めてから state を sync する", - "docs checkpoint が段階的に実行される", + "spec が validation、task registry、readiness gate を持つ artifact になる", + "completion criteria と Evidence を持つ task packet 単位で実装が進む", + "quality gate が fake progress を止めてから state を done に sync する", + "docs checkpoint は release 直前ではなく verified task ごとに実行される", ], }, } as const; diff --git a/cafekit-web/src/components/landing/runtime-install-surface.tsx b/cafekit-web/src/components/landing/runtime-install-surface.tsx index bcea35e7..0084df8b 100644 --- a/cafekit-web/src/components/landing/runtime-install-surface.tsx +++ b/cafekit-web/src/components/landing/runtime-install-surface.tsx @@ -5,88 +5,88 @@ import { useLocale } from "@/hooks/use-locale"; const copy = { en: { - heading: "What gets installed", + heading: "What CafeKit installs into your repo", subheading: - "New users want to know whether CafeKit changes the app or just installs workflow infrastructure. Show that clearly.", + "The installer only adds workflow/runtime infrastructure under `.claude` or `.opencode`. Application code stays untouched until you run a workflow for a real feature.", items: [ { title: ".claude/skills", - description: "The runtime command surface for specs, develop, test, review, git, and sync.", + description: "Skills that create the command surface for question, brainstorm, specs, develop, test, review, docs, sync, and git.", }, { title: ".claude/hooks", - description: "State reminders, privacy guardrails, and runtime context injection around Claude Code.", + description: "Hooks for state/spec drift reminders, sensitive-read blocking, session context injection, and usage updates.", }, { title: ".claude/agents", - description: "Specialist agents for testing, review, docs, sync, and workflow enforcement during delivery.", + description: "Subagents for inspect, spec, develop, test, review, docs, git, and deployment handoff.", }, { title: ".claude/rules", - description: "Execution rules that keep spec state, quality gates, docs sync, and Git handoff aligned.", + description: "Operating rules that keep scope, spec state, quality gates, docs sync, and Git handoff aligned.", }, { title: "Your app code", - description: "Untouched until you intentionally enter the spec and task workflow for a real feature.", + description: "Left unchanged during install. CafeKit touches app code only when you assign a clear implementation task.", }, ], - footer: "No framework lock-in. Works inside an existing repo and tells you what it is doing.", + footer: "No framework lock-in. Re-runs use an ownership manifest to update managed files while preserving your edits.", }, vi: { - heading: "CafeKit cài những gì", + heading: "CafeKit cài gì vào repo", subheading: - "Người mới luôn muốn biết CafeKit có sửa app hay chỉ cài workflow infrastructure. Nên nói thật rất rõ.", + "Installer chỉ cài workflow/runtime infrastructure vào `.claude` hoặc `.opencode`. Code ứng dụng không bị chạm cho đến khi bạn chạy workflow cho một feature thật.", items: [ { title: ".claude/skills", - description: "Command surface cho specs, develop, test, review, git và sync.", + description: "Bộ skill tạo command surface cho question, brainstorm, specs, develop, test, review, docs, sync và git.", }, { title: ".claude/hooks", - description: "State reminders, privacy guardrails và runtime context injection quanh Claude Code.", + description: "Hook nhắc state/spec drift, chặn đọc dữ liệu nhạy cảm, inject context phiên làm việc và cập nhật usage.", }, { title: ".claude/agents", - description: "Các agent chuyên biệt cho test, review, docs, sync và workflow enforcement trong quá trình delivery.", + description: "Subagent chuyên trách inspect, spec, develop, test, review, docs, git và deployment handoff.", }, { title: ".claude/rules", - description: "Rule giữ spec state, quality gate, docs sync và Git handoff đi cùng nhau.", + description: "Rule vận hành giữ scope, spec state, quality gate, docs sync và Git handoff đi cùng nhau.", }, { title: "Code ứng dụng", - description: "Không bị đụng tới cho đến khi bạn chủ động chạy workflow spec và task cho một feature thật.", + description: "Được giữ nguyên trong lúc cài đặt. CafeKit chỉ sửa app khi bạn giao một task implementation rõ ràng.", }, ], - footer: "Không khóa framework. Chạy trong repo sẵn có và nói rõ nó đang làm gì.", + footer: "Không khóa framework. Re-run có ownership manifest để cập nhật file managed nhưng vẫn preserve chỉnh sửa của bạn.", }, ja: { - heading: "何がインストールされるか", + heading: "CafeKit が repo にインストールするもの", subheading: - "新規ユーザーは、CafeKit が app code を変えるのか、workflow infrastructure を入れるだけなのかをまず知りたいです。", + "installer は `.claude` または `.opencode` に workflow/runtime infrastructure だけを追加します。実際の feature workflow を始めるまで app code は変更されません。", items: [ { title: ".claude/skills", - description: "specs、develop、test、review、git、sync の command surface。", + description: "question、brainstorm、specs、develop、test、review、docs、sync、git の command surface を作る skills。", }, { title: ".claude/hooks", - description: "state reminder、privacy guardrail、runtime context injection。", + description: "state/spec drift の reminder、sensitive read の block、session context injection、usage update を担う hooks。", }, { title: ".claude/agents", - description: "test、review、docs、sync、workflow enforcement を担う specialist agent 群。", + description: "inspect、spec、develop、test、review、docs、git、deployment handoff を担う subagents。", }, { title: ".claude/rules", - description: "spec state、quality gate、docs sync、Git handoff を揃える実行ルール。", + description: "scope、spec state、quality gate、docs sync、Git handoff を揃える operating rules。", }, { title: "アプリ本体のコード", - description: "本物の feature で workflow を開始するまで勝手には変更されません。", + description: "install 中は変更されません。CafeKit が app code を触るのは、明確な implementation task を渡した後だけです。", }, ], - footer: "framework lock-in はありません。既存 repo の中で動き、何をしているかを明示します。", + footer: "framework lock-in はありません。re-run 時は ownership manifest により managed files を更新しつつ、user edits を preserve します。", }, } as const; diff --git a/cafekit-web/src/lib/landing-translations.ts b/cafekit-web/src/lib/landing-translations.ts index 5138cb7f..9fb781a5 100644 --- a/cafekit-web/src/lib/landing-translations.ts +++ b/cafekit-web/src/lib/landing-translations.ts @@ -16,8 +16,12 @@ type WorkflowStep = { type LandingTranslations = { hero: { + headingLead: string; + headingAccent: string; badge: string; subtitle: string; + availability: string; + runtimeStats: WorkflowNote[]; readDocs: string; copied: string; copy: string; @@ -26,6 +30,8 @@ type LandingTranslations = { heading: string; subheading: string; workflowLabel: string; + activeLoopLabel: string; + activeLoopValue: string; detailsLabel: string; notesLabel: string; steps: WorkflowStep[]; @@ -77,39 +83,49 @@ type LandingTranslations = { const translations: Record = { en: { hero: { - badge: "Claude Code-first runtime for spec-driven delivery", + headingLead: "CafeKit runtime", + headingAccent: "for verified AI coding", + badge: "Spec-driven runtime installed inside your repo", subtitle: - "Build from approved specs, execute one verified task at a time, and keep project docs aligned. Claude Code is available now.", - readDocs: "Read Documentation", + "Turn ad-hoc prompts into a delivery flow with specs, task boundaries, verification gates, and state sync. Built for Claude Code, with OpenCode support.", + availability: "Ready for Claude Code", + runtimeStats: [ + { title: "Spec gate", description: "validate first" }, + { title: "Task registry", description: "explicit state" }, + { title: "Evidence", description: "proof before done" }, + ], + readDocs: "Read docs", copied: "Copied!", copy: "Copy", }, features: { - heading: "One runtime from first prompt to release", + heading: "From first prompt to verified release", subheading: - "Install the runtime, move through specs, develop, test, review, git handoff, then ship with your existing deploy stack.", - workflowLabel: "Runtime Workflow", - detailsLabel: "What Happens", - notesLabel: "Critical Notes", + "CafeKit installs an operating layer into your repo: create specs, split task packets, implement one task at a time, run test/review, sync state, and hand off release through your existing stack.", + workflowLabel: "Runtime flow", + activeLoopLabel: "Main loop", + activeLoopValue: "install -> specs -> develop -> test -> review -> git -> release", + detailsLabel: "Core mechanics", + notesLabel: "What to lock down", steps: [ { tab: "install", - title: "Install the runtime bundle", + title: "Install the runtime into your repo", description: - "Bootstrap CafeKit into an existing Claude Code project before any feature-specific work begins.", + "Bootstrap CafeKit into a Claude Code or OpenCode project without touching application code.", highlights: [ - "Installs skills, hooks, rules, statusline, and workflow context into .claude.", - "Sets the project up for spec-driven commands instead of ad-hoc prompting.", - "Keeps Claude Code as the primary supported runtime today.", + "Installs skills, agents, hooks, rules, statusline, and workflow context into `.claude` or `.opencode`.", + "Writes version metadata and an ownership manifest so future installs preserve user edits.", + "Moves the repo to a spec-driven command surface instead of relying on long prompts.", ], notes: [ { - title: "Command", + title: "Install command", description: "Run `npx @haposoft/cafekit` in the project root.", }, { title: "Result", - description: "The repo is ready for `hapo:*` workflows immediately.", + description: "The repo is ready to run `hapo:*` workflows with a project-local runtime.", }, ], }, @@ -117,22 +133,22 @@ const translations: Record = { tab: "/hapo:specs", title: "Create the feature contract", description: - "Generate `spec.json`, requirements, design notes, and task packets. Validation is part of this stage before implementation starts.", + "Create `spec.json`, requirements, research, design, and task packets before implementation begins.", highlights: [ - "Creates `specs//` with machine-readable state and task files.", - "Runs reconciliation and validation before handing work to implementation.", - "Locks the runtime contract that develop, test, and sync rely on.", + "Creates `specs//` with machine-readable state, task files, and task registry.", + "Scans in-progress specs and cross-spec dependencies before opening a new scope.", + "Runs the validator to block specs that are not ready for develop handoff.", ], notes: [ { - title: "Validation first", + title: "Required gate", description: - "Treat `/hapo:specs --validate` as part of the specs stage, not an optional afterthought.", + "A spec cannot set `ready_for_implementation` until validation passes.", }, { - title: "Task packets", + title: "Task packet", description: - "Each `task-R*.md` becomes the execution boundary for `hapo:develop`.", + "Each `task-R*.md` is the execution boundary for one verifiable develop pass.", }, ], }, @@ -140,39 +156,40 @@ const translations: Record = { tab: "/hapo:develop", title: "Implement one task packet at a time", description: - "Ship code through a verified task loop instead of coding the whole feature in one pass.", + "Code only after the spec is ready, process one task boundary per pass, and sync state after proof exists.", highlights: [ - "Supports both full-spec orchestration and surgical single-task execution.", - "Uses task boundaries, verification receipts, and registry sync before marking work done.", - "Runs lightweight docs checkpoints after verified tasks.", + "Supports full-spec orchestration or an exact single task file.", + "Scouts the codebase before edits to avoid orphan code, scope drift, and wrong entrypoints.", + "Rejects placeholders, fake adapters, and silent contract swaps as completion proof.", ], notes: [ { title: "Definition of done", - description: "A task is not done unless build, evidence, and review all agree.", + description: + "A task is done only when Completion Criteria and Evidence both have real proof.", }, { - title: "No fake progress", + title: "State sync", description: - "Placeholder scaffolds and scope drift are blocked instead of silently accepted.", + "`spec.json.task_registry` and task markdown must be aligned before returning results.", }, ], }, { tab: "/hapo:test", - title: "Verify with real build and runtime signals", + title: "Verify with real signals", description: - "Run task-aware verification that prioritizes exact commands, prechecks, and runtime proof over shallow green checkmarks.", + "Run exact Evidence commands, prechecks, test suites, and UI verification according to task scope.", highlights: [ - "Runs build, typecheck, test suites, and UI verification depending on task evidence.", - "Treats `PRECHECK_FAIL` as stronger than `NO_TESTS`.", - "Returns a structured verdict instead of a vague success message.", + "Auto-detects the test runner and chooses blast-radius or full suite by context.", + "`NO_TESTS` and `0 tests` are not treated as pass when a task requires automated proof.", + "Returns a structured verdict with scope, failures, coverage, and runtime reachability.", ], notes: [ { title: "Exact commands", description: - "Verification starts from the commands declared in the task packet itself.", + "Verification starts from commands declared in the task packet Evidence.", }, { title: "UI mode", @@ -183,18 +200,18 @@ const translations: Record = { }, { tab: "/hapo:code-review", - title: "Review for regressions and security", + title: "Adversarial review before merge", description: - "Run adversarial review after testing so the final merge candidate is checked for correctness, regressions, and contract drift.", + "Check spec compliance, code quality, security, and regression risk before the candidate moves forward.", highlights: [ - "Findings-first review output keeps focus on real bugs and risk.", - "Flags security, behavior drift, and missing verification evidence.", - "Pairs cleanly with `hapo:test` during the quality gate.", + "Stage 1 compares implementation against spec and task evidence.", + "Stage 2 checks YAGNI, KISS, DRY, maintainability, and test gaps.", + "Stage 3 red-teams security, edge cases, false assumptions, and contract drift.", ], notes: [ { - title: "Review posture", - description: "Assume regressions are possible until evidence proves otherwise.", + title: "Real PASS", + description: "Review passes only with score >= 9.5 and zero Critical findings.", }, { title: "Release gate", @@ -205,13 +222,13 @@ const translations: Record = { }, { tab: "/hapo:git", - title: "Commit and push safely", + title: "Safe commit and handoff", description: - "Use native Git operations for commits, pushes, PR prep, and safe worktree flows once code is verified.", + "Use native Git operations for commit, push, PR prep, and worktree flow after code is verified.", highlights: [ - "Supports `commit`, `push`, `pr`, and sibling-directory `worktree` flows.", - "Scans staged diff content for secrets before commit.", - "Keeps version control operations consistent with the runtime workflow.", + "Supports `commit`, `push`, `pr`, and sibling worktree flows.", + "Checks staged diff content for sensitive values before commit.", + "Keeps Git handoff aligned with task state and verification receipts.", ], notes: [ { @@ -221,28 +238,28 @@ const translations: Record = { { title: "Safety", description: - "Conventional commits and secret checks happen before the repo is handed off.", + "Conventional commits and sensitive-value checks happen before the repo is handed off.", }, ], }, { tab: "/hapo:deploy", - title: "Ship with a deployment handoff", + title: "Hand off release through your existing stack", description: - "Treat this as the final release surface after runtime verification, review, and Git handoff are complete.", + "CafeKit does not replace your deployment pipeline; it keeps the release story closed after test, review, and Git handoff.", highlights: [ - "Represents the final deployment step in the CafeKit release story on the homepage.", - "Can stand in for Vercel, CI/CD, or your own production delivery pipeline.", - "Keeps the flow visually complete from install all the way to release.", + "Represents Vercel, CI/CD, or your team's existing production pipeline.", + "Should only run after `hapo:test`, `hapo:code-review`, and `hapo:git`.", + "Avoids over-claiming native deploy; this is release handoff through your stack.", ], notes: [ { - title: "Temporary surface", + title: "Release handoff", description: - "This section is a visual placeholder for the future native deploy handoff.", + "Deployment stays in your existing pipeline; CafeKit provides guardrails before handoff.", }, { - title: "Release input", + title: "Release condition", description: "Only ship code that already passed `hapo:test`, `hapo:code-review`, and `hapo:git`.", }, @@ -251,21 +268,22 @@ const translations: Record = { ], }, quickStart: { - heading: "Get Started in Seconds", + heading: "Install the runtime, run the first flow", subheading: - "Install CafeKit, create and validate a spec, implement a task, verify it, then commit and deploy with your existing release stack.", + "Install CafeKit, create a validated spec, implement a task with Evidence, then test/review before Git handoff.", viewGuide: "View full quickstart guide", copied: "Copied!", copy: "Copy", comments: [ "# 1. Install CafeKit", - "# 2. Create and validate a feature spec", + "# 2. Create and validate a spec", "# 3. Implement one task packet at a time", - "# 4. Verify and review the release candidate", - "# 5. Commit, push, and deploy", + "# 4. Test and review the candidate", + "# 5. Commit, push, and hand off release", ], tutorialHeading: "New to CafeKit?", - tutorialBody: "Start from zero — step-by-step from no install to your first verified feature.", + tutorialBody: + "Go from an untouched repo to your first feature with spec, task, and verification receipt.", tutorialCta: "Start tutorial", }, contactForm: { @@ -302,39 +320,49 @@ const translations: Record = { }, vi: { hero: { - badge: "Runtime Claude Code-first cho quy trình spec-driven", + headingLead: "CafeKit runtime", + headingAccent: "cho AI coding có kiểm chứng", + badge: "Runtime spec-driven cài ngay trong repo", subtitle: - "Xây dựng từ spec đã được duyệt, triển khai từng task đã verify, và giữ docs luôn đồng bộ. Claude Code dùng được ngay.", - readDocs: "Đọc tài liệu hướng dẫn", - copied: "Đã copy!", - copy: "Copy", + "Biến prompt rời rạc thành luồng delivery có spec, task boundary, verification gate và state sync. Ưu tiên Claude Code, có hỗ trợ OpenCode.", + availability: "Sẵn sàng cho Claude Code", + runtimeStats: [ + { title: "Spec gate", description: "validate trước" }, + { title: "Task registry", description: "state rõ ràng" }, + { title: "Evidence", description: "proof trước khi done" }, + ], + readDocs: "Đọc tài liệu", + copied: "Đã sao chép", + copy: "Sao chép", }, features: { - heading: "Một runtime xuyên suốt từ prompt đầu tiên tới release", + heading: "Từ prompt đầu tiên đến release có kiểm chứng", subheading: - "Cài runtime, đi qua specs, develop, test, review, git handoff rồi ship bằng stack deploy hiện có của bạn.", - workflowLabel: "Runtime Workflow", - detailsLabel: "Điều Gì Xảy Ra", - notesLabel: "Điểm Cần Giữ Chặt", + "CafeKit cài một lớp vận hành vào repo: tạo spec, chia task packet, triển khai từng task, chạy test/review, đồng bộ state và bàn giao release bằng stack sẵn có.", + workflowLabel: "Luồng runtime", + activeLoopLabel: "Vòng chạy chính", + activeLoopValue: "install -> specs -> develop -> test -> review -> git -> release", + detailsLabel: "Cơ chế chính", + notesLabel: "Điểm cần chốt", steps: [ { tab: "install", - title: "Cài runtime bundle", + title: "Cài runtime vào repo", description: - "Khởi tạo CafeKit vào project Claude Code trước khi bắt đầu bất kỳ feature nào.", + "Bootstrap CafeKit vào project Claude Code hoặc OpenCode mà không chạm vào code ứng dụng.", highlights: [ - "Cài skills, hooks, rules, statusline và workflow context vào `.claude`.", - "Đưa project sang command surface spec-driven thay vì prompt rời rạc.", - "Claude Code là runtime chính đang được hỗ trợ ngay lúc này.", + "Cài skills, agents, hooks, rules, statusline và workflow context vào `.claude` hoặc `.opencode`.", + "Ghi metadata phiên bản và ownership manifest để lần cài sau preserve user edits.", + "Đưa repo sang command surface spec-driven thay vì phụ thuộc vào prompt dài.", ], notes: [ { - title: "Command", + title: "Lệnh cài đặt", description: "Chạy `npx @haposoft/cafekit` ở root của project.", }, { title: "Kết quả", - description: "Repo sẵn sàng chạy `hapo:*` workflow ngay.", + description: "Repo sẵn sàng chạy các workflow `hapo:*` với runtime project-local.", }, ], }, @@ -342,63 +370,63 @@ const translations: Record = { tab: "/hapo:specs", title: "Tạo contract cho feature", description: - "Sinh `spec.json`, requirements, design và task packet. Validate là một phần của giai đoạn này trước khi code bắt đầu.", + "Tạo `spec.json`, requirements, research, design và task packets trước khi implementation bắt đầu.", highlights: [ - "Tạo `specs//` với state machine-readable và task files.", - "Chạy reconciliation và validation trước khi handoff sang implementation.", - "Khóa runtime contract mà develop, test và sync sẽ bám vào.", + "Tạo `specs//` với state machine-readable, task files và task registry.", + "Scan spec đang dang dở và dependency giữa specs trước khi mở scope mới.", + "Chạy validator để chặn spec chưa đủ điều kiện bàn giao sang develop.", ], notes: [ { - title: "Validate trước", + title: "Gate bắt buộc", description: - "Xem `/hapo:specs --validate` là một phần của stage specs, không phải bước phụ.", + "Spec chưa pass validation thì `ready_for_implementation` không được bật.", }, { title: "Task packet", description: - "Mỗi `task-R*.md` là biên thực thi cho `hapo:develop`.", + "Mỗi `task-R*.md` là boundary thực thi cho một lượt develop có thể verify.", }, ], }, { tab: "/hapo:develop", - title: "Triển khai từng task packet", + title: "Triển khai theo từng task packet", description: - "Code theo verified task loop thay vì làm cả feature trong một lượt dài.", + "Chỉ code khi spec đã sẵn sàng, xử lý một task boundary mỗi lượt và sync state sau khi có proof.", highlights: [ - "Hỗ trợ cả full-spec orchestration lẫn chạy một task rất cụ thể.", - "Dùng task boundary, verification receipt và registry sync trước khi mark done.", - "Có docs checkpoint nhẹ sau mỗi task đã verify.", + "Hỗ trợ full-spec orchestration hoặc chạy chính xác một task file.", + "Scout codebase trước khi sửa để tránh orphan code, scope drift và sai entrypoint.", + "Không nhận placeholder, fake adapter hoặc đổi contract ngầm làm bằng chứng hoàn thành.", ], notes: [ { title: "Definition of done", description: - "Task chưa được coi là done nếu build, evidence và review chưa cùng đồng ý.", + "Task chỉ done khi Completion Criteria và Evidence đều có proof thật.", }, { - title: "Không có fake progress", + title: "State sync", description: - "Placeholder scaffold và scope drift sẽ bị chặn thay vì bị chấp nhận ngầm.", + "`spec.json.task_registry` và task markdown phải đồng bộ trước khi trả kết quả.", }, ], }, { tab: "/hapo:test", - title: "Verify bằng tín hiệu thật", + title: "Xác minh bằng tín hiệu thật", description: - "Chạy verification theo đúng task, ưu tiên exact commands, prechecks và runtime proof thay vì green check hời hợt.", + "Chạy exact evidence commands, precheck, test suite và UI verification theo scope của task.", highlights: [ - "Chạy build, typecheck, test suite và UI verification tùy theo evidence của task.", - "Xem `PRECHECK_FAIL` là tín hiệu mạnh hơn `NO_TESTS`.", - "Trả verdict có cấu trúc thay vì một câu thành công chung chung.", + "Auto-detect test runner và chọn blast-radius hoặc full suite theo ngữ cảnh.", + "`NO_TESTS` và `0 tests` không được coi là pass khi task cần automated proof.", + "Trả structured verdict có scope, failures, coverage và runtime reachability.", ], notes: [ { title: "Exact commands", description: - "Verification bắt đầu từ các command được ghi ngay trong task packet.", + "Verification bắt đầu từ lệnh được ghi trong Evidence của task packet.", }, { title: "UI mode", @@ -409,18 +437,18 @@ const translations: Record = { }, { tab: "/hapo:code-review", - title: "Review để chặn regression và lỗi bảo mật", + title: "Review đối kháng trước khi merge", description: - "Chạy review sau test để candidate cuối cùng được kiểm tra về correctness, regressions và contract drift.", + "Kiểm tra spec compliance, code quality, security và regression risk trước khi candidate đi tiếp.", highlights: [ - "Output findings-first giữ trọng tâm vào bug và rủi ro thật.", - "Bắt lỗi security, behavior drift và thiếu verification evidence.", - "Ghép tự nhiên với `hapo:test` trong quality gate.", + "Stage 1 đối chiếu implementation với spec và task evidence.", + "Stage 2 kiểm tra YAGNI, KISS, DRY, maintainability và test gaps.", + "Stage 3 red-team security, edge cases, false assumptions và contract drift.", ], notes: [ { - title: "Tư thế review", - description: "Giả định regression có thể xảy ra cho tới khi evidence chứng minh ngược lại.", + title: "PASS thật", + description: "Review chỉ pass khi score >= 9.5 và không còn Critical finding.", }, { title: "Release gate", @@ -431,13 +459,13 @@ const translations: Record = { }, { tab: "/hapo:git", - title: "Commit và push an toàn", + title: "Commit và handoff an toàn", description: - "Dùng Git operations native cho commit, push, PR prep và safe worktree flows sau khi code đã verify.", + "Dùng Git operations native cho commit, push, PR prep và worktree sau khi code đã được verify.", highlights: [ - "Hỗ trợ `commit`, `push`, `pr` và `worktree` ở thư mục sibling.", - "Scan staged diff để phát hiện secrets trước khi commit.", - "Giữ version control nhất quán với runtime workflow.", + "Hỗ trợ `commit`, `push`, `pr` và sibling worktree flows.", + "Kiểm tra staged diff để phát hiện giá trị nhạy cảm trước commit.", + "Giữ Git handoff nhất quán với task state và verification receipt.", ], notes: [ { @@ -448,25 +476,25 @@ const translations: Record = { { title: "Safety", description: - "Conventional commit và secret check xảy ra trước khi handoff repo.", + "Conventional commit và kiểm tra giá trị nhạy cảm xảy ra trước khi handoff repo.", }, ], }, { tab: "/hapo:deploy", - title: "Ship qua bước handoff deploy", + title: "Bàn giao release qua stack hiện có", description: - "Xem đây là mặt cuối của release sau khi verification, review và Git handoff đã hoàn tất.", + "CafeKit không thay thế pipeline deploy; nó giữ release story khép kín sau test, review và Git handoff.", highlights: [ - "Đóng vai trò bước deploy cuối trong release story của CafeKit trên homepage.", - "Có thể đại diện cho Vercel, CI/CD hoặc pipeline production hiện có của bạn.", - "Giúp flow nhìn trọn vẹn từ install cho tới release.", + "Đại diện cho Vercel, CI/CD hoặc pipeline production hiện có của team.", + "Chỉ nên chạy sau `hapo:test`, `hapo:code-review` và `hapo:git`.", + "Tránh claim native deploy quá mức; đây là release handoff theo stack của bạn.", ], notes: [ { - title: "Surface tạm thời", + title: "Release handoff", description: - "Section này là visual placeholder cho deploy handoff native trong tương lai.", + "Deploy vẫn thuộc pipeline hiện có; CafeKit cung cấp guardrails trước khi bàn giao.", }, { title: "Điều kiện release", @@ -478,21 +506,21 @@ const translations: Record = { ], }, quickStart: { - heading: "Sẵn sàng chỉ sau vài giây", + heading: "Cài runtime, chạy flow đầu tiên", subheading: - "Cài CafeKit, tạo và validate spec, triển khai một task, verify nó, rồi commit và deploy bằng release stack hiện tại.", + "Cài CafeKit, tạo spec đã validate, triển khai một task có Evidence, rồi test/review trước khi Git handoff.", viewGuide: "Xem hướng dẫn bắt đầu nhanh đầy đủ", - copied: "Đã copy!", - copy: "Copy", + copied: "Đã sao chép", + copy: "Sao chép", comments: [ "# 1. Cài đặt CafeKit", - "# 2. Tạo và validate spec cho feature", + "# 2. Tạo và validate spec", "# 3. Triển khai từng task packet", - "# 4. Verify và review release candidate", - "# 5. Commit, push và deploy", + "# 4. Test và review candidate", + "# 5. Commit, push và bàn giao release", ], tutorialHeading: "Mới biết CafeKit?", - tutorialBody: "Bắt đầu từ con số 0 — từng bước từ chưa cài gì đến feature đầu tiên đã verify.", + tutorialBody: "Đi từ repo chưa cài gì đến feature đầu tiên có spec, task và verification receipt.", tutorialCta: "Bắt đầu hướng dẫn", }, contactForm: { @@ -529,61 +557,71 @@ const translations: Record = { }, ja: { hero: { - badge: "Claude Code-first の spec-driven runtime", + headingLead: "CafeKit runtime", + headingAccent: "検証可能な AI coding のために", + badge: "repo に導入する spec-driven runtime", subtitle: - "承認済み spec から始め、検証済みタスクを1つずつ実装し、docs を同期させます。Claude Code は今すぐ利用可能です。", + "ad-hoc prompt を、spec、task boundary、verification gate、state sync を持つ delivery flow に変えます。Claude Code を優先し、OpenCode もサポートします。", + availability: "Claude Code 対応", + runtimeStats: [ + { title: "Spec gate", description: "validate first" }, + { title: "Task registry", description: "明確な state" }, + { title: "Evidence", description: "done 前の proof" }, + ], readDocs: "ドキュメントを読む", copied: "コピーしました!", copy: "コピー", }, features: { - heading: "最初の prompt から release までを1つの runtime で", + heading: "最初の prompt から verified release まで", subheading: - "runtime をインストールし、specs、develop、test、review、git handoff を経て、既存の deploy stack で出荷します。", - workflowLabel: "Runtime Workflow", - detailsLabel: "何が起きるか", - notesLabel: "重要なポイント", + "CafeKit は repo に operating layer を追加します。spec 作成、task packet 分割、1 task ずつの実装、test/review、state sync、既存 stack への release handoff までをつなぎます。", + workflowLabel: "Runtime flow", + activeLoopLabel: "Main loop", + activeLoopValue: "install -> specs -> develop -> test -> review -> git -> release", + detailsLabel: "Core mechanics", + notesLabel: "固定すべきポイント", steps: [ { tab: "install", - title: "runtime bundle をインストール", + title: "runtime を repo にインストール", description: - "feature 作業に入る前に、既存の Claude Code project へ CafeKit を導入します。", + "Claude Code または OpenCode project に CafeKit を bootstrap します。application code は変更しません。", highlights: [ - "skills、hooks、rules、statusline、workflow context を `.claude` に配置します。", - "プロジェクトを ad-hoc prompt ではなく spec-driven command surface に切り替えます。", - "現在の primary runtime は Claude Code です。", + "skills、agents、hooks、rules、statusline、workflow context を `.claude` または `.opencode` に配置します。", + "version metadata と ownership manifest を記録し、次回 install でも user edits を preserve します。", + "長い prompt 依存ではなく、repo を spec-driven command surface に移行します。", ], notes: [ { - title: "Command", + title: "Install command", description: "project root で `npx @haposoft/cafekit` を実行します。", }, { title: "Result", - description: "repo はすぐに `hapo:*` workflow を実行できます。", + description: "repo は project-local runtime で `hapo:*` workflows を実行できる状態になります。", }, ], }, { tab: "/hapo:specs", - title: "feature contract を作る", + title: "feature contract を作成", description: - "`spec.json`、requirements、design、task packet を生成します。validation は実装前にこの段階で行います。", + "implementation 前に `spec.json`、requirements、research、design、task packets を作成します。", highlights: [ - "machine-readable な state と task files を持つ `specs//` を生成します。", - "implementation に渡す前に reconciliation と validation を実行します。", - "develop、test、sync が依存する runtime contract を固定します。", + "machine-readable state、task files、task registry を持つ `specs//` を作成します。", + "新しい scope を開く前に in-progress specs と cross-spec dependencies を scan します。", + "develop handoff に足りない spec は validator で block します。", ], notes: [ { - title: "Validate first", + title: "Required gate", description: - "`/hapo:specs --validate` は specs stage の一部として扱います。", + "validation が pass するまで spec は `ready_for_implementation` を set できません。", }, { title: "Task packet", - description: "`task-R*.md` は `hapo:develop` の実行境界になります。", + description: "`task-R*.md` は verifiable な develop pass 1回分の execution boundary です。", }, ], }, @@ -591,38 +629,38 @@ const translations: Record = { tab: "/hapo:develop", title: "task packet を1つずつ実装", description: - "feature 全体を一気に書くのではなく、verified task loop で前に進みます。", + "spec が ready になってから code を書き、1 pass で1つの task boundary を処理し、proof が揃ってから state を sync します。", highlights: [ - "full-spec orchestration と single-task execution の両方をサポートします。", - "done にする前に task boundary、verification receipt、registry sync を使います。", - "verified task ごとに軽量な docs checkpoint を実行します。", + "full-spec orchestration または exact single task file のどちらにも対応します。", + "編集前に codebase を scout し、orphan code、scope drift、wrong entrypoint を避けます。", + "placeholder、fake adapter、silent contract swap は completion proof として扱いません。", ], notes: [ { title: "Definition of done", - description: "build、evidence、review が揃わなければ task は done になりません。", + description: "Completion Criteria と Evidence の両方に real proof がある場合だけ task は done です。", }, { - title: "No fake progress", + title: "State sync", description: - "placeholder scaffold や scope drift は黙って通さずブロックします。", + "結果を返す前に `spec.json.task_registry` と task markdown を一致させます。", }, ], }, { tab: "/hapo:test", - title: "実際の signal で verify", + title: "real signals で verify", description: - "浅い green check ではなく、exact commands、prechecks、runtime proof を優先して検証します。", + "task scope に合わせて exact Evidence commands、prechecks、test suites、UI verification を実行します。", highlights: [ - "task evidence に応じて build、typecheck、test suite、UI verification を実行します。", - "`PRECHECK_FAIL` は `NO_TESTS` より強い verdict として扱います。", - "曖昧な success ではなく structured verdict を返します。", + "test runner を auto-detect し、context に応じて blast-radius または full suite を選びます。", + "automated proof が必要な task では `NO_TESTS` と `0 tests` を pass 扱いしません。", + "scope、failures、coverage、runtime reachability を含む structured verdict を返します。", ], notes: [ { title: "Exact commands", - description: "verification は task packet に書かれた command から始まります。", + description: "verification は task packet の Evidence に書かれた commands から始まります。", }, { title: "UI mode", @@ -633,18 +671,18 @@ const translations: Record = { }, { tab: "/hapo:code-review", - title: "regression と security を review", + title: "merge 前の adversarial review", description: - "test の後に adversarial review を行い、最後の merge candidate を correctness と security の観点で確認します。", + "candidate を先へ進める前に spec compliance、code quality、security、regression risk を確認します。", highlights: [ - "findings-first の出力で bug と risk に集中できます。", - "security、behavior drift、verification evidence の欠落を検出します。", - "`hapo:test` と自然に組み合わせられます。", + "Stage 1 で implementation を spec と task evidence に照合します。", + "Stage 2 で YAGNI、KISS、DRY、maintainability、test gaps を確認します。", + "Stage 3 で security、edge cases、false assumptions、contract drift を red-team します。", ], notes: [ { - title: "Review posture", - description: "evidence が揃うまで regression の可能性を前提に扱います。", + title: "Real PASS", + description: "score >= 9.5 かつ Critical finding が 0 の場合だけ review は pass です。", }, { title: "Release gate", @@ -654,13 +692,13 @@ const translations: Record = { }, { tab: "/hapo:git", - title: "安全に commit と push", + title: "safe commit と handoff", description: - "検証後の code を native Git operations で commit、push、PR 準備、worktree 管理へ繋げます。", + "code が verified になった後、native Git operations で commit、push、PR prep、worktree flow へ進めます。", highlights: [ - "`commit`、`push`、`pr`、sibling-directory `worktree` をサポートします。", - "commit 前に staged diff の secret scan を行います。", - "version control を runtime workflow と揃えます。", + "`commit`、`push`、`pr`、sibling worktree flows をサポートします。", + "commit 前に staged diff の sensitive value check を行います。", + "Git handoff を task state と verification receipts に揃えます。", ], notes: [ { @@ -669,28 +707,28 @@ const translations: Record = { }, { title: "Safety", - description: "conventional commit と secret check を先に通します。", + description: "conventional commit と sensitive value check を先に通します。", }, ], }, { tab: "/hapo:deploy", - title: "deploy handoff で ship", + title: "既存 stack への release handoff", description: - "verification、review、Git handoff の後に来る最終 release surface として扱います。", + "CafeKit は deployment pipeline を置き換えません。test、review、Git handoff 後の release story を閉じます。", highlights: [ - "homepage 上では CafeKit release story の最後のステップとして見せます。", - "Vercel、CI/CD、または custom pipeline の代理表現として使えます。", - "install から release までの流れを視覚的に完結させます。", + "Vercel、CI/CD、または team の既存 production pipeline を表します。", + "`hapo:test`、`hapo:code-review`、`hapo:git` の後にだけ実行すべきです。", + "native deploy を過剰に claim せず、既存 stack への release handoff として扱います。", ], notes: [ { - title: "Temporary surface", + title: "Release handoff", description: - "この section は将来の native deploy handoff を先に見せる placeholder です。", + "deployment は既存 pipeline に残し、CafeKit は handoff 前の guardrails を提供します。", }, { - title: "Release input", + title: "Release condition", description: "`hapo:test`、`hapo:code-review`、`hapo:git` を通った code のみ ship します。", }, @@ -699,21 +737,21 @@ const translations: Record = { ], }, quickStart: { - heading: "数秒で開始", + heading: "runtime をインストールし、最初の flow を実行", subheading: - "CafeKit をインストールし、spec を作成・検証し、task を実装して verify し、その後 commit と deploy を行います。", + "CafeKit をインストールし、validated spec を作成し、Evidence 付き task を実装してから Git handoff 前に test/review します。", viewGuide: "クイックスタートを詳しく見る", copied: "コピーしました!", copy: "コピー", comments: [ "# 1. CafeKit をインストール", - "# 2. feature spec を作成して validate", + "# 2. spec を作成して validate", "# 3. task packet を1つずつ実装", - "# 4. verify と review で候補を固める", - "# 5. commit, push, deploy", + "# 4. candidate を test/review", + "# 5. commit, push, release handoff", ], tutorialHeading: "CafeKit が初めてですか?", - tutorialBody: "ゼロから始めましょう — 未インストールから最初の verified feature まで案内します。", + tutorialBody: "未導入の repo から、spec、task、verification receipt を持つ最初の feature まで進めます。", tutorialCta: "チュートリアルを開始", }, contactForm: { diff --git a/cafekit-web/src/lib/site-shell-translations.ts b/cafekit-web/src/lib/site-shell-translations.ts index 5f6f5eec..e0cb23e8 100644 --- a/cafekit-web/src/lib/site-shell-translations.ts +++ b/cafekit-web/src/lib/site-shell-translations.ts @@ -36,7 +36,7 @@ const translations: Record = { en: { header: { workflow: "Workflow", - whyItWorks: "What's different", + whyItWorks: "Differentiators", artifacts: "Artifacts", quickstart: "Quickstart", github: "GitHub", @@ -44,7 +44,7 @@ const translations: Record = { }, footer: { description: - "Claude Code-first runtime for spec-driven delivery. Install the runtime bundle, validate specs, implement verified task packets, and release with confidence.", + "Spec-driven runtime for AI coding agents. Install it into your repo, create spec artifacts, implement task packets with Evidence, then test/review before release handoff.", readDocs: "Read docs", github: "GitHub", product: "Product", @@ -76,17 +76,17 @@ const translations: Record = { }, footer: { description: - "Runtime Claude Code-first cho quy trình spec-driven. Cài runtime bundle, validate spec, triển khai task packet đã verify, rồi release với sự tự tin.", - readDocs: "Đọc docs", + "Runtime spec-driven cho AI coding agents. Cài vào repo, tạo spec artifacts, triển khai từng task packet có Evidence, rồi test/review trước khi release handoff.", + readDocs: "Đọc tài liệu", github: "GitHub", product: "Sản phẩm", - workflows: "Workflow", + workflows: "Quy trình", resources: "Tài nguyên", documentation: "Tài liệu", installation: "Cài đặt", quickstart: "Bắt đầu nhanh", commandReference: "Tham chiếu lệnh", - coreWorkflow: "Workflow chính", + coreWorkflow: "Quy trình chính", specs: "/hapo:specs", develop: "/hapo:develop", testReview: "/hapo:test + /hapo:code-review", @@ -100,7 +100,7 @@ const translations: Record = { ja: { header: { workflow: "ワークフロー", - whyItWorks: "違い", + whyItWorks: "差別化ポイント", artifacts: "Artifacts", quickstart: "クイックスタート", github: "GitHub", @@ -108,17 +108,17 @@ const translations: Record = { }, footer: { description: - "Claude Code-first の spec-driven runtime。runtime bundle を入れ、spec を validate し、verified task packet を実装して、自信を持って release できます。", - readDocs: "Docs を読む", + "AI coding agents 向けの spec-driven runtime。repo に導入し、spec artifacts を作り、Evidence 付きの task packet を実装し、release handoff 前に test/review します。", + readDocs: "ドキュメントを読む", github: "GitHub", - product: "Product", - workflows: "Workflows", - resources: "Resources", - documentation: "Documentation", - installation: "Installation", - quickstart: "Quickstart", - commandReference: "Command Reference", - coreWorkflow: "Core workflow", + product: "プロダクト", + workflows: "ワークフロー", + resources: "リソース", + documentation: "ドキュメント", + installation: "インストール", + quickstart: "クイックスタート", + commandReference: "コマンドリファレンス", + coreWorkflow: "メインワークフロー", specs: "/hapo:specs", develop: "/hapo:develop", testReview: "/hapo:test + /hapo:code-review", From 5ec7d2087e4ab2f3f4c5a5ae7c76f689471899fa Mon Sep 17 00:00:00 2001 From: hapo-nghialuu Date: Thu, 4 Jun 2026 13:50:03 +0700 Subject: [PATCH 2/2] feat(web): refine vietnamese landing copy --- .../components/landing/artifact-preview.tsx | 10 +- .../landing/interactive-runtime-terminal.tsx | 8 +- .../components/landing/outcome-comparison.tsx | 18 +-- .../landing/runtime-install-surface.tsx | 16 +- cafekit-web/src/lib/landing-translations.ts | 150 +++++++++--------- .../src/lib/site-shell-translations.ts | 4 +- 6 files changed, 103 insertions(+), 103 deletions(-) diff --git a/cafekit-web/src/components/landing/artifact-preview.tsx b/cafekit-web/src/components/landing/artifact-preview.tsx index b054830a..5da5406e 100644 --- a/cafekit-web/src/components/landing/artifact-preview.tsx +++ b/cafekit-web/src/components/landing/artifact-preview.tsx @@ -27,22 +27,22 @@ const copy = { ], }, vi: { - heading: "Artifacts thật sau mỗi bước", + heading: "Kết quả thật sau mỗi bước", subheading: - "CafeKit để lại file, registry và receipt để reviewer biết task nào đã sẵn sàng, task nào còn thiếu evidence.", + "CafeKit để lại file, sổ tác vụ và biên nhận để reviewer biết tác vụ nào đã sẵn sàng, tác vụ nào còn thiếu bằng chứng.", cta: "Mở tài liệu", items: [ { title: "spec.json", - description: "Machine state cho phase, validation status, task registry và readiness gate.", + description: "Trạng thái máy đọc được cho giai đoạn, trạng thái kiểm tra, sổ tác vụ và cổng sẵn sàng.", }, { title: "task-R*.md", - description: "Task packet có objective, scope boundary, completion criteria và Evidence commands.", + description: "Gói tác vụ có mục tiêu, ranh giới phạm vi, tiêu chí hoàn thành và lệnh bằng chứng.", }, { title: "review + test verdict", - description: "Structured verdict cho biết code đã đủ điều kiện merge, Git handoff hoặc release chưa.", + description: "Kết luận có cấu trúc cho biết code đã đủ điều kiện hợp nhất, bàn giao Git hoặc bàn giao release chưa.", }, ], }, diff --git a/cafekit-web/src/components/landing/interactive-runtime-terminal.tsx b/cafekit-web/src/components/landing/interactive-runtime-terminal.tsx index 12fcca47..264e8cd1 100644 --- a/cafekit-web/src/components/landing/interactive-runtime-terminal.tsx +++ b/cafekit-web/src/components/landing/interactive-runtime-terminal.tsx @@ -70,11 +70,11 @@ const terminalCopy = { }, vi: { replay: "Chạy lại", - labels: ["Cài đặt", "Tạo spec", "Validate", "Develop", "Test"], + labels: ["Cài đặt", "Tạo đặc tả", "Kiểm tra", "Triển khai", "Kiểm thử"], activeLoop: "Vòng chạy", - activeLoopValue: "specs -> develop -> test", - taskPacket: "Task packet", - taskName: "R0-02 auth setup", + activeLoopValue: "đặc tả -> triển khai -> kiểm thử", + taskPacket: "Gói tác vụ", + taskName: "R0-02 thiết lập xác thực", }, ja: { replay: "Replay", diff --git a/cafekit-web/src/components/landing/outcome-comparison.tsx b/cafekit-web/src/components/landing/outcome-comparison.tsx index a42a16dd..20d0c95b 100644 --- a/cafekit-web/src/components/landing/outcome-comparison.tsx +++ b/cafekit-web/src/components/landing/outcome-comparison.tsx @@ -26,20 +26,20 @@ const copy = { vi: { heading: "Điểm khác biệt", subheading: - "CafeKit không cố làm agent thông minh hơn bằng prompt dài. Nó đặt agent vào một runtime có state, artifacts và gates để tiến độ không bị giả xanh.", + "CafeKit không cố làm AI thông minh hơn bằng prompt dài. Nó đặt AI vào quy trình có trạng thái, kết quả và cổng kiểm chứng để tiến độ không thể giả xanh.", before: "Không có CafeKit", after: "Có CafeKit", beforeItems: [ - "Mỗi session phải giải thích lại context, scope và cách làm", - "Spec dễ lệch khỏi implementation sau lượt code đầu tiên", - "Task có thể bị mark done dù build, test hoặc runtime proof vẫn thiếu", - "Docs thường bị dồn cuối, cập nhật thiếu hoặc bỏ qua", + "Mỗi phiên làm việc phải giải thích lại ngữ cảnh, phạm vi và cách làm", + "Đặc tả dễ lệch khỏi phần triển khai sau lượt code đầu tiên", + "Tác vụ có thể bị đánh dấu xong dù build, kiểm thử hoặc bằng chứng chạy thực tế vẫn thiếu", + "Tài liệu thường bị dồn cuối, cập nhật thiếu hoặc bỏ qua", ], afterItems: [ - "Spec trở thành artifact có validation, task registry và readiness gate", - "Implementation đi theo từng task packet đã có completion criteria và Evidence", - "Quality gate chặn fake progress trước khi sync state sang done", - "Docs checkpoint chạy theo task đã verify thay vì dồn vào cuối release", + "Đặc tả trở thành kết quả có kiểm tra, sổ tác vụ và cổng sẵn sàng", + "Triển khai đi theo từng gói tác vụ có tiêu chí hoàn thành và bằng chứng", + "Cổng chất lượng chặn tiến độ giả trước khi đồng bộ trạng thái sang hoàn tất", + "Điểm kiểm tra tài liệu chạy theo tác vụ đã kiểm chứng thay vì dồn vào cuối release", ], }, ja: { diff --git a/cafekit-web/src/components/landing/runtime-install-surface.tsx b/cafekit-web/src/components/landing/runtime-install-surface.tsx index 0084df8b..e53a43f3 100644 --- a/cafekit-web/src/components/landing/runtime-install-surface.tsx +++ b/cafekit-web/src/components/landing/runtime-install-surface.tsx @@ -33,32 +33,32 @@ const copy = { footer: "No framework lock-in. Re-runs use an ownership manifest to update managed files while preserving your edits.", }, vi: { - heading: "CafeKit cài gì vào repo", + heading: "CafeKit cài gì vào dự án", subheading: - "Installer chỉ cài workflow/runtime infrastructure vào `.claude` hoặc `.opencode`. Code ứng dụng không bị chạm cho đến khi bạn chạy workflow cho một feature thật.", + "Bộ cài chỉ thêm hạ tầng vận hành vào `.claude` hoặc `.opencode`. Code ứng dụng không bị chạm cho đến khi bạn chạy quy trình cho một tính năng thật.", items: [ { title: ".claude/skills", - description: "Bộ skill tạo command surface cho question, brainstorm, specs, develop, test, review, docs, sync và git.", + description: "Bộ kỹ năng tạo các lệnh cho question, brainstorm, specs, develop, test, review, docs, sync và git.", }, { title: ".claude/hooks", - description: "Hook nhắc state/spec drift, chặn đọc dữ liệu nhạy cảm, inject context phiên làm việc và cập nhật usage.", + description: "Hook nhắc lệch trạng thái hoặc đặc tả, chặn đọc dữ liệu nhạy cảm, nạp ngữ cảnh phiên làm việc và cập nhật mức sử dụng.", }, { title: ".claude/agents", - description: "Subagent chuyên trách inspect, spec, develop, test, review, docs, git và deployment handoff.", + description: "Agent hỗ trợ chuyên trách inspect, spec, develop, test, review, docs, git và bàn giao triển khai.", }, { title: ".claude/rules", - description: "Rule vận hành giữ scope, spec state, quality gate, docs sync và Git handoff đi cùng nhau.", + description: "Quy tắc vận hành giữ phạm vi, trạng thái đặc tả, cổng chất lượng, đồng bộ tài liệu và bàn giao Git đi cùng nhau.", }, { title: "Code ứng dụng", - description: "Được giữ nguyên trong lúc cài đặt. CafeKit chỉ sửa app khi bạn giao một task implementation rõ ràng.", + description: "Được giữ nguyên trong lúc cài đặt. CafeKit chỉ sửa ứng dụng khi bạn giao một tác vụ triển khai rõ ràng.", }, ], - footer: "Không khóa framework. Re-run có ownership manifest để cập nhật file managed nhưng vẫn preserve chỉnh sửa của bạn.", + footer: "Không khóa framework. Khi chạy lại, manifest sở hữu giúp cập nhật file do CafeKit quản lý mà vẫn giữ chỉnh sửa của bạn.", }, ja: { heading: "CafeKit が repo にインストールするもの", diff --git a/cafekit-web/src/lib/landing-translations.ts b/cafekit-web/src/lib/landing-translations.ts index 9fb781a5..85bb4e33 100644 --- a/cafekit-web/src/lib/landing-translations.ts +++ b/cafekit-web/src/lib/landing-translations.ts @@ -320,95 +320,95 @@ const translations: Record = { }, vi: { hero: { - headingLead: "CafeKit runtime", - headingAccent: "cho AI coding có kiểm chứng", - badge: "Runtime spec-driven cài ngay trong repo", + headingLead: "CafeKit", + headingAccent: "cho quy trình AI coding có kiểm chứng", + badge: "Bộ công cụ vận hành cài trực tiếp vào dự án", subtitle: - "Biến prompt rời rạc thành luồng delivery có spec, task boundary, verification gate và state sync. Ưu tiên Claude Code, có hỗ trợ OpenCode.", + "Biến prompt rời rạc thành quy trình có đặc tả, tác vụ, cổng kiểm chứng và đồng bộ trạng thái. Ưu tiên Claude Code, có hỗ trợ OpenCode.", availability: "Sẵn sàng cho Claude Code", runtimeStats: [ - { title: "Spec gate", description: "validate trước" }, - { title: "Task registry", description: "state rõ ràng" }, - { title: "Evidence", description: "proof trước khi done" }, + { title: "Cổng đặc tả", description: "kiểm tra trước" }, + { title: "Sổ tác vụ", description: "trạng thái rõ ràng" }, + { title: "Bằng chứng", description: "đủ chứng cứ mới hoàn tất" }, ], readDocs: "Đọc tài liệu", copied: "Đã sao chép", copy: "Sao chép", }, features: { - heading: "Từ prompt đầu tiên đến release có kiểm chứng", + heading: "Từ ý tưởng đầu tiên đến bàn giao code có kiểm chứng", subheading: - "CafeKit cài một lớp vận hành vào repo: tạo spec, chia task packet, triển khai từng task, chạy test/review, đồng bộ state và bàn giao release bằng stack sẵn có.", - workflowLabel: "Luồng runtime", + "CafeKit cài vào dự án một bộ công cụ vận hành: tạo đặc tả, chia tác vụ, triển khai từng phần, chạy kiểm thử và review, đồng bộ trạng thái rồi bàn giao qua quy trình sẵn có.", + workflowLabel: "Quy trình vận hành", activeLoopLabel: "Vòng chạy chính", - activeLoopValue: "install -> specs -> develop -> test -> review -> git -> release", + activeLoopValue: "cài đặt -> đặc tả -> triển khai -> kiểm thử -> review -> git -> bàn giao", detailsLabel: "Cơ chế chính", notesLabel: "Điểm cần chốt", steps: [ { - tab: "install", - title: "Cài runtime vào repo", + tab: "cài đặt", + title: "Cài bộ công cụ vào dự án", description: - "Bootstrap CafeKit vào project Claude Code hoặc OpenCode mà không chạm vào code ứng dụng.", + "Khởi tạo CafeKit cho dự án Claude Code hoặc OpenCode mà không sửa code ứng dụng.", highlights: [ - "Cài skills, agents, hooks, rules, statusline và workflow context vào `.claude` hoặc `.opencode`.", - "Ghi metadata phiên bản và ownership manifest để lần cài sau preserve user edits.", - "Đưa repo sang command surface spec-driven thay vì phụ thuộc vào prompt dài.", + "Cài bộ kỹ năng, agent hỗ trợ, hook, quy tắc, statusline và ngữ cảnh quy trình vào `.claude` hoặc `.opencode`.", + "Ghi thông tin phiên bản và manifest sở hữu để lần cài sau cập nhật phần do CafeKit quản lý mà vẫn giữ chỉnh sửa của bạn.", + "Đưa dự án vào quy trình dựa trên đặc tả thay vì phụ thuộc vào prompt dài.", ], notes: [ { title: "Lệnh cài đặt", - description: "Chạy `npx @haposoft/cafekit` ở root của project.", + description: "Chạy `npx @haposoft/cafekit` ở thư mục gốc của dự án.", }, { title: "Kết quả", - description: "Repo sẵn sàng chạy các workflow `hapo:*` với runtime project-local.", + description: "Dự án sẵn sàng chạy các quy trình `hapo:*` bằng bộ công cụ vận hành cục bộ.", }, ], }, { tab: "/hapo:specs", - title: "Tạo contract cho feature", + title: "Tạo đặc tả cho tính năng", description: - "Tạo `spec.json`, requirements, research, design và task packets trước khi implementation bắt đầu.", + "Tạo `spec.json`, yêu cầu, nghiên cứu, thiết kế và danh sách tác vụ trước khi bắt đầu triển khai.", highlights: [ - "Tạo `specs//` với state machine-readable, task files và task registry.", - "Scan spec đang dang dở và dependency giữa specs trước khi mở scope mới.", - "Chạy validator để chặn spec chưa đủ điều kiện bàn giao sang develop.", + "Tạo `specs//` với trạng thái máy đọc được, file tác vụ và sổ tác vụ.", + "Rà soát các đặc tả đang dang dở và phụ thuộc giữa đặc tả trước khi mở phạm vi mới.", + "Chạy bộ kiểm tra đặc tả để chặn những đặc tả chưa đủ điều kiện bàn giao sang triển khai.", ], notes: [ { title: "Gate bắt buộc", description: - "Spec chưa pass validation thì `ready_for_implementation` không được bật.", + "Đặc tả chưa qua kiểm tra thì `ready_for_implementation` không được bật.", }, { - title: "Task packet", + title: "Gói tác vụ", description: - "Mỗi `task-R*.md` là boundary thực thi cho một lượt develop có thể verify.", + "Mỗi `task-R*.md` là ranh giới thực thi cho một lượt triển khai có thể kiểm chứng.", }, ], }, { tab: "/hapo:develop", - title: "Triển khai theo từng task packet", + title: "Triển khai theo từng gói tác vụ", description: - "Chỉ code khi spec đã sẵn sàng, xử lý một task boundary mỗi lượt và sync state sau khi có proof.", + "Chỉ viết code khi đặc tả đã sẵn sàng, xử lý một ranh giới tác vụ mỗi lượt và đồng bộ trạng thái sau khi có bằng chứng.", highlights: [ - "Hỗ trợ full-spec orchestration hoặc chạy chính xác một task file.", - "Scout codebase trước khi sửa để tránh orphan code, scope drift và sai entrypoint.", - "Không nhận placeholder, fake adapter hoặc đổi contract ngầm làm bằng chứng hoàn thành.", + "Hỗ trợ điều phối toàn bộ đặc tả hoặc chạy chính xác một file tác vụ.", + "Khảo sát mã nguồn dự án trước khi sửa để tránh code mồ côi, lệch phạm vi và sai điểm vào.", + "Không chấp nhận phần dựng tạm, adapter giả hoặc đổi ngầm hợp đồng làm bằng chứng hoàn thành.", ], notes: [ { - title: "Definition of done", + title: "Định nghĩa hoàn tất", description: - "Task chỉ done khi Completion Criteria và Evidence đều có proof thật.", + "Tác vụ chỉ hoàn tất khi tiêu chí hoàn thành và bằng chứng đều có chứng cứ thật.", }, { - title: "State sync", + title: "Đồng bộ trạng thái", description: - "`spec.json.task_registry` và task markdown phải đồng bộ trước khi trả kết quả.", + "`spec.json.task_registry` và markdown tác vụ phải khớp nhau trước khi trả kết quả.", }, ], }, @@ -416,111 +416,111 @@ const translations: Record = { tab: "/hapo:test", title: "Xác minh bằng tín hiệu thật", description: - "Chạy exact evidence commands, precheck, test suite và UI verification theo scope của task.", + "Chạy đúng lệnh bằng chứng, kiểm tra trước, bộ kiểm thử và xác minh giao diện theo phạm vi tác vụ.", highlights: [ - "Auto-detect test runner và chọn blast-radius hoặc full suite theo ngữ cảnh.", - "`NO_TESTS` và `0 tests` không được coi là pass khi task cần automated proof.", - "Trả structured verdict có scope, failures, coverage và runtime reachability.", + "Tự nhận diện trình chạy kiểm thử và chọn phạm vi hẹp hoặc toàn bộ bộ kiểm thử theo ngữ cảnh.", + "`NO_TESTS` và `0 tests` không được coi là đạt khi tác vụ cần bằng chứng tự động.", + "Trả kết luận có cấu trúc với phạm vi, lỗi, độ phủ và khả năng truy cập lúc chạy.", ], notes: [ { - title: "Exact commands", + title: "Lệnh chính xác", description: - "Verification bắt đầu từ lệnh được ghi trong Evidence của task packet.", + "Xác minh bắt đầu từ các lệnh được ghi trong phần bằng chứng của gói tác vụ.", }, { - title: "UI mode", + title: "Chế độ giao diện", description: - "Flow có auth có thể dùng `--ui-auth` hoặc `--ui-flow` khi page runtime đã lên.", + "Luồng có xác thực có thể dùng `--ui-auth` hoặc `--ui-flow` khi trang chạy thực tế đã sẵn sàng.", }, ], }, { tab: "/hapo:code-review", - title: "Review đối kháng trước khi merge", + title: "Review đối kháng trước khi hợp nhất", description: - "Kiểm tra spec compliance, code quality, security và regression risk trước khi candidate đi tiếp.", + "Kiểm tra độ khớp với đặc tả, chất lượng code, bảo mật và rủi ro hồi quy trước khi bản thay đổi đi tiếp.", highlights: [ - "Stage 1 đối chiếu implementation với spec và task evidence.", - "Stage 2 kiểm tra YAGNI, KISS, DRY, maintainability và test gaps.", - "Stage 3 red-team security, edge cases, false assumptions và contract drift.", + "Giai đoạn 1 đối chiếu phần triển khai với đặc tả và bằng chứng tác vụ.", + "Giai đoạn 2 kiểm tra YAGNI, KISS, DRY, khả năng bảo trì và khoảng trống kiểm thử.", + "Giai đoạn 3 rà soát bảo mật, trường hợp biên, giả định sai và lệch hợp đồng.", ], notes: [ { - title: "PASS thật", - description: "Review chỉ pass khi score >= 9.5 và không còn Critical finding.", + title: "Kết luận đạt", + description: "Review chỉ đạt khi điểm >= 9.5 và không còn phát hiện nghiêm trọng.", }, { - title: "Release gate", + title: "Cổng bàn giao", description: - "Critical findings phải chặn handoff sang Git và deployment.", + "Phát hiện nghiêm trọng phải chặn bàn giao sang Git và triển khai.", }, ], }, { tab: "/hapo:git", - title: "Commit và handoff an toàn", + title: "Commit và bàn giao an toàn", description: - "Dùng Git operations native cho commit, push, PR prep và worktree sau khi code đã được verify.", + "Dùng thao tác Git gốc cho commit, push, chuẩn bị PR và worktree sau khi code đã được kiểm chứng.", highlights: [ - "Hỗ trợ `commit`, `push`, `pr` và sibling worktree flows.", + "Hỗ trợ `commit`, `push`, `pr` và luồng worktree song song.", "Kiểm tra staged diff để phát hiện giá trị nhạy cảm trước commit.", - "Giữ Git handoff nhất quán với task state và verification receipt.", + "Giữ bàn giao Git nhất quán với trạng thái tác vụ và biên nhận kiểm chứng.", ], notes: [ { - title: "Command surface", + title: "Bề mặt lệnh", description: "Dùng `/hapo:git commit` và `/hapo:git push` sau khi review đã xanh.", }, { - title: "Safety", + title: "An toàn", description: - "Conventional commit và kiểm tra giá trị nhạy cảm xảy ra trước khi handoff repo.", + "Conventional commit và kiểm tra giá trị nhạy cảm diễn ra trước khi bàn giao dự án.", }, ], }, { tab: "/hapo:deploy", - title: "Bàn giao release qua stack hiện có", + title: "Bàn giao code qua quy trình sẵn có", description: - "CafeKit không thay thế pipeline deploy; nó giữ release story khép kín sau test, review và Git handoff.", + "CafeKit không thay thế quy trình triển khai; nó khép lại phần bàn giao sau kiểm thử, review và Git.", highlights: [ - "Đại diện cho Vercel, CI/CD hoặc pipeline production hiện có của team.", + "Đại diện cho Vercel, CI/CD hoặc quy trình production hiện có của đội ngũ.", "Chỉ nên chạy sau `hapo:test`, `hapo:code-review` và `hapo:git`.", - "Tránh claim native deploy quá mức; đây là release handoff theo stack của bạn.", + "Tránh nói quá về triển khai trực tiếp; đây là bước bàn giao qua quy trình của bạn.", ], notes: [ { - title: "Release handoff", + title: "Bàn giao", description: - "Deploy vẫn thuộc pipeline hiện có; CafeKit cung cấp guardrails trước khi bàn giao.", + "Triển khai vẫn thuộc quy trình hiện có; CafeKit cung cấp hàng rào kiểm chứng trước khi bàn giao.", }, { - title: "Điều kiện release", + title: "Điều kiện bàn giao", description: - "Chỉ ship code đã qua `hapo:test`, `hapo:code-review` và `hapo:git`.", + "Chỉ bàn giao code đã qua `hapo:test`, `hapo:code-review` và `hapo:git`.", }, ], }, ], }, quickStart: { - heading: "Cài runtime, chạy flow đầu tiên", + heading: "Cài bộ công cụ, chạy quy trình đầu tiên", subheading: - "Cài CafeKit, tạo spec đã validate, triển khai một task có Evidence, rồi test/review trước khi Git handoff.", + "Cài CafeKit, tạo đặc tả đã kiểm tra, triển khai một tác vụ có bằng chứng, rồi kiểm thử và review trước khi bàn giao bằng Git.", viewGuide: "Xem hướng dẫn bắt đầu nhanh đầy đủ", copied: "Đã sao chép", copy: "Sao chép", comments: [ "# 1. Cài đặt CafeKit", - "# 2. Tạo và validate spec", - "# 3. Triển khai từng task packet", - "# 4. Test và review candidate", - "# 5. Commit, push và bàn giao release", + "# 2. Tạo và kiểm tra đặc tả", + "# 3. Triển khai từng gói tác vụ", + "# 4. Kiểm thử và review bản thay đổi", + "# 5. Commit, push và bàn giao code", ], tutorialHeading: "Mới biết CafeKit?", - tutorialBody: "Đi từ repo chưa cài gì đến feature đầu tiên có spec, task và verification receipt.", + tutorialBody: "Đi từ dự án chưa cài gì đến tính năng đầu tiên có đặc tả, tác vụ và biên nhận kiểm chứng.", tutorialCta: "Bắt đầu hướng dẫn", }, contactForm: { diff --git a/cafekit-web/src/lib/site-shell-translations.ts b/cafekit-web/src/lib/site-shell-translations.ts index e0cb23e8..9d0e2690 100644 --- a/cafekit-web/src/lib/site-shell-translations.ts +++ b/cafekit-web/src/lib/site-shell-translations.ts @@ -76,7 +76,7 @@ const translations: Record = { }, footer: { description: - "Runtime spec-driven cho AI coding agents. Cài vào repo, tạo spec artifacts, triển khai từng task packet có Evidence, rồi test/review trước khi release handoff.", + "CafeKit là bộ công cụ vận hành cho AI coding agent, cài trực tiếp vào dự án để quản lý quy trình từ đặc tả, triển khai, kiểm thử, review đến bàn giao code.", readDocs: "Đọc tài liệu", github: "GitHub", product: "Sản phẩm", @@ -94,7 +94,7 @@ const translations: Record = { releases: "Releases", issues: "Issues", faq: "FAQ", - copyright: "Dành cho repo thật, không phải prompt demo.", + copyright: "Dành cho dự án thật, không phải prompt demo.", }, }, ja: {