30 Commits
Author SHA1 Message Date
james.maesandClaude Opus 5.5 75a8d55da2 build(deps): align with Gitea registry (parent 2.2.1, QQQ 4.1.0-RC.26)
maven / build (push) Successful in 9m43s
build / maven (push) Successful in 13m48s
pom.xml: parent -> 2.2.1
pom.xml: qqq.snapshot.version: 4.1.0-RC.15 -> 4.1.0-RC.26
pom.xml: removed Central snapshot repository
pom.xml: added qqq.version=4.1.0-RC.26 (parent BOM import)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 18:04:20 +00:00
james.maesandClaude Opus 5.5 6af1362668 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:06 -05:00
james.maesandClaude Opus 5.5 a9550d82b4 feat(ui-api): extension for QQQ UI API 1.6.0 (operationIds, BasicErrorResponseV1, QQQ 4.1.0-RC.14)
Regenerated against UI API 1.6.0: every operation has an operationId and
the standard error responses (BasicErrorResponseV1: error, code, message,
fieldErrors, traceId); the extension's own error schema is kept but
deprecated; hand-written error bodies go through QJavalinUtils so they carry
code/message/traceId. Extension MINOR bumped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 11:48:12 -05:00
james.maesandClaude Opus 5.5 e9e3e59225 fix(help): the help bundle carries the artifact version (Maven-filtered) instead of a hardcoded SNAPSHOT
On release branches the bundle's version and the producer's differed, so the
bundle test that asserts they match failed, and released bundles recorded
SNAPSHOT as their provenance. help/*.yaml is now filtered:
version: ${project.version}.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 22:00:05 -05:00
james.maesandClaude Opus 5.5 2fc2485fd8 Merge origin/develop into feature/health-checks; pin QQQ 4.1.0-RC.8
RC.8 ships the central health kernel (QRun-IO/qqq#1207).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 21:18:17 -05:00
james.maesandClaude Opus 5.5 be27514a58 feat(help): ship the qbit-quick-search help bundle through QQQ help bundles, with coverage gate
Host-neutral help (deployment-specific facts removed), registered with
HelpBundles, gated by HelpBundleAssertions. QQQ 4.1.0-RC.7.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 20:37:08 -05:00
james.maesandClaude Opus 5.5 2ccf082493 build: qbit-build-parent 2.1.0 with architecture guardrails enforced
Enforce the qbit-bom#10 guardrails (G1, G3, G4, G7) and run tests in
strict raw-route mode (G2). All pass on the released QQQ 4.1.0-RC.6.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 07:15:19 -05:00
james.maesandClaude Opus 5.5 a099a1d1b5 feat(api): QuickSearchStatus API and spec'd GET /qbit/quick-search/status
Hosts no longer need QuickSearchOpenSearchClient or a copy of this qbit's
diagnostics. The new public api package holds:
- QuickSearchStatus, an immutable snapshot: overall state, cluster
  reachability, per-table index counts, backlog, last sync, last error
  and checkedAt;
- QuickSearchStatusService.get(), bounded and cached for five seconds,
  built on the existing diagnostics;
- QuickSearchApi, with the app name and home href, so hosts link to the
  Quick Search home instead of duplicating it.

The same data is served as UI API extension operation
GET /qqq/v1/qbit/quick-search/status (getQuickSearchStatus), gated by the
admin permission. The fragment is committed and checked by a contract
test. The core baseline becomes 4.1.0-RC.6.

Closes #50 (architecture review QRun-IO/qqq#1150, finding F10).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:55:28 -05:00
james.maesandClaude Opus 5.5 1354179666 feat: Quick Search record developer panel provider
Adds QuickSearchDeveloperPanelProvider (id quickSearch, order 400) for
QQQ's record developer view, registered by the QBit component producer
QuickSearchDeveloperPanelsMetaDataProducer. Shown on indexed tables to
users who may read Quick Search Index: the index row, latest index run,
the record's indexed document vs the database (RecordInspector; debug
permission), failed index events, the Inspect / Reindex record actions
the user may run, and admin links. An unreachable OpenSearch yields a
warning block, not a failed panel.

Builds against QQQ 4.1.0-RC.4 (developer panel contract, QRun-IO/qqq#1076).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 10:44:51 -05:00
james.maesandClaude Opus 5.5 316ac9484f feat: serve QQQ /qqq/v1/search from OpenSearch (record-search provider)
Implements QQQ core's RecordSearchProviderInterface so the Next UI global
search (POST /qqq/v1/search) is served from the Quick Search index for the
tables this QBit indexes. The provider returns record ids only; core re-reads
them through QueryAction, so table permissions, record security locks and
labels stay core's job. One bounded _msearch per call, with a short backoff
after a failure during which core falls back to its own LIKE search.

Builds against the released QQQ 4.1.0-RC.2, the first release that carries
the SPI (replaces the 4.1.0-SNAPSHOT pin from PR #32).

Re-signed from PR #32 (originally 75dc2b3).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 13:23:22 -05:00
james.maes 36bc0fb6f1 build: prepare QQQ releases and align Apache-2.0 (#8)
* ci: retain main tests and gate GA publication on tags

Refs QRun-IO/qqq-all#10. Preserve reviewed selectors; version pins remain separate and publication remains gated.

* ci: pin settings-safe QQQ orb 0.6.8

Use the reviewed immutable release tooling for QRun-IO/qqq-all#10.

* fix: align first-party Apache-2.0 declarations

Refs QRun-IO/qqq#923.

* build(#921): update AssertJ test dependency to 3.27.7

Apply the independently reviewed one-pin test dependency update. Preserve revision, parent, CI and production source. Full verify passes; tracking: QRun-IO/qqq#921.
2026-10-05 09:50:27 -05:00
james.maes 0cd892d1a0 feat: 1.0 release readiness (#10)
* docs: add 1.0 PRD, deep-dive audit, plan, and session state

* build: target qqq 4.1.0-RC.1, opensearch-java 3.10.0, wrapper 3.9.11, real JaCoCo gate

* feat: add 1.0 config surface, instance-scoped runtime, and deprecated static facade

* feat: implement the 4.1 QBit contract with a record-change listener and failed-event capture

* feat: opensearch client with auth modes, TLS, timeouts, mapping v2, aliases, versioned bulk writes

* feat: trustworthy indexing steps and permission-aware bounded search

* docs: rewrite README for 1.0, add CHANGELOG and migration guide

* feat: table picker and result screens for the maintenance processes; close out 1.0 planning docs

* docs: add AGENTS.md so Codex shares the CLAUDE.md guidance

* fix: keep the live index after an alias swap, atomic legacy upgrade, exact paging under record locks

From the PR #10 review: never delete the new physical index once the alias points at it, upgrade a legacy concrete index in one aliases request, base hasMore on raw hits so filtered pages stay reachable, and deduplicate requested table names.

* docs: explain the hasMore trade-off under record locks

* docs: session state for the RC.1 hand-off
2026-10-05 09:50:05 -05:00
james.maes 000e5bb1cf build: re-pin to qbit-build-parent 2.0.0, fix index drift (#7)
Closes #6. Part of QRun-IO/qqq-all#1.
2026-09-25 20:36:56 -05:00
james.maes fa036c8e18 chore: bump develop to 0.2.1-SNAPSHOT 2026-03-30 06:50:00 -05:00
james.maes c888b771e7 chore: release 0.2.0 (#5)
* chore: bump version to 0.2.0-SNAPSHOT

* feat: add config-driven table indexing API (#3)

Add SearchableFieldConfig and SearchableTableConfig classes that let
host apps declare searchable tables via config instead of requiring
annotations on entity classes. Both annotation and config paths merge
during produce(). Includes record label override, null-safe formatting,
within-source duplicate detection, and updated validation.

* chore: release 0.2.0
2026-03-30 06:48:59 -05:00
james.maes cfeff9159b feat: add config-driven table indexing API (#3)
Add SearchableFieldConfig and SearchableTableConfig classes that let
host apps declare searchable tables via config instead of requiring
annotations on entity classes. Both annotation and config paths merge
during produce(). Includes record label override, null-safe formatting,
within-source duplicate detection, and updated validation.
2026-03-30 06:27:21 -05:00
james.maes 674030a952 chore: bump version to 0.2.0-SNAPSHOT 2026-03-29 15:52:30 -05:00
CircleCI 41a02f8413 Bump version to 0.1.0-RC.1 [skip ci] 2026-03-29 20:51:35 +00:00
james.maes 1330d22595 chore: release 0.1.0 2026-03-29 15:46:06 -05:00
james.maes 2b3c56de0c fix: use Apache 2.0 license consistently across all files 2026-03-29 11:06:01 -05:00
james.maes 9d38170afe chore: add standard QBit repo files and SDLC setup
Add CONTRIBUTING.md, CODE_OF_CONDUCT.md, CODE_STYLE.md, SECURITY.md.
Copy checkstyle config from qbit-webhooks. Switch LICENSE to AGPL v3.0
to match QRun-IO org standard. Update .gitignore to standard template.
Rewrite README following qbit-crm pattern with badges and full docs.
Set version to 0.1.0-SNAPSHOT for develop branch.
2026-03-29 07:22:24 -05:00
james.maes b593401a75 feat: add end-to-end integration test with Testcontainers
OpenSearch integration test with 5 test cases: index creation, full
reindex, search results, pagination, no-results. Gracefully skipped
when Docker is unavailable. Bumped Testcontainers to 1.21.0.
2026-03-29 07:10:01 -05:00
james.maes 6d914ec9f4 feat: add OpenSearch client with batching, mappings, and proper lifecycle
Bump jackson-datatype-jsr310 to 2.21.0 to align with jackson-databind from BOM.
2026-03-28 17:54:26 -05:00
james.maes 24c0da4f63 chore: clean slate for v1 clean-room rewrite
Remove all existing Java source and test files. Remove template docs.
Remove unused javalin dependency. Raise JaCoCo thresholds to 70%/90%.
2026-03-28 15:14:30 -05:00
james.maes 763371a32d chore: bump qqq to 0.40.0-SNAPSHOT 2026-01-10 21:05:14 -06:00
james.maes ecf8594846 fix: add Java 21 compiler settings and JsonIgnore on getDocumentId 2026-01-09 14:13:27 -06:00
james.maes 0dd1c0a195 refactor: use qbit-build-parent and standardize CI config 2026-01-09 13:56:55 -06:00
james.maes 7090cedeb3 fix: add JavaTimeModule for Instant serialization in OpenSearch client 2026-01-09 13:49:26 -06:00
james.maes bf1c5f7831 feat: implement Quick Search QBit with OpenSearch integration
Add QBit for global search across QQQ applications via OpenSearch.
Includes annotation-driven indexing, full/basepull reindex processes,
delete customizer for index sync, and testcontainers integration tests.

- 18 source files with Apache 2.0 license headers
- 68 unit tests, 9 integration tests (testcontainers)
- Configurable OpenSearch connection with optional auth/SSL
2026-01-09 13:24:45 -06:00
james.maes ffefd8f148 Initial commit 2026-01-09 11:56:58 -06:00