Skip to content

release: 1.7.0 - #254

Merged
jpfaria merged 38 commits into
mainfrom
release/1.7.0
Oct 20, 2026
Merged

jpfaria merged 38 commits into
mainfrom
release/1.7.0

Conversation

@jpfaria

@jpfaria jpfaria commented Oct 20, 2026

Copy link
Copy Markdown
Contributor

Milestone 1.7.0 (16 issues). Features: kebab-case app names (#242), @job door (#243), @Inject builds *sql.DB through godror/pgx (#244), @server picks the plugins of each server (#247), complete examples/stock app (#227, #246). Fixes: #225, #230, #232, #234, #238, #240. This branch only bumps the version in README.md and docs/site/index.html.

release: 1.6.2 back to develop
docs(gitflow): match the flow the repo follows (#220)
docs(gitflow): only the tag carries v (#222)
…amples

fix(examples): regenerate the function examples (#225)
examples/stock is a stock with reservation built from every boost resource
it can use: REST, gRPC and MCP doors in app api, a CloudEvents/NATS function
in app worker, log and prometheus service middlewares, a memory or MongoDB
repository, a resty reserver that calls app api, the publisher announcing
stock.reserved, and @config options, each chosen by config. Defaults need
no infra. The tests run each door in process and each switch in a child
process. CLAUDE.md: a new resource lands in this app in the same PR.
feat(examples): add the complete stock app (#227)
…230)

The adapter logged "listening on :8080/" whatever port and path it used.
It now logs boost.bootstrap.function.adapter.cloudevents.http.port and
.path; the examples/stock worker test asserts it.
fix(function): log the port the cloudevents http adapter listens on (#230)
A Conflict means the state does not allow the call (HTTP 409); only a
duplicate is AlreadyExists. A gRPC client checking AlreadyExists for a
Conflict now gets Aborted.
fix(grpc): answer a Conflict with Aborted, not AlreadyExists (#232)
mongo Conn (v1, v2) gets Close, which disconnects its client; inject
generates a stop hook for it and for the redis Client and ClusterClient,
as the fx modules of mongo and redis now do. The examples are
regenerated.
fix(inject): close the mongo and redis clients when the app stops (#234)
The mongo datastore of the site example opened its conn by hand, so the
app never closed it and the factory plugins were left out. It takes the
*mongofact.Conn inject builds, with health and prometheus; gen/, the site
hero and the root README show the generated client.
…238)

They shared one, so an app taking both got only the first module.
fix(fx): give the redis client and cluster modules a sync.Once each (#238)
errors.NotFoundf adds " not found" to its message, so the stock example
answered "nope is not in stock not found" on REST, gRPC and MCP. Build the
error with NewNotFound, and say on each suffixing f-constructor of
model/errors that its format names the thing.
fix(examples): say once that an unknown sku is not in stock (#240)
An app named orders-updater was rejected, so services had to pick
names that no longer matched their repo or deployment. App names now
follow ^[a-z][a-z0-9]*(-[a-z0-9]+)*$:

- cmd/<app> and gen/builder/<app> keep the hyphens;
- the Go package drops them (orders-updater -> ordersupdater);
- the config path element is the camelCase that the koanf env loader
  produces, so ORDERS__UPDATER_FUNCTION_ADAPTER reaches
  ordersUpdater.function.adapter.

A name whose package would be a Go keyword or main is rejected.
Server names keep the old rule. The simple example's worker becomes
order-worker, so its child-process tests prove the env mapping end to
end. Golden test and README mapping table included.
feat(builder): accept kebab-case app names (#242)
@job(app=<name>) on a func(context.Context) error generates an app that
boots, runs the handler once and stops: exit 0 on nil, 1 on an error
logged at ERROR. SIGTERM cancels the handler's context; a job cut short
exits 1. bootstrap/job holds the handler type and fx/modules/bootstrap/job
runs it. A job app runs nothing else: a server or a @function in it fails
the generation.

builder/examples/simple gains app stock-audit, with e2e tests of the three
exits, and examples/stock gains app stock-check.
feat(builder): @job door, an app that runs one function and exits (#243)
…ries (#244)

A *sql.DB parameter with @Inject(index=0, name=gold, drivers=[godror]) is
now a client inject builds: the driver names the boost factory (godror or
pgx), the config lives under boost.factory.<driver>.clients.<name>, the sql
plugins (health, otel, datadog) are passed as values and the module closes
the DB when the app stops.

Exactly one driver; consumers of one DB name the same driver or only one
names it; a DB no consumer names a driver for, drivers on a DB the app
provides, or a default DB another generator asks for without a driver fail
the generation. examples/stock gains an oracle stock on the generated DB.
feat(inject): @Inject builds *sql.DB through the godror and pgx factories (#244)
@server(type=, name=, app=, plugins=[...]) in the package doc of
internal/pkg/server/<transport>/ makes the door provide the []Plugin of the
server: one table of plugin names per type (rest, grpc, mcp, cloudevents),
so a new server type is a new row. A server with no @server and no
@provide []Plugin gets the default set of its type; config only turns one
plugin off.

- annotation: package docs, collected when the collector opts in
- inject: package entries are no component
- cloudevents otel plugin: disabled keeps the adapter's options
- examples/stock: plugins.go gone, @server and the shared REST model under
  internal/pkg/server; tests for a plugin on and one turned off
- site shop, root README, examples: @server, gen regenerated
feat(builder): @server picks the plugins of each server type (#247)
docs(examples): README of examples/stock (#246)
…for its skill (#252)

#242, #243 and #244 merged with their package READMEs but the claude-plugin
boost skill never heard of them, because CLAUDE.md put plugin docs out of
scope. Now each change ships its package README, root README and site, and
opens an issue in xgodev/claude-plugin; boost still does not edit the plugin.
docs(claude): every change updates docs, site and asks claude-plugin for its skill (#252)
Bumps the version shown in README and site: kebab-case app names, the @job
door, @Inject *sql.DB and @server since 1.6.2.
Comment thread examples/stock/internal/pkg/datastore/stock/mongodb/datastore.go Fixed
Comment thread examples/stock/internal/pkg/datastore/stock/mongodb/datastore.go Fixed
…255)

CodeQL go/sql-injection flags the mongo stock datastores: the sku from the
request goes straight into the filter. A Go string never becomes a Mongo
operator, but the example took any text as a sku, created "$gt" and sent
it to every datastore. The stock services now reject a sku outside
[a-z0-9-]{1,64} as NotValid (400, InvalidArgument, tool error) and both
mongo datastores, shown in README and site, match the sku with $eq.
fix(examples): check the sku before the stock and match it with $eq (#255)
Comment thread docs/site/example/shop/internal/pkg/datastore/stock/mongodb/datastore.go Dismissed
Comment thread examples/stock/internal/pkg/datastore/stock/mongodb/datastore.go Dismissed
Comment thread examples/stock/internal/pkg/datastore/stock/mongodb/datastore.go Dismissed
@jpfaria
jpfaria merged commit 0ec3ec4 into main Oct 20, 2026
4 checks passed
@jpfaria
jpfaria deleted the release/1.7.0 branch October 20, 2026 04:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(examples): regenerate the function examples, CI Go job fails

2 participants