@dzhechkov/harness-core 0.8.46 → 0.8.48
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/.dz-manifest.json +200 -168
- package/README.md +130 -2
- package/dist/agentdb-index.d.ts.map +1 -1
- package/dist/agentdb-index.js +32 -2
- package/dist/agentdb-index.js.map +1 -1
- package/dist/agentdb-snapshot.d.ts +14 -1
- package/dist/agentdb-snapshot.d.ts.map +1 -1
- package/dist/agentdb-snapshot.js +100 -4
- package/dist/agentdb-snapshot.js.map +1 -1
- package/dist/apply-leg.d.ts +9 -1
- package/dist/apply-leg.d.ts.map +1 -1
- package/dist/apply-leg.js +26 -4
- package/dist/apply-leg.js.map +1 -1
- package/dist/architecture.d.ts +0 -5
- package/dist/architecture.d.ts.map +1 -1
- package/dist/architecture.js +25 -2
- package/dist/architecture.js.map +1 -1
- package/dist/codex-rollouts.d.ts +35 -7
- package/dist/codex-rollouts.d.ts.map +1 -1
- package/dist/codex-rollouts.js +201 -113
- package/dist/codex-rollouts.js.map +1 -1
- package/dist/cost-ledger.d.ts +42 -3
- package/dist/cost-ledger.d.ts.map +1 -1
- package/dist/cost-ledger.js +478 -15
- package/dist/cost-ledger.js.map +1 -1
- package/dist/feature-adr-routing.d.ts +16 -0
- package/dist/feature-adr-routing.d.ts.map +1 -1
- package/dist/feature-adr-routing.js +21 -0
- package/dist/feature-adr-routing.js.map +1 -1
- package/dist/guard.d.ts +7 -0
- package/dist/guard.d.ts.map +1 -1
- package/dist/guard.js +48 -0
- package/dist/guard.js.map +1 -1
- package/dist/index.d.ts +11 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/loop-plan.d.ts +4 -0
- package/dist/loop-plan.d.ts.map +1 -1
- package/dist/loop-plan.js +4 -0
- package/dist/loop-plan.js.map +1 -1
- package/dist/mutation-gate.d.ts +36 -1
- package/dist/mutation-gate.d.ts.map +1 -1
- package/dist/mutation-gate.js +109 -19
- package/dist/mutation-gate.js.map +1 -1
- package/dist/npm-homepage.d.ts +64 -0
- package/dist/npm-homepage.d.ts.map +1 -0
- package/dist/npm-homepage.js +109 -0
- package/dist/npm-homepage.js.map +1 -0
- package/dist/operations.d.ts +6 -0
- package/dist/operations.d.ts.map +1 -1
- package/dist/operations.js +150 -24
- package/dist/operations.js.map +1 -1
- package/dist/pack-inventory.d.ts.map +1 -1
- package/dist/pack-inventory.js +6 -1
- package/dist/pack-inventory.js.map +1 -1
- package/dist/parity.d.ts.map +1 -1
- package/dist/parity.js +4 -1
- package/dist/parity.js.map +1 -1
- package/dist/publish-sibling-drift.d.ts +43 -1
- package/dist/publish-sibling-drift.d.ts.map +1 -1
- package/dist/publish-sibling-drift.js +269 -13
- package/dist/publish-sibling-drift.js.map +1 -1
- package/dist/publish.d.ts +5 -1
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +18 -1
- package/dist/publish.js.map +1 -1
- package/dist/qe-bridge.d.ts +63 -1
- package/dist/qe-bridge.d.ts.map +1 -1
- package/dist/qe-bridge.js +82 -0
- package/dist/qe-bridge.js.map +1 -1
- package/dist/release-package-audit.d.ts +86 -0
- package/dist/release-package-audit.d.ts.map +1 -0
- package/dist/release-package-audit.js +272 -0
- package/dist/release-package-audit.js.map +1 -0
- package/dist/release.d.ts +8 -1
- package/dist/release.d.ts.map +1 -1
- package/dist/release.js +58 -32
- package/dist/release.js.map +1 -1
- package/dist/round.d.ts +10 -1
- package/dist/round.d.ts.map +1 -1
- package/dist/round.js +5 -1
- package/dist/round.js.map +1 -1
- package/dist/run-records.d.ts +11 -0
- package/dist/run-records.d.ts.map +1 -1
- package/dist/run-records.js +124 -20
- package/dist/run-records.js.map +1 -1
- package/dist/setup-memory-deps.d.ts +14 -0
- package/dist/setup-memory-deps.d.ts.map +1 -0
- package/dist/setup-memory-deps.js +210 -0
- package/dist/setup-memory-deps.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +379 -378
- package/dist/setup.js.map +1 -1
- package/dist/stage-usage.d.ts +248 -0
- package/dist/stage-usage.d.ts.map +1 -0
- package/dist/stage-usage.js +511 -0
- package/dist/stage-usage.js.map +1 -0
- package/dist/statusline.d.ts +23 -0
- package/dist/statusline.d.ts.map +1 -1
- package/dist/statusline.js +167 -1
- package/dist/statusline.js.map +1 -1
- package/dist/workflow-run-dispatch.d.ts +36 -19
- package/dist/workflow-run-dispatch.d.ts.map +1 -1
- package/dist/workflow-run-dispatch.js +255 -102
- package/dist/workflow-run-dispatch.js.map +1 -1
- package/dist/workflow-run.d.ts +19 -3
- package/dist/workflow-run.d.ts.map +1 -1
- package/dist/workflow-run.js +93 -2
- package/dist/workflow-run.js.map +1 -1
- package/package.json +3 -3
- package/sbom.json +303 -223
- package/src/agentdb-index.ts +31 -2
- package/src/agentdb-snapshot.ts +105 -4
- package/src/apply-leg.ts +26 -4
- package/src/architecture.ts +15 -2
- package/src/codex-rollouts.ts +155 -147
- package/src/cost-ledger.ts +308 -19
- package/src/feature-adr-routing.ts +22 -0
- package/src/guard.ts +52 -0
- package/src/index.ts +15 -3
- package/src/loop-plan.ts +8 -0
- package/src/mutation-gate.ts +153 -19
- package/src/npm-homepage.ts +142 -0
- package/src/operations.ts +177 -22
- package/src/pack-inventory.ts +6 -1
- package/src/parity.ts +4 -1
- package/src/publish-sibling-drift.ts +214 -11
- package/src/publish.ts +20 -1
- package/src/qe-bridge.ts +86 -1
- package/src/release-package-audit.ts +264 -0
- package/src/release.ts +55 -22
- package/src/round.ts +8 -0
- package/src/run-records.ts +101 -22
- package/src/setup-memory-deps.ts +166 -0
- package/src/setup.ts +95 -98
- package/src/stage-usage.ts +385 -0
- package/src/statusline.ts +149 -1
- package/src/workflow-run-dispatch.ts +197 -93
- package/src/workflow-run.ts +101 -5
- package/dist/ledger-cost-fill.d.ts +0 -58
- package/dist/ledger-cost-fill.d.ts.map +0 -1
- package/dist/ledger-cost-fill.js +0 -78
- package/dist/ledger-cost-fill.js.map +0 -1
- package/dist/retro.d.ts +0 -131
- package/dist/retro.d.ts.map +0 -1
- package/dist/retro.js +0 -207
- package/dist/retro.js.map +0 -1
- package/dist/sbom.d.ts +0 -42
- package/dist/sbom.d.ts.map +0 -1
- package/dist/sbom.js +0 -120
- package/dist/sbom.js.map +0 -1
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Заполнение пустых полей стоимости в леджере прогонов ИЗ ЗАПИСИ ХОСТА.
|
|
3
|
-
*
|
|
4
|
-
* ЗАЧЕМ. Запись 3c026d5d: стоимость фичи на три четверти набита руками. ИЗМЕРЕНО 2026-09-19 по
|
|
5
|
-
* живому `.dz/feature-adr/run-cost-ledger.jsonl`: 393 строки, из них 293 без числа токенов.
|
|
6
|
-
* Числа при этом НЕ пропали — для прогонов Workflow они лежат в записи хоста
|
|
7
|
-
* `~/.claude/projects/<проект>/<сессия>/workflows/wf_<runId>.json`, где есть `totalTokens`,
|
|
8
|
-
* `durationMs` и `agentCount`. Песочница воркфлоу их видеть не может (у неё нет файловой системы
|
|
9
|
-
* и нет уведомления о завершении), поэтому соединение делается СНАРУЖИ и ПОСЛЕ прогона.
|
|
10
|
-
*
|
|
11
|
-
* ЧЕСТНАЯ ДОСЯГАЕМОСТЬ, и она меньше, чем подразумевает запись. Из 293 пустых строк:
|
|
12
|
-
* • 75 — прогоны Workflow (`auto:true`); только их и может достать это соединение,
|
|
13
|
-
* и лишь 25 из них несут `runId`, по которому запись хоста находится СЕГОДНЯ;
|
|
14
|
-
* • 218 — ручные круги ведущего, для которых записи хоста НЕ СУЩЕСТВУЕТ ПО ПОСТРОЕНИЮ:
|
|
15
|
-
* Workflow не запускался, и стоимость этим путём не восстановима в принципе.
|
|
16
|
-
* То есть механизм закрывает не «три четверти», а максимум 26% разрыва, а сегодня 9%.
|
|
17
|
-
* Остальное — задача ПИСАТЕЛЯ (проставлять пригодный `runId`) и отдельный вопрос про то,
|
|
18
|
-
* чем мерить ручные круги.
|
|
19
|
-
*
|
|
20
|
-
* ПРОВЕНАНС ОБЯЗАТЕЛЕН. Заполненное поле помечается `costSource: 'derived'`, потому что
|
|
21
|
-
* выведенное число и набранное руками — разные по доверию величины, и строка, где их нельзя
|
|
22
|
-
* различить, обесценивает обе.
|
|
23
|
-
*/
|
|
24
|
-
/** Стоимость прогона, вычитанная из записи хоста. */
|
|
25
|
-
export interface DerivedRunCost {
|
|
26
|
-
readonly tokens: number;
|
|
27
|
-
readonly minutes: number;
|
|
28
|
-
readonly agents: number | null;
|
|
29
|
-
}
|
|
30
|
-
/** Строка леджера в той части, которая нас касается. */
|
|
31
|
-
export interface LedgerCostRow {
|
|
32
|
-
readonly runId?: unknown;
|
|
33
|
-
readonly tokens?: unknown;
|
|
34
|
-
readonly minutes?: unknown;
|
|
35
|
-
readonly agents?: unknown;
|
|
36
|
-
readonly costSource?: unknown;
|
|
37
|
-
readonly [k: string]: unknown;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Прочитать стоимость из записи хоста. `null`, если запись не несёт обязательных чисел —
|
|
41
|
-
* частичная запись НЕ даёт частичного заполнения: половина выведенной строки хуже пустой,
|
|
42
|
-
* потому что выглядит как измерение.
|
|
43
|
-
*/
|
|
44
|
-
export declare function readHostRunCost(record: unknown): DerivedRunCost | null;
|
|
45
|
-
/**
|
|
46
|
-
* Заполнить ТОЛЬКО пустые поля. Уже набранное руками число НИКОГДА не перетирается: оно могло
|
|
47
|
-
* быть исправлено человеком по другим основаниям, и выведенное значение не имеет права его
|
|
48
|
-
* вытеснять. Возвращает `null`, если заполнять нечего — чтобы вызывающий не переписывал файл зря.
|
|
49
|
-
*/
|
|
50
|
-
export declare function fillLedgerCost(row: LedgerCostRow, derived: DerivedRunCost): LedgerCostRow | null;
|
|
51
|
-
/** Три исхода на строку — и «нечего заполнять» отделено от «не нашли запись». */
|
|
52
|
-
export type FillOutcome = 'filled' | 'nothing-to-fill' | 'no-host-record';
|
|
53
|
-
/** Решение по одной строке: чем она разрешается и почему. */
|
|
54
|
-
export declare function decideFill(row: LedgerCostRow, record: unknown): {
|
|
55
|
-
outcome: FillOutcome;
|
|
56
|
-
next: LedgerCostRow | null;
|
|
57
|
-
};
|
|
58
|
-
//# sourceMappingURL=ledger-cost-fill.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ledger-cost-fill.d.ts","sourceRoot":"","sources":["../src/ledger-cost-fill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,wDAAwD;AACxD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AAID;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAUtE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,GAAG,aAAa,GAAG,IAAI,CAUhG;AAED,iFAAiF;AACjF,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAE1E,6DAA6D;AAC7D,wBAAgB,UAAU,CAAC,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAA;CAAE,CAKpH"}
|
package/dist/ledger-cost-fill.js
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Заполнение пустых полей стоимости в леджере прогонов ИЗ ЗАПИСИ ХОСТА.
|
|
3
|
-
*
|
|
4
|
-
* ЗАЧЕМ. Запись 3c026d5d: стоимость фичи на три четверти набита руками. ИЗМЕРЕНО 2026-09-19 по
|
|
5
|
-
* живому `.dz/feature-adr/run-cost-ledger.jsonl`: 393 строки, из них 293 без числа токенов.
|
|
6
|
-
* Числа при этом НЕ пропали — для прогонов Workflow они лежат в записи хоста
|
|
7
|
-
* `~/.claude/projects/<проект>/<сессия>/workflows/wf_<runId>.json`, где есть `totalTokens`,
|
|
8
|
-
* `durationMs` и `agentCount`. Песочница воркфлоу их видеть не может (у неё нет файловой системы
|
|
9
|
-
* и нет уведомления о завершении), поэтому соединение делается СНАРУЖИ и ПОСЛЕ прогона.
|
|
10
|
-
*
|
|
11
|
-
* ЧЕСТНАЯ ДОСЯГАЕМОСТЬ, и она меньше, чем подразумевает запись. Из 293 пустых строк:
|
|
12
|
-
* • 75 — прогоны Workflow (`auto:true`); только их и может достать это соединение,
|
|
13
|
-
* и лишь 25 из них несут `runId`, по которому запись хоста находится СЕГОДНЯ;
|
|
14
|
-
* • 218 — ручные круги ведущего, для которых записи хоста НЕ СУЩЕСТВУЕТ ПО ПОСТРОЕНИЮ:
|
|
15
|
-
* Workflow не запускался, и стоимость этим путём не восстановима в принципе.
|
|
16
|
-
* То есть механизм закрывает не «три четверти», а максимум 26% разрыва, а сегодня 9%.
|
|
17
|
-
* Остальное — задача ПИСАТЕЛЯ (проставлять пригодный `runId`) и отдельный вопрос про то,
|
|
18
|
-
* чем мерить ручные круги.
|
|
19
|
-
*
|
|
20
|
-
* ПРОВЕНАНС ОБЯЗАТЕЛЕН. Заполненное поле помечается `costSource: 'derived'`, потому что
|
|
21
|
-
* выведенное число и набранное руками — разные по доверию величины, и строка, где их нельзя
|
|
22
|
-
* различить, обесценивает обе.
|
|
23
|
-
*/
|
|
24
|
-
const isFiniteNumber = (v) => typeof v === 'number' && Number.isFinite(v);
|
|
25
|
-
/**
|
|
26
|
-
* Прочитать стоимость из записи хоста. `null`, если запись не несёт обязательных чисел —
|
|
27
|
-
* частичная запись НЕ даёт частичного заполнения: половина выведенной строки хуже пустой,
|
|
28
|
-
* потому что выглядит как измерение.
|
|
29
|
-
*/
|
|
30
|
-
export function readHostRunCost(record) {
|
|
31
|
-
if (record === null || typeof record !== 'object')
|
|
32
|
-
return null;
|
|
33
|
-
const r = record;
|
|
34
|
-
if (!isFiniteNumber(r['totalTokens']) || !isFiniteNumber(r['durationMs']))
|
|
35
|
-
return null;
|
|
36
|
-
if (r['totalTokens'] < 0 || r['durationMs'] < 0)
|
|
37
|
-
return null;
|
|
38
|
-
return {
|
|
39
|
-
tokens: r['totalTokens'],
|
|
40
|
-
minutes: Math.round(r['durationMs'] / 60_000),
|
|
41
|
-
agents: isFiniteNumber(r['agentCount']) ? r['agentCount'] : null,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Заполнить ТОЛЬКО пустые поля. Уже набранное руками число НИКОГДА не перетирается: оно могло
|
|
46
|
-
* быть исправлено человеком по другим основаниям, и выведенное значение не имеет права его
|
|
47
|
-
* вытеснять. Возвращает `null`, если заполнять нечего — чтобы вызывающий не переписывал файл зря.
|
|
48
|
-
*/
|
|
49
|
-
export function fillLedgerCost(row, derived) {
|
|
50
|
-
const next = { ...row };
|
|
51
|
-
let filled = false;
|
|
52
|
-
if (!isFiniteNumber(row['tokens'])) {
|
|
53
|
-
next['tokens'] = derived.tokens;
|
|
54
|
-
filled = true;
|
|
55
|
-
}
|
|
56
|
-
if (!isFiniteNumber(row['minutes'])) {
|
|
57
|
-
next['minutes'] = derived.minutes;
|
|
58
|
-
filled = true;
|
|
59
|
-
}
|
|
60
|
-
if (!isFiniteNumber(row['agents']) && derived.agents !== null) {
|
|
61
|
-
next['agents'] = derived.agents;
|
|
62
|
-
filled = true;
|
|
63
|
-
}
|
|
64
|
-
if (!filled)
|
|
65
|
-
return null;
|
|
66
|
-
// Провенанс ставится ТОЛЬКО когда что-то действительно заполнено.
|
|
67
|
-
next['costSource'] = 'derived';
|
|
68
|
-
return next;
|
|
69
|
-
}
|
|
70
|
-
/** Решение по одной строке: чем она разрешается и почему. */
|
|
71
|
-
export function decideFill(row, record) {
|
|
72
|
-
const derived = record === undefined ? null : readHostRunCost(record);
|
|
73
|
-
if (derived === null)
|
|
74
|
-
return { outcome: 'no-host-record', next: null };
|
|
75
|
-
const next = fillLedgerCost(row, derived);
|
|
76
|
-
return next === null ? { outcome: 'nothing-to-fill', next: null } : { outcome: 'filled', next };
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=ledger-cost-fill.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ledger-cost-fill.js","sourceRoot":"","sources":["../src/ledger-cost-fill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAmBH,MAAM,cAAc,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAEhG;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAe;IAC7C,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC/D,MAAM,CAAC,GAAG,MAAiC,CAAC;IAC5C,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACvF,IAAI,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,OAAO;QACL,MAAM,EAAE,CAAC,CAAC,aAAa,CAAC;QACxB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;QAC7C,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI;KACjE,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAkB,EAAE,OAAuB;IACxE,MAAM,IAAI,GAA4B,EAAE,GAAG,GAAG,EAAE,CAAC;IACjD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC;IAAC,CAAC;IACvF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAAC,IAAI,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC;IAAC,CAAC;IAC1F,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC;IAAC,CAAC;IAClH,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,kEAAkE;IAClE,IAAI,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IAC/B,OAAO,IAAqB,CAAC;AAC/B,CAAC;AAKD,6DAA6D;AAC7D,MAAM,UAAU,UAAU,CAAC,GAAkB,EAAE,MAAe;IAC5D,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACtE,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACvE,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAClG,CAAC"}
|
package/dist/retro.d.ts
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `dz retro` — what was done over a day, a week or a month.
|
|
3
|
-
*
|
|
4
|
-
* This module is PURE: no filesystem, no network, and — load-bearing — no clock. The window arrives
|
|
5
|
-
* as a parameter, because a window you cannot pin in a test is a window whose arithmetic errors you
|
|
6
|
-
* cannot catch. MEASURED in this project 2026-08-22: an agent's timestamp was off by a YEAR, the
|
|
7
|
-
* query returned 15 530 "hits" for a "week", and nothing about the output looked wrong.
|
|
8
|
-
*
|
|
9
|
-
* Its second job is refusing. Half of an honest report is declining to answer what the data cannot
|
|
10
|
-
* support, and those refusals live here as behaviour — types that cannot express a quarter, a
|
|
11
|
-
* decision function that names the real span in days, and a three-state section verdict where
|
|
12
|
-
* "the source said nothing" and "the source was not read" can never collapse into one zero.
|
|
13
|
-
*
|
|
14
|
-
* See features/dz-retro/03_adr/ for the decisions and the measurements behind them.
|
|
15
|
-
*/
|
|
16
|
-
/** The only horizons this project has the data for. A quarter or a year is NOT SPELLABLE (ADR-001). */
|
|
17
|
-
export type RetroHorizon = 'day' | 'week' | 'month';
|
|
18
|
-
/** Horizons a user may ASK for — recognised so they are refused loudly, never swallowed. */
|
|
19
|
-
export type RefusedHorizon = 'quarter' | 'half-year' | 'year';
|
|
20
|
-
export declare const REFUSED_HORIZONS: readonly RefusedHorizon[];
|
|
21
|
-
export interface RetroWindow {
|
|
22
|
-
readonly horizon: RetroHorizon;
|
|
23
|
-
/** Inclusive ISO date (YYYY-MM-DD) of the first day in the window. */
|
|
24
|
-
readonly startIso: string;
|
|
25
|
-
/** Inclusive ISO date of the last day — the anchor. */
|
|
26
|
-
readonly endIso: string;
|
|
27
|
-
readonly days: number;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* The window for a horizon, anchored on an EXPLICIT date. Never reads the clock.
|
|
31
|
-
* `atIso` may be a full timestamp; only its date part is used.
|
|
32
|
-
*/
|
|
33
|
-
export declare function retroWindow(horizon: RetroHorizon, atIso: string): RetroWindow;
|
|
34
|
-
/** Is this instant inside the window? Compared in UTC, never as strings (ADR/AM-5). */
|
|
35
|
-
export declare function withinWindow(w: RetroWindow, isoInstant: string): boolean;
|
|
36
|
-
export interface HorizonDecision {
|
|
37
|
-
readonly action: 'report' | 'refuse';
|
|
38
|
-
readonly reason: string;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* May we report over the requested horizon at all?
|
|
42
|
-
*
|
|
43
|
-
* `spanDays` is the age of the LONGEST record we actually hold. Asking for a year over 174 days of
|
|
44
|
-
* data is not a thin report — it is an invented one, so it is refused and the real span is named.
|
|
45
|
-
*/
|
|
46
|
-
export declare function decideHorizon(input: {
|
|
47
|
-
requested: string;
|
|
48
|
-
spanDays: number;
|
|
49
|
-
}): HorizonDecision;
|
|
50
|
-
export type SectionStatus = 'full' | 'partial' | 'unavailable';
|
|
51
|
-
export interface SectionVerdict {
|
|
52
|
-
readonly status: SectionStatus;
|
|
53
|
-
/** The date this source's records begin — computed from the source itself, never hardcoded. */
|
|
54
|
-
readonly dataStart: string | null;
|
|
55
|
-
readonly note: string;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Does this source cover the whole window?
|
|
59
|
-
*
|
|
60
|
-
* `dataStart: null` means the source was NOT READ — a different fact from "read, and empty".
|
|
61
|
-
* Collapsing the two is how a report says "nothing happened" about a week it could not see.
|
|
62
|
-
*/
|
|
63
|
-
export declare function sectionStatus(input: {
|
|
64
|
-
dataStart: string | null;
|
|
65
|
-
windowStart: string;
|
|
66
|
-
}): SectionVerdict;
|
|
67
|
-
export interface ForbiddenMetric {
|
|
68
|
-
readonly name: string;
|
|
69
|
-
/** The measurement that disqualifies it. A bare ban decays into a word list. */
|
|
70
|
-
readonly reason: string;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Measures of the INSTRUMENT, not of the work (ADR-003). Each will be proposed again precisely
|
|
74
|
-
* because each is a one-liner to compute, so each carries the measurement that refutes it.
|
|
75
|
-
*/
|
|
76
|
-
export declare const FORBIDDEN_METRICS: readonly ForbiddenMetric[];
|
|
77
|
-
export interface Delivery {
|
|
78
|
-
readonly slug: string;
|
|
79
|
-
readonly createdIso: string;
|
|
80
|
-
/** 'unique' carries a grade; 'ambiguous' and 'none' are facts about the report, not gaps. */
|
|
81
|
-
readonly gradeStatus: 'unique' | 'ambiguous' | 'none' | 'no-report';
|
|
82
|
-
readonly grade: string | null;
|
|
83
|
-
}
|
|
84
|
-
export interface Publish {
|
|
85
|
-
readonly pkg: string;
|
|
86
|
-
readonly version: string;
|
|
87
|
-
readonly iso: string;
|
|
88
|
-
}
|
|
89
|
-
export interface GuardRun {
|
|
90
|
-
readonly iso: string;
|
|
91
|
-
readonly verdict: string;
|
|
92
|
-
readonly rules: readonly string[];
|
|
93
|
-
}
|
|
94
|
-
export interface ReuseFacts {
|
|
95
|
-
readonly dataStart: string | null;
|
|
96
|
-
readonly eventsInWindow: number;
|
|
97
|
-
readonly lessonsEverRecalled: number;
|
|
98
|
-
readonly lessonsTotal: number;
|
|
99
|
-
}
|
|
100
|
-
export interface SourceFacts<T> {
|
|
101
|
-
readonly dataStart: string | null;
|
|
102
|
-
readonly items: readonly T[];
|
|
103
|
-
}
|
|
104
|
-
export interface RetroFacts {
|
|
105
|
-
readonly window: RetroWindow;
|
|
106
|
-
/** The longest record we hold, in days — what `decideHorizon` judges against. */
|
|
107
|
-
readonly spanDays: number;
|
|
108
|
-
/** `null` means NOT READ. An empty `items` means read-and-empty. The type keeps them apart. */
|
|
109
|
-
readonly deliveries: SourceFacts<Delivery> | null;
|
|
110
|
-
readonly publishes: SourceFacts<Publish> | null;
|
|
111
|
-
readonly guard: SourceFacts<GuardRun> | null;
|
|
112
|
-
readonly reuse: ReuseFacts | null;
|
|
113
|
-
/** Feature dirs on disk that git has never seen — the report is blind to them, and says so. */
|
|
114
|
-
readonly uncommittedSlugs: readonly string[];
|
|
115
|
-
}
|
|
116
|
-
export interface RetroSection {
|
|
117
|
-
readonly id: 'deliveries' | 'publishes' | 'discipline' | 'reuse';
|
|
118
|
-
readonly title: string;
|
|
119
|
-
readonly verdict: SectionVerdict;
|
|
120
|
-
readonly lines: readonly string[];
|
|
121
|
-
}
|
|
122
|
-
export interface RetroReport {
|
|
123
|
-
readonly window: RetroWindow;
|
|
124
|
-
readonly spanDays: number;
|
|
125
|
-
readonly sections: readonly RetroSection[];
|
|
126
|
-
readonly caveats: readonly string[];
|
|
127
|
-
}
|
|
128
|
-
export declare function buildRetro(facts: RetroFacts): RetroReport;
|
|
129
|
-
/** The human rendering. `--json` prints the SAME `RetroReport` — one structure, two spellings (FR-6). */
|
|
130
|
-
export declare function renderRetro(report: RetroReport): string[];
|
|
131
|
-
//# sourceMappingURL=retro.d.ts.map
|
package/dist/retro.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"retro.d.ts","sourceRoot":"","sources":["../src/retro.ts"],"names":[],"mappings":"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"}
|
package/dist/retro.js
DELETED
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `dz retro` — what was done over a day, a week or a month.
|
|
3
|
-
*
|
|
4
|
-
* This module is PURE: no filesystem, no network, and — load-bearing — no clock. The window arrives
|
|
5
|
-
* as a parameter, because a window you cannot pin in a test is a window whose arithmetic errors you
|
|
6
|
-
* cannot catch. MEASURED in this project 2026-08-22: an agent's timestamp was off by a YEAR, the
|
|
7
|
-
* query returned 15 530 "hits" for a "week", and nothing about the output looked wrong.
|
|
8
|
-
*
|
|
9
|
-
* Its second job is refusing. Half of an honest report is declining to answer what the data cannot
|
|
10
|
-
* support, and those refusals live here as behaviour — types that cannot express a quarter, a
|
|
11
|
-
* decision function that names the real span in days, and a three-state section verdict where
|
|
12
|
-
* "the source said nothing" and "the source was not read" can never collapse into one zero.
|
|
13
|
-
*
|
|
14
|
-
* See features/dz-retro/03_adr/ for the decisions and the measurements behind them.
|
|
15
|
-
*/
|
|
16
|
-
export const REFUSED_HORIZONS = ['quarter', 'half-year', 'year'];
|
|
17
|
-
const HORIZON_DAYS = { day: 1, week: 7, month: 30 };
|
|
18
|
-
const REFUSED_DAYS = { quarter: 90, 'half-year': 182, year: 365 };
|
|
19
|
-
const DAY_MS = 86_400_000;
|
|
20
|
-
function isoDay(value) {
|
|
21
|
-
return value.slice(0, 10);
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* The window for a horizon, anchored on an EXPLICIT date. Never reads the clock.
|
|
25
|
-
* `atIso` may be a full timestamp; only its date part is used.
|
|
26
|
-
*/
|
|
27
|
-
export function retroWindow(horizon, atIso) {
|
|
28
|
-
const end = isoDay(atIso);
|
|
29
|
-
const endMs = Date.parse(`${end}T00:00:00.000Z`);
|
|
30
|
-
if (Number.isNaN(endMs))
|
|
31
|
-
throw new Error(`retroWindow: not an ISO date: ${JSON.stringify(atIso)}`);
|
|
32
|
-
const days = HORIZON_DAYS[horizon];
|
|
33
|
-
const startMs = endMs - (days - 1) * DAY_MS;
|
|
34
|
-
return { horizon, startIso: new Date(startMs).toISOString().slice(0, 10), endIso: end, days };
|
|
35
|
-
}
|
|
36
|
-
/** Is this instant inside the window? Compared in UTC, never as strings (ADR/AM-5). */
|
|
37
|
-
export function withinWindow(w, isoInstant) {
|
|
38
|
-
const t = Date.parse(isoInstant);
|
|
39
|
-
if (Number.isNaN(t))
|
|
40
|
-
return false;
|
|
41
|
-
const from = Date.parse(`${w.startIso}T00:00:00.000Z`);
|
|
42
|
-
const to = Date.parse(`${w.endIso}T00:00:00.000Z`) + DAY_MS;
|
|
43
|
-
return t >= from && t < to;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* May we report over the requested horizon at all?
|
|
47
|
-
*
|
|
48
|
-
* `spanDays` is the age of the LONGEST record we actually hold. Asking for a year over 174 days of
|
|
49
|
-
* data is not a thin report — it is an invented one, so it is refused and the real span is named.
|
|
50
|
-
*/
|
|
51
|
-
export function decideHorizon(input) {
|
|
52
|
-
const req = input.requested.trim().toLowerCase();
|
|
53
|
-
const span = Number.isFinite(input.spanDays) ? Math.max(0, Math.floor(input.spanDays)) : 0;
|
|
54
|
-
if (req in HORIZON_DAYS) {
|
|
55
|
-
const need = HORIZON_DAYS[req];
|
|
56
|
-
if (span < need) {
|
|
57
|
-
return {
|
|
58
|
-
action: 'refuse',
|
|
59
|
-
reason: `a ${req} needs ${need} day(s) of records and we hold ${span} — reporting it would invent the difference`,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
return { action: 'report', reason: `${req}: ${need} day(s) against ${span} day(s) of records` };
|
|
63
|
-
}
|
|
64
|
-
if (REFUSED_HORIZONS.includes(req)) {
|
|
65
|
-
const need = REFUSED_DAYS[req];
|
|
66
|
-
return {
|
|
67
|
-
action: 'refuse',
|
|
68
|
-
reason: `a ${req} needs about ${need} days of records and the longest record here spans ${span} day(s) — there is exactly one complete quarter, so a quarter-over-quarter comparison is arithmetically impossible and a year would be fabrication`,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
return { action: 'refuse', reason: `unknown horizon ${JSON.stringify(input.requested)} — use --day, --week or --month` };
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Does this source cover the whole window?
|
|
75
|
-
*
|
|
76
|
-
* `dataStart: null` means the source was NOT READ — a different fact from "read, and empty".
|
|
77
|
-
* Collapsing the two is how a report says "nothing happened" about a week it could not see.
|
|
78
|
-
*/
|
|
79
|
-
export function sectionStatus(input) {
|
|
80
|
-
if (input.dataStart === null) {
|
|
81
|
-
return { status: 'unavailable', dataStart: null, note: 'source not read — this section says nothing, which is not the same as zero' };
|
|
82
|
-
}
|
|
83
|
-
const start = isoDay(input.dataStart);
|
|
84
|
-
if (start <= isoDay(input.windowStart)) {
|
|
85
|
-
return { status: 'full', dataStart: start, note: `records cover the whole window (from ${start})` };
|
|
86
|
-
}
|
|
87
|
-
return { status: 'partial', dataStart: start, note: `records only begin ${start}, inside the window — everything before that is unknown, not absent` };
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Measures of the INSTRUMENT, not of the work (ADR-003). Each will be proposed again precisely
|
|
91
|
-
* because each is a one-liner to compute, so each carries the measurement that refutes it.
|
|
92
|
-
*/
|
|
93
|
-
export const FORBIDDEN_METRICS = [
|
|
94
|
-
{ name: 'commit count', reason: 'this project mandates a commit per logical change; 1318 commits over 66 active days measures compliance with that rule, not output (MEASURED 2026-08-22)' },
|
|
95
|
-
{ name: 'lines changed', reason: 'generated artifacts dominate — 352 of 1318 commits are docs, and one pipeline run writes 8-10 files before a line of product code exists' },
|
|
96
|
-
{ name: 'token spend', reason: 'self-declared an estimate, once wrong sixfold, covers 17 days, and 20 of 86 ledger rows carry no number by construction' },
|
|
97
|
-
{ name: 'learning event volume', reason: '640 in May against 10454 in August, but the sources are post-edit and post-command hooks: the curve measures when hooks were installed' },
|
|
98
|
-
{ name: 'inventory counts', reason: 'skills, packages and tests only ever grow, so they can only ever flatter' },
|
|
99
|
-
{ name: 'learned lesson count', reason: 'already refuted by this project’s own dz compounding: 54% of the pool has never been read by anyone' },
|
|
100
|
-
];
|
|
101
|
-
function emptyOrUnavailable(v, emptyLine) {
|
|
102
|
-
return v.status === 'unavailable'
|
|
103
|
-
? ['not read — this section cannot say anything about this window']
|
|
104
|
-
: [emptyLine];
|
|
105
|
-
}
|
|
106
|
-
export function buildRetro(facts) {
|
|
107
|
-
const ws = facts.window.startIso;
|
|
108
|
-
const sections = [];
|
|
109
|
-
// 1. Deliveries
|
|
110
|
-
{
|
|
111
|
-
const v = sectionStatus({ dataStart: facts.deliveries?.dataStart ?? null, windowStart: ws });
|
|
112
|
-
const items = (facts.deliveries?.items ?? []).filter((d) => withinWindow(facts.window, d.createdIso));
|
|
113
|
-
const graded = items.filter((d) => d.gradeStatus === 'unique');
|
|
114
|
-
const ambiguous = items.filter((d) => d.gradeStatus === 'ambiguous');
|
|
115
|
-
const ungraded = items.filter((d) => d.gradeStatus === 'none' || d.gradeStatus === 'no-report');
|
|
116
|
-
const lines = items.length === 0
|
|
117
|
-
? emptyOrUnavailable(v, 'no feature directories were created in this window')
|
|
118
|
-
: [
|
|
119
|
-
`${items.length} feature director${items.length === 1 ? 'y' : 'ies'} created`,
|
|
120
|
-
`${graded.length} carry a grade an independent review stated unambiguously${graded.length > 0 ? `: ${tally(graded.map((d) => d.grade))}` : ''}`,
|
|
121
|
-
`${ambiguous.length} have a report that states MORE THAN ONE grade — reported as ambiguous, never guessed`,
|
|
122
|
-
`${ungraded.length} have no letter grade in their report, or no report at all`,
|
|
123
|
-
'cadence is not value: this counts deliveries, not what they were worth',
|
|
124
|
-
];
|
|
125
|
-
sections.push({ id: 'deliveries', title: 'Deliveries', verdict: v, lines });
|
|
126
|
-
}
|
|
127
|
-
// 2. Publishes
|
|
128
|
-
{
|
|
129
|
-
const v = sectionStatus({ dataStart: facts.publishes?.dataStart ?? null, windowStart: ws });
|
|
130
|
-
const items = (facts.publishes?.items ?? []).filter((p) => withinWindow(facts.window, p.iso));
|
|
131
|
-
const pkgs = new Set(items.map((p) => p.pkg));
|
|
132
|
-
const lines = items.length === 0
|
|
133
|
-
? emptyOrUnavailable(v, 'no versions were accepted by the registry in this window')
|
|
134
|
-
: [
|
|
135
|
-
`${items.length} version(s) accepted by the registry across ${pkgs.size} package(s)`,
|
|
136
|
-
'timestamps are the registry’s own — this is the one record here nobody local can backdate',
|
|
137
|
-
];
|
|
138
|
-
sections.push({ id: 'publishes', title: 'Publishes', verdict: v, lines });
|
|
139
|
-
}
|
|
140
|
-
// 3. Discipline — DESCRIBES, never compares (ADR-004)
|
|
141
|
-
{
|
|
142
|
-
const v = sectionStatus({ dataStart: facts.guard?.dataStart ?? null, windowStart: ws });
|
|
143
|
-
const runs = (facts.guard?.items ?? []).filter((g) => withinWindow(facts.window, g.iso));
|
|
144
|
-
const byVerdict = new Map();
|
|
145
|
-
const byRule = new Map();
|
|
146
|
-
for (const r of runs) {
|
|
147
|
-
byVerdict.set(r.verdict, (byVerdict.get(r.verdict) ?? 0) + 1);
|
|
148
|
-
for (const rule of r.rules)
|
|
149
|
-
byRule.set(rule, (byRule.get(rule) ?? 0) + 1);
|
|
150
|
-
}
|
|
151
|
-
const lines = runs.length === 0
|
|
152
|
-
? emptyOrUnavailable(v, 'no gate runs were recorded in this window')
|
|
153
|
-
: [
|
|
154
|
-
`${runs.length} gate run(s): ${[...byVerdict.entries()].map(([k, n]) => `${k} ${n}`).join(', ')}`,
|
|
155
|
-
byRule.size === 0
|
|
156
|
-
? 'no rule was violated in this window'
|
|
157
|
-
: `violations by rule: ${[...byRule.entries()].sort((a, b) => b[1] - a[1]).map(([k, n]) => `${k} ${n}`).join(', ')}`,
|
|
158
|
-
];
|
|
159
|
-
// The caveat is NOT optional and NOT conditional: it is the whole honesty of the section.
|
|
160
|
-
lines.push('a rule missing from this list was either never violated or did not yet exist — the log records a rule only when it fires, so it cannot tell those apart');
|
|
161
|
-
lines.push('this section describes the window; it deliberately computes no comparison between periods');
|
|
162
|
-
sections.push({ id: 'discipline', title: 'Discipline', verdict: v, lines });
|
|
163
|
-
}
|
|
164
|
-
// 4. Knowledge reuse
|
|
165
|
-
{
|
|
166
|
-
const v = sectionStatus({ dataStart: facts.reuse?.dataStart ?? null, windowStart: ws });
|
|
167
|
-
const r = facts.reuse;
|
|
168
|
-
const lines = r === null || r.lessonsTotal === 0
|
|
169
|
-
? emptyOrUnavailable(v, 'no lessons are stored, so there is nothing to reuse')
|
|
170
|
-
: [
|
|
171
|
-
`${r.eventsInWindow} recall event(s) in this window`,
|
|
172
|
-
`${r.lessonsEverRecalled} of ${r.lessonsTotal} stored lessons have ever been read (${Math.round((r.lessonsEverRecalled / r.lessonsTotal) * 100)}%)`,
|
|
173
|
-
'this is a ratio with a hostile denominator: storing more unread lessons makes it worse, not better',
|
|
174
|
-
];
|
|
175
|
-
sections.push({ id: 'reuse', title: 'Knowledge reuse', verdict: v, lines });
|
|
176
|
-
}
|
|
177
|
-
const caveats = [];
|
|
178
|
-
if (facts.uncommittedSlugs.length > 0) {
|
|
179
|
-
caveats.push(`${facts.uncommittedSlugs.length} feature director${facts.uncommittedSlugs.length === 1 ? 'y is' : 'ies are'} not committed yet and therefore invisible to this report: ${facts.uncommittedSlugs.join(', ')}`);
|
|
180
|
-
}
|
|
181
|
-
caveats.push('none of the following is computed here, and each carries the measurement that disqualifies it: ' + FORBIDDEN_METRICS.map((m) => m.name).join(', '));
|
|
182
|
-
return { window: facts.window, spanDays: facts.spanDays, sections, caveats };
|
|
183
|
-
}
|
|
184
|
-
function tally(values) {
|
|
185
|
-
const m = new Map();
|
|
186
|
-
for (const v of values)
|
|
187
|
-
m.set(v, (m.get(v) ?? 0) + 1);
|
|
188
|
-
return [...m.entries()].sort((a, b) => (a[0] < b[0] ? -1 : 1)).map(([k, n]) => `${k}×${n}`).join(' ');
|
|
189
|
-
}
|
|
190
|
-
/** The human rendering. `--json` prints the SAME `RetroReport` — one structure, two spellings (FR-6). */
|
|
191
|
-
export function renderRetro(report) {
|
|
192
|
-
const out = [];
|
|
193
|
-
out.push(`dz retro — ${report.window.horizon}: ${report.window.startIso} … ${report.window.endIso} (${report.window.days} day(s))`);
|
|
194
|
-
out.push(`records held: ${report.spanDays} day(s)`);
|
|
195
|
-
for (const s of report.sections) {
|
|
196
|
-
out.push('');
|
|
197
|
-
out.push(`${s.title} [${s.verdict.status}]${s.verdict.dataStart !== null ? ` · records from ${s.verdict.dataStart}` : ''}`);
|
|
198
|
-
out.push(` ${s.verdict.note}`);
|
|
199
|
-
for (const l of s.lines)
|
|
200
|
-
out.push(` · ${l}`);
|
|
201
|
-
}
|
|
202
|
-
out.push('');
|
|
203
|
-
for (const c of report.caveats)
|
|
204
|
-
out.push(`! ${c}`);
|
|
205
|
-
return out;
|
|
206
|
-
}
|
|
207
|
-
//# sourceMappingURL=retro.js.map
|
package/dist/retro.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"retro.js","sourceRoot":"","sources":["../src/retro.ts"],"names":[],"mappings":"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"}
|
package/dist/sbom.d.ts
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
export interface SbomPackage {
|
|
2
|
-
readonly SPDXID: string;
|
|
3
|
-
readonly name: string;
|
|
4
|
-
readonly versionInfo: string;
|
|
5
|
-
readonly downloadLocation: string;
|
|
6
|
-
readonly licenseConcluded: string;
|
|
7
|
-
readonly licenseDeclared: string;
|
|
8
|
-
readonly externalRefs: readonly {
|
|
9
|
-
referenceCategory: string;
|
|
10
|
-
referenceType: string;
|
|
11
|
-
referenceLocator: string;
|
|
12
|
-
}[];
|
|
13
|
-
}
|
|
14
|
-
export interface SpdxDocument {
|
|
15
|
-
readonly spdxVersion: 'SPDX-2.3';
|
|
16
|
-
readonly dataLicense: 'CC0-1.0';
|
|
17
|
-
readonly SPDXID: 'SPDXRef-DOCUMENT';
|
|
18
|
-
readonly name: string;
|
|
19
|
-
readonly documentNamespace: string;
|
|
20
|
-
readonly creationInfo: {
|
|
21
|
-
readonly created: string;
|
|
22
|
-
readonly creators: readonly string[];
|
|
23
|
-
};
|
|
24
|
-
readonly packages: readonly SbomPackage[];
|
|
25
|
-
readonly relationships: readonly {
|
|
26
|
-
spdxElementId: string;
|
|
27
|
-
relationshipType: string;
|
|
28
|
-
relatedSpdxElement: string;
|
|
29
|
-
}[];
|
|
30
|
-
}
|
|
31
|
-
/** Build an SPDX-2.3 SBOM document. Pure + deterministic (injected `created`; packages sorted by name+version). */
|
|
32
|
-
export declare function buildSbom(input: {
|
|
33
|
-
name: string;
|
|
34
|
-
lock?: unknown;
|
|
35
|
-
pkg?: unknown;
|
|
36
|
-
includeDev?: boolean;
|
|
37
|
-
created: string;
|
|
38
|
-
namespace?: string;
|
|
39
|
-
}): SpdxDocument;
|
|
40
|
-
/** Shape check for `--validate-only`: returns the problems (empty ⇒ valid SPDX-2.3 skeleton). */
|
|
41
|
-
export declare function validateSbom(doc: unknown): string[];
|
|
42
|
-
//# sourceMappingURL=sbom.d.ts.map
|
package/dist/sbom.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sbom.d.ts","sourceRoot":"","sources":["../src/sbom.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,SAAS;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAClH;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IAC1F,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,SAAS;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACpH;AA+ED,mHAAmH;AACnH,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,YAAY,CAwBf;AAED,iGAAiG;AACjG,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CASnD"}
|