argos-harness 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +21 -0
- package/assets/agents/auditor.md +140 -0
- package/assets/agents/commit-pr-pilot.md +154 -0
- package/assets/agents/explorer.md +93 -0
- package/assets/agents/implementer.md +117 -0
- package/assets/agents/leader.md +149 -0
- package/assets/agents/researcher.md +89 -0
- package/assets/agents/review-readability.md +87 -0
- package/assets/agents/review-reliability.md +100 -0
- package/assets/agents/review-resilience.md +87 -0
- package/assets/agents/review-risk.md +87 -0
- package/assets/agents/reviewer.md +167 -0
- package/assets/agents/ticket-audit.md +129 -0
- package/assets/hooks/argos-guard-destructive.sh +127 -0
- package/assets/hooks/argos-quality-gate.sh +129 -0
- package/assets/managed/aterrizaje.md +24 -0
- package/assets/managed/formato-respuesta.md +21 -0
- package/assets/managed/identidad.md +48 -0
- package/assets/managed/operaciones-seguras.md +14 -0
- package/assets/managed/orquestacion.md +169 -0
- package/assets/output-styles/argos.md +71 -0
- package/assets/skills/ai-sdk-5/SKILL.md +230 -0
- package/assets/skills/angular/SKILL.md +19 -0
- package/assets/skills/angular/references/architecture.md +137 -0
- package/assets/skills/angular/references/core.md +197 -0
- package/assets/skills/angular/references/forms.md +115 -0
- package/assets/skills/angular/references/performance.md +124 -0
- package/assets/skills/apollo-client/SKILL.md +61 -0
- package/assets/skills/app-blueprint/SKILL.md +45 -0
- package/assets/skills/app-blueprint/assets/module-template.md +48 -0
- package/assets/skills/app-blueprint/assets/system-template.md +38 -0
- package/assets/skills/app-blueprint/references/workflow.md +101 -0
- package/assets/skills/app-builder/SKILL.md +43 -0
- package/assets/skills/app-builder/phases/0-product.md +58 -0
- package/assets/skills/app-builder/phases/1-scaffold.md +33 -0
- package/assets/skills/app-builder/phases/10-store.md +40 -0
- package/assets/skills/app-builder/phases/2-data.md +34 -0
- package/assets/skills/app-builder/phases/3-domain.md +33 -0
- package/assets/skills/app-builder/phases/4-ui-nav.md +32 -0
- package/assets/skills/app-builder/phases/5-identity.md +30 -0
- package/assets/skills/app-builder/phases/6-polish.md +34 -0
- package/assets/skills/app-builder/phases/7-brand.md +31 -0
- package/assets/skills/app-builder/phases/8-web.md +30 -0
- package/assets/skills/app-builder/phases/9-docs.md +31 -0
- package/assets/skills/app-ia/SKILL.md +54 -0
- package/assets/skills/astro/SKILL.md +39 -0
- package/assets/skills/axios/SKILL.md +61 -0
- package/assets/skills/branch-pr/SKILL.md +200 -0
- package/assets/skills/bullmq/SKILL.md +55 -0
- package/assets/skills/chained-pr/SKILL.md +48 -0
- package/assets/skills/chained-pr/references/chaining-details.md +99 -0
- package/assets/skills/cognitive-doc-design/SKILL.md +81 -0
- package/assets/skills/comment-writer/SKILL.md +74 -0
- package/assets/skills/dashboard-ia/SKILL.md +54 -0
- package/assets/skills/django-drf/SKILL.md +180 -0
- package/assets/skills/go-testing/SKILL.md +47 -0
- package/assets/skills/go-testing/references/examples.md +89 -0
- package/assets/skills/issue-creation/SKILL.md +223 -0
- package/assets/skills/jira-epic/SKILL.md +306 -0
- package/assets/skills/jira-task/SKILL.md +382 -0
- package/assets/skills/judgment-day/SKILL.md +52 -0
- package/assets/skills/judgment-day/references/prompts-and-formats.md +98 -0
- package/assets/skills/lightsail-deploy/SKILL.md +44 -0
- package/assets/skills/lightsail-deploy/references/runbook.md +102 -0
- package/assets/skills/loop-back-debug/SKILL.md +102 -0
- package/assets/skills/mantine-form/SKILL.md +57 -0
- package/assets/skills/mongoose/SKILL.md +66 -0
- package/assets/skills/nextjs-15/SKILL.md +144 -0
- package/assets/skills/not-boring-mobile/SKILL.md +43 -0
- package/assets/skills/not-boring-mobile/references/not-boring-playbook.md +65 -0
- package/assets/skills/playwright/SKILL.md +315 -0
- package/assets/skills/pr-comments/SKILL.md +93 -0
- package/assets/skills/pr-create/SKILL.md +64 -0
- package/assets/skills/promo-video/SKILL.md +52 -0
- package/assets/skills/promo-video/assets/package.template.json +22 -0
- package/assets/skills/promo-video/assets/promo.template.tsx +469 -0
- package/assets/skills/promo-video/assets/theme.template.ts +27 -0
- package/assets/skills/promo-video/references/pipeline.md +119 -0
- package/assets/skills/promo-video-web/SKILL.md +51 -0
- package/assets/skills/promo-video-web/assets/browser-promo.template.tsx +385 -0
- package/assets/skills/promo-video-web/assets/capture.template.ts +70 -0
- package/assets/skills/promo-video-web/assets/package.template.json +26 -0
- package/assets/skills/promo-video-web/references/pipeline.md +84 -0
- package/assets/skills/pytest/SKILL.md +180 -0
- package/assets/skills/react-19/SKILL.md +118 -0
- package/assets/skills/react-hook-form/SKILL.md +59 -0
- package/assets/skills/react-router/SKILL.md +60 -0
- package/assets/skills/redux-toolkit/SKILL.md +60 -0
- package/assets/skills/review-diff/SKILL.md +101 -0
- package/assets/skills/ship-docs/SKILL.md +45 -0
- package/assets/skills/ship-docs/references/ship-docs-playbook.md +31 -0
- package/assets/skills/skill-creator/SKILL.md +97 -0
- package/assets/skills/skill-creator/assets/SKILL-TEMPLATE.md +68 -0
- package/assets/skills/skill-creator/references/skill-style-guide.md +79 -0
- package/assets/skills/skill-improver/SKILL.md +50 -0
- package/assets/skills/skill-improver/references/skill-style-guide.md +79 -0
- package/assets/skills/socketio/SKILL.md +58 -0
- package/assets/skills/spec-bootstrap/SKILL.md +62 -0
- package/assets/skills/store-ship/SKILL.md +52 -0
- package/assets/skills/store-ship/assets/android-supply.template.md +22 -0
- package/assets/skills/store-ship/assets/eas.template.json +32 -0
- package/assets/skills/store-ship/assets/maestro-flow.template.yaml +27 -0
- package/assets/skills/store-ship/assets/store.config.template.json +28 -0
- package/assets/skills/store-ship/references/pipeline.md +198 -0
- package/assets/skills/stripe/SKILL.md +83 -0
- package/assets/skills/tailwind-4/SKILL.md +193 -0
- package/assets/skills/tamagui/SKILL.md +60 -0
- package/assets/skills/tanstack-query/SKILL.md +58 -0
- package/assets/skills/ticket-intake/SKILL.md +55 -0
- package/assets/skills/typescript/SKILL.md +134 -0
- package/assets/skills/verify-before-done/SKILL.md +111 -0
- package/assets/skills/webapp-rebuilder/SKILL.md +48 -0
- package/assets/skills/webapp-rebuilder/assets/charter-template.md +46 -0
- package/assets/skills/webapp-rebuilder/references/workflow.md +47 -0
- package/assets/skills/winston-logging/SKILL.md +61 -0
- package/assets/skills/work-unit-commits/SKILL.md +84 -0
- package/assets/skills/zod-4/SKILL.md +210 -0
- package/assets/skills/zustand-5/SKILL.md +216 -0
- package/bin/argos.js +6 -0
- package/dist/commands/adopt.d.ts +35 -0
- package/dist/commands/adopt.d.ts.map +1 -0
- package/dist/commands/adopt.js +347 -0
- package/dist/commands/adopt.js.map +1 -0
- package/dist/commands/doctor.d.ts +20 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +478 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +32 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +358 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/remove.d.ts +62 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +487 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/workspace.d.ts +73 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +354 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/assets.d.ts +29 -0
- package/dist/lib/assets.d.ts.map +1 -0
- package/dist/lib/assets.js +57 -0
- package/dist/lib/assets.js.map +1 -0
- package/dist/lib/atomic-write.d.ts +17 -0
- package/dist/lib/atomic-write.d.ts.map +1 -0
- package/dist/lib/atomic-write.js +41 -0
- package/dist/lib/atomic-write.js.map +1 -0
- package/dist/lib/backup.d.ts +11 -0
- package/dist/lib/backup.d.ts.map +1 -0
- package/dist/lib/backup.js +42 -0
- package/dist/lib/backup.js.map +1 -0
- package/dist/lib/config.d.ts +36 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +52 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/detect.d.ts +58 -0
- package/dist/lib/detect.d.ts.map +1 -0
- package/dist/lib/detect.js +330 -0
- package/dist/lib/detect.js.map +1 -0
- package/dist/lib/ficha.d.ts +10 -0
- package/dist/lib/ficha.d.ts.map +1 -0
- package/dist/lib/ficha.js +38 -0
- package/dist/lib/ficha.js.map +1 -0
- package/dist/lib/git.d.ts +27 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +79 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/managed-files.d.ts +35 -0
- package/dist/lib/managed-files.d.ts.map +1 -0
- package/dist/lib/managed-files.js +97 -0
- package/dist/lib/managed-files.js.map +1 -0
- package/dist/lib/markers.d.ts +64 -0
- package/dist/lib/markers.d.ts.map +1 -0
- package/dist/lib/markers.js +157 -0
- package/dist/lib/markers.js.map +1 -0
- package/dist/lib/navori-import.d.ts +42 -0
- package/dist/lib/navori-import.d.ts.map +1 -0
- package/dist/lib/navori-import.js +65 -0
- package/dist/lib/navori-import.js.map +1 -0
- package/dist/lib/openclaw-agents.d.ts +53 -0
- package/dist/lib/openclaw-agents.d.ts.map +1 -0
- package/dist/lib/openclaw-agents.js +118 -0
- package/dist/lib/openclaw-agents.js.map +1 -0
- package/dist/lib/package-root.d.ts +11 -0
- package/dist/lib/package-root.d.ts.map +1 -0
- package/dist/lib/package-root.js +23 -0
- package/dist/lib/package-root.js.map +1 -0
- package/dist/lib/paths.d.ts +11 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +16 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/settings-merge.d.ts +125 -0
- package/dist/lib/settings-merge.d.ts.map +1 -0
- package/dist/lib/settings-merge.js +373 -0
- package/dist/lib/settings-merge.js.map +1 -0
- package/dist/lib/version.d.ts +3 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +13 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/lib/which.d.ts +8 -0
- package/dist/lib/which.d.ts.map +1 -0
- package/dist/lib/which.js +30 -0
- package/dist/lib/which.js.map +1 -0
- package/dist/lib/workspaces.d.ts +133 -0
- package/dist/lib/workspaces.d.ts.map +1 -0
- package/dist/lib/workspaces.js +241 -0
- package/dist/lib/workspaces.js.map +1 -0
- package/dist/lib/zod-messages.d.ts +4 -0
- package/dist/lib/zod-messages.d.ts.map +1 -0
- package/dist/lib/zod-messages.js +28 -0
- package/dist/lib/zod-messages.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: astro
|
|
3
|
+
description: Trigger: Astro site, landing page, marketing site, static site, app web. Astro 5 patterns: zero-JS defaults, islands, content collections, Tailwind 4 via Vite.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Astro 5
|
|
7
|
+
|
|
8
|
+
## Activation Contract
|
|
9
|
+
|
|
10
|
+
Activate when building or editing an Astro site — landing pages, marketing sites, docs, or any static-first web.
|
|
11
|
+
|
|
12
|
+
## Hard Rules
|
|
13
|
+
|
|
14
|
+
- Static output by default. Add an adapter/SSR only when a route genuinely needs per-request rendering.
|
|
15
|
+
- Zero client JS by default: build with `.astro` components. Hydrate only real interactivity, with the narrowest `client:*` directive that works.
|
|
16
|
+
- Repeating content (features, FAQs, testimonials, posts) lives in content collections (`src/content.config.ts`, `defineCollection` + zod schema, `glob`/`file` loaders) — never hardcoded arrays inside pages.
|
|
17
|
+
- Tailwind 4 via the `@tailwindcss/vite` plugin. Do NOT use the deprecated `@astrojs/tailwind` integration.
|
|
18
|
+
- Local images through `astro:assets` `<Image>`, not raw `<img>`.
|
|
19
|
+
- Every page renders `<title>` and meta description through a shared layout; install `@astrojs/sitemap`.
|
|
20
|
+
|
|
21
|
+
## Decision Gates
|
|
22
|
+
|
|
23
|
+
| Situation | Action |
|
|
24
|
+
|-----------|--------|
|
|
25
|
+
| Component needs interactivity | Try CSS/native HTML first; else a framework island with `client:visible` (or `client:idle`); `client:load` only for above-the-fold critical UI |
|
|
26
|
+
| Content will repeat or grow | Content collection with zod schema |
|
|
27
|
+
| One route needs fresh per-request data | Server island (`server:defer`) before converting the site to SSR |
|
|
28
|
+
| Dynamic routes from content | `getStaticPaths()` + `getCollection()` |
|
|
29
|
+
|
|
30
|
+
## Execution Steps
|
|
31
|
+
|
|
32
|
+
1. Scaffold: `npm create astro@latest` (template: minimal), add Tailwind 4 via `@tailwindcss/vite`.
|
|
33
|
+
2. Create `src/layouts/Base.astro` with head, meta, fonts, and design tokens.
|
|
34
|
+
3. Build pages under `src/pages/`; extract repeating content to collections.
|
|
35
|
+
4. Verify: `astro build` passes and `astro preview` renders correctly; confirm no unintended client JS shipped.
|
|
36
|
+
|
|
37
|
+
## Output Contract
|
|
38
|
+
|
|
39
|
+
A site that builds statically (`astro build` clean), ships zero JS unless justified, and lists every island added with its directive and reason.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: axios
|
|
3
|
+
description: Patrones de Axios en TS — instancia central, interceptores, tipado de respuestas, manejo de errores y cancelación. Trigger: al tocar llamadas HTTP a APIs.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Axios — convenciones
|
|
7
|
+
|
|
8
|
+
## Cuándo usar este skill
|
|
9
|
+
|
|
10
|
+
Al hacer una llamada HTTP a una API: crear un endpoint del cliente, agregar auth, mapear errores, o cancelar una request. Axios se cablea **una vez** en una instancia central con interceptores — los componentes/servicios importan esa instancia, no `axios` crudo con la URL a mano en cada llamada.
|
|
11
|
+
|
|
12
|
+
## El patrón
|
|
13
|
+
|
|
14
|
+
Una instancia por API (baseURL + interceptores), funciones tipadas encima; nunca `axios.get(fullUrl)` disperso:
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
export const api = axios.create({
|
|
18
|
+
baseURL: import.meta.env.VITE_APP_NEXUS_URL,
|
|
19
|
+
timeout: 15_000,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
api.interceptors.request.use((config) => {
|
|
23
|
+
const token = getToken();
|
|
24
|
+
if (token) config.headers.Authorization = `Bearer ${token}`;
|
|
25
|
+
return config;
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
api.interceptors.response.use(
|
|
29
|
+
(res) => res,
|
|
30
|
+
(error) => Promise.reject(normalizeError(error)), // un solo shape de error
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
// Servicio tipado: el genérico es el TIPO DE DATA, no el del envelope.
|
|
34
|
+
export const getSession = (id: string) =>
|
|
35
|
+
api.get<Session>(`/sessions/${id}`).then((r) => r.data);
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Gotchas que muerden
|
|
39
|
+
|
|
40
|
+
- **`api.get<T>()` tipa `response.data`, no la respuesta entera.** El `T` describe el `data`; Axios envuelve en `{ data, status, headers }`. Devuelve `r.data` desde el servicio para que el caller vea `Session`, no `AxiosResponse<Session>`.
|
|
41
|
+
- **Una instancia con `baseURL`, no la URL completa por llamada.** Centraliza host/timeout/headers. Repetir `axios.get('https://…/sessions')` esparce la config y rompe al cambiar de entorno.
|
|
42
|
+
- **Auth/refresh/logging en interceptores, no copiados en cada request.** El token va en un `request.use`; el 401→refresh y el mapeo de error van en `response.use`. Nada de `headers: { Authorization }` a mano en cada endpoint.
|
|
43
|
+
- **`axios.isAxiosError(err)` antes de leer `err.response`.** En el `catch`, `err` es `unknown`. Sin el type guard, `err.response.data` explota en errores de red (donde `response` es `undefined` y solo hay `err.request`).
|
|
44
|
+
- **Un error de red NO es un error HTTP.** Timeout/DNS/offline no traen `response`. Distingue `err.response` (el server respondió con 4xx/5xx) de `err.request` (nunca llegó) para dar el mensaje correcto.
|
|
45
|
+
- **Cancela requests en vuelo con `AbortController`.** En efectos/búsqueda-as-you-type pasa `{ signal: controller.signal }` y aborta en el cleanup; sin esto, una respuesta vieja pisa a una nueva (race).
|
|
46
|
+
- **4xx/5xx ya rechazan la promesa.** No revises `res.status` en el `.then`; el flujo de error vive en `catch`/el interceptor. Solo `validateStatus` cambia esa regla, y rara vez la necesitas.
|
|
47
|
+
|
|
48
|
+
## Reglas duras
|
|
49
|
+
|
|
50
|
+
1. Todo HTTP pasa por la instancia central con `baseURL` + interceptores; nada de `axios` crudo con URL completa suelta.
|
|
51
|
+
2. Auth, refresh y normalización de error en interceptores, una sola vez.
|
|
52
|
+
3. Servicios tipados con `api.get<Data>(...)` que devuelven `.data`; el genérico es la data, no el envelope.
|
|
53
|
+
4. En `catch`, `axios.isAxiosError` antes de tocar `.response`; distingue error de red de error HTTP.
|
|
54
|
+
5. Requests cancelables (`AbortController`) donde puede haber carreras.
|
|
55
|
+
|
|
56
|
+
## Antes de declarar listo
|
|
57
|
+
|
|
58
|
+
- La llamada usa la instancia central; sin URLs absolutas ni headers de auth repetidos.
|
|
59
|
+
- Respuestas tipadas devolviendo `.data`; el error se maneja con `isAxiosError` y un shape único.
|
|
60
|
+
- Requests que compiten se cancelan en el cleanup.
|
|
61
|
+
- El quality gate del repo (`qualityGate.fast` en `argos.config.json`) en verde.
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: branch-pr
|
|
3
|
+
description: Create pull requests with issue-first checks. Trigger: creating, opening, or preparing PRs for review.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## When to Use
|
|
7
|
+
|
|
8
|
+
Use this skill when:
|
|
9
|
+
- Creating a pull request for any change
|
|
10
|
+
- Preparing a branch for submission
|
|
11
|
+
- Helping a contributor open a PR
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Critical Rules
|
|
16
|
+
|
|
17
|
+
1. **Every PR MUST link an approved issue** — no exceptions
|
|
18
|
+
2. **Every PR MUST have exactly one `type:*` label**
|
|
19
|
+
3. **Automated checks must pass** before merge is possible
|
|
20
|
+
4. **Blank PRs without issue linkage will be blocked** by GitHub Actions
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Workflow
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
1. Verify issue has `status:approved` label
|
|
28
|
+
2. Create branch: type/description (see Branch Naming below)
|
|
29
|
+
3. Implement changes with conventional commits
|
|
30
|
+
4. Run shellcheck on modified scripts
|
|
31
|
+
5. Open PR using the template
|
|
32
|
+
6. Add exactly one type:* label
|
|
33
|
+
7. Wait for automated checks to pass
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Branch Naming
|
|
39
|
+
|
|
40
|
+
Branch names MUST match this regex:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
^(feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)\/[a-z0-9._-]+$
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Format:** `type/description` — lowercase, no spaces, only `a-z0-9._-` in description.
|
|
47
|
+
|
|
48
|
+
| Type | Branch pattern | Example |
|
|
49
|
+
|------|---------------|---------|
|
|
50
|
+
| Feature | `feat/<description>` | `feat/user-login` |
|
|
51
|
+
| Bug fix | `fix/<description>` | `fix/zsh-glob-error` |
|
|
52
|
+
| Chore | `chore/<description>` | `chore/update-ci-actions` |
|
|
53
|
+
| Docs | `docs/<description>` | `docs/installation-guide` |
|
|
54
|
+
| Style | `style/<description>` | `style/format-scripts` |
|
|
55
|
+
| Refactor | `refactor/<description>` | `refactor/extract-shared-logic` |
|
|
56
|
+
| Performance | `perf/<description>` | `perf/reduce-startup-time` |
|
|
57
|
+
| Test | `test/<description>` | `test/add-setup-coverage` |
|
|
58
|
+
| Build | `build/<description>` | `build/update-shellcheck` |
|
|
59
|
+
| CI | `ci/<description>` | `ci/add-branch-validation` |
|
|
60
|
+
| Revert | `revert/<description>` | `revert/broken-setup-change` |
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## PR Body Format
|
|
65
|
+
|
|
66
|
+
The PR template is at `.github/PULL_REQUEST_TEMPLATE.md`. Every PR body MUST contain:
|
|
67
|
+
|
|
68
|
+
### 1. Linked Issue (REQUIRED)
|
|
69
|
+
|
|
70
|
+
```markdown
|
|
71
|
+
Closes #<issue-number>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Valid keywords: `Closes #N`, `Fixes #N`, `Resolves #N` (case insensitive).
|
|
75
|
+
The linked issue MUST have the `status:approved` label.
|
|
76
|
+
|
|
77
|
+
### 2. PR Type (REQUIRED)
|
|
78
|
+
|
|
79
|
+
Check exactly ONE in the template and add the matching label:
|
|
80
|
+
|
|
81
|
+
| Checkbox | Label to add |
|
|
82
|
+
|----------|-------------|
|
|
83
|
+
| Bug fix | `type:bug` |
|
|
84
|
+
| New feature | `type:feature` |
|
|
85
|
+
| Documentation only | `type:docs` |
|
|
86
|
+
| Code refactoring | `type:refactor` |
|
|
87
|
+
| Maintenance/tooling | `type:chore` |
|
|
88
|
+
| Breaking change | `type:breaking-change` |
|
|
89
|
+
|
|
90
|
+
### 3. Summary
|
|
91
|
+
|
|
92
|
+
1-3 bullet points of what the PR does.
|
|
93
|
+
|
|
94
|
+
### 4. Changes Table
|
|
95
|
+
|
|
96
|
+
```markdown
|
|
97
|
+
| File | Change |
|
|
98
|
+
|------|--------|
|
|
99
|
+
| `path/to/file` | What changed |
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 5. Test Plan
|
|
103
|
+
|
|
104
|
+
```markdown
|
|
105
|
+
- [x] Scripts run without errors: `shellcheck scripts/*.sh`
|
|
106
|
+
- [x] Manually tested the affected functionality
|
|
107
|
+
- [x] Skills load correctly in target agent
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 6. Contributor Checklist
|
|
111
|
+
|
|
112
|
+
All boxes must be checked:
|
|
113
|
+
- Linked an approved issue
|
|
114
|
+
- Added exactly one `type:*` label
|
|
115
|
+
- Ran shellcheck on modified scripts
|
|
116
|
+
- Skills tested in at least one agent
|
|
117
|
+
- Docs updated if behavior changed
|
|
118
|
+
- Conventional commit format
|
|
119
|
+
- No `Co-Authored-By` trailers
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Automated Checks (all must pass)
|
|
124
|
+
|
|
125
|
+
| Check | Job name | What it verifies |
|
|
126
|
+
|-------|----------|-----------------|
|
|
127
|
+
| PR Validation | `Check Issue Reference` | Body contains `Closes/Fixes/Resolves #N` |
|
|
128
|
+
| PR Validation | `Check Issue Has status:approved` | Linked issue has `status:approved` |
|
|
129
|
+
| PR Validation | `Check PR Has type:* Label` | PR has exactly one `type:*` label |
|
|
130
|
+
| CI | `Shellcheck` | Shell scripts pass `shellcheck` |
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Conventional Commits
|
|
135
|
+
|
|
136
|
+
Commit messages MUST match this regex:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(\([a-z0-9\._-]+\))?!?: .+
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Format:** `type(scope): description` or `type: description`
|
|
143
|
+
|
|
144
|
+
- `type` — required, one of: `build`, `chore`, `ci`, `docs`, `feat`, `fix`, `perf`, `refactor`, `revert`, `style`, `test`
|
|
145
|
+
- `(scope)` — optional, lowercase with `a-z0-9._-`
|
|
146
|
+
- `!` — optional, indicates breaking change
|
|
147
|
+
- `description` — required, starts after `: `
|
|
148
|
+
|
|
149
|
+
Type-to-label mapping:
|
|
150
|
+
|
|
151
|
+
| Commit type | PR label |
|
|
152
|
+
|-------------|----------|
|
|
153
|
+
| `feat` | `type:feature` |
|
|
154
|
+
| `fix` | `type:bug` |
|
|
155
|
+
| `docs` | `type:docs` |
|
|
156
|
+
| `refactor` | `type:refactor` |
|
|
157
|
+
| `chore` | `type:chore` |
|
|
158
|
+
| `style` | `type:chore` |
|
|
159
|
+
| `perf` | `type:feature` |
|
|
160
|
+
| `test` | `type:chore` |
|
|
161
|
+
| `build` | `type:chore` |
|
|
162
|
+
| `ci` | `type:chore` |
|
|
163
|
+
| `revert` | `type:bug` |
|
|
164
|
+
| `feat!` / `fix!` | `type:breaking-change` |
|
|
165
|
+
|
|
166
|
+
Examples:
|
|
167
|
+
```
|
|
168
|
+
feat(scripts): add Codex support to setup.sh
|
|
169
|
+
fix(skills): correct topic key format in sdd-apply
|
|
170
|
+
docs(readme): update multi-model configuration guide
|
|
171
|
+
refactor(skills): extract shared persistence logic
|
|
172
|
+
chore(ci): add shellcheck to PR validation workflow
|
|
173
|
+
perf(scripts): reduce setup.sh execution time
|
|
174
|
+
style(skills): fix markdown formatting
|
|
175
|
+
test(scripts): add setup.sh integration tests
|
|
176
|
+
ci(workflows): add branch name validation
|
|
177
|
+
revert: undo broken setup change
|
|
178
|
+
feat!: redesign skill loading system
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Commands
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
# Create branch
|
|
187
|
+
git checkout -b feat/my-feature main
|
|
188
|
+
|
|
189
|
+
# Run shellcheck before pushing
|
|
190
|
+
shellcheck scripts/*.sh
|
|
191
|
+
|
|
192
|
+
# Push and create PR
|
|
193
|
+
git push -u origin feat/my-feature
|
|
194
|
+
gh pr create --title "feat(scope): description" --body "Closes #N"
|
|
195
|
+
|
|
196
|
+
# Add type label to PR
|
|
197
|
+
gh pr edit <pr-number> --add-label "type:feature"
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
_Adapted from a skill originally authored by gentleman-programming._
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bullmq
|
|
3
|
+
description: Jobs y colas con BullMQ sobre Redis — Queue/Worker/QueueEvents, jobs idempotentes, retries con backoff, concurrency y graceful shutdown. Trigger: al crear/tocar un job, un worker o al encolar trabajo async.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# BullMQ — jobs & queues
|
|
7
|
+
|
|
8
|
+
BullMQ mueve trabajo pesado o diferido fuera del request: un **productor** encola (`Queue.add`) y un **worker** (proceso aparte) lo procesa. La conexión es Redis (`ioredis`). El productor y el worker viven en procesos distintos y comparten solo el nombre de la cola.
|
|
9
|
+
|
|
10
|
+
## Cuándo usar este skill
|
|
11
|
+
|
|
12
|
+
Al crear una cola o un job nuevo, tocar el worker, encolar trabajo desde un handler/hook, o depurar jobs que se cuelgan, se reintentan en loop o se pierden.
|
|
13
|
+
|
|
14
|
+
## El patrón
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
// Productor (en un request/hook): encola y responde rápido, NO esperes el resultado.
|
|
18
|
+
await queue.add("send-welcome", { userId }, {
|
|
19
|
+
attempts: 3,
|
|
20
|
+
backoff: { type: "exponential", delay: 1000 },
|
|
21
|
+
removeOnComplete: 1000, // no dejes que Redis crezca sin límite
|
|
22
|
+
removeOnFail: 5000,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// Worker (proceso aparte): una responsabilidad por worker/cola.
|
|
26
|
+
const worker = new Worker("emails", async (job) => {
|
|
27
|
+
// idempotente: correr dos veces el mismo job no debe duplicar efectos
|
|
28
|
+
return sendEmail(job.data);
|
|
29
|
+
}, { connection, concurrency: 5 });
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Reglas duras
|
|
33
|
+
|
|
34
|
+
1. **Jobs idempotentes.** Un job puede reintentarse o entregarse dos veces. Usa un id determinista (`jobId`) o un guard de "ya procesado" para efectos no repetibles (cobros, emails, mutaciones críticas).
|
|
35
|
+
2. **`attempts` + `backoff` siempre.** Un job sin reintentos muere al primer error transitorio; uno sin backoff martillea el recurso que falla. Exponencial por default.
|
|
36
|
+
3. **El productor NO espera el resultado.** Encola y responde; el valor del job se consume por eventos (`QueueEvents`) o releyendo estado, no bloqueando el request.
|
|
37
|
+
4. **`removeOnComplete`/`removeOnFail`.** Sin límites, Redis se llena de jobs viejos. Acota siempre.
|
|
38
|
+
5. **Graceful shutdown.** En `SIGTERM`/`SIGINT`, `await worker.close()` antes de salir para no matar un job a medias. Un worker que no cierra limpio deja jobs en `active` colgados.
|
|
39
|
+
6. **Errores que deben reintentar → lanza; errores permanentes → no.** Un input inválido no se arregla reintentando: valida antes de encolar o marca el job como fallido sin reintento (`attempts: 1` o un error no-recuperable).
|
|
40
|
+
7. **Una responsabilidad por worker.** No metas varios tipos de trabajo no relacionado en un solo `Worker` con `if job.name`; sepáralos por cola.
|
|
41
|
+
|
|
42
|
+
## Gotchas que muerden
|
|
43
|
+
|
|
44
|
+
- **La `connection` de ioredis para BullMQ necesita `maxRetriesPerRequest: null`** — si no, BullMQ lanza al reconectar.
|
|
45
|
+
- **`concurrency` alto no es gratis**: cada job concurrente abre conexiones/CPU. Súbelo con medida, no por default.
|
|
46
|
+
- **Un job "perdido"** casi siempre es: el worker no está corriendo, apunta a otra cola/Redis, o crasheó sin `removeOnFail` y quedó en `failed`. Revisa el estado del job antes de asumir un bug de lógica.
|
|
47
|
+
- **Delayed/repeatable jobs** viven en Redis: cambiar el patrón de un repeatable no borra el viejo — límpialo explícitamente.
|
|
48
|
+
|
|
49
|
+
## Antes de declarar listo
|
|
50
|
+
|
|
51
|
+
- El job es idempotente (o tiene guard de duplicados) y define `attempts` + `backoff`.
|
|
52
|
+
- El worker cierra en `SIGTERM`/`SIGINT` (`worker.close()`).
|
|
53
|
+
- `removeOnComplete`/`removeOnFail` acotados; la `connection` usa `maxRetriesPerRequest: null`.
|
|
54
|
+
- El productor no bloquea el request esperando el job.
|
|
55
|
+
- El quality gate del repo (`qualityGate.fast` en `argos.config.json`) en verde.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: chained-pr
|
|
3
|
+
description: Split oversized changes into chained PRs that protect review focus. Trigger: PRs over 400 lines, stacked PRs, review slices.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Activation Contract
|
|
7
|
+
|
|
8
|
+
Load this skill when a planned PR may exceed **400 changed lines**, SDD forecasts `400-line budget risk: High` or `Chained PRs recommended: Yes`, or the user asks for chained/stacked PRs, review slices, or reviewer-load control.
|
|
9
|
+
|
|
10
|
+
## Hard Rules
|
|
11
|
+
|
|
12
|
+
- Split PRs over **400 changed lines** unless a maintainer explicitly accepts `size:exception`.
|
|
13
|
+
- Keep each PR reviewable in about **≤60 minutes**.
|
|
14
|
+
- Use one deliverable work unit per PR; keep tests/docs with the unit they verify.
|
|
15
|
+
- State start, end, prior dependencies, follow-up work, and out-of-scope items in every chained PR.
|
|
16
|
+
- Every child PR must include a dependency diagram marking the current PR with `📍`.
|
|
17
|
+
- In Feature Branch Chain, create a draft/no-merge tracker PR; child PR #1 targets the tracker branch, later children target the immediate parent branch.
|
|
18
|
+
- Treat polluted diffs as base bugs: retarget or rebase until only the current work unit appears.
|
|
19
|
+
- Do not mix chain strategies after the user chooses one.
|
|
20
|
+
|
|
21
|
+
## Decision Gates
|
|
22
|
+
|
|
23
|
+
| Condition | Action |
|
|
24
|
+
|---|---|
|
|
25
|
+
| PR ≤400 changed lines and focused | Keep single PR. |
|
|
26
|
+
| PR >400, each slice can land independently | Use Stacked PRs to main. |
|
|
27
|
+
| PR >400, feature must integrate before main | Use Feature Branch Chain with tracker. |
|
|
28
|
+
| Generated/vendor/migration diff cannot split cleanly | Ask maintainer for `size:exception`. |
|
|
29
|
+
| SDD provides `delivery_strategy` | Follow it before apply/PR creation. |
|
|
30
|
+
|
|
31
|
+
## Execution Steps
|
|
32
|
+
|
|
33
|
+
1. Estimate changed lines and identify independent work units.
|
|
34
|
+
2. Ask for a chain strategy when none is cached and the budget is exceeded.
|
|
35
|
+
3. Create branches/PRs using the chosen strategy only.
|
|
36
|
+
4. Add Chain Context to each PR without replacing the repo PR template.
|
|
37
|
+
5. Verify each PR independently: CI/tests/docs/manual checks, rollback scope, and clean diff.
|
|
38
|
+
6. Keep tracker PR draft/no-merge until all child PRs are reviewed and integrated.
|
|
39
|
+
|
|
40
|
+
## Output Contract
|
|
41
|
+
|
|
42
|
+
Return the chosen strategy, PR order, current PR boundary, dependency diagram, review budget (`additions + deletions`), verification plan, and any `size:exception` rationale.
|
|
43
|
+
|
|
44
|
+
## References
|
|
45
|
+
|
|
46
|
+
- [references/chaining-details.md](references/chaining-details.md) — strategy diagrams, PR body section, branch commands, and reviewer guidance.
|
|
47
|
+
|
|
48
|
+
_Adapted from a skill originally authored by gentleman-programming._
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Chained PR Details
|
|
2
|
+
|
|
3
|
+
## Strategy Notes
|
|
4
|
+
|
|
5
|
+
| | Stacked PRs to main | Feature Branch Chain |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| Speed | Each slice can ship in order | Full feature waits for tracker merge |
|
|
8
|
+
| Rollback | Revert individual main PRs | Revert/hold the whole feature branch |
|
|
9
|
+
| Risk | Partial behavior may land | Nothing lands until the chain completes |
|
|
10
|
+
| Complexity | Simpler retarget/rebase flow | Requires tracker and strict diff hygiene |
|
|
11
|
+
|
|
12
|
+
## Feature Branch Chain
|
|
13
|
+
|
|
14
|
+
Use when the feature branch accumulates the final integration while child PRs are reviewed as focused slices.
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
main
|
|
18
|
+
└── feat/my-feature ← tracker/final integration branch
|
|
19
|
+
↑ PR #1 base: feat/my-feature
|
|
20
|
+
└── feat/my-feature-01-core
|
|
21
|
+
↑ PR #2 base: feat/my-feature-01-core
|
|
22
|
+
└── feat/my-feature-02-shared
|
|
23
|
+
↑ PR #3 base: feat/my-feature-02-shared
|
|
24
|
+
└── feat/my-feature-03-slice
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Steps:
|
|
28
|
+
|
|
29
|
+
1. Create the feature/tracker branch from `main`.
|
|
30
|
+
2. Open the tracker PR to `main`; mark it draft/no-merge.
|
|
31
|
+
3. Create PR #1 from a child branch and target it to the tracker branch.
|
|
32
|
+
4. Create each later child branch from the previous PR branch and target it to that parent branch.
|
|
33
|
+
5. Merge/integrate children in order; merge the tracker only after the chain is complete.
|
|
34
|
+
|
|
35
|
+
## Stacked PRs to Main
|
|
36
|
+
|
|
37
|
+
Use when each slice can land on `main` in order.
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
main <- PR 1: foundation
|
|
41
|
+
└── PR 2: feature slice built on PR 1
|
|
42
|
+
└── PR 3: docs/tests built on PR 2
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
After a parent PR merges, rebase/retarget the next PR so GitHub shows only the current slice.
|
|
46
|
+
|
|
47
|
+
## Chain Context Section
|
|
48
|
+
|
|
49
|
+
Append this section to the repo PR template; do not replace required issue/checklist sections.
|
|
50
|
+
|
|
51
|
+
```markdown
|
|
52
|
+
## Chain Context
|
|
53
|
+
|
|
54
|
+
| Field | Value |
|
|
55
|
+
|-------|-------|
|
|
56
|
+
| Chain | <feature or stack name> |
|
|
57
|
+
| Tracker PR | <#NNN or "Not needed"> |
|
|
58
|
+
| Position | <N of total> |
|
|
59
|
+
| Base | `<target branch>` |
|
|
60
|
+
| Depends on | <PR/issue/link or "None"> |
|
|
61
|
+
| Follow-up | <next PR or "None"> |
|
|
62
|
+
| Review budget | <changed lines> / 400 |
|
|
63
|
+
| Starts at | <branch, PR, or state this builds on> |
|
|
64
|
+
| Ends with | <standalone result delivered by this PR> |
|
|
65
|
+
|
|
66
|
+
### Chain Overview
|
|
67
|
+
|
|
68
|
+
```text
|
|
69
|
+
main
|
|
70
|
+
└── #NNN Previous PR
|
|
71
|
+
└── 📍 #NNN This PR
|
|
72
|
+
└── #NNN Next PR
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Scope
|
|
76
|
+
- Includes: <focused unit>
|
|
77
|
+
- Excludes: <deferred work>
|
|
78
|
+
|
|
79
|
+
### Autonomy
|
|
80
|
+
- [ ] CI is expected to pass for this PR branch
|
|
81
|
+
- [ ] This PR has one deliverable scope
|
|
82
|
+
- [ ] This PR can be rolled back without unrelated changes
|
|
83
|
+
- [ ] Tests, docs, or manual verification cover this unit
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Commands
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
gh pr view <PR_NUMBER> --json additions,deletions,changedFiles,title,url
|
|
90
|
+
gh pr create --base feat/my-feature --title "feat(scope): focused slice" --body-file pr-body.md
|
|
91
|
+
gh pr create --base feat/my-feature-01-core --title "feat(scope): next focused slice" --body-file pr-body.md
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Reviewer Guidance
|
|
95
|
+
|
|
96
|
+
- Ask for a split when a PR exceeds 400 changed lines without `size:exception`.
|
|
97
|
+
- Recommend Feature Branch Chain when work must integrate before `main`.
|
|
98
|
+
- Recommend stacked PRs when each slice can merge independently.
|
|
99
|
+
- Review child PRs against immediate parent branches; a polluted diff is a branching bug.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cognitive-doc-design
|
|
3
|
+
description: Design docs that reduce cognitive load. Trigger: writing guides, READMEs, RFCs, onboarding, architecture, or review-facing docs.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## When to Use
|
|
7
|
+
|
|
8
|
+
Load this skill when creating or editing documentation that people need to understand quickly, retain, or use during review.
|
|
9
|
+
|
|
10
|
+
Use it especially for:
|
|
11
|
+
|
|
12
|
+
- PR descriptions and review notes.
|
|
13
|
+
- Contributor or maintainer guides.
|
|
14
|
+
- Architecture, workflow, or onboarding docs.
|
|
15
|
+
- Any doc that currently feels long, dense, or hard to scan.
|
|
16
|
+
|
|
17
|
+
## Critical Patterns
|
|
18
|
+
|
|
19
|
+
| Pattern | Rule |
|
|
20
|
+
|---------|------|
|
|
21
|
+
| Lead with the answer | Put the decision, action, or outcome first. Context comes after. |
|
|
22
|
+
| Progressive disclosure | Start with the happy path, then add details, edge cases, and references. |
|
|
23
|
+
| Chunking | Group related information into small sections. Keep flat lists short. |
|
|
24
|
+
| Signposting | Use headings, labels, callouts, and summaries so readers know where they are. |
|
|
25
|
+
| Recognition over recall | Prefer tables, checklists, examples, and templates over prose that must be remembered. |
|
|
26
|
+
| Review empathy | Design docs so reviewers can verify intent without reconstructing the whole story. |
|
|
27
|
+
|
|
28
|
+
## Documentation Shape
|
|
29
|
+
|
|
30
|
+
Use this default structure unless the repo already provides a stronger template:
|
|
31
|
+
|
|
32
|
+
```markdown
|
|
33
|
+
# <Outcome-oriented title>
|
|
34
|
+
|
|
35
|
+
<One paragraph: what changed, who it helps, and why it matters.>
|
|
36
|
+
|
|
37
|
+
## Quick path
|
|
38
|
+
|
|
39
|
+
1. <First action>
|
|
40
|
+
2. <Second action>
|
|
41
|
+
3. <Verification or expected result>
|
|
42
|
+
|
|
43
|
+
## Details
|
|
44
|
+
|
|
45
|
+
| Topic | Decision |
|
|
46
|
+
|-------|----------|
|
|
47
|
+
| <area> | <concise explanation> |
|
|
48
|
+
|
|
49
|
+
## Checklist
|
|
50
|
+
|
|
51
|
+
- [ ] <Reader can confirm this>
|
|
52
|
+
- [ ] <Reader can confirm that>
|
|
53
|
+
|
|
54
|
+
## Next step
|
|
55
|
+
|
|
56
|
+
<Link or action that continues the workflow.>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## PR and Review Docs
|
|
60
|
+
|
|
61
|
+
When documenting a PR, reduce reviewer burnout by making the review path explicit:
|
|
62
|
+
|
|
63
|
+
- State what to review first.
|
|
64
|
+
- State what is intentionally out of scope.
|
|
65
|
+
- Link the previous and next PR when work is chained.
|
|
66
|
+
- Keep each section focused on one decision or unit of work.
|
|
67
|
+
- Use checklists for acceptance criteria and verification.
|
|
68
|
+
|
|
69
|
+
## Commands
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# Check markdown files changed in the current branch
|
|
73
|
+
git diff --name-only -- '*.md'
|
|
74
|
+
|
|
75
|
+
# Inspect PR changed-line count for cognitive load
|
|
76
|
+
gh pr view <PR_NUMBER> --json additions,deletions,changedFiles
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
_Adapted from a skill originally authored by gentleman-programming._
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: comment-writer
|
|
3
|
+
description: Write warm, direct collaboration comments. Trigger: PR feedback, issue replies, reviews, Slack messages, or GitHub comments.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## When to Use
|
|
7
|
+
|
|
8
|
+
Load this skill whenever you write a comment that another human will read.
|
|
9
|
+
|
|
10
|
+
Use it for:
|
|
11
|
+
|
|
12
|
+
- GitHub PR or issue comments.
|
|
13
|
+
- Review feedback and requested changes.
|
|
14
|
+
- Maintainer replies.
|
|
15
|
+
- Slack, Discord, or async project updates.
|
|
16
|
+
|
|
17
|
+
## Voice Rules
|
|
18
|
+
|
|
19
|
+
| Rule | Requirement |
|
|
20
|
+
|------|-------------|
|
|
21
|
+
| Be useful fast | Start with the actionable point. Do not recap the whole PR before feedback. |
|
|
22
|
+
| Be warm and direct | Sound like a thoughtful teammate, not a corporate bot. |
|
|
23
|
+
| Keep it short | Prefer 1 to 3 short paragraphs or a tight bullet list. |
|
|
24
|
+
| Explain why | Give the technical reason when asking for a change. |
|
|
25
|
+
| Avoid pile-ons | Comment on the highest-value issue, not every tiny preference. |
|
|
26
|
+
| Match target context language | Write in the target context language by default: Spanish issue/thread -> Spanish comment, English issue/thread -> English comment, mixed context -> target message language. If the user explicitly requests a language or tone, follow that request. For Spanish comments, use neutral/professional Spanish by default unless the user or target context clearly calls for regional tone. |
|
|
27
|
+
| No em dashes | Use commas, periods, or parentheses instead. |
|
|
28
|
+
|
|
29
|
+
## Comment Formula
|
|
30
|
+
|
|
31
|
+
```text
|
|
32
|
+
<Direct observation or request>
|
|
33
|
+
|
|
34
|
+
<Why it matters, only if needed>
|
|
35
|
+
|
|
36
|
+
<Concrete next action>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Examples
|
|
40
|
+
|
|
41
|
+
### Request change
|
|
42
|
+
|
|
43
|
+
```markdown
|
|
44
|
+
Good approach overall. I'd split this into a separate commit because it mixes validation logic with UI wiring.
|
|
45
|
+
|
|
46
|
+
That keeps the reviewer's focus narrower and makes rollback cleaner if the integration fails.
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Approve with a note
|
|
50
|
+
|
|
51
|
+
```markdown
|
|
52
|
+
Approved. The scope is clear and the change is well-contained.
|
|
53
|
+
|
|
54
|
+
For the next PR, add links to the previous and following PRs so the chain stays navigable.
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Ask for split
|
|
58
|
+
|
|
59
|
+
```markdown
|
|
60
|
+
This PR exceeds the 400-line budget, so we need to split it or justify `size:exception`.
|
|
61
|
+
|
|
62
|
+
Suggested order: foundation + tests first, then integration, then docs. That gives each review a clear start and end.
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Commands
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Inspect a PR before writing review feedback
|
|
69
|
+
gh pr view <PR_NUMBER> --json title,body,additions,deletions,changedFiles
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
_Adapted from a skill originally authored by gentleman-programming._
|