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.
- lifetxt-1.0.1/LICENSE +21 -0
- lifetxt-1.0.1/PKG-INFO +526 -0
- lifetxt-1.0.1/lifetxt/__init__.py +278 -0
- lifetxt-1.0.1/lifetxt/__main__.py +5 -0
- lifetxt-1.0.1/lifetxt/_extra_convert_impl.py +290 -0
- lifetxt-1.0.1/lifetxt/agenda.py +1581 -0
- lifetxt-1.0.1/lifetxt/archive_plan_v1.py +345 -0
- lifetxt-1.0.1/lifetxt/archive_safety_v3.py +222 -0
- lifetxt-1.0.1/lifetxt/areas.py +136 -0
- lifetxt-1.0.1/lifetxt/assist.py +377 -0
- lifetxt-1.0.1/lifetxt/atomic.py +196 -0
- lifetxt-1.0.1/lifetxt/attachment_transactions.py +1218 -0
- lifetxt-1.0.1/lifetxt/attachments.py +587 -0
- lifetxt-1.0.1/lifetxt/cli.py +15508 -0
- lifetxt-1.0.1/lifetxt/clock_contract.py +108 -0
- lifetxt-1.0.1/lifetxt/clock_skew.py +130 -0
- lifetxt-1.0.1/lifetxt/command_center.py +382 -0
- lifetxt-1.0.1/lifetxt/completion.py +883 -0
- lifetxt-1.0.1/lifetxt/config.py +481 -0
- lifetxt-1.0.1/lifetxt/config_layers.py +198 -0
- lifetxt-1.0.1/lifetxt/config_migration.py +93 -0
- lifetxt-1.0.1/lifetxt/config_registry.py +772 -0
- lifetxt-1.0.1/lifetxt/config_validation.py +293 -0
- lifetxt-1.0.1/lifetxt/config_writer.py +367 -0
- lifetxt-1.0.1/lifetxt/csvio.py +116 -0
- lifetxt-1.0.1/lifetxt/delegated_mutation.py +700 -0
- lifetxt-1.0.1/lifetxt/delivery.py +135 -0
- lifetxt-1.0.1/lifetxt/demo.py +332 -0
- lifetxt-1.0.1/lifetxt/diagnostic_contract.py +66 -0
- lifetxt-1.0.1/lifetxt/doctor.py +283 -0
- lifetxt-1.0.1/lifetxt/editor_safety.py +196 -0
- lifetxt-1.0.1/lifetxt/entrypoint.py +333 -0
- lifetxt-1.0.1/lifetxt/extra_attachment.py +121 -0
- lifetxt-1.0.1/lifetxt/extra_cli.py +552 -0
- lifetxt-1.0.1/lifetxt/extra_common.py +380 -0
- lifetxt-1.0.1/lifetxt/extra_convert.py +16 -0
- lifetxt-1.0.1/lifetxt/extra_core.py +458 -0
- lifetxt-1.0.1/lifetxt/extra_reports.py +268 -0
- lifetxt-1.0.1/lifetxt/extra_safety.py +615 -0
- lifetxt-1.0.1/lifetxt/extra_shell.py +260 -0
- lifetxt-1.0.1/lifetxt/fault_drill.py +612 -0
- lifetxt-1.0.1/lifetxt/fuzzy_search.py +115 -0
- lifetxt-1.0.1/lifetxt/fzf_helper.py +485 -0
- lifetxt-1.0.1/lifetxt/git_hook.py +146 -0
- lifetxt-1.0.1/lifetxt/global_search.py +207 -0
- lifetxt-1.0.1/lifetxt/groups.py +276 -0
- lifetxt-1.0.1/lifetxt/ics.py +460 -0
- lifetxt-1.0.1/lifetxt/ids.py +207 -0
- lifetxt-1.0.1/lifetxt/inbox.py +454 -0
- lifetxt-1.0.1/lifetxt/integrity.py +1361 -0
- lifetxt-1.0.1/lifetxt/interactive.py +607 -0
- lifetxt-1.0.1/lifetxt/links.py +1119 -0
- lifetxt-1.0.1/lifetxt/markdown.py +361 -0
- lifetxt-1.0.1/lifetxt/mcp.py +3550 -0
- lifetxt-1.0.1/lifetxt/mcp_resources.py +35 -0
- lifetxt-1.0.1/lifetxt/model.py +397 -0
- lifetxt-1.0.1/lifetxt/multi_target.py +526 -0
- lifetxt-1.0.1/lifetxt/mutation.py +570 -0
- lifetxt-1.0.1/lifetxt/nextaction.py +134 -0
- lifetxt-1.0.1/lifetxt/notifier.py +367 -0
- lifetxt-1.0.1/lifetxt/parser.py +724 -0
- lifetxt-1.0.1/lifetxt/paths.py +92 -0
- lifetxt-1.0.1/lifetxt/people.py +294 -0
- lifetxt-1.0.1/lifetxt/personal_context.py +478 -0
- lifetxt-1.0.1/lifetxt/personal_context_cli.py +282 -0
- lifetxt-1.0.1/lifetxt/presence.py +247 -0
- lifetxt-1.0.1/lifetxt/projects.py +581 -0
- lifetxt-1.0.1/lifetxt/query.py +356 -0
- lifetxt-1.0.1/lifetxt/recurrence.py +548 -0
- lifetxt-1.0.1/lifetxt/release_manifest_validation.py +62 -0
- lifetxt-1.0.1/lifetxt/release_policy.py +614 -0
- lifetxt-1.0.1/lifetxt/release_policy_compat.py +208 -0
- lifetxt-1.0.1/lifetxt/release_schema_extension.py +94 -0
- lifetxt-1.0.1/lifetxt/release_translation.py +28 -0
- lifetxt-1.0.1/lifetxt/remote_access.py +542 -0
- lifetxt-1.0.1/lifetxt/remote_backend.py +557 -0
- lifetxt-1.0.1/lifetxt/remote_client.py +433 -0
- lifetxt-1.0.1/lifetxt/remote_client_writes.py +623 -0
- lifetxt-1.0.1/lifetxt/remote_client_writes_compat_v25.py +236 -0
- lifetxt-1.0.1/lifetxt/remote_compatibility_v21.py +385 -0
- lifetxt-1.0.1/lifetxt/remote_contracts_v6.py +889 -0
- lifetxt-1.0.1/lifetxt/remote_sessions.py +322 -0
- lifetxt-1.0.1/lifetxt/remote_ticket_capability_v26.py +52 -0
- lifetxt-1.0.1/lifetxt/remote_ticket_write_core.py +362 -0
- lifetxt-1.0.1/lifetxt/remote_ticket_write_operations.py +351 -0
- lifetxt-1.0.1/lifetxt/remote_ticket_writes.py +216 -0
- lifetxt-1.0.1/lifetxt/remote_web.py +584 -0
- lifetxt-1.0.1/lifetxt/report_cli.py +353 -0
- lifetxt-1.0.1/lifetxt/report_config.py +111 -0
- lifetxt-1.0.1/lifetxt/review.py +234 -0
- lifetxt-1.0.1/lifetxt/revision_telemetry.py +382 -0
- lifetxt-1.0.1/lifetxt/runtime_safety_v2.py +245 -0
- lifetxt-1.0.1/lifetxt/safe_ops.py +114 -0
- lifetxt-1.0.1/lifetxt/safety_compat_v2.py +554 -0
- lifetxt-1.0.1/lifetxt/safety_foundation.py +874 -0
- lifetxt-1.0.1/lifetxt/saved_views.py +127 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v10.py +83 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v11.py +103 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v12.py +111 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v13.py +529 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v14.py +112 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v15.py +160 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v16.py +224 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v17.py +185 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v18.py +498 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v19.py +245 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v2.py +825 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v20.py +262 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v21.py +117 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v22.py +87 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v23.py +223 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v24.py +185 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v4.py +359 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v5.py +258 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v6.py +141 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v7.py +193 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v8.py +348 -0
- lifetxt-1.0.1/lifetxt/schema_extensions_v9.py +110 -0
- lifetxt-1.0.1/lifetxt/schema_validation_v2.py +116 -0
- lifetxt-1.0.1/lifetxt/serializer.py +146 -0
- lifetxt-1.0.1/lifetxt/server_init.py +913 -0
- lifetxt-1.0.1/lifetxt/server_update.py +1425 -0
- lifetxt-1.0.1/lifetxt/server_update_review.py +133 -0
- lifetxt-1.0.1/lifetxt/shorthand.py +201 -0
- lifetxt-1.0.1/lifetxt/stats.py +478 -0
- lifetxt-1.0.1/lifetxt/status_summary.py +146 -0
- lifetxt-1.0.1/lifetxt/support_bundle.py +113 -0
- lifetxt-1.0.1/lifetxt/surface_runtime.py +816 -0
- lifetxt-1.0.1/lifetxt/surface_runtime_compat.py +277 -0
- lifetxt-1.0.1/lifetxt/temporal_context.py +208 -0
- lifetxt-1.0.1/lifetxt/ticket_activity.py +785 -0
- lifetxt-1.0.1/lifetxt/ticket_activity_mutation.py +262 -0
- lifetxt-1.0.1/lifetxt/ticket_custom_fields.py +1344 -0
- lifetxt-1.0.1/lifetxt/ticket_planning.py +395 -0
- lifetxt-1.0.1/lifetxt/ticket_planning_cli.py +636 -0
- lifetxt-1.0.1/lifetxt/ticket_planning_mutation.py +400 -0
- lifetxt-1.0.1/lifetxt/ticket_project_report.py +281 -0
- lifetxt-1.0.1/lifetxt/ticket_project_surfaces.py +601 -0
- lifetxt-1.0.1/lifetxt/ticket_project_values.py +274 -0
- lifetxt-1.0.1/lifetxt/ticket_projects.py +190 -0
- lifetxt-1.0.1/lifetxt/ticket_revision_writes.py +611 -0
- lifetxt-1.0.1/lifetxt/ticket_workflow.py +742 -0
- lifetxt-1.0.1/lifetxt/ticket_workflow_cli.py +637 -0
- lifetxt-1.0.1/lifetxt/ticket_workflow_surfaces.py +361 -0
- lifetxt-1.0.1/lifetxt/tickets.py +474 -0
- lifetxt-1.0.1/lifetxt/timer.py +751 -0
- lifetxt-1.0.1/lifetxt/timeutil.py +315 -0
- lifetxt-1.0.1/lifetxt/timezone_policy.py +378 -0
- lifetxt-1.0.1/lifetxt/transaction_admin.py +672 -0
- lifetxt-1.0.1/lifetxt/transaction_journal.py +1141 -0
- lifetxt-1.0.1/lifetxt/transaction_policy.py +399 -0
- lifetxt-1.0.1/lifetxt/tui.py +1505 -0
- lifetxt-1.0.1/lifetxt/tui_app.py +3403 -0
- lifetxt-1.0.1/lifetxt/tui_layout.py +55 -0
- lifetxt-1.0.1/lifetxt/validator.py +609 -0
- lifetxt-1.0.1/lifetxt/vm.py +462 -0
- lifetxt-1.0.1/lifetxt/web_assets.html +572 -0
- lifetxt-1.0.1/lifetxt/web_assets.py +128 -0
- lifetxt-1.0.1/lifetxt/web_assets_css_01.css +532 -0
- lifetxt-1.0.1/lifetxt/web_assets_css_02.css +532 -0
- lifetxt-1.0.1/lifetxt/web_assets_css_03.css +532 -0
- lifetxt-1.0.1/lifetxt/web_assets_css_04.css +533 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_01.js +400 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_02.js +400 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_03.js +400 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_04.js +0 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_05.js +400 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_06.js +400 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_07.js +400 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_08.js +400 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_09.js +400 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_10.js +400 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_11.js +400 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_12.js +400 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_13.js +400 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_14.js +400 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_15.js +400 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_16.js +400 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_17.js +400 -0
- lifetxt-1.0.1/lifetxt/web_assets_js_18.js +23 -0
- lifetxt-1.0.1/lifetxt/web_read_service.py +156 -0
- lifetxt-1.0.1/lifetxt/web_routes_analytics.py +224 -0
- lifetxt-1.0.1/lifetxt/web_routes_git.py +140 -0
- lifetxt-1.0.1/lifetxt/webapp.py +2830 -0
- lifetxt-1.0.1/lifetxt/work_session.py +258 -0
- lifetxt-1.0.1/lifetxt/workspace.py +1020 -0
- lifetxt-1.0.1/lifetxt/workspace_diagnostics.py +618 -0
- lifetxt-1.0.1/lifetxt/write_operations.py +458 -0
- lifetxt-1.0.1/lifetxt.egg-info/PKG-INFO +526 -0
- lifetxt-1.0.1/lifetxt.egg-info/SOURCES.txt +338 -0
- lifetxt-1.0.1/lifetxt.egg-info/dependency_links.txt +1 -0
- lifetxt-1.0.1/lifetxt.egg-info/entry_points.txt +2 -0
- lifetxt-1.0.1/lifetxt.egg-info/requires.txt +20 -0
- lifetxt-1.0.1/lifetxt.egg-info/top_level.txt +1 -0
- lifetxt-1.0.1/pyproject.toml +68 -0
- lifetxt-1.0.1/readme.md +474 -0
- lifetxt-1.0.1/setup.cfg +4 -0
- lifetxt-1.0.1/tests/test_archive_cli.py +117 -0
- lifetxt-1.0.1/tests/test_archive_plan_v1.py +644 -0
- lifetxt-1.0.1/tests/test_attachment_packages_v5.py +167 -0
- lifetxt-1.0.1/tests/test_attachment_transactions_v4.py +162 -0
- lifetxt-1.0.1/tests/test_attachments.py +891 -0
- lifetxt-1.0.1/tests/test_backup_restore_v6.py +257 -0
- lifetxt-1.0.1/tests/test_brand_assets.py +203 -0
- lifetxt-1.0.1/tests/test_change_package_closeout.py +149 -0
- lifetxt-1.0.1/tests/test_check_release_policy_cli.py +51 -0
- lifetxt-1.0.1/tests/test_check_release_tag_version.py +75 -0
- lifetxt-1.0.1/tests/test_cli_timezone_context_v2.py +190 -0
- lifetxt-1.0.1/tests/test_clock_contract_v4.py +42 -0
- lifetxt-1.0.1/tests/test_clock_skew_v5.py +46 -0
- lifetxt-1.0.1/tests/test_completion_surfaces.py +489 -0
- lifetxt-1.0.1/tests/test_completion_values.py +185 -0
- lifetxt-1.0.1/tests/test_config_cli.py +268 -0
- lifetxt-1.0.1/tests/test_config_validation.py +758 -0
- lifetxt-1.0.1/tests/test_cui_extensions.py +2637 -0
- lifetxt-1.0.1/tests/test_delegated_mutation_v6.py +255 -0
- lifetxt-1.0.1/tests/test_diagnostic_contract.py +187 -0
- lifetxt-1.0.1/tests/test_docker_image.py +327 -0
- lifetxt-1.0.1/tests/test_doctor_cli_v2.py +267 -0
- lifetxt-1.0.1/tests/test_editor_safety_v5.py +102 -0
- lifetxt-1.0.1/tests/test_extended_workspace_resolution.py +225 -0
- lifetxt-1.0.1/tests/test_external_verification.py +1398 -0
- lifetxt-1.0.1/tests/test_extra_cli.py +378 -0
- lifetxt-1.0.1/tests/test_fault_drill_v5.py +33 -0
- lifetxt-1.0.1/tests/test_fault_matrix_v6.py +83 -0
- lifetxt-1.0.1/tests/test_fuzzy_search.py +168 -0
- lifetxt-1.0.1/tests/test_generate_conda_recipe.py +85 -0
- lifetxt-1.0.1/tests/test_generate_homebrew_formula.py +115 -0
- lifetxt-1.0.1/tests/test_generate_scoop_manifest.py +72 -0
- lifetxt-1.0.1/tests/test_generate_winget_manifest.py +110 -0
- lifetxt-1.0.1/tests/test_generated_record_capture_compat.py +308 -0
- lifetxt-1.0.1/tests/test_global_search.py +144 -0
- lifetxt-1.0.1/tests/test_inbox.py +347 -0
- lifetxt-1.0.1/tests/test_integrity.py +624 -0
- lifetxt-1.0.1/tests/test_life_hub.py +315 -0
- lifetxt-1.0.1/tests/test_lifetxt.py +11586 -0
- lifetxt-1.0.1/tests/test_links.py +679 -0
- lifetxt-1.0.1/tests/test_mcp_expansion.py +1518 -0
- lifetxt-1.0.1/tests/test_messaging_groups.py +132 -0
- lifetxt-1.0.1/tests/test_multi_file_write_guards.py +59 -0
- lifetxt-1.0.1/tests/test_multi_target_v2.py +224 -0
- lifetxt-1.0.1/tests/test_mutation.py +502 -0
- lifetxt-1.0.1/tests/test_nextaction.py +122 -0
- lifetxt-1.0.1/tests/test_p0_cli_v6.py +144 -0
- lifetxt-1.0.1/tests/test_parser_format_metadata.py +38 -0
- lifetxt-1.0.1/tests/test_paths.py +167 -0
- lifetxt-1.0.1/tests/test_people.py +106 -0
- lifetxt-1.0.1/tests/test_personal_context.py +141 -0
- lifetxt-1.0.1/tests/test_personal_context_cli.py +110 -0
- lifetxt-1.0.1/tests/test_personal_context_correction.py +85 -0
- lifetxt-1.0.1/tests/test_presence_mutation.py +69 -0
- lifetxt-1.0.1/tests/test_project_archive.py +186 -0
- lifetxt-1.0.1/tests/test_project_archive_safety_v3.py +264 -0
- lifetxt-1.0.1/tests/test_projects.py +160 -0
- lifetxt-1.0.1/tests/test_query.py +144 -0
- lifetxt-1.0.1/tests/test_randomized_roundtrip.py +57 -0
- lifetxt-1.0.1/tests/test_recovery_cli_v3.py +158 -0
- lifetxt-1.0.1/tests/test_recovery_doctor_v3.py +79 -0
- lifetxt-1.0.1/tests/test_recurrence.py +470 -0
- lifetxt-1.0.1/tests/test_recurrence_wkst.py +354 -0
- lifetxt-1.0.1/tests/test_release_policy.py +155 -0
- lifetxt-1.0.1/tests/test_remote_access_v19.py +82 -0
- lifetxt-1.0.1/tests/test_remote_access_v20.py +82 -0
- lifetxt-1.0.1/tests/test_remote_attachment_contracts_v6.py +296 -0
- lifetxt-1.0.1/tests/test_remote_backend_v20.py +663 -0
- lifetxt-1.0.1/tests/test_remote_client_v19.py +40 -0
- lifetxt-1.0.1/tests/test_remote_client_v20.py +97 -0
- lifetxt-1.0.1/tests/test_remote_client_writes_compat_v25.py +88 -0
- lifetxt-1.0.1/tests/test_remote_client_writes_v23.py +225 -0
- lifetxt-1.0.1/tests/test_remote_compatibility_v21.py +267 -0
- lifetxt-1.0.1/tests/test_remote_pagination.py +103 -0
- lifetxt-1.0.1/tests/test_remote_sessions_v20.py +182 -0
- lifetxt-1.0.1/tests/test_remote_ticket_capability_v26.py +30 -0
- lifetxt-1.0.1/tests/test_remote_ticket_write_core.py +164 -0
- lifetxt-1.0.1/tests/test_remote_ticket_writes_v22.py +517 -0
- lifetxt-1.0.1/tests/test_remote_tui_hardening_v27.py +89 -0
- lifetxt-1.0.1/tests/test_remote_web_v19.py +75 -0
- lifetxt-1.0.1/tests/test_remote_web_v20.py +287 -0
- lifetxt-1.0.1/tests/test_replace_retry_policy.py +86 -0
- lifetxt-1.0.1/tests/test_report_cli.py +222 -0
- lifetxt-1.0.1/tests/test_revision_migration_metrics.py +79 -0
- lifetxt-1.0.1/tests/test_revision_telemetry_relocation_v3.py +66 -0
- lifetxt-1.0.1/tests/test_revision_telemetry_v2.py +169 -0
- lifetxt-1.0.1/tests/test_roundtrip_golden.py +335 -0
- lifetxt-1.0.1/tests/test_safe_ops_concurrency.py +150 -0
- lifetxt-1.0.1/tests/test_safe_write_surfaces_v4.py +160 -0
- lifetxt-1.0.1/tests/test_safety_cli.py +235 -0
- lifetxt-1.0.1/tests/test_safety_foundation.py +367 -0
- lifetxt-1.0.1/tests/test_schema_extensions_v19.py +10 -0
- lifetxt-1.0.1/tests/test_schema_extensions_v2.py +143 -0
- lifetxt-1.0.1/tests/test_schema_extensions_v20.py +18 -0
- lifetxt-1.0.1/tests/test_schema_extensions_v22.py +19 -0
- lifetxt-1.0.1/tests/test_serve_cli.py +59 -0
- lifetxt-1.0.1/tests/test_server_init.py +390 -0
- lifetxt-1.0.1/tests/test_server_update.py +2029 -0
- lifetxt-1.0.1/tests/test_set_tauri_desktop_version.py +62 -0
- lifetxt-1.0.1/tests/test_shared_surface_mutation_routing.py +181 -0
- lifetxt-1.0.1/tests/test_shorthand.py +947 -0
- lifetxt-1.0.1/tests/test_stable_surface_schemas.py +137 -0
- lifetxt-1.0.1/tests/test_standalone_binary.py +212 -0
- lifetxt-1.0.1/tests/test_startup_preflight_v5.py +35 -0
- lifetxt-1.0.1/tests/test_supported_runtime.py +81 -0
- lifetxt-1.0.1/tests/test_surface_runtime.py +813 -0
- lifetxt-1.0.1/tests/test_temporal_cli.py +65 -0
- lifetxt-1.0.1/tests/test_temporal_context.py +167 -0
- lifetxt-1.0.1/tests/test_ticket_activity_clock.py +28 -0
- lifetxt-1.0.1/tests/test_ticket_creation_event.py +120 -0
- lifetxt-1.0.1/tests/test_ticket_custom_field_public_contract.py +51 -0
- lifetxt-1.0.1/tests/test_ticket_custom_fields.py +351 -0
- lifetxt-1.0.1/tests/test_ticket_planning.py +345 -0
- lifetxt-1.0.1/tests/test_ticket_project_surface_guards.py +37 -0
- lifetxt-1.0.1/tests/test_ticket_project_surfaces.py +204 -0
- lifetxt-1.0.1/tests/test_ticket_projects.py +309 -0
- lifetxt-1.0.1/tests/test_ticket_revision_bytes.py +44 -0
- lifetxt-1.0.1/tests/test_ticket_revision_writes.py +245 -0
- lifetxt-1.0.1/tests/test_ticket_workflow_history.py +469 -0
- lifetxt-1.0.1/tests/test_ticket_workflow_surfaces.py +167 -0
- lifetxt-1.0.1/tests/test_tickets.py +123 -0
- lifetxt-1.0.1/tests/test_timer_public_revisions_v3.py +207 -0
- lifetxt-1.0.1/tests/test_timezone_aware.py +169 -0
- lifetxt-1.0.1/tests/test_timezone_clock_v3.py +50 -0
- lifetxt-1.0.1/tests/test_timezone_policy_v2.py +240 -0
- lifetxt-1.0.1/tests/test_today_cli.py +60 -0
- lifetxt-1.0.1/tests/test_traceability_gate.py +517 -0
- lifetxt-1.0.1/tests/test_transaction_admin_v5.py +163 -0
- lifetxt-1.0.1/tests/test_transaction_journal_v3.py +929 -0
- lifetxt-1.0.1/tests/test_transaction_policy_v4.py +162 -0
- lifetxt-1.0.1/tests/test_user_text.py +141 -0
- lifetxt-1.0.1/tests/test_verification_python_bootstrap.py +355 -0
- lifetxt-1.0.1/tests/test_vm.py +356 -0
- lifetxt-1.0.1/tests/test_vm_cli.py +201 -0
- lifetxt-1.0.1/tests/test_web_assets.py +100 -0
- lifetxt-1.0.1/tests/test_web_commands.py +364 -0
- lifetxt-1.0.1/tests/test_web_i18n.py +286 -0
- lifetxt-1.0.1/tests/test_web_mobile.py +207 -0
- lifetxt-1.0.1/tests/test_web_routes_analytics.py +110 -0
- lifetxt-1.0.1/tests/test_web_routes_git.py +320 -0
- lifetxt-1.0.1/tests/test_work_session_v4.py +104 -0
- lifetxt-1.0.1/tests/test_workspace_diagnostics_v2.py +124 -0
- 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
|
+
```
|