@pennyfarthing/core 11.3.4 → 11.3.6

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 (394) hide show
  1. package/README.md +1 -1
  2. package/package.json +14 -1
  3. package/packages/core/dist/cli/commands/doctor.d.ts +9 -1
  4. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
  5. package/packages/core/dist/cli/commands/doctor.js +107 -51
  6. package/packages/core/dist/cli/commands/doctor.js.map +1 -1
  7. package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
  8. package/packages/core/dist/cli/commands/update.js +1 -26
  9. package/packages/core/dist/cli/commands/update.js.map +1 -1
  10. package/packages/core/dist/cli/utils/python.d.ts +1 -0
  11. package/packages/core/dist/cli/utils/python.d.ts.map +1 -1
  12. package/packages/core/dist/cli/utils/python.js +11 -1
  13. package/packages/core/dist/cli/utils/python.js.map +1 -1
  14. package/packages/core/dist/cli/utils/settings-pf-wrapper.test.d.ts +16 -0
  15. package/packages/core/dist/cli/utils/settings-pf-wrapper.test.d.ts.map +1 -0
  16. package/packages/core/dist/cli/utils/settings-pf-wrapper.test.js +377 -0
  17. package/packages/core/dist/cli/utils/settings-pf-wrapper.test.js.map +1 -0
  18. package/packages/core/dist/server/paths.d.ts.map +1 -1
  19. package/packages/core/dist/server/paths.js +6 -0
  20. package/packages/core/dist/server/paths.js.map +1 -1
  21. package/packages/core/dist/workflow/__test_context_watch__/.session/.tandem-turn-counter +1 -0
  22. package/packages/core/dist/workflow/__test_context_watch__/.session/95-6-session.md +3 -0
  23. package/packages/core/dist/workflow/__test_context_watch__/.session/95-6-tandem-architect.md +6 -0
  24. package/packages/core/dist/workflow/__test_file_watch__/.session/95-4-tandem-architect.md +6 -0
  25. package/packages/core/dist/workflow/__test_file_watch__/workdir/trigger.ts +1 -0
  26. package/packages/core/dist/workflow/__test_tool_watch__/.session/95-5-tandem-architect.md +6 -0
  27. package/packages/core/dist/workflow/__test_tool_watch__/.session/95-5-tandem-toolcalls.jsonl +1 -0
  28. package/packages/core/dist/workflow/cross-entity-validation.d.ts +117 -0
  29. package/packages/core/dist/workflow/cross-entity-validation.d.ts.map +1 -0
  30. package/packages/core/dist/workflow/cross-entity-validation.js +148 -0
  31. package/packages/core/dist/workflow/cross-entity-validation.js.map +1 -0
  32. package/packages/core/dist/workflow/cross-entity-validation.test.d.ts +10 -0
  33. package/packages/core/dist/workflow/cross-entity-validation.test.d.ts.map +1 -0
  34. package/packages/core/dist/workflow/cross-entity-validation.test.js +512 -0
  35. package/packages/core/dist/workflow/cross-entity-validation.test.js.map +1 -0
  36. package/packages/core/dist/workflow/team-lifecycle.d.ts +169 -0
  37. package/packages/core/dist/workflow/team-lifecycle.d.ts.map +1 -0
  38. package/packages/core/dist/workflow/team-lifecycle.js +217 -0
  39. package/packages/core/dist/workflow/team-lifecycle.js.map +1 -0
  40. package/packages/core/dist/workflow/team-lifecycle.test.d.ts +20 -0
  41. package/packages/core/dist/workflow/team-lifecycle.test.d.ts.map +1 -0
  42. package/packages/core/dist/workflow/team-lifecycle.test.js +966 -0
  43. package/packages/core/dist/workflow/team-lifecycle.test.js.map +1 -0
  44. package/packages/core/dist/workflow/workflow-graph-validation.d.ts +65 -0
  45. package/packages/core/dist/workflow/workflow-graph-validation.d.ts.map +1 -0
  46. package/packages/core/dist/workflow/workflow-graph-validation.js +190 -0
  47. package/packages/core/dist/workflow/workflow-graph-validation.js.map +1 -0
  48. package/packages/core/dist/workflow/workflow-graph-validation.test.d.ts +18 -0
  49. package/packages/core/dist/workflow/workflow-graph-validation.test.d.ts.map +1 -0
  50. package/packages/core/dist/workflow/workflow-graph-validation.test.js +706 -0
  51. package/packages/core/dist/workflow/workflow-graph-validation.test.js.map +1 -0
  52. package/pennyfarthing-dist/pf/__pycache__/__init__.cpython-314.pyc +0 -0
  53. package/pennyfarthing-dist/pf/__pycache__/cli.cpython-314.pyc +0 -0
  54. package/pennyfarthing-dist/pf/__pycache__/context.cpython-314.pyc +0 -0
  55. package/pennyfarthing-dist/pf/bc/__pycache__/__init__.cpython-314.pyc +0 -0
  56. package/pennyfarthing-dist/pf/bc/__pycache__/cli.cpython-314.pyc +0 -0
  57. package/pennyfarthing-dist/pf/bc/__pycache__/focus.cpython-314.pyc +0 -0
  58. package/pennyfarthing-dist/pf/bc/__pycache__/split.cpython-314.pyc +0 -0
  59. package/pennyfarthing-dist/pf/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
  60. package/pennyfarthing-dist/pf/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  61. package/pennyfarthing-dist/pf/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  62. package/pennyfarthing-dist/pf/bmad/__pycache__/__init__.cpython-314.pyc +0 -0
  63. package/pennyfarthing-dist/pf/bmad/__pycache__/cli.cpython-314.pyc +0 -0
  64. package/pennyfarthing-dist/pf/common/__pycache__/__init__.cpython-314.pyc +0 -0
  65. package/pennyfarthing-dist/pf/common/__pycache__/config.cpython-314.pyc +0 -0
  66. package/pennyfarthing-dist/pf/common/__pycache__/output.cpython-314.pyc +0 -0
  67. package/pennyfarthing-dist/pf/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
  68. package/pennyfarthing-dist/pf/consultation/__pycache__/cli.cpython-314.pyc +0 -0
  69. package/pennyfarthing-dist/pf/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
  70. package/pennyfarthing-dist/pf/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
  71. package/pennyfarthing-dist/pf/epic/__pycache__/__init__.cpython-314.pyc +0 -0
  72. package/pennyfarthing-dist/pf/epic/__pycache__/cli.cpython-314.pyc +0 -0
  73. package/pennyfarthing-dist/pf/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
  74. package/pennyfarthing-dist/pf/git_group/__pycache__/cli.cpython-314.pyc +0 -0
  75. package/pennyfarthing-dist/pf/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
  76. package/pennyfarthing-dist/pf/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  77. package/pennyfarthing-dist/pf/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  78. package/pennyfarthing-dist/pf/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  79. package/pennyfarthing-dist/pf/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
  80. package/pennyfarthing-dist/pf/healthscore/__pycache__/models.cpython-314.pyc +0 -0
  81. package/pennyfarthing-dist/pf/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
  82. package/pennyfarthing-dist/pf/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
  83. package/pennyfarthing-dist/pf/hooks/__pycache__/cli.cpython-314.pyc +0 -0
  84. package/pennyfarthing-dist/pf/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
  85. package/pennyfarthing-dist/pf/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
  86. package/pennyfarthing-dist/pf/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
  87. package/pennyfarthing-dist/pf/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
  88. package/pennyfarthing-dist/pf/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
  89. package/pennyfarthing-dist/pf/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
  90. package/pennyfarthing-dist/pf/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
  91. package/pennyfarthing-dist/pf/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
  92. package/pennyfarthing-dist/pf/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  93. package/pennyfarthing-dist/pf/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  94. package/pennyfarthing-dist/pf/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  95. package/pennyfarthing-dist/pf/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  96. package/pennyfarthing-dist/pf/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  97. package/pennyfarthing-dist/pf/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  98. package/pennyfarthing-dist/pf/jira/__pycache__/claim.cpython-314.pyc +0 -0
  99. package/pennyfarthing-dist/pf/jira/__pycache__/cli.cpython-314.pyc +0 -0
  100. package/pennyfarthing-dist/pf/jira/__pycache__/client.cpython-314.pyc +0 -0
  101. package/pennyfarthing-dist/pf/jira/__pycache__/create.cpython-314.pyc +0 -0
  102. package/pennyfarthing-dist/pf/jira/__pycache__/epic.cpython-314.pyc +0 -0
  103. package/pennyfarthing-dist/pf/jira/__pycache__/operations.cpython-314.pyc +0 -0
  104. package/pennyfarthing-dist/pf/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  105. package/pennyfarthing-dist/pf/jira/__pycache__/story.cpython-314.pyc +0 -0
  106. package/pennyfarthing-dist/pf/jira/__pycache__/sync.cpython-314.pyc +0 -0
  107. package/pennyfarthing-dist/pf/launch/__pycache__/__init__.cpython-314.pyc +0 -0
  108. package/pennyfarthing-dist/pf/launch/__pycache__/cli.cpython-314.pyc +0 -0
  109. package/pennyfarthing-dist/pf/session/__pycache__/__init__.cpython-314.pyc +0 -0
  110. package/pennyfarthing-dist/pf/session/__pycache__/cli.cpython-314.pyc +0 -0
  111. package/pennyfarthing-dist/pf/settings/__pycache__/__init__.cpython-314.pyc +0 -0
  112. package/pennyfarthing-dist/pf/settings/__pycache__/cli.cpython-314.pyc +0 -0
  113. package/pennyfarthing-dist/pf/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  114. package/pennyfarthing-dist/pf/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  115. package/pennyfarthing-dist/pf/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  116. package/pennyfarthing-dist/pf/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  117. package/pennyfarthing-dist/pf/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
  118. package/pennyfarthing-dist/pf/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  119. package/pennyfarthing-dist/pf/sprint/__pycache__/status.cpython-314.pyc +0 -0
  120. package/pennyfarthing-dist/pf/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  121. package/pennyfarthing-dist/pf/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  122. package/pennyfarthing-dist/pf/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  123. package/pennyfarthing-dist/pf/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  124. package/pennyfarthing-dist/pf/sprint/__pycache__/work.cpython-314.pyc +0 -0
  125. package/pennyfarthing-dist/pf/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  126. package/pennyfarthing-dist/pf/theme/__pycache__/__init__.cpython-314.pyc +0 -0
  127. package/pennyfarthing-dist/pf/theme/__pycache__/cli.cpython-314.pyc +0 -0
  128. package/pennyfarthing-dist/pf/validate/__pycache__/__init__.cpython-314.pyc +0 -0
  129. package/pennyfarthing-dist/pf/validate/__pycache__/cli.cpython-314.pyc +0 -0
  130. package/pennyfarthing-dist/pf/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
  131. package/pennyfarthing-dist/pf/workflow/__pycache__/cli.cpython-314.pyc +0 -0
  132. package/pennyfarthing-dist/pf/workflow/__pycache__/scale.cpython-314.pyc +0 -0
  133. package/pennyfarthing-dist/pf/workflow/__pycache__/state.cpython-314.pyc +0 -0
  134. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.d.ts +0 -17
  135. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.d.ts.map +0 -1
  136. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.js +0 -470
  137. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.js.map +0 -1
  138. package/packages/core/dist/cli/cyclist-migration.test.d.ts +0 -16
  139. package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +0 -1
  140. package/packages/core/dist/cli/cyclist-migration.test.js +0 -229
  141. package/packages/core/dist/cli/cyclist-migration.test.js.map +0 -1
  142. package/packages/core/dist/cli/utils/stale-artifacts.d.ts +0 -59
  143. package/packages/core/dist/cli/utils/stale-artifacts.d.ts.map +0 -1
  144. package/packages/core/dist/cli/utils/stale-artifacts.js +0 -163
  145. package/packages/core/dist/cli/utils/stale-artifacts.js.map +0 -1
  146. package/packages/core/dist/scripts/benchmark-integration.d.ts +0 -182
  147. package/packages/core/dist/scripts/benchmark-integration.d.ts.map +0 -1
  148. package/packages/core/dist/scripts/benchmark-integration.js +0 -691
  149. package/packages/core/dist/scripts/benchmark-integration.js.map +0 -1
  150. package/packages/core/dist/scripts/job-fair-aggregator.d.ts +0 -150
  151. package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +0 -1
  152. package/packages/core/dist/scripts/job-fair-aggregator.js +0 -547
  153. package/packages/core/dist/scripts/job-fair-aggregator.js.map +0 -1
  154. package/packages/core/dist/scripts/theme-detail.test.d.ts.map +0 -1
  155. package/packages/core/dist/scripts/theme-detail.test.js.map +0 -1
  156. package/pennyfarthing-dist/pf/__pycache__/__init__.cpython-311.pyc +0 -0
  157. package/pennyfarthing-dist/pf/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
  158. package/pennyfarthing-dist/pf/__pycache__/cli.cpython-311.pyc +0 -0
  159. package/pennyfarthing-dist/pf/__pycache__/config.cpython-314.pyc +0 -0
  160. package/pennyfarthing-dist/pf/__pycache__/context.cpython-311.pyc +0 -0
  161. package/pennyfarthing-dist/pf/__pycache__/hooks.cpython-314.pyc +0 -0
  162. package/pennyfarthing-dist/pf/__pycache__/jira.cpython-314.pyc +0 -0
  163. package/pennyfarthing-dist/pf/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
  164. package/pennyfarthing-dist/pf/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
  165. package/pennyfarthing-dist/pf/__pycache__/jira_sync.cpython-314.pyc +0 -0
  166. package/pennyfarthing-dist/pf/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
  167. package/pennyfarthing-dist/pf/__pycache__/output.cpython-314.pyc +0 -0
  168. package/pennyfarthing-dist/pf/__pycache__/patch_mode.cpython-314.pyc +0 -0
  169. package/pennyfarthing-dist/pf/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  170. package/pennyfarthing-dist/pf/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  171. package/pennyfarthing-dist/pf/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  172. package/pennyfarthing-dist/pf/__pycache__/sprint.cpython-314.pyc +0 -0
  173. package/pennyfarthing-dist/pf/__pycache__/workflow.cpython-311.pyc +0 -0
  174. package/pennyfarthing-dist/pf/__pycache__/workflow.cpython-314.pyc +0 -0
  175. package/pennyfarthing-dist/pf/bc/__pycache__/__init__.cpython-311.pyc +0 -0
  176. package/pennyfarthing-dist/pf/bc/__pycache__/cli.cpython-311.pyc +0 -0
  177. package/pennyfarthing-dist/pf/bc/__pycache__/focus.cpython-311.pyc +0 -0
  178. package/pennyfarthing-dist/pf/bikerack/__pycache__/__init__.cpython-311.pyc +0 -0
  179. package/pennyfarthing-dist/pf/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
  180. package/pennyfarthing-dist/pf/bikerack/__pycache__/audit_log_panel.cpython-314.pyc +0 -0
  181. package/pennyfarthing-dist/pf/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  182. package/pennyfarthing-dist/pf/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  183. package/pennyfarthing-dist/pf/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  184. package/pennyfarthing-dist/pf/bikerack/__pycache__/cli.cpython-311.pyc +0 -0
  185. package/pennyfarthing-dist/pf/bikerack/__pycache__/context_meter_footer.cpython-314.pyc +0 -0
  186. package/pennyfarthing-dist/pf/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  187. package/pennyfarthing-dist/pf/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  188. package/pennyfarthing-dist/pf/bikerack/__pycache__/events.cpython-314.pyc +0 -0
  189. package/pennyfarthing-dist/pf/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  190. package/pennyfarthing-dist/pf/bikerack/__pycache__/launcher.cpython-311.pyc +0 -0
  191. package/pennyfarthing-dist/pf/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
  192. package/pennyfarthing-dist/pf/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
  193. package/pennyfarthing-dist/pf/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  194. package/pennyfarthing-dist/pf/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
  195. package/pennyfarthing-dist/pf/bikerack/__pycache__/story_detail_screen.cpython-314.pyc +0 -0
  196. package/pennyfarthing-dist/pf/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  197. package/pennyfarthing-dist/pf/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  198. package/pennyfarthing-dist/pf/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  199. package/pennyfarthing-dist/pf/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  200. package/pennyfarthing-dist/pf/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  201. package/pennyfarthing-dist/pf/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  202. package/pennyfarthing-dist/pf/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
  203. package/pennyfarthing-dist/pf/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
  204. package/pennyfarthing-dist/pf/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
  205. package/pennyfarthing-dist/pf/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
  206. package/pennyfarthing-dist/pf/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
  207. package/pennyfarthing-dist/pf/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
  208. package/pennyfarthing-dist/pf/common/__pycache__/__init__.cpython-311.pyc +0 -0
  209. package/pennyfarthing-dist/pf/common/__pycache__/config.cpython-311.pyc +0 -0
  210. package/pennyfarthing-dist/pf/common/__pycache__/output.cpython-311.pyc +0 -0
  211. package/pennyfarthing-dist/pf/common/__pycache__/pr_config.cpython-314.pyc +0 -0
  212. package/pennyfarthing-dist/pf/common/__pycache__/themes.cpython-314.pyc +0 -0
  213. package/pennyfarthing-dist/pf/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  214. package/pennyfarthing-dist/pf/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
  215. package/pennyfarthing-dist/pf/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  216. package/pennyfarthing-dist/pf/complexity/__pycache__/cli.cpython-314.pyc +0 -0
  217. package/pennyfarthing-dist/pf/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
  218. package/pennyfarthing-dist/pf/complexity/__pycache__/models.cpython-314.pyc +0 -0
  219. package/pennyfarthing-dist/pf/consultation/__pycache__/__init__.cpython-311.pyc +0 -0
  220. package/pennyfarthing-dist/pf/consultation/__pycache__/cli.cpython-311.pyc +0 -0
  221. package/pennyfarthing-dist/pf/consultation/__pycache__/dialogue_manager.cpython-314.pyc +0 -0
  222. package/pennyfarthing-dist/pf/deadcode/__pycache__/__init__.cpython-311.pyc +0 -0
  223. package/pennyfarthing-dist/pf/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
  224. package/pennyfarthing-dist/pf/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  225. package/pennyfarthing-dist/pf/deadcode/__pycache__/cli.cpython-311.pyc +0 -0
  226. package/pennyfarthing-dist/pf/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
  227. package/pennyfarthing-dist/pf/deadcode/__pycache__/models.cpython-314.pyc +0 -0
  228. package/pennyfarthing-dist/pf/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  229. package/pennyfarthing-dist/pf/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
  230. package/pennyfarthing-dist/pf/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  231. package/pennyfarthing-dist/pf/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
  232. package/pennyfarthing-dist/pf/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
  233. package/pennyfarthing-dist/pf/dependencies/__pycache__/models.cpython-314.pyc +0 -0
  234. package/pennyfarthing-dist/pf/epic/__pycache__/__init__.cpython-311.pyc +0 -0
  235. package/pennyfarthing-dist/pf/epic/__pycache__/cli.cpython-311.pyc +0 -0
  236. package/pennyfarthing-dist/pf/git/__pycache__/__init__.cpython-314.pyc +0 -0
  237. package/pennyfarthing-dist/pf/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  238. package/pennyfarthing-dist/pf/git/__pycache__/status_all.cpython-314.pyc +0 -0
  239. package/pennyfarthing-dist/pf/git_group/__pycache__/__init__.cpython-311.pyc +0 -0
  240. package/pennyfarthing-dist/pf/git_group/__pycache__/cli.cpython-311.pyc +0 -0
  241. package/pennyfarthing-dist/pf/handoff/__pycache__/__init__.cpython-311.pyc +0 -0
  242. package/pennyfarthing-dist/pf/handoff/__pycache__/cli.cpython-311.pyc +0 -0
  243. package/pennyfarthing-dist/pf/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  244. package/pennyfarthing-dist/pf/handoff/__pycache__/gate_file.cpython-314.pyc +0 -0
  245. package/pennyfarthing-dist/pf/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
  246. package/pennyfarthing-dist/pf/handoff/__pycache__/marker.cpython-314.pyc +0 -0
  247. package/pennyfarthing-dist/pf/handoff/__pycache__/phase_check.cpython-314.pyc +0 -0
  248. package/pennyfarthing-dist/pf/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  249. package/pennyfarthing-dist/pf/healthscore/__pycache__/__init__.cpython-311.pyc +0 -0
  250. package/pennyfarthing-dist/pf/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  251. package/pennyfarthing-dist/pf/healthscore/__pycache__/analyze.cpython-311.pyc +0 -0
  252. package/pennyfarthing-dist/pf/healthscore/__pycache__/cli.cpython-311.pyc +0 -0
  253. package/pennyfarthing-dist/pf/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
  254. package/pennyfarthing-dist/pf/healthscore/__pycache__/models.cpython-311.pyc +0 -0
  255. package/pennyfarthing-dist/pf/hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  256. package/pennyfarthing-dist/pf/hooks/__pycache__/bell_mode.cpython-311.pyc +0 -0
  257. package/pennyfarthing-dist/pf/hooks/__pycache__/cli.cpython-311.pyc +0 -0
  258. package/pennyfarthing-dist/pf/hooks/__pycache__/context_breaker.cpython-311.pyc +0 -0
  259. package/pennyfarthing-dist/pf/hooks/__pycache__/context_warning.cpython-311.pyc +0 -0
  260. package/pennyfarthing-dist/pf/hooks/__pycache__/cyclist_pretooluse.cpython-311.pyc +0 -0
  261. package/pennyfarthing-dist/pf/hooks/__pycache__/pre_edit_check.cpython-311.pyc +0 -0
  262. package/pennyfarthing-dist/pf/hooks/__pycache__/reflector_check.cpython-311.pyc +0 -0
  263. package/pennyfarthing-dist/pf/hooks/__pycache__/schema_validation.cpython-311.pyc +0 -0
  264. package/pennyfarthing-dist/pf/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
  265. package/pennyfarthing-dist/pf/hooks/__pycache__/session_start.cpython-311.pyc +0 -0
  266. package/pennyfarthing-dist/pf/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
  267. package/pennyfarthing-dist/pf/hooks/__pycache__/sprint_yaml_validation.cpython-311.pyc +0 -0
  268. package/pennyfarthing-dist/pf/hooks/__pycache__/statusline.cpython-311.pyc +0 -0
  269. package/pennyfarthing-dist/pf/hotspots/__pycache__/__init__.cpython-311.pyc +0 -0
  270. package/pennyfarthing-dist/pf/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
  271. package/pennyfarthing-dist/pf/hotspots/__pycache__/analyze.cpython-311.pyc +0 -0
  272. package/pennyfarthing-dist/pf/hotspots/__pycache__/cli.cpython-311.pyc +0 -0
  273. package/pennyfarthing-dist/pf/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
  274. package/pennyfarthing-dist/pf/hotspots/__pycache__/models.cpython-311.pyc +0 -0
  275. package/pennyfarthing-dist/pf/jira/__pycache__/__init__.cpython-311.pyc +0 -0
  276. package/pennyfarthing-dist/pf/jira/__pycache__/__main__.cpython-314.pyc +0 -0
  277. package/pennyfarthing-dist/pf/jira/__pycache__/bidirectional.cpython-311.pyc +0 -0
  278. package/pennyfarthing-dist/pf/jira/__pycache__/claim.cpython-311.pyc +0 -0
  279. package/pennyfarthing-dist/pf/jira/__pycache__/cli.cpython-311.pyc +0 -0
  280. package/pennyfarthing-dist/pf/jira/__pycache__/client.cpython-311.pyc +0 -0
  281. package/pennyfarthing-dist/pf/jira/__pycache__/compat.cpython-314.pyc +0 -0
  282. package/pennyfarthing-dist/pf/jira/__pycache__/create.cpython-311.pyc +0 -0
  283. package/pennyfarthing-dist/pf/jira/__pycache__/epic.cpython-311.pyc +0 -0
  284. package/pennyfarthing-dist/pf/jira/__pycache__/mappings.cpython-314.pyc +0 -0
  285. package/pennyfarthing-dist/pf/jira/__pycache__/models.cpython-314.pyc +0 -0
  286. package/pennyfarthing-dist/pf/jira/__pycache__/operations.cpython-311.pyc +0 -0
  287. package/pennyfarthing-dist/pf/jira/__pycache__/reconcile.cpython-311.pyc +0 -0
  288. package/pennyfarthing-dist/pf/jira/__pycache__/story.cpython-311.pyc +0 -0
  289. package/pennyfarthing-dist/pf/jira/__pycache__/sync.cpython-311.pyc +0 -0
  290. package/pennyfarthing-dist/pf/launch/__pycache__/__init__.cpython-311.pyc +0 -0
  291. package/pennyfarthing-dist/pf/launch/__pycache__/cli.cpython-311.pyc +0 -0
  292. package/pennyfarthing-dist/pf/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  293. package/pennyfarthing-dist/pf/migration/__pycache__/__main__.cpython-314.pyc +0 -0
  294. package/pennyfarthing-dist/pf/migration/__pycache__/cli.cpython-314.pyc +0 -0
  295. package/pennyfarthing-dist/pf/migration/__pycache__/session.cpython-314.pyc +0 -0
  296. package/pennyfarthing-dist/pf/migration/__pycache__/skill.cpython-314.pyc +0 -0
  297. package/pennyfarthing-dist/pf/migration/__pycache__/step.cpython-314.pyc +0 -0
  298. package/pennyfarthing-dist/pf/migration/__pycache__/validate.cpython-314.pyc +0 -0
  299. package/pennyfarthing-dist/pf/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  300. package/pennyfarthing-dist/pf/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
  301. package/pennyfarthing-dist/pf/preflight/__pycache__/cli.cpython-314.pyc +0 -0
  302. package/pennyfarthing-dist/pf/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  303. package/pennyfarthing-dist/pf/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  304. package/pennyfarthing-dist/pf/prime/__pycache__/__main__.cpython-314.pyc +0 -0
  305. package/pennyfarthing-dist/pf/prime/__pycache__/cli.cpython-314.pyc +0 -0
  306. package/pennyfarthing-dist/pf/prime/__pycache__/loader.cpython-314.pyc +0 -0
  307. package/pennyfarthing-dist/pf/prime/__pycache__/models.cpython-314.pyc +0 -0
  308. package/pennyfarthing-dist/pf/prime/__pycache__/persona.cpython-314.pyc +0 -0
  309. package/pennyfarthing-dist/pf/prime/__pycache__/session.cpython-314.pyc +0 -0
  310. package/pennyfarthing-dist/pf/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  311. package/pennyfarthing-dist/pf/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
  312. package/pennyfarthing-dist/pf/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  313. package/pennyfarthing-dist/pf/session/__pycache__/__init__.cpython-311.pyc +0 -0
  314. package/pennyfarthing-dist/pf/session/__pycache__/cli.cpython-311.pyc +0 -0
  315. package/pennyfarthing-dist/pf/settings/__pycache__/settings.cpython-314.pyc +0 -0
  316. package/pennyfarthing-dist/pf/sprint/__pycache__/__init__.cpython-311.pyc +0 -0
  317. package/pennyfarthing-dist/pf/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  318. package/pennyfarthing-dist/pf/sprint/__pycache__/archive.cpython-311.pyc +0 -0
  319. package/pennyfarthing-dist/pf/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  320. package/pennyfarthing-dist/pf/sprint/__pycache__/cli.cpython-311.pyc +0 -0
  321. package/pennyfarthing-dist/pf/sprint/__pycache__/epic_add.cpython-311.pyc +0 -0
  322. package/pennyfarthing-dist/pf/sprint/__pycache__/epic_update.cpython-311.pyc +0 -0
  323. package/pennyfarthing-dist/pf/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
  324. package/pennyfarthing-dist/pf/sprint/__pycache__/loader.cpython-311.pyc +0 -0
  325. package/pennyfarthing-dist/pf/sprint/__pycache__/status.cpython-311.pyc +0 -0
  326. package/pennyfarthing-dist/pf/sprint/__pycache__/story_add.cpython-311.pyc +0 -0
  327. package/pennyfarthing-dist/pf/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  328. package/pennyfarthing-dist/pf/sprint/__pycache__/story_update.cpython-311.pyc +0 -0
  329. package/pennyfarthing-dist/pf/sprint/__pycache__/validate_cmd.cpython-311.pyc +0 -0
  330. package/pennyfarthing-dist/pf/sprint/__pycache__/validator.cpython-311.pyc +0 -0
  331. package/pennyfarthing-dist/pf/sprint/__pycache__/work.cpython-311.pyc +0 -0
  332. package/pennyfarthing-dist/pf/sprint/__pycache__/yaml_io.cpython-311.pyc +0 -0
  333. package/pennyfarthing-dist/pf/story/__pycache__/__init__.cpython-314.pyc +0 -0
  334. package/pennyfarthing-dist/pf/story/__pycache__/__main__.cpython-314.pyc +0 -0
  335. package/pennyfarthing-dist/pf/story/__pycache__/cli.cpython-314.pyc +0 -0
  336. package/pennyfarthing-dist/pf/story/__pycache__/create.cpython-314.pyc +0 -0
  337. package/pennyfarthing-dist/pf/story/__pycache__/size.cpython-314.pyc +0 -0
  338. package/pennyfarthing-dist/pf/story/__pycache__/template.cpython-314.pyc +0 -0
  339. package/pennyfarthing-dist/pf/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  340. package/pennyfarthing-dist/pf/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  341. package/pennyfarthing-dist/pf/tests/__pycache__/test_108_1_gate_migration.cpython-314-pytest-9.0.2.pyc +0 -0
  342. package/pennyfarthing-dist/pf/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
  343. package/pennyfarthing-dist/pf/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
  344. package/pennyfarthing-dist/pf/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  345. package/pennyfarthing-dist/pf/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  346. package/pennyfarthing-dist/pf/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  347. package/pennyfarthing-dist/pf/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
  348. package/pennyfarthing-dist/pf/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
  349. package/pennyfarthing-dist/pf/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  350. package/pennyfarthing-dist/pf/tests/__pycache__/test_confidence_sm_evaluation.cpython-314-pytest-9.0.2.pyc +0 -0
  351. package/pennyfarthing-dist/pf/tests/__pycache__/test_confidence_sm_gate.cpython-314-pytest-9.0.2.pyc +0 -0
  352. package/pennyfarthing-dist/pf/tests/__pycache__/test_dialogue_manager.cpython-314-pytest-9.0.2.pyc +0 -0
  353. package/pennyfarthing-dist/pf/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
  354. package/pennyfarthing-dist/pf/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  355. package/pennyfarthing-dist/pf/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  356. package/pennyfarthing-dist/pf/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
  357. package/pennyfarthing-dist/pf/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
  358. package/pennyfarthing-dist/pf/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  359. package/pennyfarthing-dist/pf/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  360. package/pennyfarthing-dist/pf/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  361. package/pennyfarthing-dist/pf/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  362. package/pennyfarthing-dist/pf/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  363. package/pennyfarthing-dist/pf/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  364. package/pennyfarthing-dist/pf/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  365. package/pennyfarthing-dist/pf/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
  366. package/pennyfarthing-dist/pf/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  367. package/pennyfarthing-dist/pf/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
  368. package/pennyfarthing-dist/pf/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  369. package/pennyfarthing-dist/pf/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  370. package/pennyfarthing-dist/pf/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
  371. package/pennyfarthing-dist/pf/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
  372. package/pennyfarthing-dist/pf/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
  373. package/pennyfarthing-dist/pf/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
  374. package/pennyfarthing-dist/pf/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
  375. package/pennyfarthing-dist/pf/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  376. package/pennyfarthing-dist/pf/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  377. package/pennyfarthing-dist/pf/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  378. package/pennyfarthing-dist/pf/theme/__pycache__/__init__.cpython-311.pyc +0 -0
  379. package/pennyfarthing-dist/pf/theme/__pycache__/cli.cpython-311.pyc +0 -0
  380. package/pennyfarthing-dist/pf/validate/__pycache__/__init__.cpython-311.pyc +0 -0
  381. package/pennyfarthing-dist/pf/validate/__pycache__/cli.cpython-311.pyc +0 -0
  382. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
  383. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
  384. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
  385. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
  386. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
  387. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/tandem_awareness.cpython-314.pyc +0 -0
  388. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
  389. package/pennyfarthing-dist/pf/workflow/__pycache__/__init__.cpython-311.pyc +0 -0
  390. package/pennyfarthing-dist/pf/workflow/__pycache__/cli.cpython-311.pyc +0 -0
  391. package/pennyfarthing-dist/pf/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
  392. package/pennyfarthing-dist/pf/workflow/__pycache__/scale.cpython-311.pyc +0 -0
  393. package/pennyfarthing-dist/pf/workflow/__pycache__/state.cpython-311.pyc +0 -0
  394. package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
@@ -0,0 +1,512 @@
1
+ /**
2
+ * Tests for Story 91-15: Cross-Entity Reference Validation
3
+ *
4
+ * Layer 4 validation — semantic cross-references between agents, workflows,
5
+ * commands, and skills. Builds on Layers 0-3 (formatting, file refs, schema, graph).
6
+ *
7
+ * Run with: node --test dist/workflow/cross-entity-validation.test.js
8
+ */
9
+ import { describe, it } from 'node:test';
10
+ import assert from 'node:assert/strict';
11
+ import { validateCrossEntityRefs, } from './cross-entity-validation.js';
12
+ // ---------------------------------------------------------------------------
13
+ // Helpers
14
+ // ---------------------------------------------------------------------------
15
+ /** Minimal valid context with typical agents, workflows, commands, skills */
16
+ function defaultContext(overrides) {
17
+ return {
18
+ knownAgentFiles: ['sm', 'tea', 'dev', 'reviewer', 'architect', 'pm'],
19
+ knownWorkflowNames: ['tdd', 'trivial', 'bdd', 'tdd-tandem'],
20
+ knownCommandFiles: ['pf-sprint', 'pf-dev', 'pf-tea', 'pf-reviewer', 'pf-sm'],
21
+ knownSkillNames: ['pf-sprint', 'pf-testing', 'pf-jira', 'pf-code-review'],
22
+ workflowAgentRefs: [
23
+ { workflow: 'tdd', referencedAgents: ['sm', 'tea', 'dev', 'reviewer'] },
24
+ { workflow: 'trivial', referencedAgents: ['sm', 'dev', 'reviewer'] },
25
+ ],
26
+ agentWorkflowRefs: [
27
+ { agent: 'sm', referencedWorkflows: ['tdd', 'trivial'] },
28
+ { agent: 'tea', referencedWorkflows: ['tdd'] },
29
+ { agent: 'dev', referencedWorkflows: ['tdd', 'trivial'] },
30
+ { agent: 'reviewer', referencedWorkflows: ['tdd', 'trivial'] },
31
+ ],
32
+ skillEntityRefs: [
33
+ { skill: 'pf-sprint', relatedSkills: ['pf-jira'] },
34
+ { skill: 'pf-testing', relatedSkills: ['pf-code-review'] },
35
+ { skill: 'pf-jira', relatedSkills: ['pf-sprint'] },
36
+ { skill: 'pf-code-review', relatedSkills: ['pf-testing'] },
37
+ ],
38
+ commandSkillRefs: [
39
+ { command: 'pf-sprint', referencedSkills: ['pf-sprint'] },
40
+ { command: 'pf-dev', referencedSkills: ['pf-testing'] },
41
+ ],
42
+ ...overrides,
43
+ };
44
+ }
45
+ /** Helper to collect error messages from result */
46
+ function errorMessages(result) {
47
+ return (result.errors ?? []).map(e => e.message);
48
+ }
49
+ /** Helper to collect warning messages from result */
50
+ function warningMessages(result) {
51
+ return (result.warnings ?? []).map(w => w.message);
52
+ }
53
+ // ===========================================================================
54
+ // Tests
55
+ // ===========================================================================
56
+ describe('Cross-Entity Reference Validation (91-15)', () => {
57
+ // -------------------------------------------------------------------------
58
+ // AC1: Validate that agents referenced in workflows exist
59
+ // -------------------------------------------------------------------------
60
+ describe('AC1: Agents referenced in workflows exist', () => {
61
+ it('should accept when all workflow-referenced agents have agent files', () => {
62
+ const ctx = defaultContext();
63
+ const result = validateCrossEntityRefs(ctx);
64
+ assert.strictEqual(result.valid, true, 'All agents exist — should be valid');
65
+ assert.strictEqual((result.errors ?? []).length, 0, 'No errors expected');
66
+ });
67
+ it('should error when workflow references an agent with no agent file', () => {
68
+ const ctx = defaultContext({
69
+ workflowAgentRefs: [
70
+ { workflow: 'tdd', referencedAgents: ['sm', 'tea', 'ghost-agent', 'reviewer'] },
71
+ ],
72
+ });
73
+ const result = validateCrossEntityRefs(ctx);
74
+ assert.strictEqual(result.valid, false, 'Missing agent file should fail');
75
+ const msgs = errorMessages(result);
76
+ assert.ok(msgs.some(m => m.includes('ghost-agent') && m.includes('tdd')), `Expected error about 'ghost-agent' in workflow 'tdd', got: ${msgs.join('; ')}`);
77
+ });
78
+ it('should report all missing agents across multiple workflows', () => {
79
+ const ctx = defaultContext({
80
+ workflowAgentRefs: [
81
+ { workflow: 'tdd', referencedAgents: ['sm', 'phantom'] },
82
+ { workflow: 'trivial', referencedAgents: ['missing-dev', 'reviewer'] },
83
+ ],
84
+ });
85
+ const result = validateCrossEntityRefs(ctx);
86
+ assert.strictEqual(result.valid, false);
87
+ const msgs = errorMessages(result);
88
+ assert.ok(msgs.some(m => m.includes('phantom')), 'Should report phantom');
89
+ assert.ok(msgs.some(m => m.includes('missing-dev')), 'Should report missing-dev');
90
+ });
91
+ it('should error for each distinct missing agent in a workflow', () => {
92
+ const ctx = defaultContext({
93
+ workflowAgentRefs: [
94
+ { workflow: 'broken', referencedAgents: ['nobody', 'also-nobody'] },
95
+ ],
96
+ });
97
+ const result = validateCrossEntityRefs(ctx);
98
+ assert.strictEqual(result.valid, false);
99
+ const msgs = errorMessages(result);
100
+ assert.ok(msgs.some(m => m.includes('nobody')), 'Should report nobody');
101
+ assert.ok(msgs.some(m => m.includes('also-nobody')), 'Should report also-nobody');
102
+ });
103
+ });
104
+ // -------------------------------------------------------------------------
105
+ // AC2: Validate that workflows referenced in agents are properly defined
106
+ // -------------------------------------------------------------------------
107
+ describe('AC2: Workflows referenced in agents are properly defined', () => {
108
+ it('should accept when all agent-referenced workflows exist', () => {
109
+ const ctx = defaultContext();
110
+ const result = validateCrossEntityRefs(ctx);
111
+ assert.strictEqual(result.valid, true, 'All workflows exist — should be valid');
112
+ });
113
+ it('should error when agent references a workflow that does not exist', () => {
114
+ const ctx = defaultContext({
115
+ agentWorkflowRefs: [
116
+ { agent: 'dev', referencedWorkflows: ['tdd', 'nonexistent-workflow'] },
117
+ ],
118
+ });
119
+ const result = validateCrossEntityRefs(ctx);
120
+ assert.strictEqual(result.valid, false, 'Missing workflow should fail');
121
+ const msgs = errorMessages(result);
122
+ assert.ok(msgs.some(m => m.includes('nonexistent-workflow') && m.includes('dev')), `Expected error about 'nonexistent-workflow' referenced by 'dev', got: ${msgs.join('; ')}`);
123
+ });
124
+ it('should report multiple missing workflow references across agents', () => {
125
+ const ctx = defaultContext({
126
+ agentWorkflowRefs: [
127
+ { agent: 'sm', referencedWorkflows: ['tdd', 'missing-wf-1'] },
128
+ { agent: 'tea', referencedWorkflows: ['missing-wf-2'] },
129
+ ],
130
+ });
131
+ const result = validateCrossEntityRefs(ctx);
132
+ assert.strictEqual(result.valid, false);
133
+ const msgs = errorMessages(result);
134
+ assert.ok(msgs.some(m => m.includes('missing-wf-1')), 'Should report missing-wf-1');
135
+ assert.ok(msgs.some(m => m.includes('missing-wf-2')), 'Should report missing-wf-2');
136
+ });
137
+ it('should accept agents with empty workflow references', () => {
138
+ const ctx = defaultContext({
139
+ agentWorkflowRefs: [
140
+ { agent: 'orchestrator', referencedWorkflows: [] },
141
+ ],
142
+ });
143
+ const result = validateCrossEntityRefs(ctx);
144
+ // An agent that doesn't reference any workflows is fine
145
+ assert.strictEqual(result.valid, true);
146
+ });
147
+ });
148
+ // -------------------------------------------------------------------------
149
+ // AC3: Validate that commands referenced in skills exist
150
+ // (skills' related_skills references exist in the skill registry)
151
+ // -------------------------------------------------------------------------
152
+ describe('AC3: Skill related_skills references exist', () => {
153
+ it('should accept when all related_skills references point to known skills', () => {
154
+ const ctx = defaultContext();
155
+ const result = validateCrossEntityRefs(ctx);
156
+ assert.strictEqual(result.valid, true);
157
+ });
158
+ it('should error when a skill references a nonexistent related_skill', () => {
159
+ const ctx = defaultContext({
160
+ skillEntityRefs: [
161
+ { skill: 'pf-sprint', relatedSkills: ['pf-jira', 'pf-nonexistent'] },
162
+ ],
163
+ });
164
+ const result = validateCrossEntityRefs(ctx);
165
+ assert.strictEqual(result.valid, false, 'Missing related skill should fail');
166
+ const msgs = errorMessages(result);
167
+ assert.ok(msgs.some(m => m.includes('pf-nonexistent') && m.includes('pf-sprint')), `Expected error about 'pf-nonexistent' referenced by 'pf-sprint', got: ${msgs.join('; ')}`);
168
+ });
169
+ it('should report all broken related_skill references', () => {
170
+ const ctx = defaultContext({
171
+ skillEntityRefs: [
172
+ { skill: 'pf-sprint', relatedSkills: ['ghost-skill-1'] },
173
+ { skill: 'pf-testing', relatedSkills: ['ghost-skill-2'] },
174
+ ],
175
+ });
176
+ const result = validateCrossEntityRefs(ctx);
177
+ assert.strictEqual(result.valid, false);
178
+ const msgs = errorMessages(result);
179
+ assert.ok(msgs.some(m => m.includes('ghost-skill-1')), 'Should report ghost-skill-1');
180
+ assert.ok(msgs.some(m => m.includes('ghost-skill-2')), 'Should report ghost-skill-2');
181
+ });
182
+ it('should accept skills with empty related_skills', () => {
183
+ const ctx = defaultContext({
184
+ skillEntityRefs: [
185
+ { skill: 'pf-cyclist', relatedSkills: [] },
186
+ ],
187
+ });
188
+ const result = validateCrossEntityRefs(ctx);
189
+ assert.strictEqual(result.valid, true);
190
+ });
191
+ it('should not allow a skill to list itself as related', () => {
192
+ const ctx = defaultContext({
193
+ skillEntityRefs: [
194
+ { skill: 'pf-sprint', relatedSkills: ['pf-sprint'] },
195
+ ],
196
+ });
197
+ const result = validateCrossEntityRefs(ctx);
198
+ // Self-reference is an error or warning
199
+ const msgs = errorMessages(result);
200
+ const warns = warningMessages(result);
201
+ const allMsgs = [...msgs, ...warns];
202
+ assert.ok(allMsgs.some(m => m.includes('pf-sprint') && (m.includes('self') || m.includes('itself'))), `Expected self-reference flagged for 'pf-sprint', got: ${allMsgs.join('; ')}`);
203
+ });
204
+ });
205
+ // -------------------------------------------------------------------------
206
+ // AC4: Validate that skills referenced in command definitions exist
207
+ // -------------------------------------------------------------------------
208
+ describe('AC4: Skills referenced in commands exist', () => {
209
+ it('should accept when all command-referenced skills exist', () => {
210
+ const ctx = defaultContext();
211
+ const result = validateCrossEntityRefs(ctx);
212
+ assert.strictEqual(result.valid, true);
213
+ });
214
+ it('should error when command references a nonexistent skill', () => {
215
+ const ctx = defaultContext({
216
+ commandSkillRefs: [
217
+ { command: 'pf-sprint', referencedSkills: ['pf-sprint', 'pf-ghost-skill'] },
218
+ ],
219
+ });
220
+ const result = validateCrossEntityRefs(ctx);
221
+ assert.strictEqual(result.valid, false, 'Missing skill reference should fail');
222
+ const msgs = errorMessages(result);
223
+ assert.ok(msgs.some(m => m.includes('pf-ghost-skill') && m.includes('pf-sprint')), `Expected error about 'pf-ghost-skill' in command 'pf-sprint', got: ${msgs.join('; ')}`);
224
+ });
225
+ it('should report all missing skill references across commands', () => {
226
+ const ctx = defaultContext({
227
+ commandSkillRefs: [
228
+ { command: 'pf-dev', referencedSkills: ['missing-skill-a'] },
229
+ { command: 'pf-tea', referencedSkills: ['missing-skill-b'] },
230
+ ],
231
+ });
232
+ const result = validateCrossEntityRefs(ctx);
233
+ assert.strictEqual(result.valid, false);
234
+ const msgs = errorMessages(result);
235
+ assert.ok(msgs.some(m => m.includes('missing-skill-a')), 'Should report missing-skill-a');
236
+ assert.ok(msgs.some(m => m.includes('missing-skill-b')), 'Should report missing-skill-b');
237
+ });
238
+ it('should accept commands with no skill references', () => {
239
+ const ctx = defaultContext({
240
+ commandSkillRefs: [
241
+ { command: 'pf-help', referencedSkills: [] },
242
+ ],
243
+ });
244
+ const result = validateCrossEntityRefs(ctx);
245
+ assert.strictEqual(result.valid, true);
246
+ });
247
+ });
248
+ // -------------------------------------------------------------------------
249
+ // AC5: Bidirectional consistency of all references
250
+ // -------------------------------------------------------------------------
251
+ describe('AC5: Bidirectional consistency', () => {
252
+ it('should accept fully bidirectional references', () => {
253
+ // TDD references sm, and sm references tdd — both directions match
254
+ const ctx = defaultContext();
255
+ const result = validateCrossEntityRefs(ctx);
256
+ assert.strictEqual(result.valid, true);
257
+ assert.strictEqual((result.warnings ?? []).length, 0, 'No warnings for bidirectional match');
258
+ });
259
+ it('should warn when workflow references agent but agent does not reference that workflow', () => {
260
+ const ctx = defaultContext({
261
+ // tdd references architect, but architect doesn't claim tdd
262
+ workflowAgentRefs: [
263
+ { workflow: 'tdd', referencedAgents: ['sm', 'tea', 'dev', 'reviewer', 'architect'] },
264
+ ],
265
+ agentWorkflowRefs: [
266
+ { agent: 'sm', referencedWorkflows: ['tdd'] },
267
+ { agent: 'tea', referencedWorkflows: ['tdd'] },
268
+ { agent: 'dev', referencedWorkflows: ['tdd'] },
269
+ { agent: 'reviewer', referencedWorkflows: ['tdd'] },
270
+ { agent: 'architect', referencedWorkflows: [] }, // doesn't claim tdd
271
+ ],
272
+ });
273
+ const result = validateCrossEntityRefs(ctx);
274
+ // This is a warning (advisory), not an error
275
+ const warns = warningMessages(result);
276
+ assert.ok(warns.some(m => m.includes('architect') && m.includes('tdd')), `Expected warning about architect not referencing tdd, got: ${warns.join('; ')}`);
277
+ });
278
+ it('should warn when agent references workflow but workflow does not use that agent', () => {
279
+ const ctx = defaultContext({
280
+ workflowAgentRefs: [
281
+ { workflow: 'tdd', referencedAgents: ['sm', 'tea', 'dev', 'reviewer'] },
282
+ ],
283
+ agentWorkflowRefs: [
284
+ // pm claims to participate in tdd, but tdd doesn't reference pm
285
+ { agent: 'pm', referencedWorkflows: ['tdd'] },
286
+ ],
287
+ });
288
+ const result = validateCrossEntityRefs(ctx);
289
+ const warns = warningMessages(result);
290
+ assert.ok(warns.some(m => m.includes('pm') && m.includes('tdd')), `Expected warning about pm claiming tdd but not used, got: ${warns.join('; ')}`);
291
+ });
292
+ it('should warn for asymmetric related_skills (A lists B but B does not list A)', () => {
293
+ const ctx = defaultContext({
294
+ skillEntityRefs: [
295
+ { skill: 'pf-sprint', relatedSkills: ['pf-jira'] },
296
+ { skill: 'pf-jira', relatedSkills: [] }, // doesn't list pf-sprint back
297
+ ],
298
+ });
299
+ const result = validateCrossEntityRefs(ctx);
300
+ const warns = warningMessages(result);
301
+ assert.ok(warns.some(m => m.includes('pf-sprint') && m.includes('pf-jira')), `Expected asymmetric related_skills warning, got: ${warns.join('; ')}`);
302
+ });
303
+ it('should not warn when related_skills are fully symmetric', () => {
304
+ const ctx = defaultContext({
305
+ skillEntityRefs: [
306
+ { skill: 'pf-sprint', relatedSkills: ['pf-jira'] },
307
+ { skill: 'pf-jira', relatedSkills: ['pf-sprint'] },
308
+ ],
309
+ });
310
+ const result = validateCrossEntityRefs(ctx);
311
+ assert.strictEqual((result.warnings ?? []).length, 0, 'Symmetric refs = no warnings');
312
+ });
313
+ it('should detect multiple bidirectional inconsistencies', () => {
314
+ const ctx = defaultContext({
315
+ workflowAgentRefs: [
316
+ { workflow: 'tdd', referencedAgents: ['sm', 'architect'] },
317
+ { workflow: 'bdd', referencedAgents: ['sm', 'pm'] },
318
+ ],
319
+ agentWorkflowRefs: [
320
+ { agent: 'sm', referencedWorkflows: ['tdd', 'bdd'] },
321
+ { agent: 'architect', referencedWorkflows: [] }, // missing tdd
322
+ { agent: 'pm', referencedWorkflows: [] }, // missing bdd
323
+ ],
324
+ skillEntityRefs: [
325
+ { skill: 'pf-testing', relatedSkills: ['pf-code-review'] },
326
+ { skill: 'pf-code-review', relatedSkills: [] }, // asymmetric
327
+ ],
328
+ });
329
+ const result = validateCrossEntityRefs(ctx);
330
+ const warns = warningMessages(result);
331
+ // Should have warnings for architect↔tdd, pm↔bdd, and pf-testing↔pf-code-review
332
+ assert.ok(warns.length >= 3, `Expected at least 3 warnings, got ${warns.length}: ${warns.join('; ')}`);
333
+ });
334
+ });
335
+ // -------------------------------------------------------------------------
336
+ // Edge cases
337
+ // -------------------------------------------------------------------------
338
+ describe('Edge cases', () => {
339
+ it('should handle empty context gracefully', () => {
340
+ const ctx = {
341
+ knownAgentFiles: [],
342
+ knownWorkflowNames: [],
343
+ knownCommandFiles: [],
344
+ knownSkillNames: [],
345
+ workflowAgentRefs: [],
346
+ agentWorkflowRefs: [],
347
+ skillEntityRefs: [],
348
+ commandSkillRefs: [],
349
+ };
350
+ const result = validateCrossEntityRefs(ctx);
351
+ assert.strictEqual(result.valid, true, 'Empty context has nothing to validate');
352
+ });
353
+ it('should handle context with only agents and no workflows', () => {
354
+ const ctx = {
355
+ knownAgentFiles: ['sm', 'dev'],
356
+ knownWorkflowNames: [],
357
+ knownCommandFiles: [],
358
+ knownSkillNames: [],
359
+ workflowAgentRefs: [],
360
+ agentWorkflowRefs: [],
361
+ skillEntityRefs: [],
362
+ commandSkillRefs: [],
363
+ };
364
+ const result = validateCrossEntityRefs(ctx);
365
+ assert.strictEqual(result.valid, true, 'Agents alone, no cross-refs to break');
366
+ });
367
+ it('should treat agent file names case-sensitively', () => {
368
+ const ctx = defaultContext({
369
+ knownAgentFiles: ['sm', 'dev'],
370
+ workflowAgentRefs: [
371
+ { workflow: 'test', referencedAgents: ['SM'] }, // wrong case
372
+ ],
373
+ });
374
+ const result = validateCrossEntityRefs(ctx);
375
+ assert.strictEqual(result.valid, false, 'Agent name matching should be case-sensitive');
376
+ const msgs = errorMessages(result);
377
+ assert.ok(msgs.some(m => m.includes('SM')), 'Should report case-sensitive mismatch');
378
+ });
379
+ it('should treat skill names case-sensitively', () => {
380
+ const ctx = defaultContext({
381
+ knownSkillNames: ['pf-sprint'],
382
+ skillEntityRefs: [
383
+ { skill: 'pf-testing', relatedSkills: ['PF-Sprint'] }, // wrong case
384
+ ],
385
+ });
386
+ const result = validateCrossEntityRefs(ctx);
387
+ assert.strictEqual(result.valid, false, 'Skill name matching should be case-sensitive');
388
+ });
389
+ it('should handle workflows that reference no agents', () => {
390
+ const ctx = defaultContext({
391
+ workflowAgentRefs: [
392
+ { workflow: 'empty-workflow', referencedAgents: [] },
393
+ ],
394
+ });
395
+ const result = validateCrossEntityRefs(ctx);
396
+ // A workflow with no agent refs is valid (maybe it's a stepped workflow)
397
+ assert.strictEqual(result.valid, true);
398
+ });
399
+ it('should handle a mixed scenario with both errors and warnings', () => {
400
+ const ctx = defaultContext({
401
+ workflowAgentRefs: [
402
+ { workflow: 'tdd', referencedAgents: ['sm', 'ghost'] }, // ghost = error
403
+ ],
404
+ agentWorkflowRefs: [
405
+ { agent: 'sm', referencedWorkflows: ['tdd'] },
406
+ { agent: 'pm', referencedWorkflows: ['tdd'] }, // pm not in tdd = warning
407
+ ],
408
+ });
409
+ const result = validateCrossEntityRefs(ctx);
410
+ assert.strictEqual(result.valid, false, 'Should fail due to missing agent error');
411
+ const msgs = errorMessages(result);
412
+ const warns = warningMessages(result);
413
+ assert.ok(msgs.length > 0, 'Should have errors');
414
+ assert.ok(warns.length > 0, 'Should have warnings');
415
+ assert.ok(msgs.some(m => m.includes('ghost')), 'Should error on ghost agent');
416
+ assert.ok(warns.some(m => m.includes('pm')), 'Should warn on pm bidirectional mismatch');
417
+ });
418
+ });
419
+ // -------------------------------------------------------------------------
420
+ // Integration: realistic scenario
421
+ // -------------------------------------------------------------------------
422
+ describe('Integration with realistic data', () => {
423
+ it('should validate a realistic pennyfarthing-like context successfully', () => {
424
+ const ctx = {
425
+ knownAgentFiles: [
426
+ 'sm', 'tea', 'dev', 'reviewer', 'architect', 'pm',
427
+ 'tech-writer', 'ux-designer', 'devops', 'ba', 'orchestrator',
428
+ 'sm-setup', 'sm-finish', 'testing-runner', 'reviewer-preflight',
429
+ ],
430
+ knownWorkflowNames: [
431
+ 'tdd', 'tdd-tandem', 'trivial', 'bdd', 'bdd-tandem', 'agent-docs', 'patch',
432
+ ],
433
+ knownCommandFiles: [
434
+ 'pf-sprint', 'pf-dev', 'pf-tea', 'pf-sm', 'pf-reviewer',
435
+ 'pf-architect', 'pf-pm', 'pf-workflow',
436
+ ],
437
+ knownSkillNames: [
438
+ 'pf-sprint', 'pf-testing', 'pf-jira', 'pf-code-review',
439
+ 'pf-workflow', 'pf-theme', 'pf-just',
440
+ ],
441
+ workflowAgentRefs: [
442
+ { workflow: 'tdd', referencedAgents: ['sm', 'tea', 'dev', 'reviewer'] },
443
+ { workflow: 'trivial', referencedAgents: ['sm', 'dev', 'reviewer'] },
444
+ { workflow: 'bdd', referencedAgents: ['sm', 'ux-designer', 'tea', 'dev', 'reviewer'] },
445
+ { workflow: 'agent-docs', referencedAgents: ['sm', 'orchestrator', 'tech-writer'] },
446
+ ],
447
+ agentWorkflowRefs: [
448
+ { agent: 'sm', referencedWorkflows: ['tdd', 'trivial', 'bdd', 'agent-docs'] },
449
+ { agent: 'tea', referencedWorkflows: ['tdd', 'bdd'] },
450
+ { agent: 'dev', referencedWorkflows: ['tdd', 'trivial', 'bdd'] },
451
+ { agent: 'reviewer', referencedWorkflows: ['tdd', 'trivial', 'bdd'] },
452
+ { agent: 'ux-designer', referencedWorkflows: ['bdd'] },
453
+ { agent: 'orchestrator', referencedWorkflows: ['agent-docs'] },
454
+ { agent: 'tech-writer', referencedWorkflows: ['agent-docs'] },
455
+ ],
456
+ skillEntityRefs: [
457
+ { skill: 'pf-sprint', relatedSkills: ['pf-jira'] },
458
+ { skill: 'pf-jira', relatedSkills: ['pf-sprint'] },
459
+ { skill: 'pf-testing', relatedSkills: ['pf-code-review'] },
460
+ { skill: 'pf-code-review', relatedSkills: ['pf-testing'] },
461
+ ],
462
+ commandSkillRefs: [
463
+ { command: 'pf-sprint', referencedSkills: ['pf-sprint'] },
464
+ { command: 'pf-workflow', referencedSkills: ['pf-workflow'] },
465
+ ],
466
+ };
467
+ const result = validateCrossEntityRefs(ctx);
468
+ assert.strictEqual(result.valid, true, 'Realistic context should validate');
469
+ assert.strictEqual((result.errors ?? []).length, 0, 'No errors');
470
+ assert.strictEqual((result.warnings ?? []).length, 0, 'No warnings');
471
+ });
472
+ it('should catch multiple issues in a broken realistic scenario', () => {
473
+ const ctx = {
474
+ knownAgentFiles: ['sm', 'dev', 'reviewer'],
475
+ knownWorkflowNames: ['tdd'],
476
+ knownCommandFiles: ['pf-sprint'],
477
+ knownSkillNames: ['pf-sprint', 'pf-jira'],
478
+ workflowAgentRefs: [
479
+ // tea and architect referenced but no agent files
480
+ { workflow: 'tdd', referencedAgents: ['sm', 'tea', 'dev', 'architect', 'reviewer'] },
481
+ ],
482
+ agentWorkflowRefs: [
483
+ // dev references bdd which doesn't exist
484
+ { agent: 'dev', referencedWorkflows: ['tdd', 'bdd'] },
485
+ ],
486
+ skillEntityRefs: [
487
+ // references nonexistent skill
488
+ { skill: 'pf-sprint', relatedSkills: ['pf-jira', 'pf-nonexistent'] },
489
+ ],
490
+ commandSkillRefs: [
491
+ // references nonexistent skill
492
+ { command: 'pf-sprint', referencedSkills: ['pf-sprint', 'pf-ghost'] },
493
+ ],
494
+ };
495
+ const result = validateCrossEntityRefs(ctx);
496
+ assert.strictEqual(result.valid, false, 'Broken scenario should fail');
497
+ const msgs = errorMessages(result);
498
+ // AC1: missing agent files for tea and architect
499
+ assert.ok(msgs.some(m => m.includes('tea')), 'Should report missing tea agent file');
500
+ assert.ok(msgs.some(m => m.includes('architect')), 'Should report missing architect agent file');
501
+ // AC2: missing bdd workflow
502
+ assert.ok(msgs.some(m => m.includes('bdd')), 'Should report missing bdd workflow');
503
+ // AC3: missing related skill
504
+ assert.ok(msgs.some(m => m.includes('pf-nonexistent')), 'Should report missing related skill');
505
+ // AC4: missing command skill reference
506
+ assert.ok(msgs.some(m => m.includes('pf-ghost')), 'Should report missing command skill ref');
507
+ // Should have at least 5 errors total
508
+ assert.ok(msgs.length >= 5, `Expected at least 5 errors, got ${msgs.length}: ${msgs.join('; ')}`);
509
+ });
510
+ });
511
+ });
512
+ //# sourceMappingURL=cross-entity-validation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-entity-validation.test.js","sourceRoot":"","sources":["../../src/workflow/cross-entity-validation.test.ts"],"names":[],"mappings":"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"}