@hawkeyexl/manni 4.10.0 → 4.12.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/README.md +1 -1
- package/dist/batch-EFSFG6GC.js +46 -0
- package/dist/build-NIO3UIWJ.js +36 -0
- package/dist/calibrate-6VO7URRV.js +41 -0
- package/dist/capture-NMBVJO3C.js +38 -0
- package/dist/check-SHOYX2B5.js +30 -0
- package/dist/check-XMJKH3KV.js +34 -0
- package/dist/{check-NLL4NRYA.js → check-Y62BJNC4.js} +35 -31
- package/dist/{check-NLL4NRYA.js.map → check-Y62BJNC4.js.map} +1 -1
- package/dist/{check-7B77ZD2N.js → check-ZMO3ZLMW.js} +19 -15
- package/dist/{chunk-PK7EKJ5T.js → chunk-24AJK2RG.js} +5 -10
- package/dist/chunk-24AJK2RG.js.map +1 -0
- package/dist/chunk-2OZF2VUB.js +164 -0
- package/dist/chunk-2OZF2VUB.js.map +1 -0
- package/dist/chunk-2UJZXVHR.js +1868 -0
- package/dist/chunk-2UJZXVHR.js.map +1 -0
- package/dist/{chunk-DNZUBCGZ.js → chunk-3BRJCQPY.js} +36 -7
- package/dist/chunk-3BRJCQPY.js.map +1 -0
- package/dist/{chunk-D2UW3ZCK.js → chunk-42VFJOAF.js} +13 -11
- package/dist/{chunk-D2UW3ZCK.js.map → chunk-42VFJOAF.js.map} +1 -1
- package/dist/{chunk-LQZQ5KGG.js → chunk-4Q24OYI3.js} +7 -7
- package/dist/{chunk-XU73V5XT.js → chunk-4WJTURRO.js} +15 -15
- package/dist/{chunk-WN47MNSK.js → chunk-5SID2SVL.js} +4 -4
- package/dist/{chunk-5REEVKGH.js → chunk-AANUY4BH.js} +2 -2
- package/dist/chunk-ANPIIYRH.js +2272 -0
- package/dist/chunk-ANPIIYRH.js.map +1 -0
- package/dist/{chunk-RZVCWX5R.js → chunk-AYVKN3PG.js} +4 -4
- package/dist/{chunk-2UCC26MO.js → chunk-CH6IOGXV.js} +9 -9
- package/dist/{chunk-RODZ7MB7.js → chunk-D5Z6B4M7.js} +6 -6
- package/dist/{chunk-IJ62BB2T.js → chunk-D6SELXQ2.js} +7 -7
- package/dist/{chunk-2JV7C4YV.js → chunk-DDILEF5F.js} +890 -1399
- package/dist/chunk-DDILEF5F.js.map +1 -0
- package/dist/{chunk-3E2X2RBU.js → chunk-DGRLHDM4.js} +9 -9
- package/dist/{chunk-2BV4FBC7.js → chunk-DHGB4JBG.js} +4 -3
- package/dist/chunk-DHGB4JBG.js.map +1 -0
- package/dist/{chunk-6LR73NMO.js → chunk-DLU5FCFT.js} +30 -28
- package/dist/chunk-DLU5FCFT.js.map +1 -0
- package/dist/chunk-DSWKBZWW.js +16 -0
- package/dist/chunk-DSWKBZWW.js.map +1 -0
- package/dist/{chunk-BD7IXBWE.js → chunk-F564FHMQ.js} +8 -8
- package/dist/{chunk-ABHG6I3G.js → chunk-FKAZUZQU.js} +469 -85
- package/dist/chunk-FKAZUZQU.js.map +1 -0
- package/dist/{chunk-DFCQ6BMI.js → chunk-G3MBUL5M.js} +4 -4
- package/dist/{chunk-SUTMSDQ2.js → chunk-GQ3KRY3B.js} +3 -3
- package/dist/chunk-HDPN46JP.js +393 -0
- package/dist/chunk-HDPN46JP.js.map +1 -0
- package/dist/{chunk-EAUIQADY.js → chunk-IQQAJROD.js} +6 -6
- package/dist/{chunk-ZHRPH52H.js → chunk-IZXN3WI6.js} +2 -2
- package/dist/{chunk-NCPWXHDO.js → chunk-JEUFYSFQ.js} +4 -4
- package/dist/{chunk-G6FNWRAI.js → chunk-JSSM7VVV.js} +4 -4
- package/dist/{chunk-CCWMACJL.js → chunk-KFGZPVFA.js} +229 -821
- package/dist/chunk-KFGZPVFA.js.map +1 -0
- package/dist/{chunk-H26VDFDS.js → chunk-KGFSPJLD.js} +2 -2
- package/dist/{chunk-AO5TSDKT.js → chunk-KMORGMCW.js} +7 -7
- package/dist/{chunk-WQWKYAAK.js → chunk-NUQF5F5J.js} +2 -2
- package/dist/{chunk-2YJ5H5E6.js → chunk-NZ6KSHFD.js} +23 -21
- package/dist/{chunk-2YJ5H5E6.js.map → chunk-NZ6KSHFD.js.map} +1 -1
- package/dist/{chunk-7Y3N4Y72.js → chunk-OHUDZRLK.js} +3 -3
- package/dist/{chunk-GCKHSBEN.js → chunk-OKMTUAWO.js} +4 -4
- package/dist/{chunk-6M5VJOC2.js → chunk-OTJOBZJ5.js} +167 -166
- package/dist/chunk-OTJOBZJ5.js.map +1 -0
- package/dist/{chunk-2W34HX2U.js → chunk-PS257NIU.js} +288 -373
- package/dist/chunk-PS257NIU.js.map +1 -0
- package/dist/chunk-QDC7JPFG.js +685 -0
- package/dist/chunk-QDC7JPFG.js.map +1 -0
- package/dist/chunk-QEAGL4V5.js +3185 -0
- package/dist/chunk-QEAGL4V5.js.map +1 -0
- package/dist/{chunk-GB2XPITA.js → chunk-QMY57PVW.js} +2 -2
- package/dist/{chunk-55GMOVKW.js → chunk-QNDDPXFR.js} +2 -2
- package/dist/{chunk-GXN7RRHR.js → chunk-QSIXNTRV.js} +4 -4
- package/dist/{chunk-G7XD4QH5.js → chunk-RGLFV4KO.js} +11372 -10218
- package/dist/chunk-RGLFV4KO.js.map +1 -0
- package/dist/{chunk-QBVP3SQP.js → chunk-SGR7ZAVE.js} +13 -7
- package/dist/chunk-SGR7ZAVE.js.map +1 -0
- package/dist/{chunk-KBG463UK.js → chunk-SMHAYK6I.js} +2409 -5243
- package/dist/chunk-SMHAYK6I.js.map +1 -0
- package/dist/{chunk-XG6PVB5S.js → chunk-SSQZB5SQ.js} +1 -11
- package/dist/chunk-SSQZB5SQ.js.map +1 -0
- package/dist/{chunk-GDLHTI5R.js → chunk-STPGIKPY.js} +8 -2
- package/dist/chunk-STPGIKPY.js.map +1 -0
- package/dist/{chunk-QJRQ4BRC.js → chunk-U22TOL5Y.js} +17 -17
- package/dist/{chunk-NGTVREIH.js → chunk-U6IHLEWT.js} +2 -2
- package/dist/{chunk-Z5YHMRLF.js → chunk-UUCCV3SI.js} +2 -2
- package/dist/{chunk-ZXXFP2LA.js → chunk-UXMCHBOJ.js} +2 -2
- package/dist/{chunk-VZVEP2OZ.js → chunk-VFAKGIDG.js} +2 -2
- package/dist/{chunk-QCHVR4ZM.js → chunk-VM7VAFJW.js} +33 -7
- package/dist/chunk-VM7VAFJW.js.map +1 -0
- package/dist/{chunk-VQK4VHLF.js → chunk-YQV75FIL.js} +2 -2
- package/dist/chunk-YUTVAMWW.js +2 -0
- package/dist/chunk-ZPLVANY2.js +15 -0
- package/dist/chunk-ZPLVANY2.js.map +1 -0
- package/dist/{cli-BIIUKPTE.js → cli-4CR7QIOK.js} +26 -22
- package/dist/{cli-BIIUKPTE.js.map → cli-4CR7QIOK.js.map} +1 -1
- package/dist/{cli-V2DI3K2R.js → cli-6R4W3HAH.js} +37 -33
- package/dist/{cli-V2DI3K2R.js.map → cli-6R4W3HAH.js.map} +1 -1
- package/dist/{cli-HO62TOM2.js → cli-BOMA2FMP.js} +14 -11
- package/dist/{cli-EH3I4IUX.js → cli-EDQPQOCE.js} +47 -41
- package/dist/cli-EDQPQOCE.js.map +1 -0
- package/dist/{cli-P2X7PNY6.js → cli-GBF76EXT.js} +25 -20
- package/dist/{cli-P2X7PNY6.js.map → cli-GBF76EXT.js.map} +1 -1
- package/dist/{cli-4YYC6LCY.js → cli-MQYCF3SR.js} +27 -23
- package/dist/{cli-4YYC6LCY.js.map → cli-MQYCF3SR.js.map} +1 -1
- package/dist/{cli-UETKXHJN.js → cli-OJKFXQOM.js} +9 -9
- package/dist/{cli-LWST5FQH.js → cli-PHZAO4LZ.js} +4 -4
- package/dist/{cli-TELPAMJO.js → cli-PTKFFNOW.js} +59 -35
- package/dist/cli-PTKFFNOW.js.map +1 -0
- package/dist/{cli-SGVFZOAW.js → cli-UW2K5Z5J.js} +34 -29
- package/dist/{cli-SGVFZOAW.js.map → cli-UW2K5Z5J.js.map} +1 -1
- package/dist/cli-XXTNPPKB.js +83 -0
- package/dist/cli-XXTNPPKB.js.map +1 -0
- package/dist/cli.js +24 -12
- package/dist/cli.js.map +1 -1
- package/dist/{config-TYXYQK3I.js → config-JJW75SBX.js} +5 -5
- package/dist/docmeta.js +13 -10
- package/dist/docmeta.js.map +1 -1
- package/dist/github-6VQKSB67.js +35 -0
- package/dist/github-RBSEM7ZK.js +30 -0
- package/dist/graph/runtime.d.ts +4 -1
- package/dist/graph/runtime.js +20 -9
- package/dist/graph/runtime.js.map +1 -1
- package/dist/{host-6GURH5HE.js → host-YSTYO5DX.js} +3 -3
- package/dist/index.d.ts +1214 -940
- package/dist/index.js +190 -160
- package/dist/index.js.map +1 -1
- package/dist/{json-QR4G35KA.js → json-PU2HLHDQ.js} +18 -14
- package/dist/labels-SJNSOPBI.js +73 -0
- package/dist/labels-SJNSOPBI.js.map +1 -0
- package/dist/lint-KIVTHLGU.js +34 -0
- package/dist/list-RDEJDDJF.js +32 -0
- package/dist/list-SUTDWL2J.js +35 -0
- package/dist/{page-FSXDXCDD.js → page-UMAA3NCM.js} +18 -13
- package/dist/{prepare-UPIBTFNS.js → prepare-3I3LOXXD.js} +24 -20
- package/dist/{prepare-UPIBTFNS.js.map → prepare-3I3LOXXD.js.map} +1 -1
- package/dist/{pretty-4IONWSEP.js → pretty-ANLRHU4O.js} +18 -14
- package/dist/{pretty-R4BQD2VH.js → pretty-Q3ZFKOR7.js} +18 -14
- package/dist/{provider-527CO4DM.js → provider-LBX4IXGX.js} +3 -3
- package/dist/{release-3D5PK6M7.js → release-VV3UTKE5.js} +3 -3
- package/dist/{reporters-M6LJ2IYU.js → reporters-26H3N2KW.js} +3 -3
- package/dist/{reporters-DHO2BXAD.js → reporters-ILT36CIH.js} +7 -7
- package/dist/{reporters-FPP6JNDP.js → reporters-PNDLWT6K.js} +16 -12
- package/dist/run-QXCK33Z4.js +37 -0
- package/dist/{term-ASM4LVYC.js → term-D2N7UN4P.js} +981 -138
- package/dist/term-D2N7UN4P.js.map +1 -0
- package/dist/validate-BRUCOT2O.js +19 -0
- package/dist/validate-BRUCOT2O.js.map +1 -0
- package/package.json +3 -2
- package/plugin/manni/.claude-plugin/plugin.json +1 -1
- package/shapes/graph/shapes-1.1.0.ttl +785 -0
- package/dist/batch-6NICDKRE.js +0 -41
- package/dist/build-3KP2K3XN.js +0 -32
- package/dist/calibrate-LUA3DWKD.js +0 -36
- package/dist/capture-NETOHCB4.js +0 -34
- package/dist/check-E4QCB7LS.js +0 -20
- package/dist/check-PTECPIIB.js +0 -26
- package/dist/chunk-2BV4FBC7.js.map +0 -1
- package/dist/chunk-2JV7C4YV.js.map +0 -1
- package/dist/chunk-2W34HX2U.js.map +0 -1
- package/dist/chunk-4DLF5SA4.js +0 -392
- package/dist/chunk-4DLF5SA4.js.map +0 -1
- package/dist/chunk-6AGESHHM.js +0 -387
- package/dist/chunk-6AGESHHM.js.map +0 -1
- package/dist/chunk-6LR73NMO.js.map +0 -1
- package/dist/chunk-6M5VJOC2.js.map +0 -1
- package/dist/chunk-ABHG6I3G.js.map +0 -1
- package/dist/chunk-CCWMACJL.js.map +0 -1
- package/dist/chunk-DNZUBCGZ.js.map +0 -1
- package/dist/chunk-G7XD4QH5.js.map +0 -1
- package/dist/chunk-GDLHTI5R.js.map +0 -1
- package/dist/chunk-KBG463UK.js.map +0 -1
- package/dist/chunk-PK7EKJ5T.js.map +0 -1
- package/dist/chunk-QBVP3SQP.js.map +0 -1
- package/dist/chunk-QCHVR4ZM.js.map +0 -1
- package/dist/chunk-VVVKBUBO.js +0 -818
- package/dist/chunk-VVVKBUBO.js.map +0 -1
- package/dist/chunk-XG6PVB5S.js.map +0 -1
- package/dist/cli-EH3I4IUX.js.map +0 -1
- package/dist/cli-TELPAMJO.js.map +0 -1
- package/dist/github-ESK45CEZ.js +0 -26
- package/dist/github-WER7JUTN.js +0 -31
- package/dist/lint-QTI7XK2A.js +0 -30
- package/dist/list-JO4G3TS3.js +0 -30
- package/dist/list-O2MJUP5V.js +0 -28
- package/dist/run-YH5Z7RJ7.js +0 -32
- package/dist/term-ASM4LVYC.js.map +0 -1
- package/dist/validate-7JI3H57P.js +0 -17
- /package/dist/{batch-6NICDKRE.js.map → batch-EFSFG6GC.js.map} +0 -0
- /package/dist/{build-3KP2K3XN.js.map → build-NIO3UIWJ.js.map} +0 -0
- /package/dist/{calibrate-LUA3DWKD.js.map → calibrate-6VO7URRV.js.map} +0 -0
- /package/dist/{capture-NETOHCB4.js.map → capture-NMBVJO3C.js.map} +0 -0
- /package/dist/{check-7B77ZD2N.js.map → check-SHOYX2B5.js.map} +0 -0
- /package/dist/{check-E4QCB7LS.js.map → check-XMJKH3KV.js.map} +0 -0
- /package/dist/{check-PTECPIIB.js.map → check-ZMO3ZLMW.js.map} +0 -0
- /package/dist/{chunk-LQZQ5KGG.js.map → chunk-4Q24OYI3.js.map} +0 -0
- /package/dist/{chunk-XU73V5XT.js.map → chunk-4WJTURRO.js.map} +0 -0
- /package/dist/{chunk-WN47MNSK.js.map → chunk-5SID2SVL.js.map} +0 -0
- /package/dist/{chunk-5REEVKGH.js.map → chunk-AANUY4BH.js.map} +0 -0
- /package/dist/{chunk-RZVCWX5R.js.map → chunk-AYVKN3PG.js.map} +0 -0
- /package/dist/{chunk-2UCC26MO.js.map → chunk-CH6IOGXV.js.map} +0 -0
- /package/dist/{chunk-RODZ7MB7.js.map → chunk-D5Z6B4M7.js.map} +0 -0
- /package/dist/{chunk-IJ62BB2T.js.map → chunk-D6SELXQ2.js.map} +0 -0
- /package/dist/{chunk-3E2X2RBU.js.map → chunk-DGRLHDM4.js.map} +0 -0
- /package/dist/{chunk-BD7IXBWE.js.map → chunk-F564FHMQ.js.map} +0 -0
- /package/dist/{chunk-DFCQ6BMI.js.map → chunk-G3MBUL5M.js.map} +0 -0
- /package/dist/{chunk-SUTMSDQ2.js.map → chunk-GQ3KRY3B.js.map} +0 -0
- /package/dist/{chunk-EAUIQADY.js.map → chunk-IQQAJROD.js.map} +0 -0
- /package/dist/{chunk-ZHRPH52H.js.map → chunk-IZXN3WI6.js.map} +0 -0
- /package/dist/{chunk-NCPWXHDO.js.map → chunk-JEUFYSFQ.js.map} +0 -0
- /package/dist/{chunk-G6FNWRAI.js.map → chunk-JSSM7VVV.js.map} +0 -0
- /package/dist/{chunk-H26VDFDS.js.map → chunk-KGFSPJLD.js.map} +0 -0
- /package/dist/{chunk-AO5TSDKT.js.map → chunk-KMORGMCW.js.map} +0 -0
- /package/dist/{chunk-WQWKYAAK.js.map → chunk-NUQF5F5J.js.map} +0 -0
- /package/dist/{chunk-7Y3N4Y72.js.map → chunk-OHUDZRLK.js.map} +0 -0
- /package/dist/{chunk-GCKHSBEN.js.map → chunk-OKMTUAWO.js.map} +0 -0
- /package/dist/{chunk-GB2XPITA.js.map → chunk-QMY57PVW.js.map} +0 -0
- /package/dist/{chunk-55GMOVKW.js.map → chunk-QNDDPXFR.js.map} +0 -0
- /package/dist/{chunk-GXN7RRHR.js.map → chunk-QSIXNTRV.js.map} +0 -0
- /package/dist/{chunk-QJRQ4BRC.js.map → chunk-U22TOL5Y.js.map} +0 -0
- /package/dist/{chunk-NGTVREIH.js.map → chunk-U6IHLEWT.js.map} +0 -0
- /package/dist/{chunk-Z5YHMRLF.js.map → chunk-UUCCV3SI.js.map} +0 -0
- /package/dist/{chunk-ZXXFP2LA.js.map → chunk-UXMCHBOJ.js.map} +0 -0
- /package/dist/{chunk-VZVEP2OZ.js.map → chunk-VFAKGIDG.js.map} +0 -0
- /package/dist/{chunk-VQK4VHLF.js.map → chunk-YQV75FIL.js.map} +0 -0
- /package/dist/{cli-HO62TOM2.js.map → chunk-YUTVAMWW.js.map} +0 -0
- /package/dist/{config-TYXYQK3I.js.map → cli-BOMA2FMP.js.map} +0 -0
- /package/dist/{cli-UETKXHJN.js.map → cli-OJKFXQOM.js.map} +0 -0
- /package/dist/{cli-LWST5FQH.js.map → cli-PHZAO4LZ.js.map} +0 -0
- /package/dist/{github-ESK45CEZ.js.map → config-JJW75SBX.js.map} +0 -0
- /package/dist/{github-WER7JUTN.js.map → github-6VQKSB67.js.map} +0 -0
- /package/dist/{host-6GURH5HE.js.map → github-RBSEM7ZK.js.map} +0 -0
- /package/dist/{json-QR4G35KA.js.map → host-YSTYO5DX.js.map} +0 -0
- /package/dist/{lint-QTI7XK2A.js.map → json-PU2HLHDQ.js.map} +0 -0
- /package/dist/{list-JO4G3TS3.js.map → lint-KIVTHLGU.js.map} +0 -0
- /package/dist/{list-O2MJUP5V.js.map → list-RDEJDDJF.js.map} +0 -0
- /package/dist/{page-FSXDXCDD.js.map → list-SUTDWL2J.js.map} +0 -0
- /package/dist/{pretty-4IONWSEP.js.map → page-UMAA3NCM.js.map} +0 -0
- /package/dist/{pretty-R4BQD2VH.js.map → pretty-ANLRHU4O.js.map} +0 -0
- /package/dist/{provider-527CO4DM.js.map → pretty-Q3ZFKOR7.js.map} +0 -0
- /package/dist/{reporters-DHO2BXAD.js.map → provider-LBX4IXGX.js.map} +0 -0
- /package/dist/{release-3D5PK6M7.js.map → release-VV3UTKE5.js.map} +0 -0
- /package/dist/{reporters-FPP6JNDP.js.map → reporters-26H3N2KW.js.map} +0 -0
- /package/dist/{reporters-M6LJ2IYU.js.map → reporters-ILT36CIH.js.map} +0 -0
- /package/dist/{run-YH5Z7RJ7.js.map → reporters-PNDLWT6K.js.map} +0 -0
- /package/dist/{validate-7JI3H57P.js.map → run-QXCK33Z4.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/graph/commands/build.ts","../src/graph/core/analyze-cache.ts","../src/graph/core/concepts.ts","../src/graph/core/derive.ts","../src/graph/core/emit.ts","../src/graph/core/harvest.ts","../src/graph/core/git.ts","../src/graph/core/graph-output.ts"],"sourcesContent":["/**\n * `manni graph build` — derive the knowledge graph from discovered docs and write\n * deterministic Turtle. Running twice over unchanged inputs produces\n * byte-identical output.\n */\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { GraphError } from \"../types.js\";\nimport { analyzeDoc } from \"../core/analyze.js\";\nimport { ANALYZE_CACHE_DIR, AnalyzeCache } from \"../core/analyze-cache.js\";\nimport { loadRunConfig } from \"../core/config.js\";\nimport { deriveGraph, termConceptCount } from \"../core/derive.js\";\nimport {\n assertInputFormat,\n documentBase,\n documentSetPatterns,\n resolveDocumentSet,\n routesFrom,\n STDIN,\n type DocumentInputOptions,\n} from \"../core/discover.js\";\nimport { STDIN_PATH } from \"../core/iri.js\";\nimport { emitTurtle } from \"../core/emit.js\";\nimport { harvestWarnings } from \"../core/harvest.js\";\nimport { collectGitHistory } from \"../core/git.js\";\nimport { suppressGraphOutput } from \"../core/graph-output.js\";\nimport { openMetaView, withExternalMetadata } from \"../core/external.js\";\nimport { errorMessage } from \"../../shared/errors.js\";\nimport { termLabelSource, type TermLabel } from \"../../shared/term-labels.js\";\nimport { NS, RDF_TYPE } from \"../core/vocab.js\";\nimport pkg from \"../../../package.json\" with { type: \"json\" };\n\nexport interface BuildOptions extends DocumentInputOptions {\n /** Output path override (default: config `out`). */\n out?: string;\n cwd?: string;\n /**\n * What `-` reads: the document from stdin, read by the caller. Required\n * when `paths` holds `-`. Its display path is `<stdin>`, its node is\n * `{baseIri}stdin`, and its links resolve from `cwd`.\n */\n stdinContent?: string;\n /** `--allow-empty`: zero matched files writes an empty graph, not an error. */\n allowEmpty?: boolean;\n}\n\n/**\n * What a run that wanted git history and could not have it is told. Said once,\n * through `warn()` at the CLI edge: git is detected now rather than switched\n * (proposal 0051 §6), so the degradation graph ADR 01010 built the warnings\n * channel for is all that is left of the tri-state.\n *\n * The reason travels with the sentence. Detection removed the user's way of\n * saying \"I require this\", so the warning is the only thing standing between a\n * CI runner that lost git and a quietly thinner graph — and \"not a repository\"\n * wants a different fix from \"git is not on PATH\" or \"`git log` timed out\".\n */\nexport const GIT_ABSENT_WARNING =\n \"the graph has no revision history or commit agents\";\n\nexport function gitAbsentWarning(reason: string): string {\n return `${GIT_ABSENT_WARNING}: ${reason}`;\n}\n\nexport interface BuildResult {\n outPath: string;\n docs: number;\n quads: number;\n /**\n * The concepts the graph holds, and how many of them the termbase defines\n * (proposal 0086 §1). `fromTermbase` is 0 when the `terms` derive source\n * is off or no termbase is set up.\n */\n concepts: { total: number; fromTermbase: number };\n /**\n * Non-fatal diagnostics: the build succeeded, but something it would have\n * done by default could not run (see ADR 01010). Rendered to stderr by the\n * CLI; never affects the exit code.\n */\n warnings: string[];\n}\n\n/** The build with its Turtle in hand, before anything is written. */\nexport interface BuiltGraph extends BuildResult {\n turtle: string;\n}\n\nexport async function runBuild(opts: BuildOptions = {}): Promise<BuildResult> {\n const { turtle, ...result } = await buildGraph(opts);\n mkdirSync(dirname(result.outPath), { recursive: true });\n writeFileSync(result.outPath, turtle, \"utf8\");\n return result;\n}\n\n/**\n * `runBuild` without the write: the graph as Turtle, in memory. `manni check`\n * builds the graph this way and checks it, writing no file.\n */\nexport async function buildGraph(opts: BuildOptions = {}): Promise<BuiltGraph> {\n const cwd = opts.cwd ?? process.cwd();\n const config = loadRunConfig(\n {\n ...(opts.config === undefined ? {} : { configPath: opts.config }),\n ...(opts.noConfig === undefined ? {} : { noConfig: opts.noConfig }),\n ...(opts.paths === undefined ? {} : { paths: opts.paths }),\n ...(opts.collection === undefined ? {} : { collection: opts.collection }),\n },\n cwd,\n );\n\n const format = assertInputFormat(opts.paths ?? [], opts.as);\n // Collection pages are labelled from the config's directory and typed paths\n // from cwd, as meta labels them. Every read below resolves from `base`.\n const base = documentBase(config, opts, cwd);\n const files = resolveDocumentSet(config, opts, \"build\", cwd, base);\n const usingStdin = (opts.paths ?? []).includes(STDIN);\n const outPath = resolve(cwd, opts.out ?? config.out);\n if (files.length === 0 && !usingStdin) {\n if (opts.allowEmpty) {\n // Zero documents is an empty graph, written where the graph goes, so a\n // later step that reads it finds a file rather than a stale one.\n return {\n outPath,\n docs: 0,\n quads: 0,\n concepts: { total: 0, fromTermbase: 0 },\n warnings: [],\n turtle: emitTurtle([]),\n };\n }\n throw new GraphError(\n `No input files matched: ${documentSetPatterns(config, opts).join(\", \")} (cwd: ${cwd})`,\n );\n }\n if (usingStdin && opts.stdinContent === undefined) {\n throw new GraphError(\"graph build was given `-` but no stdin content.\");\n }\n\n const allPaths = new Set(usingStdin ? [...files, STDIN_PATH] : files);\n // Each page's body parse is cached across runs (`analyze-cache.ts`). Link\n // resolution against `allPaths` and `routes` still runs on every build.\n const cache = new AnalyzeCache(resolve(cwd, ANALYZE_CACHE_DIR));\n const analyzeOptions = {\n routes: routesFrom(config, base),\n ...(format === undefined ? {} : { format }),\n parse: cache.parse,\n };\n const read = files.map((path) =>\n analyzeDoc(readFileSync(resolve(base, path), \"utf8\"), path, allPaths, analyzeOptions),\n );\n if (usingStdin && opts.stdinContent !== undefined) {\n read.push(analyzeDoc(opts.stdinContent, STDIN_PATH, allPaths, analyzeOptions));\n }\n\n // A page's metadata is what `manni meta validate` reads: its frontmatter\n // plus every key a manifest of its collections owns (proposal 0047), merged\n // through meta's own merge. Read from meta's section of the same config the\n // output marks come from, so one file answers both.\n const view = await openMetaView(\n {\n ...(opts.config === undefined ? {} : { configPath: opts.config }),\n ...(opts.noConfig === undefined ? {} : { noConfig: opts.noConfig }),\n },\n cwd,\n files,\n base,\n );\n const merged = await withExternalMetadata(read, view);\n\n // What the graph carries is the schema's call (proposal 0051 §5): a top-level\n // field marked `x-manni-graph-output: false` is dropped here, before derivation,\n // and the schemas are the set `manni meta validate` resolves (proposal 0074),\n // so it reaches none of Turtle, JSON-LD, iiRDS or the search index. All four\n // read what `deriveGraph` produces, so one filter at the fan-in is the whole\n // mechanism; suppressing a field downstream would be triple surgery in four\n // places. It runs after the merge, so a field kept in a manifest is filtered\n // by the same mark as one kept on the page.\n const docs = await suppressGraphOutput(merged, view);\n\n // Page-level keys that look like harvest inputs but are not. The graph block\n // is schema-strict, so a typo there is a hard error; at the page level\n // nothing validates, and a near miss derives silently nothing (ADR 01028).\n const warnings: string[] = harvestWarnings(docs);\n // The git pass only feeds the provenance derive source, so the subprocess is\n // skipped entirely when that source is off. Otherwise git is *detected*\n // (proposal 0051 §6): history is used wherever git can run over a\n // repository, and a run that would have used it and cannot says so once and\n // builds the rest — graph ADR 01010's degradation, without its switch.\n let gitHistory: Awaited<ReturnType<typeof collectGitHistory>> | undefined;\n if (config.build.derive.includes(\"provenance\")) {\n try {\n gitHistory = await collectGitHistory(base);\n } catch (e) {\n warnings.push(gitAbsentWarning(errorMessage(e)));\n }\n }\n\n // The termbase `manni term check` reads, from the same config, under the\n // `terms` derive source (proposal 0086 §1). Nothing registers a source\n // under a library call, and then the graph builds as it always did. A\n // termbase that cannot be read is `term check`'s failure to report, so the\n // graph warns once and builds the rest, as it does without git.\n const source = termLabelSource();\n let termbase: readonly TermLabel[] = [];\n if (config.build.derive.includes(\"terms\") && source !== undefined) {\n try {\n termbase = await source({\n cwd,\n ...(opts.config === undefined ? {} : { configPath: opts.config }),\n ...(opts.noConfig === true ? { noConfig: true } : {}),\n });\n } catch (e) {\n warnings.push(\n `the graph holds no termbase concepts: the termbase could not be read — ${errorMessage(e)}`,\n );\n }\n }\n\n const quads = deriveGraph(docs, {\n baseIri: config.baseIri,\n derive: config.build.derive,\n // The package version, stamped on the build agent (graph:version). One\n // package, one version: the tool no longer has one of its own.\n toolVersion: pkg.version,\n gitHistory,\n qualified: config.provenance.qualified,\n termbase,\n });\n const concept = `${NS.skos}Concept`;\n const concepts = {\n total: quads.filter((q) => q.p === RDF_TYPE && q.o.value === concept).length,\n fromTermbase: termConceptCount(termbase),\n };\n const turtle = emitTurtle(quads);\n await cache.flush();\n\n return { outPath, docs: docs.length, quads: quads.length, concepts, warnings, turtle };\n}\n","/**\n * The cross-run cache for page parses.\n *\n * Parsing the body is most of what `graph build` spends on a page, and most\n * pages do not change between runs. `manni check` builds the graph on every\n * agent stop, so the parse is cached: one JSON file per page label under\n * `.manni/graph/analyze-cache/`, overwritten when the page changes. The\n * cache therefore holds about one entry per page ever built here.\n *\n * Only `parseBody`'s output is stored, which is a pure function of the bytes\n * and the format. Frontmatter, link resolution against the corpus, routes,\n * the meta view and git history all run on every build, so nothing a cache\n * entry holds depends on another page or on the clock.\n *\n * A cache is an optimization: an unreadable, unparseable or malformed entry\n * is a miss, and a write that fails is dropped. Neither can fail a run.\n * Node-only: the runtime and embed bundles never import it.\n */\nimport { createHash } from \"node:crypto\";\nimport { mkdir } from \"node:fs/promises\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { writeTextAtomic } from \"../../shared/write-file.js\";\nimport pkg from \"../../../package.json\" with { type: \"json\" };\nimport { parseBody, type DocBody, type DocFormat } from \"./analyze.js\";\n\n/**\n * Where the cache lives, relative to the working directory, beside the\n * `fill` proposal cache (`.manni/graph/cache`) and the `embed` vector cache.\n */\nexport const ANALYZE_CACHE_DIR = \".manni/graph/analyze-cache\";\n\n/**\n * The entry format. Bump it when `parseBody` changes what it returns, so a\n * development build does not read entries an older parse wrote under the\n * same package version.\n */\nconst ENTRY_VERSION = 1;\n\nfunction sha256(text: string): string {\n return createHash(\"sha256\").update(text, \"utf8\").digest(\"hex\");\n}\n\nconst isStrings = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every((v) => typeof v === \"string\");\n\nfunction isSection(value: unknown): boolean {\n if (typeof value !== \"object\" || value === null) return false;\n const s = value as Record<string, unknown>;\n return (\n typeof s.slug === \"string\" &&\n typeof s.title === \"string\" &&\n typeof s.level === \"number\" &&\n typeof s.order === \"number\" &&\n (s.parentSlug === null || typeof s.parentSlug === \"string\")\n );\n}\n\nfunction isDocBody(value: unknown): value is DocBody {\n if (typeof value !== \"object\" || value === null) return false;\n const b = value as Record<string, unknown>;\n return (\n (b.firstH1 === undefined || typeof b.firstH1 === \"string\") &&\n Array.isArray(b.sections) &&\n b.sections.every(isSection) &&\n isStrings(b.linkTargets) &&\n isStrings(b.imageTargets) &&\n isStrings(b.codeLanguages)\n );\n}\n\nexport class AnalyzeCache {\n /** Pages this run served from the cache. */\n hits = 0;\n /** Pages this run parsed. */\n misses = 0;\n private readonly writes: Promise<void>[] = [];\n\n constructor(\n private readonly dir: string,\n private readonly version: string = pkg.version,\n ) {}\n\n /** `parseBody`, served from the entry for `path` when its key matches. */\n readonly parse = (content: string, path: string, format: DocFormat): DocBody => {\n const key = sha256(JSON.stringify([ENTRY_VERSION, this.version, format, path, content]));\n // Named by a digest, so a label's `..` or `:` cannot choose where it lands.\n const file = join(this.dir, `${sha256(path)}.json`);\n const cached = readEntry(file, key);\n if (cached !== undefined) {\n this.hits++;\n return cached;\n }\n const body = parseBody(content, path, format);\n this.misses++;\n this.writes.push(this.write(file, JSON.stringify({ key, body })));\n return body;\n };\n\n /** Wait for this run's writes. Never rejects. */\n async flush(): Promise<void> {\n await Promise.all(this.writes);\n }\n\n private async write(file: string, text: string): Promise<void> {\n try {\n await mkdir(this.dir, { recursive: true });\n await writeTextAtomic(file, text);\n } catch {\n // Best-effort: the next run parses this page again.\n }\n }\n}\n\nfunction readEntry(file: string, key: string): DocBody | undefined {\n try {\n const entry = JSON.parse(readFileSync(file, \"utf8\")) as unknown;\n if (typeof entry !== \"object\" || entry === null) return undefined;\n const { key: stored, body } = entry as Record<string, unknown>;\n return stored === key && isDocBody(body) ? body : undefined;\n } catch {\n return undefined;\n }\n}\n","/**\n * The termbase as the graph reads it (proposal 0086 §1): one concept per term\n * id, and one resolver every concept label in derivation goes through.\n *\n * A label resolves to a term by its label, then its id, then an alt-label,\n * ignoring case. The page's own language is tried first, then the same\n * primary language (`en` for `en-US`), then any. A `see:` entry is a\n * redirect, not a concept: it resolves to its target.\n */\nimport type { TermLabel } from \"../../shared/term-labels.js\";\nimport { canonicalLanguageTag } from \"./localizations.js\";\nimport { byCodeUnit } from \"./sort.js\";\n\n/** What a key names: a term id, or a redirect to resolve in turn. */\ntype Target = { id: string } | { see: string; language: string | undefined };\n\ninterface Key {\n language: string | undefined;\n target: Target;\n}\n\nexport interface TermIndex {\n /** Each concept's entries, one per language, keyed by id in code-unit order. */\n groups: ReadonlyMap<string, readonly TermLabel[]>;\n /** The `see:` entries, in a stable order. */\n redirects: readonly TermLabel[];\n /** The term id a label names, or `undefined` for a freeform label. */\n resolve(label: string, language?: string): string | undefined;\n}\n\n/** A term's or a page's language, canonical, or `undefined` when it has none. */\nexport function canonicalLanguage(tag: string | undefined): string | undefined {\n return tag === undefined || tag === \"\" ? undefined : canonicalLanguageTag(tag);\n}\n\n// `split` always yields at least one element; the `?? \"\"` only satisfies the\n// index type.\nconst primary = (tag: string): string => (tag.split(\"-\")[0] ?? \"\").toLowerCase();\n\n/** A redirect chain longer than this is a loop, and names nothing. */\nconst MAX_REDIRECTS = 8;\n\n/**\n * Each termbase's index, by the array it was built from: one `graph build`\n * asks for it twice (the concept count and the derivation), and builds it once.\n */\nconst built = new WeakMap<readonly TermLabel[], TermIndex>();\n\nexport function termIndex(terms: readonly TermLabel[]): TermIndex {\n const cached = built.get(terms);\n if (cached !== undefined) return cached;\n const index = buildTermIndex(terms);\n built.set(terms, index);\n return index;\n}\n\nfunction buildTermIndex(terms: readonly TermLabel[]): TermIndex {\n const sorted = [...terms]\n .map((t) => ({ term: t, language: canonicalLanguage(t.language) }))\n .sort(\n (a, b) =>\n byCodeUnit(a.term.id, b.term.id) ||\n byCodeUnit(a.language ?? \"\", b.language ?? \"\") ||\n byCodeUnit(a.term.label, b.term.label),\n );\n\n const groups = new Map<string, TermLabel[]>();\n const redirects: TermLabel[] = [];\n const byLabel = new Map<string, Key[]>();\n const byId = new Map<string, Key[]>();\n const byAlt = new Map<string, Key[]>();\n const put = (map: Map<string, Key[]>, value: string, key: Key) => {\n const k = value.toLowerCase();\n const list = map.get(k);\n if (list) list.push(key);\n else map.set(k, [key]);\n };\n\n for (const { term, language } of sorted) {\n const target: Target =\n term.see === undefined ? { id: term.id } : { see: term.see, language };\n if (term.see === undefined) {\n const group = groups.get(term.id);\n if (group) group.push(term);\n else groups.set(term.id, [term]);\n } else {\n redirects.push(term);\n }\n put(byLabel, term.label, { language, target });\n put(byId, term.id, { language, target });\n for (const alt of term.altLabels ?? []) put(byAlt, alt, { language, target });\n }\n\n const tiers = [byLabel, byId, byAlt];\n\n const resolve = (label: string, language: string | undefined, depth: number): string | undefined => {\n const wanted = canonicalLanguage(language);\n const passes: Array<(k: Key) => boolean> =\n wanted === undefined\n ? [() => true]\n : [\n (k) => k.language === wanted,\n (k) => k.language !== undefined && primary(k.language) === primary(wanted),\n () => true,\n ];\n const needle = label.toLowerCase();\n for (const pass of passes) {\n for (const tier of tiers) {\n const hit = tier.get(needle)?.find(pass);\n if (hit === undefined) continue;\n if (\"id\" in hit.target) return hit.target.id;\n if (depth >= MAX_REDIRECTS) return undefined;\n return resolve(hit.target.see, hit.target.language ?? wanted, depth + 1);\n }\n }\n return undefined;\n };\n\n return {\n groups,\n redirects,\n resolve: (label, language) => (groups.size === 0 ? undefined : resolve(label, language, 0)),\n };\n}\n","/**\n * Graph derivation: DocModel[] → deduplicated Quad[]. This file is the\n * vocabulary mapping — the deterministic rules for what documentation\n * structure becomes which triples.\n */\nimport type { DocModel } from \"../types.js\";\nimport type { TermLabel } from \"../../shared/term-labels.js\";\nimport { canonicalLanguage, termIndex } from \"./concepts.js\";\nimport type { DeriveSource } from \"./config.js\";\nimport type { GitHistory } from \"./git.js\";\nimport { hasScheme, resolveRelative } from \"./analyze.js\";\nimport type { AgentKind } from \"./iri.js\";\nimport {\n conceptSlug,\n encodeSegment,\n mintAgentIri,\n mintBuildActivityIri,\n mintConceptIri,\n mintDocIri,\n mintGraphIri,\n mintProductIri,\n mintSchemeIri,\n mintSectionIri,\n mintTermConceptIri,\n normalizeDocPath,\n} from \"./iri.js\";\nimport { readSampleQuestions } from \"./questions.js\";\nimport { byCodeUnit } from \"./sort.js\";\nimport { NS, RDF_TYPE, ROLE } from \"./vocab.js\";\nimport {\n GRAPH_NOT_APPLICABLE_TO_VARIANT,\n GRAPH_NOT_SOFTWARE_SUBJECT,\n IIRDS_HAS_SUBJECT,\n IIRDS_HAS_TOPIC_TYPE,\n IIRDS_PRODUCT_VARIANT,\n IIRDS_RELATES_TO_LIFECYCLE_PHASE,\n IIRDS_RELATES_TO_PRODUCT_VARIANT,\n PAGE_TYPE_TO_TOPIC_TYPE,\n SOFTWARE_LIFECYCLE_IRIS,\n SOFTWARE_SUBJECT_IRIS,\n TOPIC_TYPE_IRIS,\n} from \"./iirds.js\";\n\n/**\n * Resolve a provenance target (a `graph.derived-from` / `graph.revision-of`\n * entry) to a corpus doc path: doc-relative first, then repo-relative; null\n * when neither names a discovered doc.\n */\nfunction resolveProvDocPath(\n docPath: string,\n raw: string,\n docByPath: ReadonlyMap<string, DocModel>,\n): string | null {\n const docRelative = resolveRelative(docPath, raw);\n if (docRelative !== null && docByPath.has(docRelative)) return docRelative;\n const repoRelative = normalizeDocPath(raw);\n return docByPath.has(repoRelative) ? repoRelative : null;\n}\n\nexport type Term =\n | { kind: \"iri\"; value: string }\n | {\n kind: \"literal\";\n value: string;\n datatype?: string;\n /** A language tag, for a literal that carries one. Never set with `datatype`. */\n language?: string;\n };\n\nexport interface Quad {\n s: string;\n p: string;\n o: Term;\n}\n\nexport interface DeriveOptions {\n baseIri: string;\n derive: DeriveSource[];\n /** dockg's own version, stamped on the build agent (provenance source). */\n toolVersion?: string;\n /** Per-file git history; set only under `provenance.git`. */\n gitHistory?: GitHistory;\n /** Emit qualified attribution/association nodes (`provenance.qualified`). */\n qualified?: boolean;\n /**\n * The termbase, as the family term source reads it (proposal 0086 §1).\n * Read only under the `terms` derive source.\n */\n termbase?: readonly TermLabel[];\n}\n\n/**\n * How many concepts the termbase contributes: one per term id. A `see:`\n * entry is a redirect, not a concept.\n */\nexport function termConceptCount(termbase: readonly TermLabel[]): number {\n return termIndex(termbase).groups.size;\n}\n\n/** A SKOS hierarchy predicate and the one emitted back from its object. */\nconst INVERSE = {\n broader: \"narrower\",\n narrower: \"broader\",\n related: \"related\",\n} as const;\n\n/** The one concept scheme's title (proposal 0086). */\nexport const CONCEPT_SCHEME_TITLE = \"manni graph concepts\";\n\nconst iri = (value: string): Term => ({ kind: \"iri\", value });\nconst lit = (value: string): Term => ({ kind: \"literal\", value });\nconst typedLit = (value: string, datatype: string): Term => ({\n kind: \"literal\",\n value,\n datatype,\n});\n\nconst DATE_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst DATETIME_RE = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}/;\n\n/** Type a frontmatter date value; plain literal when unrecognized. */\nfunction dateTerm(value: string): Term {\n if (DATE_RE.test(value)) return typedLit(value, `${NS.xsd}date`);\n if (DATETIME_RE.test(value)) return typedLit(value, `${NS.xsd}dateTime`);\n return lit(value);\n}\n\nfunction asString(v: unknown): string | undefined {\n if (typeof v === \"string\" && v.length > 0) return v;\n if (typeof v === \"number\") return String(v);\n // TOML frontmatter yields Date instances (smol-toml TomlDate). String(date)\n // is locale/timezone-dependent and would break byte-identical output;\n // ISO 8601 is stable everywhere.\n if (v instanceof Date) {\n return Number.isNaN(v.getTime()) ? undefined : v.toISOString();\n }\n return undefined;\n}\n\nfunction asStringArray(v: unknown): string[] {\n if (typeof v === \"string\") return v.length > 0 ? [v] : [];\n if (Array.isArray(v)) {\n return v.flatMap((item) => {\n const s = asString(item);\n return s === undefined ? [] : [s];\n });\n }\n return [];\n}\n\n/**\n * The names in an `author`/`authors` value. Stewardship allows a name, a\n * person object with a `name` (the MyST and Docusaurus shape), or a list of\n * either. A person object with no name names no one.\n */\nfunction asPersonNames(v: unknown): string[] {\n const one = (item: unknown): string[] => {\n const name =\n item != null && typeof item === \"object\" && !Array.isArray(item)\n ? asString(asRecord(item).name)\n : asString(item);\n return name === undefined ? [] : [name];\n };\n return Array.isArray(v) ? v.flatMap(one) : one(v);\n}\n\n/** A plain object as a string-keyed record; anything else becomes `{}`. */\nfunction asRecord(v: unknown): Record<string, unknown> {\n return v != null && typeof v === \"object\" && !Array.isArray(v)\n ? (v as Record<string, unknown>)\n : {};\n}\n\n/** First defined frontmatter value among aliases. */\nfunction fmValue(fm: Record<string, unknown>, keys: string[]): unknown {\n for (const key of keys) {\n if (fm[key] !== undefined && fm[key] !== null) return fm[key];\n }\n return undefined;\n}\n\n/** PROV-O's three prov:Agent subclasses, and their IRI path segments. */\ntype ProvAgentClass = \"Person\" | \"Organization\" | \"SoftwareAgent\";\n\nconst AGENT_KIND: Record<ProvAgentClass, AgentKind> = {\n Person: \"person\",\n Organization: \"org\",\n SoftwareAgent: \"software\",\n};\n\n/** The `graph` block of frontmatter, or undefined. */\nfunction graphBlock(\n fm: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const block = fm[\"graph\"];\n return block && typeof block === \"object\" && !Array.isArray(block)\n ? (block as Record<string, unknown>)\n : undefined;\n}\n\n/**\n * The harvest rule (ADR 01024): **deeper wins; the page level is the fallback**\n * — per fact, not per page. A `graph` block that speaks to a fact owns it\n * outright; where the block is silent, the page-level twin feeds the graph.\n *\n * Only the facts the `graph` block has a twin for are resolved here. Page-level\n * `prerequisites` / `next-steps` / `related-pages` belong to `docmeta:structure`\n * and are deliberately not harvested — that is a separate vocabulary, not this\n * one's fallback.\n *\n * Returns a graph-shaped object even when the page carries no `graph` block at\n * all, so a page typed only at the top level still derives its iiRDS typing.\n */\nfunction resolveGraph(\n block: Record<string, unknown> | undefined,\n fm: Record<string, unknown>,\n): Record<string, unknown> {\n const k: Record<string, unknown> = { ...(block ?? {}) };\n\n const fallback = (key: string, pageKeys: string[]) => {\n if (k[key] !== undefined && k[key] !== null) return;\n const pageValue = fmValue(fm, pageKeys);\n if (pageValue !== undefined) k[key] = pageValue;\n };\n\n fallback(\"concepts\", [\"concepts\"]);\n fallback(\"applies-to\", [\"applies-to\"]);\n fallback(\"not-applicable-to\", [\"not-applicable-to\"]);\n fallback(\"revision-of\", [\"supersedes\"]);\n\n // `type` is the one fact whose two altitudes speak different vocabularies:\n // the page's is open (docmeta:core), `graph.type` is the closed iiRDS enum. A\n // page type with no iiRDS counterpart derives nothing rather than inventing\n // one.\n if (k[\"type\"] === undefined || k[\"type\"] === null) {\n const pageType = asString(fmValue(fm, [\"type\"]));\n // hasOwn guards the prototype chain: `type: constructor` would otherwise\n // resolve to Object and pass the truthiness check below, writing a\n // function into graph.type.\n const derived =\n pageType && Object.hasOwn(PAGE_TYPE_TO_TOPIC_TYPE, pageType)\n ? PAGE_TYPE_TO_TOPIC_TYPE[pageType]\n : undefined;\n if (derived) k[\"type\"] = derived;\n }\n\n return k;\n}\n\n/**\n * The mapping entries of a `provenance` / `meta-provenance` list. Both are\n * lists of entries keyed by `generated-by` (proposal 0046), and a list is all\n * either of them may be — anything else names no machine, so it derives\n * nothing rather than being guessed at.\n *\n * Not `metaProvenanceEntries` from meta's barrel: that reader narrows an entry\n * to its model, `fields` and `evals`, and the harvest also needs `confidence`,\n * which it drops.\n */\nfunction recordEntries(value: unknown): Array<Record<string, unknown>> {\n if (!Array.isArray(value)) return [];\n return value.filter(\n (e): e is Record<string, unknown> =>\n !!e && typeof e === \"object\" && !Array.isArray(e),\n );\n}\n\n/** A JSON Pointer's reference tokens, each unescaped per RFC 6901. */\nfunction pointerSegments(pointer: string): string[] {\n return pointer\n .split(\"/\")\n .slice(1)\n .map((s) => s.replace(/~1/g, \"/\").replace(/~0/g, \"~\"));\n}\n\nexport function deriveGraph(docs: DocModel[], options: DeriveOptions): Quad[] {\n const { baseIri } = options;\n const sources = new Set(options.derive);\n const quads: Quad[] = [];\n const add = (s: string, p: string, o: Term) => quads.push({ s, p, o });\n /**\n * Concept IRIs minted while deriving. A set rather than a flag because\n * `concept()` is a closure: a captured `let` assigned only inside one stays\n * narrowed to its initializer at the read below, which would make the\n * scheme node unreachable as far as the compiler is concerned.\n */\n const mintedConcepts = new Set<string>();\n const terms = termIndex(sources.has(\"terms\") ? (options.termbase ?? []) : []);\n\n /**\n * The concept a label names (proposal 0086 §1). A label the termbase\n * defines names that term's concept, which the termbase pass below emits,\n * so the reference adds no label of its own. Any other label is a freeform\n * concept, minted from its slug with the label as its prefLabel.\n */\n const concept = (label: string, language?: string): string => {\n const id = terms.resolve(label, language);\n if (id !== undefined) return mintTermConceptIri(baseIri, id);\n const c = mintConceptIri(baseIri, label);\n add(c, RDF_TYPE, iri(`${NS.skos}Concept`));\n add(c, `${NS.skos}prefLabel`, lit(label));\n add(c, `${NS.skos}inScheme`, iri(mintSchemeIri(baseIri)));\n mintedConcepts.add(c);\n return c;\n };\n\n /** One hierarchy edge, emitted both ways round. */\n const hierarchy = (s: string, relation: keyof typeof INVERSE, o: string) => {\n add(s, `${NS.skos}${relation}`, iri(o));\n add(o, `${NS.skos}${INVERSE[relation]}`, iri(s));\n };\n\n /** ProductVariant node (type + label); returns its IRI. Positive and\n * negative applicability converge on one node per label. */\n const variantNode = (label: string): string => {\n const variant = mintProductIri(baseIri, label);\n add(variant, RDF_TYPE, iri(IIRDS_PRODUCT_VARIANT));\n add(variant, `${NS.dcterms}title`, lit(label));\n return variant;\n };\n\n /**\n * Emit the iiRDS typing fields (type, applies-to, about-product-lifecycle,\n * about-product-aspect) plus the negative-scope fields (not-applicable-to,\n * not-about-product-aspect) for `subjectIri` from a graph-like object. Shared\n * by the document `graph` block and the per-section `graph.sections` block so\n * the mapping cannot drift between them (ADR 01012/01013/01014).\n */\n const emitIirdsTyping = (subjectIri: string, k: Record<string, unknown>) => {\n const topicType = asString(k[\"type\"]);\n const topicTypeIri = topicType && TOPIC_TYPE_IRIS[topicType];\n if (topicTypeIri) add(subjectIri, IIRDS_HAS_TOPIC_TYPE, iri(topicTypeIri));\n\n for (const label of asStringArray(k[\"applies-to\"])) {\n add(\n subjectIri,\n IIRDS_RELATES_TO_PRODUCT_VARIANT,\n iri(variantNode(label)),\n );\n }\n for (const label of asStringArray(k[\"not-applicable-to\"])) {\n add(subjectIri, GRAPH_NOT_APPLICABLE_TO_VARIANT, iri(variantNode(label)));\n }\n\n for (const value of asStringArray(k[\"about-product-lifecycle\"])) {\n const phase = SOFTWARE_LIFECYCLE_IRIS[value];\n if (phase) add(subjectIri, IIRDS_RELATES_TO_LIFECYCLE_PHASE, iri(phase));\n }\n for (const value of asStringArray(k[\"about-product-aspect\"])) {\n const subject = SOFTWARE_SUBJECT_IRIS[value];\n if (subject) add(subjectIri, IIRDS_HAS_SUBJECT, iri(subject));\n }\n for (const value of asStringArray(k[\"not-about-product-aspect\"])) {\n const subject = SOFTWARE_SUBJECT_IRIS[value];\n if (subject) add(subjectIri, GRAPH_NOT_SOFTWARE_SUBJECT, iri(subject));\n }\n };\n\n const docByPath = new Map(docs.map((d) => [normalizeDocPath(d.path), d]));\n const prov = sources.has(\"provenance\");\n\n /**\n * Agent node; dedupe converges repeats of the same name AND kind. The IRI\n * is segmented by kind (`agent/person/…`, `agent/software/…`) so a human\n * and a model whose names slug alike stay distinct nodes.\n */\n const agentNode = (name: string, type: ProvAgentClass): string => {\n const a = mintAgentIri(baseIri, AGENT_KIND[type], name);\n add(a, RDF_TYPE, iri(`${NS.prov}${type}`));\n add(a, `${NS.foaf}name`, lit(name));\n return a;\n };\n\n const qualified = options.qualified === true;\n\n // Qualification node IRIs use \".\" separators (github-slugger can never emit\n // a dot, so heading slugs cannot collide) and carry the agent slug, so two\n // agents on one activity/doc never merge into a single node.\n\n /** doc ↔ author qualification: {docIri}#prov.attribution.{agentSlug}. */\n const qualifyAttribution = (\n docIri: string,\n agentIri: string,\n name: string,\n ): void => {\n if (!qualified) return;\n const node = `${docIri}#prov.attribution.${conceptSlug(name)}`;\n add(docIri, `${NS.prov}qualifiedAttribution`, iri(node));\n add(node, RDF_TYPE, iri(`${NS.prov}Attribution`));\n add(node, `${NS.prov}agent`, iri(agentIri));\n add(node, `${NS.prov}hadRole`, iri(ROLE.author));\n };\n\n /** activity ↔ agent qualification: {activityIri}.assoc.{agentSlug}. */\n const qualifyAssociation = (\n activityIri: string,\n agentIri: string,\n role: string,\n ): void => {\n if (!qualified) return;\n const agentSlug = agentIri.slice(agentIri.lastIndexOf(\"/\") + 1);\n const node = `${activityIri}.assoc.${agentSlug}`;\n add(activityIri, `${NS.prov}qualifiedAssociation`, iri(node));\n add(node, RDF_TYPE, iri(`${NS.prov}Association`));\n add(node, `${NS.prov}agent`, iri(agentIri));\n add(node, `${NS.prov}hadRole`, iri(role));\n };\n\n /** Author agent + creator/attribution edges (+ qualification when on). */\n const attributeAuthor = (docIri: string, name: string): void => {\n const a = agentNode(name, \"Person\");\n add(docIri, `${NS.dcterms}creator`, iri(a));\n add(docIri, `${NS.prov}wasAttributedTo`, iri(a));\n qualifyAttribution(docIri, a, name);\n };\n\n /**\n * Shared mapping for graph.derived-from / graph.revision-of / page\n * `translation-of` entries.\n *\n * `inverse`, when given, is also emitted back from the resolved target — but\n * only for a target inside the corpus. A URL names a resource dockg has not\n * analyzed and does not speak for, so it gains an inbound edge and never an\n * outbound claim (ADR 01037).\n */\n const provTargetEdge = (\n doc: DocModel,\n docIri: string,\n raw: string,\n predicate: string,\n inverse?: string,\n ): void => {\n if (hasScheme(raw)) {\n add(docIri, predicate, iri(raw));\n return;\n }\n const target = resolveProvDocPath(\n normalizeDocPath(doc.path),\n raw,\n docByPath,\n );\n if (target) {\n const targetIri = mintDocIri(baseIri, target);\n add(docIri, predicate, iri(targetIri));\n if (inverse) add(targetIri, inverse, iri(docIri));\n } else {\n add(docIri, `${NS.graph}brokenLink`, lit(raw));\n }\n };\n\n for (const doc of docs) {\n const docIri = mintDocIri(baseIri, doc.path);\n const fm = doc.frontmatter;\n const block = graphBlock(fm);\n // `block` is the `graph` block as written (block-only facts: sections,\n // provenance, the SKOS hierarchy); `harvested` folds in the page-level\n // fallbacks.\n const harvested = resolveGraph(block, fm);\n // The page's own key outranks the route it sits under (ADR 01037): a\n // single English page inside a translated tree can correct its label,\n // and a corpus that declares nothing keeps deriving nothing.\n const pageLanguage = canonicalLanguage(\n asString(fmValue(fm, [\"lang\", \"language\"])) ?? doc.routeLanguage,\n );\n let createdEmitted = false;\n let modifiedEmitted = false;\n\n add(docIri, RDF_TYPE, iri(`${NS.graph}Document`));\n if (prov) add(docIri, RDF_TYPE, iri(`${NS.prov}Entity`));\n add(docIri, `${NS.graph}path`, lit(normalizeDocPath(doc.path)));\n // Intrinsic like path, not gated behind a derive source (ADR 01036): a hash\n // present only sometimes cannot tell \"unchanged\" from \"not stamped\", which\n // is the whole question it exists to answer.\n add(docIri, `${NS.graph}contentHash`, lit(doc.contentHash));\n\n if (sources.has(\"frontmatter\")) {\n const title = asString(fmValue(fm, [\"title\"])) ?? doc.firstH1;\n if (title) add(docIri, `${NS.dcterms}title`, lit(title));\n\n const description = asString(fmValue(fm, [\"description\"]));\n if (description)\n add(docIri, `${NS.dcterms}description`, lit(description));\n\n for (const author of asPersonNames(fmValue(fm, [\"author\", \"authors\"]))) {\n if (prov) {\n attributeAuthor(docIri, author);\n } else {\n add(docIri, `${NS.dcterms}creator`, lit(author));\n }\n }\n\n // Stewardship's spelling first (`created`, `last-updated`), then the\n // aliases other generators write. One value per predicate: the first\n // key present wins and the rest are ignored.\n const created = asString(fmValue(fm, [\"created\", \"date\"]));\n if (created) {\n add(docIri, `${NS.dcterms}created`, dateTerm(created));\n if (prov) add(docIri, `${NS.prov}generatedAtTime`, dateTerm(created));\n createdEmitted = true;\n }\n\n const modified = asString(\n fmValue(fm, [\"last-updated\", \"updated\", \"lastmod\", \"modified\"]),\n );\n if (modified) {\n add(docIri, `${NS.dcterms}modified`, dateTerm(modified));\n modifiedEmitted = true;\n }\n\n // Written in its canonical spelling: tags are case-insensitive, and\n // `en-us` beside `en-US` would otherwise split one locale into two\n // indexes and miss a `--lang` filter typed the other way.\n if (pageLanguage) add(docIri, `${NS.dcterms}language`, lit(pageLanguage));\n\n // ai-context's questions this page should be found for (proposal 0086\n // §7), in the page's language. Only the text: an item's answer pins and\n // review state are test data `check` reads from the source (0087).\n for (const { question } of readSampleQuestions(fmValue(fm, [\"sample-questions\"]))) {\n add(\n docIri,\n `${NS.graph}sampleQuestion`,\n pageLanguage\n ? { kind: \"literal\", value: question, language: pageLanguage }\n : lit(question),\n );\n }\n\n // Page-level only: the `graph` block is closed and carries no\n // translation key, so this fact lives at the altitude `lang` already\n // does (ADR 01023, ADR 01037). Both directions are materialized, so\n // \"every localization of this page\" is one lookup for a consumer with no\n // inbound index of its own.\n for (const raw of asStringArray(fmValue(fm, [\"translation-of\"]))) {\n provTargetEdge(\n doc,\n docIri,\n raw,\n `${NS.schema}translationOfWork`,\n `${NS.schema}workTranslation`,\n );\n }\n\n // The graph block: the SKOS hierarchy has no page-level twin, so it reads\n // the block as written (frontmatter key `graph`, RDF prefix `graph:`).\n const blockLabel = block ? asString(block[\"label\"]) : undefined;\n if (block) {\n if (blockLabel) {\n const topic = concept(blockLabel, pageLanguage);\n add(docIri, `${NS.foaf}primaryTopic`, iri(topic));\n for (const alt of asStringArray(block[\"alt-labels\"])) {\n add(topic, `${NS.skos}altLabel`, lit(alt));\n }\n // Frontmatter key → SKOS predicate. `related-concepts` is spelled for\n // what it points at (in step with the page-level `related-pages`);\n // the predicate it emits is still plain skos:related.\n for (const [key, predicate] of [\n [\"broader\", \"broader\"],\n [\"narrower\", \"narrower\"],\n [\"related-concepts\", \"related\"],\n ] as const) {\n for (const value of asStringArray(block[key])) {\n hierarchy(topic, predicate, concept(value, pageLanguage));\n }\n }\n }\n }\n\n // A term page is about its term (proposal 0086 §1), unless its `graph`\n // block names a topic of its own. Its id names the term, and its label\n // does when the id is absent or names no term.\n if (!blockLabel && asString(fm[\"type\"]) === \"term\") {\n const id = asString(fm[\"id\"]);\n const label = asString(fm[\"label\"]);\n const termId =\n (id !== undefined && terms.groups.has(id) ? id : undefined) ??\n (label === undefined ? undefined : terms.resolve(label, pageLanguage));\n if (termId !== undefined) {\n add(docIri, `${NS.foaf}primaryTopic`, iri(mintTermConceptIri(baseIri, termId)));\n }\n }\n\n // iiRDS Core + Software typing (ADR 01012), over the harvested block so a\n // page typed only at the top level still types its document (ADR 01024).\n emitIirdsTyping(docIri, harvested);\n }\n\n if (sources.has(\"tags\")) {\n // Two distinct facts, both landing on dcterms:subject: dockg's own\n // tag harvest (`tags`/`keywords`), and the concepts fact — where\n // `graph.concepts` beats the page-level `concepts` outright rather than\n // adding to it (ADR 01024).\n const labels = [\n ...asStringArray(fmValue(fm, [\"tags\", \"keywords\"])),\n ...asStringArray(harvested[\"concepts\"]),\n ];\n for (const label of labels) {\n add(docIri, `${NS.dcterms}subject`, iri(concept(label, pageLanguage)));\n }\n }\n\n if (sources.has(\"sections\")) {\n // graph.sections: slug-keyed iiRDS typing attached to section nodes\n // (ADR 01013). Explicit-only — a section gets nothing from the doc.\n const sectionMeta = asRecord(block?.[\"sections\"]);\n const sectionSlugs = new Set(doc.sections.map((s) => s.slug));\n\n for (const section of doc.sections) {\n const secIri = mintSectionIri(docIri, section.slug);\n const parentIri = section.parentSlug\n ? mintSectionIri(docIri, section.parentSlug)\n : docIri;\n add(secIri, RDF_TYPE, iri(`${NS.graph}Section`));\n add(secIri, `${NS.dcterms}title`, lit(section.title));\n add(\n secIri,\n `${NS.graph}level`,\n typedLit(String(section.level), `${NS.xsd}integer`),\n );\n add(\n secIri,\n `${NS.graph}order`,\n typedLit(String(section.order), `${NS.xsd}integer`),\n );\n add(parentIri, `${NS.dcterms}hasPart`, iri(secIri));\n\n const meta = asRecord(sectionMeta[section.slug]);\n emitIirdsTyping(secIri, meta);\n for (const label of asStringArray(meta[\"concepts\"])) {\n add(secIri, `${NS.dcterms}subject`, iri(concept(label, pageLanguage)));\n }\n }\n\n // A graph.sections key naming no heading is a broken reference (surfaced\n // by stats, gated by stats --check) — never a silent drop.\n for (const slug of Object.keys(sectionMeta)) {\n if (!sectionSlugs.has(slug)) {\n add(docIri, `${NS.graph}brokenSectionRef`, lit(slug));\n }\n }\n }\n\n if (sources.has(\"links\")) {\n for (const link of doc.links) {\n if (link.kind === \"external\" && link.url) {\n add(docIri, `${NS.dcterms}references`, iri(link.url));\n } else if (link.kind === \"internal\" && link.resolvedPath) {\n const targetIri = mintDocIri(baseIri, link.resolvedPath);\n const target = docByPath.get(link.resolvedPath);\n // Bound first, so the anchor the test found is the anchor the IRI is\n // minted from rather than a second read the type cannot connect to\n // the first.\n const anchor = link.anchor;\n const anchorResolves =\n anchor !== undefined &&\n target !== undefined &&\n target.sections.some((s) => s.slug === anchor);\n add(\n docIri,\n `${NS.dcterms}references`,\n iri(\n anchorResolves ? mintSectionIri(targetIri, anchor) : targetIri,\n ),\n );\n } else if (link.kind === \"broken\") {\n add(docIri, `${NS.graph}brokenLink`, lit(link.raw));\n }\n }\n }\n\n if (sources.has(\"images\")) {\n for (const image of doc.images) {\n const target = image.external\n ? image.target\n : `${baseIri}file/${normalizeDocPath(image.target)\n .split(\"/\")\n .map(encodeSegment)\n .join(\"/\")}`;\n add(docIri, `${NS.schema}image`, iri(target));\n }\n }\n\n if (sources.has(\"code\")) {\n for (const language of doc.codeLanguages) {\n add(docIri, `${NS.graph}codeLanguage`, lit(language));\n }\n }\n\n if (prov) {\n // graph.derived-from / graph.revision-of: doc-relative path,\n // repo-relative path, or URL — one shared resolution. `derived-from` is block-only\n // (document lineage is curated by hand); `revision-of` harvests the\n // page-level `supersedes` when the block is silent (ADR 01024).\n for (const raw of block ? asStringArray(block[\"derived-from\"]) : []) {\n provTargetEdge(doc, docIri, raw, `${NS.prov}wasDerivedFrom`);\n }\n for (const raw of asStringArray(harvested[\"revision-of\"])) {\n provTargetEdge(doc, docIri, raw, `${NS.prov}wasRevisionOf`);\n }\n\n // Per-file git history (provenance.git): frontmatter always wins on\n // dates; authors merge; renames become revision edges to the\n // historical-path entities.\n const gitFile = options.gitHistory?.files.get(normalizeDocPath(doc.path));\n if (gitFile) {\n if (!createdEmitted && gitFile.created) {\n add(docIri, `${NS.dcterms}created`, dateTerm(gitFile.created));\n add(docIri, `${NS.prov}generatedAtTime`, dateTerm(gitFile.created));\n }\n if (!modifiedEmitted && gitFile.modified) {\n add(docIri, `${NS.dcterms}modified`, dateTerm(gitFile.modified));\n }\n for (const author of gitFile.authors) {\n attributeAuthor(docIri, author);\n }\n for (const oldPath of gitFile.renamedFrom) {\n const oldIri = mintDocIri(baseIri, oldPath);\n add(docIri, `${NS.prov}wasRevisionOf`, iri(oldIri));\n add(oldIri, RDF_TYPE, iri(`${NS.prov}Entity`));\n }\n }\n\n // Whole-page generation. There is no page-level `generated-by` any more\n // (proposal 0046): the machines that wrote a page are the DISTINCT\n // `generated-by` values across its page-level `provenance` entries, each\n // of which pins a line range. The activity stays one per page, so a\n // single-model page emits exactly what it always did. Its fragment uses\n // a \".\" separator, which github-slugger can never produce — heading\n // slugs cannot collide with provenance fragments.\n const machines = [\n ...new Set(\n recordEntries(fmValue(fm, [\"provenance\"])).flatMap((e) => {\n const m = asString(e[\"generated-by\"]);\n return m === undefined ? [] : [m];\n }),\n ),\n ].sort(byCodeUnit);\n if (machines.length > 0) {\n const activity = `${docIri}#prov.generation`;\n add(docIri, `${NS.prov}wasGeneratedBy`, iri(activity));\n add(activity, RDF_TYPE, iri(`${NS.prov}Activity`));\n for (const machine of machines) {\n const model = agentNode(machine, \"SoftwareAgent\");\n add(activity, `${NS.prov}wasAssociatedWith`, iri(model));\n qualifyAssociation(activity, model, ROLE.generator);\n }\n }\n\n // Page-level `meta-provenance` (written by `manni graph fill`): one\n // activity PER MODEL so multiple fills by different models keep truthful\n // attribution. Only the doc's own topic concept is prov:generated —\n // shared subject/tag concepts are never attributed, or one doc's LLM\n // would taint every doc using the same tag.\n for (const entry of recordEntries(fmValue(fm, [\"meta-provenance\"]))) {\n const model = asString(entry[\"generated-by\"]);\n if (!model) continue;\n // A pointer names a value anywhere on the page, so only the ones under\n // `/graph/` are graph's business. The filled field is the first segment\n // after it: `/graph/sections/install/type` attributes `sections`, the\n // field a reviewer would look at. First pointer wins on confidence,\n // which 0046 keys by the whole pointer rather than by the field.\n const pointers = asStringArray(entry[\"fields\"]);\n const confidence = asRecord(entry[\"confidence\"]);\n const filled = new Map<string, string>();\n for (const pointer of pointers) {\n if (!pointer.startsWith(\"/graph/\")) continue;\n const field = pointerSegments(pointer)[1];\n if (field === undefined || field === \"\") continue;\n if (!filled.has(field)) filled.set(field, pointer);\n }\n if (filled.size === 0) continue;\n const activity = `${docIri}#prov.graph-fill.${conceptSlug(model)}`;\n const modelAgent = agentNode(model, \"SoftwareAgent\");\n add(activity, RDF_TYPE, iri(`${NS.prov}Activity`));\n add(activity, `${NS.prov}wasAssociatedWith`, iri(modelAgent));\n qualifyAssociation(activity, modelAgent, ROLE.generator);\n // Each filled field is reified as an entry node carrying its name and\n // (when fill recorded one) the model's confidence — a plain,\n // blank-node-free per-field audit edge (ADR 01015).\n for (const [field, pointer] of filled) {\n const fieldNode = `${activity}.field.${field}`;\n add(activity, `${NS.graph}filledFieldEntry`, iri(fieldNode));\n add(fieldNode, `${NS.graph}filledField`, lit(field));\n const c = confidence[pointer];\n if (typeof c === \"number\") {\n add(\n fieldNode,\n `${NS.graph}confidence`,\n typedLit(String(Math.round(c * 100) / 100), `${NS.xsd}decimal`),\n );\n }\n }\n const label = block ? asString(block[\"label\"]) : undefined;\n if (label && filled.has(\"label\")) {\n const id = terms.resolve(label, pageLanguage);\n add(\n activity,\n `${NS.prov}generated`,\n iri(\n id === undefined\n ? mintConceptIri(baseIri, label)\n : mintTermConceptIri(baseIri, id),\n ),\n );\n }\n }\n }\n }\n\n if (prov) {\n const graphIri = mintGraphIri(baseIri);\n const activity = mintBuildActivityIri(baseIri);\n const tool = agentNode(\"manni\", \"SoftwareAgent\");\n add(graphIri, RDF_TYPE, iri(`${NS.prov}Entity`));\n add(graphIri, `${NS.prov}wasGeneratedBy`, iri(activity));\n add(activity, RDF_TYPE, iri(`${NS.prov}Activity`));\n add(activity, `${NS.prov}wasAssociatedWith`, iri(tool));\n qualifyAssociation(activity, tool, ROLE.tool);\n if (options.toolVersion) {\n add(tool, `${NS.graph}version`, lit(options.toolVersion));\n }\n for (const doc of docs) {\n add(activity, `${NS.prov}used`, iri(mintDocIri(baseIri, doc.path)));\n }\n const headTime = options.gitHistory?.headTime;\n if (headTime) {\n add(\n activity,\n `${NS.prov}endedAtTime`,\n typedLit(headTime, `${NS.xsd}dateTime`),\n );\n }\n }\n\n // The termbase's concepts (proposal 0086 §1): one per id, each language of a\n // term joining it, and every label tagged with the term's language.\n const tagged = (value: string, language: string | undefined): Term =>\n language === undefined ? lit(value) : { kind: \"literal\", value, language };\n for (const [id, entries] of terms.groups) {\n const c = mintTermConceptIri(baseIri, id);\n add(c, RDF_TYPE, iri(`${NS.skos}Concept`));\n add(c, `${NS.skos}inScheme`, iri(mintSchemeIri(baseIri)));\n mintedConcepts.add(c);\n for (const entry of entries) {\n const language = canonicalLanguage(entry.language);\n add(c, `${NS.skos}prefLabel`, tagged(entry.label, language));\n for (const [values, predicate] of [\n [entry.altLabels, \"altLabel\"],\n [entry.hiddenLabels, \"hiddenLabel\"],\n [entry.definition, \"definition\"],\n [entry.scopeNote, \"scopeNote\"],\n ] as const) {\n for (const value of asStringArray(values)) {\n add(c, `${NS.skos}${predicate}`, tagged(value, language));\n }\n }\n for (const relation of [\"broader\", \"narrower\", \"related\"] as const) {\n for (const value of entry[relation] ?? []) {\n hierarchy(c, relation, concept(value, language));\n }\n }\n // A code and the mappings out of the scheme belong to no language.\n if (entry.notation !== undefined) add(c, `${NS.skos}notation`, lit(entry.notation));\n for (const [values, predicate] of [\n [entry.exactMatches, \"exactMatch\"],\n [entry.closeMatches, \"closeMatch\"],\n [entry.broadMatches, \"broadMatch\"],\n [entry.narrowMatches, \"narrowMatch\"],\n [entry.relatedMatches, \"relatedMatch\"],\n ] as const) {\n for (const value of values ?? []) add(c, `${NS.skos}${predicate}`, iri(value));\n }\n }\n }\n // A `see:` entry is no concept of its own. Its label is another way to say\n // its target, so it becomes an altLabel there.\n for (const entry of terms.redirects) {\n const language = canonicalLanguage(entry.language);\n const target =\n entry.see === undefined ? undefined : terms.resolve(entry.see, language);\n if (target === undefined) continue;\n add(\n mintTermConceptIri(baseIri, target),\n `${NS.skos}altLabel`,\n tagged(entry.label, language),\n );\n }\n\n if (mintedConcepts.size > 0) {\n const scheme = mintSchemeIri(baseIri);\n add(scheme, RDF_TYPE, iri(`${NS.skos}ConceptScheme`));\n add(scheme, `${NS.dcterms}title`, lit(CONCEPT_SCHEME_TITLE));\n // A concept with no broader concept is a top concept of the scheme, both\n // ways round. Read off the quads, so every source of hierarchy counts.\n const broader = `${NS.skos}broader`;\n const hasBroader = new Set(\n quads.filter((q) => q.p === broader).map((q) => q.s),\n );\n for (const c of mintedConcepts) {\n if (hasBroader.has(c)) continue;\n add(c, `${NS.skos}topConceptOf`, iri(scheme));\n add(scheme, `${NS.skos}hasTopConcept`, iri(c));\n }\n }\n\n return dedupe(quads);\n}\n\nfunction quadKey(q: Quad): string {\n const o =\n q.o.kind === \"iri\"\n ? `i:${q.o.value}`\n : `l:${q.o.value}|${q.o.datatype ?? \"\"}|${q.o.language ?? \"\"}`;\n return `${q.s}|${q.p}|${o}`;\n}\n\nfunction dedupe(quads: Quad[]): Quad[] {\n const seen = new Set<string>();\n const out: Quad[] = [];\n for (const q of quads) {\n const key = quadKey(q);\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(q);\n }\n return out;\n}\n","/**\n * Deterministic Turtle serialization — the git-diff contract. Canonical form:\n * fixed sorted prefix header; subjects sorted by full IRI; within a subject,\n * rdf:type first (as `a`), then predicates sorted by full IRI; objects sorted\n * (IRIs before literals, each lexicographic); LF line endings, UTF-8, exactly\n * one trailing newline. Byte-identical output for any input quad order.\n *\n * Deliberately not N3.Writer: its formatting is incidental library behavior.\n * Correctness of escaping is guarded by a round-trip test through n3's parser.\n */\nimport type { Quad, Term } from \"./derive.js\";\nimport { byCodeUnit } from \"./sort.js\";\nimport { NS, PREFIXES, RDF_TYPE } from \"./vocab.js\";\n\n/** Conservative PN_LOCAL: shorten only when the local name is trivially safe. */\nconst SAFE_LOCAL = /^[A-Za-z_][A-Za-z0-9_-]*$/;\n\n/**\n * Percent-encode characters the Turtle IRIREF production forbids\n * (controls, space, <>\"{}|^` and backslash) so output always parses,\n * whatever made it into a node value.\n */\n// Forbidden by IRIREF: <>\"{}|^ plus backtick and backslash.\nconst ILLEGAL_IRI_CHARS = '<>\"{}|^\\x60\\x5c';\n\nfunction sanitizeIri(iriValue: string): string {\n let out = \"\";\n for (const ch of iriValue) {\n const code = ch.codePointAt(0) as number;\n const illegal = code <= 0x20 || ILLEGAL_IRI_CHARS.includes(ch);\n out += illegal\n ? \"%\" + code.toString(16).toUpperCase().padStart(2, \"0\")\n : ch;\n }\n return out;\n}\n\n/**\n * Memo: the same predicates/objects recur once per quad; shorten each once.\n * Cleared at the start of every emit so long-lived embedders don't accumulate\n * every IRI ever serialized.\n */\nconst shortenMemo = new Map<string, string>();\n\nfunction shorten(iriValue: string): string {\n const memoized = shortenMemo.get(iriValue);\n if (memoized !== undefined) return memoized;\n let result: string | undefined;\n for (const [prefix, ns] of PREFIXES) {\n if (iriValue.startsWith(ns)) {\n const local = iriValue.slice(ns.length);\n if (SAFE_LOCAL.test(local)) {\n result = `${prefix}:${local}`;\n break;\n }\n }\n }\n result ??= `<${sanitizeIri(iriValue)}>`;\n shortenMemo.set(iriValue, result);\n return result;\n}\n\nfunction escapeLiteral(value: string): string {\n return value\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\");\n}\n\nconst INTEGER = `${NS.xsd}integer`;\nconst INTEGER_RE = /^-?\\d+$/;\n\nfunction renderTerm(term: Term): string {\n if (term.kind === \"iri\") return shorten(term.value);\n if (term.datatype === INTEGER && INTEGER_RE.test(term.value))\n return term.value;\n const quoted = `\"${escapeLiteral(term.value)}\"`;\n if (term.language) return `${quoted}@${term.language}`;\n return term.datatype ? `${quoted}^^${shorten(term.datatype)}` : quoted;\n}\n\n/** Sort objects: IRIs before literals, each lexicographically. */\nfunction compareTerms(a: Term, b: Term): number {\n if (a.kind !== b.kind) return a.kind === \"iri\" ? -1 : 1;\n const byValue = byCodeUnit(a.value, b.value);\n if (byValue !== 0) return byValue;\n const da = a.kind === \"literal\" ? (a.datatype ?? \"\") : \"\";\n const db = b.kind === \"literal\" ? (b.datatype ?? \"\") : \"\";\n const la = a.kind === \"literal\" ? (a.language ?? \"\") : \"\";\n const lb = b.kind === \"literal\" ? (b.language ?? \"\") : \"\";\n return byCodeUnit(da, db) || byCodeUnit(la, lb);\n}\n\nexport function emitTurtle(quads: Quad[]): string {\n shortenMemo.clear();\n const lines: string[] = [];\n for (const [prefix, ns] of PREFIXES) {\n lines.push(`@prefix ${prefix}: <${ns}> .`);\n }\n\n // subject → predicate → terms\n const subjects = new Map<string, Map<string, Term[]>>();\n for (const quad of quads) {\n let preds = subjects.get(quad.s);\n if (!preds) {\n preds = new Map();\n subjects.set(quad.s, preds);\n }\n let terms = preds.get(quad.p);\n if (!terms) {\n terms = [];\n preds.set(quad.p, terms);\n }\n terms.push(quad.o);\n }\n\n // Sorting the *entries* rather than the keys: each predicate map comes out\n // of the map with the subject it belongs to, and each term list with its\n // predicate, so nothing is looked up again and nothing has to be asserted.\n const sortedSubjects = [...subjects.entries()].sort(([a], [b]) =>\n byCodeUnit(a, b),\n );\n for (const [subject, preds] of sortedSubjects) {\n const sortedPreds = [...preds.entries()].sort(([a], [b]) => {\n if (a === RDF_TYPE) return b === RDF_TYPE ? 0 : -1;\n if (b === RDF_TYPE) return 1;\n return byCodeUnit(a, b);\n });\n\n const entries = sortedPreds.map(([p, terms], i) => {\n const objects = [...terms].sort(compareTerms).map(renderTerm).join(\", \");\n const pred = p === RDF_TYPE ? \"a\" : shorten(p);\n const terminator = i === sortedPreds.length - 1 ? \" .\" : \" ;\";\n return { pred, objects, terminator };\n });\n\n // A subject is in the map only because a quad put a predicate under it, so\n // `entries` is never empty; the destructuring says so and leaves the rest\n // of the block unreachable if it ever were.\n const [first, ...rest] = entries;\n if (first === undefined) continue;\n lines.push(\"\");\n lines.push(\n `${shorten(subject)} ${first.pred} ${first.objects}${first.terminator}`,\n );\n for (const entry of rest) {\n lines.push(` ${entry.pred} ${entry.objects}${entry.terminator}`);\n }\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n","/**\n * Near-miss detection for the page-level keys the harvest rule reads\n * (ADR 01024, ADR 01028).\n *\n * Five page-level keys are graph inputs — `type`, `concepts`, `applies-to`,\n * `not-applicable-to`, `supersedes` — and unlike the `graph` block, nothing\n * validates them. The `graph` block is `additionalProperties: false`, so a typo\n * inside it is a hard schema error; the same typo at the page level derives\n * silently nothing, because a page may legitimately carry any other key it\n * likes (a site generator's, a linter's, an author's).\n *\n * A schema is therefore the wrong instrument: rejecting unknown page keys would\n * reject every page. What is wrong with `applies_to` is not that dockg does not\n * know it — it is that it is one character from a key dockg *does* know, on a\n * page that declares nothing else of the kind. That is what this detects, and\n * it is the whole scope: dockg does not implement the vocabularies these keys\n * belong to and must not start claiming their facts (ADR 01024).\n *\n * Warnings only. A near miss is a suspicion, not a finding, and a suspicion\n * must never fail a build.\n */\nimport { PAGE_TYPE_TO_TOPIC_TYPE } from \"./iirds.js\";\nimport { byCodeUnit } from \"./sort.js\";\nimport type { DocModel } from \"../types.js\";\n\n/**\n * The page-level keys dockg reads, in the spelling it expects.\n *\n * Five are `resolveGraph`'s harvest inputs (ADR 01024). The localization three\n * are read straight by the emitter — `lang`/`language` into `dcterms:language`,\n * `translation-of` into the schema.org translation pair (ADR 01037) — and are\n * listed here for the same reason: a typo in any of them derives nothing while\n * looking exactly like a declared fact.\n */\nexport const HARVESTED_KEYS: readonly string[] = [\n \"applies-to\",\n \"concepts\",\n \"lang\",\n \"language\",\n \"not-applicable-to\",\n \"supersedes\",\n \"translation-of\",\n \"type\",\n];\n\n/**\n * Levenshtein distance, capped: anything past `max` returns `max + 1`, since\n * the caller only cares whether a candidate is *close*.\n */\nfunction distance(a: string, b: string, max: number): number {\n if (a === b) return 0;\n if (Math.abs(a.length - b.length) > max) return max + 1;\n let prev = Array.from({ length: b.length + 1 }, (_, i) => i);\n for (let i = 1; i <= a.length; i++) {\n const row = [i];\n for (let j = 1; j <= b.length; j++) {\n row[j] = Math.min(\n (prev[j] ?? 0) + 1,\n (row[j - 1] ?? 0) + 1,\n (prev[j - 1] ?? 0) + (a[i - 1] === b[j - 1] ? 0 : 1),\n );\n }\n prev = row;\n }\n return prev[b.length] ?? max + 1;\n}\n\n/**\n * The known name a candidate was probably meant to be, or undefined.\n *\n * Distance 1 for short names, 2 for longer ones: `type` and `types` differ by\n * one and mean different things, while `not-applicable-to` can absorb two typos\n * and still be unmistakable. Separator-only differences (`applies_to`,\n * `appliesTo`) normalize to an exact match and are always caught.\n */\nfunction nearestKnown(\n candidate: string,\n known: readonly string[],\n): string | undefined {\n // Split camelCase BEFORE lowercasing — doing it after is a no-op, because\n // there is no uppercase left to match. `appliesTo` then reaches `applies-to`\n // exactly, instead of relying on the distance fallback to rescue it, and\n // `notApplicabelTo` (two typos plus a case boundary) becomes reachable at\n // all.\n const normalize = (s: string): string =>\n s\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .toLowerCase()\n .replace(/[_\\s]+/g, \"-\");\n const c = normalize(candidate);\n for (const k of known) {\n if (c === normalize(k) && candidate !== k) return k;\n }\n let best: { key: string; d: number } | undefined;\n for (const k of known) {\n const max = k.length > 8 ? 2 : 1;\n const d = distance(c, normalize(k), max);\n if (d > max) continue;\n if (!best || d < best.d) best = { key: k, d };\n }\n return best?.key;\n}\n\n/**\n * Warnings for page-level keys and page `type` values that look like harvest\n * inputs but are not. Sorted, so the output is deterministic like everything\n * else dockg emits.\n */\nexport function harvestWarnings(docs: readonly DocModel[]): string[] {\n const out: string[] = [];\n const mappedTypes = Object.keys(PAGE_TYPE_TO_TOPIC_TYPE);\n\n for (const doc of docs) {\n const fm = doc.frontmatter;\n const present = new Set(Object.keys(fm));\n\n for (const key of present) {\n if (HARVESTED_KEYS.includes(key)) continue;\n const meant = nearestKnown(key, HARVESTED_KEYS);\n // Only suspicious if the page does not already declare the real key: a\n // page carrying both `applies-to` and `applies_to` has made its choice.\n if (meant === undefined || present.has(meant)) continue;\n out.push(\n `${doc.path}: page key \"${key}\" is not read by manni graph and looks like \"${meant}\" — nothing was derived from it`,\n );\n }\n\n // A page `type` outside the map derives nothing, by design: dockg\n // references iiRDS terms and never mints them. That is correct for\n // `blog-post`, and almost never what the author meant for `how to`.\n const type = fm[\"type\"];\n // Object.hasOwn, not `in`: `type: constructor` and `type: toString` walk\n // the prototype chain and would be read as mapped types, silently skipping\n // the check.\n if (\n typeof type === \"string\" &&\n !Object.hasOwn(PAGE_TYPE_TO_TOPIC_TYPE, type)\n ) {\n const meant = nearestKnown(type, mappedTypes);\n if (meant !== undefined) {\n out.push(\n `${doc.path}: page type \"${type}\" maps to no iiRDS topic type and looks like \"${meant}\" — no graph.type was derived`,\n );\n }\n }\n }\n\n return out.sort(byCodeUnit);\n}\n","/**\n * One-pass git history collection for provenance derivation. A single\n * `git log` subprocess covers the whole corpus: per-file creation and\n * last-modification committer dates, author names, and rename chains\n * (followed backward so history accrues to the file's current path).\n * Deterministic per commit — the wall clock never enters the result.\n *\n * Author emails are deliberately not collected into the result (privacy):\n * names only, matching frontmatter author handling.\n */\nimport { GraphError } from \"../types.js\";\nimport { realExec, type ExecFn } from \"@hawkeyexl/inference\";\nimport { posix } from \"node:path\";\nimport { normalizeDocPath } from \"./iri.js\";\n\nexport interface GitFileHistory {\n /** Committer ISO date of the oldest commit touching the file (or its earlier names). */\n created?: string;\n /** Committer ISO date of the newest commit touching it. */\n modified?: string;\n /** Unique author names, newest contribution first. */\n authors: string[];\n /** Earlier paths of this file, nearest rename first (git -M heuristic; best-effort). */\n renamedFrom: string[];\n}\n\nexport interface GitHistory {\n /** HEAD committer ISO date — stamps the build activity's prov:endedAtTime. */\n headTime?: string;\n files: Map<string, GitFileHistory>;\n}\n\n/**\n * Git versions print a UTC committer date from `%cI` as either `+00:00` or\n * `Z`. Both name the same instant, so one spelling keeps the graph identical\n * whichever git wrote it. Other offsets pass through unchanged.\n */\nexport function canonicalGitTime(time: string): string {\n return time.replace(/[+-]00:00$/, \"Z\");\n}\n\n/** Record line marker: %x01 keeps commit headers unambiguous in the stream. */\nconst RECORD = \"\\u0001\";\nconst STATUS_LINE = /^([AMDRC])\\d*\\t(.+)$/;\n\n/**\n * Undo git's C-style path quoting. Even with core.quotepath=off, paths\n * containing double quotes, backslashes, or control characters arrive as\n * `\"docs/a\\\"b.md\"` — quotepath only disables quoting of non-ASCII bytes.\n * Octal escapes are raw UTF-8 bytes, decoded together at the end.\n */\nexport function unquoteGitPath(path: string): string {\n if (path.length < 2 || !path.startsWith('\"') || !path.endsWith('\"')) {\n return path;\n }\n const inner = path.slice(1, -1);\n const bytes: number[] = [];\n for (let i = 0; i < inner.length; i++) {\n // `?? \"\"` cannot fire under the loop's own bound; it is how that is said\n // without an assertion, and an empty chunk contributes no bytes anyway.\n const ch = inner[i] ?? \"\";\n if (ch !== \"\\\\\") {\n for (const byte of Buffer.from(ch, \"utf8\")) bytes.push(byte);\n continue;\n }\n const next = inner[++i];\n if (next === undefined) break;\n if (next >= \"0\" && next <= \"7\") {\n let octal = next;\n while (octal.length < 3) {\n const digit = inner[i + 1];\n if (digit === undefined || digit < \"0\" || digit > \"7\") break;\n octal += digit;\n i++;\n }\n bytes.push(Number.parseInt(octal, 8));\n } else {\n const map: Record<string, string> = { n: \"\\n\", t: \"\\t\", r: \"\\r\" };\n for (const byte of Buffer.from(map[next] ?? next, \"utf8\"))\n bytes.push(byte);\n }\n }\n return Buffer.from(bytes).toString(\"utf8\");\n}\n\n/**\n * Unset every inherited `GIT_*` variable for the child process.\n *\n * git exports GIT_DIR, GIT_INDEX_FILE, GIT_WORK_TREE and friends to the\n * subprocesses it runs — every hook, and anything spawned from one. Inheriting\n * them makes `git log` read *that* repository instead of `cwd`, so the same\n * inputs would yield a different graph depending on who invoked dockg, and a\n * build outside a repo would silently succeed against an unrelated one. Both\n * break the determinism contract, so the ambient state is dropped wholesale\n * rather than enumerated: git keeps adding variables to this namespace.\n */\nfunction clearedGitEnv(): Record<string, string | undefined> {\n const cleared: Record<string, string | undefined> = {};\n for (const key of Object.keys(process.env)) {\n if (key.startsWith(\"GIT_\")) cleared[key] = undefined;\n }\n return cleared;\n}\n\nexport async function collectGitHistory(\n cwd: string,\n exec: ExecFn = realExec,\n): Promise<GitHistory> {\n const git = async (args: string[]): Promise<string> => {\n const result = await exec([\"git\", ...args], {\n cwd,\n timeoutMs: 60000,\n env: clearedGitEnv(),\n });\n // Messages stay neutral about *why* git provenance was requested; the\n // caller frames the failure as an error or a warning.\n if (result.spawnError) {\n throw new GraphError(\n `git could not be run: ${result.spawnError} (is git installed and on PATH?)`,\n );\n }\n if (result.timedOut) {\n throw new GraphError(\n \"`git log` timed out after 60s — the repo history may be too large for whole-history provenance\",\n );\n }\n if (result.code !== 0) {\n const detail = result.stderr.trim().slice(-300);\n throw new GraphError(\n `git history could not be read (is ${cwd} a git repo with at least one commit?)${detail ? ` — git said: ${detail}` : \"\"}`,\n );\n }\n return result.stdout;\n };\n // Keys are relative to `cwd`, the directory the caller's labels count from\n // (`documentBase`). git reports paths from the repository root, so each is\n // rebased by `cwd`'s own place in the repository. `--relative` would do that\n // too, but it drops every path outside `cwd`: a page labelled `../x.md`, and\n // a rename from outside, whose fold into the current name is the point.\n const prefix = `/${(await git([\"rev-parse\", \"--show-prefix\"])).trim()}`;\n const label = (raw: string): string =>\n posix.relative(prefix, `/${normalizeDocPath(unquoteGitPath(raw))}`);\n const stdout = await git([\n \"-c\",\n \"core.quotepath=off\",\n \"log\",\n `--format=${RECORD}%H%x09%an%x09%cI`,\n \"--name-status\",\n \"-M\",\n ]);\n if (stdout.trim() === \"\") {\n throw new GraphError(\n `git history could not be read (is ${cwd} a git repo with at least one commit?)`,\n );\n }\n\n const files = new Map<string, GitFileHistory>();\n /** Maps a historical path to the file's current (newest) path. */\n const currentName = new Map<string, string>();\n let headTime: string | undefined;\n let commitAuthor = \"\";\n let commitTime = \"\";\n\n const entry = (path: string): GitFileHistory => {\n let file = files.get(path);\n if (!file) {\n file = { authors: [], renamedFrom: [] };\n files.set(path, file);\n }\n return file;\n };\n\n /** Register that the commit being parsed touched `path` (as known at that time). */\n const touch = (pathThen: string): GitFileHistory => {\n const path = label(pathThen);\n const current = currentName.get(path) ?? path;\n const file = entry(current);\n // Walking newest→oldest: first touch wins `modified`, every touch pushes\n // `created` older, authors keep first-appearance (newest) order.\n file.modified ??= commitTime;\n file.created = commitTime;\n if (!file.authors.includes(commitAuthor)) file.authors.push(commitAuthor);\n return file;\n };\n\n for (const line of stdout.split(\"\\n\")) {\n if (line.startsWith(RECORD)) {\n const [, author = \"\", rawTime = \"\"] = line.slice(1).split(\"\\t\");\n const time = canonicalGitTime(rawTime);\n commitAuthor = author;\n commitTime = time;\n headTime ??= time;\n continue;\n }\n const match = STATUS_LINE.exec(line);\n // Both groups are mandatory in the pattern, so a match carries both;\n // requiring them subsumes the bare `if (!match) continue` this replaces.\n const status = match?.[1];\n const rest = match?.[2];\n if (status === undefined || rest === undefined) continue;\n if (status === \"R\" || status === \"C\") {\n const [oldPath, newPath] = rest.split(\"\\t\");\n if (!oldPath || !newPath) continue;\n if (status === \"C\") {\n // Copies create a new file from an old one; the old file's own history\n // is separate. Record the touch on the copy only.\n touch(newPath);\n continue;\n }\n const file = touch(newPath);\n const normalizedOld = label(oldPath);\n file.renamedFrom.push(normalizedOld);\n // Older commits refer to the pre-rename path; fold them into this file.\n const normalizedNew = label(newPath);\n currentName.set(\n normalizedOld,\n currentName.get(normalizedNew) ?? normalizedNew,\n );\n } else {\n touch(rest);\n }\n }\n\n return { headTime, files };\n}\n","/**\n * `x-manni-graph-output` (proposal 0051 §5), on graph's side of the seam.\n *\n * Which fields belong in a published graph is a property of the field, not of\n * this tool, so it is recorded where the field is defined. The keyword is a\n * boolean beside a top-level property, registered on every Ajv `manni meta`\n * builds and read back through `Validator.graphOutputPreferences`. Absent means\n * `true`: every field is harvested. A mark nested inside `graph` is ignored, as\n * 0047 rule 2 ignores an `x-manni-location` there — the mark governs a\n * top-level key, and `graph` is the top-level key.\n *\n * The filter runs once, before `deriveGraph`, because all four published\n * outputs descend from what derivation produces: `emitTurtle` writes the graph,\n * and JSON-LD, the iiRDS package and the search index are all built by reading\n * that graph back. Dropping the field here keeps it out of every one of them.\n *\n * Encrypted values (proposal 0045) are harvested like any other value. graph\n * never decrypts, so what lands in the graph is the `~…` token, which says a\n * value exists and nothing about what it is. A field that should not reach a\n * published graph at all is marked `false` — one mechanism for \"keep this out\n * of the output\", rather than one rule for encryption and another for\n * everything else (0051 stress test 4).\n */\nimport type { MetaPageView } from \"../../meta/internal.js\";\nimport { errorMessage } from \"../../shared/errors.js\";\nimport { GraphError } from \"../types.js\";\nimport type { DocModel } from \"../types.js\";\n\n/**\n * `docs`, with every top-level frontmatter key its schemas mark\n * `x-manni-graph-output: false` removed.\n *\n * A page's schemas are the set `manni meta validate` resolves for it (proposal\n * 0074): its own `$schema`, then meta's overrides, `schemas:`, `strict` and\n * the default set, read from meta's section of the same config. graph keeps\n * no schema set of its own, so one config answers both what a page is checked\n * against and what its published graph may carry.\n *\n * The docs arrive with their manifests' values already merged\n * (`withExternalMetadata`), so a field kept beside the page is filtered by\n * the same mark as one kept on it.\n *\n * A document whose schemas mark nothing is returned as it came in, so the\n * common case allocates nothing.\n */\nexport async function suppressGraphOutput(\n docs: readonly DocModel[],\n sets: Pick<MetaPageView, \"validator\" | \"refsFor\">,\n): Promise<DocModel[]> {\n const out: DocModel[] = [];\n for (const doc of docs) {\n let preferences: Map<string, boolean>;\n try {\n const refs = sets.refsFor(doc.path, doc.frontmatter);\n preferences = await sets.validator.graphOutputPreferences(doc.frontmatter, refs);\n } catch (e) {\n // Loudly, and for the whole run. The schema is what decides which fields\n // a published graph may carry; a graph built while it could not be read\n // is a graph nobody checked, and quietly building one is the failure\n // this keyword exists to prevent.\n throw new GraphError(\n `${doc.path}: cannot read which fields the graph may carry: ${errorMessage(e)}`,\n );\n }\n\n const suppressed = [...preferences]\n .filter(([, allowed]) => !allowed)\n .map(([key]) => key);\n if (suppressed.length === 0) {\n out.push(doc);\n continue;\n }\n\n const frontmatter: Record<string, unknown> = { ...doc.frontmatter };\n for (const key of suppressed) Reflect.deleteProperty(frontmatter, key);\n out.push({ ...doc, frontmatter });\n }\n return out;\n}\n"],"mappings":"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","names":["readFileSync","resolve","readFileSync"]}
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
resolvePages,
|
|
9
9
|
runConfigOptions,
|
|
10
10
|
withExternalMetadata
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-42VFJOAF.js";
|
|
12
12
|
import {
|
|
13
13
|
SUMMARY_FORMATS,
|
|
14
14
|
parseFormat
|
|
@@ -93,4 +93,4 @@ export {
|
|
|
93
93
|
runList,
|
|
94
94
|
renderList
|
|
95
95
|
};
|
|
96
|
-
//# sourceMappingURL=chunk-
|
|
96
|
+
//# sourceMappingURL=chunk-KGFSPJLD.js.map
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
updateConfigEval,
|
|
23
23
|
updateManifestEval,
|
|
24
24
|
updatePageEval
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-D6SELXQ2.js";
|
|
26
26
|
import {
|
|
27
27
|
DEFAULT_CONFIG_FILENAME,
|
|
28
28
|
assertRegisteredGraders,
|
|
@@ -41,10 +41,10 @@ import {
|
|
|
41
41
|
sha256,
|
|
42
42
|
splitBody,
|
|
43
43
|
withExternalMetadata
|
|
44
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-42VFJOAF.js";
|
|
45
45
|
import {
|
|
46
46
|
isTurnBudgetSkip
|
|
47
|
-
} from "./chunk-
|
|
47
|
+
} from "./chunk-SSQZB5SQ.js";
|
|
48
48
|
import {
|
|
49
49
|
SUMMARY_FORMATS,
|
|
50
50
|
parseFormat
|
|
@@ -52,12 +52,12 @@ import {
|
|
|
52
52
|
import {
|
|
53
53
|
DocevalsError
|
|
54
54
|
} from "./chunk-SE4JN5XN.js";
|
|
55
|
+
import {
|
|
56
|
+
mergeMetaProvenance
|
|
57
|
+
} from "./chunk-2OZF2VUB.js";
|
|
55
58
|
import {
|
|
56
59
|
SEVERITIES
|
|
57
60
|
} from "./chunk-77AINBYM.js";
|
|
58
|
-
import {
|
|
59
|
-
mergeMetaProvenance
|
|
60
|
-
} from "./chunk-2W34HX2U.js";
|
|
61
61
|
import {
|
|
62
62
|
palette
|
|
63
63
|
} from "./chunk-RNVYGWIC.js";
|
|
@@ -1284,4 +1284,4 @@ export {
|
|
|
1284
1284
|
renderCalibration,
|
|
1285
1285
|
runInit
|
|
1286
1286
|
};
|
|
1287
|
-
//# sourceMappingURL=chunk-
|
|
1287
|
+
//# sourceMappingURL=chunk-KMORGMCW.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
DEFAULT_KEEP_ALIVE_MS
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-VM7VAFJW.js";
|
|
5
5
|
|
|
6
6
|
// src/tracevals/rules/host.ts
|
|
7
7
|
import {
|
|
@@ -83,4 +83,4 @@ export {
|
|
|
83
83
|
hostHolds,
|
|
84
84
|
queued
|
|
85
85
|
};
|
|
86
|
-
//# sourceMappingURL=chunk-
|
|
86
|
+
//# sourceMappingURL=chunk-NUQF5F5J.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
parseTraceFile,
|
|
4
4
|
renderTrace
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-AANUY4BH.js";
|
|
6
6
|
import {
|
|
7
7
|
evaluateWhen,
|
|
8
8
|
matchesGlob,
|
|
@@ -30,34 +30,36 @@ import {
|
|
|
30
30
|
extractEvals,
|
|
31
31
|
findManifest,
|
|
32
32
|
resolveArtifacts
|
|
33
|
-
} from "./chunk-
|
|
34
|
-
import {
|
|
35
|
-
discoverTraces
|
|
36
|
-
} from "./chunk-4TSWU2SU.js";
|
|
33
|
+
} from "./chunk-IQQAJROD.js";
|
|
37
34
|
import {
|
|
38
35
|
discoverConfig
|
|
39
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-OKMTUAWO.js";
|
|
40
37
|
import {
|
|
41
38
|
announceSelection,
|
|
42
39
|
assertProviderSelection,
|
|
43
40
|
constructProvider,
|
|
44
41
|
resolveProviderIdentity,
|
|
45
42
|
selectProvider
|
|
46
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-U6IHLEWT.js";
|
|
44
|
+
import {
|
|
45
|
+
discoverTraces
|
|
46
|
+
} from "./chunk-4TSWU2SU.js";
|
|
47
47
|
import {
|
|
48
48
|
TracevalsError
|
|
49
49
|
} from "./chunk-UKZNLVJW.js";
|
|
50
50
|
import {
|
|
51
51
|
isTurnBudgetSkip,
|
|
52
|
-
realExec,
|
|
53
52
|
turnBudgetSkipReason
|
|
54
|
-
} from "./chunk-
|
|
53
|
+
} from "./chunk-SSQZB5SQ.js";
|
|
55
54
|
import {
|
|
56
55
|
NOT_GRANTED_REASON,
|
|
57
56
|
grantsFor,
|
|
58
57
|
isExecutionGrant,
|
|
59
58
|
unknownGrantsMessage
|
|
60
59
|
} from "./chunk-YNHZHSSM.js";
|
|
60
|
+
import {
|
|
61
|
+
realExec
|
|
62
|
+
} from "./chunk-ZPLVANY2.js";
|
|
61
63
|
import {
|
|
62
64
|
URI_BASE_ID,
|
|
63
65
|
artifactLocation,
|
|
@@ -68,7 +70,10 @@ import {
|
|
|
68
70
|
} from "./chunk-GLP5PSXB.js";
|
|
69
71
|
import {
|
|
70
72
|
declaredAt
|
|
71
|
-
} from "./chunk-
|
|
73
|
+
} from "./chunk-JSSM7VVV.js";
|
|
74
|
+
import {
|
|
75
|
+
xmlEscape
|
|
76
|
+
} from "./chunk-SGR7ZAVE.js";
|
|
72
77
|
import {
|
|
73
78
|
PATH_JOIN,
|
|
74
79
|
externalMetadataJoin,
|
|
@@ -76,32 +81,29 @@ import {
|
|
|
76
81
|
loadExternalMetadata,
|
|
77
82
|
memberOf,
|
|
78
83
|
mergeWithMarks
|
|
79
|
-
} from "./chunk-
|
|
80
|
-
import {
|
|
81
|
-
xmlEscape
|
|
82
|
-
} from "./chunk-QBVP3SQP.js";
|
|
84
|
+
} from "./chunk-SMHAYK6I.js";
|
|
83
85
|
import {
|
|
84
86
|
DocmetaError,
|
|
85
87
|
classifyRef,
|
|
86
88
|
extractFrontmatter
|
|
87
|
-
} from "./chunk-
|
|
88
|
-
import {
|
|
89
|
-
palette
|
|
90
|
-
} from "./chunk-RNVYGWIC.js";
|
|
89
|
+
} from "./chunk-RGLFV4KO.js";
|
|
91
90
|
import {
|
|
92
91
|
escapeWorkflowCommandMessage,
|
|
93
92
|
escapeWorkflowCommandProperty
|
|
94
93
|
} from "./chunk-MNH7QO4Z.js";
|
|
94
|
+
import {
|
|
95
|
+
palette
|
|
96
|
+
} from "./chunk-RNVYGWIC.js";
|
|
95
97
|
import {
|
|
96
98
|
hasPagePlaceholder,
|
|
97
99
|
ownsKey
|
|
98
|
-
} from "./chunk-
|
|
100
|
+
} from "./chunk-OTJOBZJ5.js";
|
|
99
101
|
import {
|
|
100
102
|
warn
|
|
101
103
|
} from "./chunk-HX44GB4Z.js";
|
|
102
104
|
import {
|
|
103
105
|
parseDuration
|
|
104
|
-
} from "./chunk-
|
|
106
|
+
} from "./chunk-VM7VAFJW.js";
|
|
105
107
|
import {
|
|
106
108
|
errorMessage
|
|
107
109
|
} from "./chunk-G3T47CFV.js";
|
|
@@ -3132,4 +3134,4 @@ export {
|
|
|
3132
3134
|
resolveBatchTraces,
|
|
3133
3135
|
runBatch
|
|
3134
3136
|
};
|
|
3135
|
-
//# sourceMappingURL=chunk-
|
|
3137
|
+
//# sourceMappingURL=chunk-NZ6KSHFD.js.map
|