@dewtech/dare-cli 3.5.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/ide-adapters.test.d.ts +2 -0
- package/dist/__tests__/ide-adapters.test.d.ts.map +1 -0
- package/dist/__tests__/ide-adapters.test.js +39 -0
- package/dist/__tests__/ide-adapters.test.js.map +1 -0
- package/dist/__tests__/ide-command-parity.test.js +3 -0
- package/dist/__tests__/ide-command-parity.test.js.map +1 -1
- package/dist/__tests__/patterns-no-llm.test.d.ts +2 -0
- package/dist/__tests__/patterns-no-llm.test.d.ts.map +1 -0
- package/dist/__tests__/patterns-no-llm.test.js +31 -0
- package/dist/__tests__/patterns-no-llm.test.js.map +1 -0
- package/dist/__tests__/patterns-path-confinement.test.d.ts +2 -0
- package/dist/__tests__/patterns-path-confinement.test.d.ts.map +1 -0
- package/dist/__tests__/patterns-path-confinement.test.js +58 -0
- package/dist/__tests__/patterns-path-confinement.test.js.map +1 -0
- package/dist/__tests__/patterns.test.d.ts +2 -0
- package/dist/__tests__/patterns.test.d.ts.map +1 -0
- package/dist/__tests__/patterns.test.js +102 -0
- package/dist/__tests__/patterns.test.js.map +1 -0
- package/dist/bin/dare.js +6 -0
- package/dist/bin/dare.js.map +1 -1
- package/dist/commands/__tests__/design-interactive.test.d.ts +2 -0
- package/dist/commands/__tests__/design-interactive.test.d.ts.map +1 -0
- package/dist/commands/__tests__/design-interactive.test.js +44 -0
- package/dist/commands/__tests__/design-interactive.test.js.map +1 -0
- package/dist/commands/__tests__/hooks.test.d.ts +2 -0
- package/dist/commands/__tests__/hooks.test.d.ts.map +1 -0
- package/dist/commands/__tests__/hooks.test.js +109 -0
- package/dist/commands/__tests__/hooks.test.js.map +1 -0
- package/dist/commands/__tests__/patterns.test.d.ts +2 -0
- package/dist/commands/__tests__/patterns.test.d.ts.map +1 -0
- package/dist/commands/__tests__/patterns.test.js +55 -0
- package/dist/commands/__tests__/patterns.test.js.map +1 -0
- package/dist/commands/__tests__/steering.test.d.ts +2 -0
- package/dist/commands/__tests__/steering.test.d.ts.map +1 -0
- package/dist/commands/__tests__/steering.test.js +69 -0
- package/dist/commands/__tests__/steering.test.js.map +1 -0
- package/dist/commands/design.d.ts.map +1 -1
- package/dist/commands/design.js +38 -8
- package/dist/commands/design.js.map +1 -1
- package/dist/commands/graph.d.ts.map +1 -1
- package/dist/commands/graph.js +1 -0
- package/dist/commands/graph.js.map +1 -1
- package/dist/commands/hooks.d.ts +3 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +163 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/patterns.d.ts +3 -0
- package/dist/commands/patterns.d.ts.map +1 -0
- package/dist/commands/patterns.js +124 -0
- package/dist/commands/patterns.js.map +1 -0
- package/dist/commands/steering.d.ts +3 -0
- package/dist/commands/steering.d.ts.map +1 -0
- package/dist/commands/steering.js +70 -0
- package/dist/commands/steering.js.map +1 -0
- package/dist/graphrag/__tests__/pattern-ingest.test.d.ts +2 -0
- package/dist/graphrag/__tests__/pattern-ingest.test.d.ts.map +1 -0
- package/dist/graphrag/__tests__/pattern-ingest.test.js +49 -0
- package/dist/graphrag/__tests__/pattern-ingest.test.js.map +1 -0
- package/dist/graphrag/__tests__/types.test.js +5 -2
- package/dist/graphrag/__tests__/types.test.js.map +1 -1
- package/dist/graphrag/pattern-ingest.d.ts +10 -0
- package/dist/graphrag/pattern-ingest.d.ts.map +1 -0
- package/dist/graphrag/pattern-ingest.js +77 -0
- package/dist/graphrag/pattern-ingest.js.map +1 -0
- package/dist/graphrag/types.d.ts +15 -4
- package/dist/graphrag/types.d.ts.map +1 -1
- package/dist/graphrag/types.js +3 -0
- package/dist/graphrag/types.js.map +1 -1
- package/dist/hooks/__tests__/allowlist.test.d.ts +2 -0
- package/dist/hooks/__tests__/allowlist.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/allowlist.test.js +29 -0
- package/dist/hooks/__tests__/allowlist.test.js.map +1 -0
- package/dist/hooks/__tests__/config.test.d.ts +2 -0
- package/dist/hooks/__tests__/config.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/config.test.js +57 -0
- package/dist/hooks/__tests__/config.test.js.map +1 -0
- package/dist/hooks/__tests__/dispatcher.security.test.d.ts +2 -0
- package/dist/hooks/__tests__/dispatcher.security.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/dispatcher.security.test.js +86 -0
- package/dist/hooks/__tests__/dispatcher.security.test.js.map +1 -0
- package/dist/hooks/__tests__/dispatcher.test.d.ts +2 -0
- package/dist/hooks/__tests__/dispatcher.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/dispatcher.test.js +69 -0
- package/dist/hooks/__tests__/dispatcher.test.js.map +1 -0
- package/dist/hooks/__tests__/idempotency.test.d.ts +2 -0
- package/dist/hooks/__tests__/idempotency.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/idempotency.test.js +45 -0
- package/dist/hooks/__tests__/idempotency.test.js.map +1 -0
- package/dist/hooks/__tests__/telemetry.test.d.ts +2 -0
- package/dist/hooks/__tests__/telemetry.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/telemetry.test.js +52 -0
- package/dist/hooks/__tests__/telemetry.test.js.map +1 -0
- package/dist/hooks/allowlist.d.ts +24 -0
- package/dist/hooks/allowlist.d.ts.map +1 -0
- package/dist/hooks/allowlist.js +61 -0
- package/dist/hooks/allowlist.js.map +1 -0
- package/dist/hooks/config.d.ts +24 -0
- package/dist/hooks/config.d.ts.map +1 -0
- package/dist/hooks/config.js +82 -0
- package/dist/hooks/config.js.map +1 -0
- package/dist/hooks/dispatcher.d.ts +17 -0
- package/dist/hooks/dispatcher.d.ts.map +1 -0
- package/dist/hooks/dispatcher.js +157 -0
- package/dist/hooks/dispatcher.js.map +1 -0
- package/dist/hooks/idempotency.d.ts +14 -0
- package/dist/hooks/idempotency.d.ts.map +1 -0
- package/dist/hooks/idempotency.js +64 -0
- package/dist/hooks/idempotency.js.map +1 -0
- package/dist/hooks/telemetry.d.ts +12 -0
- package/dist/hooks/telemetry.d.ts.map +1 -0
- package/dist/hooks/telemetry.js +66 -0
- package/dist/hooks/telemetry.js.map +1 -0
- package/dist/hooks/types.d.ts +36 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +7 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/__tests__/mcp-steering.test.d.ts +2 -0
- package/dist/mcp-server/__tests__/mcp-steering.test.d.ts.map +1 -0
- package/dist/mcp-server/__tests__/mcp-steering.test.js +90 -0
- package/dist/mcp-server/__tests__/mcp-steering.test.js.map +1 -0
- package/dist/mcp-server/server.d.ts.map +1 -1
- package/dist/mcp-server/server.js +30 -0
- package/dist/mcp-server/server.js.map +1 -1
- package/dist/steering/__tests__/loader.test.d.ts +2 -0
- package/dist/steering/__tests__/loader.test.d.ts.map +1 -0
- package/dist/steering/__tests__/loader.test.js +95 -0
- package/dist/steering/__tests__/loader.test.js.map +1 -0
- package/dist/steering/__tests__/resolver.security.test.d.ts +2 -0
- package/dist/steering/__tests__/resolver.security.test.d.ts.map +1 -0
- package/dist/steering/__tests__/resolver.security.test.js +42 -0
- package/dist/steering/__tests__/resolver.security.test.js.map +1 -0
- package/dist/steering/__tests__/resolver.test.d.ts +2 -0
- package/dist/steering/__tests__/resolver.test.d.ts.map +1 -0
- package/dist/steering/__tests__/resolver.test.js +75 -0
- package/dist/steering/__tests__/resolver.test.js.map +1 -0
- package/dist/steering/loader.d.ts +8 -0
- package/dist/steering/loader.d.ts.map +1 -0
- package/dist/steering/loader.js +109 -0
- package/dist/steering/loader.js.map +1 -0
- package/dist/steering/resolver.d.ts +6 -0
- package/dist/steering/resolver.d.ts.map +1 -0
- package/dist/steering/resolver.js +59 -0
- package/dist/steering/resolver.js.map +1 -0
- package/dist/steering/types.d.ts +22 -0
- package/dist/steering/types.d.ts.map +1 -0
- package/dist/steering/types.js +2 -0
- package/dist/steering/types.js.map +1 -0
- package/dist/utils/UpdateApplier.d.ts.map +1 -1
- package/dist/utils/UpdateApplier.js +2 -0
- package/dist/utils/UpdateApplier.js.map +1 -1
- package/dist/utils/__tests__/design-questionnaire.test.d.ts +2 -0
- package/dist/utils/__tests__/design-questionnaire.test.d.ts.map +1 -0
- package/dist/utils/__tests__/design-questionnaire.test.js +72 -0
- package/dist/utils/__tests__/design-questionnaire.test.js.map +1 -0
- package/dist/utils/__tests__/pattern-detector.test.d.ts +2 -0
- package/dist/utils/__tests__/pattern-detector.test.d.ts.map +1 -0
- package/dist/utils/__tests__/pattern-detector.test.js +81 -0
- package/dist/utils/__tests__/pattern-detector.test.js.map +1 -0
- package/dist/utils/__tests__/pattern-facts.test.d.ts +2 -0
- package/dist/utils/__tests__/pattern-facts.test.d.ts.map +1 -0
- package/dist/utils/__tests__/pattern-facts.test.js +55 -0
- package/dist/utils/__tests__/pattern-facts.test.js.map +1 -0
- package/dist/utils/design-questionnaire.d.ts +22 -0
- package/dist/utils/design-questionnaire.d.ts.map +1 -0
- package/dist/utils/design-questionnaire.js +151 -0
- package/dist/utils/design-questionnaire.js.map +1 -0
- package/dist/utils/pattern-detector.d.ts +39 -0
- package/dist/utils/pattern-detector.d.ts.map +1 -0
- package/dist/utils/pattern-detector.js +291 -0
- package/dist/utils/pattern-detector.js.map +1 -0
- package/dist/utils/pattern-facts.d.ts +7 -0
- package/dist/utils/pattern-facts.d.ts.map +1 -0
- package/dist/utils/pattern-facts.js +86 -0
- package/dist/utils/pattern-facts.js.map +1 -0
- package/dist/utils/project-generator.d.ts.map +1 -1
- package/dist/utils/project-generator.js +2 -0
- package/dist/utils/project-generator.js.map +1 -1
- package/package.json +1 -1
- package/templates/hooks/dare.config.hooks.example.json +12 -0
- package/templates/hooks/pre-commit-dare-validate +2 -2
- package/templates/ide/antigravity/.agents/skills/dare-blueprint/SKILL.md +4 -0
- package/templates/ide/antigravity/.agents/skills/dare-design/SKILL.md +11 -0
- package/templates/ide/antigravity/.agents/skills/dare-hooks/SKILL.md +13 -0
- package/templates/ide/antigravity/.agents/skills/dare-patterns/SKILL.md +9 -0
- package/templates/ide/antigravity/.agents/skills/dare-steering/SKILL.md +15 -0
- package/templates/ide/antigravity/templates/HOOKS-ADAPTER.md +14 -0
- package/templates/ide/claude/.claude/commands/dare-blueprint.md +4 -0
- package/templates/ide/claude/.claude/commands/dare-design.md +10 -0
- package/templates/ide/claude/.claude/commands/dare-hooks.md +17 -0
- package/templates/ide/claude/.claude/commands/dare-patterns.md +12 -0
- package/templates/ide/claude/.claude/commands/dare-steering.md +19 -0
- package/templates/ide/claude/.claude/settings.example.json +1 -1
- package/templates/ide/cursor/.cursor/commands/dare-blueprint.md +4 -2
- package/templates/ide/cursor/.cursor/commands/dare-design.md +9 -3
- package/templates/ide/cursor/.cursor/commands/dare-hooks.md +17 -0
- package/templates/ide/cursor/.cursor/commands/dare-patterns.md +12 -0
- package/templates/ide/cursor/.cursor/commands/dare-steering.md +19 -0
- package/templates/ide/cursor/templates/HOOKS-ADAPTER.md +14 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-detector.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/pattern-detector.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-facts.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/pattern-facts.test.ts"],"names":[],"mappings":""}
|
|
@@ -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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"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PATTERNS.md skeleton generator for `dare patterns`.
|
|
3
|
+
* Facts only — semantic naming/explanation via <!-- AGENT --> for /dare-dna skill.
|
|
4
|
+
*/
|
|
5
|
+
import type { PatternsFacts } from './pattern-detector.js';
|
|
6
|
+
export declare function renderPatternsSkeleton(facts: PatternsFacts): string;
|
|
7
|
+
//# sourceMappingURL=pattern-facts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-facts.d.ts","sourceRoot":"","sources":["../../src/utils/pattern-facts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,aAAa,EAGd,MAAM,uBAAuB,CAAC;AA6D/B,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAqDnE"}
|