taskledger 0.2.0__tar.gz → 0.3.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.2.0 → taskledger-0.3.0}/.codecrate.toml +1 -1
- {taskledger-0.2.0 → taskledger-0.3.0}/.pre-commit-config.yaml +0 -8
- taskledger-0.3.0/.taskledger.toml +30 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/API.md +19 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/CHANGELOG.md +35 -0
- {taskledger-0.2.0/taskledger.egg-info → taskledger-0.3.0}/PKG-INFO +88 -2
- {taskledger-0.2.0 → taskledger-0.3.0}/README.md +87 -1
- {taskledger-0.2.0 → taskledger-0.3.0}/docs/api.rst +17 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/docs/command_contract.rst +116 -4
- {taskledger-0.2.0 → taskledger-0.3.0}/docs/full_task_cycle.rst +8 -5
- {taskledger-0.2.0 → taskledger-0.3.0}/docs/index.rst +1 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/docs/public_surface.rst +6 -0
- taskledger-0.3.0/docs/transfer.rst +49 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/docs/usage.rst +138 -5
- {taskledger-0.2.0 → taskledger-0.3.0}/pyproject.toml +2 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/skills/taskledger/SKILL.md +78 -25
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/_version.py +3 -3
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/api/plans.py +19 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/api/project.py +41 -2
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/api/tasks.py +6 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/cli.py +474 -11
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/cli_common.py +178 -4
- taskledger-0.3.0/taskledger/cli_implement.py +507 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/cli_misc.py +61 -5
- taskledger-0.3.0/taskledger/cli_plan.py +711 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/cli_question.py +128 -15
- taskledger-0.3.0/taskledger/cli_task.py +886 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/cli_validate.py +5 -0
- taskledger-0.3.0/taskledger/command_inventory.py +1176 -0
- taskledger-0.3.0/taskledger/domain/_model_utils.py +164 -0
- taskledger-0.3.0/taskledger/domain/active_state.py +144 -0
- taskledger-0.3.0/taskledger/domain/actor.py +119 -0
- taskledger-0.3.0/taskledger/domain/change.py +241 -0
- taskledger-0.3.0/taskledger/domain/event.py +69 -0
- taskledger-0.3.0/taskledger/domain/handoff.py +168 -0
- taskledger-0.3.0/taskledger/domain/lock.py +128 -0
- taskledger-0.3.0/taskledger/domain/models.py +69 -0
- taskledger-0.3.0/taskledger/domain/plan.py +146 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/domain/policies.py +28 -0
- taskledger-0.3.0/taskledger/domain/question.py +103 -0
- taskledger-0.3.0/taskledger/domain/release.py +65 -0
- taskledger-0.3.0/taskledger/domain/run.py +142 -0
- taskledger-0.3.0/taskledger/domain/sidecars.py +468 -0
- taskledger-0.3.0/taskledger/domain/task.py +255 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/exchange.py +234 -17
- taskledger-0.3.0/taskledger/services/agent_logging.py +620 -0
- taskledger-0.3.0/taskledger/services/agent_transcripts.py +540 -0
- taskledger-0.3.0/taskledger/services/change_tracking.py +251 -0
- taskledger-0.3.0/taskledger/services/doctor.py +309 -0
- taskledger-0.3.0/taskledger/services/doctor_checks/migration_checks.py +64 -0
- taskledger-0.3.0/taskledger/services/doctor_checks/project_scan.py +122 -0
- taskledger-0.3.0/taskledger/services/doctor_checks/task_checks.py +408 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/handoff.py +25 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/implementation_flow.py +83 -6
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/navigation.py +269 -124
- taskledger-0.3.0/taskledger/services/next_action_model.py +140 -0
- taskledger-0.3.0/taskledger/services/plan_editing.py +114 -0
- taskledger-0.3.0/taskledger/services/plan_hash.py +23 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/plan_lint.py +12 -12
- taskledger-0.3.0/taskledger/services/plan_materialization.py +305 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/planning_flow.py +205 -7
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/releases.py +2 -0
- taskledger-0.3.0/taskledger/services/run_store.py +149 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/serve_read_model.py +9 -47
- taskledger-0.3.0/taskledger/services/task_archive.py +205 -0
- taskledger-0.3.0/taskledger/services/task_collections.py +498 -0
- taskledger-0.3.0/taskledger/services/task_lifecycle.py +940 -0
- taskledger-0.3.0/taskledger/services/task_repair.py +246 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/task_reports.py +193 -4
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/tasks.py +430 -1927
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/tree.py +18 -3
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/validation_flow.py +3 -0
- taskledger-0.3.0/taskledger/services/web_dashboard.py +529 -0
- taskledger-0.3.0/taskledger/services/workflow_guidance.py +162 -0
- taskledger-0.3.0/taskledger/storage/agent_logs.py +151 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/storage/init.py +3 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/storage/project_config.py +417 -7
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/storage/project_identity.py +57 -1
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/storage/task_store.py +51 -5
- taskledger-0.3.0/taskledger/web_assets/dashboard.css +491 -0
- taskledger-0.3.0/taskledger/web_assets/dashboard.js +1407 -0
- {taskledger-0.2.0 → taskledger-0.3.0/taskledger.egg-info}/PKG-INFO +88 -2
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger.egg-info/SOURCES.txt +41 -0
- taskledger-0.3.0/tests/__init__.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_active_task.py +36 -0
- taskledger-0.3.0/tests/test_agent_command_logging.py +657 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_agent_session_protocol.py +98 -0
- taskledger-0.3.0/tests/test_cli_command_contract.py +301 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_command_example_linter.py +1 -0
- taskledger-0.3.0/tests/test_command_inventory.py +291 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_delta_remaining_contracts.py +1 -1
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_docs_and_skill.py +54 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_doctor.py +4 -0
- taskledger-0.3.0/tests/test_help_subprocess.py +57 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_implementation_change_scan.py +108 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_json_contracts.py +100 -0
- taskledger-0.3.0/tests/test_next_action_expired_lock.py +115 -0
- taskledger-0.3.0/tests/test_no_log_feature.py +442 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_plan_approval_contract.py +127 -1
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_plan_lint.py +182 -0
- taskledger-0.3.0/tests/test_plan_revision_workflow.py +388 -0
- taskledger-0.3.0/tests/test_project_root_config.py +537 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_question_filter_answers.py +10 -1
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_question_plan_regeneration.py +223 -1
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_serve_dashboard.py +46 -14
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_service_boundaries.py +119 -49
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_services_dashboard.py +31 -4
- taskledger-0.3.0/tests/test_task_archive.py +220 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_task_report.py +65 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_taskledger_cli_api_parity.py +3 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_taskledger_v2_cli.py +135 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_taskledger_v2_exchange.py +583 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_tree_command.py +84 -0
- taskledger-0.3.0/tests/test_workflow_guidance.py +111 -0
- taskledger-0.2.0/.taskledger.toml +0 -29
- taskledger-0.2.0/taskledger/cli_implement.py +0 -462
- taskledger-0.2.0/taskledger/cli_plan.py +0 -510
- taskledger-0.2.0/taskledger/cli_task.py +0 -603
- taskledger-0.2.0/taskledger/command_inventory.py +0 -145
- taskledger-0.2.0/taskledger/domain/models.py +0 -1794
- taskledger-0.2.0/taskledger/services/doctor.py +0 -668
- taskledger-0.2.0/taskledger/services/web_dashboard.py +0 -1742
- taskledger-0.2.0/tests/test_cli_command_contract.py +0 -157
- taskledger-0.2.0/tests/test_command_inventory.py +0 -78
- taskledger-0.2.0/tests/test_project_root_config.py +0 -202
- {taskledger-0.2.0 → taskledger-0.3.0}/.github/workflows/codecov.yml +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/.github/workflows/pre-commit.yml +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/.github/workflows/python-publish.yml +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/.github/workflows/tests.yml +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/.gitignore +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/.readthedocs.yaml +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/.ruff.toml +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/AGENTS.md +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/LICENSE +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/Makefile +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/docs/Makefile +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/docs/architecture_taskledger_split.rst +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/docs/build.sh +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/docs/conf.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/docs/multi_repo.rst +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/docs/requirements.txt +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/docs/service_boundary_whitelist.rst +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/setup.cfg +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/setup.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/__init__.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/__main__.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/api/__init__.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/api/handoff.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/api/introductions.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/api/locks.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/api/questions.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/api/releases.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/api/search.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/api/task_runs.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/cli_actor.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/cli_ledger.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/cli_migrate.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/cli_release.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/domain/__init__.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/domain/states.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/errors.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/ids.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/launcher.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/py.typed +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/search.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/__init__.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/actors.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/command_runner.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/dashboard.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/handoff_lifecycle.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/phase5_lock_transfer.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/task_queries.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/services/validation.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/storage/__init__.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/storage/atomic.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/storage/common.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/storage/events.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/storage/frontmatter.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/storage/indexes.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/storage/ledger_config.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/storage/locks.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/storage/meta.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/storage/migrations.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/storage/paths.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/storage/repos.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger/timeutils.py +0 -0
- {taskledger-0.2.0/tests → taskledger-0.3.0/taskledger/web_assets}/__init__.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger.egg-info/dependency_links.txt +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger.egg-info/entry_points.txt +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger.egg-info/requires.txt +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/taskledger.egg-info/top_level.txt +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/conftest.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/support/__init__.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/support/builders.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_actor_harness_state.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_atomic_fast_io.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_cli_import_resilience.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_compact_mutation_output.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_domain_policies.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_events.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_handoff_lifecycle.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_legacy_cleanup_contracts.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_lifecycle_policies.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_locks_audit.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_models_v1_schema.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_plan_todo_materialization.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_question_add_many.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_release_changelog.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_search.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_sidecar_collections.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_storage_bundle_layout.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_storage_common.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_storage_init.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_storage_migration.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_storage_repos.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_task_events.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_taskledger_branch_scoped_ledgers.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_tasks_service_static.py +0 -0
- {taskledger-0.2.0 → taskledger-0.3.0}/tests/test_todo_implementation_gate.py +0 -0
|
@@ -6,7 +6,7 @@ respect_gitignore = true
|
|
|
6
6
|
# exclude = ["*/.venv/*", "integration_tests", "examples", "docs"]
|
|
7
7
|
gitignore_allow = ["taskledger/_version.py"]
|
|
8
8
|
exclude = ["*/.venv/*", "integration_tests", "todo.md"]
|
|
9
|
-
include = ["**/*.py", "**/*.toml", "**/*.rst", "**/*.md", "**/*.typed"]
|
|
9
|
+
include = ["**/*.py", "**/*.toml", "**/*.rst", "**/*.md", "**/*.typed", "**/*.js", "**/*.css"]
|
|
10
10
|
split_max_chars = 0
|
|
11
11
|
manifest = false
|
|
12
12
|
layout = "full"
|
|
@@ -64,11 +64,3 @@ repos:
|
|
|
64
64
|
args:
|
|
65
65
|
- --plugin=@prettier/plugin-xml
|
|
66
66
|
files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$
|
|
67
|
-
- repo: https://github.com/pre-commit/mirrors-eslint
|
|
68
|
-
rev: v10.2.1
|
|
69
|
-
hooks:
|
|
70
|
-
- id: eslint
|
|
71
|
-
verbose: true
|
|
72
|
-
args:
|
|
73
|
-
- --color
|
|
74
|
-
- --fix
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Project-local taskledger configuration.
|
|
2
|
+
# This file lives in the source project root.
|
|
3
|
+
config_version = 2
|
|
4
|
+
taskledger_dir = '.taskledger'
|
|
5
|
+
|
|
6
|
+
# Stable project identity. Commit this with your source tree.
|
|
7
|
+
project_uuid = "081c7c05-2d10-42b7-9b37-3d814c2f400a"
|
|
8
|
+
|
|
9
|
+
# Taskledger branch-scoped state. This block is intentionally safe to commit.
|
|
10
|
+
ledger_ref = "main"
|
|
11
|
+
ledger_parent_ref = ""
|
|
12
|
+
ledger_next_task_number = 81
|
|
13
|
+
ledger_branch_guard = "off"
|
|
14
|
+
|
|
15
|
+
[prompt_profiles.planning]
|
|
16
|
+
profile = "balanced"
|
|
17
|
+
question_policy = "ask_when_missing"
|
|
18
|
+
max_required_questions = 5
|
|
19
|
+
min_acceptance_criteria = 1
|
|
20
|
+
todo_granularity = "implementation_steps"
|
|
21
|
+
require_files = true
|
|
22
|
+
require_test_commands = true
|
|
23
|
+
require_expected_outputs = true
|
|
24
|
+
require_validation_hints = true
|
|
25
|
+
plan_body_detail = "normal"
|
|
26
|
+
required_question_topics = []
|
|
27
|
+
extra_guidance = ""
|
|
28
|
+
|
|
29
|
+
[agent_logging]
|
|
30
|
+
enabled = true
|
|
@@ -53,6 +53,8 @@ from taskledger.errors import (
|
|
|
53
53
|
- `project_doctor`
|
|
54
54
|
- `project_export`
|
|
55
55
|
- `project_import`
|
|
56
|
+
- `project_export_archive`
|
|
57
|
+
- `project_import_archive`
|
|
56
58
|
- `project_snapshot`
|
|
57
59
|
- `project_tree`
|
|
58
60
|
|
|
@@ -71,7 +73,10 @@ from taskledger.errors import (
|
|
|
71
73
|
- `cancel_task`
|
|
72
74
|
- `uncancel_task`
|
|
73
75
|
- `close_task`
|
|
76
|
+
- `archive_task`
|
|
77
|
+
- `unarchive_task`
|
|
74
78
|
- `create_follow_up_task`
|
|
79
|
+
- `list_archived_task_summaries`
|
|
75
80
|
- `add_requirement`
|
|
76
81
|
- `remove_requirement`
|
|
77
82
|
- `waive_requirement`
|
|
@@ -99,17 +104,31 @@ from taskledger.errors import (
|
|
|
99
104
|
- `propose_plan`
|
|
100
105
|
- `plan_template`
|
|
101
106
|
- `upsert_plan`
|
|
107
|
+
- `export_plan`
|
|
108
|
+
- `amend_plan`
|
|
102
109
|
- `regenerate_plan_from_answers`
|
|
103
110
|
- `materialize_plan_todos`
|
|
104
111
|
- `list_plan_versions`
|
|
105
112
|
- `show_plan`
|
|
106
113
|
- `diff_plan`
|
|
107
114
|
- `lint_plan`
|
|
115
|
+
- `plan_guidance`
|
|
108
116
|
- `approve_plan`
|
|
109
117
|
- `reject_plan`
|
|
110
118
|
- `revise_plan`
|
|
111
119
|
- `run_planning_command`
|
|
112
120
|
|
|
121
|
+
Planning guidance API example:
|
|
122
|
+
|
|
123
|
+
```python
|
|
124
|
+
from pathlib import Path
|
|
125
|
+
|
|
126
|
+
from taskledger.api.plans import plan_guidance
|
|
127
|
+
|
|
128
|
+
payload = plan_guidance(Path.cwd(), "task-0001")
|
|
129
|
+
# payload includes: kind, task_id, has_project_guidance, guidance, profile, question_policy
|
|
130
|
+
```
|
|
131
|
+
|
|
113
132
|
### `taskledger.api.questions`
|
|
114
133
|
|
|
115
134
|
- `add_question`
|
|
@@ -1,5 +1,40 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.2.0 - 2026-05-03
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Added `taskledger task record` for creating done tasks that represent manually completed work, with change records, evidence, and implementation summaries. Does not acquire locks or activate the task. Recorded tasks are included in release changelogs.
|
|
8
|
+
- Added branch-scoped ledger state with `taskledger ledger` command group (`status`, `list`, `fork`, `switch`, `adopt`, `doctor`). Each git branch can maintain its own isolated task ledger, with `adopt` for copying branch-local task history into the current ledger.
|
|
9
|
+
- Added `taskledger tree` command to render ledger and task structure with follow-up nesting, subtree filtering, release boundaries, and per-ledger release counts in both human and JSON output.
|
|
10
|
+
- Added compressed export/import with a project UUID guard to prevent importing archives into the wrong project, plus archive member-count and manifest/payload size limits for safety.
|
|
11
|
+
- Added `taskledger status --check` to run doctor diagnostics alongside status, keeping the default `status` fast by avoiding full record parsing.
|
|
12
|
+
- Added structured diagnostics to `taskledger doctor` JSON output with task IDs, change IDs, run IDs, types, relative paths, and actionable repair hints.
|
|
13
|
+
- Added explicit `repair` command for existing planning-command change records that were incorrectly persisted as code changes.
|
|
14
|
+
- Added a top-level `Makefile` with a `release-check` automation target (compile, test, lint, type-check, build, twine check).
|
|
15
|
+
- Added AST-based service boundary guardrail tests with explicit whitelists and documented rationale.
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- Split core plan/implement/validate service entrypoints from `tasks.py` into dedicated `planning_flow.py`, `implementation_flow.py`, and `validation_flow.py` modules. `tasks.py` remains a compatibility facade.
|
|
20
|
+
- Decoupled validation service from private task helpers by extracting shared query logic into a new `task_queries` module.
|
|
21
|
+
- Planning commands are now persisted as planning-run evidence (worklog/artifacts/event) instead of creating `CodeChangeRecord` entries.
|
|
22
|
+
- Replaced chmod-dependent storage write failure test with a deterministic synthetic `OSError` monkeypatch.
|
|
23
|
+
- Sped up test suite with test-only fast fsync bypass, command-runner seam, and reduced subprocess-heavy setup.
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- Fixed import replace so it no longer restores stale locks across machines.
|
|
28
|
+
|
|
29
|
+
### Documentation
|
|
30
|
+
|
|
31
|
+
- Documented branch-scoped ledger workflow, `task record` usage and warnings, `tree` command, and `make release-check` across README, RST docs, API docs, and the taskledger skill.
|
|
32
|
+
- Added `docs/service_boundary_whitelist.md` documenting temporary module/function boundary whitelist entries and split targets.
|
|
33
|
+
|
|
34
|
+
### Quality
|
|
35
|
+
|
|
36
|
+
- Expanded regression coverage for branch-scoped ledgers, task record, tree command, compressed export/import, doctor diagnostics, status performance, service boundaries, and planning command persistence. Repo-wide pytest, ruff, and mypy passed.
|
|
37
|
+
|
|
3
38
|
## v0.1.2 - 2026-04-30
|
|
4
39
|
|
|
5
40
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: taskledger
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: Durable project-state storage and CLI for coding workflows
|
|
5
5
|
Author: Taskledger Contributors
|
|
6
6
|
Maintainer: Holger Nahrstaedt
|
|
@@ -82,6 +82,53 @@ The supported command surface is organized as:
|
|
|
82
82
|
|
|
83
83
|
- `init`, `status`, `export`, `import`, `snapshot`, `release`
|
|
84
84
|
|
|
85
|
+
### Which read command to use
|
|
86
|
+
|
|
87
|
+
| Need | Command |
|
|
88
|
+
| -------------------------- | --------------------------------------------------- |
|
|
89
|
+
| Next step | `next-action` |
|
|
90
|
+
| Next implementation item | `todo next` |
|
|
91
|
+
| Active task summary | `task show` |
|
|
92
|
+
| Specific task summary | `task show TASK_REF` or `task show --task TASK_REF` |
|
|
93
|
+
| Project/ledger overview | `status`, `tree` |
|
|
94
|
+
| Human dashboard | `serve` |
|
|
95
|
+
| Reviewable markdown report | `task report` |
|
|
96
|
+
| Fresh worker context | `context` or durable `handoff show` |
|
|
97
|
+
| Command audit | `task transcript` |
|
|
98
|
+
|
|
99
|
+
## Planning guidance profiles
|
|
100
|
+
|
|
101
|
+
Taskledger supports project-local advisory planning guidance under
|
|
102
|
+
`[prompt_profiles.planning]` in the active project config file (`taskledger.toml`
|
|
103
|
+
or `.taskledger.toml` when legacy config is still present).
|
|
104
|
+
|
|
105
|
+
```toml
|
|
106
|
+
[prompt_profiles.planning]
|
|
107
|
+
profile = "strict"
|
|
108
|
+
question_policy = "always_before_plan"
|
|
109
|
+
max_required_questions = 3
|
|
110
|
+
min_acceptance_criteria = 2
|
|
111
|
+
todo_granularity = "atomic"
|
|
112
|
+
require_files = true
|
|
113
|
+
require_test_commands = true
|
|
114
|
+
require_expected_outputs = true
|
|
115
|
+
require_validation_hints = true
|
|
116
|
+
plan_body_detail = "detailed"
|
|
117
|
+
required_question_topics = ["scope", "compatibility", "test strategy"]
|
|
118
|
+
extra_guidance = "Every plan must mention docs, tests, and rollback or repair behavior."
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Inspect guidance for the active task:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
taskledger plan guidance
|
|
125
|
+
taskledger --json plan guidance
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
This guidance is advisory and cannot override lifecycle gates, user approval,
|
|
129
|
+
validation requirements, lock rules, or higher-priority harness instructions.
|
|
130
|
+
See `docs/usage.rst` for the full key reference and workflow details.
|
|
131
|
+
|
|
85
132
|
## Install
|
|
86
133
|
|
|
87
134
|
```bash
|
|
@@ -137,6 +184,16 @@ taskledger validate check --criterion ac-0001 --status pass --evidence "pytest -
|
|
|
137
184
|
taskledger validate finish --result passed --summary "Validated the rewrite."
|
|
138
185
|
```
|
|
139
186
|
|
|
187
|
+
To revise a proposed plan, re-enter planning and edit an exported workspace
|
|
188
|
+
copy. Never edit `.taskledger/` files directly:
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
taskledger plan revise
|
|
192
|
+
taskledger plan export --version latest --file ./plan.md
|
|
193
|
+
# edit ./plan.md
|
|
194
|
+
taskledger plan upsert --file ./plan.md
|
|
195
|
+
```
|
|
196
|
+
|
|
140
197
|
For manually completed work (e.g., manual testing, operations tasks, or work
|
|
141
198
|
completed outside the task-first lifecycle), use `task record` to create a
|
|
142
199
|
done task directly without acquiring lifecycle locks. **Note**: `task record`
|
|
@@ -148,6 +205,17 @@ taskledger task record "Deploy to production" --summary "Deployed v0.4.1 to prod
|
|
|
148
205
|
taskledger task record "Manual API testing" --summary "Tested new endpoints" --allow-empty-record --reason "Exploratory testing, no formal changes tracked"
|
|
149
206
|
```
|
|
150
207
|
|
|
208
|
+
Archive is a visibility operation: it hides tasks from default list/tree/dashboard
|
|
209
|
+
views without deleting history. Task ids stay monotonic and are never reused.
|
|
210
|
+
Slugs can be reused after archive.
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
taskledger task archive task-0030 --reason "Hide historical task"
|
|
214
|
+
taskledger task list --archived
|
|
215
|
+
taskledger task unarchive task-0030 --reason "Need to continue work" --slug task-0030-reopened
|
|
216
|
+
taskledger tree --include-archived
|
|
217
|
+
```
|
|
218
|
+
|
|
151
219
|
If validation finds an implementation bug, keep the accepted plan and restart
|
|
152
220
|
implementation explicitly:
|
|
153
221
|
|
|
@@ -340,6 +408,7 @@ Use `--json` for machine-readable payloads:
|
|
|
340
408
|
taskledger --json status --full
|
|
341
409
|
taskledger --json task active
|
|
342
410
|
taskledger --json task show
|
|
411
|
+
taskledger --json task show task-0001
|
|
343
412
|
taskledger --json context --for validation --format json
|
|
344
413
|
```
|
|
345
414
|
|
|
@@ -441,11 +510,28 @@ for task-first handoff guidance.
|
|
|
441
510
|
## Export, import, and snapshots
|
|
442
511
|
|
|
443
512
|
```bash
|
|
444
|
-
taskledger
|
|
513
|
+
taskledger init --project-name "Taskledger"
|
|
514
|
+
taskledger export
|
|
515
|
+
taskledger import ./taskledger-transfer.tar.gz --dry-run
|
|
445
516
|
taskledger import ./taskledger-transfer.tar.gz --replace
|
|
446
517
|
taskledger snapshot ./artifacts
|
|
447
518
|
```
|
|
448
519
|
|
|
520
|
+
Default export filenames use this policy:
|
|
521
|
+
|
|
522
|
+
```text
|
|
523
|
+
taskledger-export-{project_slug}-{ledger_ref}-{timestamp}.tar.gz
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
`project_slug` is derived from `project_name` in `taskledger.toml`. If
|
|
527
|
+
`project_name` is missing, taskledger falls back to the workspace directory name.
|
|
528
|
+
Import safety still relies on `project_uuid`, not the name/slug.
|
|
529
|
+
|
|
530
|
+
`--include-bodies` and `--include-run-artifacts` now change archive content:
|
|
531
|
+
|
|
532
|
+
- `--no-include-bodies` strips record body text (`body` / `context_body`) from exported payloads.
|
|
533
|
+
- `--include-run-artifacts` embeds task and agent-log artifact files under `artifacts/` in the archive.
|
|
534
|
+
|
|
449
535
|
Cross-machine imports preserve durable task/run data, but imported runtime locks
|
|
450
536
|
are quarantined by default. After importing an in-progress implementation,
|
|
451
537
|
run:
|
|
@@ -39,6 +39,53 @@ The supported command surface is organized as:
|
|
|
39
39
|
|
|
40
40
|
- `init`, `status`, `export`, `import`, `snapshot`, `release`
|
|
41
41
|
|
|
42
|
+
### Which read command to use
|
|
43
|
+
|
|
44
|
+
| Need | Command |
|
|
45
|
+
| -------------------------- | --------------------------------------------------- |
|
|
46
|
+
| Next step | `next-action` |
|
|
47
|
+
| Next implementation item | `todo next` |
|
|
48
|
+
| Active task summary | `task show` |
|
|
49
|
+
| Specific task summary | `task show TASK_REF` or `task show --task TASK_REF` |
|
|
50
|
+
| Project/ledger overview | `status`, `tree` |
|
|
51
|
+
| Human dashboard | `serve` |
|
|
52
|
+
| Reviewable markdown report | `task report` |
|
|
53
|
+
| Fresh worker context | `context` or durable `handoff show` |
|
|
54
|
+
| Command audit | `task transcript` |
|
|
55
|
+
|
|
56
|
+
## Planning guidance profiles
|
|
57
|
+
|
|
58
|
+
Taskledger supports project-local advisory planning guidance under
|
|
59
|
+
`[prompt_profiles.planning]` in the active project config file (`taskledger.toml`
|
|
60
|
+
or `.taskledger.toml` when legacy config is still present).
|
|
61
|
+
|
|
62
|
+
```toml
|
|
63
|
+
[prompt_profiles.planning]
|
|
64
|
+
profile = "strict"
|
|
65
|
+
question_policy = "always_before_plan"
|
|
66
|
+
max_required_questions = 3
|
|
67
|
+
min_acceptance_criteria = 2
|
|
68
|
+
todo_granularity = "atomic"
|
|
69
|
+
require_files = true
|
|
70
|
+
require_test_commands = true
|
|
71
|
+
require_expected_outputs = true
|
|
72
|
+
require_validation_hints = true
|
|
73
|
+
plan_body_detail = "detailed"
|
|
74
|
+
required_question_topics = ["scope", "compatibility", "test strategy"]
|
|
75
|
+
extra_guidance = "Every plan must mention docs, tests, and rollback or repair behavior."
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Inspect guidance for the active task:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
taskledger plan guidance
|
|
82
|
+
taskledger --json plan guidance
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
This guidance is advisory and cannot override lifecycle gates, user approval,
|
|
86
|
+
validation requirements, lock rules, or higher-priority harness instructions.
|
|
87
|
+
See `docs/usage.rst` for the full key reference and workflow details.
|
|
88
|
+
|
|
42
89
|
## Install
|
|
43
90
|
|
|
44
91
|
```bash
|
|
@@ -94,6 +141,16 @@ taskledger validate check --criterion ac-0001 --status pass --evidence "pytest -
|
|
|
94
141
|
taskledger validate finish --result passed --summary "Validated the rewrite."
|
|
95
142
|
```
|
|
96
143
|
|
|
144
|
+
To revise a proposed plan, re-enter planning and edit an exported workspace
|
|
145
|
+
copy. Never edit `.taskledger/` files directly:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
taskledger plan revise
|
|
149
|
+
taskledger plan export --version latest --file ./plan.md
|
|
150
|
+
# edit ./plan.md
|
|
151
|
+
taskledger plan upsert --file ./plan.md
|
|
152
|
+
```
|
|
153
|
+
|
|
97
154
|
For manually completed work (e.g., manual testing, operations tasks, or work
|
|
98
155
|
completed outside the task-first lifecycle), use `task record` to create a
|
|
99
156
|
done task directly without acquiring lifecycle locks. **Note**: `task record`
|
|
@@ -105,6 +162,17 @@ taskledger task record "Deploy to production" --summary "Deployed v0.4.1 to prod
|
|
|
105
162
|
taskledger task record "Manual API testing" --summary "Tested new endpoints" --allow-empty-record --reason "Exploratory testing, no formal changes tracked"
|
|
106
163
|
```
|
|
107
164
|
|
|
165
|
+
Archive is a visibility operation: it hides tasks from default list/tree/dashboard
|
|
166
|
+
views without deleting history. Task ids stay monotonic and are never reused.
|
|
167
|
+
Slugs can be reused after archive.
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
taskledger task archive task-0030 --reason "Hide historical task"
|
|
171
|
+
taskledger task list --archived
|
|
172
|
+
taskledger task unarchive task-0030 --reason "Need to continue work" --slug task-0030-reopened
|
|
173
|
+
taskledger tree --include-archived
|
|
174
|
+
```
|
|
175
|
+
|
|
108
176
|
If validation finds an implementation bug, keep the accepted plan and restart
|
|
109
177
|
implementation explicitly:
|
|
110
178
|
|
|
@@ -297,6 +365,7 @@ Use `--json` for machine-readable payloads:
|
|
|
297
365
|
taskledger --json status --full
|
|
298
366
|
taskledger --json task active
|
|
299
367
|
taskledger --json task show
|
|
368
|
+
taskledger --json task show task-0001
|
|
300
369
|
taskledger --json context --for validation --format json
|
|
301
370
|
```
|
|
302
371
|
|
|
@@ -398,11 +467,28 @@ for task-first handoff guidance.
|
|
|
398
467
|
## Export, import, and snapshots
|
|
399
468
|
|
|
400
469
|
```bash
|
|
401
|
-
taskledger
|
|
470
|
+
taskledger init --project-name "Taskledger"
|
|
471
|
+
taskledger export
|
|
472
|
+
taskledger import ./taskledger-transfer.tar.gz --dry-run
|
|
402
473
|
taskledger import ./taskledger-transfer.tar.gz --replace
|
|
403
474
|
taskledger snapshot ./artifacts
|
|
404
475
|
```
|
|
405
476
|
|
|
477
|
+
Default export filenames use this policy:
|
|
478
|
+
|
|
479
|
+
```text
|
|
480
|
+
taskledger-export-{project_slug}-{ledger_ref}-{timestamp}.tar.gz
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
`project_slug` is derived from `project_name` in `taskledger.toml`. If
|
|
484
|
+
`project_name` is missing, taskledger falls back to the workspace directory name.
|
|
485
|
+
Import safety still relies on `project_uuid`, not the name/slug.
|
|
486
|
+
|
|
487
|
+
`--include-bodies` and `--include-run-artifacts` now change archive content:
|
|
488
|
+
|
|
489
|
+
- `--no-include-bodies` strips record body text (`body` / `context_body`) from exported payloads.
|
|
490
|
+
- `--include-run-artifacts` embeds task and agent-log artifact files under `artifacts/` in the archive.
|
|
491
|
+
|
|
406
492
|
Cross-machine imports preserve durable task/run data, but imported runtime locks
|
|
407
493
|
are quarantined by default. After importing an in-progress implementation,
|
|
408
494
|
run:
|
|
@@ -32,6 +32,8 @@ Project API
|
|
|
32
32
|
- ``project_doctor``
|
|
33
33
|
- ``project_export``
|
|
34
34
|
- ``project_import``
|
|
35
|
+
- ``project_export_archive``
|
|
36
|
+
- ``project_import_archive``
|
|
35
37
|
- ``project_snapshot``
|
|
36
38
|
- ``project_tree``
|
|
37
39
|
|
|
@@ -51,7 +53,10 @@ Task API
|
|
|
51
53
|
- ``cancel_task``
|
|
52
54
|
- ``uncancel_task``
|
|
53
55
|
- ``close_task``
|
|
56
|
+
- ``archive_task``
|
|
57
|
+
- ``unarchive_task``
|
|
54
58
|
- ``create_follow_up_task``
|
|
59
|
+
- ``list_archived_task_summaries``
|
|
55
60
|
- ``add_requirement``
|
|
56
61
|
- ``remove_requirement``
|
|
57
62
|
- ``waive_requirement``
|
|
@@ -80,10 +85,13 @@ Plan API
|
|
|
80
85
|
- ``propose_plan``
|
|
81
86
|
- ``plan_template``
|
|
82
87
|
- ``upsert_plan``
|
|
88
|
+
- ``export_plan``
|
|
89
|
+
- ``amend_plan``
|
|
83
90
|
- ``list_plan_versions``
|
|
84
91
|
- ``show_plan``
|
|
85
92
|
- ``diff_plan``
|
|
86
93
|
- ``lint_plan``
|
|
94
|
+
- ``plan_guidance``
|
|
87
95
|
- ``approve_plan``
|
|
88
96
|
- ``reject_plan``
|
|
89
97
|
- ``revise_plan``
|
|
@@ -91,6 +99,15 @@ Plan API
|
|
|
91
99
|
- ``materialize_plan_todos``
|
|
92
100
|
- ``run_planning_command``
|
|
93
101
|
|
|
102
|
+
Planning guidance example:
|
|
103
|
+
|
|
104
|
+
.. code-block:: python
|
|
105
|
+
|
|
106
|
+
from pathlib import Path
|
|
107
|
+
from taskledger.api.plans import plan_guidance
|
|
108
|
+
|
|
109
|
+
payload = plan_guidance(Path.cwd(), "task-0001")
|
|
110
|
+
|
|
94
111
|
Question API
|
|
95
112
|
------------
|
|
96
113
|
|
|
@@ -20,8 +20,8 @@ should prefer ``--root``.
|
|
|
20
20
|
Task Scoping
|
|
21
21
|
------------
|
|
22
22
|
|
|
23
|
-
Task-scoped commands default to the active task. Use
|
|
24
|
-
when explicitly targeting another task.
|
|
23
|
+
Task-scoped workflow commands default to the active task. Use
|
|
24
|
+
``--task TASK_REF`` when explicitly targeting another task.
|
|
25
25
|
|
|
26
26
|
.. code-block:: bash
|
|
27
27
|
|
|
@@ -32,7 +32,57 @@ when explicitly targeting another task.
|
|
|
32
32
|
taskledger implement finish --task task-0001 --summary "Implemented."
|
|
33
33
|
taskledger validate status --task task-0001
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
Task-resource commands accept the task as their direct positional resource:
|
|
36
|
+
|
|
37
|
+
.. code-block:: bash
|
|
38
|
+
|
|
39
|
+
taskledger task show task-0001
|
|
40
|
+
taskledger task cancel task-0001 --reason "Duplicate"
|
|
41
|
+
taskledger task archive task-0001 --reason "Hide historical task"
|
|
42
|
+
taskledger task unarchive task-0001 --reason "Restore task"
|
|
43
|
+
taskledger task report task-0001
|
|
44
|
+
|
|
45
|
+
Optional positional task refs are not supported for workflow commands.
|
|
46
|
+
|
|
47
|
+
Plan guidance command
|
|
48
|
+
---------------------
|
|
49
|
+
|
|
50
|
+
``taskledger plan guidance`` is a read-only planning helper command:
|
|
51
|
+
|
|
52
|
+
.. code-block:: bash
|
|
53
|
+
|
|
54
|
+
taskledger plan guidance [--task TASK_REF] [--format markdown|json]
|
|
55
|
+
|
|
56
|
+
Rules:
|
|
57
|
+
|
|
58
|
+
* defaults to the active task when ``--task`` is omitted;
|
|
59
|
+
* ``--format`` accepts only ``markdown`` or ``json``;
|
|
60
|
+
* when a planning run is active, it records a one-time guidance-view marker for
|
|
61
|
+
that run and appends a ``plan.guidance.viewed`` event;
|
|
62
|
+
* root ``--json`` continues to return the standard CLI success/error envelope.
|
|
63
|
+
|
|
64
|
+
The command payload shape is:
|
|
65
|
+
|
|
66
|
+
* ``kind``
|
|
67
|
+
* ``task_id``
|
|
68
|
+
* ``has_project_guidance``
|
|
69
|
+
* ``guidance``
|
|
70
|
+
* ``profile``
|
|
71
|
+
* ``question_policy``
|
|
72
|
+
|
|
73
|
+
Plan revision commands
|
|
74
|
+
----------------------
|
|
75
|
+
|
|
76
|
+
``taskledger plan export`` renders an editable plan draft outside durable
|
|
77
|
+
storage, and ``taskledger plan amend`` applies structured plan-review edits:
|
|
78
|
+
|
|
79
|
+
.. code-block:: bash
|
|
80
|
+
|
|
81
|
+
taskledger plan export [--task TASK_REF] [--version latest|N] [--file PATH] [--overwrite] [--stdout]
|
|
82
|
+
taskledger plan amend [--task TASK_REF] [--drop-criterion CRITERION_ID ...] [--drop-todo TODO_ID ...] [--remove-file PATH ...] --reason "..."
|
|
83
|
+
|
|
84
|
+
Plan proposal commands that accept ``--file`` reject file paths under
|
|
85
|
+
``.taskledger/`` because that directory is private durable ledger state.
|
|
36
86
|
|
|
37
87
|
Archive import lock policy
|
|
38
88
|
--------------------------
|
|
@@ -47,6 +97,31 @@ The default is ``quarantine`` so imported source-machine runtime locks are not
|
|
|
47
97
|
restored as active ``lock.yaml`` files. ``keep`` is diagnostic-only behavior
|
|
48
98
|
for full-fidelity lock restoration.
|
|
49
99
|
|
|
100
|
+
Transfer archive manifest contract
|
|
101
|
+
----------------------------------
|
|
102
|
+
|
|
103
|
+
Transfer archives include both machine identity and human-readable metadata:
|
|
104
|
+
``manifest.project.name`` and ``manifest.project.slug`` are display metadata,
|
|
105
|
+
while ``manifest.project.uuid`` remains the safety identity.
|
|
106
|
+
|
|
107
|
+
.. code-block:: json
|
|
108
|
+
|
|
109
|
+
{
|
|
110
|
+
"project": {
|
|
111
|
+
"uuid": "<project_uuid>",
|
|
112
|
+
"name": "<project_name>",
|
|
113
|
+
"slug": "<project_slug>",
|
|
114
|
+
"ledger_ref": "<ledger_ref>"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
Import compatibility is backward-safe: older archives that only contain
|
|
119
|
+
``project.uuid`` and ``project.ledger_ref`` remain valid. UUID comparison is
|
|
120
|
+
still authoritative for import safety.
|
|
121
|
+
|
|
122
|
+
``taskledger import --dry-run`` must not mutate taskledger state for either
|
|
123
|
+
archive or JSON payload imports.
|
|
124
|
+
|
|
50
125
|
Positional Resource Refs
|
|
51
126
|
------------------------
|
|
52
127
|
|
|
@@ -138,6 +213,8 @@ and may also include:
|
|
|
138
213
|
* ``template_command`` plus ``required_plan_fields`` and
|
|
139
214
|
``recommended_plan_fields`` when the next step is regenerating a plan from
|
|
140
215
|
answered questions
|
|
216
|
+
* ``guidance_command`` when planning guidance should be reviewed before drafting
|
|
217
|
+
or regenerating a plan
|
|
141
218
|
|
|
142
219
|
Agents should inspect ``next_item``, prefer ``next_command`` when it is safe,
|
|
143
220
|
avoid inventing question answers, and never mark todos done without evidence.
|
|
@@ -153,7 +230,8 @@ latest implementation run and no active lock, it should direct agents to
|
|
|
153
230
|
For an approved task with a non-implementation run still marked running,
|
|
154
231
|
``next-action`` must not direct agents to ``taskledger implement start``.
|
|
155
232
|
It should report a repair-oriented action and point to ``taskledger doctor``.
|
|
156
|
-
Truly cancelled tasks recover through
|
|
233
|
+
Truly cancelled tasks recover through
|
|
234
|
+
``taskledger task uncancel --task TASK_REF --reason "..."``
|
|
157
235
|
|
|
158
236
|
Compact mutation output
|
|
159
237
|
........................
|
|
@@ -188,6 +266,40 @@ to a durable non-active stage rather than directly re-entering an active stage.
|
|
|
188
266
|
Run and lock repair
|
|
189
267
|
-------------------
|
|
190
268
|
|
|
269
|
+
Managed command wrappers
|
|
270
|
+
------------------------
|
|
271
|
+
|
|
272
|
+
``plan command`` and ``implement command`` mirror the inner command exit code by
|
|
273
|
+
default.
|
|
274
|
+
|
|
275
|
+
Use ``--allow-failure`` when you intentionally want to record a non-zero inner
|
|
276
|
+
exit code while returning wrapper exit code ``0``:
|
|
277
|
+
|
|
278
|
+
.. code-block:: bash
|
|
279
|
+
|
|
280
|
+
taskledger plan command -- pytest tests/ -q
|
|
281
|
+
taskledger plan command --allow-failure -- pytest tests/ -q
|
|
282
|
+
taskledger implement command -- ruff check --config=.ruff.toml .
|
|
283
|
+
taskledger implement command --allow-failure -- python -c "raise SystemExit(7)"
|
|
284
|
+
|
|
285
|
+
Transcript review modes
|
|
286
|
+
-----------------------
|
|
287
|
+
|
|
288
|
+
``task transcript`` defaults to review mode, which groups wrapper +
|
|
289
|
+
managed-shell pairs, highlights failures and wrapper/managed mismatches, and
|
|
290
|
+
flags late lifecycle commands. Raw per-record audit table is available with
|
|
291
|
+
``--raw``::
|
|
292
|
+
|
|
293
|
+
.. code-block:: bash
|
|
294
|
+
|
|
295
|
+
taskledger task transcript --task TASK_REF
|
|
296
|
+
taskledger task transcript --task TASK_REF --raw
|
|
297
|
+
taskledger task transcript --task TASK_REF --failures
|
|
298
|
+
|
|
299
|
+
``--review`` is the default (no flag needed). ``--raw`` shows every record
|
|
300
|
+
without collapsing. ``--failures`` renders only failed command rows and retry
|
|
301
|
+
detection. ``--raw``, ``--review``, and ``--failures`` are mutually exclusive.
|
|
302
|
+
|
|
191
303
|
``taskledger doctor`` and ``taskledger doctor locks`` report running runs without
|
|
192
304
|
matching active locks. Orphaned running planning runs can be finished only
|
|
193
305
|
through an explicit repair command with a reason:
|
|
@@ -126,8 +126,9 @@ inspection), preserve their output with ``plan command``:
|
|
|
126
126
|
taskledger plan command -- pytest tests/test_parser.py -q
|
|
127
127
|
taskledger plan command -- python -m compileall taskledger
|
|
128
128
|
|
|
129
|
-
``plan command`` records
|
|
130
|
-
|
|
129
|
+
``plan command`` records command exit code and output in planning diagnostics.
|
|
130
|
+
With transcript logging enabled, the same output is also captured in the
|
|
131
|
+
ledger-level command transcript. Use it to build evidence into the plan before
|
|
131
132
|
proposal.
|
|
132
133
|
|
|
133
134
|
6. Materialize Todos And Approve
|
|
@@ -178,8 +179,9 @@ Begin implementation and keep durable notes as work progresses:
|
|
|
178
179
|
taskledger implement status
|
|
179
180
|
|
|
180
181
|
Use ``implement command`` when you want taskledger to record a command run as
|
|
181
|
-
part of implementation.
|
|
182
|
-
|
|
182
|
+
part of implementation. With transcript logging enabled, it also records managed
|
|
183
|
+
stdout/stderr in the task transcript. Use ``implement deviation`` when the
|
|
184
|
+
implementation differs from the approved plan.
|
|
183
185
|
|
|
184
186
|
Fresh-worker implementation
|
|
185
187
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
@@ -282,6 +284,7 @@ After validation passes, close the task and inspect final state:
|
|
|
282
284
|
taskledger task close --note "Fixed parser delimiter handling and validated parser regressions."
|
|
283
285
|
taskledger release tag 0.4.2 --at-task parser-fix --note "0.4.2 released."
|
|
284
286
|
taskledger task show
|
|
287
|
+
taskledger task show parser-fix
|
|
285
288
|
taskledger status --full
|
|
286
289
|
taskledger doctor
|
|
287
290
|
|
|
@@ -318,7 +321,7 @@ cycle:
|
|
|
318
321
|
taskledger doctor locks
|
|
319
322
|
taskledger lock break --reason "Recover stale planning lock."
|
|
320
323
|
taskledger implement resume --reason "Reacquire implementation lock for existing running run."
|
|
321
|
-
taskledger task uncancel --reason "Restore the task to a safe durable stage."
|
|
324
|
+
taskledger task uncancel --task TASK_REF --reason "Restore the task to a safe durable stage."
|
|
322
325
|
taskledger repair index
|
|
323
326
|
taskledger repair task --reason "Inspect task record after manual edit."
|
|
324
327
|
taskledger reindex
|
|
@@ -42,6 +42,12 @@ plan subcommands
|
|
|
42
42
|
- ``plan start``, ``plan propose``, ``plan template``, ``plan upsert``, ``plan lint``, ``plan approve``, ``plan accept``, ``plan reject``, ``plan show``, ``plan diff``
|
|
43
43
|
- ``plan regenerate --from-answers``, ``plan materialize-todos``, ``plan command -- ...``
|
|
44
44
|
|
|
45
|
+
task reporting and transcripts
|
|
46
|
+
------------------------------
|
|
47
|
+
|
|
48
|
+
- ``task report`` supports section control including ``--include command-log``
|
|
49
|
+
- ``task transcript`` renders a per-task command transcript in ``markdown`` or ``json``
|
|
50
|
+
|
|
45
51
|
todo subcommands
|
|
46
52
|
----------------
|
|
47
53
|
|