fg-tracker-mcp 0.8.0 → 0.9.1
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/CHANGELOG.md +10 -1
- package/README.md +4 -2
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +4 -2
- package/dist/client.js +4 -4
- package/dist/client.js.map +1 -1
- package/dist/docs.js +7 -5
- package/dist/docs.js.map +1 -1
- package/dist/guide.d.ts +1 -1
- package/dist/guide.js +9 -9
- package/dist/guide.js.map +1 -1
- package/dist/infra/handover.d.ts +1 -1
- package/dist/infra/handover.js +23 -23
- package/dist/infra/handover.js.map +1 -1
- package/dist/infra/iac.js +2 -2
- package/dist/infra/iac.js.map +1 -1
- package/dist/infra/instrument.js +1 -1
- package/dist/infra/instrument.js.map +1 -1
- package/dist/infra/tools.js +21 -21
- package/dist/infra/tools.js.map +1 -1
- package/dist/loadtest/scenario.js +1 -1
- package/dist/loadtest/scenario.js.map +1 -1
- package/dist/loadtest/tools.js +4 -4
- package/dist/loadtest/tools.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.js +40 -18
- package/dist/server.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog — fg-tracker-mcp
|
|
2
2
|
|
|
3
|
+
## 0.9.1 — 2026-10-01
|
|
4
|
+
|
|
5
|
+
- Atualiza para **FG Track** os nomes de produto exibidos por ferramentas e documentação; nomes das ferramentas e transporte MCP permanecem compatíveis.
|
|
6
|
+
|
|
7
|
+
## 0.9.0 — 2026-09-15
|
|
8
|
+
|
|
9
|
+
- **Domínios permitidos** (CONTRATO.md §25): tool `track_update_allowed_origins { projectId, origins }` substitui a lista de origens de navegador aceitas no CORS de `POST /v1/ingest` (`PATCH /v1/projects/:id` com `allowedOrigins`; owner/admin). A descrição orienta o agente a ler a lista atual com `track_list_projects` e confirmar com o usuário antes de salvar.
|
|
10
|
+
- `track_list_projects` mostra `allowedOrigins` de cada projeto.
|
|
11
|
+
|
|
3
12
|
## 0.8.0 — 2026-09-15
|
|
4
13
|
|
|
5
14
|
- **Simulação de ambiente** (CONTRATO.md §28.8): tools `loadtest_scan_routes` (rotas NestJS/Express/Next.js, DTOs e pistas de auth, somente leitura), `loadtest_create_scenario` (validação zod do roteiro §28.2 com caminhos dos erros, avisos de variáveis não definidas, senhas literais e efeitos externos), `loadtest_list_scenarios`, `loadtest_suggest_plan` (presets k6 smoke/load/stress/spike/soak/breakpoint, §28.3), `loadtest_get_run` (resumo, thresholds, por passo e advice) e `loadtest_start_run` (recusa sem `confirm: true`).
|
|
@@ -15,7 +24,7 @@
|
|
|
15
24
|
## 0.5.0 — 2026-09-15
|
|
16
25
|
|
|
17
26
|
- **Infraestrutura AWS** (CONTRATO.md §27.9): tools `infra_connect_account`, `infra_verify_connection`, `infra_discover` (inventário com credenciais locais, somente leitura → snapshot), `infra_analyze_iac` (CDK/SAM/Serverless/Terraform/CI), `infra_assign_resources`, `infra_instrument`, `infra_validate`, `infra_get_diagram`, `infra_plan_handover`, `infra_open_handover_pr` (lock, guard do CI, patch e comandos git/gh — nunca executa push) e `infra_complete_handover`.
|
|
18
|
-
- Prompt `connect-infrastructure` com o roteiro e as regras de segurança (nenhuma mudança na AWS pelo agente; aprovação humana no FG
|
|
27
|
+
- Prompt `connect-infrastructure` com o roteiro e as regras de segurança (nenhuma mudança na AWS pelo agente; aprovação humana no FG Track).
|
|
19
28
|
- Quickstart ganha a seção "Infraestrutura (AWS)". Dependências `@aws-sdk/client-*` e `@aws-sdk/credential-providers`.
|
|
20
29
|
|
|
21
30
|
## 0.4.0 — 2026-09-15
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# fg-tracker-mcp
|
|
2
2
|
|
|
3
|
-
Servidor [MCP](https://modelcontextprotocol.io) (stdio) do FG
|
|
3
|
+
Servidor [MCP](https://modelcontextprotocol.io) (stdio) do FG Track para agentes de código (Claude Code, Cursor, Windsurf, Claude Desktop): projetos, métricas, traces, issues com commits suspeitos, releases, monitores, provedores externos, logs e guia de instrumentação. Documentação completa: `docs/mcp.md` no repositório.
|
|
4
4
|
|
|
5
5
|
## Instalação
|
|
6
6
|
|
|
@@ -30,7 +30,7 @@ Cursor / Windsurf / Claude Desktop (JSON):
|
|
|
30
30
|
}
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
Em produção, `FG_TRACKER_URL` é a URL da API mostrada no painel em **Conectar**. O
|
|
33
|
+
Em produção, `FG_TRACKER_URL` é a URL da API mostrada no painel em **Conectar**. O endereço de produção da API é `https://tracker-api.fortground.com.br` (o antigo `track-api.fortground.com.br` continua respondendo).
|
|
34
34
|
|
|
35
35
|
## Variáveis de ambiente
|
|
36
36
|
|
|
@@ -49,6 +49,8 @@ Tools `track_*` (nomes inalterados), prompt `instrument-project` e resource `fg-
|
|
|
49
49
|
|
|
50
50
|
Infraestrutura AWS (0.6.0): tools `infra_*` e prompt `connect-infrastructure` — detectar contas/ambientes/regiões nas credenciais locais, conectar cada ambiente, descobrir recursos com credenciais locais (somente leitura), analisar o IaC, instrumentar, validar e gerar o PR de transferência de controle. Nenhuma tool altera recursos na AWS. Detalhes em `docs/mcp.md` → Infraestrutura.
|
|
51
51
|
|
|
52
|
+
Domínios permitidos (0.9.0): `track_update_allowed_origins { projectId, origins }` substitui as origens de navegador aceitas no CORS da ingestão (`PATCH /v1/projects/:id { allowedOrigins }`); `track_list_projects` mostra a lista atual — leia antes e confirme com o usuário.
|
|
53
|
+
|
|
52
54
|
Simulação de ambiente (0.8.0): prompt `create-load-test` e tools `loadtest_*` (CONTRATO.md §28.8):
|
|
53
55
|
|
|
54
56
|
| tool | entrada | o que faz |
|
package/dist/cli.js
CHANGED
|
@@ -10,7 +10,7 @@ import { createServer, SERVER_NAME, SERVER_VERSION } from './server.js';
|
|
|
10
10
|
const argv = process.argv.slice(2);
|
|
11
11
|
if (argv.includes('--help') || argv.includes('-h')) {
|
|
12
12
|
process.stdout.write([
|
|
13
|
-
`${SERVER_NAME}-mcp ${SERVER_VERSION} — servidor MCP (stdio) do FG
|
|
13
|
+
`${SERVER_NAME}-mcp ${SERVER_VERSION} — servidor MCP (stdio) do FG Track`,
|
|
14
14
|
'',
|
|
15
15
|
'Uso: fg-tracker-mcp (sem argumentos; fala MCP JSON-RPC via stdin/stdout)',
|
|
16
16
|
' fg-tracker-mcp --version',
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;QACE,GAAG,WAAW,QAAQ,cAAc,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;QACE,GAAG,WAAW,QAAQ,cAAc,qCAAqC;QACzE,EAAE;QACF,uFAAuF;QACvF,+BAA+B;QAC/B,EAAE;QACF,wBAAwB;QACxB,qEAAqE;QACrE,6FAA6F;QAC7F,sFAAsF;QACtF,oEAAoE;QACpE,2FAA2F;QAC3F,EAAE;QACF,4BAA4B;QAC5B,sHAAsH;QACtH,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,cAAc,IAAI,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;AAC/B,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AACvC,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AAExC,mEAAmE;AACnE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;AAC5D,IAAI,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;IACxC,OAAO,CAAC,KAAK,CAAC,qBAAqB,OAAO,uEAAuE,CAAC,CAAC;AACrH,CAAC;AACD,OAAO,CAAC,KAAK,CAAC,wBAAwB,MAAM,CAAC,OAAO,YAAY,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,aAAa,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AAEhJ,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAEhC,MAAM,QAAQ,GAAG,GAAS,EAAE;IAC1B,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC,CAAC;AACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cliente HTTP mínimo para a API do FG
|
|
2
|
+
* Cliente HTTP mínimo para a API do FG Track (docs/CONTRATO.md §4, §8, §11).
|
|
3
3
|
* Lê `FG_TRACKER_URL`, `FG_TRACKER_TOKEN` (Bearer de sessão), `FG_TRACKER_API_KEY`
|
|
4
4
|
* (chave de projeto, header `x-fg-tracker-key`) e `FG_TRACKER_TIMEOUT_MS` — com
|
|
5
5
|
* fallback para os nomes legados `STREAD_TRACK_*` (`stread-track-mcp` ≤ 0.3).
|
|
6
6
|
*/
|
|
7
|
-
/** API local do monorepo.
|
|
7
|
+
/** API local do monorepo. Em produção a API é `https://tracker-api.fortground.com.br`. */
|
|
8
8
|
export declare const DEFAULT_URL = "http://localhost:4050";
|
|
9
9
|
/** Header da chave de projeto (a API aceita também o legado `x-stread-track-key`). */
|
|
10
10
|
export declare const API_KEY_HEADER = "x-fg-tracker-key";
|
|
@@ -57,6 +57,8 @@ export interface Project {
|
|
|
57
57
|
slowThresholdMs: number;
|
|
58
58
|
loopThreshold: number;
|
|
59
59
|
apdexTargetMs: number;
|
|
60
|
+
/** Domínios permitidos no CORS da ingestão pelo SDK de navegador (API ≥ allowedOrigins). */
|
|
61
|
+
allowedOrigins?: string[];
|
|
60
62
|
createdAt: string;
|
|
61
63
|
stats?: {
|
|
62
64
|
requests24h: number;
|
package/dist/client.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cliente HTTP mínimo para a API do FG
|
|
2
|
+
* Cliente HTTP mínimo para a API do FG Track (docs/CONTRATO.md §4, §8, §11).
|
|
3
3
|
* Lê `FG_TRACKER_URL`, `FG_TRACKER_TOKEN` (Bearer de sessão), `FG_TRACKER_API_KEY`
|
|
4
4
|
* (chave de projeto, header `x-fg-tracker-key`) e `FG_TRACKER_TIMEOUT_MS` — com
|
|
5
5
|
* fallback para os nomes legados `STREAD_TRACK_*` (`stread-track-mcp` ≤ 0.3).
|
|
6
6
|
*/
|
|
7
|
-
/** API local do monorepo.
|
|
7
|
+
/** API local do monorepo. Em produção a API é `https://tracker-api.fortground.com.br`. */
|
|
8
8
|
export const DEFAULT_URL = 'http://localhost:4050';
|
|
9
9
|
/** Header da chave de projeto (a API aceita também o legado `x-stread-track-key`). */
|
|
10
10
|
export const API_KEY_HEADER = 'x-fg-tracker-key';
|
|
@@ -108,7 +108,7 @@ export class TrackClient {
|
|
|
108
108
|
}
|
|
109
109
|
catch (err) {
|
|
110
110
|
if (isConnectionError(err)) {
|
|
111
|
-
throw new TrackApiError(`API do FG
|
|
111
|
+
throw new TrackApiError(`API do FG Track não está no ar em ${this.config.baseUrl} (conexão recusada).`, undefined, path, 'suba a API com `pnpm dev:api` no monorepo do FG Track ou ajuste FG_TRACKER_URL.');
|
|
112
112
|
}
|
|
113
113
|
const msg = err instanceof Error ? err.message : String(err);
|
|
114
114
|
if (/abort|timeout/i.test(msg)) {
|
|
@@ -133,7 +133,7 @@ export class TrackClient {
|
|
|
133
133
|
case 401:
|
|
134
134
|
throw new TrackApiError(`Não autenticado (401) em ${method} ${path}: ${message}`, 401, path, this.config.token
|
|
135
135
|
? 'o FG_TRACKER_TOKEN expirou ou é inválido — faça login de novo (POST /v1/auth/login) e defina FG_TRACKER_TOKEN com o novo token.'
|
|
136
|
-
: 'defina FG_TRACKER_TOKEN com um token de sessão do FG
|
|
136
|
+
: 'defina FG_TRACKER_TOKEN com um token de sessão do FG Track (POST /v1/auth/login → `token`). Para ingestão use FG_TRACKER_API_KEY.');
|
|
137
137
|
case 403:
|
|
138
138
|
throw new TrackApiError(`Sem permissão (403) em ${method} ${path}: ${message}`, 403, path, 'o usuário do FG_TRACKER_TOKEN não é membro deste projeto. Peça a um owner/admin para convidá-lo em /members.');
|
|
139
139
|
case 404:
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/docs.js
CHANGED
|
@@ -6,12 +6,13 @@ export const QUICKSTART_URI = 'fg-tracker://docs/quickstart';
|
|
|
6
6
|
/** @deprecated URI do `stread-track-mcp` ≤ 0.3; ainda registrada como alias, removida na 1.0. */
|
|
7
7
|
export const LEGACY_QUICKSTART_URI = 'stread-track://docs/quickstart';
|
|
8
8
|
export function quickstartMarkdown(endpoint) {
|
|
9
|
-
return `# FG
|
|
9
|
+
return `# FG Track — quickstart
|
|
10
10
|
|
|
11
11
|
APM leve para Node: traces (Express/NestJS/Next.js/Fastify), queries pg, chamadas HTTP de saída, logs e detecção automática de **N+1**, **loops**, **endpoints lentos** e **erros**. API em \`${endpoint}\` (Swagger em \`${endpoint}/docs\`).
|
|
12
12
|
|
|
13
13
|
## 1. Projeto e chave
|
|
14
14
|
- \`track_list_projects\` lista os projetos do usuário do token; \`track_create_project { name }\` cria um e devolve \`apiKey\` (\`stk_...\`).
|
|
15
|
+
- \`track_update_allowed_origins { projectId, origins }\` substitui os domínios permitidos (CORS do SDK de navegador); leia a lista atual em \`track_list_projects\` e confirme com o usuário antes.
|
|
15
16
|
- A chave vai no header \`x-fg-tracker-key\` da ingestão e em \`FG_TRACKER_KEY\` no app instrumentado.
|
|
16
17
|
|
|
17
18
|
## 2. SDK (\`fg-tracker-sdk\`)
|
|
@@ -77,10 +78,11 @@ Kinds de span: \`http.server\` (raiz por request), \`db.query\` (nome = SQL norm
|
|
|
77
78
|
| N_PLUS_ONE | ≥ \`loopThreshold\` (default 10) queries iguais sob o mesmo pai no mesmo trace |
|
|
78
79
|
| LOOP | ≥ \`loopThreshold\` spans \`http.client\`/\`custom\` iguais sob o mesmo pai |
|
|
79
80
|
| SLOW_ENDPOINT | raiz \`http.server\` com \`durationMs > slowThresholdMs\` (default 1000) |
|
|
81
|
+
| UNTRACED_GAP | trecho do request fora de qualquer span, ≥ 200 ms e ≥ 20% da raiz (chamada externa sem instrumentação, loop em memória, serialização ou processo travado) |
|
|
80
82
|
| ERROR | raiz com status ≥ 500 ou \`error != null\` |
|
|
81
83
|
|
|
82
84
|
## 7. Infraestrutura (AWS)
|
|
83
|
-
Prompt \`connect-infrastructure\` guia o fluxo completo: o agente detecta sozinho contas, ambientes e regiões. Nenhuma tool altera recursos na AWS; a única mudança é o stack de conexão, criado com o comando devolvido e só com confirmação do usuário. Mudanças de infra só pelo FG
|
|
85
|
+
Prompt \`connect-infrastructure\` guia o fluxo completo: o agente detecta sozinho contas, ambientes e regiões. Nenhuma tool altera recursos na AWS; a única mudança é o stack de conexão, criado com o comando devolvido e só com confirmação do usuário. Mudanças de infra só pelo FG Track, com aprovação humana.
|
|
84
86
|
0. \`infra_detect_environments { profiles?, includeRegions? }\` — perfis do \`~/.aws\` → conta (STS), ambiente sugerido e regiões em uso (local, somente leitura).
|
|
85
87
|
1. Por ambiente: \`infra_connect_account { projectId, level: 'read'|'operate', environment?, regions?, name?, profile? }\` → template \`./fg-tracker-connection-<ambiente>.json\` + \`aws cloudformation deploy ... --profile --region\` (confirmar com o usuário antes) → \`infra_verify_connection { projectId, connectionId, profile }\`.
|
|
86
88
|
2. \`infra_discover { projectId, regions?, profile? }\` — inventário com credenciais locais (Resource Explorer/Tagging API + CloudFormation) enviado como snapshot.
|
|
@@ -96,9 +98,9 @@ Ranges aceitos: \`15m|1h|6h|24h|7d|30d\`.
|
|
|
96
98
|
export function instrumentProjectPrompt(args, endpoint) {
|
|
97
99
|
const fw = args.framework ? `O usuário indicou o framework **${args.framework}**; confirme lendo o código antes de seguir.` : 'O framework NÃO foi informado: detecte-o.';
|
|
98
100
|
const proj = args.projectName
|
|
99
|
-
? `Use (ou crie) o projeto chamado **${args.projectName}** no FG
|
|
101
|
+
? `Use (ou crie) o projeto chamado **${args.projectName}** no FG Track.`
|
|
100
102
|
: 'Nenhum nome de projeto foi informado: use o nome do pacote (`package.json#name`) ou o nome do diretório.';
|
|
101
|
-
return `Você vai conectar o projeto de código atual ao FG
|
|
103
|
+
return `Você vai conectar o projeto de código atual ao FG Track (APM em ${endpoint}) usando as tools deste servidor MCP. Trabalhe passo a passo, mostre o que fez em cada etapa e só avance quando a anterior estiver ok.
|
|
102
104
|
|
|
103
105
|
${fw} ${proj}
|
|
104
106
|
|
|
@@ -108,7 +110,7 @@ ${fw} ${proj}
|
|
|
108
110
|
|
|
109
111
|
2. **Detectar bancos.** Chame \`track_detect_databases { projectPath, serviceName }\`. Confirme os imports e pontos de criação retornados; siga o adapter de cada driver ativo. Não suponha pg.Pool para Postgres.js, Prisma ou outro driver.
|
|
110
112
|
|
|
111
|
-
2b. **Checar o FG
|
|
113
|
+
2b. **Checar o FG Track.** Chame \`track_status\`. Se a API estiver fora do ar ou faltar \`FG_TRACKER_TOKEN\`, pare e explique ao usuário o que configurar.
|
|
112
114
|
|
|
113
115
|
3. **Escolher ou criar o projeto.** Chame \`track_list_projects\`. Se já existe um projeto com o nome esperado, use-o; senão \`track_create_project { name }\`. Guarde \`projectId\` e \`apiKey\`. Nunca imprima a chave em commits/logs — só em \`.env\` (confira que \`.env\` está no \`.gitignore\`; adicione a variável em \`.env.example\` sem o valor).
|
|
114
116
|
|
package/dist/docs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,8BAA8B,CAAC;AAC7D,iGAAiG;AACjG,MAAM,CAAC,MAAM,qBAAqB,GAAG,gCAAgC,CAAC;AAEtE,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO;;gMAEuL,QAAQ,oBAAoB,QAAQ
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,8BAA8B,CAAC;AAC7D,iGAAiG;AACjG,MAAM,CAAC,MAAM,qBAAqB,GAAG,gCAAgC,CAAC;AAEtE,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO;;gMAEuL,QAAQ,oBAAoB,QAAQ;;;;;;;;;;;oDAWhL,QAAQ;;;;;;;;;;;;;;;;;;;;;wDAqBJ,QAAQ;;;;;;;;;eASjD,QAAQ;;;;;;;;eAQR,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCtB,CAAC;AACF,CAAC;AAOD,MAAM,UAAU,uBAAuB,CAAC,IAA0B,EAAE,QAAgB;IAClF,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,mCAAmC,IAAI,CAAC,SAAS,8CAA8C,CAAC,CAAC,CAAC,2CAA2C,CAAC;IAC1K,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW;QAC3B,CAAC,CAAC,qCAAqC,IAAI,CAAC,WAAW,iBAAiB;QACxE,CAAC,CAAC,0GAA0G,CAAC;IAE/G,OAAO,mEAAmE,QAAQ;;EAElF,EAAE,IAAI,IAAI;;;;;;;;;;;;;;;;;;;;;;;;wFAwB4E,QAAQ;;;;;;yMAMyG,QAAQ,YAAY,QAAQ;;0GAE3H,CAAC;AAC3G,CAAC;AAED,8EAA8E"}
|
package/dist/guide.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export type Framework = (typeof FRAMEWORKS)[number];
|
|
|
8
8
|
export interface GuideInput {
|
|
9
9
|
framework: Framework;
|
|
10
10
|
databaseDriver?: string;
|
|
11
|
-
/** URL base da API do FG
|
|
11
|
+
/** URL base da API do FG Track (endpoint do SDK). */
|
|
12
12
|
endpoint: string;
|
|
13
13
|
/** Chave do projeto; sem ela usa placeholder. */
|
|
14
14
|
apiKey?: string;
|
package/dist/guide.js
CHANGED
|
@@ -23,7 +23,7 @@ function install(extra = []) {
|
|
|
23
23
|
`# npm install ${pkgs} | yarn add ${pkgs}`,
|
|
24
24
|
'```',
|
|
25
25
|
'',
|
|
26
|
-
'> Dentro do monorepo do FG
|
|
26
|
+
'> Dentro do monorepo do FG Track use `"fg-tracker-sdk": "workspace:*"`. Projetos que já usam `stread-track-sdk` só trocam o nome do pacote nos imports (mesma API; as variáveis `STREAD_TRACK_*` continuam lidas como fallback).',
|
|
27
27
|
].join('\n');
|
|
28
28
|
}
|
|
29
29
|
function header(input, title) {
|
|
@@ -34,7 +34,7 @@ function header(input, title) {
|
|
|
34
34
|
else {
|
|
35
35
|
lines.push(`Nenhum projeto informado: o código usa o placeholder \`${PLACEHOLDER_KEY}\`. Crie um projeto com \`track_create_project { name }\` (ou use \`track_list_projects\`) e chame este guia de novo com \`projectId\` para receber a chave real.`);
|
|
36
36
|
}
|
|
37
|
-
lines.push('', `API do FG
|
|
37
|
+
lines.push('', `API do FG Track: \`${input.endpoint}\`.`, '');
|
|
38
38
|
return lines.join('\n');
|
|
39
39
|
}
|
|
40
40
|
function trackerFile(input, path, service) {
|
|
@@ -127,7 +127,7 @@ function logsSection(input, service, logger) {
|
|
|
127
127
|
' format: winston.format.json(),',
|
|
128
128
|
' transports: [',
|
|
129
129
|
' new winston.transports.Console(),',
|
|
130
|
-
' winstonTransport(logShipper), // envia cada log ao FG
|
|
130
|
+
' winstonTransport(logShipper), // envia cada log ao FG Track',
|
|
131
131
|
' ],',
|
|
132
132
|
'});',
|
|
133
133
|
'```',
|
|
@@ -182,7 +182,7 @@ export function buildGuide(input) {
|
|
|
182
182
|
switch (input.framework) {
|
|
183
183
|
case 'express':
|
|
184
184
|
return [
|
|
185
|
-
header(input, 'Instrumentar Express com FG
|
|
185
|
+
header(input, 'Instrumentar Express com FG Track'),
|
|
186
186
|
'## 1. Instalar',
|
|
187
187
|
install(),
|
|
188
188
|
'',
|
|
@@ -226,7 +226,7 @@ export function buildGuide(input) {
|
|
|
226
226
|
].join('\n');
|
|
227
227
|
case 'nestjs':
|
|
228
228
|
return [
|
|
229
|
-
header(input, 'Instrumentar NestJS (platform-express) com FG
|
|
229
|
+
header(input, 'Instrumentar NestJS (platform-express) com FG Track'),
|
|
230
230
|
'## 1. Instalar',
|
|
231
231
|
install(),
|
|
232
232
|
'',
|
|
@@ -297,7 +297,7 @@ export function buildGuide(input) {
|
|
|
297
297
|
].join('\n');
|
|
298
298
|
case 'nextjs':
|
|
299
299
|
return [
|
|
300
|
-
header(input, 'Instrumentar Next.js (App Router, runtime Node) com FG
|
|
300
|
+
header(input, 'Instrumentar Next.js (App Router, runtime Node) com FG Track'),
|
|
301
301
|
'## 1. Instalar',
|
|
302
302
|
install(),
|
|
303
303
|
'',
|
|
@@ -374,7 +374,7 @@ export function buildGuide(input) {
|
|
|
374
374
|
].join('\n');
|
|
375
375
|
case 'fastify':
|
|
376
376
|
return [
|
|
377
|
-
header(input, 'Instrumentar Fastify com FG
|
|
377
|
+
header(input, 'Instrumentar Fastify com FG Track'),
|
|
378
378
|
'O SDK não tem plugin Fastify dedicado; o middleware Express funciona num hook `onRequest` sobre `request.raw`/`reply.raw` (o hook chama `done` dentro do contexto assíncrono do span, então `instrumentPg`, `wrapFetch` e `tracker.span` enxergam o request).',
|
|
379
379
|
'',
|
|
380
380
|
'## 1. Instalar',
|
|
@@ -447,7 +447,7 @@ export function buildGuide(input) {
|
|
|
447
447
|
].join('\n');
|
|
448
448
|
case 'pino':
|
|
449
449
|
return [
|
|
450
|
-
header(input, 'Enviar logs do pino para o FG
|
|
450
|
+
header(input, 'Enviar logs do pino para o FG Track'),
|
|
451
451
|
'## 1. Instalar',
|
|
452
452
|
install(),
|
|
453
453
|
'',
|
|
@@ -468,7 +468,7 @@ export function buildGuide(input) {
|
|
|
468
468
|
].join('\n');
|
|
469
469
|
case 'winston':
|
|
470
470
|
return [
|
|
471
|
-
header(input, 'Enviar logs do winston para o FG
|
|
471
|
+
header(input, 'Enviar logs do winston para o FG Track'),
|
|
472
472
|
'## 1. Instalar',
|
|
473
473
|
install(),
|
|
474
474
|
'',
|
package/dist/guide.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guide.js","sourceRoot":"","sources":["../src/guide.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AAejG,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAE7C,SAAS,QAAQ,CAAC,KAAiB;IACjC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,eAAe,CAAC;IAC5C,OAAO;QACL,SAAS;QACT,+BAA+B;QAC/B,kBAAkB,GAAG,EAAE;QACvB,kBAAkB,KAAK,CAAC,QAAQ,EAAE;QAClC,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,QAAkB,EAAE;IACnC,MAAM,IAAI,GAAG,CAAC,uBAAuB,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3D,OAAO;QACL,SAAS;QACT,YAAY,IAAI,EAAE;QAClB,iBAAiB,IAAI,iBAAiB,IAAI,EAAE;QAC5C,KAAK;QACL,EAAE;QACF,
|
|
1
|
+
{"version":3,"file":"guide.js","sourceRoot":"","sources":["../src/guide.ts"],"names":[],"mappings":"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"}
|
package/dist/infra/handover.d.ts
CHANGED
|
@@ -38,7 +38,7 @@ export interface HandoverEdits {
|
|
|
38
38
|
export declare function buildHandoverEdits(root: string, analysis: IacAnalysis, stackNames: string[]): Promise<HandoverEdits>;
|
|
39
39
|
export declare function formatChanges(edits: HandoverEdits): string;
|
|
40
40
|
export declare function lockFile(ctx: HandoverContext, analysis: IacAnalysis, edits: HandoverEdits): string;
|
|
41
|
-
export declare const GUARD_SCRIPT = "#!/usr/bin/env node\n// Guard do FG
|
|
41
|
+
export declare const GUARD_SCRIPT = "#!/usr/bin/env node\n// Guard do FG Track (gerado por fg-tracker-mcp). Falha o CI se um stack transferido ao FG Track\n// (infra/fg-tracker.lock.json) ou marcado com fg-tracker:owner=true for sintetizado/implantado pelo reposit\u00F3rio.\n// Uso: node scripts/fg-tracker-guard.mjs [--cdk-out <dir>] [--lock <arquivo>] [--aws] [-- <stacks do cdk deploy>]\n// --aws consulta as tags dos stacks sintetizados com `aws cloudformation describe-stacks` (somente leitura).\nimport { existsSync, readFileSync } from 'node:fs';\nimport { spawnSync } from 'node:child_process';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst root = resolve(dirname(fileURLToPath(import.meta.url)), '..');\nconst args = process.argv.slice(2);\nconst flag = (name) => { const i = args.indexOf(name); return i >= 0 ? args[i + 1] : undefined; };\nconst sep = args.indexOf('--');\nconst deployArgs = sep >= 0 ? args.slice(sep + 1).filter((a) => !a.startsWith('-')) : [];\nconst lockPath = resolve(root, flag('--lock') ?? 'infra/fg-tracker.lock.json');\n\nif (!existsSync(lockPath)) {\n console.log('[fg-tracker-guard] sem ' + lockPath + ': nada a verificar.');\n process.exit(0);\n}\nconst lock = JSON.parse(readFileSync(lockPath, 'utf8'));\nconst owned = new Set((lock.stacks ?? []).flatMap((s) => [s.name, s.constructId].filter(Boolean)));\nconst violations = [];\n\n// 1) Stacks passados ao cdk deploy.\nfor (const name of deployArgs) if (owned.has(name)) violations.push('cdk deploy recebeu o stack transferido \"' + name + '\"');\n\n// 2) Assembly sintetizado (cdk.out/manifest.json).\nconst outDirs = new Set([flag('--cdk-out'), process.env.CDK_OUT, ...(lock.cdkApps ?? []).map((a) => join(a.dir, 'cdk.out'))].filter(Boolean).map((d) => resolve(root, d)));\nconst synthesized = [];\nfor (const dir of outDirs) {\n const manifestPath = join(dir, 'manifest.json');\n if (!existsSync(manifestPath)) continue;\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));\n for (const [id, artifact] of Object.entries(manifest.artifacts ?? {})) {\n if (artifact.type !== 'aws:cloudformation:stack') continue;\n const name = artifact.properties?.stackName ?? id;\n const tags = artifact.properties?.tags ?? {};\n synthesized.push({ name, region: artifact.environment?.split('/').pop() });\n if (owned.has(name) || owned.has(id)) violations.push('stack transferido \"' + name + '\" est\u00E1 no app CDK (' + manifestPath + ')');\n else if (tags['fg-tracker:owner'] === 'true') violations.push('stack \"' + name + '\" tem a tag fg-tracker:owner=true');\n }\n}\n\n// 3) C\u00F3digo-fonte do app: reintrodu\u00E7\u00E3o de new XStack(app, 'Nome').\nfor (const app of lock.cdkApps ?? []) {\n for (const file of app.entryFiles ?? []) {\n const path = resolve(root, file);\n if (!existsSync(path)) continue;\n const src = readFileSync(path, 'utf8');\n for (const name of owned) {\n const esc = name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n if (new RegExp(\"new\\\\s+[\\\\w$.]+\\\\s*\\\\(\\\\s*[\\\\w$.]+\\\\s*,\\\\s*['\\\"`]\" + esc + \"['\\\"`]\").test(src) || new RegExp(\"stackName\\\\s*:\\\\s*['\\\"`]\" + esc + \"['\\\"`]\").test(src)) {\n violations.push('stack transferido \"' + name + '\" voltou a ser instanciado em ' + file);\n }\n }\n }\n}\n\n// 4) Opcional: tags dos stacks implantados (somente leitura).\nif (args.includes('--aws')) {\n for (const s of synthesized) {\n const r = spawnSync('aws', ['cloudformation', 'describe-stacks', '--stack-name', s.name, ...(s.region && s.region !== 'unknown-region' ? ['--region', s.region] : []), '--query', 'Stacks[0].Tags', '--output', 'json'], { encoding: 'utf8' });\n if (r.status !== 0) continue;\n const tags = JSON.parse(r.stdout || '[]') ?? [];\n if (tags.some((t) => t.Key === 'fg-tracker:owner' && t.Value === 'true')) violations.push('stack implantado \"' + s.name + '\" \u00E9 controlado pelo FG Track (tag fg-tracker:owner=true)');\n }\n}\n\nif (violations.length) {\n console.error('[fg-tracker-guard] deploy bloqueado:');\n for (const v of [...new Set(violations)]) console.error(' - ' + v);\n console.error('Esses stacks s\u00E3o controlados pelo FG Track (' + (lock.project?.url ?? '') + '). Altere a infra pelo diagrama ou fa\u00E7a a eje\u00E7\u00E3o antes de implant\u00E1-los pelo reposit\u00F3rio.');\n process.exit(1);\n}\nconsole.log('[fg-tracker-guard] ok: nenhum stack do FG Track no deploy (' + owned.size + ' transferido(s)).');\n";
|
|
42
42
|
export declare function handoverDoc(ctx: HandoverContext, edits: HandoverEdits, branch: string): string;
|
|
43
43
|
export declare function handoverReadme(edits: HandoverEdits): string;
|
|
44
44
|
export declare function writeHandoverFiles(root: string, files: Record<string, string>): Promise<Array<{
|
package/dist/infra/handover.js
CHANGED
|
@@ -37,7 +37,7 @@ function entryFileEdits(file, content, stacks, remaining, warnings, changes) {
|
|
|
37
37
|
const [a, b] = s.entryLines;
|
|
38
38
|
for (let i = a - 1; i < b; i++)
|
|
39
39
|
removed.add(i);
|
|
40
|
-
edits.push({ start: a - 1, deleteCount: b - a + 1, insert: [`${indentOf(lines[a - 1] ?? '')}// FG
|
|
40
|
+
edits.push({ start: a - 1, deleteCount: b - a + 1, insert: [`${indentOf(lines[a - 1] ?? '')}// FG Track: stack "${s.name}" transferido ao FG Track (${LOCK_PATH}); código arquivado em ${HANDOVER_DIR}/.`] });
|
|
41
41
|
changes.push({ path: file, kind: 'patch', description: `remove \`new ${s.className ?? 'Stack'}(…, '${s.constructId}')\` (${s.name})`, lines: [a, b] });
|
|
42
42
|
if (s.variable) {
|
|
43
43
|
const v = escapeRe(s.variable);
|
|
@@ -107,9 +107,9 @@ function ciEdits(file, content, commands, names, changes) {
|
|
|
107
107
|
// Nenhum stack restante neste comando.
|
|
108
108
|
const run = /^(\s*-?\s*run:\s*)(.*)$/.exec(line);
|
|
109
109
|
if (run)
|
|
110
|
-
edits.push({ start: idx, deleteCount: 1, insert: [`${run[1]}echo "Stacks transferidos ao FG
|
|
110
|
+
edits.push({ start: idx, deleteCount: 1, insert: [`${run[1]}echo "Stacks transferidos ao FG Track: deploy de infra desativado (${LOCK_PATH})."`] });
|
|
111
111
|
else
|
|
112
|
-
edits.push({ start: idx, deleteCount: 1, insert: [`${indentOf(line)}# FG
|
|
112
|
+
edits.push({ start: idx, deleteCount: 1, insert: [`${indentOf(line)}# FG Track: ${drop.join(', ')} transferido(s) ao FG Track (${LOCK_PATH}).`] });
|
|
113
113
|
continue;
|
|
114
114
|
}
|
|
115
115
|
}
|
|
@@ -127,7 +127,7 @@ function ciEdits(file, content, commands, names, changes) {
|
|
|
127
127
|
else {
|
|
128
128
|
edits.push({ start: idx, deleteCount: 1, insert: [`${indentOf(line)}${guard}`, line] });
|
|
129
129
|
}
|
|
130
|
-
changes.push({ path: file, kind: 'patch', description: `executa o guard do FG
|
|
130
|
+
changes.push({ path: file, kind: 'patch', description: `executa o guard do FG Track antes do \`cdk deploy\``, lines: [cmd.line, cmd.line] });
|
|
131
131
|
}
|
|
132
132
|
return edits;
|
|
133
133
|
}
|
|
@@ -185,20 +185,20 @@ export async function buildHandoverEdits(root, analysis, stackNames) {
|
|
|
185
185
|
const readme = await readText(join(root, readmePath));
|
|
186
186
|
const section = [
|
|
187
187
|
'',
|
|
188
|
-
'## Infraestrutura controlada pelo FG
|
|
188
|
+
'## Infraestrutura controlada pelo FG Track',
|
|
189
189
|
'',
|
|
190
|
-
`Os stacks ${usable.map((s) => `\`${s.name}\``).join(', ')} são controlados pelo FG
|
|
190
|
+
`Os stacks ${usable.map((s) => `\`${s.name}\``).join(', ')} são controlados pelo FG Track (\`${LOCK_PATH}\`).`,
|
|
191
191
|
'',
|
|
192
|
-
'- Mudanças de infraestrutura desses stacks: pelo diagrama do FG
|
|
192
|
+
'- Mudanças de infraestrutura desses stacks: pelo diagrama do FG Track, com aprovação na tela.',
|
|
193
193
|
`- Deploy de código: o CI constrói os artefatos e chama \`${CODE_DEPLOY_COMMAND}\`.`,
|
|
194
194
|
`- O CI roda \`node ${GUARD_PATH}\` e falha se algum stack transferido voltar ao app CDK.`,
|
|
195
|
-
`- Emergência (FG
|
|
195
|
+
`- Emergência (FG Track fora do ar) e ejeção: veja \`${DOC_PATH}\`.`,
|
|
196
196
|
];
|
|
197
197
|
if (readme === null)
|
|
198
198
|
patches.push(unifiedDiff(readmePath, null, [{ start: 0, deleteCount: 0, insert: ['# Infraestrutura', ...section] }]));
|
|
199
|
-
else if (!readme.includes('Infraestrutura controlada pelo FG
|
|
199
|
+
else if (!readme.includes('Infraestrutura controlada pelo FG Track'))
|
|
200
200
|
patches.push(unifiedDiff(readmePath, readme, [{ start: splitLines(readme).lines.length, deleteCount: 0, insert: section }]));
|
|
201
|
-
changes.push({ path: readmePath, kind: 'patch', description: 'seção "Infraestrutura controlada pelo FG
|
|
201
|
+
changes.push({ path: readmePath, kind: 'patch', description: 'seção "Infraestrutura controlada pelo FG Track"' });
|
|
202
202
|
// Arquivamento das classes de stack usadas só pelos stacks transferidos.
|
|
203
203
|
const moves = [];
|
|
204
204
|
for (const s of usable.filter((x) => x.tool === 'cdk')) {
|
|
@@ -254,7 +254,7 @@ export function lockFile(ctx, analysis, edits) {
|
|
|
254
254
|
}, null, 2) + '\n';
|
|
255
255
|
}
|
|
256
256
|
export const GUARD_SCRIPT = `#!/usr/bin/env node
|
|
257
|
-
// Guard do FG
|
|
257
|
+
// Guard do FG Track (gerado por fg-tracker-mcp). Falha o CI se um stack transferido ao FG Track
|
|
258
258
|
// (infra/fg-tracker.lock.json) ou marcado com fg-tracker:owner=true for sintetizado/implantado pelo repositório.
|
|
259
259
|
// Uso: node scripts/fg-tracker-guard.mjs [--cdk-out <dir>] [--lock <arquivo>] [--aws] [-- <stacks do cdk deploy>]
|
|
260
260
|
// --aws consulta as tags dos stacks sintetizados com \`aws cloudformation describe-stacks\` (somente leitura).
|
|
@@ -319,25 +319,25 @@ if (args.includes('--aws')) {
|
|
|
319
319
|
const r = spawnSync('aws', ['cloudformation', 'describe-stacks', '--stack-name', s.name, ...(s.region && s.region !== 'unknown-region' ? ['--region', s.region] : []), '--query', 'Stacks[0].Tags', '--output', 'json'], { encoding: 'utf8' });
|
|
320
320
|
if (r.status !== 0) continue;
|
|
321
321
|
const tags = JSON.parse(r.stdout || '[]') ?? [];
|
|
322
|
-
if (tags.some((t) => t.Key === 'fg-tracker:owner' && t.Value === 'true')) violations.push('stack implantado "' + s.name + '" é controlado pelo FG
|
|
322
|
+
if (tags.some((t) => t.Key === 'fg-tracker:owner' && t.Value === 'true')) violations.push('stack implantado "' + s.name + '" é controlado pelo FG Track (tag fg-tracker:owner=true)');
|
|
323
323
|
}
|
|
324
324
|
}
|
|
325
325
|
|
|
326
326
|
if (violations.length) {
|
|
327
327
|
console.error('[fg-tracker-guard] deploy bloqueado:');
|
|
328
328
|
for (const v of [...new Set(violations)]) console.error(' - ' + v);
|
|
329
|
-
console.error('Esses stacks são controlados pelo FG
|
|
329
|
+
console.error('Esses stacks são controlados pelo FG Track (' + (lock.project?.url ?? '') + '). Altere a infra pelo diagrama ou faça a ejeção antes de implantá-los pelo repositório.');
|
|
330
330
|
process.exit(1);
|
|
331
331
|
}
|
|
332
|
-
console.log('[fg-tracker-guard] ok: nenhum stack do FG
|
|
332
|
+
console.log('[fg-tracker-guard] ok: nenhum stack do FG Track no deploy (' + owned.size + ' transferido(s)).');
|
|
333
333
|
`;
|
|
334
334
|
export function handoverDoc(ctx, edits, branch) {
|
|
335
335
|
const stacks = edits.matched.filter((s) => s.handover !== 'unsupported-terraform');
|
|
336
336
|
const split = stacks.filter((s) => s.handover === 'needs-code-deploy-split');
|
|
337
337
|
return [
|
|
338
|
-
`# Transferência de controle ao FG
|
|
338
|
+
`# Transferência de controle ao FG Track — ${ctx.projectName}`,
|
|
339
339
|
'',
|
|
340
|
-
`Este PR transfere ao FG
|
|
340
|
+
`Este PR transfere ao FG Track o controle dos stacks CloudFormation abaixo. Os stacks mantêm nome e recursos físicos; muda só quem gera e aplica o template. O merge é a confirmação humana; depois dele o FG Track marca os stacks com \`fg-tracker:owner=true\`, aplica a stack policy e roda um change set de verificação que precisa sair vazio.`,
|
|
341
341
|
'',
|
|
342
342
|
'| stack | região | ferramenta | código implantado junto |',
|
|
343
343
|
'|---|---|---|---|',
|
|
@@ -355,7 +355,7 @@ export function handoverDoc(ctx, edits, branch) {
|
|
|
355
355
|
'## Passos do GitHub Actions',
|
|
356
356
|
'',
|
|
357
357
|
'```yaml',
|
|
358
|
-
' - name: Guard FG
|
|
358
|
+
' - name: Guard FG Track',
|
|
359
359
|
` run: node ${GUARD_PATH}`,
|
|
360
360
|
...(split.length
|
|
361
361
|
? [
|
|
@@ -365,16 +365,16 @@ export function handoverDoc(ctx, edits, branch) {
|
|
|
365
365
|
' run: pnpm install --frozen-lockfile && pnpm build',
|
|
366
366
|
]
|
|
367
367
|
: []),
|
|
368
|
-
' - name: Deploy de código pelo FG
|
|
368
|
+
' - name: Deploy de código pelo FG Track',
|
|
369
369
|
' run: npx fg-tracker-release deploy --release ${{ github.sha }}',
|
|
370
370
|
' env:',
|
|
371
371
|
` FG_TRACKER_URL: ${ctx.endpoint}`,
|
|
372
372
|
' FG_TRACKER_KEY: ${{ secrets.FG_TRACKER_KEY }}',
|
|
373
373
|
'```',
|
|
374
374
|
'',
|
|
375
|
-
'## Emergência (FG
|
|
375
|
+
'## Emergência (FG Track indisponível)',
|
|
376
376
|
'',
|
|
377
|
-
'O último template de cada stack fica no bucket S3 de break glass da sua conta (criado pelo stack de conexão). Para operar sem o FG
|
|
377
|
+
'O último template de cada stack fica no bucket S3 de break glass da sua conta (criado pelo stack de conexão). Para operar sem o FG Track:',
|
|
378
378
|
'',
|
|
379
379
|
'```bash',
|
|
380
380
|
'aws cloudformation create-change-set --stack-name <stack> --change-set-name break-glass \\',
|
|
@@ -385,14 +385,14 @@ export function handoverDoc(ctx, edits, branch) {
|
|
|
385
385
|
'',
|
|
386
386
|
'## Ejeção',
|
|
387
387
|
'',
|
|
388
|
-
'A qualquer momento, "Ejetar" no FG
|
|
388
|
+
'A qualquer momento, "Ejetar" no FG Track (`POST /infra/handover/:id/eject`) exporta o estado desejado como app CDK + template e abre um PR que devolve o controle ao repositório; remova a entrada do lock e o guard deixa de bloquear.',
|
|
389
389
|
'',
|
|
390
390
|
...(edits.warnings.length ? ['## Pendências', '', ...edits.warnings.map((w) => `- ${w}`), ''] : []),
|
|
391
391
|
].join('\n');
|
|
392
392
|
}
|
|
393
393
|
export function handoverReadme(edits) {
|
|
394
394
|
return [
|
|
395
|
-
'# Arquivo da transferência ao FG
|
|
395
|
+
'# Arquivo da transferência ao FG Track',
|
|
396
396
|
'',
|
|
397
397
|
'Gerado por `infra_open_handover_pr` (fg-tracker-mcp). Nada foi removido automaticamente.',
|
|
398
398
|
'',
|
|
@@ -407,7 +407,7 @@ export function handoverReadme(edits) {
|
|
|
407
407
|
` Exclua \`${HANDOVER_DIR}\` da compilação (\`"exclude": ["${HANDOVER_DIR}"]\` no tsconfig do app CDK).`,
|
|
408
408
|
'3. Confira: `npx cdk ls` não lista os stacks transferidos e `node scripts/fg-tracker-guard.mjs` passa.',
|
|
409
409
|
'4. Resolva as pendências manuais listadas em `docs/fg-tracker-handover.md`.',
|
|
410
|
-
'5. Após o merge, conclua no FG
|
|
410
|
+
'5. Após o merge, conclua no FG Track (tool `infra_complete_handover` ou botão na tela).',
|
|
411
411
|
'',
|
|
412
412
|
'Stacks:',
|
|
413
413
|
...edits.matched.map((s) => `- ${s.name} (${s.tool}) — ${s.sourceFiles.join(', ')}`),
|