Metadata-Version: 2.4
Name: schedline
Version: 0.1.0
Summary: Schedule any job for anyone anywhere — in one line.
Author: David Chincharashvili
License: MIT
Project-URL: Homepage, https://github.com/DavidTbilisi/schedline
Project-URL: Issues, https://github.com/DavidTbilisi/schedline/issues
Keywords: scheduling,calendar,cli,tui,time-management,roster
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Environment :: Console
Classifier: Operating System :: OS Independent
Classifier: Topic :: Office/Business :: Scheduling
Requires-Python: >=3.8
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: windows-curses; sys_platform == "win32"
Dynamic: license-file

# schedline

[![CI](https://github.com/DavidTbilisi/schedline/actions/workflows/ci.yml/badge.svg)](https://github.com/DavidTbilisi/schedline/actions/workflows/ci.yml)

**Schedule any job for anyone anywhere — in one line.**

A zero-dependency scheduling engine with a terse one-line grammar, an
auto-registering store, three-lens conflict detection, and a read-only
terminal viewer. Type a thought, it becomes a scheduled job.

```
$ schedline add 'kani: dropoff Tue,Thu 10:45-11:15 @kindergarten #care'
added: [1] kani: dropoff Tue,Thu 10:45-11:15 @kindergarten #care /personal

$ schedline add 'david: "AWS Arch" Mon 13:40-15:50 @room-204 #uni'
$ schedline add 'david: dentist Mon 14:30-15:30 @clinic #health'
added: [3] david: dentist Mon 14:30-15:30 @clinic #health /personal
  ⚠ double-booked: [2] david: AWS Arch Mon 13:40-15:50 @room-204 #uni /personal
```

## Install

```
pip install schedline
```

## The grammar

```
<who>: <what> <when> [@where] [#tag ...] [/namespace]
```

| Part | Meaning | Examples |
|------|---------|----------|
| `who` | assignee id (auto-registers) | `kani` |
| `what` | free text; quote if multi-word | `"AWS Arch"` |
| `when` | day-spec and/or time range | `Tue,Thu` · `Mon-Fri` · `2026-06-20` · `today` · `tomorrow` · `13:40-15:50` |
| `@where` | location (auto-registers) | `@kindergarten` |
| `#tag` | zero or more tags | `#care #uni` |
| `/namespace` | bucket (default `personal`) | `/business` |

People, places, and tags **auto-register on first use** — there is no schema to
edit before scheduling a new person or place.

## Commands

```
schedline add "<line>"      parse a shorthand line and store it (warns on clashes)
schedline ls [filters]      list jobs    --ns --who --where --tag --day
schedline agenda [--day D]  day-by-day, conflict-flagged
schedline rm <id>           delete by id
schedline who | where       list known assignees / locations
schedline view              read-only curses viewer (calendar / swimlanes / dashboard)
```

`sched` is installed as a short alias for `schedline`.

## Conflict detection

Every `add` checks three lenses (advisory — it warns, never blocks):

1. **Person double-booked** — same assignee, overlapping time.
2. **Location occupied** — same `@place`, overlapping time, different people.
3. **Travel gap** — same person, back-to-back jobs at different places with less
   than `SCHEDLINE_TRAVEL_BUFFER` minutes between them (default 30).

## Store location

Jobs live in a single JSON file, resolved in this order:

1. `--store <path>`
2. `$SCHEDLINE_STORE`
3. `$XDG_DATA_HOME/schedline/jobs.json` (default `~/.local/share/schedline/jobs.json`)

## License

MIT
