release: 0.4.0#154
Merged
Merged
Conversation
release: 0.3.1 back-merge
* feat: show latest session cost on observe * ci: stabilize wizard skip smoke * fix: address observe session review * ci: relax wizard gateway skip smoke
Add GLM provider support and contributor guidance
…plan-provider Add Baidu Qianfan Coding Plan provider
Add a watchdog for OpenClaw gateway recovery
Fix Windows WSL workspace paths and Vitest workers
feat: add package download tracker skill
…#125) - Add v0.4.0 milestone badge to the build/meta line; bump v0.3.0 install note to v0.3.1 and point at the milestone. - Add Workshop badge to the brand/product line linking to clawmaster-workshop. - Offer two on-ramps after "After Launch": hands-on workshop or pictured walkthrough via the Product Tour. - Introduce a capability-framed Memory Highlights section with upstream PowerMem (Python / TS SDK / OpenClaw plugin) links and a brief on why PowerMem is the memory backbone. - Reorder: Memory Highlights under "Why ClawMaster"; Who It Is For after "Product Tour". - Tighten body: drop "ClawMaster vs. CLI Only" and "What You Can Do Today", collapse "Why ClawMaster" and "Who It Is For". - Fix broken openclaw/powermem + openclaw/seekdb acknowledgments links (oceanbase/*). - Drop the non-existent Discord link from the hero nav. - Apply the same set of changes to README.md / README_CN.md / README_JP.md.
feat: add Wiki knowledge module
…lease-notifications # Conflicts: # packages/web/src/modules/settings/__tests__/CapabilitiesSection.test.tsx
…tifications Add ClawMaster release notifications
…t-layout Fix settings update errors and render release notes compactly
…shing Use release-action for GitHub release publishing
…awprobe, npm)
On Windows, npm global installs create .cmd wrapper scripts instead of
bare executables. Node's child_process.spawn/execFile and Rust's
std::process::Command cannot execute .cmd files directly — they need
either or explicit invocation.
Fixes across all layers:
Backend (Node.js):
- Add 'openclaw' and 'clawprobe' to NPM_INSTALLED_COMMANDS set so
resolveExecFileCommand appends .cmd on Windows
- Add shell: process.platform === 'win32' to execOpenclaw(),
execOpenclawSpawnStdin(), spawnOpenclawGatewayStart()
- Add shell: process.platform === 'win32' to runClawprobeCommand()
and runClawprobeJson() in execClawprobe.ts
- Update tests for the new openclaw.cmd/clawprobe.cmd resolution
Bundled skills:
- Add shell: process.platform === 'win32' to getGlobalNpmRoot() in
clawprobe-cost-digest/scripts/common.mjs
- Add shell: process.platform === 'win32' to defaultRunOpenclaw() in
package-download-tracker/scripts/common.mjs
Tauri (Rust):
- openclaw_cmd(): wrap with cmd /C when exe_path extension is .cmd
or when the path has no extension (bare name fallback)
- clawprobe_cmd(): same treatment
- All Command::new("npm") calls: use cmd /C npm on Windows
(npm_root_g, npm_uninstall_global_robust, list_npm_package_versions,
run_npm_install_openclaw_global, npm_install_openclaw_from_file,
run_skillguard_scan_host)
- run_system_command(): wrap with cmd /C on Windows when the resolved
program path ends in .cmd or the command is a known npm-installed
tool (npm, clawhub)
Closes #140
When shell:true is used with spawn on Windows, cmd.exe becomes the direct child process. Killing only the shell child leaves the real openclaw/clawprobe process orphaned. Use taskkill /T /F /PID to kill the entire process tree on Windows, with a fallback to SIGKILL. Also add windowsHide:true to suppress console windows on Windows.
The previous refactored killChild() helper removed the graceful SIGTERM then delayed SIGKILL shutdown window that existed before. On non-Windows, the timeout path now sends SIGTERM first, then escalates to SIGKILL after 5 seconds — preserving the original behavior. On Windows, the taskkill /T /F approach remains (no graceful shutdown needed; Windows process tree cleanup takes priority over signal handling).
fix: resolve Windows ENOENT for npm-installed CLI tools (openclaw, clawprobe, npm)
* fix: recover wechat qr login flow * fix: keep wechat qr polling responsive
* feat: add gateway-backed wiki llm workflows
* test: prove wiki powermem workflow end to end
* test: deflake darwin node home resolution check
* fix: address review issues in wiki module
- P1: Pass { detectContradictions: false } to lintWiki() in the HTTP
route handler so /api/wiki/lint stays fast and local-only instead of
making implicit LLM API calls
- P2: Restore showInNav: !getIsTauri() guard in wiki module index to
prevent broken wiki nav entry on Tauri desktop
- P2: Replace shouldUseMockedFetchTransport() fragile globalThis.fetch
identity check with an explicit WIKI_LLM_USE_GATEWAY env var
* fix: use explicit test transport flag instead of fragile fetch identity check
The previous commit replaced shouldUseMockedFetchTransport() with an
env-var-only check, which broke all tests that mock globalThis.fetch to
route LLM calls through the gateway-fetch path. The CI failures were:
- wikiLlm.test.ts test 178: mocked fetch never hit (no override, no env var)
- wikiService.test.ts tests 184-196: mocked fetch never hit, LLM calls
went through infer-model path instead, causing assertion failures
Fix by introducing setWikiLlmUseGatewayFetchForTests() -- an explicit
test-only flag that forces the gateway-fetch transport. This replaces
the fragile globalThis.fetch !== nativeFetch identity check for
production (where WIKI_LLM_USE_GATEWAY env var is now the authoritative
signal) while keeping tests working without relying on fetch identity.
The shouldUseMockedFetchTransport function now checks:
1. test transport flag (set by tests that mock fetch)
2. WIKI_LLM_USE_GATEWAY env var (explicit production opt-in)
3. globalThis.fetch !== nativeFetch (legacy fallback)
…e powermem integration (#151) * refactor(wiki): rename user-facing "Wiki" to "Knowledge" The module is an LLM-curated knowledge base built around automated ingest, derivation, and synthesis — not a hand-authored wiki. User-facing copy is updated to reflect that, and this positioning informs follow-up decisions such as not adding page-edit/CRUD endpoints. Changes: - packages/web/src/locales/main/{en,zh,ja}.ts: rename nav.wiki, wiki.title, wiki.subtitle, and related labels; reword copy that implied hand-editing (e.g. "compile into the wiki" → "ingest as a knowledge source"); drop stale references to PowerMem from user-facing strings where the backing engine is already surfaced by the stats panel. - packages/web/src/modules/wiki/__tests__/WikiPage.test.tsx: update assertions to match the new strings. - README.md / README_CN.md / README_JP.md: v0.4.0 roadmap entry renamed from "LLM Wiki" to "LLM Knowledge module" in all three languages. Code identifiers, routes (/wiki, /api/wiki/*), file paths, and TypeScript types remain unchanged — renaming them is high-cost, zero-user-value churn that would bloat the diff without any observable improvement. * refactor(wiki): share vault path and structure resolver with powermem plugin Two layers used to own the same on-disk wiki vault: wikiService derived the path from the OpenClaw profile selection, the PowerMem plugin derived it from the managed data root. They converged for the default profile but could drift under non-trivial configurations (named profile without a data-root override, differing env handling), and each layer wrote the vault scaffold (SCHEMA.md, .meta/*.json, index.md, log.md) independently. Changes: - packages/backend/src/openclawVaultPaths.ts (new): single source of truth for vault-root resolution and directory/meta scaffolding. Precedence: explicit override > CLAWMASTER_WIKI_ROOT env > OPENCLAW_STATE_DIR env > data-root-derived state dir > profile selection. Exports resolveWikiVaultRoot, resolveWikiVaultLayout, ensureWikiVaultStructure, and WIKI_SCHEMA_MARKDOWN. - packages/backend/src/openclawVaultPaths.test.ts (new): matrix tests across override / env / data-root / profile inputs, plus a parity check asserting the plugin's join(resolveOpenclawWorkspaceDir(ctx), '..', 'wiki') lands on the same vault root as the shared helper. - packages/backend/src/services/wikiService.ts: delete the local resolveOpenclawStateDir + WIKI_SCHEMA_TEMPLATE + inline directory ensure logic; delegate resolveWikiPaths and ensureWikiVault to the shared module. Drop the stealth SCHEMA.md force-overwrite block (obsolete migration). - plugins/memory-clawmaster-powermem/index.ts: honor CLAWMASTER_WIKI_ROOT in resolveWikiVaultRoot for parity with the backend (no other behavior change). * refactor(wiki): migrate list frontmatter to yaml arrays generatedFromSourceIds, relatedPages, and relatedPageIds now persist as YAML inline arrays on disk (e.g. `generatedFromSourceIds: ["a", "b"]`) instead of pipe-delimited strings. External markdown editors render these as native lists and can query them with dataview-style tools without treating the value as a single opaque string. The in-memory shape remains Record<string, string> — parseFrontmatter pipe-joins array values on read so existing call sites keep working, and renderFrontmatter splits them back out on write for any key in LIST_FRONTMATTER_KEYS. A small set of helpers (readListFrontmatter, serializeFrontmatterList, normalizeFrontmatterValueForWrite) replaces the ad-hoc parsePipeList / serializePipeList pair. Source pages no longer write a body-level "## Extracted Wiki Links" generated block. The derived page titles now flow into a `relatedPages` frontmatter array; re-ingest of any legacy page strips the old block via removeGeneratedBlock before writing. summarizeParsedPages unions frontmatter relatedPages into the page link graph so backlinks and orphan detection still see the derived-entity edges. The shared SCHEMA.md template documents the new array convention. The wikiService test asserts the raw on-disk file carries YAML-array syntax and that the legacy body section is absent. * fix(wiki): replace fetch-identity transport sniffing with explicit resolution wikiLlm.ts previously decided between gateway-fetch and infer-model by comparing globalThis.fetch against a module-load-time reference. Any APM agent, polyfill, or test harness that wraps fetch would silently divert production traffic to the gateway-fetch path, bypassing the intended CLI transport. Changes: - Drop the nativeFetch capture and shouldUseMockedFetchTransport logic. Transport resolution is now: explicit test override > WIKI_LLM_USE_GATEWAY env ('1' → gateway-fetch) > default (infer-model). WIKI_LLM_USE_GATEWAY is the only opt-in outside of tests. - Introduce setWikiLlmTransportForTests(transport|null) as the primary test seam. setWikiLlmUseGatewayFetchForTests is kept as a deprecated shim so existing test files compile unchanged during the transition. - Add tests asserting: default routes to infer-model without calling fetch; WIKI_LLM_USE_GATEWAY=1 forces gateway-fetch; explicit override beats the env. - Replace bare catch {} blocks in wikiService.ts LLM call sites with logWikiLlmFailure() calls that emit console.warn with the error message and a structured context object. Warning code payloads are preserved. - Simplify sanitizeWikiBody: the two CLAWMASTER-GENERATED-specific comment strips are subsumed by the single generic comment-strip regex. * perf(wiki): hoist listWikiPages out of derived-page ingest loop ingestWikiSource called listWikiPages(context) inside every iteration of the derived-page upsert loop — an O(N×M) filesystem scan per ingest. Fix: compute knownPages once before the loop and pass the snapshot to upsertDerivedPage. A mutable copy is kept and extended after each successful upsert so later suggestions in the same batch see freshly created pages without a re-scan. The duplicate listWikiPages on the skipped-fingerprint fast-path now reuses the same snapshot. Also truncate and sanitize contradiction check inputs to MAX_CONTRADICTION_PAGE_CHARS (3000 chars) per page — same sanitizer used for query synthesis — to cap per-pair token spend in a dense vault. A test asserts the user message delivered to the LLM is < 7500 chars even when each source page is 10 000 chars of body text. * chore(wiki): rename log helper, guard proof helper, document bridge install flag - plugins/memory-clawmaster-powermem/index.ts: rename buildAutoRecallLogForTest → formatAutoRecallLog. The function is called in production code; the ForTest suffix was misleading. Update the call site and the test import. - packages/backend/src/services/managedMemoryBridge.ts: expand the inline comment on dangerouslyForceUnsafeInstall to explain which specific check it bypasses (resetManagedMemory access + direct openclaw/plugin-sdk imports) and note what a narrower alternative would look like when OpenClaw adds one. - tests/ui/wiki-powermem-proof-helper.ts: add a fail-fast check before syncManagedMemoryBridge runs — if the resolved --home path is the real user home or any subdirectory of it, throw rather than risk writing into the live OpenClaw profile. * fix(wiki): resolve three post-review follow-ups 1. Plumb managedMemoryContext.dataRootOverride into resolveWikiPaths so the shared vault-root resolver is exercised at runtime, not only in unit tests. Before this change, the Stage 2 dataRootOverride support in resolveWikiVaultLayout was dead code from the wikiService call path. Add a unit test in openclawVaultPaths.test.ts and an integration test in wikiService.test.ts asserting the vault root resolves correctly when only dataRootOverride (no vaultRootOverride) is set. 2. Add a multi-element readListFrontmatter round-trip test. The previous YAML-array tests only exercised single-element arrays. The new test ingests a source page where the LLM returns two suggestions and asserts that relatedPages persists as a two-element YAML inline array on disk while the in-memory representation stays pipe-joined. 3. Replace setWikiLlmUseGatewayFetchForTests with setWikiLlmTransportForTests('gateway-fetch') in the contradiction- truncation test and in afterEach, ahead of the deprecated shim's removal.
* fix: clarify PaddleOCR OCR config flow * fix: remove hardcoded PaddleOCR endpoint default
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Ship
developasrelease/0.4.0— 26 non-merge commits, 120 files changed sincev0.3.1.Highlights
Added
Fixed
taskkill, ENOENT for npm-installed CLI tools)Changed
How
release/0.4.0fromdeveloptip0.4.0inpackage.json,packages/web/package.json,packages/backend/package.json,src-tauri/tauri.conf.json,src-tauri/Cargo.tomlCHANGELOG.mdwith release notesPost-merge
v0.4.0on the merge commitbuild.ymlrelease/0.4.0back intodevelopto catch up any release-line changes