overgraph 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. overgraph-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +26 -0
  2. overgraph-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  3. overgraph-0.1.0/.github/workflows/benchmarks.yml +250 -0
  4. overgraph-0.1.0/.github/workflows/ci.yml +45 -0
  5. overgraph-0.1.0/.github/workflows/release.yml +177 -0
  6. overgraph-0.1.0/.gitignore +42 -0
  7. overgraph-0.1.0/CHANGELOG.md +102 -0
  8. overgraph-0.1.0/CONTRIBUTING.md +133 -0
  9. overgraph-0.1.0/Cargo.lock +1254 -0
  10. overgraph-0.1.0/Cargo.toml +54 -0
  11. overgraph-0.1.0/LICENSE-APACHE +200 -0
  12. overgraph-0.1.0/LICENSE-MIT +21 -0
  13. overgraph-0.1.0/PKG-INFO +15 -0
  14. overgraph-0.1.0/README.md +270 -0
  15. overgraph-0.1.0/benches/core_ops.rs +745 -0
  16. overgraph-0.1.0/docs/04-quality/Benchmark-FAQ.md +42 -0
  17. overgraph-0.1.0/docs/04-quality/Benchmark-Methodology.md +93 -0
  18. overgraph-0.1.0/docs/04-quality/Benchmark-Plan.md +205 -0
  19. overgraph-0.1.0/docs/04-quality/Benchmark-Runner.md +64 -0
  20. overgraph-0.1.0/docs/04-quality/regression-allowlist.json +13 -0
  21. overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack/README.md +82 -0
  22. overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack/results-small-group-commit.json +291 -0
  23. overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/README.md +237 -0
  24. overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/parity-report.json +37 -0
  25. overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/parity-report.md +34 -0
  26. overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/results-small-group-commit-parity.json +39 -0
  27. overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/node-large.json +478 -0
  28. overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/node-medium.json +478 -0
  29. overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/node-small.json +478 -0
  30. overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/python-large.json +478 -0
  31. overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/python-medium.json +478 -0
  32. overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/python-small.json +478 -0
  33. overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/rust-large.json +444 -0
  34. overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/rust-medium.json +444 -0
  35. overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/rust-small.json +444 -0
  36. overgraph-0.1.0/docs/04-quality/reports/Performance-Overview.md +135 -0
  37. overgraph-0.1.0/docs/04-quality/reports/README.md +26 -0
  38. overgraph-0.1.0/docs/04-quality/reports/baselines/README.md +20 -0
  39. overgraph-0.1.0/docs/04-quality/reports/baselines/examples/large/node.json +478 -0
  40. overgraph-0.1.0/docs/04-quality/reports/baselines/examples/large/python.json +478 -0
  41. overgraph-0.1.0/docs/04-quality/reports/baselines/examples/large/rust.json +444 -0
  42. overgraph-0.1.0/docs/04-quality/reports/baselines/examples/medium/node.json +478 -0
  43. overgraph-0.1.0/docs/04-quality/reports/baselines/examples/medium/python.json +478 -0
  44. overgraph-0.1.0/docs/04-quality/reports/baselines/examples/medium/rust.json +444 -0
  45. overgraph-0.1.0/docs/04-quality/reports/baselines/examples/small/node.json +478 -0
  46. overgraph-0.1.0/docs/04-quality/reports/baselines/examples/small/python.json +478 -0
  47. overgraph-0.1.0/docs/04-quality/reports/baselines/examples/small/rust.json +444 -0
  48. overgraph-0.1.0/docs/04-quality/workloads/README.md +48 -0
  49. overgraph-0.1.0/docs/04-quality/workloads/profiles.json +91 -0
  50. overgraph-0.1.0/docs/04-quality/workloads/scenario-contract.json +127 -0
  51. overgraph-0.1.0/docs/architecture-overview.md +169 -0
  52. overgraph-0.1.0/docs/getting-started.md +403 -0
  53. overgraph-0.1.0/examples/node/knowledge-graph.mjs +126 -0
  54. overgraph-0.1.0/examples/python/knowledge_graph.py +125 -0
  55. overgraph-0.1.0/examples/rust/knowledge_graph.rs +122 -0
  56. overgraph-0.1.0/overgraph-python/Cargo.toml +14 -0
  57. overgraph-0.1.0/overgraph-python/src/lib.rs +2174 -0
  58. overgraph-0.1.0/overgraph-python/tests/conftest.py +52 -0
  59. overgraph-0.1.0/overgraph-python/tests/test_analytics.py +166 -0
  60. overgraph-0.1.0/overgraph-python/tests/test_async.py +471 -0
  61. overgraph-0.1.0/overgraph-python/tests/test_batch.py +342 -0
  62. overgraph-0.1.0/overgraph-python/tests/test_crud.py +242 -0
  63. overgraph-0.1.0/overgraph-python/tests/test_edge_cases.py +539 -0
  64. overgraph-0.1.0/overgraph-python/tests/test_lifecycle.py +116 -0
  65. overgraph-0.1.0/overgraph-python/tests/test_maintenance.py +104 -0
  66. overgraph-0.1.0/overgraph-python/tests/test_pagination.py +223 -0
  67. overgraph-0.1.0/overgraph-python/tests/test_persistence.py +229 -0
  68. overgraph-0.1.0/overgraph-python/tests/test_queries.py +119 -0
  69. overgraph-0.1.0/overgraph-python/tests/test_retention.py +103 -0
  70. overgraph-0.1.0/overgraph-python/tests/test_traversal.py +266 -0
  71. overgraph-0.1.0/pyproject.toml +28 -0
  72. overgraph-0.1.0/python/overgraph/__init__.py +2 -0
  73. overgraph-0.1.0/python/overgraph/__init__.pyi +445 -0
  74. overgraph-0.1.0/python/overgraph/async_api.py +406 -0
  75. overgraph-0.1.0/python/overgraph/py.typed +0 -0
  76. overgraph-0.1.0/scripts/bench/run-node.sh +5 -0
  77. overgraph-0.1.0/scripts/bench/run-python.sh +5 -0
  78. overgraph-0.1.0/scripts/bench/run-rust.sh +5 -0
  79. overgraph-0.1.0/src/bin/benchmark_harness.rs +1168 -0
  80. overgraph-0.1.0/src/bin/inspect.rs +235 -0
  81. overgraph-0.1.0/src/encoding.rs +571 -0
  82. overgraph-0.1.0/src/engine.rs +16735 -0
  83. overgraph-0.1.0/src/error.rs +46 -0
  84. overgraph-0.1.0/src/lib.rs +55 -0
  85. overgraph-0.1.0/src/manifest.rs +297 -0
  86. overgraph-0.1.0/src/memtable.rs +1324 -0
  87. overgraph-0.1.0/src/segment_reader.rs +2562 -0
  88. overgraph-0.1.0/src/segment_writer.rs +2034 -0
  89. overgraph-0.1.0/src/types.rs +604 -0
  90. overgraph-0.1.0/src/wal.rs +732 -0
  91. overgraph-0.1.0/src/wal_sync.rs +385 -0
  92. overgraph-0.1.0/tests/inspect_integration.rs +241 -0
  93. overgraph-0.1.0/tests/phase1_integration.rs +216 -0
  94. overgraph-0.1.0/tests/phase2_integration.rs +203 -0
  95. overgraph-0.1.0/tests/phase3_integration.rs +256 -0
  96. overgraph-0.1.0/tests/phase4_integration.rs +376 -0
  97. overgraph-0.1.0/tests/phase5_integration.rs +257 -0
  98. overgraph-0.1.0/tests/robustness_integration.rs +365 -0
  99. overgraph-0.1.0/tools/bench/__init__.py +1 -0
  100. overgraph-0.1.0/tools/bench/compare_baseline.py +421 -0
  101. overgraph-0.1.0/tools/bench/python_connector_benchmark.py +647 -0
  102. overgraph-0.1.0/tools/bench/run_suite.py +481 -0
  103. overgraph-0.1.0/tools/bench/tests/test_compare_baseline.py +438 -0
  104. overgraph-0.1.0/tools/bench/tests/test_run_suite.py +107 -0
  105. overgraph-0.1.0/tools/bench/tests/test_run_suite_rust_parse.py +43 -0
  106. overgraph-0.1.0/tools/bench/tests/test_validate_parity.py +148 -0
  107. overgraph-0.1.0/tools/bench/validate_parity.py +344 -0
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: Bug Report
3
+ about: Something isn't working right
4
+ title: ""
5
+ labels: bug
6
+ assignees: ""
7
+ ---
8
+
9
+ **What happened?**
10
+ A clear description of the bug.
11
+
12
+ **What did you expect?**
13
+ What should have happened instead.
14
+
15
+ **How to reproduce**
16
+ Steps or a minimal code example:
17
+
18
+ ```
19
+ // your code here
20
+ ```
21
+
22
+ **Environment**
23
+ - OS: [e.g., macOS 14, Ubuntu 22.04, Windows 11]
24
+ - Language: [Rust / Node.js / Python]
25
+ - OverGraph version: [e.g., 0.1.0]
26
+ - Rust version (if building from source): [e.g., 1.75.0]
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: Feature Request
3
+ about: Suggest something new
4
+ title: ""
5
+ labels: enhancement
6
+ assignees: ""
7
+ ---
8
+
9
+ **What's the use case?**
10
+ Describe what you're trying to do and why the current API doesn't cover it.
11
+
12
+ **What would the API look like?**
13
+ If you have ideas about how this would work, show an example:
14
+
15
+ ```
16
+ // your ideal API here
17
+ ```
18
+
19
+ **Anything else?**
20
+ Any context, alternatives you've considered, or related issues.
@@ -0,0 +1,250 @@
1
+ name: Benchmarks
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ profile:
7
+ description: "Benchmark profile"
8
+ required: false
9
+ default: small
10
+ type: choice
11
+ options:
12
+ - small
13
+ - medium
14
+ - large
15
+ baseline_root:
16
+ description: "Optional baseline root dir (defaults to docs/04-quality/reports/baselines/gha-ubuntu-22.04/<profile>)"
17
+ required: false
18
+ type: string
19
+ fail_on_warning:
20
+ description: "Fail workflow when only warning-threshold regressions are found"
21
+ required: false
22
+ default: false
23
+ type: boolean
24
+ schedule:
25
+ - cron: "0 7 * * *"
26
+
27
+ permissions:
28
+ contents: read
29
+
30
+ jobs:
31
+ benchmark:
32
+ runs-on: ubuntu-22.04
33
+ timeout-minutes: 180
34
+
35
+ steps:
36
+ - name: Checkout
37
+ uses: actions/checkout@v4
38
+
39
+ - name: Resolve benchmark config
40
+ shell: bash
41
+ run: |
42
+ set -euo pipefail
43
+ if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
44
+ PROFILE="${{ inputs.profile }}"
45
+ BASELINE_ROOT_INPUT="${{ inputs.baseline_root }}"
46
+ FAIL_ON_WARNING="${{ inputs.fail_on_warning }}"
47
+ else
48
+ PROFILE="medium"
49
+ BASELINE_ROOT_INPUT=""
50
+ FAIL_ON_WARNING="false"
51
+ fi
52
+
53
+ if [[ -n "${BASELINE_ROOT_INPUT}" ]]; then
54
+ BASELINE_ROOT="${BASELINE_ROOT_INPUT}"
55
+ else
56
+ BASELINE_ROOT="docs/04-quality/reports/baselines/gha-ubuntu-22.04/${PROFILE}"
57
+ fi
58
+
59
+ case "${PROFILE}" in
60
+ small)
61
+ WARMUP=10
62
+ ITERS=30
63
+ ;;
64
+ medium)
65
+ WARMUP=20
66
+ ITERS=80
67
+ ;;
68
+ large)
69
+ WARMUP=20
70
+ ITERS=80
71
+ ;;
72
+ *)
73
+ echo "Unsupported profile: ${PROFILE}" >&2
74
+ exit 1
75
+ ;;
76
+ esac
77
+
78
+ RUN_TAG="ci-$(date -u +%Y%m%dT%H%M%SZ)-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
79
+
80
+ {
81
+ echo "PROFILE=${PROFILE}"
82
+ echo "BASELINE_ROOT=${BASELINE_ROOT}"
83
+ echo "WARMUP=${WARMUP}"
84
+ echo "ITERS=${ITERS}"
85
+ echo "RUN_TAG=${RUN_TAG}"
86
+ echo "FAIL_ON_WARNING=${FAIL_ON_WARNING}"
87
+ } >> "$GITHUB_ENV"
88
+
89
+ - name: Setup Rust
90
+ uses: dtolnay/rust-toolchain@stable
91
+
92
+ - name: Cache Rust build artifacts
93
+ uses: Swatinem/rust-cache@v2
94
+
95
+ - name: Setup Node
96
+ uses: actions/setup-node@v4
97
+ with:
98
+ node-version: "20"
99
+
100
+ - name: Setup Python
101
+ uses: actions/setup-python@v5
102
+ with:
103
+ python-version: "3.11"
104
+
105
+ - name: Install system deps
106
+ shell: bash
107
+ run: |
108
+ set -euo pipefail
109
+ sudo apt-get update
110
+ sudo apt-get install -y pkg-config libssl-dev
111
+
112
+ - name: Install Node deps + build connector
113
+ shell: bash
114
+ run: |
115
+ set -euo pipefail
116
+ npm ci --prefix overgraph-node
117
+ npm --prefix overgraph-node run build
118
+
119
+ - name: Install Python deps + build connector
120
+ shell: bash
121
+ run: |
122
+ set -euo pipefail
123
+ python3 -m pip install --upgrade pip
124
+ python3 -m pip install maturin==1.7.8
125
+ python3 -m pip install -e overgraph-python
126
+
127
+ - name: Run benchmark suite
128
+ shell: bash
129
+ run: |
130
+ set -euo pipefail
131
+ mkdir -p bench-artifacts/runs/rust
132
+ mkdir -p bench-artifacts/runs/node
133
+ mkdir -p bench-artifacts/runs/python
134
+
135
+ scripts/bench/run-rust.sh \
136
+ --profile "${PROFILE}" \
137
+ --warmup "${WARMUP}" \
138
+ --iters "${ITERS}" \
139
+ --output-root bench-artifacts/runs/rust \
140
+ --run-id "${RUN_TAG}-rust-${PROFILE}"
141
+
142
+ scripts/bench/run-node.sh \
143
+ --profile "${PROFILE}" \
144
+ --warmup "${WARMUP}" \
145
+ --iters "${ITERS}" \
146
+ --output-root bench-artifacts/runs/node \
147
+ --run-id "${RUN_TAG}-node-${PROFILE}"
148
+
149
+ scripts/bench/run-python.sh \
150
+ --profile "${PROFILE}" \
151
+ --warmup "${WARMUP}" \
152
+ --iters "${ITERS}" \
153
+ --output-root bench-artifacts/runs/python \
154
+ --run-id "${RUN_TAG}-python-${PROFILE}"
155
+
156
+ - name: Validate cross-language parity
157
+ shell: bash
158
+ run: |
159
+ set -euo pipefail
160
+ mkdir -p bench-artifacts/parity
161
+
162
+ python3 tools/bench/validate_parity.py \
163
+ --rust "bench-artifacts/runs/rust/${RUN_TAG}-rust-${PROFILE}/rust.json" \
164
+ --node "bench-artifacts/runs/node/${RUN_TAG}-node-${PROFILE}/node.json" \
165
+ --python "bench-artifacts/runs/python/${RUN_TAG}-python-${PROFILE}/python.json" \
166
+ --report-json bench-artifacts/parity/parity-report.json \
167
+ --report-md bench-artifacts/parity/parity-report.md
168
+
169
+ - name: Compare to baseline
170
+ shell: bash
171
+ run: |
172
+ set -euo pipefail
173
+ mkdir -p bench-artifacts/compare
174
+
175
+ status=0
176
+ for lang in rust node python; do
177
+ candidate_json="bench-artifacts/runs/${lang}/${RUN_TAG}-${lang}-${PROFILE}/${lang}.json"
178
+ baseline_json="${BASELINE_ROOT}/${lang}.json"
179
+ report_md="bench-artifacts/compare/${lang}-compare.md"
180
+ report_json="bench-artifacts/compare/${lang}-compare.json"
181
+
182
+ if [[ ! -f "${candidate_json}" ]]; then
183
+ echo "Missing candidate file: ${candidate_json}" >&2
184
+ status=2
185
+ continue
186
+ fi
187
+
188
+ if [[ -f "${baseline_json}" ]]; then
189
+ args=(
190
+ python3 tools/bench/compare_baseline.py
191
+ --baseline "${baseline_json}"
192
+ --candidate "${candidate_json}"
193
+ --allowlist docs/04-quality/regression-allowlist.json
194
+ --warn-threshold-pct 10
195
+ --fail-threshold-pct 20
196
+ --report-md "${report_md}"
197
+ --report-json "${report_json}"
198
+ )
199
+ if [[ "${FAIL_ON_WARNING}" == "true" ]]; then
200
+ args+=(--fail-on-warning)
201
+ fi
202
+
203
+ set +e
204
+ "${args[@]}"
205
+ rc=$?
206
+ set -e
207
+
208
+ if (( rc > status )); then
209
+ status=$rc
210
+ fi
211
+ else
212
+ {
213
+ echo "# Benchmark Baseline Comparison"
214
+ echo
215
+ echo "- Language: \`${lang}\`"
216
+ echo "- Status: \`error\`"
217
+ echo "- Reason: required baseline file not found at \`${baseline_json}\`"
218
+ } > "${report_md}"
219
+ status=2
220
+ fi
221
+ done
222
+
223
+ exit "${status}"
224
+
225
+ - name: Publish comparison summary
226
+ if: always()
227
+ shell: bash
228
+ run: |
229
+ set -euo pipefail
230
+ if [[ -f "bench-artifacts/parity/parity-report.md" ]]; then
231
+ echo "## parity-report.md" >> "$GITHUB_STEP_SUMMARY"
232
+ cat "bench-artifacts/parity/parity-report.md" >> "$GITHUB_STEP_SUMMARY"
233
+ echo >> "$GITHUB_STEP_SUMMARY"
234
+ fi
235
+ if compgen -G "bench-artifacts/compare/*.md" > /dev/null; then
236
+ for file in bench-artifacts/compare/*.md; do
237
+ echo "## $(basename "${file}")" >> "$GITHUB_STEP_SUMMARY"
238
+ cat "${file}" >> "$GITHUB_STEP_SUMMARY"
239
+ echo >> "$GITHUB_STEP_SUMMARY"
240
+ done
241
+ fi
242
+
243
+ - name: Upload benchmark artifacts
244
+ if: always()
245
+ uses: actions/upload-artifact@v4
246
+ with:
247
+ name: benchmark-${{ env.RUN_TAG }}-${{ env.PROFILE }}
248
+ path: bench-artifacts
249
+ if-no-files-found: error
250
+ retention-days: 30
@@ -0,0 +1,45 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ test:
14
+ name: Test (${{ matrix.os }})
15
+ runs-on: ${{ matrix.os }}
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ os: [ubuntu-latest, macos-latest, windows-latest]
20
+
21
+ steps:
22
+ - uses: actions/checkout@v4
23
+
24
+ - name: Install Rust
25
+ uses: dtolnay/rust-toolchain@stable
26
+
27
+ - name: Cache cargo registry and build
28
+ uses: actions/cache@v4
29
+ with:
30
+ path: |
31
+ ~/.cargo/registry
32
+ ~/.cargo/git
33
+ target
34
+ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
35
+ restore-keys: |
36
+ ${{ runner.os }}-cargo-
37
+
38
+ - name: Build
39
+ run: cargo build --all-targets --features cli
40
+
41
+ - name: Run tests
42
+ run: cargo test --features cli
43
+
44
+ - name: Run tests (no default features)
45
+ run: cargo test
@@ -0,0 +1,177 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ # ──────────────────────────────────────────────
13
+ # Rust: publish to crates.io
14
+ # ──────────────────────────────────────────────
15
+ # Uses API token for first publish. After v0.1.0 is live, configure
16
+ # Trusted Publishing on crates.io and switch to crates-io-auth-action.
17
+ publish-rust:
18
+ name: Publish to crates.io
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ - uses: dtolnay/rust-toolchain@stable
23
+ - uses: actions/cache@v4
24
+ with:
25
+ path: |
26
+ ~/.cargo/registry
27
+ ~/.cargo/git
28
+ target
29
+ key: ${{ runner.os }}-cargo-publish-${{ hashFiles('**/Cargo.lock') }}
30
+ - run: cargo publish -p overgraph
31
+ env:
32
+ CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
33
+
34
+ # ──────────────────────────────────────────────
35
+ # Node.js: build native binaries for each platform
36
+ # ──────────────────────────────────────────────
37
+ build-node:
38
+ name: Build Node.js (${{ matrix.target }})
39
+ runs-on: ${{ matrix.os }}
40
+ strategy:
41
+ fail-fast: false
42
+ matrix:
43
+ include:
44
+ - os: macos-latest
45
+ target: aarch64-apple-darwin
46
+ - os: macos-latest
47
+ target: x86_64-apple-darwin
48
+ - os: ubuntu-latest
49
+ target: x86_64-unknown-linux-gnu
50
+ - os: windows-latest
51
+ target: x86_64-pc-windows-msvc
52
+ steps:
53
+ - uses: actions/checkout@v4
54
+ - uses: dtolnay/rust-toolchain@stable
55
+ with:
56
+ targets: ${{ matrix.target }}
57
+ - uses: actions/setup-node@v4
58
+ with:
59
+ node-version: 22
60
+ - name: Install dependencies
61
+ working-directory: overgraph-node
62
+ run: npm install
63
+ - name: Build native module
64
+ working-directory: overgraph-node
65
+ run: npx napi build --platform --release --target ${{ matrix.target }}
66
+ - name: Upload artifact
67
+ uses: actions/upload-artifact@v4
68
+ with:
69
+ name: node-${{ matrix.target }}
70
+ path: overgraph-node/*.node
71
+ if-no-files-found: error
72
+
73
+ # ──────────────────────────────────────────────
74
+ # Node.js: publish to npm
75
+ # ──────────────────────────────────────────────
76
+ # Uses granular access token for first publish. After v0.1.0 is live,
77
+ # configure Trusted Publishing on npmjs.com and switch to OIDC.
78
+ publish-node:
79
+ name: Publish to npm
80
+ needs: build-node
81
+ runs-on: ubuntu-latest
82
+ steps:
83
+ - uses: actions/checkout@v4
84
+ - uses: actions/setup-node@v4
85
+ with:
86
+ node-version: 22
87
+ registry-url: https://registry.npmjs.org
88
+ - name: Download all artifacts
89
+ uses: actions/download-artifact@v4
90
+ with:
91
+ path: overgraph-node/artifacts
92
+ pattern: node-*
93
+ - name: Move binaries into place
94
+ working-directory: overgraph-node
95
+ run: |
96
+ for dir in artifacts/node-*/; do
97
+ cp "$dir"*.node .
98
+ done
99
+ ls -la *.node
100
+ - name: Publish
101
+ working-directory: overgraph-node
102
+ run: npm publish --access public
103
+ env:
104
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
105
+
106
+ # ──────────────────────────────────────────────
107
+ # Python: build wheels for each platform
108
+ # ──────────────────────────────────────────────
109
+ build-python:
110
+ name: Build Python (${{ matrix.target }})
111
+ runs-on: ${{ matrix.os }}
112
+ strategy:
113
+ fail-fast: false
114
+ matrix:
115
+ include:
116
+ - os: macos-latest
117
+ target: aarch64-apple-darwin
118
+ - os: macos-latest
119
+ target: x86_64-apple-darwin
120
+ - os: ubuntu-latest
121
+ target: x86_64-unknown-linux-gnu
122
+ - os: windows-latest
123
+ target: x86_64-pc-windows-msvc
124
+ steps:
125
+ - uses: actions/checkout@v4
126
+ - uses: actions/setup-python@v5
127
+ with:
128
+ python-version: '3.12'
129
+ - name: Build wheel
130
+ uses: PyO3/maturin-action@v1
131
+ with:
132
+ working-directory: overgraph-python
133
+ target: ${{ matrix.target }}
134
+ args: --release --out ../dist
135
+ manylinux: auto
136
+ - name: Upload wheel
137
+ uses: actions/upload-artifact@v4
138
+ with:
139
+ name: python-${{ matrix.target }}
140
+ path: dist/*.whl
141
+ if-no-files-found: error
142
+
143
+ build-python-sdist:
144
+ name: Build Python sdist
145
+ runs-on: ubuntu-latest
146
+ steps:
147
+ - uses: actions/checkout@v4
148
+ - name: Build sdist
149
+ uses: PyO3/maturin-action@v1
150
+ with:
151
+ working-directory: overgraph-python
152
+ command: sdist
153
+ args: --out ../dist
154
+ - name: Upload sdist
155
+ uses: actions/upload-artifact@v4
156
+ with:
157
+ name: python-sdist
158
+ path: dist/*.tar.gz
159
+ if-no-files-found: error
160
+
161
+ # ──────────────────────────────────────────────
162
+ # Python: publish to PyPI (Trusted Publishers — no token needed)
163
+ # ──────────────────────────────────────────────
164
+ publish-python:
165
+ name: Publish to PyPI
166
+ needs: [build-python, build-python-sdist]
167
+ runs-on: ubuntu-latest
168
+ permissions:
169
+ id-token: write
170
+ steps:
171
+ - uses: actions/download-artifact@v4
172
+ with:
173
+ path: dist
174
+ pattern: python-*
175
+ merge-multiple: true
176
+ - name: Publish
177
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,42 @@
1
+ # Build artifacts
2
+ /target
3
+ *.so
4
+ *.dylib
5
+ *.dSYM/
6
+
7
+ # Node.js
8
+ node_modules/
9
+ *.node
10
+
11
+ # Python
12
+ __pycache__/
13
+ *.pyc
14
+ *.pyo
15
+ *.egg-info/
16
+ dist/
17
+ .pytest_cache/
18
+
19
+ # OS files
20
+ .DS_Store
21
+ Thumbs.db
22
+
23
+ # IDE
24
+ .vscode/
25
+ .idea/
26
+ *.swp
27
+ *.swo
28
+
29
+ # Environment
30
+ .env
31
+ .env.local
32
+
33
+ # Claude Code
34
+ .claude/
35
+ CLAUDE.md
36
+ AGENTS.md
37
+
38
+ # Internal development docs (not public-facing)
39
+ docs/internal/
40
+
41
+ # Research notes
42
+ research-docs/
@@ -0,0 +1,102 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this project adheres to [Semantic Versioning](https://semver.org/).
6
+
7
+ ## [0.1.0] - 2026-03-04
8
+
9
+ Initial release.
10
+
11
+ ### Core Engine
12
+ - Log-structured merge tree storage engine, written entirely in Rust with zero C/C++ dependencies
13
+ - Write-ahead log with CRC32 integrity checks and crash recovery
14
+ - Configurable durability: `Immediate` (fsync per write) or `GroupCommit` (batched fsync, ~20x throughput)
15
+ - Immutable segments with memory-mapped reads (no application-level caching)
16
+ - Background compaction with metadata sidecars, raw binary copy, and metadata-driven index building
17
+ - Atomic manifest updates with rollback safety
18
+ - Directory-scoped databases (each DB is a self-contained folder)
19
+
20
+ ### Data Model
21
+ - Typed nodes with `(type_id, key)` upsert semantics
22
+ - Typed edges with optional `(from, to, type_id)` uniqueness
23
+ - Weighted nodes and edges (`f32` weight field)
24
+ - Schemaless properties encoded as MessagePack (supports null, bool, int, float, string, bytes, arrays)
25
+
26
+ ### Graph Operations
27
+ - Single and batch upsert for nodes and edges
28
+ - Packed binary batch format for maximum throughput
29
+ - Delete with tombstone-based soft deletion
30
+ - Atomic `graph_patch` for multi-operation mutations
31
+ - Point lookups by ID, by `(type_id, key)`, and by `(from, to, type_id)` triple
32
+ - Bulk reads with sorted merge-walk (not per-item lookups)
33
+
34
+ ### Query and Traversal
35
+ - 1-hop and 2-hop neighbor expansion with edge type filters and direction control
36
+ - Constrained 2-hop: traverse specific edge types, filter target nodes by type
37
+ - Top-K neighbors by weight, recency, or decay-adjusted score
38
+ - Property equality search (hash-indexed)
39
+ - Type-based node and edge listing with counts
40
+ - Time-range queries on a sorted timestamp index
41
+ - Subgraph extraction up to N hops deep
42
+ - Personalized PageRank from seed nodes
43
+ - Graph adjacency export with type filters
44
+
45
+ ### Temporal Features
46
+ - Bi-temporal edges with `valid_from` and `valid_to` timestamps
47
+ - Point-in-time queries via `at_epoch` parameter
48
+ - Edge invalidation (mark as no longer valid without deleting)
49
+ - Exponential decay scoring via `decay_lambda` parameter
50
+
51
+ ### Pagination
52
+ - Keyset pagination on all collection-returning APIs
53
+ - Stable cursors across concurrent writes
54
+ - K-way merge with binary-seek cursor for efficient multi-source pagination
55
+
56
+ ### Retention
57
+ - Manual `prune()` by age, weight threshold, or node type
58
+ - Named prune policies stored in manifest, evaluated at read time (lazy expiration) and compaction time (physical deletion)
59
+ - Automatic edge cascade on node pruning
60
+
61
+ ### Indexes
62
+ - Outgoing and incoming adjacency indexes with delta-encoded postings
63
+ - `(type_id, key)` to node_id key index
64
+ - `type_id` to sorted ID list type index
65
+ - Property equality hash index
66
+ - Sorted timestamp index for time-range queries
67
+ - Tombstone index
68
+
69
+ ### Performance
70
+ - Node lookups: ~200ns
71
+ - Neighbor traversal: ~2μs
72
+ - Batch writes: 600K+ nodes/sec
73
+ - Sorted cursor walk for batch adjacency operations (PPR, subgraph, export)
74
+ - Memtable backpressure (64MB hard cap)
75
+ - Segment format v5 with metadata sidecars for fast filtered compaction
76
+
77
+ ### Node.js Connector
78
+ - napi-rs bindings with full API parity
79
+ - Sync and async variants of every method
80
+ - Lazy getters on record types (no deserialization until access)
81
+ - Typed arrays (`Float64Array`, `BigInt64Array`) for bulk data
82
+ - Packed binary batch protocol for node and edge upserts
83
+ - Context manager support
84
+
85
+ ### Python Connector
86
+ - PyO3 + maturin bindings with full API parity
87
+ - Sync `OverGraph` and async `AsyncOverGraph` classes
88
+ - GIL released for all Rust calls via `py.allow_threads()`
89
+ - Lazy `.props` deserialization
90
+ - `IdArray` lazy sequence wrapper
91
+ - Context manager support (`with` / `async with`)
92
+ - PEP 561 type stubs (`.pyi`)
93
+ - Compaction progress callback with Python exception capture
94
+
95
+ ### CLI
96
+ - `overgraph inspect <path>`: show manifest, segment count, node/edge counts, WAL size, prune policies
97
+
98
+ ### CI
99
+ - Cross-platform CI: macOS, Linux, Windows
100
+ - Benchmark CI with regression detection and cross-language parity validation
101
+
102
+ [0.1.0]: https://github.com/Bhensley5/overgraph/releases/tag/v0.1.0