@modusensus/dsh-mneme 0.14.0-beta.1 → 0.14.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +830 -830
- package/assets/icon.svg +3 -3
- package/bin/cli.mjs +964 -964
- package/bin/dsh-mneme-choro.mjs +262 -262
- package/bin/dsh-mneme-mcp.mjs +510 -510
- package/bin/dsh-mneme-serve.mjs +151 -151
- package/cordis.patch.yml +21 -21
- package/docs/CONFIGURATION.md +407 -404
- package/docs/CONTINUITY.md +139 -139
- package/docs/DAEMON.md +57 -57
- package/docs/DIRECTORIES.md +114 -114
- package/docs/DISTILL.md +397 -371
- package/docs/DSH-GO.md +97 -97
- package/docs/ENTITIES.md +247 -247
- package/docs/FORGET.md +77 -77
- package/docs/KB.md +110 -110
- package/docs/LOCAL_MODEL.md +222 -222
- package/docs/SEMANTIC.md +256 -256
- package/docs/SHARE.md +552 -552
- package/docs/SLEEP.md +202 -202
- package/docs/STORAGE.md +122 -122
- package/docs/WORKFLOWS.md +366 -366
- package/lib/api-standalone.js +1007 -1007
- package/lib/api.js +3600 -3600
- package/lib/attachment-text.js +122 -122
- package/lib/bootstrap-http.js +105 -105
- package/lib/bootstrap.js +215 -215
- package/lib/candidates.js +454 -454
- package/lib/capabilities.js +819 -819
- package/lib/choro-command.js +111 -111
- package/lib/client.js +14420 -14322
- package/lib/commands.js +95 -95
- package/lib/config-keys.js +144 -144
- package/lib/config.js +1361 -1344
- package/lib/content-hash.js +54 -54
- package/lib/continuity.js +258 -258
- package/lib/date-hint.js +32 -0
- package/lib/diary/auto.js +190 -190
- package/lib/diary/compose.js +440 -440
- package/lib/diary/dir.js +59 -59
- package/lib/diary/export.js +97 -97
- package/lib/diary/index.js +26 -26
- package/lib/diary/library.js +189 -189
- package/lib/diary/qq-inbox.js +142 -142
- package/lib/diary/rollover.js +61 -61
- package/lib/diary/session-provider.js +122 -122
- package/lib/document-index.js +94 -94
- package/lib/document.js +322 -322
- package/lib/dream/clustering.js +123 -123
- package/lib/dream/decisions.js +945 -945
- package/lib/dream/narratives.js +44 -44
- package/lib/dream/sleep.js +2027 -2027
- package/lib/dream/triage.js +139 -139
- package/lib/dream.js +1879 -1879
- package/lib/dsh-go/host.js +162 -162
- package/lib/dsh-go/panel.js +2091 -2091
- package/lib/dsh-go/text.js +342 -342
- package/lib/dsh-go/views/common.js +68 -68
- package/lib/dsh-go/views/entity.js +48 -48
- package/lib/dsh-go/views/memory.js +198 -198
- package/lib/dsh-go/views/root.js +30 -30
- package/lib/dsh-go/views/settings.js +398 -398
- package/lib/dsh-go/views/status.js +51 -51
- package/lib/embedding.js +342 -342
- package/lib/entities/extractor.js +285 -285
- package/lib/fence.js +24 -24
- package/lib/graph/anchoring.js +184 -184
- package/lib/guide.js +74 -74
- package/lib/heat.js +144 -144
- package/lib/hot-memory.js +119 -119
- package/lib/image-describe.js +158 -0
- package/lib/index.js +852 -852
- package/lib/inject.js +656 -651
- package/lib/kb/index.js +309 -309
- package/lib/kb/routes.js +219 -219
- package/lib/kb/tools.js +148 -148
- package/lib/lang.js +607 -595
- package/lib/local-embedder.js +358 -358
- package/lib/maintenance.js +162 -162
- package/lib/memory-source.js +9 -9
- package/lib/mirror.js +330 -330
- package/lib/organize.js +456 -456
- package/lib/peak-hours.js +172 -172
- package/lib/pipeline-activities.js +178 -178
- package/lib/pipeline-attribution.js +165 -165
- package/lib/pipeline-command.js +279 -279
- package/lib/pipeline-confirm.js +142 -142
- package/lib/pipeline-exec.js +174 -174
- package/lib/pipeline-nudge-auto.js +129 -129
- package/lib/pipeline-nudge.js +1623 -1623
- package/lib/pipeline-observations.js +181 -181
- package/lib/pipeline-observe.js +133 -133
- package/lib/pipeline-runner.js +361 -361
- package/lib/pipeline-runs.js +442 -442
- package/lib/pipeline.js +716 -716
- package/lib/placement.js +13 -13
- package/lib/pre-inject-gate.js +354 -354
- package/lib/profile-extract.js +164 -164
- package/lib/profile-facts.js +356 -356
- package/lib/provenance-http.js +251 -251
- package/lib/quality-filter.js +162 -162
- package/lib/recall-stats.js +190 -190
- package/lib/reclaim-http.js +150 -150
- package/lib/reranker.js +269 -269
- package/lib/runtime/adopt.js +176 -176
- package/lib/runtime/closure.js +172 -172
- package/lib/runtime/download.js +247 -247
- package/lib/runtime/layout.js +265 -265
- package/lib/runtime/loader.js +252 -252
- package/lib/runtime/model-fetch.js +361 -361
- package/lib/runtime/provision.js +237 -237
- package/lib/runtime/tarball.js +130 -130
- package/lib/runtime/verify.js +223 -223
- package/lib/safe-slice.js +18 -18
- package/lib/scope-state.js +277 -277
- package/lib/scope.js +187 -187
- package/lib/search/adaptive.js +60 -60
- package/lib/search/bm25.js +96 -96
- package/lib/semantic.js +572 -572
- package/lib/sensitive-scan.js +209 -209
- package/lib/serve.js +228 -228
- package/lib/service.js +3268 -3268
- package/lib/session-gate.js +91 -91
- package/lib/session-usage.js +350 -350
- package/lib/settings.js +827 -817
- package/lib/share-http.js +281 -281
- package/lib/share-import.js +234 -234
- package/lib/share.js +335 -335
- package/lib/store.js +5895 -5895
- package/lib/summarize.js +1388 -1343
- package/lib/tools.js +1370 -1356
- package/lib/user-settings.js +230 -230
- package/lib/vector-index.js +180 -180
- package/lib/version-check.js +122 -122
- package/lib/wiki/claims.js +267 -267
- package/lib/wiki/cli-hint.js +90 -90
- package/lib/wiki/inject.js +164 -164
- package/lib/wiki/partition.js +200 -200
- package/lib/wiki/plan.js +214 -214
- package/lib/wiki/queries.js +640 -640
- package/lib/wiki/render.js +261 -261
- package/lib/wiki/scan.js +371 -371
- package/lib/wiki/t0.js +500 -500
- package/lib/wiki/t1-jobs.js +232 -232
- package/lib/wiki/t1.js +609 -609
- package/lib/write-admission.js +404 -404
- package/locale/en.json +6 -6
- package/locale/zh.json +6 -6
- package/package.json +1 -1
- package/runtime-manifest.json +526 -526
- package/scripts/benchmark-embed.js +201 -201
- package/scripts/benchmark-recall.js +249 -249
- package/scripts/benchmark-rerank.js +166 -166
- package/scripts/build-runtime-manifest.mjs +224 -224
- package/scripts/changelog-prep.mjs +91 -91
- package/scripts/check-sync.js +44 -44
- package/scripts/e2e-dsh.js +220 -220
- package/scripts/mneme-runtime.mjs +277 -277
- package/scripts/publish-gate.mjs +197 -197
- package/scripts/release-docs.mjs +210 -210
- package/scripts/release-notes.mjs +164 -164
- package/scripts/stress-dsh.js +255 -255
- package/scripts/sync-lib.js +47 -47
- package/scripts/sync-test-badge.mjs +69 -69
- package/scripts/test-count-sync.mjs +48 -48
- package/src/api-standalone.js +1007 -1007
- package/src/api.js +3600 -3600
- package/src/attachment-text.js +122 -122
- package/src/bootstrap-http.js +105 -105
- package/src/bootstrap.js +215 -215
- package/src/candidates.js +454 -454
- package/src/capabilities.js +819 -819
- package/src/choro-command.js +111 -111
- package/src/commands.js +95 -95
- package/src/config-keys.js +144 -144
- package/src/config.js +1361 -1344
- package/src/content-hash.js +54 -54
- package/src/continuity.js +258 -258
- package/src/date-hint.js +32 -0
- package/src/diary/auto.js +190 -190
- package/src/diary/compose.js +440 -440
- package/src/diary/dir.js +59 -59
- package/src/diary/export.js +97 -97
- package/src/diary/index.js +26 -26
- package/src/diary/library.js +189 -189
- package/src/diary/qq-inbox.js +142 -142
- package/src/diary/rollover.js +61 -61
- package/src/diary/session-provider.js +122 -122
- package/src/document-index.js +94 -94
- package/src/document.js +322 -322
- package/src/dream/clustering.js +123 -123
- package/src/dream/decisions.js +945 -945
- package/src/dream/narratives.js +44 -44
- package/src/dream/sleep.js +2027 -2027
- package/src/dream/triage.js +139 -139
- package/src/dream.js +1879 -1879
- package/src/dsh-go/host.js +162 -162
- package/src/dsh-go/panel.js +2091 -2091
- package/src/dsh-go/text.js +342 -342
- package/src/dsh-go/views/common.js +68 -68
- package/src/dsh-go/views/entity.js +48 -48
- package/src/dsh-go/views/memory.js +198 -198
- package/src/dsh-go/views/root.js +30 -30
- package/src/dsh-go/views/settings.js +398 -398
- package/src/dsh-go/views/status.js +51 -51
- package/src/embedding.js +342 -342
- package/src/entities/extractor.js +285 -285
- package/src/fence.js +24 -24
- package/src/graph/anchoring.js +184 -184
- package/src/guide.js +74 -74
- package/src/heat.js +144 -144
- package/src/hot-memory.js +119 -119
- package/src/image-describe.js +158 -0
- package/src/index.js +852 -852
- package/src/inject.js +656 -651
- package/src/kb/index.js +309 -309
- package/src/kb/routes.js +219 -219
- package/src/kb/tools.js +148 -148
- package/src/lang.js +607 -595
- package/src/local-embedder.js +358 -358
- package/src/maintenance.js +162 -162
- package/src/memory-source.js +9 -9
- package/src/mirror.js +330 -330
- package/src/organize.js +456 -456
- package/src/peak-hours.js +172 -172
- package/src/pipeline-activities.js +178 -178
- package/src/pipeline-attribution.js +165 -165
- package/src/pipeline-command.js +279 -279
- package/src/pipeline-confirm.js +142 -142
- package/src/pipeline-exec.js +174 -174
- package/src/pipeline-nudge-auto.js +129 -129
- package/src/pipeline-nudge.js +1623 -1623
- package/src/pipeline-observations.js +181 -181
- package/src/pipeline-observe.js +133 -133
- package/src/pipeline-runner.js +361 -361
- package/src/pipeline-runs.js +442 -442
- package/src/pipeline.js +716 -716
- package/src/placement.js +13 -13
- package/src/pre-inject-gate.js +354 -354
- package/src/profile-extract.js +164 -164
- package/src/profile-facts.js +356 -356
- package/src/provenance-http.js +251 -251
- package/src/quality-filter.js +162 -162
- package/src/recall-stats.js +190 -190
- package/src/reclaim-http.js +150 -150
- package/src/reranker.js +269 -269
- package/src/runtime/adopt.js +176 -176
- package/src/runtime/closure.js +172 -172
- package/src/runtime/download.js +247 -247
- package/src/runtime/layout.js +265 -265
- package/src/runtime/loader.js +252 -252
- package/src/runtime/model-fetch.js +361 -361
- package/src/runtime/provision.js +237 -237
- package/src/runtime/tarball.js +130 -130
- package/src/runtime/verify.js +223 -223
- package/src/safe-slice.js +18 -18
- package/src/scope-state.js +277 -277
- package/src/scope.js +187 -187
- package/src/search/adaptive.js +60 -60
- package/src/search/bm25.js +96 -96
- package/src/semantic.js +572 -572
- package/src/sensitive-scan.js +209 -209
- package/src/serve.js +228 -228
- package/src/service.js +3268 -3268
- package/src/session-gate.js +91 -91
- package/src/session-usage.js +350 -350
- package/src/settings.js +827 -817
- package/src/share-http.js +281 -281
- package/src/share-import.js +234 -234
- package/src/share.js +335 -335
- package/src/store.js +5895 -5895
- package/src/summarize.js +1388 -1343
- package/src/tools.js +1370 -1356
- package/src/user-settings.js +230 -230
- package/src/vector-index.js +180 -180
- package/src/version-check.js +122 -122
- package/src/wiki/claims.js +267 -267
- package/src/wiki/cli-hint.js +90 -90
- package/src/wiki/inject.js +164 -164
- package/src/wiki/partition.js +200 -200
- package/src/wiki/plan.js +214 -214
- package/src/wiki/queries.js +640 -640
- package/src/wiki/render.js +261 -261
- package/src/wiki/scan.js +371 -371
- package/src/wiki/t0.js +500 -500
- package/src/wiki/t1-jobs.js +232 -232
- package/src/wiki/t1.js +609 -609
- package/src/write-admission.js +404 -404
- package/test/adaptive-inject-budget.test.js +85 -85
- package/test/api-hardening.test.js +173 -173
- package/test/api-nudge-route.test.js +259 -259
- package/test/api-routes-gaps.test.js +1092 -1092
- package/test/api.test.js +3007 -2998
- package/test/attachment-text.test.js +139 -139
- package/test/audit.test.js +448 -448
- package/test/baseline-persist.test.js +248 -248
- package/test/benchmark.test.js +94 -94
- package/test/bm25-corpus-cache.test.js +145 -145
- package/test/bootstrap.test.js +228 -228
- package/test/candidates.test.js +345 -345
- package/test/capabilities.test.js +577 -577
- package/test/capacity-warning.test.js +262 -262
- package/test/changelog-prep.test.js +125 -125
- package/test/choro-command.test.js +218 -218
- package/test/cli-enums.test.js +37 -37
- package/test/cli-flag-value.test.js +86 -86
- package/test/cli-receive.test.js +390 -390
- package/test/cli-share.test.js +437 -437
- package/test/client-share.test.js +225 -225
- package/test/client.test.js +4595 -4425
- package/test/clustering.test.js +100 -100
- package/test/commands.test.js +106 -106
- package/test/config-keys-routes.test.js +233 -233
- package/test/config.test.js +153 -153
- package/test/conflict-freeze.test.js +344 -344
- package/test/conflict-ledger-enforce.test.js +452 -452
- package/test/conflict-ledger.test.js +242 -242
- package/test/conflict-reviewed.test.js +79 -79
- package/test/content-hash.test.js +204 -204
- package/test/continuity.test.js +452 -452
- package/test/contrast.test.js +432 -432
- package/test/date-hint.test.js +156 -0
- package/test/dedupe-candidate-window.test.js +180 -180
- package/test/dependency-overrides.test.js +78 -78
- package/test/diary-library.test.js +187 -187
- package/test/diary.test.js +576 -576
- package/test/differentiate-feedback.test.js +248 -248
- package/test/distill-tx-embed-gap.test.js +110 -110
- package/test/docs-config-keys.test.js +65 -65
- package/test/document-dir.test.js +233 -233
- package/test/document.test.js +703 -703
- package/test/dream-archive-guardrail.test.js +116 -116
- package/test/dream-baseline-clamp.test.js +174 -174
- package/test/dream-candidate-hybrid.test.js +281 -281
- package/test/dream-coverage-degrade.test.js +86 -86
- package/test/dream-decision-evidence.test.js +314 -314
- package/test/dream-failure-backoff.test.js +173 -173
- package/test/dream-fence.test.js +207 -207
- package/test/dream-maxtokens-fallback.test.js +132 -132
- package/test/dream-merge-guardrail.test.js +219 -219
- package/test/dream-peak-hours.test.js +194 -194
- package/test/dream.test.js +1528 -1528
- package/test/dsh-go-host.test.js +134 -134
- package/test/dsh-go-panel-actions.test.js +854 -854
- package/test/dsh-go-panel.test.js +251 -251
- package/test/embed-ready-poll.test.js +94 -94
- package/test/embed-text-reasons.test.js +112 -112
- package/test/embedding-cache-f32.test.js +276 -276
- package/test/embedding-ready.test.js +226 -226
- package/test/entities.test.js +711 -711
- package/test/entity-recall.test.js +179 -179
- package/test/epistemic.test.js +325 -325
- package/test/failure-query.test.js +147 -147
- package/test/failure-retention.test.js +105 -105
- package/test/fnew-0112.test.js +311 -311
- package/test/fnew-03.test.js +422 -422
- package/test/forget-corrections.test.js +70 -70
- package/test/graph-anchoring.test.js +184 -184
- package/test/graph-api.test.js +333 -333
- package/test/graph-boosted-relations.test.js +189 -189
- package/test/graph-inject-budget.test.js +103 -103
- package/test/graph-multipath.test.js +269 -269
- package/test/graph-passive-confirm.test.js +91 -91
- package/test/graph-weight-evolution.test.js +104 -104
- package/test/heat.test.js +175 -175
- package/test/helpers/dream-mock.js +86 -86
- package/test/helpers/peer-worker.mjs +25 -25
- package/test/helpers/runtime-source.js +60 -60
- package/test/helpers/tar-builder.js +80 -80
- package/test/helpers/write-admission-samples.js +312 -312
- package/test/hot-memory.test.js +259 -259
- package/test/image-description.test.js +271 -0
- package/test/image-memory.test.js +170 -170
- package/test/inject-content-cap.test.js +91 -91
- package/test/inject-first-round-bm25.test.js +89 -89
- package/test/inject-heat.test.js +77 -77
- package/test/inject-parent-gate.test.js +134 -109
- package/test/inject-pin-explicit.test.js +300 -300
- package/test/inject-pin-vector-crowd.test.js +225 -225
- package/test/inject-pools.test.js +195 -195
- package/test/inject-recall.test.js +172 -172
- package/test/inject-rotation.test.js +161 -161
- package/test/inject.test.js +553 -553
- package/test/issue-617-step1-query-and-fusion.test.js +361 -361
- package/test/kb-api-wiring.test.js +128 -128
- package/test/kb-collections.test.js +272 -272
- package/test/kb-routes.test.js +379 -379
- package/test/lang.test.js +98 -98
- package/test/lastrunat-persist.test.js +101 -101
- package/test/lib-smoke.test.js +116 -116
- package/test/llm-audit.test.js +815 -815
- package/test/llm-message-source.test.js +207 -207
- package/test/local-embedder.test.js +292 -292
- package/test/maintenance.test.js +501 -501
- package/test/mcp-stdio.test.js +385 -385
- package/test/mint-source.test.js +311 -311
- package/test/mirror-dirty.test.js +424 -424
- package/test/mirror-edit-digest.test.js +187 -187
- package/test/mirror-generation.test.js +499 -499
- package/test/mirror-types.test.js +208 -208
- package/test/mirror.test.js +249 -249
- package/test/narrative-bars.test.js +162 -162
- package/test/organize-tool.test.js +232 -232
- package/test/organize.test.js +418 -418
- package/test/panel-chart-scale.test.js +90 -90
- package/test/panel-tokens.test.js +245 -245
- package/test/peak-hours-observability.test.js +70 -70
- package/test/peer-blockers.test.js +193 -193
- package/test/persona-addressing.test.js +83 -83
- package/test/persona-api.test.js +172 -172
- package/test/persona-by-session.test.js +568 -568
- package/test/persona-flag.test.js +36 -36
- package/test/persona-inject.test.js +145 -145
- package/test/persona-settings.test.js +198 -198
- package/test/pipeline-activities.test.js +155 -155
- package/test/pipeline-attribution.test.js +175 -175
- package/test/pipeline-command.test.js +243 -243
- package/test/pipeline-confirm.test.js +148 -148
- package/test/pipeline-exec.test.js +172 -172
- package/test/pipeline-nudge-auto.test.js +248 -248
- package/test/pipeline-nudge.test.js +1278 -1278
- package/test/pipeline-observations.test.js +157 -157
- package/test/pipeline-observe.test.js +127 -127
- package/test/pipeline-r1r2.test.js +278 -278
- package/test/pipeline-runner.test.js +468 -468
- package/test/pipeline-runs.test.js +767 -767
- package/test/pipeline.test.js +636 -636
- package/test/placement.test.js +36 -36
- package/test/policy-epoch.test.js +259 -259
- package/test/pre-inject-gate.test.js +444 -444
- package/test/profile-extract.test.js +269 -269
- package/test/profile-facts.test.js +492 -492
- package/test/prompt-stance.test.js +128 -128
- package/test/provenance-http.test.js +367 -367
- package/test/publish-gate.test.js +272 -272
- package/test/quality-backfill.test.js +290 -290
- package/test/quality-filter.test.js +295 -295
- package/test/readme-claims.test.js +113 -113
- package/test/reasoning-effort.test.js +752 -752
- package/test/recall-anti-update.test.js +82 -82
- package/test/recall-evals.test.js +253 -253
- package/test/recall-layer.test.js +326 -326
- package/test/recall-retention.test.js +128 -128
- package/test/recall-stats.test.js +274 -274
- package/test/receipt-chain.test.js +451 -451
- package/test/reclaim-http.test.js +209 -209
- package/test/reflection-update-gate.test.js +129 -129
- package/test/reflection.test.js +226 -226
- package/test/reindex-backfill.test.js +475 -475
- package/test/reindex-scheduler.test.js +369 -369
- package/test/release-docs.test.js +156 -156
- package/test/release-notes.test.js +265 -265
- package/test/release-workflow.test.js +93 -93
- package/test/reranker-single-logit.test.js +73 -73
- package/test/reranker.test.js +197 -197
- package/test/resident-status.test.js +83 -83
- package/test/route-policy.test.js +113 -113
- package/test/runtime-adopt.test.js +206 -206
- package/test/runtime-cli.test.js +89 -89
- package/test/runtime-closure.test.js +193 -193
- package/test/runtime-download.test.js +302 -302
- package/test/runtime-layout.test.js +163 -163
- package/test/runtime-loader.test.js +255 -255
- package/test/runtime-manifest.test.js +159 -159
- package/test/runtime-model-fetch.test.js +348 -348
- package/test/runtime-provision.test.js +101 -101
- package/test/runtime-tarball.test.js +81 -81
- package/test/runtime-verify.test.js +319 -319
- package/test/scope-candidates.test.js +491 -491
- package/test/scope-distill-stamp.test.js +134 -134
- package/test/scope-explicit.test.js +452 -452
- package/test/scope-inject-soft.test.js +106 -106
- package/test/scope-optional-service.test.js +110 -110
- package/test/scope-retrieval.test.js +197 -197
- package/test/scope-state.test.js +610 -610
- package/test/scope-storage.test.js +255 -255
- package/test/scope-strict.test.js +367 -367
- package/test/search-fusion.test.js +90 -90
- package/test/security-doc.test.js +188 -188
- package/test/semantic.test.js +124 -124
- package/test/sensitive-scan.test.js +251 -251
- package/test/serve-bin.test.js +121 -121
- package/test/serve.test.js +258 -258
- package/test/service-search.test.js +174 -174
- package/test/service.test.js +410 -410
- package/test/session-gate.test.js +264 -264
- package/test/session-usage.test.js +317 -317
- package/test/settings.test.js +273 -273
- package/test/share-foreign-rows.test.js +144 -144
- package/test/share-http.test.js +144 -144
- package/test/share-import.test.js +577 -577
- package/test/share-imported-guard.test.js +311 -311
- package/test/share-imported-identity.test.js +111 -111
- package/test/share-pack.test.js +511 -511
- package/test/share-receive-http.test.js +756 -756
- package/test/share-routes.test.js +337 -337
- package/test/share-store.test.js +133 -133
- package/test/share-validate.test.js +101 -101
- package/test/skip-invalid-restore.test.js +262 -262
- package/test/sleep-action-set.test.js +441 -441
- package/test/sleep-catchup.test.js +315 -315
- package/test/sleep-failure-backoff.test.js +156 -156
- package/test/sleep-heat.test.js +174 -174
- package/test/sleep-scheduler-rearm.test.js +89 -89
- package/test/sleep.test.js +1455 -1455
- package/test/standalone-api.test.js +1344 -1344
- package/test/store-vector-cache.test.js +98 -98
- package/test/store-write-path-columns.test.js +191 -191
- package/test/store.test.js +744 -744
- package/test/stress.test.js +209 -209
- package/test/summarize-occurred-at.test.js +127 -127
- package/test/summarize-parse-diagnostics.test.js +75 -75
- package/test/summarize-reasoning-effort.test.js +189 -189
- package/test/summarize.test.js +2251 -2251
- package/test/supersede-state-tracking.test.js +394 -394
- package/test/test-count-sync.test.js +71 -71
- package/test/tool-state-ignore.test.js +65 -65
- package/test/tools-dto-schema-matrix.test.js +398 -398
- package/test/tools-memory-get-schema.test.js +65 -65
- package/test/tools.test.js +585 -585
- package/test/updated-at-semantics.test.js +113 -113
- package/test/user-settings-preview.test.js +127 -127
- package/test/user-settings-segments.test.js +527 -527
- package/test/vector-index.test.js +334 -334
- package/test/version-check.test.js +152 -152
- package/test/webServer-optional.test.js +82 -82
- package/test/wiki-api.test.js +734 -734
- package/test/wiki-claims.test.js +194 -194
- package/test/wiki-cli-hint.test.js +118 -118
- package/test/wiki-inject.test.js +265 -265
- package/test/wiki-partition.test.js +112 -112
- package/test/wiki-plan.test.js +80 -80
- package/test/wiki-provenance.test.js +202 -202
- package/test/wiki-queries.test.js +398 -398
- package/test/wiki-scan.test.js +208 -208
- package/test/wiki-store.test.js +190 -190
- package/test/wiki-t0.test.js +456 -456
- package/test/wiki-t1-jobs.test.js +125 -125
- package/test/wiki-t1.test.js +460 -460
- package/test/wiki-tools.test.js +176 -176
- package/test/workflow-guards.test.js +155 -155
- package/test/write-admission.test.js +668 -668
|
@@ -1,165 +1,165 @@
|
|
|
1
|
-
// 从 CHANGELOG 小节渲染 GitHub Release 正文的单一实现。
|
|
2
|
-
//
|
|
3
|
-
// 为什么抽成模块:这段逻辑原先嵌在 .github/workflows/release.yml 的 node -e 内联脚本里,
|
|
4
|
-
// 要改排版就得改工作流本体,也没法写测试——而 Release 正文恰恰是最需要反复试排版的东西。
|
|
5
|
-
// 抽出来之后同样的输入产出同样的正文,本地能预览、CI 能锁形状。
|
|
6
|
-
//
|
|
7
|
-
// 排版目标:Release 页的默认视图要能一眼扫完,但完整正文不能丢——它同时是「这个版本到底
|
|
8
|
-
// 改了什么」的唯一对外说明。做法是标题 + 一句导语默认可见,剩余正文折进 details,想细看的
|
|
9
|
-
// 人点开,不想看的人不被淹。
|
|
10
|
-
//
|
|
11
|
-
// CHANGELOG 本体一个字不动:那是仓库内的完整记录(含决策理由与审计线索),压缩它等于销毁
|
|
12
|
-
// 证据;分层只发生在对外渲染这一步。
|
|
13
|
-
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
14
|
-
import { fileURLToPath } from "node:url";
|
|
15
|
-
|
|
16
|
-
// 句末标点以中文全角为主。刻意不认半角句号:v0.9.0 这类版本号里的点是同一个字符,
|
|
17
|
-
// 认了会把导语切在版本号中间。
|
|
18
|
-
const END = /[。!?]/;
|
|
19
|
-
// 导语超长时的退让点,从强到弱。半角分号/逗号兜住中英混排的条目。
|
|
20
|
-
const SOFT = [";", ",", ";", ","];
|
|
21
|
-
|
|
22
|
-
/** 取出某个版本的 CHANGELOG 小节正文(不含 ## [V] 标题行本身);找不到返回 null。 */
|
|
23
|
-
export function findSection(text, version) {
|
|
24
|
-
const re = new RegExp("^## \\[" + version.replace(/\./g, "\\.") + "\\][^\\n]*\\n", "m");
|
|
25
|
-
const start = text.search(re);
|
|
26
|
-
if (start === -1) return null;
|
|
27
|
-
const rest = text.slice(start + text.slice(start).indexOf("\n") + 1);
|
|
28
|
-
const next = rest.search(/^## \[/m);
|
|
29
|
-
return (next === -1 ? rest : rest.slice(0, next)).trim();
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** 拆 - **标题**:正文;不是这个形状返回 null,调用方按普通行原样保留。 */
|
|
33
|
-
export function parseBullet(line) {
|
|
34
|
-
const m = line.match(/^- \*\*(.+?)\*\*(?:[::]\s*)?([\s\S]*)$/);
|
|
35
|
-
if (!m) return null;
|
|
36
|
-
return { title: m[1].trim(), body: (m[2] || "").trim() };
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* 括号深度:全角(或半角( 进一层,)或) 出一层。导语绝不在未闭合的括号里断开——
|
|
41
|
-
* 「…(明文回吐 Bearer,」这种收尾等于把一句话切在从句中间,读者要回头找主语。
|
|
42
|
-
*/
|
|
43
|
-
function depthAt(s, end) {
|
|
44
|
-
let d = 0;
|
|
45
|
-
for (let i = 0; i < end; i += 1) {
|
|
46
|
-
const c = s[i];
|
|
47
|
-
if (c === "\uFF08" || c === "(") d += 1;
|
|
48
|
-
else if (c === "\uFF09" || c === ")") d = Math.max(0, d - 1);
|
|
49
|
-
}
|
|
50
|
-
return d;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/** 导语最短长度:低于它说明这句太短、离开上下文就没信息(实测有一条首句只有 8 字)。 */
|
|
54
|
-
const MIN_LEDE = 24;
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* 取导语,返回 {lede, consumed}。
|
|
58
|
-
*
|
|
59
|
-
* consumed 是导语在正文里吃掉的字符数:折叠块放 body.slice(consumed),因此导语与细节不
|
|
60
|
-
* 重复——不记录它的话,用户点开折叠会看到同一句话出现两次。
|
|
61
|
-
*
|
|
62
|
-
* 优先级:① cap 内第一个长度达标(>= MIN_LEDE)的句末标点,整句收尾最干净;
|
|
63
|
-
* ② cap 内最后一个括号平衡的软标点(分号/逗号/顿号),用省略号收尾、并连标点一起吃进
|
|
64
|
-
* consumed(否则折叠块以「,」开头);③ cap 内没有平衡软标点时,延到 cap 之后最近的平衡
|
|
65
|
-
* 软标点,容许有限超长;④ 兜底硬截断。
|
|
66
|
-
*
|
|
67
|
-
* 两条规则都是被真实语料逼出来的:v0.9.0 的「GET /external-api(明文回吐 Bearer,」是在
|
|
68
|
-
* 未闭合的括号里切断的(故有 depthAt);同批有条首句「两处水源在说谎。」短到无法独立表意
|
|
69
|
-
* (故有 MIN_LEDE)。
|
|
70
|
-
*/
|
|
71
|
-
export function lede(body, cap = 150) {
|
|
72
|
-
if (!body) return { lede: "", consumed: 0 };
|
|
73
|
-
// 正文本身不比 cap 长:整段就是导语。这一条必须排在软断点搜索**之前**——否则短正文里
|
|
74
|
-
// 只要有个逗号就会被加上省略号,凭空说「后面还有」;逗号恰是最后一个字符时更荒唐:
|
|
75
|
-
// 省略号后面什么也没有,折叠块是空的。原先这条守在函数末尾,靠句末标点分支侥幸躲过多数
|
|
76
|
-
// 情况,只有「短且没有句末标点」的正文才会踩到。
|
|
77
|
-
if (body.length <= cap) return { lede: body, consumed: body.length };
|
|
78
|
-
for (let i = 0; i < body.length && i < cap; i += 1) {
|
|
79
|
-
if (END.test(body[i]) && i + 1 >= MIN_LEDE) return { lede: body.slice(0, i + 1), consumed: i + 1 };
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
let before = -1;
|
|
83
|
-
for (const mark of SOFT) {
|
|
84
|
-
let at = body.slice(0, cap).lastIndexOf(mark);
|
|
85
|
-
while (at !== -1 && depthAt(body, at) !== 0) at = body.slice(0, at).lastIndexOf(mark);
|
|
86
|
-
if (at > before) before = at;
|
|
87
|
-
}
|
|
88
|
-
if (before >= MIN_LEDE) return { lede: body.slice(0, before) + "\u2026", consumed: before + 1 };
|
|
89
|
-
|
|
90
|
-
const limit = Math.floor(cap * 1.6);
|
|
91
|
-
for (let i = cap; i < Math.min(body.length, limit); i += 1) {
|
|
92
|
-
if (SOFT.includes(body[i]) && depthAt(body, i) === 0) {
|
|
93
|
-
return { lede: body.slice(0, i) + "\u2026", consumed: i + 1 };
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return { lede: body.slice(0, cap) + "\u2026", consumed: cap };
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* 渲染 Release 正文:输入 findSection 的结果(小节正文),输出可直接写进
|
|
102
|
-
* gh release --notes-file 的 Markdown。
|
|
103
|
-
*
|
|
104
|
-
* 折叠块的缩进按 GitHub 列表项的规则写成两个空格;少缩进一级会被渲染成独立段落,
|
|
105
|
-
* 整条子弹的视觉归属就断了。列表项内 details 与正文之间必须有空行,否则内部 Markdown 不解析。
|
|
106
|
-
*/
|
|
107
|
-
/**
|
|
108
|
-
* 把一个小节切成「块」:一个块 = 一条子弹 + 它下面所有缩进续行(含缩进的子列表)。
|
|
109
|
-
*
|
|
110
|
-
* 为什么必须先切块再渲染:CHANGELOG 里有 179 行缩进续行(0.8.6 / 0.8.7 / 0.8.12 等老版本集中
|
|
111
|
-
* 出现,另有 59 行 ` - ` 子列表)。逐行 trim 的写法会把续行当成独立段落甩到条目的
|
|
112
|
-
* `<details>` 外面——读者看到的是「条目正文只有一句,剩下的莫名其妙散在下面」,而且缩进没了、
|
|
113
|
-
* 子列表变成平铺段落。渲染的单位是**条目**,不是行。
|
|
114
|
-
*/
|
|
115
|
-
export function splitBlocks(sectionText) {
|
|
116
|
-
const blocks = [];
|
|
117
|
-
for (const raw of sectionText.split(/\r?\n/)) {
|
|
118
|
-
if (!raw.trim()) continue;
|
|
119
|
-
// 缩进行且当前有可挂靠的块 → 续行;否则(块首行之外的单行文本)另起一块。
|
|
120
|
-
if (/^[ \t]+\S/.test(raw) && blocks.length) {
|
|
121
|
-
blocks[blocks.length - 1].lines.push(raw.replace(/\s+$/, ""));
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
124
|
-
blocks.push({ lines: [raw.trim()] });
|
|
125
|
-
}
|
|
126
|
-
return blocks;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
export function renderNotes(sectionText, opts = {}) {
|
|
130
|
-
const cap = opts.cap || 150;
|
|
131
|
-
const out = [];
|
|
132
|
-
for (const block of splitBlocks(sectionText)) {
|
|
133
|
-
const line = block.lines[0];
|
|
134
|
-
if (/^## /.test(line)) { out.push("", line, ""); continue; }
|
|
135
|
-
const b = parseBullet(line);
|
|
136
|
-
if (!b) { out.push(line); continue; }
|
|
137
|
-
// 导语**只从条目首行取**:可见行必须是单行,混进换行就等于把续行又推回 details 外面。
|
|
138
|
-
// 首行剩下的部分 + 全部续行(各自保留缩进,子列表才不会塌成段落)一起进折叠块。
|
|
139
|
-
const { lede: l, consumed } = lede(b.body, cap);
|
|
140
|
-
out.push("- **" + b.title + "**" + (l ? " — " + l : ""));
|
|
141
|
-
const rest = [b.body.slice(consumed).trim(), ...block.lines.slice(1).map((c) => c.replace(/\s+$/, ""))]
|
|
142
|
-
.filter(Boolean)
|
|
143
|
-
.join("\n");
|
|
144
|
-
if (rest) out.push(" <details><summary>细节</summary>", "", " " + rest.replace(/\n/g, "\n "), "", " </details>");
|
|
145
|
-
}
|
|
146
|
-
return out.join("\n").replace(/\n{3,}/g, "\n\n").trim() + "\n";
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/** release.yml 的调用方式:node dsh-mneme/scripts/release-notes.mjs <version>(cwd 为仓库根)。 */
|
|
150
|
-
function main() {
|
|
151
|
-
const v = (process.argv[2] || "").replace(/^v/, "");
|
|
152
|
-
// 允许预发布后缀:0.14.0-beta.1 是合法发布版本,此前这条守卫把它当非法用法直接 exit 1,
|
|
153
|
-
// 于是 release job 在抽正文这步就红了——预发布版根本发不出去。语义校验交给
|
|
154
|
-
// semver 的形状(x.y.z 后可跟 -标识),不做额外白名单。
|
|
155
|
-
if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(v)) { console.error("usage: release-notes.mjs <version>"); process.exit(1); }
|
|
156
|
-
const md = readFileSync("dsh-mneme/CHANGELOG.md", "utf8");
|
|
157
|
-
const sec = findSection(md, v);
|
|
158
|
-
if (!sec) { console.error("changelog section not found: " + v); process.exit(1); }
|
|
159
|
-
const body = renderNotes(sec);
|
|
160
|
-
mkdirSync("notes", { recursive: true });
|
|
161
|
-
writeFileSync("notes/body.md", body);
|
|
162
|
-
console.log("--- extracted notes ---\n" + body.slice(0, 400));
|
|
163
|
-
}
|
|
164
|
-
|
|
1
|
+
// 从 CHANGELOG 小节渲染 GitHub Release 正文的单一实现。
|
|
2
|
+
//
|
|
3
|
+
// 为什么抽成模块:这段逻辑原先嵌在 .github/workflows/release.yml 的 node -e 内联脚本里,
|
|
4
|
+
// 要改排版就得改工作流本体,也没法写测试——而 Release 正文恰恰是最需要反复试排版的东西。
|
|
5
|
+
// 抽出来之后同样的输入产出同样的正文,本地能预览、CI 能锁形状。
|
|
6
|
+
//
|
|
7
|
+
// 排版目标:Release 页的默认视图要能一眼扫完,但完整正文不能丢——它同时是「这个版本到底
|
|
8
|
+
// 改了什么」的唯一对外说明。做法是标题 + 一句导语默认可见,剩余正文折进 details,想细看的
|
|
9
|
+
// 人点开,不想看的人不被淹。
|
|
10
|
+
//
|
|
11
|
+
// CHANGELOG 本体一个字不动:那是仓库内的完整记录(含决策理由与审计线索),压缩它等于销毁
|
|
12
|
+
// 证据;分层只发生在对外渲染这一步。
|
|
13
|
+
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
14
|
+
import { fileURLToPath } from "node:url";
|
|
15
|
+
|
|
16
|
+
// 句末标点以中文全角为主。刻意不认半角句号:v0.9.0 这类版本号里的点是同一个字符,
|
|
17
|
+
// 认了会把导语切在版本号中间。
|
|
18
|
+
const END = /[。!?]/;
|
|
19
|
+
// 导语超长时的退让点,从强到弱。半角分号/逗号兜住中英混排的条目。
|
|
20
|
+
const SOFT = [";", ",", ";", ","];
|
|
21
|
+
|
|
22
|
+
/** 取出某个版本的 CHANGELOG 小节正文(不含 ## [V] 标题行本身);找不到返回 null。 */
|
|
23
|
+
export function findSection(text, version) {
|
|
24
|
+
const re = new RegExp("^## \\[" + version.replace(/\./g, "\\.") + "\\][^\\n]*\\n", "m");
|
|
25
|
+
const start = text.search(re);
|
|
26
|
+
if (start === -1) return null;
|
|
27
|
+
const rest = text.slice(start + text.slice(start).indexOf("\n") + 1);
|
|
28
|
+
const next = rest.search(/^## \[/m);
|
|
29
|
+
return (next === -1 ? rest : rest.slice(0, next)).trim();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** 拆 - **标题**:正文;不是这个形状返回 null,调用方按普通行原样保留。 */
|
|
33
|
+
export function parseBullet(line) {
|
|
34
|
+
const m = line.match(/^- \*\*(.+?)\*\*(?:[::]\s*)?([\s\S]*)$/);
|
|
35
|
+
if (!m) return null;
|
|
36
|
+
return { title: m[1].trim(), body: (m[2] || "").trim() };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* 括号深度:全角(或半角( 进一层,)或) 出一层。导语绝不在未闭合的括号里断开——
|
|
41
|
+
* 「…(明文回吐 Bearer,」这种收尾等于把一句话切在从句中间,读者要回头找主语。
|
|
42
|
+
*/
|
|
43
|
+
function depthAt(s, end) {
|
|
44
|
+
let d = 0;
|
|
45
|
+
for (let i = 0; i < end; i += 1) {
|
|
46
|
+
const c = s[i];
|
|
47
|
+
if (c === "\uFF08" || c === "(") d += 1;
|
|
48
|
+
else if (c === "\uFF09" || c === ")") d = Math.max(0, d - 1);
|
|
49
|
+
}
|
|
50
|
+
return d;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** 导语最短长度:低于它说明这句太短、离开上下文就没信息(实测有一条首句只有 8 字)。 */
|
|
54
|
+
const MIN_LEDE = 24;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* 取导语,返回 {lede, consumed}。
|
|
58
|
+
*
|
|
59
|
+
* consumed 是导语在正文里吃掉的字符数:折叠块放 body.slice(consumed),因此导语与细节不
|
|
60
|
+
* 重复——不记录它的话,用户点开折叠会看到同一句话出现两次。
|
|
61
|
+
*
|
|
62
|
+
* 优先级:① cap 内第一个长度达标(>= MIN_LEDE)的句末标点,整句收尾最干净;
|
|
63
|
+
* ② cap 内最后一个括号平衡的软标点(分号/逗号/顿号),用省略号收尾、并连标点一起吃进
|
|
64
|
+
* consumed(否则折叠块以「,」开头);③ cap 内没有平衡软标点时,延到 cap 之后最近的平衡
|
|
65
|
+
* 软标点,容许有限超长;④ 兜底硬截断。
|
|
66
|
+
*
|
|
67
|
+
* 两条规则都是被真实语料逼出来的:v0.9.0 的「GET /external-api(明文回吐 Bearer,」是在
|
|
68
|
+
* 未闭合的括号里切断的(故有 depthAt);同批有条首句「两处水源在说谎。」短到无法独立表意
|
|
69
|
+
* (故有 MIN_LEDE)。
|
|
70
|
+
*/
|
|
71
|
+
export function lede(body, cap = 150) {
|
|
72
|
+
if (!body) return { lede: "", consumed: 0 };
|
|
73
|
+
// 正文本身不比 cap 长:整段就是导语。这一条必须排在软断点搜索**之前**——否则短正文里
|
|
74
|
+
// 只要有个逗号就会被加上省略号,凭空说「后面还有」;逗号恰是最后一个字符时更荒唐:
|
|
75
|
+
// 省略号后面什么也没有,折叠块是空的。原先这条守在函数末尾,靠句末标点分支侥幸躲过多数
|
|
76
|
+
// 情况,只有「短且没有句末标点」的正文才会踩到。
|
|
77
|
+
if (body.length <= cap) return { lede: body, consumed: body.length };
|
|
78
|
+
for (let i = 0; i < body.length && i < cap; i += 1) {
|
|
79
|
+
if (END.test(body[i]) && i + 1 >= MIN_LEDE) return { lede: body.slice(0, i + 1), consumed: i + 1 };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
let before = -1;
|
|
83
|
+
for (const mark of SOFT) {
|
|
84
|
+
let at = body.slice(0, cap).lastIndexOf(mark);
|
|
85
|
+
while (at !== -1 && depthAt(body, at) !== 0) at = body.slice(0, at).lastIndexOf(mark);
|
|
86
|
+
if (at > before) before = at;
|
|
87
|
+
}
|
|
88
|
+
if (before >= MIN_LEDE) return { lede: body.slice(0, before) + "\u2026", consumed: before + 1 };
|
|
89
|
+
|
|
90
|
+
const limit = Math.floor(cap * 1.6);
|
|
91
|
+
for (let i = cap; i < Math.min(body.length, limit); i += 1) {
|
|
92
|
+
if (SOFT.includes(body[i]) && depthAt(body, i) === 0) {
|
|
93
|
+
return { lede: body.slice(0, i) + "\u2026", consumed: i + 1 };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return { lede: body.slice(0, cap) + "\u2026", consumed: cap };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* 渲染 Release 正文:输入 findSection 的结果(小节正文),输出可直接写进
|
|
102
|
+
* gh release --notes-file 的 Markdown。
|
|
103
|
+
*
|
|
104
|
+
* 折叠块的缩进按 GitHub 列表项的规则写成两个空格;少缩进一级会被渲染成独立段落,
|
|
105
|
+
* 整条子弹的视觉归属就断了。列表项内 details 与正文之间必须有空行,否则内部 Markdown 不解析。
|
|
106
|
+
*/
|
|
107
|
+
/**
|
|
108
|
+
* 把一个小节切成「块」:一个块 = 一条子弹 + 它下面所有缩进续行(含缩进的子列表)。
|
|
109
|
+
*
|
|
110
|
+
* 为什么必须先切块再渲染:CHANGELOG 里有 179 行缩进续行(0.8.6 / 0.8.7 / 0.8.12 等老版本集中
|
|
111
|
+
* 出现,另有 59 行 ` - ` 子列表)。逐行 trim 的写法会把续行当成独立段落甩到条目的
|
|
112
|
+
* `<details>` 外面——读者看到的是「条目正文只有一句,剩下的莫名其妙散在下面」,而且缩进没了、
|
|
113
|
+
* 子列表变成平铺段落。渲染的单位是**条目**,不是行。
|
|
114
|
+
*/
|
|
115
|
+
export function splitBlocks(sectionText) {
|
|
116
|
+
const blocks = [];
|
|
117
|
+
for (const raw of sectionText.split(/\r?\n/)) {
|
|
118
|
+
if (!raw.trim()) continue;
|
|
119
|
+
// 缩进行且当前有可挂靠的块 → 续行;否则(块首行之外的单行文本)另起一块。
|
|
120
|
+
if (/^[ \t]+\S/.test(raw) && blocks.length) {
|
|
121
|
+
blocks[blocks.length - 1].lines.push(raw.replace(/\s+$/, ""));
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
blocks.push({ lines: [raw.trim()] });
|
|
125
|
+
}
|
|
126
|
+
return blocks;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export function renderNotes(sectionText, opts = {}) {
|
|
130
|
+
const cap = opts.cap || 150;
|
|
131
|
+
const out = [];
|
|
132
|
+
for (const block of splitBlocks(sectionText)) {
|
|
133
|
+
const line = block.lines[0];
|
|
134
|
+
if (/^## /.test(line)) { out.push("", line, ""); continue; }
|
|
135
|
+
const b = parseBullet(line);
|
|
136
|
+
if (!b) { out.push(line); continue; }
|
|
137
|
+
// 导语**只从条目首行取**:可见行必须是单行,混进换行就等于把续行又推回 details 外面。
|
|
138
|
+
// 首行剩下的部分 + 全部续行(各自保留缩进,子列表才不会塌成段落)一起进折叠块。
|
|
139
|
+
const { lede: l, consumed } = lede(b.body, cap);
|
|
140
|
+
out.push("- **" + b.title + "**" + (l ? " — " + l : ""));
|
|
141
|
+
const rest = [b.body.slice(consumed).trim(), ...block.lines.slice(1).map((c) => c.replace(/\s+$/, ""))]
|
|
142
|
+
.filter(Boolean)
|
|
143
|
+
.join("\n");
|
|
144
|
+
if (rest) out.push(" <details><summary>细节</summary>", "", " " + rest.replace(/\n/g, "\n "), "", " </details>");
|
|
145
|
+
}
|
|
146
|
+
return out.join("\n").replace(/\n{3,}/g, "\n\n").trim() + "\n";
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** release.yml 的调用方式:node dsh-mneme/scripts/release-notes.mjs <version>(cwd 为仓库根)。 */
|
|
150
|
+
function main() {
|
|
151
|
+
const v = (process.argv[2] || "").replace(/^v/, "");
|
|
152
|
+
// 允许预发布后缀:0.14.0-beta.1 是合法发布版本,此前这条守卫把它当非法用法直接 exit 1,
|
|
153
|
+
// 于是 release job 在抽正文这步就红了——预发布版根本发不出去。语义校验交给
|
|
154
|
+
// semver 的形状(x.y.z 后可跟 -标识),不做额外白名单。
|
|
155
|
+
if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(v)) { console.error("usage: release-notes.mjs <version>"); process.exit(1); }
|
|
156
|
+
const md = readFileSync("dsh-mneme/CHANGELOG.md", "utf8");
|
|
157
|
+
const sec = findSection(md, v);
|
|
158
|
+
if (!sec) { console.error("changelog section not found: " + v); process.exit(1); }
|
|
159
|
+
const body = renderNotes(sec);
|
|
160
|
+
mkdirSync("notes", { recursive: true });
|
|
161
|
+
writeFileSync("notes/body.md", body);
|
|
162
|
+
console.log("--- extracted notes ---\n" + body.slice(0, 400));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
165
|
if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) main();
|