tcw-cli 2.8.2__tar.gz → 3.0.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.
- tcw_cli-3.0.0/PKG-INFO +1071 -0
- tcw_cli-3.0.0/README.md +855 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/pyproject.toml +1 -1
- tcw_cli-3.0.0/tcw/__init__.py +1 -0
- tcw_cli-3.0.0/tcw/capabilities/cli.py +315 -0
- tcw_cli-3.0.0/tcw/cli.py +694 -0
- tcw_cli-3.0.0/tcw/cli_help.py +49 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw/cli_suggest.py +19 -10
- tcw_cli-3.0.0/tcw/config.py +655 -0
- tcw_cli-3.0.0/tcw/config_cli.py +287 -0
- tcw_cli-3.0.0/tcw/errors.py +89 -0
- tcw_cli-3.0.0/tcw/exit.py +14 -0
- tcw_cli-3.0.0/tcw/findings.py +24 -0
- tcw_cli-3.0.0/tcw/output.py +61 -0
- tcw_cli-3.0.0/tcw/projects_cli.py +77 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw/refs.py +66 -67
- tcw_cli-3.0.0/tcw/serve/__init__.py +6 -0
- tcw_cli-3.0.0/tcw/serve/dist/client/assets/index-BGwvKkRc.js +122 -0
- tcw_cli-2.8.2/tcw/serve/dist/client/assets/index-C5_pngMt.css → tcw_cli-3.0.0/tcw/serve/dist/client/assets/index-DkarCRfj.css +1 -1
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw/serve/dist/client/index.html +2 -2
- tcw_cli-3.0.0/tcw/serve/files.py +364 -0
- tcw_cli-3.0.0/tcw/serve/records.py +254 -0
- tcw_cli-3.0.0/tcw/serve/server.py +417 -0
- tcw_cli-3.0.0/tcw/serve/services.py +93 -0
- tcw_cli-3.0.0/tcw/serve/work.py +595 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw/stdin.py +1 -1
- tcw_cli-3.0.0/tcw/store/base.py +1016 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw/store/checkouts.py +8 -8
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw/store/config_edit.py +5 -5
- tcw_cli-3.0.0/tcw/store/fs.py +3520 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw/store/project.py +95 -75
- tcw_cli-3.0.0/tcw/store/yaml_source.py +54 -0
- tcw_cli-3.0.0/tcw/taxonomy/cli.py +201 -0
- tcw_cli-3.0.0/tcw/validate.py +695 -0
- tcw_cli-3.0.0/tcw/work/advance.py +312 -0
- tcw_cli-3.0.0/tcw/work/backend.py +113 -0
- tcw_cli-3.0.0/tcw/work/cli.py +879 -0
- tcw_cli-3.0.0/tcw/work/config.py +525 -0
- tcw_cli-3.0.0/tcw/work/fs_backend.py +566 -0
- tcw_cli-3.0.0/tcw/work/gates.py +483 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw/work/generate.py +4 -4
- tcw_cli-3.0.0/tcw/work/hooks.py +95 -0
- tcw_cli-3.0.0/tcw/work/jira/__init__.py +0 -0
- tcw_cli-3.0.0/tcw/work/jira/backend.py +1112 -0
- tcw_cli-3.0.0/tcw/work/jira/client.py +531 -0
- tcw_cli-3.0.0/tcw/work/jira/config.py +278 -0
- tcw_cli-3.0.0/tcw/work/jira/jql.py +87 -0
- tcw_cli-3.0.0/tcw/work/jira/mapping.py +315 -0
- tcw_cli-3.0.0/tcw/work/jira/remote.py +537 -0
- tcw_cli-3.0.0/tcw/work/jira/tickets.py +456 -0
- tcw_cli-3.0.0/tcw/work/layout.py +207 -0
- tcw_cli-3.0.0/tcw/work/model.py +404 -0
- tcw_cli-3.0.0/tcw/work/open.py +241 -0
- tcw_cli-3.0.0/tcw/work/passages.py +80 -0
- tcw_cli-3.0.0/tcw/work/procedures/audit-backlog.md +120 -0
- tcw_cli-3.0.0/tcw/work/procedures/create-work.md +135 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw/work/procedures/documentation-sync.md +6 -5
- tcw_cli-3.0.0/tcw/work/procedures/pause-work.md +27 -0
- tcw_cli-3.0.0/tcw/work/procedures/search.md +77 -0
- tcw_cli-3.0.0/tcw/work/procedures/triage-issues.md +211 -0
- tcw_cli-3.0.0/tcw/work/procedures/unattended-work.md +41 -0
- tcw_cli-3.0.0/tcw/work/prompts/implement.md +65 -0
- tcw_cli-3.0.0/tcw/work/prompts/inbox.md +66 -0
- tcw_cli-3.0.0/tcw/work/prompts/plan.md +53 -0
- tcw_cli-3.0.0/tcw/work/prompts/postmortem.md +52 -0
- tcw_cli-3.0.0/tcw/work/prompts/qa.md +75 -0
- tcw_cli-3.0.0/tcw/work/prompts/request.md +58 -0
- tcw_cli-3.0.0/tcw/work/prompts/review.md +59 -0
- tcw_cli-3.0.0/tcw/work/prompts/spec.md +58 -0
- tcw_cli-3.0.0/tcw/work/record.py +45 -0
- tcw_cli-3.0.0/tcw/work/references.py +88 -0
- tcw_cli-3.0.0/tcw/work/resolve.py +463 -0
- tcw_cli-3.0.0/tcw_cli.egg-info/PKG-INFO +1071 -0
- tcw_cli-3.0.0/tcw_cli.egg-info/SOURCES.txt +175 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_capabilities.py +57 -61
- tcw_cli-3.0.0/tests/test_capabilities_cli_contract.py +177 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_capabilities_federation.py +39 -37
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_capabilities_reset.py +6 -5
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_capabilities_rm.py +23 -20
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_capability_ref_wording.py +20 -17
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_check_versions.py +4 -2
- tcw_cli-3.0.0/tests/test_cli_contract.py +805 -0
- tcw_cli-3.0.0/tests/test_cli_guide.py +50 -0
- tcw_cli-3.0.0/tests/test_cli_handler.py +167 -0
- tcw_cli-3.0.0/tests/test_cli_help_standard.py +160 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_config_edit_writers.py +18 -14
- tcw_cli-3.0.0/tests/test_configuration_text_home.py +232 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_cut_version.py +11 -0
- tcw_cli-3.0.0/tests/test_doc_vocabulary.py +54 -0
- tcw_cli-3.0.0/tests/test_docs_describe_3_0.py +445 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_documentation_sync_wiring.py +4 -3
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_documented_cli_surface.py +115 -40
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_environment_hardness.py +35 -460
- tcw_cli-3.0.0/tests/test_eval_coverage.py +167 -0
- tcw_cli-3.0.0/tests/test_eval_fixture.py +413 -0
- tcw_cli-3.0.0/tests/test_eval_grading.py +827 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_eval_runner.py +141 -2
- tcw_cli-3.0.0/tests/test_findings_type.py +94 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_generate_hook.py +12 -0
- tcw_cli-3.0.0/tests/test_git_example.py +200 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_init_configured_tree_path.py +4 -4
- tcw_cli-3.0.0/tests/test_init_provision_contract.py +64 -0
- tcw_cli-3.0.0/tests/test_item_tags_read.py +62 -0
- tcw_cli-3.0.0/tests/test_ledger_3_0.py +54 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_legacy_store_config.py +35 -26
- tcw_cli-3.0.0/tests/test_lifecycle_config_tags.py +54 -0
- tcw_cli-3.0.0/tests/test_literal_store_names.py +68 -0
- tcw_cli-3.0.0/tests/test_migration_guide.py +1085 -0
- tcw_cli-3.0.0/tests/test_multiproject.py +185 -0
- tcw_cli-3.0.0/tests/test_no_node.py +104 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_override_letter_case.py +1 -11
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_override_references.py +15 -13
- tcw_cli-3.0.0/tests/test_partial_removal.py +165 -0
- tcw_cli-3.0.0/tests/test_procedure_config.py +75 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_procedure_verb.py +29 -63
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_project_overrides.py +39 -26
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_project_registry.py +70 -56
- tcw_cli-3.0.0/tests/test_projects_list.py +186 -0
- tcw_cli-3.0.0/tests/test_prompt_fallback.py +89 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_refs.py +3 -100
- tcw_cli-3.0.0/tests/test_repo_lifecycle.py +135 -0
- tcw_cli-3.0.0/tests/test_require_artifact.py +103 -0
- tcw_cli-3.0.0/tests/test_routing_nodes.py +80 -0
- tcw_cli-3.0.0/tests/test_shipped_procedures.py +125 -0
- tcw_cli-3.0.0/tests/test_shipped_prompts.py +293 -0
- tcw_cli-3.0.0/tests/test_shipped_text.py +408 -0
- tcw_cli-3.0.0/tests/test_skill_flow.py +73 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_smoke.py +9 -18
- tcw_cli-3.0.0/tests/test_stage_verb.py +175 -0
- tcw_cli-3.0.0/tests/test_static_guards.py +196 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_stdin.py +2 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_stdin_cli.py +4 -15
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_store_bounds.py +9 -62
- tcw_cli-3.0.0/tests/test_store_editor.py +800 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_store_nodes.py +19 -19
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_store_provisioning.py +261 -395
- tcw_cli-3.0.0/tests/test_suite_runs_its_own_tcw.py +24 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_taxonomy.py +98 -99
- tcw_cli-3.0.0/tests/test_taxonomy_cli_contract.py +124 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_taxonomy_rm_gaps.py +43 -33
- tcw_cli-3.0.0/tests/test_tree_store_files_only.py +109 -0
- tcw_cli-3.0.0/tests/test_tree_store_raises.py +74 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_unattended_work_skill.py +42 -2
- tcw_cli-3.0.0/tests/test_upcoming_entries.py +90 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_upstream_projects.py +74 -143
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_validate.py +37 -87
- tcw_cli-3.0.0/tests/test_validate_command.py +238 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_validate_moved_stores.py +36 -41
- tcw_cli-3.0.0/tests/test_validate_target.py +167 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_worktree_sibling_nodes.py +2 -2
- tcw_cli-2.8.2/PKG-INFO +0 -1153
- tcw_cli-2.8.2/README.md +0 -937
- tcw_cli-2.8.2/tcw/__init__.py +0 -1
- tcw_cli-2.8.2/tcw/capabilities/cli.py +0 -332
- tcw_cli-2.8.2/tcw/cli.py +0 -588
- tcw_cli-2.8.2/tcw/harness.py +0 -104
- tcw_cli-2.8.2/tcw/serve/__init__.py +0 -1680
- tcw_cli-2.8.2/tcw/serve/dist/client/assets/index-Dss8_ZG_.js +0 -128
- tcw_cli-2.8.2/tcw/serve/dist/server.cjs +0 -37079
- tcw_cli-2.8.2/tcw/serve/runtime.py +0 -195
- tcw_cli-2.8.2/tcw/store/base.py +0 -4806
- tcw_cli-2.8.2/tcw/store/fs.py +0 -8947
- tcw_cli-2.8.2/tcw/store/yaml_source.py +0 -25
- tcw_cli-2.8.2/tcw/taxonomy/cli.py +0 -224
- tcw_cli-2.8.2/tcw/tracker/__init__.py +0 -12
- tcw_cli-2.8.2/tcw/tracker/claim.py +0 -201
- tcw_cli-2.8.2/tcw/tracker/create.py +0 -208
- tcw_cli-2.8.2/tcw/tracker/intake.py +0 -815
- tcw_cli-2.8.2/tcw/tracker/jira.py +0 -439
- tcw_cli-2.8.2/tcw/tracker/ownership.py +0 -230
- tcw_cli-2.8.2/tcw/tracker/progress.py +0 -167
- tcw_cli-2.8.2/tcw/tracker/sync.py +0 -1229
- tcw_cli-2.8.2/tcw/validate.py +0 -470
- tcw_cli-2.8.2/tcw/work/cli.py +0 -5215
- tcw_cli-2.8.2/tcw/work/hooks.py +0 -142
- tcw_cli-2.8.2/tcw/work/procedures/audit-backlog.md +0 -125
- tcw_cli-2.8.2/tcw/work/procedures/consolidate-plans.md +0 -35
- tcw_cli-2.8.2/tcw/work/procedures/create-work.md +0 -158
- tcw_cli-2.8.2/tcw/work/procedures/decompose.md +0 -23
- tcw_cli-2.8.2/tcw/work/procedures/delegation.md +0 -26
- tcw_cli-2.8.2/tcw/work/procedures/post-mortem.md +0 -41
- tcw_cli-2.8.2/tcw/work/procedures/search.md +0 -75
- tcw_cli-2.8.2/tcw/work/procedures/triage-issues.md +0 -211
- tcw_cli-2.8.2/tcw/work/procedures/unattended-work.md +0 -38
- tcw_cli-2.8.2/tcw/work/projection.py +0 -236
- tcw_cli-2.8.2/tcw/work/prompts/implement.md +0 -44
- tcw_cli-2.8.2/tcw/work/prompts/inbox.md +0 -48
- tcw_cli-2.8.2/tcw/work/prompts/plan.md +0 -42
- tcw_cli-2.8.2/tcw/work/prompts/postmortem.md +0 -42
- tcw_cli-2.8.2/tcw/work/prompts/request.md +0 -41
- tcw_cli-2.8.2/tcw/work/prompts/spec.md +0 -49
- tcw_cli-2.8.2/tcw/work/prompts/verify.md +0 -41
- tcw_cli-2.8.2/tcw/work/recursion.py +0 -619
- tcw_cli-2.8.2/tcw/work/resolve.py +0 -541
- tcw_cli-2.8.2/tcw/work/templates.py +0 -179
- tcw_cli-2.8.2/tcw_cli.egg-info/PKG-INFO +0 -1153
- tcw_cli-2.8.2/tcw_cli.egg-info/SOURCES.txt +0 -230
- tcw_cli-2.8.2/tests/test_already_integrated_check.py +0 -365
- tcw_cli-2.8.2/tests/test_blocker_cycles_through_unreadable_items.py +0 -194
- tcw_cli-2.8.2/tests/test_boardless_delegate_and_slices.py +0 -80
- tcw_cli-2.8.2/tests/test_body_prompt.py +0 -238
- tcw_cli-2.8.2/tests/test_capabilities_sidecar.py +0 -74
- tcw_cli-2.8.2/tests/test_capability_gate_children.py +0 -623
- tcw_cli-2.8.2/tests/test_child_status.py +0 -649
- tcw_cli-2.8.2/tests/test_cli_help_coverage.py +0 -55
- tcw_cli-2.8.2/tests/test_configuration_text_home.py +0 -61
- tcw_cli-2.8.2/tests/test_creation_commits.py +0 -262
- tcw_cli-2.8.2/tests/test_cross_node_blocker_cycles.py +0 -239
- tcw_cli-2.8.2/tests/test_cross_node_blockers.py +0 -230
- tcw_cli-2.8.2/tests/test_damaged_state_on_edit.py +0 -125
- tcw_cli-2.8.2/tests/test_detached_worktree_teardown.py +0 -145
- tcw_cli-2.8.2/tests/test_duplicate_slug_refusals.py +0 -139
- tcw_cli-2.8.2/tests/test_edit_refusal.py +0 -176
- tcw_cli-2.8.2/tests/test_edit_type.py +0 -127
- tcw_cli-2.8.2/tests/test_epic_completability_across_checkouts.py +0 -272
- tcw_cli-2.8.2/tests/test_epic_completable.py +0 -361
- tcw_cli-2.8.2/tests/test_eval_coverage.py +0 -48
- tcw_cli-2.8.2/tests/test_eval_fixture.py +0 -316
- tcw_cli-2.8.2/tests/test_eval_grading.py +0 -302
- tcw_cli-2.8.2/tests/test_external_work_store.py +0 -1387
- tcw_cli-2.8.2/tests/test_harness.py +0 -65
- tcw_cli-2.8.2/tests/test_inbox_title.py +0 -77
- tcw_cli-2.8.2/tests/test_initiative_node_qualified.py +0 -151
- tcw_cli-2.8.2/tests/test_interrupted_claim.py +0 -413
- tcw_cli-2.8.2/tests/test_item_tags_read.py +0 -139
- tcw_cli-2.8.2/tests/test_lifecycle_baseline.py +0 -88
- tcw_cli-2.8.2/tests/test_lifecycle_config_tags.py +0 -188
- tcw_cli-2.8.2/tests/test_lifecycle_hooks.py +0 -373
- tcw_cli-2.8.2/tests/test_lifecycle_inert.py +0 -167
- tcw_cli-2.8.2/tests/test_lifecycle_policy.py +0 -401
- tcw_cli-2.8.2/tests/test_lifecycle_validation.py +0 -330
- tcw_cli-2.8.2/tests/test_literal_store_names.py +0 -114
- tcw_cli-2.8.2/tests/test_local_qualified_blockers.py +0 -133
- tcw_cli-2.8.2/tests/test_multiproject.py +0 -355
- tcw_cli-2.8.2/tests/test_non_git_writes.py +0 -1131
- tcw_cli-2.8.2/tests/test_planning_gates_after_start.py +0 -144
- tcw_cli-2.8.2/tests/test_procedure_config.py +0 -148
- tcw_cli-2.8.2/tests/test_projection.py +0 -200
- tcw_cli-2.8.2/tests/test_prompt_fallback.py +0 -107
- tcw_cli-2.8.2/tests/test_qualified_ref.py +0 -126
- tcw_cli-2.8.2/tests/test_recursion.py +0 -935
- tcw_cli-2.8.2/tests/test_rename_work_item.py +0 -453
- tcw_cli-2.8.2/tests/test_repo_lifecycle.py +0 -128
- tcw_cli-2.8.2/tests/test_resolve.py +0 -385
- tcw_cli-2.8.2/tests/test_resolve_procedure.py +0 -79
- tcw_cli-2.8.2/tests/test_retention.py +0 -1106
- tcw_cli-2.8.2/tests/test_routing_nodes.py +0 -144
- tcw_cli-2.8.2/tests/test_scaffold.py +0 -429
- tcw_cli-2.8.2/tests/test_serve.py +0 -356
- tcw_cli-2.8.2/tests/test_serve_descendants.py +0 -158
- tcw_cli-2.8.2/tests/test_serve_duplicate_slug.py +0 -47
- tcw_cli-2.8.2/tests/test_serve_projection.py +0 -129
- tcw_cli-2.8.2/tests/test_serve_resolve.py +0 -298
- tcw_cli-2.8.2/tests/test_serve_runtime.py +0 -70
- tcw_cli-2.8.2/tests/test_serve_write.py +0 -1806
- tcw_cli-2.8.2/tests/test_shipped_procedures.py +0 -165
- tcw_cli-2.8.2/tests/test_shipped_prompts.py +0 -160
- tcw_cli-2.8.2/tests/test_show_json.py +0 -177
- tcw_cli-2.8.2/tests/test_sidecar_paths_in_validate.py +0 -112
- tcw_cli-2.8.2/tests/test_skill_flow.py +0 -46
- tcw_cli-2.8.2/tests/test_skill_lifecycle_parity.py +0 -603
- tcw_cli-2.8.2/tests/test_stage_validate.py +0 -165
- tcw_cli-2.8.2/tests/test_stage_verb.py +0 -1053
- tcw_cli-2.8.2/tests/test_stale_item_path.py +0 -283
- tcw_cli-2.8.2/tests/test_status_parity.py +0 -64
- tcw_cli-2.8.2/tests/test_store_editor.py +0 -1646
- tcw_cli-2.8.2/tests/test_store_lock.py +0 -287
- tcw_cli-2.8.2/tests/test_store_publication.py +0 -683
- tcw_cli-2.8.2/tests/test_tombstone.py +0 -528
- tcw_cli-2.8.2/tests/test_tracker_absent.py +0 -188
- tcw_cli-2.8.2/tests/test_tracker_binding.py +0 -271
- tcw_cli-2.8.2/tests/test_tracker_catch_up_moves.py +0 -183
- tcw_cli-2.8.2/tests/test_tracker_claim.py +0 -278
- tcw_cli-2.8.2/tests/test_tracker_claimability.py +0 -237
- tcw_cli-2.8.2/tests/test_tracker_cli.py +0 -1714
- tcw_cli-2.8.2/tests/test_tracker_client.py +0 -503
- tcw_cli-2.8.2/tests/test_tracker_comment.py +0 -585
- tcw_cli-2.8.2/tests/test_tracker_config.py +0 -387
- tcw_cli-2.8.2/tests/test_tracker_create.py +0 -250
- tcw_cli-2.8.2/tests/test_tracker_gate.py +0 -125
- tcw_cli-2.8.2/tests/test_tracker_hardening.py +0 -195
- tcw_cli-2.8.2/tests/test_tracker_help.py +0 -133
- tcw_cli-2.8.2/tests/test_tracker_hold.py +0 -284
- tcw_cli-2.8.2/tests/test_tracker_import.py +0 -586
- tcw_cli-2.8.2/tests/test_tracker_import_returns.py +0 -162
- tcw_cli-2.8.2/tests/test_tracker_inheritance.py +0 -761
- tcw_cli-2.8.2/tests/test_tracker_link.py +0 -295
- tcw_cli-2.8.2/tests/test_tracker_message_tidy.py +0 -158
- tcw_cli-2.8.2/tests/test_tracker_ownership.py +0 -363
- tcw_cli-2.8.2/tests/test_tracker_pre_backlog.py +0 -859
- tcw_cli-2.8.2/tests/test_tracker_replay.py +0 -147
- tcw_cli-2.8.2/tests/test_tracker_strict.py +0 -1703
- tcw_cli-2.8.2/tests/test_tracker_strict_gate.py +0 -342
- tcw_cli-2.8.2/tests/test_tracker_surface.py +0 -447
- tcw_cli-2.8.2/tests/test_tracker_sync.py +0 -3134
- tcw_cli-2.8.2/tests/test_tracker_sync_config.py +0 -116
- tcw_cli-2.8.2/tests/test_tracker_validate.py +0 -355
- tcw_cli-2.8.2/tests/test_transition_hints.py +0 -214
- tcw_cli-2.8.2/tests/test_unplanned_start.py +0 -163
- tcw_cli-2.8.2/tests/test_unreadable_capabilities_sidecar.py +0 -202
- tcw_cli-2.8.2/tests/test_unreadable_item_files.py +0 -261
- tcw_cli-2.8.2/tests/test_unreadable_state_gates.py +0 -148
- tcw_cli-2.8.2/tests/test_untag_invalid_tags.py +0 -82
- tcw_cli-2.8.2/tests/test_validate_target.py +0 -140
- tcw_cli-2.8.2/tests/test_work.py +0 -2805
- tcw_cli-2.8.2/tests/test_work_autocommit.py +0 -788
- tcw_cli-2.8.2/tests/test_work_review.py +0 -406
- tcw_cli-2.8.2/tests/test_work_start.py +0 -48
- tcw_cli-2.8.2/tests/test_work_tags.py +0 -398
- tcw_cli-2.8.2/tests/test_worktree_completion.py +0 -484
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/LICENSE +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/setup.cfg +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw/capabilities/__init__.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw/serve/dist/client/theme-init.js +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw/store/__init__.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw/taxonomy/__init__.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw/work/__init__.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw_cli.egg-info/dependency_links.txt +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw_cli.egg-info/entry_points.txt +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw_cli.egg-info/requires.txt +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tcw_cli.egg-info/top_level.txt +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_command_suggestions.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_committed_paths.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_config_edit.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_documentation_config.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_documentation_prompt.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_dynamic_skill_marker.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_eval_files_changed.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_falsification_rule.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_override_in_linked_worktree.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_plugin_manifests.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_project_graph_paths.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_remote_session_setup.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_session_bootstrap.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_skill_path_pointers.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_subprocess_stdin.py +0 -0
- {tcw_cli-2.8.2 → tcw_cli-3.0.0}/tests/test_unpushed_version_script.py +0 -0
tcw_cli-3.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,1071 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: tcw-cli
|
|
3
|
+
Version: 3.0.0
|
|
4
|
+
Summary: Taxonomy · Capabilities · Work — a storage-abstracted framework for describing and evolving a software project.
|
|
5
|
+
License: Apache License
|
|
6
|
+
Version 2.0, January 2004
|
|
7
|
+
http://www.apache.org/licenses/
|
|
8
|
+
|
|
9
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
10
|
+
|
|
11
|
+
1. Definitions.
|
|
12
|
+
|
|
13
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
14
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
15
|
+
|
|
16
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
17
|
+
the copyright owner that is granting the License.
|
|
18
|
+
|
|
19
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
20
|
+
other entities that control, are controlled by, or are under common
|
|
21
|
+
control with that entity. For the purposes of this definition,
|
|
22
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
23
|
+
direction or management of such entity, whether by contract or
|
|
24
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
25
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
26
|
+
|
|
27
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
28
|
+
exercising permissions granted by this License.
|
|
29
|
+
|
|
30
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
31
|
+
including but not limited to software source code, documentation
|
|
32
|
+
source, and configuration files.
|
|
33
|
+
|
|
34
|
+
"Object" form shall mean any form resulting from mechanical
|
|
35
|
+
transformation or translation of a Source form, including but
|
|
36
|
+
not limited to compiled object code, generated documentation,
|
|
37
|
+
and conversions to other media types.
|
|
38
|
+
|
|
39
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
40
|
+
Object form, made available under the License, as indicated by a
|
|
41
|
+
copyright notice that is included in or attached to the work
|
|
42
|
+
(an example is provided in the Appendix below).
|
|
43
|
+
|
|
44
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
45
|
+
form, that is based on (or derived from) the Work and for which the
|
|
46
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
47
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
48
|
+
of this License, Derivative Works shall not include works that remain
|
|
49
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
50
|
+
the Work and Derivative Works thereof.
|
|
51
|
+
|
|
52
|
+
"Contribution" shall mean any work of authorship, including
|
|
53
|
+
the original version of the Work and any modifications or additions
|
|
54
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
55
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
56
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
57
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
58
|
+
means any form of electronic, verbal, or written communication sent
|
|
59
|
+
to the Licensor or its representatives, including but not limited to
|
|
60
|
+
communication on electronic mailing lists, source code control systems,
|
|
61
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
62
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
63
|
+
excluding communication that is conspicuously marked or otherwise
|
|
64
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
65
|
+
|
|
66
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
67
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
68
|
+
subsequently incorporated within the Work.
|
|
69
|
+
|
|
70
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
71
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
72
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
73
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
74
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
75
|
+
Work and such Derivative Works in Source or Object form.
|
|
76
|
+
|
|
77
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
78
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
79
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
80
|
+
(except as stated in this section) patent license to make, have made,
|
|
81
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
82
|
+
where such license applies only to those patent claims licensable
|
|
83
|
+
by such Contributor that are necessarily infringed by their
|
|
84
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
85
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
86
|
+
institute patent litigation against any entity (including a
|
|
87
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
88
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
89
|
+
or contributory patent infringement, then any patent licenses
|
|
90
|
+
granted to You under this License for that Work shall terminate
|
|
91
|
+
as of the date such litigation is filed.
|
|
92
|
+
|
|
93
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
94
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
95
|
+
modifications, and in Source or Object form, provided that You
|
|
96
|
+
meet the following conditions:
|
|
97
|
+
|
|
98
|
+
(a) You must give any other recipients of the Work or
|
|
99
|
+
Derivative Works a copy of this License; and
|
|
100
|
+
|
|
101
|
+
(b) You must cause any modified files to carry prominent notices
|
|
102
|
+
stating that You changed the files; and
|
|
103
|
+
|
|
104
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
105
|
+
that You distribute, all copyright, patent, trademark, and
|
|
106
|
+
attribution notices from the Source form of the Work,
|
|
107
|
+
excluding those notices that do not pertain to any part of
|
|
108
|
+
the Derivative Works; and
|
|
109
|
+
|
|
110
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
111
|
+
distribution, then any Derivative Works that You distribute must
|
|
112
|
+
include a readable copy of the attribution notices contained
|
|
113
|
+
within such NOTICE file, excluding those notices that do not
|
|
114
|
+
pertain to any part of the Derivative Works, in at least one
|
|
115
|
+
of the following places: within a NOTICE text file distributed
|
|
116
|
+
as part of the Derivative Works; within the Source form or
|
|
117
|
+
documentation, if provided along with the Derivative Works; or,
|
|
118
|
+
within a display generated by the Derivative Works, if and
|
|
119
|
+
wherever such third-party notices normally appear. The contents
|
|
120
|
+
of the NOTICE file are for informational purposes only and
|
|
121
|
+
do not modify the License. You may add Your own attribution
|
|
122
|
+
notices within Derivative Works that You distribute, alongside
|
|
123
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
124
|
+
that such additional attribution notices cannot be construed
|
|
125
|
+
as modifying the License.
|
|
126
|
+
|
|
127
|
+
You may add Your own copyright statement to Your modifications and
|
|
128
|
+
may provide additional or different license terms and conditions
|
|
129
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
130
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
131
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
132
|
+
the conditions stated in this License.
|
|
133
|
+
|
|
134
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
135
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
136
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
137
|
+
this License, without any additional terms or conditions.
|
|
138
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
139
|
+
the terms of any separate license agreement you may have executed
|
|
140
|
+
with Licensor regarding such Contributions.
|
|
141
|
+
|
|
142
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
143
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
144
|
+
except as required for reasonable and customary use in describing the
|
|
145
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
146
|
+
|
|
147
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
148
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
149
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
150
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
151
|
+
implied, including, without limitation, any warranties or conditions
|
|
152
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
153
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
154
|
+
appropriateness of using or redistributing the Work and assume any
|
|
155
|
+
risks associated with Your exercise of permissions under this License.
|
|
156
|
+
|
|
157
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
158
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
159
|
+
unless required by applicable law (such as deliberate and grossly
|
|
160
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
161
|
+
liable to You for damages, including any direct, indirect, special,
|
|
162
|
+
incidental, or consequential damages of any character arising as a
|
|
163
|
+
result of this License or out of the use or inability to use the
|
|
164
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
165
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
166
|
+
other commercial damages or losses), even if such Contributor
|
|
167
|
+
has been advised of the possibility of such damages.
|
|
168
|
+
|
|
169
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
170
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
171
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
172
|
+
or other liability obligations and/or rights consistent with this
|
|
173
|
+
License. However, in accepting such obligations, You may act only
|
|
174
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
175
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
176
|
+
defend, and hold each Contributor harmless for any liability
|
|
177
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
178
|
+
of your accepting any such warranty or additional liability.
|
|
179
|
+
|
|
180
|
+
END OF TERMS AND CONDITIONS
|
|
181
|
+
|
|
182
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
183
|
+
|
|
184
|
+
To apply the Apache License to your work, attach the following
|
|
185
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
186
|
+
replaced with your own identifying information. (Don't include
|
|
187
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
188
|
+
comment syntax for the file format. We also recommend that a
|
|
189
|
+
file or class name and description of purpose be included on the
|
|
190
|
+
same "printed page" as the copyright notice for easier
|
|
191
|
+
identification within third-party archives.
|
|
192
|
+
|
|
193
|
+
Copyright [yyyy] [name of copyright owner]
|
|
194
|
+
|
|
195
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
196
|
+
you may not use this file except in compliance with the License.
|
|
197
|
+
You may obtain a copy of the License at
|
|
198
|
+
|
|
199
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
200
|
+
|
|
201
|
+
Unless required by applicable law or agreed to in writing, software
|
|
202
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
203
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
204
|
+
See the License for the specific language governing permissions and
|
|
205
|
+
limitations under the License.
|
|
206
|
+
|
|
207
|
+
Requires-Python: >=3.11
|
|
208
|
+
Description-Content-Type: text/markdown
|
|
209
|
+
License-File: LICENSE
|
|
210
|
+
Requires-Dist: PyYAML>=6
|
|
211
|
+
Provides-Extra: dev
|
|
212
|
+
Requires-Dist: pytest; extra == "dev"
|
|
213
|
+
Requires-Dist: jsonschema; extra == "dev"
|
|
214
|
+
Requires-Dist: setuptools>=61; extra == "dev"
|
|
215
|
+
Dynamic: license-file
|
|
216
|
+
|
|
217
|
+
# TCW — Taxonomy · Capabilities · Work
|
|
218
|
+
|
|
219
|
+
TCW keeps three things about a software project inside the repository, next to
|
|
220
|
+
the code: what the project deals with, what a user can do with it, and what is
|
|
221
|
+
being changed. One command-line tool, `tcw`, and an agent plugin for Claude Code,
|
|
222
|
+
Codex, and Pi keep all three in step with the code.
|
|
223
|
+
|
|
224
|
+
| Component | Answers |
|
|
225
|
+
| ---------------- | ------------------------------------------------------- |
|
|
226
|
+
| **Taxonomy** | What things does this project deal with? |
|
|
227
|
+
| **Capabilities** | What can a user do with those things? |
|
|
228
|
+
| **Work** | What are we changing, and where does each change stand? |
|
|
229
|
+
|
|
230
|
+
## Contents
|
|
231
|
+
|
|
232
|
+
- [Problem Statement](#problem-statement)
|
|
233
|
+
- [Installation](#installation)
|
|
234
|
+
- [Plugin](#plugin)
|
|
235
|
+
- [CLI](#cli)
|
|
236
|
+
- [Cloud Environment Instructions](#cloud-environment-instructions)
|
|
237
|
+
- [Overview](#overview)
|
|
238
|
+
- [Why taxonomy and capabilities live in the repository](#why-taxonomy-and-capabilities-live-in-the-repository)
|
|
239
|
+
- [Taxonomy](#taxonomy)
|
|
240
|
+
- [Overview](#overview-1)
|
|
241
|
+
- [Usage](#usage)
|
|
242
|
+
- [Capabilities](#capabilities)
|
|
243
|
+
- [Overview](#overview-2)
|
|
244
|
+
- [Usage](#usage-1)
|
|
245
|
+
- [Work](#work)
|
|
246
|
+
- [Overview](#overview-3)
|
|
247
|
+
- [Two backends, one model](#two-backends-one-model)
|
|
248
|
+
- [Relationship to Capabilities and Taxonomy](#relationship-to-capabilities-and-taxonomy)
|
|
249
|
+
- [Stages](#stages)
|
|
250
|
+
- [Moving an item](#moving-an-item)
|
|
251
|
+
- [Usage](#usage-2)
|
|
252
|
+
- [Skills and Agents](#skills-and-agents)
|
|
253
|
+
- [TCW Local Web App](#tcw-local-web-app)
|
|
254
|
+
- [Documentation](#documentation)
|
|
255
|
+
- [Development](#development)
|
|
256
|
+
- [Setting up](#setting-up)
|
|
257
|
+
- [Running the tests](#running-the-tests)
|
|
258
|
+
- [How work is tracked here](#how-work-is-tracked-here)
|
|
259
|
+
- [Measuring the skill layer](#measuring-the-skill-layer)
|
|
260
|
+
- [Releasing](#releasing)
|
|
261
|
+
- [Reporting problems](#reporting-problems)
|
|
262
|
+
- [License](#license)
|
|
263
|
+
- [Further Reading](#further-reading)
|
|
264
|
+
|
|
265
|
+
## Problem Statement
|
|
266
|
+
|
|
267
|
+
Ask three people at a company with twenty repositories what one of those
|
|
268
|
+
repositories does, what a user can do with it, and what is being changed in it
|
|
269
|
+
right now. You get three different answers, assembled from four different places:
|
|
270
|
+
a ticket tracker that knows about work but not about the product, a wiki whose
|
|
271
|
+
glossary was last edited two years ago, a `FOLLOWUPS.md` that only grows, and
|
|
272
|
+
design documents that stopped matching the code some time back.
|
|
273
|
+
|
|
274
|
+
None of those places is wrong on purpose. They drift because none of them sits
|
|
275
|
+
next to the code, and nothing makes them move when the code moves.
|
|
276
|
+
|
|
277
|
+
TCW puts all three in the repository. One commit carries a code change and the
|
|
278
|
+
description of what it changed, and a reviewer sees both in the same diff.
|
|
279
|
+
|
|
280
|
+
## Installation
|
|
281
|
+
|
|
282
|
+
### Plugin
|
|
283
|
+
|
|
284
|
+
In **Claude Code**:
|
|
285
|
+
|
|
286
|
+
```
|
|
287
|
+
/plugin marketplace add brocef/TCW
|
|
288
|
+
/plugin install tcw
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
Or, in the Claude **web app** or **desktop app**, open the plugin directory, add
|
|
292
|
+
`brocef/TCW` as a marketplace, and install `tcw` from it — no terminal needed.
|
|
293
|
+
|
|
294
|
+
**Then start a new session.** The plugin installs the `tcw` CLI at session start
|
|
295
|
+
by installing `tcw-cli` from PyPI with `pipx`, so one installed mid-session
|
|
296
|
+
cannot run until the next one begins. That first session needs network access. It
|
|
297
|
+
installs over an existing `pipx install tcw-cli` rather than beside it, and
|
|
298
|
+
leaves a development checkout (`pip install -e .`) alone. If `tcw` goes missing
|
|
299
|
+
anyway, `pipx install tcw-cli` is the whole fix — the **`setup`** skill
|
|
300
|
+
carries the cases where it is not. When the `tcw` CLI and the plugin's skills
|
|
301
|
+
come from different releases, the session tells you which versions they are and
|
|
302
|
+
what to run to line them up; it never stops your work.
|
|
303
|
+
|
|
304
|
+
In **Codex**:
|
|
305
|
+
|
|
306
|
+
```bash
|
|
307
|
+
codex plugin marketplace add brocef/TCW --ref main
|
|
308
|
+
codex plugin add tcw@tcw
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
Codex has no session-start hook, so ask the agent to run the **`setup`**
|
|
312
|
+
skill — it runs the same install script Claude runs automatically. Every tcw
|
|
313
|
+
skill also asks the agent to run the plugin's version check once per session,
|
|
314
|
+
which warns when the CLI and the skills come from different releases.
|
|
315
|
+
|
|
316
|
+
In **Pi**:
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
pi install git:github.com/brocef/TCW
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
Add `-l` to install for the current project instead of your personal settings.
|
|
323
|
+
For a development checkout, use `pi install /absolute/path/to/TCW`.
|
|
324
|
+
Start a new Pi session, then run `/skill:setup` to install or check the `tcw`
|
|
325
|
+
CLI. You can also install it yourself with `pipx install tcw-cli`.
|
|
326
|
+
Invoke skills with `/skill:work`, `/skill:capabilities`, or `/skill:taxonomy`.
|
|
327
|
+
|
|
328
|
+
Pi loads the same skills through the official `pi` declaration in `package.json`.
|
|
329
|
+
It does not run TCW's Claude session-start hook or shell injections; the skills
|
|
330
|
+
provide explicit commands for setup, version checks, and lifecycle instructions.
|
|
331
|
+
Claude's custom review agents are not installed as Pi agents. When delegation
|
|
332
|
+
is unavailable, run ordinary lifecycle stages in the main session; autonomous
|
|
333
|
+
work still requires the advisors named by that workflow.
|
|
334
|
+
Git installation also installs the repository's Node.js package dependencies,
|
|
335
|
+
which support the TCW web app; local-path installation uses the checkout directly.
|
|
336
|
+
|
|
337
|
+
The plugin ships the skills and Claude Code read-only review agents described in
|
|
338
|
+
[Skills and Agents](#skills-and-agents).
|
|
339
|
+
|
|
340
|
+
### CLI
|
|
341
|
+
|
|
342
|
+
```sh
|
|
343
|
+
pipx install tcw-cli
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
Use this when you want the CLI without an agent harness at all. The PyPI package
|
|
347
|
+
is named **`tcw-cli`** because `tcw` was taken by an unrelated project; the
|
|
348
|
+
command it installs is still `tcw`.
|
|
349
|
+
|
|
350
|
+
Requires **Python ≥ 3.11** (its only runtime dependency is PyYAML); every
|
|
351
|
+
command, `tcw serve` included, runs on Python alone. Released wheels carry the
|
|
352
|
+
prebuilt web assets, so there is no frontend build step and no network needed
|
|
353
|
+
after install.
|
|
354
|
+
|
|
355
|
+
### Cloud Environment Instructions
|
|
356
|
+
|
|
357
|
+
A cloud agent session — Claude Code on the web, a Codex cloud task, a CI job —
|
|
358
|
+
starts from a clean image and is thrown away when it ends, so a `tcw` you install
|
|
359
|
+
by hand is gone by the next one. Install it as part of the environment's own
|
|
360
|
+
setup, and every session gets it without anyone remembering to.
|
|
361
|
+
|
|
362
|
+
**Claude Code on the web.** Add a script to your repository:
|
|
363
|
+
|
|
364
|
+
```sh
|
|
365
|
+
#!/usr/bin/env bash
|
|
366
|
+
# Make `tcw` available in a disposable agent container.
|
|
367
|
+
# Exit 0 on every path — a session must start even when this cannot finish.
|
|
368
|
+
set -u
|
|
369
|
+
|
|
370
|
+
command -v tcw >/dev/null 2>&1 && exit 0
|
|
371
|
+
|
|
372
|
+
# pipx where it exists; otherwise install into the container's own interpreter.
|
|
373
|
+
# That is the right answer *here* and nowhere else: the container is disposable
|
|
374
|
+
# and single-purpose, so there is no user environment to damage.
|
|
375
|
+
if command -v pipx >/dev/null 2>&1; then
|
|
376
|
+
pipx install tcw-cli >/dev/null 2>&1 || echo "tcw: pipx install tcw-cli failed"
|
|
377
|
+
elif ! python3 -m pip install tcw-cli >/dev/null 2>&1 &&
|
|
378
|
+
! python3 -m pip install tcw-cli --break-system-packages >/dev/null 2>&1; then
|
|
379
|
+
echo "tcw: pip install tcw-cli failed — the tcw CLI is not available."
|
|
380
|
+
fi
|
|
381
|
+
|
|
382
|
+
# An install that landed outside PATH is installed and unusable. $CLAUDE_ENV_FILE
|
|
383
|
+
# is the harness's own channel for repairing that.
|
|
384
|
+
if ! command -v tcw >/dev/null 2>&1 && [ -n "${CLAUDE_ENV_FILE:-}" ]; then
|
|
385
|
+
userbin="$(python3 -m site --user-base 2>/dev/null)/bin"
|
|
386
|
+
[ -x "$userbin/tcw" ] && echo "export PATH=\"$userbin:\$PATH\"" >>"$CLAUDE_ENV_FILE"
|
|
387
|
+
fi
|
|
388
|
+
|
|
389
|
+
exit 0
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
Then wire it to `SessionStart` in your repository's `.claude/settings.json`:
|
|
393
|
+
|
|
394
|
+
```json
|
|
395
|
+
{
|
|
396
|
+
"hooks": {
|
|
397
|
+
"SessionStart": [
|
|
398
|
+
{
|
|
399
|
+
"hooks": [
|
|
400
|
+
{
|
|
401
|
+
"type": "command",
|
|
402
|
+
"command": "\"${CLAUDE_PROJECT_DIR}\"/scripts/tcw_session_setup.sh"
|
|
403
|
+
}
|
|
404
|
+
]
|
|
405
|
+
}
|
|
406
|
+
]
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
Three things make the difference between a hook that helps and one that wastes a
|
|
412
|
+
session:
|
|
413
|
+
|
|
414
|
+
- **Exit 0 on every path, and print only on failure.** A hook that fails the
|
|
415
|
+
session start over a missing CLI has cost more than the CLI was worth.
|
|
416
|
+
- **Print to stdout.** Claude Code adds a `SessionStart` hook's stdout to the
|
|
417
|
+
agent's context, where it will be read; stderr becomes a transcript notice
|
|
418
|
+
nobody sees.
|
|
419
|
+
- **Check for `tcw` first.** The hook runs every session, including the ones
|
|
420
|
+
where a previous install is still there.
|
|
421
|
+
|
|
422
|
+
**Codex cloud.** A Codex cloud environment does not read a hook from your
|
|
423
|
+
repository. Its install steps go in the environment's **setup script**, which you
|
|
424
|
+
set in the environment's settings. Two things differ from Claude Code:
|
|
425
|
+
|
|
426
|
+
- **The setup script has internet access; the agent does not, by default.**
|
|
427
|
+
Install `tcw` in the setup script, not by asking the agent to do it later.
|
|
428
|
+
- **The setup script runs in its own shell**, so an `export` there never reaches
|
|
429
|
+
the agent. Repair `PATH` by writing to `~/.bashrc` instead.
|
|
430
|
+
|
|
431
|
+
```sh
|
|
432
|
+
if ! command -v tcw >/dev/null 2>&1; then
|
|
433
|
+
if command -v pipx >/dev/null 2>&1; then
|
|
434
|
+
pipx install tcw-cli
|
|
435
|
+
else
|
|
436
|
+
python3 -m pip install tcw-cli || python3 -m pip install tcw-cli --break-system-packages
|
|
437
|
+
fi
|
|
438
|
+
fi
|
|
439
|
+
|
|
440
|
+
# An install that landed outside PATH: make the agent's shell find it.
|
|
441
|
+
userbin="$(python3 -m site --user-base 2>/dev/null)/bin"
|
|
442
|
+
if ! command -v tcw >/dev/null 2>&1 && [ -x "$userbin/tcw" ]; then
|
|
443
|
+
echo "export PATH=\"$userbin:\$PATH\"" >>~/.bashrc
|
|
444
|
+
fi
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
**If your work store lives in another repository**, the container holds only the
|
|
448
|
+
repository it cloned, so its work items are declared but absent. Run `tcw provision`
|
|
449
|
+
after the install — it obtains what the checkout does not have, and does nothing
|
|
450
|
+
on a machine that already holds it. See
|
|
451
|
+
[Working across repositories](docs/guide/multi-repo.md).
|
|
452
|
+
|
|
453
|
+
Installing the **plugin** in a Claude Code session is a separate step from
|
|
454
|
+
installing the CLI, and only needed where the harness does not carry your plugins
|
|
455
|
+
in: append `claude plugin marketplace add brocef/TCW` and
|
|
456
|
+
`claude plugin install tcw@tcw` to the same script, guarded on `command -v claude`.
|
|
457
|
+
|
|
458
|
+
## Overview
|
|
459
|
+
|
|
460
|
+
TCW describes a project along three axes. **Taxonomy** is the project's
|
|
461
|
+
vocabulary and its features. **Capabilities** are the things a user can do,
|
|
462
|
+
each with a status. **Work** is the set of changes being made, each moving through
|
|
463
|
+
a series of stages. The three link by one-directional pointers: a capability
|
|
464
|
+
names the taxonomy entries it involves, and a work item names the capabilities
|
|
465
|
+
it changes. None of them copies another's content.
|
|
466
|
+
|
|
467
|
+
Taxonomy and capabilities are plain files in the repository, so a code change
|
|
468
|
+
and the description of what it changed travel in the same commit and the same
|
|
469
|
+
pull request. A work item is a **folder that never moves**: its stage is a
|
|
470
|
+
property recorded about it (a value, not a location), and its documents stay in
|
|
471
|
+
the same folder from the first stage to the last. Each item is addressed by its
|
|
472
|
+
**slug**, `project/folder`, such as `my-app/2026-09-15-export-invoices-as-pdf`.
|
|
473
|
+
|
|
474
|
+
**One command-line tool, `tcw`**, does everything:
|
|
475
|
+
|
|
476
|
+
| Command | What it does |
|
|
477
|
+
| ------------------------- | ----------------------------------------------------------------------------- |
|
|
478
|
+
| `tcw init` | marks a folder as a TCW project and creates the folders for each axis |
|
|
479
|
+
| `tcw provision` | obtains the stores and projects this project declares but this machine lacks |
|
|
480
|
+
| `tcw validate [--remote]` | checks every file, reference and link in the project; in a Jira-mode project the item references, stages and declared record changes are checked only with `--remote`, which also checks the Jira workflow |
|
|
481
|
+
| `tcw projects list` | lists this project and every project connected to it |
|
|
482
|
+
| `tcw config show` | prints the configuration commands run with; `--origin` says where each value came from |
|
|
483
|
+
| `tcw serve` | starts a local web app for reading and editing all three axes |
|
|
484
|
+
| `tcw taxonomy` | the vocabulary and features |
|
|
485
|
+
| `tcw capabilities` | what a user can do |
|
|
486
|
+
| `tcw work` | the changes, and the stages each one moves through |
|
|
487
|
+
|
|
488
|
+
A repository adopts TCW with one command:
|
|
489
|
+
|
|
490
|
+
```sh
|
|
491
|
+
tcw init --id my-project # all three axes
|
|
492
|
+
tcw init --id my-project taxonomy work # …or only some of them
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
That writes a `tcw-config.yaml` holding the project's ID and creates the folders
|
|
496
|
+
under `docs/`. A project can adopt the work axis alone and add the others later.
|
|
497
|
+
`tcw validate` exits non-zero on any error, so it works as a check in CI. What
|
|
498
|
+
every command prints, and its exit codes, are in
|
|
499
|
+
[the command-line guide](docs/guide/cli.md).
|
|
500
|
+
|
|
501
|
+
**The CLI enforces the rules; the agent plugin supplies the judgment.** Which
|
|
502
|
+
stage moves are allowed, references that must resolve, and the checks before an
|
|
503
|
+
item can be completed are enforced by `tcw` itself. Deciding what a request
|
|
504
|
+
means, writing a spec, or judging whether work is finished is what the plugin's
|
|
505
|
+
skills guide an agent through. See [Skills and Agents](#skills-and-agents).
|
|
506
|
+
|
|
507
|
+
**Many repositories, one model.** Projects are identified by ID, never by path.
|
|
508
|
+
A project lists the projects it is connected to under `projects` in its
|
|
509
|
+
`tcw-config.yaml`, as its `parent`, its `children`, or an `upstream` it reads.
|
|
510
|
+
It can inherit their taxonomy and capabilities, and address their work items as
|
|
511
|
+
`<project-id>/<folder>`. A parent and child each declare the other; an
|
|
512
|
+
`upstream` connection is declared only by the reader and is read-only from its
|
|
513
|
+
side, so a private project can read a public one that never names it. A
|
|
514
|
+
checkout holding only some of the connected repositories still works: a command
|
|
515
|
+
that needs an absent project says so and names `tcw provision`. See
|
|
516
|
+
[Working across repositories](docs/guide/multi-repo.md).
|
|
517
|
+
|
|
518
|
+
## Why taxonomy and capabilities live in the repository
|
|
519
|
+
|
|
520
|
+
The product's description, its vocabulary, its features and what its users can
|
|
521
|
+
do, changes in the same commit as the code that changes it. A reviewer sees both
|
|
522
|
+
in one diff, and the `implement` stage is where the description is changed, by
|
|
523
|
+
whoever writes the code.
|
|
524
|
+
|
|
525
|
+
Because the description is files in the repository, any commit shows the
|
|
526
|
+
product as it was at that moment. Anyone can read it, with nothing more than a
|
|
527
|
+
file viewer, at any point in the project's history.
|
|
528
|
+
|
|
529
|
+
That also means documentation could be generated from the records: for example,
|
|
530
|
+
a knowledge base that updates with every change and lets a reader pick any
|
|
531
|
+
point in time to see the product as it was then. TCW does not do this today; the
|
|
532
|
+
records are kept in a form that would allow it.
|
|
533
|
+
|
|
534
|
+
Tickets describe changes, and are short-lived; the records describe the product,
|
|
535
|
+
and last. So the records are never stored in Jira, whichever backend a project
|
|
536
|
+
uses for its work items.
|
|
537
|
+
|
|
538
|
+
## Taxonomy
|
|
539
|
+
|
|
540
|
+
### Overview
|
|
541
|
+
|
|
542
|
+
A taxonomy entry has one of two kinds. **Vocabulary** entries are the project's
|
|
543
|
+
basic language: `Invoice`, `Customer`, `Permission`. **Feature** entries are the
|
|
544
|
+
user- or application-facing parts that operate on that vocabulary, and each names
|
|
545
|
+
the vocabulary entries it involves. A feature can only name vocabulary that
|
|
546
|
+
already exists, so vocabulary is registered first.
|
|
547
|
+
|
|
548
|
+
Entries form a tree, and an entry's path is its address: `admin/permission` and
|
|
549
|
+
`billing/permission` are two different entries.
|
|
550
|
+
|
|
551
|
+
A project can **inherit** another project's taxonomy. Inherited entries keep the
|
|
552
|
+
other project's ID as a prefix, so an inherited `acme/permission` never quietly
|
|
553
|
+
becomes your own `permission`.
|
|
554
|
+
|
|
555
|
+
### Usage
|
|
556
|
+
|
|
557
|
+
#### Skills
|
|
558
|
+
|
|
559
|
+
| Skill | What it does |
|
|
560
|
+
| -------------------------------------- | --------------------------------------------------------------------------------------------------------- |
|
|
561
|
+
| [`taxonomy`](skills/taxonomy/SKILL.md) | Guides an agent through declaring vocabulary and features, linking them, and resolving inherited entries. |
|
|
562
|
+
|
|
563
|
+
To draft a first taxonomy from an existing codebase, use the `setup` skill
|
|
564
|
+
described in [Skills and Agents](#skills-and-agents).
|
|
565
|
+
|
|
566
|
+
#### CLI
|
|
567
|
+
|
|
568
|
+
| Command | What it does |
|
|
569
|
+
| -------------------------- | --------------------------------------------------------------------- |
|
|
570
|
+
| `tcw taxonomy list` | prints every entry's path |
|
|
571
|
+
| `tcw taxonomy add` | creates a vocabulary entry or a feature; its description from standard input |
|
|
572
|
+
| `tcw taxonomy show` | prints one entry |
|
|
573
|
+
| `tcw taxonomy path` | prints the folder the taxonomy is stored in |
|
|
574
|
+
| `tcw taxonomy rm` | removes a local entry nothing is nested under or refers to |
|
|
575
|
+
| `tcw taxonomy search` | searches entry names and descriptions |
|
|
576
|
+
| `tcw taxonomy extends add` | inherits a connected project's taxonomy (`extends rm` stops) |
|
|
577
|
+
|
|
578
|
+
Creating the taxonomy's folder is `tcw init taxonomy`, and checking it is
|
|
579
|
+
`tcw validate`.
|
|
580
|
+
|
|
581
|
+
```sh
|
|
582
|
+
echo "A bill issued to a customer." | tcw taxonomy add Invoice # vocabulary by default
|
|
583
|
+
echo "Running the shop." | tcw taxonomy add Admin
|
|
584
|
+
tcw taxonomy add Permission --parent admin # → admin/permission
|
|
585
|
+
tcw taxonomy add "PDF Export" --kind feature --vocab invoice
|
|
586
|
+
tcw taxonomy list
|
|
587
|
+
tcw taxonomy extends add acme-shared # inherit another project
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
More in [Taxonomy and Capabilities](docs/guide/taxonomy-and-capabilities.md).
|
|
591
|
+
|
|
592
|
+
## Capabilities
|
|
593
|
+
|
|
594
|
+
### Overview
|
|
595
|
+
|
|
596
|
+
A capability is one thing a user can do, such as "Download an invoice as PDF".
|
|
597
|
+
Each is addressed by a path (`billing/invoices`), gets a stable ID when created,
|
|
598
|
+
and carries a **status**: `Supported`, `Partial`, `Missing`, `Blocked` or
|
|
599
|
+
`Omitted`. The status is what makes the list useful: it says what the product
|
|
600
|
+
actually does today. The `implement` stage changes the record in the same change
|
|
601
|
+
as the code, and `Missing` means a gap the team has acknowledged, never a plan.
|
|
602
|
+
|
|
603
|
+
Capabilities can be **inherited** from another project. A web frontend and a
|
|
604
|
+
mobile app that drive the same server declare their shared capabilities once, and
|
|
605
|
+
each **overrides** only what differs, for example marking one `Omitted` or adding
|
|
606
|
+
to its description. An override can be undone to go back to the inherited
|
|
607
|
+
version.
|
|
608
|
+
|
|
609
|
+
#### Relationship to Taxonomy
|
|
610
|
+
|
|
611
|
+
A capability points at taxonomy, never the other way. Its `Subject` field names
|
|
612
|
+
the vocabulary entries it involves (any number of them), and its `Feature` field
|
|
613
|
+
names the taxonomy feature that delivers it. TCW checks that both resolve, and
|
|
614
|
+
refuses to save a capability whose references do not, so a feature is
|
|
615
|
+
registered in the taxonomy before a capability names it.
|
|
616
|
+
|
|
617
|
+
### Usage
|
|
618
|
+
|
|
619
|
+
#### Skills
|
|
620
|
+
|
|
621
|
+
| Skill | What it does |
|
|
622
|
+
| ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
623
|
+
| [`capabilities`](skills/capabilities/SKILL.md) | Guides an agent through a work item that changes what users can do: declaring the change at spec, checking it against the existing capabilities, and changing the records during implement. |
|
|
624
|
+
|
|
625
|
+
#### CLI
|
|
626
|
+
|
|
627
|
+
| Command | What it does |
|
|
628
|
+
| ------------------------------ | -------------------------------------------------------------------------------- |
|
|
629
|
+
| `tcw capabilities list` | prints every capability's path; `--status` and `--local` narrow it |
|
|
630
|
+
| `tcw capabilities show` | prints one capability |
|
|
631
|
+
| `tcw capabilities path` | prints the folder capabilities are stored in |
|
|
632
|
+
| `tcw capabilities add` | creates a capability; its body from standard input |
|
|
633
|
+
| `tcw capabilities set` | changes a capability's status or fields; on an inherited one, writes an override |
|
|
634
|
+
| `tcw capabilities reset` | removes a local override, going back to the inherited version |
|
|
635
|
+
| `tcw capabilities rm` | removes a local capability |
|
|
636
|
+
| `tcw capabilities search` | searches names and descriptions |
|
|
637
|
+
| `tcw capabilities extends add` | inherits a connected project's capabilities (`extends rm` stops) |
|
|
638
|
+
| `tcw capabilities drift` | reports inherited capabilities nobody here has ruled on, and changes finished work declared that today's records do not show |
|
|
639
|
+
|
|
640
|
+
Creating the ledger's folder is `tcw init capabilities`, and checking it is
|
|
641
|
+
`tcw validate`.
|
|
642
|
+
|
|
643
|
+
```sh
|
|
644
|
+
tcw capabilities add billing/invoices "Download an invoice as PDF" < invoices.md
|
|
645
|
+
tcw capabilities set billing/invoices --field "Subject=invoice" --field "Feature=pdf-export"
|
|
646
|
+
tcw capabilities list --status Missing
|
|
647
|
+
tcw capabilities set billing/invoices --status Supported
|
|
648
|
+
tcw capabilities extends add web-frontend # inherit another project
|
|
649
|
+
```
|
|
650
|
+
|
|
651
|
+
More in [Taxonomy and Capabilities](docs/guide/taxonomy-and-capabilities.md).
|
|
652
|
+
|
|
653
|
+
## Work
|
|
654
|
+
|
|
655
|
+
### Overview
|
|
656
|
+
|
|
657
|
+
The work axis tracks every change being made to the project: new product
|
|
658
|
+
behavior, changes to its internals, or changes to how the project itself runs.
|
|
659
|
+
|
|
660
|
+
- **A work item is a folder that never moves.** It is created in the work store
|
|
661
|
+
(`docs/work/` unless the project says otherwise) and stays there. Inside it is
|
|
662
|
+
one folder for each stage that produces something: `spec/spec.md`,
|
|
663
|
+
`implement/round-1.md`, and so on.
|
|
664
|
+
- **Every item has the same properties**: title, stage, priority, effort,
|
|
665
|
+
complexity, tags, assignee, parent and blocked-by. Tags come from a list the
|
|
666
|
+
project registers (`tcw work tags`), so a typo never quietly creates a new tag.
|
|
667
|
+
- **An item with children is an epic.** A child names its parent; `tcw work show`
|
|
668
|
+
lists an item's children, and what blocks it and what it blocks.
|
|
669
|
+
- **TCW never changes git state.** It writes an item's files and leaves
|
|
670
|
+
committing, pulling and pushing to you; a project that wants each move
|
|
671
|
+
committed adds that itself, as
|
|
672
|
+
[the configuration guide's example](docs/guide/configuration.md#example-keeping-git-in-step-with-each-stage-change-something-your-project-adds)
|
|
673
|
+
shows.
|
|
674
|
+
|
|
675
|
+
The full reference is [The Work component](docs/guide/work.md).
|
|
676
|
+
|
|
677
|
+
### Two backends, one model
|
|
678
|
+
|
|
679
|
+
A project keeps its work items with one of two **backends**, chosen by
|
|
680
|
+
`work.backend` in `tcw-config.yaml`. The model is the same in both: the same
|
|
681
|
+
stages, the same properties, the same item folders and the same commands. What
|
|
682
|
+
differs is where each fact is kept.
|
|
683
|
+
|
|
684
|
+
| Fact | Filesystem | Jira |
|
|
685
|
+
| -------------------------------------------- | ------------------------------ | ------------------------------- |
|
|
686
|
+
| the request | `request/request.md` | the ticket's description |
|
|
687
|
+
| the stage | `item.yaml` | the ticket's status |
|
|
688
|
+
| assignee, priority, effort, complexity, tags | `item.yaml` | the ticket's fields and labels |
|
|
689
|
+
| parent and blocked-by | `item.yaml` | the ticket's parent and links |
|
|
690
|
+
| comments | `comments/` in the item folder | the ticket's comments |
|
|
691
|
+
| spec, plan, rounds, handoffs | the item folder | the item folder |
|
|
692
|
+
| the records it changes, `capabilities.yaml` | the item folder | the item folder |
|
|
693
|
+
| taxonomy and capabilities | the repository | the repository |
|
|
694
|
+
|
|
695
|
+
#### Filesystem: everything in the repository
|
|
696
|
+
|
|
697
|
+
With the **filesystem** backend, the default, everything about an item is a file
|
|
698
|
+
in your repository: its properties in `item.yaml`, its request in
|
|
699
|
+
`request/request.md`, each comment in `comments/`, and its documents in its
|
|
700
|
+
stage folders. No other service is involved, and anything you can do to a file
|
|
701
|
+
(review it, diff it, grep it) you can do to your work items. See
|
|
702
|
+
[The Work component](docs/guide/work.md).
|
|
703
|
+
|
|
704
|
+
#### Jira: what people read in Jira, the technical record in the repository
|
|
705
|
+
|
|
706
|
+
With the **Jira** backend, Jira owns everything a person outside engineering
|
|
707
|
+
reads or changes: the request, the status, the assignee, the estimates, the
|
|
708
|
+
labels and the links. The repository owns the technical record: specs, plans,
|
|
709
|
+
rounds and handoffs, kept in a folder per item named after the ticket's key.
|
|
710
|
+
Nothing is copied between the two. See [Using TCW with Jira](docs/guide/jira.md).
|
|
711
|
+
|
|
712
|
+
### Relationship to Capabilities and Taxonomy
|
|
713
|
+
|
|
714
|
+
A change to the product is followed from the first request to the records:
|
|
715
|
+
|
|
716
|
+
1. The **request** states the product changes in plain prose.
|
|
717
|
+
2. The item's **`capabilities.yaml`**, written at `spec`, declares them formally:
|
|
718
|
+
the capability and taxonomy paths it adds, changes and removes.
|
|
719
|
+
3. **`implement`** changes the records, in the same change as the code.
|
|
720
|
+
4. The **records gate**, on any move into the stage after `implement`, checks
|
|
721
|
+
that the records match the declaration.
|
|
722
|
+
5. **`qa`** checks the product's behavior against the request.
|
|
723
|
+
|
|
724
|
+
In filesystem mode, the agent working `qa` may record the verdict itself, unless
|
|
725
|
+
the project's own instructions for `qa` ask for a person to decide. When they
|
|
726
|
+
do, the agent still writes the round, recording the person's decision. In Jira
|
|
727
|
+
mode, a person accepts or rejects on the ticket.
|
|
728
|
+
|
|
729
|
+
Work reaches taxonomy through those capabilities: a new capability names the
|
|
730
|
+
vocabulary and feature it involves, and those entries must exist first.
|
|
731
|
+
|
|
732
|
+
### Stages
|
|
733
|
+
|
|
734
|
+
```mermaid
|
|
735
|
+
%%{init: {"themeVariables": {"edgeLabelBackground": "#b45309", "textColor": "#ffffff"}}}%%
|
|
736
|
+
flowchart LR
|
|
737
|
+
inbox("inbox"):::stage
|
|
738
|
+
request("request"):::stage
|
|
739
|
+
spec("spec"):::optional
|
|
740
|
+
plan("plan"):::optional
|
|
741
|
+
implement("implement"):::stage
|
|
742
|
+
review("review"):::optional
|
|
743
|
+
qa("qa"):::optional
|
|
744
|
+
completed("completed"):::terminal
|
|
745
|
+
discarded("discarded"):::terminal
|
|
746
|
+
postmortem(["postmortem<br/><i>worked alongside, never moved into</i>"]):::side
|
|
747
|
+
|
|
748
|
+
inbox --> request --> spec --> plan --> implement --> review --> qa --> completed
|
|
749
|
+
review -.->|rejected| implement
|
|
750
|
+
qa -.->|rejected| implement
|
|
751
|
+
completed -.- postmortem
|
|
752
|
+
|
|
753
|
+
classDef stage fill:#1d4ed8,stroke:#93c5fd,stroke-width:2px,color:#ffffff
|
|
754
|
+
classDef optional fill:#1d4ed8,stroke:#93c5fd,stroke-width:2px,stroke-dasharray:5 4,color:#ffffff
|
|
755
|
+
classDef terminal fill:#1d4ed8,stroke:#93c5fd,stroke-width:4px,color:#ffffff
|
|
756
|
+
classDef side fill:#6b7280,stroke:#d1d5db,stroke-width:2px,stroke-dasharray:5 4,color:#ffffff
|
|
757
|
+
linkStyle default stroke:#d97706,stroke-width:2px
|
|
758
|
+
```
|
|
759
|
+
|
|
760
|
+
Dashed boxes are stages a project can turn off; an item then moves straight
|
|
761
|
+
past them. Any item can be moved to `discarded`, with a reason.
|
|
762
|
+
|
|
763
|
+
| Stage | Purpose | Writes | Can be turned off |
|
|
764
|
+
| ------------ | ---------------------------------------------------------- | ----------------------------------------- | ----------------- |
|
|
765
|
+
| `inbox` | a raw request waits to be taken on | nothing | no |
|
|
766
|
+
| `request` | what is asked for, and why | `request/request.md` (Jira: the ticket) | no |
|
|
767
|
+
| `spec` | what to build, with acceptance criteria | `spec/spec.md`, and `capabilities.yaml` | yes |
|
|
768
|
+
| `plan` | how to build it, as ordered tasks | `plan/plan.md` | yes |
|
|
769
|
+
| `implement` | build it, and change the records | `implement/round-N.md`, one per attempt | no |
|
|
770
|
+
| `review` | check the change against the spec and plan | `review/round-N.md`, each with a verdict | yes |
|
|
771
|
+
| `qa` | check the product's behavior against the request | `qa/round-N.md` (Jira: the ticket) | yes |
|
|
772
|
+
| `completed` | finished work | nothing | no |
|
|
773
|
+
| `discarded` | abandoned work, with the reason | nothing | no |
|
|
774
|
+
| `postmortem` | for a finished item: which stage could first have caught a problem | `postmortem/postmortem.md` | yes |
|
|
775
|
+
|
|
776
|
+
A project attaches its own text to a stage's instructions, its own checks before
|
|
777
|
+
an item moves into a stage, and its own commands after; see
|
|
778
|
+
[Configuration](docs/guide/configuration.md). `tcw work lifecycle` prints the
|
|
779
|
+
stages with whatever the project has attached.
|
|
780
|
+
|
|
781
|
+
### Moving an item
|
|
782
|
+
|
|
783
|
+
One command moves an item: **`tcw work advance <slug>`**, to the next stage that
|
|
784
|
+
is turned on. From `review` or `qa`, the next stage follows the verdict: accepted
|
|
785
|
+
goes forward, rejected goes back to `implement`.
|
|
786
|
+
|
|
787
|
+
- `--to <stage>` names the target. Going back needs no `--force`; going
|
|
788
|
+
forward past a stage that is turned on is a skip, and needs `--force`.
|
|
789
|
+
Reopening a `completed` or `discarded` item needs a `--reason`, and so does
|
|
790
|
+
leaving `qa` in a Jira-mode project.
|
|
791
|
+
- `--force --reason "<why>"` moves the item even when a check refuses, and
|
|
792
|
+
records the reason, and what it was forced past, as a comment on the item.
|
|
793
|
+
- `--dry-run` says where the item would go, and moves nothing.
|
|
794
|
+
- `tcw work discard <slug> --reason "<why>"` abandons an item, from any stage.
|
|
795
|
+
- **Gates** are checks that must pass first: TCW's own records gate (into the
|
|
796
|
+
stage after `implement`) and completion gate (into `completed`), and a
|
|
797
|
+
project's own `pre` hooks. A failing gate refuses the move and changes
|
|
798
|
+
nothing.
|
|
799
|
+
- After the move, the target stage's **`post` hooks** run. If one fails, the move
|
|
800
|
+
stands and `advance` exits with code 6.
|
|
801
|
+
|
|
802
|
+
The details are in [The Work component](docs/guide/work.md#moving-an-item).
|
|
803
|
+
|
|
804
|
+
### Usage
|
|
805
|
+
|
|
806
|
+
#### Skills
|
|
807
|
+
|
|
808
|
+
| Skill | What it does |
|
|
809
|
+
| -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
810
|
+
| [`work`](skills/work/SKILL.md) | Guides an agent through every stage of an item: deciding on an inbox arrival, writing the request, spec and plan, implementing, reviewing and testing, splitting large items, and filing work into another project. |
|
|
811
|
+
| [`work-create`](skills/work-create/SKILL.md) | Turns an idea for a piece of work into a work item, or adds it to the item that already covers it, after checking what is already tracked. |
|
|
812
|
+
|
|
813
|
+
Most day-to-day work starts from one of the command skills (planning an item,
|
|
814
|
+
driving it to completion, processing the inbox) described in
|
|
815
|
+
[Skills and Agents](#skills-and-agents).
|
|
816
|
+
|
|
817
|
+
#### CLI
|
|
818
|
+
|
|
819
|
+
**Items**
|
|
820
|
+
|
|
821
|
+
| Command | What it does |
|
|
822
|
+
| ------------------ | --------------------------------------------------------------- |
|
|
823
|
+
| `tcw work new` | creates an item and prints its slug; its request from standard input; `--project` creates it in another project |
|
|
824
|
+
| `tcw work list` | prints the slugs of unfinished items; `--all` adds finished ones |
|
|
825
|
+
| `tcw work show` | prints an item's properties, its request and its comments |
|
|
826
|
+
| `tcw work path` | prints the work store's folder, an item's folder, or where a stage's file goes |
|
|
827
|
+
| `tcw work edit` | changes an item's properties |
|
|
828
|
+
| `tcw work comment` | adds a comment, from standard input |
|
|
829
|
+
| `tcw work rename` | renames an item's folder |
|
|
830
|
+
| `tcw work tags` | lists, adds or removes the project's registered tags |
|
|
831
|
+
|
|
832
|
+
**Moving items**
|
|
833
|
+
|
|
834
|
+
| Command | What it does |
|
|
835
|
+
| ------------------ | ------------------------------------------------------- |
|
|
836
|
+
| `tcw work advance` | moves an item to its next stage, or to the one `--to` names |
|
|
837
|
+
| `tcw work discard` | abandons an item, with a reason |
|
|
838
|
+
|
|
839
|
+
**Stage instructions**
|
|
840
|
+
|
|
841
|
+
| Command | What it does |
|
|
842
|
+
| ------------------------ | ---------------------------------------------------------------------------------------------------------- |
|
|
843
|
+
| `tcw work stage prompt` | prints a stage's instructions, with this project's own text, for one item |
|
|
844
|
+
| `tcw work lifecycle` | prints every stage, whether it is turned on, and what this project attaches to it |
|
|
845
|
+
| `tcw work procedure` | prints one of TCW's procedures, such as `unattended-work` or `search`, with this project's own text for it |
|
|
846
|
+
| `tcw work docs` | prints the project's documentation entries: which documents a change must keep up to date |
|
|
847
|
+
|
|
848
|
+
**Jira**
|
|
849
|
+
|
|
850
|
+
| Command | What it does |
|
|
851
|
+
| ----------------------- | --------------------------------------------- |
|
|
852
|
+
| `tcw work tickets list` | prints the Jira tickets waiting to become items |
|
|
853
|
+
| `tcw work tickets adopt` | makes a Jira ticket an item |
|
|
854
|
+
|
|
855
|
+
A session with the **filesystem** backend:
|
|
856
|
+
|
|
857
|
+
```sh
|
|
858
|
+
tcw work new "Export invoices as PDF" < request.md # → my-app/2026-09-15-export-invoices-as-pdf
|
|
859
|
+
tcw work stage prompt spec 2026-09-15-export-invoices-as-pdf
|
|
860
|
+
tcw work advance 2026-09-15-export-invoices-as-pdf # request → spec
|
|
861
|
+
tcw work list --stage implement
|
|
862
|
+
tcw work advance 2026-09-15-export-invoices-as-pdf --dry-run # says where it would go
|
|
863
|
+
```
|
|
864
|
+
|
|
865
|
+
A session with the **Jira** backend:
|
|
866
|
+
|
|
867
|
+
```sh
|
|
868
|
+
tcw work tickets list # SHOP-42
|
|
869
|
+
tcw work tickets adopt SHOP-42 # → shop/SHOP-42-export-invoices-as-pdf
|
|
870
|
+
tcw work advance SHOP-42 # request → spec; the ticket moves to the status set for spec
|
|
871
|
+
tcw work show SHOP-42
|
|
872
|
+
```
|
|
873
|
+
|
|
874
|
+
Every command has `--help`, and the full reference is
|
|
875
|
+
[The Work component](docs/guide/work.md).
|
|
876
|
+
|
|
877
|
+
## Skills and Agents
|
|
878
|
+
|
|
879
|
+
The CLI enforces the rules: which moves are allowed, which references must
|
|
880
|
+
resolve, what has to be true before an item completes. What a command cannot
|
|
881
|
+
decide (what a request really asks for, whether a spec is good enough, whether
|
|
882
|
+
the work is finished) is judgment, and the plugin's skills guide an agent through
|
|
883
|
+
it. Skills name `tcw` commands and never reimplement them, and the instructions
|
|
884
|
+
for each stage come from `tcw work stage prompt`, so they work the same way under
|
|
885
|
+
Claude Code, Codex, and Pi.
|
|
886
|
+
|
|
887
|
+
The skills for a single axis are listed in that axis's section above. These cut
|
|
888
|
+
across the axes.
|
|
889
|
+
|
|
890
|
+
**Setting up and configuring**
|
|
891
|
+
|
|
892
|
+
| Skill | What it does |
|
|
893
|
+
| ---------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
894
|
+
| [`setup`](skills/setup/SKILL.md) | Gets TCW working: installs or repairs the CLI, starts using TCW in a repository, connects a project to Jira, sets up a project on a new machine, and drafts a first taxonomy or capabilities list from existing code. |
|
|
895
|
+
| [`configure`](skills/configure/SKILL.md) | Changes a working project's configuration: which stages it uses, the text and commands bound to each, the Jira backend, documentation entries, where stores live, connected and inherited projects, and personal configuration. |
|
|
896
|
+
| [`documentation-sync`](skills/documentation-sync/SKILL.md) | Decides which documents a finished change must update (README, changelogs, release notes, guides, skills), and runs the version cut when you ask for one. |
|
|
897
|
+
|
|
898
|
+
**Command skills: the everyday workflows**
|
|
899
|
+
|
|
900
|
+
| Skill | What it does |
|
|
901
|
+
| ---------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
|
|
902
|
+
| [`commands-process-inbox`](skills/commands-process-inbox/SKILL.md) | Decides on every arrival in the work inbox, then writes the request for each one taken on. |
|
|
903
|
+
| [`commands-plan-work`](skills/commands-plan-work/SKILL.md) | Takes an item, or a request made in chat, through the request, spec and plan stages, and stops before any code. |
|
|
904
|
+
| [`commands-drive-work-to-completion`](skills/commands-drive-work-to-completion/SKILL.md) | Takes an item from wherever it is through implement, review and qa, to completed where the agent may record the qa verdict, or to qa for a person where it may not. |
|
|
905
|
+
| [`commands-pause-work`](skills/commands-pause-work/SKILL.md) | Stops the work in hand, writes down what resuming needs in the item, and waits for you to say carry on. |
|
|
906
|
+
|
|
907
|
+
**Extras: optional, built for one way of working**
|
|
908
|
+
|
|
909
|
+
| Skill | What it does |
|
|
910
|
+
| ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
911
|
+
| [`extras-autonomous-work`](skills/extras-autonomous-work/SKILL.md) | Drives work items to completion unattended, asking read-only advisors wherever the lifecycle would ask you: by default Codex and a read-only subagent, replaceable by your project. |
|
|
912
|
+
| [`extras-triage-issues`](skills/extras-triage-issues/SKILL.md) | Works through **your** project's GitHub issues and turns the ones worth doing into work items. |
|
|
913
|
+
| [`extras-report`](skills/extras-report/SKILL.md) | Files a bug report or suggestion about TCW itself on [this project's issues](https://github.com/brocef/TCW/issues). |
|
|
914
|
+
|
|
915
|
+
**Agents.** Two read-only agents ship with the plugin. Neither edits a file or
|
|
916
|
+
moves an item; each reports back to the session that started it.
|
|
917
|
+
|
|
918
|
+
| Agent | What it does |
|
|
919
|
+
| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
920
|
+
| `reviewer` | For the `review` stage: reads an item's change against its spec, plan and `capabilities.yaml`, runs the project's checks, and recommends a verdict criterion by criterion; the session that started it writes the round. |
|
|
921
|
+
| `backlog-auditor` | Checks one unfinished item against your project's audit-backlog procedure, `tcw work procedure audit-backlog`, checking the item's claims against the code. |
|
|
922
|
+
|
|
923
|
+
## TCW Local Web App
|
|
924
|
+
|
|
925
|
+
`tcw serve` starts a local web app for reading and editing the project it is run
|
|
926
|
+
in, as an alternative to the command line.
|
|
927
|
+
|
|
928
|
+
```sh
|
|
929
|
+
tcw serve # http://127.0.0.1:8765/, and opens a browser
|
|
930
|
+
tcw serve --no-open # start without opening a browser
|
|
931
|
+
tcw serve --port 9000 # use a different port
|
|
932
|
+
```
|
|
933
|
+
|
|
934
|
+
- **One Python process.** The browser client is built ahead of time and shipped
|
|
935
|
+
inside the Python package, so nothing else needs to be installed, and it works
|
|
936
|
+
offline.
|
|
937
|
+
- **What you can read.** Tabs for the work board, the taxonomy and the
|
|
938
|
+
capabilities, with filters and a text search. The address bar follows the view,
|
|
939
|
+
so any page can be bookmarked or shared, and any `tcw://` reference in a
|
|
940
|
+
document is a link to its target.
|
|
941
|
+
- **What you can change.** An item's documents, rounds and handoffs, its
|
|
942
|
+
`capabilities.yaml`, its properties and comments; new work items, in this
|
|
943
|
+
project or in a connected one; and taxonomy entries and capabilities, created
|
|
944
|
+
and edited.
|
|
945
|
+
- **No stage moves.** The app shows each item's stage but never changes it, and
|
|
946
|
+
names the `tcw work advance` command to run instead.
|
|
947
|
+
- **In Jira mode**, what Jira owns (the request, comments, stage and properties)
|
|
948
|
+
is shown read-only, with **Open in Jira** to change it there, and a **Tickets**
|
|
949
|
+
view lists inbox tickets and adopts them.
|
|
950
|
+
- **One project.** The app serves the project it was started in; an item in
|
|
951
|
+
another project is shown as a labelled name.
|
|
952
|
+
- **Local only.** The server listens only on `127.0.0.1`, and refuses requests
|
|
953
|
+
that do not name a local address, which blocks other websites from making
|
|
954
|
+
changes through your browser. Two people editing the same file cannot silently
|
|
955
|
+
overwrite each other.
|
|
956
|
+
|
|
957
|
+
Everything else about the app is in
|
|
958
|
+
[The local web viewer](docs/guide/web-viewer.md).
|
|
959
|
+
|
|
960
|
+
## Documentation
|
|
961
|
+
|
|
962
|
+
| Document | Covers |
|
|
963
|
+
| --------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
964
|
+
| [The Work component](docs/guide/work.md) | Work items, their stages and folders, moving items, and every `tcw work` command, for both backends |
|
|
965
|
+
| [Using TCW with Jira](docs/guide/jira.md) | The Jira backend: who owns what, writing and following tickets, setting up, statuses, adopting tickets, QA on the ticket |
|
|
966
|
+
| [Configuration](docs/guide/configuration.md) | `tcw-config.yaml`: personal configuration, stage bindings, how hooks run, documentation entries, and the opt-in git example |
|
|
967
|
+
| [The command line](docs/guide/cli.md) | What every command prints on standard output and standard error, how to name an item, and the exit codes |
|
|
968
|
+
| [Taxonomy and Capabilities](docs/guide/taxonomy-and-capabilities.md) | Declaring vocabulary, features and capabilities, from a request to the records, drift, and inheriting both from other projects |
|
|
969
|
+
| [Working across repositories](docs/guide/multi-repo.md) | Connecting projects, creating items in another project, keeping a store in another repository, and obtaining what a checkout does not have |
|
|
970
|
+
| [Linking and validation](docs/guide/linking-and-validation.md) | `tcw://` references between objects, and `tcw validate` as a CI check |
|
|
971
|
+
| [The local web viewer](docs/guide/web-viewer.md) | Everything about `tcw serve` |
|
|
972
|
+
| [Configuration reference](skills/configure/SKILL.md) | Every configuration key, and which ones a person may override |
|
|
973
|
+
| [The abstraction rules](docs/lifecycle/abstraction.md) | Why every operation must work for a backend that is not a filesystem, in full |
|
|
974
|
+
| [Release notes](docs/release-notes/) | What changed for users in each version |
|
|
975
|
+
| Migration guides | Upgrading across a breaking release: [0.10 → 0.11](docs/migration-guide-0.10.X-to-0.11.0.md), [0.12 → 0.13](docs/migration-guide-0.12.X-to-0.13.0.md), [0.14 → 0.15](docs/migration-guide-0.14.X-to-0.15.0.md), [0.15 → 0.16](docs/migration-guide-0.15.X-to-0.16.0.md), [0.21 → 1.0](docs/migration-guide-0.21.X-to-1.0.0.md), [1.x → 2.0](docs/migration-guide-1.X-to-2.0.0.md), [2.4 → 2.5](docs/migration-guide-2.4.X-to-2.5.0.md), [2.8 → 3.0](docs/migration-guide-2.8-to-3.0.0.md) |
|
|
976
|
+
|
|
977
|
+
Every command also has `--help`.
|
|
978
|
+
|
|
979
|
+
## Development
|
|
980
|
+
|
|
981
|
+
This section is for working on TCW itself.
|
|
982
|
+
|
|
983
|
+
### Setting up
|
|
984
|
+
|
|
985
|
+
```sh
|
|
986
|
+
git clone https://github.com/brocef/TCW.git
|
|
987
|
+
cd TCW
|
|
988
|
+
pip install -e '.[dev]' # or: scripts/remote_session_setup.sh --force
|
|
989
|
+
```
|
|
990
|
+
|
|
991
|
+
`scripts/remote_session_setup.sh` installs this checkout with its development
|
|
992
|
+
dependencies and installs the `tcw` plugin from the checkout. In a Claude Code
|
|
993
|
+
remote session it runs by itself: `.claude/settings.json` wires it to
|
|
994
|
+
`SessionStart`, and also enables the `tcw` plugin for this repository. It is safe
|
|
995
|
+
to run repeatedly and prints only when something failed. It is contributor
|
|
996
|
+
tooling, not the install path for users (that is `scripts/session_bootstrap.sh`,
|
|
997
|
+
which installs the released `tcw-cli`).
|
|
998
|
+
|
|
999
|
+
TCW does not create git worktrees. If you make one with `git worktree add`, the
|
|
1000
|
+
editable install still runs the primary checkout's code, not the worktree's. How
|
|
1001
|
+
to give the worktree its own environment is in
|
|
1002
|
+
[`AGENTS.md`](AGENTS.md#working-in-a-git-worktree).
|
|
1003
|
+
|
|
1004
|
+
### Running the tests
|
|
1005
|
+
|
|
1006
|
+
```sh
|
|
1007
|
+
pytest # the Python suite; what CI runs (.github/workflows/test.yml)
|
|
1008
|
+
pnpm typecheck # formatting check, then TypeScript
|
|
1009
|
+
pnpm lint # ESLint over the web app
|
|
1010
|
+
pnpm test # web app unit tests
|
|
1011
|
+
pnpm test:e2e # Playwright end-to-end tests of the web app
|
|
1012
|
+
pnpm build # rebuild the committed web assets
|
|
1013
|
+
pnpm prettify # format source and documentation
|
|
1014
|
+
pnpm prettify:check # check formatting without changing files
|
|
1015
|
+
```
|
|
1016
|
+
|
|
1017
|
+
The `pnpm` commands need Node.js 22.12 or newer and `pnpm install` first. Python
|
|
1018
|
+
tests build their own throwaway git repositories and never read this
|
|
1019
|
+
repository's board.
|
|
1020
|
+
|
|
1021
|
+
### How work is tracked here
|
|
1022
|
+
|
|
1023
|
+
TCW tracks its own development with `tcw work`: every change is a work item under
|
|
1024
|
+
`docs/work/`, and `tcw work list` shows what is in progress. The working rules for
|
|
1025
|
+
contributors, human or agent, are in [`AGENTS.md`](AGENTS.md). This repository
|
|
1026
|
+
adds its own instructions to three stages:
|
|
1027
|
+
[`docs/lifecycle/abstraction.md`](docs/lifecycle/abstraction.md) at `spec` and
|
|
1028
|
+
`plan`, [`docs/lifecycle/harness.md`](docs/lifecycle/harness.md) at `spec` and
|
|
1029
|
+
`implement`, and [`docs/lifecycle/implementation.md`](docs/lifecycle/implementation.md)
|
|
1030
|
+
at `implement`.
|
|
1031
|
+
|
|
1032
|
+
Older design history lives in [`docs/plan/`](docs/plan/) (the original designs
|
|
1033
|
+
for each component) and [`docs/superpowers/`](docs/superpowers/); the developer
|
|
1034
|
+
changelog for each version is in [`docs/changelogs/`](docs/changelogs/).
|
|
1035
|
+
|
|
1036
|
+
### Measuring the skill layer
|
|
1037
|
+
|
|
1038
|
+
[`evals/`](evals/) holds a harness that measures whether this project's lifecycle
|
|
1039
|
+
instructions actually reach an agent, and what the plugin's skills add. The test
|
|
1040
|
+
suite cannot answer that: it can prove a skill file says the right words, but not
|
|
1041
|
+
that an agent read them. Running it starts real agent sessions and costs money;
|
|
1042
|
+
`python -m evals.run_evals --axis a --dry-run` shows what it would run.
|
|
1043
|
+
|
|
1044
|
+
### Releasing
|
|
1045
|
+
|
|
1046
|
+
`python scripts/cut_version.py <patch|minor|major|X.Y.Z>` bumps the version in all
|
|
1047
|
+
five files that carry it, combines the waiting changelog and release-note entries
|
|
1048
|
+
into that version's files, commits and tags. Each change adds its entries as its
|
|
1049
|
+
own file in `docs/changelogs/upcoming/` and `docs/release-notes/upcoming/`, named
|
|
1050
|
+
after its work item's folder name (`<folder>.md`), so changes finished on
|
|
1051
|
+
separate branches never edit the same file. Pushing the tag publishes the release to
|
|
1052
|
+
PyPI. Details, including the one-time PyPI setup, are in
|
|
1053
|
+
[`docs/releasing.md`](docs/releasing.md).
|
|
1054
|
+
|
|
1055
|
+
### Reporting problems
|
|
1056
|
+
|
|
1057
|
+
File bugs and suggestions on
|
|
1058
|
+
[GitHub issues](https://github.com/brocef/TCW/issues). With the plugin installed,
|
|
1059
|
+
the `extras-report` skill gives you a ready-to-fill template.
|
|
1060
|
+
|
|
1061
|
+
### License
|
|
1062
|
+
|
|
1063
|
+
Apache License 2.0; see [`LICENSE`](LICENSE).
|
|
1064
|
+
|
|
1065
|
+
## Further Reading
|
|
1066
|
+
|
|
1067
|
+
- [`AGENTS.md`](AGENTS.md): the working rules for contributing. Read it first.
|
|
1068
|
+
- [`docs/lifecycle/abstraction.md`](docs/lifecycle/abstraction.md): the rule that
|
|
1069
|
+
keeps TCW's model independent of the filesystem, in full.
|
|
1070
|
+
- [`docs/plan/`](docs/plan/): the original design documents for each component.
|
|
1071
|
+
- `tcw work list`: what is being changed in this repository right now.
|