@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,134 @@
1
+ /**
2
+ * Tests for Story 11-2: Add OCEAN Profiles to 10 Anchor Themes
3
+ *
4
+ * These tests verify:
5
+ * - 10 anchor theme YAMLs have ocean blocks
6
+ * - All 10 agents in each theme have OCEAN scores
7
+ * - Each OCEAN score uses the 1-5 integer scale
8
+ * - 100 character profiles defined (10 themes × 10 agents)
9
+ *
10
+ * Run with: npm test
11
+ */
12
+ import { describe, it } from 'node:test';
13
+ import assert from 'node:assert';
14
+ import { existsSync, readFileSync } from 'fs';
15
+ import { join, dirname } from 'path';
16
+ import { fileURLToPath } from 'url';
17
+ import { parse as parseYaml } from 'yaml';
18
+ import { findMonorepoRoot } from './utils/files.js';
19
+ const __filename = fileURLToPath(import.meta.url);
20
+ const __dirname = dirname(__filename);
21
+ // Find monorepo root by walking up from current directory
22
+ const projectRoot = findMonorepoRoot(__dirname);
23
+ const themesDir = join(projectRoot, 'pennyfarthing-dist', 'personas', 'themes');
24
+ // 10 anchor themes for Phase 1
25
+ const ANCHOR_THEMES = [
26
+ 'deadwood',
27
+ 'firefly',
28
+ 'breaking-bad',
29
+ 'the-good-place',
30
+ 'star-trek-tng',
31
+ 'discworld',
32
+ 'fargo',
33
+ 'succession',
34
+ 'mass-effect',
35
+ 'software-pioneers',
36
+ ];
37
+ // 10 agent roles
38
+ const AGENT_ROLES = [
39
+ 'orchestrator',
40
+ 'sm',
41
+ 'tea',
42
+ 'dev',
43
+ 'reviewer',
44
+ 'architect',
45
+ 'pm',
46
+ 'tech-writer',
47
+ 'ux-designer',
48
+ 'devops',
49
+ ];
50
+ // OCEAN dimensions
51
+ const OCEAN_KEYS = ['O', 'C', 'E', 'A', 'N'];
52
+ // Helper to load and parse theme YAML
53
+ function loadTheme(themeName) {
54
+ const filePath = join(themesDir, `${themeName}.yaml`);
55
+ if (!existsSync(filePath)) {
56
+ throw new Error(`Theme file not found: ${filePath}`);
57
+ }
58
+ const content = readFileSync(filePath, 'utf-8');
59
+ return parseYaml(content);
60
+ }
61
+ describe('OCEAN Profiles - Anchor Themes', () => {
62
+ it('should have all 10 anchor theme files', () => {
63
+ for (const theme of ANCHOR_THEMES) {
64
+ const filePath = join(themesDir, `${theme}.yaml`);
65
+ assert.ok(existsSync(filePath), `Missing anchor theme: ${theme}.yaml`);
66
+ }
67
+ });
68
+ });
69
+ describe('OCEAN Profiles - Structure Validation', () => {
70
+ for (const themeName of ANCHOR_THEMES) {
71
+ describe(`Theme: ${themeName}`, () => {
72
+ it('should have agents section', () => {
73
+ const theme = loadTheme(themeName);
74
+ assert.ok('agents' in theme && typeof theme.agents === 'object', `${themeName} should have agents section`);
75
+ });
76
+ it('should have all 10 agent roles', () => {
77
+ const theme = loadTheme(themeName);
78
+ const agents = theme.agents;
79
+ for (const role of AGENT_ROLES) {
80
+ assert.ok(role in agents, `${themeName} missing agent role: ${role}`);
81
+ }
82
+ });
83
+ for (const role of AGENT_ROLES) {
84
+ it(`agent ${role} should have ocean block`, () => {
85
+ const theme = loadTheme(themeName);
86
+ const agents = theme.agents;
87
+ const agent = agents[role];
88
+ assert.ok(agent && 'ocean' in agent, `${themeName}/${role} missing ocean block`);
89
+ });
90
+ it(`agent ${role} ocean block should have all 5 OCEAN keys`, () => {
91
+ const theme = loadTheme(themeName);
92
+ const agents = theme.agents;
93
+ const agent = agents[role];
94
+ const ocean = agent?.ocean;
95
+ assert.ok(ocean, `${themeName}/${role} missing ocean block`);
96
+ for (const key of OCEAN_KEYS) {
97
+ assert.ok(key in ocean, `${themeName}/${role}/ocean missing key: ${key}`);
98
+ }
99
+ });
100
+ it(`agent ${role} OCEAN values should be integers 1-5`, () => {
101
+ const theme = loadTheme(themeName);
102
+ const agents = theme.agents;
103
+ const agent = agents[role];
104
+ const ocean = agent?.ocean;
105
+ assert.ok(ocean, `${themeName}/${role} missing ocean block`);
106
+ for (const key of OCEAN_KEYS) {
107
+ const value = ocean[key];
108
+ assert.ok(typeof value === 'number' &&
109
+ Number.isInteger(value) &&
110
+ value >= 1 &&
111
+ value <= 5, `${themeName}/${role}/ocean/${key} should be integer 1-5, got: ${value}`);
112
+ }
113
+ });
114
+ }
115
+ });
116
+ }
117
+ });
118
+ describe('OCEAN Profiles - Completeness', () => {
119
+ it('should have exactly 100 character profiles (10 themes × 10 agents)', () => {
120
+ let profileCount = 0;
121
+ for (const themeName of ANCHOR_THEMES) {
122
+ const theme = loadTheme(themeName);
123
+ const agents = theme.agents;
124
+ for (const role of AGENT_ROLES) {
125
+ const agent = agents[role];
126
+ if (agent && 'ocean' in agent) {
127
+ profileCount++;
128
+ }
129
+ }
130
+ }
131
+ assert.strictEqual(profileCount, 100, `Expected 100 character profiles, found ${profileCount}`);
132
+ });
133
+ });
134
+ //# sourceMappingURL=ocean-profiles.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ocean-profiles.test.js","sourceRoot":"","sources":["../../src/cli/ocean-profiles.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Tests for /theme-maker command
3
+ *
4
+ * Story 6-1: Command skeleton - basic structure and validation
5
+ * Story 6-2: AI-Driven mode - universe input, agent generation, preview
6
+ * Story 6-3: Guided mode - character options per agent, user picks
7
+ *
8
+ * Run with: npm test
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=theme-maker.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-maker.test.d.ts","sourceRoot":"","sources":["../../src/cli/theme-maker.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,356 @@
1
+ /**
2
+ * Tests for /theme-maker command
3
+ *
4
+ * Story 6-1: Command skeleton - basic structure and validation
5
+ * Story 6-2: AI-Driven mode - universe input, agent generation, preview
6
+ * Story 6-3: Guided mode - character options per agent, user picks
7
+ *
8
+ * Run with: npm test
9
+ */
10
+ import { describe, it } from 'node:test';
11
+ import assert from 'node:assert';
12
+ import { existsSync, readFileSync } from 'fs';
13
+ import { join, dirname } from 'path';
14
+ import { fileURLToPath } from 'url';
15
+ import { validateThemeName, getProjectCustomThemesDir, validateThemeSchema } from './utils/themes.js';
16
+ import { findMonorepoRoot } from './utils/files.js';
17
+ const __filename = fileURLToPath(import.meta.url);
18
+ const __dirname = dirname(__filename);
19
+ // Find monorepo root by walking up from current directory
20
+ const projectRoot = findMonorepoRoot(__dirname);
21
+ const distDir = join(projectRoot, 'pennyfarthing-dist');
22
+ describe('/theme-maker Command File', () => {
23
+ const commandPath = join(distDir, 'commands', 'theme-maker.md');
24
+ it('should have theme-maker.md command file', () => {
25
+ assert.ok(existsSync(commandPath), `Missing command file: ${commandPath}`);
26
+ });
27
+ it('should have YAML frontmatter with description', () => {
28
+ const content = readFileSync(commandPath, 'utf-8');
29
+ assert.ok(content.startsWith('---'), 'Command file should start with YAML frontmatter (---)');
30
+ assert.ok(content.includes('description:'), 'Frontmatter should have description field');
31
+ });
32
+ it('should reference mode selection options', () => {
33
+ const content = readFileSync(commandPath, 'utf-8');
34
+ assert.ok(content.toLowerCase().includes('ai-driven') ||
35
+ content.toLowerCase().includes('ai driven'), 'Should mention AI-Driven mode');
36
+ assert.ok(content.toLowerCase().includes('guided'), 'Should mention Guided mode');
37
+ assert.ok(content.toLowerCase().includes('manual'), 'Should mention Manual mode');
38
+ });
39
+ it('should mention AskUserQuestion for mode selection', () => {
40
+ const content = readFileSync(commandPath, 'utf-8');
41
+ assert.ok(content.includes('AskUserQuestion'), 'Should reference AskUserQuestion tool for user interaction');
42
+ });
43
+ it('should reference pennyfarthing_version field', () => {
44
+ const content = readFileSync(commandPath, 'utf-8');
45
+ assert.ok(content.includes('pennyfarthing_version'), 'Should mention pennyfarthing_version field for skeleton YAML');
46
+ });
47
+ it('should reference theme directory path', () => {
48
+ const content = readFileSync(commandPath, 'utf-8');
49
+ assert.ok(content.includes('.claude/pennyfarthing/themes') ||
50
+ content.includes('themes/'), 'Should mention theme directory for output');
51
+ });
52
+ });
53
+ describe('Theme Name Validation', () => {
54
+ describe('rejects invalid names', () => {
55
+ it('should reject empty name', () => {
56
+ const result = validateThemeName('');
57
+ assert.strictEqual(result.valid, false);
58
+ assert.ok(result.error?.includes('required'));
59
+ });
60
+ it('should reject names with spaces', () => {
61
+ const result = validateThemeName('my theme');
62
+ assert.strictEqual(result.valid, false);
63
+ assert.ok(result.error?.includes('space'));
64
+ });
65
+ it('should reject uppercase names', () => {
66
+ const result = validateThemeName('MyTheme');
67
+ assert.strictEqual(result.valid, false);
68
+ assert.ok(result.error?.includes('lowercase'));
69
+ });
70
+ it('should reject names starting with number', () => {
71
+ const result = validateThemeName('123theme');
72
+ assert.strictEqual(result.valid, false);
73
+ assert.ok(result.error?.includes('start with a letter'));
74
+ });
75
+ it('should reject names with special characters', () => {
76
+ const result = validateThemeName('my_theme');
77
+ assert.strictEqual(result.valid, false);
78
+ });
79
+ it('should reject names starting with hyphen', () => {
80
+ const result = validateThemeName('-my-theme');
81
+ assert.strictEqual(result.valid, false);
82
+ });
83
+ });
84
+ describe('accepts valid names', () => {
85
+ it('should accept simple lowercase name', () => {
86
+ const result = validateThemeName('mytheme');
87
+ assert.strictEqual(result.valid, true);
88
+ assert.strictEqual(result.error, undefined);
89
+ });
90
+ it('should accept hyphenated name', () => {
91
+ const result = validateThemeName('my-custom-theme');
92
+ assert.strictEqual(result.valid, true);
93
+ });
94
+ it('should accept name with numbers', () => {
95
+ const result = validateThemeName('theme2025');
96
+ assert.strictEqual(result.valid, true);
97
+ });
98
+ it('should accept single letter name', () => {
99
+ const result = validateThemeName('x');
100
+ assert.strictEqual(result.valid, true);
101
+ });
102
+ });
103
+ });
104
+ describe('Theme Directory Creation', () => {
105
+ const testProjectRoot = join(__dirname, '..', '..', '.test-project');
106
+ const expectedDir = join(testProjectRoot, '.claude', 'pennyfarthing', 'themes');
107
+ it('should return correct custom themes directory path', () => {
108
+ const themesDir = getProjectCustomThemesDir(testProjectRoot);
109
+ assert.strictEqual(themesDir, expectedDir, `Expected ${expectedDir}, got ${themesDir}`);
110
+ });
111
+ });
112
+ // ============================================================================
113
+ // Story 6-2: AI-Driven Mode Tests
114
+ // ============================================================================
115
+ describe('AI-Driven Mode - Command File (Story 6-2)', () => {
116
+ const commandPath = join(distDir, 'commands', 'theme-maker.md');
117
+ it('should have AI-Driven mode implementation section', () => {
118
+ const content = readFileSync(commandPath, 'utf-8');
119
+ // Look for a dedicated section header for AI-Driven mode
120
+ assert.ok(content.includes('## AI-Driven Mode') ||
121
+ content.includes('### AI-Driven Mode'), 'Should have dedicated AI-Driven Mode section');
122
+ });
123
+ it('should prompt for universe/concept description', () => {
124
+ const content = readFileSync(commandPath, 'utf-8');
125
+ assert.ok(content.toLowerCase().includes('universe') ||
126
+ content.toLowerCase().includes('concept'), 'Should mention universe/concept input');
127
+ assert.ok(content.toLowerCase().includes('describe') ||
128
+ content.toLowerCase().includes('free-text') ||
129
+ content.toLowerCase().includes('free text'), 'Should indicate free-text description input');
130
+ });
131
+ it('should reference all 10 agent types for generation', () => {
132
+ const content = readFileSync(commandPath, 'utf-8');
133
+ const requiredAgents = [
134
+ 'orchestrator',
135
+ 'sm',
136
+ 'tea',
137
+ 'dev',
138
+ 'reviewer',
139
+ 'architect',
140
+ 'pm',
141
+ 'tech-writer',
142
+ 'ux-designer',
143
+ 'devops'
144
+ ];
145
+ for (const agent of requiredAgents) {
146
+ assert.ok(content.toLowerCase().includes(agent), `Should reference ${agent} agent`);
147
+ }
148
+ });
149
+ it('should show preview before confirming', () => {
150
+ const content = readFileSync(commandPath, 'utf-8');
151
+ assert.ok(content.toLowerCase().includes('preview'), 'Should mention preview functionality');
152
+ });
153
+ it('should offer regenerate option', () => {
154
+ const content = readFileSync(commandPath, 'utf-8');
155
+ assert.ok(content.toLowerCase().includes('regenerate'), 'Should mention regenerate option');
156
+ });
157
+ it('should reference confirm/regenerate user choice', () => {
158
+ const content = readFileSync(commandPath, 'utf-8');
159
+ assert.ok(content.toLowerCase().includes('confirm'), 'Should mention confirm option');
160
+ });
161
+ });
162
+ describe('Theme Schema Validation (Story 6-2)', () => {
163
+ // All 10 required agent types
164
+ const REQUIRED_AGENTS = [
165
+ 'orchestrator',
166
+ 'sm',
167
+ 'tea',
168
+ 'dev',
169
+ 'reviewer',
170
+ 'architect',
171
+ 'pm',
172
+ 'tech-writer',
173
+ 'ux-designer',
174
+ 'devops'
175
+ ];
176
+ // Minimal valid theme for testing
177
+ const createValidTheme = () => ({
178
+ theme: {
179
+ name: 'Test Theme',
180
+ description: 'A test theme'
181
+ },
182
+ agents: Object.fromEntries(REQUIRED_AGENTS.map(agent => [
183
+ agent,
184
+ {
185
+ character: `Test ${agent}`,
186
+ style: `Style for ${agent}`,
187
+ role: `Role for ${agent}`,
188
+ quote: `Quote for ${agent}`
189
+ }
190
+ ]))
191
+ });
192
+ describe('validates complete themes', () => {
193
+ it('should accept a valid theme with all 10 agents', () => {
194
+ const theme = createValidTheme();
195
+ const result = validateThemeSchema(theme);
196
+ assert.strictEqual(result.valid, true);
197
+ assert.strictEqual(result.errors, undefined);
198
+ });
199
+ it('should accept theme with optional fields', () => {
200
+ const theme = createValidTheme();
201
+ theme.theme.source = 'Test source';
202
+ theme.theme.default_emoji_use = 'minimal';
203
+ theme.agents.sm.emoji = '☕';
204
+ theme.agents.sm.helper = { name: 'Helper', style: 'Helpful' };
205
+ const result = validateThemeSchema(theme);
206
+ assert.strictEqual(result.valid, true);
207
+ });
208
+ });
209
+ describe('rejects invalid themes', () => {
210
+ it('should reject theme missing theme.name', () => {
211
+ const theme = createValidTheme();
212
+ delete theme.theme.name;
213
+ const result = validateThemeSchema(theme);
214
+ assert.strictEqual(result.valid, false);
215
+ assert.ok(result.errors?.some(e => e.includes('name')));
216
+ });
217
+ it('should reject theme missing agents section', () => {
218
+ const theme = createValidTheme();
219
+ delete theme.agents;
220
+ const result = validateThemeSchema(theme);
221
+ assert.strictEqual(result.valid, false);
222
+ assert.ok(result.errors?.some(e => e.includes('agents')));
223
+ });
224
+ it('should reject theme missing required agent', () => {
225
+ const theme = createValidTheme();
226
+ delete theme.agents.tea;
227
+ const result = validateThemeSchema(theme);
228
+ assert.strictEqual(result.valid, false);
229
+ assert.ok(result.errors?.some(e => e.includes('tea')));
230
+ });
231
+ it('should reject agent missing character field', () => {
232
+ const theme = createValidTheme();
233
+ delete theme.agents.dev.character;
234
+ const result = validateThemeSchema(theme);
235
+ assert.strictEqual(result.valid, false);
236
+ assert.ok(result.errors?.some(e => e.includes('dev') && e.includes('character')));
237
+ });
238
+ it('should reject agent missing style field', () => {
239
+ const theme = createValidTheme();
240
+ delete theme.agents.reviewer.style;
241
+ const result = validateThemeSchema(theme);
242
+ assert.strictEqual(result.valid, false);
243
+ assert.ok(result.errors?.some(e => e.includes('reviewer') && e.includes('style')));
244
+ });
245
+ it('should list all missing agents in errors', () => {
246
+ const theme = createValidTheme();
247
+ delete theme.agents.sm;
248
+ delete theme.agents.tea;
249
+ delete theme.agents.dev;
250
+ const result = validateThemeSchema(theme);
251
+ assert.strictEqual(result.valid, false);
252
+ assert.ok(result.errors && result.errors.length >= 3, 'Should have at least 3 errors');
253
+ });
254
+ });
255
+ describe('validates agent field requirements', () => {
256
+ it('should require character and style for each agent', () => {
257
+ // These are the minimum required fields per agent
258
+ const theme = {
259
+ theme: { name: 'Minimal', description: 'Minimal theme' },
260
+ agents: Object.fromEntries(REQUIRED_AGENTS.map(agent => [
261
+ agent,
262
+ { character: 'Char', style: 'Style' }
263
+ ]))
264
+ };
265
+ const result = validateThemeSchema(theme);
266
+ assert.strictEqual(result.valid, true);
267
+ });
268
+ });
269
+ });
270
+ // ============================================================================
271
+ // Story 6-3: Guided Mode Tests
272
+ // ============================================================================
273
+ describe('Guided Mode - Command File (Story 6-3)', () => {
274
+ const commandPath = join(distDir, 'commands', 'theme-maker.md');
275
+ /**
276
+ * Helper to extract just the Guided Mode section from the command file.
277
+ * Returns empty string if section doesn't exist.
278
+ */
279
+ function getGuidedModeSection() {
280
+ const content = readFileSync(commandPath, 'utf-8');
281
+ // Split on ## Guided Mode header and take everything until next ## header
282
+ const match = content.match(/##\s*Guided Mode[\s\S]*?(?=\n##\s|$)/i);
283
+ return match ? match[0] : '';
284
+ }
285
+ it('should have Guided mode implementation section', () => {
286
+ const content = readFileSync(commandPath, 'utf-8');
287
+ // Look for a dedicated section header for Guided mode
288
+ assert.ok(content.includes('## Guided Mode') ||
289
+ content.includes('### Guided Mode'), 'Should have dedicated Guided Mode section');
290
+ });
291
+ it('should present 3-4 character options per agent in Guided section', () => {
292
+ const guidedSection = getGuidedModeSection();
293
+ assert.ok(guidedSection.length > 0, 'Guided Mode section must exist');
294
+ // Must mention presenting multiple options (3-4) for character selection
295
+ assert.ok(guidedSection.includes('3-4') ||
296
+ guidedSection.includes('3 to 4') ||
297
+ guidedSection.toLowerCase().includes('three to four') ||
298
+ (guidedSection.toLowerCase().includes('suggest') && guidedSection.toLowerCase().includes('option')), 'Guided Mode should mention presenting 3-4 character options');
299
+ });
300
+ it('should offer "Other" option for custom character names in Guided section', () => {
301
+ const guidedSection = getGuidedModeSection();
302
+ assert.ok(guidedSection.length > 0, 'Guided Mode section must exist');
303
+ // Must mention "Other" option for custom input within Guided section
304
+ assert.ok(guidedSection.includes('"Other"') ||
305
+ guidedSection.includes('Other option') ||
306
+ guidedSection.toLowerCase().includes('custom character'), 'Guided Mode should mention "Other" option for custom character names');
307
+ });
308
+ it('should generate style/trait/quote for selections in Guided section', () => {
309
+ const guidedSection = getGuidedModeSection();
310
+ assert.ok(guidedSection.length > 0, 'Guided Mode section must exist');
311
+ const lowerSection = guidedSection.toLowerCase();
312
+ // Must mention generating/filling style, trait, or quote for selected characters
313
+ assert.ok(lowerSection.includes('generate') ||
314
+ lowerSection.includes('fills in') ||
315
+ lowerSection.includes('fill in') ||
316
+ (lowerSection.includes('style') && lowerSection.includes('trait')), 'Guided Mode should mention generating style/trait/quote for selections');
317
+ });
318
+ it('should allow going back to change previous selections in Guided section', () => {
319
+ const guidedSection = getGuidedModeSection();
320
+ assert.ok(guidedSection.length > 0, 'Guided Mode section must exist');
321
+ const lowerSection = guidedSection.toLowerCase();
322
+ // Must mention ability to go back or change previous selections
323
+ assert.ok(lowerSection.includes('go back') ||
324
+ lowerSection.includes('previous') ||
325
+ lowerSection.includes('change selection') ||
326
+ lowerSection.includes('edit selection') ||
327
+ lowerSection.includes('redo'), 'Guided Mode should mention ability to go back and change previous selections');
328
+ });
329
+ it('should use AskUserQuestion for character selection in Guided section', () => {
330
+ const guidedSection = getGuidedModeSection();
331
+ assert.ok(guidedSection.length > 0, 'Guided Mode section must exist');
332
+ // Guided mode should use AskUserQuestion for user interaction
333
+ assert.ok(guidedSection.includes('AskUserQuestion'), 'Guided Mode should use AskUserQuestion tool for character selection');
334
+ });
335
+ it('should iterate through agents for character selection', () => {
336
+ const guidedSection = getGuidedModeSection();
337
+ assert.ok(guidedSection.length > 0, 'Guided Mode section must exist');
338
+ // Must reference iterating through each agent
339
+ assert.ok(guidedSection.toLowerCase().includes('each agent') ||
340
+ guidedSection.toLowerCase().includes('for each') ||
341
+ guidedSection.toLowerCase().includes('per agent'), 'Guided Mode should iterate through each agent for character selection');
342
+ });
343
+ it('should show preview step in Guided section', () => {
344
+ const guidedSection = getGuidedModeSection();
345
+ assert.ok(guidedSection.length > 0, 'Guided Mode section must exist');
346
+ // Must have preview step
347
+ assert.ok(guidedSection.toLowerCase().includes('preview'), 'Guided Mode should show preview before confirming theme');
348
+ });
349
+ it('should have confirm step in Guided section', () => {
350
+ const guidedSection = getGuidedModeSection();
351
+ assert.ok(guidedSection.length > 0, 'Guided Mode section must exist');
352
+ // Must have confirm step
353
+ assert.ok(guidedSection.toLowerCase().includes('confirm'), 'Guided Mode should have confirm step');
354
+ });
355
+ });
356
+ //# sourceMappingURL=theme-maker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-maker.test.js","sourceRoot":"","sources":["../../src/cli/theme-maker.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Shared constants for Pennyfarthing CLI
3
+ * Single source of truth for agent names, symlink definitions, and managed paths
4
+ */
5
+ /**
6
+ * Core agent types that have sidecars
7
+ */
8
+ export declare const CORE_AGENTS: readonly ["dev", "tea", "sm", "reviewer", "architect", "pm", "tech-writer", "ux-designer", "devops", "orchestrator"];
9
+ export type CoreAgent = typeof CORE_AGENTS[number];
10
+ /**
11
+ * Symlinks that point directly to node_modules directories
12
+ * These go in .pennyfarthing/ to minimize interference with user's .claude/
13
+ * (commands and skills stay in .claude/ - required for Claude Code discovery)
14
+ */
15
+ export declare const DIRECTORY_SYMLINKS: readonly [{
16
+ readonly name: "agents";
17
+ readonly link: ".pennyfarthing/agents";
18
+ }, {
19
+ readonly name: "guides";
20
+ readonly link: ".pennyfarthing/guides";
21
+ }, {
22
+ readonly name: "personas";
23
+ readonly link: ".pennyfarthing/personas";
24
+ }, {
25
+ readonly name: "scripts";
26
+ readonly link: ".pennyfarthing/scripts";
27
+ }];
28
+ /**
29
+ * All symlinks including commands and skills
30
+ * Used by doctor for comprehensive checks
31
+ */
32
+ export declare const ALL_SYMLINKS: readonly [{
33
+ readonly name: "agents";
34
+ readonly link: ".pennyfarthing/agents";
35
+ }, {
36
+ readonly name: "guides";
37
+ readonly link: ".pennyfarthing/guides";
38
+ }, {
39
+ readonly name: "personas";
40
+ readonly link: ".pennyfarthing/personas";
41
+ }, {
42
+ readonly name: "scripts";
43
+ readonly link: ".pennyfarthing/scripts";
44
+ }, {
45
+ readonly name: "commands";
46
+ readonly link: ".claude/commands";
47
+ }, {
48
+ readonly name: "skills";
49
+ readonly link: ".claude/skills";
50
+ }];
51
+ /**
52
+ * Paths managed by Pennyfarthing (used in manifest)
53
+ * Commands and skills in .claude/ (for discovery), rest in .pennyfarthing/
54
+ */
55
+ export declare const MANAGED_PATHS: readonly [".claude/commands", ".claude/skills", ".pennyfarthing/agents", ".pennyfarthing/guides", ".pennyfarthing/personas", ".pennyfarthing/scripts"];
56
+ export type SymlinkDefinition = {
57
+ readonly name: string;
58
+ readonly link: string;
59
+ };
60
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,sHAWd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAKrB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;EAIf,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,aAAa,wJAOhB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC"}