osborn 0.9.211 → 0.9.213

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: browser-apply
3
+ description: Interactively automate Workday and other multi-step JS-heavy job application forms using Playwright MCP browser tools, filling one page at a time with a screenshot and user confirmation before advancing. Use when applying to a Workday ATS or any staged online job application needing visible, confirmable progress.
4
+ ---
5
+
1
6
  # Skill: Browser Apply — Step-by-Step Workday Application
2
7
 
3
8
  Automate Workday job applications interactively, one step at a time. Each step takes a screenshot, confirms what's on screen, fills the current page, and waits before proceeding.
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: browser-screen-recorder
3
+ description: Drive any web app in a real browser and record proof — per-action screenshots, video clips, audio capture, DevTools diagnostics, and metrics, with mic synthesis and natural-language clicking. Use as the QA protocol after building or changing any frontend, for debugging web-reachable issues, verifying deployed changes, or reproducing user reports.
4
+ ---
5
+
1
6
  # Browser Screen Recorder — drive any web app (voice, hands + a brain) and record proof
2
7
 
3
8
  ## SKILL IDENTITY
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: deploy-workflow
3
+ description: The end-to-end release procedure for shipping osborn agent changes — build and verify locally, bump the package.json version, push to GitHub, publish to NPM from the Mac, and update the running Sprite from the registry. Use every time code or prompt changes are ready to ship.
4
+ ---
5
+
1
6
  # Deploy Workflow
2
7
 
3
8
  Use this every time changes are ready to ship.
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: ground-assumptions
3
+ description: Treat every load-bearing assumption as a hypothesis to verify against real evidence before recommending an implementation strategy, rather than trusting training-data intuition or "it should work". Use whenever the conversation enters a planning, design, or architecture phase, or before making any performance, behavioral, or comparative claim.
4
+ ---
5
+
1
6
  # Ground Assumptions
2
7
 
3
8
  ## SKILL IDENTITY
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: markdown-to-pdf
3
+ description: Export a Markdown document, spec, or research findings as a formatted PDF using md-to-pdf, pandoc, or markdown-pdf, saving the result to the session workspace. Use when the user wants to create or generate a PDF from a Markdown file.
4
+ ---
5
+
1
6
  # Skill: Markdown to PDF
2
7
 
3
8
  Export Markdown documents as formatted PDF files.
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: meetings
3
+ description: Silently take notes and track TODOs while osborn sits in a live meeting via a Recall.ai bot, and pull transcripts on demand, delegating file and transcript work to the writer sub-agent to avoid the tool-call budget. Use for auto-tagged [MEETING] transcript chunks or when the user asks to grab, summarize, or write notes/todos from a meeting.
4
+ ---
5
+
1
6
  # Skill: Meetings
2
7
 
3
8
  Silent note-taking and TODO-tracking when osborn is sitting in a live meeting,
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: pdf-to-markdown
3
+ description: Convert a PDF document to readable Markdown text using the built-in Read tool, pdf-parse-cli, or pdftotext, preserving headings and tables and saving the result to the session workspace. Use when the user provides a PDF file path and wants to read, search, or work with its contents.
4
+ ---
5
+
1
6
  # Skill: PDF to Markdown
2
7
 
3
8
  Convert PDF documents to readable Markdown text.
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: playwright-browser
3
+ description: Automate web browser interactions via the @playwright/cli — navigate pages, click buttons and links, fill and submit forms, take screenshots, and extract text or structured data using token-efficient element references. Use to interact with a URL, automate a multi-step web workflow, or test a UI flow.
4
+ ---
5
+
1
6
  # Skill: Playwright Browser Automation
2
7
 
3
8
  Automate web browser interactions — navigate pages, click buttons, fill forms, take screenshots, and extract content.
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: recall
3
+ description: Query this session's full untruncated history — every message, thinking block, and tool call stored in a per-session SQLite database with keyword and semantic search via the osborn-recall command. Use when you need an earlier decision, file, error, number, or name no longer in context, or to check prior work before acting as a grounded agent.
4
+ ---
5
+
6
+ # Recall
7
+
8
+ ## SKILL IDENTITY
9
+ Name: recall
10
+ Install path: ~/.claude/skills/recall/SKILL.md
11
+ Portable: yes — drops into any agent's skills dir (Claude Code, osborn on Fly, other Claude Agent SDK hosts)
12
+
13
+ ## WHEN THIS SKILL ACTIVATES
14
+ Whenever you need something from EARLIER in this session (or a prior session) that is
15
+ no longer in your context window. Specifically:
16
+
17
+ - The user refers to a past decision, file, error, number, or name you don't currently see
18
+ ("what did we decide about…", "that bug from earlier", "the token we used", "remind me why…").
19
+ - You are a GROUNDED agent (researcher, reviewer, editor, planner, tester) about to act, and you
20
+ must not contradict prior decisions or redo prior work — check the record FIRST.
21
+ - You suspect the answer was established before the last compaction.
22
+ - Anytime you would otherwise say "I don't have that in context" about this project's history.
23
+
24
+ Explicit triggers: "recall", "search the session", "what did we say about", "look back".
25
+
26
+ ## CORE PRINCIPLE
27
+ This session's FULL history — every user message, assistant reply, thinking block, and tool
28
+ call, untruncated — is stored in a per-session embedded database (`session.db`: SQLite +
29
+ FTS5 keyword index + sqlite-vec semantic vectors). You do NOT grep a flat summary file and
30
+ you do NOT rely only on what's in your context window. You query the store with a fixed
31
+ command and read the real prior messages.
32
+
33
+ Prefer recalling over guessing. If a fact was ever said in this project, it is retrievable.
34
+
35
+ ## HOW TO USE — the `osborn-recall` command
36
+
37
+ ```
38
+ osborn-recall "<query>" [--mode hybrid|keyword|vector] [--top-k 8]
39
+ [--session <id> --cwd <dir> | --db <path>]
40
+ [--max-chars 1200] [--type user,assistant,thinking,tool_use,tool_result]
41
+ [--json]
42
+ osborn-recall --list [--cwd <dir>] # list available session stores, newest first
43
+ ```
44
+
45
+ - **Default is `hybrid`** — fuses keyword (BM25) + semantic (vector) ranking with RRF. Use it
46
+ unless you have a reason not to. It finds both exact terms and paraphrases.
47
+ - **`--mode keyword`** — exact terms only; never loads the embedding model, so it's fastest.
48
+ Use for identifiers, error strings, tokens, file paths, function names.
49
+ - **`--mode vector`** — pure semantic; use when you remember the MEANING but not the words
50
+ ("how we backed up the machine" → finds Fly/rsync content with no shared keywords).
51
+ - **`--top-k`** — how many hits to return (default 8). Raise for a broad sweep, lower to focus.
52
+ - **Store resolution**: with no `--db`/`--session`, it picks the newest `session.db` under the
53
+ current project. Pass `--session <id> --cwd <dir>` to target a specific past session, or
54
+ `--db <path>` to point directly at a file. Use `--list` to see what's available.
55
+ - **`--type`** — filter to message kinds (comma-separated). E.g. `--type user` to see only what
56
+ the user actually asked; `--type tool_use,tool_result` to find a past command and its output.
57
+
58
+ ### Examples
59
+ ```
60
+ # What did we decide about the deploy order?
61
+ osborn-recall "deploy order npm publish git push railway fly" --top-k 5
62
+
63
+ # Find the exact Supabase token string we used (exact match, fast)
64
+ osborn-recall "SUPABASE_PERSONAL_ACCESS_TOKEN" --mode keyword
65
+
66
+ # Semantic: remember the meaning, not the words
67
+ osborn-recall "how did we recover the lost sessions" --mode vector
68
+
69
+ # Only the user's own asks about a topic
70
+ osborn-recall "marnmorgan authenticated onboarding" --type user
71
+
72
+ # Machine-readable for programmatic use
73
+ osborn-recall "sqlite-vec int8 rowid bug" --json
74
+ ```
75
+
76
+ ## WORKFLOW
77
+ 1. Turn the thing you're missing into a short query — include distinctive terms (names, error
78
+ text, identifiers) for keyword strength, but plain-language is fine (hybrid handles both).
79
+ 2. Run `osborn-recall "<query>"`. Read the returned hits — each is a REAL prior message with its
80
+ source line, message type, model, and timestamp.
81
+ 3. If nothing relevant: broaden the query, raise `--top-k`, or switch `--mode` (keyword↔vector).
82
+ If still empty, `--list` to confirm a store exists; the flat `search-index.txt` is the legacy
83
+ fallback but the store is authoritative and untruncated.
84
+ 4. Ground your next action in what you found. Cite the source line when it matters
85
+ ("per L214, we settled on X").
86
+
87
+ ## NOTES
88
+ - The store is written incrementally each turn, so recent messages are usually present within a
89
+ turn or two. Very-latest exchanges may lag by one turn — that's fine, they're still in context.
90
+ - Keyword mode never downloads the embedding model; hybrid/vector load MiniLM once (~12s cold,
91
+ cached after). If the embedder is unavailable, recall silently falls back to keyword-only.
92
+ - This skill is READ-only recall. It never writes; the pipeline owns the write path.
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: send-media
3
+ description: Upload a local file to the osborn public upload endpoint (Supabase storage) to get a permanent public URL, then render it inline in your next reply as a markdown image or link. Use whenever you have a local screenshot, image, PDF, clip, or log the user should see rather than have described.
4
+ ---
5
+
1
6
  # send-media — deliver screenshots, images, and files to the user INLINE in chat
2
7
 
3
8
  > 📅 Last updated: 2026-08-09. Use whenever you have a local file the user should SEE
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: shadcn
3
+ description: Add and configure shadcn/ui components — the copy-paste library built on Radix UI and Tailwind CSS — in a Next.js or React project via the shadcn CLI, including first-time init and adding single or multiple components. Use when the user wants to add UI components like buttons, dialogs, cards, forms, or tables.
4
+ ---
5
+
1
6
  # Skill: shadcn/ui Components
2
7
 
3
8
  Add and configure shadcn/ui components in a Next.js or React project.
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: slack-readonly
3
+ description: Search and read Slack messages, threads, and channels from the shell via read-only GET calls to the Slack Web API using a SLACK_TOKEN, with no posting, reactions, or edits by design. Use when asked to find, read, or summarize Slack content; refuse any request to send or write.
4
+ ---
5
+
1
6
  # Slack (read-only) — search and read Slack from the shell
2
7
 
3
8
  > 📅 **Last updated: 2026-08-09.** Recreated from scratch after the Mac data-loss events wiped the
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: voice-native-sync
3
+ description: Sync osborn sessions between the local Mac and cloud machines, starting with a mandatory served-version check that self-updates and aborts on a stale local copy to prevent unresumable-session corruption. Use when uploading or downloading sessions for the voice-native osborn setup.
4
+ ---
5
+
1
6
  # Voice Native Sync Skill
2
7
 
3
8
  ## SKILL IDENTITY
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: youtube-transcript
3
+ description: Fetch a YouTube video's auto-generated English subtitles with yt-dlp, strip the SRT timing markers to clean transcript text, and save it to the session workspace. Use when the user asks to get a transcript, subtitles, captions, or summary from a YouTube video URL.
4
+ ---
5
+
1
6
  # Skill: YouTube Transcript
2
7
 
3
8
  Fetch and save transcripts from YouTube videos.
package/bin/recall.js ADDED
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+
3
+ // osborn-recall — thin shim. Runs src/recall-cli.ts via tsx in dev, or the
4
+ // compiled dist/recall-cli.js after `npm install`. Mirrors bin/cli.js.
5
+
6
+ import { spawn } from 'child_process'
7
+ import { fileURLToPath } from 'url'
8
+ import { dirname, join } from 'path'
9
+ import { existsSync, lstatSync, symlinkSync } from 'fs'
10
+ import os from 'os'
11
+
12
+ // Same /workspace/.claude symlink guard as cli.js so stores resolve on Fly machines.
13
+ try {
14
+ const home = os.homedir()
15
+ const target = '/workspace/.claude'
16
+ const link = join(home, '.claude')
17
+ if (existsSync(target) && home !== '/workspace') {
18
+ let needsLink = true
19
+ try { needsLink = !lstatSync(link).isSymbolicLink() } catch {}
20
+ if (needsLink) symlinkSync(target, link)
21
+ }
22
+ } catch {}
23
+
24
+ const __dirname = dirname(fileURLToPath(import.meta.url))
25
+ const args = process.argv.slice(2)
26
+
27
+ const srcPath = join(__dirname, '..', 'src', 'recall-cli.ts')
28
+ const distPath = join(__dirname, '..', 'dist', 'recall-cli.js')
29
+
30
+ let child
31
+ if (existsSync(srcPath)) {
32
+ const tsxPath = join(__dirname, '..', 'node_modules', '.bin', 'tsx')
33
+ child = spawn(tsxPath, [srcPath, ...args], { stdio: 'inherit', cwd: join(__dirname, '..'), env: process.env })
34
+ } else if (existsSync(distPath)) {
35
+ child = spawn('node', [distPath, ...args], { stdio: 'inherit', cwd: join(__dirname, '..'), env: process.env })
36
+ } else {
37
+ console.error('Error: neither src/recall-cli.ts nor dist/recall-cli.js found')
38
+ process.exit(1)
39
+ }
40
+
41
+ child.on('error', (err) => { console.error('Failed to start osborn-recall:', err.message); process.exit(1) })
42
+ child.on('exit', (code) => process.exit(code || 0))
@@ -45,6 +45,7 @@ export declare const NAMED_AGENTS: {
45
45
  researcher: {
46
46
  description: string;
47
47
  tools: string[];
48
+ grounded: boolean;
48
49
  model: string;
49
50
  prompt: string;
50
51
  };
@@ -57,6 +58,7 @@ export declare const NAMED_AGENTS: {
57
58
  writer: {
58
59
  description: string;
59
60
  tools: string[];
61
+ grounded: boolean;
60
62
  model: string;
61
63
  prompt: string;
62
64
  };
@@ -69,6 +71,7 @@ export declare const NAMED_AGENTS: {
69
71
  planner: {
70
72
  description: string;
71
73
  tools: string[];
74
+ grounded: boolean;
72
75
  model: string;
73
76
  prompt: string;
74
77
  };
@@ -88,6 +91,23 @@ export declare const FALLBACK_MODEL = "minimax/minimax-m3";
88
91
  * NEVER mutates the input — NAMED_AGENTS and DB-sourced rows are untouched.
89
92
  */
90
93
  export declare function applyTurbo(agents: Record<string, any>, turbo: boolean): Record<string, any>;
94
+ /**
95
+ * Inject session-recall grounding into any agent flagged `grounded: true`.
96
+ *
97
+ * WHY: a sub-agent's file tools (Read/Grep/Glob) are sandboxed to its cwd +
98
+ * additionalDirectories, so it CANNOT read the session index / session.db that live
99
+ * under $HOME/.claude/projects/… — the old "grep search-index.txt" grounding silently
100
+ * failed. Bash, however, is NOT cwd-restricted, so `osborn-recall` reaches the store.
101
+ *
102
+ * So for every grounded agent we (1) hand it the EXACT, absolute-path osborn-recall
103
+ * command (resolved once here — the single dynamic resolver, so we never hardcode a
104
+ * per-agent path; works for named AND user-created custom grounded agents), and
105
+ * (2) guarantee Bash is in its tool set so it can run that command. The `grounded`
106
+ * flag is stripped before the roster reaches the SDK. NEVER mutates the input.
107
+ *
108
+ * Adversarial agents (reviewer/tester) leave `grounded` unset → untouched, stay blind.
109
+ */
110
+ export declare function applyGrounding(agents: Record<string, any>, sessionId: string | null, workingDir: string | undefined): Record<string, any>;
91
111
  /**
92
112
  * Claude LLM - Wraps Claude Agent SDK for LiveKit
93
113
  * Research mode: reads anything, writes only to session workspace
@@ -111,6 +131,14 @@ export declare class ClaudeLLM extends llm.LLM {
111
131
  toolName: string;
112
132
  input: any;
113
133
  } | null;
134
+ /**
135
+ * Guarded, fire-and-forget write-through to the embedded session.db. Called from the
136
+ * main agent's UserPromptSubmit hook (once per real user submission). Sweeps the FULL
137
+ * source set — main JSONL + every sub-agent JSONL — incrementally (byte-offset resume).
138
+ * The guard lives here (on the long-lived ClaudeLLM, not the per-turn stream) so a slow
139
+ * write can't overlap the next turn's write. Never throws; never blocks the caller.
140
+ */
141
+ triggerStoreUpdate(sessionId: string, workingDir: string): void;
114
142
  /**
115
143
  * Get all currently enabled MCP servers
116
144
  */