@luanpdd/kit-mcp 1.35.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 (117) hide show
  1. package/bin/cli.js +2 -2
  2. package/bin/mcp.js +6 -6
  3. package/bin/ui.js +74 -74
  4. package/gates/ai-prompt-stability.md +120 -120
  5. package/gates/budget-description.md +68 -68
  6. package/gates/confidence.md +29 -29
  7. package/gates/dependency-check.md +33 -33
  8. package/gates/dept-cycle-prevention.md +179 -179
  9. package/gates/golden-signals-coverage.md +133 -133
  10. package/gates/legacy-refactor-safety.md +178 -178
  11. package/gates/multi-tenant-rls-coverage.md +102 -102
  12. package/gates/no-personal-uuid.md +72 -72
  13. package/gates/obs-agents-mcp-supabase.md +86 -86
  14. package/gates/obs-skills-frontmatter.md +76 -76
  15. package/gates/observability-coverage.md +151 -151
  16. package/gates/omm-no-regression.md +83 -83
  17. package/gates/postmortem-template-required.md +127 -127
  18. package/gates/prr-checklist-coverage.md +128 -128
  19. package/gates/regression.md +32 -32
  20. package/gates/release-pipeline-policy.md +132 -132
  21. package/gates/secrets-scan.md +33 -33
  22. package/gates/service-role-not-in-user-facing.md +113 -113
  23. package/gates/skill-must-include.md +71 -71
  24. package/gates/sync-idempotent.md +62 -62
  25. package/gates/verify-phase-goal.md +34 -34
  26. package/kit/agents/designer-ui.md +216 -216
  27. package/kit/agents/workflow-generator.md +537 -167
  28. package/kit/commands/adicionar-backlog.md +1 -1
  29. package/kit/commands/adicionar-fase.md +1 -1
  30. package/kit/commands/adicionar-tarefa.md +1 -1
  31. package/kit/commands/auditar-observabilidade.md +103 -103
  32. package/kit/commands/auditar-toil.md +129 -129
  33. package/kit/commands/caracterizar-prompt.md +195 -195
  34. package/kit/commands/criar-workflow.md +158 -158
  35. package/kit/commands/definir-perfil.md +1 -1
  36. package/kit/commands/definir-slo.md +108 -108
  37. package/kit/commands/fio.md +1 -1
  38. package/kit/commands/golden-signals.md +142 -142
  39. package/kit/commands/instrumentar-fase.md +200 -200
  40. package/kit/commands/investigar-producao.md +162 -162
  41. package/kit/commands/observabilidade.md +118 -118
  42. package/kit/commands/postmortem.md +179 -179
  43. package/kit/commands/prr.md +205 -205
  44. package/kit/commands/publicar-rapido.md +207 -207
  45. package/kit/commands/risk-budget.md +220 -220
  46. package/kit/commands/sre.md +230 -230
  47. package/kit/file-manifest.json +424 -424
  48. package/kit/framework/references/output-style.md +22 -22
  49. package/kit/hooks/post-apply-migration.js +199 -199
  50. package/kit/hooks/sidecar-tool-publisher.js +210 -210
  51. package/kit/skills/_shared-dados-distribuidos/glossary.md +224 -224
  52. package/kit/skills/_shared-legacy/glossary.md +389 -389
  53. package/kit/skills/_shared-multi-tenant/glossary.md +186 -186
  54. package/kit/skills/_shared-observability/glossary.md +396 -396
  55. package/kit/skills/_shared-sre/glossary.md +712 -712
  56. package/kit/skills/_shared-supabase/glossary.md +234 -234
  57. package/kit/skills/blameless-postmortems/SKILL.md +340 -340
  58. package/kit/skills/burn-rate-alerting/SKILL.md +258 -258
  59. package/kit/skills/cascading-failures/SKILL.md +311 -311
  60. package/kit/skills/core-analysis-loop/SKILL.md +352 -352
  61. package/kit/skills/distributed-tracing/SKILL.md +362 -362
  62. package/kit/skills/dynamic-workflow-authoring/SKILL.md +327 -223
  63. package/kit/skills/eliminating-toil/SKILL.md +243 -243
  64. package/kit/skills/event-based-slos/SKILL.md +296 -296
  65. package/kit/skills/four-golden-signals/SKILL.md +314 -314
  66. package/kit/skills/hermetic-builds/SKILL.md +323 -323
  67. package/kit/skills/legacy-monster-methods/SKILL.md +444 -444
  68. package/kit/skills/llm-as-dependency/SKILL.md +436 -436
  69. package/kit/skills/load-shedding-graceful-degradation/SKILL.md +396 -396
  70. package/kit/skills/observability-driven-development/SKILL.md +315 -315
  71. package/kit/skills/observability-maturity-model/SKILL.md +222 -222
  72. package/kit/skills/opentelemetry-standard/SKILL.md +351 -351
  73. package/kit/skills/production-readiness-review/SKILL.md +305 -305
  74. package/kit/skills/release-engineering/SKILL.md +367 -367
  75. package/kit/skills/retry-strategies/SKILL.md +372 -372
  76. package/kit/skills/sre-risk-management/SKILL.md +221 -221
  77. package/kit/skills/structured-events/SKILL.md +265 -265
  78. package/kit/skills/supabase-cron-queues/SKILL.md +275 -275
  79. package/kit/skills/supabase-database-functions/SKILL.md +332 -332
  80. package/kit/skills/supabase-declarative-schema/SKILL.md +183 -183
  81. package/kit/skills/supabase-pgvector-rag/SKILL.md +253 -253
  82. package/kit/skills/supabase-postgres-style/SKILL.md +138 -138
  83. package/kit/skills/supabase-storage/SKILL.md +234 -234
  84. package/kit/skills/telemetry-pipelines/SKILL.md +259 -259
  85. package/kit/skills/telemetry-sampling/SKILL.md +256 -256
  86. package/kit/skills/ui-anti-padroes-ia/SKILL.md +261 -261
  87. package/kit/skills/ui-contexto-produto/SKILL.md +248 -248
  88. package/kit/skills/ui-cor-estrategia/SKILL.md +213 -213
  89. package/kit/skills/ui-critica-auditoria/SKILL.md +260 -260
  90. package/kit/skills/ui-motion-funcional/SKILL.md +264 -264
  91. package/kit/skills/ui-ritmo-espacial/SKILL.md +259 -259
  92. package/kit/skills/ui-tipografia/SKILL.md +211 -211
  93. package/package.json +1 -1
  94. package/src/cli/index.js +1114 -1114
  95. package/src/cli/render.js +194 -194
  96. package/src/cli/upgrade-check.js +135 -135
  97. package/src/core/error-redaction.js +76 -76
  98. package/src/core/failures.js +153 -153
  99. package/src/core/gate-runner.js +205 -205
  100. package/src/core/gates.js +82 -82
  101. package/src/core/logger.js +170 -170
  102. package/src/core/manifest-verify.js +174 -174
  103. package/src/core/metrics.js +268 -268
  104. package/src/core/notify.js +60 -60
  105. package/src/core/path-safety.js +141 -141
  106. package/src/core/replays.js +120 -120
  107. package/src/core/ui.js +185 -185
  108. package/src/mcp-server/install.js +149 -149
  109. package/src/mcp-server/roots.js +124 -124
  110. package/src/ui/auto-spawn.js +113 -113
  111. package/src/ui/browser.js +78 -78
  112. package/src/ui/client.js +130 -130
  113. package/src/ui/events.js +65 -65
  114. package/src/ui/lockfile.js +191 -191
  115. package/src/ui/port.js +67 -67
  116. package/src/ui/server.js +547 -547
  117. 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