pypeline 1.0.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 (43) hide show
  1. package/README.md +448 -0
  2. package/lib/commands/pypeline/build.d.ts +18 -0
  3. package/lib/commands/pypeline/build.js +86 -0
  4. package/lib/commands/pypeline/build.js.map +1 -0
  5. package/lib/commands/pypeline/deploy/training.d.ts +15 -0
  6. package/lib/commands/pypeline/deploy/training.js +62 -0
  7. package/lib/commands/pypeline/deploy/training.js.map +1 -0
  8. package/lib/commands/pypeline/package.d.ts +11 -0
  9. package/lib/commands/pypeline/package.js +27 -0
  10. package/lib/commands/pypeline/package.js.map +1 -0
  11. package/lib/commands/pypeline/prd.d.ts +16 -0
  12. package/lib/commands/pypeline/prd.js +78 -0
  13. package/lib/commands/pypeline/prd.js.map +1 -0
  14. package/lib/commands/pypeline/quickdeploy.d.ts +18 -0
  15. package/lib/commands/pypeline/quickdeploy.js +116 -0
  16. package/lib/commands/pypeline/quickdeploy.js.map +1 -0
  17. package/lib/commands/pypeline/run.d.ts +19 -0
  18. package/lib/commands/pypeline/run.js +161 -0
  19. package/lib/commands/pypeline/run.js.map +1 -0
  20. package/lib/commands/pypeline/training.d.ts +15 -0
  21. package/lib/commands/pypeline/training.js +67 -0
  22. package/lib/commands/pypeline/training.js.map +1 -0
  23. package/lib/commands/pypeline/validate/prd.d.ts +16 -0
  24. package/lib/commands/pypeline/validate/prd.js +78 -0
  25. package/lib/commands/pypeline/validate/prd.js.map +1 -0
  26. package/lib/config.d.ts +23 -0
  27. package/lib/config.js +72 -0
  28. package/lib/config.js.map +1 -0
  29. package/lib/fileUtils.d.ts +2 -0
  30. package/lib/fileUtils.js +78 -0
  31. package/lib/fileUtils.js.map +1 -0
  32. package/lib/index.d.ts +2 -0
  33. package/lib/index.js +2 -0
  34. package/lib/index.js.map +1 -0
  35. package/messages/pypeline.build.md +16 -0
  36. package/messages/pypeline.deploy.training.md +15 -0
  37. package/messages/pypeline.package.md +8 -0
  38. package/messages/pypeline.quickdeploy.md +22 -0
  39. package/messages/pypeline.run.md +26 -0
  40. package/messages/pypeline.validate.prd.md +15 -0
  41. package/oclif.lock +7808 -0
  42. package/oclif.manifest.json +544 -0
  43. package/package.json +163 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prd.js","sourceRoot":"","sources":["../../../../src/commands/pypeline/validate/prd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export declare const PROJECT_DIR: () => string;
2
+ export declare const LOCAL_DIR: () => string;
3
+ export declare const SCRIPT_DIR: string;
4
+ export declare const PROJECT_NAME = "build_deploy";
5
+ export declare const BRANCH: string;
6
+ export declare const BUILD_DIR: () => string;
7
+ export declare const SOURCE_DIR: () => string;
8
+ export declare const BASELINE_FILE: () => string;
9
+ export declare const JOB_ID_FILE: () => string;
10
+ export declare const LOG_PRD: () => string;
11
+ export declare const LOG_TRAINING: () => string;
12
+ export declare const LOG_QUICK_DEPLOY: () => string;
13
+ export declare function readFileTrimmed(filePath: string): string;
14
+ export declare function writeFile(filePath: string, content: string): void;
15
+ export declare function fileExists(filePath: string): boolean;
16
+ export declare function unlinkIfExists(filePath: string): void;
17
+ export type GitDiff = {
18
+ added: string[];
19
+ modified: string[];
20
+ deleted: string[];
21
+ notDeleted: string[];
22
+ };
23
+ export declare function gitDiffFiles(commitHash: string): GitDiff;
package/lib/config.js ADDED
@@ -0,0 +1,72 @@
1
+ import { execSync } from 'node:child_process';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ // ── Resolução de caminhos em runtime ──────────────────────────────────────
5
+ //
6
+ // IMPORTANTE: todos os caminhos são resolvidos a partir de process.cwd()
7
+ // (o diretório onde o usuário executa o comando sf), NÃO a partir do
8
+ // diretório de instalação do plugin.
9
+ //
10
+ // Isso permite que o plugin seja publicado no npm e instalado em qualquer
11
+ // máquina sem depender de uma estrutura de pastas específica como
12
+ // 'workspace_bash'. O usuário simplesmente executa o comando dentro do
13
+ // diretório do seu projeto git Salesforce.
14
+ // Nome do repositório local Salesforce (pasta irmã do cwd ou configurável)
15
+ const SF_REPO_NAME = process.env['PYPELINE_SF_REPO'] ?? 'sforce-sfdc-bvsa-organization';
16
+ // Diretório de trabalho do usuário no momento da execução
17
+ export const PROJECT_DIR = () => process.cwd();
18
+ export const LOCAL_DIR = () => path.join(process.cwd(), SF_REPO_NAME);
19
+ export const SCRIPT_DIR = path.dirname(new URL(import.meta.url).pathname);
20
+ // ── Nomes e pastas ─────────────────────────────────────────────────────────
21
+ export const PROJECT_NAME = 'build_deploy';
22
+ export const BRANCH = process.env['PYPELINE_BRANCH'] ?? 'release-v4.0.0';
23
+ export const BUILD_DIR = () => path.join(process.cwd(), PROJECT_NAME);
24
+ export const SOURCE_DIR = () => path.join(BUILD_DIR(), 'force-app', 'main', 'default');
25
+ // ── Arquivos de estado ─────────────────────────────────────────────────────
26
+ export const BASELINE_FILE = () => path.join(process.cwd(), 'baseline.txt');
27
+ export const JOB_ID_FILE = () => path.join(process.cwd(), 'prd_job_id.txt');
28
+ // ── Logs ───────────────────────────────────────────────────────────────────
29
+ export const LOG_PRD = () => path.join(process.cwd(), 'deploy_prd_output.log');
30
+ export const LOG_TRAINING = () => path.join(process.cwd(), 'deploy_training_output.log');
31
+ export const LOG_QUICK_DEPLOY = () => path.join(process.cwd(), 'quick_deploy_prd_output.log');
32
+ // ── Utilitários de arquivo ─────────────────────────────────────────────────
33
+ export function readFileTrimmed(filePath) {
34
+ return fs.readFileSync(filePath, 'utf8').trim();
35
+ }
36
+ export function writeFile(filePath, content) {
37
+ fs.writeFileSync(filePath, content, 'utf8');
38
+ }
39
+ export function fileExists(filePath) {
40
+ return fs.existsSync(filePath);
41
+ }
42
+ export function unlinkIfExists(filePath) {
43
+ try {
44
+ fs.unlinkSync(filePath);
45
+ }
46
+ catch { /* noop */ }
47
+ }
48
+ export function gitDiffFiles(commitHash) {
49
+ const output = execSync(`git diff --name-status ${commitHash} HEAD`, { encoding: 'utf8' });
50
+ const added = [];
51
+ const modified = [];
52
+ const deleted = [];
53
+ const notDeleted = [];
54
+ for (const line of output.split('\n')) {
55
+ if (!line.trim())
56
+ continue;
57
+ const [status, ...parts] = line.split('\t');
58
+ const filepath = parts[parts.length - 1];
59
+ if (status.startsWith('D')) {
60
+ deleted.push(filepath);
61
+ }
62
+ else {
63
+ notDeleted.push(filepath);
64
+ if (status.startsWith('A'))
65
+ added.push(filepath);
66
+ else if (status.startsWith('M'))
67
+ modified.push(filepath);
68
+ }
69
+ }
70
+ return { added, modified, deleted, notDeleted };
71
+ }
72
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function cleanFilename(input: string): string;
2
+ export declare function copyFile(file: string, buildDir: string): void;
@@ -0,0 +1,78 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { LOCAL_DIR } from './config.js';
4
+ const SPECIAL_CHARS = {
5
+ '\\\\303\\\\247': 'ç',
6
+ '\\\\303\\\\272': 'ú',
7
+ '\\\\303\\\\243': 'ã',
8
+ '\\\\303\\\\255': 'í',
9
+ '\\\\303\\\\241': 'á',
10
+ '\\\\303\\\\264': 'ô',
11
+ '\\\\303\\\\263': 'ó',
12
+ '\\\\303\\\\251': 'é',
13
+ '\\\\303\\\\265': 'õ',
14
+ };
15
+ function replaceSpecialChars(input) {
16
+ let result = input;
17
+ for (const [escaped, char] of Object.entries(SPECIAL_CHARS)) {
18
+ result = result.replace(new RegExp(escaped, 'g'), char);
19
+ }
20
+ return result;
21
+ }
22
+ export function cleanFilename(input) {
23
+ return replaceSpecialChars(input).replace(/^"|"$/g, '');
24
+ }
25
+ function copyRecursive(src, dst) {
26
+ fs.cpSync(src, dst, { recursive: true, force: true });
27
+ }
28
+ function ensureDir(dirPath) {
29
+ fs.mkdirSync(dirPath, { recursive: true });
30
+ }
31
+ function copyClassMeta(cleanedFile, buildDir) {
32
+ const localDir = LOCAL_DIR();
33
+ const src = path.join(localDir, cleanedFile);
34
+ const dst = path.join(buildDir, cleanedFile);
35
+ ensureDir(path.dirname(dst));
36
+ fs.copyFileSync(src, dst);
37
+ const meta = cleanedFile + '-meta.xml';
38
+ fs.copyFileSync(path.join(localDir, meta), path.join(buildDir, meta));
39
+ }
40
+ function copyExtensionFilePath(file, buildDir) {
41
+ const localDir = LOCAL_DIR();
42
+ const p = path.parse(file);
43
+ const upFile = path.dirname(p.dir);
44
+ const destino = path.dirname(upFile);
45
+ ensureDir(path.join(buildDir, destino));
46
+ copyRecursive(path.join(localDir, upFile), path.join(buildDir, upFile));
47
+ const metaName = `${path.basename(upFile)}.site-meta.xml`;
48
+ const metaSrc = path.join(localDir, destino, metaName);
49
+ if (fs.existsSync(metaSrc)) {
50
+ fs.copyFileSync(metaSrc, path.join(buildDir, destino, metaName));
51
+ }
52
+ }
53
+ function copyComponentsPath(file, buildDir) {
54
+ const localDir = LOCAL_DIR();
55
+ const dirFile = path.dirname(file);
56
+ const upFile = path.dirname(dirFile);
57
+ ensureDir(path.join(buildDir, upFile));
58
+ copyRecursive(path.join(localDir, dirFile), path.join(buildDir, dirFile));
59
+ }
60
+ export function copyFile(file, buildDir) {
61
+ const cleaned = cleanFilename(file);
62
+ if (cleaned.endsWith('.cls') || cleaned.endsWith('.trigger')) {
63
+ copyClassMeta(cleaned, buildDir);
64
+ }
65
+ else if (cleaned.includes('/aura/') || cleaned.includes('/lwc/')) {
66
+ copyComponentsPath(cleaned, buildDir);
67
+ }
68
+ else if (cleaned.includes('/experiences/')) {
69
+ copyExtensionFilePath(cleaned, buildDir);
70
+ }
71
+ else {
72
+ const src = path.join(LOCAL_DIR(), cleaned);
73
+ const dst = path.join(buildDir, cleaned);
74
+ ensureDir(path.dirname(dst));
75
+ fs.copyFileSync(src, dst);
76
+ }
77
+ }
78
+ //# sourceMappingURL=fileUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileUtils.js","sourceRoot":"","sources":["../src/fileUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,aAAa,GAA2B;IAC5C,gBAAgB,EAAE,GAAG;IACrB,gBAAgB,EAAE,GAAG;IACrB,gBAAgB,EAAE,GAAG;IACrB,gBAAgB,EAAE,GAAG;IACrB,gBAAgB,EAAE,GAAG;IACrB,gBAAgB,EAAE,GAAG;IACrB,gBAAgB,EAAE,GAAG;IACrB,gBAAgB,EAAE,GAAG;IACrB,gBAAgB,EAAE,GAAG;CACtB,CAAC;AAEF,SAAS,mBAAmB,CAAC,KAAa;IACxC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC5D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,aAAa,CAAC,GAAW,EAAE,GAAW;IAC7C,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,SAAS,CAAC,OAAe;IAChC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,aAAa,CAAC,WAAmB,EAAE,QAAgB;IAC1D,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC7C,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC;IACvC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY,EAAE,QAAgB;IAC3D,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;IAC7B,MAAM,CAAC,GAAS,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,GAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACxC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC;IAC1D,MAAM,OAAO,GAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACxD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,QAAgB;IACxD,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,MAAM,GAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACvC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,QAAgB;IACrD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACnE,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC7C,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ declare const _default: {};
2
+ export default _default;
package/lib/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export default {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe,EAAE,CAAC"}
@@ -0,0 +1,16 @@
1
+ # summary
2
+ Etapa 1: build e cópia de arquivos modificados desde o baseline.
3
+
4
+ # description
5
+ Lê o baseline.txt, faz git diff, copia os arquivos alterados para a pasta de build e calcula o novo baseline (sem gravar ainda — isso acontece após o validate PRD).
6
+
7
+ # examples
8
+ - <%= config.bin %> pypeline build
9
+ - <%= config.bin %> pypeline build --branch release-v5.0.0
10
+ - <%= config.bin %> pypeline build --dry-run
11
+
12
+ # flags.branch.summary
13
+ Branch git a fazer checkout antes do build.
14
+
15
+ # flags.dry-run.summary
16
+ Simula o build sem copiar arquivos nem executar comandos sf.
@@ -0,0 +1,15 @@
1
+ # summary
2
+ Etapa 3: deploy em Training.
3
+
4
+ # description
5
+ Executa sf project deploy start contra a org de treinamento com RunLocalTests. Grava o output em deploy_training_output.log.
6
+
7
+ # examples
8
+ - <%= config.bin %> pypeline deploy training
9
+ - <%= config.bin %> pypeline deploy training --target-org minha-org-treino --wait 120
10
+
11
+ # flags.target-org.summary
12
+ Alias da org de treinamento (padrão: treino).
13
+
14
+ # flags.wait.summary
15
+ Minutos de espera pelo resultado do deploy (padrão: 240).
@@ -0,0 +1,8 @@
1
+ # summary
2
+ Etapa 2: gera o package.xml a partir da pasta de build.
3
+
4
+ # description
5
+ Executa sf project generate manifest --source-dir sobre o BUILD_DIR gerado pela etapa de build.
6
+
7
+ # examples
8
+ - <%= config.bin %> pypeline package
@@ -0,0 +1,22 @@
1
+ # summary
2
+ Quick deploy em produção usando o Job ID da última validação.
3
+
4
+ # description
5
+ Lê o Job ID gravado em prd_job_id.txt (ou recebe via --job-id) e executa sf project deploy quick. Remove o arquivo após sucesso para evitar reuso. O Job ID expira 10 horas após o validate.
6
+
7
+ # examples
8
+ - <%= config.bin %> pypeline quickdeploy
9
+ - <%= config.bin %> pypeline quickdeploy --job-id 0Af000000000001AAA
10
+ - <%= config.bin %> pypeline quickdeploy --no-prompt
11
+
12
+ # flags.target-org.summary
13
+ Alias da org de produção (padrão: devops).
14
+
15
+ # flags.job-id.summary
16
+ Job ID da validação. Se omitido, lê de prd_job_id.txt.
17
+
18
+ # flags.wait.summary
19
+ Minutos de espera pelo deploy (padrão: 240).
20
+
21
+ # flags.no-prompt.summary
22
+ Pula a confirmação interativa (útil em CI/CD).
@@ -0,0 +1,26 @@
1
+ # summary
2
+ Pipeline completo: build → package.xml → training (paralelo) → validate PRD.
3
+
4
+ # description
5
+ Orquestrador principal. Executa todas as etapas em sequência, com deploy em Training rodando em paralelo ao validate PRD. Em caso de falha, restaura o baseline.txt automaticamente (rollback). Ao final, grava o Job ID em prd_job_id.txt para o quick deploy.
6
+
7
+ # examples
8
+ - <%= config.bin %> pypeline run
9
+ - <%= config.bin %> pypeline run --branch release-v5.0.0
10
+ - <%= config.bin %> pypeline run --skip-training
11
+ - <%= config.bin %> pypeline run --prd-org producao --training-org homolog
12
+
13
+ # flags.branch.summary
14
+ Branch git a usar no build (sobrescreve o valor em config.ts).
15
+
16
+ # flags.skip-training.summary
17
+ Pula o deploy em Training e roda apenas o validate PRD.
18
+
19
+ # flags.dry-run.summary
20
+ Passa --dry-run para a etapa de build (sem copiar arquivos).
21
+
22
+ # flags.prd-org.summary
23
+ Alias da org de produção (padrão: devops).
24
+
25
+ # flags.training-org.summary
26
+ Alias da org de treinamento (padrão: treino).
@@ -0,0 +1,15 @@
1
+ # summary
2
+ Etapa 4: validação em PRD e extração do Job ID.
3
+
4
+ # description
5
+ Executa sf project deploy validate contra a org de produção. Extrai e salva o Job ID em prd_job_id.txt para uso posterior no quick deploy. Grava o output em deploy_prd_output.log.
6
+
7
+ # examples
8
+ - <%= config.bin %> pypeline validate prd
9
+ - <%= config.bin %> pypeline validate prd --target-org producao --wait 300
10
+
11
+ # flags.target-org.summary
12
+ Alias da org de produção (padrão: devops).
13
+
14
+ # flags.wait.summary
15
+ Minutos de espera pela validação (padrão: 240).