Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
f3b69f9
Connect a browser presentation adapter to existing editing services
dhsohn Sep 28, 2026
d3957ef
Connect dotted bonds and validate browser edit requests
dhsohn Sep 28, 2026
368c302
Match context option selection to the desktop white boxes
dhsohn Sep 28, 2026
070d821
Use native picking and endpoint snapping for browser bond gestures
dhsohn Sep 28, 2026
c7b05f4
Connect ring placement and wider bond picking to shared native rules
dhsohn Sep 28, 2026
33846df
Recover browser state after response loss and trim history storage
dhsohn Sep 28, 2026
a0b58fd
Reuse native atom label layout in the browser adapter
dhsohn Sep 28, 2026
bba7a9a
Align browser wheel navigation with desktop controls
dhsohn Sep 28, 2026
88a73e0
Cache native label layouts and match resolved font pixels
dhsohn Sep 28, 2026
9dc846c
Connect native hovered bond shortcuts in the browser
dhsohn Sep 28, 2026
fbcf389
Verify browser font parity with the Windows desktop engine
dhsohn Sep 28, 2026
b177389
Connect native atom growth and ring fusion shortcuts in the browser
dhsohn Sep 28, 2026
e727e4b
Connect native atom prompts and hover deletion to browser keys
dhsohn Sep 28, 2026
408207a
Share native sheet boundaries with browser editing
dhsohn Sep 28, 2026
79169a4
Separate native glyph clipping math from Qt path adapters
dhsohn Sep 28, 2026
ec71b7e
Connect browser glyph ink to native bond clipping
dhsohn Sep 28, 2026
6333f39
Connect native atom target priority and label hit shapes
dhsohn Sep 28, 2026
03b2648
Reuse session font measurements in browser rendering
dhsohn Sep 28, 2026
a7c0d84
Connect native label hit shapes to browser hover keys
dhsohn Sep 28, 2026
808a832
Constrain browser glyph sampling to actual ink bounds
dhsohn Sep 28, 2026
c9bda64
Preserve keyboard activation of focused browser controls
dhsohn Sep 28, 2026
7adbfb1
Share native arrow paths with browser rendering
dhsohn Sep 28, 2026
88d2477
Keep canvas focus when pointer-selecting toolbar controls
dhsohn Sep 28, 2026
9c594bf
Preserve canvas shortcuts after menu pointer actions
dhsohn Sep 28, 2026
c380371
Connect browser arrow movement and deletion to native services
dhsohn Sep 28, 2026
47c0122
Connect browser arrow gestures to native snapping and controls
dhsohn Sep 28, 2026
744be35
Resolve browser selection and eraser structure hits on the server
dhsohn Sep 28, 2026
5ca5035
Preserve arrow snapping after Fit and share record construction
dhsohn Sep 28, 2026
a9f04b0
Connect native screen-space arrow picking to browser selection and er…
dhsohn Sep 28, 2026
26189ae
Connect native line drawing rules and controls to the browser
dhsohn Sep 28, 2026
c2001d6
Connect native arrow presets and style sliders to browser
dhsohn Sep 28, 2026
9a13b38
Preserve native fuzzy endpoint avoidance in shared drawing
dhsohn Sep 28, 2026
865b527
Connect native arrow endpoint and curve handles in browser
dhsohn Sep 28, 2026
ea95995
Connect native arrow label layout and editing in browser
dhsohn Sep 28, 2026
fef36d2
Connect native decorative shapes to browser adapter
dhsohn Sep 28, 2026
b8f2d54
Connect native shape resize handles in browser
dhsohn Sep 28, 2026
c92ac53
Connect native shape stacking and browser scene depth
dhsohn Sep 28, 2026
92c8704
Connect native color palette and shape fill in browser
dhsohn Sep 28, 2026
6c08836
Connect native ring fill and interior picking in browser
dhsohn Sep 28, 2026
b56321d
Connect browser area selection to rendered item shapes
dhsohn Sep 28, 2026
f161442
Handle unavailable browser area-selection APIs
dhsohn Sep 28, 2026
fc7c920
Connect native arrow selection dimensions to browser outlines
dhsohn Sep 28, 2026
a4fa09d
Connect native molecular selection contours to browser presentation
dhsohn Sep 28, 2026
ba869ec
Connect shape selection outlines and correct borderless fill unions
dhsohn Sep 28, 2026
7981e92
Use native label layout bounds for browser selection
dhsohn Sep 28, 2026
0deceef
Connect native numeric selection rotation in the browser
dhsohn Sep 28, 2026
59dc75f
Measure document line height before browser box rounding
dhsohn Sep 28, 2026
58e0744
Connect native selection frames and drag rotation to browser
dhsohn Sep 29, 2026
c6c3123
Connect native selection flips to browser controls
dhsohn Sep 29, 2026
df49df1
Connect native alignment and distribution to browser
dhsohn Sep 29, 2026
7028d2e
Connect native canvas size settings to browser
dhsohn Sep 29, 2026
9429488
Connect native grid geometry and snapping to browser
dhsohn Sep 29, 2026
80e1929
Render imported charge and radical marks through shared geometry
dhsohn Sep 29, 2026
5fee69a
Connect native mark editing ports and browser selection
dhsohn Sep 29, 2026
45b4ea9
Connect browser mark creation and explicit atom reassignment
dhsohn Sep 29, 2026
542bcaa
Connect charge shortcuts and preserve native mark binding order
dhsohn Sep 29, 2026
46afb78
Connect mark owner guides and restore charge order on undo
dhsohn Sep 29, 2026
c6ece47
Separate mark clearance bounds from glyph collision ink
dhsohn Sep 29, 2026
1aca264
Connect native mark hover placement and preview styling
dhsohn Sep 29, 2026
bdb1824
Preserve repeated charge keys through browser edit requests
dhsohn Sep 29, 2026
d98c03d
Connect browser scrolling to native sheet and content bounds
dhsohn Sep 29, 2026
c0ffe21
Connect browser orbital editing to native geometry and history
dhsohn Sep 29, 2026
6677d8a
Remove leftover native helpers and restore moved comments
dhsohn Sep 29, 2026
dfe928d
Remove duplicated checks and blocks from the browser adapter
dhsohn Sep 29, 2026
dd18f35
Remove duplicated browser input code
dhsohn Sep 29, 2026
c4bb721
Connect browser bracket editing to native geometry
dhsohn Sep 29, 2026
9aff490
Show mark ownership guidance only with the owner guide
dhsohn Sep 29, 2026
7faa169
Import bracket helpers through the annotations package
dhsohn Sep 29, 2026
cd80fae
Close idle browser sessions at the session limit
dhsohn Sep 29, 2026
d91436e
Connect text notes to the browser adapter
dhsohn Sep 29, 2026
bbedfb3
Keep inward ring double bonds inside their benzene ring
dhsohn Sep 29, 2026
3c1fe09
Show every bond style and the double-bond position menu in the browser
dhsohn Sep 29, 2026
fec8553
Edit text notes in place with the browser Text tool
dhsohn Sep 29, 2026
7ff1f5d
Share the desktop's context bar declarations with the browser
dhsohn Sep 29, 2026
d3e4413
Connect the desktop Text page to browser notes
dhsohn Sep 29, 2026
686ed2e
Recolor text notes with the browser Color tool
dhsohn Sep 29, 2026
0db58af
Take browser status, title and tool defaults from the desktop
dhsohn Sep 29, 2026
4973096
Share view, field and hover rules between the adapters
dhsohn Sep 29, 2026
d01015f
Connect the desktop ring templates to the browser Ring tool
dhsohn Sep 29, 2026
17e936f
Share the desktop's view and selection keys with the browser
dhsohn Sep 29, 2026
4703ecd
Toggle objects with Control-click in the browser, as on the desktop
dhsohn Sep 29, 2026
2a4c355
Share context bar page captions with the browser
dhsohn Sep 29, 2026
9737732
Keep calculation plans editable in the browser
dhsohn Sep 29, 2026
dc48cdb
Edit documents whose annotations differ from their marks
dhsohn Sep 29, 2026
a522bf0
Match the desktop's arrow sliders and label preview in the browser
dhsohn Sep 29, 2026
92d5ffb
Continue drawing settings into a new browser canvas
dhsohn Sep 29, 2026
99b743c
Move perspective helpers into the Qt-free document domain
dhsohn Sep 29, 2026
962437e
Edit perspective documents in the browser
dhsohn Sep 29, 2026
81a01ac
Share group rules between the desktop and the browser
dhsohn Sep 29, 2026
ca594b9
Edit grouped documents in the browser
dhsohn Sep 29, 2026
82c6407
Share image transform and selection rules
dhsohn Sep 29, 2026
f7c8f7d
Edit documents with images in the browser
dhsohn Sep 29, 2026
1c8b40f
Share image placement and the Image Properties spec
dhsohn Sep 29, 2026
ae31e65
Insert images and edit image properties in the browser
dhsohn Sep 29, 2026
572b615
Note browser perspective, group and image editing in the changelog
dhsohn Sep 29, 2026
cf1ea18
Connect browser SMILES insertion to the Qt-free commit path
dhsohn Sep 30, 2026
657efd8
Fix browser note caret formatting and transient edit history
dhsohn Sep 30, 2026
994b7e5
Connect browser MOL export with safe note recovery
dhsohn Oct 1, 2026
46d8321
Connect browser valence checking with bounded previews
dhsohn Oct 1, 2026
47b9999
Preserve pending notes when saving copies or leaving documents
dhsohn Oct 1, 2026
59cb15f
Connect native drawing snap markers across browser zoom
dhsohn Oct 1, 2026
95041bc
Reject obsolete-scale Line and Arrow preview replies
dhsohn Oct 1, 2026
be1e138
Add single SVG export to web preview
dhsohn Oct 2, 2026
166eb7b
Deliver deferred window deletions during routing test cleanup
dhsohn Oct 2, 2026
fb26ab5
Keep moved connections aligned with the browser view
dhsohn Oct 2, 2026
190b110
test: cover JSON input boundaries and session recovery
dhsohn Oct 3, 2026
b54eb12
feat: add CDXML export and standalone contract validation
dhsohn Oct 3, 2026
03b8148
Merge current main into feature/web-preview
dhsohn Oct 3, 2026
1e1df77
Add browser chemistry clipboard and persistent draft recovery
dhsohn Oct 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# Historical documents are byte fixtures; checkout must preserve their hashes.
tests/fixtures/document-v7/*.chemvas -text
tests/fixtures/document-v8/*.chemvas -text

# Contract snapshot assets are pinned to exact upstream bytes; line-ending
# conversion would invalidate the SHA-256 provenance digests.
contracts/machine-observation/** -text
30 changes: 8 additions & 22 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ jobs:
python-version: ["3.12", "3.13"]
env:
QT_QPA_PLATFORM: offscreen
FACTORY_MACHINE_CONTRACT_VALIDATOR: ${{ github.workspace }}/.machine-contracts/scripts/validate.py
steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
Expand Down Expand Up @@ -63,14 +62,6 @@ jobs:
python -m pip install --upgrade pip
python -m pip install -e ".[dev]"

- name: Check out machine observation contract
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: dhsohn/machine-contracts
ref: 38581a7737cd0521bb3d50b59115eefe3c9254ca
path: .machine-contracts
persist-credentials: false

- name: Lint
run: python -m ruff check .

Expand Down Expand Up @@ -163,11 +154,15 @@ jobs:
tests/test_windows_installer.py \
tests/test_application_cli.py

- name: Compare browser font sizes with the Windows font engine
shell: bash
env:
QT_QPA_PLATFORM: windows
run: python -m pytest -q tests/test_web_adapter.py -k browser_font_pixels_match_pinned_native_font

rdkit-smoke:
name: RDKit smoke tests
runs-on: ubuntu-latest
env:
FACTORY_MACHINE_CONTRACT_VALIDATOR: ${{ github.workspace }}/.machine-contracts/scripts/validate.py
steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
Expand All @@ -188,16 +183,6 @@ jobs:
python -m pip install --upgrade pip
python -m pip install -e ".[dev,rdkit]"

- name: Check out machine observation contract
# Real-RDKit pack-step tests validate their machine.json against the
# same pinned contract as the main test job.
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: dhsohn/machine-contracts
ref: 38581a7737cd0521bb3d50b59115eefe3c9254ca
path: .machine-contracts
persist-credentials: false

- name: Verify RDKit import
run: |
python - <<'PY'
Expand Down Expand Up @@ -235,7 +220,8 @@ jobs:
tests/test_rdkit_hypercoordinate_geometry.py \
tests/test_macrocycle_depiction_evaluation.py \
tests/test_rdkit_real_use.py \
tests/test_rdkit_smiles_hydrogens.py
tests/test_rdkit_smiles_hydrogens.py \
tests/test_web_adapter.py

- name: Report coverage
if: ${{ !cancelled() && steps.tests.outcome != 'skipped' }}
Expand Down
10 changes: 1 addition & 9 deletions .github/workflows/platform.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,7 @@ jobs:
- name: Install Python dependencies
run: python -m pip install -e ".[dev]"

- name: Check out machine observation contract
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: dhsohn/machine-contracts
ref: 38581a7737cd0521bb3d50b59115eefe3c9254ca
path: .machine-contracts
persist-credentials: false

- name: Run the host platform gate
shell: bash
run: |
FACTORY_MACHINE_CONTRACT_REPO="$PWD/.machine-contracts" bash scripts/check.sh
bash scripts/check.sh
23 changes: 14 additions & 9 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# 작업자 진입점 — Chemvas

공장 공통 규칙은 `~/manual/AGENTS.md`가 지정하는 순서를 따른다(`FACTORY_MANUAL.md` →
자기 사이트 장부 → 이 파일). 여기에는 그 규칙을 복제하지 않고, **이 레포에만 해당하는
운영 사실**만 둔다.
공장 작업자는 `~/manual/AGENTS.md`가 지정하는 순서를 따른다(`FACTORY_MANUAL.md` →
자기 사이트 장부 → 이 파일). 일반 기여자는 이 레포만으로 개발·검증할 수 있으며
[CONTRIBUTING.md](CONTRIBUTING.md)가 안내한다. 여기에는 공장 규칙을 복제하지 않고,
**이 레포에만 해당하는 운영 사실**만 둔다.

## 이 레포가 무엇인가

Expand Down Expand Up @@ -51,9 +52,9 @@ worktree에서도 준비 없이 돌고, 맞는 인터프리터가 없거나 `.ve
`.venv`를 지우거나 `PYTHON_BIN`을 지정한다. 테스트는 `PYTHONPATH=app`으로 설치본이
아닌 이 체크아웃의 코드를 쓴다. Qt가 모듈 간에 완전히 리셋되지 않는 전역 상태를 유지하므로, 전체를
한 프로세스에 몰아넣은 실행은 통과해도 CI를 대표하지 않는다 — 이 루프가 게이트다.
`machine.json` 적합성 검증은 게이트가 `~/machine_contracts`의 정본 validator를 직접
연결한다(`FACTORY_MACHINE_CONTRACT_REPO`로 위치 변경 가능). 해당 테스트를 직접 돌릴
때도 validator 경로가 없으면 검증 없이 성공하지 않고 실패한다. 만진 파일만 좁혀 돌리려면:
`machine.json` 적합성 검증은 `contracts/machine-observation/`의 프로젝트 로컬
validator를 직접 사용한다. 외부 클론이나 환경변수 없이 동작하며, validator가 없으면
검증 없이 성공하지 않고 실패한다. 만진 파일만 좁혀 돌리려면:

```bash
bash scripts/check.sh tests/test_<area>.py
Expand All @@ -70,10 +71,14 @@ macOS와 네이티브 Windows에서만 지원하며, 기존 편집·텍스트·
| 모듈 경계·리팩터링·테스트 관례 | [CONTRIBUTING.md](CONTRIBUTING.md) 및 [ADR 0005](docs/adr/0005-responsibility-based-editor-boundaries.md) — 구조 변경 전 필독. 구조 검사는 소유권과 의존 경계 계약을 보호한다 |
| 설계 결정 기록 — 공개 계약·메이저 버전·기능 제거·상태 소유권 이동·외부 동작 의존은 같은 PR에 ADR을 쓴다 | [ADR 안내](docs/adr/README.md) |
| 릴리스 절차 | [RELEASING.md](RELEASING.md) |
| `machine.json` 공통 봉투 | `~/machine_contracts`의 `COMPATIBILITY.md`(v1 동결) |
| `machine.json` 공통 봉투 | `contracts/machine-observation/NOTICE.md`(v1 동결, 프로젝트 로컬 스냅샷) |

`machine.json` 표면을 바꾸려면 `machine-contracts`에 먼저 랜딩·릴리스하고, 이 레포 CI의
pin(`.github/workflows/ci.yml`의 `ref:`)을 의도적으로 전진시킨다.
`machine.json` 봉투 표면 변경은 이 프로젝트의 메인테이너가 소유한다. 변경 시
출처·타입·스키마/의미 회귀 커버리지를 기록하고, 공개 계약 변경에는 ADR과 버전 관리를
적용한다. upstream `machine-contracts`의 새 핀을 동기화하는 것은 선택적 호환 경로이며,
필수 선행 조건이 아니다. 동기화할 경우 `NOTICE.md`의 커밋 SHA, `PROVENANCE.json`의
해시, `tests/test_contract_compatibility.py`의 `PIN_HASHES`·`REGISTRY_HASH`를
함께 전진시키고, 복사한 파일의 원본 스키마/의미 호환성과 출처를 보존한다.

## `make check`가 흡수하지 못하는 것

Expand Down
Loading
Loading