open-agreements 0.2.1 → 0.3.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/README.de.md +371 -0
- package/README.es.md +371 -0
- package/README.md +40 -2
- package/README.pt-br.md +371 -0
- package/README.zh.md +371 -0
- package/content/templates/closing-checklist/metadata.yaml +6 -13
- package/content/templates/closing-checklist/template.docx +0 -0
- package/content/templates/common-paper-ai-addendum/README.md +18 -0
- package/content/templates/common-paper-ai-addendum/metadata.yaml +136 -0
- package/content/templates/common-paper-ai-addendum/replacements.json +5 -0
- package/content/templates/common-paper-ai-addendum/selections.json +62 -0
- package/content/templates/common-paper-ai-addendum/template.docx +0 -0
- package/content/templates/common-paper-ai-addendum-in-app/metadata.yaml +88 -0
- package/content/templates/common-paper-ai-addendum-in-app/replacements.json +5 -0
- package/content/templates/common-paper-ai-addendum-in-app/selections.json +62 -0
- package/content/templates/common-paper-amendment/README.md +18 -0
- package/content/templates/common-paper-amendment/metadata.yaml +48 -0
- package/content/templates/common-paper-amendment/template.docx +0 -0
- package/content/templates/common-paper-business-associate-agreement/README.md +20 -1
- package/content/templates/common-paper-business-associate-agreement/metadata.yaml +111 -3
- package/content/templates/common-paper-business-associate-agreement/replacements.json +2 -1
- package/content/templates/common-paper-business-associate-agreement/selections.json +38 -0
- package/content/templates/common-paper-business-associate-agreement/template.docx +0 -0
- package/content/templates/common-paper-cloud-service-agreement/README.md +18 -0
- package/content/templates/common-paper-cloud-service-agreement/metadata.yaml +48 -0
- package/content/templates/common-paper-cloud-service-agreement/template.docx +0 -0
- package/content/templates/common-paper-csa-with-ai/README.md +18 -0
- package/content/templates/common-paper-csa-with-ai/metadata.yaml +462 -2
- package/content/templates/common-paper-csa-with-ai/replacements.json +5 -2
- package/content/templates/common-paper-csa-with-ai/selections.json +291 -0
- package/content/templates/common-paper-csa-with-ai/template.docx +0 -0
- package/content/templates/common-paper-csa-with-sla/README.md +18 -0
- package/content/templates/common-paper-csa-with-sla/metadata.yaml +387 -2
- package/content/templates/common-paper-csa-with-sla/replacements.json +4 -2
- package/content/templates/common-paper-csa-with-sla/selections.json +257 -0
- package/content/templates/common-paper-csa-with-sla/template.docx +0 -0
- package/content/templates/common-paper-csa-without-sla/README.md +18 -0
- package/content/templates/common-paper-csa-without-sla/metadata.yaml +380 -2
- package/content/templates/common-paper-csa-without-sla/replacements.json +5 -2
- package/content/templates/common-paper-csa-without-sla/selections.json +250 -0
- package/content/templates/common-paper-csa-without-sla/template.docx +0 -0
- package/content/templates/common-paper-data-processing-agreement/README.md +16 -0
- package/content/templates/common-paper-data-processing-agreement/metadata.yaml +397 -3
- package/content/templates/common-paper-data-processing-agreement/replacements.json +2 -1
- package/content/templates/common-paper-data-processing-agreement/selections.json +211 -0
- package/content/templates/common-paper-data-processing-agreement/template.docx +0 -0
- package/content/templates/common-paper-design-partner-agreement/README.md +18 -0
- package/content/templates/common-paper-design-partner-agreement/metadata.yaml +99 -3
- package/content/templates/common-paper-design-partner-agreement/selections.json +27 -0
- package/content/templates/common-paper-design-partner-agreement/template.docx +0 -0
- package/content/templates/common-paper-independent-contractor-agreement/README.md +18 -0
- package/content/templates/common-paper-independent-contractor-agreement/clean.json +8 -0
- package/content/templates/common-paper-independent-contractor-agreement/metadata.yaml +52 -0
- package/content/templates/common-paper-independent-contractor-agreement/replacements.json +3 -0
- package/content/templates/common-paper-independent-contractor-agreement/template.docx +0 -0
- package/content/templates/common-paper-letter-of-intent/README.md +18 -0
- package/content/templates/common-paper-letter-of-intent/metadata.yaml +48 -0
- package/content/templates/common-paper-letter-of-intent/template.docx +0 -0
- package/content/templates/common-paper-mutual-nda/README.md +29 -7
- package/content/templates/common-paper-mutual-nda/metadata.yaml +48 -0
- package/content/templates/common-paper-mutual-nda/template.docx +0 -0
- package/content/templates/common-paper-one-way-nda/README.md +13 -0
- package/content/templates/common-paper-one-way-nda/metadata.yaml +24 -0
- package/content/templates/common-paper-one-way-nda/selections.json +38 -0
- package/content/templates/common-paper-one-way-nda/template.docx +0 -0
- package/content/templates/common-paper-order-form/README.md +18 -0
- package/content/templates/common-paper-order-form/metadata.yaml +115 -3
- package/content/templates/common-paper-order-form/replacements.json +5 -2
- package/content/templates/common-paper-order-form/selections.json +56 -0
- package/content/templates/common-paper-order-form/template.docx +0 -0
- package/content/templates/common-paper-order-form-with-sla/README.md +18 -0
- package/content/templates/common-paper-order-form-with-sla/metadata.yaml +149 -3
- package/content/templates/common-paper-order-form-with-sla/replacements.json +6 -2
- package/content/templates/common-paper-order-form-with-sla/selections.json +64 -0
- package/content/templates/common-paper-order-form-with-sla/template.docx +0 -0
- package/content/templates/common-paper-partnership-agreement/README.md +18 -0
- package/content/templates/common-paper-partnership-agreement/metadata.yaml +293 -4
- package/content/templates/common-paper-partnership-agreement/replacements.json +5 -2
- package/content/templates/common-paper-partnership-agreement/selections.json +138 -0
- package/content/templates/common-paper-partnership-agreement/template.docx +0 -0
- package/content/templates/common-paper-pilot-agreement/README.md +18 -0
- package/content/templates/common-paper-pilot-agreement/metadata.yaml +48 -0
- package/content/templates/common-paper-pilot-agreement/template.docx +0 -0
- package/content/templates/common-paper-professional-services-agreement/README.md +18 -0
- package/content/templates/common-paper-professional-services-agreement/metadata.yaml +338 -4
- package/content/templates/common-paper-professional-services-agreement/replacements.json +7 -4
- package/content/templates/common-paper-professional-services-agreement/selections.json +207 -0
- package/content/templates/common-paper-professional-services-agreement/template.docx +0 -0
- package/content/templates/common-paper-statement-of-work/README.md +18 -0
- package/content/templates/common-paper-statement-of-work/metadata.yaml +110 -2
- package/content/templates/common-paper-statement-of-work/replacements.json +4 -1
- package/content/templates/common-paper-statement-of-work/selections.json +55 -0
- package/content/templates/common-paper-statement-of-work/template.docx +0 -0
- package/content/templates/common-paper-term-sheet/README.md +18 -0
- package/content/templates/common-paper-term-sheet/metadata.yaml +48 -0
- package/content/templates/common-paper-term-sheet/template.docx +0 -0
- package/content/templates/working-group-list/template.docx +0 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +47 -10
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/checklist.d.ts +21 -1
- package/dist/commands/checklist.d.ts.map +1 -1
- package/dist/commands/checklist.js +176 -44
- package/dist/commands/checklist.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +1 -46
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/recipe.js +3 -11
- package/dist/commands/recipe.js.map +1 -1
- package/dist/core/checklist/format-checklist-docx.d.ts +10 -0
- package/dist/core/checklist/format-checklist-docx.d.ts.map +1 -0
- package/dist/core/checklist/format-checklist-docx.js +321 -0
- package/dist/core/checklist/format-checklist-docx.js.map +1 -0
- package/dist/core/checklist/index.d.ts +23 -14
- package/dist/core/checklist/index.d.ts.map +1 -1
- package/dist/core/checklist/index.js +83 -39
- package/dist/core/checklist/index.js.map +1 -1
- package/dist/core/checklist/jsonl-stores.d.ts +3 -0
- package/dist/core/checklist/jsonl-stores.d.ts.map +1 -0
- package/dist/core/checklist/jsonl-stores.js +16 -0
- package/dist/core/checklist/jsonl-stores.js.map +1 -0
- package/dist/core/checklist/schemas.d.ts +2 -2
- package/dist/core/checklist/schemas.js +1 -1
- package/dist/core/checklist/schemas.js.map +1 -1
- package/dist/core/checklist/state-manager.d.ts +146 -0
- package/dist/core/checklist/state-manager.d.ts.map +1 -0
- package/dist/core/checklist/state-manager.js +147 -0
- package/dist/core/checklist/state-manager.js.map +1 -0
- package/dist/core/checklist/status-labels.d.ts +6 -0
- package/dist/core/checklist/status-labels.d.ts.map +1 -0
- package/dist/core/checklist/status-labels.js +29 -0
- package/dist/core/checklist/status-labels.js.map +1 -0
- package/dist/core/engine.d.ts +1 -0
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/core/engine.js +72 -11
- package/dist/core/engine.js.map +1 -1
- package/dist/core/selector.d.ts +2 -0
- package/dist/core/selector.d.ts.map +1 -1
- package/dist/core/selector.js +181 -39
- package/dist/core/selector.js.map +1 -1
- package/dist/core/template-listing.d.ts +40 -0
- package/dist/core/template-listing.d.ts.map +1 -0
- package/dist/core/template-listing.js +91 -0
- package/dist/core/template-listing.js.map +1 -0
- package/dist/core/validation/recipe.d.ts.map +1 -1
- package/dist/core/validation/recipe.js +47 -61
- package/dist/core/validation/recipe.js.map +1 -1
- package/dist/core/validation/template.d.ts.map +1 -1
- package/dist/core/validation/template.js +10 -2
- package/dist/core/validation/template.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/package.json +8 -2
- package/skills/cloud-service-agreement/SKILL.md +9 -0
- package/skills/data-privacy-agreement/SKILL.md +9 -0
- package/skills/edit-docx-agreement/CONNECTORS.md +20 -0
- package/skills/edit-docx-agreement/SKILL.md +77 -0
- package/skills/employment-contract/SKILL.md +9 -0
- package/skills/iso-27001-evidence-collection/CONNECTORS.md +39 -0
- package/skills/iso-27001-evidence-collection/SKILL.md +304 -0
- package/skills/iso-27001-evidence-collection/rules/api-exports.md +191 -0
- package/skills/iso-27001-evidence-collection/rules/evidence-types.md +107 -0
- package/skills/iso-27001-evidence-collection/rules/screenshot-guide.md +77 -0
- package/skills/iso-27001-internal-audit/CONNECTORS.md +39 -0
- package/skills/iso-27001-internal-audit/SKILL.md +275 -0
- package/skills/iso-27001-internal-audit/rules/access-control.md +191 -0
- package/skills/iso-27001-internal-audit/rules/business-continuity.md +94 -0
- package/skills/iso-27001-internal-audit/rules/change-management.md +211 -0
- package/skills/iso-27001-internal-audit/rules/encryption.md +93 -0
- package/skills/iso-27001-internal-audit/rules/incident-response.md +127 -0
- package/skills/iso-27001-internal-audit/rules/isms-management.md +164 -0
- package/skills/iso-27001-internal-audit/rules/logging-monitoring.md +96 -0
- package/skills/iso-27001-internal-audit/rules/people-controls.md +161 -0
- package/skills/iso-27001-internal-audit/rules/supplier-management.md +92 -0
- package/skills/nda/SKILL.md +9 -0
- package/skills/open-agreements/SKILL.md +9 -0
- package/skills/safe/SKILL.md +9 -0
- package/skills/services-agreement/SKILL.md +9 -0
- package/skills/soc2-readiness/CONNECTORS.md +39 -0
- package/skills/soc2-readiness/SKILL.md +301 -0
- package/skills/soc2-readiness/rules/change-vendor-management.md +104 -0
- package/skills/soc2-readiness/rules/communication-info.md +85 -0
- package/skills/soc2-readiness/rules/control-activities.md +95 -0
- package/skills/soc2-readiness/rules/control-environment.md +126 -0
- package/skills/soc2-readiness/rules/logical-access.md +264 -0
- package/skills/soc2-readiness/rules/monitoring-activities.md +66 -0
- package/skills/soc2-readiness/rules/optional-categories.md +264 -0
- package/skills/soc2-readiness/rules/privacy-criteria.md +359 -0
- package/skills/soc2-readiness/rules/risk-assessment.md +100 -0
- package/skills/soc2-readiness/rules/system-operations.md +170 -0
- package/skills/venture-financing/SKILL.md +9 -0
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-fill formatter for closing-checklist DOCX files.
|
|
3
|
+
*
|
|
4
|
+
* After docx-templates fills the template, every row looks identical.
|
|
5
|
+
* This formatter opens the DOCX, finds the Documents table, classifies
|
|
6
|
+
* each row (stage heading, main entry, citation, signatory, action, issue),
|
|
7
|
+
* and applies semantic XML formatting: bold, italic, color, indentation.
|
|
8
|
+
*/
|
|
9
|
+
import AdmZip from 'adm-zip';
|
|
10
|
+
import { DOMParser, XMLSerializer } from '@xmldom/xmldom';
|
|
11
|
+
const W_NS = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';
|
|
12
|
+
const DOCUMENTS_HEADERS = ['No.', 'Title', 'Status', 'Responsible Party'];
|
|
13
|
+
function classifyRow(numberText, titleText) {
|
|
14
|
+
// Stage heading: number cell empty, title matches roman numeral pattern
|
|
15
|
+
if (!numberText.trim() && /^[IVX]+\.\s/.test(titleText.trim())) {
|
|
16
|
+
return 'stage_heading';
|
|
17
|
+
}
|
|
18
|
+
// Main entry: number cell non-empty
|
|
19
|
+
if (numberText.trim()) {
|
|
20
|
+
return 'main_entry';
|
|
21
|
+
}
|
|
22
|
+
// Sub-rows: number cell empty, classify by title content
|
|
23
|
+
const stripped = titleText.replace(/^\u00A0+/, '').trim();
|
|
24
|
+
if (stripped.startsWith('Ref:'))
|
|
25
|
+
return 'citation';
|
|
26
|
+
if (/^\u2610\s+Signatory:|^\u2611\s+Signatory:|^Signatory:/.test(stripped))
|
|
27
|
+
return 'signatory';
|
|
28
|
+
if (/^\u2610\s+Action\s|^\u2611\s+Action\s|^Action\s/.test(stripped))
|
|
29
|
+
return 'action';
|
|
30
|
+
if (/^\u2610\s+Issue\s|^\u2611\s+Issue\s|^Issue\s/.test(stripped))
|
|
31
|
+
return 'issue';
|
|
32
|
+
return 'unknown';
|
|
33
|
+
}
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// XML helpers (same patterns as recipe/patcher.ts)
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
function ensureRunProperties(run) {
|
|
38
|
+
const doc = run.ownerDocument;
|
|
39
|
+
const children = run.childNodes;
|
|
40
|
+
for (let i = 0; i < children.length; i++) {
|
|
41
|
+
const child = children[i];
|
|
42
|
+
if (child.localName === 'rPr' && child.namespaceURI === W_NS) {
|
|
43
|
+
return child;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const rPr = doc.createElementNS(W_NS, 'w:rPr');
|
|
47
|
+
run.insertBefore(rPr, run.firstChild);
|
|
48
|
+
return rPr;
|
|
49
|
+
}
|
|
50
|
+
function setRunBold(run) {
|
|
51
|
+
const rPr = ensureRunProperties(run);
|
|
52
|
+
// Check if <w:b/> already exists
|
|
53
|
+
const children = rPr.childNodes;
|
|
54
|
+
for (let i = 0; i < children.length; i++) {
|
|
55
|
+
const child = children[i];
|
|
56
|
+
if (child.localName === 'b' && child.namespaceURI === W_NS)
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const doc = run.ownerDocument;
|
|
60
|
+
const b = doc.createElementNS(W_NS, 'w:b');
|
|
61
|
+
rPr.appendChild(b);
|
|
62
|
+
}
|
|
63
|
+
function setRunItalic(run) {
|
|
64
|
+
const rPr = ensureRunProperties(run);
|
|
65
|
+
const children = rPr.childNodes;
|
|
66
|
+
for (let i = 0; i < children.length; i++) {
|
|
67
|
+
const child = children[i];
|
|
68
|
+
if (child.localName === 'i' && child.namespaceURI === W_NS)
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const doc = run.ownerDocument;
|
|
72
|
+
const iEl = doc.createElementNS(W_NS, 'w:i');
|
|
73
|
+
rPr.appendChild(iEl);
|
|
74
|
+
}
|
|
75
|
+
function setRunColor(run, colorHex) {
|
|
76
|
+
const rPr = ensureRunProperties(run);
|
|
77
|
+
const doc = run.ownerDocument;
|
|
78
|
+
const children = rPr.childNodes;
|
|
79
|
+
for (let i = 0; i < children.length; i++) {
|
|
80
|
+
const child = children[i];
|
|
81
|
+
if (child.localName === 'color' && child.namespaceURI === W_NS) {
|
|
82
|
+
child.setAttributeNS(W_NS, 'w:val', colorHex);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const color = doc.createElementNS(W_NS, 'w:color');
|
|
87
|
+
color.setAttributeNS(W_NS, 'w:val', colorHex);
|
|
88
|
+
rPr.appendChild(color);
|
|
89
|
+
}
|
|
90
|
+
function ensureParagraphProperties(para) {
|
|
91
|
+
const doc = para.ownerDocument;
|
|
92
|
+
const children = para.childNodes;
|
|
93
|
+
for (let i = 0; i < children.length; i++) {
|
|
94
|
+
const child = children[i];
|
|
95
|
+
if (child.localName === 'pPr' && child.namespaceURI === W_NS) {
|
|
96
|
+
return child;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const pPr = doc.createElementNS(W_NS, 'w:pPr');
|
|
100
|
+
para.insertBefore(pPr, para.firstChild);
|
|
101
|
+
return pPr;
|
|
102
|
+
}
|
|
103
|
+
function setParagraphIndent(para, leftDxa) {
|
|
104
|
+
const pPr = ensureParagraphProperties(para);
|
|
105
|
+
const doc = para.ownerDocument;
|
|
106
|
+
// Find or create <w:ind>
|
|
107
|
+
const children = pPr.childNodes;
|
|
108
|
+
for (let i = 0; i < children.length; i++) {
|
|
109
|
+
const child = children[i];
|
|
110
|
+
if (child.localName === 'ind' && child.namespaceURI === W_NS) {
|
|
111
|
+
child.setAttributeNS(W_NS, 'w:left', String(leftDxa));
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const ind = doc.createElementNS(W_NS, 'w:ind');
|
|
116
|
+
ind.setAttributeNS(W_NS, 'w:left', String(leftDxa));
|
|
117
|
+
pPr.appendChild(ind);
|
|
118
|
+
}
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
// NBSP indent handling
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
const NBSP = '\u00A0';
|
|
123
|
+
const DXA_PER_LEVEL = 360;
|
|
124
|
+
/**
|
|
125
|
+
* Count leading NBSP pairs in all text nodes of a table cell,
|
|
126
|
+
* strip them from the text content, and return the indent level.
|
|
127
|
+
*/
|
|
128
|
+
function countAndStripNbspIndent(tc) {
|
|
129
|
+
const paragraphs = tc.getElementsByTagNameNS(W_NS, 'p');
|
|
130
|
+
let maxLevel = 0;
|
|
131
|
+
for (let p = 0; p < paragraphs.length; p++) {
|
|
132
|
+
const runs = paragraphs[p].getElementsByTagNameNS(W_NS, 'r');
|
|
133
|
+
if (runs.length === 0)
|
|
134
|
+
continue;
|
|
135
|
+
// Collect full text to count leading NBSPs
|
|
136
|
+
let fullText = '';
|
|
137
|
+
for (let r = 0; r < runs.length; r++) {
|
|
138
|
+
const tEls = runs[r].getElementsByTagNameNS(W_NS, 't');
|
|
139
|
+
for (let t = 0; t < tEls.length; t++) {
|
|
140
|
+
fullText += tEls[t].textContent ?? '';
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Count leading NBSP pairs
|
|
144
|
+
let nbspCount = 0;
|
|
145
|
+
for (let i = 0; i < fullText.length; i++) {
|
|
146
|
+
if (fullText[i] === NBSP) {
|
|
147
|
+
nbspCount++;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const level = Math.floor(nbspCount / 2);
|
|
154
|
+
if (level > maxLevel)
|
|
155
|
+
maxLevel = level;
|
|
156
|
+
if (nbspCount > 0) {
|
|
157
|
+
// Strip leading NBSPs from text runs
|
|
158
|
+
let remaining = nbspCount;
|
|
159
|
+
for (let r = 0; r < runs.length && remaining > 0; r++) {
|
|
160
|
+
const tEls = runs[r].getElementsByTagNameNS(W_NS, 't');
|
|
161
|
+
for (let t = 0; t < tEls.length && remaining > 0; t++) {
|
|
162
|
+
const text = tEls[t].textContent ?? '';
|
|
163
|
+
let stripCount = 0;
|
|
164
|
+
for (let c = 0; c < text.length && remaining > 0; c++) {
|
|
165
|
+
if (text[c] === NBSP) {
|
|
166
|
+
stripCount++;
|
|
167
|
+
remaining--;
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (stripCount > 0) {
|
|
174
|
+
const newText = text.slice(stripCount);
|
|
175
|
+
tEls[t].textContent = newText;
|
|
176
|
+
if (newText.startsWith(' ') || newText.endsWith(' ') || newText === '') {
|
|
177
|
+
tEls[t].setAttribute('xml:space', 'preserve');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Set paragraph indent
|
|
183
|
+
if (level > 0) {
|
|
184
|
+
setParagraphIndent(paragraphs[p], level * DXA_PER_LEVEL);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return maxLevel;
|
|
189
|
+
}
|
|
190
|
+
// ---------------------------------------------------------------------------
|
|
191
|
+
// Cell text extraction
|
|
192
|
+
// ---------------------------------------------------------------------------
|
|
193
|
+
function getCellText(tc) {
|
|
194
|
+
const tNodes = tc.getElementsByTagNameNS(W_NS, 't');
|
|
195
|
+
const parts = [];
|
|
196
|
+
for (let i = 0; i < tNodes.length; i++) {
|
|
197
|
+
parts.push(tNodes[i].textContent ?? '');
|
|
198
|
+
}
|
|
199
|
+
return parts.join('');
|
|
200
|
+
}
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
// Apply formatting to all runs in a cell
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
function getAllRunsInCell(tc) {
|
|
205
|
+
const runs = [];
|
|
206
|
+
const rNodes = tc.getElementsByTagNameNS(W_NS, 'r');
|
|
207
|
+
for (let i = 0; i < rNodes.length; i++) {
|
|
208
|
+
runs.push(rNodes[i]);
|
|
209
|
+
}
|
|
210
|
+
return runs;
|
|
211
|
+
}
|
|
212
|
+
function formatCellRuns(tc, format) {
|
|
213
|
+
const runs = getAllRunsInCell(tc);
|
|
214
|
+
for (const run of runs) {
|
|
215
|
+
if (format.bold)
|
|
216
|
+
setRunBold(run);
|
|
217
|
+
if (format.italic)
|
|
218
|
+
setRunItalic(run);
|
|
219
|
+
if (format.color)
|
|
220
|
+
setRunColor(run, format.color);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
// Find Documents table by matching header row
|
|
225
|
+
// ---------------------------------------------------------------------------
|
|
226
|
+
function findDocumentsTable(xmlDoc) {
|
|
227
|
+
const tables = xmlDoc.getElementsByTagNameNS(W_NS, 'tbl');
|
|
228
|
+
for (let t = 0; t < tables.length; t++) {
|
|
229
|
+
const table = tables[t];
|
|
230
|
+
const rows = getDirectChildRows(table);
|
|
231
|
+
if (rows.length === 0)
|
|
232
|
+
continue;
|
|
233
|
+
const headerRow = rows[0];
|
|
234
|
+
const cells = getDirectChildCells(headerRow);
|
|
235
|
+
const headerTexts = cells.map((c) => getCellText(c).trim());
|
|
236
|
+
if (headerTexts.length === DOCUMENTS_HEADERS.length &&
|
|
237
|
+
headerTexts.every((text, i) => text === DOCUMENTS_HEADERS[i])) {
|
|
238
|
+
return table;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
function getDirectChildRows(table) {
|
|
244
|
+
const rows = [];
|
|
245
|
+
const children = table.childNodes;
|
|
246
|
+
for (let i = 0; i < children.length; i++) {
|
|
247
|
+
const child = children[i];
|
|
248
|
+
if (child.nodeType === 1) {
|
|
249
|
+
const el = child;
|
|
250
|
+
if (el.localName === 'tr' && el.namespaceURI === W_NS) {
|
|
251
|
+
rows.push(el);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return rows;
|
|
256
|
+
}
|
|
257
|
+
function getDirectChildCells(row) {
|
|
258
|
+
const cells = [];
|
|
259
|
+
const children = row.childNodes;
|
|
260
|
+
for (let i = 0; i < children.length; i++) {
|
|
261
|
+
const child = children[i];
|
|
262
|
+
if (child.nodeType === 1) {
|
|
263
|
+
const el = child;
|
|
264
|
+
if (el.localName === 'tc' && el.namespaceURI === W_NS) {
|
|
265
|
+
cells.push(el);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return cells;
|
|
270
|
+
}
|
|
271
|
+
// ---------------------------------------------------------------------------
|
|
272
|
+
// Main formatter
|
|
273
|
+
// ---------------------------------------------------------------------------
|
|
274
|
+
export async function formatChecklistDocx(docxPath) {
|
|
275
|
+
const zip = new AdmZip(docxPath);
|
|
276
|
+
const entry = zip.getEntry('word/document.xml');
|
|
277
|
+
if (!entry)
|
|
278
|
+
return;
|
|
279
|
+
const xmlStr = entry.getData().toString('utf-8');
|
|
280
|
+
const xmlDoc = new DOMParser().parseFromString(xmlStr, 'text/xml');
|
|
281
|
+
const docsTable = findDocumentsTable(xmlDoc);
|
|
282
|
+
if (!docsTable)
|
|
283
|
+
return;
|
|
284
|
+
const rows = getDirectChildRows(docsTable);
|
|
285
|
+
// Skip header row (index 0)
|
|
286
|
+
for (let r = 1; r < rows.length; r++) {
|
|
287
|
+
const cells = getDirectChildCells(rows[r]);
|
|
288
|
+
if (cells.length < 2)
|
|
289
|
+
continue;
|
|
290
|
+
const numberText = getCellText(cells[0]);
|
|
291
|
+
const titleText = getCellText(cells[1]);
|
|
292
|
+
const rowType = classifyRow(numberText, titleText);
|
|
293
|
+
// Convert NBSP indentation to OOXML indent on title cell
|
|
294
|
+
countAndStripNbspIndent(cells[1]);
|
|
295
|
+
const titleCell = cells[1];
|
|
296
|
+
switch (rowType) {
|
|
297
|
+
case 'stage_heading':
|
|
298
|
+
formatCellRuns(titleCell, { italic: true, color: '8C8D8E' });
|
|
299
|
+
break;
|
|
300
|
+
case 'main_entry':
|
|
301
|
+
formatCellRuns(titleCell, { bold: true });
|
|
302
|
+
break;
|
|
303
|
+
case 'citation':
|
|
304
|
+
formatCellRuns(titleCell, { italic: true, color: '494A4B' });
|
|
305
|
+
break;
|
|
306
|
+
case 'signatory':
|
|
307
|
+
case 'action':
|
|
308
|
+
case 'issue':
|
|
309
|
+
// Normal formatting; checkboxes already in text
|
|
310
|
+
break;
|
|
311
|
+
case 'unknown':
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
// Serialize and write back
|
|
316
|
+
const serializer = new XMLSerializer();
|
|
317
|
+
const updatedXml = serializer.serializeToString(xmlDoc);
|
|
318
|
+
zip.updateFile('word/document.xml', Buffer.from(updatedXml, 'utf-8'));
|
|
319
|
+
zip.writeZip(docxPath);
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=format-checklist-docx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-checklist-docx.js","sourceRoot":"","sources":["../../../src/core/checklist/format-checklist-docx.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,37 +2,46 @@ export { ClosingChecklistSchema, type ClosingChecklist } from './schemas.js';
|
|
|
2
2
|
export { ChecklistPatchModeEnum, JsonPointerSchema, PatchCitationSchema, ChecklistPatchSourceEventSchema, ChecklistPatchOperationSchema, ChecklistPatchEnvelopeSchema, ChecklistPatchApplyRequestSchema, type ChecklistPatchMode, type JsonPointer, type PatchCitation, type ChecklistPatchSourceEvent, type ChecklistPatchOperation, type ChecklistPatchEnvelope, type ChecklistPatchApplyRequest, } from './patch-schemas.js';
|
|
3
3
|
export { CHECKLIST_PATCH_VALIDATION_TTL_MS, DANGEROUS_KEYS, applyChecklistPatchOperations, computeChecklistPatchHash, validateChecklistPatch, getChecklistPatchValidationArtifact, setChecklistPatchValidationStore, getChecklistPatchValidationStore, type ChecklistPatchValidationErrorCode, type ChecklistPatchValidationDiagnostic, type ResolvedChecklistPatchOperation, type ChecklistPatchValidationArtifact, type ChecklistPatchValidationStore, type ValidateChecklistPatchInput, type ChecklistPatchValidationSuccess, type ChecklistPatchValidationFailure, type ChecklistPatchValidationResult, } from './patch-validator.js';
|
|
4
4
|
export { applyChecklistPatch, setChecklistAppliedPatchStore, getChecklistAppliedPatchStore, setChecklistProposedPatchStore, getChecklistProposedPatchStore, type ChecklistAppliedPatchRecord, type ChecklistAppliedPatchStore, type ChecklistProposedPatchRecord, type ChecklistProposedPatchStore, type ChecklistPatchApplyErrorCode, type ChecklistPatchApplyFailure, type ChecklistPatchApplySuccess, type ChecklistPatchApplyResult, type ApplyChecklistPatchInput, } from './patch-apply.js';
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
export { humanStatus, STATUS_LABELS } from './status-labels.js';
|
|
6
|
+
export { createChecklist, listChecklists, resolveChecklist, getChecklistState, saveChecklistState, appendHistory, getHistory, ChecklistStateSchema, type ChecklistState, type ChecklistMeta, type ChecklistSummary, type HistoryRecord, } from './state-manager.js';
|
|
7
|
+
export { appendJsonl, readJsonl } from './jsonl-stores.js';
|
|
8
|
+
export { formatChecklistDocx } from './format-checklist-docx.js';
|
|
9
|
+
interface TemplateDocumentRow {
|
|
10
|
+
number: string;
|
|
11
|
+
title: string;
|
|
7
12
|
status: string;
|
|
13
|
+
responsible_party: string;
|
|
8
14
|
}
|
|
9
|
-
interface
|
|
15
|
+
interface TemplateActionRow {
|
|
10
16
|
item_id: string;
|
|
11
17
|
description: string;
|
|
12
18
|
status: string;
|
|
13
|
-
assigned_to:
|
|
14
|
-
organization: string;
|
|
15
|
-
};
|
|
19
|
+
assigned_to: string;
|
|
16
20
|
due_date: string;
|
|
17
21
|
}
|
|
18
|
-
interface
|
|
22
|
+
interface TemplateIssueRow {
|
|
19
23
|
issue_id: string;
|
|
20
24
|
title: string;
|
|
21
25
|
status: string;
|
|
22
|
-
|
|
23
|
-
resolution: string;
|
|
26
|
+
summary: string;
|
|
24
27
|
}
|
|
25
28
|
export interface ChecklistTemplateContext {
|
|
26
29
|
deal_name: string;
|
|
27
30
|
updated_at: string;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
open_issues: LegacyTemplateIssueRow[];
|
|
31
|
+
documents: TemplateDocumentRow[];
|
|
32
|
+
action_items: TemplateActionRow[];
|
|
33
|
+
open_issues: TemplateIssueRow[];
|
|
32
34
|
}
|
|
33
35
|
/**
|
|
34
|
-
* Build template values for the
|
|
36
|
+
* Build template values for the closing-checklist DOCX template from
|
|
35
37
|
* document-first v2 checklist input.
|
|
38
|
+
*
|
|
39
|
+
* Layout:
|
|
40
|
+
* - Stage headers as bold section rows
|
|
41
|
+
* - Entry rows: Number | Title | Status | Responsible Party
|
|
42
|
+
* - Citations as indented sub-rows under their entry
|
|
43
|
+
* - Signatories as indented sub-rows
|
|
44
|
+
* - Linked actions/issues as indented sub-rows
|
|
36
45
|
*/
|
|
37
46
|
export declare function buildChecklistTemplateContext(data: unknown): ChecklistTemplateContext;
|
|
38
47
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/checklist/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/checklist/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,sBAAsB,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,+BAA+B,EAC/B,6BAA6B,EAC7B,4BAA4B,EAC5B,gCAAgC,EAChC,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,GAChC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,iCAAiC,EACjC,cAAc,EACd,6BAA6B,EAC7B,yBAAyB,EACzB,sBAAsB,EACtB,mCAAmC,EACnC,gCAAgC,EAChC,gCAAgC,EAChC,KAAK,iCAAiC,EACtC,KAAK,kCAAkC,EACvC,KAAK,+BAA+B,EACpC,KAAK,gCAAgC,EACrC,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,EAChC,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,GACpC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,mBAAmB,EACnB,6BAA6B,EAC7B,6BAA6B,EAC7B,8BAA8B,EAC9B,8BAA8B,EAC9B,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EACL,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,aAAa,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AA+BjE,UAAU,mBAAmB;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,WAAW,EAAE,gBAAgB,EAAE,CAAC;CACjC;AAkLD;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,OAAO,GAAG,wBAAwB,CAiGrF"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { ClosingChecklistSchema, } from './schemas.js';
|
|
2
|
+
import { humanStatus } from './status-labels.js';
|
|
2
3
|
export { ClosingChecklistSchema } from './schemas.js';
|
|
3
4
|
export { ChecklistPatchModeEnum, JsonPointerSchema, PatchCitationSchema, ChecklistPatchSourceEventSchema, ChecklistPatchOperationSchema, ChecklistPatchEnvelopeSchema, ChecklistPatchApplyRequestSchema, } from './patch-schemas.js';
|
|
4
5
|
export { CHECKLIST_PATCH_VALIDATION_TTL_MS, DANGEROUS_KEYS, applyChecklistPatchOperations, computeChecklistPatchHash, validateChecklistPatch, getChecklistPatchValidationArtifact, setChecklistPatchValidationStore, getChecklistPatchValidationStore, } from './patch-validator.js';
|
|
5
6
|
export { applyChecklistPatch, setChecklistAppliedPatchStore, getChecklistAppliedPatchStore, setChecklistProposedPatchStore, getChecklistProposedPatchStore, } from './patch-apply.js';
|
|
7
|
+
export { humanStatus, STATUS_LABELS } from './status-labels.js';
|
|
8
|
+
export { createChecklist, listChecklists, resolveChecklist, getChecklistState, saveChecklistState, appendHistory, getHistory, ChecklistStateSchema, } from './state-manager.js';
|
|
9
|
+
export { appendJsonl, readJsonl } from './jsonl-stores.js';
|
|
10
|
+
export { formatChecklistDocx } from './format-checklist-docx.js';
|
|
6
11
|
const STAGE_ORDER = ['PRE_SIGNING', 'SIGNING', 'CLOSING', 'POST_CLOSING'];
|
|
7
12
|
const STAGE_HEADINGS = {
|
|
8
13
|
PRE_SIGNING: 'PRE-SIGNING',
|
|
@@ -12,9 +17,13 @@ const STAGE_HEADINGS = {
|
|
|
12
17
|
};
|
|
13
18
|
const STAGE_ROMANS = ['I', 'II', 'III', 'IV'];
|
|
14
19
|
function compareBySortKey(a, b) {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
const aKey = a.sort_key ?? '';
|
|
21
|
+
const bKey = b.sort_key ?? '';
|
|
22
|
+
if (aKey || bKey) {
|
|
23
|
+
const keyCompare = aKey.localeCompare(bKey, undefined, { numeric: true, sensitivity: 'base' });
|
|
24
|
+
if (keyCompare !== 0)
|
|
25
|
+
return keyCompare;
|
|
26
|
+
}
|
|
18
27
|
return a.entry_id.localeCompare(b.entry_id);
|
|
19
28
|
}
|
|
20
29
|
function nonEmpty(values) {
|
|
@@ -45,23 +54,33 @@ function latestCitationLabel(citations) {
|
|
|
45
54
|
}
|
|
46
55
|
function signatoryLabel(signatory) {
|
|
47
56
|
const who = nonEmpty([signatory.party, signatory.name ?? '', signatory.title ?? '']).join(' ');
|
|
48
|
-
|
|
49
|
-
.map((artifact) => artifact.uri ?? artifact.path ?? '')
|
|
50
|
-
.filter((value) => value.length > 0);
|
|
51
|
-
if (artifacts.length === 0) {
|
|
52
|
-
return `${who} [${signatory.status}]`;
|
|
53
|
-
}
|
|
54
|
-
return `${who} [${signatory.status}] (${artifacts.join(', ')})`;
|
|
57
|
+
return `${who}: ${humanStatus(signatory.status)}`;
|
|
55
58
|
}
|
|
56
59
|
function toArray(collection) {
|
|
57
60
|
return Array.isArray(collection) ? collection : Object.values(collection);
|
|
58
61
|
}
|
|
62
|
+
function assignAutoSortKeys(entries) {
|
|
63
|
+
const byStage = new Map();
|
|
64
|
+
for (const entry of entries) {
|
|
65
|
+
if (entry.sort_key)
|
|
66
|
+
continue;
|
|
67
|
+
const group = byStage.get(entry.stage) ?? [];
|
|
68
|
+
group.push(entry);
|
|
69
|
+
byStage.set(entry.stage, group);
|
|
70
|
+
}
|
|
71
|
+
for (const group of byStage.values()) {
|
|
72
|
+
group.forEach((entry, index) => {
|
|
73
|
+
entry.sort_key = String((index + 1) * 100);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
59
77
|
function buildRenderModel(data) {
|
|
60
78
|
const checklist = ClosingChecklistSchema.parse(data);
|
|
61
79
|
const documents = toArray(checklist.documents);
|
|
62
80
|
const entries = toArray(checklist.checklist_entries);
|
|
63
81
|
const actions = toArray(checklist.action_items);
|
|
64
82
|
const issues = toArray(checklist.issues);
|
|
83
|
+
assignAutoSortKeys(entries);
|
|
65
84
|
const documentsById = new Map(documents.map((document) => [document.document_id, document]));
|
|
66
85
|
const entryDocumentIds = new Set(entries
|
|
67
86
|
.map((entry) => entry.document_id)
|
|
@@ -121,9 +140,8 @@ function buildRenderModel(data) {
|
|
|
121
140
|
}
|
|
122
141
|
}
|
|
123
142
|
roots.sort(compareBySortKey);
|
|
124
|
-
for (const [
|
|
143
|
+
for (const [, children] of childrenByParent.entries()) {
|
|
125
144
|
children.sort(compareBySortKey);
|
|
126
|
-
childrenByParent.set(parentId, children);
|
|
127
145
|
}
|
|
128
146
|
const stageRows = [];
|
|
129
147
|
const visit = (entry, depth, number) => {
|
|
@@ -154,8 +172,15 @@ function buildRenderModel(data) {
|
|
|
154
172
|
};
|
|
155
173
|
}
|
|
156
174
|
/**
|
|
157
|
-
* Build template values for the
|
|
175
|
+
* Build template values for the closing-checklist DOCX template from
|
|
158
176
|
* document-first v2 checklist input.
|
|
177
|
+
*
|
|
178
|
+
* Layout:
|
|
179
|
+
* - Stage headers as bold section rows
|
|
180
|
+
* - Entry rows: Number | Title | Status | Responsible Party
|
|
181
|
+
* - Citations as indented sub-rows under their entry
|
|
182
|
+
* - Signatories as indented sub-rows
|
|
183
|
+
* - Linked actions/issues as indented sub-rows
|
|
159
184
|
*/
|
|
160
185
|
export function buildChecklistTemplateContext(data) {
|
|
161
186
|
const model = buildRenderModel(data);
|
|
@@ -164,39 +189,62 @@ export function buildChecklistTemplateContext(data) {
|
|
|
164
189
|
const stageRows = model.rowsByStage.get(stage) ?? [];
|
|
165
190
|
if (stageRows.length === 0)
|
|
166
191
|
return;
|
|
192
|
+
// Stage heading row
|
|
167
193
|
documentRows.push({
|
|
168
|
-
|
|
194
|
+
number: '',
|
|
195
|
+
title: `${STAGE_ROMANS[index]}. ${STAGE_HEADINGS[stage]}`,
|
|
169
196
|
status: '',
|
|
197
|
+
responsible_party: '',
|
|
170
198
|
});
|
|
171
199
|
for (const row of stageRows) {
|
|
172
200
|
const indent = '\u00A0\u00A0'.repeat(row.depth);
|
|
173
|
-
const
|
|
174
|
-
|
|
175
|
-
const documentName = `${row.number} ${indent}${row.entry.title}${citationText ? ` [${citationText}]` : ''}${linkText}`;
|
|
176
|
-
const statusParts = [row.entry.status];
|
|
177
|
-
if (row.entry.signatories.length > 0) {
|
|
178
|
-
statusParts.push(row.entry.signatories.map(signatoryLabel).join('; '));
|
|
179
|
-
}
|
|
180
|
-
const responsibility = responsibilityLabel(row.entry.responsible_party);
|
|
181
|
-
if (responsibility) {
|
|
182
|
-
statusParts.push(`Resp: ${responsibility}`);
|
|
183
|
-
}
|
|
201
|
+
const linkSuffix = row.document?.primary_link ? ` (${row.document.primary_link})` : '';
|
|
202
|
+
// Main entry row
|
|
184
203
|
documentRows.push({
|
|
185
|
-
|
|
186
|
-
|
|
204
|
+
number: row.number,
|
|
205
|
+
title: `${indent}${row.entry.title}${linkSuffix}`,
|
|
206
|
+
status: humanStatus(row.entry.status),
|
|
207
|
+
responsible_party: responsibilityLabel(row.entry.responsible_party),
|
|
187
208
|
});
|
|
209
|
+
// Citation sub-rows
|
|
210
|
+
for (const citation of row.entry.citations) {
|
|
211
|
+
documentRows.push({
|
|
212
|
+
number: '',
|
|
213
|
+
title: `${indent}\u00A0\u00A0Ref: ${citationLabel(citation)}`,
|
|
214
|
+
status: '',
|
|
215
|
+
responsible_party: '',
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
// Signatory sub-rows
|
|
219
|
+
for (const signatory of row.entry.signatories) {
|
|
220
|
+
const sigCheckbox = signatory.status === 'RECEIVED' ? '\u2611' : '\u2610';
|
|
221
|
+
documentRows.push({
|
|
222
|
+
number: '',
|
|
223
|
+
title: `${indent}\u00A0\u00A0${sigCheckbox} Signatory: ${signatoryLabel(signatory)}`,
|
|
224
|
+
status: '',
|
|
225
|
+
responsible_party: '',
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
// Linked action sub-rows
|
|
188
229
|
for (const action of row.linkedActions) {
|
|
230
|
+
const actCheckbox = action.status === 'COMPLETED' ? '\u2611' : '\u2610';
|
|
189
231
|
const latestCitation = latestCitationLabel(action.citations);
|
|
190
232
|
documentRows.push({
|
|
191
|
-
|
|
192
|
-
|
|
233
|
+
number: '',
|
|
234
|
+
title: `${indent}\u00A0\u00A0${actCheckbox} Action ${action.action_id}: ${action.description}`,
|
|
235
|
+
status: latestCitation ? `${humanStatus(action.status)} | ${latestCitation}` : humanStatus(action.status),
|
|
236
|
+
responsible_party: responsibilityLabel(action.assigned_to),
|
|
193
237
|
});
|
|
194
238
|
}
|
|
239
|
+
// Linked issue sub-rows
|
|
195
240
|
for (const issue of row.linkedIssues) {
|
|
241
|
+
const issCheckbox = issue.status === 'CLOSED' ? '\u2611' : '\u2610';
|
|
196
242
|
const latestCitation = latestCitationLabel(issue.citations);
|
|
197
243
|
documentRows.push({
|
|
198
|
-
|
|
199
|
-
|
|
244
|
+
number: '',
|
|
245
|
+
title: `${indent}\u00A0\u00A0${issCheckbox} Issue ${issue.issue_id}: ${issue.title}`,
|
|
246
|
+
status: latestCitation ? `${humanStatus(issue.status)} | ${latestCitation}` : humanStatus(issue.status),
|
|
247
|
+
responsible_party: '',
|
|
200
248
|
});
|
|
201
249
|
}
|
|
202
250
|
}
|
|
@@ -204,23 +252,19 @@ export function buildChecklistTemplateContext(data) {
|
|
|
204
252
|
const fallbackActions = model.unlinkedActions.map((action) => ({
|
|
205
253
|
item_id: action.action_id,
|
|
206
254
|
description: action.description,
|
|
207
|
-
status:
|
|
208
|
-
assigned_to:
|
|
209
|
-
organization: responsibilityLabel(action.assigned_to) || '',
|
|
210
|
-
},
|
|
255
|
+
status: humanStatus(action.status),
|
|
256
|
+
assigned_to: responsibilityLabel(action.assigned_to),
|
|
211
257
|
due_date: action.due_date ?? '',
|
|
212
258
|
}));
|
|
213
259
|
const fallbackIssues = model.unlinkedIssues.map((issue) => ({
|
|
214
260
|
issue_id: issue.issue_id,
|
|
215
261
|
title: issue.title,
|
|
216
|
-
status: issue.status,
|
|
217
|
-
|
|
218
|
-
resolution: nonEmpty([issue.summary ?? '', latestCitationLabel(issue.citations)]).join(' | '),
|
|
262
|
+
status: humanStatus(issue.status),
|
|
263
|
+
summary: nonEmpty([issue.summary ?? '', latestCitationLabel(issue.citations)]).join(' | '),
|
|
219
264
|
}));
|
|
220
265
|
return {
|
|
221
266
|
deal_name: model.checklist.deal_name,
|
|
222
267
|
updated_at: model.checklist.updated_at,
|
|
223
|
-
working_group: [],
|
|
224
268
|
documents: documentRows,
|
|
225
269
|
action_items: fallbackActions,
|
|
226
270
|
open_issues: fallbackIssues,
|