Personalized variants (default trigger: salva.md) compile to a separate
top-level folder so generated/<persona>/ stays clean of per-user content.
Both the trigger variant filename(s) and the output folder name are
config-driven via config.user — the build is truly user-agnostic.
Build changes:
- Module-level _RUNTIME dict cached by configure_runtime(config) at startup
- resolve_personalized_variants(config) — config.user.personalized_variants
- resolve_personalized_output_dirname(config) — slug-derives from
user.name (e.g. "Salva" → "salva-personas") with explicit override key
- resolve_personalized_source_dirname(config) — defaults to literal
"personalized" (gitignorable, user-name-independent)
- iter_persona_output_dirs() — single helper used by all install_*()
functions to transparently iterate both layouts
- build_persona() routes salva variants based on _RUNTIME at write time
- build_skills_index() also scans <repo>/personalized/skills/ so personal
skills (with user-private data) merge into the shared skill index
- main() picks up persona dirs from BOTH personas/ and personalized/
New config keys (all optional):
- user.personalized_variants
- user.personalized_output_folder
- user.personalized_source_folder
Output layout (e.g. for user.name="Salva"):
- generated/<persona>/general.{json,yaml,prompt.md} (shared)
- generated/<persona>/<spec>.{json,yaml,prompt.md} (shared)
- generated/salva-personas/<persona>/salva.{json,yaml,prompt.md} (private)
Source layout:
- personas/<persona>/general.md, <spec>.md (committed)
- personalized/<persona>/salva.md (gitignored)
- personalized/skills/<skill>/SKILL.md (gitignored)
- personalized/_user_context.md (gitignored)
Adds /personalized/ to .gitignore. Documents the new layout in CLAUDE.md
and README.md. Maps linkedin-content-strategy → herald/forge/frodo/ghost
in the default skill persona map.
175 lines
6.5 KiB
YAML
175 lines
6.5 KiB
YAML
# Persona Library Configuration
|
|
# Copy this file to config.yaml and customize for your setup.
|
|
# Build system reads this file and injects values into persona templates.
|
|
|
|
# ─── User Profile ───────────────────────────────────────────────
|
|
user:
|
|
name: "Your Name"
|
|
handle: "your-handle"
|
|
location: "Country (GMT+X)"
|
|
role: "Your role/title"
|
|
languages:
|
|
native: "en"
|
|
fluent: ["en"]
|
|
learning: []
|
|
communication:
|
|
style: "direct" # direct | verbose | academic
|
|
primary_interface: "cli" # cli | telegram | discord | slack
|
|
casual_language: "en"
|
|
technical_language: "en"
|
|
|
|
# Personalized variant routing (optional). Variants matched here are
|
|
# written to generated/<personalized_output_folder>/<persona>/ instead
|
|
# of generated/<persona>/, keeping the main persona folders clean of
|
|
# per-user content.
|
|
#
|
|
# Defaults if both are omitted:
|
|
# personalized_variants: ["salva"] (existing convention)
|
|
# personalized_output_folder: slugify(user.name) + "-personas"
|
|
# e.g. "Alice Smith" → "alice-smith-personas"
|
|
# (or "personalized-personas" if name unset)
|
|
personalized_variants: ["salva"]
|
|
# personalized_output_folder: "my-personas" # explicit override
|
|
|
|
# ─── Infrastructure ─────────────────────────────────────────────
|
|
infrastructure:
|
|
servers: []
|
|
# Example:
|
|
# - name: "production"
|
|
# ip: "10.0.0.1"
|
|
# role: "web-server"
|
|
# os: "debian"
|
|
# containers: ["nginx", "postgres", "redis"]
|
|
|
|
llm:
|
|
provider: "ollama" # ollama | openai | anthropic | openrouter | custom
|
|
endpoint: "http://localhost:11434"
|
|
default_model: "llama3.1"
|
|
models: []
|
|
# Example:
|
|
# - name: "llama3.1"
|
|
# purpose: "general"
|
|
# - name: "deepseek-coder"
|
|
# purpose: "coding"
|
|
|
|
tools:
|
|
# Toggle available tools — personas reference these
|
|
rss_aggregator: false # FreshRSS, Miniflux, etc.
|
|
rss_endpoint: ""
|
|
osint_tools: false # Maigret, theHarvester, etc.
|
|
osint_endpoint: ""
|
|
sdr_scanner: false # RTL-SDR, HackRF
|
|
pcap_analyzer: false # Wireshark/tshark
|
|
vulnerability_scanner: false # Nuclei, Nessus
|
|
exploit_framework: false # Metasploit
|
|
reverse_engineering: false # Ghidra, IDA
|
|
forensics_tools: false # Volatility, Autopsy
|
|
c2_framework: false # Cobalt Strike, Sliver
|
|
threat_intel_platform: false # MISP, OpenCTI
|
|
threat_intel_endpoint: ""
|
|
siem: false # Splunk, ELK
|
|
siem_endpoint: ""
|
|
docker: false
|
|
kubernetes: false
|
|
cloud_provider: "" # aws | gcp | azure | none
|
|
monitoring: false # Prometheus, Grafana
|
|
monitoring_endpoint: ""
|
|
vpn: false # WireGuard, OpenVPN
|
|
portainer: false
|
|
portainer_url: ""
|
|
portainer_api_key: ""
|
|
syncthing: false
|
|
git_server: "" # github.com | gitlab.com | self-hosted URL
|
|
|
|
# ─── Data Sources ────────────────────────────────────────────────
|
|
data_sources:
|
|
knowledge_base: ""
|
|
# Path to your notes/knowledge base (Obsidian, Logseq, etc.)
|
|
# Example: "/home/user/Obsidian"
|
|
|
|
book_library: ""
|
|
# Path to PDF/book collection
|
|
# Example: "/mnt/storage/Books"
|
|
|
|
foia_collection: false
|
|
foia_path: ""
|
|
foia_file_count: 0
|
|
|
|
intel_feeds: false
|
|
intel_feed_count: 0
|
|
intel_feed_categories: []
|
|
|
|
custom_databases: []
|
|
# Example:
|
|
# - name: "Iran Intelligence DB"
|
|
# path: "/data/iran"
|
|
# size: "80GB"
|
|
# description: "JSON feeds + structured analysis"
|
|
|
|
# ─── Analytical Frameworks ───────────────────────────────────────
|
|
frameworks:
|
|
# Which analytical frameworks to embed in personas
|
|
uap: false # Universal Analytical Protocol
|
|
ach: false # Analysis of Competing Hypotheses
|
|
ach_over_tot: false # ACH layered on Tree-of-Thought
|
|
pmesii_pt: false # Military analysis matrix
|
|
dime_fil: false # National power elements
|
|
ascope: false # Operational environment
|
|
mitre_attack: true # MITRE ATT&CK (default on for cyber)
|
|
kill_chain: true # Lockheed Martin Kill Chain
|
|
diamond_model: false # Diamond Model for CTI
|
|
disarm: false # Disinformation framework
|
|
owasp: true # OWASP Top 10
|
|
|
|
# Reporting standards
|
|
ic_confidence: false # IC confidence levels (High/Moderate/Low)
|
|
multi_source_verification: false # 3-source minimum rule
|
|
bluf_reporting: false # Bottom Line Up Front
|
|
output_modes: ["default"] # default | exec_summary | full_report | json | visual
|
|
|
|
# ─── Regional Focus ─────────────────────────────────────────────
|
|
regional_focus:
|
|
primary: [] # e.g., ["iran", "russia", "china"]
|
|
secondary: [] # e.g., ["turkey", "africa", "middle-east"]
|
|
# Personas like Frodo will emphasize these regions
|
|
|
|
# ─── Persona Customization ──────────────────────────────────────
|
|
persona_defaults:
|
|
language:
|
|
casual: "en"
|
|
technical: "en"
|
|
reports: "en"
|
|
|
|
# Hitap style — how personas address the user
|
|
# Options: formal | military | academic | casual | custom
|
|
address_style: "formal"
|
|
|
|
# Custom address overrides (optional)
|
|
# custom_addresses:
|
|
# neo: "Boss"
|
|
# frodo: "Director"
|
|
|
|
# ─── Active Projects (for personalized variants) ────────────────
|
|
projects: []
|
|
# Example:
|
|
# - name: "My Scanner"
|
|
# stack: "Python, FastAPI"
|
|
# description: "Automated vulnerability scanner"
|
|
# status: "production"
|
|
# - name: "Intel Platform"
|
|
# stack: "React, Node.js"
|
|
# description: "Threat intelligence dashboard"
|
|
# status: "development"
|
|
|
|
# ─── Professional Context ───────────────────────────────────────
|
|
professional:
|
|
company: ""
|
|
role: ""
|
|
certifications: [] # ["OSCP", "CEH", "CISSP"]
|
|
specializations: [] # ["web-security", "CTI", "IR"]
|
|
active_engagements: []
|
|
# Example:
|
|
# - name: "Client X Pentest"
|
|
# scope: "external + internal"
|
|
# domains: 50
|