Release beta 1.0.0 baseline
check / local-gate (push) Failing after 1m35s

This commit is contained in:
JWeBot Contributors
2026-10-16 01:07:07 +08:00
parent bf4f28f48e
commit afc71e63a7
28 changed files with 872 additions and 110 deletions
+1
View File
@@ -67,6 +67,7 @@ id_ed25519*
# Sensitive local notes
homeserver-apikey-*.md
debug-*.md
# macOS/editor
.DS_Store
+4 -2
View File
@@ -4,9 +4,11 @@ These rules are mandatory for every automated change in this repository.
## Versioning
- Use `alpha X.Y.Z.MMDD`.
- Use `beta X.Y.Z.MMDD` for current beta releases.
- Python package versions use PEP 440 pre-release form, for example
`X.Y.Zb1+MMDD`.
- Small changes increment only `Z`.
- Do not move to a new minor version without explicit user approval.
- Do not move to a new minor or stable version without explicit user approval.
- Keep `VERSION`, root `pyproject.toml`, package versions, package
`__version__`, `README.md`, and `CHANGELOG.md` synchronized.
+593 -15
View File
@@ -1,5 +1,20 @@
# Changelog
## beta 1.0.0.1016 - 2026-10-16
- Promote JWeBot from alpha to beta after the local, staging, privacy, and
production deployment gates stabilized.
- Consolidate the current reviewed local command set, including virtual coin
transfer, loans, repayment, group leaderboard, multiplayer lottery,
blackjack, Steam queries, and CS Major autochess.
- Externalize CS Major autochess game content into package JSON data files for
cards, coaches, narratives, draft/shop/economy rules, match formats, and
MR15/overtime settings.
- Add a maintained command catalog and keep debug session notes out of the
repository by default.
- Keep release validation on `tools/sync-local-extensions.py --check`,
`tools/check-local.sh`, and `tools/check-secrets.py --history`.
## alpha 0.6.11.1015
- Add `/大富翁榜`, `/金币排行`, `/金币排行榜`, and `/richlist` for a
@@ -117,7 +132,7 @@
deterministic local AI as seed four; it buys players, upgrades its coach,
swaps its strongest lineup, and selects a counter tactic without an online
model.
- Give Taffy a persistent host state machine: welcome and format briefing,
- Give the bot a persistent host state machine: welcome and format briefing,
rotating human preparation order, turn enforcement, explicit handoffs,
round introductions, matchup calls, overtime narration, advancement, and
championship presentation.
@@ -144,7 +159,7 @@
- Add per-game personal sequence numbers and `/游戏记录` (`/gamehistory`) for
prize draws, lottery rounds, and blackjack hands.
- Prefix game output with the configured player label and game number, such as
`Jacky #1:...`; aliases share the same counter and account.
`Player #1:...`; aliases share the same counter and account.
## alpha 0.6.2.1015
@@ -162,7 +177,7 @@
stand in a separate command. Combined forms return this workflow without
opening a game or deducting funds.
- Prefix blackjack hands, status and settlement replies with the current
group-scoped player's configured display label, such as `jacky:...`.
group-scoped player's configured display label, such as `player:...`.
## alpha 0.6.1.1015
@@ -213,18 +228,581 @@
backup; pre-public operational history remains only in protected local
archives.
## Pre-Public Milestones
## alpha 0.5.11.1015
Earlier alpha work established:
- Reduce the conservative follow-latest scroll burst from a fixed `25ms` to
`1ms` between each of the existing 30 wheel events.
- Reuse the XDamage producer's verified WeChat window identifier in the
adaptive ready-layout gate instead of rediscovering the same window before
each screenshot.
- Preserve the shared GUI lock, ready-window geometry gate, second screenshot,
and loaded-bottom visual confirmation.
- Add privacy-safe per-step capture telemetry and regression coverage for the
optimized slow path.
- adaptive OCR and XDamage capture;
- guarded GUI send with visual confirmation;
- durable ACK/final delivery ordering;
- privacy-safe latency telemetry;
- capability-limited SDK contracts;
- signed extension artifacts and isolated Host execution;
- reviewed command ownership and generated adapters;
- coordinated production backup, health gates, and rollback.
## alpha 0.5.10.1015
Private host, person, address, account, incident, and deployment details are
intentionally omitted from the public changelog.
- Prioritize queued fast acknowledgements and local-command replies over queued
final replies in the guarded GUI sender.
- Keep the active GUI send non-preemptive and preserve strict FIFO ordering
within each priority class through a monotonic sequence number.
- Raise the adaptive recorder CPU quota from `150%` to `250%` to reduce
screenshot subprocess stalls under OCR and GUI contention.
- Add deterministic coverage for ACK/local priority, final FIFO ordering,
single-sender serialization, and clean worker shutdown.
## alpha 0.5.9.1014
- Preserve both capture call contracts in the adaptive ready-window wrapper:
zero arguments for startup/polling and one verified window identifier for the
optimized XDamage producer.
- Fix the alpha 0.5.8 internal `CaptureProducerError` restart loop that began on
the first relevant XDamage event.
- Add direct regression tests for both ready-gated capture signatures.
## alpha 0.5.8.1014
- Recover one unseen bottom-most bot trigger when a viewport resync has no
visual overlap, instead of silently dropping the new command.
- Persist a bounded recent-trigger visual history so an old command is not
replayed by a later no-overlap resync; ordinary messages remain fail-closed.
- Seed that history from one startup baseline before enabling recovery, so a
service restart cannot replay a visible pre-existing command.
- Reuse the XDamage monitor's verified WeChat window identifier and the
maximize gate's geometry result, removing one redundant window lookup and
one redundant geometry subprocess from each changed-frame capture.
- Add regression coverage for unseen-trigger recovery, seen-trigger replay
suppression, signature migration, and the optimized capture path.
## alpha 0.5.7.1014
- Replace the single direct-request worker with two parallel generation workers
and one strictly ordered GUI delivery worker for ordinary chat and Steam
requests.
- Keep final replies in durable `created_at, event_id` order even when a newer
provider call completes first; failed acknowledgements and exhausted requests
remain terminal and do not block later replies.
- Separate generation and delivery retry counters so each phase retains its
complete retry budget.
- Wake generation and delivery workers immediately on enqueue, generation
completion, and acknowledgement instead of adding a one-second idle polling
delay to the normal path.
- Split direct-queue telemetry into `direct_generation` and `direct_delivery`
phases and add concurrency, ordering, ACK-race, retry, Steam, and duplicate
regression coverage.
## alpha 0.5.6.1014
- Preserve both pre-draft and post-draft group fingerprint gates while
capturing only the configured title region instead of decoding the complete
WeChat window twice per GUI send.
- Keep the previous full-window fingerprint path as a compatibility fallback
for older adaptive upstream modules.
- Add GUI sender coverage for the title-region primary path, full-window
fallback, and visual group-mismatch fail-closed handling.
## alpha 0.5.5.1014
- Accept incoming WeChat bubbles up to `900px` wide so long single-line bot
mentions are not discarded before OCR; preserve position, height, area, and
outgoing-bubble exclusion gates.
- Wait for adaptive OCR warmup and a first baseline capture from the current
service start before reporting `adaptive ready` or successful deployment.
- Fail and roll back deployment if the adaptive service exits or cannot
establish its recorder baseline within 90 seconds.
- Retry the WeChat ready-window gate for up to 30 seconds and discover the
exact `Weixin` window by both class and title before failing closed.
- Pin production privilege switching and X11 inspection to verified absolute
executable paths so a restricted root `PATH` cannot masquerade as a missing
WeChat window.
## alpha 0.5.4.1014
- Stabilize visible-message sequence alignment with thresholded binary
sender/body fingerprints while retaining exact RGB keys for OCR cache
invalidation.
- Reset 0.5.3 exact-visual recorder state to a safe no-reply baseline during
the signature migration.
- Prefix coordinated deploy phases with `[JWeBot]`, report explicit
`starting`, `ready`, and `active` states, and run user installation from the
target home to avoid inherited `/root` working-directory warnings.
## alpha 0.5.3.1014
- Align visible message sequences with existing exact bubble visual
fingerprints instead of OCR text, preventing scroll/resync OCR drift from
dropping a newly mentioned slash command.
- Reset legacy text-signature recorder state to a no-reply visual baseline on
startup, avoiding duplicate replay during the signature-scheme migration.
- Preserve repeated identical commands as separate visual occurrences.
## alpha 0.5.2.1014
- Print an ASCII pixel-art project signature only after the coordinated
production deployer passes every cutover gate and disables rollback.
## alpha 0.5.1.1014
- Exclude the static bottom-left input hint from the realtime text ROI so an
empty WeChat input box is not misclassified as dirty.
- Label the corrected ROI as `input_text_core_v2` in bridge telemetry, keeping
pre-fix and post-fix production evidence distinguishable.
## alpha 0.5.0.1014
- Move visible WeChat delivery onto a persistent in-process GUI sender queue
hosted by the adaptive recorder, avoiding per-message bridge subprocesses for
ACK, local-command replies, and final deliveries.
- Add a private AF_UNIX sender socket so Edge delivery helpers submit final
replies to the same serialized GUI queue instead of racing the input box.
- Combine clear, paste, ROI draft flag, post-draft group check, Enter send,
ROI clear confirmation, and send-button fallback into one bridge call.
- Confirm the input ROI is empty after Ctrl-A/Backspace before using it as the
paste baseline, preventing repeated `喵......` ACK drafts from being mistaken
for paste failures.
## alpha 0.4.15.1014
- Force adaptive recorder logging to INFO so GUI bridge timing telemetry is
visible on ACK and final delivery paths.
- Allow ROI, poll, pixel-threshold, flag, and coordinate fields through the
packaged runtime telemetry sanitizer.
## alpha 0.4.14.1014
- Replace full-input send confirmation with a left-side input-text ROI flag so
draft and send confirmation poll only the region that should visibly change.
- Restore the guarded send order to Enter first, then click the scaled send
button only as a fallback when ROI clearing is not visually confirmed.
- Emit ROI coordinates, flag state, flag wait time, confirmation source, and
bridge stderr tail diagnostics for GUI delivery failures.
## alpha 0.4.13.1014
- Emit detailed guarded GUI delivery timings for lock acquisition, pre/post
draft screenshots, group fingerprint checks, bridge subprocess duration,
draft paste confirmation polling, send-button confirmation polling, Enter
fallback, callback hooks, and total send time.
- Return per-step timing metadata from the adaptive GUI bridge so ACK and final
delivery reports can attribute fixed waits, screenshot confirmation, VNC
input, and fallback paths without logging message text.
## alpha 0.4.12.1014
- Optimize guarded WeChat GUI delivery by clicking the scaled send button first
and polling for visual confirmation instead of waiting on fixed sleeps.
- Preserve the Enter-key fallback when the button path is not visually
confirmed.
## alpha 0.4.11.1014
- Add explicit `edge.fast_ack.*` and `recorder.fast_ack.*` telemetry names
alongside the existing ACK metrics, making fast acknowledgement latency
independently filterable without breaking historical dashboards.
## alpha 0.4.10.1014
- Cache configured person-alias rows once per group and make configured
identity persistence idempotent, eliminating thousands of redundant
`FULL`-synchronous SQLite commits during Edge startup.
- Reduce measured production host systemd socket readiness on the production database
snapshot from more than 90 seconds to about one second.
## alpha 0.4.9.1014
- Wait up to 45 seconds for the newly started Edge socket and health response
before deciding that a production cutover failed, while still failing
immediately if systemd marks the service failed.
## alpha 0.4.8.1014
- Keep the adaptive OCR process alive while WeChat is absent or awaiting login,
then resume capture against the ready main window without a systemd restart
storm.
- Install the reviewed `wechat_local_ocr.py` beside the adaptive runtime instead
of importing an independently managed root copy.
- Add a root-coordinated production deploy that records both systemd
topologies, backs up root and user files plus SQLite, disables both legacy OCR
units, and rolls back all layers when a health gate fails.
- Require empty OCR queues, a ready WeChat window, Edge socket health, stable
adaptive restart counts, and SQLite integrity before accepting a production
cutover.
- Preserve incoming service state in legacy install and upgrade tools; legacy
OCR now remains disabled unless an operator explicitly opts in.
- Prevent Extension Host imports from writing bytecode into verified releases,
and exclude only standard interpreter cache files from source packaging.
- Add deployment contract tests and shell-aware syntax validation to the local
release gate.
## alpha 0.4.7.1014
- Prewarm RapidOCR recognition and detection paths before live capture.
- Cache successful bubble recognition by bounded exact visual fingerprint,
recognize only new or changed crops, and periodically revalidate the cache.
- Persist OCR command events through atomic file replacement plus file and
directory `fsync`, then immediately wake the in-process responder while
retaining the one-second recovery scan.
- Name the three execution paths explicitly as `local-command`, `deepseek`, and
`openclaw` in Edge responses and privacy-safe routing telemetry.
- Add signed plugin description/help metadata, validate it through Host health,
generate bundled `/功能列表` output automatically, and update plugin creation
tooling and author documentation.
## alpha 0.4.6.1014
- Add a repeatable local performance baseline for OCR preprocessing, sequence
alignment, durable ACK/queue state, and real signed Host process execution.
- Add a structured telemetry-log analyzer with p50, p95, maximum, status, and
event-count summaries.
- Measure queue waiting, capture-buffer age, ACK end-to-end latency, and final
Edge delivery latency without recording message content.
- Establish the bottleneck order from local measurements and existing runtime
evidence: RapidOCR, provider generation, polling wakeups, then one-shot Host
startup; SQLite and sequence work remain below 2 ms p95 locally.
- Document the evidence, measurement gaps, and optimization order for later
`0.4.x` iterations.
## alpha 0.4.5.1014
- Close the approved repository-only Extension Host migration scope.
- Treat an invalid installed signed release as a startup failure rather than a
preferred-mode fallback; only missing or startup-unhealthy Hosts may fall
back.
- Enforce the end-to-end Host deadline after Kernel service execution and
expand transport-error telemetry.
- Document completed local work, explicitly deferred external operations, and
the next measurement-led OCR/queue/ACK performance-analysis phase.
## alpha 0.4.4.1014
- Add privacy-safe structured telemetry for OCR, routing, ACK preparation and
confirmation, queues, providers, Host processes, service brokering, and final
GUI delivery.
- Hash event and group identifiers, reject message-body fields, and retain only
low-cardinality process-local counts and latency summaries.
- Expose telemetry summaries through Edge health without making telemetry part
of delivery correctness.
- Instrument OCR capture/recognition/queue stages and distinguish ACK GUI
delivery from Edge confirmation.
- Document ACK ordering and the measurement points needed for future OCR,
queue, Host-startup, and provider latency optimization.
## alpha 0.4.3.1014
- Require a signed release to pass isolated Host health before atomic
activation; failed new releases are removed without switching `current`.
- Add explicit local-only health bypass for packaging environments.
- Complete real-process parity coverage for all 12 reviewed plugins, including
memory CRUD, both stateful games, dice challenge, rankings, history, and
Steam fast-ACK final generation.
- Fix Host protocol writes so broker messages bypass redirected plugin stdout
without exposing plugin output to the parent protocol.
## alpha 0.4.2.1014
- Load installed signed plugin manifests into a deterministic startup catalog
and freeze command ownership before routing.
- Add `in-process`, `prefer-host`, and `host-only` Edge execution modes with
subprocess or AF_UNIX Host transports.
- Route signed healthy plugins through the isolated Host while preserving
Kernel-direct commands and Steam fast-ACK queueing.
- Permit startup fallback for missing or unhealthy preferred Hosts, but never
replay an active invocation after a possible stateful service call.
- Add real subprocess end-to-end coverage from Edge through the generated
adapter, Host protocol, Kernel service broker, and final reply.
## alpha 0.4.1.1014
- Add bounded bidirectional JSON-line service brokering between isolated
Extension Host processes and Kernel-owned service profiles.
- Enforce declared profile ownership, call IDs, call count, message size, and
end-to-end process/socket deadlines.
- Add Host health inventory responses and broker support to both subprocess and
AF_UNIX clients.
- Keep service errors generic across the isolation boundary.
## alpha 0.4.0.1014
- Start the approved `0.4.x` local extension-host migration and performance
instrumentation milestone.
- Keep signing-pipeline integration, key rotation, PR rehearsal, target-machine
provisioning, deployment, and Linux verification deferred.
## alpha 0.3.1.1014
- Add OpenSSH `sshsig` publisher signatures for canonical extension release
records.
- Bind the publisher principal, release filename, artifact metadata, source
digest, manifest author, and exact file list through one signed payload.
- Require trusted publisher verification for activation, Host loading, and
rollback; unsigned paths now require an explicit local-test override.
- Persist the canonical signature record with each installed release and
re-verify it before execution or rollback.
- Add signing support to package, verify, activate, rollback, and standalone
release-signing tools.
- Keep production host provisioning, deployment, and systemd validation deferred.
## alpha 0.3.0.1014
- Close the `0.2.x` complete-function migration after the corrected granular
plugin ownership model passed the full local gate.
- Start the approved `0.3.x` baseline with Kernel-direct operational commands,
official-owned person memory, and 11 project-owned plugins.
- Keep Linux deployment and systemd verification explicitly deferred.
## alpha 0.2.6.1014
- Replace grouped plugin domains with one plugin per independently
understandable function.
- Keep dice and dice challenge as one complete project-authored collection.
- Make person-memory the only official-authored command plugin.
- Move feature list, status, and balance to unconditional Kernel-direct
routing.
- Add required manifest author metadata and release-record schema version 2.
- Generate 11 project plugin packages under the reviewed local-extension namespace and keep only
person-memory under `extensions/official`.
- Rename the canonical rollback switch to
`JWEBOT_LOCAL_EXTENSIONS_ENABLED`, while accepting the old environment key
as a compatibility fallback.
## alpha 0.2.5.1014
- Move the complete Steam provider into `jwebot-official-extensions`.
- Migrate fixed roster, group aliases, mode filtering, single-person lookup,
cache, API batching, proxy enforcement, and error classification.
- Preserve the existing public `SteamClient`, `SteamUnavailable`, API base, and
Mihomo default exports through the packaged Edge runtime.
- Keep the no-direct-network-fallback regression tests passing.
## alpha 0.2.4.1014
- Add full official-adapter versus compatibility-path parity tests.
- Cover every stateless command family, all memory operations, every
dice-challenge phase, guess-number lifecycle, RPS lifecycle, status, balance,
Steam generation, and restart persistence.
- Make parity and persistence checks part of the permanent local/CI gate.
## alpha 0.2.3.1014
- Route all known local commands through generated official SDK adapters by
default.
- Execute stateful behavior through named in-process service brokers without
exposing raw Ledger or providers to adapters.
- Preserve the Steam fast-ACK asynchronous path through the official adapter.
- Add `JWEBOT_OFFICIAL_EXTENSIONS_ENABLED=0` as a compatibility rollback to
direct command-engine dispatch.
- Keep unknown slash-command errors on the compatibility path.
- Install generated adapter modules with the official package.
## alpha 0.2.2.1014
- Add reviewed `service_profiles` as a narrow SDK/manifest capability.
- Generate real Host-loadable packages for all seven official function domains.
- Register every existing alias through SDK command adapters.
- Delegate complex stateful behavior through named Kernel service profiles
instead of exposing raw Ledger or provider objects.
- Add synchronization checks so official manifests, adapters, docs, and command
ownership cannot drift.
- Validate, source-scan, and package every official extension in CI.
## alpha 0.2.1.1014
- Move the complete local command engine out of the Edge runtime into the
installable `jwebot-official-extensions` package.
- Preserve all command replies, persistence, deterministic seeds, game state
machines, memory operations, rankings, status, balance, and Steam behavior.
- Inject Ledger, Steam, balance, reply-cleaning, identity, and memory-policy
brokers from Kernel instead of importing Edge internals.
- Add a unique ownership map covering every current command kind and alias.
- Add an authoritative migration matrix documenting every command subfunction
and non-command Kernel responsibility.
## alpha 0.2.0.1014
- Start the approved `0.2` full-function migration milestone.
- Move the complete Edge runtime into `jwebot-kernel`.
- Keep `jwebot_edge.py` as a compatibility CLI and module alias so existing
imports and runtime monkeypatches continue to affect implementation globals.
- Update tests and the installer for the packaged runtime.
- Preserve all existing command, queue, ledger, model, memory, broadcast, and
delivery behavior.
- Do not deploy or validate on Linux in this stage.
## alpha 0.1.11.1014
- Add a bounded AF_UNIX client matching the systemd socket-activated Host
design.
- Send one canonical JSON request, half-close the write side, and read one
bounded response.
- Fail closed on socket timeout, unavailable socket, malformed response, and
Host error status.
- Keep the socket client disconnected from the current production Edge path.
## alpha 0.1.10.1014
- Add uninstalled systemd socket/service templates for the extension Host.
- Specify a fixed unprivileged identity, AF_UNIX-only private network,
read-only system/release paths, empty capabilities, syscall filtering, and
CPU/memory/process/runtime limits.
- Add static sandbox-policy checks and unit tests.
- Require explicit target-host provisioning and systemd verification before
any future enablement.
## alpha 0.1.9.1014
- Add the Kernel-side extension Host client with a minimal inherited
environment and isolated process group.
- Enforce parent wall-time deadlines and kill the entire Host process group on
timeout.
- Bound request, response, and stderr sizes and reject malformed protocol
responses.
- Limit plugin stdout/stderr inside the Host.
- Hash both plugin log messages and field-name sets instead of emitting plugin
text.
- Test timeout child-process cleanup and environment-secret exclusion.
- Keep the client disconnected from the production Edge path.
## alpha 0.1.8.1014
- Add an installable `jwebot-extension-host` package.
- Re-verify installed release content, manifest, and source policy before import.
- Enforce exact declared command registration and freeze it before invocation.
- Add a bounded single-request JSON stdin/stdout protocol.
- Scrub inherited environment values and redirect plugin stdout away from IPC.
- Keep storage, HTTP, and scheduling brokers fail-closed.
- Return generic plugin failure classes without exception text.
- Do not connect the Host to Edge or install it on production host.
## alpha 0.1.7.1014
- Add verified release installation under full source-digest directories.
- Add locked, atomic `current` and `previous` activation pointers.
- Re-verify installed release file lists, records, and source content before
reuse.
- Add explicit local activation and rollback tools with no default production
path.
- Test rollback, tampered artifacts, tampered installed content, unsafe
pointers, and private installed-file permissions.
- Do not execute extension code or modify production host.
## alpha 0.1.6.1014
- Add deterministic, content-addressed extension release artifacts.
- Add canonical source and artifact SHA-256 records.
- Verify artifacts without extraction and reject path traversal, non-regular
members, expansion limits, file-list drift, and content tampering.
- Refuse replacement of an existing digest-addressed artifact with different
bytes.
- Build and verify the example extension artifact in Gitea Actions.
- Explicitly defer publisher signing and production host activation to a later phase.
## alpha 0.1.5.1014
- Add a static extension source-policy preflight before packaging.
- Reject unapproved imports, file/process/socket access, dynamic execution
builtins, and dunder attribute traversal.
- Enforce source count, size, UTF-8, syntax, and symlink limits.
- Make `validate-plugin.py` validate both manifest and source policy.
- Document that static policy is a CI prefilter, not a replacement for OS
process isolation.
## alpha 0.1.4.1014
- Restrict extension command names to Unicode word characters, dots, and
hyphens.
- Reject quote/newline template injection before plugin skeleton files are
created.
- Add manifest and generator regression tests while preserving Chinese command
names.
## alpha 0.1.3.1014
- Add a safe command-extension generator that refuses invalid IDs, invalid
commands, path traversal, and overwriting existing extensions.
- Add official and friend extension namespaces.
- Add an author guide, SDK API reference, and reusable AI-author prompt.
- Include author tooling and required documentation in the repository gate.
## alpha 0.1.2.1014
- Add a deterministic extension catalog that accepts reviewed manifests only
during startup.
- Reject duplicate plugin IDs and case-insensitive command ownership conflicts.
- Freeze registration before runtime command resolution.
- Keep catalog views immutable and require explicit command-token boundaries.
## alpha 0.1.1.1014
- Make `jwebot-kernel` the authoritative pure routing implementation used by
the existing Edge compatibility entrypoint.
- Preserve the existing `jwebot_edge.py` public function shapes for current
callers and tests.
- Update the production host installer to deploy and roll back the SDK and Kernel package
directories together with the compatibility scripts.
- Do not deploy or restart any production service in this repository change.
## alpha 0.1.0.1014
- Start the approved `0.1` milestone with installable `jwebot-sdk` and
`jwebot-kernel` packages.
- Add versioned event, reply, fact, and extension-result contracts.
- Add capability-limited context protocols that expose no GUI, group selector,
raw ledger, environment, shell, or unrestricted network access.
- Add strict plugin manifest validation and pure local/chat/cloud routing
primitives.
- Add a minimal `/hello` command extension and package boundary tests.
- Keep all existing root runtime entrypoints unchanged for production host compatibility.
## alpha 0.0.7.1014
- Move unit tests into `tests/`.
- Update tests to load root compatibility entrypoints from the repository root.
- Update local verification commands to discover tests from `tests/`.
## alpha 0.0.6.1014
- Add repository-safe configuration templates under `config/examples/`.
- Add `docs/configuration-guide.md` for runtime configuration ownership and
deployment destinations.
- Add `tools/check-config.sh` and include it in the local migration gate.
- Keep real secrets and production host runtime files outside Git.
## alpha 0.0.5.1014
- Add a Gitea Actions workflow that runs the standard local migration gate on
push and pull request.
- Add `requirements-dev.txt` for local and CI test dependencies.
- Document dependency installation in `README.md`.
## alpha 0.0.4.1014
- Move home-backup operational material into `ops/home-backup/`.
- Move the TigerVNC config snippet into `deploy/config/`.
- Keep backup material in the repository for reference while separating it from
the bot runtime path.
## alpha 0.0.3.1014
- Add `tools/check-local.sh` as the standard local migration gate.
- Wire the gate to compile Python entrypoints, validate shell scripts, reject
active emergency debug hooks outside their archive docs, and run the full
unittest suite.
- Document the local check command in `README.md`.
## alpha 0.0.2.1014
- Remove temporary emergency HTTP debug hooks from production Python entrypoints.
- Preserve removed hook context in `docs/debug/emergency-hooks-archive.md`.
- Add `docs/configuration-inventory.md` to document hardcoded addresses, paths,
service names, dimensions, models, and their migration policy.
- Keep historical incident markdown unchanged for auditability.
## alpha 0.0.1.1014
- Establish the repository version baseline for the private alpha migration.
- Move operational docs into `docs/`.
- Move deployment scripts, defaults, and systemd units into `deploy/`.
- Move the cloud responder prompt workspace into `agents/wechat-responder/`.
- Move the old direct OpenClaw watcher into `legacy/`.
- Keep current Python runtime entrypoints at repository root to preserve test and
deployment compatibility during the first migration step.
+24 -56
View File
@@ -8,43 +8,15 @@ JWeBot 是运行于 Linux 的单群微信自动回复系统。它通过本地 OC
观察选定的微信窗口,将消息写入持久化 Edge 账本,调用经过审核的命令插件,
并通过带视觉确认的 GUI 发送链路回复。
当前版本:`alpha 0.6.11.1015`。
当前版本:`beta 1.0.0.1016`,更新日期:2026-10-16。
0.6.1 新增本地上下文总结、人物与别名索引、单人虚拟金币游戏,并增加
两秒画面复核以补抓遗漏的消息变化。命令和游戏管理规则见
[0.6.1 插件说明](docs/local-plugins-0.6.1.md)。
0.6.2 为 DeepSeek 流式回复增加 30 秒总时限,避免未结束的上游连接长期
占满生成 worker;21 点开局金额明确作为本局下注,并兼容 OCR 丢失空格。
21 点牌面和结算以当前玩家展示名开头。快速 ACK、重试和严格顺序投递
规则保持不变。
0.6.3 将彩票改为群内多人轮次,加入报名、状态、主持人开奖和取消;
抽奖、彩票、21 点统一使用 `Jacky #N:...` 局号并支持 `/游戏记录`。
完整玩法见[多人彩票与游戏记录](docs/group-lottery-0.6.3.md)。
0.6.4 新增 2~8 人 CS Major 自走棋:职业选手卡池、属性/定位/战术
克制、小组单循环、1v4 与 2v3 淘汰赛,以及 BO3/BO5 的 MR15 加时赛。
完整规则见[CS Major 自走棋设计稿](docs/cs-major-autochess-design.md)。
0.6.5 将 AI 测试模式扩展到双人:两名真人可一键补入 AI 战队 A、B,
两支 AI 独立运营。
0.6.6 重构自走棋流程:开赛后三轮选秀,第一轮从固定 10 人教练池中
选教练,第二、三轮选选手;随后进入训练赛、小组赛、挑战、淘汰赛和
总决赛。主持消息会拆分为多条回复;所有需要推进的阶段由相关真人发送
`/结束回合` 自动进入下一步,已淘汰玩家不会再收到赛前准备提示。
0.6.7 继续强化文字自走棋体验:卡池扩充到 100+ 人、教练库扩充到
18 人;训练赛改为按参赛人数生成的真实对阵轮次;单图比分由 MR15
逐回合模拟产生,不再使用固定比分档;赛事叙事素材扩充到 120+ 条,
D 牌、锁店、调阵容和战术窗口会在轮次之间自然提示。
0.6.8 增加旧版自走棋 active 状态兼容:如果群里残留 0.6.6/0.6.7
之前创建的未完成赛事,新的 `/自走棋开始` 会原子归档旧档案并开启新版
赛季,不需要维护人员手工改库。
0.6.9 将 CS Major 自走棋的公开游戏数据拆出到包内 JSON:选手卡池、
教练池、叙事素材、商店概率、经济奖励、选秀节奏、羁绊阈值、赛制和
MR15/加时参数都由数据文件驱动,启动时会校验字段、ID 和素材数量。
同版新增虚拟金币转账:`/转账 对方 金额` 会在同一事务内扣款入账,
收款人需先发送 `/金币` 初始化账户。
0.6.10 新增虚拟金币贷款:`/贷款 [金额]` 最多借入 500 金币,`/还款`
可按金额或全部归还;每个账户同一时间最多一笔未还贷款。
0.6.11 新增 `/大富翁榜`、`/金币排行`,按当前群金币余额展示排行榜,
有未还贷款时会在榜单中标注。
1.0 Beta 收口了当前稳定功能:本地命令插件、人物与上下文索引、
Steam 状态与时长查询、虚拟金币游戏、多人彩票、21 点、CS Major
自走棋、生产部署与回滚门禁。CS Major 自走棋的选手、教练、叙事和规则
已经外置为包内 JSON,虚拟金币支持转账、贷款、还款和群内排行榜。
完整命令见[命令目录](docs/command-catalog.md)。历史版本记录见
[CHANGELOG](CHANGELOG.md)。
### 运行流程
@@ -290,9 +262,17 @@ visually confirmed GUI bridge.
Current version:
```text
alpha 0.6.11.1015
beta 1.0.0.1016
```
Updated: 2026-10-16.
The 1.0 Beta baseline consolidates the stable local command set, person and
context indexes, Steam presence/playtime queries, virtual coin games,
multiplayer lottery, blackjack, CS Major autochess, and production deployment
gates. CS Major autochess game content is now packaged as JSON data, and
virtual coins support transfer, loans, repayment, and group leaderboards.
## Runtime Flow
```text
@@ -358,7 +338,8 @@ migration, debug archives, and root deployment settings.
## Commands
The built-in command inventory is generated from reviewed plugin descriptors.
Common commands include:
See the full [command catalog](docs/command-catalog.md). Common commands
include:
```text
/功能列表
@@ -387,25 +368,12 @@ the final separator shown below:
/steam时长Dota2人=玩家名
```
Version 0.6.1 adds local `/context 100|200|300` extractive summaries,
`/people` and `/person` lookup, and `/wallet`, `/draw`, `/lottery`, `/blackjack`
single-player virtual coin games. Chinese aliases share the same implementations.
Accounts receive 1000 virtual coins once; funds, game state and event replay
results commit together. `/richlist` shows a group-scoped coin leaderboard.
`/transfer name amount` moves virtual coins between initialized group-scoped
accounts in one ledger transaction. OCR display aliases identify group-scoped
people; `/loan amount` and `/repay` manage one capped virtual coin loan per
account. Native WeChat account IDs are unavailable. See
Chinese aliases share the same implementations as their English counterparts.
Virtual coin funds, game state, transfers, loans, repayments, and replay
responses commit through the same ledger transaction path. Native WeChat
account IDs are unavailable, so accounts are scoped by OCR display identity and
configured aliases. See
[plugin rules and capture reconciliation](docs/local-plugins-0.6.1.md).
Version 0.6.2 adds a 30-second total deadline to direct DeepSeek streams so an
unfinished upstream response cannot occupy both generation workers for about
15 minutes. Blackjack start amounts are the current round's stake; compact OCR
forms are accepted, while hit/stand remain explicit follow-up commands.
Blackjack hand and settlement replies start with the current player's configured
display label. ACKs, retries, and ordered final delivery remain unchanged.
Version 0.6.3 replaces instant lottery tickets with persistent multiplayer
group rounds, adds indexed personal game history, and raises blackjack stakes
to 1-500 coins. See [multiplayer lottery and game records](docs/group-lottery-0.6.3.md).
Steam prefers private per-person SteamID mappings from the active profile and
uses the corresponding group display IDs and aliases. Without a private roster,
+1 -1
View File
@@ -1 +1 @@
alpha 0.6.11.1015
beta 1.0.0.1016
@@ -238,6 +238,8 @@ trap rollback EXIT HUP INT TERM
jwebot_log "user runtime preflight starting"
test -x "$runtime_python"
for path in \
"$source_dir/VERSION" \
"$source_dir/CHANGELOG.md" \
"$runtime_source_dir/$ocr_script_name" \
"$runtime_source_dir/$script_name" \
"$runtime_source_dir/$adaptive_script_name" \
@@ -280,6 +282,8 @@ jwebot_log "user runtime backup starting path=$backup_dir"
install -d -m 0700 "$target_dir" "$unit_dir" "$config_dir" "$backup_dir"
save_unit_states
for name in \
VERSION \
CHANGELOG.md \
"$ocr_script_name" \
"$script_name" \
"$adaptive_script_name" \
@@ -330,6 +334,8 @@ systemctl --user stop \
>/dev/null 2>&1 || true
jwebot_log "user runtime files install starting"
install -m 0600 "$source_dir/VERSION" "$target_dir/VERSION"
install -m 0600 "$source_dir/CHANGELOG.md" "$target_dir/CHANGELOG.md"
install -m 0700 "$runtime_source_dir/$ocr_script_name" "$target_dir/$ocr_script_name"
install -m 0700 "$runtime_source_dir/$script_name" "$target_dir/$script_name"
install -m 0700 "$runtime_source_dir/$adaptive_script_name" "$target_dir/$adaptive_script_name"
+122
View File
@@ -0,0 +1,122 @@
# JWeBot Command Catalog
Current baseline: `beta 1.0.0.1016`.
This catalog records the reviewed commands shipped with the built-in local
extensions. Runtime ownership is frozen at startup from the generated
descriptor inventory; plugin code delegates to reviewed service profiles.
## System
| Command | Alias | Purpose |
|---|---|---|
| `/功能列表` | `/help` | Show the command list. |
| `/状态` | `/status` | Show local runtime status. |
| `/version` | - | Show installed package versions plus the latest changelog date and summary. |
| `/debug` | - | Show privacy-safe telemetry diagnostics. |
| `/余额` | - | Show configured direct-provider balance status. |
## Context And People
| Command | Alias | Purpose |
|---|---|---|
| `/上下文 [100|200|300]` | `/context` | Summarize recent local text in the current group. |
| `/人物列表 [页码]` | `/people` | List known group-scoped people. |
| `/人物 [名称或别名]` | `/person` | Look up one configured or observed person. |
| `/记住 内容` | - | Store a local memory entry for the current person. |
| `/我的记忆` | - | Show the current person's memory entries. |
| `/人物记忆 显示名` | - | Show memory entries for a person. |
| `/忘记 关键词` | - | Remove matching local memory entries. |
| `/记忆帮助` | - | Show memory command help. |
## Group Insights
| Command | Alias | Purpose |
|---|---|---|
| `/扫码排行` | - | Show scan ranking for the current group. |
| `/复读榜` | - | Show repeat ranking for the current group. |
| `/查记录 关键词` | - | Search local group history by keyword. |
## Virtual Coins And Games
| Command | Alias | Purpose |
|---|---|---|
| `/金币` | `/wallet` | Initialize or show the current person's virtual coin account. |
| `/大富翁榜 [人数]` | `/金币排行`, `/金币排行榜`, `/richlist` | Show the group-scoped coin leaderboard. |
| `/转账 对方 金额` | `/transfer name amount` | Transfer virtual coins to an initialized group account. |
| `/贷款 [金额]` | `/loan amount`, `/借款` | Borrow up to 500 virtual coins. |
| `/还款 [金额|全部]` | `/repay [amount|all]` | Repay an active virtual coin loan. |
| `/抽奖 [金额]` | `/draw` | Play a single-player prize draw. |
| `/彩票 开始` | `/lottery start` | Open a multiplayer lottery round. |
| `/彩票 报名 数字 金额` | `/lottery join` | Join or update a lottery entry. |
| `/彩票 状态` | `/lottery status` | Show the current lottery round. |
| `/彩票 开奖` | `/lottery draw` | Host-only draw for the current lottery round. |
| `/彩票 取消` | `/lottery cancel` | Host-only cancellation with refunds. |
| `/21点 开始 [1-500]` | `/blackjack start` | Start a blackjack round with the chosen stake. |
| `/21点 要牌` | `/blackjack hit` | Draw one blackjack card. |
| `/21点 停牌` | `/blackjack stand` | Stand and settle against the dealer. |
| `/21点 状态` | `/blackjack status` | Show the current blackjack round. |
| `/21点 结束` | `/blackjack end` | End the current blackjack round. |
| `/游戏记录 [页码]` | `/gamehistory` | Show indexed personal game history. |
| `/游戏帮助` | `/games` | Show local game rules. |
## Random And Session Games
| Command | Alias | Purpose |
|---|---|---|
| `/丢骰子 [NdM]` | - | Roll dice. |
| `/丢骰子挑战` | `/骰子挑战` | Run a dice challenge. |
| `/翻硬币` | - | Flip a coin. |
| `/随机数 [范围]` | - | Draw a random number. |
| `/抽签 [内容...]` | - | Draw lots from provided options. |
| `/今日运势` | - | Show a deterministic daily fortune. |
| `/猜数字 开始 [上限]` | - | Start a group guessing game. |
| `/猜数字 数字` | - | Guess in the active guessing game. |
| `/石头剪刀布 开始` | - | Start a rock-paper-scissors session. |
| `/石头剪刀布 加入` | - | Join the active session. |
| `/石头剪刀布 出 石头|剪刀|布` | - | Submit a move. |
| `/石头剪刀布 状态` | - | Show session status. |
| `/石头剪刀布 结算` | - | Settle the session. |
| `/石头剪刀布 结束` | - | End the session. |
## Steam
| Command | Alias | Purpose |
|---|---|---|
| `/steam 在线` | - | Show configured Steam online status. |
| `/steam 游戏` | - | Show current games. |
| `/steam 全部` | - | Show full configured Steam presence. |
| `/steam 刷新` | - | Refresh cached Steam data. |
| `/steam 时长 游戏名` | `/steam时长游戏名` | Query playtime for a game. |
| `/steam时长游戏名、玩家名` | `/steam时长游戏名人=玩家名` | Query one player's game playtime. |
## CS Major Autochess
| Command | Alias | Purpose |
|---|---|---|
| `/自走棋开始` | - | Create a new IEM 盐田 Major season. |
| `/自走棋报名` | - | Register the current player. |
| `/自走棋加AI战队` | - | Add local deterministic AI teams for testing. |
| `/自走棋开赛` | - | Start the event from registration. |
| `/自走棋状态` | - | Show the current event state. |
| `/自走棋档案` | - | Show archived event information. |
| `/选1` ... `/选10` | - | Draft coaches, players, or shop cards depending on phase. |
| `/刷新` | - | Refresh the shop. |
| `/锁定` | - | Lock or unlock the shop. |
| `/阵容` | - | Show lineup, bench, coach, gold, and synergies. |
| `/赛程` | - | Show the current event schedule. |
| `/升级教练` | - | Upgrade the team's coach level when rules allow it. |
| `/上阵 备战编号 [首发位]` | - | Move a bench player into the starting lineup. |
| `/下阵 首发位` | - | Move a starting player out when rules allow it. |
| `/出售 备战编号` | - | Sell a bench player. |
| `/战术 火力|稳定|残局` | - | Set the team's tactical focus. |
| `/结束回合` | - | Mark readiness and advance when required players are ready. |
## Notes
- Commands must be sent in the configured WeChat group and normally mention the
bot, depending on deployment configuration.
- OCR whitespace loss is tolerated for selected compact forms such as
`/steam时长Dota2` and `/21点开始100`.
- Real profiles, Steam IDs, person context, message payloads, and secrets are
never stored in this repository.
+4 -3
View File
@@ -1,7 +1,7 @@
# Command Registration And Execution Paths
Status: authoritative local registration and routing contract for
`alpha 0.6.x`.
`beta 1.0.x`.
## Three Execution Paths
@@ -46,7 +46,7 @@ because each bubble position still produces its own `IncomingMessage`.
Changed pixels force fresh OCR. The cache is bounded and periodically
revalidated.
For the three local plugins added in `alpha 0.6.1.1015`, including bilingual
For the local plugins introduced during the 0.6.x line, including bilingual
commands, person identity limitations and atomic single-player game settlement,
see [local plugin rules](local-plugins-0.6.1.md).
@@ -146,7 +146,8 @@ descriptors unless they are strictly Kernel-only. The current official
operational commands are:
- `/状态` and `/status`: server, Edge, OCR, and queue status.
- `/version`: installed JWeBot package versions.
- `/version`: installed JWeBot package versions plus the latest changelog date
and summary.
- `/debug`: recent privacy-safe telemetry p50/p95/max summary.
These commands delegate to Kernel-owned service profiles through generated
+1 -1
View File
@@ -1,6 +1,6 @@
# Plugin Contract
Status: authoritative for the `alpha 0.6.x` extension API.
Status: authoritative for the `beta 1.0.x` extension API.
## Scope
+5 -3
View File
@@ -6,9 +6,11 @@ exception.
## Release Discipline
- Version format is `alpha X.Y.Z.MMDD`.
- Patch changes increment `Z`; minor version changes require explicit user
approval.
- Version format is `beta X.Y.Z.MMDD` for current beta releases.
- Python package versions use the matching PEP 440 beta form, such as
`X.Y.Zb1+MMDD`.
- Patch changes increment `Z`; minor, major, or stable-release changes require
explicit user approval.
- A release change must update:
- `VERSION`;
- root `pyproject.toml`;
+1 -1
View File
@@ -1,6 +1,6 @@
# Runtime Telemetry And ACK Semantics
Status: local instrumentation contract for `alpha 0.6.x`.
Status: local instrumentation contract for `beta 1.0.x`.
## What ACK Means
+10 -6
View File
@@ -1,20 +1,24 @@
# Versioning
JWeBot uses an alpha version string:
JWeBot uses a human-readable product version string:
```text
alpha X.Y.Z.MMDD
beta X.Y.Z.MMDD
```
Rules:
- `alpha` means the public API and deployment process may still change.
- `beta` means the project has passed the local, staging, privacy, and
production-safety gates expected for wider testing, while still allowing
controlled breaking changes before a stable release.
- `X.Y.Z` is the project version.
- `MMDD` is the delivery date.
- Python package versions use PEP 440 pre-release form. For beta builds,
`beta 1.0.0.1016` maps to `1.0.0b1+1016`.
- Normal small updates increment only the patch version, for example
`alpha 0.0.1.1014` to `alpha 0.0.2.1014`.
- Minor versions such as `0.1.x` require explicit user review and milestone
approval.
`beta 1.0.0.1016` to `beta 1.0.1.1016`.
- Minor, major, or stable-release changes require explicit user review and
milestone approval.
- Local repository migration does not imply a production deployment.
- Production services must not be changed unless the operator explicitly asks
for deployment or runtime verification.
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "jwebot-config"
version = "0.6.11a0+1015"
version = "1.0.0b1+1016"
description = "Profile-based configuration compiler for JWeBot"
requires-python = ">=3.9"
dependencies = [
@@ -36,4 +36,4 @@ __all__ = [
"write_default_profile",
]
__version__ = "0.6.11a0+1015"
__version__ = "1.0.0b1+1016"
@@ -4,12 +4,12 @@ build-backend = "setuptools.build_meta"
[project]
name = "jwebot-extension-host"
version = "0.6.11a0+1015"
version = "1.0.0b1+1016"
description = "Single-release, single-invocation process host for JWeBot extensions"
requires-python = ">=3.9"
dependencies = [
"jwebot-sdk==0.6.11a0+1015",
"jwebot-kernel==0.6.11a0+1015",
"jwebot-sdk==1.0.0b1+1016",
"jwebot-kernel==1.0.0b1+1016",
]
[project.scripts]
@@ -16,4 +16,4 @@ __all__ = [
"process_request",
]
__version__ = "0.6.11a0+1015"
__version__ = "1.0.0b1+1016"
+4 -4
View File
@@ -4,13 +4,13 @@ build-backend = "setuptools.build_meta"
[project]
name = "jwebot-kernel"
version = "0.6.11a0+1015"
version = "1.0.0b1+1016"
description = "Stable routing and extension authority for JWeBot"
requires-python = ">=3.9"
dependencies = [
"jwebot-config==0.6.11a0+1015",
"jwebot-sdk==0.6.11a0+1015",
"jwebot-official-extensions==0.6.11a0+1015",
"jwebot-config==1.0.0b1+1016",
"jwebot-sdk==1.0.0b1+1016",
"jwebot-official-extensions==1.0.0b1+1016",
"tomli>=2; python_version < '3.11'",
]
@@ -107,4 +107,4 @@ __all__ = [
"verify_installed_release_signature",
]
__version__ = "0.6.11a0+1015"
__version__ = "1.0.0b1+1016"
@@ -4,11 +4,11 @@ build-backend = "setuptools.build_meta"
[project]
name = "jwebot-official-extensions"
version = "0.6.11a0+1015"
version = "1.0.0b1+1016"
description = "Reviewed local command adapters and broker implementation for JWeBot"
requires-python = ">=3.9"
dependencies = [
"jwebot-sdk==0.6.11a0+1015",
"jwebot-sdk==1.0.0b1+1016",
]
[tool.setuptools.packages.find]
@@ -90,4 +90,4 @@ __all__ = [
"render_feature_list",
]
__version__ = "0.6.11a0+1015"
__version__ = "1.0.0b1+1016"
@@ -11,6 +11,7 @@ import subprocess
import time
from collections import Counter
from datetime import datetime, timezone
from pathlib import Path
from typing import Any, Callable
from zoneinfo import ZoneInfo
@@ -26,6 +27,7 @@ BEIJING_TIMEZONE = ZoneInfo("Asia/Shanghai")
DICE_PATTERN = re.compile(r"^(?:(\d{1,2})[dD](\d{1,3}))?$")
RANDOM_NUMBER_PATTERN = re.compile(r"^(-?\d{1,6})\s+(-?\d{1,6})$")
MULTI_REPLY_MARKER = "\x1eJWEBOT_MULTI_REPLY_V1\x1e"
CHANGELOG_HEADING = re.compile(r"^##\s+(.+?)(?:\s+-\s+(\d{4}-\d{2}-\d{2}))?\s*$")
class LocalCommandError(RuntimeError):
@@ -401,13 +403,75 @@ class LocalCommandEngine:
return "unknown"
return str(getattr(module, "__version__", "unknown"))
@staticmethod
def changelog_candidates() -> list[Path]:
candidates: list[Path] = []
module_path = Path(__file__).resolve()
for parent in (module_path.parent, *module_path.parents):
candidates.append(parent / "CHANGELOG.md")
candidates.append(Path.cwd() / "CHANGELOG.md")
seen: set[Path] = set()
unique: list[Path] = []
for candidate in candidates:
if candidate in seen:
continue
seen.add(candidate)
unique.append(candidate)
return unique
@classmethod
def latest_changelog(cls) -> dict[str, str]:
for path in cls.changelog_candidates():
if not path.is_file():
continue
text = path.read_text(encoding="utf-8")
lines = text.splitlines()
for index, line in enumerate(lines):
match = CHANGELOG_HEADING.match(line)
if not match:
continue
version = match.group(1).strip()
updated_at = (match.group(2) or "").strip()
bullet_parts: list[str] = []
collecting = False
for item in lines[index + 1 :]:
if item.startswith("## "):
break
if item.startswith("- "):
if collecting:
break
collecting = True
bullet_parts.append(item[2:].strip())
continue
if collecting:
if item.startswith(" "):
bullet_parts.append(item.strip())
continue
if not item.strip():
break
summary = normalize_text(" ".join(bullet_parts))
return {
"version": version,
"updated_at": updated_at or "unknown",
"summary": summary or "暂无更新摘要",
}
return {
"version": "unknown",
"updated_at": "unknown",
"summary": "未找到 CHANGELOG.md",
}
def jwebot_version(self) -> str:
changelog = self.latest_changelog()
return (
"JWeBot 版本:"
f"kernel {self.package_version('jwebot_kernel')},"
f"sdk {self.package_version('jwebot_sdk')},"
"official "
f"{self.package_version('jwebot_official_extensions')}"
f"{self.package_version('jwebot_official_extensions')}\n"
f"最新版本:{changelog['version']}\n"
f"更新时间:{changelog['updated_at']}\n"
f"更新摘要:{changelog['summary']}"
)
@staticmethod
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "jwebot-sdk"
version = "0.6.11a0+1015"
version = "1.0.0b1+1016"
description = "Typed, capability-limited extension API for JWeBot plugins"
requires-python = ">=3.9"
dependencies = []
@@ -38,4 +38,4 @@ __all__ = [
"SingleGroupContext",
]
__version__ = "0.6.11a0+1015"
__version__ = "1.0.0b1+1016"
+1 -1
View File
@@ -1,5 +1,5 @@
[tool.jwebot]
release = "alpha 0.6.11.1015"
release = "beta 1.0.0.1016"
production_deployments_enabled_by_default = false
[tool.jwebot.workspace]
+2
View File
@@ -50,6 +50,8 @@ class DeploymentScriptTests(unittest.TestCase):
def test_user_installer_owns_the_complete_adaptive_runtime(self):
source = USER_INSTALLER.read_text(encoding="utf-8")
for required in (
"CHANGELOG.md",
"VERSION",
"wechat_local_ocr.py",
"wechat_health_watch.py",
"wechat_adaptive_recorder.py",
+3
View File
@@ -867,6 +867,9 @@ class LedgerAndApplicationTests(unittest.TestCase):
self.assertEqual(version["route"], "local")
self.assertIn("JWeBot 版本", version["text"])
self.assertIn("kernel", version["text"])
self.assertIn("最新版本:beta 1.0.0.1016", version["text"])
self.assertIn("更新时间:2026-10-16", version["text"])
self.assertIn("更新摘要:Promote JWeBot", version["text"])
self.assertEqual(debug["route"], "local")
self.assertIn("调试埋点", debug["text"])
self.assertEqual(balance["route"], "local")
+2 -2
View File
@@ -5,10 +5,10 @@ cd "$(dirname "$0")/.."
version=$(cat VERSION)
case "$version" in
alpha\ [0-9]*.[0-9]*.[0-9]*.[0-9][0-9][0-9][0-9])
beta\ [0-9]*.[0-9]*.[0-9]*.[0-9][0-9][0-9][0-9])
;;
*)
echo "VERSION must match: alpha X.Y.Z.MMDD" >&2
echo "VERSION must match: beta X.Y.Z.MMDD" >&2
exit 1
;;
esac
+11 -2
View File
@@ -4,7 +4,16 @@ set -eu
cd "$(dirname "$0")/.."
release=$(cat VERSION)
version=${release#alpha }
case "$release" in
beta\ *)
stage=b
version=${release#beta }
;;
*)
echo "Cannot derive package version from VERSION" >&2
exit 1
;;
esac
old_ifs=$IFS
IFS=.
set -- $version
@@ -13,7 +22,7 @@ if [ "$#" -ne 4 ]; then
echo "Cannot derive package version from VERSION" >&2
exit 1
fi
package_version="$1.$2.$3a0+$4"
package_version="$1.$2.$3${stage}1+$4"
for path in \
packages/jwebot-config/pyproject.toml \