Commit log

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

Amolith created

34d254f docs(license): add for go.sum

Amolith created

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

Amolith created

b1d6c21 test(integration): add workflow metadata tests

Click to expand commit body
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

Amolith created

0041837 feat: add String methods to enum types

Click to expand commit body
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

Amolith created

f752909 feat(relationship): add parse function

Click to expand commit body
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

Amolith created

c080677 docs(agents): mention context7 ID

Amolith created

46113d9 feat(tasks): add typed Priority API

Click to expand commit body
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>

Amolith created

1093ede feat(people): add update person endpoint

Click to expand commit body
Assisted-by: Claude Opus 4.5 via Crush

Amolith created

ab6ef3b chore: remove exhaustruct linter

Click to expand commit body
Assisted-by: Claude Sonnet 4 via Crush

Amolith created

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

Amolith created

780cc03 docs: add coverage badge and update task

Click to expand commit body
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

Click to expand commit body
Assisted-by: Claude Opus 4.5 via Crush

Amolith created

18f4b49 feat(types): add MotivationUnknown, doc defaults

Click to expand commit body
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

Amolith created

a50e896 chore(lint): add varnamelen ignore rules

Click to expand commit body
Assisted-by: Claude Opus 4.5 via Crush

Amolith created

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

Amolith created

4a6f76b docs: fix examples and add doc links

Click to expand commit body
- 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

Amolith created

2bfbde0 docs(readme): point to module docs

Amolith created

81835f7 docs(badges): add pkg.do.dev alongside godocs.io

Amolith created

00ce7e1 fix: use real LICENSE file, not symlink

Click to expand commit body
Go module zips strip symlinks entirely.

Assisted-by: Kimi K2 Thinking via Crush

Amolith created

15c63ed chore: add LICENSE symlink for pkg.go.dev

Click to expand commit body
Assisted-by: Kimi K2 Thinking via Crush

Amolith created

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

Amolith created

f4ceb65 docs(client): fix access token instructions

Click to expand commit body
Assisted-by: Claude Opus 4.5 via Crush

Amolith created

2300d24 docs(readme): add

Amolith created

ed05579 extract from lunatask-mcp-server, polish

Amolith created