This repo is the ShellTime CLI and daemon. Public-facing docs, command examples, and product references should use ShellTime and shelltime.xyz.
Code and imports currently use the module path github.com/malamtime/cli. Do not "fix" ShellTime branding in docs just because the module path says malamtime; the mismatch is intentional in the current repo state.
This is a Go monorepo for the ShellTime CLI and daemon.
cmd/cli/main.go: CLI entrypoint forshelltimecmd/daemon/main.go: daemon entrypoint forshelltime-daemoncommands/: CLI command definitions and user-facing command behaviordaemon/: background services, socket handling, processors, and OTEL handlersmodel/: config, API clients, shell integrations, crypto, and shared domain logicdocs/: user-facing docs such asCONFIG.mdandCC_STATUSLINE.mdfixtures/: reusable test fixtures
Keep new code inside the existing package boundary. Do not mix CLI wiring, daemon internals, and model logic in the same package.
go build -o shelltime ./cmd/cli/main.go: build the CLI binarygo build -o shelltime-daemon ./cmd/daemon/main.go: build the daemon binarygo test -timeout 3m -coverprofile=coverage.txt -covermode=atomic ./...: run the full suite with coveragego test ./commands/...: run command-package testsgo test ./daemon/...: run daemon-package testsgo test ./model/...: run model-package testsgo test -run TestName ./daemon/: run a targeted daemon testgo fmt ./...: format Go codego vet ./...: run static analysismockery: regenerate mocks when interfaces changepp g: regenerate PromptPal-generated artifacts when relevant
Use Go 1.26, as declared in go.mod.
Use standard Go conventions and keep code gofmt-clean.
- File naming: lowercase with underscores or dotted qualifiers such as
daemon.install.goorapi.base.go - Tests:
*_test.gowith clearTestXxxnames - Prefer table-driven tests for pure logic
- Use
testifysuites for stateful daemon flows - Keep comments brief and only where they reduce real ambiguity
- Put reusable payloads and fixtures under
fixtures/ - Prefer package-level test runs while iterating, then run the full suite before finishing
- Ensure
go test -timeout 3m -coverprofile=coverage.txt -covermode=atomic ./...passes before opening a PR or cutting a release
When command behavior, setup flow, config formats, or integrations change, update the docs in the same change.
README.md: concise user-facing overview, install/setup flow, current command surface, and linksdocs/CONFIG.md: detailed config semantics, file locations, defaults, and OTEL settingsdocs/CC_STATUSLINE.md: Claude Code statusline behavior, formatting, and platform notesAGENTS.md: contributor and agent workflow guidance for this repo
Do not leave README.md advertising commands that no longer exist, and do not document new commands only in code.
History follows Conventional Commits with scope, for example:
fix(daemon): ...feat(commands): ...refactor(model): ...docs(readme): ...
Keep commits focused on one behavioral change. PRs should include a short summary, why the change is needed, and test evidence. Link related issues when applicable. If behavior or output changes, include CLI examples or screenshots. Regenerate artifacts such as pp g and mockery when needed so CI remains green.