Replace better-sqlite3 with pg Pool for all operational data (chats,
messages, tasks, sessions, router_state, registered_groups). New
OPS_DB_URL config drives a dedicated ops database alongside the
existing memory and skills databases.
All db.ts functions are now async. Callers in src/, setup/, and tests
updated accordingly. Tests use a mock pool (src/test-helpers.ts) so
they run without a live Postgres connection.
---
Build: pass | Tests: not run (Linux)
Rewrote embed-builtin-knowledge.py to dynamically discover all project
docs, internal docs, identity files, and skill definitions instead of
using a hardcoded 6-chunk array. Artifact now covers full corpus via
OpenRouter BAAI/bge-m3 at 1024 dimensions.
Also fixed stale config.ts defaults: EMBED_MODEL from nomic-embed to
BAAI/bge-m3, EMBED_DIMENSIONS from 768 to 1024 (matching the pgvector
schema's vector(1024) column).
Tested: imported into live clawdie_skills DB, FTS search confirmed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---
Build: pass | Tests: pass — Tests 603 passed (603)
- Evidence script and checklist looked in logs/preflight-* but preflight
writes to tmp/preflight/ — fixed both to match actual output path
- Checklist referenced npm run preflight (missing) — corrected to
preflight-check
- preflight.ts screenshot capture had hardcoded 'clawdie' session —
now uses AGENT_NAME
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---
Build: pass | Tests: pass — Tests 605 passed (605)
Runs preflight + tsc + screenshot inside a bhyve guest and emits a
single JSON bundle for another agent to verify.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---
Build: pass | Tests: pass — Tests 605 passed (605)
- Add embed-builtin-knowledge.py script for OpenRouter bge-m3 embeddings
- Update artifact.sql with pre-generated 1024-dim embeddings for 6 chunks
- Update metadata: openrouter/baai/bge-m3, embedding_count=6, search_mode=hybrid
- Change locale from en-US to sl-SI per project language setting
Author: Clawdie AI <hello@clawdie.si>
Co-Authored-By: Samo Blatnik, Zed.ai
- Replace hardcoded "klavdija" tmux session names with $AGENT_NAME in
glass.sh and run-klavdija.sh
- Replace hardcoded 192.168.100.x fallbacks with 10.0.1.x throughout
scripts/memory/ and heartbeat.sh defaults
- Fix heartbeat PGPASSWORD: use inline `VAR=val cmd` form so psql
actually receives the password in the subshell
- Fix heartbeat curl hangs: add --max-time to all curl calls
- Add run-klavdija.sh and src/transcription.ts (previously untracked)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---
Build: pass | Tests: pass — Tests 431 passed (431)
- Remove 7 redundant .env vars: DB_NAME, DB_USER, DB_HOST, DB_PORT,
MEMORY_DB_NAME, MEMORY_DB_USER, MEMORY_DB_URL — all now derived from
AGENT_NAME by config.ts and common.sh
- Fix DB_HOST in common.sh pointing to .2 (controlplane) instead of .3 (db)
- common.sh: normalise AGENT_NAME → Postgres identifier, same algorithm
as db-identifiers.ts; embed config now reads from .env instead of
overriding with stale OpenRouter values
- embed.sh: drop OPENROUTER_API_KEY requirement; use EMBED_BASE_URL +
EMBED_API_KEY (empty = local llama-server, no auth needed)
- memory-hydrate-pg.sh, memory-lifecycle.ts: replace ai_brain/clawdie_brain
literals with live DB_NAME / MEMORY_DB_NAME values
Bump to 0.9.1.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---
Build: pass | Tests: pass — Tests 431 passed (431)
docs-compile.sh:
- Add --language LANG parameter for per-language compilation
- Support language-specific source directories (docs/sl/, docs/en/, etc.)
- Create language subdirectories in output (docs-v0.8.2_24.mar.2026/sl/)
- Default behavior unchanged (compile docs/ root if no --language specified)
docs-sync.cron.sh:
- Add LANGUAGES="sl,en,de,fr,es" configuration (Slovenian primary)
- Loop through each language, call docs-compile.sh per language
- Compile all languages to version-dated language subdirectories
INTEGRATION.md (docs-deployment skill):
- Update examples to show Slovenian as primary language
- Document language configuration format
- Show per-language compilation workflow
- Update Crowdin sync diagrams (sl first, then others)
Rationale:
- Slovenian is prototype default locale/timezone (sl-SI/Europe/Ljubljana)
- Documentation language hierarchy should match system language default
- Crowdin will manage translations (sl as source, others as translations)
- Zero-downtime deployment now supports multiple language versions
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
---
Build: pass | Tests: FAIL — Tests 2 failed | 487 passed | 10 skipped (499)
Add comprehensive docs-deployment skill for host-level multi-language documentation:
SKILL.md:
- Complete skill definition and guide (600+ lines)
- Architecture overview and deployment flow
- Multi-language support (en, de, fr, es)
- Crowdin integration workflow
- Troubleshooting guide
- Quick reference for common tasks
- Performance metrics and capacity planning
Templates:
- nginx-vhost-template.conf: Production-ready multi-language routing
* Language-specific locations (/en/, /de/, /fr/, /es/)
* Zero-downtime symlink swaps
* SSL/TLS configuration
* Security headers and caching
- language-selector.html: Beautiful language picker UI
* Mobile-responsive design
* Supports 4 languages
* Links to Crowdin translation project
Date Format Fix (User-Facing):
- Change from YYYYMMDD (20260324) to DD.mon.YYYY (24.mar.2026)
- docs-compile.sh: Update date generation and validation
- docs-sync.cron.sh: Update to match compile.sh format
- All version directories now human-readable: docs-v0.9.0_24.mar.2026
This format is:
- User-friendly (appears in directory names, documentation)
- Consistent with Slovenian date preferences
- Easily sortable (day.month.year order)
- Clear in translated documentation
Skill enables operators and authors to:
- Understand the complete documentation deployment system
- Set up Crowdin projects from scratch
- Troubleshoot common issues
- Monitor deployment health
- Perform rollbacks and manual syncs
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
---
Build: pass | Tests: FAIL — Tests 2 failed | 487 passed | 10 skipped (499)
Implement Privacy-First Documentation strategy:
- Pre-commit hook scans staged files for credentials, IPs, usernames, domains
- Blocks commits containing: samob, smilepowered, 192.168.x.x, 10.x.x.x, password=, secret=, api_key=, token=, etc.
- Auto-generates .git/hooks/sensitive-patterns.txt and sensitive-allowlist.txt on first run
- Users can add false positives to allowlist without removing legitimate content
- Documented in scripts/hooks/SECURITY.md with customization and audit instructions
- Updated CONTRIBUTING.md with setup and troubleshooting steps
Enforcement: All contributors now have automatic sensitive data detection before push.
Benefits: Docs become safe to share publicly, prevents credential leaks, enables Privacy-First approach.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
---
Build: pass | Tests: pass — Tests 489 passed | 10 skipped (499)
Three scripts in scripts/memory/:
- common.sh: shared config, DB connection, dependency checks
- embed.sh: generate 1536d embeddings via OpenRouter API
- chunk.sh: split text on sentence boundaries (~500 chars)
- memory-pg.sh: full CLI for store/search/recent/important/count
Store pipeline: text → chunk → embed → insert (fully automated).
Search: hybrid RRF combining full-text and vector similarity.
All scripts use #!/usr/bin/env bash for FreeBSD compatibility.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(db): remove unique constraint on folder to support multi-channel agents
* ci: implement automated skill drift detection and self-healing PRs
* fix: align registration logic with Gavriel's feedback and fix build/test issues from Daniel Mi
* style: conform to prettier standards for CI validation
* test: fix branch naming inconsistency in CI (master vs main)
* fix(ci): robust module resolution by removing file extensions in scripts
* refactor(ci): simplify skill validation by removing redundant combination tests
* style: conform skills-engine to prettier, unify logging in index.ts and cleanup unused imports
* refactor: extract multi-channel DB changes to separate branch
Move channel column, folder suffix logic, and related migrations
to feat/multi-channel-db-v2 for independent review. This PR now
contains only CI/CD optimizations, Prettier formatting, and
logging improvements.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Interactive skill that guides Claude through fetching upstream NanoClaw,
previewing changes, merging with customizations, running migrations, and
verifying the result. Includes:
- SKILL.md with 9-step update flow
- fetch-upstream.sh: detects remote, fetches, extracts tracked paths
- run-migrations.ts: discovers and runs version-ordered migrations
- post-update.ts: clears backup after conflict resolution
- update-core.ts: adds --json and --preview-only flags
- BASE_INCLUDES moved to constants.ts as single source of truth
- 16 new tests covering fetch, migrations, and CLI flags
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: multi-channel infrastructure with explicit channel/is_group tracking
- Add channels[] array and findChannel() routing in index.ts, replacing
hardcoded whatsapp.* calls with channel-agnostic callbacks
- Add channel TEXT and is_group INTEGER columns to chats table with
COALESCE upsert to protect existing values from null overwrites
- is_group defaults to 0 (safe: unknown chats excluded from groups)
- WhatsApp passes explicit channel='whatsapp' and isGroup to onChatMetadata
- getAvailableGroups filters on is_group instead of JID pattern matching
- findChannel logs warnings instead of silently dropping unroutable JIDs
- Migration backfills channel/is_group from JID patterns for existing DBs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: skills engine v0.1 — deterministic skill packages with rerere resolution
Three-way merge engine for applying skill packages on top of a core
codebase. Skills declare which files they add/modify, and the engine
uses git merge-file for conflict detection with git rerere for
automatic resolution of previously-seen conflicts.
Key components:
- apply: three-way merge with backup/rollback safety net
- replay: clean-slate replay for uninstall and rebase
- update: core version updates with deletion detection
- rebase: bake applied skills into base (one-way)
- manifest: validation with path traversal protection
- resolution-cache: pre-computed rerere resolutions
- structured: npm deps, env vars, docker-compose merging
- CI: per-skill test matrix with conflict detection
151 unit tests covering merge, rerere, backup, replay, uninstall,
update, rebase, structured ops, and edge cases.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add Discord and Telegram skill packages
Skill packages for adding Discord and Telegram channels to NanoClaw.
Each package includes:
- Channel implementation (add/src/channels/)
- Three-way merge targets for index.ts, config.ts, routing.test.ts
- Intent docs explaining merge invariants
- Standalone integration tests
- manifest.yaml with dependency/conflict declarations
Applied via: npx tsx scripts/apply-skill.ts .claude/skills/add-discord
These are inert until applied — no runtime impact.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* remove unused docs (skills-system-status, implementation-guide)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>