Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
5ee9690
settings: choosing a model applies to every role, and the panel says …
lbx154 Sep 18, 2026
aa61d84
release: rebuild 0.1.7 manifest and bundles after the model picker fix
lbx154 Sep 18, 2026
110f1a0
settings: pick models from a list, fold the sidebar libraries, keep t…
lbx154 Sep 18, 2026
77d8856
release: rebuild 0.1.7 manifest and bundles after the settings simpli…
lbx154 Sep 18, 2026
428550b
ci: one job per push, lint then the suite in parallel
lbx154 Sep 18, 2026
0f3bc4d
test(web): isolate QueryClient providers in sidebar render fixtures
stormstarlight Sep 17, 2026
0429f66
fix(web): isolate session drafts and bind desktop notifications
stormstarlight Sep 17, 2026
f739bcd
fix(knowledge): accept Windows text newlines without changing byte id…
Sep 18, 2026
4c27508
test(desktop): retain upstream knowledge browser in session fixtures
Sep 18, 2026
5cadac6
feat(web): clarify read-only views and loaded session directory
Sep 18, 2026
8b25054
feat(web): display workspace diffs safely with original-text fallback
Sep 18, 2026
ef71366
test(desktop): cover read-only context and diff across themes and widths
Sep 18, 2026
b89aa14
fix(web): bound Windows workspace name to its final path segment
Sep 18, 2026
61b7ce5
fix(preview): bind review evidence and keep isolated single-instance …
Sep 18, 2026
87f20f9
feat(web): move resources above sessions and explain libraries in Chi…
Sep 18, 2026
1f8cafc
test(web): verify source-bound guides and top resource navigation
Sep 18, 2026
e876749
docs(preview): describe library navigation and use stage-neutral evid…
Sep 18, 2026
7abd143
chore(release): align Argus versions for Windows 0.1.8
stormstarlight Sep 18, 2026
5aaf91a
ci(windows): pin release inputs and guard Windows-only 0.1.8
stormstarlight Sep 18, 2026
9f2356e
build(release): regenerate reviewed Windows 0.1.8 frontend identity
stormstarlight Sep 18, 2026
413245b
fix(ci): include Hatchling editable hook in pinned Windows tools
stormstarlight Sep 18, 2026
a0f1aee
Merge pull request #140 from lbx154/release/windows-0.1.8-e-20260918
stormstarlight Sep 18, 2026
8947006
map: a phone shows the whole answer, and a card is named after its task
lbx154 Sep 18, 2026
6bb99b9
release: rebuild 0.1.8 manifest and bundles after the phone map fixes
lbx154 Sep 20, 2026
0959d5f
Merge pull request #142 from lbx154/fix/trial-findings-dev-20260920
Yushangjinghong2 Sep 20, 2026
2f589bc
map: connections read as a route, and zoom shows more instead of bigger
lbx154 Sep 20, 2026
11eba97
release: rebuild 0.1.8 manifest and bundles after the map redesign
lbx154 Sep 20, 2026
01f7603
map: ink on paper, and the course of each task
lbx154 Sep 20, 2026
78e690e
release: rebuild 0.1.8 manifest and bundles after the ink map
lbx154 Sep 20, 2026
59abae2
map: a small card says what its task is about before anything else
lbx154 Sep 20, 2026
c1644cc
release: rebuild 0.1.8 manifest and bundles after the overview card o…
lbx154 Sep 20, 2026
7c8289c
map: a line says what connects two tasks at the scale a map is read at
lbx154 Sep 20, 2026
1130fa1
release: rebuild 0.1.8 manifest and bundles after the overview line l…
lbx154 Sep 20, 2026
678db47
map: a zoom moves one picture, and a line says what it carries
lbx154 Sep 20, 2026
fcf9c7f
release: rebuild 0.1.8 manifest and bundles after the smooth zoom and…
lbx154 Sep 20, 2026
1579cf8
map: a finished project's map asks for its line notes too
lbx154 Sep 20, 2026
40a26f3
release: rebuild 0.1.8 manifest and bundles after line notes for fini…
lbx154 Sep 20, 2026
b70d200
map: a task reads as its stages again
lbx154 Sep 21, 2026
5258ad4
release: rebuild 0.1.8 manifest and bundles after the stage-based tas…
lbx154 Sep 21, 2026
a376c16
map: a card says what its task found, in the reader's language
lbx154 Sep 21, 2026
f293dba
release: rebuild 0.1.8 manifest and bundles after the map's card words
lbx154 Sep 21, 2026
4c0fe67
map: a stopped project can still be explained to the reader who opens it
lbx154 Sep 21, 2026
3da5716
release: rebuild 0.1.8 manifest and bundles after explanations for st…
lbx154 Sep 21, 2026
cd95aea
map: card words and line notes are sized for the reader's language
lbx154 Sep 21, 2026
801a4bf
release: rebuild 0.1.8 manifest and bundles after language-aware map …
lbx154 Sep 21, 2026
ef418ad
map: remove provenance shells and collect question context only on de…
lbx154 Sep 21, 2026
368e8c0
release: rebuild 0.1.8 after on-demand reader context cleanup
lbx154 Sep 21, 2026
3710ae7
fix: preserve map details and submit reviewer judgments through nativ…
lbx154 Sep 21, 2026
eb27c8f
web: segmented Auto/Task/Chat route control and fix preview collapse
lbx154 Sep 21, 2026
bc9e8fc
web: align sidebar entries, localize pairing and missing-project text…
lbx154 Sep 21, 2026
4ee8d20
math: a retired route may aim at a superseded claim version (#127)
lbx154 Sep 21, 2026
62da2e7
copilot: bind the provider session identity before spawn (#129)
lbx154 Sep 21, 2026
eec8861
accounting: fail closed on corrupt usage journals and failed finaliza…
lbx154 Sep 21, 2026
ae72a4d
tests: give the Windows installer preflight PowerShell probe a real t…
lbx154 Sep 21, 2026
f1f98a2
Merge pull request #143 from lbx154/feat/map-design-20260920
Yushangjinghong2 Sep 21, 2026
2da5c9b
Merge remote-tracking branch 'lbx154/dev' into HEAD
lbx154 Sep 21, 2026
14a87fe
Reconcile main's runtime-recovery commits with dev
lbx154 Sep 21, 2026
1d0e501
web: render main's runtime-incident events through the feed fallback
lbx154 Sep 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"name": "argus",
"source": "./plugins/argus",
"description": "Persistent reviewed research and engineering runtime",
"version": "0.1.7",
"version": "0.1.8",
"category": "Productivity"
}
]
Expand Down
38 changes: 36 additions & 2 deletions .github/workflows/extended.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
name: extended checks

# On-demand only. These jobs were the second, third and fourth jobs of
# tests.yml until 2026-09-14; the per-push signal is now the single Linux
# full-suite job there. Run this workflow by hand before a release or when a
# tests.yml until 2026-09-14, and the mypy type gate was its second step
# until 2026-09-18; the per-push signal is now lint + tests in one Linux job. Run this workflow by hand before a release or when a
# change touches the chat bridges, the pairing/QR path, the cockpits or the
# Tauri desktop host.
#
Expand All @@ -25,6 +25,11 @@ name: extended checks

on:
workflow_dispatch:
inputs:
typecheck_base:
description: Git revision the type gate compares against
default: origin/main
required: false

concurrency:
group: extended-${{ github.ref }}
Expand Down Expand Up @@ -128,6 +133,35 @@ env:
tests/test_engineer_sandbox.py

jobs:
typecheck:
name: linux · Python type gate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: pip
- name: Install
run: |
python -m pip install --upgrade pip
python -m pip install -e '.[dev,qr,trial]'
- name: Reject new Python type diagnostics
env:
TYPECHECK_BASE: ${{ inputs.typecheck_base || 'origin/main' }}
run: >-
python -m argus.release_tools.typecheck_gate
--base "$TYPECHECK_BASE" --output-dir "$RUNNER_TEMP/typecheck"
- name: Preserve Python type diagnostics
if: always()
uses: actions/upload-artifact@v4
with:
name: python-typecheck
path: ${{ runner.temp }}/typecheck
if-no-files-found: ignore

portable:
name: ${{ matrix.os }} · portable surface
runs-on: ${{ matrix.os }}
Expand Down
53 changes: 44 additions & 9 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,16 @@ name: release
# Release version changes are operator-controlled. Do not bump package versions
# for a bug fix unless the operator explicitly authorizes that release change.
# v0.1.2 through v0.1.6 were operator-authorized desktop releases.
# v0.1.7 is a Windows-only release: build it with workflow_dispatch and an
# explicit windows-x86_64 target, verify its artifacts, then publish them.
# Excluding its tag prevents a second all-platform/PyPI publication.
# v0.1.7 and v0.1.8 are Windows-only releases: build with workflow_dispatch
# and an explicit windows-x86_64 target, verify the artifacts, then publish.
# Excluding these tags prevents a second all-platform publication.

on:
push:
tags:
- "v*"
- "!v0.1.7"
- "!v0.1.8"
workflow_dispatch:
inputs:
platform:
Expand Down Expand Up @@ -104,7 +105,7 @@ jobs:
strategy:
fail-fast: false
matrix:
include: ${{ fromJSON(inputs.platform == 'windows-x86_64' && '[{"os":"windows-latest","platform":"windows-x86_64"}]' || inputs.platform == 'darwin-aarch64' && '[{"os":"macos-15","platform":"darwin-aarch64"}]' || inputs.platform == 'darwin-x86_64' && '[{"os":"macos-15-intel","platform":"darwin-x86_64"}]' || inputs.platform == 'linux-x86_64' && '[{"os":"ubuntu-22.04","platform":"linux-x86_64"}]' || '[{"os":"windows-latest","platform":"windows-x86_64"},{"os":"macos-15","platform":"darwin-aarch64"},{"os":"macos-15-intel","platform":"darwin-x86_64"},{"os":"ubuntu-22.04","platform":"linux-x86_64"}]') }}
include: ${{ fromJSON(inputs.platform == 'windows-x86_64' && '[{"os":"windows-2022","platform":"windows-x86_64"}]' || inputs.platform == 'darwin-aarch64' && '[{"os":"macos-15","platform":"darwin-aarch64"}]' || inputs.platform == 'darwin-x86_64' && '[{"os":"macos-15-intel","platform":"darwin-x86_64"}]' || inputs.platform == 'linux-x86_64' && '[{"os":"ubuntu-22.04","platform":"linux-x86_64"}]' || '[{"os":"windows-2022","platform":"windows-x86_64"},{"os":"macos-15","platform":"darwin-aarch64"},{"os":"macos-15-intel","platform":"darwin-x86_64"},{"os":"ubuntu-22.04","platform":"linux-x86_64"}]') }}
runs-on: ${{ matrix.os }}
defaults:
run:
Expand All @@ -113,18 +114,28 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22.12.0'
node-version: ${{ runner.os == 'Windows' && '24.19.0' || '22.12.0' }}
cache: npm
cache-dependency-path: |
frontend/web/package-lock.json
frontend/tui/package-lock.json
desktop-tauri/package-lock.json
- uses: actions/setup-python@v5
with:
python-version: '3.12'
python-version: ${{ runner.os == 'Windows' && '3.11.9' || '3.12' }}
cache: pip
cache-dependency-path: pyproject.toml
cache-dependency-path: |
pyproject.toml
uv.lock
desktop-tauri/scripts/windows-build-requirements.txt
- uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ runner.os == 'Windows' && '1.98.0-x86_64-pc-windows-msvc' || 'stable' }}
- uses: astral-sh/setup-uv@v5
if: runner.os == 'Windows'
with:
version: '0.12.16'
enable-cache: false
# The Tauri shell pulls in several hundred crates; compiling them cold is
# the single longest step on every platform (10 min on the Intel Mac
# runner). Keep the compiled dependencies between runs. Only main saves,
Expand All @@ -139,9 +150,23 @@ jobs:
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev build-essential libxdo-dev libssl-dev librsvg2-dev libayatana-appindicator3-dev patchelf xvfb xauth dbus-x11 libfuse2
- name: Install build dependencies
- name: Install frozen Windows build dependencies
if: runner.os == 'Windows'
env:
UV_PYTHON_DOWNLOADS: never
run: |
uv sync --frozen --extra dev --extra trial --no-install-project --python 3.11.9
uv pip install --python .venv/Scripts/python.exe --no-deps -r desktop-tauri/scripts/windows-build-requirements.txt
uv pip install --python .venv/Scripts/python.exe --no-deps --no-build-isolation --editable .
uv pip check --python .venv/Scripts/python.exe
echo "$GITHUB_WORKSPACE/.venv/Scripts" >> "$GITHUB_PATH"
echo 'RUSTUP_TOOLCHAIN=1.98.0-x86_64-pc-windows-msvc' >> "$GITHUB_ENV"
cargo fetch --locked --manifest-path desktop-tauri/src-tauri/Cargo.toml --target x86_64-pc-windows-msvc
- name: Install non-Windows Python build dependencies
if: runner.os != 'Windows'
run: python -m pip install -e ".[trial]" "pyinstaller>=6.11,<7" tzdata
- name: Install frontend build dependencies
run: |
python -m pip install -e ".[trial]" "pyinstaller>=6.11,<7" tzdata
npm --prefix frontend/web ci
npm --prefix frontend/tui ci
npm --prefix desktop-tauri ci
Expand All @@ -166,6 +191,16 @@ jobs:
if: runner.os == 'Windows'
shell: pwsh
run: ./desktop-tauri/scripts/stage-release.ps1
- name: Verify reviewed Windows source and artifacts
if: runner.os == 'Windows'
run: |
python -m argus.release_tools.generate_manifest --check
python -m argus.release_tools.check_artifacts
git diff --exit-code HEAD
if [ -n "$(git ls-files --others --exclude-standard -- argus frontend)" ]; then
echo 'Unreviewed generated inputs remain; refusing to upload a release candidate.'
exit 1
fi
- name: Stage Mac installer and updater
if: runner.os == 'macOS'
run: python desktop-tauri/scripts/stage-macos-release.py
Expand Down
36 changes: 9 additions & 27 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
name: tests

# One check on every push and pull request: the Linux full suite (ruff, the
# mypy type gate against the change's base, then the whole pytest suite).
# Linux is the development platform and this job is the one that decides
# whether a change is green.
# One check on every push and pull request: lint, then the whole pytest suite
# in parallel on Linux. Linux is the development platform and this job is the
# one that decides whether a change is green.
#
# The platform-portability, frontend and Windows desktop-package checks that
# used to run alongside it are kept verbatim in extended.yml and run only on
# demand (workflow_dispatch) -- before a release, or when a change touches the
# chat bridges, the pairing/QR path, the cockpits or the Tauri host. They were
# moved out to keep the per-push signal to a single job and to stop paying
# macOS/Windows runner minutes on every commit.
# Everything else -- the mypy type gate, the platform-portability, frontend
# and Windows desktop-package checks -- lives in extended.yml and runs only on
# demand (workflow_dispatch): before a release, or when a change touches the
# chat bridges, the pairing/QR path, the cockpits or the Tauri host.

on:
push:
Expand All @@ -24,12 +21,10 @@ concurrency:

jobs:
linux:
name: linux · full suite
name: linux · lint + tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version: '3.11'
Expand All @@ -44,18 +39,5 @@ jobs:
python -m pip install -e '.[dev,qr,trial]'
- name: Lint
run: python -m ruff check argus argus_skill tests
- name: Reject new Python type diagnostics
env:
TYPECHECK_BASE: ${{ github.event.pull_request.base.sha || github.event.before }}
run: >-
python -m argus.release_tools.typecheck_gate
--base "$TYPECHECK_BASE" --output-dir "$RUNNER_TEMP/typecheck"
- name: Preserve Python type diagnostics
if: always()
uses: actions/upload-artifact@v4
with:
name: python-typecheck
path: ${{ runner.temp }}/typecheck
if-no-files-found: ignore
- name: Test
run: python -m pytest -q
run: python -m pytest -q -n auto
8 changes: 8 additions & 0 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,14 @@ argus --web

首选地址:[http://127.0.0.1:8799](http://127.0.0.1:8799);被占用时会自动顺延。

研究地图区分任务历史与项目交付:审查器故障显示为“当次审查异常”,不代表科学否决。
后续最终审稿通过后,地图提供审稿任务与项目成果入口,保留旧异常记录,不把旧任务改成成功。
已通过审阅的中间任务仍计为完成,不因当时项目尚未结束而降为未完成。
地图卡片的标题、摘要、状态和阶段信息使用固定排版,随画布一起缩放,不再按缩放比例自动折叠或替换文字;任务展开和历史切换仍保留。

Reviewer 通过原生工具动作提交通过、返修、等待、操作员决策或计划调整,审稿正文自由表达,不解析 `STATUS`、JSON 或关键词,也不额外调用模型转译。
等待后台实验不等于审查失败;最终论文仍须达到所选会议的验收标准。工具动作通道支持 Pi、Copilot、Codex 和 Claude/Qoder;不支持的后端明确报错,不回退到文本解析。

```bash
argus --web --web-port 8800 # 使用其他端口
```
Expand Down
2 changes: 1 addition & 1 deletion argus/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
"SkillStore",
]

__version__ = "0.1.7"
__version__ = "0.1.8"

_LAZY_LOOP_NAMES = frozenset({"SkillLoop", "SkillLoopConfig"})
_LAZY_SKILL_NAMES = frozenset({"Skill", "SkillStore"})
Expand Down
6 changes: 4 additions & 2 deletions argus/adapters/agent_cli_backend/_budget_monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,10 @@ def check(self) -> str | None:
self._roll_day()
observed, tokens = self.pi_cost, self.pi_tokens
cursor = getattr(self.ctx, "copilot_usage_cursor", None)
if self.ctx.backend._is_copilot and cursor is not None and self.session_id:
usage = read_copilot_usage_since(cursor, session_id=self.session_id, timeout=0)
# A new session bound before spawn is readable before any event.
session_id = self.session_id or getattr(self.ctx, "provider_session_id", None)
if self.ctx.backend._is_copilot and cursor is not None and session_id:
usage = read_copilot_usage_since(cursor, session_id=session_id, timeout=0)
if usage is not None:
today = datetime.fromtimestamp(_local_day_start(time.time()), UTC)
for row in usage.rows:
Expand Down
7 changes: 7 additions & 0 deletions argus/adapters/agent_cli_backend/_exec_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,10 @@ class _ExecContext:
event_permit: Any = field(default=None)
copilot_token_billing_expected: bool = False
copilot_usage_cursor: Any = None
# Provider-session identity Argus allocated for a NEW Copilot session and
# bound to this call before spawn; ``None`` for resumed calls, non-Copilot
# backends, the warm ACP path, or a CLI without ``--session-id``.
provider_session_id: str | None = None
# The CLI named a different session than the one this call was bound to.
# Usage lookups and the persisted record must not fall back to any identity.
session_identity_conflict: str | None = None
5 changes: 4 additions & 1 deletion argus/adapters/agent_cli_backend/_exec_finalize.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,10 @@ def finalize_result(
result.call_id = ctx.call_id
result.call_id_log_correlated = True
result.stop_kind = normalize_stop_kind(result.stop_kind)
result.thread_id = result.thread_id or ctx.resume_thread_id
if ctx.session_identity_conflict:
result.thread_id = None
else:
result.thread_id = result.thread_id or ctx.resume_thread_id
result.started_at = ctx.started_at
result.completed_at = completed_at
result.duration_ms = max(
Expand Down
Loading
Loading