(service) A failed Qdrant read is an error, never "not indexed"
(service) Issues reindex tolerates a failed stored-rule lookup
(service) Gemini requests the configured dimensions; init template uses 3072
(service) GET /config/schema derives from the core config schema
(service) Reindex plans group files by each watch root's static glob prefix
(service) Enrich --json accepts only a JSON object
(service) An over-limit Retry-After fails every caller fast until it has fully passed
(release) GitHub release notes and changelog use the new version tag
๐ผ Other
[256] fix(service): resolve file-based schemas against config dir in /config/validate
validateInferenceRuleSchemas now receives deps.configDir and passes it to mergeSchemas, so relative global schema paths resolve against the config file's directory instead of process.cwd(). Adds regression tests for the resolved and missing-file cases.
(service) Keep documents-integration within 300 lines
(service) Split the rules engine suite into matching, set and JsonMap suites
โ๏ธ Miscellaneous Tasks
Ship LICENSE in every package; core README and license metadata
Service resolves the SDK from the workspace, not as a dependency
Tsdoc config for core; real-git reconciliation tests get the suite's 30 s budget
[0.19.1] - 2026-09-30
๐ผ Other
[249] fix(vcs): resilient commit pipeline and squash guard (#249)
Detect "nothing staged" with git diff --cached --quiet instead of
parsing git's "nothing to commit" text; empty batches are no-ops.
Partition each batch: add existing files, stage removal of
tracked-but-missing files (git rm --cached --ignore-unmatch), drop
missing untracked files. A missing path never fails the batch.
Reconcile tracked deletions in the watch scope at the end of the
initial scan so the baseline commit records them.
Retry only index.lock contention (shouldRetry on util/retry).
Circuit breaker retains pending files and recovers on a time-based
half-open attempt (vcs.circuitBreakerCooldownMs, default 5 min);
state exposed per root in GET /vcs/status.
Pass -c core.longpaths=true on every VCS git invocation.
Squash refuses on in-progress sequencer/rebase/merge state or dirty
tracked files, aborts a failed cherry-pick during cleanup, and stale
state is reported at startup.
[249] refactor(vcs): address #251 review, SOLID/DRY pass and test hardening
Review fixes:
Treat only ENOENT/ENOTDIR as "missing" when partitioning a batch;
other stat errors propagate so the batch is retained and retried.
Re-queue a failed batch in full (no cap); flush commits the backlog
in maxBatchSize chunks, so no chunk exceeds the batch size.
breaker.pendingCount includes files taken for an in-flight commit.
isIndexLockError requires "index.lock"; a bare EEXIST is not retried.
Narrow unknown rejection values via getErrorCode before reading code.
Structure:
Extract CommitCircuitBreaker (pure, injectable clock), batchStaging
(classify + stage), gitIndex (index ops), gitRepoState (stale ops,
dirty tree, index.lock), watchScope (glob + ignored scope), cronMatch,
and runGit (single pinned-argv git runner used by VcsManager,
SquashManager, vcsBootstrap, CommitMessageBuilder and VCS handlers).
Fix /vcs/status lastCommit when the subject contains "|".
Tests:
Split resilience tests into VcsManager.staging / VcsManager.breaker,
squash guards into SquashManager.guards, coordinator reconciliation
into its own file; shared fixtures in test/vcsRepo and test/squashRepo.
Replace the mocked cherry-pick failure (and its type cast) with a real
merge-commit failure; drop the trivial 52s re-queue-cap test.
New unit tests: CommitCircuitBreaker, batchStaging, gitIndex,
gitRepoState, retry, watchScope, cronMatch, SquashManager scheduler,
vcsStatus.
[249] test(vcs): split oversized VcsManager, SquashManager and VCS handler test files
Pure moves along existing describe boundaries; all 80 test names preserved.
Drop a gitIndex timeout test that raced a 1 ms timer against git and
flaked under parallel load.
[249] test(vcs): make pathKey test independent of host OS
resolve() follows the host platform, so a Windows drive path is relative on Linux. Test lowercasing with a path absolute on both; run the backslash case on Windows only.
[234] [244] fix(service): make git network calls non-interactive
Route push and squash force push through execGitNetwork: -c credential.helper= plus GIT_TERMINAL_PROMPT=0, GCM_INTERACTIVE=never, GIT_ASKPASS/SSH_ASKPASS=echo, so system/global credential helpers (Git Credential Manager) can never block. Tests use loopback 127.0.0.1:9 instead of github.com / invalid.example.com.
[234] [244] fix(service): clear credential helpers only for injected tokens; drop-at-once test remote
Adopt findings from the parked w243 attempt: always -c core.askPass= with empty GIT_ASKPASS/SSH_ASKPASS, GIT_TERMINAL_PROMPT=0, GCM_INTERACTIVE=never; reset credential.helper only when a token is injected so stored credentials still work. gitPushNonInteractive centralises push URL + policy (SquashManager 471 -> 468 lines). Tests use a local TCP server that drops connections (~ms) instead of 127.0.0.1:9 (~2 s on Windows).
[234] [245] fix(service): keep the access token off the git command line and out of errors
Send the token to git as a URL-scoped http..extraHeader (Basic x-access-token) via GIT_CONFIG_COUNT/KEY/VALUE env for that push only, instead of embedding it in the push URL (which Node echoes in exec error messages/cmd, reaching logs and pushErrors / GET /vcs/status). Credential helpers are still cleared when a token is used (#244). Defence in depth: sanitizeGitError redacts raw, URL-encoded and base64 forms from message, stack, cmd, stderr and stdout. Remove buildAuthenticatedPushUrl.
[234] fix: tests and typecheck read watcher-core from source, not dist
Service and openclaw vitest configs alias @karmaniverous/jeeves-watcher-core
to packages/core/src, and their tsconfigs map it via paths, so typecheck
and tests pass on a clean checkout with no dist/. Rollup builds override
paths ({}) so bundling and typing still use the built core package with
no TS warnings. Root npm test now also runs the openclaw package tests.
Closes #242
[234] chore: update root package-lock in release-it after:bump hooks
[234] fix(deps): require watcher-core ^0.2.6-0 (no fallback to 0.2.5)
[234] [243] test(service): warm Fastify cold start in hooks, close apps
The first onRulesChanged test paid Fastify's lazy require of ~250 CJS
modules (ajv-compiler/ajv/fast-json-stringify), light-my-request's lazy
load on first inject(), and the first ajv rule compile inside its 5s test
budget, which timed out on a slower Windows machine during release:pre.
Warm the full register path in beforeAll, close every app in afterEach,
and drop the unneeded 50ms settle sleeps (executeReindex is invoked
synchronously by the handler). Apply the same warm-up and server close to
integration.test.ts.
[234] chore(deps): ncu --peer across all packages (keep @karmaniverous/jeeves pinned)
[234] chore(deps): audit fix, transitive overrides, hold extra-typings@14, drop @types/js-yaml
npm audit fix, then overrides for type-only transitive chain of mdast-util-from-adf (linkify-it ^5.0.2, uuid ^14.0.2); lockfile regenerated so overrides apply
@commander-js/extra-typings held at ^14: peer-coupled to commander 14 used by @karmaniverous/jeeves 0.5.x (held via --reject)
@types/js-yaml removed: js-yaml 5 ships its own types
[234] fix: migrate vector search to Qdrant query API; drop meaningless void operators
@qdrant/js-client-rest 1.19 removed QdrantClient.search; use client.query (same params, results in .points)
typescript-eslint 8.70 no-meaningless-void-operator: remove unused params instead of voiding them
[234] chore: knip and prettier clean-up
knip 6.38: remove unused barrel re-exports and a stale backward-compat re-export (no public API change)
prettier 3.9 formatting; add .prettierignore for generated CHANGELOGs, config.schema.json and .stan state
[234] feat!: move core and service to @karmaniverous/jeeves 0.6.0-4
Drop the v0.x workspace-writer descriptor fields (sectionId,
refreshIntervalSeconds, generateToolsContent) removed in core 0.6.
[234] chore(service): update @commander-js/extra-typings to 15
Unblocked by core 0.6.0-4 (commander 15).
[234] chore(build): zero build and typedoc warnings
service: drop tsconfig incremental (made the rollup configPlugin warn
about outputToFilesystem); mark node: builtins external in the d.ts build.
openclaw: drop only bundled-zod INVALID_ANNOTATION / node_modules-only
CIRCULAR_DEPENDENCY rollup warnings.
[234] fix(release): use --github.preRelease for release-it 21
[234] refactor(service): migrate EnrichmentStore to node:sqlite
Replace better-sqlite3 with the built-in node:sqlite DatabaseSync. Behaviour and EnrichmentStoreInterface are unchanged (WAL, busy_timeout 5000, startup wal_checkpoint(TRUNCATE) busy warning, schema, path normalisation, merge-on-set, atomic move). Adds a fixture written by the better-sqlite3 13.0.3 build and a test proving it opens, reads and updates correctly. Externalise node: built-ins in the service rollup library/CLI builds (matches jeeves-runner) so node:sqlite does not warn as unresolved. Refs #237.
[234] chore(deps): remove better-sqlite3
Drop better-sqlite3 and @types/better-sqlite3 from packages/service and the better-sqlite3 entry from root allowScripts. Docs: note node:sqlite (no native build) and align stale Node 20+ prerequisites with engines >=22. Closes #237.
[224] fix: append /** to bare directory watch paths (fixes #224)
[230] fix: squashmanager compound defect (#230)
Bug 1: Use configured branch name instead of dynamic git branch detection
Bug 2: Restart throttle timer after commit failure so re-queued files retry
Bug 3: Pause/resume coordination between SquashManager and VcsManager
Bug 4: Add timeouts to all git operations (30s standard, 120s cherry-pick, 60s push)
Bug 5: Exclude "nothing to commit" from circuit breaker failure count
Bug 6: Startup orphan branch detection and recovery
Adds branch field to VcsConfig schema (default: "master").
SquashManager now pauses VcsManager commit pipeline during squash.
All execFileAsync and gitAddViaStdin calls have explicit timeouts.
Fixes #230
[230] refactor: SOLID/DRY pass on VCS subsystem (#230)
Extract GIT_TIMEOUT_STANDARD/CHERRY_PICK/PUSH constants from magic numbers
Extract buildAuthenticatedPushUrl() โ eliminates duplicate token-URL
construction in vcsPush.ts and SquashManager.forcePushIfConfigured()
Extract getExecErrorFields() โ shared error field extraction replaces
duplicate unsafe casts in isIndexLockError() and isNothingToCommitError()
Convert SquashManager constructor from 8 positional params to
(rootPath, retention, logger, options?) pattern
[230] test: close coverage gaps for #230 utilities and error paths
Unit tests for getExecErrorFields() (ExecFileException fields,
plain Error, non-Error values, non-string properties)
Unit tests for buildAuthenticatedPushUrl() (no token, undefined token,
HTTPS injection, special chars, SSH URLs, file:// URLs)
Document pause/resume coordination in squash mechanism
Document startup orphan branch detection and recovery
Document "nothing to commit" handling and retry timer after failure
Document git operation timeouts (30s/120s/60s)
Add troubleshooting entries: wrong branch after crash, git timeouts
[230] fix: call resumeCommits when pauseCommits throws (#230)
If pauseCommits() threw after partially executing (e.g., flush succeeded
but the flag wasn't set), runSquash() returned early without reaching
the finally block that calls resumeCommits(). This could leave the
commit pipeline permanently paused.
Add resumeCommits() call in the pause-failure catch block. Resume is
safe to call even if the pipeline isn't actually paused.
Addresses Copilot review comment on PR #231.
Updated core
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.18.11
[0.18.10] - 2026-06-13
๐ Features
Add shared endpoint catalog in core package (#196)
๐ Bug Fixes
Replace VCS commit debounce with throttle (#221)
๐ผ Other
Updated core
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.18.10
[0.18.9] - 2026-06-13
๐ Bug Fixes
(vcs) Add stale lock detection, circuit breaker, and re-queue cap (#219)
(app) Thread VCS callbacks through config reload (#218)
(vcs) Apply retention defaults when retention config is omitted (#216)
(api) Prune incomplete-result safety and retry improvements (#182)
Address PR #220 review โ error handling, circuit breaker, case sensitivity, and test determinism
Address Copilot review โ error handling, circuit breaker reset, Windows case sensitivity, test determinism
๐ผ Other
Updated core
Lint fix
๐ Documentation
Update VCS and prune documentation for new features
โก Performance
(api) Rewrite computePrunePlan with filter-first approach (#187)
Extract core package with shared schemas, types, defaults, and constants
โ๏ธ Miscellaneous Tasks
Add npm publish safety net (.npmignore + gitignore *.local)
Move changelog generation to after:bump hook
Update all deps, switch core to rollup build, fix lint errors
Release @karmaniverous/jeeves-watcher v0.17.9
[0.17.8] - 2026-05-03
๐ผ Other
Updated jeeves core
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.17.8
[0.17.7] - 2026-04-22
๐ผ Other
Updated jeeves core
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.17.7
[0.17.6] - 2026-04-15
๐ผ Other
Updated jeeves-core
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.17.6
[0.17.5] - 2026-04-08
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.17.5
[0.17.4] - 2026-04-05
๐ผ Other
Unhoisted jeeves
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.17.4
[0.17.3] - 2026-04-05
๐ผ Other
Hoisted jeeves
Hoisted knip
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.17.3
[0.17.2] - 2026-04-05
โ๏ธ Miscellaneous Tasks
Housekeeping batch (#184, #179, #176, #180, #178)
Release @karmaniverous/jeeves-watcher v0.17.2
[0.17.1] - 2026-04-05
โ๏ธ Miscellaneous Tasks
Update deps for @karmaniverous/jeeves-core v0.5.3
Release @karmaniverous/jeeves-watcher v0.17.1
[0.17.0] - 2026-04-03
๐ Features
Bump core to ^0.5.1, engine floor >=22, adopt getPackageVersion
Add fetchSiblings built-in JsonMap helper for contextual embedding
๐ Bug Fixes
Remove unused JSON_TEXT_FIELDS export (knip)
Break circular dependencies, clean knip config
๐ Refactor
Adopt core createConfigApplyHandler for /config/apply
Adopt core DEFAULT_PORTS for port constants
SOLID/DRY pass across codebase
๐ Documentation
Update skill, READMEs, and diagrams for v0.17.0
Sync all documentation and diagrams with implementation
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.17.0
[0.16.3] - 2026-03-31
๐ผ Other
[CORE-046] feat: integrate core 0.4.6 โ init() called before descriptor.run()
Bumps @karmaniverous/jeeves to 0.4.6 which fixes karmaniverous/jeeves#53:
createServiceCli now calls init() before descriptor.run() in the start
command, so getBindAddress() and other core functions that require
initialization work correctly.
This unblocks upgrading prod from 0.15.2 to the current release.
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.16.3
[0.16.2] - 2026-03-30
๐ผ Other
[CORE-045] feat: integrate core 0.4.5 - add run callback to descriptor
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.16.2
[0.16.1] - 2026-03-30
๐ผ Other
[PHASE-2] fix: resolve package root for bundled CLI entry point
The descriptor used import.meta.url-relative paths for package.json and
startCommand, which broke after Rollup bundled descriptor.ts into
dist/cli/jeeves-watcher/index.js (3 levels deep instead of 1).
Fix: walk up from current file to find the package root by name,
then resolve all paths from there.
[PHASE-2] fix: use package-directory for robust package root resolution
Replace hand-rolled directory walk with packageDirectorySync from
package-directory (already a core dependency). Fixes bundled CLI
crashing with Cannot find module errors when import.meta.url-relative
paths resolve incorrectly after Rollup bundling.
Added package-directory as direct dependency of service package.
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.16.1
[0.16.0] - 2026-03-30
๐ผ Other
[PHASE-0] [#161] fix: catch async rejection in onRulesChanged instead of swallowing it
The buildTemplateEngineAndCustomMapLib promise was fire-and-forget with
void, silently discarding rejections. Replace with explicit .catch()
that logs the error so failures are visible and diagnosable.
[PHASE-0] [#159] fix: add try/catch to facets handler for config and schema errors
getConfig() and buildFacetSchema() can throw on malformed inference rule
configs. Wrap both in try/catch to return graceful error responses
instead of crashing the endpoint.
[PHASE-0] [#162] fix: batch embedAndUpsert to prevent OOM on large files
embedAndUpsert previously sent all chunk points in a single upsert call,
causing OOM on large files. Add configurable batch size (default 50) and
loop upserts in batches. Includes tests for batching behavior.
wrapHandler now returns { error: className, message: actualMessage } instead of generic 'Internal server error'
withCache intercepts reply.send() to capture response payload for caching
On cache hit, withCache sends the captured payload via reply.send()
Fix 8 (watcher_enrich 500) deferred to runtime diagnosis with improved error messages
[V0_10_0] feat: version in /status, live scoreThresholds, virtual rule template rebuild, remove dead config keys (Fixes 6, 10, 12)
Add version field to /status response (read from package.json at startup)
Plugin reads search.scoreThresholds from config via /config/query, falls back to defaults
Score interpretation includes actionable guidance (strong/relevant/noise)
onRulesChanged rebuilds template engine with merged rules (config + virtual)
Remove slots and extractors from root config schema (dead keys)
Remove slots from merged virtual document
Fix 11 (port fallback) already resolved in prior version โ no 3456 reference found
[V0_10_0] test: fix mock dependencies and test assertions for reindex and cache handlers
[V0_10_0] chore: fix lint errors in promptInjection, clean up knip config, regenerate schema
[V0_10_0] fix: replace brittle glob parsing in path reindex with full file list + directory filter
Address Gemini code review: directory-scoped path reindex now lists all watched
files via listFilesFromGlobs then filters to the target directory, instead of
attempting to parse and reconstruct glob patterns with a regex.
Add blast area 'plan' object to all reindex responses (counts by root)
Add dryRun parameter: returns plan without executing
Thread vectorStore into ExecuteReindexDeps for prune access
Refactor processAllFiles to accept pre-computed file list
Guard configWatch auto-trigger against prune scope
Add CONFIG_WATCH_VALID_SCOPES constant
Update plugin tool: prune in scope enum, dryRun parameter
Tests: dryRun per scope (issues/full/rules/prune), prune execution
Closes Phase 6 of spec dev plan.
[FIX-14] docs: update all guides for reindex scopes, dryRun, plan, and version
api-reference.md: /config-reindex now documents all 5 scopes, dryRun,
plan response shape; /status includes version field; error response
includes error+message fields
cli-reference.md: config-reindex documents all scopes, --path, --dry-run
configuration.md: configWatch.reindex includes rules scope, notes
path/prune exclusion
[FIX-17][FIX-18][FIX-19] feat: API Consolidation (Phase 8)
Convert POST /config/query to GET /config with unified inference rules
Rename watcher_query to watcher_config tool
Rename POST /config-reindex to POST /reindex with array path support
Update CLI, plugin, and tests to match
[FIX-17] [FIX-20][FIX-21] Phase 9: POST /walk endpoint, watcher_walk tool, auto rules-reindex on rule registration
Fix 20:
New POST /walk handler: accepts { globs: string[] }, walks watch roots with
glob intersection, returns { paths, matchedCount, scannedRoots }
Route registered in api/index.ts
New watcher_walk OpenClaw tool in watcherTools.ts
Tests: walk handler (4 tests), plugin tool registration + execution
Fix 21:
onRulesChanged now extracts match globs from virtual rules
(match.properties.file.properties.path.glob) and fires executeReindex
with scope 'rules' and extracted globs array (fire-and-forget)
Skips reindex when no rules have match globs
Tests: 3 integration tests via Fastify inject
Docs:
SKILL.md: added watcher_walk docs, updated API reference table
(POST /walk, renamed endpoints from Phase 8), renamed watcher_query
references to watcher_config, noted auto-reindex on rule registration
Quality gates: 492 service tests, 28 plugin tests, zero lint/typecheck/knip errors.
[FIX-17] [FIX-19] fix: rename CLI config-reindex to reindex, fix stale doc refs, clean watch.ignored
[FIX-17] [FIX-19] fix: consolidate CLI reindex commands, fix scope validation, update dev plan
[FIX-17] [REFACTOR] DRY/SOLID pass: extract helpers, consolidate walk functions, separate onRulesChanged
[FIX-17] [TEST] Add missing test coverage: fileScan walk functions, extractMatchGlobs, rules+path reindex, createIsGitignored
[FIX-17] [DOCS] Resolve all docs warnings and root-level knip issues
[FIX-17] chore: remove changelogs (generated at build time)
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.10.0
[0.9.9] - 2026-03-14
๐ผ Other
[114] fix: add nocase to fileScan picomatch calls (#114)
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.9.8
Release @karmaniverous/jeeves-watcher v0.9.9
[0.9.7] - 2026-03-12
๐ผ Other
[107] fix: remove HTML escaping from renderDoc markdown output
renderValueAsMarkdown was passing string values through
hbs.Utils.escapeExpression(), which HTML-encodes backticks, angle
brackets, quotes, and ampersands. Since renderDoc produces markdown
(not HTML), this corrupted fenced code blocks, PlantUML diagrams,
and any content containing special characters.
The fix returns string values as-is and defers HTML escaping to the
downstream markdown-to-HTML renderer (jeeves-server's marked pipeline).
Fixes #107
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.9.7
[0.9.6] - 2026-03-12
๐ Features
Support glob/negation patterns in render.frontmatter
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.9.6
[0.9.5] - 2026-03-10
๐ Features
Add concurrent file processing for reindex using radash parallel
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.9.5
[0.9.4] - 2026-03-09
โก Performance
(service) Use node:https with keep-alive agent for Gemini API
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.9.4
[0.9.3] - 2026-03-09
โก Performance
(service) Replace LangChain Gemini wrapper with direct API calls
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.9.3
[0.9.2] - 2026-03-09
๐ Bug Fixes
(service) Skip live value aggregation for non-enumerated facet uiHint types
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.9.2
[0.9.0] - 2026-03-08
โ๏ธ Miscellaneous Tasks
Release @karmaniverous/jeeves-watcher v0.9.0
[0.9.0-0] - 2026-03-08
๐ Features
(service) Add POST /scan handler with cursor-based pagination
๐ Bug Fixes
(service) Clean up scan handler and test lint issues