@pennyfarthing/core 11.4.0 → 11.5.0-alpha.0

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 (511) hide show
  1. package/package.json +1 -1
  2. package/packages/core/dist/cli/commands/cyclist.js +1 -1
  3. package/packages/core/dist/cli/commands/cyclist.js.map +1 -1
  4. package/packages/core/dist/cli/commands/cyclist.test.js +3 -3
  5. package/packages/core/dist/cli/commands/cyclist.test.js.map +1 -1
  6. package/packages/core/dist/cli/commands/doctor-persona-config-false-negative.test.d.ts +22 -0
  7. package/packages/core/dist/cli/commands/doctor-persona-config-false-negative.test.d.ts.map +1 -0
  8. package/packages/core/dist/cli/commands/doctor-persona-config-false-negative.test.js +161 -0
  9. package/packages/core/dist/cli/commands/doctor-persona-config-false-negative.test.js.map +1 -0
  10. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
  11. package/packages/core/dist/cli/commands/doctor.js +101 -33
  12. package/packages/core/dist/cli/commands/doctor.js.map +1 -1
  13. package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
  14. package/packages/core/dist/cli/commands/init.js +33 -13
  15. package/packages/core/dist/cli/commands/init.js.map +1 -1
  16. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.d.ts +17 -0
  17. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.d.ts.map +1 -0
  18. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.js +470 -0
  19. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.js.map +1 -0
  20. package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
  21. package/packages/core/dist/cli/commands/update.js +68 -17
  22. package/packages/core/dist/cli/commands/update.js.map +1 -1
  23. package/packages/core/dist/cli/cyclist-migration.test.d.ts +16 -0
  24. package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +1 -0
  25. package/packages/core/dist/cli/cyclist-migration.test.js +229 -0
  26. package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -0
  27. package/packages/core/dist/cli/index.js +2 -21
  28. package/packages/core/dist/cli/index.js.map +1 -1
  29. package/packages/core/dist/cli/utils/node-modules.d.ts +7 -0
  30. package/packages/core/dist/cli/utils/node-modules.d.ts.map +1 -1
  31. package/packages/core/dist/cli/utils/node-modules.js +39 -0
  32. package/packages/core/dist/cli/utils/node-modules.js.map +1 -1
  33. package/packages/core/dist/cli/utils/settings.d.ts +1 -1
  34. package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
  35. package/packages/core/dist/cli/utils/settings.js +24 -21
  36. package/packages/core/dist/cli/utils/settings.js.map +1 -1
  37. package/packages/core/dist/cli/utils/stale-artifacts.d.ts +59 -0
  38. package/packages/core/dist/cli/utils/stale-artifacts.d.ts.map +1 -0
  39. package/packages/core/dist/cli/utils/stale-artifacts.js +163 -0
  40. package/packages/core/dist/cli/utils/stale-artifacts.js.map +1 -0
  41. package/packages/core/dist/public/css/react.css +1 -1
  42. package/packages/core/dist/public/js/react/react.js +39 -39
  43. package/packages/core/dist/scripts/benchmark-integration.d.ts +182 -0
  44. package/packages/core/dist/scripts/benchmark-integration.d.ts.map +1 -0
  45. package/packages/core/dist/scripts/benchmark-integration.js +691 -0
  46. package/packages/core/dist/scripts/benchmark-integration.js.map +1 -0
  47. package/packages/core/dist/scripts/job-fair-aggregator.d.ts +150 -0
  48. package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +1 -0
  49. package/packages/core/dist/scripts/job-fair-aggregator.js +547 -0
  50. package/packages/core/dist/scripts/job-fair-aggregator.js.map +1 -0
  51. package/packages/core/dist/scripts/theme-detail.test.d.ts.map +1 -0
  52. package/packages/core/dist/scripts/theme-detail.test.js.map +1 -0
  53. package/packages/core/dist/server/api/context.d.ts.map +1 -1
  54. package/packages/core/dist/server/api/context.js +23 -5
  55. package/packages/core/dist/server/api/context.js.map +1 -1
  56. package/packages/core/dist/server/api/index.d.ts +0 -1
  57. package/packages/core/dist/server/api/index.d.ts.map +1 -1
  58. package/packages/core/dist/server/api/index.js +0 -2
  59. package/packages/core/dist/server/api/index.js.map +1 -1
  60. package/packages/core/dist/server/api/settings.d.ts.map +1 -1
  61. package/packages/core/dist/server/api/settings.js +6 -0
  62. package/packages/core/dist/server/api/settings.js.map +1 -1
  63. package/packages/core/dist/server/otlp-receiver.d.ts +0 -4
  64. package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
  65. package/packages/core/dist/server/otlp-receiver.js +0 -18
  66. package/packages/core/dist/server/otlp-receiver.js.map +1 -1
  67. package/packages/core/dist/server/otlp-receiver.test.js +0 -27
  68. package/packages/core/dist/server/otlp-receiver.test.js.map +1 -1
  69. package/packages/core/dist/server/server.d.ts +1 -1
  70. package/packages/core/dist/server/server.d.ts.map +1 -1
  71. package/packages/core/dist/server/server.js +2 -4
  72. package/packages/core/dist/server/server.js.map +1 -1
  73. package/packages/core/dist/workflow/cross-entity-validation.d.ts.map +1 -1
  74. package/packages/core/dist/workflow/cross-entity-validation.js.map +1 -1
  75. package/packages/core/src/public/App.tsx +0 -2
  76. package/packages/core/src/public/components/BikeRackWorkspace.tsx +0 -2
  77. package/packages/core/src/public/components/DockviewWorkspace.tsx +0 -4
  78. package/packages/core/src/public/components/StandalonePanel.tsx +0 -2
  79. package/packages/core/src/public/components/panels/SettingsPanel.tsx +83 -283
  80. package/packages/core/src/public/components/panels/SprintPanel.tsx +9 -1
  81. package/packages/core/src/public/components/panels/index.ts +0 -1
  82. package/packages/core/src/public/hooks/index.ts +0 -3
  83. package/packages/core/src/public/hooks/useSprint.ts +11 -2
  84. package/packages/core/src/public/images/cyclist-tandem-source.png +0 -0
  85. package/packages/core/src/public/styles/tailwind.css +0 -101
  86. package/pennyfarthing-dist/guides/bikerack.md +94 -0
  87. package/pennyfarthing-dist/personas/themes/firefly.yaml +12 -12
  88. package/pennyfarthing-dist/pf/__pycache__/__init__.cpython-311.pyc +0 -0
  89. package/pennyfarthing-dist/pf/__pycache__/__init__.cpython-314.pyc +0 -0
  90. package/pennyfarthing-dist/pf/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
  91. package/pennyfarthing-dist/pf/__pycache__/cli.cpython-311.pyc +0 -0
  92. package/pennyfarthing-dist/pf/__pycache__/cli.cpython-314.pyc +0 -0
  93. package/pennyfarthing-dist/pf/__pycache__/config.cpython-314.pyc +0 -0
  94. package/pennyfarthing-dist/pf/__pycache__/context.cpython-311.pyc +0 -0
  95. package/pennyfarthing-dist/pf/__pycache__/context.cpython-314.pyc +0 -0
  96. package/pennyfarthing-dist/pf/__pycache__/hooks.cpython-314.pyc +0 -0
  97. package/pennyfarthing-dist/pf/__pycache__/jira.cpython-314.pyc +0 -0
  98. package/pennyfarthing-dist/pf/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
  99. package/pennyfarthing-dist/pf/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
  100. package/pennyfarthing-dist/pf/__pycache__/jira_sync.cpython-314.pyc +0 -0
  101. package/pennyfarthing-dist/pf/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
  102. package/pennyfarthing-dist/pf/__pycache__/output.cpython-314.pyc +0 -0
  103. package/pennyfarthing-dist/pf/__pycache__/patch_mode.cpython-314.pyc +0 -0
  104. package/pennyfarthing-dist/pf/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  105. package/pennyfarthing-dist/pf/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  106. package/pennyfarthing-dist/pf/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  107. package/pennyfarthing-dist/pf/__pycache__/sprint.cpython-314.pyc +0 -0
  108. package/pennyfarthing-dist/pf/__pycache__/workflow.cpython-311.pyc +0 -0
  109. package/pennyfarthing-dist/pf/__pycache__/workflow.cpython-314.pyc +0 -0
  110. package/pennyfarthing-dist/pf/bc/__pycache__/__init__.cpython-311.pyc +0 -0
  111. package/pennyfarthing-dist/pf/bc/__pycache__/__init__.cpython-314.pyc +0 -0
  112. package/pennyfarthing-dist/pf/bc/__pycache__/cli.cpython-311.pyc +0 -0
  113. package/pennyfarthing-dist/pf/bc/__pycache__/cli.cpython-314.pyc +0 -0
  114. package/pennyfarthing-dist/pf/bc/__pycache__/focus.cpython-311.pyc +0 -0
  115. package/pennyfarthing-dist/pf/bc/__pycache__/focus.cpython-314.pyc +0 -0
  116. package/pennyfarthing-dist/pf/bc/__pycache__/split.cpython-314.pyc +0 -0
  117. package/pennyfarthing-dist/pf/bc/cli.py +0 -1
  118. package/pennyfarthing-dist/pf/bc/focus.py +0 -1
  119. package/pennyfarthing-dist/pf/bikerack/__pycache__/__init__.cpython-311.pyc +0 -0
  120. package/pennyfarthing-dist/pf/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
  121. package/pennyfarthing-dist/pf/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
  122. package/pennyfarthing-dist/pf/bikerack/__pycache__/audit_log_panel.cpython-314.pyc +0 -0
  123. package/pennyfarthing-dist/pf/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  124. package/pennyfarthing-dist/pf/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  125. package/pennyfarthing-dist/pf/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  126. package/pennyfarthing-dist/pf/bikerack/__pycache__/cli.cpython-311.pyc +0 -0
  127. package/pennyfarthing-dist/pf/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  128. package/pennyfarthing-dist/pf/bikerack/__pycache__/context_meter_footer.cpython-314.pyc +0 -0
  129. package/pennyfarthing-dist/pf/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  130. package/pennyfarthing-dist/pf/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  131. package/pennyfarthing-dist/pf/bikerack/__pycache__/events.cpython-314.pyc +0 -0
  132. package/pennyfarthing-dist/pf/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  133. package/pennyfarthing-dist/pf/bikerack/__pycache__/launcher.cpython-311.pyc +0 -0
  134. package/pennyfarthing-dist/pf/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  135. package/pennyfarthing-dist/pf/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
  136. package/pennyfarthing-dist/pf/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
  137. package/pennyfarthing-dist/pf/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  138. package/pennyfarthing-dist/pf/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
  139. package/pennyfarthing-dist/pf/bikerack/__pycache__/story_detail_screen.cpython-314.pyc +0 -0
  140. package/pennyfarthing-dist/pf/bikerack/__pycache__/story_detail_widget.cpython-314.pyc +0 -0
  141. package/pennyfarthing-dist/pf/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  142. package/pennyfarthing-dist/pf/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  143. package/pennyfarthing-dist/pf/bikerack/context_meter_footer.py +115 -35
  144. package/pennyfarthing-dist/pf/bikerack/portrait_resolver.py +14 -2
  145. package/pennyfarthing-dist/pf/bikerack/progress_panel.py +54 -0
  146. package/pennyfarthing-dist/pf/bikerack/sprint_panel.py +58 -0
  147. package/pennyfarthing-dist/pf/bikerack/story_detail_screen.py +10 -105
  148. package/pennyfarthing-dist/pf/bikerack/story_detail_widget.py +167 -0
  149. package/pennyfarthing-dist/pf/bikerack/tui.py +140 -50
  150. package/pennyfarthing-dist/pf/bmad/__pycache__/__init__.cpython-314.pyc +0 -0
  151. package/pennyfarthing-dist/pf/bmad/__pycache__/cli.cpython-314.pyc +0 -0
  152. package/pennyfarthing-dist/pf/bmad/cli.py +0 -1
  153. package/pennyfarthing-dist/pf/bmad/importer.py +0 -1
  154. package/pennyfarthing-dist/pf/bmad/parser.py +0 -1
  155. package/pennyfarthing-dist/pf/bmad/sync.py +1 -3
  156. package/pennyfarthing-dist/pf/bmad/test_parser.py +0 -4
  157. package/pennyfarthing-dist/pf/bmad/test_sync.py +0 -3
  158. package/pennyfarthing-dist/pf/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  159. package/pennyfarthing-dist/pf/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  160. package/pennyfarthing-dist/pf/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  161. package/pennyfarthing-dist/pf/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  162. package/pennyfarthing-dist/pf/brownfield/cli.py +1 -1
  163. package/pennyfarthing-dist/pf/cli.py +145 -111
  164. package/pennyfarthing-dist/pf/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
  165. package/pennyfarthing-dist/pf/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
  166. package/pennyfarthing-dist/pf/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
  167. package/pennyfarthing-dist/pf/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
  168. package/pennyfarthing-dist/pf/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
  169. package/pennyfarthing-dist/pf/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
  170. package/pennyfarthing-dist/pf/common/__init__.py +2 -0
  171. package/pennyfarthing-dist/pf/common/__pycache__/__init__.cpython-311.pyc +0 -0
  172. package/pennyfarthing-dist/pf/common/__pycache__/__init__.cpython-314.pyc +0 -0
  173. package/pennyfarthing-dist/pf/common/__pycache__/config.cpython-311.pyc +0 -0
  174. package/pennyfarthing-dist/pf/common/__pycache__/config.cpython-314.pyc +0 -0
  175. package/pennyfarthing-dist/pf/common/__pycache__/output.cpython-311.pyc +0 -0
  176. package/pennyfarthing-dist/pf/common/__pycache__/output.cpython-314.pyc +0 -0
  177. package/pennyfarthing-dist/pf/common/__pycache__/pr_config.cpython-314.pyc +0 -0
  178. package/pennyfarthing-dist/pf/common/__pycache__/themes.cpython-314.pyc +0 -0
  179. package/pennyfarthing-dist/pf/common/config.py +43 -0
  180. package/pennyfarthing-dist/pf/common/themes.py +7 -5
  181. package/pennyfarthing-dist/pf/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  182. package/pennyfarthing-dist/pf/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
  183. package/pennyfarthing-dist/pf/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  184. package/pennyfarthing-dist/pf/complexity/__pycache__/cli.cpython-314.pyc +0 -0
  185. package/pennyfarthing-dist/pf/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
  186. package/pennyfarthing-dist/pf/complexity/__pycache__/models.cpython-314.pyc +0 -0
  187. package/pennyfarthing-dist/pf/consultation/__pycache__/__init__.cpython-311.pyc +0 -0
  188. package/pennyfarthing-dist/pf/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
  189. package/pennyfarthing-dist/pf/consultation/__pycache__/cli.cpython-311.pyc +0 -0
  190. package/pennyfarthing-dist/pf/consultation/__pycache__/cli.cpython-314.pyc +0 -0
  191. package/pennyfarthing-dist/pf/consultation/__pycache__/dialogue_manager.cpython-314.pyc +0 -0
  192. package/pennyfarthing-dist/pf/context.py +1 -1
  193. package/pennyfarthing-dist/pf/deadcode/__pycache__/__init__.cpython-311.pyc +0 -0
  194. package/pennyfarthing-dist/pf/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
  195. package/pennyfarthing-dist/pf/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
  196. package/pennyfarthing-dist/pf/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  197. package/pennyfarthing-dist/pf/deadcode/__pycache__/cli.cpython-311.pyc +0 -0
  198. package/pennyfarthing-dist/pf/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
  199. package/pennyfarthing-dist/pf/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
  200. package/pennyfarthing-dist/pf/deadcode/__pycache__/models.cpython-314.pyc +0 -0
  201. package/pennyfarthing-dist/pf/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  202. package/pennyfarthing-dist/pf/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
  203. package/pennyfarthing-dist/pf/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  204. package/pennyfarthing-dist/pf/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
  205. package/pennyfarthing-dist/pf/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
  206. package/pennyfarthing-dist/pf/dependencies/__pycache__/models.cpython-314.pyc +0 -0
  207. package/pennyfarthing-dist/pf/epic/__pycache__/__init__.cpython-311.pyc +0 -0
  208. package/pennyfarthing-dist/pf/epic/__pycache__/__init__.cpython-314.pyc +0 -0
  209. package/pennyfarthing-dist/pf/epic/__pycache__/cli.cpython-311.pyc +0 -0
  210. package/pennyfarthing-dist/pf/epic/__pycache__/cli.cpython-314.pyc +0 -0
  211. package/pennyfarthing-dist/pf/git/__pycache__/__init__.cpython-314.pyc +0 -0
  212. package/pennyfarthing-dist/pf/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  213. package/pennyfarthing-dist/pf/git/__pycache__/status_all.cpython-314.pyc +0 -0
  214. package/pennyfarthing-dist/pf/git/hooks_installer.py +7 -6
  215. package/pennyfarthing-dist/pf/git_group/__pycache__/__init__.cpython-311.pyc +0 -0
  216. package/pennyfarthing-dist/pf/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
  217. package/pennyfarthing-dist/pf/git_group/__pycache__/cli.cpython-311.pyc +0 -0
  218. package/pennyfarthing-dist/pf/git_group/__pycache__/cli.cpython-314.pyc +0 -0
  219. package/pennyfarthing-dist/pf/handoff/__pycache__/__init__.cpython-311.pyc +0 -0
  220. package/pennyfarthing-dist/pf/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
  221. package/pennyfarthing-dist/pf/handoff/__pycache__/cli.cpython-311.pyc +0 -0
  222. package/pennyfarthing-dist/pf/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  223. package/pennyfarthing-dist/pf/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  224. package/pennyfarthing-dist/pf/handoff/__pycache__/gate_file.cpython-314.pyc +0 -0
  225. package/pennyfarthing-dist/pf/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
  226. package/pennyfarthing-dist/pf/handoff/__pycache__/marker.cpython-314.pyc +0 -0
  227. package/pennyfarthing-dist/pf/handoff/__pycache__/phase_check.cpython-314.pyc +0 -0
  228. package/pennyfarthing-dist/pf/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  229. package/pennyfarthing-dist/pf/handoff/gate_file.py +5 -1
  230. package/pennyfarthing-dist/pf/healthscore/__pycache__/__init__.cpython-311.pyc +0 -0
  231. package/pennyfarthing-dist/pf/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  232. package/pennyfarthing-dist/pf/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  233. package/pennyfarthing-dist/pf/healthscore/__pycache__/analyze.cpython-311.pyc +0 -0
  234. package/pennyfarthing-dist/pf/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  235. package/pennyfarthing-dist/pf/healthscore/__pycache__/cli.cpython-311.pyc +0 -0
  236. package/pennyfarthing-dist/pf/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
  237. package/pennyfarthing-dist/pf/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
  238. package/pennyfarthing-dist/pf/healthscore/__pycache__/models.cpython-311.pyc +0 -0
  239. package/pennyfarthing-dist/pf/healthscore/__pycache__/models.cpython-314.pyc +0 -0
  240. package/pennyfarthing-dist/pf/hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  241. package/pennyfarthing-dist/pf/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
  242. package/pennyfarthing-dist/pf/hooks/__pycache__/bell_mode.cpython-311.pyc +0 -0
  243. package/pennyfarthing-dist/pf/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
  244. package/pennyfarthing-dist/pf/hooks/__pycache__/cli.cpython-311.pyc +0 -0
  245. package/pennyfarthing-dist/pf/hooks/__pycache__/cli.cpython-314.pyc +0 -0
  246. package/pennyfarthing-dist/pf/hooks/__pycache__/context_breaker.cpython-311.pyc +0 -0
  247. package/pennyfarthing-dist/pf/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
  248. package/pennyfarthing-dist/pf/hooks/__pycache__/context_warning.cpython-311.pyc +0 -0
  249. package/pennyfarthing-dist/pf/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
  250. package/pennyfarthing-dist/pf/hooks/__pycache__/cyclist_pretooluse.cpython-311.pyc +0 -0
  251. package/pennyfarthing-dist/pf/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
  252. package/pennyfarthing-dist/pf/hooks/__pycache__/pre_edit_check.cpython-311.pyc +0 -0
  253. package/pennyfarthing-dist/pf/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
  254. package/pennyfarthing-dist/pf/hooks/__pycache__/reflector_check.cpython-311.pyc +0 -0
  255. package/pennyfarthing-dist/pf/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
  256. package/pennyfarthing-dist/pf/hooks/__pycache__/schema_validation.cpython-311.pyc +0 -0
  257. package/pennyfarthing-dist/pf/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
  258. package/pennyfarthing-dist/pf/hooks/__pycache__/session_start.cpython-311.pyc +0 -0
  259. package/pennyfarthing-dist/pf/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
  260. package/pennyfarthing-dist/pf/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
  261. package/pennyfarthing-dist/pf/hooks/__pycache__/sprint_yaml_validation.cpython-311.pyc +0 -0
  262. package/pennyfarthing-dist/pf/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
  263. package/pennyfarthing-dist/pf/hooks/__pycache__/statusline.cpython-311.pyc +0 -0
  264. package/pennyfarthing-dist/pf/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
  265. package/pennyfarthing-dist/pf/hooks/statusline.py +11 -0
  266. package/pennyfarthing-dist/pf/hotspots/__pycache__/__init__.cpython-311.pyc +0 -0
  267. package/pennyfarthing-dist/pf/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  268. package/pennyfarthing-dist/pf/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
  269. package/pennyfarthing-dist/pf/hotspots/__pycache__/analyze.cpython-311.pyc +0 -0
  270. package/pennyfarthing-dist/pf/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  271. package/pennyfarthing-dist/pf/hotspots/__pycache__/cli.cpython-311.pyc +0 -0
  272. package/pennyfarthing-dist/pf/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  273. package/pennyfarthing-dist/pf/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
  274. package/pennyfarthing-dist/pf/hotspots/__pycache__/models.cpython-311.pyc +0 -0
  275. package/pennyfarthing-dist/pf/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  276. package/pennyfarthing-dist/pf/jira/__init__.py +0 -6
  277. package/pennyfarthing-dist/pf/jira/__pycache__/__init__.cpython-311.pyc +0 -0
  278. package/pennyfarthing-dist/pf/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  279. package/pennyfarthing-dist/pf/jira/__pycache__/__main__.cpython-314.pyc +0 -0
  280. package/pennyfarthing-dist/pf/jira/__pycache__/bidirectional.cpython-311.pyc +0 -0
  281. package/pennyfarthing-dist/pf/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  282. package/pennyfarthing-dist/pf/jira/__pycache__/claim.cpython-311.pyc +0 -0
  283. package/pennyfarthing-dist/pf/jira/__pycache__/claim.cpython-314.pyc +0 -0
  284. package/pennyfarthing-dist/pf/jira/__pycache__/cli.cpython-311.pyc +0 -0
  285. package/pennyfarthing-dist/pf/jira/__pycache__/cli.cpython-314.pyc +0 -0
  286. package/pennyfarthing-dist/pf/jira/__pycache__/client.cpython-311.pyc +0 -0
  287. package/pennyfarthing-dist/pf/jira/__pycache__/client.cpython-314.pyc +0 -0
  288. package/pennyfarthing-dist/pf/jira/__pycache__/compat.cpython-314.pyc +0 -0
  289. package/pennyfarthing-dist/pf/jira/__pycache__/create.cpython-311.pyc +0 -0
  290. package/pennyfarthing-dist/pf/jira/__pycache__/create.cpython-314.pyc +0 -0
  291. package/pennyfarthing-dist/pf/jira/__pycache__/epic.cpython-311.pyc +0 -0
  292. package/pennyfarthing-dist/pf/jira/__pycache__/epic.cpython-314.pyc +0 -0
  293. package/pennyfarthing-dist/pf/jira/__pycache__/mappings.cpython-314.pyc +0 -0
  294. package/pennyfarthing-dist/pf/jira/__pycache__/models.cpython-314.pyc +0 -0
  295. package/pennyfarthing-dist/pf/jira/__pycache__/operations.cpython-311.pyc +0 -0
  296. package/pennyfarthing-dist/pf/jira/__pycache__/operations.cpython-314.pyc +0 -0
  297. package/pennyfarthing-dist/pf/jira/__pycache__/reconcile.cpython-311.pyc +0 -0
  298. package/pennyfarthing-dist/pf/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  299. package/pennyfarthing-dist/pf/jira/__pycache__/story.cpython-311.pyc +0 -0
  300. package/pennyfarthing-dist/pf/jira/__pycache__/story.cpython-314.pyc +0 -0
  301. package/pennyfarthing-dist/pf/jira/__pycache__/sync.cpython-311.pyc +0 -0
  302. package/pennyfarthing-dist/pf/jira/__pycache__/sync.cpython-314.pyc +0 -0
  303. package/pennyfarthing-dist/pf/jira/claim.py +14 -44
  304. package/pennyfarthing-dist/pf/jira/cli.py +124 -14
  305. package/pennyfarthing-dist/pf/jira/client.py +51 -87
  306. package/pennyfarthing-dist/pf/jira/reconcile.py +1 -1
  307. package/pennyfarthing-dist/pf/jira/story.py +6 -4
  308. package/pennyfarthing-dist/pf/jira/sync.py +2 -2
  309. package/pennyfarthing-dist/pf/launch/__pycache__/__init__.cpython-311.pyc +0 -0
  310. package/pennyfarthing-dist/pf/launch/__pycache__/__init__.cpython-314.pyc +0 -0
  311. package/pennyfarthing-dist/pf/launch/__pycache__/cli.cpython-311.pyc +0 -0
  312. package/pennyfarthing-dist/pf/launch/__pycache__/cli.cpython-314.pyc +0 -0
  313. package/pennyfarthing-dist/pf/migration/__init__.py +1 -1
  314. package/pennyfarthing-dist/pf/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  315. package/pennyfarthing-dist/pf/migration/__pycache__/__main__.cpython-314.pyc +0 -0
  316. package/pennyfarthing-dist/pf/migration/__pycache__/cli.cpython-314.pyc +0 -0
  317. package/pennyfarthing-dist/pf/migration/__pycache__/session.cpython-314.pyc +0 -0
  318. package/pennyfarthing-dist/pf/migration/__pycache__/skill.cpython-314.pyc +0 -0
  319. package/pennyfarthing-dist/pf/migration/__pycache__/step.cpython-314.pyc +0 -0
  320. package/pennyfarthing-dist/pf/migration/__pycache__/validate.cpython-314.pyc +0 -0
  321. package/pennyfarthing-dist/pf/migration/cli.py +0 -1
  322. package/pennyfarthing-dist/pf/package/__init__.py +0 -0
  323. package/pennyfarthing-dist/pf/package/__pycache__/__init__.cpython-314.pyc +0 -0
  324. package/pennyfarthing-dist/pf/package/__pycache__/cli.cpython-314.pyc +0 -0
  325. package/pennyfarthing-dist/pf/package/__pycache__/discovery.cpython-314.pyc +0 -0
  326. package/pennyfarthing-dist/pf/package/__pycache__/portraits.cpython-314.pyc +0 -0
  327. package/pennyfarthing-dist/pf/package/cli.py +186 -0
  328. package/pennyfarthing-dist/pf/package/discovery.py +130 -0
  329. package/pennyfarthing-dist/pf/package/portraits.py +243 -0
  330. package/pennyfarthing-dist/pf/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  331. package/pennyfarthing-dist/pf/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
  332. package/pennyfarthing-dist/pf/preflight/__pycache__/cli.cpython-314.pyc +0 -0
  333. package/pennyfarthing-dist/pf/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  334. package/pennyfarthing-dist/pf/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  335. package/pennyfarthing-dist/pf/prime/__pycache__/__main__.cpython-314.pyc +0 -0
  336. package/pennyfarthing-dist/pf/prime/__pycache__/cli.cpython-314.pyc +0 -0
  337. package/pennyfarthing-dist/pf/prime/__pycache__/loader.cpython-314.pyc +0 -0
  338. package/pennyfarthing-dist/pf/prime/__pycache__/models.cpython-314.pyc +0 -0
  339. package/pennyfarthing-dist/pf/prime/__pycache__/persona.cpython-314.pyc +0 -0
  340. package/pennyfarthing-dist/pf/prime/__pycache__/session.cpython-314.pyc +0 -0
  341. package/pennyfarthing-dist/pf/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  342. package/pennyfarthing-dist/pf/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
  343. package/pennyfarthing-dist/pf/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  344. package/pennyfarthing-dist/pf/prime/loader.py +21 -7
  345. package/pennyfarthing-dist/pf/prime/workflow.py +11 -3
  346. package/pennyfarthing-dist/pf/release/__init__.py +0 -0
  347. package/pennyfarthing-dist/pf/release/__pycache__/__init__.cpython-314.pyc +0 -0
  348. package/pennyfarthing-dist/pf/release/__pycache__/cli.cpython-314.pyc +0 -0
  349. package/pennyfarthing-dist/pf/release/__pycache__/deprecate.cpython-314.pyc +0 -0
  350. package/pennyfarthing-dist/pf/release/__pycache__/dry_run.cpython-314.pyc +0 -0
  351. package/pennyfarthing-dist/pf/release/cli.py +112 -0
  352. package/pennyfarthing-dist/pf/release/deprecate.py +187 -0
  353. package/pennyfarthing-dist/pf/release/dry_run.py +187 -0
  354. package/pennyfarthing-dist/pf/session/__pycache__/__init__.cpython-311.pyc +0 -0
  355. package/pennyfarthing-dist/pf/session/__pycache__/__init__.cpython-314.pyc +0 -0
  356. package/pennyfarthing-dist/pf/session/__pycache__/cli.cpython-311.pyc +0 -0
  357. package/pennyfarthing-dist/pf/session/__pycache__/cli.cpython-314.pyc +0 -0
  358. package/pennyfarthing-dist/pf/settings/__pycache__/__init__.cpython-314.pyc +0 -0
  359. package/pennyfarthing-dist/pf/settings/__pycache__/cli.cpython-314.pyc +0 -0
  360. package/pennyfarthing-dist/pf/settings/__pycache__/settings.cpython-314.pyc +0 -0
  361. package/pennyfarthing-dist/pf/sprint/__pycache__/__init__.cpython-311.pyc +0 -0
  362. package/pennyfarthing-dist/pf/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  363. package/pennyfarthing-dist/pf/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  364. package/pennyfarthing-dist/pf/sprint/__pycache__/archive.cpython-311.pyc +0 -0
  365. package/pennyfarthing-dist/pf/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  366. package/pennyfarthing-dist/pf/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  367. package/pennyfarthing-dist/pf/sprint/__pycache__/cli.cpython-311.pyc +0 -0
  368. package/pennyfarthing-dist/pf/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  369. package/pennyfarthing-dist/pf/sprint/__pycache__/epic_add.cpython-311.pyc +0 -0
  370. package/pennyfarthing-dist/pf/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  371. package/pennyfarthing-dist/pf/sprint/__pycache__/epic_update.cpython-311.pyc +0 -0
  372. package/pennyfarthing-dist/pf/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
  373. package/pennyfarthing-dist/pf/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
  374. package/pennyfarthing-dist/pf/sprint/__pycache__/loader.cpython-311.pyc +0 -0
  375. package/pennyfarthing-dist/pf/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  376. package/pennyfarthing-dist/pf/sprint/__pycache__/shard_merge.cpython-314.pyc +0 -0
  377. package/pennyfarthing-dist/pf/sprint/__pycache__/status.cpython-311.pyc +0 -0
  378. package/pennyfarthing-dist/pf/sprint/__pycache__/status.cpython-314.pyc +0 -0
  379. package/pennyfarthing-dist/pf/sprint/__pycache__/story_add.cpython-311.pyc +0 -0
  380. package/pennyfarthing-dist/pf/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  381. package/pennyfarthing-dist/pf/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  382. package/pennyfarthing-dist/pf/sprint/__pycache__/story_update.cpython-311.pyc +0 -0
  383. package/pennyfarthing-dist/pf/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  384. package/pennyfarthing-dist/pf/sprint/__pycache__/validate_cmd.cpython-311.pyc +0 -0
  385. package/pennyfarthing-dist/pf/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  386. package/pennyfarthing-dist/pf/sprint/__pycache__/validator.cpython-311.pyc +0 -0
  387. package/pennyfarthing-dist/pf/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  388. package/pennyfarthing-dist/pf/sprint/__pycache__/work.cpython-311.pyc +0 -0
  389. package/pennyfarthing-dist/pf/sprint/__pycache__/work.cpython-314.pyc +0 -0
  390. package/pennyfarthing-dist/pf/sprint/__pycache__/yaml_io.cpython-311.pyc +0 -0
  391. package/pennyfarthing-dist/pf/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  392. package/pennyfarthing-dist/pf/sprint/cli.py +1 -1
  393. package/pennyfarthing-dist/pf/sprint/loader.py +6 -74
  394. package/pennyfarthing-dist/pf/sprint/shard_merge.py +126 -0
  395. package/pennyfarthing-dist/pf/sprint/story_finish.py +4 -2
  396. package/pennyfarthing-dist/pf/sprint/yaml_io.py +8 -53
  397. package/pennyfarthing-dist/pf/story/__pycache__/__init__.cpython-314.pyc +0 -0
  398. package/pennyfarthing-dist/pf/story/__pycache__/__main__.cpython-314.pyc +0 -0
  399. package/pennyfarthing-dist/pf/story/__pycache__/cli.cpython-314.pyc +0 -0
  400. package/pennyfarthing-dist/pf/story/__pycache__/create.cpython-314.pyc +0 -0
  401. package/pennyfarthing-dist/pf/story/__pycache__/size.cpython-314.pyc +0 -0
  402. package/pennyfarthing-dist/pf/story/__pycache__/template.cpython-314.pyc +0 -0
  403. package/pennyfarthing-dist/pf/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  404. package/pennyfarthing-dist/pf/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  405. package/pennyfarthing-dist/pf/tests/__pycache__/test_108_1_gate_migration.cpython-314-pytest-9.0.2.pyc +0 -0
  406. package/pennyfarthing-dist/pf/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
  407. package/pennyfarthing-dist/pf/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
  408. package/pennyfarthing-dist/pf/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  409. package/pennyfarthing-dist/pf/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  410. package/pennyfarthing-dist/pf/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  411. package/pennyfarthing-dist/pf/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
  412. package/pennyfarthing-dist/pf/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
  413. package/pennyfarthing-dist/pf/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  414. package/pennyfarthing-dist/pf/tests/__pycache__/test_confidence_sm_evaluation.cpython-314-pytest-9.0.2.pyc +0 -0
  415. package/pennyfarthing-dist/pf/tests/__pycache__/test_confidence_sm_gate.cpython-314-pytest-9.0.2.pyc +0 -0
  416. package/pennyfarthing-dist/pf/tests/__pycache__/test_dialogue_manager.cpython-314-pytest-9.0.2.pyc +0 -0
  417. package/pennyfarthing-dist/pf/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
  418. package/pennyfarthing-dist/pf/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  419. package/pennyfarthing-dist/pf/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  420. package/pennyfarthing-dist/pf/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
  421. package/pennyfarthing-dist/pf/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
  422. package/pennyfarthing-dist/pf/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  423. package/pennyfarthing-dist/pf/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  424. package/pennyfarthing-dist/pf/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  425. package/pennyfarthing-dist/pf/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  426. package/pennyfarthing-dist/pf/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  427. package/pennyfarthing-dist/pf/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  428. package/pennyfarthing-dist/pf/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  429. package/pennyfarthing-dist/pf/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
  430. package/pennyfarthing-dist/pf/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  431. package/pennyfarthing-dist/pf/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
  432. package/pennyfarthing-dist/pf/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  433. package/pennyfarthing-dist/pf/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  434. package/pennyfarthing-dist/pf/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
  435. package/pennyfarthing-dist/pf/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
  436. package/pennyfarthing-dist/pf/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
  437. package/pennyfarthing-dist/pf/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
  438. package/pennyfarthing-dist/pf/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
  439. package/pennyfarthing-dist/pf/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  440. package/pennyfarthing-dist/pf/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  441. package/pennyfarthing-dist/pf/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  442. package/pennyfarthing-dist/pf/tests/test_cli_modules.py +32 -137
  443. package/pennyfarthing-dist/pf/tests/test_codemarkers.py +0 -15
  444. package/pennyfarthing-dist/pf/tests/test_dist_root.py +720 -0
  445. package/pennyfarthing-dist/pf/tests/test_package_structure.py +24 -70
  446. package/pennyfarthing-dist/pf/theme/__pycache__/__init__.cpython-311.pyc +0 -0
  447. package/pennyfarthing-dist/pf/theme/__pycache__/__init__.cpython-314.pyc +0 -0
  448. package/pennyfarthing-dist/pf/theme/__pycache__/cli.cpython-311.pyc +0 -0
  449. package/pennyfarthing-dist/pf/theme/__pycache__/cli.cpython-314.pyc +0 -0
  450. package/pennyfarthing-dist/pf/validate/__pycache__/__init__.cpython-311.pyc +0 -0
  451. package/pennyfarthing-dist/pf/validate/__pycache__/__init__.cpython-314.pyc +0 -0
  452. package/pennyfarthing-dist/pf/validate/__pycache__/cli.cpython-311.pyc +0 -0
  453. package/pennyfarthing-dist/pf/validate/__pycache__/cli.cpython-314.pyc +0 -0
  454. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
  455. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
  456. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
  457. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
  458. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
  459. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/tandem_awareness.cpython-314.pyc +0 -0
  460. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
  461. package/pennyfarthing-dist/pf/validate/adapters/agent.py +11 -1
  462. package/pennyfarthing-dist/pf/validate/adapters/skill_command.py +15 -4
  463. package/pennyfarthing-dist/pf/validate/adapters/tandem_awareness.py +7 -1
  464. package/pennyfarthing-dist/pf/validate/adapters/team_mode.py +8 -2
  465. package/pennyfarthing-dist/pf/validate/adapters/workflow.py +12 -2
  466. package/pennyfarthing-dist/pf/workflow/__pycache__/__init__.cpython-311.pyc +0 -0
  467. package/pennyfarthing-dist/pf/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
  468. package/pennyfarthing-dist/pf/workflow/__pycache__/cli.cpython-311.pyc +0 -0
  469. package/pennyfarthing-dist/pf/workflow/__pycache__/cli.cpython-314.pyc +0 -0
  470. package/pennyfarthing-dist/pf/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
  471. package/pennyfarthing-dist/pf/workflow/__pycache__/scale.cpython-311.pyc +0 -0
  472. package/pennyfarthing-dist/pf/workflow/__pycache__/scale.cpython-314.pyc +0 -0
  473. package/pennyfarthing-dist/pf/workflow/__pycache__/state.cpython-311.pyc +0 -0
  474. package/pennyfarthing-dist/pf/workflow/__pycache__/state.cpython-314.pyc +0 -0
  475. package/pennyfarthing-dist/pyproject.toml +1 -1
  476. package/pennyfarthing-dist/scripts/core/check-context.sh +2 -2
  477. package/pennyfarthing-dist/scripts/git/changelog-links.sh +216 -0
  478. package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
  479. package/pennyfarthing-dist/scripts/lib/README.md +0 -1
  480. package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +54 -0
  481. package/pennyfarthing-dist/scripts/portraits/generate-tandem-portraits.sh +7 -3
  482. package/pennyfarthing-dist/workflows/patch.yaml +5 -6
  483. package/pennyfarthing-dist/workflows/tdd-tandem.yaml +12 -0
  484. package/packages/core/dist/workflow/team-lifecycle.d.ts +0 -169
  485. package/packages/core/dist/workflow/team-lifecycle.d.ts.map +0 -1
  486. package/packages/core/dist/workflow/team-lifecycle.js +0 -217
  487. package/packages/core/dist/workflow/team-lifecycle.js.map +0 -1
  488. package/packages/core/dist/workflow/team-lifecycle.test.d.ts +0 -20
  489. package/packages/core/dist/workflow/team-lifecycle.test.d.ts.map +0 -1
  490. package/packages/core/dist/workflow/team-lifecycle.test.js +0 -966
  491. package/packages/core/dist/workflow/team-lifecycle.test.js.map +0 -1
  492. package/packages/core/src/public/components/FontPicker/FontPicker.css +0 -276
  493. package/packages/core/src/public/components/FontPicker/index.tsx +0 -430
  494. package/packages/core/src/public/components/ThemePalette/ThemePalette.css +0 -179
  495. package/packages/core/src/public/components/ThemePalette/index.tsx +0 -326
  496. package/packages/core/src/public/components/panels/BackgroundPanel.tsx +0 -115
  497. package/packages/core/src/public/components/ui/switch.tsx +0 -27
  498. package/packages/core/src/public/hooks/useBackgroundTasks.ts +0 -131
  499. package/pennyfarthing-dist/pf/bikerack/background_panel.py +0 -162
  500. package/pennyfarthing-dist/pf/bmad/__pycache__/parser.cpython-314.pyc +0 -0
  501. package/pennyfarthing-dist/pf/brownfield/__main__.py +0 -8
  502. package/pennyfarthing-dist/pf/config.py +0 -21
  503. package/pennyfarthing-dist/pf/hooks.py +0 -32
  504. package/pennyfarthing-dist/pf/jira_bidirectional_sync.py +0 -37
  505. package/pennyfarthing-dist/pf/jira_epic_creation.py +0 -30
  506. package/pennyfarthing-dist/pf/jira_sync.py +0 -36
  507. package/pennyfarthing-dist/pf/jira_sync_story.py +0 -30
  508. package/pennyfarthing-dist/pf/migration/__main__.py +0 -10
  509. package/pennyfarthing-dist/pf/output.py +0 -37
  510. package/pennyfarthing-dist/pf/theme/__main__.py +0 -6
  511. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -177
@@ -15,6 +15,12 @@ Usage:
15
15
  python3 scripts/generate-portraits.py [--dry-run] [--theme THEME] [--engine ENGINE]
16
16
  python3 scripts/generate-portraits.py --engine flux --theme gilligans-island --dry-run
17
17
  python3 scripts/generate-portraits.py --engine sdxl --role ba --skip-existing
18
+
19
+ Freeform prompt mode (bypasses theme YAML):
20
+ python3 scripts/generate-portraits.py --prompt "a steampunk bicycle logo" --output logo.png
21
+ python3 scripts/generate-portraits.py --prompt "robot on a penny-farthing" --output bot.png --no-style-suffix
22
+ python3 scripts/generate-portraits.py --prompt "cat riding a bicycle" --output cat.png --style "flat vector logo, minimal, bold colors"
23
+ python3 scripts/generate-portraits.py --prompt "cat riding a bicycle" --output cat.png --engine flux --seed 99
18
24
  """
19
25
 
20
26
  import argparse
@@ -398,8 +404,56 @@ def main():
398
404
  parser.add_argument("--output-dir", type=str, help="Output to different directory (default: pennyfarthing-dist/personas/portraits)")
399
405
  parser.add_argument("--engine", type=str, choices=list(ENGINES.keys()), default=DEFAULT_ENGINE,
400
406
  help=f"Image generation engine (default: {DEFAULT_ENGINE})")
407
+ parser.add_argument("--prompt", type=str, help="Generate a single image from an arbitrary text prompt (bypasses theme YAML)")
408
+ parser.add_argument("--output", type=str, help="Output file path (required with --prompt)")
409
+ parser.add_argument("--no-style-suffix", action="store_true", help="Skip appending the default style suffix (use with --prompt)")
410
+ parser.add_argument("--style", type=str, help="Custom style suffix to append to --prompt (overrides default woodcut style)")
401
411
  args = parser.parse_args()
402
412
 
413
+ # Freeform prompt mode — bypass theme loading entirely
414
+ if args.prompt:
415
+ if not args.output:
416
+ print("Error: --output is required when using --prompt")
417
+ sys.exit(1)
418
+
419
+ engine_name = args.engine
420
+ engine = ENGINES[engine_name]
421
+
422
+ if args.no_style_suffix:
423
+ style_suffix = ""
424
+ elif args.style:
425
+ style_suffix = f", {args.style}"
426
+ else:
427
+ style_suffix = DEFAULT_STYLE_SUFFIX
428
+
429
+ prompt, was_truncated, token_count = build_portrait_prompt(
430
+ args.prompt, style_suffix, max_tokens=engine["max_tokens"]
431
+ )
432
+
433
+ print(f"Engine: {engine_name.upper()}")
434
+ print(f"Prompt ({token_count} tokens): {prompt}")
435
+ if was_truncated:
436
+ print(f" WARNING: Truncated to {engine['max_tokens']} token limit")
437
+
438
+ if args.dry_run:
439
+ print("Dry run — no image generated.")
440
+ return
441
+
442
+ if not HAS_TORCH:
443
+ print(f"Missing required package: {TORCH_ERROR}")
444
+ print("\nInstall: pip install diffusers transformers accelerate torch pillow")
445
+ sys.exit(1)
446
+
447
+ pipeline_components = load_pipeline(engine_name)
448
+ out_path = Path(args.output)
449
+ out_path.parent.mkdir(parents=True, exist_ok=True)
450
+
451
+ print(f"Generating: {out_path}...")
452
+ image = generate_portrait(pipeline_components, prompt, engine_name, seed=args.seed)
453
+ image.save(out_path, "PNG")
454
+ print(f"Done: {out_path}")
455
+ return
456
+
403
457
  engine_name = args.engine
404
458
  engine = ENGINES[engine_name]
405
459
 
@@ -10,9 +10,12 @@
10
10
  set -euo pipefail
11
11
 
12
12
  SCRIPT_DIR="${0:A:h}"
13
- # Source image lives alongside portraits in pennyfarthing-dist
13
+ # Source image lives in packages/core/src/public/images/
14
14
  DIST_DIR="${SCRIPT_DIR}/../.."
15
- SOURCE_IMAGE="${DIST_DIR}/personas/portraits/cyclist-tandem-source.png"
15
+ # Find project root (contains packages/)
16
+ PROJECT_ROOT="${DIST_DIR}"
17
+ [[ -d "${PROJECT_ROOT}/packages" ]] || PROJECT_ROOT="${DIST_DIR}/.."
18
+ SOURCE_IMAGE="${PROJECT_ROOT}/packages/core/src/public/images/cyclist-tandem-source.png"
16
19
  PORTRAITS_DIR=""
17
20
 
18
21
  # Parse arguments
@@ -25,8 +28,9 @@ while [[ $# -gt 0 ]]; do
25
28
  done
26
29
 
27
30
  # Auto-detect portraits directory if not provided
31
+ # Output goes to packages/cyclist/portraits/ (Cyclist UI asset, not persona portraits)
28
32
  if [[ -z "$PORTRAITS_DIR" ]]; then
29
- PORTRAITS_DIR="${DIST_DIR}/personas/portraits"
33
+ PORTRAITS_DIR="${PROJECT_ROOT}/packages/cyclist/portraits"
30
34
  fi
31
35
 
32
36
  # Resolve to absolute path
@@ -56,12 +56,11 @@ workflow:
56
56
  handoff_on_complete: true
57
57
 
58
58
  triggers:
59
- # Manual triggers
60
59
  commands:
61
60
  - "/patch"
62
61
  - "/fix-blocker"
63
- # Automatic triggers (future)
64
- # error_patterns:
65
- # - "No such file or directory"
66
- # - "ModuleNotFoundError"
67
- # - "command not found"
62
+ # Automatic triggers (future):
63
+ # error_patterns:
64
+ # - "No such file or directory"
65
+ # - "ModuleNotFoundError"
66
+ # - "command not found"
@@ -65,6 +65,18 @@ workflow:
65
65
  partner: architect
66
66
  scope: file-watch
67
67
 
68
+ - name: verify
69
+ agent: tea
70
+ input: [implementation, passing_tests]
71
+ output: [quality_verified]
72
+ gate:
73
+ file: gates/quality-pass
74
+ type: quality_pass
75
+ condition: Lint, typecheck, and all tests passing
76
+ tandem:
77
+ partner: architect
78
+ scope: file-watch
79
+
68
80
  - name: review
69
81
  agent: reviewer
70
82
  input: [implementation, passing_tests, quality_verified]
@@ -1,169 +0,0 @@
1
- /**
2
- * Phase-scoped Team Lifecycle for Story 86-10
3
- *
4
- * Manages the lifecycle of native Agent Teams within workflow phases.
5
- * When a workflow phase has a `team:` config block, the lead agent creates
6
- * a team at phase start, spawns teammates, and cleans up before handoff.
7
- *
8
- * Follows the same ProcessAdapter injection pattern as tandem-lifecycle.ts.
9
- */
10
- import type { WorkflowPhase, TeamConfig } from './workflow-schema.js';
11
- /** Handle to an active team for a workflow phase */
12
- export interface TeamHandle {
13
- /** Team name (format: {storyId}-{phase}) */
14
- teamName: string;
15
- /** Story ID this team belongs to */
16
- storyId: string;
17
- /** Workflow phase name */
18
- phase: string;
19
- /** Active teammate handles */
20
- teammates: TeammateHandle[];
21
- /** ISO timestamp when team was created */
22
- createdAt: string;
23
- }
24
- /** Handle to an individual teammate within a team */
25
- export interface TeammateHandle {
26
- /** Agent name (e.g., 'architect', 'tea') */
27
- agent: string;
28
- /** Task description from workflow YAML */
29
- task?: string;
30
- /** Current teammate status */
31
- status: 'spawned' | 'active' | 'idle' | 'crashed' | 'shutdown';
32
- }
33
- /** Parameters for creating a phase-scoped team */
34
- export interface CreateTeamParams {
35
- /** Phase config (must have team block to create) */
36
- phase: WorkflowPhase;
37
- /** Current story ID */
38
- storyId: string;
39
- /** Path to .session directory */
40
- sessionDir: string;
41
- /** Process adapter for real team operations. Omit for in-memory (tests). */
42
- adapter?: TeamProcessAdapter;
43
- }
44
- /** Result of a gate check (TaskCompleted or TeammateIdle hook) */
45
- export interface GateCheckResult {
46
- /** Whether the gate passed */
47
- passed: boolean;
48
- /** Gate type that was checked */
49
- gate: string;
50
- /** Reason for pass/fail */
51
- reason?: string;
52
- }
53
- /** Team activity summary for session file audit trail */
54
- export interface TeamActivitySummary {
55
- /** Team name */
56
- teamName: string;
57
- /** Story ID */
58
- storyId: string;
59
- /** Phase name */
60
- phase: string;
61
- /** Member details */
62
- members: Array<{
63
- agent: string;
64
- status: string;
65
- task?: string;
66
- }>;
67
- /** Whether all teammates were cleaned up properly */
68
- cleanShutdown: boolean;
69
- }
70
- /** Sidecar lock handle */
71
- export interface SidecarLock {
72
- /** Path to the lock file */
73
- lockPath: string;
74
- /** Story ID that owns the lock */
75
- storyId: string;
76
- /** Timestamp when lock was acquired */
77
- acquiredAt: string;
78
- }
79
- /** Standard result object per framework pattern */
80
- export interface TeamResult<T = unknown> {
81
- success: boolean;
82
- data?: T;
83
- error?: string;
84
- }
85
- /**
86
- * Adapter for real team operations.
87
- *
88
- * The library module cannot call Claude Code's TeamCreate/SendMessage tools
89
- * directly — callers inject the real implementation.
90
- * Tests use the default no-op adapter.
91
- */
92
- export interface TeamProcessAdapter {
93
- /** Create a team. Returns team name. */
94
- createTeam(params: {
95
- teamName: string;
96
- description?: string;
97
- }): Promise<{
98
- teamName: string;
99
- }>;
100
- /** Delete a team. */
101
- deleteTeam(teamName: string): Promise<void>;
102
- /** Spawn a teammate within a team. */
103
- spawnTeammate(params: {
104
- teamName: string;
105
- agent: string;
106
- prompt: string;
107
- model?: string;
108
- }): Promise<{
109
- agentId: string;
110
- }>;
111
- /** Send shutdown request to a teammate. */
112
- shutdownTeammate(params: {
113
- teamName: string;
114
- agent: string;
115
- }): Promise<void>;
116
- }
117
- /**
118
- * Reset all in-memory state. For testing only.
119
- */
120
- export declare function _resetForTesting(): void;
121
- /**
122
- * Create a phase-scoped team.
123
- *
124
- * If phase has no team config, returns success with no handle (no-op).
125
- * If phase has team config, creates team and returns handle.
126
- */
127
- export declare function createTeam(params: CreateTeamParams): Promise<TeamResult<TeamHandle>>;
128
- /**
129
- * Spawn all teammates for a team based on workflow YAML config.
130
- */
131
- export declare function spawnTeammates(handle: TeamHandle, config: TeamConfig, storyId: string, phase: string, adapter?: TeamProcessAdapter): Promise<TeamResult<TeammateHandle[]>>;
132
- /**
133
- * Shut down all active teammates in a team.
134
- */
135
- export declare function shutdownAllTeammates(handle: TeamHandle, adapter?: TeamProcessAdapter): Promise<TeamResult<{
136
- shutdownCount: number;
137
- }>>;
138
- /**
139
- * Clean up a team entirely (TeamDelete).
140
- * Must run before pf handoff.
141
- */
142
- export declare function cleanupTeam(handle: TeamHandle, adapter?: TeamProcessAdapter): Promise<TeamResult<{
143
- cleaned: boolean;
144
- }>>;
145
- /**
146
- * Check gate condition when a TaskCompleted event fires.
147
- */
148
- export declare function checkGateOnTaskCompleted(handle: TeamHandle, phase: WorkflowPhase): GateCheckResult;
149
- /**
150
- * Check gate condition when a TeammateIdle event fires.
151
- */
152
- export declare function checkGateOnTeammateIdle(_handle: TeamHandle, teammate: TeammateHandle, phase: WorkflowPhase): GateCheckResult;
153
- /**
154
- * Generate a team activity summary for the session file audit trail.
155
- */
156
- export declare function generateTeamSummary(handle: TeamHandle): TeamActivitySummary;
157
- /**
158
- * Acquire an exclusive lock for sidecar file writing.
159
- */
160
- export declare function acquireSidecarLock(filePath: string, storyId: string, _timeout?: number): Promise<TeamResult<SidecarLock>>;
161
- /**
162
- * Release a sidecar file lock.
163
- */
164
- export declare function releaseSidecarLock(lock: SidecarLock): TeamResult<void>;
165
- /**
166
- * Get the active team for a story, if any.
167
- */
168
- export declare function getActiveTeam(storyId: string): TeamHandle | null;
169
- //# sourceMappingURL=team-lifecycle.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"team-lifecycle.d.ts","sourceRoot":"","sources":["../../src/workflow/team-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -1,217 +0,0 @@
1
- /**
2
- * Phase-scoped Team Lifecycle for Story 86-10
3
- *
4
- * Manages the lifecycle of native Agent Teams within workflow phases.
5
- * When a workflow phase has a `team:` config block, the lead agent creates
6
- * a team at phase start, spawns teammates, and cleans up before handoff.
7
- *
8
- * Follows the same ProcessAdapter injection pattern as tandem-lifecycle.ts.
9
- */
10
- // =============================================================================
11
- // In-memory registries
12
- // =============================================================================
13
- /** Active teams keyed by storyId */
14
- const activeTeams = new Map();
15
- /** Sidecar locks keyed by file path */
16
- const sidecarLocks = new Map();
17
- /**
18
- * Reset all in-memory state. For testing only.
19
- */
20
- export function _resetForTesting() {
21
- activeTeams.clear();
22
- sidecarLocks.clear();
23
- }
24
- // =============================================================================
25
- // Implementations
26
- // =============================================================================
27
- /**
28
- * Create a phase-scoped team.
29
- *
30
- * If phase has no team config, returns success with no handle (no-op).
31
- * If phase has team config, creates team and returns handle.
32
- */
33
- export async function createTeam(params) {
34
- const { phase, storyId, adapter } = params;
35
- if (!phase.team) {
36
- return { success: true };
37
- }
38
- const teamName = `${storyId}-${phase.name}`;
39
- // Clean up existing team for same story
40
- const existing = activeTeams.get(storyId);
41
- if (existing && adapter) {
42
- try {
43
- await adapter.deleteTeam(existing.teamName);
44
- }
45
- catch { /* swallow */ }
46
- activeTeams.delete(storyId);
47
- }
48
- const handle = {
49
- teamName,
50
- storyId,
51
- phase: phase.name,
52
- teammates: [],
53
- createdAt: new Date().toISOString(),
54
- };
55
- if (adapter) {
56
- try {
57
- await adapter.createTeam({ teamName });
58
- }
59
- catch (err) {
60
- return { success: false, error: err.message };
61
- }
62
- }
63
- activeTeams.set(storyId, handle);
64
- return { success: true, data: handle };
65
- }
66
- /**
67
- * Spawn all teammates for a team based on workflow YAML config.
68
- */
69
- export async function spawnTeammates(handle, config, storyId, phase, adapter) {
70
- const teammates = [];
71
- for (const member of config.teammates) {
72
- const teammate = {
73
- agent: member.agent,
74
- task: member.task,
75
- status: 'spawned',
76
- };
77
- if (adapter) {
78
- try {
79
- await adapter.spawnTeammate({
80
- teamName: handle.teamName,
81
- agent: member.agent,
82
- prompt: `pf agent start "${member.agent}"`,
83
- model: config.model,
84
- });
85
- }
86
- catch {
87
- teammate.status = 'crashed';
88
- }
89
- }
90
- teammates.push(teammate);
91
- }
92
- handle.teammates = teammates;
93
- // Update registry
94
- if (activeTeams.has(handle.storyId)) {
95
- activeTeams.set(handle.storyId, handle);
96
- }
97
- return { success: true, data: teammates };
98
- }
99
- /**
100
- * Shut down all active teammates in a team.
101
- */
102
- export async function shutdownAllTeammates(handle, adapter) {
103
- let shutdownCount = 0;
104
- for (const teammate of handle.teammates) {
105
- if (teammate.status === 'shutdown' || teammate.status === 'crashed') {
106
- continue;
107
- }
108
- if (adapter) {
109
- try {
110
- await adapter.shutdownTeammate({
111
- teamName: handle.teamName,
112
- agent: teammate.agent,
113
- });
114
- }
115
- catch { /* swallow — graceful degradation */ }
116
- }
117
- teammate.status = 'shutdown';
118
- shutdownCount++;
119
- }
120
- return { success: true, data: { shutdownCount } };
121
- }
122
- /**
123
- * Clean up a team entirely (TeamDelete).
124
- * Must run before pf handoff.
125
- */
126
- export async function cleanupTeam(handle, adapter) {
127
- if (adapter) {
128
- try {
129
- await adapter.deleteTeam(handle.teamName);
130
- }
131
- catch { /* swallow */ }
132
- }
133
- activeTeams.delete(handle.storyId);
134
- return { success: true, data: { cleaned: true } };
135
- }
136
- /**
137
- * Check gate condition when a TaskCompleted event fires.
138
- */
139
- export function checkGateOnTaskCompleted(handle, phase) {
140
- if (!phase.gate) {
141
- return { passed: true, gate: 'none' };
142
- }
143
- const gateType = phase.gate.type ?? 'unknown';
144
- const hasActive = handle.teammates.some((t) => t.status === 'active');
145
- if (hasActive) {
146
- return { passed: false, gate: gateType, reason: 'Teammates still active' };
147
- }
148
- return { passed: true, gate: gateType };
149
- }
150
- /**
151
- * Check gate condition when a TeammateIdle event fires.
152
- */
153
- export function checkGateOnTeammateIdle(_handle, teammate, phase) {
154
- if (!phase.gate) {
155
- return { passed: true, gate: 'none' };
156
- }
157
- const gateType = phase.gate.type ?? 'unknown';
158
- if (teammate.status === 'crashed') {
159
- return { passed: false, gate: gateType, reason: 'Teammate crashed' };
160
- }
161
- return { passed: true, gate: gateType };
162
- }
163
- /**
164
- * Generate a team activity summary for the session file audit trail.
165
- */
166
- export function generateTeamSummary(handle) {
167
- return {
168
- teamName: handle.teamName,
169
- storyId: handle.storyId,
170
- phase: handle.phase,
171
- members: handle.teammates.map((t) => ({
172
- agent: t.agent,
173
- status: t.status,
174
- task: t.task,
175
- })),
176
- cleanShutdown: handle.teammates.every((t) => t.status === 'shutdown'),
177
- };
178
- }
179
- /**
180
- * Acquire an exclusive lock for sidecar file writing.
181
- */
182
- export async function acquireSidecarLock(filePath, storyId, _timeout) {
183
- const existing = sidecarLocks.get(filePath);
184
- if (existing) {
185
- if (existing.storyId === storyId) {
186
- return { success: true, data: existing };
187
- }
188
- return { success: false, error: `Lock held by story ${existing.storyId}` };
189
- }
190
- const lock = {
191
- lockPath: `${filePath}.lock`,
192
- storyId,
193
- acquiredAt: new Date().toISOString(),
194
- };
195
- sidecarLocks.set(filePath, lock);
196
- return { success: true, data: lock };
197
- }
198
- /**
199
- * Release a sidecar file lock.
200
- */
201
- export function releaseSidecarLock(lock) {
202
- // Find and remove by lockPath
203
- for (const [path, held] of sidecarLocks) {
204
- if (held.lockPath === lock.lockPath) {
205
- sidecarLocks.delete(path);
206
- break;
207
- }
208
- }
209
- return { success: true };
210
- }
211
- /**
212
- * Get the active team for a story, if any.
213
- */
214
- export function getActiveTeam(storyId) {
215
- return activeTeams.get(storyId) ?? null;
216
- }
217
- //# sourceMappingURL=team-lifecycle.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"team-lifecycle.js","sourceRoot":"","sources":["../../src/workflow/team-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- /**
2
- * Tests for Story 86-10: Phase-scoped team lifecycle + gate hooks
3
- *
4
- * RED state tests for native Agent Teams lifecycle in phased workflows.
5
- * These tests cover all 9 acceptance criteria:
6
- *
7
- * AC1: Lead creates team on phase entry when workflow has team block
8
- * AC2: Lead spawns teammates per workflow YAML teammates config
9
- * AC3: TaskCompleted hook enforces gate checks
10
- * AC4: TeammateIdle hook validates teammate work
11
- * AC5: Lead shuts down all teammates before exit protocol
12
- * AC6: TeamDelete runs before pf handoff (full cleanup before marker)
13
- * AC7: Session file updated with teammate activity summary
14
- * AC8: Sidecar file locking for concurrent teammate writes
15
- * AC9: Graceful degradation when teammate crashes
16
- *
17
- * Run with: pnpm build && pnpm test
18
- */
19
- export {};
20
- //# sourceMappingURL=team-lifecycle.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"team-lifecycle.test.d.ts","sourceRoot":"","sources":["../../src/workflow/team-lifecycle.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}