@open-agreements/open-agreements 0.2.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/LICENSE +21 -0
- package/README.md +359 -0
- package/bin/open-agreements.js +4 -0
- package/content/external/LICENSE +27 -0
- package/content/external/README.md +38 -0
- package/content/external/yc-safe-discount/README.md +16 -0
- package/content/external/yc-safe-discount/clean.json +4 -0
- package/content/external/yc-safe-discount/metadata.yaml +67 -0
- package/content/external/yc-safe-discount/replacements.json +13 -0
- package/content/external/yc-safe-discount/template.docx +0 -0
- package/content/external/yc-safe-mfn/README.md +16 -0
- package/content/external/yc-safe-mfn/clean.json +4 -0
- package/content/external/yc-safe-mfn/metadata.yaml +64 -0
- package/content/external/yc-safe-mfn/replacements.json +12 -0
- package/content/external/yc-safe-mfn/template.docx +0 -0
- package/content/external/yc-safe-pro-rata-side-letter/README.md +16 -0
- package/content/external/yc-safe-pro-rata-side-letter/clean.json +4 -0
- package/content/external/yc-safe-pro-rata-side-letter/metadata.yaml +49 -0
- package/content/external/yc-safe-pro-rata-side-letter/replacements.json +9 -0
- package/content/external/yc-safe-pro-rata-side-letter/template.docx +0 -0
- package/content/external/yc-safe-valuation-cap/README.md +16 -0
- package/content/external/yc-safe-valuation-cap/clean.json +4 -0
- package/content/external/yc-safe-valuation-cap/metadata.yaml +64 -0
- package/content/external/yc-safe-valuation-cap/replacements.json +12 -0
- package/content/external/yc-safe-valuation-cap/template.docx +0 -0
- package/content/recipes/nvca-certificate-of-incorporation/clean.json +8 -0
- package/content/recipes/nvca-certificate-of-incorporation/metadata.yaml +43 -0
- package/content/recipes/nvca-certificate-of-incorporation/replacements.json +9 -0
- package/content/recipes/nvca-indemnification-agreement/clean.json +17 -0
- package/content/recipes/nvca-indemnification-agreement/metadata.yaml +79 -0
- package/content/recipes/nvca-indemnification-agreement/replacements.json +17 -0
- package/content/recipes/nvca-investors-rights-agreement/clean.json +12 -0
- package/content/recipes/nvca-investors-rights-agreement/metadata.yaml +71 -0
- package/content/recipes/nvca-investors-rights-agreement/replacements.json +18 -0
- package/content/recipes/nvca-management-rights-letter/clean.json +7 -0
- package/content/recipes/nvca-management-rights-letter/metadata.yaml +47 -0
- package/content/recipes/nvca-management-rights-letter/replacements.json +11 -0
- package/content/recipes/nvca-rofr-co-sale-agreement/clean.json +7 -0
- package/content/recipes/nvca-rofr-co-sale-agreement/metadata.yaml +76 -0
- package/content/recipes/nvca-rofr-co-sale-agreement/replacements.json +17 -0
- package/content/recipes/nvca-stock-purchase-agreement/clean.json +13 -0
- package/content/recipes/nvca-stock-purchase-agreement/computed.json +103 -0
- package/content/recipes/nvca-stock-purchase-agreement/metadata.yaml +138 -0
- package/content/recipes/nvca-stock-purchase-agreement/normalize.json +83 -0
- package/content/recipes/nvca-stock-purchase-agreement/replacements.json +41 -0
- package/content/recipes/nvca-voting-agreement/README.md +53 -0
- package/content/recipes/nvca-voting-agreement/clean.json +7 -0
- package/content/recipes/nvca-voting-agreement/metadata.yaml +66 -0
- package/content/recipes/nvca-voting-agreement/replacements.json +18 -0
- package/content/templates/bonterms-mutual-nda/README.md +27 -0
- package/content/templates/bonterms-mutual-nda/metadata.yaml +58 -0
- package/content/templates/bonterms-mutual-nda/source.json +18 -0
- package/content/templates/bonterms-mutual-nda/template.docx +0 -0
- package/content/templates/bonterms-professional-services-agreement/README.md +24 -0
- package/content/templates/bonterms-professional-services-agreement/metadata.yaml +45 -0
- package/content/templates/bonterms-professional-services-agreement/selections.json +12 -0
- package/content/templates/bonterms-professional-services-agreement/source.json +18 -0
- package/content/templates/bonterms-professional-services-agreement/template.docx +0 -0
- package/content/templates/closing-checklist/metadata.yaml +39 -0
- package/content/templates/closing-checklist/template.docx +0 -0
- package/content/templates/common-paper-ai-addendum/README.md +23 -0
- package/content/templates/common-paper-ai-addendum/metadata.yaml +31 -0
- package/content/templates/common-paper-ai-addendum/template.docx +0 -0
- package/content/templates/common-paper-ai-addendum-in-app/README.md +21 -0
- package/content/templates/common-paper-ai-addendum-in-app/metadata.yaml +21 -0
- package/content/templates/common-paper-ai-addendum-in-app/template.docx +0 -0
- package/content/templates/common-paper-amendment/README.md +27 -0
- package/content/templates/common-paper-amendment/metadata.yaml +53 -0
- package/content/templates/common-paper-amendment/template.docx +0 -0
- package/content/templates/common-paper-business-associate-agreement/README.md +29 -0
- package/content/templates/common-paper-business-associate-agreement/metadata.yaml +56 -0
- package/content/templates/common-paper-business-associate-agreement/replacements.json +3 -0
- package/content/templates/common-paper-business-associate-agreement/template.docx +0 -0
- package/content/templates/common-paper-cloud-service-agreement/README.md +32 -0
- package/content/templates/common-paper-cloud-service-agreement/metadata.yaml +354 -0
- package/content/templates/common-paper-cloud-service-agreement/template.docx +0 -0
- package/content/templates/common-paper-csa-click-through/README.md +33 -0
- package/content/templates/common-paper-csa-click-through/metadata.yaml +73 -0
- package/content/templates/common-paper-csa-click-through/template.docx +0 -0
- package/content/templates/common-paper-csa-with-ai/README.md +49 -0
- package/content/templates/common-paper-csa-with-ai/metadata.yaml +143 -0
- package/content/templates/common-paper-csa-with-ai/replacements.json +7 -0
- package/content/templates/common-paper-csa-with-ai/template.docx +0 -0
- package/content/templates/common-paper-csa-with-sla/README.md +53 -0
- package/content/templates/common-paper-csa-with-sla/metadata.yaml +159 -0
- package/content/templates/common-paper-csa-with-sla/replacements.json +7 -0
- package/content/templates/common-paper-csa-with-sla/template.docx +0 -0
- package/content/templates/common-paper-csa-without-sla/README.md +47 -0
- package/content/templates/common-paper-csa-without-sla/metadata.yaml +135 -0
- package/content/templates/common-paper-csa-without-sla/replacements.json +7 -0
- package/content/templates/common-paper-csa-without-sla/template.docx +0 -0
- package/content/templates/common-paper-data-processing-agreement/README.md +46 -0
- package/content/templates/common-paper-data-processing-agreement/metadata.yaml +130 -0
- package/content/templates/common-paper-data-processing-agreement/replacements.json +3 -0
- package/content/templates/common-paper-data-processing-agreement/template.docx +0 -0
- package/content/templates/common-paper-design-partner-agreement/README.md +29 -0
- package/content/templates/common-paper-design-partner-agreement/metadata.yaml +59 -0
- package/content/templates/common-paper-design-partner-agreement/replacements.json +4 -0
- package/content/templates/common-paper-design-partner-agreement/template.docx +0 -0
- package/content/templates/common-paper-independent-contractor-agreement/README.md +27 -0
- package/content/templates/common-paper-independent-contractor-agreement/metadata.yaml +55 -0
- package/content/templates/common-paper-independent-contractor-agreement/template.docx +0 -0
- package/content/templates/common-paper-letter-of-intent/README.md +25 -0
- package/content/templates/common-paper-letter-of-intent/metadata.yaml +42 -0
- package/content/templates/common-paper-letter-of-intent/template.docx +0 -0
- package/content/templates/common-paper-mutual-nda/README.md +29 -0
- package/content/templates/common-paper-mutual-nda/metadata.yaml +59 -0
- package/content/templates/common-paper-mutual-nda/selections.json +38 -0
- package/content/templates/common-paper-mutual-nda/template.docx +0 -0
- package/content/templates/common-paper-one-way-nda/README.md +27 -0
- package/content/templates/common-paper-one-way-nda/metadata.yaml +59 -0
- package/content/templates/common-paper-one-way-nda/template.docx +0 -0
- package/content/templates/common-paper-order-form/README.md +36 -0
- package/content/templates/common-paper-order-form/metadata.yaml +87 -0
- package/content/templates/common-paper-order-form/replacements.json +5 -0
- package/content/templates/common-paper-order-form/template.docx +0 -0
- package/content/templates/common-paper-order-form-with-sla/README.md +42 -0
- package/content/templates/common-paper-order-form-with-sla/metadata.yaml +111 -0
- package/content/templates/common-paper-order-form-with-sla/replacements.json +5 -0
- package/content/templates/common-paper-order-form-with-sla/template.docx +0 -0
- package/content/templates/common-paper-partnership-agreement/README.md +34 -0
- package/content/templates/common-paper-partnership-agreement/metadata.yaml +78 -0
- package/content/templates/common-paper-partnership-agreement/replacements.json +7 -0
- package/content/templates/common-paper-partnership-agreement/template.docx +0 -0
- package/content/templates/common-paper-pilot-agreement/README.md +34 -0
- package/content/templates/common-paper-pilot-agreement/metadata.yaml +100 -0
- package/content/templates/common-paper-pilot-agreement/replacements.json +4 -0
- package/content/templates/common-paper-pilot-agreement/selections.json +37 -0
- package/content/templates/common-paper-pilot-agreement/template.docx +0 -0
- package/content/templates/common-paper-professional-services-agreement/README.md +44 -0
- package/content/templates/common-paper-professional-services-agreement/metadata.yaml +124 -0
- package/content/templates/common-paper-professional-services-agreement/replacements.json +8 -0
- package/content/templates/common-paper-professional-services-agreement/template.docx +0 -0
- package/content/templates/common-paper-software-license-agreement/README.md +18 -0
- package/content/templates/common-paper-software-license-agreement/metadata.yaml +13 -0
- package/content/templates/common-paper-software-license-agreement/template.docx +0 -0
- package/content/templates/common-paper-statement-of-work/README.md +32 -0
- package/content/templates/common-paper-statement-of-work/metadata.yaml +71 -0
- package/content/templates/common-paper-statement-of-work/replacements.json +3 -0
- package/content/templates/common-paper-statement-of-work/template.docx +0 -0
- package/content/templates/common-paper-term-sheet/README.md +22 -0
- package/content/templates/common-paper-term-sheet/metadata.yaml +28 -0
- package/content/templates/common-paper-term-sheet/template.docx +0 -0
- package/content/templates/openagreements-employee-ip-inventions-assignment/README.md +31 -0
- package/content/templates/openagreements-employee-ip-inventions-assignment/metadata.yaml +71 -0
- package/content/templates/openagreements-employee-ip-inventions-assignment/template.docx +0 -0
- package/content/templates/openagreements-employee-ip-inventions-assignment/template.md +80 -0
- package/content/templates/openagreements-employment-confidentiality-acknowledgement/README.md +30 -0
- package/content/templates/openagreements-employment-confidentiality-acknowledgement/metadata.yaml +60 -0
- package/content/templates/openagreements-employment-confidentiality-acknowledgement/template.docx +0 -0
- package/content/templates/openagreements-employment-confidentiality-acknowledgement/template.md +51 -0
- package/content/templates/openagreements-employment-offer-letter/README.md +33 -0
- package/content/templates/openagreements-employment-offer-letter/metadata.yaml +75 -0
- package/content/templates/openagreements-employment-offer-letter/template.docx +0 -0
- package/content/templates/openagreements-employment-offer-letter/template.md +90 -0
- package/content/templates/working-group-list/metadata.yaml +22 -0
- package/content/templates/working-group-list/template.docx +0 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +199 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/checklist.d.ts +22 -0
- package/dist/commands/checklist.d.ts.map +1 -0
- package/dist/commands/checklist.js +222 -0
- package/dist/commands/checklist.js.map +1 -0
- package/dist/commands/fill.d.ts +18 -0
- package/dist/commands/fill.d.ts.map +1 -0
- package/dist/commands/fill.js +119 -0
- package/dist/commands/fill.js.map +1 -0
- package/dist/commands/list.d.ts +7 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +247 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/recipe.d.ts +24 -0
- package/dist/commands/recipe.d.ts.map +1 -0
- package/dist/commands/recipe.js +96 -0
- package/dist/commands/recipe.js.map +1 -0
- package/dist/commands/scan.d.ts +28 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +138 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/validate.d.ts +6 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +158 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/core/checklist/index.d.ts +38 -0
- package/dist/core/checklist/index.d.ts.map +1 -0
- package/dist/core/checklist/index.js +229 -0
- package/dist/core/checklist/index.js.map +1 -0
- package/dist/core/checklist/patch-apply.d.ts +65 -0
- package/dist/core/checklist/patch-apply.d.ts.map +1 -0
- package/dist/core/checklist/patch-apply.js +274 -0
- package/dist/core/checklist/patch-apply.js.map +1 -0
- package/dist/core/checklist/patch-schemas.d.ts +86 -0
- package/dist/core/checklist/patch-schemas.d.ts.map +1 -0
- package/dist/core/checklist/patch-schemas.js +89 -0
- package/dist/core/checklist/patch-schemas.js.map +1 -0
- package/dist/core/checklist/patch-validator.d.ts +76 -0
- package/dist/core/checklist/patch-validator.d.ts.map +1 -0
- package/dist/core/checklist/patch-validator.js +404 -0
- package/dist/core/checklist/patch-validator.js.map +1 -0
- package/dist/core/checklist/schemas.d.ts +270 -0
- package/dist/core/checklist/schemas.d.ts.map +1 -0
- package/dist/core/checklist/schemas.js +229 -0
- package/dist/core/checklist/schemas.js.map +1 -0
- package/dist/core/checklist/test-utils.d.ts +7 -0
- package/dist/core/checklist/test-utils.d.ts.map +1 -0
- package/dist/core/checklist/test-utils.js +13 -0
- package/dist/core/checklist/test-utils.js.map +1 -0
- package/dist/core/command-generation/adapters/claude.d.ts +11 -0
- package/dist/core/command-generation/adapters/claude.d.ts.map +1 -0
- package/dist/core/command-generation/adapters/claude.js +91 -0
- package/dist/core/command-generation/adapters/claude.js.map +1 -0
- package/dist/core/command-generation/types.d.ts +14 -0
- package/dist/core/command-generation/types.d.ts.map +1 -0
- package/dist/core/command-generation/types.js +2 -0
- package/dist/core/command-generation/types.js.map +1 -0
- package/dist/core/employment/jurisdiction-rules.d.ts +20 -0
- package/dist/core/employment/jurisdiction-rules.d.ts.map +1 -0
- package/dist/core/employment/jurisdiction-rules.js +57 -0
- package/dist/core/employment/jurisdiction-rules.js.map +1 -0
- package/dist/core/employment/memo.d.ts +57 -0
- package/dist/core/employment/memo.d.ts.map +1 -0
- package/dist/core/employment/memo.js +589 -0
- package/dist/core/employment/memo.js.map +1 -0
- package/dist/core/engine.d.ts +13 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +182 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/external/index.d.ts +8 -0
- package/dist/core/external/index.d.ts.map +1 -0
- package/dist/core/external/index.js +50 -0
- package/dist/core/external/index.js.map +1 -0
- package/dist/core/external/types.d.ts +18 -0
- package/dist/core/external/types.d.ts.map +1 -0
- package/dist/core/external/types.js +2 -0
- package/dist/core/external/types.js.map +1 -0
- package/dist/core/fill-pipeline.d.ts +64 -0
- package/dist/core/fill-pipeline.d.ts.map +1 -0
- package/dist/core/fill-pipeline.js +350 -0
- package/dist/core/fill-pipeline.js.map +1 -0
- package/dist/core/fill-utils.d.ts +39 -0
- package/dist/core/fill-utils.d.ts.map +1 -0
- package/dist/core/fill-utils.js +127 -0
- package/dist/core/fill-utils.js.map +1 -0
- package/dist/core/metadata.d.ts +194 -0
- package/dist/core/metadata.d.ts.map +1 -0
- package/dist/core/metadata.js +197 -0
- package/dist/core/metadata.js.map +1 -0
- package/dist/core/recipe/bracket-normalizer.d.ts +46 -0
- package/dist/core/recipe/bracket-normalizer.d.ts.map +1 -0
- package/dist/core/recipe/bracket-normalizer.js +354 -0
- package/dist/core/recipe/bracket-normalizer.js.map +1 -0
- package/dist/core/recipe/cleaner.d.ts +27 -0
- package/dist/core/recipe/cleaner.d.ts.map +1 -0
- package/dist/core/recipe/cleaner.js +345 -0
- package/dist/core/recipe/cleaner.js.map +1 -0
- package/dist/core/recipe/computed.d.ts +136 -0
- package/dist/core/recipe/computed.d.ts.map +1 -0
- package/dist/core/recipe/computed.js +225 -0
- package/dist/core/recipe/computed.js.map +1 -0
- package/dist/core/recipe/downloader.d.ts +8 -0
- package/dist/core/recipe/downloader.d.ts.map +1 -0
- package/dist/core/recipe/downloader.js +58 -0
- package/dist/core/recipe/downloader.js.map +1 -0
- package/dist/core/recipe/index.d.ts +17 -0
- package/dist/core/recipe/index.d.ts.map +1 -0
- package/dist/core/recipe/index.js +90 -0
- package/dist/core/recipe/index.js.map +1 -0
- package/dist/core/recipe/ooxml-parts.d.ts +21 -0
- package/dist/core/recipe/ooxml-parts.d.ts.map +1 -0
- package/dist/core/recipe/ooxml-parts.js +33 -0
- package/dist/core/recipe/ooxml-parts.js.map +1 -0
- package/dist/core/recipe/patcher.d.ts +34 -0
- package/dist/core/recipe/patcher.d.ts.map +1 -0
- package/dist/core/recipe/patcher.js +423 -0
- package/dist/core/recipe/patcher.js.map +1 -0
- package/dist/core/recipe/replacement-keys.d.ts +33 -0
- package/dist/core/recipe/replacement-keys.d.ts.map +1 -0
- package/dist/core/recipe/replacement-keys.js +53 -0
- package/dist/core/recipe/replacement-keys.js.map +1 -0
- package/dist/core/recipe/source-drift.d.ts +33 -0
- package/dist/core/recipe/source-drift.d.ts.map +1 -0
- package/dist/core/recipe/source-drift.js +113 -0
- package/dist/core/recipe/source-drift.js.map +1 -0
- package/dist/core/recipe/types.d.ts +33 -0
- package/dist/core/recipe/types.d.ts.map +1 -0
- package/dist/core/recipe/types.js +2 -0
- package/dist/core/recipe/types.js.map +1 -0
- package/dist/core/recipe/verifier.d.ts +24 -0
- package/dist/core/recipe/verifier.d.ts.map +1 -0
- package/dist/core/recipe/verifier.js +158 -0
- package/dist/core/recipe/verifier.js.map +1 -0
- package/dist/core/selector.d.ts +41 -0
- package/dist/core/selector.d.ts.map +1 -0
- package/dist/core/selector.js +323 -0
- package/dist/core/selector.js.map +1 -0
- package/dist/core/unified-pipeline.d.ts +53 -0
- package/dist/core/unified-pipeline.d.ts.map +1 -0
- package/dist/core/unified-pipeline.js +107 -0
- package/dist/core/unified-pipeline.js.map +1 -0
- package/dist/core/validation/external.d.ts +16 -0
- package/dist/core/validation/external.d.ts.map +1 -0
- package/dist/core/validation/external.js +114 -0
- package/dist/core/validation/external.js.map +1 -0
- package/dist/core/validation/license.d.ts +15 -0
- package/dist/core/validation/license.d.ts.map +1 -0
- package/dist/core/validation/license.js +30 -0
- package/dist/core/validation/license.js.map +1 -0
- package/dist/core/validation/output.d.ts +12 -0
- package/dist/core/validation/output.d.ts.map +1 -0
- package/dist/core/validation/output.js +47 -0
- package/dist/core/validation/output.js.map +1 -0
- package/dist/core/validation/recipe.d.ts +19 -0
- package/dist/core/validation/recipe.d.ts.map +1 -0
- package/dist/core/validation/recipe.js +159 -0
- package/dist/core/validation/recipe.js.map +1 -0
- package/dist/core/validation/scan-metadata.d.ts +21 -0
- package/dist/core/validation/scan-metadata.d.ts.map +1 -0
- package/dist/core/validation/scan-metadata.js +70 -0
- package/dist/core/validation/scan-metadata.js.map +1 -0
- package/dist/core/validation/template.d.ts +11 -0
- package/dist/core/validation/template.d.ts.map +1 -0
- package/dist/core/validation/template.js +248 -0
- package/dist/core/validation/template.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/paths.d.ts +43 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +149 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +148 -0
- package/skills/cloud-service-agreement/CONNECTORS.md +19 -0
- package/skills/cloud-service-agreement/SKILL.md +172 -0
- package/skills/data-privacy-agreement/CONNECTORS.md +19 -0
- package/skills/data-privacy-agreement/SKILL.md +158 -0
- package/skills/delaware-franchise-tax/CONNECTORS.md +16 -0
- package/skills/delaware-franchise-tax/SKILL.md +206 -0
- package/skills/delaware-franchise-tax/reference/ecorp-portal-playwright-notes.md +136 -0
- package/skills/delaware-franchise-tax/reference/faq.md +101 -0
- package/skills/delaware-franchise-tax/reference/filing-instructions.md +111 -0
- package/skills/delaware-franchise-tax/reference/tax-calculation.md +167 -0
- package/skills/employment-contract/CONNECTORS.md +19 -0
- package/skills/employment-contract/SKILL.md +157 -0
- package/skills/nda/CONNECTORS.md +19 -0
- package/skills/nda/SKILL.md +153 -0
- package/skills/open-agreements/CONNECTORS.md +19 -0
- package/skills/open-agreements/SKILL.md +182 -0
- package/skills/safe/CONNECTORS.md +19 -0
- package/skills/safe/SKILL.md +161 -0
- package/skills/services-agreement/CONNECTORS.md +19 -0
- package/skills/services-agreement/SKILL.md +156 -0
- package/skills/unit-test-philosophy/SKILL.md +113 -0
- package/skills/unit-test-philosophy/references/allure-test-spec-writing-guide.md +164 -0
- package/skills/venture-financing/CONNECTORS.md +19 -0
- package/skills/venture-financing/SKILL.md +169 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface LicenseValidationResult {
|
|
2
|
+
templateId: string;
|
|
3
|
+
valid: boolean;
|
|
4
|
+
errors: string[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Validate a template's license metadata.
|
|
8
|
+
*
|
|
9
|
+
* The allow_derivatives field means "the committed source DOCX must not be
|
|
10
|
+
* modified" when false. It does NOT prevent the tool from rendering filled
|
|
11
|
+
* output — that decision is made by the fill command based on directory
|
|
12
|
+
* context (templates/ vs external/).
|
|
13
|
+
*/
|
|
14
|
+
export declare function validateLicense(templateDir: string, templateId: string): LicenseValidationResult;
|
|
15
|
+
//# sourceMappingURL=license.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../../src/core/validation/license.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,uBAAuB,CAyBhG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { loadMetadata } from '../metadata.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validate a template's license metadata.
|
|
4
|
+
*
|
|
5
|
+
* The allow_derivatives field means "the committed source DOCX must not be
|
|
6
|
+
* modified" when false. It does NOT prevent the tool from rendering filled
|
|
7
|
+
* output — that decision is made by the fill command based on directory
|
|
8
|
+
* context (templates/ vs external/).
|
|
9
|
+
*/
|
|
10
|
+
export function validateLicense(templateDir, templateId) {
|
|
11
|
+
const errors = [];
|
|
12
|
+
let metadata;
|
|
13
|
+
try {
|
|
14
|
+
metadata = loadMetadata(templateDir);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
return {
|
|
18
|
+
templateId,
|
|
19
|
+
valid: false,
|
|
20
|
+
errors: [`Failed to load metadata: ${err.message}`],
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
// CC-BY-4.0 and CC-BY-ND-4.0 require attribution text
|
|
24
|
+
if ((metadata.license === 'CC-BY-4.0' || metadata.license === 'CC-BY-ND-4.0') &&
|
|
25
|
+
!metadata.attribution_text.trim()) {
|
|
26
|
+
errors.push(`${metadata.license} license requires attribution_text to be non-empty.`);
|
|
27
|
+
}
|
|
28
|
+
return { templateId, valid: errors.length === 0, errors };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=license.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../../../src/core/validation/license.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQ9C;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB,EAAE,UAAkB;IACrE,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,QAAQ,CAAC;IACb,IAAI,CAAC;QACH,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,UAAU;YACV,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,CAAC,4BAA6B,GAAa,CAAC,OAAO,EAAE,CAAC;SAC/D,CAAC;IACJ,CAAC;IAED,sDAAsD;IACtD,IACE,CAAC,QAAQ,CAAC,OAAO,KAAK,WAAW,IAAI,QAAQ,CAAC,OAAO,KAAK,cAAc,CAAC;QACzE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,EACjC,CAAC;QACD,MAAM,CAAC,IAAI,CACT,GAAG,QAAQ,CAAC,OAAO,qDAAqD,CACzE,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface OutputValidationResult {
|
|
2
|
+
valid: boolean;
|
|
3
|
+
errors: string[];
|
|
4
|
+
sourceHeadingCount: number;
|
|
5
|
+
outputHeadingCount: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Validate that a rendered DOCX preserves the heading structure of the source template.
|
|
9
|
+
* Extracts word/document.xml via AdmZip before scanning for heading styles.
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateOutput(sourceDocxPath: string, outputDocxPath: string): OutputValidationResult;
|
|
12
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/core/validation/output.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,GACrB,sBAAsB,CAiCxB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import AdmZip from 'adm-zip';
|
|
2
|
+
/**
|
|
3
|
+
* Validate that a rendered DOCX preserves the heading structure of the source template.
|
|
4
|
+
* Extracts word/document.xml via AdmZip before scanning for heading styles.
|
|
5
|
+
*/
|
|
6
|
+
export function validateOutput(sourceDocxPath, outputDocxPath) {
|
|
7
|
+
const errors = [];
|
|
8
|
+
let sourceXml;
|
|
9
|
+
let outputXml;
|
|
10
|
+
try {
|
|
11
|
+
sourceXml = extractDocumentXml(sourceDocxPath);
|
|
12
|
+
outputXml = extractDocumentXml(outputDocxPath);
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
return {
|
|
16
|
+
valid: false,
|
|
17
|
+
errors: [`Failed to read files: ${err.message}`],
|
|
18
|
+
sourceHeadingCount: 0,
|
|
19
|
+
outputHeadingCount: 0,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
const sourceHeadings = countHeadings(sourceXml);
|
|
23
|
+
const outputHeadings = countHeadings(outputXml);
|
|
24
|
+
if (sourceHeadings !== outputHeadings) {
|
|
25
|
+
errors.push(`Heading count mismatch: source has ${sourceHeadings} headings, output has ${outputHeadings}. ` +
|
|
26
|
+
'Template rendering may have dropped or duplicated content.');
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
valid: errors.length === 0,
|
|
30
|
+
errors,
|
|
31
|
+
sourceHeadingCount: sourceHeadings,
|
|
32
|
+
outputHeadingCount: outputHeadings,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function extractDocumentXml(docxPath) {
|
|
36
|
+
const zip = new AdmZip(docxPath);
|
|
37
|
+
const entry = zip.getEntry('word/document.xml');
|
|
38
|
+
if (!entry)
|
|
39
|
+
return '';
|
|
40
|
+
return entry.getData().toString('utf-8');
|
|
41
|
+
}
|
|
42
|
+
function countHeadings(xml) {
|
|
43
|
+
const headingPattern = /w:val="Heading\d"/g;
|
|
44
|
+
const matches = xml.match(headingPattern);
|
|
45
|
+
return matches ? matches.length : 0;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/core/validation/output.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAC;AAS7B;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,cAAsB,EACtB,cAAsB;IAEtB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,SAAiB,CAAC;IACtB,IAAI,SAAiB,CAAC;IACtB,IAAI,CAAC;QACH,SAAS,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;QAC/C,SAAS,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,CAAC,yBAA0B,GAAa,CAAC,OAAO,EAAE,CAAC;YAC3D,kBAAkB,EAAE,CAAC;YACrB,kBAAkB,EAAE,CAAC;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAEhD,IAAI,cAAc,KAAK,cAAc,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CACT,sCAAsC,cAAc,yBAAyB,cAAc,IAAI;YAC/F,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;QACN,kBAAkB,EAAE,cAAc;QAClC,kBAAkB,EAAE,cAAc;KACnC,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,cAAc,GAAG,oBAAoB,CAAC;IAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface RecipeValidationResult {
|
|
2
|
+
recipeId: string;
|
|
3
|
+
valid: boolean;
|
|
4
|
+
scaffold: boolean;
|
|
5
|
+
errors: string[];
|
|
6
|
+
warnings: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Validate a recipe directory:
|
|
10
|
+
* - No .docx files (copyrighted content must not be committed)
|
|
11
|
+
* - metadata.yaml validates against schema
|
|
12
|
+
* - For non-scaffold recipes: replacements.json present and valid
|
|
13
|
+
* - Replacement values must be valid {identifier} tags
|
|
14
|
+
* - In strict mode: scaffolds are errors, all files required
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateRecipe(recipeDir: string, recipeId: string, options?: {
|
|
17
|
+
strict?: boolean;
|
|
18
|
+
}): RecipeValidationResult;
|
|
19
|
+
//# sourceMappingURL=recipe.d.ts.map
|
|
@@ -0,0 +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,CAmJxB"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { readdirSync, existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { validateRecipeMetadata, loadRecipeMetadata } from '../metadata.js';
|
|
4
|
+
import { CleanConfigSchema } from '../metadata.js';
|
|
5
|
+
import { NormalizeConfigSchema } from '../metadata.js';
|
|
6
|
+
import { parseReplacementKey } from '../recipe/replacement-keys.js';
|
|
7
|
+
import { ComputedProfileSchema } from '../recipe/computed.js';
|
|
8
|
+
/** Pattern for valid template tags within replacement values */
|
|
9
|
+
const TAG_RE = /\{[a-z_][a-z0-9_]*\}/g;
|
|
10
|
+
/** Pattern for any curly-brace token (to detect control tags) */
|
|
11
|
+
const ANY_BRACE_RE = /\{[^}]+\}/g;
|
|
12
|
+
/** Only simple identifiers inside braces are allowed */
|
|
13
|
+
const SAFE_TAG_RE = /^\{[a-z_][a-z0-9_]*\}$/;
|
|
14
|
+
/**
|
|
15
|
+
* Validate a recipe directory:
|
|
16
|
+
* - No .docx files (copyrighted content must not be committed)
|
|
17
|
+
* - metadata.yaml validates against schema
|
|
18
|
+
* - For non-scaffold recipes: replacements.json present and valid
|
|
19
|
+
* - Replacement values must be valid {identifier} tags
|
|
20
|
+
* - In strict mode: scaffolds are errors, all files required
|
|
21
|
+
*/
|
|
22
|
+
export function validateRecipe(recipeDir, recipeId, options) {
|
|
23
|
+
const errors = [];
|
|
24
|
+
const warnings = [];
|
|
25
|
+
const strict = options?.strict ?? false;
|
|
26
|
+
// Check for .docx files (forbidden in recipe dirs)
|
|
27
|
+
const files = readdirSync(recipeDir);
|
|
28
|
+
const docxFiles = files.filter((f) => f.toLowerCase().endsWith('.docx'));
|
|
29
|
+
if (docxFiles.length > 0) {
|
|
30
|
+
errors.push(`Copyrighted .docx file(s) found: ${docxFiles.join(', ')}. Recipes must not contain source documents.`);
|
|
31
|
+
}
|
|
32
|
+
// Validate metadata
|
|
33
|
+
const metaResult = validateRecipeMetadata(recipeDir);
|
|
34
|
+
if (!metaResult.valid) {
|
|
35
|
+
errors.push(...metaResult.errors.map((e) => `metadata: ${e}`));
|
|
36
|
+
return { recipeId, valid: false, scaffold: false, errors, warnings };
|
|
37
|
+
}
|
|
38
|
+
// Scaffold detection: if only metadata.yaml exists, this is a scaffold
|
|
39
|
+
const metadata = loadRecipeMetadata(recipeDir);
|
|
40
|
+
const metadataFieldNames = new Set(metadata.fields.map((field) => field.name));
|
|
41
|
+
const computedPath = join(recipeDir, 'computed.json');
|
|
42
|
+
const hasReplacements = existsSync(join(recipeDir, 'replacements.json'));
|
|
43
|
+
const isScaffold = !hasReplacements;
|
|
44
|
+
// Validate computed.json if present
|
|
45
|
+
if (existsSync(computedPath)) {
|
|
46
|
+
try {
|
|
47
|
+
const raw = readFileSync(computedPath, 'utf-8');
|
|
48
|
+
ComputedProfileSchema.parse(JSON.parse(raw));
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
if (err instanceof Error) {
|
|
52
|
+
errors.push(`computed.json: ${err.message}`);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
errors.push('computed.json: invalid format');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (isScaffold) {
|
|
60
|
+
if (strict) {
|
|
61
|
+
errors.push('Scaffold recipe (metadata-only): not runnable. Use non-strict mode to allow scaffolds.');
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
warnings.push('Scaffold recipe (metadata-only): not runnable');
|
|
65
|
+
}
|
|
66
|
+
return { recipeId, valid: errors.length === 0, scaffold: true, errors, warnings };
|
|
67
|
+
}
|
|
68
|
+
// Validate replacements.json
|
|
69
|
+
if (hasReplacements) {
|
|
70
|
+
try {
|
|
71
|
+
const raw = readFileSync(join(recipeDir, 'replacements.json'), 'utf-8');
|
|
72
|
+
const replacements = JSON.parse(raw);
|
|
73
|
+
if (typeof replacements !== 'object' || replacements === null) {
|
|
74
|
+
errors.push('replacements.json must be a JSON object');
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const unknownTargets = new Set();
|
|
78
|
+
for (const [key, value] of Object.entries(replacements)) {
|
|
79
|
+
if (typeof value !== 'string') {
|
|
80
|
+
errors.push(`replacements.json: value for "${key}" must be a string`);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
// Value must contain at least one {identifier} tag
|
|
84
|
+
const tags = value.match(TAG_RE);
|
|
85
|
+
if (!tags || tags.length === 0) {
|
|
86
|
+
errors.push(`replacements.json: value for "${key}" must contain at least one {identifier} tag, got "${value}"`);
|
|
87
|
+
}
|
|
88
|
+
// All curly-brace tokens in value must be safe identifiers (no control tags)
|
|
89
|
+
const allBraces = value.match(ANY_BRACE_RE);
|
|
90
|
+
if (allBraces) {
|
|
91
|
+
for (const token of allBraces) {
|
|
92
|
+
if (!SAFE_TAG_RE.test(token)) {
|
|
93
|
+
errors.push(`replacements.json: unsafe tag "${token}" in value for "${key}". Only {identifier} tags allowed.`);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const fieldName = token.slice(1, -1);
|
|
97
|
+
if (!metadataFieldNames.has(fieldName)) {
|
|
98
|
+
unknownTargets.add(fieldName);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Value must not contain the source key (infinite loop prevention)
|
|
103
|
+
// For qualified keys, check against the searchText, not the full key.
|
|
104
|
+
// Nth keys use single-shot replacement so they can't loop — skip the check.
|
|
105
|
+
const parsed = parseReplacementKey(key, value);
|
|
106
|
+
if (parsed.type === 'simple' && value.includes(parsed.searchText)) {
|
|
107
|
+
errors.push(`replacements.json: value for "${key}" contains the key itself (would cause infinite loop)`);
|
|
108
|
+
}
|
|
109
|
+
else if (parsed.type === 'context' && value.includes(parsed.searchText)) {
|
|
110
|
+
errors.push(`replacements.json: value for "${key}" contains the search text "${parsed.searchText}" (would cause infinite loop)`);
|
|
111
|
+
}
|
|
112
|
+
// nth keys: no infinite-loop check needed (single-shot replacement)
|
|
113
|
+
}
|
|
114
|
+
for (const fieldName of unknownTargets) {
|
|
115
|
+
warnings.push(`Replacement target {${fieldName}} not found in metadata fields`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
errors.push(`replacements.json: ${err.message}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
if (strict) {
|
|
125
|
+
errors.push('replacements.json not found (required for runnable recipes)');
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
warnings.push('replacements.json not found (required for runnable recipes)');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Validate clean.json if present
|
|
132
|
+
const cleanPath = join(recipeDir, 'clean.json');
|
|
133
|
+
if (existsSync(cleanPath)) {
|
|
134
|
+
try {
|
|
135
|
+
const raw = readFileSync(cleanPath, 'utf-8');
|
|
136
|
+
CleanConfigSchema.parse(JSON.parse(raw));
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
errors.push(`clean.json: invalid format`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Validate normalize.json if present
|
|
143
|
+
const normalizePath = join(recipeDir, 'normalize.json');
|
|
144
|
+
if (existsSync(normalizePath)) {
|
|
145
|
+
try {
|
|
146
|
+
const raw = readFileSync(normalizePath, 'utf-8');
|
|
147
|
+
NormalizeConfigSchema.parse(JSON.parse(raw));
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
errors.push('normalize.json: invalid format');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Warn if source_sha256 is missing (fill will skip integrity verification)
|
|
154
|
+
if (!metadata.source_sha256) {
|
|
155
|
+
warnings.push('No source_sha256 in metadata — fill will skip integrity verification');
|
|
156
|
+
}
|
|
157
|
+
return { recipeId, valid: errors.length === 0, scaffold: false, errors, warnings };
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=recipe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe.js","sourceRoot":"","sources":["../../../src/core/validation/recipe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ScanMetadataCoverageInput {
|
|
2
|
+
scannedShortPlaceholders: string[];
|
|
3
|
+
metadataFields: string[];
|
|
4
|
+
replacements: Record<string, string>;
|
|
5
|
+
extraCoveredFields?: string[];
|
|
6
|
+
ignoredPlaceholders?: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface ScanMetadataCoverageReport {
|
|
9
|
+
coveredShortPlaceholders: string[];
|
|
10
|
+
uncoveredShortPlaceholders: string[];
|
|
11
|
+
ignoredShortPlaceholders: string[];
|
|
12
|
+
placeholderToFields: Record<string, string[]>;
|
|
13
|
+
mappedFieldsNotInMetadata: string[];
|
|
14
|
+
metadataFieldsWithoutPlaceholderCoverage: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Compare short placeholders discovered via scan against recipe/template metadata
|
|
18
|
+
* coverage inferred from replacements mapping.
|
|
19
|
+
*/
|
|
20
|
+
export declare function assessScanMetadataCoverage(input: ScanMetadataCoverageInput): ScanMetadataCoverageReport;
|
|
21
|
+
//# sourceMappingURL=scan-metadata.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { parseReplacementKey } from '../recipe/replacement-keys.js';
|
|
2
|
+
const FIELD_TAG_RE = /\{([a-z_][a-z0-9_]*)\}/g;
|
|
3
|
+
function extractFieldTags(template) {
|
|
4
|
+
const out = new Set();
|
|
5
|
+
let match = null;
|
|
6
|
+
while ((match = FIELD_TAG_RE.exec(template)) !== null) {
|
|
7
|
+
out.add(match[1]);
|
|
8
|
+
}
|
|
9
|
+
return [...out];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Compare short placeholders discovered via scan against recipe/template metadata
|
|
13
|
+
* coverage inferred from replacements mapping.
|
|
14
|
+
*/
|
|
15
|
+
export function assessScanMetadataCoverage(input) {
|
|
16
|
+
const metadataFieldSet = new Set(input.metadataFields);
|
|
17
|
+
const ignored = new Set(input.ignoredPlaceholders ?? []);
|
|
18
|
+
const extraCovered = new Set(input.extraCoveredFields ?? []);
|
|
19
|
+
const placeholderFieldMap = new Map();
|
|
20
|
+
const mappedFieldsNotInMetadata = new Set();
|
|
21
|
+
for (const [key, value] of Object.entries(input.replacements)) {
|
|
22
|
+
const parsed = parseReplacementKey(key, value);
|
|
23
|
+
const searchText = parsed.searchText;
|
|
24
|
+
const tags = extractFieldTags(value);
|
|
25
|
+
if (!placeholderFieldMap.has(searchText)) {
|
|
26
|
+
placeholderFieldMap.set(searchText, new Set());
|
|
27
|
+
}
|
|
28
|
+
const fieldSet = placeholderFieldMap.get(searchText);
|
|
29
|
+
for (const tag of tags) {
|
|
30
|
+
fieldSet.add(tag);
|
|
31
|
+
if (!metadataFieldSet.has(tag)) {
|
|
32
|
+
mappedFieldsNotInMetadata.add(tag);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const coveredShort = new Set();
|
|
37
|
+
const uncoveredShort = new Set();
|
|
38
|
+
const ignoredShort = new Set();
|
|
39
|
+
const coveredFields = new Set(extraCovered);
|
|
40
|
+
for (const placeholder of input.scannedShortPlaceholders) {
|
|
41
|
+
if (ignored.has(placeholder)) {
|
|
42
|
+
ignoredShort.add(placeholder);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const mapped = placeholderFieldMap.get(placeholder);
|
|
46
|
+
if (!mapped || mapped.size === 0) {
|
|
47
|
+
uncoveredShort.add(placeholder);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
coveredShort.add(placeholder);
|
|
51
|
+
for (const field of mapped) {
|
|
52
|
+
coveredFields.add(field);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const placeholderToFields = Object.fromEntries([...placeholderFieldMap.entries()]
|
|
56
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
57
|
+
.map(([placeholder, fields]) => [placeholder, [...fields].sort()]));
|
|
58
|
+
const metadataFieldsWithoutPlaceholderCoverage = [...metadataFieldSet]
|
|
59
|
+
.filter((field) => !coveredFields.has(field))
|
|
60
|
+
.sort();
|
|
61
|
+
return {
|
|
62
|
+
coveredShortPlaceholders: [...coveredShort].sort(),
|
|
63
|
+
uncoveredShortPlaceholders: [...uncoveredShort].sort(),
|
|
64
|
+
ignoredShortPlaceholders: [...ignoredShort].sort(),
|
|
65
|
+
placeholderToFields,
|
|
66
|
+
mappedFieldsNotInMetadata: [...mappedFieldsNotInMetadata].sort(),
|
|
67
|
+
metadataFieldsWithoutPlaceholderCoverage,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=scan-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-metadata.js","sourceRoot":"","sources":["../../../src/core/validation/scan-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface TemplateValidationResult {
|
|
2
|
+
templateId: string;
|
|
3
|
+
valid: boolean;
|
|
4
|
+
errors: string[];
|
|
5
|
+
warnings: string[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Validate that a template's metadata fields match the placeholders in its DOCX file.
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateTemplate(templateDir: string, templateId: string): TemplateValidationResult;
|
|
11
|
+
//# sourceMappingURL=template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/core/validation/template.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;AA+BD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,wBAAwB,CAgLlG"}
|