184 Commits

Author SHA1 Message Date
94d3f77ef5
WIP: feat(cmd/monorelease): fix versioning 2026-04-05 19:10:51 -06:00
efbc2c61b0
WIP: feat(cmd/monorelease): better table 2026-04-05 19:10:51 -06:00
6ecb04696a
WIP: feat(cmd/monorelease): show table 2026-04-05 19:10:51 -06:00
8c1301a0da
WIP: feat(cmd/monorelease): show bins 2026-04-05 19:10:51 -06:00
849f606bbc
WIP: feat: add cmd/monorelease for checking version info 2026-04-05 19:10:51 -06:00
4e33d6d169
feat: add tools/gitver for monorepo versioning 2026-04-05 19:10:51 -06:00
68a8a00f11
feat: add ./scripts/concat-for-context.sh to reduce total file count 2026-04-05 19:10:51 -06:00
7553221fae
doc: add PROMPT.md for Ai context 2026-04-05 19:10:51 -06:00
ccb504f62d
feat: add cmd/api-example as server boilerplate 2026-04-05 19:10:51 -06:00
7f46ef6102
f: cmd/cli-example 2026-04-05 19:10:51 -06:00
43c09a9ad1
feat: add cmd/cli-example for reference, and Ai context 2026-04-05 19:10:51 -06:00
4a9c331ef9
Fix INSERT INTO _migrations ordering in create and fixup
The create subcommand generated .up.sql files with INSERT INTO
_migrations as the FIRST statement, before the actual DDL. If the
DDL fails, the migration is incorrectly marked as applied. Move the
INSERT to be the LAST statement, matching how .down.sql already puts
DELETE FROM _migrations last.

Also fix the automatic fixup logic to append (not prepend) missing
INSERT statements to existing .up.sql files.

Fixes #86
cmd/sql-migrate/v2.1.3
2026-03-30 15:58:21 -06:00
87b666ffd3
chore(cmd/sql-migrate): add .goreleaser.yaml cmd/sql-migrate/v2.1.2 2026-03-28 17:16:40 -06:00
a4c4deabfa
chore(tools/monorel): re-init .goreleaser.yaml tools/monorel/v0.6.7 2026-03-28 17:15:38 -06:00
9d11500cd6
feat(monorel): separate Windows builds and full goamd64 v1-v4 matrix
Go 1.23+ changed Windows target naming so x86_64 builds now carry a
micro-architecture suffix (e.g. _v2).  Update the goreleaser YAML
generator and monorel's own .goreleaser.yaml to match:

- Remove windows from defaultGoos/almostAllGoos; emit a dedicated
  <name>-windows build entry per binary.  Windows is kept in a separate
  build because it does not support ARM v6/v7, so it cannot share the
  same goarch matrix as non-Windows builds.
- Add defaultWindowsGoarch [amd64, arm64] and almostAllWindowsGoarch
  [386, amd64, arm64] for the Windows-specific architecture lists.
- Promote defaultGoamd64 from [v1, v2] to [v1, v2, v3, v4] so the
  full amd64 micro-architecture matrix is always generated.
- Update the archive name_template to include
  {{ if .Amd64 }}_{{ .Amd64 }}{{ end }} after x86_64.
- Include both <name> and <name>-windows in archive ids.
- Regenerate tools/monorel/.goreleaser.yaml and
  cmd/sql-migrate/.goreleaser.yaml with the new format.
2026-03-28 17:15:33 -06:00
690cf90d67
chore(cmd/sql-migrate): add .goreleaser.yaml 2026-03-23 11:43:08 -06:00
1f61095873
feat(sql-migrate): add sync subcommand
Adds `sql-migrate sync` which outputs a shell script that refreshes
the local migrations.log from the DB by running _migrations.sql.
Uses `|| true` so a fresh DB with no _migrations table yields an
empty log (all migrations pending) rather than an error.

Usage:
  sql-migrate -d ./db/migrations sync | sh
  sql-migrate -d ./db/migrations up | sh
cmd/sql-migrate/v2.1.0
2026-03-23 11:42:23 -06:00
b50696f64d feat(sql-migrate): skip +-prefixed files in migrations directory (refs #68) cmd/sql-migrate/v2.0.4 2026-03-23 11:39:49 -06:00
3487702bf7 fix(sql-migrate): use 6-digit zero-padded number in init migration filename (refs #68) 2026-03-23 11:39:49 -06:00
4895012d67 fix(sql-migrate): use portable SQL in _migrations table (closes #37) 2026-03-23 11:39:49 -06:00
a854fef67e
test(auth/csvauth): regression test for Authenticate token deadlock
Guards against the v1.2.4 bug (fixed in c32acd5) where Authenticate
held a.mux via defer for its full duration, then called
loadAndVerifyToken which also tries to acquire a.mux — deadlock on
every token auth request.

TestAuthenticateTokenNoDeadlock exercises both the bare-token
("", token) and named-username ("api", token) forms with a 1s
timeout, so a regression fails fast rather than hanging the suite.
2026-03-23 00:26:16 -06:00
a4cb1e3bfd
doc: clarify how to create users and tokens
Signed-off-by: AJ ONeal <aj@therootcompany.com>
2026-03-19 21:17:57 -06:00
0d99234914
ref!(auth/jwt): variadic requiredScopes in NewAccessTokenValidator
Distinguishes the two validator constructors by signature:
- NewIDTokenValidator(iss, aud, azp []string) — allowlist semantics
- NewAccessTokenValidator(iss, aud []string, requiredScopes ...string) — requirement semantics

Variadic scopes read naturally at the call site:
  NewAccessTokenValidator(issuers, audiences, "openid", "profile")

Three-state semantics preserved:
  no args        → scope not checked
  []string{}...  → scope must be present (any value)
  "openid", ...  → scope must contain all listed values

Also removes the old gracePeriod parameter from both constructors
(was 0 at all call sites; set GracePeriod on the struct directly
if a non-default value is needed).

Adds TestCov_NewAccessTokenValidator_Scopes covering all three cases.
auth/jwt/v0.9.1
2026-03-17 08:00:45 -06:00
26bdc0a3db
ref!(auth/jwt): full modern rewrite auth/jwt/v0.9.0 2026-03-17 07:49:53 -06:00
117ed8cc9b
feat(auth/jwt): add jwk fetch and jwt verify auth/jwt/v0.6.5 2026-03-17 07:10:25 -06:00
ba674a673d
doc(tools/monorel): move usage summary to doc.go tools/monorel/v0.6.6 2026-03-08 17:21:55 -06:00
f2302d2f24
chore(monorel): add MPL-2.0 license header 2026-03-08 17:21:55 -06:00
eaa3636a35
feat(monorel): add version output with ldflags support 2026-03-08 17:21:55 -06:00
92e1ae9992
docs(monorel): add README tools/monorel/v0.6.5 2026-03-08 15:55:11 -06:00
bd2443cb58
fix(monorel): various path, module root, and --recursive fixes 2026-03-08 15:51:26 -06:00
fd3cb8ba99
feat(monorel): add goarch/goarm/goamd64 to build matrix with --almost-all/--ios/--android-ndk
Default matrix (conservative, CGO_ENABLED=0):
  goos:   darwin freebsd js linux netbsd openbsd wasip1 windows
  goarch: amd64 arm arm64 mips64le mipsle ppc64le riscv64 wasm
  goarm:  6 7  (always included when arm is in goarch)

--almost-all widens to esoteric goos (aix dragonfly illumos plan9
solaris), adds 386/loong64/mips/mips64/ppc64/s390x to goarch, and
emits goamd64: v1 v2 v3 v4.

--ios generates an active iOS build entry (CGO_ENABLED=1, arm64)
instead of the default commented stub.

--android-ndk generates an active Android NDK build entry
(CGO_ENABLED=1, arm64) instead of the default commented stub.

Both --ios and --android-ndk are available on init and release.
The existing -A flag (include hidden dirs) is unchanged.
2026-03-08 15:49:24 -06:00
1cb478b475
fix(http/androidsmsgateway): revert to using observed phoneNumber field rather than the documented recipient,sender ones 2026-03-05 14:00:55 -07:00
516b23eac3
feat+ref(cmd/smsapid): add sms:* endpoints, csvauth, cli flags, etc 2026-03-03 03:11:26 -07:00
4bda5b4580
ref(cmd/auth-proxy): consolidate generic token logic in auth package 2026-03-03 03:08:27 -07:00
c32acd5a74
ref(auth/csvauth): don't hold mutex longer than necessary auth/csvauth/v1.2.5 2026-03-03 03:05:05 -07:00
020b00c353
feat(http/androidsmsgateway): add webhook examples, JSON, CSV, and signature verification 2026-03-03 03:01:56 -07:00
66dde73bd4
chore(auth/csvauth): add .goreleaser.yaml auth/csvauth/v1.2.4 2026-03-03 02:31:36 -07:00
249385c775
fix(auth/csvauth): load tokens into hashmap so that they can be retrieved by CredentialKeys auth/csvauth/v1.2.3 auth/v1.1.1 2026-03-03 02:26:34 -07:00
d415a8c743
fix(auth/csvauth): turn the old CLI-only warnings and errors into returned errors 2026-03-03 01:21:36 -07:00
8842791e34
fix(auth): update test 2026-03-03 00:01:15 -07:00
92f865912a
fix(auth): add missing arg to NewBasicRequestAuthenticator 2026-03-02 23:18:05 -07:00
846d14baf5
feat(auth): add BasicRequestAuthenticator auth/v1.1.0 2026-03-02 12:32:01 -07:00
8056a07d10
chore(tools/monorel): add .goreleaser.yaml tools/monorel/v0.6.4 2026-03-01 19:13:50 -07:00
8405be04ad
feat(monorel): use YAML anchors to DRY up multi-binary build matrices
When a module has more than one binary, the shared build options (env,
ldflags, goos) are defined once via a YAML anchor on the first build and
merged into the rest with <<: *build_defaults.  Single-binary modules use
plain fields with no anchor overhead.

  - id: gsheet2csv          - id: gsheet2csv
    binary: gsheet2csv        binary: gsheet2csv
    env:              →       <<: &build_defaults
      - CGO_ENABLED=0           env:
    goos:                         - CGO_ENABLED=0
      - aix                     goos:
      - ...                       - aix
  - id: gsheet2env               - ...
    binary: gsheet2env      - id: gsheet2env
    env:                      binary: gsheet2env
      - CGO_ENABLED=0           <<: *build_defaults
    goos: ...

The commented-out ios stubs follow the same pattern using a separate
build_defaults_ios anchor so they remain consistent when uncommented.

Also extracts defaultGoos to a package-level var to avoid repetition.
2026-03-01 19:13:50 -07:00
445a6e9c07
feat(monorel): expand default build matrix to all practical CGO_ENABLED=0 targets
Replace linux/windows/darwin with the full CGO_ENABLED=0 goos list:
  aix, darwin, dragonfly, freebsd, illumos, js, linux, netbsd, openbsd,
  plan9, solaris, wasip1, windows

Add commented-out stanzas for each binary for platforms that require extra
tooling:
  - iOS  (CGO_ENABLED=1, Xcode toolchain required)
  - Android (CGO_ENABLED=0 arm64-only; NDK required for full CGO builds)

Archive formats unchanged (tar.gz + tar.zst / zip + tar.gz for Windows).
2026-03-01 19:13:50 -07:00
1289f3e5b6
fix(monorel): guard .goreleaser.yaml overwrite in release; loosen compat check
release subcommand:
- Replace yamlLooksCorrect with yamlIsCompatible: file is considered OK if
  {{ .ProjectName }} is absent AND at least one binary's VERSION string is
  present.  Extra hand-edited binaries (like fixtures) no longer trigger a
  rewrite.
- Before overwriting an existing file, prompt the user [Y/n].  --yes does
  not skip this prompt; --force does.  If stdin is not a terminal and
  --force is not set, the command errors rather than silently clobbering.

init subcommand: unchanged — still uses the strict yamlLooksCorrect check
(all binaries must be present, ldflags must include main.version).
2026-03-01 19:13:50 -07:00
c14bc239f5
fix(monorel): always create GitHub release as draft+prerelease, finalise after upload
gh release create now always uses --draft --prerelease so artifacts can be
uploaded before the release becomes visible. A final "Finalise release
visibility" step then runs gh release edit to remove whichever flags should
not remain:

  --draft=false       unless --draft flag given (keep as draft)
  --prerelease=false  unless --prerelease flag given OR the tag has a
                      pre-release suffix (-pre3, .dirty, etc.)

Flag meaning change:
  --draft      = keep release in draft state after uploading (don't publish)
  --prerelease = keep release marked pre-release even for clean vX.Y.Z tags
2026-03-01 19:13:50 -07:00
f87bfeb438
feat(monorel): add --draft and --prerelease flags to release subcommand
The gh release create flags are now explicit and always emitted:
  --draft / --draft=false
  --prerelease / --prerelease=false

Publish step (gh release edit --draft=false) logic:
  --draft --prerelease : NO  (stays as draft pre-release)
  --draft only         : YES (draft needs publishing)
  --prerelease only    : NO  (published immediately as pre-release)
  neither              : NO  (published immediately)

The step prompt adapts: "create draft pre-release / draft / pre-release /
GitHub release <tag>" depending on the flag combination.
2026-03-01 19:13:50 -07:00
b6fd4072bf
refactor(monorel): replace bash script output with interactive step runner
Replace printModuleScript (which emitted a bash script to stdout) with an
interactive step runner for the release subcommand:

- Each step shows the command(s) it will run, then prompts [Y/n]
- --dry-run: show steps without prompting or running (replaces old default)
- --yes: run all steps without prompting (happy-path automation)

New types/functions:
  releaseStep       — title, prompt, display lines, skip flag, run func
  printModuleHeader — extracted header/info block (always shown)
  buildModuleSteps  — constructs the ordered step list for one module
  runSteps          — executes steps per dryRun/yes flags
  execIn            — runs a command streaming to the terminal
  execInEnv         — like execIn with extra environment variables

Goreleaser archive globs are expanded at step-run time (after goreleaser
has built the dist/ directory) rather than being passed as shell globs.
The gh release create --notes flag receives the notes string directly
instead of via a shell variable.
2026-03-01 19:13:50 -07:00
e6f82ed91b
feat(monorel): print "found config ... with monorepo support" when yaml is ok
When an existing .goreleaser.yaml passes yamlLooksCorrect() and needs no
update, both init and release now print:

  found config ./cmd/tcpfwd/.goreleaser.yaml with monorepo support

Path is shown relative to cwd (via cwdRelPath helper).
2026-03-01 19:13:50 -07:00