### Install Carlos with Homebrew Source: https://github.com/georgebuilds/carlos/blob/main/README.md Use this command to install the Carlos agent via Homebrew. Ensure you have Homebrew installed. ```bash brew install georgebuilds/tap/carlos ``` -------------------------------- ### Carlos Frame Configuration Example Source: https://github.com/georgebuilds/carlos/blob/main/SPEC.md Example of how to define frames in the ~/.carlos/config.yaml file. Includes settings for name, glyph, accent, provider, model, and system prompt. ```yaml frames: default: personal active: personal list: - name: personal glyph: ◉ accent: cream provider: anthropic model: claude-sonnet-4-6 system_prompt_append: | Personal frame. Tone: relaxed. - name: work glyph: ▣ accent: slate cwd_hints: ["~/Code/ludus/*"] vault_subtree: work/ ``` -------------------------------- ### Error Reporting Example Source: https://github.com/georgebuilds/carlos/blob/main/skills/calendar/cross-frame-view.md Shows how backend errors are surfaced as a footer line, including the frame, backend type, and error details. ```text ! work: caldav 401 (check FASTMAIL_APP_PASSWORD) ``` -------------------------------- ### Calendar Frame Configuration Source: https://github.com/georgebuilds/carlos/blob/main/SPEC.md Example configuration for defining frames and their associated calendar backends. This is stored in ~/.carlos/config.yaml. ```yaml frames: list: - name: personal capabilities: calendar: backend: apple-calendar - name: work capabilities: calendar: backend: caldav ``` -------------------------------- ### Unified Agenda Rendering Example Source: https://github.com/georgebuilds/carlos/blob/main/skills/calendar/cross-frame-view.md Displays events from different frames, prefixed with frame glyph and name. Overlapping events are kept separate. ```text ◉ personal 09:00-09:30 Standup Zoom ▣ work 10:00-11:00 Sprint planning Hangouts ◈ research 14:00-15:00 Reading group - ``` -------------------------------- ### List Today's Events Source: https://github.com/georgebuilds/carlos/blob/main/skills/calendar/ics-file.md Reads the ICS file and filters events to display only those starting today, sorted by start time. Requires the calendar path from configuration. ```tool tool: read args: { "path": "" } ``` -------------------------------- ### List Today's Events in Apple Calendar Source: https://github.com/georgebuilds/carlos/blob/main/skills/calendar/apple-calendar.md Retrieves all events for the current day from all calendars. The output is a string with events formatted as 'start date | summary'. Parse the stdout to sort by start time. ```applescript osascript \ -e 'set startDate to current date' \ -e 'set time of startDate to 0' \ -e 'set endDate to startDate + 1 * days' \ -e 'tell application "Calendar"' \ -e ' set out to ""' \ -e ' repeat with c in calendars' \ -e ' set evs to (every event of c whose start date >= startDate and start date < endDate)' \ -e ' repeat with e in evs' \ -e ' set out to out & (start date of e as string) & " | " & summary of e & linefeed' \ -e ' end repeat' \ -e ' end repeat' \ -e ' return out' \ -e 'end tell' ``` -------------------------------- ### Create a Calendar Event Source: https://github.com/georgebuilds/carlos/blob/main/skills/calendar/mcp.md Use the `mcp_calendar_create_event` tool to add a new event. Provide details such as summary, start and end times, description, location, and attendees. Times must be in ISO 8601 format with an explicit offset. ```yaml tool: mcp_calendar_create_event args: calendar: .mcp_calendar> summary: Meeting start: 2026-06-07T15:00:00-04:00 end: 2026-06-07T16:00:00-04:00 description: "" location: "" attendees: [] ``` -------------------------------- ### List Today's Events Source: https://github.com/georgebuilds/carlos/blob/main/skills/calendar/mcp.md Use the `mcp_calendar_list_events` tool to query events within a specified date range. Ensure the `start` and `end` times are in ISO 8601 format with an explicit offset. ```yaml tool: mcp_calendar_list_events args: start: 2026-06-06T00:00:00-04:00 end: 2026-06-07T00:00:00-04:00 calendar: .mcp_calendar> ``` -------------------------------- ### Example of Ignored Wikilinks and Tags Source: https://github.com/georgebuilds/carlos/blob/main/internal/notes/testdata/vault/mvp-roadmap.md This code block demonstrates that wikilinks like [[code-fenced]] and tags like #fenced-tag within fenced code blocks are not processed by the parser and do not pollute the tag set. ```markdown [[code-fenced]] wikilinks must NOT be picked up by the parser. #fenced-tag also must not pollute the tag set. ``` -------------------------------- ### Delete a Calendar Event Source: https://github.com/georgebuilds/carlos/blob/main/skills/calendar/mcp.md Use the `mcp_calendar_delete_event` tool to remove an event. You need to provide the event's ID, which can be obtained from a previous `list` or `get` operation. ```yaml tool: mcp_calendar_delete_event args: id: ``` -------------------------------- ### Build and Run Carlos from Source Source: https://github.com/georgebuilds/carlos/blob/main/README.md Compile the Carlos agent from its source code using Go and then run the executable. This is useful for development or if you prefer to build from source. ```bash go build ./cmd/carlos ./carlos ``` -------------------------------- ### Carlos Project File System Layout Source: https://github.com/georgebuilds/carlos/blob/main/SPEC.md Overview of the ~/.carlos/ directory structure, detailing configuration files, logs, and persistent data. Permissions are strictly enforced. ```text config.yaml user prefs, provider keys, schedules, vault config state.db SQLite event log + memory FTS5 trusted-workspaces.json trust store (0600, atomic writes) shell-history separate history (~/.zsh_history-style) jobs/.log per-job shell output research/-.md research reports skills/.md user-approved skill library agent-pools/ sub-agent worktrees + state ``` -------------------------------- ### Research Engine File System Layout Source: https://github.com/georgebuilds/carlos/blob/main/SPEC.md Illustrates the file system layout for research reports generated by the Carlos project. Reports are saved to ~/.carlos/research/. ```text research/-.md ``` -------------------------------- ### Carlos Built-in Allowlist Tools Source: https://github.com/georgebuilds/carlos/blob/main/SPEC.md List of read-only tools that are auto-approved by default. These tools operate on user state and are considered safe for direct execution. ```text notes_search, notes_get, notes_neighbors, notes_recent, notes_resolve, notes_backlinks, notes_tagged, read, grep, glob, ls, git_status, git_diff, git_log, git_blame, git_show ``` -------------------------------- ### Create Event using PUT Source: https://github.com/georgebuilds/carlos/blob/main/skills/calendar/caldav.md This snippet demonstrates how to create a new event on a CalDAV server. It uses the PUT method with a unique UID and a .ics file format for the event data. The If-None-Match header prevents accidental overwrites. ```yaml tool: http_request args: method: PUT url: .ics headers: Content-Type: text/calendar; charset=utf-8 If-None-Match: "*" basic_auth: user: pass: body: | BEGIN:VCALENDAR VERSION:2.0 PRODID:-//carlos//calendar-caldav//EN BEGIN:VEVENT UID: DTSTAMP:20260606T120000Z DTSTART;TZID=America/New_York:20260607T150000 DTEND;TZID=America/New_York:20260607T160000 SUMMARY:Meeting END:VEVENT END:VCALENDAR ``` -------------------------------- ### Carlos Project Directory Layout Source: https://github.com/georgebuilds/carlos/blob/main/AGENTS.md Provides an overview of the directory structure for the carlos agent project, detailing the purpose of each major directory. ```markdown ``` cmd/carlos/ main TUI binary + daemon internal/ agent/ tool-use loop, event log, supervision, layered policy config/ ~/.carlos/config.yaml schema + onboarding state daemon/ background scheduler (UDS + launchd / systemd) frame/ per-session frames (personal + N user-defined) gateway/ chat-surface adapters (ntfy, Telegram, Signal, custom) memory/ SQLite FTS5, summarizer, user model miniyaml/ hand-rolled YAML for frontmatter notes/ Obsidian vault index + cache projectctx/ per-project context loader (AGENTS.md, CLAUDE.md) providers/ anthropic / openai / openrouter / ollama / gemini research/ decompose -> search -> fetch -> read -> synthesize -> verify sandbox/ local + git-worktree execution schedule/ cron + NL grammar skills/ skill format, loader, inducer, judge, replay-eval theme/ light / dark / NO_COLOR / configurable accent tools/ bash, file ops, grep / glob, git_*, web_*, notes_*, obsidian_* tui/ bubbletea chat / manage / onboarding / slash registry usershell/ user-shell driver (! prefix, jobs, history) workspace/ trusted-workspaces store + read-only bash classifier skills/ bundled starter skills (calendar/, ...) docs/ GitHub Pages site + llms.txt ``` ``` -------------------------------- ### Carlos Repository Layout Source: https://github.com/georgebuilds/carlos/blob/main/SPEC.md Overview of the directory structure for the Carlos project, indicating the purpose of each major component. ```text cmd/carlos/ main TUI binary + daemon internal/ agent/ tool-use loop, event log, supervision, layered policy config/ ~/.carlos/config.yaml schema + onboarding state daemon/ background scheduler (UDS + launchd / systemd) gateway/ chat-surface adapters (ntfy, Telegram, Signal, custom) memory/ SQLite FTS5, summarizer, user model miniyaml/ hand-rolled YAML for frontmatter notes/ Obsidian vault index + cache projectctx/ per-project context loader (AGENTS.md, CLAUDE.md) providers/ anthropic / openai / openrouter / ollama / gemini (via oacompat) research/ decompose → search → fetch → read → synthesize → verify sandbox/ local + git-worktree execution schedule/ cron + NL grammar skills/ skill format, loader, inducer, judge, replay-eval theme/ light / dark / NO_COLOR / configurable accent tools/ bash, file ops, grep / glob, git_*, web_*, notes_*, obsidian_* tui/ bubbletea chat / manage / onboarding / slash registry usershell/ user-shell driver (! prefix, jobs, history) workspace/ trusted-workspaces store + read-only bash classifier docs/ GitHub Pages site + llms.txt ``` -------------------------------- ### List Events in Time Range using REPORT Source: https://github.com/georgebuilds/carlos/blob/main/skills/calendar/caldav.md Use this snippet to retrieve events within a specified time range from a CalDAV server. It requires the CalDAV URL, username, and password, and sends a REPORT request with a calendar-query body. ```yaml tool: http_request args: method: REPORT url: headers: Content-Type: application/xml; charset=utf-8 Depth: "1" basic_auth: user: pass: body: | ``` -------------------------------- ### Update Event using PUT with If-Match Source: https://github.com/georgebuilds/carlos/blob/main/skills/calendar/caldav.md This snippet shows how to update an existing event on a CalDAV server. It uses the PUT method with the event's URL and the If-Match header containing the event's ETag to ensure safe updates. ```yaml tool: http_request args: method: PUT url: .ics headers: If-Match: "" basic_auth: user: pass: ``` -------------------------------- ### Add an Event Tomorrow Source: https://github.com/georgebuilds/carlos/blob/main/skills/calendar/ics-file.md Adds a new VEVENT block to the ICS file before the final END:VCALENDAR line. Reads the file first to ensure a unique UID. If the file is empty, it writes a new VCALENDAR wrapper. ```tool tool: edit args: path: old_string: "END:VCALENDAR\n" new_string: "BEGIN:VEVENT\nUID:20260607T150000-meeting@carlos\nDTSTAMP:20260606T120000Z\nDTSTART;TZID=America/New_York:20260607T150000\nDTEND;TZID=America/New_York:20260607T160000\nSUMMARY:Meeting\nEND:VEVENT\nEND:VCALENDAR\n" ``` -------------------------------- ### Minimal VEVENT Structure Source: https://github.com/georgebuilds/carlos/blob/main/skills/calendar/ics-file.md A basic structure for an event within an ICS file, including unique ID, timestamps, start/end times, summary, description, location, and attendees. ```ics BEGIN:VEVENT UID:2026-06-06T1500-standup@carlos DTSTAMP:20260606T120000Z DTSTART;TZID=America/New_York:20260606T150000 DTEND;TZID=America/New_York:20260606T153000 SUMMARY:Standup DESCRIPTION:Daily sync LOCATION:Zoom ATTENDEE;CN=Alice:mailto:alice@example.com END:VEVENT ``` -------------------------------- ### Create an Event Tomorrow in Apple Calendar Source: https://github.com/georgebuilds/carlos/blob/main/skills/calendar/apple-calendar.md Creates a new event in the 'Personal' calendar for tomorrow at 3 PM with a duration of 1 hour. Captures and returns the unique identifier (UID) of the newly created event. ```applescript osascript \ -e 'set s to (current date) + 1 * days' \ -e 'set time of s to 15 * hours' \ -e 'set e to s + 1 * hours' \ -e 'tell application "Calendar"' \ -e ' tell calendar "Personal"' \ -e ' set newE to make new event with properties {summary:"Meeting", start date:s, end date:e}' \ -e ' return uid of newE' \ -e ' end tell' \ -e 'end tell' ``` -------------------------------- ### Delete Event using DELETE Source: https://github.com/georgebuilds/carlos/blob/main/skills/calendar/caldav.md Use this snippet to delete an event from a CalDAV server. It requires the event's URL and its ETag for conditional deletion, ensuring that only the correct event is removed. ```yaml tool: http_request args: method: DELETE url: .ics headers: If-Match: "" basic_auth: user: pass: ``` -------------------------------- ### Delete an Event Source: https://github.com/georgebuilds/carlos/blob/main/skills/calendar/ics-file.md Deletes a specific VEVENT block from the ICS file by providing the complete block as old_string and an empty string as new_string. ```tool tool: edit args: path: old_string: "\n" new_string: "" ``` -------------------------------- ### JavaScript Text Scrambling Animation Source: https://github.com/georgebuilds/carlos/blob/main/docs/index.html This snippet animates text by scrambling letters and then locking them into a target word. It's useful for dynamic headlines or attention-grabbing text elements. Ensure the HTML has elements with IDs 'mask', 'ghost', 'variable', and 'srVar'. ```javascript (function () { const words = [ 'committed', 'hard-working', 'indomitable', 'tenacious', 'ride-or-die', 'resourceful', ]; const SCRAMBLE_POOL = 'abcdefghijklmnopqrstuvwxyz-'; const mask = document.getElementById('mask'); const ghost = document.getElementById('ghost'); const slot = document.getElementById('variable'); const sr = document.getElementById('srVar'); // Lock the slot width to the widest target word so the headline never reflows. const probe = document.createElement('span'); probe.style.cssText = 'visibility:hidden;position:absolute;white-space:nowrap;font-style:italic;'; mask.appendChild(probe); let widest = words[0]; let maxW = 0; for (const w of words) { probe.textContent = w; const r = probe.getBoundingClientRect().width; if (r > maxW) { maxW = r; widest = w; } } mask.removeChild(probe); ghost.textContent = widest; function renderWord(word) { slot.innerHTML = ''; for (const ch of word) { const s = document.createElement('span'); s.className = 'letter'; s.textContent = ch; slot.appendChild(s); } } renderWord(words[0]); sr.textContent = words[0]; if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return; const SCRAMBLE_MS = 220; // duration each letter scrambles before locking const STAGGER_MS = 42; // delay between successive letters locking (wave L→R) const FLIP_MS = 55; // how often a scrambling letter picks a new random char let rafId = 0; let cooling = false; function shuffleTo(target) { cancelAnimationFrame(rafId); const current = Array.from(slot.children); const targetLen = target.length; const maxLen = Math.max(current.length, targetLen); // Ensure we have enough slots; new ones start hidden and fade in during scramble. for (let i = current.length; i < maxLen; i++) { const s = document.createElement('span'); s.className = 'letter'; s.dataset.state = 'hidden'; s.textContent = SCRAMBLE_POOL[Math.floor(Math.random() * SCRAMBLE_POOL.length)]; slot.appendChild(s); } const letters = Array.from(slot.children); const start = performance.now(); let lastFlip = 0; function frame(now) { const elapsed = now - start; const flip = now - lastFlip >= FLIP_MS; if (flip) lastFlip = now; let allDone = true; for (let i = 0; i < letters.length; i++) { const el = letters[i]; const lockAt = SCRAMBLE_MS + i * STAGGER_MS; if (elapsed < lockAt) { // still scrambling if (flip) { el.textContent = SCRAMBLE_POOL[Math.floor(Math.random() * SCRAMBLE_POOL.length)]; } el.dataset.state = 'scramble'; allDone = false; } else { // locked if (i < targetLen) { if (el.textContent !== target[i]) el.textContent = target[i]; el.dataset.state = 'locked'; } else { el.dataset.state = 'hidden'; } } } if (!allDone) { rafId = requestAnimationFrame(frame); } else { // Drop trailing slots beyond the new word. while (slot.children.length > targetLen) slot.lastChild.remove(); // Clear data-state on locked letters so they sit at default style. for (const el of slot.children) delete el.dataset.state; } } rafId = requestAnimationFrame(frame); } let idx = 0; function tick() { idx = (idx + 1) % words.length; const next = words[idx]; sr.textContent = next; shuffleTo(next); } // Settle the opening word before the first shuffle. setTimeout(() => { tick(); setInterval(tick, 2600); }, 1900); })(); ``` -------------------------------- ### Delete an Event by UID in Apple Calendar Source: https://github.com/georgebuilds/carlos/blob/main/skills/calendar/apple-calendar.md Deletes an event from any calendar that matches the provided unique identifier (UID). Substitute '' with the actual event identifier. This script assumes valid UIDs do not contain double quotes. ```applescript osascript \ -e 'tell application "Calendar"' \ -e ' repeat with c in calendars' \ -e ' set matches to (every event of c whose uid is "")' \ -e ' repeat with m in matches' \ -e ' delete m' \ -e ' end repeat' \ -e ' end repeat' \ -e 'end tell' ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.