@dewtech/dare-cli 3.6.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-command-parity.test.js +1 -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 +2 -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__/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/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/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/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/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/steering/__tests__/loader.test.js +15 -0
- package/dist/steering/__tests__/loader.test.js.map +1 -1
- package/dist/steering/loader.d.ts.map +1 -1
- package/dist/steering/loader.js +11 -0
- package/dist/steering/loader.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/package.json +1 -1
- 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-patterns/SKILL.md +9 -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-patterns.md +12 -0
- 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-patterns.md +12 -0
|
@@ -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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
const KIND_ORDER = [
|
|
2
|
+
'inferred-layer',
|
|
3
|
+
'naming-idiom',
|
|
4
|
+
'structural-idiom',
|
|
5
|
+
'call-idiom',
|
|
6
|
+
'implicit-decision',
|
|
7
|
+
];
|
|
8
|
+
const KIND_TITLES = {
|
|
9
|
+
'inferred-layer': 'Camadas inferidas (co-ocorrência)',
|
|
10
|
+
'naming-idiom': 'Idiomas de nomenclatura',
|
|
11
|
+
'structural-idiom': 'Idiomas estruturais',
|
|
12
|
+
'call-idiom': 'Idiomas de chamada',
|
|
13
|
+
'implicit-decision': 'Decisões implícitas',
|
|
14
|
+
};
|
|
15
|
+
function fmtEvidence(pattern) {
|
|
16
|
+
return pattern.evidence
|
|
17
|
+
.map((e) => (e.line != null ? `\`${e.file}:${e.line}\`` : `\`${e.file}\``))
|
|
18
|
+
.join(', ');
|
|
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
|
+
for (const kind of KIND_ORDER) {
|
|
30
|
+
map.get(kind).sort((a, b) => a.id.localeCompare(b.id));
|
|
31
|
+
}
|
|
32
|
+
return map;
|
|
33
|
+
}
|
|
34
|
+
function collectGaps(byKind, patterns) {
|
|
35
|
+
const gaps = [];
|
|
36
|
+
for (const kind of KIND_ORDER) {
|
|
37
|
+
const list = byKind.get(kind) ?? [];
|
|
38
|
+
if (list.length === 0) {
|
|
39
|
+
gaps.push(`🔴 Categoria \`${kind}\`: nenhum padrão acima do limiar de frequência.`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
for (const p of patterns) {
|
|
43
|
+
if (p.coverage < 0.5) {
|
|
44
|
+
gaps.push(`🔴 \`${p.id}\`: cobertura baixa (${(p.coverage * 100).toFixed(0)}%) — requer decisão humana.`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return gaps;
|
|
48
|
+
}
|
|
49
|
+
export function renderPatternsSkeleton(facts) {
|
|
50
|
+
const byKind = patternsByKind(facts.patterns);
|
|
51
|
+
const gaps = collectGaps(byKind, facts.patterns);
|
|
52
|
+
const lines = [
|
|
53
|
+
'# PATTERNS — Padrões descobertos (brownfield)',
|
|
54
|
+
'',
|
|
55
|
+
'> ⚠️ **Fatos gerados por `dare patterns`.** O CLI lista frequência e evidência;',
|
|
56
|
+
'> seções `<!-- AGENT -->` são preenchidas por `/dare-dna` (nomear/explicar/rebaixar confiança).',
|
|
57
|
+
'',
|
|
58
|
+
`*Gerado: ${facts.generatedAt} · inventário via ${facts.fileInventorySource}*`,
|
|
59
|
+
'',
|
|
60
|
+
];
|
|
61
|
+
for (const kind of KIND_ORDER) {
|
|
62
|
+
const list = byKind.get(kind) ?? [];
|
|
63
|
+
lines.push(`## ${KIND_TITLES[kind]}`, '');
|
|
64
|
+
if (list.length === 0) {
|
|
65
|
+
lines.push('- _(nenhum detectado)_', '');
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
for (const p of list) {
|
|
69
|
+
lines.push(`- 🟢 ${p.description} (frequência ${p.frequency}, cobertura ${(p.coverage * 100).toFixed(0)}%) — evidência: ${fmtEvidence(p)}`);
|
|
70
|
+
lines.push('<!-- AGENT: nomeie/explique este padrão; rebaixe para 🟡 se for inferência ou 🔴 se for gap. -->', '');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
lines.push('## ⚠️ Incertezas', '');
|
|
75
|
+
if (gaps.length === 0) {
|
|
76
|
+
lines.push('- _(nenhum gap determinístico — revise com a skill)_', '<!-- AGENT: liste gaps adicionais ou rebaixe padrões inferidos. -->', '');
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
for (const g of gaps)
|
|
80
|
+
lines.push(`- ${g}`);
|
|
81
|
+
lines.push('<!-- AGENT: complemente gaps e rebaixe confiança onde necessário. -->', '');
|
|
82
|
+
}
|
|
83
|
+
lines.push('---', '*DARE Method — padrões do projeto (brownfield). Gerado por `dare patterns`. License: MIT.*');
|
|
84
|
+
return lines.join('\n').replace(/\n{3,}/g, '\n\n') + '\n';
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=pattern-facts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-facts.js","sourceRoot":"","sources":["../../src/utils/pattern-facts.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,GAA2B;IACzC,gBAAgB;IAChB,cAAc;IACd,kBAAkB;IAClB,YAAY;IACZ,mBAAmB;CACpB,CAAC;AAEF,MAAM,WAAW,GAAgC;IAC/C,gBAAgB,EAAE,mCAAmC;IACrD,cAAc,EAAE,yBAAyB;IACzC,kBAAkB,EAAE,qBAAqB;IACzC,YAAY,EAAE,oBAAoB;IAClC,mBAAmB,EAAE,qBAAqB;CAC3C,CAAC;AAEF,SAAS,WAAW,CAAC,OAA0B;IAC7C,OAAO,OAAO,CAAC,QAAQ;SACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;SAC1E,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CACrB,QAAsC;IAEtC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoC,CAAC;IACxD,KAAK,MAAM,IAAI,IAAI,UAAU;QAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,GAAG,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAClB,MAA6C,EAC7C,QAAsC;IAEtC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,kDAAkD,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CACP,QAAQ,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAC/F,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAoB;IACzD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEjD,MAAM,KAAK,GAAa;QACtB,+CAA+C;QAC/C,EAAE;QACF,iFAAiF;QACjF,iGAAiG;QACjG,EAAE;QACF,YAAY,KAAK,CAAC,WAAW,qBAAqB,KAAK,CAAC,mBAAmB,GAAG;QAC9E,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CACR,QAAQ,CAAC,CAAC,WAAW,gBAAgB,CAAC,CAAC,SAAS,eAAe,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,WAAW,CAAC,CAAC,CAAC,EAAE,CAChI,CAAC;gBACF,KAAK,CAAC,IAAI,CACR,kGAAkG,EAClG,EAAE,CACH,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CACR,sDAAsD,EACtD,qEAAqE,EACrE,EAAE,CACH,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3C,KAAK,CAAC,IAAI,CACR,uEAAuE,EACvE,EAAE,CACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CACR,KAAK,EACL,4FAA4F,CAC7F,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;AAC5D,CAAC"}
|
package/package.json
CHANGED
|
@@ -23,6 +23,10 @@ Leia o arquivo `DARE/DESIGN.md` que foi aprovado. Extraia:
|
|
|
23
23
|
- Requisitos não-funcionais
|
|
24
24
|
- Restrições
|
|
25
25
|
|
|
26
|
+
### Passo 1b: Trade-offs (Architect)
|
|
27
|
+
|
|
28
|
+
Antes do scaffold, leia `DARE/PATTERNS.md` e `DARE/patterns-facts.json`. Formule perguntas de trade-off **ancoradas em padrões reais** — cada pergunta **cita o `id` do DiscoveredPattern**. **1 passagem sequencial**; **sem runtime multi-agente**. Não invente padrões: só referencie os 🟢 do CLI; conclusões 🟡.
|
|
29
|
+
|
|
26
30
|
### Passo 2: Analisar Contexto
|
|
27
31
|
Leia os arquivos de contexto:
|
|
28
32
|
- `.agents/rules/dare-workflow.md` (ou `.cursorrules` se Cursor)
|
|
@@ -23,6 +23,17 @@ Leia cuidadosamente o que o usuário solicitou. Identifique:
|
|
|
23
23
|
- Contexto do projeto
|
|
24
24
|
- Restrições implícitas
|
|
25
25
|
|
|
26
|
+
Se `dare design --interactive` emitiu a seção `## Perguntas de Planejamento (Analyst/PM)` no `DESIGN.md`, leia esse bloco.
|
|
27
|
+
|
|
28
|
+
### Passo 1b: Planejamento leve (Analyst → PM)
|
|
29
|
+
|
|
30
|
+
Se o bloco de questionário existir, conduza **1 passagem sequencial** (**sem runtime multi-agente**):
|
|
31
|
+
|
|
32
|
+
- **Analyst** — uma rodada sobre escopo, ambiguidades e lacunas.
|
|
33
|
+
- **PM** — uma rodada sobre requisitos e critérios de aceite.
|
|
34
|
+
|
|
35
|
+
Ordem **sequencial**; sem message pool, sem loop de troca. Inferências 🟡; lacunas 🔴; fatos do CLI 🟢.
|
|
36
|
+
|
|
26
37
|
### Passo 2: Fazer Perguntas (se necessário)
|
|
27
38
|
Se algo não estiver claro, pergunte ao usuário:
|
|
28
39
|
- Qual é o escopo exato?
|
|
@@ -24,6 +24,10 @@ Extraia e use durante todo o comando:
|
|
|
24
24
|
- Integrações externas confirmadas
|
|
25
25
|
- Restrições e escopo
|
|
26
26
|
|
|
27
|
+
### 1b. Trade-offs (Architect)
|
|
28
|
+
|
|
29
|
+
Antes do scaffold, leia `DARE/PATTERNS.md` e `DARE/patterns-facts.json`. Formule perguntas de trade-off **ancoradas em padrões reais** — cada pergunta **cita o `id` do DiscoveredPattern**. **1 passagem sequencial**; **sem runtime multi-agente**. Não invente padrões: só referencie os 🟢 do CLI; suas conclusões são 🟡.
|
|
30
|
+
|
|
27
31
|
### 2. Gerar `DARE/BLUEPRINT.md`
|
|
28
32
|
|
|
29
33
|
Siga o template `templates/BLUEPRINT-template.md`. Seções obrigatórias:
|
|
@@ -16,6 +16,16 @@ Gera ou atualiza o `DARE/DESIGN.md` a partir de uma descrição do projeto ou fe
|
|
|
16
16
|
- `package.json` / `composer.json` / `Cargo.toml` / `go.mod` / `requirements.txt` — stack atual
|
|
17
17
|
- Estrutura de pastas existente
|
|
18
18
|
- `DARE/DESIGN.md` se já existir — não sobrescreva sem aprovação explícita do usuário
|
|
19
|
+
- Se `dare design --interactive` emitiu a seção `## Perguntas de Planejamento (Analyst/PM)`, leia esse bloco antes de prosseguir
|
|
20
|
+
|
|
21
|
+
### 1b. Planejamento leve (Analyst → PM)
|
|
22
|
+
|
|
23
|
+
Se o bloco de questionário existir no `DESIGN.md`, conduza **1 passagem sequencial** (**sem runtime multi-agente**):
|
|
24
|
+
|
|
25
|
+
- **Analyst** — uma rodada sobre escopo, ambiguidades e lacunas (`kind:'scope'|'ambiguity'|'gap'`).
|
|
26
|
+
- **PM** — uma rodada sobre requisitos e critérios de aceite.
|
|
27
|
+
|
|
28
|
+
Ordem **sequencial**: Analyst antes de PM; sem voltar, sem message pool, sem loop de troca. Marque inferências como 🟡 e lacunas não resolvidas como 🔴; fatos do CLI permanecem 🟢.
|
|
19
29
|
|
|
20
30
|
### 2. Gere `DARE/DESIGN.md` com as seguintes seções obrigatórias
|
|
21
31
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Comando: /dare-patterns
|
|
2
|
+
|
|
3
|
+
Descobre padrões recorrentes no codebase (`dare patterns`) — determinístico, sem LLM.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
dare patterns
|
|
7
|
+
dare patterns --check
|
|
8
|
+
dare patterns --dir ./packages/api
|
|
9
|
+
dare patterns --inject
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Gera `DARE/patterns-facts.json` + `DARE/PATTERNS.md`. Complete com `/dare-dna`.
|
|
@@ -9,9 +9,11 @@ Avança o DARE para a fase Architect: lê `DARE/DESIGN.md` aprovado e gera **som
|
|
|
9
9
|
|
|
10
10
|
1. **Leia `DARE/DESIGN.md`** — obrigatório. Se não existir, peça `/generate-design` primeiro. Extraia: stack, RF-*, RNF-*, RS-*, integrações, restrições, escopo.
|
|
11
11
|
|
|
12
|
-
2. **
|
|
12
|
+
2. **Trade-offs (Architect)** — antes do scaffold, leia `DARE/PATTERNS.md` e `DARE/patterns-facts.json`. Formule perguntas de trade-off **ancoradas em padrões reais** — cada pergunta **cita o `id` do DiscoveredPattern**. **1 passagem sequencial**; **sem runtime multi-agente**. Não invente padrões: só referencie os 🟢 do CLI; suas conclusões são 🟡.
|
|
13
13
|
|
|
14
|
-
3. **
|
|
14
|
+
3. **Leia o template:** `templates/BLUEPRINT-template.md` — siga a estrutura fielmente.
|
|
15
|
+
|
|
16
|
+
4. **Gere `DARE/BLUEPRINT.md`** com seções obrigatórias:
|
|
15
17
|
|
|
16
18
|
- **Visão Geral da Arquitetura** — diagrama Mermaid + tabela de decisões com justificativa
|
|
17
19
|
- **Stack Técnica Definida** — versões fixas (não ranges)
|
|
@@ -5,11 +5,17 @@ Inicia o Método DARE (fase Design) gerando `DARE/DESIGN.md` a partir de uma ide
|
|
|
5
5
|
|
|
6
6
|
## Instruções para o Cursor Composer
|
|
7
7
|
|
|
8
|
-
1. **Leia o contexto:** `package.json` / `Cargo.toml` / `composer.json` / `go.mod` / `requirements.txt` para identificar a stack atual. Leia `.cursorrules` para entender padrões do projeto. Se `DARE/DESIGN.md` já existir, não sobrescreva sem aprovação explícita.
|
|
8
|
+
1. **Leia o contexto:** `package.json` / `Cargo.toml` / `composer.json` / `go.mod` / `requirements.txt` para identificar a stack atual. Leia `.cursorrules` para entender padrões do projeto. Se `DARE/DESIGN.md` já existir, não sobrescreva sem aprovação explícita. Se `dare design --interactive` emitiu a seção `## Perguntas de Planejamento (Analyst/PM)`, leia esse bloco antes de prosseguir.
|
|
9
9
|
|
|
10
|
-
2. **
|
|
10
|
+
2. **Planejamento leve (Analyst → PM)** — se o bloco de questionário existir no `DESIGN.md`, conduza **1 passagem sequencial** (**sem runtime multi-agente**):
|
|
11
|
+
- **Analyst** — uma rodada sobre escopo, ambiguidades e lacunas (`kind:'scope'|'ambiguity'|'gap'`).
|
|
12
|
+
- **PM** — uma rodada sobre requisitos e critérios de aceite.
|
|
13
|
+
- Ordem **sequencial**: Analyst antes de PM; sem voltar, sem message pool, sem loop de troca.
|
|
14
|
+
- Marque inferências como 🟡 e lacunas não resolvidas como 🔴; fatos do CLI permanecem 🟢.
|
|
11
15
|
|
|
12
|
-
3. **
|
|
16
|
+
3. **Leia o template:** `templates/DESIGN-template.md` — siga a estrutura fielmente.
|
|
17
|
+
|
|
18
|
+
4. **Gere `DARE/DESIGN.md` com as seções obrigatórias:**
|
|
13
19
|
|
|
14
20
|
- **Descrição** — 3 a 5 frases: o que é, qual problema resolve, quem usa
|
|
15
21
|
- **Objetivos e Métricas de Sucesso** — tabela numerada (O-01, O-02…) com métrica verificável e meta numérica
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Comando: /dare-patterns
|
|
2
|
+
|
|
3
|
+
Descobre padrões recorrentes no codebase (`dare patterns`) — determinístico, sem LLM.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
dare patterns
|
|
7
|
+
dare patterns --check
|
|
8
|
+
dare patterns --dir ./packages/api
|
|
9
|
+
dare patterns --inject
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Gera `DARE/patterns-facts.json` + `DARE/PATTERNS.md`. Complete com `/dare-dna`.
|