@nac3/forge-cli 1.18.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/yf.d.ts.map +1 -1
- package/dist/bin/yf.js +4 -0
- package/dist/bin/yf.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 +108 -2
- 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/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/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,62 @@
|
|
|
1
|
+
import { readReceipts } from './receipts.js';
|
|
2
|
+
function line(r) {
|
|
3
|
+
const cnt = r.counts.failed != null || r.counts.passed != null
|
|
4
|
+
? ' (' + (r.counts.failed ?? 0) + ' failed, ' + (r.counts.passed ?? 0) + ' passed)'
|
|
5
|
+
: '';
|
|
6
|
+
const redKind = r.kind !== 'red_proof' ? ''
|
|
7
|
+
: r.mode === 'mutation' ? ' [mutation red: defect planted, diff on record]'
|
|
8
|
+
: (r.counts.failed ?? 0) > 0 ? ' [behavioural red]'
|
|
9
|
+
: ' [load-failure red only: the module did not exist at the base]';
|
|
10
|
+
return r.id + ' ' + r.kind + ': `' + r.command + '` exit ' + r.exit_code + cnt + ' @' + r.ref + (r.base_ref ? ' vs base ' + r.base_ref : '') + redKind;
|
|
11
|
+
}
|
|
12
|
+
export async function buildHonestReport(slug, item, input) {
|
|
13
|
+
const all = (await readReceipts(slug)).items.filter((r) => r.pending_id === item.id);
|
|
14
|
+
const ok = all.filter((r) => r.verdict === 'ok');
|
|
15
|
+
const bad = all.filter((r) => r.verdict !== 'ok');
|
|
16
|
+
const has = (k) => ok.some((r) => r.kind === k);
|
|
17
|
+
const verified = ok.map(line);
|
|
18
|
+
const believed = [];
|
|
19
|
+
const blind = [];
|
|
20
|
+
/* Declared test status without a green receipt is a belief. */
|
|
21
|
+
if (input.tests_status === 'green' && !has('green') && !has('regression')) {
|
|
22
|
+
believed.push('tests declared green (' + (input.tests_summary || 'no summary') + ') -- no green/regression receipt');
|
|
23
|
+
}
|
|
24
|
+
else if (input.tests_status && input.tests_status !== 'green') {
|
|
25
|
+
believed.push('tests declared ' + input.tests_status + (input.tests_summary ? ': ' + input.tests_summary : ''));
|
|
26
|
+
}
|
|
27
|
+
/* The functional claim and the use cases are the brain's word unless an
|
|
28
|
+
* e2e receipt exists for this item. */
|
|
29
|
+
const cases = (input.use_cases ?? item.implementation?.use_cases ?? []).map((c) => String(c).trim()).filter(Boolean);
|
|
30
|
+
if (cases.length && !has('e2e')) {
|
|
31
|
+
for (const c of cases)
|
|
32
|
+
believed.push('use case "' + c + '" -- declared, no e2e receipt');
|
|
33
|
+
}
|
|
34
|
+
if ((input.functional ?? item.implementation?.functional) && !has('e2e') && !has('green')) {
|
|
35
|
+
believed.push('functional description -- no receipt of any kind backs it');
|
|
36
|
+
}
|
|
37
|
+
if (!has('red_proof'))
|
|
38
|
+
blind.push('no red proof: the new test was never shown failing against the base');
|
|
39
|
+
if (!has('regression'))
|
|
40
|
+
blind.push('no regression receipt: the neighbouring suite was not re-run');
|
|
41
|
+
const flows = item.spec?.flows ?? [];
|
|
42
|
+
if (flows.length && !has('e2e')) {
|
|
43
|
+
for (const f of flows)
|
|
44
|
+
blind.push('flow "' + f + '" has no end-to-end receipt (screen to backend)');
|
|
45
|
+
}
|
|
46
|
+
else if (!flows.length && !has('e2e')) {
|
|
47
|
+
blind.push('no end-to-end receipt and no flows declared in the spec: unknown whether a screen is affected');
|
|
48
|
+
}
|
|
49
|
+
const dirty = ok.filter((r) => r.dirty && r.kind !== 'red_proof');
|
|
50
|
+
if (dirty.length)
|
|
51
|
+
blind.push(dirty.length + ' receipt(s) taken on a dirty tree: ' + dirty.map((r) => r.id).join(', ') + ' -- the committed version was not what ran');
|
|
52
|
+
if (bad.length)
|
|
53
|
+
blind.push(bad.length + ' receipt(s) with a NOT OK verdict are on record: ' + bad.map((r) => r.id).join(', '));
|
|
54
|
+
if (!item.spec)
|
|
55
|
+
blind.push('the item has no spec (acceptance + how_verified): nothing to verify against');
|
|
56
|
+
return { verified, believed, blind_spots: blind, receipts: all.map((r) => r.id), built_at: Date.now() };
|
|
57
|
+
}
|
|
58
|
+
export function renderHonestReport(r) {
|
|
59
|
+
const sec = (title, xs) => title + ' (' + xs.length + ')' + (xs.length ? '\n' + xs.map((x) => ' - ' + x).join('\n') : ' -- none');
|
|
60
|
+
return [sec('VERIFIED', r.verified), sec('BELIEVED', r.believed), sec('BLIND SPOTS', r.blind_spots)].join('\n');
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/urazuke/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface RetroNumbers {
|
|
2
|
+
since: string;
|
|
3
|
+
until: string;
|
|
4
|
+
pendings: {
|
|
5
|
+
opened: number;
|
|
6
|
+
closed: number;
|
|
7
|
+
shipped: number;
|
|
8
|
+
shipped_with_report: number;
|
|
9
|
+
bugs_closed: number;
|
|
10
|
+
open_now: number;
|
|
11
|
+
open_with_spec: number;
|
|
12
|
+
open_without_spec: number;
|
|
13
|
+
};
|
|
14
|
+
receipts: {
|
|
15
|
+
red_proofs: number;
|
|
16
|
+
greens: number;
|
|
17
|
+
regressions: number;
|
|
18
|
+
e2e: number;
|
|
19
|
+
quality: number;
|
|
20
|
+
mutation: number;
|
|
21
|
+
not_ok: number;
|
|
22
|
+
total: number;
|
|
23
|
+
};
|
|
24
|
+
overrides: number;
|
|
25
|
+
ladder: {
|
|
26
|
+
closed: number;
|
|
27
|
+
green: number;
|
|
28
|
+
red: number;
|
|
29
|
+
owner: number;
|
|
30
|
+
total: number;
|
|
31
|
+
kind?: string;
|
|
32
|
+
};
|
|
33
|
+
audits_on_disk: number;
|
|
34
|
+
retros_on_disk: number;
|
|
35
|
+
}
|
|
36
|
+
export declare function buildRetroNumbers(slug: string, projectRoot: string, opts?: {
|
|
37
|
+
since_days?: number;
|
|
38
|
+
now?: number;
|
|
39
|
+
}): Promise<RetroNumbers>;
|
|
40
|
+
export declare function renderRetro(n: RetroNumbers, prompt: string): string;
|
|
41
|
+
/** Write docs/RETROSPECTIVE_<date>.md and return its path. */
|
|
42
|
+
export declare function writeRetrospective(slug: string, projectRoot: string, opts?: {
|
|
43
|
+
since_days?: number;
|
|
44
|
+
now?: number;
|
|
45
|
+
}): Promise<{
|
|
46
|
+
file: string;
|
|
47
|
+
numbers: RetroNumbers;
|
|
48
|
+
}>;
|
|
49
|
+
/** The step-13 audit prompt with the project's pointers, for ANOTHER
|
|
50
|
+
* session (never the one that built the code). */
|
|
51
|
+
export declare function buildAuditTask(projectRoot: string): Promise<string>;
|
|
52
|
+
//# sourceMappingURL=retro.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retro.d.ts","sourceRoot":"","sources":["../../src/urazuke/retro.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC;IACrL,QAAQ,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACrJ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpG,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAkDlJ;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA+CnE;AAED,8DAA8D;AAC9D,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,CAS9K;AAED;mDACmD;AACnD,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAazE"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RETROSPECTIVE WITH NUMBERS (Urazuke step 23) + the AUDIT prompt (step 13).
|
|
3
|
+
*
|
|
4
|
+
* The retrospective the method asks for ends in a proposal to change the
|
|
5
|
+
* method, backed by numbers, not impressions. Forge computes the numbers
|
|
6
|
+
* from its registries (pendings, receipts, overrides, the ladder, the
|
|
7
|
+
* audits on disk) and writes docs/RETROSPECTIVE_<date>.md with them and
|
|
8
|
+
* with the sections the owner + brain fill (the narrative and the proposal).
|
|
9
|
+
*
|
|
10
|
+
* The audit (step 13) is done by ANOTHER session: this module only prepares
|
|
11
|
+
* the prompt with the project's pointers; the CLI prints it or spawns a
|
|
12
|
+
* headless `yf chat --agent` with it.
|
|
13
|
+
*
|
|
14
|
+
* ASCII-only.
|
|
15
|
+
*/
|
|
16
|
+
import fs from 'node:fs/promises';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
export async function buildRetroNumbers(slug, projectRoot, opts = {}) {
|
|
19
|
+
const now = opts.now ?? Date.now();
|
|
20
|
+
const sinceMs = now - (opts.since_days ?? 90) * 24 * 3600 * 1000;
|
|
21
|
+
const { listPending } = await import('../pending/store.js');
|
|
22
|
+
const { readReceipts } = await import('./receipts.js');
|
|
23
|
+
const { urazukeLadder } = await import('./current.js');
|
|
24
|
+
const { hasSpec } = await import('./probes.js');
|
|
25
|
+
const all = await listPending(slug, { status: 'all' });
|
|
26
|
+
const plan = all.filter((p) => !p.workflow || p.workflow.ad_hoc);
|
|
27
|
+
const inWindow = (t) => t != null && t >= sinceMs && t <= now;
|
|
28
|
+
const opened = plan.filter((p) => inWindow(p.created_at));
|
|
29
|
+
const closed = plan.filter((p) => inWindow(p.closed_at));
|
|
30
|
+
const shipped = closed.filter((p) => p.closed_reason === 'shipped');
|
|
31
|
+
const atMs = (at) => {
|
|
32
|
+
if (typeof at === 'number')
|
|
33
|
+
return at;
|
|
34
|
+
if (typeof at === 'string') {
|
|
35
|
+
const t = Date.parse(at);
|
|
36
|
+
return Number.isFinite(t) ? t : undefined;
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
};
|
|
40
|
+
const overrides = all.reduce((n, p) => n + (p.history ?? []).filter((h) => /OVERRIDE/.test(h.note) && inWindow(atMs(h.at))).length, 0);
|
|
41
|
+
const openNow = plan.filter((p) => p.closed_at === undefined);
|
|
42
|
+
const rc = (await readReceipts(slug)).items.filter((r) => inWindow(r.started_at));
|
|
43
|
+
const count = (k) => rc.filter((r) => r.kind === k && r.verdict === 'ok').length;
|
|
44
|
+
const ladder = await urazukeLadder(slug, projectRoot);
|
|
45
|
+
const l = { closed: 0, green: 0, red: 0, owner: 0, total: ladder.rows.length, ...(ladder.kind ? { kind: ladder.kind } : {}) };
|
|
46
|
+
for (const r of ladder.rows)
|
|
47
|
+
l[r.status] += 1;
|
|
48
|
+
const docs = await fs.readdir(path.join(projectRoot, 'docs')).catch(() => []);
|
|
49
|
+
return {
|
|
50
|
+
since: new Date(sinceMs).toISOString().slice(0, 10),
|
|
51
|
+
until: new Date(now).toISOString().slice(0, 10),
|
|
52
|
+
pendings: {
|
|
53
|
+
opened: opened.length, closed: closed.length, shipped: shipped.length,
|
|
54
|
+
shipped_with_report: shipped.filter((p) => !!p.implementation?.report).length,
|
|
55
|
+
bugs_closed: closed.filter((p) => p.category === 'bug').length,
|
|
56
|
+
open_now: openNow.length,
|
|
57
|
+
open_with_spec: openNow.filter((p) => hasSpec(p.spec)).length,
|
|
58
|
+
open_without_spec: openNow.filter((p) => !hasSpec(p.spec)).length,
|
|
59
|
+
},
|
|
60
|
+
receipts: {
|
|
61
|
+
red_proofs: count('red_proof'), greens: count('green'), regressions: count('regression'), e2e: count('e2e'),
|
|
62
|
+
quality: count('quality'), mutation: count('mutation'), not_ok: rc.filter((r) => r.verdict !== 'ok').length, total: rc.length,
|
|
63
|
+
},
|
|
64
|
+
overrides,
|
|
65
|
+
ladder: l,
|
|
66
|
+
audits_on_disk: docs.filter((n) => /^AUDIT_.*\.md$/i.test(n)).length,
|
|
67
|
+
retros_on_disk: docs.filter((n) => /^RETROSPECTIVE_.*\.md$/i.test(n)).length,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export function renderRetro(n, prompt) {
|
|
71
|
+
const row = (k, v) => '| ' + k + ' | ' + v + ' |';
|
|
72
|
+
return [
|
|
73
|
+
'# Retrospectiva ' + n.until + ' (ventana ' + n.since + ' .. ' + n.until + ')',
|
|
74
|
+
'',
|
|
75
|
+
'Los numeros los calculo Forge desde sus registros (pendientes, recibos de evidencia,',
|
|
76
|
+
'overrides de compuertas, la escalera, los documentos en disco). Las secciones 2 y 3 las',
|
|
77
|
+
'escriben el dueno y el agente; la 3 tiene que terminar en una propuesta concreta de cambio',
|
|
78
|
+
'al metodo, con el incidente que la justifica.',
|
|
79
|
+
'',
|
|
80
|
+
'## 1. Los numeros',
|
|
81
|
+
'',
|
|
82
|
+
'| Medida | Valor |',
|
|
83
|
+
'|---|---|',
|
|
84
|
+
row('Pendientes del plan abiertos en la ventana', n.pendings.opened),
|
|
85
|
+
row('Pendientes del plan cerrados en la ventana', n.pendings.closed),
|
|
86
|
+
row('Cerrados con shipped', n.pendings.shipped),
|
|
87
|
+
row('Cerrados con shipped CON reporte honesto', n.pendings.shipped_with_report),
|
|
88
|
+
row('Bugs cerrados', n.pendings.bugs_closed),
|
|
89
|
+
row('Abiertos hoy', n.pendings.open_now),
|
|
90
|
+
row('Abiertos hoy con especificacion', n.pendings.open_with_spec),
|
|
91
|
+
row('Abiertos hoy SIN especificacion', n.pendings.open_without_spec),
|
|
92
|
+
row('Recibos: rojo probado', n.receipts.red_proofs),
|
|
93
|
+
row('Recibos: verde', n.receipts.greens),
|
|
94
|
+
row('Recibos: regresion', n.receipts.regressions),
|
|
95
|
+
row('Recibos: punta a punta', n.receipts.e2e),
|
|
96
|
+
row('Recibos: calidad', n.receipts.quality),
|
|
97
|
+
row('Recibos: mutacion', n.receipts.mutation),
|
|
98
|
+
row('Recibos con veredicto NOT OK', n.receipts.not_ok),
|
|
99
|
+
row('Overrides de compuertas (con razon escrita)', n.overrides),
|
|
100
|
+
row('Escalera: peldanos cerrados / verdes / rojos / a cargo del dueno', n.ladder.closed + ' / ' + n.ladder.green + ' / ' + n.ladder.red + ' / ' + n.ladder.owner + ' de ' + n.ladder.total),
|
|
101
|
+
row('Auditorias en docs/', n.audits_on_disk),
|
|
102
|
+
row('Retrospectivas previas en docs/', n.retros_on_disk),
|
|
103
|
+
'',
|
|
104
|
+
'## 2. Que paso (lo escribe el dueno con el agente)',
|
|
105
|
+
'',
|
|
106
|
+
'_Pendiente: que salio bien, que salio mal, con el pendiente o el recibo que lo muestra._',
|
|
107
|
+
'',
|
|
108
|
+
'## 3. Propuesta de cambio al metodo',
|
|
109
|
+
'',
|
|
110
|
+
'_Pendiente: una propuesta concreta, con el incidente que la justifica. Si no hay, decirlo._',
|
|
111
|
+
'',
|
|
112
|
+
'## Prompt del peldano 23 (para la parte narrativa)',
|
|
113
|
+
'',
|
|
114
|
+
'> ' + prompt,
|
|
115
|
+
'',
|
|
116
|
+
].join('\n');
|
|
117
|
+
}
|
|
118
|
+
/** Write docs/RETROSPECTIVE_<date>.md and return its path. */
|
|
119
|
+
export async function writeRetrospective(slug, projectRoot, opts = {}) {
|
|
120
|
+
const numbers = await buildRetroNumbers(slug, projectRoot, opts);
|
|
121
|
+
const { URAZUKE_PROMPTS } = await import('./prompts.generated.js');
|
|
122
|
+
const prompts = URAZUKE_PROMPTS['peldano-23'] ?? [];
|
|
123
|
+
const prompt = prompts[prompts.length - 1] ?? '';
|
|
124
|
+
const file = path.join(projectRoot, 'docs', 'RETROSPECTIVE_' + numbers.until + '.md');
|
|
125
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
126
|
+
await fs.writeFile(file, renderRetro(numbers, prompt), 'utf8');
|
|
127
|
+
return { file, numbers };
|
|
128
|
+
}
|
|
129
|
+
/** The step-13 audit prompt with the project's pointers, for ANOTHER
|
|
130
|
+
* session (never the one that built the code). */
|
|
131
|
+
export async function buildAuditTask(projectRoot) {
|
|
132
|
+
const { URAZUKE_PROMPTS } = await import('./prompts.generated.js');
|
|
133
|
+
const prompts = URAZUKE_PROMPTS['peldano-13'] ?? [];
|
|
134
|
+
const base = prompts[0] ?? 'Audit this project for integrity, security, performance, code quality and documentation.';
|
|
135
|
+
const docs = await fs.readdir(path.join(projectRoot, 'docs')).catch(() => []);
|
|
136
|
+
const pointers = ['PROJECT.md', 'docs/SEMANTIC_TREE.md', 'docs/STATUS.md', 'docs/GATES.md', 'docs/LOCKS.md', 'docs/PRODUCER_CONSUMER_MAP.md']
|
|
137
|
+
.filter((p) => p === 'PROJECT.md' || docs.includes(path.basename(p)));
|
|
138
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
139
|
+
return base
|
|
140
|
+
+ ' Context: this is an independent audit session; you did not build this code. Start from '
|
|
141
|
+
+ pointers.join(', ') + '. Re-run a sample of the evidence receipts (yujin.evidence.list, then the exact commands) and report any receipt you could not reproduce.'
|
|
142
|
+
+ ' Write the findings to docs/AUDIT_' + date + '.md with a severity per finding (P0, P1, P2) and open one pending item per P0 and P1.'
|
|
143
|
+
+ ' Start the report with one line "Auditor: <this session and model>" so the owner can see the audit was not done by the session that built the code (D-040).';
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=retro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retro.js","sourceRoot":"","sources":["../../src/urazuke/retro.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URAZUKE prompt section -- the pure renderer.
|
|
3
|
+
*
|
|
4
|
+
* This is the mechanism Pablo pointed at: Forge injects the prompt of the
|
|
5
|
+
* step the project is on INTO the brain's system prompt, every turn, with
|
|
6
|
+
* the mechanical state of that step next to it. The brain does not have to
|
|
7
|
+
* remember the method, look it up or be reminded; the exact text the method
|
|
8
|
+
* publishes arrives as the active instruction, and the red checks arrive
|
|
9
|
+
* with it so the brain knows what is missing BEFORE it claims the step done.
|
|
10
|
+
*
|
|
11
|
+
* Own section, never truncated below its header (same reason as the sizing
|
|
12
|
+
* section: a gate that can be truncated away is not a gate). The prompt
|
|
13
|
+
* itself is the longest part and is kept whole; what gets cut first is the
|
|
14
|
+
* owner checklist.
|
|
15
|
+
*
|
|
16
|
+
* ASCII-only.
|
|
17
|
+
*/
|
|
18
|
+
import type { UrazukeStep, UrazukeStation } from './catalog.js';
|
|
19
|
+
import type { UrazukeStepResult } from './gate.js';
|
|
20
|
+
export interface UrazukeSectionInput {
|
|
21
|
+
/** Workflow code + the task id of the current step. */
|
|
22
|
+
code: string;
|
|
23
|
+
task_id: string;
|
|
24
|
+
kind: 'urazuke' | 'urazuke-legacy';
|
|
25
|
+
step?: UrazukeStep;
|
|
26
|
+
station?: UrazukeStation;
|
|
27
|
+
/** The prompts of this step/station, English, in order. */
|
|
28
|
+
prompts: readonly string[];
|
|
29
|
+
result: UrazukeStepResult;
|
|
30
|
+
/** How many canonical tasks remain open (including this one). */
|
|
31
|
+
remaining: number;
|
|
32
|
+
total: number;
|
|
33
|
+
char_budget?: number;
|
|
34
|
+
}
|
|
35
|
+
export declare function renderUrazukeSection(input: UrazukeSectionInput): string;
|
|
36
|
+
/** One line per task for the status verb / CLI. */
|
|
37
|
+
export declare function renderLadderStatusLines(rows: Array<{
|
|
38
|
+
num: string;
|
|
39
|
+
title: string;
|
|
40
|
+
status: 'green' | 'red' | 'owner' | 'closed';
|
|
41
|
+
task_id?: string;
|
|
42
|
+
}>): string[];
|
|
43
|
+
//# sourceMappingURL=section.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section.d.ts","sourceRoot":"","sources":["../../src/urazuke/section.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAgB,MAAM,WAAW,CAAC;AAEjE,MAAM,WAAW,mBAAmB;IAClC,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,GAAG,gBAAgB,CAAC;IACnC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,2DAA2D;IAC3D,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAqDvE;AAED,mDAAmD;AACnD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,EAAE,CAK7J"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
function mark(c) {
|
|
2
|
+
return c.status === 'ok' ? '[x]' : c.status === 'fail' ? '[ ]' : '[~]';
|
|
3
|
+
}
|
|
4
|
+
export function renderUrazukeSection(input) {
|
|
5
|
+
const r = input.result;
|
|
6
|
+
const isStation = !!input.station;
|
|
7
|
+
const label = isStation
|
|
8
|
+
? 'estacion N' + input.station.num + ' (normalizacion del legado)'
|
|
9
|
+
: 'peldano ' + String(input.step.num).padStart(2, '0') + ' de 24';
|
|
10
|
+
const header = '=================================================================\n' +
|
|
11
|
+
'URAZUKE -- ' + label + ': ' + r.title + '\n' +
|
|
12
|
+
'(' + input.code + ', tarea ' + input.task_id + ', ' + input.remaining + ' de ' + input.total + ' tareas abiertas) -- doctrine: urazuke\n' +
|
|
13
|
+
'=================================================================';
|
|
14
|
+
const lines = [];
|
|
15
|
+
const state = r.status === 'green' ? 'VERDE' : r.status === 'red' ? 'ROJO' : 'A CARGO DEL DUENO';
|
|
16
|
+
lines.push('estado mecanico: ' + state + (r.status === 'green'
|
|
17
|
+
? ' -- the artifacts exist; close ' + input.task_id + ' with yujin.pending.close (expediente + evidence) and move on.'
|
|
18
|
+
: r.status === 'red'
|
|
19
|
+
? ' -- it does NOT close until every check below is [x]. Do not claim it done.'
|
|
20
|
+
: ' -- nothing mechanical to check; the owner verifies with the checklist.'));
|
|
21
|
+
if (r.inputs.length) {
|
|
22
|
+
lines.push('antes de enviar (lo que el DUENO tiene que tener hecho; si falta, pedilo, no lo inventes):');
|
|
23
|
+
for (const c of r.inputs)
|
|
24
|
+
lines.push(' ' + mark(c) + ' ' + c.label + (c.status === 'fail' ? ' -- ' + c.detail : ''));
|
|
25
|
+
}
|
|
26
|
+
if (r.checks.length) {
|
|
27
|
+
lines.push('lo que este peldano deja (lo verifica Forge, no tu palabra):');
|
|
28
|
+
for (const c of r.checks)
|
|
29
|
+
lines.push(' ' + mark(c) + ' ' + c.label + (c.status === 'fail' ? ' -- ' + c.detail : ''));
|
|
30
|
+
}
|
|
31
|
+
const promptBlock = [];
|
|
32
|
+
promptBlock.push('PROMPT DEL PELDANO (the owner\'s instruction for this step; act on it as if the owner had pasted it):');
|
|
33
|
+
input.prompts.forEach((p, i) => {
|
|
34
|
+
promptBlock.push((input.prompts.length > 1 ? '[' + (i + 1) + '/' + input.prompts.length + '] ' : '') + p);
|
|
35
|
+
});
|
|
36
|
+
const verify = (input.step?.verify ?? input.station?.verify ?? []);
|
|
37
|
+
const verifyBlock = [];
|
|
38
|
+
if (verify.length) {
|
|
39
|
+
verifyBlock.push('verificacion del dueno (sin leer codigo):');
|
|
40
|
+
for (const v of verify)
|
|
41
|
+
verifyBlock.push(' - ' + v);
|
|
42
|
+
}
|
|
43
|
+
const budget = input.char_budget ?? 6000;
|
|
44
|
+
const fixed = '\n\n' + header + '\n' + lines.join('\n') + '\n' + promptBlock.join('\n');
|
|
45
|
+
if (fixed.length + verifyBlock.join('\n').length + 1 <= budget) {
|
|
46
|
+
return fixed + (verifyBlock.length ? '\n' + verifyBlock.join('\n') : '');
|
|
47
|
+
}
|
|
48
|
+
if (fixed.length <= budget)
|
|
49
|
+
return fixed;
|
|
50
|
+
/* Over budget even without the checklist: keep header + state + prompt,
|
|
51
|
+
* drop the artifact detail lines first. */
|
|
52
|
+
const minimal = '\n\n' + header + '\n' + lines[0] + '\n' + promptBlock.join('\n');
|
|
53
|
+
if (minimal.length <= budget)
|
|
54
|
+
return minimal;
|
|
55
|
+
return minimal.slice(0, Math.max(header.length + 40, budget - 20)) + '\n ... (yujin.urazuke.step)';
|
|
56
|
+
}
|
|
57
|
+
/** One line per task for the status verb / CLI. */
|
|
58
|
+
export function renderLadderStatusLines(rows) {
|
|
59
|
+
return rows.map((r) => {
|
|
60
|
+
const m = r.status === 'closed' ? '[x]' : r.status === 'green' ? '[v]' : r.status === 'red' ? '[ ]' : '[~]';
|
|
61
|
+
return m + ' ' + r.num + ' ' + r.title + (r.task_id ? ' (' + r.task_id + ')' : '');
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=section.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section.js","sourceRoot":"","sources":["../../src/urazuke/section.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export type StackId = 'node' | 'python' | 'go' | 'dotnet' | 'java' | 'php' | 'unknown';
|
|
2
|
+
export interface StackAdapter {
|
|
3
|
+
id: StackId;
|
|
4
|
+
label: string;
|
|
5
|
+
/** Globs (basename suffixes) of source files the native meters scan. */
|
|
6
|
+
source_exts: string[];
|
|
7
|
+
/** Directories never scanned. */
|
|
8
|
+
ignore_dirs: string[];
|
|
9
|
+
/** The command that runs the whole test battery. */
|
|
10
|
+
test_command: string;
|
|
11
|
+
/** Lint + format check commands (empty when the stack has none installed). */
|
|
12
|
+
lint_commands: string[];
|
|
13
|
+
/** Where the coverage summary lands after `coverage_command`, and how to
|
|
14
|
+
* read the line percentage from it. */
|
|
15
|
+
coverage_command?: string;
|
|
16
|
+
coverage_file?: string;
|
|
17
|
+
coverage_reader?: 'istanbul-summary' | 'coverage-py-json' | 'go-cover' | 'cobertura-xml';
|
|
18
|
+
/** Mutation testing tool. */
|
|
19
|
+
mutation_tool?: string;
|
|
20
|
+
mutation_command?: string;
|
|
21
|
+
mutation_report?: string;
|
|
22
|
+
mutation_reader?: 'stryker-json' | 'mutmut-text' | 'go-mutesting-text';
|
|
23
|
+
/** Files Forge scaffolds with `yf urazuke quality init` (path -> body). */
|
|
24
|
+
scaffold: Record<string, string>;
|
|
25
|
+
/** Packages to add (hint for the agent; Forge does not install). */
|
|
26
|
+
dev_dependencies: string[];
|
|
27
|
+
}
|
|
28
|
+
/** Detect the stack. Node wins when package.json exists; python on
|
|
29
|
+
* pyproject/requirements; go on go.mod; dotnet on *.csproj/*.sln; java on
|
|
30
|
+
* pom.xml/build.gradle; php on composer.json. */
|
|
31
|
+
export declare function detectStack(root: string): Promise<StackAdapter>;
|
|
32
|
+
/** Line coverage percentage from the stack's report, if readable. */
|
|
33
|
+
export declare function readCoveragePct(root: string, a: StackAdapter): Promise<number | undefined>;
|
|
34
|
+
export interface MutationScore {
|
|
35
|
+
killed: number;
|
|
36
|
+
survived: number;
|
|
37
|
+
total: number;
|
|
38
|
+
score: number;
|
|
39
|
+
}
|
|
40
|
+
/** Mutation score from the tool's report (or its text output as fallback). */
|
|
41
|
+
export declare function readMutationScore(root: string, a: StackAdapter, output: string): Promise<MutationScore | undefined>;
|
|
42
|
+
//# sourceMappingURL=stacks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stacks.d.ts","sourceRoot":"","sources":["../../src/urazuke/stacks.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;AAEvF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iCAAiC;IACjC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB;4CACwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,kBAAkB,GAAG,kBAAkB,GAAG,UAAU,GAAG,eAAe,CAAC;IACzF,6BAA6B;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,cAAc,GAAG,aAAa,GAAG,mBAAmB,CAAC;IACvE,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,oEAAoE;IACpE,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAYD;;kDAEkD;AAClD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAcrE;AAgGD,qEAAqE;AACrE,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAwChG;AAiBD,MAAM,WAAW,aAAa;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAEjG,8EAA8E;AAC9E,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA8BzH"}
|