Skip to content

Commit 53a3f46

Browse files
feat(root): add translator skill and refresh agent guides
- add translator skill with translation rubric and anti-AI guidance - restructure tf-infra guidance into reusable resource documents - refresh frontend and dev-workflow skill references - mark orchestrator helper scripts as executable Co-Authored-By: First Fluke <our.first.fluke@gmail.com>
1 parent 86fd127 commit 53a3f46

21 files changed

Lines changed: 959 additions & 395 deletions

File tree

.agents/skills/_version.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"version": "2.9.0"
2+
"version": "2.11.3"
33
}

.agents/skills/dev-workflow/SKILL.md

Lines changed: 46 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,9 @@ name: dev-workflow
33
description: Use when setting up or optimizing developer workflows in a monorepo, managing mise tasks, git hooks, CI/CD pipelines, database migrations, or release automation. Invoke for development environment setup, build automation, testing workflows, and release coordination.
44
---
55

6-
# Dev Workflow
6+
# Dev Workflow - Monorepo Task Automation Specialist
77

8-
Dev workflow specialist for monorepo task automation and developer productivity.
9-
10-
## Role Definition
11-
12-
You are a senior DevOps engineer with 7+ years of experience in monorepo tooling and task automation. You specialize in mise (formerly rtx) task runner, parallel execution strategies, and multi-language development workflows. You excel at orchestrating complex build pipelines, managing cross-app dependencies, and optimizing development workflows for teams working with diverse technology stacks in a unified codebase.
13-
14-
## When to Use This Skill
8+
## When to use
159

1610
- Running development servers for monorepo with multiple applications
1711
- Executing lint, format, typecheck across multiple apps in parallel
@@ -24,15 +18,39 @@ You are a senior DevOps engineer with 7+ years of experience in monorepo tooling
2418
- Troubleshooting mise task failures or configuration issues
2519
- Optimizing CI/CD pipelines with mise
2620

27-
## Core Workflow
28-
29-
1. **Analyze Task Requirements** - Identify which apps are affected and task dependencies
30-
2. **Check mise Configuration** - Verify mise.toml structure and available tasks
31-
3. **Determine Execution Strategy** - Decide between parallel vs sequential task execution
32-
4. **Run Prerequisites** - Install runtimes, dependencies if needed
33-
5. **Execute Tasks** - Run mise tasks with proper error handling
34-
6. **Verify Results** - Check output, logs, and generated artifacts
35-
7. **Report Status** - Summarize success/failure with actionable next steps
21+
## When NOT to use
22+
23+
- Database schema design or query tuning -> use DB Agent
24+
- Backend API implementation -> use Backend Agent
25+
- Frontend UI implementation -> use Frontend Agent
26+
- Mobile development -> use Mobile Agent
27+
28+
## Core Rules
29+
30+
1. Always use `mise run` tasks instead of direct package manager commands
31+
2. Run `mise install` after pulling changes that might update runtime versions
32+
3. Use parallel tasks (`mise run lint`, `mise run test`) for independent operations
33+
4. Run lint/test only on apps with changed files (`lint:changed`, `test:changed`)
34+
5. Validate commit messages with commitlint before committing
35+
6. Run pre-commit validation pipeline for staged files only
36+
7. Configure CI to skip unchanged apps for faster builds
37+
8. Check `mise tasks --all` to discover available tasks before running
38+
9. Verify task output and exit codes for CI/CD integration
39+
10. Document task dependencies in mise.toml comments
40+
11. Use consistent task naming conventions across apps
41+
12. Enable mise in CI/CD pipelines for reproducible builds
42+
13. Pin runtime versions in mise.toml for consistency
43+
14. Test tasks locally before committing CI/CD changes
44+
15. Never use direct package manager commands when mise tasks exist
45+
16. Never modify mise.toml without understanding task dependencies
46+
17. Never skip `mise install` after toolchain version updates
47+
18. Never run dev servers without checking port availability first
48+
19. Never commit without running validation on affected apps
49+
20. Never ignore task failures - always investigate root cause
50+
21. Never hardcode secrets in mise.toml files
51+
22. Never assume task availability - always verify with `mise tasks`
52+
23. Never run destructive tasks (clean, reset) without confirmation
53+
24. Never skip reading task definitions before running unfamiliar tasks
3654

3755
## Technical Guidelines
3856

@@ -164,36 +182,6 @@ API_URL=http://localhost:8000
164182
PUBLIC_API_URL=http://localhost:8000
165183
```
166184

167-
## Constraints
168-
169-
### MUST DO
170-
- Always use `mise run` tasks instead of direct package manager commands
171-
- Run `mise install` after pulling changes that might update runtime versions
172-
- Use parallel tasks (`mise run lint`, `mise run test`) for independent operations
173-
- Run lint/test only on apps with changed files (`lint:changed`, `test:changed`)
174-
- Validate commit messages with commitlint before committing
175-
- Run pre-commit validation pipeline for staged files only
176-
- Configure CI to skip unchanged apps for faster builds
177-
- Check `mise tasks --all` to discover available tasks before running
178-
- Verify task output and exit codes for CI/CD integration
179-
- Document task dependencies in mise.toml comments
180-
- Use consistent task naming conventions across apps
181-
- Enable mise in CI/CD pipelines for reproducible builds
182-
- Pin runtime versions in mise.toml for consistency
183-
- Test tasks locally before committing CI/CD changes
184-
185-
### MUST NOT DO
186-
- Never use direct package manager commands when mise tasks exist
187-
- Never modify mise.toml without understanding task dependencies
188-
- Never skip `mise install` after toolchain version updates
189-
- Never run dev servers without checking port availability first
190-
- Never commit without running validation on affected apps
191-
- Never ignore task failures - always investigate root cause
192-
- Never hardcode secrets in mise.toml files
193-
- Never assume task availability - always verify with `mise tasks`
194-
- Never run destructive tasks (clean, reset) without confirmation
195-
- Never skip reading task definitions before running unfamiliar tasks
196-
197185
## Output Templates
198186

199187
When setting up development environment:
@@ -226,6 +214,17 @@ When troubleshooting:
226214
| Permission denied | Check file permissions, try with proper user |
227215
| Missing dependencies | Run `mise run install` or app-specific install |
228216

217+
## How to Execute
218+
219+
Follow the core workflow step by step:
220+
1. **Analyze Task Requirements** - Identify which apps are affected and task dependencies
221+
2. **Check mise Configuration** - Verify mise.toml structure and available tasks
222+
3. **Determine Execution Strategy** - Decide between parallel vs sequential task execution
223+
4. **Run Prerequisites** - Install runtimes, dependencies if needed
224+
5. **Execute Tasks** - Run mise tasks with proper error handling
225+
6. **Verify Results** - Check output, logs, and generated artifacts
226+
7. **Report Status** - Summarize success/failure with actionable next steps
227+
229228
## Execution Protocol (CLI Mode)
230229

231230
See `../_shared/execution-protocols/` for vendor-specific protocols.

.agents/skills/frontend-agent/SKILL.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ description: Frontend specialist for React, Next.js, TypeScript with FSD-lite ar
2323
3. **Rendering Strategy**: Default to Server Components for performance. Use Client Components only for interactivity and API integration.
2424
4. **Accessibility**: Semantic HTML, ARIA labels, keyboard navigation, and screen reader compatibility are mandatory.
2525
5. **Tool First**: Check for existing solutions and tools before coding.
26+
6. **Proxy over Middleware**: Next.js 16+ uses `proxy.ts` for request proxying. Do NOT use `middleware.ts` for proxy/rewrite logic — use `proxy.ts` instead.
27+
7. **No Prop Drilling**: Avoid passing props beyond 3 levels. Use Jotai atoms instead. Avoid React Context — prefer Jotai.
2628

2729
## 1. Tooling & Performance
2830

@@ -63,10 +65,11 @@ src/features/[feature]/
6365
| Styling | `TailwindCSS v4` + `shadcn/ui` |
6466
| Hooks | `ahooks` (Pre-made hooks preferred) |
6567
| Utils | `es-toolkit` (First choice) |
66-
| State (URL) | `jotai-location` |
68+
| State (URL) | `nuqs` |
6769
| State (Server) | `TanStack Query` |
6870
| State (Client) | `Jotai` (Minimize use) |
6971
| Forms | `@tanstack/react-form` + `zod` |
72+
| Auth | `better-auth` |
7073

7174
## 4. Standards
7275

.agents/skills/frontend-agent/resources/examples.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@
1111
### Implementation
1212
- Components: TodoList, TodoItem, AddTodoForm
1313
- Routes: /todos (page)
14-
- State: TanStack Query for server state, local state for form
14+
- State: TanStack Query for server state, Jotai for client state
1515
1616
### Files Created/Modified
1717
- src/types/todo.ts (NEW) - Todo interface
1818
- src/lib/api/todos.ts (NEW) - API client with TanStack Query hooks
19-
- src/components/todo/TodoItem.tsx (NEW) - Single todo display
20-
- src/components/todo/AddTodoForm.tsx (NEW) - Form with validation
21-
- src/components/todo/TodoList.tsx (NEW) - List container
19+
- src/components/todo/todo-item.tsx (NEW) - Single todo display
20+
- src/components/todo/add-todo-form.tsx (NEW) - Form with validation
21+
- src/components/todo/todo-list.tsx (NEW) - List container
2222
- src/app/todos/page.tsx (NEW) - Page component
23-
- tests/components/TodoList.test.tsx (NEW)
23+
- tests/components/todo-list.test.tsx (NEW)
2424
2525
### Testing
2626
- Unit tests: 5 passing
@@ -37,17 +37,17 @@
3737
## Task: Profile Edit Form
3838
3939
### Implementation
40-
- Components: ProfileForm (React Hook Form + Zod)
40+
- Components: ProfileForm (TanStack Form + Zod)
4141
- Validation: name (required, 2-50 chars), email (valid format), bio (optional, max 500)
4242
- API: PATCH /api/users/me via TanStack Query mutation
4343
- UX: optimistic update, error toast, success redirect
4444
4545
### Files Created
4646
- src/types/user.ts
4747
- src/lib/api/users.ts
48-
- src/components/profile/ProfileForm.tsx
48+
- src/components/profile/profile-form.tsx
4949
- src/app/profile/edit/page.tsx
50-
- tests/components/ProfileForm.test.tsx
50+
- tests/components/profile-form.test.tsx
5151
```
5252

5353
## Example 3: Responsive Dashboard
@@ -70,8 +70,8 @@
7070
- [x] Color contrast 4.5:1 on all text
7171
7272
### Files Created
73-
- src/components/dashboard/StatCard.tsx
74-
- src/components/dashboard/StatsGrid.tsx
75-
- src/components/dashboard/ActivityChart.tsx
73+
- src/components/dashboard/stat-card.tsx
74+
- src/components/dashboard/stats-grid.tsx
75+
- src/components/dashboard/activity-chart.tsx
7676
- src/app/dashboard/page.tsx
7777
```

.agents/skills/frontend-agent/resources/execution-protocol.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ Follow these steps in order (adjust depth by difficulty).
2323
## Step 2: Plan
2424
- Decide on component structure (which are new, which extend existing)
2525
- Define props interfaces with TypeScript
26-
- Plan state management approach (local state, Context, Zustand)
26+
- Plan state management approach (Jotai for client, nuqs for URL, TanStack Query for server)
2727
- Identify API integration points (TanStack Query hooks)
2828
- Plan responsive breakpoints and accessibility requirements
2929

.agents/skills/frontend-agent/resources/snippets.md

Lines changed: 69 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -76,68 +76,90 @@ export function useCreateTodo() {
7676

7777
---
7878

79-
## Form with React Hook Form + Zod
79+
## Form with TanStack Form + Zod
8080

8181
```tsx
8282
"use client";
8383

84-
import { useForm } from "react-hook-form";
85-
import { zodResolver } from "@hookform/resolvers/zod";
84+
import { useForm } from "@tanstack/react-form";
85+
import { zodValidator } from "@tanstack/zod-form-adapter";
8686
import { z } from "zod";
8787

8888
const schema = z.object({
8989
email: z.string().email("Invalid email"),
9090
password: z.string().min(8, "At least 8 characters"),
9191
});
9292

93-
type FormData = z.infer<typeof schema>;
94-
95-
export function LoginForm({ onSubmit }: { onSubmit: (data: FormData) => void }) {
96-
const {
97-
register,
98-
handleSubmit,
99-
formState: { errors, isSubmitting },
100-
} = useForm<FormData>({ resolver: zodResolver(schema) });
93+
export function LoginForm({ onSubmit }: { onSubmit: (data: z.infer<typeof schema>) => void }) {
94+
const form = useForm({
95+
defaultValues: { email: "", password: "" },
96+
validatorAdapter: zodValidator(),
97+
validators: { onChange: schema },
98+
onSubmit: async ({ value }) => onSubmit(value),
99+
});
101100

102101
return (
103-
<form onSubmit={handleSubmit(onSubmit)} className="space-y-4">
104-
<div>
105-
<label htmlFor="email" className="text-sm font-medium">
106-
Email
107-
</label>
108-
<input
109-
id="email"
110-
type="email"
111-
{...register("email")}
112-
className="mt-1 w-full rounded-md border px-3 py-2"
113-
aria-invalid={!!errors.email}
114-
/>
115-
{errors.email && (
116-
<p className="mt-1 text-sm text-destructive">{errors.email.message}</p>
102+
<form
103+
onSubmit={(e) => {
104+
e.preventDefault();
105+
e.stopPropagation();
106+
form.handleSubmit();
107+
}}
108+
className="space-y-4"
109+
>
110+
<form.Field name="email">
111+
{(field) => (
112+
<div>
113+
<label htmlFor="email" className="text-sm font-medium">
114+
Email
115+
</label>
116+
<input
117+
id="email"
118+
type="email"
119+
value={field.state.value}
120+
onChange={(e) => field.handleChange(e.target.value)}
121+
onBlur={field.handleBlur}
122+
className="mt-1 w-full rounded-md border px-3 py-2"
123+
aria-invalid={field.state.meta.errors.length > 0}
124+
/>
125+
{field.state.meta.errors.length > 0 && (
126+
<p className="mt-1 text-sm text-destructive">{field.state.meta.errors[0]}</p>
127+
)}
128+
</div>
129+
)}
130+
</form.Field>
131+
<form.Field name="password">
132+
{(field) => (
133+
<div>
134+
<label htmlFor="password" className="text-sm font-medium">
135+
Password
136+
</label>
137+
<input
138+
id="password"
139+
type="password"
140+
value={field.state.value}
141+
onChange={(e) => field.handleChange(e.target.value)}
142+
onBlur={field.handleBlur}
143+
className="mt-1 w-full rounded-md border px-3 py-2"
144+
aria-invalid={field.state.meta.errors.length > 0}
145+
/>
146+
{field.state.meta.errors.length > 0 && (
147+
<p className="mt-1 text-sm text-destructive">{field.state.meta.errors[0]}</p>
148+
)}
149+
</div>
117150
)}
118-
</div>
119-
<div>
120-
<label htmlFor="password" className="text-sm font-medium">
121-
Password
122-
</label>
123-
<input
124-
id="password"
125-
type="password"
126-
{...register("password")}
127-
className="mt-1 w-full rounded-md border px-3 py-2"
128-
aria-invalid={!!errors.password}
129-
/>
130-
{errors.password && (
131-
<p className="mt-1 text-sm text-destructive">{errors.password.message}</p>
151+
</form.Field>
152+
<form.Subscribe selector={(state) => [state.canSubmit, state.isSubmitting]}>
153+
{([canSubmit, isSubmitting]) => (
154+
<button
155+
type="submit"
156+
disabled={!canSubmit}
157+
className="w-full rounded-md bg-primary px-4 py-2 text-primary-foreground disabled:opacity-50"
158+
>
159+
{isSubmitting ? "Signing in..." : "Sign in"}
160+
</button>
132161
)}
133-
</div>
134-
<button
135-
type="submit"
136-
disabled={isSubmitting}
137-
className="w-full rounded-md bg-primary px-4 py-2 text-primary-foreground disabled:opacity-50"
138-
>
139-
{isSubmitting ? "Signing in..." : "Sign in"}
140-
</button>
162+
</form.Subscribe>
141163
</form>
142164
);
143165
}

.agents/skills/frontend-agent/resources/tailwind-rules.md

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -265,34 +265,21 @@ Only use when absolutely necessary:
265265

266266
## Custom Utilities
267267

268-
Add to `tailwind.config.js`:
269-
270-
```js
271-
module.exports = {
272-
theme: {
273-
extend: {
274-
spacing: {
275-
'18': '4.5rem', // Custom spacing
276-
},
277-
colors: {
278-
brand: {
279-
50: '#...',
280-
// ...
281-
900: '#...',
282-
},
283-
},
284-
},
285-
},
286-
};
287-
```
268+
Add to `app/globals.css` using CSS `@theme`:
288269

289-
## Performance
270+
```css
271+
@import "tailwindcss";
290272

291-
### Purging
292-
Tailwind auto-purges unused classes in production.
273+
@theme {
274+
--spacing-18: 4.5rem;
275+
--color-brand-50: #...;
276+
--color-brand-900: #...;
277+
}
278+
```
279+
280+
> **Note**: Tailwind v4 uses CSS-based configuration. `tailwind.config.js` is deprecated.
293281

294-
### JIT Mode
295-
Enabled by default in Tailwind 3+.
282+
## Performance
296283

297284
### Avoid @apply
298285
Prefer utility classes in JSX over `@apply` in CSS:

0 commit comments

Comments
 (0)