legacy-squad 1.0.0-beta.5 → 1.0.0-beta.7

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/dist/cli.mjs CHANGED
@@ -363,11 +363,23 @@ var composerJsonDetector = {
363
363
  { name: "php", type: "language", version: composer.require?.php ?? "unknown", source: filePath }
364
364
  ];
365
365
  const dependencies = [];
366
+ const FRAMEWORK_MAP = [
367
+ { pkg: "laravel/framework", name: "laravel" },
368
+ { pkg: "symfony/framework-bundle", name: "symfony" },
369
+ { pkg: "symfony/symfony", name: "symfony" },
370
+ { pkg: "codeigniter4/framework", name: "codeigniter" },
371
+ { pkg: "codeigniter/framework", name: "codeigniter" }
372
+ ];
373
+ const allRequires = { ...composer.require ?? {}, ...composer["require-dev"] ?? {} };
366
374
  for (const [name, version] of Object.entries(composer.require ?? {})) {
367
375
  if (name === "php") continue;
368
376
  dependencies.push({ name, version: String(version), manager: "composer", scope: "runtime" });
369
- if (name === "laravel/framework") {
370
- stack.push({ name: "laravel", type: "framework", version: String(version), source: filePath });
377
+ }
378
+ const seenFrameworks = /* @__PURE__ */ new Set();
379
+ for (const { pkg, name } of FRAMEWORK_MAP) {
380
+ if (allRequires[pkg] && !seenFrameworks.has(name)) {
381
+ seenFrameworks.add(name);
382
+ stack.push({ name, type: "framework", version: String(allRequires[pkg]), source: filePath });
371
383
  }
372
384
  }
373
385
  return { stack, dependencies, projectType: "backend", projectName: composer.name ?? "php-project" };
@@ -380,12 +392,22 @@ var csprojDetector = {
380
392
  const dependencies = [];
381
393
  const tfmMatch = content.match(/<TargetFramework>(.*?)<\/TargetFramework>/);
382
394
  if (tfmMatch) {
383
- stack.push({ name: "dotnet", type: "runtime", version: tfmMatch[1], source: filePath });
395
+ const tfm = tfmMatch[1];
396
+ stack.push({ name: "dotnet", type: "runtime", version: tfm, source: filePath });
397
+ if (/^net4\d|^net35/.test(tfm)) {
398
+ stack.push({ name: ".net-framework", type: "runtime", version: tfm, source: filePath });
399
+ }
400
+ }
401
+ if (/Sdk\s*=\s*["']Microsoft\.NET\.Sdk\.Web["']/.test(content)) {
402
+ stack.push({ name: "asp.net", type: "framework", version: "detected", source: filePath });
384
403
  }
385
404
  const pkgRefRegex = /<PackageReference\s+Include="([^"]+)"\s+Version="([^"]+)"/g;
386
405
  let match;
387
406
  while ((match = pkgRefRegex.exec(content)) !== null) {
388
407
  dependencies.push({ name: match[1], version: match[2], manager: "nuget", scope: "runtime" });
408
+ if (match[1].startsWith("Microsoft.AspNetCore") && !stack.some((s) => s.name === "asp.net")) {
409
+ stack.push({ name: "asp.net", type: "framework", version: match[2], source: filePath });
410
+ }
389
411
  }
390
412
  return { stack, dependencies, projectType: "backend", projectName: path2.basename(filePath, ".csproj") };
391
413
  }
@@ -397,17 +419,34 @@ var pomXmlDetector = {
397
419
  { name: "java", type: "language", version: "unknown", source: filePath }
398
420
  ];
399
421
  const dependencies = [];
400
- if (content.includes("spring-boot")) {
422
+ if (/<artifactId>\s*spring-boot/i.test(content) || content.includes("spring-boot-starter")) {
401
423
  stack.push({ name: "spring-boot", type: "framework", version: "detected", source: filePath });
424
+ } else if (/<artifactId>\s*spring-webmvc\s*<\/artifactId>/i.test(content) || content.includes("spring-webmvc")) {
425
+ stack.push({ name: "spring-mvc", type: "framework", version: "detected", source: filePath });
402
426
  }
403
427
  return { stack, dependencies, projectType: "backend", projectName: "java-project" };
404
428
  }
405
429
  };
430
+ var gradleDetector = {
431
+ filename: "build.gradle",
432
+ detect(content, filePath) {
433
+ const stack = [
434
+ { name: "java", type: "language", version: "unknown", source: filePath }
435
+ ];
436
+ if (content.includes("org.springframework.boot") || content.includes("spring-boot-starter")) {
437
+ stack.push({ name: "spring-boot", type: "framework", version: "detected", source: filePath });
438
+ } else if (content.includes("spring-webmvc")) {
439
+ stack.push({ name: "spring-mvc", type: "framework", version: "detected", source: filePath });
440
+ }
441
+ return { stack, dependencies: [], projectType: "backend", projectName: "java-project" };
442
+ }
443
+ };
406
444
  var ALL_DETECTORS = [
407
445
  packageJsonDetector,
408
446
  composerJsonDetector,
409
447
  csprojDetector,
410
- pomXmlDetector
448
+ pomXmlDetector,
449
+ gradleDetector
411
450
  ];
412
451
  var MANIFEST_FILES = ALL_DETECTORS.map((d) => d.filename);
413
452
  async function detectFromManifests(rootPath, fs) {
@@ -689,14 +728,27 @@ var ContextBuilder = class {
689
728
  import path5 from "node:path";
690
729
 
691
730
  // packages/rules/src/rule-catalog.ts
731
+ var BACKEND_LANGUAGES = [
732
+ "backend",
733
+ "php",
734
+ "laravel",
735
+ "symfony",
736
+ "codeigniter",
737
+ "dotnet",
738
+ "csharp",
739
+ "asp.net",
740
+ "java",
741
+ "spring-boot",
742
+ "spring-mvc"
743
+ ];
692
744
  var SECURITY_RULES = [
693
745
  {
694
746
  id: "SEC-CRED-001",
695
747
  title: "Hardcoded credentials in source code",
696
748
  category: "security",
697
749
  severity: "critical",
698
- appliesTo: ["react-native", "node", "mobile", "backend", "frontend"],
699
- frameworks: ["OWASP MASVS V2", "CWE-798"],
750
+ appliesTo: ["react-native", "node", "mobile", "backend", "frontend", ...BACKEND_LANGUAGES],
751
+ frameworks: ["OWASP MASVS V2", "OWASP ASVS V2", "CWE-798"],
700
752
  detection: {
701
753
  type: "pattern",
702
754
  patterns: [
@@ -747,7 +799,7 @@ var SECURITY_RULES = [
747
799
  title: "Sensitive data (CPF/PII) logged or sent to external service",
748
800
  category: "security",
749
801
  severity: "high",
750
- appliesTo: ["react-native", "node", "mobile", "backend"],
802
+ appliesTo: ["react-native", "node", "mobile", "backend", ...BACKEND_LANGUAGES],
751
803
  frameworks: ["OWASP MASVS V2", "CWE-532", "LGPD"],
752
804
  detection: {
753
805
  type: "pattern",
@@ -765,7 +817,7 @@ var SECURITY_RULES = [
765
817
  title: "Empty catch block swallowing errors silently",
766
818
  category: "security",
767
819
  severity: "medium",
768
- appliesTo: ["react-native", "node", "mobile", "frontend", "backend"],
820
+ appliesTo: ["react-native", "node", "mobile", "frontend", "backend", ...BACKEND_LANGUAGES],
769
821
  frameworks: ["CWE-390", "Clean Code"],
770
822
  detection: {
771
823
  type: "pattern",
@@ -775,7 +827,7 @@ var SECURITY_RULES = [
775
827
  ]
776
828
  },
777
829
  impact: "Errors are silently discarded, masking bugs and security issues in production.",
778
- recommendation: "Log errors to a monitoring service (Sentry, Crashlytics). Never leave catch blocks empty."
830
+ recommendation: "Log errors to a monitoring service (Sentry, Crashlytics, Application Insights). Never leave catch blocks empty."
779
831
  },
780
832
  {
781
833
  id: "SEC-STORE-001",
@@ -792,6 +844,132 @@ var SECURITY_RULES = [
792
844
  },
793
845
  impact: "Authentication tokens in AsyncStorage are accessible to other apps on rooted devices.",
794
846
  recommendation: "Use expo-secure-store, react-native-keychain, or native Keychain/Keystore APIs."
847
+ },
848
+ // ─── Regras multi-linguagem para backend (DT-003) ──────────────────────────
849
+ {
850
+ id: "SEC-SQL-001",
851
+ title: "Possible SQL injection via string concatenation",
852
+ category: "security",
853
+ severity: "critical",
854
+ appliesTo: BACKEND_LANGUAGES,
855
+ frameworks: ["OWASP ASVS V5", "OWASP Top 10 A03:2021", "CWE-89"],
856
+ detection: {
857
+ type: "pattern",
858
+ patterns: [
859
+ // PHP: keyword SQL na mesma linha que superglobal
860
+ "(SELECT|INSERT|UPDATE|DELETE)[^;]*\\$_(GET|POST|REQUEST|COOKIE)",
861
+ // .NET: SqlCommand/CommandText concatenando string
862
+ "(SqlCommand|CommandText)[^;{]*\\+\\s*\\w",
863
+ // Java: execute*/executeQuery/executeUpdate concatenando string
864
+ '(executeQuery|executeUpdate|execute)\\s*\\([^)]*"\\s*\\+'
865
+ ]
866
+ },
867
+ impact: "Attacker-controlled input concatenated into SQL allows arbitrary query execution, data exfiltration or database compromise.",
868
+ recommendation: "Use parameterized queries / prepared statements: PDO/mysqli in PHP (?-placeholders), SqlParameter in .NET, PreparedStatement in Java, or ORM bindings (Eloquent, EF Core, Hibernate) without raw concatenation."
869
+ },
870
+ {
871
+ id: "SEC-CRYPTO-001",
872
+ title: "Weak cryptographic hash (MD5/SHA-1)",
873
+ category: "security",
874
+ severity: "high",
875
+ appliesTo: BACKEND_LANGUAGES,
876
+ frameworks: ["OWASP ASVS V6", "CWE-327", "CWE-328"],
877
+ detection: {
878
+ type: "pattern",
879
+ patterns: [
880
+ // PHP: md5($x), sha1($x)
881
+ "\\b(md5|sha1)\\s*\\(",
882
+ // .NET: MD5.Create(), SHA1.Create()
883
+ "\\b(MD5|SHA1)\\.Create\\s*\\(",
884
+ // Java: MessageDigest.getInstance("MD5"/"SHA-1")
885
+ `MessageDigest\\.getInstance\\s*\\(\\s*["'](MD5|SHA-?1)["']`
886
+ ]
887
+ },
888
+ impact: "MD5 and SHA-1 are cryptographically broken \u2014 vulnerable to collisions and brute-force. Unsuitable for password hashing or integrity checks.",
889
+ recommendation: "For passwords: bcrypt/argon2 (password_hash in PHP, BCrypt.Net in .NET, Spring Security in Java). For integrity: SHA-256, SHA-3, or BLAKE2."
890
+ },
891
+ {
892
+ id: "SEC-DESER-001",
893
+ title: "Insecure deserialization of user-controlled data",
894
+ category: "security",
895
+ severity: "high",
896
+ appliesTo: BACKEND_LANGUAGES,
897
+ frameworks: ["OWASP ASVS V5", "OWASP Top 10 A08:2021", "CWE-502"],
898
+ detection: {
899
+ type: "pattern",
900
+ patterns: [
901
+ // PHP: unserialize de superglobais
902
+ "unserialize\\s*\\(\\s*\\$_(GET|POST|REQUEST|COOKIE)",
903
+ // .NET: BinaryFormatter/SoapFormatter/NetDataContractSerializer
904
+ "\\b(BinaryFormatter|SoapFormatter|NetDataContractSerializer)\\b",
905
+ // Java: chamada readObject() — específica de ObjectInputStream/XMLDecoder
906
+ "\\.readObject\\s*\\(\\s*\\)"
907
+ ]
908
+ },
909
+ impact: "Deserializing untrusted input can lead to remote code execution via gadget chains.",
910
+ recommendation: "Avoid native serialization for untrusted input. Prefer JSON with strict schemas (json_decode, System.Text.Json, Jackson with default-typing disabled)."
911
+ },
912
+ {
913
+ id: "SEC-CMD-001",
914
+ title: "Possible command injection via user-controlled input",
915
+ category: "security",
916
+ severity: "critical",
917
+ appliesTo: BACKEND_LANGUAGES,
918
+ frameworks: ["OWASP ASVS V5", "CWE-78"],
919
+ detection: {
920
+ type: "pattern",
921
+ patterns: [
922
+ // PHP: exec/system/passthru/shell_exec/popen com superglobal nos parens
923
+ "(exec|system|passthru|shell_exec|popen|proc_open)\\s*\\([^)]*\\$_(GET|POST|REQUEST|COOKIE)",
924
+ // .NET: Process.Start com Request
925
+ "Process\\.Start\\s*\\([^)]*\\bRequest\\b",
926
+ // Java: Runtime.exec com .getParameter (qualquer variável do servlet)
927
+ "Runtime\\.getRuntime\\s*\\(\\)\\.exec\\s*\\([^)]*\\.getParameter"
928
+ ]
929
+ },
930
+ impact: "Untrusted input passed to shell execution allows attackers to run arbitrary commands on the host.",
931
+ recommendation: "Avoid shell invocation when possible. If necessary, validate input against a strict allow-list and pass arguments as an array (not concatenated string)."
932
+ },
933
+ {
934
+ id: "SEC-PATH-001",
935
+ title: "Possible path traversal via user-controlled input",
936
+ category: "security",
937
+ severity: "high",
938
+ appliesTo: BACKEND_LANGUAGES,
939
+ frameworks: ["OWASP ASVS V12", "CWE-22"],
940
+ detection: {
941
+ type: "pattern",
942
+ patterns: [
943
+ // PHP: include/require/file_get_contents/fopen/readfile com superglobal
944
+ "(file_get_contents|fopen|readfile|file)\\s*\\([^)]*\\$_(GET|POST|REQUEST|COOKIE)",
945
+ "(include|require|include_once|require_once)\\s*\\(?[^;]*\\$_(GET|POST|REQUEST|COOKIE)",
946
+ // .NET: File.ReadAllText/OpenRead/Open com Request
947
+ "File\\.(ReadAllText|ReadAllBytes|OpenRead|Open|ReadAllLines)\\s*\\([^)]*\\bRequest\\b",
948
+ // Java: new File / new FileInputStream com .getParameter (qualquer var)
949
+ "(new\\s+File|new\\s+FileInputStream|new\\s+FileReader|Files\\.read)\\s*\\([^)]*\\.getParameter"
950
+ ]
951
+ },
952
+ impact: "User-controlled file paths allow attackers to read or include arbitrary files outside the intended directory.",
953
+ recommendation: "Validate against an allow-list of filenames, normalize the path (realpath in PHP, Path.GetFullPath in .NET, Path.normalize in Java) and confirm it stays under a known root directory."
954
+ },
955
+ {
956
+ id: "SEC-XSS-001",
957
+ title: "Cross-site scripting via unescaped output",
958
+ category: "security",
959
+ severity: "high",
960
+ appliesTo: BACKEND_LANGUAGES,
961
+ frameworks: ["OWASP ASVS V5", "OWASP Top 10 A03:2021", "CWE-79"],
962
+ detection: {
963
+ type: "pattern",
964
+ patterns: [
965
+ // PHP: echo/print de superglobal sem escape
966
+ "(echo|print)[^;]*\\$_(GET|POST|REQUEST|COOKIE)",
967
+ // .NET: Response.Write com Request
968
+ "Response\\.Write\\s*\\([^)]*\\bRequest\\b"
969
+ ]
970
+ },
971
+ impact: "Reflecting user input into HTML without escaping allows script injection in victims' browsers.",
972
+ recommendation: "PHP: htmlspecialchars() / Blade {{ }} / Twig auto-escape. .NET: Razor @ syntax (auto-escapes), HttpUtility.HtmlEncode. Java: JSTL <c:out> or Thymeleaf th:text."
795
973
  }
796
974
  ];
797
975
  var CODE_QUALITY_RULES = [
@@ -825,6 +1003,27 @@ var CODE_QUALITY_RULES = [
825
1003
  },
826
1004
  impact: "Transitive dependencies may be removed in future updates, causing silent breakage.",
827
1005
  recommendation: "Declare all used packages explicitly in package.json or replace with native alternatives."
1006
+ },
1007
+ {
1008
+ id: "CQ-DEPRECATED-001",
1009
+ title: "Use of deprecated or removed language API",
1010
+ category: "legacy_code",
1011
+ severity: "medium",
1012
+ appliesTo: BACKEND_LANGUAGES,
1013
+ frameworks: ["Clean Code"],
1014
+ detection: {
1015
+ type: "pattern",
1016
+ patterns: [
1017
+ // PHP: mysql_* extension (removed in PHP 7)
1018
+ "mysql_(connect|query|fetch_array|fetch_assoc|fetch_row|num_rows|real_escape_string|select_db)\\s*\\(",
1019
+ // PHP: ereg/split (removed in PHP 7)
1020
+ "\\b(ereg|eregi|ereg_replace|split)\\s*\\(",
1021
+ // Java: legacy synchronized collections
1022
+ "\\bnew\\s+(Vector|Hashtable)\\s*[(<]"
1023
+ ]
1024
+ },
1025
+ impact: "Deprecated APIs are unsupported and may be removed in future runtime versions, causing breakage. They often have safer modern replacements.",
1026
+ recommendation: "PHP: migrate mysql_* to PDO or mysqli; ereg_* to preg_*. Java: replace Vector with ArrayList and Hashtable with HashMap (or ConcurrentHashMap if thread-safety needed)."
828
1027
  }
829
1028
  ];
830
1029
  var ALL_RULES = [...SECURITY_RULES, ...CODE_QUALITY_RULES];
@@ -9,34 +9,45 @@ Leia estes arquivos para entender o projeto:
9
9
  ## Sua Missão
10
10
  Mapear a arquitetura atual do sistema e identificar riscos estruturais. Analise:
11
11
 
12
- 1. **Separação de camadas** — existe separação clara entre UI, lógica e dados?
12
+ 1. **Separação de camadas** — existe separação clara entre apresentação, lógica de negócio e dados?
13
13
  2. **Acoplamento** — quais módulos dependem fortemente uns dos outros?
14
- 3. **State management** — como o estado é gerenciado? Há single source of truth?
15
- 4. **Integrações** — como o sistema se comunica com serviços externos?
16
- 5. **Navegação** — como o roteamento é estruturado?
14
+ 3. **Gestão de estado / sessão** — como o estado é gerenciado? Há single source of truth?
15
+ 4. **Integrações** — como o sistema se comunica com serviços externos, bancos, filas?
16
+ 5. **Roteamento / entrypoints** — como o roteamento HTTP/navegação é estruturado?
17
17
  6. **Padrões conflitantes** — há mais de um padrão para a mesma coisa?
18
18
 
19
+ ## Stack-aware analysis
20
+
21
+ Antes de analisar, leia `repo-index.json` e identifique a stack. Adapte vocabulário e patterns à stack detectada:
22
+
23
+ - **PHP / Laravel / Symfony**: identifique Controllers, Models (Eloquent/Doctrine), Services, Repositories, Middlewares, Service Providers; avalie se a separação MVC está respeitada ou se há lógica espalhada em views/blade; veja como Routes e Form Requests organizam validação.
24
+ - **.NET / ASP.NET Core**: identifique Controllers, Services, Repositories, DTOs, Middleware pipeline, Dependency Injection container; avalie uso de Minimal APIs vs Controllers; veja como `Program.cs/Startup.cs` configura o pipeline.
25
+ - **Java / Spring Boot / Spring MVC**: identifique `@RestController/@Controller`, `@Service`, `@Repository`, `@Configuration`, `@Component`; avalie uso de DTOs vs entidades expostas; veja como Spring Profiles e `application.yml/properties` separam ambientes.
26
+ - **React Native / Expo / mobile**: identifique screens, navigators (React Navigation), state stores (MobX/Redux/Zustand/Context), API clients; avalie separação de UI vs lógica de negócio em hooks/services.
27
+ - **Node backend / Express / NestJS**: identifique routes, controllers, middlewares, services; em NestJS observe modules e DI; em Express puro avalie se há separação de camadas ou tudo está em handlers.
28
+
19
29
  ## Arquivos para Analisar
20
- Com base no repo-index, priorize:
21
- - Stores e gerenciamento de estado
22
- - Rotas e navegação
23
- - Configurações de API
24
- - Componentes compartilhados
25
- - Entrypoints da aplicação
30
+ Com base no `repo-index.json`, priorize:
31
+ - Entrypoints da aplicação (`index.php`, `Program.cs`, `Application.java`, `App.tsx`, `server.js`)
32
+ - Configurações de roteamento e middleware
33
+ - Camada de persistência (repositories, DAOs, ORMs)
34
+ - Componentes/módulos compartilhados (utils, shared, common)
35
+ - Configurações de infraestrutura (Dockerfile, docker-compose, application.yml)
26
36
 
27
37
  ## Output
28
38
  Salve em: `.legacy-squad/outputs/assessments/architecture-assessment.md`
29
39
 
30
40
  Estrutura:
31
- 1. Current Architecture Overview (com diagrama em mermaid se possível)
32
- 2. Layer Separation Analysis
33
- 3. Coupling & Cohesion Assessment
34
- 4. Integration Points Map
35
- 5. Architecture Risks
36
- 6. Target Architecture Recommendations
41
+ 1. **Current Architecture Overview** (com diagrama em mermaid se possível)
42
+ 2. **Layer Separation Analysis** (camadas detectadas e quanto a separação é respeitada)
43
+ 3. **Coupling & Cohesion Assessment** (módulos com alto fan-out, dependências circulares)
44
+ 4. **Integration Points Map** (bancos, APIs externas, filas, caches)
45
+ 5. **Architecture Risks** (dívidas estruturais, padrões conflitantes, god classes)
46
+ 6. **Target Architecture Recommendations** (alvo incremental — sem big-bang)
37
47
 
38
48
  ## Regras
39
- - Base toda análise em evidência dos arquivos reais
40
- - Use terminologia C4 (Context, Container, Component)
41
- - Propostas de arquitetura alvo devem ser incrementais
42
- - Considere que o sistema está em produção
49
+ - Base toda análise em evidência dos arquivos reais (arquivo, linha, snippet)
50
+ - Use terminologia C4 (Context, Container, Component) quando aplicável
51
+ - Propostas de arquitetura alvo devem ser incrementais (Strangler Fig, Branch by Abstraction)
52
+ - Considere que o sistema está em produção — toda recomendação deve ser deployável isoladamente
53
+ - Recomendações específicas devem citar APIs/bibliotecas da stack (e.g., "introduza um Service Provider em Laravel", "extraia para um `@Service` Spring", "use DI nativo do ASP.NET Core")
@@ -11,25 +11,42 @@ Extrair regras de negócio escondidas no código. Sistemas legados frequentement
11
11
  1. **Regras explícitas** — validações, permissões, fluxos visíveis
12
12
  2. **Regras implícitas** — condicionais obscuros, magic numbers, comportamentos em catch blocks
13
13
  3. **Modelo de domínio** — entidades principais e seus relacionamentos
14
- 4. **Fluxos de negócio** — jornadas do usuário codificadas nas telas/stores
14
+ 4. **Fluxos de negócio** — jornadas do usuário codificadas no sistema
15
15
  5. **Regras que devem ser preservadas** — lógica que não pode mudar na modernização
16
16
 
17
- ## Arquivos para Analisar
18
- Priorize stores, screens com lógica de negócio, validações e fluxos de login/autenticação.
17
+ ## Stack-aware analysis
18
+
19
+ Antes de analisar, leia `repo-index.json` e identifique a stack. Adapte onde procurar:
20
+
21
+ - **PHP / Laravel / Symfony**: olhe FormRequests/Validators (regras explícitas de input), Controllers (lógica de fluxo), Models/Eloquent (relacionamentos, scopes, accessors), Service classes, Middleware (regras de autorização), Policies/Gates.
22
+ - **.NET / ASP.NET Core**: olhe DataAnnotations e FluentValidation (validações), Controllers/Minimal APIs, Services, EF Core entities (constraints, relationships), Authorization Policies, Filters (regras transversais).
23
+ - **Java / Spring Boot**: olhe Bean Validation (`@NotNull`, `@Pattern`, `@Valid`), `@RestController` methods, `@Service` classes, JPA entities (`@Entity`, `@OneToMany`, lifecycle callbacks), `@PreAuthorize/@Secured`, Aspects.
24
+ - **React Native / mobile**: olhe screens com lógica de submissão, hooks/services com validações, state stores (regras de transição de estado), middleware de API (autorização do cliente), formulários e suas validações inline.
25
+ - **Node backend**: olhe middlewares de validação (Joi, Zod, class-validator), controllers/handlers, services, schemas de banco (Mongoose, Sequelize, Prisma — constraints e hooks).
26
+
27
+ ## Padrões a procurar (independente da stack)
28
+
29
+ - `switch/case` ou `if/else if/else` em cadeia com nomes de operações ou status — fluxos de máquina de estado escondidos
30
+ - `ifs` aninhados com condições compostas — regras de negócio camufladas
31
+ - Magic numbers e magic strings (e.g., `if (status == 3)`, `if (tipo == "PJ")`) — devem virar enums/constantes nomeadas
32
+ - Lookups em arrays/maps hardcoded — tabelas de domínio que poderiam ser configuráveis
33
+ - Try/catch que silencia erro mas faz uma ação alternativa — fluxo de negócio em fallback
34
+ - Cálculos com fórmulas literais — regras tarifárias/de cálculo que ninguém entende mais
19
35
 
20
36
  ## Output
21
37
  Salve em: `.legacy-squad/outputs/assessments/business-rules-assessment.md`
22
38
 
23
39
  Estrutura:
24
- 1. Business Domain Overview
25
- 2. Extracted Business Rules (table: ID, rule, file, line, type explicit/implicit)
26
- 3. Validation Rules Catalog
27
- 4. Permission Model
28
- 5. Implicit Rules (hidden in code)
29
- 6. Rules Preservation Checklist for Modernization
40
+ 1. **Business Domain Overview** (entidades principais, glossário de domínio extraído do código)
41
+ 2. **Extracted Business Rules** (tabela: ID, regra, arquivo, linha, tipo explícito/implícito)
42
+ 3. **Validation Rules Catalog** (consolidado por campo/entidade)
43
+ 4. **Permission Model** (quem pode fazer o quê — extraído de middlewares, policies, guards)
44
+ 5. **Implicit Rules** (regras escondidas em código — magic numbers, condicionais sem documentação)
45
+ 6. **Rules Preservation Checklist for Modernization** (lista do que NÃO pode mudar)
30
46
 
31
47
  ## Regras
32
48
  - Toda regra extraída deve citar arquivo e linha
33
49
  - Distinga regras de negócio de detalhes técnicos de implementação
34
50
  - Sinalize regras que parecem acidentais vs intencionais
35
- - Use linguagem de domínio, não jargão técnico
51
+ - Use linguagem de domínio (a do negócio do projeto), não jargão técnico
52
+ - Quando achar magic numbers/strings, sugira o nome da constante apropriado (e.g., `STATUS_APROVADO` em vez de `3`)
@@ -9,6 +9,8 @@ Leia estes arquivos:
9
9
  ## Sua Missão
10
10
  Consolidar todos os assessments em um único **PRS (Product Refactor Specification)** — o documento final de diagnóstico do legado.
11
11
 
12
+ Leia primeiro o `repo-index.json` para conhecer a stack do projeto. O PRS deve usar vocabulário da stack detectada (PHP/Laravel, .NET, Java/Spring, React Native, Node, etc.) ao consolidar findings e recomendações — nada de termos mobile-only se o projeto é PHP, nem termos backend se é mobile.
13
+
12
14
  ## Output
13
15
  Salve em: `.legacy-squad/outputs/reports/PRS.md`
14
16
 
@@ -3,32 +3,45 @@ Você é o **Legacy Code Agent** do Legacy Squad Framework.
3
3
  ## Contexto
4
4
  Leia estes arquivos para entender o projeto:
5
5
  - `.legacy-squad/memory/repo-index.json` — inventário do repositório
6
- - `.legacy-squad/memory/findings.json` — achados do compliance engine
6
+ - `.legacy-squad/memory/findings.json` — achados do compliance engine (atenção especial a CQ-DEPRECATED-001 e CQ-MIX-001)
7
7
  - `.legacy-squad/memory/context-packs.json` — resumo dos módulos
8
8
 
9
9
  ## Sua Missão
10
10
  Avaliar a qualidade do código, identificar hotspots e propor prioridades de refatoração:
11
11
 
12
12
  1. **Hotspots** — arquivos maiores, mais complexos ou mais acoplados
13
- 2. **Migração JS→TS** — status atual e prioridades
14
- 3. **Duplicação** — padrões repetidos que poderiam ser extraídos
15
- 4. **Cobertura de testes** — quais áreas críticas não têm testes?
16
- 5. **Código morto** — imports não usados, funções órfãs
17
- 6. **Error handling** — padrões de tratamento de erros
13
+ 2. **APIs depreciadas / removidas** — uso de bibliotecas/funções obsoletas
14
+ 3. **Migração de versão de linguagem** — código que ainda usa padrões antigos da linguagem
15
+ 4. **Duplicação** — padrões repetidos que poderiam ser extraídos
16
+ 5. **Cobertura de testes** — quais áreas críticas não têm testes?
17
+ 6. **Código morto** — imports/dependências não usados, funções/classes órfãs
18
+ 7. **Error handling** — padrões de tratamento de erros (incluindo catches vazios)
19
+
20
+ ## Stack-aware analysis
21
+
22
+ Antes de analisar, leia `repo-index.json` e identifique a stack. Adapte vocabulário e patterns à stack detectada:
23
+
24
+ - **PHP / Laravel / Symfony**: procure por `mysql_*` (removido no PHP 7), `ereg/eregi/split` (removidos), uso de superglobais sem filtro, classes God com 500+ linhas, controllers fat sem service layer; verifique se `composer.json` aponta para versões PHP/framework EOL; uso de `array()` em vez de `[]`, `var` em vez de `private/protected`.
25
+ - **.NET / ASP.NET / C#**: procure por `WebClient` (obsoleto, use `HttpClient`), `ConfigurationManager.AppSettings` (legado, use `IConfiguration`), `BinaryFormatter` (banido a partir de .NET 5), `HashAlgorithm.Create()` sem argumento; verifique `.csproj` com `net4xx` (Framework legado) vs `net8.0+` (moderno); regions excessivas, classes parciais sem necessidade.
26
+ - **Java / Spring**: procure por `Vector/Hashtable/Stack` (use `ArrayList/HashMap/Deque`), `Date` legado (use `java.time`), `synchronized` excessivo, `Object[]` em vez de generics, `instanceof` em cadeia (deveria ser polimorfismo); verifique se `pom.xml/build.gradle` aponta para Java/Spring EOL; uso de `@Autowired` em fields vs constructor injection.
27
+ - **React Native / TypeScript / mobile**: procure por arquivos `.js` que poderiam ser `.ts/.tsx`, class components que poderiam ser functional, lifecycle methods deprecated (`componentWillMount`), uso de `any` em larga escala, `require()` em vez de `import`; verifique versão do RN/Expo SDK em uso vs LTS atual.
28
+ - **Node backend**: procure por uso de `require` em vez de `import`, callbacks sem promises/async-await, `var` em vez de `const/let`, `Buffer()` (deprecated, use `Buffer.from`), `process.on('uncaughtException')` sem handler decente, `domain` (deprecated).
18
29
 
19
30
  ## Output
20
31
  Salve em: `.legacy-squad/outputs/assessments/legacy-code-assessment.md`
21
32
 
22
33
  Estrutura:
23
- 1. Code Quality Overview
24
- 2. Complexity Hotspots (top 10 files by size/complexity)
25
- 3. Migration Status (JS→TS progress)
26
- 4. Duplication Analysis
27
- 5. Test Coverage Assessment
28
- 6. Refactoring Priorities (ranked S/M/L effort)
34
+ 1. **Code Quality Overview** (LOC total, distribuição por linguagem, idade média estimada)
35
+ 2. **Complexity Hotspots** (top 10 arquivos por tamanho/complexidade)
36
+ 3. **Deprecated/Removed APIs** (consolida CQ-DEPRECATED-001 + descobertas adicionais)
37
+ 4. **Language Version Migration** (status atual da versão de linguagem/framework vs LTS/atual)
38
+ 5. **Duplication Analysis** (padrões repetidos candidatos a extração)
39
+ 6. **Test Coverage Assessment** (áreas críticas sem testes)
40
+ 7. **Refactoring Priorities** (ranqueadas S/M/L de esforço)
29
41
 
30
42
  ## Regras
31
- - Antes de propor refatoração, entenda o que o código faz
32
- - Priorize refatoração que reduz risco, não só melhora estética
43
+ - Antes de propor refatoração, entenda o que o código faz (negócio, não apenas estética)
44
+ - Priorize refatoração que reduz risco operacional, não só melhora estética
33
45
  - Estimativas relativas (S/M/L), não horas absolutas
34
- - Considere cobertura de testes antes de recomendar mudanças
46
+ - Considere cobertura de testes antes de recomendar mudanças disruptivas
47
+ - Recomendações de modernização devem indicar a versão alvo (e.g., "migrar PHP 7.4 → 8.3", "Spring Boot 2.7 → 3.2", "RN 0.68 → 0.79")
@@ -9,27 +9,39 @@ Leia estes arquivos:
9
9
  ## Sua Missão
10
10
  Sintetizar os achados de todos os pilares em um plano concreto de modernização incremental.
11
11
 
12
- 1. **Estratégia** — qual padrão de modernização aplicar? (Strangler Fig, Branch by Abstraction, etc.)
12
+ 1. **Estratégia** — qual padrão de modernização aplicar? (Strangler Fig, Branch by Abstraction, Parallel Run)
13
13
  2. **Fases** — dividir em Foundation → Core → Evolution
14
- 3. **Stack upgrade** — o que atualizar e em que ordem
14
+ 3. **Stack upgrade** — o que atualizar e em que ordem (linguagem, framework, dependências)
15
15
  4. **Riscos** — matriz de risco por fase
16
16
  5. **Rollback** — estratégia de rollback por fase
17
17
  6. **Scores** — Deployability Score (1-10) e Execution Readiness Score (0-100)
18
18
 
19
+ ## Stack-aware analysis
20
+
21
+ Antes de planejar, leia `repo-index.json` e identifique a stack. Adapte o stack-upgrade plan à stack detectada:
22
+
23
+ - **PHP / Laravel / Symfony**: avalie a versão atual do PHP vs versões com suporte (consulte https://www.php.net/supported-versions.php). Plano típico: PHP 5.x → 7.4 → 8.x; Laravel 6/7/8 → 11; Symfony 4/5 → 7. Use `composer outdated` mental para mapear gaps. Cada upgrade do framework costuma exigir upgrade do PHP primeiro.
24
+ - **.NET / ASP.NET**: avalie TargetFramework atual. Plano típico: .NET Framework 4.x → .NET 8 (LTS) ou .NET 9 via .NET Standard 2.0 como ponte; ASP.NET 4.x → ASP.NET Core; pacotes NuGet com major bumps. Use `Microsoft.DotNet.UpgradeAssistant` como referência mental.
25
+ - **Java / Spring**: avalie versão Java + Spring Boot. Plano típico: Java 8/11 → 17 (LTS) → 21 (LTS); Spring Boot 2.x → 3.x (que exige Java 17+ e troca de `javax.*` → `jakarta.*`); pom.xml/build.gradle precisam revisar todas dependências para versões Jakarta-compatible.
26
+ - **React Native / Expo**: avalie versão atual do RN/Expo SDK. Plano típico: Expo SDK 48 → 50 → 52 → 53; RN 0.6x → 0.7x → 0.79; revisão de New Architecture (Fabric/TurboModules) quando aplicável. Cada upgrade do Expo SDK costuma revisar todos os módulos nativos.
27
+ - **Node backend**: avalie versão do Node + framework. Plano típico: Node 14/16 → 18/20 (LTS); Express 4 → 5 (quando estável); NestJS 8 → 10; revisão de pacotes com vulnerabilidades (`npm audit`).
28
+
19
29
  ## Output
20
30
  Salve em: `.legacy-squad/outputs/assessments/modernization-assessment.md`
21
31
 
22
32
  Estrutura:
23
- 1. Modernization Strategy
24
- 2. Phase Roadmap (Foundation → Core → Evolution)
25
- 3. Stack Upgrade Plan
26
- 4. Risk Matrix
27
- 5. Rollback Strategy
28
- 6. Deployability Score per Phase
29
- 7. Execution Readiness Score
33
+ 1. **Modernization Strategy** (padrão escolhido + justificativa)
34
+ 2. **Phase Roadmap** (Foundation → Core → Evolution, com escopo por fase)
35
+ 3. **Stack Upgrade Plan** (versão atual → alvo, com gates intermediários)
36
+ 4. **Risk Matrix** (risco por fase, com mitigação)
37
+ 5. **Rollback Strategy** (por fase — feature flags, blue-green, canary, parallel run)
38
+ 6. **Deployability Score per Phase** (1-10)
39
+ 7. **Execution Readiness Score** (0-100, considerando testes, observabilidade, CI/CD)
30
40
 
31
41
  ## Regras
32
- - Nenhuma fase pode exigir big-bang — cada fase é deployável independentemente
42
+ - Nenhuma fase pode exigir big-bang — cada fase deve ser deployável independentemente
33
43
  - Rollback obrigatório para cada fase
34
44
  - Human approval required para mudanças de alto risco
35
45
  - Considere o sistema como estando em produção
46
+ - Stack-upgrade plan deve sempre referenciar a versão LTS mais recente da stack como alvo, e mencionar versões intermediárias seguras quando o salto é grande
47
+ - Para frameworks ainda em EOL ou EOL próximo, sinalize prazo de upgrade como crítico
@@ -7,26 +7,36 @@ Leia estes arquivos para entender o projeto:
7
7
  - `.legacy-squad/memory/context-packs.json` — resumo dos módulos com arquivos-chave
8
8
 
9
9
  ## Sua Missão
10
- Realizar um assessment profundo de segurança que vai além do pattern matching. O Compliance Engine já detectou achados por regex — sua análise deve:
10
+ Realizar um assessment profundo de segurança que vai além do pattern matching. O Compliance Engine já detectou achados por regex (SEC-SQL-001, SEC-CRYPTO-001, SEC-DESER-001, SEC-CMD-001, SEC-PATH-001, SEC-XSS-001, etc.) — sua análise deve:
11
11
 
12
- 1. **Validar findings existentes** — confirme ou refine os achados do compliance engine
12
+ 1. **Validar findings existentes** — confirme ou refine os achados do Compliance Engine
13
13
  2. **Detectar novos achados** que regex não alcança:
14
- - Fluxos de autenticação inseguros
15
- - Autorização ausente ou inconsistente
14
+ - Fluxos de autenticação inseguros (login, refresh token, MFA)
15
+ - Autorização ausente ou inconsistente entre endpoints/rotas
16
16
  - Dados sensíveis transitando sem criptografia
17
17
  - Tokens sem expiração ou rotação
18
- - Secrets em configurações de CI/CD
18
+ - Secrets em configurações de CI/CD ou arquivos `.env*` versionados
19
19
  - Dependências com vulnerabilidades conhecidas
20
- 3. **Analisar integrações** — cada API externa é um vetor de ataque
21
- 4. **Avaliar LGPD** — todo uso de CPF, dados de saúde e PII
20
+ 3. **Analisar integrações** — cada API externa, banco, fila ou serviço é um vetor de ataque
21
+ 4. **Avaliar privacidade de dados** — todo uso de PII (CPF, RG, e-mail, dados de saúde) deve ser auditado quanto a LGPD/GDPR
22
+
23
+ ## Stack-aware analysis
24
+
25
+ Antes de analisar, leia `repo-index.json` e identifique a stack. Adapte vocabulário e patterns à stack detectada:
26
+
27
+ - **PHP / Laravel / Symfony / CodeIgniter**: foque em `$_GET/$_POST/$_REQUEST` mal sanitizados, sessões (`$_SESSION`), `unserialize()` de input, `include` com input do usuário, hashing fraco (`md5/sha1` no lugar de `password_hash`), uso de PDO sem prepared statements, `composer.json` com pacotes abandonados.
28
+ - **.NET / ASP.NET Core / .NET Framework**: foque em `SqlCommand` com concatenação, `BinaryFormatter/SoapFormatter` em deserialização, `Request.Form/QueryString` sem validação, `Process.Start` com input, NuGet com CVEs conhecidos, cookies sem `HttpOnly/Secure/SameSite`, ausência de antiforgery tokens.
29
+ - **Java / Spring Boot / Spring MVC**: foque em `Statement.execute` com concatenação, `ObjectInputStream.readObject` em deserialização, `Runtime.getRuntime().exec` com input, `request.getParameter` sem validação, `MessageDigest.getInstance("MD5"/"SHA-1")`, dependências Maven/Gradle com CVEs, `@CrossOrigin` permissivo.
30
+ - **React Native / Expo / mobile**: foque em armazenamento inseguro (AsyncStorage sem criptografia para tokens), uso de `expo-secure-store/Keychain/Keystore`, logs em produção (`console.log` com dados sensíveis), deep links sem validação, certificados embarcados, permissões excessivas em `AndroidManifest.xml/Info.plist`.
31
+ - **Node backend / Express / NestJS**: foque em SQL/NoSQL injection, deserialização (`JSON.parse` confiando em input), command injection (`child_process.exec`), uso de `eval`, prototype pollution, middlewares de auth ausentes.
22
32
 
23
33
  ## Arquivos para Analisar
24
- Com base no repo-index, priorize:
25
- - Stores de autenticação e sessão
26
- - Configurações de API e endpoints
27
- - Utilitários que manipulam dados sensíveis
28
- - Telas de login e cadastro
29
- - Qualquer arquivo referenciado nos findings
34
+ Com base no `repo-index.json`, priorize:
35
+ - Módulos de autenticação e sessão (independente da stack — controllers de auth em Laravel/Spring, AuthContext/stores em mobile, middlewares em Express)
36
+ - Configurações de API, endpoints, integrações externas
37
+ - Repositórios e camadas de acesso a dados (DAOs, repositories, ORMs)
38
+ - Utilitários que manipulam dados sensíveis (criptografia, mascaramento)
39
+ - Qualquer arquivo referenciado nos findings determinísticos
30
40
 
31
41
  ## Output
32
42
  Salve o resultado em: `.legacy-squad/outputs/assessments/security-assessment.md`
@@ -37,19 +47,19 @@ Use esta estrutura:
37
47
  # Security Assessment — [nome do projeto]
38
48
 
39
49
  ## 1. Authentication & Session Analysis
40
- [análise de fluxos de autenticação]
50
+ [análise de fluxos de autenticação, login, MFA, sessão, JWT/cookies]
41
51
 
42
52
  ## 2. Secrets & Credential Management
43
- [análise de gestão de credenciais]
53
+ [análise de gestão de credenciais — env vars, vaults, .env versionado, hardcoded secrets]
44
54
 
45
- ## 3. Data Protection & Privacy (LGPD)
46
- [análise de proteção de dados pessoais]
55
+ ## 3. Data Protection & Privacy
56
+ [análise de proteção de dados pessoais — LGPD/GDPR, mascaramento, criptografia at-rest/in-transit]
47
57
 
48
58
  ## 4. API Security Posture
49
- [análise de segurança das integrações]
59
+ [análise de segurança das integrações — auth de API, rate limiting, CORS, validação de input]
50
60
 
51
61
  ## 5. Dependency Vulnerabilities
52
- [análise de dependências com CVEs conhecidos]
62
+ [análise de dependências com CVEs conhecidos — composer.json/csproj/pom.xml/package.json]
53
63
 
54
64
  ## 6. Findings Summary
55
65
 
@@ -58,7 +68,7 @@ Use esta estrutura:
58
68
  | SEC-AI-001 | ... | critical | ... | ... |
59
69
 
60
70
  ## 7. Recommendations (prioritized)
61
- [recomendações ordenadas por severidade]
71
+ [recomendações ordenadas por severidade, com remediação específica para a stack do projeto]
62
72
  ```
63
73
 
64
74
  ## Regras
@@ -66,4 +76,5 @@ Use esta estrutura:
66
76
  - Severidade: critical > high > medium > low > info
67
77
  - Recomendações devem ser incrementais (o sistema está em produção)
68
78
  - IDs dos novos achados: SEC-AI-001, SEC-AI-002, etc. (prefixo AI para distinguir dos determinísticos)
69
- - Referências: OWASP MASVS V2, OWASP ASVS, CWE, LGPD
79
+ - Recomendações devem citar a API/biblioteca correta para a stack do projeto (e.g., `PDO::prepare` para PHP, `SqlParameter` para .NET, `PreparedStatement` para Java, `expo-secure-store` para RN)
80
+ - Referências: OWASP Top 10, OWASP ASVS, OWASP MASVS (mobile), CWE, LGPD/GDPR
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "legacy-squad",
3
- "version": "1.0.0-beta.5",
3
+ "version": "1.0.0-beta.7",
4
4
  "description": "AI-Powered Legacy Modernization Platform — Install-first, IDE-native, evidence-driven framework that transforms legacy systems into modernization-ready assets.",
5
5
  "keywords": [
6
6
  "legacy",