clearotron 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +105 -0
- package/CONTRIBUTING.md +3 -3
- package/INSTALL.md +57 -52
- package/README.md +2 -1
- package/bin/brandowner.mjs +1 -1
- package/bin/clearotron.mjs +4 -4
- package/bin/connect.mjs +2 -2
- package/bin/example.mjs +114 -37
- package/bin/grant.mjs +3 -3
- package/bin/key.mjs +1 -1
- package/bin/onboard.mjs +97 -119
- package/bin/start.mjs +29 -25
- package/bin/stop.mjs +65 -3
- package/bin/update.mjs +7 -7
- package/bin/uspto-sync.mjs +1 -1
- package/build-info.json +2 -2
- package/docs/DELIVERY.md +6 -2
- package/docs/RELEASES.md +6 -4
- package/docs/architecture/01-product-overview.md +2 -2
- package/docs/architecture/02-architecture.md +2 -2
- package/docs/architecture/04-configuration-reference.md +7 -4
- package/docs/architecture/05-config-governance.md +38 -5
- package/docs/architecture/06-operations-runbook.md +13 -1
- package/docs/architecture/09-security-and-data.md +1 -1
- package/docs/decisions/0004-documentation-structure.md +1 -1
- package/driver/CHANGELOG.md +95 -1
- package/driver/README.md +2 -2
- package/driver/ask-ledger.mjs +72 -4
- package/driver/authority-trees.mjs +1 -1
- package/driver/call-capture.mjs +1 -1
- package/driver/card-frame.mjs +1 -1
- package/driver/case-law-ledger.mjs +1 -1
- package/driver/claim-liveness.mjs +1 -1
- package/driver/common-law-receipts.mjs +1 -1
- package/driver/commonlaw-carry.mjs +1 -1
- package/driver/config-inventory.mjs +1 -1
- package/driver/connotation-search.mjs +12 -12
- package/driver/contract-audit.mjs +5 -5
- package/driver/contract-dictation-registry.mjs +4 -4
- package/driver/contract-dictation.mjs +2 -2
- package/driver/contract-e3-backlog.mjs +6 -6
- package/driver/contract-vocabulary.mjs +3 -3
- package/driver/corrections-feedforward.mjs +1 -1
- package/driver/coverage-form-io.mjs +2 -2
- package/driver/coverage-form.mjs +4 -4
- package/driver/coverage-ledger.mjs +3 -3
- package/driver/coverage-union.mjs +1 -1
- package/driver/declination-call.mjs +35 -3
- package/driver/declination-duty.mjs +1 -1
- package/driver/deliver-trigger.sh +3 -3
- package/driver/deploy-live-run-guard.mjs +6 -2
- package/driver/dev-portal.mjs +1 -1
- package/driver/disposition-call.mjs +4 -4
- package/driver/disposition-tool.mjs +4 -4
- package/driver/disposition-union.mjs +2 -2
- package/driver/doc-constants.mjs +1 -1
- package/driver/door-gates.mjs +2 -2
- package/driver/doubt-selection.mjs +2 -2
- package/driver/drainer-identity.mjs +1 -1
- package/driver/driver.config.mjs +63 -11
- package/driver/e2e-rounds.mjs +2 -2
- package/driver/effort-model.mjs +2 -2
- package/driver/engine/anthropic-agent.mjs +24 -24
- package/driver/engine/auth.mjs +1 -1
- package/driver/engine/common.mjs +1 -1
- package/driver/engine/deny-authority-write.mjs +1 -1
- package/driver/engine/jx-turn.mjs +1 -1
- package/driver/engine/mcp/clarivate-server.mjs +1 -1
- package/driver/engine/mcp/corsearch-server.mjs +1 -1
- package/driver/engine/mcp/declination-server.mjs +1 -1
- package/driver/engine/mcp/dispositions-server.mjs +1 -1
- package/driver/engine/mcp/euipo-server.mjs +1 -1
- package/driver/engine/mcp/fetch-server.mjs +1 -1
- package/driver/engine/mcp/free-tier-server.mjs +2 -2
- package/driver/engine/mcp/gather-config.mjs +11 -11
- package/driver/engine/mcp/perplexity-server.mjs +1 -1
- package/driver/engine/mcp/recording-server.mjs +8 -4
- package/driver/engine/mcp/signa-server.mjs +1 -1
- package/driver/engine/mcp/uspto-local-server.mjs +1 -1
- package/driver/engine/openai-agent.mjs +2 -2
- package/driver/engine-build.mjs +2 -2
- package/driver/enqueue-schema.mjs +2 -2
- package/driver/enqueue.mjs +1 -1
- package/driver/envelope-settle.mjs +1 -1
- package/driver/evidence-claim-invariant.mjs +2 -2
- package/driver/findings-model.mjs +8 -8
- package/driver/floor-duty.mjs +1 -1
- package/driver/form-neighbourhood.mjs +1 -1
- package/driver/framework.mjs +1 -1
- package/driver/gateway.mjs +28 -23
- package/driver/grounds-grammar.mjs +1 -1
- package/driver/hit-list.mjs +1 -1
- package/driver/jurisdiction-systems.mjs +1 -1
- package/driver/jx-lanes.mjs +1 -1
- package/driver/jx-units.mjs +1 -1
- package/driver/jx.mjs +3 -3
- package/driver/knockout-assess-record.mjs +5 -1
- package/driver/narrative-refutation-record.mjs +3 -3
- package/driver/numeric-setting.mjs +1 -1
- package/driver/owner-use-check.mjs +184 -0
- package/driver/package.json +2 -2
- package/driver/phase0.mjs +1 -1
- package/driver/pipeline-knockout.mjs +52 -4
- package/driver/pipeline.mjs +215 -63
- package/driver/placement-diff.mjs +2 -2
- package/driver/placement-form.mjs +4 -4
- package/driver/placement-union.mjs +1 -1
- package/driver/portal-acks.mjs +1 -1
- package/driver/portal-config-view.mjs +2 -2
- package/driver/portal-local-auth.mjs +1 -1
- package/driver/portal-report.mjs +6 -6
- package/driver/portal-service.mjs +15 -15
- package/driver/predelivery-lint.mjs +29 -11
- package/driver/prelim-variants-record.mjs +2 -2
- package/driver/profile-page.html +1 -1
- package/driver/profile-selection.mjs +1 -1
- package/driver/profile-service.mjs +2 -2
- package/driver/profiles.mjs +1 -1
- package/driver/progress.mjs +6 -6
- package/driver/provider-usage.mjs +1 -1
- package/driver/publish/demo-marking.mjs +1 -1
- package/driver/publish/index.mjs +47 -6
- package/driver/publish/knockout.mjs +36 -14
- package/driver/publish/parse.mjs +4 -4
- package/driver/publish/publish-inputs.mjs +2 -2
- package/driver/publish/register-presence.mjs +1 -1
- package/driver/publish/render-knockout.mjs +198 -31
- package/driver/publish/report-data.mjs +13 -3
- package/driver/publish/seed-pool.mjs +24 -9
- package/driver/queue-watch-probe.mjs +1 -1
- package/driver/queue-watch-verdict.mjs +1 -1
- package/driver/recall-reconciliation.mjs +1 -1
- package/driver/recipe-service.mjs +1 -1
- package/driver/record-carry.mjs +141 -2
- package/driver/recording-agreement.mjs +3 -3
- package/driver/reference-score.mjs +59 -9
- package/driver/reference-strip-signatures.mjs +68 -0
- package/driver/refusal-bound.mjs +3 -3
- package/driver/register-availability.mjs +2 -2
- package/driver/register-count.mjs +1 -1
- package/driver/register-digest-record.mjs +31 -1
- package/driver/register-grant-vocabulary.mjs +2 -2
- package/driver/register-plan.mjs +8 -8
- package/driver/register-records.mjs +2 -2
- package/driver/registry-fidelity.mjs +3 -3
- package/driver/remedy-accounting.mjs +1 -1
- package/driver/repair-composers.mjs +2 -2
- package/driver/repair-digest.mjs +3 -3
- package/driver/repairs.mjs +7 -7
- package/driver/replay-archive.mjs +2 -0
- package/driver/report-card-record.mjs +2 -2
- package/driver/result-noun-fields.mjs +10 -3
- package/driver/run-economics.mjs +2 -2
- package/driver/run-integrity.mjs +1 -1
- package/driver/runner.mjs +22 -22
- package/driver/scope-rules.mjs +1 -1
- package/driver/search-policy.mjs +3 -3
- package/driver/skeptic-search.mjs +1 -1
- package/driver/skills/blind-frame/SKILL.md +1 -1
- package/driver/skills/case-law-citation/SKILL.md +2 -2
- package/driver/skills/knockout-assess/SKILL.md +10 -4
- package/driver/skills/prelim-search/SKILL.md +2 -2
- package/driver/skills/prelim-search/template-formatting.md +1 -1
- package/driver/skills/prelim-search/templates/email/generic.md +1 -1
- package/driver/skills/prelim-search/worked-examples.md +1 -1
- package/driver/skills/prelim-variants/SKILL.md +2 -2
- package/driver/stage-context.mjs +1 -1
- package/driver/stages-knockout.mjs +55 -4
- package/driver/stages.mjs +97 -40
- package/driver/stray-artifacts.mjs +2 -2
- package/driver/suite-census.json +188 -44
- package/driver/synthesis-record.mjs +1 -1
- package/driver/systemd/clearotron-client-mcp.service +1 -1
- package/driver/systemd/clearotron-portal.service +1 -1
- package/driver/systemd/render-units.mjs +1 -1
- package/driver/tokens.mjs +1 -1
- package/driver/tool-calls.mjs +1 -1
- package/driver/turnaround-bands.mjs +1 -1
- package/driver/unit-file-drift.mjs +1 -1
- package/driver/unit-inventory.mjs +121 -61
- package/driver/unit-state-verdict.mjs +20 -12
- package/driver/verify-knockout.mjs +10 -2
- package/driver/verify.mjs +14 -14
- package/driver/whatif-memo-run.mjs +46 -5
- package/driver/whatif-queue.mjs +1 -1
- package/driver/whatif-worker.mjs +1 -1
- package/mcp-server/CHANGELOG.md +12 -0
- package/mcp-server/README.md +3 -3
- package/mcp-server/http-server.mjs +44 -1
- package/mcp-server/key-socket.mjs +184 -0
- package/mcp-server/lib/audit-view.mjs +69 -2
- package/mcp-server/lib/brief.mjs +15 -0
- package/mcp-server/lib/driver.mjs +7 -1
- package/mcp-server/lib/events.mjs +1 -1
- package/mcp-server/lib/http-handler.mjs +1 -1
- package/mcp-server/lib/knockout.mjs +435 -0
- package/mcp-server/lib/ops.mjs +4 -4
- package/mcp-server/lib/options.mjs +1 -1
- package/mcp-server/lib/plan.mjs +1 -1
- package/mcp-server/lib/runs.mjs +1 -1
- package/mcp-server/lib/scrub.mjs +1 -1
- package/mcp-server/lib/whatif.mjs +12 -3
- package/mcp-server/mint-token.mjs +1 -1
- package/mcp-server/package.json +2 -2
- package/mcp-server/server.mjs +76 -11
- package/package.json +3 -3
- package/portal-ui/package.json +1 -1
- package/providers/_shared/enumerate.mjs +1 -1
- package/providers/_shared/ledger-path.mjs +3 -3
- package/providers/_shared/ledger.mjs +1 -1
- package/providers/_shared/result-shape.mjs +3 -3
- package/providers/_shared/term-shape.mjs +1 -1
- package/providers/corsearch/src/core.js +1 -1
- package/providers/jx-subclass/BUILDING.md +1 -1
- package/providers/oauth-mcp-bridge/CHANGELOG.md +12 -0
- package/providers/oauth-mcp-bridge/package.json +1 -1
- package/providers/oauth-mcp-bridge/stdin-guard.mjs +2 -2
- package/scripts/README.md +1 -1
- package/scripts/added-reference-check.mjs +29 -1
- package/scripts/ai-page-render-check.mjs +2 -1
- package/scripts/authority-boundary-probe.mjs +1 -1
- package/scripts/backfill-started-at.mjs +1 -1
- package/scripts/citation-line-check.mjs +3 -3
- package/scripts/clearances-render-check.mjs +4 -3
- package/scripts/compare.mjs +2 -2
- package/scripts/composer-render-check.mjs +6 -6
- package/scripts/contract-dictation-scan.mjs +2 -2
- package/scripts/dead-names.mjs +1 -1
- package/scripts/drain-preflight.mjs +5 -5
- package/scripts/e2e-unread-terminals.mjs +1 -1
- package/scripts/e2e.mjs +8 -8
- package/scripts/env-audit.mjs +27 -7
- package/scripts/env-classify.mjs +139 -15
- package/scripts/freeze-example-run.mjs +3 -3
- package/scripts/head-arrived-gated.mjs +1 -1
- package/scripts/headless-page.mjs +274 -0
- package/scripts/home-render-check.mjs +3 -2
- package/scripts/live-surface-check.mjs +92 -19
- package/scripts/main-health.mjs +1 -1
- package/scripts/merge-presence-check.mjs +3 -3
- package/scripts/mint-reference-strip-backlog.mjs +41 -0
- package/scripts/mint-suite-census.mjs +6 -6
- package/scripts/nightly-notice.mjs +1 -1
- package/scripts/portal-lifecycle-check.mjs +3 -3
- package/scripts/reconcile-runs.mjs +1 -1
- package/scripts/release-await-cut.mjs +101 -11
- package/scripts/release-version-pr-checks.mjs +26 -2
- package/scripts/release-version.mjs +2 -2
- package/scripts/render-check.mjs +66 -7
- package/scripts/report-frame-check.mjs +12 -0
- package/scripts/report-screenshot.mjs +62 -2
- package/scripts/revisit-render-check.mjs +3 -2
- package/scripts/score.mjs +18 -4
- package/scripts/strip-tracker-citations.mjs +116 -0
- package/scripts/test-run.mjs +3 -3
- package/scripts/third-party-notices.mjs +3 -3
- package/scripts/travelling-predicates.mjs +3 -3
- package/scripts/unexecuted-asserts.mjs +2 -2
- package/scripts/verify-publishable.mjs +2 -2
- package/scripts/write-up-form-census.mjs +1 -1
- package/shared/access-audience.mjs +215 -0
- package/shared/brand.mjs +13 -13
- package/shared/citation-scan.mjs +1 -1
- package/shared/client-door.mjs +7 -7
- package/shared/driver-dir.mjs +1 -1
- package/shared/env-aliases.mjs +0 -48
- package/shared/env-local.mjs +1 -1
- package/shared/identifier-scan.mjs +3 -3
- package/shared/invocation.mjs +1 -1
- package/shared/names-in-force.mjs +2 -0
- package/shared/product-owned-names.mjs +1 -1
- package/shared/register-selection.mjs +1 -1
- package/shared/scope.mjs +5 -5
- package/shared/server-units.mjs +4 -4
- package/shared/store-in-repo.mjs +2 -2
- package/shared/suite-census.mjs +4 -4
- package/shared/tracked-files.mjs +31 -0
- package/shared/tty-style.mjs +1 -1
- package/shared/uspto-index-size.mjs +1 -1
- package/shared/vacuous-pass.mjs +1 -1
- package/skills/clearotron-account/SKILL.md +42 -13
- package/driver/systemd/prelim-driver.path +0 -69
- package/driver/systemd/prelim-driver.service +0 -86
- package/driver/systemd/prelim-driver.timer +0 -14
- package/driver/systemd/prelim-outbox.path +0 -27
- package/driver/systemd/prelim-outbox.service +0 -37
- package/driver/systemd/prelim-outbox.timer +0 -21
- package/node_modules/exceljs/README_zh.md +0 -2878
- package/node_modules/exceljs/dist/LICENSE +0 -22
- package/node_modules/exceljs/dist/es5/csv/csv.js +0 -182
- package/node_modules/exceljs/dist/es5/csv/csv.js.map +0 -1
- package/node_modules/exceljs/dist/es5/csv/line-buffer.js +0 -68
- package/node_modules/exceljs/dist/es5/csv/line-buffer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/csv/stream-converter.js +0 -110
- package/node_modules/exceljs/dist/es5/csv/stream-converter.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/anchor.js +0 -73
- package/node_modules/exceljs/dist/es5/doc/anchor.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/cell.js +0 -961
- package/node_modules/exceljs/dist/es5/doc/cell.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/column.js +0 -274
- package/node_modules/exceljs/dist/es5/doc/column.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/data-validations.js +0 -18
- package/node_modules/exceljs/dist/es5/doc/data-validations.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/defined-names.js +0 -173
- package/node_modules/exceljs/dist/es5/doc/defined-names.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/enums.js +0 -49
- package/node_modules/exceljs/dist/es5/doc/enums.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/image.js +0 -69
- package/node_modules/exceljs/dist/es5/doc/image.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/modelcontainer.js +0 -16
- package/node_modules/exceljs/dist/es5/doc/modelcontainer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/note.js +0 -64
- package/node_modules/exceljs/dist/es5/doc/note.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/range.js +0 -229
- package/node_modules/exceljs/dist/es5/doc/range.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/row.js +0 -382
- package/node_modules/exceljs/dist/es5/doc/row.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/table.js +0 -443
- package/node_modules/exceljs/dist/es5/doc/table.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/workbook.js +0 -202
- package/node_modules/exceljs/dist/es5/doc/workbook.js.map +0 -1
- package/node_modules/exceljs/dist/es5/doc/worksheet.js +0 -900
- package/node_modules/exceljs/dist/es5/doc/worksheet.js.map +0 -1
- package/node_modules/exceljs/dist/es5/exceljs.bare.js +0 -14
- package/node_modules/exceljs/dist/es5/exceljs.bare.js.map +0 -1
- package/node_modules/exceljs/dist/es5/exceljs.browser.js +0 -36
- package/node_modules/exceljs/dist/es5/exceljs.browser.js.map +0 -1
- package/node_modules/exceljs/dist/es5/exceljs.nodejs.js +0 -15
- package/node_modules/exceljs/dist/es5/exceljs.nodejs.js.map +0 -1
- package/node_modules/exceljs/dist/es5/index.js +0 -15
- package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js +0 -90
- package/node_modules/exceljs/dist/es5/stream/xlsx/hyperlink-reader.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js +0 -94
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-comments-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js +0 -94
- package/node_modules/exceljs/dist/es5/stream/xlsx/sheet-rels-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js +0 -362
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-reader.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js +0 -347
- package/node_modules/exceljs/dist/es5/stream/xlsx/workbook-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js +0 -392
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-reader.js.map +0 -1
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js +0 -652
- package/node_modules/exceljs/dist/es5/stream/xlsx/worksheet-writer.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/auto-drain.js +0 -18
- package/node_modules/exceljs/dist/es5/utils/auto-drain.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js +0 -15
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-decode.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js +0 -18
- package/node_modules/exceljs/dist/es5/utils/browser-buffer-encode.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/cell-matrix.js +0 -149
- package/node_modules/exceljs/dist/es5/utils/cell-matrix.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/col-cache.js +0 -258
- package/node_modules/exceljs/dist/es5/utils/col-cache.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/copy-style.js +0 -43
- package/node_modules/exceljs/dist/es5/utils/copy-style.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/encryptor.js +0 -58
- package/node_modules/exceljs/dist/es5/utils/encryptor.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/iterate-stream.js +0 -46
- package/node_modules/exceljs/dist/es5/utils/iterate-stream.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/parse-sax.js +0 -47
- package/node_modules/exceljs/dist/es5/utils/parse-sax.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/shared-formula.js +0 -42
- package/node_modules/exceljs/dist/es5/utils/shared-formula.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/shared-strings.js +0 -32
- package/node_modules/exceljs/dist/es5/utils/shared-strings.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/stream-base64.js +0 -66
- package/node_modules/exceljs/dist/es5/utils/stream-base64.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/stream-buf.js +0 -343
- package/node_modules/exceljs/dist/es5/utils/stream-buf.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/string-buf.js +0 -73
- package/node_modules/exceljs/dist/es5/utils/string-buf.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/string-builder.js +0 -32
- package/node_modules/exceljs/dist/es5/utils/string-builder.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js +0 -61
- package/node_modules/exceljs/dist/es5/utils/stuttered-pipe.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/typed-stack.js +0 -23
- package/node_modules/exceljs/dist/es5/utils/typed-stack.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/under-dash.js +0 -168
- package/node_modules/exceljs/dist/es5/utils/under-dash.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/utils.js +0 -171
- package/node_modules/exceljs/dist/es5/utils/utils.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/xml-stream.js +0 -151
- package/node_modules/exceljs/dist/es5/utils/xml-stream.js.map +0 -1
- package/node_modules/exceljs/dist/es5/utils/zip-stream.js +0 -79
- package/node_modules/exceljs/dist/es5/utils/zip-stream.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js +0 -230
- package/node_modules/exceljs/dist/es5/xlsx/defaultnumformats.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/rel-type.js +0 -18
- package/node_modules/exceljs/dist/es5/xlsx/rel-type.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js +0 -139
- package/node_modules/exceljs/dist/es5/xlsx/xform/base-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js +0 -85
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/defined-name-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/sheet-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js +0 -24
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js +0 -27
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js +0 -51
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-view-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js +0 -234
- package/node_modules/exceljs/dist/es5/xlsx/xform/book/workbook-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js +0 -103
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comment-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js +0 -76
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/comments-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js +0 -35
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-position-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js +0 -53
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js +0 -97
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-client-data-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js +0 -107
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-notes-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js +0 -92
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-shape-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js +0 -61
- package/node_modules/exceljs/dist/es5/xlsx/xform/comment/vml-textbox-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js +0 -51
- package/node_modules/exceljs/dist/es5/xlsx/xform/composite-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js +0 -30
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js +0 -27
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js +0 -93
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/app-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js +0 -112
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/content-types-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js +0 -158
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/core-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js +0 -23
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationship-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js +0 -65
- package/node_modules/exceljs/dist/es5/xlsx/xform/core/relationships-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js +0 -47
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js +0 -61
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-fill-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/blip-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js +0 -35
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js +0 -62
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js +0 -82
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/cell-position-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js +0 -98
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/drawing-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-lst-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/hlink-click-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js +0 -59
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js +0 -63
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js +0 -67
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/pic-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js +0 -30
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/sp-pr.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js +0 -62
- package/node_modules/exceljs/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js +0 -91
- package/node_modules/exceljs/dist/es5/xlsx/xform/list-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/auto-filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js +0 -451
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cell-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js +0 -275
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js +0 -25
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js +0 -45
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js +0 -77
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js +0 -42
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/databar-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +0 -71
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js +0 -22
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/formula-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js +0 -43
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +0 -28
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +0 -88
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +0 -38
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +0 -52
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +0 -43
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +0 -75
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js +0 -22
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +0 -66
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +0 -22
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js +0 -78
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/col-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js +0 -247
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/data-validations-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js +0 -28
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/dimension-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/drawing-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js +0 -69
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/ext-lst-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js +0 -126
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/header-footer-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js +0 -50
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/hyperlink-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js +0 -26
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merge-cell-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js +0 -52
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/merges.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js +0 -35
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/outline-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js +0 -24
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-breaks-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js +0 -46
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-margins-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js +0 -99
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/page-setup-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/picture-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js +0 -45
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/print-options-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js +0 -37
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-breaks-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js +0 -128
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/row-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js +0 -51
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js +0 -83
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js +0 -84
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js +0 -190
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/sheet-view-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js +0 -32
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/table-part-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js +0 -513
- package/node_modules/exceljs/dist/es5/xlsx/xform/sheet/worksheet-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js +0 -27
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/boolean-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js +0 -58
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/date-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js +0 -47
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/float-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js +0 -53
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/integer-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js +0 -47
- package/node_modules/exceljs/dist/es5/xlsx/xform/simple/string-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js +0 -61
- package/node_modules/exceljs/dist/es5/xlsx/xform/static-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js +0 -98
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/phonetic-text-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js +0 -92
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/rich-text-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js +0 -99
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-string-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js +0 -114
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/shared-strings-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js +0 -39
- package/node_modules/exceljs/dist/es5/xlsx/xform/strings/text-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js +0 -139
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/alignment-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js +0 -185
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/border-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js +0 -66
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/color-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js +0 -106
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/dxf-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js +0 -308
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/fill-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js +0 -175
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/font-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js +0 -59
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/numfmt-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js +0 -53
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/protection-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js +0 -118
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/style-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js +0 -612
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/styles-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js +0 -46
- package/node_modules/exceljs/dist/es5/xlsx/xform/style/underline-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js +0 -75
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/auto-filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js +0 -30
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/custom-filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js +0 -89
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-column-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js +0 -28
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/filter-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js +0 -42
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-column-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js +0 -40
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-style-info-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js +0 -123
- package/node_modules/exceljs/dist/es5/xlsx/xform/table/table-xform.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xlsx.js +0 -697
- package/node_modules/exceljs/dist/es5/xlsx/xlsx.js.map +0 -1
- package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js +0 -5
- package/node_modules/exceljs/dist/es5/xlsx/xml/theme1.js.map +0 -1
- package/node_modules/exceljs/dist/exceljs.bare.js +0 -55253
- package/node_modules/exceljs/dist/exceljs.bare.js.map +0 -761
- package/node_modules/exceljs/dist/exceljs.bare.min.js +0 -45
- package/node_modules/exceljs/dist/exceljs.bare.min.js.map +0 -1
- package/node_modules/exceljs/dist/exceljs.js +0 -59900
- package/node_modules/exceljs/dist/exceljs.js.map +0 -1083
- package/node_modules/exceljs/dist/exceljs.min.js +0 -45
- package/node_modules/exceljs/dist/exceljs.min.js.map +0 -1
- package/scripts/deploy-test.sh +0 -309
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
// Copyright 2026 Cordillera Sàrl. Additional terms under section 7 of the AGPL-3.0 apply — see ADDITIONAL-TERMS.md
|
|
4
|
+
//
|
|
5
|
+
// Removes the internal citation OPENER from comments and prose in the tree (tracker issue 309).
|
|
6
|
+
//
|
|
7
|
+
// The form is `tracker issue NNN — ` standing at the head of a sentence, where the citation is not part
|
|
8
|
+
// of what the sentence says but a label in front of it. Stripping the opener leaves the sentence intact:
|
|
9
|
+
//
|
|
10
|
+
// // tracker issue 1149 — the walk must start at the repository root
|
|
11
|
+
// // the walk must start at the repository root
|
|
12
|
+
//
|
|
13
|
+
// assert.ok(x, "Refs tracker issue 2075 — an absent file is a finding")
|
|
14
|
+
// assert.ok(x, "an absent file is a finding")
|
|
15
|
+
//
|
|
16
|
+
// WHY THE PATTERN LOOKS OVER-SPECIFIED. Three parts of it are load-bearing and each was measured, not
|
|
17
|
+
// reasoned:
|
|
18
|
+
//
|
|
19
|
+
// · THE CAPTURE GROUP. The match begins at the line opener — a comment leader, a quote, a bracket —
|
|
20
|
+
// and the replacement is `$1`, which puts that opener back. Without the group the sweep deletes the
|
|
21
|
+
// opening quote of every test name it touches, and a broken string literal is a syntax error in the
|
|
22
|
+
// lucky cases and a changed assertion in the unlucky ones.
|
|
23
|
+
// · `\s+` AFTER THE SEPARATOR, never `\s*`. `tracker issue 1149-12` is an ITEM suffix, not a citation
|
|
24
|
+
// followed by prose: there is no space after its hyphen. `\s*` eats the item number.
|
|
25
|
+
// · THE `i` FLAG. `Refs tracker issue NNN` is capitalised at the head of a commit-style line and is a
|
|
26
|
+
// fifth of the corpus.
|
|
27
|
+
//
|
|
28
|
+
// WHAT IT WILL NOT TOUCH, and both exclusions are BY NAME rather than by pattern, because a pattern that
|
|
29
|
+
// could recognise them could also stop recognising them:
|
|
30
|
+
//
|
|
31
|
+
// · THE FILES THAT USE A CITATION AS TEST DATA. Three tests feed a citation to the guard that refuses
|
|
32
|
+
// citations and assert what comes back. A sweep that rewrites their fixtures edits the corpus the
|
|
33
|
+
// guard is checked against, and the guard then passes on something it has stopped checking. That is
|
|
34
|
+
// a green tick bought by deleting the question.
|
|
35
|
+
// · THE FROZEN RENDERER. `driver/publish/render.mjs` is pinned at a content hash. Changing it reds its
|
|
36
|
+
// freeze check, and the repair of a sentence is not worth spending a freeze on; touching it needs an
|
|
37
|
+
// entry in the break ledger, which is a decision and not a sweep.
|
|
38
|
+
//
|
|
39
|
+
// USAGE
|
|
40
|
+
//
|
|
41
|
+
// node scripts/strip-tracker-citations.mjs # report only: per-class counts + hand-off list
|
|
42
|
+
// node scripts/strip-tracker-citations.mjs --apply # rewrite the mechanical cases
|
|
43
|
+
//
|
|
44
|
+
// The report is the default because the hand-off list is the point: the lines this cannot do are the
|
|
45
|
+
// ones a person has to read, and a sweep that rewrote first would bury them.
|
|
46
|
+
//
|
|
47
|
+
// THIS COUNTS EVERY LINE CARRYING THE FORM, including lines another stripper would also catch. That is
|
|
48
|
+
// deliberate and it is why this number will not match the reference-strip backlog's. A sweep STRIPS; a
|
|
49
|
+
// backlog SELECTS. Overlapping strippers cost nothing and a missed line ships a citation into a public
|
|
50
|
+
// tree, so the population here is the whole corpus rather than the residue left after other rules have
|
|
51
|
+
// taken their share. Reconciling the two numbers is a category error: they answer different questions.
|
|
52
|
+
//
|
|
53
|
+
// A NOTE ON THE OTHER RESIDUE, because the names invite the confusion. `driver/reference-strip-
|
|
54
|
+
// signatures.mjs` counts a DIFFERENT thing — sentences the earlier strip left unfinished, `'s` with
|
|
55
|
+
// nothing to possess and a dangling `pre- `. That is damage: a defect whether or not anyone rules on
|
|
56
|
+
// citations, with a floor that should fall to zero as sentences are repaired. This file's subject is
|
|
57
|
+
// intact text that a ruling removes, whose population goes to zero the day the sweep runs and then
|
|
58
|
+
// wants a guard against reintroduction rather than a backlog. Different residue, different repair.
|
|
59
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
60
|
+
import { execFileSync } from "node:child_process";
|
|
61
|
+
import { join, dirname } from "node:path";
|
|
62
|
+
import { fileURLToPath } from "node:url";
|
|
63
|
+
|
|
64
|
+
const ROOT = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
65
|
+
const APPLY = process.argv.includes("--apply");
|
|
66
|
+
|
|
67
|
+
// The mechanical case: a citation standing in front of a sentence, with the opener captured so it
|
|
68
|
+
// survives the replacement.
|
|
69
|
+
export const OPENER = /((?:^|["'`(\[]|\/\/|\/\*|#|\*|·|──)\s*)(?:refs\s+)?tracker issues?\s+\d+\s*[—:–-]\s+/i;
|
|
70
|
+
|
|
71
|
+
// Any remaining citation, mechanical or not. The difference between this count and the opener count is
|
|
72
|
+
// the hand-off: a citation inside a sentence cannot be removed without rewriting the sentence around it.
|
|
73
|
+
export const ANY_CITATION = /\btracker issues?\s+\d+/i;
|
|
74
|
+
|
|
75
|
+
export const EXCLUDED = [
|
|
76
|
+
// Citations used as literal test DATA — the corpus the citation guard is checked against.
|
|
77
|
+
"driver/test/a-bare-reference-added-in-a-diff-is-refused.test.mjs",
|
|
78
|
+
"driver/test/prompt-payload-names-no-tracker-issue.test.mjs",
|
|
79
|
+
"driver/test/euipo-environment-doctrine.test.mjs",
|
|
80
|
+
// Pinned at a content hash; a prose repair is not worth spending a freeze on.
|
|
81
|
+
"driver/publish/render.mjs",
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
export const isScannable = (f) =>
|
|
85
|
+
/\.(mjs|md|yml|ts|js|json)$/.test(f) && !f.startsWith("portal-ui/dist/") && !EXCLUDED.includes(f);
|
|
86
|
+
|
|
87
|
+
/** Per-file classification. PURE, and `read` is injected so an arm can drive it over a synthetic tree. */
|
|
88
|
+
export function surveyOf(files, read) {
|
|
89
|
+
const stripped = {}, handoff = [];
|
|
90
|
+
let strippedTotal = 0, remainingTotal = 0;
|
|
91
|
+
for (const f of files.filter(isScannable)) {
|
|
92
|
+
let text;
|
|
93
|
+
try { text = read(f); } catch { continue; }
|
|
94
|
+
let n = 0;
|
|
95
|
+
const out = text.split("\n").map((line, i) => {
|
|
96
|
+
if (OPENER.test(line)) { n++; return line.replace(OPENER, "$1"); }
|
|
97
|
+
if (ANY_CITATION.test(line)) handoff.push({ file: f, line: i + 1, text: line.trim() });
|
|
98
|
+
return line;
|
|
99
|
+
});
|
|
100
|
+
if (n) { stripped[f] = n; strippedTotal += n; }
|
|
101
|
+
remainingTotal += out.filter((l) => ANY_CITATION.test(l)).length;
|
|
102
|
+
if (APPLY && n) writeFileSync(join(ROOT, f), out.join("\n"));
|
|
103
|
+
}
|
|
104
|
+
return { strippedTotal, remainingTotal, stripped, handoff };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
108
|
+
const tracked = execFileSync("git", ["-C", ROOT, "ls-files"], { encoding: "utf8", maxBuffer: 1 << 28 })
|
|
109
|
+
.split("\n").filter(Boolean);
|
|
110
|
+
const s = surveyOf(tracked, (f) => readFileSync(join(ROOT, f), "utf8"));
|
|
111
|
+
console.log(`${APPLY ? "stripped" : "would strip"} ${s.strippedTotal} opener(s) across ${Object.keys(s.stripped).length} file(s)`);
|
|
112
|
+
console.log(`${s.handoff.length} citation(s) are NOT openers and need a reader — the hand-off list:`);
|
|
113
|
+
for (const h of s.handoff) console.log(` ${h.file}:${h.line} ${h.text.slice(0, 110)}`);
|
|
114
|
+
console.log(`\n${s.remainingTotal} citation(s) would remain after this sweep.`);
|
|
115
|
+
console.log(`excluded by name: ${EXCLUDED.join(", ")}`);
|
|
116
|
+
}
|
package/scripts/test-run.mjs
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
//
|
|
26
26
|
// The second obvious fix is a posttest sweeper matching fixture prefixes with an mtime floor. But agents
|
|
27
27
|
// run these suites CONCURRENTLY — that is how the box filled in the first place — so "delete everything
|
|
28
|
-
// matching
|
|
28
|
+
// matching clearotron-mock-* older than N" can delete another run's live fixtures. Prefix matching cannot
|
|
29
29
|
// distinguish my fixtures from yours.
|
|
30
30
|
//
|
|
31
31
|
// A third option needs neither. os.tmpdir() honours TMPDIR, and every leaking call site is already
|
|
@@ -65,7 +65,7 @@ import { snapshotRepo, repoWrites, explainRepoWrites } from "./repo-writes.mjs";
|
|
|
65
65
|
// CLEAROTRON_DATABASE=clarivate node scripts/test-run.mjs node -e '<print>'
|
|
66
66
|
// -> CLEAROTRON_DATABASE = "corsearch"
|
|
67
67
|
//
|
|
68
|
-
// The operator named a vendor and the suite ran as a different one, in silence. That is
|
|
68
|
+
// The operator named a vendor and the suite ran as a different one, in silence. That is its own
|
|
69
69
|
// sentence — "a default is the one wrong value that never announces itself" — reached through the
|
|
70
70
|
// compatibility window rather than through a code default.
|
|
71
71
|
//
|
|
@@ -286,7 +286,7 @@ if (missingDeps.length) {
|
|
|
286
286
|
process.exit(1);
|
|
287
287
|
}
|
|
288
288
|
|
|
289
|
-
// ── THE SUITE CANNOT READ THE OPERATOR'S CONFIGURATION, IN OR OUT (
|
|
289
|
+
// ── THE SUITE CANNOT READ THE OPERATOR'S CONFIGURATION, IN OR OUT () ──────────────────
|
|
290
290
|
//
|
|
291
291
|
// TWO DIRECTIONS, ONE SEAT. The guard below refuses when a data-plane ROOT escapes; these two stop the
|
|
292
292
|
// suite reading the operator's configuration and stop it writing into their data plane. Same wrapper,
|
|
@@ -171,7 +171,7 @@ function resolveInstalled(root, name, path) {
|
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
/**
|
|
174
|
-
*
|
|
174
|
+
* WHY `npm ls` IS COMPLAINING, WHEN THE ANSWER IS NOT IN THE CODE AT ALL.
|
|
175
175
|
*
|
|
176
176
|
* Adding a `git worktree` and symlinking `node_modules` from another one — the obvious way to skip a
|
|
177
177
|
* five-minute install — makes six licence arms fail in a way that reads exactly like a code defect, on
|
|
@@ -257,7 +257,7 @@ export function collect(root = ROOT, tree = npmTree(root), { linkTarget = defaul
|
|
|
257
257
|
+ "this file has not been looked at:\n " + undeclared.slice(0, 12).join("\n ")
|
|
258
258
|
+ (undeclared.length > 12 ? `\n …and ${undeclared.length - 12} more` : "")
|
|
259
259
|
+ "\n\nFix the tree, or declare it in DECLARED_LS_PROBLEMS with the reason it is allowed."
|
|
260
|
-
//
|
|
260
|
+
// appended, never substituted: a real problem keeps the sentence above.
|
|
261
261
|
+ (foreignTreeNote(root, undeclared, { linkTarget }) ?? ""));
|
|
262
262
|
}
|
|
263
263
|
// ── ONE PACKAGE, SEVERAL NODES, AND ONLY ONE OF THEM CARRIES THE CHILDREN ──────────────────────
|
|
@@ -382,7 +382,7 @@ if (isEntrypoint(import.meta.url)) {
|
|
|
382
382
|
if (!check) { writeFileSync(OUTPUT, next); console.log(`third-party-notices: wrote ${OUTPUT}`); process.exit(0); }
|
|
383
383
|
const now = existsSync(OUTPUT) ? readFileSync(OUTPUT, "utf8") : null;
|
|
384
384
|
if (now === next) { console.log("third-party-notices: THIRD-PARTY-NOTICES.md matches the installed production tree."); process.exit(0); }
|
|
385
|
-
// ──
|
|
385
|
+
// ── THE REFUSAL SAYS HOW TO FIX IT, INCLUDING THE HALF THAT IS FORGOTTEN ──
|
|
386
386
|
//
|
|
387
387
|
// "regenerate with: <script>" was true and insufficient. What reds CI is a PRODUCTION-DEPENDENCY BUMP
|
|
388
388
|
// whose regenerated notices file was not COMMITTED WITH IT, and the committing half is the half that
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
2
|
// Copyright 2026 Cordillera Sàrl. Additional terms under section 7 of the AGPL-3.0 apply — see ADDITIONAL-TERMS.md
|
|
3
3
|
//
|
|
4
|
-
// travelling-predicates.mjs —
|
|
4
|
+
// travelling-predicates.mjs — the candidate population, DISCOVERED rather than recalled.
|
|
5
5
|
//
|
|
6
6
|
// hunts a class: a contract whose two ends measure different things — a demand computed against
|
|
7
7
|
// one unit or snapshot, satisfaction enforced against another, with no guard asserting the two agree.
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
// looked like an assignment, and filed `const push = (row) => { if (!asks.some(…)) … }` as "stored"
|
|
43
43
|
// because the line starts with `const`. That is a proxy validating a proxy. This parses.
|
|
44
44
|
//
|
|
45
|
-
// ── THE SECOND QUESTION: WHERE DOES IT COME TO REST? (
|
|
45
|
+
// ── THE SECOND QUESTION: WHERE DOES IT COME TO REST? (the adjudication set) ──────────────────────
|
|
46
46
|
//
|
|
47
47
|
// "Travelling" is a candidate ceiling and this file has said so since it was written. Ninety-nine
|
|
48
48
|
// candidates is not a population anybody adjudicates one essay at a time, and reading them as ninety-nine
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
//
|
|
60
60
|
// structure written into something that OUTLIVES the expression that computed it — an object field,
|
|
61
61
|
// an assignment, or a local that lands in a returned object. THIS is the class's shape:
|
|
62
|
-
//
|
|
62
|
+
// That `quote_required` was a flag on a form, judged later against candidates that had
|
|
63
63
|
// been rebuilt. A boolean at rest can be met by data that has moved.
|
|
64
64
|
//
|
|
65
65
|
// The three are exhaustive and mechanical, so the sweep's own numbers say how much reading is owed and
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
3
|
// Copyright 2026 Cordillera Sàrl. Additional terms under section 7 of the AGPL-3.0 apply — see ADDITIONAL-TERMS.md
|
|
4
|
-
// unexecuted-asserts.mjs —
|
|
4
|
+
// unexecuted-asserts.mjs — the fifth member: an arm that RAN and asserted nothing.
|
|
5
5
|
//
|
|
6
6
|
// node scripts/unexecuted-asserts.mjs <lcov> # DRY RUN — prints what would change
|
|
7
7
|
// node scripts/unexecuted-asserts.mjs <lcov> --apply # writes it
|
|
@@ -199,7 +199,7 @@ if (isEntrypoint(import.meta.url)) {
|
|
|
199
199
|
// THE REMEDY IS THE WHOLE COMMAND, not a placeholder. Whoever this fires on has probably never heard
|
|
200
200
|
// of CT_COVERAGE_DIR — it is set in ci.yml and nowhere a contributor reads — so `<lcov>` sends them to
|
|
201
201
|
// the workflow file to find out what to substitute. A guard whose remedy has to be looked up is a
|
|
202
|
-
// guard people delete (
|
|
202
|
+
// guard people delete (its own rule, applied to its own error message).
|
|
203
203
|
console.error(`\nCHECK FAILED — ${grew.length} file(s) grew an assert site that never ran.\n\n`
|
|
204
204
|
+ "READ EACH ONE FIRST. An arm that stopped asserting is the defect this exists to find (#1010);\n"
|
|
205
205
|
+ "a new honest branch — a platform check, an else nobody takes here — is re-stamped deliberately:\n\n"
|
|
@@ -49,7 +49,7 @@ const staging = mkdtempSync(join(tmpdir(), "clearotron-verify-"));
|
|
|
49
49
|
// ── CAN THIS RUN ON THE TREE IT IS POINTED AT — tracker issue 196 ───────────────────────────────────
|
|
50
50
|
//
|
|
51
51
|
// THIS SCRIPT WAS INVOKED BY NOTHING for as long as it has existed on the public tree: no workflow, no
|
|
52
|
-
// npm script, every other mention of its name a comment. That is
|
|
52
|
+
// npm script, every other mention of its name a comment. That is the shape — an
|
|
53
53
|
// instrument that exists, has stopped being reachable, and whose silence is indistinguishable from a
|
|
54
54
|
// pass. Five uninstallable releases shipped past it.
|
|
55
55
|
//
|
|
@@ -82,7 +82,7 @@ if (!existsSync(CUT_TABLE)) {
|
|
|
82
82
|
console.error(" dependency, in CI and again at publish. That covers the manifest. It does not type the verbs");
|
|
83
83
|
console.error(" and it does not check the substitution.\n");
|
|
84
84
|
console.error(" To make this runnable, the pack's reconcile step needs either the cut table or a decision that");
|
|
85
|
-
console.error(" it does not need it. That decision is
|
|
85
|
+
console.error(" it does not need it. That decision is stated out of scope and is nobody's yet.");
|
|
86
86
|
process.exit(2);
|
|
87
87
|
}
|
|
88
88
|
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
// 1. UNRESOLVED DEPTH. `depthFor` falls back to full-country depth stamped `default-ungraded` when it
|
|
35
35
|
// cannot resolve a policy, and `writeUpForm` maps every ungraded rung to `full`. A census built on a
|
|
36
36
|
// policy object that does not resolve therefore reports "every product authors every card, the ladder
|
|
37
|
-
// saves nothing" — quotable, and false.
|
|
37
|
+
// saves nothing" — quotable, and false. its own ladder shipped dead for exactly this reason. So
|
|
38
38
|
// the depth row is asserted resolved before a single finding is counted.
|
|
39
39
|
// 2. NO BAND SHAPE. The floor tier joins from `band-shape.json`; absent, every finding reads as holding
|
|
40
40
|
// no floor and the graded products UNDER-count their full cards — erasing the one class the owner
|
|
@@ -71,3 +71,218 @@ export function audienceLabel(aud) {
|
|
|
71
71
|
if (!list.length) return "(none)";
|
|
72
72
|
return list.map((a) => `${String(a).slice(0, 8)}…`).join(",");
|
|
73
73
|
}
|
|
74
|
+
|
|
75
|
+
// ── THE AUDIENCE THE EDGE ISSUES, AS OPPOSED TO THE ONE THIS INSTALL EXPECTS (tracker issue 241) ───
|
|
76
|
+
//
|
|
77
|
+
// Everything above reads LOCAL configuration. What follows reads the EDGE, so `doctor` can compare the
|
|
78
|
+
// two — the half of the recreation trap with no symptom of its own. Deleting and recreating a
|
|
79
|
+
// Cloudflare Access application changes the audience; the existing warning fires on the CHALLENGE being
|
|
80
|
+
// wrong, so on a box where somebody recreated the application and then fixed the sign-in, every layer
|
|
81
|
+
// reads healthy and the stale audience stays invisible until a real request is rejected.
|
|
82
|
+
//
|
|
83
|
+
// ── WHERE THE AUDIENCE IS, AND WHERE IT IS NOT ───────────────────────────────────────────────────
|
|
84
|
+
//
|
|
85
|
+
// Access does not publish it in RFC 8414 discovery metadata. Two investigations looked there, correctly
|
|
86
|
+
// found nothing, and one concluded the route did not exist. It is in the REDIRECT handed to an
|
|
87
|
+
// unauthenticated caller: the login URL carries a `kid` parameter and a `meta` JWT naming the same value.
|
|
88
|
+
//
|
|
89
|
+
// ── THIS DECODES; IT DOES NOT VERIFY, AND THAT IS DELIBERATE ─────────────────────────────────────
|
|
90
|
+
//
|
|
91
|
+
// The meta token is public routing information served to a caller with no credential — its own
|
|
92
|
+
// `auth_status` reads `NONE`. It is not a bearer token and nothing here trusts it: the only thing taken
|
|
93
|
+
// from it is a string, which is then compared against local configuration. Verifying it would mean
|
|
94
|
+
// dragging in the credential path and `jose` with it — which this file's header explains at length that
|
|
95
|
+
// it must not do — to authenticate a document that authenticates nobody, and would invite a later
|
|
96
|
+
// reader to believe a valid signature here meant a request was authorised. It does not.
|
|
97
|
+
//
|
|
98
|
+
// ── AND THE READ IS CROSS-CHECKED AGAINST ITSELF ─────────────────────────────────────────────────
|
|
99
|
+
//
|
|
100
|
+
// The same value arrives two independent ways in one response: the `kid` parameter and the token's own
|
|
101
|
+
// `aud`. Using one when two are there throws away the only free integrity check on the read, and it is
|
|
102
|
+
// the check that would catch this code keying on a field Cloudflare later moves. When they disagree
|
|
103
|
+
// this reports the disagreement rather than picking a winner.
|
|
104
|
+
/** The path that says a hostname is Access-fronted. */
|
|
105
|
+
export const ACCESS_LOGIN_PATH = "/cdn-cgi/access/login/";
|
|
106
|
+
|
|
107
|
+
/** Base64url → utf8, with no exception escaping to the caller as a silent empty string. */
|
|
108
|
+
function decodeSegment(seg) {
|
|
109
|
+
const raw = Buffer.from(String(seg), "base64url").toString("utf8");
|
|
110
|
+
if (!raw) throw new Error("the segment decoded to nothing");
|
|
111
|
+
return raw;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* The audience, read out of the location an unauthenticated request was redirected to.
|
|
116
|
+
*
|
|
117
|
+
* `kind` is the whole answer and every branch has one, because the failures here are NOT
|
|
118
|
+
* interchangeable and the caller must be able to tell them apart:
|
|
119
|
+
*
|
|
120
|
+
* unreachable the edge could not be asked. A could-not-look, never agreement.
|
|
121
|
+
* not-fronted the hostname answered without an Access challenge. Its own verdict, and the
|
|
122
|
+
* single most important one: this check must not be able to SUCCEED by failing to
|
|
123
|
+
* find an edge, which is the exact shape of the defect it exists to catch.
|
|
124
|
+
* unreadable there is a challenge, and the audience could not be read out of it. Also a
|
|
125
|
+
* could-not-look — the shape may have moved, and a moved shape is not agreement.
|
|
126
|
+
* disagree `kid` and the token's `aud` name different audiences.
|
|
127
|
+
* read one audience, agreed by both sources.
|
|
128
|
+
*/
|
|
129
|
+
// The marker an Access-fronted API path puts in `WWW-Authenticate`. Keyed on the RESOURCE-METADATA path
|
|
130
|
+
// rather than on "Bearer", which any OAuth resource anywhere would send — this names Cloudflare Access
|
|
131
|
+
// specifically, and it is the string the real door returns.
|
|
132
|
+
const ACCESS_RESOURCE_RE = /cloudflare-access-protected-resource/i;
|
|
133
|
+
|
|
134
|
+
export function readAudience({ location = "", status = null, error = null, wwwAuthenticate = "", viaEdge = false } = {}) {
|
|
135
|
+
if (error) return { kind: "unreachable", why: String(error?.message ?? error).slice(0, 200) };
|
|
136
|
+
// ── THREE DOORS, NOT ONE (tracker issue 251) ────────────────────────────────────────────────────
|
|
137
|
+
//
|
|
138
|
+
// This returned `not-fronted` for every response with no redirect, and measured against production's
|
|
139
|
+
// four configured hostnames that one label covered three materially different states:
|
|
140
|
+
//
|
|
141
|
+
// trademark.cordillera.ch 302 redirect present → audience read, kid agrees
|
|
142
|
+
// mcp.cordillera.ch/mcp 401 no redirect → not-fronted ← FALSE, it IS fronted
|
|
143
|
+
// clients-mcp.cordillera.ch/mcp 401 no redirect → not-fronted ← FALSE, it IS fronted
|
|
144
|
+
// agent-mcp.cordillera.ch/mcp 502 no redirect → not-fronted ← an origin fault
|
|
145
|
+
//
|
|
146
|
+
// None of these was a false pass — every one returned ok:false, which is the property that matters
|
|
147
|
+
// most and is untouched. It was a WRONG DIAGNOSIS on a safe failure, and the cost is a reader's hour
|
|
148
|
+
// spent hunting an Access application that exists and is working.
|
|
149
|
+
if (!location) {
|
|
150
|
+
// FRONTED, API PATH. Managed OAuth on an MCP path answers RFC 9728 style instead of redirecting a
|
|
151
|
+
// browser: a 401 whose `WWW-Authenticate` names a Cloudflare Access protected-resource document.
|
|
152
|
+
// Measured on the real door — that document resolves 200, says `protected: true`, and carries NO
|
|
153
|
+
// audience. So this is a stated could-not-look about the audience ON A DOOR THAT IS CONFIRMED
|
|
154
|
+
// PRESENT, which is neither a pass nor "no door".
|
|
155
|
+
if (ACCESS_RESOURCE_RE.test(String(wwwAuthenticate ?? ""))) {
|
|
156
|
+
return { kind: "fronted-api",
|
|
157
|
+
why: `the hostname answered ${status ?? "401"} as an OAuth-protected resource, naming a Cloudflare `
|
|
158
|
+
+ "Access protected-resource document — it is fronted, and this route carries no audience to read" };
|
|
159
|
+
}
|
|
160
|
+
// THE EDGE ANSWERED AND THE ORIGIN DID NOT. A 5xx carrying `cf-ray` is Cloudflare reporting that it
|
|
161
|
+
// reached the door and the thing behind it did not answer. Calling that "nothing is fronting this
|
|
162
|
+
// hostname" is exactly backwards.
|
|
163
|
+
if (viaEdge && Number(status) >= 500) {
|
|
164
|
+
return { kind: "origin-failed",
|
|
165
|
+
why: `the edge answered ${status} for this hostname — Cloudflare reached the door and the origin `
|
|
166
|
+
+ "behind it did not answer, so the audience could not be asked for" };
|
|
167
|
+
}
|
|
168
|
+
return { kind: "not-fronted", why: `the hostname answered ${status ?? "with no redirect"} and sent no Access challenge` };
|
|
169
|
+
}
|
|
170
|
+
let url;
|
|
171
|
+
try { url = new URL(location); } catch {
|
|
172
|
+
return { kind: "unreadable", why: `the redirect target is not a URL: ${String(location).slice(0, 120)}` };
|
|
173
|
+
}
|
|
174
|
+
if (!url.pathname.includes(ACCESS_LOGIN_PATH)) {
|
|
175
|
+
return { kind: "not-fronted", why: `the redirect goes to ${url.origin}${url.pathname}, which is not an Access login` };
|
|
176
|
+
}
|
|
177
|
+
const kid = url.searchParams.get("kid") || "";
|
|
178
|
+
const token = url.searchParams.get("meta") || "";
|
|
179
|
+
if (!token) return { kind: "unreadable", why: "the Access login carries no `meta` token", kid };
|
|
180
|
+
const parts = token.split(".");
|
|
181
|
+
if (parts.length < 2) return { kind: "unreadable", why: "the `meta` token is not a JWT", kid };
|
|
182
|
+
let payload;
|
|
183
|
+
try { payload = JSON.parse(decodeSegment(parts[1])); } catch (e) {
|
|
184
|
+
return { kind: "unreadable", why: `the \`meta\` token's payload could not be read (${String(e?.message ?? e).slice(0, 80)})`, kid };
|
|
185
|
+
}
|
|
186
|
+
const aud = typeof payload?.aud === "string" ? payload.aud : "";
|
|
187
|
+
if (!aud) return { kind: "unreadable", why: "the `meta` token's payload names no `aud`", kid };
|
|
188
|
+
// BOTH SOURCES, OR NEITHER IS TRUSTED. A `kid` that is absent is itself a change in the shape.
|
|
189
|
+
if (!kid) return { kind: "unreadable", why: "the Access login carries no `kid` to cross-check the token against", aud };
|
|
190
|
+
if (kid !== aud) {
|
|
191
|
+
return { kind: "disagree", aud, kid, hostname: payload?.hostname ?? "", why: "the two sources name different audiences" };
|
|
192
|
+
}
|
|
193
|
+
return { kind: "read", aud, kid, hostname: payload?.hostname ?? "" };
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* What to tell the reader, given what was configured and what the edge said.
|
|
198
|
+
*
|
|
199
|
+
* NOTHING HERE RETURNS "fine" FOR A QUESTION IT COULD NOT ASK. Each unhappy kind carries its own
|
|
200
|
+
* sentence naming what was not established, because "no problem reported" and "no problem" are the two
|
|
201
|
+
* things this whole check exists to keep apart.
|
|
202
|
+
*/
|
|
203
|
+
export function audienceVerdict({ configured = "", read = {} } = {}) {
|
|
204
|
+
// MEMBERSHIP, NOT EQUALITY, and this file already learned that once. A deployment runs one Access
|
|
205
|
+
// application PER AUDIENCE and `CLEAROTRON_OIDC_AUDIENCE` may name several; the edge issues ONE for
|
|
206
|
+
// the hostname being asked. `===` against a configured list reports every correct multi-application
|
|
207
|
+
// deployment as a mismatch — the same mistake `audienceIncludes` above exists to have stopped making.
|
|
208
|
+
const cfg = accessAudience(configured);
|
|
209
|
+
const cfgList = Array.isArray(cfg) ? cfg : (cfg ? [cfg] : []);
|
|
210
|
+
switch (read.kind) {
|
|
211
|
+
case "unreachable":
|
|
212
|
+
return { kind: "could-not-look", ok: false,
|
|
213
|
+
message: `the edge could not be reached, so the audience it issues is unknown (${read.why}). `
|
|
214
|
+
+ "This is a failure to look, not agreement." };
|
|
215
|
+
case "not-fronted":
|
|
216
|
+
return { kind: "not-fronted", ok: false,
|
|
217
|
+
message: `nothing is fronting this hostname with Access — ${read.why}. A door that is not there `
|
|
218
|
+
+ "cannot be the one this install is configured for, so this is a finding rather than a pass." };
|
|
219
|
+
// NEITHER A PASS NOR "NO DOOR". The door is confirmed present and the audience is not readable by
|
|
220
|
+
// this route — that is a stated could-not-look, and it must not read as either of the two things it
|
|
221
|
+
// is not. Whether an API path's audience is reachable at all is open; nothing in the
|
|
222
|
+
// protected-resource document carries it.
|
|
223
|
+
case "fronted-api":
|
|
224
|
+
return { kind: "fronted-api", ok: false,
|
|
225
|
+
message: `this hostname IS fronted by Access — ${read.why}. The audience could not be compared, `
|
|
226
|
+
+ "which is a could-not-look about the audience and not a finding about the door." };
|
|
227
|
+
case "origin-failed":
|
|
228
|
+
return { kind: "could-not-look", ok: false,
|
|
229
|
+
message: `the edge is up and the origin behind it is not — ${read.why}. Nothing here says anything `
|
|
230
|
+
+ "about the audience; it says the service is down." };
|
|
231
|
+
case "unreadable":
|
|
232
|
+
return { kind: "could-not-look", ok: false,
|
|
233
|
+
message: `the Access challenge is there but its audience could not be read (${read.why}). `
|
|
234
|
+
+ "The shape may have moved; a shape that moved is not agreement." };
|
|
235
|
+
case "disagree":
|
|
236
|
+
return { kind: "sources-disagree", ok: false,
|
|
237
|
+
message: `the edge's own two answers disagree: the login's \`kid\` says ${read.kid} and the `
|
|
238
|
+
+ `\`meta\` token says ${read.aud}. Neither is trustworthy on its own, so nothing is compared.` };
|
|
239
|
+
case "read": {
|
|
240
|
+
if (!cfgList.length) {
|
|
241
|
+
return { kind: "not-configured", ok: false,
|
|
242
|
+
message: `the edge issues ${read.aud} for this hostname, and CLEAROTRON_OIDC_AUDIENCE is unset, `
|
|
243
|
+
+ "so every request it fronts is checked against nothing." };
|
|
244
|
+
}
|
|
245
|
+
if (!audienceIncludes(cfg, read.aud)) {
|
|
246
|
+
// BOTH VALUES, NEVER "audience mismatch". A reader who is told only that two things differ has
|
|
247
|
+
// to go and find both of them, and the whole point of asking the edge was to hand them over.
|
|
248
|
+
return { kind: "mismatch", ok: false,
|
|
249
|
+
message: `the audience does not match. This install is configured with ${cfgList.join(", ")}, and the edge `
|
|
250
|
+
+ `issues ${read.aud} for ${read.hostname || "this hostname"}. Requests will be rejected `
|
|
251
|
+
+ "until they agree — recreating an Access application changes the audience." };
|
|
252
|
+
}
|
|
253
|
+
return { kind: "agree", ok: true,
|
|
254
|
+
message: `the audience matches the one the edge issues for ${read.hostname || "this hostname"} (${read.aud})` };
|
|
255
|
+
}
|
|
256
|
+
default:
|
|
257
|
+
return { kind: "could-not-look", ok: false,
|
|
258
|
+
message: `the audience check returned no verdict it knows (${JSON.stringify(read.kind)}), which is `
|
|
259
|
+
+ "a fault in this check rather than a finding about the door." };
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* One unauthenticated request, with a bound on how long it may take.
|
|
265
|
+
*
|
|
266
|
+
* `redirect: "manual"` because the REDIRECT is the answer — following it fetches Cloudflare's login page
|
|
267
|
+
* and throws away the only thing being read. Failure is returned rather than thrown: the caller's job is
|
|
268
|
+
* to say "could not look", and an exception here would reach `doctor` as a crash instead.
|
|
269
|
+
*/
|
|
270
|
+
export async function probeAudience({ url, fetchImpl = fetch, timeoutMs = 5000, signalFor = null } = {}) {
|
|
271
|
+
if (!url) return { error: new Error("no hostname is configured to ask") };
|
|
272
|
+
const ac = signalFor ? null : new AbortController();
|
|
273
|
+
const t = ac ? setTimeout(() => ac.abort(new Error(`no answer within ${timeoutMs}ms`)), timeoutMs) : null;
|
|
274
|
+
try {
|
|
275
|
+
const res = await fetchImpl(url, { redirect: "manual", signal: signalFor ?? ac.signal });
|
|
276
|
+
// TWO MORE HEADERS, AND THEY ARE THE WHOLE OF THIS CHECK. Without them every non-redirecting
|
|
277
|
+
// answer collapses to "no redirect", and three different doors read as one. `www-authenticate` is
|
|
278
|
+
// how an Access-fronted API path announces itself; `cf-ray` is how a 5xx says the EDGE answered and
|
|
279
|
+
// the origin behind it did not. Both are on the response already — nothing extra is fetched.
|
|
280
|
+
return { status: res.status, location: res.headers?.get?.("location") ?? "",
|
|
281
|
+
wwwAuthenticate: res.headers?.get?.("www-authenticate") ?? "",
|
|
282
|
+
viaEdge: Boolean(res.headers?.get?.("cf-ray")) };
|
|
283
|
+
} catch (e) {
|
|
284
|
+
return { error: e };
|
|
285
|
+
} finally {
|
|
286
|
+
if (t) clearTimeout(t);
|
|
287
|
+
}
|
|
288
|
+
}
|
package/shared/brand.mjs
CHANGED
|
@@ -26,7 +26,7 @@ const HERE = dirname(fileURLToPath(import.meta.url));
|
|
|
26
26
|
// index header, nav brand, Excel metadata, connector instructions). Env-overridable per deployment —
|
|
27
27
|
// branding is tenant config, not code. Read once at import (deployment-static, like the systemd env).
|
|
28
28
|
//
|
|
29
|
-
// CASING: THE VALUE IS PROSE, SO IT IS CAPITALISED (
|
|
29
|
+
// CASING: THE VALUE IS PROSE, SO IT IS CAPITALISED (superseding ruling 2026-08-20). The rule is
|
|
30
30
|
// Clearotron in prose and UI, `clearotron` in config values, commands, binary names and identifiers.
|
|
31
31
|
// This DEFAULT is prose in every place it lands — report and portal <title>, the pool index header,
|
|
32
32
|
// Excel `creator`, the connector steps, "You reached X" — so it takes the capital. The VARIABLE that
|
|
@@ -95,7 +95,7 @@ export const BRAND = {
|
|
|
95
95
|
*
|
|
96
96
|
* ABSENT IS NOT FALSE. The plain confidentiality line claims nothing and is what any legal deliverable
|
|
97
97
|
* carries; collapsing absent into false is precisely the coercion that shipped House-default clearances
|
|
98
|
-
* with no marking at all. That is
|
|
98
|
+
* with no marking at all. That is the property and it is untouched.
|
|
99
99
|
*
|
|
100
100
|
* `true` USED TO SELECT A LONGER LINE — the plain marking plus a legal characterisation of the document
|
|
101
101
|
* — and the owner dropped that wording on 2026-08-20. It renders as the default here rather than being
|
|
@@ -154,7 +154,7 @@ export const PALETTE = {
|
|
|
154
154
|
|
|
155
155
|
// — THE DARK COUNTERPART. Until this landed, every dark value in the product was a literal typed
|
|
156
156
|
// into whichever block needed it, and the two server-rendered door pages (sign-in, refusal) had guessed
|
|
157
|
-
// their own set — a THIRD ground,
|
|
157
|
+
// their own set — a THIRD ground, #17150f, against the brand pack's #0f0e0c.
|
|
158
158
|
//
|
|
159
159
|
// The two entries the brand pack fixes are marked; the rest have no pack entry and are the values the
|
|
160
160
|
// warm surfaces already shipped, kept as-is. `cream` has no dark twin by name because a dark ground is
|
|
@@ -164,7 +164,7 @@ export const PALETTE_DARK = {
|
|
|
164
164
|
ground: '#0f0e0c', // brand pack §01 "Dark BG" — near-black. Supersedes the doors' #17150f
|
|
165
165
|
ink: '#f0e8d8', // brand pack §01 "Parchment" — dark text / mark. Supersedes #ece5d8
|
|
166
166
|
// The three locked crimsons, lifted for the dark ground. `crimson` itself is NOT here: it is a FILL
|
|
167
|
-
// (badges, the accent) and keeps
|
|
167
|
+
// (badges, the accent) and keeps #860F09 in both schemes. Crimson as TEXT is what needs lifting, and
|
|
168
168
|
// that is `crimsonText` — the value the warm and report dark blocks already applied to links.
|
|
169
169
|
crimsonDeep: '#6a0a13',
|
|
170
170
|
crimsonMid: '#c47f7a',
|
|
@@ -350,7 +350,7 @@ export const REPORT_ROOT =
|
|
|
350
350
|
|
|
351
351
|
// Risk ramp — the designer's ramp from the portal redesign. It is a BAND family
|
|
352
352
|
// of its own: --high is deliberately NOT --accent any more (the shipped --high was byte-identical to
|
|
353
|
-
//
|
|
353
|
+
// #860F09, so a High risk dot read as a Start button and needed a ring workaround). --accent /
|
|
354
354
|
// --crimson / --maroon above are untouched. The gauge's stop order is clear→low→med→high→severe.
|
|
355
355
|
`--clear:#5F8A64; --low:#8A9440; --med:#C8871B; --high:#B23A2E; --severe:#7C1E15;` +
|
|
356
356
|
// Soft/text pairs: re-derived from the five bases by the rule in shared/tools/derive-band-pairs.mjs (same
|
|
@@ -374,12 +374,12 @@ export const REPORT_ROOT =
|
|
|
374
374
|
// • *_EXPLICIT variants — the `[data-theme="dark"]` block ONLY, no `@media` —
|
|
375
375
|
// CUSTOMER-facing surfaces (the per-customer index): first view is ALWAYS light; dark only by
|
|
376
376
|
// the visitor's explicit toggle. The @media string must never appear in client output (tests pin this).
|
|
377
|
-
// Crimson discipline: `--crimson`/`--h-red` KEEP
|
|
378
|
-
// where white-on-crimson stays high-contrast. `--high` used to be in that list because it WAS
|
|
377
|
+
// Crimson discipline: `--crimson`/`--h-red` KEEP #860F09 in dark — they are FILLS (badges, the accent)
|
|
378
|
+
// where white-on-crimson stays high-contrast. `--high` used to be in that list because it WAS #860F09;
|
|
379
379
|
// since the 2026-07-19 ramp recolor it is a band token (#B23A2E) and lightens with the rest of the band
|
|
380
380
|
// family. Crimson TEXT uses (links, summaries, the wordmark)
|
|
381
381
|
// are recolored to a lightened #e0736b by SCOPED rules inside the dark block only — zero light-side edits.
|
|
382
|
-
// Every dark hex avoids the BLUE_SKIN regex /#3b4fd6
|
|
382
|
+
// Every dark hex avoids the BLUE_SKIN regex /#3b4fd6|#11132a|#f5f6f9|#1a1a2e/i (note #1b1714 ≠ #1a1a2e).
|
|
383
383
|
//
|
|
384
384
|
// Inside the @media branch, override RULES are prefixed `html:not([data-theme="light"])` (not `:root:not`)
|
|
385
385
|
// on purpose: `:root` would add a full class-level of specificity and out-rank sibling base rules like
|
|
@@ -427,7 +427,7 @@ const WARM_DARK_RULES = [
|
|
|
427
427
|
];
|
|
428
428
|
|
|
429
429
|
// Report dark tokens (token-for-token against REPORT_ROOT; --font/--mono unchanged). --crimson keeps
|
|
430
|
-
//
|
|
430
|
+
// #860F09 (it is the accent FILL). The risk BANDS are their own family since the 2026-07-19 recolor and
|
|
431
431
|
// are free to lighten: each is its light base at +11 lightness (severe +10), saturation ×.92 — the same
|
|
432
432
|
// relationship the previous dark ramp used. That relationship is what makes the last stop visible on the
|
|
433
433
|
// dark ramp, and it does so better than before: dark --severe reads 2.70:1 on the page (was 1.74) and
|
|
@@ -478,10 +478,10 @@ export const REPORT_ROOT_DARK_EXPLICIT = darkBlock(REPORT_DARK_TOKENS, REPORT_DA
|
|
|
478
478
|
//
|
|
479
479
|
// WHY IT IS A FAMILY AND NOT A PAGE'S BUSINESS. Both doors are server-rendered by driver/portal-service
|
|
480
480
|
// and each carried its own copy of this block — including a hand-picked dark set that had drifted from
|
|
481
|
-
// the pack (
|
|
481
|
+
// the pack (#17150f ground, #ece5d8 text) and error colours with no home at all. Two copies of a palette
|
|
482
482
|
// is how the light palettes drifted before PALETTE existed.
|
|
483
483
|
//
|
|
484
|
-
// THE GATING IS `[data-theme]` ONLY (
|
|
484
|
+
// THE GATING IS `[data-theme]` ONLY (correcting what shipped). The portal's doctrine is
|
|
485
485
|
// that a CLIENT surface never follows the OS colour preference: first view is always light, and dark
|
|
486
486
|
// arrives only from a choice the visitor made themselves. kept the media query on the argument
|
|
487
487
|
// that these pages have no toggle, so removing it would leave a first-time visitor no route to dark —
|
|
@@ -574,7 +574,7 @@ header.rep .theme-toggle{float:right;margin-left:12px}
|
|
|
574
574
|
// emitted page — including reports published by deployments with no connection to that firm (
|
|
575
575
|
// measured it on the demo pool index, twice on one page). Stripping the label was the fix then;
|
|
576
576
|
// removing the watermark removes the surface.
|
|
577
|
-
// THE SWISS FLAG IS GONE, and it is
|
|
577
|
+
// THE SWISS FLAG IS GONE, and it is the ruling rather than a new one. The portal's lockup
|
|
578
578
|
// dropped it when the product was renamed — portal-ui/src/components/Logo.tsx states the reason and
|
|
579
579
|
// portal-ui/test/lockup.test.ts pins its ABSENCE so a well-meaning restore fails there:
|
|
580
580
|
//
|
|
@@ -639,7 +639,7 @@ export const CHROME_CSS = `
|
|
|
639
639
|
.lockup .lk-tag{margin-top:5px;font-size:7.5px;font-weight:500;letter-spacing:.22em;text-transform:uppercase;color:var(--muted)}
|
|
640
640
|
.has-glow{position:relative;isolation:isolate}
|
|
641
641
|
.has-glow::before{content:"";position:absolute;top:0;left:0;width:min(92vw,1100px);aspect-ratio:1.5;background:radial-gradient(farthest-side at 0% 0%,var(--web-glow),transparent 72%);pointer-events:none;z-index:-1}
|
|
642
|
-
/*
|
|
642
|
+
/* the .watermark rule and its ::after are GONE. They masked the parent company's ridge behind
|
|
643
643
|
every report and the pool index; the owner's call is removal, not a bracket version of the same
|
|
644
644
|
thing. The three body elements that carried the class drop it too, and --wm-alpha goes with them:
|
|
645
645
|
a token nothing reads is a knob somebody re-wires.
|
package/shared/citation-scan.mjs
CHANGED
|
@@ -47,7 +47,7 @@ export function scanCitations(files, readFn, { paths, excluded, declaredFor, sou
|
|
|
47
47
|
// Measured at the bound written here: 6 hits, all real. Widen it further only with the same
|
|
48
48
|
// measurement in hand.
|
|
49
49
|
const base = path.endsWith("/") ? null : path.slice(path.lastIndexOf("/") + 1);
|
|
50
|
-
// AND A DIRECTORY IS CITED BY ITS OWN NAME TOO (
|
|
50
|
+
// AND A DIRECTORY IS CITED BY ITS OWN NAME TOO (measured 2026-08-24). Three shipping
|
|
51
51
|
// files named `fixtures/owner-screen-2026-07-29` — a path relative to the file, not to the repo
|
|
52
52
|
// root — so `includes(path)` walked straight past every one of them and the reader got a
|
|
53
53
|
// directory that is not there. The FILES-ONLY bound above was measured against basenames like
|