@alisio/plugin-thesis 0.1.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/.agents/agents/thesis-architect.md +38 -0
- package/.agents/agents/thesis-coordinator.md +39 -0
- package/.agents/agents/thesis-editor.md +35 -0
- package/.agents/agents/thesis-evidence-auditor.md +37 -0
- package/.agents/agents/thesis-librarian.md +38 -0
- package/.agents/agents/thesis-methodologist.md +39 -0
- package/.agents/agents/thesis-reviewer.md +36 -0
- package/.agents/agents/thesis-writer.md +38 -0
- package/.agents/skills/thesis-build/SKILL.md +48 -0
- package/.agents/skills/thesis-citations/SKILL.md +49 -0
- package/.agents/skills/thesis-csl-authoring/SKILL.md +48 -0
- package/.agents/skills/thesis-editing/SKILL.md +49 -0
- package/.agents/skills/thesis-evidence/SKILL.md +48 -0
- package/.agents/skills/thesis-figures/SKILL.md +50 -0
- package/.agents/skills/thesis-institution-norms/SKILL.md +50 -0
- package/.agents/skills/thesis-intake/SKILL.md +48 -0
- package/.agents/skills/thesis-math/SKILL.md +48 -0
- package/.agents/skills/thesis-methodology/SKILL.md +49 -0
- package/.agents/skills/thesis-outline/SKILL.md +48 -0
- package/.agents/skills/thesis-policy/SKILL.md +48 -0
- package/.agents/skills/thesis-review/SKILL.md +49 -0
- package/.agents/skills/thesis-search/SKILL.md +47 -0
- package/.agents/skills/thesis-writing/SKILL.md +52 -0
- package/LICENSE +21 -0
- package/README.es.md +242 -0
- package/README.md +235 -0
- package/THIRD_PARTY_NOTICES.md +94 -0
- package/assets/architecture.svg +1 -0
- package/assets/evidence-pipeline.svg +1 -0
- package/assets/lifecycle.svg +1 -0
- package/assets/policy-resolution.svg +1 -0
- package/cover.webp +0 -0
- package/dist/authoring.d.ts +30 -0
- package/dist/authoring.d.ts.map +1 -0
- package/dist/authoring.js +681 -0
- package/dist/authoring.js.map +1 -0
- package/dist/brief.d.ts +40 -0
- package/dist/brief.d.ts.map +1 -0
- package/dist/brief.js +566 -0
- package/dist/brief.js.map +1 -0
- package/dist/cache.d.ts +8 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +20 -0
- package/dist/cache.js.map +1 -0
- package/dist/checks/brief.d.ts +5 -0
- package/dist/checks/brief.d.ts.map +1 -0
- package/dist/checks/brief.js +38 -0
- package/dist/checks/brief.js.map +1 -0
- package/dist/checks/citations.d.ts +14 -0
- package/dist/checks/citations.d.ts.map +1 -0
- package/dist/checks/citations.js +87 -0
- package/dist/checks/citations.js.map +1 -0
- package/dist/checks/claims.d.ts +16 -0
- package/dist/checks/claims.d.ts.map +1 -0
- package/dist/checks/claims.js +147 -0
- package/dist/checks/claims.js.map +1 -0
- package/dist/checks/closing.d.ts +20 -0
- package/dist/checks/closing.d.ts.map +1 -0
- package/dist/checks/closing.js +168 -0
- package/dist/checks/closing.js.map +1 -0
- package/dist/checks/design.d.ts +5 -0
- package/dist/checks/design.d.ts.map +1 -0
- package/dist/checks/design.js +107 -0
- package/dist/checks/design.js.map +1 -0
- package/dist/checks/document.d.ts +17 -0
- package/dist/checks/document.d.ts.map +1 -0
- package/dist/checks/document.js +213 -0
- package/dist/checks/document.js.map +1 -0
- package/dist/checks/evidence.d.ts +7 -0
- package/dist/checks/evidence.d.ts.map +1 -0
- package/dist/checks/evidence.js +133 -0
- package/dist/checks/evidence.js.map +1 -0
- package/dist/checks/hygiene.d.ts +5 -0
- package/dist/checks/hygiene.d.ts.map +1 -0
- package/dist/checks/hygiene.js +37 -0
- package/dist/checks/hygiene.js.map +1 -0
- package/dist/checks/index.d.ts +21 -0
- package/dist/checks/index.d.ts.map +1 -0
- package/dist/checks/index.js +98 -0
- package/dist/checks/index.js.map +1 -0
- package/dist/checks/language.d.ts +14 -0
- package/dist/checks/language.d.ts.map +1 -0
- package/dist/checks/language.js +73 -0
- package/dist/checks/language.js.map +1 -0
- package/dist/checks/outline.d.ts +25 -0
- package/dist/checks/outline.d.ts.map +1 -0
- package/dist/checks/outline.js +214 -0
- package/dist/checks/outline.js.map +1 -0
- package/dist/checks/policy.d.ts +5 -0
- package/dist/checks/policy.d.ts.map +1 -0
- package/dist/checks/policy.js +129 -0
- package/dist/checks/policy.js.map +1 -0
- package/dist/checks/project.d.ts +65 -0
- package/dist/checks/project.d.ts.map +1 -0
- package/dist/checks/project.js +203 -0
- package/dist/checks/project.js.map +1 -0
- package/dist/checks/styles.d.ts +12 -0
- package/dist/checks/styles.d.ts.map +1 -0
- package/dist/checks/styles.js +67 -0
- package/dist/checks/styles.js.map +1 -0
- package/dist/checks/writing.d.ts +6 -0
- package/dist/checks/writing.d.ts.map +1 -0
- package/dist/checks/writing.js +115 -0
- package/dist/checks/writing.js.map +1 -0
- package/dist/chrome/detect.d.ts +19 -0
- package/dist/chrome/detect.d.ts.map +1 -0
- package/dist/chrome/detect.js +116 -0
- package/dist/chrome/detect.js.map +1 -0
- package/dist/claims.d.ts +19 -0
- package/dist/claims.d.ts.map +1 -0
- package/dist/claims.js +99 -0
- package/dist/claims.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +262 -0
- package/dist/cli.js.map +1 -0
- package/dist/context.d.ts +55 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +62 -0
- package/dist/context.js.map +1 -0
- package/dist/coordinator.d.ts +139 -0
- package/dist/coordinator.d.ts.map +1 -0
- package/dist/coordinator.js +710 -0
- package/dist/coordinator.js.map +1 -0
- package/dist/delegate.d.ts +34 -0
- package/dist/delegate.d.ts.map +1 -0
- package/dist/delegate.js +105 -0
- package/dist/delegate.js.map +1 -0
- package/dist/diffguard.d.ts +24 -0
- package/dist/diffguard.d.ts.map +1 -0
- package/dist/diffguard.js +92 -0
- package/dist/diffguard.js.map +1 -0
- package/dist/doctor.d.ts +34 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +155 -0
- package/dist/doctor.js.map +1 -0
- package/dist/draft.d.ts +64 -0
- package/dist/draft.d.ts.map +1 -0
- package/dist/draft.js +801 -0
- package/dist/draft.js.map +1 -0
- package/dist/figure.d.ts +13 -0
- package/dist/figure.d.ts.map +1 -0
- package/dist/figure.js +143 -0
- package/dist/figure.js.map +1 -0
- package/dist/finalize.d.ts +29 -0
- package/dist/finalize.d.ts.map +1 -0
- package/dist/finalize.js +230 -0
- package/dist/finalize.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +206 -0
- package/dist/index.js.map +1 -0
- package/dist/intake.d.ts +57 -0
- package/dist/intake.d.ts.map +1 -0
- package/dist/intake.js +772 -0
- package/dist/intake.js.map +1 -0
- package/dist/labels.d.ts +50 -0
- package/dist/labels.d.ts.map +1 -0
- package/dist/labels.js +98 -0
- package/dist/labels.js.map +1 -0
- package/dist/outline.d.ts +45 -0
- package/dist/outline.d.ts.map +1 -0
- package/dist/outline.js +148 -0
- package/dist/outline.js.map +1 -0
- package/dist/pack-commands.d.ts +18 -0
- package/dist/pack-commands.d.ts.map +1 -0
- package/dist/pack-commands.js +397 -0
- package/dist/pack-commands.js.map +1 -0
- package/dist/package-paths.d.ts +8 -0
- package/dist/package-paths.d.ts.map +1 -0
- package/dist/package-paths.js +13 -0
- package/dist/package-paths.js.map +1 -0
- package/dist/policy/context.d.ts +19 -0
- package/dist/policy/context.d.ts.map +1 -0
- package/dist/policy/context.js +62 -0
- package/dist/policy/context.js.map +1 -0
- package/dist/policy/ethics.d.ts +59 -0
- package/dist/policy/ethics.d.ts.map +1 -0
- package/dist/policy/ethics.js +106 -0
- package/dist/policy/ethics.js.map +1 -0
- package/dist/policy/kinds.d.ts +9 -0
- package/dist/policy/kinds.d.ts.map +1 -0
- package/dist/policy/kinds.js +68 -0
- package/dist/policy/kinds.js.map +1 -0
- package/dist/policy/packs.d.ts +53 -0
- package/dist/policy/packs.d.ts.map +1 -0
- package/dist/policy/packs.js +336 -0
- package/dist/policy/packs.js.map +1 -0
- package/dist/policy/resolver.d.ts +87 -0
- package/dist/policy/resolver.d.ts.map +1 -0
- package/dist/policy/resolver.js +337 -0
- package/dist/policy/resolver.js.map +1 -0
- package/dist/policy/rules.d.ts +65 -0
- package/dist/policy/rules.d.ts.map +1 -0
- package/dist/policy/rules.js +194 -0
- package/dist/policy/rules.js.map +1 -0
- package/dist/protocol.d.ts +46 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +86 -0
- package/dist/protocol.js.map +1 -0
- package/dist/render/adapters/chrome-pdf/cdp.d.ts +36 -0
- package/dist/render/adapters/chrome-pdf/cdp.d.ts.map +1 -0
- package/dist/render/adapters/chrome-pdf/cdp.js +291 -0
- package/dist/render/adapters/chrome-pdf/cdp.js.map +1 -0
- package/dist/render/adapters/chrome-pdf/index.d.ts +10 -0
- package/dist/render/adapters/chrome-pdf/index.d.ts.map +1 -0
- package/dist/render/adapters/chrome-pdf/index.js +139 -0
- package/dist/render/adapters/chrome-pdf/index.js.map +1 -0
- package/dist/render/adapters/chrome-pdf/network.d.ts +7 -0
- package/dist/render/adapters/chrome-pdf/network.d.ts.map +1 -0
- package/dist/render/adapters/chrome-pdf/network.js +33 -0
- package/dist/render/adapters/chrome-pdf/network.js.map +1 -0
- package/dist/render/adapters/html-preview/index.d.ts +8 -0
- package/dist/render/adapters/html-preview/index.d.ts.map +1 -0
- package/dist/render/adapters/html-preview/index.js +62 -0
- package/dist/render/adapters/html-preview/index.js.map +1 -0
- package/dist/render/adapters/test-json/index.d.ts +8 -0
- package/dist/render/adapters/test-json/index.d.ts.map +1 -0
- package/dist/render/adapters/test-json/index.js +62 -0
- package/dist/render/adapters/test-json/index.js.map +1 -0
- package/dist/render/adapters/typst-pdf/emitter.d.ts +21 -0
- package/dist/render/adapters/typst-pdf/emitter.d.ts.map +1 -0
- package/dist/render/adapters/typst-pdf/emitter.js +259 -0
- package/dist/render/adapters/typst-pdf/emitter.js.map +1 -0
- package/dist/render/adapters/typst-pdf/escape.d.ts +14 -0
- package/dist/render/adapters/typst-pdf/escape.d.ts.map +1 -0
- package/dist/render/adapters/typst-pdf/escape.js +56 -0
- package/dist/render/adapters/typst-pdf/escape.js.map +1 -0
- package/dist/render/adapters/typst-pdf/index.d.ts +9 -0
- package/dist/render/adapters/typst-pdf/index.d.ts.map +1 -0
- package/dist/render/adapters/typst-pdf/index.js +154 -0
- package/dist/render/adapters/typst-pdf/index.js.map +1 -0
- package/dist/render/adapters/typst-pdf/profile.d.ts +3 -0
- package/dist/render/adapters/typst-pdf/profile.d.ts.map +1 -0
- package/dist/render/adapters/typst-pdf/profile.js +55 -0
- package/dist/render/adapters/typst-pdf/profile.js.map +1 -0
- package/dist/render/adapters/typst-pdf/runner.d.ts +52 -0
- package/dist/render/adapters/typst-pdf/runner.d.ts.map +1 -0
- package/dist/render/adapters/typst-pdf/runner.js +209 -0
- package/dist/render/adapters/typst-pdf/runner.js.map +1 -0
- package/dist/render/adapters/typst-pdf/setup.d.ts +30 -0
- package/dist/render/adapters/typst-pdf/setup.d.ts.map +1 -0
- package/dist/render/adapters/typst-pdf/setup.js +183 -0
- package/dist/render/adapters/typst-pdf/setup.js.map +1 -0
- package/dist/render/adapters/typst-pdf/version.d.ts +8 -0
- package/dist/render/adapters/typst-pdf/version.d.ts.map +1 -0
- package/dist/render/adapters/typst-pdf/version.js +14 -0
- package/dist/render/adapters/typst-pdf/version.js.map +1 -0
- package/dist/render/assemble.d.ts +28 -0
- package/dist/render/assemble.d.ts.map +1 -0
- package/dist/render/assemble.js +309 -0
- package/dist/render/assemble.js.map +1 -0
- package/dist/render/assets.d.ts +27 -0
- package/dist/render/assets.d.ts.map +1 -0
- package/dist/render/assets.js +232 -0
- package/dist/render/assets.js.map +1 -0
- package/dist/render/build.d.ts +43 -0
- package/dist/render/build.d.ts.map +1 -0
- package/dist/render/build.js +187 -0
- package/dist/render/build.js.map +1 -0
- package/dist/render/charts.d.ts +83 -0
- package/dist/render/charts.d.ts.map +1 -0
- package/dist/render/charts.js +633 -0
- package/dist/render/charts.js.map +1 -0
- package/dist/render/default-registry.d.ts +7 -0
- package/dist/render/default-registry.d.ts.map +1 -0
- package/dist/render/default-registry.js +15 -0
- package/dist/render/default-registry.js.map +1 -0
- package/dist/render/diagram-theme.d.ts +7 -0
- package/dist/render/diagram-theme.d.ts.map +1 -0
- package/dist/render/diagram-theme.js +50 -0
- package/dist/render/diagram-theme.js.map +1 -0
- package/dist/render/dialect.d.ts +23 -0
- package/dist/render/dialect.d.ts.map +1 -0
- package/dist/render/dialect.js +188 -0
- package/dist/render/dialect.js.map +1 -0
- package/dist/render/html/citations.d.ts +70 -0
- package/dist/render/html/citations.d.ts.map +1 -0
- package/dist/render/html/citations.js +371 -0
- package/dist/render/html/citations.js.map +1 -0
- package/dist/render/html/css.d.ts +14 -0
- package/dist/render/html/css.d.ts.map +1 -0
- package/dist/render/html/css.js +113 -0
- package/dist/render/html/css.js.map +1 -0
- package/dist/render/html/emitter.d.ts +20 -0
- package/dist/render/html/emitter.d.ts.map +1 -0
- package/dist/render/html/emitter.js +652 -0
- package/dist/render/html/emitter.js.map +1 -0
- package/dist/render/html/escape.d.ts +11 -0
- package/dist/render/html/escape.d.ts.map +1 -0
- package/dist/render/html/escape.js +32 -0
- package/dist/render/html/escape.js.map +1 -0
- package/dist/render/html/katex.d.ts +9 -0
- package/dist/render/html/katex.d.ts.map +1 -0
- package/dist/render/html/katex.js +39 -0
- package/dist/render/html/katex.js.map +1 -0
- package/dist/render/html/stage.d.ts +12 -0
- package/dist/render/html/stage.d.ts.map +1 -0
- package/dist/render/html/stage.js +30 -0
- package/dist/render/html/stage.js.map +1 -0
- package/dist/render/index.d.ts +5 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +5 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/math.d.ts +9 -0
- package/dist/render/math.d.ts.map +1 -0
- package/dist/render/math.js +60 -0
- package/dist/render/math.js.map +1 -0
- package/dist/render/model.d.ts +233 -0
- package/dist/render/model.d.ts.map +1 -0
- package/dist/render/model.js +2 -0
- package/dist/render/model.js.map +1 -0
- package/dist/render/numbering.d.ts +51 -0
- package/dist/render/numbering.d.ts.map +1 -0
- package/dist/render/numbering.js +155 -0
- package/dist/render/numbering.js.map +1 -0
- package/dist/render/output-name.d.ts +4 -0
- package/dist/render/output-name.d.ts.map +1 -0
- package/dist/render/output-name.js +11 -0
- package/dist/render/output-name.js.map +1 -0
- package/dist/render/palettes.d.ts +22 -0
- package/dist/render/palettes.d.ts.map +1 -0
- package/dist/render/palettes.js +46 -0
- package/dist/render/palettes.js.map +1 -0
- package/dist/render/parse.d.ts +15 -0
- package/dist/render/parse.d.ts.map +1 -0
- package/dist/render/parse.js +637 -0
- package/dist/render/parse.js.map +1 -0
- package/dist/render/port.d.ts +79 -0
- package/dist/render/port.d.ts.map +1 -0
- package/dist/render/port.js +2 -0
- package/dist/render/port.js.map +1 -0
- package/dist/render/registry.d.ts +11 -0
- package/dist/render/registry.d.ts.map +1 -0
- package/dist/render/registry.js +21 -0
- package/dist/render/registry.js.map +1 -0
- package/dist/render/text.d.ts +13 -0
- package/dist/render/text.d.ts.map +1 -0
- package/dist/render/text.js +65 -0
- package/dist/render/text.js.map +1 -0
- package/dist/render/walk.d.ts +13 -0
- package/dist/render/walk.d.ts.map +1 -0
- package/dist/render/walk.js +69 -0
- package/dist/render/walk.js.map +1 -0
- package/dist/research/bibtex.d.ts +12 -0
- package/dist/research/bibtex.d.ts.map +1 -0
- package/dist/research/bibtex.js +99 -0
- package/dist/research/bibtex.js.map +1 -0
- package/dist/research/client.d.ts +112 -0
- package/dist/research/client.d.ts.map +1 -0
- package/dist/research/client.js +661 -0
- package/dist/research/client.js.map +1 -0
- package/dist/research/dossier.d.ts +31 -0
- package/dist/research/dossier.d.ts.map +1 -0
- package/dist/research/dossier.js +54 -0
- package/dist/research/dossier.js.map +1 -0
- package/dist/research/flow.d.ts +31 -0
- package/dist/research/flow.d.ts.map +1 -0
- package/dist/research/flow.js +635 -0
- package/dist/research/flow.js.map +1 -0
- package/dist/research/library.d.ts +79 -0
- package/dist/research/library.d.ts.map +1 -0
- package/dist/research/library.js +319 -0
- package/dist/research/library.js.map +1 -0
- package/dist/research/verify.d.ts +80 -0
- package/dist/research/verify.d.ts.map +1 -0
- package/dist/research/verify.js +307 -0
- package/dist/research/verify.js.map +1 -0
- package/dist/resources.d.ts +15 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +148 -0
- package/dist/resources.js.map +1 -0
- package/dist/review.d.ts +22 -0
- package/dist/review.d.ts.map +1 -0
- package/dist/review.js +355 -0
- package/dist/review.js.map +1 -0
- package/dist/schemas.d.ts +252 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +1020 -0
- package/dist/schemas.js.map +1 -0
- package/dist/sections.d.ts +30 -0
- package/dist/sections.d.ts.map +1 -0
- package/dist/sections.js +62 -0
- package/dist/sections.js.map +1 -0
- package/dist/storage.d.ts +21 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +296 -0
- package/dist/storage.js.map +1 -0
- package/dist/style-commands.d.ts +15 -0
- package/dist/style-commands.d.ts.map +1 -0
- package/dist/style-commands.js +54 -0
- package/dist/style-commands.js.map +1 -0
- package/dist/styles/csl.d.ts +58 -0
- package/dist/styles/csl.d.ts.map +1 -0
- package/dist/styles/csl.js +112 -0
- package/dist/styles/csl.js.map +1 -0
- package/dist/styles/discovery.d.ts +45 -0
- package/dist/styles/discovery.d.ts.map +1 -0
- package/dist/styles/discovery.js +99 -0
- package/dist/styles/discovery.js.map +1 -0
- package/dist/styles/golden.d.ts +52 -0
- package/dist/styles/golden.d.ts.map +1 -0
- package/dist/styles/golden.js +216 -0
- package/dist/styles/golden.js.map +1 -0
- package/dist/styles/profile.d.ts +126 -0
- package/dist/styles/profile.d.ts.map +1 -0
- package/dist/styles/profile.js +582 -0
- package/dist/styles/profile.js.map +1 -0
- package/dist/styles/xml.d.ts +22 -0
- package/dist/styles/xml.d.ts.map +1 -0
- package/dist/styles/xml.js +179 -0
- package/dist/styles/xml.js.map +1 -0
- package/dist/types.d.ts +285 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +155 -0
- package/dist/types.js.map +1 -0
- package/dist/typst-pins.d.ts +16 -0
- package/dist/typst-pins.d.ts.map +1 -0
- package/dist/typst-pins.js +39 -0
- package/dist/typst-pins.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/workflow.d.ts +49 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +722 -0
- package/dist/workflow.js.map +1 -0
- package/dist/workspace.d.ts +12 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +71 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +70 -0
- package/policy-packs/countries/CO/academic-standards/ntc-1486-2022.yaml +188 -0
- package/policy-packs/countries/CO/copyright/decision-andina-351.yaml +61 -0
- package/policy-packs/countries/CO/copyright/ley-1915-2018.yaml +25 -0
- package/policy-packs/countries/CO/copyright/ley-23-1982.yaml +64 -0
- package/policy-packs/countries/CO/domains/health/resolucion-8430-1993.yaml +219 -0
- package/policy-packs/countries/CO/higher-education/ley-30-1992.yaml +61 -0
- package/policy-packs/countries/CO/manifest.yaml +42 -0
- package/policy-packs/countries/CO/official-domains.yaml +90 -0
- package/policy-packs/countries/CO/privacy/ley-1581-2012.yaml +197 -0
- package/policy-packs/countries/CO/research-integrity/minciencias-res-0314-2018.yaml +64 -0
- package/policy-packs/global/academic-integrity.yaml +45 -0
- package/policy-packs/global/academic-writing.yaml +70 -0
- package/policy-packs/global/evidence-quality.yaml +81 -0
- package/policy-packs/global/manifest.yaml +54 -0
- package/policy-packs/global/objective-verbs.yaml +245 -0
- package/policy-packs/global/reporting-guidelines.yaml +392 -0
- package/policy-packs/global/work-types.yaml +195 -0
- package/styles/LICENSE-CSL +375 -0
- package/styles/apa.csl +2283 -0
- package/styles/catalog.json +43 -0
- package/styles/fixtures/apa-7.expected.json +25 -0
- package/styles/fixtures/icontec-ntc1486-2022.expected.json +25 -0
- package/styles/fixtures/ieee.expected.json +25 -0
- package/styles/fixtures/references.jsonl +8 -0
- package/styles/icontec-ntc1486-2022.csl +388 -0
- package/styles/ieee.csl +519 -0
- package/templates/html/runtime.js +159 -0
- package/templates/html/thesis.css +98 -0
- package/templates/html/vendor/katex/LICENSE +21 -0
- package/templates/html/vendor/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/templates/html/vendor/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/templates/html/vendor/katex/katex.min.css +1 -0
- package/templates/html/vendor/katex/katex.min.js +1 -0
- package/templates/html/vendor/mermaid/LICENSE +21 -0
- package/templates/html/vendor/mermaid/mermaid.min.js +3587 -0
- package/templates/html/vendor/pagedjs/LICENSE +21 -0
- package/templates/html/vendor/pagedjs/paged.polyfill.min.js +4 -0
- package/templates/palettes.json +57 -0
- package/templates/profiles/apa-7.profile.yaml +15 -0
- package/templates/profiles/generic.profile.yaml +20 -0
- package/templates/profiles/icontec-ntc1486-2022.profile.yaml +36 -0
- package/templates/profiles/ieee.profile.yaml +14 -0
- package/templates/typst/i18n/en.yaml +31 -0
- package/templates/typst/i18n/es.yaml +31 -0
- package/templates/typst/i18n/pt.yaml +31 -0
- package/templates/typst/thesis.typ +276 -0
- package/typst-packages/preview/merman/0.3.0/LICENSE +231 -0
- package/typst-packages/preview/merman/0.3.0/README.md +388 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/cose-base-v1/LICENSE +21 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/cose-base-v2/LICENSE +21 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/cytoscape/LICENSE +19 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/cytoscape-cose-bilkent/LICENSE +21 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/cytoscape-fcose/LICENSE +19 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/d3-shape/LICENSE +13 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/dagre/LICENSE +19 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/dompurify/LICENSE +202 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/eclipse-elk/LICENSE.md +264 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/elkjs/LICENSE.md +264 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/fmin/LICENSE +27 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/graphlib/LICENSE +19 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/layout-base-v1/LICENSE +21 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/layout-base-v2/LICENSE +21 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/mermaid/LICENSE +21 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/rough-rs/LICENSE +21 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/roughjs/LICENSE +21 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/sanitize-url/LICENSE +21 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/venn-js/LICENSE +22 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/wasm-minimal-protocol/LICENSE +24 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/zenuml-core/LICENSE +21 -0
- package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_NOTICES.md +265 -0
- package/typst-packages/preview/merman/0.3.0/lib.typ +1 -0
- package/typst-packages/preview/merman/0.3.0/merman_typst_plugin.wasm +0 -0
- package/typst-packages/preview/merman/0.3.0/src/capabilities.typ +5 -0
- package/typst-packages/preview/merman/0.3.0/src/context.typ +1 -0
- package/typst-packages/preview/merman/0.3.0/src/errors.typ +33 -0
- package/typst-packages/preview/merman/0.3.0/src/exports.typ +5 -0
- package/typst-packages/preview/merman/0.3.0/src/figure.typ +143 -0
- package/typst-packages/preview/merman/0.3.0/src/image.typ +50 -0
- package/typst-packages/preview/merman/0.3.0/src/options.typ +566 -0
- package/typst-packages/preview/merman/0.3.0/src/plugin.typ +1 -0
- package/typst-packages/preview/merman/0.3.0/src/raw.typ +22 -0
- package/typst-packages/preview/merman/0.3.0/src/render.typ +137 -0
- package/typst-packages/preview/merman/0.3.0/src/source.typ +7 -0
- package/typst-packages/preview/merman/0.3.0/src/units.typ +51 -0
- package/typst-packages/preview/merman/0.3.0/typst.toml +12 -0
- package/typst-packages/preview/mitex/0.2.7/CHANGELOG.md +69 -0
- package/typst-packages/preview/mitex/0.2.7/LICENSE +176 -0
- package/typst-packages/preview/mitex/0.2.7/README.md +154 -0
- package/typst-packages/preview/mitex/0.2.7/lib.typ +1 -0
- package/typst-packages/preview/mitex/0.2.7/mitex.typ +45 -0
- package/typst-packages/preview/mitex/0.2.7/mitex.wasm +0 -0
- package/typst-packages/preview/mitex/0.2.7/specs/README.md +250 -0
- package/typst-packages/preview/mitex/0.2.7/specs/latex/standard.typ +1187 -0
- package/typst-packages/preview/mitex/0.2.7/specs/mod.typ +12 -0
- package/typst-packages/preview/mitex/0.2.7/specs/prelude.typ +230 -0
- package/typst-packages/preview/mitex/0.2.7/typst.toml +12 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { parseProtocol } from "../protocol.js";
|
|
2
|
+
import { fold } from "../research/verify.js";
|
|
3
|
+
const file = "research/protocol.md";
|
|
4
|
+
const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
5
|
+
const filled = (value) => typeof value === "string" && value.trim().length > 0;
|
|
6
|
+
const error = (message, hint) => ({
|
|
7
|
+
code: "DSN-001",
|
|
8
|
+
gate: "G1",
|
|
9
|
+
severity: "error",
|
|
10
|
+
file,
|
|
11
|
+
message,
|
|
12
|
+
...(hint ? { hint } : {}),
|
|
13
|
+
});
|
|
14
|
+
function strings(value) {
|
|
15
|
+
return Array.isArray(value)
|
|
16
|
+
? value
|
|
17
|
+
.filter((entry) => typeof entry === "string")
|
|
18
|
+
.map((entry) => fold(entry).trim())
|
|
19
|
+
: [];
|
|
20
|
+
}
|
|
21
|
+
/** G1: the protocol is complete (DSN-001) and its objective verbs are verifiable (DSN-002). */
|
|
22
|
+
export function checkDesign(project) {
|
|
23
|
+
if (project.protocolText === undefined)
|
|
24
|
+
return [];
|
|
25
|
+
const parsed = parseProtocol(project.protocolText);
|
|
26
|
+
if (!parsed.data)
|
|
27
|
+
return [error(parsed.error ?? "protocol.md cannot be read")];
|
|
28
|
+
const data = parsed.data;
|
|
29
|
+
const findings = [];
|
|
30
|
+
const hint = "Run /thesis:design again, or fix the front matter of research/protocol.md.";
|
|
31
|
+
if (!filled(data.problem))
|
|
32
|
+
findings.push(error("The protocol has no problem statement", hint));
|
|
33
|
+
if (!Array.isArray(data.researchQuestions) || !data.researchQuestions.some(filled)) {
|
|
34
|
+
findings.push(error("The protocol has no research question", hint));
|
|
35
|
+
}
|
|
36
|
+
const general = data.generalObjective;
|
|
37
|
+
if (!isObject(general) || !filled(general.text)) {
|
|
38
|
+
findings.push(error("The protocol has no general objective", hint));
|
|
39
|
+
}
|
|
40
|
+
const objectives = Array.isArray(data.specificObjectives) ? data.specificObjectives : [];
|
|
41
|
+
if (objectives.length < 2 || objectives.length > 6) {
|
|
42
|
+
findings.push(error(`The protocol must have 2 to 6 specific objectives (found ${objectives.length})`, hint));
|
|
43
|
+
}
|
|
44
|
+
objectives.forEach((objective, index) => {
|
|
45
|
+
if (!isObject(objective) ||
|
|
46
|
+
!filled(objective.id) ||
|
|
47
|
+
!filled(objective.verb) ||
|
|
48
|
+
!filled(objective.object) ||
|
|
49
|
+
!filled(objective.deliverable)) {
|
|
50
|
+
findings.push(error(`Specific objective ${index + 1} needs an id, a verb, an object and a deliverable`, hint));
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
const justification = data.justification;
|
|
54
|
+
if (!isObject(justification) ||
|
|
55
|
+
!["relevance", "novelty", "feasibility", "beneficiaries"].every((key) => filled(justification[key]))) {
|
|
56
|
+
findings.push(error("The justification must state relevance, novelty, feasibility and beneficiaries", hint));
|
|
57
|
+
}
|
|
58
|
+
const methodology = data.methodology;
|
|
59
|
+
if (!isObject(methodology) || !filled(methodology.design) || !filled(methodology.analysisPlan)) {
|
|
60
|
+
findings.push(error("The methodology needs at least a design and an analysis plan", hint));
|
|
61
|
+
}
|
|
62
|
+
// DSN-002: verbs against the approved list of the thesis language (warning, never blocking).
|
|
63
|
+
const profile = project.profile;
|
|
64
|
+
const rule = profile?.rules.find((entry) => entry.kind === "objective_verbs");
|
|
65
|
+
if (profile && !rule) {
|
|
66
|
+
findings.push({
|
|
67
|
+
code: "DSN-002",
|
|
68
|
+
gate: "G1",
|
|
69
|
+
severity: "info",
|
|
70
|
+
file,
|
|
71
|
+
message: `No approved objective-verb list exists for language ${profile.inputs.language}; verbs were not checked`,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
else if (profile && rule) {
|
|
75
|
+
const recommended = new Set(Object.values(isObject(rule.values.recommendedByLevel) ? rule.values.recommendedByLevel : {}).flatMap(strings));
|
|
76
|
+
const unverifiable = new Set([
|
|
77
|
+
...strings(rule.values.avoid),
|
|
78
|
+
...strings(rule.values.ambiguous),
|
|
79
|
+
]);
|
|
80
|
+
const downgrade = isObject(rule.values.qualitativeDowngrade)
|
|
81
|
+
? rule.values.qualitativeDowngrade
|
|
82
|
+
: undefined;
|
|
83
|
+
const downgraded = new Set(strings(downgrade?.verbs));
|
|
84
|
+
const qualitative = profile.inputs.approach === "qualitative";
|
|
85
|
+
for (const objective of objectives) {
|
|
86
|
+
if (!isObject(objective) || !filled(objective.verb))
|
|
87
|
+
continue;
|
|
88
|
+
const verb = fold(String(objective.verb)).trim();
|
|
89
|
+
const id = filled(objective.id) ? String(objective.id) : "objective";
|
|
90
|
+
if (recommended.has(verb) && !unverifiable.has(verb))
|
|
91
|
+
continue;
|
|
92
|
+
const soft = qualitative && downgraded.has(verb);
|
|
93
|
+
findings.push({
|
|
94
|
+
code: "DSN-002",
|
|
95
|
+
gate: "G1",
|
|
96
|
+
severity: soft ? "info" : "warning",
|
|
97
|
+
file,
|
|
98
|
+
message: unverifiable.has(verb)
|
|
99
|
+
? `${id}: the verb "${String(objective.verb)}" is not verifiable; use a measurable action verb`
|
|
100
|
+
: `${id}: the verb "${String(objective.verb)}" is not in the approved list for ${profile.inputs.language}`,
|
|
101
|
+
hint: `Approved verbs come from ${rule.ruleId}; see /thesis:pack explain ${rule.ruleId}.`,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return findings;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=design.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design.js","sourceRoot":"","sources":["../../src/checks/design.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Assembled } from "../render/assemble.js";
|
|
2
|
+
import type { ThesisDocument } from "../render/model.js";
|
|
3
|
+
import type { Finding } from "../types.js";
|
|
4
|
+
import type { LoadedProject } from "./project.js";
|
|
5
|
+
/** The full-scope document of a project, parsed once per loaded project. */
|
|
6
|
+
export declare function documentOf(project: LoadedProject): Assembled | undefined;
|
|
7
|
+
/** XRF-001, XRF-002 and MTH-001. */
|
|
8
|
+
export declare function modelFindings(doc: ThesisDocument): Finding[];
|
|
9
|
+
/** G7: HYG-001 from the dialect (raw HTML, raw Typst, placeholders, unknown attributes) and label notes. */
|
|
10
|
+
export declare function checkDocumentHygiene(project: LoadedProject): Finding[];
|
|
11
|
+
/** G8: cross-references and math. */
|
|
12
|
+
export declare function checkDocumentModel(project: LoadedProject): Finding[];
|
|
13
|
+
/** G8 BLD-001: the last recorded build must have succeeded (nothing is reported before a first build). */
|
|
14
|
+
export declare function checkBuildReport(project: LoadedProject): Finding[];
|
|
15
|
+
/** FIG-001 to FIG-003: every chart spec under figures/ against the supported subset (G8). */
|
|
16
|
+
export declare function checkCharts(project: LoadedProject): Finding[];
|
|
17
|
+
//# sourceMappingURL=document.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/checks/document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,uBAAuB,CAAC;AAGzE,OAAO,KAAK,EAAS,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMlD,4EAA4E;AAC5E,wBAAgB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,SAAS,CAQxE;AAOD,oCAAoC;AACpC,wBAAgB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,EAAE,CAsI5D;AAED,4GAA4G;AAC5G,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CAGtE;AAED,qCAAqC;AACrC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CAIpE;AAED,0GAA0G;AAC1G,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CA2BlE;AAED,6FAA6F;AAC7F,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CAgB7D"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { assembleDocument } from "../render/assemble.js";
|
|
2
|
+
import { checkChartSpec } from "../render/charts.js";
|
|
3
|
+
import { validateLatex } from "../render/math.js";
|
|
4
|
+
import { allBlockLists, walkBlocks, walkInlines } from "../render/walk.js";
|
|
5
|
+
/** Checks over the renderer-neutral document model (spec 10.0): no output format is involved. */
|
|
6
|
+
const cache = new WeakMap();
|
|
7
|
+
/** The full-scope document of a project, parsed once per loaded project. */
|
|
8
|
+
export function documentOf(project) {
|
|
9
|
+
if (!cache.has(project)) {
|
|
10
|
+
cache.set(project, assembleDocument(project, { scope: "full", sections: project.sections ?? {} }));
|
|
11
|
+
}
|
|
12
|
+
return cache.get(project);
|
|
13
|
+
}
|
|
14
|
+
const at = (file, block) => ({
|
|
15
|
+
...(file === undefined ? {} : { file }),
|
|
16
|
+
...(block.line === undefined ? {} : { line: block.line }),
|
|
17
|
+
});
|
|
18
|
+
/** XRF-001, XRF-002 and MTH-001. */
|
|
19
|
+
export function modelFindings(doc) {
|
|
20
|
+
const findings = [];
|
|
21
|
+
const lists = allBlockLists(doc);
|
|
22
|
+
const defined = new Map();
|
|
23
|
+
for (const { file, blocks } of lists) {
|
|
24
|
+
walkBlocks(blocks, (block) => {
|
|
25
|
+
if (!("label" in block) || !block.label)
|
|
26
|
+
return;
|
|
27
|
+
const previous = defined.get(block.label);
|
|
28
|
+
if (previous) {
|
|
29
|
+
findings.push({
|
|
30
|
+
code: "XRF-001",
|
|
31
|
+
gate: "G8",
|
|
32
|
+
severity: "error",
|
|
33
|
+
...at(file, block),
|
|
34
|
+
message: `Label ${block.label} is defined more than once (first at ${previous.file ?? "unknown"}${previous.line ? `:${previous.line}` : ""})`,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
else
|
|
38
|
+
defined.set(block.label, { file, line: block.line });
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const referenced = new Set();
|
|
42
|
+
for (const { file, blocks } of lists) {
|
|
43
|
+
walkInlines(blocks, (inline, owner) => {
|
|
44
|
+
if (inline.kind === "crossref") {
|
|
45
|
+
referenced.add(inline.label);
|
|
46
|
+
if (!defined.has(inline.label)) {
|
|
47
|
+
findings.push({
|
|
48
|
+
code: "XRF-001",
|
|
49
|
+
gate: "G8",
|
|
50
|
+
severity: "error",
|
|
51
|
+
...at(file, owner),
|
|
52
|
+
message: `Reference @${inline.label} does not match any label`,
|
|
53
|
+
hint: "Label figures, tables, equations and headings with {#fig-x}, {#tbl-x}, {#eq-x} and {#sec-x}.",
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (inline.kind === "math") {
|
|
58
|
+
const problem = validateLatex(inline.latex);
|
|
59
|
+
if (problem) {
|
|
60
|
+
findings.push({
|
|
61
|
+
code: "MTH-001",
|
|
62
|
+
gate: "G8",
|
|
63
|
+
severity: "error",
|
|
64
|
+
...at(file, owner),
|
|
65
|
+
message: problem,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
walkBlocks(blocks, (block) => {
|
|
71
|
+
if (block.kind === "equation") {
|
|
72
|
+
const problem = validateLatex(block.latex);
|
|
73
|
+
if (problem) {
|
|
74
|
+
findings.push({
|
|
75
|
+
code: "MTH-001",
|
|
76
|
+
gate: "G8",
|
|
77
|
+
severity: "error",
|
|
78
|
+
...at(file, block),
|
|
79
|
+
message: problem,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// FIG-004: a chart needs a caption and a source line.
|
|
86
|
+
for (const { file, blocks } of lists) {
|
|
87
|
+
walkBlocks(blocks, (block) => {
|
|
88
|
+
if (block.kind !== "figure" || block.asset.kind !== "chart")
|
|
89
|
+
return;
|
|
90
|
+
if (block.caption.length === 0) {
|
|
91
|
+
findings.push({
|
|
92
|
+
code: "FIG-004",
|
|
93
|
+
gate: "G8",
|
|
94
|
+
severity: "error",
|
|
95
|
+
...at(file, block),
|
|
96
|
+
message: `Chart ${block.asset.path} has no caption`,
|
|
97
|
+
hint: "Write the caption as the figure's alt text: .",
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
if (!block.source) {
|
|
101
|
+
findings.push({
|
|
102
|
+
code: "FIG-004",
|
|
103
|
+
gate: "G8",
|
|
104
|
+
severity: "error",
|
|
105
|
+
...at(file, block),
|
|
106
|
+
message: `Chart ${block.asset.path} has no source line`,
|
|
107
|
+
hint: 'End the caption with "Source: ..." (Fuente: / Fonte:), for example "Source: own elaboration."',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// XRF-003: a heading level may not skip a level (for example # followed by ###).
|
|
113
|
+
let previous = 0;
|
|
114
|
+
for (const section of [...doc.body, ...doc.annexes]) {
|
|
115
|
+
walkBlocks(section.blocks, (block) => {
|
|
116
|
+
if (block.kind !== "heading")
|
|
117
|
+
return;
|
|
118
|
+
if (block.level > previous + 1) {
|
|
119
|
+
findings.push({
|
|
120
|
+
code: "XRF-003",
|
|
121
|
+
gate: "G8",
|
|
122
|
+
severity: "warning",
|
|
123
|
+
...at(section.path, block),
|
|
124
|
+
message: previous === 0
|
|
125
|
+
? `The first heading is level ${block.level}; start with a level 1 heading`
|
|
126
|
+
: `Heading level jumps from ${previous} to ${block.level}`,
|
|
127
|
+
hint: "Use consecutive heading levels so the table of contents and numbering stay meaningful.",
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
previous = block.level;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
for (const { file, blocks } of lists) {
|
|
134
|
+
walkBlocks(blocks, (block) => {
|
|
135
|
+
if ((block.kind === "figure" || block.kind === "table") &&
|
|
136
|
+
block.label &&
|
|
137
|
+
!referenced.has(block.label)) {
|
|
138
|
+
findings.push({
|
|
139
|
+
code: "XRF-002",
|
|
140
|
+
gate: "G8",
|
|
141
|
+
severity: "warning",
|
|
142
|
+
...at(file, block),
|
|
143
|
+
message: `${block.kind === "figure" ? "Figure" : "Table"} ${block.label} is never referenced in the text`,
|
|
144
|
+
hint: `Mention it with @${block.label}.`,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
return findings;
|
|
150
|
+
}
|
|
151
|
+
/** G7: HYG-001 from the dialect (raw HTML, raw Typst, placeholders, unknown attributes) and label notes. */
|
|
152
|
+
export function checkDocumentHygiene(project) {
|
|
153
|
+
const assembled = documentOf(project);
|
|
154
|
+
return assembled ? assembled.findings.filter((finding) => finding.gate === "G7") : [];
|
|
155
|
+
}
|
|
156
|
+
/** G8: cross-references and math. */
|
|
157
|
+
export function checkDocumentModel(project) {
|
|
158
|
+
const assembled = documentOf(project);
|
|
159
|
+
if (!assembled)
|
|
160
|
+
return [];
|
|
161
|
+
return modelFindings(assembled.document);
|
|
162
|
+
}
|
|
163
|
+
/** G8 BLD-001: the last recorded build must have succeeded (nothing is reported before a first build). */
|
|
164
|
+
export function checkBuildReport(project) {
|
|
165
|
+
if (project.buildReportText === undefined)
|
|
166
|
+
return [];
|
|
167
|
+
let report;
|
|
168
|
+
try {
|
|
169
|
+
report = JSON.parse(project.buildReportText);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return [
|
|
173
|
+
{
|
|
174
|
+
code: "BLD-001",
|
|
175
|
+
gate: "G8",
|
|
176
|
+
severity: "error",
|
|
177
|
+
file: "build/build-report.json",
|
|
178
|
+
message: "The build report is unreadable; run /thesis:build again",
|
|
179
|
+
},
|
|
180
|
+
];
|
|
181
|
+
}
|
|
182
|
+
if (report.ok === true)
|
|
183
|
+
return [];
|
|
184
|
+
return [
|
|
185
|
+
{
|
|
186
|
+
code: "BLD-001",
|
|
187
|
+
gate: "G8",
|
|
188
|
+
severity: "error",
|
|
189
|
+
file: "build/build-report.json",
|
|
190
|
+
message: `The last build (${typeof report.scope === "string" ? report.scope : "unknown scope"}) failed with ${typeof report.errors === "number" ? report.errors : "some"} error(s)`,
|
|
191
|
+
hint: "Run /thesis:build and fix the reported errors.",
|
|
192
|
+
},
|
|
193
|
+
];
|
|
194
|
+
}
|
|
195
|
+
/** FIG-001 to FIG-003: every chart spec under figures/ against the supported subset (G8). */
|
|
196
|
+
export function checkCharts(project) {
|
|
197
|
+
const dataFiles = new Set(project.dataFiles);
|
|
198
|
+
const findings = [];
|
|
199
|
+
for (const spec of project.chartSpecs) {
|
|
200
|
+
for (const issue of checkChartSpec(spec.content, { dataFiles }).issues) {
|
|
201
|
+
findings.push({
|
|
202
|
+
code: issue.code,
|
|
203
|
+
gate: "G8",
|
|
204
|
+
severity: "error",
|
|
205
|
+
file: spec.path,
|
|
206
|
+
message: issue.message,
|
|
207
|
+
...(issue.hint ? { hint: issue.hint } : {}),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return findings;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/checks/document.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Finding } from "../types.js";
|
|
2
|
+
import type { LoadedProject } from "./project.js";
|
|
3
|
+
/** G2: the evidence library (EVD-*). */
|
|
4
|
+
export declare function checkEvidence(project: LoadedProject): Finding[];
|
|
5
|
+
/** G5 (partial): references.bib is byte-identical to a fresh generation (CIT-004). */
|
|
6
|
+
export declare function checkBibliography(project: LoadedProject): Finding[];
|
|
7
|
+
//# sourceMappingURL=evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../src/checks/evidence.ts"],"names":[],"mappings":"AASA,OAAO,EAGL,KAAK,OAAO,EAEb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAqDlD,wCAAwC;AACxC,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CAiI/D;AAED,sFAAsF;AACtF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CAiBnE"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { flattenOutline, parseOutline } from "../outline.js";
|
|
2
|
+
import { generateBibtex } from "../research/bibtex.js";
|
|
3
|
+
import { citableForSection, parseLibraryText } from "../research/library.js";
|
|
4
|
+
import { classifyHost, officialDomainsFromProfile, primaryTypes, similarityThreshold, } from "../research/verify.js";
|
|
5
|
+
import { citableStatuses, } from "../types.js";
|
|
6
|
+
const libraryFile = "evidence/library.jsonl";
|
|
7
|
+
const bibliographyFile = "bibliography/references.bib";
|
|
8
|
+
const finding = (code, gate, severity, file, message, extra = {}) => ({ code, gate, severity, file, message, ...extra });
|
|
9
|
+
/** Why a citable status is not justified by the record's own verification data (spec 8.4). */
|
|
10
|
+
function statusProblem(record, domains) {
|
|
11
|
+
const { method, metadataMatch } = record.verification;
|
|
12
|
+
const viaApi = method === "crossref" || method === "openalex";
|
|
13
|
+
switch (record.status) {
|
|
14
|
+
case "VERIFIED_PEER_REVIEWED":
|
|
15
|
+
if (!viaApi)
|
|
16
|
+
return "peer-reviewed status needs Crossref or OpenAlex verification";
|
|
17
|
+
if (record.type !== "journal_article" && record.type !== "conference_paper")
|
|
18
|
+
return `peer-reviewed status needs a journal article or conference paper, not ${record.type}`;
|
|
19
|
+
if (metadataMatch < similarityThreshold)
|
|
20
|
+
return `metadata match ${metadataMatch} is below ${similarityThreshold}`;
|
|
21
|
+
return undefined;
|
|
22
|
+
case "VERIFIED_AUTHORITATIVE_GREY":
|
|
23
|
+
if (!viaApi)
|
|
24
|
+
return "authoritative grey status needs Crossref or OpenAlex verification";
|
|
25
|
+
if (metadataMatch < similarityThreshold)
|
|
26
|
+
return `metadata match ${metadataMatch} is below ${similarityThreshold}`;
|
|
27
|
+
return undefined;
|
|
28
|
+
case "VERIFIED_PRIMARY":
|
|
29
|
+
if (!primaryTypes.includes(record.type))
|
|
30
|
+
return `primary status needs a law, standard, report or dataset, not ${record.type}`;
|
|
31
|
+
if (classifyHost(record.url, record.type, domains).tier !== "primary")
|
|
32
|
+
return "primary status needs a URL on an official domain of the policy";
|
|
33
|
+
return undefined;
|
|
34
|
+
default:
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const evidenceStarted = [
|
|
39
|
+
"research_approved",
|
|
40
|
+
"drafting",
|
|
41
|
+
"draft_review",
|
|
42
|
+
"approved",
|
|
43
|
+
"revising",
|
|
44
|
+
];
|
|
45
|
+
/** G2: the evidence library (EVD-*). */
|
|
46
|
+
export function checkEvidence(project) {
|
|
47
|
+
if (project.libraryText === undefined)
|
|
48
|
+
return [];
|
|
49
|
+
const findings = [];
|
|
50
|
+
const { records, errors } = parseLibraryText(project.libraryText);
|
|
51
|
+
for (const error of errors) {
|
|
52
|
+
findings.push(finding("EVD-001", "G2", "error", libraryFile, error.message, { line: error.line }));
|
|
53
|
+
}
|
|
54
|
+
const domains = officialDomainsFromProfile(project.profile);
|
|
55
|
+
const ids = new Map();
|
|
56
|
+
const keys = new Map();
|
|
57
|
+
const dois = new Map();
|
|
58
|
+
for (const record of records) {
|
|
59
|
+
ids.set(record.id, (ids.get(record.id) ?? 0) + 1);
|
|
60
|
+
keys.set(record.citeKey, (keys.get(record.citeKey) ?? 0) + 1);
|
|
61
|
+
if (record.doi) {
|
|
62
|
+
const doi = record.doi.toLowerCase();
|
|
63
|
+
const first = dois.get(doi);
|
|
64
|
+
if (first)
|
|
65
|
+
findings.push(finding("EVD-002", "G2", "error", libraryFile, `DOI ${doi} appears in both ${first} and ${record.id}`, { hint: "Duplicates merge into the oldest evidence id; re-run /thesis:research." }));
|
|
66
|
+
else
|
|
67
|
+
dois.set(doi, record.id);
|
|
68
|
+
}
|
|
69
|
+
if (citableStatuses.includes(record.status)) {
|
|
70
|
+
const problem = statusProblem(record, domains);
|
|
71
|
+
if (problem)
|
|
72
|
+
findings.push(finding("EVD-003", "G2", "error", libraryFile, `${record.id} is ${record.status} but ${problem}`, { hint: "Citable statuses come only from code verification (spec 8.4)." }));
|
|
73
|
+
if (record.verification.retracted)
|
|
74
|
+
findings.push(finding("EVD-004", "G2", "error", libraryFile, `${record.id} is marked retracted but still has the citable status ${record.status}`));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
for (const [id, count] of ids)
|
|
78
|
+
if (count > 1)
|
|
79
|
+
findings.push(finding("EVD-001", "G2", "error", libraryFile, `Evidence id ${id} appears ${count} times`));
|
|
80
|
+
for (const [key, count] of keys)
|
|
81
|
+
if (count > 1)
|
|
82
|
+
findings.push(finding("EVD-001", "G2", "error", libraryFile, `Citation key ${key} appears ${count} times`));
|
|
83
|
+
// Contextual approvals must point at real records.
|
|
84
|
+
for (const [sectionId, section] of Object.entries(project.sections ?? {})) {
|
|
85
|
+
for (const id of section.contextualApprovals ?? []) {
|
|
86
|
+
if (!ids.has(id))
|
|
87
|
+
findings.push(finding("EVD-005", "G2", "error", libraryFile, `${sectionId} approves unknown evidence ${id} for contextual use`));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// EVD-010: evidence minimums (warning). The policy sources give a minimum for the theoretical
|
|
91
|
+
// framework as a whole, so it applies to the section(s) marked as that framework.
|
|
92
|
+
const profile = project.profile;
|
|
93
|
+
if (profile && project.outlineText !== undefined && project.sections) {
|
|
94
|
+
const outline = parseOutline(project.outlineText).outline;
|
|
95
|
+
const frameworks = outline
|
|
96
|
+
? flattenOutline(outline.sections).filter((node) => node.requiredKey === "marco_teorico" || node.requiredKey === "estado_del_arte")
|
|
97
|
+
: [];
|
|
98
|
+
for (const rule of profile.rules.filter((entry) => entry.kind === "evidence_minimum")) {
|
|
99
|
+
const minimum = rule.values.minCitable;
|
|
100
|
+
if (rule.values.scope !== "theoretical_framework" || typeof minimum !== "number")
|
|
101
|
+
continue;
|
|
102
|
+
for (const node of frameworks) {
|
|
103
|
+
const section = project.sections[node.id];
|
|
104
|
+
if (!section || !evidenceStarted.includes(section.status))
|
|
105
|
+
continue;
|
|
106
|
+
const citable = records.filter((record) => record.sections.includes(node.id) &&
|
|
107
|
+
citableForSection(record, section.contextualApprovals)).length;
|
|
108
|
+
if (citable < minimum) {
|
|
109
|
+
findings.push(finding("EVD-010", "G2", rule.values.severity === "error" ? "error" : "warning", libraryFile, `${node.id} has ${citable} citable record(s); ${rule.ruleId} suggests at least ${minimum} for this work type`, {
|
|
110
|
+
hint: "A suggestion from the policy, not a standard; search more or override the rule with an institutional one.",
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return findings;
|
|
117
|
+
}
|
|
118
|
+
/** G5 (partial): references.bib is byte-identical to a fresh generation (CIT-004). */
|
|
119
|
+
export function checkBibliography(project) {
|
|
120
|
+
if (project.libraryText === undefined && project.bibliographyText === undefined)
|
|
121
|
+
return [];
|
|
122
|
+
const { records, errors } = parseLibraryText(project.libraryText);
|
|
123
|
+
if (errors.length > 0)
|
|
124
|
+
return [];
|
|
125
|
+
if (project.bibliographyText === generateBibtex(records))
|
|
126
|
+
return [];
|
|
127
|
+
return [
|
|
128
|
+
finding("CIT-004", "G5", "error", bibliographyFile, "references.bib differs from a fresh generation of the evidence library", {
|
|
129
|
+
hint: "references.bib is generated and never hand-edited; delete it and run /thesis:research for any section to rebuild it.",
|
|
130
|
+
}),
|
|
131
|
+
];
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/checks/evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Finding } from "../types.js";
|
|
2
|
+
import type { LoadedProject } from "./project.js";
|
|
3
|
+
/** G7 (path-leak part of HYG-001): no absolute local paths in the brief or the chapters. */
|
|
4
|
+
export declare function checkHygiene(project: LoadedProject): Finding[];
|
|
5
|
+
//# sourceMappingURL=hygiene.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hygiene.d.ts","sourceRoot":"","sources":["../../src/checks/hygiene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA+BlD,4FAA4F;AAC5F,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CAK9D"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Absolute local-machine paths: POSIX home/temp roots and Windows drive paths.
|
|
2
|
+
const pathPatterns = [
|
|
3
|
+
/(?<![\w.:/-])\/(?:home|Users|root|tmp|private\/var|var\/folders)\/[^\s"'`)\]}<>,;]+/g,
|
|
4
|
+
/(?<![A-Za-z0-9])[A-Za-z]:\\[^\s"'`)\]}<>,;]+/g,
|
|
5
|
+
/(?<![A-Za-z0-9])[A-Za-z]:\/(?:Users|Documents and Settings)\/[^\s"'`)\]}<>,;]+/g,
|
|
6
|
+
];
|
|
7
|
+
function scan(file, text) {
|
|
8
|
+
const findings = [];
|
|
9
|
+
text.split(/\r?\n/).forEach((line, index) => {
|
|
10
|
+
for (const pattern of pathPatterns) {
|
|
11
|
+
pattern.lastIndex = 0;
|
|
12
|
+
if (pattern.test(line)) {
|
|
13
|
+
findings.push({
|
|
14
|
+
code: "HYG-001",
|
|
15
|
+
gate: "G7",
|
|
16
|
+
severity: "error",
|
|
17
|
+
file,
|
|
18
|
+
line: index + 1,
|
|
19
|
+
message: "Absolute local path found; it leaks the author's machine layout",
|
|
20
|
+
hint: "Use workspace-relative paths such as figures/charts/x.vl.json.",
|
|
21
|
+
});
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
return findings;
|
|
27
|
+
}
|
|
28
|
+
/** G7 (path-leak part of HYG-001): no absolute local paths in the brief or the chapters. */
|
|
29
|
+
export function checkHygiene(project) {
|
|
30
|
+
const findings = [];
|
|
31
|
+
if (project.briefText !== undefined)
|
|
32
|
+
findings.push(...scan("thesis.yaml", project.briefText));
|
|
33
|
+
for (const chapter of project.chapters)
|
|
34
|
+
findings.push(...scan(chapter.path, chapter.content));
|
|
35
|
+
return findings;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=hygiene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hygiene.js","sourceRoot":"","sources":["../../src/checks/hygiene.ts"],"names":[],"mappings":"AAGA,+EAA+E;AAC/E,MAAM,YAAY,GAAG;IACnB,sFAAsF;IACtF,+CAA+C;IAC/C,iFAAiF;CAClF,CAAC;AAEF,SAAS,IAAI,CAAC,IAAY,EAAE,IAAY;IACtC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC1C,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;YACnC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;YACtB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,IAAI;oBACV,QAAQ,EAAE,OAAO;oBACjB,IAAI;oBACJ,IAAI,EAAE,KAAK,GAAG,CAAC;oBACf,OAAO,EAAE,iEAAiE;oBAC1E,IAAI,EAAE,gEAAgE;iBACvE,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,YAAY,CAAC,OAAsB;IACjD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9F,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9F,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type CheckReport, type Finding, type Gate } from "../types.js";
|
|
2
|
+
import type { LoadedProject } from "./project.js";
|
|
3
|
+
export { type LoadedProject, type LoadProjectOptions, loadProject } from "./project.js";
|
|
4
|
+
/** Each check is a pure function over the loaded project. */
|
|
5
|
+
export interface CheckDefinition {
|
|
6
|
+
id: string;
|
|
7
|
+
gate: Gate;
|
|
8
|
+
run(project: LoadedProject): Finding[];
|
|
9
|
+
}
|
|
10
|
+
export declare const checkRegistry: readonly CheckDefinition[];
|
|
11
|
+
export declare function parseGates(values: readonly string[]): Gate[];
|
|
12
|
+
export interface RunOptions {
|
|
13
|
+
gates?: readonly Gate[];
|
|
14
|
+
now?: () => Date;
|
|
15
|
+
/** Keep only the findings of one section (and the files of it), as `thesis_check` offers. */
|
|
16
|
+
section?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function runChecks(project: LoadedProject, options?: RunOptions): CheckReport;
|
|
19
|
+
/** Plain-text rendering shared by the command, the tool summary and the CLI. */
|
|
20
|
+
export declare function formatReport(report: CheckReport): string;
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,KAAK,IAAI,EAAS,MAAM,aAAa,CAAC;AAkB/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlD,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAExF,6DAA6D;AAC7D,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CAAC;CACxC;AAED,eAAO,MAAM,aAAa,EAAE,SAAS,eAAe,EAsBnD,CAAC;AAEF,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,EAAE,CAU5D;AAKD,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,6FAA6F;IAC7F,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,GAAE,UAAe,GAAG,WAAW,CAsCvF;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAaxD"}
|