Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
fd37944
Scaffold Rust workspace, core data model, config schema and rule engine
claude Oct 17, 2026
f11d6aa
Add IFC reader bridge: embedded IfcOpenShell extractor streaming NDJS…
claude Oct 17, 2026
f2e9b42
Add BCF 2.1/3.0 writer, IDS evaluation, QTO aggregation, report write…
claude Oct 17, 2026
f8e4d0e
IDS failures are always errors; enrich IDS findings with storey/step …
claude Oct 17, 2026
35a192d
Add examples (3 project types, sample IDS, rates), docs, README; vali…
claude Oct 17, 2026
e194574
Accept standard category names in checks.categories toggles
claude Oct 17, 2026
22974f9
docs: reflect toggle validation, ids_file and classification.applies_…
claude Oct 17, 2026
5f813e3
docs: architecture diagram
claude Oct 17, 2026
9de5bcd
Add static frontend: 3-step Load/Review/Export UI, EN/ES, dark/light,…
claude Oct 17, 2026
f4db35f
docs: UI and report screenshots
claude Oct 17, 2026
b86d0c8
Add Tauri v2 desktop shell, CLI, demo building model and config
claude Oct 17, 2026
8f33f9b
Add assistant crate skeleton: backend trait, model catalogue, BM25 kn…
claude Oct 17, 2026
d68e31b
Switch to PolyForm Noncommercial 1.0.0 (as Repackshot), bump to 1.0.0…
claude Oct 17, 2026
ea0ff93
rustfmt core, reader, tests, assistant
claude Oct 17, 2026
2fdb3d5
Add CONTRIBUTING.md
claude Oct 17, 2026
791ad8f
ci: run once per PR commit (push trigger only on main)
claude Oct 17, 2026
f97bc5c
Add logo and product header, assistant panel, demo as first example, …
claude Oct 17, 2026
65a901e
docs: assistant architecture and guardrails, demo defect count, diagr…
claude Oct 17, 2026
a6b7bb2
docs: full architecture diagram
claude Oct 17, 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
71 changes: 71 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
name: CI

on:
push:
branches: ["main"]
pull_request:

env:
CARGO_TERM_COLOR: always

jobs:
test:
name: Rust tests (core, reader, end-to-end)
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy, rustfmt
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install IfcOpenShell + IfcTester (the IFC reader bridge)
run: python -m pip install --upgrade pip && python -m pip install ifcopenshell "ifctester" --no-deps && python -m pip install lxml xmlschema
- name: Install Tauri system dependencies (Linux)
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf
- uses: Swatinem/rust-cache@v2
- name: Format
run: cargo fmt --all -- --check
- name: Clippy
run: cargo clippy --workspace --all-targets -- -D warnings
- name: Test
run: cargo test --workspace
- name: CLI smoke run on the broken fixture (expected exit code 1 = FAIL)
run: |
cargo run -q -p verimodel-cli -- check --ifc tests/fixtures/broken_building.ifc --ids examples/sample.ids --config examples/residential/project.yaml --out out/broken || test $? -eq 1
ls -la out/broken

bundle:
name: Desktop bundle (${{ matrix.os }})
needs: test
strategy:
fail-fast: false
matrix:
os: [ubuntu-24.04, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Install Tauri system dependencies (Linux)
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf
- uses: Swatinem/rust-cache@v2
- name: Install Tauri CLI
run: cargo install tauri-cli --version "^2" --locked
- name: Build installers
run: cargo tauri build
- uses: actions/upload-artifact@v4
with:
name: verimodel-${{ matrix.os }}
path: |
target/release/bundle/**/*.msi
target/release/bundle/**/*.exe
target/release/bundle/**/*.dmg
target/release/bundle/**/*.AppImage
target/release/bundle/**/*.deb
if-no-files-found: warn
83 changes: 83 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
name: Release

# Builds installers for Windows, macOS and Linux when a version tag is pushed
# (e.g. `git tag v1.0.0 && git push origin v1.0.0`) and attaches them to a
# GitHub Release. The CLI binaries are attached too.

on:
push:
tags: ["v*"]

permissions:
contents: write

env:
CARGO_TERM_COLOR: always

jobs:
build:
name: Build (${{ matrix.name }})
strategy:
fail-fast: false
matrix:
include:
- name: windows-x64
os: windows-latest
bundles: msi,nsis
cli: target/release/verimodel.exe
cli_asset: verimodel-cli-windows-x64.exe
- name: macos-arm64
os: macos-latest
bundles: dmg
cli: target/release/verimodel
cli_asset: verimodel-cli-macos-arm64
- name: linux-x64
os: ubuntu-24.04
bundles: appimage,deb
cli: target/release/verimodel
cli_asset: verimodel-cli-linux-x64
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Install Tauri system dependencies (Linux)
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf
- uses: Swatinem/rust-cache@v2
- name: Install Tauri CLI
run: cargo install tauri-cli --version "^2" --locked
- name: Build CLI
run: cargo build --release -p verimodel-cli
- name: Build desktop installers
run: cargo tauri build --bundles ${{ matrix.bundles }}
- name: Collect artifacts
shell: bash
run: |
mkdir -p dist
cp "${{ matrix.cli }}" "dist/${{ matrix.cli_asset }}"
find target/release/bundle -type f \( -name "*.msi" -o -name "*.exe" -o -name "*.dmg" -o -name "*.AppImage" -o -name "*.deb" \) -exec cp {} dist/ \;
ls -la dist
- uses: actions/upload-artifact@v4
with:
name: verimodel-${{ matrix.name }}
path: dist/*

release:
name: Publish GitHub Release
needs: build
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
path: dist
merge-multiple: true
- name: Checksums
run: cd dist && sha256sum * > SHA256SUMS.txt && cat SHA256SUMS.txt
- uses: softprops/action-gh-release@v2
with:
name: VeriModel ${{ github.ref_name }}
body_path: docs/RELEASE_NOTES.md
files: dist/*
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Rust
/target/
**/target/
Cargo.lock
# Cargo.lock is committed: this workspace builds binaries (CLI + desktop)
# Keep Cargo.lock for the Tauri binary / CLI — uncomment if this becomes a library-only crate
# !Cargo.lock

Expand Down Expand Up @@ -31,6 +31,7 @@ out/
*.ifc
*.ifczip
!tests/fixtures/*.ifc
!examples/demo/*.ifc

# OS / editors
.DS_Store
Expand All @@ -41,3 +42,4 @@ Thumbs.db
*.swo
.env
.env.local
src-tauri/gen/
42 changes: 42 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Contributing to VeriModel

VeriModel is a local-first IFC quality gate, quantity takeoff and BCF exporter,
source-available under the PolyForm Noncommercial License 1.0.0.
Read this before you open a pull request.

## Before touching anything

```sh
pip install ifcopenshell ifctester # the IFC reader bridge
cargo test --workspace # unit + end-to-end tests (real IFC fixtures)
cargo clippy --workspace --all-targets -- -D warnings
cargo fmt --all
cargo tauri dev # the desktop app
```

## Where things live

- `README.md`: what VeriModel is, how to run it, architecture, demo script.
- `docs/CONFIG.md`, `docs/RULES.md`, `docs/IDS.md`, `docs/ASSUMPTIONS.md`: reference.
- `crates/core`: every decision (rules, score, QTO, BCF, reports). No IFC dependency.
- `crates/ifc_reader`: the only code that touches IFC (IfcOpenShell bridge). Facts only.
- `crates/assistant`: the read-only language-model copilot. Never part of a verdict.
- `frontend/`: presentation only. `src-tauri/` and `crates/cli/`: thin shells over core.
- `examples/`, `tests/fixtures/`: sample configurations and public IFC files.

## Work rules

1. Nothing project-specific in Rust: element types, property names, storeys, tolerances and classification come from `project.yaml`, `.ids` or a rule pack. A new check is a new YAML rule, or a new generic check kind with tests.
2. No change ships without the suite green, including the end-to-end tests on the fixtures.
3. Every fixed bug carries a regression test, verified to fail without the fix.
4. Outputs stay deterministic: `report.json`, `failures.csv`, `qto.*` and `report.html` must be byte-identical for the same inputs. Timestamps live only in `run.json` and `audit.log`.
5. The verdict is never produced or influenced by the assistant model.
6. Code, identifiers and comments in English. UI strings in both `en` and `es`, through the i18n files, never hardcoded.
7. A check that cannot run is reported as SKIPPED with a reason, never as PASS.
8. Do not add dependencies without a line in the README's "Dependencies and licenses" table.

## Licence

By contributing you agree that your contribution is licensed under the project
licence (PolyForm Noncommercial 1.0.0) and that the copyright holder may license
the project, including your contribution, under other terms.
Loading
Loading