# SKILL: CLI — extender

Tier 2. Comandos en AIREF.md.

## Tipos generate

| Tipo | Alias | Naming | Output | Error |
|---|---|---|---|---|
| component | c | PascalCase | `src/components/features/<N>.ark` | `INVALID_COMPONENT_NAME` |
| page | p | kebab/path | `src/pages/<path>.ark` | — |
| store | s | camelCase | `src/stores/<n>.store.ts` | `INVALID_STORE_NAME` |
| service | sv | PascalCase | `src/services/<n>.service.ts` | `INVALID_SERVICE_NAME` |
| layout | l | name | `src/pages/<n>/_layout.ark` | — |

Genéricos: `UNKNOWN_GENERATE_TYPE`, `FILE_ALREADY_EXISTS`.

## Agregar tipo

1. `xxxTemplate(name)` en `src/cli/templates/index.ts`
2. Sumar a `TYPE_ALIASES` en `src/cli/commands/generate.ts`
3. `buildXxxPath()` helper
4. `case 'xxx':` + validación naming
5. Tests en `generate.test.ts` + `templates.test.ts` (este corre analyzer — debe pasar 0 errors)

## Bin construction

```typescript
// vite.config.ts
build: {
  lib: { entry: { index: 'src/index.ts', vite: 'src/compiler/vite-plugin.ts', cli: 'src/cli/index.ts' } },
  rollupOptions: { output: { banner: (c) => c.name === 'cli' ? '#!/usr/bin/env node' : '' } },
}
```
```json
{ "bin": { "ark": "./dist/cli.js" },
  "scripts": { "build": "vite build && chmod +x dist/cli.js" } }
```
`chmod +x` obligatorio. NO shebang en `src/cli/index.ts` (esbuild lo rechaza). Banner solo al chunk `cli`.

## REGLA #7 — verificar bin post-publish

`npm publish` puede alterar `package.json.bin` silenciosamente (pasó en v0.1.0):
```bash
cd /tmp && mkdir t && cd t && npm init -y && npm install arckode-ui@<v>
ls node_modules/.bin/ark         # debe existir
./node_modules/.bin/ark --help   # debe funcionar
```

## ark new — verificación crítica

`vite.config.ts` generado importa `arkcodeUi` (K minúscula intermedia). Hay test en `src/cli/__tests__/new.test.ts`. Si agregás archivos al scaffold, sumar test que ningún template use nombres rotos.
