@maestro-ai/mcp-server 5.4.5 → 5.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/README.md +68 -83
  2. package/dist/content/rules/RULES.md +14 -0
  3. package/dist/core/metrics/MetricsCollector.d.ts +28 -12
  4. package/dist/core/metrics/MetricsCollector.d.ts.map +1 -1
  5. package/dist/core/metrics/MetricsCollector.js +151 -12
  6. package/dist/core/metrics/MetricsCollector.js.map +1 -1
  7. package/dist/core/validation/ValidationPipeline.d.ts +24 -2
  8. package/dist/core/validation/ValidationPipeline.d.ts.map +1 -1
  9. package/dist/core/validation/ValidationPipeline.js +46 -2
  10. package/dist/core/validation/ValidationPipeline.js.map +1 -1
  11. package/dist/core/validation/layers/DeliverableValidator.d.ts +13 -0
  12. package/dist/core/validation/layers/DeliverableValidator.d.ts.map +1 -0
  13. package/dist/core/validation/layers/DeliverableValidator.js +276 -0
  14. package/dist/core/validation/layers/DeliverableValidator.js.map +1 -0
  15. package/dist/flows/onboarding-orchestrator.js +5 -5
  16. package/dist/flows/onboarding-orchestrator.js.map +1 -1
  17. package/dist/gates/contextual-recommender.d.ts.map +1 -1
  18. package/dist/gates/contextual-recommender.js +260 -1
  19. package/dist/gates/contextual-recommender.js.map +1 -1
  20. package/dist/gates/validator.d.ts +5 -6
  21. package/dist/gates/validator.d.ts.map +1 -1
  22. package/dist/gates/validator.js +9 -6
  23. package/dist/gates/validator.js.map +1 -1
  24. package/dist/handlers/shared-prompt-handler.d.ts.map +1 -1
  25. package/dist/handlers/shared-prompt-handler.js +15 -14
  26. package/dist/handlers/shared-prompt-handler.js.map +1 -1
  27. package/dist/middleware/adr-generation.middleware.d.ts +5 -0
  28. package/dist/middleware/adr-generation.middleware.d.ts.map +1 -0
  29. package/dist/middleware/adr-generation.middleware.js +214 -0
  30. package/dist/middleware/adr-generation.middleware.js.map +1 -0
  31. package/dist/middleware/flow-engine.middleware.d.ts +5 -3
  32. package/dist/middleware/flow-engine.middleware.d.ts.map +1 -1
  33. package/dist/middleware/flow-engine.middleware.js +18 -10
  34. package/dist/middleware/flow-engine.middleware.js.map +1 -1
  35. package/dist/middleware/index.d.ts +18 -11
  36. package/dist/middleware/index.d.ts.map +1 -1
  37. package/dist/middleware/index.js +24 -11
  38. package/dist/middleware/index.js.map +1 -1
  39. package/dist/middleware/orchestration-pipeline.middleware.d.ts +42 -0
  40. package/dist/middleware/orchestration-pipeline.middleware.d.ts.map +1 -0
  41. package/dist/middleware/orchestration-pipeline.middleware.js +57 -0
  42. package/dist/middleware/orchestration-pipeline.middleware.js.map +1 -0
  43. package/dist/middleware/skill-injection.middleware.d.ts.map +1 -1
  44. package/dist/middleware/skill-injection.middleware.js +6 -9
  45. package/dist/middleware/skill-injection.middleware.js.map +1 -1
  46. package/dist/middleware/validation.middleware.d.ts +11 -0
  47. package/dist/middleware/validation.middleware.d.ts.map +1 -1
  48. package/dist/middleware/validation.middleware.js +64 -4
  49. package/dist/middleware/validation.middleware.js.map +1 -1
  50. package/dist/router.d.ts.map +1 -1
  51. package/dist/router.js +20 -14
  52. package/dist/router.js.map +1 -1
  53. package/dist/services/flow-engine.d.ts +1 -0
  54. package/dist/services/flow-engine.d.ts.map +1 -1
  55. package/dist/services/flow-engine.js +22 -10
  56. package/dist/services/flow-engine.js.map +1 -1
  57. package/dist/services/watcher.service.d.ts +45 -0
  58. package/dist/services/watcher.service.d.ts.map +1 -0
  59. package/dist/services/watcher.service.js +106 -0
  60. package/dist/services/watcher.service.js.map +1 -0
  61. package/dist/state/context.d.ts +15 -4
  62. package/dist/state/context.d.ts.map +1 -1
  63. package/dist/state/context.js +36 -9
  64. package/dist/state/context.js.map +1 -1
  65. package/dist/state/storage.d.ts.map +1 -1
  66. package/dist/state/storage.js +6 -0
  67. package/dist/state/storage.js.map +1 -1
  68. package/dist/tests/aprovar-gate.test.d.ts +2 -0
  69. package/dist/tests/aprovar-gate.test.d.ts.map +1 -0
  70. package/dist/tests/aprovar-gate.test.js +113 -0
  71. package/dist/tests/aprovar-gate.test.js.map +1 -0
  72. package/dist/tests/deliverable-validator.test.d.ts +12 -0
  73. package/dist/tests/deliverable-validator.test.d.ts.map +1 -0
  74. package/dist/tests/deliverable-validator.test.js +214 -0
  75. package/dist/tests/deliverable-validator.test.js.map +1 -0
  76. package/dist/tests/flow-engine.test.d.ts +2 -0
  77. package/dist/tests/flow-engine.test.d.ts.map +1 -0
  78. package/dist/tests/flow-engine.test.js +85 -0
  79. package/dist/tests/flow-engine.test.js.map +1 -0
  80. package/dist/tests/gate-orientation.test.d.ts +2 -0
  81. package/dist/tests/gate-orientation.test.d.ts.map +1 -0
  82. package/dist/tests/gate-orientation.test.js +59 -0
  83. package/dist/tests/gate-orientation.test.js.map +1 -0
  84. package/dist/tests/middleware.test.js +30 -4
  85. package/dist/tests/middleware.test.js.map +1 -1
  86. package/dist/tests/watcher.service.test.d.ts +2 -0
  87. package/dist/tests/watcher.service.test.d.ts.map +1 -0
  88. package/dist/tests/watcher.service.test.js +119 -0
  89. package/dist/tests/watcher.service.test.js.map +1 -0
  90. package/dist/tools/aprovar-gate.d.ts.map +1 -1
  91. package/dist/tools/aprovar-gate.js +4 -0
  92. package/dist/tools/aprovar-gate.js.map +1 -1
  93. package/dist/tools/contexto.d.ts.map +1 -1
  94. package/dist/tools/contexto.js +41 -0
  95. package/dist/tools/contexto.js.map +1 -1
  96. package/dist/tools/iniciar-projeto.d.ts.map +1 -1
  97. package/dist/tools/iniciar-projeto.js +6 -40
  98. package/dist/tools/iniciar-projeto.js.map +1 -1
  99. package/dist/tools/maestro-tool.d.ts.map +1 -1
  100. package/dist/tools/maestro-tool.js +34 -14
  101. package/dist/tools/maestro-tool.js.map +1 -1
  102. package/dist/tools/proximo.d.ts.map +1 -1
  103. package/dist/tools/proximo.js +224 -71
  104. package/dist/tools/proximo.js.map +1 -1
  105. package/dist/tools/status.d.ts.map +1 -1
  106. package/dist/tools/status.js +27 -0
  107. package/dist/tools/status.js.map +1 -1
  108. package/dist/tools/validar-gate.d.ts +8 -1
  109. package/dist/tools/validar-gate.d.ts.map +1 -1
  110. package/dist/tools/validar-gate.js +147 -99
  111. package/dist/tools/validar-gate.js.map +1 -1
  112. package/dist/types/config.d.ts +2 -0
  113. package/dist/types/config.d.ts.map +1 -1
  114. package/dist/types/config.js +2 -0
  115. package/dist/types/config.js.map +1 -1
  116. package/dist/types/index.d.ts +6 -0
  117. package/dist/types/index.d.ts.map +1 -1
  118. package/dist/types/index.js.map +1 -1
  119. package/dist/utils/gate-orientation.d.ts +11 -0
  120. package/dist/utils/gate-orientation.d.ts.map +1 -0
  121. package/dist/utils/gate-orientation.js +64 -0
  122. package/dist/utils/gate-orientation.js.map +1 -0
  123. package/dist/utils/ide-paths.d.ts +11 -0
  124. package/dist/utils/ide-paths.d.ts.map +1 -1
  125. package/dist/utils/ide-paths.js +27 -0
  126. package/dist/utils/ide-paths.js.map +1 -1
  127. package/dist/utils/instructions.d.ts +6 -1
  128. package/dist/utils/instructions.d.ts.map +1 -1
  129. package/dist/utils/instructions.js +32 -1
  130. package/dist/utils/instructions.js.map +1 -1
  131. package/package.json +2 -1
  132. package/dist/gates/compatibility-wrapper.d.ts +0 -139
  133. package/dist/gates/compatibility-wrapper.d.ts.map +0 -1
  134. package/dist/gates/compatibility-wrapper.js +0 -362
  135. package/dist/gates/compatibility-wrapper.js.map +0 -1
  136. package/dist/gates/unified-validator.d.ts +0 -67
  137. package/dist/gates/unified-validator.d.ts.map +0 -1
  138. package/dist/gates/unified-validator.js +0 -234
  139. package/dist/gates/unified-validator.js.map +0 -1
@@ -1,7 +1,21 @@
1
1
  /**
2
- * Global project context management
2
+ * Global project context management — v6.3
3
3
  * Tracks the current project directory across tool calls
4
+ * S4.1: Adds state cache to avoid repeated disk reads within the same session
4
5
  */
6
+ import type { EstadoProjeto } from "../types/index.js";
7
+ /**
8
+ * Armazena estado no cache (chamar após salvarEstado / parsearEstado bem-sucedido)
9
+ */
10
+ export declare function setCachedEstado(estado: EstadoProjeto, diretorio: string): void;
11
+ /**
12
+ * Recupera estado do cache se ainda válido para o diretório informado
13
+ */
14
+ export declare function getCachedEstado(diretorio: string): EstadoProjeto | null;
15
+ /**
16
+ * Invalida o cache (chamar quando estado for modificado)
17
+ */
18
+ export declare function invalidateEstadoCache(): void;
5
19
  /**
6
20
  * Check if a directory contains a valid Maestro project
7
21
  */
@@ -26,13 +40,10 @@ export declare function clearCurrentDirectory(): void;
26
40
  export declare function hasCurrentDirectory(): boolean;
27
41
  /**
28
42
  * Get default projects directory based on environment
29
- * In production (Docker), use /app/projects (where volume is mounted)
30
- * In development, use current working directory
31
43
  */
32
44
  export declare function getDefaultProjectsDirectory(): string;
33
45
  /**
34
46
  * Get project directory from args or fallback to current/cwd
35
- * Also performs auto-detection of existing projects
36
47
  */
37
48
  export declare function resolveDirectory(argsDir?: string): string;
38
49
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/state/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGnD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIrD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,CAIpD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAsBzD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMxD"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/state/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAqBvD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAE9E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAQvE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGnD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAOrD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAI5C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,CAIpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAczD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMxD"}
@@ -1,6 +1,7 @@
1
1
  /**
2
- * Global project context management
2
+ * Global project context management — v6.3
3
3
  * Tracks the current project directory across tool calls
4
+ * S4.1: Adds state cache to avoid repeated disk reads within the same session
4
5
  */
5
6
  import { existsSync } from "fs";
6
7
  import { join } from "path";
@@ -9,6 +10,35 @@ import { setProjectDirectory } from "../utils/files.js";
9
10
  let currentProjectDirectory = null;
10
11
  // Path to state file
11
12
  const ESTADO_FILE = ".maestro/estado.json";
13
+ const CACHE_TTL_MS = 30_000;
14
+ let estadoCache = null;
15
+ /**
16
+ * Armazena estado no cache (chamar após salvarEstado / parsearEstado bem-sucedido)
17
+ */
18
+ export function setCachedEstado(estado, diretorio) {
19
+ estadoCache = { estado, timestamp: Date.now(), diretorio };
20
+ }
21
+ /**
22
+ * Recupera estado do cache se ainda válido para o diretório informado
23
+ */
24
+ export function getCachedEstado(diretorio) {
25
+ if (!estadoCache)
26
+ return null;
27
+ if (estadoCache.diretorio !== diretorio)
28
+ return null;
29
+ if (Date.now() - estadoCache.timestamp > CACHE_TTL_MS) {
30
+ estadoCache = null;
31
+ return null;
32
+ }
33
+ return estadoCache.estado;
34
+ }
35
+ /**
36
+ * Invalida o cache (chamar quando estado for modificado)
37
+ */
38
+ export function invalidateEstadoCache() {
39
+ estadoCache = null;
40
+ }
41
+ // ─── Directory management ─────────────────────────────────────────────────────
12
42
  /**
13
43
  * Check if a directory contains a valid Maestro project
14
44
  */
@@ -21,8 +51,11 @@ export function isValidProject(dir) {
21
51
  * Also updates the files utility for local content reading
22
52
  */
23
53
  export function setCurrentDirectory(dir) {
54
+ // Invalida cache se mudar de diretório
55
+ if (currentProjectDirectory !== dir) {
56
+ invalidateEstadoCache();
57
+ }
24
58
  currentProjectDirectory = dir;
25
- // Sincroniza com files.ts para leitura de content local
26
59
  setProjectDirectory(dir);
27
60
  }
28
61
  /**
@@ -37,6 +70,7 @@ export function getCurrentDirectory() {
37
70
  */
38
71
  export function clearCurrentDirectory() {
39
72
  currentProjectDirectory = null;
73
+ estadoCache = null;
40
74
  setProjectDirectory(null);
41
75
  }
42
76
  /**
@@ -47,8 +81,6 @@ export function hasCurrentDirectory() {
47
81
  }
48
82
  /**
49
83
  * Get default projects directory based on environment
50
- * In production (Docker), use /app/projects (where volume is mounted)
51
- * In development, use current working directory
52
84
  */
53
85
  export function getDefaultProjectsDirectory() {
54
86
  return process.env.NODE_ENV === "production"
@@ -57,21 +89,16 @@ export function getDefaultProjectsDirectory() {
57
89
  }
58
90
  /**
59
91
  * Get project directory from args or fallback to current/cwd
60
- * Also performs auto-detection of existing projects
61
92
  */
62
93
  export function resolveDirectory(argsDir) {
63
- // If directory provided, use it and update global state
64
94
  if (argsDir) {
65
95
  setCurrentDirectory(argsDir);
66
96
  return argsDir;
67
97
  }
68
- // If we have a current directory, use it
69
98
  if (currentProjectDirectory) {
70
99
  return currentProjectDirectory;
71
100
  }
72
- // Fallback to cwd
73
101
  const cwd = process.cwd();
74
- // Check if cwd has a valid project
75
102
  if (isValidProject(cwd)) {
76
103
  setCurrentDirectory(cwd);
77
104
  return cwd;
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/state/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,qDAAqD;AACrD,IAAI,uBAAuB,GAAkB,IAAI,CAAC;AAElD,qBAAqB;AACrB,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1C,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC3C,uBAAuB,GAAG,GAAG,CAAC;IAC9B,wDAAwD;IACxD,mBAAmB,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IAC/B,OAAO,uBAAuB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACjC,uBAAuB,GAAG,IAAI,CAAC;IAC/B,mBAAmB,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IAC/B,OAAO,uBAAuB,KAAK,IAAI,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B;IACvC,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QACxC,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC7C,wDAAwD;IACxD,IAAI,OAAO,EAAE,CAAC;QACV,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,yCAAyC;IACzC,IAAI,uBAAuB,EAAE,CAAC;QAC1B,OAAO,uBAAuB,CAAC;IACnC,CAAC;IAED,kBAAkB;IAClB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,mCAAmC;IACnC,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO,GAAG,CAAC;IACf,CAAC;IAED,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACrC,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO,GAAG,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/state/context.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/state/storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAYvD;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAQrF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ1F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAC9B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,aAAa,GAC5C,aAAa,CA+Bf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB,CASA;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAMhE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACrC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAY3E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACpC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAUf"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/state/storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAYvD;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAQrF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ1F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAC9B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,aAAa,GAC5C,aAAa,CAyCf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB,CASA;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAMhE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACrC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAY3E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACpC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -60,6 +60,12 @@ export function criarEstadoInicial(projetoId, nome, diretorio, ide) {
60
60
  aguardando_aprovacao: false,
61
61
  motivo_bloqueio: undefined,
62
62
  score_bloqueado: undefined,
63
+ // V6 Sprint 2: Estado compulsório (bloqueio durante correção de gate)
64
+ em_estado_compulsorio: false,
65
+ tools_permitidas_no_compulsorio: ['executar', 'validar', 'contexto'],
66
+ // V6 Sprint 6: Smart Auto-Flow
67
+ flow_phase_type: 'input_required', // Fase 1 (Produto) começa com input required
68
+ auto_flow_enabled: false,
63
69
  criado_em: new Date().toISOString(),
64
70
  atualizado_em: new Date().toISOString(),
65
71
  };
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/state/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/state/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=aprovar-gate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aprovar-gate.test.d.ts","sourceRoot":"","sources":["../../src/tests/aprovar-gate.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,113 @@
1
+ import { vi, describe, it, expect, beforeEach } from 'vitest';
2
+ import { aprovarGate } from '../tools/aprovar-gate.js';
3
+ import * as storage from '../state/storage.js';
4
+ // Mocks
5
+ vi.mock('../state/storage.js', () => ({
6
+ parsearEstado: vi.fn(),
7
+ serializarEstado: vi.fn()
8
+ }));
9
+ vi.mock('../state/context.js', () => ({
10
+ setCurrentDirectory: vi.fn()
11
+ }));
12
+ vi.mock('../utils/files.js', () => ({
13
+ resolveProjectPath: vi.fn((p) => p),
14
+ normalizeProjectPath: vi.fn((p) => p)
15
+ }));
16
+ vi.mock('../utils/history.js', () => ({
17
+ logEvent: vi.fn(),
18
+ EventTypes: {}
19
+ }));
20
+ vi.mock('../flows/types.js', () => ({
21
+ getFaseComStitch: vi.fn().mockReturnValue({ nome: 'Fase de Teste', entregavel_esperado: 'Doc de Teste' })
22
+ }));
23
+ vi.mock('../services/specialist.service.js', () => ({
24
+ getSpecialistPersona: vi.fn().mockReturnValue('Persona de Teste')
25
+ }));
26
+ describe('AprovarGate Tool', () => {
27
+ beforeEach(() => {
28
+ vi.clearAllMocks();
29
+ });
30
+ it('deve retornar erro se nao informar estado_json', async () => {
31
+ const result = await aprovarGate({
32
+ acao: 'aprovar',
33
+ estado_json: '',
34
+ diretorio: '/test'
35
+ });
36
+ expect(result.content[0].text).toContain('uso EXCLUSIVO do usuário');
37
+ expect(result.isError).toBeUndefined(); // Por design, o texto instrucional não tem isError = true
38
+ });
39
+ it('deve retornar mensagem informacional se o estado não estiver aguardando aprovação', async () => {
40
+ const estadoFalso = { aguardando_aprovacao: false, fase_atual: 1, total_fases: 10, nivel: 'simples' };
41
+ vi.mocked(storage.parsearEstado).mockReturnValue(estadoFalso);
42
+ const result = await aprovarGate({
43
+ acao: 'aprovar',
44
+ estado_json: JSON.stringify(estadoFalso),
45
+ diretorio: '/test'
46
+ });
47
+ expect(result.content[0].text).toContain('Nenhuma Aprovação Pendente');
48
+ });
49
+ it('deve retornar erro se acao for aprovar mas não houver score bloqueado', async () => {
50
+ const estadoAguardando = { aguardando_aprovacao: true, score_bloqueado: undefined, fase_atual: 1 };
51
+ vi.mocked(storage.parsearEstado).mockReturnValue(estadoAguardando);
52
+ const result = await aprovarGate({
53
+ acao: 'aprovar',
54
+ estado_json: JSON.stringify(estadoAguardando),
55
+ diretorio: '/test'
56
+ });
57
+ expect(result.isError).toBe(true);
58
+ expect(result.content[0].text).toContain('Aprovação Inválida');
59
+ });
60
+ it('deve aprovar o gate com sucesso, removendo flag compulsória e retornando next_action proximo', async () => {
61
+ const estadoValido = {
62
+ aguardando_aprovacao: true,
63
+ score_bloqueado: 60,
64
+ fase_atual: 1,
65
+ total_fases: 10,
66
+ gates_validados: [],
67
+ em_estado_compulsorio: true, // v6 compulsório
68
+ motivo_bloqueio: 'Faltam coisas'
69
+ };
70
+ vi.mocked(storage.parsearEstado).mockReturnValue(estadoValido);
71
+ vi.mocked(storage.serializarEstado).mockReturnValue({ content: '{"mock":true}', path: 'estado.json' });
72
+ const result = await aprovarGate({
73
+ acao: 'aprovar',
74
+ estado_json: JSON.stringify(estadoValido),
75
+ diretorio: '/test'
76
+ });
77
+ // Verificações de mutação de estado
78
+ expect(estadoValido.aguardando_aprovacao).toBe(false);
79
+ expect(estadoValido.score_bloqueado).toBeUndefined();
80
+ expect(estadoValido.motivo_bloqueio).toBeUndefined();
81
+ expect(estadoValido.em_estado_compulsorio).toBe(false);
82
+ expect(storage.serializarEstado).toHaveBeenCalledWith(estadoValido);
83
+ expect(result.next_action?.tool).toBe('proximo');
84
+ expect(result.content[0].text).toContain('Gate Aprovado pelo Usuário');
85
+ });
86
+ it('deve rejeitar o gate com sucesso e retornar next_action validar_gate', async () => {
87
+ const estadoValido = {
88
+ aguardando_aprovacao: true,
89
+ score_bloqueado: 60,
90
+ fase_atual: 1,
91
+ total_fases: 10,
92
+ gates_validados: [],
93
+ em_estado_compulsorio: true,
94
+ motivo_bloqueio: 'Faltam coisas'
95
+ };
96
+ vi.mocked(storage.parsearEstado).mockReturnValue(estadoValido);
97
+ vi.mocked(storage.serializarEstado).mockReturnValue({ content: '{"mock":true}', path: 'estado.json' });
98
+ const result = await aprovarGate({
99
+ acao: 'rejeitar',
100
+ estado_json: JSON.stringify(estadoValido),
101
+ diretorio: '/test'
102
+ });
103
+ // Verificações de mutação de estado
104
+ expect(estadoValido.aguardando_aprovacao).toBe(false);
105
+ expect(estadoValido.score_bloqueado).toBeUndefined();
106
+ expect(estadoValido.motivo_bloqueio).toBeUndefined();
107
+ expect(estadoValido.em_estado_compulsorio).toBe(false);
108
+ expect(storage.serializarEstado).toHaveBeenCalledWith(estadoValido);
109
+ expect(result.next_action?.tool).toBe('validar_gate');
110
+ expect(result.content[0].text).toContain('Gate Rejeitado pelo Usuário');
111
+ });
112
+ });
113
+ //# sourceMappingURL=aprovar-gate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aprovar-gate.test.js","sourceRoot":"","sources":["../../src/tests/aprovar-gate.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Testes para DeliverableValidator v6.1
3
+ *
4
+ * Cobre os cenários críticos de validação de entregáveis de fase:
5
+ * - PRD vazio → bloqueado
6
+ * - PRD completo → aprovado
7
+ * - Placeholders → penalizado
8
+ * - Gate checklist → score aumenta quando evidenciado
9
+ * - Fases de código (Frontend/Backend) → tratamento especial
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=deliverable-validator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deliverable-validator.test.d.ts","sourceRoot":"","sources":["../../src/tests/deliverable-validator.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Testes para DeliverableValidator v6.1
3
+ *
4
+ * Cobre os cenários críticos de validação de entregáveis de fase:
5
+ * - PRD vazio → bloqueado
6
+ * - PRD completo → aprovado
7
+ * - Placeholders → penalizado
8
+ * - Gate checklist → score aumenta quando evidenciado
9
+ * - Fases de código (Frontend/Backend) → tratamento especial
10
+ */
11
+ import { describe, it, expect } from 'vitest';
12
+ import { DeliverableValidator } from '../core/validation/layers/DeliverableValidator.js';
13
+ const validator = new DeliverableValidator();
14
+ // ─── Helpers ───────────────────────────────────────────────────────────────
15
+ function makeContext(nomeFase, gateChecklist = []) {
16
+ return {
17
+ projectPath: '/test/project',
18
+ nomeFase,
19
+ gateChecklist,
20
+ tier: 'base',
21
+ };
22
+ }
23
+ const PRD_VAZIO = '';
24
+ const PRD_CURTO = '# PRD\n\nAlgum texto.';
25
+ const PRD_PLACEHOLDER = `# PRD do Produto
26
+
27
+ ## Problema
28
+ Lorem ipsum dolor sit amet.
29
+
30
+ ## Objetivo
31
+ TODO: definir objetivo
32
+
33
+ ## Persona
34
+ [inserir persona aqui]
35
+
36
+ ## MVP
37
+ - Feature A
38
+ - Feature B
39
+
40
+ ## Funcionalidades
41
+ FIXME: listar funcionalidades
42
+ `;
43
+ const PRD_COMPLETO = `# PRD — Sistema de Gestão de Pedidos
44
+
45
+ ## Problema
46
+ Restaurantes perdem pedidos por falta de sistema centralizado. O processo manual gera erros e atrasos.
47
+
48
+ ## Objetivo
49
+ Criar um sistema digital que centralize pedidos, reduza erros em 80% e aumente a satisfação dos clientes.
50
+
51
+ ## Persona
52
+ **João, Gerente de Restaurante** — 35 anos, usa smartphone, precisa de visibilidade em tempo real dos pedidos.
53
+
54
+ ## MVP
55
+ O MVP inclui: cadastro de produtos, recebimento de pedidos via tablet, notificação para cozinha, e relatório diário.
56
+
57
+ ## Funcionalidades Principais
58
+ 1. Cadastro de cardápio com categorias e preços
59
+ 2. Interface de pedido para garçons (tablet)
60
+ 3. Painel da cozinha com fila de pedidos
61
+ 4. Relatório de vendas por período
62
+ 5. Integração com sistema de pagamento
63
+
64
+ ## Critérios de Sucesso
65
+ - Redução de 80% nos erros de pedido
66
+ - Tempo de atendimento < 2 minutos
67
+ - Satisfação do cliente ≥ 4.5/5
68
+ `;
69
+ const REQUISITOS_COMPLETO = `# Requisitos do Sistema
70
+
71
+ ## RF-001 — Cadastro de Produto
72
+ O sistema deve permitir cadastrar produtos com nome, preço e categoria.
73
+ **Critério de aceite:** Produto salvo aparece no cardápio em < 1s.
74
+
75
+ ## RF-002 — Pedido via Tablet
76
+ O garçom deve conseguir registrar pedidos pelo tablet.
77
+ **Critério de aceite:** Pedido enviado para cozinha em < 3s.
78
+
79
+ ## RNF-001 — Performance
80
+ O sistema deve responder em < 500ms para 95% das requisições.
81
+
82
+ ## RNF-002 — Disponibilidade
83
+ O sistema deve ter uptime de 99.9%.
84
+
85
+ ## Critérios de Aceite Gerais
86
+ Todos os RFs devem ter testes automatizados com cobertura > 80%.
87
+ `;
88
+ // ─── Testes ────────────────────────────────────────────────────────────────
89
+ describe('DeliverableValidator: Fase Produto (PRD)', () => {
90
+ it('deve BLOQUEAR entregável vazio', async () => {
91
+ const result = await validator.validate(PRD_VAZIO, makeContext('Produto'));
92
+ expect(result.passed).toBe(false);
93
+ expect(result.score).toBeLessThan(70);
94
+ });
95
+ it('deve BLOQUEAR entregável muito curto', async () => {
96
+ const result = await validator.validate(PRD_CURTO, makeContext('Produto'));
97
+ expect(result.passed).toBe(false);
98
+ expect(result.issues.some(i => i.type === 'content-too-short')).toBe(true);
99
+ });
100
+ it('deve PENALIZAR entregável com placeholders', async () => {
101
+ const result = await validator.validate(PRD_PLACEHOLDER, makeContext('Produto'));
102
+ expect(result.issues.some(i => i.type === 'placeholder-content')).toBe(true);
103
+ // Score deve ser menor que um PRD sem placeholders
104
+ const resultSemPlaceholder = await validator.validate(PRD_COMPLETO, makeContext('Produto'));
105
+ expect(result.score).toBeLessThan(resultSemPlaceholder.score);
106
+ });
107
+ it('deve APROVAR PRD completo com todas as seções', async () => {
108
+ const result = await validator.validate(PRD_COMPLETO, makeContext('Produto'));
109
+ expect(result.passed).toBe(true);
110
+ expect(result.score).toBeGreaterThanOrEqual(70);
111
+ });
112
+ it('deve ter score maior quando gate checklist é evidenciado', async () => {
113
+ const gate = ['problema', 'persona', 'funcionalidades'];
114
+ const resultSemGate = await validator.validate(PRD_COMPLETO, makeContext('Produto', []));
115
+ const resultComGate = await validator.validate(PRD_COMPLETO, makeContext('Produto', gate));
116
+ // Com gate evidenciado, score deve ser igual ou maior (bônus)
117
+ expect(resultComGate.score).toBeGreaterThanOrEqual(resultSemGate.score);
118
+ });
119
+ it('deve PENALIZAR quando gate checklist não é evidenciado', async () => {
120
+ const gate = ['análise competitiva detalhada', 'projeção financeira de 5 anos', 'pesquisa com 1000 usuários'];
121
+ const result = await validator.validate(PRD_COMPLETO, makeContext('Produto', gate));
122
+ // Gate items muito específicos não estarão no PRD → penalidade
123
+ expect(result.issues.some(i => i.type === 'gate-checklist-incomplete')).toBe(true);
124
+ });
125
+ });
126
+ describe('DeliverableValidator: Fase Requisitos', () => {
127
+ it('deve APROVAR requisitos completos com RF, RNF e critérios', async () => {
128
+ const result = await validator.validate(REQUISITOS_COMPLETO, makeContext('Requisitos'));
129
+ expect(result.passed).toBe(true);
130
+ expect(result.score).toBeGreaterThanOrEqual(70);
131
+ });
132
+ it('deve detectar ausência de critérios de aceite', async () => {
133
+ const semCriterios = `# Requisitos\n\n## RF-001\nO sistema deve fazer X.\n\n## RNF-001\nPerformance adequada.\n`;
134
+ const result = await validator.validate(semCriterios, makeContext('Requisitos'));
135
+ // 'aceite' está nos termos obrigatórios — deve detectar ausência
136
+ const missingIssue = result.issues.find(i => i.type === 'missing-sections');
137
+ expect(missingIssue).toBeDefined();
138
+ });
139
+ });
140
+ describe('DeliverableValidator: Qualidade do Markdown', () => {
141
+ it('deve detectar documento sem headings', async () => {
142
+ const semHeadings = 'Apenas texto sem nenhum heading markdown. '.repeat(50);
143
+ const result = await validator.validate(semHeadings, makeContext('Produto'));
144
+ expect(result.issues.some(i => i.type === 'no-headings')).toBe(true);
145
+ });
146
+ it('deve detectar documento apenas com bullets', async () => {
147
+ const apenasBullets = Array(20).fill('- Item de lista sem contexto').join('\n');
148
+ const result = await validator.validate(apenasBullets, makeContext('Produto'));
149
+ expect(result.issues.some(i => i.type === 'only-bullets')).toBe(true);
150
+ });
151
+ });
152
+ describe('DeliverableValidator: Fases de Código (Frontend/Backend)', () => {
153
+ const codigoFrontend = `
154
+ import React, { useState } from 'react';
155
+ import { useNavigate } from 'react-router-dom';
156
+
157
+ // Componente de lista de pedidos
158
+ export function OrderList() {
159
+ const [orders, setOrders] = useState([]);
160
+ const navigate = useNavigate();
161
+
162
+ // Estado de carregamento
163
+ const [loading, setLoading] = useState(false);
164
+
165
+ return (
166
+ <div className="order-list">
167
+ {orders.map(order => (
168
+ <div key={order.id}>{order.name}</div>
169
+ ))}
170
+ </div>
171
+ );
172
+ }
173
+
174
+ // Rota principal
175
+ export default OrderList;
176
+ `;
177
+ it('deve detectar entregável de código para fase Frontend', async () => {
178
+ const result = await validator.validate(codigoFrontend, makeContext('Frontend'));
179
+ // Para código, não deve exigir headings Markdown
180
+ const noHeadingsIssue = result.issues.find(i => i.type === 'no-headings');
181
+ // Código legítimo não deve ser bloqueado por falta de headings Markdown
182
+ // (o validator deve detectar que é código e não Markdown)
183
+ expect(result.score).toBeGreaterThan(0); // Não deve dar score 0 para código válido
184
+ });
185
+ it('deve ter tamanho mínimo menor para fases de código', async () => {
186
+ // Fases de código têm tamanho mínimo de 300 chars (menor que PRD com 800)
187
+ const codigoCurto = `export function hello() { return 'world'; }`;
188
+ const result = await validator.validate(codigoCurto, makeContext('Frontend'));
189
+ // Código curto pode falhar por tamanho, mas não por ausência de headings
190
+ const noHeadingsIssue = result.issues.find(i => i.type === 'no-headings');
191
+ // Para código, não deve ter issue de headings
192
+ expect(noHeadingsIssue).toBeUndefined();
193
+ });
194
+ });
195
+ describe('DeliverableValidator: Score e Threshold', () => {
196
+ it('score deve ser 100 para documento perfeito sem issues', async () => {
197
+ // Fase sem seções obrigatórias definidas → sem penalidades de seção
198
+ const conteudoPerfeito = `# Documento Perfeito\n\n${'Conteúdo detalhado e completo. '.repeat(30)}`;
199
+ const result = await validator.validate(conteudoPerfeito, makeContext('Desconhecida'));
200
+ expect(result.score).toBeGreaterThanOrEqual(90); // Sem penalidades → score alto
201
+ });
202
+ it('threshold de aprovação deve ser 70', async () => {
203
+ // Verificar que o threshold é 70 (não 60 nem 80)
204
+ const result = await validator.validate(PRD_COMPLETO, makeContext('Produto'));
205
+ // PRD completo deve passar com score ≥ 70
206
+ if (result.score >= 70) {
207
+ expect(result.passed).toBe(true);
208
+ }
209
+ else {
210
+ expect(result.passed).toBe(false);
211
+ }
212
+ });
213
+ });
214
+ //# sourceMappingURL=deliverable-validator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deliverable-validator.test.js","sourceRoot":"","sources":["../../src/tests/deliverable-validator.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;AAGzF,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAE7C,8EAA8E;AAE9E,SAAS,WAAW,CAAC,QAAgB,EAAE,gBAA0B,EAAE;IAC/D,OAAO;QACH,WAAW,EAAE,eAAe;QAC5B,QAAQ;QACR,aAAa;QACb,IAAI,EAAE,MAAM;KACf,CAAC;AACN,CAAC;AAED,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,SAAS,GAAG,uBAAuB,CAAC;AAC1C,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;CAiBvB,CAAC;AAEF,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBpB,CAAC;AAEF,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;CAkB3B,CAAC;AAEF,8EAA8E;AAE9E,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QACjF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7E,mDAAmD;QACnD,MAAM,oBAAoB,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5F,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAExD,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;QACzF,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QAE3F,8DAA8D;QAC9D,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,IAAI,GAAG,CAAC,+BAA+B,EAAE,+BAA+B,EAAE,4BAA4B,CAAC,CAAC;QAC9G,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QAEpF,+DAA+D;QAC/D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;QACxF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,YAAY,GAAG,2FAA2F,CAAC;QACjH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;QACjF,iEAAiE;QACjE,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC;QAC5E,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;IACzD,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,WAAW,GAAG,4CAA4C,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,aAAa,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACtE,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuB1B,CAAC;IAEE,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;QACjF,iDAAiD;QACjD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;QAC1E,wEAAwE;QACxE,0DAA0D;QAC1D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,0CAA0C;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAChE,0EAA0E;QAC1E,MAAM,WAAW,GAAG,6CAA6C,CAAC;QAClE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9E,yEAAyE;QACzE,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;QAC1E,8CAA8C;QAC9C,MAAM,CAAC,eAAe,CAAC,CAAC,aAAa,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACnE,oEAAoE;QACpE,MAAM,gBAAgB,GAAG,2BAA2B,iCAAiC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QACnG,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC;QACvF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,+BAA+B;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAChD,iDAAiD;QACjD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9E,0CAA0C;QAC1C,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACrB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=flow-engine.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-engine.test.d.ts","sourceRoot":"","sources":["../../src/tests/flow-engine.test.ts"],"names":[],"mappings":""}