@transitrix/diagrams 1.0.0 → 1.0.1
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/LICENSE +21 -21
- package/README.md +47 -47
- package/dist/__tests__/edge-path.test.js +8 -0
- package/dist/activity-card/__tests__/example.test.js +20 -1
- package/dist/activity-card/__tests__/layout.test.js +102 -11
- package/dist/activity-card/__tests__/resolver.test.js +139 -6
- package/dist/activity-card/index.d.ts +1 -1
- package/dist/activity-card/layout.d.ts +1 -1
- package/dist/activity-card/layout.js +220 -103
- package/dist/activity-card/resolver.js +107 -26
- package/dist/activity-card/types.d.ts +150 -27
- package/dist/activity-card/validate.js +3 -0
- package/dist/actor/__tests__/validate.test.js +63 -31
- package/dist/actor/index.d.ts +1 -1
- package/dist/actor/index.js +1 -1
- package/dist/actor/types.d.ts +7 -3
- package/dist/actor/types.js +17 -3
- package/dist/actor/validate.js +55 -26
- package/dist/assertion/types.d.ts +3 -1
- package/dist/assertion/types.js +1 -1
- package/dist/change/__tests__/validate.test.js +40 -34
- package/dist/change/index.d.ts +1 -0
- package/dist/change/types.d.ts +1 -1
- package/dist/change/types.js +2 -2
- package/dist/change/validate.d.ts +6 -1
- package/dist/change/validate.js +68 -41
- package/dist/compliance/__tests__/classify.test.js +34 -0
- package/dist/compliance/__tests__/coverage-metric.test.js +146 -46
- package/dist/compliance/__tests__/html.test.js +2 -2
- package/dist/compliance/__tests__/impact.test.js +311 -6
- package/dist/compliance/classify.d.ts +6 -0
- package/dist/compliance/classify.js +9 -1
- package/dist/compliance/coverage-metric.d.ts +31 -11
- package/dist/compliance/coverage-metric.js +149 -39
- package/dist/compliance/html.js +77 -74
- package/dist/compliance/impact.d.ts +77 -16
- package/dist/compliance/impact.js +193 -25
- package/dist/compliance/index.d.ts +2 -2
- package/dist/compliance/index.js +1 -1
- package/dist/compliance/markdown.js +1 -0
- package/dist/compliance/types.d.ts +25 -6
- package/dist/edge-path.d.ts +8 -4
- package/dist/edge-path.js +11 -6
- package/dist/factor/__tests__/validate.test.js +74 -45
- package/dist/factor/index.d.ts +3 -2
- package/dist/factor/index.js +1 -1
- package/dist/factor/types.d.ts +4 -7
- package/dist/factor/types.js +10 -5
- package/dist/factor/validate.d.ts +6 -1
- package/dist/factor/validate.js +68 -50
- package/dist/fgca/__tests__/resolver.test.js +185 -0
- package/dist/fgca/index.d.ts +2 -0
- package/dist/fgca/index.js +1 -0
- package/dist/fgca/resolver.d.ts +49 -0
- package/dist/fgca/resolver.js +124 -0
- package/dist/goals/index.d.ts +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/process-blueprint/__tests__/layout.test.js +37 -0
- package/dist/process-blueprint/layout.js +5 -1
- package/dist/process-blueprint/types.d.ts +22 -1
- package/dist/stakeholder/__tests__/validate.test.js +49 -47
- package/dist/stakeholder/index.d.ts +1 -0
- package/dist/stakeholder/types.d.ts +3 -4
- package/dist/stakeholder/types.js +2 -3
- package/dist/stakeholder/validate.d.ts +6 -1
- package/dist/stakeholder/validate.js +71 -50
- package/dist/target-state/__tests__/validate.test.js +43 -27
- package/dist/target-state/index.d.ts +2 -0
- package/dist/target-state/index.js +1 -0
- package/dist/target-state/types.d.ts +6 -1
- package/dist/target-state/types.js +8 -7
- package/dist/target-state/validate.d.ts +6 -1
- package/dist/target-state/validate.js +69 -45
- package/dist/theme/themes.js +69 -69
- package/dist/webview/__tests__/entry.test.js +11 -11
- package/dist/webview/render-activities.d.ts +3 -1
- package/dist/webview/render-activities.js +2 -2
- package/dist/webview/render-activity-card.js +104 -77
- package/dist/webview/render-fgca.d.ts +4 -0
- package/dist/webview/render-fgca.js +2 -5
- package/dist/webview/render-goals.d.ts +1 -0
- package/dist/webview/render-goals.js +15 -15
- package/dist/webview/render-process-blueprint.js +10 -10
- package/package.json +40 -40
- package/src/__tests__/edge-path.test.ts +58 -46
- package/src/__tests__/scope.test.ts +27 -27
- package/src/__tests__/yaml-normalize.test.ts +158 -158
- package/src/activities/__tests__/cpm.test.ts +164 -164
- package/src/activities/__tests__/gantt.test.ts +245 -245
- package/src/activities/__tests__/layout.test.ts +112 -112
- package/src/activities/__tests__/validate.test.ts +409 -409
- package/src/activities/cpm.ts +95 -95
- package/src/activities/gantt.ts +276 -276
- package/src/activities/index.ts +28 -28
- package/src/activities/layout.ts +112 -112
- package/src/activities/types.ts +148 -148
- package/src/activities/validate.ts +357 -357
- package/src/activity-card/__tests__/example.test.ts +85 -66
- package/src/activity-card/__tests__/layout.test.ts +169 -63
- package/src/activity-card/__tests__/resolver.test.ts +307 -161
- package/src/activity-card/__tests__/validate.test.ts +131 -131
- package/src/activity-card/index.ts +38 -32
- package/src/activity-card/layout.ts +324 -194
- package/src/activity-card/resolver.ts +415 -337
- package/src/activity-card/types.ts +376 -237
- package/src/activity-card/validate.ts +162 -158
- package/src/actor/__tests__/validate.test.ts +70 -31
- package/src/actor/index.ts +1 -1
- package/src/actor/types.ts +21 -7
- package/src/actor/validate.ts +59 -27
- package/src/applications/__tests__/validate.test.ts +256 -256
- package/src/applications/index.ts +11 -11
- package/src/applications/types.ts +43 -43
- package/src/applications/validate.ts +131 -131
- package/src/assertion/__tests__/example.test.ts +37 -37
- package/src/assertion/__tests__/validate.test.ts +142 -142
- package/src/assertion/index.ts +12 -12
- package/src/assertion/types.ts +60 -58
- package/src/assertion/validate.ts +145 -145
- package/src/blocks/__tests__/layout.test.ts +169 -169
- package/src/blocks/__tests__/validate.test.ts +260 -260
- package/src/blocks/index.ts +17 -17
- package/src/blocks/layout.ts +186 -186
- package/src/blocks/types.ts +62 -62
- package/src/blocks/validate.ts +206 -206
- package/src/capability-map/__tests__/validate.test.ts +238 -238
- package/src/capability-map/index.ts +8 -8
- package/src/capability-map/types.ts +29 -29
- package/src/capability-map/validate.ts +127 -127
- package/src/change/__tests__/validate.test.ts +43 -34
- package/src/change/index.ts +1 -0
- package/src/change/types.ts +5 -3
- package/src/change/validate.ts +75 -43
- package/src/compliance/__tests__/classify.test.ts +64 -27
- package/src/compliance/__tests__/confidence.test.ts +98 -98
- package/src/compliance/__tests__/coverage-metric.test.ts +300 -188
- package/src/compliance/__tests__/demo-scenario.test.ts +273 -273
- package/src/compliance/__tests__/example.test.ts +57 -57
- package/src/compliance/__tests__/gap-report.test.ts +128 -128
- package/src/compliance/__tests__/html.test.ts +141 -141
- package/src/compliance/__tests__/impact.test.ts +840 -481
- package/src/compliance/__tests__/markdown.test.ts +94 -94
- package/src/compliance/__tests__/views.test.ts +64 -64
- package/src/compliance/classify.ts +100 -84
- package/src/compliance/confidence.ts +69 -69
- package/src/compliance/coverage-metric.ts +404 -263
- package/src/compliance/gap-report.ts +94 -94
- package/src/compliance/html.ts +298 -295
- package/src/compliance/impact.ts +861 -677
- package/src/compliance/index.ts +57 -56
- package/src/compliance/markdown.ts +136 -135
- package/src/compliance/reverse-index.ts +33 -33
- package/src/compliance/types.ts +136 -120
- package/src/compliance/views.ts +46 -46
- package/src/compliance-matrix/__tests__/build.test.ts +200 -200
- package/src/compliance-matrix/__tests__/example.test.ts +57 -57
- package/src/compliance-matrix/index.ts +11 -11
- package/src/compliance-matrix/types.ts +102 -102
- package/src/edge-path.ts +50 -44
- package/src/factor/__tests__/validate.test.ts +80 -45
- package/src/factor/index.ts +3 -7
- package/src/factor/types.ts +14 -18
- package/src/factor/validate.ts +77 -51
- package/src/fgca/__tests__/chain-table.test.ts +172 -172
- package/src/fgca/__tests__/layout.test.ts +179 -179
- package/src/fgca/__tests__/parse-canonical.test.ts +248 -248
- package/src/fgca/__tests__/preview-layout.test.ts +124 -124
- package/src/fgca/__tests__/resolver.test.ts +209 -0
- package/src/fgca/__tests__/validate.test.ts +142 -142
- package/src/fgca/chain-table.ts +225 -225
- package/src/fgca/index.ts +47 -45
- package/src/fgca/layout.ts +204 -204
- package/src/fgca/nodeTypes.ts +11 -11
- package/src/fgca/nodes/FGCAActivityNode.tsx +65 -65
- package/src/fgca/nodes/FGCAChangeNode.tsx +64 -64
- package/src/fgca/nodes/FGCAFactorNode.tsx +64 -64
- package/src/fgca/nodes/FGCAGoalNode.tsx +72 -72
- package/src/fgca/parse-canonical.ts +400 -400
- package/src/fgca/preview-layout.ts +217 -217
- package/src/fgca/resolver.ts +157 -0
- package/src/fgca/types.ts +50 -50
- package/src/fgca/validate.ts +126 -126
- package/src/geometry.ts +9 -9
- package/src/goals/__tests__/layout.test.ts +175 -175
- package/src/goals/__tests__/mutations.test.ts +111 -111
- package/src/goals/__tests__/parse-canonical.test.ts +145 -145
- package/src/goals/__tests__/validate.test.ts +202 -202
- package/src/goals/index.ts +20 -21
- package/src/goals/layout.ts +172 -172
- package/src/goals/mutations.ts +123 -123
- package/src/goals/parse-canonical.ts +286 -286
- package/src/goals/types.ts +85 -85
- package/src/goals/validate.ts +136 -136
- package/src/index.ts +28 -23
- package/src/process-blueprint/__tests__/compliance-lane.test.ts +320 -320
- package/src/process-blueprint/__tests__/layout.test.ts +240 -195
- package/src/process-blueprint/__tests__/validate.test.ts +310 -310
- package/src/process-blueprint/index.ts +31 -31
- package/src/process-blueprint/layout.ts +535 -531
- package/src/process-blueprint/types.ts +263 -242
- package/src/process-blueprint/validate.ts +181 -181
- package/src/process-map/__tests__/validate.test.ts +223 -223
- package/src/process-map/index.ts +10 -10
- package/src/process-map/types.ts +36 -36
- package/src/process-map/validate.ts +135 -135
- package/src/products/__tests__/validate.test.ts +239 -239
- package/src/products/index.ts +9 -9
- package/src/products/types.ts +31 -31
- package/src/products/validate.ts +112 -112
- package/src/repo-validate/__tests__/validate-repo.test.ts +149 -149
- package/src/repo-validate/index.ts +2 -2
- package/src/repo-validate/types.ts +50 -50
- package/src/repo-validate/validate-repo.ts +196 -196
- package/src/requirement/__tests__/example.test.ts +24 -24
- package/src/requirement/__tests__/validate.test.ts +96 -96
- package/src/requirement/index.ts +4 -4
- package/src/requirement/types.ts +35 -35
- package/src/requirement/validate.ts +92 -92
- package/src/scenarios/__tests__/validate.test.ts +209 -209
- package/src/scenarios/index.ts +15 -15
- package/src/scenarios/types.ts +37 -37
- package/src/scenarios/validate.ts +122 -122
- package/src/schema-version.ts +16 -16
- package/src/scope.ts +46 -46
- package/src/stakeholder/__tests__/validate.test.ts +51 -47
- package/src/stakeholder/index.ts +1 -0
- package/src/stakeholder/types.ts +7 -7
- package/src/stakeholder/validate.ts +79 -52
- package/src/target-state/__tests__/validate.test.ts +48 -27
- package/src/target-state/index.ts +2 -0
- package/src/target-state/types.ts +11 -7
- package/src/target-state/validate.ts +76 -46
- package/src/theme/index.ts +4 -4
- package/src/theme/themes.ts +237 -237
- package/src/theme/tokens.ts +133 -133
- package/src/typed-id.ts +56 -56
- package/src/validation-types.ts +36 -36
- package/src/webview/__tests__/entry-notations.test.ts +77 -77
- package/src/webview/__tests__/entry.test.ts +64 -64
- package/src/webview/__tests__/render-goals.test.ts +72 -72
- package/src/webview/entry.ts +292 -292
- package/src/webview/render-activities.ts +5 -3
- package/src/webview/render-activity-card.ts +266 -234
- package/src/webview/render-fgca.ts +6 -5
- package/src/webview/render-goals.ts +111 -110
- package/src/webview/render-process-blueprint.ts +207 -207
- package/src/webview/styles.css +322 -323
- package/src/yaml-normalize.ts +56 -56
- package/dist/element-envelope.d.ts +0 -15
- package/dist/element-envelope.js +0 -55
- package/dist/issues/__tests__/layout.test.js +0 -62
- package/dist/issues/__tests__/validate.test.d.ts +0 -1
- package/dist/issues/__tests__/validate.test.js +0 -82
- package/dist/issues/index.d.ts +0 -4
- package/dist/issues/index.js +0 -2
- package/dist/issues/layout.d.ts +0 -10
- package/dist/issues/layout.js +0 -82
- package/dist/issues/types.d.ts +0 -61
- package/dist/issues/types.js +0 -6
- package/dist/issues/validate.d.ts +0 -3
- package/dist/issues/validate.js +0 -143
- package/dist/webview/transitrix-render.css +0 -323
- package/dist/webview/transitrix-render.js +0 -6452
- package/dist/webview/transitrix-render.js.map +0 -7
- package/src/element-envelope.ts +0 -76
- /package/dist/{issues/__tests__/layout.test.d.ts → fgca/__tests__/resolver.test.d.ts} +0 -0
package/src/compliance/types.ts
CHANGED
|
@@ -1,120 +1,136 @@
|
|
|
1
|
-
// Shared compliance reverse-index + derived views (vkgeorgia/strategy#84
|
|
2
|
-
// Phase 3). The reverse-index pass (Law → Requirements, Requirement →
|
|
3
|
-
// Assertions, Subject → Assertions) backs the single-law tree and the
|
|
4
|
-
// single-product view here, and the gap dashboard in Phase 4.
|
|
5
|
-
|
|
6
|
-
import type { AssertionStatus } from '../assertion/types.js';
|
|
7
|
-
|
|
8
|
-
/** Projection of a REQUIREMENT the compliance views need. */
|
|
9
|
-
export interface IndexRequirement {
|
|
10
|
-
id: string;
|
|
11
|
-
name: string;
|
|
12
|
-
severity?: string;
|
|
13
|
-
/** Typed IDs of the codex sources this requirement derives from. */
|
|
14
|
-
derived_from?: string[];
|
|
15
|
-
/** Admission date (CONTRACT §6) — feeds DQ-1 freshness decay. */
|
|
16
|
-
admitted_at?: string;
|
|
17
|
-
/**
|
|
18
|
-
* Compliance deadline (ISO 8601 date, YYYY-MM-DD).
|
|
19
|
-
* When a gap exists on a cell whose requirement carries a deadline that is
|
|
20
|
-
* past or imminent, CV-3 renders an urgent decoration on the cell.
|
|
21
|
-
*/
|
|
22
|
-
deadline?: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// ── Temporal status (CV-3) ──────────────────────────────────────────────────
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Temporal status of a requirement deadline relative to today.
|
|
29
|
-
*
|
|
30
|
-
* - `past_due` — deadline has already passed (`deadline < today`).
|
|
31
|
-
* - `in_force` — deadline is within the next 30 days.
|
|
32
|
-
* - `upcoming` — deadline is more than 30 days away.
|
|
33
|
-
* - `none` — no deadline set.
|
|
34
|
-
*/
|
|
35
|
-
export type DeadlineStatus = 'past_due' | 'in_force' | 'upcoming' | 'none';
|
|
36
|
-
|
|
37
|
-
/** Projection of an ASSERTION the compliance views need. */
|
|
38
|
-
export interface IndexAssertion {
|
|
39
|
-
id: string;
|
|
40
|
-
about: string;
|
|
41
|
-
subject: string;
|
|
42
|
-
status: AssertionStatus;
|
|
43
|
-
assessed_at?: string;
|
|
44
|
-
next_review_at?: string;
|
|
45
|
-
/** Number of evidence entries — feeds the Phase 4 "no evidence" gap. */
|
|
46
|
-
evidenceCount?: number;
|
|
47
|
-
/** Admission date (CONTRACT §6) — feeds DQ-1 freshness decay. */
|
|
48
|
-
admitted_at?: string;
|
|
49
|
-
/**
|
|
50
|
-
* Typed IDs of the stages / tasks where the requirement is realised for
|
|
51
|
-
* the subject (16-assertion.md §2 `realised_via`). Populated when the
|
|
52
|
-
* assertion carries granular evidence; absent when the claim covers the
|
|
53
|
-
* entire subject without stage decomposition. CV-3a uses this to fill
|
|
54
|
-
* stage-grouped matrix cells.
|
|
55
|
-
*/
|
|
56
|
-
realised_via?: string[];
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
1
|
+
// Shared compliance reverse-index + derived views (vkgeorgia/strategy#84
|
|
2
|
+
// Phase 3). The reverse-index pass (Law → Requirements, Requirement →
|
|
3
|
+
// Assertions, Subject → Assertions) backs the single-law tree and the
|
|
4
|
+
// single-product view here, and the gap dashboard in Phase 4.
|
|
5
|
+
|
|
6
|
+
import type { AssertionStatus } from '../assertion/types.js';
|
|
7
|
+
|
|
8
|
+
/** Projection of a REQUIREMENT the compliance views need. */
|
|
9
|
+
export interface IndexRequirement {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
severity?: string;
|
|
13
|
+
/** Typed IDs of the codex sources this requirement derives from. */
|
|
14
|
+
derived_from?: string[];
|
|
15
|
+
/** Admission date (CONTRACT §6) — feeds DQ-1 freshness decay. */
|
|
16
|
+
admitted_at?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Compliance deadline (ISO 8601 date, YYYY-MM-DD).
|
|
19
|
+
* When a gap exists on a cell whose requirement carries a deadline that is
|
|
20
|
+
* past or imminent, CV-3 renders an urgent decoration on the cell.
|
|
21
|
+
*/
|
|
22
|
+
deadline?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// ── Temporal status (CV-3) ──────────────────────────────────────────────────
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Temporal status of a requirement deadline relative to today.
|
|
29
|
+
*
|
|
30
|
+
* - `past_due` — deadline has already passed (`deadline < today`).
|
|
31
|
+
* - `in_force` — deadline is within the next 30 days.
|
|
32
|
+
* - `upcoming` — deadline is more than 30 days away.
|
|
33
|
+
* - `none` — no deadline set.
|
|
34
|
+
*/
|
|
35
|
+
export type DeadlineStatus = 'past_due' | 'in_force' | 'upcoming' | 'none';
|
|
36
|
+
|
|
37
|
+
/** Projection of an ASSERTION the compliance views need. */
|
|
38
|
+
export interface IndexAssertion {
|
|
39
|
+
id: string;
|
|
40
|
+
about: string;
|
|
41
|
+
subject: string;
|
|
42
|
+
status: AssertionStatus;
|
|
43
|
+
assessed_at?: string;
|
|
44
|
+
next_review_at?: string;
|
|
45
|
+
/** Number of evidence entries — feeds the Phase 4 "no evidence" gap. */
|
|
46
|
+
evidenceCount?: number;
|
|
47
|
+
/** Admission date (CONTRACT §6) — feeds DQ-1 freshness decay. */
|
|
48
|
+
admitted_at?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Typed IDs of the stages / tasks where the requirement is realised for
|
|
51
|
+
* the subject (16-assertion.md §2 `realised_via`). Populated when the
|
|
52
|
+
* assertion carries granular evidence; absent when the claim covers the
|
|
53
|
+
* entire subject without stage decomposition. CV-3a uses this to fill
|
|
54
|
+
* stage-grouped matrix cells.
|
|
55
|
+
*/
|
|
56
|
+
realised_via?: string[];
|
|
57
|
+
/** ID or name of the party who must confirm this assertion (pending-owner state). */
|
|
58
|
+
owner_to_confirm?: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// ── Stage grouping (CV-3a) ──────────────────────────────────────────────────
|
|
62
|
+
|
|
63
|
+
/** One stage (or task) element of a business object, used as a matrix sub-column. */
|
|
64
|
+
export interface ObjectDetailDef {
|
|
65
|
+
id: string;
|
|
66
|
+
name: string;
|
|
67
|
+
/**
|
|
68
|
+
* Ordered task-type flow steps within this stage.
|
|
69
|
+
* Present only when `grouping.columns: product-stage-task` grain is active.
|
|
70
|
+
* Each task produces a separate matrix column: (subject, stageId, taskId).
|
|
71
|
+
* When absent or empty, the stage itself is the column grain.
|
|
72
|
+
*/
|
|
73
|
+
tasks?: Array<{ id: string; name: string }>;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Maps a business object to its ordered stages (and optionally their tasks).
|
|
78
|
+
* Passed into `buildImpactMatrix` to enable stage/task column grouping.
|
|
79
|
+
*
|
|
80
|
+
* - For `grouping.columns: product-stage`: `details` contains stages; each
|
|
81
|
+
* stage becomes one matrix column.
|
|
82
|
+
* - For `grouping.columns: product-stage-task`: each stage in `details` carries
|
|
83
|
+
* a `tasks` array; each task produces a `(subject, stage, task)` column.
|
|
84
|
+
* Stages with no tasks fall back to a stage-grain column.
|
|
85
|
+
*
|
|
86
|
+
* Typically built by combining `extractObjectDetails` (blueprint stages) and
|
|
87
|
+
* `extractProcessFlowTasks` (process flow tasks), then merging via
|
|
88
|
+
* `mergeStageTaskDetails`.
|
|
89
|
+
*/
|
|
90
|
+
export interface ObjectDetailInput {
|
|
91
|
+
objectId: string;
|
|
92
|
+
details: ObjectDetailDef[];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export interface ComplianceIndexInput {
|
|
96
|
+
requirements: IndexRequirement[];
|
|
97
|
+
assertions: IndexAssertion[];
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** The reverse-index — all maps are keyed by canonical id. */
|
|
101
|
+
export interface ComplianceIndex {
|
|
102
|
+
requirementById: Map<string, IndexRequirement>;
|
|
103
|
+
/** Codex artefact id → requirements whose `derived_from` names it. */
|
|
104
|
+
requirementsByLaw: Map<string, IndexRequirement[]>;
|
|
105
|
+
/** Requirement id → assertions whose `about` names it. */
|
|
106
|
+
assertionsByRequirement: Map<string, IndexAssertion[]>;
|
|
107
|
+
/** Subject id (product / process / capability) → assertions about it. */
|
|
108
|
+
assertionsBySubject: Map<string, IndexAssertion[]>;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ── Single-law tree ─────────────────────────────────────────────────────────
|
|
112
|
+
|
|
113
|
+
export interface LawTreeRequirement {
|
|
114
|
+
requirement: IndexRequirement;
|
|
115
|
+
/** Assertions targeting this requirement, id-sorted. */
|
|
116
|
+
assertions: IndexAssertion[];
|
|
117
|
+
}
|
|
118
|
+
export interface LawTree {
|
|
119
|
+
lawId: string;
|
|
120
|
+
/** Requirements derived from the law, id-sorted. */
|
|
121
|
+
requirements: LawTreeRequirement[];
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ── Single-product view ─────────────────────────────────────────────────────
|
|
125
|
+
|
|
126
|
+
export interface ProductRequirementStatus {
|
|
127
|
+
/** The requirement the assertion is about. `name` falls back to the id when
|
|
128
|
+
* the requirement is not present in the scan (dangling `about`). */
|
|
129
|
+
requirement: IndexRequirement;
|
|
130
|
+
assertion: IndexAssertion;
|
|
131
|
+
}
|
|
132
|
+
export interface ProductView {
|
|
133
|
+
productId: string;
|
|
134
|
+
/** Requirements bound to the product via an assertion, requirement-id-sorted. */
|
|
135
|
+
requirements: ProductRequirementStatus[];
|
|
136
|
+
}
|
package/src/compliance/views.ts
CHANGED
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
// Single-law tree + single-product view builders (vkgeorgia/strategy#84 Phase 3).
|
|
2
|
-
|
|
3
|
-
import type {
|
|
4
|
-
ComplianceIndex,
|
|
5
|
-
IndexRequirement,
|
|
6
|
-
LawTree,
|
|
7
|
-
ProductView,
|
|
8
|
-
} from './types.js';
|
|
9
|
-
|
|
10
|
-
function byId<T extends { id: string }>(a: T, b: T): number {
|
|
11
|
-
return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Law → Requirements → Assertions. Requirements are those whose `derived_from`
|
|
16
|
-
* names `lawId`; each carries the assertions targeting it. An unknown law (no
|
|
17
|
-
* requirement derives from it) yields an empty tree.
|
|
18
|
-
*/
|
|
19
|
-
export function buildLawTree(lawId: string, index: ComplianceIndex): LawTree {
|
|
20
|
-
const requirements = [...(index.requirementsByLaw.get(lawId) ?? [])].sort(byId);
|
|
21
|
-
return {
|
|
22
|
-
lawId,
|
|
23
|
-
requirements: requirements.map(requirement => ({
|
|
24
|
-
requirement,
|
|
25
|
-
assertions: [...(index.assertionsByRequirement.get(requirement.id) ?? [])].sort(byId),
|
|
26
|
-
})),
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Product → the Requirements it has an assertion about, with each assertion's
|
|
32
|
-
* status. The requirement is resolved from the index; a dangling `about`
|
|
33
|
-
* (assertion references a requirement not in the scan) falls back to a stub
|
|
34
|
-
* carrying the id as its name, so the binding still shows.
|
|
35
|
-
*/
|
|
36
|
-
export function buildProductView(productId: string, index: ComplianceIndex): ProductView {
|
|
37
|
-
const assertions = [...(index.assertionsBySubject.get(productId) ?? [])];
|
|
38
|
-
const requirements = assertions
|
|
39
|
-
.map(assertion => {
|
|
40
|
-
const requirement: IndexRequirement =
|
|
41
|
-
index.requirementById.get(assertion.about) ?? { id: assertion.about, name: assertion.about };
|
|
42
|
-
return { requirement, assertion };
|
|
43
|
-
})
|
|
44
|
-
.sort((a, b) => byId(a.requirement, b.requirement));
|
|
45
|
-
return { productId, requirements };
|
|
46
|
-
}
|
|
1
|
+
// Single-law tree + single-product view builders (vkgeorgia/strategy#84 Phase 3).
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
ComplianceIndex,
|
|
5
|
+
IndexRequirement,
|
|
6
|
+
LawTree,
|
|
7
|
+
ProductView,
|
|
8
|
+
} from './types.js';
|
|
9
|
+
|
|
10
|
+
function byId<T extends { id: string }>(a: T, b: T): number {
|
|
11
|
+
return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Law → Requirements → Assertions. Requirements are those whose `derived_from`
|
|
16
|
+
* names `lawId`; each carries the assertions targeting it. An unknown law (no
|
|
17
|
+
* requirement derives from it) yields an empty tree.
|
|
18
|
+
*/
|
|
19
|
+
export function buildLawTree(lawId: string, index: ComplianceIndex): LawTree {
|
|
20
|
+
const requirements = [...(index.requirementsByLaw.get(lawId) ?? [])].sort(byId);
|
|
21
|
+
return {
|
|
22
|
+
lawId,
|
|
23
|
+
requirements: requirements.map(requirement => ({
|
|
24
|
+
requirement,
|
|
25
|
+
assertions: [...(index.assertionsByRequirement.get(requirement.id) ?? [])].sort(byId),
|
|
26
|
+
})),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Product → the Requirements it has an assertion about, with each assertion's
|
|
32
|
+
* status. The requirement is resolved from the index; a dangling `about`
|
|
33
|
+
* (assertion references a requirement not in the scan) falls back to a stub
|
|
34
|
+
* carrying the id as its name, so the binding still shows.
|
|
35
|
+
*/
|
|
36
|
+
export function buildProductView(productId: string, index: ComplianceIndex): ProductView {
|
|
37
|
+
const assertions = [...(index.assertionsBySubject.get(productId) ?? [])];
|
|
38
|
+
const requirements = assertions
|
|
39
|
+
.map(assertion => {
|
|
40
|
+
const requirement: IndexRequirement =
|
|
41
|
+
index.requirementById.get(assertion.about) ?? { id: assertion.about, name: assertion.about };
|
|
42
|
+
return { requirement, assertion };
|
|
43
|
+
})
|
|
44
|
+
.sort((a, b) => byId(a.requirement, b.requirement));
|
|
45
|
+
return { productId, requirements };
|
|
46
|
+
}
|