@codigodoleo/wp-kit 3.2.0 → 3.4.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/README.md +73 -194
- package/lib/core/infer-ci-capabilities.js +17 -0
- package/lib/prompts/index.js +64 -4
- package/modules/blank-theme/index.js +71 -0
- package/modules/blank-theme/lint/.prettierrc.json +12 -0
- package/modules/blank-theme/lint/.stylelintrc.json +7 -0
- package/modules/{lint → blank-theme/lint}/eslint.config.mjs +2 -8
- package/modules/blank-theme/lint/pint.json +11 -0
- package/modules/blank-theme/prompts.js +33 -0
- package/modules/blank-theme/templates/.lando.yml.hbs +26 -0
- package/modules/blank-theme/templates/functions.php.hbs +46 -0
- package/modules/blank-theme/templates/package.json.hbs +16 -0
- package/modules/blank-theme/templates/style.css.hbs +7 -0
- package/modules/blank-theme/templates/vite.config.js.hbs +23 -0
- package/modules/deploy/.github/workflows/deploy-docker.yml +2 -0
- package/modules/deploy/.github/workflows/deploy-ssh.yml +2 -0
- package/modules/deploy/.github/workflows/release.yml +2 -0
- package/modules/deploy/index.js +38 -0
- package/modules/deploy/templates/.github/workflows/ci.yml.hbs +29 -1
- package/modules/deploy/templates/.gitlab/ci/lint-blank-theme.yml.hbs +35 -0
- package/modules/deploy/templates/.gitlab/ci/lint-mu-plugin.yml.hbs +19 -0
- package/modules/deploy/templates/.gitlab/ci/lint-plugin.yml.hbs +19 -0
- package/modules/deploy/templates/.gitlab/ci/lint-sage.yml.hbs +47 -0
- package/modules/git/templates/workspace.json.hbs +1 -1
- package/modules/lint/.commitlintrc.json +21 -0
- package/modules/lint/.prettierignore +15 -25
- package/modules/lint/.prettierrc.json +5 -16
- package/modules/lint/index.js +75 -8
- package/modules/lint/prompts.js +1 -8
- package/modules/lint/templates/.lando.yml.hbs +3 -8
- package/modules/lint/templates/workspace.json.hbs +3 -3
- package/modules/mu-plugin/index.js +49 -0
- package/modules/mu-plugin/lint/.prettierrc.json +7 -0
- package/modules/mu-plugin/lint/eslint.config.mjs +30 -0
- package/modules/mu-plugin/lint/pint.json +11 -0
- package/modules/mu-plugin/prompts.js +23 -0
- package/modules/mu-plugin/templates/.lando.yml.hbs +15 -0
- package/modules/mu-plugin/templates/composer.json.hbs +14 -0
- package/modules/mu-plugin/templates/plugin.php.hbs +15 -0
- package/modules/php/templates/composer.json.hbs +15 -1
- package/modules/plugin/index.js +45 -0
- package/modules/plugin/lint/.prettierrc.json +7 -0
- package/modules/plugin/lint/eslint.config.mjs +30 -0
- package/modules/plugin/lint/pint.json +11 -0
- package/modules/plugin/prompts.js +23 -0
- package/modules/plugin/templates/.lando.yml.hbs +15 -0
- package/modules/plugin/templates/composer.json.hbs +14 -0
- package/modules/plugin/templates/plugin.php.hbs +15 -0
- package/modules/sage/index.js +25 -0
- package/modules/sage/lint/.prettierrc.json +12 -0
- package/modules/sage/lint/.stylelintrc.json +7 -0
- package/modules/sage/lint/eslint.config.mjs +30 -0
- package/modules/sage/lint/pint.json +11 -0
- package/modules/sage/prompts.js +22 -7
- package/modules/sage/templates/.devcontainer/docker-compose.override.yml.hbs +1 -3
- package/modules/sage/templates/.lando.yml.hbs +17 -5
- package/modules/sage/templates/theme/vite.config.js.hbs +4 -4
- package/package.json +7 -1
- package/templates/.devcontainer/docker-compose.yml.hbs +3 -0
- package/templates/.gitignore.hbs +84 -13
- package/templates/.lando.yml.hbs +2 -0
- package/templates/composer.json.hbs +60 -13
- package/templates/workspace.json.hbs +1 -1
- package/modules/lint/.eslintignore +0 -36
- package/modules/lint/.eslintrc.json +0 -8
- package/modules/lint/.stylelintignore +0 -19
- package/modules/lint/.stylelintrc.json +0 -9
- package/modules/lint/pint.json +0 -26
package/README.md
CHANGED
|
@@ -1,240 +1,119 @@
|
|
|
1
|
-
# @codigodoleo/wp-kit
|
|
1
|
+
# @codigodoleo/wp-kit
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@codigodoleo/wp-kit)
|
|
4
|
+
[](LICENSE)
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
wp-kit monta a estrutura que você sempre recria do zero — lint, CI, deploy, scaffolds WordPress — em menos de um minuto.
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
- Onboarding rápido (menos passos manuais, menos erros)
|
|
9
|
-
- CI/CD dinâmico que se adapta às suas escolhas (GitLab, GitHub ou Bitbucket)
|
|
10
|
-
- Convenções modernas (Conventional Commits, linters, hooks)
|
|
8
|
+
## O que você quer fazer hoje?
|
|
11
9
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
|
|
10
|
+
| Cenário | Módulos ativos | Quickstart |
|
|
11
|
+
| ----------------------------- | ------------------------- | ----------------------------- |
|
|
12
|
+
| Só lint, git e deploy | `lint` + `git` + `deploy` | [→ Quickstart](#quickstart) |
|
|
13
|
+
| Tema WordPress moderno (Sage) | + `sage` | [→ Sage](#sage) |
|
|
14
|
+
| MU Plugin customizado | + `mu-plugin` | [→ MU Plugin](#mu-plugin) |
|
|
15
|
+
| Plugin WordPress | + `plugin` | [→ Plugin](#plugin) |
|
|
16
|
+
| Tema do zero com Vite | + `blank-theme` | [→ Blank Theme](#blank-theme) |
|
|
18
17
|
|
|
19
|
-
|
|
18
|
+
> ⚡ Os módulos são combinantes — você pode ter Sage + mu-plugin + lint no mesmo projeto. E pode adicionar módulos rodando o `init` novamente.
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
## Quickstart
|
|
22
21
|
|
|
23
22
|
```bash
|
|
24
|
-
npx @codigodoleo/wp-kit init --output meu-
|
|
23
|
+
npx @codigodoleo/wp-kit init --output meu-site
|
|
25
24
|
```
|
|
26
25
|
|
|
27
|
-
|
|
26
|
+
Sem perguntas (defaults inteligentes):
|
|
28
27
|
|
|
29
28
|
```bash
|
|
30
|
-
npx @codigodoleo/wp-kit init --output meu-
|
|
29
|
+
npx @codigodoleo/wp-kit init --output meu-site --defaults
|
|
31
30
|
```
|
|
32
31
|
|
|
33
|
-
|
|
32
|
+
Instalação global (opcional):
|
|
34
33
|
|
|
35
34
|
```bash
|
|
36
35
|
npm install -g @codigodoleo/wp-kit
|
|
37
|
-
leo-wp init --output meu-
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## O que é gerado
|
|
41
|
-
|
|
42
|
-
- Estrutura WordPress com `content/` (temas, plugins, uploads)
|
|
43
|
-
- Configurações úteis em `server/` e arquivos base (`.env`, `.editorconfig`, etc.)
|
|
44
|
-
- Workspace do VSCode (opcional)
|
|
45
|
-
- Pipelines de CI prontos, conforme o provedor escolhido:
|
|
46
|
-
- GitLab: `.gitlab-ci.yml`
|
|
47
|
-
- GitHub: `.github/workflows/ci.yml`
|
|
48
|
-
- Bitbucket: `bitbucket-pipelines.yml`
|
|
49
|
-
- Convenções de Git e qualidade (husky, commitlint, lint-staged, ESLint, Prettier, Stylelint, Pint)
|
|
50
|
-
- Integração opcional com tema Sage (v10/v11), com build automatizado
|
|
51
|
-
|
|
52
|
-
## Como funciona (visão rápida)
|
|
53
|
-
|
|
54
|
-
1. Você roda `init` e responde às perguntas (ou usa `--defaults`).
|
|
55
|
-
2. O CLI infere capacidades (Composer, Node, Sage, Docker) e monta `context.ci`.
|
|
56
|
-
3. O módulo `deploy` gera o pipeline certo para seu provedor (GitLab/GitHub/Bitbucket) com jobs somente do que faz sentido para o seu projeto.
|
|
57
|
-
|
|
58
|
-
Exemplo: Se você ativar Sage 11, ajustamos versões automaticamente (PHP/Node/WP) e incluímos o job de build do tema no CI.
|
|
59
|
-
|
|
60
|
-
## Fluxo recomendado
|
|
61
|
-
|
|
62
|
-
1. Execute o comando (interativo):
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
npx @codigodoleo/wp-kit init --output meu-wp
|
|
36
|
+
leo-wp init --output meu-site
|
|
66
37
|
```
|
|
67
38
|
|
|
68
|
-
|
|
69
|
-
3. Ative o módulo "deploy" (gera a pipeline automática).
|
|
70
|
-
4. Se desejar, habilite o tema Sage (o build entra na pipeline automaticamente).
|
|
71
|
-
5. Faça o primeiro commit e suba o repositório. O CI já estará pronto para rodar.
|
|
39
|
+
## Scaffolds disponíveis
|
|
72
40
|
|
|
73
|
-
|
|
41
|
+
| | Sage | MU Plugin | Plugin | Blank Theme |
|
|
42
|
+
| ------------- | ------------------------- | --------------------------- | ------------------------ | ------------------------- |
|
|
43
|
+
| **Diretório** | `content/themes/{name}` | `content/mu-plugins/{name}` | `content/plugins/{name}` | `content/themes/{name}` |
|
|
44
|
+
| **PHP** | Acorn + Blade | PSR-4 | PSR-4 | Mínimo |
|
|
45
|
+
| **JS/CSS** | Vite (Bud) | — | — | Vite + SCSS |
|
|
46
|
+
| **ACF** | ACF Composer | — | — | — |
|
|
47
|
+
| **Lint** | ESLint + Stylelint + Pint | Pint | Pint | ESLint + Stylelint + Pint |
|
|
74
48
|
|
|
75
|
-
|
|
76
|
-
- `--help` — Ajuda
|
|
77
|
-
- `--version` — Versão
|
|
78
|
-
|
|
79
|
-
### Opções do `init`
|
|
80
|
-
|
|
81
|
-
- `--output <path>` — Diretório de saída do projeto
|
|
82
|
-
- `--defaults` — Usa configurações padrão sem interação
|
|
83
|
-
|
|
84
|
-
## Exemplos práticos
|
|
85
|
-
|
|
86
|
-
- Interativo, escolhendo tudo pelo prompt:
|
|
87
|
-
|
|
88
|
-
```bash
|
|
89
|
-
npx @codigodoleo/wp-kit init --output site-corporativo
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
- Projeto padrão, sem prompts (padrões inteligentes):
|
|
93
|
-
|
|
94
|
-
```bash
|
|
95
|
-
npx @codigodoleo/wp-kit init --output blog-interno --defaults
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
## Estrutura essencial de pastas
|
|
99
|
-
|
|
100
|
-
```
|
|
101
|
-
meu-projeto/
|
|
102
|
-
content/
|
|
103
|
-
themes/
|
|
104
|
-
plugins/
|
|
105
|
-
uploads/
|
|
106
|
-
server/
|
|
107
|
-
.gitlab-ci.yml | .github/workflows/ci.yml | bitbucket-pipelines.yml
|
|
108
|
-
.env, .editorconfig, README.md, etc.
|
|
109
|
-
```
|
|
49
|
+
## Requisitos
|
|
110
50
|
|
|
111
|
-
|
|
51
|
+
- Node.js 18+ (recomendado 22+)
|
|
52
|
+
- npm
|
|
53
|
+
- Git
|
|
54
|
+
- PHP 8.2+ e Composer — necessário para Sage, mu-plugin e plugin
|
|
112
55
|
|
|
113
|
-
|
|
56
|
+
## Módulos
|
|
114
57
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
58
|
+
| Módulo | O que faz |
|
|
59
|
+
| ------------- | ------------------------------------------------------------------- |
|
|
60
|
+
| `git` | Inicializa repositório, Husky, commitlint, lint-staged |
|
|
61
|
+
| `deploy` | Gera pipeline de CI (GitLab, GitHub Actions ou Bitbucket Pipelines) |
|
|
62
|
+
| `lint` | Configura ESLint, Prettier, Stylelint, Pint, commitlint e hooks |
|
|
63
|
+
| `sage` | Scaffold do tema Roots Sage v11 em `content/themes/` |
|
|
64
|
+
| `mu-plugin` | Scaffold de MU Plugin em `content/mu-plugins/` |
|
|
65
|
+
| `plugin` | Scaffold de Plugin em `content/plugins/` |
|
|
66
|
+
| `blank-theme` | Scaffold de tema Vite+SCSS em `content/themes/` |
|
|
67
|
+
| `php` | Scripts e configs auxiliares para PHP |
|
|
68
|
+
| `docs` | Gera README do projeto gerado |
|
|
119
69
|
|
|
120
|
-
|
|
70
|
+
Documentação completa: [docs/04-Módulos.md](docs/04-Módulos.md)
|
|
121
71
|
|
|
122
|
-
|
|
72
|
+
## Lint modular
|
|
123
73
|
|
|
124
|
-
|
|
74
|
+
O sistema de lint é modular: cada scaffold tem suas próprias configs instaladas de forma independente.
|
|
125
75
|
|
|
126
|
-
|
|
127
|
-
- Hooks: Husky + lint-staged (validação automática ao fazer commit)
|
|
128
|
-
- Linters: ESLint (flat config), Prettier, Stylelint, Pint
|
|
129
|
-
- Commitlint: Validação de mensagens de commit convencionais
|
|
130
|
-
- Interactive commits: Use `npm run commit` para commits interativos
|
|
76
|
+
> ⚠️ `enable_lint` controla apenas Husky + commitlint + `.lintstagedrc.json` dinâmico. Os arquivos de config (`pint.json`, `.prettierrc.json`, `eslint.config.mjs`) são sempre instalados em cada scaffold, independentemente dessa flag.
|
|
131
77
|
|
|
132
|
-
|
|
78
|
+
O `.lintstagedrc.json` na raiz é gerado dinamicamente com base nos módulos ativos — apenas os linters relevantes para o que você habilitou.
|
|
133
79
|
|
|
134
|
-
|
|
80
|
+
## CI Dinâmico
|
|
135
81
|
|
|
136
|
-
|
|
137
|
-
- `npm run lint:fix` — Corrigir automaticamente problemas de linting
|
|
138
|
-
- `npm run format` — Formatar código com Prettier
|
|
139
|
-
- `npm run commit` — Criar commit interativo (cz)
|
|
140
|
-
- `npm run test:setup` — Gerar sandbox de teste
|
|
141
|
-
- `npm run test:scaffold` — Criar novo projeto de teste
|
|
82
|
+
O pipeline é gerado com base nos módulos que você ativou:
|
|
142
83
|
|
|
143
|
-
|
|
84
|
+
- `ci.build.composer` — composer.json detectado ou Sage ativo
|
|
85
|
+
- `ci.build.node` — package.json detectado ou Sage ativo
|
|
86
|
+
- `ci.lint.sage` — Sage ativo + `enable_lint`
|
|
87
|
+
- `ci.lint.mu_plugin` — mu-plugin ativo + `enable_lint`
|
|
88
|
+
- `ci.lint.plugin` — plugin ativo + `enable_lint`
|
|
89
|
+
- `ci.lint.blank_theme` — blank-theme ativo + `enable_lint`
|
|
90
|
+
- `ci.deploy.docker` — estratégia Docker selecionada
|
|
144
91
|
|
|
145
|
-
|
|
92
|
+
> 💡 Você não precisa editar o pipeline manualmente — se ativar um módulo, o job correspondente já aparece no CI.
|
|
146
93
|
|
|
147
|
-
|
|
148
|
-
- **commit-msg**: Valida mensagem com commitlint
|
|
94
|
+
Documentação completa: [docs/05-CI-Dinâmico.md](docs/05-CI-Dinâmico.md)
|
|
149
95
|
|
|
150
|
-
|
|
96
|
+
## Scripts de desenvolvimento
|
|
151
97
|
|
|
152
98
|
```bash
|
|
153
|
-
|
|
99
|
+
npm run lint # ESLint
|
|
100
|
+
npm run lint:fix # ESLint com correção automática
|
|
101
|
+
npm run format # Prettier
|
|
102
|
+
npm run commit # Commit interativo (commitizen)
|
|
154
103
|
```
|
|
155
104
|
|
|
156
|
-
##
|
|
157
|
-
|
|
158
|
-
O projeto agora usa o novo formato ESLint flat config (`eslint.config.mjs`):
|
|
159
|
-
|
|
160
|
-
- Melhor inicialização de projeto
|
|
161
|
-
- Sem `eslintrc.json` legado
|
|
162
|
-
- Ignores integradas na configuração principal
|
|
163
|
-
- Melhor performance
|
|
164
|
-
|
|
165
|
-
Projetos gerados também usarão este novo formato.
|
|
166
|
-
|
|
167
|
-
## Dicas e solução de problemas
|
|
168
|
-
|
|
169
|
-
- Pipeline não foi gerado? Verifique se habilitou o módulo `deploy` e qual provedor selecionou no módulo `git`.
|
|
170
|
-
- Tema Sage não compilou? Garanta Composer/Node instalados e que o tema existe em `content/themes/<projectName>`.
|
|
171
|
-
|
|
172
|
-
## AI Co-Pilot Support 🤖
|
|
173
|
-
|
|
174
|
-
wp-kit agora inclui suporte integrado para assistência de IA via **Claude Code** (e futuramente Cursor e VSCode).
|
|
175
|
-
|
|
176
|
-
### Funcionalidades
|
|
177
|
-
|
|
178
|
-
Três skills prontos para ajudar no desenvolvimento:
|
|
179
|
-
|
|
180
|
-
1. **Building Sage Themes** — Master Sage 11 & Acorn
|
|
181
|
-
- Service providers e injeção de dependência
|
|
182
|
-
- Componentes Blade e view composers
|
|
183
|
-
- theme.json e configuração WordPress
|
|
184
|
-
- Padrões de desenvolvimento
|
|
185
|
-
|
|
186
|
-
2. **Optimizing Vite Builds** — Performance de assets
|
|
187
|
-
- Configuração Vite e bundling
|
|
188
|
-
- Code splitting e análise de bundle
|
|
189
|
-
- Cache busting e asset versioning
|
|
190
|
-
- Monitoramento de performance
|
|
105
|
+
## Convenções
|
|
191
106
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
- Templates com Blade
|
|
196
|
-
- Padrões avançados
|
|
107
|
+
- **Commits:** Conventional Commits (`feat:`, `fix:`, `docs:`, `refactor:`, `chore:`)
|
|
108
|
+
- **Hooks:** Husky + lint-staged validam no pré-commit
|
|
109
|
+
- **Commitlint:** Valida mensagem no commit-msg
|
|
197
110
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
#### Com Claude Code
|
|
201
|
-
|
|
202
|
-
1. Abra seu projeto wp-kit no Claude Code
|
|
203
|
-
2. Use `/` para ver os skills disponíveis
|
|
204
|
-
3. Procure por "sage", "vite" ou "acf"
|
|
205
|
-
4. Clique para acessar o skill
|
|
206
|
-
|
|
207
|
-
#### Busca Direta
|
|
208
|
-
|
|
209
|
-
```
|
|
210
|
-
/building-sage-themes → Desenvolvimento de temas
|
|
211
|
-
/optimizing-vite-builds → Otimização de assets
|
|
212
|
-
/developing-acf-blocks → Blocos Gutenberg
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
### Estrutura de Skills
|
|
216
|
-
|
|
217
|
-
Cada skill segue um padrão progressivo:
|
|
218
|
-
|
|
219
|
-
- **SKILL.md** — Quick start em 2-3 minutos
|
|
220
|
-
- **Decision Trees** — Guias "qual ferramenta usar?"
|
|
221
|
-
- **Reference Files** — Documentação completa com exemplos
|
|
222
|
-
- **150+ Exemplos** — Código pronto para copiar/colar
|
|
223
|
-
|
|
224
|
-
### Futuro
|
|
111
|
+
## Contribuição
|
|
225
112
|
|
|
226
|
-
|
|
113
|
+
Pull Requests são bem-vindos. Use commits convencionais, mudanças pequenas e atualize a documentação quando alterar comportamentos.
|
|
227
114
|
|
|
228
|
-
|
|
229
|
-
- ⏳ Cursor (em desenvolvimento)
|
|
230
|
-
- ⏳ VSCode AI Assistant (em desenvolvimento)
|
|
231
|
-
- ⏳ Plugin customizado (roadmap futuro)
|
|
115
|
+
→ Guia completo: [docs/06-Contribuicao.md](docs/06-Contribuicao.md)
|
|
232
116
|
|
|
233
117
|
---
|
|
234
118
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
Pull Requests são muito bem-vindos! Use commits convencionais, escreva mudanças pequenas e inclua atualizações na documentação quando necessário.
|
|
238
|
-
|
|
239
|
-
—
|
|
240
|
-
Se quiser entender a fundo (arquitetura, módulos e CI dinâmico), veja a wiki em `docs/` deste repositório.
|
|
119
|
+
Para entender a fundo a arquitetura, módulos e CI dinâmico: [docs/](docs/)
|
|
@@ -84,6 +84,23 @@ export function inferCiCapabilities(context) {
|
|
|
84
84
|
node: hasNode,
|
|
85
85
|
sage: hasSage,
|
|
86
86
|
},
|
|
87
|
+
lint: {
|
|
88
|
+
sage:
|
|
89
|
+
hasSage &&
|
|
90
|
+
Boolean(context.enable_lint) &&
|
|
91
|
+
(context.sage_lint_eslint !== false ||
|
|
92
|
+
context.sage_lint_pint !== false ||
|
|
93
|
+
context.sage_lint_stylelint !== false),
|
|
94
|
+
mu_plugin: Boolean(context.enable_mu_plugin && context.enable_lint),
|
|
95
|
+
plugin: Boolean(context.enable_plugin && context.enable_lint),
|
|
96
|
+
blank_theme: Boolean(context.enable_blank_theme && context.enable_lint),
|
|
97
|
+
any:
|
|
98
|
+
Boolean(context.enable_lint) &&
|
|
99
|
+
(hasSage ||
|
|
100
|
+
Boolean(context.enable_mu_plugin) ||
|
|
101
|
+
Boolean(context.enable_plugin) ||
|
|
102
|
+
Boolean(context.enable_blank_theme)),
|
|
103
|
+
},
|
|
87
104
|
deploy: {
|
|
88
105
|
docker: context.deploy_strategy === 'docker',
|
|
89
106
|
},
|
package/lib/prompts/index.js
CHANGED
|
@@ -74,6 +74,18 @@ export async function runPrompts({ defaults = false } = {}) {
|
|
|
74
74
|
message: 'Enable debug mode?',
|
|
75
75
|
default: false,
|
|
76
76
|
},
|
|
77
|
+
{
|
|
78
|
+
type: 'checkbox',
|
|
79
|
+
name: 'selectedContentModules',
|
|
80
|
+
message: 'Selecione os módulos de conteúdo do projeto:',
|
|
81
|
+
choices: [
|
|
82
|
+
{ name: 'Sage theme (Roots + Acorn + Vite)', value: 'sage' },
|
|
83
|
+
{ name: 'Blank theme (Vite + SCSS, sem Sage)', value: 'blank-theme' },
|
|
84
|
+
{ name: 'MU Plugin scaffold', value: 'mu-plugin' },
|
|
85
|
+
{ name: 'Plugin scaffold', value: 'plugin' },
|
|
86
|
+
],
|
|
87
|
+
default: ['sage'],
|
|
88
|
+
},
|
|
77
89
|
];
|
|
78
90
|
|
|
79
91
|
const modulePromptDefs = await loadModulePrompts();
|
|
@@ -85,12 +97,53 @@ export async function runPrompts({ defaults = false } = {}) {
|
|
|
85
97
|
for (const prompt of allPrompts) {
|
|
86
98
|
if (prompt.when && !prompt.when(defaultAnswers)) continue;
|
|
87
99
|
const def = prompt.default;
|
|
88
|
-
defaultAnswers[prompt.name] = typeof def === 'function' ? def() : def;
|
|
100
|
+
defaultAnswers[prompt.name] = typeof def === 'function' ? def(defaultAnswers) : def;
|
|
89
101
|
}
|
|
90
102
|
|
|
103
|
+
const sel = defaultAnswers.selectedContentModules || [];
|
|
104
|
+
defaultAnswers.enable_sage = sel.includes('sage');
|
|
105
|
+
defaultAnswers.enable_blank_theme = sel.includes('blank-theme');
|
|
106
|
+
defaultAnswers.enable_mu_plugin = sel.includes('mu-plugin');
|
|
107
|
+
defaultAnswers.enable_plugin = sel.includes('plugin');
|
|
108
|
+
|
|
109
|
+
// WP_KIT_ENABLE_SAGE: legacy single-module override. Use WP_KIT_CONTENT_MODULES for full control.
|
|
91
110
|
const envEnableSage = parseBooleanEnv(process.env.WP_KIT_ENABLE_SAGE);
|
|
92
|
-
if (envEnableSage !== null) {
|
|
111
|
+
if (envEnableSage !== null && process.env.WP_KIT_CONTENT_MODULES === undefined) {
|
|
93
112
|
defaultAnswers.enable_sage = envEnableSage;
|
|
113
|
+
// Sync selectedContentModules with env override
|
|
114
|
+
if (envEnableSage) {
|
|
115
|
+
defaultAnswers.selectedContentModules = [
|
|
116
|
+
...new Set([...(defaultAnswers.selectedContentModules || []), 'sage']),
|
|
117
|
+
];
|
|
118
|
+
} else {
|
|
119
|
+
defaultAnswers.selectedContentModules = (
|
|
120
|
+
defaultAnswers.selectedContentModules || []
|
|
121
|
+
).filter((m) => m !== 'sage');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// WP_KIT_CONTENT_MODULES: comma-separated list that fully overrides selectedContentModules.
|
|
126
|
+
// Use empty string to select no content modules. Takes precedence over WP_KIT_ENABLE_SAGE.
|
|
127
|
+
// Example: WP_KIT_CONTENT_MODULES="sage,blank-theme"
|
|
128
|
+
const envContentModules = process.env.WP_KIT_CONTENT_MODULES;
|
|
129
|
+
if (envContentModules !== undefined) {
|
|
130
|
+
const modules = envContentModules
|
|
131
|
+
? envContentModules
|
|
132
|
+
.split(',')
|
|
133
|
+
.map((m) => m.trim())
|
|
134
|
+
.filter(Boolean)
|
|
135
|
+
: [];
|
|
136
|
+
defaultAnswers.selectedContentModules = modules;
|
|
137
|
+
defaultAnswers.enable_sage = modules.includes('sage');
|
|
138
|
+
defaultAnswers.enable_blank_theme = modules.includes('blank-theme');
|
|
139
|
+
defaultAnswers.enable_mu_plugin = modules.includes('mu-plugin');
|
|
140
|
+
defaultAnswers.enable_plugin = modules.includes('plugin');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// WP_KIT_PROJECT_NAME: overrides the default project name (used for E2E tests).
|
|
144
|
+
const envProjectName = process.env.WP_KIT_PROJECT_NAME;
|
|
145
|
+
if (envProjectName) {
|
|
146
|
+
defaultAnswers.projectName = envProjectName;
|
|
94
147
|
}
|
|
95
148
|
|
|
96
149
|
const envGitProvider = process.env.WP_KIT_GIT_PROVIDER;
|
|
@@ -99,7 +152,7 @@ export async function runPrompts({ defaults = false } = {}) {
|
|
|
99
152
|
}
|
|
100
153
|
|
|
101
154
|
const enabledModules = Object.keys(modulePromptDefs).filter(
|
|
102
|
-
(mod) => defaultAnswers[`enable_${mod}`] === true
|
|
155
|
+
(mod) => defaultAnswers[`enable_${mod.replace(/-/g, '_')}`] === true
|
|
103
156
|
);
|
|
104
157
|
return {
|
|
105
158
|
...defaultAnswers,
|
|
@@ -113,8 +166,15 @@ export async function runPrompts({ defaults = false } = {}) {
|
|
|
113
166
|
|
|
114
167
|
const answers = await inquirer.prompt(allPrompts);
|
|
115
168
|
|
|
169
|
+
// Derive enable_* flags from the checkbox selection
|
|
170
|
+
const sel = answers.selectedContentModules || [];
|
|
171
|
+
answers.enable_sage = sel.includes('sage');
|
|
172
|
+
answers.enable_blank_theme = sel.includes('blank-theme');
|
|
173
|
+
answers.enable_mu_plugin = sel.includes('mu-plugin');
|
|
174
|
+
answers.enable_plugin = sel.includes('plugin');
|
|
175
|
+
|
|
116
176
|
const enabledModules = Object.keys(modulePromptDefs).filter(
|
|
117
|
-
(mod) => answers[`enable_${mod}`] === true
|
|
177
|
+
(mod) => answers[`enable_${mod.replace(/-/g, '_')}`] === true
|
|
118
178
|
);
|
|
119
179
|
return {
|
|
120
180
|
...answers,
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
|
|
5
|
+
import { log, color } from '../../lib/utils/logger.js';
|
|
6
|
+
|
|
7
|
+
export async function setupModule(context, generator) {
|
|
8
|
+
const themeName = context.blank_theme_name || `${context.projectName}-theme`;
|
|
9
|
+
const themeDir = `content/themes/${themeName}`;
|
|
10
|
+
const absoluteThemeDir = path.join(generator.cwd, themeDir);
|
|
11
|
+
|
|
12
|
+
log(color.blue, `[blank-theme] 📂 Scaffolding blank theme: ${themeDir}`);
|
|
13
|
+
|
|
14
|
+
// 1. Ensure directories exist
|
|
15
|
+
await fs.ensureDir(path.join(absoluteThemeDir, 'src', 'js'));
|
|
16
|
+
await fs.ensureDir(path.join(absoluteThemeDir, 'src', 'scss'));
|
|
17
|
+
await fs.ensureDir(path.join(absoluteThemeDir, 'php'));
|
|
18
|
+
|
|
19
|
+
// 2. Generate static files
|
|
20
|
+
await generator.generateFile(
|
|
21
|
+
'style.css',
|
|
22
|
+
{ ...context, blank_theme_name: themeName },
|
|
23
|
+
'blank-theme',
|
|
24
|
+
`${themeDir}/style.css`
|
|
25
|
+
);
|
|
26
|
+
await generator.generateFile(
|
|
27
|
+
'functions.php',
|
|
28
|
+
{ ...context, blank_theme_name: themeName },
|
|
29
|
+
'blank-theme',
|
|
30
|
+
`${themeDir}/functions.php`
|
|
31
|
+
);
|
|
32
|
+
await generator.generateFile(
|
|
33
|
+
'vite.config.js',
|
|
34
|
+
{ ...context, blank_theme_name: themeName },
|
|
35
|
+
'blank-theme',
|
|
36
|
+
`${themeDir}/vite.config.js`
|
|
37
|
+
);
|
|
38
|
+
await generator.generateFile(
|
|
39
|
+
'package.json',
|
|
40
|
+
{ ...context, blank_theme_name: themeName },
|
|
41
|
+
'blank-theme',
|
|
42
|
+
`${themeDir}/package.json`
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
// 3. src/ scaffolds
|
|
46
|
+
await fs.ensureFile(path.join(absoluteThemeDir, 'src', 'js', 'app.js'));
|
|
47
|
+
await fs.ensureFile(path.join(absoluteThemeDir, 'src', 'scss', 'app.scss'));
|
|
48
|
+
|
|
49
|
+
// 4. Lint configs co-located in theme — always installed (IDE/editor support)
|
|
50
|
+
log(color.blue, '[blank-theme] 🔧 Installing lint configurations...');
|
|
51
|
+
await generator.copyFile('lint/.prettierrc.json', 'blank-theme', `${themeDir}/.prettierrc.json`);
|
|
52
|
+
if (context.blank_theme_lint_eslint !== false) {
|
|
53
|
+
await generator.copyFile(
|
|
54
|
+
'lint/eslint.config.mjs',
|
|
55
|
+
'blank-theme',
|
|
56
|
+
`${themeDir}/eslint.config.mjs`
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
if (context.blank_theme_lint_pint !== false) {
|
|
60
|
+
await generator.copyFile('lint/pint.json', 'blank-theme', `${themeDir}/pint.json`);
|
|
61
|
+
}
|
|
62
|
+
if (context.blank_theme_lint_stylelint !== false) {
|
|
63
|
+
await generator.copyFile(
|
|
64
|
+
'lint/.stylelintrc.json',
|
|
65
|
+
'blank-theme',
|
|
66
|
+
`${themeDir}/.stylelintrc.json`
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
log(color.green, `[blank-theme] ✅ Blank theme scaffolded: ${themeDir}`);
|
|
71
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"semi": true,
|
|
3
|
+
"singleQuote": true,
|
|
4
|
+
"trailingComma": "es5",
|
|
5
|
+
"printWidth": 100,
|
|
6
|
+
"tabWidth": 2,
|
|
7
|
+
"overrides": [
|
|
8
|
+
{ "files": "*.blade.php", "options": { "parser": "html" } },
|
|
9
|
+
{ "files": "*.vue", "options": { "parser": "vue" } },
|
|
10
|
+
{ "files": "*.scss", "options": { "singleQuote": false } }
|
|
11
|
+
]
|
|
12
|
+
}
|
|
@@ -5,17 +5,11 @@ import globals from 'globals';
|
|
|
5
5
|
|
|
6
6
|
export default [
|
|
7
7
|
{
|
|
8
|
-
ignores: [
|
|
9
|
-
'**/node_modules/**',
|
|
10
|
-
'**/vendor/**',
|
|
11
|
-
'**/wp/**',
|
|
12
|
-
'**/public/build/**',
|
|
13
|
-
'**/dist/**',
|
|
14
|
-
'eslint.config.mjs',
|
|
15
|
-
],
|
|
8
|
+
ignores: ['node_modules/**', 'vendor/**', 'dist/**'],
|
|
16
9
|
},
|
|
17
10
|
js.configs.recommended,
|
|
18
11
|
{
|
|
12
|
+
files: ['src/js/**/*.{js,mjs,ts}'],
|
|
19
13
|
languageOptions: {
|
|
20
14
|
ecmaVersion: 2022,
|
|
21
15
|
sourceType: 'module',
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export default [
|
|
2
|
+
{
|
|
3
|
+
type: 'input',
|
|
4
|
+
name: 'blank_theme_name',
|
|
5
|
+
message: 'Blank theme slug (used as directory name):',
|
|
6
|
+
default: (answers) => `${answers.projectName || 'wordpress'}-theme`,
|
|
7
|
+
when: (answers) => answers.selectedContentModules?.includes('blank-theme'),
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
type: 'confirm',
|
|
11
|
+
name: 'blank_theme_lint_eslint',
|
|
12
|
+
message: 'Blank Theme: enable ESLint for JS/TS?',
|
|
13
|
+
default: true,
|
|
14
|
+
when: (answers) =>
|
|
15
|
+
answers.selectedContentModules?.includes('blank-theme') && answers.enable_lint,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
type: 'confirm',
|
|
19
|
+
name: 'blank_theme_lint_stylelint',
|
|
20
|
+
message: 'Blank Theme: enable Stylelint for CSS/SCSS?',
|
|
21
|
+
default: true,
|
|
22
|
+
when: (answers) =>
|
|
23
|
+
answers.selectedContentModules?.includes('blank-theme') && answers.enable_lint,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
type: 'confirm',
|
|
27
|
+
name: 'blank_theme_lint_pint',
|
|
28
|
+
message: 'Blank Theme: enable Pint for PHP?',
|
|
29
|
+
default: true,
|
|
30
|
+
when: (answers) =>
|
|
31
|
+
answers.selectedContentModules?.includes('blank-theme') && answers.enable_lint,
|
|
32
|
+
},
|
|
33
|
+
];
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
tooling:
|
|
2
|
+
bt-dev:
|
|
3
|
+
service: build
|
|
4
|
+
description: Run Vite dev server for blank theme
|
|
5
|
+
cmd: npm run dev --prefix /app/content/themes/{{blank_theme_name}}
|
|
6
|
+
bt-build:
|
|
7
|
+
service: build
|
|
8
|
+
description: Build blank theme assets
|
|
9
|
+
cmd: npm run build --prefix /app/content/themes/{{blank_theme_name}}
|
|
10
|
+
{{#if enable_lint}}
|
|
11
|
+
bt-eslint:
|
|
12
|
+
service: build
|
|
13
|
+
description: Lint JS/TS in blank theme
|
|
14
|
+
cmd: npx eslint --fix src/js/ --config /app/content/themes/{{blank_theme_name}}/eslint.config.mjs
|
|
15
|
+
dir: /app/content/themes/{{blank_theme_name}}
|
|
16
|
+
bt-stylelint:
|
|
17
|
+
service: build
|
|
18
|
+
description: Lint CSS/SCSS in blank theme
|
|
19
|
+
cmd: npx stylelint --fix "src/scss/**/*.scss" --config /app/content/themes/{{blank_theme_name}}/.stylelintrc.json
|
|
20
|
+
dir: /app/content/themes/{{blank_theme_name}}
|
|
21
|
+
bt-pint:
|
|
22
|
+
service: appserver
|
|
23
|
+
description: Lint PHP in blank theme
|
|
24
|
+
dir: /app/content/themes/{{blank_theme_name}}
|
|
25
|
+
cmd: ./vendor/bin/pint
|
|
26
|
+
{{/if}}
|