fix: rename design skill to /ui so it stops shadowing Claude Code's /design

Claude Code ships a built-in /design (Claude Design). Waza's design skill
collided on it and silently shadowed the built-in, completely so under the
default -g install. /ui hands the command back: the built-in has no
namespaced fallback while Waza does. Routing keywords keep 设计/design so
plain-language requests still reach the skill.

Also tighten the README (fold the duplicated philosophy into one section,
lead with the skills diagram) and trim that diagram to drop the title and
install line that duplicated the surrounding README.
This commit is contained in:
Tw93
2026-06-27 11:33:51 +08:00
parent fd3705d033
commit df08298346
32 changed files with 147 additions and 86 deletions
+14 -14
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
"name": "waza",
"description": "Personal skill collection for Claude Code, Codex, Antigravity, OpenCode, and Pi: think, check, hunt, design, read, write, learn, and health for agent config and AI maintainability audits.",
"description": "Personal skill collection for Claude Code, Codex, Antigravity, OpenCode, and Pi: think, check, hunt, ui, read, write, learn, and health for agent config and AI maintainability audits.",
"owner": {
"name": "Tw93",
"email": "hitw93@gmail.com"
@@ -9,7 +9,7 @@
"plugins": [
{
"name": "waza",
"description": "Installs the full Waza toolkit. Registers all eight skills under the waza namespace, callable as /waza:think, /waza:check, /waza:hunt, /waza:design, /waza:read, /waza:write, /waza:learn, and /waza:health. For one skill on Claude Code v2.1.143 or newer, use /plugin install waza-<name>@waza.",
"description": "Installs the full Waza toolkit. Registers all eight skills under the waza namespace, callable as /waza:think, /waza:check, /waza:hunt, /waza:ui, /waza:read, /waza:write, /waza:learn, and /waza:health. For one skill on Claude Code v2.1.143 or newer, use /plugin install waza-<name>@waza.",
"version": "3.29.0",
"category": "development",
"source": "./",
@@ -27,18 +27,6 @@
],
"strict": false
},
{
"name": "waza-design",
"description": "Produces distinctive, production-grade UI for pages, components, visual interfaces, typography, and screenshot-driven polish. Use when users ask in any language for UI, page, component, frontend, typography, screenshot-grounded visual polish, or complaints that a screen looks unclear, ugly, inconsistent, or visually wrong. Not for backend logic or data pipelines.",
"version": "3.29.0",
"category": "development",
"source": "./skills/design",
"homepage": "https://github.com/tw93/Waza",
"skills": [
"./"
],
"strict": false
},
{
"name": "waza-health",
"description": "Runs a budget-aware agent-assisted engineering health audit for instruction/config drift, hooks/MCP, verifier surfaces, and AI maintainability. Use when users ask in any language to audit Claude, Codex, Pi, agent instructions, MCP or hooks, verifier coverage, or AI-maintainability drift. Not for debugging application code or reviewing PRs.",
@@ -99,6 +87,18 @@
],
"strict": false
},
{
"name": "waza-ui",
"description": "Produces distinctive, production-grade UI for pages, components, visual interfaces, typography, and screenshot-driven polish. Use when users ask in any language for UI, page, component, frontend, typography, screenshot-grounded visual polish, or complaints that a screen looks unclear, ugly, inconsistent, or visually wrong. Not for backend logic or data pipelines.",
"version": "3.29.0",
"category": "development",
"source": "./skills/ui",
"homepage": "https://github.com/tw93/Waza",
"skills": [
"./"
],
"strict": false
},
{
"name": "waza-write",
"description": "Rewrites and polishes prose in Chinese or English, removes AI-like wording, and reviews product localization copy while preserving intent for drafts, docs, release notes, launch copy, and social posts. Use when users ask in any language to draft, rewrite, proofread, localize, polish release notes, remove AI-like wording, or prepare launch and social copy. Not for code comments, commit messages, or inline docs.",
+2 -2
View File
@@ -4,7 +4,7 @@ This file is the canonical agent guide for the Waza repository. `CLAUDE.md` is a
## Project
Waza is a skill collection for engineering workflows. The repository contains eight skills: `think`, `design`, `check`, `hunt`, `write`, `learn`, `read`, and `health`.
Waza is a skill collection for engineering workflows. The repository contains eight skills: `think`, `ui`, `check`, `hunt`, `write`, `learn`, `read`, and `health`.
## Repository Map
@@ -54,7 +54,7 @@ Examples: `verify_skills.py` is a script; `rules/english.md` and `rules/chinese.
- Put adaptive, judgment-heavy workflows in skills.
- Put deterministic checks, lookups, and table-driven validation in scripts.
- `rules/anti-patterns.md` owns cross-skill always-on behavioral guardrails (AI failure modes that apply regardless of active skill). Per-skill gotchas stay in each `skills/*/SKILL.md` Gotchas table; a gotcha belongs in `rules/anti-patterns.md` only when it applies identically across all eight skills.
- Catalogs consolidate, they do not accumulate. This covers `rules/anti-patterns.md` rows and every reference example list, banned-phrase list, and replacement table (`skills/write/references/*`, `skills/design/references/*`, and the like). Before adding a row, pattern, banned phrase, or example, find the existing row or principle it instantiates and fold it in; never append a near-synonym or a third encoding of a rule already stated above. Keep wording generic enough to ship outside this repo. A reference file that re-lists items it already covers under a numbered pattern is drift, not coverage.
- Catalogs consolidate, they do not accumulate. This covers `rules/anti-patterns.md` rows and every reference example list, banned-phrase list, and replacement table (`skills/write/references/*`, `skills/ui/references/*`, and the like). Before adding a row, pattern, banned phrase, or example, find the existing row or principle it instantiates and fold it in; never append a near-synonym or a third encoding of a rule already stated above. Keep wording generic enough to ship outside this repo. A reference file that re-lists items it already covers under a numbered pattern is drift, not coverage.
- The no-op test prunes skill prose sentence by sentence: a line earns its place only if it changes behavior versus the model's default. A line that re-teaches what a capable model already does (`be thorough` to an already-thorough agent) is a no-op you pay context load to say nothing; delete the whole sentence, do not trim words from it. When unsure whether a line states a default, assume it does and cut.
- Leading words collapse a restated quality into one pretrained token the model already thinks with: `fast, deterministic, low-overhead` becomes a `tight` loop; `a repro you trust` becomes the loop that goes `red` on the bug. One token anchors a whole region of behavior and gives a sharper hook than the spelled-out triad, at fewer tokens. When a skill states the same quality three times, that is the passage to collapse into a leading word.
- Keep `skills/RESOLVER.md` in sync when a skill description, trigger, or scope changes.
+18 -39
View File
@@ -11,18 +11,8 @@
<br/>
## Why
Waza (技, わざ) is a Japanese martial arts term for technique: a move practiced until it becomes instinct.
A good engineer does not just write code. They think through requirements, review their own work, debug systematically, design interfaces that feel intentional, and read primary sources. They write clearly, and learn new domains by producing output, not consuming content.
AI is more capable than most engineers at raw output. But without structure, that capability drifts into generic, imprecise work. Waza channels it into precision: eight skills that set clear goals and constraints, then let the model do what it does best.
Part of a trilogy: [Kaku](https://github.com/tw93/Kaku) (書く) writes code, [Waza](https://github.com/tw93/Waza) (技) drills habits, [Kami](https://github.com/tw93/Kami) (紙) ships documents. Think of them as a family: Kaku is the dad, Waza the big sister, Kami the little sister.
<div align="center">
<img src="https://gw.alipayobjects.com/zos/k/qa/waza_repaired_v4.svg" width="1000" />
<img src="assets/waza_skills.svg" width="1000" />
</div>
## Skills
@@ -32,7 +22,7 @@ Each engineering habit gets an installed skill. In Claude Code, type the slash c
| Skill | When | What it does |
| :--- | :--- | :--- |
| [`/think`](skills/think/SKILL.md) | Before building anything new | Challenges the problem, pressure-tests the design, and produces a decision-complete plan another agent can implement. |
| [`/design`](skills/design/SKILL.md) | Building frontend interfaces | Produces distinctive UI, including screenshot-driven aesthetic iteration, with a committed direction rather than generic defaults. |
| [`/ui`](skills/ui/SKILL.md) | Building frontend interfaces | Produces distinctive UI, including screenshot-driven aesthetic iteration, with a committed direction rather than generic defaults. |
| [`/check`](skills/check/SKILL.md) | After a task, before merging or release | Reviews the diff, extracts project-specific constraints, handles approved release/publish/push/reaction follow-through, and verifies with evidence. |
| [`/hunt`](skills/hunt/SKILL.md) | Any bug, regression, or unexpected behavior | Systematic debugging. Root cause confirmed before any fix is applied, especially when something used to work. |
| [`/write`](skills/write/SKILL.md) | Writing or editing prose | Rewrites prose to sound natural in Chinese and English. Cuts stiff, formulaic phrasing. |
@@ -68,30 +58,20 @@ codex plugin add waza@waza
**Pi**: `pi install npm:@tw93/waza` (update with `pi update npm:@tw93/waza`). `/health` audits Pi settings alongside Claude Code and Codex.
To hear about new versions, watch [GitHub Releases](https://github.com/tw93/Waza/releases).
## Project Context
Waza keeps the generic programmer habits inside the public skill. `/check` becomes project-aware by reading the target repository's public context and the user's task constraints.
- Project commands come from README files, package manifests, Makefiles, CI workflows, and explicit user instructions.
- Project hard stops include generated artifacts, protected files, version synchronization, release assets, and domain-specific safety risks.
- Public docs and examples must not include credentials, certificate paths, private key filenames, tokens, or personal machine details.
See [`skills/check/references/project-context.md`](skills/check/references/project-context.md) for the review context template.
## Chaining Skills
Skills are designed to be chained together, but transitions are manual. Each skill stops after completing its task and waits for you to decide the next step.
Skills chain together, but every transition is a manual step you trigger. Each skill finishes its task and stops, waiting for you to decide what comes next.
**Common workflows:**
- **Design a feature**: `/think` → approve → say "implement X" → `/check` → merge
- **Plan a feature**: `/think` → approve → say "implement X" → `/check` → merge
- **Ship a fix**: `/hunt` → fix → `/check` → release/publish/push/issue follow-through
- **Research and write**: `/read` (fetch sources) → `/learn` (synthesize) → `/write` (polish)
- **Debug and verify**: `/hunt` (find root cause) → fix → `/check` (review changes)
Each arrow represents a manual user action. Skills don't automatically trigger each other.
## Project Context
Waza ships only generic engineering habits. `/check` becomes project-aware at runtime by reading the target repository's public context (READMEs, package manifests, Makefiles, CI workflows) and your task constraints, never private paths, credentials, or tokens. See [`skills/check/references/project-context.md`](skills/check/references/project-context.md) for the review context template.
## Extras
@@ -138,6 +118,16 @@ curl -sL https://github.com/tw93/Waza/releases/latest/download/setup-rule.sh | b
Curl URLs use the latest GitHub release asset. Set `WAZA_REF=main` before the command if you want bleeding-edge scripts.
## Why
Waza (技, わざ) is a Japanese martial arts term for technique: a move practiced until it becomes instinct.
A good engineer does more than write code. They pressure-test requirements, debug to root cause, review their own diffs, and read primary sources. AI has the raw output for all of it, but without structure that output drifts into generic, imprecise work. Each Waza skill sets a clear goal and the constraints that matter, then steps back and lets the model work. As models improve, that restraint pays compound interest.
Tools like Superpowers and gstack are powerful but heavy: too many skills, too much configuration. Waza stays small, eight skills for the habits that actually matter, each with one job and a clear trigger. Built from real projects and refined through 300+ sessions across 7 projects, every gotcha traces to a real failure. The `/health` skill grew from the six-layer Claude Code framework in [this post](https://tw93.fun/en/2026-03-12/claude.html).
Part of a trilogy: [Kaku](https://github.com/tw93/Kaku) (書く) writes code, [Waza](https://github.com/tw93/Waza) (技) drills habits, [Kami](https://github.com/tw93/Kami) (紙) ships documents. Think of them as a family: Kaku is the dad, Waza the big sister, Kami the little sister.
## Uninstall
```bash
@@ -150,21 +140,10 @@ rm -f ~/.claude/rules/waza-routing.md
For Claude Desktop, delete Waza from Customize > Skills. For Codex rule installs, remove the marked Waza blocks from `~/.codex/AGENTS.md`.
## Background
Tools like Superpowers and gstack are impressive but heavy: too many skills, too much configuration, too steep a learning curve.
Every rule the author writes is also a ceiling. The model can only do what the instructions say. Waza goes the other way: each skill sets a clear goal and the constraints that matter, then steps back. As models improve, that restraint pays compound interest.
Eight skills for the habits that actually matter. Each does one thing, has a clear trigger, and stays out of the way. Built from real projects, refined through 300+ sessions across 7 projects. Every gotcha traces to a real failure.
The `/health` skill grew from the six-layer Claude Code framework described in [this post](https://tw93.fun/en/2026-03-12/claude.html), and now covers Codex, Claude Code, Pi, verifier surfaces, and AI maintainability.
## Support
- The most direct way to support me is getting [Mole for Mac](https://mole.fit), my paid Mac cleanup app.
- If Waza helped you, [share it](https://twitter.com/intent/tweet?url=https://github.com/tw93/Waza&text=Waza%20-%20AI%20coding%20skills%20for%20the%20complete%20engineer.) with friends or give it a star.
- Got ideas or bugs? Open an issue or PR, feel free to contribute your best AI model.
- If Waza helped you, give it a star, [share it](https://twitter.com/intent/tweet?url=https://github.com/tw93/Waza&text=Waza%20-%20AI%20coding%20skills%20for%20the%20complete%20engineer.), or open an issue or PR.
- I have two cats, TangYuan and Coke. If you think Waza delights your life, you can feed them <a href="https://cats.tw93.fun?name=Waza" target="_blank">canned food 🥩</a>.
<details>
+82
View File
@@ -0,0 +1,82 @@
<svg width="100%" viewBox="0 48 680 320" xmlns="http://www.w3.org/2000/svg">
<defs>
<marker id="arrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
<path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</marker>
<mask id="imagine-text-gaps-c2uj90" maskUnits="userSpaceOnUse"><rect x="0" y="0" width="680" height="410" fill="white"/><rect x="318.11187744140625" y="12.298445701599121" width="43.776283264160156" height="21.25381088256836" fill="black" rx="2"/><rect x="247.2055206298828" y="32.328304290771484" width="185.58895874023438" height="18.716485023498535" fill="black" rx="2"/><rect x="316.47845458984375" y="90.32830810546875" width="47.043087005615234" height="18.716485023498535" fill="black" rx="2"/><rect x="136.26834106445312" y="82.37309265136719" width="47.46333312988281" height="21.25381088256836" fill="black" rx="2"/><rect x="82.11229705810547" y="102.64176177978516" width="155.775390625" height="18.716485023498535" fill="black" rx="2"/><rect x="491.39190673828125" y="82.37309265136719" width="57.2161750793457" height="21.25381088256836" fill="black" rx="2"/><rect x="447.3891296386719" y="102.64176177978516" width="145.22171020507812" height="18.716485023498535" fill="black" rx="2"/><rect x="320.748291015625" y="162.32830810546875" width="38.50340461730957" height="18.716485023498535" fill="black" rx="2"/><rect x="138.09600830078125" y="154.3730926513672" width="43.80799865722656" height="21.25381088256836" fill="black" rx="2"/><rect x="96.02001190185547" y="174.64175415039062" width="127.95996856689453" height="18.716485023498535" fill="black" rx="2"/><rect x="493.3741760253906" y="154.3730926513672" width="53.25160598754883" height="21.25381088256836" fill="black" rx="2"/><rect x="445.1015625" y="174.64175415039062" width="149.7968292236328" height="18.716485023498535" fill="black" rx="2"/><rect x="312.9737854003906" y="234.32830810546875" width="54.05244827270508" height="18.716485023498535" fill="black" rx="2"/><rect x="138.456787109375" y="226.3730926513672" width="43.086448669433594" height="21.25381088256836" fill="black" rx="2"/><rect x="81.20440673828125" y="246.6417694091797" width="157.59117126464844" height="18.716469764709473" fill="black" rx="2"/><rect x="496.0542297363281" y="226.3730926513672" width="47.89150619506836" height="21.25381088256836" fill="black" rx="2"/><rect x="448.4436950683594" y="246.6417694091797" width="143.11256408691406" height="18.716469764709473" fill="black" rx="2"/><rect x="320.5064697265625" y="306.32830810546875" width="38.98708152770996" height="18.716485023498535" fill="black" rx="2"/><rect x="136.70840454101562" y="298.37310791015625" width="46.58319854736328" height="21.25381088256836" fill="black" rx="2"/><rect x="74.40120697021484" y="318.6417541503906" width="171.19757080078125" height="18.716485023498535" fill="black" rx="2"/><rect x="492.3592529296875" y="298.37310791015625" width="55.28146743774414" height="21.25381088256836" fill="black" rx="2"/><rect x="454.909912109375" y="318.6417541503906" width="130.1801300048828" height="18.716485023498535" fill="black" rx="2"/><rect x="251.92335510253906" y="374.32830810546875" width="176.15328979492188" height="18.716485023498535" fill="black" rx="2"/></mask></defs>
<line x1="340" y1="72" x2="340" y2="344" stroke-dasharray="3 4" mask="url(#imagine-text-gaps-c2uj90)" style="fill:none;stroke:rgb(115, 114, 108);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-dasharray:4px, 3px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<!-- Row 1: Design -->
<line x1="278" y1="100" x2="308" y2="100" style="fill:none;stroke:rgb(115, 114, 108);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-dasharray:4px, 3px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="372" y1="100" x2="402" y2="100" style="fill:none;stroke:rgb(115, 114, 108);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-dasharray:4px, 3px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="340" y="104" text-anchor="middle" opacity="0.5" style="fill:rgb(61, 61, 58);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:auto">Design</text>
<g onclick="sendPrompt('/think: challenges the problem, pressure-tests the design, validates architecture before code')" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="45" y="72" width="230" height="56" rx="8" stroke-width="0.5" style="fill:rgb(238, 237, 254);stroke:rgb(83, 74, 183);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="160" y="93" text-anchor="middle" dominant-baseline="central" style="fill:rgb(60, 52, 137);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">/think</text>
<text x="160" y="112" text-anchor="middle" dominant-baseline="central" style="fill:rgb(83, 74, 183);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">Pressure-test before code</text>
</g>
<g onclick="sendPrompt('/ui: distinctive UI with committed aesthetic direction, no generic AI aesthetics')" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="405" y="72" width="230" height="56" rx="8" stroke-width="0.5" style="fill:rgb(238, 237, 254);stroke:rgb(83, 74, 183);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="520" y="93" text-anchor="middle" dominant-baseline="central" style="fill:rgb(60, 52, 137);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">/ui</text>
<text x="520" y="112" text-anchor="middle" dominant-baseline="central" style="fill:rgb(83, 74, 183);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">No generic AI aesthetics</text>
</g>
<!-- Row 2: Solve -->
<line x1="278" y1="172" x2="312" y2="172" style="fill:none;stroke:rgb(115, 114, 108);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-dasharray:4px, 3px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="368" y1="172" x2="402" y2="172" style="fill:none;stroke:rgb(115, 114, 108);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-dasharray:4px, 3px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="340" y="176" text-anchor="middle" opacity="0.5" style="fill:rgb(61, 61, 58);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:auto">Solve</text>
<g onclick="sendPrompt('/hunt: systematic debugging, root cause confirmed before any fix is applied')" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="45" y="144" width="230" height="56" rx="8" stroke-width="0.5" style="fill:rgb(225, 245, 238);stroke:rgb(15, 110, 86);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="160" y="165" text-anchor="middle" dominant-baseline="central" style="fill:rgb(8, 80, 65);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">/hunt</text>
<text x="160" y="184" text-anchor="middle" dominant-baseline="central" style="fill:rgb(15, 110, 86);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">Root cause before fix</text>
</g>
<g onclick="sendPrompt('/check: reviews diff, auto-fixes safe issues, verifies with evidence before claiming done')" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="405" y="144" width="230" height="56" rx="8" stroke-width="0.5" style="fill:rgb(225, 245, 238);stroke:rgb(15, 110, 86);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="520" y="165" text-anchor="middle" dominant-baseline="central" style="fill:rgb(8, 80, 65);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">/check</text>
<text x="520" y="184" text-anchor="middle" dominant-baseline="central" style="fill:rgb(15, 110, 86);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">Review diff before merge</text>
</g>
<!-- Row 3: Express -->
<line x1="278" y1="244" x2="304" y2="244" style="fill:none;stroke:rgb(115, 114, 108);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-dasharray:4px, 3px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="376" y1="244" x2="402" y2="244" style="fill:none;stroke:rgb(115, 114, 108);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-dasharray:4px, 3px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="340" y="248" text-anchor="middle" opacity="0.5" style="fill:rgb(61, 61, 58);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:auto">Express</text>
<g onclick="sendPrompt('/read: fetches any URL or PDF as clean Markdown via proxy cascade')" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="45" y="216" width="230" height="56" rx="8" stroke-width="0.5" style="fill:rgb(250, 236, 231);stroke:rgb(153, 60, 29);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="160" y="237" text-anchor="middle" dominant-baseline="central" style="fill:rgb(113, 43, 19);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">/read</text>
<text x="160" y="256" text-anchor="middle" dominant-baseline="central" style="fill:rgb(153, 60, 29);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">Clean Markdown via proxy</text>
</g>
<g onclick="sendPrompt('/write: enforces natural style for Chinese and English, strips AI writing patterns')" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="405" y="216" width="230" height="56" rx="8" stroke-width="0.5" style="fill:rgb(250, 236, 231);stroke:rgb(153, 60, 29);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="520" y="237" text-anchor="middle" dominant-baseline="central" style="fill:rgb(113, 43, 19);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">/write</text>
<text x="520" y="256" text-anchor="middle" dominant-baseline="central" style="fill:rgb(153, 60, 29);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">Strip AI writing patterns</text>
</g>
<!-- Row 4: Grow -->
<line x1="278" y1="316" x2="312" y2="316" style="fill:none;stroke:rgb(115, 114, 108);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-dasharray:4px, 3px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="368" y1="316" x2="402" y2="316" style="fill:none;stroke:rgb(115, 114, 108);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-dasharray:4px, 3px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="340" y="320" text-anchor="middle" opacity="0.5" style="fill:rgb(61, 61, 58);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:auto">Grow</text>
<g onclick="sendPrompt('/learn: six-phase research - collect, digest, outline, draft, refine, publish')" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="45" y="288" width="230" height="56" rx="8" stroke-width="0.5" style="fill:rgb(250, 238, 218);stroke:rgb(133, 79, 11);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="160" y="309" text-anchor="middle" dominant-baseline="central" style="fill:rgb(99, 56, 6);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">/learn</text>
<text x="160" y="328" text-anchor="middle" dominant-baseline="central" style="fill:rgb(133, 79, 11);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">Six-phase research workflow</text>
</g>
<g onclick="sendPrompt('/health: audits CLAUDE.md, rules, skills, hooks, MCP, behavior')" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="405" y="288" width="230" height="56" rx="8" stroke-width="0.5" style="fill:rgb(250, 238, 218);stroke:rgb(133, 79, 11);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="520" y="309" text-anchor="middle" dominant-baseline="central" style="fill:rgb(99, 56, 6);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">/health</text>
<text x="520" y="328" text-anchor="middle" dominant-baseline="central" style="fill:rgb(133, 79, 11);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">Audit config when off</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "waza",
"version": "3.29.0",
"description": "Engineering workflow skills for Codex: think, check, hunt, design, read, write, learn, and health.",
"description": "Engineering workflow skills for Codex: think, check, hunt, ui, read, write, learn, and health.",
"author": {
"name": "Tw93",
"email": "hitw93@gmail.com",
@@ -23,7 +23,7 @@
"interface": {
"displayName": "Waza",
"shortDescription": "Engineering workflow skills for Codex",
"longDescription": "Waza packages eight engineering habits as Codex skills: think for planning, check for review, hunt for debugging, design for frontend work, read for source intake, write for prose, learn for domain research, and health for agent configuration audits.",
"longDescription": "Waza packages eight engineering habits as Codex skills: think for planning, check for review, hunt for debugging, ui for frontend work, read for source intake, write for prose, learn for domain research, and health for agent configuration audits.",
"developerName": "Tw93",
"category": "Developer Tools",
"capabilities": [
+1 -1
View File
@@ -5,7 +5,7 @@ Waza ships eight installed skills. When a request matches a trigger below, prefe
| skill | use when |
|---------|-------------------------------------------------------------------------------------------|
| think | new feature / architecture / "怎么设计" / "有没有必要" / "值不值得" / product judgment |
| design | UI / page / component / frontend / typography / screenshot says "丑/不清晰/不和谐" |
| ui | UI / page / component / frontend / typography / screenshot says "丑/不清晰/不和谐" |
| check | review / "看看代码" / pre-merge / "继续优化" / release / push / close issue |
| hunt | error / crash / regression / test failure / "以前是好的" / screenshot proves regression |
| write | draft / rewrite / proofread / "去 AI 味" / tweet / launch copy / document review |
+3 -3
View File
@@ -15,7 +15,7 @@
| 触发 | 技能 |
|------|------|
| 新功能 / 架构决策 / "怎么设计" / "应该用什么方案" / "判断一下" / "有没有必要" / "值不值得" / 商业化/产品 pivot / 需要可执行计划或 handoff | `skills/think/SKILL.md` |
| UI / 组件 / 页面 / 视觉界面 / 前端 / 截图里说"丑"、"不清晰"、"很怪" / 真实截图视觉 polish | `skills/design/SKILL.md` |
| UI / 组件 / 页面 / 视觉界面 / 前端 / 截图里说"丑"、"不清晰"、"很怪" / 真实截图视觉 polish | `skills/ui/SKILL.md` |
### Post-build交付前
@@ -46,12 +46,12 @@
多个技能都可能匹配时按以下规则:
1. **最具体优先**`/design``/think` 更具体(仅限 UI 决策)。用户说"帮我设计登录页"时优先 `/design`
1. **最具体优先**`/ui``/think` 更具体(仅限 UI 决策)。用户说"帮我设计登录页"时优先 `/ui`
2. **URL 按内容类型二次分流**:消息含 URL → 先走 `/read` 取回 Markdown → 如果用户要总结或分析,继续完成总结或分析;如果是长文研究性素材再接 `/learn`
3. **改错 vs review**:代码已经交付或走到 PR → `/check`;代码跑不通或行为错了 → `/hunt`。两者都可能匹配"帮我看看",按"有没有具体错误现象"判断。
4. **配置/维护性异常 vs 代码错误**Claude/Codex 本身不听话、hook 不触发、MCP 掉链子、AGENTS/CLAUDE/config.toml 漂移、`/health` 消耗 token、AI coding 腐化、上下文混乱、验证缺失或验证命令失真 → `/health`;用户写的代码抛异常 → `/hunt`
5. **发布动作 vs 发布文案**:要写 release notes / changelog → `/write`;要提交、打 tag、publish、push、上传 release asset、补 GitHub release reactions、回复/关闭 issue → `/check`
6. **截图审美 vs 截图回归**:截图里说"丑/不好看/不清晰"且是审美校准 → `/design`;截图证明以前好的现在坏了、渲染错、状态错、生成物错 → `/hunt`
6. **截图审美 vs 截图回归**:截图里说"丑/不好看/不清晰"且是审美校准 → `/ui`;截图证明以前好的现在坏了、渲染错、状态错、生成物错 → `/hunt`
7. **长文产出 vs 润色**:从零到成稿 → `/learn`;已有稿子要改 → `/write`
8. **判断 vs 调试**"判断一下" + 报错/异常/不工作 → `/hunt`(诊断问题);"判断一下" + 有没有必要/该不该保留/值不值得 → `/think` Evaluation Mode价值判断
9. **继续优化 vs 调试**"继续优化" / "优化代码" 不含报错或异常现象 → `/check`(代码质量改善);有具体报错或回归 → `/hunt`
+1 -1
View File
@@ -84,7 +84,7 @@ Treat the reference as evidence, not decoration:
4. Compare current vs. reference and name the exact delta. Do not generalize a visual defect into "style polish" when the evidence points to a broken render, race, font pipeline, or state path.
5. If the same symptom remains after one attempted fix, stop and rebuild the hypothesis from the evidence. Do not stack more patches onto a disproven explanation.
If the issue is purely subjective UI taste, route to `/design`. If it is rendering, state, timing, build output, font generation, or a regression from a known-good version, stay in `/hunt`.
If the issue is purely subjective UI taste, route to `/ui`. If it is rendering, state, timing, build output, font generation, or a regression from a known-good version, stay in `/hunt`.
## Scope Blast Mode
@@ -1,5 +1,5 @@
---
name: design
name: ui
description: "Produces distinctive, production-grade UI for pages, components, visual interfaces, typography, and screenshot-driven polish. Use when users ask in any language for UI, page, component, frontend, typography, screenshot-grounded visual polish, or complaints that a screen looks unclear, ugly, inconsistent, or visually wrong. Not for backend logic or data pipelines."
when_to_use: "设计, 做页面, 做组件, 不好看, 不和谐, 不清晰, 很丑, 很怪, 很傻, 突兀, 不协调, 字体, 字形, 排印, 排版, 样式, 前端, UI, 截图, build page, create component, make it look good, style, design, screenshot with visual complaint, typography, font looks wrong"
dispatch_intent: "UI, component, page, visual interface, frontend, artifact-grounded screenshot aesthetic complaint"
@@ -30,7 +30,7 @@ If it could have been generated by a default prompt, it is not good enough.
See [rules/durable-context.md](../../rules/durable-context.md) for when to read durable context, the read-order budget, and the memory-type mapping.
For `/design`, visual constraints are `decision`, `preference`, and `principle` entries; reusable product and UI patterns are `pattern` and `learning`. Current screenshots, rendered output, code, design tokens, and user feedback override memory. Reuse durable visual preferences and mature interaction patterns, but still name the current visual problem from the screenshot or source before changing code.
For `/ui`, visual constraints are `decision`, `preference`, and `principle` entries; reusable product and UI patterns are `pattern` and `learning`. Current screenshots, rendered output, code, design tokens, and user feedback override memory. Reuse durable visual preferences and mature interaction patterns, but still name the current visual problem from the screenshot or source before changing code.
## Visual Quick-Fix Mode
+1 -1
View File
@@ -5,7 +5,7 @@ Waza ships eight installed skills. When a request matches a trigger below, prefe
| skill | use when |
|---------|-------------------------------------------------------------------------------------------|
| think | new feature / architecture / "怎么设计" / "有没有必要" / "值不值得" / product judgment |
| design | UI / page / component / frontend / typography / screenshot says "丑/不清晰/不和谐" |
| ui | UI / page / component / frontend / typography / screenshot says "丑/不清晰/不和谐" |
| check | review / "看看代码" / pre-merge / "继续优化" / release / push / close issue |
| hunt | error / crash / regression / test failure / "以前是好的" / screenshot proves regression |
| write | draft / rewrite / proofread / "去 AI 味" / tweet / launch copy / document review |
+4 -4
View File
@@ -50,7 +50,7 @@ CLAUDE_MARKETPLACE_TOP = {
"name": "waza",
"description": (
"Personal skill collection for Claude Code, Codex, Antigravity, "
"OpenCode, and Pi: think, check, hunt, design, read, write, learn, "
"OpenCode, and Pi: think, check, hunt, ui, read, write, learn, "
"and health for agent config and AI maintainability audits."
),
"owner": {
@@ -62,7 +62,7 @@ CLAUDE_MARKETPLACE_TOP = {
BUNDLE_DESCRIPTION = (
"Installs the full Waza toolkit. Registers all eight skills under the "
"waza namespace, callable as /waza:think, /waza:check, /waza:hunt, "
"/waza:design, /waza:read, /waza:write, /waza:learn, and /waza:health. "
"/waza:ui, /waza:read, /waza:write, /waza:learn, and /waza:health. "
"For one skill on Claude Code v2.1.143 or newer, use /plugin install "
"waza-<name>@waza."
)
@@ -79,7 +79,7 @@ AUTHOR = {
}
CODEX_DESCRIPTION = (
"Engineering workflow skills for Codex: think, check, hunt, design, read, "
"Engineering workflow skills for Codex: think, check, hunt, ui, read, "
"write, learn, and health."
)
CODEX_MIRROR_IGNORED_DIRS = {
@@ -188,7 +188,7 @@ def build_codex_plugin(version: str) -> dict:
"longDescription": (
"Waza packages eight engineering habits as Codex skills: "
"think for planning, check for review, hunt for debugging, "
"design for frontend work, read for source intake, write for "
"ui for frontend work, read for source intake, write for "
"prose, learn for domain research, and health for agent "
"configuration audits."
),
+3 -3
View File
@@ -1,6 +1,6 @@
---
name: waza
description: 'Dispatcher for Waza engineering skills: think (architecture/handoff), design (artifact-grounded UI), check (review/release gates), hunt (runtime debugging/regression), write (prose/release copy), learn (research), read (URL/PDF fetch), health (agent config and AI maintainability audit).'
description: 'Dispatcher for Waza engineering skills: think (architecture/handoff), ui (artifact-grounded interface design), check (review/release gates), hunt (runtime debugging/regression), write (prose/release copy), learn (research), read (URL/PDF fetch), health (agent config and AI maintainability audit).'
---
# Waza: Engineering Skills Dispatcher
@@ -24,12 +24,12 @@ You have eight skills available. Match the user's intent to the right skill, rea
If the message could match multiple skills, use these disambiguation rules:
1. Most specific wins: `/design` is more specific than `/think` for UI decisions.
1. Most specific wins: `/ui` is more specific than `/think` for UI decisions.
2. URL in message: start with `/read`. If the content is research material, chain to `/learn`.
3. Code already done vs. code broken: done/PR -> `/check`; error/broken -> `/hunt`.
4. Config/maintainability vs. code: Codex/Claude misbehaving, hooks/MCP, `/health` token usage, AI coding code rot, unclear context, missing verification, or stale verifier output -> `/health`; user code errors -> `/hunt`.
5. Release action vs. release prose: commit/tag/publish/push/release reactions/close issue -> `/check`; write release notes/changelog text -> `/write`.
6. Screenshot taste vs. screenshot regression: visual taste complaint -> `/design`; broken render/state/generated output or used-to-work evidence -> `/hunt`.
6. Screenshot taste vs. screenshot regression: visual taste complaint -> `/ui`; broken render/state/generated output or used-to-work evidence -> `/hunt`.
7. From scratch vs. editing: new long-form output -> `/learn`; existing draft to polish -> `/write`.
8. "Judge this" + error -> `/hunt`; "judge this" + should we keep it -> `/think`.
9. Still ambiguous: read both skills' "Not for" sections; use exclusion. If still unclear, ask the user.
+4 -4
View File
@@ -1,6 +1,6 @@
---
name: waza
description: 'Dispatcher for Waza engineering skills: think (architecture/handoff), design (artifact-grounded UI), check (review/release gates), hunt (runtime debugging/regression), write (prose/release copy), learn (research), read (URL/PDF fetch), health (agent config and AI maintainability audit).'
description: 'Dispatcher for Waza engineering skills: think (architecture/handoff), ui (artifact-grounded interface design), check (review/release gates), hunt (runtime debugging/regression), write (prose/release copy), learn (research), read (URL/PDF fetch), health (agent config and AI maintainability audit).'
---
# Waza: Engineering Skills Dispatcher
@@ -17,12 +17,12 @@ You have eight skills available. Match the user's intent to the right skill, rea
| Intent | Skill | File |
|--------|-------|------|
| Code review, before merge, release gates, generated artifacts, safety sinks, publish/push/reaction follow-through, triage issues/PRs, project-wide code-quality audit scorecard | check | `skills/check/SKILL.md` |
| UI, component, page, visual interface, frontend, artifact-grounded screenshot aesthetic complaint | design | `skills/design/SKILL.md` |
| Codex/Claude/Pi ignoring instructions, agent config audit, hooks/MCP broken, health token usage, AI coding code rot, hotspot ownership, unclear context, missing verification, stale verifier output | health | `skills/health/SKILL.md` |
| Error, crash, regression, screenshot-reported defect, test failure, stale cache, runtime boundary, why broken | hunt | `skills/hunt/SKILL.md` |
| Deep research, unfamiliar domain, compile sources into output | learn | `skills/learn/SKILL.md` |
| Any URL or PDF to fetch, read this, fetch this page | read | `skills/read/SKILL.md` |
| New feature, architecture, how should I design this, value judgment, executable plan, handoff | think | `skills/think/SKILL.md` |
| UI, component, page, visual interface, frontend, artifact-grounded screenshot aesthetic complaint | ui | `skills/ui/SKILL.md` |
| Writing, editing prose, polish, release notes, launch/social copy, remove AI tone | write | `skills/write/SKILL.md` |
<!-- routing-table:end -->
@@ -34,12 +34,12 @@ You have eight skills available. Match the user's intent to the right skill, rea
If the message could match multiple skills, use these disambiguation rules:
1. Most specific wins: `/design` is more specific than `/think` for UI decisions.
1. Most specific wins: `/ui` is more specific than `/think` for UI decisions.
2. URL in message: start with `/read`. If the content is research material, chain to `/learn`.
3. Code already done vs. code broken: done/PR -> `/check`; error/broken -> `/hunt`.
4. Config/maintainability vs. code: Codex/Claude misbehaving, hooks/MCP, `/health` token usage, AI coding code rot, unclear context, missing verification, or stale verifier output -> `/health`; user code errors -> `/hunt`.
5. Release action vs. release prose: commit/tag/publish/push/release reactions/close issue -> `/check`; write release notes/changelog text -> `/write`.
6. Screenshot taste vs. screenshot regression: visual taste complaint -> `/design`; broken render/state/generated output or used-to-work evidence -> `/hunt`.
6. Screenshot taste vs. screenshot regression: visual taste complaint -> `/ui`; broken render/state/generated output or used-to-work evidence -> `/hunt`.
7. From scratch vs. editing: new long-form output -> `/learn`; existing draft to polish -> `/write`.
8. "Judge this" + error -> `/hunt`; "judge this" + should we keep it -> `/think`.
9. Still ambiguous: read both skills' "Not for" sections; use exclusion. If still unclear, ask the user.
+1 -1
View File
@@ -48,7 +48,7 @@ FORCED_GITHUB_TOOL_RE = re.compile(
)
CJK_RE = re.compile(r"[\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff]")
DURABLE_CONTEXT_SKILLS = {"think", "check", "hunt", "design", "write", "health"}
DURABLE_CONTEXT_SKILLS = {"think", "check", "hunt", "ui", "write", "health"}
NINJA_PREFIX = "Prefix your first line with 🥷 inline, not as its own paragraph."
OUTCOME_CONTRACT_FIELDS = ("Outcome:", "Done when:", "Evidence:", "Output:")
+1 -1
View File
@@ -17,7 +17,7 @@ import sys
from pathlib import Path
EXPECTED_SKILLS = ["think", "design", "check", "hunt", "write", "learn", "read", "health"]
EXPECTED_SKILLS = ["think", "ui", "check", "hunt", "write", "learn", "read", "health"]
def main() -> int:
+3 -3
View File
@@ -15,7 +15,7 @@
| 触发 | 技能 |
|------|------|
| 新功能 / 架构决策 / "怎么设计" / "应该用什么方案" / "判断一下" / "有没有必要" / "值不值得" / 商业化/产品 pivot / 需要可执行计划或 handoff | `skills/think/SKILL.md` |
| UI / 组件 / 页面 / 视觉界面 / 前端 / 截图里说"丑"、"不清晰"、"很怪" / 真实截图视觉 polish | `skills/design/SKILL.md` |
| UI / 组件 / 页面 / 视觉界面 / 前端 / 截图里说"丑"、"不清晰"、"很怪" / 真实截图视觉 polish | `skills/ui/SKILL.md` |
### Post-build交付前
@@ -46,12 +46,12 @@
多个技能都可能匹配时按以下规则:
1. **最具体优先**`/design``/think` 更具体(仅限 UI 决策)。用户说"帮我设计登录页"时优先 `/design`
1. **最具体优先**`/ui``/think` 更具体(仅限 UI 决策)。用户说"帮我设计登录页"时优先 `/ui`
2. **URL 按内容类型二次分流**:消息含 URL → 先走 `/read` 取回 Markdown → 如果用户要总结或分析,继续完成总结或分析;如果是长文研究性素材再接 `/learn`
3. **改错 vs review**:代码已经交付或走到 PR → `/check`;代码跑不通或行为错了 → `/hunt`。两者都可能匹配"帮我看看",按"有没有具体错误现象"判断。
4. **配置/维护性异常 vs 代码错误**Claude/Codex 本身不听话、hook 不触发、MCP 掉链子、AGENTS/CLAUDE/config.toml 漂移、`/health` 消耗 token、AI coding 腐化、上下文混乱、验证缺失或验证命令失真 → `/health`;用户写的代码抛异常 → `/hunt`
5. **发布动作 vs 发布文案**:要写 release notes / changelog → `/write`;要提交、打 tag、publish、push、上传 release asset、补 GitHub release reactions、回复/关闭 issue → `/check`
6. **截图审美 vs 截图回归**:截图里说"丑/不好看/不清晰"且是审美校准 → `/design`;截图证明以前好的现在坏了、渲染错、状态错、生成物错 → `/hunt`
6. **截图审美 vs 截图回归**:截图里说"丑/不好看/不清晰"且是审美校准 → `/ui`;截图证明以前好的现在坏了、渲染错、状态错、生成物错 → `/hunt`
7. **长文产出 vs 润色**:从零到成稿 → `/learn`;已有稿子要改 → `/write`
8. **判断 vs 调试**"判断一下" + 报错/异常/不工作 → `/hunt`(诊断问题);"判断一下" + 有没有必要/该不该保留/值不值得 → `/think` Evaluation Mode价值判断
9. **继续优化 vs 调试**"继续优化" / "优化代码" 不含报错或异常现象 → `/check`(代码质量改善);有具体报错或回归 → `/hunt`
+1 -1
View File
@@ -84,7 +84,7 @@ Treat the reference as evidence, not decoration:
4. Compare current vs. reference and name the exact delta. Do not generalize a visual defect into "style polish" when the evidence points to a broken render, race, font pipeline, or state path.
5. If the same symptom remains after one attempted fix, stop and rebuild the hypothesis from the evidence. Do not stack more patches onto a disproven explanation.
If the issue is purely subjective UI taste, route to `/design`. If it is rendering, state, timing, build output, font generation, or a regression from a known-good version, stay in `/hunt`.
If the issue is purely subjective UI taste, route to `/ui`. If it is rendering, state, timing, build output, font generation, or a regression from a known-good version, stay in `/hunt`.
## Scope Blast Mode
@@ -1,5 +1,5 @@
---
name: design
name: ui
description: "Produces distinctive, production-grade UI for pages, components, visual interfaces, typography, and screenshot-driven polish. Use when users ask in any language for UI, page, component, frontend, typography, screenshot-grounded visual polish, or complaints that a screen looks unclear, ugly, inconsistent, or visually wrong. Not for backend logic or data pipelines."
when_to_use: "设计, 做页面, 做组件, 不好看, 不和谐, 不清晰, 很丑, 很怪, 很傻, 突兀, 不协调, 字体, 字形, 排印, 排版, 样式, 前端, UI, 截图, build page, create component, make it look good, style, design, screenshot with visual complaint, typography, font looks wrong"
dispatch_intent: "UI, component, page, visual interface, frontend, artifact-grounded screenshot aesthetic complaint"
@@ -30,7 +30,7 @@ If it could have been generated by a default prompt, it is not good enough.
See [rules/durable-context.md](../../rules/durable-context.md) for when to read durable context, the read-order budget, and the memory-type mapping.
For `/design`, visual constraints are `decision`, `preference`, and `principle` entries; reusable product and UI patterns are `pattern` and `learning`. Current screenshots, rendered output, code, design tokens, and user feedback override memory. Reuse durable visual preferences and mature interaction patterns, but still name the current visual problem from the screenshot or source before changing code.
For `/ui`, visual constraints are `decision`, `preference`, and `principle` entries; reusable product and UI patterns are `pattern` and `learning`. Current screenshots, rendered output, code, design tokens, and user feedback override memory. Reuse durable visual preferences and mature interaction patterns, but still name the current visual problem from the screenshot or source before changing code.
## Visual Quick-Fix Mode
+1 -1
View File
@@ -30,7 +30,7 @@ HOME="$test_home" npx --yes skills add "$tmpdir/repo" -a claude-code -g -y \
>"$tmpdir/install.out" 2>&1
# All 8 SKILL.md files landed under ~/.claude/skills/.
expected=(check design health hunt learn read think write)
expected=(check health hunt learn read think ui write)
for skill in "${expected[@]}"; do
target="$test_home/.claude/skills/$skill/SKILL.md"
if [ ! -f "$target" ]; then
+1 -1
View File
@@ -12,7 +12,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/test_helpers.sh"
NINJA="Prefix your first line with 🥷 inline, not as its own paragraph."
SKILLS="think design check hunt write learn read health"
SKILLS="think ui check hunt write learn read health"
# --- validate_package.py -----------------------------------------------------
stage=$(make_tmpdir)