cffcd2c
feat(enum): add All*() and status translation
Click to expand commit body
Add convenience functions to enumerate all valid values:
- AllTaskStatuses()
- AllPriorities()
- AllMotivations()
- AllRelationshipStrengths()
Each returns a slice in natural order with roundtrip tests.
Also translate StatusInProgress between user-facing "in-progress" and
API wire format "started" via JSON marshal/unmarshal.
Assisted-by: Claude Opus 4.5 via Crush
4527645
feat(workflow): add Workflow type and helpers
Click to expand commit body
Supports all six Lunatask workflows: priority_list, now_later, kanban,
plan_your_days, must_should_want, and eisenhower.
Includes methods for determining which task fields are relevant per
workflow (ValidStatuses, UsesMotivation, UsesEisenhower, UsesScheduling,
UsesPriority) and human-readable descriptions for MCP/LLM consumption.
Assisted-by: Claude Opus 4.5 via Crush
Amolith
created
2b6ea0c
feat(filter): add FilterTasks and IsOldCompleted
Click to expand commit body
Add TaskFilterOptions struct for configuring task list filtering by
area, goal, status, and completed date. FilterTasks applies these
filters to a task slice. IsOldCompleted is exported for custom filtering
needs.
Consolidates duplicate filtering logic from lune's CLI and MCP.
Assisted-by: Claude Sonnet 4 via Crush
Amolith
created
8646808
feat(deeplink): add ParseReference function
Click to expand commit body
Add ResourceUnknown constant and ErrInvalidReference error for clearer
API semantics. ParseReference provides better error messages for invalid
input ("expected UUID or lunatask:// deep link").
ParseDeepLink is deprecated and wraps ParseReference for backwards
compatibility.
Assisted-by: Claude Sonnet 4 via Crush
Test combinations of status, eisenhower, priority, and motivation fields
to determine whether lune needs to warn users about workflow
restrictions.
Covers:
- All metadata fields together
- Individual field isolation
- All eisenhower quadrants
- All kanban status values
- Field clearing and preservation
- Cross-workflow updates
Assisted-by: Claude Opus 4 via Crush
Amolith
created
a18734a
feat(deeplink): add UUID validation and helpers
Click to expand commit body
Add ValidateUUID using github.com/google/uuid. Add Resource.Valid() and
Resource.String() methods. Refactor ParseDeepLink/BuildDeepLink to use
new helpers. UUIDs are now validated in both parse and build operations.
Assisted-by: Claude Opus 4.5 via Amp
Amolith
created
f8e2e43
feat(eisenhower): add ParseEisenhower function
Click to expand commit body
Parses strings like "do-now", "delegate", or numeric "0"-"4" to
Eisenhower quadrants. Adds ErrInvalidEisenhower sentinel error.
Assisted-by: Claude Opus 4.5 via Amp
Add String() to Motivation, TaskStatus, and RelationshipStrength for
consistency with Eisenhower.
Assisted-by: Claude Opus 4.5 via Amp
Amolith
created
fad07e7
refactor: move enum types to companion files
Click to expand commit body
Move Motivation, TaskStatus, RelationshipStrength types and constants
from types.go to their respective files (motivation.go, status.go,
relationship.go). types.go now contains only Source and Date.
Assisted-by: Claude Sonnet 4 via Crush
ParseRelationshipStrength with case-insensitive parsing for all 7
values.
Assisted-by: Claude Sonnet 4 via Crush
Amolith
created
5698fed
feat(deeplink): add parse and build functions
Click to expand commit body
Resource type with 6 constants (areas, goals, tasks, notes, people,
notebooks). ParseDeepLink accepts lunatask://resource/uuid or plain
UUID.
Assisted-by: Claude Sonnet 4 via Crush
Amolith
created
935a005
refactor(status): rename Started to InProgress
Click to expand commit body
Matches Lunatask UI which shows "In Progress" instead of "Started". Wire
format remains "started"; also accepts "in-progress" as input.
Assisted-by: Claude Sonnet 4 via Crush
Amolith
created
8e81585
feat(motivation): add ParseMotivation function
Click to expand commit body
Case-insensitive parsing for unknown/must/should/want values.
Assisted-by: Claude Sonnet 4 via Crush
Amolith
created
6584af4
refactor(eisenhower): extract to file, add String
Click to expand commit body
Move Eisenhower type, constants, and methods from types.go to
eisenhower.go. Add String() method returning human-readable quadrant
descriptions for CLI display.
Assisted-by: Claude Sonnet 4 via Crush
Amolith
created
bad3517
feat(status): add ParseTaskStatus function
Click to expand commit body
Case-insensitive parsing of task status strings to typed TaskStatus
values. Matches ParsePriority pattern with ErrInvalidTaskStatus sentinel
error.
Assisted-by: Claude Sonnet 4 via Crush
Replace *int with *Priority for type safety. Rename WithPriority(int) to
Priority(Priority) on TaskBuilder and TaskUpdateBuilder.
Includes:
- Priority constants: PriorityLowest (-2) to PriorityHighest (2)
- String(), Valid(), ParsePriority(), JSON marshal/unmarshal
- Sentinel errors: ErrInvalidPriority, ErrPriorityOutOfRange
Assisted-by: Claude Sonnet 4 via Amp
Amolith
created
84c1b8a
feat(tasks): add Eisenhower semantic builder API
Click to expand commit body
Replaces raw int eisenhower values with typed Eisenhower constants and
adds intuitive builder methods (.Important(), .Urgent(),
.NotImportant(), .NotUrgent()) that compute the correct quadrant at
create/update time.
Consumers can now use:
client.NewTask("x").Important().Urgent().Create(ctx) // DoNow
client.NewTask("x").Important().Create(ctx) // DoLater
Reading tasks also benefits from helper methods:
task.Eisenhower.IsImportant()
task.Eisenhower.IsUrgent()
Assisted-by: Claude Opus 4.5 via Crush
Amolith
created
7dbcb31
test(integration): add live API validation tests
Click to expand commit body
Adds build-tagged integration tests that run against the live Lunatask
API. Requires LUNATASK_API_KEY and LUNATASK_TEST_AREA environment
variables.
Tests cover ping, list operations, and full create/read/update/delete
round-trips for tasks and notes.
Also excludes dupl and goconst linters from test files and updates
coverage badge.
Assisted-by: Claude Opus 4.5 via Crush <crush@charm.land>
ae0941f
refactor(client): move builders to Client methods
Click to expand commit body
Builders are now created via client.NewX() instead of lunatask.NewX(),
and Create/Update methods no longer require a client parameter.
Before: lunatask.NewTask("x").Create(ctx, client) After:
client.NewTask("x").Create(ctx)
Assisted-by: Claude Sonnet 4 via Crush
Add coverage badge to README and task to update it automatically.
Assisted-by: Claude Opus 4.5 via Crush
Amolith
created
47bac30
test: add comprehensive API endpoint tests
Click to expand commit body
Cover all major client methods with unit tests:
- helpers_test.go: shared mock servers and assertions
- Individual test files for habits, journal, notes, people, ping, tasks,
timeline
Include two small fixes discovered during testing:
- Remove client-side name validation for tasks (API says it's optional,
if impractical)
- Use value receiver for Date.MarshalJSON to support non-pointer dates
Assisted-by: Claude Opus 4.5 via Crush
Amolith
created
c81f221
refactor(client): drop With prefix from options
Click to expand commit body
Functional options now use plain names (HTTPClient, BaseURL, UserAgent)
to distinguish them from builder pattern methods (WithNote, WithStatus).
Updated package docs and README with UserAgent example.
Assisted-by: Claude Opus 4.5 via Crush
Amolith
created
69026b1
feat(client): add dynamic version and UA option
Click to expand commit body
Version is now determined at runtime via debug.ReadBuildInfo() instead
of being hardcoded. WithUserAgent option allows consumers to set a
custom User-Agent prefix; the library identifier is always appended.
Assisted-by: Claude Opus 4.5 via Crush
Amolith
created
a1ba550
fix(journal): validate date_on is required
Click to expand commit body
Assisted-by: Claude Opus 4.5 via Crush
Amolith
created
6c35add
refactor(people): require name in NewPerson
Click to expand commit body
Assisted-by: Claude Opus 4.5 via Crush
Amolith
created
309d7c6
feat(notes): add Pinned field to Note struct
Add MotivationUnknown constant for clearing/unsetting motivation.
Document default values for StatusLater, RelationshipCasualFriend, and
MotivationUnknown. Clarify Eisenhower quadrant meanings and task
duplicate detection constraints.
Assisted-by: Claude Opus 4.5 via Crush
c5d2d01
refactor: use direct Create/Update on builders
Click to expand commit body
- Add generic CRUD helpers in crud.go to reduce duplication
- Move builders from builders.go into their respective domain files
- Builders now call Create/Update directly instead of returning request
structs
- Make request types unexported (createTaskRequest, etc.)
- Update examples in README and AGENTS.md
Assisted-by: Claude Sonnet 4 via Crush
- Fix PersonBuilder example to use RelationshipCloseFriend constant
- Add godoc links for RelationshipCloseFriend, ErrUnauthorized
Assisted-by: Claude Sonnet 4 via Crush
Amolith
created
8bc2980
feat(tasks): add TaskStatus and Motivation types
Click to expand commit body
Replace raw strings with typed constants for better discoverability and
compile-time safety.
- TaskStatus: StatusLater, StatusNext, StatusStarted, StatusWaiting,
StatusCompleted
- Motivation: MotivationMust, MotivationShould, MotivationWant
Assisted-by: Claude Sonnet 4 via Crush
152fc32
feat(people): typed enums, custom field support
Click to expand commit body
- Add RelationshipStrength type with constants for valid values
- Add CustomFields map for arbitrary fields (email, birthday, phone,
etc.)
- Custom MarshalJSON flattens CustomFields to top-level JSON
- Add WithCustomField builder method
Assisted-by: Claude Opus 4.5 via Crush