taskledger 0.1.2__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.1.2 → taskledger-0.3.0}/.codecrate.toml +1 -1
- taskledger-0.3.0/.github/workflows/pre-commit.yml +31 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/.pre-commit-config.yaml +10 -13
- taskledger-0.3.0/.taskledger.toml +30 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/API.md +24 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/CHANGELOG.md +55 -0
- taskledger-0.3.0/Makefile +9 -0
- {taskledger-0.1.2/taskledger.egg-info → taskledger-0.3.0}/PKG-INFO +155 -20
- {taskledger-0.1.2 → taskledger-0.3.0}/README.md +153 -19
- {taskledger-0.1.2 → taskledger-0.3.0}/docs/api.rst +22 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/docs/command_contract.rst +195 -6
- {taskledger-0.1.2 → taskledger-0.3.0}/docs/full_task_cycle.rst +8 -5
- {taskledger-0.1.2 → taskledger-0.3.0}/docs/index.rst +1 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/docs/public_surface.rst +6 -0
- taskledger-0.3.0/docs/service_boundary_whitelist.rst +57 -0
- taskledger-0.3.0/docs/transfer.rst +49 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/docs/usage.rst +197 -9
- {taskledger-0.1.2 → taskledger-0.3.0}/pyproject.toml +9 -1
- {taskledger-0.1.2 → taskledger-0.3.0}/skills/taskledger/SKILL.md +104 -29
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/_version.py +3 -3
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/plans.py +19 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/project.py +155 -8
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/tasks.py +16 -0
- taskledger-0.3.0/taskledger/cli.py +1412 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/cli_common.py +178 -4
- taskledger-0.3.0/taskledger/cli_implement.py +507 -0
- taskledger-0.3.0/taskledger/cli_ledger.py +511 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/cli_migrate.py +11 -2
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/cli_misc.py +180 -19
- taskledger-0.3.0/taskledger/cli_plan.py +711 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/cli_question.py +128 -15
- taskledger-0.3.0/taskledger/cli_task.py +886 -0
- {taskledger-0.1.2 → 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.1.2 → 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.1.2 → taskledger-0.3.0}/taskledger/domain/states.py +11 -1
- taskledger-0.3.0/taskledger/domain/task.py +255 -0
- taskledger-0.3.0/taskledger/exchange.py +980 -0
- taskledger-0.3.0/taskledger/ids.py +40 -0
- 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/command_runner.py +22 -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.1.2 → taskledger-0.3.0}/taskledger/services/handoff.py +38 -1
- taskledger-0.3.0/taskledger/services/implementation_flow.py +541 -0
- {taskledger-0.1.2 → 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.1.2 → taskledger-0.3.0}/taskledger/services/plan_lint.py +24 -13
- taskledger-0.3.0/taskledger/services/plan_materialization.py +305 -0
- taskledger-0.3.0/taskledger/services/planning_flow.py +585 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/releases.py +11 -0
- taskledger-0.3.0/taskledger/services/run_store.py +149 -0
- {taskledger-0.1.2 → 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_queries.py +81 -0
- taskledger-0.3.0/taskledger/services/task_repair.py +246 -0
- taskledger-0.3.0/taskledger/services/task_reports.py +1108 -0
- taskledger-0.3.0/taskledger/services/tasks.py +3158 -0
- taskledger-0.3.0/taskledger/services/tree.py +519 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/validation.py +6 -6
- taskledger-0.3.0/taskledger/services/validation_flow.py +397 -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.1.2 → taskledger-0.3.0}/taskledger/storage/atomic.py +26 -2
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/init.py +36 -16
- taskledger-0.3.0/taskledger/storage/ledger_config.py +278 -0
- taskledger-0.3.0/taskledger/storage/migrations.py +509 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/paths.py +13 -3
- taskledger-0.3.0/taskledger/storage/project_config.py +852 -0
- taskledger-0.3.0/taskledger/storage/project_identity.py +216 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/task_store.py +115 -27
- taskledger-0.3.0/taskledger/web_assets/__init__.py +0 -0
- taskledger-0.3.0/taskledger/web_assets/dashboard.css +491 -0
- taskledger-0.3.0/taskledger/web_assets/dashboard.js +1407 -0
- {taskledger-0.1.2 → taskledger-0.3.0/taskledger.egg-info}/PKG-INFO +155 -20
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger.egg-info/SOURCES.txt +63 -1
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger.egg-info/requires.txt +1 -0
- taskledger-0.3.0/tests/__init__.py +0 -0
- taskledger-0.3.0/tests/conftest.py +13 -0
- taskledger-0.3.0/tests/support/__init__.py +1 -0
- taskledger-0.3.0/tests/support/builders.py +231 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_active_task.py +48 -6
- taskledger-0.3.0/tests/test_agent_command_logging.py +657 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_agent_session_protocol.py +171 -12
- taskledger-0.3.0/tests/test_atomic_fast_io.py +30 -0
- taskledger-0.3.0/tests/test_cli_command_contract.py +301 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_command_example_linter.py +2 -0
- taskledger-0.3.0/tests/test_command_inventory.py +291 -0
- taskledger-0.3.0/tests/test_compact_mutation_output.py +331 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_delta_remaining_contracts.py +57 -207
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_docs_and_skill.py +54 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_doctor.py +4 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_handoff_lifecycle.py +9 -1
- taskledger-0.3.0/tests/test_help_subprocess.py +57 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_implementation_change_scan.py +108 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_json_contracts.py +101 -1
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_locks_audit.py +10 -2
- 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.1.2 → taskledger-0.3.0}/tests/test_plan_approval_contract.py +127 -1
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_plan_lint.py +283 -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.1.2 → taskledger-0.3.0}/tests/test_question_filter_answers.py +10 -1
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_question_plan_regeneration.py +236 -24
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_release_changelog.py +40 -312
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_serve_dashboard.py +46 -14
- taskledger-0.3.0/tests/test_service_boundaries.py +445 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_services_dashboard.py +31 -4
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_sidecar_collections.py +1 -1
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_storage_bundle_layout.py +219 -5
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_storage_common.py +11 -9
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_storage_init.py +2 -2
- taskledger-0.3.0/tests/test_storage_migration.py +965 -0
- taskledger-0.3.0/tests/test_task_archive.py +220 -0
- taskledger-0.3.0/tests/test_task_report.py +397 -0
- taskledger-0.3.0/tests/test_taskledger_branch_scoped_ledgers.py +145 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_taskledger_cli_api_parity.py +4 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_taskledger_v2_cli.py +339 -202
- taskledger-0.3.0/tests/test_taskledger_v2_exchange.py +1258 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_todo_implementation_gate.py +47 -170
- taskledger-0.3.0/tests/test_tree_command.py +657 -0
- taskledger-0.3.0/tests/test_workflow_guidance.py +111 -0
- taskledger-0.1.2/.github/workflows/pre-commit.yml +0 -13
- taskledger-0.1.2/.taskledger.toml +0 -20
- taskledger-0.1.2/taskledger/cli.py +0 -750
- taskledger-0.1.2/taskledger/cli_implement.py +0 -467
- taskledger-0.1.2/taskledger/cli_plan.py +0 -510
- taskledger-0.1.2/taskledger/cli_task.py +0 -403
- taskledger-0.1.2/taskledger/command_inventory.py +0 -135
- taskledger-0.1.2/taskledger/domain/models.py +0 -1777
- taskledger-0.1.2/taskledger/exchange.py +0 -370
- taskledger-0.1.2/taskledger/ids.py +0 -19
- taskledger-0.1.2/taskledger/services/doctor.py +0 -479
- taskledger-0.1.2/taskledger/services/tasks.py +0 -5098
- taskledger-0.1.2/taskledger/services/web_dashboard.py +0 -1742
- taskledger-0.1.2/taskledger/storage/migrations.py +0 -207
- taskledger-0.1.2/taskledger/storage/project_config.py +0 -393
- taskledger-0.1.2/tests/conftest.py +0 -8
- taskledger-0.1.2/tests/test_cli_command_contract.py +0 -151
- taskledger-0.1.2/tests/test_command_inventory.py +0 -78
- taskledger-0.1.2/tests/test_project_root_config.py +0 -202
- taskledger-0.1.2/tests/test_storage_migration.py +0 -429
- taskledger-0.1.2/tests/test_taskledger_v2_exchange.py +0 -373
- {taskledger-0.1.2 → taskledger-0.3.0}/.github/workflows/codecov.yml +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/.github/workflows/python-publish.yml +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/.github/workflows/tests.yml +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/.gitignore +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/.readthedocs.yaml +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/.ruff.toml +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/AGENTS.md +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/LICENSE +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/docs/Makefile +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/docs/architecture_taskledger_split.rst +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/docs/build.sh +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/docs/conf.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/docs/multi_repo.rst +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/docs/requirements.txt +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/setup.cfg +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/setup.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/__init__.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/__main__.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/__init__.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/handoff.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/introductions.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/locks.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/questions.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/releases.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/search.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/task_runs.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/cli_actor.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/cli_release.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/domain/__init__.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/errors.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/launcher.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/py.typed +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/search.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/__init__.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/actors.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/dashboard.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/handoff_lifecycle.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/phase5_lock_transfer.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/__init__.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/common.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/events.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/frontmatter.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/indexes.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/locks.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/meta.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/repos.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/timeutils.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger.egg-info/dependency_links.txt +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger.egg-info/entry_points.txt +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/taskledger.egg-info/top_level.txt +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_actor_harness_state.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_cli_import_resilience.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_domain_policies.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_events.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_legacy_cleanup_contracts.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_lifecycle_policies.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_models_v1_schema.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_plan_todo_materialization.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_question_add_many.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_search.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_storage_repos.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_task_events.py +0 -0
- {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_tasks_service_static.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"
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name: pre-commit
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
pre-commit:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
|
|
14
|
+
- uses: actions/setup-python@v5
|
|
15
|
+
with:
|
|
16
|
+
python-version: "3.13"
|
|
17
|
+
|
|
18
|
+
- uses: actions/setup-node@v4
|
|
19
|
+
with:
|
|
20
|
+
node-version: "20"
|
|
21
|
+
|
|
22
|
+
- name: Install Python tools
|
|
23
|
+
run: |
|
|
24
|
+
python -m pip install --upgrade pip
|
|
25
|
+
python -m pip install "ruff==0.15.12"
|
|
26
|
+
|
|
27
|
+
- name: Install Node tools
|
|
28
|
+
run: |
|
|
29
|
+
npm install -g prettier@2.7.1 @prettier/plugin-xml@2.2.0 eslint
|
|
30
|
+
|
|
31
|
+
- uses: pre-commit/action@v3.0.1
|
|
@@ -17,14 +17,19 @@ exclude: |
|
|
|
17
17
|
(LICENSE.*|COPYING.*)|
|
|
18
18
|
default_language_version:
|
|
19
19
|
python: python3
|
|
20
|
-
node: "16.17.0"
|
|
21
20
|
repos:
|
|
22
|
-
- repo:
|
|
23
|
-
rev: v0.15.12
|
|
21
|
+
- repo: local
|
|
24
22
|
hooks:
|
|
25
|
-
- id: ruff
|
|
26
|
-
|
|
23
|
+
- id: ruff-check
|
|
24
|
+
name: ruff check
|
|
25
|
+
entry: ruff check --fix --exit-non-zero-on-fix --config=.ruff.toml --force-exclude
|
|
26
|
+
language: system
|
|
27
|
+
types_or: [python, pyi]
|
|
27
28
|
- id: ruff-format
|
|
29
|
+
name: ruff format
|
|
30
|
+
entry: ruff format --force-exclude
|
|
31
|
+
language: system
|
|
32
|
+
types_or: [python, pyi]
|
|
28
33
|
- repo: https://github.com/asottile/pyupgrade
|
|
29
34
|
rev: v3.21.2
|
|
30
35
|
hooks:
|
|
@@ -59,11 +64,3 @@ repos:
|
|
|
59
64
|
args:
|
|
60
65
|
- --plugin=@prettier/plugin-xml
|
|
61
66
|
files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$
|
|
62
|
-
- repo: https://github.com/pre-commit/mirrors-eslint
|
|
63
|
-
rev: v10.2.1
|
|
64
|
-
hooks:
|
|
65
|
-
- id: eslint
|
|
66
|
-
verbose: true
|
|
67
|
-
args:
|
|
68
|
-
- --color
|
|
69
|
-
- --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,11 +53,15 @@ 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`
|
|
59
|
+
- `project_tree`
|
|
57
60
|
|
|
58
61
|
### `taskledger.api.tasks`
|
|
59
62
|
|
|
60
63
|
- `create_task`
|
|
64
|
+
- `record_completed_task`
|
|
61
65
|
- `show_active_task`
|
|
62
66
|
- `activate_task`
|
|
63
67
|
- `deactivate_task`
|
|
@@ -69,7 +73,10 @@ from taskledger.errors import (
|
|
|
69
73
|
- `cancel_task`
|
|
70
74
|
- `uncancel_task`
|
|
71
75
|
- `close_task`
|
|
76
|
+
- `archive_task`
|
|
77
|
+
- `unarchive_task`
|
|
72
78
|
- `create_follow_up_task`
|
|
79
|
+
- `list_archived_task_summaries`
|
|
73
80
|
- `add_requirement`
|
|
74
81
|
- `remove_requirement`
|
|
75
82
|
- `waive_requirement`
|
|
@@ -82,11 +89,14 @@ from taskledger.errors import (
|
|
|
82
89
|
- `todo_status`
|
|
83
90
|
- `next_todo`
|
|
84
91
|
- `task_dossier`
|
|
92
|
+
- `render_task_report`
|
|
93
|
+
- `TaskReportOptions`
|
|
85
94
|
- `next_action`
|
|
86
95
|
- `can_perform`
|
|
87
96
|
- `reindex`
|
|
88
97
|
- `repair_task_record`
|
|
89
98
|
- `repair_orphaned_planning_run`
|
|
99
|
+
- `repair_planning_command_changes`
|
|
90
100
|
|
|
91
101
|
### `taskledger.api.plans`
|
|
92
102
|
|
|
@@ -94,17 +104,31 @@ from taskledger.errors import (
|
|
|
94
104
|
- `propose_plan`
|
|
95
105
|
- `plan_template`
|
|
96
106
|
- `upsert_plan`
|
|
107
|
+
- `export_plan`
|
|
108
|
+
- `amend_plan`
|
|
97
109
|
- `regenerate_plan_from_answers`
|
|
98
110
|
- `materialize_plan_todos`
|
|
99
111
|
- `list_plan_versions`
|
|
100
112
|
- `show_plan`
|
|
101
113
|
- `diff_plan`
|
|
102
114
|
- `lint_plan`
|
|
115
|
+
- `plan_guidance`
|
|
103
116
|
- `approve_plan`
|
|
104
117
|
- `reject_plan`
|
|
105
118
|
- `revise_plan`
|
|
106
119
|
- `run_planning_command`
|
|
107
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
|
+
|
|
108
132
|
### `taskledger.api.questions`
|
|
109
133
|
|
|
110
134
|
- `add_question`
|
|
@@ -1,5 +1,60 @@
|
|
|
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
|
+
|
|
38
|
+
## v0.1.2 - 2026-04-30
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- Fixed orphaned planning run lifecycle recovery so plan regeneration safely finishes the latest orphaned planning run with audit evidence, plan approval rejects tasks with any running run, and `implement start` reports structured conflict details including run id, run type, lock match status, and suggested diagnostic command.
|
|
43
|
+
- Aligned `next-action` and `can implement` so they never recommend `implement start` when a running run or run/lock mismatch blocks implementation.
|
|
44
|
+
- Expanded `taskledger doctor` and `taskledger doctor locks` to report run/lock mismatches with specific repair guidance.
|
|
45
|
+
|
|
46
|
+
### Added
|
|
47
|
+
|
|
48
|
+
- Added `taskledger repair run` for guarded, reasoned, audited repair of orphaned running planning runs.
|
|
49
|
+
|
|
50
|
+
### Documentation
|
|
51
|
+
|
|
52
|
+
- Updated taskledger skill, command contract, and API docs with running-run conflict protocol and `repair run` usage.
|
|
53
|
+
|
|
54
|
+
### Quality
|
|
55
|
+
|
|
56
|
+
- Expanded regression coverage for plan regeneration recovery, approval guards, next-action alignment, doctor diagnostics, and repair lifecycle. Targeted pytest, ruff, format, and mypy passed.
|
|
57
|
+
|
|
3
58
|
## v0.1.1 - 2026-04-29
|
|
4
59
|
|
|
5
60
|
### Added
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
.PHONY: release-check
|
|
2
|
+
|
|
3
|
+
release-check:
|
|
4
|
+
python3 -m compileall -q taskledger tests
|
|
5
|
+
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python3 -m pytest -q
|
|
6
|
+
python3 -m ruff check --config=.ruff.toml .
|
|
7
|
+
python3 -m mypy taskledger
|
|
8
|
+
python3 -m build
|
|
9
|
+
python3 -m twine check dist/*
|
|
@@ -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
|
|
@@ -33,6 +33,7 @@ Provides-Extra: dev
|
|
|
33
33
|
Requires-Dist: build; extra == "dev"
|
|
34
34
|
Requires-Dist: mypy; extra == "dev"
|
|
35
35
|
Requires-Dist: pytest; extra == "dev"
|
|
36
|
+
Requires-Dist: pytest-xdist; extra == "dev"
|
|
36
37
|
Requires-Dist: ruff; extra == "dev"
|
|
37
38
|
Requires-Dist: twine; extra == "dev"
|
|
38
39
|
Requires-Dist: types-PyYAML; extra == "dev"
|
|
@@ -81,6 +82,53 @@ The supported command surface is organized as:
|
|
|
81
82
|
|
|
82
83
|
- `init`, `status`, `export`, `import`, `snapshot`, `release`
|
|
83
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
|
+
|
|
84
132
|
## Install
|
|
85
133
|
|
|
86
134
|
```bash
|
|
@@ -136,14 +184,36 @@ taskledger validate check --criterion ac-0001 --status pass --evidence "pytest -
|
|
|
136
184
|
taskledger validate finish --result passed --summary "Validated the rewrite."
|
|
137
185
|
```
|
|
138
186
|
|
|
139
|
-
|
|
140
|
-
|
|
187
|
+
To revise a proposed plan, re-enter planning and edit an exported workspace
|
|
188
|
+
copy. Never edit `.taskledger/` files directly:
|
|
141
189
|
|
|
142
190
|
```bash
|
|
143
|
-
taskledger
|
|
144
|
-
taskledger
|
|
145
|
-
|
|
146
|
-
taskledger
|
|
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
|
+
|
|
197
|
+
For manually completed work (e.g., manual testing, operations tasks, or work
|
|
198
|
+
completed outside the task-first lifecycle), use `task record` to create a
|
|
199
|
+
done task directly without acquiring lifecycle locks. **Note**: `task record`
|
|
200
|
+
does not replace the normal task lifecycle; it is for recording work already
|
|
201
|
+
completed, not as a shortcut for active task management.
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
taskledger task record "Deploy to production" --summary "Deployed v0.4.1 to prod" --change "infra/deploy.sh:run:Updated prod config" --evidence "Monitoring shows no errors"
|
|
205
|
+
taskledger task record "Manual API testing" --summary "Tested new endpoints" --allow-empty-record --reason "Exploratory testing, no formal changes tracked"
|
|
206
|
+
```
|
|
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
|
|
147
217
|
```
|
|
148
218
|
|
|
149
219
|
If validation finds an implementation bug, keep the accepted plan and restart
|
|
@@ -270,21 +340,47 @@ fresh-context transfer.
|
|
|
270
340
|
## Storage layout
|
|
271
341
|
|
|
272
342
|
`taskledger` keeps project-local configuration in the workspace root and durable
|
|
273
|
-
records under the configured storage root
|
|
343
|
+
records under the configured storage root. The checked-in `.taskledger.toml`
|
|
344
|
+
stores only a branch-scoped ledger pointer and next task number. Operational task
|
|
345
|
+
state remains ignored under `.taskledger/ledgers/<ledger_ref>/`:
|
|
274
346
|
|
|
275
347
|
```text
|
|
276
|
-
taskledger.toml
|
|
348
|
+
.taskledger.toml
|
|
277
349
|
.taskledger/
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
350
|
+
storage.yaml
|
|
351
|
+
ledgers/
|
|
352
|
+
main/
|
|
353
|
+
intros/
|
|
354
|
+
releases/
|
|
355
|
+
tasks/
|
|
356
|
+
events/
|
|
357
|
+
indexes/ # optional derived caches and registries
|
|
283
358
|
```
|
|
284
359
|
|
|
285
|
-
Markdown files are canonical. Task, plan, and run listings scan
|
|
286
|
-
|
|
287
|
-
registries and are not required for task correctness.
|
|
360
|
+
Markdown files are canonical. Task, plan, and run listings scan only the current
|
|
361
|
+
ledger by default. JSON files under the current ledger's `indexes/` directory are
|
|
362
|
+
optional derived caches or registries and are not required for task correctness.
|
|
363
|
+
|
|
364
|
+
### Branch-scoped ledgers
|
|
365
|
+
|
|
366
|
+
`.taskledger/` stays ignored and local. `.taskledger.toml` is safe to commit and
|
|
367
|
+
contains the current `ledger_ref`, optional parent ref, and the next logical task
|
|
368
|
+
number for the checked-out source branch.
|
|
369
|
+
|
|
370
|
+
When starting long-lived branch-local work, fork the ledger pointer after creating
|
|
371
|
+
the Git branch:
|
|
372
|
+
|
|
373
|
+
```bash
|
|
374
|
+
git checkout -b feature-a
|
|
375
|
+
taskledger ledger fork feature-a
|
|
376
|
+
git add .taskledger.toml
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
Returning to a branch whose `.taskledger.toml` points back to `main` hides the
|
|
380
|
+
feature branch's active task and task list. Two ledgers may both contain a logical
|
|
381
|
+
`task-0030`; this is expected because task IDs are scoped by `ledger_ref`. Use
|
|
382
|
+
`taskledger ledger adopt --from REF TASK_REF` when branch-local task history
|
|
383
|
+
should be copied into the current ledger.
|
|
288
384
|
|
|
289
385
|
You can also point `taskledger.toml` at an external storage root:
|
|
290
386
|
|
|
@@ -312,6 +408,7 @@ Use `--json` for machine-readable payloads:
|
|
|
312
408
|
taskledger --json status --full
|
|
313
409
|
taskledger --json task active
|
|
314
410
|
taskledger --json task show
|
|
411
|
+
taskledger --json task show task-0001
|
|
315
412
|
taskledger --json context --for validation --format json
|
|
316
413
|
```
|
|
317
414
|
|
|
@@ -352,6 +449,7 @@ taskledger context --for planning --format markdown
|
|
|
352
449
|
taskledger context --for implementation --format markdown
|
|
353
450
|
taskledger context --for validation --format json
|
|
354
451
|
taskledger task dossier --format markdown
|
|
452
|
+
taskledger task report --task task-0030 -o task30.md
|
|
355
453
|
taskledger handoff create --mode implementation --intended-actor agent --intended-harness codex
|
|
356
454
|
taskledger handoff claim handoff-0001
|
|
357
455
|
taskledger handoff close handoff-0001 --reason "Implementation started."
|
|
@@ -412,11 +510,39 @@ for task-first handoff guidance.
|
|
|
412
510
|
## Export, import, and snapshots
|
|
413
511
|
|
|
414
512
|
```bash
|
|
415
|
-
taskledger --
|
|
416
|
-
taskledger
|
|
513
|
+
taskledger init --project-name "Taskledger"
|
|
514
|
+
taskledger export
|
|
515
|
+
taskledger import ./taskledger-transfer.tar.gz --dry-run
|
|
516
|
+
taskledger import ./taskledger-transfer.tar.gz --replace
|
|
417
517
|
taskledger snapshot ./artifacts
|
|
418
518
|
```
|
|
419
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
|
+
|
|
535
|
+
Cross-machine imports preserve durable task/run data, but imported runtime locks
|
|
536
|
+
are quarantined by default. After importing an in-progress implementation,
|
|
537
|
+
run:
|
|
538
|
+
|
|
539
|
+
```bash
|
|
540
|
+
taskledger next-action
|
|
541
|
+
taskledger implement resume --reason "Continue imported implementation."
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
Use `--lock-policy keep` only for diagnostic full-fidelity lock restoration.
|
|
545
|
+
|
|
420
546
|
## Skill packaging
|
|
421
547
|
|
|
422
548
|
Agent workflows work best when the `taskledger` skill is installed in the
|
|
@@ -436,6 +562,15 @@ Keep this skill outside the Python package. No additional
|
|
|
436
562
|
## Development
|
|
437
563
|
|
|
438
564
|
```bash
|
|
439
|
-
pytest -
|
|
565
|
+
python -m pytest -m "not slow"
|
|
566
|
+
python -m pytest -m "not slow" -n auto
|
|
567
|
+
python -m pytest -n auto
|
|
568
|
+
python -m pytest
|
|
440
569
|
ruff check .
|
|
441
570
|
```
|
|
571
|
+
|
|
572
|
+
Full release-readiness sweep:
|
|
573
|
+
|
|
574
|
+
```bash
|
|
575
|
+
make release-check
|
|
576
|
+
```
|