diff --git a/VERSION b/VERSION index 2094a100c..af2dabf3f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.24.0 +0.25.1 diff --git a/openclaw.plugin.json b/openclaw.plugin.json index 29dae0ef1..09104bdd2 100644 --- a/openclaw.plugin.json +++ b/openclaw.plugin.json @@ -1,6 +1,6 @@ { "name": "gbrain", - "version": "0.19.0", + "version": "0.25.1", "description": "Personal knowledge brain with Postgres + pgvector hybrid search", "family": "bundle-plugin", "configSchema": { @@ -24,9 +24,15 @@ } }, "skills": [ + "skills/academic-verify", + "skills/archive-crawler", + "skills/article-enrichment", + "skills/book-mirror", "skills/brain-ops", + "skills/brain-pdf", "skills/briefing", "skills/citation-fixer", + "skills/concept-synthesis", "skills/cross-modal-review", "skills/cron-scheduler", "skills/daily-task-manager", @@ -39,6 +45,7 @@ "skills/media-ingest", "skills/meeting-ingestion", "skills/minion-orchestrator", + "skills/perplexity-research", "skills/query", "skills/reports", "skills/repo-architecture", @@ -47,7 +54,9 @@ "skills/skillify", "skills/skillpack-check", "skills/soul-audit", + "skills/strategic-reading", "skills/testing", + "skills/voice-note-ingest", "skills/webhook-transforms" ], "shared_deps": [ diff --git a/package.json b/package.json index b9faf7272..c2b90866b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gbrain", - "version": "0.24.0", + "version": "0.25.1", "description": "Postgres-native personal knowledge brain with hybrid RAG search", "type": "module", "main": "src/core/index.ts", @@ -77,5 +77,8 @@ "trustedDependencies": [ "@electric-sql/pglite" ], + "engines": { + "bun": ">=1.3.10" + }, "license": "MIT" } diff --git a/scripts/check-privacy.sh b/scripts/check-privacy.sh index 0fb2ea081..e0092429a 100755 --- a/scripts/check-privacy.sh +++ b/scripts/check-privacy.sh @@ -26,6 +26,14 @@ set -euo pipefail BANNED_NAME='wintermute' +# v0.25.1 (codex T7): additional patterns from wintermute-specific filesystem +# layouts that would leak private fork context if they slipped through a port. +# `wintermute_only` already matches via the case-insensitive `wintermute` regex +# above; this list is for orthogonal patterns. +BANNED_PATHS=( + '/data/brain/' + '/data/.openclaw/' +) usage() { cat <&2 FOUND=1 fi + # Banned wintermute-specific filesystem paths (codex T7). + for path in "${BANNED_PATHS[@]}"; do + if grep -nF "$path" "$file" >/dev/null 2>&1; then + echo "[check-privacy] BANNED PATH '$path' in $file:" >&2 + grep -nF "$path" "$file" | sed 's|^| |' >&2 + FOUND=1 + fi + done ;; esac done <<< "$FILES" diff --git a/skills/RESOLVER.md b/skills/RESOLVER.md index 40386a626..40cf3b0bd 100644 --- a/skills/RESOLVER.md +++ b/skills/RESOLVER.md @@ -103,3 +103,25 @@ These apply to ALL brain-writing skills: - `skills/conventions/subagent-routing.md` — when to use Minions vs inline work - `skills/_brain-filing-rules.md` — where files go - `skills/_output-rules.md` — output quality standards + +## Uncategorized + +| Trigger | Skill | +|---------|-------| +| "personalized version of this book" | `skills/book-mirror/SKILL.md` | + +| "enrich this article" | `skills/article-enrichment/SKILL.md` | + +| "strategic reading" | `skills/strategic-reading/SKILL.md` | + +| "concept synthesis" | `skills/concept-synthesis/SKILL.md` | + +| "perplexity research" | `skills/perplexity-research/SKILL.md` | + +| "crawl my archive" | `skills/archive-crawler/SKILL.md` | + +| "verify this academic claim" | `skills/academic-verify/SKILL.md` | + +| "make pdf from brain" | `skills/brain-pdf/SKILL.md` | + +| "voice note" | `skills/voice-note-ingest/SKILL.md` | diff --git a/skills/_brain-filing-rules.json b/skills/_brain-filing-rules.json index 3ea8ce962..867f16984 100644 --- a/skills/_brain-filing-rules.json +++ b/skills/_brain-filing-rules.json @@ -86,6 +86,18 @@ "directory": "openclaw/", "examples": ["agent-state notes"], "description": "Notes about the host OpenClaw agent itself, not the underlying entities." + }, + { + "kind": "synthesis-output", + "directory": "media/books/", + "examples": ["personalized book mirrors", "two-column chapter analyses"], + "description": "Sanctioned exception to 'file by primary subject' for sui generis synthesized output that is one-of-one to a single book and a specific reader. Format-prefixed under media// is allowed for synthesis output only, never for raw ingest. See _brain-filing-rules.md." + }, + { + "kind": "synthesis-output", + "directory": "media/articles/", + "examples": ["personalized article reads", "long-form content tailored to reader"], + "description": "Same sanctioned exception as media/books/. One-of-one synthesis output of an article personalized for the reader. Distinct from raw article ingest, which goes to the article's primary-subject directory." } ], "sources_dir": { diff --git a/skills/_brain-filing-rules.md b/skills/_brain-filing-rules.md index c1b3871df..ff857e082 100644 --- a/skills/_brain-filing-rules.md +++ b/skills/_brain-filing-rules.md @@ -23,6 +23,24 @@ not the source, not the skill that's running. | Reusable framework/thesis -> `sources/` | -> `concepts/` | It's a mental model | | Tweet thread about policy -> `media/` | -> `civic/` or `concepts/` | media/ is for content ops | +## Sanctioned exception: synthesis output is sui generis + +The "file by primary subject" rule is for raw ingest. Synthesized output that +is one-of-one to a single source AND a specific reader (a personalized book +mirror, a strategic-reading playbook tied to one problem) does not fit any +subject directory cleanly: filing by topic loses the "this is the book" +dimension; filing by author muddles authorship pages with synthesis pages. + +Format-prefixed paths under `media//` are the sanctioned +exception: + +- `media/books/-personalized.md` (book-mirror output) +- `media/articles/-personalized.md` (long-form article personalization) + +If you find yourself wanting `media//` for raw ingest, that is still +the anti-pattern in the table above. The exception is narrow: synthesized, +one-of-one, sui generis to a single source. + ## What `sources/` Is Actually For `sources/` is ONLY for: diff --git a/skills/academic-verify/SKILL.md b/skills/academic-verify/SKILL.md new file mode 100644 index 000000000..220fab415 --- /dev/null +++ b/skills/academic-verify/SKILL.md @@ -0,0 +1,28 @@ +--- +name: academic-verify +version: 0.1.0 +description: Verify academic citations and research claims against current literature; routes through perplexity-research for the actual web search and formats results as a citation-checked brain page. +triggers: + - "verify this academic claim" + - "check this study" + - "academic verify" + - "validate citation" + - "is this study real" +mutating: true +writes_pages: true +writes_to: + - concepts/ +--- + +# academic-verify + +Verify academic citations and research claims against current literature; routes through perplexity-research for the actual web search and formats results as a citation-checked brain page. + +## The rule + + +Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill. + +## How to use + +Run the deterministic script: `bun scripts/academic-verify.mjs` (or whatever your harness prefix is). diff --git a/skills/academic-verify/routing-eval.jsonl b/skills/academic-verify/routing-eval.jsonl new file mode 100644 index 000000000..5d128190f --- /dev/null +++ b/skills/academic-verify/routing-eval.jsonl @@ -0,0 +1,4 @@ +// Routing eval fixtures for skills/academic-verify. +{"intent":"please verify this academic claim for me now","expected_skill":"academic-verify"} +{"intent":"please check this study for me now","expected_skill":"academic-verify"} +{"intent":"please academic verify for me now","expected_skill":"academic-verify"} diff --git a/skills/archive-crawler/SKILL.md b/skills/archive-crawler/SKILL.md new file mode 100644 index 000000000..bcf0d2f60 --- /dev/null +++ b/skills/archive-crawler/SKILL.md @@ -0,0 +1,30 @@ +--- +name: archive-crawler +version: 0.1.0 +description: Universal archivist for personal file archives (Dropbox/B2/email exports). Filters for high-value content within an explicit gbrain.yml allow-list scan_paths gate. +triggers: + - "crawl my archive" + - "find gold in my archive" + - "archive crawler" + - "scan my dropbox for" + - "mine my old files for" +mutating: true +writes_pages: true +writes_to: + - originals/ + - personal/ + - ideas/ +--- + +# archive-crawler + +Universal archivist for personal file archives (Dropbox/B2/email exports). Filters for high-value content within an explicit gbrain.yml allow-list scan_paths gate. + +## The rule + + +Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill. + +## How to use + +Run the deterministic script: `bun scripts/archive-crawler.mjs` (or whatever your harness prefix is). diff --git a/skills/archive-crawler/routing-eval.jsonl b/skills/archive-crawler/routing-eval.jsonl new file mode 100644 index 000000000..9c9dc66f6 --- /dev/null +++ b/skills/archive-crawler/routing-eval.jsonl @@ -0,0 +1,4 @@ +// Routing eval fixtures for skills/archive-crawler. +{"intent":"please crawl my archive for me now","expected_skill":"archive-crawler"} +{"intent":"please find gold in my archive for me now","expected_skill":"archive-crawler"} +{"intent":"please archive crawler for me now","expected_skill":"archive-crawler"} diff --git a/skills/article-enrichment/SKILL.md b/skills/article-enrichment/SKILL.md new file mode 100644 index 000000000..f60b95bbf --- /dev/null +++ b/skills/article-enrichment/SKILL.md @@ -0,0 +1,27 @@ +--- +name: article-enrichment +version: 0.1.0 +description: Transform raw article text dumps in the brain into structured pages with executive summaries, verbatim quotes, key insights, why-it-matters, and cross-references. +triggers: + - "enrich this article" + - "enrich brain pages" + - "batch enrich" + - "make brain pages useful" +mutating: true +writes_pages: true +writes_to: + - media/articles/ +--- + +# article-enrichment + +Transform raw article text dumps in the brain into structured pages with executive summaries, verbatim quotes, key insights, why-it-matters, and cross-references. + +## The rule + + +Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill. + +## How to use + +Run the deterministic script: `bun scripts/article-enrichment.mjs` (or whatever your harness prefix is). diff --git a/skills/article-enrichment/routing-eval.jsonl b/skills/article-enrichment/routing-eval.jsonl new file mode 100644 index 000000000..57eed3f41 --- /dev/null +++ b/skills/article-enrichment/routing-eval.jsonl @@ -0,0 +1,4 @@ +// Routing eval fixtures for skills/article-enrichment. +{"intent":"please enrich this article for me now","expected_skill":"article-enrichment"} +{"intent":"please enrich brain pages for me now","expected_skill":"article-enrichment"} +{"intent":"please batch enrich for me now","expected_skill":"article-enrichment"} diff --git a/skills/book-mirror/SKILL.md b/skills/book-mirror/SKILL.md new file mode 100644 index 000000000..707c892f5 --- /dev/null +++ b/skills/book-mirror/SKILL.md @@ -0,0 +1,28 @@ +--- +name: book-mirror +version: 0.1.0 +description: Take any book (EPUB/PDF), produce a personalized chapter-by-chapter analysis with two-column tables: left = chapter summary, right = how it applies to you based on brain context. Output: brain page + PDF. +triggers: + - "personalized version of this book" + - "mirror this book" + - "two-column book analysis" + - "apply this book to my life" + - "how does this book apply to me" +mutating: true +writes_pages: true +writes_to: + - media/books/ +--- + +# book-mirror + +Take any book (EPUB/PDF), produce a personalized chapter-by-chapter analysis with two-column tables: left = chapter summary, right = how it applies to you based on brain context. Output: brain page + PDF. + +## The rule + + +Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill. + +## How to use + +Run the deterministic script: `bun scripts/book-mirror.mjs` (or whatever your harness prefix is). diff --git a/skills/book-mirror/routing-eval.jsonl b/skills/book-mirror/routing-eval.jsonl new file mode 100644 index 000000000..026cdeb98 --- /dev/null +++ b/skills/book-mirror/routing-eval.jsonl @@ -0,0 +1,4 @@ +// Routing eval fixtures for skills/book-mirror. +{"intent":"please personalized version of this book for me now","expected_skill":"book-mirror"} +{"intent":"please mirror this book for me now","expected_skill":"book-mirror"} +{"intent":"please two-column book analysis for me now","expected_skill":"book-mirror"} diff --git a/skills/brain-pdf/SKILL.md b/skills/brain-pdf/SKILL.md new file mode 100644 index 000000000..0159ac173 --- /dev/null +++ b/skills/brain-pdf/SKILL.md @@ -0,0 +1,24 @@ +--- +name: brain-pdf +version: 0.1.0 +description: Generate a publication-quality PDF from any brain page via the gstack make-pdf binary; strips frontmatter, sanitizes emoji, applies running headers. +triggers: + - "make pdf from brain" + - "brain pdf" + - "convert brain page to pdf" + - "publish this page as pdf" + - "export brain page" +--- + +# brain-pdf + +Generate a publication-quality PDF from any brain page via the gstack make-pdf binary; strips frontmatter, sanitizes emoji, applies running headers. + +## The rule + + +Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill. + +## How to use + +Run the deterministic script: `bun scripts/brain-pdf.mjs` (or whatever your harness prefix is). diff --git a/skills/brain-pdf/routing-eval.jsonl b/skills/brain-pdf/routing-eval.jsonl new file mode 100644 index 000000000..04b0b0965 --- /dev/null +++ b/skills/brain-pdf/routing-eval.jsonl @@ -0,0 +1,4 @@ +// Routing eval fixtures for skills/brain-pdf. +{"intent":"please make pdf from brain for me now","expected_skill":"brain-pdf"} +{"intent":"please brain pdf for me now","expected_skill":"brain-pdf"} +{"intent":"please convert brain page to pdf for me now","expected_skill":"brain-pdf"} diff --git a/skills/concept-synthesis/SKILL.md b/skills/concept-synthesis/SKILL.md new file mode 100644 index 000000000..cc52fceaa --- /dev/null +++ b/skills/concept-synthesis/SKILL.md @@ -0,0 +1,28 @@ +--- +name: concept-synthesis +version: 0.1.0 +description: Deduplicate and synthesize raw concept stubs into a tiered intellectual map (T1 Canon to T4 Riff), tracing idea evolution across sources over time. +triggers: + - "concept synthesis" + - "synthesize my concepts" + - "find patterns across my notes" + - "build my intellectual map" + - "trace idea evolution" +mutating: true +writes_pages: true +writes_to: + - concepts/ +--- + +# concept-synthesis + +Deduplicate and synthesize raw concept stubs into a tiered intellectual map (T1 Canon to T4 Riff), tracing idea evolution across sources over time. + +## The rule + + +Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill. + +## How to use + +Run the deterministic script: `bun scripts/concept-synthesis.mjs` (or whatever your harness prefix is). diff --git a/skills/concept-synthesis/routing-eval.jsonl b/skills/concept-synthesis/routing-eval.jsonl new file mode 100644 index 000000000..8adf268df --- /dev/null +++ b/skills/concept-synthesis/routing-eval.jsonl @@ -0,0 +1,4 @@ +// Routing eval fixtures for skills/concept-synthesis. +{"intent":"please concept synthesis for me now","expected_skill":"concept-synthesis"} +{"intent":"please synthesize my concepts for me now","expected_skill":"concept-synthesis"} +{"intent":"please find patterns across my notes for me now","expected_skill":"concept-synthesis"} diff --git a/skills/manifest.json b/skills/manifest.json index 050c483c0..639d4884c 100644 --- a/skills/manifest.json +++ b/skills/manifest.json @@ -1,6 +1,6 @@ { "name": "gbrain", - "version": "0.10.0", + "version": "0.25.1", "conformance_version": "1.0.0", "description": "Personal knowledge brain with hybrid RAG search \u2014 GStack mod for agent platforms", "skills": [ @@ -153,6 +153,51 @@ "name": "smoke-test", "path": "smoke-test/SKILL.md", "description": "Post-restart smoke tests + auto-fix for gbrain and OpenClaw environments" + }, + { + "name": "book-mirror", + "path": "book-mirror/SKILL.md", + "description": "Take any book (EPUB/PDF), produce a personalized chapter-by-chapter analysis with two-column tables: left = chapter summary, right = how it applies to you based on brain context. Output: brain page + PDF." + }, + { + "name": "article-enrichment", + "path": "article-enrichment/SKILL.md", + "description": "Transform raw article text dumps in the brain into structured pages with executive summaries, verbatim quotes, key insights, why-it-matters, and cross-references." + }, + { + "name": "strategic-reading", + "path": "strategic-reading/SKILL.md", + "description": "Read a book/article/case study through the lens of a specific strategic problem; produce an applied playbook (do/avoid/watch for) with short/medium/long-term recommendations." + }, + { + "name": "concept-synthesis", + "path": "concept-synthesis/SKILL.md", + "description": "Deduplicate and synthesize raw concept stubs into a tiered intellectual map (T1 Canon to T4 Riff), tracing idea evolution across sources over time." + }, + { + "name": "perplexity-research", + "path": "perplexity-research/SKILL.md", + "description": "Brain-augmented web research via Perplexity plus Opus; surfaces what is NEW vs already-known about a topic by cross-referencing against the brain first." + }, + { + "name": "archive-crawler", + "path": "archive-crawler/SKILL.md", + "description": "Universal archivist for personal file archives (Dropbox/B2/email exports). Filters for high-value content within an explicit gbrain.yml allow-list scan_paths gate." + }, + { + "name": "academic-verify", + "path": "academic-verify/SKILL.md", + "description": "Verify academic citations and research claims against current literature; routes through perplexity-research for the actual web search and formats results as a citation-checked brain page." + }, + { + "name": "brain-pdf", + "path": "brain-pdf/SKILL.md", + "description": "Generate a publication-quality PDF from any brain page via the gstack make-pdf binary; strips frontmatter, sanitizes emoji, applies running headers." + }, + { + "name": "voice-note-ingest", + "path": "voice-note-ingest/SKILL.md", + "description": "Ingest voice notes with exact-phrasing preservation (never paraphrased); routes content based on a decision tree across originals/concepts/people/companies/ideas/personal/voice-notes." } ], "dependencies": { diff --git a/skills/media-ingest/SKILL.md b/skills/media-ingest/SKILL.md index a82e7bed6..75bf3b2cf 100644 --- a/skills/media-ingest/SKILL.md +++ b/skills/media-ingest/SKILL.md @@ -113,6 +113,6 @@ Brain page created with summary, highlights, and entity cross-links. Report to u - Dumping raw transcripts without analysis - Skipping entity extraction ("I'll do that separately") -- Filing by format (all videos in `media/videos/`) instead of by subject +- Filing **raw ingest** by format (all videos in `media/videos/`) instead of by subject. Note: format-prefixed paths under `media//` ARE sanctioned for **synthesized one-of-one output** like book-mirror's `media/books/-personalized.md`. The anti-pattern is for raw ingest, not for sui generis synthesis. See `skills/_brain-filing-rules.md` "Sanctioned exception: synthesis output is sui generis." - Not preserving raw source files - Creating stub pages without meaningful content diff --git a/skills/perplexity-research/SKILL.md b/skills/perplexity-research/SKILL.md new file mode 100644 index 000000000..8fc5c4d11 --- /dev/null +++ b/skills/perplexity-research/SKILL.md @@ -0,0 +1,28 @@ +--- +name: perplexity-research +version: 0.1.0 +description: Brain-augmented web research via Perplexity plus Opus; surfaces what is NEW vs already-known about a topic by cross-referencing against the brain first. +triggers: + - "perplexity research" + - "what's new about" + - "current state of" + - "web research" + - "what changed about" +mutating: true +writes_pages: true +writes_to: + - research/ +--- + +# perplexity-research + +Brain-augmented web research via Perplexity plus Opus; surfaces what is NEW vs already-known about a topic by cross-referencing against the brain first. + +## The rule + + +Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill. + +## How to use + +Run the deterministic script: `bun scripts/perplexity-research.mjs` (or whatever your harness prefix is). diff --git a/skills/perplexity-research/routing-eval.jsonl b/skills/perplexity-research/routing-eval.jsonl new file mode 100644 index 000000000..8d1d63129 --- /dev/null +++ b/skills/perplexity-research/routing-eval.jsonl @@ -0,0 +1,4 @@ +// Routing eval fixtures for skills/perplexity-research. +{"intent":"please perplexity research for me now","expected_skill":"perplexity-research"} +{"intent":"please what's new about for me now","expected_skill":"perplexity-research"} +{"intent":"please current state of for me now","expected_skill":"perplexity-research"} diff --git a/skills/strategic-reading/SKILL.md b/skills/strategic-reading/SKILL.md new file mode 100644 index 000000000..41897867c --- /dev/null +++ b/skills/strategic-reading/SKILL.md @@ -0,0 +1,29 @@ +--- +name: strategic-reading +version: 0.1.0 +description: Read a book/article/case study through the lens of a specific strategic problem; produce an applied playbook (do/avoid/watch for) with short/medium/long-term recommendations. +triggers: + - "strategic reading" + - "read this through the lens of" + - "apply this to my problem" + - "what can I learn from this about" + - "extract a playbook from" +mutating: true +writes_pages: true +writes_to: + - concepts/ + - projects/ +--- + +# strategic-reading + +Read a book/article/case study through the lens of a specific strategic problem; produce an applied playbook (do/avoid/watch for) with short/medium/long-term recommendations. + +## The rule + + +Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill. + +## How to use + +Run the deterministic script: `bun scripts/strategic-reading.mjs` (or whatever your harness prefix is). diff --git a/skills/strategic-reading/routing-eval.jsonl b/skills/strategic-reading/routing-eval.jsonl new file mode 100644 index 000000000..d804e22da --- /dev/null +++ b/skills/strategic-reading/routing-eval.jsonl @@ -0,0 +1,4 @@ +// Routing eval fixtures for skills/strategic-reading. +{"intent":"please strategic reading for me now","expected_skill":"strategic-reading"} +{"intent":"please read this through the lens of for me now","expected_skill":"strategic-reading"} +{"intent":"please apply this to my problem for me now","expected_skill":"strategic-reading"} diff --git a/skills/voice-note-ingest/SKILL.md b/skills/voice-note-ingest/SKILL.md new file mode 100644 index 000000000..34b86f80c --- /dev/null +++ b/skills/voice-note-ingest/SKILL.md @@ -0,0 +1,34 @@ +--- +name: voice-note-ingest +version: 0.1.0 +description: Ingest voice notes with exact-phrasing preservation (never paraphrased); routes content to originals/concepts/people/companies/ideas/personal/voice-notes/ based on a decision tree. +triggers: + - "voice note" + - "ingest this voice memo" + - "transcribe and file" + - "voice note ingest" + - "save this audio note" +mutating: true +writes_pages: true +writes_to: + - voice-notes/ + - originals/ + - concepts/ + - people/ + - companies/ + - ideas/ + - personal/ +--- + +# voice-note-ingest + +Ingest voice notes with exact-phrasing preservation (never paraphrased); routes content to originals/concepts/people/companies/ideas/personal/voice-notes/ based on a decision tree. + +## The rule + + +Replace this stub with the hard rule that prevents recurrence of the failure that triggered this skill. + +## How to use + +Run the deterministic script: `bun scripts/voice-note-ingest.mjs` (or whatever your harness prefix is). diff --git a/skills/voice-note-ingest/routing-eval.jsonl b/skills/voice-note-ingest/routing-eval.jsonl new file mode 100644 index 000000000..9dae4ce0d --- /dev/null +++ b/skills/voice-note-ingest/routing-eval.jsonl @@ -0,0 +1,4 @@ +// Routing eval fixtures for skills/voice-note-ingest. +{"intent":"please voice note for me now","expected_skill":"voice-note-ingest"} +{"intent":"please ingest this voice memo for me now","expected_skill":"voice-note-ingest"} +{"intent":"please transcribe and file for me now","expected_skill":"voice-note-ingest"}