89c0fbe1f6
The deploy pipeline runs from the working tree, so a wave of shipped features
had never been committed. This snapshots git to what's actually running.
SEO impression recovery (live + verified):
- Duplicate /a/{id} now 301-redirect to their canonical twin instead of 404
(a hard 404 silently dropped already-indexed URLs and tanked impressions).
- Dedup representative selection reworked: accepted/serveable -> established
rep (URL stability) -> quality score, so an accepted page never retires to a
rejected rep and an indexed canonical doesn't churn when a newer twin arrives.
- HEAD /a/{id} returns the same status as GET (api_route GET+HEAD) instead of
falling through to the static mount and 404ing.
- `dedup --force-recluster`: cycle-locked, model-free re-cluster to re-apply the
policy to the existing corpus (shared cycle_lock context manager).
- CLI honors GOODNEWS_DB for its default --db (was silently ignored).
Publishing Desk (admin tool to post highlights to X via Web Intents):
- publishing.py queue/rank/handle-resolution; admin UI; full searchable emoji
picker (bundled data, no CDN) for the blurb editor.
Play games + site:
- Bloom (word-wheel), Memory Match, daily ritual set, Zen Den (dev-gated).
- English-only language gate; source prospecting; paywall + dedup hardening.
Tests: full suite green (349). Ignores tightened (node_modules, data/*.db).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
48 lines
1.7 KiB
JSON
48 lines
1.7 KiB
JSON
{
|
|
"name": "glb-split",
|
|
"lockfileVersion": 3,
|
|
"requires": true,
|
|
"packages": {
|
|
"": {
|
|
"name": "glb-split",
|
|
"dependencies": {
|
|
"@gltf-transform/core": "^4.4.0",
|
|
"@gltf-transform/extensions": "^4.4.0"
|
|
}
|
|
},
|
|
"node_modules/@gltf-transform/core": {
|
|
"version": "4.4.0",
|
|
"resolved": "https://registry.npmjs.org/@gltf-transform/core/-/core-4.4.0.tgz",
|
|
"integrity": "sha512-cOPxOhHFFz5hwmix+li1+Nnq5qMV/QD3fTCsVlApxxFACtFdjkt2R/juseD4gvZ7D2c/yl6OilKH0pvI735YyQ==",
|
|
"dependencies": {
|
|
"property-graph": "^4.1.0"
|
|
},
|
|
"funding": {
|
|
"url": "https://github.com/sponsors/donmccurdy"
|
|
}
|
|
},
|
|
"node_modules/@gltf-transform/extensions": {
|
|
"version": "4.4.0",
|
|
"resolved": "https://registry.npmjs.org/@gltf-transform/extensions/-/extensions-4.4.0.tgz",
|
|
"integrity": "sha512-ZwEgFkkqnUR7d4m6roK9BycxxdoqJNtVyo7w5ShJ9syKBoQiXw2QrTSLwXaUAImSrEIl9Jh/wZTtvSVyviQuXg==",
|
|
"dependencies": {
|
|
"@gltf-transform/core": "^4.4.0",
|
|
"ktx-parse": "^1.1.0"
|
|
},
|
|
"funding": {
|
|
"url": "https://github.com/sponsors/donmccurdy"
|
|
}
|
|
},
|
|
"node_modules/ktx-parse": {
|
|
"version": "1.1.0",
|
|
"resolved": "https://registry.npmjs.org/ktx-parse/-/ktx-parse-1.1.0.tgz",
|
|
"integrity": "sha512-mKp3y+FaYgR7mXWAbyyzpa/r1zDWeaunH+INJO4fou3hb45XuNSwar+7llrRyvpMWafxSIi99RNFJ05MHedaJQ=="
|
|
},
|
|
"node_modules/property-graph": {
|
|
"version": "4.1.0",
|
|
"resolved": "https://registry.npmjs.org/property-graph/-/property-graph-4.1.0.tgz",
|
|
"integrity": "sha512-AvPcP7XECNWy4LGmFQ77k7un4lSKM4eS29PTvW4ck95uYeLxXPWJM7hLuBqK91FaHqCcgJvIUCuNJjjxKE7VKQ=="
|
|
}
|
|
}
|
|
}
|