Commit log

e1585a3 docs: update git-format reference

Click to expand commit body
Rename from formatted-commit to git-format and update URL from
https://git.secluded.site/formatted-commit to
https://git.secluded.site/git-format

Amolith created

378b153 docs: update installation instructions to use mise

Click to expand commit body
Replace bin with mise as the recommended tool for automated CLI
management. The old bin install command has been replaced with mise's
use -g go: syntax which provides equivalent functionality.

Amolith created

4b8da2e feat(auth): add LUNE_ACCESS_TOKEN env var support

Click to expand commit body
Enable authentication via LUNE_ACCESS_TOKEN environment variable as an
alternative to the system keyring. The env var takes precedence over
keyring for explicit override capability.

- GetToken() now checks env var first, then falls back to keyring
- New() delegates to GetToken() for single source of truth
- MCP command simplified to use centralized GetToken()

Amolith created

010a1ed feat(mcp): add OpenWorldHint and Title to tools

Click to expand commit body
Add OpenWorldHint (true) and human-readable Title to all 7 MCP tools:

- get_timestamp: Parse date
- add_timeline_note: Add timeline note
- track_habit: Track habit
- create: Create entity
- update: Update entity
- delete: Delete entity
- query: Query entities

The OpenWorldHint indicates these tools interact with external APIs
(Lunatask), and titles provide nicer UI labels for MCP clients.

Amolith created

9e530e7 chore(deps): bump go-lunatask to v0.1.0

Amolith created

6eac7df chore(deps): bump dependencies

Click to expand commit body
- golang.org/x/crypto v0.46.0 → v0.47.0
- al.essio.dev/pkg/shellescape v1.5.1 → v1.6.0
- github.com/charmbracelet/x/* updates
- github.com/clipperhouse/* updates
- github.com/godbus/dbus/v5 v5.1.0 → v5.2.2
- golang.org/x/oauth2 v0.30.0 → v0.34.0
- golang.org/x/sys v0.39.0 → v0.40.0
- golang.org/x/text v0.32.0 → v0.33.0

Assisted-by: Kimi K2.5 via Crush

Amolith created

676c697 docs: update cross-promo links

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

Amolith created

1eb3e4d feat: add workflow-aware status validation

Click to expand commit body
When creating or updating tasks, status is now validated against the
area's workflow. Error messages include valid options for that workflow:

invalid status for workflow: 'foo' for Kanban; valid: later, next, ...

MCP tools (create/update) validate when area context is available. The
query tool's hardcoded status list is replaced with a dynamic one.

CLI (task add/update) passes resolved area to status validation. When no
area is specified, falls back to listing all valid statuses.

Assisted-by: Claude Opus 4.5 via Crush

Amolith created

3ae5dc9 feat(area): add hint when goal list is truncated

Click to expand commit body
When any area has more than 3 goals, the table shows (+N). Users may not
realize they can dig deeper. Now a conditional hint appears below the
table:

(+N) = more goals; run 'lune goal list -a AREA' to see all

Only shown when truncation occurs, keeping the common case clean.

Also documents in AGENTS.md that dim text (ANSI 8) should be avoided for
accessibility—it's unreadable in many terminal color schemes.

Assisted-by: Claude Opus 4.5 via Crush

Amolith created

b44974a fix(cli): pass context to done shortcut

Click to expand commit body
The done command copies UpdateCmd to set --status=completed but wasn't
forwarding the context, causing 'net/http: nil Context' errors.

Assisted-by: Claude Opus 4.5 via Crush

Amolith created

ca99c6d docs(cli): add completed to status flag help

Click to expand commit body
Assisted-by: GLM 4.7 via Claude Code

Amolith created

e2bfc3f feat(mcp): add LUNE_ACCESS_TOKEN env var fallback

Click to expand commit body
Enables MCP server to run in containerized environments (e.g., Home
Assistant addons) where system keyrings aren't available.

Keyring errors are now silently ignored, falling back to the
LUNE_ACCESS_TOKEN environment variable.

Assisted-by: Claude Opus 4.5 via Crush <crush@charm.land>

Amolith created

68ab2b0 refactor(completion): use go-lunatask All*() funcs

Click to expand commit body
Add TaskStatuses, Priorities, and Motivations completion functions using
go-lunatask's All*() functions. Update Relationships to use
AllRelationshipStrengths(). Replace completion.Static() calls and
hardcoded 'started' strings with 'in-progress' to match go-lunatask's
normalized enum values.

Assisted-by: Claude Opus 4.5 via Crush <crush@charm.land>

Amolith created

0e4d155 refactor(mcp): add schemas and annotations

Click to expand commit body
- Add InputSchema() with enum constraints for CRUD tools
- Add ToolAnnotations() with behavioral hints (ReadOnlyHint,
DestructiveHint, IdempotentHint)
- Replace verbose descriptions with concise ones (schema conveys
  details)
- Use jsonschema:"description" tags instead of jsonschema:"required"
- Use go-lunatask All*() functions for type-safe enum values
- Bump go-lunatask to v0.1.0-rc9.3

Assisted-by: Claude Opus 4.5 via Crush

Amolith created

4293ed6 refactor(dateutil): use strtotime for date parsing

Click to expand commit body
Replace markusmobius/go-dateparser with KarpelesLab/strtotime for date
parsing. The new library uses PHP strtotime syntax which is more widely
documented and removes heavy dependencies (wazero, go-re2).

- Add ParseInTZ for timezone-aware parsing
- Update MCP timestamp tool to use timezone from handler
- Update docs and help text with new syntax examples

Assisted-by: Claude Opus 4.5 via Crush <crush@charm.land>

Amolith created

efa8645 fix: prefer ldflags version over build info

Click to expand commit body
Build info pseudo-versions (v0.1.0-rc.4.0.20251226...) were overriding
the nicer git-describe format injected via ldflags.

Assisted-by: Claude Sonnet 4 via Crush <crush@charm.land>

Amolith created

560cff9 feat(mcp): add optional Bearer token auth

Click to expand commit body
Adds argon2id-hashed token authentication for SSE and HTTP transports.
Tokens accepted via Authorization header or access_token query parameter
(RFC 6750). Auth enabled by presence of token_hash in config.

New command: lune mcp set-token

Assisted-by: Claude Sonnet 4 via Crush <crush@charm.land>

Amolith created

5d8ac7f fix: detect version from build info at runtime

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

Amolith created

35848a1 refactor(mcp)!: consolidate 23 tools into 7

Click to expand commit body
BREAKING CHANGE: Tool names have changed completely.

Before (23 tools): create_task, update_task, delete_task, list_tasks,
show_task, create_note, update_note, delete_note, list_notes, show_note,
create_person, update_person, delete_person, list_people, show_person,
add_timeline_note, track_habit, list_habits, list_areas, list_goals,
list_notebooks, add_journal_entry, get_timestamp

After (7 tools):
- create: entity={task, note, person, journal}
- update: entity={task, note, person}
- delete: entity={task, note, person}
- query: entity={task, note, person, area, goal, notebook, habit}
- track_habit: standalone action
- add_timeline_note: standalone action (extracted to timeline/)
- get_timestamp: standalone utility

Benefits:
- Clearer action-based semantics for LLM tool selection
- Reduced cognitive load (7 vs 23 tools)
- Consistent entity parameter across CRUD operations
- Config-based entities (area, goal, notebook, habit) now queryable

Also fixes track_habit to accept config keys, UUIDs, or deep links
(previously only accepted UUIDs).

Assisted-by: Claude Opus 4.5 via Crush

Amolith created

8268482 feat(mcp): scaffold consolidated CRUD tools

Click to expand commit body
Add stub handlers for create, update, delete, and query tools that will
replace the 23 per-entity tools with 7 consolidated tools:

- create: task, note, person, journal
- update: task, note, person
- delete: task, note, person
- query: all entities (default-disabled fallback for resources)

Includes Entity* constants, ToolsConfig flags, and wiring in server.go.
All handlers return "not yet implemented" pending migration.

Assisted-by: Claude Sonnet 4 via Crush

Amolith created

28b2b0e fix(mcp/task): require area_id in create_task

Click to expand commit body
The Lunatask API requires an area_id when creating tasks, but the MCP
tool incorrectly documented and typed it as optional.

Assisted-by: Claude Opus 4.5 via Crush <crush@charm.land>

Amolith created

be95484 feat(mcp): add list resources and fallback tools

Click to expand commit body
Resources:
- lunatask://notes, notes/pinned, notes/recent
- lunatask://notes/{notebook}, notes/{notebook}/pinned,
  notes/{notebook}/recent
- lunatask://people, people/{relationship}

Fallback tools (default-disabled):
- list_notebooks, list_habits, list_areas, list_goals
- show_person

Default-disable list_notes and list_people tools since resources are now
the primary read interface.

Assisted-by: Claude Sonnet 4 via Crush

Amolith created

be07926 docs: update architecture in AGENTS.md

Click to expand commit body
Add existing MCP tools and resources to the architecture diagram that
were missing from the list.

Assisted-by: Claude Opus 4.5 via Crush

Amolith created

22a0076 feat(mcp): add semantic task list resources

Click to expand commit body
Add MCP resources for filtered task lists, providing semantic views like
today, overdue, now, and high-priority without requiring the generic
list_tasks tool.

Static resources:
- lunatask://tasks/all (discouraged - expensive)
- lunatask://tasks/today
- lunatask://tasks/overdue
- lunatask://tasks/next-7-days
- lunatask://tasks/high-priority
- lunatask://tasks/now
- lunatask://tasks/recent-completions

Area-scoped templates (discovered via resources/templates/list):
- lunatask://area/{area}/tasks
- lunatask://area/{area}/today
- lunatask://area/{area}/overdue
- etc.

The {area} parameter accepts config keys or UUIDs.

Also default-disables list_tasks tool since resources are now the
primary interface for task discovery.

Assisted-by: Claude Opus 4.5 via Crush

Amolith created

892a225 feat(mcp): show_note tool, default-disable reads

Click to expand commit body
Implements show_note as a default-disabled fallback for the
lunatask://note/{id} resource.

Also default-disables all "read" tools (show_task, show_note,
show_person, list_habits) since MCP resources are the primary read
interface. Tools serve as fallbacks for agents that don't support
resources.

Assisted-by: Claude Sonnet 4 via Crush

Amolith created

3959af1 feat(mcp): add tool enable/disable CLI flags

Click to expand commit body
Mutually exclusive CLI flags for runtime control over MCP tool exposure:

- --enabled-tools a,b,c: ignore config, enable only listed tools
- --disabled-tools x,y,z: ignore config, enable everything except listed

Tool names match the MCP tool names exactly (what the model sees).
Validates tool names against known set before starting server.

Assisted-by: Claude Sonnet 4 via Crush

Amolith created

bb0713b feat(mcp): accept keys and deeplinks for area/goal

Click to expand commit body
MCP task tools now accept config keys and lunatask:// deep links in
addition to UUIDs for area_id and goal_id parameters.

Resolution order: UUID → deep link → config key lookup.

Adds validate.AreaRef() and validate.GoalRef() functions.

Assisted-by: Claude Sonnet 4 via Crush

Amolith created

372fae1 feat(area): add workflow support for LLM guidance

Click to expand commit body
Areas now store their Lunatask workflow type (kanban, now_later, etc.).
The init wizard prompts for workflow selection with descriptions. MCP
area resource exposes workflow metadata including valid statuses, and
which fields (motivation, eisenhower, scheduling, priority) are relevant
for each workflow.

Assisted-by: Claude Sonnet 4 via Crush

Amolith created

a1e9167 feat(mcp): add person CRUD and timeline tools

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

Amolith created

0444063 feat(person): make last name optional

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

Amolith created

fc40b3f feat(mcp): add note CRUD tools

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

Amolith created

26a88ec feat(mcp): add add_journal_entry tool

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

Amolith created

d4c1e16 feat(mcp): add lunatask:// resource templates

Click to expand commit body
Add MCP resource templates for reading individual resources:
- lunatask://task/{id} - task metadata
- lunatask://note/{id} - note metadata
- lunatask://person/{id} - person metadata

LLMs can now ReadResource using the same URI format as deep links.

Assisted-by: Claude Sonnet 4 via Crush

Amolith created

8dd80fe refactor(mcp): add natural language tool outputs

Click to expand commit body
- Add human-readable text content to all tool results
- Remove duplicate ID fields; use deep_link only
- Reduces context window bloat for LLM clients
- structuredContent still available for programmatic use

Assisted-by: Claude Sonnet 4 via Crush

Amolith created

edbac80 docs: document MCP server architecture

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

Amolith created

e6174c4 refactor(mcp): use go-lunatask v0.1.0-rc9.1 API

Click to expand commit body
Replace deprecated ParseDeepLink with ParseReference across all
reference-handling code. Replace local task filtering logic with
lunatask.FilterTasks in both CLI and MCP list handlers.

Extract parsing and builder application into separate helpers
(parseCreateInput, parseUpdateInput, applyToTaskBuilder,
applyToTaskUpdateBuilder) to reduce handler complexity.

Add nilerr exclusion for internal/mcp/ since MCP handlers return errors
in the result tuple rather than as Go errors.

Assisted-by: Claude Sonnet 4 via Crush

Amolith created

977ae8b feat(mcp): add MCP server mode

Click to expand commit body
Adds `lune mcp -t [stdio|sse|http]` to run lune as an MCP server,
replacing the separate lunatask-mcp-server project.

Tools:
- get_timestamp: parse natural language dates
- create_task, update_task, delete_task, list_tasks, show_task
- track_habit

Resources:
- lunatask://areas (areas and goals from config)
- lunatask://habits (habits from config)
- lunatask://notebooks (notebooks from config)

Config:
- [mcp] section with host, port, timezone
- [mcp.tools] section to enable/disable individual tools

Assisted-by: Claude Opus 4.5 via Crush <crush@charm.land>

Amolith created

f5ef0f6 feat(habit): add list subcommand

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

Amolith created

3b81414 refactor: inject version from main at build time

Click to expand commit body
Moves version declaration to main.go with a default of "dev", allowing
build-time injection via ldflags while keeping cmd.Execute() pure.

Assisted-by: Claude Opus 4.5 via Crush <crush@charm.land>

Amolith created

5c2f27c feat(ui): support non-interactive mode, NO_COLOR

Click to expand commit body
Detect non-interactive environments (piped output, scripts, CI) and
disable colors, styles, spinners, and table borders automatically.

Detection priority:
1. NO_COLOR env var (non-empty = plain)
2. FORCE_COLOR env var (explicit override)
3. TERM=dumb (plain)
4. TTY detection via isatty (non-TTY = plain)

Config ui.color setting ("auto", "always", "never") is respected.

Also adds `lune init --generate-config` for non-interactive setup, which
writes a commented example config for manual editing.

References: lunatask://tasks/7c9f3a83-db39-4bb4-afcb-bb73646e91bb
Assisted-by: Claude Sonnet 4 via Crush

Amolith created

01e35d7 feat(ui): add spinner feedback for network calls

Click to expand commit body
Wrap all API calls with huh/spinner for immediate visual feedback.

- Add generic Spin[T] and SpinVoid helpers in internal/ui/spinner.go
- Update all commands making network calls to use the helpers
- Use proper ellipsis (…) in spinner titles

Assisted-by: Claude Sonnet 4 via Crush

Amolith created

aa39ea8 docs(license): add 'em

Amolith created

12c5822 docs: add README

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

Amolith created

e75a60c chore: add SPDX headers and ignore .task

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

Amolith created

40ea681 refactor(deps): upgrade go-lunatask, drop deeplink

Click to expand commit body
Delete internal/deeplink/ package and simplify internal/validate/ by
delegating to new go-lunatask v0.1.0-rc10 functions: ParseDeepLink,
BuildDeepLink, ParseTaskStatus, ParseMotivation,
ParseRelationshipStrength.

Removes ~250 lines of code now provided upstream.

Assisted-by: Claude Sonnet 4 via Crush

Amolith created

a5c38a3 feat(init): auto-prompt for token in reconfigure

Click to expand commit body
When running `lune init` with an existing config but no keyring token
(e.g., after copying config to a new device), immediately prompt for the
access token before showing the configuration menu.

Also validates existing tokens and offers to replace them if ping fails.

Assisted-by: Claude Sonnet 4 via Crush

Amolith created

6afafbf docs: expand AGENTS.md with non-obvious patterns

Click to expand commit body
- Complete architecture section with all internal packages
- Document API client builder pattern
- Add gotchas: enum validation, date parsing, stdin convention,
deep links, config key lookups
- Update testing section with actual patterns
- Document init wizard navigation

Assisted-by: Claude Sonnet 4 via Crush

Amolith created

191aa60 feat(person): implement person module

Click to expand commit body
Fully implement person commands with Lunatask API integration:
- add: create people with relationship strength and source
- list: filter by relationship/source, table and JSON output
- show: display person details (renamed from get)
- update: modify names and relationship strength
- delete: with confirmation prompt
- timeline: add notes to person's memory timeline

Register shell completions for relationship flag.

Assisted-by: Claude Sonnet 4 via Crush

Amolith created

51c1acd feat(note): implement note module

Click to expand commit body
Fully implement note commands with Lunatask API integration:
- add: create notes with notebook, content, and source support
- list: filter by notebook/source, table and JSON output
- show: display note details (renamed from get)
- update: modify name, content, notebook, date
- delete: with confirmation prompt

Add NotebookByID helper to config package. Register shell completions
for notebook flag.

Assisted-by: Claude Sonnet 4 via Crush

Amolith created

ae0f649 feat(validate): add validation for enum types

Click to expand commit body
Add validation functions that lowercase and match against known
constants for TaskStatus, Motivation, and RelationshipStrength.

Wire validation into task add/update/list to reject invalid input early
with clear error messages instead of passing bogus values to the API.

Assisted-by: Claude Opus 4 via Crush

Amolith created