summaryrefslogtreecommitdiff
path: root/website
AgeCommit message (Collapse)Author
8 daysdocs: name the anthy engine in the project descriptionHEADmainCharlie Root
The tagline and both plugin descriptors now say that romaji conversion can run inside the server through anthy, so the engine is visible wherever the project describes itself: the README, the website hero and meta description, the API documentation, and the Paper and Velocity plugin descriptors.
8 daysfeat(conversion): run anthy in-process through WebAssemblyCharlie Root
Add a second engine for romaji-to-Japanese conversion that leaves the process alone: anthy, compiled to a WebAssembly module and executed in the JVM by Chicory's build-time AOT, so conversion needs no outbound request. anthy/ carries the module sources, the WASI shims, the reproducible build script, the committed AOT output and the dictionary (~23 MB, extracted into the plugin data folder on first start; an existing file is left alone). features.japaneseConversion.engine selects "google" or "anthy", and the anthy block adds dictionary, workDirectory and sentenceLevel. RomanjiConverter now sits on a KanjiConverter interface, so a whole message is handed to the engine at once - anthy segments and reorders a sentence instead of converting word by word - and the conversion cache is keyed by that sentence. The engine tests drive the real module, the dictionary tests cover the extraction, and everything else keeps running on the existing fakes.
2026-10-01chore(deps): update dependency @biomejs/biome to v2.5.15 (#321)renovate[bot]
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-28docs(changelog): add release notes for paper v1.5.0 and velocity v1.3.1Sho Sakuma
The GitHub Release and the Modrinth version both link to these pages, so they have to be deployed before the tags are pushed. Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-28feat: carry the sender's world in cross-server direct messagesSho Sakuma
{world} rendered empty for a direct message from another server, which left formats like "({world})" showing a bare pair of brackets. The relay now carries the sender's world as an optional field, so this is a PATCH bump (protocol 1.0.2) and either side can be updated first; an older sender or proxy still yields an empty value. The world is read once per message, so the sender, the spies and the relayed copy can no longer disagree if the sender changes worlds mid-way. Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-28fix(paper): splice display names as components and share role labelsSho Sakuma
Serializing the display name into the legacy text let its color run into everything after it, and legacy text cannot hold hex colors or hover and click events, so names styled by other plugins came out wrong. The name is now spliced into the parsed component instead. {role} is resolved only when the format uses it, since the default formats do not and it costs a member scan and a lookup per message. /lc channel status now shows the same localized role names instead of a second, hard-coded [OWNER] / [MOD] vocabulary that only one of the two places translated. Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-28feat(paper): add world, display_name, channel_id and role chat placeholdersSho Sakuma
Operators asked for more of the sender's context in chat formats than the name alone. {world} covers direct messages and channel chat; the channel details and the sender's display name and role only exist for channel chat, so only that format accepts them. A direct message from another server renders {world} empty: the relay does not carry the sender's world, and adding it would need a protocol bump and a coordinated Velocity release for one placeholder. The renderer now accepts underscores so the snake_case names match as written. Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-28refactor(paper): render chat formats through one placeholder vocabularySho Sakuma
Placeholder names were spelled as string literals in three handlers, and each handler also chose its own way of turning the result into a Component. Adding a placeholder meant finding every call site by hand, with nothing to catch a format left without its value. ChatPlaceholder now owns the names, and each format has an entry point whose parameters are exactly the placeholders it accepts, so the compiler points at the callers when one is added. Substitution happens in a single pass, so a value that itself contains "{message}" is no longer replaced again by the next placeholder. All three formats now deserialize section signs into styles, which leaves what players see unchanged. Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-28docs: record the tag scheme change and the update checker fix in CHANGELOGSho Sakuma
The fix is a bug fix only, so it goes under a v1.4.1 heading. The tag scheme notes now say "up to v1.4.0" instead of naming v1.5.0, because the next Paper release is a patch and the boundary would otherwise point at a version that may never ship. Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-28ci: tag each release with exactly one platformSho Sakuma
A vX.Y.Z tag used to ship both JARs under the Paper version number, so the Velocity version never appeared in a tag. Changelog download links guessed paper/ and velocity/ tags that did not exist and returned 404, and the same JAR resurfaced under several releases. Paper now releases on vX.Y.Z and Velocity on velocity/vX.Y.Z, which matches the CHANGELOG.md headings one to one. Paper keeps the bare form rather than moving to paper/vX.Y.Z because the update checker in already-deployed Paper builds only understands that form. Both workflows call a shared reusable workflow, since the two had drifted into near-identical copies. Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-16chore(deps): update dependency @biomejs/biome to v2.5.14 (#309)renovate[bot]
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-10chore(deps): update dependency @biomejs/biome to v2.5.13 (#303)renovate[bot]
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-03chore(deps): update dependency @biomejs/biome to v2.5.12 (#298)renovate[bot]
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-31Merge pull request #297 from m1sk9/feat/release-v1.4.0Sho Sakuma
feat: Release LunaticChat v1.4.0
2026-08-30docs: Add v1.4.0 docSho Sakuma
2026-08-30fix(build): give nightly builds a version of their ownSho Sakuma
A nightly JAR was named after the bare release version, so a build from main and the release of the same base version were indistinguishable in the JAR file name, /plugins and bug reports; only build-info.properties knew the difference, and Velocity does not even ship that file. The x script tried to express this with -Pversion, but each module assigns its own version from paperVersion/velocityVersion, so the override never took effect. Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-30Merge branch 'main' into feat/config-reloadSho Sakuma
2026-08-27chore(deps): update dependency @biomejs/biome to v2.5.11 (#290)renovate[bot]
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-21chore(deps): update dependency @biomejs/biome to v2.5.10 (#284)renovate[bot]
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-18chore(deps): update dependency @biomejs/biome to v2.5.9 (#281)renovate[bot]
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-11chore(deps): update dependency @biomejs/biome to v2.5.8 (#279)renovate[bot]
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-10feat(paper): report /lc reload as a single-line resultSho Sakuma
The reply listed every setting that had moved and every setting that still needed a restart, as dotted keys. That buried the one bit that changes what the operator does next - whether they have to restart - under names they had just typed themselves and did not need read back to them. The detail is not lost: which settings moved was already written to the server log on every reload, which is the better home for it anyway, since a format change can be dated there long after the chat line has scrolled away. A pending restart now outranks "nothing changed" even when nothing could be applied. Reporting no change to someone who did edit the file would send them hunting for a typo they had not made. The failure path still names each unreadable setting and the reason it was rejected, because that is a list the operator cannot reconstruct and needs in order to fix the file.
2026-08-10feat(paper): add /lc reload to apply message formats without a restartSho Sakuma
Changing a message format meant taking the server down, because config.yml was read once in onEnable and every consumer held the value it was built with. Operators tune these formats far more often than anything else in the file, and a restart is a disproportionate price for a colour code. Only messageFormat is applied. The rest of config.yml settles things once, at startup - which services exist, which commands and listeners are registered, which files are opened - and none of that can be redone while the server runs: Paper registers commands only through its COMMANDS lifecycle event, Bukkit cannot unregister a listener, and the conversion cache saver keeps no task handle to cancel. Rebuilding the services would leave the old ones still wired up, so a changed setting the server cannot pick up is reported back as needing a restart rather than silently ignored. MessageFormatHolder is deliberately narrower than LunaticChatConfiguration: taking it says the value is live, taking the configuration says it was frozen at startup. A holder over the whole tree would hold a configuration matching no version of the file, since only messageFormat is ever swapped. Reload reads config.yml more strictly than startup does, because it has an option startup does not - leaving the running configuration alone. Startup falls a single unreadable setting back to its default so the server can come up; reload refuses the file, names every unreadable setting at once, and keeps what the server already had. A document holding no settings is refused for the same reason: it cannot be told apart from a config.yml caught halfway through being written, and resetting every format over that is worse than doing nothing. Closes #266 Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-05feat: warn where a pair connects but falls short of a featureSho Sakuma
The matrix marked every accepted pair with a plain tick, which reads as "everything works". It does not. ProtocolVersion bumps PATCH for sub-channels a peer can safely ignore, so Paper 1.3.0 (protocol 1.0.1) against Velocity 1.1.0 (1.0.0) completes the handshake and then silently drops cross-server direct messages — the very feature that PATCH was bumped for. An operator reading the tick had no way to learn that, and the pages around it repeated the claim. The handshake is settled by MAJOR and MINOR alone, so any difference left once a pair is accepted is a feature the newer end offers and the older will never answer. Those pairs now carry a warning that says which end lags. Naming the feature would take a protocol-version-to-feature table on the website, which would drift from the protocol it describes, so the warning stays general and leaves the reader one hop from the compatibility page. The handshake verdict keeps the three checks that mirror Velocity's gate, with the new one layered after them, so the mirror stays honest. isCompatible now holds for a degraded pair, which does connect. Cells are built once per pair in a computed instead of recomputing on each of the template's reads, which a third state would otherwise have multiplied. Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-05chore: migrate the linter config off the deprecated recommended fieldSho Sakuma
Biome 2.5.7 deprecates `linter.rules.recommended` in favour of `preset` and will drop it in the next major, so the config emitted a deprecation notice on every run. Renaming it now keeps `bun run lint` and `format:check` clean and spares a forced edit at the next upgrade; the rule set it selects is unchanged. Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-05chore: put the theme's composables under BiomeSho Sakuma
`includes` stopped at `.vitepress/theme/*.ts`, so everything under `components/` went unchecked — including the release and compatibility logic this branch touches. Widening it to `**/*.ts` takes the check from five files to nine. `.vue` stays out. Biome does not resolve `<script setup>` bindings used from the template, so it reports the components' `t`, `data`, `loading` and formatters as unused and offers to delete them; admitting those files would mean turning off noUnusedVariables and noUnusedImports to buy nothing. Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-05docs: name both plugin versions for cross-server direct messagesSho Sakuma
The badge read `v1.3.0~`, pointing at a Velocity release that does not exist. The feature needs both halves, and the Velocity half first shipped as 1.2.0 inside the unified v1.3.0 release, so a reader hunting for Velocity v1.3.0 finds nothing and cannot tell which proxy build carries the relay. Also refreshes the gradle.properties example, which still showed the versions current when it was written. Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-05fix: read plugin versions from release JAR names, not tag namesSho Sakuma
The download cards and the compatibility matrix derived each plugin's version from the release tag, which cannot hold for a unified `vX.Y.Z` release: it carries both JARs and their versions need not agree. v1.3.0 shipped Paper 1.3.0 alongside Velocity 1.2.0. So the download page advertised Paper v1.2.2 and Velocity v1.1.0, two generations stale, because it searched `paper/v` and `velocity/v` tags first and fell back to a unified tag only when none existed. The matrix meanwhile put a Velocity v1.3.0 on its axis that was never released, leaving no row for the proxy build operators actually run. Both now pick releases by the JARs attached to them and take the version from the file name, the only place it is stated. Tag shape stops mattering: a platform-specific tag and a unified one are alike just releases that happen to carry a given JAR. Releases rank by publication time rather than by API response order, which follows tag creation instead: velocity/v1.1.0 precedes the later-published paper/v1.2.2. A version is listed once even when a later unified release re-attaches an unchanged JAR, which release.yaml does whenever only the other platform was bumped. Otherwise the matrix would carry one version twice, under two protocol versions if the protocol had moved in between. Tests run in CI from here on. They need an explicit path because Bun does not discover tests inside dot-directories. Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-05ci: link release notes to the English changelog pagesSho Sakuma
The links were written before the English pages existed, so GitHub and Modrinth sent an international audience to Japanese notes. Both now point at the English pages; the Japanese ones remain reachable from the site's own locale switch. Also stops the changelog template from being served. It lives under `src/`, so VitePress published it as a page of empty headings at /assets/changelog-default, where it was reachable and indexable. `srcExclude` keeps it a template. The tag table on the changelog overview claimed `vX.Y.Z` was last used for v1.0.0 and retired, which contradicts release.yaml and the release skill still supporting it; it now says what the tag is for. Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-05docs: correct the cross-server DM server name and two related claimsSho Sakuma
The `@<server>` argument resolves against the server names registered in `velocity.toml`, not the `features.velocityIntegration.serverName` of the destination: PresenceTracker publishes `serverInfo.name` and CrossServerDirectMessageRelay matches the target against the same, so the previous text had it exactly backwards. Following it on a proxy where the two names differ produces SERVER_NOT_FOUND every time, and points the reader at the wrong file to fix. `serverName` still matters, for `{server}` and for recognising local players, so what it does is stated instead. Also corrects two claims made while widening these pages: - `/lcv status` reports only this server's protocol version, not both sides'. The Velocity bug template leaned on it as its most important field, so a reporter would have pasted output that cannot answer the compatibility question. It now also says to run it after a player has joined, since the handshake waits for one - the same caveat the README install steps needed. - Spies see pre-conversion text for direct messages only. Channel messages are converted before the handler runs, so spies get the same formatted string the members do. Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-05docs: add changelog pages to the documentation siteSho Sakuma
Release notes were written into the GitHub release body, which means they exist once, in English only, and are awkward to revise after publishing. Putting them on the site gives each release a Japanese and an English page that can be corrected later and linked from anywhere. The overview page states the versioning rules the version numbers alone do not convey: that dropping a supported platform is a MINOR bump, that the Paper and Velocity builds advance separately, and that the plugin version says nothing about compatibility. Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-05docs: correct the website where it had drifted from the implementationSho Sakuma
Several statements were wrong rather than merely thin, and each would have set the wrong expectation: - the conversion example implied romaji replaces the input, when the result is appended in parentheses and both are sent - the handshake was described as happening at startup, when it waits for the first player to join, so a DISCONNECTED status on an empty server read as a fault - cache eviction was called oldest-first, which the unordered in-memory map cannot provide - the Velocity settings table omitted crossServerDirectMessage - ConfigManager was described as reading Bukkit's FileConfiguration, and the settings storage as recovering from a backup that does not exist It also documents behaviour that had no mention anywhere: the `!` force-global prefix, that spy sees channel messages and not only DMs, the nightly build warnings, the overall 1000ms conversion budget that makes api.timeout above it ineffective, and the data files the plugin writes. Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-05docs: drop api.retryAttempts, which no longer existsSho Sakuma
The key is gone from config.yml, but four pages still documented it with a default of 2, so operators would keep setting something nothing reads. Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-04chore(deps): update dependency @biomejs/biome to v2.5.7 (#264)renovate[bot]
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-02feat(velocity)!: build against Velocity API 4.0.0 and drop Velocity 3.5.x ↵Sho Sakuma
support Velocity moved to the 4.x generation while platform-velocity still compiled against 3.5.1, so the debug environment had to pin an older proxy than the one most users now run. The migration needed no source changes. Comparing every one of the 213 classes in the API jar with javap shows 4.0.0 is identical to 3.5.1 in its public signatures; the supported protocol range is unchanged too. The one real difference is the POM, which moves adventure-bom from 4.26.1 to 5.2.0. Support for 3.5.x is dropped even though the JAR would still load there, because keeping it meant Adventure 4.26.1 could be the runtime and engine had to stay inside the API surface both Adventure majors share -- a constraint no build step could check. Narrowing to 4.x makes every supported runtime ship Adventure 5.2.0, matching what engine already compiles against, so the constraint is gone rather than merely documented. Nothing enforces the requirement in code, matching how dropping 3.4.0 was handled in v1.1.0. Also drops two dead dependencies: kaml, declared but never imported, worth about 1 MB of shaded JAR, and the velocity-api annotationProcessor, which does nothing without Java sources or kapt.
2026-08-02feat: support Paper 26.2 (Minecraft 26.2)Sho Sakuma
Paper 26.2 bundles Adventure 5.2.0, a major bump from the 4.26.1 shipped by 26.1. Adventure 5 makes ClickEvent generic, so the raw type in CommandContext.replyWithEvent no longer compiled. Auditing the rest of the Adventure 5 removals found no other affected usage. api-version is raised to 26.2, dropping 26.1 support: the two Adventure majors are not binary compatible, so claiming 26.1 compatibility would be a lie. Also fixes two problems found while verifying on a real server: the Velocity healthcheck invoked mc-health, which does not exist in the mc-proxy image, so the container had never once passed its check; and the debug environments pinned no build at all, which meant the proxy came up as 4.1.0-SNAPSHOT while the plugin is compiled against velocity-api 3.5.1. Server versions are now derived by x from the Gradle coordinates so they cannot drift from what the plugin targets.
2026-07-28chore(deps): update dependency @biomejs/biome to v2.5.6 (#255)renovate[bot]
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-21chore(deps): update dependency @biomejs/biome to v2.5.5 (#252)renovate[bot]
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-19docs: add developer design/architecture guide (EN/JA) (#251)Sho Sakuma
* docs: add developer design/architecture guide (EN/JA) The docs site covered features and reference but had no entry point for the codebase's design. Add a Developer Guide section describing the module structure (engine shared kernel, platform-paper, platform-velocity), the protocol-version compatibility model, and the Service Container / Feature Gating pattern, so contributors can understand the architecture without reading the source first. Co-Authored-By: Claude <noreply@anthropic.com> * docs: mirror cross-server DM docs into English (#231) PR #231 added the cross-server direct messaging feature but updated only the Japanese docs. Port the same additions to the English pages (configuration, direct-message, velocity, commands) so both locales stay in sync. Co-Authored-By: Claude <noreply@anthropic.com> * style: apply biome formatting to ja.ts sidebar config The developer-guide sidebar entries were not biome-formatted, failing the build_docs CI check (format:check). Apply the formatter. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
2026-07-15chore(deps): update dependency @biomejs/biome to v2.5.4 (#249)renovate[bot]
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-08chore(deps): update dependency @biomejs/biome to v2.5.3 (#245)renovate[bot]
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-01chore(deps): update dependency @biomejs/biome to v2.5.2 (#241)renovate[bot]
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-23chore(deps): update dependency @biomejs/biome to v2.5.1 (#236)renovate[bot]
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-17Merge branch 'main' into feat/226-cross-server-direct-messageSho Sakuma
2026-06-17docs: add cross-server direct message referenceSho Sakuma
2026-06-17test: cover cross-server direct messaging; exclude bootstrap from coverageSho Sakuma
Add unit tests for CrossServerDirectMessageManager (send/receive/error/dedup), DirectMessageHandler cross-server display and ReplyTarget resolution, and ServiceContainer wiring to raise patch coverage. Extend codecov ignore list to the plugin bootstrap classes (LunaticChat, ServiceInitializer), consistent with the existing exclusions for runtime-coupled classes (VelocityConnectionManager, command/impl) that are covered by end-to-end server tests. Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-12chore(deps): update dependency @biomejs/biome to v2.5.0 (#227)renovate[bot]
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-12chore: Support Velocity 3.5.0Sho Sakuma
2026-06-12docs(website): make English the default localeSho Sakuma
Swap the website default locale from Japanese to English. English now lives at the site root (/), and Japanese moves under /ja/. Update locale config, nav/sidebar links, internal doc links, and asset relative paths accordingly. Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-12style: Fix download compatibility matrixSho Sakuma