lifetxt 1.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. lifetxt-1.0.1/LICENSE +21 -0
  2. lifetxt-1.0.1/PKG-INFO +526 -0
  3. lifetxt-1.0.1/lifetxt/__init__.py +278 -0
  4. lifetxt-1.0.1/lifetxt/__main__.py +5 -0
  5. lifetxt-1.0.1/lifetxt/_extra_convert_impl.py +290 -0
  6. lifetxt-1.0.1/lifetxt/agenda.py +1581 -0
  7. lifetxt-1.0.1/lifetxt/archive_plan_v1.py +345 -0
  8. lifetxt-1.0.1/lifetxt/archive_safety_v3.py +222 -0
  9. lifetxt-1.0.1/lifetxt/areas.py +136 -0
  10. lifetxt-1.0.1/lifetxt/assist.py +377 -0
  11. lifetxt-1.0.1/lifetxt/atomic.py +196 -0
  12. lifetxt-1.0.1/lifetxt/attachment_transactions.py +1218 -0
  13. lifetxt-1.0.1/lifetxt/attachments.py +587 -0
  14. lifetxt-1.0.1/lifetxt/cli.py +15508 -0
  15. lifetxt-1.0.1/lifetxt/clock_contract.py +108 -0
  16. lifetxt-1.0.1/lifetxt/clock_skew.py +130 -0
  17. lifetxt-1.0.1/lifetxt/command_center.py +382 -0
  18. lifetxt-1.0.1/lifetxt/completion.py +883 -0
  19. lifetxt-1.0.1/lifetxt/config.py +481 -0
  20. lifetxt-1.0.1/lifetxt/config_layers.py +198 -0
  21. lifetxt-1.0.1/lifetxt/config_migration.py +93 -0
  22. lifetxt-1.0.1/lifetxt/config_registry.py +772 -0
  23. lifetxt-1.0.1/lifetxt/config_validation.py +293 -0
  24. lifetxt-1.0.1/lifetxt/config_writer.py +367 -0
  25. lifetxt-1.0.1/lifetxt/csvio.py +116 -0
  26. lifetxt-1.0.1/lifetxt/delegated_mutation.py +700 -0
  27. lifetxt-1.0.1/lifetxt/delivery.py +135 -0
  28. lifetxt-1.0.1/lifetxt/demo.py +332 -0
  29. lifetxt-1.0.1/lifetxt/diagnostic_contract.py +66 -0
  30. lifetxt-1.0.1/lifetxt/doctor.py +283 -0
  31. lifetxt-1.0.1/lifetxt/editor_safety.py +196 -0
  32. lifetxt-1.0.1/lifetxt/entrypoint.py +333 -0
  33. lifetxt-1.0.1/lifetxt/extra_attachment.py +121 -0
  34. lifetxt-1.0.1/lifetxt/extra_cli.py +552 -0
  35. lifetxt-1.0.1/lifetxt/extra_common.py +380 -0
  36. lifetxt-1.0.1/lifetxt/extra_convert.py +16 -0
  37. lifetxt-1.0.1/lifetxt/extra_core.py +458 -0
  38. lifetxt-1.0.1/lifetxt/extra_reports.py +268 -0
  39. lifetxt-1.0.1/lifetxt/extra_safety.py +615 -0
  40. lifetxt-1.0.1/lifetxt/extra_shell.py +260 -0
  41. lifetxt-1.0.1/lifetxt/fault_drill.py +612 -0
  42. lifetxt-1.0.1/lifetxt/fuzzy_search.py +115 -0
  43. lifetxt-1.0.1/lifetxt/fzf_helper.py +485 -0
  44. lifetxt-1.0.1/lifetxt/git_hook.py +146 -0
  45. lifetxt-1.0.1/lifetxt/global_search.py +207 -0
  46. lifetxt-1.0.1/lifetxt/groups.py +276 -0
  47. lifetxt-1.0.1/lifetxt/ics.py +460 -0
  48. lifetxt-1.0.1/lifetxt/ids.py +207 -0
  49. lifetxt-1.0.1/lifetxt/inbox.py +454 -0
  50. lifetxt-1.0.1/lifetxt/integrity.py +1361 -0
  51. lifetxt-1.0.1/lifetxt/interactive.py +607 -0
  52. lifetxt-1.0.1/lifetxt/links.py +1119 -0
  53. lifetxt-1.0.1/lifetxt/markdown.py +361 -0
  54. lifetxt-1.0.1/lifetxt/mcp.py +3550 -0
  55. lifetxt-1.0.1/lifetxt/mcp_resources.py +35 -0
  56. lifetxt-1.0.1/lifetxt/model.py +397 -0
  57. lifetxt-1.0.1/lifetxt/multi_target.py +526 -0
  58. lifetxt-1.0.1/lifetxt/mutation.py +570 -0
  59. lifetxt-1.0.1/lifetxt/nextaction.py +134 -0
  60. lifetxt-1.0.1/lifetxt/notifier.py +367 -0
  61. lifetxt-1.0.1/lifetxt/parser.py +724 -0
  62. lifetxt-1.0.1/lifetxt/paths.py +92 -0
  63. lifetxt-1.0.1/lifetxt/people.py +294 -0
  64. lifetxt-1.0.1/lifetxt/personal_context.py +478 -0
  65. lifetxt-1.0.1/lifetxt/personal_context_cli.py +282 -0
  66. lifetxt-1.0.1/lifetxt/presence.py +247 -0
  67. lifetxt-1.0.1/lifetxt/projects.py +581 -0
  68. lifetxt-1.0.1/lifetxt/query.py +356 -0
  69. lifetxt-1.0.1/lifetxt/recurrence.py +548 -0
  70. lifetxt-1.0.1/lifetxt/release_manifest_validation.py +62 -0
  71. lifetxt-1.0.1/lifetxt/release_policy.py +614 -0
  72. lifetxt-1.0.1/lifetxt/release_policy_compat.py +208 -0
  73. lifetxt-1.0.1/lifetxt/release_schema_extension.py +94 -0
  74. lifetxt-1.0.1/lifetxt/release_translation.py +28 -0
  75. lifetxt-1.0.1/lifetxt/remote_access.py +542 -0
  76. lifetxt-1.0.1/lifetxt/remote_backend.py +557 -0
  77. lifetxt-1.0.1/lifetxt/remote_client.py +433 -0
  78. lifetxt-1.0.1/lifetxt/remote_client_writes.py +623 -0
  79. lifetxt-1.0.1/lifetxt/remote_client_writes_compat_v25.py +236 -0
  80. lifetxt-1.0.1/lifetxt/remote_compatibility_v21.py +385 -0
  81. lifetxt-1.0.1/lifetxt/remote_contracts_v6.py +889 -0
  82. lifetxt-1.0.1/lifetxt/remote_sessions.py +322 -0
  83. lifetxt-1.0.1/lifetxt/remote_ticket_capability_v26.py +52 -0
  84. lifetxt-1.0.1/lifetxt/remote_ticket_write_core.py +362 -0
  85. lifetxt-1.0.1/lifetxt/remote_ticket_write_operations.py +351 -0
  86. lifetxt-1.0.1/lifetxt/remote_ticket_writes.py +216 -0
  87. lifetxt-1.0.1/lifetxt/remote_web.py +584 -0
  88. lifetxt-1.0.1/lifetxt/report_cli.py +353 -0
  89. lifetxt-1.0.1/lifetxt/report_config.py +111 -0
  90. lifetxt-1.0.1/lifetxt/review.py +234 -0
  91. lifetxt-1.0.1/lifetxt/revision_telemetry.py +382 -0
  92. lifetxt-1.0.1/lifetxt/runtime_safety_v2.py +245 -0
  93. lifetxt-1.0.1/lifetxt/safe_ops.py +114 -0
  94. lifetxt-1.0.1/lifetxt/safety_compat_v2.py +554 -0
  95. lifetxt-1.0.1/lifetxt/safety_foundation.py +874 -0
  96. lifetxt-1.0.1/lifetxt/saved_views.py +127 -0
  97. lifetxt-1.0.1/lifetxt/schema_extensions_v10.py +83 -0
  98. lifetxt-1.0.1/lifetxt/schema_extensions_v11.py +103 -0
  99. lifetxt-1.0.1/lifetxt/schema_extensions_v12.py +111 -0
  100. lifetxt-1.0.1/lifetxt/schema_extensions_v13.py +529 -0
  101. lifetxt-1.0.1/lifetxt/schema_extensions_v14.py +112 -0
  102. lifetxt-1.0.1/lifetxt/schema_extensions_v15.py +160 -0
  103. lifetxt-1.0.1/lifetxt/schema_extensions_v16.py +224 -0
  104. lifetxt-1.0.1/lifetxt/schema_extensions_v17.py +185 -0
  105. lifetxt-1.0.1/lifetxt/schema_extensions_v18.py +498 -0
  106. lifetxt-1.0.1/lifetxt/schema_extensions_v19.py +245 -0
  107. lifetxt-1.0.1/lifetxt/schema_extensions_v2.py +825 -0
  108. lifetxt-1.0.1/lifetxt/schema_extensions_v20.py +262 -0
  109. lifetxt-1.0.1/lifetxt/schema_extensions_v21.py +117 -0
  110. lifetxt-1.0.1/lifetxt/schema_extensions_v22.py +87 -0
  111. lifetxt-1.0.1/lifetxt/schema_extensions_v23.py +223 -0
  112. lifetxt-1.0.1/lifetxt/schema_extensions_v24.py +185 -0
  113. lifetxt-1.0.1/lifetxt/schema_extensions_v4.py +359 -0
  114. lifetxt-1.0.1/lifetxt/schema_extensions_v5.py +258 -0
  115. lifetxt-1.0.1/lifetxt/schema_extensions_v6.py +141 -0
  116. lifetxt-1.0.1/lifetxt/schema_extensions_v7.py +193 -0
  117. lifetxt-1.0.1/lifetxt/schema_extensions_v8.py +348 -0
  118. lifetxt-1.0.1/lifetxt/schema_extensions_v9.py +110 -0
  119. lifetxt-1.0.1/lifetxt/schema_validation_v2.py +116 -0
  120. lifetxt-1.0.1/lifetxt/serializer.py +146 -0
  121. lifetxt-1.0.1/lifetxt/server_init.py +913 -0
  122. lifetxt-1.0.1/lifetxt/server_update.py +1425 -0
  123. lifetxt-1.0.1/lifetxt/server_update_review.py +133 -0
  124. lifetxt-1.0.1/lifetxt/shorthand.py +201 -0
  125. lifetxt-1.0.1/lifetxt/stats.py +478 -0
  126. lifetxt-1.0.1/lifetxt/status_summary.py +146 -0
  127. lifetxt-1.0.1/lifetxt/support_bundle.py +113 -0
  128. lifetxt-1.0.1/lifetxt/surface_runtime.py +816 -0
  129. lifetxt-1.0.1/lifetxt/surface_runtime_compat.py +277 -0
  130. lifetxt-1.0.1/lifetxt/temporal_context.py +208 -0
  131. lifetxt-1.0.1/lifetxt/ticket_activity.py +785 -0
  132. lifetxt-1.0.1/lifetxt/ticket_activity_mutation.py +262 -0
  133. lifetxt-1.0.1/lifetxt/ticket_custom_fields.py +1344 -0
  134. lifetxt-1.0.1/lifetxt/ticket_planning.py +395 -0
  135. lifetxt-1.0.1/lifetxt/ticket_planning_cli.py +636 -0
  136. lifetxt-1.0.1/lifetxt/ticket_planning_mutation.py +400 -0
  137. lifetxt-1.0.1/lifetxt/ticket_project_report.py +281 -0
  138. lifetxt-1.0.1/lifetxt/ticket_project_surfaces.py +601 -0
  139. lifetxt-1.0.1/lifetxt/ticket_project_values.py +274 -0
  140. lifetxt-1.0.1/lifetxt/ticket_projects.py +190 -0
  141. lifetxt-1.0.1/lifetxt/ticket_revision_writes.py +611 -0
  142. lifetxt-1.0.1/lifetxt/ticket_workflow.py +742 -0
  143. lifetxt-1.0.1/lifetxt/ticket_workflow_cli.py +637 -0
  144. lifetxt-1.0.1/lifetxt/ticket_workflow_surfaces.py +361 -0
  145. lifetxt-1.0.1/lifetxt/tickets.py +474 -0
  146. lifetxt-1.0.1/lifetxt/timer.py +751 -0
  147. lifetxt-1.0.1/lifetxt/timeutil.py +315 -0
  148. lifetxt-1.0.1/lifetxt/timezone_policy.py +378 -0
  149. lifetxt-1.0.1/lifetxt/transaction_admin.py +672 -0
  150. lifetxt-1.0.1/lifetxt/transaction_journal.py +1141 -0
  151. lifetxt-1.0.1/lifetxt/transaction_policy.py +399 -0
  152. lifetxt-1.0.1/lifetxt/tui.py +1505 -0
  153. lifetxt-1.0.1/lifetxt/tui_app.py +3403 -0
  154. lifetxt-1.0.1/lifetxt/tui_layout.py +55 -0
  155. lifetxt-1.0.1/lifetxt/validator.py +609 -0
  156. lifetxt-1.0.1/lifetxt/vm.py +462 -0
  157. lifetxt-1.0.1/lifetxt/web_assets.html +572 -0
  158. lifetxt-1.0.1/lifetxt/web_assets.py +128 -0
  159. lifetxt-1.0.1/lifetxt/web_assets_css_01.css +532 -0
  160. lifetxt-1.0.1/lifetxt/web_assets_css_02.css +532 -0
  161. lifetxt-1.0.1/lifetxt/web_assets_css_03.css +532 -0
  162. lifetxt-1.0.1/lifetxt/web_assets_css_04.css +533 -0
  163. lifetxt-1.0.1/lifetxt/web_assets_js_01.js +400 -0
  164. lifetxt-1.0.1/lifetxt/web_assets_js_02.js +400 -0
  165. lifetxt-1.0.1/lifetxt/web_assets_js_03.js +400 -0
  166. lifetxt-1.0.1/lifetxt/web_assets_js_04.js +0 -0
  167. lifetxt-1.0.1/lifetxt/web_assets_js_05.js +400 -0
  168. lifetxt-1.0.1/lifetxt/web_assets_js_06.js +400 -0
  169. lifetxt-1.0.1/lifetxt/web_assets_js_07.js +400 -0
  170. lifetxt-1.0.1/lifetxt/web_assets_js_08.js +400 -0
  171. lifetxt-1.0.1/lifetxt/web_assets_js_09.js +400 -0
  172. lifetxt-1.0.1/lifetxt/web_assets_js_10.js +400 -0
  173. lifetxt-1.0.1/lifetxt/web_assets_js_11.js +400 -0
  174. lifetxt-1.0.1/lifetxt/web_assets_js_12.js +400 -0
  175. lifetxt-1.0.1/lifetxt/web_assets_js_13.js +400 -0
  176. lifetxt-1.0.1/lifetxt/web_assets_js_14.js +400 -0
  177. lifetxt-1.0.1/lifetxt/web_assets_js_15.js +400 -0
  178. lifetxt-1.0.1/lifetxt/web_assets_js_16.js +400 -0
  179. lifetxt-1.0.1/lifetxt/web_assets_js_17.js +400 -0
  180. lifetxt-1.0.1/lifetxt/web_assets_js_18.js +23 -0
  181. lifetxt-1.0.1/lifetxt/web_read_service.py +156 -0
  182. lifetxt-1.0.1/lifetxt/web_routes_analytics.py +224 -0
  183. lifetxt-1.0.1/lifetxt/web_routes_git.py +140 -0
  184. lifetxt-1.0.1/lifetxt/webapp.py +2830 -0
  185. lifetxt-1.0.1/lifetxt/work_session.py +258 -0
  186. lifetxt-1.0.1/lifetxt/workspace.py +1020 -0
  187. lifetxt-1.0.1/lifetxt/workspace_diagnostics.py +618 -0
  188. lifetxt-1.0.1/lifetxt/write_operations.py +458 -0
  189. lifetxt-1.0.1/lifetxt.egg-info/PKG-INFO +526 -0
  190. lifetxt-1.0.1/lifetxt.egg-info/SOURCES.txt +338 -0
  191. lifetxt-1.0.1/lifetxt.egg-info/dependency_links.txt +1 -0
  192. lifetxt-1.0.1/lifetxt.egg-info/entry_points.txt +2 -0
  193. lifetxt-1.0.1/lifetxt.egg-info/requires.txt +20 -0
  194. lifetxt-1.0.1/lifetxt.egg-info/top_level.txt +1 -0
  195. lifetxt-1.0.1/pyproject.toml +68 -0
  196. lifetxt-1.0.1/readme.md +474 -0
  197. lifetxt-1.0.1/setup.cfg +4 -0
  198. lifetxt-1.0.1/tests/test_archive_cli.py +117 -0
  199. lifetxt-1.0.1/tests/test_archive_plan_v1.py +644 -0
  200. lifetxt-1.0.1/tests/test_attachment_packages_v5.py +167 -0
  201. lifetxt-1.0.1/tests/test_attachment_transactions_v4.py +162 -0
  202. lifetxt-1.0.1/tests/test_attachments.py +891 -0
  203. lifetxt-1.0.1/tests/test_backup_restore_v6.py +257 -0
  204. lifetxt-1.0.1/tests/test_brand_assets.py +203 -0
  205. lifetxt-1.0.1/tests/test_change_package_closeout.py +149 -0
  206. lifetxt-1.0.1/tests/test_check_release_policy_cli.py +51 -0
  207. lifetxt-1.0.1/tests/test_check_release_tag_version.py +75 -0
  208. lifetxt-1.0.1/tests/test_cli_timezone_context_v2.py +190 -0
  209. lifetxt-1.0.1/tests/test_clock_contract_v4.py +42 -0
  210. lifetxt-1.0.1/tests/test_clock_skew_v5.py +46 -0
  211. lifetxt-1.0.1/tests/test_completion_surfaces.py +489 -0
  212. lifetxt-1.0.1/tests/test_completion_values.py +185 -0
  213. lifetxt-1.0.1/tests/test_config_cli.py +268 -0
  214. lifetxt-1.0.1/tests/test_config_validation.py +758 -0
  215. lifetxt-1.0.1/tests/test_cui_extensions.py +2637 -0
  216. lifetxt-1.0.1/tests/test_delegated_mutation_v6.py +255 -0
  217. lifetxt-1.0.1/tests/test_diagnostic_contract.py +187 -0
  218. lifetxt-1.0.1/tests/test_docker_image.py +327 -0
  219. lifetxt-1.0.1/tests/test_doctor_cli_v2.py +267 -0
  220. lifetxt-1.0.1/tests/test_editor_safety_v5.py +102 -0
  221. lifetxt-1.0.1/tests/test_extended_workspace_resolution.py +225 -0
  222. lifetxt-1.0.1/tests/test_external_verification.py +1398 -0
  223. lifetxt-1.0.1/tests/test_extra_cli.py +378 -0
  224. lifetxt-1.0.1/tests/test_fault_drill_v5.py +33 -0
  225. lifetxt-1.0.1/tests/test_fault_matrix_v6.py +83 -0
  226. lifetxt-1.0.1/tests/test_fuzzy_search.py +168 -0
  227. lifetxt-1.0.1/tests/test_generate_conda_recipe.py +85 -0
  228. lifetxt-1.0.1/tests/test_generate_homebrew_formula.py +115 -0
  229. lifetxt-1.0.1/tests/test_generate_scoop_manifest.py +72 -0
  230. lifetxt-1.0.1/tests/test_generate_winget_manifest.py +110 -0
  231. lifetxt-1.0.1/tests/test_generated_record_capture_compat.py +308 -0
  232. lifetxt-1.0.1/tests/test_global_search.py +144 -0
  233. lifetxt-1.0.1/tests/test_inbox.py +347 -0
  234. lifetxt-1.0.1/tests/test_integrity.py +624 -0
  235. lifetxt-1.0.1/tests/test_life_hub.py +315 -0
  236. lifetxt-1.0.1/tests/test_lifetxt.py +11586 -0
  237. lifetxt-1.0.1/tests/test_links.py +679 -0
  238. lifetxt-1.0.1/tests/test_mcp_expansion.py +1518 -0
  239. lifetxt-1.0.1/tests/test_messaging_groups.py +132 -0
  240. lifetxt-1.0.1/tests/test_multi_file_write_guards.py +59 -0
  241. lifetxt-1.0.1/tests/test_multi_target_v2.py +224 -0
  242. lifetxt-1.0.1/tests/test_mutation.py +502 -0
  243. lifetxt-1.0.1/tests/test_nextaction.py +122 -0
  244. lifetxt-1.0.1/tests/test_p0_cli_v6.py +144 -0
  245. lifetxt-1.0.1/tests/test_parser_format_metadata.py +38 -0
  246. lifetxt-1.0.1/tests/test_paths.py +167 -0
  247. lifetxt-1.0.1/tests/test_people.py +106 -0
  248. lifetxt-1.0.1/tests/test_personal_context.py +141 -0
  249. lifetxt-1.0.1/tests/test_personal_context_cli.py +110 -0
  250. lifetxt-1.0.1/tests/test_personal_context_correction.py +85 -0
  251. lifetxt-1.0.1/tests/test_presence_mutation.py +69 -0
  252. lifetxt-1.0.1/tests/test_project_archive.py +186 -0
  253. lifetxt-1.0.1/tests/test_project_archive_safety_v3.py +264 -0
  254. lifetxt-1.0.1/tests/test_projects.py +160 -0
  255. lifetxt-1.0.1/tests/test_query.py +144 -0
  256. lifetxt-1.0.1/tests/test_randomized_roundtrip.py +57 -0
  257. lifetxt-1.0.1/tests/test_recovery_cli_v3.py +158 -0
  258. lifetxt-1.0.1/tests/test_recovery_doctor_v3.py +79 -0
  259. lifetxt-1.0.1/tests/test_recurrence.py +470 -0
  260. lifetxt-1.0.1/tests/test_recurrence_wkst.py +354 -0
  261. lifetxt-1.0.1/tests/test_release_policy.py +155 -0
  262. lifetxt-1.0.1/tests/test_remote_access_v19.py +82 -0
  263. lifetxt-1.0.1/tests/test_remote_access_v20.py +82 -0
  264. lifetxt-1.0.1/tests/test_remote_attachment_contracts_v6.py +296 -0
  265. lifetxt-1.0.1/tests/test_remote_backend_v20.py +663 -0
  266. lifetxt-1.0.1/tests/test_remote_client_v19.py +40 -0
  267. lifetxt-1.0.1/tests/test_remote_client_v20.py +97 -0
  268. lifetxt-1.0.1/tests/test_remote_client_writes_compat_v25.py +88 -0
  269. lifetxt-1.0.1/tests/test_remote_client_writes_v23.py +225 -0
  270. lifetxt-1.0.1/tests/test_remote_compatibility_v21.py +267 -0
  271. lifetxt-1.0.1/tests/test_remote_pagination.py +103 -0
  272. lifetxt-1.0.1/tests/test_remote_sessions_v20.py +182 -0
  273. lifetxt-1.0.1/tests/test_remote_ticket_capability_v26.py +30 -0
  274. lifetxt-1.0.1/tests/test_remote_ticket_write_core.py +164 -0
  275. lifetxt-1.0.1/tests/test_remote_ticket_writes_v22.py +517 -0
  276. lifetxt-1.0.1/tests/test_remote_tui_hardening_v27.py +89 -0
  277. lifetxt-1.0.1/tests/test_remote_web_v19.py +75 -0
  278. lifetxt-1.0.1/tests/test_remote_web_v20.py +287 -0
  279. lifetxt-1.0.1/tests/test_replace_retry_policy.py +86 -0
  280. lifetxt-1.0.1/tests/test_report_cli.py +222 -0
  281. lifetxt-1.0.1/tests/test_revision_migration_metrics.py +79 -0
  282. lifetxt-1.0.1/tests/test_revision_telemetry_relocation_v3.py +66 -0
  283. lifetxt-1.0.1/tests/test_revision_telemetry_v2.py +169 -0
  284. lifetxt-1.0.1/tests/test_roundtrip_golden.py +335 -0
  285. lifetxt-1.0.1/tests/test_safe_ops_concurrency.py +150 -0
  286. lifetxt-1.0.1/tests/test_safe_write_surfaces_v4.py +160 -0
  287. lifetxt-1.0.1/tests/test_safety_cli.py +235 -0
  288. lifetxt-1.0.1/tests/test_safety_foundation.py +367 -0
  289. lifetxt-1.0.1/tests/test_schema_extensions_v19.py +10 -0
  290. lifetxt-1.0.1/tests/test_schema_extensions_v2.py +143 -0
  291. lifetxt-1.0.1/tests/test_schema_extensions_v20.py +18 -0
  292. lifetxt-1.0.1/tests/test_schema_extensions_v22.py +19 -0
  293. lifetxt-1.0.1/tests/test_serve_cli.py +59 -0
  294. lifetxt-1.0.1/tests/test_server_init.py +390 -0
  295. lifetxt-1.0.1/tests/test_server_update.py +2029 -0
  296. lifetxt-1.0.1/tests/test_set_tauri_desktop_version.py +62 -0
  297. lifetxt-1.0.1/tests/test_shared_surface_mutation_routing.py +181 -0
  298. lifetxt-1.0.1/tests/test_shorthand.py +947 -0
  299. lifetxt-1.0.1/tests/test_stable_surface_schemas.py +137 -0
  300. lifetxt-1.0.1/tests/test_standalone_binary.py +212 -0
  301. lifetxt-1.0.1/tests/test_startup_preflight_v5.py +35 -0
  302. lifetxt-1.0.1/tests/test_supported_runtime.py +81 -0
  303. lifetxt-1.0.1/tests/test_surface_runtime.py +813 -0
  304. lifetxt-1.0.1/tests/test_temporal_cli.py +65 -0
  305. lifetxt-1.0.1/tests/test_temporal_context.py +167 -0
  306. lifetxt-1.0.1/tests/test_ticket_activity_clock.py +28 -0
  307. lifetxt-1.0.1/tests/test_ticket_creation_event.py +120 -0
  308. lifetxt-1.0.1/tests/test_ticket_custom_field_public_contract.py +51 -0
  309. lifetxt-1.0.1/tests/test_ticket_custom_fields.py +351 -0
  310. lifetxt-1.0.1/tests/test_ticket_planning.py +345 -0
  311. lifetxt-1.0.1/tests/test_ticket_project_surface_guards.py +37 -0
  312. lifetxt-1.0.1/tests/test_ticket_project_surfaces.py +204 -0
  313. lifetxt-1.0.1/tests/test_ticket_projects.py +309 -0
  314. lifetxt-1.0.1/tests/test_ticket_revision_bytes.py +44 -0
  315. lifetxt-1.0.1/tests/test_ticket_revision_writes.py +245 -0
  316. lifetxt-1.0.1/tests/test_ticket_workflow_history.py +469 -0
  317. lifetxt-1.0.1/tests/test_ticket_workflow_surfaces.py +167 -0
  318. lifetxt-1.0.1/tests/test_tickets.py +123 -0
  319. lifetxt-1.0.1/tests/test_timer_public_revisions_v3.py +207 -0
  320. lifetxt-1.0.1/tests/test_timezone_aware.py +169 -0
  321. lifetxt-1.0.1/tests/test_timezone_clock_v3.py +50 -0
  322. lifetxt-1.0.1/tests/test_timezone_policy_v2.py +240 -0
  323. lifetxt-1.0.1/tests/test_today_cli.py +60 -0
  324. lifetxt-1.0.1/tests/test_traceability_gate.py +517 -0
  325. lifetxt-1.0.1/tests/test_transaction_admin_v5.py +163 -0
  326. lifetxt-1.0.1/tests/test_transaction_journal_v3.py +929 -0
  327. lifetxt-1.0.1/tests/test_transaction_policy_v4.py +162 -0
  328. lifetxt-1.0.1/tests/test_user_text.py +141 -0
  329. lifetxt-1.0.1/tests/test_verification_python_bootstrap.py +355 -0
  330. lifetxt-1.0.1/tests/test_vm.py +356 -0
  331. lifetxt-1.0.1/tests/test_vm_cli.py +201 -0
  332. lifetxt-1.0.1/tests/test_web_assets.py +100 -0
  333. lifetxt-1.0.1/tests/test_web_commands.py +364 -0
  334. lifetxt-1.0.1/tests/test_web_i18n.py +286 -0
  335. lifetxt-1.0.1/tests/test_web_mobile.py +207 -0
  336. lifetxt-1.0.1/tests/test_web_routes_analytics.py +110 -0
  337. lifetxt-1.0.1/tests/test_web_routes_git.py +320 -0
  338. lifetxt-1.0.1/tests/test_work_session_v4.py +104 -0
  339. lifetxt-1.0.1/tests/test_workspace_diagnostics_v2.py +124 -0
  340. lifetxt-1.0.1/tests/test_workspace_foundation.py +744 -0
lifetxt-1.0.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 lifetxt contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
lifetxt-1.0.1/PKG-INFO ADDED
@@ -0,0 +1,526 @@
1
+ Metadata-Version: 2.4
2
+ Name: lifetxt
3
+ Version: 1.0.1
4
+ Summary: Parser, validator, converter, CLI, and optional web UI for life.txt.
5
+ Author: lifetxt contributors
6
+ License: MIT License
7
+
8
+ Copyright (c) 2026 lifetxt contributors
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Classifier: License :: OSI Approved :: MIT License
29
+ Classifier: Programming Language :: Python :: 3
30
+ Classifier: Programming Language :: Python :: 3.10
31
+ Classifier: Programming Language :: Python :: 3.11
32
+ Classifier: Programming Language :: Python :: 3.12
33
+ Classifier: Topic :: Office/Business :: Scheduling
34
+ Classifier: Topic :: Text Processing
35
+ Requires-Python: >=3.10
36
+ Description-Content-Type: text/markdown
37
+ License-File: LICENSE
38
+ Requires-Dist: tzdata; sys_platform == "win32"
39
+ Provides-Extra: web
40
+ Requires-Dist: fastapi<1.0,>=0.95; extra == "web"
41
+ Requires-Dist: uvicorn[standard]<1.0,>=0.22; extra == "web"
42
+ Provides-Extra: tui
43
+ Requires-Dist: textual<1.0,>=0.24; extra == "tui"
44
+ Requires-Dist: watchdog<7,>=3; extra == "tui"
45
+ Provides-Extra: dev
46
+ Requires-Dist: coverage<8,>=7; extra == "dev"
47
+ Requires-Dist: mypy<2,>=1.13; extra == "dev"
48
+ Requires-Dist: ruff>=0.16.1; extra == "dev"
49
+ Requires-Dist: httpx2; extra == "dev"
50
+ Requires-Dist: tomli; python_version < "3.11" and extra == "dev"
51
+ Dynamic: license-file
52
+
53
+ # life.txt
54
+
55
+ `life.txt` is a plain-text format for managing tasks, events, deadlines, reminders, habits, status / presence records, messages, notes, and journal / diary entries in a single human-readable file.
56
+ Please refer to [docs/en/life_txt_format_spec.md](./docs/en/life_txt_format_spec.md)
57
+ or [docs/ja/life_txt_format_spec.md](./docs/ja/life_txt_format_spec.md) for the
58
+ current grammar of `life.txt`.
59
+
60
+ lifetxt is a text-native, user-owned foundation for recording and using
61
+ important information about a person's past, present, and future, across
62
+ tools, interfaces, and AI providers. It is built around one durable record
63
+ rather than one productivity category, so the interface you use today --
64
+ editor, CLI, TUI, Web, or AI -- can change without taking your data with
65
+ it. See [docs/en/philosophy.md](./docs/en/philosophy.md) (or
66
+ [docs/ja/philosophy.md](./docs/ja/philosophy.md)) for the full philosophy
67
+ and long-term vision.
68
+
69
+ ## Documentation
70
+
71
+ - [English documentation](./docs/en/readme.md)
72
+ - [Japanese documentation](./docs/ja/readme.md)
73
+ - [English getting-started guide (Beginner / Minimal Profile)](./docs/en/getting-started.md)
74
+ - [Japanese getting-started guide (Beginner / Minimal Profile)](./docs/ja/getting-started.md)
75
+ - [English philosophy and vision](./docs/en/philosophy.md)
76
+ - [Japanese philosophy and vision](./docs/ja/philosophy.md)
77
+ - [English CLI guide](./docs/en/cli.md)
78
+ - [Japanese CLI guide](./docs/ja/cli.md)
79
+ - [English Web API / GUI guide](./docs/en/web.md)
80
+ - [Japanese Web API / GUI guide](./docs/ja/web.md)
81
+ - [English AI / MCP integration guide](./docs/en/ai-integration.md)
82
+ - [Japanese AI / MCP integration guide](./docs/ja/ai-integration.md)
83
+ - [English editor support guide](./docs/en/editor.md)
84
+ - [Japanese editor support guide](./docs/ja/editor.md)
85
+ - [English format specification](./docs/en/life_txt_format_spec.md)
86
+ - [Japanese format specification](./docs/ja/life_txt_format_spec.md)
87
+ - [Ubuntu Server production deployment runbook](./docs/deployment/ubuntu-server.md)
88
+
89
+ Use the format specification for file grammar and key semantics. Use the CLI
90
+ guide for command compatibility, filters, output formats, and conversion rules.
91
+
92
+ ## Getting Started
93
+
94
+ lifetxt supports Python 3.10 or newer.
95
+
96
+ New to lifetxt? Start with `init` and `doctor`:
97
+
98
+ ```sh
99
+ python -m lifetxt init # interactive: creates life.txt + .lifetxt.json
100
+ python -m lifetxt init --yes # non-interactive: accepts all defaults
101
+ python -m lifetxt doctor # checks your environment and files are set up correctly
102
+ python -m lifetxt check life.txt # validate syntax after your first edits
103
+ python -m lifetxt summary life.txt # see what init created
104
+ ```
105
+
106
+ `init` writes a starter `life.txt` (with `#! self:`, `#! timezone:`, and
107
+ optionally `#! project:` directives) and a matching `.lifetxt.json`, prompting
108
+ for your name, timezone, and default project. Pass `--yes` to skip every
109
+ prompt and accept the defaults (`self`, `UTC`, no project) — useful in
110
+ scripts and CI. `doctor` then reports pass/warn/fail checks for your Python
111
+ version, optional dependencies (`textual`, `watchdog`, `matplotlib`, `fzf`),
112
+ and config/life.txt file health, so you know what to install next. See
113
+ section 16 ("`init` and `doctor`") of the [CLI guide](./docs/en/cli.md) for
114
+ the full flag reference.
115
+
116
+ For the fastest introduction to what actually goes *inside* `life.txt`, see
117
+ [docs/en/getting-started.md](./docs/en/getting-started.md): a five-minute
118
+ Beginner / Minimal Profile that is a strict subset of the full format, so
119
+ nothing you write there needs to change when you learn the rest.
120
+
121
+ ## Minimal life.txt
122
+
123
+ ```txt
124
+ [ ] T Write_Report due:2026-06-12 project:university assignee:alice
125
+ [ ] E Seminar from:2026-06-08T13:00 to:2026-06-08T14:30 loc:university attendee:alice
126
+ [/] S Working from:2026-06-06T14:00 state:busy person:self
127
+ [ ] M "Review slides" sender:self recipient:alice notify_at:2026-06-06T09:00 channel:teams
128
+ [N] J "Research day" on:2026-06-23 mood:good tag:lab
129
+ | Read papers in the morning.
130
+ | Wrote parser tests in the afternoon.
131
+ [N] N Research_Memo project:research
132
+ ```
133
+
134
+ More sample files are available in [examples/](./examples/):
135
+
136
+ - [minimal_life.txt](./examples/minimal_life.txt): a compact starter file
137
+ - [getting_started_life.txt](./examples/getting_started_life.txt): the
138
+ Beginner / Minimal Profile example from
139
+ [docs/en/getting-started.md](./docs/en/getting-started.md)
140
+ - [tasks_life.txt](./examples/tasks_life.txt): tasks, deadlines, and notes
141
+ - [events_life.txt](./examples/events_life.txt): calendar-style event records
142
+ - [habits_reminders_life.txt](./examples/habits_reminders_life.txt): habits and reminders
143
+ - [status_presence.txt](./examples/status_presence.txt): personal presence records
144
+ - [team_status_life.txt](./examples/team_status_life.txt): multi-person status records
145
+ - [messages_life.txt](./examples/messages_life.txt): message and notification records
146
+ - [diary_life.txt](./examples/diary_life.txt): journal / diary entries with multiline body text
147
+ - [markdown_life.txt](./examples/markdown_life.txt): safe Markdown title/body/note rendering examples
148
+ - [linked_life.txt](./examples/linked_life.txt): id-based links with `parent`, `ref`, `depends_on`, `blocks`, and `related`
149
+ - [recurrence_time_life.txt](./examples/recurrence_time_life.txt): timezones, fractional seconds, simple recurrence, body, and dependency examples
150
+ - [hierarchy_life.txt](./examples/hierarchy_life.txt): indented nested records that infer `parent:` links
151
+ - [agenda_life.txt](./examples/agenda_life.txt): data for the `agenda` command
152
+ - [json_roundtrip_life.txt](./examples/json_roundtrip_life.txt): repeated keys and quoted values
153
+ - [calendar_import.ics](./examples/calendar_import.ics): sample iCalendar input for `import-ics`
154
+
155
+ ## Tools
156
+
157
+ This repository includes a dependency-free Python CLI:
158
+
159
+ ```sh
160
+ python -m lifetxt check life.txt
161
+ python -m lifetxt demo --count 50 --date 2026-07-12 -o demo.life.txt
162
+ python -m lifetxt to-json life.txt --pretty
163
+ python -m lifetxt to-jsonl life.txt --open --type task -o open_tasks.jsonl
164
+ python -m lifetxt to-csv life.txt --type journal -o journal.csv
165
+ python -m lifetxt markdown life.txt --field all --format html -o markdown.html
166
+ python -m lifetxt import-ics google_calendar.ics -o life.txt --append --tag google
167
+ python -m lifetxt sync-ics --url-env LIFETXT_GOOGLE_CAL_ICS -o .generated/google_calendar.life.txt --cache-dir .cache/lifetxt --tag google
168
+ python -m lifetxt filter life.txt --open --type task -o open_tasks.life.txt
169
+ python -m lifetxt filter life.txt --open --type task --canonical -o canonical_tasks.life.txt
170
+ python -m lifetxt filter life.txt --assignee alice -o alice_items.life.txt
171
+ python -m lifetxt filter "projects/**/*.life.txt" --team research --tag-all urgent,review --exclude-tag archived
172
+ python -m lifetxt filter life.txt --after now --type event -o future_schedule.life.txt
173
+ python -m lifetxt filter life.txt --type status --person self -o my_status.life.txt
174
+ python -m lifetxt filter life.txt --type message --recipient alice -o alice_messages.life.txt
175
+ python -m lifetxt status life.txt
176
+ python -m lifetxt status life.txt --active
177
+ python -m lifetxt status life.txt --format json --pretty
178
+ python -m lifetxt notify life.txt --recipient self
179
+ python -m lifetxt notify life.txt --watch --interval 30
180
+ python -m lifetxt ids life.txt --assign --dry-run
181
+ python -m lifetxt ids "projects/**/*.life.txt" --assign --prefix item --dry-run
182
+ python -m lifetxt links life.txt --id task_report --direction incoming
183
+ python -m lifetxt agenda life.txt --from 2026-06-06T13:00 --to 2026-06-06T18:00
184
+ python -m lifetxt agenda life.txt --from 2026-06-06T13:00:30+09:00 --to 2026-06-06T18:00:00+09:00
185
+ python -m lifetxt agenda life.txt --around now --window 1w --format life -o agenda.life.txt
186
+ python -m lifetxt agenda life.txt --from 2026-06-06 --to 2026-06-06 --open
187
+ python -m lifetxt agenda life.txt --from 2026-06-06 --to 2026-06-06 --type task --project research
188
+ python -m lifetxt tui life.txt
189
+ python -m lifetxt fzf life.txt --open --type task --action done
190
+ python -m lifetxt timer start life.txt --id task_report
191
+ python -m lifetxt timer stop
192
+ python -m lifetxt stats life.txt --project research
193
+ python -m lifetxt git-hook status
194
+ python -m lifetxt completion bash
195
+ python -m lifetxt from-json life.json -o life.txt
196
+ python -m lifetxt from-jsonl life.jsonl -o life.txt
197
+ python -m lifetxt from-csv journal.csv -o journal.life.txt
198
+ python -m lifetxt serve life.txt --host 127.0.0.1 --port 8000
199
+ LIFETXT_API_TOKEN=change-me python -m lifetxt serve life.txt --host 0.0.0.0 --token-env LIFETXT_API_TOKEN
200
+ python -m lifetxt mcp life.txt
201
+ python -m lifetxt serve life.txt .generated/google_calendar.life.txt --write-file life.txt --read-only
202
+ python -m lifetxt config init -o .lifetxt.json
203
+ echo "Buy milk" | python -m lifetxt quick - --append life.txt
204
+ python -m lifetxt done life.txt habit_exercise
205
+ python -m lifetxt complete life.txt task_water_plants
206
+ ```
207
+
208
+ Once a release is published to PyPI (see
209
+ [Distribution Channels](docs/en/distribution.md) for the release automation
210
+ and current status), the primary end-user install is:
211
+
212
+ ```sh
213
+ pip install lifetxt
214
+ lifetxt check examples/minimal_life.txt
215
+ ```
216
+
217
+ Until then, install as a command from a source checkout or a built
218
+ wheel/sdist (see
219
+ [Stable Release Artifact Verification](docs/en/stable-release-artifact-verification.md)
220
+ for building a wheel/sdist yourself):
221
+
222
+ ```sh
223
+ python -m pip install .
224
+ lifetxt check examples/minimal_life.txt
225
+ ```
226
+
227
+ Contributing to lifetxt itself, rather than just using it, needs an editable
228
+ install instead (`pip install -e .`) so source edits take effect without
229
+ reinstalling — see [Development environment](#development-environment) below.
230
+
231
+ Most file-reading commands accept multiple input paths, glob patterns, and
232
+ directories containing life.txt-like `.txt` files. The `filter`,
233
+ `to-json`, `to-jsonl`, `to-csv`, and `markdown` commands support item filters such as `--open`,
234
+ `--status`, `--type`, `--project`, `--tag`, `--tag-all`, `--exclude-tag`,
235
+ `--user`, `--team`, `--person`, `--owner`,
236
+ `--assignee`, `--attendee`, `--sender`, `--recipient`, `--detail`, `--text`,
237
+ `--after`, and `--before`.
238
+ `filter --format life` preserves original matching item lines by default; use
239
+ `--canonical` to regenerate normalized life.txt lines. Use `person:` for
240
+ status / presence targets, `assignee:` for assigned work, `owner:` for
241
+ accountability, and `attendee:` for event participants.
242
+
243
+ The `import-ics` command converts iCalendar `.ics` files, such as Google
244
+ Calendar exports, to `E` event items. Timed events become `from:` / `to:`,
245
+ all-day events become `on:`, participants become `attendee:`, and `--append`
246
+ can add imported events to an existing `life.txt`. Imported calendar events
247
+ include `source:ics` and `uid:` metadata. Convenience presets also import
248
+ Markdown task lists, Todoist CSV exports, and GitHub Issues JSON exports:
249
+
250
+ ```sh
251
+ python -m lifetxt import-ics tasks.md --preset markdown --project inbox
252
+ python -m lifetxt import-ics todoist.csv --preset todoist --tag todoist
253
+ python -m lifetxt import-ics github_issues.json --preset github --project repo
254
+ ```
255
+
256
+ For periodic calendar sync, use `sync-ics` with a secret iCalendar URL stored in
257
+ an environment variable. Keep manually edited items in `life.txt`, write
258
+ ICS-derived items to a generated file such as `.generated/google_calendar.life.txt`,
259
+ and pass both files to commands such as `agenda` or `check`. Use
260
+ `--merge-existing --soft-delete-missing` when you want to preserve comments in
261
+ the generated output while updating UID-backed records in place.
262
+
263
+ An optional FastAPI REST API and browser GUI are available with:
264
+
265
+ ```sh
266
+ pip install -r requirements-web.txt
267
+ python -m lifetxt serve life.txt
268
+ ```
269
+
270
+ For MCP-compatible AI clients, use the dependency-free stdio server:
271
+
272
+ ```sh
273
+ python -m lifetxt mcp life.txt
274
+ python -m lifetxt mcp life.txt .generated/google_calendar.life.txt --write-file life.txt
275
+ python -m lifetxt serve life.txt --mcp
276
+ ```
277
+
278
+ MCP tools cover item listing, item lookup, create/update/delete/done actions,
279
+ agenda, graph, blockers, links, latest status, notifications, and message
280
+ operations. With multiple input files, read tools scan all files and write
281
+ tools modify only `--write-file`.
282
+
283
+ The Web UI uses a header Workspace for Dashboard, Items, Agenda, Timeline,
284
+ Focus, Review, Messages, Team, Status, Notifications, Stats, Graph, Display,
285
+ and Kiosk.
286
+ The header includes a contextual View Guide for the active workspace, exposes
287
+ the workspace switcher as a keyboard-friendly tablist, and provides a
288
+ skip-to-content link for dense dashboards.
289
+ Records open in centered modals with thread replies, dependency links, due
290
+ quick actions, and Markdown previews. Review supports project/custom date
291
+ filters and Markdown copy; Timeline preserves `range=today|24h|week` in the
292
+ URL, shows guided empty states for ranges with no dated records, and marks
293
+ records that overlap the selected range from earlier starts as `ongoing`.
294
+ The Items view now has action-oriented empty states, and Team cards include a
295
+ `View items` action that opens `user=PERSON&open_only=true` in the shared
296
+ Items filter.
297
+ Dashboard cards and theme tokens are configurable through `web.dashboard.*`
298
+ and `web.theme.*`. Display mode has separate light/dark palettes. The `+ New`
299
+ editor exposes viewport-aware hover/focus help for status, type, title, and
300
+ detail fields. Press `Ctrl+K` for the fuzzy
301
+ command palette, recently opened records, undo history, exports, theme toggles,
302
+ and common actions. Use `--read-only` for public or wall-display deployments
303
+ and `--write-file FILE` when reading multiple files but writing to a single
304
+ hand-maintained file.
305
+
306
+ Terminal-oriented helpers are available through `tui`, `fzf`, `timer`, `stats`,
307
+ `git-hook`, and `completion`. `fzf` requires `fzf` or `peco` in `PATH`; the
308
+ enhanced TUI can use the optional `tui` extra, while a dependency-free fallback
309
+ is available by default. TUI supports configurable themes/keymaps, row
310
+ selection, top-card summaries, an always-visible inspector panel, `/` search,
311
+ detail display, mark-done, editor opening, and project filtering:
312
+
313
+ ```sh
314
+ python -m lifetxt tui life.txt --theme dark --keymap vim --limit 15
315
+ python -m lifetxt tui life.txt --theme light --keymap arrows --agenda-window 1d
316
+ ```
317
+
318
+ Dependency chains can also be exported for graph tooling:
319
+
320
+ ```sh
321
+ python -m lifetxt deps life.txt --root task_report --format mermaid --depth 2
322
+ python -m lifetxt deps life.txt --blocked --format dot
323
+ ```
324
+
325
+ The `status` command prints the latest `S` status / presence item for each
326
+ `person:`. If `person:` is omitted, it is treated as `self` for this summary.
327
+ The latest item is selected by the newest `from:` datetime. Use `--person NAME`
328
+ to filter one person, `--active` to ignore finished logs with `to:`, or
329
+ `--format json` / `--format jsonl` for machine-readable output.
330
+
331
+ The `agenda` command prints items related to a datetime range. `from/to`,
332
+ `notify_from/notify_to`, and `on` are treated as intervals, while `due`, `do`,
333
+ `at`, `moved_to`, and `notify_at` are treated as points or all-day spans. Use
334
+ `--around now --window 2h` for a near-current-time view, or `--format life`,
335
+ `json`, or `jsonl` for other output.
336
+ Datetime values may include seconds, fractional seconds, and explicit
337
+ timezones, such as `2026-06-06T13:00:30.25+09:00`. Simple `repeat:` values
338
+ (`daily`, `weekly`, `monthly`, `yearly`, `weekdays`) are expanded by agenda and
339
+ time filters, with optional `interval:`, `until:`, and `count:`. A small
340
+ dependency-free `repeat:RRULE:...` subset is also expanded for
341
+ `FREQ=DAILY|WEEKLY|MONTHLY|YEARLY`, `INTERVAL`, `COUNT`, `UNTIL`, and
342
+ daily/weekly `BYDAY`.
343
+ Use `--open` for unfinished workflow items only, or combine filters such as
344
+ `--status`, `--type`, `--project`, `--tag`, `--tag-all`, `--user`, `--team`,
345
+ `--person`, `--detail key=value`, and `--text`. `--window` accepts seconds, minutes, hours, days, weeks, months
346
+ approximated as 30 days, and years approximated as 365 days.
347
+
348
+ Message records use type `M`. They require `sender:` and `recipient:` and can
349
+ use `notify_at:` for one notification time or `notify_from:` / `notify_to:` for
350
+ a notification window. Use `body:` for longer message text when the title should
351
+ stay short. The web API also provides `/api/messages` for convenient message
352
+ listing and creation. `/api/items/id/{id}` and `/api/messages/id/{id}` support
353
+ id-based access, while `/api/messages/thread/{id}` and
354
+ `/api/messages/id/{id}/reply` support message threads via `parent:`.
355
+
356
+ Use `python -m lifetxt notify life.txt --watch` as a resident notification
357
+ watcher. The browser GUI also has an `Enable Notifications` button that polls
358
+ `/api/notifications` and uses browser notifications after permission is granted.
359
+ Message notifications can be acknowledged with `ack:` or snoozed with
360
+ `snooze_until:`. The watcher can persist seen notification IDs with
361
+ `notifications.state_file`. The same `notify` command can send due
362
+ notifications as a plain-text email batch:
363
+
364
+ ```sh
365
+ python -m lifetxt notify life.txt --recipient self --email --email-to me@example.com --dry-run
366
+ python -m lifetxt notify life.txt --watch --once --state-file .generated/notifications.json
367
+ python -m lifetxt notify life.txt --watch --email --email-to me@example.com --interval 60
368
+ ```
369
+
370
+ SMTP credentials are read from environment variables such as
371
+ `LIFETXT_SMTP_HOST`, `LIFETXT_SMTP_USER`, and `LIFETXT_SMTP_PASS`; do not store
372
+ SMTP passwords in life.txt content.
373
+
374
+ For release checks, run the fast smoke runner:
375
+
376
+ ```sh
377
+ python scripts/smoke_test.py
378
+ ```
379
+
380
+ External JSON config is available with `--config FILE`, `LIFETXT_CONFIG`,
381
+ `.lifetxt.json`, or `lifetxt.config.json`. Use `python -m lifetxt config init`
382
+ to create a starter file with default paths, web settings, message defaults,
383
+ notification settings, user name, user/team/tag aliases, automatic ID settings, and iCalendar sync
384
+ sources. With `ids.auto: true`, created items receive an `id:` when omitted;
385
+ existing IDs are checked across configured input files and `write_file` before
386
+ writing. Duplicate IDs are reported as warning `W213`. Use `python -m lifetxt ids
387
+ life.txt` to audit present, missing, and duplicate IDs. Use `ids --assign` with
388
+ `--dry-run` first to backfill IDs safely. Set `ids.key` / `api.id_key` to use a
389
+ custom ID detail key.
390
+
391
+ Journal / diary records use type `J`; aliases include `journal`, `diary`,
392
+ `log`, and `entry`. `[N]` is the recommended status. Use `body:` for long text;
393
+ when the value spans multiple lines, write continuation lines beginning with
394
+ `|` after the item.
395
+ `body:` is also useful outside `J` for detailed tasks, event descriptions,
396
+ messages, and notes. Use `note:` for short side notes and `body:` for long-form
397
+ content.
398
+
399
+ Input assistance is available in both non-interactive and interactive modes:
400
+
401
+ ```sh
402
+ python -m lifetxt assist --type task --title "Write Report" --due 2026-06-12 --project university --tag report
403
+ python -m lifetxt assist --type status --title "Working" --from 2026-06-06T14:00 --state busy --person self
404
+ python -m lifetxt assist --type message --title "Review Slides" --sender self --recipient alice --notify_at 2026-06-06T09:00
405
+ python -m lifetxt assist --type diary --title "Research day" --on 2026-06-23 --mood good --body "Read papers."
406
+ python -m lifetxt assist --type task --title "Write Report" --due 2026-06-12 --output new_life.txt
407
+ python -m lifetxt assist --type task --title "Write Report" --due 2026-06-12 --append life.txt
408
+ python -m lifetxt assist --interactive --append life.txt
409
+ ```
410
+
411
+ In create mode, `assist --output FILE` appends the generated line to `FILE`.
412
+ It does not overwrite existing content.
413
+
414
+ In interactive mode, enter `?`, `?type`, `?status`, or `?detail` at a prompt
415
+ to show contextual help. At the detail prompt, use `?due` or another `?key`
416
+ form for key-specific help. When the terminal supports it, Tab completes type,
417
+ status, and detail-key candidates, and Up/Down recall previous inputs. Use
418
+ `--no-completion` to disable the line editing helpers.
419
+
420
+ Existing data can be updated by line number or by `id:`. Updates are written
421
+ in-place unless `--output` is specified.
422
+
423
+ ```sh
424
+ python -m lifetxt assist --update life.txt --match-id task_001 --status done --done 2026-06-06
425
+ python -m lifetxt assist --update life.txt --line 3 --title "New Title" --add-detail tag=important
426
+ python -m lifetxt assist --update life.txt --match-id task_001 --remove-detail tag --output updated_life.txt
427
+ ```
428
+
429
+ The `check` command reports syntax errors and semantic warnings such as invalid status/type values, malformed `key:value` details, note/journal status/type mismatches, date/time format issues, unusual key style, and event ranges where `to:` is earlier than `from:`.
430
+ For `type:S` status / presence records, `from:` and `state:` are required. `[/]` is recommended when the record has no `to:`, and `[x]` is recommended when `to:` is present.
431
+
432
+ Items can link to other records by ID. Use `parent:` for hierarchy or message
433
+ threads, `ref:` for a generic reference, `depends_on:` for prerequisites,
434
+ `blocks:` for blocked downstream work, and `related:` for loose links. The
435
+ `check` command warns about missing references, self references, and `parent:`
436
+ cycles. It also warns when a completed item still depends on an open
437
+ prerequisite. `agenda` and `health` surface open items blocked by open
438
+ prerequisites. Use `python -m lifetxt links life.txt` to inspect these relationships.
439
+ Use `python -m lifetxt links life.txt --relation depends_on --relation blocks`
440
+ to focus on dependency edges.
441
+
442
+ Indented item lines can also express hierarchy. If a child line is indented and
443
+ does not already have `parent:`, the parser infers `parent:` from the nearest
444
+ less-indented ancestor that has an `id:`.
445
+
446
+ ```txt
447
+ [ ] T Research_Project id:proj_research
448
+ [ ] T Literature_Review id:task_lit
449
+ [N] N Reading_Memo
450
+ ```
451
+
452
+ Basic VS Code syntax highlighting and snippets are available in
453
+ [editors/vscode/lifetxt](./editors/vscode/lifetxt). See
454
+ [docs/en/editor.md](./docs/en/editor.md) for editor setup and the planned
455
+ language-server direction.
456
+
457
+ ## JSON Shape
458
+
459
+ Details are always represented as arrays so repeated keys round-trip safely:
460
+
461
+ ```json
462
+ {
463
+ "status": "[ ]",
464
+ "type": "T",
465
+ "title": "Create_Slides",
466
+ "details": {
467
+ "project": ["research"],
468
+ "tag": ["important", "thesis"]
469
+ }
470
+ }
471
+ ```
472
+
473
+ CSV conversion uses `status`, `type`, and `title` columns plus detail-key
474
+ columns. Repeated detail values are stored as JSON arrays inside cells, and
475
+ multiline `body:` values are stored as quoted CSV cells.
476
+
477
+ ### Development environment
478
+
479
+ Every command below assumes `python` resolves to an interpreter that meets
480
+ `requires-python` in `pyproject.toml` (currently 3.10 or newer). A system
481
+ `python` older than that is common, and the failure is quiet rather than
482
+ obvious: the suite still runs, but test modules that use newer syntax fail to
483
+ import, so the run covers fewer tests than it appears to and its result is not
484
+ evidence. `tests/test_supported_runtime.py` fails with an explicit message in
485
+ that case instead of letting the run look successful.
486
+
487
+ If your default `python` is too old, work from a virtual environment created by
488
+ a supported one. Creating it is not enough — enter it, or the commands further
489
+ down still reach the interpreter this section is warning you about:
490
+
491
+ ```sh
492
+ py -3.12 -m venv .venv # Windows; use python3.12 -m venv .venv elsewhere
493
+ . .\.venv\Scripts\Activate.ps1 # Windows PowerShell; use . .venv/bin/activate elsewhere
494
+ python -m pip install -e ".[web,dev]"
495
+ ```
496
+
497
+ Activation lasts for the shell session, and every command below assumes it is
498
+ active. To skip it, call the interpreter by path instead
499
+ (`.venv/Scripts/python -m unittest discover`); do not mix the two styles in one
500
+ session, which is how a run ends up on the wrong interpreter without anyone
501
+ noticing.
502
+
503
+ On Windows this also installs `tzdata`, the only mandatory runtime dependency.
504
+ `zoneinfo` has no timezone database to read there, so without it no timezone
505
+ resolves at all. Other platforms use the system database and do not receive it.
506
+
507
+ The `web` extra is what the Web API tests need; without it those tests skip,
508
+ which again means a green run proves less than it looks like it does. The
509
+ `dev` extra brings in `httpx2`, which `starlette.testclient` requires; a
510
+ `pip install -e ".[web]"` alone (without `dev`) makes those tests fail
511
+ outright rather than skip, since `TestClient` raises without it.
512
+
513
+ Run tests with:
514
+
515
+ ```sh
516
+ python -m unittest discover
517
+ python -m unittest tests.test_supported_runtime # confirms the interpreter first
518
+ ```
519
+
520
+ Install developer tooling and run the configured commands with:
521
+
522
+ ```sh
523
+ python -m pip install -e ".[dev]"
524
+ ruff format lifetxt tests scripts
525
+ ruff check lifetxt tests scripts
526
+ ```