@dewtech/dare-cli 3.6.0 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/README.md +10 -0
  2. package/dist/__tests__/ide-command-parity.test.js +1 -0
  3. package/dist/__tests__/ide-command-parity.test.js.map +1 -1
  4. package/dist/__tests__/patterns-no-llm.test.d.ts +2 -0
  5. package/dist/__tests__/patterns-no-llm.test.d.ts.map +1 -0
  6. package/dist/__tests__/patterns-no-llm.test.js +31 -0
  7. package/dist/__tests__/patterns-no-llm.test.js.map +1 -0
  8. package/dist/__tests__/patterns-path-confinement.test.d.ts +2 -0
  9. package/dist/__tests__/patterns-path-confinement.test.d.ts.map +1 -0
  10. package/dist/__tests__/patterns-path-confinement.test.js +58 -0
  11. package/dist/__tests__/patterns-path-confinement.test.js.map +1 -0
  12. package/dist/__tests__/patterns.test.d.ts +2 -0
  13. package/dist/__tests__/patterns.test.d.ts.map +1 -0
  14. package/dist/__tests__/patterns.test.js +102 -0
  15. package/dist/__tests__/patterns.test.js.map +1 -0
  16. package/dist/bin/dare.js +2 -0
  17. package/dist/bin/dare.js.map +1 -1
  18. package/dist/commands/__tests__/design-interactive.test.d.ts +2 -0
  19. package/dist/commands/__tests__/design-interactive.test.d.ts.map +1 -0
  20. package/dist/commands/__tests__/design-interactive.test.js +44 -0
  21. package/dist/commands/__tests__/design-interactive.test.js.map +1 -0
  22. package/dist/commands/__tests__/execute.formal.spec.d.ts +2 -0
  23. package/dist/commands/__tests__/execute.formal.spec.d.ts.map +1 -0
  24. package/dist/commands/__tests__/execute.formal.spec.js +81 -0
  25. package/dist/commands/__tests__/execute.formal.spec.js.map +1 -0
  26. package/dist/commands/__tests__/patterns.test.d.ts +2 -0
  27. package/dist/commands/__tests__/patterns.test.d.ts.map +1 -0
  28. package/dist/commands/__tests__/patterns.test.js +55 -0
  29. package/dist/commands/__tests__/patterns.test.js.map +1 -0
  30. package/dist/commands/design.d.ts.map +1 -1
  31. package/dist/commands/design.js +38 -8
  32. package/dist/commands/design.js.map +1 -1
  33. package/dist/commands/execute-verification.d.ts +15 -1
  34. package/dist/commands/execute-verification.d.ts.map +1 -1
  35. package/dist/commands/execute-verification.js +43 -4
  36. package/dist/commands/execute-verification.js.map +1 -1
  37. package/dist/commands/execute.d.ts.map +1 -1
  38. package/dist/commands/execute.js +27 -3
  39. package/dist/commands/execute.js.map +1 -1
  40. package/dist/commands/graph.d.ts.map +1 -1
  41. package/dist/commands/graph.js +2 -0
  42. package/dist/commands/graph.js.map +1 -1
  43. package/dist/commands/patterns.d.ts +3 -0
  44. package/dist/commands/patterns.d.ts.map +1 -0
  45. package/dist/commands/patterns.js +124 -0
  46. package/dist/commands/patterns.js.map +1 -0
  47. package/dist/graphrag/__tests__/pattern-ingest.test.d.ts +2 -0
  48. package/dist/graphrag/__tests__/pattern-ingest.test.d.ts.map +1 -0
  49. package/dist/graphrag/__tests__/pattern-ingest.test.js +49 -0
  50. package/dist/graphrag/__tests__/pattern-ingest.test.js.map +1 -0
  51. package/dist/graphrag/__tests__/types.test.js +7 -2
  52. package/dist/graphrag/__tests__/types.test.js.map +1 -1
  53. package/dist/graphrag/pattern-ingest.d.ts +10 -0
  54. package/dist/graphrag/pattern-ingest.d.ts.map +1 -0
  55. package/dist/graphrag/pattern-ingest.js +77 -0
  56. package/dist/graphrag/pattern-ingest.js.map +1 -0
  57. package/dist/graphrag/types.d.ts +15 -4
  58. package/dist/graphrag/types.d.ts.map +1 -1
  59. package/dist/graphrag/types.js +5 -0
  60. package/dist/graphrag/types.js.map +1 -1
  61. package/dist/index.d.ts +1 -0
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +1 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/steering/__tests__/loader.test.js +15 -0
  66. package/dist/steering/__tests__/loader.test.js.map +1 -1
  67. package/dist/steering/loader.d.ts.map +1 -1
  68. package/dist/steering/loader.js +11 -0
  69. package/dist/steering/loader.js.map +1 -1
  70. package/dist/utils/__tests__/design-questionnaire.test.d.ts +2 -0
  71. package/dist/utils/__tests__/design-questionnaire.test.d.ts.map +1 -0
  72. package/dist/utils/__tests__/design-questionnaire.test.js +72 -0
  73. package/dist/utils/__tests__/design-questionnaire.test.js.map +1 -0
  74. package/dist/utils/__tests__/pattern-detector.test.d.ts +2 -0
  75. package/dist/utils/__tests__/pattern-detector.test.d.ts.map +1 -0
  76. package/dist/utils/__tests__/pattern-detector.test.js +81 -0
  77. package/dist/utils/__tests__/pattern-detector.test.js.map +1 -0
  78. package/dist/utils/__tests__/pattern-facts.test.d.ts +2 -0
  79. package/dist/utils/__tests__/pattern-facts.test.d.ts.map +1 -0
  80. package/dist/utils/__tests__/pattern-facts.test.js +55 -0
  81. package/dist/utils/__tests__/pattern-facts.test.js.map +1 -0
  82. package/dist/utils/design-questionnaire.d.ts +22 -0
  83. package/dist/utils/design-questionnaire.d.ts.map +1 -0
  84. package/dist/utils/design-questionnaire.js +151 -0
  85. package/dist/utils/design-questionnaire.js.map +1 -0
  86. package/dist/utils/path-safety.d.ts.map +1 -1
  87. package/dist/utils/path-safety.js +6 -1
  88. package/dist/utils/path-safety.js.map +1 -1
  89. package/dist/utils/pattern-detector.d.ts +39 -0
  90. package/dist/utils/pattern-detector.d.ts.map +1 -0
  91. package/dist/utils/pattern-detector.js +291 -0
  92. package/dist/utils/pattern-detector.js.map +1 -0
  93. package/dist/utils/pattern-facts.d.ts +7 -0
  94. package/dist/utils/pattern-facts.d.ts.map +1 -0
  95. package/dist/utils/pattern-facts.js +86 -0
  96. package/dist/utils/pattern-facts.js.map +1 -0
  97. package/dist/verification/__tests__/best-of-n-runner.test.js +2 -15
  98. package/dist/verification/__tests__/best-of-n-runner.test.js.map +1 -1
  99. package/dist/verification/__tests__/config.formal.test.d.ts +2 -0
  100. package/dist/verification/__tests__/config.formal.test.d.ts.map +1 -0
  101. package/dist/verification/__tests__/config.formal.test.js +38 -0
  102. package/dist/verification/__tests__/config.formal.test.js.map +1 -0
  103. package/dist/verification/config.d.ts +3 -1
  104. package/dist/verification/config.d.ts.map +1 -1
  105. package/dist/verification/config.js +31 -0
  106. package/dist/verification/config.js.map +1 -1
  107. package/dist/verification/gates/formal/__tests__/anti-bypass.test.d.ts +2 -0
  108. package/dist/verification/gates/formal/__tests__/anti-bypass.test.d.ts.map +1 -0
  109. package/dist/verification/gates/formal/__tests__/anti-bypass.test.js +55 -0
  110. package/dist/verification/gates/formal/__tests__/anti-bypass.test.js.map +1 -0
  111. package/dist/verification/gates/formal/__tests__/dafny-parse.test.d.ts +2 -0
  112. package/dist/verification/gates/formal/__tests__/dafny-parse.test.d.ts.map +1 -0
  113. package/dist/verification/gates/formal/__tests__/dafny-parse.test.js +70 -0
  114. package/dist/verification/gates/formal/__tests__/dafny-parse.test.js.map +1 -0
  115. package/dist/verification/gates/formal/__tests__/marker.test.d.ts +2 -0
  116. package/dist/verification/gates/formal/__tests__/marker.test.d.ts.map +1 -0
  117. package/dist/verification/gates/formal/__tests__/marker.test.js +55 -0
  118. package/dist/verification/gates/formal/__tests__/marker.test.js.map +1 -0
  119. package/dist/verification/gates/formal/__tests__/no-shell-formal.test.d.ts +2 -0
  120. package/dist/verification/gates/formal/__tests__/no-shell-formal.test.d.ts.map +1 -0
  121. package/dist/verification/gates/formal/__tests__/no-shell-formal.test.js +35 -0
  122. package/dist/verification/gates/formal/__tests__/no-shell-formal.test.js.map +1 -0
  123. package/dist/verification/gates/formal/__tests__/registry.test.d.ts +2 -0
  124. package/dist/verification/gates/formal/__tests__/registry.test.d.ts.map +1 -0
  125. package/dist/verification/gates/formal/__tests__/registry.test.js +22 -0
  126. package/dist/verification/gates/formal/__tests__/registry.test.js.map +1 -0
  127. package/dist/verification/gates/formal/__tests__/runner-formal.test.d.ts +2 -0
  128. package/dist/verification/gates/formal/__tests__/runner-formal.test.d.ts.map +1 -0
  129. package/dist/verification/gates/formal/__tests__/runner-formal.test.js +112 -0
  130. package/dist/verification/gates/formal/__tests__/runner-formal.test.js.map +1 -0
  131. package/dist/verification/gates/formal/__tests__/security-formal.test.d.ts +2 -0
  132. package/dist/verification/gates/formal/__tests__/security-formal.test.d.ts.map +1 -0
  133. package/dist/verification/gates/formal/__tests__/security-formal.test.js +195 -0
  134. package/dist/verification/gates/formal/__tests__/security-formal.test.js.map +1 -0
  135. package/dist/verification/gates/formal/__tests__/telemetry-formal.test.d.ts +2 -0
  136. package/dist/verification/gates/formal/__tests__/telemetry-formal.test.d.ts.map +1 -0
  137. package/dist/verification/gates/formal/__tests__/telemetry-formal.test.js +27 -0
  138. package/dist/verification/gates/formal/__tests__/telemetry-formal.test.js.map +1 -0
  139. package/dist/verification/gates/formal/__tests__/verified-rate.test.d.ts +2 -0
  140. package/dist/verification/gates/formal/__tests__/verified-rate.test.d.ts.map +1 -0
  141. package/dist/verification/gates/formal/__tests__/verified-rate.test.js +52 -0
  142. package/dist/verification/gates/formal/__tests__/verified-rate.test.js.map +1 -0
  143. package/dist/verification/gates/formal/anti-bypass.d.ts +20 -0
  144. package/dist/verification/gates/formal/anti-bypass.d.ts.map +1 -0
  145. package/dist/verification/gates/formal/anti-bypass.js +53 -0
  146. package/dist/verification/gates/formal/anti-bypass.js.map +1 -0
  147. package/dist/verification/gates/formal/backend.d.ts +38 -0
  148. package/dist/verification/gates/formal/backend.d.ts.map +1 -0
  149. package/dist/verification/gates/formal/backend.js +26 -0
  150. package/dist/verification/gates/formal/backend.js.map +1 -0
  151. package/dist/verification/gates/formal/dafny.d.ts +18 -0
  152. package/dist/verification/gates/formal/dafny.d.ts.map +1 -0
  153. package/dist/verification/gates/formal/dafny.js +131 -0
  154. package/dist/verification/gates/formal/dafny.js.map +1 -0
  155. package/dist/verification/gates/formal/lean.d.ts +17 -0
  156. package/dist/verification/gates/formal/lean.d.ts.map +1 -0
  157. package/dist/verification/gates/formal/lean.js +61 -0
  158. package/dist/verification/gates/formal/lean.js.map +1 -0
  159. package/dist/verification/gates/formal/marker.d.ts +15 -0
  160. package/dist/verification/gates/formal/marker.d.ts.map +1 -0
  161. package/dist/verification/gates/formal/marker.js +73 -0
  162. package/dist/verification/gates/formal/marker.js.map +1 -0
  163. package/dist/verification/gates/formal/registry.d.ts +7 -0
  164. package/dist/verification/gates/formal/registry.d.ts.map +1 -0
  165. package/dist/verification/gates/formal/registry.js +31 -0
  166. package/dist/verification/gates/formal/registry.js.map +1 -0
  167. package/dist/verification/gates/formal/runner.d.ts +31 -0
  168. package/dist/verification/gates/formal/runner.d.ts.map +1 -0
  169. package/dist/verification/gates/formal/runner.js +118 -0
  170. package/dist/verification/gates/formal/runner.js.map +1 -0
  171. package/dist/verification/gates/formal/verus.d.ts +17 -0
  172. package/dist/verification/gates/formal/verus.d.ts.map +1 -0
  173. package/dist/verification/gates/formal/verus.js +65 -0
  174. package/dist/verification/gates/formal/verus.js.map +1 -0
  175. package/dist/verification/runner.d.ts.map +1 -1
  176. package/dist/verification/runner.js +14 -0
  177. package/dist/verification/runner.js.map +1 -1
  178. package/dist/verification/telemetry.d.ts +3 -0
  179. package/dist/verification/telemetry.d.ts.map +1 -1
  180. package/dist/verification/telemetry.js +47 -0
  181. package/dist/verification/telemetry.js.map +1 -1
  182. package/dist/verification/types.d.ts +42 -1
  183. package/dist/verification/types.d.ts.map +1 -1
  184. package/package.json +1 -1
  185. package/templates/ide/antigravity/.agents/skills/dare-blueprint/SKILL.md +4 -0
  186. package/templates/ide/antigravity/.agents/skills/dare-design/SKILL.md +11 -0
  187. package/templates/ide/antigravity/.agents/skills/dare-patterns/SKILL.md +9 -0
  188. package/templates/ide/claude/.claude/commands/dare-blueprint.md +4 -0
  189. package/templates/ide/claude/.claude/commands/dare-design.md +10 -0
  190. package/templates/ide/claude/.claude/commands/dare-patterns.md +12 -0
  191. package/templates/ide/cursor/.cursor/commands/dare-blueprint.md +4 -2
  192. package/templates/ide/cursor/.cursor/commands/dare-design.md +9 -3
  193. package/templates/ide/cursor/.cursor/commands/dare-patterns.md +12 -0
@@ -0,0 +1,55 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { renderPatternsSkeleton } from '../pattern-facts.js';
3
+ const FIXTURE = {
4
+ generatedAt: '2026-06-07T12:00:00.000Z',
5
+ fileInventorySource: 'module-detector',
6
+ patterns: [
7
+ {
8
+ id: 'naming-idiom:service-suffix',
9
+ kind: 'naming-idiom',
10
+ description: '3 arquivos usam sufixo .service.ts',
11
+ frequency: 3,
12
+ coverage: 0.75,
13
+ evidence: [{ file: 'src/auth/auth.service.ts' }, { file: 'src/users/users.service.ts', line: 1 }],
14
+ modules: ['auth', 'users'],
15
+ marker: 'confirmed',
16
+ },
17
+ {
18
+ id: 'call-idiom:schema-validation',
19
+ kind: 'call-idiom',
20
+ description: '2 arquivos usam validação z./schema.parse',
21
+ frequency: 2,
22
+ coverage: 0.25,
23
+ evidence: [{ file: 'src/validate.ts', line: 2 }],
24
+ modules: ['src'],
25
+ marker: 'confirmed',
26
+ },
27
+ ],
28
+ };
29
+ describe('renderPatternsSkeleton', () => {
30
+ it('is deterministic for fixed input', () => {
31
+ const a = renderPatternsSkeleton(FIXTURE);
32
+ const b = renderPatternsSkeleton(FIXTURE);
33
+ expect(a).toBe(b);
34
+ expect(a).toMatchSnapshot();
35
+ });
36
+ it('includes all PatternKind sections even when empty', () => {
37
+ const md = renderPatternsSkeleton(FIXTURE);
38
+ expect(md).toContain('## Camadas inferidas');
39
+ expect(md).toContain('## Idiomas estruturais');
40
+ expect(md).toContain('_(nenhum detectado)_');
41
+ });
42
+ it('lists low-coverage patterns in Incertezas', () => {
43
+ const md = renderPatternsSkeleton(FIXTURE);
44
+ expect(md).toContain('## ⚠️ Incertezas');
45
+ expect(md).toContain('call-idiom:schema-validation');
46
+ expect(md).toContain('cobertura baixa');
47
+ });
48
+ it('uses factual claims and AGENT placeholders only', () => {
49
+ const md = renderPatternsSkeleton(FIXTURE);
50
+ expect(md).toContain('🟢 3 arquivos usam sufixo');
51
+ expect(md).toContain('<!-- AGENT:');
52
+ expect(md).not.toMatch(/\b(probably|likely|seems)\b/i);
53
+ });
54
+ });
55
+ //# sourceMappingURL=pattern-facts.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-facts.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/pattern-facts.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAG7D,MAAM,OAAO,GAAkB;IAC7B,WAAW,EAAE,0BAA0B;IACvC,mBAAmB,EAAE,iBAAiB;IACtC,QAAQ,EAAE;QACR;YACE,EAAE,EAAE,6BAA6B;YACjC,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,oCAAoC;YACjD,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACjG,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAC1B,MAAM,EAAE,WAAW;SACpB;QACD;YACE,EAAE,EAAE,8BAA8B;YAClC,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,2CAA2C;YACxD,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,CAAC,KAAK,CAAC;YAChB,MAAM,EAAE,WAAW;SACpB;KACF;CACF,CAAC;AAEF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,EAAE,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC7C,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QAC/C,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACzC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QACrD,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,EAAE,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QAClD,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { PatternsFacts } from './pattern-detector.js';
2
+ import type { DnaFacts } from './dna-detector.js';
3
+ /** Persona que origina a pergunta. NÃO executa nada — rótulo p/ a skill conduzir (A-8/A-9). */
4
+ export type PlannerPersona = 'analyst' | 'pm' | 'architect';
5
+ export interface PlanningQuestion {
6
+ readonly id: string;
7
+ readonly persona: PlannerPersona;
8
+ readonly phase: 'design' | 'blueprint';
9
+ readonly prompt: string;
10
+ readonly anchoredOn: readonly string[];
11
+ readonly kind: 'gap' | 'ambiguity' | 'tradeoff' | 'scope';
12
+ }
13
+ export interface PlanningArtifact {
14
+ readonly generatedAt: string;
15
+ readonly phase: 'design' | 'blueprint';
16
+ readonly questions: readonly PlanningQuestion[];
17
+ }
18
+ export declare function buildDesignQuestionnaire(dna: DnaFacts | null, patterns: PatternsFacts | null): PlanningArtifact;
19
+ export declare function buildBlueprintQuestionnaire(patterns: PatternsFacts | null): PlanningArtifact;
20
+ /** Markdown block for DESIGN.md (deterministic; CLI does not answer — skill conducts 1 passagem). */
21
+ export declare function renderDesignQuestionnaireBlock(artifact: PlanningArtifact): string;
22
+ //# sourceMappingURL=design-questionnaire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-questionnaire.d.ts","sourceRoot":"","sources":["../../src/utils/design-questionnaire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAkC,MAAM,uBAAuB,CAAC;AAC3F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,+FAA+F;AAC/F,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,WAAW,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;CAC3D;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,WAAW,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACjD;AA0CD,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,QAAQ,GAAG,IAAI,EACpB,QAAQ,EAAE,aAAa,GAAG,IAAI,GAC7B,gBAAgB,CAqFlB;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,aAAa,GAAG,IAAI,GAC7B,gBAAgB,CAyBlB;AAED,qGAAqG;AACrG,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAsBjF"}
@@ -0,0 +1,151 @@
1
+ const KIND_ORDER = [
2
+ 'inferred-layer',
3
+ 'naming-idiom',
4
+ 'structural-idiom',
5
+ 'call-idiom',
6
+ 'implicit-decision',
7
+ ];
8
+ function sortQuestions(questions) {
9
+ return [...questions].sort((a, b) => a.id.localeCompare(b.id));
10
+ }
11
+ function counterKey(persona, kind) {
12
+ return `${persona}-${kind}`;
13
+ }
14
+ function nextId(counters, persona, kind) {
15
+ const key = counterKey(persona, kind);
16
+ const n = (counters.get(key) ?? 0) + 1;
17
+ counters.set(key, n);
18
+ return `${persona}-${kind}-${String(n).padStart(2, '0')}`;
19
+ }
20
+ function patternsByKind(patterns) {
21
+ const map = new Map();
22
+ for (const kind of KIND_ORDER)
23
+ map.set(kind, []);
24
+ for (const p of patterns) {
25
+ const list = map.get(p.kind) ?? [];
26
+ list.push(p);
27
+ map.set(p.kind, list);
28
+ }
29
+ return map;
30
+ }
31
+ export function buildDesignQuestionnaire(dna, patterns) {
32
+ if (!dna && !patterns) {
33
+ return { generatedAt: '1970-01-01T00:00:00.000Z', phase: 'design', questions: [] };
34
+ }
35
+ const counters = new Map();
36
+ const questions = [];
37
+ const generatedAt = patterns?.generatedAt ?? dna?.generatedAt ?? '1970-01-01T00:00:00.000Z';
38
+ if (dna) {
39
+ const layers = dna.architecture.detectedLayers;
40
+ if (layers.length > 3 || dna.architecture.guess.toLowerCase().includes('unknown')) {
41
+ questions.push({
42
+ id: nextId(counters, 'analyst', 'ambiguity'),
43
+ persona: 'analyst',
44
+ phase: 'design',
45
+ prompt: `Arquitetura detectada: "${dna.architecture.guess}" com camadas [${layers.join(', ')}]. Confirmar o padrão dominante?`,
46
+ anchoredOn: ['dna:architecture'],
47
+ kind: 'ambiguity',
48
+ });
49
+ }
50
+ if (!dna.libraries.validation && (dna.libraries.http || dna.libraries.orm)) {
51
+ questions.push({
52
+ id: nextId(counters, 'analyst', 'scope'),
53
+ persona: 'analyst',
54
+ phase: 'design',
55
+ prompt: 'Biblioteca de validação não detectada no DNA, mas há HTTP/ORM. Qual estratégia de validação o projeto usa?',
56
+ anchoredOn: ['dna:libraries'],
57
+ kind: 'scope',
58
+ });
59
+ }
60
+ }
61
+ if (patterns) {
62
+ const byKind = patternsByKind(patterns.patterns);
63
+ for (const kind of KIND_ORDER) {
64
+ const list = byKind.get(kind) ?? [];
65
+ if (list.length === 0) {
66
+ questions.push({
67
+ id: nextId(counters, 'analyst', 'gap'),
68
+ persona: 'analyst',
69
+ phase: 'design',
70
+ prompt: `Nenhum padrão detectado na categoria "${kind}". Confirmar se esta categoria se aplica ao projeto?`,
71
+ anchoredOn: [`patterns:kind:${kind}`],
72
+ kind: 'gap',
73
+ });
74
+ }
75
+ }
76
+ for (const p of patterns.patterns) {
77
+ if (p.marker === 'gap' || p.coverage < 0.5) {
78
+ questions.push({
79
+ id: nextId(counters, 'analyst', 'gap'),
80
+ persona: 'analyst',
81
+ phase: 'design',
82
+ prompt: `${p.description} (cobertura ${(p.coverage * 100).toFixed(0)}%). Confirmar relevância deste padrão?`,
83
+ anchoredOn: [p.id],
84
+ kind: 'gap',
85
+ });
86
+ }
87
+ if ((p.kind === 'naming-idiom' || p.kind === 'call-idiom') &&
88
+ p.frequency >= 2) {
89
+ questions.push({
90
+ id: nextId(counters, 'pm', 'scope'),
91
+ persona: 'pm',
92
+ phase: 'design',
93
+ prompt: `Padrão "${p.id}" (${p.frequency} ocorrências): quais critérios de aceite devem preservar este idioma?`,
94
+ anchoredOn: [p.id],
95
+ kind: 'scope',
96
+ });
97
+ }
98
+ }
99
+ }
100
+ return {
101
+ generatedAt,
102
+ phase: 'design',
103
+ questions: sortQuestions(questions),
104
+ };
105
+ }
106
+ export function buildBlueprintQuestionnaire(patterns) {
107
+ if (!patterns || patterns.patterns.length === 0) {
108
+ return { generatedAt: '1970-01-01T00:00:00.000Z', phase: 'blueprint', questions: [] };
109
+ }
110
+ const counters = new Map();
111
+ const questions = [];
112
+ for (const p of patterns.patterns) {
113
+ if (p.kind !== 'implicit-decision' && p.kind !== 'structural-idiom')
114
+ continue;
115
+ questions.push({
116
+ id: nextId(counters, 'architect', 'tradeoff'),
117
+ persona: 'architect',
118
+ phase: 'blueprint',
119
+ prompt: `${p.description} — manter como padrão ou abstrair para nova feature?`,
120
+ anchoredOn: [p.id],
121
+ kind: 'tradeoff',
122
+ });
123
+ }
124
+ return {
125
+ generatedAt: patterns.generatedAt,
126
+ phase: 'blueprint',
127
+ questions: sortQuestions(questions),
128
+ };
129
+ }
130
+ /** Markdown block for DESIGN.md (deterministic; CLI does not answer — skill conducts 1 passagem). */
131
+ export function renderDesignQuestionnaireBlock(artifact) {
132
+ const lines = [
133
+ '## Perguntas de Planejamento (Analyst/PM)',
134
+ '',
135
+ '> Questionário determinístico (fatos+gaps). O CLI não responde — a skill `/dare-design` conduz **1 passagem sequencial**.',
136
+ '',
137
+ ];
138
+ if (artifact.questions.length === 0) {
139
+ lines.push('_Nenhuma pergunta gerada — execute `dare dna` e `dare patterns` primeiro._', '');
140
+ return lines.join('\n');
141
+ }
142
+ for (const q of artifact.questions) {
143
+ const anchor = q.anchoredOn.map((a) => `\`${a}\``).join(', ');
144
+ lines.push(`### ${q.id} (${q.persona} · ${q.kind})`);
145
+ lines.push(`- **Ancorado em:** ${anchor}`);
146
+ lines.push(`- **Pergunta:** ${q.prompt}`);
147
+ lines.push('');
148
+ }
149
+ return lines.join('\n');
150
+ }
151
+ //# sourceMappingURL=design-questionnaire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-questionnaire.js","sourceRoot":"","sources":["../../src/utils/design-questionnaire.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"path-safety.d.ts","sourceRoot":"","sources":["../../src/utils/path-safety.ts"],"names":[],"mappings":"AAGA,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,uDACsB,CAAC;AAEvD;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAG,aAAa,CAAU;gBAE3B,OAAO,GAAE,MAA4B;CAIlD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAQ3D;AA6BD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAWrE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAgB3E"}
1
+ {"version":3,"file":"path-safety.d.ts","sourceRoot":"","sources":["../../src/utils/path-safety.ts"],"names":[],"mappings":"AAGA,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,uDACsB,CAAC;AAEvD;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAG,aAAa,CAAU;gBAE3B,OAAO,GAAE,MAA4B;CAIlD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAa3D;AA6BD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAWrE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAgB3E"}
@@ -16,7 +16,12 @@ export class PathEscapeError extends Error {
16
16
  * Ensures a path is relative and does not escape via '..' (RS-01).
17
17
  */
18
18
  export function assertRelativeSafe(targetPath) {
19
- if (path.isAbsolute(targetPath)) {
19
+ // Rejeita absoluto em QUALQUER plataforma: POSIX (path.isAbsolute), drive-letter
20
+ // do Windows (C:\ ou C:/) e UNC (\\server / //server). path.isAbsolute é dependente
21
+ // do SO — na CI Linux ele não pega 'C:\...', então validamos explicitamente (RS-01).
22
+ const isWindowsDriveAbsolute = /^[a-zA-Z]:[\\/]/.test(targetPath);
23
+ const isUncAbsolute = /^[\\/]{2}/.test(targetPath);
24
+ if (path.isAbsolute(targetPath) || isWindowsDriveAbsolute || isUncAbsolute) {
20
25
  throw new Error(`targetPath must be relative, got absolute: ${targetPath}`);
21
26
  }
22
27
  const norm = path.posix.normalize(targetPath.replace(/\\/g, '/'));
@@ -1 +1 @@
1
- {"version":3,"file":"path-safety.js","sourceRoot":"","sources":["../../src/utils/path-safety.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,uDAAuD;AACvD,MAAM,CAAC,MAAM,mBAAmB,GAC9B,oDAAoD,CAAC;AAEvD;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAGxC,YAAY,UAAkB,mBAAmB;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAG,aAAsB,CAAC;QAIrC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,8CAA8C,UAAU,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAClE,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,qCAAqC,UAAU,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1C,OAAO,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,CAAS;IACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,UAAkB;IACvD,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IAC3D,OAAO,UAAU,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,QAAgB;IAC7D,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,eAAe,CAAC,gDAAgD,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAErD,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,eAAe,CAAC,mBAAmB,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,GAAG,QAAkB;IACjE,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,eAAe,CAAC,gDAAgD,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,eAAe,CAAC,mBAAmB,CAAC,CAAC;QACjD,CAAC;QACD,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC;IACjD,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"path-safety.js","sourceRoot":"","sources":["../../src/utils/path-safety.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { Marker } from './confidence.js';
2
+ import type { DnaFacts } from './dna-detector.js';
3
+ import { type ModuleInfo } from './module-detector.js';
4
+ export type PatternKind = 'inferred-layer' | 'naming-idiom' | 'structural-idiom' | 'call-idiom' | 'implicit-decision';
5
+ export interface PatternEvidence {
6
+ readonly file: string;
7
+ readonly line?: number;
8
+ }
9
+ export interface DiscoveredPattern {
10
+ readonly id: string;
11
+ readonly kind: PatternKind;
12
+ readonly description: string;
13
+ readonly frequency: number;
14
+ readonly coverage: number;
15
+ readonly evidence: readonly PatternEvidence[];
16
+ readonly modules: readonly string[];
17
+ readonly marker: Marker;
18
+ }
19
+ export interface PatternsFacts {
20
+ readonly generatedAt: string;
21
+ readonly fileInventorySource: DnaFacts['fileInventorySource'];
22
+ readonly patterns: readonly DiscoveredPattern[];
23
+ }
24
+ export interface PatternRuleInput {
25
+ readonly files: readonly string[];
26
+ readonly modules: readonly ModuleInfo[];
27
+ readonly dna: DnaFacts | null;
28
+ readonly readFile: (rel: string) => string | null;
29
+ }
30
+ export interface PatternRule {
31
+ readonly kind: PatternKind;
32
+ readonly minFrequency: number;
33
+ detect(input: PatternRuleInput): DiscoveredPattern[];
34
+ }
35
+ export declare const PATTERN_RULES: readonly PatternRule[];
36
+ export declare function detectPatterns(root: string, dna: DnaFacts | null, opts?: {
37
+ modulesOnly?: readonly string[];
38
+ }): Promise<PatternsFacts>;
39
+ //# sourceMappingURL=pattern-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-detector.d.ts","sourceRoot":"","sources":["../../src/utils/pattern-detector.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEtE,MAAM,MAAM,WAAW,GACnB,gBAAgB,GAChB,cAAc,GACd,kBAAkB,GAClB,YAAY,GACZ,mBAAmB,CAAC;AAExB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,mBAAmB,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IAC9D,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,EAAE,CAAC;CACtD;AAqRD,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAM/C,CAAC;AA2DF,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,QAAQ,GAAG,IAAI,EACpB,IAAI,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACzC,OAAO,CAAC,aAAa,CAAC,CAmBxB"}
@@ -0,0 +1,291 @@
1
+ /**
2
+ * Deterministic pattern mining for brownfield discovery (RF-01).
3
+ * Extracts facts by frequency/co-occurrence — no LLM, read-only on target project.
4
+ */
5
+ import fs from 'fs-extra';
6
+ import path from 'node:path';
7
+ import { isTestFile, SUPPORTED_EXTENSIONS, inString } from './static-analyzer.js';
8
+ import { detectModules } from './module-detector.js';
9
+ const NAMING_SUFFIXES = [
10
+ { suffix: '.service.ts', slug: 'service-suffix', label: '.service.ts' },
11
+ { suffix: '.controller.ts', slug: 'controller-suffix', label: '.controller.ts' },
12
+ { suffix: '.repository.ts', slug: 'repository-suffix', label: '.repository.ts' },
13
+ ];
14
+ function toPosix(p) {
15
+ return p.replace(/\\/g, '/');
16
+ }
17
+ function slugify(s) {
18
+ return s
19
+ .toLowerCase()
20
+ .replace(/[^a-z0-9]+/g, '-')
21
+ .replace(/^-|-$/g, '');
22
+ }
23
+ function modulesForFile(modules, file) {
24
+ const norm = toPosix(file);
25
+ const hits = modules
26
+ .filter((m) => norm.startsWith(`${toPosix(m.path)}/`) || norm === toPosix(m.path))
27
+ .map((m) => m.id);
28
+ return [...new Set(hits)].sort();
29
+ }
30
+ function prodFiles(files) {
31
+ return files.filter((f) => SUPPORTED_EXTENSIONS.has(path.extname(f)) && !isTestFile(f));
32
+ }
33
+ function makePattern(kind, slug, description, matched, totalRelevant, modules, evidenceLimit = 5) {
34
+ if (matched.length === 0)
35
+ return null;
36
+ const evidence = matched.slice(0, evidenceLimit).map((file) => ({
37
+ file: toPosix(file),
38
+ }));
39
+ return {
40
+ id: `${kind}:${slug}`,
41
+ kind,
42
+ description,
43
+ frequency: matched.length,
44
+ coverage: totalRelevant > 0 ? matched.length / totalRelevant : 0,
45
+ evidence,
46
+ modules: [
47
+ ...new Set(matched.flatMap((f) => modulesForFile(modules, f))),
48
+ ].sort(),
49
+ marker: 'confirmed',
50
+ };
51
+ }
52
+ function detectNamingIdiom(input) {
53
+ const relevant = prodFiles(input.files);
54
+ const out = [];
55
+ for (const { suffix, slug, label } of NAMING_SUFFIXES) {
56
+ const matched = relevant
57
+ .filter((f) => toPosix(f).endsWith(suffix))
58
+ .sort();
59
+ const p = makePattern('naming-idiom', slug, `${matched.length} arquivos usam sufixo ${label}`, matched, relevant.length, input.modules);
60
+ if (p)
61
+ out.push(p);
62
+ }
63
+ return out;
64
+ }
65
+ function detectInferredLayer(input) {
66
+ const relevant = prodFiles(input.files);
67
+ const segmentCounts = new Map();
68
+ for (const file of relevant) {
69
+ const parts = toPosix(file).split('/').filter(Boolean);
70
+ if (parts.length < 2)
71
+ continue;
72
+ const segment = parts.slice(0, 2).join('/');
73
+ const entry = segmentCounts.get(segment) ?? { count: 0, files: [] };
74
+ entry.count += 1;
75
+ entry.files.push(file);
76
+ segmentCounts.set(segment, entry);
77
+ }
78
+ const out = [];
79
+ for (const [segment, { count, files }] of segmentCounts) {
80
+ if (count < 2)
81
+ continue;
82
+ const sorted = [...files].sort();
83
+ const p = makePattern('inferred-layer', slugify(segment), `${count} arquivos co-ocorrem sob ${segment}/`, sorted, relevant.length, input.modules);
84
+ if (p)
85
+ out.push(p);
86
+ }
87
+ return out;
88
+ }
89
+ function isBarrelFile(content) {
90
+ const lines = content.split('\n').filter((l) => l.trim() && !l.trim().startsWith('//'));
91
+ if (lines.length === 0)
92
+ return false;
93
+ return lines.every((l) => /^export\s+.+\s+from\s+['"]/.test(l.trim()));
94
+ }
95
+ function detectStructuralIdiom(input) {
96
+ const barrels = [];
97
+ for (const file of input.files) {
98
+ const base = path.basename(file);
99
+ if (base !== 'index.ts' && base !== 'index.js')
100
+ continue;
101
+ const content = input.readFile(file);
102
+ if (content && isBarrelFile(content))
103
+ barrels.push(file);
104
+ }
105
+ barrels.sort();
106
+ const p = makePattern('structural-idiom', 'barrel-index', `${barrels.length} barrel files (index re-export)`, barrels, input.files.length, input.modules);
107
+ return p ? [p] : [];
108
+ }
109
+ function detectCallIdiom(input) {
110
+ const out = [];
111
+ const controllerService = [];
112
+ const validationHits = [];
113
+ for (const file of prodFiles(input.files)) {
114
+ const norm = toPosix(file);
115
+ const content = input.readFile(file);
116
+ if (!content)
117
+ continue;
118
+ const lines = content.split('\n');
119
+ if (/\.controller\./i.test(norm)) {
120
+ for (let i = 0; i < lines.length; i++) {
121
+ const line = lines[i];
122
+ if (/Service/.test(line) && !inString(line, line.search(/Service/))) {
123
+ controllerService.push({ file: norm, line: i + 1 });
124
+ break;
125
+ }
126
+ }
127
+ }
128
+ for (let i = 0; i < lines.length; i++) {
129
+ const line = lines[i];
130
+ const zIdx = line.search(/\bz\.\w+/);
131
+ if (zIdx >= 0 && !inString(line, zIdx)) {
132
+ validationHits.push({ file: norm, line: i + 1 });
133
+ break;
134
+ }
135
+ const parseIdx = line.search(/schema\.parse\s*\(/);
136
+ if (parseIdx >= 0 && !inString(line, parseIdx)) {
137
+ validationHits.push({ file: norm, line: i + 1 });
138
+ break;
139
+ }
140
+ }
141
+ }
142
+ if (controllerService.length >= 2) {
143
+ const files = [...new Set(controllerService.map((e) => e.file))].sort();
144
+ out.push({
145
+ id: 'call-idiom:controller-service',
146
+ kind: 'call-idiom',
147
+ description: `${files.length} controllers referenciam *Service`,
148
+ frequency: files.length,
149
+ coverage: prodFiles(input.files).length > 0 ? files.length / prodFiles(input.files).length : 0,
150
+ evidence: controllerService.slice(0, 5),
151
+ modules: [...new Set(files.flatMap((f) => modulesForFile(input.modules, f)))].sort(),
152
+ marker: 'confirmed',
153
+ });
154
+ }
155
+ if (validationHits.length >= 2) {
156
+ const files = [...new Set(validationHits.map((e) => e.file))].sort();
157
+ out.push({
158
+ id: 'call-idiom:schema-validation',
159
+ kind: 'call-idiom',
160
+ description: `${files.length} arquivos usam validação z./schema.parse`,
161
+ frequency: files.length,
162
+ coverage: prodFiles(input.files).length > 0 ? files.length / prodFiles(input.files).length : 0,
163
+ evidence: validationHits.slice(0, 5),
164
+ modules: [...new Set(files.flatMap((f) => modulesForFile(input.modules, f)))].sort(),
165
+ marker: 'confirmed',
166
+ });
167
+ }
168
+ return out;
169
+ }
170
+ function countImportMentions(input, needle) {
171
+ const matched = [];
172
+ for (const file of prodFiles(input.files)) {
173
+ const content = input.readFile(file);
174
+ if (!content)
175
+ continue;
176
+ if (needle.test(content))
177
+ matched.push(file);
178
+ }
179
+ matched.sort();
180
+ return { count: matched.length, files: matched };
181
+ }
182
+ function detectImplicitDecision(input) {
183
+ const out = [];
184
+ const libs = input.dna?.libraries;
185
+ if (libs?.orm) {
186
+ const { count, files } = countImportMentions(input, new RegExp(libs.orm.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i'));
187
+ if (count >= 2) {
188
+ const p = makePattern('implicit-decision', `orm-${slugify(libs.orm)}`, `ORM dominante: ${libs.orm} em ${count} arquivos`, files, prodFiles(input.files).length, input.modules);
189
+ if (p)
190
+ out.push(p);
191
+ }
192
+ }
193
+ else {
194
+ for (const orm of ['prisma', 'typeorm', 'sequelize', 'drizzle']) {
195
+ const { count, files } = countImportMentions(input, new RegExp(orm, 'i'));
196
+ if (count >= 2) {
197
+ const p = makePattern('implicit-decision', `orm-${orm}`, `ORM dominante: ${orm} em ${count} arquivos`, files, prodFiles(input.files).length, input.modules);
198
+ if (p)
199
+ out.push(p);
200
+ break;
201
+ }
202
+ }
203
+ }
204
+ if (libs?.http) {
205
+ const { count, files } = countImportMentions(input, new RegExp(libs.http.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i'));
206
+ if (count >= 2) {
207
+ const p = makePattern('implicit-decision', `http-${slugify(libs.http)}`, `HTTP client dominante: ${libs.http} em ${count} arquivos`, files, prodFiles(input.files).length, input.modules);
208
+ if (p)
209
+ out.push(p);
210
+ }
211
+ }
212
+ return out;
213
+ }
214
+ export const PATTERN_RULES = [
215
+ { kind: 'naming-idiom', minFrequency: 2, detect: detectNamingIdiom },
216
+ { kind: 'inferred-layer', minFrequency: 2, detect: detectInferredLayer },
217
+ { kind: 'structural-idiom', minFrequency: 1, detect: detectStructuralIdiom },
218
+ { kind: 'call-idiom', minFrequency: 2, detect: detectCallIdiom },
219
+ { kind: 'implicit-decision', minFrequency: 2, detect: detectImplicitDecision },
220
+ ];
221
+ async function loadFileInventory(root, opts) {
222
+ const reverseFacts = path.join(root, 'DARE', 'REVERSE', 'reverse-facts.json');
223
+ if (await fs.pathExists(reverseFacts)) {
224
+ const facts = (await fs.readJson(reverseFacts));
225
+ let modules = facts?.modules ?? [];
226
+ if (opts?.modulesOnly?.length) {
227
+ const wanted = new Set(opts.modulesOnly.map((s) => s.toLowerCase()));
228
+ modules = modules.filter((m) => wanted.has(m.id.toLowerCase()) || wanted.has(m.name.toLowerCase()));
229
+ }
230
+ const files = modules.flatMap((m) => m.files ?? []);
231
+ if (files.length > 0) {
232
+ return { files, source: 'reverse-facts', modules };
233
+ }
234
+ }
235
+ const graph = await detectModules(root, {
236
+ only: opts?.modulesOnly?.length ? [...opts.modulesOnly] : undefined,
237
+ });
238
+ return {
239
+ files: graph.modules.flatMap((m) => m.files),
240
+ source: 'module-detector',
241
+ modules: graph.modules,
242
+ };
243
+ }
244
+ function createReadFile(root) {
245
+ const rootResolved = path.resolve(root);
246
+ return (rel) => {
247
+ const norm = toPosix(rel);
248
+ if (norm.startsWith('..') || path.isAbsolute(norm))
249
+ return null;
250
+ const abs = path.resolve(rootResolved, norm);
251
+ if (!abs.startsWith(rootResolved + path.sep) && abs !== rootResolved)
252
+ return null;
253
+ try {
254
+ return fs.readFileSync(abs, 'utf-8');
255
+ }
256
+ catch {
257
+ return null;
258
+ }
259
+ };
260
+ }
261
+ function filterAndSort(patterns, rules) {
262
+ const minByKind = new Map(rules.map((r) => [r.kind, r.minFrequency]));
263
+ return patterns
264
+ .filter((p) => {
265
+ const min = minByKind.get(p.kind) ?? 1;
266
+ return p.frequency >= min && p.evidence.length >= 1;
267
+ })
268
+ .sort((a, b) => {
269
+ const k = a.kind.localeCompare(b.kind);
270
+ return k !== 0 ? k : a.id.localeCompare(b.id);
271
+ });
272
+ }
273
+ export async function detectPatterns(root, dna, opts) {
274
+ const { files, source, modules } = await loadFileInventory(root, opts);
275
+ const input = {
276
+ files,
277
+ modules,
278
+ dna,
279
+ readFile: createReadFile(root),
280
+ };
281
+ const raw = [];
282
+ for (const rule of PATTERN_RULES) {
283
+ raw.push(...rule.detect(input));
284
+ }
285
+ return {
286
+ generatedAt: dna?.generatedAt ?? '1970-01-01T00:00:00.000Z',
287
+ fileInventorySource: source,
288
+ patterns: filterAndSort(raw, PATTERN_RULES),
289
+ };
290
+ }
291
+ //# sourceMappingURL=pattern-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-detector.js","sourceRoot":"","sources":["../../src/utils/pattern-detector.ts"],"names":[],"mappings":"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"}