···61616262# Add a book to your reading list
6363noteleaf media book add "The Name of the Wind"
6464+6565+# Generate docs
6666+noteleaf docgen --format docusaurus --out ./website/docs/manual
6467```
65686669## Status
+114
ROADMAP.md
···228228- [ ] Encryption support
229229- [ ] Advanced classification
230230231231+### Local API Server
232232+233233+A local HTTP server daemon that exposes Noteleaf data for web UIs and extensions. Runs on the user's machine and provides programmatic access to tasks, notes, and media.
234234+235235+#### Architecture
236236+237237+- [ ] Daemon mode via `noteleaf server start/stop/status`
238238+- [ ] Binds to localhost by default (configurable port)
239239+- [ ] HTTP/REST API using existing repository layer
240240+- [ ] Shares same SQLite database as CLI
241241+- [ ] Middleware: logging, CORS (for localhost web UIs), compression
242242+- [ ] Health and status endpoints
243243+244244+#### Daemon Management
245245+246246+- [ ] Commands: `start`, `stop`, `restart`, `status`
247247+- [ ] PID file tracking for process management
248248+- [ ] Systemd service file for Linux
249249+- [ ] launchd plist for macOS
250250+- [ ] Graceful shutdown with active request draining
251251+- [ ] Auto-restart on crash option
252252+- [ ] Configurable bind address and port
253253+- [ ] Log file rotation
254254+255255+#### API Endpoints
256256+257257+RESTful design matching CLI command structure:
258258+259259+- [ ] `GET /api/v1/tasks` - List tasks with filters
260260+- [ ] `POST /api/v1/tasks` - Create task
261261+- [ ] `GET /api/v1/tasks/:id` - Get task details
262262+- [ ] `PUT /api/v1/tasks/:id` - Update task
263263+- [ ] `DELETE /api/v1/tasks/:id` - Delete task
264264+- [ ] `POST /api/v1/tasks/:id/start` - Start time tracking
265265+- [ ] `POST /api/v1/tasks/:id/stop` - Stop time tracking
266266+- [ ] `GET /api/v1/tasks/:id/time-entries` - Get time entries
267267+- [ ] Similar CRUD endpoints for notes, books, movies, TV shows, articles
268268+- [ ] `GET /api/v1/projects` - List all projects
269269+- [ ] `GET /api/v1/tags` - List all tags
270270+- [ ] `GET /api/v1/contexts` - List all contexts
271271+- [ ] `GET /api/v1/stats` - Dashboard statistics
272272+273273+#### Real-time Updates
274274+275275+- [ ] WebSocket endpoint for live data updates
276276+- [ ] Server-Sent Events (SSE) as fallback
277277+- [ ] Event types: task created/updated/deleted, note modified, etc.
278278+- [ ] Subscribe to specific domains or IDs
279279+- [ ] Change notification for web UI reactivity
280280+281281+#### Authentication & Security
282282+283283+- [ ] Optional API token authentication (disabled by default for localhost)
284284+- [ ] Token stored in config file
285285+- [ ] Token rotation command
286286+- [ ] CORS configuration for allowed origins
287287+- [ ] Localhost-only binding by default (security through network isolation)
288288+- [ ] Optional TLS for local network access
289289+290290+#### Extension System
291291+292292+- [ ] Webhook endpoints for extension registration
293293+- [ ] Event hooks for task/note lifecycle:
294294+ - [ ] Before/after create, update, delete
295295+ - [ ] Task completion, start, stop
296296+ - [ ] Note archive/unarchive
297297+- [ ] Webhook delivery with retries
298298+- [ ] Extension manifest for discovery
299299+- [ ] JavaScript plugin API (embedded V8/goja runtime)
300300+- [ ] Plugin sandbox for security
301301+302302+#### Web UI
303303+304304+- [ ] Reference web UI implementation
305305+- [ ] Static file serving from embedded assets
306306+- [ ] Single-page application architecture
307307+- [ ] Responsive design (desktop, tablet, mobile)
308308+- [ ] Features:
309309+ - [ ] Task board view (Kanban)
310310+ - [ ] Calendar view for tasks
311311+ - [ ] Note editor with Markdown preview
312312+ - [ ] Media queue management
313313+ - [ ] Search and filtering
314314+ - [ ] Keyboard shortcuts matching CLI
315315+316316+#### Configuration
317317+318318+- [ ] Server config section in noteleaf.toml:
319319+ - [ ] bind_address (default: 127.0.0.1)
320320+ - [ ] port (default: 8080)
321321+ - [ ] enable_auth (default: false)
322322+ - [ ] api_token (optional)
323323+ - [ ] enable_websocket (default: true)
324324+ - [ ] log_level (default: info)
325325+- [ ] Environment variable overrides
326326+- [ ] CLI flag overrides for daemon commands
327327+328328+#### Monitoring & Diagnostics
329329+330330+- [ ] `GET /health` - Health check endpoint
331331+- [ ] `GET /metrics` - Prometheus-compatible metrics
332332+- [ ] Request logging (access log)
333333+- [ ] Error logging with stack traces
334334+- [ ] Performance metrics (request duration, DB query time)
335335+- [ ] Active connections and goroutine count
336336+- [ ] Memory and CPU usage stats
337337+338338+#### Client Libraries
339339+340340+- [ ] Go client library for extensions
341341+- [ ] JavaScript/TypeScript client for web UIs
342342+- [ ] OpenAPI/Swagger specification
343343+- [ ] Auto-generated API documentation
344344+231345## Technical Infrastructure
232346233347### Completed
+110-5
cmd/commands.go
···3434}
35353636func (c *MovieCommand) Create() *cobra.Command {
3737- root := &cobra.Command{Use: "movie", Short: "Manage movie watch queue"}
3737+ root := &cobra.Command{
3838+ Use: "movie",
3939+ Short: "Manage movie watch queue",
4040+ Long: `Track movies you want to watch.
4141+4242+Search TMDB for movies and add them to your queue. Mark movies as watched when
4343+completed. Maintains a history of your movie watching activity.`,
4444+ }
38453946 addCmd := &cobra.Command{
4047 Use: "add [search query...]",
···5966 root.AddCommand(&cobra.Command{
6067 Use: "list [--all|--watched|--queued]",
6168 Short: "List movies in queue with status filtering",
6969+ Long: `Display movies in your queue with optional status filters.
7070+7171+Shows movie titles, release years, and current status. Filter by --all to show
7272+everything, --watched for completed movies, or --queued for unwatched items.
7373+Default shows queued movies only.`,
6274 RunE: func(cmd *cobra.Command, args []string) error {
6375 var status string
6476 if len(args) > 0 {
···8294 Use: "watched [id]",
8395 Short: "Mark movie as watched",
8496 Aliases: []string{"seen"},
9797+ Long: "Mark a movie as watched with current timestamp. Moves the movie from queued to watched status.",
8598 Args: cobra.ExactArgs(1),
8699 RunE: func(cmd *cobra.Command, args []string) error {
87100 return c.handler.MarkWatched(cmd.Context(), args[0])
···92105 Use: "remove [id]",
93106 Short: "Remove movie from queue",
94107 Aliases: []string{"rm"},
108108+ Long: "Remove a movie from your watch queue. Use this for movies you no longer want to track.",
95109 Args: cobra.ExactArgs(1),
96110 RunE: func(cmd *cobra.Command, args []string) error {
97111 return c.handler.Remove(cmd.Context(), args[0])
···112126}
113127114128func (c *TVCommand) Create() *cobra.Command {
115115- root := &cobra.Command{Use: "tv", Short: "Manage TV show watch queue"}
129129+ root := &cobra.Command{
130130+ Use: "tv",
131131+ Short: "Manage TV show watch queue",
132132+ Long: `Track TV shows and episodes.
133133+134134+Search TMDB for TV shows and add them to your queue. Track which shows you're
135135+currently watching, mark episodes as watched, and maintain a complete history
136136+of your viewing activity.`,
137137+ }
116138117139 addCmd := &cobra.Command{
118140 Use: "add [search query...]",
···137159 root.AddCommand(&cobra.Command{
138160 Use: "list [--all|--queued|--watching|--watched]",
139161 Short: "List TV shows in queue with status filtering",
162162+ Long: `Display TV shows in your queue with optional status filters.
163163+164164+Shows show titles, air dates, and current status. Filter by --all, --queued,
165165+--watching for shows in progress, or --watched for completed series. Default
166166+shows queued shows only.`,
140167 RunE: func(cmd *cobra.Command, args []string) error {
141168 var status string
142169 if len(args) > 0 {
···161188 root.AddCommand(&cobra.Command{
162189 Use: "watching [id]",
163190 Short: "Mark TV show as currently watching",
191191+ Long: "Mark a TV show as currently watching. Use this when you start watching a series.",
164192 Args: cobra.ExactArgs(1),
165193 RunE: func(cmd *cobra.Command, args []string) error {
166194 return c.handler.MarkTVShowWatching(cmd.Context(), args[0])
···171199 Use: "watched [id]",
172200 Short: "Mark TV show/episodes as watched",
173201 Aliases: []string{"seen"},
202202+ Long: `Mark TV show episodes or entire series as watched.
203203+204204+Updates episode tracking and completion status. Can mark individual episodes
205205+or complete seasons/series depending on ID format.`,
174206 Args: cobra.ExactArgs(1),
175207 RunE: func(cmd *cobra.Command, args []string) error {
176208 return c.handler.MarkWatched(cmd.Context(), args[0])
···181213 Use: "remove [id]",
182214 Short: "Remove TV show from queue",
183215 Aliases: []string{"rm"},
216216+ Long: "Remove a TV show from your watch queue. Use this for shows you no longer want to track.",
184217 Args: cobra.ExactArgs(1),
185218 RunE: func(cmd *cobra.Command, args []string) error {
186219 return c.handler.Remove(cmd.Context(), args[0])
···201234}
202235203236func (c *BookCommand) Create() *cobra.Command {
204204- root := &cobra.Command{Use: "book", Short: "Manage reading list"}
237237+ root := &cobra.Command{
238238+ Use: "book",
239239+ Short: "Manage reading list",
240240+ Long: `Track books and reading progress.
241241+242242+Search Google Books API to add books to your reading list. Track which books
243243+you're reading, update progress percentages, and maintain a history of finished
244244+books.`,
245245+ }
205246206247 addCmd := &cobra.Command{
207248 Use: "add [search query...]",
···222263 root.AddCommand(&cobra.Command{
223264 Use: "list [--all|--reading|--finished|--queued]",
224265 Short: "Show reading queue with progress",
266266+ Long: `Display books in your reading list with progress indicators.
267267+268268+Shows book titles, authors, and reading progress percentages. Filter by --all,
269269+--reading for books in progress, --finished for completed books, or --queued
270270+for books not yet started. Default shows queued books only.`,
225271 RunE: func(cmd *cobra.Command, args []string) error {
226272 var status string
227273 if len(args) > 0 {
···245291 root.AddCommand(&cobra.Command{
246292 Use: "reading <id>",
247293 Short: "Mark book as currently reading",
294294+ Long: "Mark a book as currently reading. Use this when you start a book from your queue.",
248295 Args: cobra.ExactArgs(1),
249296 RunE: func(cmd *cobra.Command, args []string) error {
250297 return c.handler.UpdateStatus(cmd.Context(), args[0], "reading")
···255302 Use: "finished <id>",
256303 Short: "Mark book as completed",
257304 Aliases: []string{"read"},
305305+ Long: "Mark a book as finished with current timestamp. Sets reading progress to 100%.",
258306 Args: cobra.ExactArgs(1),
259307 RunE: func(cmd *cobra.Command, args []string) error {
260308 return c.handler.UpdateStatus(cmd.Context(), args[0], "finished")
···265313 Use: "remove <id>",
266314 Short: "Remove from reading list",
267315 Aliases: []string{"rm"},
316316+ Long: "Remove a book from your reading list. Use this for books you no longer want to track.",
268317 Args: cobra.ExactArgs(1),
269318 RunE: func(cmd *cobra.Command, args []string) error {
270319 return c.handler.UpdateStatus(cmd.Context(), args[0], "removed")
···274323 root.AddCommand(&cobra.Command{
275324 Use: "progress <id> <percentage>",
276325 Short: "Update reading progress percentage (0-100)",
326326+ Long: `Set reading progress for a book.
327327+328328+Specify a percentage value between 0 and 100 to indicate how far you've
329329+progressed through the book. Automatically updates status to 'reading' if not
330330+already set.`,
277331 Args: cobra.ExactArgs(2),
278332 RunE: func(cmd *cobra.Command, args []string) error {
279333 progress, err := strconv.Atoi(args[1])
···287341 root.AddCommand(&cobra.Command{
288342 Use: "update <id> <status>",
289343 Short: "Update book status (queued|reading|finished|removed)",
344344+ Long: `Change a book's status directly.
345345+346346+Valid statuses are: queued (not started), reading (in progress), finished
347347+(completed), or removed (no longer tracking).`,
290348 Args: cobra.ExactArgs(2),
291349 RunE: func(cmd *cobra.Command, args []string) error {
292350 return c.handler.UpdateStatus(cmd.Context(), args[0], args[1])
···307365}
308366309367func (c *NoteCommand) Create() *cobra.Command {
310310- root := &cobra.Command{Use: "note", Short: "Manage notes"}
368368+ root := &cobra.Command{
369369+ Use: "note",
370370+ Short: "Manage notes",
371371+ Long: `Create and organize markdown notes with tags.
372372+373373+Write notes in markdown format, organize them with tags, browse them in an
374374+interactive TUI, and edit them in your preferred editor. Notes are stored as
375375+files on disk with metadata tracked in the database.`,
376376+ }
311377312378 createCmd := &cobra.Command{
313379 Use: "create [title] [content...]",
314380 Short: "Create a new note",
315381 Aliases: []string{"new"},
382382+ Long: `Create a new markdown note.
383383+384384+Provide a title and optional content inline, or use --interactive to open an
385385+editor. Use --file to import content from an existing markdown file. Notes
386386+support tags for organization and full-text search.
387387+388388+Examples:
389389+ noteleaf note create "Meeting notes" "Discussed project timeline"
390390+ noteleaf note create -i
391391+ noteleaf note create --file ~/documents/draft.md`,
316392 RunE: func(cmd *cobra.Command, args []string) error {
317393 interactive, _ := cmd.Flags().GetBool("interactive")
318394 editor, _ := cmd.Flags().GetBool("editor")
···365441 Use: "read [note-id]",
366442 Short: "Display formatted note content with syntax highlighting",
367443 Aliases: []string{"view"},
444444+ Long: `Display note content with formatted markdown rendering.
445445+446446+Shows the note with syntax highlighting, proper formatting, and metadata.
447447+Useful for quick viewing without opening an editor.`,
368448 Args: cobra.ExactArgs(1),
369449 RunE: func(cmd *cobra.Command, args []string) error {
370450 if noteID, err := parseID("note", args); err != nil {
···379459 root.AddCommand(&cobra.Command{
380460 Use: "edit [note-id]",
381461 Short: "Edit note in configured editor",
462462+ Long: `Open note in your configured text editor.
463463+464464+Uses the editor specified in your noteleaf configuration or the EDITOR
465465+environment variable. Changes are automatically saved when you close the
466466+editor.`,
382467 Args: cobra.ExactArgs(1),
383468 RunE: func(cmd *cobra.Command, args []string) error {
384469 if noteID, err := parseID("note", args); err != nil {
···394479 Use: "remove [note-id]",
395480 Short: "Permanently removes the note file and metadata",
396481 Aliases: []string{"rm", "delete", "del"},
482482+ Long: `Delete a note permanently.
483483+484484+Removes both the markdown file and database metadata. This operation cannot be
485485+undone. You will be prompted for confirmation before deletion.`,
397486 Args: cobra.ExactArgs(1),
398487 RunE: func(cmd *cobra.Command, args []string) error {
399488 if noteID, err := parseID("note", args); err != nil {
···419508}
420509421510func (c *ArticleCommand) Create() *cobra.Command {
422422- root := &cobra.Command{Use: "article", Short: "Manage saved articles"}
511511+ root := &cobra.Command{
512512+ Use: "article",
513513+ Short: "Manage saved articles",
514514+ Long: `Save and archive web articles locally.
515515+516516+Parse articles from supported websites, extract clean content, and save as
517517+both markdown and HTML. Maintains a searchable archive of articles with
518518+metadata including author, title, and publication date.`,
519519+ }
423520424521 addCmd := &cobra.Command{
425522 Use: "add <url>",
···465562 Use: "view <id>",
466563 Short: "View article details and content preview",
467564 Aliases: []string{"show"},
565565+ Long: `Display article metadata and summary.
566566+567567+Shows article title, author, publication date, URL, and a brief content
568568+preview. Use 'read' command to view the full article content.`,
468569 Args: cobra.ExactArgs(1),
469570 RunE: func(cmd *cobra.Command, args []string) error {
470571 if articleID, err := parseID("article", args); err != nil {
···499600 Use: "remove <id>",
500601 Short: "Remove article and associated files",
501602 Aliases: []string{"rm", "delete"},
603603+ Long: `Delete an article and its files permanently.
604604+605605+Removes the article metadata from the database and deletes associated markdown
606606+and HTML files. This operation cannot be undone.`,
502607 Args: cobra.ExactArgs(1),
503608 RunE: func(cmd *cobra.Command, args []string) error {
504609 if articleID, err := parseID("article", args); err != nil {
+36-2
cmd/main.go
···1313 "github.com/stormlightlabs/noteleaf/internal/store"
1414 "github.com/stormlightlabs/noteleaf/internal/ui"
1515 "github.com/stormlightlabs/noteleaf/internal/utils"
1616+ "github.com/stormlightlabs/noteleaf/tools"
1617)
17181819var (
···5859 return &cobra.Command{
5960 Use: "status",
6061 Short: "Show application status and configuration",
6262+ Long: `Display comprehensive application status information.
6363+6464+Shows database location, configuration file path, data directories, and current
6565+settings. Use this command to verify your noteleaf installation and diagnose
6666+configuration issues.`,
6167 RunE: func(cmd *cobra.Command, args []string) error {
6268 return handlers.Status(cmd.Context(), args, cmd.OutOrStdout())
6369 },
···6874 return &cobra.Command{
6975 Use: "reset",
7076 Short: "Reset the application (removes all data)",
7777+ Long: `Remove all application data and return to initial state.
7878+7979+This command deletes the database, all media files, notes, and articles. The
8080+configuration file is preserved. Use with caution as this operation cannot be
8181+undone. You will be prompted for confirmation before deletion proceeds.`,
7182 RunE: func(cmd *cobra.Command, args []string) error {
7283 return handlers.Reset(cmd.Context(), args)
7384 },
···7788func rootCmd() *cobra.Command {
7889 root := &cobra.Command{
7990 Use: "noteleaf",
8080- Long: ui.Georgia.ColoredInViewport(),
8191 Short: "A TaskWarrior-inspired CLI with notes, media queues and reading lists",
9292+ Long: `noteleaf - personal information manager for the command line
9393+9494+A comprehensive CLI tool for managing tasks, notes, articles, and media queues.
9595+Inspired by TaskWarrior, noteleaf combines todo management with reading lists,
9696+watch queues, and a personal knowledge base.
9797+9898+Core features include hierarchical tasks with dependencies, recurring tasks,
9999+time tracking, markdown notes with tags, article archiving, and media queue
100100+management for books, movies, and TV shows.`,
82101 RunE: func(c *cobra.Command, args []string) error {
83102 if len(args) == 0 {
84103 return c.Help()
···107126 root := &cobra.Command{
108127 Use: "setup",
109128 Short: "Initialize and manage application setup",
129129+ Long: `Initialize noteleaf for first use.
130130+131131+Creates the database, configuration file, and required data directories. Run
132132+this command after installing noteleaf or when setting up a new environment.
133133+Safe to run multiple times as it will skip existing resources.`,
110134 RunE: func(c *cobra.Command, args []string) error {
111135 return handlers.Setup(c.Context(), args)
112136 },
···194218 root.AddCommand(cmd)
195219 }
196220197197- mediaCmd := &cobra.Command{Use: "media", Short: "Manage media queues (books, movies, TV shows)"}
221221+ mediaCmd := &cobra.Command{
222222+ Use: "media",
223223+ Short: "Manage media queues (books, movies, TV shows)",
224224+ Long: `Track and manage reading lists and watch queues.
225225+226226+Organize books, movies, and TV shows you want to consume. Search external
227227+databases to add items, track reading/watching progress, and maintain a
228228+history of completed media.`,
229229+ }
198230 mediaCmd.GroupID = "core"
199231 mediaCmd.AddCommand(NewMovieCommand(movieHandler).Create())
200232 mediaCmd.AddCommand(NewTVCommand(tvHandler).Create())
···207239 cmd.GroupID = "management"
208240 root.AddCommand(cmd)
209241 }
242242+243243+ root.AddCommand(tools.NewDocGenCommand(root))
210244211245 opts := []fang.Option{
212246 fang.WithVersion("0.1.0"),
+100-1
cmd/task_commands.go
···1818}
19192020func (c *TaskCommand) Create() *cobra.Command {
2121- root := &cobra.Command{Use: "todo", Aliases: []string{"task"}, Short: "task management"}
2121+ root := &cobra.Command{
2222+ Use: "todo",
2323+ Aliases: []string{"task"},
2424+ Short: "task management",
2525+ Long: `Manage tasks with TaskWarrior-inspired features.
2626+2727+Track todos with priorities, projects, contexts, and tags. Supports hierarchical
2828+tasks with parent/child relationships, task dependencies, recurring tasks, and
2929+time tracking. Tasks can be filtered by status, priority, project, or context.`,
3030+ }
22312332 for _, init := range []func(*handlers.TaskHandler) *cobra.Command{
2433 addTaskCmd, listTaskCmd, viewTaskCmd, updateTaskCmd, editTaskCmd,
···3847 Use: "add [description]",
3948 Short: "Add a new task",
4049 Aliases: []string{"create", "new"},
5050+ Long: `Create a new task with description and optional attributes.
5151+5252+Tasks can be created with priority levels (low, medium, high, urgent), assigned
5353+to projects and contexts, tagged for organization, and configured with due dates
5454+and recurrence rules. Dependencies can be established to ensure tasks are
5555+completed in order.
5656+5757+Examples:
5858+ noteleaf todo add "Write documentation" --priority high --project docs
5959+ noteleaf todo add "Weekly review" --recur "FREQ=WEEKLY" --due 2024-01-15`,
4160 Args: cobra.MinimumNArgs(1),
4261 RunE: func(c *cobra.Command, args []string) error {
4362 description := strings.Join(args, " ")
···101120 viewCmd := &cobra.Command{
102121 Use: "view [task-id]",
103122 Short: "View task by ID",
123123+ Long: `Display detailed information for a specific task.
124124+125125+Shows all task attributes including description, status, priority, project,
126126+context, tags, due date, creation time, and modification history. Use --json
127127+for machine-readable output or --no-metadata to show only the description.`,
104128 Args: cobra.ExactArgs(1),
105129 RunE: func(cmd *cobra.Command, args []string) error {
106130 format, _ := cmd.Flags().GetString("format")
···120144 updateCmd := &cobra.Command{
121145 Use: "update [task-id]",
122146 Short: "Update task properties",
147147+ Long: `Modify attributes of an existing task.
148148+149149+Update any task property including description, status, priority, project,
150150+context, due date, recurrence rule, or parent task. Add or remove tags and
151151+dependencies. Multiple attributes can be updated in a single command.
152152+153153+Examples:
154154+ noteleaf todo update 123 --priority urgent --due tomorrow
155155+ noteleaf todo update 456 --add-tag urgent --project website`,
123156 Args: cobra.ExactArgs(1),
124157 RunE: func(cmd *cobra.Command, args []string) error {
125158 taskID := args[0]
···160193 Use: "projects",
161194 Short: "List projects",
162195 Aliases: []string{"proj"},
196196+ Long: `Display all projects with task counts.
197197+198198+Shows each project used in your tasks along with the number of tasks in each
199199+project. Use --todo-txt to format output with +project syntax for compatibility
200200+with todo.txt tools.`,
163201 RunE: func(c *cobra.Command, args []string) error {
164202 static, _ := c.Flags().GetBool("static")
165203 todoTxt, _ := c.Flags().GetBool("todo-txt")
···179217 Use: "tags",
180218 Short: "List tags",
181219 Aliases: []string{"t"},
220220+ Long: `Display all tags used across tasks.
221221+222222+Shows each tag with the number of tasks using it. Tags provide flexible
223223+categorization orthogonal to projects and contexts.`,
182224 RunE: func(c *cobra.Command, args []string) error {
183225 static, _ := c.Flags().GetBool("static")
184226 defer h.Close()
···193235 cmd := &cobra.Command{
194236 Use: "start [task-id]",
195237 Short: "Start time tracking for a task",
238238+ Long: `Begin tracking time spent on a task.
239239+240240+Records the start time for a work session. Only one task can be actively
241241+tracked at a time. Use --note to add a description of what you're working on.`,
196242 Args: cobra.ExactArgs(1),
197243 RunE: func(c *cobra.Command, args []string) error {
198244 taskID := args[0]
···210256 return &cobra.Command{
211257 Use: "stop [task-id]",
212258 Short: "Stop time tracking for a task",
259259+ Long: `End time tracking for the active task.
260260+261261+Records the end time and calculates duration for the current work session.
262262+Duration is added to the task's total time tracked.`,
213263 Args: cobra.ExactArgs(1),
214264 RunE: func(c *cobra.Command, args []string) error {
215265 taskID := args[0]
···246296 Use: "edit [task-id]",
247297 Short: "Edit task interactively with status picker and priority toggle",
248298 Aliases: []string{"e"},
299299+ Long: `Open interactive editor for task modification.
300300+301301+Provides a user-friendly interface with status picker and priority toggle.
302302+Easier than using multiple command-line flags for complex updates.`,
249303 Args: cobra.ExactArgs(1),
250304 RunE: func(c *cobra.Command, args []string) error {
251305 taskID := args[0]
···259313 return &cobra.Command{
260314 Use: "delete [task-id]",
261315 Short: "Delete a task",
316316+ Long: `Permanently remove a task from the database.
317317+318318+This operation cannot be undone. Consider updating the task status to
319319+'deleted' instead if you want to preserve the record for historical purposes.`,
262320 Args: cobra.ExactArgs(1),
263321 RunE: func(c *cobra.Command, args []string) error {
264322 defer h.Close()
···272330 Use: "contexts",
273331 Short: "List contexts (locations)",
274332 Aliases: []string{"con", "loc", "ctx", "locations"},
333333+ Long: `Display all contexts with task counts.
334334+335335+Contexts represent locations or environments where tasks can be completed (e.g.,
336336+@home, @office, @errands). Use --todo-txt to format output with @context syntax
337337+for compatibility with todo.txt tools.`,
275338 RunE: func(c *cobra.Command, args []string) error {
276339 static, _ := c.Flags().GetBool("static")
277340 todoTxt, _ := c.Flags().GetBool("todo-txt")
···290353 Use: "done [task-id]",
291354 Short: "Mark task as completed",
292355 Aliases: []string{"complete"},
356356+ Long: `Mark a task as completed with current timestamp.
357357+358358+Sets the task status to 'completed' and records the completion time. For
359359+recurring tasks, generates the next instance based on the recurrence rule.`,
293360 Args: cobra.ExactArgs(1),
294361 RunE: func(c *cobra.Command, args []string) error {
295362 defer h.Close()
···303370 Use: "recur",
304371 Short: "Manage task recurrence",
305372 Aliases: []string{"repeat"},
373373+ Long: `Configure recurring task patterns.
374374+375375+Create tasks that repeat on a schedule using iCalendar recurrence rules (RRULE).
376376+Supports daily, weekly, monthly, and yearly patterns with optional end dates.`,
306377 }
307378308379 setCmd := &cobra.Command{
309380 Use: "set [task-id]",
310381 Short: "Set recurrence rule for a task",
382382+ Long: `Apply a recurrence rule to create repeating task instances.
383383+384384+Uses iCalendar RRULE syntax (e.g., "FREQ=DAILY" for daily tasks, "FREQ=WEEKLY;BYDAY=MO,WE,FR"
385385+for specific weekdays). When a recurring task is completed, the next instance is
386386+automatically generated.
387387+388388+Examples:
389389+ noteleaf todo recur set 123 --rule "FREQ=DAILY"
390390+ noteleaf todo recur set 456 --rule "FREQ=WEEKLY;BYDAY=MO" --until 2024-12-31`,
311391 Args: cobra.ExactArgs(1),
312392 RunE: func(c *cobra.Command, args []string) error {
313393 rule, _ := c.Flags().GetString("rule")
···322402 clearCmd := &cobra.Command{
323403 Use: "clear [task-id]",
324404 Short: "Clear recurrence rule from a task",
405405+ Long: `Remove recurrence from a task.
406406+407407+Converts a recurring task to a one-time task. Existing future instances are not
408408+affected.`,
325409 Args: cobra.ExactArgs(1),
326410 RunE: func(c *cobra.Command, args []string) error {
327411 defer h.Close()
···332416 showCmd := &cobra.Command{
333417 Use: "show [task-id]",
334418 Short: "Show recurrence details for a task",
419419+ Long: `Display recurrence rule and schedule information.
420420+421421+Shows the RRULE pattern, next occurrence date, and recurrence end date if
422422+configured.`,
335423 Args: cobra.ExactArgs(1),
336424 RunE: func(c *cobra.Command, args []string) error {
337425 defer h.Close()
···348436 Use: "depend",
349437 Short: "Manage task dependencies",
350438 Aliases: []string{"dep", "deps"},
439439+ Long: `Create and manage task dependencies.
440440+441441+Establish relationships where one task must be completed before another can
442442+begin. Useful for multi-step workflows and project management.`,
351443 }
352444353445 addCmd := &cobra.Command{
354446 Use: "add [task-id] [depends-on-uuid]",
355447 Short: "Add a dependency to a task",
448448+ Long: `Make a task dependent on another task's completion.
449449+450450+The first task cannot be started until the second task is completed. Use task
451451+UUIDs to specify dependencies.`,
356452 Args: cobra.ExactArgs(2),
357453 RunE: func(c *cobra.Command, args []string) error {
358454 defer h.Close()
···364460 Use: "remove [task-id] [depends-on-uuid]",
365461 Short: "Remove a dependency from a task",
366462 Aliases: []string{"rm"},
463463+ Long: "Delete a dependency relationship between two tasks.",
367464 Args: cobra.ExactArgs(2),
368465 RunE: func(c *cobra.Command, args []string) error {
369466 defer h.Close()
···375472 Use: "list [task-id]",
376473 Short: "List dependencies for a task",
377474 Aliases: []string{"ls"},
475475+ Long: "Show all tasks that must be completed before this task can be started.",
378476 Args: cobra.ExactArgs(1),
379477 RunE: func(c *cobra.Command, args []string) error {
380478 defer h.Close()
···385483 blockedByCmd := &cobra.Command{
386484 Use: "blocked-by [task-id]",
387485 Short: "Show tasks blocked by this task",
486486+ Long: "Display all tasks that depend on this task's completion.",
388487 Args: cobra.ExactArgs(1),
389488 RunE: func(c *cobra.Command, args []string) error {
390489 defer h.Close()
···11+---
22+id: articles
33+title: Articles
44+sidebar_position: 3
55+description: Save and archive web articles
66+---
77+88+## article
99+1010+Save and archive web articles locally.
1111+1212+Parse articles from supported websites, extract clean content, and save as
1313+both markdown and HTML. Maintains a searchable archive of articles with
1414+metadata including author, title, and publication date.
1515+1616+```bash
1717+noteleaf article
1818+```
1919+2020+### Subcommands
2121+2222+#### add
2323+2424+Parse and save article content from a supported website.
2525+2626+The article will be parsed using domain-specific XPath rules and saved
2727+as both Markdown and HTML files. Article metadata is stored in the database.
2828+2929+**Usage:**
3030+3131+```bash
3232+noteleaf article add <url>
3333+```
3434+3535+#### list
3636+3737+List saved articles with optional filtering.
3838+3939+Use query to filter by title, or use flags for more specific filtering.
4040+4141+**Usage:**
4242+4343+```bash
4444+noteleaf article list [query] [flags]
4545+```
4646+4747+**Options:**
4848+4949+```
5050+ --author string Filter by author
5151+ -l, --limit int Limit number of results (0 = no limit)
5252+```
5353+5454+**Aliases:** ls
5555+5656+#### view
5757+5858+Display article metadata and summary.
5959+6060+Shows article title, author, publication date, URL, and a brief content
6161+preview. Use 'read' command to view the full article content.
6262+6363+**Usage:**
6464+6565+```bash
6666+noteleaf article view <id>
6767+```
6868+6969+**Aliases:** show
7070+7171+#### read
7272+7373+Read the full markdown content of an article with beautiful formatting.
7474+7575+This displays the complete article content using syntax highlighting and proper formatting.
7676+7777+**Usage:**
7878+7979+```bash
8080+noteleaf article read <id>
8181+```
8282+8383+#### remove
8484+8585+Delete an article and its files permanently.
8686+8787+Removes the article metadata from the database and deletes associated markdown
8888+and HTML files. This operation cannot be undone.
8989+9090+**Usage:**
9191+9292+```bash
9393+noteleaf article remove <id>
9494+```
9595+9696+**Aliases:** rm, delete
9797+
+115
website/docs/manual/books.md
···11+---
22+id: books
33+title: Books
44+sidebar_position: 4
55+description: Manage reading list and track progress
66+---
77+88+## book
99+1010+Track books and reading progress.
1111+1212+Search Google Books API to add books to your reading list. Track which books
1313+you're reading, update progress percentages, and maintain a history of finished
1414+books.
1515+1616+```bash
1717+noteleaf media book
1818+```
1919+2020+### Subcommands
2121+2222+#### add
2323+2424+Search for books and add them to your reading list.
2525+2626+By default, shows search results in a simple list format where you can select by number.
2727+Use the -i flag for an interactive interface with navigation keys.
2828+2929+**Usage:**
3030+3131+```bash
3232+noteleaf media book add [search query...] [flags]
3333+```
3434+3535+**Options:**
3636+3737+```
3838+ -i, --interactive Use interactive interface for book selection
3939+```
4040+4141+#### list
4242+4343+Display books in your reading list with progress indicators.
4444+4545+Shows book titles, authors, and reading progress percentages. Filter by --all,
4646+--reading for books in progress, --finished for completed books, or --queued
4747+for books not yet started. Default shows queued books only.
4848+4949+**Usage:**
5050+5151+```bash
5252+noteleaf media book list [--all|--reading|--finished|--queued]
5353+```
5454+5555+#### reading
5656+5757+Mark a book as currently reading. Use this when you start a book from your queue.
5858+5959+**Usage:**
6060+6161+```bash
6262+noteleaf media book reading <id>
6363+```
6464+6565+#### finished
6666+6767+Mark a book as finished with current timestamp. Sets reading progress to 100%.
6868+6969+**Usage:**
7070+7171+```bash
7272+noteleaf media book finished <id>
7373+```
7474+7575+**Aliases:** read
7676+7777+#### remove
7878+7979+Remove a book from your reading list. Use this for books you no longer want to track.
8080+8181+**Usage:**
8282+8383+```bash
8484+noteleaf media book remove <id>
8585+```
8686+8787+**Aliases:** rm
8888+8989+#### progress
9090+9191+Set reading progress for a book.
9292+9393+Specify a percentage value between 0 and 100 to indicate how far you've
9494+progressed through the book. Automatically updates status to 'reading' if not
9595+already set.
9696+9797+**Usage:**
9898+9999+```bash
100100+noteleaf media book progress <id> <percentage>
101101+```
102102+103103+#### update
104104+105105+Change a book's status directly.
106106+107107+Valid statuses are: queued (not started), reading (in progress), finished
108108+(completed), or removed (no longer tracking).
109109+110110+**Usage:**
111111+112112+```bash
113113+noteleaf media book update <id> <status>
114114+```
115115+
+78
website/docs/manual/configuration.md
···11+---
22+id: configuration
33+title: Configuration
44+sidebar_position: 7
55+description: Manage application configuration
66+---
77+88+## config
99+1010+Manage noteleaf configuration
1111+1212+```bash
1313+noteleaf config
1414+```
1515+1616+### Subcommands
1717+1818+#### get
1919+2020+Display configuration values.
2121+2222+If no key is provided, displays all configuration values.
2323+Otherwise, displays the value for the specified key.
2424+2525+**Usage:**
2626+2727+```bash
2828+noteleaf config get [key]
2929+```
3030+3131+#### set
3232+3333+Update a configuration value.
3434+3535+Available keys:
3636+ database_path - Custom database file path
3737+ data_dir - Custom data directory
3838+ date_format - Date format string (default: 2006-01-02)
3939+ color_scheme - Color scheme (default: default)
4040+ default_view - Default view mode (default: list)
4141+ default_priority - Default task priority
4242+ editor - Preferred text editor
4343+ articles_dir - Articles storage directory
4444+ notes_dir - Notes storage directory
4545+ auto_archive - Auto-archive completed items (true/false)
4646+ sync_enabled - Enable synchronization (true/false)
4747+ sync_endpoint - Synchronization endpoint URL
4848+ sync_token - Synchronization token
4949+ export_format - Default export format (default: json)
5050+ movie_api_key - API key for movie database
5151+ book_api_key - API key for book database
5252+5353+**Usage:**
5454+5555+```bash
5656+noteleaf config set <key> <value>
5757+```
5858+5959+#### path
6060+6161+Display the path to the configuration file being used.
6262+6363+**Usage:**
6464+6565+```bash
6666+noteleaf config path
6767+```
6868+6969+#### reset
7070+7171+Reset all configuration values to their defaults.
7272+7373+**Usage:**
7474+7575+```bash
7676+noteleaf config reset
7777+```
7878+
+37
website/docs/manual/index.md
···11+---
22+id: index
33+title: CLI Reference
44+sidebar_label: Overview
55+sidebar_position: 0
66+description: Complete command-line reference for noteleaf
77+---
88+99+# noteleaf CLI Reference
1010+1111+noteleaf - personal information manager for the command line
1212+1313+A comprehensive CLI tool for managing tasks, notes, articles, and media queues.
1414+Inspired by TaskWarrior, noteleaf combines todo management with reading lists,
1515+watch queues, and a personal knowledge base.
1616+1717+Core features include hierarchical tasks with dependencies, recurring tasks,
1818+time tracking, markdown notes with tags, article archiving, and media queue
1919+management for books, movies, and TV shows.
2020+2121+## Usage
2222+2323+```bash
2424+noteleaf
2525+```
2626+2727+## Command Groups
2828+2929+- **[Task Management](tasks)** - Manage todos, projects, and time tracking
3030+- **[Notes](notes)** - Create and organize markdown notes
3131+- **[Articles](articles)** - Save and archive web articles
3232+- **[Books](books)** - Track reading list and progress
3333+- **[Movies](movies)** - Manage movie watch queue
3434+- **[TV Shows](tv-shows)** - Track TV show watching
3535+- **[Configuration](configuration)** - Manage settings
3636+- **[Management](management)** - Application management
3737+
+61
website/docs/manual/management.md
···11+---
22+id: management
33+title: Management
44+sidebar_position: 8
55+description: Application management commands
66+---
77+88+## status
99+1010+Display comprehensive application status information.
1111+1212+Shows database location, configuration file path, data directories, and current
1313+settings. Use this command to verify your noteleaf installation and diagnose
1414+configuration issues.
1515+1616+```bash
1717+noteleaf status
1818+```
1919+2020+## setup
2121+2222+Initialize noteleaf for first use.
2323+2424+Creates the database, configuration file, and required data directories. Run
2525+this command after installing noteleaf or when setting up a new environment.
2626+Safe to run multiple times as it will skip existing resources.
2727+2828+```bash
2929+noteleaf setup
3030+```
3131+3232+### Subcommands
3333+3434+#### seed
3535+3636+Add sample tasks, books, and notes to the database for testing and demonstration purposes
3737+3838+**Usage:**
3939+4040+```bash
4141+noteleaf setup seed [flags]
4242+```
4343+4444+**Options:**
4545+4646+```
4747+ -f, --force Clear existing data and re-seed
4848+```
4949+5050+## reset
5151+5252+Remove all application data and return to initial state.
5353+5454+This command deletes the database, all media files, notes, and articles. The
5555+configuration file is preserved. Use with caution as this operation cannot be
5656+undone. You will be prompted for confirmation before deletion proceeds.
5757+5858+```bash
5959+noteleaf reset
6060+```
6161+
+77
website/docs/manual/movies.md
···11+---
22+id: movies
33+title: Movies
44+sidebar_position: 5
55+description: Track movies in watch queue
66+---
77+88+## movie
99+1010+Track movies you want to watch.
1111+1212+Search TMDB for movies and add them to your queue. Mark movies as watched when
1313+completed. Maintains a history of your movie watching activity.
1414+1515+```bash
1616+noteleaf media movie
1717+```
1818+1919+### Subcommands
2020+2121+#### add
2222+2323+Search for movies and add them to your watch queue.
2424+2525+By default, shows search results in a simple list format where you can select by number.
2626+Use the -i flag for an interactive interface with navigation keys.
2727+2828+**Usage:**
2929+3030+```bash
3131+noteleaf media movie add [search query...] [flags]
3232+```
3333+3434+**Options:**
3535+3636+```
3737+ -i, --interactive Use interactive interface for movie selection
3838+```
3939+4040+#### list
4141+4242+Display movies in your queue with optional status filters.
4343+4444+Shows movie titles, release years, and current status. Filter by --all to show
4545+everything, --watched for completed movies, or --queued for unwatched items.
4646+Default shows queued movies only.
4747+4848+**Usage:**
4949+5050+```bash
5151+noteleaf media movie list [--all|--watched|--queued]
5252+```
5353+5454+#### watched
5555+5656+Mark a movie as watched with current timestamp. Moves the movie from queued to watched status.
5757+5858+**Usage:**
5959+6060+```bash
6161+noteleaf media movie watched [id]
6262+```
6363+6464+**Aliases:** seen
6565+6666+#### remove
6767+6868+Remove a movie from your watch queue. Use this for movies you no longer want to track.
6969+7070+**Usage:**
7171+7272+```bash
7373+noteleaf media movie remove [id]
7474+```
7575+7676+**Aliases:** rm
7777+
+114
website/docs/manual/notes.md
···11+---
22+id: notes
33+title: Notes
44+sidebar_position: 2
55+description: Create and organize markdown notes
66+---
77+88+## note
99+1010+Create and organize markdown notes with tags.
1111+1212+Write notes in markdown format, organize them with tags, browse them in an
1313+interactive TUI, and edit them in your preferred editor. Notes are stored as
1414+files on disk with metadata tracked in the database.
1515+1616+```bash
1717+noteleaf note
1818+```
1919+2020+### Subcommands
2121+2222+#### create
2323+2424+Create a new markdown note.
2525+2626+Provide a title and optional content inline, or use --interactive to open an
2727+editor. Use --file to import content from an existing markdown file. Notes
2828+support tags for organization and full-text search.
2929+3030+Examples:
3131+ noteleaf note create "Meeting notes" "Discussed project timeline"
3232+ noteleaf note create -i
3333+ noteleaf note create --file ~/documents/draft.md
3434+3535+**Usage:**
3636+3737+```bash
3838+noteleaf note create [title] [content...] [flags]
3939+```
4040+4141+**Options:**
4242+4343+```
4444+ -e, --editor Prompt to open note in editor after creation
4545+ -f, --file string Create note from markdown file
4646+ -i, --interactive Open interactive editor
4747+```
4848+4949+**Aliases:** new
5050+5151+#### list
5252+5353+Opens interactive TUI browser for navigating and viewing notes
5454+5555+**Usage:**
5656+5757+```bash
5858+noteleaf note list [--archived] [--static] [--tags=tag1,tag2] [flags]
5959+```
6060+6161+**Options:**
6262+6363+```
6464+ -a, --archived Show archived notes
6565+ -s, --static Show static list instead of interactive TUI
6666+ --tags string Filter by tags (comma-separated)
6767+```
6868+6969+**Aliases:** ls
7070+7171+#### read
7272+7373+Display note content with formatted markdown rendering.
7474+7575+Shows the note with syntax highlighting, proper formatting, and metadata.
7676+Useful for quick viewing without opening an editor.
7777+7878+**Usage:**
7979+8080+```bash
8181+noteleaf note read [note-id]
8282+```
8383+8484+**Aliases:** view
8585+8686+#### edit
8787+8888+Open note in your configured text editor.
8989+9090+Uses the editor specified in your noteleaf configuration or the EDITOR
9191+environment variable. Changes are automatically saved when you close the
9292+editor.
9393+9494+**Usage:**
9595+9696+```bash
9797+noteleaf note edit [note-id]
9898+```
9999+100100+#### remove
101101+102102+Delete a note permanently.
103103+104104+Removes both the markdown file and database metadata. This operation cannot be
105105+undone. You will be prompted for confirmation before deletion.
106106+107107+**Usage:**
108108+109109+```bash
110110+noteleaf note remove [note-id]
111111+```
112112+113113+**Aliases:** rm, delete, del
114114+
+861
website/docs/manual/tasks.md
···11+---
22+id: task-management
33+title: Task Management
44+sidebar_position: 1
55+description: Manage tasks with TaskWarrior-inspired features
66+---
77+88+## todo
99+1010+Manage tasks with TaskWarrior-inspired features.
1111+1212+Track todos with priorities, projects, contexts, and tags. Supports hierarchical
1313+tasks with parent/child relationships, task dependencies, recurring tasks, and
1414+time tracking. Tasks can be filtered by status, priority, project, or context.
1515+1616+```bash
1717+noteleaf todo
1818+```
1919+2020+### Subcommands
2121+2222+#### add
2323+2424+Create a new task with description and optional attributes.
2525+2626+Tasks can be created with priority levels (low, medium, high, urgent), assigned
2727+to projects and contexts, tagged for organization, and configured with due dates
2828+and recurrence rules. Dependencies can be established to ensure tasks are
2929+completed in order.
3030+3131+Examples:
3232+ noteleaf todo add "Write documentation" --priority high --project docs
3333+ noteleaf todo add "Weekly review" --recur "FREQ=WEEKLY" --due 2024-01-15
3434+3535+**Usage:**
3636+3737+```bash
3838+noteleaf todo add [description] [flags]
3939+```
4040+4141+**Options:**
4242+4343+```
4444+ -c, --context string Set task context
4545+ --depends-on string Set task dependencies (comma-separated UUIDs)
4646+ -d, --due string Set due date (YYYY-MM-DD)
4747+ --parent string Set parent task UUID
4848+ -p, --priority string Set task priority
4949+ --project string Set task project
5050+ --recur string Set recurrence rule (e.g., FREQ=DAILY)
5151+ -t, --tags strings Add tags to task
5252+ --until string Set recurrence end date (YYYY-MM-DD)
5353+```
5454+5555+**Aliases:** create, new
5656+5757+#### list
5858+5959+List tasks with optional filtering and display modes.
6060+6161+By default, shows tasks in an interactive TaskWarrior-like interface.
6262+Use --static to show a simple text list instead.
6363+Use --all to show all tasks, otherwise only pending tasks are shown.
6464+6565+**Usage:**
6666+6767+```bash
6868+noteleaf todo list [flags]
6969+```
7070+7171+**Options:**
7272+7373+```
7474+ -a, --all Show all tasks (default: pending only)
7575+ --context string Filter by context
7676+ -i, --interactive Force interactive mode (default)
7777+ --priority string Filter by priority
7878+ --project string Filter by project
7979+ --static Use static text output instead of interactive
8080+ --status string Filter by status
8181+```
8282+8383+**Aliases:** ls
8484+8585+#### view
8686+8787+Display detailed information for a specific task.
8888+8989+Shows all task attributes including description, status, priority, project,
9090+context, tags, due date, creation time, and modification history. Use --json
9191+for machine-readable output or --no-metadata to show only the description.
9292+9393+**Usage:**
9494+9595+```bash
9696+noteleaf todo view [task-id] [flags]
9797+```
9898+9999+**Options:**
100100+101101+```
102102+ --format string Output format (detailed, brief) (default "detailed")
103103+ --json Output as JSON
104104+ --no-metadata Hide creation/modification timestamps
105105+```
106106+107107+#### update
108108+109109+Modify attributes of an existing task.
110110+111111+Update any task property including description, status, priority, project,
112112+context, due date, recurrence rule, or parent task. Add or remove tags and
113113+dependencies. Multiple attributes can be updated in a single command.
114114+115115+Examples:
116116+ noteleaf todo update 123 --priority urgent --due tomorrow
117117+ noteleaf todo update 456 --add-tag urgent --project website
118118+119119+**Usage:**
120120+121121+```bash
122122+noteleaf todo update [task-id] [flags]
123123+```
124124+125125+**Options:**
126126+127127+```
128128+ --add-depends string Add task dependencies (comma-separated UUIDs)
129129+ --add-tag strings Add tags to task
130130+ -c, --context string Set task context
131131+ --description string Update task description
132132+ -d, --due string Set due date (YYYY-MM-DD)
133133+ --parent string Set parent task UUID
134134+ -p, --priority string Set task priority
135135+ --project string Set task project
136136+ --recur string Set recurrence rule (e.g., FREQ=DAILY)
137137+ --remove-depends string Remove task dependencies (comma-separated UUIDs)
138138+ --remove-tag strings Remove tags from task
139139+ --status string Update task status
140140+ -t, --tags strings Add tags to task
141141+ --until string Set recurrence end date (YYYY-MM-DD)
142142+```
143143+144144+#### edit
145145+146146+Open interactive editor for task modification.
147147+148148+Provides a user-friendly interface with status picker and priority toggle.
149149+Easier than using multiple command-line flags for complex updates.
150150+151151+**Usage:**
152152+153153+```bash
154154+noteleaf todo edit [task-id]
155155+```
156156+157157+**Aliases:** e
158158+159159+#### delete
160160+161161+Permanently remove a task from the database.
162162+163163+This operation cannot be undone. Consider updating the task status to
164164+'deleted' instead if you want to preserve the record for historical purposes.
165165+166166+**Usage:**
167167+168168+```bash
169169+noteleaf todo delete [task-id]
170170+```
171171+172172+#### projects
173173+174174+Display all projects with task counts.
175175+176176+Shows each project used in your tasks along with the number of tasks in each
177177+project. Use --todo-txt to format output with +project syntax for compatibility
178178+with todo.txt tools.
179179+180180+**Usage:**
181181+182182+```bash
183183+noteleaf todo projects [flags]
184184+```
185185+186186+**Options:**
187187+188188+```
189189+ --static Use static text output instead of interactive
190190+ --todo-txt Format output with +project prefix for todo.txt compatibility
191191+```
192192+193193+**Aliases:** proj
194194+195195+#### tags
196196+197197+Display all tags used across tasks.
198198+199199+Shows each tag with the number of tasks using it. Tags provide flexible
200200+categorization orthogonal to projects and contexts.
201201+202202+**Usage:**
203203+204204+```bash
205205+noteleaf todo tags [flags]
206206+```
207207+208208+**Options:**
209209+210210+```
211211+ --static Use static text output instead of interactive
212212+```
213213+214214+**Aliases:** t
215215+216216+#### contexts
217217+218218+Display all contexts with task counts.
219219+220220+Contexts represent locations or environments where tasks can be completed (e.g.,
221221+@home, @office, @errands). Use --todo-txt to format output with @context syntax
222222+for compatibility with todo.txt tools.
223223+224224+**Usage:**
225225+226226+```bash
227227+noteleaf todo contexts [flags]
228228+```
229229+230230+**Options:**
231231+232232+```
233233+ --static Use static text output instead of interactive
234234+ --todo-txt Format output with @context prefix for todo.txt compatibility
235235+```
236236+237237+**Aliases:** con, loc, ctx, locations
238238+239239+#### done
240240+241241+Mark a task as completed with current timestamp.
242242+243243+Sets the task status to 'completed' and records the completion time. For
244244+recurring tasks, generates the next instance based on the recurrence rule.
245245+246246+**Usage:**
247247+248248+```bash
249249+noteleaf todo done [task-id]
250250+```
251251+252252+**Aliases:** complete
253253+254254+#### start
255255+256256+Begin tracking time spent on a task.
257257+258258+Records the start time for a work session. Only one task can be actively
259259+tracked at a time. Use --note to add a description of what you're working on.
260260+261261+**Usage:**
262262+263263+```bash
264264+noteleaf todo start [task-id] [flags]
265265+```
266266+267267+**Options:**
268268+269269+```
270270+ -n, --note string Add a note to the time entry
271271+```
272272+273273+#### stop
274274+275275+End time tracking for the active task.
276276+277277+Records the end time and calculates duration for the current work session.
278278+Duration is added to the task's total time tracked.
279279+280280+**Usage:**
281281+282282+```bash
283283+noteleaf todo stop [task-id]
284284+```
285285+286286+#### timesheet
287287+288288+Show time tracking summary for tasks.
289289+290290+By default shows time entries for the last 7 days.
291291+Use --task to show timesheet for a specific task.
292292+Use --days to change the date range.
293293+294294+**Usage:**
295295+296296+```bash
297297+noteleaf todo timesheet [flags]
298298+```
299299+300300+**Options:**
301301+302302+```
303303+ -d, --days int Number of days to show in timesheet (default 7)
304304+ -t, --task string Show timesheet for specific task ID
305305+```
306306+307307+#### recur
308308+309309+Configure recurring task patterns.
310310+311311+Create tasks that repeat on a schedule using iCalendar recurrence rules (RRULE).
312312+Supports daily, weekly, monthly, and yearly patterns with optional end dates.
313313+314314+**Usage:**
315315+316316+```bash
317317+noteleaf todo recur
318318+```
319319+320320+**Aliases:** repeat
321321+322322+##### set
323323+324324+Apply a recurrence rule to create repeating task instances.
325325+326326+Uses iCalendar RRULE syntax (e.g., "FREQ=DAILY" for daily tasks, "FREQ=WEEKLY;BYDAY=MO,WE,FR"
327327+for specific weekdays). When a recurring task is completed, the next instance is
328328+automatically generated.
329329+330330+Examples:
331331+ noteleaf todo recur set 123 --rule "FREQ=DAILY"
332332+ noteleaf todo recur set 456 --rule "FREQ=WEEKLY;BYDAY=MO" --until 2024-12-31
333333+334334+**Usage:**
335335+336336+```bash
337337+noteleaf todo recur set [task-id] [flags]
338338+```
339339+340340+**Options:**
341341+342342+```
343343+ --rule string Recurrence rule (e.g., FREQ=DAILY)
344344+ --until string Recurrence end date (YYYY-MM-DD)
345345+```
346346+347347+##### clear
348348+349349+Remove recurrence from a task.
350350+351351+Converts a recurring task to a one-time task. Existing future instances are not
352352+affected.
353353+354354+**Usage:**
355355+356356+```bash
357357+noteleaf todo recur clear [task-id]
358358+```
359359+360360+##### show
361361+362362+Display recurrence rule and schedule information.
363363+364364+Shows the RRULE pattern, next occurrence date, and recurrence end date if
365365+configured.
366366+367367+**Usage:**
368368+369369+```bash
370370+noteleaf todo recur show [task-id]
371371+```
372372+373373+#### depend
374374+375375+Create and manage task dependencies.
376376+377377+Establish relationships where one task must be completed before another can
378378+begin. Useful for multi-step workflows and project management.
379379+380380+**Usage:**
381381+382382+```bash
383383+noteleaf todo depend
384384+```
385385+386386+**Aliases:** dep, deps
387387+388388+##### add
389389+390390+Make a task dependent on another task's completion.
391391+392392+The first task cannot be started until the second task is completed. Use task
393393+UUIDs to specify dependencies.
394394+395395+**Usage:**
396396+397397+```bash
398398+noteleaf todo depend add [task-id] [depends-on-uuid]
399399+```
400400+401401+##### remove
402402+403403+Delete a dependency relationship between two tasks.
404404+405405+**Usage:**
406406+407407+```bash
408408+noteleaf todo depend remove [task-id] [depends-on-uuid]
409409+```
410410+411411+**Aliases:** rm
412412+413413+##### list
414414+415415+Show all tasks that must be completed before this task can be started.
416416+417417+**Usage:**
418418+419419+```bash
420420+noteleaf todo depend list [task-id]
421421+```
422422+423423+**Aliases:** ls
424424+425425+##### blocked-by
426426+427427+Display all tasks that depend on this task's completion.
428428+429429+**Usage:**
430430+431431+```bash
432432+noteleaf todo depend blocked-by [task-id]
433433+```
434434+435435+## todo
436436+437437+Manage tasks with TaskWarrior-inspired features.
438438+439439+Track todos with priorities, projects, contexts, and tags. Supports hierarchical
440440+tasks with parent/child relationships, task dependencies, recurring tasks, and
441441+time tracking. Tasks can be filtered by status, priority, project, or context.
442442+443443+```bash
444444+noteleaf todo
445445+```
446446+447447+### Subcommands
448448+449449+#### add
450450+451451+Create a new task with description and optional attributes.
452452+453453+Tasks can be created with priority levels (low, medium, high, urgent), assigned
454454+to projects and contexts, tagged for organization, and configured with due dates
455455+and recurrence rules. Dependencies can be established to ensure tasks are
456456+completed in order.
457457+458458+Examples:
459459+ noteleaf todo add "Write documentation" --priority high --project docs
460460+ noteleaf todo add "Weekly review" --recur "FREQ=WEEKLY" --due 2024-01-15
461461+462462+**Usage:**
463463+464464+```bash
465465+noteleaf todo add [description] [flags]
466466+```
467467+468468+**Options:**
469469+470470+```
471471+ -c, --context string Set task context
472472+ --depends-on string Set task dependencies (comma-separated UUIDs)
473473+ -d, --due string Set due date (YYYY-MM-DD)
474474+ --parent string Set parent task UUID
475475+ -p, --priority string Set task priority
476476+ --project string Set task project
477477+ --recur string Set recurrence rule (e.g., FREQ=DAILY)
478478+ -t, --tags strings Add tags to task
479479+ --until string Set recurrence end date (YYYY-MM-DD)
480480+```
481481+482482+**Aliases:** create, new
483483+484484+#### list
485485+486486+List tasks with optional filtering and display modes.
487487+488488+By default, shows tasks in an interactive TaskWarrior-like interface.
489489+Use --static to show a simple text list instead.
490490+Use --all to show all tasks, otherwise only pending tasks are shown.
491491+492492+**Usage:**
493493+494494+```bash
495495+noteleaf todo list [flags]
496496+```
497497+498498+**Options:**
499499+500500+```
501501+ -a, --all Show all tasks (default: pending only)
502502+ --context string Filter by context
503503+ -i, --interactive Force interactive mode (default)
504504+ --priority string Filter by priority
505505+ --project string Filter by project
506506+ --static Use static text output instead of interactive
507507+ --status string Filter by status
508508+```
509509+510510+**Aliases:** ls
511511+512512+#### view
513513+514514+Display detailed information for a specific task.
515515+516516+Shows all task attributes including description, status, priority, project,
517517+context, tags, due date, creation time, and modification history. Use --json
518518+for machine-readable output or --no-metadata to show only the description.
519519+520520+**Usage:**
521521+522522+```bash
523523+noteleaf todo view [task-id] [flags]
524524+```
525525+526526+**Options:**
527527+528528+```
529529+ --format string Output format (detailed, brief) (default "detailed")
530530+ --json Output as JSON
531531+ --no-metadata Hide creation/modification timestamps
532532+```
533533+534534+#### update
535535+536536+Modify attributes of an existing task.
537537+538538+Update any task property including description, status, priority, project,
539539+context, due date, recurrence rule, or parent task. Add or remove tags and
540540+dependencies. Multiple attributes can be updated in a single command.
541541+542542+Examples:
543543+ noteleaf todo update 123 --priority urgent --due tomorrow
544544+ noteleaf todo update 456 --add-tag urgent --project website
545545+546546+**Usage:**
547547+548548+```bash
549549+noteleaf todo update [task-id] [flags]
550550+```
551551+552552+**Options:**
553553+554554+```
555555+ --add-depends string Add task dependencies (comma-separated UUIDs)
556556+ --add-tag strings Add tags to task
557557+ -c, --context string Set task context
558558+ --description string Update task description
559559+ -d, --due string Set due date (YYYY-MM-DD)
560560+ --parent string Set parent task UUID
561561+ -p, --priority string Set task priority
562562+ --project string Set task project
563563+ --recur string Set recurrence rule (e.g., FREQ=DAILY)
564564+ --remove-depends string Remove task dependencies (comma-separated UUIDs)
565565+ --remove-tag strings Remove tags from task
566566+ --status string Update task status
567567+ -t, --tags strings Add tags to task
568568+ --until string Set recurrence end date (YYYY-MM-DD)
569569+```
570570+571571+#### edit
572572+573573+Open interactive editor for task modification.
574574+575575+Provides a user-friendly interface with status picker and priority toggle.
576576+Easier than using multiple command-line flags for complex updates.
577577+578578+**Usage:**
579579+580580+```bash
581581+noteleaf todo edit [task-id]
582582+```
583583+584584+**Aliases:** e
585585+586586+#### delete
587587+588588+Permanently remove a task from the database.
589589+590590+This operation cannot be undone. Consider updating the task status to
591591+'deleted' instead if you want to preserve the record for historical purposes.
592592+593593+**Usage:**
594594+595595+```bash
596596+noteleaf todo delete [task-id]
597597+```
598598+599599+#### projects
600600+601601+Display all projects with task counts.
602602+603603+Shows each project used in your tasks along with the number of tasks in each
604604+project. Use --todo-txt to format output with +project syntax for compatibility
605605+with todo.txt tools.
606606+607607+**Usage:**
608608+609609+```bash
610610+noteleaf todo projects [flags]
611611+```
612612+613613+**Options:**
614614+615615+```
616616+ --static Use static text output instead of interactive
617617+ --todo-txt Format output with +project prefix for todo.txt compatibility
618618+```
619619+620620+**Aliases:** proj
621621+622622+#### tags
623623+624624+Display all tags used across tasks.
625625+626626+Shows each tag with the number of tasks using it. Tags provide flexible
627627+categorization orthogonal to projects and contexts.
628628+629629+**Usage:**
630630+631631+```bash
632632+noteleaf todo tags [flags]
633633+```
634634+635635+**Options:**
636636+637637+```
638638+ --static Use static text output instead of interactive
639639+```
640640+641641+**Aliases:** t
642642+643643+#### contexts
644644+645645+Display all contexts with task counts.
646646+647647+Contexts represent locations or environments where tasks can be completed (e.g.,
648648+@home, @office, @errands). Use --todo-txt to format output with @context syntax
649649+for compatibility with todo.txt tools.
650650+651651+**Usage:**
652652+653653+```bash
654654+noteleaf todo contexts [flags]
655655+```
656656+657657+**Options:**
658658+659659+```
660660+ --static Use static text output instead of interactive
661661+ --todo-txt Format output with @context prefix for todo.txt compatibility
662662+```
663663+664664+**Aliases:** con, loc, ctx, locations
665665+666666+#### done
667667+668668+Mark a task as completed with current timestamp.
669669+670670+Sets the task status to 'completed' and records the completion time. For
671671+recurring tasks, generates the next instance based on the recurrence rule.
672672+673673+**Usage:**
674674+675675+```bash
676676+noteleaf todo done [task-id]
677677+```
678678+679679+**Aliases:** complete
680680+681681+#### start
682682+683683+Begin tracking time spent on a task.
684684+685685+Records the start time for a work session. Only one task can be actively
686686+tracked at a time. Use --note to add a description of what you're working on.
687687+688688+**Usage:**
689689+690690+```bash
691691+noteleaf todo start [task-id] [flags]
692692+```
693693+694694+**Options:**
695695+696696+```
697697+ -n, --note string Add a note to the time entry
698698+```
699699+700700+#### stop
701701+702702+End time tracking for the active task.
703703+704704+Records the end time and calculates duration for the current work session.
705705+Duration is added to the task's total time tracked.
706706+707707+**Usage:**
708708+709709+```bash
710710+noteleaf todo stop [task-id]
711711+```
712712+713713+#### timesheet
714714+715715+Show time tracking summary for tasks.
716716+717717+By default shows time entries for the last 7 days.
718718+Use --task to show timesheet for a specific task.
719719+Use --days to change the date range.
720720+721721+**Usage:**
722722+723723+```bash
724724+noteleaf todo timesheet [flags]
725725+```
726726+727727+**Options:**
728728+729729+```
730730+ -d, --days int Number of days to show in timesheet (default 7)
731731+ -t, --task string Show timesheet for specific task ID
732732+```
733733+734734+#### recur
735735+736736+Configure recurring task patterns.
737737+738738+Create tasks that repeat on a schedule using iCalendar recurrence rules (RRULE).
739739+Supports daily, weekly, monthly, and yearly patterns with optional end dates.
740740+741741+**Usage:**
742742+743743+```bash
744744+noteleaf todo recur
745745+```
746746+747747+**Aliases:** repeat
748748+749749+##### set
750750+751751+Apply a recurrence rule to create repeating task instances.
752752+753753+Uses iCalendar RRULE syntax (e.g., "FREQ=DAILY" for daily tasks, "FREQ=WEEKLY;BYDAY=MO,WE,FR"
754754+for specific weekdays). When a recurring task is completed, the next instance is
755755+automatically generated.
756756+757757+Examples:
758758+ noteleaf todo recur set 123 --rule "FREQ=DAILY"
759759+ noteleaf todo recur set 456 --rule "FREQ=WEEKLY;BYDAY=MO" --until 2024-12-31
760760+761761+**Usage:**
762762+763763+```bash
764764+noteleaf todo recur set [task-id] [flags]
765765+```
766766+767767+**Options:**
768768+769769+```
770770+ --rule string Recurrence rule (e.g., FREQ=DAILY)
771771+ --until string Recurrence end date (YYYY-MM-DD)
772772+```
773773+774774+##### clear
775775+776776+Remove recurrence from a task.
777777+778778+Converts a recurring task to a one-time task. Existing future instances are not
779779+affected.
780780+781781+**Usage:**
782782+783783+```bash
784784+noteleaf todo recur clear [task-id]
785785+```
786786+787787+##### show
788788+789789+Display recurrence rule and schedule information.
790790+791791+Shows the RRULE pattern, next occurrence date, and recurrence end date if
792792+configured.
793793+794794+**Usage:**
795795+796796+```bash
797797+noteleaf todo recur show [task-id]
798798+```
799799+800800+#### depend
801801+802802+Create and manage task dependencies.
803803+804804+Establish relationships where one task must be completed before another can
805805+begin. Useful for multi-step workflows and project management.
806806+807807+**Usage:**
808808+809809+```bash
810810+noteleaf todo depend
811811+```
812812+813813+**Aliases:** dep, deps
814814+815815+##### add
816816+817817+Make a task dependent on another task's completion.
818818+819819+The first task cannot be started until the second task is completed. Use task
820820+UUIDs to specify dependencies.
821821+822822+**Usage:**
823823+824824+```bash
825825+noteleaf todo depend add [task-id] [depends-on-uuid]
826826+```
827827+828828+##### remove
829829+830830+Delete a dependency relationship between two tasks.
831831+832832+**Usage:**
833833+834834+```bash
835835+noteleaf todo depend remove [task-id] [depends-on-uuid]
836836+```
837837+838838+**Aliases:** rm
839839+840840+##### list
841841+842842+Show all tasks that must be completed before this task can be started.
843843+844844+**Usage:**
845845+846846+```bash
847847+noteleaf todo depend list [task-id]
848848+```
849849+850850+**Aliases:** ls
851851+852852+##### blocked-by
853853+854854+Display all tasks that depend on this task's completion.
855855+856856+**Usage:**
857857+858858+```bash
859859+noteleaf todo depend blocked-by [task-id]
860860+```
861861+
+91
website/docs/manual/tv-shows.md
···11+---
22+id: tv-shows
33+title: TV Shows
44+sidebar_position: 6
55+description: Manage TV show watching
66+---
77+88+## tv
99+1010+Track TV shows and episodes.
1111+1212+Search TMDB for TV shows and add them to your queue. Track which shows you're
1313+currently watching, mark episodes as watched, and maintain a complete history
1414+of your viewing activity.
1515+1616+```bash
1717+noteleaf media tv
1818+```
1919+2020+### Subcommands
2121+2222+#### add
2323+2424+Search for TV shows and add them to your watch queue.
2525+2626+By default, shows search results in a simple list format where you can select by number.
2727+Use the -i flag for an interactive interface with navigation keys.
2828+2929+**Usage:**
3030+3131+```bash
3232+noteleaf media tv add [search query...] [flags]
3333+```
3434+3535+**Options:**
3636+3737+```
3838+ -i, --interactive Use interactive interface for TV show selection
3939+```
4040+4141+#### list
4242+4343+Display TV shows in your queue with optional status filters.
4444+4545+Shows show titles, air dates, and current status. Filter by --all, --queued,
4646+--watching for shows in progress, or --watched for completed series. Default
4747+shows queued shows only.
4848+4949+**Usage:**
5050+5151+```bash
5252+noteleaf media tv list [--all|--queued|--watching|--watched]
5353+```
5454+5555+#### watching
5656+5757+Mark a TV show as currently watching. Use this when you start watching a series.
5858+5959+**Usage:**
6060+6161+```bash
6262+noteleaf media tv watching [id]
6363+```
6464+6565+#### watched
6666+6767+Mark TV show episodes or entire series as watched.
6868+6969+Updates episode tracking and completion status. Can mark individual episodes
7070+or complete seasons/series depending on ID format.
7171+7272+**Usage:**
7373+7474+```bash
7575+noteleaf media tv watched [id]
7676+```
7777+7878+**Aliases:** seen
7979+8080+#### remove
8181+8282+Remove a TV show from your watch queue. Use this for shows you no longer want to track.
8383+8484+**Usage:**
8585+8686+```bash
8787+noteleaf media tv remove [id]
8888+```
8989+9090+**Aliases:** rm
9191+