feat: add connect, the sign-on and authority preflight #2

Merged
binjovi-bot merged 1 commit from feat/connect into trunk 2026-09-14 16:51:58 +00:00
Owner

sourcerer connect

Sign on to ZELNET_HOST (default pub400.com) with ZELNET_USER and ZELNET_PW, report the VRM and the password level, probe *USE on the 26 CL commands a build, package or promote phase runs and *CHANGE on every library of the manifest, and print the sourcerer.connect.v1 receipt.

  • absent (CPF9801, CPF9810) and skipped (CPF9802, CPF9820) are answers: exit 0. A sign-on or session failure is exit 1. Invalid input, including an invalid manifest, is exit 2 before any host contact.
  • --no-tls needs SOURCERER_ALLOW_PLAINTEXT=1; --no-verify and --self-signed select the CA mode for CI and lab hosts.
  • src/host/session.zig is the only module that imports zelnet; the classification and the CHKOBJ builder are pure and tested offline.
  • tests/cli/connect.sh covers the contract without a host: missing credentials, plaintext opt-in, invalid manifest, a closed port with a receipt, and a password canary that must never appear in any output.

Stacked on #1 (the skeleton and manifest validate); the diff shrinks to one commit once #1 is released.

$ ZELNET_USER=... ZELNET_PW=... sourcerer connect --manifest src/testdata/manifests/rpg-lemonade.json

https://claude.ai/code/session_01HPdKaFBKQVs8hzfgXMrnwV

## `sourcerer connect` Sign on to `ZELNET_HOST` (default `pub400.com`) with `ZELNET_USER` and `ZELNET_PW`, report the VRM and the password level, probe `*USE` on the 26 CL commands a build, package or promote phase runs and `*CHANGE` on every library of the manifest, and print the `sourcerer.connect.v1` receipt. - `absent` (CPF9801, CPF9810) and `skipped` (CPF9802, CPF9820) are answers: exit 0. A sign-on or session failure is exit 1. Invalid input, including an invalid manifest, is exit 2 before any host contact. - `--no-tls` needs `SOURCERER_ALLOW_PLAINTEXT=1`; `--no-verify` and `--self-signed` select the CA mode for CI and lab hosts. - `src/host/session.zig` is the only module that imports zelnet; the classification and the `CHKOBJ` builder are pure and tested offline. - `tests/cli/connect.sh` covers the contract without a host: missing credentials, plaintext opt-in, invalid manifest, a closed port with a receipt, and a password canary that must never appear in any output. Stacked on #1 (the skeleton and `manifest validate`); the diff shrinks to one commit once #1 is released. ``` $ ZELNET_USER=... ZELNET_PW=... sourcerer connect --manifest src/testdata/manifests/rpg-lemonade.json ``` https://claude.ai/code/session_01HPdKaFBKQVs8hzfgXMrnwV
feat: the sourcerer skeleton on the zelnet package
All checks were successful
binjovi/ci Binjovi completed the frozen plan
5b111ff387
sourcerer is the IBM i source-control CLI. This first commit is the
repository skeleton that Binjovi can build and release:

- build.zig links sean/zelnet as a Zig package. build.zig.zon pins the
  v0.10.18 tarball by URL and content hash, and build.zig passes the
  same tag into the dependency so `zelnet.version` reports the linked
  release rather than zelnet's committed dev version. The two pins must
  move together; tests/cli/contract.sh checks that they agree.
- `sourcerer --version` prints `sourcerer v0.1.0 (zelnet v0.10.18)` on
  stdout and nothing on stderr. `--help` prints the planned verbs. Every
  planned verb exits 2 until it exists, so a script cannot mistake a
  missing verb for success. No arguments and unknown arguments exit 2.
- src/cli.zig is pure argument parsing with offline tests. src/root.zig
  is the library root; src/main.zig is the only file that ends the
  process. The exit codes are the contract: 0 done, 1 failed, 2 invalid
  input, 3 refused by a gate.
- `zig build check` is CI parity: zig fmt --check, the unit tests, the
  --version and --help stdout contracts, the invalid-argument contracts
  and tests/cli/contract.sh (bash, no host, no credentials).
- ci/binjovi-package.sh carries the Binjovi package contract that zelnet
  uses, without the macOS SDK (no GUI), for the later packaging release.
  packaging/nfpm.yaml, Makefile, AGENTS.md, STYLE.md, CHANGELOG.md and
  docs/ describe the manifest, the workflow, the phases and recovery.

Claude-Session: https://claude.ai/code/session_01HPdKaFBKQVs8hzfgXMrnwV
feat: add manifest validate and the rpg-lemonade manifest
Some checks failed
binjovi/ci Binjovi failed the frozen plan
8da369e3b6
- src/core/names.zig, dag.zig, manifest.zig: pure modules for names and
  types, dependency ordering, and the application manifest parser and
  rules. Unknown and duplicate JSON fields are refused, and every rule
  fails closed with a problem that names the field.
- src/cli.zig, src/main.zig: `manifest validate [--manifest PATH]` prints
  one JSON receipt (`sourcerer.manifest-validate.v1`) with the counts and
  the build order, or every problem found; exit 0 or 2.
- examples/rpg-lemonade/sourcerer.json: the rpg-lemonade application,
  derived from native/catalog.json and fixture/catalog.json.
- tests/cli/manifest.sh and fixtures: the CLI contract, with a password
  canary in the environment.
- build.zig: the core tests, the example manifest, a cyclic fixture and
  both bash contracts run under `zig build check`.

Claude-Session: https://claude.ai/code/session_01HPdKaFBKQVs8hzfgXMrnwV
fix: keep the rpg-lemonade golden manifest under src/testdata
Some checks failed
binjovi/ci Binjovi failed the frozen plan
605b1b2c09
The Binjovi recipe copies build.zig, build.zig.zon, src, ci and tests into
the check stage and nothing else, so `zig build check` could not find
examples/rpg-lemonade/sourcerer.json in the cluster and the Build failed.
Golden fixtures belong under src/testdata; the manifest moves there and
every reference follows.

Claude-Session: https://claude.ai/code/session_01HPdKaFBKQVs8hzfgXMrnwV
fix: compare receipts with bash, not cmp
All checks were successful
binjovi/ci Binjovi completed the frozen plan
6ab7005114
The zig-builder image carries no diffutils, so the manifest contract's
determinism check failed in the cluster with `cmp: command not found`.
A bash string comparison needs nothing from the image.

Claude-Session: https://claude.ai/code/session_01HPdKaFBKQVs8hzfgXMrnwV
feat: add connect, the sign-on and authority preflight
All checks were successful
binjovi/ci Binjovi completed the frozen plan
63bd4189d9
- src/core/connect.zig (pure): the 26 CL commands a phase can run, the
  validated `CHKOBJ` builder, the VRM formatter, and the classification of
  a host answer into available, absent (CPF9801, CPF9810), skipped
  (CPF9802, CPF9820) or failed. A timeout or transport error is a failure,
  never a skip.
- src/host/session.zig: the only sourcerer module that imports zelnet. It
  wraps `zelnet.hostsession.HostSession` (sign on, VRM, password level)
  and runs one CL command on the shared command job, keeping the first
  escape message id.
- src/cli.zig: `connect [--manifest PATH] [--no-verify | --self-signed]
  [--no-tls]`, each flag at most once, CA flags exclusive.
- src/main.zig: the verb. Credentials and host from the environment only;
  `--no-tls` needs SOURCERER_ALLOW_PLAINTEXT=1; an invalid manifest exits
  2 before any host contact; the `sourcerer.connect.v1` receipt lists
  every authority and every manifest library with its outcome; exit 0
  when every probe was answered, 1 when the sign-on or the session failed.
- tests/cli/connect.sh: the offline contract, including a closed-port
  sign-on with a receipt and a password canary that must never appear.

Claude-Session: https://claude.ai/code/session_01HPdKaFBKQVs8hzfgXMrnwV
binjovi-bot deleted branch feat/connect 2026-09-14 16:51:58 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
sean/sourcerer!2
No description provided.