48 Commits
Author SHA1 Message Date
james.maes b250794a7c Merge pull request 'ci(release): open tap and bucket pull requests instead of pushing to main' (#19) from ci/packaging-pull-requests into main
node / node (push) Successful in 1m5s
build / node (push) Successful in 1m5s
2026-11-08 23:29:23 +00:00
James MaesandClaude Opus 5.5 bf9c093bdd ci(release): open tap and bucket pull requests instead of pushing to main
node / node (push) Successful in 1m5s
build / node (push) Successful in 1m5s
For a final version the publish job now pushes branch release/qqq-<version>
to QRun-IO/homebrew-tap and QRun-IO/scoop-bucket with PACKAGES_TOKEN and
opens a pull request "qqq <version>" in each; a human merges. A prerelease,
or a refused push or pull request, attaches qqq.rb / qqq.json to the release
as before, and never fails the release. The logic moves to
scripts/publish-packaging.sh, with a DRY_RUN=1 path that clones and commits
locally but writes nothing remote.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 17:23:00 -06:00
james.maes a4750b68ad Merge pull request 'fix(core): DPAPI keyring works when started from PowerShell 7' (#18) from fix/dpapi-psmodulepath into main
node / node (push) Successful in 1m10s
build / node (push) Successful in 1m10s
release / macos (push) Successful in 34s
release / windows (push) Successful in 4m5s
release / publish (push) Successful in 1m7s
release / linux (push) Successful in 3m8s
v1.0.1-rc.1
2026-11-08 14:03:19 +00:00
james.maesandClaude Opus 5.5 1c54e7fae0 fix(core): DPAPI keyring works when started from PowerShell 7
node / node (push) Successful in 44s
build / node (push) Successful in 44s
Started from pwsh 7, the child Windows PowerShell 5.1 inherits PowerShell 7's
PSModulePath and cannot load Microsoft.PowerShell.Security, so
ConvertTo-SecureString fails and every DPAPI set/get reports "Windows
credential protection failed". The release workflow's Windows lane (steps in
pwsh) hit it in the existing DPAPI test. The keyring now spawns PowerShell
without PSModulePath; each shell computes its own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 08:01:58 -06:00
james.maes bcd3468751 Merge pull request 'ci(release): no musl binaries (no OpenTUI musl native package on the glibc builder)' (#17) from ci/release-no-musl into main
node / node (push) Successful in 44s
build / node (push) Successful in 44s
release / macos (push) Successful in 35s
release / windows (push) Failing after 3m39s
release / publish (push) Skipped
release / linux (push) Successful in 2m57s
2026-11-08 13:53:43 +00:00
james.maesandClaude Opus 5.5 0414e46a60 ci(release): build no musl binaries; the gate passes, musl fails
node / node (push) Successful in 1m12s
build / node (push) Successful in 1m12s
v1.0.1-rc.1 passed scripts/release.mjs in CI, then build-binaries stopped:
Bun on the glibc container installs no OpenTUI musl native package
(@opentui/core-linux-x64-musl), and the script calls musl best effort. The
release ships linux x64/arm64, darwin x64/arm64 and windows x64; install.sh
says so on musl hosts and points at the npm package.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 07:52:03 -06:00
james.maes 2f50a10543 Merge pull request 'test(tui): splash and print footer accept prerelease versions' (#16) from fix/tui-tests-prerelease into main
node / node (push) Successful in 51s
build / node (push) Successful in 51s
release / macos (push) Skipped
release / windows (push) Skipped
release / publish (push) Skipped
release / linux (push) Failing after 2m45s
2026-11-08 13:48:23 +00:00
james.maesandClaude Opus 5.5 b68a609240 test(tui): the splash and print footer accept prerelease versions
node / node (push) Successful in 1m27s
build / node (push) Successful in 1m27s
Both assertions only matched X.Y.Z, so the release gate (which now runs the
TUI tests) failed on 1.0.1-rc.1. They accept a semver prerelease suffix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 07:46:35 -06:00
james.maes c9f033192e Merge pull request 'release: Gitea release pipeline on v<CLI version> tags; 1.0.1-rc.1' (#15) from ci/release-pipeline into main
node / node (push) Successful in 1m7s
build / node (push) Successful in 1m7s
release / macos (push) Skipped
release / windows (push) Skipped
release / publish (push) Skipped
release / linux (push) Failing after 2m2s
2026-11-08 13:43:33 +00:00
james.maesandClaude Opus 5.5 61c645d581 test(cli): the print footer names CLI_VERSION, prerelease versions included
node / node (push) Successful in 1m20s
build / node (push) Successful in 1m19s
The footer assertion only accepted X.Y.Z, so any -rc.N version failed it.
It now compares against CLI_VERSION exactly (port masked), which is stricter.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 07:41:47 -06:00
james.maesandClaude Opus 5.5 9890fb1300 release: Gitea release pipeline on v<CLI version> tags; 1.0.1-rc.1
node / node (push) Failing after 45s
build / node (push) Failing after 45s
.gitea/workflows/release.yaml replaces the orb publish and the GitHub release:
the scripts/release.mjs gate, Linux + darwin-x64 binaries in the container,
darwin-arm64 and windows-x64 built and smoke-tested on the native runners, a
draft Gitea release, SHA256SUMS checked against the published downloads, the
four packages to the QRun-IO Gitea npm registry (an existing version is
skipped, each package's own version picks next/latest), and for final versions
the Homebrew tap and Scoop bucket (pushed when PACKAGES_TOKEN can write them,
else the filled files are attached to the release).

release.mjs accepts its tag when it points at HEAD and prints the new path;
install.sh, update-packaging, the formula and the manifest use Gitea
downloads under v<version>; publishConfig points at the Gitea registry;
build.yaml now runs on branches only; the runbook describes the new path.
Versions: cli and core 1.0.1-rc.1, client 1.8.1-rc.1 (content changed since
1.0.0), conformance 1.6.0 unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 07:37:03 -06:00
James MaesandClaude Opus 5.5 d0d8776838 ci: first run on ci-workflows v1 (node.yaml)
node / node (push) Successful in 1m11s
build / node (push) Successful in 1m11s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 16:37:54 -06:00
james.maes 219d2669c3 Merge pull request 'ci: build on the shared ci-workflows node.yaml, remove CircleCI' (#14) from ci/ci-workflows into main 2026-11-07 22:15:01 +00:00
james.maesandClaude Opus 5.5 4828a73d32 ci: pin ci-workflows node.yaml to @v1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 16:14:30 -06:00
james.maesandClaude Opus 5.5 2c156f3884 ci: build on the shared ci-workflows node.yaml, remove CircleCI
node / node (push) Successful in 50s
build / node (push) Successful in 50s
Gitea CI runs npm ci, the generated-code drift check, build, test and lint
through KofTwentyTwo/ci-workflows node.yaml. Removes the retired qqq-orb
files (.circleci, .qqq-ci.yml and the copies seeded into the Homebrew tap)
and updates the docs that described them. Publishing is not ported.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 16:12:34 -06:00
james.maes b40c291646 Merge pull request 'ci: remove workflows that call the retired CI system' (#13) from retire/old-ci into main 2026-11-07 13:29:11 +00:00
james.maesandClaude Opus 5.5 29f5b2a542 ci: remove workflows that call the retired CI system
Owner decision 2026-11-07: only KofTwentyTwo/ci-workflows remains.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 13:29:09 +00:00
james.maes 991950505d Merge pull request 'fix(windows,tui): DPAPI over stdin, browser opener without cmd, tag capability check' (#12) from fix/windows-dpapi-browser-tags-20261106 into main
QRun-IO/ci-policy: ci / fork-guard (push) Skipped
QRun-IO/ci-policy: ci / Scoped workflow [workflow 1e25bb5a243dfdcd95d4b9a4f780200ff8c8778a] (push) Successful in 10s
QRun-IO/ci-policy: native / fork-deny (push) Skipped
QRun-IO/ci-policy: native / dotnet-0 (push) Skipped
QRun-IO/ci-policy: native / native-result (push) Successful in 11s
QRun-IO/ci-policy: ci / head-profile (push) Skipped
QRun-IO/ci-policy: ci / repository-policy (push) Skipped
QRun-IO/ci-policy: ci / application-template-0 (push) Skipped
QRun-IO/ci-policy: ci / gradle-1 (push) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (push) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (push) Skipped
QRun-IO/ci-policy: ci / node-8 (push) Skipped
QRun-IO/ci-policy: ci / node-9 (push) Skipped
QRun-IO/ci-policy: ci / node-10 (push) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (push) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (push) Skipped
QRun-IO/ci-policy: ci / source-config-13 (push) Skipped
QRun-IO/ci-policy: ci / source-config-14 (push) Skipped
QRun-IO/ci-policy: ci / original-business (push) Skipped
QRun-IO/ci-policy: ci / original-voyage (push) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (push) Skipped
QRun-IO/ci-policy: Original QQQ CLI verification and package capture / verify (push) Successful in 2m32s
QRun-IO/ci-policy: Original QQQ CLI verification and package capture / gate (push) Successful in 15s
QRun-IO/ci-policy: ci / original-cli (push) Successful in 2m50s
QRun-IO/ci-policy: ci / ci-result (push) Successful in 7s
QRun-IO/ci-policy: ci / java-docker-3-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (push) Skipped
QRun-IO/ci-policy: ci / android-0 (push) Skipped
QRun-IO/ci-policy: ci / original-mcp (push) Skipped
QRun-IO/ci-policy: ci / not-enrolled (push) Skipped
QRun-IO/ci-policy: Original QQQ CLI verification and package capture / secrets (push) Successful in 23s
2026-11-06 15:32:17 +00:00
james.maesandClaude Fable 5.1 2c3114e06b fix(tui): check the record's tag feature and capability before the tag editor
QRun-IO/ci-policy: Original QQQ CLI verification and package capture / secrets (pull_request) Successful in 18s
QRun-IO/ci-policy: Original QQQ CLI verification and package capture / verify (pull_request) Successful in 1m50s
QRun-IO/ci-policy: Original QQQ CLI verification and package capture / gate (pull_request) Successful in 16s
QRun-IO/ci-policy: ci / original-cli (pull_request) Successful in 2m8s
QRun-IO/ci-policy: ci / ci-result (pull_request) Successful in 6s
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / Scoped workflow [workflow 1e25bb5a243dfdcd95d4b9a4f780200ff8c8778a] (pull_request) Successful in 8s
QRun-IO/ci-policy: native / native-result (pull_request) Successful in 4s
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / android-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-business (pull_request) Skipped
QRun-IO/ci-policy: ci / original-mcp (pull_request) Skipped
QRun-IO/ci-policy: ci / original-voyage (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
The record screen opened the TagOverlay for any record whenever the
collaboration extension was present. On a table without the TAGS
feature, or for a role without the `tag` capability, the editor opened
and the save failed only when the server refused it.

openTags now calls getRecordFeatures for the record and opens the
overlay only when `features` contains TAGS and `capabilities.tag` is
true; otherwise it flashes "Tags are not enabled for this table." or
"Your role cannot tag this record.". The answer is ignored when the
screen has moved to another record meanwhile, and a request error is
flashed like any other.

Tests: the fake server answers /table/person/<id>/features from a
`recordTagPolicy` (enabled, allowed; reset with the rest of the
collaboration state), and enterprise.test.tsx presses t with the
feature off and with the capability denied and expects the message and
no overlay. The existing tag editor test keeps its defaults.

Carried locally by GG Forge since cli-v1.0.0.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: James Maes <james@kof22.com>
2026-11-06 08:45:03 -06:00
james.maesandClaude Fable 5.1 b126064144 fix(cli): open the browser on Windows without cmd /c start splitting the URL
openInBrowser used `cmd /c start "" <url>` on Windows. cmd treats `&`
as a command separator even inside an argument that was passed as one
string, so an OAuth authorization URL was cut at its first query
parameter: the browser opened the authorization endpoint without
client_id, state or redirect_uri and the loopback callback never
arrived. Only `qqq login --browser` was affected; the printed URL
worked when pasted.

The URL is now never shell text. The opener runs PowerShell
(QQQ_POWERSHELL, else powershell.exe) with a fixed -EncodedCommand,
`Start-Process -FilePath $env:QQQ_BROWSER_URL`, and the URL in that
environment variable; the child is detached, stdio ignored and
windowsHide set so no console window flashes.

Test (win32 only): stubs child_process.spawn to capture the call,
checks the command is not cmd, the URL is in the environment and
windowsHide is set, then runs the captured encoded command in a real
PowerShell with Start-Process shadowed to print its -FilePath, and
expects the full URL back, `&` and all.

Carried locally by GG Forge since cli-v1.0.0.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: James Maes <james@kof22.com>
2026-11-06 08:44:33 -06:00
james.maesandClaude Fable 5.1 a7767ba76c fix(core): pass DPAPI secrets to PowerShell over stdin, not the command line
The Windows keyring (DpapiFileStore) interpolated the secret into the
PowerShell -Command string with JSON.stringify. A token was therefore
visible in the process list and in process-creation auditing for the
lifetime of the call, and PowerShell's own parsing could still mangle
quotes, backticks and $() inside the quoted value.

The secret now goes over stdin: the fixed command sets UTF-8 on both
console streams, reads stdin to the end, runs the protect or unprotect
step on that value and writes the result as compact JSON, which the
caller parses. Unprotect zeroes and frees the BSTR and disposes the
SecureString after reading. Any subprocess failure, non-zero exit or
non-string result is reported as "Windows credential protection failed;
check PowerShell and your Windows profile", never with the arguments.

Tests (win32 only): a round trip of a value with fake JSON, shell
syntax, Unicode and surrounding whitespace that must not appear in the
secrets file in clear, and a corrupt blob that must fail with the
redacted message. Run with QQQ_POWERSHELL=pwsh where Windows PowerShell
5.1 cannot load Microsoft.PowerShell.Security.

Carried locally by GG Forge since cli-v1.0.0.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: James Maes <james@kof22.com>
2026-11-06 08:44:17 -06:00
forge-recovery b42e4eb9b8 ci: restore original CLI capture and valid CI configuration
QRun-IO/ci-policy: ci / fork-guard (push) Skipped
QRun-IO/ci-policy: ci / head-profile (push) Skipped
QRun-IO/ci-policy: ci / application-template-0 (push) Skipped
QRun-IO/ci-policy: ci / gradle-1 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (push) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (push) Skipped
QRun-IO/ci-policy: ci / source-config-13 (push) Skipped
QRun-IO/ci-policy: ci / node-8 (push) Skipped
QRun-IO/ci-policy: ci / node-9 (push) Skipped
QRun-IO/ci-policy: ci / node-10 (push) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (push) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (push) Skipped
QRun-IO/ci-policy: ci / source-config-14 (push) Skipped
QRun-IO/ci-policy: ci / original-business (push) Skipped
QRun-IO/ci-policy: ci / original-voyage (push) Skipped
QRun-IO/ci-policy: native / fork-deny (push) Skipped
QRun-IO/ci-policy: native / dotnet-0 (push) Skipped
QRun-IO/ci-policy: native / native-result (push) Successful in 3s
QRun-IO/ci-policy: ci / repository-policy (push) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (push) Skipped
QRun-IO/ci-policy: Original QQQ CLI verification and package capture / verify (push) Successful in 2m28s
QRun-IO/ci-policy: Original QQQ CLI verification and package capture / gate (push) Successful in 9s
QRun-IO/ci-policy: ci / original-cli (push) Successful in 2m40s
QRun-IO/ci-policy: ci / ci-result (push) Successful in 3s
QRun-IO/ci-policy: ci / java-maven-7 (push) Skipped
QRun-IO/ci-policy: ci / original-mcp (push) Skipped
QRun-IO/ci-policy: ci / android-0 (push) Skipped
QRun-IO/ci-policy: ci / not-enrolled (push) Skipped
QRun-IO/ci-policy: Original QQQ CLI verification and package capture / secrets (push) Successful in 14s
QRun-IO/ci-policy: ci / java-docker-3-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (push) Skipped
2026-11-04 09:23:44 +00:00
forge-recoveryandCodex 074265e4d8 ci: retain unused native target notes outside CLI manifest
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-business (pull_request) Skipped
QRun-IO/ci-policy: ci / android-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-mcp (pull_request) Skipped
QRun-IO/ci-policy: ci / original-voyage (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: native / native-result (pull_request) Successful in 5s
QRun-IO/ci-policy: Original QQQ CLI verification and package capture / secrets (pull_request) Successful in 15s
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: Original QQQ CLI verification and package capture / verify (pull_request) Successful in 2m33s
QRun-IO/ci-policy: Original QQQ CLI verification and package capture / gate (pull_request) Successful in 8s
QRun-IO/ci-policy: ci / original-cli (pull_request) Successful in 2m44s
QRun-IO/ci-policy: ci / ci-result (pull_request) Successful in 3s
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
Co-Authored-By: Codex <noreply@openai.com>
2026-11-04 09:00:56 +00:00
forge-recoveryandCodex 2639b2cccd ci: adopt original CLI existing-tag package capture
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-business (pull_request) Skipped
QRun-IO/ci-policy: ci / original-mcp (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / android-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-voyage (pull_request) Skipped
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: native / native-result (pull_request) Successful in 3s
QRun-IO/ci-policy: Original QQQ CLI verification and package capture / secrets (pull_request) Successful in 15s
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
QRun-IO/ci-policy: Original QQQ CLI verification and package capture / verify (pull_request) Failing after 18s
QRun-IO/ci-policy: Original QQQ CLI verification and package capture / gate (pull_request) Failing after 8s
QRun-IO/ci-policy: ci / original-cli (pull_request) Failing after 30s
QRun-IO/ci-policy: ci / ci-result (pull_request) Failing after 4s
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
Co-Authored-By: Codex <noreply@openai.com>
2026-11-04 08:04:24 +00:00
james.maesandClaude Sonnet 5.5 943721edef chore(deps): stop at TypeScript 6.0.3; TypeScript 7 breaks openapi-typescript
QRun-IO/ci-policy: ci / ci-result (push) Successful in 4s
QRun-IO/ci-policy: ci / node-4 (push) Successful in 26m56s
QRun-IO/ci-policy: Shared Node CI / gate (push) Successful in 17s
QRun-IO/ci-policy: ci / fork-guard (push) Skipped
QRun-IO/ci-policy: ci / gradle-0 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-1 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-2 (push) Skipped
QRun-IO/ci-policy: ci / node-3 (push) Skipped
QRun-IO/ci-policy: Shared Node CI / verify (push) Successful in 4m8s
QRun-IO/ci-policy: Shared Node CI / secrets (push) Successful in 35s
QRun-IO/ci-policy: ci / source-config-5 (push) Skipped
QRun-IO/ci-policy: ci / not-enrolled (push) Skipped
CI (npm run generate) failed with TS 7: openapi-typescript 7.13.0 uses
ts.factory from the TypeScript JS API, which the native 7 compiler lacks.
6.0.3 builds, generates an identical schema, and passes all suites.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 17:26:16 -06:00
james.maesandClaude Sonnet 5.5 fd6f7ff6b9 chore(deps): TypeScript 7.0.2 and @types/node 26.6.6
Supersedes the Dependabot PRs for both. TypeScript 7 stops loading all
@types packages implicitly, so the base tsconfig names node; @types/node 26
rejects an undefined assertion message, fixed in one conformance test.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 17:26:15 -06:00
james.maesandClaude Fable 5.1 3a4f8a6727 feat(presence): show connection counts from per-session presence
Two terminals of one user collapsed into one viewer. With collaboration
1.2.0 (qbit-collaboration #54) the snapshot says how many connections
each viewer has, and perConnection=true lists each connection.

- core: PresencePerson.connections, PresenceState.connections, an
  opt-in perConnection that fills person.leases (mode, field, start,
  this client's own lease marked self via the server's opaque id)
- TUI: the record strip, panel ("Admin x2 (you)", one line per
  terminal) and Viewing now entry show counts; the record presence
  joins with perConnection; the screen saver's Online tile counts
  connections ("2 online - you x2")
- qqq collab presence: connections column, --per-connection rows
- regenerated the client from the collaboration 1.2.0 document,
  read from the local feat/per-session-presence worktree until it
  lands on develop (extension-sources.json says so)

Servers before 1.2.0 send no connections: every person counts once and
nothing changes on screen; tests cover both.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-01 16:45:24 -06:00
james.maesandClaude Fable 5.1 e4de04e510 feat(tui): splash screen and profile picker on start (#21)
QRun-IO/ci-policy: ci / fork-guard (push) Skipped
QRun-IO/ci-policy: ci / gradle-0 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-1 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-2 (push) Skipped
QRun-IO/ci-policy: ci / node-3 (push) Skipped
QRun-IO/ci-policy: Shared Node CI / gate (push) Canceled after 0s
QRun-IO/ci-policy: Shared Node CI / secrets (push) Canceled after 0s
QRun-IO/ci-policy: ci / ci-result (push) Canceled after 0s
QRun-IO/ci-policy: Shared Node CI / verify (push) Canceled after 2m13s
QRun-IO/ci-policy: ci / node-4 (push) Canceled after 2m12s
QRun-IO/ci-policy: ci / source-config-5 (push) Skipped
QRun-IO/ci-policy: ci / not-enrolled (push) Skipped
qqq ui opens on a splash (Query animated beside the qqq wordmark, version line, boot status line). With several profiles and none named, the Servers picker asks which to connect to (last used preselected, asynchronous probes, n adds, Esc quits with a hint); one profile or --profile/QQQ_PROFILE/--server connects straight away; no profiles opens the add form. Sign-in failures stay on the splash with retry, choose another, add, or quit. --no-splash, QQQ_UI_NO_SPLASH=1 or ui.splash off restores the old sign-in screen first. Behaviour change: with several profiles and a default set, the TUI now asks instead of connecting to the default.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-01 13:58:17 -06:00
james.maesandClaude Fable 5.1 4f96ab0c03 feat(tui): Shift+F1–F10 bank with a second key-bar row (#20)
⇧F1 Keys, ⇧F2 Servers, ⇧F3 SQL, ⇧F4 Bulk, ⇧F5 Metadata, ⇧F6 Views, ⇧F7 Copy, ⇧F8 Export, ⇧F9 History, ⇧F10 Assistant; keys that do not apply are dimmed and explain why. Two bar rows from 30 lines (:fkeys one|two|auto), or the Shift row swapped in for 2 s after a Shift+F press; clicks on the Shift row work. Key decoding covers xterm modifier forms, kitty codes and legacy VT220/rxvt numbering; a guarded stdin rewrite delivers Shift+F3, which OpenTUI 0.8.1 otherwise drops as a cursor-position reply.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-01 13:42:23 -06:00
james.maesandClaude Fable 5.1 9e6cad281c feat: Save as PDF through the download flow; Content or Screen prints; app header and footer (#19)
Save as PDF… is the first printer-picker entry and saves through the download flow (file dialog or silent download folder, stamped names, overwrite confirmation); :print pdf; qqq print … --to-file [path]. On non-record, non-grid screens Ctrl+P asks Print what? (Content: panels as titled sections without sidebar, title bar, key lines or borders; Screen: the terminal as drawn). Every document carries the app header (instance, breadcrumb, server, user, time) and footer (client and server, filter/sort line, Page n of m), rendered by qbit-printing 2.2 (printingRenderToPdf).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-01 13:34:21 -06:00
james.maesandClaude Fable 5.1 1d7e0af3cc fix(tui): screen saver counts signed-in sessions; Query art from the real logo (#18)
The Online tile reads the session store's storedSession table first (active sessions and distinct users), falls back to you plus collaboration presence, never says 'nobody around' while signed in, and the saver and lock keep the presence lease. The Query mascot is regenerated at three sizes from the qrun.io/query hero SVG in the logo's indigo (packages/tui/scripts/gen-query-art.mjs), with landmark tests per size.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-01 13:30:14 -06:00
james.maesandClaude Fable 5.1 650f1d33db fix(tui): render assistant answers; F12 toggles the panel (#17)
A shared markdown renderer in core handles entities, headings, lists, bold/code and pipe tables for assistant answers; links render as 'label ↗' numbered once per target (Tab, Enter, u); the CLI prints the same blocks as sub-tables. F12 toggles the Assistant panel on every screen, keeping the conversation, context and draft; Esc hides; Ctrl+G, :ask and a click on 12Ask do the same; the F-key bar gains 11/12Ask at 120+ columns.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-01 13:19:36 -06:00
james.maesandClaude Fable 5.1 f180a12750 fix(cli): broken-pipe exits are quiet on every path; deterministic EPIPE tests (#16)
isBrokenPipe also covers ECONNRESET, ERR_STREAM_DESTROYED and ERR_STREAM_WRITE_AFTER_END; an uncaughtException handler exits 0 on a broken pipe; io.out/io.err go through safeWrite; the top-level catch exits 0 immediately. The tests close the read end before the first write and after the first chunk of a 5,000-record answer.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-01 13:13:24 -06:00
james.maesandClaude Fable 5.1 924fddae25 packaging: qqq 1.0.0 checksums; update-packaging refuses missing or zero sums (#15)
docs/packaging carries the real sha256 sums from the cli-v1.0.0 release. scripts/update-packaging.mjs now parses shasum lines strictly, requires 64 lowercase hex and non-zero sums for every target, validates both files before writing anything, and exits 1 with nothing written otherwise; covered by scripts/update-packaging.test.mjs (npm test runs test:scripts).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-01 13:03:32 -06:00
james.maesandClaude Fable 5.1 1bc4ddd0be release: qqq 1.0.0 (#11)
qqq 1.0.0: the command-line client and the full-screen terminal UI (qqq ui) for QQQ applications over the UI API (/qqq/v1), with @qrun-io/qqq-cli 1.0.0, @qrun-io/qqq-core 1.0.0, @qrun-io/qqq-ui-api-client 1.8.0 and @qrun-io/qqq-ui-api-conformance 1.6.0 going final together. Squash of the release/1.0.0 branch at 79ba68e (the branch is kept with the full signed history; the tags v1.8.0 and cli-v1.0.0 point at that commit, which is what the released binaries were built from). See CHANGELOG.md [1.0.0] and docs/release-notes/1.0.0.md.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-01 12:49:06 -06:00
james.maesandCodex 603c09035b ci: adopt managed orb 0.8 patch track (#8)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 15:55:30 -05:00
james.maesandCodex 9294d3ee6b ci: adopt shared orb 0.7.17 (#7)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 14:17:41 -05:00
james.maesandCodex ff248b62c2 ci: adopt central orb 0.7.12 and stable gates (#6)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 08:49:28 -05:00
james.maesandCodex 2f193c088b ci: adopt shared orb 0.7.11 (#5)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 00:53:13 -05:00
james.maesandCodex 18723ae8c2 ci: centralize CLI verification and package publishing (#4)
Co-authored-by: Codex <noreply@openai.com>
2026-10-20 19:50:29 -05:00
james.maes 9816569a3d Merge pull request #1 from QRun-IO/feature/initial-cli
feat: reference CLI, generated UI API client, mock and conformance suite
v1.6.0-rc.1
2026-10-15 13:46:04 -05:00
james.maesandClaude Opus 5.5 77bc4badce chore: target QQQ 4.1.0-RC.15 (UI API 1.6.0)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 12:27:10 -05:00
james.maesandClaude Opus 5.5 6df221e110 fix(conformance): jobs not enabled on a server is a skip, not a failure
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 12:25:45 -05:00
james.maesandClaude Opus 5.5 628c86d605 ci: CircleCI build and test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 12:20:50 -05:00
james.maesandClaude Opus 5.5 754eed4fe7 feat(client): generate from the merged UI API 1.6.0 document (core, esb, health and eight qbit extensions)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 12:20:26 -05:00
james.maesandClaude Opus 5.5 7669b55b2a chore: LF line endings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 11:47:21 -05:00
james.maesandClaude Opus 5.5 ea79ddeb78 feat: reference CLI, generated UI API client, conformance suite and dev IdP
- @qrun-io/qqq-ui-api-client: typed client generated (openapi-typescript +
  openapi-fetch) from the merged UI API document; device-flow sign-in, refresh,
  UiApiError (BasicErrorResponseV1), SSE reader
- @qrun-io/qqq-cli: qqq login/whoami/apps/tables/query/get/run/jobs/tail,
  only through /qqq/v1 with Authorization: Bearer
- @qrun-io/qqq-ui-api-conformance: black-box suite + qqq-dev-idp
- scripts/merge-spec.mjs, Prism mock, CI and GitHub Packages publish workflows

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 11:47:12 -05:00
james.maes 1e5b832116 Initial commit 2026-10-15 10:56:15 -05:00