@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,582 @@
1
+ #!/usr/bin/env bash
2
+ # check.test.sh - Tests for the /check command script
3
+ #
4
+ # Story 21-1: /check command with dev-handoff integration
5
+ #
6
+ # These tests verify the check.sh script that implements quality gates.
7
+ # Tests are written in RED phase - they will fail until check.sh is implemented.
8
+ #
9
+ # Run with: ./check.test.sh
10
+ # Or: bash check.test.sh
11
+
12
+ set -euo pipefail
13
+
14
+ # Colors for output
15
+ RED='\033[0;31m'
16
+ GREEN='\033[0;32m'
17
+ YELLOW='\033[1;33m'
18
+ NC='\033[0m' # No Color
19
+
20
+ # Test counters
21
+ TESTS_RUN=0
22
+ TESTS_PASSED=0
23
+ TESTS_FAILED=0
24
+
25
+ # Path to script under test
26
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
27
+ CHECK_SCRIPT="$SCRIPT_DIR/check.sh"
28
+
29
+ # Temp directory for test fixtures
30
+ TEST_TMPDIR=""
31
+
32
+ # =============================================================================
33
+ # Test Framework
34
+ # =============================================================================
35
+
36
+ setup() {
37
+ TEST_TMPDIR=$(mktemp -d)
38
+ cd "$TEST_TMPDIR"
39
+ # Override PROJECT_ROOT to isolate tests from parent project
40
+ # find-root.sh skips discovery when PROJECT_ROOT is already set
41
+ export PROJECT_ROOT="$TEST_TMPDIR"
42
+ }
43
+
44
+ teardown() {
45
+ cd /
46
+ rm -rf "$TEST_TMPDIR"
47
+ unset PROJECT_ROOT
48
+ }
49
+
50
+ assert_eq() {
51
+ local expected="$1"
52
+ local actual="$2"
53
+ local message="${3:-Values should be equal}"
54
+
55
+ if [[ "$expected" == "$actual" ]]; then
56
+ return 0
57
+ else
58
+ echo -e "${RED}FAIL${NC}: $message"
59
+ echo " Expected: $expected"
60
+ echo " Actual: $actual"
61
+ return 1
62
+ fi
63
+ }
64
+
65
+ assert_exit_code() {
66
+ local expected="$1"
67
+ local actual="$2"
68
+ local message="${3:-Exit code should match}"
69
+
70
+ assert_eq "$expected" "$actual" "$message"
71
+ }
72
+
73
+ assert_contains() {
74
+ local haystack="$1"
75
+ local needle="$2"
76
+ local message="${3:-Output should contain expected text}"
77
+
78
+ if [[ "$haystack" == *"$needle"* ]]; then
79
+ return 0
80
+ else
81
+ echo -e "${RED}FAIL${NC}: $message"
82
+ echo " Expected to contain: $needle"
83
+ echo " Actual output: $haystack"
84
+ return 1
85
+ fi
86
+ }
87
+
88
+ assert_not_contains() {
89
+ local haystack="$1"
90
+ local needle="$2"
91
+ local message="${3:-Output should not contain text}"
92
+
93
+ if [[ "$haystack" != *"$needle"* ]]; then
94
+ return 0
95
+ else
96
+ echo -e "${RED}FAIL${NC}: $message"
97
+ echo " Should not contain: $needle"
98
+ echo " Actual output: $haystack"
99
+ return 1
100
+ fi
101
+ }
102
+
103
+ run_test() {
104
+ local test_name="$1"
105
+ local test_func="$2"
106
+
107
+ TESTS_RUN=$((TESTS_RUN + 1))
108
+
109
+ echo -n " $test_name... "
110
+
111
+ setup
112
+
113
+ if $test_func; then
114
+ echo -e "${GREEN}PASS${NC}"
115
+ TESTS_PASSED=$((TESTS_PASSED + 1))
116
+ else
117
+ TESTS_FAILED=$((TESTS_FAILED + 1))
118
+ fi
119
+
120
+ teardown
121
+ }
122
+
123
+ # =============================================================================
124
+ # Test Fixtures
125
+ # =============================================================================
126
+
127
+ create_node_project() {
128
+ cat > package.json << 'EOF'
129
+ {
130
+ "name": "test-project",
131
+ "scripts": {
132
+ "lint": "eslint .",
133
+ "test": "jest"
134
+ }
135
+ }
136
+ EOF
137
+ }
138
+
139
+ create_node_project_with_typecheck() {
140
+ cat > package.json << 'EOF'
141
+ {
142
+ "name": "test-project",
143
+ "scripts": {
144
+ "lint": "eslint .",
145
+ "typecheck": "tsc --noEmit",
146
+ "test": "jest"
147
+ }
148
+ }
149
+ EOF
150
+ cat > tsconfig.json << 'EOF'
151
+ {
152
+ "compilerOptions": {
153
+ "strict": true
154
+ }
155
+ }
156
+ EOF
157
+ }
158
+
159
+ create_justfile_project() {
160
+ cat > justfile << 'EOF'
161
+ lint:
162
+ eslint .
163
+
164
+ typecheck:
165
+ tsc --noEmit
166
+
167
+ test:
168
+ npm test
169
+ EOF
170
+ }
171
+
172
+ create_go_project() {
173
+ mkdir -p internal
174
+ cat > go.mod << 'EOF'
175
+ module test-project
176
+ go 1.21
177
+ EOF
178
+ }
179
+
180
+ # =============================================================================
181
+ # AC1: /check command runs lint, type check, and tests
182
+ # =============================================================================
183
+
184
+ test_ac1_script_exists() {
185
+ if [[ -f "$CHECK_SCRIPT" ]]; then
186
+ return 0
187
+ else
188
+ echo -e "${RED}FAIL${NC}: check.sh script does not exist at $CHECK_SCRIPT"
189
+ return 1
190
+ fi
191
+ }
192
+
193
+ test_ac1_runs_lint() {
194
+ create_node_project
195
+
196
+ local output
197
+ output=$("$CHECK_SCRIPT" 2>&1) || true
198
+
199
+ assert_contains "$output" "Lint" "Output should include Lint section"
200
+ }
201
+
202
+ test_ac1_runs_typecheck() {
203
+ create_node_project_with_typecheck
204
+
205
+ local output
206
+ output=$("$CHECK_SCRIPT" 2>&1) || true
207
+
208
+ assert_contains "$output" "Type Check" "Output should include Type Check section"
209
+ }
210
+
211
+ test_ac1_runs_tests() {
212
+ create_node_project
213
+
214
+ local output
215
+ output=$("$CHECK_SCRIPT" 2>&1) || true
216
+
217
+ assert_contains "$output" "Tests" "Output should include Tests section"
218
+ }
219
+
220
+ # =============================================================================
221
+ # AC2: Command reports pass/fail with clear output
222
+ # =============================================================================
223
+
224
+ test_ac2_shows_pass_status() {
225
+ create_node_project
226
+ # Mock successful commands
227
+ mkdir -p node_modules/.bin
228
+ echo '#!/bin/bash' > node_modules/.bin/eslint
229
+ echo 'exit 0' >> node_modules/.bin/eslint
230
+ chmod +x node_modules/.bin/eslint
231
+
232
+ local output
233
+ output=$("$CHECK_SCRIPT" 2>&1) || true
234
+
235
+ # Should show [PASS] for passing checks
236
+ assert_contains "$output" "[PASS]" "Output should show PASS status"
237
+ }
238
+
239
+ test_ac2_shows_fail_status() {
240
+ create_node_project
241
+ # Mock failing lint
242
+ mkdir -p node_modules/.bin
243
+ echo '#!/bin/bash' > node_modules/.bin/eslint
244
+ echo 'echo "Error: unused variable"' >> node_modules/.bin/eslint
245
+ echo 'exit 1' >> node_modules/.bin/eslint
246
+ chmod +x node_modules/.bin/eslint
247
+
248
+ local output
249
+ output=$("$CHECK_SCRIPT" 2>&1) || true
250
+
251
+ # Should show [FAIL] for failing checks
252
+ assert_contains "$output" "[FAIL]" "Output should show FAIL status"
253
+ }
254
+
255
+ test_ac2_returns_exit_code_0_on_success() {
256
+ create_node_project
257
+ # Mock all passing
258
+ mkdir -p node_modules/.bin
259
+ for cmd in eslint jest; do
260
+ echo '#!/bin/bash' > "node_modules/.bin/$cmd"
261
+ echo 'exit 0' >> "node_modules/.bin/$cmd"
262
+ chmod +x "node_modules/.bin/$cmd"
263
+ done
264
+
265
+ "$CHECK_SCRIPT" > /dev/null 2>&1
266
+ local exit_code=$?
267
+
268
+ assert_exit_code "0" "$exit_code" "Should return 0 on all checks passing"
269
+ }
270
+
271
+ test_ac2_returns_nonzero_on_failure() {
272
+ create_node_project
273
+ # Mock failing lint
274
+ mkdir -p node_modules/.bin
275
+ echo '#!/bin/bash' > node_modules/.bin/eslint
276
+ echo 'exit 1' >> node_modules/.bin/eslint
277
+ chmod +x node_modules/.bin/eslint
278
+
279
+ "$CHECK_SCRIPT" > /dev/null 2>&1
280
+ local exit_code=$?
281
+
282
+ # Should be non-zero
283
+ if [[ "$exit_code" -ne 0 ]]; then
284
+ return 0
285
+ else
286
+ echo -e "${RED}FAIL${NC}: Should return non-zero on check failure"
287
+ return 1
288
+ fi
289
+ }
290
+
291
+ test_ac2_summary_section_exists() {
292
+ create_node_project
293
+
294
+ local output
295
+ output=$("$CHECK_SCRIPT" 2>&1) || true
296
+
297
+ assert_contains "$output" "Summary" "Output should include Summary section"
298
+ }
299
+
300
+ # =============================================================================
301
+ # AC3: dev-handoff subagent runs /check automatically
302
+ # (This is a markdown/integration test - verified manually)
303
+ # =============================================================================
304
+
305
+ test_ac3_dev_handoff_references_check() {
306
+ local dev_handoff="$SCRIPT_DIR/../agents/dev-handoff.md"
307
+
308
+ if [[ ! -f "$dev_handoff" ]]; then
309
+ echo -e "${RED}FAIL${NC}: dev-handoff.md not found"
310
+ return 1
311
+ fi
312
+
313
+ local content
314
+ content=$(cat "$dev_handoff")
315
+
316
+ # Should reference /check or check.sh
317
+ if [[ "$content" == *"/check"* ]] || [[ "$content" == *"check.sh"* ]]; then
318
+ return 0
319
+ else
320
+ echo -e "${RED}FAIL${NC}: dev-handoff.md should reference /check command"
321
+ return 1
322
+ fi
323
+ }
324
+
325
+ # =============================================================================
326
+ # AC4: Failures block handoff to Reviewer
327
+ # (Verified by exit code - non-zero blocks handoff)
328
+ # =============================================================================
329
+
330
+ test_ac4_lint_failure_blocks() {
331
+ create_node_project
332
+ mkdir -p node_modules/.bin
333
+ echo '#!/bin/bash' > node_modules/.bin/eslint
334
+ echo 'exit 1' >> node_modules/.bin/eslint
335
+ chmod +x node_modules/.bin/eslint
336
+
337
+ "$CHECK_SCRIPT" > /dev/null 2>&1
338
+ local exit_code=$?
339
+
340
+ if [[ "$exit_code" -ne 0 ]]; then
341
+ return 0
342
+ else
343
+ echo -e "${RED}FAIL${NC}: Lint failure should result in non-zero exit"
344
+ return 1
345
+ fi
346
+ }
347
+
348
+ test_ac4_test_failure_blocks() {
349
+ create_node_project
350
+ mkdir -p node_modules/.bin
351
+ echo '#!/bin/bash' > node_modules/.bin/eslint
352
+ echo 'exit 0' >> node_modules/.bin/eslint
353
+ chmod +x node_modules/.bin/eslint
354
+
355
+ echo '#!/bin/bash' > node_modules/.bin/jest
356
+ echo 'exit 1' >> node_modules/.bin/jest
357
+ chmod +x node_modules/.bin/jest
358
+
359
+ "$CHECK_SCRIPT" > /dev/null 2>&1
360
+ local exit_code=$?
361
+
362
+ if [[ "$exit_code" -ne 0 ]]; then
363
+ return 0
364
+ else
365
+ echo -e "${RED}FAIL${NC}: Test failure should result in non-zero exit"
366
+ return 1
367
+ fi
368
+ }
369
+
370
+ # =============================================================================
371
+ # AC5: --skip-check flag bypasses checks when needed
372
+ # =============================================================================
373
+
374
+ test_ac5_skip_flag_accepted() {
375
+ create_node_project
376
+
377
+ # Should not error on --skip-check flag
378
+ "$CHECK_SCRIPT" --skip-check > /dev/null 2>&1
379
+ local exit_code=$?
380
+
381
+ assert_exit_code "0" "$exit_code" "--skip-check should always return 0"
382
+ }
383
+
384
+ test_ac5_skip_flag_shows_warning() {
385
+ create_node_project
386
+
387
+ local output
388
+ output=$("$CHECK_SCRIPT" --skip-check 2>&1)
389
+
390
+ assert_contains "$output" "skip" "Should mention skip in output"
391
+ }
392
+
393
+ test_ac5_skip_flag_does_not_run_checks() {
394
+ create_node_project
395
+ # Mock lint that would fail
396
+ mkdir -p node_modules/.bin
397
+ echo '#!/bin/bash' > node_modules/.bin/eslint
398
+ echo 'echo "LINT_WAS_RUN"' >> node_modules/.bin/eslint
399
+ echo 'exit 1' >> node_modules/.bin/eslint
400
+ chmod +x node_modules/.bin/eslint
401
+
402
+ local output
403
+ output=$("$CHECK_SCRIPT" --skip-check 2>&1)
404
+
405
+ assert_not_contains "$output" "LINT_WAS_RUN" "Lint should not run when --skip-check is used"
406
+ }
407
+
408
+ # =============================================================================
409
+ # AC6: Works with justfile recipes if available
410
+ # =============================================================================
411
+
412
+ test_ac6_detects_justfile() {
413
+ create_justfile_project
414
+
415
+ local output
416
+ output=$("$CHECK_SCRIPT" 2>&1) || true
417
+
418
+ # Should detect and use justfile
419
+ # (Exact output depends on implementation)
420
+ assert_contains "$output" "Lint" "Should still run lint check"
421
+ }
422
+
423
+ test_ac6_prefers_justfile_over_npm() {
424
+ create_justfile_project
425
+ create_node_project # Also has package.json
426
+
427
+ # Mock just command
428
+ mkdir -p "$TEST_TMPDIR/bin"
429
+ echo '#!/bin/bash' > "$TEST_TMPDIR/bin/just"
430
+ echo 'if [[ "$1" == "--list" ]]; then' >> "$TEST_TMPDIR/bin/just"
431
+ echo ' echo "lint (linting)"' >> "$TEST_TMPDIR/bin/just"
432
+ echo ' echo "typecheck (type checking)"' >> "$TEST_TMPDIR/bin/just"
433
+ echo ' echo "test (testing)"' >> "$TEST_TMPDIR/bin/just"
434
+ echo 'else' >> "$TEST_TMPDIR/bin/just"
435
+ echo 'echo "JUST_WAS_USED"' >> "$TEST_TMPDIR/bin/just"
436
+ echo 'fi' >> "$TEST_TMPDIR/bin/just"
437
+ echo 'exit 0' >> "$TEST_TMPDIR/bin/just"
438
+ chmod +x "$TEST_TMPDIR/bin/just"
439
+
440
+ local output
441
+ output=$(env PATH="$TEST_TMPDIR/bin:$PATH" "$CHECK_SCRIPT" 2>&1)
442
+
443
+ # Should use just when available
444
+ assert_contains "$output" "(just" "Should prefer justfile recipes"
445
+ }
446
+
447
+ test_ac6_falls_back_to_npm() {
448
+ create_node_project
449
+ # No justfile
450
+
451
+ local output
452
+ output=$("$CHECK_SCRIPT" 2>&1) || true
453
+
454
+ # Should work without justfile
455
+ assert_contains "$output" "Lint" "Should fall back to npm scripts"
456
+ }
457
+
458
+ # =============================================================================
459
+ # Edge Cases
460
+ # =============================================================================
461
+
462
+ test_edge_no_lint_configured() {
463
+ # Project with no lint
464
+ cat > package.json << 'EOF'
465
+ {
466
+ "name": "test-project",
467
+ "scripts": {
468
+ "test": "jest"
469
+ }
470
+ }
471
+ EOF
472
+
473
+ local output
474
+ output=$("$CHECK_SCRIPT" 2>&1) || true
475
+
476
+ # Should handle gracefully (skip or warn)
477
+ # Not a failure condition
478
+ if [[ "$output" == *"Lint"* ]]; then
479
+ assert_contains "$output" "skip" "Should indicate lint was skipped"
480
+ fi
481
+ return 0
482
+ }
483
+
484
+ test_edge_no_tests_configured() {
485
+ cat > package.json << 'EOF'
486
+ {
487
+ "name": "test-project",
488
+ "scripts": {
489
+ "lint": "eslint ."
490
+ }
491
+ }
492
+ EOF
493
+
494
+ local output
495
+ output=$("$CHECK_SCRIPT" 2>&1) || true
496
+
497
+ # Should handle missing test command gracefully
498
+ return 0 # Not failing is success
499
+ }
500
+
501
+ test_edge_empty_directory() {
502
+ # Empty project directory - no package.json, no justfile
503
+
504
+ local output
505
+ output=$("$CHECK_SCRIPT" 2>&1) || true
506
+ local exit_code=$?
507
+
508
+ # Should not crash, may warn about no project detected
509
+ return 0
510
+ }
511
+
512
+ # =============================================================================
513
+ # Run All Tests
514
+ # =============================================================================
515
+
516
+ echo ""
517
+ echo "=================================="
518
+ echo "Story 21-1: /check Command Tests"
519
+ echo "=================================="
520
+ echo ""
521
+
522
+ echo "AC1: /check command runs lint, type check, and tests"
523
+ run_test "check.sh script exists" test_ac1_script_exists
524
+ run_test "runs lint check" test_ac1_runs_lint
525
+ run_test "runs type check" test_ac1_runs_typecheck
526
+ run_test "runs tests" test_ac1_runs_tests
527
+
528
+ echo ""
529
+ echo "AC2: Command reports pass/fail with clear output"
530
+ run_test "shows PASS status" test_ac2_shows_pass_status
531
+ run_test "shows FAIL status" test_ac2_shows_fail_status
532
+ run_test "returns exit 0 on success" test_ac2_returns_exit_code_0_on_success
533
+ run_test "returns non-zero on failure" test_ac2_returns_nonzero_on_failure
534
+ run_test "includes Summary section" test_ac2_summary_section_exists
535
+
536
+ echo ""
537
+ echo "AC3: dev-handoff subagent runs /check automatically"
538
+ run_test "dev-handoff.md references /check" test_ac3_dev_handoff_references_check
539
+
540
+ echo ""
541
+ echo "AC4: Failures block handoff to Reviewer"
542
+ run_test "lint failure blocks handoff" test_ac4_lint_failure_blocks
543
+ run_test "test failure blocks handoff" test_ac4_test_failure_blocks
544
+
545
+ echo ""
546
+ echo "AC5: --skip-check flag bypasses checks when needed"
547
+ run_test "--skip-check flag accepted" test_ac5_skip_flag_accepted
548
+ run_test "--skip-check shows warning" test_ac5_skip_flag_shows_warning
549
+ run_test "--skip-check skips actual checks" test_ac5_skip_flag_does_not_run_checks
550
+
551
+ echo ""
552
+ echo "AC6: Works with justfile recipes if available"
553
+ run_test "detects justfile" test_ac6_detects_justfile
554
+ run_test "prefers justfile over npm" test_ac6_prefers_justfile_over_npm
555
+ run_test "falls back to npm scripts" test_ac6_falls_back_to_npm
556
+
557
+ echo ""
558
+ echo "Edge Cases"
559
+ run_test "handles no lint configured" test_edge_no_lint_configured
560
+ run_test "handles no tests configured" test_edge_no_tests_configured
561
+ run_test "handles empty directory" test_edge_empty_directory
562
+
563
+ # =============================================================================
564
+ # Summary
565
+ # =============================================================================
566
+
567
+ echo ""
568
+ echo "=================================="
569
+ echo "Test Summary"
570
+ echo "=================================="
571
+ echo -e "Tests run: $TESTS_RUN"
572
+ echo -e "Tests passed: ${GREEN}$TESTS_PASSED${NC}"
573
+ echo -e "Tests failed: ${RED}$TESTS_FAILED${NC}"
574
+ echo ""
575
+
576
+ if [[ $TESTS_FAILED -gt 0 ]]; then
577
+ echo -e "${RED}FAILED${NC} - $TESTS_FAILED test(s) failed"
578
+ exit 1
579
+ else
580
+ echo -e "${GREEN}PASSED${NC} - All tests passed"
581
+ exit 0
582
+ fi
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env bash
2
+ # Test: agent-session.sh respects character_voice preference
3
+ #
4
+ # This test verifies that when character_voice=false in preferences.yaml,
5
+ # the persona output is suppressed.
6
+ #
7
+ # Usage: ./test-character-voice.sh
8
+ # Exit codes: 0 = pass, 1 = fail
9
+
10
+ set -euo pipefail
11
+
12
+ # Find project root
13
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
14
+ source "$SCRIPT_DIR/../utils/find-root.sh"
15
+
16
+ # Colors
17
+ RED='\033[0;31m'
18
+ GREEN='\033[0;32m'
19
+ NC='\033[0m'
20
+
21
+ echo "=== Testing character_voice preference ==="
22
+ echo "Project root: $PROJECT_ROOT"
23
+
24
+ # Create temp directory for test
25
+ TEST_DIR=$(mktemp -d)
26
+ trap "rm -rf $TEST_DIR" EXIT
27
+
28
+ # Setup test project structure
29
+ mkdir -p "$TEST_DIR/.pennyfarthing/personas/themes"
30
+ mkdir -p "$TEST_DIR/.claude/pennyfarthing"
31
+ mkdir -p "$TEST_DIR/scripts"
32
+
33
+ # Copy agent-session.sh
34
+ cp "$PROJECT_ROOT/scripts/agent-session.sh" "$TEST_DIR/scripts/"
35
+
36
+ # Create minimal theme file
37
+ cat > "$TEST_DIR/.pennyfarthing/personas/themes/test-theme.yaml" << 'EOF'
38
+ name: test-theme
39
+ description: Test theme
40
+
41
+ agents:
42
+ sm:
43
+ character: Test Character
44
+ style: Test style
45
+ role: Test role
46
+ EOF
47
+
48
+ # Create persona config
49
+ cat > "$TEST_DIR/.claude/persona-config.yaml" << 'EOF'
50
+ theme: test-theme
51
+ EOF
52
+
53
+ # Test 1: Without preferences file (default behavior - should show persona)
54
+ echo ""
55
+ echo "Test 1: Without preferences file (should show persona)..."
56
+ cd "$TEST_DIR"
57
+ OUTPUT=$("$TEST_DIR/scripts/agent-session.sh" start sm test-session 2>&1 || true)
58
+
59
+ if echo "$OUTPUT" | grep -q "Character:"; then
60
+ echo -e "${GREEN}PASS${NC}: Persona shown when no preferences file"
61
+ else
62
+ echo -e "${RED}FAIL${NC}: Persona NOT shown when no preferences file"
63
+ echo "Output was: $OUTPUT"
64
+ exit 1
65
+ fi
66
+
67
+ # Test 2: With character_voice=true (should show persona)
68
+ echo ""
69
+ echo "Test 2: character_voice=true (should show persona)..."
70
+ cat > "$TEST_DIR/.claude/pennyfarthing/preferences.yaml" << 'EOF'
71
+ character_voice: true
72
+ explain_decisions: true
73
+ auto_commit: false
74
+ EOF
75
+
76
+ OUTPUT=$("$TEST_DIR/scripts/agent-session.sh" start sm test-session-2 2>&1 || true)
77
+
78
+ if echo "$OUTPUT" | grep -q "Character:"; then
79
+ echo -e "${GREEN}PASS${NC}: Persona shown when character_voice=true"
80
+ else
81
+ echo -e "${RED}FAIL${NC}: Persona NOT shown when character_voice=true"
82
+ echo "Output was: $OUTPUT"
83
+ exit 1
84
+ fi
85
+
86
+ # Test 3: With character_voice=false (should suppress persona)
87
+ echo ""
88
+ echo "Test 3: character_voice=false (should suppress persona)..."
89
+ cat > "$TEST_DIR/.claude/pennyfarthing/preferences.yaml" << 'EOF'
90
+ character_voice: false
91
+ explain_decisions: true
92
+ auto_commit: false
93
+ EOF
94
+
95
+ OUTPUT=$("$TEST_DIR/scripts/agent-session.sh" start sm test-session-3 2>&1 || true)
96
+
97
+ if echo "$OUTPUT" | grep -q "<persona"; then
98
+ echo -e "${RED}FAIL${NC}: Persona shown when character_voice=false (should be suppressed)"
99
+ echo "Output was: $OUTPUT"
100
+ exit 1
101
+ else
102
+ echo -e "${GREEN}PASS${NC}: Persona suppressed when character_voice=false"
103
+ fi
104
+
105
+ echo ""
106
+ echo -e "${GREEN}=== All character_voice tests passed ===${NC}"
107
+ exit 0