d36d630
Keep status badge inline with task title on wrap
Click to expand commit body
Drop the hstack flex layout from the task header and make the h1 inline
so the badge flows naturally after the last word of the title regardless
of line count. Use vertical-align: text-bottom to align the badge with
the heading text and restore spacing below the header.
Amolith
created
aa2e82f
Override Oat accordion overflow to allow horizontal table scrolling
Click to expand commit body
Oat sets overflow:hidden on <details> for border-radius clipping, which
prevents .table's overflow-x:auto from producing a scrollbar. Override
to overflow:visible on details containing a .table wrapper and reset the
wrapper's width/min-width so it fits inside the details margins instead
of spilling out.
Amolith
created
eb9776c
Add "Select project…" default option to new task dialog
Amolith
created
aa0beea
Move 'td' to end of page titles for better scannability
Amolith
created
e1afc56
Use sans font for description field in task creator dialog
2c21860
Add tri-state status controls to web UI task pages
Amolith
created
66cd6e5
Update FAB icons and replace unicode checkmark with SVG
Click to expand commit body
Change the task creation icon from edit/pencil to checkmark, add a plus
indicator to the project folder icon, and replace the unicode checkmark
in the done button with a proper SVG icon for consistency.
e516d35
Polish web UI templates, fix clipboard on insecure contexts
Click to expand commit body
- Extract task_table macro into templates/macros.html (DRY)
- Render markdown descriptions and logs via pulldown-cmark + ammonia
- Add friendly date display with <time> elements (JS-enhanced)
- Default project page to open-status filter
- Compact task detail layout (inline metadata, collapsible logs)
- Fix clipboard copy button: hidden by default, revealed only when
navigator.clipboard is available (secure context), bound via
addEventListener instead of inline onclick
Amolith
created
2f88728
Add read-only web UI subcommand (td webui)
f8c671b
Fix redundant [closed] markers in td show when all blockers are closed
Click to expand commit body
When all blockers are resolved, 'td show' was printing both '[all closed]'
as a prefix AND '[closed]' after each blocker ID. The prefix makes the
individual markers redundant.
Now:
- All closed: '[all closed] id1, id2' (no per-ID markers)
- All open: 'id1, id2' (no brackets)
- Mixed: 'open1, open2, closed1 [closed], closed2 [closed]'
ff696b7
Bump version to v0.1.1, add dist/ to .gitignore
Amolith
created
e955543
Drop iana-time-zone dep by switching chrono from clock to now feature
Amolith
created
1e5cba0
Add release, cross-build, pack, and upload targets to Makefile
Amolith
created
31dfe69
Update AGENTS.md to reflect Loro storage and current module layout
Amolith
created
1465630
Emit short td-XXXXXXX IDs consistently in all output
Click to expand commit body
Change TaskId serialization from the raw 26-char ULID to the short
td-XXXXXXX display form. This affects all JSON output from every
command that emits task identifiers: create, show, list, update,
done, reopen, dep, label, rm, log, next, ready, search, and doctor.
The root cause was TaskId's serde Serialize impl using
#[serde(transparent)] which forwarded the inner ULID string.
Replace it with a custom impl that emits short(). Additionally,
several commands built JSON manually via .as_str() or stored the
full ULID in plain Strings for human output — fix all of those.
Export retains full ULIDs via a dedicated Task::to_export_value()
method so that import round-tripping continues to work (import
needs exact ULIDs for CRDT key fidelity).
Update one test in cli_io.rs that was feeding show --json output
into import — the correct data source for import is export, which
is the designed round-trip path.
Amolith
created
664e779
Add SyncAll: sync all shared projects when neither peer has one selected
Click to expand commit body
When both peers run 'td sync' without a project selected (no binding,
no --project, no TD_PROJECT), instead of bailing with 'both peers are
in bootstrap mode', enumerate all local projects on both sides, compute
the intersection by project_id, and sync each shared project.
Protocol change: replace the Bootstrap handshake (for the 'no project
selected' case) with a new SyncAll variant carrying a manifest of every
local project (name, id, version_vector). Both sides compute the
intersection by project_id, agree on an ordering (sort by project_id),
then loop over the shared set exchanging deltas per-project exactly like
the existing single-project Sync path.
Fallback cases handled:
- SyncAll peer + Sync peer: bootstrap from the peer that has a project
selected, identical to the old Bootstrap path.
- SyncAll + Bootstrap (old td): bail with an upgrade hint.
- No intersection: friendly no-op message.
- Both have zero projects: no intersection, friendly no-op.
- Name mismatch for same project_id: sync anyway, print a warning.
Also adds:
- db::list_projects_in(root) - root-explicit helper used by build_local_manifest
- db::Store::project_id() - exposes read_project_id_from_doc via Store
- db::bootstrap_sync_at(data_root, cwd, project, delta) - HOME-free
bootstrap used from async sync code where HOME may vary by peer
Tests: sync_all_exchanges_shared_projects, sync_all_no_intersection_is_noop
Amolith
created
62f24b7
Implement td doctor: integrity checks and repairs
Amolith
created
4570f5a
Repurpose migrations to Loro schema upgrader
Amolith
created
36f06d4
Replace deprecated Command::cargo_bin with cargo_bin_cmd! in tests
Amolith
created
fa87351
Update AGENTS.md to reflect central storage architecture
Amolith
created
112ea9a
Update SKILL.md and AGENTS.md for project subcommand interface
1a87c55
Update test files to use project subcommand
Amolith
created
b20c9f8
Implement cmd::project handlers and retire flat project commands
Click to expand commit body
Add src/cmd/project.rs with handlers for all five ProjectAction variants
(init, bind, unbind, delete, list). Wire dispatch in cmd/mod.rs.
Remove the now-superseded src/cmd/init.rs, use.rs, and projects.rs modules.
Update the two error strings in cmd/sync.rs that still referenced td init.
Amolith
created
b07cd64
Introduce td project subcommand group and extend db layer
Click to expand commit body
Replace the flat Init, Use, and Projects top-level commands with a single
Project { action: ProjectAction } variant and a ProjectAction enum covering
Init, Bind, Unbind, Delete, and List.
Add unbind_project() and delete_project() to the db layer. Update the three
error strings that still referenced the old command names.
Amolith
created
4aa0d43
Rename td compact to td tidy; implement two-phase compaction
The Loro migration stripped the verbose breakdown down to just an ID and
final score. Restore the three pieces that were lost:
- Active scoring mode printed once before the per-task list
- Expanded formula with actual values substituted, branching on mode:
impact: (downstream + 1.00) × priority / effort^0.25 = score
effort: (downstream × 0.25 + 1.00) × priority / effort² = score
- Unblocks count: N tasks (M directly), with correct singular/plural
All data was already present in ScoredTask; only the rendering in
src/cmd/next.rs needed updating.
Update the two cli_next verbose tests whose assertions reflected the old
'score:' label rather than the restored output. Add two new tests
covering the singular 'task' grammar and transitive unblocks counts,
both of which were untested before.
Amolith
created
d76a593
Fix next --json emitting priority/effort as integers instead of labels
next extracted task IDs as raw ULID strings for the scoring engine
then displayed those same strings. rm did the same with unblocked_ids
in its warning message. Both now go through TaskId::Display or
display_id() at render time.
Add display_id() to TaskId for contexts where a raw &str needs
shortening without constructing a TaskId.
Amolith
created
4b583a0
Surface serde error detail in sync handshake failure