@luanpdd/kit-mcp 1.34.0 → 1.36.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.
Files changed (118) hide show
  1. package/README.md +1 -1
  2. package/bin/cli.js +2 -2
  3. package/bin/mcp.js +6 -6
  4. package/bin/ui.js +74 -74
  5. package/gates/ai-prompt-stability.md +120 -120
  6. package/gates/budget-description.md +68 -68
  7. package/gates/confidence.md +29 -29
  8. package/gates/dependency-check.md +33 -33
  9. package/gates/dept-cycle-prevention.md +179 -179
  10. package/gates/golden-signals-coverage.md +133 -133
  11. package/gates/legacy-refactor-safety.md +178 -178
  12. package/gates/multi-tenant-rls-coverage.md +102 -102
  13. package/gates/no-personal-uuid.md +72 -72
  14. package/gates/obs-agents-mcp-supabase.md +86 -86
  15. package/gates/obs-skills-frontmatter.md +76 -76
  16. package/gates/observability-coverage.md +151 -151
  17. package/gates/omm-no-regression.md +83 -83
  18. package/gates/postmortem-template-required.md +127 -127
  19. package/gates/prr-checklist-coverage.md +128 -128
  20. package/gates/regression.md +32 -32
  21. package/gates/release-pipeline-policy.md +132 -132
  22. package/gates/secrets-scan.md +33 -33
  23. package/gates/service-role-not-in-user-facing.md +113 -113
  24. package/gates/skill-must-include.md +71 -71
  25. package/gates/sync-idempotent.md +62 -62
  26. package/gates/verify-phase-goal.md +34 -34
  27. package/kit/agents/designer-ui.md +216 -216
  28. package/kit/agents/workflow-generator.md +537 -0
  29. package/kit/commands/adicionar-backlog.md +1 -1
  30. package/kit/commands/adicionar-fase.md +1 -1
  31. package/kit/commands/adicionar-tarefa.md +1 -1
  32. package/kit/commands/auditar-observabilidade.md +103 -103
  33. package/kit/commands/auditar-toil.md +129 -129
  34. package/kit/commands/caracterizar-prompt.md +195 -195
  35. package/kit/commands/criar-workflow.md +158 -0
  36. package/kit/commands/definir-perfil.md +1 -1
  37. package/kit/commands/definir-slo.md +108 -108
  38. package/kit/commands/fio.md +1 -1
  39. package/kit/commands/golden-signals.md +142 -142
  40. package/kit/commands/instrumentar-fase.md +200 -200
  41. package/kit/commands/investigar-producao.md +162 -162
  42. package/kit/commands/observabilidade.md +118 -118
  43. package/kit/commands/postmortem.md +179 -179
  44. package/kit/commands/prr.md +205 -205
  45. package/kit/commands/publicar-rapido.md +207 -207
  46. package/kit/commands/risk-budget.md +220 -220
  47. package/kit/commands/sre.md +230 -230
  48. package/kit/file-manifest.json +5 -2
  49. package/kit/framework/references/output-style.md +22 -22
  50. package/kit/hooks/post-apply-migration.js +199 -199
  51. package/kit/hooks/sidecar-tool-publisher.js +210 -210
  52. package/kit/skills/_shared-dados-distribuidos/glossary.md +224 -224
  53. package/kit/skills/_shared-legacy/glossary.md +389 -389
  54. package/kit/skills/_shared-multi-tenant/glossary.md +186 -186
  55. package/kit/skills/_shared-observability/glossary.md +396 -396
  56. package/kit/skills/_shared-sre/glossary.md +712 -712
  57. package/kit/skills/_shared-supabase/glossary.md +234 -234
  58. package/kit/skills/blameless-postmortems/SKILL.md +340 -340
  59. package/kit/skills/burn-rate-alerting/SKILL.md +258 -258
  60. package/kit/skills/cascading-failures/SKILL.md +311 -311
  61. package/kit/skills/core-analysis-loop/SKILL.md +352 -352
  62. package/kit/skills/distributed-tracing/SKILL.md +362 -362
  63. package/kit/skills/dynamic-workflow-authoring/SKILL.md +327 -0
  64. package/kit/skills/eliminating-toil/SKILL.md +243 -243
  65. package/kit/skills/event-based-slos/SKILL.md +296 -296
  66. package/kit/skills/four-golden-signals/SKILL.md +314 -314
  67. package/kit/skills/hermetic-builds/SKILL.md +323 -323
  68. package/kit/skills/legacy-monster-methods/SKILL.md +444 -444
  69. package/kit/skills/llm-as-dependency/SKILL.md +436 -436
  70. package/kit/skills/load-shedding-graceful-degradation/SKILL.md +396 -396
  71. package/kit/skills/observability-driven-development/SKILL.md +315 -315
  72. package/kit/skills/observability-maturity-model/SKILL.md +222 -222
  73. package/kit/skills/opentelemetry-standard/SKILL.md +351 -351
  74. package/kit/skills/production-readiness-review/SKILL.md +305 -305
  75. package/kit/skills/release-engineering/SKILL.md +367 -367
  76. package/kit/skills/retry-strategies/SKILL.md +372 -372
  77. package/kit/skills/sre-risk-management/SKILL.md +221 -221
  78. package/kit/skills/structured-events/SKILL.md +265 -265
  79. package/kit/skills/supabase-cron-queues/SKILL.md +275 -275
  80. package/kit/skills/supabase-database-functions/SKILL.md +332 -332
  81. package/kit/skills/supabase-declarative-schema/SKILL.md +183 -183
  82. package/kit/skills/supabase-pgvector-rag/SKILL.md +253 -253
  83. package/kit/skills/supabase-postgres-style/SKILL.md +138 -138
  84. package/kit/skills/supabase-storage/SKILL.md +234 -234
  85. package/kit/skills/telemetry-pipelines/SKILL.md +259 -259
  86. package/kit/skills/telemetry-sampling/SKILL.md +256 -256
  87. package/kit/skills/ui-anti-padroes-ia/SKILL.md +261 -261
  88. package/kit/skills/ui-contexto-produto/SKILL.md +248 -248
  89. package/kit/skills/ui-cor-estrategia/SKILL.md +213 -213
  90. package/kit/skills/ui-critica-auditoria/SKILL.md +260 -260
  91. package/kit/skills/ui-motion-funcional/SKILL.md +264 -264
  92. package/kit/skills/ui-ritmo-espacial/SKILL.md +259 -259
  93. package/kit/skills/ui-tipografia/SKILL.md +211 -211
  94. package/package.json +1 -1
  95. package/src/cli/index.js +1114 -1114
  96. package/src/cli/render.js +194 -194
  97. package/src/cli/upgrade-check.js +135 -135
  98. package/src/core/error-redaction.js +76 -76
  99. package/src/core/failures.js +153 -153
  100. package/src/core/gate-runner.js +205 -205
  101. package/src/core/gates.js +82 -82
  102. package/src/core/logger.js +170 -170
  103. package/src/core/manifest-verify.js +174 -174
  104. package/src/core/metrics.js +268 -268
  105. package/src/core/notify.js +60 -60
  106. package/src/core/path-safety.js +141 -141
  107. package/src/core/replays.js +120 -120
  108. package/src/core/ui.js +185 -185
  109. package/src/mcp-server/install.js +149 -149
  110. package/src/mcp-server/roots.js +124 -124
  111. package/src/ui/auto-spawn.js +113 -113
  112. package/src/ui/browser.js +78 -78
  113. package/src/ui/client.js +130 -130
  114. package/src/ui/events.js +65 -65
  115. package/src/ui/lockfile.js +191 -191
  116. package/src/ui/port.js +67 -67
  117. package/src/ui/server.js +547 -547
  118. package/src/ui/wrapper.js +129 -129
@@ -1,133 +1,133 @@
1
- ---
2
- id: golden-signals-coverage
3
- stage: pre-verify
4
- blocking: true
5
- description: Valida que código de serviço/Edge Function tocado em fase contém os 4 golden signals (Latency=histogram, Traffic=counter, Errors=counter, Saturation=gauge). Skip se fase só toca markdown.
6
- ---
7
-
8
- # Golden signals coverage gate
9
-
10
- **When to run:** pre-verify (blocking — fase não verifica até cobertura completa).
11
-
12
- ## Check
13
-
14
- ```bash
15
- #!/usr/bin/env bash
16
- # PT-BR: validar que código de serviço/Edge Function tocado em fase tem 4 golden signals.
17
- # Estratégia: descobrir arquivos tocados (supabase/functions/** ou STATE.md current_phase code paths),
18
- # rodar grep por histogram/counter/gauge/saturation, contar matches por sinal.
19
- # Bash 3.2-portable (macOS default).
20
- set -e
21
-
22
- # PT-BR: identificar fase atual via STATE.md
23
- STATE_FILE=".planning/STATE.md"
24
- CURRENT_PHASE=""
25
- if [ -f "$STATE_FILE" ]; then
26
- CURRENT_PHASE=$(grep -E "^Fase:" "$STATE_FILE" 2>/dev/null | head -1 | sed -E 's/^Fase: *([0-9]+).*/\1/')
27
- fi
28
-
29
- # PT-BR: candidatos a arquivos de código tocados — escopo principal Supabase Edge + qualquer .ts/.js/.py
30
- # em paths declarados pela fase (heurística: supabase/functions/** SEMPRE inspecionado).
31
- CODE_FILES=""
32
- if [ -d "supabase/functions" ]; then
33
- CODE_FILES=$(find supabase/functions -type f \( -name "*.ts" -o -name "*.js" -o -name "*.mjs" \) 2>/dev/null)
34
- fi
35
-
36
- # PT-BR: também inspecionar lib/ e src/ se existirem (apps Node/Deno fora de Supabase)
37
- if [ -d "src" ]; then
38
- ADDITIONAL=$(find src -type f \( -name "*.ts" -o -name "*.js" -o -name "*.mjs" -o -name "*.py" \) 2>/dev/null)
39
- CODE_FILES="$CODE_FILES
40
- $ADDITIONAL"
41
- fi
42
- if [ -d "lib" ]; then
43
- ADDITIONAL=$(find lib -type f \( -name "*.ts" -o -name "*.js" -o -name "*.mjs" -o -name "*.py" \) 2>/dev/null)
44
- CODE_FILES="$CODE_FILES
45
- $ADDITIONAL"
46
- fi
47
-
48
- # PT-BR: filtrar linhas vazias
49
- CODE_FILES=$(echo "$CODE_FILES" | grep -v "^$" || true)
50
-
51
- # PT-BR: se fase não toca código (só markdown/docs), pular gate
52
- if [ -z "$CODE_FILES" ]; then
53
- echo "INFO: nenhum arquivo de código (.ts/.js/.py) encontrado em supabase/functions/** | src/** | lib/** — fase parece content-only. Gate skipped."
54
- exit 0
55
- fi
56
-
57
- # PT-BR: contar matches por signal
58
- LATENCY_HITS=0
59
- TRAFFIC_HITS=0
60
- ERRORS_HITS=0
61
- SATURATION_HITS=0
62
-
63
- # PT-BR: process file list line-by-line para portabilidade bash 3.2
64
- OLDIFS="$IFS"
65
- IFS='
66
- '
67
- for f in $CODE_FILES; do
68
- [ -z "$f" ] && continue
69
- [ ! -f "$f" ] && continue
70
-
71
- # PT-BR: Latency = histogram (createHistogram, recordHistogram, histogram.record)
72
- if grep -qE "histogram|Histogram" "$f" 2>/dev/null; then
73
- LATENCY_HITS=$((LATENCY_HITS + 1))
74
- fi
75
-
76
- # PT-BR: Traffic + Errors = counter (Errors counter dimensionado por error.type)
77
- if grep -qE "counter|Counter|createCounter" "$f" 2>/dev/null; then
78
- TRAFFIC_HITS=$((TRAFFIC_HITS + 1))
79
- ERRORS_HITS=$((ERRORS_HITS + 1))
80
- fi
81
-
82
- # PT-BR: Saturation = gauge (createObservableGauge, gauge.record) ou string saturation
83
- if grep -qE "gauge|Gauge|saturation|Saturation" "$f" 2>/dev/null; then
84
- SATURATION_HITS=$((SATURATION_HITS + 1))
85
- fi
86
- done
87
- IFS="$OLDIFS"
88
-
89
- # PT-BR: gate passa se TODOS os 4 signals têm pelo menos 1 hit em algum arquivo de código
90
- MISSING=""
91
- [ "$LATENCY_HITS" -eq 0 ] && MISSING="$MISSING Latency(histogram)"
92
- [ "$TRAFFIC_HITS" -eq 0 ] && MISSING="$MISSING Traffic(counter)"
93
- [ "$ERRORS_HITS" -eq 0 ] && MISSING="$MISSING Errors(counter)"
94
- [ "$SATURATION_HITS" -eq 0 ] && MISSING="$MISSING Saturation(gauge)"
95
-
96
- if [ -z "$MISSING" ]; then
97
- echo "PASS: 4 golden signals cobertos em código (Latency=$LATENCY_HITS files / Traffic=$TRAFFIC_HITS / Errors=$ERRORS_HITS / Saturation=$SATURATION_HITS)"
98
- exit 0
99
- else
100
- echo "FAIL: golden signals ausentes em código tocado:$MISSING"
101
- echo "Sugestão: rodar /sre golden-signals <service> ou /golden-signals para gerar instrumentação OTel canônica."
102
- echo "Cross-ref: kit/skills/four-golden-signals/SKILL.md + kit/agents/golden-signals-instrumenter.md"
103
- exit 1
104
- fi
105
- ```
106
-
107
- ## Verdict
108
-
109
- - **passed** — todos 4 signals (Latency / Traffic / Errors / Saturation) presentes em pelo menos 1 arquivo de código no projeto
110
- - **passed (skip)** — projeto não tem código (apenas markdown / docs); gate não aplicável
111
- - **block** — pelo menos 1 signal ausente em código tocado pela fase
112
-
113
- ## Why
114
-
115
- O livro Google SRE (cap 6 — *Monitoring Distributed Systems*) define os **4 golden signals** como cobertura mínima universal de saúde operacional para serviços user-facing — Latency (histogram com percentis, success vs error separados), Traffic (counter por endpoint × method), Errors (counter por `error.type` enum 5-15 valores, NUNCA `error.message`), Saturation (gauge do recurso mais escasso identificado explicitamente).
116
-
117
- Sem esse gate, fases entregam Edge Functions / serviços sem instrumentação básica e dashboards crescem ad-hoc (CPU, memory, threads — *causes* não *symptoms*). Gate força padrão canônico: cada PR de código deve cobrir os 4 signals, ou explicar a ausência via skip (fase só altera markdown).
118
-
119
- Cross-ref agent canônico: [`golden-signals-instrumenter`](../kit/agents/golden-signals-instrumenter.md) (Phase 37 / AGCORE-SRE-01). Skill: [`four-golden-signals`](../kit/skills/four-golden-signals/SKILL.md) (Phase 36 / SKFD-SRE-02).
120
-
121
- ## REQ
122
-
123
- QA-SRE-01.
124
-
125
- ## Configuração
126
-
127
- Gate é **blocking** por default. Para tornar warn-only (durante adoption inicial em legado):
128
-
129
- ```bash
130
- node ./.claude/framework/bin/tools.cjs config-set workflow.golden_signals_coverage_warn true
131
- ```
132
-
133
- (Nota: implementação do toggle warn-only é deferida — gate atual lê apenas presença/ausência de regex, não consulta config.)
1
+ ---
2
+ id: golden-signals-coverage
3
+ stage: pre-verify
4
+ blocking: true
5
+ description: Valida que código de serviço/Edge Function tocado em fase contém os 4 golden signals (Latency=histogram, Traffic=counter, Errors=counter, Saturation=gauge). Skip se fase só toca markdown.
6
+ ---
7
+
8
+ # Golden signals coverage gate
9
+
10
+ **When to run:** pre-verify (blocking — fase não verifica até cobertura completa).
11
+
12
+ ## Check
13
+
14
+ ```bash
15
+ #!/usr/bin/env bash
16
+ # PT-BR: validar que código de serviço/Edge Function tocado em fase tem 4 golden signals.
17
+ # Estratégia: descobrir arquivos tocados (supabase/functions/** ou STATE.md current_phase code paths),
18
+ # rodar grep por histogram/counter/gauge/saturation, contar matches por sinal.
19
+ # Bash 3.2-portable (macOS default).
20
+ set -e
21
+
22
+ # PT-BR: identificar fase atual via STATE.md
23
+ STATE_FILE=".planning/STATE.md"
24
+ CURRENT_PHASE=""
25
+ if [ -f "$STATE_FILE" ]; then
26
+ CURRENT_PHASE=$(grep -E "^Fase:" "$STATE_FILE" 2>/dev/null | head -1 | sed -E 's/^Fase: *([0-9]+).*/\1/')
27
+ fi
28
+
29
+ # PT-BR: candidatos a arquivos de código tocados — escopo principal Supabase Edge + qualquer .ts/.js/.py
30
+ # em paths declarados pela fase (heurística: supabase/functions/** SEMPRE inspecionado).
31
+ CODE_FILES=""
32
+ if [ -d "supabase/functions" ]; then
33
+ CODE_FILES=$(find supabase/functions -type f \( -name "*.ts" -o -name "*.js" -o -name "*.mjs" \) 2>/dev/null)
34
+ fi
35
+
36
+ # PT-BR: também inspecionar lib/ e src/ se existirem (apps Node/Deno fora de Supabase)
37
+ if [ -d "src" ]; then
38
+ ADDITIONAL=$(find src -type f \( -name "*.ts" -o -name "*.js" -o -name "*.mjs" -o -name "*.py" \) 2>/dev/null)
39
+ CODE_FILES="$CODE_FILES
40
+ $ADDITIONAL"
41
+ fi
42
+ if [ -d "lib" ]; then
43
+ ADDITIONAL=$(find lib -type f \( -name "*.ts" -o -name "*.js" -o -name "*.mjs" -o -name "*.py" \) 2>/dev/null)
44
+ CODE_FILES="$CODE_FILES
45
+ $ADDITIONAL"
46
+ fi
47
+
48
+ # PT-BR: filtrar linhas vazias
49
+ CODE_FILES=$(echo "$CODE_FILES" | grep -v "^$" || true)
50
+
51
+ # PT-BR: se fase não toca código (só markdown/docs), pular gate
52
+ if [ -z "$CODE_FILES" ]; then
53
+ echo "INFO: nenhum arquivo de código (.ts/.js/.py) encontrado em supabase/functions/** | src/** | lib/** — fase parece content-only. Gate skipped."
54
+ exit 0
55
+ fi
56
+
57
+ # PT-BR: contar matches por signal
58
+ LATENCY_HITS=0
59
+ TRAFFIC_HITS=0
60
+ ERRORS_HITS=0
61
+ SATURATION_HITS=0
62
+
63
+ # PT-BR: process file list line-by-line para portabilidade bash 3.2
64
+ OLDIFS="$IFS"
65
+ IFS='
66
+ '
67
+ for f in $CODE_FILES; do
68
+ [ -z "$f" ] && continue
69
+ [ ! -f "$f" ] && continue
70
+
71
+ # PT-BR: Latency = histogram (createHistogram, recordHistogram, histogram.record)
72
+ if grep -qE "histogram|Histogram" "$f" 2>/dev/null; then
73
+ LATENCY_HITS=$((LATENCY_HITS + 1))
74
+ fi
75
+
76
+ # PT-BR: Traffic + Errors = counter (Errors counter dimensionado por error.type)
77
+ if grep -qE "counter|Counter|createCounter" "$f" 2>/dev/null; then
78
+ TRAFFIC_HITS=$((TRAFFIC_HITS + 1))
79
+ ERRORS_HITS=$((ERRORS_HITS + 1))
80
+ fi
81
+
82
+ # PT-BR: Saturation = gauge (createObservableGauge, gauge.record) ou string saturation
83
+ if grep -qE "gauge|Gauge|saturation|Saturation" "$f" 2>/dev/null; then
84
+ SATURATION_HITS=$((SATURATION_HITS + 1))
85
+ fi
86
+ done
87
+ IFS="$OLDIFS"
88
+
89
+ # PT-BR: gate passa se TODOS os 4 signals têm pelo menos 1 hit em algum arquivo de código
90
+ MISSING=""
91
+ [ "$LATENCY_HITS" -eq 0 ] && MISSING="$MISSING Latency(histogram)"
92
+ [ "$TRAFFIC_HITS" -eq 0 ] && MISSING="$MISSING Traffic(counter)"
93
+ [ "$ERRORS_HITS" -eq 0 ] && MISSING="$MISSING Errors(counter)"
94
+ [ "$SATURATION_HITS" -eq 0 ] && MISSING="$MISSING Saturation(gauge)"
95
+
96
+ if [ -z "$MISSING" ]; then
97
+ echo "PASS: 4 golden signals cobertos em código (Latency=$LATENCY_HITS files / Traffic=$TRAFFIC_HITS / Errors=$ERRORS_HITS / Saturation=$SATURATION_HITS)"
98
+ exit 0
99
+ else
100
+ echo "FAIL: golden signals ausentes em código tocado:$MISSING"
101
+ echo "Sugestão: rodar /sre golden-signals <service> ou /golden-signals para gerar instrumentação OTel canônica."
102
+ echo "Cross-ref: kit/skills/four-golden-signals/SKILL.md + kit/agents/golden-signals-instrumenter.md"
103
+ exit 1
104
+ fi
105
+ ```
106
+
107
+ ## Verdict
108
+
109
+ - **passed** — todos 4 signals (Latency / Traffic / Errors / Saturation) presentes em pelo menos 1 arquivo de código no projeto
110
+ - **passed (skip)** — projeto não tem código (apenas markdown / docs); gate não aplicável
111
+ - **block** — pelo menos 1 signal ausente em código tocado pela fase
112
+
113
+ ## Why
114
+
115
+ O livro Google SRE (cap 6 — *Monitoring Distributed Systems*) define os **4 golden signals** como cobertura mínima universal de saúde operacional para serviços user-facing — Latency (histogram com percentis, success vs error separados), Traffic (counter por endpoint × method), Errors (counter por `error.type` enum 5-15 valores, NUNCA `error.message`), Saturation (gauge do recurso mais escasso identificado explicitamente).
116
+
117
+ Sem esse gate, fases entregam Edge Functions / serviços sem instrumentação básica e dashboards crescem ad-hoc (CPU, memory, threads — *causes* não *symptoms*). Gate força padrão canônico: cada PR de código deve cobrir os 4 signals, ou explicar a ausência via skip (fase só altera markdown).
118
+
119
+ Cross-ref agent canônico: [`golden-signals-instrumenter`](../kit/agents/golden-signals-instrumenter.md) (Phase 37 / AGCORE-SRE-01). Skill: [`four-golden-signals`](../kit/skills/four-golden-signals/SKILL.md) (Phase 36 / SKFD-SRE-02).
120
+
121
+ ## REQ
122
+
123
+ QA-SRE-01.
124
+
125
+ ## Configuração
126
+
127
+ Gate é **blocking** por default. Para tornar warn-only (durante adoption inicial em legado):
128
+
129
+ ```bash
130
+ node ./.claude/framework/bin/tools.cjs config-set workflow.golden_signals_coverage_warn true
131
+ ```
132
+
133
+ (Nota: implementação do toggle warn-only é deferida — gate atual lê apenas presença/ausência de regex, não consulta config.)
@@ -1,178 +1,178 @@
1
- ---
2
- id: legacy-refactor-safety
3
- stage: pre-execute
4
- blocking: false
5
- description: Valida que tasks com kind=refactor em arquivos > 500 linhas OU com contrato externo têm characterization tests linkados. Skip se fase só toca markdown OR fase é greenfield. Opt-in via workflow.legacy_refactor_gate_blocking=true.
6
- ---
7
-
8
- # Legacy refactor safety gate
9
-
10
- **When to run:** pre-execute (consultive por default; blocking se `workflow.legacy_refactor_gate_blocking=true` E `omm.capacidade_1_resilience >= 3`).
11
-
12
- **Skill canônica:** [`pre-refactor-characterization`](../kit/skills/pre-refactor-characterization/SKILL.md)
13
-
14
- **Agent invocado:** [`refactor-safety-auditor`](../kit/agents/refactor-safety-auditor.md)
15
-
16
- ## Check
17
-
18
- ```bash
19
- #!/usr/bin/env bash
20
- # PT-BR: validar que tasks com kind=refactor em arquivos arriscados têm safety net.
21
- # Estratégia: descobrir tasks da fase atual, identificar refactor + arquivos flagged,
22
- # verificar characterization tests linkados, gerar warning ou block conforme mode.
23
- # Bash 3.2-portable (macOS default).
24
- set -e
25
-
26
- # PT-BR: identificar fase atual via STATE.md
27
- STATE_FILE=".planning/STATE.md"
28
- CURRENT_PHASE=""
29
- if [ -f "$STATE_FILE" ]; then
30
- CURRENT_PHASE=$(grep -E "^Fase:" "$STATE_FILE" 2>/dev/null | head -1 | sed -E 's/^Fase: *([0-9]+).*/\1/')
31
- fi
32
-
33
- if [ -z "$CURRENT_PHASE" ]; then
34
- echo "INFO: nenhuma fase ativa — gate skip."
35
- exit 0
36
- fi
37
-
38
- PHASE_DIR=".planning/phases/phase-${CURRENT_PHASE}"
39
- [ ! -d "$PHASE_DIR" ] && exit 0
40
-
41
- # PT-BR: ler config para mode
42
- GATE_BLOCKING=false
43
- if [ -f ".planning/config.json" ] && command -v jq >/dev/null; then
44
- CFG=$(jq -r '.workflow.legacy_refactor_gate_blocking // empty' .planning/config.json 2>/dev/null)
45
- [ "$CFG" = "true" ] && GATE_BLOCKING=true
46
- fi
47
-
48
- # PT-BR: ler omm — Capacidade 1 (Resilience) calibra mode default
49
- if [ "$GATE_BLOCKING" = "false" ] && [ -f ".planning/OMM-REPORT.md" ]; then
50
- OMM_RES=$(grep -oE 'Capacidade 1.*Resilience.*[0-9]/5' .planning/OMM-REPORT.md 2>/dev/null \
51
- | grep -oE '[0-9]/5' | head -1 | sed 's|/5||')
52
- if [ -n "$OMM_RES" ] && [ "$OMM_RES" -ge 3 ]; then
53
- GATE_BLOCKING=true
54
- fi
55
- fi
56
-
57
- # PT-BR: identificar PLAN.md da fase atual
58
- PLAN_FILES=$(find "$PHASE_DIR" -name "PLAN.md" 2>/dev/null)
59
-
60
- REFACTOR_TASKS_RISKY=()
61
- REFACTOR_TASKS_OK=()
62
- TOTAL_REFACTOR=0
63
-
64
- for plan_file in $PLAN_FILES; do
65
- # PT-BR: detectar tasks com kind=refactor (heurística — frase canônica)
66
- if grep -qiE "(refactor|refator|extract method|extract class|move method|reorganizar|limpar)" "$plan_file"; then
67
- # extrair arquivos mencionados em tasks de refactor
68
- AFFECTED_FILES=$(grep -oE "(src|lib|app|supabase|tests)/[a-zA-Z0-9_./-]+\.(ts|tsx|js|jsx|mjs|py|java|go|rb|cs|rs|cpp|c|h)" "$plan_file" 2>/dev/null | sort -u)
69
-
70
- for f in $AFFECTED_FILES; do
71
- [ ! -f "$f" ] && continue
72
-
73
- # PT-BR: critérios de risco
74
- LINES=$(wc -l < "$f" 2>/dev/null | tr -d ' ')
75
- EXTERNAL=false
76
- if echo "$f" | grep -qE "(supabase/functions|src/api|/handlers/webhooks|pages/api|integrations)"; then
77
- EXTERNAL=true
78
- fi
79
-
80
- RISK_HIGH=false
81
- [ "${LINES:-0}" -gt 500 ] && RISK_HIGH=true
82
- [ "$EXTERNAL" = "true" ] && RISK_HIGH=true
83
-
84
- if [ "$RISK_HIGH" = "true" ]; then
85
- TOTAL_REFACTOR=$((TOTAL_REFACTOR + 1))
86
-
87
- # PT-BR: verificar characterization tests linkados
88
- STEM=$(basename "$f" | sed 's/\.[^.]*$//')
89
- HAS_CHAR=false
90
- for chardir in tests test __tests__; do
91
- if find "$chardir" -path "*characterization*$STEM*" 2>/dev/null | head -1 | grep -q . ; then
92
- HAS_CHAR=true
93
- break
94
- fi
95
- done
96
-
97
- if [ "$HAS_CHAR" = "true" ]; then
98
- REFACTOR_TASKS_OK+=("$f")
99
- else
100
- REFACTOR_TASKS_RISKY+=("$f (lines=$LINES, external=$EXTERNAL)")
101
- fi
102
- fi
103
- done
104
- fi
105
- done
106
-
107
- # PT-BR: relatório
108
- if [ ${#REFACTOR_TASKS_RISKY[@]} -eq 0 ]; then
109
- echo "✓ legacy-refactor-safety — sem refactors arriscados sem characterization."
110
- if [ ${#REFACTOR_TASKS_OK[@]} -gt 0 ]; then
111
- echo " ${#REFACTOR_TASKS_OK[@]} refactor(s) com characterization linkados."
112
- fi
113
- exit 0
114
- fi
115
-
116
- # PT-BR: há refactors arriscados sem char
117
- echo ""
118
- echo "⚠ legacy-refactor-safety — refactor(s) sem characterization detectado(s):"
119
- echo ""
120
- for item in "${REFACTOR_TASKS_RISKY[@]}"; do
121
- echo " - $item"
122
- done
123
- echo ""
124
- echo "Skill canônica: kit/skills/pre-refactor-characterization/SKILL.md"
125
- echo ""
126
- echo "Caminhos para resolver:"
127
- echo " 1. /caracterizar <file> (full chain — preferido)"
128
- echo " 2. /refactor-seguro --mode=sprout <file> (não toca legado, ADICIONA via sprout)"
129
- echo " 3. /refactor-seguro --mode=safe-extract <file> (apenas refactor mecânico)"
130
- echo " 4. /refactor-seguro --mode=override --ticket REQ-N --reason \"...\" (último recurso)"
131
- echo ""
132
-
133
- if [ "$GATE_BLOCKING" = "true" ]; then
134
- echo "MODE: blocking (workflow.legacy_refactor_gate_blocking=true OR OMM Capacidade 1 ≥ 3)"
135
- echo "Resolve antes de prosseguir com /executar-fase."
136
- exit 1
137
- else
138
- echo "MODE: consultive (warning apenas)"
139
- echo "Para tornar blocking: setar workflow.legacy_refactor_gate_blocking=true em .planning/config.json"
140
- exit 0
141
- fi
142
- ```
143
-
144
- ## Configuração
145
-
146
- ```json
147
- // .planning/config.json
148
- {
149
- "workflow": {
150
- "legacy_refactor_gate_blocking": true,
151
- "legacy_refactor_min_lines": 500,
152
- "legacy_refactor_external_paths": [
153
- "supabase/functions/**",
154
- "src/api/**",
155
- "src/handlers/webhooks/**",
156
- "pages/api/**"
157
- ]
158
- }
159
- }
160
- ```
161
-
162
- **Default:** `legacy_refactor_gate_blocking` = false (consultive). Auto-promove para `true` se `omm-auditor` (v1.9) reportar Capacidade 1 (Resilience) ≥ 3 — sinal de que projeto tem maturity de safety.
163
-
164
- ## Quando NÃO rodar
165
-
166
- - Fase só toca markdown/docs — sem código a refactor
167
- - Projeto < 1 mês de idade — código novo não é "legacy" no sentido Feathers
168
- - Projeto sem `omm-auditor` rodado E sem flag explícita — skip silencioso (consultive)
169
- - Tasks são `bug-fix` ou `feature` (não refactor) — gate só roda em refactor
170
-
171
- ## Ver também
172
-
173
- - [`pre-refactor-characterization`](../kit/skills/pre-refactor-characterization/SKILL.md) — knowledge base do gate
174
- - [`refactor-safety-auditor`](../kit/agents/refactor-safety-auditor.md) — agent invocado em runtime
175
- - [`legacy-characterizer`](../kit/agents/legacy-characterizer.md) — agent que gera safety net
176
- - [`golden-signals-coverage`](./golden-signals-coverage.md) — gate análogo da Suíte SRE
177
- - [`prr-checklist-coverage`](./prr-checklist-coverage.md) — gate análogo da Suíte SRE para PRR
178
- - [`omm-no-regression`](./omm-no-regression.md) — gate análogo da Suíte Observabilidade para OMM
1
+ ---
2
+ id: legacy-refactor-safety
3
+ stage: pre-execute
4
+ blocking: false
5
+ description: Valida que tasks com kind=refactor em arquivos > 500 linhas OU com contrato externo têm characterization tests linkados. Skip se fase só toca markdown OR fase é greenfield. Opt-in via workflow.legacy_refactor_gate_blocking=true.
6
+ ---
7
+
8
+ # Legacy refactor safety gate
9
+
10
+ **When to run:** pre-execute (consultive por default; blocking se `workflow.legacy_refactor_gate_blocking=true` E `omm.capacidade_1_resilience >= 3`).
11
+
12
+ **Skill canônica:** [`pre-refactor-characterization`](../kit/skills/pre-refactor-characterization/SKILL.md)
13
+
14
+ **Agent invocado:** [`refactor-safety-auditor`](../kit/agents/refactor-safety-auditor.md)
15
+
16
+ ## Check
17
+
18
+ ```bash
19
+ #!/usr/bin/env bash
20
+ # PT-BR: validar que tasks com kind=refactor em arquivos arriscados têm safety net.
21
+ # Estratégia: descobrir tasks da fase atual, identificar refactor + arquivos flagged,
22
+ # verificar characterization tests linkados, gerar warning ou block conforme mode.
23
+ # Bash 3.2-portable (macOS default).
24
+ set -e
25
+
26
+ # PT-BR: identificar fase atual via STATE.md
27
+ STATE_FILE=".planning/STATE.md"
28
+ CURRENT_PHASE=""
29
+ if [ -f "$STATE_FILE" ]; then
30
+ CURRENT_PHASE=$(grep -E "^Fase:" "$STATE_FILE" 2>/dev/null | head -1 | sed -E 's/^Fase: *([0-9]+).*/\1/')
31
+ fi
32
+
33
+ if [ -z "$CURRENT_PHASE" ]; then
34
+ echo "INFO: nenhuma fase ativa — gate skip."
35
+ exit 0
36
+ fi
37
+
38
+ PHASE_DIR=".planning/phases/phase-${CURRENT_PHASE}"
39
+ [ ! -d "$PHASE_DIR" ] && exit 0
40
+
41
+ # PT-BR: ler config para mode
42
+ GATE_BLOCKING=false
43
+ if [ -f ".planning/config.json" ] && command -v jq >/dev/null; then
44
+ CFG=$(jq -r '.workflow.legacy_refactor_gate_blocking // empty' .planning/config.json 2>/dev/null)
45
+ [ "$CFG" = "true" ] && GATE_BLOCKING=true
46
+ fi
47
+
48
+ # PT-BR: ler omm — Capacidade 1 (Resilience) calibra mode default
49
+ if [ "$GATE_BLOCKING" = "false" ] && [ -f ".planning/OMM-REPORT.md" ]; then
50
+ OMM_RES=$(grep -oE 'Capacidade 1.*Resilience.*[0-9]/5' .planning/OMM-REPORT.md 2>/dev/null \
51
+ | grep -oE '[0-9]/5' | head -1 | sed 's|/5||')
52
+ if [ -n "$OMM_RES" ] && [ "$OMM_RES" -ge 3 ]; then
53
+ GATE_BLOCKING=true
54
+ fi
55
+ fi
56
+
57
+ # PT-BR: identificar PLAN.md da fase atual
58
+ PLAN_FILES=$(find "$PHASE_DIR" -name "PLAN.md" 2>/dev/null)
59
+
60
+ REFACTOR_TASKS_RISKY=()
61
+ REFACTOR_TASKS_OK=()
62
+ TOTAL_REFACTOR=0
63
+
64
+ for plan_file in $PLAN_FILES; do
65
+ # PT-BR: detectar tasks com kind=refactor (heurística — frase canônica)
66
+ if grep -qiE "(refactor|refator|extract method|extract class|move method|reorganizar|limpar)" "$plan_file"; then
67
+ # extrair arquivos mencionados em tasks de refactor
68
+ AFFECTED_FILES=$(grep -oE "(src|lib|app|supabase|tests)/[a-zA-Z0-9_./-]+\.(ts|tsx|js|jsx|mjs|py|java|go|rb|cs|rs|cpp|c|h)" "$plan_file" 2>/dev/null | sort -u)
69
+
70
+ for f in $AFFECTED_FILES; do
71
+ [ ! -f "$f" ] && continue
72
+
73
+ # PT-BR: critérios de risco
74
+ LINES=$(wc -l < "$f" 2>/dev/null | tr -d ' ')
75
+ EXTERNAL=false
76
+ if echo "$f" | grep -qE "(supabase/functions|src/api|/handlers/webhooks|pages/api|integrations)"; then
77
+ EXTERNAL=true
78
+ fi
79
+
80
+ RISK_HIGH=false
81
+ [ "${LINES:-0}" -gt 500 ] && RISK_HIGH=true
82
+ [ "$EXTERNAL" = "true" ] && RISK_HIGH=true
83
+
84
+ if [ "$RISK_HIGH" = "true" ]; then
85
+ TOTAL_REFACTOR=$((TOTAL_REFACTOR + 1))
86
+
87
+ # PT-BR: verificar characterization tests linkados
88
+ STEM=$(basename "$f" | sed 's/\.[^.]*$//')
89
+ HAS_CHAR=false
90
+ for chardir in tests test __tests__; do
91
+ if find "$chardir" -path "*characterization*$STEM*" 2>/dev/null | head -1 | grep -q . ; then
92
+ HAS_CHAR=true
93
+ break
94
+ fi
95
+ done
96
+
97
+ if [ "$HAS_CHAR" = "true" ]; then
98
+ REFACTOR_TASKS_OK+=("$f")
99
+ else
100
+ REFACTOR_TASKS_RISKY+=("$f (lines=$LINES, external=$EXTERNAL)")
101
+ fi
102
+ fi
103
+ done
104
+ fi
105
+ done
106
+
107
+ # PT-BR: relatório
108
+ if [ ${#REFACTOR_TASKS_RISKY[@]} -eq 0 ]; then
109
+ echo "✓ legacy-refactor-safety — sem refactors arriscados sem characterization."
110
+ if [ ${#REFACTOR_TASKS_OK[@]} -gt 0 ]; then
111
+ echo " ${#REFACTOR_TASKS_OK[@]} refactor(s) com characterization linkados."
112
+ fi
113
+ exit 0
114
+ fi
115
+
116
+ # PT-BR: há refactors arriscados sem char
117
+ echo ""
118
+ echo "⚠ legacy-refactor-safety — refactor(s) sem characterization detectado(s):"
119
+ echo ""
120
+ for item in "${REFACTOR_TASKS_RISKY[@]}"; do
121
+ echo " - $item"
122
+ done
123
+ echo ""
124
+ echo "Skill canônica: kit/skills/pre-refactor-characterization/SKILL.md"
125
+ echo ""
126
+ echo "Caminhos para resolver:"
127
+ echo " 1. /caracterizar <file> (full chain — preferido)"
128
+ echo " 2. /refactor-seguro --mode=sprout <file> (não toca legado, ADICIONA via sprout)"
129
+ echo " 3. /refactor-seguro --mode=safe-extract <file> (apenas refactor mecânico)"
130
+ echo " 4. /refactor-seguro --mode=override --ticket REQ-N --reason \"...\" (último recurso)"
131
+ echo ""
132
+
133
+ if [ "$GATE_BLOCKING" = "true" ]; then
134
+ echo "MODE: blocking (workflow.legacy_refactor_gate_blocking=true OR OMM Capacidade 1 ≥ 3)"
135
+ echo "Resolve antes de prosseguir com /executar-fase."
136
+ exit 1
137
+ else
138
+ echo "MODE: consultive (warning apenas)"
139
+ echo "Para tornar blocking: setar workflow.legacy_refactor_gate_blocking=true em .planning/config.json"
140
+ exit 0
141
+ fi
142
+ ```
143
+
144
+ ## Configuração
145
+
146
+ ```json
147
+ // .planning/config.json
148
+ {
149
+ "workflow": {
150
+ "legacy_refactor_gate_blocking": true,
151
+ "legacy_refactor_min_lines": 500,
152
+ "legacy_refactor_external_paths": [
153
+ "supabase/functions/**",
154
+ "src/api/**",
155
+ "src/handlers/webhooks/**",
156
+ "pages/api/**"
157
+ ]
158
+ }
159
+ }
160
+ ```
161
+
162
+ **Default:** `legacy_refactor_gate_blocking` = false (consultive). Auto-promove para `true` se `omm-auditor` (v1.9) reportar Capacidade 1 (Resilience) ≥ 3 — sinal de que projeto tem maturity de safety.
163
+
164
+ ## Quando NÃO rodar
165
+
166
+ - Fase só toca markdown/docs — sem código a refactor
167
+ - Projeto < 1 mês de idade — código novo não é "legacy" no sentido Feathers
168
+ - Projeto sem `omm-auditor` rodado E sem flag explícita — skip silencioso (consultive)
169
+ - Tasks são `bug-fix` ou `feature` (não refactor) — gate só roda em refactor
170
+
171
+ ## Ver também
172
+
173
+ - [`pre-refactor-characterization`](../kit/skills/pre-refactor-characterization/SKILL.md) — knowledge base do gate
174
+ - [`refactor-safety-auditor`](../kit/agents/refactor-safety-auditor.md) — agent invocado em runtime
175
+ - [`legacy-characterizer`](../kit/agents/legacy-characterizer.md) — agent que gera safety net
176
+ - [`golden-signals-coverage`](./golden-signals-coverage.md) — gate análogo da Suíte SRE
177
+ - [`prr-checklist-coverage`](./prr-checklist-coverage.md) — gate análogo da Suíte SRE para PRR
178
+ - [`omm-no-regression`](./omm-no-regression.md) — gate análogo da Suíte Observabilidade para OMM