From 8ca65dd502e5dfacc0040674421b0ce619f8994a Mon Sep 17 00:00:00 2001 From: squeakycheese75 Date: Fri, 1 May 2026 09:07:10 +0200 Subject: [PATCH 1/2] chore: patching to latest go version --- .github/workflows/push.yml | 35 +++++++++++++---------- go.mod | 16 +++++------ go.sum | 36 ++++++++++++------------ internal/service/daily_report_prompts.go | 30 +++++++++++--------- 4 files changed, 63 insertions(+), 54 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index f28617c..5e841e2 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -5,19 +5,26 @@ on: branches: ["main"] pull_request: +permissions: + contents: read + +env: + GO_VERSION: "1.26.2" + jobs: test: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: - go-version: "1.25" + go-version: ${{ env.GO_VERSION }} cache: true + cache-dependency-path: go.sum - name: Download dependencies run: go mod download @@ -33,31 +40,29 @@ jobs: steps: - name: Checkout repo - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: - go-version: "1.25" + go-version: ${{ env.GO_VERSION }} cache: true + cache-dependency-path: go.sum - name: Run golangci-lint uses: golangci/golangci-lint-action@v9 with: - version: v2.5.0 + version: v2.10.1 vulncheck: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v4 - - - name: Set up Go - uses: actions/setup-go@v5 - with: - go-version: "1.25" - cache: true + uses: actions/checkout@v6 - name: Run govulncheck - uses: golang/govulncheck-action@v1 \ No newline at end of file + uses: golang/govulncheck-action@v1 + with: + go-version-input: ${{ env.GO_VERSION }} + go-package: ./... \ No newline at end of file diff --git a/go.mod b/go.mod index 1df837f..7802124 100644 --- a/go.mod +++ b/go.mod @@ -1,19 +1,19 @@ module github.com/squeakycheese75/tick -go 1.25.1 +go 1.26.2 require ( + github.com/chzyer/readline v1.5.1 github.com/joho/godotenv v1.5.1 - github.com/mattn/go-isatty v0.0.20 - github.com/pressly/goose/v3 v3.27.0 + github.com/mattn/go-isatty v0.0.22 + github.com/pressly/goose/v3 v3.27.1 github.com/spf13/cobra v1.10.2 go.uber.org/mock v0.6.0 golang.org/x/text v0.36.0 - modernc.org/sqlite v1.48.1 + modernc.org/sqlite v1.50.0 ) require ( - github.com/chzyer/readline v1.5.1 github.com/dustin/go-humanize v1.0.1 // indirect github.com/google/uuid v1.6.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -21,11 +21,11 @@ require ( github.com/ncruces/go-strftime v1.0.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/sethvargo/go-retry v0.3.0 // indirect - github.com/spf13/pflag v1.0.9 // indirect + github.com/spf13/pflag v1.0.10 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.42.0 // indirect - modernc.org/libc v1.70.0 // indirect + golang.org/x/sys v0.43.0 // indirect + modernc.org/libc v1.72.1 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect ) diff --git a/go.sum b/go.sum index 2ae1f62..6aaf77e 100644 --- a/go.sum +++ b/go.sum @@ -19,16 +19,16 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw4= +github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pressly/goose/v3 v3.27.0 h1:/D30gVTuQhu0WsNZYbJi4DMOsx1lNq+6SkLe+Wp59BM= -github.com/pressly/goose/v3 v3.27.0/go.mod h1:3ZBeCXqzkgIRvrEMDkYh1guvtoJTU5oMMuDdkutoM78= +github.com/pressly/goose/v3 v3.27.1 h1:6uEvcprBybDmW4hcz3gYujhARhye+GoWKhEWyzD5sh4= +github.com/pressly/goose/v3 v3.27.1/go.mod h1:maruOxsPnIG2yHHyo8UqKWXYKFcH7Q76csUV7+7KYoM= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -36,8 +36,9 @@ github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas= github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= -github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= @@ -50,9 +51,8 @@ golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= -golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= @@ -60,10 +60,10 @@ golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis= -modernc.org/cc/v4 v4.27.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= -modernc.org/ccgo/v4 v4.32.0 h1:hjG66bI/kqIPX1b2yT6fr/jt+QedtP2fqojG2VrFuVw= -modernc.org/ccgo/v4 v4.32.0/go.mod h1:6F08EBCx5uQc38kMGl+0Nm0oWczoo1c7cgpzEry7Uc0= +modernc.org/cc/v4 v4.28.1 h1:XpLbkYVQ24E8tX5u8+yWGvaxerxkR/S4zqxI8ZoSBuc= +modernc.org/cc/v4 v4.28.1/go.mod h1:OnovgIhbbMXMu1aISnJ0wvVD1KnW+cAUJkIrAWh+kVI= +modernc.org/ccgo/v4 v4.33.0 h1:dspBCm75jsj8Y/ufwAMVfe375L2iYdMyQ2QG/v3hL54= +modernc.org/ccgo/v4 v4.33.0/go.mod h1:+RhXBoRYzRwaH21mV/aj6XvQRDtfjcZfAlPMsQo8CR0= modernc.org/fileutil v1.4.0 h1:j6ZzNTftVS054gi281TyLjHPp6CPHr2KCxEXjEbD6SM= modernc.org/fileutil v1.4.0/go.mod h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU= modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= @@ -72,18 +72,18 @@ modernc.org/gc/v3 v3.1.2 h1:ZtDCnhonXSZexk/AYsegNRV1lJGgaNZJuKjJSWKyEqo= modernc.org/gc/v3 v3.1.2/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= -modernc.org/libc v1.70.0 h1:U58NawXqXbgpZ/dcdS9kMshu08aiA6b7gusEusqzNkw= -modernc.org/libc v1.70.0/go.mod h1:OVmxFGP1CI/Z4L3E0Q3Mf1PDE0BucwMkcXjjLntvHJo= +modernc.org/libc v1.72.1 h1:db1xwJ6u1kE3KHTFTTbe2GCrczHPKzlURP0aDC4NGD0= +modernc.org/libc v1.72.1/go.mod h1:HRMiC/PhPGLIPM7GzAFCbI+oSgE3dhZ8FWftmRrHVlY= modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= -modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= -modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= +modernc.org/opt v0.2.0 h1:tGyef5ApycA7FSEOMraay9SaTk5zmbx7Tu+cJs4QKZg= +modernc.org/opt v0.2.0/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.48.1 h1:S85iToyU6cgeojybE2XJlSbcsvcWkQ6qqNXJHtW5hWA= -modernc.org/sqlite v1.48.1/go.mod h1:hWjRO6Tj/5Ik8ieqxQybiEOUXy0NJFNp2tpvVpKlvig= +modernc.org/sqlite v1.50.0 h1:eMowQSWLK0MeiQTdmz3lqoF5dqclujdlIKeJA11+7oM= +modernc.org/sqlite v1.50.0/go.mod h1:m0w8xhwYUVY3H6pSDwc3gkJ/irZT/0YEXwBlhaxQEew= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= diff --git a/internal/service/daily_report_prompts.go b/internal/service/daily_report_prompts.go index 9a33b42..dbe1c94 100644 --- a/internal/service/daily_report_prompts.go +++ b/internal/service/daily_report_prompts.go @@ -22,28 +22,30 @@ Return 3 to 5 concise bullet points. func buildDailyReportUserPrompt(dailyReport domain.DailyReport) string { var b strings.Builder + p := dailyReport.Portfolio b.WriteString("Portfolio daily brief\n\n") - b.WriteString(fmt.Sprintf("Portfolio: %s\n", dailyReport.Portfolio.Name)) - b.WriteString(fmt.Sprintf("Base currency: %s\n", dailyReport.Portfolio.BaseCurrency)) - b.WriteString(fmt.Sprintf("Total value: %.2f %s\n\n", dailyReport.Portfolio.TotalValue, dailyReport.Portfolio.BaseCurrency)) + fmt.Fprintf(&b, "Portfolio: %s\n", p.Name) + fmt.Fprintf(&b, "Base currency: %s\n", p.BaseCurrency) + fmt.Fprintf(&b, "Total value: %.2f %s\n\n", p.TotalValue, p.BaseCurrency) b.WriteString("Top holdings:\n") if len(dailyReport.TopHoldings.Holdings) == 0 { b.WriteString("- No positions\n") } else { for _, h := range dailyReport.TopHoldings.Holdings { - b.WriteString(fmt.Sprintf( + fmt.Fprintf( + &b, "- %s: weight %.2f%%, value %.2f %s, quoted price %.2f %s, daily move %+.2f%%\n", h.Symbol, h.Weight*100, h.MarketValueBase, - dailyReport.Portfolio.BaseCurrency, + p.BaseCurrency, h.QuotedPrice, h.PriceCurrency, h.ChangePercent, - )) + ) } } b.WriteString("\n") @@ -52,10 +54,11 @@ func buildDailyReportUserPrompt(dailyReport domain.DailyReport) string { if dailyReport.Risk.LargestPosition == "" { b.WriteString("- No risk data available\n") } else { - b.WriteString(fmt.Sprintf("- Largest position: %s (%.2f%%)\n", dailyReport.Risk.LargestPosition, dailyReport.Risk.LargestWeight*100)) - b.WriteString(fmt.Sprintf("- Top 3 concentration: %.2f%%\n", dailyReport.Risk.Top3Concentration*100)) + fmt.Fprintf(&b, "- Largest position: %s (%.2f%%)\n", dailyReport.Risk.LargestPosition, dailyReport.Risk.LargestWeight*100) + fmt.Fprintf(&b, "- Top 3 concentration: %.2f%%\n", dailyReport.Risk.Top3Concentration*100) + for _, obs := range dailyReport.Risk.Observations { - b.WriteString(fmt.Sprintf("- %s\n", obs)) + fmt.Fprintf(&b, "- %s\n", obs) } } b.WriteString("\n") @@ -66,12 +69,13 @@ func buildDailyReportUserPrompt(dailyReport domain.DailyReport) string { } else { for _, group := range dailyReport.News { if len(group.Headlines) == 0 { - b.WriteString(fmt.Sprintf("- %s: no recent headlines\n", group.Ticker)) + fmt.Fprintf(&b, "- %s: no recent headlines\n", group.Ticker) continue } - b.WriteString(fmt.Sprintf("- %s:\n", group.Ticker)) + + fmt.Fprintf(&b, "- %s:\n", group.Ticker) for _, headline := range group.Headlines { - b.WriteString(fmt.Sprintf(" - %s\n", headline.Title)) + fmt.Fprintf(&b, " - %s\n", headline.Title) } } } @@ -82,7 +86,7 @@ func buildDailyReportUserPrompt(dailyReport domain.DailyReport) string { b.WriteString("- None\n") } else { for _, item := range dailyReport.Attention { - b.WriteString(fmt.Sprintf("- %s\n", item)) + fmt.Fprintf(&b, "- %s\n", item) } } b.WriteString("\n") From caf1435b0b540b8fea0d411f1a64a1e60e11b811 Mon Sep 17 00:00:00 2001 From: squeakycheese75 Date: Fri, 1 May 2026 09:42:58 +0200 Subject: [PATCH 2/2] fix: vuln report issue --- .github/workflows/push.yml | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 5e841e2..de08be5 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Checkout repo - uses: actions/checkout@v6 + uses: actions/checkout@v5 - name: Set up Go uses: actions/setup-go@v6 @@ -40,7 +40,7 @@ jobs: steps: - name: Checkout repo - uses: actions/checkout@v6 + uses: actions/checkout@v5 - name: Set up Go uses: actions/setup-go@v6 @@ -59,10 +59,18 @@ jobs: steps: - name: Checkout repo - uses: actions/checkout@v6 + uses: actions/checkout@v5 - - name: Run govulncheck - uses: golang/govulncheck-action@v1 + - name: Set up Go + uses: actions/setup-go@v6 with: - go-version-input: ${{ env.GO_VERSION }} - go-package: ./... \ No newline at end of file + go-version: ${{ env.GO_VERSION }} + cache: true + cache-dependency-path: go.sum + + - name: Install govulncheck + run: go install golang.org/x/vuln/cmd/govulncheck@latest + + - name: Run govulncheck + run: govulncheck ./... + \ No newline at end of file