Greasy Sprocket extension skeleton template
- TypeScript 70%
- HTML 14.4%
- CSS 10.3%
- JavaScript 5.3%
| .gitea/workflows | ||
| docs | ||
| public | ||
| src | ||
| tests | ||
| .gitignore | ||
| biome.json | ||
| commitlint.config.cjs | ||
| lefthook.yml | ||
| LICENSE | ||
| package.json | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| README.md | ||
| tsconfig.json | ||
| wxt.config.ts | ||
Greasy Sprocket — Extension Skeleton Template
Base para TODAS las extensiones de Greasy Sprocket. Clona este repo, renombra y rellena los placeholders. Así el footer, CI, listing y hooks de calidad son idénticos en toda la flota y un fix se propaga copiando el fichero canónico.
Cómo crear una extensión nueva
# 1. Crear repo vacío en Gitea (API) y clonarlo
git clone https://git.greasysprocket.com/monyi/<ext-id>.git
cd <ext-id>
# 2. Copiar el esqueleto (sin .git del template)
cp -r ~/gs-work/ext-template/{.gitea,docs,public,src,tests,biome.json,commitlint.config.cjs,lefthook.yml,package.json,pnpm-workspace.yaml,tsconfig.json,.gitignore} .
# 3. Renombrar placeholders (ver SECTIONS abajo)
grep -rn "EXT_ID_HERE\|EXT_NAME_HERE\|EXT_DESCRIPTION_HERE" .
# 4. pnpm install && pnpm wxt prepare && pnpm run validate
# 5. Primer commit + push
Placeholders a rellenar
| Placeholder | Dónde | Ejemplo (tabsnooze) |
|---|---|---|
EXT_ID_HERE |
popup footer ☕ (?ext=) |
tabsnooze |
EXT_NAME_HERE |
manifest name, footer title, listing | TabSnooze |
EXT_DESCRIPTION_HERE |
package.json + wxt.config.ts + listing | "Snooze tabs for later..." |
EXT_PERMISSIONS_HERE |
wxt.config.ts (solo las que uses, con justificación en listing) | ["alarms","tabs","storage","contextMenus"] |
Qué trae el esqueleto
- Footer canónico (
src/entrypoints/popup/footer.html+footer.css): 💬 Support / 🐛 Feedback / ☕ Support ext / Greasy Sprocket. IGUAL en todas las extensiones — solo cambia el?ext=del ☕. Si se arregla algo aquí, se copia a la flota. - CI Gitea Actions (
.gitea/workflows/ci.yml): validate (typecheck+lint+test+build) en push a main + release job que sube el ZIP a la Release en tagsv*. Requiere runner activo en la instancia. - i18n scaffold:
public/_locales/en/messages.json+es/messages.json(14 claves estándar del footer y popup genérico) ydefault_locale: "en"ya en el manifest — sin esto Chrome rechaza la carga. - docs/cws-listing.md plantilla: single purpose, justificación de cada permiso, descripciones, checkboxes de privacidad.
- docs/screenshots/ — vacío, para las 3 capturas 1280×800 (receta:
references/cws-screenshotsdel skill browser-extension-publish). - Calidad: Biome + commitlint + lefthook (mismo config que tabsnooze).
- Tests: Vitest con ejemplo de test de lógica pura en
tests/.
Reglas de flota (no negociables)
- Sin nag screens. Nada se abre solo, nunca. El apoyo es el botón ☕ pasivo del footer.
- Footer idéntico en todas las extensiones (este template es la fuente de verdad).
- Sin ko-fi ni URLs externas en el footer: solo greasysprocket.com.
default_locale+_locales/van juntos — siempre los dos o ninguno.- Permisos mínimos: solo los que el listing justifica. Prohibido
<all_urls>. - Manifest version = tag version = Release version (unificar antes de taggear).
- Pre-submit: seguir el checklist del skill
browser-extension-publish(incluye verificar el ZIP descargado de la Release, no solo el build local). - Cada extensión tiene su propia privacy policy en la web (página
/privacypor extensión o sección dedicada).
Footer CSS (canónico)
Copiar el bloque .gs-footer* de footer.css al style.css del popup/sidepanel. Requiere que el tema defina --border y --text-muted.