@uwmd/core 1.10.0 → 2.1.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/browser.d.ts +8 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +4 -0
- package/dist/browser.js.map +1 -1
- package/dist/calc/dated-flows.d.ts +26 -0
- package/dist/calc/dated-flows.d.ts.map +1 -0
- package/dist/calc/dated-flows.js +163 -0
- package/dist/calc/dated-flows.js.map +1 -0
- package/dist/calc/day-count.d.ts +27 -0
- package/dist/calc/day-count.d.ts.map +1 -0
- package/dist/calc/day-count.js +95 -0
- package/dist/calc/day-count.js.map +1 -0
- package/dist/calc/errors.d.ts +1 -1
- package/dist/calc/errors.d.ts.map +1 -1
- package/dist/calc/errors.js.map +1 -1
- package/dist/cash-flow-series.d.ts +106 -0
- package/dist/cash-flow-series.d.ts.map +1 -0
- package/dist/cash-flow-series.js +298 -0
- package/dist/cash-flow-series.js.map +1 -0
- package/dist/cli-portfolio.d.ts +7 -0
- package/dist/cli-portfolio.d.ts.map +1 -0
- package/dist/cli-portfolio.js +68 -0
- package/dist/cli-portfolio.js.map +1 -0
- package/dist/cli.js +31 -0
- package/dist/cli.js.map +1 -1
- package/dist/editor.d.ts.map +1 -1
- package/dist/editor.js +28 -22
- package/dist/editor.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +6 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +55 -46
- package/dist/init.js.map +1 -1
- package/dist/lite-bridge.d.ts.map +1 -1
- package/dist/lite-bridge.js +10 -5
- package/dist/lite-bridge.js.map +1 -1
- package/dist/meta-shape.d.ts +16 -0
- package/dist/meta-shape.d.ts.map +1 -1
- package/dist/meta-shape.js +47 -3
- package/dist/meta-shape.js.map +1 -1
- package/dist/migrate-to-v2.d.ts.map +1 -1
- package/dist/migrate-to-v2.js +0 -0
- package/dist/migrate-to-v2.js.map +1 -1
- package/dist/modules.js +14 -8
- package/dist/modules.js.map +1 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +9 -4
- package/dist/parser.js.map +1 -1
- package/dist/portfolio.d.ts +71 -0
- package/dist/portfolio.d.ts.map +1 -0
- package/dist/portfolio.js +174 -0
- package/dist/portfolio.js.map +1 -0
- package/dist/protocol.d.ts +29 -5
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +79 -9
- package/dist/protocol.js.map +1 -1
- package/dist/renderer.js +33 -1
- package/dist/renderer.js.map +1 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +46 -32
- package/dist/runner.js.map +1 -1
- package/dist/source-representation.d.ts +7 -2
- package/dist/source-representation.d.ts.map +1 -1
- package/dist/source-representation.js +20 -13
- package/dist/source-representation.js.map +1 -1
- package/dist/types.d.ts +3 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -4
- package/dist/types.js.map +1 -1
- package/dist/validator.d.ts.map +1 -1
- package/dist/validator.js +118 -3
- package/dist/validator.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
// Cash-flow series — state-and-verify dated flows (RFC 0034, UW_FORMAT_SPEC §4.26).
|
|
2
|
+
//
|
|
3
|
+
// A deal states dated, irregular flows — ISO calendar dates, signed amounts —
|
|
4
|
+
// and optionally the aggregates over them (total, MOIC, XNPV at a rate, XIRR).
|
|
5
|
+
// This module carries the §VIII.9 procedures (xnpv closed-form; xirr by the
|
|
6
|
+
// RFC 0024 bisection verbatim, over date-derived exponents) and recomputes
|
|
7
|
+
// each stated metric to a three-state verdict, the same shape as
|
|
8
|
+
// `verifyCapitalStack` and `verifyLeaseUpSchedule`.
|
|
9
|
+
//
|
|
10
|
+
// This deliberately does NOT touch the Tier-3 calc engine: the series is
|
|
11
|
+
// stated data, not formulas, and neither xnpv nor xirr is reachable from a
|
|
12
|
+
// §VIII.1 expression. Structural rules (date grammar, ordering, sign change)
|
|
13
|
+
// are validator errors (`CF-01`…`CF-03`, validator.ts), not verifier findings
|
|
14
|
+
// — structure is validation, arithmetic is verification. A structurally
|
|
15
|
+
// broken series makes every stated metric `unverifiable` here, never a guess.
|
|
16
|
+
// Browser-safe; performs no I/O.
|
|
17
|
+
import { CalcError } from './calc/errors.js';
|
|
18
|
+
import { DEFAULT_DAY_COUNT, isDayCountConvention, parseISODate, yearfrac, } from './calc/day-count.js';
|
|
19
|
+
import { IRR_BRACKET_LO, IRR_BRACKET_HI, IRR_VALUE_TOL, IRR_INTERVAL_TOL, IRR_MAX_ITER, } from './calc/builtins.js';
|
|
20
|
+
// ─── Types (§4.26) ───────────────────────────────────────────────────────────
|
|
21
|
+
/** Advisory flow taxonomy. Closed; gates no rule (§4.26). */
|
|
22
|
+
export const CASH_FLOW_KINDS = Object.freeze([
|
|
23
|
+
'acquisition',
|
|
24
|
+
'operating',
|
|
25
|
+
'capex',
|
|
26
|
+
'debt_service',
|
|
27
|
+
'refinance',
|
|
28
|
+
'disposition',
|
|
29
|
+
'other',
|
|
30
|
+
]);
|
|
31
|
+
// ─── Quantization ────────────────────────────────────────────────────────────
|
|
32
|
+
/**
|
|
33
|
+
* The decimal quantum each metric family is compared at (protocol §VIII.5
|
|
34
|
+
* posture: both sides quantize at the same boundary; §VIII.9.4 unit defaults:
|
|
35
|
+
* `$` → 2, `%` → 6, `x` → 4). Exported so any emitting surface quantizes
|
|
36
|
+
* where this verifier does rather than keeping its own copy.
|
|
37
|
+
*/
|
|
38
|
+
export const CASH_FLOW_VERIFY_DECIMALS = Object.freeze({
|
|
39
|
+
currency: 2,
|
|
40
|
+
rate: 6,
|
|
41
|
+
ratio: 4,
|
|
42
|
+
});
|
|
43
|
+
function roundTo(value, decimals) {
|
|
44
|
+
// Half away from zero, the §VIII.5 rule — Math.round is half-up, which
|
|
45
|
+
// differs for negatives, and a series' net total is routinely negative.
|
|
46
|
+
const f = 10 ** decimals;
|
|
47
|
+
const scaled = value * f;
|
|
48
|
+
return (scaled < 0 ? -Math.round(-scaled) : Math.round(scaled)) / f;
|
|
49
|
+
}
|
|
50
|
+
function isNum(v) {
|
|
51
|
+
return typeof v === 'number' && Number.isFinite(v);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Reduce a structurally valid series to anchor-relative dated flows, or
|
|
55
|
+
* `null` when any row is outside the CF-01/CF-02 grammar — the caller
|
|
56
|
+
* decides whether that is a validator error, a verifier `unverifiable`,
|
|
57
|
+
* or a `CALC-CF-SERIES` refusal; this function never throws.
|
|
58
|
+
*/
|
|
59
|
+
export function datedFlowsOf(series) {
|
|
60
|
+
const rows = series.series;
|
|
61
|
+
if (!Array.isArray(rows) || rows.length === 0)
|
|
62
|
+
return null;
|
|
63
|
+
const convention = series.day_count ?? DEFAULT_DAY_COUNT;
|
|
64
|
+
if (!isDayCountConvention(convention))
|
|
65
|
+
return null;
|
|
66
|
+
const dates = [];
|
|
67
|
+
for (const row of rows) {
|
|
68
|
+
if (!row || typeof row.date !== 'string' || !isNum(row.amount))
|
|
69
|
+
return null;
|
|
70
|
+
const d = parseISODate(row.date);
|
|
71
|
+
if (d === null)
|
|
72
|
+
return null;
|
|
73
|
+
dates.push(d);
|
|
74
|
+
}
|
|
75
|
+
const anchor = dates[0];
|
|
76
|
+
const flows = [];
|
|
77
|
+
let prev = Number.NEGATIVE_INFINITY;
|
|
78
|
+
for (let i = 0; i < rows.length; i++) {
|
|
79
|
+
const t = yearfrac(anchor, dates[i], convention);
|
|
80
|
+
if (t < prev)
|
|
81
|
+
return null; // non-decreasing dates (CF-02)
|
|
82
|
+
prev = t;
|
|
83
|
+
flows.push({ t, amount: rows[i].amount });
|
|
84
|
+
}
|
|
85
|
+
return flows;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* xnpv(r) over anchor-relative flows — protocol §VIII.9.2, closed-form,
|
|
89
|
+
* accumulated in series order. `r <= -1` raises CALC-TYPE-001.
|
|
90
|
+
*/
|
|
91
|
+
export function xnpvOf(flows, rate) {
|
|
92
|
+
if (!isNum(rate) || rate <= -1) {
|
|
93
|
+
throw new CalcError('CALC-TYPE-001', `xnpv: rate must be a finite fraction greater than -1, got ${String(rate)}.`);
|
|
94
|
+
}
|
|
95
|
+
let acc = 0;
|
|
96
|
+
for (const f of flows)
|
|
97
|
+
acc += f.amount * (1 + rate) ** -f.t;
|
|
98
|
+
return acc;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* xirr over anchor-relative flows — protocol §VIII.9.3: the §VIII.3 `irr`
|
|
102
|
+
* procedure verbatim with `npv` replaced by `xnpv`. Same bracket, same
|
|
103
|
+
* tolerances, exact high-endpoint root, no Newton polish; failure raises
|
|
104
|
+
* `CALC-XIRR-DIVERGE`.
|
|
105
|
+
*/
|
|
106
|
+
export function xirrOf(flows) {
|
|
107
|
+
const f = (r) => {
|
|
108
|
+
let acc = 0;
|
|
109
|
+
for (const fl of flows)
|
|
110
|
+
acc += fl.amount * (1 + r) ** -fl.t;
|
|
111
|
+
return acc;
|
|
112
|
+
};
|
|
113
|
+
let lo = IRR_BRACKET_LO;
|
|
114
|
+
let hi = IRR_BRACKET_HI;
|
|
115
|
+
let flo = f(lo);
|
|
116
|
+
const fhi = f(hi);
|
|
117
|
+
if (!Number.isFinite(flo) || !Number.isFinite(fhi) || flo * fhi > 0) {
|
|
118
|
+
throw new CalcError('CALC-XIRR-DIVERGE', `xirr: no sign change over the [${IRR_BRACKET_LO}, ${IRR_BRACKET_HI}] bracket (-99.9% to 1000%), so no root is reported.`);
|
|
119
|
+
}
|
|
120
|
+
// Exact endpoint root — reachable at `hi`; see §VIII.3's low-endpoint note.
|
|
121
|
+
if (flo === 0)
|
|
122
|
+
return lo;
|
|
123
|
+
if (fhi === 0)
|
|
124
|
+
return hi;
|
|
125
|
+
for (let i = 0; i < IRR_MAX_ITER; i++) {
|
|
126
|
+
const mid = (lo + hi) / 2;
|
|
127
|
+
const fmid = f(mid);
|
|
128
|
+
if (Math.abs(fmid) < IRR_VALUE_TOL || (hi - lo) / 2 < IRR_INTERVAL_TOL)
|
|
129
|
+
return mid;
|
|
130
|
+
if (flo * fmid < 0) {
|
|
131
|
+
hi = mid;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
lo = mid;
|
|
135
|
+
flo = fmid;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
throw new CalcError('CALC-XIRR-DIVERGE', `xirr: bisection did not meet a stopping condition within ${IRR_MAX_ITER} iterations.`);
|
|
139
|
+
}
|
|
140
|
+
// ─── Verification ────────────────────────────────────────────────────────────
|
|
141
|
+
/**
|
|
142
|
+
* Recompute every stated metric and report a three-state verdict:
|
|
143
|
+
* - a metric disagrees beyond its quantum, or the procedure refuses a
|
|
144
|
+
* stated value outright → `failed`
|
|
145
|
+
* - a metric cannot be recomputed from what is stated (structurally broken
|
|
146
|
+
* series, MOIC with no outflows) → `unverifiable`
|
|
147
|
+
* - otherwise → `verified`
|
|
148
|
+
*
|
|
149
|
+
* The closed recompute vocabulary (§4.26 / §VIII.9.4):
|
|
150
|
+
* - `total_net` = Σ amount (currency quantum)
|
|
151
|
+
* - `moic` = Σ inflows ÷ |Σ outflows| (ratio quantum; no outflows → unverifiable)
|
|
152
|
+
* - `xnpv.value` = §VIII.9.2 at the stated rate (currency quantum)
|
|
153
|
+
* - `xirr` = §VIII.9.3 (rate quantum; a procedure refusal is `failed` —
|
|
154
|
+
* the document asserts a number the procedure cannot produce)
|
|
155
|
+
*
|
|
156
|
+
* A `verified` series means the stated metrics follow deterministically from
|
|
157
|
+
* the stated rows. It does not mean the projection is achievable.
|
|
158
|
+
*/
|
|
159
|
+
export function verifyCashFlowSeries(series) {
|
|
160
|
+
const issues = [];
|
|
161
|
+
const stated = series.stated_metrics;
|
|
162
|
+
if (!stated)
|
|
163
|
+
return { verdict: 'verified', issues };
|
|
164
|
+
const statedMetrics = ['total_net', 'moic', 'xnpv', 'xirr'].filter((m) => {
|
|
165
|
+
const v = stated[m];
|
|
166
|
+
return v !== undefined && v !== null;
|
|
167
|
+
});
|
|
168
|
+
if (statedMetrics.length === 0)
|
|
169
|
+
return { verdict: 'verified', issues };
|
|
170
|
+
const flows = datedFlowsOf(series);
|
|
171
|
+
if (flows === null) {
|
|
172
|
+
for (const metric of statedMetrics) {
|
|
173
|
+
issues.push({
|
|
174
|
+
code: 'CF-UNEVALUABLE',
|
|
175
|
+
severity: 'indeterminate',
|
|
176
|
+
metric,
|
|
177
|
+
message: `stated_metrics.${metric} is stated but the series is structurally invalid (CF-01/CF-02), so it cannot be verified.`,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
return { verdict: 'unverifiable', issues };
|
|
181
|
+
}
|
|
182
|
+
if (isNum(stated.total_net)) {
|
|
183
|
+
const dp = CASH_FLOW_VERIFY_DECIMALS.currency;
|
|
184
|
+
const recomputed = roundTo(flows.reduce((acc, f) => acc + f.amount, 0), dp);
|
|
185
|
+
const claim = roundTo(stated.total_net, dp);
|
|
186
|
+
if (claim !== recomputed) {
|
|
187
|
+
issues.push({
|
|
188
|
+
code: 'CF-METRIC-DISAGREES',
|
|
189
|
+
severity: 'failure',
|
|
190
|
+
metric: 'total_net',
|
|
191
|
+
message: `stated_metrics.total_net states ${stated.total_net} but the series sums to ${recomputed}.`,
|
|
192
|
+
expected: String(claim),
|
|
193
|
+
actual: String(recomputed),
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (isNum(stated.moic)) {
|
|
198
|
+
let inflows = 0;
|
|
199
|
+
let outflows = 0;
|
|
200
|
+
for (const f of flows) {
|
|
201
|
+
if (f.amount >= 0)
|
|
202
|
+
inflows += f.amount;
|
|
203
|
+
else
|
|
204
|
+
outflows += -f.amount;
|
|
205
|
+
}
|
|
206
|
+
if (outflows === 0) {
|
|
207
|
+
issues.push({
|
|
208
|
+
code: 'CF-UNEVALUABLE',
|
|
209
|
+
severity: 'indeterminate',
|
|
210
|
+
metric: 'moic',
|
|
211
|
+
message: 'stated_metrics.moic is stated but the series has no outflows, so the multiple is undefined and cannot be verified.',
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
const dp = CASH_FLOW_VERIFY_DECIMALS.ratio;
|
|
216
|
+
const recomputed = roundTo(inflows / outflows, dp);
|
|
217
|
+
const claim = roundTo(stated.moic, dp);
|
|
218
|
+
if (claim !== recomputed) {
|
|
219
|
+
issues.push({
|
|
220
|
+
code: 'CF-METRIC-DISAGREES',
|
|
221
|
+
severity: 'failure',
|
|
222
|
+
metric: 'moic',
|
|
223
|
+
message: `stated_metrics.moic states ${stated.moic} but the series recomputes to ${recomputed}.`,
|
|
224
|
+
expected: String(claim),
|
|
225
|
+
actual: String(recomputed),
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
const xnpvClaim = stated.xnpv;
|
|
231
|
+
if (xnpvClaim && isNum(xnpvClaim.rate) && isNum(xnpvClaim.value)) {
|
|
232
|
+
try {
|
|
233
|
+
const dp = CASH_FLOW_VERIFY_DECIMALS.currency;
|
|
234
|
+
const recomputed = roundTo(xnpvOf(flows, xnpvClaim.rate), dp);
|
|
235
|
+
const claim = roundTo(xnpvClaim.value, dp);
|
|
236
|
+
if (claim !== recomputed) {
|
|
237
|
+
issues.push({
|
|
238
|
+
code: 'CF-METRIC-DISAGREES',
|
|
239
|
+
severity: 'failure',
|
|
240
|
+
metric: 'xnpv',
|
|
241
|
+
message: `stated_metrics.xnpv.value states ${xnpvClaim.value} at rate ${xnpvClaim.rate} but §VIII.9.2 recomputes to ${recomputed}.`,
|
|
242
|
+
expected: String(claim),
|
|
243
|
+
actual: String(recomputed),
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
catch (e) {
|
|
248
|
+
issues.push({
|
|
249
|
+
code: 'CF-PROCEDURE-REFUSES',
|
|
250
|
+
severity: 'failure',
|
|
251
|
+
metric: 'xnpv',
|
|
252
|
+
message: `stated_metrics.xnpv states a value the §VIII.9.2 procedure refuses: ${e instanceof Error ? e.message : String(e)}`,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
else if (xnpvClaim) {
|
|
257
|
+
issues.push({
|
|
258
|
+
code: 'CF-UNEVALUABLE',
|
|
259
|
+
severity: 'indeterminate',
|
|
260
|
+
metric: 'xnpv',
|
|
261
|
+
message: 'stated_metrics.xnpv must state both a finite rate and value to be verifiable.',
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
if (isNum(stated.xirr)) {
|
|
265
|
+
try {
|
|
266
|
+
const dp = CASH_FLOW_VERIFY_DECIMALS.rate;
|
|
267
|
+
const recomputed = roundTo(xirrOf(flows), dp);
|
|
268
|
+
const claim = roundTo(stated.xirr, dp);
|
|
269
|
+
if (claim !== recomputed) {
|
|
270
|
+
issues.push({
|
|
271
|
+
code: 'CF-METRIC-DISAGREES',
|
|
272
|
+
severity: 'failure',
|
|
273
|
+
metric: 'xirr',
|
|
274
|
+
message: `stated_metrics.xirr states ${stated.xirr} but §VIII.9.3 recomputes to ${recomputed}.`,
|
|
275
|
+
expected: String(claim),
|
|
276
|
+
actual: String(recomputed),
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch (e) {
|
|
281
|
+
// The document asserts a number the procedure cannot produce (§4.26).
|
|
282
|
+
issues.push({
|
|
283
|
+
code: 'CF-PROCEDURE-REFUSES',
|
|
284
|
+
severity: 'failure',
|
|
285
|
+
metric: 'xirr',
|
|
286
|
+
message: `stated_metrics.xirr states a value the §VIII.9.3 procedure refuses: ${e instanceof Error ? e.message : String(e)}`,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (issues.some((i) => i.severity === 'failure')) {
|
|
291
|
+
return { verdict: 'failed', issues };
|
|
292
|
+
}
|
|
293
|
+
if (issues.some((i) => i.severity === 'indeterminate')) {
|
|
294
|
+
return { verdict: 'unverifiable', issues };
|
|
295
|
+
}
|
|
296
|
+
return { verdict: 'verified', issues };
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=cash-flow-series.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cash-flow-series.js","sourceRoot":"","sources":["../src/cash-flow-series.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
type Flags = Record<string, string | boolean>;
|
|
2
|
+
/** `uwmd portfolio validate <sidecar.uwportfolio.json> [--json]` */
|
|
3
|
+
export declare function cmdPortfolioValidate(path: string, flags: Flags): void;
|
|
4
|
+
/** `uwmd portfolio edges <sidecar.uwportfolio.json> [--entity <id>] [--json]` */
|
|
5
|
+
export declare function cmdPortfolioEdges(path: string, flags: Flags): void;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=cli-portfolio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-portfolio.d.ts","sourceRoot":"","sources":["../src/cli-portfolio.ts"],"names":[],"mappings":"AAgBA,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;AAY9C,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAyBrE;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAkBlE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// CLI commands for RFC 0015: portfolio & relationship profile sidecars.
|
|
2
|
+
//
|
|
3
|
+
// Node-side commands reached only through the CLI entry point, never from
|
|
4
|
+
// browser.ts. Split from cli-packages.ts because that file is the RFC 0018
|
|
5
|
+
// surface and this is a different RFC's; both follow the same conventions.
|
|
6
|
+
import { readFileSync } from 'node:fs';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
8
|
+
import { validatePortfolioProfile, uninterpretedPortfolioTypes, getPortfolioRelationships, } from './portfolio.js';
|
|
9
|
+
function readJSONFile(path) {
|
|
10
|
+
return JSON.parse(readFileSync(resolve(path), 'utf-8'));
|
|
11
|
+
}
|
|
12
|
+
function printErrors(errors) {
|
|
13
|
+
for (const e of errors) {
|
|
14
|
+
console.log(` ${e.code}${e.pointer ? ` [${e.pointer}]` : ''} ${e.message}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** `uwmd portfolio validate <sidecar.uwportfolio.json> [--json]` */
|
|
18
|
+
export function cmdPortfolioValidate(path, flags) {
|
|
19
|
+
const candidate = readJSONFile(path);
|
|
20
|
+
const errors = validatePortfolioProfile(candidate);
|
|
21
|
+
const uninterpreted = errors.length === 0
|
|
22
|
+
? uninterpretedPortfolioTypes(candidate)
|
|
23
|
+
: { entity_types: [], edge_types: [] };
|
|
24
|
+
if (flags['json']) {
|
|
25
|
+
console.log(JSON.stringify({ ok: errors.length === 0, errors, uninterpreted }, null, 2));
|
|
26
|
+
}
|
|
27
|
+
else if (errors.length === 0) {
|
|
28
|
+
const profile = candidate;
|
|
29
|
+
console.log(`OK — ${profile.entities.length} entities, ${profile.edges.length} edges.`);
|
|
30
|
+
for (const [label, types] of [
|
|
31
|
+
['entity', uninterpreted.entity_types],
|
|
32
|
+
['edge', uninterpreted.edge_types],
|
|
33
|
+
]) {
|
|
34
|
+
if (types.length > 0) {
|
|
35
|
+
console.log(` note: uninterpreted ${label} type(s) preserved: ${types.join(', ')}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
console.log(`INVALID — ${errors.length} error(s):`);
|
|
41
|
+
printErrors(errors);
|
|
42
|
+
}
|
|
43
|
+
if (errors.length > 0)
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
/** `uwmd portfolio edges <sidecar.uwportfolio.json> [--entity <id>] [--json]` */
|
|
47
|
+
export function cmdPortfolioEdges(path, flags) {
|
|
48
|
+
const candidate = readJSONFile(path);
|
|
49
|
+
const errors = validatePortfolioProfile(candidate);
|
|
50
|
+
if (errors.length > 0) {
|
|
51
|
+
console.error(`Refusing to project an invalid profile — run \`uwmd portfolio validate ${path}\`.`);
|
|
52
|
+
printErrors(errors);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
const entityId = typeof flags['entity'] === 'string' ? flags['entity'] : undefined;
|
|
56
|
+
const edges = getPortfolioRelationships(candidate, entityId);
|
|
57
|
+
if (flags['json']) {
|
|
58
|
+
console.log(JSON.stringify(edges, null, 2));
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
for (const e of edges) {
|
|
62
|
+
console.log(`${e.id}: ${e.from} —${e.type}→ ${e.to} (${e.provenance.length} provenance)`);
|
|
63
|
+
}
|
|
64
|
+
if (edges.length === 0)
|
|
65
|
+
console.log('(no edges)');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=cli-portfolio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-portfolio.js","sourceRoot":"","sources":["../src/cli-portfolio.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -21,6 +21,7 @@ import { migrateToV2 } from './migrate-to-v2.js';
|
|
|
21
21
|
import { REFERENCE_IMPLEMENTATION_MANIFEST } from './protocol.js';
|
|
22
22
|
import { loadModuleManifest, createModuleRegistry, ModuleRegistryError } from './modules.js';
|
|
23
23
|
import { cmdLeaseValidate, cmdLeaseProject, cmdPackageCreate, cmdPackageVerify, cmdPackageList, cmdPackageToContext, cmdPackageContextValidate, cmdPackageEdges, } from './cli-packages.js';
|
|
24
|
+
import { cmdPortfolioValidate, cmdPortfolioEdges } from './cli-portfolio.js';
|
|
24
25
|
import { evaluateCalc } from './calc/index.js';
|
|
25
26
|
import { buildAgentContext, buildAgentPrompt, isContextReady, BANCROFT_LAYERS } from './context.js';
|
|
26
27
|
import { runBancroftAgent } from './agents/bancroft.js';
|
|
@@ -393,7 +394,13 @@ function cmdDiff(fileA, fileB) {
|
|
|
393
394
|
console.log('');
|
|
394
395
|
}
|
|
395
396
|
function cmdInit(flags) {
|
|
397
|
+
const requestedFormat = flags['format'];
|
|
398
|
+
if (requestedFormat !== undefined && requestedFormat !== '2.0' && requestedFormat !== '1.1') {
|
|
399
|
+
console.error(`--format must be '2.0' (default, nested _meta) or '1.1' (legacy flat shape); got '${requestedFormat}'.`);
|
|
400
|
+
process.exit(1);
|
|
401
|
+
}
|
|
396
402
|
const content = generateBlankUWFile({
|
|
403
|
+
formatVersion: requestedFormat,
|
|
397
404
|
dealName: flags['name'],
|
|
398
405
|
address: flags['address'],
|
|
399
406
|
city: flags['city'],
|
|
@@ -1554,6 +1561,29 @@ function withResolved(parsed, file, flags) {
|
|
|
1554
1561
|
// surrounding prose so a driver can read it without a parser.
|
|
1555
1562
|
console.log(JSON.stringify(REFERENCE_IMPLEMENTATION_MANIFEST, null, 2));
|
|
1556
1563
|
break;
|
|
1564
|
+
case 'portfolio': {
|
|
1565
|
+
const sub = positional[0];
|
|
1566
|
+
const target = positional[1];
|
|
1567
|
+
if (sub === 'validate') {
|
|
1568
|
+
if (!target) {
|
|
1569
|
+
console.error('Usage: uwmd portfolio validate <sidecar.uwportfolio.json> [--json]');
|
|
1570
|
+
process.exit(1);
|
|
1571
|
+
}
|
|
1572
|
+
cmdPortfolioValidate(target, flags);
|
|
1573
|
+
}
|
|
1574
|
+
else if (sub === 'edges') {
|
|
1575
|
+
if (!target) {
|
|
1576
|
+
console.error('Usage: uwmd portfolio edges <sidecar.uwportfolio.json> [--entity <id>] [--json]');
|
|
1577
|
+
process.exit(1);
|
|
1578
|
+
}
|
|
1579
|
+
cmdPortfolioEdges(target, flags);
|
|
1580
|
+
}
|
|
1581
|
+
else {
|
|
1582
|
+
console.error('Usage: uwmd portfolio <validate|edges> <sidecar.uwportfolio.json>');
|
|
1583
|
+
process.exit(1);
|
|
1584
|
+
}
|
|
1585
|
+
break;
|
|
1586
|
+
}
|
|
1557
1587
|
case 'receipt': {
|
|
1558
1588
|
const sub = positional[0];
|
|
1559
1589
|
if (sub === 'issue') {
|
|
@@ -1609,6 +1639,7 @@ Commands:
|
|
|
1609
1639
|
modules validate|list Validate module manifest files, or list the registry they form
|
|
1610
1640
|
lease validate|project Validate a lease abstract, or project it to a rent-roll row (RFC 0018)
|
|
1611
1641
|
package create|verify|... Build, verify, list, or project a UW Deal Package (RFC 0018)
|
|
1642
|
+
portfolio validate|edges Validate a .uwportfolio.json sidecar, or list its entity edges (RFC 0015)
|
|
1612
1643
|
manifest Print this implementation's ImplementationManifest (conformance protocol)
|
|
1613
1644
|
layers List Bancroft agent layers
|
|
1614
1645
|
|