Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ Why this section exists: `master` is this repository's own default branch (unlik
framework, which merges feature work into `alpha` first), so a `Closes #1234` written outside
this comment DOES act automatically on merge here -- GitHub only honours closing keywords on a
merge into the default branch, and a pull request into `master` already is one. There is no
`phase-closeout.yml` or any other workflow in this repository at all -- `.github/workflows/`
does not exist here, and this repository has no configured CI of any kind -- this section's
declarations are what closes the issue, not a follow-up automation step. State `None` explicitly
`phase-closeout.yml` in this repository -- its only workflow is `maven-ci.yml`, which builds and
tests and closes nothing -- so this section's declarations are what closes the issue, not a
follow-up automation step. State `None` explicitly
rather than leaving the section blank, so a reviewer can tell "closes nothing" apart from
"forgot to fill this in".

Expand Down
27 changes: 27 additions & 0 deletions .github/workflows/maven-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Maven CI
on:
push:
branches: ['**']
pull_request:
permissions:
contents: read
jobs:
verify:
name: Test & package (JDK ${{ matrix.java-version }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
java-version: ['21']
steps:
- name: Checkout
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
- name: Set up JDK ${{ matrix.java-version }}
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
with:
distribution: temurin
java-version: ${{ matrix.java-version }}
cache: maven
- name: Verify
# verify runs the tests, then packages the jar. This repository has no coverage check.
run: mvn -B verify
29 changes: 29 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Changelog

All notable changes to this project are documented in this file.
Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

本文件记录本项目的所有重要更改,格式基于 [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)。

## [Unreleased]

### Fixed

- The `/ultiext` (alias `/uext`) sub-commands `hello`, `info`, `visit`, `visitors` and `delvisitor`
register again on UltiTools-API 6.3.0. `GreetCommand` now extends `BaseCommandExecutor`;
it previously extended `AbstractCommandExecutor`, which 6.3.0 removed, so the plugin loaded and
its join listener worked, but every `/ultiext` sub-command got Bukkit's
`Unknown or incomplete command` reply (UltiKits/UltiTools-External-Example#4).
- `/ultiext`(别名 `/uext`)的 `hello`、`info`、`visit`、`visitors`、`delvisitor` 子命令在
UltiTools-API 6.3.0 上重新注册。`GreetCommand` 现继承 `BaseCommandExecutor`;此前它继承的
`AbstractCommandExecutor` 已在 6.3.0 中移除,因此插件虽能加载、进服监听器也正常,但所有 `/ultiext`
子命令都只返回 Bukkit 的 `Unknown or incomplete command` 提示(UltiKits/UltiTools-External-Example#4)。

### Changed

- Migrated to UltiTools-API 6.3.0 and Paper: the example now builds against
`UltiTools-API 6.3.0-SNAPSHOT` and `paper-api 1.21.11-R0.1-SNAPSHOT` instead of UltiTools-API 6.2.2
and `spigot-api 1.20.4-R0.1-SNAPSHOT` (UltiKits/UltiTools-External-Example#4).
- 迁移到 UltiTools-API 6.3.0 与 Paper:示例改为基于 `UltiTools-API 6.3.0-SNAPSHOT` 与
`paper-api 1.21.11-R0.1-SNAPSHOT` 构建,不再使用 UltiTools-API 6.2.2 与 `spigot-api 1.20.4-R0.1-SNAPSHOT`
(UltiKits/UltiTools-External-Example#4)。
19 changes: 10 additions & 9 deletions FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,19 +72,20 @@ find <repo-root> -path '*/src/main/java/*' -name '*.java' -not -path '*/target/*
-not -path '*/.worktrees/*' -print0 | xargs -0 grep -nE '^[[:space:]]*@AnnotationName\b' | wc -l
```

This repository is a single-root Maven project (`src/main/java` only, 5 source files total),
carries no git worktree directory, and has no javadoc or string-literal mention of any of its own
annotation names — the naive (unanchored) and line-start counts are identical for every kind
measured below, but the anchored `find`/`grep` form is used regardless, so the same command is
trustworthy unmodified against every repository in the fan-out.
This repository is a single-root Maven project (`src/main/java` only, 5 source files total) and
carries no git worktree directory. Its comments do name some of its own annotations — the
`connect` comment in `UltiToolsExtExample.java` names `@CmdExecutor` and `@EventListener`, and
`GreetCommand`'s class javadoc names `@CmdExecutor` (twice) and `@CmdMapping` — so an unanchored
count over-counts those two kinds (`@CmdExecutor` 4, `@CmdMapping` 6, `@EventListener` 2). The
anchored `find`/`grep` form above counts only annotation sites and is the one used below.

**Positive controls**, each confirmed by reading the cited line directly, not by trusting the
count alone:

| Annotation | Sites | Positive control |
|---|---|---|
| `@CmdExecutor` | 1 | `GreetCommand.java:21`, class-level, `alias = {"ultiext", "uext"}` |
| `@CmdMapping` | 5 | `GreetCommand.java:31` (`hello`), `:37` (`info`), `:44` (`visit <name>`), `:74` (`visitors`), `:93` (`delvisitor <name>`) |
| `@CmdExecutor` | 1 | `GreetCommand.java:46`, class-level, `alias = {"ultiext", "uext"}` |
| `@CmdMapping` | 5 | `GreetCommand.java:56` (`hello`), `:62` (`info`), `:69` (`visit <name>`), `:99` (`visitors`), `:118` (`delvisitor <name>`) |
| `@EventListener` | 1 | `JoinListener.java:16`, class-level, on `PlayerJoinEvent`'s handler class |
| `@Scheduled` | 0 | no background task exists anywhere in this repository's 5 source files — confirmed by reading all 5 in full |
| `@ConfigEntity` | 0 | this repository ships no configuration of its own, by design — it demonstrates the External Plugin API from a plain Bukkit plugin, not a configuration surface. Zero written, not omitted: this line is the phase's own live test of that rule |
Expand Down Expand Up @@ -115,8 +116,8 @@ plain `JavaPlugin` connected through `UltiToolsAPI.connect(this)`, exactly as it
`GreetCommand`'s three data-manipulation sub-commands, explicitly labeled "Data Storage Tests" in
this class's own code comment — they exist to exercise `UltiToolsAPI.getDataOperator(this,
VisitorRecord.class)`'s CRUD surface by hand, not to serve real gameplay. `VisitorRecord`
(`@Table("visitor_records")`, extends `BaseDataEntity<String>`, current-generation API, not the
deprecated `AbstractDataEntity`) is this repository's one persisted entity, tracking a player
(`@Table("visitor_records")`, extends `BaseDataEntity<String>`, current-generation API, not
`AbstractDataEntity`, which UltiTools-API 6.3.0 removed) is this repository's one persisted entity, tracking a player
name, a visit count, and a last-visit timestamp.

| ID | Feature | Kind | How to reach | Permission | Target | Tier | Manual | Source |
Expand Down
Loading