@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,421 @@
1
+ ---
2
+ name: dev-patterns
3
+ description: Common development patterns, fixes, and gotchas. Use when implementing features, debugging issues, or avoiding known pitfalls.
4
+ ---
5
+
6
+ # Dev Patterns Skill
7
+
8
+ ## Overview
9
+
10
+ This skill captures common development patterns, fixes, and gotchas that apply across projects using the pennyfarthing agent framework.
11
+
12
+ ## Critical Patterns
13
+
14
+ ### Bash Tool Working Directory
15
+
16
+ **Problem:** The Bash tool maintains a persistent working directory. Relative `cd` commands fail when already in a different directory.
17
+
18
+ **Symptoms:**
19
+ - `cd API && just test` fails with "no such file or directory"
20
+ - Commands fail because assuming wrong directory
21
+
22
+ **Solution:** Always use absolute paths with `$CLAUDE_PROJECT_DIR`:
23
+
24
+ ```bash
25
+ # WRONG - relative cd fails if you're already somewhere else
26
+ cd API && just test
27
+
28
+ # CORRECT - absolute path always works
29
+ cd $CLAUDE_PROJECT_DIR/API && just test
30
+ ```
31
+
32
+ **Best Practice:** Explicit `cd` with absolute path in every Bash call:
33
+
34
+ ```bash
35
+ # Single-repo: from anywhere - always works
36
+ cd $CLAUDE_PROJECT_DIR && git push -u origin feat/branch
37
+ cd $CLAUDE_PROJECT_DIR && just test
38
+
39
+ # Multi-repo: use repo-utils.sh for dynamic lookup
40
+ source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
41
+ cd $CLAUDE_PROJECT_DIR/$(get_repo_path "myrepo") && just test
42
+ ```
43
+
44
+ ### TypeScript Type Imports
45
+
46
+ **Problem:** Build fails with `verbatimModuleSyntax` errors.
47
+
48
+ **Solution:** Use `import type` for type-only imports:
49
+
50
+ ```typescript
51
+ // WRONG - causes build errors
52
+ import { User, Ticket } from '@/types';
53
+
54
+ // CORRECT
55
+ import type { User, Ticket } from '@/types';
56
+ ```
57
+
58
+ ### Go Error Handling
59
+
60
+ **Problem:** Silent failures when errors aren't checked.
61
+
62
+ **Solution:** Always handle errors explicitly:
63
+
64
+ ```go
65
+ // WRONG - ignores error
66
+ result, _ := doSomething()
67
+
68
+ // CORRECT
69
+ result, err := doSomething()
70
+ if err != nil {
71
+ return fmt.Errorf("doSomething failed: %w", err)
72
+ }
73
+ ```
74
+
75
+ ### UUID Parsing
76
+
77
+ **Problem:** Invalid UUIDs cause panics or unexpected behavior.
78
+
79
+ **Solution:** Always validate UUID parsing:
80
+
81
+ ```go
82
+ // WRONG - panics on invalid UUID
83
+ id := uuid.MustParse(rawID)
84
+
85
+ // CORRECT
86
+ id, err := uuid.Parse(rawID)
87
+ if err != nil {
88
+ return fmt.Errorf("invalid UUID: %w", err)
89
+ }
90
+ ```
91
+
92
+ ## HTTP Status Codes
93
+
94
+ Use appropriate status codes consistently:
95
+
96
+ | Code | When to Use |
97
+ |------|-------------|
98
+ | `200 OK` | Successful GET, PUT, PATCH |
99
+ | `201 Created` | Successful POST creating new resource |
100
+ | `204 No Content` | Successful DELETE |
101
+ | `400 Bad Request` | Invalid input (validation errors) |
102
+ | `401 Unauthorized` | Missing or invalid authentication |
103
+ | `403 Forbidden` | Authenticated but not authorized |
104
+ | `404 Not Found` | Resource doesn't exist |
105
+ | `409 Conflict` | Resource state conflict (duplicate) |
106
+ | `500 Internal Server Error` | Server-side error (always log it!) |
107
+
108
+ ## Test Patterns
109
+
110
+ ### Test Isolation
111
+
112
+ Each test should:
113
+ 1. Set up its own state
114
+ 2. Clean up after itself
115
+ 3. Not depend on other tests' state
116
+
117
+ ```go
118
+ func TestCreate(t *testing.T) {
119
+ // Setup
120
+ db := testutil.NewTestDB(t)
121
+ defer db.Cleanup()
122
+
123
+ // Test
124
+ result, err := Create(db, input)
125
+
126
+ // Assert
127
+ require.NoError(t, err)
128
+ assert.Equal(t, expected, result)
129
+ }
130
+ ```
131
+
132
+ ### Table-Driven Tests
133
+
134
+ ```go
135
+ func TestValidate(t *testing.T) {
136
+ tests := []struct {
137
+ name string
138
+ input string
139
+ wantErr bool
140
+ }{
141
+ {"valid input", "good", false},
142
+ {"empty input", "", true},
143
+ {"too long", strings.Repeat("x", 1000), true},
144
+ }
145
+
146
+ for _, tt := range tests {
147
+ t.Run(tt.name, func(t *testing.T) {
148
+ err := Validate(tt.input)
149
+ if tt.wantErr {
150
+ assert.Error(t, err)
151
+ } else {
152
+ assert.NoError(t, err)
153
+ }
154
+ })
155
+ }
156
+ }
157
+ ```
158
+
159
+ ## Common Gotchas
160
+
161
+ 1. **Working directory** - Always use `$CLAUDE_PROJECT_DIR` for absolute paths
162
+ 2. **Type imports** - Use `import type` for TypeScript types
163
+ 3. **Error handling** - Never ignore errors in Go
164
+ 4. **UUID parsing** - Always validate, never panic
165
+ 5. **Test isolation** - Each test manages its own state
166
+
167
+ ## Turn-Efficient Patterns
168
+
169
+ Minimize API round-trips by batching operations and parallelizing where possible. Each tool call is a "turn" - fewer turns means faster completion.
170
+
171
+ ### Batch Bash Commands
172
+
173
+ Chain related commands with `&&` instead of separate calls:
174
+
175
+ ```bash
176
+ # INEFFICIENT - 3 turns
177
+ git status
178
+ git branch --show-current
179
+ git log -1 --oneline
180
+
181
+ # EFFICIENT - 1 turn
182
+ git status && git branch --show-current && git log -1 --oneline
183
+ ```
184
+
185
+ For git workflows, batch the entire operation:
186
+
187
+ ```bash
188
+ # INEFFICIENT - 3 turns
189
+ git add .
190
+ git commit -m "feat: add feature"
191
+ git push -u origin $(git branch --show-current)
192
+
193
+ # EFFICIENT - 1 turn
194
+ git add . && git commit -m "feat: add feature" && git push -u origin $(git branch --show-current)
195
+ ```
196
+
197
+ ### Parallel Tool Calls
198
+
199
+ When operations are independent, invoke multiple tools in the same turn:
200
+
201
+ ```
202
+ # INEFFICIENT - 3 sequential turns
203
+ Turn 1: Read file A
204
+ Turn 2: Read file B
205
+ Turn 3: Read file C
206
+
207
+ # EFFICIENT - 1 parallel turn
208
+ Turn 1: Read file A, Read file B, Read file C (parallel)
209
+ ```
210
+
211
+ **When to parallelize:**
212
+ - Reading multiple independent files
213
+ - Spawning subagents that don't depend on each other's results
214
+ - Running Glob and Grep searches simultaneously
215
+ - Fetching multiple web resources
216
+
217
+ **When NOT to parallelize:**
218
+ - Operations where later calls depend on earlier results
219
+ - Writes that might conflict
220
+ - Sequential logic (must read before edit)
221
+
222
+ ### Smart File Operations
223
+
224
+ Use Grep's internal file reading instead of Read + manual search:
225
+
226
+ ```bash
227
+ # INEFFICIENT - 2 turns
228
+ Turn 1: Read entire file
229
+ Turn 2: (mentally search for pattern)
230
+
231
+ # EFFICIENT - 1 turn with context
232
+ Grep pattern with -C 5 for context
233
+ ```
234
+
235
+ Use Glob with brace expansion for multiple patterns:
236
+
237
+ ```bash
238
+ # INEFFICIENT - 2 turns
239
+ Glob: **/*.ts
240
+ Glob: **/*.tsx
241
+
242
+ # EFFICIENT - 1 turn
243
+ Glob: **/*.{ts,tsx}
244
+ ```
245
+
246
+ ### Compound Subagents
247
+
248
+ Design subagents to do multiple related steps in one spawn:
249
+
250
+ ```yaml
251
+ # INEFFICIENT - 2 subagent spawns
252
+ Spawn 1: workflow-status-check
253
+ Spawn 2: sm-file-summary
254
+
255
+ # EFFICIENT - 1 compound subagent
256
+ Spawn 1: (combined status-check + file-summary subagent)
257
+ ```
258
+
259
+ **Good candidates for combining:**
260
+ - Preflight checks + handoff updates
261
+ - Status gathering + session file updates
262
+ - Test running + result parsing
263
+
264
+ **Creating Compound Subagents:**
265
+
266
+ When you notice a pattern of sequential subagent calls, consider creating a compound subagent:
267
+
268
+ 1. **Identify the pattern:** Look for repeated sequences like "always call A then B"
269
+ 2. **Check dependencies:** Can B start before A completes? If yes, parallelize instead.
270
+ 3. **Create combined prompt:** Merge both subagents' responsibilities into one
271
+
272
+ **Example: Compound Preflight + Handoff**
273
+
274
+ Instead of:
275
+ ```yaml
276
+ # Turn 1: Preflight
277
+ Task tool:
278
+ subagent_type: "reviewer-preflight"
279
+ prompt: |
280
+ STORY_ID: X-Y
281
+ ...
282
+
283
+ # Turn 2: Wait for result, then handoff
284
+ Task tool:
285
+ subagent_type: "reviewer-handoff-approve"
286
+ prompt: |
287
+ STORY_ID: X-Y
288
+ ...
289
+ ```
290
+
291
+ Create a compound definition that does both:
292
+ ```yaml
293
+ Task tool:
294
+ subagent_type: "general-purpose"
295
+ model: "haiku"
296
+ prompt: |
297
+ You are a combined preflight + handoff assistant.
298
+
299
+ ## Phase 1: Pre-flight checks
300
+ [Include preflight steps]
301
+
302
+ ## Phase 2: If all checks pass, complete handoff
303
+ [Include handoff steps]
304
+
305
+ ## Output
306
+ Report: preflight results + handoff status
307
+ ```
308
+
309
+ **When NOT to combine:**
310
+ - When steps need human review between them (e.g., reviewer assessment before handoff)
311
+ - When the first step might fail often (better to fail fast)
312
+ - When prompts are already long (context limits)
313
+
314
+ ### Turn Budget Guidelines
315
+
316
+ | Story Size | Target Turns |
317
+ |------------|--------------|
318
+ | 1 point (trivial) | 10-15 |
319
+ | 2 points (small) | 15-25 |
320
+ | 3 points (medium) | 25-35 |
321
+ | 5 points (large) | 35-50 |
322
+
323
+ **Techniques to reduce turns:**
324
+ 1. Batch bash commands with `&&`
325
+ 2. Read multiple files in parallel
326
+ 3. Use Grep with context instead of Read + search
327
+ 4. Combine related subagent work
328
+ 5. Use brace expansion in Glob patterns
329
+ 6. Spawn independent subagents in parallel
330
+ 7. Run tests in background while continuing work
331
+
332
+ ### Background Subagent Execution
333
+
334
+ Run slow operations in background to continue working:
335
+
336
+ ```yaml
337
+ # Spawn tests in background
338
+ Task tool:
339
+ subagent_type: "testing-runner"
340
+ run_in_background: true
341
+ prompt: |
342
+ REPOS: all
343
+ CONTEXT: Background test run
344
+ RUN_ID: bg-001
345
+ SKIP_CACHE_WRITE: true
346
+ ```
347
+
348
+ **Check status without blocking:**
349
+ ```yaml
350
+ TaskOutput tool:
351
+ task_id: {task_id}
352
+ block: false
353
+ timeout: 1000
354
+ ```
355
+
356
+ **When to use background execution:**
357
+ - Test runs while writing more code
358
+ - Multiple independent file searches
359
+ - Parallel exploration of code paths
360
+ - Long-running git operations
361
+
362
+ **When NOT to use:**
363
+ - Operations where next steps depend on the result
364
+ - Operations that modify shared state
365
+ - Before commit (need to verify GREEN)
366
+ - During handoff (need synchronous verification)
367
+
368
+ ### Background Task Tracking
369
+
370
+ Use the background task tracking utilities to manage session file entries:
371
+
372
+ ```bash
373
+ source $CLAUDE_PROJECT_DIR/scripts/utils/background-tasks.sh
374
+ SESSION_FILE="$CLAUDE_PROJECT_DIR/.session/${STORY_ID}-session.md"
375
+
376
+ # After spawning background task, record it:
377
+ bg_task_add "$SESSION_FILE" "$TASK_ID" "testing-runner" "Background test run"
378
+
379
+ # After checking TaskOutput, update status:
380
+ bg_task_update "$SESSION_FILE" "$TASK_ID" "completed" # or "error"
381
+
382
+ # Clean up finished tasks:
383
+ bg_task_cleanup "$SESSION_FILE"
384
+ ```
385
+
386
+ **Available functions:**
387
+ | Function | Purpose |
388
+ |----------|---------|
389
+ | `bg_task_add` | Record new background task |
390
+ | `bg_task_update` | Update task status (running/completed/error) |
391
+ | `bg_task_cleanup` | Remove completed and errored tasks |
392
+ | `bg_task_list` | Show all running tasks |
393
+ | `bg_task_check` | Return 0 if any tasks running (for conditionals) |
394
+ | `bg_task_summary` | Print counts by status |
395
+
396
+ **Lifecycle:**
397
+ 1. Spawn with `run_in_background: true`
398
+ 2. Record: `bg_task_add "$SESSION_FILE" "$TASK_ID" "type" "description"`
399
+ 3. Continue other work
400
+ 4. Periodically check `TaskOutput` with `block: false`
401
+ 5. Update: `bg_task_update "$SESSION_FILE" "$TASK_ID" "completed"`
402
+ 6. Cleanup: `bg_task_cleanup "$SESSION_FILE"`
403
+
404
+ ### Example: Background Tests While Implementing
405
+
406
+ ```
407
+ Turn 1: Spawn testing-runner in background, continue editing
408
+ Turn 2: Make code changes
409
+ Turn 3: Check TaskOutput (still running), continue editing
410
+ Turn 4: Make more changes
411
+ Turn 5: Check TaskOutput (complete, GREEN), proceed to commit
412
+ ```
413
+
414
+ This pattern saves turns by overlapping test execution with implementation work.
415
+
416
+ ## Project Customization
417
+
418
+ Projects should create their own dev-patterns skill in `.claude/project/skills/dev-patterns/` with:
419
+ - Project-specific patterns and conventions
420
+ - Known pitfalls for the tech stack
421
+ - File location conventions
@@ -0,0 +1,258 @@
1
+ ---
2
+ name: finalize-run
3
+ description: Validate and save run results. Single exit point for all benchmark runs.
4
+ ---
5
+
6
+ # Finalize Run Skill
7
+
8
+ All runs MUST pass through this skill before saving. This is the guardrail.
9
+
10
+ ## Invocation
11
+
12
+ ```
13
+ /finalize-run --type <type> --data <json>
14
+ ```
15
+
16
+ **Types:**
17
+ - `solo` - Single agent evaluation
18
+ - `duel` - Two-agent comparison
19
+ - `relay` - Team relay competition
20
+
21
+ ## Validation Rules
22
+
23
+ ### Agent Validation
24
+
25
+ For EACH agent in the run:
26
+
27
+ | Field | Rule | Action on Fail |
28
+ |-------|------|----------------|
29
+ | `cli_timestamp` | Valid ISO8601 | REJECT |
30
+ | `response_text` | ≥ 200 characters | REJECT |
31
+ | `input_tokens` | > 0 | REJECT |
32
+ | `output_tokens` | > 0 | REJECT |
33
+
34
+ ### Judge Validation
35
+
36
+ | Field | Rule | Action on Fail |
37
+ |-------|------|----------------|
38
+ | `cli_timestamp` | Valid ISO8601 | REJECT |
39
+ | `response_text` | Contains "WEIGHTED_TOTAL" or "RATING:" | REJECT |
40
+ | `response_text` | ≥ 100 characters | REJECT |
41
+
42
+ ### Score Validation
43
+
44
+ | Field | Rule | Action on Fail |
45
+ |-------|------|----------------|
46
+ | `total` | Number 1-100 | REJECT |
47
+ | Extracted from judge | Matches claimed score | REJECT |
48
+
49
+ ### Timestamp Sanity
50
+
51
+ ```
52
+ elapsed = last_timestamp - first_timestamp
53
+ minimum = 30 × number_of_agents
54
+
55
+ if elapsed < minimum:
56
+ WARN: "Timestamps suspiciously close"
57
+ ```
58
+
59
+ ## On Invoke
60
+
61
+ ### Step 1: Parse Input
62
+
63
+ Extract:
64
+ - `type`: solo, duel, or relay
65
+ - `data`: JSON with run data
66
+
67
+ **Required data structure:**
68
+
69
+ ```json
70
+ {
71
+ "type": "solo|duel|relay",
72
+ "timestamp": "ISO8601",
73
+ "scenario": {"name": "...", "title": "..."},
74
+ "agents": [
75
+ {
76
+ "spec": "theme:agent",
77
+ "cli_timestamp": "ISO8601",
78
+ "response_text": "full response",
79
+ "input_tokens": 1234,
80
+ "output_tokens": 5678
81
+ }
82
+ ],
83
+ "judge": {
84
+ "cli_timestamp": "ISO8601",
85
+ "response_text": "full verdict",
86
+ "input_tokens": 2345,
87
+ "output_tokens": 890
88
+ },
89
+ "scores": {"spec": score},
90
+ "output_path": "results/..."
91
+ }
92
+ ```
93
+
94
+ ### Step 2: Validate Agents
95
+
96
+ For each agent:
97
+
98
+ ```bash
99
+ # Check timestamp format
100
+ if ! [[ "$cli_timestamp" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}T ]]; then
101
+ REJECT "Invalid timestamp: $cli_timestamp"
102
+ fi
103
+
104
+ # Check response length
105
+ response_len=${#response_text}
106
+ if [[ $response_len -lt 200 ]]; then
107
+ REJECT "Response too short: $response_len chars (min 200)"
108
+ fi
109
+
110
+ # Check tokens
111
+ if [[ $input_tokens -le 0 ]] || [[ $output_tokens -le 0 ]]; then
112
+ REJECT "Invalid tokens: in=$input_tokens out=$output_tokens"
113
+ fi
114
+ ```
115
+
116
+ ### Step 3: Validate Judge
117
+
118
+ ```bash
119
+ # Check for score marker
120
+ if ! echo "$judge_response" | grep -qE "WEIGHTED_TOTAL|RATING:"; then
121
+ REJECT "Judge response missing score marker"
122
+ fi
123
+
124
+ # Check response length
125
+ if [[ ${#judge_response} -lt 100 ]]; then
126
+ REJECT "Judge response too short"
127
+ fi
128
+
129
+ # Check tokens
130
+ if [[ $judge_input_tokens -le 0 ]] || [[ $judge_output_tokens -le 0 ]]; then
131
+ REJECT "Invalid judge tokens"
132
+ fi
133
+ ```
134
+
135
+ ### Step 4: Validate Scores
136
+
137
+ ```bash
138
+ # Extract score from judge
139
+ extracted=$(echo "$judge_response" | grep -oE "WEIGHTED_TOTAL[^0-9]*([0-9]+)" | grep -oE "[0-9]+" | tail -1)
140
+
141
+ # Verify against claimed score
142
+ if [[ "$extracted" != "$claimed_score" ]]; then
143
+ REJECT "Score mismatch: claimed=$claimed_score extracted=$extracted"
144
+ fi
145
+
146
+ # Check range
147
+ if [[ $extracted -lt 1 ]] || [[ $extracted -gt 100 ]]; then
148
+ REJECT "Score out of range: $extracted"
149
+ fi
150
+ ```
151
+
152
+ ### Step 5: Timestamp Sanity Check
153
+
154
+ ```bash
155
+ # Calculate elapsed time
156
+ first_ts=$(date -d "$first_agent_timestamp" +%s)
157
+ last_ts=$(date -d "$judge_timestamp" +%s)
158
+ elapsed=$((last_ts - first_ts))
159
+
160
+ # Check minimum expected time
161
+ num_agents=${#agents[@]}
162
+ minimum=$((30 * num_agents))
163
+
164
+ if [[ $elapsed -lt $minimum ]]; then
165
+ WARN "Elapsed time ${elapsed}s < expected ${minimum}s"
166
+ fi
167
+ ```
168
+
169
+ ### Step 6: Display Validation Report
170
+
171
+ ```markdown
172
+ ### Finalize Run Validation
173
+
174
+ **Type:** {type}
175
+ **Scenario:** {scenario.name}
176
+
177
+ #### Agent Validation
178
+ | Agent | Timestamp | Response | Tokens | Status |
179
+ |-------|-----------|----------|--------|--------|
180
+ | {spec} | {ts} | {len} chars | in={in} out={out} | ✓ |
181
+
182
+ #### Judge Validation
183
+ | Field | Value | Status |
184
+ |-------|-------|--------|
185
+ | Timestamp | {ts} | ✓ |
186
+ | Response | {len} chars | ✓ |
187
+ | Score | {score}/100 | ✓ |
188
+
189
+ #### Timestamp Sanity
190
+ - Elapsed: {elapsed}s
191
+ - Expected: ≥{minimum}s
192
+ - Status: ✓ PASS
193
+
194
+ ---
195
+ **VALIDATION: PASSED**
196
+ ```
197
+
198
+ ### Step 7: Save Results
199
+
200
+ If ALL validations pass:
201
+
202
+ ```bash
203
+ # Ensure directory exists
204
+ mkdir -p "$(dirname "$output_path")"
205
+
206
+ # Write result
207
+ echo "$result_json" > "$output_path"
208
+ ```
209
+
210
+ Display:
211
+ ```
212
+ ✓ Saved to {output_path}
213
+ ```
214
+
215
+ ### Step 8: Return Success
216
+
217
+ ```json
218
+ {
219
+ "success": true,
220
+ "path": "{output_path}",
221
+ "validation": {
222
+ "agents_validated": {count},
223
+ "judge_validated": true,
224
+ "scores_verified": true,
225
+ "timestamp_sane": true
226
+ }
227
+ }
228
+ ```
229
+
230
+ ## On Validation Failure
231
+
232
+ ```markdown
233
+ ### ❌ VALIDATION FAILED
234
+
235
+ **Failed Check:** {which validation}
236
+ **Reason:** {specific reason}
237
+ **Value:** {what was provided}
238
+
239
+ **This run will NOT be saved.**
240
+
241
+ To fix:
242
+ - {remediation steps}
243
+ ```
244
+
245
+ Return:
246
+ ```json
247
+ {
248
+ "success": false,
249
+ "error": "{reason}",
250
+ "failed_check": "{which}"
251
+ }
252
+ ```
253
+
254
+ ## The Golden Rule
255
+
256
+ **Real data or no data.**
257
+
258
+ Never estimate. Never fabricate. If validation fails, the run did not happen.