@pennyfarthing/core 10.0.0 → 10.0.2

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 (493) hide show
  1. package/LICENSE +14 -0
  2. package/package.json +22 -12
  3. package/pennyfarthing-dist/agents/README.md +348 -0
  4. package/pennyfarthing-dist/agents/architect.md +180 -0
  5. package/pennyfarthing-dist/agents/dev.md +169 -0
  6. package/pennyfarthing-dist/agents/devops.md +203 -0
  7. package/pennyfarthing-dist/agents/handoff.md +235 -0
  8. package/pennyfarthing-dist/agents/orchestrator.md +182 -0
  9. package/pennyfarthing-dist/agents/pm.md +152 -0
  10. package/pennyfarthing-dist/agents/reviewer-preflight.md +129 -0
  11. package/pennyfarthing-dist/agents/reviewer.md +197 -0
  12. package/pennyfarthing-dist/agents/sm-file-summary.md +79 -0
  13. package/pennyfarthing-dist/agents/sm-finish.md +82 -0
  14. package/pennyfarthing-dist/agents/sm-handoff.md +129 -0
  15. package/pennyfarthing-dist/agents/sm-setup.md +251 -0
  16. package/pennyfarthing-dist/agents/sm.md +298 -0
  17. package/pennyfarthing-dist/agents/tea.md +161 -0
  18. package/pennyfarthing-dist/agents/tech-writer.md +226 -0
  19. package/pennyfarthing-dist/agents/testing-runner.md +184 -0
  20. package/pennyfarthing-dist/agents/ux-designer.md +236 -0
  21. package/pennyfarthing-dist/agents/workflow-status-check.md +96 -0
  22. package/pennyfarthing-dist/commands/architect.md +9 -0
  23. package/pennyfarthing-dist/commands/benchmark-control.md +69 -0
  24. package/pennyfarthing-dist/commands/benchmark.md +485 -0
  25. package/pennyfarthing-dist/commands/brainstorming.md +91 -0
  26. package/pennyfarthing-dist/commands/check.md +156 -0
  27. package/pennyfarthing-dist/commands/chore.md +218 -0
  28. package/pennyfarthing-dist/commands/close-epic.md +139 -0
  29. package/pennyfarthing-dist/commands/continue-session.md +218 -0
  30. package/pennyfarthing-dist/commands/create-branches-from-story.md +358 -0
  31. package/pennyfarthing-dist/commands/create-theme.md +29 -0
  32. package/pennyfarthing-dist/commands/dev.md +9 -0
  33. package/pennyfarthing-dist/commands/devops.md +9 -0
  34. package/pennyfarthing-dist/commands/fix-blocker.md +22 -0
  35. package/pennyfarthing-dist/commands/git-cleanup.md +57 -0
  36. package/pennyfarthing-dist/commands/health-check.md +143 -0
  37. package/pennyfarthing-dist/commands/help.md +264 -0
  38. package/pennyfarthing-dist/commands/job-fair.md +102 -0
  39. package/pennyfarthing-dist/commands/list-themes.md +21 -0
  40. package/pennyfarthing-dist/commands/new-work.md +23 -0
  41. package/pennyfarthing-dist/commands/orchestrator.md +9 -0
  42. package/pennyfarthing-dist/commands/parallel-work.md +73 -0
  43. package/pennyfarthing-dist/commands/party-mode.md +77 -0
  44. package/pennyfarthing-dist/commands/patch.md +210 -0
  45. package/pennyfarthing-dist/commands/permissions.md +193 -0
  46. package/pennyfarthing-dist/commands/pm.md +9 -0
  47. package/pennyfarthing-dist/commands/prime.md +136 -0
  48. package/pennyfarthing-dist/commands/release.md +74 -0
  49. package/pennyfarthing-dist/commands/repo-status.md +49 -0
  50. package/pennyfarthing-dist/commands/retro.md +200 -0
  51. package/pennyfarthing-dist/commands/reviewer.md +9 -0
  52. package/pennyfarthing-dist/commands/run-ci.md +116 -0
  53. package/pennyfarthing-dist/commands/set-theme.md +56 -0
  54. package/pennyfarthing-dist/commands/setup.md +65 -0
  55. package/pennyfarthing-dist/commands/show-theme.md +21 -0
  56. package/pennyfarthing-dist/commands/sm.md +9 -0
  57. package/pennyfarthing-dist/commands/solo.md +447 -0
  58. package/pennyfarthing-dist/commands/sprint-planning.md +109 -0
  59. package/pennyfarthing-dist/commands/sprint.md +142 -0
  60. package/pennyfarthing-dist/commands/standalone.md +194 -0
  61. package/pennyfarthing-dist/commands/start-epic.md +168 -0
  62. package/pennyfarthing-dist/commands/sync-epic-to-jira.md +184 -0
  63. package/pennyfarthing-dist/commands/sync-work-with-sprint.md +373 -0
  64. package/pennyfarthing-dist/commands/tea.md +9 -0
  65. package/pennyfarthing-dist/commands/tech-writer.md +9 -0
  66. package/pennyfarthing-dist/commands/theme-maker.md +676 -0
  67. package/pennyfarthing-dist/commands/update-domain-docs.md +83 -0
  68. package/pennyfarthing-dist/commands/ux-designer.md +9 -0
  69. package/pennyfarthing-dist/commands/work.md +25 -0
  70. package/pennyfarthing-dist/commands/workflow.md +21 -0
  71. package/pennyfarthing-dist/guides/agent-behavior.md +92 -0
  72. package/pennyfarthing-dist/guides/agent-coordination.md +475 -0
  73. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +432 -0
  74. package/pennyfarthing-dist/guides/agent-template-strategic.md +148 -0
  75. package/pennyfarthing-dist/guides/agent-template-tactical.md +162 -0
  76. package/pennyfarthing-dist/guides/hooks.md +230 -0
  77. package/pennyfarthing-dist/guides/measurement-framework.md +210 -0
  78. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +766 -0
  79. package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +574 -0
  80. package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +488 -0
  81. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +402 -0
  82. package/pennyfarthing-dist/guides/permission-protocol.md +188 -0
  83. package/pennyfarthing-dist/guides/persona-loading.md +46 -0
  84. package/pennyfarthing-dist/guides/prompt-patterns.md +338 -0
  85. package/pennyfarthing-dist/guides/scale-levels.md +114 -0
  86. package/pennyfarthing-dist/guides/session-artifacts.md +193 -0
  87. package/pennyfarthing-dist/guides/session-schema.md +346 -0
  88. package/pennyfarthing-dist/guides/skill-schema.md +412 -0
  89. package/pennyfarthing-dist/guides/workflow-schema.md +257 -0
  90. package/pennyfarthing-dist/guides/workflow-step-schema.md +512 -0
  91. package/pennyfarthing-dist/guides/worktree-mode.md +113 -0
  92. package/pennyfarthing-dist/guides/xml-tags.md +627 -0
  93. package/pennyfarthing-dist/output-styles/teaching.md +33 -0
  94. package/pennyfarthing-dist/output-styles/terse.md +20 -0
  95. package/pennyfarthing-dist/output-styles/verbose.md +28 -0
  96. package/pennyfarthing-dist/personas/themes/a-team.yaml +331 -0
  97. package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +324 -0
  98. package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +282 -0
  99. package/pennyfarthing-dist/personas/themes/blade-runner.yaml +289 -0
  100. package/pennyfarthing-dist/personas/themes/catch-22.yaml +304 -0
  101. package/pennyfarthing-dist/personas/themes/control.yaml +201 -0
  102. package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +315 -0
  103. package/pennyfarthing-dist/personas/themes/discworld.yaml +334 -0
  104. package/pennyfarthing-dist/personas/themes/doctor-who.yaml +284 -0
  105. package/pennyfarthing-dist/personas/themes/dune.yaml +301 -0
  106. package/pennyfarthing-dist/personas/themes/firefly.yaml +320 -0
  107. package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +284 -0
  108. package/pennyfarthing-dist/personas/themes/harry-potter.yaml +316 -0
  109. package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +323 -0
  110. package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +326 -0
  111. package/pennyfarthing-dist/personas/themes/mad-max.yaml +349 -0
  112. package/pennyfarthing-dist/personas/themes/mash.yaml +329 -0
  113. package/pennyfarthing-dist/personas/themes/princess-bride.yaml +344 -0
  114. package/pennyfarthing-dist/personas/themes/sandman.yaml +282 -0
  115. package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +358 -0
  116. package/pennyfarthing-dist/personas/themes/star-wars.yaml +297 -0
  117. package/pennyfarthing-dist/personas/themes/the-expanse.yaml +337 -0
  118. package/pennyfarthing-dist/personas/themes/the-matrix.yaml +342 -0
  119. package/pennyfarthing-dist/personas/themes/watchmen.yaml +285 -0
  120. package/pennyfarthing-dist/personas/themes/west-wing.yaml +285 -0
  121. package/pennyfarthing-dist/personas/themes/x-files.yaml +296 -0
  122. package/pennyfarthing-dist/scripts/README.md +87 -0
  123. package/pennyfarthing-dist/scripts/core/README.md +25 -0
  124. package/pennyfarthing-dist/scripts/core/agent-session.sh +390 -0
  125. package/pennyfarthing-dist/scripts/core/check-context.sh +194 -0
  126. package/pennyfarthing-dist/scripts/core/handoff-marker.sh +112 -0
  127. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +90 -0
  128. package/pennyfarthing-dist/scripts/core/prime.sh +30 -0
  129. package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +21 -0
  130. package/pennyfarthing-dist/scripts/git/README.md +25 -0
  131. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +267 -0
  132. package/pennyfarthing-dist/scripts/git/git-status-all.sh +152 -0
  133. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +79 -0
  134. package/pennyfarthing-dist/scripts/git/release.sh +246 -0
  135. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +497 -0
  136. package/pennyfarthing-dist/scripts/health/drift-detection.sh +156 -0
  137. package/pennyfarthing-dist/scripts/hooks/README.md +32 -0
  138. package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
  139. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +106 -0
  140. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +95 -0
  141. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +65 -0
  142. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +35 -0
  143. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +150 -0
  144. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +190 -0
  145. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +71 -0
  146. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +42 -0
  147. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +20 -0
  148. package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +499 -0
  149. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +30 -0
  150. package/pennyfarthing-dist/scripts/hooks/session-start.sh +97 -0
  151. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +65 -0
  152. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +78 -0
  153. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +94 -0
  154. package/pennyfarthing-dist/scripts/jira/README.md +36 -0
  155. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +95 -0
  156. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +91 -0
  157. package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +22 -0
  158. package/pennyfarthing-dist/scripts/jira/jira-lib.sh +464 -0
  159. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +260 -0
  160. package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +18 -0
  161. package/pennyfarthing-dist/scripts/jira/jira-sync.sh +16 -0
  162. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +16 -0
  163. package/pennyfarthing-dist/scripts/jira/sync-epic-to-jira.sh +16 -0
  164. package/pennyfarthing-dist/scripts/lib/README.md +29 -0
  165. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +177 -0
  166. package/pennyfarthing-dist/scripts/lib/checkpoint.sh +136 -0
  167. package/pennyfarthing-dist/scripts/lib/common.sh +212 -0
  168. package/pennyfarthing-dist/scripts/lib/file-lock.sh +269 -0
  169. package/pennyfarthing-dist/scripts/lib/find-root.sh +58 -0
  170. package/pennyfarthing-dist/scripts/lib/logging.sh +186 -0
  171. package/pennyfarthing-dist/scripts/lib/retry.sh +76 -0
  172. package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +102 -0
  173. package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +91 -0
  174. package/pennyfarthing-dist/scripts/misc/README.md +44 -0
  175. package/pennyfarthing-dist/scripts/misc/add-short-names.sh +13 -0
  176. package/pennyfarthing-dist/scripts/misc/add_short_names.py +226 -0
  177. package/pennyfarthing-dist/scripts/misc/backlog.sh +77 -0
  178. package/pennyfarthing-dist/scripts/misc/check-status.sh +247 -0
  179. package/pennyfarthing-dist/scripts/misc/find-related-work.sh +231 -0
  180. package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +107 -0
  181. package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +74 -0
  182. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +10 -0
  183. package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +319 -0
  184. package/pennyfarthing-dist/scripts/misc/repo-scan.sh +141 -0
  185. package/pennyfarthing-dist/scripts/misc/repo-utils.sh +778 -0
  186. package/pennyfarthing-dist/scripts/misc/run-ci.sh +212 -0
  187. package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +7 -0
  188. package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +319 -0
  189. package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +193 -0
  190. package/pennyfarthing-dist/scripts/misc/statusline.sh +257 -0
  191. package/pennyfarthing-dist/scripts/misc/uninstall.sh +275 -0
  192. package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +160 -0
  193. package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +417 -0
  194. package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +54 -0
  195. package/pennyfarthing-dist/scripts/sprint/README.md +29 -0
  196. package/pennyfarthing-dist/scripts/sprint/archive-story.sh +133 -0
  197. package/pennyfarthing-dist/scripts/sprint/available-stories.sh +91 -0
  198. package/pennyfarthing-dist/scripts/sprint/check-story.sh +158 -0
  199. package/pennyfarthing-dist/scripts/sprint/get-epic-field.sh +52 -0
  200. package/pennyfarthing-dist/scripts/sprint/get-story-field.sh +63 -0
  201. package/pennyfarthing-dist/scripts/sprint/list-future.sh +145 -0
  202. package/pennyfarthing-dist/scripts/sprint/new-sprint.sh +110 -0
  203. package/pennyfarthing-dist/scripts/sprint/promote-epic.sh +148 -0
  204. package/pennyfarthing-dist/scripts/sprint/sprint-common.sh +415 -0
  205. package/pennyfarthing-dist/scripts/sprint/sprint-info.sh +33 -0
  206. package/pennyfarthing-dist/scripts/sprint/sprint-metrics.sh +230 -0
  207. package/pennyfarthing-dist/scripts/sprint/sprint-status.sh +134 -0
  208. package/pennyfarthing-dist/scripts/sprint/validate-sprint-yaml.sh +139 -0
  209. package/pennyfarthing-dist/scripts/story/README.md +23 -0
  210. package/pennyfarthing-dist/scripts/story/create-story.sh +19 -0
  211. package/pennyfarthing-dist/scripts/story/size-story.sh +18 -0
  212. package/pennyfarthing-dist/scripts/story/story-template.sh +18 -0
  213. package/pennyfarthing-dist/scripts/test/README.md +23 -0
  214. package/pennyfarthing-dist/scripts/test/ensure-swebench-data.sh +59 -0
  215. package/pennyfarthing-dist/scripts/test/ground-truth-judge.py +220 -0
  216. package/pennyfarthing-dist/scripts/test/swebench-judge.py +374 -0
  217. package/pennyfarthing-dist/scripts/test/test-cache.sh +165 -0
  218. package/pennyfarthing-dist/scripts/test/test-setup.sh +337 -0
  219. package/pennyfarthing-dist/scripts/tests/check.test.sh +582 -0
  220. package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +515 -0
  221. package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +599 -0
  222. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +332 -0
  223. package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +573 -0
  224. package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +859 -0
  225. package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +662 -0
  226. package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +589 -0
  227. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +106 -0
  228. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +597 -0
  229. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +514 -0
  230. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +517 -0
  231. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +331 -0
  232. package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +647 -0
  233. package/pennyfarthing-dist/scripts/theme/README.md +22 -0
  234. package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +13 -0
  235. package/pennyfarthing-dist/scripts/theme/compute_theme_tiers.py +402 -0
  236. package/pennyfarthing-dist/scripts/theme/list-themes.sh +30 -0
  237. package/pennyfarthing-dist/scripts/theme/update-theme-tiers.sh +97 -0
  238. package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +576 -0
  239. package/pennyfarthing-dist/scripts/workflow/README.md +28 -0
  240. package/pennyfarthing-dist/scripts/workflow/check.py +502 -0
  241. package/pennyfarthing-dist/scripts/workflow/check.sh +24 -0
  242. package/pennyfarthing-dist/scripts/workflow/complete-step.py +304 -0
  243. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +154 -0
  244. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +222 -0
  245. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +61 -0
  246. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +13 -0
  247. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +124 -0
  248. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +34 -0
  249. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +157 -0
  250. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +132 -0
  251. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +250 -0
  252. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +161 -0
  253. package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +246 -0
  254. package/pennyfarthing-dist/skills/changelog/SKILL.md +385 -0
  255. package/pennyfarthing-dist/skills/code-review/SKILL.md +172 -0
  256. package/pennyfarthing-dist/skills/context-engineering/SKILL.md +277 -0
  257. package/pennyfarthing-dist/skills/cyclist/SKILL.md +88 -0
  258. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +461 -0
  259. package/pennyfarthing-dist/skills/finalize-run/SKILL.md +261 -0
  260. package/pennyfarthing-dist/skills/jira/SKILL.md +508 -0
  261. package/pennyfarthing-dist/skills/judge/SKILL.md +644 -0
  262. package/pennyfarthing-dist/skills/just/SKILL.md +414 -0
  263. package/pennyfarthing-dist/skills/mermaid/SKILL.md +256 -0
  264. package/pennyfarthing-dist/skills/otel/skill.md +227 -0
  265. package/pennyfarthing-dist/skills/permissions/skill.md +157 -0
  266. package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +187 -0
  267. package/pennyfarthing-dist/skills/skill-registry.schema.json +107 -0
  268. package/pennyfarthing-dist/skills/skill-registry.yaml +393 -0
  269. package/pennyfarthing-dist/skills/sprint/scripts/archive-story.sh +101 -0
  270. package/pennyfarthing-dist/skills/sprint/scripts/available-stories.sh +97 -0
  271. package/pennyfarthing-dist/skills/sprint/scripts/check-story.sh +164 -0
  272. package/pennyfarthing-dist/skills/sprint/scripts/create-jira-epic.sh +101 -0
  273. package/pennyfarthing-dist/skills/sprint/scripts/new-sprint.sh +116 -0
  274. package/pennyfarthing-dist/skills/sprint/scripts/promote-epic.sh +164 -0
  275. package/pennyfarthing-dist/skills/sprint/scripts/sprint-info.sh +39 -0
  276. package/pennyfarthing-dist/skills/sprint/scripts/sprint-status.sh +147 -0
  277. package/pennyfarthing-dist/skills/sprint/scripts/sync-epic-jira.sh +93 -0
  278. package/pennyfarthing-dist/skills/sprint/skill.md +465 -0
  279. package/pennyfarthing-dist/skills/story/scripts/create-story.sh +159 -0
  280. package/pennyfarthing-dist/skills/story/scripts/size-story.sh +198 -0
  281. package/pennyfarthing-dist/skills/story/scripts/story-template.sh +162 -0
  282. package/pennyfarthing-dist/skills/story/skill.md +219 -0
  283. package/pennyfarthing-dist/skills/systematic-debugging/SKILL.md +446 -0
  284. package/pennyfarthing-dist/skills/testing/SKILL.md +121 -0
  285. package/pennyfarthing-dist/skills/testing/references/troubleshooting.md +124 -0
  286. package/pennyfarthing-dist/skills/theme/skill.md +141 -0
  287. package/pennyfarthing-dist/skills/theme-creation/SKILL.md +178 -0
  288. package/pennyfarthing-dist/skills/workflow/scripts/list-workflows.sh +91 -0
  289. package/pennyfarthing-dist/skills/workflow/scripts/resume-workflow.sh +163 -0
  290. package/pennyfarthing-dist/skills/workflow/scripts/show-workflow.sh +138 -0
  291. package/pennyfarthing-dist/skills/workflow/scripts/start-workflow.sh +273 -0
  292. package/pennyfarthing-dist/skills/workflow/scripts/workflow-status.sh +167 -0
  293. package/pennyfarthing-dist/skills/workflow/skill.md +345 -0
  294. package/pennyfarthing-dist/skills/yq/SKILL.md +272 -0
  295. package/pennyfarthing-dist/templates/LEADERBOARD.schema.yaml +187 -0
  296. package/pennyfarthing-dist/templates/LEADERBOARD.template.md +59 -0
  297. package/pennyfarthing-dist/templates/agent-scopes.yaml.template +276 -0
  298. package/pennyfarthing-dist/templates/pennyfarthing-settings.yaml.template +61 -0
  299. package/pennyfarthing-dist/templates/persona-config.yaml.template +22 -0
  300. package/pennyfarthing-dist/templates/preferences.yaml.template +15 -0
  301. package/pennyfarthing-dist/templates/settings.local.json.template +130 -0
  302. package/pennyfarthing-dist/templates/setup-env.sh.template +18 -0
  303. package/pennyfarthing-dist/templates/shared-context.md.template +70 -0
  304. package/pennyfarthing-dist/templates/sidecar/decisions.md.template +40 -0
  305. package/pennyfarthing-dist/templates/sidecar/gotchas.md.template +37 -0
  306. package/pennyfarthing-dist/templates/sidecar/patterns.md.template +34 -0
  307. package/pennyfarthing-dist/workflows/agent-docs.yaml +70 -0
  308. package/pennyfarthing-dist/workflows/architecture/steps/step-01-initialize.md +113 -0
  309. package/pennyfarthing-dist/workflows/architecture/steps/step-01b-continue.md +105 -0
  310. package/pennyfarthing-dist/workflows/architecture/steps/step-02-context.md +127 -0
  311. package/pennyfarthing-dist/workflows/architecture/steps/step-03-patterns.md +145 -0
  312. package/pennyfarthing-dist/workflows/architecture/steps/step-04-components.md +150 -0
  313. package/pennyfarthing-dist/workflows/architecture/steps/step-05-interfaces.md +145 -0
  314. package/pennyfarthing-dist/workflows/architecture/steps/step-06-risks.md +154 -0
  315. package/pennyfarthing-dist/workflows/architecture/steps/step-07-document.md +172 -0
  316. package/pennyfarthing-dist/workflows/architecture/templates/architecture-decision.md +102 -0
  317. package/pennyfarthing-dist/workflows/architecture.yaml +65 -0
  318. package/pennyfarthing-dist/workflows/bdd.yaml +60 -0
  319. package/pennyfarthing-dist/workflows/brainstorming/brain-methods.csv +62 -0
  320. package/pennyfarthing-dist/workflows/brainstorming/checklist.md +44 -0
  321. package/pennyfarthing-dist/workflows/brainstorming/instructions.md +736 -0
  322. package/pennyfarthing-dist/workflows/brainstorming/workflow.yaml +49 -0
  323. package/pennyfarthing-dist/workflows/code-review/checklist.md +23 -0
  324. package/pennyfarthing-dist/workflows/code-review/instructions.md +234 -0
  325. package/pennyfarthing-dist/workflows/code-review/workflow.yaml +51 -0
  326. package/pennyfarthing-dist/workflows/dev-story/checklist.md +80 -0
  327. package/pennyfarthing-dist/workflows/dev-story/instructions.xml +410 -0
  328. package/pennyfarthing-dist/workflows/dev-story/workflow.yaml +50 -0
  329. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-01-validate-prerequisites.md +281 -0
  330. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-02-design-epics.md +256 -0
  331. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-03-create-stories.md +298 -0
  332. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-04-final-validation.md +177 -0
  333. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +145 -0
  334. package/pennyfarthing-dist/workflows/epics-and-stories/templates/epics-template.md +57 -0
  335. package/pennyfarthing-dist/workflows/epics-and-stories/workflow.yaml +28 -0
  336. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +103 -0
  337. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-02-categorize.md +147 -0
  338. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-03-execute.md +215 -0
  339. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +97 -0
  340. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +78 -0
  341. package/pennyfarthing-dist/workflows/git-cleanup.yaml +59 -0
  342. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-01-document-discovery.md +211 -0
  343. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-02-prd-analysis.md +199 -0
  344. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-03-epic-coverage-validation.md +202 -0
  345. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-04-ux-alignment.md +162 -0
  346. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-05-epic-quality-review.md +280 -0
  347. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-06-final-assessment.md +158 -0
  348. package/pennyfarthing-dist/workflows/implementation-readiness/templates/readiness-report-template.md +4 -0
  349. package/pennyfarthing-dist/workflows/implementation-readiness/workflow.yaml +40 -0
  350. package/pennyfarthing-dist/workflows/interactive-debug/steps/step-01-connect.md +257 -0
  351. package/pennyfarthing-dist/workflows/interactive-debug/steps/step-02-explore.md +107 -0
  352. package/pennyfarthing-dist/workflows/interactive-debug/steps/step-03-fix.md +127 -0
  353. package/pennyfarthing-dist/workflows/interactive-debug/steps/step-04-commit.md +122 -0
  354. package/pennyfarthing-dist/workflows/interactive-debug/workflow.yaml +51 -0
  355. package/pennyfarthing-dist/workflows/patch.yaml +67 -0
  356. package/pennyfarthing-dist/workflows/prd/data/domain-complexity.csv +13 -0
  357. package/pennyfarthing-dist/workflows/prd/data/prd-purpose.md +197 -0
  358. package/pennyfarthing-dist/workflows/prd/data/project-types.csv +11 -0
  359. package/pennyfarthing-dist/workflows/prd/steps-c/step-01-init.md +197 -0
  360. package/pennyfarthing-dist/workflows/prd/steps-c/step-01b-continue.md +159 -0
  361. package/pennyfarthing-dist/workflows/prd/steps-c/step-02-discovery.md +230 -0
  362. package/pennyfarthing-dist/workflows/prd/steps-c/step-03-success.md +232 -0
  363. package/pennyfarthing-dist/workflows/prd/steps-c/step-04-journeys.md +219 -0
  364. package/pennyfarthing-dist/workflows/prd/steps-c/step-05-domain.md +213 -0
  365. package/pennyfarthing-dist/workflows/prd/steps-c/step-06-innovation.md +232 -0
  366. package/pennyfarthing-dist/workflows/prd/steps-c/step-07-project-type.md +243 -0
  367. package/pennyfarthing-dist/workflows/prd/steps-c/step-08-scoping.md +234 -0
  368. package/pennyfarthing-dist/workflows/prd/steps-c/step-09-functional.md +237 -0
  369. package/pennyfarthing-dist/workflows/prd/steps-c/step-10-nonfunctional.md +248 -0
  370. package/pennyfarthing-dist/workflows/prd/steps-c/step-11-polish.md +223 -0
  371. package/pennyfarthing-dist/workflows/prd/steps-c/step-12-complete.md +186 -0
  372. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01-discovery.md +253 -0
  373. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01b-legacy-conversion.md +214 -0
  374. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-02-review.md +255 -0
  375. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-03-edit.md +259 -0
  376. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-04-complete.md +174 -0
  377. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-01-discovery.md +224 -0
  378. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02-format-detection.md +197 -0
  379. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02b-parity-check.md +215 -0
  380. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-03-density-validation.md +180 -0
  381. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-04-brief-coverage-validation.md +220 -0
  382. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-05-measurability-validation.md +234 -0
  383. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-06-traceability-validation.md +223 -0
  384. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md +211 -0
  385. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +249 -0
  386. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-09-project-type-validation.md +269 -0
  387. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-10-smart-validation.md +215 -0
  388. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-11-holistic-quality-validation.md +270 -0
  389. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-12-completeness-validation.md +248 -0
  390. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-13-report-complete.md +238 -0
  391. package/pennyfarthing-dist/workflows/prd/templates/prd-template.md +10 -0
  392. package/pennyfarthing-dist/workflows/prd/workflow.yaml +42 -0
  393. package/pennyfarthing-dist/workflows/product-brief/steps/step-01-init.md +195 -0
  394. package/pennyfarthing-dist/workflows/product-brief/steps/step-01b-continue.md +180 -0
  395. package/pennyfarthing-dist/workflows/product-brief/steps/step-02-vision.md +221 -0
  396. package/pennyfarthing-dist/workflows/product-brief/steps/step-03-users.md +224 -0
  397. package/pennyfarthing-dist/workflows/product-brief/steps/step-04-metrics.md +228 -0
  398. package/pennyfarthing-dist/workflows/product-brief/steps/step-05-scope.md +243 -0
  399. package/pennyfarthing-dist/workflows/product-brief/steps/step-06-complete.md +216 -0
  400. package/pennyfarthing-dist/workflows/product-brief/templates/product-brief.template.md +10 -0
  401. package/pennyfarthing-dist/workflows/product-brief/workflow.yaml +31 -0
  402. package/pennyfarthing-dist/workflows/project-context/project-context-template.md +21 -0
  403. package/pennyfarthing-dist/workflows/project-context/steps/step-01-discover.md +206 -0
  404. package/pennyfarthing-dist/workflows/project-context/steps/step-02-generate.md +349 -0
  405. package/pennyfarthing-dist/workflows/project-context/steps/step-03-complete.md +306 -0
  406. package/pennyfarthing-dist/workflows/project-context/workflow.yaml +27 -0
  407. package/pennyfarthing-dist/workflows/project-setup/steps/step-01-discover.md +157 -0
  408. package/pennyfarthing-dist/workflows/project-setup/steps/step-02-clone-repos.md +217 -0
  409. package/pennyfarthing-dist/workflows/project-setup/steps/step-03-repos-yaml.md +159 -0
  410. package/pennyfarthing-dist/workflows/project-setup/steps/step-04-claude-md.md +186 -0
  411. package/pennyfarthing-dist/workflows/project-setup/steps/step-05-shared-context.md +185 -0
  412. package/pennyfarthing-dist/workflows/project-setup/steps/step-06-task-runner.md +279 -0
  413. package/pennyfarthing-dist/workflows/project-setup/steps/step-07-theme.md +200 -0
  414. package/pennyfarthing-dist/workflows/project-setup/steps/step-08-theme-packs.md +142 -0
  415. package/pennyfarthing-dist/workflows/project-setup/steps/step-09-cyclist.md +245 -0
  416. package/pennyfarthing-dist/workflows/project-setup/steps/step-10-complete.md +204 -0
  417. package/pennyfarthing-dist/workflows/project-setup/workflow.yaml +41 -0
  418. package/pennyfarthing-dist/workflows/quick-dev/steps/step-01-mode-detection.md +177 -0
  419. package/pennyfarthing-dist/workflows/quick-dev/steps/step-02-context-gathering.md +143 -0
  420. package/pennyfarthing-dist/workflows/quick-dev/steps/step-03-execute.md +138 -0
  421. package/pennyfarthing-dist/workflows/quick-dev/steps/step-04-self-check.md +135 -0
  422. package/pennyfarthing-dist/workflows/quick-dev/steps/step-05-adversarial-review.md +129 -0
  423. package/pennyfarthing-dist/workflows/quick-dev/steps/step-06-resolve-findings.md +163 -0
  424. package/pennyfarthing-dist/workflows/quick-dev/workflow.yaml +27 -0
  425. package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +201 -0
  426. package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +156 -0
  427. package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +140 -0
  428. package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +203 -0
  429. package/pennyfarthing-dist/workflows/quick-spec/tech-spec-template.md +74 -0
  430. package/pennyfarthing-dist/workflows/quick-spec/workflow.yaml +27 -0
  431. package/pennyfarthing-dist/workflows/release/steps/step-01-preflight.md +105 -0
  432. package/pennyfarthing-dist/workflows/release/steps/step-02-bump.md +95 -0
  433. package/pennyfarthing-dist/workflows/release/steps/step-03-changelog.md +125 -0
  434. package/pennyfarthing-dist/workflows/release/steps/step-04-readme.md +101 -0
  435. package/pennyfarthing-dist/workflows/release/steps/step-05-claude-md.md +102 -0
  436. package/pennyfarthing-dist/workflows/release/steps/step-06-retro.md +59 -0
  437. package/pennyfarthing-dist/workflows/release/steps/step-07-commit.md +109 -0
  438. package/pennyfarthing-dist/workflows/release/steps/step-08-merge.md +65 -0
  439. package/pennyfarthing-dist/workflows/release/steps/step-09-push.md +75 -0
  440. package/pennyfarthing-dist/workflows/release/steps/step-10-publish.md +93 -0
  441. package/pennyfarthing-dist/workflows/release/steps/step-11-finalize.md +71 -0
  442. package/pennyfarthing-dist/workflows/release.yaml +62 -0
  443. package/pennyfarthing-dist/workflows/research/steps-domain/step-01-init.md +159 -0
  444. package/pennyfarthing-dist/workflows/research/steps-domain/step-02-domain-analysis.md +253 -0
  445. package/pennyfarthing-dist/workflows/research/steps-domain/step-03-competitive-landscape.md +263 -0
  446. package/pennyfarthing-dist/workflows/research/steps-domain/step-04-regulatory-focus.md +232 -0
  447. package/pennyfarthing-dist/workflows/research/steps-domain/step-05-technical-trends.md +260 -0
  448. package/pennyfarthing-dist/workflows/research/steps-domain/step-06-research-synthesis.md +477 -0
  449. package/pennyfarthing-dist/workflows/research/steps-market/step-01-init.md +205 -0
  450. package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-behavior.md +262 -0
  451. package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-insights.md +227 -0
  452. package/pennyfarthing-dist/workflows/research/steps-market/step-03-customer-pain-points.md +275 -0
  453. package/pennyfarthing-dist/workflows/research/steps-market/step-04-customer-decisions.md +286 -0
  454. package/pennyfarthing-dist/workflows/research/steps-market/step-05-competitive-analysis.md +203 -0
  455. package/pennyfarthing-dist/workflows/research/steps-market/step-06-research-completion.md +510 -0
  456. package/pennyfarthing-dist/workflows/research/steps-technical/step-01-init.md +159 -0
  457. package/pennyfarthing-dist/workflows/research/steps-technical/step-02-technical-overview.md +264 -0
  458. package/pennyfarthing-dist/workflows/research/steps-technical/step-03-integration-patterns.md +274 -0
  459. package/pennyfarthing-dist/workflows/research/steps-technical/step-04-architectural-patterns.md +228 -0
  460. package/pennyfarthing-dist/workflows/research/steps-technical/step-05-implementation-research.md +267 -0
  461. package/pennyfarthing-dist/workflows/research/steps-technical/step-06-research-synthesis.md +522 -0
  462. package/pennyfarthing-dist/workflows/research/templates/research.template.md +29 -0
  463. package/pennyfarthing-dist/workflows/research/workflow.yaml +45 -0
  464. package/pennyfarthing-dist/workflows/retrospective/checklist.md +31 -0
  465. package/pennyfarthing-dist/workflows/retrospective/instructions.md +1443 -0
  466. package/pennyfarthing-dist/workflows/retrospective/workflow.yaml +50 -0
  467. package/pennyfarthing-dist/workflows/sprint-planning/checklist.md +33 -0
  468. package/pennyfarthing-dist/workflows/sprint-planning/sprint-status-template.yaml +55 -0
  469. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-01-parse-epic-files.md +69 -0
  470. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-02-build-sprint-status.md +61 -0
  471. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-03-status-detection.md +80 -0
  472. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-04-generate-status-file.md +90 -0
  473. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-05-validate-and-report.md +78 -0
  474. package/pennyfarthing-dist/workflows/sprint-planning/workflow.yaml +34 -0
  475. package/pennyfarthing-dist/workflows/tdd.yaml +50 -0
  476. package/pennyfarthing-dist/workflows/trivial.yaml +40 -0
  477. package/pennyfarthing-dist/workflows/ux-design/steps/step-01-init.md +141 -0
  478. package/pennyfarthing-dist/workflows/ux-design/steps/step-01b-continue.md +133 -0
  479. package/pennyfarthing-dist/workflows/ux-design/steps/step-02-discovery.md +196 -0
  480. package/pennyfarthing-dist/workflows/ux-design/steps/step-03-core-experience.md +222 -0
  481. package/pennyfarthing-dist/workflows/ux-design/steps/step-04-emotional-response.md +225 -0
  482. package/pennyfarthing-dist/workflows/ux-design/steps/step-05-inspiration.md +240 -0
  483. package/pennyfarthing-dist/workflows/ux-design/steps/step-06-design-system.md +258 -0
  484. package/pennyfarthing-dist/workflows/ux-design/steps/step-07-defining-experience.md +260 -0
  485. package/pennyfarthing-dist/workflows/ux-design/steps/step-08-visual-foundation.md +230 -0
  486. package/pennyfarthing-dist/workflows/ux-design/steps/step-09-design-directions.md +230 -0
  487. package/pennyfarthing-dist/workflows/ux-design/steps/step-10-user-journeys.md +247 -0
  488. package/pennyfarthing-dist/workflows/ux-design/steps/step-11-component-strategy.md +254 -0
  489. package/pennyfarthing-dist/workflows/ux-design/steps/step-12-ux-patterns.md +243 -0
  490. package/pennyfarthing-dist/workflows/ux-design/steps/step-13-responsive-accessibility.md +270 -0
  491. package/pennyfarthing-dist/workflows/ux-design/steps/step-14-complete.md +234 -0
  492. package/pennyfarthing-dist/workflows/ux-design/ux-design-template.md +13 -0
  493. package/pennyfarthing-dist/workflows/ux-design/workflow.yaml +41 -0
@@ -0,0 +1,186 @@
1
+ #!/usr/bin/env zsh
2
+ # Structured JSON logging utilities for agent workflows
3
+ # Dev: Fanny Price - "Let other pens dwell on guilt and misery."
4
+
5
+ # Source file locking utilities
6
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
7
+ # shellcheck source=file-lock.sh
8
+ source "${SCRIPT_DIR}/file-lock.sh" 2>/dev/null || true
9
+
10
+ # Log file location (evaluated dynamically)
11
+ _get_log_file() {
12
+ echo "${PROJECT_ROOT:-.}/.session/agent-logs.jsonl"
13
+ }
14
+
15
+ # _log LEVEL MESSAGE [EXTRA_FIELDS]
16
+ # Internal function to write structured log entry
17
+ #
18
+ # Arguments:
19
+ # LEVEL - Log level (INFO, WARN, ERROR)
20
+ # MESSAGE - Log message
21
+ # EXTRA_FIELDS - Optional extra JSON fields (must be valid JSON object contents)
22
+ #
23
+ _log() {
24
+ local level="$1"
25
+ local message="$2"
26
+ local extra="${3:-}"
27
+ local timestamp
28
+ local agent
29
+ local session
30
+ local log_file
31
+
32
+ timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
33
+ agent="${AGENT_NAME:-unknown}"
34
+ session="${SESSION_ID:-}"
35
+ log_file=$(_get_log_file)
36
+
37
+ # Ensure directory exists
38
+ mkdir -p "$(dirname "$log_file")"
39
+
40
+ # Escape message for JSON (handle quotes and newlines)
41
+ message=$(printf '%s' "$message" | sed 's/\\/\\\\/g; s/"/\\"/g; s/\t/\\t/g' | tr '\n' ' ')
42
+
43
+ # Build JSON object
44
+ local json="{\"timestamp\":\"${timestamp}\",\"level\":\"${level}\",\"agent\":\"${agent}\",\"message\":\"${message}\""
45
+
46
+ # Add session_id if present
47
+ if [[ -n "$session" ]]; then
48
+ json="${json},\"session_id\":\"${session}\""
49
+ fi
50
+
51
+ # Add extra fields if provided
52
+ if [[ -n "$extra" ]]; then
53
+ json="${json},${extra}"
54
+ fi
55
+
56
+ json="${json}}"
57
+
58
+ # Acquire lock, write to log file, release lock
59
+ if lock_acquire "$log_file" "exclusive" 5 2>/dev/null; then
60
+ echo "$json" >> "$log_file"
61
+ lock_release "$log_file"
62
+ else
63
+ # Fallback: write without lock (better than failing)
64
+ echo "$json" >> "$log_file"
65
+ fi
66
+
67
+ # Also output to stderr for visibility (with color)
68
+ case "$level" in
69
+ INFO) echo -e "\033[32m[INFO]\033[0m $message" >&2 ;;
70
+ WARN) echo -e "\033[33m[WARN]\033[0m $message" >&2 ;;
71
+ ERROR) echo -e "\033[31m[ERROR]\033[0m $message" >&2 ;;
72
+ esac
73
+ }
74
+
75
+ # log_info MESSAGE [EXTRA_FIELDS]
76
+ # Log an informational message
77
+ #
78
+ # Arguments:
79
+ # MESSAGE - Log message
80
+ # EXTRA_FIELDS - Optional extra JSON fields
81
+ #
82
+ # Example:
83
+ # log_info "Starting workflow"
84
+ # log_info "File processed" '"file":"src/main.go","lines":42'
85
+ #
86
+ log_info() {
87
+ _log "INFO" "$1" "${2:-}"
88
+ }
89
+
90
+ # log_warn MESSAGE [EXTRA_FIELDS]
91
+ # Log a warning message
92
+ #
93
+ # Arguments:
94
+ # MESSAGE - Log message
95
+ # EXTRA_FIELDS - Optional extra JSON fields
96
+ #
97
+ # Example:
98
+ # log_warn "Context usage high"
99
+ # log_warn "Retry needed" '"attempt":2,"max":3'
100
+ #
101
+ log_warn() {
102
+ _log "WARN" "$1" "${2:-}"
103
+ }
104
+
105
+ # log_error MESSAGE [EXTRA_FIELDS]
106
+ # Log an error message
107
+ #
108
+ # Arguments:
109
+ # MESSAGE - Log message
110
+ # EXTRA_FIELDS - Optional extra JSON fields
111
+ #
112
+ # Example:
113
+ # log_error "Command failed"
114
+ # log_error "Test failure" '"test":"test_auth","exit_code":1'
115
+ #
116
+ log_error() {
117
+ _log "ERROR" "$1" "${2:-}"
118
+ }
119
+
120
+ # log_list [N]
121
+ # List recent log entries
122
+ #
123
+ # Arguments:
124
+ # N - Number of entries to show (default: 20)
125
+ #
126
+ # Example:
127
+ # log_list
128
+ # log_list 50
129
+ #
130
+ log_list() {
131
+ local count=${1:-20}
132
+ local log_file
133
+ log_file=$(_get_log_file)
134
+
135
+ if [[ -f "$log_file" ]]; then
136
+ tail -n "$count" "$log_file"
137
+ fi
138
+ }
139
+
140
+ # log_clear
141
+ # Remove all log entries
142
+ #
143
+ # Example:
144
+ # log_clear
145
+ #
146
+ log_clear() {
147
+ local log_file
148
+ log_file=$(_get_log_file)
149
+ rm -f "$log_file"
150
+ }
151
+
152
+ # log_rotate [MAX_LINES]
153
+ # Rotate log file to prevent unbounded growth
154
+ #
155
+ # Arguments:
156
+ # MAX_LINES - Maximum lines to keep (default: 1000)
157
+ #
158
+ # Example:
159
+ # log_rotate
160
+ # log_rotate 500
161
+ #
162
+ log_rotate() {
163
+ local max_lines=${1:-1000}
164
+ local log_file
165
+ log_file=$(_get_log_file)
166
+
167
+ if [[ ! -f "$log_file" ]]; then
168
+ return 0
169
+ fi
170
+
171
+ # Acquire exclusive lock for rotation
172
+ if lock_acquire "$log_file" "exclusive" 5 2>/dev/null; then
173
+ local current_lines
174
+ current_lines=$(wc -l < "$log_file")
175
+
176
+ if ((current_lines > max_lines)); then
177
+ local temp_file
178
+ temp_file=$(mktemp)
179
+ tail -n "$max_lines" "$log_file" > "$temp_file"
180
+ mv "$temp_file" "$log_file"
181
+ fi
182
+ lock_release "$log_file"
183
+ fi
184
+ }
185
+
186
+ # Functions available when sourced
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env zsh
2
+ # Retry utilities with exponential backoff
3
+ # Dev: Fanny Price - "We have all a better guide in ourselves, if we would attend to it."
4
+
5
+ # retry_with_backoff MAX_ATTEMPTS INITIAL_DELAY MAX_DELAY COMMAND...
6
+ # Retry a command with exponential backoff
7
+ #
8
+ # Arguments:
9
+ # MAX_ATTEMPTS - Maximum number of attempts (default: 3)
10
+ # INITIAL_DELAY - Initial delay in seconds (default: 1)
11
+ # MAX_DELAY - Maximum delay cap in seconds (default: 30)
12
+ # COMMAND... - Command to execute
13
+ #
14
+ # Returns:
15
+ # 0 if command succeeds within attempts
16
+ # 1 if all attempts exhausted
17
+ #
18
+ # Example:
19
+ # retry_with_backoff 3 1 10 curl -s https://api.example.com/health
20
+ #
21
+ retry_with_backoff() {
22
+ local max_attempts=${1:-3}
23
+ local delay=${2:-1}
24
+ local max_delay=${3:-30}
25
+ shift 3
26
+
27
+ local attempt=1
28
+ while true; do
29
+ # Try the command
30
+ if "$@"; then
31
+ return 0
32
+ fi
33
+
34
+ # Check if we've exhausted attempts
35
+ if ((attempt >= max_attempts)); then
36
+ return 1
37
+ fi
38
+
39
+ # Wait before retry
40
+ sleep "$delay"
41
+
42
+ # Exponential backoff with cap
43
+ delay=$((delay * 2))
44
+ if ((delay > max_delay)); then
45
+ delay=$max_delay
46
+ fi
47
+
48
+ attempt=$((attempt + 1))
49
+ done
50
+ }
51
+
52
+ # command_with_fallback PRIMARY_CMD FALLBACK_CMD
53
+ # Execute primary command, fall back to alternative if it fails
54
+ #
55
+ # Arguments:
56
+ # PRIMARY_CMD - Primary command to try (as string)
57
+ # FALLBACK_CMD - Fallback command if primary fails (as string)
58
+ #
59
+ # Returns:
60
+ # Exit code of whichever command succeeds (or fallback's exit code)
61
+ #
62
+ # Example:
63
+ # command_with_fallback "git pull --ff-only" "git pull --no-rebase"
64
+ #
65
+ command_with_fallback() {
66
+ local primary_cmd="$1"
67
+ local fallback_cmd="$2"
68
+
69
+ if eval "$primary_cmd"; then
70
+ return 0
71
+ else
72
+ eval "$fallback_cmd"
73
+ fi
74
+ }
75
+
76
+ # Functions available when sourced - no export needed in zsh
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Migration Script: Consolidate quote into catchphrases (MSSCI-12478)
4
+ *
5
+ * For each theme YAML:
6
+ * 1. For each agent: if quote exists and isn't in catchphrases, add it
7
+ * 2. Remove the quote field from all agents
8
+ */
9
+
10
+ import { readFileSync, writeFileSync, readdirSync } from 'node:fs';
11
+ import { join, dirname } from 'node:path';
12
+ import { fileURLToPath } from 'node:url';
13
+
14
+ const __filename = fileURLToPath(import.meta.url);
15
+ const __dirname = dirname(__filename);
16
+
17
+ const THEMES_DIR = join(__dirname, '..', '..', 'personas', 'themes');
18
+
19
+ function migrateThemeFile(filePath) {
20
+ let content = readFileSync(filePath, 'utf-8');
21
+ const lines = content.split('\n');
22
+ const result = [];
23
+
24
+ let i = 0;
25
+ while (i < lines.length) {
26
+ const line = lines[i];
27
+ const trimmed = line.trimEnd();
28
+
29
+ // Check for quote: at 4-space indent (agent level)
30
+ if (/^ quote:/.test(trimmed)) {
31
+ // Extract the quote value
32
+ const quoteMatch = trimmed.match(/^ quote:\s*["']?(.+?)["']?$/);
33
+ if (quoteMatch) {
34
+ const quoteValue = quoteMatch[1];
35
+
36
+ // Look ahead for catchphrases section
37
+ let catchphrasesIndex = -1;
38
+ let catchphrases = [];
39
+
40
+ for (let j = i + 1; j < lines.length; j++) {
41
+ const checkLine = lines[j];
42
+ // Stop if we hit the next agent (2-space indent with colon) or end of agents
43
+ if (/^ \w+:/.test(checkLine) && !/^ /.test(checkLine)) break;
44
+ if (/^agents:/.test(checkLine) || /^theme:/.test(checkLine)) break;
45
+
46
+ if (/^ catchphrases:/.test(checkLine)) {
47
+ catchphrasesIndex = j;
48
+ // Collect existing catchphrases
49
+ for (let k = j + 1; k < lines.length; k++) {
50
+ const catchLine = lines[k];
51
+ if (/^ - /.test(catchLine)) {
52
+ const catchValue = catchLine.replace(/^ - ["']?(.+?)["']?$/, '$1');
53
+ catchphrases.push(catchValue);
54
+ } else if (!/^\s*$/.test(catchLine) && !/^ /.test(catchLine)) {
55
+ break;
56
+ }
57
+ }
58
+ break;
59
+ }
60
+ }
61
+
62
+ // Check if quote is already in catchphrases
63
+ const quoteInCatchphrases = catchphrases.some(c => c === quoteValue);
64
+
65
+ if (!quoteInCatchphrases && catchphrasesIndex === -1) {
66
+ // No catchphrases section - this shouldn't happen based on exploration
67
+ // but handle it anyway by skipping quote (tests expect catchphrases to exist)
68
+ console.log(` Warning: No catchphrases found for agent with quote in ${filePath}`);
69
+ }
70
+
71
+ // Skip the quote line (don't add to result)
72
+ i++;
73
+ continue;
74
+ }
75
+ }
76
+
77
+ result.push(line);
78
+ i++;
79
+ }
80
+
81
+ const newContent = result.join('\n');
82
+ if (newContent !== content) {
83
+ writeFileSync(filePath, newContent);
84
+ return true;
85
+ }
86
+ return false;
87
+ }
88
+
89
+ // Main
90
+ const files = readdirSync(THEMES_DIR).filter(f => f.endsWith('.yaml'));
91
+ console.log(`Migrating ${files.length} theme files...`);
92
+
93
+ let modified = 0;
94
+ for (const file of files) {
95
+ const filePath = join(THEMES_DIR, file);
96
+ if (migrateThemeFile(filePath)) {
97
+ modified++;
98
+ console.log(` Migrated: ${file}`);
99
+ }
100
+ }
101
+
102
+ console.log(`\nDone. Modified ${modified}/${files.length} files.`);
@@ -0,0 +1,91 @@
1
+ #!/bin/bash
2
+ # sidecar-health.sh - Check sidecar files for bloat and staleness
3
+ #
4
+ # Usage: sidecar-health.sh [--fix]
5
+ # --fix Offer to archive bloated files
6
+ #
7
+ # Thresholds:
8
+ # gotchas.md: 50 lines max
9
+ # patterns.md: 50 lines max
10
+ # decisions.md: 40 lines max
11
+
12
+ set -euo pipefail
13
+
14
+ # Find project root
15
+ source "$(dirname "${BASH_SOURCE[0]}")/../lib/find-root.sh"
16
+
17
+ SIDECAR_DIR="$PROJECT_ROOT/.pennyfarthing/sidecars"
18
+ FIX_MODE="${1:-}"
19
+
20
+ # Thresholds
21
+ GOTCHAS_MAX=50
22
+ PATTERNS_MAX=50
23
+ DECISIONS_MAX=40
24
+
25
+ # Colors
26
+ RED='\033[0;31m'
27
+ YELLOW='\033[1;33m'
28
+ GREEN='\033[0;32m'
29
+ NC='\033[0m' # No Color
30
+
31
+ echo "Sidecar Health Check"
32
+ echo "===================="
33
+ echo ""
34
+
35
+ issues_found=0
36
+
37
+ check_file() {
38
+ local file="$1"
39
+ local max_lines="$2"
40
+ local agent=$(basename "$(dirname "$file")")
41
+ local filename=$(basename "$file")
42
+
43
+ if [[ ! -f "$file" ]]; then
44
+ return
45
+ fi
46
+
47
+ local lines=$(wc -l < "$file" | tr -d ' ')
48
+
49
+ if [[ $lines -gt $max_lines ]]; then
50
+ echo -e "${RED}BLOATED${NC}: $agent/$filename ($lines lines, max $max_lines)"
51
+ issues_found=$((issues_found + 1))
52
+
53
+ if [[ "$FIX_MODE" == "--fix" ]]; then
54
+ local archive_dir="$PROJECT_ROOT/.pennyfarthing/sidecars/.archive"
55
+ local timestamp=$(date +%Y%m%d)
56
+ mkdir -p "$archive_dir"
57
+
58
+ echo " → Archiving to .archive/${agent}-${filename%.md}-${timestamp}.md"
59
+ cp "$file" "$archive_dir/${agent}-${filename%.md}-${timestamp}.md"
60
+ echo " → Original preserved. Manually prune $file to <$max_lines lines."
61
+ fi
62
+ elif [[ $lines -gt $((max_lines * 80 / 100)) ]]; then
63
+ echo -e "${YELLOW}WARNING${NC}: $agent/$filename ($lines lines, approaching $max_lines limit)"
64
+ else
65
+ echo -e "${GREEN}OK${NC}: $agent/$filename ($lines lines)"
66
+ fi
67
+ }
68
+
69
+ # Check all agent sidecars
70
+ for agent_dir in "$SIDECAR_DIR"/*/; do
71
+ if [[ -d "$agent_dir" ]]; then
72
+ agent=$(basename "$agent_dir")
73
+ [[ "$agent" == ".archive" ]] && continue
74
+
75
+ check_file "$agent_dir/gotchas.md" $GOTCHAS_MAX
76
+ check_file "$agent_dir/patterns.md" $PATTERNS_MAX
77
+ check_file "$agent_dir/decisions.md" $DECISIONS_MAX
78
+ fi
79
+ done
80
+
81
+ echo ""
82
+ if [[ $issues_found -gt 0 ]]; then
83
+ echo "Found $issues_found bloated file(s)."
84
+ if [[ "$FIX_MODE" != "--fix" ]]; then
85
+ echo "Run with --fix to archive and prepare for pruning."
86
+ fi
87
+ exit 1
88
+ else
89
+ echo "All sidecar files within limits."
90
+ exit 0
91
+ fi
@@ -0,0 +1,44 @@
1
+ # Miscellaneous Scripts
2
+
3
+ Uncategorized utilities and one-off scripts.
4
+
5
+ ## Scripts
6
+
7
+ | Script | Purpose |
8
+ |--------|---------|
9
+ | `deploy.sh` | Deployment script |
10
+ | `doctor-dogfood.sh` | Health check for dogfooding setup |
11
+ | `run-ci.sh` | Run CI locally |
12
+ | `statusline.sh` | Status line configuration |
13
+ | `uninstall.sh` | Uninstall Pennyfarthing from project |
14
+ | `backlog.sh` | Backlog operations |
15
+ | `repo-utils.sh` | Multi-repo utilities |
16
+ | `repo-scan.sh` | Repository scanner |
17
+ | `add-short-names.mjs` | Add short names to themes |
18
+ | `migrate-bmad-workflow.mjs` | BMAD workflow migration |
19
+ | `migrate-bmad-workflow.sh` | BMAD migration wrapper |
20
+ | `find-related-work.sh` | Find related work items |
21
+ | `check-status.sh` | Status checking utilities |
22
+ | `session-cleanup.sh` | Clean up old sessions |
23
+ | `generate-skill-docs.sh` | Generate skill documentation |
24
+ | `log-skill-usage.sh` | Log skill invocations |
25
+ | `skill-usage-report.sh` | Generate skill usage reports |
26
+ | `run-timestamp.sh` | Timestamp utility |
27
+ | `validate-subagent-frontmatter.sh` | Validate subagent YAML frontmatter |
28
+
29
+ ## Usage
30
+
31
+ ```bash
32
+ .pennyfarthing/scripts/misc/doctor-dogfood.sh
33
+ .pennyfarthing/scripts/misc/run-ci.sh
34
+ ```
35
+
36
+ ## Ownership
37
+
38
+ - **Primary users:** Various
39
+ - **Maintained by:** Core Pennyfarthing team
40
+
41
+ ## Note
42
+
43
+ Scripts here may be candidates for moving to more specific categories
44
+ as the codebase evolves.
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env bash
2
+ # add-short-names.sh - Pre-generate shortName field for theme characters
3
+ #
4
+ # Usage:
5
+ # add-short-names.sh # Dry run - show what would change
6
+ # add-short-names.sh --write # Actually write changes
7
+ # add-short-names.sh --theme discworld # Only process one theme
8
+
9
+ set -euo pipefail
10
+
11
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
+
13
+ exec python3 "$SCRIPT_DIR/add_short_names.py" "$@"