tcw-cli 2.8.3__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.
Files changed (337) hide show
  1. tcw_cli-3.0.0/PKG-INFO +1071 -0
  2. tcw_cli-3.0.0/README.md +855 -0
  3. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/pyproject.toml +1 -1
  4. tcw_cli-3.0.0/tcw/__init__.py +1 -0
  5. tcw_cli-3.0.0/tcw/capabilities/cli.py +315 -0
  6. tcw_cli-3.0.0/tcw/cli.py +694 -0
  7. tcw_cli-3.0.0/tcw/cli_help.py +49 -0
  8. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw/cli_suggest.py +19 -10
  9. tcw_cli-3.0.0/tcw/config.py +655 -0
  10. tcw_cli-3.0.0/tcw/config_cli.py +287 -0
  11. tcw_cli-3.0.0/tcw/errors.py +89 -0
  12. tcw_cli-3.0.0/tcw/exit.py +14 -0
  13. tcw_cli-3.0.0/tcw/findings.py +24 -0
  14. tcw_cli-3.0.0/tcw/output.py +61 -0
  15. tcw_cli-3.0.0/tcw/projects_cli.py +77 -0
  16. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw/refs.py +66 -67
  17. tcw_cli-3.0.0/tcw/serve/__init__.py +6 -0
  18. tcw_cli-3.0.0/tcw/serve/dist/client/assets/index-BGwvKkRc.js +122 -0
  19. tcw_cli-2.8.3/tcw/serve/dist/client/assets/index-C5_pngMt.css → tcw_cli-3.0.0/tcw/serve/dist/client/assets/index-DkarCRfj.css +1 -1
  20. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw/serve/dist/client/index.html +2 -2
  21. tcw_cli-3.0.0/tcw/serve/files.py +364 -0
  22. tcw_cli-3.0.0/tcw/serve/records.py +254 -0
  23. tcw_cli-3.0.0/tcw/serve/server.py +417 -0
  24. tcw_cli-3.0.0/tcw/serve/services.py +93 -0
  25. tcw_cli-3.0.0/tcw/serve/work.py +595 -0
  26. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw/stdin.py +1 -1
  27. tcw_cli-3.0.0/tcw/store/base.py +1016 -0
  28. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw/store/checkouts.py +8 -8
  29. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw/store/config_edit.py +5 -5
  30. tcw_cli-3.0.0/tcw/store/fs.py +3520 -0
  31. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw/store/project.py +95 -75
  32. tcw_cli-3.0.0/tcw/store/yaml_source.py +54 -0
  33. tcw_cli-3.0.0/tcw/taxonomy/cli.py +201 -0
  34. tcw_cli-3.0.0/tcw/validate.py +695 -0
  35. tcw_cli-3.0.0/tcw/work/advance.py +312 -0
  36. tcw_cli-3.0.0/tcw/work/backend.py +113 -0
  37. tcw_cli-3.0.0/tcw/work/cli.py +879 -0
  38. tcw_cli-3.0.0/tcw/work/config.py +525 -0
  39. tcw_cli-3.0.0/tcw/work/fs_backend.py +566 -0
  40. tcw_cli-3.0.0/tcw/work/gates.py +483 -0
  41. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw/work/generate.py +4 -4
  42. tcw_cli-3.0.0/tcw/work/hooks.py +95 -0
  43. tcw_cli-3.0.0/tcw/work/jira/__init__.py +0 -0
  44. tcw_cli-3.0.0/tcw/work/jira/backend.py +1112 -0
  45. tcw_cli-3.0.0/tcw/work/jira/client.py +531 -0
  46. tcw_cli-3.0.0/tcw/work/jira/config.py +278 -0
  47. tcw_cli-3.0.0/tcw/work/jira/jql.py +87 -0
  48. tcw_cli-3.0.0/tcw/work/jira/mapping.py +315 -0
  49. tcw_cli-3.0.0/tcw/work/jira/remote.py +537 -0
  50. tcw_cli-3.0.0/tcw/work/jira/tickets.py +456 -0
  51. tcw_cli-3.0.0/tcw/work/layout.py +207 -0
  52. tcw_cli-3.0.0/tcw/work/model.py +404 -0
  53. tcw_cli-3.0.0/tcw/work/open.py +241 -0
  54. tcw_cli-3.0.0/tcw/work/passages.py +80 -0
  55. tcw_cli-3.0.0/tcw/work/procedures/audit-backlog.md +120 -0
  56. tcw_cli-3.0.0/tcw/work/procedures/create-work.md +135 -0
  57. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw/work/procedures/documentation-sync.md +6 -5
  58. tcw_cli-3.0.0/tcw/work/procedures/pause-work.md +27 -0
  59. tcw_cli-3.0.0/tcw/work/procedures/search.md +77 -0
  60. tcw_cli-3.0.0/tcw/work/procedures/triage-issues.md +211 -0
  61. tcw_cli-3.0.0/tcw/work/procedures/unattended-work.md +41 -0
  62. tcw_cli-3.0.0/tcw/work/prompts/implement.md +65 -0
  63. tcw_cli-3.0.0/tcw/work/prompts/inbox.md +66 -0
  64. tcw_cli-3.0.0/tcw/work/prompts/plan.md +53 -0
  65. tcw_cli-3.0.0/tcw/work/prompts/postmortem.md +52 -0
  66. tcw_cli-3.0.0/tcw/work/prompts/qa.md +75 -0
  67. tcw_cli-3.0.0/tcw/work/prompts/request.md +58 -0
  68. tcw_cli-3.0.0/tcw/work/prompts/review.md +59 -0
  69. tcw_cli-3.0.0/tcw/work/prompts/spec.md +58 -0
  70. tcw_cli-3.0.0/tcw/work/record.py +45 -0
  71. tcw_cli-3.0.0/tcw/work/references.py +88 -0
  72. tcw_cli-3.0.0/tcw/work/resolve.py +463 -0
  73. tcw_cli-3.0.0/tcw_cli.egg-info/PKG-INFO +1071 -0
  74. tcw_cli-3.0.0/tcw_cli.egg-info/SOURCES.txt +175 -0
  75. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_capabilities.py +57 -61
  76. tcw_cli-3.0.0/tests/test_capabilities_cli_contract.py +177 -0
  77. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_capabilities_federation.py +39 -37
  78. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_capabilities_reset.py +6 -5
  79. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_capabilities_rm.py +23 -20
  80. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_capability_ref_wording.py +20 -17
  81. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_check_versions.py +4 -2
  82. tcw_cli-3.0.0/tests/test_cli_contract.py +805 -0
  83. tcw_cli-3.0.0/tests/test_cli_guide.py +50 -0
  84. tcw_cli-3.0.0/tests/test_cli_handler.py +167 -0
  85. tcw_cli-3.0.0/tests/test_cli_help_standard.py +160 -0
  86. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_config_edit_writers.py +18 -14
  87. tcw_cli-3.0.0/tests/test_configuration_text_home.py +232 -0
  88. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_cut_version.py +11 -0
  89. tcw_cli-3.0.0/tests/test_doc_vocabulary.py +54 -0
  90. tcw_cli-3.0.0/tests/test_docs_describe_3_0.py +445 -0
  91. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_documentation_sync_wiring.py +4 -3
  92. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_documented_cli_surface.py +115 -40
  93. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_environment_hardness.py +35 -460
  94. tcw_cli-3.0.0/tests/test_eval_coverage.py +167 -0
  95. tcw_cli-3.0.0/tests/test_eval_fixture.py +413 -0
  96. tcw_cli-3.0.0/tests/test_eval_grading.py +827 -0
  97. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_eval_runner.py +141 -2
  98. tcw_cli-3.0.0/tests/test_findings_type.py +94 -0
  99. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_generate_hook.py +12 -0
  100. tcw_cli-3.0.0/tests/test_git_example.py +200 -0
  101. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_init_configured_tree_path.py +4 -4
  102. tcw_cli-3.0.0/tests/test_init_provision_contract.py +64 -0
  103. tcw_cli-3.0.0/tests/test_item_tags_read.py +62 -0
  104. tcw_cli-3.0.0/tests/test_ledger_3_0.py +54 -0
  105. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_legacy_store_config.py +35 -26
  106. tcw_cli-3.0.0/tests/test_lifecycle_config_tags.py +54 -0
  107. tcw_cli-3.0.0/tests/test_literal_store_names.py +68 -0
  108. tcw_cli-3.0.0/tests/test_migration_guide.py +1085 -0
  109. tcw_cli-3.0.0/tests/test_multiproject.py +185 -0
  110. tcw_cli-3.0.0/tests/test_no_node.py +104 -0
  111. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_override_letter_case.py +1 -11
  112. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_override_references.py +15 -13
  113. tcw_cli-3.0.0/tests/test_partial_removal.py +165 -0
  114. tcw_cli-3.0.0/tests/test_procedure_config.py +75 -0
  115. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_procedure_verb.py +29 -63
  116. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_project_overrides.py +39 -26
  117. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_project_registry.py +70 -56
  118. tcw_cli-3.0.0/tests/test_projects_list.py +186 -0
  119. tcw_cli-3.0.0/tests/test_prompt_fallback.py +89 -0
  120. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_refs.py +3 -100
  121. tcw_cli-3.0.0/tests/test_repo_lifecycle.py +135 -0
  122. tcw_cli-3.0.0/tests/test_require_artifact.py +103 -0
  123. tcw_cli-3.0.0/tests/test_routing_nodes.py +80 -0
  124. tcw_cli-3.0.0/tests/test_shipped_procedures.py +125 -0
  125. tcw_cli-3.0.0/tests/test_shipped_prompts.py +293 -0
  126. tcw_cli-3.0.0/tests/test_shipped_text.py +408 -0
  127. tcw_cli-3.0.0/tests/test_skill_flow.py +73 -0
  128. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_smoke.py +9 -18
  129. tcw_cli-3.0.0/tests/test_stage_verb.py +175 -0
  130. tcw_cli-3.0.0/tests/test_static_guards.py +196 -0
  131. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_stdin.py +2 -0
  132. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_stdin_cli.py +4 -15
  133. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_store_bounds.py +9 -62
  134. tcw_cli-3.0.0/tests/test_store_editor.py +800 -0
  135. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_store_nodes.py +19 -19
  136. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_store_provisioning.py +261 -395
  137. tcw_cli-3.0.0/tests/test_suite_runs_its_own_tcw.py +24 -0
  138. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_taxonomy.py +98 -99
  139. tcw_cli-3.0.0/tests/test_taxonomy_cli_contract.py +124 -0
  140. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_taxonomy_rm_gaps.py +43 -33
  141. tcw_cli-3.0.0/tests/test_tree_store_files_only.py +109 -0
  142. tcw_cli-3.0.0/tests/test_tree_store_raises.py +74 -0
  143. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_unattended_work_skill.py +42 -2
  144. tcw_cli-3.0.0/tests/test_upcoming_entries.py +90 -0
  145. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_upstream_projects.py +74 -143
  146. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_validate.py +37 -87
  147. tcw_cli-3.0.0/tests/test_validate_command.py +238 -0
  148. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_validate_moved_stores.py +36 -41
  149. tcw_cli-3.0.0/tests/test_validate_target.py +167 -0
  150. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_worktree_sibling_nodes.py +2 -2
  151. tcw_cli-2.8.3/PKG-INFO +0 -1153
  152. tcw_cli-2.8.3/README.md +0 -937
  153. tcw_cli-2.8.3/tcw/__init__.py +0 -1
  154. tcw_cli-2.8.3/tcw/capabilities/cli.py +0 -332
  155. tcw_cli-2.8.3/tcw/cli.py +0 -588
  156. tcw_cli-2.8.3/tcw/harness.py +0 -104
  157. tcw_cli-2.8.3/tcw/serve/__init__.py +0 -1680
  158. tcw_cli-2.8.3/tcw/serve/dist/client/assets/index-Dss8_ZG_.js +0 -128
  159. tcw_cli-2.8.3/tcw/serve/dist/server.cjs +0 -37079
  160. tcw_cli-2.8.3/tcw/serve/runtime.py +0 -195
  161. tcw_cli-2.8.3/tcw/store/base.py +0 -4806
  162. tcw_cli-2.8.3/tcw/store/fs.py +0 -8947
  163. tcw_cli-2.8.3/tcw/store/yaml_source.py +0 -25
  164. tcw_cli-2.8.3/tcw/taxonomy/cli.py +0 -224
  165. tcw_cli-2.8.3/tcw/tracker/__init__.py +0 -12
  166. tcw_cli-2.8.3/tcw/tracker/claim.py +0 -201
  167. tcw_cli-2.8.3/tcw/tracker/create.py +0 -208
  168. tcw_cli-2.8.3/tcw/tracker/intake.py +0 -815
  169. tcw_cli-2.8.3/tcw/tracker/jira.py +0 -443
  170. tcw_cli-2.8.3/tcw/tracker/ownership.py +0 -230
  171. tcw_cli-2.8.3/tcw/tracker/progress.py +0 -167
  172. tcw_cli-2.8.3/tcw/tracker/sync.py +0 -1229
  173. tcw_cli-2.8.3/tcw/validate.py +0 -470
  174. tcw_cli-2.8.3/tcw/work/cli.py +0 -5215
  175. tcw_cli-2.8.3/tcw/work/hooks.py +0 -142
  176. tcw_cli-2.8.3/tcw/work/procedures/audit-backlog.md +0 -125
  177. tcw_cli-2.8.3/tcw/work/procedures/consolidate-plans.md +0 -35
  178. tcw_cli-2.8.3/tcw/work/procedures/create-work.md +0 -158
  179. tcw_cli-2.8.3/tcw/work/procedures/decompose.md +0 -23
  180. tcw_cli-2.8.3/tcw/work/procedures/delegation.md +0 -26
  181. tcw_cli-2.8.3/tcw/work/procedures/post-mortem.md +0 -41
  182. tcw_cli-2.8.3/tcw/work/procedures/search.md +0 -75
  183. tcw_cli-2.8.3/tcw/work/procedures/triage-issues.md +0 -211
  184. tcw_cli-2.8.3/tcw/work/procedures/unattended-work.md +0 -38
  185. tcw_cli-2.8.3/tcw/work/projection.py +0 -236
  186. tcw_cli-2.8.3/tcw/work/prompts/implement.md +0 -44
  187. tcw_cli-2.8.3/tcw/work/prompts/inbox.md +0 -48
  188. tcw_cli-2.8.3/tcw/work/prompts/plan.md +0 -42
  189. tcw_cli-2.8.3/tcw/work/prompts/postmortem.md +0 -42
  190. tcw_cli-2.8.3/tcw/work/prompts/request.md +0 -41
  191. tcw_cli-2.8.3/tcw/work/prompts/spec.md +0 -49
  192. tcw_cli-2.8.3/tcw/work/prompts/verify.md +0 -41
  193. tcw_cli-2.8.3/tcw/work/recursion.py +0 -619
  194. tcw_cli-2.8.3/tcw/work/resolve.py +0 -541
  195. tcw_cli-2.8.3/tcw/work/templates.py +0 -179
  196. tcw_cli-2.8.3/tcw_cli.egg-info/PKG-INFO +0 -1153
  197. tcw_cli-2.8.3/tcw_cli.egg-info/SOURCES.txt +0 -230
  198. tcw_cli-2.8.3/tests/test_already_integrated_check.py +0 -365
  199. tcw_cli-2.8.3/tests/test_blocker_cycles_through_unreadable_items.py +0 -194
  200. tcw_cli-2.8.3/tests/test_boardless_delegate_and_slices.py +0 -80
  201. tcw_cli-2.8.3/tests/test_body_prompt.py +0 -238
  202. tcw_cli-2.8.3/tests/test_capabilities_sidecar.py +0 -74
  203. tcw_cli-2.8.3/tests/test_capability_gate_children.py +0 -623
  204. tcw_cli-2.8.3/tests/test_child_status.py +0 -649
  205. tcw_cli-2.8.3/tests/test_cli_help_coverage.py +0 -55
  206. tcw_cli-2.8.3/tests/test_configuration_text_home.py +0 -61
  207. tcw_cli-2.8.3/tests/test_creation_commits.py +0 -262
  208. tcw_cli-2.8.3/tests/test_cross_node_blocker_cycles.py +0 -239
  209. tcw_cli-2.8.3/tests/test_cross_node_blockers.py +0 -230
  210. tcw_cli-2.8.3/tests/test_damaged_state_on_edit.py +0 -125
  211. tcw_cli-2.8.3/tests/test_detached_worktree_teardown.py +0 -145
  212. tcw_cli-2.8.3/tests/test_duplicate_slug_refusals.py +0 -139
  213. tcw_cli-2.8.3/tests/test_edit_refusal.py +0 -176
  214. tcw_cli-2.8.3/tests/test_edit_type.py +0 -127
  215. tcw_cli-2.8.3/tests/test_epic_completability_across_checkouts.py +0 -272
  216. tcw_cli-2.8.3/tests/test_epic_completable.py +0 -361
  217. tcw_cli-2.8.3/tests/test_eval_coverage.py +0 -48
  218. tcw_cli-2.8.3/tests/test_eval_fixture.py +0 -316
  219. tcw_cli-2.8.3/tests/test_eval_grading.py +0 -302
  220. tcw_cli-2.8.3/tests/test_external_work_store.py +0 -1387
  221. tcw_cli-2.8.3/tests/test_harness.py +0 -65
  222. tcw_cli-2.8.3/tests/test_inbox_title.py +0 -77
  223. tcw_cli-2.8.3/tests/test_initiative_node_qualified.py +0 -151
  224. tcw_cli-2.8.3/tests/test_interrupted_claim.py +0 -413
  225. tcw_cli-2.8.3/tests/test_item_tags_read.py +0 -139
  226. tcw_cli-2.8.3/tests/test_lifecycle_baseline.py +0 -88
  227. tcw_cli-2.8.3/tests/test_lifecycle_config_tags.py +0 -188
  228. tcw_cli-2.8.3/tests/test_lifecycle_hooks.py +0 -373
  229. tcw_cli-2.8.3/tests/test_lifecycle_inert.py +0 -167
  230. tcw_cli-2.8.3/tests/test_lifecycle_policy.py +0 -401
  231. tcw_cli-2.8.3/tests/test_lifecycle_validation.py +0 -330
  232. tcw_cli-2.8.3/tests/test_literal_store_names.py +0 -114
  233. tcw_cli-2.8.3/tests/test_local_qualified_blockers.py +0 -133
  234. tcw_cli-2.8.3/tests/test_multiproject.py +0 -355
  235. tcw_cli-2.8.3/tests/test_non_git_writes.py +0 -1131
  236. tcw_cli-2.8.3/tests/test_planning_gates_after_start.py +0 -144
  237. tcw_cli-2.8.3/tests/test_procedure_config.py +0 -148
  238. tcw_cli-2.8.3/tests/test_projection.py +0 -200
  239. tcw_cli-2.8.3/tests/test_prompt_fallback.py +0 -107
  240. tcw_cli-2.8.3/tests/test_qualified_ref.py +0 -126
  241. tcw_cli-2.8.3/tests/test_recursion.py +0 -935
  242. tcw_cli-2.8.3/tests/test_rename_work_item.py +0 -453
  243. tcw_cli-2.8.3/tests/test_repo_lifecycle.py +0 -128
  244. tcw_cli-2.8.3/tests/test_resolve.py +0 -385
  245. tcw_cli-2.8.3/tests/test_resolve_procedure.py +0 -79
  246. tcw_cli-2.8.3/tests/test_retention.py +0 -1106
  247. tcw_cli-2.8.3/tests/test_routing_nodes.py +0 -144
  248. tcw_cli-2.8.3/tests/test_scaffold.py +0 -429
  249. tcw_cli-2.8.3/tests/test_serve.py +0 -356
  250. tcw_cli-2.8.3/tests/test_serve_descendants.py +0 -158
  251. tcw_cli-2.8.3/tests/test_serve_duplicate_slug.py +0 -47
  252. tcw_cli-2.8.3/tests/test_serve_projection.py +0 -129
  253. tcw_cli-2.8.3/tests/test_serve_resolve.py +0 -298
  254. tcw_cli-2.8.3/tests/test_serve_runtime.py +0 -70
  255. tcw_cli-2.8.3/tests/test_serve_write.py +0 -1806
  256. tcw_cli-2.8.3/tests/test_shipped_procedures.py +0 -165
  257. tcw_cli-2.8.3/tests/test_shipped_prompts.py +0 -160
  258. tcw_cli-2.8.3/tests/test_show_json.py +0 -177
  259. tcw_cli-2.8.3/tests/test_sidecar_paths_in_validate.py +0 -112
  260. tcw_cli-2.8.3/tests/test_skill_flow.py +0 -46
  261. tcw_cli-2.8.3/tests/test_skill_lifecycle_parity.py +0 -603
  262. tcw_cli-2.8.3/tests/test_stage_validate.py +0 -165
  263. tcw_cli-2.8.3/tests/test_stage_verb.py +0 -1053
  264. tcw_cli-2.8.3/tests/test_stale_item_path.py +0 -283
  265. tcw_cli-2.8.3/tests/test_status_parity.py +0 -64
  266. tcw_cli-2.8.3/tests/test_store_editor.py +0 -1646
  267. tcw_cli-2.8.3/tests/test_store_lock.py +0 -287
  268. tcw_cli-2.8.3/tests/test_store_publication.py +0 -683
  269. tcw_cli-2.8.3/tests/test_tombstone.py +0 -528
  270. tcw_cli-2.8.3/tests/test_tracker_absent.py +0 -188
  271. tcw_cli-2.8.3/tests/test_tracker_binding.py +0 -271
  272. tcw_cli-2.8.3/tests/test_tracker_catch_up_moves.py +0 -183
  273. tcw_cli-2.8.3/tests/test_tracker_claim.py +0 -278
  274. tcw_cli-2.8.3/tests/test_tracker_claimability.py +0 -237
  275. tcw_cli-2.8.3/tests/test_tracker_cli.py +0 -1714
  276. tcw_cli-2.8.3/tests/test_tracker_client.py +0 -565
  277. tcw_cli-2.8.3/tests/test_tracker_comment.py +0 -585
  278. tcw_cli-2.8.3/tests/test_tracker_config.py +0 -387
  279. tcw_cli-2.8.3/tests/test_tracker_create.py +0 -250
  280. tcw_cli-2.8.3/tests/test_tracker_gate.py +0 -125
  281. tcw_cli-2.8.3/tests/test_tracker_hardening.py +0 -195
  282. tcw_cli-2.8.3/tests/test_tracker_help.py +0 -133
  283. tcw_cli-2.8.3/tests/test_tracker_hold.py +0 -284
  284. tcw_cli-2.8.3/tests/test_tracker_import.py +0 -586
  285. tcw_cli-2.8.3/tests/test_tracker_import_returns.py +0 -162
  286. tcw_cli-2.8.3/tests/test_tracker_inheritance.py +0 -761
  287. tcw_cli-2.8.3/tests/test_tracker_link.py +0 -295
  288. tcw_cli-2.8.3/tests/test_tracker_message_tidy.py +0 -158
  289. tcw_cli-2.8.3/tests/test_tracker_ownership.py +0 -363
  290. tcw_cli-2.8.3/tests/test_tracker_pre_backlog.py +0 -859
  291. tcw_cli-2.8.3/tests/test_tracker_replay.py +0 -147
  292. tcw_cli-2.8.3/tests/test_tracker_strict.py +0 -1703
  293. tcw_cli-2.8.3/tests/test_tracker_strict_gate.py +0 -342
  294. tcw_cli-2.8.3/tests/test_tracker_surface.py +0 -447
  295. tcw_cli-2.8.3/tests/test_tracker_sync.py +0 -3134
  296. tcw_cli-2.8.3/tests/test_tracker_sync_config.py +0 -116
  297. tcw_cli-2.8.3/tests/test_tracker_validate.py +0 -355
  298. tcw_cli-2.8.3/tests/test_transition_hints.py +0 -214
  299. tcw_cli-2.8.3/tests/test_unplanned_start.py +0 -163
  300. tcw_cli-2.8.3/tests/test_unreadable_capabilities_sidecar.py +0 -202
  301. tcw_cli-2.8.3/tests/test_unreadable_item_files.py +0 -261
  302. tcw_cli-2.8.3/tests/test_unreadable_state_gates.py +0 -148
  303. tcw_cli-2.8.3/tests/test_untag_invalid_tags.py +0 -82
  304. tcw_cli-2.8.3/tests/test_validate_target.py +0 -140
  305. tcw_cli-2.8.3/tests/test_work.py +0 -2805
  306. tcw_cli-2.8.3/tests/test_work_autocommit.py +0 -788
  307. tcw_cli-2.8.3/tests/test_work_review.py +0 -406
  308. tcw_cli-2.8.3/tests/test_work_start.py +0 -48
  309. tcw_cli-2.8.3/tests/test_work_tags.py +0 -398
  310. tcw_cli-2.8.3/tests/test_worktree_completion.py +0 -484
  311. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/LICENSE +0 -0
  312. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/setup.cfg +0 -0
  313. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw/capabilities/__init__.py +0 -0
  314. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw/serve/dist/client/theme-init.js +0 -0
  315. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw/store/__init__.py +0 -0
  316. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw/taxonomy/__init__.py +0 -0
  317. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw/work/__init__.py +0 -0
  318. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw_cli.egg-info/dependency_links.txt +0 -0
  319. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw_cli.egg-info/entry_points.txt +0 -0
  320. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw_cli.egg-info/requires.txt +0 -0
  321. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tcw_cli.egg-info/top_level.txt +0 -0
  322. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_command_suggestions.py +0 -0
  323. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_committed_paths.py +0 -0
  324. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_config_edit.py +0 -0
  325. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_documentation_config.py +0 -0
  326. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_documentation_prompt.py +0 -0
  327. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_dynamic_skill_marker.py +0 -0
  328. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_eval_files_changed.py +0 -0
  329. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_falsification_rule.py +0 -0
  330. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_override_in_linked_worktree.py +0 -0
  331. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_plugin_manifests.py +0 -0
  332. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_project_graph_paths.py +0 -0
  333. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_remote_session_setup.py +0 -0
  334. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_session_bootstrap.py +0 -0
  335. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_skill_path_pointers.py +0 -0
  336. {tcw_cli-2.8.3 → tcw_cli-3.0.0}/tests/test_subprocess_stdin.py +0 -0
  337. {tcw_cli-2.8.3 → 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.