open-agreements 0.4.0 → 0.6.2

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.
Files changed (192) hide show
  1. package/README.de.md +6 -1
  2. package/README.es.md +6 -1
  3. package/README.md +15 -1
  4. package/README.pt-br.md +6 -1
  5. package/README.zh.md +6 -1
  6. package/content/external/yc-safe-discount/metadata.yaml +1 -1
  7. package/content/external/yc-safe-mfn/metadata.yaml +1 -1
  8. package/content/external/yc-safe-pro-rata-side-letter/metadata.yaml +1 -1
  9. package/content/external/yc-safe-valuation-cap/metadata.yaml +1 -1
  10. package/content/recipes/QUALITY_TRACKER.md +35 -0
  11. package/content/recipes/nvca-certificate-of-incorporation/clean.json +14 -2
  12. package/content/recipes/nvca-certificate-of-incorporation/computed.json +99 -0
  13. package/content/recipes/nvca-certificate-of-incorporation/metadata.yaml +133 -2
  14. package/content/recipes/nvca-certificate-of-incorporation/replacements.json +95 -2
  15. package/content/recipes/nvca-certificate-of-incorporation/selections-roadmap.md +44 -0
  16. package/content/recipes/nvca-certificate-of-incorporation/selections.json +95 -0
  17. package/content/recipes/nvca-indemnification-agreement/metadata.yaml +9 -1
  18. package/content/recipes/nvca-investors-rights-agreement/clean.json +9 -1
  19. package/content/recipes/nvca-investors-rights-agreement/metadata.yaml +1 -1
  20. package/content/recipes/nvca-investors-rights-agreement/replacements.json +4 -1
  21. package/content/recipes/nvca-management-rights-letter/metadata.yaml +1 -1
  22. package/content/recipes/nvca-rofr-co-sale-agreement/clean.json +11 -1
  23. package/content/recipes/nvca-rofr-co-sale-agreement/metadata.yaml +5 -1
  24. package/content/recipes/nvca-rofr-co-sale-agreement/replacements.json +4 -1
  25. package/content/recipes/nvca-stock-purchase-agreement/clean.json +8 -3
  26. package/content/recipes/nvca-stock-purchase-agreement/computed.json +30 -0
  27. package/content/recipes/nvca-stock-purchase-agreement/metadata.yaml +25 -17
  28. package/content/recipes/nvca-stock-purchase-agreement/normalize.json +0 -16
  29. package/content/recipes/nvca-stock-purchase-agreement/replacements.json +22 -19
  30. package/content/recipes/nvca-stock-purchase-agreement/selections.json +60 -0
  31. package/content/recipes/nvca-voting-agreement/clean.json +11 -1
  32. package/content/recipes/nvca-voting-agreement/metadata.yaml +1 -1
  33. package/content/recipes/nvca-voting-agreement/replacements.json +2 -1
  34. package/content/templates/bonterms-mutual-nda/metadata.yaml +1 -1
  35. package/content/templates/bonterms-professional-services-agreement/metadata.yaml +1 -1
  36. package/content/templates/closing-checklist/metadata.yaml +1 -1
  37. package/content/templates/common-paper-ai-addendum/metadata.yaml +1 -1
  38. package/content/templates/common-paper-ai-addendum-in-app/metadata.yaml +1 -1
  39. package/content/templates/common-paper-amendment/metadata.yaml +1 -1
  40. package/content/templates/common-paper-business-associate-agreement/metadata.yaml +1 -1
  41. package/content/templates/common-paper-cloud-service-agreement/metadata.yaml +1 -1
  42. package/content/templates/common-paper-csa-click-through/metadata.yaml +1 -1
  43. package/content/templates/common-paper-csa-with-ai/metadata.yaml +1 -1
  44. package/content/templates/common-paper-csa-with-sla/metadata.yaml +1 -1
  45. package/content/templates/common-paper-csa-without-sla/metadata.yaml +1 -1
  46. package/content/templates/common-paper-data-processing-agreement/metadata.yaml +1 -1
  47. package/content/templates/common-paper-design-partner-agreement/metadata.yaml +1 -1
  48. package/content/templates/common-paper-independent-contractor-agreement/metadata.yaml +1 -1
  49. package/content/templates/common-paper-letter-of-intent/metadata.yaml +1 -1
  50. package/content/templates/common-paper-mutual-nda/metadata.yaml +1 -1
  51. package/content/templates/common-paper-one-way-nda/metadata.yaml +1 -1
  52. package/content/templates/common-paper-order-form/metadata.yaml +1 -1
  53. package/content/templates/common-paper-order-form-with-sla/metadata.yaml +1 -1
  54. package/content/templates/common-paper-partnership-agreement/metadata.yaml +1 -1
  55. package/content/templates/common-paper-pilot-agreement/metadata.yaml +1 -1
  56. package/content/templates/common-paper-professional-services-agreement/metadata.yaml +1 -1
  57. package/content/templates/common-paper-software-license-agreement/metadata.yaml +1 -1
  58. package/content/templates/common-paper-statement-of-work/metadata.yaml +1 -1
  59. package/content/templates/common-paper-term-sheet/metadata.yaml +1 -1
  60. package/content/templates/openagreements-employee-ip-inventions-assignment/metadata.yaml +1 -1
  61. package/content/templates/openagreements-employment-confidentiality-acknowledgement/metadata.yaml +1 -1
  62. package/content/templates/openagreements-employment-offer-letter/metadata.yaml +1 -1
  63. package/content/templates/working-group-list/metadata.yaml +1 -1
  64. package/dist/cli/index.d.ts.map +1 -1
  65. package/dist/cli/index.js +8 -4
  66. package/dist/cli/index.js.map +1 -1
  67. package/dist/commands/fill.js +3 -3
  68. package/dist/commands/fill.js.map +1 -1
  69. package/dist/commands/list.js +19 -15
  70. package/dist/commands/list.js.map +1 -1
  71. package/dist/core/command-generation/adapters/claude.js +4 -4
  72. package/dist/core/employment/memo.js +3 -3
  73. package/dist/core/engine.js +1 -1
  74. package/dist/core/external/index.js +1 -1
  75. package/dist/core/fill-pipeline.d.ts +3 -3
  76. package/dist/core/fill-pipeline.js +6 -6
  77. package/dist/core/fill-pipeline.js.map +1 -1
  78. package/dist/core/metadata.d.ts +13 -3
  79. package/dist/core/metadata.d.ts.map +1 -1
  80. package/dist/core/metadata.js +19 -11
  81. package/dist/core/metadata.js.map +1 -1
  82. package/dist/core/recipe/bracket-normalizer.d.ts +4 -5
  83. package/dist/core/recipe/bracket-normalizer.d.ts.map +1 -1
  84. package/dist/core/recipe/bracket-normalizer.js +67 -149
  85. package/dist/core/recipe/bracket-normalizer.js.map +1 -1
  86. package/dist/core/recipe/cleaner.d.ts.map +1 -1
  87. package/dist/core/recipe/cleaner.js +91 -7
  88. package/dist/core/recipe/cleaner.js.map +1 -1
  89. package/dist/core/recipe/computed.d.ts +1 -0
  90. package/dist/core/recipe/computed.d.ts.map +1 -1
  91. package/dist/core/recipe/computed.js +8 -0
  92. package/dist/core/recipe/computed.js.map +1 -1
  93. package/dist/core/recipe/downloader.d.ts.map +1 -1
  94. package/dist/core/recipe/downloader.js +8 -3
  95. package/dist/core/recipe/downloader.js.map +1 -1
  96. package/dist/core/recipe/index.d.ts +2 -1
  97. package/dist/core/recipe/index.d.ts.map +1 -1
  98. package/dist/core/recipe/index.js +13 -5
  99. package/dist/core/recipe/index.js.map +1 -1
  100. package/dist/core/recipe/patcher.d.ts +10 -5
  101. package/dist/core/recipe/patcher.d.ts.map +1 -1
  102. package/dist/core/recipe/patcher.js +186 -138
  103. package/dist/core/recipe/patcher.js.map +1 -1
  104. package/dist/core/recipe/replacement-keys.d.ts +9 -7
  105. package/dist/core/recipe/replacement-keys.d.ts.map +1 -1
  106. package/dist/core/recipe/replacement-keys.js +7 -20
  107. package/dist/core/recipe/replacement-keys.js.map +1 -1
  108. package/dist/core/recipe/source-drift.js +1 -1
  109. package/dist/core/recipe/source-drift.js.map +1 -1
  110. package/dist/core/recipe/verifier.d.ts +8 -1
  111. package/dist/core/recipe/verifier.d.ts.map +1 -1
  112. package/dist/core/recipe/verifier.js +69 -3
  113. package/dist/core/recipe/verifier.js.map +1 -1
  114. package/dist/core/selector.d.ts +4 -0
  115. package/dist/core/selector.d.ts.map +1 -1
  116. package/dist/core/selector.js +278 -7
  117. package/dist/core/selector.js.map +1 -1
  118. package/dist/core/template-listing.d.ts +3 -1
  119. package/dist/core/template-listing.d.ts.map +1 -1
  120. package/dist/core/template-listing.js +4 -3
  121. package/dist/core/template-listing.js.map +1 -1
  122. package/dist/core/unified-pipeline.d.ts +5 -2
  123. package/dist/core/unified-pipeline.d.ts.map +1 -1
  124. package/dist/core/unified-pipeline.js +71 -3
  125. package/dist/core/unified-pipeline.js.map +1 -1
  126. package/dist/core/validation/external.d.ts.map +1 -1
  127. package/dist/core/validation/external.js +0 -2
  128. package/dist/core/validation/external.js.map +1 -1
  129. package/dist/core/validation/recipe.d.ts.map +1 -1
  130. package/dist/core/validation/recipe.js +34 -6
  131. package/dist/core/validation/recipe.js.map +1 -1
  132. package/dist/core/validation/scan-metadata.d.ts +2 -1
  133. package/dist/core/validation/scan-metadata.d.ts.map +1 -1
  134. package/dist/core/validation/scan-metadata.js +20 -3
  135. package/dist/core/validation/scan-metadata.js.map +1 -1
  136. package/dist/core/validation/template.js +5 -5
  137. package/node_modules/@usejunior/docx-core/LICENSE +21 -0
  138. package/node_modules/@usejunior/docx-core/README.md +101 -0
  139. package/node_modules/@usejunior/docx-core/dist/.tsbuildinfo +1 -0
  140. package/node_modules/@usejunior/docx-core/dist/cli/index.js +0 -0
  141. package/node_modules/@usejunior/docx-core/dist/primitives/document.d.ts.map +1 -1
  142. package/node_modules/@usejunior/docx-core/dist/primitives/document.js +190 -3
  143. package/node_modules/@usejunior/docx-core/dist/primitives/document.js.map +1 -1
  144. package/node_modules/@usejunior/docx-core/dist/primitives/document_view.d.ts +39 -0
  145. package/node_modules/@usejunior/docx-core/dist/primitives/document_view.d.ts.map +1 -1
  146. package/node_modules/@usejunior/docx-core/dist/primitives/document_view.js +83 -13
  147. package/node_modules/@usejunior/docx-core/dist/primitives/document_view.js.map +1 -1
  148. package/node_modules/@usejunior/docx-core/dist/primitives/dom-helpers.d.ts +11 -0
  149. package/node_modules/@usejunior/docx-core/dist/primitives/dom-helpers.d.ts.map +1 -1
  150. package/node_modules/@usejunior/docx-core/dist/primitives/dom-helpers.js +23 -0
  151. package/node_modules/@usejunior/docx-core/dist/primitives/dom-helpers.js.map +1 -1
  152. package/node_modules/@usejunior/docx-core/dist/primitives/tables.d.ts.map +1 -1
  153. package/node_modules/@usejunior/docx-core/dist/primitives/tables.js +2 -15
  154. package/node_modules/@usejunior/docx-core/dist/primitives/tables.js.map +1 -1
  155. package/node_modules/@usejunior/docx-core/package.json +49 -8
  156. package/package.json +5 -4
  157. package/server.json +31 -0
  158. package/skills/client-email/SKILL.md +143 -0
  159. package/skills/cloud-service-agreement/SKILL.md +8 -99
  160. package/skills/data-privacy-agreement/SKILL.md +10 -97
  161. package/skills/delaware-franchise-tax/SKILL.md +7 -1
  162. package/skills/edit-docx-agreement/SKILL.md +10 -3
  163. package/skills/employment-contract/SKILL.md +10 -95
  164. package/skills/iso-27001-evidence-collection/SKILL.md +7 -1
  165. package/skills/iso-27001-internal-audit/SKILL.md +6 -0
  166. package/skills/nda/SKILL.md +7 -99
  167. package/skills/open-agreements/CONNECTORS.md +1 -1
  168. package/skills/open-agreements/SKILL.md +17 -104
  169. package/skills/recipe-quality-audit/SKILL.md +116 -0
  170. package/skills/safe/SKILL.md +12 -97
  171. package/skills/services-agreement/SKILL.md +8 -99
  172. package/skills/shared/template-filling-execution.md +92 -0
  173. package/skills/soc2-readiness/SKILL.md +7 -1
  174. package/skills/unit-test-philosophy/SKILL.md +12 -1
  175. package/skills/venture-financing/SKILL.md +11 -96
  176. package/node_modules/diff-match-patch/LICENSE +0 -202
  177. package/node_modules/diff-match-patch/README.md +0 -94
  178. package/node_modules/diff-match-patch/index.js +0 -2218
  179. package/node_modules/diff-match-patch/package.json +0 -22
  180. /package/{packages → node_modules/@usejunior}/docx-core/node_modules/@xmldom/xmldom/CHANGELOG.md +0 -0
  181. /package/{packages → node_modules/@usejunior}/docx-core/node_modules/@xmldom/xmldom/LICENSE +0 -0
  182. /package/{packages → node_modules/@usejunior}/docx-core/node_modules/@xmldom/xmldom/SECURITY.md +0 -0
  183. /package/{packages → node_modules/@usejunior}/docx-core/node_modules/@xmldom/xmldom/index.d.ts +0 -0
  184. /package/{packages → node_modules/@usejunior}/docx-core/node_modules/@xmldom/xmldom/lib/.eslintrc.yml +0 -0
  185. /package/{packages → node_modules/@usejunior}/docx-core/node_modules/@xmldom/xmldom/lib/conventions.js +0 -0
  186. /package/{packages → node_modules/@usejunior}/docx-core/node_modules/@xmldom/xmldom/lib/dom-parser.js +0 -0
  187. /package/{packages → node_modules/@usejunior}/docx-core/node_modules/@xmldom/xmldom/lib/dom.js +0 -0
  188. /package/{packages → node_modules/@usejunior}/docx-core/node_modules/@xmldom/xmldom/lib/entities.js +0 -0
  189. /package/{packages → node_modules/@usejunior}/docx-core/node_modules/@xmldom/xmldom/lib/index.js +0 -0
  190. /package/{packages → node_modules/@usejunior}/docx-core/node_modules/@xmldom/xmldom/lib/sax.js +0 -0
  191. /package/{packages → node_modules/@usejunior}/docx-core/node_modules/@xmldom/xmldom/package.json +0 -0
  192. /package/{packages → node_modules/@usejunior}/docx-core/node_modules/@xmldom/xmldom/readme.md +0 -0
@@ -13,6 +13,7 @@ export interface TemplateListField {
13
13
  section: string | null;
14
14
  description: string;
15
15
  default: string | null;
16
+ default_value_rationale: string | null;
16
17
  }
17
18
  export interface TemplateListItem {
18
19
  name: string;
@@ -33,7 +34,8 @@ export declare function mapFields(fields: {
33
34
  section?: string;
34
35
  description: string;
35
36
  default?: string;
36
- }[], requiredFields: string[]): TemplateListField[];
37
+ default_value_rationale?: string;
38
+ }[], priorityFields: string[]): TemplateListField[];
37
39
  export declare function listTemplateItems(opts?: {
38
40
  templatesOnly?: boolean;
39
41
  }): TemplateListItem[];
@@ -1 +1 @@
1
- {"version":3,"file":"template-listing.d.ts","sourceRoot":"","sources":["../../src/core/template-listing.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAMD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,sDAAsD;AACtD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA4BrD;AAED,wBAAgB,SAAS,CACvB,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EACjG,cAAc,EAAE,MAAM,EAAE,GACvB,iBAAiB,EAAE,CAUrB;AAMD,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,gBAAgB,EAAE,CA6BxF"}
1
+ {"version":3,"file":"template-listing.d.ts","sourceRoot":"","sources":["../../src/core/template-listing.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAMD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,sDAAsD;AACtD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA4BrD;AAED,wBAAgB,SAAS,CACvB,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,uBAAuB,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EACnI,cAAc,EAAE,MAAM,EAAE,GACvB,iBAAiB,EAAE,CAWrB;AAMD,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,gBAAgB,EAAE,CA6BxF"}
@@ -46,8 +46,8 @@ export function sourceName(url) {
46
46
  return null;
47
47
  }
48
48
  }
49
- export function mapFields(fields, requiredFields) {
50
- const required = new Set(requiredFields);
49
+ export function mapFields(fields, priorityFields) {
50
+ const required = new Set(priorityFields);
51
51
  return fields.map((f) => ({
52
52
  name: f.name,
53
53
  type: f.type,
@@ -55,6 +55,7 @@ export function mapFields(fields, requiredFields) {
55
55
  section: f.section ?? null,
56
56
  description: f.description,
57
57
  default: f.default ?? null,
58
+ default_value_rationale: f.default_value_rationale ?? null,
58
59
  }));
59
60
  }
60
61
  // ---------------------------------------------------------------------------
@@ -74,7 +75,7 @@ export function listTemplateItems(opts) {
74
75
  source_url: meta.source_url,
75
76
  source: sourceName(meta.source_url),
76
77
  attribution_text: meta.attribution_text,
77
- fields: mapFields(meta.fields, meta.required_fields),
78
+ fields: mapFields(meta.fields, meta.priority_fields),
78
79
  });
79
80
  }
80
81
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"template-listing.js","sourceRoot":"","sources":["../../src/core/template-listing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template-listing.js","sourceRoot":"","sources":["../../src/core/template-listing.ts"],"names":[],"mappings":"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"}
@@ -15,10 +15,13 @@ export interface PipelineOptions {
15
15
  outputPath: string;
16
16
  values: Record<string, unknown>;
17
17
  fields: FieldDefinition[];
18
- requiredFieldNames?: string[];
18
+ priorityFieldNames?: string[];
19
19
  cleanPatch?: {
20
20
  cleanConfig: CleanConfig;
21
- replacements: Record<string, string>;
21
+ replacements: Record<string, string | {
22
+ value: string;
23
+ format?: Record<string, unknown>;
24
+ }>;
22
25
  };
23
26
  selectionsConfig?: SelectionsConfig;
24
27
  coerceBooleans?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"unified-pipeline.d.ts","sourceRoot":"","sources":["../../src/core/unified-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG9B,UAAU,CAAC,EAAE;QACX,WAAW,EAAE,WAAW,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACtC,CAAC;IAGF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAGpC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAG/D,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,MAAM,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACrE,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG3D,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAwGvF"}
1
+ {"version":3,"file":"unified-pipeline.d.ts","sourceRoot":"","sources":["../../src/core/unified-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG9B,UAAU,CAAC,EAAE;QACX,WAAW,EAAE,WAAW,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,CAAC,CAAC;KAC5F,CAAC;IAGF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAGpC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAG/D,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,MAAM,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACrE,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG3D,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAiIvF"}
@@ -10,10 +10,15 @@
10
10
  import { readFileSync, writeFileSync, copyFileSync, mkdtempSync, rmSync } from 'node:fs';
11
11
  import { join } from 'node:path';
12
12
  import { tmpdir } from 'node:os';
13
+ import AdmZip from 'adm-zip';
14
+ import { DOMParser, XMLSerializer } from '@xmldom/xmldom';
15
+ import { getParagraphText, replaceParagraphTextRange } from '@usejunior/docx-core';
13
16
  import { prepareFillData, fillDocx } from './fill-pipeline.js';
14
17
  import { cleanDocument } from './recipe/cleaner.js';
15
18
  import { patchDocument } from './recipe/patcher.js';
16
19
  import { applySelections } from './selector.js';
20
+ import { enumerateTextParts, getGeneralTextPartNames } from './recipe/ooxml-parts.js';
21
+ const W_NS = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';
17
22
  /**
18
23
  * Run the unified fill pipeline:
19
24
  * 1. Create temp dir
@@ -27,7 +32,7 @@ import { applySelections } from './selector.js';
27
32
  * 9. Cleanup temp dir (unless keepIntermediate)
28
33
  */
29
34
  export async function runFillPipeline(options) {
30
- const { inputPath, outputPath, values, fields, requiredFieldNames = [], cleanPatch, selectionsConfig, coerceBooleans = false, computeDisplayFields, fixSmartQuotes = false, verify, postProcess, keepIntermediate = false, } = options;
35
+ const { inputPath, outputPath, values, fields, priorityFieldNames = [], cleanPatch, selectionsConfig, coerceBooleans = false, computeDisplayFields, fixSmartQuotes = false, verify, postProcess, keepIntermediate = false, } = options;
31
36
  const tempDir = mkdtempSync(join(tmpdir(), 'fill-pipeline-'));
32
37
  let stages;
33
38
  try {
@@ -40,7 +45,25 @@ export async function runFillPipeline(options) {
40
45
  const cleanedPath = join(tempDir, 'cleaned.docx');
41
46
  await cleanDocument(sourcePath, cleanedPath, cleanPatch.cleanConfig);
42
47
  const patchedPath = join(tempDir, 'patched.docx');
43
- await patchDocument(cleanedPath, patchedPath, cleanPatch.replacements);
48
+ const patchResult = await patchDocument(cleanedPath, patchedPath, cleanPatch.replacements);
49
+ // Suppress zero-match warnings for keys whose search text appears in
50
+ // cleaned content (removeRanges, removeParagraphPatterns, removeBeforePattern).
51
+ // These keys target text that was intentionally removed by clean.json.
52
+ const cleanPatterns = [
53
+ ...cleanPatch.cleanConfig.removeParagraphPatterns,
54
+ ...cleanPatch.cleanConfig.removeRanges.flatMap(r => [r.start, r.end]),
55
+ ...(cleanPatch.cleanConfig.removeBeforePattern ? [cleanPatch.cleanConfig.removeBeforePattern] : []),
56
+ ];
57
+ const unexpectedZeroMatch = patchResult.zeroMatchKeys.filter(key => {
58
+ // Extract just the search text portion (after > for context keys)
59
+ const sepIdx = key.indexOf(' > ');
60
+ const searchText = sepIdx !== -1 ? key.slice(sepIdx + 3) : key;
61
+ // Suppress if any clean pattern relates to this key's search text
62
+ return !cleanPatterns.some(p => p.includes(searchText) || searchText.includes(p));
63
+ });
64
+ if (unexpectedZeroMatch.length > 0) {
65
+ console.warn(`Note: ${unexpectedZeroMatch.length} replacement key(s) had zero matches: ${unexpectedZeroMatch.join(', ')}`);
66
+ }
44
67
  currentPath = patchedPath;
45
68
  stages = { clean: cleanedPath, patch: patchedPath, fill: '' };
46
69
  }
@@ -48,7 +71,7 @@ export async function runFillPipeline(options) {
48
71
  const data = prepareFillData({
49
72
  values,
50
73
  fields,
51
- requiredFieldNames,
74
+ priorityFieldNames,
52
75
  useBlankPlaceholder: true,
53
76
  coerceBooleans,
54
77
  computeDisplayFields,
@@ -73,6 +96,8 @@ export async function runFillPipeline(options) {
73
96
  if (stages) {
74
97
  stages.fill = filledPath;
75
98
  }
99
+ // Collapse double spaces left by empty field substitutions (e.g. {initial_word_lower} → "")
100
+ await collapseDoubleSpacesInDocx(filledPath);
76
101
  // Step 7: Copy to output
77
102
  copyFileSync(filledPath, outputPath);
78
103
  // Optional post-processing for recipe-specific normalization.
@@ -104,4 +129,47 @@ export async function runFillPipeline(options) {
104
129
  }
105
130
  }
106
131
  }
132
+ /**
133
+ * Collapse runs of 2+ spaces into a single space within all text paragraphs.
134
+ * Fixes double spaces left when empty field substitutions (e.g. {initial_word_lower} → "")
135
+ * leave adjacent spaces in the DOCX.
136
+ */
137
+ async function collapseDoubleSpacesInDocx(docxPath) {
138
+ const zip = new AdmZip(docxPath);
139
+ const parser = new DOMParser();
140
+ const serializer = new XMLSerializer();
141
+ const parts = enumerateTextParts(zip);
142
+ const partNames = getGeneralTextPartNames(parts);
143
+ let anyModified = false;
144
+ for (const partName of partNames) {
145
+ const entry = zip.getEntry(partName);
146
+ if (!entry)
147
+ continue;
148
+ const doc = parser.parseFromString(entry.getData().toString('utf-8'), 'text/xml');
149
+ const paragraphs = doc.getElementsByTagNameNS(W_NS, 'p');
150
+ let partModified = false;
151
+ for (let i = 0; i < paragraphs.length; i++) {
152
+ const para = paragraphs[i];
153
+ let text = getParagraphText(para);
154
+ let match;
155
+ while ((match = / {2,}/.exec(text)) !== null) {
156
+ try {
157
+ replaceParagraphTextRange(para, match.index, match.index + match[0].length, ' ');
158
+ partModified = true;
159
+ }
160
+ catch {
161
+ break;
162
+ }
163
+ text = getParagraphText(para);
164
+ }
165
+ }
166
+ if (partModified) {
167
+ zip.updateFile(partName, Buffer.from(serializer.serializeToString(doc), 'utf-8'));
168
+ anyModified = true;
169
+ }
170
+ }
171
+ if (anyModified) {
172
+ writeFileSync(docxPath, zip.toBuffer());
173
+ }
174
+ }
107
175
  //# sourceMappingURL=unified-pipeline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"unified-pipeline.js","sourceRoot":"","sources":["../../src/core/unified-pipeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"unified-pipeline.js","sourceRoot":"","sources":["../../src/core/unified-pipeline.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"external.d.ts","sourceRoot":"","sources":["../../../src/core/validation/external.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AASD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,wBAAwB,CA8G1B"}
1
+ {"version":3,"file":"external.d.ts","sourceRoot":"","sources":["../../../src/core/validation/external.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AASD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,wBAAwB,CA4G1B"}
@@ -73,7 +73,6 @@ export function validateExternal(externalDir, externalId) {
73
73
  }
74
74
  }
75
75
  // For qualified keys, check against the searchText, not the full key.
76
- // Nth keys use single-shot replacement so they can't loop — skip the check.
77
76
  const parsed = parseReplacementKey(key, value);
78
77
  if (parsed.type === 'simple' && value.includes(parsed.searchText)) {
79
78
  errors.push(`replacements.json: value for "${key}" contains the key itself (would cause infinite loop)`);
@@ -81,7 +80,6 @@ export function validateExternal(externalDir, externalId) {
81
80
  else if (parsed.type === 'context' && value.includes(parsed.searchText)) {
82
81
  errors.push(`replacements.json: value for "${key}" contains the search text "${parsed.searchText}" (would cause infinite loop)`);
83
82
  }
84
- // nth keys: no infinite-loop check needed (single-shot replacement)
85
83
  // Check field coverage
86
84
  if (tags) {
87
85
  for (const tag of tags) {
@@ -1 +1 @@
1
- {"version":3,"file":"external.js","sourceRoot":"","sources":["../../../src/core/validation/external.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"external.js","sourceRoot":"","sources":["../../../src/core/validation/external.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../src/core/validation/recipe.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AASD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,sBAAsB,CAwIxB"}
1
+ {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../src/core/validation/recipe.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AASD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,sBAAsB,CAsKxB"}
@@ -42,10 +42,32 @@ export function validateRecipe(recipeDir, recipeId, options) {
42
42
  const hasReplacements = existsSync(join(recipeDir, 'replacements.json'));
43
43
  const isScaffold = !hasReplacements;
44
44
  // Validate computed.json if present
45
+ let computedSetFillFields;
45
46
  if (existsSync(computedPath)) {
46
47
  try {
47
48
  const raw = readFileSync(computedPath, 'utf-8');
48
- ComputedProfileSchema.parse(JSON.parse(raw));
49
+ const profile = ComputedProfileSchema.parse(JSON.parse(raw));
50
+ // Collect all fields targeted by defaults or set_fill rules
51
+ computedSetFillFields = new Set();
52
+ for (const field of Object.keys(profile.defaults)) {
53
+ computedSetFillFields.add(field);
54
+ }
55
+ for (const rule of profile.rules) {
56
+ for (const field of Object.keys(rule.set_fill)) {
57
+ computedSetFillFields.add(field);
58
+ }
59
+ }
60
+ // Validate: computed set_fill fields must not have non-empty metadata defaults.
61
+ // When computed.json owns a field, metadata should declare default: "" (or omit it)
62
+ // so that the computed rule is the single source of truth for that field's value.
63
+ for (const field of computedSetFillFields) {
64
+ const metaField = metadata.fields.find((f) => f.name === field);
65
+ if (metaField && metaField.default !== undefined && metaField.default !== '') {
66
+ errors.push(`computed/metadata conflict: field "${field}" is set by computed.json set_fill ` +
67
+ `but has non-empty metadata default "${metaField.default}". ` +
68
+ `Computed-owned fields must use default: "" to avoid conflicting values.`);
69
+ }
70
+ }
49
71
  }
50
72
  catch (err) {
51
73
  const message = err instanceof Error ? err.message : 'invalid format';
@@ -70,9 +92,17 @@ export function validateRecipe(recipeDir, recipeId, options) {
70
92
  }
71
93
  else {
72
94
  const unknownTargets = new Set();
73
- for (const [key, value] of Object.entries(replacements)) {
74
- if (typeof value !== 'string') {
75
- errors.push(`replacements.json: value for "${key}" must be a string`);
95
+ for (const [key, rawValue] of Object.entries(replacements)) {
96
+ // Value can be a string or { value: string, format?: object }
97
+ let value;
98
+ if (typeof rawValue === 'string') {
99
+ value = rawValue;
100
+ }
101
+ else if (typeof rawValue === 'object' && rawValue !== null && typeof rawValue.value === 'string') {
102
+ value = rawValue.value;
103
+ }
104
+ else {
105
+ errors.push(`replacements.json: value for "${key}" must be a string or { value: string, format?: object }`);
76
106
  continue;
77
107
  }
78
108
  // Value must contain at least one {identifier} tag
@@ -96,7 +126,6 @@ export function validateRecipe(recipeDir, recipeId, options) {
96
126
  }
97
127
  // Value must not contain the source key (infinite loop prevention)
98
128
  // For qualified keys, check against the searchText, not the full key.
99
- // Nth keys use single-shot replacement so they can't loop — skip the check.
100
129
  const parsed = parseReplacementKey(key, value);
101
130
  if (parsed.type === 'simple' && value.includes(parsed.searchText)) {
102
131
  errors.push(`replacements.json: value for "${key}" contains the key itself (would cause infinite loop)`);
@@ -104,7 +133,6 @@ export function validateRecipe(recipeDir, recipeId, options) {
104
133
  else if (parsed.type === 'context' && value.includes(parsed.searchText)) {
105
134
  errors.push(`replacements.json: value for "${key}" contains the search text "${parsed.searchText}" (would cause infinite loop)`);
106
135
  }
107
- // nth keys: no infinite-loop check needed (single-shot replacement)
108
136
  }
109
137
  for (const fieldName of unknownTargets) {
110
138
  warnings.push(`Replacement target {${fieldName}} not found in metadata fields`);
@@ -1 +1 @@
1
- {"version":3,"file":"recipe.js","sourceRoot":"","sources":["../../../src/core/validation/recipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAU9D,gEAAgE;AAChE,MAAM,MAAM,GAAG,uBAAuB,CAAC;AACvC,iEAAiE;AACjE,MAAM,YAAY,GAAG,YAAY,CAAC;AAClC,wDAAwD;AACxD,MAAM,WAAW,GAAG,wBAAwB,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,SAAiB,EACjB,QAAgB,EAChB,OAA8B;IAE9B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,KAAK,CAAC;IAExC,mDAAmD;IACnD,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACzE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,oCAAoC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IACtH,CAAC;IAED,oBAAoB;IACpB,MAAM,UAAU,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACvE,CAAC;IAED,uEAAuE;IACvE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/E,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACtD,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG,CAAC,eAAe,CAAC;IAEpC,oCAAoC;IACpC,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAChD,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;YACtE,MAAM,CAAC,IAAI,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,wFAAwF,CAAC,CAAC;QACxG,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACpF,CAAC;IAED,mDAAmD;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;QACxE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;YACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;gBACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,MAAM,CAAC,IAAI,CAAC,iCAAiC,GAAG,oBAAoB,CAAC,CAAC;oBACtE,SAAS;gBACX,CAAC;gBAED,mDAAmD;gBACnD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/B,MAAM,CAAC,IAAI,CACT,iCAAiC,GAAG,sDAAsD,KAAK,GAAG,CACnG,CAAC;gBACJ,CAAC;gBAED,6EAA6E;gBAC7E,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAC5C,IAAI,SAAS,EAAE,CAAC;oBACd,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;wBAC9B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC7B,MAAM,CAAC,IAAI,CACT,kCAAkC,KAAK,mBAAmB,GAAG,oCAAoC,CAClG,CAAC;4BACF,SAAS;wBACX,CAAC;wBACD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;wBACrC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;4BACvC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;wBAChC,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,mEAAmE;gBACnE,sEAAsE;gBACtE,4EAA4E;gBAC5E,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;oBAClE,MAAM,CAAC,IAAI,CACT,iCAAiC,GAAG,uDAAuD,CAC5F,CAAC;gBACJ,CAAC;qBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC1E,MAAM,CAAC,IAAI,CACT,iCAAiC,GAAG,+BAA+B,MAAM,CAAC,UAAU,+BAA+B,CACpH,CAAC;gBACJ,CAAC;gBACD,oEAAoE;YACtE,CAAC;YACD,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;gBACvC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,SAAS,gCAAgC,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,sBAAuB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC7C,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IACxD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACjD,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACrF,CAAC"}
1
+ {"version":3,"file":"recipe.js","sourceRoot":"","sources":["../../../src/core/validation/recipe.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
+ import type { ReplacementValue } from '../recipe/replacement-keys.js';
1
2
  export interface ScanMetadataCoverageInput {
2
3
  scannedShortPlaceholders: string[];
3
4
  metadataFields: string[];
4
- replacements: Record<string, string>;
5
+ replacements: Record<string, ReplacementValue>;
5
6
  extraCoveredFields?: string[];
6
7
  ignoredPlaceholders?: string[];
7
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scan-metadata.d.ts","sourceRoot":"","sources":["../../../src/core/validation/scan-metadata.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,yBAAyB;IACxC,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,0BAA0B;IACzC,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,0BAA0B,EAAE,MAAM,EAAE,CAAC;IACrC,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,yBAAyB,EAAE,MAAM,EAAE,CAAC;IACpC,wCAAwC,EAAE,MAAM,EAAE,CAAC;CACpD;AAWD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,yBAAyB,GAC/B,0BAA0B,CAiE5B"}
1
+ {"version":3,"file":"scan-metadata.d.ts","sourceRoot":"","sources":["../../../src/core/validation/scan-metadata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAItE,MAAM,WAAW,yBAAyB;IACxC,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC/C,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,0BAA0B;IACzC,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,0BAA0B,EAAE,MAAM,EAAE,CAAC;IACrC,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,yBAAyB,EAAE,MAAM,EAAE,CAAC;IACpC,wCAAwC,EAAE,MAAM,EAAE,CAAC;CACpD;AAWD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,yBAAyB,GAC/B,0BAA0B,CAmF5B"}
@@ -1,4 +1,4 @@
1
- import { parseReplacementKey } from '../recipe/replacement-keys.js';
1
+ import { parseReplacementKey, resolveReplacementValue } from '../recipe/replacement-keys.js';
2
2
  const FIELD_TAG_RE = /\{([a-z_][a-z0-9_]*)\}/g;
3
3
  function extractFieldTags(template) {
4
4
  const out = new Set();
@@ -18,7 +18,8 @@ export function assessScanMetadataCoverage(input) {
18
18
  const extraCovered = new Set(input.extraCoveredFields ?? []);
19
19
  const placeholderFieldMap = new Map();
20
20
  const mappedFieldsNotInMetadata = new Set();
21
- for (const [key, value] of Object.entries(input.replacements)) {
21
+ for (const [key, rawValue] of Object.entries(input.replacements)) {
22
+ const value = resolveReplacementValue(rawValue);
22
23
  const parsed = parseReplacementKey(key, value);
23
24
  const searchText = parsed.searchText;
24
25
  const tags = extractFieldTags(value);
@@ -33,6 +34,22 @@ export function assessScanMetadataCoverage(input) {
33
34
  }
34
35
  }
35
36
  }
37
+ // Brackets embedded inside longer simple-key searchTexts are still covered
38
+ // by those keys (the patcher replaces the full key including the bracket).
39
+ const embeddedBracketCoverage = new Map();
40
+ for (const [searchText, fields] of placeholderFieldMap.entries()) {
41
+ for (const match of searchText.matchAll(/\[[^\]]+\]/g)) {
42
+ const bracket = match[0];
43
+ if (bracket !== searchText && fields.size > 0) {
44
+ if (!embeddedBracketCoverage.has(bracket)) {
45
+ embeddedBracketCoverage.set(bracket, new Set());
46
+ }
47
+ for (const field of fields) {
48
+ embeddedBracketCoverage.get(bracket).add(field);
49
+ }
50
+ }
51
+ }
52
+ }
36
53
  const coveredShort = new Set();
37
54
  const uncoveredShort = new Set();
38
55
  const ignoredShort = new Set();
@@ -42,7 +59,7 @@ export function assessScanMetadataCoverage(input) {
42
59
  ignoredShort.add(placeholder);
43
60
  continue;
44
61
  }
45
- const mapped = placeholderFieldMap.get(placeholder);
62
+ const mapped = placeholderFieldMap.get(placeholder) ?? embeddedBracketCoverage.get(placeholder);
46
63
  if (!mapped || mapped.size === 0) {
47
64
  uncoveredShort.add(placeholder);
48
65
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"scan-metadata.js","sourceRoot":"","sources":["../../../src/core/validation/scan-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,MAAM,YAAY,GAAG,yBAAyB,CAAC;AAmB/C,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,IAAI,KAAK,GAA2B,IAAI,CAAC;IACzC,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACtD,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAgC;IAEhC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;IAE7D,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC3D,MAAM,yBAAyB,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACrC,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACzC,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;QACtD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,yBAAyB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAS,YAAY,CAAC,CAAC;IAEpD,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,wBAAwB,EAAE,CAAC;QACzD,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACjC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAChC,SAAS;QACX,CAAC;QAED,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,MAAM,mBAAmB,GAAG,MAAM,CAAC,WAAW,CAC5C,CAAC,GAAG,mBAAmB,CAAC,OAAO,EAAE,CAAC;SAC/B,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SACtC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CACrE,CAAC;IAEF,MAAM,wCAAwC,GAAG,CAAC,GAAG,gBAAgB,CAAC;SACnE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SAC5C,IAAI,EAAE,CAAC;IAEV,OAAO;QACL,wBAAwB,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,EAAE;QAClD,0BAA0B,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,IAAI,EAAE;QACtD,wBAAwB,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,EAAE;QAClD,mBAAmB;QACnB,yBAAyB,EAAE,CAAC,GAAG,yBAAyB,CAAC,CAAC,IAAI,EAAE;QAChE,wCAAwC;KACzC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"scan-metadata.js","sourceRoot":"","sources":["../../../src/core/validation/scan-metadata.ts"],"names":[],"mappings":"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"}
@@ -59,7 +59,7 @@ export function validateTemplate(templateDir, templateId) {
59
59
  };
60
60
  }
61
61
  const metadataFieldNames = new Set(metadata.fields.map((f) => f.name));
62
- const requiredFieldNames = new Set(metadata.required_fields);
62
+ const priorityFieldNames = new Set(metadata.priority_fields);
63
63
  // Check if this template uses declarative replacements
64
64
  const replacementsPath = join(templateDir, 'replacements.json');
65
65
  const hasReplacements = existsSync(replacementsPath);
@@ -119,8 +119,8 @@ export function validateTemplate(templateDir, templateId) {
119
119
  for (const fieldName of metadataFieldNames) {
120
120
  const inTags = foundTags.has(fieldName) || foundConditionalFields.has(fieldName);
121
121
  if (!inTags) {
122
- if (requiredFieldNames.has(fieldName)) {
123
- errors.push(`Required field "${fieldName}" defined in metadata but not found in replacement values or template.docx`);
122
+ if (priorityFieldNames.has(fieldName)) {
123
+ errors.push(`Priority field "${fieldName}" defined in metadata but not found in replacement values or template.docx`);
124
124
  }
125
125
  else {
126
126
  warnings.push(`Optional field "${fieldName}" defined in metadata but not found in replacement values or template.docx`);
@@ -174,8 +174,8 @@ export function validateTemplate(templateDir, templateId) {
174
174
  for (const fieldName of metadataFieldNames) {
175
175
  const inDocx = foundTags.has(fieldName) || foundConditionalFields.has(fieldName);
176
176
  if (!inDocx) {
177
- if (requiredFieldNames.has(fieldName)) {
178
- errors.push(`Required field "${fieldName}" defined in metadata but not found as {${fieldName}} in template.docx`);
177
+ if (priorityFieldNames.has(fieldName)) {
178
+ errors.push(`Priority field "${fieldName}" defined in metadata but not found as {${fieldName}} in template.docx`);
179
179
  }
180
180
  else {
181
181
  warnings.push(`Optional field "${fieldName}" defined in metadata but not found as {${fieldName}} in template.docx`);
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 UseJunior
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,101 @@
1
+ # @usejunior/docx-core
2
+
3
+ [![npm version](https://img.shields.io/npm/v/%40usejunior%2Fdocx-core)](https://www.npmjs.com/package/@usejunior/docx-core)
4
+ [![CI](https://github.com/UseJunior/safe-docx/actions/workflows/ci.yml/badge.svg)](https://github.com/UseJunior/safe-docx/actions/workflows/ci.yml)
5
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/UseJunior/safe-docx/blob/main/LICENSE)
6
+
7
+ Core Safe Docx library for brownfield editing and comparison of existing `.docx` files.
8
+
9
+ ## What This Package Is
10
+
11
+ `@usejunior/docx-core` is the production engine behind Safe Docx. It is designed for surgical operations on existing Word documents where formatting fidelity and deterministic behavior matter.
12
+
13
+ Primary capabilities:
14
+
15
+ - tracked-change comparison output for review workflows
16
+ - revision extraction and OOXML-safe document primitives
17
+ - formatting-preserving text and paragraph operations
18
+ - comment and footnote primitive support
19
+
20
+ Default comparison is pure TypeScript atomizer (`engine: "auto"` -> `atomizer`).
21
+
22
+ ## What This Package Is Not
23
+
24
+ - Not a hosted service
25
+ - Not a document-generation framework for creating new files from scratch
26
+ - Not dependent on .NET for supported runtime APIs
27
+
28
+ Internal benchmark code exists for maintainer analysis, but benchmarking is not a user-facing feature.
29
+
30
+ ## Install
31
+
32
+ ```bash
33
+ npm install @usejunior/docx-core
34
+ ```
35
+
36
+ ## Quickstart: Compare Two DOCX Files
37
+
38
+ ```ts
39
+ import { readFile, writeFile } from 'node:fs/promises';
40
+ import { compareDocuments } from '@usejunior/docx-core';
41
+
42
+ const original = await readFile('./original.docx');
43
+ const revised = await readFile('./revised.docx');
44
+
45
+ const result = await compareDocuments(original, revised, {
46
+ author: 'Comparison',
47
+ // engine defaults to "auto" (atomizer)
48
+ });
49
+
50
+ await writeFile('./output.redline.docx', result.document);
51
+ console.log(result.engine, result.stats);
52
+ ```
53
+
54
+ ## Engine Model
55
+
56
+ - `atomizer` (default via `auto`): primary production path
57
+ - `wmlcomparer`: not available through supported programmatic API usage
58
+
59
+ ## Dependency Footprint
60
+
61
+ Runtime dependencies are intentionally small:
62
+
63
+ - `@xmldom/xmldom` for XML DOM handling
64
+ - `jszip` for DOCX zip container handling
65
+
66
+ No native binaries, and no .NET prerequisite for supported runtime API usage.
67
+
68
+ ## Automated Fixture Coverage
69
+
70
+ In-repo automated fixtures currently include:
71
+
72
+ - Common Paper style mutual NDA variants
73
+ - Bonterms mutual NDA fixture
74
+ - Letter of Intent fixture
75
+ - ILPA limited partnership agreement redline fixtures
76
+
77
+ ## Designed for Complex DOCX Classes
78
+
79
+ `@usejunior/docx-core` is designed to support complex legal/business document classes such as:
80
+
81
+ - NVCA financing forms
82
+ - YC SAFEs
83
+ - Offering memoranda
84
+ - Order forms and services agreements
85
+ - Limited partnership agreements
86
+
87
+ ## From-Scratch Generation
88
+
89
+ If your primary use case is generating new documents from scratch, use a generation-oriented package such as [`docx`](https://www.npmjs.com/package/docx).
90
+
91
+ ## Development
92
+
93
+ ```bash
94
+ npm run build -w @usejunior/docx-core
95
+ npm run test:run -w @usejunior/docx-core
96
+ npm run lint -w @usejunior/docx-core
97
+ ```
98
+
99
+ ## License
100
+
101
+ MIT