172 Commits

Author SHA1 Message Date
ee9ba995d6
f(ai): fix interface / add type guard 2026-03-08 16:51:51 -06:00
a76ca7f86e
feat(ai): add Ollama and OpenAI helpers 2026-03-08 16:51:51 -06:00
05096da65a
feat: add cmd/smbtest for debugging smb connection issues 2026-03-08 16:51:51 -06:00
4146c62f37
ref(cmd/monorelease): fix tag and version output, start flagset 2026-03-08 16:51:51 -06:00
ac6a039698
WIP: feat(cmd/monorelease): fix versioning 2026-03-08 16:51:51 -06:00
3abf0838c2
WIP: feat(cmd/monorelease): better table 2026-03-08 16:51:51 -06:00
c8c2b63e93
WIP: feat(cmd/monorelease): show table 2026-03-08 16:51:51 -06:00
6438ef8064
WIP: feat(cmd/monorelease): show bins 2026-03-08 16:51:51 -06:00
50cfc1fa32
WIP: feat: add cmd/monorelease for checking version info 2026-03-08 16:51:51 -06:00
3db8580d5a
feat: add tools/gitver for monorepo versioning 2026-03-08 16:51:51 -06:00
e4edb8fe2e
feat: add ./scripts/concat-for-context.sh to reduce total file count 2026-03-08 16:51:51 -06:00
663b00b0c7
doc: add PROMPT.md for Ai context 2026-03-08 16:51:51 -06:00
dd7672d2c2
feat: add cmd/api-example as server boilerplate 2026-03-08 16:51:50 -06:00
7414630a4b
f: cmd/cli-example 2026-03-08 16:51:50 -06:00
222f3cc0fe
feat: add cmd/cli-example for reference, and Ai context 2026-03-08 16:51:50 -06:00
6244d8dd32
wip:feat(auth/jwt): add jwk fetch and jwt verify 2026-03-08 16:51:50 -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 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
f3eff585c4
feat(monorel): match goreleaser comment style in generated .goreleaser.yaml
- Replace "Generated by monorel" header with goreleaser-style preamble
  ("This file is generated by monorel ... check the docs at goreleaser.com")
- Add modeline explainer comment block before the yaml-language-server line
- Add "you may remove this if you don't need go generate" comment inline
- Combine name_template comments into goreleaser-style single comment
  ("this name template makes the OS and Arch compatible with uname")
2026-03-01 19:13:50 -07:00
98bdc47746
feat(monorel): validate existing .goreleaser.yaml instead of diffing content
Replace the exact-content comparison with yamlLooksCorrect(), which checks
three semantic markers:

  - -X main.version={{.Env.VERSION}} present (version injection)
  - <binname>_{{ .Env.VERSION }}_ present for every binary (archive naming)
  - {{ .ProjectName }} / {{.ProjectName}} absent (not a stock template)

If the file passes all checks it is left completely untouched, preserving
any compatible local edits. Only files that fail a check are regenerated.
2026-03-01 19:13:50 -07:00
833c68e708
fix(monorel): skip writing .goreleaser.yaml when content is unchanged
Both init (initModuleGroup) and release (processModule) now compare the
generated content against the file on disk before writing. If identical,
the file is left untouched — preserving any compatible local edits.

Also fix processModule commit message scope to chore(<prefix>): add
.goreleaser.yaml, matching the convention already used by initModuleGroup.
2026-03-01 19:13:50 -07:00
ed08958157
fix(monorel): skip writing .goreleaser.yaml when content is unchanged
Compare generated content against the file on disk before writing.
If identical, do nothing — no write, no "wrote" message, no commit attempt.
2026-03-01 19:13:50 -07:00
4bb350d61b
fix(monorel): init only auto-commits new .goreleaser.yaml, not updates
- Track isNewFile before writing so updates to existing files are never
  auto-committed (mirrors the same rule already in processModule/release)
- Gate auto-bump on isNewFile as well — no tag when just refreshing yaml
- Fix commit message scope: chore(<prefix>): add .goreleaser.yaml
  (was chore(release): add .goreleaser.yaml for <name>)
2026-03-01 19:13:50 -07:00
455ceb7d69
fix(monorel): restore cross-module binary discovery in recursive walk
The go.mod boundary check added to findMainPackages was stopping the
--recursive walk from descending into child module directories, so
modules like auth/csvauth/ were never found.

The check was redundant: groupByModule already uses findModuleRoot to
attribute each binary to its nearest go.mod ancestor, and initModuleGroup
already skips modules with uncommitted changes (an untracked go.mod
counts as an uncommitted change).  Removing the stop restores the
pre-regression behaviour.
2026-03-01 19:13:50 -07:00
1c779296e9
feat(monorel): add tar.zst and windows tar.gz archive formats
- Non-Windows archives: tar.gz, tar.zst (zstd for faster decompression)
- Windows archives: zip, tar.gz (Windows ships with bsd tar + gz support)
- Upload script: include *.tar.zst globs alongside *.tar.gz and *.zip
2026-03-01 19:13:50 -07:00
e4402f4a4a
feat(monorel): push commits and tags before creating GitHub release
Add Step 3 "git push && git push --tags" to the generated release script,
between the tag creation step and the goreleaser build step.  This fixes
HTTP 422 "Release.target_commitish is invalid" errors from the GitHub API,
which occur when the local commit (auto-created for a new .goreleaser.yaml)
has not yet been pushed to the remote.
2026-03-01 19:13:50 -07:00
25781032f9
fix(monorel/release): auto-commit+tag only when .goreleaser.yaml is new
If .goreleaser.yaml did not exist:
  → write it, commit it, auto-tag patch (if sole new commit since last tag)

If .goreleaser.yaml already existed:
  → write the updated file, stop — no auto-commit, no auto-tag
2026-03-01 19:13:50 -07:00
c4a31cbee8
feat(monorel/release): write+commit .goreleaser.yaml and auto-tag patch
monorel release now mirrors the init lifecycle for the goreleaser config:

1. Write .goreleaser.yaml (always regenerate; warn on stock {{ .ProjectName }})
2. git add + commit it if the file changed
3. Auto-tag patch — but only if the yaml commit is the sole new commit
   since the last stable tag (same heuristic as monorel init).
   If there are >1 new commits, print a note and skip auto-tag so the
   user can choose the right semver component with monorel bump.
4. Compute version info *after* the yaml commit and auto-tag, so the
   generated script reflects the tag that was just created.
2026-03-01 19:13:50 -07:00
56cce946a8
fix(monorel/release): always write .goreleaser.yaml, never auto-commit
The previous commit was too conservative — it prevented release from
updating an existing config. Restore the original write-always behaviour
but keep the {{ .ProjectName }} monorepo warning. The file is written
unconditionally; the user commits it manually when satisfied.
2026-03-01 19:13:50 -07:00
1e766daa14
feat(monorel/release): write+commit .goreleaser.yaml only when missing
Previously `monorel release` always overwrote .goreleaser.yaml, discarding
any manual customisations the user had made.

New behaviour:
- Missing → write the monorel-generated config and commit it (same as init)
- Exists, stock {{ .ProjectName }} in a monorepo subdir → warn and ask the
  user to update it manually before re-running
- Exists, looks fine → print "leaving unchanged" and continue
2026-03-01 19:13:49 -07:00