CLI qqq assistant ask/config, the TUI Assistant panel (Ctrl+G, :ask), the kernel Assistant module, the
base64 link filter fix and the enterprise server's ANTHROPIC_API_KEY handling are folded into the
structured entry with commit ids; the release notes get an Assistant section saying what the server needs.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The CHANGELOG bullets added by accretion since bedbf69 are merged into the structured entry (CLI history
and table stats, TUI history screen, one saver bullet instead of three fixes, Search coverage hint,
collaboration at the bottom, popups and widgets) with commit ids. Release notes, README and TRY-IT mention
history, stamped export names and the new keys.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The client document's 17 printing 2.0.0 operations are the generated qqq printing subcommands (print
agent side). printTableList and printText are processes the kernel runs, reached as qqq print list and
qqq print text, not as qqq printing subcommands. Every operation count in the docs is 219, the length of
OPERATIONS in @qrun-io/qqq-core (generated from the merged document); no 202 remains outside the rc.1 notes.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The 1.0.0 entry had grown by accretion (Added/Changed/Fixed since rc.1 beside older sections). It is now
one entry with Added, Changed, Fixed, Security and Known limitations, grouped by area (CLI, terminal UI,
kernel and client, packaging and CI), deduplicated, with the commit of each post-rc.1 change. The release
notes describe what qqq is, the UI keys, the CLI highlights, compatibility, install, known limitations and
the enterprise test server, and the command sequence matches the real tags, orb 0.8.33 and the tap and
bucket repositories. The client README and runbook counts and checklist are brought up to date.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
printTableList sends a grid's table, columns, widths, filter and sort with
the scope (all rows, this page, or selected rows) to printingPrintTableList
and passes the server's row-limit note on; printText prints text such as a
screen capture. listScopeChoices orders a grid's print choices: all rows
first when the grid is filtered or small, this page first otherwise, the
10,000-row limit named, and the selection as a list or as record sheets.
The client document's printing entry moves to 2.1.0.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Appends qbit-printing's committed extension document (printing 2.0.0,
17 operations under /qbit/printing) to the client document with
merge-spec.mjs, keeping the other documents untouched, and regenerates the
schema and operation index (219 operations). The registry knows printing
with minimum 2.0.0: the realtime channel became the agent's prerequisite
there, so a 1.x server counts as not installed.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
CHANGELOG 1.0.0 gains the -o/--order convention with its migration note
and the extension table output under "Changed since 1.0.0-rc.1", and the
ESB trigger, login profile, health fallback and conformance fixes under a
new "Fixed since 1.0.0-rc.1". README, the cli and conformance package
READMEs, TRY-IT, the 1.0.0 release notes and the parity matrix (and its
generator) use --order for the sort and -o/--out for files.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The CLI ships for macOS and Windows and has Keychain and DPAPI keyring
paths, but CI only ran Linux. qqq-orb 0.8.33 adds opt-in platform lanes to
the cli profile, and the setup config's 0.8 track picks the release up by
itself, so the manifest only needs platforms: [macos-arm64, windows-x64].
Rendered with the orb's generate_pipeline.py from v0.8.33 against this
manifest: a push to main yields cli-macos-arm64, cli-windows-x64 and
cli_verify_publish; the tag v1.8.0 yields the same in publish_release with
the publish job requiring both lanes and bound to the registry context.
ci-lanes.md now describes what runs (and that the lanes cover the Node
packages' build, tests and lint, not the binaries or the TUI), keeping the
0.8.32 gap list and proposal as history. The runbook marks the orb item
done, says a missing macOS or Windows resource class now holds a publish,
and no longer claims the Windows lane runs verify-binary.ps1.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
docs/ had no index, so a reader could not tell the runbook from the
historical plans. docs/README.md now describes every file under docs/.
The runbook, ci-lanes and 1.0.0 release notes still spoke as if rc.1
were pending and left the Scoop bucket undecided. They now name
QRun-IO/homebrew-tap and QRun-IO/scoop-bucket, state that the 1.0.0
version step is done on release/1.0.0, note what qqq-orb PR #165 changes
about publishing, describe the installer's stable default, and the
release notes list the Homebrew and Scoop commands. The generic rc-to-final
recipe keeps its -rc.N placeholders on purpose.
Two links in parity/next-feature-matrix.md pointed at files that exist
only in qqq-frontend-next; they now use absolute GitHub URLs. Its content
is otherwise untouched. Every relative Markdown link now resolves.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The homebrew-tap profile's validator rejects a setup caller that runs on
tags, so the tap's .circleci/config.yml is now byte-for-byte the one in
QRun-IO/homebrew-qctl (tags: ignore). brew style flags a formula without
the frozen_string_literal magic comment, so it is added; the 64-hex zero
placeholders stay so scripts/update-packaging.mjs still fills them.
The formula and Scoop manifest placeholders now name 1.0.0 instead of
1.0.0-rc.1, and the packaging notes name QRun-IO/scoop-bucket, say that
the tap's CI executes only the Linux x64 binary (macOS downloads are
fetched and checksummed, not run), and that the bucket uses the
ScoopInstaller BucketTemplate Actions with Excavator auto-updating on new
cli-v* releases.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
All four packages go final together, with the exact workspace pins, so
the orb publishes them as latest. The CHANGELOG's rc.1 entry becomes
"## [1.0.0] - YYYY-MM-DD" (date to fill in on release day),
docs/release-notes/1.0.0.md is the release body with the final sequence
(tags v1.8.0 and cli-v1.0.0, gh release --latest, dist-tag latest), the
README, the CLI README and TRY-IT drop the rc version and @rc, and the
runbook says this branch is fast-forwarded onto main the day rc.1
feedback is accepted. node scripts/release.mjs --check is READY for
1.0.0.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Found on the fix-branch sample (8bf6a5a66, private server on 8091): grid
cells showed REVEAL secrets and raw RENDER_HTML; they are now drawn like the
record view (masked, text, CHIP brackets). A WIDGET-adorned field with a
plain value shows the value. Create forms ask for a text primary key (the
archive table's file name) and leave out generated numeric keys. Parity
notes record what was verified live there: weekday criteria (QRY-085
pass), case-insensitive matching, AdornmentLab adornments, the composite
association, the locker refusal, uploads and downloads, sharing, saved
report setup, help. NAV-030 and PRC-020 stay blocked.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs/release-notes/1.0.0-rc.1.md is the user-facing release body (install
table, the Gatekeeper and SmartScreen notes, getting started, what is in
it, known limitations), with the exact rc.1 command sequence for James
in an HTML comment that GitHub does not render. release.mjs prints
--notes-file with that file when one exists for the version, else the
CHANGELOG section.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
scripts/soak.sh drives the real TUI in tmux with random keys from the keymap
(F-keys, arrows, paging, Tab, Esc, Enter, single keys, : commands) and fails
on an exit or an error boundary, keeping the last 20 frames; nothing that
quits, saves, confirms a delete or exports is sent (QQQ_UI_NO_QUIT=1 ignores
a Quit chosen from a menu). The theme picker keeps a theme for every profile
or this one. README and TRY-IT: options, environment, per-screen keys, the
settings file, themes. SEC-030 is blocked on qqq-cli#10 and qqq#1359.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The base brought its own sharing module, a manageSession password sign-in and render-model
additions. The CLI now uses records/sharing.ts for qqq share, keeps its sessionId-cookie sign-in
as signInWithPasswordCookie next to the TUI's signInWithPassword, and the render model keeps both
sides: the web's wording and empty states from this branch, the TUI's pairs for the saved report
setup widgets (saved-report show still words them as the web does), its bar-chart default,
fieldValueList indents and block markers. Finding 28 is qqq#1359; SEC-030 also cites qqq-cli#10.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The navigation, widget and report rows were the last open CLI rows. The kernel render model now
follows the web's widget contracts (multiStatistics values, location, usaMap, generic, cronUI,
dynamicForm, pivot and filter setups, rowBuilder, every composite block, table extras, chrome,
empty states, the dropdown message), and a loader fetches widgets as ConnectedWidget does:
metadata first (unknown or denied widgets cost no request), parent widgets load their children,
data bag and script viewers read their records, dashboards load every widget once at once.
On top: qqq home, qqq find, apps show --widgets, widget get --record/--run; report run through
the report's process (input fields, GET /download) or the report route; qqq saved-report
(show, preview incl. through an application API, run, set filter/sort/columns, pivot, schedule)
and qqq share for any shareable record. A WIDGET-adorned filter field in a process takes the
filter grammar. Printed filters no longer mark case-sensitive matches (the TUI builds criteria
without options, and its footers must not change).
The sample has no reports, saved reports or editor widgets; stub-server CLI tests cover them.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
AUTH_0 signs in in the browser (authorization code + PKCE with the API
audience, code exchanged at the tenant, the token handed to manageSession)
and can end the Auth0 session on sign-out. F1 uses the kernel's help
entries (app, widget, instance, table, process, step) with readable places;
:helpkeys shows every help slot key. The grid footer shows the column's
help. scripts/perf-large-table.sh times a 10,000 x 40 table on the fake
large-instance server: first page ~100 ms, record 10,000 ~40 ms, column 40
~350 ms. Parity: TUI 330 pass, 67 n/a, 3 blocked, 1 todo (SEC-030: needs a
real Auth0 tenant).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
TABLE_BASED servers could not be signed in to at all. The server's TableBasedAuthenticationModule
accepts HTTP Basic credentials on any route, inserts a session and answers with a sessionId
cookie; qqq login --username now does that once (password asked, or QQQ_PASSWORD), keeps only
the session and sends it as the sessionId cookie, which the typed client could not do, so the
CLI wraps its fetch. A refused password stores nothing; logout ends the session.
AUTH_0 servers were refused by the native sign-in discovery. The client now builds the sign-in
from the tenant, the native (or SPA) client id and the audience, which Auth0 needs to issue a JWT
the server can verify. No AUTH_0 server exists to run it against (finding 28).
DISABLED tables and processes come in the metadata with their permissions false; the CLI lists
them with the reason and refuses query, writes, copy (insert needed), bulk commands and process
run before any request, as the web explains the denial.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
qqq ruled that CONTAINS, STARTS_WITH and ENDS_WITH are case-sensitive by design (finding 11,
qqq#1344) and that clients opt in per criterion with CriteriaOption.CASE_INSENSITIVE. The
grammar and quick search now add the option to every text match; ~= , OPERATOR:CS and
--case-sensitive ask for a case-sensitive match, and printed filters mark those with :CS.
The option does not reach the backend over v1 yet: QFilterCriteriaDeserializer ignores
options and the spec does not declare them (finding 27), so matching stays case-sensitive
until the server reads it. Finding 26 records the bulk mapping suggester problem the kernel
works around (it was cited as finding 11 by mistake).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The CLI column moves to 232 pass, 2 blocked (finding 19 for variant writes, finding 24 for
weekday criteria on H2) and 1 partial (NAV-028, navigation group next). Rows the sample cannot
exercise say unit-tested or stub-server tested in their note.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Bulk insert and bulk edit with a file (file navigator upload, column mapping
grid with typed defaults and field help, value mapping with the picker,
review with optional validation, result), bulk edit (switched-on fields) and
bulk delete; saved bulk load profiles (yours and shared, owner-only update
after a confirm listing the changes, delete); the upload template; table
actions list the bulk actions with their CLI commands. Verified live on the
sample: 2 person rows loaded from CSV, bulk edited, bulk deleted.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The bulk rows (PRC-016, 029-034, 046, 058-061, QRY-031/032/034) are verified live against the
sample, except saved profiles, which the sample does not offer: those are covered by a stub-server
CLI test. The matrix script gains a blocked status (a note must cite a server finding) so the
release gate can tell a server limitation from unfinished work.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Record view value columns start from the field set (DATE_TIME 30, dates,
numbers, text length) as well as the first record, so an empty first
record no longer cuts later values; still fixed while stepping.
Parity TUI column: the partials resolved: passes (live or unit-tested, said
in each note), browser-only n/a with the reason (icon fonts, logos, URL
state, rich-text and code editors), and blocked on server findings 13
(cancel keeps the run) and 21 (no search provider). Remaining partial: report
runs, the 10,000 x 40 budget, ad hoc widget buttons, bulk load (parked),
OAuth authorization code + PKCE.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The orb (PR #165) publishes all four packages as rc when any of them is
a prerelease and as latest only when all are final. The readiness gate
gains a package-versions line that refuses a final CLI version while
client, core or conformance is still a prerelease; release.mjs derives
the dist-tag from all four. The runbook's version table, the rc-to-final
step and the publish step follow the rule, and its signing step now
uses sign-macos.sh and sign-windows.sh.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Bulk load was the largest parity gap: the CLI could not load a file or change many records at
once. The kernel gains the bulk load model (table structure, v1 profile, mapping documents, the
server's suggestion cleaned per finding 11, mapping checks, diffs, upload templates) and
runBulkProcess, which drives the bulk processes through the runner with one callback per screen
(edit form, column mapping, value mapping, review), so the TUI can reuse it. Profile values go
as flat strings (fieldListJSON), cleared bulk-edit fields as "" (finding 23), and the file is
sent again after Back to the upload. BULK_LOAD_PROFILE_FORM no longer counts as an input, so the
result step is the last screen.
The CLI adds table bulk-insert, bulk-edit (--set/--clear, or --file with --key), bulk-delete,
table actions and bulk-profile list|show|save|rename|delete. Mapping comes from the server's
suggestion, a --mapping document (YAML/JSON), --column/--default, or -i prompts; the review is
shown, validation runs by default, and loading asks unless --yes (exit 2 without a terminal).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
docs/release-runbook.md goes from a green branch to 1.0.0 published:
James's checklist first (orb release, CircleCI plan, Developer ID and
notarization, Authenticode, the tap and bucket repositories, the publish
token, the go decision, each with what happens without it), what is
not verified, then version bumps, release.mjs, signing, tags and the
orb publish, the GitHub release, tap and bucket updates, the smoke after
publishing and recovery. The README and CHANGELOG describe the one
binary with qqq ui, the Gatekeeper prompt and the xattr workaround. The
orb proposal record gains the rc-versus-latest dist-tag change.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Version with "binary with ui", completion for four shells, qqq ui
--check naming the build, and with a server: login, doctor, whoami, a
query and a process run, in a temporary profile (file keyring, or the OS
keyring removed again). Run here on darwin-arm64 (both keyrings), in
Debian amd64, and the .ps1 under PowerShell 7 in a Linux container, all
against the sample server; never on Windows. The proposed lane YAML now
calls them and still validates; ci-lanes.md says Windows x64 and macOS
x64 stay unverified until the lanes run.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
docs/packaging/homebrew-tap/ is the whole tap repository (formula,
README, LICENSE, qqq-orb homebrew-tap profile); the formula moves there
as the single source, installs only bin/qqq with completions, says qqq ui
is bundled, and its test fails on a binary without the UI. The binary is
chmod 0755 before install: Homebrew downloads arrive without the
execute bit and the completion step runs the binary (found by installing
the formula in the homebrew/brew container, where it then installed,
passed brew test and wrote the three completion files). The Scoop
manifest describes the with-UI binary and notes the ConPTY requirement.
The packaging README covers Gatekeeper without notarization and the
xattr workaround, SmartScreen, and what is still unverified.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Exposed joins (QRY-020/021, REC-064): grid columns and filters take
joinTable.field (labels "Join: Field"); the kernel ResultCursor sends
the planned joins with query and count and reads the distinct count for
many-side joins ("3 rows (2 distinct)"); record sections show fields of
readable exposed joins through a joined query for the record.
- Quick filters (QRY-080/081): the filter dialog starts with the table's
quick filter fields (defaultQuickFilterFieldNames, else T1) and an add
row whose fields are remembered per table.
- Weekday criteria (QRY-085): the kernel grammar reads weekday(field) IN
1-7 or day names into a WeekdayOf fieldFunction (DATE_TIME fields get
WeekdayOfDateTime with the instance's arguments); the builder offers day
of the week is any of / none of. The sample rejects it: server finding 23.
- Bulk paste (QRY-088): list values accept pasted text split on commas,
tabs, semicolons and new lines, choice labels resolved to ids, with the
instance's bulkAddFilterValues help; bracketed paste reaches the focused
editor everywhere.
- First N (QRY-033): table processes run on the selection, the cursor
record, the whole result, or its first N records.
- Scanner screens (PRC-044): no heading or step list; Enter submits.
- Counted quick views (QRY-094): doCount views show their counts.
- Variant (REC-063): records and forms opened from a variant grid read
with tableVariant.
- The grid shows a failed query instead of keeping the previous rows.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The qbit-collaboration fix for #52 showed the presence qbit already sent
an empty viewers list; qqq core's SSE serializer removes it. Recorded so
the TUI's presence handling and the core fix point at the same cause.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Process step forms show DATE_TIME inputs in the local zone and send UTC
instants (kernel datetime); processes launched from a variant grid carry
tableVariant through the runner.
scripts/parity-matrix.py: the TUI column re-scored against what is built
now. Priority families (NAV, PRF, PRC, QRY, REC, REL): 150 pass, 44
partial with a reason, 13 named todo, 42 n/a. All rows: 180 pass, 49
partial, 103 todo, 69 n/a.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
James approved filing the 22 findings; one issue per finding except the
archive-table one (already open as #784), the two record-search ones
(one root cause, #1343) and the presence one (qbit-collaboration#52).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Publishing @qrun-io/qqq-core (blocking a usable CLI package) and opt-in
macOS and Windows lanes, written as a message for James with the
cli_publish.sh diff; the Node 22.12 row is green after the prompt fix.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
release.mjs passes --with-tui to the binary build. docs/packaging
records the three ways tried to ship qqq ui (one binary with the UI, a
second qqq-ui binary, npm with Bun), the sizes, what was smoke-tested
and what was not, and recommends one qqq binary with the UI bundled.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Developer mode and the TUI batch (Home screen, search-first F9, the
metadata index, audits, tags and developer screens).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Records the orb profile as verified in Docker (Node 22.12 image, no lint,
core never published, one platform), the Node 22.12-only prompt test
failure, and a proposal for macOS arm64 and Windows x64 lanes: an orb
change with a .qqq-ci.yml opt-in, or a second CircleCI pipeline whose
YAML validates with the CircleCI CLI. .circleci/config.yml is unchanged.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Brings in the TUI package and the hardening review (createProgram in
program.ts, qqq doctor, the golden-output suite). Resolutions: main.ts
from the base; program.ts prints versionText(), whose second line now
starts with "UI API client <version>" as the golden test expects and
adds the supported server range; the CLI package keeps the release
metadata with the base's exports and its new conformance dependency,
and conformance goes to 1.6.0-rc.2 because the CLI now ships against it.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>