@pennyfarthing/core 10.4.0 → 11.0.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 (797) hide show
  1. package/README.md +4 -4
  2. package/package.json +16 -14
  3. package/packages/core/dist/benchmark/benchmark-integration.d.ts +182 -0
  4. package/packages/core/dist/benchmark/benchmark-integration.d.ts.map +1 -0
  5. package/packages/core/dist/benchmark/benchmark-integration.js +710 -0
  6. package/packages/core/dist/benchmark/benchmark-integration.js.map +1 -0
  7. package/packages/core/dist/benchmark/benchmark-integration.test.d.ts +6 -0
  8. package/packages/core/dist/benchmark/benchmark-integration.test.d.ts.map +1 -0
  9. package/packages/core/dist/benchmark/benchmark-integration.test.js +41 -0
  10. package/packages/core/dist/benchmark/benchmark-integration.test.js.map +1 -0
  11. package/packages/core/dist/benchmark/index.d.ts +3 -0
  12. package/packages/core/dist/benchmark/index.d.ts.map +1 -0
  13. package/packages/core/dist/benchmark/index.js +5 -0
  14. package/packages/core/dist/benchmark/index.js.map +1 -0
  15. package/packages/core/dist/benchmark/job-fair-aggregator.d.ts +150 -0
  16. package/packages/core/dist/benchmark/job-fair-aggregator.d.ts.map +1 -0
  17. package/packages/core/dist/benchmark/job-fair-aggregator.js +547 -0
  18. package/packages/core/dist/benchmark/job-fair-aggregator.js.map +1 -0
  19. package/packages/core/dist/benchmark/job-fair-aggregator.test.d.ts +6 -0
  20. package/packages/core/dist/benchmark/job-fair-aggregator.test.d.ts.map +1 -0
  21. package/packages/core/dist/benchmark/job-fair-aggregator.test.js +35 -0
  22. package/packages/core/dist/benchmark/job-fair-aggregator.test.js.map +1 -0
  23. package/packages/core/dist/cli/commands/hook-chaining.test.d.ts +17 -0
  24. package/packages/core/dist/cli/commands/hook-chaining.test.d.ts.map +1 -0
  25. package/packages/core/dist/cli/commands/hook-chaining.test.js +386 -0
  26. package/packages/core/dist/cli/commands/hook-chaining.test.js.map +1 -0
  27. package/packages/core/dist/cli/commands/init.d.ts +6 -1
  28. package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
  29. package/packages/core/dist/cli/commands/init.js +83 -30
  30. package/packages/core/dist/cli/commands/init.js.map +1 -1
  31. package/packages/core/dist/cli/commands/uninstall.d.ts.map +1 -1
  32. package/packages/core/dist/cli/commands/uninstall.js +20 -3
  33. package/packages/core/dist/cli/commands/uninstall.js.map +1 -1
  34. package/packages/core/dist/cli/commands/uninstall.test.d.ts +8 -0
  35. package/packages/core/dist/cli/commands/uninstall.test.d.ts.map +1 -0
  36. package/packages/core/dist/cli/commands/uninstall.test.js +120 -0
  37. package/packages/core/dist/cli/commands/uninstall.test.js.map +1 -0
  38. package/packages/core/dist/cli/commands/update.js +4 -4
  39. package/packages/core/dist/cli/commands/update.js.map +1 -1
  40. package/packages/core/dist/cli/cyclist-migration.test.js +2 -1
  41. package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -1
  42. package/packages/core/dist/cli/ocean-profiles.test.js +5 -4
  43. package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -1
  44. package/packages/core/dist/cli/theme-maker.test.js +5 -4
  45. package/packages/core/dist/cli/theme-maker.test.js.map +1 -1
  46. package/packages/core/dist/cli/utils/008-sprint-shard-migration.test.d.ts +15 -0
  47. package/packages/core/dist/cli/utils/008-sprint-shard-migration.test.d.ts.map +1 -0
  48. package/packages/core/dist/cli/utils/008-sprint-shard-migration.test.js +295 -0
  49. package/packages/core/dist/cli/utils/008-sprint-shard-migration.test.js.map +1 -0
  50. package/packages/core/dist/cli/utils/settings-consolidation.test.js +26 -0
  51. package/packages/core/dist/cli/utils/settings-consolidation.test.js.map +1 -1
  52. package/packages/core/dist/cli/utils/settings-merge.d.ts +128 -0
  53. package/packages/core/dist/cli/utils/settings-merge.d.ts.map +1 -0
  54. package/packages/core/dist/cli/utils/settings-merge.js +303 -0
  55. package/packages/core/dist/cli/utils/settings-merge.js.map +1 -0
  56. package/packages/core/dist/cli/utils/settings-merge.test.d.ts +15 -0
  57. package/packages/core/dist/cli/utils/settings-merge.test.d.ts.map +1 -0
  58. package/packages/core/dist/cli/utils/settings-merge.test.js +781 -0
  59. package/packages/core/dist/cli/utils/settings-merge.test.js.map +1 -0
  60. package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
  61. package/packages/core/dist/cli/utils/settings.js +3 -0
  62. package/packages/core/dist/cli/utils/settings.js.map +1 -1
  63. package/packages/core/dist/cli/utils/symlinks.d.ts +6 -16
  64. package/packages/core/dist/cli/utils/symlinks.d.ts.map +1 -1
  65. package/packages/core/dist/cli/utils/symlinks.js +100 -171
  66. package/packages/core/dist/cli/utils/symlinks.js.map +1 -1
  67. package/packages/core/dist/cli/utils/symlinks.test.d.ts +10 -0
  68. package/packages/core/dist/cli/utils/symlinks.test.d.ts.map +1 -0
  69. package/packages/core/dist/cli/utils/symlinks.test.js +266 -0
  70. package/packages/core/dist/cli/utils/symlinks.test.js.map +1 -0
  71. package/packages/core/dist/cli/utils/themes.js +1 -1
  72. package/packages/core/dist/cli/workspace.test.js +2 -5
  73. package/packages/core/dist/cli/workspace.test.js.map +1 -1
  74. package/packages/core/dist/consolidation.test.d.ts +11 -0
  75. package/packages/core/dist/consolidation.test.d.ts.map +1 -0
  76. package/packages/core/dist/consolidation.test.js +249 -0
  77. package/packages/core/dist/consolidation.test.js.map +1 -0
  78. package/packages/core/dist/index.d.ts +2 -0
  79. package/packages/core/dist/index.d.ts.map +1 -1
  80. package/packages/core/dist/index.js +4 -0
  81. package/packages/core/dist/index.js.map +1 -1
  82. package/packages/core/dist/plugins/plugin-discovery.js +1 -1
  83. package/packages/core/dist/plugins/plugin-discovery.js.map +1 -1
  84. package/packages/core/dist/plugins/plugin-discovery.test.d.ts +1 -1
  85. package/packages/core/dist/plugins/plugin-discovery.test.js +47 -36
  86. package/packages/core/dist/plugins/plugin-discovery.test.js.map +1 -1
  87. package/packages/core/dist/public/css/react.css +1 -0
  88. package/packages/core/dist/public/js/react/react.js +82 -0
  89. package/packages/core/dist/scripts/generate-report.test.js +2 -2
  90. package/packages/core/dist/scripts/generate-spider-report.test.js +2 -2
  91. package/packages/core/dist/scripts/generate-spider.test.js +2 -1
  92. package/packages/core/dist/scripts/generate-spider.test.js.map +1 -1
  93. package/packages/core/dist/server/agent-context.d.ts +5 -0
  94. package/packages/core/dist/server/agent-context.d.ts.map +1 -0
  95. package/packages/core/dist/server/agent-context.js +5 -0
  96. package/packages/core/dist/server/agent-context.js.map +1 -0
  97. package/packages/core/dist/server/agent-evaluation.d.ts +17 -0
  98. package/packages/core/dist/server/agent-evaluation.d.ts.map +1 -0
  99. package/packages/core/dist/server/agent-evaluation.js +15 -0
  100. package/packages/core/dist/server/agent-evaluation.js.map +1 -0
  101. package/packages/core/dist/server/api/agent-load.d.ts +3 -0
  102. package/packages/core/dist/server/api/agent-load.d.ts.map +1 -0
  103. package/packages/core/dist/server/api/agent-load.js +19 -0
  104. package/packages/core/dist/server/api/agent-load.js.map +1 -0
  105. package/packages/core/dist/server/api/audit-log.d.ts +3 -0
  106. package/packages/core/dist/server/api/audit-log.d.ts.map +1 -0
  107. package/packages/core/dist/server/api/audit-log.js +31 -0
  108. package/packages/core/dist/server/api/audit-log.js.map +1 -0
  109. package/packages/core/dist/server/api/background-tasks.d.ts +27 -0
  110. package/packages/core/dist/server/api/background-tasks.d.ts.map +1 -0
  111. package/packages/core/dist/server/api/background-tasks.js +56 -0
  112. package/packages/core/dist/server/api/background-tasks.js.map +1 -0
  113. package/packages/core/dist/server/api/bell.d.ts +19 -0
  114. package/packages/core/dist/server/api/bell.d.ts.map +1 -0
  115. package/packages/core/dist/server/api/bell.js +34 -0
  116. package/packages/core/dist/server/api/bell.js.map +1 -0
  117. package/packages/core/dist/server/api/code-markers.d.ts +9 -0
  118. package/packages/core/dist/server/api/code-markers.d.ts.map +1 -0
  119. package/packages/core/dist/server/api/code-markers.js +62 -0
  120. package/packages/core/dist/server/api/code-markers.js.map +1 -0
  121. package/packages/core/dist/server/api/complexity.d.ts +3 -0
  122. package/packages/core/dist/server/api/complexity.d.ts.map +1 -0
  123. package/packages/core/dist/server/api/complexity.js +47 -0
  124. package/packages/core/dist/server/api/complexity.js.map +1 -0
  125. package/packages/core/dist/server/api/context.d.ts +38 -0
  126. package/packages/core/dist/server/api/context.d.ts.map +1 -0
  127. package/packages/core/dist/server/api/context.js +144 -0
  128. package/packages/core/dist/server/api/context.js.map +1 -0
  129. package/packages/core/dist/server/api/dead-code.d.ts +3 -0
  130. package/packages/core/dist/server/api/dead-code.d.ts.map +1 -0
  131. package/packages/core/dist/server/api/dead-code.js +70 -0
  132. package/packages/core/dist/server/api/dead-code.js.map +1 -0
  133. package/packages/core/dist/server/api/dependencies.d.ts +3 -0
  134. package/packages/core/dist/server/api/dependencies.d.ts.map +1 -0
  135. package/packages/core/dist/server/api/dependencies.js +43 -0
  136. package/packages/core/dist/server/api/dependencies.js.map +1 -0
  137. package/packages/core/dist/server/api/evaluation.d.ts +3 -0
  138. package/packages/core/dist/server/api/evaluation.d.ts.map +1 -0
  139. package/packages/core/dist/server/api/evaluation.js +33 -0
  140. package/packages/core/dist/server/api/evaluation.js.map +1 -0
  141. package/packages/core/dist/server/api/file-browser.d.ts +9 -0
  142. package/packages/core/dist/server/api/file-browser.d.ts.map +1 -0
  143. package/packages/core/dist/server/api/file-browser.js +133 -0
  144. package/packages/core/dist/server/api/file-browser.js.map +1 -0
  145. package/packages/core/dist/server/api/git-fetch-cooldown.test.d.ts +10 -0
  146. package/packages/core/dist/server/api/git-fetch-cooldown.test.d.ts.map +1 -0
  147. package/packages/core/dist/server/api/git-fetch-cooldown.test.js +30 -0
  148. package/packages/core/dist/server/api/git-fetch-cooldown.test.js.map +1 -0
  149. package/packages/core/dist/server/api/git.d.ts +55 -0
  150. package/packages/core/dist/server/api/git.d.ts.map +1 -0
  151. package/packages/core/dist/server/api/git.js +382 -0
  152. package/packages/core/dist/server/api/git.js.map +1 -0
  153. package/packages/core/dist/server/api/health-score.d.ts +3 -0
  154. package/packages/core/dist/server/api/health-score.d.ts.map +1 -0
  155. package/packages/core/dist/server/api/health-score.js +47 -0
  156. package/packages/core/dist/server/api/health-score.js.map +1 -0
  157. package/packages/core/dist/server/api/hook-request.d.ts +41 -0
  158. package/packages/core/dist/server/api/hook-request.d.ts.map +1 -0
  159. package/packages/core/dist/server/api/hook-request.js +278 -0
  160. package/packages/core/dist/server/api/hook-request.js.map +1 -0
  161. package/packages/core/dist/server/api/hotspots.d.ts +3 -0
  162. package/packages/core/dist/server/api/hotspots.d.ts.map +1 -0
  163. package/packages/core/dist/server/api/hotspots.js +62 -0
  164. package/packages/core/dist/server/api/hotspots.js.map +1 -0
  165. package/packages/core/dist/server/api/identity.d.ts +17 -0
  166. package/packages/core/dist/server/api/identity.d.ts.map +1 -0
  167. package/packages/core/dist/server/api/identity.js +79 -0
  168. package/packages/core/dist/server/api/identity.js.map +1 -0
  169. package/packages/core/dist/server/api/index.d.ts +36 -0
  170. package/packages/core/dist/server/api/index.d.ts.map +1 -0
  171. package/packages/core/dist/server/api/index.js +47 -0
  172. package/packages/core/dist/server/api/index.js.map +1 -0
  173. package/packages/core/dist/server/api/mode.d.ts +24 -0
  174. package/packages/core/dist/server/api/mode.d.ts.map +1 -0
  175. package/packages/core/dist/server/api/mode.js +40 -0
  176. package/packages/core/dist/server/api/mode.js.map +1 -0
  177. package/packages/core/dist/server/api/otlp.d.ts +3 -0
  178. package/packages/core/dist/server/api/otlp.d.ts.map +1 -0
  179. package/packages/core/dist/server/api/otlp.js +40 -0
  180. package/packages/core/dist/server/api/otlp.js.map +1 -0
  181. package/packages/core/dist/server/api/permissions.d.ts +16 -0
  182. package/packages/core/dist/server/api/permissions.d.ts.map +1 -0
  183. package/packages/core/dist/server/api/permissions.js +67 -0
  184. package/packages/core/dist/server/api/permissions.js.map +1 -0
  185. package/packages/core/dist/server/api/persona.d.ts +9 -0
  186. package/packages/core/dist/server/api/persona.d.ts.map +1 -0
  187. package/packages/core/dist/server/api/persona.js +68 -0
  188. package/packages/core/dist/server/api/persona.js.map +1 -0
  189. package/packages/core/dist/server/api/portrait.d.ts +6 -0
  190. package/packages/core/dist/server/api/portrait.d.ts.map +1 -0
  191. package/packages/core/dist/server/api/portrait.js +28 -0
  192. package/packages/core/dist/server/api/portrait.js.map +1 -0
  193. package/packages/core/dist/server/api/settings.d.ts +14 -0
  194. package/packages/core/dist/server/api/settings.d.ts.map +1 -0
  195. package/packages/core/dist/server/api/settings.js +68 -0
  196. package/packages/core/dist/server/api/settings.js.map +1 -0
  197. package/packages/core/dist/server/api/spans.d.ts +3 -0
  198. package/packages/core/dist/server/api/spans.d.ts.map +1 -0
  199. package/packages/core/dist/server/api/spans.js +33 -0
  200. package/packages/core/dist/server/api/spans.js.map +1 -0
  201. package/packages/core/dist/server/api/stats.d.ts +13 -0
  202. package/packages/core/dist/server/api/stats.d.ts.map +1 -0
  203. package/packages/core/dist/server/api/stats.js +85 -0
  204. package/packages/core/dist/server/api/stats.js.map +1 -0
  205. package/packages/core/dist/server/api/story.d.ts +3 -0
  206. package/packages/core/dist/server/api/story.d.ts.map +1 -0
  207. package/packages/core/dist/server/api/story.js +15 -0
  208. package/packages/core/dist/server/api/story.js.map +1 -0
  209. package/packages/core/dist/server/api/telemetry.d.ts +3 -0
  210. package/packages/core/dist/server/api/telemetry.d.ts.map +1 -0
  211. package/packages/core/dist/server/api/telemetry.js +30 -0
  212. package/packages/core/dist/server/api/telemetry.js.map +1 -0
  213. package/packages/core/dist/server/api/theme-agents.d.ts +10 -0
  214. package/packages/core/dist/server/api/theme-agents.d.ts.map +1 -0
  215. package/packages/core/dist/server/api/theme-agents.js +39 -0
  216. package/packages/core/dist/server/api/theme-agents.js.map +1 -0
  217. package/packages/core/dist/server/api/todos.d.ts +33 -0
  218. package/packages/core/dist/server/api/todos.d.ts.map +1 -0
  219. package/packages/core/dist/server/api/todos.js +44 -0
  220. package/packages/core/dist/server/api/todos.js.map +1 -0
  221. package/packages/core/dist/server/api/token-stats.d.ts +8 -0
  222. package/packages/core/dist/server/api/token-stats.d.ts.map +1 -0
  223. package/packages/core/dist/server/api/token-stats.js +36 -0
  224. package/packages/core/dist/server/api/token-stats.js.map +1 -0
  225. package/packages/core/dist/server/api/welcome.d.ts +22 -0
  226. package/packages/core/dist/server/api/welcome.d.ts.map +1 -0
  227. package/packages/core/dist/server/api/welcome.js +35 -0
  228. package/packages/core/dist/server/api/welcome.js.map +1 -0
  229. package/packages/core/dist/server/bell-mode.d.ts +7 -0
  230. package/packages/core/dist/server/bell-mode.d.ts.map +1 -0
  231. package/packages/core/dist/server/bell-mode.js +7 -0
  232. package/packages/core/dist/server/bell-mode.js.map +1 -0
  233. package/packages/core/dist/server/dangerous-path.d.ts +36 -0
  234. package/packages/core/dist/server/dangerous-path.d.ts.map +1 -0
  235. package/packages/core/dist/server/dangerous-path.js +159 -0
  236. package/packages/core/dist/server/dangerous-path.js.map +1 -0
  237. package/packages/core/dist/server/enriched-span-exporter.d.ts +17 -0
  238. package/packages/core/dist/server/enriched-span-exporter.d.ts.map +1 -0
  239. package/packages/core/dist/server/enriched-span-exporter.js +12 -0
  240. package/packages/core/dist/server/enriched-span-exporter.js.map +1 -0
  241. package/packages/core/dist/server/env.d.ts +6 -0
  242. package/packages/core/dist/server/env.d.ts.map +1 -0
  243. package/packages/core/dist/server/env.js +10 -0
  244. package/packages/core/dist/server/env.js.map +1 -0
  245. package/packages/core/dist/server/file-browser.d.ts +17 -0
  246. package/packages/core/dist/server/file-browser.d.ts.map +1 -0
  247. package/packages/core/dist/server/file-browser.js +11 -0
  248. package/packages/core/dist/server/file-browser.js.map +1 -0
  249. package/packages/core/dist/server/otlp-receiver.d.ts +87 -0
  250. package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -0
  251. package/packages/core/dist/server/otlp-receiver.js +106 -0
  252. package/packages/core/dist/server/otlp-receiver.js.map +1 -0
  253. package/packages/core/dist/server/parser.d.ts +11 -0
  254. package/packages/core/dist/server/parser.d.ts.map +1 -0
  255. package/packages/core/dist/server/parser.js +6 -0
  256. package/packages/core/dist/server/parser.js.map +1 -0
  257. package/packages/core/dist/server/paths.d.ts +37 -0
  258. package/packages/core/dist/server/paths.d.ts.map +1 -0
  259. package/packages/core/dist/server/paths.js +227 -0
  260. package/packages/core/dist/server/paths.js.map +1 -0
  261. package/packages/core/dist/server/pennyfarthing.d.ts +56 -0
  262. package/packages/core/dist/server/pennyfarthing.d.ts.map +1 -0
  263. package/packages/core/dist/server/pennyfarthing.js +356 -0
  264. package/packages/core/dist/server/pennyfarthing.js.map +1 -0
  265. package/packages/core/dist/server/plugin-loader.d.ts +22 -0
  266. package/packages/core/dist/server/plugin-loader.d.ts.map +1 -0
  267. package/packages/core/dist/server/plugin-loader.js +67 -0
  268. package/packages/core/dist/server/plugin-loader.js.map +1 -0
  269. package/packages/core/dist/server/prime.d.ts +12 -0
  270. package/packages/core/dist/server/prime.d.ts.map +1 -0
  271. package/packages/core/dist/server/prime.js +8 -0
  272. package/packages/core/dist/server/prime.js.map +1 -0
  273. package/packages/core/dist/server/server.d.ts +47 -0
  274. package/packages/core/dist/server/server.d.ts.map +1 -0
  275. package/packages/core/dist/server/server.js +353 -0
  276. package/packages/core/dist/server/server.js.map +1 -0
  277. package/packages/core/dist/server/server.test.d.ts +26 -0
  278. package/packages/core/dist/server/server.test.d.ts.map +1 -0
  279. package/packages/core/dist/server/server.test.js +447 -0
  280. package/packages/core/dist/server/server.test.js.map +1 -0
  281. package/packages/core/dist/server/settings-store.d.ts +195 -0
  282. package/packages/core/dist/server/settings-store.d.ts.map +1 -0
  283. package/packages/core/dist/server/settings-store.js +398 -0
  284. package/packages/core/dist/server/settings-store.js.map +1 -0
  285. package/packages/core/dist/server/settings.d.ts +136 -0
  286. package/packages/core/dist/server/settings.d.ts.map +1 -0
  287. package/packages/core/dist/server/settings.js +417 -0
  288. package/packages/core/dist/server/settings.js.map +1 -0
  289. package/packages/core/dist/server/span-hierarchy.d.ts +5 -0
  290. package/packages/core/dist/server/span-hierarchy.d.ts.map +1 -0
  291. package/packages/core/dist/server/span-hierarchy.js +5 -0
  292. package/packages/core/dist/server/span-hierarchy.js.map +1 -0
  293. package/packages/core/dist/server/story-context.d.ts +5 -0
  294. package/packages/core/dist/server/story-context.d.ts.map +1 -0
  295. package/packages/core/dist/server/story-context.js +5 -0
  296. package/packages/core/dist/server/story-context.js.map +1 -0
  297. package/packages/core/dist/server/story-parser.d.ts +74 -0
  298. package/packages/core/dist/server/story-parser.d.ts.map +1 -0
  299. package/packages/core/dist/server/story-parser.js +748 -0
  300. package/packages/core/dist/server/story-parser.js.map +1 -0
  301. package/packages/core/dist/server/tdd-metrics.d.ts +5 -0
  302. package/packages/core/dist/server/tdd-metrics.d.ts.map +1 -0
  303. package/packages/core/dist/server/tdd-metrics.js +5 -0
  304. package/packages/core/dist/server/tdd-metrics.js.map +1 -0
  305. package/packages/core/dist/server/ui-build.test.d.ts +19 -0
  306. package/packages/core/dist/server/ui-build.test.d.ts.map +1 -0
  307. package/packages/core/dist/server/ui-build.test.js +152 -0
  308. package/packages/core/dist/server/ui-build.test.js.map +1 -0
  309. package/packages/core/dist/server/websocket.d.ts +7 -0
  310. package/packages/core/dist/server/websocket.d.ts.map +1 -0
  311. package/packages/core/dist/server/websocket.js +8 -0
  312. package/packages/core/dist/server/websocket.js.map +1 -0
  313. package/packages/core/dist/shared/browser.d.ts +6 -0
  314. package/packages/core/dist/shared/browser.d.ts.map +1 -0
  315. package/packages/core/dist/shared/browser.js +8 -0
  316. package/packages/core/dist/shared/browser.js.map +1 -0
  317. package/packages/core/dist/shared/generate-skill-docs.d.ts +35 -0
  318. package/packages/core/dist/shared/generate-skill-docs.d.ts.map +1 -0
  319. package/packages/core/dist/shared/generate-skill-docs.js +442 -0
  320. package/packages/core/dist/shared/generate-skill-docs.js.map +1 -0
  321. package/packages/core/dist/shared/generate-skill-docs.test.d.ts +13 -0
  322. package/packages/core/dist/shared/generate-skill-docs.test.d.ts.map +1 -0
  323. package/packages/core/dist/shared/generate-skill-docs.test.js +519 -0
  324. package/packages/core/dist/shared/generate-skill-docs.test.js.map +1 -0
  325. package/packages/core/dist/shared/index.d.ts +11 -0
  326. package/packages/core/dist/shared/index.d.ts.map +1 -0
  327. package/packages/core/dist/shared/index.js +13 -0
  328. package/packages/core/dist/shared/index.js.map +1 -0
  329. package/packages/core/dist/shared/marker/constants.d.ts +39 -0
  330. package/packages/core/dist/shared/marker/constants.d.ts.map +1 -0
  331. package/packages/core/dist/shared/marker/constants.js +46 -0
  332. package/packages/core/dist/shared/marker/constants.js.map +1 -0
  333. package/packages/core/dist/shared/marker/continue.test.d.ts +12 -0
  334. package/packages/core/dist/shared/marker/continue.test.d.ts.map +1 -0
  335. package/packages/core/dist/shared/marker/continue.test.js +76 -0
  336. package/packages/core/dist/shared/marker/continue.test.js.map +1 -0
  337. package/packages/core/dist/shared/marker/detect.d.ts +25 -0
  338. package/packages/core/dist/shared/marker/detect.d.ts.map +1 -0
  339. package/packages/core/dist/shared/marker/detect.js +53 -0
  340. package/packages/core/dist/shared/marker/detect.js.map +1 -0
  341. package/packages/core/dist/shared/marker/detect.test.d.ts +10 -0
  342. package/packages/core/dist/shared/marker/detect.test.d.ts.map +1 -0
  343. package/packages/core/dist/shared/marker/detect.test.js +418 -0
  344. package/packages/core/dist/shared/marker/detect.test.js.map +1 -0
  345. package/packages/core/dist/shared/marker/index.d.ts +14 -0
  346. package/packages/core/dist/shared/marker/index.d.ts.map +1 -0
  347. package/packages/core/dist/shared/marker/index.js +15 -0
  348. package/packages/core/dist/shared/marker/index.js.map +1 -0
  349. package/packages/core/dist/shared/marker/strip.d.ts +26 -0
  350. package/packages/core/dist/shared/marker/strip.d.ts.map +1 -0
  351. package/packages/core/dist/shared/marker/strip.js +39 -0
  352. package/packages/core/dist/shared/marker/strip.js.map +1 -0
  353. package/packages/core/dist/shared/marker/types.d.ts +23 -0
  354. package/packages/core/dist/shared/marker/types.d.ts.map +1 -0
  355. package/packages/core/dist/shared/marker/types.js +7 -0
  356. package/packages/core/dist/shared/marker/types.js.map +1 -0
  357. package/packages/core/dist/shared/migrate-theme-schema.test.d.ts +8 -0
  358. package/packages/core/dist/shared/migrate-theme-schema.test.d.ts.map +1 -0
  359. package/packages/core/dist/shared/migrate-theme-schema.test.js +100 -0
  360. package/packages/core/dist/shared/migrate-theme-schema.test.js.map +1 -0
  361. package/packages/core/dist/shared/portrait-resolver.d.ts +35 -0
  362. package/packages/core/dist/shared/portrait-resolver.d.ts.map +1 -0
  363. package/packages/core/dist/shared/portrait-resolver.js +259 -0
  364. package/packages/core/dist/shared/portrait-resolver.js.map +1 -0
  365. package/packages/core/dist/shared/portrait-resolver.test.d.ts +2 -0
  366. package/packages/core/dist/shared/portrait-resolver.test.d.ts.map +1 -0
  367. package/packages/core/dist/shared/portrait-resolver.test.js +157 -0
  368. package/packages/core/dist/shared/portrait-resolver.test.js.map +1 -0
  369. package/packages/core/dist/shared/repos-topology.d.ts +49 -0
  370. package/packages/core/dist/shared/repos-topology.d.ts.map +1 -0
  371. package/packages/core/dist/shared/repos-topology.js +101 -0
  372. package/packages/core/dist/shared/repos-topology.js.map +1 -0
  373. package/packages/core/dist/shared/repos-topology.test.d.ts +8 -0
  374. package/packages/core/dist/shared/repos-topology.test.d.ts.map +1 -0
  375. package/packages/core/dist/shared/repos-topology.test.js +250 -0
  376. package/packages/core/dist/shared/repos-topology.test.js.map +1 -0
  377. package/packages/core/dist/shared/skill-search.d.ts +36 -0
  378. package/packages/core/dist/shared/skill-search.d.ts.map +1 -0
  379. package/packages/core/dist/shared/skill-search.js +300 -0
  380. package/packages/core/dist/shared/skill-search.js.map +1 -0
  381. package/packages/core/dist/shared/skill-search.test.d.ts +16 -0
  382. package/packages/core/dist/shared/skill-search.test.d.ts.map +1 -0
  383. package/packages/core/dist/shared/skill-search.test.js +177 -0
  384. package/packages/core/dist/shared/skill-search.test.js.map +1 -0
  385. package/packages/core/dist/shared/skill-suggest.d.ts +76 -0
  386. package/packages/core/dist/shared/skill-suggest.d.ts.map +1 -0
  387. package/packages/core/dist/shared/skill-suggest.js +256 -0
  388. package/packages/core/dist/shared/skill-suggest.js.map +1 -0
  389. package/packages/core/dist/shared/skill-suggest.test.d.ts +12 -0
  390. package/packages/core/dist/shared/skill-suggest.test.d.ts.map +1 -0
  391. package/packages/core/dist/shared/skill-suggest.test.js +257 -0
  392. package/packages/core/dist/shared/skill-suggest.test.js.map +1 -0
  393. package/packages/core/dist/shared/theme-loader.d.ts +81 -0
  394. package/packages/core/dist/shared/theme-loader.d.ts.map +1 -0
  395. package/packages/core/dist/shared/theme-loader.js +491 -0
  396. package/packages/core/dist/shared/theme-loader.js.map +1 -0
  397. package/packages/core/dist/shared/theme-loader.test.d.ts +8 -0
  398. package/packages/core/dist/shared/theme-loader.test.d.ts.map +1 -0
  399. package/packages/core/dist/shared/theme-loader.test.js +62 -0
  400. package/packages/core/dist/shared/theme-loader.test.js.map +1 -0
  401. package/packages/core/dist/workflow/context-watch.test.js +1 -1
  402. package/packages/core/dist/workflow/context-watch.test.js.map +1 -1
  403. package/packages/core/dist/workflow/variable-resolver.test.js +1 -1
  404. package/packages/core/dist/workflow/variable-resolver.test.js.map +1 -1
  405. package/packages/core/dist/workflow/workflow-migration.test.js +4 -3
  406. package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -1
  407. package/pennyfarthing-dist/agents/architect.md +1 -2
  408. package/pennyfarthing-dist/agents/ba.md +1 -1
  409. package/pennyfarthing-dist/agents/dev.md +2 -3
  410. package/pennyfarthing-dist/agents/devops.md +1 -1
  411. package/pennyfarthing-dist/agents/orchestrator.md +2 -3
  412. package/pennyfarthing-dist/agents/pm.md +2 -2
  413. package/pennyfarthing-dist/agents/reviewer.md +2 -2
  414. package/pennyfarthing-dist/agents/sm-setup.md +7 -7
  415. package/pennyfarthing-dist/agents/sm.md +19 -18
  416. package/pennyfarthing-dist/agents/tea.md +3 -2
  417. package/pennyfarthing-dist/agents/tech-writer.md +1 -1
  418. package/pennyfarthing-dist/agents/ux-designer.md +0 -1
  419. package/pennyfarthing-dist/commands/benchmark-control.md +69 -0
  420. package/pennyfarthing-dist/commands/benchmark.md +485 -0
  421. package/pennyfarthing-dist/commands/job-fair.md +102 -0
  422. package/pennyfarthing-dist/commands/{close-epic.md → pf-close-epic.md} +1 -1
  423. package/pennyfarthing-dist/commands/{new-work.md → pf-new-work.md} +4 -4
  424. package/pennyfarthing-dist/commands/{party-mode.md → pf-party-mode.md} +15 -2
  425. package/pennyfarthing-dist/commands/{patch.md → pf-patch.md} +3 -3
  426. package/pennyfarthing-dist/commands/{release.md → pf-release.md} +17 -10
  427. package/pennyfarthing-dist/commands/{setup.md → pf-setup.md} +2 -2
  428. package/pennyfarthing-dist/commands/{sprint.md → pf-sprint.md} +19 -19
  429. package/pennyfarthing-dist/commands/{standalone.md → pf-standalone.md} +2 -2
  430. package/pennyfarthing-dist/commands/{workflow.md → pf-workflow.md} +7 -7
  431. package/pennyfarthing-dist/commands/solo.md +447 -0
  432. package/pennyfarthing-dist/guides/agent-behavior.md +2 -2
  433. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +1 -2
  434. package/pennyfarthing-dist/guides/agent-template-strategic.md +1 -1
  435. package/pennyfarthing-dist/guides/agent-template-tactical.md +2 -2
  436. package/pennyfarthing-dist/guides/bikelane.md +6 -6
  437. package/pennyfarthing-dist/guides/permission-protocol.md +1 -1
  438. package/pennyfarthing-dist/guides/scale-levels.md +2 -2
  439. package/pennyfarthing-dist/guides/skill-schema.md +9 -9
  440. package/pennyfarthing-dist/guides/xml-tags.md +2 -2
  441. package/pennyfarthing-dist/personas/themes/dune.yaml +0 -1
  442. package/pennyfarthing-dist/personas/themes/hogans-heroes.yaml +260 -0
  443. package/pennyfarthing-dist/personas/themes/monty-python.yaml +312 -0
  444. package/pennyfarthing-dist/personas/themes/stephen-king.yaml +260 -0
  445. package/pennyfarthing-dist/scripts/core/agent-session.sh +0 -0
  446. package/pennyfarthing-dist/scripts/core/check-context.sh +0 -0
  447. package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -0
  448. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +0 -0
  449. package/pennyfarthing-dist/scripts/core/prime.sh +0 -0
  450. package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -0
  451. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +0 -0
  452. package/pennyfarthing-dist/scripts/git/git-status-all.sh +0 -0
  453. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +84 -21
  454. package/pennyfarthing-dist/scripts/git/release.sh +0 -0
  455. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +0 -0
  456. package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -0
  457. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +0 -0
  458. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -0
  459. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -0
  460. package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  461. package/pennyfarthing-dist/scripts/hooks/dispatcher-template.sh +45 -0
  462. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -0
  463. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -0
  464. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +27 -2
  465. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
  466. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -0
  467. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -0
  468. package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -0
  469. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -0
  470. package/pennyfarthing-dist/scripts/hooks/session-start.sh +25 -89
  471. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -0
  472. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -0
  473. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +0 -0
  474. package/pennyfarthing-dist/scripts/jira/README.md +1 -1
  475. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +0 -0
  476. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +0 -0
  477. package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -0
  478. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +0 -0
  479. package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -0
  480. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -0
  481. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -0
  482. package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -0
  483. package/pennyfarthing-dist/scripts/lib/common.sh +0 -0
  484. package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -0
  485. package/pennyfarthing-dist/scripts/lib/logging.sh +0 -0
  486. package/pennyfarthing-dist/scripts/lib/retry.sh +0 -0
  487. package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -0
  488. package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -0
  489. package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -0
  490. package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -0
  491. package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -0
  492. package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -0
  493. package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -0
  494. package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -0
  495. package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -0
  496. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -0
  497. package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -0
  498. package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -0
  499. package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -0
  500. package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -0
  501. package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -0
  502. package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -0
  503. package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -0
  504. package/pennyfarthing-dist/scripts/misc/statusline.sh +0 -0
  505. package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -0
  506. package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +0 -0
  507. package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +50 -26
  508. package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +18 -6
  509. package/pennyfarthing-dist/scripts/sprint/README.md +1 -1
  510. package/pennyfarthing-dist/scripts/story/README.md +1 -1
  511. package/pennyfarthing-dist/scripts/story/create-story.sh +0 -0
  512. package/pennyfarthing-dist/scripts/story/size-story.sh +0 -0
  513. package/pennyfarthing-dist/scripts/story/story-template.sh +0 -0
  514. package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
  515. package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -0
  516. package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -0
  517. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +0 -0
  518. package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -0
  519. package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -0
  520. package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -0
  521. package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -0
  522. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -0
  523. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +0 -0
  524. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -0
  525. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -0
  526. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
  527. package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -0
  528. package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -0
  529. package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -0
  530. package/pennyfarthing-dist/scripts/workflow/README.md +1 -1
  531. package/pennyfarthing-dist/scripts/workflow/check.py +0 -0
  532. package/pennyfarthing-dist/scripts/workflow/check.sh +0 -0
  533. package/pennyfarthing-dist/scripts/workflow/complete-step.py +0 -0
  534. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +0 -0
  535. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +0 -0
  536. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -0
  537. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +0 -0
  538. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +0 -0
  539. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +0 -0
  540. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +0 -0
  541. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +0 -0
  542. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +0 -0
  543. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +0 -0
  544. package/pennyfarthing-dist/skills/pf-bc/examples.md +83 -0
  545. package/pennyfarthing-dist/skills/pf-bc/skill.md +51 -0
  546. package/pennyfarthing-dist/skills/pf-bc/usage.md +113 -0
  547. package/pennyfarthing-dist/skills/{cyclist → pf-cyclist}/SKILL.md +5 -5
  548. package/pennyfarthing-dist/skills/pf-finalize-run/SKILL.md +261 -0
  549. package/pennyfarthing-dist/skills/pf-jira/SKILL.md +61 -0
  550. package/pennyfarthing-dist/skills/pf-jira/examples.md +163 -0
  551. package/pennyfarthing-dist/skills/pf-jira/usage.md +213 -0
  552. package/pennyfarthing-dist/skills/pf-judge/SKILL.md +644 -0
  553. package/pennyfarthing-dist/skills/{just → pf-just}/SKILL.md +23 -23
  554. package/pennyfarthing-dist/skills/{permissions → pf-permissions}/skill.md +8 -8
  555. package/pennyfarthing-dist/skills/pf-persona-benchmark/SKILL.md +187 -0
  556. package/pennyfarthing-dist/skills/pf-sprint/examples.md +189 -0
  557. package/pennyfarthing-dist/skills/pf-sprint/skill.md +85 -0
  558. package/pennyfarthing-dist/skills/pf-sprint/usage.md +293 -0
  559. package/pennyfarthing-dist/skills/{story → pf-story}/scripts/create-story.sh +0 -0
  560. package/pennyfarthing-dist/skills/{story → pf-story}/scripts/size-story.sh +0 -0
  561. package/pennyfarthing-dist/skills/{story → pf-story}/scripts/story-template.sh +0 -0
  562. package/pennyfarthing-dist/skills/pf-story/skill.md +27 -0
  563. package/pennyfarthing-dist/skills/{systematic-debugging → pf-systematic-debugging}/SKILL.md +5 -6
  564. package/pennyfarthing-dist/skills/pf-theme/examples.md +92 -0
  565. package/pennyfarthing-dist/skills/pf-theme/skill.md +42 -0
  566. package/pennyfarthing-dist/skills/pf-theme/usage.md +149 -0
  567. package/pennyfarthing-dist/skills/pf-workflow/examples.md +101 -0
  568. package/pennyfarthing-dist/skills/{workflow → pf-workflow}/scripts/list-workflows.sh +0 -0
  569. package/pennyfarthing-dist/skills/{workflow → pf-workflow}/scripts/resume-workflow.sh +0 -0
  570. package/pennyfarthing-dist/skills/{workflow → pf-workflow}/scripts/show-workflow.sh +0 -0
  571. package/pennyfarthing-dist/skills/{workflow → pf-workflow}/scripts/start-workflow.sh +0 -0
  572. package/pennyfarthing-dist/skills/{workflow → pf-workflow}/scripts/workflow-status.sh +0 -0
  573. package/pennyfarthing-dist/skills/pf-workflow/skill.md +49 -0
  574. package/pennyfarthing-dist/skills/pf-workflow/usage.md +145 -0
  575. package/pennyfarthing-dist/skills/skill-registry.yaml +63 -81
  576. package/pennyfarthing-dist/workflows/architecture/data/domain-complexity.csv +13 -0
  577. package/pennyfarthing-dist/workflows/architecture/data/project-types.csv +7 -0
  578. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +40 -11
  579. package/pennyfarthing-dist/workflows/party-mode-roleplay/steps/step-01-agent-loading.md +99 -0
  580. package/pennyfarthing-dist/workflows/party-mode-roleplay/steps/step-02-discussion.md +130 -0
  581. package/pennyfarthing-dist/workflows/party-mode-roleplay/steps/step-03-exit.md +100 -0
  582. package/pennyfarthing-dist/workflows/party-mode-roleplay/workflow.yaml +62 -0
  583. package/pennyfarthing-dist/workflows/prd/data/domain-complexity.csv +2 -0
  584. package/pennyfarthing-dist/workflows/prd/data/prd-purpose.md +2 -0
  585. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +16 -0
  586. package/pennyfarthing-dist/workflows/project-setup/steps/step-04-claude-md.md +3 -3
  587. package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +193 -0
  588. package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +148 -0
  589. package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +141 -0
  590. package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +192 -0
  591. package/pennyfarthing-dist/workflows/quick-spec/tech-spec-template.md +74 -0
  592. package/pennyfarthing-dist/workflows/quick-spec/workflow.yaml +35 -0
  593. package/pennyfarthing-dist/workflows/release/steps/step-01-preflight.md +42 -3
  594. package/pennyfarthing-dist/workflows/release/steps/step-02-bump.md +10 -3
  595. package/pennyfarthing-dist/workflows/release/steps/step-03-changelog.md +1 -1
  596. package/pennyfarthing-dist/workflows/release/steps/step-07-commit.md +13 -4
  597. package/pennyfarthing-dist/workflows/release/steps/step-08-merge.md +31 -6
  598. package/pennyfarthing-dist/workflows/release/steps/step-09-push.md +12 -6
  599. package/pennyfarthing-dist/workflows/release/steps/step-10-publish.md +30 -5
  600. package/pennyfarthing-dist/workflows/release/steps/step-11-finalize.md +29 -0
  601. package/pennyfarthing-dist/workflows/release.yaml +7 -0
  602. package/pennyfarthing_scripts/CLAUDE.md +182 -0
  603. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  604. package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
  605. package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  606. package/pennyfarthing_scripts/bc/__init__.py +1 -0
  607. package/pennyfarthing_scripts/bc/__pycache__/__init__.cpython-314.pyc +0 -0
  608. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
  609. package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
  610. package/pennyfarthing_scripts/bc/cli.py +223 -0
  611. package/pennyfarthing_scripts/bc/focus.py +333 -0
  612. package/pennyfarthing_scripts/bikerack/__init__.py +8 -0
  613. package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
  614. package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  615. package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  616. package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  617. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  618. package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  619. package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  620. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  621. package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  622. package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  623. package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  624. package/pennyfarthing_scripts/bikerack/background_panel.py +81 -0
  625. package/pennyfarthing_scripts/bikerack/base_panel.py +100 -0
  626. package/pennyfarthing_scripts/bikerack/changed_panel.py +105 -0
  627. package/pennyfarthing_scripts/bikerack/cli.py +22 -24
  628. package/pennyfarthing_scripts/bikerack/diffs_panel.py +146 -0
  629. package/pennyfarthing_scripts/bikerack/git_panel.py +69 -0
  630. package/pennyfarthing_scripts/bikerack/launcher.py +63 -4
  631. package/pennyfarthing_scripts/bikerack/sprint_panel.py +72 -0
  632. package/pennyfarthing_scripts/bikerack/tui.py +193 -0
  633. package/pennyfarthing_scripts/bikerack/ws_client.py +176 -0
  634. package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  635. package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  636. package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  637. package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  638. package/pennyfarthing_scripts/cli.py +60 -16
  639. package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
  640. package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  641. package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  642. package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  643. package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  644. package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  645. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  646. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  647. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  648. package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  649. package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  650. package/pennyfarthing_scripts/healthscore/analyze.py +15 -1
  651. package/pennyfarthing_scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  652. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  653. package/pennyfarthing_scripts/jira/cli.py +10 -2
  654. package/pennyfarthing_scripts/launch/__init__.py +1 -0
  655. package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-314.pyc +0 -0
  656. package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-314.pyc +0 -0
  657. package/pennyfarthing_scripts/launch/cli.py +231 -0
  658. package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  659. package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  660. package/pennyfarthing_scripts/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
  661. package/pennyfarthing_scripts/prime/version_sentinel.py +0 -1
  662. package/pennyfarthing_scripts/session_start_hook.py +192 -0
  663. package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  664. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  665. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  666. package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  667. package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
  668. package/pennyfarthing_scripts/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
  669. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  670. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  671. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  672. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  673. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  674. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  675. package/pennyfarthing_scripts/sprint/archive_epic.py +109 -1
  676. package/pennyfarthing_scripts/sprint/cli.py +30 -9
  677. package/pennyfarthing_scripts/sprint/epic_add.py +7 -1
  678. package/pennyfarthing_scripts/sprint/epic_update.py +148 -0
  679. package/pennyfarthing_scripts/sprint/loader.py +33 -0
  680. package/pennyfarthing_scripts/sprint/story_add.py +11 -1
  681. package/pennyfarthing_scripts/sprint/story_finish.py +14 -10
  682. package/pennyfarthing_scripts/sprint/story_update.py +7 -0
  683. package/pennyfarthing_scripts/sprint/validate_cmd.py +2 -1
  684. package/pennyfarthing_scripts/sprint/yaml_io.py +64 -6
  685. package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
  686. package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
  687. package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
  688. package/pennyfarthing_scripts/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
  689. package/pennyfarthing_scripts/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
  690. package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  691. package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  692. package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  693. package/pennyfarthing_scripts/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
  694. package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
  695. package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  696. package/pennyfarthing_scripts/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
  697. package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  698. package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
  699. package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  700. package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  701. package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  702. package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  703. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  704. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  705. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  706. package/pennyfarthing_scripts/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
  707. package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  708. package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
  709. package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  710. package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  711. package/pennyfarthing_scripts/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
  712. package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
  713. package/pennyfarthing_scripts/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
  714. package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
  715. package/pennyfarthing_scripts/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
  716. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  717. package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  718. package/pennyfarthing_scripts/tests/test_archive_epic.py +185 -0
  719. package/pennyfarthing_scripts/tests/test_bc.py +490 -0
  720. package/pennyfarthing_scripts/tests/test_cli_normalization.py +295 -0
  721. package/pennyfarthing_scripts/tests/test_sprint_panel.py +531 -0
  722. package/pennyfarthing_scripts/tests/test_tui_focus.py +411 -0
  723. package/pennyfarthing_scripts/tests/test_tui_panel_persistence.py +411 -0
  724. package/pennyfarthing_scripts/tests/test_version_sentinel.py +1 -5
  725. package/pennyfarthing_scripts/tests/test_yaml_io.py +5 -5
  726. package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
  727. package/pennyfarthing_scripts/theme/cli.py +25 -2
  728. package/scripts/README.md +41 -0
  729. package/packages/core/dist/scripts/benchmark-integration.test.d.ts +0 -13
  730. package/packages/core/dist/scripts/benchmark-integration.test.d.ts.map +0 -1
  731. package/packages/core/dist/scripts/benchmark-integration.test.js +0 -680
  732. package/packages/core/dist/scripts/benchmark-integration.test.js.map +0 -1
  733. package/packages/core/dist/scripts/debugging-scenarios.test.d.ts +0 -18
  734. package/packages/core/dist/scripts/debugging-scenarios.test.d.ts.map +0 -1
  735. package/packages/core/dist/scripts/debugging-scenarios.test.js +0 -317
  736. package/packages/core/dist/scripts/debugging-scenarios.test.js.map +0 -1
  737. package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts +0 -14
  738. package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts.map +0 -1
  739. package/packages/core/dist/scripts/job-fair-aggregator.test.js +0 -616
  740. package/packages/core/dist/scripts/job-fair-aggregator.test.js.map +0 -1
  741. package/packages/core/dist/scripts/theme-detail.test.d.ts +0 -10
  742. package/packages/core/dist/scripts/theme-detail.test.js +0 -199
  743. package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +0 -392
  744. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +0 -461
  745. package/pennyfarthing-dist/skills/jira/SKILL.md +0 -207
  746. package/pennyfarthing-dist/skills/sprint/skill.md +0 -806
  747. package/pennyfarthing-dist/skills/story/skill.md +0 -27
  748. package/pennyfarthing-dist/skills/theme/skill.md +0 -356
  749. package/pennyfarthing-dist/skills/workflow/skill.md +0 -368
  750. /package/pennyfarthing-dist/commands/{architect.md → pf-architect.md} +0 -0
  751. /package/pennyfarthing-dist/commands/{ba.md → pf-ba.md} +0 -0
  752. /package/pennyfarthing-dist/commands/{brainstorming.md → pf-brainstorming.md} +0 -0
  753. /package/pennyfarthing-dist/commands/{check.md → pf-check.md} +0 -0
  754. /package/pennyfarthing-dist/commands/{chore.md → pf-chore.md} +0 -0
  755. /package/pennyfarthing-dist/commands/{continue-session.md → pf-continue-session.md} +0 -0
  756. /package/pennyfarthing-dist/commands/{create-branches-from-story.md → pf-create-branches-from-story.md} +0 -0
  757. /package/pennyfarthing-dist/commands/{create-theme.md → pf-create-theme.md} +0 -0
  758. /package/pennyfarthing-dist/commands/{dev.md → pf-dev.md} +0 -0
  759. /package/pennyfarthing-dist/commands/{devops.md → pf-devops.md} +0 -0
  760. /package/pennyfarthing-dist/commands/{fix-blocker.md → pf-fix-blocker.md} +0 -0
  761. /package/pennyfarthing-dist/commands/{git-cleanup.md → pf-git-cleanup.md} +0 -0
  762. /package/pennyfarthing-dist/commands/{health-check.md → pf-health-check.md} +0 -0
  763. /package/pennyfarthing-dist/commands/{help.md → pf-help.md} +0 -0
  764. /package/pennyfarthing-dist/commands/{list-themes.md → pf-list-themes.md} +0 -0
  765. /package/pennyfarthing-dist/commands/{orchestrator.md → pf-orchestrator.md} +0 -0
  766. /package/pennyfarthing-dist/commands/{parallel-work.md → pf-parallel-work.md} +0 -0
  767. /package/pennyfarthing-dist/commands/{permissions.md → pf-permissions.md} +0 -0
  768. /package/pennyfarthing-dist/commands/{pm.md → pf-pm.md} +0 -0
  769. /package/pennyfarthing-dist/commands/{prime.md → pf-prime.md} +0 -0
  770. /package/pennyfarthing-dist/commands/{repo-status.md → pf-repo-status.md} +0 -0
  771. /package/pennyfarthing-dist/commands/{retro.md → pf-retro.md} +0 -0
  772. /package/pennyfarthing-dist/commands/{reviewer.md → pf-reviewer.md} +0 -0
  773. /package/pennyfarthing-dist/commands/{run-ci.md → pf-run-ci.md} +0 -0
  774. /package/pennyfarthing-dist/commands/{set-theme.md → pf-set-theme.md} +0 -0
  775. /package/pennyfarthing-dist/commands/{show-theme.md → pf-show-theme.md} +0 -0
  776. /package/pennyfarthing-dist/commands/{sm.md → pf-sm.md} +0 -0
  777. /package/pennyfarthing-dist/commands/{sprint-planning.md → pf-sprint-planning.md} +0 -0
  778. /package/pennyfarthing-dist/commands/{start-epic.md → pf-start-epic.md} +0 -0
  779. /package/pennyfarthing-dist/commands/{sync-epic-to-jira.md → pf-sync-epic-to-jira.md} +0 -0
  780. /package/pennyfarthing-dist/commands/{sync-work-with-sprint.md → pf-sync-work-with-sprint.md} +0 -0
  781. /package/pennyfarthing-dist/commands/{tea.md → pf-tea.md} +0 -0
  782. /package/pennyfarthing-dist/commands/{tech-writer.md → pf-tech-writer.md} +0 -0
  783. /package/pennyfarthing-dist/commands/{theme-maker.md → pf-theme-maker.md} +0 -0
  784. /package/pennyfarthing-dist/commands/{theme.md → pf-theme.md} +0 -0
  785. /package/pennyfarthing-dist/commands/{update-domain-docs.md → pf-update-domain-docs.md} +0 -0
  786. /package/pennyfarthing-dist/commands/{ux-designer.md → pf-ux-designer.md} +0 -0
  787. /package/pennyfarthing-dist/commands/{work.md → pf-work.md} +0 -0
  788. /package/pennyfarthing-dist/skills/{agentic-patterns → pf-agentic-patterns}/SKILL.md +0 -0
  789. /package/pennyfarthing-dist/skills/{changelog → pf-changelog}/SKILL.md +0 -0
  790. /package/pennyfarthing-dist/skills/{code-review → pf-code-review}/SKILL.md +0 -0
  791. /package/pennyfarthing-dist/skills/{context-engineering → pf-context-engineering}/SKILL.md +0 -0
  792. /package/pennyfarthing-dist/skills/{mermaid → pf-mermaid}/SKILL.md +0 -0
  793. /package/pennyfarthing-dist/skills/{otel → pf-otel}/skill.md +0 -0
  794. /package/pennyfarthing-dist/skills/{testing → pf-testing}/SKILL.md +0 -0
  795. /package/pennyfarthing-dist/skills/{testing → pf-testing}/references/troubleshooting.md +0 -0
  796. /package/pennyfarthing-dist/skills/{theme-creation → pf-theme-creation}/SKILL.md +0 -0
  797. /package/pennyfarthing-dist/skills/{yq → pf-yq}/SKILL.md +0 -0
@@ -0,0 +1,748 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { parse as parseYaml } from 'yaml';
4
+ // Jira base URL for generating browse links
5
+ const JIRA_BASE_URL = 'https://1898andco.atlassian.net/browse';
6
+ // Generate Jira URL from key
7
+ function generateJiraUrl(jiraKey) {
8
+ if (!jiraKey || !jiraKey.startsWith('MSSCI-')) {
9
+ return null;
10
+ }
11
+ return `${JIRA_BASE_URL}/${jiraKey}`;
12
+ }
13
+ // Parse session file for story info
14
+ // projectDir is optional but required for dynamic workflow phase detection
15
+ export function parseSessionFile(content, projectDir) {
16
+ const result = {};
17
+ // MSSCI-12552: Extract from list-item format FIRST (SM setup session files)
18
+ // This is the most common format: - Story: MSSCI-12552
19
+ // Must be checked before header format to avoid matching documentation examples
20
+ const listStoryMatch = content.match(/^-\s*Story:\s*(.+)$/m);
21
+ if (listStoryMatch) {
22
+ result.id = listStoryMatch[1].trim();
23
+ }
24
+ // Extract title from list-item format: - Title: Some title here
25
+ const listTitleMatch = content.match(/^-\s*Title:\s*(.+)$/m);
26
+ if (listTitleMatch) {
27
+ result.title = listTitleMatch[1].trim();
28
+ }
29
+ // Fall back to header format if list format not found
30
+ // Formats supported:
31
+ // # Story 15-3: Title (colon separator)
32
+ // # Story 15-3 Session (with "Story" prefix)
33
+ // # MSSCI-12552 Session (new format - ID only, no "Story" prefix)
34
+ if (!result.id) {
35
+ const headerMatch = content.match(/^#\s*Story\s+([\w-]+):\s*(.+)$/m) ||
36
+ content.match(/^#\s*Story\s+([\w-]+)\s+Session$/m) ||
37
+ content.match(/^#\s+([\w-]+)\s+Session$/m);
38
+ if (headerMatch) {
39
+ result.id = headerMatch[1];
40
+ // For header format with title in same line
41
+ if (!result.title && headerMatch[2]) {
42
+ result.title = headerMatch[2].trim();
43
+ }
44
+ }
45
+ }
46
+ // Fallback: extract ID from **Story:** field if not found in header
47
+ if (!result.id) {
48
+ const storyFieldMatch = content.match(/\*\*Story:\*\*\s*([\w-]+)/);
49
+ if (storyFieldMatch) {
50
+ result.id = storyFieldMatch[1].trim();
51
+ }
52
+ }
53
+ // Try **Title:** field if still no title
54
+ if (!result.title) {
55
+ const boldTitleMatch = content.match(/\*\*Title:\*\*\s*(.+)$/m);
56
+ if (boldTitleMatch) {
57
+ result.title = boldTitleMatch[1].trim();
58
+ }
59
+ }
60
+ // Also extract from table format: | **Story** | MSSCI-12400 |
61
+ if (!result.id) {
62
+ const tableStoryMatch = content.match(/\|\s*\*?\*?Story\*?\*?\s*\|\s*([^|]+)/i);
63
+ if (tableStoryMatch) {
64
+ result.id = tableStoryMatch[1].trim();
65
+ }
66
+ }
67
+ // Extract title from table format: | **Title** | Some title |
68
+ if (!result.title) {
69
+ const tableTitleMatch = content.match(/\|\s*\*?\*?Title\*?\*?\s*\|\s*([^|]+)/i);
70
+ if (tableTitleMatch) {
71
+ result.title = tableTitleMatch[1].trim();
72
+ }
73
+ }
74
+ // Extract phase: **Phase:** dev or **Phase:** TEA (RED complete) -> Dev (GREEN)
75
+ // Also check table format: | Phase | dev | or | **Phase** | dev |
76
+ // Also check list-item format: - Phase: red (MSSCI-12552)
77
+ const phaseMatch = content.match(/\*\*Phase:\*\*\s*(\w+)/i) ||
78
+ content.match(/\|\s*\*?\*?Phase\*?\*?\s*\|\s*(\w+)/i) ||
79
+ content.match(/^-\s*Phase:\s*(\w+)/m);
80
+ if (phaseMatch) {
81
+ result.phase = phaseMatch[1].toLowerCase();
82
+ }
83
+ // Extract status: ## Status: IN_PROGRESS
84
+ const statusMatch = content.match(/##\s*Status:\s*(\S+)/i);
85
+ if (statusMatch) {
86
+ result.status = statusMatch[1].toLowerCase();
87
+ }
88
+ // Extract points: **Points:** 3
89
+ const pointsMatch = content.match(/\*\*Points:\*\*\s*(\d+)/);
90
+ if (pointsMatch) {
91
+ result.points = parseInt(pointsMatch[1], 10);
92
+ }
93
+ // Extract next agent from "Current Agent" table or "Handoff:" lines
94
+ // Table format: | Current Agent | Reviewer (handoff to SM) |
95
+ // Or from last "**Handoff:**" line
96
+ const currentAgentMatch = content.match(/\|\s*Current Agent\s*\|\s*([^|]+)/i);
97
+ if (currentAgentMatch) {
98
+ result.nextAgent = currentAgentMatch[1].trim();
99
+ }
100
+ else {
101
+ // Look for the last "Handoff:" line in the file
102
+ const handoffMatches = content.match(/\*\*Handoff:\*\*\s*(.+)$/gm);
103
+ if (handoffMatches && handoffMatches.length > 0) {
104
+ const lastHandoff = handoffMatches[handoffMatches.length - 1];
105
+ const handoffText = lastHandoff.replace(/\*\*Handoff:\*\*\s*/, '').trim();
106
+ result.nextAgent = handoffText;
107
+ }
108
+ }
109
+ // Extract branch from "## Branch" section, **Branch:** line, **Feature Branch:** line
110
+ // Also check list-item format: - Branch: feature/... (MSSCI-12552)
111
+ const branchMatch = content.match(/^##\s*Branch\s*\n`([^`]+)`/m) ||
112
+ content.match(/\*\*Feature Branch:\*\*\s*`?([^`\n]+)`?/) ||
113
+ content.match(/\*\*Branch:\*\*\s*`?([^`\n]+)`?/) ||
114
+ content.match(/^-\s*Branch:\s*(.+)$/m);
115
+ if (branchMatch) {
116
+ result.branch = branchMatch[1].trim();
117
+ }
118
+ // Extract PR number from **PR:** line
119
+ // Formats: **PR:** #32, **PR:** 32, **PR:** N/A, **PR:** #{number}
120
+ const prMatch = content.match(/\*\*PR:\*\*\s*#?(\d+)/);
121
+ if (prMatch) {
122
+ result.pr = prMatch[1];
123
+ }
124
+ // Parse workflow progress (uses projectDir for dynamic YAML-based phases)
125
+ result.workflow = parseWorkflowProgress(content, projectDir);
126
+ // MSSCI-14300: Detect workflow type from phase names
127
+ if (result.workflow && result.workflow.length > 0) {
128
+ const allStepped = result.workflow.every(p => p.name.startsWith('step-'));
129
+ result.workflowType = allStepped ? 'stepped' : 'phased';
130
+ }
131
+ // Parse acceptance criteria checkboxes
132
+ result.criteria = parseAcceptanceCriteria(content);
133
+ return result;
134
+ }
135
+ // Parse acceptance criteria checkboxes into structured data
136
+ export function parseAcceptanceCriteria(content) {
137
+ // Look for acceptance criteria section
138
+ const criteriaSection = content.match(/## Acceptance Criteria\n([\s\S]*?)(?=\n##|\n$|$)/);
139
+ if (!criteriaSection) {
140
+ return null;
141
+ }
142
+ const criteria = [];
143
+ const lines = criteriaSection[1].split('\n');
144
+ for (const line of lines) {
145
+ // Match checkbox items: - [ ] text or - [x] text or - [X] text
146
+ const match = line.match(/^- \[([ xX])\] (.+)$/);
147
+ if (match) {
148
+ const completed = match[1].toLowerCase() === 'x';
149
+ const text = match[2].trim();
150
+ criteria.push({ text, completed });
151
+ }
152
+ }
153
+ return criteria.length > 0 ? criteria : null;
154
+ }
155
+ // Parse workflow progress checkboxes into structured data
156
+ // If projectDir is provided, reads dynamic phases from workflow YAML
157
+ // Otherwise falls back to hardcoded TDD flow for backward compatibility
158
+ export function parseWorkflowProgress(content, projectDir) {
159
+ // Try to extract workflow name from session content
160
+ // Workflow names can contain hyphens (e.g., docs-only, custom-flow)
161
+ // Also check list-item format: - Workflow: tdd (MSSCI-12552)
162
+ const workflowMatch = content.match(/\*\*Workflow:\*\*\s*([\w-]+)/i) ||
163
+ content.match(/^-\s*Workflow:\s*([\w-]+)/m);
164
+ const workflowName = workflowMatch?.[1]?.toLowerCase();
165
+ // Try to extract current phase from session content
166
+ // Also check list-item format: - Phase: red (MSSCI-12552)
167
+ const phaseMatch = content.match(/\*\*Phase:\*\*\s*(\w+)/i) ||
168
+ content.match(/^-\s*Phase:\s*(\w+)/m);
169
+ const currentPhase = phaseMatch?.[1]?.toLowerCase();
170
+ // If projectDir provided and workflow specified, use dynamic phases
171
+ if (projectDir && workflowName) {
172
+ const phases = getWorkflowPhases(workflowName, projectDir);
173
+ if (phases) {
174
+ // For stepped workflows, derive status from Current Step and Steps Completed
175
+ const currentStepMatch = content.match(/\*\*Current Step:\*\*\s*(\d+)/i) ||
176
+ content.match(/^-\s*Current Step:\s*(\d+)/m);
177
+ if (currentStepMatch) {
178
+ const currentStep = parseInt(currentStepMatch[1], 10);
179
+ const completedMatch = content.match(/\*\*Steps Completed:\*\*\s*\[([^\]]*)\]/i) ||
180
+ content.match(/^-\s*Steps Completed:\s*\[([^\]]*)\]/m);
181
+ const completedSteps = new Set();
182
+ if (completedMatch && completedMatch[1].trim()) {
183
+ completedMatch[1].split(',').forEach(s => {
184
+ const n = parseInt(s.trim(), 10);
185
+ if (!isNaN(n))
186
+ completedSteps.add(n);
187
+ });
188
+ }
189
+ return phases.map((phase, index) => {
190
+ const stepNum = index + 1;
191
+ let status;
192
+ if (completedSteps.has(stepNum)) {
193
+ status = 'done';
194
+ }
195
+ else if (stepNum === currentStep) {
196
+ status = 'current';
197
+ }
198
+ else if (stepNum < currentStep) {
199
+ // Steps before current are implicitly done
200
+ status = 'done';
201
+ }
202
+ else {
203
+ status = 'pending';
204
+ }
205
+ return { ...phase, status };
206
+ });
207
+ }
208
+ // Fall back to phased workflow status resolution
209
+ return buildWorkflowWithStatus(phases, content, currentPhase);
210
+ }
211
+ }
212
+ // Fall back to checkbox-based parsing for backward compatibility
213
+ const workflowSection = content.match(/## Workflow Progress\n([\s\S]*?)(?=\n##|\n$|$)/);
214
+ if (!workflowSection) {
215
+ return null;
216
+ }
217
+ // Check for any workflow checkbox patterns (SM: or SM -)
218
+ const checkboxLines = workflowSection[1].match(/- \[\s*[xX\s]\s*\]\s*\w+\s*[:\-]/gi);
219
+ if (!checkboxLines || checkboxLines.length === 0) {
220
+ return null;
221
+ }
222
+ // Define the standard TDD flow agents
223
+ const agentOrder = ['sm', 'tea', 'dev', 'reviewer'];
224
+ const agentLabels = {
225
+ sm: 'SM',
226
+ tea: 'TEA',
227
+ dev: 'Dev',
228
+ reviewer: 'Reviewer'
229
+ };
230
+ // Track which agents are done
231
+ const agentStatus = {};
232
+ // Parse all checkbox lines to determine completion
233
+ // Supports both formats: "- [x] SM: ..." and "- [x] SM - ..."
234
+ const allLines = workflowSection[1].split('\n');
235
+ for (const line of allLines) {
236
+ const match = line.match(/- \[\s*([xX\s])\s*\]\s*(\w+)\s*[:\-]/i);
237
+ if (match) {
238
+ const isDone = match[1].toLowerCase() === 'x';
239
+ const agent = match[2].toLowerCase();
240
+ // An agent is "done" if ALL their checkboxes are checked
241
+ // For simplicity, mark done if any checkbox is checked
242
+ if (isDone) {
243
+ agentStatus[agent] = 'done';
244
+ }
245
+ else if (!agentStatus[agent]) {
246
+ agentStatus[agent] = 'pending';
247
+ }
248
+ }
249
+ }
250
+ // Build workflow array with current agent detection
251
+ const workflow = [];
252
+ let foundCurrent = false;
253
+ for (const agent of agentOrder) {
254
+ let status;
255
+ if (agentStatus[agent] === 'done') {
256
+ status = 'done';
257
+ }
258
+ else if (!foundCurrent) {
259
+ // First non-done agent is current
260
+ status = 'current';
261
+ foundCurrent = true;
262
+ }
263
+ else {
264
+ status = 'pending';
265
+ }
266
+ workflow.push({
267
+ name: agent, // Use agent as name for backward compat
268
+ agent,
269
+ label: agentLabels[agent],
270
+ status
271
+ });
272
+ }
273
+ return workflow;
274
+ }
275
+ // Build workflow phases with status based on session content
276
+ function buildWorkflowWithStatus(phases, content, currentPhase) {
277
+ // Parse Phase History table to determine which phases are complete
278
+ const completedPhases = new Set();
279
+ const historyMatch = content.match(/### Phase History\n[\s\S]*?\|[\s\S]*?\|[\s\S]*?\|([\s\S]*?)(?=\n##|\n$|$)/);
280
+ if (historyMatch) {
281
+ // Parse table rows to find completed phases (those with end time)
282
+ const rows = historyMatch[1].split('\n').filter(line => line.includes('|'));
283
+ for (const row of rows) {
284
+ const cols = row.split('|').map(c => c.trim());
285
+ // Format: | phase | started | ended | duration |
286
+ if (cols.length >= 4) {
287
+ const phaseName = cols[1]?.toLowerCase();
288
+ const ended = cols[3];
289
+ // Phase is complete if it has an end time (not '-' or empty)
290
+ if (phaseName && ended && ended !== '-' && ended !== '') {
291
+ completedPhases.add(phaseName);
292
+ }
293
+ }
294
+ }
295
+ }
296
+ // Find current phase index
297
+ let currentPhaseIndex = -1;
298
+ if (currentPhase) {
299
+ // Try to match by phase name first, then by agent name
300
+ currentPhaseIndex = phases.findIndex(p => p.name.toLowerCase() === currentPhase || p.agent.toLowerCase() === currentPhase);
301
+ }
302
+ // Build workflow with status
303
+ return phases.map((phase, index) => {
304
+ let status;
305
+ if (completedPhases.has(phase.name.toLowerCase())) {
306
+ status = 'done';
307
+ }
308
+ else if (index === currentPhaseIndex) {
309
+ status = 'current';
310
+ }
311
+ else if (currentPhaseIndex >= 0 && index < currentPhaseIndex) {
312
+ // Phases before current are done (even if not in history table)
313
+ status = 'done';
314
+ }
315
+ else {
316
+ status = 'pending';
317
+ }
318
+ return {
319
+ ...phase,
320
+ status
321
+ };
322
+ });
323
+ }
324
+ // Parse sprint YAML for progress
325
+ // Returns done points, remaining points, in-progress points, and end date
326
+ export function parseSprintYaml(content) {
327
+ try {
328
+ const data = parseYaml(content);
329
+ // Extract sprint number (either from sprint.number or sprint.name)
330
+ let sprintNumber = 0;
331
+ if (data?.sprint?.number) {
332
+ sprintNumber = data.sprint.number;
333
+ }
334
+ else if (data?.sprint?.name) {
335
+ const nameMatch = data.sprint.name.match(/(\d+)/);
336
+ sprintNumber = nameMatch ? parseInt(nameMatch[1], 10) : 0;
337
+ }
338
+ // No valid sprint data
339
+ if (!data?.sprint) {
340
+ return null;
341
+ }
342
+ // Calculate points by iterating over epics/stories
343
+ let donePoints = 0;
344
+ let remainingPoints = 0;
345
+ let inProgressPoints = 0;
346
+ if (data?.epics && Array.isArray(data.epics)) {
347
+ for (const epic of data.epics) {
348
+ if (epic?.stories && Array.isArray(epic.stories)) {
349
+ for (const story of epic.stories) {
350
+ const points = story?.points && typeof story.points === 'number' ? story.points : 0;
351
+ const status = story?.status || 'backlog';
352
+ const isDone = status === 'done' || status === 'completed';
353
+ const isTodo = status === 'backlog' || status === 'ready' || status === null;
354
+ if (isDone) {
355
+ donePoints += points;
356
+ }
357
+ else if (status === 'in_progress') {
358
+ inProgressPoints += points;
359
+ }
360
+ else if (isTodo) {
361
+ remainingPoints += points;
362
+ }
363
+ }
364
+ }
365
+ }
366
+ }
367
+ // Stories are the source of truth - calculated values above are authoritative
368
+ // (Summary header values may be stale)
369
+ return {
370
+ number: sprintNumber,
371
+ done: donePoints,
372
+ remaining: remainingPoints,
373
+ inProgress: inProgressPoints,
374
+ endDate: data.sprint.end_date || null,
375
+ };
376
+ }
377
+ catch {
378
+ // Malformed YAML
379
+ }
380
+ return null;
381
+ }
382
+ // MSSCI-12475: Parse sprint YAML to get all stories from all epics
383
+ export function getSprintStories(sprintContent) {
384
+ try {
385
+ const data = parseYaml(sprintContent);
386
+ if (!data?.epics || !Array.isArray(data.epics)) {
387
+ return [];
388
+ }
389
+ const stories = [];
390
+ for (const epic of data.epics) {
391
+ if (epic?.stories && Array.isArray(epic.stories)) {
392
+ for (const story of epic.stories) {
393
+ const storyId = story?.id || '';
394
+ // Determine Jira key - use story ID if it looks like a Jira key
395
+ const jiraKey = storyId.startsWith('MSSCI-') ? storyId : null;
396
+ stories.push({
397
+ id: storyId,
398
+ title: story?.title || '',
399
+ points: typeof story?.points === 'number' ? story.points : 0,
400
+ status: normalizeStoryStatus(story?.status),
401
+ jiraKey,
402
+ jiraUrl: generateJiraUrl(jiraKey),
403
+ });
404
+ }
405
+ }
406
+ }
407
+ return stories;
408
+ }
409
+ catch {
410
+ // Malformed YAML
411
+ return null;
412
+ }
413
+ }
414
+ // MSSCI-12475: Get epic context for a specific story
415
+ export function getEpicContext(sprintContent, storyId) {
416
+ try {
417
+ const data = parseYaml(sprintContent);
418
+ if (!data?.epics || !Array.isArray(data.epics)) {
419
+ return null;
420
+ }
421
+ // Find the epic containing this story
422
+ for (const epic of data.epics) {
423
+ if (!epic?.stories || !Array.isArray(epic.stories)) {
424
+ continue;
425
+ }
426
+ const storyInEpic = epic.stories.find((s) => s?.id === storyId);
427
+ if (storyInEpic) {
428
+ // Found the epic - build context
429
+ const epicJiraKey = epic?.jira || null;
430
+ const stories = epic.stories.map((s) => {
431
+ const sId = s?.id || '';
432
+ const sJiraKey = sId.startsWith('MSSCI-') ? sId : null;
433
+ return {
434
+ id: sId,
435
+ title: s?.title || '',
436
+ points: typeof s?.points === 'number' ? s.points : 0,
437
+ status: normalizeStoryStatus(s?.status),
438
+ jiraKey: sJiraKey,
439
+ jiraUrl: generateJiraUrl(sJiraKey),
440
+ };
441
+ });
442
+ return {
443
+ id: epic?.id || '',
444
+ title: epic?.title || '',
445
+ jiraKey: epicJiraKey,
446
+ jiraUrl: generateJiraUrl(epicJiraKey),
447
+ stories,
448
+ };
449
+ }
450
+ }
451
+ // Story not found in any epic
452
+ return null;
453
+ }
454
+ catch {
455
+ // Malformed YAML
456
+ return null;
457
+ }
458
+ }
459
+ // Normalize story status to valid enum values
460
+ function normalizeStoryStatus(status) {
461
+ if (!status)
462
+ return 'backlog';
463
+ const normalized = status.toLowerCase();
464
+ switch (normalized) {
465
+ case 'done':
466
+ case 'completed':
467
+ return 'done';
468
+ case 'in_progress':
469
+ case 'in-progress':
470
+ case 'active':
471
+ return 'in_progress';
472
+ case 'cancelled':
473
+ case 'canceled':
474
+ return 'cancelled';
475
+ default:
476
+ return 'backlog';
477
+ }
478
+ }
479
+ // Get workflow phases from workflow YAML definition
480
+ // Checks multiple locations: .pennyfarthing/workflows/, .claude/workflows/, pennyfarthing-dist/workflows/
481
+ // Supports both flat-file workflows (tdd.yaml) and subdirectory workflows (epics-and-stories/workflow.yaml)
482
+ export function getWorkflowPhases(workflowName, projectDir) {
483
+ try {
484
+ const workflowDirs = [
485
+ // 1. Runtime via symlinks: .pennyfarthing/workflows/ (orchestrator pattern)
486
+ join(projectDir, '.pennyfarthing', 'workflows'),
487
+ // 2. Legacy: .claude/workflows/
488
+ join(projectDir, '.claude', 'workflows'),
489
+ // 3. Monorepo/dev: pennyfarthing-dist/workflows/
490
+ join(projectDir, 'pennyfarthing-dist', 'workflows'),
491
+ ];
492
+ // Look for workflow YAML: flat file first, then subdirectory pattern
493
+ const searchPaths = [];
494
+ for (const dir of workflowDirs) {
495
+ searchPaths.push(join(dir, `${workflowName}.yaml`));
496
+ searchPaths.push(join(dir, workflowName, 'workflow.yaml'));
497
+ }
498
+ let workflowPath = null;
499
+ for (const path of searchPaths) {
500
+ if (existsSync(path)) {
501
+ workflowPath = path;
502
+ break;
503
+ }
504
+ }
505
+ if (!workflowPath) {
506
+ return null;
507
+ }
508
+ const content = readFileSync(workflowPath, 'utf-8');
509
+ const data = parseYaml(content);
510
+ // Support both flat structure (phases:) and nested structure (workflow.phases:)
511
+ const phases = data?.workflow?.phases || data?.phases;
512
+ if (phases && Array.isArray(phases)) {
513
+ // Phased workflow (tdd, trivial, bdd, etc.)
514
+ return phases.map((phase) => ({
515
+ name: phase.name,
516
+ agent: phase.agent,
517
+ label: phase.label || phase.name,
518
+ }));
519
+ }
520
+ // Stepped workflow (epics-and-stories, prd, research, etc.)
521
+ // Derive phases from step files in the steps/ directory
522
+ const workflowType = data?.workflow?.type || data?.type;
523
+ if (workflowType === 'stepped') {
524
+ const stepsDir = join(workflowPath, '..', 'steps');
525
+ if (existsSync(stepsDir)) {
526
+ const agent = data?.workflow?.agent || data?.agent || 'unknown';
527
+ const stepFiles = readdirSync(stepsDir)
528
+ .filter((f) => f.match(/^step-\d+.*\.md$/))
529
+ .sort();
530
+ if (stepFiles.length > 0) {
531
+ return stepFiles.map((file) => {
532
+ // Extract step number and name from filename: step-01-validate-prerequisites.md
533
+ const match = file.match(/^step-(\d+)-(.+)\.md$/);
534
+ const stepNum = match ? match[1] : '?';
535
+ const _stepName = match ? match[2].replace(/-/g, ' ') : file;
536
+ return {
537
+ name: `step-${stepNum}`,
538
+ agent,
539
+ label: `Step ${parseInt(stepNum, 10)}`,
540
+ };
541
+ });
542
+ }
543
+ }
544
+ }
545
+ return null;
546
+ }
547
+ catch {
548
+ // Malformed YAML or read error
549
+ return null;
550
+ }
551
+ }
552
+ // MSSCI-14301: Enumerate all available workflows from disk
553
+ // Searches same 3 directories as getWorkflowPhases, discovers both flat and subdirectory workflows
554
+ export function getAvailableWorkflows(projectDir) {
555
+ const workflows = [];
556
+ const seen = new Set();
557
+ const workflowDirs = [
558
+ join(projectDir, '.pennyfarthing', 'workflows'),
559
+ join(projectDir, '.claude', 'workflows'),
560
+ join(projectDir, 'pennyfarthing-dist', 'workflows'),
561
+ ];
562
+ for (const dir of workflowDirs) {
563
+ if (!existsSync(dir))
564
+ continue;
565
+ let entries;
566
+ try {
567
+ entries = readdirSync(dir);
568
+ }
569
+ catch {
570
+ continue;
571
+ }
572
+ for (const entry of entries) {
573
+ const entryPath = join(dir, entry);
574
+ try {
575
+ // Flat YAML file (e.g., tdd.yaml)
576
+ if (entry.endsWith('.yaml') || entry.endsWith('.yml')) {
577
+ const content = readFileSync(entryPath, 'utf-8');
578
+ const data = parseYaml(content);
579
+ const wf = data?.workflow;
580
+ if (!wf?.name || seen.has(wf.name))
581
+ continue;
582
+ seen.add(wf.name);
583
+ const type = wf.type === 'stepped' ? 'stepped' : 'phased';
584
+ const result = {
585
+ name: wf.name,
586
+ type,
587
+ description: wf.description ?? '',
588
+ };
589
+ if (wf.triggers) {
590
+ const triggers = {};
591
+ if (wf.triggers.types)
592
+ triggers.types = wf.triggers.types;
593
+ if (wf.triggers.tags)
594
+ triggers.tags = wf.triggers.tags;
595
+ if (wf.triggers.points)
596
+ triggers.points = wf.triggers.points;
597
+ if (wf.triggers.default !== undefined)
598
+ triggers.default = wf.triggers.default;
599
+ result.triggers = triggers;
600
+ }
601
+ workflows.push(result);
602
+ }
603
+ // Subdirectory workflow (e.g., architecture/workflow.yaml)
604
+ else if (statSync(entryPath).isDirectory()) {
605
+ const subYaml = join(entryPath, 'workflow.yaml');
606
+ if (!existsSync(subYaml))
607
+ continue;
608
+ const content = readFileSync(subYaml, 'utf-8');
609
+ const data = parseYaml(content);
610
+ const wf = data?.workflow;
611
+ if (!wf?.name || seen.has(wf.name))
612
+ continue;
613
+ seen.add(wf.name);
614
+ const type = wf.type === 'stepped' ? 'stepped' : 'phased';
615
+ const result = {
616
+ name: wf.name,
617
+ type,
618
+ description: wf.description ?? '',
619
+ };
620
+ if (wf.triggers) {
621
+ const triggers = {};
622
+ if (wf.triggers.types)
623
+ triggers.types = wf.triggers.types;
624
+ if (wf.triggers.tags)
625
+ triggers.tags = wf.triggers.tags;
626
+ if (wf.triggers.points)
627
+ triggers.points = wf.triggers.points;
628
+ if (wf.triggers.default !== undefined)
629
+ triggers.default = wf.triggers.default;
630
+ result.triggers = triggers;
631
+ }
632
+ workflows.push(result);
633
+ }
634
+ }
635
+ catch {
636
+ // Skip malformed files
637
+ continue;
638
+ }
639
+ }
640
+ }
641
+ return workflows;
642
+ }
643
+ // Get story info from session files
644
+ export function getStoryInfo(projectDir) {
645
+ const nullResult = {
646
+ id: null,
647
+ title: null,
648
+ phase: null,
649
+ status: null,
650
+ points: null,
651
+ sprint: null,
652
+ nextAgent: null,
653
+ workflow: null,
654
+ pr: null,
655
+ branch: null,
656
+ criteria: null,
657
+ workflowType: null,
658
+ // MSSCI-12475: Expandable story section
659
+ sprintStories: null,
660
+ epicContext: null,
661
+ jiraUrl: null,
662
+ // MSSCI-14301: Available workflows
663
+ availableWorkflows: null,
664
+ };
665
+ try {
666
+ // Find session files
667
+ const sessionDir = join(projectDir, '.session');
668
+ if (!existsSync(sessionDir)) {
669
+ // MSSCI-12475: Try to get sprint stories even without session
670
+ const sprintPath = join(projectDir, 'sprint', 'current-sprint.yaml');
671
+ if (existsSync(sprintPath)) {
672
+ const sprintContent = readFileSync(sprintPath, 'utf-8');
673
+ nullResult.sprint = parseSprintYaml(sprintContent);
674
+ nullResult.sprintStories = getSprintStories(sprintContent);
675
+ }
676
+ nullResult.availableWorkflows = getAvailableWorkflows(projectDir);
677
+ return nullResult;
678
+ }
679
+ const files = readdirSync(sessionDir).filter(f => f.endsWith('-session.md'));
680
+ if (files.length === 0) {
681
+ // No session files, but try to get sprint progress and stories
682
+ const sprintPath = join(projectDir, 'sprint', 'current-sprint.yaml');
683
+ if (existsSync(sprintPath)) {
684
+ const sprintContent = readFileSync(sprintPath, 'utf-8');
685
+ nullResult.sprint = parseSprintYaml(sprintContent);
686
+ nullResult.sprintStories = getSprintStories(sprintContent);
687
+ }
688
+ nullResult.availableWorkflows = getAvailableWorkflows(projectDir);
689
+ return nullResult;
690
+ }
691
+ // Find the most recently modified session file
692
+ let sessionFile = files[0];
693
+ let latestMtime = 0;
694
+ for (const file of files) {
695
+ const filePath = join(sessionDir, file);
696
+ const stat = statSync(filePath);
697
+ if (stat.mtimeMs > latestMtime) {
698
+ latestMtime = stat.mtimeMs;
699
+ sessionFile = file;
700
+ }
701
+ }
702
+ const sessionPath = join(sessionDir, sessionFile);
703
+ const sessionContent = readFileSync(sessionPath, 'utf-8');
704
+ const storyInfo = parseSessionFile(sessionContent, projectDir);
705
+ // Get sprint progress and MSSCI-12475 expandable data
706
+ const sprintPath = join(projectDir, 'sprint', 'current-sprint.yaml');
707
+ let sprint = null;
708
+ let sprintStories = null;
709
+ let epicContext = null;
710
+ let sprintContent = '';
711
+ if (existsSync(sprintPath)) {
712
+ sprintContent = readFileSync(sprintPath, 'utf-8');
713
+ sprint = parseSprintYaml(sprintContent);
714
+ sprintStories = getSprintStories(sprintContent);
715
+ // Get epic context if we have a story ID
716
+ if (storyInfo.id) {
717
+ epicContext = getEpicContext(sprintContent, storyInfo.id);
718
+ }
719
+ }
720
+ // Generate Jira URL for current story
721
+ const storyId = storyInfo.id || null;
722
+ const jiraKey = storyId && storyId.startsWith('MSSCI-') ? storyId : null;
723
+ return {
724
+ id: storyInfo.id || null,
725
+ title: storyInfo.title || null,
726
+ phase: storyInfo.phase || null,
727
+ status: storyInfo.status || null,
728
+ points: storyInfo.points || null,
729
+ sprint,
730
+ nextAgent: storyInfo.nextAgent || null,
731
+ workflow: storyInfo.workflow || null,
732
+ workflowType: storyInfo.workflowType || null,
733
+ pr: storyInfo.pr || null,
734
+ branch: storyInfo.branch || null,
735
+ criteria: storyInfo.criteria || null,
736
+ // MSSCI-12475: Expandable story section
737
+ sprintStories,
738
+ epicContext,
739
+ jiraUrl: generateJiraUrl(jiraKey),
740
+ // MSSCI-14301: Available workflows
741
+ availableWorkflows: getAvailableWorkflows(projectDir),
742
+ };
743
+ }
744
+ catch {
745
+ return nullResult;
746
+ }
747
+ }
748
+ //# sourceMappingURL=story-parser.js.map