--- sidebar_position: 9 title: "Context References" description: "Inline @-syntax for attaching files, folders, git diffs, and URLs directly into your messages" --- # Context References Type `@` followed by a reference to inject content directly into your message. Hermes expands the reference inline and appends the content under an `--- Attached Context ---` section. ## Supported References | Syntax | Description | |--------|-------------| | `@file:path/to/file.py` | Inject file contents | | `@file:path/to/file.py:10-25` | Inject specific line range (1-indexed, inclusive) | | `@folder:path/to/dir` | Inject directory tree listing with file metadata | | `@diff` | Inject `git diff` (unstaged working tree changes) | | `@staged` | Inject `git diff --staged` (staged changes) | | `@git:5` | Inject last N commits with patches (max 10) | | `@url:https://example.com` | Fetch and inject web page content | ## Usage Examples ```text Review @file:src/main.py and suggest improvements What changed? @diff Compare @file:old_config.yaml and @file:new_config.yaml What's in @folder:src/components? Summarize this article @url:https://arxiv.org/abs/2301.00001 ``` Multiple references work in a single message: ```text Check @file:main.py, and also @file:test.py. ``` Trailing punctuation (`,`, `.`, `;`, `!`, `?`) is automatically stripped from reference values. ## CLI Tab Completion In the interactive CLI, typing `@` triggers autocomplete: - `@` shows all reference types (`@diff`, `@staged`, `@file:`, `@folder:`, `@git:`, `@url:`) - `@file:` and `@folder:` trigger filesystem path completion with file size metadata - Bare `@` followed by partial text shows matching files and folders from the current directory ## Line Ranges The `@file:` reference supports line ranges for precise content injection: ```text @file:src/main.py:42 # Single line 42 @file:src/main.py:10-25 # Lines 10 through 25 (inclusive) ``` Lines are 1-indexed. Invalid ranges are silently ignored (full file is returned). ## Size Limits Context references are bounded to prevent overwhelming the model's context window: | Threshold | Value | Behavior | |-----------|-------|----------| | Soft limit | 25% of context length | Warning appended, expansion proceeds | | Hard limit | 50% of context length | Expansion refused, original message returned unchanged | | Folder entries | 200 files max | Excess entries replaced with `- ...` | | Git commits | 10 max | `@git:N` clamped to range [1, 10] | ## Security ### Sensitive Path Blocking These paths are always blocked from `@file:` references to prevent credential exposure: - SSH keys and config: `~/.ssh/id_rsa`, `~/.ssh/id_ed25519`, `~/.ssh/authorized_keys`, `~/.ssh/config` - Shell profiles: `~/.bashrc`, `~/.zshrc`, `~/.profile`, `~/.bash_profile`, `~/.zprofile` - Credential files: `~/.netrc`, `~/.pgpass`, `~/.npmrc`, `~/.pypirc` - Hermes env: `$HERMES_HOME/.env` These directories are fully blocked (any file inside): - `~/.ssh/`, `~/.aws/`, `~/.gnupg/`, `~/.kube/`, `$HERMES_HOME/skills/.hub/` ### Path Traversal Protection All paths are resolved relative to the working directory. References that resolve outside the allowed workspace root are rejected. ### Binary File Detection Binary files are detected via MIME type and null-byte scanning. Known text extensions (`.py`, `.md`, `.json`, `.yaml`, `.toml`, `.js`, `.ts`, etc.) bypass MIME-based detection. Binary files are rejected with a warning. ## Error Handling Invalid references produce inline warnings rather than failures: | Condition | Behavior | |-----------|----------| | File not found | Warning: "file not found" | | Binary file | Warning: "binary files are not supported" | | Folder not found | Warning: "folder not found" | | Git command fails | Warning with git stderr | | URL returns no content | Warning: "no content extracted" | | Sensitive path | Warning: "path is a sensitive credential file" | | Path outside workspace | Warning: "path is outside the allowed workspace" |