You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 264dc94
Browse filesBrowse the repository at this point in the historyBrowse files
**Rust `TextEq` and `TextEqQuery` support Stack Encrypt's target-directed API behind the `stack-encrypt` feature.** The stored table and column identifier supplies the encryption context; native ciphertext and equality terms are transcoded into EQL payloads while Vitamin C owns plaintext encoding. This is a new producer profile with exact string equality, independent of existing cipherstash-client ciphertext and terms. Query operands carry no recoverable ciphertext.
if grep -qF 'failed to select a version for the requirement `stack-encrypt' <<<"$out"; then
650
+
echo "::warning title=eql-bindings not verified against the registry::The stack-encrypt version eql-bindings names is not on crates.io yet, so the packaged crate could not be built against the registry here. release-plz builds it at publish time (publish_all_features in packages/eql/release-plz.toml) and refuses to publish eql-bindings until that stack-encrypt has shipped."
Copy file name to clipboardExpand all lines: AGENTS.md
+25-1Lines changed: 25 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -85,7 +85,7 @@ Every npm package except EQL lives under `languages/typescript/`: packages in `l
85
85
-`languages/typescript/packages/utils`: Shared config (`utils/config`) and logger (`utils/logger`)
86
86
-`languages/typescript/packages/bench`: Performance / index-engagement benchmarks (private, not published)
87
87
-`languages/typescript/packages/protect-ffi`: Native FFI bindings to the CipherStash Client SDK (`@cipherstash/protect-ffi`) — the Rust core that `languages/typescript/packages/stack` encrypts and decrypts through, absorbed from `cipherstash/protectjs-ffi`. Contains a **nested Cargo workspace** (`crates/`) and six per-platform binary packages under `platforms/*`, each published as `@cipherstash/protect-ffi-<platform>` and linked here via `workspace:*`. Also holds the repo's live FFI integration suite at `integration-tests/` — a private workspace member (`@cipherstash/ffi-integration-tests`) enrolled by its own literal entry in `pnpm-workspace.yaml`, needing Docker and credentials, and deliberately carrying **no `test` script** so `pnpm test` cannot reach it. See the "Working on protect-ffi" notes below before touching it — its default `test` and `build` are deliberately Rust-free.
88
-
- `packages/eql`: The Encrypt Query Language subtree — the SQL bundle that stores and queries encrypted payloads — absorbed from `cipherstash/encrypt-query-language`. **The directory is the subtree root, not the package.** It was imported at a *verbatim prefix* so its repo-root-relative paths (mise tasks, `Doxyfile`, `sync-generated.mjs`) keep resolving, which puts the npm package `@cipherstash/eql` two levels down at `packages/eql/packages/eql` — the same shape as `languages/typescript/packages/protect-ffi/platforms/*`, and enrolled the same way, by an explicit `packages/eql/packages/*` glob in `pnpm-workspace.yaml`. The subtree root deliberately carries no `package.json`. Also contains a **nested Cargo workspace** at `packages/eql/crates/` (`eql-bindings`, published in lockstep with the npm package, plus `eql-domains` / `eql-codegen` / `eql-tests-macros`, which are not), a SQLx test crate at `packages/eql/tests/sqlx`, an ~900-line `mise.toml` task surface, its own `AGENTS.md`, and `docs/`. See the "Working on EQL" notes below before touching it.
88
+
- `packages/eql`: The Encrypt Query Language subtree — the SQL bundle that stores and queries encrypted payloads — absorbed from `cipherstash/encrypt-query-language`. **The directory is the subtree root, not the package.** It was imported at a *verbatim prefix* so its repo-root-relative paths (mise tasks, `Doxyfile`, `sync-generated.mjs`) keep resolving, which puts the npm package `@cipherstash/eql` two levels down at `packages/eql/packages/eql` — the same shape as `languages/typescript/packages/protect-ffi/platforms/*`, and enrolled the same way, by an explicit `packages/eql/packages/*` glob in `pnpm-workspace.yaml`. The subtree root deliberately carries no `package.json`. Also contains a **nested Cargo workspace** at `packages/eql/crates/` (`eql-bindings`, published in lockstep with the npm package, plus `eql-domains` / `eql-codegen` / `eql-tests-macros`, which are not), a SQLx test crate at `packages/eql/tests/sqlx`, an unpublished encryption test crate at `packages/eql/tests/encryption` (real encryption with a fake key source, the executable Rustdoc example at `packages/eql/crates/eql-bindings/src/encryption/example.rs`, plus optional PostgreSQL coverage), an ~900-line `mise.toml` task surface, its own `AGENTS.md`, and `docs/`. See the "Working on EQL" notes below before touching it.
89
89
**Repository ownership:** EQL now lives in `cipherstash/stack`. File and update
90
90
EQL issues in this repository, never in the historical
91
91
`cipherstash/encrypt-query-language` repository. Old upstream issue and PR
@@ -504,6 +504,30 @@ monorepo, which is where the silent failures are.
504
504
changes what the whole EQL CI surface compiles against, and with the skip in
505
505
place the release-stopper is closed without it. If wanted, the pin belongs
506
506
upstream and arrives by subtree pull.
507
+
-**`eql-bindings`' `stack-encrypt` feature names a stack-encrypt VERSION, and
508
+
the published crate is built against that version, not the tree.** The
509
+
dependency is `path` + `version`: the path is what every in-tree job
510
+
compiles, the version is what crates.io resolves once `cargo publish` strips
511
+
the path. The two agree only if the stack-encrypt on crates.io at that
512
+
version has the API `src/encryption.rs` uses — and nothing in a path build
513
+
can tell. stack-encrypt 0.1.0 shipped without `Describe`, and the feature
514
+
would have published against it while every test passed. Two guards compile
515
+
the feature FROM THE PACKAGED CRATE against the registry: `cargo publish
516
+
--dry-run --all-features` in `test-eql.yml`'s `rust-crates` job, and
517
+
`publish_all_features = true` in `packages/eql/release-plz.toml`. Without
518
+
`--all-features` both verify the default feature set, which is the feature
519
+
off. Consequences: the stack-encrypt a bump of that requirement names must
520
+
reach crates.io before eql-bindings does (the root release-plz line is
521
+
publish-only — a stack-* version moves by a hand-edited `Cargo.toml`, and
522
+
cargo refuses a requirement the in-tree path dependency does not satisfy, so
523
+
the bump lands in the stack-encrypt PR first); on a PR that names a
524
+
stack-encrypt not yet on crates.io the dry-run step cannot build against
525
+
the registry and says so as a WARNING rather than failing, because that PR
526
+
merges before the crate can ship and the case is already loud at publish —
527
+
only a version that resolves and then does not compile fails the step; and
528
+
`release-plz.yml`'s `release` job runs after `release-crates` so that on a
529
+
push releasing both, the crate eql-bindings resolves exists by the time it
530
+
looks.
507
531
-**`eql-bindings` resolves by path from `languages/typescript/packages/protect-ffi`, never from
508
532
crates.io**, and `scripts/lint-no-eql-registry-pins.mjs` (`pnpm run
509
533
lint:eql-pins`) is what keeps it that way. The two halves of EQL are the Rust
0 commit comments