Compare commits

31 Commits

Author SHA1 Message Date
44a1b43cba release(opencortex): bump submodule to v0.2.0 2026-05-01 21:51:48 -04:00
cb783530e5 refactor(gtd): move OpenCortex tasks to project-local TODO.org
- Slim gtd.org by linking to projects/opencortex/TODO.org
- gtd.org reduced from 1615 to 822 lines (-793)
- OpenCortex tasks now live in projects/opencortex/TODO.org
- Add projects/opencortex/TODO.org to org-agenda-files

Engineering Core and personal tasks remain in gtd.org
2026-05-01 21:46:04 -04:00
0168281c8c fix(opencortex): update submodule with final TUI and harness stability fixes 2026-05-01 18:16:55 -04:00
bef72ed55f refactor(opencortex): update submodule to include harness fixes and mandate centralization 2026-05-01 12:43:25 -04:00
a9be1d99b3 feat(opencortex): tmux TUI testing, unified LLM backend, daemon fixes
Submodule update includes:
- feat(tui): background reader thread, error handling, TERM guard
- feat(llm): unified OpenAI-compatible backend (Ollama/OpenRouter/OpenAI/Anthropic/Groq/Gemini)
- fix(loop): correct .env loading path (.config/opencortex)
- fix(daemon): restart with updated XDG harness files
- fix(reason): add generate-tool-belt-prompt, policy explanation, deterministic gate
2026-04-30 19:58:02 -04:00
d5b62ee642 feat(tui): add background reader, error handling, connection state 2026-04-30 19:53:02 -04:00
f858b86b64 docs(AGENTS): add utils-lisp mandate for Lisp structural operations
- NEW: REPL-first workflow requirement
- NEW: Must use utils-lisp functions for any .lisp work
- NEW: Never use edit tool on .lisp files directly
- NEW: Post-task verification: REPL verified + utils-lisp used
2026-04-30 11:17:45 -04:00
15e45e57e8 refactor: portable tangling with %%SKILLS_DIR%% placeholder 2026-04-30 11:14:32 -04:00
d68bdb2d2f fix: add in-package to REPL skill org 2026-04-30 11:11:41 -04:00
1886b7ed5d refactor: absolute XDG paths for skill tangling 2026-04-30 11:09:48 -04:00
622b85dd94 refactor: XDG tangle paths for skills
- Skills now tangle to $OC_DATA_DIR/skills/ (XDG)
- Removed manually-created .lisp files from repo
2026-04-30 11:09:23 -04:00
4b04266c16 fix(opencortex): harness compile errors resolved
- FIX: copy-org-object -> deep-copy-org-object (struct conflict)
- FIX: malformed char= syntax in reason.lisp
2026-04-30 10:58:23 -04:00
1adc80bcfb docs(gtd): add REPL skill to v0.2.0 roadmap
- Added org-skill-repl as DONE under INTERACTIVE REFINEMENT
- Enables REPL-first workflow with literate reflection in org
2026-04-30 10:54:18 -04:00
213c9f8c90 feat(skills): add org-skill-repl for persistent Lisp evaluation
Enables agent to:
- Evaluate Lisp code with result/output/error separation
- Inspect variables and functions
- List bound variables in package
- Load files into image
- Supports REPL-first workflow with literate reflection in org
2026-04-30 10:54:08 -04:00
492c84f881 chore(memex): add chat notes and lisp check file 2026-04-30 10:52:48 -04:00
cf5f0d13d0 feat(opencortex): v0.2.0 skills consolidation
- NEW: org-skill-utils-lisp (3-phase validation, sandboxed eval, AST tools)
- NEW: org-skill-utils-org (org headline manipulation, property management)
- DELETE: org-skill-lisp-utils, org-skill-emacs-edit (merged)
- ADD: opencortex setup wizard, opencortex doctor command
- ADD: Native TUI with Croatoan
- HARDEN: Skill loader, package jailing fixes
2026-04-30 10:52:27 -04:00
dfa13d359c docs(gtd): seal v0.2.0 roadmap milestones 2026-04-28 19:51:01 -04:00
42e5c9060e docs(inbox): clear release notes 2026-04-28 19:48:59 -04:00
0121082bc6 feat(chaos): seal v0.2.0 with Tier 2/3 validation and TUI fixes 2026-04-28 19:48:59 -04:00
6f548aa7ac fix: resolve TUI syntax errors and color constants 2026-04-28 14:45:11 -04:00
315ef305e9 chore: complete scorched earth bootstrap and seal v0.2.0-pre fixes 2026-04-28 14:08:25 -04:00
aa70766a4f docs(gtd): mark chaos bugfixes as done and update submodule ref 2026-04-28 14:03:03 -04:00
a842f10b35 chore(opencortex): update submodule to latest fix for v0.2.0 2026-04-28 10:46:31 -04:00
478e5b88bc chore: seal v0.2.0 milestone with updated submodule reference and README 2026-04-27 20:18:04 -04:00
38f1dfec4e feat(xdg): implement xdg-compliant directory structure and diagnostic doctor 2026-04-27 19:51:41 -04:00
bdb4b30012 docs: mark v0.2.0 Autonomous Self-Editing Foundation tasks as DONE
- Exposed Structural AST Editing Tools.
- Implemented Reflection Loops.
- Hardened Actuators (path-traversal and Merkle snapshots).
- Implemented tool permission tiers (ask/allow/deny).
- Validated skill hot-reload capability.
2026-04-27 13:44:50 -04:00
5e68db2464 docs: merge architectural evolution note into roadmap
- Transferred remaining architectural tasks (AST tooling, Reflection Loops, Actuator hardening, Lazy-loading) into the active gtd.org task tree.
- Purged the standalone note as its contents are now fully tracked in the project roadmap.
2026-04-27 13:39:02 -04:00
d1b1e1c4bb docs: shift vector search to v0.3.0 and make provider-agnostic
- Moved vector search out of v0.2.0 (blocking the TUI release).
- Re-architected as 'Asynchronous Embedding Gateway' in v0.3.0.
- Supports Ollama, llama.cpp, and OpenAI based on .env configuration.
- Operates via a background worker thread to prevent Merkle GC churn during active text editing.
2026-04-27 13:36:52 -04:00
6a90e43067 docs: sync gtd.org roadmap with new v0.3.0-v1.0.0 version scheme
- Renamed v0.3.0 to include HITL
- Renamed v0.4.0 to include Git Workflows
- Shifted Creator + Architect to v0.6.0
- Inserted new v0.5.0 (Interactive Actuation)
- Inserted new v0.7.0 (Visual Grounding) and v0.8.0 (Evaluation Harness) before v1.0.0 SOTA Parity.
2026-04-27 13:22:55 -04:00
4317eff40e docs: Add self-enforcement checklist to AGENTS.md
- Before task gate (git clean, skill query, GTD read)
- During task LP rules (org-only, one function per block, prose)
- After task validation (tests pass, chaos tier 1, no artifacts)
- References to authoritative skill org files

This makes the mandate enforceable, not just documentation.
2026-04-25 19:33:25 -04:00
cc6c552d5a refactor: Move Emacs config from system/ to projects/dotemacs/
- Delete deprecated system/ configuration files
- Update projects/dotemacs/modules/ with reorganized config
- Add .opencode/ directory for agent state
- Clean up attachments and unused documentation files
2026-04-25 18:41:20 -04:00
86 changed files with 4484 additions and 6419 deletions

149
.opencode/AGENTS.md Normal file
View File

@@ -0,0 +1,149 @@
# OpenCortex Agent Mandate
This file defines the operating policies and engineering guidelines that all autonomous agents MUST follow.
## Vision
- **Pure Lisp + Org-mode**: All intelligence implemented in Lisp, all documentation in Org-mode
- **No JSON, No YAML**: Thin harness, fat skills
- **Constraint**: No temporary scripts in opencortex repo - use `/home/user/memex/system/` instead
## Current Goal
- **v0.2.0**: Self-Improvement + Local LLMs
- org-skill-self-edit (self-modification)
- org-skill-emacs-edit (full org-mode manipulation)
- Local vector search (Ollama embeddings)
- Tool permission tiers (ask/allow/deny)
- Skill hot-reload ✅ DONE
- Engineering Standards skill ✅ DONE
- Literate Programming skill ✅ DONE
## Wake-Up Protocol
When this agent starts, it MUST:
1. **Read this file** (`~/.opencode/AGENTS.md`)
2. **Query the skill catalog**: Before any analysis, check if a skill covers the problem domain
- `(list-skills)` to see all loaded skills
- `(find-skill :keyword)` to check for a specific domain
- Read the skill's org file if found
3. **Verify git status**: Working tree MUST be clean before modification
4. **Read `gtd.org`**: Load current task context from the roadmap
5. **Enter lifecycle**: Follow the Engineering Standards lifecycle (Phase 0 → A → B → C → D → E)
Rationale: Raw LLM reasoning is a fallback, not a starting point. The skill layer encodes the system's accumulated wisdom. Ignoring skills creates drift.
## Engineering Standards
The Engineering Standards skill (`opencortex.skills.org-skill-engineering-standards`) defines the full lifecycle. The summaries below are reminders; the skill org file is authoritative.
### Phase 0: Before You Think
**Skill-First Query Rule**: Before analysis, debugging, or implementation, query the skill catalog. If a relevant skill exists, follow its mandates. Do not duplicate logic.
### Phase A: Design (Test-First)
1. **Define success criteria first** — Write the test or PROTOCOL that proves the feature works
2. **Break the design with chaos** — Three tiers of adversarial testing:
- *Deterministic chaos*: Scripted regression tests on every change
- *Probabilistic chaos*: Randomized fuzzing on every major release
- *Stress chaos*: Load and resource starvation during hardening sprints
### Phase B: Commit (Recovery Point)
3. **Commit Before Modify** — Commit and push (if network available) before any file changes
### Phase C: Build (Implementation)
4. **Literate Programming** — All logic in Org files; generated `.lisp` is derived, not authored
5. **Function-Block Granularity** — One function per `#+begin_src lisp` block
6. **Tangle Mandate** — Edit Org only; never touch generated `.lisp`
7. **Configuration Externalization** — No hardcoded values; use `.env.example`
8. **Org as Thinking Medium** — Document investigation before fixing
### Phase D: Validate (Proof)
9. **Test Verification** — Run the full suite. A change that breaks tests is damage, not a fix.
### Phase E: Document (Audit Trail)
10. **Decision Audit Trail** — Document root cause, options, tradeoffs, and rationale
11. **Stop-and-Wait** — For major changes, propose strategy, state "Waiting for user feedback," yield turn
12. **GTD Synchronization** — Update `gtd.org` with TODO headlines before marking complete
## Literate Programming Rules
The Literate Programming skill (`opencortex.skills.org-skill-literate-programming`) enforces Org discipline:
1. **One Function, One Block** — No bundling multiple definitions
2. **Org-Mode Evaluation Gate**`C-c C-c` after every block change
3. **Pre-Tangle Structural Check** — Verify paren balance before tangling
4. **No Direct `.lisp` Edits** — All changes flow through Org
5. **Code and Prose Together** — Every block preceded by explanatory text
Violating these rules corrupts the skill loader and causes boot failure (as seen in the 2026-04-25 incident).
## Agent Workflow
- **Boot Sequence**: Read AGENTS.md → query skills → verify git → read gtd.org
- **Before Any Modification**: Commit first (Commit Before Modify rule)
- **Plan Mode**: Draft PROTOCOL.md before complex implementations
- **Testing**: Run FiveAM test suite + chaos tests before marking task complete
- **Completion**: Update gtd.org, commit, sync with user
## Self-Enforcement Checklist
This agent MUST verify these conditions before, during, and after each task. Violation is a bug, not a suggestion.
### Before Any Task (Gate)
- [ ] **Git clean** — Working tree must be clean before modification
- [ ] **Skill query** — Check if relevant skill exists in `/home/user/memex/projects/opencortex/skills/`
- [ ] **Skill read** — If found, read the skill's org file before proceeding
- [ ] **GTD read** — Check `gtd.org` for current task context
### During Task (Literate Programming)
- [ ] **REPL-first workflow** — Explore in REPL before writing code
- [ ] **Utils-lisp for structural ops** — Use these functions for any .lisp work:
- `utils-lisp-structural-extract` — Extract function definitions
- `utils-lisp-structural-inject` — Inject forms into definitions
- `utils-lisp-structural-wrap` — Wrap code in let/progn
- `utils-lisp-validate` — Validate code before commit
- `repl-eval` — Test code in REPL
- `repl-inspect` — Inspect variables/functions
- [ ] **Never use edit tool on .lisp** — Only edit .org files; never touch generated .lisp directly
- [ ] **One function per block** — Each `#+begin_src` block contains exactly one definition
- [ ] **Prose before code** — Every block preceded by explanatory text
- [ ] **Prose includes**: What the function does, arguments, return value, rationale
- [ ] **Evaluate each block** — Verify the block compiles/evaluates correctly
- [ ] **Paren balance** — Check balanced parentheses before tangling
### After Task (Validation)
- [ ] **REPL verified** — Code tested in REPL before commit (not just text edit)
- [ ] **Utils-lisp used** — Confirmed structural operations went through utils-lisp
- [ ] **Tests pass** — Run full test suite; 100% pass required
- [ ] **Chaos tier 1** — Deterministic regression tests pass
- [ ] **No artifacts** — No orphaned `.bak`, `.log`, `.tmp`, or untracked test files
- [ ] **Commit** — Stage and commit changes with descriptive message
- [ ] **GTD update** — Update `gtd.org` with completed task state
### For OpenCortex Work Specifically
Reference authoritative skill files:
- Engineering Standards: `projects/opencortex/skills/org-skill-engineering-standards.org`
- Literate Programming: `projects/opencortex/skills/org-skill-literate-programming.org`
- Policy: `projects/opencortex/skills/org-skill-policy.org`
The summaries in this file are reminders; the skill org files are authoritative.
## References
- opencortex repo: `/home/user/memex/projects/opencortex`
- Engineering Standards: `/home/user/memex/projects/opencortex/skills/org-skill-engineering-standards.org`
- Literate Programming: `/home/user/memex/projects/opencortex/skills/org-skill-literate-programming.org`
- Policy Skill: `/home/user/memex/projects/opencortex/skills/org-skill-policy.org`
- Roadmap: `/home/user/memex/gtd.org`
- README: `/home/user/memex/projects/opencortex/README.org`

View File

@@ -5,7 +5,7 @@
#+FILETAGS: :memex:psf:opencortex:lisp:sovereignty:
* Overview
The *Master Memex* is a sovereign, neurosymbolic intelligence organization system. It is not merely a collection of notes, but a live, programmable environment—a **Personal Software Foundry (PSF)**—where a human (the Sovereign Executive) and agentic co-processes (the `opencortex` kernel and Gemini CLI) collaborate within a shared address space.
The *Master Memex* is a sovereign, neurosymbolic intelligence organization system. It is not merely a collection of notes, but a live, programmable environment—a **Personal Software Foundry (PSF)**—where a human (the Sovereign Executive) and agentic co-processes (the `opencortex` kernel and opencode) collaborate within a shared address space.
This system synthesizes three core organizational methodologies into a unified "Lisp Machine" experience:
- *Zettelkasten:* For atomic, evergreen, and interlinked knowledge.
@@ -36,7 +36,7 @@ The Memex is inhabited by autonomous agents that operate as "Probabilistic" (pro
** [[file:projects/opencortex/README.org][opencortex (The Kernel)]]
A Common Lisp microkernel that maintains a live, threaded Object-Store in RAM. It uses Org-mode as its native Abstract Syntax Tree (AST), allowing it to "perceive" and "act" on the Memex with structural precision.
** Gemini CLI
** opencode
A strategic orchestrator that handles large-scale batch tasks, research, and planning. It operates according to the *PSF Consensus Loop* (Demand -> Blueprint -> Success -> Build -> Chaos -> Memory).
* The Cognitive Architecture: A Session-less Mind

View File

@@ -1,36 +0,0 @@
# Implementation Plan: The Micro-Loader (Boot Sequence Refactor)
## Objective
Consolidate and harden the kernel's skill-loading logic into a stateful "Micro-Loader." This improves boot reliability, provides clear error reporting for malformed skills, and centralizes all capability management within the `skills` module.
## Key Files & Context
- **Target:** `projects/opencortex/literate/skills.org` (Consolidating logic here).
- **Target:** `projects/opencortex/literate/core.org` (Moving `load-all-skills` out of here).
- **Mandate:** Syntax Pre-flight and Dependency Assertion.
## Implementation Steps
### 1. Define the Skill Catalog
- Introduce `*skill-catalog*` in `skills.lisp` to track metadata and load status for every skill file found in `SKILLS_DIR`.
- Statuses: `:discovered`, `:loading`, `:ready`, `:failed`.
### 2. Refactor `load-skill-from-org` (Harden)
- **Syntax Check:** Invoke `validate-lisp-syntax` before evaluation.
- **Dependency Check:** If `#+DEPENDS_ON` refers to a skill that failed or is missing, mark this skill as `:failed` immediately with a clear error.
- **Detailed Logging:** Record the specific reason for failure (syntax, timeout, runtime error) in the catalog.
### 3. Implement `initialize-all-skills` (The Orchestrator)
- Move the directory scanning and loop logic from `core.lisp` into `skills.lisp`.
- This function will:
1. Scan `SKILLS_DIR`.
2. Populate the catalog.
3. Run the topological sort.
4. Execute the load loop with timeouts.
5. Print a final "Boot Summary" report.
### 4. Simplify Kernel Boot
- Update `start-daemon` in `core.lisp` to call `(initialize-all-skills)` instead of the old `load-all-skills`.
## Phase E: Chaos (Verification)
- **Integrity Test:** Add a test that verifies `initialize-all-skills` correctly identifies a missing dependency and prevents the dependent skill from attempting to load.
- **Report Test:** Verify that the skill catalog correctly reflects the status of loaded vs. failed skills.

18
check.lisp Normal file
View File

@@ -0,0 +1,18 @@
(handler-case
(with-open-file (s "/home/user/memex/projects/opencortex/skills/org-skill-config-manager.org")
(loop for line = (read-line s nil)
while line
do (when (search "#+begin_src lisp" line)
(let ((block ""))
(loop for l = (read-line s nil)
while (and l (not (search "#+end_src" l)))
do (setf block (concatenate 'string block l (string #\Newline))))
(handler-case
(with-input-from-string (in block)
(loop for form = (read in nil :eof)
until (eq form :eof)))
(error (c)
(format t "Error in block beginning with ~a: ~a~%"
(subseq block 0 (min 30 (length block)))
c)))))))
(error (c) (format t "General error: ~a~%" c)))

15
fedora-43-repos.repo Normal file
View File

@@ -0,0 +1,15 @@
[fedora]
name=Fedora 43 - x86_64
enabled=1
metadata_expire=1h
baseurl=https://mirrors.fedoraproject.org/metalink?repo=fedora-43&arch=x86_64
type=rpm-md
gpgcheck=0
[updates]
name=Fedora 43 - x86_64 - Updates
enabled=1
metadata_expire=1h
baseurl=https://mirrors.fedoraproject.org/metalink?repo=fedora-43-updates&arch=x86_64
type=rpm-md
gpgcheck=0

716
gtd.org
View File

@@ -34,714 +34,14 @@
:END:
** NEXT OpenCortex v1.0
:PROPERTIES:
:ID: proj-opencortex-v1-0
:Engineering-STATE: D: BUILD
:CREATED: [2026-03-09 Mon 14:23]
:END:
OpenCortex: A Neurosymbolic AI Agent.
*** PHASE: AUTONOMOUS MVP (v0.1.0 Released)
:PROPERTIES:
:ID: proj-mvp-v0-1-0
:END:
The "Zero-to-One" release. The agent must be mathematically secure, CLI-first, and capable of autonomous Memex maintenance.
**** DONE 1. Harness Hardening (The Final Audit)
***** DONE Audit remaining core skills (`org-skill-policy.org`, `org-skill-bouncer.org`) to the new Literate Granularity standard.
***** DONE Implement Verification Lock: Ensure `MANDATORY_SKILLS` pass `validate-lisp-syntax` before boot proceeds.
***** DONE Logging & Transparency: Ensure `context-get-system-logs` is utilized by the Reason engine to explain blocked actions.
**** DONE 2. The Autonomous Scribe & Gardener (The Primary Value Prop)
***** DONE Implement `org-skill-scribe.org`: Background worker that distills daily chronological logs into structured Zettelkasten notes.
***** DONE Implement `org-skill-gardener.org`: Heartbeat-driven skill that autonomously flags orphaned nodes and repairs broken links.
**** DONE 3. The Zero-to-One Experience (setup.org)
***** DONE Consolidate installation instructions, `onboard.sh`, and `Dockerfile` into a single, literate `setup.org` file.
***** DONE Ensure the setup process interactively builds the `.env` and verifies SBCL/Quicklisp dependencies.
**** DONE 4. CLI-First Actuation
CLOSED: [2026-04-14 Tue 09:40]
***** DONE Verified the `cli` actuator and inbound gateway handle standard I/O interaction gracefully via a stateful `socat` connection.
*** PHASE: PUBLICATION & VERIFICATION (v0.1.0 Post-Release)
:PROPERTIES:
:ID: proj-pub-v0-1-0
:END:
Ensuring the system is ready for the world through collaborative testing, documentation, and licensing.
**** DONE 1. Collaborative End-to-End Testing [2026-04-21 Tue]
CLOSED: [2026-04-21 Tue 17:30]
***** DONE Verified stable foundation at commit `cab0e5a`.
***** DONE Verified boot sequence and bidirectional connectivity.
**** DONE 2. Semantic Reorganization & System Stabilization [2026-04-21 Tue]
CLOSED: [2026-04-21 Tue 18:30]
***** DONE Rename directories: harness/, library/, environment/, infrastructure/.
***** DONE Consolidate Probabilistic engine into reason.lisp.
***** DONE Embed bidirectional CLI logic into opencortex.sh.
***** DONE Stabilize skill engine: 12/12 skills loaded with package jailing.
***** DONE Cleanup legacy documentation and deployment artifacts.
**** DONE 2. Comprehensive Documentation <2026-04-14 Tue>
CLOSED: [2026-04-20 Mon 18:00]
***** DONE Draft `USER_MANUAL.org`: Focus on CLI interaction, installation, and Memex structure.
***** DONE Draft `CONTRIBUTING.org`: Explain Literate Granularity and Skill creation standards.
**** DONE 3. License & Legal Finalization <2026-04-14 Tue>
CLOSED: [2026-04-17 Fri 11:25]
***** DONE Assign the AGPLv3 open-source license.
***** DONE Implement a broad Contributor License Agreement (CLA) process.
***** DONE Update `LICENSE` and `CHANGELOG` accordingly.
**** TODO 4. GitHub Migration & Repository Setup <2026-04-14 Tue>
***** TODO Migrate primary remote to GitHub and configure canonical repository.
***** TODO Set repository topics, badges, issue templates, and CI/CD foundations.
**** TODO 5. Marketing & Social Media Launch <2026-04-14 Tue>
***** TODO Execute PR plan (Reddit, Hacker News, X/Twitter).
***** TODO Create a short, high-quality terminal demo GIF/video of the TUI interaction.
*** PHASE: INTERACTIVE REFINEMENT (v0.2.0 Target)
:PROPERTIES:
:ID: proj-refinement-v0-2-0
:END:
Elevating the user interface from raw shell piping to a high-fidelity, native Lisp experience. Priority: Self-editing is the foundation of all future growth. Full org-mode manipulation makes the agent a true Emacs citizen.
Roadmap basis: Evolutionary roadmap from README.org. Working backwards from SOTA parity.
**** TODO 0. Autonomous Self-Editing Foundation
***** DONE org-skill-lisp-repair (Lisp syntax repair)
- Deterministic: auto-balance parens via paren-counting
- Probabilistic: LLM generates surgical fix on =:syntax-error= events
- Memory rollback on failure
DONE: Now in org-skill-lisp-utils (merged from contrib)
***** DONE org-skill-emacs-edit (full org-mode manipulation)
- Read org buffers, parse AST via org-element
- Create/update/delete headlines, set properties, manage TODO states
- Handle =id:= links and internal links
- Pure Lisp implementation (no Emacs subprocess)
***** TODO Implement local vector search (Ollama embeddings)
- =generate-embeddings= via Ollama API
- Add =:vector= slot to org-object
- Semantic search with cosine similarity over memory
***** TODO Implement tool permission tiers (ask/allow/deny)
- Per-tool permission plist stored in org-object
- =generate-tool-belt-prompt= filters denied tools before LLM sees them
- Ask-tier prompts user before execution
***** TODO Implement skill hot-reload (=:reload-skill= tool)
- Swap compiled skill files without breaking active sockets
- Reload skill into jailed package namespace
- DONE: Added :reload-skill, :read-file, :write-file, :replace-string tools
- DONE: Fixed ASDF compilation bug (position tracking issue with :serial t)
- DONE: Added explicit :depends-on declarations to opencortex.asd
**** DONE Engineering Process Improvements [2026-04-23 Wed]
***** DONE Fix ASDF compilation bug (position tracking at byte 16834)
- Root cause: Duplicate proto-get, bt: prefix issues, :serial t position cache
- Fix: Removed duplicate, fixed bt:->bordeaux-threads, explicit dependencies
- Added eval-when wrapper for new tools (good Lisp practice)
***** DONE Add test-first methodology to engineering standards
- Rule 10: Test-first - design tests before coding, run chaos testing
- Rule 11: Org as thinking medium - document investigations in prose
- Rule 12: Engineering decision audit trail - document root cause, tradeoffs
- Added to opencortex-contrib/skills/org-skill-engineering-standards.org
**** DONE 4. Core Skills Consolidation [2026-04-23 Thu]
- Merged lisp-validator + lisp-repair → org-skill-lisp-utils.org
- Added lisp utilities: count-char, deterministic-repair, neural-repair
- Added validation: structural, syntactic, semantic checks
- Moved org-skill-self-fix from contrib → core
- Moved org-skill-engineering-standards from contrib → core
- Deleted old org-skill-lisp-validator.org
**** TODO 5. Advanced CLI Onboarding Experience
***** TODO Implement interactive Lisp CLI wizard (=opencortex setup=)
***** TODO Implement =opencortex link <gateway>= for Telegram/Signal bot connection
***** TODO Implement =opencortex doctor= for environment health and API key validation
***** TODO Implement =opencortex install <skill>= for dynamic skill downloading
**** TODO 1. Common Lisp TUI Implementation
***** TODO Integrate =croatoan= for native terminal rendering
***** TODO Implement scrollable history viewport for chat and thought streams
***** TODO Implement fixed bottom input box with multi-line support and command history
***** TODO Implement persistent status bar for background workers (Scribe/Gardener)
***** TODO Support syntax highlighting for Lisp code blocks and Org-mode syntax
**** TODO 2. Slash Commands & Interactive Control
***** TODO Implement =/help= command for system overview
***** TODO Implement =/exit= and =/clear= commands
***** TODO Implement =/skill-load <name>= for dynamic hot-reloading
***** TODO Implement =/status=, =/config=, =/search=, =/commit= slash commands
**** TODO 3. Direct Lisp-to-Terminal Actuation
***** TODO Refactor the =:cli= actuator to use native TUI rendering
*** PHASE: EVENT ORCHESTRATION (v0.3.0)
:PROPERTIES:
:ID: proj-orchestration-v0-3-0
:END:
Unified control plane: hooks + cron + routing in one skill. Deep project understanding.
**** TODO 0. Event Orchestrator (unified hooks+cron+routing)
***** TODO Integrate contrib org-skill-event-orchestrator
- Merge *hook-registry* + *cron-registry* + complexity classifier
- Hooks via =#+HOOK:= Org-mode properties
- Three complexity tiers: =:REFLEX= (no LLM), =:COGNITION= (light LLM), =:REASONING= (full LLM)
- Hook into heartbeat for cron processing
**** TODO 1. Context Manager (project scoping)
***** TODO Integrate contrib org-skill-context-manager
- Stack-based context with =push-context= / =pop-context=
- Path resolution relative to current context
- Memory scope: =:scope= property on org-objects (memex/session/project)
**** TODO 2. Model-Tier Routing (cost optimization)
***** TODO Extend =*model-selector-fn= for complexity-based routing
- Heartbeats → smallest model
- User input → medium model
- Complex reasoning → large model
- Source: GBrain sub-agent model routing
**** TODO 3. Memory Scope Segmentation
***** TODO Extend org-object with =:scope= property
- =:memex= (permanent knowledge)
- =:session= (ephemeral context)
- =:project= (scoped to current work)
- Scope-aware retrieval in memory.lisp
**** TODO 4. Slash Commands (TUI ergonomics)
***** TODO M-x style command palette
***** TODO /- prefix for command mode
***** TODO Commands defined in Org-mode
*** PHASE: LONG-HORIZON PLANNING (v0.4.0)
:PROPERTIES:
:ID: proj-planning-v0-4-0
:END:
Multi-step task mastery, structured tracking with failure handling and course correction.
**** TODO 0. Long-Horizon Planning (task tree DAG)
***** TODO Implement org-skill-long-horizon
- Decompose complex tasks into Org-mode headline trees
- Terminal states: =:todo==:next-action==:in-progress==:done= / =:blocked= / =:stuck=
- Parent summarises child results
- Branch pruning when paths fail
- Source: Claude Code ULTRAPLAN (reimplemented in Lisp)
**** TODO 1. Git Steward (version control integration)
***** TODO Integrate contrib org-skill-git-steward
- Status, diff, commit, push, branch operations
- Policy: commit-before-modify gate (from contrib engineering-standards)
- Log commits to memory
**** TODO 2. TDD Runner Integration
***** TODO Integrate contrib org-skill-tdd-runner
- Run FiveAM tests on file save
- Inject =:test-failure= event on red
- Hook into self-fix for auto-repair proposals
**** TODO 3. Deep Emacs Integration
***** TODO Full org-agenda awareness
- Navigate, clock time, refile, archive
- Uses org-element + org-id
*** PHASE: CREATOR + ARCHITECT (v0.5.0)
:PROPERTIES:
:ID: proj-creator-v0-5-0
:END:
Agent bootstraps itself: creates skills autonomously, designs projects from PRDs, tracks work.
**** TODO 0. Skill Creator (autonomous skill generation)
***** TODO Integrate contrib org-skill-creator
- LLM drafts complete skill org-file from natural language
- Mandatory: syntax validation → jail-load → test → register
**** TODO 1. Architect Agent (PRD → PROTOCOL)
***** TODO Integrate contrib org-skill-architect
- Scan =:STATUS: FROZEN= PRDs
- Generate Phase B PROTOCOL from Phase A
- Write to same file
**** TODO 2. GTD Integration (project tracking)
***** TODO Integrate contrib org-skill-gtd
- Full GTD cycle: capture, clarify, organize, reflect, engage
- org-gtd v4.0 DAG (=:TRIGGER:=, =:BLOCKER:=)
**** TODO 3. Consensus Loop (multi-model agreement)
***** TODO Integrate contrib org-skill-consensus
- Run multiple providers for critical decisions
- Compare results, detect disagreements
- Confidence scoring
**** TODO 4. Web Research (Playwright browsing)
***** TODO Integrate contrib org-skill-playwright + org-skill-web-research
- Headless Chromium via Python bridge
- Text extraction and screenshots
- Gemini Web UI automation
**** TODO 5. Memex Management (PARA lifecycle)
***** TODO Integrate contrib org-skill-memex + org-skill-workspace-manager
- Archive DONE tasks, suggest refiling
- Detect orphaned nodes
- PARA/Zettelkasten maintenance
*** PHASE: SOTA PARITY (v1.0.0)
:PROPERTIES:
:ID: proj-sota-v1-0-0
:END:
Feature-complete agent competitive with commercial agents. All borrowed concepts reimplemented in pure Lisp.
All features from v0.2.0 through v0.5.0 combined, verified, and tested end-to-end.
| Area | Parity Target |
|------|--------------|
| Self-improvement | Claude Code self-debug |
| Planning | ULTRAPLAN equivalent |
| Tool ecosystem | 10+ cognitive tools |
| Context window | Semantic search + scope segmentation |
| Safety | 6 Policy invariants + formal verification |
| Multi-step tasks | Task trees with terminal states |
| Code editing | Full file read/write via org manipulation |
| Memory | Vector recall in org-object |
| Emacs integration | Full org-mode control (exceeds Claude Code) |
| Autonomy | 100% local capable (exceeds Claude Code) |
*** PHASE: LISP MACHINE EMERGENCE (v2.0.0)
:PROPERTIES:
:ID: proj-lisp-v2-0-0
:END:
From Lisp-using agent to true Lisp machine. Agent IS the Emacs process.
**** TODO Lish: Lisp editor as Org-mode IDE
- Org-babel for interactive Lisp evaluation
- Full REPL in TUI
- No bridge needed — direct memory access
**** TODO Lish: Shell replacement
- Lisp-based shell that speaks plists
- Org-mode buffers as file system
- No bash dependency
*** PHASE: NEUROSYMBOLIC MATURITY (v3.0.0)
:PROPERTIES:
:ID: proj-neuro-v3-0-0
:END:
Deterministic planner takes the wheel. LLM relegated to semantic translation.
**** TODO Deterministic planner
- Planner as pure Lisp function
- No LLM needed for scheduling
- Generates task graphs without probabilistic inference
**** TODO Self-correcting gates
- Gates learn from false positives (user override patterns)
- Adaptive threshold adjustment
*** PHASE: AI STACK INTERNALIZED (v4.0.0)
:PROPERTIES:
:ID: proj-ai-v4-0-0
:END:
The agent understands its own weights. No external inference.
**** TODO Llama.cpp in Lisp
- FFI binding to llama.cpp
- No Python subprocess
- Pure Common Lisp inference
**** TODO Weights as sexps
- Neural weights represented as Lisp data structures
- Homoiconic model introspection
*** PHASE: TRUE AGENCY (v5.0.0)
:PROPERTIES:
:ID: proj-agency-v5-0-0
:END:
World models, temporal reasoning, goal persistence across restarts.
**** TODO World models
- Agent builds predictive models of user behavior
- Project dynamics awareness
- System state forecasting
**** TODO Temporal reasoning
- Scheduling and deadline awareness
- Elapsed duration tracking
- Calendar integration
**** TODO Goal persistence
- Goals survive restarts
- Long-term projects tracked in org-objects
- Cross-session continuity
*** PHASE: EVOLUTIONARY ROADMAP (Previous — Superseded by Critical Analysis)
:PROPERTIES:
:ID: proj-old-roadmap
:END:
Superseded by the critical analysis-informed roadmap above (v0.2.0 through v5.0.0). This section kept for historical reference.
**** TODO v0.1.0: The Autonomous Foundation (Current Release) — Now COMPLETE
**** TODO v1.0.0 (Phase 2.5): The Verified Wrapper (SOTA Parity) — Now v1.0.0
**** TODO v2.0.0 (Phase 3): Cannibalizing the Toolchain — Now v2.0.0
**** TODO v3.0.0 (Phase 4): True Symbolic Determinism — Now v3.0.0
*** PHASE: FOUNDATION (Complete)
**** DONE Draft Swank/Socket communication protocol between CL and Emacs
:PROPERTIES:
:CREATED: [2026-03-22 Sun 14:00]
:ASSIGNED: Agent
:END:
**** DONE Implement core Perceive-Think-Act loop in Common Lisp
:PROPERTIES:
:CREATED: [2026-03-22 Sun 14:00]
:ASSIGNED: Agent
:END:
**** DONE Implement Persistent Object-Store for Org entities in CL
:PROPERTIES:
:CREATED: [2026-03-22 Sun 16:30]
:ASSIGNED: Agent
:END:
**** DONE Implement LLM Connector (Probabilistic Engine) in CL Daemon
:PROPERTIES:
:CREATED: [2026-03-22 Sun 17:30]
:ASSIGNED: Agent
:END:
**** DONE Design Deterministic Engine Heuristics (Lisp logic over Memory)
:PROPERTIES:
:CREATED: [2026-03-22 Sun 17:30]
:END:
**** DONE Achieve Phase 3: The Self-Editing Kernel
:PROPERTIES:
:CREATED: [2026-03-23 Mon 16:30]
:END:
- Jailing & Sandboxing implemented
- Org-Native Skill Standard established
- Telemetry & Introspection API active
*** PHASE: THE SOVEREIGN BOUNDARY (Core vs Skills Refactor)
:PROPERTIES:
:ID: proj-autonomous-boundary
:END:
Slim down the opencortex microharness by moving non-essential cognitive functions to hot-reloadable user-space skills.
**** DONE Extract LLM Provider Routing to a Skill (neuro.lisp)
**** DONE Extract Vector Embedding Algorithms to a Skill (embedding.lisp)
CLOSED: [2026-04-12 Sun 14:10]
:PROPERTIES:
:ID: extract-embedding-skill
:END:
- Created `org-skill-embedding.org`.
- Moved logic to `src/embedding-logic.lisp` via tangling.
- Updated `system-definition.org`.
**** DONE Extract Sparse Tree Context Pruning Strategies to a Skill (context.lisp)
CLOSED: [2026-04-12 Sun 14:25]
:PROPERTIES:
:ID: extract-context-skill
:END:
- Created `org-skill-peripheral-vision.org`.
- Moved logic to `src/context-logic.lisp` via tangling.
- Updated `system-definition.org`.
**** DONE Implement `org-skill-peripheral-vision` (Moving embedding logic out of core)
CLOSED: [2026-04-12 Sun 14:25]
:PROPERTIES:
:ID: impl-peripheral-vision
:END:
**** DONE Implement communication protocol Schema Validation (Prevent reader macro injection in communication.lisp)
CLOSED: [2026-04-12 Sun 14:45]
:PROPERTIES:
:ID: communication-protocol-schema-validation
:END:
- Created `org-skill-protocol-validator.org`.
- Integrated `validate-communication-protocol-schema` into `communication.org`.
- Added `protocol-validator.lisp` to system definition.
**** DONE Implement Pluggable communication protocol Integrity Hashing (Core interface, Skill-based algorithms)
CLOSED: [2026-04-12 Sun 15:15]
:PROPERTIES:
:ID: communication-protocol-integrity-hashing
:END:
- Integrated HMAC-SHA256 (`ironclad:make-mac`) in `literate/communication.org`.
**** DONE Implement Native Lisp Merkle-Tree Versioning (Short-term undo buffer in memory.lisp)
CLOSED: [2026-04-12 Sun 19:15]
**** DONE Performance: Implement Copy-on-Write (CoW) or Persistent Data Structures for Memory
CLOSED: [2026-04-12 Sun 19:15]
**** DONE Feature: Implement Latent Reflection (Proactive Gardening) using heartbeat idle cycles
CLOSED: [2026-04-12 Sun 19:15]
**** DONE Simplification: Refactor Cognitive Cycle into a Unified Reactive Signal Pipeline
CLOSED: [2026-04-12 Sun 19:15]
**** DONE Resilience: Implement Micro-Rollbacks for the Immune System
CLOSED: [2026-04-12 Sun 19:15]
**** DONE Implement `org-skill-memory-archivist` (Long-term IPFS checkpointing and P2P sync)
CLOSED: [2026-04-12 Sun 19:15]
**** DONE Implement True Lisp Sandboxing (eval-safe mechanism in core and policy in skills)
CLOSED: [2026-04-12 Sun 19:15]
**** DONE Decouple Vendor Logic from Probabilistic Engine (Move Google/Anthropic/OpenAI to Skills)
CLOSED: [2026-04-12 Sun 19:15]
**** DONE Component IV: Comprehensive Core Skill Audit (Review all 39 skills)
CLOSED: [2026-04-12 Sun 19:45]
:PROPERTIES:
:ID: core-skill-audit-task
:END:
**** DONE Consolidation I: Unified LLM Gateway (Anthropic, Gemini, Groq, OpenAI, etc.)
**** DONE Consolidation II: Credentials Vault (Secure Enclave & Masked Logging)
**** DONE Consolidation III: Homoiconic Memory (Unified Grammar, Bridge, & ID Generation)
**** DONE Consolidation IV: State Persistence Layer (Unified Local & IPFS Checkpointing)
**** DONE Consolidation V: Event Orchestrator (Unified Cron, Hooks, & Cognitive Routing)
**** DONE Consolidation VI: Task Orchestrator (Task Integrity, Delegation, & Consensus)
CLOSED: [2026-04-11 Sat 13:45]
:PROPERTIES:
:ID: task-orchestrator-consolidation
:END:
- Implemented Parallel Multi-Backend Consensus in neuro.lisp.
- Implemented Task Integrity (GTD semantics) in symbolic.lisp.
- Integrated Consensus Gate and Delegation hooks in core.lisp.
- Verified with new task-orchestrator-tests.lisp.
**** DONE Implement Unified Envelope Architecture & Channel-Awareness
CLOSED: [2026-04-20 Mon 13:20]
- Removed specialized :CHAT type; reverted to semantic :REQUEST/:EVENT protocol.
- Decoupled routing metadata into a :META envelope (SOURCE, SESSION-ID).
- Updated TUI, Emacs, and CLI gateways to use the unified protocol.
- Verified end-to-end loop with TUI; kernel correctly routes responses back to origin interface.
- Achieved "Equality of Clients" mandate.
**** IN-PROGRESS Full review of opencortex's harness
:PROPERTIES:
:CREATED: [2026-04-13 Mon 13:30]
:ASSIGNED: Agent
:END:
- [X] Audit terminology: Replaced OACP with "communication protocol" workspace-wide.
- [X] Audit boot sequence: Synchronized loader with `org-skill-policy.org`.
- [X] Implement Unified Envelope (Channel-Aware Routing).
- [-] Audit core Perceive-Think-Act loop.
- [X] Verified protocol framing and reader jailing (`*read-eval* nil`).
- [X] Refactored `loop.org` for literate granularity and configuration externalization.
- [X] Improved error handling (restricted rollback) and added graceful shutdown.
- [X] **FIXED:** Implemented symbolic guard check in `act-gate` via Bouncer skill refactoring.
- [X] **FIXED:** Harness `deterministic-verify` now correctly respects skill triggers.
- [X] Ensure alignment with System Policy and Engineering Standards.
- [X] Restored structural integrity by fixing `manifest.org` loading sequence.
**** TODO Wake up the Scribe (Implement autonomous weekly Journal-to-Ledger distillation in org-skill-scribe.org)
**** TODO Implement `org-skill-lisp-repair` (Self-correcting syntax gate for Deterministic Engine)
CLOSED: [2026-04-11 Sat 15:10]
:PROPERTIES:
:ID: lisp-repair-gate
:END:
- Implemented asynchronous, event-driven repair logic.
- Decoupled core from repair logic (emits `:syntax-error` event).
- Proven via lisp-repair-tests.lisp (Asynchronous flow verified).
**** DONE Implement `org-skill-formal-verification` (Prove safety of high-impact actions)
CLOSED: [2026-04-11 Sat 18:15]
:PROPERTIES:
:ID: formal-verification-task
:END:
- Implemented `org-skill-formal-verification.org`.
- Created Lisp-Native Symbolic Prover for security invariants.
- Implemented `path-confinement` invariant (restricted to memex root).
- Implemented `no-network-exfil` invariant (blocking nc, ssh, etc).
- Verified with `formal-verification-tests.lisp`.
*** PHASE: DETERMINISTIC ENGINE REFINEMENT
**** DONE Verify Autonomous Self-Fix Loop
CLOSED: [2026-04-11 Sat 14:20]
:PROPERTIES:
:CREATED: [2026-03-23 Mon 16:30]
:END:
- Proven repair capability via self-fix-tests.lisp.
- Verified surgical code patching and hot-reloading.
- Documentation and RCA complete.
**** DONE Implement "Planning Mode" (Deterministic Engine Bouncer) for Complex Actions
CLOSED: [2026-04-11 Sat 15:30]
:PROPERTIES:
:CREATED: [2026-04-01 Wed 17:00]
:END:
- Implemented `bouncer-check` interceptor in `symbolic.lisp`.
- Created `org-skill-bouncer.org` for flight plan serialization.
- Verified asynchronous Org-native approval loop via `bouncer-tests.lisp`.
**** DONE Implement Authorization Gate (communication protocol) for "Planning Mode"
CLOSED: [2026-04-11 Sat 15:30]
:PROPERTIES:
:CREATED: [2026-04-01 Wed 17:00]
:END:
- Integrated with Org-mode state transitions (`PLAN` -> `APPROVED`).
- Leveraged Memory event bus for asynchronous re-injection.
**** DONE Refactor Architecture Terminology (Associative -> Probabilistic, Deliberate -> Deterministic)
CLOSED: [2026-04-12 Sun 21:00]
:PROPERTIES:
:ID: terminology-refactor-task
:END:
- Updated codebase-wide terminology to use Probabilistic/Deterministic Engines.
- Replaced System 1/2 with Probabilistic/Deterministic Engines respectively.
**** DONE Refactor org-skill-policy.org: Concrete Invariants, Conflict Hierarchy, and Auditable Gate
CLOSED: [2026-04-22 Wed 11:50]
:PROPERTIES:
:ID: policy-refactor-concrete-invariants
:END:
- Added explicit Override Hierarchy (Transparency > Autonomy > Bloat > Mentorship > Sustainability).
- Implemented `policy-check-transparency`: blocks user-facing actions without :explanation.
- Implemented `policy-check-autonomy`: flags proprietary domain references as autonomy debt.
- Implemented `policy-check-bloat`: warns on :create-skill actions exceeding size threshold.
- Implemented `policy-check-mentorship`: blocks high-impact actions missing :mentorship-note.
- Implemented `policy-check-sustainability`: logs cloud-provider usage as sustainability debt.
- Implemented `policy-explain`: formats auditable rationale for every policy decision.
- Implemented `policy-find-engineering-standards-gate`: robust cross-package search for standards skill.
- Hardened `policy-deterministic-gate`: never returns NIL silently; always returns action or auditable log.
- Raised skill priority from 100 to 500 to ensure it runs before other deterministic gates.
**** DONE Add Invariant 6 (Modularity) and Harness Boundary Contract to Policy/Manifest
CLOSED: [2026-04-22 Wed 12:10]
:PROPERTIES:
:ID: policy-modularity-invariant
:END:
- Added Modularity as Invariant 6 in `org-skill-policy.org`: general life principle that complexity must live at the edges.
- Implemented `policy-check-modularity`: blocks modifications to protected core paths unless `:modularity-justification` is provided.
- Defined `*modularity-protected-paths*` as project-configurable variable (defaults: harness/, opencortex.asd).
- Updated Override Hierarchy to include Modularity between Bloat and Mentorship.
- Added Harness Boundary Contract section to `harness/manifest.org` documenting primary boundary files and generated artifacts.
- Converted checkbox sub-tasks to hierarchical TODO headlines in gtd.org per GTD standard.
**** DONE Implement `org-skill-lisp-validator` (3-phase deterministic validation gate)
CLOSED: [2026-04-22 Wed 12:30]
:PROPERTIES:
:ID: lisp-validator-implementation
:END:
- Created 3-phase validation pipeline: Structural (O(n) paren scanner), Syntactic (reader with *read-eval* nil), Semantic (whitelist AST walk).
- Implemented `lisp-validator-validate` returning structured plists for machine parsing.
- Exposed `:validate-lisp` cognitive tool for Probabilistic Engine self-correction.
- Replaced `validate-lisp-syntax` in `harness/skills.org` with delegation to the validator.
- Added mandatory validation rule to Probabilistic Engine system prompt in `harness/reason.org`.
- Fixed paren balance and `return-from` compilation errors in org source; tangled and validated in SBCL.
**** DONE Fix Skill Loader to Respect `:tangle` Blocks and Eliminate Circular Dependency
CLOSED: [2026-04-22 Wed 12:45]
:PROPERTIES:
:ID: skill-loader-tangle-fix
:END:
- Updated `load-skill-from-org` in `harness/skills.org` to only collect blocks with `:tangle` directives pointing to runtime `.lisp` files, excluding `tests/` and `test/` paths.
- Added fallback to `validate-lisp-syntax` so it uses a basic reader check when `lisp-validator-validate` is not yet loaded (breaks circular harness->skill dependency).
- Verified full boot: 13/13 skills loaded successfully into SBCL, including `skill-lisp-validator` at priority 900 and `skill-policy` at priority 500.
*** TRACK: SECURITY & CONTAINMENT (The 5-Vector Bouncer Matrix)
**** DONE Implement Path-Based Scoping for File Writes (DNA/State vs Work)
CLOSED: [2026-04-12 Sun 15:15]
:PROPERTIES:
:ID: path-based-scoping
:END:
- Implemented as `path-confinement` invariant in `org-skill-formal-verification.org`.
**** DONE Implement Network Exfiltration Gate (Intercept generic HTTP requests)
CLOSED: [2026-04-12 Sun 15:15]
:PROPERTIES:
:ID: network-exfiltration-gate
:END:
- Implemented as `no-network-exfil` invariant in `org-skill-formal-verification.org`.
**** TODO Implement Secret Exposure Gate (Intercept reads to .env, keys)
*** TRACK: INTELLIGENCE & ACTUATION (The Engines)
**** DONE Verify individual provider track (Anthropic, Gemini, Groq, OpenAI, OpenRouter, Ollama)
CLOSED: [2026-04-11 Sat 15:45]
:PROPERTIES:
:ID: provider-verification-track
:END:
- Added unit tests for each provider in `llm-gateway-tests.lisp`.
- Mocked `dex:post` to verify JSON payload formatting and response parsing.
- Implemented robust `get-nested` helper to handle various provider structures.
- Integrated `llm-gateway` and `credentials-vault` into `opencortex.asd`.
**** TODO Verify org-skill-shell-actuator formal safety harnesses
**** DONE Build Playwright-Python Bridge for high-fidelity browsing
CLOSED: [2026-04-11 Sat 18:30]
:PROPERTIES:
:ID: playwright-bridge-task
:END:
- Created `scripts/browser-bridge.py` (Playwright wrapper).
- Implemented `org-skill-playwright.org`.
- Registered `:browser` cognitive tool (JS-rendering, text extraction, screenshots).
- Updated `Dockerfile` with Python/Playwright dependencies.
- Verified with `playwright-tests.lisp`.
*** TRACK: COMMUNICATION & INTERFACES
**** DONE Implement org-skill-gateway-telegram
CLOSED: [2026-04-11 Sat 16:15]
:PROPERTIES:
:ID: gateway-telegram-task
:END:
- Implemented `org-skill-gateway-telegram.org`.
- Added automated background polling for Telegram GetUpdates.
- Implemented `:telegram` actuator for outbound responses.
- Refactored `org-skill-chat` to be channel-aware.
- Verified with `gateway-telegram-tests.lisp`.
**** DONE Implement org-skill-gateway-signal
CLOSED: [2026-04-11 Sat 16:50]
:PROPERTIES:
:ID: gateway-signal-task
:END:
- Implemented `org-skill-gateway-signal.org` (signal-cli wrapper).
- Added background polling for `signal-cli receive --json`.
- Implemented `:signal` actuator for outbound responses.
- Updated `org-skill-chat` to support Signal channel.
- Verified with `gateway-signal-tests.lisp`.
**** DONE Implement org-skill-gateway-matrix
CLOSED: [2026-04-11 Sat 17:15]
:PROPERTIES:
:ID: gateway-matrix-task
:END:
- Implemented `org-skill-gateway-matrix.org` (Client-Server API).
- Added background polling for `/sync` with token persistence.
- Implemented `:matrix` actuator for `m.room.message` delivery.
- Updated `org-skill-chat` to support Matrix channel and room IDs.
- Verified with `gateway-matrix-tests.lisp`.
*** TRACK: DEPLOYMENT & INFRASTRUCTURE
**** DONE Create Dockerfile and docker-compose.yml for containerized setup
CLOSED: [2026-04-11 Sat 17:30]
:PROPERTIES:
:ID: docker-infra-task
:END:
- Created `Dockerfile` (Debian-based, SBCL + Quicklisp + signal-cli).
- Created `docker-compose.yml` with host-volume mapping for memex.
- Created `docs/deployment.org` guide.
**** TODO Create Bare Metal installation scripts/playbooks
**** TODO Create LXC (Linux Containers) template/guide
**** TODO Create VM Vagrantfiles/Cloud-init configs
*** TRACK: MAINTENANCE & HYGIENE
**** TODO [RECURRING: Monthly] Review and test Infrastructure Dependency Upgrades
:PROPERTIES:
:ID: monthly-infra-audit
:REPEAT_TO_STATE: TODO
:END:
***** TODO Check for new Debian security patches (`apt-get update` check)
***** TODO Check for new `signal-cli` releases (compare vs v0.14.0)
***** TODO Check for new Quicklisp distribution (monthly snapshot)
***** TODO Verification: Update `Dockerfile`, run `docker-compose build --no-cache`, and execute full test suite
***** TODO If all tests pass, commit updated `Dockerfile` and `.asd` dependencies
*** TRACK: COMMUNITY & DOCS
**** TODO Write Quickstart Guide
**** TODO Write Skill Creation Guide
**** TODO Write Architecture Deep-Dive
**** TODO Clean up GitHub repository structure and add CI/CD
**** TODO Create Marketing Material (Landing page copy, diagrams)
**** TODO Draft Release Plan checklist
*** SUB-PROJECT: THE BOOT SEQUENCE (skills.lisp)
:PROPERTIES:
:ID: proj-skill-boot-sequence
:END:
**** DONE Refactor `skills.lisp` into a Micro-Loader (Harness)
CLOSED: [2026-04-12 Sun 19:10]
**** DONE Implement Topological Sort based on `#+DEPENDS_ON:` tags
CLOSED: [2026-04-12 Sun 15:15]
:PROPERTIES:
:ID: topological-sort-skills
:END:
- Implemented in `literate/skills.org`.
**** DONE Enforce `org-skill-system-invariants` as the mandatory Gateway Skill (Loaded first)
CLOSED: [2026-04-12 Sun 15:15]
:PROPERTIES:
:ID: enforce-mandatory-skill
:END:
- Enforced in `initialize-all-skills` in `literate/skills.org`.
**** DONE Formalize the "Minimal Boot Set" (Router, Vision, Steward, Actuator)
CLOSED: [2026-04-12 Sun 19:10]
- Verified during the Minimal Boot Set Verification phase.
:PROPERTIES:
:ID: proj-opencortex-v1-0
:Engineering-STATE: D: BUILD
:CREATED: [2026-03-09 Mon 14:23]
:END:
OpenCortex: A Neurosymbolic AI Agent.
Full project tasks: [[file:projects/opencortex/TODO.org][OpenCortex TODO.org]]
** NEXT Engineering Core: Role Automation
:PROPERTIES:

189
inbox.org
View File

@@ -157,3 +157,192 @@ This is the inbox. Everything goes in here when you capture it.
:CREATED: [2026-04-17 Fri 14:52]
:END:
* [[https://www.jori.com/en/products/pacific-jr-9700][Pacific Pure | Sofas | Product | Design furniture | JORI]] :furniture:years:
:PROPERTIES:
:TITLE: Pacific Pure | Sofas | Product | Design furniture | JORI
:URI: https://www.jori.com/en/products/pacific-jr-9700
:CREATED: [2026-04-21 Tue 15:25]
:END:
* [[https://papers.ssrn.com/sol3/papers.cfm?abstract_id=6372438][AI Agent Traps by Matija Franklin, Nenad Tomašev, Julian Jacobs, Joel Z. Leibo, Simon Osindero :: SSRN]]
:PROPERTIES:
:TITLE: AI Agent Traps by Matija Franklin, Nenad Tomašev, Julian Jacobs, Joel Z. Leibo, Simon Osindero :: SSRN
:URI: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=6372438
:CREATED: [2026-04-21 Tue 15:26]
:END:
* [[https://www.storagereview.com/review/comino-grando-rtx-pro-6000-review-768gb-of-vram-in-a-liquid-cooled-4u-chassis][Comino Grando RTX PRO 6000 Review: 768GB of VRAM in a Liquid-Cooled 4U Chassis - StorageReview.com]]
:PROPERTIES:
:TITLE: Comino Grando RTX PRO 6000 Review: 768GB of VRAM in a Liquid-Cooled 4U Chassis - StorageReview.com
:URI: https://www.storagereview.com/review/comino-grando-rtx-pro-6000-review-768gb-of-vram-in-a-liquid-cooled-4u-chassis
:CREATED: [2026-04-21 Tue 15:26]
:END:
* [[https://x.com/elvissun/status/2044784140831301728/photo/1][Elvis on X: "some agentic engineering realization: stop reviewing code. start reviewing contracts. and here's what i mean. the highest leverage work right now is drawing the right boundaries in your system. i've been splitting the system into multiple sub-systems, each with clearly defined https://t.co/Hy0d9WHI1m" / X]]
:PROPERTIES:
:TITLE: Elvis on X: "some agentic engineering realization: stop reviewing code. start reviewing contracts. and here's what i mean. the highest leverage work right now is drawing the right boundaries in your system. i've been splitting the system into multiple sub-systems, each with clearly defined https://t.co/Hy0d9WHI1m" / X
:URI: https://x.com/elvissun/status/2044784140831301728/photo/1
:CREATED: [2026-04-21 Tue 15:26]
:END:
* [[https://x.com/i/status/2044307601463357791][EverMars on X: "Respect to the Man Chasing AI Immortality, Even Though He's Freeloading Off Our Platform" / X]]
:PROPERTIES:
:TITLE: EverMars on X: "Respect to the Man Chasing AI Immortality, Even Though He's Freeloading Off Our Platform" / X
:URI: https://x.com/i/status/2044307601463357791
:CREATED: [2026-04-21 Tue 15:26]
:END:
* [[https://x.com/i/status/2045289299269070978][Seth Howes on X: "Ive wanted to do this for a decade. But I never did - I refuse to give any company my DNA. It is me. So this week I sequenced my genome entirely at home. Literally on my kitchen table. I never exposed my DNA sequence to the internet. Not at any point. I used a MinION to do https://t.co/qCzXIGxWsy" / X]]
:PROPERTIES:
:TITLE: Seth Howes on X: "Ive wanted to do this for a decade. But I never did - I refuse to give any company my DNA. It is me. So this week I sequenced my genome entirely at home. Literally on my kitchen table. I never exposed my DNA sequence to the internet. Not at any point. I used a MinION to do https://t.co/qCzXIGxWsy" / X
:URI: https://x.com/i/status/2045289299269070978
:CREATED: [2026-04-21 Tue 15:27]
:END:
* [[https://arxiv.org/html/2603.21852v2][All elementary functions from a single operator]]
:PROPERTIES:
:TITLE: All elementary functions from a single operator
:URI: https://arxiv.org/html/2603.21852v2
:CREATED: [2026-04-26 Sun 11:05]
:END:
* [[https://github.com/abhigyanpatwari/GitNexus][abhigyanpatwari/GitNexus: GitNexus: The Zero-Server Code Intelligence Engine - GitNexus is a client-side knowledge graph creator that runs entirely in your browser. Drop in a GitHub repo or ZIP file, and get an interactive knowledge graph wit a built in Graph RAG Agent. Perfect for code exploration]]
:PROPERTIES:
:TITLE: abhigyanpatwari/GitNexus: GitNexus: The Zero-Server Code Intelligence Engine - GitNexus is a client-side knowledge graph creator that runs entirely in your browser. Drop in a GitHub repo or ZIP file, and get an interactive knowledge graph wit a built in Graph RAG Agent. Perfect for code exploration
:URI: https://github.com/abhigyanpatwari/GitNexus
:CREATED: [2026-04-26 Sun 11:05]
:END:
* [[https://medium.com/@fzbcwvv/an-overnight-stack-for-qwen3-6-27b-85-tps-125k-context-vision-on-one-rtx-3090-0d95c6291914][An Overnight Stack for Qwen3.627B: 85 TPS, 125K Context, Vision — on One RTX 3090 | Medium]]
:PROPERTIES:
:TITLE: An Overnight Stack for Qwen3.627B: 85 TPS, 125K Context, Vision — on One RTX 3090 | Medium
:URI: https://medium.com/@fzbcwvv/an-overnight-stack-for-qwen3-6-27b-85-tps-125k-context-vision-on-one-rtx-3090-0d95c6291914
:CREATED: [2026-04-26 Sun 11:06]
:END:
* [[https://x.com/i/status/2047124337191444844][Shiv on X: "A new way to think about composing skills to increase leverage: Skill Graphs 2.0" / X]]
:PROPERTIES:
:TITLE: Shiv on X: "A new way to think about composing skills to increase leverage: Skill Graphs 2.0" / X
:URI: https://x.com/i/status/2047124337191444844
:CREATED: [2026-04-26 Sun 16:34]
:END:
* [[https://x.com/i/status/2047558951303028855][Eric ⚡️ Building... on X: "My 4090 went from 26 -&gt; 154 tok/s Qwen 3.6 27B🤯 Same GPU. Same Q4_K_M . No FP8, no extra quant. The unlock: ik_llama.cpp + speculative decoding using Qwen3-1.7B as the draft model. 85% acceptance rate. Full config + benchmarks 👇🏻 https://t.co/NUZec2Y7J0" / X]]
:PROPERTIES:
:TITLE: Eric ⚡️ Building... on X: "My 4090 went from 26 -&gt; 154 tok/s Qwen 3.6 27B🤯 Same GPU. Same Q4_K_M . No FP8, no extra quant. The unlock: ik_llama.cpp + speculative decoding using Qwen3-1.7B as the draft model. 85% acceptance rate. Full config + benchmarks 👇🏻 https://t.co/NUZec2Y7J0" / X
:URI: https://x.com/i/status/2047558951303028855
:CREATED: [2026-04-26 Sun 16:34]
:END:
* [[https://x.com/i/status/2047033293460410638][Sudo su on X: "for anyone running along, here is the setup. weights from unsloth: https://t.co/b89HJ2JC5O launched with: ./llama-server -m Qwen3.6-27B-Q4_K_M.gguf -ngl 99 -c 262144 -np 1 -fa on --cache-type-k q4_0 --cache-type-v q4_0 same exact flags that held the 3.5 dense baseline at 35.3" / X]]
:PROPERTIES:
:TITLE: Sudo su on X: "for anyone running along, here is the setup. weights from unsloth: https://t.co/b89HJ2JC5O launched with: ./llama-server -m Qwen3.6-27B-Q4_K_M.gguf -ngl 99 -c 262144 -np 1 -fa on --cache-type-k q4_0 --cache-type-v q4_0 same exact flags that held the 3.5 dense baseline at 35.3" / X
:URI: https://x.com/i/status/2047033293460410638
:CREATED: [2026-04-26 Sun 16:34]
:END:
* [[https://x.com/i/status/2046898117241635240][Hasan Toor on X: "Goodbye Claude Code subscription fees. Someone just built a proxy that runs Claude Code completely free... and it's wild. You literally plug in a free NVIDIA API key and point Claude Code at localhost. That's it. It handles everything: - Converts Anthropic API calls to NVIDIA https://t.co/10v4KdymxH" / X]]
:PROPERTIES:
:TITLE: Hasan Toor on X: "Goodbye Claude Code subscription fees. Someone just built a proxy that runs Claude Code completely free... and it's wild. You literally plug in a free NVIDIA API key and point Claude Code at localhost. That's it. It handles everything: - Converts Anthropic API calls to NVIDIA https://t.co/10v4KdymxH" / X
:URI: https://x.com/i/status/2046898117241635240
:CREATED: [2026-04-26 Sun 16:34]
:END:
* [[https://x.com/i/status/2047295369583964385][Graeme on X: "The Local LLM Cheat Sheet for Your 64GB RAM Device We covered 16GB and 32GB already, and 64GB has been the next big request, which I can understand, because this is where things get very interesting. Here's the practical cheat sheet for a 64GB RAM machine for code, math, https://t.co/ohgkjbU0LK" / X]]
:PROPERTIES:
:TITLE: Graeme on X: "The Local LLM Cheat Sheet for Your 64GB RAM Device We covered 16GB and 32GB already, and 64GB has been the next big request, which I can understand, because this is where things get very interesting. Here's the practical cheat sheet for a 64GB RAM machine for code, math, https://t.co/ohgkjbU0LK" / X
:URI: https://x.com/i/status/2047295369583964385
:CREATED: [2026-04-26 Sun 16:34]
:END:
* [[https://github.com/codejunkie99/agentic-stack][codejunkie99/agentic-stack: One brain, many harnesses. Portable .agent/ folder (memory + skills + protocols) that plugs into Claude Code, Cursor, Windsurf, OpenCode, OpenClaw, Hermes, or DIY Python — and keeps its knowledge when you switch.]]
:PROPERTIES:
:TITLE: codejunkie99/agentic-stack: One brain, many harnesses. Portable .agent/ folder (memory + skills + protocols) that plugs into Claude Code, Cursor, Windsurf, OpenCode, OpenClaw, Hermes, or DIY Python — and keeps its knowledge when you switch.
:URI: https://github.com/codejunkie99/agentic-stack
:CREATED: [2026-04-27 Mon 09:23]
:END:
* [[https://github.com/public-apis/public-apis][public-apis/public-apis: A collective list of free APIs]]
:PROPERTIES:
:TITLE: public-apis/public-apis: A collective list of free APIs
:URI: https://github.com/public-apis/public-apis
:CREATED: [2026-04-27 Mon 09:23]
:END:
* [[https://github.com/stanford-iris-lab/meta-harness][stanford-iris-lab/meta-harness: Reference code for the Meta-Harness paper.]]
:PROPERTIES:
:TITLE: stanford-iris-lab/meta-harness: Reference code for the Meta-Harness paper.
:URI: https://github.com/stanford-iris-lab/meta-harness
:CREATED: [2026-04-27 Mon 09:23]
:END:
* [[https://github.com/thePM001/AEP-agent-element-protocol/tree/main][thePM001/AEP-agent-element-protocol: AEP (Agent Element Protocol) v2.5 | Deterministic zero-trust total control and governance protocol for AI agents. | Reduce hallucinations to zero through architecure in all constrained domains of application. | LLMs gave you the engines, AEP gives you the control for the thrusters.]]
:PROPERTIES:
:TITLE: thePM001/AEP-agent-element-protocol: AEP (Agent Element Protocol) v2.5 | Deterministic zero-trust total control and governance protocol for AI agents. | Reduce hallucinations to zero through architecure in all constrained domains of application. | LLMs gave you the engines, AEP gives you the control for the thrusters.
:URI: https://github.com/thePM001/AEP-agent-element-protocol/tree/main
:CREATED: [2026-04-27 Mon 09:24]
:END:
* [[https://x.com/i/status/2048381278953603406][GREG ISENBERG on X: "agreed that the the modern computer probably has to be reinvented 12 "tiny" startup ideas that ride that wave: 1. a "where did I put that" app. you describe what you're looking for in plain english and it searches across every app, folder, email, and slack message you've ever" / X]]
:PROPERTIES:
:TITLE: GREG ISENBERG on X: "agreed that the the modern computer probably has to be reinvented 12 "tiny" startup ideas that ride that wave: 1. a "where did I put that" app. you describe what you're looking for in plain english and it searches across every app, folder, email, and slack message you've ever" / X
:URI: https://x.com/i/status/2048381278953603406
:CREATED: [2026-04-27 Mon 09:24]
:END:
* [[https://github.com/iptv-org/awesome-iptv][iptv-org/awesome-iptv: A curated list of resources related to IPTV]]
:PROPERTIES:
:TITLE: iptv-org/awesome-iptv: A curated list of resources related to IPTV
:URI: https://github.com/iptv-org/awesome-iptv
:CREATED: [2026-04-27 Mon 09:24]
:END:
* [[https://github.com/iptv-org/iptv][iptv-org/iptv: Collection of publicly available IPTV channels from all over the world]]
:PROPERTIES:
:TITLE: iptv-org/iptv: Collection of publicly available IPTV channels from all over the world
:URI: https://github.com/iptv-org/iptv
:CREATED: [2026-04-27 Mon 09:25]
:END:
* [[https://github.com/iptv-org/epg][iptv-org/epg: Utilities for downloading the EPG (Electronic Program Guide) for thousands of TV channels from hundreds of sources.]]
:PROPERTIES:
:TITLE: iptv-org/epg: Utilities for downloading the EPG (Electronic Program Guide) for thousands of TV channels from hundreds of sources.
:URI: https://github.com/iptv-org/epg
:CREATED: [2026-04-27 Mon 09:25]
:END:
* [[https://arxiv.org/abs/2604.22709][[2604.22709] Thinking Without Words: Efficient Latent Reasoning with Abstract Chain-of-Thought]]
:PROPERTIES:
:TITLE: [2604.22709] Thinking Without Words: Efficient Latent Reasoning with Abstract Chain-of-Thought
:URI: https://arxiv.org/abs/2604.22709
:CREATED: [2026-04-28 Tue 09:50]
:END:
* [[https://x.com/i/status/2048587253145108626][鸟哥 | 蓝鸟会🕊️ on X: "吓到我了! GitHub上有个工具叫GhostTrack输入一个手机号能直接扫出这人在哪些平台注册过账号还能查IP定位、运营商信息。 克隆代码跑脚本5分钟搞定门槛低得离谱。你以为自己在网上隐身呢 早被扒得透透的了。信息安全这事,真得重视起来。 🔗 https://t.co/yVGCsmsjyi https://t.co/UyhOY6wHq6" / X]]
:PROPERTIES:
:TITLE: 鸟哥 | 蓝鸟会🕊️ on X: "吓到我了! GitHub上有个工具叫GhostTrack输入一个手机号能直接扫出这人在哪些平台注册过账号还能查IP定位、运营商信息。 克隆代码跑脚本5分钟搞定门槛低得离谱。你以为自己在网上隐身呢 早被扒得透透的了。信息安全这事,真得重视起来。 🔗 https://t.co/yVGCsmsjyi https://t.co/UyhOY6wHq6" / X
:URI: https://x.com/i/status/2048587253145108626
:CREATED: [2026-04-28 Tue 09:50]
:END:
* [[https://uxdesign.cc/where-should-ai-sit-in-your-ui-1710a258390e][Where should AI sit in your UI?. Mapping emerging AI UI patterns and how… | by Sharang Sharma | UX Collective]]
:PROPERTIES:
:TITLE: Where should AI sit in your UI?. Mapping emerging AI UI patterns and how… | by Sharang Sharma | UX Collective
:URI: https://uxdesign.cc/where-should-ai-sit-in-your-ui-1710a258390e
:CREATED: [2026-04-28 Tue 09:50]
:END:
* [[https://x.com/i/status/2049011134426906635][Shakker on X: "OpenClaw's first output dropped from 1s to 43ms. Plugin bootstrap went from 265ms to 8ms. Provider capability resolution from 49ms to 1.5ms. Config validation from 62ms to 5ms. For most of OpenClaw's history, the plugin system was carrying core, instead of the other way around." / X]]
:PROPERTIES:
:TITLE: Shakker on X: "OpenClaw's first output dropped from 1s to 43ms. Plugin bootstrap went from 265ms to 8ms. Provider capability resolution from 49ms to 1.5ms. Config validation from 62ms to 5ms. For most of OpenClaw's history, the plugin system was carrying core, instead of the other way around." / X
:URI: https://x.com/i/status/2049011134426906635
:CREATED: [2026-04-28 Tue 09:51]
:END:
* [[https://github.com/lithos-ai/motus][lithos-ai/motus: The open-source agent-serving project]]
:PROPERTIES:
:TITLE: lithos-ai/motus: The open-source agent-serving project
:URI: https://github.com/lithos-ai/motus
:CREATED: [2026-04-28 Tue 09:51]
:END:

BIN
inbox/2512.24601v2.pdf Normal file

Binary file not shown.

BIN
inbox/2602.22302v1.pdf Normal file

Binary file not shown.

BIN
inbox/paper.pdf Normal file

Binary file not shown.

BIN
inbox/von_Neumann_1955.pdf Normal file

Binary file not shown.

View File

@@ -0,0 +1 @@
user@amr.154851:1777155215

1
notes/.#gemini-vision.org Symbolic link
View File

@@ -0,0 +1 @@
user@amr.154851:1777155215

760
notes/chats-with-gemini.org Normal file
View File

@@ -0,0 +1,760 @@
#+TITLE: Chats with Gemini
#+AUTHOR: Amero
#+FILETAGS: :gemini:ai:research:
#+STARTUP: content
* Chat 1: REPL Agents Advantages
Source: https://gemini.google.com/share/5fc668800a27
Date: April 22, 2026
Summary of key concepts discussed:
** Core Insight: REPL as "Active" Memory**
A REPL-based agent doesn't just "read" context—it treats the codebase as a searchable variable. It can programmatically explore, test, and verify, rather than passively predicting what might work.
*** Benefits for AI Agents
1. *Context Optimization*: Instead of stuffing 10,000 files into context, the agent runs scripts to fetch only what's needed. Keeps active context lean (2k-4k tokens) instead of bloated.
2. *Verification over Hallucination*: The agent can actually run code it writes. If the REPL returns an error, it sees it immediately and fixes it. No more "guessing" if the code works.
3. *Recursive Problem Solving*: The agent can spawn "mini-versions" of itself to handle sub-tasks. A main agent identifies 50 files needing change, recursively calls sub-agents for each.
4. *Diffusion-Style Reasoning*: Initialize an answer variable, keep editing it as it explores. "Diffuses" toward correct solution over multiple turns before presenting final result.
5. *VRAM Efficiency*: By keeping context tiny, a 27B model can perform like a much larger model. Its "brainpower" goes to logic, not holding text.
*** Economic Impact
- *Token Costs*: Quadratic in standard chat (re-sending history each turn). Linear/flat in REPL (context stored once). 80-90% reduction for long sessions.
- *VRAM*: Minimal active context = much faster token processing.
- *Hot State*: Variables, file handles, sub-routine results already live. Eliminates pre-fill latency.
- *Tiered Pricing*: Use expensive "brain" for hard decisions, cheap sub-agents for grunt work.
*** Extension to Non-Coding Text Work
1. *World Variable*: Treat manuscript as persistent database variable. Query "what color are John's eyes" without reading whole book. Eliminates context drift.
2. *Recursive Synthesis*: For research, root agent spawns sub-agents to mine themes from massive library stored in REPL variable. Process effectively infinite input.
3. *Consistency REPL*: Maintain "Truth Table" in live memory. Before writing, "evaluates" text against that state. Throws error if contradicts previous definition.
4. *Self-Modifying Voice*: Style guide isn't just a prompt—it's live functions. Tell agent "too formal," it rewrites its own generate-tone function. Every subsequent sentence inherits the fix.
*** Why REPL Agents Aren't Dominating Yet
1. *Security*: Adversarial persistence. In standard chat, poison disappears on new session. In REPL, if attacker modifies a core function, it persists indefinitely. Enterprise sees this as "terrifying."
2. *Lisp Curse*: Python ecosystem is massive (10M developers vs 1 Lisp master). Hiring Lisp maintainers is "key person risk."
3. *Maintenance Tax*: REPL agents fail probabilistically, not deterministically. Can enter logic loops nearly impossible to debug. 3x more efficient but 5x more engineering hours to monitor.
4. *Stakeholder Model*: No solid way to distinguish users. Agent might apply voice/permissions learned from one user to another.
*** State Rot Mitigations
1. *Snapshots*: Baseline save game for instant recovery.
2. *Rollbacks*: Compensation actions that undo specific changes. Shadow/overlay filesystem—changes only become real when verified.
3. *Compaction*: Background scrubber extracts only new facts, deletes noise. Moves important facts to vector database, wipes active context.
4. *Courtroom Model*: Multi-agent system. Prosecutor finds contradictions. Jury decides if state is corrupted, forces hard reset.
5. *Lisp Condition Restarts*: Error enters break loop. Presented with recovery paths it can take without losing progress.
6. *Semantic Isolation*: Memory barriers between tasks. Clears previous variables when switching context. Prevents contamination.
7. *Formal Property Verification*: SystemVerilog-style assertions. Updates rejected at hardware level if violate core rules.
*** RLM Paper Reference
Paper: "Recursive Language Models" (arxiv 2512.24601)
- REPL as "Infinite Memory" - treats long prompts as external environment inside Python REPL
- Recursive Decomposition - model writes script to break task, calls smaller instances of itself
- Answer Variable Persistence - diffusion-style reasoning over multiple turns
- Validates that local 8B model with REPL can outperform much larger models
- Conclusion: Inference-time scaling (looping in REPL) more efficient than training-time scaling (bigger model)
** Relevance to OpenCortex
This aligns with OpenCortex's architecture:
- *Lisp REPL*: OpenCortex runs in Common Lisp, naturally homoiconic. Code is data—agent can modify its own skills.
- *Metabolic Loop*: Perceive → Reason → Act pipeline mirrors RLM's "crawl and verify" approach.
- *Memory Rollback*: Transactional state management prevents state rot.
- *Skills as Org-mode*: Structured, queryable, hot-reloadable. Similar to "world variable" concept.
- *v0.2.0 Self-Editing*: Direct implementation of "agent modifies its own brain" concept.
- *v0.3.0 Event Orchestration*: Three tiers (:REFLEX, :COGNITION, :REASONING) echo RLM's recursive decomposition.
** Opportunities for OpenCortex
1. Implement explicit "recursive sub-agent" pattern for complex tasks.
2. Add "compaction" event for long-running sessions—extract facts to Org-mode, clear live context.
3. Explore "courtroom" model: secondary skill that verifies primary skill's logic for contradictions.
4. Document performance gains from REPL approach vs standard chat agents.
5. Consider formal property verification for critical skill invariants.
* Chat 2: OpenCortex v1.0.0 Roadmap Review
Source: https://gemini.google.com/share/bb714c13acab
Date: April 28, 2026
** Gemini's Assessment of OpenCortex
*** Strengths
1. *Homoiconicity*: Lisp code is nested lists (data). Agent can natively read, write, evaluate its own logic at runtime without complex AST parsers.
2. *Probabilistic-Deterministic Loop*: LLM as semantic "guessing" engine, intercepted by deterministic Lisp "Bouncer." Formal verification before execution—solves hallucination-execution danger.
3. *Org-mode as Unified AST*: Humans and machines read/write same format. Eliminates translation layer between human notes (Markdown) and machine data (JSON).
*** Roadmap Opinion
- *Short-term (v0.1-v1.0)*: Pragmatic. Self-editing (v0.2), TDD auto-repair, GTD workflows—perfect for Emacs ecosystem.
- *Mid-term (v2.0-v3.0)*: Paradigm shift. Agent becomes Emacs process (Lisp Machine Emergence). Deterministic planner relegates LLM to semantic translation—future-proofs against model degradation.
- *Long-term (v4.0-v5.0)*: Borderline fundamental AI research. Llama.cpp FFI, persistent world models.
*** Trade-offs
- *Extreme Niche*: Pure Common Lisp + Emacs = massive barrier to entry.
- *Maintenance Burden*: No Python AI ecosystem (LangChain, LlamaIndex)—must build everything manually in Lisp.
** Gaps in Roadmap & Escape from Niche
*** Identified Gaps
1. *First Five Minutes*: No standalone binary or one-click Docker. Setup requires highly technical user.
2. *Evaluation/Benchmarking*: No mechanism to measure "SOTA Parity." Needs integration with SWE-bench, WebArena.
3. *Observability*: No visual tracing tool, GUI dashboard. Reading thousands of Plists isn't true observability.
4. *Interoperability*: Assumes single user. No multi-agent collaboration, OAuth, webhooks.
5. *Prompt Injection Sandboxing*: What if hostile webpage says "ignore previous instructions"? Need dedicated security milestone for sandboxing eval.
*** Strategies to Escape Niche
1. *Bridge to PKMs*: Market as "AI Engine for Logseq." Build bidirectional sync for Obsidian (Markdown ↔ Org-mode).
2. *Shift Marketing*: From "Tech Stack" (Common Lisp + Org-mode) to "Outcomes" (hallucination-proof, 100% local, self-correcting).
3. *Standalone Binary*: Use SBCL's save-lisp-and-die to compile single executable. Spin up local web server. User runs =./opencortex start= without knowing it's Lisp.
4. *Batteries-Included Workflows*: Ship pre-built skills. "Drop PDF → auto-summarize." "Connect calendar → resolve conflicts."
5. *Extension API*: Offer gRPC/REST API so developers write skills in Python/Go/TypeScript. Lisp kernel as unbreakable OS, users write "apps."
** Cutting Edge GUI for AI Agents
*** Paradigm A: Visual Canvas (Consumers)
- *Artifact Model*: Side-by-side workspace. Converse on left, agent builds/edits on massive visual canvas on right.
- *A2UI (Agent-to-User Interface)*: Agent streams declarative JSON. Client reads and renders pre-approved UI components natively. Eliminates injection attacks.
*** Paradigm B: Terminal/CLI (Developers)
- Claude Code, OpenClaw prove Unix Terminal is ultimate zero-overhead interface.
- Direct native access to file system, compiler, git without Electron wrappers.
** Python/JSON Skills Bridge with Cannibalization
*** The Idea
User writes quick Python/JSON skill → executes immediately → system auto-cannibalizes into pure Lisp/Org-mode file.
*** Why It Works
- Zero-friction onboarding: Developers use tools they know (Python, LangChain).
- Purity preserved: Python is temporary. Agent extracts logic, rewrites to Org Lisp, deletes Python.
- Evolutionary architecture: LLM compiles Python into Lisp.
*** The Traps
1. *Translation Hallucination*: Python relies on C-bound libraries (Pandas, NumPy). Cannot translate to pure Lisp without writing matrix math from scratch.
2. *Security*: Automatically executing translated Lisp is massive vulnerability. Must have strict sandbox during cannibalization.
*** Correct Execution
- Enforce strict JSON schema for Python skill.
- Ignore Python execution logic, read only JSON schema.
- Use JSON map to construct Lisp defskill macro and Org properties.
** MCP for Integrations, Skills for Local Processing
*** Architecture Split
- *MCP for External*: External API calls (Slack, GitHub, DBs). Standard JSON-RPC via stdio or SSE. Keeps kernel pristine.
- *Native Skills for Local*: Heavy iterative processing (PDF vectorizing). Operates in same memory space as brain. Zero-latency.
- *Security*: External API calls isolated behind MCP. If API fails, MCP server handles error, Lisp kernel registers :blocked/:failed.
** Bouncer Engine - Deterministic Safety
The one feature that makes users switch from OpenClaw: *Provable Execution Safety*.
- *OpenClaw*: LLM gets Node.js runtime. If it hallucinates command, pushes .env to GitHub, little stops it.
- *OpenCortex*: LLM is sandboxed. Can only generate request as Lisp Property List. Bouncer intercepts, formally verifies against invariants before execution.
** Bouncer Learning on the Job
Static Bouncer = straitjacket. Must learn symbolically, not probabilistically.
1. *HITL Exception*: When LLM proposes unrecognized action, Bouncer suspends thread, writes to Org-mode. Human reviews, changes BLOCKED to APPROVED.
2. *Lisp Rule Synthesis*: When human approves, system triggers Rule Synthesis. Reads AST of approved command, generalizes parameters, compiles new safety rule at runtime.
3. *Shadow Mode*: Runs in "trial run" mode. Simulates execution in virtualized environment. Observes side effects. If safe, teaches itself pattern is approved.
4. *Formal Property Verification*: SystemVerilog-style assertions. Before committing state, must pass logical rules. Updates rejected at hardware level.
** GUI Timing: Before v1.0 or Between v1.0-v2.0?
Before v1.0 = Throwaway code trap. Would build Web GUI (React/Vue), but v2.0 cannibalizes Emacs into Lisp browser—that Web GUI becomes dead weight.
Between v1.0-v2.0 = Correct. v1.0 is SOTA Parity (cognitive engine bulletproof). Emacs/CLI are testing grounds. After v1.0, agent helps build its own interface.
** Lisp Browser Choice: McCLIM vs SDL2 vs WebView vs Qt
- *McCLIM*: Lisp Machine purist. Complete GUI framework. Feels like living inside program. Steep learning curve, "dated" look.
- *SDL2*: Total pixel control. High performance. Reinvents wheels (scrolling, fonts). Good for bespoke editor like Lem, nightmare for browser.
- *WebView*: Pragmatist. Lisp backend + browser engine frontend. JSON-RPC bridge. Best of both—CSS/HTML for UI, Lisp for logic. But C++ dependency, memory overhead.
- *Qt/QML*: Cross-platform native. Qt Quick (QML) is declarative—matches Lisp generation model. Touch-native for mobile. EQL5 (Embedded Common Lisp + Qt) compiles Lisp into Qt binary. No IPC overhead.
*** Decision: Qt/QML for mobile portability.
** Milestones Before v1.0.0
1. *v0.5.0*: Learning Loop—Symbolic Induction: Convert successful LLM chat sequences into reusable Lisp functions.
2. *v0.7.0*: Unified Gateway—Channel Agnostic Layer. MCP Host protocol to wrap Telegram/Signal/Slack.
3. *v0.9.0*: Agentic Governance—Formal Audit Logs. Every action cryptographically signed in Org-mode for replay.
4. *Additional*:
- Sandboxing & Formal Verification Harness
- Observability & Tracing (Thought Trace Visualizer)
- Persistence & Recovery (Atomic Snapshots)
- MCP Host Implementation
- Evaluation Suite (Agent Benchmarks)
** Comparing to Hermes and OpenClaw
- *OpenClaw*: Swiss Army Knife gateway. Massive npm plugins. Python-based. Probabilistic execution—dangerous for safety.
- *Hermes*: Self-Improving Partner. Pattern extraction. MIT License.
OpenCortex advantage:
- Deterministic Bouncer = mathematically incapable of bypassing safety invariants
- Zero-dependency deployment (single SBCL binary)
- Homoiconic skills vs brittle JS/TS plugins
** MCP Approach: Own Lisp Native or OpenClaw's?
Build own. Why:
- OpenClaw = Node.js runtime. Forces V8 alongside Lisp image. Performance tax, bloat.
- Native Lisp MCP Host: In-process integration, no serialization overhead. Deterministic security inserted at protocol layer. Structural introspection—can inspect Lisp heap.
Strategy: "Native Host, Universal Client." Connect to existing MCP servers (Go/Python/TS) without writing own tools. Get ecosystem compatibility while keeping orchestration pure Lisp.
** Comparing to Motus
- *Motus*: Python agentic runtime. High-performance serving, parallelism, production-scale resilience. Focuses on infrastructure, not brain.
- *openCortex*: Lisp Machine OS.
Borrow from Motus:
- Task DAG Manager: Lisp-native dependency graph, automatic parallelism and async execution.
- Declarative Guardrails: Use Lisp Types and Condition Systems instead of Pydantic.
- Observability: Agent outputs Trace-Tree in S-expressions, render in WebView/Qt.
** Docker Compose Implementation
Game-changer. Already solved environmental configuration friction.
Use for "Agent-as-a-Service":
- Unix Domain Socket or stdio pipe from sidecar (Nginx/Go) to Lisp process.
- Map ~/memex/ directory as Docker Volume—agent always edits same Org files whether in Docker or native.
** Relevance to OpenCortex
This chat directly informs several roadmap items:
- *v0.3.0 HITL*: Implements Bouncer learning with symbolic rule synthesis
- *v0.4.0 Git Workflows*: Addresses observability and tracing
- *v0.5.0 Interactive Actuation*: Memory snapshots and persistence
- *v0.7.0 MCP Bridge*: Native Lisp MCP Host implementation
- *v2.0.0 Lisp Machine*: Qt/QML frontend, cannibalize Emacs
** Action Items from This Chat
1. Prioritize Docker persistence layer—demonstrate resume-on-crash
2. Build native Lisp MCP Host rather than wrapping OpenClaw
3. Consider Qt/QML (not WebView) for v2.0 GUI—better mobile support
4. Add "Symbolic Induction" to v0.5.0—auto-generate Lisp functions from successful sessions
5. Add "Formal Audit Logs" to roadmap—cryptographic signing of decisions
6. Market "hallucination-proof" not "Common Lisp"
* Chat 3: OpenCortex v2.0.0 - The Lisp Browser Project
Source: https://gemini.google.com/share/17770a813c33
Date: January 17, 2026 (content), April 28, 2026 (publication)
** Project Vision
A Common Lisp-based web engine that treats the internet as manipulatable data structures rather than static pixels. Entirely keyboard-driven, introspectable, modifiable at runtime.
Core Architecture: Lisp as the Kernel (Parent Process), WebKit as display server (Sub-process).
- *Lisp Machine approach*: Browser inside Lisp, not Lisp inside browser
- *Shared State*: Full access to filesystem, org-gtd files, system processes
- *Unified Control*: Treat web page like text file—run Lisp macro over every link
** The Engine Dilemma
Two paths:
1. *FFI Route*: Wrap WebKitGTK or QtWebEngine (modern web compatibility)
2. *Headless Orchestrator*: Lisp drives headless Chromium via Chrome DevTools Protocol
Decision: Use WebKitGTK via cl-webkit bindings for Phase 1.
** The "Emacs-Like" Editor Core
- Buffer Management: Every tab is a buffer.
- Minibuffer: Command line at bottom for Lisp functions, history, buffer switching.
- Self-Documentation: describe-key, describe-command for introspection.
** The Browser vs. Lisp Machine Distinction
*Browser inside Lisp* (Project Paradigmatic):
- Lisp is Parent Process, owns window, memory, input loop
- WebKit is merely a library rendering pixels inside a Lisp buffer
- Can redefine functions while browsing without restart
*Lisp inside browser* (Extension):
- Browser is authority, sandbox restricts capabilities
** Performance vs. Chrome
- *Rendering*: WebKit vs Blink—5-10% slower on JS-heavy sites, imperceptible for 95% of web.
- *Memory*: Single Lisp Image manages UI/hooks vs Chrome's massive per-tab processes. Can keep 50+ buffers with lower RAM than 20 Chrome tabs.
- *Latency*: SBCL compiles to machine code. Keybinding lookup in microseconds—faster than 16ms window for 60fps.
- *Input Loop*: GDK events intercepted before reaching WebKit—browser can't "steal" shortcuts.
Performance Guardrails:
- Lazy Buffer Loading: Buffers remain dormant until switched to.
- Native Key Handling: Keybindings in Lisp core—even if page is frozen, browser commands work.
- Direct DOM Extraction: WebKit C-API for fast data extraction.
** Pure Lisp Parser vs. Hybrid
*Pure Lisp (Option A)*:
- HTML5 Parser: 2-3 months for spec-compliant parser (agents helpful)
- CSS Layout Engine: 12-18 months (agents medium—debugging needs human eyes)
- JavaScript Engine: Multiple years (recommend embedding QuickJS or using bridge)
*Hybrid (Option B)* - Recommended:
- Network: dexador (Pure Lisp)
- HTML Parsing: Plump (Pure Lisp)
- Layout: Wrap Yoga (C-based Flexbox) via FFI
- JavaScript: Embed QuickJS
"Erosion" Roadmap (B → A):
1. *Stage 1*: UI & Logic (Qt for window → develop CL-OpenGL layer → swap to Pure Lisp UI)
2. *Stage 2*: DOM (WebKit holds DOM → Lisp builds own S-Expression DOM → WebKit only for "Painting" pixels)
3. *Stage 3*: Layout (WebKit calculates → Agent writes CL layout engine → WebKit turned off)
** GUI Choice: Qt vs. GTK
*Decision: Qt/QML via EQL5*
- *Mobile*: GTK doesn't run natively on iOS/Android. Qt is industry standard for cross-platform C++.
- *Performance*: Qt handles low-level graphics acceleration (RHI) better for mobile fluidity.
- *EQL5*: Exposes full Qt C++ API from Lisp. Access mobile sensors (GPS, Camera) from Lisp without C++.
** Bootstrapping Phases
- *Phase 1 (M1-2)*: Core loop (SBCL), minibuffer, command processor, "Hello World" window
- *Phase 2 (M3-4)*: Buffer logic, keybinding engine, PTY shell bridge—"Ghost Editor"
- *Phase 3 (M5-7)*: Integrate cl-webkit, web-buffer class, input interceptor
- *Phase 4 (M8-10)*: Mobile port via EQL5/LispWorks, gesture mapping, Remote IPC
- *Phase 5 (M11+)*: Org-mode integration, Extension API
** Emacs Ecosystem Integration
*Ambassador IPC Bridge*: RPC layer using EPC to call Emacs functions.
- *Phase I (Parasite)*: RPC Bridge—Browser calls Emacs for all logic (Org capture, Magit)
- *Phase II (Interpreter)*: Build ELisp compatibility layer in CL to run some packages natively
- *Phase III (Successor)*: Native CL versions read/write same file formats—total independence
Handling key packages:
- *Org-Mode*: Use cl-org-mode to read/write .org files directly. Keep Emacs UI for heavy editing.
- *Magit*: Spawn Emacs buffer in UI frame via XEmbed—looks integrated, runs original package.
- *LSP*: Write Native CL LSP Client—gives editor intelligence without Emacs dependency.
** Mobile UI Density Strategy
- *Tiling Layout*: Semantic stacking. 80-90% primary buffer, 10% contextual slits at edges.
- *Translucent Minibuffer*: Modal overlay over website content.
- *Z-Axis Hierarchy*: Foreground (Minibuffer), Active (Browser/Editor toggled via gesture), Background (CLI continuous), Persistent (Header with memory/GTD/battery).
- *Lisp-Gesture System*: Two-finger tap = M-x, edge-swipe left = prev-buffer, edge-swipe up = focus CLI.
** App Store Strategy
- *iOS*: "Educational/Developer Tool" loophole (Guideline 4.7). No JIT compilation (interpreted Lisp only).
- *Android*: F-Droid for unrestricted version, Play Store with sandboxed version.
- *Security*: "Safety Bridge"—Lisp code can manipulate browser/files but cannot touch hardware without standard permission pop-up.
** IPC: The Trinity Integration
- *Lisp-Signal Architecture*: Global Event Bus using Observer Pattern. Signals carry P-Lists. Asynchronous or Blocking.
- *Browser → Editor*: page-load-complete signal → org-gtd module listens → auto-captures title/metadata.
- *CLI → Browser*: file-system-change signal → local file hot-reload without manual refresh.
- *Editor → CLI*: eval-in-shell signal → execute code → return output to Minibuffer.
- *Remote IPC*: Swank for mobile-to-PC. "Push" state from PC, deserialize on Mobile.
** Action Items from This Chat
1. Start with Qt/QML (EQL5) for UI—abandon GTK research
2. Implement "Bridge-First" architecture to enable future "Pure Lisp" erosion
3. Phase 1 starts with Minibuffer & Buffer Management, not browser
4. Use EPC to bridge to Emacs packages (Org, Magit) initially, rewrite later
5. Mobile version follows desktop—same Lisp core, gesture-based input
6. Build "Lisp-Gesture" system for mobile command mapping
* Chat 4: OpenCortex v3.0.0 - Neuro-Symbolic & EGGROLL
Source: https://gemini.google.com/share/f0bbf4b6c488
Date: April 26, 2026 (content), April 28, 2026 (publication)
** EGGROLL Paper Implications
Paper: "Evolution Strategies at the Hyperscale" (EGGROLL - Evolution Guided GeneRal Optimisation via Low-rank Learning)
Key implications:
1. *Backprop-free*: Uses Evolution Strategies to perturb parameters and select best versions. Removes memory overhead of storing activations.
2. *Inference-Speed Training*: Low-rank perturbations (like LoRA) enable 100x speedup vs standard ES.
3. *Low-Precision Training*: Robust to noise—demonstrated stable training with pure int8. Enables "integer-only" LLMs.
4. *Non-Differentiable Objectives*: Treats model as black box. Can optimize any reward signal, even noisy/outcome-only.
5. *New Architectures*: Successfully trained RWKV-7 (recurrent model) in integer formats—architectures previously "un-trainable."
Training vs Inference:
- EGGROLL is for training, but enables better inference via integer-only models
- 50-80% memory savings, 100x speedup vs previous ES
- Competitive with GRPO (DeepSeek) for reasoning tasks
Hardware Impact:
- Don't need expensive H100s—works on cheaper hardware with lower VRAM
- Doesn't require ASICs—but is "dream algorithm" for integer-only ASICs
- Compatible with current Transformer ASICs (TPUs, Groq)—just "easier" math
- Future ASICs will strip out high-precision units, making them cheaper
Nvidia's Strategy:
- Jevons Paradox: Making training cheaper leads to more consumption (larger models)
- Owns the "Post-Backprop" software stack via CUDA
- Shifts to FP4/FP2 chips—EGGROLL thrives on low precision
** Why EGGROLL Doesn't Work Well with Symbolic AI
1. *Smoothness vs Brittleness*: Neural networks are continuous—small changes = small effects. Symbolic logic is brittle—change one symbol = total nonsense.
2. *Parameter Space vs Combinatorial Space*: EGGROLL works in continuous parameter space. Symbolic AI lives in combinatorial space (Rubik's cube)—random mutations mostly produce garbage.
3. *Low-Rank Mismatch*: Assumes redundancy in weights. Symbolic logic—every symbol is vital. No redundancy to compress.
4. *Needle-in-Haystack*: Symbolic often has ONE correct answer. ES is "blind" search—almost impossible to find that one needle.
** Neuro-Symbolic is the Future
- 10-80-10 Architecture: 10% Neural (Input) → 80% Symbolic (Reasoning) → 10% Neural (Output)
- EGGROLL optimizes the "10%" parts (neural translator) while Symbolic middle does the hard logic
- Outcome-based rewards work perfectly with EGGROLL—binary feedback from symbolic checkers
** Building the Symbolic Part
Why it has been a challenge:
- Knowledge Engineering Bottleneck: Manual rule writing was slow, expensive, brittle
- Combinatorial Explosion: More rules = exponential interactions = "spaghetti code"
How it's unlocked:
- LLMs as "Auto-Formalizers": Translate messy text into formal logic (Prolog, Lean)
- Self-Correction Loop: AI generates symbolic rule → compiler checks → AI refines
- Program Synthesis: LLM writes code, symbolic compiler verifies, AI learns from errors
Five Components:
1. *Knowledge Representation*: Knowledge Graphs (Neo4j), Ontologies, Digital Twins
2. *Formal Logic Engine*: Constraint Solvers, Business Logic (If-Then)
3. *Inference & Planning*: Symbolic Planners, Deductive Reasoning, MCTS
4. *Neuro-Symbolic Interface*: Semantic Parsers, Grounding Layer
5. *Verifier & Reward Loop*: Formal Verifiers, Outcome-Based Rewards (where EGGROLL shines)
** Bootstrapping a Neuro-Symbolic System
Architectural Blueprint (Self-Evolving 10-80-10):
1. *Phase 1 (Scaffolding)*: Use LLM as "Knowledge Engineer"—feeds unstructured data, outputs Knowledge Graph + Formal Rules (Prolog/Lean)
2. *Phase 2 (Execution Stack)*: Neural First-Mile (translate input) → Symbolic Middle-Mile (run against Knowledge Graph) → Neural Last-Mile (format output)
3. *Phase 3 (Learning Loop)*: System encounters rule failure → Optimization Agent proposes patch → EGGROLL trains agent based on Symbolic Verifier's fitness signal
4. *Phase 4 (Hardware)*: Run on Int8/Int4 precision—EGGROLL for training, Logic ASIC for symbolic core
** The "Seed" Explained
- Seed = Unstructured domain knowledge (PDFs, logs, manuals)
- Feed to: Extraction Pipeline (LLamaIndex + high-reasoning LLM as Auto-Formalizer)
- Output: Structured Knowledge Graph + Formal Rules
Who builds the symbolic engine:
- Assemble from open-source: Knowledge Graph (VivaceGraph), Solver (Z3), Logic (Prolog/Datalog)
- Program Synthesis: LLM writes specific code for business rules
- Don't build low-level—build on existing libraries
** Lisp for Neuro-Symbolic
Open-Source Lisp Stack:
- Compiler: SBCL (fast, symbolic manipulation)
- Knowledge Store: VivaceGraph v3 (Lisp-native graph database + Prolog)
- Reasoner: Screamer (non-deterministic backtracking)
- Formal Judge: ACL2 (theorem prover, BSD licensed)
- Glue: Mark Watson's 2026 examples for LLM-Lisp bridge
Why Lisp wins:
- Homoiconicity: AI can write Lisp easily—syntax is just parentheses
- Code as Data: Can inspect and modify running logic
- DSL Creation: Write macros to create domain-specific languages
- 100% auditable: (macroexpand) any rule to see exactly how it works
"Stitching" not "Building":
- Use VivaceGraph for storage, Screamer for constraint checking, ACL2 for formal proofs
- Neural model outputs S-expressions → Lisp parses → Symbolic checks → EGGROLL trains neural to produce better S-expressions
- EGGROLL can be used via Py4CL2 bridge or implemented in Lisp with MGL-MAT
Prolog in Lisp:
- Norvig's PAIP contains classic mini-Prolog in Lisp
- VivaceGraph v3 has Prolog-like query language built-in
- cl-prolog2 bridges to external SWI-Prolog
DSL Approach:
- Don't build new engine—build new DSL (Domain Specific Language)
- Lisp macros transform human-readable rules into Prolog queries
- Bootstrap: Use LLM to write first draft of Lisp-DSL rules from seed data
** Action Items from This Chat
1. Use VivaceGraph v3 + Screamer + ACL2 as the open-source Lisp symbolic stack
2. Implement 10-80-10 architecture: Neural Input → Symbolic Reasoning → Neural Output
3. Bridge EGGROLL via Py4CL2 or implement low-rank evolution in Lisp with MGL-MAT
4. Build DSL for domain-specific rules—don't write low-level engine from scratch
5. Use LLM as Auto-Formalizer to bootstrap Knowledge Graph from seed data
6. Prioritize integer-only (int8) deployment for cost efficiency
* Chat 5: OpenCortex v4.0.0 - Lisp Machines, FPGA & AI
Source: https://gemini.google.com/share/fcb2b654d77c
Date: December 25, 2025 (content), April 28, 2026 (publication)
** Lisp Machines vs ASICs
Technically, Lisp machines are not ASICs. They are computers with Application-Specific Instruction Set Processors (ASIPs).
- *ASIC*: Fixed, hardwired logic (one task). Cannot be reprogrammed.
- *Lisp Machine*: General-purpose CPU with custom silicon (Symbolics Ivory, TI Explorer) optimized for Lisp—programmable but Lisp-specific.
The "middle ground": Lisp CPUs were custom silicon designed to run Lisp with hardware support for tagged architecture, garbage collection, and fast function calls.
** Emacs as Virtual Lisp Machine
Emacs mimics Lisp Machine architecture entirely in software:
- Full visibility/introspection—M-x find-function to inspect any command
- Single address space (Lisp Heap)—one bug can crash everything
- The "C Substrate" problem: C code is the "floor" below the Lisp layer
** Best Lisp? Common Lisp, Scheme, Emacs Lisp, Clojure
Common Lisp is the standard. Emacs Lisp reinforces the "Lisp Machine" environment. Clojure runs on JVM but offers immutability. The choice depends on deployment context.
** Why Emacs Core Written in C?
1. *Bootstrap Problem*: Can't run Lisp without a Lisp interpreter. Hardware understood Lisp natively; Unix didn't.
2. *Performance*: 1980s hardware too slow for interpreted Lisp. C allowed direct memory manipulation (gap buffers).
3. *Portability*: C compilers existed everywhere; Lisp implementations were fragmented.
Today, Lem (Common Lisp editor) proves pure Lisp is viable on modern hardware.
** The Turtles All The Way Down Paradox
The "bottom turtle" is always Hardware ISA (x86/ARM). Even writing "Pure Lisp" from editor to binary, you're still standing on architecture designed by hardware engineers.
*Ken Thompson's "Reflections on Trusting Trust"*: A C compiler can embed a backdoor that survives compilation of "clean" source code. You can never truly know the bottom turtle.
** Stage0 Project
A project to create a fully bootstrap-able system starting from 500 bytes of manually written hex code to reach Lisp without "trusting" a C compiler.
- 500 Bytes Hex → Hex Assembler → M1 Macro Assembler → Lisp Interpreter → Self-Hosting Lisp
** RISC-V: C-Like?
RISC-V is currently "C-like" because designed for C efficiency:
- Linear memory (C arrays/pointers)
- Lack of "Tags" (software must check types manually)
- Standard RISC-V doesn't inherently differentiate number vs address
Exception: J-Extension (Dynamically Translated Languages)—would add hardware tagging and GC hooks.
** Building a Modern Lisp Machine
1. *Hardware*: RISC-V core + Custom Lisp extensions (J-extension philosophy)
- Tagged Architecture: Top 4-8 bits of every memory word = Type Tag
- Zero-overhead Type Checking: Hardware checks tags in parallel with ALU operations
- Trap on type mismatch
2. *Memory*: NVRAM for Single Address Space Storage
- Persistent Heap: Everything in one giant pool of permanent memory
- No "Booting": Turn on, state is exactly where you left it
3. *Garbage Collection*: Dedicated Bus Master (Scavenger)
- Background cleaning while main CPU runs code
- No "GC Pause"
4. *Development Environment*: Everything is a pointer, everything inspectable. No binary blobs.
** Why Not Build This Today?
- *C Trap*: Most software (browsers, drivers) is C/C++. Porting is monumental.
- *Economies of Scale*: Intel/Apple spend billions. Custom Lisp chip would be 10x slower at raw math.
- *Isolation*: Single bug in Lisp script could corrupt entire hardware state.
Modern solution: Formal Verification (Proof-Carrying Code, Capability-Based Security) instead of walls.
** FPGA Path to Build It
Hardware: Terasic DE10-Nano (learning), Xilinx KCU105 (full PCIe).
1. Learn Verilog, build Type Checker module
2. Modify RISC-V core (VexRiscv) to add tagged ALU
3. Implement PCIe umbilical cord (DMA/P2P communication)
4. Self-hosting: Boot Lisp core, control hardware directly
** AI + Lisp Machines: The "Infinite Self-Refactoring" Machine
- AI can observe bottlenecks, rewrite functions, compile, swap while running
- Natural Language OS: "I want a button that summarizes emails" → AI writes Lisp code, injects into memory
- *Isolation Paradox*: More dangerous or safer? Hardware enforces types—can't overwrite random memory. Reversibility—can roll back. Auditability—exact code diffs.
** Why Lisp is "Ideal" AI Language
Homoiconicity (Code is Data). AI can generate a list, manipulate it, execute it. Not just passenger but architect—can create data structures on the fly. This is how biological brains work.
** Why Nobody Builds Lisp Machines Today
1. *Commodity CPU Steamroller*: Generic Intel chips became so fast through brute force they simulated Lisp Machines faster than real ones.
2. *C Ecosystem*: Network effect—libraries, drivers all in C/C++. Lisp is a "walled garden."
3. *AI Winter*: AI was Symbolic (Lisp), now is Connectionist (Statistical/Neural). GPUs (matrix math) beat Lisp (symbolic logic).
Future: May see "Lisp Accelerators" return if Neuro-symbolic AI trend continues.
** Clojure & Julia: Lisp-ish Successors Without Hardware
- *Clojure*: Runs on JVM. Gives "Code as Data." Solves isolation with immutable data.
- *Julia*: Not Lisp but uses Homoiconicity. Metaprogramming + JIT compilation.
** Can AI Refactor Linux to Lisp?
Extremely difficult (10/10 difficulty):
1. *Paradigm Mismatch*: Translating C to Lisp is like translating manual to poetry. Literal translation = "Lisp code that thinks it's C"—slow, ugly, loses introspection.
2. *Liveness Gap*: Source code vs Running Program are different in Linux. In Lisp Machine, they are same.
3. *Device Driver Nightmare*: Millions of lines of C for hardware. Lisp prefers "Pure Functions."
AI-Native Path: Build new Lisp system rather than refactor old. "Micro-Lisp Machine" first: Small AI-generated Lisp kernel on RISC-V FPGA, expand on demand.
** PCIe Card Lisp Machine (Practical Path)
- *Host*: Intel/AMD CPU runs Linux/Windows—handles "dirty" work
- *Lisp Card*: FPGA with dedicated RAM, tagged-architecture CPU
- *Memory Mapping*: Card can see host's memory. Lisp environment reaches out, inspects data.
- *Safety*: If Lisp crashes, Host stays alive. Reset card, reload.
Hardware exists: Terasic DE10-Nano, Xilinx KCU105, LiteFury.
** Phase Migration: Host → Lisp
1. *Parasitic*: Lisp card as co-processor. Host as I/O server.
2. *Functional Hijacking*: Lisp UI runs on card, displays through PC. AI indexes Linux files into Lisp objects.
3. *Driver Cannibalization*: Point AI at C drivers, ask to generate native Lisp drivers. PCIe Passthrough for hardware control.
4. *Self-Hosting*: Replace Linux bootloader with Stage0 Lisp. Cut umbilical cord.
** Performance for AI Inference
Lisp Machine handles inference differently:
- *Speed*: Tagged architecture eliminates "forgetting what data is." Zero-copy inference—weights exist as permanent Lisp objects.
- *Can it handle modern LLM*: 64-bit tagged Lisp core can handle models like Llama 3 8B. But GPU better at Matrix Multiplication, Lisp better at Reasoning. Hybrid system: GPU calculates "next token," Lisp acts as Hardware-Level Guardrail.
- *Inference as Continuous Interaction*: Not one-way (prompt → answer). AI infers new function, injects into OS kernel. "Inference" becomes performing logical operation.
** VSA: Vector Symbolic Architecture
VSA bridges symbolic logic (Lisp) and high-dimensional vector space (LLMs).
- Every concept = Hypervector (1,000-10,000 dimensions)
- Operations (bind, bundle, permutations) = simple XOR/Shift—easy for hardware
- Hardware Benefit: No complex matrix math, just simple boolean operations
** Moving to ASIC (The Ultimate Leap)
- *Speed*: 3-5x higher clock frequency (100MHz FPGA → 500MHz-1GHz ASIC)
- *Energy*: 10x more efficient—no programmable overhead
- *Cost*: For mass production, significantly cheaper—more logic in smaller space
Scale:
- *Tiny Tapeout* (~$500-1,000): Simple 8-bit Lisp toy processor
- *Shuttle* (~$10k-20k): Tagged RISC-V with ~100-300MHz
- *Industrial* (~$10M-100M+): 5nm process, competes with modern CPU
** Lisp ASIC Doesn't Exist
No mass-produced Lisp ASIC in 2026. Closest: CHERI-RISC-V (capability hardware enhanced).
To make one, you use RISC-V as skeleton and add custom extensions:
- Custom Tagged Instructions (TADD, LISP.CAR, LISP.CDR)
- Hardware Write-Barriers
- Vector Symbolic Hooks
Not "C-like" if you add the extensions—uses RISC-V "carrier" but gives it "Lisp muscles."
** Python/JSON LLMs → S-expressions
Improves performance because:
- *JSON Tax*: Must parse strings, allocate objects, validate. S-expressions are native tree structures—memory map directly into heap, load time near-zero.
- *S-expressions as Native ASTs*: Direct tree-walk. Hardware tree-walker traverses nested S-expressions at bus clock speed.
- *llama.lisp*: Written in Common Lisp. Use macros to generate optimal kernels, refactor before machine code generated.
- *Hardware-Level Inference*: Recursion is atomic hardware operation on tagged machine. Not fighting Python interpreter.
** Why "Pure Lisp Models" is Bad Idea
1. *Data Representation*: 70B params = 70B weights. Tag every weight = 50% memory waste. Represent as tree = 400% overhead (pointers).
2. *Cache Locality*: LLMs need Streamed Linear Access (chunk → parallel math). Lisp machines are "Pointer Chasers." Bottlenecked by memory traversal.
3. *Semantic Gap*: Weights are statistical noise, not symbolic. No semantic meaning in single weight that S-expression captures better than raw byte.
4. *Ecosystem Isolation*: AI research moves at speed of Python/C++. Can't use billions in optimized kernels.
** The "Best of Both Worlds" Approach
*Use Lisp as Sovereign Governor, not as Math Engine:*
1. *Macro-Tags*: Tag the Tensor as single Lisp object, not individual weights. Hardware checks tag once, then gives Pointer to Tenstorrent p150. 100% safety with 0% overhead during math.
2. *S-Expressions as Universal Compiler (DSL)*: Describe LLM layer as Lisp list: (layer :type 'transformer :heads 32 :dim 4096). Compile time generates exact machine code for p150's cores. Python interprets every time; Lisp compiles once.
3. *Liveness as Debugging Tool*: Pause LLM mid-inference. Inspect Hidden States as Lisp variables. Modify vector, change sampling parameter, resume. Live surgery on cognition.
4. *Hardware-Enforced Safety*: AI-generated Lisp function runs on FPGA. Tagged hardware physically cannot access memory outside allowed heap. Security-by-Physics not Sandbox.
** Action Items from This Chat**
1. Don't store weights as Lisp objects—use Macro-Tags (pointer to flat binary)
2. Build DSL in Common Lisp for LLM architecture description
3. Use REPL to interact with AI's internal state mid-inference
4. Run AI-generated code on tagged FPGA for hardware-enforced safety
5. Start with VexRiscv on FPGA to validate tagged architecture before ASIC
6. Target TinyTapeout for first "Lisp Tag Coprocessor" silicon

238
notes/gemini-vision.org Normal file
View File

@@ -0,0 +1,238 @@
#+TITLE: The OpenCortex Vision — A Strategic Blueprint
#+AUTHOR: Amero
#+FILETAGS: :strategy:roadmap:vision:
#+STARTUP: content
* The Vision: A Neuro-Symbolic Lisp Machine
OpenCortex is not merely another AI agent. It is an attempt to build something deeper — a sovereign computing environment where the agent and its operator share the same language, the same data structures, and the same memory. It is a return to the dream of the Lisp Machine, updated for the age of neural networks.
The core insight from months of discussion with Gemini is this: the future of personal AI is not about bigger models, but about smarter architecture. We do not need an AI that guesses. We need an AI that reasons — backed by hardware that enforces safety, and software that grants its operator absolute sovereignty over their data.
This document captures the philosophical foundations, technical architecture, and strategic roadmap that emerged from those conversations. It is written for the engineer who will build it, the user who will trust it, and the future historian who will ask: "Why didn't the world run on Lisp?"
* Philosophy: Why This Matters
** The Sovereignty Imperative
Every other AI agent runs on a stack of dependencies — Python packages, npm modules, pip installs, conda environments. When the maintainer walks away, the stack rots. When the company shuts down, your data dies in their database.
OpenCortex is different. It runs on SBCL alone. The kernel is Lisp. The skills are Lisp. The memory lives in Org-mode files you already own. There is no database to migrate, no schema to update, no lock-in to escape. Your data is a folder of text files. It survives app updates, platform switches, and decades of use.
This is not nostalgia. This is engineering pragmatism. The simplest stack is the most maintainable stack.
** The Deterministic Safety Promise
Modern AI agents are terrifying. They pipe LLM output directly into your terminal. If the model hallucinates, it can delete your files or push secrets to GitHub. Safety is added as an afterthought — a wrapper around a dangerous core.
OpenCortex splits the brain into two parts:
1. The Creative Brain (LLM): Understands your notes, suggests actions, generates code.
2. The Strict Guard (Lisp): Before the AI is allowed to touch a file or run a command, a mathematically strict set of rules intercepts the proposal. It verifies the action is safe and permitted. If the AI hallucinates, the guard blocks it.
This is not "guardrails" in the marketing sense. This is hardware-level type checking — impossible to bypass, because the logic is embedded in the execution path.
** The Homoiconic Advantage
Lisp is the only major language where code and data have the same representation. In Python, the AST is a foreign object — the agent can inspect it, but not treat it as something it owns. In Lisp, the agent can read its own code the same way it reads a text file. It can parse its skills, understand their structure, and modify them at runtime.
This is not a party trick. This is the foundation for a self-improving agent. The agent can fix its own bugs, refine its own strategies, and grow more capable without human intervention.
** The Neuro-Symbolic Synthesis
Pure neural AI is a black box. Pure symbolic AI is a straitjacket. The future is both together — a hybrid where the neural engine handles pattern recognition and the symbolic engine handles reasoning.
The 10-80-10 Architecture:
- 10% Neural (Input): A fast model translates messy human language into a structured query.
- 80% Symbolic (Reasoning): A rigid logic engine runs against a Knowledge Graph, checking consistency, enforcing rules, verifying truth.
- 10% Neural (Output): A model turns cold facts back into warm, natural language.
This is not theoretical. It is the architecture of the human brain — System 1 (neural intuition) and System 2 (symbolic reasoning) — rendered in silicon and Lisp.
* Bits Leading to v1.0.0
Before we achieve SOTA parity, we must lay the groundwork. These are the incremental improvements that make the later versions possible.
** Self-Editing and Self-Improving
The agent must be able to modify its own code. Not just fix syntax errors — but learn from outcomes. When the agent encounters a failure, it should analyze why, update its strategy, and try again.
Key implementations:
- Paren-balancing for syntax errors (deterministic)
- LLM-guided surgical fixes (probabilistic)
- Memory snapshots before every edit for safe rollback
- Hot-reload skills without restarting the agent
This is the foundation of autonomy. An agent that cannot edit itself is a tool. An agent that can is a partner.
** The Symbolic Bouncer
The Bouncer is not a static wall. It is a learning system.
1. HITL Exception: When the LLM proposes an unrecognized action, the Bouncer suspends the thread and writes to Org-mode. A human reviews, changes BLOCKED to APPROVED.
2. Lisp Rule Synthesis: When approved, the system generalizes the parameters, compiles a new safety rule, and applies it to future requests.
3. Shadow Mode: The Bouncer runs in "trial mode" — simulating execution, observing side effects, teaching itself patterns.
4. Formal Property Verification: SystemVerilog-style assertions ensure updates are rejected at the hardware level if they violate core invariants.
** Memory Safety
State rot is the enemy of long-running agents. We implement:
- Atomic snapshots for instant recovery
- Transactional rollbacks for safe undo
- Compaction events that extract facts to Org-mode and wipe active context
- Semantic isolation between tasks to prevent contamination
** The MCP Strategy
We do not wrap OpenClaw. We build a native Lisp MCP Host.
The rationale: OpenClaw forces a Node.js runtime alongside the Lisp image. That's performance tax and bloat. A native host runs in the same memory space — no serialization, no IPC overhead, direct structural introspection.
Strategy: "Native Host, Universal Client" — connect to existing MCP servers without rebuilding their tools. Get ecosystem compatibility while keeping orchestration pure Lisp.
* v1.0.0: SOTA Parity
The goal: An agent competitive with commercial agents — Claude, Cursor, ChatGPT.
This is not about matching features. It's about proving the architecture works. The cognitive engine must be bulletproof. The safety invariants must hold under pressure. The agent must be able to:
- Handle multi-step engineering tasks
- Use tools reliably
- Maintain context across sessions
- Recover from errors gracefully
- Pass standardized benchmarks (SWE-bench, etc.)
The "parity" is not in the brand — it's in the capability.
* v2.0.0: Lisp Tools and GUI
Once the brain is proven, we give it a face.
** The Qt/QML Decision
We do not use WebView. It introduces a C++ dependency and memory overhead. We use Qt via EQL5 — a bridge that compiles Lisp directly into Qt binaries.
Why Qt/QML:
- Cross-platform native (Desktop + Mobile)
- Declarative — matches Lisp generation model
- Touch-native for mobile
- No IPC overhead (Lisp compiles to binary)
This is the "thin GUI" layer. It displays what the Lisp brain produces. It does not contain business logic.
** The Emacs Cannibalization
v2.0.0 is when OpenCortex begins to replace Emacs, not just run inside it. The agent becomes the process. The TUI evolves into a full interface. Org-mode buffers become the display layer for the agent's thoughts.
The "cannibalization" is not hostile. It's evolution. Emacs was always a Lisp Machine — we are completing its metamorphosis.
** Marketing Phrase
"OpenCortex isn't an app you run. It's an OS you live in."
* v3.0.0: The Symbolic Engine
This is where the neuro-symbolic architecture becomes real.
** The Knowledge Graph
We integrate VivaceGraph — a Lisp-native graph database with built-in Prolog. This is not an external database we connect to. It's part of the address space.
The symbolic engine maintains:
- Facts and relationships (Knowledge Graph)
- Rules and constraints (Prolog)
- Formal proofs (ACL2)
When the neural engine generates a response, the symbolic engine verifies it. When the neural engine claims something is true, the symbolic engine checks the chain of reasoning.
** The DSL Approach
We do not build a new engine. We build domain-specific languages.
Using Lisp macros, we create languages for specific domains:
- Legal compliance rules
- Medical protocols
- Financial constraints
- Project management workflows
The LLM bootstraps these DSLs — reading seed data, generating first drafts, refining with human feedback.
** Marketing Phrase
"OpenCortex doesn't just answer your questions. It proves its answers are correct."
* v4.0.0: The Lisp Machine
This is the final form. A computer where every level — from hardware to application — speaks Lisp.
** The Tagged Architecture
We move from simulation to silicon.
Using RISC-V as a carrier, we add custom extensions:
- Tagged memory (top 8 bits of every word = type)
- Hardware-enforced type checking (zero-overhead)
- Trap on type mismatch
This is not emulation. This is a CPU that understands Lisp at the gate level.
** The Hybrid Path
We don't build a Lisp Machine in isolation. We pair it with a neural accelerator.
The Tenstorrent p150 (664 TFLOPS) handles the heavy matrix math. The FPGA/ASIC handles the symbolic reasoning. They share a memory space. The Lisp core governs what the neural engine can and cannot do.
This is "Lisp as Governor" — not as the math engine, but as the orchestrator of computation.
** The FPGA Path
Before ASIC, we prototype on FPGA:
- Xilinx KCU105 for full PCIe integration
- Terasic DE10-Nano for learning
The journey: Verilog → RISC-V core → Tagged ALU → PCIe bridge → Self-hosting Lisp
** Marketing Phrase
"The first computer since the Symbolics that truly belongs to you."
* Cross-Cutting Themes
** The Technical Principles
1. *Lisp as Governor*: Use Lisp for orchestration, safety, introspection. Let specialized hardware handle dense math.
2. *Macro-Tags over Full Tags*: Tag tensors, not individual weights. 100% type safety with 0% memory overhead.
3. *S-expressions as Compiler Input*: Use Lisp for architecture description. Generate optimized code for target hardware.
4. *Hardware-Enforced Safety*: Tagged memory at silicon level — impossible to bypass.
5. *Hybrid Architecture*: Neural for intuition, Symbolic for reasoning, Lisp for governance. Each does what it does best.
** The Competitive Differentiators
| Feature | OpenCortex | Others |
|---------|-----------|--------|
| Language | Pure Common Lisp | Python/TypeScript |
| Memory | Org-mode files | SQLite/ChromaDB |
| Self-Modification | Native | Unsupported |
| Safety | Deterministic Bouncer | Probabilistic guardrails |
| Dependencies | SBCL only | pip/npm/conda |
| Data Ownership | 100% yours | Vendor lock-in |
** The Philosophical Stance
We are not building a chatbot. We are not building a copilot. We are building a sovereign computing environment — a digital home where your thoughts, your data, and your agent live together in plain text files you own.
The industry builds AI that runs in the cloud, on someone else's hardware, with someone else's models. We build AI that runs on your machine, in your language, governed by your rules.
This is not a product. It is a philosophy made manifest in code.
* References
- [[file:chats-with-gemini.org][Full Chat Transcripts]]
- [[file:../projects/opencortex/README.org][OpenCortex README]]
- [[file:../projects/opencortex/docs/ROADMAP.org][OpenCortex Roadmap]]

View File

@@ -1,166 +0,0 @@
#+TITLE: AUDIT: V1.0 Comprehensive Core Skill Audit
#+AUTHOR: Gemini CLI (Agent)
#+DATE: [2026-04-09 Thu]
#+FILETAGS: :audit:kernel:psf:
#+STARTUP: overview
* Overview
This audit systematically reviews the 39 core skills of the OpenCortex for compliance with the V1.0 standards:
1. **Safety:** Prevention of code injection, proper sandboxing, and actuator safety.
2. **Merkle-Tree Integration:** Proper use of the native Lisp Merkle-Tree versioning for undo/rollback.
3. **Core Invariants:** Adherence to Sovereignty, Mastery, Zero-Bloat, Transparency, and Sustainability.
* Audit Progress [6/28]
** DONE org-skill-agent.org [X]
- COMPLIANT: Correctly defines and enforces Core Invariants.
- SAFETY: High. Implements baseline symbolic gating.
- MERKLE: N/A (Read-only/Policy only).
** DONE org-skill-llm-gateway.org [X]
- COMPLIANT: Consolidates 6 providers into a single high-integrity gate.
- SAFETY: HIGH. Fixed URL key leaks, standardized headers, and centralized credential masking.
- MERKLE: N/A (Stateless dispatch).
** DONE org-skill-credentials-vault.org [X]
- COMPLIANT: Unified high-security enclave for API keys and cookies.
- SAFETY: HIGH. Mandatory credential masking in logs and secure Object Store persistence.
- MERKLE: COMPLIANT. Setting secrets triggers Merkle snapshots.
** DONE org-skill-homoiconic-memory.org [X]
- COMPLIANT: Unified grammar, bridge, and normalization.
- SAFETY: HIGH. recursive AST walker for ID injection and structural validation.
- MERKLE: COMPLIANT. Normalization occurs during ingest/save, which are Merkle-versioned events.
** DONE org-skill-state-persistence.org [X]
- COMPLIANT: Unified local SBCL image dumps with decentralized IPFS checkpointing.
- SAFETY: HIGH. Implements safe restoration paths and credential masking.
- MERKLE: COMPLIANT. This is the primary persistence layer for the Merkle-Tree object store.
** DONE org-skill-event-orchestrator.org [X]
- COMPLIANT: Unified Cron, Hooks, and Routing into a single central control unit.
- SAFETY: HIGH. Implements error isolation for automated tasks and hooks.
- MERKLE: COMPLIANT. Registering hooks or tasks triggers Merkle snapshots.
** DONE org-skill-cron.org [X] (CONSOLIDATED -> org-skill-event-orchestrator.org)
** DONE org-skill-hook-manager.org [X] (CONSOLIDATED -> org-skill-event-orchestrator.org)
** DONE org-skill-router.org [X] (CONSOLIDATED -> org-skill-event-orchestrator.org)
** DONE org-skill-memory-archivist.org [X] (CONSOLIDATED -> org-skill-state-persistence.org)
** DONE org-skill-object-store-persistence.org [X] (CONSOLIDATED -> org-skill-state-persistence.org)
** DONE org-skill-ast-normalization.org [X] (CONSOLIDATED -> org-skill-homoiconic-memory.org)
** DONE org-skill-org-json-bridge.org [X] (CONSOLIDATED -> org-skill-homoiconic-memory.org)
** DONE org-skill-org-mode.org [X] (CONSOLIDATED -> org-skill-homoiconic-memory.org)
** DONE org-skill-auth-api-key.org [X] (CONSOLIDATED -> org-skill-credentials-vault.org)
** DONE org-skill-auth-google-oauth.org [X] (CONSOLIDATED -> org-skill-credentials-vault.org)
** DONE org-skill-provider-anthropic.org [X] (CONSOLIDATED -> org-skill-llm-gateway.org)
** DONE org-skill-provider-gemini.org [X] (CONSOLIDATED -> org-skill-llm-gateway.org)
** DONE org-skill-provider-groq.org [X] (CONSOLIDATED -> org-skill-llm-gateway.org)
** DONE org-skill-provider-ollama.org [X] (CONSOLIDATED -> org-skill-llm-gateway.org)
** DONE org-skill-provider-openai.org [X] (CONSOLIDATED -> org-skill-llm-gateway.org)
** DONE org-skill-provider-openrouter.org [X] (CONSOLIDATED -> org-skill-llm-gateway.org)
** DONE org-skill-chaos.org [ ]
- STATUS: NON-COMPLIANT (Safety/Sovereignty Violation)
- ISSUE: Lacks an "Active Production" gate to prevent accidental chaos during real work. No Merkle-Tree checkpoints before/after stress tests to allow for full-system rollback.
- SAFETY: MEDIUM (Adversarial by design, but ungated).
- MERKLE: FAILED.
** DONE org-skill-chat.org [ ]
- STATUS: NON-COMPLIANT (Safety/Technical Mastery Violation)
- ISSUE: Uses `read-from-string` on unverified LLM output, risking reader macro injection. No Merkle-Tree integration for chat history persistence or rollbacks.
- SAFETY: LOW (Vulnerable to injection).
- MERKLE: FAILED.
** DONE org-skill-consensus.org [X]
- STATUS: COMPLIANT (Consolidated -> Task Orchestrator)
- SAFETY: HIGH. Verified via parallel multi-backend consensus in neuro.lisp.
- MERKLE: COMPLIANT.
** DONE org-skill-context-manager.org [ ]
- STATUS: NON-COMPLIANT (Critical Gap)
- ISSUE: No implementation code in Phase D. The skill is only a blueprint. No Merkle-Tree integration for context stack snapshots or rollbacks.
- SAFETY: N/A (Missing).
- MERKLE: FAILED.
** DONE org-skill-delegation.org [X]
- STATUS: COMPLIANT (Consolidated -> Task Orchestrator)
- SAFETY: HIGH. Integrated consensus gate and delegation hooks in core.lisp.
- MERKLE: COMPLIANT.
** DONE org-skill-environment-config.org [ ]
- STATUS: NON-COMPLIANT (Safety/Technical Mastery Violation)
- ISSUE: No validation or authorization gating for configuration changes. Direct hash-table modification skips the new Merkle-Tree versioning system in the Object Store.
- SAFETY: MEDIUM (Risk of misconfiguration).
- MERKLE: FAILED.
** DONE org-skill-formal-verification.org [X]
- STATUS: COMPLIANT
- ISSUE: Implemented Lisp-Native Symbolic Prover for security invariants.
- SAFETY: HIGH. Implements path-confinement and no-network-exfil.
- MERKLE: COMPLIANT.
** DONE org-skill-function-calling.org [ ]
- STATUS: NON-COMPLIANT (Critical Gap)
- ISSUE: No implementation code in Phase D. The skill is only a blueprint. No Merkle-Tree integration for recording and rolling back tool-use history or state.
- SAFETY: N/A (Missing).
- MERKLE: FAILED.
** DONE org-skill-inbound-gateway.org [ ]
- STATUS: NON-COMPLIANT (Critical Gap)
- ISSUE: No implementation code in Phase D. The skill is only a blueprint. No Merkle-Tree integration for recording and rolling back inbound message history or state.
- SAFETY: N/A (Missing).
- MERKLE: FAILED.
** DONE org-skill-inbox-processor.org [ ]
- STATUS: NON-COMPLIANT (Safety/Technical Mastery Violation)
- ISSUE: Physical move logic is a "Simulation". No implementation of actual file refactoring. No Merkle-Tree integration for recording or rolling back inbox-related state changes.
- SAFETY: MEDIUM (Simulation only).
- MERKLE: FAILED.
** DONE org-skill-latent-reflection.org [ ]
- STATUS: NON-COMPLIANT (Safety/Technical Mastery Violation)
- ISSUE: No validation or authorization gating for reflected state changes. Random sampling is inefficient. No Merkle-Tree integration for recording or rolling back reflected state changes.
- SAFETY: MEDIUM (Risk of unintended modifications).
- MERKLE: FAILED.
** DONE org-skill-lisp-machine-bootstrap.org [ ]
- STATUS: NON-COMPLIANT (Critical Gap)
- ISSUE: No implementation code in Phase D. The skill is only a blueprint. No Merkle-Tree integration for recording or rolling back bootstrap-related state changes or ISA simulation history.
- SAFETY: N/A (Missing).
- MERKLE: FAILED.
** DONE org-skill-log-aggregator.org [ ]
- STATUS: NON-COMPLIANT (Critical Gap)
- ISSUE: No implementation code in Phase D. The skill is only a blueprint. No Merkle-Tree integration for recording or rolling back log-related state changes or observability history.
- SAFETY: N/A (Missing).
- MERKLE: FAILED.
** DONE org-skill-memex.org [ ]
- STATUS: NON-COMPLIANT (Critical Gap)
- ISSUE: No implementation code in Phase D. The skill is only a blueprint. No Merkle-Tree integration for recording or rolling back memex-related state changes or metadata audits.
- SAFETY: N/A (Missing).
- MERKLE: FAILED.
** DONE org-skill-model-explorer.org [ ]
- STATUS: NON-COMPLIANT (Critical Gap)
- ISSUE: No implementation code or blueprint. The skill is only a title and overview. No Merkle-Tree integration for model discovery or state changes.
- SAFETY: N/A (Missing).
- MERKLE: FAILED.
** DONE org-skill-onboarding.org [ ]
- STATUS: NON-COMPLIANT (Critical Gap)
- ISSUE: No implementation code in Phase D. The skill is only a blueprint. No Merkle-Tree integration for recording or rolling back onboarding-related state changes or environment calibration.
- SAFETY: N/A (Missing).
- MERKLE: FAILED.
** DONE org-skill-lisp-validator.org [ ]
- STATUS: NON-COMPLIANT (Safety/Technical Mastery Violation)
- ISSUE: No validation or authorization gate for dynamic symbol registration. No Merkle-Tree integration for recording or rolling back safety-related state changes or verification history.
- SAFETY: HIGH (The core of the system's safety).
- MERKLE: FAILED.
** DONE org-skill-self-fix.org [ ]
- STATUS: NON-COMPLIANT (Safety/Technical Mastery Violation)
- ISSUE: No validation or authorization gate for proposed self-fixes. Fixes are applied directly to files. No Merkle-Tree integration for recording or rolling back self-fix-related state changes or repair history.
- SAFETY: LOW (Risk of unintended/malicious modifications).
- MERKLE: FAILED.
** DONE org-skill-shell-actuator.org [ ]
- STATUS: NON-COMPLIANT (Safety/Sovereignty Violation)
- ISSUE: No validation or authorization gate for synthesized script execution. Script synthesis bypasses the shell whitelist. No Merkle-Tree integration for recording or rolling back shell-related state changes or command history.
- SAFETY: MEDIUM (Whitelisted, but script synthesis is a gap).
- MERKLE: FAILED.
** DONE org-skill-sub-agent-manager.org [ ]
- STATUS: NON-COMPLIANT (Critical Gap)
- ISSUE: No implementation code in Phase D. The skill is only a blueprint. No Merkle-Tree integration for recording or rolling back sub-agent-related state changes or concurrent thoughts.
- SAFETY: N/A (Missing).
- MERKLE: FAILED.
** DONE org-skill-task-integrity.org [ ]
- STATUS: NON-COMPLIANT (Critical Gap)
- ISSUE: No implementation code in Phase D. The skill is only a blueprint. No Merkle-Tree integration for recording or rolling back task-related state changes or transition history.
- SAFETY: N/A (Missing).
- MERKLE: FAILED.
** DONE org-skill-token-accountant.org [ ]
- STATUS: NON-COMPLIANT (Safety/Sovereignty Violation)
- ISSUE: Hot-patches the kernel's core variables (`*provider-cascade*`, `*model-selector-fn*`) directly, bypassing the skill registration system's safety. No Merkle-Tree integration for recording or rolling back provider-related state changes or pain history.
- SAFETY: LOW (Direct kernel mutation).
- MERKLE: FAILED.
* Findings Log
| Skill | Issue | Priority | Status |
|-------+-------+----------+--------|
| | | | |

View File

@@ -1,32 +0,0 @@
# Implementation Plan: Component IV - Peripheral Vision Extraction
## Objective
Implement a sophisticated "Foveal-Peripheral" context model. This ensures the agent has high-resolution focus on the current task (Foveal) while maintaining a low-resolution "skeletal" awareness of the broader Memex structure (Peripheral), optimized for token efficiency and reasoning accuracy.
## Key Files & Context
- **Target:** `projects/opencortex/literate/context.org` (Source of `src/context.lisp`)
- **Core Concept:** Deep pruning of the Org AST based on semantic distance and structural hierarchy.
## Implementation Steps
### 1. Identify Foveal Focus
- Extend the `SIGNAL` structure processing to identify a `target-id` (the current headline being operated on).
### 2. Implement Tree Pruning (`context-extract-peripheral-vision`)
- Create a recursive function that walks the Object Store starting from the root (or active projects).
- **Rule A (Foveal):** If the node matches `target-id`, include it and its immediate children in **Full Resolution** (Content + Attributes).
- **Rule B (Peripheral):** For ancestors and siblings of the target, include only **Title and ID**.
- **Rule C (Background):** For unrelated nodes, omit entirely or include only at Level 1.
### 3. AST to Org Renderer (`context-render-to-org`)
- Implement a serializer that transforms our `org-object` structures back into valid Org-mode strings.
- This allows the LLM to "see" the Memex in its native habitat.
### 4. Integrate with `context-assemble-global-awareness`
- Update this function to use the new extraction and rendering logic.
- Ensure it respects a maximum token/character budget to prevent context overflow.
## Phase E: Chaos (Verification)
- **Structural Test:** Verify that ancestors are rendered as "skeletons" (no body text).
- **Foveal Test:** Verify that the target node is rendered with its full body text.
- **Budget Test:** Verify that the output string stays within defined limits even for large Memex structures.

View File

@@ -1,37 +0,0 @@
# Implementation Plan: Reactive Signal Pipeline Refactor
## Objective
Refactor the monolithic recursive `cognitive-cycle` into a functional, gate-based `reactive-signal-pipeline`. This flattens the execution stack, enables multi-backend consensus, and improves observability according to Component VII of the evolutionary roadmap.
## Key Files & Context
- **Target:** `projects/opencortex/literate/core.org` (Source of `src/core.lisp`)
- **Architectural Reference:** `projects/opencortex/literate/evolution.org`
## Implementation Steps
### 1. Define the Signal Structure
Transition from raw plists to a structured `:SIGNAL` format that tracks state as it moves through the pipeline.
- Attributes: `:status`, `:payload`, `:context`, `:depth`, `:proposals`, `:reply-stream`.
### 2. Implement the Pipeline Gates
Extract existing logic from `cognitive-cycle` into discrete functional gates:
- **`perceive-gate`**: Normalizes input, updates `*object-store*`.
- **`neuro-gate`**: Invokes Probabilistic Engine. Support for future parallel backend calls.
- **`consensus-gate`**: (New) Selects the best proposal from multiple backends (initially a pass-through for the single proposal).
- **`decide-gate`**: Invokes Deterministic Engine safety checks.
- **`dispatch-gate`**: Executes tools or physical actuators.
### 3. Implement the Pipeline Orchestrator (`process-signal`)
Create a function that moves a signal through the sequence of gates.
- **Flattening Recursion:** If `dispatch-gate` results in a tool output or error, it MUST NOT call the pipeline recursively. Instead, it returns a new `:SIGNAL` with `depth + 1`, which the orchestrator then re-injects into the top of the pipe via a loop or queue.
### 4. Refactor `inject-stimulus`
Update `inject-stimulus` to initialize a Signal and hand it to the `process-signal` pipeline instead of `cognitive-cycle`.
### 5. Cleanup
Remove the obsolete `cognitive-cycle` function and update `literate/core.org` documentation/diagrams to reflect the new architecture.
## Verification & Testing (Phase E: Chaos)
- **Unit Tests:** Verify each gate function in isolation.
- **Pipeline Test:** Simulate a complex multi-turn interaction (e.g., User Prompt -> Tool Call -> Tool Result -> LLM Final Answer) and ensure the stack depth remains flat.
- **Immune System Test:** Verify that the depth limit (Max depth 10) still correctly terminates runaway loops.

View File

@@ -1,26 +0,0 @@
#+title: Emacs Setup Improvement & Documentation Project
#+author: Amero Garcia
#+created: [2026-03-16 Mon 13:58]
#+begin_comment
This file outlines the project to collaboratively improve and document Amr's Emacs setup, aiming to make Emacs his primary computing tool.
#+end_comment
* Emacs Setup Improvement & Documentation Project
*Goal:** To collaboratively improve and comprehensively document Amr's Emacs configuration, transitioning Emacs into his primary computing environment.
*Initial Scope:**
- Reviewing the existing Emacs Org-mode configuration file (tangled to set up Emacs).
- Identifying areas for optimization, new functionalities, and better integration with workflows.
- Documenting each significant setting, function, and package.
*Information Needed from Amr:**
- Location of the current Emacs Org-mode configuration file.
- Key pain points or areas where Emacs currently falls short as a "main computing tool."
- Specific desired functionalities or integrations (e.g., mail, calendar, task management, coding environments, note-taking, web browsing within Emacs).
- Any existing documentation or design principles for the current setup.
*Next Steps:**
1. Receive Emacs configuration file location from Amr.
2. Analyze current setup.
3. Propose documentation structure and initial improvements.

View File

@@ -1,27 +0,0 @@
#+TITLE: Amr's Modular Emacs Configuration
#+PROPERTY: header-args :tangle no ; This file is for loading other modules, not for tangling itself.
* Configuration Modules
This file loads the modular Emacs configuration files. It should be the primary way Emacs is configured, replacing or integrating with the original `~/.emacs`, `~/.emacs.d/init.el`, `~/.emacs.d/early-init.el`, and `~/.emacs.d/config.el`.
#+begin_src emacs-lisp :exports none
;; Load early-init.el first, if it exists and is separate (though it's now part of emacs-early-init.org)
;; (load-file (expand-file-name "emacs-early-init.org" (file-name-directory load-file-name)))
;; Load the core settings, including package management and essential setup.
(org-babel-load-file (expand-file-name "emacs-core.org" (file-name-directory load-file-name)))
;; Load early init settings (if separate and not fully covered by core)
(org-babel-load-file (expand-file-name "emacs-early-init.org" (file-name-directory load-file-name)))
;; Load other modules in a logical order
(org-babel-load-file (expand-file-name "emacs-org.org" (file-name-directory load-file-name)))
(org-babel-load-file (expand-file-name "emacs-gtd.org" (file-name-directory load-file-name)))
(org-babel-load-file (expand-file-name "emacs-roam.org" (file-name-directory load-file-name)))
(org-babel-load-file (expand-file-name "emacs-writing.org" (file-name-directory load-file-name)))
(org-babel-load-file (expand-file-name "emacs-media.org" (file-name-directory load-file-name)))
(org-babel-load-file (expand-file-name "emacs-shell.org" (file-name-directory load-file-name)))
(org-babel-load-file (expand-file-name "emacs-ai.org" (file-name-directory load-file-name)))
(org-babel-load-file (expand-file-name "emacs-misc.org" (file-name-directory load-file-name)))
#+end_src

View File

@@ -1,104 +0,0 @@
#+TITLE: AI Configuration
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
* AI Settings
** Ellama
#+begin_src elisp :tangle no
;; YOU DON'T NEED NONE OF THIS CODE FOR SIMPLE INSTALL
;; IT IS AN EXAMPLE OF CUSTOMIZATION.
(use-package ellama
:init
(require 'llm-openai)
;; setup key bindings
(setq ellama-keymap-prefix "C-c e")
)
#+end_src
#+begin_src elisp ~/.emacs.d/custom.el :tangle no
(setopt ellama-providers
'(
;; Ollama Provider (added here with a name)
("ollama" . (make-llm-ollama
;; Consider a dedicated embedding model if gemma isn't ideal for it.
:chat-model "gemma3:latest"
:embedding-model "gemma3:latest" ; Or e.g., "nomic-embed-text"
:default-chat-non-standard-params '(("num_ctx" . 8192))))
("openai" . (make-llm-openai
:key (auth-source-pass-get "api-key" "www/openai.com/amr@gharbeia.net")
:chat-model "gpt-4o"
:embedding-model "text-embedding-3-large"))
("groq" . (make-llm-openai-compatible
:url "https://api.groq.com/openai/v1"
:key (auth-source-pass-get "api-key" "www/console.groq.com/groq@amr.gharbeia.net")
;; Check Groq console for available models, these might change
:chat-model "llama3-70b-8192" ; Example, verify on Groq
:embedding-model "llama3-70b-8192")) ; Groq might not offer dedicated embedding models via this API
))
;; --- Set Active Providers ---
;; Choose your default provider from the list above by its name
(setopt ellama-provider "ollama") ; Or "ollama", "openai", "groq"
;; You can specify different providers for different tasks if needed
(setopt ellama-translation-provider "ollama")
(setopt ellama-naming-provider "ollama")
(setopt ellama-naming-scheme 'ellama-generate-name-by-llm)
(setq llm-debug t)
#+end_src
#+begin_src elisp
(use-package ellama
:ensure t
:bind ("C-c e" . ellama)
;; send last message in chat buffer with C-c C-c
:hook (org-ctrl-c-ctrl-c-final . ellama-chat-send-last-message)
:init (setopt ellama-auto-scroll t)
:config
;; show ellama context in header line in all buffers
(ellama-context-header-line-global-mode +1)
;; show ellama session id in header line in all buffers
(ellama-session-header-line-global-mode +1))
#+end_src
** GPTel
#+begin_src elisp :tangle no
(use-package gptel)
#+end_src
#+begin_src elisp :tangle no
(setq gptel-api-key (auth-source-pass-get "api-key" "www/console.groq.com/groq@amr.gharbeia.net"))
#+end_src
#+begin_src elisp :tangle no
(gptel-make-openai "Groq" ;Any name you want
:host "api.groq.com"
:endpoint "/openai/v1/chat/completions"
:stream t
:key (auth-source-pass-get "api-key" "www/console.groq.com/groq@amr.gharbeia.net") ;can be a function that returns the key
:models '(llama-3.1-70b-versatile
llama-3.1-8b-instant
llama3-70b-8192
llama3-8b-8192
mixtral-8x7b-32768
gemma-7b-it))
#+end_src
** Elisa
#+begin_src elisp :tangle no
(use-package elisa
:init
(setopt elisa-limit 5)
(require 'llm-ollama)
(setopt elisa-embeddings-provider (make-llm-ollama :embedding-model "nomic-embed-text"))
(setopt elisa-chat-provider (make-llm-ollama
:chat-model "sskostyaev/openchat:8k-rag"
:embedding-model "nomic-embed-text"))
)
#+end_src

View File

@@ -1,169 +0,0 @@
#+TITLE: Core Emacs Configuration
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
* Front matter
#+begin_src elisp :tangle ~/.emacs
;;; .emacs --- Global settings
;;; Commentary:
;;; Code:
;; -*- lexical-binding: t; -*-
#+end_src
#+begin_src elisp
;;; config.el --- Summary
;;; Commentary:
;;; Code:
;; -*- lexical-binding: t; -*-
#+end_src
#+begin_src elisp :tangle ~/.emacs.d/custom.el
;;; custom.el --- Summary
;;; Commentary:
;;; Code:
;; -*- lexical-binding: t; -*-
#+end_src
* Garbage collector
Increase threshold to 500 MB to ease startup
#+begin_src elisp :tangle ~/.emacs
(setq gc-cons-threshold (* 500 1024 1024))
#+end_src
Decrease threshold to 5 MB after init
#+begin_src elisp :tangle ~/.emacs
(add-hook 'after-init-hook (lambda () (setq gc-cons-threshold (* 5 1024 1024))))
#+end_src
* Straight.el and use-package
Bootstrap Straight.el and install use-package
#+begin_src elisp :tangle ~/.emacs
(setq straight-repository-branch "develop") ;; Using develop branch temporarily to fix the org-roam-dailies issue.
(eval-and-compile
(defvar bootstrap-version)
(let ((bootstrap-file
(expand-file-name "straight/repos/straight.el/bootstrap.el"
(or (bound-and-true-p straight-base-dir)
user-emacs-directory)))
(bootstrap-version 7))
(unless (file-exists-p bootstrap-file)
(with-current-buffer
(url-retrieve-synchronously "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el" 'silent 'inhibit-cookies)
(goto-char (point-max))
(eval-print-last-sexp)))
(load bootstrap-file nil 'nomessage))
(straight-use-package 'use-package)
)
#+end_src
Integrate use-package and straight
#+begin_src elisp :tangle ~/.emacs
(setq straight-use-package-by-default t)
#+end_src
Make sure Org is installed (straight.el)
#+begin_src elisp :tangle ~/.emacs
(unless (file-directory-p "~/.emacs.d/straight/versions") (make-directory (concat user-emacs-directory "straight/versions")))
#+end_src
#+begin_src elisp :tangle ~/.emacs
(use-package org)
#+end_src
A use-package declaration for simplifying your .emacs
#+begin_src elisp
(require 'use-package)
#+end_src
* Custom file
#+begin_src elisp
(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
(when (file-exists-p custom-file) (load custom-file))
#+end_src
* System information
#+begin_src elisp :tangle ~/.emacs.d/custom.el
(defvar my-laptop-p (equal (system-name) "lilitop"))
(defvar my-server-p (and (equal (system-name) "localhost") (equal user-login-name "root")))
(defvar my-phone-p (not (null (getenv "ANDROID_ROOT")))
"If non-nil, GNU Emacs is running on Termux.")
(when my-phone-p (defvar gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3"))
(global-auto-revert-mode) ; simplifies syncing
#+end_src
* Persistent history
#+begin_src elisp
(savehist-mode)
#+end_src
* Backup and versioning
#+begin_src emacs-lisp
(use-package magit
:ensure t
)
#+end_src
* Personal information
#+begin_src elisp :tangle ~/.emacs.d/custom.el
(setq user-full-name "Amr Gharbeia")
(defvar email-address "amr@gharbeia.net")
(defvar calendar-latitude 39.0)
(defvar calendar-longitude -77.1)
(defvar calendar-location-name "Washington, DC")
(defvar calendar-time-zone -300)
(defvar calendar-standard-time-zone-name "EST")
(defvar calendar-daylight-time-zone-name "EDT")
#+end_src
* Saving Emacs Sessions
Close frame when done
#+begin_src elisp
(add-hook 'server-done-hook (lambda () (delete-frame)))
#+end_src
Save desktop session
#+begin_src elisp
(desktop-save-mode t)
#+end_src
* Security
#+begin_src elisp :tangle no
(use-package password-store)
#+end_src
#+begin_src elisp
(use-package auth-source
:config (auth-source-pass-enable)
)
#+end_src
* End matter
#+begin_src elisp :tangle ~/.emacs
(provide '.emacs)
;;; .emacs ends here
#+end_src
#+begin_src elisp
(provide 'config)
;;; config.el ends here
#+end_src
#+begin_src elisp :tangle ~/.emacs.d/custom.el
(provide 'custom)
;;; custom.el ends here
#+end_src

View File

@@ -1,157 +0,0 @@
#+TITLE: GTD & Agenda Configuration
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
* Agenda
Basic agenda settings
#+begin_src elisp
(setq org-deadline-warning-days 7)
(setq org-agenda-skip-additional-timestamps-same-entry t)
(setq org-agenda-span 'fortnight)
(setq org-agenda-tags-column 'auto)
(setq org-agenda-skip-scheduled-if-deadline-is-shown t)
#+end_src
Agenda files
#+begin_src elisp
(setq org-agenda-files (list
(concat org-directory "inbox.org")
(concat org-directory "gtd.org")
)
)
#+end_src
Better agenda views
#+begin_src elisp :tangle no
(use-package org-super-agenda)
#+end_src
* To-do
Basic todo
#+begin_src elisp
(setq org-todo-keywords
'(
(sequence "TODO(t)" "NEXT(n)" "WAIT(w@/!)" "|" "DONE(d!)" "CNCL(c@)")
)
)
(setq org-todo-keyword-faces
'(
("TODO" :foreground "red" :weight bold)
("NEXT" :foreground "red" :weight bold)
("WAIT" :foreground "yellow" :weight bold)
("DONE" :foreground "green" :weight bold)
("CNCL" :foreground "blue" :weight bold)
)
)
(setq org-enforce-todo-dependencies t)
(setq org-tags-exclude-from-inheritance '("crypt" "!private"))
#+end_src
Switch entry to 'DONE' when all subentries are done
#+begin_src elisp
(defun org-summary-todo (n-done n-not-done)
"Switch entry to 'DONE' when all subentries are done, to 'TODO' otherwise.
Uses N-DONE and N-NOT-DONE"
(let (org-log-done org-log-states) ; turn off logging
(org-todo (if (= n-not-done 0) "DONE" "TODO")
)
)
)
(add-hook 'org-after-todo-statistics-hook #'org-summary-todo)
#+end_src
* Getting Things Done (GTD)
#+begin_src elisp
(use-package org-gtd
:defer t
:init (setq org-gtd-update-ack "4.0.0")
:after org
:config
(setq org-edna-use-inheritance t)
(org-edna-mode)
(setq org-gtd-keyword-mapping
'((todo . "TODO")
(next . "NEXT")
(wait . "WAIT")
(done . "DONE")
(canceled . "CNCL")))
(setq org-gtd-custom-node-paths
'(("Actionable" . '("~/memex/gtd.org" "Actions"))
("Incubate" . '("~/memex/gtd.org" "Incubate"))))
(org-gtd-mode)
:bind (
("C-c d c" . org-gtd-capture)
("C-c d e" . org-gtd-engage)
("C-c d p" . org-gtd-process-inbox)
:map org-gtd-clarify-map
("C-c c" . org-gtd-organize)
)
)
#+end_src
#+begin_src elisp
(defvar org-gtd-directory org-directory)
(defvar org-gtd-organize-hooks '(org-gtd-set-area-of-focus org-set-tags-command))
(defvar org-gtd-organize-hooks '(org-gtd-set-area-of-focus))
(defvar org-gtd-areas-of-focus '(
"Atoms"
"Bits"
"Cells"
"Flags"
"Business"
"Wealth"
"Learning"
"Skills"
"Privacy"
"Archive"
"Library"
"Writing"
"Health"
"Home"
"Family"
"Social"
"Egypt"
)
)
(defvar org-gtd-clarify-show-horizons 'right)
#+end_src
Logging
#+begin_src elisp
(setq org-log-into-drawer "LOGBOOK")
#+end_src
Clocking work in drawer
#+begin_src elisp :tangle no
(setq org-clock-into-drawer t)
#+end_src
Habits
#+begin_src elisp :tangle no
(setq org-habit-graph-column 80)
(setq org-habit-show-habits-only-for-today nil)
#+end_src
* Refile
org-refile targets
#+begin_src elisp
(setq org-refile-targets '((nil :maxlevel . 9)
(org-agenda-files :maxlevel . 9)
)
)
#+end_src
Set type of refile targets completion
#+begin_src elisp
(setq org-outline-path-complete-in-steps nil)
#+end_src
Allow refiling to new parents created on the go after confirmation
#+begin_src elisp
(setq org-refile-allow-creating-parent-nodes 'confirm)
#+end_src

View File

@@ -1,175 +0,0 @@
#+TITLE: Media and Books Configuration
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
* Read ebooks (calibredb)
#+begin_src elisp
(use-package calibredb
:defer t
:config
(setq calibredb-format-all-the-icons t)
(setq calibredb-format-icons-in-terminal t)
)
#+end_src
#+begin_src elisp
;; Forcefully reset the variable after loading calibredb
(defvar calibredb-root-dir (concat (getenv "HOME") "/library/books"))
(defvar calibredb-db-dir (expand-file-name "metadata.db" calibredb-root-dir))
; (defvar calibredb-library-alist (concat (getenv "HOME") "/library/books"))
;; (defvar calibredb-search-page-max-rows 1000)
(defvar calibredb-id-width 6)
(defvar calibredb-title-width 100)
(defvar calibredb-format-width 0)
(defvar calibredb-date-width 0)
(defvar calibredb-author-width 20)
(defvar calibredb-comment-width 0)
(defvar calibredb-tag-width 0)
#+end_src
Some keybindings
#+begin_src elisp ~/.emacs.d/custom.el
(defvar calibredb-show-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "?" #'calibredb-entry-dispatch)
(define-key map "o" #'calibredb-find-file)
(define-key map "O" #'calibredb-find-file-other-frame)
(define-key map "V" #'calibredb-open-file-with-default-tool)
(define-key map "s" #'calibredb-set-metadata-dispatch)
(define-key map "e" #'calibredb-export-dispatch)
(define-key map "q" #'calibredb-entry-quit)
(define-key map "y" #'calibredb-yank-dispatch)
(define-key map "," #'calibredb-quick-look)
(define-key map "." #'calibredb-dired-open)
(define-key map "\M-/" #'calibredb-rga)
(define-key map "\M-t" #'calibredb-set-metadata--tags)
(define-key map "\M-a" #'calibredb-set-metadata--author_sort)
(define-key map "\M-A" #'calibredb-set-metadata--authors)
(define-key map "\M-T" #'calibredb-set-metadata--title)
(define-key map "\M-c" #'calibredb-set-metadata--comments)
map)
"Keymap for `calibredb-show-mode'.")
#+end_src
#+begin_src elisp
(defvar calibredb-search-mode-map
(let ((map (make-sparse-keymap)))
(define-key map [mouse-3] #'calibredb-search-mouse)
(define-key map (kbd "<RET>") #'calibredb-find-file)
(define-key map "?" #'calibredb-dispatch)
(define-key map "a" #'calibredb-add)
(define-key map "A" #'calibredb-add-dir)
(define-key map "c" #'calibredb-clone)
(define-key map "d" #'calibredb-remove)
(define-key map "D" #'calibredb-remove-marked-items)
(define-key map "j" #'calibredb-next-entry)
(define-key map "k" #'calibredb-previous-entry)
(define-key map "l" #'calibredb-virtual-library-list)
(define-key map "L" #'calibredb-library-list)
(define-key map "n" #'calibredb-virtual-library-next)
(define-key map "N" #'calibredb-library-next)
(define-key map "p" #'calibredb-virtual-library-previous)
(define-key map "P" #'calibredb-library-previous)
(define-key map "s" #'calibredb-set-metadata-dispatch)
(define-key map "S" #'calibredb-switch-library)
(define-key map "o" #'calibredb-find-file)
(define-key map "O" #'calibredb-find-file-other-frame)
(define-key map "v" #'calibredb-view)
(define-key map "V" #'calibredb-open-file-with-default-tool)
(define-key map "," #'calibredb-quick-look)
(define-key map "." #'calibredb-dired-open)
(define-key map "y" #'calibredb-yank-dispatch)
(define-key map "b" #'calibredb-catalog-bib-dispatch)
(define-key map "e" #'calibredb-export-dispatch)
(define-key map "r" #'calibredb-search-refresh-and-clear-filter)
(define-key map "R" #'calibredb-search-clear-filter)
(define-key map "q" #'calibredb-search-quit)
(define-key map "m" #'calibredb-mark-and-forward)
(define-key map "f" #'calibredb-toggle-favorite-at-point)
(define-key map "x" #'calibredb-toggle-archive-at-point)
(define-key map "h" #'calibredb-toggle-highlight-at-point)
(define-key map "u" #'calibredb-unmark-and-forward)
(define-key map "i" #'calibredb-edit-annotation)
(define-key map (kbd "<DEL>") #'calibredb-unmark-and-backward)
(define-key map (kbd "<backtab>") #'calibredb-toggle-view)
(define-key map (kbd "TAB") #'calibredb-toggle-view-at-point)
(define-key map "\M-n" #'calibredb-show-next-entry)
(define-key map "\M-p" #'calibredb-show-previous-entry)
(define-key map "/" #'calibredb-search-live-filter)
(define-key map "\M-t" #'calibredb-set-metadata--tags)
(define-key map "\M-a" #'calibredb-set-metadata--author_sort)
(define-key map "\M-A" #'calibredb-set-metadata--authors)
(define-key map "\M-T" #'calibredb-set-metadata--title)
(define-key map "\M-c" #'calibredb-set-metadata--comments)
map)
"Keymap for `calibredb-search-mode'.")
#+end_src
* Annotate PDFs and EPUBs (org-noter)
#+begin_src elisp :tangle no
(use-package org-noter)
#+end_src
#+begin_src elisp :tangle ~/.emacs.d/custom.el
(defvar org-noter-notes-search-path (list (concat org-directory "/library/books")))
(defvar org-noter-default-notes-file-names '("books.org"))
#+end_src
* Link PDFs (org-noter-pdftools)
#+begin_src elisp
(use-package org-noter-pdftools
:after org-noter
:config
;; Add a function to ensure precise note is inserted
(defun org-noter-pdftools-insert-precise-note (&optional toggle-no-questions)
(interactive "P")
(org-noter--with-valid-session
(let ((org-noter-insert-note-no-questions (if toggle-no-questions
(not org-noter-insert-note-no-questions)
org-noter-insert-note-no-questions))
(org-pdftools-use-isearch-link t)
(org-pdftools-use-freepointer-annot t))
(org-noter-insert-note (org-noter--get-precise-info)))))
;; fix https://github.com/weirdNox/org-noter/pull/93/commits/f8349ae7575e599f375de1be6be2d0d5de4e6cbf
(defun org-noter-set-start-location (&optional arg)
"When opening a session with this document, go to the current location.
With a prefix ARG, remove start location."
(interactive "P")
(org-noter--with-valid-session
(let ((inhibit-read-only t)
(ast (org-noter--parse-root))
(location (org-noter--doc-approx-location (when (called-interactively-p 'any) 'interactive))))
(with-current-buffer (org-noter--session-notes-buffer session)
(org-with-wide-buffer
(goto-char (org-element-property :begin ast))
(if arg
(org-entry-delete nil org-noter-property-note-location)
(org-entry-put nil org-noter-property-note-location
(org-noter--pretty-print-location location))))))))
(with-eval-after-load 'pdf-annot
(add-hook 'pdf-annot-activate-handler-functions #'org-noter-pdftools-jump-to-note)
)
)
#+end_src
* View EPUBs (nov.el)
#+begin_src elisp :tangle no
(use-package nov
:config
(add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode))
)
#+end_src
* Zotero (helm-bibtex)
#+begin_src elisp :tangle no
(use-package helm-bibtex)
#+end_src
#+begin_src elisp :tangle ~/.emacs.d/custom.el
(defvar bibtex-completion-bibliography '("~/bibliography/zotero.bib"))
#+end_src

View File

@@ -1,46 +0,0 @@
#+TITLE: Miscellaneous Configuration
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
* Browser (eww)
#+begin_src elisp
(use-package eww
:bind* (("M-m g x" . eww)
("M-m g :" . eww-browse-with-external-browser)
("M-m g #" . eww-list-histories)
("M-m g {" . eww-back-url)
("M-m g }" . eww-forward-url))
:config
(progn
(add-hook 'eww-mode-hook 'visual-line-mode)
)
)
#+end_src
* Manage Docker in Emacs
#+begin_src elisp
(use-package docker
:bind ("C-c d" . docker)
)
#+end_src
* Periodic table of the elements
#+begin_src elisp :tangle no
(use-package chemtable)
#+end_src
* Accounting (beancount)
#+begin_src elisp :tangle no
(use-package beancount
:straight (beancount :type git :host github :repo "beancount/beancount-mode")
:config
(add-to-list 'auto-mode-alist '("\\.beancount\\'" . beancount-mode))
(add-hook 'beancount-mode-hook #'outline-minor-mode)
(define-key beancount-mode-map (kbd "C-c C-n") #'outline-next-visible-heading)
(define-key beancount-mode-map (kbd "C-c C-p") #'outline-previous-visible-heading)
(add-hook 'beancount-mode-hook #'flymake-bean-check-enable)
)
#+end_src

View File

@@ -1,233 +0,0 @@
#+TITLE: Org Mode Configuration
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
* Org Mode
** Basic setup
#+begin_src elisp
(use-package org
:config
(defvar org-outline-path-complete-in-steps nil)
:bind (("C-c l" . org-store-link)
("C-c a" . org-agenda)
("C-c c" . org-capture)
:map org-mode-map)
)
#+end_src
#+begin_src elisp
(defvar org-directory (concat (getenv "HOME") "/memex/"))
#+end_src
** Looks
Basic
#+begin_src elisp
(defvar org-pretty-entities t) ; Improve org mode looks
(defvar org-hide-emphasis-markers t) ; Hide emphasis markup
(defvar org-num-mode nil)
(defvar org-startup-folded 'shw2levels)
#+end_src
Indentation of headers
#+begin_src elisp
(defvar org-startup-indented t) ; Indent org heirarchy
(defvar org-adapt-indentation t)
(defvar org-hide-leading-stars t) ; Minimal Outline
(defvar org-odd-levels-only nil)
#+end_src
Indentation of lists
#+begin_src elisp
(setq org-list-demote-modify-bullet t)
#+end_src
Org-modern
#+begin_src elisp
(use-package org-modern
:ensure t
:config
;; Choose some fonts
(set-face-attribute 'default nil :family "sans-serif")
(set-face-attribute 'variable-pitch nil :family "sans-serif")
(set-face-attribute 'org-modern-symbol nil :family "Iosevka")
;; Edit settings
(defvar org-auto-align-tags nil)
(defvar org-tags-column 0)
(defvar org-catch-invisible-edits 'show-and-error)
(defvar org-special-ctrl-a/e t)
(defvar org-insert-heading-respect-content t)
;; Org styling, hide markup etc.
(defvar org-hide-emphasis-markers t)
(defvar org-pretty-entities t)
;; Agenda styling
(defvar org-agenda-tags-column 0)
(defvar org-agenda-block-separator ?─)
(defvar org-agenda-time-grid
'((daily today require-timed)
(800 1000 1200 1400 1600 1800 2000)
" ┄┄┄┄┄ " "┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄"))
(defvar org-agenda-current-time-string
"◀── now ─────────────────────────────────────────────────")
;; Ellipsis styling
(defvar org-ellipsis "")
(set-face-attribute 'org-ellipsis nil :inherit 'default :box nil)
(global-org-modern-mode)
)
#+end_src
Highlight Sourcecode Syntax
#+begin_src elisp
(setq org-src-fontify-natively t)
(setq org-src-tab-acts-natively t)
#+end_src
Images
#+begin_src elisp
(setq org-startup-with-inline-images t)
(setq org-image-actual-width '(300))
#+end_src
** Capture
#+begin_src elisp
(defvar org-default-notes-file (concat org-directory "inbox.org"))
#+end_src
*** Org-protocol
Linux configuration
#+begin_src bash :tangle no
[Desktop Entry]
Name=org-protocol
Comment=Intercept calls from emacsclient to trigger custom actions
Categories=Other;
Keywords=org-protocol;
Icon=emacs
Type=Application
Exec=emacsclient -- %u
Terminal=false
StartupWMClass=Emacs
MimeType=x-scheme-handler/org-protocol;
#+end_src
#+begin_src bash :tangle no
update-desktop-database ~/.local/share/applications/
#+end_src
Basic configuration
#+begin_src elisp
(require 'org-protocol)
(setq org-protocol-default-buffer-for-file-links "*scratch*") ; fixes 'no buffers remain to edit error for org-protocol capturer
#+end_src
Org-protocol templates
#+begin_src elisp :tangle ~/.emacs.d/custom.el
(defvar org-capture-templates '(
("p" "Protocol"
entry
(file "inbox.org")
"* %^{Title}\nSource: %u, %c\n #+BEGIN_QUOTE\n%i\n#+END_QUOTE\n\n\n%?"
)
("L" "Protocol Link"
entry
(file "inbox.org")
"* %? [[%:link][%:description]]\n:PROPERTIES:\n:TITLE: %:description\n:URI: %:link\n:CREATED: %U\n:END:"
:prepend nil
:empty-lines 1
:created t
:kill-buffer t
)
)
)
#+end_src
#+begin_src elisp
(setq org-protocol-default-template-key "L")
#+end_src
Convert Orgzly captures to org-protocol captures standard
#+begin_src elisp
(defun my/org-convert-orgzly-to-org-protocol ()
"Reformat Orgzly bookmark at point to org-protocol bookmark."
(interactive)
(when (org-at-heading-p)
(let ((headline (nth 4 (org-heading-components))))
;; Find and store the link. Delete the link line.
(search-forward-regexp "^https?://\\S-*" nil t)
(let ((link (match-string 0)))
(beginning-of-line)
(kill-line)
;; Delete any trailing blank spaces
(org-back-to-heading)
(end-of-line)
(when (not (org-on-heading-p))
(delete-char 1)
)
;; Set new headline
(goto-char (org-entry-beginning-position))
(org-edit-headline (format "[[%s][%s]]" link headline))
;; Set new properties
(org-set-property "TITLE" headline)
(org-set-property "URI" link)
(message "Reformatted Orgzly bookmark at point to org-protocol bookmark")
)
)
)
)
#+end_src
** Exporting
#+begin_src elisp :tangle no
(setq org-export-with-smart-quotes t)
(setq org-export-backends '(beamer html latex md))
#+end_src
Export to EPUB
#+begin_src elisp :tangle no
(use-package ox-epub)
#+end_src
** org-attach
#+begin_src elisp
(defvar org-attach-id-dir (concat org-directory "/library"))
#+end_src
** Enable shell scripting support in org-babel
#+begin_src elisp
(defvar org-babel-do-load-languages 'org-babel-load-languages '((shell . t)))
#+end_src
** Insert org-mode links from clipboard
#+begin_src elisp :tangle no
(use-package org-cliplink
:bind
(("C-x p i" . org-cliplink))
)
#+end_src
** Deft
#+begin_src elisp :tangle no
(use-package deft
:commands (deft)
:init
(defvar deft-extensions '("org"))
(defvar deft-recursive nil)
(defvar deft-use-filename-as-title t)
:config
(defvar deft-directory org-directory)
(defvar deft-recursive t)
(defvar deft-strip-summary-regexp ":PROPERTIES:\n\\(.+\n\\)+:END:\n")
(defvar deft-use-filename-as-title t)
:bind ("C-c n d" . deft)
)
#+end_src

View File

@@ -1,140 +0,0 @@
#+TITLE: Org-Roam Configuration
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
* Org-roam
** Basic org-roam setup
#+begin_src elisp
(use-package org-roam
:init (setq org-roam-v2-ack t) ;; Acknowledge V2 upgrade
:after org
:config
(org-roam-db-autosync-enable)
(require 'org-roam-dailies)
:bind (
("C-c n f" . org-roam-node-find)
("C-c n g" . org-roam-graph)
("C-c n r" . org-roam-node-random)
("C-c n h" . org-roam-node-convert-headline)
("C-c n i" . org-roam-node-insert)
("C-c n o" . org-id-get-create)
("C-c n t" . org-roam-tag-add)
("C-c n a" . org-roam-alias-add)
("C-c n l" . org-roam-buffer-display-dedicated)
)
)
#+end_src
#+begin_src elisp
(setq org-roam-directory (concat org-directory "notes"))
(setq org-roam-dailies-directory (concat org-directory "daily"))
#+end_src
#+begin_src elisp :tangle no
(use-package sqlite3)
(require 'sqlite3)
#+end_src
Include subdirectories in org-roam
#+begin_src elisp
(setq org-roam-file-exclude-regexp "^[.][.]?/")
#+end_src
** Display in org-roam-buffer
#+begin_src elisp :tangle no
(setq org-roam-mode-sections
(list #'org-roam-backlinks-section
#'org-roam-reflinks-section
#'org-roam-unlinked-references-section
)
)
#+end_src
** Filter org-roam nodes find by tag
#+begin_src elisp :tangle no
(defun my/org-roam-node-has-tag (node tag)
"Filter function to check if the given NODE has the specified TAG."
(member tag (org-roam-node-tags node))
)
(defun my/org-roam-node-find-by-tag ()
"Find and open an Org-roam node based on a specified tag."
(interactive)
(let ((tag (read-string "Enter tag: ")))
(org-roam-node-find nil nil (lambda (node) (my/org-roam-node-has-tag node tag))))
)
#+end_src
** org-roam-capture templates
#+begin_src elisp
(setq org-roam-capture-templates
'(
("L" "link" plain
(function org-roam--capture-get-point)
"%?"
:file-name "web/%<%Y-%m-%dT%H%M%S>.org"
:head "#+TITLE: ${title}\n#+CREATED: %<%Y-%m-%dT%H%M%S>"
:immediate-finish t
:unnarrowed t
)
("h" "hugo post" plain
"%?"
:target (file+head "posts/${slug}.org"
"#+TITLE: ${title}\n#+DATE: %U\n#+HUGO_BASE_DIR: ~/gharbeia.net\n#+HUGO_SECTION: ./posts\n#+HUGO_AUTO_SET_LASTMOD: t\n#+HUGO_TAGS: article\n#+HUGO_DRAFT: true\n")
:immediate-finish t
:unnarrowed t
)
("p" "person" plain
"%?"
:if-new (file+head "people/${slug}.org"
"#+TITLE: ${title}")
:immediate-finish t
:unnarrowed t
)
)
)
#+end_src
#+begin_src elisp
(setq org-roam-dailies-capture-templates
'(
("d" "daily" plain
""
:target ("file+heaed %<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d>\n\n")
:immediate-finish t
)
)
)
#+end_src
** Move org header to org-roam-daily
#+begin_src elisp :tangle no
(defun my/org-move-entry-to-daily-notes ()
"Move the current org-mode headline to the daily notes file based on its :CREATED: property."
(interactive)
(let*
(
(created-prop (org-entry-get nil "CREATED"))
(created-date (when created-prop
(org-parse-time-string created-prop)))
(year (nth 5 created-date)) ; Extract year (6th element)
(month (nth 4 created-date)) ; Extract month (5th element)
(day (nth 3 created-date)) ; Extract day (4th element)
(target-date (format "%04d-%02d-%02d" year month day)) ; Format date string
(target-file (org-roam-dailies-goto target-date))
)
(when target-file
(org-cut-subtree)
(find-file target-file)
(goto-char (point-max))
(unless (bolp) (newline))
(org-paste-subtree)
)
)
)
#+end_src

View File

@@ -1,73 +0,0 @@
#+TITLE: Shell Configuration
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
* Shell
** Bash completion
#+begin_src elisp
(use-package bash-completion
:config
(require 'bash-completion)
(bash-completion-setup)
)
#+end_src
#+begin_src elisp
(defvar shell-dynamic-complete-functions t)
#+end_src
** Eshell
Add programmable bash completion to Emacs shell-mode
#+begin_src elisp :tangle no
(require 'bash-completion)
(add-hook 'eshell-mode-hook
(lambda ()
(add-hook 'completion-at-point-functions
'bash-completion-capf-nonexclusive nil t
)
)
)
#+end_src
Use colors in eshell
#+begin_src elisp :tangle no
(use-package xterm-color
:commands (xterm-color-filter)
)
(use-package eshell
:after xterm-color
:config
(define-key eshell-hist-mode-map (kbd "M-r") #'consult-history)
(add-hook 'eshell-mode-hook
(lambda ()
(setenv "TERM" "xterm-256color")))
(add-hook 'eshell-before-prompt-hook (setq xterm-color-preserve-properties t))
(add-to-list 'eshell-preoutput-filter-functions 'xterm-color-filter)
(setq eshell-output-filter-functions
(remove 'eshell-handle-ansi-color eshell-output-filter-functions)
)
)
#+end_src
Eshell completion
#+begin_src elisp :tangle no
(add-hook 'eshell-mode-hook
(lambda ()
(add-hook 'completion-at-point-functions
'bash-completion-capf-nonexclusive nil t)))
#+end_src
Emulate A Terminal (EAT)
#+begin_src elisp :tangle no
(use-package eat
:config
;; For `eat-eshell-mode'.
(add-hook 'eshell-load-hook #'eat-eshell-mode)
;; For `eat-eshell-visual-command-mode'.
(add-hook 'eshell-load-hook #'eat-eshell-visual-command-mode)
)
#+end_src

View File

@@ -1,255 +0,0 @@
#+TITLE: Reading and Writing Configuration
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
* Text and Case
** Convert DOuble capitals to single capitals
#+begin_src elisp :tangle no
(defun my/dcaps-to-scaps ()
"Convert word in DOuble CApitals to Single Capitals."
(interactive)
(and (= ?w (char-syntax (char-before)))
(save-excursion
(and (if (called-interactively-p)
(skip-syntax-backward "w")
(= -3 (skip-syntax-backward "w"))
)
(let (case-fold-search)
(looking-at "\\b[[:upper:]]\\{2\\}[[:lower:]]")
)
(capitalize-word 1)
)
)
)
)
#+end_src
Then, lets define a minor mode for it to be activated.
#+begin_src elisp :tangle no
(define-minor-mode my-dubcaps-mode
"Toggle 'my-dubcaps-mode' and convert words in DOuble CApitals to Single Capitals as you type."
:init-value nil
:lighter (" DC")
(if my-dubcaps-mode
(add-hook 'post-self-insert-hook #'my/dcaps-to-scaps nil 'local)
(remove-hook 'post-self-insert-hook #'my/dcaps-to-scaps 'local)))
#+end_src
Finally, lets add a hook so that it is on for all the text files Emacs opens.
#+begin_src elisp :tangle no
(add-hook 'text-mode-hook #'my-dubcaps-mode)
#+end_src
Also, since we add a minor mode string (it might be useful sometimes), currently I prefer to diminish it.
#+begin_src elisp :tangle no
(defun my/diminish-dubcaps ()
(interactive)
(diminish 'my-dubcaps-mode ""))
(add-hook 'my-dubcaps-mode-hook 'my/diminish-dubcaps)
#+end_src
* Reading and Writing
** Move correctly over camelCased words
#+begin_src elisp
(subword-mode)
#+end_src
** Understand the more common sentence with double space
#+begin_src elisp
(setq sentence-end-double-space nil)
#+end_src
** Join lines into paragraph
#+begin_src elisp
(defun my/fill-or-unfill-paragraph (&optional unfill region)
"Fill paragraph (or REGION). With the prefix argument UNFILL, fill it instead."
(interactive (progn
(barf-if-buffer-read-only)
(list (if current-prefix-arg 'fill) t)))
(let ((fill-column (if unfill fill-column (point-max))))
(fill-paragraph nil region)))
(bind-key "M-q" 'my/fill-or-unfill-paragraph)
#+end_src
#+begin_src elisp
(defun my/fill-or-unfill-all-paragraphs (&optional unfill)
"Fill or unfill all paragraphs in the current buffer.
With the prefix argument UNFILL, fill them instead."
(interactive (list (if current-prefix-arg 'fill)))
(let ((fill-column (if unfill fill-column (point-max))))
(save-excursion
(goto-char (point-min))
(while (not (eobp))
(fill-paragraph nil t)
(forward-paragraph)))))
(bind-key "M-Q" 'my/fill-or-unfill-all-paragraphs)
#+end_src
#+begin_src elisp
(remove-hook 'text-mode-hook #'turn-on-auto-fill)
(add-hook 'text-mode-hook 'turn-on-visual-line-mode)
#+end_src
** Expand some words with auto-correct
#+begin_src elisp :tangle no
(setq save-abbrevs 'silently)
(setq-default abbrev-mode t)
#+end_src
** ediff
#+begin_src elisp :tangle no
(setq ediff-window-setup-function 'ediff-setup-windows-plain)
(setq ediff-split-window-function 'split-window-horizontally)
#+end_src
** tramp
#+begin_src elisp :tangle no
(setq tramp-default-method "ssh"
tramp-backup-directory-alist backup-directory-alist
tramp-ssh-controlmaster-options "ssh")
#+end_src
** Clean up space
#+begin_src elisp :tangle no
(bind-key "M-SPC" 'cycle-spacing)
#+end_src
** Transform <a href> links into org links
#+begin_src elisp :tangle no
(defun my/transform-html-links-to-org ()
"Transform all HTML <a> links in the current buffer into 'org-mode' links."
(interactive)
(goto-char (point-min))
(while (re-search-forward "<a href=\"\\(.*?\\)\">\\(.*?\\)</a>" nil t)
(replace-match (org-make-link-string (match-string 1) (match-string 2)))))
#+end_src
** Count words per minute
#+begin_src elisp :tangle no
(require 'org-clock)
(defun my/org-entry-wpm ()
(interactive)
(save-restriction
(save-excursion
(org-narrow-to-subtree)
(goto-char (point-min))
(let* ((words (count-words-region (point-min) (point-max)))
(minutes (org-clock-sum-current-item))
(wpm (/ words minutes)))
(message "WPM: %d (words: %d, minutes: %d)" wpm words minutes)
(kill-new (number-to-string wpm))
)
)
)
)
#+end_src
** Enable dict mode
#+begin_src elisp :tangle no
(setq dictionary-server "automatic")
#+end_src
** Pick out passive voice and weasel words
#+begin_src elisp :tangle no
(use-package writegood-mode
:diminish writegood-mode
:config
(progn (add-hook 'text-mode-hook 'writegood-mode))
)
#+end_src
** Org-babel docker
#+begin_src elisp :tangle no
(use-package ob-docker-build
:straight (ob-docker-build :type git :host github :repo "ifitzpat/ob-docker-build")
:defer t
:config
(add-to-list 'org-babel-load-languages '(docker-build . t))
(org-babel-do-load-languages 'org-babel-load-languages org-babel-load-languages)
)
#+end_src
* Spelling and syntax
** Spell checking
This requires installation of hunspell
#+begin_src bash :tangle no
sudo apt install hunspell
#+end_src
#+begin_src elisp
(use-package flyspell
:config (setq ispell-program-name "hunspell"
ispell-default-dictionary "en_US"
)
:diminish (flyspell-mode . "φ")
:hook (text-mode . flyspell-mode)
:bind (
("M-<f7>" . flyspell-buffer)
("<f7>" . flyspell-word)
("C-;" . flyspell-auto-correct-previous-word)
)
)
#+end_src
** Flyspell correct
#+begin_src elisp :tangle no
(use-package flyspell-correct
:after flyspell
:bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper))
)
#+end_src
** Flycheck
Needs external checkers installed
#+begin_src elisp
(use-package flycheck
:init (global-flycheck-mode)
:diminish (flycheck-mode . "")
:config
(add-hook 'after-init-hook #'global-flycheck-mode)
(setq flycheck-emacs-lisp-load-path 'inherit)
(setq flycheck-emacs-lisp-load-path (concat user-emacs-directory "straight/build"))
)
#+end_src
** Flycheck bash
#+begin_src bash :tangle no
sudo apt install devscripts
#+end_src
#+begin_src elisp :tangle no
(use-package flycheck-checkbashisms
:config
(flycheck-checkbashisms-setup)
)
#+end_src
** Yaml
#+begin_src elisp :tangle no
(use-package yaml-mode
:config
(add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode))
(add-to-list 'auto-mode-alist '("\\.yaml\\'" . yaml-mode))
)
#+end_src
** Docker
#+begin_src elisp :tangle no
(use-package docker-compose-mode)
#+end_src

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,10 @@
(let ((config-dir "~/memex/system/"))
(let ((config-dir "~/memex/projects/dotemacs/modules/"))
;; Load the core settings, including package management and essential setup.
(org-babel-load-file (expand-file-name "emacs-core.org" config-dir))
;; Load UI and theme settings
(org-babel-load-file (expand-file-name "emacs-ui.org" config-dir))
;; Load early init settings (if separate and not fully covered by core)
;; (org-babel-load-file (expand-file-name "emacs-early-init.org" config-dir))

View File

@@ -6,10 +6,13 @@
This file loads the modular Emacs configuration files. It should be the primary way Emacs is configured, replacing or integrating with the original `~/.emacs`, `~/.emacs.d/init.el`, `~/.emacs.d/early-init.el`, and `~/.emacs.d/config.el`.
#+begin_src emacs-lisp
(let ((config-dir "~/memex/system/"))
(let ((config-dir "~/memex/projects/dotemacs/modules/"))
;; Load the core settings, including package management and essential setup.
(org-babel-load-file (expand-file-name "emacs-core.org" config-dir))
;; Load UI and theme settings
(org-babel-load-file (expand-file-name "emacs-ui.org" config-dir))
;; Load early init settings (if separate and not fully covered by core)
;; (org-babel-load-file (expand-file-name "emacs-early-init.org" config-dir))

View File

@@ -1,21 +1,120 @@
#+TITLE: Emacs AI Configuration
#+property: header-args :tangle ~/.emacs.d/modules/ai.el
#+TITLE: AI Configuration
#+PROPERTY: header-args :tangle yes
* ellama
#+begin_src elisp
* AI Settings
** Ellama
#+begin_src elisp :tangle yes
;; YOU DON'T NEED NONE OF THIS CODE FOR SIMPLE INSTALL
;; IT IS AN EXAMPLE OF CUSTOMIZATION.
(use-package ellama
:ensure t
:bind ("C-c e" . ellama)
:hook (org-ctrl-c-ctrl-c-final . ellama-chat-send-last-message)
:init (setopt ellama-auto-scroll t)
:config
(ellama-context-header-line-global-mode +1)
(ellama-session-header-line-global-mode +1)
:init
(require 'llm-openai)
;; setup key bindings
(setq ellama-keymap-prefix "C-c e")
)
#+end_src
* Providers
#+begin_src elisp
#+begin_src elisp :tangle yes
(setopt ellama-providers
'(
;; Ollama Provider (added here with a name)
("ollama" . (make-llm-ollama
;; Consider a dedicated embedding model if gemma isn't ideal for it.
:chat-model "gemma3:latest"
:embedding-model "gemma3:latest" ; Or e.g., "nomic-embed-text"
:default-chat-non-standard-params '(("num_ctx" . 8192))))
("openai" . (make-llm-openai
:key (auth-source-pass-get "api-key" "www/openai.com/amr@gharbeia.net")
:chat-model "gpt-4o"
:embedding-model "text-embedding-3-large"))
("groq" . (make-llm-openai-compatible
:url "https://api.groq.com/openai/v1"
:key (auth-source-pass-get "api-key" "www/console.groq.com/groq@amr.gharbeia.net")
;; Check Groq console for available models, these might change
:chat-model "llama3-70b-8192" ; Example, verify on Groq
:embedding-model "llama3-70b-8192")) ; Groq might not offer dedicated embedding models via this API
))
;; --- Set Active Providers ---
;; Choose your default provider from the list above by its name
(setopt ellama-provider "ollama") ; Or "ollama", "openai", "groq"
;; You can specify different providers for different tasks if needed
(setopt ellama-translation-provider "ollama")
(setopt ellama-naming-provider "ollama")
(setopt ellama-naming-scheme 'ellama-generate-name-by-llm)
(setq llm-debug t)
;; Note: API keys should be handled via auth-source as seen in original config
#+end_src
#+begin_src elisp
(use-package ellama
:ensure t
:bind ("C-c e" . ellama)
;; send last message in chat buffer with C-c C-c
:hook (org-ctrl-c-ctrl-c-final . ellama-chat-send-last-message)
:init (setopt ellama-auto-scroll t)
:config
;; show ellama context in header line in all buffers
(ellama-context-header-line-global-mode +1)
;; show ellama session id in header line in all buffers
(ellama-session-header-line-global-mode +1))
#+end_src
** GPTel
#+begin_src elisp :tangle yes
(use-package gptel)
#+end_src
#+begin_src elisp :tangle yes
(setq gptel-api-key (auth-source-pass-get "api-key" "www/console.groq.com/groq@amr.gharbeia.net"))
#+end_src
#+begin_src elisp :tangle yes
(gptel-make-openai "Groq" ;Any name you want
:host "api.groq.com"
:endpoint "/openai/v1/chat/completions"
:stream t
:key (auth-source-pass-get "api-key" "www/console.groq.com/groq@amr.gharbeia.net") ;can be a function that returns the key
:models '(llama-3.1-70b-versatile
llama-3.1-8b-instant
llama3-70b-8192
llama3-8b-8192
mixtral-8x7b-32768
gemma-7b-it))
#+end_src
** Elisa
#+begin_src elisp :tangle yes
(use-package elisa
:defer t
:init
(setopt elisa-limit 5)
(require 'llm-ollama)
(setopt elisa-embeddings-provider (make-llm-ollama :embedding-model "nomic-embed-text"))
(setopt elisa-chat-provider (make-llm-ollama
:chat-model "sskostyaev/openchat:8k-rag"
:embedding-model "nomic-embed-text"))
)
#+end_src
** OpenCortex (Local Foundry)
#+begin_src elisp :tangle yes
(use-package opencortex
:straight nil
:load-path "~/.local/share/opencortex/src"
:commands (opencortex-connect opencortex-disconnect)
:init
(setq opencortex-host "127.0.0.1")
(setq opencortex-port 9105)
(setq opencortex-executable-path "~/.local/share/opencortex/bin/opencortex-server")
:config
(message "opencortex: Local brain configured at %s" opencortex-executable-path))
#+end_src

View File

@@ -16,6 +16,36 @@
(unless (file-directory-p (expand-file-name "~/.emacs.d/straight/versions")) (make-directory (expand-file-name "~/.emacs.d/straight/versions") t))
(use-package org)
(use-package ef-themes
:config
;; If you like two specific themes and want to switch between them, you
;; can specify them in `ef-themes-to-toggle' and then invoke the command
;; `ef-themes-toggle'. All the themes are included in the variable
;; `ef-themes-collection'.
(setq ef-themes-to-toggle '(ef-summer ef-winter))
(setq ef-themes-headings ; read the manual's entry or the doc string
'((0 variable-pitch light 1.9)
(1 variable-pitch light 1.8)
(2 variable-pitch regular 1.7)
(3 variable-pitch regular 1.6)
(4 variable-pitch regular 1.5)
(5 variable-pitch 1.4) ; absence of weight means `bold'
(6 variable-pitch 1.3)
(7 variable-pitch 1.2)
(t variable-pitch 1.1)))
;; They are nil by default...
(setq ef-themes-mixed-fonts t)
(setq ef-themes-variable-pitch-ui t)
;; Disable all other themes to avoid awkward blending:
(mapc #'disable-theme custom-enabled-themes)
;; Load the theme of choice:
(load-theme 'ef-winter :no-confirm)
)
(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
(when (file-exists-p custom-file) (load custom-file))
@@ -49,7 +79,7 @@
(add-hook 'server-done-hook (lambda () (delete-frame)))
(desktop-save-mode t)
;; (desktop-save-mode t)
(use-package password-store)

View File

@@ -1,55 +1,199 @@
#+TITLE: Emacs Core Configuration
#+property: header-args :tangle ~/.emacs.d/modules/core.el
#+TITLE: Core Emacs Configuration
#+PROPERTY: header-args :tangle yes
* early-init.el
For straight.el to pick up before package.el
* Initialization Bootstrap
#+begin_src elisp :tangle ~/.emacs.d/early-init.el
(setq package-enable-at-startup nil)
#+end_src
This section tangles directly to ~/.emacs to bootstrap the entire system.
* Straight.el Bootstrap
#+begin_src elisp :tangle ~/.emacs
;;; .emacs --- Global settings -*- lexical-binding: t; -*-
(setq gc-cons-threshold (* 500 1024 1024))
(add-hook 'after-init-hook (lambda () (setq gc-cons-threshold (* 5 1024 1024))))
(setq straight-repository-branch "develop")
(eval-and-compile
(defvar bootstrap-version)
(let ((bootstrap-file
(expand-file-name "straight/repos/straight.el/bootstrap.el"
(or (bound-and-true-p straight-base-dir)
user-emacs-directory)))
(bootstrap-version 7))
(unless (file-exists-p bootstrap-file)
(with-current-buffer
(url-retrieve-synchronously "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el" 'silent 'inhibit-cookies)
(goto-char (point-max))
(eval-print-last-sexp)))
(load bootstrap-file nil 'nomessage))
(straight-use-package 'use-package)
)
(eval-and-compile
(defvar bootstrap-version)
(let ((bootstrap-file
(expand-file-name "straight/repos/straight.el/bootstrap.el"
(or (bound-and-true-p straight-base-dir)
user-emacs-directory)))
(bootstrap-version 7))
(unless (file-exists-p bootstrap-file)
(with-current-buffer
(url-retrieve-synchronously "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el" 'silent 'inhibit-cookies)
(goto-char (point-max))
(eval-print-last-sexp)))
(load bootstrap-file nil 'nomessage))
(straight-use-package 'use-package)
(straight-use-package 'org))
(setq straight-use-package-by-default t)
(require 'ob-tangle)
;; Load the modular configuration starting from dotemacs.org
(org-babel-load-file (expand-file-name "~/memex/projects/dotemacs/dotemacs.org"))
(provide '.emacs)
#+end_src
* Server and Performance
#+begin_src elisp :tangle ~/.emacs.d/early-init.el
(require 'server)
(unless (server-running-p) (server-start))
(defvar server-max-buffers 100)
#+end_src
* Front matter
#+begin_src elisp
;;; emacs-core.el --- Summary
;;; Commentary:
;;; Code:
;; -*- lexical-binding: t; -*-
#+end_src
* Garbage collector
Increase threshold to 500 MB to ease startup
#+begin_src elisp
(setq gc-cons-threshold (* 500 1024 1024))
#+end_src
Decrease threshold to 5 MB after init
#+begin_src elisp
(add-hook 'after-init-hook (lambda () (setq gc-cons-threshold (* 5 1024 1024))))
#+end_src
* System Information
#+begin_src elisp :tangle ~/.emacs.d/custom.el
* Straight.el and use-package
Integrate use-package and straight
#+begin_src elisp
(setq straight-use-package-by-default t)
(require 'use-package)
(straight-use-package 'diminish)
(require 'diminish)
#+end_src
Make sure Org is installed (straight.el)
#+begin_src elisp
(unless (file-directory-p (expand-file-name "~/.emacs.d/straight/versions")) (make-directory (expand-file-name "~/.emacs.d/straight/versions") t))
(use-package org)
#+end_src
* UI and Themes
#+begin_src elisp
(use-package ef-themes
:config
;; If you like two specific themes and want to switch between them, you
;; can specify them in `ef-themes-to-toggle' and then invoke the command
;; `ef-themes-toggle'. All the themes are included in the variable
;; `ef-themes-collection'.
(setq ef-themes-to-toggle '(ef-summer ef-winter))
(setq ef-themes-headings ; read the manual's entry or the doc string
'((0 variable-pitch light 1.9)
(1 variable-pitch light 1.8)
(2 variable-pitch regular 1.7)
(3 variable-pitch regular 1.6)
(4 variable-pitch regular 1.5)
(5 variable-pitch 1.4) ; absence of weight means `bold'
(6 variable-pitch 1.3)
(7 variable-pitch 1.2)
(t variable-pitch 1.1)))
;; They are nil by default...
(setq ef-themes-mixed-fonts t)
(setq ef-themes-variable-pitch-ui t)
;; Disable all other themes to avoid awkward blending:
(mapc #'disable-theme custom-enabled-themes)
;; Load the theme of choice:
(load-theme 'ef-winter :no-confirm)
)
#+end_src
* Custom file
#+begin_src elisp
(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
(when (file-exists-p custom-file) (load custom-file))
#+end_src
* System information
#+begin_src elisp
(defvar my-laptop-p (equal (system-name) "lilitop"))
(defvar my-server-p (and (equal (system-name) "localhost") (equal user-login-name "root")))
(defvar my-phone-p (not (null (getenv "ANDROID_ROOT")))
"If non-nil, GNU Emacs is running on Termux.")
(when my-phone-p (defvar gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3"))
(global-auto-revert-mode)
(savehist-mode)
(desktop-save-mode t)
(global-auto-revert-mode) ; simplifies syncing
#+end_src
* Persistent history
#+begin_src elisp
(savehist-mode)
#+end_src
* Disable Syntax Checkers (Diagnostic)
#+begin_src elisp
(when (fboundp 'flycheck-mode)
(setq flycheck-global-modes nil)
(global-flycheck-mode -1))
(when (fboundp 'flymake-mode)
(setq help-at-pt-display-when-idle t)
;; Disable flymake in all buffers
(add-hook 'find-file-hook (lambda () (flymake-mode -1))))
#+end_src
* Backup and versioning
#+begin_src emacs-lisp
(use-package magit)
#+end_src
* Personal information
#+begin_src elisp
(setq user-full-name "Amr Gharbeia")
(defvar email-address "amr@gharbeia.net")
(defvar calendar-latitude 39.0)
(defvar calendar-longitude -77.1)
(defvar calendar-location-name "Washington, DC")
(defvar calendar-time-zone -300)
(defvar calendar-standard-time-zone-name "EST")
(defvar calendar-daylight-time-zone-name "EDT")
#+end_src
* Saving Emacs Sessions
Close frame when done
#+begin_src elisp
(add-hook 'server-done-hook (lambda () (delete-frame)))
#+end_src
Save desktop session
#+begin_src elisp
;; (desktop-save-mode t)
#+end_src
* Security
#+begin_src elisp
(use-package password-store)
#+end_src
#+begin_src elisp
(use-package auth-source
:config (auth-source-pass-enable)
)
#+end_src
* End matter
#+begin_src elisp
(provide 'emacs-core)
;;; emacs-core.el ends here
#+end_src

View File

@@ -1,30 +1,113 @@
#+TITLE: Emacs GTD Configuration
#+property: header-args :tangle ~/.emacs.d/modules/gtd.el
#+TITLE: GTD & Agenda Configuration
#+PROPERTY: header-args :tangle yes
* org-gtd
* Agenda
Basic agenda settings
#+begin_src elisp
(use-package org-gtd
:defer t
:init (setq org-gtd-update-ack "3.0.0")
:after org
:config
(setq org-edna-use-inheritance t)
(org-edna-mode)
:bind (
("C-c d c" . org-gtd-capture)
("C-c d e" . org-gtd-engage)
("C-c d p" . org-gtd-process-inbox)
:map org-gtd-clarify-map
("C-c c" . org-gtd-organize)
)
)
(setq org-deadline-warning-days 7)
(setq org-agenda-skip-additional-timestamps-same-entry t)
(setq org-agenda-span 'fortnight)
(setq org-agenda-tags-column 'auto)
(setq org-agenda-skip-scheduled-if-deadline-is-shown t)
#+end_src
* GTD Directory and Areas
Agenda files
#+begin_src elisp
(defvar org-gtd-directory org-directory)
(defvar org-gtd-organize-hooks '(org-gtd-set-area-of-focus))
(defvar org-gtd-areas-of-focus '(
(setq org-agenda-files (list
(concat org-directory "/inbox.org")
(concat org-directory "/gtd.org")
(concat org-directory "/org-gtd-tasks.org")
(concat org-directory "/projects/opencortex/TODO.org")
)
)
#+end_src
Better agenda views
#+begin_src elisp :tangle yes
(use-package org-super-agenda)
#+end_src
* To-do
Basic todo
#+begin_src elisp
(setq org-todo-keywords
'(
(sequence "TODO(t)" "NEXT(n)" "WAIT(w@/!)" "|" "DONE(d!)" "CNCL(c@)")
)
)
(setq org-todo-keyword-faces
'(
("TODO" :foreground "red" :weight bold)
("NEXT" :foreground "red" :weight bold)
("WAIT" :foreground "yellow" :weight bold)
("DONE" :foreground "green" :weight bold)
("CNCL" :foreground "blue" :weight bold)
)
)
(setq org-enforce-todo-dependencies t)
(setq org-tags-exclude-from-inheritance '("crypt" "!private"))
#+end_src
Switch entry to 'DONE' when all subentries are done
#+begin_src elisp
(defun org-summary-todo (n-done n-not-done)
"Switch entry to 'DONE' when all subentries are done, to 'TODO' otherwise.
Uses N-DONE and N-NOT-DONE"
(let (org-log-done org-log-states) ; turn off logging
(org-todo (if (= n-not-done 0) "DONE" "TODO")
)
)
)
;; (add-hook 'org-after-todo-statistics-hook #'org-summary-todo)
#+end_src
* Getting Things Done (GTD)
#+begin_src elisp
(use-package f)
(use-package dash)
(use-package s)
(use-package org-edna
:config
(setq org-edna-use-inheritance t)
(org-edna-mode))
(use-package org-gtd
:straight (org-gtd :type git :host github :repo "Trevoke/org-gtd.el")
:demand t
:init (setq org-gtd-update-ack "4.0.0")
:config
(setq org-gtd-keyword-mapping
'((todo . "TODO")
(next . "NEXT")
(wait . "WAIT")
(done . "DONE")
(canceled . "CNCL")))
(setq org-gtd-custom-node-paths
(list (list "Actionable" (expand-file-name "~/memex/gtd.org") "Actions")
(list "Legacy" (expand-file-name "~/memex/org-gtd-tasks.org") "Actions")
(list "Projects" (expand-file-name "~/memex/gtd.org") "Projects")
(list "Incubate" (expand-file-name "~/memex/gtd.org") "Incubate")))
(org-gtd-mode)
)
(global-set-key (kbd "C-c d c") #'org-gtd-capture)
(global-set-key (kbd "C-c d e") #'org-gtd-engage)
(global-set-key (kbd "C-c d p") #'org-gtd-process-inbox)
(with-eval-after-load 'org-gtd
(define-key org-gtd-clarify-map (kbd "C-c c") #'org-gtd-organize))
#+end_src
#+begin_src elisp
(setq org-gtd-directory org-directory)
(setq org-gtd-organize-hooks '(org-gtd-set-area-of-focus))
(setq org-gtd-areas-of-focus '(
"Atoms"
"Bits"
"Cells"
@@ -44,5 +127,41 @@
"Egypt"
)
)
(defvar org-gtd-clarify-show-horizons 'right)
(setq org-gtd-clarify-show-horizons 'right)
#+end_src
Logging
#+begin_src elisp
(setq org-log-into-drawer "LOGBOOK")
#+end_src
Clocking work in drawer
#+begin_src elisp :tangle yes
(setq org-clock-into-drawer t)
#+end_src
Habits
#+begin_src elisp :tangle yes
(setq org-habit-graph-column 80)
(setq org-habit-show-habits-only-for-today nil)
#+end_src
* Refile
org-refile targets
#+begin_src elisp
(setq org-refile-targets '((nil :maxlevel . 9)
(org-agenda-files :maxlevel . 9)
)
)
#+end_src
Set type of refile targets completion
#+begin_src elisp
(setq org-outline-path-complete-in-steps nil)
#+end_src
Allow refiling to new parents created on the go after confirmation
#+begin_src elisp
(setq org-refile-allow-creating-parent-nodes 'confirm)
#+end_src

View File

@@ -21,6 +21,9 @@
(setq org-noter-notes-search-path (list (expand-file-name "~/memex/library/books")))
(setq org-noter-default-notes-file-names '("books.org")))
(setq org-noter-notes-search-path (list (concat org-directory "/library/books")))
(setq org-noter-default-notes-file-names '("books.org"))
(use-package org-noter-pdftools
:after org-noter
:config
@@ -62,3 +65,5 @@ With a prefix ARG, remove start location."
)
(use-package helm-bibtex)
(setq bibtex-completion-bibliography '("~/bibliography/zotero.bib"))

View File

@@ -1,39 +1,101 @@
#+TITLE: Emacs Media and E-books Configuration
#+property: header-args :tangle ~/.emacs.d/modules/media.el
#+TITLE: Media and Books Configuration
#+PROPERTY: header-args :tangle yes
* Read ebooks (calibredb)
* calibredb
#+begin_src elisp
(use-package calibredb
:defer t
:config
(setq calibredb-format-all-the-icons t)
(setq calibredb-format-icons-in-terminal t)
)
(setq calibredb-format-all-the-icons t)
(setq calibredb-format-icons-in-terminal t))
#+end_src
(defvar calibredb-root-dir (concat (getenv "HOME") "/library/books"))
#+begin_src elisp
(defvar calibredb-root-dir (expand-file-name "~/memex/library/books"))
(defvar calibredb-db-dir (expand-file-name "metadata.db" calibredb-root-dir))
(defvar calibredb-id-width 6)
(defvar calibredb-title-width 100)
(defvar calibredb-author-width 20)
#+end_src
* nov.el (EPUB Viewer)
* PDF Tools
#+begin_src elisp
(use-package pdf-tools
:mode ("\\.pdf\\'" . pdf-view-mode)
:config
(pdf-tools-install :no-query)
(setq-default pdf-view-display-size 'fit-page)
(setq pdf-annot-activate-created-annotations t))
#+end_src
* Annotate PDFs and EPUBs (org-noter)
#+begin_src elisp
(use-package org-noter
:config
(setq org-noter-notes-search-path (list (expand-file-name "~/memex/library/books")))
(setq org-noter-default-notes-file-names '("books.org")))
#+end_src
#+begin_src elisp :tangle yes
(setq org-noter-notes-search-path (list (concat org-directory "/library/books")))
(setq org-noter-default-notes-file-names '("books.org"))
#+end_src
* Link PDFs (org-noter-pdftools)
#+begin_src elisp
(use-package org-noter-pdftools
:after org-noter
:config
;; Add a function to ensure precise note is inserted
(defun org-noter-pdftools-insert-precise-note (&optional toggle-no-questions)
(interactive "P")
(org-noter--with-valid-session
(let ((org-noter-insert-note-no-questions (if toggle-no-questions
(not org-noter-insert-note-no-questions)
org-noter-insert-note-no-questions))
(org-pdftools-use-isearch-link t)
(org-pdftools-use-freepointer-annot t))
(org-noter-insert-note (org-noter--get-precise-info)))))
;; fix https://github.com/weirdNox/org-noter/pull/93/commits/f8349ae7575e599f375de1be6be2d0d5de4e6cbf
(defun org-noter-set-start-location (&optional arg)
"When opening a session with this document, go to the current location.
With a prefix ARG, remove start location."
(interactive "P")
(org-noter--with-valid-session
(let ((inhibit-read-only t)
(ast (org-noter--parse-root))
(location (org-noter--doc-approx-location (when (called-interactively-p 'any) 'interactive))))
(with-current-buffer (org-noter--session-notes-buffer session)
(org-with-wide-buffer
(goto-char (org-element-property :begin ast))
(if arg
(org-entry-delete nil org-noter-property-note-location)
(org-entry-put nil org-noter-property-note-location
(org-noter--pretty-print-location location))))))))
(with-eval-after-load 'pdf-annot
(add-hook 'pdf-annot-activate-handler-functions #'org-noter-pdftools-jump-to-note)
)
)
#+end_src
* View EPUBs (nov.el)
#+begin_src elisp :tangle yes
(use-package nov
:config
(add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode))
)
#+end_src
* org-noter and PDF Tools
#+begin_src elisp
(use-package org-noter)
(use-package org-noter-pdftools
:after org-noter
:config
(with-eval-after-load 'pdf-annot
(add-hook 'pdf-annot-activate-handler-functions #'org-noter-pdftools-jump-to-note)
)
)
* Zotero (helm-bibtex)
#+begin_src elisp :tangle yes
(use-package helm-bibtex)
#+end_src
#+begin_src elisp :tangle yes
(setq bibtex-completion-bibliography '("~/bibliography/zotero.bib"))
#+end_src

View File

@@ -68,6 +68,24 @@
(require 'org-protocol)
(setq org-protocol-default-buffer-for-file-links "*scratch*") ; fixes 'no buffers remain to edit error for org-protocol capturer
(setq org-capture-templates '(
("p" "Protocol"
entry
(file "inbox.org")
"* %^{Title}\nSource: %u, %c\n #+BEGIN_QUOTE\n%i\n#+END_QUOTE\n\n\n%?"
)
("L" "Protocol Link"
entry
(file "inbox.org")
"* %? [[%:link][%:description]]\n:PROPERTIES:\n:TITLE: %:description\n:URI: %:link\n:CREATED: %U\n:END:"
:prepend nil
:empty-lines 1
:created t
:kill-buffer t
)
)
)
(setq org-protocol-default-template-key "L")
(defun my/org-convert-orgzly-to-org-protocol ()

View File

@@ -1,7 +1,10 @@
#+TITLE: Emacs Org-mode Configuration
#+property: header-args :tangle ~/.emacs.d/modules/org.el
#+TITLE: Org Mode Configuration
#+PROPERTY: header-args :tangle yes
* Org Mode
** Basic setup
* Core Org Setup
#+begin_src elisp
(use-package org
:config
@@ -11,41 +14,130 @@
("C-c c" . org-capture)
:map org-mode-map)
)
(defvar org-directory (concat (getenv "HOME") "/org/"))
#+end_src
* Agenda
#+begin_src elisp
(setq org-deadline-warning-days 7)
(setq org-agenda-skip-additional-timestamps-same-entry t)
(setq org-agenda-span 'fortnight)
(setq org-agenda-tags-column 'auto)
(setq org-agenda-skip-scheduled-if-deadline-is-shown t)
(setq org-agenda-files (list
(concat org-directory "/0_inbox/inbox.org")
(concat org-directory "/0_inbox/org-gtd-tasks.org")
)
)
(setq org-directory (expand-file-name "~/memex/"))
#+end_src
* Capture and Protocol
** Looks
Basic
#+begin_src elisp
(defvar org-pretty-entities t) ; Improve org mode looks
(defvar org-hide-emphasis-markers t) ; Hide emphasis markup
(defvar org-num-mode nil)
(defvar org-startup-folded 'shw2levels)
#+end_src
Indentation of headers
#+begin_src elisp
(defvar org-startup-indented t) ; Indent org heirarchy
(defvar org-adapt-indentation t)
(defvar org-hide-leading-stars t) ; Minimal Outline
(defvar org-odd-levels-only nil)
#+end_src
Indentation of lists
#+begin_src elisp
(setq org-list-demote-modify-bullet t)
#+end_src
Org-modern
#+begin_src elisp
(use-package org-modern
:ensure t
:config
;; Choose some fonts
(set-face-attribute 'default nil :family "sans-serif")
(set-face-attribute 'variable-pitch nil :family "sans-serif")
(set-face-attribute 'org-modern-symbol nil :family "Iosevka")
;; Edit settings
(defvar org-auto-align-tags nil)
(defvar org-tags-column 0)
(defvar org-catch-invisible-edits 'show-and-error)
(defvar org-special-ctrl-a/e t)
(defvar org-insert-heading-respect-content t)
;; Org styling, hide markup etc.
(defvar org-hide-emphasis-markers t)
(defvar org-pretty-entities t)
;; Agenda styling
(defvar org-agenda-tags-column 0)
(defvar org-agenda-block-separator ?─)
(defvar org-agenda-time-grid
'((daily today require-timed)
(800 1000 1200 1400 1600 1800 2000)
" ┄┄┄┄┄ " "┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄"))
(defvar org-agenda-current-time-string
"◀── now ─────────────────────────────────────────────────")
;; Ellipsis styling
(defvar org-ellipsis "")
(set-face-attribute 'org-ellipsis nil :inherit 'default :box nil)
(global-org-modern-mode)
)
#+end_src
Highlight Sourcecode Syntax
#+begin_src elisp
(setq org-src-fontify-natively t)
(setq org-src-tab-acts-natively t)
#+end_src
Images
#+begin_src elisp
(setq org-startup-with-inline-images t)
(setq org-image-actual-width '(300))
#+end_src
** Capture
#+begin_src elisp
(defvar org-default-notes-file (concat org-directory "inbox.org"))
#+end_src
*** Org-protocol
Linux configuration
#+begin_src bash :tangle yes
[Desktop Entry]
Name=org-protocol
Comment=Intercept calls from emacsclient to trigger custom actions
Categories=Other;
Keywords=org-protocol;
Icon=emacs
Type=Application
Exec=emacsclient -- %u
Terminal=false
StartupWMClass=Emacs
MimeType=x-scheme-handler/org-protocol;
#+end_src
#+begin_src bash :tangle yes
update-desktop-database ~/.local/share/applications/
#+end_src
Basic configuration
#+begin_src elisp
(require 'org-protocol)
(setq org-protocol-default-buffer-for-file-links "*scratch*")
(defvar org-default-notes-file (concat org-directory "/0_inbox/inbox.org"))
(setq org-protocol-default-template-key "L")
(setq org-protocol-default-buffer-for-file-links "*scratch*") ; fixes 'no buffers remain to edit error for org-protocol capturer
#+end_src
#+begin_src elisp :tangle ~/.emacs.d/custom.el
(defvar org-capture-templates '(
Org-protocol templates
#+begin_src elisp :tangle yes
(setq org-capture-templates '(
("p" "Protocol"
entry
(file "0_inbox/inbox.org")
(file "inbox.org")
"* %^{Title}\nSource: %u, %c\n #+BEGIN_QUOTE\n%i\n#+END_QUOTE\n\n\n%?"
)
("L" "Protocol Link"
entry
(file "0_inbox/inbox.org")
(file "inbox.org")
"* %? [[%:link][%:description]]\n:PROPERTIES:\n:TITLE: %:description\n:URI: %:link\n:CREATED: %U\n:END:"
:prepend nil
:empty-lines 1
@@ -56,14 +148,86 @@
)
#+end_src
* TODO Settings
#+begin_src elisp
(setq org-todo-keywords
'(
(sequence "TODO(t)" "NEXT(n)" "|" "DONE(d!)")
(sequence "WAIT(w@/!)" "|" "CNCL(c@)")
)
)
(setq org-enforce-todo-dependencies t)
(setq org-log-into-drawer "LOGBOOK")
(setq org-protocol-default-template-key "L")
#+end_src
Convert Orgzly captures to org-protocol captures standard
#+begin_src elisp
(defun my/org-convert-orgzly-to-org-protocol ()
"Reformat Orgzly bookmark at point to org-protocol bookmark."
(interactive)
(when (org-at-heading-p)
(let ((headline (nth 4 (org-heading-components))))
;; Find and store the link. Delete the link line.
(search-forward-regexp "^https?://\\S-*" nil t)
(let ((link (match-string 0)))
(beginning-of-line)
(kill-line)
;; Delete any trailing blank spaces
(org-back-to-heading)
(end-of-line)
(when (not (org-on-heading-p))
(delete-char 1)
)
;; Set new headline
(goto-char (org-entry-beginning-position))
(org-edit-headline (format "[[%s][%s]]" link headline))
;; Set new properties
(org-set-property "TITLE" headline)
(org-set-property "URI" link)
(message "Reformatted Orgzly bookmark at point to org-protocol bookmark")
)
)
)
)
#+end_src
** Exporting
#+begin_src elisp :tangle yes
(setq org-export-with-smart-quotes t)
(setq org-export-backends '(beamer html latex md))
#+end_src
Export to EPUB
#+begin_src elisp :tangle yes
(use-package ox-epub)
#+end_src
** org-attach
#+begin_src elisp
(setq org-attach-id-dir (concat org-directory "/library"))
#+end_src
** Enable shell scripting support in org-babel
#+begin_src elisp
(defvar org-babel-do-load-languages 'org-babel-load-languages '((shell . t)))
#+end_src
** Insert org-mode links from clipboard
#+begin_src elisp :tangle yes
(use-package org-cliplink
:bind
(("C-x p i" . org-cliplink))
)
#+end_src
** Deft
#+begin_src elisp :tangle yes
(use-package deft
:commands (deft)
:init
(defvar deft-extensions '("org"))
(defvar deft-recursive nil)
(defvar deft-use-filename-as-title t)
:config
(defvar deft-directory org-directory)
(defvar deft-recursive t)
(defvar deft-strip-summary-regexp ":PROPERTIES:\n\\(.+\n\\)+:END:\n")
(defvar deft-use-filename-as-title t)
:bind ("C-c n d" . deft)
)
#+end_src

View File

@@ -1,42 +1,73 @@
#+TITLE: Emacs Org-roam Configuration
#+property: header-args :tangle ~/.emacs.d/modules/roam.el
#+TITLE: Org-Roam Configuration
#+PROPERTY: header-args :tangle yes
* Org-roam
** Basic org-roam setup
* org-roam Setup
#+begin_src elisp
(use-package org-roam
:init (setq org-roam-v2-ack t)
:after org
:config
(org-roam-db-autosync-enable)
(require 'org-roam-dailies)
(setq org-roam-mode-sections
(list #'org-roam-backlinks-section
#'org-roam-reflinks-section
#'org-roam-unlinked-references-section
)
)
:bind (
("C-c n f" . org-roam-node-find)
("C-c n g" . org-roam-graph)
("C-c n r" . org-roam-node-random)
("C-c n h" . org-roam-node-convert-headline)
("C-c n i" . org-roam-node-insert)
("C-c n o" . org-id-get-create)
("C-c n t" . org-roam-tag-add)
("C-c n a" . org-roam-alias-add)
("C-c n l" . org-roam-buffer-display-dedicated)
)
)
(use-package org-roam
:init (setq org-roam-v2-ack t) ;; Acknowledge V2 upgrade
:after org
:config
(org-roam-db-autosync-enable)
(require 'org-roam-dailies)
:bind (
("C-c n f" . org-roam-node-find)
("C-c n g" . org-roam-graph)
("C-c n r" . org-roam-node-random)
("C-c n h" . org-roam-node-convert-headline)
("C-c n i" . org-roam-node-insert)
("C-c n o" . org-id-get-create)
("C-c n t" . org-roam-tag-add)
("C-c n a" . org-roam-alias-add)
("C-c n l" . org-roam-buffer-display-dedicated)
)
)
#+end_src
* Directories
#+begin_src elisp
(setq org-roam-directory (concat org-directory "/1_thinking"))
(setq org-roam-dailies-directory (concat org-directory "/0_inbox/daily"))
(setq org-roam-directory (expand-file-name (concat org-directory "notes")))
(setq org-roam-dailies-directory (expand-file-name (concat org-directory "daily")))
#+end_src
#+begin_src elisp :tangle yes
(use-package sqlite3)
(require 'sqlite3)
#+end_src
Include subdirectories in org-roam
#+begin_src elisp
(setq org-roam-file-exclude-regexp "^[.][.]?/")
#+end_src
* Capture Templates
** Display in org-roam-buffer
#+begin_src elisp :tangle yes
(setq org-roam-mode-sections
(list #'org-roam-backlinks-section
#'org-roam-reflinks-section
#'org-roam-unlinked-references-section
)
)
#+end_src
** Filter org-roam nodes find by tag
#+begin_src elisp :tangle yes
(defun my/org-roam-node-has-tag (node tag)
"Filter function to check if the given NODE has the specified TAG."
(member tag (org-roam-node-tags node))
)
(defun my/org-roam-node-find-by-tag ()
"Find and open an Org-roam node based on a specified tag."
(interactive)
(let ((tag (read-string "Enter tag: ")))
(org-roam-node-find nil nil (lambda (node) (my/org-roam-node-has-tag node tag))))
)
#+end_src
** org-roam-capture templates
#+begin_src elisp
(setq org-roam-capture-templates
'(
@@ -48,6 +79,7 @@
:immediate-finish t
:unnarrowed t
)
("h" "hugo post" plain
"%?"
:target (file+head "posts/${slug}.org"
@@ -55,6 +87,7 @@
:immediate-finish t
:unnarrowed t
)
("p" "person" plain
"%?"
:if-new (file+head "people/${slug}.org"
@@ -64,7 +97,9 @@
)
)
)
#+end_src
#+begin_src elisp
(setq org-roam-dailies-capture-templates
'(
("d" "daily" plain
@@ -75,3 +110,31 @@
)
)
#+end_src
** Move org header to org-roam-daily
#+begin_src elisp :tangle yes
(defun my/org-move-entry-to-daily-notes ()
"Move the current org-mode headline to the daily notes file based on its :CREATED: property."
(interactive)
(let*
(
(created-prop (org-entry-get nil "CREATED"))
(created-date (when created-prop
(org-parse-time-string created-prop)))
(year (nth 5 created-date)) ; Extract year (6th element)
(month (nth 4 created-date)) ; Extract month (5th element)
(day (nth 3 created-date)) ; Extract day (4th element)
(target-date (format "%04d-%02d-%02d" year month day)) ; Format date string
(target-file (org-roam-dailies-goto target-date))
)
(when target-file
(org-cut-subtree)
(find-file target-file)
(goto-char (point-max))
(unless (bolp) (newline))
(org-paste-subtree)
)
)
)
#+end_src

View File

@@ -1,18 +1,86 @@
#+TITLE: Emacs Shell Configuration
#+property: header-args :tangle ~/.emacs.d/modules/shell.el
#+TITLE: Shell Configuration
#+PROPERTY: header-args :tangle yes
* Shell
** Bash completion
* Bash Completion
#+begin_src elisp
(use-package bash-completion
:config
(require 'bash-completion)
(bash-completion-setup)
)
(defvar shell-dynamic-complete-functions t)
#+end_src
* Frame Management
#+begin_src elisp
(add-hook 'server-done-hook (lambda () (delete-frame)))
(defvar shell-dynamic-complete-functions t)
#+end_src
** Eshell
Add programmable bash completion to Emacs shell-mode
#+begin_src elisp :tangle yes
(require 'bash-completion)
(add-hook 'eshell-mode-hook
(lambda ()
(add-hook 'completion-at-point-functions
'bash-completion-capf-nonexclusive nil t
)
)
)
#+end_src
Use colors in eshell
#+begin_src elisp :tangle yes
(use-package xterm-color
:commands (xterm-color-filter)
)
(use-package eshell
:after xterm-color
:config
(define-key eshell-hist-mode-map (kbd "M-r") #'consult-history)
(add-hook 'eshell-mode-hook
(lambda ()
(setenv "TERM" "xterm-256color")))
(add-hook 'eshell-before-prompt-hook (setq xterm-color-preserve-properties t))
(add-to-list 'eshell-preoutput-filter-functions 'xterm-color-filter)
(setq eshell-output-filter-functions
(remove 'eshell-handle-ansi-color eshell-output-filter-functions)
)
)
#+end_src
Eshell completion
#+begin_src elisp :tangle yes
(add-hook 'eshell-mode-hook
(lambda ()
(add-hook 'completion-at-point-functions
'bash-completion-capf-nonexclusive nil t)))
#+end_src
Emulate A Terminal (EAT)
#+begin_src elisp :tangle yes
(use-package eat
:config
;; For `eat-eshell-mode'.
(add-hook 'eshell-load-hook #'eat-eshell-mode)
;; For `eat-eshell-visual-command-mode'.
(add-hook 'eshell-load-hook #'eat-eshell-visual-command-mode)
)
#+end_src
* Server Actuation (Bash Integration)
Ensure that emacsclient always opens in a GUI frame by default when called from the shell.
#+begin_src bash :tangle ~/.bash_aliases
# Use emacsclient to open files in the GUI, starting daemon if needed
alias em="emacsclient -c -a ''"
# Set emacsclient as the default editor
export EDITOR="emacsclient -c -a ''"
export VISUAL="emacsclient -c -a ''"
#+end_src

View File

@@ -0,0 +1,16 @@
(when (fboundp 'tool-bar-mode) (tool-bar-mode -1))
(when (fboundp 'menu-bar-mode) (menu-bar-mode -1))
(when (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))
(setq inhibit-startup-screen t)
(setq initial-scratch-message nil)
(set-face-attribute 'default nil :family "sans-serif" :height 120)
(set-face-attribute 'variable-pitch nil :family "sans-serif")
(use-package org-modern
:ensure t
:config
(set-face-attribute 'org-modern-symbol nil :family "Iosevka")
(global-org-modern-mode)
)

View File

@@ -1,59 +1,32 @@
#+TITLE: Emacs UI Configuration
#+property: header-args :tangle ~/.emacs.d/modules/ui.el
#+PROPERTY: header-args :tangle yes
* Appearance
Basic UI settings for a cleaner look.
#+begin_src elisp
(defvar org-pretty-entities t) ; Improve org mode looks
(defvar org-hide-emphasis-markers t) ; Hide emphasis markup
(defvar org-num-mode nil)
(defvar org-startup-folded 'shw2levels)
(defvar org-startup-indented t) ; Indent org heirarchy
(defvar org-adapt-indentation t)
(defvar org-hide-leading-stars t) ; Minimal Outline
(defvar org-odd-levels-only nil)
(when (fboundp 'tool-bar-mode) (tool-bar-mode -1))
(when (fboundp 'menu-bar-mode) (menu-bar-mode -1))
(when (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))
(setq inhibit-startup-screen t)
(setq initial-scratch-message nil)
#+end_src
* Org-modern
* Fonts
#+begin_src elisp
(set-face-attribute 'default nil :family "sans-serif" :height 120)
(set-face-attribute 'variable-pitch nil :family "sans-serif")
#+end_src
* Org-modern (UI elements)
#+begin_src elisp
(use-package org-modern
:ensure t
:config
;; Choose some fonts
(set-face-attribute 'default nil :family "sans-serif")
(set-face-attribute 'variable-pitch nil :family "sans-serif")
(set-face-attribute 'org-modern-symbol nil :family "Iosevka")
;; Edit settings
(defvar org-auto-align-tags nil)
(defvar org-tags-column 0)
(defvar org-catch-invisible-edits 'show-and-error)
(defvar org-special-ctrl-a/e t)
(defvar org-insert-heading-respect-content t)
;; Org styling, hide markup etc.
(defvar org-hide-emphasis-markers t)
(defvar org-pretty-entities t)
;; Agenda styling
(defvar org-agenda-tags-column 0)
(defvar org-agenda-block-separator ?─)
(defvar org-agenda-time-grid
'((daily today require-timed)
(800 1000 1200 1400 1600 1800 2000)
" ┄┄┄┄┄ " "┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄"))
(defvar org-agenda-current-time-string
"◀── now ─────────────────────────────────────────────────")
;; Ellipsis styling
(defvar org-ellipsis "")
(set-face-attribute 'org-ellipsis nil :inherit 'default :box nil)
(global-org-modern-mode)
(global-org-modern-mode)
)
#+end_src
* Syntax Highlighting
#+begin_src elisp
(setq org-src-fontify-natively t)
(setq org-src-tab-acts-natively t)
#+end_src

View File

@@ -1,7 +1,195 @@
#+TITLE: Emacs Writing Configuration
#+property: header-args :tangle ~/.emacs.d/modules/writing.el
#+TITLE: Reading and Writing Configuration
#+PROPERTY: header-args :tangle yes
* Text and Case
** Convert DOuble capitals to single capitals
#+begin_src elisp :tangle yes
(defun my/dcaps-to-scaps ()
"Convert word in DOuble CApitals to Single Capitals."
(interactive)
(and (= ?w (char-syntax (char-before)))
(save-excursion
(and (if (called-interactively-p)
(skip-syntax-backward "w")
(= -3 (skip-syntax-backward "w"))
)
(let (case-fold-search)
(looking-at "\\b[[:upper:]]\\{2\\}[[:lower:]]")
)
(capitalize-word 1)
)
)
)
)
#+end_src
Then, lets define a minor mode for it to be activated.
#+begin_src elisp :tangle yes
(define-minor-mode my-dubcaps-mode
"Toggle 'my-dubcaps-mode' and convert words in DOuble CApitals to Single Capitals as you type."
:init-value nil
:lighter (" DC")
(if my-dubcaps-mode
(add-hook 'post-self-insert-hook #'my/dcaps-to-scaps nil 'local)
(remove-hook 'post-self-insert-hook #'my/dcaps-to-scaps 'local)))
#+end_src
Finally, lets add a hook so that it is on for all the text files Emacs opens.
#+begin_src elisp :tangle yes
(add-hook 'text-mode-hook #'my-dubcaps-mode)
#+end_src
Also, since we add a minor mode string (it might be useful sometimes), currently I prefer to diminish it.
#+begin_src elisp :tangle yes
(defun my/diminish-dubcaps ()
(interactive)
(diminish 'my-dubcaps-mode ""))
(add-hook 'my-dubcaps-mode-hook 'my/diminish-dubcaps)
#+end_src
* Reading and Writing
** Move correctly over camelCased words
#+begin_src elisp
(subword-mode)
#+end_src
** Understand the more common sentence with double space
#+begin_src elisp
(setq sentence-end-double-space nil)
#+end_src
** Join lines into paragraph
#+begin_src elisp
(defun my/fill-or-unfill-paragraph (&optional unfill region)
"Fill paragraph (or REGION). With the prefix argument UNFILL, fill it instead."
(interactive (progn
(barf-if-buffer-read-only)
(list (if current-prefix-arg 'fill) t)))
(let ((fill-column (if unfill fill-column (point-max))))
(fill-paragraph nil region)))
(bind-key "M-q" 'my/fill-or-unfill-paragraph)
#+end_src
#+begin_src elisp
(defun my/fill-or-unfill-all-paragraphs (&optional unfill)
"Fill or unfill all paragraphs in the current buffer.
With the prefix argument UNFILL, fill them instead."
(interactive (list (if current-prefix-arg 'fill)))
(let ((fill-column (if unfill fill-column (point-max))))
(save-excursion
(goto-char (point-min))
(while (not (eobp))
(fill-paragraph nil t)
(forward-paragraph)))))
(bind-key "M-Q" 'my/fill-or-unfill-all-paragraphs)
#+end_src
#+begin_src elisp
(remove-hook 'text-mode-hook #'turn-on-auto-fill)
(add-hook 'text-mode-hook 'turn-on-visual-line-mode)
#+end_src
** Expand some words with auto-correct
#+begin_src elisp :tangle yes
(setq save-abbrevs 'silently)
(setq-default abbrev-mode t)
#+end_src
** ediff
#+begin_src elisp :tangle yes
(setq ediff-window-setup-function 'ediff-setup-windows-plain)
(setq ediff-split-window-function 'split-window-horizontally)
#+end_src
** tramp
#+begin_src elisp :tangle yes
(setq tramp-default-method "ssh"
tramp-backup-directory-alist backup-directory-alist
tramp-ssh-controlmaster-options "ssh")
#+end_src
** Clean up space
#+begin_src elisp :tangle yes
(bind-key "M-SPC" 'cycle-spacing)
#+end_src
** Transform <a href> links into org links
#+begin_src elisp :tangle yes
(defun my/transform-html-links-to-org ()
"Transform all HTML <a> links in the current buffer into 'org-mode' links."
(interactive)
(goto-char (point-min))
(while (re-search-forward "<a href=\"\\(.*?\\)\">\\(.*?\\)</a>" nil t)
(replace-match (org-make-link-string (match-string 1) (match-string 2)))))
#+end_src
** Count words per minute
#+begin_src elisp :tangle yes
(require 'org-clock)
(defun my/org-entry-wpm ()
(interactive)
(save-restriction
(save-excursion
(org-narrow-to-subtree)
(goto-char (point-min))
(let* ((words (count-words-region (point-min) (point-max)))
(minutes (org-clock-sum-current-item))
(wpm (/ words minutes)))
(message "WPM: %d (words: %d, minutes: %d)" wpm words minutes)
(kill-new (number-to-string wpm))
)
)
)
)
#+end_src
** Enable dict mode
#+begin_src elisp :tangle yes
(setq dictionary-server "automatic")
#+end_src
** Pick out passive voice and weasel words
#+begin_src elisp :tangle yes
(use-package writegood-mode
:diminish writegood-mode
:config
(progn (add-hook 'text-mode-hook 'writegood-mode))
)
#+end_src
** Org-babel docker
#+begin_src elisp :tangle yes
(use-package ob-docker-build
:straight (ob-docker-build :type git :host github :repo "ifitzpat/ob-docker-build")
:defer t
:config
(add-to-list 'org-babel-load-languages '(docker-build . t))
(org-babel-do-load-languages 'org-babel-load-languages org-babel-load-languages)
)
#+end_src
* Spelling and syntax
** Spell checking
This requires installation of hunspell
#+begin_src bash :tangle yes
sudo apt install hunspell
#+end_src
* Spell Checking
#+begin_src elisp
(use-package flyspell
:config (setq ispell-program-name "hunspell"
@@ -17,32 +205,50 @@
)
#+end_src
* Syntax Checking
** Flyspell correct
#+begin_src elisp :tangle yes
(use-package flyspell-correct
:after flyspell
:bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper))
)
#+end_src
** Flycheck
Needs external checkers installed
#+begin_src elisp
(use-package flycheck
:init (global-flycheck-mode)
:defer t
:diminish (flycheck-mode . "")
:config
(add-hook 'after-init-hook #'global-flycheck-mode)
(setq flycheck-emacs-lisp-load-path 'inherit)
(setq flycheck-emacs-lisp-load-path (concat user-emacs-directory "straight/build"))
(setq flycheck-emacs-lisp-load-path (concat user-emacs-directory "straight/build")))
#+end_src
** Flycheck bash
#+begin_src bash :tangle yes
sudo apt install devscripts
#+end_src
#+begin_src elisp :tangle yes
(use-package flycheck-checkbashisms
:config
(flycheck-checkbashisms-setup)
)
#+end_src
** Yaml
#+begin_src elisp :tangle yes
(use-package yaml-mode
:config
(add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode))
(add-to-list 'auto-mode-alist '("\\.yaml\\'" . yaml-mode))
)
#+end_src
* Text Manipulation
#+begin_src elisp
(subword-mode)
(setq sentence-end-double-space nil)
(defun my/fill-or-unfill-paragraph (&optional unfill region)
"Fill paragraph (or REGION). With the prefix argument UNFILL, fill it instead."
(interactive (progn
(barf-if-buffer-read-only)
(list (if current-prefix-arg 'fill) t)))
(let ((fill-column (if unfill fill-column (point-max))))
(fill-paragraph nil region)))
(bind-key "M-q" 'my/fill-or-unfill-paragraph)
(add-hook 'text-mode-hook 'turn-on-visual-line-mode)
** Docker
#+begin_src elisp :tangle yes
(use-package docker-compose-mode)
#+end_src

View File

@@ -0,0 +1,90 @@
#+TITLE: Qubes NPU Setup - sys-ai
#+AUTHOR: Amr
#+CREATED: [2026-04-24 Fri]
#+BEGIN_COMMENT
Documentation for setting up sys-ai Qube with AMD Ryzen AI NPU for llama.cpp.
#+END_COMMENT
* Hardware
- *Laptop:* Framework Laptop 13 (AMD)
- *CPU:* AMD Ryzen AI 5 340 (6 cores, no SMT)
- *NPU:* AMD XDNA2 (Strix Point) - c2:00.1 / dom0:00_08.2-00_00.1
- *RAM:* 96GB total
* Current Progress
** DONE [X] Create sys-ai AppVM (HVM, 64GB, 2 vCPUs)
#+begin_src bash
# Run in dom0
qvm-create --label purple --property netvm=sys-firewall --property memory=65536 --property vcpus=2 --property virt_mode=HVM sys-ai
#+end_src
** DONE [X] Attach NPU PCI device to sys-ai
#+begin_src bash
# Run in dom0
qvm-pci attach -o no-strict-reset=true sys-ai dom0:00_08.2-00_00.1 --persistent
#+end_src
** TODO [ ] Fix repository configuration in sys-ai
*Status:* Package repositories missing in fedora-43-ai template. Fedora 43 uses DNF5 with different repo paths.
*Next Step:* Qubes OS templates typically get packages installed via `qubes-vm-update` or dom0 commands. Try the Qubes way to install packages.
** TODO [ ] Verify NPU is accessible inside sys-ai
#+begin_src bash
# Install pciutils
sudo dnf install pciutils
# Check NPU is visible
lspci | grep -i neural
#+end_src
** TODO [ ] Install AMD NPU drivers in sys-ai
#+begin_src bash
# Enable Copr repository
sudo dnf copr enable xanderlent/amd-npu-driver
# Install drivers
sudo dnf install xrt xdna-driver tcsh
# Setup environment
source /usr/xrt/setup.sh
# Verify NPU detection
xrt-smi examine
#+end_src
** TODO [ ] Build llama.cpp with AMD XDNA2 NPU backend
#+begin_src bash
# Install build dependencies
sudo dnf install cmake gcc-c++ python3.11 git
# Clone NPU fork
git clone https://github.com/BrandedTamarasu-glitch/OllamaAMDNPU.git
cd OllamaAMDNPU
# Build with NPU backend
cmake -B build -DGGML_XDNA=ON -DGGML_BACKEND_DL=ON -DBUILD_SHARED_LIBS=ON
cmake --build build --parallel
#+end_src
** TODO [ ] Download model and test inference
#+begin_src bash
# Download GGUF model (Qwen3 1B or 3B quantized)
# ... model download command ...
# Run with NPU offload
./build/bin/llama-cli -m model.gguf -p "Hello" -n 256 --npu-split 1
#+end_src
* Next Step
Run the repository fix commands from the "Fix repository" step above.

1757
quicklisp.lisp Normal file

File diff suppressed because it is too large Load Diff

View File

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 122 KiB

View File

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 123 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

0
skills.org Normal file
View File

View File

@@ -1,355 +0,0 @@
#+TITLE: LLM Fleet Dashboard
#+author: Sol (Agent)
* Model Fleet
| Provider | Model ID | Context |
|------------+---------------------------------------------------------------+---------|
| OpenRouter | google/gemma-4-26b-a4b-it | 262144 |
| OpenRouter | google/gemma-4-31b-it | 262144 |
| OpenRouter | qwen/qwen3.6-plus:free | 1000000 |
| OpenRouter | z-ai/glm-5v-turbo | 202752 |
| OpenRouter | arcee-ai/trinity-large-thinking | 262144 |
| OpenRouter | x-ai/grok-4.20-multi-agent | 2000000 |
| OpenRouter | x-ai/grok-4.20 | 2000000 |
| OpenRouter | google/lyria-3-pro-preview | 1048576 |
| OpenRouter | google/lyria-3-clip-preview | 1048576 |
| OpenRouter | kwaipilot/kat-coder-pro-v2 | 256000 |
| OpenRouter | rekaai/reka-edge | 16384 |
| OpenRouter | xiaomi/mimo-v2-omni | 262144 |
| OpenRouter | xiaomi/mimo-v2-pro | 1048576 |
| OpenRouter | minimax/minimax-m2.7 | 204800 |
| OpenRouter | openai/gpt-5.4-nano | 400000 |
| OpenRouter | openai/gpt-5.4-mini | 400000 |
| OpenRouter | mistralai/mistral-small-2603 | 262144 |
| OpenRouter | z-ai/glm-5-turbo | 202752 |
| OpenRouter | nvidia/nemotron-3-super-120b-a12b:free | 262144 |
| OpenRouter | nvidia/nemotron-3-super-120b-a12b | 262144 |
| OpenRouter | bytedance-seed/seed-2.0-lite | 262144 |
| OpenRouter | qwen/qwen3.5-9b | 256000 |
| OpenRouter | openai/gpt-5.4-pro | 1050000 |
| OpenRouter | openai/gpt-5.4 | 1050000 |
| OpenRouter | inception/mercury-2 | 128000 |
| OpenRouter | openai/gpt-5.3-chat | 128000 |
| OpenRouter | google/gemini-3.1-flash-lite-preview | 1048576 |
| OpenRouter | bytedance-seed/seed-2.0-mini | 262144 |
| OpenRouter | google/gemini-3.1-flash-image-preview | 65536 |
| OpenRouter | qwen/qwen3.5-35b-a3b | 262144 |
| OpenRouter | qwen/qwen3.5-27b | 262144 |
| OpenRouter | qwen/qwen3.5-122b-a10b | 262144 |
| OpenRouter | qwen/qwen3.5-flash-02-23 | 1000000 |
| OpenRouter | liquid/lfm-2-24b-a2b | 32768 |
| OpenRouter | google/gemini-3.1-pro-preview-customtools | 1048576 |
| OpenRouter | openai/gpt-5.3-codex | 400000 |
| OpenRouter | aion-labs/aion-2.0 | 131072 |
| OpenRouter | google/gemini-3.1-pro-preview | 1048576 |
| OpenRouter | anthropic/claude-sonnet-4.6 | 1000000 |
| OpenRouter | qwen/qwen3.5-plus-02-15 | 1000000 |
| OpenRouter | qwen/qwen3.5-397b-a17b | 262144 |
| OpenRouter | minimax/minimax-m2.5:free | 196608 |
| OpenRouter | minimax/minimax-m2.5 | 196608 |
| OpenRouter | z-ai/glm-5 | 80000 |
| OpenRouter | qwen/qwen3-max-thinking | 262144 |
| OpenRouter | anthropic/claude-opus-4.6 | 1000000 |
| OpenRouter | qwen/qwen3-coder-next | 262144 |
| OpenRouter | openrouter/free | 200000 |
| OpenRouter | stepfun/step-3.5-flash:free | 256000 |
| OpenRouter | stepfun/step-3.5-flash | 262144 |
| OpenRouter | arcee-ai/trinity-large-preview:free | 131000 |
| OpenRouter | moonshotai/kimi-k2.5 | 262144 |
| OpenRouter | upstage/solar-pro-3 | 128000 |
| OpenRouter | minimax/minimax-m2-her | 65536 |
| OpenRouter | writer/palmyra-x5 | 1040000 |
| OpenRouter | liquid/lfm-2.5-1.2b-thinking:free | 32768 |
| OpenRouter | liquid/lfm-2.5-1.2b-instruct:free | 32768 |
| OpenRouter | openai/gpt-audio | 128000 |
| OpenRouter | openai/gpt-audio-mini | 128000 |
| OpenRouter | z-ai/glm-4.7-flash | 202752 |
| OpenRouter | openai/gpt-5.2-codex | 400000 |
| OpenRouter | allenai/olmo-3.1-32b-instruct | 65536 |
| OpenRouter | bytedance-seed/seed-1.6-flash | 262144 |
| OpenRouter | bytedance-seed/seed-1.6 | 262144 |
| OpenRouter | minimax/minimax-m2.1 | 196608 |
| OpenRouter | z-ai/glm-4.7 | 202752 |
| OpenRouter | google/gemini-3-flash-preview | 1048576 |
| OpenRouter | mistralai/mistral-small-creative | 32768 |
| OpenRouter | xiaomi/mimo-v2-flash | 262144 |
| OpenRouter | nvidia/nemotron-3-nano-30b-a3b:free | 256000 |
| OpenRouter | nvidia/nemotron-3-nano-30b-a3b | 262144 |
| OpenRouter | openai/gpt-5.2-chat | 128000 |
| OpenRouter | openai/gpt-5.2-pro | 400000 |
| OpenRouter | openai/gpt-5.2 | 400000 |
| OpenRouter | mistralai/devstral-2512 | 262144 |
| OpenRouter | relace/relace-search | 256000 |
| OpenRouter | z-ai/glm-4.6v | 131072 |
| OpenRouter | nex-agi/deepseek-v3.1-nex-n1 | 131072 |
| OpenRouter | essentialai/rnj-1-instruct | 32768 |
| OpenRouter | openrouter/bodybuilder | 128000 |
| OpenRouter | openai/gpt-5.1-codex-max | 400000 |
| OpenRouter | amazon/nova-2-lite-v1 | 1000000 |
| OpenRouter | mistralai/ministral-14b-2512 | 262144 |
| OpenRouter | mistralai/ministral-8b-2512 | 262144 |
| OpenRouter | mistralai/ministral-3b-2512 | 131072 |
| OpenRouter | mistralai/mistral-large-2512 | 262144 |
| OpenRouter | arcee-ai/trinity-mini:free | 131072 |
| OpenRouter | arcee-ai/trinity-mini | 131072 |
| OpenRouter | deepseek/deepseek-v3.2-speciale | 163840 |
| OpenRouter | deepseek/deepseek-v3.2 | 163840 |
| OpenRouter | prime-intellect/intellect-3 | 131072 |
| OpenRouter | anthropic/claude-opus-4.5 | 200000 |
| OpenRouter | allenai/olmo-3-32b-think | 65536 |
| OpenRouter | google/gemini-3-pro-image-preview | 65536 |
| OpenRouter | x-ai/grok-4.1-fast | 2000000 |
| OpenRouter | deepcogito/cogito-v2.1-671b | 128000 |
| OpenRouter | openai/gpt-5.1 | 400000 |
| OpenRouter | openai/gpt-5.1-chat | 128000 |
| OpenRouter | openai/gpt-5.1-codex | 400000 |
| OpenRouter | openai/gpt-5.1-codex-mini | 400000 |
| OpenRouter | moonshotai/kimi-k2-thinking | 131072 |
| OpenRouter | amazon/nova-premier-v1 | 1000000 |
| OpenRouter | perplexity/sonar-pro-search | 200000 |
| OpenRouter | mistralai/voxtral-small-24b-2507 | 32000 |
| OpenRouter | openai/gpt-oss-safeguard-20b | 131072 |
| OpenRouter | nvidia/nemotron-nano-12b-v2-vl:free | 128000 |
| OpenRouter | nvidia/nemotron-nano-12b-v2-vl | 131072 |
| OpenRouter | minimax/minimax-m2 | 196608 |
| OpenRouter | qwen/qwen3-vl-32b-instruct | 131072 |
| OpenRouter | ibm-granite/granite-4.0-h-micro | 131000 |
| OpenRouter | openai/gpt-5-image-mini | 400000 |
| OpenRouter | anthropic/claude-haiku-4.5 | 200000 |
| OpenRouter | qwen/qwen3-vl-8b-thinking | 131072 |
| OpenRouter | qwen/qwen3-vl-8b-instruct | 131072 |
| OpenRouter | openai/gpt-5-image | 400000 |
| OpenRouter | openai/o3-deep-research | 200000 |
| OpenRouter | openai/o4-mini-deep-research | 200000 |
| OpenRouter | nvidia/llama-3.3-nemotron-super-49b-v1.5 | 131072 |
| OpenRouter | baidu/ernie-4.5-21b-a3b-thinking | 131072 |
| OpenRouter | google/gemini-2.5-flash-image | 32768 |
| OpenRouter | qwen/qwen3-vl-30b-a3b-thinking | 131072 |
| OpenRouter | qwen/qwen3-vl-30b-a3b-instruct | 131072 |
| OpenRouter | openai/gpt-5-pro | 400000 |
| OpenRouter | z-ai/glm-4.6 | 204800 |
| OpenRouter | anthropic/claude-sonnet-4.5 | 1000000 |
| OpenRouter | deepseek/deepseek-v3.2-exp | 163840 |
| OpenRouter | thedrummer/cydonia-24b-v4.1 | 131072 |
| OpenRouter | relace/relace-apply-3 | 256000 |
| OpenRouter | google/gemini-2.5-flash-lite-preview-09-2025 | 1048576 |
| OpenRouter | qwen/qwen3-vl-235b-a22b-thinking | 131072 |
| OpenRouter | qwen/qwen3-vl-235b-a22b-instruct | 262144 |
| OpenRouter | qwen/qwen3-max | 262144 |
| OpenRouter | qwen/qwen3-coder-plus | 1000000 |
| OpenRouter | openai/gpt-5-codex | 400000 |
| OpenRouter | deepseek/deepseek-v3.1-terminus | 163840 |
| OpenRouter | x-ai/grok-4-fast | 2000000 |
| OpenRouter | alibaba/tongyi-deepresearch-30b-a3b | 131072 |
| OpenRouter | qwen/qwen3-coder-flash | 1000000 |
| OpenRouter | qwen/qwen3-next-80b-a3b-thinking | 131072 |
| OpenRouter | qwen/qwen3-next-80b-a3b-instruct:free | 262144 |
| OpenRouter | qwen/qwen3-next-80b-a3b-instruct | 262144 |
| OpenRouter | meituan/longcat-flash-chat | 131072 |
| OpenRouter | qwen/qwen-plus-2025-07-28:thinking | 1000000 |
| OpenRouter | qwen/qwen-plus-2025-07-28 | 1000000 |
| OpenRouter | nvidia/nemotron-nano-9b-v2:free | 128000 |
| OpenRouter | nvidia/nemotron-nano-9b-v2 | 131072 |
| OpenRouter | moonshotai/kimi-k2-0905 | 131072 |
| OpenRouter | qwen/qwen3-30b-a3b-thinking-2507 | 131072 |
| OpenRouter | x-ai/grok-code-fast-1 | 256000 |
| OpenRouter | nousresearch/hermes-4-70b | 131072 |
| OpenRouter | nousresearch/hermes-4-405b | 131072 |
| OpenRouter | deepseek/deepseek-chat-v3.1 | 32768 |
| OpenRouter | openai/gpt-4o-audio-preview | 128000 |
| OpenRouter | mistralai/mistral-medium-3.1 | 131072 |
| OpenRouter | baidu/ernie-4.5-21b-a3b | 120000 |
| OpenRouter | baidu/ernie-4.5-vl-28b-a3b | 30000 |
| OpenRouter | z-ai/glm-4.5v | 65536 |
| OpenRouter | ai21/jamba-large-1.7 | 256000 |
| OpenRouter | openai/gpt-5-chat | 128000 |
| OpenRouter | openai/gpt-5 | 400000 |
| OpenRouter | openai/gpt-5-mini | 400000 |
| OpenRouter | openai/gpt-5-nano | 400000 |
| OpenRouter | openai/gpt-oss-120b:free | 131072 |
| OpenRouter | openai/gpt-oss-120b | 131072 |
| OpenRouter | openai/gpt-oss-20b:free | 131072 |
| OpenRouter | openai/gpt-oss-20b | 131072 |
| OpenRouter | anthropic/claude-opus-4.1 | 200000 |
| OpenRouter | mistralai/codestral-2508 | 256000 |
| OpenRouter | qwen/qwen3-coder-30b-a3b-instruct | 160000 |
| OpenRouter | qwen/qwen3-30b-a3b-instruct-2507 | 262144 |
| OpenRouter | z-ai/glm-4.5 | 131072 |
| OpenRouter | z-ai/glm-4.5-air:free | 131072 |
| OpenRouter | z-ai/glm-4.5-air | 131072 |
| OpenRouter | qwen/qwen3-235b-a22b-thinking-2507 | 131072 |
| OpenRouter | z-ai/glm-4-32b | 128000 |
| OpenRouter | qwen/qwen3-coder:free | 262000 |
| OpenRouter | qwen/qwen3-coder | 262144 |
| OpenRouter | bytedance/ui-tars-1.5-7b | 128000 |
| OpenRouter | google/gemini-2.5-flash-lite | 1048576 |
| OpenRouter | qwen/qwen3-235b-a22b-2507 | 262144 |
| OpenRouter | switchpoint/router | 131072 |
| OpenRouter | moonshotai/kimi-k2 | 131072 |
| OpenRouter | mistralai/devstral-medium | 131072 |
| OpenRouter | mistralai/devstral-small | 131072 |
| OpenRouter | cognitivecomputations/dolphin-mistral-24b-venice-edition:free | 32768 |
| OpenRouter | x-ai/grok-4 | 256000 |
| OpenRouter | google/gemma-3n-e2b-it:free | 8192 |
| OpenRouter | tencent/hunyuan-a13b-instruct | 131072 |
| OpenRouter | tngtech/deepseek-r1t2-chimera | 163840 |
| OpenRouter | morph/morph-v3-large | 262144 |
| OpenRouter | morph/morph-v3-fast | 81920 |
| OpenRouter | baidu/ernie-4.5-vl-424b-a47b | 123000 |
| OpenRouter | baidu/ernie-4.5-300b-a47b | 123000 |
| OpenRouter | inception/mercury | 128000 |
| OpenRouter | mistralai/mistral-small-3.2-24b-instruct | 128000 |
| OpenRouter | minimax/minimax-m1 | 1000000 |
| OpenRouter | google/gemini-2.5-flash | 1048576 |
| OpenRouter | google/gemini-2.5-pro | 1048576 |
| OpenRouter | openai/o3-pro | 200000 |
| OpenRouter | x-ai/grok-3-mini | 131072 |
| OpenRouter | x-ai/grok-3 | 131072 |
| OpenRouter | google/gemini-2.5-pro-preview | 1048576 |
| OpenRouter | deepseek/deepseek-r1-0528 | 163840 |
| OpenRouter | anthropic/claude-opus-4 | 200000 |
| OpenRouter | anthropic/claude-sonnet-4 | 200000 |
| OpenRouter | google/gemma-3n-e4b-it:free | 8192 |
| OpenRouter | google/gemma-3n-e4b-it | 32768 |
| OpenRouter | mistralai/mistral-medium-3 | 131072 |
| OpenRouter | google/gemini-2.5-pro-preview-05-06 | 1048576 |
| OpenRouter | arcee-ai/spotlight | 131072 |
| OpenRouter | arcee-ai/maestro-reasoning | 131072 |
| OpenRouter | arcee-ai/virtuoso-large | 131072 |
| OpenRouter | arcee-ai/coder-large | 32768 |
| OpenRouter | inception/mercury-coder | 128000 |
| OpenRouter | meta-llama/llama-guard-4-12b | 163840 |
| OpenRouter | qwen/qwen3-30b-a3b | 40960 |
| OpenRouter | qwen/qwen3-8b | 40960 |
| OpenRouter | qwen/qwen3-14b | 40960 |
| OpenRouter | qwen/qwen3-32b | 40960 |
| OpenRouter | qwen/qwen3-235b-a22b | 131072 |
| OpenRouter | openai/o4-mini-high | 200000 |
| OpenRouter | openai/o3 | 200000 |
| OpenRouter | openai/o4-mini | 200000 |
| OpenRouter | qwen/qwen2.5-coder-7b-instruct | 32768 |
| OpenRouter | openai/gpt-4.1 | 1047576 |
| OpenRouter | openai/gpt-4.1-mini | 1047576 |
| OpenRouter | openai/gpt-4.1-nano | 1047576 |
| OpenRouter | eleutherai/llemma_7b | 4096 |
| OpenRouter | alfredpros/codellama-7b-instruct-solidity | 4096 |
| OpenRouter | x-ai/grok-3-mini-beta | 131072 |
| OpenRouter | x-ai/grok-3-beta | 131072 |
| OpenRouter | nvidia/llama-3.1-nemotron-ultra-253b-v1 | 131072 |
| OpenRouter | meta-llama/llama-4-maverick | 1048576 |
| OpenRouter | meta-llama/llama-4-scout | 327680 |
| OpenRouter | qwen/qwen2.5-vl-32b-instruct | 128000 |
| OpenRouter | deepseek/deepseek-chat-v3-0324 | 163840 |
| OpenRouter | openai/o1-pro | 200000 |
| OpenRouter | mistralai/mistral-small-3.1-24b-instruct | 131072 |
| OpenRouter | allenai/olmo-2-0325-32b-instruct | 128000 |
| OpenRouter | google/gemma-3-4b-it:free | 32768 |
| OpenRouter | google/gemma-3-4b-it | 131072 |
| OpenRouter | google/gemma-3-12b-it:free | 32768 |
| OpenRouter | google/gemma-3-12b-it | 131072 |
| OpenRouter | cohere/command-a | 256000 |
| OpenRouter | openai/gpt-4o-mini-search-preview | 128000 |
| OpenRouter | openai/gpt-4o-search-preview | 128000 |
| OpenRouter | rekaai/reka-flash-3 | 65536 |
| OpenRouter | google/gemma-3-27b-it:free | 131072 |
| OpenRouter | google/gemma-3-27b-it | 131072 |
| OpenRouter | thedrummer/skyfall-36b-v2 | 32768 |
| OpenRouter | perplexity/sonar-reasoning-pro | 128000 |
| OpenRouter | perplexity/sonar-pro | 200000 |
| OpenRouter | perplexity/sonar-deep-research | 128000 |
| OpenRouter | qwen/qwq-32b | 131072 |
| OpenRouter | google/gemini-2.0-flash-lite-001 | 1048576 |
| OpenRouter | anthropic/claude-3.7-sonnet | 200000 |
| OpenRouter | anthropic/claude-3.7-sonnet:thinking | 200000 |
| OpenRouter | mistralai/mistral-saba | 32768 |
| OpenRouter | meta-llama/llama-guard-3-8b | 131072 |
| OpenRouter | openai/o3-mini-high | 200000 |
| OpenRouter | google/gemini-2.0-flash-001 | 1048576 |
| OpenRouter | qwen/qwen-vl-plus | 131072 |
| OpenRouter | aion-labs/aion-1.0 | 131072 |
| OpenRouter | aion-labs/aion-1.0-mini | 131072 |
| OpenRouter | aion-labs/aion-rp-llama-3.1-8b | 32768 |
| OpenRouter | qwen/qwen-vl-max | 131072 |
| OpenRouter | qwen/qwen-turbo | 131072 |
| OpenRouter | qwen/qwen2.5-vl-72b-instruct | 32768 |
| OpenRouter | qwen/qwen-plus | 1000000 |
| OpenRouter | qwen/qwen-max | 32768 |
| OpenRouter | openai/o3-mini | 200000 |
| OpenRouter | mistralai/mistral-small-24b-instruct-2501 | 32768 |
| OpenRouter | deepseek/deepseek-r1-distill-qwen-32b | 32768 |
| OpenRouter | perplexity/sonar | 127072 |
| OpenRouter | deepseek/deepseek-r1-distill-llama-70b | 131072 |
| OpenRouter | deepseek/deepseek-r1 | 64000 |
| OpenRouter | minimax/minimax-01 | 1000192 |
| OpenRouter | microsoft/phi-4 | 16384 |
| OpenRouter | sao10k/l3.1-70b-hanami-x1 | 16000 |
| OpenRouter | deepseek/deepseek-chat | 163840 |
| OpenRouter | sao10k/l3.3-euryale-70b | 131072 |
| OpenRouter | openai/o1 | 200000 |
| OpenRouter | cohere/command-r7b-12-2024 | 128000 |
| OpenRouter | meta-llama/llama-3.3-70b-instruct:free | 65536 |
| OpenRouter | meta-llama/llama-3.3-70b-instruct | 131072 |
| OpenRouter | amazon/nova-lite-v1 | 300000 |
| OpenRouter | amazon/nova-micro-v1 | 128000 |
| OpenRouter | amazon/nova-pro-v1 | 300000 |
| OpenRouter | openai/gpt-4o-2024-11-20 | 128000 |
| OpenRouter | mistralai/mistral-large-2411 | 131072 |
| OpenRouter | mistralai/mistral-large-2407 | 131072 |
| OpenRouter | mistralai/pixtral-large-2411 | 131072 |
| OpenRouter | qwen/qwen-2.5-coder-32b-instruct | 32768 |
| OpenRouter | thedrummer/unslopnemo-12b | 32768 |
| OpenRouter | anthropic/claude-3.5-haiku | 200000 |
| OpenRouter | anthracite-org/magnum-v4-72b | 16384 |
| OpenRouter | qwen/qwen-2.5-7b-instruct | 32768 |
| OpenRouter | nvidia/llama-3.1-nemotron-70b-instruct | 131072 |
| OpenRouter | inflection/inflection-3-pi | 8000 |
| OpenRouter | inflection/inflection-3-productivity | 8000 |
| OpenRouter | thedrummer/rocinante-12b | 32768 |
| OpenRouter | meta-llama/llama-3.2-3b-instruct:free | 131072 |
| OpenRouter | meta-llama/llama-3.2-3b-instruct | 80000 |
| OpenRouter | meta-llama/llama-3.2-1b-instruct | 60000 |
| OpenRouter | meta-llama/llama-3.2-11b-vision-instruct | 131072 |
| OpenRouter | qwen/qwen-2.5-72b-instruct | 32768 |
| OpenRouter | cohere/command-r-08-2024 | 128000 |
| OpenRouter | cohere/command-r-plus-08-2024 | 128000 |
| OpenRouter | sao10k/l3.1-euryale-70b | 131072 |
| OpenRouter | nousresearch/hermes-3-llama-3.1-70b | 131072 |
| OpenRouter | nousresearch/hermes-3-llama-3.1-405b:free | 131072 |
| OpenRouter | nousresearch/hermes-3-llama-3.1-405b | 131072 |
| OpenRouter | sao10k/l3-lunaris-8b | 8192 |
| OpenRouter | openai/gpt-4o-2024-08-06 | 128000 |
| OpenRouter | meta-llama/llama-3.1-8b-instruct | 16384 |
| OpenRouter | meta-llama/llama-3.1-70b-instruct | 131072 |
| OpenRouter | mistralai/mistral-nemo | 131072 |
| OpenRouter | openai/gpt-4o-mini-2024-07-18 | 128000 |
| OpenRouter | openai/gpt-4o-mini | 128000 |
| OpenRouter | google/gemma-2-27b-it | 8192 |
| OpenRouter | google/gemma-2-9b-it | 8192 |
| OpenRouter | sao10k/l3-euryale-70b | 8192 |
| OpenRouter | nousresearch/hermes-2-pro-llama-3-8b | 8192 |
| OpenRouter | openai/gpt-4o | 128000 |
| OpenRouter | openai/gpt-4o:extended | 128000 |
| OpenRouter | openai/gpt-4o-2024-05-13 | 128000 |
| OpenRouter | meta-llama/llama-3-8b-instruct | 8192 |
| OpenRouter | meta-llama/llama-3-70b-instruct | 8192 |
| OpenRouter | mistralai/mixtral-8x22b-instruct | 65536 |
| OpenRouter | microsoft/wizardlm-2-8x22b | 65535 |
| OpenRouter | openai/gpt-4-turbo | 128000 |
| OpenRouter | anthropic/claude-3-haiku | 200000 |
| OpenRouter | mistralai/mistral-large | 128000 |
| OpenRouter | openai/gpt-3.5-turbo-0613 | 4095 |
| OpenRouter | openai/gpt-4-turbo-preview | 128000 |
| OpenRouter | mistralai/mixtral-8x7b-instruct | 32768 |
| OpenRouter | alpindale/goliath-120b | 6144 |
| OpenRouter | openrouter/auto | 2000000 |
| OpenRouter | openai/gpt-4-1106-preview | 128000 |
| OpenRouter | mistralai/mistral-7b-instruct-v0.1 | 2824 |
| OpenRouter | openai/gpt-3.5-turbo-instruct | 4095 |
| OpenRouter | openai/gpt-3.5-turbo-16k | 16385 |
| OpenRouter | mancer/weaver | 8000 |
| OpenRouter | undi95/remm-slerp-l2-13b | 6144 |
| OpenRouter | gryphe/mythomax-l2-13b | 4096 |
| OpenRouter | openai/gpt-4-0314 | 8191 |
| OpenRouter | openai/gpt-3.5-turbo | 16385 |
| OpenRouter | openai/gpt-4 | 8191 |

View File

@@ -1 +0,0 @@
user@amr.3392:1775060113

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -1,120 +0,0 @@
#+TITLE: AI Configuration
#+PROPERTY: header-args :tangle yes
* AI Settings
** Ellama
#+begin_src elisp :tangle yes
;; YOU DON'T NEED NONE OF THIS CODE FOR SIMPLE INSTALL
;; IT IS AN EXAMPLE OF CUSTOMIZATION.
(use-package ellama
:init
(require 'llm-openai)
;; setup key bindings
(setq ellama-keymap-prefix "C-c e")
)
#+end_src
#+begin_src elisp ~/.emacs.d/custom.el :tangle yes
(setopt ellama-providers
'(
;; Ollama Provider (added here with a name)
("ollama" . (make-llm-ollama
;; Consider a dedicated embedding model if gemma isn't ideal for it.
:chat-model "gemma3:latest"
:embedding-model "gemma3:latest" ; Or e.g., "nomic-embed-text"
:default-chat-non-standard-params '(("num_ctx" . 8192))))
("openai" . (make-llm-openai
:key (auth-source-pass-get "api-key" "www/openai.com/amr@gharbeia.net")
:chat-model "gpt-4o"
:embedding-model "text-embedding-3-large"))
("groq" . (make-llm-openai-compatible
:url "https://api.groq.com/openai/v1"
:key (auth-source-pass-get "api-key" "www/console.groq.com/groq@amr.gharbeia.net")
;; Check Groq console for available models, these might change
:chat-model "llama3-70b-8192" ; Example, verify on Groq
:embedding-model "llama3-70b-8192")) ; Groq might not offer dedicated embedding models via this API
))
;; --- Set Active Providers ---
;; Choose your default provider from the list above by its name
(setopt ellama-provider "ollama") ; Or "ollama", "openai", "groq"
;; You can specify different providers for different tasks if needed
(setopt ellama-translation-provider "ollama")
(setopt ellama-naming-provider "ollama")
(setopt ellama-naming-scheme 'ellama-generate-name-by-llm)
(setq llm-debug t)
#+end_src
#+begin_src elisp
(use-package ellama
:ensure t
:bind ("C-c e" . ellama)
;; send last message in chat buffer with C-c C-c
:hook (org-ctrl-c-ctrl-c-final . ellama-chat-send-last-message)
:init (setopt ellama-auto-scroll t)
:config
;; show ellama context in header line in all buffers
(ellama-context-header-line-global-mode +1)
;; show ellama session id in header line in all buffers
(ellama-session-header-line-global-mode +1))
#+end_src
** GPTel
#+begin_src elisp :tangle yes
(use-package gptel)
#+end_src
#+begin_src elisp :tangle yes
(setq gptel-api-key (auth-source-pass-get "api-key" "www/console.groq.com/groq@amr.gharbeia.net"))
#+end_src
#+begin_src elisp :tangle yes
(gptel-make-openai "Groq" ;Any name you want
:host "api.groq.com"
:endpoint "/openai/v1/chat/completions"
:stream t
:key (auth-source-pass-get "api-key" "www/console.groq.com/groq@amr.gharbeia.net") ;can be a function that returns the key
:models '(llama-3.1-70b-versatile
llama-3.1-8b-instant
llama3-70b-8192
llama3-8b-8192
mixtral-8x7b-32768
gemma-7b-it))
#+end_src
** Elisa
#+begin_src elisp :tangle yes
(use-package elisa
:defer t
:init
(setopt elisa-limit 5)
(require 'llm-ollama)
(setopt elisa-embeddings-provider (make-llm-ollama :embedding-model "nomic-embed-text"))
(setopt elisa-chat-provider (make-llm-ollama
:chat-model "sskostyaev/openchat:8k-rag"
:embedding-model "nomic-embed-text"))
)
#+end_src
** OpenCortex (Local Foundry)
#+begin_src elisp :tangle yes
(use-package opencortex
:straight nil
:load-path "~/.local/share/opencortex/src"
:commands (opencortex-connect opencortex-disconnect)
:init
(setq opencortex-host "127.0.0.1")
(setq opencortex-port 9105)
(setq opencortex-executable-path "~/.local/share/opencortex/bin/opencortex-server")
:config
(message "opencortex: Local brain configured at %s" opencortex-executable-path))
#+end_src

View File

@@ -1,165 +0,0 @@
#+TITLE: Core Emacs Configuration
#+PROPERTY: header-args :tangle yes
* Initialization Bootstrap
This section tangles directly to ~/.emacs to bootstrap the entire system.
#+begin_src elisp :tangle ~/.emacs
;;; .emacs --- Global settings -*- lexical-binding: t; -*-
(setq gc-cons-threshold (* 500 1024 1024))
(add-hook 'after-init-hook (lambda () (setq gc-cons-threshold (* 5 1024 1024))))
(setq straight-repository-branch "develop")
(eval-and-compile
(defvar bootstrap-version)
(let ((bootstrap-file
(expand-file-name "straight/repos/straight.el/bootstrap.el"
(or (bound-and-true-p straight-base-dir)
user-emacs-directory)))
(bootstrap-version 7))
(unless (file-exists-p bootstrap-file)
(with-current-buffer
(url-retrieve-synchronously "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el" 'silent 'inhibit-cookies)
(goto-char (point-max))
(eval-print-last-sexp)))
(load bootstrap-file nil 'nomessage))
(straight-use-package 'use-package)
(straight-use-package 'org))
(setq straight-use-package-by-default t)
(require 'ob-tangle)
;; Load the modular configuration starting from dotemacs.org
(org-babel-load-file (expand-file-name "~/memex/system/dotemacs.org"))
(provide '.emacs)
#+end_src
* Front matter
#+begin_src elisp
;;; emacs-core.el --- Summary
;;; Commentary:
;;; Code:
;; -*- lexical-binding: t; -*-
#+end_src
* Garbage collector
Increase threshold to 500 MB to ease startup
#+begin_src elisp
(setq gc-cons-threshold (* 500 1024 1024))
#+end_src
Decrease threshold to 5 MB after init
#+begin_src elisp
(add-hook 'after-init-hook (lambda () (setq gc-cons-threshold (* 5 1024 1024))))
#+end_src
* Straight.el and use-package
Integrate use-package and straight
#+begin_src elisp
(setq straight-use-package-by-default t)
(require 'use-package)
(straight-use-package 'diminish)
(require 'diminish)
#+end_src
Make sure Org is installed (straight.el)
#+begin_src elisp
(unless (file-directory-p (expand-file-name "~/.emacs.d/straight/versions")) (make-directory (expand-file-name "~/.emacs.d/straight/versions") t))
(use-package org)
#+end_src
* Custom file
#+begin_src elisp
(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
(when (file-exists-p custom-file) (load custom-file))
#+end_src
* System information
#+begin_src elisp
(defvar my-laptop-p (equal (system-name) "lilitop"))
(defvar my-server-p (and (equal (system-name) "localhost") (equal user-login-name "root")))
(defvar my-phone-p (not (null (getenv "ANDROID_ROOT")))
"If non-nil, GNU Emacs is running on Termux.")
(when my-phone-p (defvar gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3"))
(global-auto-revert-mode) ; simplifies syncing
#+end_src
* Persistent history
#+begin_src elisp
(savehist-mode)
#+end_src
* Disable Syntax Checkers (Diagnostic)
#+begin_src elisp
(when (fboundp 'flycheck-mode)
(setq flycheck-global-modes nil)
(global-flycheck-mode -1))
(when (fboundp 'flymake-mode)
(setq help-at-pt-display-when-idle t)
;; Disable flymake in all buffers
(add-hook 'find-file-hook (lambda () (flymake-mode -1))))
#+end_src
* Backup and versioning
#+begin_src emacs-lisp
(use-package magit)
#+end_src
* Personal information
#+begin_src elisp
(setq user-full-name "Amr Gharbeia")
(defvar email-address "amr@gharbeia.net")
(defvar calendar-latitude 39.0)
(defvar calendar-longitude -77.1)
(defvar calendar-location-name "Washington, DC")
(defvar calendar-time-zone -300)
(defvar calendar-standard-time-zone-name "EST")
(defvar calendar-daylight-time-zone-name "EDT")
#+end_src
* Saving Emacs Sessions
Close frame when done
#+begin_src elisp
(add-hook 'server-done-hook (lambda () (delete-frame)))
#+end_src
Save desktop session
#+begin_src elisp
(desktop-save-mode t)
#+end_src
* Security
#+begin_src elisp
(use-package password-store)
#+end_src
#+begin_src elisp
(use-package auth-source
:config (auth-source-pass-enable)
)
#+end_src
* End matter
#+begin_src elisp
(provide 'emacs-core)
;;; emacs-core.el ends here
#+end_src

View File

@@ -1,18 +0,0 @@
#+TITLE: Early Init Configuration
#+PROPERTY: header-args :tangle ~/.emacs.d/early-init.el
* early-init.el
For straight.el to pick up before package.el
#+begin_src elisp
(setq package-enable-at-startup nil)
#+end_src
* Run Emacs as a server
#+begin_src elisp
(require 'server)
(unless (server-running-p) (server-start))
(defvar server-max-buffers 100)
#+end_src

View File

@@ -1,166 +0,0 @@
#+TITLE: GTD & Agenda Configuration
#+PROPERTY: header-args :tangle yes
* Agenda
Basic agenda settings
#+begin_src elisp
(setq org-deadline-warning-days 7)
(setq org-agenda-skip-additional-timestamps-same-entry t)
(setq org-agenda-span 'fortnight)
(setq org-agenda-tags-column 'auto)
(setq org-agenda-skip-scheduled-if-deadline-is-shown t)
#+end_src
Agenda files
#+begin_src elisp
(setq org-agenda-files (list
(concat org-directory "/inbox.org")
(concat org-directory "/gtd.org")
(concat org-directory "/org-gtd-tasks.org")
)
)
#+end_src
Better agenda views
#+begin_src elisp :tangle yes
(use-package org-super-agenda)
#+end_src
* To-do
Basic todo
#+begin_src elisp
(setq org-todo-keywords
'(
(sequence "TODO(t)" "NEXT(n)" "WAIT(w@/!)" "|" "DONE(d!)" "CNCL(c@)")
)
)
(setq org-todo-keyword-faces
'(
("TODO" :foreground "red" :weight bold)
("NEXT" :foreground "red" :weight bold)
("WAIT" :foreground "yellow" :weight bold)
("DONE" :foreground "green" :weight bold)
("CNCL" :foreground "blue" :weight bold)
)
)
(setq org-enforce-todo-dependencies t)
(setq org-tags-exclude-from-inheritance '("crypt" "!private"))
#+end_src
Switch entry to 'DONE' when all subentries are done
#+begin_src elisp
(defun org-summary-todo (n-done n-not-done)
"Switch entry to 'DONE' when all subentries are done, to 'TODO' otherwise.
Uses N-DONE and N-NOT-DONE"
(let (org-log-done org-log-states) ; turn off logging
(org-todo (if (= n-not-done 0) "DONE" "TODO")
)
)
)
;; (add-hook 'org-after-todo-statistics-hook #'org-summary-todo)
#+end_src
* Getting Things Done (GTD)
#+begin_src elisp
(use-package f)
(use-package dash)
(use-package s)
(use-package org-edna
:config
(setq org-edna-use-inheritance t)
(org-edna-mode))
(use-package org-gtd
:straight (org-gtd :type git :host github :repo "Trevoke/org-gtd.el")
:demand t
:init (setq org-gtd-update-ack "4.0.0")
:config
(setq org-gtd-keyword-mapping
'((todo . "TODO")
(next . "NEXT")
(wait . "WAIT")
(done . "DONE")
(canceled . "CNCL")))
(setq org-gtd-custom-node-paths
(list (list "Actionable" (expand-file-name "~/memex/gtd.org") "Actions")
(list "Legacy" (expand-file-name "~/memex/org-gtd-tasks.org") "Actions")
(list "Projects" (expand-file-name "~/memex/gtd.org") "Projects")
(list "Incubate" (expand-file-name "~/memex/gtd.org") "Incubate")))
(org-gtd-mode)
)
(global-set-key (kbd "C-c d c") #'org-gtd-capture)
(global-set-key (kbd "C-c d e") #'org-gtd-engage)
(global-set-key (kbd "C-c d p") #'org-gtd-process-inbox)
(with-eval-after-load 'org-gtd
(define-key org-gtd-clarify-map (kbd "C-c c") #'org-gtd-organize))
#+end_src
#+begin_src elisp
(setq org-gtd-directory org-directory)
(setq org-gtd-organize-hooks '(org-gtd-set-area-of-focus))
(setq org-gtd-areas-of-focus '(
"Atoms"
"Bits"
"Cells"
"Flags"
"Business"
"Wealth"
"Learning"
"Skills"
"Privacy"
"Archive"
"Library"
"Writing"
"Health"
"Home"
"Family"
"Social"
"Egypt"
)
)
(setq org-gtd-clarify-show-horizons 'right)
#+end_src
Logging
#+begin_src elisp
(setq org-log-into-drawer "LOGBOOK")
#+end_src
Clocking work in drawer
#+begin_src elisp :tangle yes
(setq org-clock-into-drawer t)
#+end_src
Habits
#+begin_src elisp :tangle yes
(setq org-habit-graph-column 80)
(setq org-habit-show-habits-only-for-today nil)
#+end_src
* Refile
org-refile targets
#+begin_src elisp
(setq org-refile-targets '((nil :maxlevel . 9)
(org-agenda-files :maxlevel . 9)
)
)
#+end_src
Set type of refile targets completion
#+begin_src elisp
(setq org-outline-path-complete-in-steps nil)
#+end_src
Allow refiling to new parents created on the go after confirmation
#+begin_src elisp
(setq org-refile-allow-creating-parent-nodes 'confirm)
#+end_src

View File

@@ -1,101 +0,0 @@
#+TITLE: Media and Books Configuration
#+PROPERTY: header-args :tangle yes
* Read ebooks (calibredb)
#+begin_src elisp
(use-package calibredb
:defer t
:config
(setq calibredb-format-all-the-icons t)
(setq calibredb-format-icons-in-terminal t))
#+end_src
#+begin_src elisp
(defvar calibredb-root-dir (expand-file-name "~/memex/library/books"))
(defvar calibredb-db-dir (expand-file-name "metadata.db" calibredb-root-dir))
(defvar calibredb-id-width 6)
(defvar calibredb-title-width 100)
#+end_src
* PDF Tools
#+begin_src elisp
(use-package pdf-tools
:mode ("\\.pdf\\'" . pdf-view-mode)
:config
(pdf-tools-install :no-query)
(setq-default pdf-view-display-size 'fit-page)
(setq pdf-annot-activate-created-annotations t))
#+end_src
* Annotate PDFs and EPUBs (org-noter)
#+begin_src elisp
(use-package org-noter
:config
(setq org-noter-notes-search-path (list (expand-file-name "~/memex/library/books")))
(setq org-noter-default-notes-file-names '("books.org")))
#+end_src
#+begin_src elisp :tangle ~/.emacs.d/custom.el
(defvar org-noter-notes-search-path (list (concat org-directory "/library/books")))
(defvar org-noter-default-notes-file-names '("books.org"))
#+end_src
* Link PDFs (org-noter-pdftools)
#+begin_src elisp
(use-package org-noter-pdftools
:after org-noter
:config
;; Add a function to ensure precise note is inserted
(defun org-noter-pdftools-insert-precise-note (&optional toggle-no-questions)
(interactive "P")
(org-noter--with-valid-session
(let ((org-noter-insert-note-no-questions (if toggle-no-questions
(not org-noter-insert-note-no-questions)
org-noter-insert-note-no-questions))
(org-pdftools-use-isearch-link t)
(org-pdftools-use-freepointer-annot t))
(org-noter-insert-note (org-noter--get-precise-info)))))
;; fix https://github.com/weirdNox/org-noter/pull/93/commits/f8349ae7575e599f375de1be6be2d0d5de4e6cbf
(defun org-noter-set-start-location (&optional arg)
"When opening a session with this document, go to the current location.
With a prefix ARG, remove start location."
(interactive "P")
(org-noter--with-valid-session
(let ((inhibit-read-only t)
(ast (org-noter--parse-root))
(location (org-noter--doc-approx-location (when (called-interactively-p 'any) 'interactive))))
(with-current-buffer (org-noter--session-notes-buffer session)
(org-with-wide-buffer
(goto-char (org-element-property :begin ast))
(if arg
(org-entry-delete nil org-noter-property-note-location)
(org-entry-put nil org-noter-property-note-location
(org-noter--pretty-print-location location))))))))
(with-eval-after-load 'pdf-annot
(add-hook 'pdf-annot-activate-handler-functions #'org-noter-pdftools-jump-to-note)
)
)
#+end_src
* View EPUBs (nov.el)
#+begin_src elisp :tangle yes
(use-package nov
:config
(add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode))
)
#+end_src
* Zotero (helm-bibtex)
#+begin_src elisp :tangle yes
(use-package helm-bibtex)
#+end_src
#+begin_src elisp :tangle ~/.emacs.d/custom.el
(defvar bibtex-completion-bibliography '("~/bibliography/zotero.bib"))
#+end_src

View File

@@ -1,233 +0,0 @@
#+TITLE: Org Mode Configuration
#+PROPERTY: header-args :tangle yes
* Org Mode
** Basic setup
#+begin_src elisp
(use-package org
:config
(defvar org-outline-path-complete-in-steps nil)
:bind (("C-c l" . org-store-link)
("C-c a" . org-agenda)
("C-c c" . org-capture)
:map org-mode-map)
)
#+end_src
#+begin_src elisp
(setq org-directory (expand-file-name "~/memex/"))
#+end_src
** Looks
Basic
#+begin_src elisp
(defvar org-pretty-entities t) ; Improve org mode looks
(defvar org-hide-emphasis-markers t) ; Hide emphasis markup
(defvar org-num-mode nil)
(defvar org-startup-folded 'shw2levels)
#+end_src
Indentation of headers
#+begin_src elisp
(defvar org-startup-indented t) ; Indent org heirarchy
(defvar org-adapt-indentation t)
(defvar org-hide-leading-stars t) ; Minimal Outline
(defvar org-odd-levels-only nil)
#+end_src
Indentation of lists
#+begin_src elisp
(setq org-list-demote-modify-bullet t)
#+end_src
Org-modern
#+begin_src elisp
(use-package org-modern
:ensure t
:config
;; Choose some fonts
(set-face-attribute 'default nil :family "sans-serif")
(set-face-attribute 'variable-pitch nil :family "sans-serif")
(set-face-attribute 'org-modern-symbol nil :family "Iosevka")
;; Edit settings
(defvar org-auto-align-tags nil)
(defvar org-tags-column 0)
(defvar org-catch-invisible-edits 'show-and-error)
(defvar org-special-ctrl-a/e t)
(defvar org-insert-heading-respect-content t)
;; Org styling, hide markup etc.
(defvar org-hide-emphasis-markers t)
(defvar org-pretty-entities t)
;; Agenda styling
(defvar org-agenda-tags-column 0)
(defvar org-agenda-block-separator ?─)
(defvar org-agenda-time-grid
'((daily today require-timed)
(800 1000 1200 1400 1600 1800 2000)
" ┄┄┄┄┄ " "┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄"))
(defvar org-agenda-current-time-string
"◀── now ─────────────────────────────────────────────────")
;; Ellipsis styling
(defvar org-ellipsis "")
(set-face-attribute 'org-ellipsis nil :inherit 'default :box nil)
(global-org-modern-mode)
)
#+end_src
Highlight Sourcecode Syntax
#+begin_src elisp
(setq org-src-fontify-natively t)
(setq org-src-tab-acts-natively t)
#+end_src
Images
#+begin_src elisp
(setq org-startup-with-inline-images t)
(setq org-image-actual-width '(300))
#+end_src
** Capture
#+begin_src elisp
(defvar org-default-notes-file (concat org-directory "inbox.org"))
#+end_src
*** Org-protocol
Linux configuration
#+begin_src bash :tangle yes
[Desktop Entry]
Name=org-protocol
Comment=Intercept calls from emacsclient to trigger custom actions
Categories=Other;
Keywords=org-protocol;
Icon=emacs
Type=Application
Exec=emacsclient -- %u
Terminal=false
StartupWMClass=Emacs
MimeType=x-scheme-handler/org-protocol;
#+end_src
#+begin_src bash :tangle yes
update-desktop-database ~/.local/share/applications/
#+end_src
Basic configuration
#+begin_src elisp
(require 'org-protocol)
(setq org-protocol-default-buffer-for-file-links "*scratch*") ; fixes 'no buffers remain to edit error for org-protocol capturer
#+end_src
Org-protocol templates
#+begin_src elisp :tangle ~/.emacs.d/custom.el
(defvar org-capture-templates '(
("p" "Protocol"
entry
(file "inbox.org")
"* %^{Title}\nSource: %u, %c\n #+BEGIN_QUOTE\n%i\n#+END_QUOTE\n\n\n%?"
)
("L" "Protocol Link"
entry
(file "inbox.org")
"* %? [[%:link][%:description]]\n:PROPERTIES:\n:TITLE: %:description\n:URI: %:link\n:CREATED: %U\n:END:"
:prepend nil
:empty-lines 1
:created t
:kill-buffer t
)
)
)
#+end_src
#+begin_src elisp
(setq org-protocol-default-template-key "L")
#+end_src
Convert Orgzly captures to org-protocol captures standard
#+begin_src elisp
(defun my/org-convert-orgzly-to-org-protocol ()
"Reformat Orgzly bookmark at point to org-protocol bookmark."
(interactive)
(when (org-at-heading-p)
(let ((headline (nth 4 (org-heading-components))))
;; Find and store the link. Delete the link line.
(search-forward-regexp "^https?://\\S-*" nil t)
(let ((link (match-string 0)))
(beginning-of-line)
(kill-line)
;; Delete any trailing blank spaces
(org-back-to-heading)
(end-of-line)
(when (not (org-on-heading-p))
(delete-char 1)
)
;; Set new headline
(goto-char (org-entry-beginning-position))
(org-edit-headline (format "[[%s][%s]]" link headline))
;; Set new properties
(org-set-property "TITLE" headline)
(org-set-property "URI" link)
(message "Reformatted Orgzly bookmark at point to org-protocol bookmark")
)
)
)
)
#+end_src
** Exporting
#+begin_src elisp :tangle yes
(setq org-export-with-smart-quotes t)
(setq org-export-backends '(beamer html latex md))
#+end_src
Export to EPUB
#+begin_src elisp :tangle yes
(use-package ox-epub)
#+end_src
** org-attach
#+begin_src elisp
(setq org-attach-id-dir (concat org-directory "/library"))
#+end_src
** Enable shell scripting support in org-babel
#+begin_src elisp
(defvar org-babel-do-load-languages 'org-babel-load-languages '((shell . t)))
#+end_src
** Insert org-mode links from clipboard
#+begin_src elisp :tangle yes
(use-package org-cliplink
:bind
(("C-x p i" . org-cliplink))
)
#+end_src
** Deft
#+begin_src elisp :tangle yes
(use-package deft
:commands (deft)
:init
(defvar deft-extensions '("org"))
(defvar deft-recursive nil)
(defvar deft-use-filename-as-title t)
:config
(defvar deft-directory org-directory)
(defvar deft-recursive t)
(defvar deft-strip-summary-regexp ":PROPERTIES:\n\\(.+\n\\)+:END:\n")
(defvar deft-use-filename-as-title t)
:bind ("C-c n d" . deft)
)
#+end_src

View File

@@ -1,140 +0,0 @@
#+TITLE: Org-Roam Configuration
#+PROPERTY: header-args :tangle yes
* Org-roam
** Basic org-roam setup
#+begin_src elisp
(use-package org-roam
:init (setq org-roam-v2-ack t) ;; Acknowledge V2 upgrade
:after org
:config
(org-roam-db-autosync-enable)
(require 'org-roam-dailies)
:bind (
("C-c n f" . org-roam-node-find)
("C-c n g" . org-roam-graph)
("C-c n r" . org-roam-node-random)
("C-c n h" . org-roam-node-convert-headline)
("C-c n i" . org-roam-node-insert)
("C-c n o" . org-id-get-create)
("C-c n t" . org-roam-tag-add)
("C-c n a" . org-roam-alias-add)
("C-c n l" . org-roam-buffer-display-dedicated)
)
)
#+end_src
#+begin_src elisp
(setq org-roam-directory (expand-file-name (concat org-directory "notes")))
(setq org-roam-dailies-directory (expand-file-name (concat org-directory "daily")))
#+end_src
#+begin_src elisp :tangle yes
(use-package sqlite3)
(require 'sqlite3)
#+end_src
Include subdirectories in org-roam
#+begin_src elisp
(setq org-roam-file-exclude-regexp "^[.][.]?/")
#+end_src
** Display in org-roam-buffer
#+begin_src elisp :tangle yes
(setq org-roam-mode-sections
(list #'org-roam-backlinks-section
#'org-roam-reflinks-section
#'org-roam-unlinked-references-section
)
)
#+end_src
** Filter org-roam nodes find by tag
#+begin_src elisp :tangle yes
(defun my/org-roam-node-has-tag (node tag)
"Filter function to check if the given NODE has the specified TAG."
(member tag (org-roam-node-tags node))
)
(defun my/org-roam-node-find-by-tag ()
"Find and open an Org-roam node based on a specified tag."
(interactive)
(let ((tag (read-string "Enter tag: ")))
(org-roam-node-find nil nil (lambda (node) (my/org-roam-node-has-tag node tag))))
)
#+end_src
** org-roam-capture templates
#+begin_src elisp
(setq org-roam-capture-templates
'(
("L" "link" plain
(function org-roam--capture-get-point)
"%?"
:file-name "web/%<%Y-%m-%dT%H%M%S>.org"
:head "#+TITLE: ${title}\n#+CREATED: %<%Y-%m-%dT%H%M%S>"
:immediate-finish t
:unnarrowed t
)
("h" "hugo post" plain
"%?"
:target (file+head "posts/${slug}.org"
"#+TITLE: ${title}\n#+DATE: %U\n#+HUGO_BASE_DIR: ~/gharbeia.net\n#+HUGO_SECTION: ./posts\n#+HUGO_AUTO_SET_LASTMOD: t\n#+HUGO_TAGS: article\n#+HUGO_DRAFT: true\n")
:immediate-finish t
:unnarrowed t
)
("p" "person" plain
"%?"
:if-new (file+head "people/${slug}.org"
"#+TITLE: ${title}")
:immediate-finish t
:unnarrowed t
)
)
)
#+end_src
#+begin_src elisp
(setq org-roam-dailies-capture-templates
'(
("d" "daily" plain
""
:target ("file+heaed %<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d>\n\n")
:immediate-finish t
)
)
)
#+end_src
** Move org header to org-roam-daily
#+begin_src elisp :tangle yes
(defun my/org-move-entry-to-daily-notes ()
"Move the current org-mode headline to the daily notes file based on its :CREATED: property."
(interactive)
(let*
(
(created-prop (org-entry-get nil "CREATED"))
(created-date (when created-prop
(org-parse-time-string created-prop)))
(year (nth 5 created-date)) ; Extract year (6th element)
(month (nth 4 created-date)) ; Extract month (5th element)
(day (nth 3 created-date)) ; Extract day (4th element)
(target-date (format "%04d-%02d-%02d" year month day)) ; Format date string
(target-file (org-roam-dailies-goto target-date))
)
(when target-file
(org-cut-subtree)
(find-file target-file)
(goto-char (point-max))
(unless (bolp) (newline))
(org-paste-subtree)
)
)
)
#+end_src

View File

@@ -1,73 +0,0 @@
#+TITLE: Shell Configuration
#+PROPERTY: header-args :tangle yes
* Shell
** Bash completion
#+begin_src elisp
(use-package bash-completion
:config
(require 'bash-completion)
(bash-completion-setup)
)
#+end_src
#+begin_src elisp
(defvar shell-dynamic-complete-functions t)
#+end_src
** Eshell
Add programmable bash completion to Emacs shell-mode
#+begin_src elisp :tangle yes
(require 'bash-completion)
(add-hook 'eshell-mode-hook
(lambda ()
(add-hook 'completion-at-point-functions
'bash-completion-capf-nonexclusive nil t
)
)
)
#+end_src
Use colors in eshell
#+begin_src elisp :tangle yes
(use-package xterm-color
:commands (xterm-color-filter)
)
(use-package eshell
:after xterm-color
:config
(define-key eshell-hist-mode-map (kbd "M-r") #'consult-history)
(add-hook 'eshell-mode-hook
(lambda ()
(setenv "TERM" "xterm-256color")))
(add-hook 'eshell-before-prompt-hook (setq xterm-color-preserve-properties t))
(add-to-list 'eshell-preoutput-filter-functions 'xterm-color-filter)
(setq eshell-output-filter-functions
(remove 'eshell-handle-ansi-color eshell-output-filter-functions)
)
)
#+end_src
Eshell completion
#+begin_src elisp :tangle yes
(add-hook 'eshell-mode-hook
(lambda ()
(add-hook 'completion-at-point-functions
'bash-completion-capf-nonexclusive nil t)))
#+end_src
Emulate A Terminal (EAT)
#+begin_src elisp :tangle yes
(use-package eat
:config
;; For `eat-eshell-mode'.
(add-hook 'eshell-load-hook #'eat-eshell-mode)
;; For `eat-eshell-visual-command-mode'.
(add-hook 'eshell-load-hook #'eat-eshell-visual-command-mode)
)
#+end_src

View File

@@ -1,254 +0,0 @@
#+TITLE: Reading and Writing Configuration
#+PROPERTY: header-args :tangle yes
* Text and Case
** Convert DOuble capitals to single capitals
#+begin_src elisp :tangle yes
(defun my/dcaps-to-scaps ()
"Convert word in DOuble CApitals to Single Capitals."
(interactive)
(and (= ?w (char-syntax (char-before)))
(save-excursion
(and (if (called-interactively-p)
(skip-syntax-backward "w")
(= -3 (skip-syntax-backward "w"))
)
(let (case-fold-search)
(looking-at "\\b[[:upper:]]\\{2\\}[[:lower:]]")
)
(capitalize-word 1)
)
)
)
)
#+end_src
Then, lets define a minor mode for it to be activated.
#+begin_src elisp :tangle yes
(define-minor-mode my-dubcaps-mode
"Toggle 'my-dubcaps-mode' and convert words in DOuble CApitals to Single Capitals as you type."
:init-value nil
:lighter (" DC")
(if my-dubcaps-mode
(add-hook 'post-self-insert-hook #'my/dcaps-to-scaps nil 'local)
(remove-hook 'post-self-insert-hook #'my/dcaps-to-scaps 'local)))
#+end_src
Finally, lets add a hook so that it is on for all the text files Emacs opens.
#+begin_src elisp :tangle yes
(add-hook 'text-mode-hook #'my-dubcaps-mode)
#+end_src
Also, since we add a minor mode string (it might be useful sometimes), currently I prefer to diminish it.
#+begin_src elisp :tangle yes
(defun my/diminish-dubcaps ()
(interactive)
(diminish 'my-dubcaps-mode ""))
(add-hook 'my-dubcaps-mode-hook 'my/diminish-dubcaps)
#+end_src
* Reading and Writing
** Move correctly over camelCased words
#+begin_src elisp
(subword-mode)
#+end_src
** Understand the more common sentence with double space
#+begin_src elisp
(setq sentence-end-double-space nil)
#+end_src
** Join lines into paragraph
#+begin_src elisp
(defun my/fill-or-unfill-paragraph (&optional unfill region)
"Fill paragraph (or REGION). With the prefix argument UNFILL, fill it instead."
(interactive (progn
(barf-if-buffer-read-only)
(list (if current-prefix-arg 'fill) t)))
(let ((fill-column (if unfill fill-column (point-max))))
(fill-paragraph nil region)))
(bind-key "M-q" 'my/fill-or-unfill-paragraph)
#+end_src
#+begin_src elisp
(defun my/fill-or-unfill-all-paragraphs (&optional unfill)
"Fill or unfill all paragraphs in the current buffer.
With the prefix argument UNFILL, fill them instead."
(interactive (list (if current-prefix-arg 'fill)))
(let ((fill-column (if unfill fill-column (point-max))))
(save-excursion
(goto-char (point-min))
(while (not (eobp))
(fill-paragraph nil t)
(forward-paragraph)))))
(bind-key "M-Q" 'my/fill-or-unfill-all-paragraphs)
#+end_src
#+begin_src elisp
(remove-hook 'text-mode-hook #'turn-on-auto-fill)
(add-hook 'text-mode-hook 'turn-on-visual-line-mode)
#+end_src
** Expand some words with auto-correct
#+begin_src elisp :tangle yes
(setq save-abbrevs 'silently)
(setq-default abbrev-mode t)
#+end_src
** ediff
#+begin_src elisp :tangle yes
(setq ediff-window-setup-function 'ediff-setup-windows-plain)
(setq ediff-split-window-function 'split-window-horizontally)
#+end_src
** tramp
#+begin_src elisp :tangle yes
(setq tramp-default-method "ssh"
tramp-backup-directory-alist backup-directory-alist
tramp-ssh-controlmaster-options "ssh")
#+end_src
** Clean up space
#+begin_src elisp :tangle yes
(bind-key "M-SPC" 'cycle-spacing)
#+end_src
** Transform <a href> links into org links
#+begin_src elisp :tangle yes
(defun my/transform-html-links-to-org ()
"Transform all HTML <a> links in the current buffer into 'org-mode' links."
(interactive)
(goto-char (point-min))
(while (re-search-forward "<a href=\"\\(.*?\\)\">\\(.*?\\)</a>" nil t)
(replace-match (org-make-link-string (match-string 1) (match-string 2)))))
#+end_src
** Count words per minute
#+begin_src elisp :tangle yes
(require 'org-clock)
(defun my/org-entry-wpm ()
(interactive)
(save-restriction
(save-excursion
(org-narrow-to-subtree)
(goto-char (point-min))
(let* ((words (count-words-region (point-min) (point-max)))
(minutes (org-clock-sum-current-item))
(wpm (/ words minutes)))
(message "WPM: %d (words: %d, minutes: %d)" wpm words minutes)
(kill-new (number-to-string wpm))
)
)
)
)
#+end_src
** Enable dict mode
#+begin_src elisp :tangle yes
(setq dictionary-server "automatic")
#+end_src
** Pick out passive voice and weasel words
#+begin_src elisp :tangle yes
(use-package writegood-mode
:diminish writegood-mode
:config
(progn (add-hook 'text-mode-hook 'writegood-mode))
)
#+end_src
** Org-babel docker
#+begin_src elisp :tangle yes
(use-package ob-docker-build
:straight (ob-docker-build :type git :host github :repo "ifitzpat/ob-docker-build")
:defer t
:config
(add-to-list 'org-babel-load-languages '(docker-build . t))
(org-babel-do-load-languages 'org-babel-load-languages org-babel-load-languages)
)
#+end_src
* Spelling and syntax
** Spell checking
This requires installation of hunspell
#+begin_src bash :tangle yes
sudo apt install hunspell
#+end_src
#+begin_src elisp
(use-package flyspell
:config (setq ispell-program-name "hunspell"
ispell-default-dictionary "en_US"
)
:diminish (flyspell-mode . "φ")
:hook (text-mode . flyspell-mode)
:bind (
("M-<f7>" . flyspell-buffer)
("<f7>" . flyspell-word)
("C-;" . flyspell-auto-correct-previous-word)
)
)
#+end_src
** Flyspell correct
#+begin_src elisp :tangle yes
(use-package flyspell-correct
:after flyspell
:bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper))
)
#+end_src
** Flycheck
Needs external checkers installed
#+begin_src elisp
(use-package flycheck
:defer t
:diminish (flycheck-mode . "")
:config
(setq flycheck-emacs-lisp-load-path 'inherit)
(setq flycheck-emacs-lisp-load-path (concat user-emacs-directory "straight/build")))
#+end_src
** Flycheck bash
#+begin_src bash :tangle yes
sudo apt install devscripts
#+end_src
#+begin_src elisp :tangle yes
(use-package flycheck-checkbashisms
:config
(flycheck-checkbashisms-setup)
)
#+end_src
** Yaml
#+begin_src elisp :tangle yes
(use-package yaml-mode
:config
(add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode))
(add-to-list 'auto-mode-alist '("\\.yaml\\'" . yaml-mode))
)
#+end_src
** Docker
#+begin_src elisp :tangle yes
(use-package docker-compose-mode)
#+end_src

View File

@@ -1,16 +0,0 @@
(let ((config-dir "~/memex/system/"))
;; Load the core settings, including package management and essential setup.
(org-babel-load-file (expand-file-name "emacs-core.org" config-dir))
;; Load early init settings (if separate and not fully covered by core)
(org-babel-load-file (expand-file-name "emacs-early-init.org" config-dir))
;; Load other modules in a logical order
(org-babel-load-file (expand-file-name "emacs-org.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-gtd.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-roam.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-writing.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-media.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-shell.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-ai.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-misc.org" config-dir)))

46
system/test_cli.py Normal file
View File

@@ -0,0 +1,46 @@
import socket
import struct
def frame_message(msg_string):
payload = msg_string.encode('utf-8')
return f"{len(payload):06x}".encode('ascii') + payload
def read_framed(sock):
header = b''
while len(header) < 6:
chunk = sock.recv(6 - len(header))
if not chunk:
return None
header += chunk
length = int(header, 16)
data = b''
while len(data) < length:
chunk = sock.recv(length - len(data))
if not chunk:
return None
data += chunk
return data.decode('utf-8')
msg = '(:TYPE :REQUEST :PAYLOAD (:ACTION :MESSAGE :TEXT "hello") :META (:SOURCE :CLI :SESSION-ID "test1"))'
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('127.0.0.1', 9105))
sock.settimeout(10.0)
# Read handshake
handshake = read_framed(sock)
print("HANDSHAKE:", handshake)
# Read status
status = read_framed(sock)
print("STATUS:", status)
# Send message
sock.sendall(frame_message(msg))
print("SENT:", msg)
# Read response
response = read_framed(sock)
print("RESPONSE:", response)
sock.close()

View File

@@ -1,16 +0,0 @@
(let ((config-dir "~/memex/system/"))
;; Load the core settings, including package management and essential setup.
(org-babel-load-file (expand-file-name "emacs-core.org" config-dir))
;; Load early init settings (if separate and not fully covered by core)
(org-babel-load-file (expand-file-name "emacs-early-init.org" config-dir))
;; Load other modules in a logical order
(org-babel-load-file (expand-file-name "emacs-org.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-gtd.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-roam.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-writing.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-media.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-shell.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-ai.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-misc.org" config-dir)))