@primmel/primmel 1.3.2 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +40 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +112 -1
- package/dist/index.js.map +1 -1
- package/dist/src/check-allowlist.d.ts +56 -0
- package/dist/src/check-allowlist.d.ts.map +1 -0
- package/dist/src/check-allowlist.js +307 -0
- package/dist/src/check-allowlist.js.map +1 -0
- package/dist/src/check-rules.d.ts +17 -0
- package/dist/src/check-rules.d.ts.map +1 -0
- package/dist/src/check-rules.js +351 -0
- package/dist/src/check-rules.js.map +1 -0
- package/dist/src/check.d.ts +115 -0
- package/dist/src/check.d.ts.map +1 -0
- package/dist/src/check.js +4164 -0
- package/dist/src/check.js.map +1 -0
- package/dist/src/export/rdf-competency-questions.d.ts +11 -0
- package/dist/src/export/rdf-competency-questions.d.ts.map +1 -0
- package/dist/src/export/rdf-competency-questions.js +99 -0
- package/dist/src/export/rdf-competency-questions.js.map +1 -0
- package/dist/src/export/rdf-shapes.d.ts +3 -0
- package/dist/src/export/rdf-shapes.d.ts.map +1 -0
- package/dist/src/export/rdf-shapes.js +225 -0
- package/dist/src/export/rdf-shapes.js.map +1 -0
- package/dist/src/export/rdf-vocabulary.d.ts +125 -0
- package/dist/src/export/rdf-vocabulary.d.ts.map +1 -0
- package/dist/src/export/rdf-vocabulary.js +230 -0
- package/dist/src/export/rdf-vocabulary.js.map +1 -0
- package/dist/src/export/rdf.d.ts +92 -0
- package/dist/src/export/rdf.d.ts.map +1 -0
- package/dist/src/export/rdf.js +707 -0
- package/dist/src/export/rdf.js.map +1 -0
- package/dist/src/export/reqif.d.ts +81 -0
- package/dist/src/export/reqif.d.ts.map +1 -0
- package/dist/src/export/reqif.js +703 -0
- package/dist/src/export/reqif.js.map +1 -0
- package/dist/src/instance-resolution.d.ts +68 -0
- package/dist/src/instance-resolution.d.ts.map +1 -0
- package/dist/src/instance-resolution.js +239 -0
- package/dist/src/instance-resolution.js.map +1 -0
- package/dist/src/mapping-coverage.d.ts +220 -0
- package/dist/src/mapping-coverage.d.ts.map +1 -0
- package/dist/src/mapping-coverage.js +528 -0
- package/dist/src/mapping-coverage.js.map +1 -0
- package/dist/src/model-diff.d.ts +198 -0
- package/dist/src/model-diff.d.ts.map +1 -0
- package/dist/src/model-diff.js +914 -0
- package/dist/src/model-diff.js.map +1 -0
- package/dist/src/operational-state.d.ts +112 -0
- package/dist/src/operational-state.d.ts.map +1 -0
- package/dist/src/operational-state.js +162 -0
- package/dist/src/operational-state.js.map +1 -0
- package/dist/src/package-diff.d.ts +36 -0
- package/dist/src/package-diff.d.ts.map +1 -0
- package/dist/src/package-diff.js +104 -0
- package/dist/src/package-diff.js.map +1 -0
- package/dist/src/ser-des/config/acceptance.d.ts +10 -0
- package/dist/src/ser-des/config/acceptance.d.ts.map +1 -0
- package/dist/src/ser-des/config/acceptance.js +163 -0
- package/dist/src/ser-des/config/acceptance.js.map +1 -0
- package/dist/src/ser-des/config/activityArchetype.d.ts +5 -0
- package/dist/src/ser-des/config/activityArchetype.d.ts.map +1 -0
- package/dist/src/ser-des/config/activityArchetype.js +78 -0
- package/dist/src/ser-des/config/activityArchetype.js.map +1 -0
- package/dist/src/ser-des/config/artifact.d.ts +16 -0
- package/dist/src/ser-des/config/artifact.d.ts.map +1 -0
- package/dist/src/ser-des/config/artifact.js +392 -0
- package/dist/src/ser-des/config/artifact.js.map +1 -0
- package/dist/src/ser-des/config/calculation.d.ts.map +1 -1
- package/dist/src/ser-des/config/calculation.js +214 -12
- package/dist/src/ser-des/config/calculation.js.map +1 -1
- package/dist/src/ser-des/config/comment.d.ts +34 -0
- package/dist/src/ser-des/config/comment.d.ts.map +1 -0
- package/dist/src/ser-des/config/comment.js +121 -0
- package/dist/src/ser-des/config/comment.js.map +1 -0
- package/dist/src/ser-des/config/competenceKind.d.ts +8 -0
- package/dist/src/ser-des/config/competenceKind.d.ts.map +1 -0
- package/dist/src/ser-des/config/competenceKind.js +266 -0
- package/dist/src/ser-des/config/competenceKind.js.map +1 -0
- package/dist/src/ser-des/config/composition.d.ts +6 -0
- package/dist/src/ser-des/config/composition.d.ts.map +1 -0
- package/dist/src/ser-des/config/composition.js +165 -0
- package/dist/src/ser-des/config/composition.js.map +1 -0
- package/dist/src/ser-des/config/conformanceClass.d.ts +9 -0
- package/dist/src/ser-des/config/conformanceClass.d.ts.map +1 -0
- package/dist/src/ser-des/config/conformanceClass.js +128 -0
- package/dist/src/ser-des/config/conformanceClass.js.map +1 -0
- package/dist/src/ser-des/config/conformanceTest.d.ts +6 -0
- package/dist/src/ser-des/config/conformanceTest.d.ts.map +1 -0
- package/dist/src/ser-des/config/conformanceTest.js +929 -0
- package/dist/src/ser-des/config/conformanceTest.js.map +1 -0
- package/dist/src/ser-des/config/constraint.d.ts +5 -0
- package/dist/src/ser-des/config/constraint.d.ts.map +1 -0
- package/dist/src/ser-des/config/constraint.js +108 -0
- package/dist/src/ser-des/config/constraint.js.map +1 -0
- package/dist/src/ser-des/config/data.d.ts.map +1 -1
- package/dist/src/ser-des/config/data.js +105 -12
- package/dist/src/ser-des/config/data.js.map +1 -1
- package/dist/src/ser-des/config/design.d.ts +9 -0
- package/dist/src/ser-des/config/design.d.ts.map +1 -0
- package/dist/src/ser-des/config/design.js +847 -0
- package/dist/src/ser-des/config/design.js.map +1 -0
- package/dist/src/ser-des/config/discrepancyRecord.d.ts +5 -0
- package/dist/src/ser-des/config/discrepancyRecord.d.ts.map +1 -0
- package/dist/src/ser-des/config/discrepancyRecord.js +109 -0
- package/dist/src/ser-des/config/discrepancyRecord.js.map +1 -0
- package/dist/src/ser-des/config/dual.d.ts +9 -0
- package/dist/src/ser-des/config/dual.d.ts.map +1 -0
- package/dist/src/ser-des/config/dual.js +84 -0
- package/dist/src/ser-des/config/dual.js.map +1 -0
- package/dist/src/ser-des/config/field-parser.d.ts +92 -7
- package/dist/src/ser-des/config/field-parser.d.ts.map +1 -1
- package/dist/src/ser-des/config/field-parser.js +844 -29
- package/dist/src/ser-des/config/field-parser.js.map +1 -1
- package/dist/src/ser-des/config/form.d.ts.map +1 -1
- package/dist/src/ser-des/config/form.js +356 -134
- package/dist/src/ser-des/config/form.js.map +1 -1
- package/dist/src/ser-des/config/formulasUsed.d.ts +9 -0
- package/dist/src/ser-des/config/formulasUsed.d.ts.map +1 -0
- package/dist/src/ser-des/config/formulasUsed.js +126 -0
- package/dist/src/ser-des/config/formulasUsed.js.map +1 -0
- package/dist/src/ser-des/config/index.d.ts.map +1 -1
- package/dist/src/ser-des/config/index.js +180 -1
- package/dist/src/ser-des/config/index.js.map +1 -1
- package/dist/src/ser-des/config/instance.d.ts +22 -0
- package/dist/src/ser-des/config/instance.d.ts.map +1 -0
- package/dist/src/ser-des/config/instance.js +266 -0
- package/dist/src/ser-des/config/instance.js.map +1 -0
- package/dist/src/ser-des/config/invariant.d.ts +9 -0
- package/dist/src/ser-des/config/invariant.d.ts.map +1 -0
- package/dist/src/ser-des/config/invariant.js +143 -0
- package/dist/src/ser-des/config/invariant.js.map +1 -0
- package/dist/src/ser-des/config/mapProfile.d.ts.map +1 -1
- package/dist/src/ser-des/config/mapProfile.js +199 -14
- package/dist/src/ser-des/config/mapProfile.js.map +1 -1
- package/dist/src/ser-des/config/metadata.js +6 -6
- package/dist/src/ser-des/config/metadata.js.map +1 -1
- package/dist/src/ser-des/config/monitor.d.ts +9 -0
- package/dist/src/ser-des/config/monitor.d.ts.map +1 -0
- package/dist/src/ser-des/config/monitor.js +322 -0
- package/dist/src/ser-des/config/monitor.js.map +1 -0
- package/dist/src/ser-des/config/note.d.ts.map +1 -1
- package/dist/src/ser-des/config/note.js +16 -1
- package/dist/src/ser-des/config/note.js.map +1 -1
- package/dist/src/ser-des/config/packageManifest.d.ts +5 -0
- package/dist/src/ser-des/config/packageManifest.d.ts.map +1 -0
- package/dist/src/ser-des/config/packageManifest.js +349 -0
- package/dist/src/ser-des/config/packageManifest.js.map +1 -0
- package/dist/src/ser-des/config/passport.d.ts +9 -0
- package/dist/src/ser-des/config/passport.d.ts.map +1 -0
- package/dist/src/ser-des/config/passport.js +191 -0
- package/dist/src/ser-des/config/passport.js.map +1 -0
- package/dist/src/ser-des/config/process.d.ts +5 -3
- package/dist/src/ser-des/config/process.d.ts.map +1 -1
- package/dist/src/ser-des/config/process.js +915 -8
- package/dist/src/ser-des/config/process.js.map +1 -1
- package/dist/src/ser-des/config/quantity.d.ts +21 -0
- package/dist/src/ser-des/config/quantity.d.ts.map +1 -0
- package/dist/src/ser-des/config/quantity.js +114 -0
- package/dist/src/ser-des/config/quantity.js.map +1 -0
- package/dist/src/ser-des/config/quantityRegister.d.ts +9 -0
- package/dist/src/ser-des/config/quantityRegister.d.ts.map +1 -0
- package/dist/src/ser-des/config/quantityRegister.js +202 -0
- package/dist/src/ser-des/config/quantityRegister.js.map +1 -0
- package/dist/src/ser-des/config/reference.d.ts.map +1 -1
- package/dist/src/ser-des/config/reference.js +6 -0
- package/dist/src/ser-des/config/reference.js.map +1 -1
- package/dist/src/ser-des/config/referenceMaterial.d.ts +5 -0
- package/dist/src/ser-des/config/referenceMaterial.d.ts.map +1 -0
- package/dist/src/ser-des/config/referenceMaterial.js +296 -0
- package/dist/src/ser-des/config/referenceMaterial.js.map +1 -0
- package/dist/src/ser-des/config/requirement.d.ts +16 -0
- package/dist/src/ser-des/config/requirement.d.ts.map +1 -0
- package/dist/src/ser-des/config/requirement.js +579 -0
- package/dist/src/ser-des/config/requirement.js.map +1 -0
- package/dist/src/ser-des/config/role.d.ts.map +1 -1
- package/dist/src/ser-des/config/role.js +12 -0
- package/dist/src/ser-des/config/role.js.map +1 -1
- package/dist/src/ser-des/config/series.d.ts +9 -0
- package/dist/src/ser-des/config/series.d.ts.map +1 -0
- package/dist/src/ser-des/config/series.js +121 -0
- package/dist/src/ser-des/config/series.js.map +1 -0
- package/dist/src/ser-des/config/sourceDiscrepancy.d.ts +11 -0
- package/dist/src/ser-des/config/sourceDiscrepancy.d.ts.map +1 -0
- package/dist/src/ser-des/config/sourceDiscrepancy.js +83 -0
- package/dist/src/ser-des/config/sourceDiscrepancy.js.map +1 -0
- package/dist/src/ser-des/config/stateMachine.d.ts.map +1 -1
- package/dist/src/ser-des/config/stateMachine.js +189 -38
- package/dist/src/ser-des/config/stateMachine.js.map +1 -1
- package/dist/src/ser-des/config/subform.d.ts.map +1 -1
- package/dist/src/ser-des/config/subform.js +25 -33
- package/dist/src/ser-des/config/subform.js.map +1 -1
- package/dist/src/ser-des/config/subject.d.ts +58 -0
- package/dist/src/ser-des/config/subject.d.ts.map +1 -0
- package/dist/src/ser-des/config/subject.js +2093 -0
- package/dist/src/ser-des/config/subject.js.map +1 -0
- package/dist/src/ser-des/config/symbol.d.ts.map +1 -1
- package/dist/src/ser-des/config/symbol.js +130 -6
- package/dist/src/ser-des/config/symbol.js.map +1 -1
- package/dist/src/ser-des/config/table.d.ts.map +1 -1
- package/dist/src/ser-des/config/table.js +373 -7
- package/dist/src/ser-des/config/table.js.map +1 -1
- package/dist/src/ser-des/config/term.d.ts.map +1 -1
- package/dist/src/ser-des/config/term.js +107 -0
- package/dist/src/ser-des/config/term.js.map +1 -1
- package/dist/src/ser-des/config/testPointSet.d.ts +5 -0
- package/dist/src/ser-des/config/testPointSet.d.ts.map +1 -0
- package/dist/src/ser-des/config/testPointSet.js +199 -0
- package/dist/src/ser-des/config/testPointSet.js.map +1 -0
- package/dist/src/ser-des/config/testSequence.d.ts +9 -0
- package/dist/src/ser-des/config/testSequence.d.ts.map +1 -0
- package/dist/src/ser-des/config/testSequence.js +206 -0
- package/dist/src/ser-des/config/testSequence.js.map +1 -0
- package/dist/src/ser-des/config/text.d.ts +5 -0
- package/dist/src/ser-des/config/text.d.ts.map +1 -0
- package/dist/src/ser-des/config/text.js +106 -0
- package/dist/src/ser-des/config/text.js.map +1 -0
- package/dist/src/ser-des/config/twin.d.ts +31 -0
- package/dist/src/ser-des/config/twin.d.ts.map +1 -0
- package/dist/src/ser-des/config/twin.js +362 -0
- package/dist/src/ser-des/config/twin.js.map +1 -0
- package/dist/src/ser-des/config/verdict.d.ts +5 -0
- package/dist/src/ser-des/config/verdict.d.ts.map +1 -0
- package/dist/src/ser-des/config/verdict.js +159 -0
- package/dist/src/ser-des/config/verdict.js.map +1 -0
- package/dist/src/ser-des/config/viewProfile.d.ts.map +1 -1
- package/dist/src/ser-des/config/viewProfile.js +7 -0
- package/dist/src/ser-des/config/viewProfile.js.map +1 -1
- package/dist/src/ser-des/includes.d.ts.map +1 -1
- package/dist/src/ser-des/includes.js +5 -2
- package/dist/src/ser-des/includes.js.map +1 -1
- package/dist/src/ser-des/index.d.ts +12 -0
- package/dist/src/ser-des/index.d.ts.map +1 -1
- package/dist/src/ser-des/index.js +42 -0
- package/dist/src/ser-des/index.js.map +1 -1
- package/dist/src/ser-des/package.d.ts +53 -0
- package/dist/src/ser-des/package.d.ts.map +1 -0
- package/dist/src/ser-des/package.js +404 -0
- package/dist/src/ser-des/package.js.map +1 -0
- package/dist/src/ser-des/parse-block.d.ts.map +1 -1
- package/dist/src/ser-des/parse-block.js +7 -1
- package/dist/src/ser-des/parse-block.js.map +1 -1
- package/dist/src/ser-des/parse.d.ts.map +1 -1
- package/dist/src/ser-des/parse.js +45 -0
- package/dist/src/ser-des/parse.js.map +1 -1
- package/dist/src/ser-des/prm.d.ts +53 -0
- package/dist/src/ser-des/prm.d.ts.map +1 -0
- package/dist/src/ser-des/prm.js +257 -0
- package/dist/src/ser-des/prm.js.map +1 -0
- package/dist/src/ser-des/resolve.d.ts.map +1 -1
- package/dist/src/ser-des/resolve.js +1 -0
- package/dist/src/ser-des/resolve.js.map +1 -1
- package/dist/src/ser-des/tokenize.d.ts +11 -0
- package/dist/src/ser-des/tokenize.d.ts.map +1 -1
- package/dist/src/ser-des/tokenize.js +28 -1
- package/dist/src/ser-des/tokenize.js.map +1 -1
- package/dist/src/ser-des/types.d.ts +56 -1
- package/dist/src/ser-des/types.d.ts.map +1 -1
- package/dist/src/spelling.d.ts +35 -0
- package/dist/src/spelling.d.ts.map +1 -0
- package/dist/src/spelling.js +140 -0
- package/dist/src/spelling.js.map +1 -0
- package/dist/src/text-coverage.d.ts +164 -0
- package/dist/src/text-coverage.d.ts.map +1 -0
- package/dist/src/text-coverage.js +679 -0
- package/dist/src/text-coverage.js.map +1 -0
- package/dist/src/time.d.ts +55 -0
- package/dist/src/time.d.ts.map +1 -0
- package/dist/src/time.js +223 -0
- package/dist/src/time.js.map +1 -0
- package/dist/src/type-expr.d.ts +31 -0
- package/dist/src/type-expr.d.ts.map +1 -0
- package/dist/src/type-expr.js +110 -0
- package/dist/src/type-expr.js.map +1 -0
- package/dist/src/types/Acceptance.d.ts +31 -0
- package/dist/src/types/Acceptance.d.ts.map +1 -0
- package/dist/src/types/Acceptance.js +12 -0
- package/dist/src/types/Acceptance.js.map +1 -0
- package/dist/src/types/ActivityArchetype.d.ts +14 -0
- package/dist/src/types/ActivityArchetype.d.ts.map +1 -0
- package/dist/src/types/ActivityArchetype.js +17 -0
- package/dist/src/types/ActivityArchetype.js.map +1 -0
- package/dist/src/types/Artifact.d.ts +117 -0
- package/dist/src/types/Artifact.d.ts.map +1 -0
- package/dist/src/types/Artifact.js +35 -0
- package/dist/src/types/Artifact.js.map +1 -0
- package/dist/src/types/Calculation.d.ts +49 -0
- package/dist/src/types/Calculation.d.ts.map +1 -1
- package/dist/src/types/Comment.d.ts +23 -0
- package/dist/src/types/Comment.d.ts.map +1 -0
- package/dist/src/types/Comment.js +3 -0
- package/dist/src/types/Comment.js.map +1 -0
- package/dist/src/types/CompetenceKind.d.ts +70 -0
- package/dist/src/types/CompetenceKind.d.ts.map +1 -0
- package/dist/src/types/CompetenceKind.js +3 -0
- package/dist/src/types/CompetenceKind.js.map +1 -0
- package/dist/src/types/Composition.d.ts +80 -0
- package/dist/src/types/Composition.d.ts.map +1 -0
- package/dist/src/types/Composition.js +44 -0
- package/dist/src/types/Composition.js.map +1 -0
- package/dist/src/types/ConformanceClass.d.ts +22 -0
- package/dist/src/types/ConformanceClass.d.ts.map +1 -0
- package/dist/src/types/ConformanceClass.js +7 -0
- package/dist/src/types/ConformanceClass.js.map +1 -0
- package/dist/src/types/ConformanceTest.d.ts +206 -0
- package/dist/src/types/ConformanceTest.d.ts.map +1 -0
- package/dist/src/types/ConformanceTest.js +3 -0
- package/dist/src/types/ConformanceTest.js.map +1 -0
- package/dist/src/types/Constraint.d.ts +34 -0
- package/dist/src/types/Constraint.d.ts.map +1 -0
- package/dist/src/types/Constraint.js +3 -0
- package/dist/src/types/Constraint.js.map +1 -0
- package/dist/src/types/Design.d.ts +147 -0
- package/dist/src/types/Design.d.ts.map +1 -0
- package/dist/src/types/Design.js +10 -0
- package/dist/src/types/Design.js.map +1 -0
- package/dist/src/types/DiscrepancyRecord.d.ts +42 -0
- package/dist/src/types/DiscrepancyRecord.d.ts.map +1 -0
- package/dist/src/types/DiscrepancyRecord.js +3 -0
- package/dist/src/types/DiscrepancyRecord.js.map +1 -0
- package/dist/src/types/Form.d.ts +132 -1
- package/dist/src/types/Form.d.ts.map +1 -1
- package/dist/src/types/FormulasUsed.d.ts +95 -0
- package/dist/src/types/FormulasUsed.d.ts.map +1 -0
- package/dist/src/types/FormulasUsed.js +64 -0
- package/dist/src/types/FormulasUsed.js.map +1 -0
- package/dist/src/types/Instance.d.ts +105 -0
- package/dist/src/types/Instance.d.ts.map +1 -0
- package/dist/src/types/Instance.js +40 -0
- package/dist/src/types/Instance.js.map +1 -0
- package/dist/src/types/Invariant.d.ts +82 -0
- package/dist/src/types/Invariant.d.ts.map +1 -0
- package/dist/src/types/Invariant.js +50 -0
- package/dist/src/types/Invariant.js.map +1 -0
- package/dist/src/types/MapProfile.d.ts +36 -1
- package/dist/src/types/MapProfile.d.ts.map +1 -1
- package/dist/src/types/Monitor.d.ts +144 -0
- package/dist/src/types/Monitor.d.ts.map +1 -0
- package/dist/src/types/Monitor.js +74 -0
- package/dist/src/types/Monitor.js.map +1 -0
- package/dist/src/types/Note.d.ts +4 -1
- package/dist/src/types/Note.d.ts.map +1 -1
- package/dist/src/types/Package.d.ts +161 -0
- package/dist/src/types/Package.d.ts.map +1 -0
- package/dist/src/types/Package.js +3 -0
- package/dist/src/types/Package.js.map +1 -0
- package/dist/src/types/Passport.d.ts +125 -0
- package/dist/src/types/Passport.d.ts.map +1 -0
- package/dist/src/types/Passport.js +84 -0
- package/dist/src/types/Passport.js.map +1 -0
- package/dist/src/types/Quantity.d.ts +99 -0
- package/dist/src/types/Quantity.d.ts.map +1 -0
- package/dist/src/types/Quantity.js +24 -0
- package/dist/src/types/Quantity.js.map +1 -0
- package/dist/src/types/Reference.d.ts +2 -0
- package/dist/src/types/Reference.d.ts.map +1 -1
- package/dist/src/types/ReferenceMaterial.d.ts +53 -0
- package/dist/src/types/ReferenceMaterial.d.ts.map +1 -0
- package/dist/src/types/ReferenceMaterial.js +14 -0
- package/dist/src/types/ReferenceMaterial.js.map +1 -0
- package/dist/src/types/Requirement.d.ts +111 -0
- package/dist/src/types/Requirement.d.ts.map +1 -0
- package/dist/src/types/Requirement.js +10 -0
- package/dist/src/types/Requirement.js.map +1 -0
- package/dist/src/types/Role.d.ts +4 -0
- package/dist/src/types/Role.d.ts.map +1 -1
- package/dist/src/types/Series.d.ts +31 -0
- package/dist/src/types/Series.d.ts.map +1 -0
- package/dist/src/types/Series.js +14 -0
- package/dist/src/types/Series.js.map +1 -0
- package/dist/src/types/SourceDiscrepancy.d.ts +21 -0
- package/dist/src/types/SourceDiscrepancy.d.ts.map +1 -0
- package/dist/src/types/SourceDiscrepancy.js +13 -0
- package/dist/src/types/SourceDiscrepancy.js.map +1 -0
- package/dist/src/types/Standard.d.ts +68 -0
- package/dist/src/types/Standard.d.ts.map +1 -1
- package/dist/src/types/StateMachine.d.ts +43 -0
- package/dist/src/types/StateMachine.d.ts.map +1 -1
- package/dist/src/types/StateMachine.js +7 -0
- package/dist/src/types/StateMachine.js.map +1 -1
- package/dist/src/types/Subject.d.ts +432 -0
- package/dist/src/types/Subject.d.ts.map +1 -0
- package/dist/src/types/Subject.js +13 -0
- package/dist/src/types/Subject.js.map +1 -0
- package/dist/src/types/Symbol.d.ts +31 -1
- package/dist/src/types/Symbol.d.ts.map +1 -1
- package/dist/src/types/Table.d.ts +43 -0
- package/dist/src/types/Table.d.ts.map +1 -1
- package/dist/src/types/Term.d.ts +29 -0
- package/dist/src/types/Term.d.ts.map +1 -1
- package/dist/src/types/TestPointSet.d.ts +33 -0
- package/dist/src/types/TestPointSet.d.ts.map +1 -0
- package/dist/src/types/TestPointSet.js +11 -0
- package/dist/src/types/TestPointSet.js.map +1 -0
- package/dist/src/types/TestSequence.d.ts +105 -0
- package/dist/src/types/TestSequence.d.ts.map +1 -0
- package/dist/src/types/TestSequence.js +65 -0
- package/dist/src/types/TestSequence.js.map +1 -0
- package/dist/src/types/Text.d.ts +21 -0
- package/dist/src/types/Text.d.ts.map +1 -0
- package/dist/src/types/Text.js +38 -0
- package/dist/src/types/Text.js.map +1 -0
- package/dist/src/types/Time.d.ts +43 -0
- package/dist/src/types/Time.d.ts.map +1 -0
- package/dist/src/types/Time.js +14 -0
- package/dist/src/types/Time.js.map +1 -0
- package/dist/src/types/Twin.d.ts +155 -0
- package/dist/src/types/Twin.d.ts.map +1 -0
- package/dist/src/types/Twin.js +102 -0
- package/dist/src/types/Twin.js.map +1 -0
- package/dist/src/types/Verdict.d.ts +40 -0
- package/dist/src/types/Verdict.d.ts.map +1 -0
- package/dist/src/types/Verdict.js +14 -0
- package/dist/src/types/Verdict.js.map +1 -0
- package/dist/src/types/ViewProfile.d.ts +6 -0
- package/dist/src/types/ViewProfile.d.ts.map +1 -1
- package/dist/src/types/data.d.ts +27 -0
- package/dist/src/types/data.d.ts.map +1 -1
- package/dist/src/types/process.d.ts +231 -0
- package/dist/src/types/process.d.ts.map +1 -1
- package/dist-browser/index.mjs +6699 -661
- package/dist-cli/primmel.mjs +21462 -0
- package/package.json +61 -5
|
@@ -0,0 +1,679 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
3
|
+
// TODO.roadmap/26 — the normative-text coverage metric (concept doc
|
|
4
|
+
// §11.6, layer 5 of the validation stack):
|
|
5
|
+
//
|
|
6
|
+
// every normative sentence of the source maps to at least one model
|
|
7
|
+
// element (target 100 %), and no two elements are semantic duplicates
|
|
8
|
+
// (target 0).
|
|
9
|
+
//
|
|
10
|
+
// The inputs ship INSIDE the package (JSON — primmel-ts stays YAML-free),
|
|
11
|
+
// generated from the YAML single source of truth by the OIML SMART build
|
|
12
|
+
// (browser/scripts/build-prl-package.ts):
|
|
13
|
+
//
|
|
14
|
+
// sources-prd/<part>.sentences.json — the sentence decomposition of one
|
|
15
|
+
// source document: every prose sentence with its address
|
|
16
|
+
// (<fragment-path>/s<N>), fragment, kind, fragment-level normativity,
|
|
17
|
+
// the modality classifier's verdict (only NORMATIVE sentences gate —
|
|
18
|
+
// shall/should/may/must + negatives, context rules first), and text.
|
|
19
|
+
// Table/figure fragments carry no sentences (tables are data, never
|
|
20
|
+
// text — their coverage is the clause-level congruence gate's).
|
|
21
|
+
// sources-prd/coverage.json — the per-package declarations:
|
|
22
|
+
// allowances (deliberate exclusions, sentence-PINNED so a new
|
|
23
|
+
// normative sentence in an allowed fragment is still a finding — the
|
|
24
|
+
// pair-pinned discipline of the congruence gate's order exceptions)
|
|
25
|
+
// and duplicate_adjudications (the human verdicts on flagged
|
|
26
|
+
// near-duplicate pairs; the metric REPORTS pairs, never auto-fails —
|
|
27
|
+
// acceptance is 0 UNRESOLVED pairs).
|
|
28
|
+
//
|
|
29
|
+
// The rules (check-rules.ts):
|
|
30
|
+
// C71 text-coverage-sentence-uncovered (AUDIT, warning) — a normative
|
|
31
|
+
// sentence bound by no model element and excluded by no allowance;
|
|
32
|
+
// budgeted by the package's text_coverage_budget (the C51/C52
|
|
33
|
+
// pattern — regressions fail the gate);
|
|
34
|
+
// C72 text-coverage-budget (AUDIT) — the budget caps C71 warnings
|
|
35
|
+
// (exceeded: error; slack: warning — the allowance only shrinks);
|
|
36
|
+
// C73 text-coverage-config — malformed/stale declarations: an
|
|
37
|
+
// allowance matching no normative sentence (drifted address, a pin
|
|
38
|
+
// on a sentence that stopped existing or being normative), a
|
|
39
|
+
// mis-sorted or silent adjudication, a STALE adjudication whose
|
|
40
|
+
// pair is no longer flagged. Runs whenever a manifest ships.
|
|
41
|
+
//
|
|
42
|
+
// Duplicate detection (the methodology's "0 semantic-equivalent elements"
|
|
43
|
+
// rule, machine-assisted): over the elements carrying bound text
|
|
44
|
+
// (requirement statements, term definitions) that bind ≥1 fragment of a
|
|
45
|
+
// manifest document, flag pairs whose normalized token-multiset
|
|
46
|
+
// containment similarity reaches DUPLICATE_SIMILARITY_THRESHOLD — two
|
|
47
|
+
// requirements interpreting the same sentence differently is worse than
|
|
48
|
+
// a gap, because both will compute verdicts (§11.6).
|
|
49
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.DUPLICATE_TEXT_KINDS = exports.DUPLICATE_MIN_TOKENS = exports.DUPLICATE_SIMILARITY_THRESHOLD = void 0;
|
|
52
|
+
exports.loadTextCoverageData = loadTextCoverageData;
|
|
53
|
+
exports.normalizeBinding = normalizeBinding;
|
|
54
|
+
exports.collectProvenanceBindings = collectProvenanceBindings;
|
|
55
|
+
exports.allowanceAddressMatches = allowanceAddressMatches;
|
|
56
|
+
exports.allowanceMatches = allowanceMatches;
|
|
57
|
+
exports.normalizeForSimilarity = normalizeForSimilarity;
|
|
58
|
+
exports.containmentSimilarity = containmentSimilarity;
|
|
59
|
+
exports.flagDuplicatePairs = flagDuplicatePairs;
|
|
60
|
+
exports.computeTextCoverage = computeTextCoverage;
|
|
61
|
+
exports.uncoveredSentenceMessage = uncoveredSentenceMessage;
|
|
62
|
+
exports.packageTextCoverageReport = packageTextCoverageReport;
|
|
63
|
+
exports.formatTextCoverageReport = formatTextCoverageReport;
|
|
64
|
+
const fs_1 = require("fs");
|
|
65
|
+
const path_1 = require("path");
|
|
66
|
+
const SENTENCES_FORMAT = '0.1.0';
|
|
67
|
+
const COVERAGE_FORMAT = '0.1.0';
|
|
68
|
+
/** Load the text-coverage payloads of a package (<dir>/sources-prd/).
|
|
69
|
+
* Absent directory → empty (the metric is silent). Malformed payloads are
|
|
70
|
+
* C73 errors. */
|
|
71
|
+
function loadTextCoverageData(dir) {
|
|
72
|
+
const issues = [];
|
|
73
|
+
const manifests = [];
|
|
74
|
+
let config = null;
|
|
75
|
+
const prdDir = (0, path_1.join)(dir, 'sources-prd');
|
|
76
|
+
if (!(0, fs_1.existsSync)(prdDir)) {
|
|
77
|
+
return { manifests, config, issues };
|
|
78
|
+
}
|
|
79
|
+
for (const f of (0, fs_1.readdirSync)(prdDir).sort()) {
|
|
80
|
+
if (!f.endsWith('.sentences.json')) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const rel = `sources-prd/${f}`;
|
|
84
|
+
let raw;
|
|
85
|
+
try {
|
|
86
|
+
raw = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(prdDir, f), 'utf8'));
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
issues.push({
|
|
90
|
+
check: 'C73',
|
|
91
|
+
severity: 'error',
|
|
92
|
+
message: `${rel}: not parseable JSON — ${e.message} (text-coverage-config)`,
|
|
93
|
+
});
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (raw.prd_sentences !== SENTENCES_FORMAT ||
|
|
97
|
+
typeof raw.document?.urn !== 'string' ||
|
|
98
|
+
!Array.isArray(raw.sentences) ||
|
|
99
|
+
raw.sentences.some(s => typeof s?.address !== 'string' ||
|
|
100
|
+
typeof s?.fragment !== 'string' ||
|
|
101
|
+
(s?.modality !== 'normative' && s?.modality !== 'informative') ||
|
|
102
|
+
typeof s?.text !== 'string')) {
|
|
103
|
+
issues.push({
|
|
104
|
+
check: 'C73',
|
|
105
|
+
severity: 'error',
|
|
106
|
+
message: `${rel}: not a prd_sentences ${SENTENCES_FORMAT} manifest (document.urn + sentences[{address, fragment, modality, text}]) — regenerate the package (text-coverage-config)`,
|
|
107
|
+
});
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
manifests.push(raw);
|
|
111
|
+
}
|
|
112
|
+
const configPath = (0, path_1.join)(prdDir, 'coverage.json');
|
|
113
|
+
if ((0, fs_1.existsSync)(configPath)) {
|
|
114
|
+
try {
|
|
115
|
+
const raw = JSON.parse((0, fs_1.readFileSync)(configPath, 'utf8'));
|
|
116
|
+
if (raw.prd_coverage !== COVERAGE_FORMAT) {
|
|
117
|
+
throw new Error(`prd_coverage must be "${COVERAGE_FORMAT}"`);
|
|
118
|
+
}
|
|
119
|
+
config = raw;
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
issues.push({
|
|
123
|
+
check: 'C73',
|
|
124
|
+
severity: 'error',
|
|
125
|
+
message: `sources-prd/coverage.json: ${e.message} — regenerate the package (text-coverage-config)`,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return { manifests, config, issues };
|
|
130
|
+
}
|
|
131
|
+
const URN_ADDRESS = /^(urn:oiml:pub:[a-z0-9:-]+)#([A-Za-z0-9./-]+)$/;
|
|
132
|
+
const FRAGMENT_WORD = /^(clause|table|figure|front)-/;
|
|
133
|
+
/** Normalize one binding to {doc, fragmentPath}: a doc may carry the
|
|
134
|
+
* glued `#fragment` form (doc "urn:…#table-4"), a bare clause number gets
|
|
135
|
+
* the clause- prefix, an existing address word passes through, and the
|
|
136
|
+
* optional sentence sub-address appends `/s<N>` (TODO.roadmap/26). */
|
|
137
|
+
function normalizeBinding(doc, clause, fragment) {
|
|
138
|
+
let d = doc.trim();
|
|
139
|
+
let path = '';
|
|
140
|
+
const hash = d.indexOf('#');
|
|
141
|
+
if (hash >= 0) {
|
|
142
|
+
path = d.slice(hash + 1);
|
|
143
|
+
d = d.slice(0, hash);
|
|
144
|
+
}
|
|
145
|
+
if (path === '') {
|
|
146
|
+
const c = clause.trim();
|
|
147
|
+
if (c === '') {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
path = FRAGMENT_WORD.test(c) ? c : `clause-${c}`;
|
|
151
|
+
}
|
|
152
|
+
if (fragment && fragment.trim() !== '') {
|
|
153
|
+
path += `/${fragment.trim()}`;
|
|
154
|
+
}
|
|
155
|
+
return { doc: d, fragmentPath: path };
|
|
156
|
+
}
|
|
157
|
+
function* urnStringBindings(value) {
|
|
158
|
+
for (const token of value.trim().split(/\s+/)) {
|
|
159
|
+
const m = URN_ADDRESS.exec(token);
|
|
160
|
+
if (m) {
|
|
161
|
+
yield { doc: m[1], fragmentPath: m[2] };
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function isSourceRefLike(v) {
|
|
166
|
+
return (typeof v === 'object' &&
|
|
167
|
+
v !== null &&
|
|
168
|
+
(typeof v.doc === 'string' ||
|
|
169
|
+
typeof v.clause === 'string'));
|
|
170
|
+
}
|
|
171
|
+
/** Harvest every provenance binding of the composed package: sourceRefs/
|
|
172
|
+
* sourceRef blocks, `source { doc clause fragment? }` blocks, term-style
|
|
173
|
+
* `source "urn …"` strings, `reference "urn#fragment"` strings and
|
|
174
|
+
* references[].urn lists — on ANY id-bearing element (the generic walk is
|
|
175
|
+
* construct-agnostic; non-URN strings never match the address grammar). */
|
|
176
|
+
function collectProvenanceBindings(standard) {
|
|
177
|
+
const out = [];
|
|
178
|
+
const seen = new Set();
|
|
179
|
+
const push = (element, kind, text, norm) => {
|
|
180
|
+
if (!norm || norm.fragmentPath === '') {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const key = `${element}${norm.doc}#${norm.fragmentPath}`;
|
|
184
|
+
if (seen.has(key)) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
seen.add(key);
|
|
188
|
+
out.push({
|
|
189
|
+
element,
|
|
190
|
+
kind,
|
|
191
|
+
doc: norm.doc,
|
|
192
|
+
fragmentPath: norm.fragmentPath,
|
|
193
|
+
...(text !== undefined ? { text } : {}),
|
|
194
|
+
});
|
|
195
|
+
};
|
|
196
|
+
const harvestFields = (node, element, kind, text) => {
|
|
197
|
+
const fromRef = (s) => normalizeBinding(typeof s.doc === 'string' ? s.doc : '', typeof s.clause === 'string' ? s.clause : '', typeof s.fragment === 'string' ? s.fragment : undefined);
|
|
198
|
+
if (Array.isArray(node.sourceRefs)) {
|
|
199
|
+
for (const s of node.sourceRefs) {
|
|
200
|
+
if (isSourceRefLike(s)) {
|
|
201
|
+
push(element, kind, text, fromRef(s));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// condition sets collect repeated source blocks into `sources` (plural)
|
|
206
|
+
if (Array.isArray(node.sources)) {
|
|
207
|
+
for (const s of node.sources) {
|
|
208
|
+
if (isSourceRefLike(s)) {
|
|
209
|
+
push(element, kind, text, fromRef(s));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (isSourceRefLike(node.sourceRef)) {
|
|
214
|
+
push(element, kind, text, fromRef(node.sourceRef));
|
|
215
|
+
}
|
|
216
|
+
if (isSourceRefLike(node.source)) {
|
|
217
|
+
push(element, kind, text, fromRef(node.source));
|
|
218
|
+
}
|
|
219
|
+
else if (typeof node.source === 'string') {
|
|
220
|
+
for (const u of urnStringBindings(node.source)) {
|
|
221
|
+
push(element, kind, text, u);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (typeof node.reference === 'string') {
|
|
225
|
+
for (const u of urnStringBindings(node.reference)) {
|
|
226
|
+
push(element, kind, text, u);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (Array.isArray(node.references)) {
|
|
230
|
+
for (const r of node.references) {
|
|
231
|
+
const urn = r?.urn;
|
|
232
|
+
if (typeof urn === 'string') {
|
|
233
|
+
for (const u of urnStringBindings(urn)) {
|
|
234
|
+
push(element, kind, text, u);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Form reference blocks (RoleReference { urn, role } — form-level
|
|
240
|
+
// formReferences, field-level fieldReferences)
|
|
241
|
+
for (const key of ['formReferences', 'fieldReferences']) {
|
|
242
|
+
if (Array.isArray(node[key])) {
|
|
243
|
+
for (const r of node[key]) {
|
|
244
|
+
const urn = r?.urn;
|
|
245
|
+
if (typeof urn === 'string') {
|
|
246
|
+
for (const u of urnStringBindings(urn)) {
|
|
247
|
+
push(element, kind, text, u);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
const walk = (node, kind, element, text, depth) => {
|
|
255
|
+
if (depth > 12 || typeof node !== 'object' || node === null) {
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
if (Array.isArray(node)) {
|
|
259
|
+
for (const item of node) {
|
|
260
|
+
walk(item, kind, element, text, depth + 1);
|
|
261
|
+
}
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const rec = node;
|
|
265
|
+
let el = element;
|
|
266
|
+
let tx = text;
|
|
267
|
+
if (typeof rec.id === 'string' && rec.id !== '') {
|
|
268
|
+
el = rec.id;
|
|
269
|
+
tx =
|
|
270
|
+
typeof rec.statement === 'string'
|
|
271
|
+
? rec.statement
|
|
272
|
+
: typeof rec.definition === 'string'
|
|
273
|
+
? rec.definition
|
|
274
|
+
: undefined;
|
|
275
|
+
}
|
|
276
|
+
if (el !== null) {
|
|
277
|
+
harvestFields(rec, el, kind, tx);
|
|
278
|
+
}
|
|
279
|
+
for (const v of Object.values(rec)) {
|
|
280
|
+
if (typeof v === 'object' && v !== null) {
|
|
281
|
+
walk(v, kind, el, tx, depth + 1);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
for (const [field, value] of Object.entries(standard)) {
|
|
286
|
+
if (Array.isArray(value)) {
|
|
287
|
+
walk(value, field, null, undefined, 0);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return out;
|
|
291
|
+
}
|
|
292
|
+
// ── allowance matching (lockstep with the smart repo's prd-coverage.ts) ──
|
|
293
|
+
/** True when sentence address A is covered by allowance address P: exact,
|
|
294
|
+
* or P a boundary prefix of A ('.' descends the clause tree, '/' a
|
|
295
|
+
* sub-address). */
|
|
296
|
+
function allowanceAddressMatches(allowance, sentence) {
|
|
297
|
+
if (sentence === allowance) {
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
if (!sentence.startsWith(allowance)) {
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
const next = sentence.charAt(allowance.length);
|
|
304
|
+
return next === '.' || next === '/';
|
|
305
|
+
}
|
|
306
|
+
/** The sentences of one document an allowance discharges (pins first —
|
|
307
|
+
* exactly the pinned sentences of the addressed fragment; otherwise every
|
|
308
|
+
* sentence the address boundary-matches). */
|
|
309
|
+
function allowanceMatches(allowance, sentences, urn) {
|
|
310
|
+
const hash = allowance.address.indexOf('#');
|
|
311
|
+
const fragment = allowance.address.slice(hash + 1);
|
|
312
|
+
if (allowance.sentences) {
|
|
313
|
+
const pins = new Set(allowance.sentences.map(p => `${urn}#${fragment}/${p}`));
|
|
314
|
+
return sentences.filter(s => pins.has(`${urn}#${s.address}`));
|
|
315
|
+
}
|
|
316
|
+
return sentences.filter(s => allowanceAddressMatches(allowance.address, `${urn}#${s.address}`));
|
|
317
|
+
}
|
|
318
|
+
// ── duplicate detection ──────────────────────────────────────────────
|
|
319
|
+
/** The pinned similarity threshold (token-multiset containment:
|
|
320
|
+
* Σ min(cA, cB) / min(|A|, |B|) over normalized tokens). 0.8 flags
|
|
321
|
+
* near-duplicates while per-class specializations differing only in
|
|
322
|
+
* their class values still surface for adjudication; pairs sharing
|
|
323
|
+
* fewer than DUPLICATE_MIN_TOKENS tokens on either side never flag
|
|
324
|
+
* (short texts produce noise, not signal). */
|
|
325
|
+
exports.DUPLICATE_SIMILARITY_THRESHOLD = 0.8;
|
|
326
|
+
exports.DUPLICATE_MIN_TOKENS = 6;
|
|
327
|
+
/** Normalize bound text for similarity: lowercase, punctuation folded to
|
|
328
|
+
* space, whitespace collapsed (the wording axis, not the symbols'). */
|
|
329
|
+
function normalizeForSimilarity(text) {
|
|
330
|
+
return text
|
|
331
|
+
.toLowerCase()
|
|
332
|
+
.replace(/[‘’‚]/g, "'")
|
|
333
|
+
.replace(/[“”„]/g, '"')
|
|
334
|
+
.replace(/[‐‑‒–—]/g, '-')
|
|
335
|
+
.replace(/[^a-z0-9]+/g, ' ')
|
|
336
|
+
.trim()
|
|
337
|
+
.split(' ')
|
|
338
|
+
.filter(t => t !== '');
|
|
339
|
+
}
|
|
340
|
+
/** Multiset containment similarity of two token lists (1 = one side's
|
|
341
|
+
* wording is fully contained in the other's). */
|
|
342
|
+
function containmentSimilarity(a, b) {
|
|
343
|
+
const count = (xs) => {
|
|
344
|
+
const m = new Map();
|
|
345
|
+
for (const x of xs) {
|
|
346
|
+
m.set(x, (m.get(x) ?? 0) + 1);
|
|
347
|
+
}
|
|
348
|
+
return m;
|
|
349
|
+
};
|
|
350
|
+
const ca = count(a);
|
|
351
|
+
const cb = count(b);
|
|
352
|
+
let inter = 0;
|
|
353
|
+
for (const [t, n] of ca) {
|
|
354
|
+
inter += Math.min(n, cb.get(t) ?? 0);
|
|
355
|
+
}
|
|
356
|
+
const denom = Math.min(a.length, b.length);
|
|
357
|
+
return denom === 0 ? 0 : inter / denom;
|
|
358
|
+
}
|
|
359
|
+
/** The element kinds whose text counts as BOUND text for duplicate
|
|
360
|
+
* detection (the methodology's "elements" are the model's provisions):
|
|
361
|
+
* requirement statements, term definitions, and instrument/variant
|
|
362
|
+
* definitions. Attribute/symbol/characteristic definitions are parameter
|
|
363
|
+
* semantics — formulaic by design ("maximum load that can be applied"),
|
|
364
|
+
* not source provisions; the congruence gate watches their provenance. */
|
|
365
|
+
exports.DUPLICATE_TEXT_KINDS = new Set([
|
|
366
|
+
'requirements',
|
|
367
|
+
'terms',
|
|
368
|
+
'instruments',
|
|
369
|
+
]);
|
|
370
|
+
/** Flag near-duplicate pairs over the bound-text elements (see the module
|
|
371
|
+
* header). Deterministic: pairs sorted by (a, b). */
|
|
372
|
+
function flagDuplicatePairs(bindings, manifestUrns, adjudications) {
|
|
373
|
+
const textByElement = new Map();
|
|
374
|
+
for (const b of bindings) {
|
|
375
|
+
if (b.text === undefined || !manifestUrns.has(b.doc)) {
|
|
376
|
+
continue;
|
|
377
|
+
}
|
|
378
|
+
if (!exports.DUPLICATE_TEXT_KINDS.has(b.kind)) {
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
if (!textByElement.has(b.element)) {
|
|
382
|
+
textByElement.set(b.element, b.text);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
const elements = [...textByElement.keys()].sort();
|
|
386
|
+
const tokens = new Map(elements.map(e => [e, normalizeForSimilarity(textByElement.get(e))]));
|
|
387
|
+
const adjudicationByPair = new Map(adjudications.map(d => [[...d.elements].sort().join(''), d]));
|
|
388
|
+
const pairs = [];
|
|
389
|
+
for (let i = 0; i < elements.length; i++) {
|
|
390
|
+
for (let j = i + 1; j < elements.length; j++) {
|
|
391
|
+
const ta = tokens.get(elements[i]);
|
|
392
|
+
const tb = tokens.get(elements[j]);
|
|
393
|
+
if (Math.min(ta.length, tb.length) < exports.DUPLICATE_MIN_TOKENS) {
|
|
394
|
+
continue;
|
|
395
|
+
}
|
|
396
|
+
const sim = containmentSimilarity(ta, tb);
|
|
397
|
+
if (sim >= exports.DUPLICATE_SIMILARITY_THRESHOLD) {
|
|
398
|
+
const key = [elements[i], elements[j]].join('');
|
|
399
|
+
const adj = adjudicationByPair.get(key);
|
|
400
|
+
pairs.push({
|
|
401
|
+
a: elements[i],
|
|
402
|
+
b: elements[j],
|
|
403
|
+
similarity: Math.round(sim * 1000) / 1000,
|
|
404
|
+
...(adj ? { adjudication: adj } : {}),
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
return pairs;
|
|
410
|
+
}
|
|
411
|
+
const SENTENCE_ADDRESS = /\/s[1-9][0-9]*$/;
|
|
412
|
+
/** Compute the text-coverage metric over the composed package. */
|
|
413
|
+
function computeTextCoverage(standard, manifests, config) {
|
|
414
|
+
const configIssues = [];
|
|
415
|
+
const bindings = collectProvenanceBindings(standard);
|
|
416
|
+
const manifestUrns = new Set(manifests.map(m => m.document.urn));
|
|
417
|
+
const allowances = config?.allowances ?? [];
|
|
418
|
+
const adjudications = config?.duplicate_adjudications ?? [];
|
|
419
|
+
const boundFragments = new Set();
|
|
420
|
+
const boundSentences = new Set();
|
|
421
|
+
for (const b of bindings) {
|
|
422
|
+
if (!manifestUrns.has(b.doc)) {
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
const key = `${b.doc}#${b.fragmentPath}`;
|
|
426
|
+
if (SENTENCE_ADDRESS.test(b.fragmentPath)) {
|
|
427
|
+
boundSentences.add(key);
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
boundFragments.add(key);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
const documents = [];
|
|
434
|
+
const matchedAllowanceSentences = new Map();
|
|
435
|
+
for (const manifest of manifests) {
|
|
436
|
+
const urn = manifest.document.urn;
|
|
437
|
+
const sentences = manifest.sentences;
|
|
438
|
+
const sentenceCovered = (s) => boundFragments.has(`${urn}#${s.fragment}`) ||
|
|
439
|
+
boundSentences.has(`${urn}#${s.address}`);
|
|
440
|
+
// First pass: allowance matches (per document).
|
|
441
|
+
const allowanceOf = new Map();
|
|
442
|
+
for (const a of allowances) {
|
|
443
|
+
const hash = a.address.indexOf('#');
|
|
444
|
+
if (a.address.slice(0, hash) !== urn) {
|
|
445
|
+
continue;
|
|
446
|
+
}
|
|
447
|
+
const matched = allowanceMatches(a, sentences, urn);
|
|
448
|
+
const arr = matchedAllowanceSentences.get(a) ?? [];
|
|
449
|
+
arr.push(...matched);
|
|
450
|
+
matchedAllowanceSentences.set(a, arr);
|
|
451
|
+
for (const s of matched) {
|
|
452
|
+
if (s.modality === 'normative' && !sentenceCovered(s)) {
|
|
453
|
+
allowanceOf.set(s.address, a);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
const uncoveredCounted = [];
|
|
458
|
+
const uncoveredAllowed = [];
|
|
459
|
+
let normative = 0;
|
|
460
|
+
let covered = 0;
|
|
461
|
+
let informativeUncovered = 0;
|
|
462
|
+
for (const s of sentences) {
|
|
463
|
+
if (s.modality !== 'normative') {
|
|
464
|
+
if (!sentenceCovered(s)) {
|
|
465
|
+
informativeUncovered++;
|
|
466
|
+
}
|
|
467
|
+
continue;
|
|
468
|
+
}
|
|
469
|
+
normative++;
|
|
470
|
+
if (sentenceCovered(s)) {
|
|
471
|
+
covered++;
|
|
472
|
+
continue;
|
|
473
|
+
}
|
|
474
|
+
const allowance = allowanceOf.get(s.address);
|
|
475
|
+
if (allowance) {
|
|
476
|
+
uncoveredAllowed.push({ sentence: s, allowance });
|
|
477
|
+
}
|
|
478
|
+
else {
|
|
479
|
+
uncoveredCounted.push(s);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
const allowed = uncoveredAllowed.length;
|
|
483
|
+
documents.push({
|
|
484
|
+
urn,
|
|
485
|
+
...(manifest.document.short !== undefined
|
|
486
|
+
? { short: manifest.document.short }
|
|
487
|
+
: {}),
|
|
488
|
+
...(manifest.document.part !== undefined
|
|
489
|
+
? { part: manifest.document.part }
|
|
490
|
+
: {}),
|
|
491
|
+
total: sentences.length,
|
|
492
|
+
normative,
|
|
493
|
+
covered,
|
|
494
|
+
allowed,
|
|
495
|
+
uncoveredCounted,
|
|
496
|
+
uncoveredAllowed,
|
|
497
|
+
informativeUncovered,
|
|
498
|
+
ratio: normative === 0 ? 1 : covered / normative,
|
|
499
|
+
ratioGated: normative - allowed === 0 ? 1 : covered / (normative - allowed),
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
// C73 — declaration hygiene (the KNOWN/STALE spirit): an allowance
|
|
503
|
+
// matching no sentence, or no NORMATIVE sentence, or pinning an
|
|
504
|
+
// informative-classified sentence is stale; silent declarations fail.
|
|
505
|
+
// So is a DEAD allowance — one whose matched normative sentences have
|
|
506
|
+
// all since been bound by model elements: it discharges nothing, so the
|
|
507
|
+
// declaration outlived the condition that justified it.
|
|
508
|
+
for (const a of allowances) {
|
|
509
|
+
const label = `coverage allowance '${a.address}'${a.sentences ? ` pins {${a.sentences.join(' ')}}` : ''}`;
|
|
510
|
+
const urn = a.address.slice(0, a.address.indexOf('#'));
|
|
511
|
+
if (!manifestUrns.has(urn)) {
|
|
512
|
+
configIssues.push({
|
|
513
|
+
check: 'C73',
|
|
514
|
+
severity: 'error',
|
|
515
|
+
message: `${label}: not a document of the shipped manifests (stale or mistyped address) (text-coverage-config)`,
|
|
516
|
+
});
|
|
517
|
+
continue;
|
|
518
|
+
}
|
|
519
|
+
const matched = matchedAllowanceSentences.get(a) ?? [];
|
|
520
|
+
const normative = matched.filter(s => s.modality === 'normative');
|
|
521
|
+
if (matched.length === 0) {
|
|
522
|
+
configIssues.push({
|
|
523
|
+
check: 'C73',
|
|
524
|
+
severity: 'error',
|
|
525
|
+
message: `${label}: matches no sentence of the decomposition (stale — remove the entry or fix the address/pins) (text-coverage-config)`,
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
else if (normative.length === 0) {
|
|
529
|
+
configIssues.push({
|
|
530
|
+
check: 'C73',
|
|
531
|
+
severity: 'error',
|
|
532
|
+
message: `${label}: every matched sentence is informative — informative sentences need no allowance (stale — remove the entry) (text-coverage-config)`,
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
else if (a.sentences) {
|
|
536
|
+
const informativePins = matched
|
|
537
|
+
.filter(s => s.modality !== 'normative')
|
|
538
|
+
.map(s => s.address);
|
|
539
|
+
if (informativePins.length > 0) {
|
|
540
|
+
configIssues.push({
|
|
541
|
+
check: 'C73',
|
|
542
|
+
severity: 'error',
|
|
543
|
+
message: `${label}: pinned sentence(s) ${informativePins.join(', ')} are informative-classified — the pin is stale (text-coverage-config)`,
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
if (normative.length > 0) {
|
|
548
|
+
const bound = (s) => boundFragments.has(`${urn}#${s.fragment}`) ||
|
|
549
|
+
boundSentences.has(`${urn}#${s.address}`);
|
|
550
|
+
if (normative.every(bound)) {
|
|
551
|
+
configIssues.push({
|
|
552
|
+
check: 'C73',
|
|
553
|
+
severity: 'error',
|
|
554
|
+
message: `${label}: every matched normative sentence is now bound by a model element — the allowance discharges nothing (stale — remove the entry; the bindings carry the coverage) (text-coverage-config)`,
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
if (!a.reason) {
|
|
559
|
+
configIssues.push({
|
|
560
|
+
check: 'C73',
|
|
561
|
+
severity: 'error',
|
|
562
|
+
message: `${label}: missing reason (allowances are deliberate, never silent) (text-coverage-config)`,
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
const flaggedPairs = flagDuplicatePairs(bindings, manifestUrns, adjudications);
|
|
567
|
+
const unresolvedPairs = flaggedPairs.filter(p => !p.adjudication);
|
|
568
|
+
// C73 — adjudication hygiene: sorted distinct ids, a reason, and the
|
|
569
|
+
// pair still flagged (a pair that dropped below the threshold makes
|
|
570
|
+
// its adjudication STALE — the declaration must die with the condition
|
|
571
|
+
// that justified it).
|
|
572
|
+
const flaggedKeys = new Set(flaggedPairs.map(p => [p.a, p.b].sort().join('')));
|
|
573
|
+
for (const d of adjudications) {
|
|
574
|
+
const label = `duplicate adjudication {${(d.elements ?? []).join(', ')}}`;
|
|
575
|
+
if (!Array.isArray(d.elements) || d.elements.length !== 2) {
|
|
576
|
+
configIssues.push({
|
|
577
|
+
check: 'C73',
|
|
578
|
+
severity: 'error',
|
|
579
|
+
message: `${label}: exactly two element ids make a pair (text-coverage-config)`,
|
|
580
|
+
});
|
|
581
|
+
continue;
|
|
582
|
+
}
|
|
583
|
+
if (d.elements[0] === d.elements[1]) {
|
|
584
|
+
configIssues.push({
|
|
585
|
+
check: 'C73',
|
|
586
|
+
severity: 'error',
|
|
587
|
+
message: `${label}: the pair names the same element twice (text-coverage-config)`,
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
if (d.elements[0] > d.elements[1]) {
|
|
591
|
+
configIssues.push({
|
|
592
|
+
check: 'C73',
|
|
593
|
+
severity: 'error',
|
|
594
|
+
message: `${label}: element ids must be sorted (the pair key is order-free) (text-coverage-config)`,
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
if (!d.reason) {
|
|
598
|
+
configIssues.push({
|
|
599
|
+
check: 'C73',
|
|
600
|
+
severity: 'error',
|
|
601
|
+
message: `${label}: missing reason (adjudications are deliberate, never silent) (text-coverage-config)`,
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
if (!flaggedKeys.has([...d.elements].sort().join(''))) {
|
|
605
|
+
configIssues.push({
|
|
606
|
+
check: 'C73',
|
|
607
|
+
severity: 'error',
|
|
608
|
+
message: `${label}: the pair is not currently flagged (similarity below ${exports.DUPLICATE_SIMILARITY_THRESHOLD} or an element unbound/renamed) — the adjudication is STALE (text-coverage-config)`,
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
return { documents, flaggedPairs, unresolvedPairs, configIssues };
|
|
613
|
+
}
|
|
614
|
+
/** The C71 finding text of one uncovered counted sentence. */
|
|
615
|
+
function uncoveredSentenceMessage(urn, s) {
|
|
616
|
+
const text = s.text.length > 100 ? `${s.text.slice(0, 97)}…` : s.text;
|
|
617
|
+
return `sentence ${urn}#${s.address} (normative, ${s.kind}): bound by no model element and excluded by no allowance — "${text}" (text-coverage-sentence-uncovered)`;
|
|
618
|
+
}
|
|
619
|
+
/** Load the package at `dir` and compute its text-coverage report (the
|
|
620
|
+
* `primmel check --coverage` path — null when the package ships no
|
|
621
|
+
* sentence manifests). Package-load failures propagate as the loader's
|
|
622
|
+
* diagnostics (checkPackage reports them as issues in the same run). */
|
|
623
|
+
function packageTextCoverageReport(dir, loadPackage) {
|
|
624
|
+
const { manifests, config, issues } = loadTextCoverageData(dir);
|
|
625
|
+
if (manifests.length === 0) {
|
|
626
|
+
return null;
|
|
627
|
+
}
|
|
628
|
+
const { standard } = loadPackage(dir);
|
|
629
|
+
const report = computeTextCoverage(standard, manifests, config);
|
|
630
|
+
report.configIssues.unshift(...issues);
|
|
631
|
+
return report;
|
|
632
|
+
}
|
|
633
|
+
/** The human-readable --coverage report (per-document tables with and
|
|
634
|
+
* without allowances, the uncovered lists, and the duplicate-pair
|
|
635
|
+
* adjudication status). */
|
|
636
|
+
function formatTextCoverageReport(report) {
|
|
637
|
+
const lines = [];
|
|
638
|
+
lines.push('── normative-text coverage (TODO.roadmap/26, concept doc §11.6) ──');
|
|
639
|
+
lines.push('');
|
|
640
|
+
lines.push(` ${'document'.padEnd(26)} ${'sentences'.padStart(9)} ${'normative'.padStart(9)} ${'covered'.padStart(8)} ${'allowed'.padStart(8)} ${'uncovered'.padStart(9)} ${'coverage'.padStart(10)} gated`);
|
|
641
|
+
for (const d of report.documents) {
|
|
642
|
+
const label = (d.short ?? d.urn).padEnd(26);
|
|
643
|
+
const pct = (r) => `${(r * 100).toFixed(1)}%`;
|
|
644
|
+
lines.push(` ${label} ${String(d.total).padStart(9)} ${String(d.normative).padStart(9)} ${String(d.covered).padStart(8)} ${String(d.allowed).padStart(8)} ${String(d.uncoveredCounted.length).padStart(9)} ${pct(d.ratio).padStart(10)} ${pct(d.ratioGated)}`);
|
|
645
|
+
}
|
|
646
|
+
lines.push('');
|
|
647
|
+
lines.push(' coverage = covered / normative (without allowances); gated = covered / (normative − allowed) — the 100 % target.');
|
|
648
|
+
for (const d of report.documents) {
|
|
649
|
+
if (d.uncoveredCounted.length > 0) {
|
|
650
|
+
lines.push('');
|
|
651
|
+
lines.push(` UNCOVERED normative sentences (${d.short ?? d.urn}) — each is a C71 finding:`);
|
|
652
|
+
for (const s of d.uncoveredCounted) {
|
|
653
|
+
lines.push(` ✗ ${d.urn}#${s.address} "${truncate(s.text, 90)}"`);
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
if (d.uncoveredAllowed.length > 0) {
|
|
657
|
+
lines.push('');
|
|
658
|
+
lines.push(` Allowed exclusions (${d.short ?? d.urn}) — reported, not gated:`);
|
|
659
|
+
for (const { sentence, allowance } of d.uncoveredAllowed) {
|
|
660
|
+
lines.push(` ◦ ${d.urn}#${sentence.address} "${truncate(sentence.text, 70)}"`);
|
|
661
|
+
lines.push(` allowance: ${allowance.reason ?? '(no reason)'}`);
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
lines.push('');
|
|
665
|
+
lines.push(` informative uncovered (${d.short ?? d.urn}): ${d.informativeUncovered} (reported, never gated)`);
|
|
666
|
+
}
|
|
667
|
+
lines.push('');
|
|
668
|
+
const adjudicated = report.flaggedPairs.length - report.unresolvedPairs.length;
|
|
669
|
+
lines.push(` duplicate pairs: ${report.flaggedPairs.length} flagged, ${adjudicated} adjudicated, ${report.unresolvedPairs.length} unresolved (target 0 unresolved — pairs are REPORTED, never auto-failed)`);
|
|
670
|
+
for (const p of report.flaggedPairs) {
|
|
671
|
+
const status = p.adjudication ? `${p.adjudication.verdict}` : 'UNRESOLVED';
|
|
672
|
+
lines.push(` ${p.adjudication ? '◦' : '?'} ${p.a} × ${p.b} — similarity ${p.similarity} [${status}]${p.adjudication ? ` — ${p.adjudication.reason ?? ''}` : ''}`);
|
|
673
|
+
}
|
|
674
|
+
return lines.join('\n');
|
|
675
|
+
}
|
|
676
|
+
function truncate(text, n) {
|
|
677
|
+
return text.length > n ? `${text.slice(0, n - 1)}…` : text;
|
|
678
|
+
}
|
|
679
|
+
//# sourceMappingURL=text-coverage.js.map
|