Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
131 commits
Select commit Hold shift + click to select a range
4ffbd84
bootstrap base app with cmmands and configuration
Adeynack Oct 5, 2025
83e0c4a
import ctxval
Adeynack Oct 5, 2025
3035654
add GH check
Adeynack Oct 5, 2025
a549e98
split steps in check CI
Adeynack Oct 5, 2025
9ad9111
Remove the cache step
Adeynack Oct 5, 2025
98dbb85
remove dependency on Viper for configuration
Adeynack Oct 15, 2025
143df24
fix GOEXPERIMENT in Makefile
Adeynack Oct 16, 2025
0d09a24
add architecture diagram
Adeynack Oct 16, 2025
5a5d53d
remove unused variable
Adeynack Oct 24, 2025
3cc10ee
refactor configuration defaults
Adeynack Oct 24, 2025
074719e
bootstrap `.claude`
Adeynack Oct 30, 2025
2e9b569
bootstrap first models
Adeynack Oct 31, 2025
fa12e2e
local settings should not be committed
Adeynack Oct 31, 2025
ea2242c
AI generated a test to ensure all models are listed in array
Adeynack Oct 31, 2025
50611cc
refactor TestAllGormModelsRegistered to use more modern reflection
Adeynack Oct 31, 2025
2f7c70a
application context
Adeynack Nov 1, 2025
00f655d
`staticcheck` is already performed by `golangci-lint`.
Adeynack Nov 2, 2025
12f9329
basic resolver tests
Adeynack Nov 2, 2025
8a22c30
DRY with `go` prefixes with Claude
Adeynack Nov 2, 2025
4be319b
clean up test + benchmark for ctxval.Resolver
Adeynack Nov 2, 2025
aff53dc
wip benchmark
Adeynack Nov 2, 2025
beeaa39
simplify Resolver impl. with struct embedding
Adeynack Nov 2, 2025
dfa3058
test functionality of Resolver
Adeynack Nov 2, 2025
52519aa
add doc
Adeynack Nov 2, 2025
0b7a5a7
document the Resolver benchmark
Adeynack Nov 3, 2025
2902f4c
more precise benchmark
Adeynack Nov 3, 2025
d106377
move main command in its own executable sub-folder
Adeynack Nov 4, 2025
9ac512c
fix CLI flag bypass of some configuration
Adeynack Nov 4, 2025
9a72cbb
rename "Resolver" to "Container"
Adeynack Nov 4, 2025
1ebe190
test container fallback & overrides
Adeynack Nov 4, 2025
7d8907a
Force benchmark to report allocations
Adeynack Nov 4, 2025
0b6bc73
scaffold for import
Adeynack Nov 4, 2025
0b5ace8
onboard the API server
Adeynack Nov 4, 2025
7372710
cleaner dependency clean up system
Adeynack Nov 5, 2025
b92a8c7
Gorm logs request_id
Adeynack Nov 5, 2025
4a7657c
serve command
Adeynack Nov 5, 2025
8195fb9
ensure that the app instsance closes only once
Adeynack Nov 5, 2025
5335375
forgotten todo
Adeynack Nov 5, 2025
4e715bb
don't have a function go-routine itself
Adeynack Nov 5, 2025
e2305b7
dev auto-rebuild
Adeynack Nov 5, 2025
dc06fc7
add local server to OAS
Adeynack Nov 5, 2025
8883e12
slog web requests
Adeynack Nov 5, 2025
44c74fa
log request received and responded separately
Adeynack Nov 5, 2025
caded4f
split web logs
Adeynack Nov 6, 2025
011d27c
first implementations of controllers with Gorm
Adeynack Nov 6, 2025
45803ed
fix golangci-lint dependency conflict problem
Adeynack Nov 6, 2025
959b703
upgrade go version
Adeynack Nov 6, 2025
8bf0e08
upgrade to Go 1.25.4
Adeynack Nov 7, 2025
cdb1f31
upgrade Go version in GH Actions
Adeynack Nov 7, 2025
1b4bcb4
handle CORS for development
Adeynack Nov 7, 2025
c7357c9
Better comments over middleware generators
Adeynack Nov 7, 2025
17c3ea2
test books controller
Adeynack Nov 8, 2025
901319c
base table-tests
Adeynack Nov 9, 2025
efe5299
test logger
Adeynack Nov 9, 2025
3001f28
fix some testing issues
Adeynack Nov 9, 2025
00dab63
options for test logs
Adeynack Nov 9, 2025
c66bacd
remove error test
Adeynack Nov 9, 2025
c7af428
fix pagination
Adeynack Nov 9, 2025
e121dc8
basic validation
Adeynack Nov 9, 2025
6b4df46
API return proper validation errors
Adeynack Nov 9, 2025
eeda441
human-readable validation error messages
Adeynack Nov 9, 2025
7445924
error after panic sent as JSON
Adeynack Nov 12, 2025
fbd49ee
md import creates new book through API
Adeynack Nov 12, 2025
0e1f569
add dev wishlist / todos
Adeynack Nov 12, 2025
972f04c
wip: polymorphic decoding of Moneydance JSON items
Adeynack Nov 12, 2025
eaba382
read basic currencies and accounts from MD export
Adeynack Nov 13, 2025
de52ee0
fix unmarshal currency and account
Adeynack Nov 16, 2025
2c71b79
decode more account properties from MD
Adeynack Nov 16, 2025
d310160
wip MD import
Adeynack Dec 4, 2025
873bf7d
adapt tests for Gorm base model
Adeynack Dec 4, 2025
620096c
wip: test register model
Adeynack Dec 4, 2025
9f02dad
wip validation test
Adeynack Dec 6, 2025
17f400e
wip validator tests
Adeynack Dec 7, 2025
213e960
upgrade deps
Adeynack Dec 7, 2025
95bff83
upgrade go
Adeynack Dec 7, 2025
e1a8de6
roadmap
Adeynack Dec 8, 2025
081ed9a
json and validation tests
Adeynack Dec 10, 2025
dce53e4
Minimal TUI for test
Adeynack Dec 13, 2025
2d88d56
supper env LAPIASSE_DEFAULT_CMD
Adeynack Dec 13, 2025
ea6a557
wip: add create register in book
Adeynack Dec 20, 2025
9f3fe8f
init TSP with example API generation
Adeynack Dec 20, 2025
b748a1c
update widget API setup
Adeynack Dec 23, 2025
e976a1f
fix pagination max & default
Adeynack Dec 23, 2025
d78d060
build lapiasse API in TypeSpec from scratch
Adeynack Dec 23, 2025
d3375f9
remove widget api
Adeynack Dec 23, 2025
2419da7
todo: xdg
Adeynack Dec 25, 2025
d525822
Merge branch 'feature/mvp' into feature/mvp-typespec
Adeynack Dec 25, 2025
1695492
wip
Adeynack Dec 25, 2025
fc6acea
wip: re-implement controller using new TSP approach
Adeynack Dec 26, 2025
471d666
re-implement with new API spec
Adeynack Dec 28, 2025
14efe93
add books tests
Adeynack Dec 28, 2025
8937385
root of req/res are the resource
Adeynack Dec 28, 2025
090e8df
Validate book name uniqueness
Adeynack Dec 29, 2025
5470c0b
oapi-codegen error without type alias for simpler controller code
Adeynack Dec 30, 2025
098508e
install-deps
Adeynack Dec 30, 2025
91f6d54
CI checks if generated files are up to date
Adeynack Dec 30, 2025
a4bbad4
CI: set up NodeJS
Adeynack Dec 30, 2025
41364fe
npm ci
Adeynack Dec 30, 2025
85a4ed9
CI :go version from go.mod
Adeynack Dec 30, 2025
5b9ba65
Check after build for GIT modified files
Adeynack Dec 30, 2025
0dbd018
multi CI workflows
Adeynack Dec 30, 2025
33be9fb
activate jsonv2 for golangci-lint
Adeynack Dec 30, 2025
847251a
test CI modified files detection
Adeynack Dec 30, 2025
adad9f9
Revert "test CI modified files detection"
Adeynack Dec 30, 2025
604acb4
CI: split gen & build
Adeynack Dec 30, 2025
921c378
CI: multi OS
Adeynack Dec 30, 2025
4616465
CI: re-order jobs
Adeynack Dec 30, 2025
05a05ab
more Go pragmatic approach to validate
Adeynack Dec 30, 2025
a4cc1dc
get rid of TypeSpec (too buggy)
Adeynack Dec 30, 2025
67a18db
wip: adapt OAS manually
Adeynack Dec 30, 2025
ea74174
Rename Books_Index to ListBooks
Adeynack Dec 30, 2025
7240622
Rename Books_Create to CreateBook
Adeynack Dec 30, 2025
9cf3032
Rename other books operations.
Adeynack Dec 30, 2025
b0edd81
Revamp errors in OAS
Adeynack Dec 30, 2025
7662d13
Fix error generation from OAS
Adeynack Dec 30, 2025
f20229c
wip
Adeynack Dec 30, 2025
f0cc9bd
update book
Adeynack Jan 1, 2026
73512ef
delete book
Adeynack Jan 1, 2026
61c9e18
update dev wishlist
Adeynack Jan 3, 2026
be4de26
minimal API auth security
Adeynack Jan 4, 2026
c61f9a2
make target for running "serve" and default ("tui")
Adeynack Jan 4, 2026
8d161b4
print error if root comand fails
Adeynack Jan 4, 2026
139204f
move DB DSN determination
Adeynack Jan 4, 2026
e3fe2ef
import: delete book if already exists
Adeynack Jan 4, 2026
40f12bd
update wishlist
Adeynack Jan 4, 2026
baeb8a7
yaml inheritance before extras
Adeynack Jan 10, 2026
9f62c15
fix casing in OAS
Adeynack Jan 11, 2026
5df53eb
revamp model validation
Adeynack Jan 12, 2026
8eba89a
fix server test after rename of attribute
Adeynack Jan 12, 2026
e8bc235
BaseValidate
Adeynack Jan 12, 2026
effccb7
revamp validation
Adeynack Jan 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .claude/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Claude Code Configuration

This directory contains configuration and customizations for Claude Code.

## ⚠️ Project Requirements

**IMPORTANT:** This project requires `GOEXPERIMENT=jsonv2,synctest` for all `go` commands.

See [project-config.md](project-config.md) for complete details.

## Directory Structure

- `commands/` - Custom slash commands
- `skills/` - Reusable skills that can be invoked during conversations
- `prompts/` - Reusable prompts and sub-agent definitions
- `project-config.md` - Project-specific configuration and requirements

## Documentation

For more information, see the [Claude Code documentation](https://docs.claude.com/claude-code).
13 changes: 13 additions & 0 deletions .claude/commands/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Custom Slash Commands

Place custom slash command markdown files here. Each file defines a command that can be invoked with `/command-name`.

## Example

Create a file `example.md`:

```markdown
Print "Hello from custom command!"
```

Then invoke it with `/example` in Claude Code.
52 changes: 52 additions & 0 deletions .claude/commands/lint.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
---
description: Run comprehensive Go linting and static analysis tools
---

# Go Linting Suite

Run a comprehensive suite of Go linting and static analysis tools on the codebase.

**IMPORTANT:** This project requires `GOEXPERIMENT=jsonv2,synctest` to be set for all `go` commands. See `.claude/project-config.md` for details.

## Steps to Execute

1. **Run go vet**
- Execute: `go vet ./...`
- Report any issues with file paths and line numbers

2. **Run golangci-lint**
- Execute: `go tool golangci-lint run`
- Report any issues with file paths and line numbers
- Highlight critical vs warning vs style issues

3. **Summarize results**
- Count total issues by severity
- Provide clickable file references using markdown format: `[filename.go:42](path/to/filename.go#L42)`
- If all checks pass, clearly state "All linting checks passed ✓"
- If there are issues, prioritize them by severity

## Output Format

Present results in this format:

```
## Linting Results

### go vet
[Status and issues]

### staticcheck
[Status and issues]

### golangci-lint
[Status and issues]

### Summary
[Total count and severity breakdown]
```

## Error Handling

- If a linter fails due to version compatibility, note this and continue
- Don't fail the entire check if one linter has issues
- Suggest fixes when appropriate (e.g., adding `//lint:ignore` comments)
46 changes: 46 additions & 0 deletions .claude/project-config.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Project Configuration

This file contains project-specific configuration and requirements for Claude Code.

## Go Environment

**IMPORTANT:** All `go` commands in this project MUST be run with the `GOEXPERIMENT=jsonv2,synctest` environment variable set.

### Examples

```bash
# Running tests
GOEXPERIMENT=jsonv2,synctest go test ./...

# Running go vet
GOEXPERIMENT=jsonv2,synctest go vet ./...

# Building
GOEXPERIMENT=jsonv2,synctest go build ./...

# Running the application
GOEXPERIMENT=jsonv2,synctest go run ./cmd/app

# Installing tools
GOEXPERIMENT=jsonv2,synctest go install example.com/tool@latest
```

### Why?

This project uses the `jsonv2` experiment which provides an improved JSON API for Go.

### Linting Tools

When running linting tools that invoke `go`, ensure they also respect this environment variable:

```bash
# golangci-lint
GOEXPERIMENT=jsonv2,synctest go tool golangci-lint run

# staticcheck may also need this if it invokes go
GOEXPERIMENT=jsonv2,synctest staticcheck ./...
```

## Makefile

The project includes a Makefile that already sets `GOEXPERIMENT=jsonv2,synctest`. Prefer using `make` targets when available.
3 changes: 3 additions & 0 deletions .claude/prompts/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Prompts

Place reusable prompts and sub-agent definitions here. These can be referenced in commands, skills, or invoked directly.
7 changes: 7 additions & 0 deletions .claude/skills/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Skills

Place skill definitions here. Skills are specialized capabilities that can be invoked during conversations.

## Structure

Each skill should be in its own directory with a `skill.md` file that defines the skill's behavior.
64 changes: 64 additions & 0 deletions .github/workflows/pr-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: PR Check

on:
pull_request:
branches: [main]
push:
branches: [main]

jobs:
gen:
runs-on: ubuntu-latest
steps:
- &checkout
uses: actions/checkout@v4
- &setup-go
name: Set up Go
uses: actions/[email protected]
with:
go-version-file: "go.mod"
- name: Generate
run: make gen
- &check-no-mod
name: Ensure tracked files were up to date
run: ./scripts/git_tracked_are_unmodified
lint:
runs-on: ubuntu-latest
steps:
- *checkout
- *setup-go
- name: Lint
run: make lint-ci
- name: Determine golangci-lint version
id: golangci-lint-version
run: echo "golangci-lint-version=$(go list -modfile=golangci-lint.mod -m github.com/golangci/golangci-lint/v2 | awk '{print $2}')" >> "$GITHUB_OUTPUT"
- name: golangci-lint
uses: golangci/[email protected]
with:
version: ${{ steps.golangci-lint-version.outputs.golangci-lint-version }}
env:
GOEXPERIMENT: "jsonv2,synctest" # align with `Makefile` (export GOEXPERIMENT)
- *check-no-mod
test:
runs-on: ${{ matrix.os }}
strategy: &strategy
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- *checkout
- *setup-go
- name: Test
run: make test
env:
TEST_LOG: fail
- name: Ensure tracked files were up to date
run: ./scripts/git_tracked_are_unmodified
build:
runs-on: ${{ matrix.os }}
strategy: *strategy
steps:
- *checkout
- *setup-go
- name: Build
run: make build-only
- *check-no-mod
29 changes: 29 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# overmind
.overmind.sock

# macOS
.DS_Store

# Temporary files
/tmp/*
!/tmp/.keep

# Misc
/bin
__debug_bin*

# Programming languages
/vendor
/out
/node_modules

# Environment
.env
.env.*
!.env.example

# Claude Code
.claude/settings.local.json

# Misc IDEs
/.idea
70 changes: 70 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Run TUI",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/cmd/lapiasse",
"cwd": "${workspaceFolder}",
"args": [
"tui",
],
"env": {
"GOEXPERIMENT": "jsonv2,synctest",
}
},
{
"name": "Run Serve",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/cmd/lapiasse",
"cwd": "${workspaceFolder}",
"args": [
"serve",
],
"env": {
"GOEXPERIMENT": "jsonv2,synctest"
}
},
{
"name": "Run Serve, dry start",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/cmd/lapiasse",
"cwd": "${workspaceFolder}",
"args": [
"serve",
"--dry-start"
],
"env": {
"GOEXPERIMENT": "jsonv2,synctest"
}
},
{
"name": "Moneydance Importer",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/cmd/import_md_to_lapiasse",
"cwd": "${workspaceFolder}",
"args": [
"--md-source",
"${workspaceFolder}/tmp/md.json",
"--api-token",
"dev-static-token",
"--book-name",
"Dev Imported",
"--skip-suffix-to-book-name",
"--delete-book-if-exists",
"true"
],
"env": {
"GOEXPERIMENT": "jsonv2,synctest"
}
}
]
}
11 changes: 11 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"go.toolsEnvVars": {
"GOEXPERIMENT": "jsonv2,synctest",
"PWD": "${workspaceFolder}",
"WORKSPACE_ROOT": "${workspaceFolder}",
},
"go.buildTags": "test",
"yaml.schemas": {
"openapi:v3": "file:///Users/adeynack/src/github.com/Adeynack/lapiasse/pkg/api/lapiasse.oas.yaml"
}
}
Loading