Rust consumers pin a CultLib revision through cargo git dependencies, which is how Ghostlight, Epiphany, CodexConnector and Odin already consume the core stack. npm and pip cannot take a package from a subdirectory of a git repo at all, which is why the TypeScript and Python consumers vendored forks instead: there was nothing else to depend on. This gives them a versioned artifact. Tagging cultcache-ts-v* or cultcache-py-v* builds, tests and publishes. The tag version must match the manifest version or the workflow refuses rather than shipping a mislabelled artifact. PyPI uses trusted publishing, so no long-lived token is stored; npm needs an NPM_TOKEN secret. cultcache-ts is now @gamecult/cultcache-ts. The scope is not cosmetic: it makes the package unambiguously org-owned on a public registry, and it is what lets CultLib hold the name rather than racing for an unscoped one. CultLib's own cultmesh-ts and cultnet-ts and their imports move with it; all three packages typecheck and cultcache-ts passes 12 of 13 tests, the exception being the cross-runtime store test that shells out to Python, which cannot run on this machine because its Python has no msgpack. Licensing was inconsistent with the repo. cultcache-py declared itself "Private GameCult infrastructure" and cultcache-rs and cultmesh-rs declared nothing, inside a repo whose LICENSE is MIT and whose every other package says MIT. All three now say MIT. That was load-bearing here: a package that calls itself private is not one to push to a public registry. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
64 lines
2.2 KiB
JSON
64 lines
2.2 KiB
JSON
{
|
|
"name": "cultnet-ts",
|
|
"version": "0.2.0",
|
|
"description": "CultNet-style typed direct-pipe messaging and state replication for TypeScript runtimes.",
|
|
"main": "dist/index.js",
|
|
"types": "dist/index.d.ts",
|
|
"exports": {
|
|
".": {
|
|
"types": "./dist/index.d.ts",
|
|
"require": "./dist/index.js",
|
|
"default": "./dist/index.js"
|
|
},
|
|
"./contracts": {
|
|
"types": "./dist/contracts.d.ts",
|
|
"require": "./dist/contracts.js",
|
|
"default": "./dist/contracts.js"
|
|
}
|
|
},
|
|
"files": [
|
|
"dist",
|
|
"contracts"
|
|
],
|
|
"scripts": {
|
|
"contracts:generate": "node tools/generate-swarm-contracts.mjs",
|
|
"build": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json",
|
|
"prepack": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json",
|
|
"typecheck": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json --pretty false",
|
|
"test": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json && node ../../node_modules/typescript/bin/tsc -p tsconfig.test.json && node --test dist-test/test/*.test.js",
|
|
"test:interop": "node tools/generate-swarm-contracts.mjs && node ../../node_modules/typescript/bin/tsc -p tsconfig.json && node ../../node_modules/typescript/bin/tsc -p tsconfig.test.json && node --test dist-test/test/interop/*.test.js"
|
|
},
|
|
"keywords": [
|
|
"messagepack",
|
|
"networking",
|
|
"pipes",
|
|
"cultcache",
|
|
"gamecult",
|
|
"typescript"
|
|
],
|
|
"author": "metacratic",
|
|
"license": "MIT",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "git+https://github.com/GameCult/CultLib.git",
|
|
"directory": "packages/cultnet-ts"
|
|
},
|
|
"bugs": {
|
|
"url": "https://github.com/GameCult/CultLib/issues"
|
|
},
|
|
"homepage": "https://github.com/GameCult/CultLib/tree/main/packages/cultnet-ts#readme",
|
|
"engines": {
|
|
"node": ">=18"
|
|
},
|
|
"dependencies": {
|
|
"@msgpack/msgpack": "^3.1.3",
|
|
"ajv": "^8.17.1",
|
|
"@gamecult/cultcache-ts": "^0.13.5"
|
|
},
|
|
"devDependencies": {
|
|
"@types/node": "^24.0.0",
|
|
"json-schema-to-typescript": "^15.0.4",
|
|
"typescript": "^5.9.0",
|
|
"zod": "^3.25.76"
|
|
}
|
|
}
|