@pennyfarthing/core 10.4.0 → 11.0.0-alpha.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 (858) hide show
  1. package/package.json +16 -14
  2. package/packages/core/dist/benchmark/benchmark-integration.d.ts +182 -0
  3. package/packages/core/dist/benchmark/benchmark-integration.d.ts.map +1 -0
  4. package/packages/core/dist/benchmark/benchmark-integration.js +710 -0
  5. package/packages/core/dist/benchmark/benchmark-integration.js.map +1 -0
  6. package/packages/core/dist/benchmark/benchmark-integration.test.d.ts +6 -0
  7. package/packages/core/dist/benchmark/benchmark-integration.test.d.ts.map +1 -0
  8. package/packages/core/dist/benchmark/benchmark-integration.test.js +41 -0
  9. package/packages/core/dist/benchmark/benchmark-integration.test.js.map +1 -0
  10. package/packages/core/dist/benchmark/index.d.ts +3 -0
  11. package/packages/core/dist/benchmark/index.d.ts.map +1 -0
  12. package/packages/core/dist/benchmark/index.js +5 -0
  13. package/packages/core/dist/benchmark/index.js.map +1 -0
  14. package/packages/core/dist/benchmark/job-fair-aggregator.d.ts +150 -0
  15. package/packages/core/dist/benchmark/job-fair-aggregator.d.ts.map +1 -0
  16. package/packages/core/dist/benchmark/job-fair-aggregator.js +547 -0
  17. package/packages/core/dist/benchmark/job-fair-aggregator.js.map +1 -0
  18. package/packages/core/dist/benchmark/job-fair-aggregator.test.d.ts +6 -0
  19. package/packages/core/dist/benchmark/job-fair-aggregator.test.d.ts.map +1 -0
  20. package/packages/core/dist/benchmark/job-fair-aggregator.test.js +35 -0
  21. package/packages/core/dist/benchmark/job-fair-aggregator.test.js.map +1 -0
  22. package/packages/core/dist/benchmark/package-exports.test.d.ts.map +1 -0
  23. package/packages/core/dist/benchmark/package-exports.test.js.map +1 -0
  24. package/packages/core/dist/cli/commands/hook-chaining.test.d.ts +17 -0
  25. package/packages/core/dist/cli/commands/hook-chaining.test.d.ts.map +1 -0
  26. package/packages/core/dist/cli/commands/hook-chaining.test.js +386 -0
  27. package/packages/core/dist/cli/commands/hook-chaining.test.js.map +1 -0
  28. package/packages/core/dist/cli/commands/init.d.ts +6 -1
  29. package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
  30. package/packages/core/dist/cli/commands/init.js +83 -30
  31. package/packages/core/dist/cli/commands/init.js.map +1 -1
  32. package/packages/core/dist/cli/commands/uninstall.d.ts.map +1 -1
  33. package/packages/core/dist/cli/commands/uninstall.js +20 -3
  34. package/packages/core/dist/cli/commands/uninstall.js.map +1 -1
  35. package/packages/core/dist/cli/commands/uninstall.test.d.ts +8 -0
  36. package/packages/core/dist/cli/commands/uninstall.test.d.ts.map +1 -0
  37. package/packages/core/dist/cli/commands/uninstall.test.js +120 -0
  38. package/packages/core/dist/cli/commands/uninstall.test.js.map +1 -0
  39. package/packages/core/dist/cli/commands/update.js +4 -4
  40. package/packages/core/dist/cli/commands/update.js.map +1 -1
  41. package/packages/core/dist/cli/utils/008-sprint-shard-migration.test.d.ts +15 -0
  42. package/packages/core/dist/cli/utils/008-sprint-shard-migration.test.d.ts.map +1 -0
  43. package/packages/core/dist/cli/utils/008-sprint-shard-migration.test.js +295 -0
  44. package/packages/core/dist/cli/utils/008-sprint-shard-migration.test.js.map +1 -0
  45. package/packages/core/dist/cli/utils/settings-consolidation.test.js +26 -0
  46. package/packages/core/dist/cli/utils/settings-consolidation.test.js.map +1 -1
  47. package/packages/core/dist/cli/utils/settings-merge.d.ts +128 -0
  48. package/packages/core/dist/cli/utils/settings-merge.d.ts.map +1 -0
  49. package/packages/core/dist/cli/utils/settings-merge.js +303 -0
  50. package/packages/core/dist/cli/utils/settings-merge.js.map +1 -0
  51. package/packages/core/dist/cli/utils/settings-merge.test.d.ts +15 -0
  52. package/packages/core/dist/cli/utils/settings-merge.test.d.ts.map +1 -0
  53. package/packages/core/dist/cli/utils/settings-merge.test.js +781 -0
  54. package/packages/core/dist/cli/utils/settings-merge.test.js.map +1 -0
  55. package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
  56. package/packages/core/dist/cli/utils/settings.js +3 -0
  57. package/packages/core/dist/cli/utils/settings.js.map +1 -1
  58. package/packages/core/dist/cli/utils/symlinks.d.ts +6 -16
  59. package/packages/core/dist/cli/utils/symlinks.d.ts.map +1 -1
  60. package/packages/core/dist/cli/utils/symlinks.js +100 -171
  61. package/packages/core/dist/cli/utils/symlinks.js.map +1 -1
  62. package/packages/core/dist/cli/utils/symlinks.test.d.ts +10 -0
  63. package/packages/core/dist/cli/utils/symlinks.test.d.ts.map +1 -0
  64. package/packages/core/dist/cli/utils/symlinks.test.js +266 -0
  65. package/packages/core/dist/cli/utils/symlinks.test.js.map +1 -0
  66. package/packages/core/dist/cli/utils/themes.js +1 -1
  67. package/packages/core/dist/cli/workspace.test.js +2 -5
  68. package/packages/core/dist/cli/workspace.test.js.map +1 -1
  69. package/packages/core/dist/consolidation.test.d.ts +11 -0
  70. package/packages/core/dist/consolidation.test.d.ts.map +1 -0
  71. package/packages/core/dist/consolidation.test.js +249 -0
  72. package/packages/core/dist/consolidation.test.js.map +1 -0
  73. package/packages/core/dist/index.d.ts +2 -0
  74. package/packages/core/dist/index.d.ts.map +1 -1
  75. package/packages/core/dist/index.js +4 -0
  76. package/packages/core/dist/index.js.map +1 -1
  77. package/packages/core/dist/plugins/plugin-discovery.js +1 -1
  78. package/packages/core/dist/plugins/plugin-discovery.js.map +1 -1
  79. package/packages/core/dist/plugins/plugin-discovery.test.d.ts +1 -1
  80. package/packages/core/dist/plugins/plugin-discovery.test.js +47 -36
  81. package/packages/core/dist/plugins/plugin-discovery.test.js.map +1 -1
  82. package/packages/core/dist/public/css/react.css +1 -0
  83. package/packages/core/dist/public/js/react/react.js +82 -0
  84. package/packages/core/dist/server/agent-context.d.ts +5 -0
  85. package/packages/core/dist/server/agent-context.d.ts.map +1 -0
  86. package/packages/core/dist/server/agent-context.js +5 -0
  87. package/packages/core/dist/server/agent-context.js.map +1 -0
  88. package/packages/core/dist/server/agent-evaluation.d.ts +17 -0
  89. package/packages/core/dist/server/agent-evaluation.d.ts.map +1 -0
  90. package/packages/core/dist/server/agent-evaluation.js +15 -0
  91. package/packages/core/dist/server/agent-evaluation.js.map +1 -0
  92. package/packages/core/dist/server/api/agent-load.d.ts +3 -0
  93. package/packages/core/dist/server/api/agent-load.d.ts.map +1 -0
  94. package/packages/core/dist/server/api/agent-load.js +19 -0
  95. package/packages/core/dist/server/api/agent-load.js.map +1 -0
  96. package/packages/core/dist/server/api/audit-log.d.ts +3 -0
  97. package/packages/core/dist/server/api/audit-log.d.ts.map +1 -0
  98. package/packages/core/dist/server/api/audit-log.js +31 -0
  99. package/packages/core/dist/server/api/audit-log.js.map +1 -0
  100. package/packages/core/dist/server/api/background-tasks.d.ts +27 -0
  101. package/packages/core/dist/server/api/background-tasks.d.ts.map +1 -0
  102. package/packages/core/dist/server/api/background-tasks.js +56 -0
  103. package/packages/core/dist/server/api/background-tasks.js.map +1 -0
  104. package/packages/core/dist/server/api/bell.d.ts +19 -0
  105. package/packages/core/dist/server/api/bell.d.ts.map +1 -0
  106. package/packages/core/dist/server/api/bell.js +34 -0
  107. package/packages/core/dist/server/api/bell.js.map +1 -0
  108. package/packages/core/dist/server/api/code-markers.d.ts +9 -0
  109. package/packages/core/dist/server/api/code-markers.d.ts.map +1 -0
  110. package/packages/core/dist/server/api/code-markers.js +62 -0
  111. package/packages/core/dist/server/api/code-markers.js.map +1 -0
  112. package/packages/core/dist/server/api/complexity.d.ts +3 -0
  113. package/packages/core/dist/server/api/complexity.d.ts.map +1 -0
  114. package/packages/core/dist/server/api/complexity.js +47 -0
  115. package/packages/core/dist/server/api/complexity.js.map +1 -0
  116. package/packages/core/dist/server/api/context.d.ts +38 -0
  117. package/packages/core/dist/server/api/context.d.ts.map +1 -0
  118. package/packages/core/dist/server/api/context.js +144 -0
  119. package/packages/core/dist/server/api/context.js.map +1 -0
  120. package/packages/core/dist/server/api/dead-code.d.ts +3 -0
  121. package/packages/core/dist/server/api/dead-code.d.ts.map +1 -0
  122. package/packages/core/dist/server/api/dead-code.js +70 -0
  123. package/packages/core/dist/server/api/dead-code.js.map +1 -0
  124. package/packages/core/dist/server/api/dependencies.d.ts +3 -0
  125. package/packages/core/dist/server/api/dependencies.d.ts.map +1 -0
  126. package/packages/core/dist/server/api/dependencies.js +43 -0
  127. package/packages/core/dist/server/api/dependencies.js.map +1 -0
  128. package/packages/core/dist/server/api/evaluation.d.ts +3 -0
  129. package/packages/core/dist/server/api/evaluation.d.ts.map +1 -0
  130. package/packages/core/dist/server/api/evaluation.js +33 -0
  131. package/packages/core/dist/server/api/evaluation.js.map +1 -0
  132. package/packages/core/dist/server/api/file-browser.d.ts +9 -0
  133. package/packages/core/dist/server/api/file-browser.d.ts.map +1 -0
  134. package/packages/core/dist/server/api/file-browser.js +115 -0
  135. package/packages/core/dist/server/api/file-browser.js.map +1 -0
  136. package/packages/core/dist/server/api/git.d.ts +47 -0
  137. package/packages/core/dist/server/api/git.d.ts.map +1 -0
  138. package/packages/core/dist/server/api/git.js +355 -0
  139. package/packages/core/dist/server/api/git.js.map +1 -0
  140. package/packages/core/dist/server/api/health-score.d.ts +3 -0
  141. package/packages/core/dist/server/api/health-score.d.ts.map +1 -0
  142. package/packages/core/dist/server/api/health-score.js +47 -0
  143. package/packages/core/dist/server/api/health-score.js.map +1 -0
  144. package/packages/core/dist/server/api/hook-request.d.ts +41 -0
  145. package/packages/core/dist/server/api/hook-request.d.ts.map +1 -0
  146. package/packages/core/dist/server/api/hook-request.js +278 -0
  147. package/packages/core/dist/server/api/hook-request.js.map +1 -0
  148. package/packages/core/dist/server/api/hotspots.d.ts +3 -0
  149. package/packages/core/dist/server/api/hotspots.d.ts.map +1 -0
  150. package/packages/core/dist/server/api/hotspots.js +62 -0
  151. package/packages/core/dist/server/api/hotspots.js.map +1 -0
  152. package/packages/core/dist/server/api/identity.d.ts +17 -0
  153. package/packages/core/dist/server/api/identity.d.ts.map +1 -0
  154. package/packages/core/dist/server/api/identity.js +79 -0
  155. package/packages/core/dist/server/api/identity.js.map +1 -0
  156. package/packages/core/dist/server/api/index.d.ts +36 -0
  157. package/packages/core/dist/server/api/index.d.ts.map +1 -0
  158. package/packages/core/dist/server/api/index.js +47 -0
  159. package/packages/core/dist/server/api/index.js.map +1 -0
  160. package/packages/core/dist/server/api/mode.d.ts +24 -0
  161. package/packages/core/dist/server/api/mode.d.ts.map +1 -0
  162. package/packages/core/dist/server/api/mode.js +40 -0
  163. package/packages/core/dist/server/api/mode.js.map +1 -0
  164. package/packages/core/dist/server/api/otlp.d.ts +3 -0
  165. package/packages/core/dist/server/api/otlp.d.ts.map +1 -0
  166. package/packages/core/dist/server/api/otlp.js +40 -0
  167. package/packages/core/dist/server/api/otlp.js.map +1 -0
  168. package/packages/core/dist/server/api/permissions.d.ts +16 -0
  169. package/packages/core/dist/server/api/permissions.d.ts.map +1 -0
  170. package/packages/core/dist/server/api/permissions.js +67 -0
  171. package/packages/core/dist/server/api/permissions.js.map +1 -0
  172. package/packages/core/dist/server/api/persona.d.ts +9 -0
  173. package/packages/core/dist/server/api/persona.d.ts.map +1 -0
  174. package/packages/core/dist/server/api/persona.js +68 -0
  175. package/packages/core/dist/server/api/persona.js.map +1 -0
  176. package/packages/core/dist/server/api/portrait.d.ts +6 -0
  177. package/packages/core/dist/server/api/portrait.d.ts.map +1 -0
  178. package/packages/core/dist/server/api/portrait.js +28 -0
  179. package/packages/core/dist/server/api/portrait.js.map +1 -0
  180. package/packages/core/dist/server/api/settings.d.ts +14 -0
  181. package/packages/core/dist/server/api/settings.d.ts.map +1 -0
  182. package/packages/core/dist/server/api/settings.js +59 -0
  183. package/packages/core/dist/server/api/settings.js.map +1 -0
  184. package/packages/core/dist/server/api/spans.d.ts +3 -0
  185. package/packages/core/dist/server/api/spans.d.ts.map +1 -0
  186. package/packages/core/dist/server/api/spans.js +33 -0
  187. package/packages/core/dist/server/api/spans.js.map +1 -0
  188. package/packages/core/dist/server/api/stats.d.ts +13 -0
  189. package/packages/core/dist/server/api/stats.d.ts.map +1 -0
  190. package/packages/core/dist/server/api/stats.js +85 -0
  191. package/packages/core/dist/server/api/stats.js.map +1 -0
  192. package/packages/core/dist/server/api/story.d.ts +3 -0
  193. package/packages/core/dist/server/api/story.d.ts.map +1 -0
  194. package/packages/core/dist/server/api/story.js +15 -0
  195. package/packages/core/dist/server/api/story.js.map +1 -0
  196. package/packages/core/dist/server/api/telemetry.d.ts +3 -0
  197. package/packages/core/dist/server/api/telemetry.d.ts.map +1 -0
  198. package/packages/core/dist/server/api/telemetry.js +30 -0
  199. package/packages/core/dist/server/api/telemetry.js.map +1 -0
  200. package/packages/core/dist/server/api/theme-agents.d.ts +10 -0
  201. package/packages/core/dist/server/api/theme-agents.d.ts.map +1 -0
  202. package/packages/core/dist/server/api/theme-agents.js +39 -0
  203. package/packages/core/dist/server/api/theme-agents.js.map +1 -0
  204. package/packages/core/dist/server/api/todos.d.ts +33 -0
  205. package/packages/core/dist/server/api/todos.d.ts.map +1 -0
  206. package/packages/core/dist/server/api/todos.js +44 -0
  207. package/packages/core/dist/server/api/todos.js.map +1 -0
  208. package/packages/core/dist/server/api/token-stats.d.ts +8 -0
  209. package/packages/core/dist/server/api/token-stats.d.ts.map +1 -0
  210. package/packages/core/dist/server/api/token-stats.js +36 -0
  211. package/packages/core/dist/server/api/token-stats.js.map +1 -0
  212. package/packages/core/dist/server/api/welcome.d.ts +22 -0
  213. package/packages/core/dist/server/api/welcome.d.ts.map +1 -0
  214. package/packages/core/dist/server/api/welcome.js +35 -0
  215. package/packages/core/dist/server/api/welcome.js.map +1 -0
  216. package/packages/core/dist/server/bell-mode.d.ts +7 -0
  217. package/packages/core/dist/server/bell-mode.d.ts.map +1 -0
  218. package/packages/core/dist/server/bell-mode.js +7 -0
  219. package/packages/core/dist/server/bell-mode.js.map +1 -0
  220. package/packages/core/dist/server/dangerous-path.d.ts +36 -0
  221. package/packages/core/dist/server/dangerous-path.d.ts.map +1 -0
  222. package/packages/core/dist/server/dangerous-path.js +159 -0
  223. package/packages/core/dist/server/dangerous-path.js.map +1 -0
  224. package/packages/core/dist/server/enriched-span-exporter.d.ts +17 -0
  225. package/packages/core/dist/server/enriched-span-exporter.d.ts.map +1 -0
  226. package/packages/core/dist/server/enriched-span-exporter.js +12 -0
  227. package/packages/core/dist/server/enriched-span-exporter.js.map +1 -0
  228. package/packages/core/dist/server/env.d.ts +6 -0
  229. package/packages/core/dist/server/env.d.ts.map +1 -0
  230. package/packages/core/dist/server/env.js +10 -0
  231. package/packages/core/dist/server/env.js.map +1 -0
  232. package/packages/core/dist/server/file-browser.d.ts +17 -0
  233. package/packages/core/dist/server/file-browser.d.ts.map +1 -0
  234. package/packages/core/dist/server/file-browser.js +11 -0
  235. package/packages/core/dist/server/file-browser.js.map +1 -0
  236. package/packages/core/dist/server/otlp-receiver.d.ts +65 -0
  237. package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -0
  238. package/packages/core/dist/server/otlp-receiver.js +46 -0
  239. package/packages/core/dist/server/otlp-receiver.js.map +1 -0
  240. package/packages/core/dist/server/parser.d.ts +11 -0
  241. package/packages/core/dist/server/parser.d.ts.map +1 -0
  242. package/packages/core/dist/server/parser.js +6 -0
  243. package/packages/core/dist/server/parser.js.map +1 -0
  244. package/packages/core/dist/server/paths.d.ts +37 -0
  245. package/packages/core/dist/server/paths.d.ts.map +1 -0
  246. package/packages/core/dist/server/paths.js +217 -0
  247. package/packages/core/dist/server/paths.js.map +1 -0
  248. package/packages/core/dist/server/pennyfarthing.d.ts +56 -0
  249. package/packages/core/dist/server/pennyfarthing.d.ts.map +1 -0
  250. package/packages/core/dist/server/pennyfarthing.js +356 -0
  251. package/packages/core/dist/server/pennyfarthing.js.map +1 -0
  252. package/packages/core/dist/server/plugin-loader.d.ts +22 -0
  253. package/packages/core/dist/server/plugin-loader.d.ts.map +1 -0
  254. package/packages/core/dist/server/plugin-loader.js +67 -0
  255. package/packages/core/dist/server/plugin-loader.js.map +1 -0
  256. package/packages/core/dist/server/prime.d.ts +12 -0
  257. package/packages/core/dist/server/prime.d.ts.map +1 -0
  258. package/packages/core/dist/server/prime.js +8 -0
  259. package/packages/core/dist/server/prime.js.map +1 -0
  260. package/packages/core/dist/server/server.d.ts +45 -0
  261. package/packages/core/dist/server/server.d.ts.map +1 -0
  262. package/packages/core/dist/server/server.js +351 -0
  263. package/packages/core/dist/server/server.js.map +1 -0
  264. package/packages/core/dist/server/server.test.d.ts +26 -0
  265. package/packages/core/dist/server/server.test.d.ts.map +1 -0
  266. package/packages/core/dist/server/server.test.js +447 -0
  267. package/packages/core/dist/server/server.test.js.map +1 -0
  268. package/packages/core/dist/server/settings-store.d.ts +195 -0
  269. package/packages/core/dist/server/settings-store.d.ts.map +1 -0
  270. package/packages/core/dist/server/settings-store.js +398 -0
  271. package/packages/core/dist/server/settings-store.js.map +1 -0
  272. package/packages/core/dist/server/settings.d.ts +136 -0
  273. package/packages/core/dist/server/settings.d.ts.map +1 -0
  274. package/packages/core/dist/server/settings.js +417 -0
  275. package/packages/core/dist/server/settings.js.map +1 -0
  276. package/packages/core/dist/server/span-hierarchy.d.ts +5 -0
  277. package/packages/core/dist/server/span-hierarchy.d.ts.map +1 -0
  278. package/packages/core/dist/server/span-hierarchy.js +5 -0
  279. package/packages/core/dist/server/span-hierarchy.js.map +1 -0
  280. package/packages/core/dist/server/story-context.d.ts +5 -0
  281. package/packages/core/dist/server/story-context.d.ts.map +1 -0
  282. package/packages/core/dist/server/story-context.js +5 -0
  283. package/packages/core/dist/server/story-context.js.map +1 -0
  284. package/packages/core/dist/server/story-parser.d.ts +74 -0
  285. package/packages/core/dist/server/story-parser.d.ts.map +1 -0
  286. package/packages/core/dist/server/story-parser.js +748 -0
  287. package/packages/core/dist/server/story-parser.js.map +1 -0
  288. package/packages/core/dist/server/tdd-metrics.d.ts +5 -0
  289. package/packages/core/dist/server/tdd-metrics.d.ts.map +1 -0
  290. package/packages/core/dist/server/tdd-metrics.js +5 -0
  291. package/packages/core/dist/server/tdd-metrics.js.map +1 -0
  292. package/packages/core/dist/server/ui-build.test.d.ts +19 -0
  293. package/packages/core/dist/server/ui-build.test.d.ts.map +1 -0
  294. package/packages/core/dist/server/ui-build.test.js +152 -0
  295. package/packages/core/dist/server/ui-build.test.js.map +1 -0
  296. package/packages/core/dist/server/websocket.d.ts +7 -0
  297. package/packages/core/dist/server/websocket.d.ts.map +1 -0
  298. package/packages/core/dist/server/websocket.js +8 -0
  299. package/packages/core/dist/server/websocket.js.map +1 -0
  300. package/packages/core/dist/shared/browser.d.ts +6 -0
  301. package/packages/core/dist/shared/browser.d.ts.map +1 -0
  302. package/packages/core/dist/shared/browser.js +8 -0
  303. package/packages/core/dist/shared/browser.js.map +1 -0
  304. package/packages/core/dist/shared/generate-skill-docs.d.ts +35 -0
  305. package/packages/core/dist/shared/generate-skill-docs.d.ts.map +1 -0
  306. package/packages/core/dist/shared/generate-skill-docs.js +442 -0
  307. package/packages/core/dist/shared/generate-skill-docs.js.map +1 -0
  308. package/packages/core/dist/shared/generate-skill-docs.test.d.ts +13 -0
  309. package/packages/core/dist/shared/generate-skill-docs.test.d.ts.map +1 -0
  310. package/packages/core/dist/shared/generate-skill-docs.test.js +519 -0
  311. package/packages/core/dist/shared/generate-skill-docs.test.js.map +1 -0
  312. package/packages/core/dist/shared/index.d.ts +11 -0
  313. package/packages/core/dist/shared/index.d.ts.map +1 -0
  314. package/packages/core/dist/shared/index.js +13 -0
  315. package/packages/core/dist/shared/index.js.map +1 -0
  316. package/packages/core/dist/shared/marker/constants.d.ts +39 -0
  317. package/packages/core/dist/shared/marker/constants.d.ts.map +1 -0
  318. package/packages/core/dist/shared/marker/constants.js +46 -0
  319. package/packages/core/dist/shared/marker/constants.js.map +1 -0
  320. package/packages/core/dist/shared/marker/continue.test.d.ts +12 -0
  321. package/packages/core/dist/shared/marker/continue.test.d.ts.map +1 -0
  322. package/packages/core/dist/shared/marker/continue.test.js +76 -0
  323. package/packages/core/dist/shared/marker/continue.test.js.map +1 -0
  324. package/packages/core/dist/shared/marker/detect.d.ts +25 -0
  325. package/packages/core/dist/shared/marker/detect.d.ts.map +1 -0
  326. package/packages/core/dist/shared/marker/detect.js +53 -0
  327. package/packages/core/dist/shared/marker/detect.js.map +1 -0
  328. package/packages/core/dist/shared/marker/detect.test.d.ts +10 -0
  329. package/packages/core/dist/shared/marker/detect.test.d.ts.map +1 -0
  330. package/packages/core/dist/shared/marker/detect.test.js +418 -0
  331. package/packages/core/dist/shared/marker/detect.test.js.map +1 -0
  332. package/packages/core/dist/shared/marker/index.d.ts +14 -0
  333. package/packages/core/dist/shared/marker/index.d.ts.map +1 -0
  334. package/packages/core/dist/shared/marker/index.js +15 -0
  335. package/packages/core/dist/shared/marker/index.js.map +1 -0
  336. package/packages/core/dist/shared/marker/strip.d.ts +26 -0
  337. package/packages/core/dist/shared/marker/strip.d.ts.map +1 -0
  338. package/packages/core/dist/shared/marker/strip.js +39 -0
  339. package/packages/core/dist/shared/marker/strip.js.map +1 -0
  340. package/packages/core/dist/shared/marker/types.d.ts +23 -0
  341. package/packages/core/dist/shared/marker/types.d.ts.map +1 -0
  342. package/packages/core/dist/shared/marker/types.js +7 -0
  343. package/packages/core/dist/shared/marker/types.js.map +1 -0
  344. package/packages/core/dist/shared/migrate-theme-schema.test.d.ts +8 -0
  345. package/packages/core/dist/shared/migrate-theme-schema.test.d.ts.map +1 -0
  346. package/packages/core/dist/shared/migrate-theme-schema.test.js +100 -0
  347. package/packages/core/dist/shared/migrate-theme-schema.test.js.map +1 -0
  348. package/packages/core/dist/shared/portrait-resolver.d.ts +35 -0
  349. package/packages/core/dist/shared/portrait-resolver.d.ts.map +1 -0
  350. package/packages/core/dist/shared/portrait-resolver.js +259 -0
  351. package/packages/core/dist/shared/portrait-resolver.js.map +1 -0
  352. package/packages/core/dist/shared/portrait-resolver.test.d.ts +2 -0
  353. package/packages/core/dist/shared/portrait-resolver.test.d.ts.map +1 -0
  354. package/packages/core/dist/shared/portrait-resolver.test.js +157 -0
  355. package/packages/core/dist/shared/portrait-resolver.test.js.map +1 -0
  356. package/packages/core/dist/shared/repos-topology.d.ts +49 -0
  357. package/packages/core/dist/shared/repos-topology.d.ts.map +1 -0
  358. package/packages/core/dist/shared/repos-topology.js +101 -0
  359. package/packages/core/dist/shared/repos-topology.js.map +1 -0
  360. package/packages/core/dist/shared/repos-topology.test.d.ts +8 -0
  361. package/packages/core/dist/shared/repos-topology.test.d.ts.map +1 -0
  362. package/packages/core/dist/shared/repos-topology.test.js +250 -0
  363. package/packages/core/dist/shared/repos-topology.test.js.map +1 -0
  364. package/packages/core/dist/shared/skill-search.d.ts +36 -0
  365. package/packages/core/dist/shared/skill-search.d.ts.map +1 -0
  366. package/packages/core/dist/shared/skill-search.js +300 -0
  367. package/packages/core/dist/shared/skill-search.js.map +1 -0
  368. package/packages/core/dist/shared/skill-search.test.d.ts +16 -0
  369. package/packages/core/dist/shared/skill-search.test.d.ts.map +1 -0
  370. package/packages/core/dist/shared/skill-search.test.js +177 -0
  371. package/packages/core/dist/shared/skill-search.test.js.map +1 -0
  372. package/packages/core/dist/shared/skill-suggest.d.ts +76 -0
  373. package/packages/core/dist/shared/skill-suggest.d.ts.map +1 -0
  374. package/packages/core/dist/shared/skill-suggest.js +256 -0
  375. package/packages/core/dist/shared/skill-suggest.js.map +1 -0
  376. package/packages/core/dist/shared/skill-suggest.test.d.ts +12 -0
  377. package/packages/core/dist/shared/skill-suggest.test.d.ts.map +1 -0
  378. package/packages/core/dist/shared/skill-suggest.test.js +257 -0
  379. package/packages/core/dist/shared/skill-suggest.test.js.map +1 -0
  380. package/packages/core/dist/shared/theme-loader.d.ts +81 -0
  381. package/packages/core/dist/shared/theme-loader.d.ts.map +1 -0
  382. package/packages/core/dist/shared/theme-loader.js +491 -0
  383. package/packages/core/dist/shared/theme-loader.js.map +1 -0
  384. package/packages/core/dist/shared/theme-loader.test.d.ts +8 -0
  385. package/packages/core/dist/shared/theme-loader.test.d.ts.map +1 -0
  386. package/packages/core/dist/shared/theme-loader.test.js +62 -0
  387. package/packages/core/dist/shared/theme-loader.test.js.map +1 -0
  388. package/packages/core/dist/workflow/context-watch.test.js +1 -1
  389. package/packages/core/dist/workflow/context-watch.test.js.map +1 -1
  390. package/pennyfarthing-dist/agents/architect.md +2 -2
  391. package/pennyfarthing-dist/agents/ba.md +1 -1
  392. package/pennyfarthing-dist/agents/dev.md +3 -50
  393. package/pennyfarthing-dist/agents/devops.md +1 -1
  394. package/pennyfarthing-dist/agents/orchestrator.md +3 -3
  395. package/pennyfarthing-dist/agents/pm.md +2 -2
  396. package/pennyfarthing-dist/agents/reviewer.md +2 -2
  397. package/pennyfarthing-dist/agents/sm-setup.md +7 -7
  398. package/pennyfarthing-dist/agents/sm.md +19 -18
  399. package/pennyfarthing-dist/agents/tea.md +3 -2
  400. package/pennyfarthing-dist/agents/tech-writer.md +1 -1
  401. package/pennyfarthing-dist/agents/ux-designer.md +1 -1
  402. package/pennyfarthing-dist/commands/benchmark-control.md +69 -0
  403. package/pennyfarthing-dist/commands/benchmark.md +485 -0
  404. package/pennyfarthing-dist/commands/job-fair.md +102 -0
  405. package/pennyfarthing-dist/commands/{close-epic.md → pf-close-epic.md} +1 -1
  406. package/pennyfarthing-dist/commands/{new-work.md → pf-new-work.md} +4 -4
  407. package/pennyfarthing-dist/commands/{party-mode.md → pf-party-mode.md} +15 -2
  408. package/pennyfarthing-dist/commands/{patch.md → pf-patch.md} +3 -3
  409. package/pennyfarthing-dist/commands/{release.md → pf-release.md} +17 -10
  410. package/pennyfarthing-dist/commands/{setup.md → pf-setup.md} +2 -2
  411. package/pennyfarthing-dist/commands/{sprint.md → pf-sprint.md} +19 -19
  412. package/pennyfarthing-dist/commands/{standalone.md → pf-standalone.md} +2 -2
  413. package/pennyfarthing-dist/commands/{workflow.md → pf-workflow.md} +7 -7
  414. package/pennyfarthing-dist/commands/solo.md +447 -0
  415. package/pennyfarthing-dist/guides/agent-behavior.md +2 -2
  416. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +2 -2
  417. package/pennyfarthing-dist/guides/agent-template-strategic.md +1 -1
  418. package/pennyfarthing-dist/guides/agent-template-tactical.md +2 -2
  419. package/pennyfarthing-dist/guides/bikelane.md +6 -6
  420. package/pennyfarthing-dist/guides/permission-protocol.md +1 -1
  421. package/pennyfarthing-dist/guides/scale-levels.md +2 -2
  422. package/pennyfarthing-dist/guides/skill-schema.md +9 -9
  423. package/pennyfarthing-dist/guides/xml-tags.md +2 -2
  424. package/pennyfarthing-dist/personas/themes/dune.yaml +0 -1
  425. package/pennyfarthing-dist/personas/themes/hogans-heroes.yaml +260 -0
  426. package/pennyfarthing-dist/personas/themes/monty-python.yaml +312 -0
  427. package/pennyfarthing-dist/personas/themes/stephen-king.yaml +260 -0
  428. package/pennyfarthing-dist/scripts/core/agent-session.sh +0 -0
  429. package/pennyfarthing-dist/scripts/core/check-context.sh +0 -0
  430. package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -0
  431. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +0 -0
  432. package/pennyfarthing-dist/scripts/core/prime.sh +0 -0
  433. package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -0
  434. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +0 -0
  435. package/pennyfarthing-dist/scripts/git/git-status-all.sh +0 -0
  436. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +84 -21
  437. package/pennyfarthing-dist/scripts/git/release.sh +0 -0
  438. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +0 -0
  439. package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -0
  440. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +0 -0
  441. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -0
  442. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -0
  443. package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  444. package/pennyfarthing-dist/scripts/hooks/dispatcher-template.sh +45 -0
  445. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -0
  446. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -0
  447. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +27 -2
  448. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
  449. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -0
  450. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -0
  451. package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -0
  452. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -0
  453. package/pennyfarthing-dist/scripts/hooks/session-start.sh +25 -89
  454. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -0
  455. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -0
  456. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +0 -0
  457. package/pennyfarthing-dist/scripts/jira/README.md +1 -1
  458. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +0 -0
  459. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +0 -0
  460. package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -0
  461. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +0 -0
  462. package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -0
  463. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -0
  464. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -0
  465. package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -0
  466. package/pennyfarthing-dist/scripts/lib/common.sh +0 -0
  467. package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -0
  468. package/pennyfarthing-dist/scripts/lib/logging.sh +0 -0
  469. package/pennyfarthing-dist/scripts/lib/retry.sh +0 -0
  470. package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -0
  471. package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -0
  472. package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -0
  473. package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -0
  474. package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -0
  475. package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -0
  476. package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -0
  477. package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -0
  478. package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -0
  479. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -0
  480. package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -0
  481. package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -0
  482. package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -0
  483. package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -0
  484. package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -0
  485. package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -0
  486. package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -0
  487. package/pennyfarthing-dist/scripts/misc/statusline.sh +0 -0
  488. package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -0
  489. package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +0 -0
  490. package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +50 -26
  491. package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +18 -6
  492. package/pennyfarthing-dist/scripts/sprint/README.md +1 -1
  493. package/pennyfarthing-dist/scripts/story/README.md +1 -1
  494. package/pennyfarthing-dist/scripts/story/create-story.sh +0 -0
  495. package/pennyfarthing-dist/scripts/story/size-story.sh +0 -0
  496. package/pennyfarthing-dist/scripts/story/story-template.sh +0 -0
  497. package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
  498. package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -0
  499. package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -0
  500. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +0 -0
  501. package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -0
  502. package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -0
  503. package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -0
  504. package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -0
  505. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -0
  506. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +0 -0
  507. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -0
  508. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -0
  509. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
  510. package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -0
  511. package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -0
  512. package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -0
  513. package/pennyfarthing-dist/scripts/workflow/README.md +1 -1
  514. package/pennyfarthing-dist/scripts/workflow/check.py +0 -0
  515. package/pennyfarthing-dist/scripts/workflow/check.sh +0 -0
  516. package/pennyfarthing-dist/scripts/workflow/complete-step.py +0 -0
  517. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +0 -0
  518. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +0 -0
  519. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -0
  520. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +0 -0
  521. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +0 -0
  522. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +0 -0
  523. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +0 -0
  524. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +0 -0
  525. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +0 -0
  526. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +0 -0
  527. package/pennyfarthing-dist/skills/pf-bc/examples.md +83 -0
  528. package/pennyfarthing-dist/skills/pf-bc/skill.md +51 -0
  529. package/pennyfarthing-dist/skills/pf-bc/usage.md +113 -0
  530. package/pennyfarthing-dist/skills/{cyclist → pf-cyclist}/SKILL.md +5 -5
  531. package/pennyfarthing-dist/skills/pf-finalize-run/SKILL.md +261 -0
  532. package/pennyfarthing-dist/skills/pf-jira/SKILL.md +61 -0
  533. package/pennyfarthing-dist/skills/pf-jira/examples.md +163 -0
  534. package/pennyfarthing-dist/skills/pf-jira/usage.md +213 -0
  535. package/pennyfarthing-dist/skills/pf-judge/SKILL.md +644 -0
  536. package/pennyfarthing-dist/skills/{just → pf-just}/SKILL.md +23 -23
  537. package/pennyfarthing-dist/skills/{permissions → pf-permissions}/skill.md +8 -8
  538. package/pennyfarthing-dist/skills/pf-persona-benchmark/SKILL.md +187 -0
  539. package/pennyfarthing-dist/skills/pf-sprint/examples.md +189 -0
  540. package/pennyfarthing-dist/skills/pf-sprint/skill.md +85 -0
  541. package/pennyfarthing-dist/skills/pf-sprint/usage.md +293 -0
  542. package/pennyfarthing-dist/skills/{story → pf-story}/scripts/create-story.sh +0 -0
  543. package/pennyfarthing-dist/skills/{story → pf-story}/scripts/size-story.sh +0 -0
  544. package/pennyfarthing-dist/skills/{story → pf-story}/scripts/story-template.sh +0 -0
  545. package/pennyfarthing-dist/skills/pf-story/skill.md +27 -0
  546. package/pennyfarthing-dist/skills/{systematic-debugging → pf-systematic-debugging}/SKILL.md +6 -6
  547. package/pennyfarthing-dist/skills/pf-theme/examples.md +92 -0
  548. package/pennyfarthing-dist/skills/pf-theme/skill.md +42 -0
  549. package/pennyfarthing-dist/skills/pf-theme/usage.md +149 -0
  550. package/pennyfarthing-dist/skills/pf-workflow/examples.md +101 -0
  551. package/pennyfarthing-dist/skills/{workflow → pf-workflow}/scripts/list-workflows.sh +0 -0
  552. package/pennyfarthing-dist/skills/{workflow → pf-workflow}/scripts/resume-workflow.sh +0 -0
  553. package/pennyfarthing-dist/skills/{workflow → pf-workflow}/scripts/show-workflow.sh +0 -0
  554. package/pennyfarthing-dist/skills/{workflow → pf-workflow}/scripts/start-workflow.sh +0 -0
  555. package/pennyfarthing-dist/skills/{workflow → pf-workflow}/scripts/workflow-status.sh +0 -0
  556. package/pennyfarthing-dist/skills/pf-workflow/skill.md +49 -0
  557. package/pennyfarthing-dist/skills/pf-workflow/usage.md +145 -0
  558. package/pennyfarthing-dist/skills/skill-registry.yaml +66 -66
  559. package/pennyfarthing-dist/workflows/architecture/data/domain-complexity.csv +13 -0
  560. package/pennyfarthing-dist/workflows/architecture/data/project-types.csv +7 -0
  561. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +40 -11
  562. package/pennyfarthing-dist/workflows/party-mode-roleplay/steps/step-01-agent-loading.md +99 -0
  563. package/pennyfarthing-dist/workflows/party-mode-roleplay/steps/step-02-discussion.md +130 -0
  564. package/pennyfarthing-dist/workflows/party-mode-roleplay/steps/step-03-exit.md +100 -0
  565. package/pennyfarthing-dist/workflows/party-mode-roleplay/workflow.yaml +62 -0
  566. package/pennyfarthing-dist/workflows/prd/data/domain-complexity.csv +2 -0
  567. package/pennyfarthing-dist/workflows/prd/data/prd-purpose.md +2 -0
  568. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +16 -0
  569. package/pennyfarthing-dist/workflows/project-setup/steps/step-04-claude-md.md +3 -3
  570. package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +193 -0
  571. package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +148 -0
  572. package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +141 -0
  573. package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +192 -0
  574. package/pennyfarthing-dist/workflows/quick-spec/tech-spec-template.md +74 -0
  575. package/pennyfarthing-dist/workflows/quick-spec/workflow.yaml +35 -0
  576. package/pennyfarthing-dist/workflows/release/steps/step-01-preflight.md +42 -3
  577. package/pennyfarthing-dist/workflows/release/steps/step-02-bump.md +10 -3
  578. package/pennyfarthing-dist/workflows/release/steps/step-03-changelog.md +1 -1
  579. package/pennyfarthing-dist/workflows/release/steps/step-07-commit.md +13 -4
  580. package/pennyfarthing-dist/workflows/release/steps/step-08-merge.md +31 -6
  581. package/pennyfarthing-dist/workflows/release/steps/step-09-push.md +12 -6
  582. package/pennyfarthing-dist/workflows/release/steps/step-10-publish.md +30 -5
  583. package/pennyfarthing-dist/workflows/release/steps/step-11-finalize.md +29 -0
  584. package/pennyfarthing-dist/workflows/release.yaml +7 -0
  585. package/pennyfarthing_scripts/CLAUDE.md +182 -0
  586. package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
  587. package/pennyfarthing_scripts/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
  588. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  589. package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
  590. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  591. package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
  592. package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
  593. package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
  594. package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
  595. package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
  596. package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
  597. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  598. package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  599. package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
  600. package/pennyfarthing_scripts/bc/__init__.py +1 -0
  601. package/pennyfarthing_scripts/bc/__pycache__/__init__.cpython-314.pyc +0 -0
  602. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
  603. package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
  604. package/pennyfarthing_scripts/bc/cli.py +223 -0
  605. package/pennyfarthing_scripts/bc/focus.py +333 -0
  606. package/pennyfarthing_scripts/bikerack/__init__.py +8 -0
  607. package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
  608. package/pennyfarthing_scripts/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
  609. package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  610. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  611. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  612. package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  613. package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  614. package/pennyfarthing_scripts/bikerack/background_panel.py +81 -0
  615. package/pennyfarthing_scripts/bikerack/base_panel.py +100 -0
  616. package/pennyfarthing_scripts/bikerack/cli.py +22 -24
  617. package/pennyfarthing_scripts/bikerack/diffs_panel.py +146 -0
  618. package/pennyfarthing_scripts/bikerack/git_panel.py +69 -0
  619. package/pennyfarthing_scripts/bikerack/launcher.py +63 -4
  620. package/pennyfarthing_scripts/bikerack/sprint_panel.py +72 -0
  621. package/pennyfarthing_scripts/bikerack/tui.py +193 -0
  622. package/pennyfarthing_scripts/bikerack/ws_client.py +176 -0
  623. package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  624. package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  625. package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  626. package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  627. package/pennyfarthing_scripts/cli.py +60 -16
  628. package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
  629. package/pennyfarthing_scripts/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
  630. package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
  631. package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
  632. package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
  633. package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
  634. package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
  635. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  636. package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
  637. package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
  638. package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  639. package/pennyfarthing_scripts/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
  640. package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  641. package/pennyfarthing_scripts/complexity/__pycache__/cli.cpython-314.pyc +0 -0
  642. package/pennyfarthing_scripts/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
  643. package/pennyfarthing_scripts/complexity/__pycache__/models.cpython-314.pyc +0 -0
  644. package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
  645. package/pennyfarthing_scripts/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
  646. package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  647. package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
  648. package/pennyfarthing_scripts/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
  649. package/pennyfarthing_scripts/deadcode/__pycache__/models.cpython-314.pyc +0 -0
  650. package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  651. package/pennyfarthing_scripts/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
  652. package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  653. package/pennyfarthing_scripts/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
  654. package/pennyfarthing_scripts/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
  655. package/pennyfarthing_scripts/dependencies/__pycache__/models.cpython-314.pyc +0 -0
  656. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  657. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  658. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  659. package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  660. package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  661. package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  662. package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
  663. package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
  664. package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-314.pyc +0 -0
  665. package/pennyfarthing_scripts/healthscore/analyze.py +15 -1
  666. package/pennyfarthing_scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  667. package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  668. package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
  669. package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  670. package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  671. package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
  672. package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  673. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  674. package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
  675. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  676. package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
  677. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  678. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
  679. package/pennyfarthing_scripts/jira/__pycache__/create.cpython-314.pyc +0 -0
  680. package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
  681. package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-314.pyc +0 -0
  682. package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  683. package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
  684. package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
  685. package/pennyfarthing_scripts/jira/cli.py +10 -2
  686. package/pennyfarthing_scripts/launch/__init__.py +1 -0
  687. package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-314.pyc +0 -0
  688. package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-314.pyc +0 -0
  689. package/pennyfarthing_scripts/launch/cli.py +231 -0
  690. package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  691. package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
  692. package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
  693. package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
  694. package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
  695. package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  696. package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
  697. package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
  698. package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  699. package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  700. package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
  701. package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
  702. package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
  703. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  704. package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
  705. package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  706. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  707. package/pennyfarthing_scripts/prime/version_sentinel.py +0 -1
  708. package/pennyfarthing_scripts/session_start_hook.py +192 -0
  709. package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  710. package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  711. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  712. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  713. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  714. package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  715. package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
  716. package/pennyfarthing_scripts/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
  717. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  718. package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
  719. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  720. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  721. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  722. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  723. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  724. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
  725. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  726. package/pennyfarthing_scripts/sprint/archive_epic.py +109 -9
  727. package/pennyfarthing_scripts/sprint/cli.py +30 -9
  728. package/pennyfarthing_scripts/sprint/epic_add.py +7 -1
  729. package/pennyfarthing_scripts/sprint/epic_update.py +148 -0
  730. package/pennyfarthing_scripts/sprint/loader.py +33 -0
  731. package/pennyfarthing_scripts/sprint/story_add.py +11 -1
  732. package/pennyfarthing_scripts/sprint/story_finish.py +14 -10
  733. package/pennyfarthing_scripts/sprint/story_update.py +7 -0
  734. package/pennyfarthing_scripts/sprint/validate_cmd.py +2 -1
  735. package/pennyfarthing_scripts/sprint/yaml_io.py +64 -6
  736. package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
  737. package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
  738. package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
  739. package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
  740. package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
  741. package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
  742. package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  743. package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  744. package/pennyfarthing_scripts/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
  745. package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  746. package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  747. package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  748. package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
  749. package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  750. package/pennyfarthing_scripts/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
  751. package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  752. package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
  753. package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  754. package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  755. package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  756. package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  757. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  758. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  759. package/pennyfarthing_scripts/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
  760. package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  761. package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
  762. package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  763. package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  764. package/pennyfarthing_scripts/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
  765. package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
  766. package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
  767. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  768. package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  769. package/pennyfarthing_scripts/tests/test_archive_epic.py +186 -0
  770. package/pennyfarthing_scripts/tests/test_bc.py +490 -0
  771. package/pennyfarthing_scripts/tests/test_cli_normalization.py +295 -0
  772. package/pennyfarthing_scripts/tests/test_sprint_panel.py +531 -0
  773. package/pennyfarthing_scripts/tests/test_tui_focus.py +411 -0
  774. package/pennyfarthing_scripts/tests/test_tui_panel_persistence.py +411 -0
  775. package/pennyfarthing_scripts/tests/test_version_sentinel.py +1 -5
  776. package/pennyfarthing_scripts/tests/test_yaml_io.py +5 -5
  777. package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-314.pyc +0 -0
  778. package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
  779. package/pennyfarthing_scripts/theme/cli.py +25 -2
  780. package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-314.pyc +0 -0
  781. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
  782. package/pennyfarthing_scripts/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
  783. package/pennyfarthing_scripts/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
  784. package/pennyfarthing_scripts/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
  785. package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
  786. package/pennyfarthing_scripts/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
  787. package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
  788. package/scripts/README.md +41 -0
  789. package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +0 -392
  790. package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
  791. package/pennyfarthing-dist/skills/jira/SKILL.md +0 -207
  792. package/pennyfarthing-dist/skills/sprint/skill.md +0 -806
  793. package/pennyfarthing-dist/skills/story/skill.md +0 -27
  794. package/pennyfarthing-dist/skills/theme/skill.md +0 -356
  795. package/pennyfarthing-dist/skills/workflow/skill.md +0 -368
  796. package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  797. package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
  798. package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  799. package/pennyfarthing_scripts/__pycache__/sprint.cpython-314.pyc +0 -0
  800. package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
  801. package/pennyfarthing_scripts/jira/__pycache__/compat.cpython-314.pyc +0 -0
  802. package/pennyfarthing_scripts/jira/__pycache__/mappings.cpython-314.pyc +0 -0
  803. package/pennyfarthing_scripts/jira/__pycache__/models.cpython-314.pyc +0 -0
  804. package/pennyfarthing_scripts/migration/__pycache__/__main__.cpython-314.pyc +0 -0
  805. package/pennyfarthing_scripts/migration/__pycache__/cli.cpython-314.pyc +0 -0
  806. package/pennyfarthing_scripts/prime/__pycache__/__main__.cpython-314.pyc +0 -0
  807. package/pennyfarthing_scripts/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
  808. package/pennyfarthing_scripts/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
  809. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  810. /package/pennyfarthing-dist/commands/{architect.md → pf-architect.md} +0 -0
  811. /package/pennyfarthing-dist/commands/{ba.md → pf-ba.md} +0 -0
  812. /package/pennyfarthing-dist/commands/{brainstorming.md → pf-brainstorming.md} +0 -0
  813. /package/pennyfarthing-dist/commands/{check.md → pf-check.md} +0 -0
  814. /package/pennyfarthing-dist/commands/{chore.md → pf-chore.md} +0 -0
  815. /package/pennyfarthing-dist/commands/{continue-session.md → pf-continue-session.md} +0 -0
  816. /package/pennyfarthing-dist/commands/{create-branches-from-story.md → pf-create-branches-from-story.md} +0 -0
  817. /package/pennyfarthing-dist/commands/{create-theme.md → pf-create-theme.md} +0 -0
  818. /package/pennyfarthing-dist/commands/{dev.md → pf-dev.md} +0 -0
  819. /package/pennyfarthing-dist/commands/{devops.md → pf-devops.md} +0 -0
  820. /package/pennyfarthing-dist/commands/{fix-blocker.md → pf-fix-blocker.md} +0 -0
  821. /package/pennyfarthing-dist/commands/{git-cleanup.md → pf-git-cleanup.md} +0 -0
  822. /package/pennyfarthing-dist/commands/{health-check.md → pf-health-check.md} +0 -0
  823. /package/pennyfarthing-dist/commands/{help.md → pf-help.md} +0 -0
  824. /package/pennyfarthing-dist/commands/{list-themes.md → pf-list-themes.md} +0 -0
  825. /package/pennyfarthing-dist/commands/{orchestrator.md → pf-orchestrator.md} +0 -0
  826. /package/pennyfarthing-dist/commands/{parallel-work.md → pf-parallel-work.md} +0 -0
  827. /package/pennyfarthing-dist/commands/{permissions.md → pf-permissions.md} +0 -0
  828. /package/pennyfarthing-dist/commands/{pm.md → pf-pm.md} +0 -0
  829. /package/pennyfarthing-dist/commands/{prime.md → pf-prime.md} +0 -0
  830. /package/pennyfarthing-dist/commands/{repo-status.md → pf-repo-status.md} +0 -0
  831. /package/pennyfarthing-dist/commands/{retro.md → pf-retro.md} +0 -0
  832. /package/pennyfarthing-dist/commands/{reviewer.md → pf-reviewer.md} +0 -0
  833. /package/pennyfarthing-dist/commands/{run-ci.md → pf-run-ci.md} +0 -0
  834. /package/pennyfarthing-dist/commands/{set-theme.md → pf-set-theme.md} +0 -0
  835. /package/pennyfarthing-dist/commands/{show-theme.md → pf-show-theme.md} +0 -0
  836. /package/pennyfarthing-dist/commands/{sm.md → pf-sm.md} +0 -0
  837. /package/pennyfarthing-dist/commands/{sprint-planning.md → pf-sprint-planning.md} +0 -0
  838. /package/pennyfarthing-dist/commands/{start-epic.md → pf-start-epic.md} +0 -0
  839. /package/pennyfarthing-dist/commands/{sync-epic-to-jira.md → pf-sync-epic-to-jira.md} +0 -0
  840. /package/pennyfarthing-dist/commands/{sync-work-with-sprint.md → pf-sync-work-with-sprint.md} +0 -0
  841. /package/pennyfarthing-dist/commands/{tea.md → pf-tea.md} +0 -0
  842. /package/pennyfarthing-dist/commands/{tech-writer.md → pf-tech-writer.md} +0 -0
  843. /package/pennyfarthing-dist/commands/{theme-maker.md → pf-theme-maker.md} +0 -0
  844. /package/pennyfarthing-dist/commands/{theme.md → pf-theme.md} +0 -0
  845. /package/pennyfarthing-dist/commands/{update-domain-docs.md → pf-update-domain-docs.md} +0 -0
  846. /package/pennyfarthing-dist/commands/{ux-designer.md → pf-ux-designer.md} +0 -0
  847. /package/pennyfarthing-dist/commands/{work.md → pf-work.md} +0 -0
  848. /package/pennyfarthing-dist/skills/{agentic-patterns → pf-agentic-patterns}/SKILL.md +0 -0
  849. /package/pennyfarthing-dist/skills/{changelog → pf-changelog}/SKILL.md +0 -0
  850. /package/pennyfarthing-dist/skills/{code-review → pf-code-review}/SKILL.md +0 -0
  851. /package/pennyfarthing-dist/skills/{context-engineering → pf-context-engineering}/SKILL.md +0 -0
  852. /package/pennyfarthing-dist/skills/{dev-patterns → pf-dev-patterns}/SKILL.md +0 -0
  853. /package/pennyfarthing-dist/skills/{mermaid → pf-mermaid}/SKILL.md +0 -0
  854. /package/pennyfarthing-dist/skills/{otel → pf-otel}/skill.md +0 -0
  855. /package/pennyfarthing-dist/skills/{testing → pf-testing}/SKILL.md +0 -0
  856. /package/pennyfarthing-dist/skills/{testing → pf-testing}/references/troubleshooting.md +0 -0
  857. /package/pennyfarthing-dist/skills/{theme-creation → pf-theme-creation}/SKILL.md +0 -0
  858. /package/pennyfarthing-dist/skills/{yq → pf-yq}/SKILL.md +0 -0
@@ -5,7 +5,8 @@
5
5
  #
6
6
  # For the pennyfarthing framework repo and orchestrator repos that inline it.
7
7
  # End-user projects use `pennyfarthing init` which copies hooks from node_modules.
8
- # This script creates symlinks so hook changes in pennyfarthing-dist/ take effect immediately.
8
+ # This script creates .d/ directories with symlinks so hook changes in
9
+ # pennyfarthing-dist/ take effect immediately.
9
10
 
10
11
  set -euo pipefail
11
12
 
@@ -15,6 +16,10 @@ source "$SCRIPT_DIR/../lib/find-root.sh"
15
16
  HOOKS_SOURCE="$PROJECT_ROOT/pennyfarthing-dist/scripts/hooks"
16
17
  HOOKS_DEST="$PROJECT_ROOT/.git/hooks"
17
18
 
19
+ DISPATCHER_MARKER="pennyfarthing-dispatcher"
20
+ PF_PREFIX="10"
21
+ MIGRATED_PREFIX="50"
22
+
18
23
  # Check we're in a repo with pennyfarthing-dist (framework or orchestrator)
19
24
  if [[ ! -d "$PROJECT_ROOT/pennyfarthing-dist" ]]; then
20
25
  echo "Error: This script requires pennyfarthing-dist/ at the project root"
@@ -29,11 +34,25 @@ if [[ ! -d "$PROJECT_ROOT/.git" ]]; then
29
34
  exit 1
30
35
  fi
31
36
 
32
- echo "Installing git hooks for dogfooding..."
37
+ echo "Installing git hooks with .d/ dispatcher pattern..."
33
38
  echo " Source: pennyfarthing-dist/scripts/hooks/"
34
39
  echo " Dest: .git/hooks/"
35
40
  echo ""
36
41
 
42
+ # Shared dispatcher template — single source of truth
43
+ DISPATCHER_TEMPLATE="$PROJECT_ROOT/pennyfarthing-dist/scripts/hooks/dispatcher-template.sh"
44
+
45
+ if [[ ! -f "$DISPATCHER_TEMPLATE" ]]; then
46
+ echo "Error: dispatcher-template.sh not found at $DISPATCHER_TEMPLATE"
47
+ exit 1
48
+ fi
49
+
50
+ # Generate a dispatcher script for a given hook name
51
+ generate_dispatcher() {
52
+ local hook_name="$1"
53
+ sed "s/__HOOK_NAME__/${hook_name}/g" "$DISPATCHER_TEMPLATE"
54
+ }
55
+
37
56
  # Define hooks to install
38
57
  HOOKS=(
39
58
  "pre-commit.sh:pre-commit"
@@ -47,35 +66,79 @@ for hook_pair in "${HOOKS[@]}"; do
47
66
 
48
67
  source_path="$HOOKS_SOURCE/$source_file"
49
68
  dest_path="$HOOKS_DEST/$dest_name"
69
+ d_dir="$HOOKS_DEST/${dest_name}.d"
70
+ pf_hook_name="${PF_PREFIX}-pennyfarthing-${dest_name}.sh"
71
+ pf_hook_path="${d_dir}/${pf_hook_name}"
50
72
 
51
73
  if [[ ! -f "$source_path" ]]; then
52
74
  echo " SKIP $dest_name (source not found)"
53
75
  continue
54
76
  fi
55
77
 
56
- # Create relative symlink
57
- # From .git/hooks/ we need to go ../../pennyfarthing-dist/scripts/hooks/
58
- relative_path="../../pennyfarthing-dist/scripts/hooks/$source_file"
78
+ # Create .d/ directory
79
+ mkdir -p "$d_dir"
59
80
 
60
- if [[ -L "$dest_path" ]]; then
61
- # Already a symlink - check if it points to our file
62
- current_target=$(readlink "$dest_path")
63
- if [[ "$current_target" == "$relative_path" ]]; then
64
- echo " OK $dest_name (already installed)"
65
- continue
81
+ # Handle existing hook at the dest path
82
+ if [[ -e "$dest_path" ]]; then
83
+ if [[ -f "$dest_path" ]] && grep -q "$DISPATCHER_MARKER" "$dest_path" 2>/dev/null; then
84
+ echo " OK $dest_name dispatcher (already installed)"
85
+ elif [[ -L "$dest_path" ]]; then
86
+ # Old-style symlink — migrate to .d/ pattern
87
+ rm "$dest_path"
88
+ generate_dispatcher "$dest_name" > "$dest_path"
89
+ chmod 755 "$dest_path"
90
+ echo " UPD $dest_name → dispatcher"
91
+ elif [[ -f "$dest_path" ]]; then
92
+ existing_content="$(cat "$dest_path")"
93
+ if echo "$existing_content" | grep -q "pennyfarthing"; then
94
+ # Old pennyfarthing single-file hook — replace with dispatcher
95
+ generate_dispatcher "$dest_name" > "$dest_path"
96
+ chmod 755 "$dest_path"
97
+ echo " UPD $dest_name → dispatcher (was single-file pf hook)"
98
+ else
99
+ # Non-pennyfarthing hook — migrate into .d/
100
+ migrated_name="${MIGRATED_PREFIX}-migrated-${dest_name}.sh"
101
+ migrated_path="${d_dir}/${migrated_name}"
102
+ if [[ ! -f "$migrated_path" ]]; then
103
+ mv "$dest_path" "$migrated_path"
104
+ chmod 755 "$migrated_path"
105
+ echo " MIG $dest_name → ${dest_name}.d/${migrated_name}"
106
+ fi
107
+ generate_dispatcher "$dest_name" > "$dest_path"
108
+ chmod 755 "$dest_path"
109
+ echo " NEW $dest_name dispatcher"
110
+ fi
66
111
  fi
67
- # Different symlink - remove and recreate
68
- rm "$dest_path"
69
- elif [[ -f "$dest_path" ]]; then
70
- # Regular file - backup first
71
- backup_path="${dest_path}.backup"
72
- mv "$dest_path" "$backup_path"
73
- echo " BACK $dest_name -> ${dest_name}.backup"
112
+ else
113
+ # No existing hook — install fresh dispatcher
114
+ generate_dispatcher "$dest_name" > "$dest_path"
115
+ chmod 755 "$dest_path"
116
+ echo " NEW $dest_name dispatcher"
74
117
  fi
75
118
 
76
- ln -sf "$relative_path" "$dest_path"
77
- echo " NEW $dest_name -> $relative_path"
119
+ # Symlink pennyfarthing hook into .d/ (framework dev — symlink for live edits)
120
+ # From .git/hooks/{hook}.d/ we need ../../.../pennyfarthing-dist/scripts/hooks/
121
+ relative_path="../../../pennyfarthing-dist/scripts/hooks/$source_file"
122
+
123
+ if [[ -L "$pf_hook_path" ]]; then
124
+ current_target=$(readlink "$pf_hook_path")
125
+ if [[ "$current_target" == "$relative_path" ]]; then
126
+ echo " OK ${dest_name}.d/${pf_hook_name} (already linked)"
127
+ else
128
+ rm "$pf_hook_path"
129
+ ln -sf "$relative_path" "$pf_hook_path"
130
+ echo " UPD ${dest_name}.d/${pf_hook_name} → $relative_path"
131
+ fi
132
+ elif [[ -f "$pf_hook_path" ]]; then
133
+ # Regular file — replace with symlink for dev
134
+ rm "$pf_hook_path"
135
+ ln -sf "$relative_path" "$pf_hook_path"
136
+ echo " UPD ${dest_name}.d/${pf_hook_name} → $relative_path (was copy)"
137
+ else
138
+ ln -sf "$relative_path" "$pf_hook_path"
139
+ echo " NEW ${dest_name}.d/${pf_hook_name} → $relative_path"
140
+ fi
78
141
  done
79
142
 
80
143
  echo ""
81
- echo "Done. Verify with: ls -la .git/hooks/ | grep -v sample"
144
+ echo "Done. Verify with: ls -la .git/hooks/*.d/"
File without changes
@@ -0,0 +1,45 @@
1
+ #!/bin/bash
2
+ # pennyfarthing-dispatcher: Git hook dispatcher for __HOOK_NAME__
3
+ # Runs all executable scripts in __HOOK_NAME__.d/ in sorted order.
4
+ # Installed by pennyfarthing — do not edit manually.
5
+
6
+ set -uo pipefail
7
+
8
+ HOOK_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
+ HOOK_NAME="__HOOK_NAME__"
10
+ D_DIR="${HOOK_DIR}/${HOOK_NAME}.d"
11
+
12
+ # If .d/ directory doesn't exist or is empty, exit successfully
13
+ if [[ ! -d "${D_DIR}" ]]; then
14
+ exit 0
15
+ fi
16
+
17
+ # Capture stdin for hooks that receive input (e.g., pre-push)
18
+ STDIN_DATA=""
19
+ if [[ ! -t 0 ]]; then
20
+ STDIN_DATA="$(cat /dev/stdin)"
21
+ fi
22
+
23
+ # Run each executable script in sorted order
24
+ for hook_script in $(ls "${D_DIR}/" 2>/dev/null | sort); do
25
+ script_path="${D_DIR}/${hook_script}"
26
+
27
+ # Skip non-executable files
28
+ if [[ ! -x "${script_path}" ]]; then
29
+ continue
30
+ fi
31
+
32
+ # Run the hook, forwarding arguments and stdin
33
+ if [[ -n "${STDIN_DATA}" ]]; then
34
+ echo "${STDIN_DATA}" | "${script_path}" "$@"
35
+ else
36
+ "${script_path}" "$@"
37
+ fi
38
+
39
+ exit_code=$?
40
+ if [[ ${exit_code} -ne 0 ]]; then
41
+ exit ${exit_code}
42
+ fi
43
+ done
44
+
45
+ exit 0
File without changes
@@ -5,7 +5,8 @@
5
5
  # 1. Prevents direct commits to protected branches (main, develop)
6
6
  # Exception: sprint/ folder commits allowed on develop
7
7
  # 2. Validates agent files when pennyfarthing-dist/agents/*.md is modified
8
- # 3. Validates sprint YAML files when sprint/*.yaml is modified
8
+ # 3. Validates file references when pennyfarthing-dist/ files are modified (warn only)
9
+ # 4. Validates sprint YAML files when sprint/*.yaml is modified
9
10
  #
10
11
  # Installation:
11
12
  # End-user projects: pennyfarthing init (copies to .git/hooks/)
@@ -109,7 +110,31 @@ if [[ -n "$AGENT_FILES" ]]; then
109
110
  fi
110
111
 
111
112
  # =============================================================================
112
- # Check 3: Sprint YAML Validation
113
+ # Check 3: File Reference Validation (warn only)
114
+ # =============================================================================
115
+
116
+ DIST_FILES=$(echo "$STAGED_FILES" | grep "^pennyfarthing-dist/" || true)
117
+ SCRIPT_FILES=$(echo "$STAGED_FILES" | grep "^scripts/validate-refs" || true)
118
+
119
+ if [[ -n "$DIST_FILES" || -n "$SCRIPT_FILES" ]]; then
120
+ VALIDATE_REFS="$PROJECT_ROOT/scripts/validate-refs.js"
121
+
122
+ if [[ -f "$VALIDATE_REFS" ]] && command -v node &>/dev/null; then
123
+ echo "Running file reference validation..."
124
+ if ! node "$VALIDATE_REFS" 2>&1; then
125
+ echo ""
126
+ echo "WARNING: File reference issues detected (see above)"
127
+ echo "CI will fail on these — fix before pushing."
128
+ echo ""
129
+ else
130
+ echo "✓ File reference validation passed"
131
+ echo ""
132
+ fi
133
+ fi
134
+ fi
135
+
136
+ # =============================================================================
137
+ # Check 4: Sprint YAML Validation
113
138
  # =============================================================================
114
139
 
115
140
  SPRINT_YAML_FILES=$(git diff --cached --name-only -- 'sprint/*.yaml' 'sprint/archive/*.yaml' 2>/dev/null \
File without changes
@@ -1,97 +1,33 @@
1
- #!/usr/bin/env zsh
2
- # Session start hook: Initialize environment for Claude Code session
3
- # Called by Claude Code when a new session starts
1
+ #!/usr/bin/env bash
4
2
  #
5
- # Uses CLAUDE_ENV_FILE to persist environment variables for the session.
6
- # Projects using pennyfarthing can add their own hooks for project-specific vars.
3
+ # Session Start Hook - Shell wrapper for Python implementation
7
4
  #
8
- # Also validates previous session checkpoint to detect cross-session state changes.
5
+ # Initializes environment for Claude Code session:
6
+ # - Session directory setup and logging
7
+ # - Checkpoint validation (cross-session drift)
8
+ # - WheelHub auto-start
9
+ # - OTEL auto-configuration
10
+ #
11
+ # Input (stdin): JSON with session_id, source, cwd, etc.
12
+ # Output: Writes to CLAUDE_ENV_FILE
9
13
 
10
14
  set -euo pipefail
11
15
 
12
- # Load shared functions
13
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
14
- source "$SCRIPT_DIR/../lib/checkpoint.sh"
15
-
16
- # Read input from stdin (contains session_id, source, cwd, etc.)
17
- input=$(cat)
18
- session_id=$(echo "$input" | jq -r '.session_id // "unknown"')
19
- source_type=$(echo "$input" | jq -r '.source // "unknown"')
20
-
21
- # Ensure .session directory exists
22
- mkdir -p "$CLAUDE_PROJECT_DIR/.session"
23
- mkdir -p "$CLAUDE_PROJECT_DIR/.session/agents"
24
-
25
- # Note: Agent cleanup is handled by agent-session.sh (7-day TTL) to preserve multi-session state
26
- # DO NOT clear .session/agents/* here - it breaks parallel sessions
27
-
28
- # Create session log entry
29
- echo "$(date -Iseconds) | Session $source_type: $session_id" >> "$CLAUDE_PROJECT_DIR/.session/session-log.txt"
30
-
31
- # Validate previous session checkpoint (cross-session continuity)
32
- validate_checkpoint() {
33
- local prev_state
34
- prev_state=$(checkpoint_restore "session_state")
35
-
36
- if [[ -z "$prev_state" ]]; then
37
- # No previous checkpoint - fresh start
38
- return 0
39
- fi
40
-
41
- # Parse checkpoint data (format: key=value;key=value;...)
42
- local prev_sha prev_agent prev_story prev_phase prev_session
43
- prev_sha=$(echo "$prev_state" | tr ';' '\n' | grep '^sha=' | cut -d= -f2)
44
- prev_agent=$(echo "$prev_state" | tr ';' '\n' | grep '^agent=' | cut -d= -f2)
45
- prev_story=$(echo "$prev_state" | tr ';' '\n' | grep '^story=' | cut -d= -f2)
46
- prev_phase=$(echo "$prev_state" | tr ';' '\n' | grep '^phase=' | cut -d= -f2)
47
- prev_session=$(echo "$prev_state" | tr ';' '\n' | grep '^session=' | cut -d= -f2)
48
-
49
- # Get current git SHA
50
- local current_sha=""
51
- if command -v git &>/dev/null && git rev-parse --git-dir &>/dev/null; then
52
- current_sha=$(git rev-parse --short HEAD 2>/dev/null || echo "")
53
- fi
54
-
55
- # Compare git state
56
- if [[ -n "$prev_sha" && -n "$current_sha" && "$prev_sha" != "$current_sha" ]]; then
57
- # Git state changed between sessions - write warning to session log
58
- local warning="CROSS_SESSION_DRIFT: Git changed since last session (was: $prev_sha, now: $current_sha)"
59
- if [[ -n "$prev_story" ]]; then
60
- warning="$warning | Story: $prev_story"
61
- fi
62
- if [[ -n "$prev_agent" ]]; then
63
- warning="$warning | Agent: $prev_agent"
64
- fi
65
- echo "$(date -Iseconds) | $warning" >> "$CLAUDE_PROJECT_DIR/.session/session-log.txt"
66
-
67
- # Also write to a dedicated drift log for easy scanning
68
- echo "$(date -Iseconds) | prev_sha=$prev_sha | current_sha=$current_sha | story=$prev_story | agent=$prev_agent | phase=$prev_phase" >> "$CLAUDE_PROJECT_DIR/.session/drift-log.txt"
69
- fi
70
- }
71
-
72
- # Run checkpoint validation (don't fail if it errors)
73
- validate_checkpoint 2>/dev/null || true
74
-
75
- # Write environment variables to CLAUDE_ENV_FILE (persists for session)
76
- if [ -n "${CLAUDE_ENV_FILE:-}" ]; then
77
- cat >> "$CLAUDE_ENV_FILE" << EOF
78
- # Pennyfarthing core environment
79
- export PROJECT_ROOT="$CLAUDE_PROJECT_DIR"
80
- export SESSION_ID="$session_id"
81
- EOF
16
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
17
+ source "$SCRIPT_DIR/../lib/find-root.sh"
18
+
19
+ # Set PYTHONPATH for pennyfarthing_scripts
20
+ PENNYFARTHING_SCRIPTS=""
21
+ if [[ -d "$PROJECT_ROOT/pennyfarthing" ]]; then
22
+ # Dogfooding: framework inlined in orchestrator
23
+ PENNYFARTHING_SCRIPTS="$PROJECT_ROOT/pennyfarthing"
24
+ elif [[ -d "$PROJECT_ROOT/node_modules/@pennyfarthing/core" ]]; then
25
+ # Normal install
26
+ PENNYFARTHING_SCRIPTS="$PROJECT_ROOT/node_modules/@pennyfarthing/core"
27
+ fi
82
28
 
83
- # Auto-configure OTEL if Cyclist is running (Story 20-1)
84
- PORT_FILE="$CLAUDE_PROJECT_DIR/.cyclist-port"
85
- if [[ -f "$PORT_FILE" ]]; then
86
- CYCLIST_PORT=$(cat "$PORT_FILE" 2>/dev/null)
87
- if [[ "$CYCLIST_PORT" =~ ^[0-9]+$ ]]; then
88
- cat >> "$CLAUDE_ENV_FILE" << EOF
89
- # OTEL auto-configuration for Cyclist (Story 20-1)
90
- export OTEL_EXPORTER_OTLP_PROTOCOL="http/json"
91
- export OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:$CYCLIST_PORT"
92
- EOF
93
- fi
94
- fi
29
+ if [[ -n "$PENNYFARTHING_SCRIPTS" ]]; then
30
+ export PYTHONPATH="$PENNYFARTHING_SCRIPTS:${PYTHONPATH:-}"
95
31
  fi
96
32
 
97
- exit 0
33
+ python3 -m pennyfarthing_scripts.session_start_hook
File without changes
File without changes
@@ -32,5 +32,5 @@ Core logic lives in `pennyfarthing_scripts/jira/`:
32
32
 
33
33
  ## Ownership
34
34
 
35
- - **Primary users:** SM agent, `/jira` skill
35
+ - **Primary users:** SM agent, `/pf-jira` skill
36
36
  - **Maintained by:** Core Pennyfarthing team
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -2,16 +2,18 @@
2
2
  """
3
3
  Individual Portrait Generator for Pennyfarthing Themes
4
4
 
5
- Generates 10 individual portraits per theme using Stable Diffusion SDXL on M3 Max (MPS).
6
- Reads visual prompts from theme YAML files in two locations:
7
- - Built-in: pennyfarthing-dist/personas/themes/
8
- - Custom: .claude/pennyfarthing/themes/ (takes precedence)
5
+ Generates individual portraits per theme using Stable Diffusion SDXL on M3 Max (MPS).
6
+ Reads visual prompts from theme YAML files in three locations:
7
+ - Package: packages/themes-*/themes/ (output to packages/themes-*/portraits/)
8
+ - Built-in: pennyfarthing-dist/personas/themes/ (output to pennyfarthing-dist/personas/portraits/)
9
+ - Custom: .claude/pennyfarthing/themes/ (takes precedence, output to built-in portraits dir)
9
10
 
10
- Output: pennyfarthing-dist/personas/portraits/{theme}/{slug}-{OCEAN}.png (512x512px each)
11
+ Output: {portraits-dir}/{theme}/{slug}-{OCEAN}.png (512x512px each)
11
12
 
12
13
  Usage:
13
14
  python3 scripts/generate-portraits.py [--dry-run] [--theme THEME]
14
15
  python3 scripts/generate-portraits.py --theme gilligans-island --dry-run
16
+ python3 scripts/generate-portraits.py --role ba --skip-existing
15
17
  """
16
18
 
17
19
  import argparse
@@ -77,7 +79,8 @@ def _find_project_root() -> Path:
77
79
  PROJECT_ROOT = _find_project_root()
78
80
  BUILTIN_THEMES_DIR = PROJECT_ROOT / "pennyfarthing-dist" / "personas" / "themes"
79
81
  CUSTOM_THEMES_DIR = PROJECT_ROOT / ".claude" / "pennyfarthing" / "themes"
80
- OUTPUT_DIR = PROJECT_ROOT / "pennyfarthing-dist" / "personas" / "portraits"
82
+ BUILTIN_OUTPUT_DIR = PROJECT_ROOT / "pennyfarthing-dist" / "personas" / "portraits"
83
+ PACKAGES_DIR = PROJECT_ROOT / "packages"
81
84
  MODEL_ID = "stabilityai/stable-diffusion-xl-base-1.0"
82
85
 
83
86
  # SDXL generates at 1024x1024, we'll resize to 512x512
@@ -272,46 +275,64 @@ def main():
272
275
  parser.add_argument("--output-dir", type=str, help="Output to different directory (default: pennyfarthing-dist/personas/portraits)")
273
276
  args = parser.parse_args()
274
277
 
275
- # Determine output directory
276
- output_base = Path(args.output_dir) if args.output_dir else OUTPUT_DIR
277
-
278
- # Find theme files from both built-in and custom directories
279
- # Custom themes take precedence over built-in themes with same name
280
- theme_map = {}
281
-
282
- # First add built-in themes
278
+ # Determine output directory override
279
+ output_override = Path(args.output_dir) if args.output_dir else None
280
+
281
+ # Find theme files from package, built-in, and custom directories
282
+ # Each entry tracks its own output directory
283
+ # Priority: custom > built-in > package (later entries override earlier)
284
+ theme_map: dict[str, dict] = {}
285
+
286
+ # 1. Package themes (packages/themes-*/themes/ -> packages/themes-*/portraits/)
287
+ pkg_sources = []
288
+ if PACKAGES_DIR.exists():
289
+ for pkg_dir in sorted(PACKAGES_DIR.glob("themes-*")):
290
+ themes_dir = pkg_dir / "themes"
291
+ portraits_dir = pkg_dir / "portraits"
292
+ if themes_dir.exists():
293
+ pkg_sources.append(themes_dir)
294
+ for tf in themes_dir.glob("*.yaml"):
295
+ theme_map[tf.stem] = {"path": tf, "output_dir": portraits_dir}
296
+
297
+ # 2. Built-in themes (override packages if same name)
283
298
  if BUILTIN_THEMES_DIR.exists():
284
299
  for tf in BUILTIN_THEMES_DIR.glob("*.yaml"):
285
- theme_map[tf.stem] = tf
300
+ theme_map[tf.stem] = {"path": tf, "output_dir": BUILTIN_OUTPUT_DIR}
286
301
 
287
- # Then add/override with custom themes
302
+ # 3. Custom themes (override everything)
288
303
  if CUSTOM_THEMES_DIR.exists():
289
304
  for tf in CUSTOM_THEMES_DIR.glob("*.yaml"):
290
- theme_map[tf.stem] = tf
305
+ theme_map[tf.stem] = {"path": tf, "output_dir": BUILTIN_OUTPUT_DIR}
291
306
 
292
- theme_files = sorted(theme_map.values(), key=lambda p: p.stem)
307
+ theme_entries = sorted(theme_map.values(), key=lambda e: e["path"].stem)
293
308
 
294
309
  if args.theme:
295
310
  if args.theme in theme_map:
296
- theme_files = [theme_map[args.theme]]
311
+ theme_entries = [theme_map[args.theme]]
297
312
  else:
298
313
  print(f"Theme '{args.theme}' not found")
299
314
  print(f" Searched: {BUILTIN_THEMES_DIR}")
315
+ for src in pkg_sources:
316
+ print(f" Searched: {src}")
300
317
  print(f" Searched: {CUSTOM_THEMES_DIR}")
301
318
  sys.exit(1)
302
319
 
303
320
  print(f"Theme sources:")
304
321
  print(f" Built-in: {BUILTIN_THEMES_DIR}")
322
+ for src in pkg_sources:
323
+ print(f" Package: {src}")
305
324
  print(f" Custom: {CUSTOM_THEMES_DIR}")
306
- print(f"Found {len(theme_files)} themes")
307
- print(f"Output: {output_base}/{{theme}}/{{slug}}-{{OCEAN}}.png")
325
+ print(f"Found {len(theme_entries)} themes")
308
326
 
309
327
  if args.dry_run:
310
328
  print(f"\nCLIP token limit: {CLIP_MAX_TOKENS} tokens")
311
329
  print(f"Tokenizer: {'CLIP (accurate)' if HAS_CLIP_TOKENIZER else 'word estimate (fallback)'}")
312
- print("\nDry run - portraits to generate:")
330
+ roles_to_show = [args.role] if args.role else ROLES
331
+ print(f"\nDry run - portraits to generate (roles: {', '.join(roles_to_show)}):")
313
332
  truncation_warnings = []
314
- for tf in theme_files:
333
+ for entry in theme_entries:
334
+ tf = entry["path"]
335
+ output_base = output_override or entry["output_dir"]
315
336
  parsed = parse_theme_file(tf)
316
337
  theme_dir = output_base / parsed["theme"]
317
338
  char_count = len(parsed["characters"])
@@ -319,7 +340,8 @@ def main():
319
340
  style_display = style_desc if style_desc else "(default woodcut)"
320
341
  print(f"\n {parsed['theme']}/ ({char_count} characters with visual)")
321
342
  print(f" Style: {style_display}")
322
- for role in ROLES:
343
+ print(f" Output: {output_base}")
344
+ for role in roles_to_show:
323
345
  if role in parsed["characters"]:
324
346
  char = parsed["characters"][role]
325
347
  out_path = theme_dir / char["filename"]
@@ -362,8 +384,10 @@ def main():
362
384
  truncated = []
363
385
  start_time = datetime.now()
364
386
 
365
- total_themes = len(theme_files)
366
- for theme_idx, tf in enumerate(theme_files, 1):
387
+ total_themes = len(theme_entries)
388
+ for theme_idx, entry in enumerate(theme_entries, 1):
389
+ tf = entry["path"]
390
+ output_base = output_override or entry["output_dir"]
367
391
  parsed = parse_theme_file(tf)
368
392
  theme = parsed["theme"]
369
393
  theme_dir = output_base / theme