feedback-collector 0.1.0 → 0.2.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 +99 -106
- package/dist/api.d.ts +49 -0
- package/dist/api.js +24 -0
- package/dist/api.js.map +1 -0
- package/dist/feedback-collector.js +24 -0
- package/dist/feedback-collector.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/docs/decisoes.md +87 -0
- package/docs/integracao-compiler-futura.md +56 -0
- package/package.json +36 -8
- package/skills/feedback-collector-setup/SKILL.md +130 -87
- package/src/feedback-collector.js +23 -461
- package/src/index.d.ts +0 -6
- package/src/index.js +0 -14
|
@@ -3,42 +3,38 @@ name: feedback-collector-setup
|
|
|
3
3
|
description: >
|
|
4
4
|
Instala, configura ou remove o feedback-collector (picker visual ALT+clique →
|
|
5
5
|
backlog markdown com arquivo:linha) em um projeto front-end. Use quando o
|
|
6
|
-
usuário pedir para
|
|
7
|
-
feedback
|
|
8
|
-
|
|
9
|
-
collector, visual feedback picker). Cobre Next.js (webpack), Vite e sites sem
|
|
10
|
-
build; inclui o caveat de React 19 e o gate para uso em produção.
|
|
6
|
+
usuário pedir para instalar, adicionar, configurar, controlar ou remover o
|
|
7
|
+
feedback-collector. Cobre Next.js (webpack), Vite e sites sem build; inclui
|
|
8
|
+
ciclo de vida v0.2, migração local, caveat de React 19 e gate de produção.
|
|
11
9
|
---
|
|
12
10
|
|
|
13
11
|
# feedback-collector: instalar e remover
|
|
14
12
|
|
|
15
|
-
O package `feedback-collector` é
|
|
16
|
-
|
|
17
|
-
backlog markdown com `arquivo:linha` para colar em um agente de código. A
|
|
18
|
-
instalação tem DUAS partes independentes:
|
|
13
|
+
O package `feedback-collector` é client-side, vanilla, sem backend e sem
|
|
14
|
+
dependências de runtime. A instalação tem duas partes independentes:
|
|
19
15
|
|
|
20
|
-
1. **
|
|
21
|
-
2. **
|
|
22
|
-
`data-inspector-{relative-path,line,column}` no JSX. É a parte com decisões.
|
|
16
|
+
1. **Runtime:** picker, painel, fila local e export.
|
|
17
|
+
2. **Source mapping:** plugin de build que injeta `data-inspector-*` no JSX.
|
|
23
18
|
|
|
24
|
-
Antes de
|
|
25
|
-
|
|
26
|
-
|
|
19
|
+
Antes de editar, detecte framework, bundler, versão do React, package manager,
|
|
20
|
+
se o app usa SSR e se o usuário quer uso apenas em dev ou também em produção.
|
|
21
|
+
No Next, confirme se `dev` usa webpack ou `--turbopack`.
|
|
27
22
|
|
|
28
|
-
## Parte 1 —
|
|
23
|
+
## Parte 1 — runtime
|
|
29
24
|
|
|
30
25
|
```bash
|
|
31
|
-
npm i -D feedback-collector
|
|
26
|
+
npm i -D feedback-collector
|
|
32
27
|
```
|
|
33
28
|
|
|
34
|
-
|
|
29
|
+
### Modo compatível: auto-mount
|
|
30
|
+
|
|
31
|
+
O import raiz injeta o picker como side effect, como na v0.1:
|
|
35
32
|
|
|
36
33
|
```tsx
|
|
37
|
-
|
|
38
|
-
"use client"; // (Next App Router)
|
|
34
|
+
"use client";
|
|
39
35
|
import { useEffect } from "react";
|
|
40
36
|
|
|
41
|
-
export function
|
|
37
|
+
export function FeedbackCollectorLoader() {
|
|
42
38
|
useEffect(() => {
|
|
43
39
|
void import("feedback-collector");
|
|
44
40
|
}, []);
|
|
@@ -46,39 +42,79 @@ export function FeedbackCollector() {
|
|
|
46
42
|
}
|
|
47
43
|
```
|
|
48
44
|
|
|
49
|
-
|
|
45
|
+
### Modo controlado: mount/destroy
|
|
46
|
+
|
|
47
|
+
Use o entry sem auto-inicialização quando o app precisa ativar/desativar o
|
|
48
|
+
collector durante sua vida útil:
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
"use client";
|
|
52
|
+
import { useEffect } from "react";
|
|
53
|
+
|
|
54
|
+
export function FeedbackCollectorLoader() {
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
let dispose: (() => void) | undefined;
|
|
57
|
+
void import("feedback-collector/api").then(({ mount, destroy }) => {
|
|
58
|
+
mount();
|
|
59
|
+
dispose = destroy;
|
|
60
|
+
});
|
|
61
|
+
return () => dispose?.();
|
|
62
|
+
}, []);
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
```
|
|
50
66
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
-
|
|
54
|
-
picker contra dados reais de prod, renderize num layout autenticado
|
|
55
|
-
condicionado ao papel do usuário (ex.: `{isOwner && <FeedbackCollector />}`).
|
|
56
|
-
O script só lê o DOM que o próprio usuário já vê (não é vetor de vazamento),
|
|
57
|
-
mas usuários comuns NÃO devem ver o painel. O gate server-side também evita
|
|
58
|
-
que o chunk seja baixado por quem não usa.
|
|
67
|
+
`mount()` é idempotente e devolve o controller ativo. `destroy()` remove DOM e
|
|
68
|
+
listeners, mas mantém a fila no storage. O entry raiz também exporta os métodos,
|
|
69
|
+
porém auto-monta; para controle explícito prefira `feedback-collector/api`.
|
|
59
70
|
|
|
60
|
-
|
|
61
|
-
(ou copie o arquivo). O entry `feedback-collector/script` aponta pro IIFE cru.
|
|
71
|
+
### Gate de ambiente/usuário
|
|
62
72
|
|
|
63
|
-
|
|
73
|
+
- **Só dev (padrão seguro):** renderize o loader apenas quando
|
|
74
|
+
`NODE_ENV === "development"`.
|
|
75
|
+
- **Produção com dados reais:** renderize server-side apenas para papel
|
|
76
|
+
autorizado (owner/admin). Usuários comuns não devem baixar o chunk nem ver o
|
|
77
|
+
painel. O gate do runtime não protege os paths injetados pelo plugin: esses
|
|
78
|
+
podem ficar em chunks públicos.
|
|
64
79
|
|
|
65
|
-
|
|
66
|
-
do script não funciona em React 19 — sem plugin de build, os itens saem SEM
|
|
67
|
-
arquivo:linha (o resto funciona: seletor, styles, HTML). Em React ≤18 o fallback
|
|
68
|
-
existe, mas o plugin ainda é mais confiável.
|
|
80
|
+
### Site sem build
|
|
69
81
|
|
|
70
|
-
|
|
82
|
+
Copie `node_modules/feedback-collector/dist/feedback-collector.js` para os
|
|
83
|
+
assets e carregue como `<script>`. O export `feedback-collector/script` aponta
|
|
84
|
+
para esse IIFE e a API fica em `window.FeedbackCollector`.
|
|
85
|
+
|
|
86
|
+
`node_modules/feedback-collector/src/feedback-collector.js` continua publicado
|
|
87
|
+
temporariamente para instalações v0.1 que acessavam o arquivo direto, mas não
|
|
88
|
+
deve ser usado em novas integrações.
|
|
89
|
+
|
|
90
|
+
## Persistência v0.2
|
|
91
|
+
|
|
92
|
+
A fila atual usa `__fbc_state_v2` (`{ version: 2, items: [...] }`). Na primeira
|
|
93
|
+
montagem, o runtime migra o array `__fbc_items_v1` sem alterar os itens e sem
|
|
94
|
+
apagar a chave antiga. Não crie scripts de migração no projeto consumidor e não
|
|
95
|
+
limpe essas chaves durante upgrade ou remoção, salvo pedido explícito do usuário.
|
|
96
|
+
|
|
97
|
+
## Parte 2 — source mapping
|
|
98
|
+
|
|
99
|
+
**React 19 removeu `_debugSource` do fiber.** Sem plugin, os itens não terão
|
|
100
|
+
arquivo:linha; seletor, styles, HTML e export continuam funcionando. Em React
|
|
101
|
+
18 ou anterior há fallback legado, mas os atributos ainda são mais confiáveis.
|
|
102
|
+
|
|
103
|
+
O runtime lê `data-inspector-relative-path`, `data-inspector-line`,
|
|
104
|
+
`data-inspector-column` e a alternativa `data-source="arquivo:linha:coluna"`.
|
|
105
|
+
|
|
106
|
+
### Next.js com webpack (validado em Next 15 + React 19)
|
|
71
107
|
|
|
72
108
|
```bash
|
|
73
109
|
npm i -D @react-dev-inspector/babel-plugin babel-loader @babel/core @babel/preset-typescript @babel/plugin-syntax-jsx
|
|
74
110
|
```
|
|
75
111
|
|
|
76
|
-
|
|
77
|
-
pre-pass
|
|
112
|
+
Não crie `.babelrc`: isso desliga o SWC do projeto inteiro. Adicione apenas um
|
|
113
|
+
pre-pass no `next.config.ts`:
|
|
78
114
|
|
|
79
115
|
```ts
|
|
80
116
|
webpack: (config, { dev }) => {
|
|
81
|
-
if (dev) {
|
|
117
|
+
if (dev) {
|
|
82
118
|
config.module.rules.unshift({
|
|
83
119
|
test: /\.(jsx|tsx)$/,
|
|
84
120
|
exclude: /node_modules/,
|
|
@@ -86,10 +122,14 @@ webpack: (config, { dev }) => {
|
|
|
86
122
|
use: [{
|
|
87
123
|
loader: "babel-loader",
|
|
88
124
|
options: {
|
|
89
|
-
babelrc: false,
|
|
125
|
+
babelrc: false,
|
|
126
|
+
configFile: false,
|
|
127
|
+
sourceMaps: false,
|
|
90
128
|
presets: ["@babel/preset-typescript"],
|
|
91
|
-
|
|
92
|
-
|
|
129
|
+
plugins: [
|
|
130
|
+
"@babel/plugin-syntax-jsx",
|
|
131
|
+
"@react-dev-inspector/babel-plugin",
|
|
132
|
+
],
|
|
93
133
|
},
|
|
94
134
|
}],
|
|
95
135
|
});
|
|
@@ -98,66 +138,69 @@ webpack: (config, { dev }) => {
|
|
|
98
138
|
},
|
|
99
139
|
```
|
|
100
140
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
141
|
+
Não passe `isTSX`/`allExtensions`: foram removidos no Babel 8. O loader deve
|
|
142
|
+
rodar em server e client para evitar hydration mismatch. Se o script `dev` usa
|
|
143
|
+
`--turbopack`, o hook `webpack()` não roda; remova a flag ou pare e discuta uma
|
|
144
|
+
alternativa com o usuário.
|
|
145
|
+
|
|
146
|
+
### Next em produção
|
|
104
147
|
|
|
105
|
-
|
|
106
|
-
remover a flag em dev, ou usar `experimental.swcPlugins` (abaixo).
|
|
148
|
+
Remover `if (dev)` é decisão explícita do usuário:
|
|
107
149
|
|
|
108
|
-
|
|
150
|
+
- paths de `src/` entram nos chunks JS públicos;
|
|
151
|
+
- o pre-pass Babel também roda no build e aumenta seu tempo.
|
|
109
152
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
auth) — vazamento de estrutura, severidade baixa mas permanente.
|
|
113
|
-
- O build de produção passa a rodar o pre-pass Babel (mais lento).
|
|
114
|
-
Validado em produção real (Next 15): funciona; documente o trade-off num
|
|
115
|
-
comentário no config.
|
|
153
|
+
Se aprovado, documente esse trade-off ao lado do config. O gate por papel do
|
|
154
|
+
loader não remove os atributos dos chunks públicos.
|
|
116
155
|
|
|
117
|
-
### Vite
|
|
156
|
+
### Vite + React
|
|
118
157
|
|
|
119
158
|
```bash
|
|
120
159
|
npm i -D vite-plugin-react-dev-inspector
|
|
121
160
|
```
|
|
122
|
-
Registre o plugin no `vite.config.ts` ANTES do plugin react (ver docs do
|
|
123
|
-
pacote). Alternativa: `@react-dev-inspector/babel-plugin` via option `babel`
|
|
124
|
-
do `@vitejs/plugin-react`.
|
|
125
161
|
|
|
126
|
-
|
|
162
|
+
Registre o plugin antes de `@vitejs/plugin-react`. Como alternativa, configure
|
|
163
|
+
`@react-dev-inspector/babel-plugin` na opção `babel` do plugin React.
|
|
164
|
+
|
|
165
|
+
### Alternativa SWC atual
|
|
127
166
|
|
|
128
|
-
`experimental.swcPlugins`
|
|
129
|
-
`data-source
|
|
130
|
-
|
|
131
|
-
quebram entre versões do `swc_core` do Next. Exige adaptar `getSourceInfo()` no
|
|
132
|
-
script pra ler `data-source` além de `data-inspector-*` (~5 linhas). Só sugira
|
|
133
|
-
se o custo do build Babel for dor explícita.
|
|
167
|
+
`experimental.swcPlugins` + `swc-plugin-react-source-string` injeta
|
|
168
|
+
`data-source`. Continua experimental e sensível à versão de `swc_core`; só use
|
|
169
|
+
se o custo do Babel for uma dor explícita e após aprovação do usuário.
|
|
134
170
|
|
|
135
171
|
### Vue / Svelte
|
|
136
172
|
|
|
137
|
-
|
|
138
|
-
|
|
173
|
+
O runtime é agnóstico, mas uma integração de compiler validada ainda não faz
|
|
174
|
+
parte do package. Não adicione adapters novos automaticamente nesta etapa.
|
|
139
175
|
|
|
140
|
-
## Verificação
|
|
176
|
+
## Verificação obrigatória
|
|
141
177
|
|
|
142
|
-
1.
|
|
143
|
-
2.
|
|
144
|
-
`grep -o 'data-inspector-relative-path="[^"]*"' | sort -u
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
178
|
+
1. Rode typecheck, lint e build do projeto consumidor.
|
|
179
|
+
2. Confirme no HTML/DOM que existem paths reais:
|
|
180
|
+
`grep -o 'data-inspector-relative-path="[^"]*"' | sort -u`.
|
|
181
|
+
3. Se habilitou em produção, procure `data-inspector` nos chunks gerados.
|
|
182
|
+
4. No navegador, confirme o log `[feedback-collector] ativo`, ALT+hover com
|
|
183
|
+
source, ALT+clique, edição e “Copiar backlog”.
|
|
184
|
+
5. Se atualizou da v0.1 com itens, confirme que o painel restaurou a fila e que
|
|
185
|
+
`__fbc_state_v2` foi criado; não apague `__fbc_items_v1`.
|
|
149
186
|
|
|
150
187
|
## Remoção
|
|
151
188
|
|
|
152
|
-
|
|
189
|
+
Alinhe o nível antes de agir:
|
|
190
|
+
|
|
191
|
+
1. **Desmontar em runtime:** chame `destroy()` ou remova o loader.
|
|
192
|
+
2. **Desligar o painel:** remova o loader; o plugin pode continuar injetando
|
|
193
|
+
atributos.
|
|
194
|
+
3. **Limpar o build:** reponha o gate `if (dev)` ou remova o pre-pass/plugin.
|
|
195
|
+
4. **Remoção total:** remova loader, config e dependências relacionadas.
|
|
196
|
+
|
|
197
|
+
Não apague `__fbc_state_v2` nem `__fbc_items_v1` durante remoção sem autorização
|
|
198
|
+
explícita. Não há banco, backend ou serviço externo a limpar.
|
|
153
199
|
|
|
154
|
-
|
|
155
|
-
pre-pass continua (atributos ainda no bundle).
|
|
156
|
-
2. **Limpar o build:** re-gate o pre-pass com `if (dev)` (ou remova o bloco
|
|
157
|
-
`webpack`) — prod volta a SWC puro, sem paths nos chunks.
|
|
158
|
-
3. **Remoção total:** (1) + (2) + deletar o componente loader +
|
|
159
|
-
`npm rm feedback-collector @react-dev-inspector/babel-plugin babel-loader @babel/core @babel/preset-typescript @babel/plugin-syntax-jsx`
|
|
160
|
-
+ rebuild. Nada toca banco/auth — é tudo client-side + config de build.
|
|
200
|
+
## Integração própria futura
|
|
161
201
|
|
|
162
|
-
|
|
163
|
-
|
|
202
|
+
Não implemente plugin próprio de Next/Vite durante setup de consumidor. O
|
|
203
|
+
desenho futuro deve preservar atributos existentes, ser opt-in, ter builds dev
|
|
204
|
+
e prod explícitos e provar compatibilidade/métricas antes de substituir as
|
|
205
|
+
receitas atuais. A proposta vive em `docs/integracao-compiler-futura.md` no repo
|
|
206
|
+
do package.
|