gemba-cli 0.1.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 (364) hide show
  1. gemba_cli-0.1.0/.gitignore +4 -0
  2. gemba_cli-0.1.0/CHANGELOG.md +41 -0
  3. gemba_cli-0.1.0/LICENSE +21 -0
  4. gemba_cli-0.1.0/PKG-INFO +321 -0
  5. gemba_cli-0.1.0/README.md +295 -0
  6. gemba_cli-0.1.0/pyproject.toml +74 -0
  7. gemba_cli-0.1.0/src/gemba/__init__.py +1 -0
  8. gemba_cli-0.1.0/src/gemba/assets/harness/guide.md +88 -0
  9. gemba_cli-0.1.0/src/gemba/assets/init/gemba.yaml +12 -0
  10. gemba_cli-0.1.0/src/gemba/assets/skills/gemba-archive/SKILL.md +78 -0
  11. gemba_cli-0.1.0/src/gemba/assets/skills/gemba-config/SKILL.md +176 -0
  12. gemba_cli-0.1.0/src/gemba/assets/skills/gemba-create/SKILL.md +99 -0
  13. gemba_cli-0.1.0/src/gemba/assets/skills/gemba-harness/SKILL.md +194 -0
  14. gemba_cli-0.1.0/src/gemba/assets/skills/gemba-init/SKILL.md +81 -0
  15. gemba_cli-0.1.0/src/gemba/assets/skills/gemba-list/SKILL.md +137 -0
  16. gemba_cli-0.1.0/src/gemba/assets/skills/gemba-mark/SKILL.md +88 -0
  17. gemba_cli-0.1.0/src/gemba/assets/skills/gemba-record/SKILL.md +89 -0
  18. gemba_cli-0.1.0/src/gemba/assets/skills/gemba-report/SKILL.md +149 -0
  19. gemba_cli-0.1.0/src/gemba/assets/skills/gemba-set/SKILL.md +104 -0
  20. gemba_cli-0.1.0/src/gemba/assets/skills/gemba-worktree/SKILL.md +137 -0
  21. gemba_cli-0.1.0/src/gemba/cli.py +35 -0
  22. gemba_cli-0.1.0/src/gemba/commands/__init__.py +1 -0
  23. gemba_cli-0.1.0/src/gemba/commands/archive.py +62 -0
  24. gemba_cli-0.1.0/src/gemba/commands/config.py +117 -0
  25. gemba_cli-0.1.0/src/gemba/commands/create.py +104 -0
  26. gemba_cli-0.1.0/src/gemba/commands/harness.py +534 -0
  27. gemba_cli-0.1.0/src/gemba/commands/init.py +112 -0
  28. gemba_cli-0.1.0/src/gemba/commands/list.py +51 -0
  29. gemba_cli-0.1.0/src/gemba/commands/mark.py +91 -0
  30. gemba_cli-0.1.0/src/gemba/commands/record.py +113 -0
  31. gemba_cli-0.1.0/src/gemba/commands/report.py +80 -0
  32. gemba_cli-0.1.0/src/gemba/commands/selection.py +170 -0
  33. gemba_cli-0.1.0/src/gemba/commands/set.py +81 -0
  34. gemba_cli-0.1.0/src/gemba/commands/skills.py +102 -0
  35. gemba_cli-0.1.0/src/gemba/commands/worktree.py +292 -0
  36. gemba_cli-0.1.0/src/gemba/config.py +371 -0
  37. gemba_cli-0.1.0/src/gemba/harness.py +401 -0
  38. gemba_cli-0.1.0/src/gemba/metadata.py +442 -0
  39. gemba_cli-0.1.0/src/gemba/repo.py +76 -0
  40. gemba_cli-0.1.0/src/gemba/report.py +153 -0
  41. gemba_cli-0.1.0/src/gemba/skills.py +199 -0
  42. gemba_cli-0.1.0/src/gemba/tasks.py +621 -0
  43. gemba_cli-0.1.0/src/gemba/values.py +16 -0
  44. gemba_cli-0.1.0/src/gemba/worktree.py +191 -0
  45. gemba_cli-0.1.0/tests/cases/archive/already-archived-refused.yaml +22 -0
  46. gemba_cli-0.1.0/tests/cases/archive/several-tasks-archived.yaml +38 -0
  47. gemba_cli-0.1.0/tests/cases/archive/task-archived.yaml +46 -0
  48. gemba_cli-0.1.0/tests/cases/archive/task-with-a-harness-refused.yaml +44 -0
  49. gemba_cli-0.1.0/tests/cases/archive/unknown-ref-refused.yaml +27 -0
  50. gemba_cli-0.1.0/tests/cases/config/base-blocks-accepted.yaml +61 -0
  51. gemba_cli-0.1.0/tests/cases/config/check-reports-the-problem.yaml +23 -0
  52. gemba_cli-0.1.0/tests/cases/config/check-summarizes-a-valid-config.yaml +16 -0
  53. gemba_cli-0.1.0/tests/cases/config/check-with-no-providers.yaml +14 -0
  54. gemba_cli-0.1.0/tests/cases/config/check-without-a-config.yaml +9 -0
  55. gemba_cli-0.1.0/tests/cases/config/harness-verb-blocks-accepted.yaml +63 -0
  56. gemba_cli-0.1.0/tests/cases/config/ide-absent-for-create.yaml +19 -0
  57. gemba_cli-0.1.0/tests/cases/config/malformed-base-block.yaml +40 -0
  58. gemba_cli-0.1.0/tests/cases/config/malformed-harness-block.yaml +50 -0
  59. gemba_cli-0.1.0/tests/cases/config/malformed-ide-command-refused.yaml +37 -0
  60. gemba_cli-0.1.0/tests/cases/config/malformed-mark-or-archive-block.yaml +33 -0
  61. gemba_cli-0.1.0/tests/cases/config/malformed-organization-or-branch-prefix-refused.yaml +50 -0
  62. gemba_cli-0.1.0/tests/cases/config/malformed-providers-refused.yaml +35 -0
  63. gemba_cli-0.1.0/tests/cases/config/malformed-record-or-report-block.yaml +33 -0
  64. gemba_cli-0.1.0/tests/cases/config/malformed-repos-dir-refused.yaml +37 -0
  65. gemba_cli-0.1.0/tests/cases/config/malformed-set-block.yaml +33 -0
  66. gemba_cli-0.1.0/tests/cases/config/malformed-worktree-block.yaml +50 -0
  67. gemba_cli-0.1.0/tests/cases/config/mark-and-archive-blocks-accepted.yaml +25 -0
  68. gemba_cli-0.1.0/tests/cases/config/missing-or-unknown-type-refused.yaml +34 -0
  69. gemba_cli-0.1.0/tests/cases/config/one-type-per-field-name.yaml +50 -0
  70. gemba_cli-0.1.0/tests/cases/config/organization-and-repos-dir-accepted.yaml +22 -0
  71. gemba_cli-0.1.0/tests/cases/config/providers-absent-for-create.yaml +19 -0
  72. gemba_cli-0.1.0/tests/cases/config/record-and-report-blocks-accepted.yaml +25 -0
  73. gemba_cli-0.1.0/tests/cases/config/repeated-provider-refused.yaml +11 -0
  74. gemba_cli-0.1.0/tests/cases/config/reserved-field-name-refused.yaml +30 -0
  75. gemba_cli-0.1.0/tests/cases/config/set-block-accepted.yaml +24 -0
  76. gemba_cli-0.1.0/tests/cases/config/show-combines-the-levels.yaml +85 -0
  77. gemba_cli-0.1.0/tests/cases/config/show-from-inside-a-harness.yaml +55 -0
  78. gemba_cli-0.1.0/tests/cases/config/show-one-workstream.yaml +47 -0
  79. gemba_cli-0.1.0/tests/cases/config/show-prints-the-effective-config.yaml +59 -0
  80. gemba_cli-0.1.0/tests/cases/config/show-refuses-an-invalid-config.yaml +11 -0
  81. gemba_cli-0.1.0/tests/cases/config/show-unknown-workstream-refused.yaml +11 -0
  82. gemba_cli-0.1.0/tests/cases/config/unknown-provider-refused.yaml +11 -0
  83. gemba_cli-0.1.0/tests/cases/config/unsupported-declaration-key-refused.yaml +16 -0
  84. gemba_cli-0.1.0/tests/cases/config/worktree-keys-absent-for-create.yaml +19 -0
  85. gemba_cli-0.1.0/tests/cases/config/worktree-verb-blocks-accepted.yaml +28 -0
  86. gemba_cli-0.1.0/tests/cases/create/all-declared-keys-present.yaml +28 -0
  87. gemba_cli-0.1.0/tests/cases/create/archived-refs-are-counted.yaml +22 -0
  88. gemba_cli-0.1.0/tests/cases/create/archived-task.yaml +46 -0
  89. gemba_cli-0.1.0/tests/cases/create/body-of-a-new-task.yaml +21 -0
  90. gemba_cli-0.1.0/tests/cases/create/built-in-process-ignores-meaning.yaml +22 -0
  91. gemba_cli-0.1.0/tests/cases/create/command-run-from-subfolder.yaml +22 -0
  92. gemba_cli-0.1.0/tests/cases/create/complete-creation.yaml +33 -0
  93. gemba_cli-0.1.0/tests/cases/create/consecutive-refs-within-workstream.yaml +50 -0
  94. gemba_cli-0.1.0/tests/cases/create/create-rules-applied.yaml +34 -0
  95. gemba_cli-0.1.0/tests/cases/create/default-date.yaml +19 -0
  96. gemba_cli-0.1.0/tests/cases/create/default-names-missing-workstream.yaml +20 -0
  97. gemba_cli-0.1.0/tests/cases/create/done-requested-at-creation.yaml +29 -0
  98. gemba_cli-0.1.0/tests/cases/create/duplicate-prefix.yaml +12 -0
  99. gemba_cli-0.1.0/tests/cases/create/external-key-offered-as-ref.yaml +27 -0
  100. gemba_cli-0.1.0/tests/cases/create/filename-with-valid-slug.yaml +20 -0
  101. gemba_cli-0.1.0/tests/cases/create/first-task-of-a-new-workstream.yaml +25 -0
  102. gemba_cli-0.1.0/tests/cases/create/first-task-of-a-prefix.yaml +46 -0
  103. gemba_cli-0.1.0/tests/cases/create/frontmatter-of-a-new-task.yaml +29 -0
  104. gemba_cli-0.1.0/tests/cases/create/invalid-field-name.yaml +28 -0
  105. gemba_cli-0.1.0/tests/cases/create/invalid-identifier-or-prefix.yaml +59 -0
  106. gemba_cli-0.1.0/tests/cases/create/invalid-slug.yaml +76 -0
  107. gemba_cli-0.1.0/tests/cases/create/invalid-status-value.yaml +12 -0
  108. gemba_cli-0.1.0/tests/cases/create/list-value.yaml +25 -0
  109. gemba_cli-0.1.0/tests/cases/create/malformed-yaml.yaml +12 -0
  110. gemba_cli-0.1.0/tests/cases/create/minimal-declaration.yaml +21 -0
  111. gemba_cli-0.1.0/tests/cases/create/missing-description.yaml +23 -0
  112. gemba_cli-0.1.0/tests/cases/create/missing-required-keys-reported-together.yaml +37 -0
  113. gemba_cli-0.1.0/tests/cases/create/moved-task-keeps-its-ref.yaml +38 -0
  114. gemba_cli-0.1.0/tests/cases/create/no-config-found.yaml +8 -0
  115. gemba_cli-0.1.0/tests/cases/create/no-metadata-declared-anywhere.yaml +18 -0
  116. gemba_cli-0.1.0/tests/cases/create/repeated-key-becomes-list.yaml +22 -0
  117. gemba_cli-0.1.0/tests/cases/create/repeated-key-on-a-field-that-is-not-text.yaml +12 -0
  118. gemba_cli-0.1.0/tests/cases/create/repeated-name-within-one-list.yaml +30 -0
  119. gemba_cli-0.1.0/tests/cases/create/required-field-with-description.yaml +40 -0
  120. gemba_cli-0.1.0/tests/cases/create/target-path-already-exists.yaml +15 -0
  121. gemba_cli-0.1.0/tests/cases/create/task-created-without-description.yaml +19 -0
  122. gemba_cli-0.1.0/tests/cases/create/task-placed-in-workstream-folder.yaml +23 -0
  123. gemba_cli-0.1.0/tests/cases/create/text-kept-as-written.yaml +23 -0
  124. gemba_cli-0.1.0/tests/cases/create/two-consecutive-creations.yaml +51 -0
  125. gemba_cli-0.1.0/tests/cases/create/typed-metadata-values.yaml +31 -0
  126. gemba_cli-0.1.0/tests/cases/create/undeclared-key-in-metadata.yaml +13 -0
  127. gemba_cli-0.1.0/tests/cases/create/undeclared-key.yaml +11 -0
  128. gemba_cli-0.1.0/tests/cases/create/union-of-base-and-workstream-fields.yaml +32 -0
  129. gemba_cli-0.1.0/tests/cases/create/unknown-process-block-ignored.yaml +24 -0
  130. gemba_cli-0.1.0/tests/cases/create/unknown-workstream.yaml +11 -0
  131. gemba_cli-0.1.0/tests/cases/create/valid-catalogue.yaml +10 -0
  132. gemba_cli-0.1.0/tests/cases/create/values-of-the-wrong-type-refused.yaml +21 -0
  133. gemba_cli-0.1.0/tests/cases/create/workstream-added-by-editing-config.yaml +28 -0
  134. gemba_cli-0.1.0/tests/cases/create/workstream-overrides-base-field.yaml +44 -0
  135. gemba_cli-0.1.0/tests/cases/create/workstream-removed-from-config.yaml +12 -0
  136. gemba_cli-0.1.0/tests/cases/harness/already-filed-note-refused.yaml +30 -0
  137. gemba_cli-0.1.0/tests/cases/harness/approval-refused-for-ungated-types.yaml +80 -0
  138. gemba_cli-0.1.0/tests/cases/harness/approved-note-resolved.yaml +42 -0
  139. gemba_cli-0.1.0/tests/cases/harness/archived-or-done-task-refused.yaml +46 -0
  140. gemba_cli-0.1.0/tests/cases/harness/decision-gated-on-request.yaml +57 -0
  141. gemba_cli-0.1.0/tests/cases/harness/draft-outside-notes-or-misnamed-refused.yaml +51 -0
  142. gemba_cli-0.1.0/tests/cases/harness/external-action-always-gated.yaml +26 -0
  143. gemba_cli-0.1.0/tests/cases/harness/folder-that-is-not-a-worktree-refused.yaml +27 -0
  144. gemba_cli-0.1.0/tests/cases/harness/folder-without-harness-config-refused.yaml +24 -0
  145. gemba_cli-0.1.0/tests/cases/harness/force-does-not-cover-the-working-directory.yaml +25 -0
  146. gemba_cli-0.1.0/tests/cases/harness/frontmatter-of-a-gated-note-with-assets.yaml +59 -0
  147. gemba_cli-0.1.0/tests/cases/harness/guide-explains-the-worktree-rules.yaml +31 -0
  148. gemba_cli-0.1.0/tests/cases/harness/guide-names-the-always-rules.yaml +38 -0
  149. gemba_cli-0.1.0/tests/cases/harness/guide-per-declared-provider.yaml +29 -0
  150. gemba_cli-0.1.0/tests/cases/harness/harness-config-written.yaml +28 -0
  151. gemba_cli-0.1.0/tests/cases/harness/harness-layout-created.yaml +44 -0
  152. gemba_cli-0.1.0/tests/cases/harness/harness-removed-with-its-worktrees.yaml +53 -0
  153. gemba_cli-0.1.0/tests/cases/harness/harness-removed.yaml +47 -0
  154. gemba_cli-0.1.0/tests/cases/harness/harness-repository-initialized.yaml +39 -0
  155. gemba_cli-0.1.0/tests/cases/harness/harness-resolved-from-the-working-directory.yaml +30 -0
  156. gemba_cli-0.1.0/tests/cases/harness/harness-skills-carry-their-provenance.yaml +33 -0
  157. gemba_cli-0.1.0/tests/cases/harness/ide-opened.yaml +58 -0
  158. gemba_cli-0.1.0/tests/cases/harness/manifest-shown-without-deleting.yaml +44 -0
  159. gemba_cli-0.1.0/tests/cases/harness/missing-or-misplaced-asset-refused.yaml +54 -0
  160. gemba_cli-0.1.0/tests/cases/harness/no-harness-found.yaml +27 -0
  161. gemba_cli-0.1.0/tests/cases/harness/no-harness-to-remove.yaml +45 -0
  162. gemba_cli-0.1.0/tests/cases/harness/no-ide-declared.yaml +25 -0
  163. gemba_cli-0.1.0/tests/cases/harness/no-providers-declared.yaml +21 -0
  164. gemba_cli-0.1.0/tests/cases/harness/note-committed.yaml +27 -0
  165. gemba_cli-0.1.0/tests/cases/harness/note-filed.yaml +60 -0
  166. gemba_cli-0.1.0/tests/cases/harness/open-skipped.yaml +26 -0
  167. gemba_cli-0.1.0/tests/cases/harness/open-task-started.yaml +93 -0
  168. gemba_cli-0.1.0/tests/cases/harness/organization-and-workstream-sections-rendered.yaml +29 -0
  169. gemba_cli-0.1.0/tests/cases/harness/organization-section-rendered.yaml +25 -0
  170. gemba_cli-0.1.0/tests/cases/harness/orphan-branch-of-the-run-deleted.yaml +46 -0
  171. gemba_cli-0.1.0/tests/cases/harness/orphan-branch-with-pending-work-refused.yaml +40 -0
  172. gemba_cli-0.1.0/tests/cases/harness/pending-work-discarded-with-force.yaml +49 -0
  173. gemba_cli-0.1.0/tests/cases/harness/relaunch.yaml +27 -0
  174. gemba_cli-0.1.0/tests/cases/harness/removed-harness-relaunched.yaml +30 -0
  175. gemba_cli-0.1.0/tests/cases/harness/reopened-task-started-on-relaunch.yaml +29 -0
  176. gemba_cli-0.1.0/tests/cases/harness/same-guide-for-every-provider.yaml +251 -0
  177. gemba_cli-0.1.0/tests/cases/harness/task-already-in-progress-or-blocked.yaml +69 -0
  178. gemba_cli-0.1.0/tests/cases/harness/task-linked.yaml +26 -0
  179. gemba_cli-0.1.0/tests/cases/harness/unapproved-note-refused.yaml +33 -0
  180. gemba_cli-0.1.0/tests/cases/harness/uncommitted-paths-deleted-with-the-harness.yaml +50 -0
  181. gemba_cli-0.1.0/tests/cases/harness/uncommitted-paths-listed-in-the-manifest.yaml +40 -0
  182. gemba_cli-0.1.0/tests/cases/harness/ungated-or-resolved-note-refused.yaml +67 -0
  183. gemba_cli-0.1.0/tests/cases/harness/unknown-ref-refused.yaml +22 -0
  184. gemba_cli-0.1.0/tests/cases/harness/unknown-type-refused.yaml +26 -0
  185. gemba_cli-0.1.0/tests/cases/harness/working-directory-inside-the-harness-refused.yaml +27 -0
  186. gemba_cli-0.1.0/tests/cases/harness/workstream-section-rendered.yaml +27 -0
  187. gemba_cli-0.1.0/tests/cases/harness/worktree-with-pending-work-refused.yaml +77 -0
  188. gemba_cli-0.1.0/tests/cases/init/existing-skill-kept.yaml +64 -0
  189. gemba_cli-0.1.0/tests/cases/init/invalid-config-refused.yaml +27 -0
  190. gemba_cli-0.1.0/tests/cases/init/missing-pieces-completed.yaml +40 -0
  191. gemba_cli-0.1.0/tests/cases/init/nested-tasks-repo-refused.yaml +29 -0
  192. gemba_cli-0.1.0/tests/cases/init/no-git-repository-created.yaml +7 -0
  193. gemba_cli-0.1.0/tests/cases/init/providers-refused-with-existing-config.yaml +12 -0
  194. gemba_cli-0.1.0/tests/cases/init/providers-selected.yaml +10 -0
  195. gemba_cli-0.1.0/tests/cases/init/scaffolded-at-a-path.yaml +44 -0
  196. gemba_cli-0.1.0/tests/cases/init/scaffolded-config-accepted.yaml +12 -0
  197. gemba_cli-0.1.0/tests/cases/init/second-run-changes-nothing.yaml +31 -0
  198. gemba_cli-0.1.0/tests/cases/init/tasks-repo-scaffolded.yaml +69 -0
  199. gemba_cli-0.1.0/tests/cases/init/unknown-provider-refused.yaml +15 -0
  200. gemba_cli-0.1.0/tests/cases/list/archived-task.yaml +65 -0
  201. gemba_cli-0.1.0/tests/cases/list/archived-tasks-excluded-by-default.yaml +44 -0
  202. gemba_cli-0.1.0/tests/cases/list/archived-tasks-included-on-request.yaml +55 -0
  203. gemba_cli-0.1.0/tests/cases/list/candidates-for-a-past-day.yaml +96 -0
  204. gemba_cli-0.1.0/tests/cases/list/complete-record.yaml +97 -0
  205. gemba_cli-0.1.0/tests/cases/list/completion-date-range.yaml +56 -0
  206. gemba_cli-0.1.0/tests/cases/list/configured-workstream-without-a-folder.yaml +35 -0
  207. gemba_cli-0.1.0/tests/cases/list/creation-date-range.yaml +74 -0
  208. gemba_cli-0.1.0/tests/cases/list/description-absent.yaml +34 -0
  209. gemba_cli-0.1.0/tests/cases/list/description-extracted.yaml +38 -0
  210. gemba_cli-0.1.0/tests/cases/list/display-title-derived-from-the-filename.yaml +36 -0
  211. gemba_cli-0.1.0/tests/cases/list/done-task-record.yaml +37 -0
  212. gemba_cli-0.1.0/tests/cases/list/empty-result.yaml +42 -0
  213. gemba_cli-0.1.0/tests/cases/list/filters-combine-as-conditions.yaml +54 -0
  214. gemba_cli-0.1.0/tests/cases/list/fixed-order.yaml +74 -0
  215. gemba_cli-0.1.0/tests/cases/list/folder-that-is-not-a-configured-workstream.yaml +45 -0
  216. gemba_cli-0.1.0/tests/cases/list/invalid-config-stops-the-listing.yaml +38 -0
  217. gemba_cli-0.1.0/tests/cases/list/invalid-date-field.yaml +50 -0
  218. gemba_cli-0.1.0/tests/cases/list/invalid-date-filter.yaml +43 -0
  219. gemba_cli-0.1.0/tests/cases/list/invalid-file-does-not-stop-the-listing.yaml +45 -0
  220. gemba_cli-0.1.0/tests/cases/list/invalid-filters-reported-together.yaml +21 -0
  221. gemba_cli-0.1.0/tests/cases/list/invalid-metadata-conditions-refused.yaml +32 -0
  222. gemba_cli-0.1.0/tests/cases/list/invalid-status-filter.yaml +21 -0
  223. gemba_cli-0.1.0/tests/cases/list/invalid-status-value.yaml +26 -0
  224. gemba_cli-0.1.0/tests/cases/list/key-declared-in-one-workstream-only.yaml +80 -0
  225. gemba_cli-0.1.0/tests/cases/list/list-membership.yaml +65 -0
  226. gemba_cli-0.1.0/tests/cases/list/malformed-process-block.yaml +35 -0
  227. gemba_cli-0.1.0/tests/cases/list/metadata-keys-outside-the-current-schema.yaml +44 -0
  228. gemba_cli-0.1.0/tests/cases/list/metadata-not-a-map.yaml +76 -0
  229. gemba_cli-0.1.0/tests/cases/list/metadata-values-keep-their-type.yaml +44 -0
  230. gemba_cli-0.1.0/tests/cases/list/missing-key-reads-as-null.yaml +60 -0
  231. gemba_cli-0.1.0/tests/cases/list/missing-or-unparseable-frontmatter.yaml +75 -0
  232. gemba_cli-0.1.0/tests/cases/list/nested-value-reported.yaml +65 -0
  233. gemba_cli-0.1.0/tests/cases/list/non-task-entries-ignored.yaml +38 -0
  234. gemba_cli-0.1.0/tests/cases/list/problems-reported-despite-filters.yaml +38 -0
  235. gemba_cli-0.1.0/tests/cases/list/range-on-a-date.yaml +93 -0
  236. gemba_cli-0.1.0/tests/cases/list/range-on-a-number.yaml +88 -0
  237. gemba_cli-0.1.0/tests/cases/list/ref-mismatch.yaml +25 -0
  238. gemba_cli-0.1.0/tests/cases/list/same-key-as-alternatives.yaml +91 -0
  239. gemba_cli-0.1.0/tests/cases/list/scalar-equality.yaml +77 -0
  240. gemba_cli-0.1.0/tests/cases/list/several-statuses.yaml +75 -0
  241. gemba_cli-0.1.0/tests/cases/list/several-workstreams.yaml +65 -0
  242. gemba_cli-0.1.0/tests/cases/list/task-by-ref.yaml +56 -0
  243. gemba_cli-0.1.0/tests/cases/list/typed-value.yaml +67 -0
  244. gemba_cli-0.1.0/tests/cases/list/undeclared-key-refused.yaml +30 -0
  245. gemba_cli-0.1.0/tests/cases/list/unknown-workstream-filter.yaml +21 -0
  246. gemba_cli-0.1.0/tests/cases/list/unset-value.yaml +77 -0
  247. gemba_cli-0.1.0/tests/cases/list/update-date-range.yaml +54 -0
  248. gemba_cli-0.1.0/tests/cases/list/value-of-another-type-reported.yaml +55 -0
  249. gemba_cli-0.1.0/tests/cases/list/value-of-another-type-still-read.yaml +41 -0
  250. gemba_cli-0.1.0/tests/cases/list/workstream-filter-restricts-the-scan.yaml +44 -0
  251. gemba_cli-0.1.0/tests/cases/mark/archived-task-refused.yaml +25 -0
  252. gemba_cli-0.1.0/tests/cases/mark/default-date-is-today.yaml +22 -0
  253. gemba_cli-0.1.0/tests/cases/mark/done-at-follows-the-status.yaml +31 -0
  254. gemba_cli-0.1.0/tests/cases/mark/done-task-recorded.yaml +36 -0
  255. gemba_cli-0.1.0/tests/cases/mark/harness-untouched.yaml +27 -0
  256. gemba_cli-0.1.0/tests/cases/mark/invalid-date-refused.yaml +65 -0
  257. gemba_cli-0.1.0/tests/cases/mark/invalid-status-refused.yaml +21 -0
  258. gemba_cli-0.1.0/tests/cases/mark/only-the-frontmatter-changes.yaml +59 -0
  259. gemba_cli-0.1.0/tests/cases/mark/same-status-left-as-it-was.yaml +25 -0
  260. gemba_cli-0.1.0/tests/cases/mark/task-leaves-done.yaml +71 -0
  261. gemba_cli-0.1.0/tests/cases/mark/task-marked-blocked.yaml +77 -0
  262. gemba_cli-0.1.0/tests/cases/mark/task-marked-done.yaml +47 -0
  263. gemba_cli-0.1.0/tests/cases/mark/unknown-ref-refused.yaml +21 -0
  264. gemba_cli-0.1.0/tests/cases/mark/updated-at-never-moves-backwards.yaml +30 -0
  265. gemba_cli-0.1.0/tests/cases/record/bullets-merged-into-existing-subsection.yaml +52 -0
  266. gemba_cli-0.1.0/tests/cases/record/default-date-is-today.yaml +33 -0
  267. gemba_cli-0.1.0/tests/cases/record/draft-consumed.yaml +31 -0
  268. gemba_cli-0.1.0/tests/cases/record/first-update-of-a-task.yaml +47 -0
  269. gemba_cli-0.1.0/tests/cases/record/harness-resolved-from-the-working-directory.yaml +33 -0
  270. gemba_cli-0.1.0/tests/cases/record/invalid-date-refused.yaml +86 -0
  271. gemba_cli-0.1.0/tests/cases/record/invalid-draft-refused.yaml +113 -0
  272. gemba_cli-0.1.0/tests/cases/record/invalid-subsection-headings.yaml +69 -0
  273. gemba_cli-0.1.0/tests/cases/record/no-harness-found.yaml +29 -0
  274. gemba_cli-0.1.0/tests/cases/record/nothing-is-committed.yaml +30 -0
  275. gemba_cli-0.1.0/tests/cases/record/only-the-section-and-updated-at-change.yaml +61 -0
  276. gemba_cli-0.1.0/tests/cases/record/subsection-as-written-by-a-command.yaml +52 -0
  277. gemba_cli-0.1.0/tests/cases/record/subsection-inserted-in-order.yaml +61 -0
  278. gemba_cli-0.1.0/tests/cases/record/task-file-missing.yaml +22 -0
  279. gemba_cli-0.1.0/tests/cases/record/updated-at-never-moves-backwards.yaml +69 -0
  280. gemba_cli-0.1.0/tests/cases/record/updates-heading-missing.yaml +26 -0
  281. gemba_cli-0.1.0/tests/cases/record/updates-not-the-last-section.yaml +67 -0
  282. gemba_cli-0.1.0/tests/cases/release/version-printed.yaml +6 -0
  283. gemba_cli-0.1.0/tests/cases/report/invalid-inputs-reported-together.yaml +32 -0
  284. gemba_cli-0.1.0/tests/cases/report/no-grouping.yaml +53 -0
  285. gemba_cli-0.1.0/tests/cases/report/nothing-selected.yaml +31 -0
  286. gemba_cli-0.1.0/tests/cases/report/nothing-written.yaml +42 -0
  287. gemba_cli-0.1.0/tests/cases/report/report-subcommand-exists.yaml +9 -0
  288. gemba_cli-0.1.0/tests/cases/report/selection-as-in-the-listing.yaml +170 -0
  289. gemba_cli-0.1.0/tests/cases/report/several-groupings.yaml +92 -0
  290. gemba_cli-0.1.0/tests/cases/report/sums-are-exact.yaml +87 -0
  291. gemba_cli-0.1.0/tests/cases/report/sums-by-group.yaml +77 -0
  292. gemba_cli-0.1.0/tests/cases/report/task-in-several-groups.yaml +65 -0
  293. gemba_cli-0.1.0/tests/cases/report/tasks-without-a-value-counted.yaml +75 -0
  294. gemba_cli-0.1.0/tests/cases/set/archived-or-done-task-set.yaml +78 -0
  295. gemba_cli-0.1.0/tests/cases/set/field-declared-after-the-task-was-created.yaml +39 -0
  296. gemba_cli-0.1.0/tests/cases/set/field-no-longer-declared-kept.yaml +38 -0
  297. gemba_cli-0.1.0/tests/cases/set/metadata-changes-after-creation.yaml +27 -0
  298. gemba_cli-0.1.0/tests/cases/set/number-added-to-a-total.yaml +73 -0
  299. gemba_cli-0.1.0/tests/cases/set/only-the-metadata-changes.yaml +65 -0
  300. gemba_cli-0.1.0/tests/cases/set/problems-reported-together.yaml +34 -0
  301. gemba_cli-0.1.0/tests/cases/set/required-field-not-cleared.yaml +26 -0
  302. gemba_cli-0.1.0/tests/cases/set/same-value-left-as-it-was.yaml +26 -0
  303. gemba_cli-0.1.0/tests/cases/set/set-from-inside-the-harness.yaml +34 -0
  304. gemba_cli-0.1.0/tests/cases/set/sums-are-exact.yaml +73 -0
  305. gemba_cli-0.1.0/tests/cases/set/text-kept-as-written.yaml +40 -0
  306. gemba_cli-0.1.0/tests/cases/set/text-list-set.yaml +36 -0
  307. gemba_cli-0.1.0/tests/cases/set/unknown-ref-refused.yaml +24 -0
  308. gemba_cli-0.1.0/tests/cases/set/value-cleared.yaml +36 -0
  309. gemba_cli-0.1.0/tests/cases/set/values-set.yaml +42 -0
  310. gemba_cli-0.1.0/tests/cases/skills/check-finds-everything-current.yaml +31 -0
  311. gemba_cli-0.1.0/tests/cases/skills/check-finds-work-to-do.yaml +28 -0
  312. gemba_cli-0.1.0/tests/cases/skills/edited-skill-is-kept-and-reported.yaml +65 -0
  313. gemba_cli-0.1.0/tests/cases/skills/edited-skill-is-overwritten-on-request.yaml +23 -0
  314. gemba_cli-0.1.0/tests/cases/skills/every-registered-skill-is-written.yaml +52 -0
  315. gemba_cli-0.1.0/tests/cases/skills/generated-skill-carries-its-provenance.yaml +16 -0
  316. gemba_cli-0.1.0/tests/cases/skills/harness-scoped-skills-only.yaml +47 -0
  317. gemba_cli-0.1.0/tests/cases/skills/missing-skill-is-written.yaml +23 -0
  318. gemba_cli-0.1.0/tests/cases/skills/no-providers-declared.yaml +10 -0
  319. gemba_cli-0.1.0/tests/cases/skills/no-tasks-repo.yaml +9 -0
  320. gemba_cli-0.1.0/tests/cases/skills/one-folder-per-declared-provider.yaml +89 -0
  321. gemba_cli-0.1.0/tests/cases/skills/outdated-skill-is-refreshed.yaml +37 -0
  322. gemba_cli-0.1.0/tests/cases/skills/run-from-a-subfolder.yaml +23 -0
  323. gemba_cli-0.1.0/tests/cases/skills/run-from-inside-a-harness.yaml +59 -0
  324. gemba_cli-0.1.0/tests/cases/skills/unchanged-skill-is-left-alone.yaml +31 -0
  325. gemba_cli-0.1.0/tests/cases/skills/undeclared-provider-gets-nothing.yaml +20 -0
  326. gemba_cli-0.1.0/tests/cases/skills/unregistered-skills-are-not-touched.yaml +41 -0
  327. gemba_cli-0.1.0/tests/cases/worktree/base-change-forced.yaml +43 -0
  328. gemba_cli-0.1.0/tests/cases/worktree/base-change-refused-with-pending-work.yaml +80 -0
  329. gemba_cli-0.1.0/tests/cases/worktree/base-changed-on-the-same-worktree.yaml +45 -0
  330. gemba_cli-0.1.0/tests/cases/worktree/branch-named-after-the-run.yaml +82 -0
  331. gemba_cli-0.1.0/tests/cases/worktree/config-without-organization-or-repos-dir-refused.yaml +69 -0
  332. gemba_cli-0.1.0/tests/cases/worktree/folder-that-is-not-a-worktree-refused.yaml +39 -0
  333. gemba_cli-0.1.0/tests/cases/worktree/fresh-base-fetched.yaml +37 -0
  334. gemba_cli-0.1.0/tests/cases/worktree/missing-remote-branch-refused.yaml +34 -0
  335. gemba_cli-0.1.0/tests/cases/worktree/no-default-branch-refused.yaml +36 -0
  336. gemba_cli-0.1.0/tests/cases/worktree/no-worktree-to-remove.yaml +53 -0
  337. gemba_cli-0.1.0/tests/cases/worktree/nothing-to-list.yaml +26 -0
  338. gemba_cli-0.1.0/tests/cases/worktree/orphan-branch-refused-and-forced.yaml +90 -0
  339. gemba_cli-0.1.0/tests/cases/worktree/pending-work-discarded-on-request.yaml +40 -0
  340. gemba_cli-0.1.0/tests/cases/worktree/removal-refused-with-pending-work.yaml +84 -0
  341. gemba_cli-0.1.0/tests/cases/worktree/repositories-folder-relative-to-the-tasks-repo.yaml +38 -0
  342. gemba_cli-0.1.0/tests/cases/worktree/repository-already-attached.yaml +34 -0
  343. gemba_cli-0.1.0/tests/cases/worktree/repository-resolved-at-the-root.yaml +76 -0
  344. gemba_cli-0.1.0/tests/cases/worktree/run-outside-a-harness-refused.yaml +20 -0
  345. gemba_cli-0.1.0/tests/cases/worktree/same-repository-in-two-runs.yaml +51 -0
  346. gemba_cli-0.1.0/tests/cases/worktree/state-shown-without-deleting.yaml +38 -0
  347. gemba_cli-0.1.0/tests/cases/worktree/upstream-shown-after-a-push.yaml +36 -0
  348. gemba_cli-0.1.0/tests/cases/worktree/worktree-added-from-a-named-branch.yaml +42 -0
  349. gemba_cli-0.1.0/tests/cases/worktree/worktree-added-from-the-default-branch.yaml +46 -0
  350. gemba_cli-0.1.0/tests/cases/worktree/worktree-removed.yaml +45 -0
  351. gemba_cli-0.1.0/tests/cases/worktree/worktrees-listed.yaml +51 -0
  352. gemba_cli-0.1.0/tests/not-automated.yaml +104 -0
  353. gemba_cli-0.1.0/tests/test_cases.py +433 -0
  354. gemba_cli-0.1.0/tests/test_config.py +592 -0
  355. gemba_cli-0.1.0/tests/test_harness.py +496 -0
  356. gemba_cli-0.1.0/tests/test_metadata.py +578 -0
  357. gemba_cli-0.1.0/tests/test_package.py +36 -0
  358. gemba_cli-0.1.0/tests/test_repo.py +88 -0
  359. gemba_cli-0.1.0/tests/test_report.py +174 -0
  360. gemba_cli-0.1.0/tests/test_scenarios.py +343 -0
  361. gemba_cli-0.1.0/tests/test_skills.py +232 -0
  362. gemba_cli-0.1.0/tests/test_tasks.py +756 -0
  363. gemba_cli-0.1.0/tests/test_worktree.py +212 -0
  364. gemba_cli-0.1.0/uv.lock +231 -0
@@ -0,0 +1,4 @@
1
+ __pycache__/
2
+ .venv/
3
+ .ruff_cache/
4
+ dist/
@@ -0,0 +1,41 @@
1
+ # Changelog
2
+
3
+ All notable changes to the gemba CLI are recorded here. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project follows
5
+ [Semantic Versioning](https://semver.org/spec/v2.0.0.html): while the major version is
6
+ 0, a minor version may change a command or a file format, and the entry says so.
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.1.0] - 2026-10-11
11
+
12
+ The first release: the whole cycle of a task, from a tasks repo that `gemba init`
13
+ creates to the report of a period.
14
+
15
+ ### Added
16
+
17
+ - `gemba init`, which makes a folder a tasks repo, and the `gemba-init` skill, the
18
+ guided first configuration.
19
+ - `gemba.yaml`, the gemba config: workstreams with their prefixes, typed metadata
20
+ fields (`text`, `number`, `boolean`, `date`), agent providers, the IDE command, the
21
+ organization, the repositories folder, and `context` and `rules` per process, at the
22
+ top level and per workstream; `gemba config check` and `gemba config show`, and the
23
+ `gemba-config` skill that holds the reference of every key.
24
+ - `gemba create`, `gemba list`, `gemba set`, `gemba mark` and `gemba archive`, each with
25
+ its skill: the frontmatter of a task is written by commands only, refs are never
26
+ reused, and listings and reports read every task file and report the invalid ones.
27
+ - `gemba harness launch`, `note`, `resolve` and `remove`: the harness of a run, its own
28
+ git repository with the guide of the agent, the filed notes and their approval gate
29
+ for actions outside the harness.
30
+ - `gemba worktree add`, `list` and `remove`: git worktrees of the organization's
31
+ repositories inside a harness, each on the local branch of the run, never pushed
32
+ under its own name.
33
+ - `gemba record` and the `gemba-report` skill: the update of a day written into the
34
+ task from a draft, and the report of a day, a week or a month, with every count and
35
+ sum taken from `gemba report`.
36
+ - `gemba skills update`: the skills ship with the package and are written into the
37
+ tasks repo and into each harness for every agent provider declared, with their
38
+ provenance, so an upgrade refreshes them and a hand edit is kept.
39
+
40
+ [Unreleased]: https://github.com/web-crafts-org/gemba/compare/v0.1.0...HEAD
41
+ [0.1.0]: https://github.com/web-crafts-org/gemba/releases/tag/v0.1.0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Manuel Robles
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,321 @@
1
+ Metadata-Version: 2.5
2
+ Name: gemba-cli
3
+ Version: 0.1.0
4
+ Summary: Gemba: a task-based system for working with AI agents
5
+ Project-URL: Repository, https://github.com/web-crafts-org/gemba
6
+ Project-URL: Changelog, https://github.com/web-crafts-org/gemba/blob/main/CHANGELOG.md
7
+ Project-URL: Issues, https://github.com/web-crafts-org/gemba/issues
8
+ Author: Manuel Robles
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: agent-harness,agent-skills,agentic-development,ai-agents,claude-code,cli,codex,context-engineering,harness,task-management
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Operating System :: MacOS
16
+ Classifier: Operating System :: POSIX
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Topic :: Office/Business
22
+ Classifier: Topic :: Software Development
23
+ Requires-Python: >=3.11
24
+ Requires-Dist: pyyaml>=6
25
+ Description-Content-Type: text/markdown
26
+
27
+ # Gemba
28
+
29
+ Gemba is a task-based system for working with AI agents. Every unit of work is one
30
+ Markdown file in a repository of your own, your agent registers, launches, updates and
31
+ closes those tasks through fixed processes, and each task is worked on inside a
32
+ harness: a folder of its own, with its notes, its evidence and the code it touches,
33
+ where nothing leaves without your written approval. Everything that is specific to one
34
+ organization, its kinds of work, its fields, its rules, lives in one config file, so
35
+ you keep one tasks repo per organization and the agent behaves the same in all of them.
36
+
37
+ The name is 現場, *gemba*: "the actual place", where the work happens. In Gemba that
38
+ place is the harness, a folder made for one task, where the agent works on it and on
39
+ nothing else, with everything the task needs inside and none of the noise of every
40
+ other pending thing. The task file is the logbook of that work: what was done, when,
41
+ and what it cost, recorded day by day. The harness is where the work gets done; the
42
+ task file is where you learn from it, the record that over time lets you see how you
43
+ work, measure it and improve it.
44
+
45
+ ## The idea
46
+
47
+ ```
48
+ your tasks repo the harness of one run
49
+ +-------------------------------------+ +--------------------------------+
50
+ | gemba.yaml your organization: | launch | task.md the task, read-only|
51
+ | workstreams, fields, | -------> | notes/ what the agent |
52
+ | rules per process | | found and decided |
53
+ | tasks/ one file per task, | | assets/ the raw evidence |
54
+ | a ref like SUP-12 | record | worktrees/ the repositories, |
55
+ | .claude/ the skills: the | <------- | one branch per run |
56
+ | skills/ processes the agent | | CLAUDE.md the guide of the |
57
+ | follows | | agent |
58
+ +-------------------------------------+ +--------------------------------+
59
+ ```
60
+
61
+ The cycle of a task:
62
+
63
+ ```
64
+ create --> launch --> work in the harness --> record the day --> mark done
65
+ notes, worktrees, | |
66
+ approved actions v v
67
+ report archive,
68
+ of the period remove the harness
69
+ ```
70
+
71
+ Three things keep it honest:
72
+
73
+ - **Commands own the frontmatter, agents own the body.** The status, the dates and the
74
+ metadata of a task are written only by `gemba` commands; the agent writes prose.
75
+ - **Nothing leaves the harness without an approved note.** A push, a message, a
76
+ deployment: the agent writes what it is about to do, and you approve it by editing
77
+ the note. A yes in the chat does not count.
78
+ - **Every number comes from a command.** Counts and totals in a report are computed
79
+ by `gemba report`, never by the agent.
80
+
81
+ Gemba works with any agent that reads skills from a folder: Claude Code
82
+ (`.claude/skills/`) and the agents that read `.agents/skills/` (Codex, Cursor,
83
+ Gemini CLI and others) are built in.
84
+
85
+ ## Install and start
86
+
87
+ The only prerequisite is [uv](https://docs.astral.sh/uv/).
88
+
89
+ ```bash
90
+ uv tool install gemba-cli
91
+ gemba --version
92
+ gemba init ~/nakatomi-tasks # a tasks repo for the organization you work with
93
+ ```
94
+
95
+ `gemba init` writes a minimal `gemba.yaml`, the `tasks/` folder, a `.gitignore` and
96
+ the skills for every agent it knows (`--providers claude` keeps only one). It runs no
97
+ git: make the folder a repository and commit it when you like.
98
+
99
+ Then open the folder with your agent and ask it to configure Gemba. The `gemba-init`
100
+ skill asks, one question at a time, for your organization, the kinds of work you do,
101
+ which one takes a task that fits no other, what to record per task, your agents, your
102
+ editor and the folder of your repositories, and writes the answers into `gemba.yaml`.
103
+
104
+ From there, talk to the agent:
105
+
106
+ > Register a task: login fails on Safari for Acme's checkout app.
107
+
108
+ > Launch SUP-1.
109
+
110
+ > Record the day on this task.
111
+
112
+ > What did I do this week?
113
+
114
+ ## The cycle of a task
115
+
116
+ Each step is a skill the agent follows and a command the skill runs. You can run the
117
+ commands yourself too; every one of them prints what it did or every problem it found,
118
+ at once, and exits 1 without writing anything when it refuses.
119
+
120
+ ### Register
121
+
122
+ The `gemba-create` skill picks the workstream from the descriptions in `gemba.yaml`,
123
+ asks for any required field you did not give, and runs:
124
+
125
+ ```bash
126
+ gemba create --workstream support --slug login-fails-on-safari \
127
+ --description "Login fails on Safari for the checkout app" --set client=acme
128
+ ```
129
+
130
+ The task file is `tasks/support/2026-09-30-SUP-1-login-fails-on-safari.md`:
131
+
132
+ ```markdown
133
+ ---
134
+ status: open
135
+ ref: SUP-1
136
+ updated_at: 2026-09-30
137
+ metadata:
138
+ client: acme
139
+ hours: null
140
+ ---
141
+
142
+ Login fails on Safari for the checkout app
143
+
144
+ ## Updates
145
+ ```
146
+
147
+ The ref is allocated from the highest number already used, archives included, so it
148
+ is never reused. The metadata keys are exactly the ones declared for that workstream,
149
+ present even when unset, each read, compared and added by the type its field declares.
150
+
151
+ ### Launch
152
+
153
+ ```bash
154
+ gemba harness launch SUP-1
155
+ ```
156
+
157
+ creates `harnesses/support/2026-09-30-SUP-1-login-fails-on-safari/` as a git
158
+ repository of its own, with `harness.yaml`, the run's identity; `task.md`, a link to
159
+ the task; the guide of the agent (`CLAUDE.md`, `AGENTS.md`); the harness skills;
160
+ `notes/`, `assets/` and `worktrees/`. It moves an `open` task to `in-progress` and
161
+ opens the folder with the `ide` command of `gemba.yaml` (`--no-open` skips it).
162
+ Launching again only reopens it. `harnesses/` is ignored by the tasks repo: a run is
163
+ not a record, the task is.
164
+
165
+ ### Work in the harness
166
+
167
+ Start the agent inside the harness. The guide tells it to read the task and the notes
168
+ first, to write before it acts, and to keep every finding, blocker, decision or
169
+ summary as a small note, drafted as `notes/<slug>.md` and filed with the
170
+ `gemba-harness` skill, which names it after the clock, writes its frontmatter and
171
+ commits:
172
+
173
+ ```bash
174
+ gemba harness note notes/login-trace.md --type finding --asset assets/1759350491-console.log
175
+ ```
176
+
177
+ An `external-action` note describes, word for word, something to be done outside the
178
+ harness. Nothing happens until you set `approved: true` in its frontmatter from your
179
+ editor. After acting, the agent writes the outcome into the note and runs
180
+ `gemba harness resolve notes/<file>.md`, which records when.
181
+
182
+ When the task touches code, the agent checks out the repositories it needs as git
183
+ worktrees, each on a local branch named after the run:
184
+
185
+ ```bash
186
+ gemba worktree add nakatomi-web # from the default branch of origin
187
+ gemba worktree add nakatomi-web --from release/2.4 # from another branch, or move to it
188
+ gemba worktree list # branch, upstream, uncommitted, unpushed
189
+ gemba worktree remove nakatomi-web --yes # the worktree and its branch
190
+ ```
191
+
192
+ A repository is a folder under the `repos_dir` of `gemba.yaml`; Gemba never clones.
193
+ The branch, `gemba/nakatomi/SUP-1`, exists only on your machine and is never pushed
194
+ under its own name: a push needs an approved note naming the branch of the remote, and
195
+ always names its target, `git push -u origin HEAD:<that branch>`. `add --from` and
196
+ `remove` refuse while anything is uncommitted or on no remote branch; `--force`
197
+ discards it, and the agent passes it only after you confirm what the command listed.
198
+
199
+ ### Record the day
200
+
201
+ At the end of the day, ask the agent to record the day on the task. It distills the
202
+ notes of that date into a few bullets in `update.md` at the harness root and runs:
203
+
204
+ ```bash
205
+ gemba record update.md # today
206
+ gemba record update.md --date 2026-09-30 # a past day
207
+ ```
208
+
209
+ The bullets land under `### 2026-09-30` in the task's `## Updates` section,
210
+ `updated_at` moves forward, and the draft is deleted. Nothing is committed: the tasks
211
+ repo is yours to review and commit.
212
+
213
+ ### Report
214
+
215
+ Ask the agent in the tasks repo for yesterday, for a day, a week or a month. The
216
+ `gemba-report` skill finds the tasks alive in the period with `gemba list`, reads the
217
+ subsections dated in it, groups what it finds by workstream, and lists the tasks
218
+ updated recently with nothing recorded. Every count and total comes from:
219
+
220
+ ```bash
221
+ gemba report --done-from 2026-09-01 --done-to 2026-09-30 --by client --sum hours
222
+ ```
223
+
224
+ which takes the filters of `gemba list`, groups with `--by` (`workstream`, `status`,
225
+ or a text or boolean field) and adds number fields with `--sum`, exactly.
226
+
227
+ ### Close out
228
+
229
+ Three steps, each on its own, each asking before it deletes anything:
230
+
231
+ ```bash
232
+ gemba mark SUP-1 done # done today: done_at and updated_at move
233
+ gemba mark SUP-1 open # reopened: done_at is removed
234
+ gemba harness remove SUP-1 # show what the run holds, delete nothing
235
+ gemba harness remove SUP-1 --yes # delete the harness, its worktrees and branches
236
+ gemba archive SUP-1 OPS-2 # move each task file into archive/
237
+ ```
238
+
239
+ A task done today can be reopened tomorrow in the same harness; a run can be thrown
240
+ away on a task still in progress; a task is archived only once it went cold, and only
241
+ after its harness is gone. Archived tasks leave `gemba list` unless
242
+ `--include-archived` is given.
243
+
244
+ ### Keep the metadata
245
+
246
+ The hours grow, the work gets invoiced. Tell the agent, from the tasks repo or inside
247
+ the harness, and the `gemba-set` skill runs:
248
+
249
+ ```bash
250
+ gemba set SUP-1 hours+=2 # added to the number the task holds
251
+ gemba set SUP-1 invoiced=2026-10-03 # a value, written by the type of its field
252
+ gemba set SUP-1 merge_requests=null # cleared
253
+ ```
254
+
255
+ It rewrites only the metadata, never `updated_at`, and refuses an undeclared key or a
256
+ value of the wrong type.
257
+
258
+ ## The config
259
+
260
+ `gemba.yaml` is edited by hand, or by the `gemba-config` skill when you ask the agent
261
+ to add a workstream, a field or a rule; `gemba config check` validates it and
262
+ `gemba config show` prints it resolved, as the skills read it. No command rewrites it.
263
+
264
+ ```yaml
265
+ default_workstream: operations
266
+
267
+ agent_providers: [claude, agents]
268
+
269
+ ide: code -n
270
+ organization: nakatomi
271
+ repos_dir: ~/projects
272
+
273
+ metadata:
274
+ - { name: client, type: text, required: true, description: Who the work is for }
275
+ - { name: hours, type: number, description: Total hours spent on the task }
276
+ - { name: invoiced, type: date, description: When the work was invoiced }
277
+
278
+ harness:
279
+ guide: |
280
+ Client data never leaves the harness: strip it from every asset you save.
281
+
282
+ workstreams:
283
+ support:
284
+ prefix: SUP
285
+ description: Investigate a client-reported problem and deliver a report or a fix
286
+ worktree:
287
+ add:
288
+ rules:
289
+ - start from the branch deployed to production; ask when the task does not say it
290
+ operations:
291
+ prefix: OPS
292
+ description: Anything that does not fit another workstream
293
+ ```
294
+
295
+ What you can customize, all of it here and never in a skill:
296
+
297
+ - **Workstreams**, each with a prefix, a description the agent uses to choose one, and
298
+ its own fields, and the one that takes a task that fits no other.
299
+ - **Metadata fields**, shared or per workstream, each of one type: `text`, `number`,
300
+ `boolean` or `date`. Gemba reads, filters, groups and adds values by their type and
301
+ never interprets their meaning.
302
+ - **Agent providers**, the IDE command, the organization and the repositories folder.
303
+ - **`context` and `rules` for every process**, at the top level and per workstream:
304
+ what the agent should know and do when it creates, lists, launches, notes, records,
305
+ marks, archives or checks out, with the workstream's rule winning a contradiction.
306
+ - **The guide** of every harness, with a paragraph of your organization and one of
307
+ the workstream.
308
+
309
+ Changing any of it is a config edit: no skill and no code changes.
310
+
311
+ ## Status
312
+
313
+ Gemba is young, at version 0.x, and built from daily use: the whole cycle above
314
+ works, and the shape of the commands may still change between minor versions, with
315
+ the changelog saying so. Ideas, questions and reports of what got in your way are the
316
+ most useful contribution right now: see [CONTRIBUTING.md](CONTRIBUTING.md), which also
317
+ describes how the product is developed, by specification, one case per scenario.
318
+
319
+ ## License
320
+
321
+ [MIT](LICENSE).
@@ -0,0 +1,295 @@
1
+ # Gemba
2
+
3
+ Gemba is a task-based system for working with AI agents. Every unit of work is one
4
+ Markdown file in a repository of your own, your agent registers, launches, updates and
5
+ closes those tasks through fixed processes, and each task is worked on inside a
6
+ harness: a folder of its own, with its notes, its evidence and the code it touches,
7
+ where nothing leaves without your written approval. Everything that is specific to one
8
+ organization, its kinds of work, its fields, its rules, lives in one config file, so
9
+ you keep one tasks repo per organization and the agent behaves the same in all of them.
10
+
11
+ The name is 現場, *gemba*: "the actual place", where the work happens. In Gemba that
12
+ place is the harness, a folder made for one task, where the agent works on it and on
13
+ nothing else, with everything the task needs inside and none of the noise of every
14
+ other pending thing. The task file is the logbook of that work: what was done, when,
15
+ and what it cost, recorded day by day. The harness is where the work gets done; the
16
+ task file is where you learn from it, the record that over time lets you see how you
17
+ work, measure it and improve it.
18
+
19
+ ## The idea
20
+
21
+ ```
22
+ your tasks repo the harness of one run
23
+ +-------------------------------------+ +--------------------------------+
24
+ | gemba.yaml your organization: | launch | task.md the task, read-only|
25
+ | workstreams, fields, | -------> | notes/ what the agent |
26
+ | rules per process | | found and decided |
27
+ | tasks/ one file per task, | | assets/ the raw evidence |
28
+ | a ref like SUP-12 | record | worktrees/ the repositories, |
29
+ | .claude/ the skills: the | <------- | one branch per run |
30
+ | skills/ processes the agent | | CLAUDE.md the guide of the |
31
+ | follows | | agent |
32
+ +-------------------------------------+ +--------------------------------+
33
+ ```
34
+
35
+ The cycle of a task:
36
+
37
+ ```
38
+ create --> launch --> work in the harness --> record the day --> mark done
39
+ notes, worktrees, | |
40
+ approved actions v v
41
+ report archive,
42
+ of the period remove the harness
43
+ ```
44
+
45
+ Three things keep it honest:
46
+
47
+ - **Commands own the frontmatter, agents own the body.** The status, the dates and the
48
+ metadata of a task are written only by `gemba` commands; the agent writes prose.
49
+ - **Nothing leaves the harness without an approved note.** A push, a message, a
50
+ deployment: the agent writes what it is about to do, and you approve it by editing
51
+ the note. A yes in the chat does not count.
52
+ - **Every number comes from a command.** Counts and totals in a report are computed
53
+ by `gemba report`, never by the agent.
54
+
55
+ Gemba works with any agent that reads skills from a folder: Claude Code
56
+ (`.claude/skills/`) and the agents that read `.agents/skills/` (Codex, Cursor,
57
+ Gemini CLI and others) are built in.
58
+
59
+ ## Install and start
60
+
61
+ The only prerequisite is [uv](https://docs.astral.sh/uv/).
62
+
63
+ ```bash
64
+ uv tool install gemba-cli
65
+ gemba --version
66
+ gemba init ~/nakatomi-tasks # a tasks repo for the organization you work with
67
+ ```
68
+
69
+ `gemba init` writes a minimal `gemba.yaml`, the `tasks/` folder, a `.gitignore` and
70
+ the skills for every agent it knows (`--providers claude` keeps only one). It runs no
71
+ git: make the folder a repository and commit it when you like.
72
+
73
+ Then open the folder with your agent and ask it to configure Gemba. The `gemba-init`
74
+ skill asks, one question at a time, for your organization, the kinds of work you do,
75
+ which one takes a task that fits no other, what to record per task, your agents, your
76
+ editor and the folder of your repositories, and writes the answers into `gemba.yaml`.
77
+
78
+ From there, talk to the agent:
79
+
80
+ > Register a task: login fails on Safari for Acme's checkout app.
81
+
82
+ > Launch SUP-1.
83
+
84
+ > Record the day on this task.
85
+
86
+ > What did I do this week?
87
+
88
+ ## The cycle of a task
89
+
90
+ Each step is a skill the agent follows and a command the skill runs. You can run the
91
+ commands yourself too; every one of them prints what it did or every problem it found,
92
+ at once, and exits 1 without writing anything when it refuses.
93
+
94
+ ### Register
95
+
96
+ The `gemba-create` skill picks the workstream from the descriptions in `gemba.yaml`,
97
+ asks for any required field you did not give, and runs:
98
+
99
+ ```bash
100
+ gemba create --workstream support --slug login-fails-on-safari \
101
+ --description "Login fails on Safari for the checkout app" --set client=acme
102
+ ```
103
+
104
+ The task file is `tasks/support/2026-09-30-SUP-1-login-fails-on-safari.md`:
105
+
106
+ ```markdown
107
+ ---
108
+ status: open
109
+ ref: SUP-1
110
+ updated_at: 2026-09-30
111
+ metadata:
112
+ client: acme
113
+ hours: null
114
+ ---
115
+
116
+ Login fails on Safari for the checkout app
117
+
118
+ ## Updates
119
+ ```
120
+
121
+ The ref is allocated from the highest number already used, archives included, so it
122
+ is never reused. The metadata keys are exactly the ones declared for that workstream,
123
+ present even when unset, each read, compared and added by the type its field declares.
124
+
125
+ ### Launch
126
+
127
+ ```bash
128
+ gemba harness launch SUP-1
129
+ ```
130
+
131
+ creates `harnesses/support/2026-09-30-SUP-1-login-fails-on-safari/` as a git
132
+ repository of its own, with `harness.yaml`, the run's identity; `task.md`, a link to
133
+ the task; the guide of the agent (`CLAUDE.md`, `AGENTS.md`); the harness skills;
134
+ `notes/`, `assets/` and `worktrees/`. It moves an `open` task to `in-progress` and
135
+ opens the folder with the `ide` command of `gemba.yaml` (`--no-open` skips it).
136
+ Launching again only reopens it. `harnesses/` is ignored by the tasks repo: a run is
137
+ not a record, the task is.
138
+
139
+ ### Work in the harness
140
+
141
+ Start the agent inside the harness. The guide tells it to read the task and the notes
142
+ first, to write before it acts, and to keep every finding, blocker, decision or
143
+ summary as a small note, drafted as `notes/<slug>.md` and filed with the
144
+ `gemba-harness` skill, which names it after the clock, writes its frontmatter and
145
+ commits:
146
+
147
+ ```bash
148
+ gemba harness note notes/login-trace.md --type finding --asset assets/1759350491-console.log
149
+ ```
150
+
151
+ An `external-action` note describes, word for word, something to be done outside the
152
+ harness. Nothing happens until you set `approved: true` in its frontmatter from your
153
+ editor. After acting, the agent writes the outcome into the note and runs
154
+ `gemba harness resolve notes/<file>.md`, which records when.
155
+
156
+ When the task touches code, the agent checks out the repositories it needs as git
157
+ worktrees, each on a local branch named after the run:
158
+
159
+ ```bash
160
+ gemba worktree add nakatomi-web # from the default branch of origin
161
+ gemba worktree add nakatomi-web --from release/2.4 # from another branch, or move to it
162
+ gemba worktree list # branch, upstream, uncommitted, unpushed
163
+ gemba worktree remove nakatomi-web --yes # the worktree and its branch
164
+ ```
165
+
166
+ A repository is a folder under the `repos_dir` of `gemba.yaml`; Gemba never clones.
167
+ The branch, `gemba/nakatomi/SUP-1`, exists only on your machine and is never pushed
168
+ under its own name: a push needs an approved note naming the branch of the remote, and
169
+ always names its target, `git push -u origin HEAD:<that branch>`. `add --from` and
170
+ `remove` refuse while anything is uncommitted or on no remote branch; `--force`
171
+ discards it, and the agent passes it only after you confirm what the command listed.
172
+
173
+ ### Record the day
174
+
175
+ At the end of the day, ask the agent to record the day on the task. It distills the
176
+ notes of that date into a few bullets in `update.md` at the harness root and runs:
177
+
178
+ ```bash
179
+ gemba record update.md # today
180
+ gemba record update.md --date 2026-09-30 # a past day
181
+ ```
182
+
183
+ The bullets land under `### 2026-09-30` in the task's `## Updates` section,
184
+ `updated_at` moves forward, and the draft is deleted. Nothing is committed: the tasks
185
+ repo is yours to review and commit.
186
+
187
+ ### Report
188
+
189
+ Ask the agent in the tasks repo for yesterday, for a day, a week or a month. The
190
+ `gemba-report` skill finds the tasks alive in the period with `gemba list`, reads the
191
+ subsections dated in it, groups what it finds by workstream, and lists the tasks
192
+ updated recently with nothing recorded. Every count and total comes from:
193
+
194
+ ```bash
195
+ gemba report --done-from 2026-09-01 --done-to 2026-09-30 --by client --sum hours
196
+ ```
197
+
198
+ which takes the filters of `gemba list`, groups with `--by` (`workstream`, `status`,
199
+ or a text or boolean field) and adds number fields with `--sum`, exactly.
200
+
201
+ ### Close out
202
+
203
+ Three steps, each on its own, each asking before it deletes anything:
204
+
205
+ ```bash
206
+ gemba mark SUP-1 done # done today: done_at and updated_at move
207
+ gemba mark SUP-1 open # reopened: done_at is removed
208
+ gemba harness remove SUP-1 # show what the run holds, delete nothing
209
+ gemba harness remove SUP-1 --yes # delete the harness, its worktrees and branches
210
+ gemba archive SUP-1 OPS-2 # move each task file into archive/
211
+ ```
212
+
213
+ A task done today can be reopened tomorrow in the same harness; a run can be thrown
214
+ away on a task still in progress; a task is archived only once it went cold, and only
215
+ after its harness is gone. Archived tasks leave `gemba list` unless
216
+ `--include-archived` is given.
217
+
218
+ ### Keep the metadata
219
+
220
+ The hours grow, the work gets invoiced. Tell the agent, from the tasks repo or inside
221
+ the harness, and the `gemba-set` skill runs:
222
+
223
+ ```bash
224
+ gemba set SUP-1 hours+=2 # added to the number the task holds
225
+ gemba set SUP-1 invoiced=2026-10-03 # a value, written by the type of its field
226
+ gemba set SUP-1 merge_requests=null # cleared
227
+ ```
228
+
229
+ It rewrites only the metadata, never `updated_at`, and refuses an undeclared key or a
230
+ value of the wrong type.
231
+
232
+ ## The config
233
+
234
+ `gemba.yaml` is edited by hand, or by the `gemba-config` skill when you ask the agent
235
+ to add a workstream, a field or a rule; `gemba config check` validates it and
236
+ `gemba config show` prints it resolved, as the skills read it. No command rewrites it.
237
+
238
+ ```yaml
239
+ default_workstream: operations
240
+
241
+ agent_providers: [claude, agents]
242
+
243
+ ide: code -n
244
+ organization: nakatomi
245
+ repos_dir: ~/projects
246
+
247
+ metadata:
248
+ - { name: client, type: text, required: true, description: Who the work is for }
249
+ - { name: hours, type: number, description: Total hours spent on the task }
250
+ - { name: invoiced, type: date, description: When the work was invoiced }
251
+
252
+ harness:
253
+ guide: |
254
+ Client data never leaves the harness: strip it from every asset you save.
255
+
256
+ workstreams:
257
+ support:
258
+ prefix: SUP
259
+ description: Investigate a client-reported problem and deliver a report or a fix
260
+ worktree:
261
+ add:
262
+ rules:
263
+ - start from the branch deployed to production; ask when the task does not say it
264
+ operations:
265
+ prefix: OPS
266
+ description: Anything that does not fit another workstream
267
+ ```
268
+
269
+ What you can customize, all of it here and never in a skill:
270
+
271
+ - **Workstreams**, each with a prefix, a description the agent uses to choose one, and
272
+ its own fields, and the one that takes a task that fits no other.
273
+ - **Metadata fields**, shared or per workstream, each of one type: `text`, `number`,
274
+ `boolean` or `date`. Gemba reads, filters, groups and adds values by their type and
275
+ never interprets their meaning.
276
+ - **Agent providers**, the IDE command, the organization and the repositories folder.
277
+ - **`context` and `rules` for every process**, at the top level and per workstream:
278
+ what the agent should know and do when it creates, lists, launches, notes, records,
279
+ marks, archives or checks out, with the workstream's rule winning a contradiction.
280
+ - **The guide** of every harness, with a paragraph of your organization and one of
281
+ the workstream.
282
+
283
+ Changing any of it is a config edit: no skill and no code changes.
284
+
285
+ ## Status
286
+
287
+ Gemba is young, at version 0.x, and built from daily use: the whole cycle above
288
+ works, and the shape of the commands may still change between minor versions, with
289
+ the changelog saying so. Ideas, questions and reports of what got in your way are the
290
+ most useful contribution right now: see [CONTRIBUTING.md](CONTRIBUTING.md), which also
291
+ describes how the product is developed, by specification, one case per scenario.
292
+
293
+ ## License
294
+
295
+ [MIT](LICENSE).