@pennyfarthing/core 6.6.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 (599) hide show
  1. package/README.md +293 -0
  2. package/package.json +58 -0
  3. package/packages/core/bin/pennyfarthing.js +14 -0
  4. package/packages/core/dist/bmad/context-reader.d.ts +71 -0
  5. package/packages/core/dist/bmad/context-reader.d.ts.map +1 -0
  6. package/packages/core/dist/bmad/context-reader.js +369 -0
  7. package/packages/core/dist/bmad/context-reader.js.map +1 -0
  8. package/packages/core/dist/bmad/context-reader.test.d.ts +71 -0
  9. package/packages/core/dist/bmad/context-reader.test.d.ts.map +1 -0
  10. package/packages/core/dist/bmad/context-reader.test.js +878 -0
  11. package/packages/core/dist/bmad/context-reader.test.js.map +1 -0
  12. package/packages/core/dist/bmad/epics-parser.d.ts +61 -0
  13. package/packages/core/dist/bmad/epics-parser.d.ts.map +1 -0
  14. package/packages/core/dist/bmad/epics-parser.js +331 -0
  15. package/packages/core/dist/bmad/epics-parser.js.map +1 -0
  16. package/packages/core/dist/bmad/epics-parser.test.d.ts +7 -0
  17. package/packages/core/dist/bmad/epics-parser.test.d.ts.map +1 -0
  18. package/packages/core/dist/bmad/epics-parser.test.js +449 -0
  19. package/packages/core/dist/bmad/epics-parser.test.js.map +1 -0
  20. package/packages/core/dist/bmad/index.d.ts +11 -0
  21. package/packages/core/dist/bmad/index.d.ts.map +1 -0
  22. package/packages/core/dist/bmad/index.js +24 -0
  23. package/packages/core/dist/bmad/index.js.map +1 -0
  24. package/packages/core/dist/bmad/status-sync.d.ts +173 -0
  25. package/packages/core/dist/bmad/status-sync.d.ts.map +1 -0
  26. package/packages/core/dist/bmad/status-sync.js +463 -0
  27. package/packages/core/dist/bmad/status-sync.js.map +1 -0
  28. package/packages/core/dist/bmad/status-sync.test.d.ts +7 -0
  29. package/packages/core/dist/bmad/status-sync.test.d.ts.map +1 -0
  30. package/packages/core/dist/bmad/status-sync.test.js +702 -0
  31. package/packages/core/dist/bmad/status-sync.test.js.map +1 -0
  32. package/packages/core/dist/bmad/story-exporter.d.ts +55 -0
  33. package/packages/core/dist/bmad/story-exporter.d.ts.map +1 -0
  34. package/packages/core/dist/bmad/story-exporter.js +170 -0
  35. package/packages/core/dist/bmad/story-exporter.js.map +1 -0
  36. package/packages/core/dist/bmad/story-exporter.test.d.ts +51 -0
  37. package/packages/core/dist/bmad/story-exporter.test.d.ts.map +1 -0
  38. package/packages/core/dist/bmad/story-exporter.test.js +603 -0
  39. package/packages/core/dist/bmad/story-exporter.test.js.map +1 -0
  40. package/packages/core/dist/bmad/story-parser.d.ts +44 -0
  41. package/packages/core/dist/bmad/story-parser.d.ts.map +1 -0
  42. package/packages/core/dist/bmad/story-parser.js +307 -0
  43. package/packages/core/dist/bmad/story-parser.js.map +1 -0
  44. package/packages/core/dist/bmad/story-parser.test.d.ts +44 -0
  45. package/packages/core/dist/bmad/story-parser.test.d.ts.map +1 -0
  46. package/packages/core/dist/bmad/story-parser.test.js +693 -0
  47. package/packages/core/dist/bmad/story-parser.test.js.map +1 -0
  48. package/packages/core/dist/cli/commands/command.d.ts +28 -0
  49. package/packages/core/dist/cli/commands/command.d.ts.map +1 -0
  50. package/packages/core/dist/cli/commands/command.js +399 -0
  51. package/packages/core/dist/cli/commands/command.js.map +1 -0
  52. package/packages/core/dist/cli/commands/cyclist.d.ts +46 -0
  53. package/packages/core/dist/cli/commands/cyclist.d.ts.map +1 -0
  54. package/packages/core/dist/cli/commands/cyclist.js +191 -0
  55. package/packages/core/dist/cli/commands/cyclist.js.map +1 -0
  56. package/packages/core/dist/cli/commands/cyclist.test.d.ts +13 -0
  57. package/packages/core/dist/cli/commands/cyclist.test.d.ts.map +1 -0
  58. package/packages/core/dist/cli/commands/cyclist.test.js +243 -0
  59. package/packages/core/dist/cli/commands/cyclist.test.js.map +1 -0
  60. package/packages/core/dist/cli/commands/doctor.d.ts +9 -0
  61. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -0
  62. package/packages/core/dist/cli/commands/doctor.js +652 -0
  63. package/packages/core/dist/cli/commands/doctor.js.map +1 -0
  64. package/packages/core/dist/cli/commands/init.d.ts +8 -0
  65. package/packages/core/dist/cli/commands/init.d.ts.map +1 -0
  66. package/packages/core/dist/cli/commands/init.js +524 -0
  67. package/packages/core/dist/cli/commands/init.js.map +1 -0
  68. package/packages/core/dist/cli/commands/skill.d.ts +28 -0
  69. package/packages/core/dist/cli/commands/skill.d.ts.map +1 -0
  70. package/packages/core/dist/cli/commands/skill.js +416 -0
  71. package/packages/core/dist/cli/commands/skill.js.map +1 -0
  72. package/packages/core/dist/cli/commands/theme.d.ts +21 -0
  73. package/packages/core/dist/cli/commands/theme.d.ts.map +1 -0
  74. package/packages/core/dist/cli/commands/theme.js +201 -0
  75. package/packages/core/dist/cli/commands/theme.js.map +1 -0
  76. package/packages/core/dist/cli/commands/uninstall.d.ts +8 -0
  77. package/packages/core/dist/cli/commands/uninstall.d.ts.map +1 -0
  78. package/packages/core/dist/cli/commands/uninstall.js +237 -0
  79. package/packages/core/dist/cli/commands/uninstall.js.map +1 -0
  80. package/packages/core/dist/cli/commands/update.d.ts +9 -0
  81. package/packages/core/dist/cli/commands/update.d.ts.map +1 -0
  82. package/packages/core/dist/cli/commands/update.js +545 -0
  83. package/packages/core/dist/cli/commands/update.js.map +1 -0
  84. package/packages/core/dist/cli/commands/version.d.ts +2 -0
  85. package/packages/core/dist/cli/commands/version.d.ts.map +1 -0
  86. package/packages/core/dist/cli/commands/version.js +28 -0
  87. package/packages/core/dist/cli/commands/version.js.map +1 -0
  88. package/packages/core/dist/cli/customization.test.d.ts +12 -0
  89. package/packages/core/dist/cli/customization.test.d.ts.map +1 -0
  90. package/packages/core/dist/cli/customization.test.js +84 -0
  91. package/packages/core/dist/cli/customization.test.js.map +1 -0
  92. package/packages/core/dist/cli/cyclist-migration.test.d.ts +16 -0
  93. package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +1 -0
  94. package/packages/core/dist/cli/cyclist-migration.test.js +224 -0
  95. package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -0
  96. package/packages/core/dist/cli/index.d.ts +3 -0
  97. package/packages/core/dist/cli/index.d.ts.map +1 -0
  98. package/packages/core/dist/cli/index.js +174 -0
  99. package/packages/core/dist/cli/index.js.map +1 -0
  100. package/packages/core/dist/cli/ocean-profiles.test.d.ts +13 -0
  101. package/packages/core/dist/cli/ocean-profiles.test.d.ts.map +1 -0
  102. package/packages/core/dist/cli/ocean-profiles.test.js +134 -0
  103. package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -0
  104. package/packages/core/dist/cli/theme-maker.test.d.ts +11 -0
  105. package/packages/core/dist/cli/theme-maker.test.d.ts.map +1 -0
  106. package/packages/core/dist/cli/theme-maker.test.js +356 -0
  107. package/packages/core/dist/cli/theme-maker.test.js.map +1 -0
  108. package/packages/core/dist/cli/utils/constants.d.ts +60 -0
  109. package/packages/core/dist/cli/utils/constants.d.ts.map +1 -0
  110. package/packages/core/dist/cli/utils/constants.js +52 -0
  111. package/packages/core/dist/cli/utils/constants.js.map +1 -0
  112. package/packages/core/dist/cli/utils/files.d.ts +71 -0
  113. package/packages/core/dist/cli/utils/files.d.ts.map +1 -0
  114. package/packages/core/dist/cli/utils/files.js +162 -0
  115. package/packages/core/dist/cli/utils/files.js.map +1 -0
  116. package/packages/core/dist/cli/utils/logger.d.ts +26 -0
  117. package/packages/core/dist/cli/utils/logger.d.ts.map +1 -0
  118. package/packages/core/dist/cli/utils/logger.js +88 -0
  119. package/packages/core/dist/cli/utils/logger.js.map +1 -0
  120. package/packages/core/dist/cli/utils/manifest.d.ts +47 -0
  121. package/packages/core/dist/cli/utils/manifest.d.ts.map +1 -0
  122. package/packages/core/dist/cli/utils/manifest.js +90 -0
  123. package/packages/core/dist/cli/utils/manifest.js.map +1 -0
  124. package/packages/core/dist/cli/utils/node-modules.d.ts +6 -0
  125. package/packages/core/dist/cli/utils/node-modules.d.ts.map +1 -0
  126. package/packages/core/dist/cli/utils/node-modules.js +22 -0
  127. package/packages/core/dist/cli/utils/node-modules.js.map +1 -0
  128. package/packages/core/dist/cli/utils/prompts.d.ts +34 -0
  129. package/packages/core/dist/cli/utils/prompts.d.ts.map +1 -0
  130. package/packages/core/dist/cli/utils/prompts.js +93 -0
  131. package/packages/core/dist/cli/utils/prompts.js.map +1 -0
  132. package/packages/core/dist/cli/utils/symlinks.d.ts +29 -0
  133. package/packages/core/dist/cli/utils/symlinks.d.ts.map +1 -0
  134. package/packages/core/dist/cli/utils/symlinks.js +181 -0
  135. package/packages/core/dist/cli/utils/symlinks.js.map +1 -0
  136. package/packages/core/dist/cli/utils/themes.d.ts +104 -0
  137. package/packages/core/dist/cli/utils/themes.d.ts.map +1 -0
  138. package/packages/core/dist/cli/utils/themes.js +393 -0
  139. package/packages/core/dist/cli/utils/themes.js.map +1 -0
  140. package/packages/core/dist/cli/utils/themes.test.d.ts +12 -0
  141. package/packages/core/dist/cli/utils/themes.test.d.ts.map +1 -0
  142. package/packages/core/dist/cli/utils/themes.test.js +144 -0
  143. package/packages/core/dist/cli/utils/themes.test.js.map +1 -0
  144. package/packages/core/dist/cli/utils/version.d.ts +10 -0
  145. package/packages/core/dist/cli/utils/version.d.ts.map +1 -0
  146. package/packages/core/dist/cli/utils/version.js +63 -0
  147. package/packages/core/dist/cli/utils/version.js.map +1 -0
  148. package/packages/core/dist/cli/workspace.test.d.ts +8 -0
  149. package/packages/core/dist/cli/workspace.test.d.ts.map +1 -0
  150. package/packages/core/dist/cli/workspace.test.js +154 -0
  151. package/packages/core/dist/cli/workspace.test.js.map +1 -0
  152. package/packages/core/dist/index.d.ts +6 -0
  153. package/packages/core/dist/index.d.ts.map +1 -0
  154. package/packages/core/dist/index.js +10 -0
  155. package/packages/core/dist/index.js.map +1 -0
  156. package/packages/core/dist/permissions/index.d.ts +9 -0
  157. package/packages/core/dist/permissions/index.d.ts.map +1 -0
  158. package/packages/core/dist/permissions/index.js +13 -0
  159. package/packages/core/dist/permissions/index.js.map +1 -0
  160. package/packages/core/dist/permissions/permission-schema.d.ts +89 -0
  161. package/packages/core/dist/permissions/permission-schema.d.ts.map +1 -0
  162. package/packages/core/dist/permissions/permission-schema.js +120 -0
  163. package/packages/core/dist/permissions/permission-schema.js.map +1 -0
  164. package/packages/core/dist/permissions/permission-schema.test.d.ts +40 -0
  165. package/packages/core/dist/permissions/permission-schema.test.d.ts.map +1 -0
  166. package/packages/core/dist/permissions/permission-schema.test.js +367 -0
  167. package/packages/core/dist/permissions/permission-schema.test.js.map +1 -0
  168. package/packages/core/dist/scripts/add-ocean-profiles.d.ts +9 -0
  169. package/packages/core/dist/scripts/add-ocean-profiles.d.ts.map +1 -0
  170. package/packages/core/dist/scripts/add-ocean-profiles.js +695 -0
  171. package/packages/core/dist/scripts/add-ocean-profiles.js.map +1 -0
  172. package/packages/core/dist/scripts/benchmark-integration.d.ts +182 -0
  173. package/packages/core/dist/scripts/benchmark-integration.d.ts.map +1 -0
  174. package/packages/core/dist/scripts/benchmark-integration.js +691 -0
  175. package/packages/core/dist/scripts/benchmark-integration.js.map +1 -0
  176. package/packages/core/dist/scripts/benchmark-integration.test.d.ts +13 -0
  177. package/packages/core/dist/scripts/benchmark-integration.test.d.ts.map +1 -0
  178. package/packages/core/dist/scripts/benchmark-integration.test.js +680 -0
  179. package/packages/core/dist/scripts/benchmark-integration.test.js.map +1 -0
  180. package/packages/core/dist/scripts/debugging-scenarios.test.d.ts +18 -0
  181. package/packages/core/dist/scripts/debugging-scenarios.test.d.ts.map +1 -0
  182. package/packages/core/dist/scripts/debugging-scenarios.test.js +317 -0
  183. package/packages/core/dist/scripts/debugging-scenarios.test.js.map +1 -0
  184. package/packages/core/dist/scripts/generate-all-faces.d.ts +10 -0
  185. package/packages/core/dist/scripts/generate-all-faces.d.ts.map +1 -0
  186. package/packages/core/dist/scripts/generate-all-faces.js +256 -0
  187. package/packages/core/dist/scripts/generate-all-faces.js.map +1 -0
  188. package/packages/core/dist/scripts/generate-all-faces.test.d.ts +17 -0
  189. package/packages/core/dist/scripts/generate-all-faces.test.d.ts.map +1 -0
  190. package/packages/core/dist/scripts/generate-all-faces.test.js +372 -0
  191. package/packages/core/dist/scripts/generate-all-faces.test.js.map +1 -0
  192. package/packages/core/dist/scripts/generate-all-spiders.d.ts +10 -0
  193. package/packages/core/dist/scripts/generate-all-spiders.d.ts.map +1 -0
  194. package/packages/core/dist/scripts/generate-all-spiders.js +306 -0
  195. package/packages/core/dist/scripts/generate-all-spiders.js.map +1 -0
  196. package/packages/core/dist/scripts/generate-ascii-face.d.ts +52 -0
  197. package/packages/core/dist/scripts/generate-ascii-face.d.ts.map +1 -0
  198. package/packages/core/dist/scripts/generate-ascii-face.js +155 -0
  199. package/packages/core/dist/scripts/generate-ascii-face.js.map +1 -0
  200. package/packages/core/dist/scripts/generate-face.d.ts +52 -0
  201. package/packages/core/dist/scripts/generate-face.d.ts.map +1 -0
  202. package/packages/core/dist/scripts/generate-face.js +199 -0
  203. package/packages/core/dist/scripts/generate-face.js.map +1 -0
  204. package/packages/core/dist/scripts/generate-face.test.d.ts +13 -0
  205. package/packages/core/dist/scripts/generate-face.test.d.ts.map +1 -0
  206. package/packages/core/dist/scripts/generate-face.test.js +301 -0
  207. package/packages/core/dist/scripts/generate-face.test.js.map +1 -0
  208. package/packages/core/dist/scripts/generate-report.d.ts +65 -0
  209. package/packages/core/dist/scripts/generate-report.d.ts.map +1 -0
  210. package/packages/core/dist/scripts/generate-report.js +378 -0
  211. package/packages/core/dist/scripts/generate-report.js.map +1 -0
  212. package/packages/core/dist/scripts/generate-report.test.d.ts +13 -0
  213. package/packages/core/dist/scripts/generate-report.test.d.ts.map +1 -0
  214. package/packages/core/dist/scripts/generate-report.test.js +363 -0
  215. package/packages/core/dist/scripts/generate-report.test.js.map +1 -0
  216. package/packages/core/dist/scripts/generate-spider-report.d.ts +65 -0
  217. package/packages/core/dist/scripts/generate-spider-report.d.ts.map +1 -0
  218. package/packages/core/dist/scripts/generate-spider-report.js +366 -0
  219. package/packages/core/dist/scripts/generate-spider-report.js.map +1 -0
  220. package/packages/core/dist/scripts/generate-spider-report.test.d.ts +13 -0
  221. package/packages/core/dist/scripts/generate-spider-report.test.d.ts.map +1 -0
  222. package/packages/core/dist/scripts/generate-spider-report.test.js +367 -0
  223. package/packages/core/dist/scripts/generate-spider-report.test.js.map +1 -0
  224. package/packages/core/dist/scripts/generate-spider.d.ts +37 -0
  225. package/packages/core/dist/scripts/generate-spider.d.ts.map +1 -0
  226. package/packages/core/dist/scripts/generate-spider.js +315 -0
  227. package/packages/core/dist/scripts/generate-spider.js.map +1 -0
  228. package/packages/core/dist/scripts/generate-spider.test.d.ts +14 -0
  229. package/packages/core/dist/scripts/generate-spider.test.d.ts.map +1 -0
  230. package/packages/core/dist/scripts/generate-spider.test.js +269 -0
  231. package/packages/core/dist/scripts/generate-spider.test.js.map +1 -0
  232. package/packages/core/dist/scripts/job-fair-aggregator.d.ts +150 -0
  233. package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +1 -0
  234. package/packages/core/dist/scripts/job-fair-aggregator.js +547 -0
  235. package/packages/core/dist/scripts/job-fair-aggregator.js.map +1 -0
  236. package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts +14 -0
  237. package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts.map +1 -0
  238. package/packages/core/dist/scripts/job-fair-aggregator.test.js +616 -0
  239. package/packages/core/dist/scripts/job-fair-aggregator.test.js.map +1 -0
  240. package/packages/core/dist/scripts/run-ci.test.d.ts +20 -0
  241. package/packages/core/dist/scripts/run-ci.test.d.ts.map +1 -0
  242. package/packages/core/dist/scripts/run-ci.test.js +127 -0
  243. package/packages/core/dist/scripts/run-ci.test.js.map +1 -0
  244. package/packages/core/dist/scripts/theme-detail.test.d.ts +10 -0
  245. package/packages/core/dist/scripts/theme-detail.test.d.ts.map +1 -0
  246. package/packages/core/dist/scripts/theme-detail.test.js +199 -0
  247. package/packages/core/dist/scripts/theme-detail.test.js.map +1 -0
  248. package/packages/core/dist/scripts/validate-ocean-profiles.d.ts +9 -0
  249. package/packages/core/dist/scripts/validate-ocean-profiles.d.ts.map +1 -0
  250. package/packages/core/dist/scripts/validate-ocean-profiles.js +130 -0
  251. package/packages/core/dist/scripts/validate-ocean-profiles.js.map +1 -0
  252. package/packages/core/dist/workflow/generic-handoff.d.ts +235 -0
  253. package/packages/core/dist/workflow/generic-handoff.d.ts.map +1 -0
  254. package/packages/core/dist/workflow/generic-handoff.js +358 -0
  255. package/packages/core/dist/workflow/generic-handoff.js.map +1 -0
  256. package/packages/core/dist/workflow/generic-handoff.test.d.ts +21 -0
  257. package/packages/core/dist/workflow/generic-handoff.test.d.ts.map +1 -0
  258. package/packages/core/dist/workflow/generic-handoff.test.js +499 -0
  259. package/packages/core/dist/workflow/generic-handoff.test.js.map +1 -0
  260. package/packages/core/dist/workflow/generic-sm-finish.d.ts +89 -0
  261. package/packages/core/dist/workflow/generic-sm-finish.d.ts.map +1 -0
  262. package/packages/core/dist/workflow/generic-sm-finish.js +157 -0
  263. package/packages/core/dist/workflow/generic-sm-finish.js.map +1 -0
  264. package/packages/core/dist/workflow/generic-sm-setup.d.ts +138 -0
  265. package/packages/core/dist/workflow/generic-sm-setup.d.ts.map +1 -0
  266. package/packages/core/dist/workflow/generic-sm-setup.js +382 -0
  267. package/packages/core/dist/workflow/generic-sm-setup.js.map +1 -0
  268. package/packages/core/dist/workflow/sm-subagents.test.d.ts +23 -0
  269. package/packages/core/dist/workflow/sm-subagents.test.d.ts.map +1 -0
  270. package/packages/core/dist/workflow/sm-subagents.test.js +727 -0
  271. package/packages/core/dist/workflow/sm-subagents.test.js.map +1 -0
  272. package/packages/core/dist/workflow/story-workflow-routing.test.d.ts +17 -0
  273. package/packages/core/dist/workflow/story-workflow-routing.test.d.ts.map +1 -0
  274. package/packages/core/dist/workflow/story-workflow-routing.test.js +559 -0
  275. package/packages/core/dist/workflow/story-workflow-routing.test.js.map +1 -0
  276. package/packages/core/dist/workflow/test-cache.d.ts +131 -0
  277. package/packages/core/dist/workflow/test-cache.d.ts.map +1 -0
  278. package/packages/core/dist/workflow/test-cache.js +226 -0
  279. package/packages/core/dist/workflow/test-cache.js.map +1 -0
  280. package/packages/core/dist/workflow/test-cache.test.d.ts +17 -0
  281. package/packages/core/dist/workflow/test-cache.test.d.ts.map +1 -0
  282. package/packages/core/dist/workflow/test-cache.test.js +438 -0
  283. package/packages/core/dist/workflow/test-cache.test.js.map +1 -0
  284. package/packages/core/dist/workflow/workflow-loader.d.ts +76 -0
  285. package/packages/core/dist/workflow/workflow-loader.d.ts.map +1 -0
  286. package/packages/core/dist/workflow/workflow-loader.js +133 -0
  287. package/packages/core/dist/workflow/workflow-loader.js.map +1 -0
  288. package/packages/core/dist/workflow/workflow-loader.test.d.ts +15 -0
  289. package/packages/core/dist/workflow/workflow-loader.test.d.ts.map +1 -0
  290. package/packages/core/dist/workflow/workflow-loader.test.js +354 -0
  291. package/packages/core/dist/workflow/workflow-loader.test.js.map +1 -0
  292. package/packages/core/dist/workflow/workflow-migration.test.d.ts +17 -0
  293. package/packages/core/dist/workflow/workflow-migration.test.d.ts.map +1 -0
  294. package/packages/core/dist/workflow/workflow-migration.test.js +372 -0
  295. package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -0
  296. package/packages/core/dist/workflow/workflow-router.d.ts +55 -0
  297. package/packages/core/dist/workflow/workflow-router.d.ts.map +1 -0
  298. package/packages/core/dist/workflow/workflow-router.js +245 -0
  299. package/packages/core/dist/workflow/workflow-router.js.map +1 -0
  300. package/packages/core/dist/workflow/workflow-router.test.d.ts +20 -0
  301. package/packages/core/dist/workflow/workflow-router.test.d.ts.map +1 -0
  302. package/packages/core/dist/workflow/workflow-router.test.js +607 -0
  303. package/packages/core/dist/workflow/workflow-router.test.js.map +1 -0
  304. package/packages/core/dist/workflow/workflow-schema.d.ts +98 -0
  305. package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -0
  306. package/packages/core/dist/workflow/workflow-schema.js +230 -0
  307. package/packages/core/dist/workflow/workflow-schema.js.map +1 -0
  308. package/packages/core/dist/workflow/workflow-schema.test.d.ts +45 -0
  309. package/packages/core/dist/workflow/workflow-schema.test.d.ts.map +1 -0
  310. package/packages/core/dist/workflow/workflow-schema.test.js +512 -0
  311. package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -0
  312. package/pennyfarthing-dist/agents/README.md +397 -0
  313. package/pennyfarthing-dist/agents/architect.md +171 -0
  314. package/pennyfarthing-dist/agents/dev.md +225 -0
  315. package/pennyfarthing-dist/agents/devops.md +183 -0
  316. package/pennyfarthing-dist/agents/generic-handoff.md +451 -0
  317. package/pennyfarthing-dist/agents/generic-sm-finish.md +261 -0
  318. package/pennyfarthing-dist/agents/generic-sm-setup.md +214 -0
  319. package/pennyfarthing-dist/agents/orchestrator.md +316 -0
  320. package/pennyfarthing-dist/agents/pm.md +153 -0
  321. package/pennyfarthing-dist/agents/reviewer-preflight.md +224 -0
  322. package/pennyfarthing-dist/agents/reviewer.md +315 -0
  323. package/pennyfarthing-dist/agents/sm-file-summary.md +109 -0
  324. package/pennyfarthing-dist/agents/sm-handoff.md +97 -0
  325. package/pennyfarthing-dist/agents/sm.md +480 -0
  326. package/pennyfarthing-dist/agents/tea.md +191 -0
  327. package/pennyfarthing-dist/agents/tech-writer.md +148 -0
  328. package/pennyfarthing-dist/agents/testing-runner.md +420 -0
  329. package/pennyfarthing-dist/agents/ux-designer.md +158 -0
  330. package/pennyfarthing-dist/agents/workflow-status-check.md +332 -0
  331. package/pennyfarthing-dist/commands/architect.md +62 -0
  332. package/pennyfarthing-dist/commands/benchmark-control.md +69 -0
  333. package/pennyfarthing-dist/commands/benchmark.md +467 -0
  334. package/pennyfarthing-dist/commands/brainstorm.md +91 -0
  335. package/pennyfarthing-dist/commands/check.md +156 -0
  336. package/pennyfarthing-dist/commands/chore.md +178 -0
  337. package/pennyfarthing-dist/commands/close-epic.md +136 -0
  338. package/pennyfarthing-dist/commands/continue-session.md +184 -0
  339. package/pennyfarthing-dist/commands/create-branches-from-story.md +374 -0
  340. package/pennyfarthing-dist/commands/create-theme.md +29 -0
  341. package/pennyfarthing-dist/commands/dev.md +60 -0
  342. package/pennyfarthing-dist/commands/devops.md +59 -0
  343. package/pennyfarthing-dist/commands/git-cleanup.md +340 -0
  344. package/pennyfarthing-dist/commands/health-check.md +108 -0
  345. package/pennyfarthing-dist/commands/help.md +264 -0
  346. package/pennyfarthing-dist/commands/job-fair.md +102 -0
  347. package/pennyfarthing-dist/commands/list-themes.md +17 -0
  348. package/pennyfarthing-dist/commands/new-work.md +127 -0
  349. package/pennyfarthing-dist/commands/orchestrator.md +56 -0
  350. package/pennyfarthing-dist/commands/parallel-work.md +71 -0
  351. package/pennyfarthing-dist/commands/party-mode.md +67 -0
  352. package/pennyfarthing-dist/commands/permissions.md +193 -0
  353. package/pennyfarthing-dist/commands/pm.md +60 -0
  354. package/pennyfarthing-dist/commands/prime.md +140 -0
  355. package/pennyfarthing-dist/commands/release.md +58 -0
  356. package/pennyfarthing-dist/commands/repo-status.md +49 -0
  357. package/pennyfarthing-dist/commands/retro.md +200 -0
  358. package/pennyfarthing-dist/commands/reviewer.md +64 -0
  359. package/pennyfarthing-dist/commands/run-ci.md +116 -0
  360. package/pennyfarthing-dist/commands/set-theme.md +52 -0
  361. package/pennyfarthing-dist/commands/show-theme.md +21 -0
  362. package/pennyfarthing-dist/commands/sm.md +70 -0
  363. package/pennyfarthing-dist/commands/solo.md +411 -0
  364. package/pennyfarthing-dist/commands/sprint-planning.md +109 -0
  365. package/pennyfarthing-dist/commands/start-epic.md +156 -0
  366. package/pennyfarthing-dist/commands/sync-epic-to-jira.md +184 -0
  367. package/pennyfarthing-dist/commands/sync-work-with-sprint.md +376 -0
  368. package/pennyfarthing-dist/commands/tea.md +63 -0
  369. package/pennyfarthing-dist/commands/tech-writer.md +53 -0
  370. package/pennyfarthing-dist/commands/theme-maker.md +671 -0
  371. package/pennyfarthing-dist/commands/update-domain-docs.md +83 -0
  372. package/pennyfarthing-dist/commands/ux-designer.md +62 -0
  373. package/pennyfarthing-dist/commands/work.md +111 -0
  374. package/pennyfarthing-dist/guides/AGENT-COORDINATION.md +480 -0
  375. package/pennyfarthing-dist/guides/AGENT-SCOPES.md +201 -0
  376. package/pennyfarthing-dist/guides/HOOKS.md +230 -0
  377. package/pennyfarthing-dist/guides/PROMPT-PATTERNS.md +338 -0
  378. package/pennyfarthing-dist/guides/SESSION-ARTIFACTS.md +193 -0
  379. package/pennyfarthing-dist/guides/agent-template-strategic.md +148 -0
  380. package/pennyfarthing-dist/guides/agent-template-tactical.md +162 -0
  381. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +746 -0
  382. package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +574 -0
  383. package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +488 -0
  384. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +402 -0
  385. package/pennyfarthing-dist/guides/permission-protocol.md +188 -0
  386. package/pennyfarthing-dist/guides/persona-loading.md +46 -0
  387. package/pennyfarthing-dist/guides/persona-system.md +294 -0
  388. package/pennyfarthing-dist/guides/shared-agent-behavior.md +388 -0
  389. package/pennyfarthing-dist/guides/shared-context.md +147 -0
  390. package/pennyfarthing-dist/guides/strategic-agent-behavior.md +348 -0
  391. package/pennyfarthing-dist/guides/tactical-agent-behavior.md +1041 -0
  392. package/pennyfarthing-dist/guides/workflow-schema.md +195 -0
  393. package/pennyfarthing-dist/guides/worktree-mode.md +113 -0
  394. package/pennyfarthing-dist/output-styles/teaching.md +33 -0
  395. package/pennyfarthing-dist/output-styles/terse.md +20 -0
  396. package/pennyfarthing-dist/output-styles/verbose.md +28 -0
  397. package/pennyfarthing-dist/personas/themes/1984.yaml +312 -0
  398. package/pennyfarthing-dist/personas/themes/a-team.yaml +207 -0
  399. package/pennyfarthing-dist/personas/themes/agatha-christie.yaml +300 -0
  400. package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +330 -0
  401. package/pennyfarthing-dist/personas/themes/all-stars.yaml +332 -0
  402. package/pennyfarthing-dist/personas/themes/ancient-philosophers.yaml +320 -0
  403. package/pennyfarthing-dist/personas/themes/ancient-strategists.yaml +306 -0
  404. package/pennyfarthing-dist/personas/themes/arcane.yaml +288 -0
  405. package/pennyfarthing-dist/personas/themes/arthurian-mythos.yaml +331 -0
  406. package/pennyfarthing-dist/personas/themes/avatar-the-last-airbender.yaml +288 -0
  407. package/pennyfarthing-dist/personas/themes/babylon-5.yaml +288 -0
  408. package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +288 -0
  409. package/pennyfarthing-dist/personas/themes/better-call-saul.yaml +288 -0
  410. package/pennyfarthing-dist/personas/themes/big-lebowski.yaml +300 -0
  411. package/pennyfarthing-dist/personas/themes/black-sails.yaml +300 -0
  412. package/pennyfarthing-dist/personas/themes/blade-runner.yaml +295 -0
  413. package/pennyfarthing-dist/personas/themes/bobiverse.yaml +288 -0
  414. package/pennyfarthing-dist/personas/themes/breaking-bad.yaml +327 -0
  415. package/pennyfarthing-dist/personas/themes/catch-22.yaml +316 -0
  416. package/pennyfarthing-dist/personas/themes/classical-composers.yaml +310 -0
  417. package/pennyfarthing-dist/personas/themes/control.yaml +197 -0
  418. package/pennyfarthing-dist/personas/themes/count-of-monte-cristo.yaml +320 -0
  419. package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +323 -0
  420. package/pennyfarthing-dist/personas/themes/deadwood.yaml +300 -0
  421. package/pennyfarthing-dist/personas/themes/dickens.yaml +320 -0
  422. package/pennyfarthing-dist/personas/themes/discworld.yaml +332 -0
  423. package/pennyfarthing-dist/personas/themes/doctor-who.yaml +290 -0
  424. package/pennyfarthing-dist/personas/themes/don-quixote.yaml +320 -0
  425. package/pennyfarthing-dist/personas/themes/dune.yaml +307 -0
  426. package/pennyfarthing-dist/personas/themes/enlightenment-thinkers.yaml +320 -0
  427. package/pennyfarthing-dist/personas/themes/expeditionary-force.yaml +288 -0
  428. package/pennyfarthing-dist/personas/themes/fargo.yaml +330 -0
  429. package/pennyfarthing-dist/personas/themes/film-auteurs.yaml +312 -0
  430. package/pennyfarthing-dist/personas/themes/firefly.yaml +328 -0
  431. package/pennyfarthing-dist/personas/themes/foundation.yaml +290 -0
  432. package/pennyfarthing-dist/personas/themes/futurama.yaml +321 -0
  433. package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +290 -0
  434. package/pennyfarthing-dist/personas/themes/gilligans-island.yaml +243 -0
  435. package/pennyfarthing-dist/personas/themes/gothic-literature.yaml +308 -0
  436. package/pennyfarthing-dist/personas/themes/great-gatsby.yaml +308 -0
  437. package/pennyfarthing-dist/personas/themes/greek-mythology.yaml +330 -0
  438. package/pennyfarthing-dist/personas/themes/hannibal.yaml +300 -0
  439. package/pennyfarthing-dist/personas/themes/harry-potter.yaml +324 -0
  440. package/pennyfarthing-dist/personas/themes/his-dark-materials.yaml +291 -0
  441. package/pennyfarthing-dist/personas/themes/historical-figures.yaml +288 -0
  442. package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +331 -0
  443. package/pennyfarthing-dist/personas/themes/house-md.yaml +321 -0
  444. package/pennyfarthing-dist/personas/themes/imperial-radch.yaml +289 -0
  445. package/pennyfarthing-dist/personas/themes/inspector-morse.yaml +300 -0
  446. package/pennyfarthing-dist/personas/themes/jane-austen.yaml +287 -0
  447. package/pennyfarthing-dist/personas/themes/jazz-legends.yaml +320 -0
  448. package/pennyfarthing-dist/personas/themes/justified.yaml +300 -0
  449. package/pennyfarthing-dist/personas/themes/legion-of-doom.yaml +219 -0
  450. package/pennyfarthing-dist/personas/themes/les-miserables.yaml +299 -0
  451. package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +334 -0
  452. package/pennyfarthing-dist/personas/themes/lovecraft-mythos.yaml +334 -0
  453. package/pennyfarthing-dist/personas/themes/mad-max.yaml +355 -0
  454. package/pennyfarthing-dist/personas/themes/mad-men.yaml +289 -0
  455. package/pennyfarthing-dist/personas/themes/marvel-mcu.yaml +300 -0
  456. package/pennyfarthing-dist/personas/themes/mash.yaml +334 -0
  457. package/pennyfarthing-dist/personas/themes/mass-effect.yaml +289 -0
  458. package/pennyfarthing-dist/personas/themes/military-commanders.yaml +306 -0
  459. package/pennyfarthing-dist/personas/themes/moby-dick.yaml +320 -0
  460. package/pennyfarthing-dist/personas/themes/monty-python.yaml +303 -0
  461. package/pennyfarthing-dist/personas/themes/neuromancer.yaml +300 -0
  462. package/pennyfarthing-dist/personas/themes/norse-mythology.yaml +329 -0
  463. package/pennyfarthing-dist/personas/themes/parks-and-rec.yaml +242 -0
  464. package/pennyfarthing-dist/personas/themes/peaky-blinders.yaml +298 -0
  465. package/pennyfarthing-dist/personas/themes/princess-bride.yaml +220 -0
  466. package/pennyfarthing-dist/personas/themes/renaissance-masters.yaml +320 -0
  467. package/pennyfarthing-dist/personas/themes/rome.yaml +300 -0
  468. package/pennyfarthing-dist/personas/themes/russian-masters.yaml +318 -0
  469. package/pennyfarthing-dist/personas/themes/sandman.yaml +288 -0
  470. package/pennyfarthing-dist/personas/themes/scientific-revolutionaries.yaml +320 -0
  471. package/pennyfarthing-dist/personas/themes/shakespeare.yaml +301 -0
  472. package/pennyfarthing-dist/personas/themes/sherlock-holmes.yaml +289 -0
  473. package/pennyfarthing-dist/personas/themes/snow-crash.yaml +288 -0
  474. package/pennyfarthing-dist/personas/themes/software-pioneers.yaml +300 -0
  475. package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +230 -0
  476. package/pennyfarthing-dist/personas/themes/star-trek-tos.yaml +210 -0
  477. package/pennyfarthing-dist/personas/themes/star-wars.yaml +303 -0
  478. package/pennyfarthing-dist/personas/themes/succession.yaml +300 -0
  479. package/pennyfarthing-dist/personas/themes/superfriends.yaml +208 -0
  480. package/pennyfarthing-dist/personas/themes/ted-lasso.yaml +236 -0
  481. package/pennyfarthing-dist/personas/themes/the-americans.yaml +300 -0
  482. package/pennyfarthing-dist/personas/themes/the-crown.yaml +300 -0
  483. package/pennyfarthing-dist/personas/themes/the-expanse.yaml +213 -0
  484. package/pennyfarthing-dist/personas/themes/the-good-place.yaml +322 -0
  485. package/pennyfarthing-dist/personas/themes/the-matrix.yaml +353 -0
  486. package/pennyfarthing-dist/personas/themes/the-odyssey.yaml +300 -0
  487. package/pennyfarthing-dist/personas/themes/the-office.yaml +330 -0
  488. package/pennyfarthing-dist/personas/themes/the-simpsons.yaml +308 -0
  489. package/pennyfarthing-dist/personas/themes/the-sopranos.yaml +300 -0
  490. package/pennyfarthing-dist/personas/themes/the-wire.yaml +311 -0
  491. package/pennyfarthing-dist/personas/themes/the-witcher.yaml +300 -0
  492. package/pennyfarthing-dist/personas/themes/twin-peaks.yaml +302 -0
  493. package/pennyfarthing-dist/personas/themes/vorkosigan-saga.yaml +300 -0
  494. package/pennyfarthing-dist/personas/themes/watchmen.yaml +291 -0
  495. package/pennyfarthing-dist/personas/themes/west-wing.yaml +291 -0
  496. package/pennyfarthing-dist/personas/themes/world-explorers.yaml +320 -0
  497. package/pennyfarthing-dist/personas/themes/wwii-leaders.yaml +307 -0
  498. package/pennyfarthing-dist/personas/themes/x-files.yaml +302 -0
  499. package/pennyfarthing-dist/scripts/add-short-names.mjs +264 -0
  500. package/pennyfarthing-dist/scripts/agent-session.sh +367 -0
  501. package/pennyfarthing-dist/scripts/check-context.sh +187 -0
  502. package/pennyfarthing-dist/scripts/check.sh +497 -0
  503. package/pennyfarthing-dist/scripts/deploy.sh +284 -0
  504. package/pennyfarthing-dist/scripts/doctor-dogfood.sh +360 -0
  505. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +61 -0
  506. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +66 -0
  507. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +35 -0
  508. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +166 -0
  509. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +50 -0
  510. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +71 -0
  511. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +54 -0
  512. package/pennyfarthing-dist/scripts/hooks/session-start.sh +98 -0
  513. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +59 -0
  514. package/pennyfarthing-dist/scripts/install-git-hooks.sh +91 -0
  515. package/pennyfarthing-dist/scripts/prime.sh +161 -0
  516. package/pennyfarthing-dist/scripts/release.sh +198 -0
  517. package/pennyfarthing-dist/scripts/repo-utils.sh +778 -0
  518. package/pennyfarthing-dist/scripts/run-ci.sh +219 -0
  519. package/pennyfarthing-dist/scripts/run.sh +65 -0
  520. package/pennyfarthing-dist/scripts/statusline.sh +264 -0
  521. package/pennyfarthing-dist/scripts/tests/check.test.sh +582 -0
  522. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +107 -0
  523. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +597 -0
  524. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +514 -0
  525. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +517 -0
  526. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +331 -0
  527. package/pennyfarthing-dist/scripts/uninstall.sh +271 -0
  528. package/pennyfarthing-dist/scripts/utils/background-tasks.sh +177 -0
  529. package/pennyfarthing-dist/scripts/utils/check-status.sh +251 -0
  530. package/pennyfarthing-dist/scripts/utils/checkpoint.sh +136 -0
  531. package/pennyfarthing-dist/scripts/utils/common.sh +157 -0
  532. package/pennyfarthing-dist/scripts/utils/create-feature-branches.sh +230 -0
  533. package/pennyfarthing-dist/scripts/utils/file-lock.sh +269 -0
  534. package/pennyfarthing-dist/scripts/utils/find-related-work.sh +231 -0
  535. package/pennyfarthing-dist/scripts/utils/find-root.sh +33 -0
  536. package/pennyfarthing-dist/scripts/utils/generate-skill-docs.sh +110 -0
  537. package/pennyfarthing-dist/scripts/utils/git-status-all.sh +127 -0
  538. package/pennyfarthing-dist/scripts/utils/ground-truth-judge.py +289 -0
  539. package/pennyfarthing-dist/scripts/utils/jira/jira-lib.mjs +443 -0
  540. package/pennyfarthing-dist/scripts/utils/jira/jira-sync-story.mjs +208 -0
  541. package/pennyfarthing-dist/scripts/utils/jira/jira-sync.mjs +198 -0
  542. package/pennyfarthing-dist/scripts/utils/jira-claim-story.sh +162 -0
  543. package/pennyfarthing-dist/scripts/utils/jira-lib.sh +463 -0
  544. package/pennyfarthing-dist/scripts/utils/jira-sync-story.sh +8 -0
  545. package/pennyfarthing-dist/scripts/utils/jira-sync.sh +8 -0
  546. package/pennyfarthing-dist/scripts/utils/log-skill-usage.sh +74 -0
  547. package/pennyfarthing-dist/scripts/utils/logging.sh +186 -0
  548. package/pennyfarthing-dist/scripts/utils/repo-scan.sh +141 -0
  549. package/pennyfarthing-dist/scripts/utils/retry.sh +76 -0
  550. package/pennyfarthing-dist/scripts/utils/run-timestamp.sh +7 -0
  551. package/pennyfarthing-dist/scripts/utils/session-cleanup.sh +319 -0
  552. package/pennyfarthing-dist/scripts/utils/skill-usage-report.sh +193 -0
  553. package/pennyfarthing-dist/scripts/utils/sprint-common.sh +286 -0
  554. package/pennyfarthing-dist/scripts/utils/sprint-metrics.sh +241 -0
  555. package/pennyfarthing-dist/scripts/utils/swebench-judge.py +400 -0
  556. package/pennyfarthing-dist/scripts/utils/sync-epic-to-jira.sh +16 -0
  557. package/pennyfarthing-dist/scripts/utils/test-setup.sh +337 -0
  558. package/pennyfarthing-dist/scripts/utils/validate-subagent-frontmatter.sh +160 -0
  559. package/pennyfarthing-dist/scripts/worktree-manager.sh +498 -0
  560. package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +236 -0
  561. package/pennyfarthing-dist/skills/changelog/SKILL.md +367 -0
  562. package/pennyfarthing-dist/skills/code-review/SKILL.md +168 -0
  563. package/pennyfarthing-dist/skills/context-engineering/SKILL.md +268 -0
  564. package/pennyfarthing-dist/skills/cyclist/SKILL.md +117 -0
  565. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +421 -0
  566. package/pennyfarthing-dist/skills/finalize-run/SKILL.md +258 -0
  567. package/pennyfarthing-dist/skills/jira/SKILL.md +281 -0
  568. package/pennyfarthing-dist/skills/judge/SKILL.md +524 -0
  569. package/pennyfarthing-dist/skills/just/SKILL.md +160 -0
  570. package/pennyfarthing-dist/skills/mermaid/SKILL.md +240 -0
  571. package/pennyfarthing-dist/skills/otel/skill.md +222 -0
  572. package/pennyfarthing-dist/skills/permissions/skill.md +172 -0
  573. package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +173 -0
  574. package/pennyfarthing-dist/skills/skill-registry.schema.json +102 -0
  575. package/pennyfarthing-dist/skills/skill-registry.yaml +335 -0
  576. package/pennyfarthing-dist/skills/sprint-context/SKILL.md +120 -0
  577. package/pennyfarthing-dist/skills/story-management/SKILL.md +208 -0
  578. package/pennyfarthing-dist/skills/testing/SKILL.md +99 -0
  579. package/pennyfarthing-dist/skills/testing/references/troubleshooting.md +124 -0
  580. package/pennyfarthing-dist/skills/theme/skill.md +129 -0
  581. package/pennyfarthing-dist/skills/theme-creation/SKILL.md +169 -0
  582. package/pennyfarthing-dist/skills/workflow/SKILL.md +160 -0
  583. package/pennyfarthing-dist/skills/yq/SKILL.md +264 -0
  584. package/pennyfarthing-dist/templates/LEADERBOARD.schema.yaml +187 -0
  585. package/pennyfarthing-dist/templates/LEADERBOARD.template.md +59 -0
  586. package/pennyfarthing-dist/templates/agent-scopes.yaml.template +276 -0
  587. package/pennyfarthing-dist/templates/pennyfarthing-settings.yaml.template +61 -0
  588. package/pennyfarthing-dist/templates/persona-config.yaml.template +22 -0
  589. package/pennyfarthing-dist/templates/preferences.yaml.template +15 -0
  590. package/pennyfarthing-dist/templates/settings.local.json.template +90 -0
  591. package/pennyfarthing-dist/templates/setup-env.sh.template +18 -0
  592. package/pennyfarthing-dist/templates/shared-context.md.template +70 -0
  593. package/pennyfarthing-dist/templates/sidecar/decisions.md.template +40 -0
  594. package/pennyfarthing-dist/templates/sidecar/gotchas.md.template +37 -0
  595. package/pennyfarthing-dist/templates/sidecar/patterns.md.template +34 -0
  596. package/pennyfarthing-dist/workflows/agent-docs.yaml +70 -0
  597. package/pennyfarthing-dist/workflows/bdd.yaml +58 -0
  598. package/pennyfarthing-dist/workflows/tdd.yaml +50 -0
  599. package/pennyfarthing-dist/workflows/trivial.yaml +40 -0
@@ -0,0 +1,597 @@
1
+ #!/bin/bash
2
+ # test-drift-detection.sh - Tests for story 8-2: Startup Drift Detection
3
+ # Verifies that workflow-status-check detects and reports drift between
4
+ # merged branches and sprint YAML status
5
+ #
6
+ # RED STATE: These tests will FAIL until Dev implements the feature
7
+
8
+ set -uo pipefail
9
+
10
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
11
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd -P)"
12
+
13
+ # Colors for output
14
+ RED='\033[0;31m'
15
+ GREEN='\033[0;32m'
16
+ YELLOW='\033[1;33m'
17
+ NC='\033[0m'
18
+
19
+ TESTS_RUN=0
20
+ TESTS_PASSED=0
21
+ TESTS_FAILED=0
22
+
23
+ pass() {
24
+ echo -e "${GREEN}PASS${NC}: $1"
25
+ ((TESTS_PASSED++))
26
+ ((TESTS_RUN++))
27
+ }
28
+
29
+ fail() {
30
+ echo -e "${RED}FAIL${NC}: $1"
31
+ echo " Expected: $2"
32
+ echo " Got: $3"
33
+ ((TESTS_FAILED++))
34
+ ((TESTS_RUN++))
35
+ }
36
+
37
+ echo "=== Story 8-2: Startup Drift Detection ==="
38
+ echo ""
39
+
40
+ # ==============================================================================
41
+ # AC1: workflow-status-check detects merged-but-not-closed stories
42
+ # ==============================================================================
43
+
44
+ echo "--- AC1: Detects merged-but-not-closed stories ---"
45
+ echo ""
46
+
47
+ # Test: detect_drift function exists in sprint-common.sh
48
+ test_detect_drift_function_exists() {
49
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
50
+
51
+ if [[ ! -f "$sprint_common" ]]; then
52
+ fail "detect_drift function exists" "file exists" "sprint-common.sh not found"
53
+ return
54
+ fi
55
+
56
+ if grep -q "detect_drift" "$sprint_common" 2>/dev/null; then
57
+ pass "detect_drift function exists in sprint-common.sh"
58
+ else
59
+ fail "detect_drift function exists" \
60
+ "detect_drift function in sprint-common.sh" \
61
+ "function not found"
62
+ fi
63
+ }
64
+
65
+ # Test: detect_drift scans git merge log
66
+ test_detect_drift_uses_git_log() {
67
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
68
+
69
+ if [[ ! -f "$sprint_common" ]]; then
70
+ fail "detect_drift uses git log" "file exists" "sprint-common.sh not found"
71
+ return
72
+ fi
73
+
74
+ # Check if detect_drift uses git log --merges
75
+ if grep -A 30 "detect_drift" "$sprint_common" 2>/dev/null | grep -q "git log.*merges\|git log --merges"; then
76
+ pass "detect_drift scans git merge log"
77
+ else
78
+ fail "detect_drift uses git log" \
79
+ "git log --merges command in detect_drift" \
80
+ "git log --merges not found in function"
81
+ fi
82
+ }
83
+
84
+ # Test: detect_drift calls get_story_field to check YAML status
85
+ test_detect_drift_checks_yaml() {
86
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
87
+
88
+ if [[ ! -f "$sprint_common" ]]; then
89
+ fail "detect_drift checks YAML status" "file exists" "sprint-common.sh not found"
90
+ return
91
+ fi
92
+
93
+ # Check if detect_drift uses get_story_field
94
+ if grep -A 30 "detect_drift" "$sprint_common" 2>/dev/null | grep -q "get_story_field"; then
95
+ pass "detect_drift checks YAML status via get_story_field"
96
+ else
97
+ fail "detect_drift checks YAML status" \
98
+ "get_story_field call in detect_drift" \
99
+ "get_story_field not found in function"
100
+ fi
101
+ }
102
+
103
+ # Test: detect_drift uses extract_story_id to parse branch names
104
+ test_detect_drift_uses_extract() {
105
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
106
+
107
+ if [[ ! -f "$sprint_common" ]]; then
108
+ fail "detect_drift uses extract_story_id" "file exists" "sprint-common.sh not found"
109
+ return
110
+ fi
111
+
112
+ if grep -A 30 "detect_drift" "$sprint_common" 2>/dev/null | grep -q "extract_story_id"; then
113
+ pass "detect_drift uses extract_story_id to parse branches"
114
+ else
115
+ fail "detect_drift uses extract_story_id" \
116
+ "extract_story_id call in detect_drift" \
117
+ "extract_story_id not found in function"
118
+ fi
119
+ }
120
+
121
+ # Test: detect_drift returns empty when no drift exists
122
+ test_detect_drift_no_drift() {
123
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
124
+
125
+ if [[ ! -f "$sprint_common" ]]; then
126
+ fail "detect_drift returns empty when no drift" "file exists" "sprint-common.sh not found"
127
+ return
128
+ fi
129
+
130
+ # Source and call detect_drift - should return empty in a clean state
131
+ # (no merged branches that don't match YAML status)
132
+ (
133
+ source "$sprint_common" 2>/dev/null || true
134
+
135
+ if type detect_drift &>/dev/null; then
136
+ result=$(detect_drift 2>/dev/null || echo "")
137
+ # Empty result means no drift detected (which is correct for clean state)
138
+ if [[ -z "$result" || "$result" == "" ]]; then
139
+ echo "PASS"
140
+ else
141
+ echo "RESULT:$result"
142
+ fi
143
+ else
144
+ echo "FAIL:function not found"
145
+ fi
146
+ ) | {
147
+ read -r output
148
+ if [[ "$output" == "PASS" ]]; then
149
+ pass "detect_drift returns empty when no drift exists"
150
+ elif [[ "$output" == RESULT:* ]]; then
151
+ # Result might be valid - drifted stories found
152
+ pass "detect_drift returns result (found drifted stories or empty)"
153
+ else
154
+ local got="${output#FAIL:}"
155
+ fail "detect_drift returns empty when no drift" \
156
+ "empty string or drifted stories" \
157
+ "${got:-function missing}"
158
+ fi
159
+ }
160
+ }
161
+
162
+ # Test: detect_drift identifies story that is merged but marked in_progress
163
+ test_detect_drift_finds_in_progress() {
164
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
165
+
166
+ if [[ ! -f "$sprint_common" ]]; then
167
+ fail "detect_drift finds in_progress drift" "file exists" "sprint-common.sh not found"
168
+ return
169
+ fi
170
+
171
+ # Check function structure - it should compare status against "done" and "backlog"
172
+ if grep -A 30 "detect_drift" "$sprint_common" 2>/dev/null | grep -qE 'done|in_progress|status'; then
173
+ pass "detect_drift checks for non-done/non-backlog statuses"
174
+ else
175
+ fail "detect_drift finds in_progress drift" \
176
+ "status comparison in detect_drift" \
177
+ "status checks not found in function"
178
+ fi
179
+ }
180
+
181
+ # Test: detect_drift ignores stories already marked done
182
+ test_detect_drift_ignores_done() {
183
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
184
+
185
+ if [[ ! -f "$sprint_common" ]]; then
186
+ fail "detect_drift ignores done stories" "file exists" "sprint-common.sh not found"
187
+ return
188
+ fi
189
+
190
+ # Check that function filters out "done" status
191
+ if grep -A 30 "detect_drift" "$sprint_common" 2>/dev/null | grep -qE '!= "done"|!= done|-ne done'; then
192
+ pass "detect_drift filters out stories with done status"
193
+ else
194
+ fail "detect_drift ignores done stories" \
195
+ "check for status != done in function" \
196
+ "done filter not found"
197
+ fi
198
+ }
199
+
200
+ # Test: detect_drift ignores stories marked backlog (not drift - never started)
201
+ test_detect_drift_ignores_backlog() {
202
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
203
+
204
+ if [[ ! -f "$sprint_common" ]]; then
205
+ fail "detect_drift ignores backlog stories" "file exists" "sprint-common.sh not found"
206
+ return
207
+ fi
208
+
209
+ # Check that function filters out "backlog" status
210
+ if grep -A 30 "detect_drift" "$sprint_common" 2>/dev/null | grep -qE 'backlog'; then
211
+ pass "detect_drift considers backlog status in filtering"
212
+ else
213
+ fail "detect_drift ignores backlog stories" \
214
+ "backlog status check in function" \
215
+ "backlog filter not found"
216
+ fi
217
+ }
218
+
219
+ # Test: detect_drift checks Jira status for drift
220
+ test_detect_drift_checks_jira() {
221
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
222
+
223
+ if [[ ! -f "$sprint_common" ]]; then
224
+ fail "detect_drift checks Jira status" "file exists" "sprint-common.sh not found"
225
+ return
226
+ fi
227
+
228
+ # Check if detect_drift queries Jira status
229
+ if grep -A 60 "detect_drift" "$sprint_common" 2>/dev/null | grep -qE 'jira.*status|jira issue view|jira_status'; then
230
+ pass "detect_drift checks Jira status for drift"
231
+ else
232
+ fail "detect_drift checks Jira status" \
233
+ "jira status check in detect_drift" \
234
+ "jira status check not found in function"
235
+ fi
236
+ }
237
+
238
+ # Test: detect_drift output includes Jira status
239
+ test_detect_drift_output_includes_jira() {
240
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
241
+
242
+ if [[ ! -f "$sprint_common" ]]; then
243
+ fail "detect_drift output includes Jira status" "file exists" "sprint-common.sh not found"
244
+ return
245
+ fi
246
+
247
+ # Check that output format includes jira_status
248
+ if grep -A 60 "detect_drift" "$sprint_common" 2>/dev/null | grep -qE 'jira_status|:.*jira|story_id.*yaml.*jira'; then
249
+ pass "detect_drift output includes Jira status"
250
+ else
251
+ fail "detect_drift output includes Jira status" \
252
+ "jira_status in output format" \
253
+ "jira status not found in output"
254
+ fi
255
+ }
256
+
257
+ test_detect_drift_function_exists
258
+ test_detect_drift_uses_git_log
259
+ test_detect_drift_checks_yaml
260
+ test_detect_drift_uses_extract
261
+ test_detect_drift_checks_jira
262
+ test_detect_drift_output_includes_jira
263
+ test_detect_drift_no_drift
264
+ test_detect_drift_finds_in_progress
265
+ test_detect_drift_ignores_done
266
+ test_detect_drift_ignores_backlog
267
+
268
+ echo ""
269
+
270
+ # ==============================================================================
271
+ # AC2: Clear report of drifted stories shown to user
272
+ # ==============================================================================
273
+
274
+ echo "--- AC2: Clear report of drifted stories ---"
275
+ echo ""
276
+
277
+ # Test: detect_drift returns story_id:status format
278
+ test_drift_output_format() {
279
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
280
+
281
+ if [[ ! -f "$sprint_common" ]]; then
282
+ fail "drift output includes story ID and status" "file exists" "sprint-common.sh not found"
283
+ return
284
+ fi
285
+
286
+ # Check that output includes story_id and status (colon-separated or similar)
287
+ if grep -A 30 "detect_drift" "$sprint_common" 2>/dev/null | grep -qE 'story_id.*status|:.*status|\$story_id:\$'; then
288
+ pass "detect_drift output includes story ID and status"
289
+ else
290
+ fail "drift output includes story ID and status" \
291
+ "output format with story_id:status" \
292
+ "output format not found in function"
293
+ fi
294
+ }
295
+
296
+ # Test: workflow-status-check.md references drift detection
297
+ test_workflow_status_check_integration() {
298
+ local workflow_file="$PROJECT_ROOT/pennyfarthing-dist/agents/workflow-status-check.md"
299
+
300
+ if [[ ! -f "$workflow_file" ]]; then
301
+ fail "workflow-status-check includes drift detection" "file exists" "workflow-status-check.md not found"
302
+ return
303
+ fi
304
+
305
+ if grep -qi "drift\|detect_drift" "$workflow_file" 2>/dev/null; then
306
+ pass "workflow-status-check.md references drift detection"
307
+ else
308
+ fail "workflow-status-check includes drift detection" \
309
+ "drift or detect_drift reference in workflow-status-check.md" \
310
+ "no drift reference found"
311
+ fi
312
+ }
313
+
314
+ # Test: Drift report is user-friendly (mentions "merged" and "status")
315
+ test_drift_report_clarity() {
316
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
317
+ local workflow_file="$PROJECT_ROOT/pennyfarthing-dist/agents/workflow-status-check.md"
318
+
319
+ local found=false
320
+
321
+ # Check sprint-common.sh for descriptive output
322
+ if [[ -f "$sprint_common" ]] && grep -A 30 "detect_drift" "$sprint_common" 2>/dev/null | grep -qi "merged\|drift"; then
323
+ found=true
324
+ fi
325
+
326
+ # Or check workflow-status-check.md for report format
327
+ if [[ -f "$workflow_file" ]] && grep -qi "merged.*status\|drift.*report\|drifted stories" "$workflow_file" 2>/dev/null; then
328
+ found=true
329
+ fi
330
+
331
+ if [[ "$found" == "true" ]]; then
332
+ pass "drift report uses clear terminology (merged, drift, status)"
333
+ else
334
+ fail "drift report clarity" \
335
+ "user-friendly terminology (merged, drift, status)" \
336
+ "clear terminology not found"
337
+ fi
338
+ }
339
+
340
+ test_drift_output_format
341
+ test_workflow_status_check_integration
342
+ test_drift_report_clarity
343
+
344
+ echo ""
345
+
346
+ # ==============================================================================
347
+ # AC3: Option to auto-reconcile (update YAML to done)
348
+ # ==============================================================================
349
+
350
+ echo "--- AC3: Auto-reconcile option ---"
351
+ echo ""
352
+
353
+ # Test: reconcile_drift function or auto-reconcile logic exists
354
+ test_reconcile_function_exists() {
355
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
356
+ local workflow_file="$PROJECT_ROOT/pennyfarthing-dist/agents/workflow-status-check.md"
357
+
358
+ local found=false
359
+
360
+ # Check for reconcile function in sprint-common.sh
361
+ if [[ -f "$sprint_common" ]] && grep -qi "reconcile_drift\|auto.reconcile\|reconcile" "$sprint_common" 2>/dev/null; then
362
+ found=true
363
+ fi
364
+
365
+ # Or check workflow-status-check.md for reconcile instructions
366
+ if [[ -f "$workflow_file" ]] && grep -qi "reconcile\|auto.reconcile\|update.*done" "$workflow_file" 2>/dev/null; then
367
+ found=true
368
+ fi
369
+
370
+ if [[ "$found" == "true" ]]; then
371
+ pass "auto-reconcile functionality exists"
372
+ else
373
+ fail "auto-reconcile functionality exists" \
374
+ "reconcile_drift function or auto-reconcile logic" \
375
+ "reconcile functionality not found"
376
+ fi
377
+ }
378
+
379
+ # Test: Auto-reconcile uses update_story_status
380
+ test_reconcile_uses_update() {
381
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
382
+
383
+ if [[ ! -f "$sprint_common" ]]; then
384
+ fail "reconcile uses update_story_status" "file exists" "sprint-common.sh not found"
385
+ return
386
+ fi
387
+
388
+ # Check if there's reconcile logic that calls update_story_status
389
+ # Look for both being present in the file (they should work together)
390
+ local has_detect=$(grep -c "detect_drift" "$sprint_common" 2>/dev/null || echo "0")
391
+ local has_update=$(grep -c "update_story_status" "$sprint_common" 2>/dev/null || echo "0")
392
+
393
+ if [[ "$has_detect" -gt 0 && "$has_update" -gt 0 ]]; then
394
+ pass "sprint-common.sh has both detect_drift and update_story_status"
395
+ else
396
+ fail "reconcile uses update_story_status" \
397
+ "both detect_drift and update_story_status in sprint-common.sh" \
398
+ "detect_drift=$has_detect, update_story_status=$has_update"
399
+ fi
400
+ }
401
+
402
+ # Test: Auto-reconcile logs to reconciliation.log
403
+ test_reconcile_logs_event() {
404
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
405
+ local workflow_file="$PROJECT_ROOT/pennyfarthing-dist/agents/workflow-status-check.md"
406
+
407
+ local found=false
408
+
409
+ # Check sprint-common.sh for log_reconciliation call
410
+ if [[ -f "$sprint_common" ]] && grep -qi "log_reconciliation\|reconciliation" "$sprint_common" 2>/dev/null; then
411
+ found=true
412
+ fi
413
+
414
+ # Or check workflow-status-check.md for logging instructions
415
+ if [[ -f "$workflow_file" ]] && grep -qi "log.*reconcil\|reconciliation.log" "$workflow_file" 2>/dev/null; then
416
+ found=true
417
+ fi
418
+
419
+ if [[ "$found" == "true" ]]; then
420
+ pass "auto-reconcile logs to reconciliation.log"
421
+ else
422
+ fail "auto-reconcile logs to reconciliation.log" \
423
+ "log_reconciliation call or reconciliation.log reference" \
424
+ "reconciliation logging not found"
425
+ fi
426
+ }
427
+
428
+ # Test: workflow-status-check offers reconcile option to user
429
+ test_offers_reconcile_option() {
430
+ local workflow_file="$PROJECT_ROOT/pennyfarthing-dist/agents/workflow-status-check.md"
431
+
432
+ if [[ ! -f "$workflow_file" ]]; then
433
+ fail "offers reconcile option" "file exists" "workflow-status-check.md not found"
434
+ return
435
+ fi
436
+
437
+ # Check for user prompt or option offering
438
+ if grep -qiE "auto.reconcile|offer.*reconcile|reconcile.*option|y/n|yes/no" "$workflow_file" 2>/dev/null; then
439
+ pass "workflow-status-check offers reconcile option to user"
440
+ else
441
+ fail "offers reconcile option" \
442
+ "user prompt for auto-reconcile in workflow-status-check.md" \
443
+ "reconcile prompt not found"
444
+ fi
445
+ }
446
+
447
+ # Test: reconcile_drift transitions Jira to Done
448
+ test_reconcile_transitions_jira() {
449
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
450
+
451
+ if [[ ! -f "$sprint_common" ]]; then
452
+ fail "reconcile transitions Jira" "file exists" "sprint-common.sh not found"
453
+ return
454
+ fi
455
+
456
+ # Check if reconcile_drift uses jira issue move to transition
457
+ if grep -A 40 "reconcile_drift" "$sprint_common" 2>/dev/null | grep -qE 'jira issue move|jira.*Done|transition.*jira'; then
458
+ pass "reconcile_drift transitions Jira to Done"
459
+ else
460
+ fail "reconcile transitions Jira" \
461
+ "jira issue move or transition in reconcile_drift" \
462
+ "jira transition not found"
463
+ fi
464
+ }
465
+
466
+ # Test: workflow-status-check mentions Jira in drift reconciliation
467
+ test_workflow_mentions_jira_reconcile() {
468
+ local workflow_file="$PROJECT_ROOT/pennyfarthing-dist/agents/workflow-status-check.md"
469
+
470
+ if [[ ! -f "$workflow_file" ]]; then
471
+ fail "workflow mentions Jira reconcile" "file exists" "workflow-status-check.md not found"
472
+ return
473
+ fi
474
+
475
+ if grep -qiE 'jira.*done|transition.*jira|jira.*status' "$workflow_file" 2>/dev/null; then
476
+ pass "workflow-status-check mentions Jira in reconciliation"
477
+ else
478
+ fail "workflow mentions Jira reconcile" \
479
+ "Jira transition reference in workflow-status-check.md" \
480
+ "Jira reconcile not found"
481
+ fi
482
+ }
483
+
484
+ test_reconcile_function_exists
485
+ test_reconcile_uses_update
486
+ test_reconcile_transitions_jira
487
+ test_reconcile_logs_event
488
+ test_offers_reconcile_option
489
+ test_workflow_mentions_jira_reconcile
490
+
491
+ echo ""
492
+
493
+ # ==============================================================================
494
+ # Integration Tests
495
+ # ==============================================================================
496
+
497
+ echo "--- Integration: Drift Detection Pipeline ---"
498
+ echo ""
499
+
500
+ # Test: All required functions exist together
501
+ test_drift_pipeline_complete() {
502
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
503
+
504
+ if [[ ! -f "$sprint_common" ]]; then
505
+ fail "drift pipeline complete" "file exists" "sprint-common.sh not found"
506
+ return
507
+ fi
508
+
509
+ local has_extract=$(grep -c "extract_story_id" "$sprint_common" 2>/dev/null || echo "0")
510
+ local has_get=$(grep -c "get_story_field" "$sprint_common" 2>/dev/null || echo "0")
511
+ local has_update=$(grep -c "update_story_status" "$sprint_common" 2>/dev/null || echo "0")
512
+ local has_log=$(grep -c "log_reconciliation" "$sprint_common" 2>/dev/null || echo "0")
513
+ local has_detect=$(grep -c "detect_drift" "$sprint_common" 2>/dev/null || echo "0")
514
+
515
+ if [[ "$has_extract" -gt 0 && "$has_get" -gt 0 && "$has_update" -gt 0 && "$has_log" -gt 0 && "$has_detect" -gt 0 ]]; then
516
+ pass "all drift detection pipeline functions exist"
517
+ else
518
+ fail "drift pipeline complete" \
519
+ "extract_story_id, get_story_field, update_story_status, log_reconciliation, detect_drift" \
520
+ "extract=$has_extract get=$has_get update=$has_update log=$has_log detect=$has_detect"
521
+ fi
522
+ }
523
+
524
+ # Test: detect_drift is callable without errors
525
+ test_detect_drift_callable() {
526
+ local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/utils/sprint-common.sh"
527
+
528
+ if [[ ! -f "$sprint_common" ]]; then
529
+ fail "detect_drift callable" "file exists" "sprint-common.sh not found"
530
+ return
531
+ fi
532
+
533
+ (
534
+ source "$sprint_common" 2>/dev/null || true
535
+
536
+ if type detect_drift &>/dev/null; then
537
+ # Just try to call it - we don't care about the result
538
+ detect_drift 2>/dev/null
539
+ echo "PASS"
540
+ else
541
+ echo "FAIL:function not found"
542
+ fi
543
+ ) | {
544
+ read -r output
545
+ if [[ "$output" == "PASS" ]]; then
546
+ pass "detect_drift is callable without errors"
547
+ else
548
+ local got="${output#FAIL:}"
549
+ fail "detect_drift callable" \
550
+ "function exists and runs without error" \
551
+ "${got:-unknown error}"
552
+ fi
553
+ }
554
+ }
555
+
556
+ test_drift_pipeline_complete
557
+ test_detect_drift_callable
558
+
559
+ echo ""
560
+
561
+ # ==============================================================================
562
+ # Summary
563
+ # ==============================================================================
564
+
565
+ echo "=== Test Summary ==="
566
+ echo "Tests run: $TESTS_RUN"
567
+ echo -e "Passed: ${GREEN}$TESTS_PASSED${NC}"
568
+ echo -e "Failed: ${RED}$TESTS_FAILED${NC}"
569
+
570
+ if [[ $TESTS_FAILED -gt 0 ]]; then
571
+ echo ""
572
+ echo -e "${YELLOW}Story 8-2 Status: RED (tests failing - ready for Dev)${NC}"
573
+ echo ""
574
+ echo "Dev should implement:"
575
+ echo " 1. Add detect_drift() function to sprint-common.sh (AC1)"
576
+ echo " - Scan git log --merges for recent merges (7 days)"
577
+ echo " - Extract story IDs from feat/X-Y-* branches"
578
+ echo " - Compare merged stories against YAML AND Jira status"
579
+ echo " - Return list of drifted stories (status != done, != backlog)"
580
+ echo " 2. Output format: story_id:yaml_status:jira_status (AC2)"
581
+ echo " - Clear, user-friendly terminology"
582
+ echo " - Include both YAML and Jira status"
583
+ echo " 3. Add Step 2.5 to workflow-status-check.md (AC1, AC2)"
584
+ echo " - Call detect_drift after git scan"
585
+ echo " - Report drifted stories before state determination"
586
+ echo " 4. Add auto-reconcile option (AC3)"
587
+ echo " - Offer to update YAML to done"
588
+ echo " - Transition Jira issue to Done"
589
+ echo " - Use update_story_status() for YAML reconciliation"
590
+ echo " - Use jira issue move for Jira transition"
591
+ echo " - Log to reconciliation.log"
592
+ exit 1
593
+ else
594
+ echo ""
595
+ echo -e "${GREEN}ALL TESTS PASSED - Story 8-2 Complete${NC}"
596
+ exit 0
597
+ fi