neilofneils404/opnsrcintel
GitHub: neilofneils404/opnsrcintel
一个纯本地运行的美国焦点开源情报分析工作台,整合 RSS、市场数据和社交媒体内容,通过双重 LLM 对比分析生成态势评估和动态叙述。
Stars: 1 | Forks: 0
# 开源情报
本地的、个人的**专注于美国的开源情报工作台** —— 终端优先 (TUI/CLI)。
将 RSS、市场快照和手动捕获的 X/社交媒体帖子整合为带评分的态势图:哪些因素可能对美国行动施加压力、市场正在消化哪些预期,以及您正在追踪的内容。
所有数据都保留在此笔记本电脑上 (`data/opnsrcintel.db`)。无云端部署。
## 技术栈
- **交互式 TUI:** Textual (`osi` / `osi tui` / `osi board`)
- **CLI / 静态看板:** Typer + Rich (`osi board --static`, 脚本, cron)
- **存储:** SQLite
- **数据采集:** RSS 订阅源, yfinance 市场, 手动粘贴 (无 API 的 X)
- **LLM:** 双重对比分析 —— 主力 xAI Grok + 辅助 OpenAI(首选 OAuth)
- **定时任务:** macOS `launchd` 作业(可选)+ 来自 TUI 的**按需全量种子获取** (**R**)
## 认证 (OAuth —— 无需 API 密钥)
与 Codex / Grok CLI 使用相同的浏览器登录:
| 提供商 | 登录 | 读取 token 路径 |
|----------|--------|------------------|
| **xAI / Grok** | `osi auth login xai` 或 `grok login` | `~/.grok/auth.json` |
| **OpenAI / ChatGPT** | `osi auth login openai` 或 `codex login` | `~/.codex/auth.json` |
```
osi auth status
osi auth test --provider xai
osi auth test --provider openai
```
- **API 密钥为可选项。** 如果设置了 `OPENAI_API_KEY` / `XAI_API_KEY`,它们将优先使用。
- token 在临近过期时会**自动刷新**;如果刷新失败,请重新登录。
- 默认主力提供商为 **`xai`**;双重分析的辅助提供商为 **`openai`**。可通过设置/环境变量覆盖 (`OSI_LLM_PROVIDER`, `OSI_LLM_SECONDARY`, `OSI_DUAL_PASS`)。
## 快速开始
```
git clone https://github.com/neilofneils404/opnsrcintel.git
cd opnsrcintel
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
# 可选:将 `osi` 添加到你的 PATH(任意终端)
./scripts/install_path.sh
osi auth status # confirm OAuth sessions (your machine only)
osi init
osi seed --no-analyze # RSS + markets (no LLM)
osi # interactive desk
```
运行 `install_path.sh` 后,您可以在任何目录下运行 **`osi`** —— 无需 `source .venv`。
如果新打开的 shell 仍然提示 `command not found`,请新开一个标签页或运行 `hash -r`。
在 OAuth 生效后:
```
osi seed --expand --narrative # full pipeline (or press R inside the TUI)
osi brief -g # dual briefs (comparison first)
osi narrative # dual narrative + living storylines
osi
```
### 仓库中*不*包含的内容(设计使然)
| 仅限本地(严禁发布) | 原因 |
|----------------------------|-----|
| `data/opnsrcintel.db` | 您的情报语料库 |
| `data/exports/`, `data/logs/` | 简报、叙述、作业日志 |
| `.env` | 可选的 API 密钥 |
| `~/.grok/auth.json`, `~/.codex/auth.json` | *您*机器上的 OAuth token |
| `config/settings.yaml` | 本地覆盖配置(仅提交 `settings.example.yaml`) |
克隆此仓库的人将获得 **应用程序 + 示例配置**,而不是您的工作台历史记录或登录信息。
## 交互式工作台(默认)
```
osi # launch interactive TUI
osi tui # same
osi board # same (use --static for one-shot print)
```
主题:炭灰色背景上的迷彩 / 军用橄榄绿。选中行使用明亮的野战绿高亮显示。市场 ±% 显示为橄榄绿(上涨)/ 铁锈红(下跌)。
### 看板按键
| 按键 | 操作 |
|-----|--------|
| ↑↓ / 鼠标 | 移动选择 |
| **Enter** | 打开条目或故事线 |
| **Tab** | 在焦点压力 ↔ 故事线之间切换 |
| **R** | **交互式工作台种子获取**(≤12 个新增双重分析 + 扩展 + 一篇双重叙述) |
| **b** | 仅从数据库重载看板(无网络请求) |
| **B** | 最新双重简报对(优先显示对比) |
| **N** | 最新双重叙述对(优先显示对比) |
| **/** | 搜索 |
| **a** | 警报 |
| **n** | Delta 脉冲 |
| **d** | Doctor |
| **r** | Recipes |
| **?** | 帮助 |
| **Esc** | 返回 |
| **q** | 退出(在看板界面) |
### 条目按键(在某行按 Enter 之后)
| 按键 | 操作 |
|-----|--------|
| **a** | 双重分析 |
| **e** | 扩展全文(+ 重新分析) |
| **l** | 关联至故事线 |
| **o** | 在浏览器中打开 URL |
| **r** | 重新加载条目 |
| **Esc** | 返回看板 |
### 按需工作台种子获取 (**R**)
TUI 内部的交互式刷新(特意比早晨 cron 任务更轻量):
`seed --expand --narrative --analyze-limit 12 --expand-limit 6`
- 仅限**新**的高信号条目(绝不重新分析整个语料库)
- 双重分析批次上限为 **12**(进度显示为 `3/12 · item #…`)
- 在最后进行**一次**双重**叙述**(而非针对每个条目)
- **Esc** 或 **c** 取消(完成当前 LLM 调用,保留部分工作)
- 稳态通常只需几分钟;首次处理积压数据时间较长
早晨 cron 仍负责执行繁重的无人值守批处理(`analyze-limit 50`)。Shell 命令:
```
osi seed --expand --narrative --analyze-limit 12 # like TUI R
osi seed --expand --narrative --analyze-limit 50 # morning-style
```
## 帮助(随时可用)
```
osi help # full catalog + use cases (preferred)
osi help recipes # morning / deep-dive playbooks
osi h # short alias
osi help board # flags + when-to-use + examples
osi help tui
osi help seed
osi doctor # health: auth, DB, cron, freshness
osi help --check # catalog drift check (must stay green)
```
## 双重 LLM 分析(对比)
| 角色 | 默认配置 | 目的 |
|------|---------|---------|
| 主力 | xAI / `grok-3-mini` | 看板上的规范分析 |
| 辅助 | OpenAI / `gpt-5.5` | 启用双重分析时的第二意见 |
评分**不会合并**。您将获得并排展示的结果以及元**对比**(在 UI 和导出文件中优先显示)。可通过设置中的 `dual_pass_analyze` 或在分析/简报/叙述时使用 `--dual` / `--single` 进行切换。
```
osi analyze -i 543 --dual --force
osi brief -g --dual
osi narrative --dual
osi export brief
osi export narrative
```
## 日常指令
| 命令 | 用途 |
|---------|---------|
| `osi` / `osi tui` | 交互式工作台 |
| `osi board --static` | 一次性 Rich 看板 |
| `osi item ` | 检查条目 |
| `osi item -e` | 扩展全文 + 重新分析 |
| `osi item -a --dual` | 双重 LLM 分析 |
| `osi expand` | 扩展热门的高相关性美国文章 |
| `osi cluster` | 重建 / 列出同故事集群 |
| `osi narrative` | 动态故事线 + 双重叙述 |
| `osi brief -g` | 双重摘要简报 |
| `osi export brief\|narrative\|storyline` | `data/exports/` 下的 Markdown 文件 |
| `osi storylines` / `--id N` | 持久化论点 + 证据链接 |
| `pbpaste \| osi add -` | 从剪贴板粘贴 X / 社交媒体内容 |
| `pbpaste \| osi thread` | 多帖文主题粘贴 |
| `osi note "assessment…"` | 分析师笔记 |
| `osi alerts` | 应用内警报 |
| `osi markets` / `osi markets -r` | 市场快照 (yfinance) |
| `osi seed --expand --narrative` | 全量情报种子获取 |
| `osi status` / `osi doctor` | 统计数量 / 健康状况 |
| `osi auth status` | OAuth 状态 |
### 粘贴 X 帖子(无 API)
```
# 在浏览器中复制帖子,然后:
pbpaste | osi add -
# 多帖线程:
pbpaste | osi thread
# 或者使用 flags:
osi add -t "First line" -b "Full text…" -u "https://x.com/…/status/…" -x Handle
```
### 深度分析 → 关联网络 → 动态叙述
```
osi expand --limit 12
osi cluster
osi narrative # dual narrative + storyline upsert
osi storylines --id 1
osi storylines --attach
osi dossier iran
osi search "hormuz OR oil"
osi export narrative
osi
```
## 配置
| 文件 | 作用 |
|------|------|
| `config/sources.yaml` | RSS 订阅源 |
| `config/watchlist.yaml` | 主题、股票代码、X 账号、悬而未决的问题 |
| `config/settings.example.yaml` | 复制为 -> `settings.yaml` 用于本地覆盖配置(双重分析、模型、阈值) |
| `.env` | 可选的 API 密钥 |
## 数据刷新
### launchd 定时任务(可选)
```
chmod +x scripts/install_cron.sh scripts/uninstall_cron.sh
./scripts/install_cron.sh
```
| 作业 | 时间 (本地) | 操作 |
|-----|----------------|--------|
| 早晨 | 07:15 | 全量种子获取 + 扩展 + 双重叙述 |
| 中午 | 12:30 | 仅 RSS + 市场(无 LLM) |
| 傍晚 | 18:45 | 种子获取 + 扩展(无叙述) |
日志位于:`data/logs/`。卸载请执行:`./scripts/uninstall_cron.sh`。
### 按需执行
| 方式 | 内容 |
|-----|------|
| TUI **R** | 相当于早晨的全量种子获取 + 进度 UI |
| `osi seed --expand --narrative` | 在 shell 中执行相同的操作 |
| `osi seed --no-analyze` | 仅获取标题 + 市场 |
| TUI **b** | 从数据库重绘看板(不拉取数据) |
除非您手动触发,否则在这些时间窗口之间不会有任何程序持续运行。
## 市场 (yfinance)
- 通过 **yfinance** 获取观察列表股票代码的快照(非官方的 Yahoo Finance 路径)。
- 在执行种子获取 / `osi markets -r` 时更新 —— **并非**实时交易数据流。
- 日涨跌幅 % 参考前一交易日收盘价(如有需要会使用历史数据作为回退)。
- 适用于判断方向性的 OSINT 背景(如原油上涨、VIX 指数飙升);**不适用**于精确的交易价位。
- 可在 `config/watchlist.yaml` 中编辑股票代码。
## 排名 / 情报层级工作原理
1. **SIG** —— 观察列表/关键词预评分(无 LLM)。
2. **US score** —— 针对高 SIG 项进行双重 LLM 利益评估(以主力分析为基准)。
3. **Expand** —— 针对高 US score 项获取全文(超越标题层面)。
4. **Cluster** —— 通过实体 + 标题重合度构建的同源新闻组。
5. **Storylines** —— 包含支持 / 削弱 / 分支链接的持久化论点。
6. **Narrative / brief** —— 具有多线程双重分析结果,优先显示对比内容。
## 设计说明
- **美国视角:** LLM 会对每个条目的美国利益 / 行动空间 / 时间跨度进行评分。
- **X 依赖手工:** Premium+ 订阅有助于*您*进行人工策展;工作台只会存储和评分您捕获的内容(不使用 X API)。
- **警报仅在应用内显示**(如高 US score、市场异动、论点被削弱、双重分析分歧等)。
- **对比式双重分析:** 提供两种观点 + 元对比分析;绝不生成单一混合的评分。
- **纯本地:** SQLite + 可选的 launchd;无云服务。
### 操作员控制(核心理念)
用户应**始终感觉尽在掌握**并能**看清工作台的运行状态**:
- 耗时任务会显示**阶段 + 进度计数**(`3/12 · item #…`),而不是无声的加载动画
- 耗时数分钟的任务**可随时取消**(在工作台获取种子时按 Esc/c);已完成的部分工作会被保留
- 交互式 **R** 使用的**批次规模更小**,与无人值守的早晨 cron 不同
- 数据的陈旧程度**清晰可见**(如存在时长、种子获取横幅、`osi doctor`)
- 帮助文档记录了所有可操控项(`osi help tui`、recipes)
这是产品体验的核心质量,而非可选的附加打磨。请参阅 `AGENTS.md` → *Operator always feels in control*。
## 隐私
- 纯本地 SQLite
- 如使用 API 密钥,则存放在 `.env` 文件中(已被 gitignore 忽略)
- 当您进行分析时,LLM 调用会将条目文本发送至 OpenAI/xAI —— 因此请谨慎对待敏感信息的粘贴操作
标签:DFIR, LLM整合, Python, SQLite, TUI, 代码示例, 数据分析, 无后门, 逆向工具