summaryrefslogtreecommitdiff
path: root/internal/cli
AgeCommit message (Collapse)Author
2026-04-18feat: add --kdbx-path CLI flag to override KeePass database path at runtimePaul Buetow
Allows specifying the .kdbx file path without editing the config file: foostore --backend keepass --kdbx-path /path/to/db.kdbx ls The flag overrides cfg.KDBXPath for the process lifetime. Implemented by extracting a shared parseFlagValue helper used by both parseBackendFlag and the new parseKDBXPathFlag. Help text updated to document both global flags. Table-driven tests added for parseKDBXPathFlag (mirrors TestParseBackendFlag). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17refactor: extract buildGeheimGit helper to keep buildGeheimBackend under 30 ↵Paul Buetow
lines Extracts a 3-line buildGeheimGit(cfg) helper from buildGeheimBackend, mirroring the existing buildKeepassGit pattern and satisfying the project guideline of keeping functions under 30 lines. Also includes the full o4 backend-abstraction changeset: Gitter interface, git.NoOp, --backend flag parsing, keepass backend wiring, and effectiveBackend guard for migrate-kdbx. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17refactor: deduplicate cli/kdbx_store.go using exported keepass helpers ↵Paul Buetow
(tasks k4+l4) Remove ~90 lines of duplicated code from kdbx_store.go by delegating to EnsureGroup, UpsertEntryByTitle, SetEntryField, SplitDescriptionPath, SanitizeRelativePath exported from internal/keepass. kdbxStore.Save() now delegates to keepass.AtomicSave, eliminating the double-close risk. migrate_kdbx.go updated to use the exported helpers. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17refactor: extract Backend interface decoupling CLI from *store.Store (task j4)Paul Buetow
Add internal/backend/backend.go with a Backend interface covering all 10 CLI-facing methods. Change CLI.st field type to backend.Backend. Compile-time guard var _ Backend = (*store.Store)(nil) prevents drift. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-07Add KeePass migration command with text/password and binary attachment supportPaul Buetow
2026-03-02cli: add isolated dispatch routing tests (task 401)Paul Buetow
2026-03-02store/cli: move search output to CLI layer (task 400)Paul Buetow
2026-03-02store: make Data carry injected deps (task 402)Paul Buetow
2026-03-02store/cli: deduplicate shred helper (task 400)Paul Buetow
2026-02-23Release v0.5.2v0.5.2Paul Buetow
2026-02-22Replace all geheim path/name defaults with foostorePaul Buetow
- Default data_dir: ~/git/geheimlager → ~/git/foostore-data - Default export_dir: ~/.geheimlagerexport → ~/.foostore-export - Default key_file: ~/.geheimlager.key → ~/.foostore.key - Rename env var GEHEIM_SHELL → FOOSTORE_SHELL - Update package-level comments across cli, shell, store, git, config - Update Magefile and CLAUDE.md docs to reflect new paths Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22Add unit tests to reach 63.3% coverage (task 335)Paul Buetow
- internal/shell/shell_internal_test.go (new): tests prefixCompleter.Do with table-driven cases covering empty prefix, partial match, no match, and multi-word line (prefix after space) - internal/cli/cli_test.go (new): tests pure helpers (logMsg, warn, printHelp, shredFile), dispatch paths with real store (ls, search, cat, rm, shred, get, paste, export, pathexport, open, edit, unknown command, empty argv), error paths for cmdAdd/cmdImport/cmdImportR, readPIN env-var path, completionFn commands-only path, makeActionFn nil cases - internal/store/store_test.go: added TestSearchActionPathExport, TestSearchActionWithCallback, TestSearchActionNilCallback, TestFzfEmpty, TestRemoveInteractiveInvalidThenDecline, TestImportForceOverwrite Total coverage: 44.8% → 63.3% Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22Rename binary from geheim to foostorePaul Buetow
- go.mod: module path codeberg.org/snonux/geheim → codeberg.org/snonux/foostore - cmd/geheim/ → cmd/foostore/ - Magefile.go: binary/binaryName/mainPkg constants updated - internal/config: config file path ~/.config/geheim.json → ~/.config/foostore.json - All import paths and comments updated throughout - Delete geheim.rb (the original Ruby implementation, superseded by this Go rewrite) - CLAUDE.md rewritten to reflect the Go implementation, new binary name, build system (mage), and current package architecture Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22Enforce Go best practices (task 344)Paul Buetow
- Magefile.go: add Default() target so bare `mage` builds the binary; fix Install()/Uninstall() to use $GOPATH/bin (default ~/go/bin) instead of the previous hardcoded ~/.local/bin path; use cp -v for visibility; fix 0755 -> 0o755 octal literal in createBinDir; extract binaryName const - cmd/geheim/main.go: add -version flag (prints version.Version and exits); pass flag.Args() instead of os.Args[1:] so flags are parsed cleanly - internal/cli/cli.go: remove dead fatal() and prompt() helpers that were never called anywhere in the codebase Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22Update main.go and cli API for signal-cancellable context (task 352/main)Paul Buetow
main.go: set up signal.NotifyContext(SIGINT, SIGTERM) so long-running operations (fzf, external editors) terminate gracefully on interrupts. Call cli.New(ctx) explicitly and pass the context to c.Run(ctx, argv), matching the task spec and allowing the context to flow through all store/git/crypto operations. cli: expose New(ctx) and Run(ctx, argv) as the public API; remove the package-level Run() helper that created its own context.Background(). Verified: mage build produces ./bin/geheim; PIN=test ./bin/geheim version prints "> geheim v0.4.0". Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22Implement internal/cli package (task 352/cli)Paul Buetow
Full command dispatch, interactive shell loop, and all geheim commands mirroring the Ruby CLI class (geheim.rb lines 551-713). Key design points: - CLI struct holds all runtime deps; lastResult field enables Ruby-style fallback search term when a search command is given without an argument - dispatch → dispatchSimple (no-term commands) + dispatchSearch (term-based) kept under ~50 lines each per style guidelines - ActionOpen shreds the exported file immediately after opening, matching Ruby's shred_file(delay: 0) call - import implements Ruby's three-way dest_dir logic: nil→full src_path, contains-dot→literal dest, plain-dir→dir/basename(src) - completionFn notes $PIN limitation for description completion - openExported extends Ruby's OS detection with xdg-open, iTerm, Termux heuristics; comment documents the divergence from Ruby's evince default Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22Add Go project scaffold (task 352)Paul Buetow
- go.mod with module codeberg.org/snonux/geheim (go 1.22, mage dep) - Magefile.go with Build, Test, Install, Uninstall targets - cmd/geheim/main.go delegating to internal/cli - Stub packages: cli, version, config, crypto, git, store, clipboard, shell - go.sum generated; binary confirmed to build via mage build Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>