@skip-ai/scanner 0.6.0 → 0.7.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.
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,cAAc,GACd,YAAY,GACZ,eAAe,GACf,iBAAiB,GACjB,YAAY,GACZ,cAAc,GACd,aAAa,GACb,aAAa,CAAC;AAElB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAClD,YAAY,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAChD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEjD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAoBpG;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEtE;AAMD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAMjG;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAMpG;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAKvG;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAIzG;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAIrG;AAED,wBAAgB,2BAA2B,IAAI,wBAAwB,CAEtE;AAED,wBAAgB,2BAA2B,IAAI,wBAAwB,CAEtE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAiBjI"}
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,cAAc,GACd,YAAY,GACZ,eAAe,GACf,iBAAiB,GACjB,YAAY,GACZ,cAAc,GACd,aAAa,GACb,aAAa,CAAC;AAElB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAClD,YAAY,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAChD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEjD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAoBpG;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEtE;AAMD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAOjG;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAOpG;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAKvG;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAQzG;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAIrG;AAED,wBAAgB,2BAA2B,IAAI,wBAAwB,CAEtE;AAED,wBAAgB,2BAA2B,IAAI,wBAAwB,CAEtE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAiBjI"}
package/dist/artifacts.js CHANGED
@@ -20,9 +20,9 @@ export function detectArtifactType(filename, payload) {
20
20
  (Array.isArray(payload?.entities) && Array.isArray(payload?.relationships))) {
21
21
  return 'semantic-map';
22
22
  }
23
- if (base === '.skip-report.json' || payload?.navigationMap || payload?.briefing || payload?.routes)
23
+ if (base === '.skip-report.json' || payload?.artifactType === 'report' || payload?.navigationMap || payload?.briefing || payload?.routes)
24
24
  return 'report';
25
- if (base === '.skip-wcag-audit.json' || payload?.artifactType === 'wcag-audit' || payload?.violations || payload?.score) {
25
+ if (base === '.skip-wcag-audit.json' || payload?.artifactType === 'wcag-audit' || payload?.findings || payload?.violations || payload?.score) {
26
26
  return 'wcag-audit';
27
27
  }
28
28
  if (base === 'scan-file-manifest.json' || payload?.artifactType === 'file-manifest')
@@ -47,19 +47,22 @@ function ok(type) {
47
47
  }
48
48
  export function validateReportArtifact(payload) {
49
49
  const errors = [];
50
- if (!payload.navigationMap && !payload.routes && !payload.wcag) {
51
- errors.push('O payload não contém navigationMap, routes nem wcag.');
50
+ if (payload.artifactType && payload.artifactType !== 'report')
51
+ errors.push('artifactType invalido para relatorio.');
52
+ if (!payload.navigationMap && !payload.routes && !payload.wcag && !payload.semanticMapSummary && !payload.wcagSummary) {
53
+ errors.push('O payload nao contem navigationMap, routes nem wcag.');
52
54
  }
53
55
  return { valid: errors.length === 0, errors, warnings: [], artifactType: 'report' };
54
56
  }
55
57
  export function validateWcagAuditArtifact(payload) {
56
58
  const errors = [];
57
59
  if (payload.artifactType && payload.artifactType !== 'wcag-audit')
58
- errors.push('artifactType inválido para auditoria WCAG.');
59
- if (!Array.isArray(payload.violations))
60
- errors.push('violations deve ser array.');
61
- if (typeof payload.score !== 'number')
62
- errors.push('score deve ser number.');
60
+ errors.push('artifactType invalido para auditoria WCAG.');
61
+ if (!Array.isArray(payload.findings) && !Array.isArray(payload.violations))
62
+ errors.push('findings deve ser array.');
63
+ const checks = payload.checks;
64
+ if (!checks || typeof checks.total !== 'number')
65
+ errors.push('checks.total deve ser number.');
63
66
  return { valid: errors.length === 0, errors, warnings: [], artifactType: 'wcag-audit' };
64
67
  }
65
68
  export function validateFileManifestArtifact(payload) {
@@ -72,8 +75,12 @@ export function validateFileManifestArtifact(payload) {
72
75
  }
73
76
  export function validateUploadManifestArtifact(payload) {
74
77
  const errors = [];
75
- if (!Array.isArray(payload.artifacts))
76
- errors.push('artifacts deve ser array.');
78
+ const files = Array.isArray(payload.files) ? payload.files : Array.isArray(payload.artifacts) ? payload.artifacts : undefined;
79
+ if (!files)
80
+ errors.push('files deve ser array.');
81
+ if (files && typeof payload.expectedFileCount === 'number' && payload.expectedFileCount !== files.length) {
82
+ errors.push('expectedFileCount diverge de files.length.');
83
+ }
77
84
  return { valid: errors.length === 0, errors, warnings: [], artifactType: 'upload-manifest' };
78
85
  }
79
86
  export function validateValidationArtifact(payload) {
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -2,6 +2,7 @@ export declare function maskToken(token: string): string;
2
2
  export declare function resolveToken(cliToken: string | undefined): string;
3
3
  export interface SendOptions {
4
4
  file: string[];
5
+ dir?: string;
5
6
  type?: string;
6
7
  scanId?: string;
7
8
  token: string;
@@ -20,6 +21,10 @@ export interface ScanOptions {
20
21
  validateSam: boolean;
21
22
  send: boolean;
22
23
  outputDir?: string;
24
+ app?: string;
25
+ noUpload: boolean;
26
+ keepFailedArtifacts: boolean;
27
+ cleanFailedArtifacts: boolean;
23
28
  }
24
29
  export declare const DEFAULT_BASE_URL = "https://app.goskip.dev";
25
30
  export declare function parseCli(argv?: string[]): {
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEjE;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,gBAAgB,2BAA2B,CAAC;AAOzD,wBAAgB,QAAQ,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG;IAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,GAAG,WAAW,CAAA;CAAE,CAkErH"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEjE;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,eAAO,MAAM,gBAAgB,2BAA2B,CAAC;AAOzD,wBAAgB,QAAQ,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG;IAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,GAAG,WAAW,CAAA;CAAE,CA2ErH"}
package/dist/cli.js CHANGED
@@ -24,6 +24,7 @@ export function parseCli(argv = process.argv) {
24
24
  .command('send', { isDefault: true })
25
25
  .description('Envia um ou mais artefatos já gerados para o Skip Cloud.')
26
26
  .option('-f, --file <path>', 'Arquivo JSON de artefato (pode repetir)', collect, [])
27
+ .option('--dir <dir>', 'Diretório de scan contendo os artefatos obrigatórios')
27
28
  .option('--type <type>', 'Tipo do artefato (ex.: semantic-map)')
28
29
  .option('--scan-id <scanId>', 'Scan ID esperado para validar envio isolado')
29
30
  .option('-t, --token <token>', 'Token do projeto (ou defina SKIP_TOKEN no ambiente)')
@@ -41,6 +42,12 @@ export function parseCli(argv = process.argv) {
41
42
  .option('--generate-sam', 'Gera um novo .skip-sam.json a partir do scan atual', false)
42
43
  .option('--validate-sam', 'Valida o .skip-sam.json gerado no scan atual', false)
43
44
  .option('--send', 'Envia todos os artefatos do scan atual', false)
45
+ .option('--app <path>', 'Caminho da aplicação dentro do workspace/monorepo')
46
+ .option('--generate-wcag', 'Gera .skip-wcag-audit.json', true)
47
+ .option('--validate', 'Valida todos os artefatos gerados', false)
48
+ .option('--no-upload', 'Não faz upload, mesmo quando --send for informado', false)
49
+ .option('--keep-failed-artifacts', 'Preserva diagnósticos e snapshots em caso de falha', true)
50
+ .option('--clean-failed-artifacts', 'Remove artefatos de falha após erro', false)
44
51
  .option('--output-dir <dir>', 'Diretório de saída dos artefatos')
45
52
  .option('--dry-run', 'Executa o scan sem enviar para a plataforma', false)
46
53
  .option('-v, --verbose', 'Exibir detalhes do scan no terminal', false)
@@ -57,8 +64,8 @@ export function parseCli(argv = process.argv) {
57
64
  }
58
65
  if (commandName === 'send') {
59
66
  const sendOpts = opts;
60
- if (!sendOpts.file.length) {
61
- program.error('erro: informe ao menos um --file=<ARQUIVO>.', { exitCode: 1 });
67
+ if (!sendOpts.file.length && !sendOpts.dir) {
68
+ program.error('erro: informe --dir=<DIRETÓRIO> ou ao menos um --file=<ARQUIVO>.', { exitCode: 1 });
62
69
  }
63
70
  sendOpts.token = resolveToken(sendOpts.token);
64
71
  if (!sendOpts.token) {
@@ -69,6 +76,9 @@ export function parseCli(argv = process.argv) {
69
76
  const scanOpts = opts;
70
77
  scanOpts.token = resolveToken(scanOpts.token);
71
78
  scanOpts.generateSam = true;
79
+ scanOpts.keepFailedArtifacts = !scanOpts.cleanFailedArtifacts;
80
+ if (scanOpts.noUpload)
81
+ scanOpts.send = false;
72
82
  if (scanOpts.send)
73
83
  scanOpts.dryRun = false;
74
84
  if (scanOpts.send && !scanOpts.token) {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAA4B;IACvD,OAAO,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;AAClD,CAAC;AAyBD,MAAM,CAAC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAEzD,SAAS,OAAO,CAAC,KAAa,EAAE,QAAkB;IAChD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAiB,OAAO,CAAC,IAAI;IACpD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;SAC1B,IAAI,CAAC,cAAc,CAAC;SACpB,WAAW,CAAC,2DAA2D,CAAC;SACxE,OAAO,CAAC,WAAW,CAAC,CAAC;IAExB,OAAO;SACJ,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACpC,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CAAC,mBAAmB,EAAE,yCAAyC,EAAE,OAAO,EAAE,EAAE,CAAC;SACnF,MAAM,CAAC,eAAe,EAAE,sCAAsC,CAAC;SAC/D,MAAM,CAAC,oBAAoB,EAAE,6CAA6C,CAAC;SAC3E,MAAM,CAAC,qBAAqB,EAAE,qDAAqD,CAAC;SACpF,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,CAAC;SAChE,MAAM,CAAC,cAAc,EAAE,sCAAsC,EAAE,KAAK,CAAC;SACrE,MAAM,CAAC,eAAe,EAAE,6BAA6B,EAAE,KAAK,CAAC;SAC7D,MAAM,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEpB,OAAO;SACJ,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CAAC,kFAAkF,CAAC;SAC/F,MAAM,CAAC,qBAAqB,EAAE,mEAAmE,CAAC;SAClG,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,CAAC;SAChE,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SACrE,MAAM,CAAC,4BAA4B,EAAE,kCAAkC,EAAE,EAAE,CAAC;SAC5E,MAAM,CAAC,gBAAgB,EAAE,oDAAoD,EAAE,KAAK,CAAC;SACrF,MAAM,CAAC,gBAAgB,EAAE,8CAA8C,EAAE,KAAK,CAAC;SAC/E,MAAM,CAAC,QAAQ,EAAE,wCAAwC,EAAE,KAAK,CAAC;SACjE,MAAM,CAAC,oBAAoB,EAAE,kCAAkC,CAAC;SAChE,MAAM,CAAC,WAAW,EAAE,6CAA6C,EAAE,KAAK,CAAC;SACzE,MAAM,CAAC,eAAe,EAAE,qCAAqC,EAAE,KAAK,CAAC;SACrE,MAAM,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEpB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEpB,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,WAAW,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAA8B,CAAC;IAElE,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,IAAoB,CAAC,GAAG,GAAG,WAAW,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAmB,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,QAAQ,CAAC,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,gFAAgF,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QACnH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,IAAmB,CAAC;QACrC,QAAQ,CAAC,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9C,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;QAC5B,IAAI,QAAQ,CAAC,IAAI;YAAE,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;QAC3C,IAAI,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,yEAAyE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -19,7 +19,15 @@ import { appendHistory } from './scanner/history.js';
19
19
  import { buildReport, maskReportSecrets, CLI_VERSION } from './reporter.js';
20
20
  import { DEFAULT_IGNORE_PATTERNS } from './scanner/ignore.js';
21
21
  import { buildScanArtifact, detectArtifactType, loadJsonFile, validateFileManifestArtifact, validateReportArtifact, validateUploadManifestArtifact, validateValidationArtifact, validateWcagAuditArtifact, } from './artifacts.js';
22
- import { buildSemanticApplicationMap, createFileManifest, validateSamArtifact, writeSkipSamFile, } from './sam.js';
22
+ import { buildSemanticApplicationMap, createFileManifest, normalizeSemanticApplicationMap, validateSamArtifact, writeSkipSamFile, } from './sam.js';
23
+ const REQUIRED_ARTIFACTS = [
24
+ '.skip-report.json',
25
+ '.skip-sam.json',
26
+ '.skip-wcag-audit.json',
27
+ 'scan-file-manifest.json',
28
+ 'upload-manifest.json',
29
+ 'scan-validation.json',
30
+ ];
23
31
  function colorScore(score) {
24
32
  const c = scoreColor(score);
25
33
  if (c === 'green')
@@ -37,6 +45,50 @@ function writeJson(filePath, value) {
37
45
  fs.mkdirSync(path.dirname(filePath), { recursive: true });
38
46
  fs.writeFileSync(filePath, JSON.stringify(value, null, 2));
39
47
  }
48
+ function appendLog(outputDir, message) {
49
+ fs.mkdirSync(outputDir, { recursive: true });
50
+ fs.appendFileSync(path.join(outputDir, 'scanner.log'), `${new Date().toISOString()} ${message}\n`);
51
+ }
52
+ function safeRelative(from, to) {
53
+ return path.relative(from, to).replace(/\\/g, '/') || '.';
54
+ }
55
+ function discoverApplicationRoots(workspaceRoot) {
56
+ const candidates = ['.', 'apps/*', 'packages/*'];
57
+ const roots = new Set();
58
+ for (const pattern of candidates) {
59
+ const base = pattern.endsWith('/*') ? pattern.slice(0, -2) : pattern;
60
+ const absBase = path.join(workspaceRoot, base);
61
+ if (!fs.existsSync(absBase))
62
+ continue;
63
+ if (pattern === '.') {
64
+ if (fs.existsSync(path.join(workspaceRoot, 'package.json')))
65
+ roots.add(workspaceRoot);
66
+ continue;
67
+ }
68
+ for (const name of fs.readdirSync(absBase)) {
69
+ const dir = path.join(absBase, name);
70
+ if (fs.statSync(dir).isDirectory() && fs.existsSync(path.join(dir, 'package.json')))
71
+ roots.add(dir);
72
+ }
73
+ }
74
+ return [...roots];
75
+ }
76
+ function selectApplicationRoot(workspaceRoot, app) {
77
+ if (app)
78
+ return path.resolve(workspaceRoot, app);
79
+ const roots = discoverApplicationRoots(workspaceRoot);
80
+ const frontend = roots.find((root) => {
81
+ try {
82
+ const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf-8'));
83
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
84
+ return Boolean(deps.next || deps.vite || deps.react || deps.vue || deps['react-router-dom']);
85
+ }
86
+ catch {
87
+ return false;
88
+ }
89
+ });
90
+ return frontend ?? workspaceRoot;
91
+ }
40
92
  function validateArtifactByType(filePath, type, context) {
41
93
  const payload = loadJsonFile(filePath);
42
94
  if (type === 'semantic-map')
@@ -54,6 +106,13 @@ function validateArtifactByType(filePath, type, context) {
54
106
  return { valid: true, errors: [], warnings: [], artifactType: type };
55
107
  }
56
108
  async function sendMode(opts) {
109
+ if (opts.dir) {
110
+ const dir = path.resolve(opts.dir);
111
+ const missing = REQUIRED_ARTIFACTS.filter((file) => !fs.existsSync(path.join(dir, file)));
112
+ if (missing.length)
113
+ throw new Error(`Upload parcial bloqueado. Artefatos ausentes em ${dir}:\n${missing.join('\n')}`);
114
+ opts.file = REQUIRED_ARTIFACTS.map((file) => path.join(dir, file));
115
+ }
57
116
  console.log(banner(CLI_VERSION));
58
117
  console.log(chalk.dim(' Modo: send (artefatos)'));
59
118
  console.log(chalk.dim(` Plataforma: ${opts.url}`));
@@ -93,38 +152,60 @@ async function sendMode(opts) {
93
152
  schemaVersion: '1.0.0',
94
153
  artifactType: 'upload-manifest',
95
154
  scanId: expectedScanId ?? artifacts[0].scanId,
155
+ expectedFileCount: artifacts.length,
156
+ files: artifacts.map(({ absolutePath, ...artifact }) => artifact),
96
157
  artifacts: artifacts.map(({ absolutePath, ...artifact }) => artifact),
97
158
  };
159
+ console.log(`Artefatos preparados: ${artifacts.length}`);
160
+ for (const artifact of artifacts)
161
+ console.log(`✓ ${artifact.filename}`);
98
162
  const uploadSpinner = spinner('Enviando artefatos para o Skip Cloud...');
99
163
  const result = await uploadArtifactBundle(artifacts, opts.token, opts.url, manifest);
100
164
  uploadSpinner.succeed(`Artefatos enviados e confirmados. Scan ID: ${chalk.yellow(result.scanId)}`);
101
165
  }
102
166
  async function scanMode(opts) {
103
167
  console.log(banner(CLI_VERSION));
104
- const rootDir = path.resolve(opts.dir);
105
- const outputDir = path.resolve(opts.outputDir ?? rootDir);
168
+ const workspaceRoot = path.resolve(opts.dir);
169
+ const applicationRoot = selectApplicationRoot(workspaceRoot, opts.app);
106
170
  const scanId = createScanId();
171
+ const outputDir = path.resolve(opts.outputDir ?? path.join(workspaceRoot, '.skip-output', scanId));
107
172
  const startedAt = new Date().toISOString();
108
173
  const ignorePatterns = [...DEFAULT_IGNORE_PATTERNS, ...opts.ignore];
109
174
  console.log(chalk.dim(' Modo: scan'));
110
- console.log(chalk.dim(` Diretório: ${rootDir}`));
175
+ console.log(chalk.dim(` Diretorio: ${workspaceRoot}`));
176
+ console.log(chalk.dim(` Aplicacao: ${applicationRoot}`));
111
177
  console.log(chalk.dim(` Output: ${outputDir}`));
112
178
  console.log(chalk.dim(` Plataforma: ${opts.url}`));
113
179
  console.log(chalk.dim(` Scan ID: ${scanId}\n`));
114
180
  console.log('[1/10] Detectando projeto');
115
- const signature = detectProject(rootDir);
116
- const projectName = path.basename(rootDir);
181
+ fs.mkdirSync(outputDir, { recursive: true });
182
+ appendLog(outputDir, `[SAM] Scanner version: ${CLI_VERSION}`);
183
+ appendLog(outputDir, `[SAM] Project root: ${workspaceRoot}`);
184
+ appendLog(outputDir, `[SAM] Workspace root: ${workspaceRoot}`);
185
+ appendLog(outputDir, `[SAM] Application roots: ${discoverApplicationRoots(workspaceRoot).map((root) => safeRelative(workspaceRoot, root)).join(', ')}`);
186
+ const signature = detectProject(applicationRoot);
187
+ const projectName = path.basename(applicationRoot);
117
188
  console.log('[2/10] Descobrindo arquivos');
118
- const fileManifest = await createFileManifest(rootDir, ignorePatterns);
189
+ const fileManifest = await createFileManifest(applicationRoot, ignorePatterns);
190
+ appendLog(outputDir, `[SAM] Files discovered: ${fileManifest.files.length}`);
191
+ appendLog(outputDir, `[SAM] Source files included: ${fileManifest.files.filter((file) => /\.(tsx?|jsx?|html|vue|svelte|astro)$/.test(file.path)).length}`);
192
+ const fileManifestPayload = { schemaVersion: '1.0.0', artifactType: 'file-manifest', scanId, files: fileManifest.files, sha256: fileManifest.sha256 };
193
+ writeJson(path.join(outputDir, 'scan-file-manifest.json'), fileManifestPayload);
119
194
  console.log('[3/10] Detectando rotas e telas');
120
- const routes = await extractRoutes(rootDir, signature.srcDir, ignorePatterns);
121
- const navigationMap = await extractNavigation(rootDir, opts.ignore, {
195
+ const routes = await extractRoutes(applicationRoot, signature.srcDir, ignorePatterns);
196
+ appendLog(outputDir, `[SAM] Route files: ${routes.map((route) => route.physicalPath).join(', ')}`);
197
+ appendLog(outputDir, `[SAM] Routes detected: ${routes.length}`);
198
+ const navigationMap = await extractNavigation(applicationRoot, opts.ignore, {
122
199
  pagesRoutes: routes.map((r) => ({ physicalPath: r.physicalPath, logicalRoute: r.logicalRoute })),
123
200
  srcDir: signature.srcDir,
124
201
  });
202
+ appendLog(outputDir, `[SAM] Screens detected: ${navigationMap.screens.length}`);
125
203
  console.log('[4/10] Analisando componentes');
126
- const { components, events } = await extractComponents(rootDir, opts.ignore);
127
- const apiCalls = await extractApiCalls(rootDir, opts.ignore);
204
+ const { components, events } = await extractComponents(applicationRoot, opts.ignore);
205
+ const apiCalls = await extractApiCalls(applicationRoot, opts.ignore);
206
+ appendLog(outputDir, `[SAM] Components detected: ${components.length}`);
207
+ appendLog(outputDir, `[SAM] Interactive elements detected: ${navigationMap.screens.reduce((acc, screen) => acc + screen.actions.length, 0)}`);
208
+ appendLog(outputDir, `[SAM] Candidate entities: ${routes.length + navigationMap.screens.length + components.length + apiCalls.length}`);
128
209
  const briefing = buildBriefing(navigationMap);
129
210
  const widgetSnippet = buildWidgetSnippet();
130
211
  const guidedFlows = detectGuidedFlows(navigationMap);
@@ -132,7 +213,9 @@ async function scanMode(opts) {
132
213
  let sam = buildSemanticApplicationMap({
133
214
  scanId,
134
215
  startedAt,
135
- rootDir,
216
+ rootDir: applicationRoot,
217
+ workspaceRoot,
218
+ applicationRoot,
136
219
  signature,
137
220
  routes,
138
221
  components,
@@ -143,6 +226,23 @@ async function scanMode(opts) {
143
226
  sourceManifestSha256: fileManifest.sha256,
144
227
  projectName,
145
228
  });
229
+ sam = normalizeSemanticApplicationMap(sam);
230
+ appendLog(outputDir, `[SAM] Normalized entities: ${sam.entities.length}`);
231
+ appendLog(outputDir, `[SAM] Discarded entities: 0`);
232
+ appendLog(outputDir, `[SAM] Generated IDs: ${sam.entities.filter((entity) => entity.id).length}`);
233
+ appendLog(outputDir, `[SAM] Entities sent to validator: ${sam.entities.length}`);
234
+ appendLog(outputDir, `[SAM] Relationships sent to validator: ${sam.relationships.length}`);
235
+ writeJson(path.join(outputDir, '.skip-sam.invalid.json'), sam);
236
+ const validatorInputSummary = {
237
+ keys: Object.keys(sam),
238
+ artifactType: sam.artifactType,
239
+ scanId: sam.scanId,
240
+ entitiesType: Array.isArray(sam.entities) ? 'array' : typeof sam.entities,
241
+ entitiesCount: sam.entities.length,
242
+ relationshipsType: Array.isArray(sam.relationships) ? 'array' : typeof sam.relationships,
243
+ relationshipsCount: sam.relationships.length,
244
+ };
245
+ appendLog(outputDir, `[SAM] Validator input: ${JSON.stringify(validatorInputSummary)}`);
146
246
  console.log('[6/10] Validando `.skip-sam.json`');
147
247
  const samValidation = validateSamArtifact(sam, {
148
248
  currentScanId: scanId,
@@ -154,15 +254,51 @@ async function scanMode(opts) {
154
254
  sam.validation = { valid: samValidation.valid, errors: samValidation.errors, warnings: samValidation.warnings };
155
255
  if (!samValidation.valid) {
156
256
  sam.status = sam.status === 'complete' ? 'partial' : sam.status;
257
+ writeJson(path.join(outputDir, 'scanner-diagnostics.json'), {
258
+ schemaVersion: '1.0.0',
259
+ artifactType: 'diagnostics',
260
+ scanId,
261
+ scannerVersion: CLI_VERSION,
262
+ projectRoot: workspaceRoot,
263
+ workspaceRoot,
264
+ applicationRoots: discoverApplicationRoots(workspaceRoot).map((root) => safeRelative(workspaceRoot, root)),
265
+ applicationRoot,
266
+ filesDiscovered: fileManifest.files.length,
267
+ sourceFilesIncluded: fileManifest.files.filter((file) => /\.(tsx?|jsx?|html|vue|svelte|astro)$/.test(file.path)).length,
268
+ routeFilesDetected: routes.map((route) => route.physicalPath),
269
+ routesDetected: routes.length,
270
+ screensDetected: navigationMap.screens.length,
271
+ componentsDetected: components.length,
272
+ interactiveElementsDetected: navigationMap.screens.reduce((acc, screen) => acc + screen.actions.length, 0),
273
+ apisDetected: apiCalls.length,
274
+ flowsDetected: guidedFlows.length,
275
+ candidateEntities: routes.length + navigationMap.screens.length + components.length + apiCalls.length,
276
+ normalizedEntities: sam.entities.length,
277
+ discardedEntities: 0,
278
+ generatedEntityIds: sam.entities.filter((entity) => entity.id).length,
279
+ entitiesSentToValidator: sam.entities.length,
280
+ relationshipsSentToValidator: sam.relationships.length,
281
+ validatorInputSummary,
282
+ validationErrors: samValidation.errors,
283
+ });
284
+ writeJson(path.join(outputDir, 'scan-validation.json'), {
285
+ schemaVersion: '1.0.0',
286
+ artifactType: 'validation',
287
+ scanId,
288
+ valid: false,
289
+ generatedAt: new Date().toISOString(),
290
+ errors: samValidation.errors,
291
+ });
157
292
  if (opts.validateSam)
158
293
  throw new Error(`Falha ao validar .skip-sam.json:\n${samValidation.errors.join('\n')}`);
159
294
  }
160
295
  const samPath = writeSkipSamFile(outputDir, sam);
296
+ fs.rmSync(path.join(outputDir, '.skip-sam.invalid.json'), { force: true });
161
297
  console.log('[7/10] Gerando auditoria WCAG');
162
298
  const contentsByFile = {};
163
299
  for (const s of navigationMap.screens) {
164
300
  try {
165
- contentsByFile[s.filePath] = fs.readFileSync(path.join(rootDir, s.filePath), 'utf-8');
301
+ contentsByFile[s.filePath] = fs.readFileSync(path.join(applicationRoot, s.filePath), 'utf-8');
166
302
  }
167
303
  catch {
168
304
  contentsByFile[s.filePath] = '';
@@ -190,7 +326,7 @@ async function scanMode(opts) {
190
326
  minor: summary.minor,
191
327
  unknown: summary.unknown,
192
328
  };
193
- const history = appendHistory(rootDir, historyEntry);
329
+ const history = appendHistory(applicationRoot, historyEntry);
194
330
  const uniqueFiles = new Set([
195
331
  ...routes.map((r) => r.physicalPath),
196
332
  ...components.map((c) => c.filepath),
@@ -221,10 +357,27 @@ async function scanMode(opts) {
221
357
  components: sam.stats.components,
222
358
  coverage: sam.coverage.percentage,
223
359
  };
224
- const wcagPayload = { schemaVersion: '1.0.0', artifactType: 'wcag-audit', scanId, ...wcag };
225
- const fileManifestPayload = { schemaVersion: '1.0.0', artifactType: 'file-manifest', scanId, files: fileManifest.files, sha256: fileManifest.sha256 };
360
+ rawReport.artifactType = 'report';
361
+ rawReport.schemaVersion = '1.0.0';
362
+ rawReport.generatedAt = new Date().toISOString();
363
+ rawReport.framework = signature.framework;
364
+ rawReport.language = signature.language;
365
+ rawReport.wcagSummary = summary;
366
+ const wcagPayload = {
367
+ schemaVersion: '1.0.0',
368
+ artifactType: 'wcag-audit',
369
+ scanId,
370
+ generatedAt: wcag.auditedAt,
371
+ status: 'complete',
372
+ findings: violations,
373
+ checks: { total: checks.total, passed: checks.passed, failed: checks.failed, incomplete: checks.needsReview, inapplicable: 0, needsReview: checks.needsReview },
374
+ summary,
375
+ violations,
376
+ score,
377
+ level,
378
+ rulesVersion: WCAG_RULES_VERSION,
379
+ };
226
380
  writeJson(path.join(outputDir, '.skip-wcag-audit.json'), wcagPayload);
227
- writeJson(path.join(outputDir, 'scan-file-manifest.json'), fileManifestPayload);
228
381
  const samArtifact = buildScanArtifact(outputDir, '.skip-sam.json', 'semantic-map', scanId);
229
382
  rawReport.relatedArtifacts = [
230
383
  {
@@ -241,28 +394,46 @@ async function scanMode(opts) {
241
394
  if (secretsFound > 0)
242
395
  console.log(chalk.yellow(`${secretsFound} possível(eis) secret(s) mascarado(s) antes do envio.`));
243
396
  writeJson(path.join(outputDir, '.skip-report.json'), report);
397
+ writeJson(path.join(outputDir, 'scanner-diagnostics.json'), {
398
+ schemaVersion: '1.0.0',
399
+ artifactType: 'diagnostics',
400
+ scanId,
401
+ scannerVersion: CLI_VERSION,
402
+ projectRoot: workspaceRoot,
403
+ workspaceRoot,
404
+ applicationRoots: discoverApplicationRoots(workspaceRoot).map((root) => safeRelative(workspaceRoot, root)),
405
+ applicationRoot,
406
+ filesDiscovered: fileManifest.files.length,
407
+ sourceFilesIncluded: fileManifest.files.filter((file) => /\.(tsx?|jsx?|html|vue|svelte|astro)$/.test(file.path)).length,
408
+ routeFilesDetected: routes.map((route) => route.physicalPath),
409
+ routesDetected: routes.length,
410
+ screensDetected: navigationMap.screens.length,
411
+ componentsDetected: components.length,
412
+ interactiveElementsDetected: navigationMap.screens.reduce((acc, screen) => acc + screen.actions.length, 0),
413
+ apisDetected: apiCalls.length,
414
+ flowsDetected: guidedFlows.length,
415
+ candidateEntities: routes.length + navigationMap.screens.length + components.length + apiCalls.length,
416
+ normalizedEntities: sam.entities.length,
417
+ discardedEntities: 0,
418
+ generatedEntityIds: sam.entities.filter((entity) => entity.id).length,
419
+ entitiesSentToValidator: sam.entities.length,
420
+ relationshipsSentToValidator: sam.relationships.length,
421
+ validatorInputSummary,
422
+ });
244
423
  console.log('[8/10] Validando artefatos');
245
- const baseArtifacts = [
424
+ const firstArtifacts = [
246
425
  buildScanArtifact(outputDir, '.skip-report.json', 'report', scanId),
247
426
  samArtifact,
248
427
  buildScanArtifact(outputDir, '.skip-wcag-audit.json', 'wcag-audit', scanId),
249
428
  buildScanArtifact(outputDir, 'scan-file-manifest.json', 'file-manifest', scanId),
250
429
  ];
251
- const uploadManifestPayload = {
252
- schemaVersion: '1.0.0',
253
- artifactType: 'upload-manifest',
254
- scanId,
255
- artifacts: baseArtifacts.map(({ absolutePath, ...artifact }) => artifact),
256
- };
257
- writeJson(path.join(outputDir, 'upload-manifest.json'), uploadManifestPayload);
258
- const uploadArtifact = buildScanArtifact(outputDir, 'upload-manifest.json', 'upload-manifest', scanId);
259
430
  const validationPayload = {
260
431
  schemaVersion: '1.0.0',
261
432
  artifactType: 'validation',
262
433
  scanId,
263
434
  valid: true,
264
435
  generatedAt: new Date().toISOString(),
265
- artifacts: [...baseArtifacts, uploadArtifact].map((artifact) => ({
436
+ artifacts: firstArtifacts.map((artifact) => ({
266
437
  filename: artifact.filename,
267
438
  artifactType: artifact.artifactType,
268
439
  valid: true,
@@ -270,7 +441,28 @@ async function scanMode(opts) {
270
441
  })),
271
442
  };
272
443
  writeJson(path.join(outputDir, 'scan-validation.json'), validationPayload);
273
- const artifacts = [...baseArtifacts, uploadArtifact, buildScanArtifact(outputDir, 'scan-validation.json', 'validation', scanId)];
444
+ const validationArtifact = buildScanArtifact(outputDir, 'scan-validation.json', 'validation', scanId);
445
+ const provisionalArtifacts = [...firstArtifacts, validationArtifact];
446
+ const uploadManifestPayload = {
447
+ schemaVersion: '1.0.0',
448
+ artifactType: 'upload-manifest',
449
+ scanId,
450
+ createdAt: new Date().toISOString(),
451
+ expectedFileCount: REQUIRED_ARTIFACTS.length,
452
+ files: provisionalArtifacts.map(({ absolutePath, ...artifact }) => artifact),
453
+ artifacts: provisionalArtifacts.map(({ absolutePath, ...artifact }) => artifact),
454
+ };
455
+ writeJson(path.join(outputDir, 'upload-manifest.json'), uploadManifestPayload);
456
+ let uploadArtifact = buildScanArtifact(outputDir, 'upload-manifest.json', 'upload-manifest', scanId);
457
+ let artifacts = [...firstArtifacts, uploadArtifact, validationArtifact];
458
+ const finalUploadManifestPayload = {
459
+ ...uploadManifestPayload,
460
+ files: artifacts.map(({ absolutePath, ...artifact }) => artifact),
461
+ artifacts: artifacts.map(({ absolutePath, ...artifact }) => artifact),
462
+ };
463
+ writeJson(path.join(outputDir, 'upload-manifest.json'), finalUploadManifestPayload);
464
+ uploadArtifact = buildScanArtifact(outputDir, 'upload-manifest.json', 'upload-manifest', scanId);
465
+ artifacts = [...firstArtifacts, uploadArtifact, validationArtifact];
274
466
  for (const artifact of artifacts) {
275
467
  const validation = validateArtifactByType(artifact.absolutePath, artifact.artifactType, {
276
468
  currentScanId: scanId,
@@ -287,8 +479,9 @@ async function scanMode(opts) {
287
479
  console.log('[9/10] Enviando artefatos');
288
480
  if (opts.send) {
289
481
  const bundleManifestPayload = {
290
- ...uploadManifestPayload,
482
+ ...finalUploadManifestPayload,
291
483
  artifacts: artifacts.map(({ absolutePath, ...artifact }) => artifact),
484
+ files: artifacts.map(({ absolutePath, ...artifact }) => artifact),
292
485
  };
293
486
  const result = await uploadArtifactBundle(artifacts, opts.token, opts.url, bundleManifestPayload);
294
487
  uploaded = true;