✨ Features / Enhancements
- Improved host builder .funcignore support by @lkingland - #3624
- Apply .funcignore rules in Fingerprint and OCI builder by @gauron99 - #3789
- Allow to specify ImagePullSecret by @creydr - #3656
- Add extension arg for func invoke by @mdering - #3347
- Add func logs command to stream function logs by @Itx-Psycho0 - #3669
- Add func-operator integration to deploy command by @creydr - #3657
- Dev cluster creation with func clusters by @lkingland - #3754
- Implement AWS ECR credentials loader in Kubernetes keychains by @Nachiket-Roy - #3864
- Add Kafka event sourcing for Go functions by @aliok - #3950
- Persistent deployer in func.yaml, block incompatible deployer switch by @gauron99 - #3953
- MCP: add secret and ConfigMap support to config_envs_add tool by @Ankitsinghsisodya - #3685
- MCP: split config tools by action for accurate tool annotations by @Ankitsinghsisodya - #3661
- MCP: expose server version in healthcheck output by @cubaseuser123 - #3745
- Add strict Tekton schema validation for Pipeline and PipelineRun templates by @matejvasek - #3855
- Duplicate env and volume validation by @Nachiket-Roy - #3878
- Python: build and deploy legacy parliament functions (deprecated) by @gauron99 - #3927
🔐 Security
- Use secure file permissions for config files by @Itx-Psycho0 - #3726
- Default GitHub webhooks to TLS verification by @Vi-shub - #3714
- Validate prefix in WithPrefix to reject shell metacharacters by @Elvand-Lie - #3760
- Use 0644 permissions for runtime data files in .func/ by @Ankitsinghsisodya - #3867
🐛 Bug Fixes
- Write func.yaml before remote deploy upload by @creydr - #3663
- Handle multi-path KUBECONFIG entries by @xenonnn4w - #3655
- Use net.Dial in socat for dual-stack support (Happy Eyeballs) by @matejvasek - #3692
- Improve IPv6 support in local Kind cluster setup by @matejvasek - #3693
- Listen on IPv6 loopback (::1) in addition to 127.0.0.1 by @matejvasek - #3817
- Detect Docker host from context when DOCKER_HOST is not set by @Itx-Psycho0 - #3684
- Resolve credentials for protected HTTP(S) repositories by @Ankitsinghsisodya - #3637
- Apply resource validation to first-deploy path in k8s and keda deployers by @Ankitsinghsisodya - #3671
- Pass referenced resource sets to generateNewService for proper validation by @Ankitsinghsisodya - #3579
- Propagate caller context in dialer DialContext by @Elvand-Lie - #3834
- Increase default PVC size by @matejvasek - #3862
- Fix goroutine leak in SSH DialContext by @Elvand-Lie - #3882
- Prevent goroutine leak and deadlock in pod watcher by @vishwas-droid - #3883
- Host builder can push to OCP internal registry by @matejvasek - #3885
- Replace panic with error return in write() and remove phantom xml format by @Elvand-Lie - #3845
- Gracefully shutdown host-built functions by @gauron99 - #3895
- Never upload .func to the cluster in direct remote deploy by @gauron99 - #3897
- Skip forbidden check on triggers to remove hard dep by @gauron99 - #3949
- Skip knative backends on forbidden so list/describe/delete work for non-knative specific use-case by @gauron99 - #3951
- Run Delete when no clusters are tracked by @lkingland - #3969
- Add deployer type guard to logs command by @Elvand-Lie - #3851
- Add defensive length check when accessing service Ports (KEDA) by @Elvand-Lie - #3813
- Guard against nil vol.Path in ProcessVolumes by @Elvand-Lie - #3805
- Return error for malformed --extension flag values by @Ankitsinghsisodya - #3852
- Remove trailing newline from verbose version output by @lkingland - #3698
- MCP: correct command prefix in Remove Help resources by @Ankitsinghsisodya - #3660
- MCP: omit empty subcommand in defaultExecutor argument list by @Ankitsinghsisodya - #3667
- MCP: pass WithReadonly at construction to fix instructions desync by @Elvand-Lie - #3707
- MCP: change DeleteInput.All from *string to *bool by @Elvand-Lie - #3710
- MCP: use 'config' prefix for remove help resources by @Elvand-Lie - #3712
- MCP: fix appendBoolFlag to handle explicit false values by @Elvand-Lie - #3709
- MCP: remove writeEnabled from Start() to prevent readonly state desync by @Elvand-Lie - #3758
- MCP: use atomic.Bool for Server.readonly to prevent data races by @Elvand-Lie - #3759
- MCP: add readonly guard to buildHandler by @Ankitsinghsisodya - #3840
- MCP: add missing help resource for delete command by @cubaseuser123 - #3724
🧹 Code Cleanup
- Clean up func version verbose output format by @Ankitsinghsisodya - #3581
- Narrow docker interface by @matejvasek - #3650
- Refactor delete error handling and validation by @xenonnn4w - #3658
- Fix outdated documentation and template typos by @creydr - #3782
- Remove unreachable dead code in --extension validation by @Ankitsinghsisodya - #3839
- Wrap list error + improve code readability by @gauron99 - #3872
- Move CI workflow generation from cmd/ci to pkg/ci/github by @twoGiants - #3572
🧪 CI / Build / Testing
- Migrate testing registry from host container to in-cluster deployment by @matejvasek - #3718
- E2e subscription tests using in-cluster recorder by @lkingland - #3697
- E2e: add lifecycle structure + tests for existing python + go by @gauron99 - #3899
- Move Python e2e scenarios to matrix by @lkingland - #3963
- E2e: retry event POST to broker in subscription tests by @gauron99 - #3929
- Update Go runtimes to func-go v0.22.0 by @aliok - #3954
- Update dependencies in Rust templates by @Ankitsinghsisodya - #3641