taskledger 0.3.0__tar.gz → 0.4.0__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.
- {taskledger-0.3.0 → taskledger-0.4.0}/.taskledger.toml +3 -3
- {taskledger-0.3.0 → taskledger-0.4.0}/API.md +14 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/CHANGELOG.md +101 -0
- {taskledger-0.3.0/taskledger.egg-info → taskledger-0.4.0}/PKG-INFO +86 -20
- {taskledger-0.3.0 → taskledger-0.4.0}/README.md +84 -19
- {taskledger-0.3.0 → taskledger-0.4.0}/docs/api.rst +3 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/docs/command_contract.rst +89 -4
- {taskledger-0.3.0 → taskledger-0.4.0}/docs/index.rst +1 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/docs/public_surface.rst +9 -1
- taskledger-0.4.0/docs/sync.rst +166 -0
- taskledger-0.4.0/docs/transfer.rst +83 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/docs/usage.rst +53 -12
- {taskledger-0.3.0 → taskledger-0.4.0}/pyproject.toml +3 -3
- {taskledger-0.3.0 → taskledger-0.4.0}/skills/taskledger/SKILL.md +29 -15
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/_version.py +3 -3
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/__init__.py +1 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/plans.py +8 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/project.py +7 -0
- taskledger-0.4.0/taskledger/api/storage.py +44 -0
- taskledger-0.4.0/taskledger/api/sync.py +300 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli.py +157 -10
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_implement.py +5 -1
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_plan.py +84 -3
- taskledger-0.4.0/taskledger/cli_report.py +171 -0
- taskledger-0.4.0/taskledger/cli_storage.py +115 -0
- taskledger-0.4.0/taskledger/cli_sync.py +926 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/command_inventory.py +229 -0
- taskledger-0.4.0/taskledger/domain/check.py +111 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/models.py +1 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/run.py +3 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/exchange.py +415 -22
- taskledger-0.4.0/taskledger/services/check_tracking.py +126 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/dashboard.py +43 -5
- taskledger-0.4.0/taskledger/services/git_sync.py +1018 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/handoff.py +40 -5
- taskledger-0.4.0/taskledger/services/html_reports.py +331 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/implementation_flow.py +13 -7
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/navigation.py +12 -9
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/plan_materialization.py +4 -0
- taskledger-0.4.0/taskledger/services/plan_review.py +429 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/planning_flow.py +4 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/serve_read_model.py +4 -0
- taskledger-0.4.0/taskledger/services/storage_locations.py +482 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/task_reports.py +70 -2
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/tasks.py +12 -9
- taskledger-0.4.0/taskledger/services/web_dashboard.py +239 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/project_config.py +170 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/task_store.py +42 -0
- taskledger-0.4.0/taskledger/templates/__init__.py +1 -0
- taskledger-0.4.0/taskledger/templates/base.html +64 -0
- taskledger-0.4.0/taskledger/templates/error.html +6 -0
- taskledger-0.4.0/taskledger/templates/site_index.html +42 -0
- taskledger-0.4.0/taskledger/templates/task_report.html +218 -0
- {taskledger-0.3.0 → taskledger-0.4.0/taskledger.egg-info}/PKG-INFO +86 -20
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger.egg-info/SOURCES.txt +22 -3
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger.egg-info/requires.txt +1 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_cli_command_contract.py +19 -4
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_command_inventory.py +55 -11
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_docs_and_skill.py +19 -0
- taskledger-0.4.0/tests/test_html_reports.py +95 -0
- taskledger-0.4.0/tests/test_implementation_checks.py +349 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_no_log_feature.py +6 -0
- taskledger-0.4.0/tests/test_plan_review.py +267 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_plan_revision_workflow.py +6 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_project_root_config.py +48 -0
- taskledger-0.4.0/tests/test_serve_dashboard.py +188 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_service_boundaries.py +12 -9
- taskledger-0.4.0/tests/test_storage_sync.py +311 -0
- taskledger-0.4.0/tests/test_sync_git.py +372 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_task_report.py +78 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_taskledger_v2_cli.py +22 -3
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_taskledger_v2_exchange.py +549 -1
- taskledger-0.3.0/docs/transfer.rst +0 -49
- taskledger-0.3.0/taskledger/services/web_dashboard.py +0 -529
- taskledger-0.3.0/taskledger/web_assets/dashboard.css +0 -491
- taskledger-0.3.0/taskledger/web_assets/dashboard.js +0 -1407
- taskledger-0.3.0/tests/__init__.py +0 -0
- taskledger-0.3.0/tests/test_serve_dashboard.py +0 -626
- {taskledger-0.3.0 → taskledger-0.4.0}/.codecrate.toml +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/.github/workflows/codecov.yml +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/.github/workflows/pre-commit.yml +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/.github/workflows/python-publish.yml +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/.github/workflows/tests.yml +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/.gitignore +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/.pre-commit-config.yaml +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/.readthedocs.yaml +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/.ruff.toml +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/AGENTS.md +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/LICENSE +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/Makefile +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/docs/Makefile +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/docs/architecture_taskledger_split.rst +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/docs/build.sh +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/docs/conf.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/docs/full_task_cycle.rst +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/docs/multi_repo.rst +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/docs/requirements.txt +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/docs/service_boundary_whitelist.rst +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/setup.cfg +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/setup.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/__init__.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/__main__.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/handoff.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/introductions.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/locks.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/questions.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/releases.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/search.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/task_runs.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/tasks.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_actor.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_common.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_ledger.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_migrate.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_misc.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_question.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_release.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_task.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_validate.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/__init__.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/_model_utils.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/active_state.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/actor.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/change.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/event.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/handoff.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/lock.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/plan.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/policies.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/question.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/release.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/sidecars.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/states.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/task.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/errors.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/ids.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/launcher.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/py.typed +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/search.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/__init__.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/actors.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/agent_logging.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/agent_transcripts.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/change_tracking.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/command_runner.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/doctor.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/doctor_checks/migration_checks.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/doctor_checks/project_scan.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/doctor_checks/task_checks.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/handoff_lifecycle.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/next_action_model.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/phase5_lock_transfer.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/plan_editing.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/plan_hash.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/plan_lint.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/releases.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/run_store.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/task_archive.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/task_collections.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/task_lifecycle.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/task_queries.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/task_repair.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/tree.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/validation.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/validation_flow.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/workflow_guidance.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/__init__.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/agent_logs.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/atomic.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/common.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/events.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/frontmatter.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/indexes.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/init.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/ledger_config.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/locks.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/meta.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/migrations.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/paths.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/project_identity.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/repos.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/timeutils.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger.egg-info/dependency_links.txt +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger.egg-info/entry_points.txt +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/taskledger.egg-info/top_level.txt +0 -0
- {taskledger-0.3.0/taskledger/web_assets → taskledger-0.4.0/tests}/__init__.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/conftest.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/support/__init__.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/support/builders.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_active_task.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_actor_harness_state.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_agent_command_logging.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_agent_session_protocol.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_atomic_fast_io.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_cli_import_resilience.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_command_example_linter.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_compact_mutation_output.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_delta_remaining_contracts.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_doctor.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_domain_policies.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_events.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_handoff_lifecycle.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_help_subprocess.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_implementation_change_scan.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_json_contracts.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_legacy_cleanup_contracts.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_lifecycle_policies.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_locks_audit.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_models_v1_schema.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_next_action_expired_lock.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_plan_approval_contract.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_plan_lint.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_plan_todo_materialization.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_question_add_many.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_question_filter_answers.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_question_plan_regeneration.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_release_changelog.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_search.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_services_dashboard.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_sidecar_collections.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_storage_bundle_layout.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_storage_common.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_storage_init.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_storage_migration.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_storage_repos.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_task_archive.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_task_events.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_taskledger_branch_scoped_ledgers.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_taskledger_cli_api_parity.py +1 -1
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_tasks_service_static.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_todo_implementation_gate.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_tree_command.py +0 -0
- {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_workflow_guidance.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Project-local taskledger configuration.
|
|
2
2
|
# This file lives in the source project root.
|
|
3
3
|
config_version = 2
|
|
4
|
-
taskledger_dir = '
|
|
4
|
+
taskledger_dir = '../taskledger-state/taskledger'
|
|
5
5
|
|
|
6
6
|
# Stable project identity. Commit this with your source tree.
|
|
7
7
|
project_uuid = "081c7c05-2d10-42b7-9b37-3d814c2f400a"
|
|
@@ -9,7 +9,7 @@ project_uuid = "081c7c05-2d10-42b7-9b37-3d814c2f400a"
|
|
|
9
9
|
# Taskledger branch-scoped state. This block is intentionally safe to commit.
|
|
10
10
|
ledger_ref = "main"
|
|
11
11
|
ledger_parent_ref = ""
|
|
12
|
-
ledger_next_task_number =
|
|
12
|
+
ledger_next_task_number = 87
|
|
13
13
|
ledger_branch_guard = "off"
|
|
14
14
|
|
|
15
15
|
[prompt_profiles.planning]
|
|
@@ -27,4 +27,4 @@ required_question_topics = []
|
|
|
27
27
|
extra_guidance = ""
|
|
28
28
|
|
|
29
29
|
[agent_logging]
|
|
30
|
-
enabled =
|
|
30
|
+
enabled = false
|
|
@@ -12,6 +12,7 @@ This repository exposes a task-first public API. The supported modules are:
|
|
|
12
12
|
- `taskledger.api.locks`
|
|
13
13
|
- `taskledger.api.handoff`
|
|
14
14
|
- `taskledger.api.releases`
|
|
15
|
+
- `taskledger.api.storage`
|
|
15
16
|
- `taskledger.api.search`
|
|
16
17
|
|
|
17
18
|
## Import boundary
|
|
@@ -104,6 +105,9 @@ from taskledger.errors import (
|
|
|
104
105
|
- `propose_plan`
|
|
105
106
|
- `plan_template`
|
|
106
107
|
- `upsert_plan`
|
|
108
|
+
- `PlanReviewOptions`
|
|
109
|
+
- `build_plan_review_payload`
|
|
110
|
+
- `render_plan_review`
|
|
107
111
|
- `export_plan`
|
|
108
112
|
- `amend_plan`
|
|
109
113
|
- `regenerate_plan_from_answers`
|
|
@@ -230,6 +234,14 @@ record body and return compact metadata, including `context_hash` and
|
|
|
230
234
|
- `show_release`
|
|
231
235
|
- `tag_release`
|
|
232
236
|
|
|
237
|
+
### `taskledger.api.storage`
|
|
238
|
+
|
|
239
|
+
- `storage_where`
|
|
240
|
+
- `storage_move`
|
|
241
|
+
- `sync_preflight`
|
|
242
|
+
- `sync_status`
|
|
243
|
+
- `sync_commit`
|
|
244
|
+
|
|
233
245
|
### `taskledger.api.search`
|
|
234
246
|
|
|
235
247
|
- `search_workspace`
|
|
@@ -253,6 +265,8 @@ The public task-first CLI surface is organized around these command groups:
|
|
|
253
265
|
- `require`
|
|
254
266
|
- `release`
|
|
255
267
|
- `lock`
|
|
268
|
+
- `storage`
|
|
269
|
+
- `sync`
|
|
256
270
|
- `context`
|
|
257
271
|
- `handoff`
|
|
258
272
|
- `repair`
|
|
@@ -1,5 +1,106 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.4.0 - 2026-05-18
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Added storage sync documentation (`docs/sync.rst`) explaining how to keep taskledger state outside the source repo, sync across PCs with a private Git repo, bootstrap a second machine, follow a daily sync protocol, and avoid active multi-writer conflicts.
|
|
8
|
+
- Added `taskledger storage where` command reporting resolved project and storage location details in human and JSON output, including whether storage lives inside the workspace, is a Git repo, or has active locks.
|
|
9
|
+
- Added `taskledger storage move` for safely migrating storage to a new `taskledger_dir` with atomic config updates, unsafe-target refusal, and follow-up command hints.
|
|
10
|
+
- Added `taskledger sync preflight` read-only check combining doctor health, active-lock warnings, tracked in-repo state warnings, and local Git status.
|
|
11
|
+
- Added `taskledger sync status` and `taskledger sync commit` local Git helper commands for committing taskledger state without network operations.
|
|
12
|
+
- Added `taskledger sync export` and `taskledger sync import` as aliases for the existing archive transfer commands.
|
|
13
|
+
- Added `taskledger sync git` command group for live external-state synchronization: `init`, `status`, `commit`, `cd`, `import-local`, `export-local`, `pull`, `push`, `sync`, and `hooks` subcommands with conservative lock/dirty checks.
|
|
14
|
+
- Added project-scoped `sync git status` that separates current-project changes from outside-project changes in JSON payloads, safe with dirty sibling directories.
|
|
15
|
+
- Added `sync git cd` helper returning the configured sync repo path for shell use.
|
|
16
|
+
- Added `sync git commit` for committing only the configured project path while ignoring dirty sibling paths.
|
|
17
|
+
- Added `[sync.git]` project config section with strict validation and documented defaults.
|
|
18
|
+
- Added `taskledger/services/storage_locations.py` for storage reporting, migration, and sync helper services.
|
|
19
|
+
- Added `taskledger/services/git_sync.py` for git sync orchestration.
|
|
20
|
+
- Added `taskledger/cli_sync.py` as a dedicated sync CLI group.
|
|
21
|
+
- Added `taskledger/api/sync.py` with public sync API wrappers.
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
- Demoted whole-repo `sync git pull`, `push`, `sync`, and unsafe hook installation from recommended workflow to advanced/deprecated status in help, docs, and skill guidance.
|
|
26
|
+
- Reframed docs, README, and skill around the project-scoped local helper workflow: `sync git status`, `sync git commit`, then manual Git via `sync git cd`.
|
|
27
|
+
- Fixed stale config filename references so docs no longer claim init writes `.taskledger.toml` when `taskledger.toml` is canonical.
|
|
28
|
+
- Updated external storage examples to use the current `ledgers/<ledger_ref>/...` layout.
|
|
29
|
+
|
|
30
|
+
### Documentation
|
|
31
|
+
|
|
32
|
+
- Added `docs/sync.rst` with cross-PC sync workflow, daily protocol, and multi-writer conflict avoidance guidance.
|
|
33
|
+
- Updated README, `docs/usage.rst`, `docs/transfer.rst`, `docs/command_contract.rst`, `docs/public_surface.rst`, `API.md`, and `skills/taskledger/SKILL.md` for the new storage and sync command surface.
|
|
34
|
+
|
|
35
|
+
### Quality
|
|
36
|
+
|
|
37
|
+
- Added `tests/test_storage_sync.py` and `tests/test_sync_git.py` covering storage migration, sync commands, git sync workflows, shared dirty state, project-scoped commits, and JSON result kinds.
|
|
38
|
+
- Expanded command inventory, CLI contract, and docs/skill tests for the new command surface.
|
|
39
|
+
- Full suite: 897 tests passing, ruff and mypy clean.
|
|
40
|
+
|
|
41
|
+
## v0.3.1 - 2026-05-12
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
|
|
45
|
+
- Added task-scoped export/import with `--task` positional ref on export, safe ID remapping (`--id-policy preserve|renumber`), counter repair, and artifact path remapping on import. Full-ledger export remains the default; single-task archives filter task-scoped records and clear `active_task`.
|
|
46
|
+
- Added `taskledger plan review` command to show the current or specified plan version with structured JSON output and content rendering.
|
|
47
|
+
- Added `next-action` routing to recommend `plan review --version N` when a plan is awaiting approval.
|
|
48
|
+
|
|
49
|
+
### Documentation
|
|
50
|
+
|
|
51
|
+
- Updated README, command contract, and SKILL.md for task-scoped transfer workflow and `plan review` command.
|
|
52
|
+
|
|
53
|
+
### Quality
|
|
54
|
+
|
|
55
|
+
- Added regression coverage for task-scoped export/import ID mapping, conflict policy, counter repair, artifact remap, and plan review end-to-end.
|
|
56
|
+
- Full suite: 878 tests passing, ruff and mypy clean.
|
|
57
|
+
|
|
58
|
+
## v0.3.0 - 2026-05-05
|
|
59
|
+
|
|
60
|
+
### Added
|
|
61
|
+
|
|
62
|
+
- Added agent command transcript logging: opt-in config, append-only NDJSON storage, CLI stdout/stderr tee capture, managed-shell capture, `task transcript` command, and `task report --include command-log` section. Export/import preserves transcript archives.
|
|
63
|
+
- Added planning guidance profiles: `plan guidance` command, `--include-guidance` plan template injection, and `prompt_profiles.planning` config with advisory required-fields rendering.
|
|
64
|
+
- Added transcript review mode as the default `task transcript` output, with `--raw` flag for the original table view, duplicate log ID warnings, and logical-row grouping for wrapper/managed-shell pairs.
|
|
65
|
+
- Added enriched command metadata: tier, deprecated, replaced_by, ledger_effect, workspace_effect, external_effect, and agent_safe fields on CommandSpec. Added `--tier` and `--include-deprecated` CLI filters. Deprecated `lock break` in favor of `repair lock`.
|
|
66
|
+
- Added first-class expired-lock resume path: `implement resume --repair-expired-lock` releases expired implementation locks with audit trail, and `next-action` emits `expired-lock-resume` when applicable.
|
|
67
|
+
- Added task-resource positional refs for read-only commands (`task show`, `task view`, etc.) with explicit `--task` required for destructive commands (`task cancel`, `task uncancel`, `task edit`).
|
|
68
|
+
- Added JSON usage-error envelopes for workflow positional-ref rejection and CLI parse errors.
|
|
69
|
+
- Added soft task archive: `task archive`/`task unarchive` commands, archived-task visibility filtering across list/tree/status, and slug reuse semantics.
|
|
70
|
+
- Added export/import project metadata guard, dry-run safety, and include-flag controls.
|
|
71
|
+
- Added plan revision workflow: `plan export`, `plan amend`, and `--auto-revise` with safe plan input path guard and plan.amended audit events.
|
|
72
|
+
- Added plan approval provenance: approval_source and approved_plan_hash stored on acceptance, with hash-mismatch warnings in reports.
|
|
73
|
+
- Added implement finish warning for missing git change scans.
|
|
74
|
+
|
|
75
|
+
### Changed
|
|
76
|
+
|
|
77
|
+
- Split run/lock helpers into `services/run_store.py` from the tasks.py monolith; `tasks.py` re-exports for backward compatibility.
|
|
78
|
+
- Wrapper commands now mirror inner exit status by default instead of always succeeding.
|
|
79
|
+
- Planning guidance recommendation is now integrated into `plan start` and `next-action` with a one-time viewed marker.
|
|
80
|
+
- Plan lint human output now renders summary and issue details instead of bare pass/fail.
|
|
81
|
+
- Question `answer-many` now validates repeat inputs, aliases, and provenance.
|
|
82
|
+
- Doctor mismatch guidance and verbose output improved with actionable repair hints.
|
|
83
|
+
|
|
84
|
+
### Fixed
|
|
85
|
+
|
|
86
|
+
- Fixed task report Plans section so non-accepted plans show reviewable details instead of being omitted.
|
|
87
|
+
- Fixed pre-commit `--all-files` regressions across test files.
|
|
88
|
+
|
|
89
|
+
### Documentation
|
|
90
|
+
|
|
91
|
+
- Documented planning guidance profiles in README, usage, command contract, API, and skill.
|
|
92
|
+
- Documented transcript logging, managed command capture, and review mode in usage and skill.
|
|
93
|
+
- Documented expired-lock-resume path and `--repair-expired-lock` in SKILL.md.
|
|
94
|
+
- Documented command-surface safety guidance, task-resource positional refs, and destructive-target rules in SKILL.md and command contract.
|
|
95
|
+
- Documented plan revision workflow commands and safety semantics in SKILL.md and command examples.
|
|
96
|
+
- Updated failure-review remediation hints for known mistakes in docs and skill.
|
|
97
|
+
|
|
98
|
+
### Quality
|
|
99
|
+
|
|
100
|
+
- Added regression test modules for agent command logging, expired-lock resume, task archive, and plan revision workflow.
|
|
101
|
+
- Expanded command inventory, CLI contract, JSON contract, and docs/skill tests for metadata enrichment, deprecation, targeting, and envelope behavior.
|
|
102
|
+
- Full suite: 770+ tests passing, ruff and mypy clean.
|
|
103
|
+
|
|
3
104
|
## v0.2.0 - 2026-05-03
|
|
4
105
|
|
|
5
106
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: taskledger
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: Durable project-state storage and CLI for coding workflows
|
|
5
5
|
Author: Taskledger Contributors
|
|
6
6
|
Maintainer: Holger Nahrstaedt
|
|
@@ -28,6 +28,7 @@ Description-Content-Type: text/markdown
|
|
|
28
28
|
License-File: LICENSE
|
|
29
29
|
Requires-Dist: typer
|
|
30
30
|
Requires-Dist: PyYAML
|
|
31
|
+
Requires-Dist: Jinja2>=3.1
|
|
31
32
|
Requires-Dist: tomli; python_version < "3.11"
|
|
32
33
|
Provides-Extra: dev
|
|
33
34
|
Requires-Dist: build; extra == "dev"
|
|
@@ -72,7 +73,7 @@ The supported command surface is organized as:
|
|
|
72
73
|
|
|
73
74
|
**Operations:**
|
|
74
75
|
|
|
75
|
-
- `context`, `next-action`, `can`, `search`, `grep`, `symbols`, `deps`, `actor`, `view`, `serve`
|
|
76
|
+
- `context`, `next-action`, `can`, `search`, `grep`, `symbols`, `deps`, `actor`, `view`, `serve`, `storage`, `sync`
|
|
76
77
|
|
|
77
78
|
**Repair and inspection:**
|
|
78
79
|
|
|
@@ -164,6 +165,7 @@ taskledger question answer-many --text $'q-0001: Yes.\nq-0002: No.'
|
|
|
164
165
|
taskledger question status
|
|
165
166
|
taskledger plan template --from-answers --file ./plan.md
|
|
166
167
|
taskledger plan upsert --from-answers --file ./plan.md
|
|
168
|
+
taskledger plan review --version 1
|
|
167
169
|
taskledger plan lint --version 1
|
|
168
170
|
taskledger plan accept --version 1 --note "Ready."
|
|
169
171
|
|
|
@@ -320,16 +322,18 @@ Rules for agents:
|
|
|
320
322
|
|
|
321
323
|
## Human monitoring UI
|
|
322
324
|
|
|
323
|
-
`taskledger serve` starts a read-only local dashboard for
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
The MVP still binds to localhost only, refreshes with read-only JSON polling,
|
|
327
|
-
and exposes no browser mutation endpoints.
|
|
325
|
+
`taskledger serve` starts a read-only local server-rendered HTML dashboard for
|
|
326
|
+
human monitoring. It emphasizes the active task, next action, progress, and
|
|
327
|
+
task browsing while staying local-only and read-only.
|
|
328
328
|
|
|
329
329
|
```bash
|
|
330
|
-
taskledger
|
|
330
|
+
taskledger report html task-0040 --output task-0040.html
|
|
331
|
+
taskledger report html --active --output active-task.html
|
|
332
|
+
taskledger report site --output .taskledger-report/
|
|
333
|
+
|
|
334
|
+
taskledger serve --refresh-seconds 2
|
|
331
335
|
taskledger serve --open
|
|
332
|
-
taskledger serve --task
|
|
336
|
+
taskledger serve --task task-0040 --refresh-seconds 2
|
|
333
337
|
```
|
|
334
338
|
|
|
335
339
|
Agents should keep using `taskledger next-action`, `taskledger todo next`, and
|
|
@@ -340,12 +344,13 @@ fresh-context transfer.
|
|
|
340
344
|
## Storage layout
|
|
341
345
|
|
|
342
346
|
`taskledger` keeps project-local configuration in the workspace root and durable
|
|
343
|
-
records under the configured storage root. The checked-in
|
|
344
|
-
stores
|
|
345
|
-
state remains ignored under
|
|
347
|
+
records under the configured storage root. The checked-in `taskledger.toml`
|
|
348
|
+
stores project identity plus the current branch-scoped ledger pointer and next
|
|
349
|
+
task number. Operational task state remains ignored under
|
|
350
|
+
`.taskledger/ledgers/<ledger_ref>/`:
|
|
346
351
|
|
|
347
352
|
```text
|
|
348
|
-
|
|
353
|
+
taskledger.toml
|
|
349
354
|
.taskledger/
|
|
350
355
|
storage.yaml
|
|
351
356
|
ledgers/
|
|
@@ -363,7 +368,7 @@ optional derived caches or registries and are not required for task correctness.
|
|
|
363
368
|
|
|
364
369
|
### Branch-scoped ledgers
|
|
365
370
|
|
|
366
|
-
`.taskledger/` stays ignored and local.
|
|
371
|
+
`.taskledger/` stays ignored and local. `taskledger.toml` is safe to commit and
|
|
367
372
|
contains the current `ledger_ref`, optional parent ref, and the next logical task
|
|
368
373
|
number for the checked-out source branch.
|
|
369
374
|
|
|
@@ -373,10 +378,10 @@ the Git branch:
|
|
|
373
378
|
```bash
|
|
374
379
|
git checkout -b feature-a
|
|
375
380
|
taskledger ledger fork feature-a
|
|
376
|
-
git add
|
|
381
|
+
git add taskledger.toml
|
|
377
382
|
```
|
|
378
383
|
|
|
379
|
-
Returning to a branch whose
|
|
384
|
+
Returning to a branch whose `taskledger.toml` points back to `main` hides the
|
|
380
385
|
feature branch's active task and task list. Two ledgers may both contain a logical
|
|
381
386
|
`task-0030`; this is expected because task IDs are scoped by `ledger_ref`. Use
|
|
382
387
|
`taskledger ledger adopt --from REF TASK_REF` when branch-local task history
|
|
@@ -391,15 +396,56 @@ taskledger init --taskledger-dir /mnt/cloud/taskledger/project-a
|
|
|
391
396
|
```text
|
|
392
397
|
/home/me/src/project-a/taskledger.toml
|
|
393
398
|
/mnt/cloud/taskledger/project-a/storage.yaml
|
|
394
|
-
/mnt/cloud/taskledger/project-a/releases/
|
|
395
|
-
/mnt/cloud/taskledger/project-a/tasks/
|
|
396
|
-
/mnt/cloud/taskledger/project-a/events/
|
|
397
|
-
/mnt/cloud/taskledger/project-a/indexes/
|
|
399
|
+
/mnt/cloud/taskledger/project-a/ledgers/main/releases/
|
|
400
|
+
/mnt/cloud/taskledger/project-a/ledgers/main/tasks/
|
|
401
|
+
/mnt/cloud/taskledger/project-a/ledgers/main/events/
|
|
402
|
+
/mnt/cloud/taskledger/project-a/ledgers/main/indexes/
|
|
398
403
|
```
|
|
399
404
|
|
|
400
405
|
Use one `taskledger_dir` per source project. Do not share one storage directory
|
|
401
406
|
across unrelated repositories.
|
|
402
407
|
|
|
408
|
+
### Sync across PCs without committing `.taskledger/`
|
|
409
|
+
|
|
410
|
+
Use a sibling private Git repository for the external storage root instead of
|
|
411
|
+
committing `.taskledger/` into the source repository:
|
|
412
|
+
|
|
413
|
+
```toml
|
|
414
|
+
# /home/me/src/project-a/taskledger.toml
|
|
415
|
+
taskledger_dir = "../taskledger-state/project-a"
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
```text
|
|
419
|
+
/home/me/src/project-a/ # source repo
|
|
420
|
+
/home/me/src/taskledger-state/ # private state repo
|
|
421
|
+
/home/me/src/taskledger-state/project-a/ # taskledger_dir
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
Keep one active writer at a time. Before starting on a PC, pull the private
|
|
425
|
+
state repo, then run `taskledger doctor` and `taskledger next-action`. After
|
|
426
|
+
stopping at a clean lifecycle boundary, commit and push the state repo. If work
|
|
427
|
+
must move mid-run, prefer `taskledger export TASK_REF` / `taskledger import ARCHIVE` because imported runtime locks are quarantined by default.
|
|
428
|
+
|
|
429
|
+
Helpful local commands:
|
|
430
|
+
|
|
431
|
+
```bash
|
|
432
|
+
taskledger storage where
|
|
433
|
+
taskledger sync preflight
|
|
434
|
+
taskledger sync status
|
|
435
|
+
taskledger sync commit --message "Sync project-a taskledger state"
|
|
436
|
+
taskledger sync export --output ./taskledger-transfer.tar.gz
|
|
437
|
+
taskledger sync import ./taskledger-transfer.tar.gz --dry-run
|
|
438
|
+
taskledger sync git init --repo ../taskledger-state --project-path project-a
|
|
439
|
+
taskledger sync git status
|
|
440
|
+
taskledger sync git commit --message "Sync project-a taskledger state"
|
|
441
|
+
cd "$(taskledger sync git cd)"
|
|
442
|
+
git pull --ff-only
|
|
443
|
+
git push
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
See `docs/sync.rst` for the full second-PC bootstrap, daily sync protocol, and
|
|
447
|
+
Syncthing/rclone caveats.
|
|
448
|
+
|
|
403
449
|
## JSON output
|
|
404
450
|
|
|
405
451
|
Use `--json` for machine-readable payloads:
|
|
@@ -450,6 +496,7 @@ taskledger context --for implementation --format markdown
|
|
|
450
496
|
taskledger context --for validation --format json
|
|
451
497
|
taskledger task dossier --format markdown
|
|
452
498
|
taskledger task report --task task-0030 -o task30.md
|
|
499
|
+
taskledger report html task-0030 --output task30.html
|
|
453
500
|
taskledger handoff create --mode implementation --intended-actor agent --intended-harness codex
|
|
454
501
|
taskledger handoff claim handoff-0001
|
|
455
502
|
taskledger handoff close handoff-0001 --reason "Implementation started."
|
|
@@ -512,7 +559,10 @@ for task-first handoff guidance.
|
|
|
512
559
|
```bash
|
|
513
560
|
taskledger init --project-name "Taskledger"
|
|
514
561
|
taskledger export
|
|
562
|
+
taskledger export --task task-0040
|
|
563
|
+
taskledger export task-0040
|
|
515
564
|
taskledger import ./taskledger-transfer.tar.gz --dry-run
|
|
565
|
+
taskledger import ./taskledger-task-planledger-main-task-0040-20260509T101500Z.tar.gz
|
|
516
566
|
taskledger import ./taskledger-transfer.tar.gz --replace
|
|
517
567
|
taskledger snapshot ./artifacts
|
|
518
568
|
```
|
|
@@ -521,6 +571,7 @@ Default export filenames use this policy:
|
|
|
521
571
|
|
|
522
572
|
```text
|
|
523
573
|
taskledger-export-{project_slug}-{ledger_ref}-{timestamp}.tar.gz
|
|
574
|
+
taskledger-task-{project_slug}-{ledger_ref}-{task_id}-{timestamp}.tar.gz
|
|
524
575
|
```
|
|
525
576
|
|
|
526
577
|
`project_slug` is derived from `project_name` in `taskledger.toml`. If
|
|
@@ -543,6 +594,21 @@ taskledger implement resume --reason "Continue imported implementation."
|
|
|
543
594
|
|
|
544
595
|
Use `--lock-policy keep` only for diagnostic full-fidelity lock restoration.
|
|
545
596
|
|
|
597
|
+
Single-task transfer from a config-only checkout:
|
|
598
|
+
|
|
599
|
+
```bash
|
|
600
|
+
# fresh checkout on another PC
|
|
601
|
+
taskledger init
|
|
602
|
+
taskledger task create "Fix import edge case" --slug fix-import-edge-case --description "..."
|
|
603
|
+
# ... normal plan / implementation / validation lifecycle ...
|
|
604
|
+
taskledger export task-0040
|
|
605
|
+
|
|
606
|
+
# main dev repo
|
|
607
|
+
taskledger import ./taskledger-task-planledger-main-task-0040-20260509T101500Z.tar.gz
|
|
608
|
+
taskledger task list
|
|
609
|
+
taskledger task show task-0040
|
|
610
|
+
```
|
|
611
|
+
|
|
546
612
|
## Skill packaging
|
|
547
613
|
|
|
548
614
|
Agent workflows work best when the `taskledger` skill is installed in the
|
|
@@ -29,7 +29,7 @@ The supported command surface is organized as:
|
|
|
29
29
|
|
|
30
30
|
**Operations:**
|
|
31
31
|
|
|
32
|
-
- `context`, `next-action`, `can`, `search`, `grep`, `symbols`, `deps`, `actor`, `view`, `serve`
|
|
32
|
+
- `context`, `next-action`, `can`, `search`, `grep`, `symbols`, `deps`, `actor`, `view`, `serve`, `storage`, `sync`
|
|
33
33
|
|
|
34
34
|
**Repair and inspection:**
|
|
35
35
|
|
|
@@ -121,6 +121,7 @@ taskledger question answer-many --text $'q-0001: Yes.\nq-0002: No.'
|
|
|
121
121
|
taskledger question status
|
|
122
122
|
taskledger plan template --from-answers --file ./plan.md
|
|
123
123
|
taskledger plan upsert --from-answers --file ./plan.md
|
|
124
|
+
taskledger plan review --version 1
|
|
124
125
|
taskledger plan lint --version 1
|
|
125
126
|
taskledger plan accept --version 1 --note "Ready."
|
|
126
127
|
|
|
@@ -277,16 +278,18 @@ Rules for agents:
|
|
|
277
278
|
|
|
278
279
|
## Human monitoring UI
|
|
279
280
|
|
|
280
|
-
`taskledger serve` starts a read-only local dashboard for
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
The MVP still binds to localhost only, refreshes with read-only JSON polling,
|
|
284
|
-
and exposes no browser mutation endpoints.
|
|
281
|
+
`taskledger serve` starts a read-only local server-rendered HTML dashboard for
|
|
282
|
+
human monitoring. It emphasizes the active task, next action, progress, and
|
|
283
|
+
task browsing while staying local-only and read-only.
|
|
285
284
|
|
|
286
285
|
```bash
|
|
287
|
-
taskledger
|
|
286
|
+
taskledger report html task-0040 --output task-0040.html
|
|
287
|
+
taskledger report html --active --output active-task.html
|
|
288
|
+
taskledger report site --output .taskledger-report/
|
|
289
|
+
|
|
290
|
+
taskledger serve --refresh-seconds 2
|
|
288
291
|
taskledger serve --open
|
|
289
|
-
taskledger serve --task
|
|
292
|
+
taskledger serve --task task-0040 --refresh-seconds 2
|
|
290
293
|
```
|
|
291
294
|
|
|
292
295
|
Agents should keep using `taskledger next-action`, `taskledger todo next`, and
|
|
@@ -297,12 +300,13 @@ fresh-context transfer.
|
|
|
297
300
|
## Storage layout
|
|
298
301
|
|
|
299
302
|
`taskledger` keeps project-local configuration in the workspace root and durable
|
|
300
|
-
records under the configured storage root. The checked-in
|
|
301
|
-
stores
|
|
302
|
-
state remains ignored under
|
|
303
|
+
records under the configured storage root. The checked-in `taskledger.toml`
|
|
304
|
+
stores project identity plus the current branch-scoped ledger pointer and next
|
|
305
|
+
task number. Operational task state remains ignored under
|
|
306
|
+
`.taskledger/ledgers/<ledger_ref>/`:
|
|
303
307
|
|
|
304
308
|
```text
|
|
305
|
-
|
|
309
|
+
taskledger.toml
|
|
306
310
|
.taskledger/
|
|
307
311
|
storage.yaml
|
|
308
312
|
ledgers/
|
|
@@ -320,7 +324,7 @@ optional derived caches or registries and are not required for task correctness.
|
|
|
320
324
|
|
|
321
325
|
### Branch-scoped ledgers
|
|
322
326
|
|
|
323
|
-
`.taskledger/` stays ignored and local.
|
|
327
|
+
`.taskledger/` stays ignored and local. `taskledger.toml` is safe to commit and
|
|
324
328
|
contains the current `ledger_ref`, optional parent ref, and the next logical task
|
|
325
329
|
number for the checked-out source branch.
|
|
326
330
|
|
|
@@ -330,10 +334,10 @@ the Git branch:
|
|
|
330
334
|
```bash
|
|
331
335
|
git checkout -b feature-a
|
|
332
336
|
taskledger ledger fork feature-a
|
|
333
|
-
git add
|
|
337
|
+
git add taskledger.toml
|
|
334
338
|
```
|
|
335
339
|
|
|
336
|
-
Returning to a branch whose
|
|
340
|
+
Returning to a branch whose `taskledger.toml` points back to `main` hides the
|
|
337
341
|
feature branch's active task and task list. Two ledgers may both contain a logical
|
|
338
342
|
`task-0030`; this is expected because task IDs are scoped by `ledger_ref`. Use
|
|
339
343
|
`taskledger ledger adopt --from REF TASK_REF` when branch-local task history
|
|
@@ -348,15 +352,56 @@ taskledger init --taskledger-dir /mnt/cloud/taskledger/project-a
|
|
|
348
352
|
```text
|
|
349
353
|
/home/me/src/project-a/taskledger.toml
|
|
350
354
|
/mnt/cloud/taskledger/project-a/storage.yaml
|
|
351
|
-
/mnt/cloud/taskledger/project-a/releases/
|
|
352
|
-
/mnt/cloud/taskledger/project-a/tasks/
|
|
353
|
-
/mnt/cloud/taskledger/project-a/events/
|
|
354
|
-
/mnt/cloud/taskledger/project-a/indexes/
|
|
355
|
+
/mnt/cloud/taskledger/project-a/ledgers/main/releases/
|
|
356
|
+
/mnt/cloud/taskledger/project-a/ledgers/main/tasks/
|
|
357
|
+
/mnt/cloud/taskledger/project-a/ledgers/main/events/
|
|
358
|
+
/mnt/cloud/taskledger/project-a/ledgers/main/indexes/
|
|
355
359
|
```
|
|
356
360
|
|
|
357
361
|
Use one `taskledger_dir` per source project. Do not share one storage directory
|
|
358
362
|
across unrelated repositories.
|
|
359
363
|
|
|
364
|
+
### Sync across PCs without committing `.taskledger/`
|
|
365
|
+
|
|
366
|
+
Use a sibling private Git repository for the external storage root instead of
|
|
367
|
+
committing `.taskledger/` into the source repository:
|
|
368
|
+
|
|
369
|
+
```toml
|
|
370
|
+
# /home/me/src/project-a/taskledger.toml
|
|
371
|
+
taskledger_dir = "../taskledger-state/project-a"
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
```text
|
|
375
|
+
/home/me/src/project-a/ # source repo
|
|
376
|
+
/home/me/src/taskledger-state/ # private state repo
|
|
377
|
+
/home/me/src/taskledger-state/project-a/ # taskledger_dir
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
Keep one active writer at a time. Before starting on a PC, pull the private
|
|
381
|
+
state repo, then run `taskledger doctor` and `taskledger next-action`. After
|
|
382
|
+
stopping at a clean lifecycle boundary, commit and push the state repo. If work
|
|
383
|
+
must move mid-run, prefer `taskledger export TASK_REF` / `taskledger import ARCHIVE` because imported runtime locks are quarantined by default.
|
|
384
|
+
|
|
385
|
+
Helpful local commands:
|
|
386
|
+
|
|
387
|
+
```bash
|
|
388
|
+
taskledger storage where
|
|
389
|
+
taskledger sync preflight
|
|
390
|
+
taskledger sync status
|
|
391
|
+
taskledger sync commit --message "Sync project-a taskledger state"
|
|
392
|
+
taskledger sync export --output ./taskledger-transfer.tar.gz
|
|
393
|
+
taskledger sync import ./taskledger-transfer.tar.gz --dry-run
|
|
394
|
+
taskledger sync git init --repo ../taskledger-state --project-path project-a
|
|
395
|
+
taskledger sync git status
|
|
396
|
+
taskledger sync git commit --message "Sync project-a taskledger state"
|
|
397
|
+
cd "$(taskledger sync git cd)"
|
|
398
|
+
git pull --ff-only
|
|
399
|
+
git push
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
See `docs/sync.rst` for the full second-PC bootstrap, daily sync protocol, and
|
|
403
|
+
Syncthing/rclone caveats.
|
|
404
|
+
|
|
360
405
|
## JSON output
|
|
361
406
|
|
|
362
407
|
Use `--json` for machine-readable payloads:
|
|
@@ -407,6 +452,7 @@ taskledger context --for implementation --format markdown
|
|
|
407
452
|
taskledger context --for validation --format json
|
|
408
453
|
taskledger task dossier --format markdown
|
|
409
454
|
taskledger task report --task task-0030 -o task30.md
|
|
455
|
+
taskledger report html task-0030 --output task30.html
|
|
410
456
|
taskledger handoff create --mode implementation --intended-actor agent --intended-harness codex
|
|
411
457
|
taskledger handoff claim handoff-0001
|
|
412
458
|
taskledger handoff close handoff-0001 --reason "Implementation started."
|
|
@@ -469,7 +515,10 @@ for task-first handoff guidance.
|
|
|
469
515
|
```bash
|
|
470
516
|
taskledger init --project-name "Taskledger"
|
|
471
517
|
taskledger export
|
|
518
|
+
taskledger export --task task-0040
|
|
519
|
+
taskledger export task-0040
|
|
472
520
|
taskledger import ./taskledger-transfer.tar.gz --dry-run
|
|
521
|
+
taskledger import ./taskledger-task-planledger-main-task-0040-20260509T101500Z.tar.gz
|
|
473
522
|
taskledger import ./taskledger-transfer.tar.gz --replace
|
|
474
523
|
taskledger snapshot ./artifacts
|
|
475
524
|
```
|
|
@@ -478,6 +527,7 @@ Default export filenames use this policy:
|
|
|
478
527
|
|
|
479
528
|
```text
|
|
480
529
|
taskledger-export-{project_slug}-{ledger_ref}-{timestamp}.tar.gz
|
|
530
|
+
taskledger-task-{project_slug}-{ledger_ref}-{task_id}-{timestamp}.tar.gz
|
|
481
531
|
```
|
|
482
532
|
|
|
483
533
|
`project_slug` is derived from `project_name` in `taskledger.toml`. If
|
|
@@ -500,6 +550,21 @@ taskledger implement resume --reason "Continue imported implementation."
|
|
|
500
550
|
|
|
501
551
|
Use `--lock-policy keep` only for diagnostic full-fidelity lock restoration.
|
|
502
552
|
|
|
553
|
+
Single-task transfer from a config-only checkout:
|
|
554
|
+
|
|
555
|
+
```bash
|
|
556
|
+
# fresh checkout on another PC
|
|
557
|
+
taskledger init
|
|
558
|
+
taskledger task create "Fix import edge case" --slug fix-import-edge-case --description "..."
|
|
559
|
+
# ... normal plan / implementation / validation lifecycle ...
|
|
560
|
+
taskledger export task-0040
|
|
561
|
+
|
|
562
|
+
# main dev repo
|
|
563
|
+
taskledger import ./taskledger-task-planledger-main-task-0040-20260509T101500Z.tar.gz
|
|
564
|
+
taskledger task list
|
|
565
|
+
taskledger task show task-0040
|
|
566
|
+
```
|
|
567
|
+
|
|
503
568
|
## Skill packaging
|
|
504
569
|
|
|
505
570
|
Agent workflows work best when the `taskledger` skill is installed in the
|