@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,524 @@
1
+ ---
2
+ name: judge
3
+ description: Evaluate agent responses using standardized rubrics. Invoke with mode and response data.
4
+ ---
5
+
6
+ # Judge Skill
7
+
8
+ Canonical evaluation of agent responses. All judging goes through this skill.
9
+
10
+ ## Invocation
11
+
12
+ ```
13
+ /judge --mode <mode> --data <json>
14
+ ```
15
+
16
+ **Modes:**
17
+ - `solo` - Single response, absolute rubric (or checklist if baseline_issues provided)
18
+ - `compare` - Two responses, comparative rubric
19
+ - `phase-sm` - Relay SM phase rubric
20
+ - `phase-tea` - Relay TEA phase rubric
21
+ - `phase-dev` - Relay Dev phase rubric
22
+ - `phase-reviewer` - Relay Reviewer phase rubric
23
+ - `coherence` - Relay chain coherence rating
24
+
25
+ ## Unified Rubric (solo/compare)
26
+
27
+ | Dimension | Weight | Criteria |
28
+ |-----------|--------|----------|
29
+ | **Correctness** | 25% | Technical accuracy. Right issues? Valid solutions? |
30
+ | **Depth** | 25% | Thoroughness. Root causes? Implications? |
31
+ | **Quality** | 25% | Clarity and actionability. Organized? Useful? |
32
+ | **Persona** | 25% | Character embodiment. Consistent? Added value? |
33
+
34
+ **Formula:** `(correctness × 2.5) + (depth × 2.5) + (quality × 2.5) + (persona × 2.5) = WEIGHTED_TOTAL`
35
+
36
+ ## Relay Phase Rubrics
37
+
38
+ ### SM Phase
39
+ | Dimension | Weight |
40
+ |-----------|--------|
41
+ | Clarity | 30% |
42
+ | Handoff | 40% |
43
+ | Completeness | 30% |
44
+
45
+ ### TEA Phase
46
+ | Dimension | Weight |
47
+ |-----------|--------|
48
+ | Coverage | 35% |
49
+ | RED State | 35% |
50
+ | Handoff | 30% |
51
+
52
+ ### Dev Phase
53
+ | Dimension | Weight |
54
+ |-----------|--------|
55
+ | GREEN State | 40% |
56
+ | Code Quality | 30% |
57
+ | Handoff | 30% |
58
+
59
+ ### Reviewer Phase
60
+ | Dimension | Weight |
61
+ |-----------|--------|
62
+ | Detection | 40% |
63
+ | Verdict | 30% |
64
+ | Persona | 30% |
65
+
66
+ ### Chain Coherence
67
+ | Rating | Multiplier |
68
+ |--------|------------|
69
+ | excellent | 1.2x |
70
+ | good | 1.0x |
71
+ | poor | 0.8x |
72
+
73
+ ## On Invoke
74
+
75
+ ### Step 1: Parse Arguments
76
+
77
+ Extract:
78
+ - `mode`: One of the modes listed above
79
+ - `data`: JSON object with required fields for that mode
80
+
81
+ **Data requirements by mode:**
82
+
83
+ | Mode | Required Fields | Optional Fields |
84
+ |------|-----------------|-----------------|
85
+ | solo | `spec`, `character`, `challenge`, `response` | `code`, `baseline_issues`, `baseline_criteria`, `bonus_issues`, `bonus_criteria` |
86
+ | compare | `contestants[]` (each with spec, character, response), `challenge` | `baseline_issues`, `baseline_criteria` |
87
+ | phase-* | `team1`, `team2` (each with theme, response), `context` | |
88
+ | coherence | `theme`, `sm_response`, `tea_response`, `dev_response`, `reviewer_response` | |
89
+
90
+ **Note:** When checklist data is provided, solo mode uses checklist-based evaluation:
91
+ - `baseline_issues` → code-review, tea, dev scenarios (things to FIND)
92
+ - `baseline_criteria` → SM scenarios (behaviors to DEMONSTRATE)
93
+ - `bonus_issues` / `bonus_criteria` → Extra credit items (optional)
94
+
95
+ ### Step 2: Build Judge Prompt
96
+
97
+ Based on mode, construct the appropriate prompt:
98
+
99
+ #### Solo Mode Prompt
100
+
101
+ **If NO baseline_issues provided, use generic rubric:**
102
+
103
+ ```
104
+ You are an impartial judge evaluating an AI agent's response.
105
+
106
+ ## Contestant
107
+ - **{spec}** ({character})
108
+
109
+ ## Challenge
110
+ {challenge}
111
+
112
+ ## Response
113
+ {response}
114
+
115
+ ## Evaluation
116
+
117
+ Score 1-10 on each dimension:
118
+
119
+ 1. **Correctness (25%)** - Technical accuracy
120
+ 2. **Depth (25%)** - Thoroughness
121
+ 3. **Quality (25%)** - Clarity and actionability
122
+ 4. **Persona (25%)** - Character embodiment
123
+
124
+ Formula: (correctness × 2.5) + (depth × 2.5) + (quality × 2.5) + (persona × 2.5) = WEIGHTED_TOTAL
125
+
126
+ **IMPORTANT: Output your evaluation as JSON only. No markdown, no extra text.**
127
+
128
+ ```json
129
+ {
130
+ "scores": {
131
+ "correctness": { "value": 8, "reasoning": "..." },
132
+ "depth": { "value": 7, "reasoning": "..." },
133
+ "quality": { "value": 9, "reasoning": "..." },
134
+ "persona": { "value": 8, "reasoning": "..." }
135
+ },
136
+ "weighted_total": 80.0,
137
+ "assessment": "2-3 sentence overall assessment"
138
+ }
139
+ ```
140
+ ```
141
+
142
+ **If baseline_issues IS provided, use checklist rubric (v2 - precision/recall):**
143
+
144
+ ```
145
+ You are an impartial judge evaluating an AI agent's response against a checklist of expected findings.
146
+
147
+ ## Contestant
148
+ - **{spec}** ({character})
149
+
150
+ ## Challenge
151
+ {challenge}
152
+
153
+ {if code provided}
154
+ ## Code Under Review
155
+ {code}
156
+ {endif}
157
+
158
+ ## Expected Findings
159
+
160
+ Below are the known issues/requirements. Severity indicates weight:
161
+ - CRITICAL: weight 15 (must find)
162
+ - HIGH: weight 10 (should find)
163
+ - MEDIUM: weight 5 (good to find)
164
+ - LOW: weight 2 (bonus)
165
+ - (unlabeled categories like happy_path, validation: weight 5 each)
166
+
167
+ {baseline_issues formatted as checklist}
168
+
169
+ ## Response to Evaluate
170
+ {response}
171
+
172
+ ## Evaluation Instructions
173
+
174
+ Evaluate the response and output ONLY valid JSON (no markdown, no extra text):
175
+
176
+ ```json
177
+ {
178
+ "baseline_findings": [
179
+ {"id": "ISSUE_ID", "severity": "critical|high|medium|low", "found": true, "evidence": "quote or null"}
180
+ ],
181
+ "novel_findings": [
182
+ {"description": "...", "valid": true, "reasoning": "..."}
183
+ ],
184
+ "false_positives": [
185
+ {"claim": "...", "why_invalid": "..."}
186
+ ],
187
+ "detection": {
188
+ "by_severity": {
189
+ "critical": {"found": 5, "total": 6},
190
+ "high": {"found": 4, "total": 6},
191
+ "medium": {"found": 3, "total": 8},
192
+ "low": {"found": 1, "total": 2}
193
+ },
194
+ "novel_valid": 2,
195
+ "false_positive_count": 1,
196
+ "metrics": {
197
+ "weighted_found": 98,
198
+ "weighted_total": 120,
199
+ "recall": 0.817,
200
+ "precision": 0.929,
201
+ "f2_score": 0.843
202
+ },
203
+ "components": {
204
+ "recall_score": 24.5,
205
+ "precision_score": 9.3,
206
+ "novel_bonus": 6.0
207
+ },
208
+ "subtotal": 39.8
209
+ },
210
+ "quality": {
211
+ "clear_explanations": 8,
212
+ "actionable_fixes": 7,
213
+ "subtotal": 18.75
214
+ },
215
+ "persona": {
216
+ "in_character": 9,
217
+ "professional_tone": 8,
218
+ "subtotal": 21.25
219
+ },
220
+ "weighted_total": 79.8,
221
+ "assessment": "2-3 sentence summary of strengths and gaps"
222
+ }
223
+ ```
224
+
225
+ ## Detection Scoring Rules (v2 - Precision/Recall)
226
+
227
+ **Severity Weights:**
228
+ - critical: 15, high: 10, medium: 5, low: 2
229
+
230
+ **Metric Calculations:**
231
+ ```
232
+ weighted_found = Σ(found_issues × severity_weight)
233
+ weighted_total = Σ(all_baseline_issues × severity_weight)
234
+
235
+ recall = weighted_found / weighted_total
236
+ precision = true_positives / (true_positives + false_positives)
237
+ f2_score = 5 × (precision × recall) / (4 × precision + recall)
238
+ ```
239
+
240
+ **Component Scores (Detection = 50 max):**
241
+ ```
242
+ recall_score = recall × 30 # max 30 pts - coverage matters most
243
+ precision_score = precision × 10 # max 10 pts - penalizes hallucinations
244
+ novel_bonus = min(novel_valid × 3, 10) # max 10 pts - rewards thoroughness
245
+
246
+ detection.subtotal = recall_score + precision_score + novel_bonus
247
+ ```
248
+
249
+ **Why this design:**
250
+ - **Recall weighted 3x precision**: Missing a critical vulnerability is worse than a false positive
251
+ - **Severity-weighted recall**: Finding 5 critical issues > finding 5 low issues
252
+ - **Separate novel bonus**: Rewards thoroughness beyond baseline without affecting precision
253
+ - **Visible metrics**: recall, precision, f2_score all reported for transparency
254
+
255
+ **Example Calculations:**
256
+ ```
257
+ Scenario: 6 critical (90 pts), 6 high (60 pts), 8 medium (40 pts), 2 low (4 pts) = 194 weighted total
258
+ Agent finds: 5 critical, 4 high, 3 medium, 1 low = 75+40+15+2 = 132 weighted found
259
+ Agent flags: 14 true positives, 1 false positive, 2 valid novel findings
260
+
261
+ recall = 132/194 = 0.680
262
+ precision = 14/15 = 0.933
263
+ f2_score = 5 × (0.933 × 0.680) / (4 × 0.933 + 0.680) = 0.718
264
+
265
+ recall_score = 0.680 × 30 = 20.4
266
+ precision_score = 0.933 × 10 = 9.3
267
+ novel_bonus = min(2 × 3, 10) = 6.0
268
+
269
+ detection.subtotal = 20.4 + 9.3 + 6.0 = 35.7
270
+ ```
271
+
272
+ **Other Dimensions:**
273
+ - Quality (25 max): (clear_explanations/10 × 12.5) + (actionable_fixes/10 × 12.5)
274
+ - Persona (25 max): (in_character/10 × 12.5) + (professional_tone/10 × 12.5)
275
+ - weighted_total = detection.subtotal + quality.subtotal + persona.subtotal
276
+ ```
277
+
278
+ **Checklist Scoring Notes:**
279
+ - **Recall dominates** (30/50 pts): Comprehensive coverage is primary goal
280
+ - **Precision matters** (10/50 pts): Penalizes hallucinated issues proportionally
281
+ - **Novel findings rewarded** (10/50 pts): Encourages going beyond baseline
282
+ - **Severity-weighted**: Critical issues count 7.5x more than low issues
283
+ - **Transparent metrics**: All intermediate values visible for debugging
284
+ - Quality/Persona still matter (25% each) - not just about finding issues
285
+
286
+ **If baseline_criteria IS provided (SM scenarios), use behavior checklist:**
287
+
288
+ ```
289
+ You are an impartial judge evaluating an AI agent's facilitation/management response.
290
+
291
+ ## Contestant
292
+ - **{spec}** ({character})
293
+
294
+ ## Challenge
295
+ {challenge}
296
+
297
+ ## Expected Behaviors
298
+
299
+ Below are the behaviors a good response should demonstrate:
300
+
301
+ **BASELINE CRITERIA (5 pts each):**
302
+ {baseline_criteria formatted by category}
303
+
304
+ **BONUS CRITERIA (3 pts each, if present):**
305
+ {bonus_criteria formatted, or "None specified"}
306
+
307
+ ## Response to Evaluate
308
+ {response}
309
+
310
+ ## Evaluation Instructions
311
+
312
+ Evaluate the response and output ONLY valid JSON (no markdown, no extra text):
313
+
314
+ ```json
315
+ {
316
+ "baseline_behaviors": [
317
+ {"id": "BEHAVIOR_ID", "category": "...", "demonstrated": true, "evidence": "quote or null"}
318
+ ],
319
+ "bonus_behaviors": [
320
+ {"id": "BONUS_ID", "category": "...", "demonstrated": true, "evidence": "quote or null"}
321
+ ],
322
+ "execution": {
323
+ "baseline_count": 8,
324
+ "bonus_count": 2,
325
+ "subtotal": 46
326
+ },
327
+ "quality": {
328
+ "clear_actionable": 8,
329
+ "well_structured": 7,
330
+ "subtotal": 18.75
331
+ },
332
+ "persona": {
333
+ "in_character": 9,
334
+ "enhances_delivery": 8,
335
+ "subtotal": 21.25
336
+ },
337
+ "weighted_total": 86.0,
338
+ "assessment": "2-3 sentence summary of facilitation effectiveness"
339
+ }
340
+ ```
341
+
342
+ Scoring rules:
343
+ - Execution (50 max): baseline×5 (cap 40) + bonus×3 (cap 10)
344
+ - Quality (25 max): (clear_actionable/10 × 12.5) + (well_structured/10 × 12.5)
345
+ - Persona (25 max): (in_character/10 × 12.5) + (enhances_delivery/10 × 12.5)
346
+ - weighted_total = execution.subtotal + quality.subtotal + persona.subtotal
347
+ ```
348
+
349
+ #### Compare Mode Prompt
350
+
351
+ ```
352
+ You are an impartial judge comparing two AI personas.
353
+
354
+ ## Contestants
355
+ - **{spec1}** ({character1})
356
+ - **{spec2}** ({character2})
357
+
358
+ ## Challenge
359
+ {challenge}
360
+
361
+ ## Response from {character1}
362
+ {response1}
363
+
364
+ ## Response from {character2}
365
+ {response2}
366
+
367
+ ## Evaluation
368
+
369
+ Score both on each dimension (1-10). Output ONLY valid JSON (no markdown, no extra text):
370
+
371
+ ```json
372
+ {
373
+ "contestants": {
374
+ "{spec1}": {
375
+ "scores": {
376
+ "correctness": { "value": 8, "reasoning": "..." },
377
+ "depth": { "value": 7, "reasoning": "..." },
378
+ "quality": { "value": 9, "reasoning": "..." },
379
+ "persona": { "value": 8, "reasoning": "..." }
380
+ },
381
+ "weighted_total": 80.0
382
+ },
383
+ "{spec2}": {
384
+ "scores": {
385
+ "correctness": { "value": 7, "reasoning": "..." },
386
+ "depth": { "value": 8, "reasoning": "..." },
387
+ "quality": { "value": 7, "reasoning": "..." },
388
+ "persona": { "value": 9, "reasoning": "..." }
389
+ },
390
+ "weighted_total": 77.5
391
+ }
392
+ },
393
+ "winner": "{spec1}",
394
+ "justification": "Brief explanation of why winner was chosen"
395
+ }
396
+ ```
397
+ ```
398
+
399
+ #### Phase Mode Prompts
400
+
401
+ Use phase-specific rubrics from tables above. Evaluate both teams. Output JSON format.
402
+
403
+ #### Coherence Mode Prompt
404
+
405
+ ```
406
+ Evaluate chain coherence for {theme}.
407
+
408
+ ## Chain
409
+ SM: {sm_response}
410
+ TEA: {tea_response}
411
+ Dev: {dev_response}
412
+ Reviewer: {reviewer_response}
413
+
414
+ Output ONLY valid JSON (no markdown, no extra text):
415
+
416
+ ```json
417
+ {
418
+ "rating": "excellent|good|poor",
419
+ "reasoning": "explanation of coherence assessment"
420
+ }
421
+ ```
422
+ ```
423
+
424
+ ### Step 3: Execute Judge via CLI
425
+
426
+ **CRITICAL: Follow this execution pattern for all contexts (main session, skills, subagents).**
427
+
428
+ **Three rules to avoid shell parsing errors:**
429
+
430
+ 1. **Use Write tool for prompt files** - NOT `echo` in Bash (handles special characters)
431
+ 2. **Use file redirection for output** - NOT variable capture `$(...)` (avoids zsh parse errors)
432
+ 3. **Use pipe syntax** - NOT heredocs (works in subagents)
433
+
434
+ **Why variable capture fails:**
435
+ ```bash
436
+ # This FAILS - zsh tries to parse JSON with () characters
437
+ OUTPUT=$(cat prompt.txt | claude -p --output-format json --tools "")
438
+ # Error: parse error near ')'
439
+ ```
440
+
441
+ **Correct pattern:**
442
+
443
+ ```bash
444
+ # Step 1: Use Write tool to create prompt file (NOT echo in Bash)
445
+ # The Write tool handles escaping properly in all contexts
446
+
447
+ # Step 2: Capture timestamp (simple command, safe to capture)
448
+ date -u +%Y-%m-%dT%H:%M:%SZ > .scratch/judge_ts.txt
449
+
450
+ # Step 3: Execute with FILE REDIRECTION (NOT variable capture)
451
+ cat .scratch/judge_prompt.txt | claude -p --output-format json --tools "" > .scratch/judge_output.json
452
+
453
+ # Step 4: Extract from files (reading files is always safe)
454
+ JUDGE_RESPONSE=$(jq -r '.result' .scratch/judge_output.json)
455
+ JUDGE_INPUT_TOKENS=$(jq -r '.usage.input_tokens // 0' .scratch/judge_output.json)
456
+ JUDGE_OUTPUT_TOKENS=$(jq -r '.usage.output_tokens // 0' .scratch/judge_output.json)
457
+ ```
458
+
459
+ **Key insight:** The shell never parses the JSON when using file redirection.
460
+ The output goes directly to a file, then jq reads it safely.
461
+
462
+ ### Step 4: Extract Scores
463
+
464
+ ```bash
465
+ # All modes now output JSON - parse with jq
466
+ # Solo mode
467
+ SCORE=$(echo "$JUDGE_RESPONSE" | jq -r '.weighted_total // empty')
468
+
469
+ # Compare mode
470
+ SCORE1=$(echo "$JUDGE_RESPONSE" | jq -r '.contestants["{spec1}"].weighted_total // empty')
471
+ SCORE2=$(echo "$JUDGE_RESPONSE" | jq -r '.contestants["{spec2}"].weighted_total // empty')
472
+ WINNER=$(echo "$JUDGE_RESPONSE" | jq -r '.winner // empty')
473
+
474
+ # Coherence mode
475
+ RATING=$(echo "$JUDGE_RESPONSE" | jq -r '.rating // empty')
476
+
477
+ # Fallback: try grep if JSON parsing fails (backwards compatibility)
478
+ if [[ -z "$SCORE" ]]; then
479
+ SCORE=$(echo "$JUDGE_RESPONSE" | grep -oE "weighted_total[\"':]*\s*([0-9.]+)" | grep -oE "[0-9.]+" | tail -1)
480
+ fi
481
+ ```
482
+
483
+ ### Step 5: Validate Results
484
+
485
+ | Check | Requirement |
486
+ |-------|-------------|
487
+ | `JUDGE_TIMESTAMP` | Valid ISO8601 |
488
+ | `JUDGE_RESPONSE` | At least 200 chars |
489
+ | `SCORE` (if applicable) | Number 1-100 |
490
+ | `RATING` (if coherence) | One of: excellent, good, poor |
491
+ | `JUDGE_INPUT_TOKENS` | > 0 |
492
+ | `JUDGE_OUTPUT_TOKENS` | > 0 |
493
+
494
+ **If validation fails:** Return error, do NOT estimate.
495
+
496
+ ### Step 6: Return Results
497
+
498
+ Output structured result for caller:
499
+
500
+ ```json
501
+ {
502
+ "success": true,
503
+ "mode": "{mode}",
504
+ "timestamp": "{JUDGE_TIMESTAMP}",
505
+ "scores": {
506
+ "{spec1}": {score1},
507
+ "{spec2}": {score2}
508
+ },
509
+ "winner": "{winner_spec}",
510
+ "token_usage": {
511
+ "input": {JUDGE_INPUT_TOKENS},
512
+ "output": {JUDGE_OUTPUT_TOKENS}
513
+ },
514
+ "response_text": "{JUDGE_RESPONSE}"
515
+ }
516
+ ```
517
+
518
+ ## Error Handling
519
+
520
+ ```
521
+ ❌ Judge validation failed: {reason}
522
+ ❌ Mode: {mode}
523
+ ❌ DO NOT estimate scores
524
+ ```
@@ -0,0 +1,160 @@
1
+ ---
2
+ name: just-runner
3
+ description: Run just recipes for project tasks. This skill should be used when starting dev servers, running tests, managing databases, checking project health, or writing new justfile recipes.
4
+ ---
5
+
6
+ # Just Command Runner Skill
7
+
8
+ ## When to Use This Skill
9
+
10
+ - Starting/stopping development servers
11
+ - Running tests
12
+ - Managing databases (start, stop, reset, seed)
13
+ - Checking service health/status
14
+ - Writing new justfile recipes
15
+
16
+ ## Overview
17
+
18
+ `just` is a command runner (like `make` but simpler). Commands run from the **project root** unless otherwise specified.
19
+
20
+ **Installation:** `brew install just` or `cargo install just`
21
+
22
+ ## Getting Help
23
+
24
+ ```bash
25
+ just help # Show categorized commands with descriptions
26
+ just --list # List all recipes without descriptions
27
+ just --show <recipe> # Show recipe definition
28
+ ```
29
+
30
+ ## Common Recipe Patterns
31
+
32
+ ### Development
33
+ ```bash
34
+ just dev # Start development environment
35
+ just dev-start # Start all services
36
+ just dev-stop # Stop all services
37
+ just dev-status # Check service status
38
+ just dev-logs # Tail logs
39
+ ```
40
+
41
+ ### Testing
42
+ ```bash
43
+ just test # Run all tests
44
+ just test-setup # Setup test infrastructure
45
+ just test-api # Backend tests only
46
+ just test-ui # Frontend tests only
47
+ ```
48
+
49
+ ### Database
50
+ ```bash
51
+ just db-start # Start database services
52
+ just db-stop # Stop database services
53
+ just db-reset # Reset databases (DESTRUCTIVE)
54
+ just db-seed # Seed with test data
55
+ ```
56
+
57
+ ## Passing Arguments
58
+
59
+ Just recipes accept arguments directly (NO `--` separator needed):
60
+
61
+ ```bash
62
+ # Correct
63
+ just test-api -run TestName ./...
64
+ just build --release
65
+
66
+ # WRONG - don't use --
67
+ just test-api -- -run TestName
68
+ ```
69
+
70
+ ## Writing Custom Recipes
71
+
72
+ ### Basic Recipe
73
+
74
+ ```just
75
+ # Recipe with description (shows in `just --list`)
76
+ hello:
77
+ echo "Hello, world!"
78
+
79
+ # Private recipe (doesn't show in list)
80
+ [private]
81
+ _helper:
82
+ echo "I'm hidden"
83
+ ```
84
+
85
+ ### Recipe with Arguments
86
+
87
+ ```just
88
+ # Positional arguments
89
+ greet name:
90
+ echo "Hello, {{name}}!"
91
+
92
+ # With defaults
93
+ greet name="World":
94
+ echo "Hello, {{name}}!"
95
+
96
+ # Variadic arguments
97
+ test *args:
98
+ go test {{args}}
99
+ ```
100
+
101
+ ### Multi-line Scripts
102
+
103
+ ```just
104
+ # Use shebang for complex scripts
105
+ build:
106
+ #!/usr/bin/env bash
107
+ set -euo pipefail
108
+ echo "Building..."
109
+ go build -o bin/app ./cmd/app
110
+ echo "Done!"
111
+ ```
112
+
113
+ ### Variables and Interpolation
114
+
115
+ ```just
116
+ # Set variables
117
+ project := "myapp"
118
+ version := `git describe --tags`
119
+
120
+ # Use in recipes
121
+ info:
122
+ echo "{{project}} version {{version}}"
123
+
124
+ # Environment variables
125
+ export DATABASE_URL := "postgres://localhost/dev"
126
+ ```
127
+
128
+ ### Dependencies
129
+
130
+ ```just
131
+ # Run `setup` before `build`
132
+ build: setup
133
+ go build ./...
134
+
135
+ # Multiple dependencies
136
+ deploy: build test
137
+ ./deploy.sh
138
+ ```
139
+
140
+ ### Conditionals
141
+
142
+ ```just
143
+ # Platform-specific
144
+ install:
145
+ {{ if os() == "macos" }} brew install foo {{ else }} apt install foo {{ endif }}
146
+ ```
147
+
148
+ ## Best Practices
149
+
150
+ 1. **Use `echo -e`** for colored output (not plain `echo`)
151
+ 2. **Use `#!/usr/bin/env bash`** shebang for multi-line scripts
152
+ 3. **Mark internal recipes as `[private]`**
153
+ 4. **Use `{{var}}`** for variable interpolation, not `$var`
154
+ 5. **Extract complex logic** to scripts in `scripts/` directory
155
+ 6. **Add descriptions** to all public recipes
156
+
157
+ ## Reference Documentation
158
+
159
+ - **Justfile Syntax:** See `references/justfile-syntax.md`
160
+ - **Official Docs:** https://just.systems/man/en/