summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2026-04-14refactor: share .records file discovery (ask u3)Paul Buetow
Extract ListNonEmptyFiles and HostFromFileName into internal/recordsdir for aggregate and storage ImportFromDir. Behavior unchanged. Made-with: Cursor
2026-04-14y3: case-insensitive ParseCategory, ParseMetric, ParseOutputFormatPaul Buetow
Use strings.ToLower for POLA (CLI/HTTP). Extend parse tests with mixed-case and lowercase inputs. Made-with: Cursor
2026-04-14fix: safe HostAggregate lifespan/downtime and uint64 max boot (ask 34)Paul Buetow
Guard Lifespan and Downtime against uint64 underflow when LastSeen < FirstBoot or Uptime exceeds lifespan. Track per-host max BootTime with uint64 in LoadAggregates to match file aggregation and avoid int64 conversion bugs. Tests: lifespan underflow, downtime edge cases, LastKernel near MaxInt64. Made-with: Cursor
2026-04-14fix(t3): surface CreateSchema errors in integration import testPaul Buetow
Check CreateSchema in integration test runner so failures report 'create schema' instead of failing later on import. Extract testImportExportOnDB for the canceled-context regression test. Made-with: Cursor
2026-04-14recordline: reject invalid uptime/bootTime (s3)Paul Buetow
Return ok=false when strconv.ParseUint fails instead of using zero values. Add tests for non-numeric and empty numeric fields. Made-with: Cursor
2026-04-14fix(r3): use errors.Is for sentinel error comparisonsPaul Buetow
Replace direct == checks with errors.Is so wrapped errors are handled correctly (authkeys Verify, daemon server/EOF, Magefile uninstall). Refs: ask r3, 100 Go Mistakes #51 Made-with: Cursor
2026-04-14Enable race tests in mage automation (p3)Paul Buetow
- Test runs unit tests then race detector via mg.Deps - Add TestRace target for race-only runs - Document mage test vs testRace in AGENTS.md Made-with: Cursor
2026-04-14goprecords: wrap LoadRecords errors in LoadAggregates (ask o3)Paul Buetow
Use fmt.Errorf("load records: %%w", err) so import/query failures carry context. Add TestLoadAggregatesWrapsLoadRecordsError. Made-with: Cursor
2026-04-14n3: validate SQLite with PingContext after OpenPaul Buetow
Call db.PingContext in storage.Open and authkeys.OpenStore; close DB and return wrapped errors on failure. Add tests for canceled context and invalid directory path. Made-with: Cursor
2026-04-14refactor: extract record line parser to internal/recordline (m3)Paul Buetow
Deduplicate parseRecordLine from goprecords and storage; shared recordline.Parse with Fields type. Tests live in recordline package; DB import path still covered by goprecords TestImportFromDir. Made-with: Cursor
2026-04-14daemon: NewHandler returns error instead of panicking (l3)Paul Buetow
Replace Handler with NewHandler(statsDir) (http.Handler, error) when the auth store cannot be opened, matching Run's error wrapping. Tests use a small helper; add coverage for open failure on a read-only stats dir. Made-with: Cursor
2026-04-14daemon: set http.Server timeouts for Run (k3)Paul Buetow
Configure ReadHeaderTimeout, ReadTimeout, WriteTimeout, and IdleTimeout on the daemon listener to mitigate slowloris and stuck clients. Made-with: Cursor
2026-04-14test(daemon): race-safe log buffers in Run tests (j3)Paul Buetow
Use a mutex-wrapped buffer for slog and io.Copy so polling String() does not race concurrent writes from Run and background goroutines. Made-with: Cursor
2026-04-14docs(readme): microservice API and CLI compatibility (task 33)Paul Buetow
Document --daemon, stats vs import/query DB paths, GET /report query parameters including HTML, health/livez/readyz, uploads with Bearer auth, per-client keys and --create-client-key, plain HTTP + external TLS, and backward compatibility for CLI workflows. Made-with: Cursor
2026-04-14test: microservice coverage for task 63Paul Buetow
Add table-driven HTTP and unit tests for report (all formats, negatives), upload/auth boundaries, upload helpers, readiness, Run and logging. Extend authkeys tests for Close, CreateKey validation, and post-close errors. Add CLI tests for defaultListenFromEnv and create-client-key with -auth-db only. Add mage CoverMicroservice for local/CI-style coverage measurement. Use context.Background and os.Chdir for Go 1.21-compatible tests. Made-with: Cursor
2026-04-14daemon: add /livez and /readyz HTTP probes for KubernetesPaul Buetow
Liveness: GET /livez matches GET /health (200, process serving). Readiness: GET /readyz verifies stats-dir exists, is a directory, and is readable and writable; if -auth-db resolves outside stats-dir, that directory is checked too. Failures return 503 Service Unavailable. Refs: ask task 53 Made-with: Cursor
2026-04-14docs,test: HTTP upload API and curl auth example (ask 23)Paul Buetow
Document daemon plain-HTTP mode, PUT /upload paths for five uptimed files, Bearer token header, and env flags. Add table-driven test asserting each kind maps to the expected filename in stats-dir. Made-with: Cursor
2026-04-14task 13: upload API keys in SQLite, Bearer auth, create-client-key CLIPaul Buetow
- Add internal/authkeys with SHA-256 hashed tokens and KeyCount gate - PUT /upload/{host}/{kind} for uptimed files; auth when any key exists - Daemon -auth-db and Config.AuthDB; plain HTTP unchanged - CLI: goprecords --create-client-key HOSTNAME (-stats-dir|-auth-db) Made-with: Cursor
2026-04-14Add HTML OutputFormat and report API support (ask task 03)Paul Buetow
- Add FormatHTML with parse/string and HTMLReporter on existing report path - Emit minimal HTML document with escaped title, description, and pre table - Daemon /report sets text/html Content-Type for HTML format - Integration fixtures and tests for HTML Made-with: Cursor
2026-04-14daemon: stdout-only slog logging for HTTP (task 43)Paul Buetow
- Route http.Server ErrorLog and request access lines through slog text to stdout (or Config.LogOutput for tests). - Log daemon_listen on start and http_request per request (method, path, status, duration_ms). - CLI daemon: flag usage and missing-stats-dir message on stdout. Made-with: Cursor
2026-04-14test(x2): codify CLI backward-compatibility contractPaul Buetow
- Add internal/cli tests for stable entry points: -version/--version, file-based report (-stats-dir), import/query, test subcommand, -daemon/--daemon validation, and subcommand recognition. - Assert RegisterReportFlags keeps required flag names and defaults (CLI/HTTP). - Run integration import/export against a temp SQLite file instead of fixtures/test_import.db to avoid flaky readonly errors under parallel tests. Made-with: Cursor
2026-04-14z2: HTTP report query aliases and Gemtext Content-TypePaul Buetow
Accept Category, Metric, and OutputFormat as alternate query keys alongside category, metric, output-format. Serve Gemtext reports with text/gemini; assert Content-Type in daemon tests. Builds on y2 daemon GET /report reusing ParseReportQuery and WriteReports. Made-with: Cursor
2026-04-14Add --daemon plain HTTP server (y2)Paul Buetow
Long-lived goprecords --daemon with -stats-dir and -listen, env GOPRECORDS_STATS_DIR and GOPRECORDS_LISTEN. Serves GET /health and GET /report (query params match report flags). Uses standard http.Server; no TLS. Made-with: Cursor
2026-03-08incrementv0.2.40.2.4Paul Buetow
2026-03-08decrementPaul Buetow
2026-03-08incrementPaul Buetow
2026-03-08fix package namesPaul Buetow
2026-03-03chore: bump version to 0.2.3v0.2.30.2.3Paul Buetow
2026-03-03refactor(context): propagate context through db open and io scans (task 333)Paul Buetow
2026-03-03refactor(cli): move main orchestration into internal cli package (task 332)Paul Buetow
2026-03-03refactor(report): add format-specific reporter implementations (task 333)Paul Buetow
2026-03-03refactor(storage): separate DB operations into storage package (task 334)Paul Buetow
2026-02-28bump version to 0.2.2v0.2.20.2.2Paul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019ca323-dde1-73ac-97f0-cebfae5922a5 Co-authored-by: Amp <amp@ampcode.com>
2026-02-28refactor: split ImportFromDir into smaller functionsPaul Buetow
Extract per-file import logic into importFile helper. ImportFromDir reduced from 82 to 45 lines. Uses defer f.Close() for cleaner resource management. Task: 26d657e0-5d41-4953-adb7-38322618505a Amp-Thread-ID: https://ampcode.com/threads/T-019ca323-dde1-73ac-97f0-cebfae5922a5 Co-authored-by: Amp <amp@ampcode.com>
2026-02-28refactor: move integration test runner from main.go to internal packagePaul Buetow
Extract RunIntegrationTests into internal/goprecords with focused helpers: testReportFixtures, testStatsOrder, testImportExport. main.go reduced from 220 to 139 lines, with runTests now a thin 5-line wrapper. Task: 7247d93e-e4af-4e8d-8fdc-116e0b06c7d3 Amp-Thread-ID: https://ampcode.com/threads/T-019ca323-dde1-73ac-97f0-cebfae5922a5 Co-authored-by: Amp <amp@ampcode.com>
2026-02-28refactor: extract report config, flags, and rendering into internal packagePaul Buetow
Add ReportConfig, ReportFlags, RegisterReportFlags, and WriteReports to the internal goprecords package. Both runQuery and runReportFromFiles now use these shared functions, eliminating duplicated flag definitions and report-rendering loops. main.go reduced from 313 to 220 lines. Task: d8f7af80-1aca-4dea-9a20-b8f95640acb7 Amp-Thread-ID: https://ampcode.com/threads/T-019ca323-dde1-73ac-97f0-cebfae5922a5 Co-authored-by: Amp <amp@ampcode.com>
2026-02-28refactor: extract shared parseRecordLine to eliminate duplicationPaul Buetow
Extract record line parsing into a shared parseRecordLine function in types.go, replacing duplicated parsing logic in aggregate.go and db.go. Also simplifies lastKernelFromFile to use the shared function. Task: a6e5c545-a37d-41a8-8a98-f3edb28ab662 Amp-Thread-ID: https://ampcode.com/threads/T-019ca323-dde1-73ac-97f0-cebfae5922a5 Co-authored-by: Amp <amp@ampcode.com>
2026-02-20docs: add AGENTS.md and CLAUDE.md for AI agent instructionsPaul Buetow
2026-02-20test: add comprehensive unit tests for 82% coveragePaul Buetow
Added test suites: - types_test.go: Tests for Aggregate, HostAggregate, Epoch, Category, Metric, OutputFormat, word wrapping, and formatting functions - report_test.go: Tests for Reporter creation and report generation across different categories, metrics, and output formats - aggregate_test.go: Tests for file-based aggregation, context cancellation, and helper functions - db_test.go: Tests for database operations including schema creation, imports, record reset, and aggregate loading Coverage improved from 17.6% to 82.1%, exceeding the 70% target. Amp-Thread-ID: https://ampcode.com/threads/T-019c7c73-58f9-7516-958d-f30eb17a3bff Co-authored-by: Amp <amp@ampcode.com>
2026-02-20bump version to 0.2.1v0.2.1Paul Buetow
Performance improvement: - Use transactions for database imports (118x speedup) - Import time reduced from 11.2s to 0.076s Amp-Thread-ID: https://ampcode.com/threads/T-019c7c73-58f9-7516-958d-f30eb17a3bff Co-authored-by: Amp <amp@ampcode.com>
2026-02-20perf: use transactions for database imports (118x speedup)Paul Buetow
Previously, ImportFromDir was executing each of 2,587 records as individual INSERT statements, with each one creating its own transaction. This was extremely slow at ~11 seconds. Now wrap all inserts in a single database transaction, which is the standard approach for bulk data loading. This reduces import time from 11.2s to 0.076s (118x faster). Verified with: - Before: real 0m11.193s - After: real 0m0.076s Amp-Thread-ID: https://ampcode.com/threads/T-019c7c73-58f9-7516-958d-f30eb17a3bff Co-authored-by: Amp <amp@ampcode.com>
2026-02-20bump version to 0.2.0v0.2.0Paul Buetow
Major improvements: - Apply Go best practices (reorganized types, constructors, methods) - Remove obsolete files (guprecords.raku, compare-with-raku.sh) - Extract processRecordsFile helper function - Fix word-wrapping bug - Support database import/query workflow - Add database-backed uprecords Makefile target Amp-Thread-ID: https://ampcode.com/threads/T-019c7c73-58f9-7516-958d-f30eb17a3bff Co-authored-by: Amp <amp@ampcode.com>
2026-02-20refactor: apply Go best practices and remove obsolete filesPaul Buetow
- Reorganize types.go: place types and constructors before methods - Simplify main.go: improve flag handling and reduce code complexity - Extract processRecordsFile() in aggregate.go: reduce function size, ensure immediate defer - Change Reporter receivers to value semantics for read-only operations - Fix wordWrap() function: properly account for line length with leading space - Remove guprecords.raku: Go implementation is the primary version now - Remove compare-with-raku.sh: no longer needed - Update README.md and .gitignore accordingly All tests pass: go test ./... and ./goprecords test Amp-Thread-ID: https://ampcode.com/threads/T-019c7c73-58f9-7516-958d-f30eb17a3bff Co-authored-by: Amp <amp@ampcode.com>
2026-02-20Add Go implementation (goprecords)v0.1.0Paul Buetow
- cmd/goprecords: CLI with import, query, report-from-files, test - internal/goprecords: types, order, aggregate, db, report - internal/version: version constant (0.1.0) - SQLite import (repeatable: clears record table then inserts) - Magefile: Build, Test, Install, Uninstall - Table-driven unit tests; comparison script vs Raku guprecords - .gitignore: *.db, /goprecords binary Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-20updatePaul Buetow
2026-02-07add stats-order optionPaul Buetow
Allow custom section ordering for --all reports while keeping defaults and tests in place. Co-authored-by: Cursor <cursoragent@cursor.com>
2025-05-18update readme examplesPaul Buetow
2025-05-18update testsPaul Buetow
2025-05-18also show last kernelPaul Buetow
2025-01-08ignore empty stats filesPaul Buetow