@nac3/forge-cli 1.17.0 → 1.19.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/bin/heap_bootstrap.d.ts +52 -1
- package/dist/bin/heap_bootstrap.d.ts.map +1 -1
- package/dist/bin/heap_bootstrap.js +46 -11
- package/dist/bin/heap_bootstrap.js.map +1 -1
- package/dist/bin/yf.d.ts.map +1 -1
- package/dist/bin/yf.js +4 -0
- package/dist/bin/yf.js.map +1 -1
- package/dist/chat/claude.d.ts +7 -0
- package/dist/chat/claude.d.ts.map +1 -1
- package/dist/chat/claude.js.map +1 -1
- package/dist/chat/claude_cli.d.ts +4 -0
- package/dist/chat/claude_cli.d.ts.map +1 -1
- package/dist/chat/claude_cli.js +58 -0
- package/dist/chat/claude_cli.js.map +1 -1
- package/dist/chat/doctrine_digest.d.ts.map +1 -1
- package/dist/chat/doctrine_digest.js +11 -0
- package/dist/chat/doctrine_digest.js.map +1 -1
- package/dist/chat/panel.d.ts.map +1 -1
- package/dist/chat/panel.js +235 -2
- package/dist/chat/panel.js.map +1 -1
- package/dist/chat/project_slug.d.ts.map +1 -1
- package/dist/chat/project_slug.js +29 -0
- package/dist/chat/project_slug.js.map +1 -1
- package/dist/chat/server.d.ts.map +1 -1
- package/dist/chat/server.js +203 -16
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/tools/evidence.d.ts +30 -0
- package/dist/chat/tools/evidence.d.ts.map +1 -0
- package/dist/chat/tools/evidence.js +74 -0
- package/dist/chat/tools/evidence.js.map +1 -0
- package/dist/chat/tools/pending.d.ts +3 -0
- package/dist/chat/tools/pending.d.ts.map +1 -1
- package/dist/chat/tools/pending.js +71 -1
- package/dist/chat/tools/pending.js.map +1 -1
- package/dist/chat/tools/urazuke.d.ts +22 -0
- package/dist/chat/tools/urazuke.d.ts.map +1 -0
- package/dist/chat/tools/urazuke.js +54 -0
- package/dist/chat/tools/urazuke.js.map +1 -0
- package/dist/chat/tools/workflow.d.ts.map +1 -1
- package/dist/chat/tools/workflow.js +5 -3
- package/dist/chat/tools/workflow.js.map +1 -1
- package/dist/chat/tools.d.ts.map +1 -1
- package/dist/chat/tools.js +22 -0
- package/dist/chat/tools.js.map +1 -1
- package/dist/chat/turn_control.d.ts +66 -19
- package/dist/chat/turn_control.d.ts.map +1 -1
- package/dist/chat/turn_control.js +112 -31
- package/dist/chat/turn_control.js.map +1 -1
- package/dist/chat/urazuke_section.d.ts +8 -0
- package/dist/chat/urazuke_section.d.ts.map +1 -0
- package/dist/chat/urazuke_section.js +42 -0
- package/dist/chat/urazuke_section.js.map +1 -0
- package/dist/commands/pending.d.ts +1 -0
- package/dist/commands/pending.d.ts.map +1 -1
- package/dist/commands/pending.js +82 -8
- package/dist/commands/pending.js.map +1 -1
- package/dist/commands/start.d.ts +60 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +265 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/urazuke.d.ts +17 -0
- package/dist/commands/urazuke.d.ts.map +1 -0
- package/dist/commands/urazuke.js +541 -0
- package/dist/commands/urazuke.js.map +1 -0
- package/dist/commands/workflow.js +4 -4
- package/dist/commands/workflow.js.map +1 -1
- package/dist/core/brain_config.d.ts +4 -0
- package/dist/core/brain_config.d.ts.map +1 -1
- package/dist/core/brain_config.js +2 -0
- package/dist/core/brain_config.js.map +1 -1
- package/dist/core/forge_embed.d.ts.map +1 -1
- package/dist/core/forge_embed.js +10 -0
- package/dist/core/forge_embed.js.map +1 -1
- package/dist/core/limits_config.d.ts +15 -0
- package/dist/core/limits_config.d.ts.map +1 -1
- package/dist/core/limits_config.js +5 -0
- package/dist/core/limits_config.js.map +1 -1
- package/dist/core/native_dialogs.d.ts +13 -0
- package/dist/core/native_dialogs.d.ts.map +1 -0
- package/dist/core/native_dialogs.js +111 -0
- package/dist/core/native_dialogs.js.map +1 -0
- package/dist/core/projects.d.ts +6 -0
- package/dist/core/projects.d.ts.map +1 -1
- package/dist/core/projects.js +1 -1
- package/dist/core/projects.js.map +1 -1
- package/dist/docs/doctrine/urazuke.md +38 -0
- package/dist/nac3/internal_manifest.d.ts.map +1 -1
- package/dist/nac3/internal_manifest.js +96 -2
- package/dist/nac3/internal_manifest.js.map +1 -1
- package/dist/pending/store.d.ts +8 -1
- package/dist/pending/store.d.ts.map +1 -1
- package/dist/pending/store.js +8 -1
- package/dist/pending/store.js.map +1 -1
- package/dist/pending/types.d.ts +41 -1
- package/dist/pending/types.d.ts.map +1 -1
- package/dist/pending/types.js.map +1 -1
- package/dist/urazuke/catalog.d.ts +109 -0
- package/dist/urazuke/catalog.d.ts.map +1 -0
- package/dist/urazuke/catalog.js +459 -0
- package/dist/urazuke/catalog.js.map +1 -0
- package/dist/urazuke/close_gate.d.ts +36 -0
- package/dist/urazuke/close_gate.d.ts.map +1 -0
- package/dist/urazuke/close_gate.js +48 -0
- package/dist/urazuke/close_gate.js.map +1 -0
- package/dist/urazuke/current.d.ts +55 -0
- package/dist/urazuke/current.d.ts.map +1 -0
- package/dist/urazuke/current.js +125 -0
- package/dist/urazuke/current.js.map +1 -0
- package/dist/urazuke/cycle.d.ts +91 -0
- package/dist/urazuke/cycle.d.ts.map +1 -0
- package/dist/urazuke/cycle.js +310 -0
- package/dist/urazuke/cycle.js.map +1 -0
- package/dist/urazuke/enabled.d.ts +31 -0
- package/dist/urazuke/enabled.d.ts.map +1 -0
- package/dist/urazuke/enabled.js +51 -0
- package/dist/urazuke/enabled.js.map +1 -0
- package/dist/urazuke/evidence.d.ts +45 -0
- package/dist/urazuke/evidence.d.ts.map +1 -0
- package/dist/urazuke/evidence.js +264 -0
- package/dist/urazuke/evidence.js.map +1 -0
- package/dist/urazuke/gate.d.ts +68 -0
- package/dist/urazuke/gate.d.ts.map +1 -0
- package/dist/urazuke/gate.js +249 -0
- package/dist/urazuke/gate.js.map +1 -0
- package/dist/urazuke/probes.d.ts +13 -0
- package/dist/urazuke/probes.d.ts.map +1 -0
- package/dist/urazuke/probes.js +87 -0
- package/dist/urazuke/probes.js.map +1 -0
- package/dist/urazuke/prompts.generated.d.ts +12 -0
- package/dist/urazuke/prompts.generated.d.ts.map +1 -0
- package/dist/urazuke/prompts.generated.js +135 -0
- package/dist/urazuke/prompts.generated.js.map +1 -0
- package/dist/urazuke/prompts_client.d.ts +44 -0
- package/dist/urazuke/prompts_client.d.ts.map +1 -0
- package/dist/urazuke/prompts_client.js +151 -0
- package/dist/urazuke/prompts_client.js.map +1 -0
- package/dist/urazuke/quality.d.ts +99 -0
- package/dist/urazuke/quality.d.ts.map +1 -0
- package/dist/urazuke/quality.js +269 -0
- package/dist/urazuke/quality.js.map +1 -0
- package/dist/urazuke/receipts.d.ts +90 -0
- package/dist/urazuke/receipts.d.ts.map +1 -0
- package/dist/urazuke/receipts.js +171 -0
- package/dist/urazuke/receipts.js.map +1 -0
- package/dist/urazuke/report.d.ts +23 -0
- package/dist/urazuke/report.d.ts.map +1 -0
- package/dist/urazuke/report.js +62 -0
- package/dist/urazuke/report.js.map +1 -0
- package/dist/urazuke/retro.d.ts +52 -0
- package/dist/urazuke/retro.d.ts.map +1 -0
- package/dist/urazuke/retro.js +145 -0
- package/dist/urazuke/retro.js.map +1 -0
- package/dist/urazuke/section.d.ts +43 -0
- package/dist/urazuke/section.d.ts.map +1 -0
- package/dist/urazuke/section.js +64 -0
- package/dist/urazuke/section.js.map +1 -0
- package/dist/urazuke/stacks.d.ts +42 -0
- package/dist/urazuke/stacks.d.ts.map +1 -0
- package/dist/urazuke/stacks.js +264 -0
- package/dist/urazuke/stacks.js.map +1 -0
- package/dist/urazuke/workflow.d.ts +23 -0
- package/dist/urazuke/workflow.d.ts.map +1 -0
- package/dist/urazuke/workflow.js +64 -0
- package/dist/urazuke/workflow.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/workflow/config.d.ts +9 -4
- package/dist/workflow/config.d.ts.map +1 -1
- package/dist/workflow/config.js +4 -1
- package/dist/workflow/config.js.map +1 -1
- package/dist/workflow/definitions.d.ts +20 -4
- package/dist/workflow/definitions.d.ts.map +1 -1
- package/dist/workflow/definitions.js +16 -3
- package/dist/workflow/definitions.js.map +1 -1
- package/dist/workflow/instances.d.ts.map +1 -1
- package/dist/workflow/instances.js +6 -0
- package/dist/workflow/instances.js.map +1 -1
- package/dist/workflow/orchestrator.d.ts +10 -1
- package/dist/workflow/orchestrator.d.ts.map +1 -1
- package/dist/workflow/orchestrator.js +54 -7
- package/dist/workflow/orchestrator.js.map +1 -1
- package/dist/workflow/select.d.ts +5 -1
- package/dist/workflow/select.d.ts.map +1 -1
- package/dist/workflow/select.js +16 -5
- package/dist/workflow/select.js.map +1 -1
- package/dist/workflow/state.d.ts +3 -2
- package/dist/workflow/state.d.ts.map +1 -1
- package/dist/workflow/state.js.map +1 -1
- package/docs/doctrine/urazuke.md +38 -0
- package/package.json +18 -20
- package/src/i18n/catalogs/ar.json +550 -542
- package/src/i18n/catalogs/de.json +550 -542
- package/src/i18n/catalogs/en.json +550 -542
- package/src/i18n/catalogs/es.json +550 -542
- package/src/i18n/catalogs/fr.json +550 -542
- package/src/i18n/catalogs/hi.json +550 -542
- package/src/i18n/catalogs/it.json +550 -542
- package/src/i18n/catalogs/ja.json +550 -542
- package/src/i18n/catalogs/pt.json +550 -542
- package/src/i18n/catalogs/zh.json +550 -542
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QUALITY BY MACHINE (Urazuke step 9) -- the native meters and the ratchet.
|
|
3
|
+
*
|
|
4
|
+
* What a human reviewer would look at, measured by Forge for ANY stack:
|
|
5
|
+
* - size: lines per file and per function (brace / indent based);
|
|
6
|
+
* - complexity: a cyclomatic approximation per function (branches,
|
|
7
|
+
* loops, boolean operators, catch, ternaries, case);
|
|
8
|
+
* - duplication: identical normalised blocks of N lines across files.
|
|
9
|
+
* Plus the stack's own tools when the adapter has them (lint, coverage,
|
|
10
|
+
* mutation) and a RATCHET: coverage and mutation score may only go up,
|
|
11
|
+
* duplication and violations may only go down. The ratchet lives in
|
|
12
|
+
* <root>/.forge/quality-ratchet.json; the measured numbers go to
|
|
13
|
+
* docs/CODE_QUALITY.md (the artifact the step names) and to a `quality`
|
|
14
|
+
* receipt, so the gate is a number with a floor, not an opinion.
|
|
15
|
+
*
|
|
16
|
+
* ASCII-only.
|
|
17
|
+
*/
|
|
18
|
+
import fs from 'node:fs/promises';
|
|
19
|
+
import path from 'node:path';
|
|
20
|
+
import { detectStack, readCoveragePct, readMutationScore } from './stacks.js';
|
|
21
|
+
export const DEFAULT_LIMITS = { max_file_lines: 300, max_function_lines: 40, max_complexity: 10, dup_block_lines: 8 };
|
|
22
|
+
/* ---------------- scanning ---------------- */
|
|
23
|
+
async function walk(root, a) {
|
|
24
|
+
const out = [];
|
|
25
|
+
const stack = [root];
|
|
26
|
+
while (stack.length) {
|
|
27
|
+
const d = stack.pop();
|
|
28
|
+
for (const n of await fs.readdir(d).catch(() => [])) {
|
|
29
|
+
if (a.ignore_dirs.includes(n) || n.startsWith('.'))
|
|
30
|
+
continue;
|
|
31
|
+
const f = path.join(d, n);
|
|
32
|
+
const st = await fs.stat(f).catch(() => undefined);
|
|
33
|
+
if (!st)
|
|
34
|
+
continue;
|
|
35
|
+
if (st.isDirectory())
|
|
36
|
+
stack.push(f);
|
|
37
|
+
else if (a.source_exts.some((e) => n.endsWith(e)) && !/\.(test|spec)\.|\.d\.ts$|\.min\.js$/.test(n) && st.size < 2_000_000)
|
|
38
|
+
out.push(f);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return out.sort();
|
|
42
|
+
}
|
|
43
|
+
const FN_RE = /^\s*(?:export\s+)?(?:async\s+)?(?:function\s+([A-Za-z_$][\w$]*)|(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>|(?:public|private|protected|static|override|\s)*\s*(?:async\s+)?([A-Za-z_$][\w$]*)\s*\([^)]*\)\s*(?::\s*[^{]+)?\{|def\s+([A-Za-z_][\w]*)\s*\(|func\s+(?:\([^)]*\)\s*)?([A-Za-z_][\w]*)\s*\()/;
|
|
44
|
+
const BRANCH_RE = /\b(if|else if|elif|for|while|case|catch|except|when)\b|&&|\|\||\?\s*[^:.]+:|\?\?/g;
|
|
45
|
+
/** Split a file into functions by brace balance (C-like) or indentation
|
|
46
|
+
* (python). Approximate on purpose: the gate wants an order of magnitude,
|
|
47
|
+
* not a parser. */
|
|
48
|
+
export function scanFunctions(lines, python) {
|
|
49
|
+
const out = [];
|
|
50
|
+
for (let i = 0; i < lines.length; i++) {
|
|
51
|
+
const m = FN_RE.exec(lines[i] ?? '');
|
|
52
|
+
if (!m)
|
|
53
|
+
continue;
|
|
54
|
+
const name = m[1] ?? m[2] ?? m[3] ?? m[4] ?? m[5] ?? 'anon';
|
|
55
|
+
let end = i;
|
|
56
|
+
if (python || /^\s*def\s/.test(lines[i] ?? '')) {
|
|
57
|
+
const indent = (/^(\s*)/.exec(lines[i] ?? '')?.[1] ?? '').length;
|
|
58
|
+
end = i;
|
|
59
|
+
for (let j = i + 1; j < lines.length; j++) {
|
|
60
|
+
const l = lines[j] ?? '';
|
|
61
|
+
if (!l.trim())
|
|
62
|
+
continue;
|
|
63
|
+
const ind = (/^(\s*)/.exec(l)?.[1] ?? '').length;
|
|
64
|
+
if (ind <= indent)
|
|
65
|
+
break;
|
|
66
|
+
end = j;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
let depth = 0;
|
|
71
|
+
let seen = false;
|
|
72
|
+
for (let j = i; j < lines.length; j++) {
|
|
73
|
+
const l = lines[j] ?? '';
|
|
74
|
+
for (const ch of l) {
|
|
75
|
+
if (ch === '{') {
|
|
76
|
+
depth++;
|
|
77
|
+
seen = true;
|
|
78
|
+
}
|
|
79
|
+
else if (ch === '}')
|
|
80
|
+
depth--;
|
|
81
|
+
}
|
|
82
|
+
if (seen && depth <= 0) {
|
|
83
|
+
end = j;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
end = j;
|
|
87
|
+
}
|
|
88
|
+
if (!seen)
|
|
89
|
+
end = i;
|
|
90
|
+
}
|
|
91
|
+
let complexity = 1;
|
|
92
|
+
for (let j = i; j <= end; j++)
|
|
93
|
+
complexity += ((lines[j] ?? '').match(BRANCH_RE) ?? []).length;
|
|
94
|
+
out.push({ name, start: i + 1, end: end + 1, complexity });
|
|
95
|
+
if (!python)
|
|
96
|
+
i = Math.max(i, Math.min(end, i + 0));
|
|
97
|
+
}
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
function normalise(l) {
|
|
101
|
+
return l.replace(/\s+/g, ' ').replace(/\/\/.*$/, '').trim();
|
|
102
|
+
}
|
|
103
|
+
export async function measureNative(root, a, limits = DEFAULT_LIMITS) {
|
|
104
|
+
const files = await walk(root, a);
|
|
105
|
+
const violations = [];
|
|
106
|
+
let lines = 0, functions = 0, maxFile = 0, maxFn = 0, maxCx = 0;
|
|
107
|
+
const blocks = new Map();
|
|
108
|
+
for (const f of files) {
|
|
109
|
+
const rel = path.relative(root, f).replace(/\\/g, '/');
|
|
110
|
+
const body = await fs.readFile(f, 'utf8').catch(() => '');
|
|
111
|
+
const ls = body.split(/\r?\n/);
|
|
112
|
+
const code = ls.filter((l) => l.trim() && !/^\s*(\/\/|#|\*|\/\*)/.test(l));
|
|
113
|
+
lines += code.length;
|
|
114
|
+
maxFile = Math.max(maxFile, code.length);
|
|
115
|
+
if (code.length > limits.max_file_lines)
|
|
116
|
+
violations.push({ kind: 'file_lines', where: rel, value: code.length, limit: limits.max_file_lines });
|
|
117
|
+
for (const fn of scanFunctions(ls, f.endsWith('.py'))) {
|
|
118
|
+
functions += 1;
|
|
119
|
+
const len = ls.slice(fn.start - 1, fn.end).filter((l) => l.trim()).length;
|
|
120
|
+
maxFn = Math.max(maxFn, len);
|
|
121
|
+
maxCx = Math.max(maxCx, fn.complexity);
|
|
122
|
+
if (len > limits.max_function_lines)
|
|
123
|
+
violations.push({ kind: 'function_lines', where: rel + ':' + fn.start + ' ' + fn.name, value: len, limit: limits.max_function_lines });
|
|
124
|
+
if (fn.complexity > limits.max_complexity)
|
|
125
|
+
violations.push({ kind: 'complexity', where: rel + ':' + fn.start + ' ' + fn.name, value: fn.complexity, limit: limits.max_complexity });
|
|
126
|
+
}
|
|
127
|
+
const norm = code.map(normalise).filter((l) => l.length > 12);
|
|
128
|
+
for (let i = 0; i + limits.dup_block_lines <= norm.length; i++) {
|
|
129
|
+
const key = norm.slice(i, i + limits.dup_block_lines).join('\n');
|
|
130
|
+
const arr = blocks.get(key) ?? [];
|
|
131
|
+
arr.push(rel + ':' + (i + 1));
|
|
132
|
+
blocks.set(key, arr);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
let dup = 0;
|
|
136
|
+
for (const [, where] of blocks) {
|
|
137
|
+
const distinctFiles = new Set(where.map((w) => w.split(':')[0]));
|
|
138
|
+
if (where.length > 1 && (distinctFiles.size > 1 || where.length > 2)) {
|
|
139
|
+
dup += 1;
|
|
140
|
+
if (violations.filter((v) => v.kind === 'duplication').length < 50)
|
|
141
|
+
violations.push({ kind: 'duplication', where: where.slice(0, 3).join(' = '), value: where.length, limit: 1 });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return { files: files.length, lines, functions, violations, max_file_lines: maxFile, max_function_lines: maxFn, max_complexity: maxCx, duplicated_blocks: dup };
|
|
145
|
+
}
|
|
146
|
+
export function ratchetPath(root) { return path.join(root, '.forge', 'quality-ratchet.json'); }
|
|
147
|
+
export async function readRatchet(root) {
|
|
148
|
+
try {
|
|
149
|
+
const r = JSON.parse(await fs.readFile(ratchetPath(root), 'utf8'));
|
|
150
|
+
if (r && r.version === 1)
|
|
151
|
+
return { ...r, history: Array.isArray(r.history) ? r.history : [] };
|
|
152
|
+
}
|
|
153
|
+
catch { /* none */ }
|
|
154
|
+
return { version: 1, updated_at: 0, history: [] };
|
|
155
|
+
}
|
|
156
|
+
export async function writeRatchet(root, r) {
|
|
157
|
+
await fs.mkdir(path.dirname(ratchetPath(root)), { recursive: true });
|
|
158
|
+
await fs.writeFile(ratchetPath(root), JSON.stringify(r, null, 2) + '\n', 'utf8');
|
|
159
|
+
}
|
|
160
|
+
/** Compare a measurement against the ratchet. Numbers may only improve;
|
|
161
|
+
* the first measurement sets the floor. */
|
|
162
|
+
export function applyRatchet(prev, m, now = Date.now()) {
|
|
163
|
+
const reasons = [];
|
|
164
|
+
if (prev.coverage_pct != null && m.coverage_pct != null && m.coverage_pct + 0.05 < prev.coverage_pct)
|
|
165
|
+
reasons.push('coverage dropped ' + prev.coverage_pct + ' -> ' + m.coverage_pct);
|
|
166
|
+
if (prev.mutation_score != null && m.mutation_score != null && m.mutation_score + 0.05 < prev.mutation_score)
|
|
167
|
+
reasons.push('mutation score dropped ' + prev.mutation_score + ' -> ' + m.mutation_score);
|
|
168
|
+
if (prev.violations != null && m.violations > prev.violations)
|
|
169
|
+
reasons.push('violations rose ' + prev.violations + ' -> ' + m.violations);
|
|
170
|
+
if (prev.duplicated_blocks != null && m.duplicated_blocks > prev.duplicated_blocks)
|
|
171
|
+
reasons.push('duplicated blocks rose ' + prev.duplicated_blocks + ' -> ' + m.duplicated_blocks);
|
|
172
|
+
const ok = reasons.length === 0;
|
|
173
|
+
const next = {
|
|
174
|
+
version: 1, updated_at: now,
|
|
175
|
+
coverage_pct: ok ? Math.max(prev.coverage_pct ?? -1, m.coverage_pct ?? -1) : prev.coverage_pct,
|
|
176
|
+
mutation_score: ok ? Math.max(prev.mutation_score ?? -1, m.mutation_score ?? -1) : prev.mutation_score,
|
|
177
|
+
violations: ok ? Math.min(prev.violations ?? Infinity, m.violations) : prev.violations,
|
|
178
|
+
duplicated_blocks: ok ? Math.min(prev.duplicated_blocks ?? Infinity, m.duplicated_blocks) : prev.duplicated_blocks,
|
|
179
|
+
history: [...prev.history.slice(-199), { at: now, ...(m.coverage_pct != null ? { coverage_pct: m.coverage_pct } : {}), ...(m.mutation_score != null ? { mutation_score: m.mutation_score } : {}), violations: m.violations, duplicated_blocks: m.duplicated_blocks }],
|
|
180
|
+
};
|
|
181
|
+
if (next.coverage_pct === -1)
|
|
182
|
+
delete next.coverage_pct;
|
|
183
|
+
if (next.mutation_score === -1)
|
|
184
|
+
delete next.mutation_score;
|
|
185
|
+
if (next.violations === Infinity)
|
|
186
|
+
delete next.violations;
|
|
187
|
+
if (next.duplicated_blocks === Infinity)
|
|
188
|
+
delete next.duplicated_blocks;
|
|
189
|
+
return { ok, reasons, next };
|
|
190
|
+
}
|
|
191
|
+
export async function runQualityCheck(root, opts = {}) {
|
|
192
|
+
const stack = await detectStack(root);
|
|
193
|
+
const limits = { ...DEFAULT_LIMITS, ...(opts.limits ?? {}) };
|
|
194
|
+
const native = await measureNative(root, stack, limits);
|
|
195
|
+
const { runCommand } = await import('./evidence.js');
|
|
196
|
+
const timeout = opts.timeout_ms ?? 10 * 60 * 1000;
|
|
197
|
+
const lint = [];
|
|
198
|
+
if (opts.lint !== false) {
|
|
199
|
+
for (const cmd of stack.lint_commands) {
|
|
200
|
+
const r = await runCommand(cmd, root, timeout);
|
|
201
|
+
lint.push({ command: cmd, exit_code: r.exit_code, tail: r.output.slice(-1500) });
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
let coverage_pct;
|
|
205
|
+
if (opts.coverage && stack.coverage_command) {
|
|
206
|
+
await runCommand(stack.coverage_command, root, timeout);
|
|
207
|
+
coverage_pct = await readCoveragePct(root, stack);
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
coverage_pct = await readCoveragePct(root, stack);
|
|
211
|
+
}
|
|
212
|
+
let mutation_score;
|
|
213
|
+
if (opts.mutation && stack.mutation_command) {
|
|
214
|
+
const r = await runCommand(stack.mutation_command, root, Math.max(timeout, 30 * 60 * 1000));
|
|
215
|
+
mutation_score = (await readMutationScore(root, stack, r.output))?.score;
|
|
216
|
+
}
|
|
217
|
+
const prev = await readRatchet(root);
|
|
218
|
+
const ratchet = applyRatchet(prev, { ...(coverage_pct != null ? { coverage_pct } : {}), ...(mutation_score != null ? { mutation_score } : {}), violations: native.violations.length, duplicated_blocks: native.duplicated_blocks });
|
|
219
|
+
const lintOk = lint.every((l) => l.exit_code === 0);
|
|
220
|
+
const ok = lintOk && ratchet.ok;
|
|
221
|
+
if (ok && opts.persist !== false)
|
|
222
|
+
await writeRatchet(root, ratchet.next);
|
|
223
|
+
return { stack, limits, native, lint, ...(coverage_pct != null ? { coverage_pct } : {}), ...(mutation_score != null ? { mutation_score } : {}), ratchet, ok };
|
|
224
|
+
}
|
|
225
|
+
/** docs/CODE_QUALITY.md -- the artifact step 9 names, with the measured
|
|
226
|
+
* values. Rewritten on every check; the history lives in the ratchet. */
|
|
227
|
+
export function renderCodeQuality(r, prevBody) {
|
|
228
|
+
const keep = prevBody ? (/## Decisiones del dueno[\s\S]*$/.exec(prevBody)?.[0] ?? '') : '';
|
|
229
|
+
const v = r.native.violations;
|
|
230
|
+
const by = (k) => v.filter((x) => x.kind === k);
|
|
231
|
+
const lines = [
|
|
232
|
+
'# Calidad del codigo verificada por maquina',
|
|
233
|
+
'',
|
|
234
|
+
'Generado por `yf urazuke quality check` el ' + new Date().toISOString() + '. Stack: ' + r.stack.label + '.',
|
|
235
|
+
'Los numeros de abajo son medidos; el trinquete (`.forge/quality-ratchet.json`) solo deja mejorar.',
|
|
236
|
+
'',
|
|
237
|
+
'## Herramientas',
|
|
238
|
+
'',
|
|
239
|
+
'- Bateria: `' + (r.stack.test_command || '(sin comando de tests)') + '`',
|
|
240
|
+
'- Lint / formato: ' + (r.stack.lint_commands.length ? r.stack.lint_commands.map((c) => '`' + c + '`').join(', ') : '(ninguno instalado; medidores nativos de Forge)'),
|
|
241
|
+
'- Cobertura: ' + (r.stack.coverage_command ? '`' + r.stack.coverage_command + '` -> ' + r.stack.coverage_file : '(no disponible)'),
|
|
242
|
+
'- Mutacion: ' + (r.stack.mutation_command ? r.stack.mutation_tool + ' (`' + r.stack.mutation_command + '`)' : '(no disponible)'),
|
|
243
|
+
'',
|
|
244
|
+
'## Limites y valores medidos',
|
|
245
|
+
'',
|
|
246
|
+
'| Medida | Limite | Medido | Estado |',
|
|
247
|
+
'|---|---|---|---|',
|
|
248
|
+
'| Lineas por archivo (max) | ' + r.limits.max_file_lines + ' | ' + r.native.max_file_lines + ' | ' + (by('file_lines').length ? by('file_lines').length + ' archivos pasan el limite' : 'ok') + ' |',
|
|
249
|
+
'| Lineas por funcion (max) | ' + r.limits.max_function_lines + ' | ' + r.native.max_function_lines + ' | ' + (by('function_lines').length ? by('function_lines').length + ' funciones pasan el limite' : 'ok') + ' |',
|
|
250
|
+
'| Complejidad por funcion (max) | ' + r.limits.max_complexity + ' | ' + r.native.max_complexity + ' | ' + (by('complexity').length ? by('complexity').length + ' funciones pasan el limite' : 'ok') + ' |',
|
|
251
|
+
'| Bloques duplicados (' + r.limits.dup_block_lines + ' lineas) | 0 | ' + r.native.duplicated_blocks + ' | ' + (r.native.duplicated_blocks ? 'hay duplicacion' : 'ok') + ' |',
|
|
252
|
+
'| Cobertura de lineas (%) | piso ' + (r.ratchet.next.coverage_pct ?? '-') + ' | ' + (r.coverage_pct ?? '-') + ' | ' + (r.coverage_pct != null ? 'trinquete' : 'sin medir') + ' |',
|
|
253
|
+
'| Puntaje de mutacion (%) | piso ' + (r.ratchet.next.mutation_score ?? '-') + ' | ' + (r.mutation_score ?? '-') + ' | ' + (r.mutation_score != null ? 'trinquete' : 'sin medir') + ' |',
|
|
254
|
+
'| Lint / formato | 0 fallos | ' + r.lint.filter((l) => l.exit_code !== 0).length + ' fallos | ' + (r.lint.every((l) => l.exit_code === 0) ? 'ok' : 'rojo') + ' |',
|
|
255
|
+
'',
|
|
256
|
+
'## Lo que hoy falla (' + v.length + ')',
|
|
257
|
+
'',
|
|
258
|
+
...(v.length ? v.slice(0, 80).map((x) => '- ' + x.kind + ': ' + x.where + ' (' + x.value + ' > ' + x.limit + ')') : ['- nada']),
|
|
259
|
+
...(v.length > 80 ? ['- ... y ' + (v.length - 80) + ' mas (yf urazuke quality check --json)'] : []),
|
|
260
|
+
'',
|
|
261
|
+
'## Trinquete',
|
|
262
|
+
'',
|
|
263
|
+
r.ratchet.ok ? '- en verde: los numeros no empeoraron.' : '- EN ROJO: ' + r.ratchet.reasons.join('; '),
|
|
264
|
+
'',
|
|
265
|
+
keep || '## Decisiones del dueno\n\n_Que se arregla ahora (un pendiente cada uno) y que se tolera con fecha._\n',
|
|
266
|
+
];
|
|
267
|
+
return lines.join('\n');
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.js","sourceRoot":"","sources":["../../src/urazuke/quality.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
export type ReceiptKind = 'red_proof' | 'green' | 'regression' | 'e2e' | 'quality' | 'mutation' | 'load' | 'other';
|
|
2
|
+
export interface ReceiptCounts {
|
|
3
|
+
passed?: number;
|
|
4
|
+
failed?: number;
|
|
5
|
+
skipped?: number;
|
|
6
|
+
total?: number;
|
|
7
|
+
/** Test FILES / suites the runner reported as failed (a file that does
|
|
8
|
+
* not even load, e.g. the module under test does not exist at the
|
|
9
|
+
* base). Counts as red for a red proof: the runner said FAIL. */
|
|
10
|
+
failed_files?: number;
|
|
11
|
+
/** For mutation: killed / survived. */
|
|
12
|
+
killed?: number;
|
|
13
|
+
survived?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface Receipt {
|
|
16
|
+
/** `RCP-NNN`, never reused. */
|
|
17
|
+
id: string;
|
|
18
|
+
kind: ReceiptKind;
|
|
19
|
+
/** The pending item this evidence belongs to, when known. */
|
|
20
|
+
pending_id?: string;
|
|
21
|
+
/** Urazuke step number, when known. */
|
|
22
|
+
step?: number;
|
|
23
|
+
command: string;
|
|
24
|
+
cwd: string;
|
|
25
|
+
/** Git HEAD the command ran against (or the base ref for a red proof). */
|
|
26
|
+
ref: string;
|
|
27
|
+
/** True when the working tree had uncommitted changes. */
|
|
28
|
+
dirty: boolean;
|
|
29
|
+
exit_code: number;
|
|
30
|
+
started_at: number;
|
|
31
|
+
duration_ms: number;
|
|
32
|
+
counts: ReceiptCounts;
|
|
33
|
+
/** Last lines of stdout+stderr, bounded. */
|
|
34
|
+
output_tail: string;
|
|
35
|
+
/** For a red proof: the base ref the test was run against. */
|
|
36
|
+
base_ref?: string;
|
|
37
|
+
/** For a red proof: `base` (the test carried into the previous version)
|
|
38
|
+
* or `mutation` (D-037: a deliberate defect planted in the NEW code when
|
|
39
|
+
* the previous version does not have the module at all). */
|
|
40
|
+
mode?: 'base' | 'mutation';
|
|
41
|
+
/** The unified diff of the planted defect (mutation mode), bounded. The
|
|
42
|
+
* owner sees in the receipt that the mutant was not trivial. */
|
|
43
|
+
mutation_diff?: string;
|
|
44
|
+
/** The verdict Forge derived: for red_proof, failed > 0 and exit != 0;
|
|
45
|
+
* for green/regression/e2e, exit == 0 and failed == 0. */
|
|
46
|
+
verdict: 'ok' | 'not_ok';
|
|
47
|
+
note?: string;
|
|
48
|
+
}
|
|
49
|
+
interface ReceiptFile {
|
|
50
|
+
version: 1;
|
|
51
|
+
project_slug: string;
|
|
52
|
+
next_id: number;
|
|
53
|
+
items: Receipt[];
|
|
54
|
+
}
|
|
55
|
+
export declare function readReceipts(slug: string): Promise<ReceiptFile>;
|
|
56
|
+
export type ReceiptInput = Omit<Receipt, 'id' | 'verdict'>;
|
|
57
|
+
/** Derive the verdict from the kind + exit code + counts. Pure. */
|
|
58
|
+
export declare function receiptVerdict(kind: ReceiptKind, exit_code: number, counts: ReceiptCounts, mode?: 'base' | 'mutation'): 'ok' | 'not_ok';
|
|
59
|
+
/** Append a receipt. The id and the verdict are assigned here. */
|
|
60
|
+
export declare function appendReceipt(slug: string, input: ReceiptInput): Promise<Receipt>;
|
|
61
|
+
export interface ReceiptSummary {
|
|
62
|
+
red_proofs: number;
|
|
63
|
+
/** Reds that tell behaviour apart (tests failed or a mutant): D-037. */
|
|
64
|
+
strong_red_proofs: number;
|
|
65
|
+
greens: number;
|
|
66
|
+
regressions: number;
|
|
67
|
+
e2e: number;
|
|
68
|
+
quality: number;
|
|
69
|
+
mutation: number;
|
|
70
|
+
last_at?: number;
|
|
71
|
+
}
|
|
72
|
+
/** Count the OK receipts per kind (a not_ok receipt is evidence of the
|
|
73
|
+
* opposite, it never counts towards a step). */
|
|
74
|
+
/** A red that tells behaviour apart (D-037): tests failed, or a mutant was
|
|
75
|
+
* planted. A red whose only signal is "the file does not load at the base"
|
|
76
|
+
* (the module did not exist yet) is a weak red: valid, but not enough to
|
|
77
|
+
* ship on its own. */
|
|
78
|
+
export declare function isStrongRed(r: Receipt): boolean;
|
|
79
|
+
export declare function summarizeReceipts(items: Receipt[], filter?: {
|
|
80
|
+
pending_id?: string;
|
|
81
|
+
}): ReceiptSummary;
|
|
82
|
+
/** Parse pass/fail counts out of common test runner output (vitest, jest,
|
|
83
|
+
* mocha, pytest, go test, playwright, junit-ish). Best effort; returns
|
|
84
|
+
* what it recognised. */
|
|
85
|
+
export declare function parseCounts(raw: string): ReceiptCounts;
|
|
86
|
+
/** Render a receipt the way the method wants it pasted: one block the
|
|
87
|
+
* owner can rerun. */
|
|
88
|
+
export declare function renderReceipt(r: Receipt): string;
|
|
89
|
+
export {};
|
|
90
|
+
//# sourceMappingURL=receipts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipts.d.ts","sourceRoot":"","sources":["../../src/urazuke/receipts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EVIDENCE RECEIPTS -- the record Forge writes, never the brain.
|
|
3
|
+
*
|
|
4
|
+
* A receipt is what the method calls "el rojo como recibo": the exact
|
|
5
|
+
* command, the version it ran against, the exit code, the parsed counts and
|
|
6
|
+
* the tail of the output, captured by Forge from a subprocess it ran itself.
|
|
7
|
+
* The brain can ASK for a run (yujin.evidence.run); it cannot write a
|
|
8
|
+
* receipt by hand, so a claim without a receipt stays a claim.
|
|
9
|
+
*
|
|
10
|
+
* Storage: ~/.yujin-forge/projects/<slug>/receipts.json, append-only,
|
|
11
|
+
* atomic write. Same config-root resolution as the pending registry.
|
|
12
|
+
*
|
|
13
|
+
* ASCII-only.
|
|
14
|
+
*/
|
|
15
|
+
import fs from 'node:fs/promises';
|
|
16
|
+
import os from 'node:os';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
const FILE_NAME = 'receipts.json';
|
|
19
|
+
function configRoot() {
|
|
20
|
+
if (process.env['YUJIN_FORGE_HOME'])
|
|
21
|
+
return process.env['YUJIN_FORGE_HOME'];
|
|
22
|
+
if (process.env['YF_CONFIG_DIR'])
|
|
23
|
+
return process.env['YF_CONFIG_DIR'];
|
|
24
|
+
const xdg = process.env['XDG_CONFIG_HOME'];
|
|
25
|
+
if (xdg && process.platform === 'linux')
|
|
26
|
+
return path.join(xdg, 'yujin-forge');
|
|
27
|
+
return path.join(os.homedir(), '.yujin-forge');
|
|
28
|
+
}
|
|
29
|
+
function fileFor(slug) {
|
|
30
|
+
if (!slug || slug.includes('..') || /[/\\]/.test(slug))
|
|
31
|
+
throw new Error('receipts: invalid project_slug ' + JSON.stringify(slug));
|
|
32
|
+
return path.join(configRoot(), 'projects', slug, FILE_NAME);
|
|
33
|
+
}
|
|
34
|
+
export async function readReceipts(slug) {
|
|
35
|
+
try {
|
|
36
|
+
const raw = await fs.readFile(fileFor(slug), 'utf8');
|
|
37
|
+
const parsed = JSON.parse(raw);
|
|
38
|
+
if (parsed && parsed.version === 1 && Array.isArray(parsed.items))
|
|
39
|
+
return parsed;
|
|
40
|
+
}
|
|
41
|
+
catch { /* missing */ }
|
|
42
|
+
return { version: 1, project_slug: slug, next_id: 1, items: [] };
|
|
43
|
+
}
|
|
44
|
+
async function writeReceipts(file) {
|
|
45
|
+
const f = fileFor(file.project_slug);
|
|
46
|
+
await fs.mkdir(path.dirname(f), { recursive: true });
|
|
47
|
+
const tmp = f + '.tmp';
|
|
48
|
+
await fs.writeFile(tmp, JSON.stringify(file, null, 2), { encoding: 'utf8', mode: 0o600 });
|
|
49
|
+
await fs.rename(tmp, f);
|
|
50
|
+
}
|
|
51
|
+
/** Derive the verdict from the kind + exit code + counts. Pure. */
|
|
52
|
+
export function receiptVerdict(kind, exit_code, counts, mode) {
|
|
53
|
+
const failed = counts.failed ?? 0;
|
|
54
|
+
const failedFiles = counts.failed_files ?? 0;
|
|
55
|
+
/* A mutation red must fail TESTS: a mutant that only breaks the load of
|
|
56
|
+
* the file (a syntax error) proves nothing about the test. */
|
|
57
|
+
if (kind === 'red_proof' && mode === 'mutation')
|
|
58
|
+
return (exit_code !== 0 && failed > 0) ? 'ok' : 'not_ok';
|
|
59
|
+
if (kind === 'red_proof')
|
|
60
|
+
return (exit_code !== 0 && (failed > 0 || failedFiles > 0)) ? 'ok' : 'not_ok';
|
|
61
|
+
if (kind === 'mutation')
|
|
62
|
+
return (counts.killed ?? 0) > 0 ? 'ok' : 'not_ok';
|
|
63
|
+
if (kind === 'load' || kind === 'other')
|
|
64
|
+
return exit_code === 0 ? 'ok' : 'not_ok';
|
|
65
|
+
return (exit_code === 0 && failed === 0) ? 'ok' : 'not_ok';
|
|
66
|
+
}
|
|
67
|
+
/** Append a receipt. The id and the verdict are assigned here. */
|
|
68
|
+
export async function appendReceipt(slug, input) {
|
|
69
|
+
const file = await readReceipts(slug);
|
|
70
|
+
const id = 'RCP-' + String(file.next_id).padStart(3, '0');
|
|
71
|
+
const receipt = { ...input, id, verdict: receiptVerdict(input.kind, input.exit_code, input.counts, input.mode) };
|
|
72
|
+
file.items.push(receipt);
|
|
73
|
+
file.next_id += 1;
|
|
74
|
+
await writeReceipts(file);
|
|
75
|
+
return receipt;
|
|
76
|
+
}
|
|
77
|
+
/** Count the OK receipts per kind (a not_ok receipt is evidence of the
|
|
78
|
+
* opposite, it never counts towards a step). */
|
|
79
|
+
/** A red that tells behaviour apart (D-037): tests failed, or a mutant was
|
|
80
|
+
* planted. A red whose only signal is "the file does not load at the base"
|
|
81
|
+
* (the module did not exist yet) is a weak red: valid, but not enough to
|
|
82
|
+
* ship on its own. */
|
|
83
|
+
export function isStrongRed(r) {
|
|
84
|
+
return r.kind === 'red_proof' && r.verdict === 'ok' && ((r.counts.failed ?? 0) > 0 || r.mode === 'mutation');
|
|
85
|
+
}
|
|
86
|
+
export function summarizeReceipts(items, filter = {}) {
|
|
87
|
+
const sel = items.filter((r) => r.verdict === 'ok' && (!filter.pending_id || r.pending_id === filter.pending_id));
|
|
88
|
+
const count = (k) => sel.filter((r) => r.kind === k).length;
|
|
89
|
+
const strong = sel.filter(isStrongRed).length;
|
|
90
|
+
const last = sel.reduce((m, r) => Math.max(m, r.started_at), 0);
|
|
91
|
+
return {
|
|
92
|
+
red_proofs: count('red_proof'), strong_red_proofs: strong, greens: count('green'), regressions: count('regression'),
|
|
93
|
+
e2e: count('e2e'), quality: count('quality'), mutation: count('mutation'),
|
|
94
|
+
...(last ? { last_at: last } : {}),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** Parse pass/fail counts out of common test runner output (vitest, jest,
|
|
98
|
+
* mocha, pytest, go test, playwright, junit-ish). Best effort; returns
|
|
99
|
+
* what it recognised. */
|
|
100
|
+
export function parseCounts(raw) {
|
|
101
|
+
/* Runners colour their summary even with FORCE_COLOR=0 (vitest does):
|
|
102
|
+
* strip the escape codes or "Test Files 1 failed" is not matched. */
|
|
103
|
+
const output = raw.replace(/\u001b\[[0-9;]*[A-Za-z]/g, '');
|
|
104
|
+
const c = {};
|
|
105
|
+
const take = (re) => { const m = re.exec(output); return m && m[1] ? Number(m[1]) : undefined; };
|
|
106
|
+
/* vitest / jest: "Tests 2 failed | 17 passed (19)" / "Tests: 1 failed, 3 passed, 4 total" */
|
|
107
|
+
/* The "Tests" summary line wins over the "Test Files" line: the counts
|
|
108
|
+
* are tests, not files (vitest prints both; files come first). */
|
|
109
|
+
const testsLine = /^\s*Tests\s*:?\s+([^\n]*)$/im.exec(output)?.[1] ?? '';
|
|
110
|
+
const inLine = (re) => { const m = re.exec(testsLine); return m && m[1] ? Number(m[1]) : undefined; };
|
|
111
|
+
const vf = inLine(/(\d+)\s+failed/i) ?? take(/Tests\s*:?\s+(\d+)\s+failed/i);
|
|
112
|
+
if (vf != null)
|
|
113
|
+
c.failed = vf;
|
|
114
|
+
/* vitest "Test Files 1 failed (1)" / jest "Test Suites: 1 failed, 2 total" */
|
|
115
|
+
const ff = take(/Test (?:Files|Suites)\s*:?\s+(\d+)\s+failed/i);
|
|
116
|
+
if (ff != null)
|
|
117
|
+
c.failed_files = ff;
|
|
118
|
+
const vp = inLine(/(\d+)\s+passed/i) ?? take(/(\d+)\s+passed/i);
|
|
119
|
+
if (vp != null)
|
|
120
|
+
c.passed = vp;
|
|
121
|
+
const vs = inLine(/(\d+)\s+skipped/i) ?? take(/(\d+)\s+skipped/i);
|
|
122
|
+
if (vs != null)
|
|
123
|
+
c.skipped = vs;
|
|
124
|
+
const vt = inLine(/\((\d+)\)/) ?? take(/Tests\s*:?[^\n]*\((\d+)\)/) ?? take(/(\d+)\s+total/i);
|
|
125
|
+
if (vt != null)
|
|
126
|
+
c.total = vt;
|
|
127
|
+
/* mocha: "12 passing" "2 failing" */
|
|
128
|
+
const mp = take(/(\d+)\s+passing/i);
|
|
129
|
+
if (mp != null && c.passed == null)
|
|
130
|
+
c.passed = mp;
|
|
131
|
+
const mf = take(/(\d+)\s+failing/i);
|
|
132
|
+
if (mf != null && c.failed == null)
|
|
133
|
+
c.failed = mf;
|
|
134
|
+
/* pytest: "3 failed, 10 passed in 1.2s" / "10 passed in" */
|
|
135
|
+
const pf = take(/(\d+)\s+failed,?\s+\d+\s+passed/i);
|
|
136
|
+
if (pf != null && c.failed == null)
|
|
137
|
+
c.failed = pf;
|
|
138
|
+
/* go test: "FAIL" lines count, "ok" */
|
|
139
|
+
if (c.failed == null && /^FAIL\b/m.test(output))
|
|
140
|
+
c.failed = (output.match(/^--- FAIL/gm) ?? []).length || 1;
|
|
141
|
+
/* mutation (stryker / mutmut): "killed 22" "survived 3" */
|
|
142
|
+
const mk = take(/killed[^\d]{0,5}(\d+)/i);
|
|
143
|
+
if (mk != null)
|
|
144
|
+
c.killed = mk;
|
|
145
|
+
const ms = take(/survived[^\d]{0,5}(\d+)/i);
|
|
146
|
+
if (ms != null)
|
|
147
|
+
c.survived = ms;
|
|
148
|
+
if (c.failed == null && c.passed != null)
|
|
149
|
+
c.failed = 0;
|
|
150
|
+
return c;
|
|
151
|
+
}
|
|
152
|
+
/** Render a receipt the way the method wants it pasted: one block the
|
|
153
|
+
* owner can rerun. */
|
|
154
|
+
export function renderReceipt(r) {
|
|
155
|
+
const cnt = [
|
|
156
|
+
r.counts.failed != null ? r.counts.failed + ' failed' : '',
|
|
157
|
+
r.counts.failed_files != null ? r.counts.failed_files + ' files failed' : '',
|
|
158
|
+
r.counts.passed != null ? r.counts.passed + ' passed' : '',
|
|
159
|
+
r.counts.killed != null ? r.counts.killed + ' killed' : '',
|
|
160
|
+
r.counts.survived != null ? r.counts.survived + ' survived' : '',
|
|
161
|
+
].filter(Boolean).join(', ');
|
|
162
|
+
return [
|
|
163
|
+
r.id + ' ' + r.kind + (r.pending_id ? ' for ' + r.pending_id : '') + ' -- ' + r.verdict.toUpperCase(),
|
|
164
|
+
' command : ' + r.command,
|
|
165
|
+
' ref : ' + r.ref + (r.base_ref ? ' (base ' + r.base_ref + ')' : '') + (r.dirty ? ' [dirty tree]' : ''),
|
|
166
|
+
...(r.mode === 'mutation' ? [' mode : mutation -- a defect planted in the new code (diff on record, ' + (r.mutation_diff ?? '').split('\n').length + ' lines)'] : []),
|
|
167
|
+
' exit : ' + r.exit_code + (cnt ? ' counts: ' + cnt : ''),
|
|
168
|
+
' when : ' + new Date(r.started_at).toISOString() + ' (' + r.duration_ms + ' ms)',
|
|
169
|
+
].join('\n');
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=receipts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipts.js","sourceRoot":"","sources":["../../src/urazuke/receipts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE HONEST REPORT (Urazuke step 12) -- built by Forge at close time.
|
|
3
|
+
*
|
|
4
|
+
* Three lists, the method's own words: VERIFIED (there is a receipt),
|
|
5
|
+
* BELIEVED (someone declared it and no receipt backs it) and BLIND SPOT
|
|
6
|
+
* (what nobody checked: a flow without e2e, no regression run, a receipt
|
|
7
|
+
* taken on a dirty tree). The brain writes the functional description; the
|
|
8
|
+
* verdict on what is verified comes from the receipts registry, not from
|
|
9
|
+
* the prose. Stored on the item (implementation.report) and shown in the
|
|
10
|
+
* close result, so the owner reads the three lists, never the code.
|
|
11
|
+
*
|
|
12
|
+
* ASCII-only.
|
|
13
|
+
*/
|
|
14
|
+
import type { PendingItem, PendingReport } from '../pending/types.js';
|
|
15
|
+
export interface ReportInput {
|
|
16
|
+
tests_status?: 'green' | 'red' | 'partial' | 'none';
|
|
17
|
+
tests_summary?: string;
|
|
18
|
+
use_cases?: string[];
|
|
19
|
+
functional?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function buildHonestReport(slug: string, item: PendingItem, input: ReportInput): Promise<PendingReport>;
|
|
22
|
+
export declare function renderHonestReport(r: PendingReport): string;
|
|
23
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/urazuke/report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AActE,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;IACpD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAwCnH;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAG3D"}
|