@pennyfarthing/core 7.4.0 → 7.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/utils/files.d.ts +0 -1
- package/dist/cli/utils/files.js +73 -56
- package/dist/cli/utils/manifest.d.ts +0 -1
- package/dist/cli/utils/manifest.js +48 -45
- package/dist/cli/utils/version.d.ts +0 -1
- package/dist/cli/utils/version.js +38 -32
- package/dist/index.d.ts +0 -1
- package/dist/index.js +39 -11
- package/dist/permissions/index.d.ts +0 -1
- package/dist/permissions/index.js +7 -4
- package/dist/permissions/permission-schema.d.ts +0 -1
- package/dist/permissions/permission-schema.js +13 -9
- package/dist/scripts/job-fair-aggregator.d.ts +0 -1
- package/dist/scripts/job-fair-aggregator.js +484 -341
- package/dist/workflow/index.d.ts +0 -1
- package/dist/workflow/index.js +12 -5
- package/dist/workflow/workflow-loader.d.ts +0 -1
- package/dist/workflow/workflow-loader.js +40 -34
- package/dist/workflow/workflow-permissions.d.ts +0 -1
- package/dist/workflow/workflow-permissions.js +14 -8
- package/dist/workflow/workflow-router.d.ts +0 -1
- package/dist/workflow/workflow-router.js +70 -51
- package/dist/workflow/workflow-schema.d.ts +0 -1
- package/dist/workflow/workflow-schema.js +62 -59
- package/package.json +1 -1
- package/dist/bmad/context-reader.d.ts +0 -71
- package/dist/bmad/context-reader.d.ts.map +0 -1
- package/dist/bmad/context-reader.js +0 -369
- package/dist/bmad/context-reader.js.map +0 -1
- package/dist/bmad/context-reader.test.d.ts +0 -71
- package/dist/bmad/context-reader.test.d.ts.map +0 -1
- package/dist/bmad/context-reader.test.js +0 -878
- package/dist/bmad/context-reader.test.js.map +0 -1
- package/dist/bmad/epics-parser.d.ts +0 -61
- package/dist/bmad/epics-parser.d.ts.map +0 -1
- package/dist/bmad/epics-parser.js +0 -331
- package/dist/bmad/epics-parser.js.map +0 -1
- package/dist/bmad/epics-parser.test.d.ts +0 -7
- package/dist/bmad/epics-parser.test.d.ts.map +0 -1
- package/dist/bmad/epics-parser.test.js +0 -449
- package/dist/bmad/epics-parser.test.js.map +0 -1
- package/dist/bmad/index.d.ts +0 -11
- package/dist/bmad/index.d.ts.map +0 -1
- package/dist/bmad/index.js +0 -24
- package/dist/bmad/index.js.map +0 -1
- package/dist/bmad/status-sync.d.ts +0 -173
- package/dist/bmad/status-sync.d.ts.map +0 -1
- package/dist/bmad/status-sync.js +0 -463
- package/dist/bmad/status-sync.js.map +0 -1
- package/dist/bmad/status-sync.test.d.ts +0 -7
- package/dist/bmad/status-sync.test.d.ts.map +0 -1
- package/dist/bmad/status-sync.test.js +0 -702
- package/dist/bmad/status-sync.test.js.map +0 -1
- package/dist/bmad/story-exporter.d.ts +0 -55
- package/dist/bmad/story-exporter.d.ts.map +0 -1
- package/dist/bmad/story-exporter.js +0 -170
- package/dist/bmad/story-exporter.js.map +0 -1
- package/dist/bmad/story-exporter.test.d.ts +0 -51
- package/dist/bmad/story-exporter.test.d.ts.map +0 -1
- package/dist/bmad/story-exporter.test.js +0 -603
- package/dist/bmad/story-exporter.test.js.map +0 -1
- package/dist/bmad/story-parser.d.ts +0 -44
- package/dist/bmad/story-parser.d.ts.map +0 -1
- package/dist/bmad/story-parser.js +0 -307
- package/dist/bmad/story-parser.js.map +0 -1
- package/dist/bmad/story-parser.test.d.ts +0 -44
- package/dist/bmad/story-parser.test.d.ts.map +0 -1
- package/dist/bmad/story-parser.test.js +0 -693
- package/dist/bmad/story-parser.test.js.map +0 -1
- package/dist/cli/commands/command.d.ts +0 -28
- package/dist/cli/commands/command.d.ts.map +0 -1
- package/dist/cli/commands/command.js +0 -399
- package/dist/cli/commands/command.js.map +0 -1
- package/dist/cli/commands/cyclist.d.ts +0 -46
- package/dist/cli/commands/cyclist.d.ts.map +0 -1
- package/dist/cli/commands/cyclist.js +0 -196
- package/dist/cli/commands/cyclist.js.map +0 -1
- package/dist/cli/commands/cyclist.test.d.ts +0 -13
- package/dist/cli/commands/cyclist.test.d.ts.map +0 -1
- package/dist/cli/commands/cyclist.test.js +0 -245
- package/dist/cli/commands/cyclist.test.js.map +0 -1
- package/dist/cli/commands/doctor.d.ts +0 -9
- package/dist/cli/commands/doctor.d.ts.map +0 -1
- package/dist/cli/commands/doctor.js +0 -652
- package/dist/cli/commands/doctor.js.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -8
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js +0 -524
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/skill.d.ts +0 -28
- package/dist/cli/commands/skill.d.ts.map +0 -1
- package/dist/cli/commands/skill.js +0 -416
- package/dist/cli/commands/skill.js.map +0 -1
- package/dist/cli/commands/theme.d.ts +0 -21
- package/dist/cli/commands/theme.d.ts.map +0 -1
- package/dist/cli/commands/theme.js +0 -201
- package/dist/cli/commands/theme.js.map +0 -1
- package/dist/cli/commands/uninstall.d.ts +0 -8
- package/dist/cli/commands/uninstall.d.ts.map +0 -1
- package/dist/cli/commands/uninstall.js +0 -237
- package/dist/cli/commands/uninstall.js.map +0 -1
- package/dist/cli/commands/update.d.ts +0 -9
- package/dist/cli/commands/update.d.ts.map +0 -1
- package/dist/cli/commands/update.js +0 -418
- package/dist/cli/commands/update.js.map +0 -1
- package/dist/cli/commands/version.d.ts +0 -2
- package/dist/cli/commands/version.d.ts.map +0 -1
- package/dist/cli/commands/version.js +0 -28
- package/dist/cli/commands/version.js.map +0 -1
- package/dist/cli/customization.test.d.ts +0 -12
- package/dist/cli/customization.test.d.ts.map +0 -1
- package/dist/cli/customization.test.js +0 -84
- package/dist/cli/customization.test.js.map +0 -1
- package/dist/cli/cyclist-migration.test.d.ts +0 -16
- package/dist/cli/cyclist-migration.test.d.ts.map +0 -1
- package/dist/cli/cyclist-migration.test.js +0 -225
- package/dist/cli/cyclist-migration.test.js.map +0 -1
- package/dist/cli/index.d.ts +0 -3
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -174
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/ocean-profiles.test.d.ts +0 -13
- package/dist/cli/ocean-profiles.test.d.ts.map +0 -1
- package/dist/cli/ocean-profiles.test.js +0 -134
- package/dist/cli/ocean-profiles.test.js.map +0 -1
- package/dist/cli/theme-maker.test.d.ts +0 -11
- package/dist/cli/theme-maker.test.d.ts.map +0 -1
- package/dist/cli/theme-maker.test.js +0 -356
- package/dist/cli/theme-maker.test.js.map +0 -1
- package/dist/cli/utils/constants.d.ts +0 -66
- package/dist/cli/utils/constants.d.ts.map +0 -1
- package/dist/cli/utils/constants.js +0 -54
- package/dist/cli/utils/constants.js.map +0 -1
- package/dist/cli/utils/files.d.ts.map +0 -1
- package/dist/cli/utils/files.js.map +0 -1
- package/dist/cli/utils/logger.d.ts +0 -26
- package/dist/cli/utils/logger.d.ts.map +0 -1
- package/dist/cli/utils/logger.js +0 -88
- package/dist/cli/utils/logger.js.map +0 -1
- package/dist/cli/utils/manifest.d.ts.map +0 -1
- package/dist/cli/utils/manifest.js.map +0 -1
- package/dist/cli/utils/node-modules.d.ts +0 -6
- package/dist/cli/utils/node-modules.d.ts.map +0 -1
- package/dist/cli/utils/node-modules.js +0 -31
- package/dist/cli/utils/node-modules.js.map +0 -1
- package/dist/cli/utils/prompts.d.ts +0 -34
- package/dist/cli/utils/prompts.d.ts.map +0 -1
- package/dist/cli/utils/prompts.js +0 -93
- package/dist/cli/utils/prompts.js.map +0 -1
- package/dist/cli/utils/symlinks.d.ts +0 -29
- package/dist/cli/utils/symlinks.d.ts.map +0 -1
- package/dist/cli/utils/symlinks.js +0 -181
- package/dist/cli/utils/symlinks.js.map +0 -1
- package/dist/cli/utils/themes.d.ts +0 -101
- package/dist/cli/utils/themes.d.ts.map +0 -1
- package/dist/cli/utils/themes.js +0 -373
- package/dist/cli/utils/themes.js.map +0 -1
- package/dist/cli/utils/themes.test.d.ts +0 -12
- package/dist/cli/utils/themes.test.d.ts.map +0 -1
- package/dist/cli/utils/themes.test.js +0 -147
- package/dist/cli/utils/themes.test.js.map +0 -1
- package/dist/cli/utils/version.d.ts.map +0 -1
- package/dist/cli/utils/version.js.map +0 -1
- package/dist/cli/workspace.test.d.ts +0 -8
- package/dist/cli/workspace.test.d.ts.map +0 -1
- package/dist/cli/workspace.test.js +0 -151
- package/dist/cli/workspace.test.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/jira/jira-epic-creation.d.ts +0 -109
- package/dist/jira/jira-epic-creation.d.ts.map +0 -1
- package/dist/jira/jira-epic-creation.js +0 -253
- package/dist/jira/jira-epic-creation.js.map +0 -1
- package/dist/jira/jira-epic-creation.test.d.ts +0 -16
- package/dist/jira/jira-epic-creation.test.d.ts.map +0 -1
- package/dist/jira/jira-epic-creation.test.js +0 -387
- package/dist/jira/jira-epic-creation.test.js.map +0 -1
- package/dist/jira/jira-sprint-sync.d.ts +0 -247
- package/dist/jira/jira-sprint-sync.d.ts.map +0 -1
- package/dist/jira/jira-sprint-sync.js +0 -670
- package/dist/jira/jira-sprint-sync.js.map +0 -1
- package/dist/jira/jira-sprint-sync.test.d.ts +0 -16
- package/dist/jira/jira-sprint-sync.test.d.ts.map +0 -1
- package/dist/jira/jira-sprint-sync.test.js +0 -845
- package/dist/jira/jira-sprint-sync.test.js.map +0 -1
- package/dist/permissions/index.d.ts.map +0 -1
- package/dist/permissions/index.js.map +0 -1
- package/dist/permissions/permission-schema.d.ts.map +0 -1
- package/dist/permissions/permission-schema.js.map +0 -1
- package/dist/permissions/permission-schema.test.d.ts +0 -40
- package/dist/permissions/permission-schema.test.d.ts.map +0 -1
- package/dist/permissions/permission-schema.test.js +0 -367
- package/dist/permissions/permission-schema.test.js.map +0 -1
- package/dist/scripts/add-ocean-profiles.d.ts +0 -9
- package/dist/scripts/add-ocean-profiles.d.ts.map +0 -1
- package/dist/scripts/add-ocean-profiles.js +0 -695
- package/dist/scripts/add-ocean-profiles.js.map +0 -1
- package/dist/scripts/benchmark-integration.d.ts +0 -182
- package/dist/scripts/benchmark-integration.d.ts.map +0 -1
- package/dist/scripts/benchmark-integration.js +0 -691
- package/dist/scripts/benchmark-integration.js.map +0 -1
- package/dist/scripts/benchmark-integration.test.d.ts +0 -13
- package/dist/scripts/benchmark-integration.test.d.ts.map +0 -1
- package/dist/scripts/benchmark-integration.test.js +0 -680
- package/dist/scripts/benchmark-integration.test.js.map +0 -1
- package/dist/scripts/debugging-scenarios.test.d.ts +0 -18
- package/dist/scripts/debugging-scenarios.test.d.ts.map +0 -1
- package/dist/scripts/debugging-scenarios.test.js +0 -317
- package/dist/scripts/debugging-scenarios.test.js.map +0 -1
- package/dist/scripts/generate-all-spiders.d.ts +0 -10
- package/dist/scripts/generate-all-spiders.d.ts.map +0 -1
- package/dist/scripts/generate-all-spiders.js +0 -306
- package/dist/scripts/generate-all-spiders.js.map +0 -1
- package/dist/scripts/generate-report.d.ts +0 -65
- package/dist/scripts/generate-report.d.ts.map +0 -1
- package/dist/scripts/generate-report.js +0 -378
- package/dist/scripts/generate-report.js.map +0 -1
- package/dist/scripts/generate-report.test.d.ts +0 -13
- package/dist/scripts/generate-report.test.d.ts.map +0 -1
- package/dist/scripts/generate-report.test.js +0 -363
- package/dist/scripts/generate-report.test.js.map +0 -1
- package/dist/scripts/generate-spider-report.d.ts +0 -65
- package/dist/scripts/generate-spider-report.d.ts.map +0 -1
- package/dist/scripts/generate-spider-report.js +0 -366
- package/dist/scripts/generate-spider-report.js.map +0 -1
- package/dist/scripts/generate-spider-report.test.d.ts +0 -13
- package/dist/scripts/generate-spider-report.test.d.ts.map +0 -1
- package/dist/scripts/generate-spider-report.test.js +0 -367
- package/dist/scripts/generate-spider-report.test.js.map +0 -1
- package/dist/scripts/generate-spider.d.ts +0 -47
- package/dist/scripts/generate-spider.d.ts.map +0 -1
- package/dist/scripts/generate-spider.js +0 -338
- package/dist/scripts/generate-spider.js.map +0 -1
- package/dist/scripts/generate-spider.test.d.ts +0 -14
- package/dist/scripts/generate-spider.test.d.ts.map +0 -1
- package/dist/scripts/generate-spider.test.js +0 -271
- package/dist/scripts/generate-spider.test.js.map +0 -1
- package/dist/scripts/job-fair-aggregator.d.ts.map +0 -1
- package/dist/scripts/job-fair-aggregator.js.map +0 -1
- package/dist/scripts/job-fair-aggregator.test.d.ts +0 -14
- package/dist/scripts/job-fair-aggregator.test.d.ts.map +0 -1
- package/dist/scripts/job-fair-aggregator.test.js +0 -616
- package/dist/scripts/job-fair-aggregator.test.js.map +0 -1
- package/dist/scripts/run-ci.test.d.ts +0 -20
- package/dist/scripts/run-ci.test.d.ts.map +0 -1
- package/dist/scripts/run-ci.test.js +0 -127
- package/dist/scripts/run-ci.test.js.map +0 -1
- package/dist/scripts/theme-detail.test.d.ts +0 -10
- package/dist/scripts/theme-detail.test.d.ts.map +0 -1
- package/dist/scripts/theme-detail.test.js +0 -199
- package/dist/scripts/theme-detail.test.js.map +0 -1
- package/dist/scripts/validate-ocean-profiles.d.ts +0 -9
- package/dist/scripts/validate-ocean-profiles.d.ts.map +0 -1
- package/dist/scripts/validate-ocean-profiles.js +0 -130
- package/dist/scripts/validate-ocean-profiles.js.map +0 -1
- package/dist/workflow/gate-handler.d.ts +0 -94
- package/dist/workflow/gate-handler.d.ts.map +0 -1
- package/dist/workflow/gate-handler.js +0 -189
- package/dist/workflow/gate-handler.js.map +0 -1
- package/dist/workflow/gate-handler.test.d.ts +0 -14
- package/dist/workflow/gate-handler.test.d.ts.map +0 -1
- package/dist/workflow/gate-handler.test.js +0 -543
- package/dist/workflow/gate-handler.test.js.map +0 -1
- package/dist/workflow/generic-handoff.d.ts +0 -281
- package/dist/workflow/generic-handoff.d.ts.map +0 -1
- package/dist/workflow/generic-handoff.js +0 -411
- package/dist/workflow/generic-handoff.js.map +0 -1
- package/dist/workflow/generic-handoff.test.d.ts +0 -21
- package/dist/workflow/generic-handoff.test.d.ts.map +0 -1
- package/dist/workflow/generic-handoff.test.js +0 -499
- package/dist/workflow/generic-handoff.test.js.map +0 -1
- package/dist/workflow/generic-sm-finish.d.ts +0 -89
- package/dist/workflow/generic-sm-finish.d.ts.map +0 -1
- package/dist/workflow/generic-sm-finish.js +0 -157
- package/dist/workflow/generic-sm-finish.js.map +0 -1
- package/dist/workflow/generic-sm-setup.d.ts +0 -138
- package/dist/workflow/generic-sm-setup.d.ts.map +0 -1
- package/dist/workflow/generic-sm-setup.js +0 -382
- package/dist/workflow/generic-sm-setup.js.map +0 -1
- package/dist/workflow/index.d.ts.map +0 -1
- package/dist/workflow/index.js.map +0 -1
- package/dist/workflow/session-state.d.ts +0 -92
- package/dist/workflow/session-state.d.ts.map +0 -1
- package/dist/workflow/session-state.js +0 -198
- package/dist/workflow/session-state.js.map +0 -1
- package/dist/workflow/session-state.test.d.ts +0 -8
- package/dist/workflow/session-state.test.d.ts.map +0 -1
- package/dist/workflow/session-state.test.js +0 -551
- package/dist/workflow/session-state.test.js.map +0 -1
- package/dist/workflow/sm-subagents.test.d.ts +0 -23
- package/dist/workflow/sm-subagents.test.d.ts.map +0 -1
- package/dist/workflow/sm-subagents.test.js +0 -727
- package/dist/workflow/sm-subagents.test.js.map +0 -1
- package/dist/workflow/step-parser.d.ts +0 -45
- package/dist/workflow/step-parser.d.ts.map +0 -1
- package/dist/workflow/step-parser.js +0 -147
- package/dist/workflow/step-parser.js.map +0 -1
- package/dist/workflow/step-parser.test.d.ts +0 -14
- package/dist/workflow/step-parser.test.d.ts.map +0 -1
- package/dist/workflow/step-parser.test.js +0 -470
- package/dist/workflow/step-parser.test.js.map +0 -1
- package/dist/workflow/story-workflow-routing.test.d.ts +0 -17
- package/dist/workflow/story-workflow-routing.test.d.ts.map +0 -1
- package/dist/workflow/story-workflow-routing.test.js +0 -559
- package/dist/workflow/story-workflow-routing.test.js.map +0 -1
- package/dist/workflow/test-cache.d.ts +0 -131
- package/dist/workflow/test-cache.d.ts.map +0 -1
- package/dist/workflow/test-cache.js +0 -226
- package/dist/workflow/test-cache.js.map +0 -1
- package/dist/workflow/test-cache.test.d.ts +0 -17
- package/dist/workflow/test-cache.test.d.ts.map +0 -1
- package/dist/workflow/test-cache.test.js +0 -438
- package/dist/workflow/test-cache.test.js.map +0 -1
- package/dist/workflow/trimodal.d.ts +0 -86
- package/dist/workflow/trimodal.d.ts.map +0 -1
- package/dist/workflow/trimodal.js +0 -118
- package/dist/workflow/trimodal.js.map +0 -1
- package/dist/workflow/trimodal.test.d.ts +0 -11
- package/dist/workflow/trimodal.test.d.ts.map +0 -1
- package/dist/workflow/trimodal.test.js +0 -395
- package/dist/workflow/trimodal.test.js.map +0 -1
- package/dist/workflow/variable-resolver.d.ts +0 -67
- package/dist/workflow/variable-resolver.d.ts.map +0 -1
- package/dist/workflow/variable-resolver.js +0 -156
- package/dist/workflow/variable-resolver.js.map +0 -1
- package/dist/workflow/variable-resolver.test.d.ts +0 -14
- package/dist/workflow/variable-resolver.test.d.ts.map +0 -1
- package/dist/workflow/variable-resolver.test.js +0 -400
- package/dist/workflow/variable-resolver.test.js.map +0 -1
- package/dist/workflow/workflow-executor.d.ts +0 -163
- package/dist/workflow/workflow-executor.d.ts.map +0 -1
- package/dist/workflow/workflow-executor.js +0 -197
- package/dist/workflow/workflow-executor.js.map +0 -1
- package/dist/workflow/workflow-executor.test.d.ts +0 -8
- package/dist/workflow/workflow-executor.test.d.ts.map +0 -1
- package/dist/workflow/workflow-executor.test.js +0 -444
- package/dist/workflow/workflow-executor.test.js.map +0 -1
- package/dist/workflow/workflow-loader.d.ts.map +0 -1
- package/dist/workflow/workflow-loader.js.map +0 -1
- package/dist/workflow/workflow-loader.test.d.ts +0 -15
- package/dist/workflow/workflow-loader.test.d.ts.map +0 -1
- package/dist/workflow/workflow-loader.test.js +0 -354
- package/dist/workflow/workflow-loader.test.js.map +0 -1
- package/dist/workflow/workflow-migration.test.d.ts +0 -17
- package/dist/workflow/workflow-migration.test.d.ts.map +0 -1
- package/dist/workflow/workflow-migration.test.js +0 -371
- package/dist/workflow/workflow-migration.test.js.map +0 -1
- package/dist/workflow/workflow-permissions.d.ts.map +0 -1
- package/dist/workflow/workflow-permissions.js.map +0 -1
- package/dist/workflow/workflow-permissions.test.d.ts +0 -15
- package/dist/workflow/workflow-permissions.test.d.ts.map +0 -1
- package/dist/workflow/workflow-permissions.test.js +0 -301
- package/dist/workflow/workflow-permissions.test.js.map +0 -1
- package/dist/workflow/workflow-router.d.ts.map +0 -1
- package/dist/workflow/workflow-router.js.map +0 -1
- package/dist/workflow/workflow-router.test.d.ts +0 -20
- package/dist/workflow/workflow-router.test.d.ts.map +0 -1
- package/dist/workflow/workflow-router.test.js +0 -607
- package/dist/workflow/workflow-router.test.js.map +0 -1
- package/dist/workflow/workflow-schema.d.ts.map +0 -1
- package/dist/workflow/workflow-schema.js.map +0 -1
- package/dist/workflow/workflow-schema.test.d.ts +0 -45
- package/dist/workflow/workflow-schema.test.d.ts.map +0 -1
- package/dist/workflow/workflow-schema.test.js +0 -512
- package/dist/workflow/workflow-schema.test.js.map +0 -1
- package/dist/workflow/workflow-stepped-schema.test.d.ts +0 -18
- package/dist/workflow/workflow-stepped-schema.test.d.ts.map +0 -1
- package/dist/workflow/workflow-stepped-schema.test.js +0 -608
- package/dist/workflow/workflow-stepped-schema.test.js.map +0 -1
|
@@ -1,559 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for Story 38-9: SM Workflow Routing from Story Tags
|
|
3
|
-
*
|
|
4
|
-
* These tests define the contract for SM reading and honoring
|
|
5
|
-
* the `workflow:` tag on stories in sprint YAML.
|
|
6
|
-
*
|
|
7
|
-
* Acceptance Criteria:
|
|
8
|
-
* - AC1: SM reads workflow tag from story in sprint YAML
|
|
9
|
-
* - AC2: SM loads correct workflow definition from pennyfarthing-dist/workflows/
|
|
10
|
-
* - AC3: SM follows workflow's phase sequence (agent-docs → Orchestrator)
|
|
11
|
-
* - AC4: Fallback to TDD if no tag or unknown workflow
|
|
12
|
-
* - AC5: Session file records which workflow is active
|
|
13
|
-
*
|
|
14
|
-
* Run with: npm test
|
|
15
|
-
*/
|
|
16
|
-
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
17
|
-
import assert from 'node:assert';
|
|
18
|
-
import { mkdirSync, rmSync, existsSync, writeFileSync, readFileSync } from 'node:fs';
|
|
19
|
-
import { join, dirname } from 'node:path';
|
|
20
|
-
import { fileURLToPath } from 'node:url';
|
|
21
|
-
import { parse as parseYaml } from 'yaml';
|
|
22
|
-
// Import workflow routing infrastructure
|
|
23
|
-
import { routeStoryToWorkflow } from './workflow-router.js';
|
|
24
|
-
import { loadWorkflowsFromDir } from './workflow-loader.js';
|
|
25
|
-
// Get directory for test fixtures
|
|
26
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
27
|
-
const TEST_DIR = join(__dirname, '__test_story_workflow_routing__');
|
|
28
|
-
// =============================================================================
|
|
29
|
-
// Helper functions
|
|
30
|
-
// =============================================================================
|
|
31
|
-
/**
|
|
32
|
-
* Extract story from sprint YAML by ID
|
|
33
|
-
*/
|
|
34
|
-
function getStoryFromSprintYaml(yamlContent, storyId) {
|
|
35
|
-
const parsed = parseYaml(yamlContent);
|
|
36
|
-
for (const epic of parsed.epics) {
|
|
37
|
-
for (const story of epic.stories) {
|
|
38
|
-
if (story.id === storyId) {
|
|
39
|
-
return story;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Convert SprintStory to StoryMetadata for routing
|
|
47
|
-
*/
|
|
48
|
-
function storyToMetadata(story) {
|
|
49
|
-
const tags = [];
|
|
50
|
-
// Add workflow tag if present
|
|
51
|
-
if (story.workflow) {
|
|
52
|
-
tags.push(`workflow:${story.workflow}`);
|
|
53
|
-
}
|
|
54
|
-
return {
|
|
55
|
-
id: story.id,
|
|
56
|
-
points: story.points,
|
|
57
|
-
tags: tags.length > 0 ? tags : undefined
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Get next agent from workflow phase sequence
|
|
62
|
-
*/
|
|
63
|
-
function getFirstAgentAfterSetup(workflow) {
|
|
64
|
-
const phases = workflow.phases;
|
|
65
|
-
if (!phases || phases.length < 2)
|
|
66
|
-
return null;
|
|
67
|
-
// Find setup phase, return next phase's agent
|
|
68
|
-
for (let i = 0; i < phases.length - 1; i++) {
|
|
69
|
-
if (phases[i].name === 'setup') {
|
|
70
|
-
return phases[i + 1].agent;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
// If no explicit setup, return second phase's agent
|
|
74
|
-
return phases[1]?.agent || null;
|
|
75
|
-
}
|
|
76
|
-
// =============================================================================
|
|
77
|
-
// AC1: SM reads workflow tag from story in sprint YAML
|
|
78
|
-
// =============================================================================
|
|
79
|
-
describe('AC1: Read workflow tag from sprint YAML', () => {
|
|
80
|
-
beforeEach(() => {
|
|
81
|
-
if (existsSync(TEST_DIR)) {
|
|
82
|
-
rmSync(TEST_DIR, { recursive: true });
|
|
83
|
-
}
|
|
84
|
-
mkdirSync(TEST_DIR, { recursive: true });
|
|
85
|
-
});
|
|
86
|
-
afterEach(() => {
|
|
87
|
-
if (existsSync(TEST_DIR)) {
|
|
88
|
-
rmSync(TEST_DIR, { recursive: true });
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
it('should extract workflow tag from story with explicit workflow: field', () => {
|
|
92
|
-
const sprintYaml = `
|
|
93
|
-
sprint:
|
|
94
|
-
number: 11
|
|
95
|
-
goal: "Test sprint"
|
|
96
|
-
epics:
|
|
97
|
-
- id: epic-38
|
|
98
|
-
title: "Agent File Modernization"
|
|
99
|
-
stories:
|
|
100
|
-
- id: "38-9"
|
|
101
|
-
title: "SM workflow routing from story tags"
|
|
102
|
-
points: 3
|
|
103
|
-
workflow: tdd
|
|
104
|
-
status: backlog
|
|
105
|
-
`;
|
|
106
|
-
const story = getStoryFromSprintYaml(sprintYaml, '38-9');
|
|
107
|
-
assert.ok(story, 'Story should be found');
|
|
108
|
-
assert.strictEqual(story.workflow, 'tdd', 'Workflow tag should be extracted');
|
|
109
|
-
});
|
|
110
|
-
it('should extract workflow: trivial for trivial workflow stories', () => {
|
|
111
|
-
const sprintYaml = `
|
|
112
|
-
sprint:
|
|
113
|
-
number: 11
|
|
114
|
-
epics:
|
|
115
|
-
- id: epic-38
|
|
116
|
-
stories:
|
|
117
|
-
- id: "38-1"
|
|
118
|
-
title: "Fix stale references"
|
|
119
|
-
points: 1
|
|
120
|
-
workflow: trivial
|
|
121
|
-
status: backlog
|
|
122
|
-
`;
|
|
123
|
-
const story = getStoryFromSprintYaml(sprintYaml, '38-1');
|
|
124
|
-
assert.ok(story, 'Story should be found');
|
|
125
|
-
assert.strictEqual(story.workflow, 'trivial', 'Trivial workflow should be extracted');
|
|
126
|
-
});
|
|
127
|
-
it('should extract workflow: agent-docs for documentation stories', () => {
|
|
128
|
-
const sprintYaml = `
|
|
129
|
-
sprint:
|
|
130
|
-
number: 11
|
|
131
|
-
epics:
|
|
132
|
-
- id: epic-38
|
|
133
|
-
stories:
|
|
134
|
-
- id: "38-3"
|
|
135
|
-
title: "Modernize PM agent"
|
|
136
|
-
points: 2
|
|
137
|
-
workflow: agent-docs
|
|
138
|
-
status: backlog
|
|
139
|
-
`;
|
|
140
|
-
const story = getStoryFromSprintYaml(sprintYaml, '38-3');
|
|
141
|
-
assert.ok(story, 'Story should be found');
|
|
142
|
-
assert.strictEqual(story.workflow, 'agent-docs', 'Agent-docs workflow should be extracted');
|
|
143
|
-
});
|
|
144
|
-
it('should return undefined workflow for stories without tag', () => {
|
|
145
|
-
const sprintYaml = `
|
|
146
|
-
sprint:
|
|
147
|
-
number: 11
|
|
148
|
-
epics:
|
|
149
|
-
- id: epic-38
|
|
150
|
-
stories:
|
|
151
|
-
- id: "38-99"
|
|
152
|
-
title: "Story without workflow tag"
|
|
153
|
-
points: 2
|
|
154
|
-
status: backlog
|
|
155
|
-
`;
|
|
156
|
-
const story = getStoryFromSprintYaml(sprintYaml, '38-99');
|
|
157
|
-
assert.ok(story, 'Story should be found');
|
|
158
|
-
assert.strictEqual(story.workflow, undefined, 'Workflow should be undefined');
|
|
159
|
-
});
|
|
160
|
-
it('should convert story workflow to StoryMetadata tags', () => {
|
|
161
|
-
const story = {
|
|
162
|
-
id: '38-9',
|
|
163
|
-
title: 'Test',
|
|
164
|
-
points: 3,
|
|
165
|
-
workflow: 'tdd'
|
|
166
|
-
};
|
|
167
|
-
const metadata = storyToMetadata(story);
|
|
168
|
-
assert.ok(metadata.tags, 'Should have tags');
|
|
169
|
-
assert.ok(metadata.tags.includes('workflow:tdd'), 'Should include workflow tag');
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
// =============================================================================
|
|
173
|
-
// AC2: SM loads correct workflow definition
|
|
174
|
-
// =============================================================================
|
|
175
|
-
describe('AC2: Load correct workflow definition', () => {
|
|
176
|
-
// Find monorepo root for real workflow files
|
|
177
|
-
function findMonorepoRoot(startDir) {
|
|
178
|
-
let dir = startDir;
|
|
179
|
-
for (let i = 0; i < 10; i++) {
|
|
180
|
-
if (existsSync(join(dir, 'pennyfarthing-dist'))) {
|
|
181
|
-
return dir;
|
|
182
|
-
}
|
|
183
|
-
const parent = dirname(dir);
|
|
184
|
-
if (parent === dir)
|
|
185
|
-
break;
|
|
186
|
-
dir = parent;
|
|
187
|
-
}
|
|
188
|
-
return null;
|
|
189
|
-
}
|
|
190
|
-
const monorepoRoot = findMonorepoRoot(__dirname);
|
|
191
|
-
const workflowsDir = monorepoRoot
|
|
192
|
-
? join(monorepoRoot, 'pennyfarthing-dist', 'workflows')
|
|
193
|
-
: null;
|
|
194
|
-
it('should load all workflow definitions from pennyfarthing-dist/workflows/', async () => {
|
|
195
|
-
if (!workflowsDir) {
|
|
196
|
-
console.log('Skipping: workflows directory not found');
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
const { workflows, errors } = loadWorkflowsFromDir(workflowsDir);
|
|
200
|
-
assert.ok(workflows.length > 0, 'Should load at least one workflow');
|
|
201
|
-
assert.strictEqual(errors.length, 0, `Should have no load errors: ${JSON.stringify(errors)}`);
|
|
202
|
-
// Expected workflows
|
|
203
|
-
const workflowNames = workflows.map(w => w.name);
|
|
204
|
-
assert.ok(workflowNames.includes('tdd'), 'Should include tdd workflow');
|
|
205
|
-
assert.ok(workflowNames.includes('trivial'), 'Should include trivial workflow');
|
|
206
|
-
assert.ok(workflowNames.includes('agent-docs'), 'Should include agent-docs workflow');
|
|
207
|
-
});
|
|
208
|
-
it('should route story with workflow:tdd tag to tdd workflow', async () => {
|
|
209
|
-
if (!workflowsDir) {
|
|
210
|
-
console.log('Skipping: workflows directory not found');
|
|
211
|
-
return;
|
|
212
|
-
}
|
|
213
|
-
const { workflows } = loadWorkflowsFromDir(workflowsDir);
|
|
214
|
-
const story = {
|
|
215
|
-
id: '38-9',
|
|
216
|
-
tags: ['workflow:tdd'],
|
|
217
|
-
points: 3
|
|
218
|
-
};
|
|
219
|
-
const result = routeStoryToWorkflow(story, workflows);
|
|
220
|
-
assert.ok(result, 'Should route to a workflow');
|
|
221
|
-
assert.strictEqual(result.workflow.name, 'tdd', 'Should route to tdd workflow');
|
|
222
|
-
assert.ok(result.reason.includes('tag'), 'Reason should mention tag match');
|
|
223
|
-
});
|
|
224
|
-
it('should route story with workflow:trivial tag to trivial workflow', async () => {
|
|
225
|
-
if (!workflowsDir) {
|
|
226
|
-
console.log('Skipping: workflows directory not found');
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
const { workflows } = loadWorkflowsFromDir(workflowsDir);
|
|
230
|
-
const story = {
|
|
231
|
-
id: '38-1',
|
|
232
|
-
tags: ['workflow:trivial'],
|
|
233
|
-
points: 1
|
|
234
|
-
};
|
|
235
|
-
const result = routeStoryToWorkflow(story, workflows);
|
|
236
|
-
assert.ok(result, 'Should route to a workflow');
|
|
237
|
-
assert.strictEqual(result.workflow.name, 'trivial', 'Should route to trivial workflow');
|
|
238
|
-
});
|
|
239
|
-
it('should route story with workflow:agent-docs tag to agent-docs workflow', async () => {
|
|
240
|
-
if (!workflowsDir) {
|
|
241
|
-
console.log('Skipping: workflows directory not found');
|
|
242
|
-
return;
|
|
243
|
-
}
|
|
244
|
-
const { workflows } = loadWorkflowsFromDir(workflowsDir);
|
|
245
|
-
const story = {
|
|
246
|
-
id: '38-3',
|
|
247
|
-
tags: ['workflow:agent-docs'],
|
|
248
|
-
points: 2
|
|
249
|
-
};
|
|
250
|
-
const result = routeStoryToWorkflow(story, workflows);
|
|
251
|
-
assert.ok(result, 'Should route to a workflow');
|
|
252
|
-
assert.strictEqual(result.workflow.name, 'agent-docs', 'Should route to agent-docs workflow');
|
|
253
|
-
});
|
|
254
|
-
});
|
|
255
|
-
// =============================================================================
|
|
256
|
-
// AC3: SM follows workflow's phase sequence
|
|
257
|
-
// =============================================================================
|
|
258
|
-
describe('AC3: Follow workflow phase sequence', () => {
|
|
259
|
-
function findMonorepoRoot(startDir) {
|
|
260
|
-
let dir = startDir;
|
|
261
|
-
for (let i = 0; i < 10; i++) {
|
|
262
|
-
if (existsSync(join(dir, 'pennyfarthing-dist'))) {
|
|
263
|
-
return dir;
|
|
264
|
-
}
|
|
265
|
-
const parent = dirname(dir);
|
|
266
|
-
if (parent === dir)
|
|
267
|
-
break;
|
|
268
|
-
dir = parent;
|
|
269
|
-
}
|
|
270
|
-
return null;
|
|
271
|
-
}
|
|
272
|
-
const monorepoRoot = findMonorepoRoot(__dirname);
|
|
273
|
-
const workflowsDir = monorepoRoot
|
|
274
|
-
? join(monorepoRoot, 'pennyfarthing-dist', 'workflows')
|
|
275
|
-
: null;
|
|
276
|
-
it('tdd workflow should route SM setup → TEA (red phase)', async () => {
|
|
277
|
-
if (!workflowsDir) {
|
|
278
|
-
console.log('Skipping: workflows directory not found');
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
const { workflows } = loadWorkflowsFromDir(workflowsDir);
|
|
282
|
-
const tddWorkflow = workflows.find(w => w.name === 'tdd');
|
|
283
|
-
assert.ok(tddWorkflow, 'TDD workflow should exist');
|
|
284
|
-
const nextAgent = getFirstAgentAfterSetup(tddWorkflow);
|
|
285
|
-
assert.strictEqual(nextAgent, 'tea', 'TDD workflow should route to TEA after setup');
|
|
286
|
-
});
|
|
287
|
-
it('trivial workflow should route SM setup → Dev (implement phase)', async () => {
|
|
288
|
-
if (!workflowsDir) {
|
|
289
|
-
console.log('Skipping: workflows directory not found');
|
|
290
|
-
return;
|
|
291
|
-
}
|
|
292
|
-
const { workflows } = loadWorkflowsFromDir(workflowsDir);
|
|
293
|
-
const trivialWorkflow = workflows.find(w => w.name === 'trivial');
|
|
294
|
-
assert.ok(trivialWorkflow, 'Trivial workflow should exist');
|
|
295
|
-
const nextAgent = getFirstAgentAfterSetup(trivialWorkflow);
|
|
296
|
-
assert.strictEqual(nextAgent, 'dev', 'Trivial workflow should route to Dev after setup');
|
|
297
|
-
});
|
|
298
|
-
it('agent-docs workflow should route SM setup → Orchestrator (analyze phase)', async () => {
|
|
299
|
-
if (!workflowsDir) {
|
|
300
|
-
console.log('Skipping: workflows directory not found');
|
|
301
|
-
return;
|
|
302
|
-
}
|
|
303
|
-
const { workflows } = loadWorkflowsFromDir(workflowsDir);
|
|
304
|
-
const agentDocsWorkflow = workflows.find(w => w.name === 'agent-docs');
|
|
305
|
-
assert.ok(agentDocsWorkflow, 'Agent-docs workflow should exist');
|
|
306
|
-
const nextAgent = getFirstAgentAfterSetup(agentDocsWorkflow);
|
|
307
|
-
assert.strictEqual(nextAgent, 'orchestrator', `Agent-docs workflow should route to Orchestrator after setup, got: ${nextAgent}`);
|
|
308
|
-
});
|
|
309
|
-
it('should return correct handoff target based on workflow', async () => {
|
|
310
|
-
if (!workflowsDir) {
|
|
311
|
-
console.log('Skipping: workflows directory not found');
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
const { workflows } = loadWorkflowsFromDir(workflowsDir);
|
|
315
|
-
// Test routing for different workflow tags
|
|
316
|
-
const testCases = [
|
|
317
|
-
{ workflowTag: 'tdd', expectedAgent: 'tea' },
|
|
318
|
-
{ workflowTag: 'trivial', expectedAgent: 'dev' },
|
|
319
|
-
{ workflowTag: 'agent-docs', expectedAgent: 'orchestrator' }
|
|
320
|
-
];
|
|
321
|
-
for (const { workflowTag, expectedAgent } of testCases) {
|
|
322
|
-
const story = {
|
|
323
|
-
id: 'test',
|
|
324
|
-
tags: [`workflow:${workflowTag}`]
|
|
325
|
-
};
|
|
326
|
-
const result = routeStoryToWorkflow(story, workflows);
|
|
327
|
-
assert.ok(result, `Should route ${workflowTag}`);
|
|
328
|
-
const nextAgent = getFirstAgentAfterSetup(result.workflow);
|
|
329
|
-
assert.strictEqual(nextAgent, expectedAgent, `${workflowTag} workflow should route to ${expectedAgent}, got ${nextAgent}`);
|
|
330
|
-
}
|
|
331
|
-
});
|
|
332
|
-
});
|
|
333
|
-
// =============================================================================
|
|
334
|
-
// AC4: Fallback to TDD if no tag or unknown workflow
|
|
335
|
-
// =============================================================================
|
|
336
|
-
describe('AC4: Fallback to TDD workflow', () => {
|
|
337
|
-
function findMonorepoRoot(startDir) {
|
|
338
|
-
let dir = startDir;
|
|
339
|
-
for (let i = 0; i < 10; i++) {
|
|
340
|
-
if (existsSync(join(dir, 'pennyfarthing-dist'))) {
|
|
341
|
-
return dir;
|
|
342
|
-
}
|
|
343
|
-
const parent = dirname(dir);
|
|
344
|
-
if (parent === dir)
|
|
345
|
-
break;
|
|
346
|
-
dir = parent;
|
|
347
|
-
}
|
|
348
|
-
return null;
|
|
349
|
-
}
|
|
350
|
-
const monorepoRoot = findMonorepoRoot(__dirname);
|
|
351
|
-
const workflowsDir = monorepoRoot
|
|
352
|
-
? join(monorepoRoot, 'pennyfarthing-dist', 'workflows')
|
|
353
|
-
: null;
|
|
354
|
-
it('should fall back to tdd for story with no workflow tag', async () => {
|
|
355
|
-
if (!workflowsDir) {
|
|
356
|
-
console.log('Skipping: workflows directory not found');
|
|
357
|
-
return;
|
|
358
|
-
}
|
|
359
|
-
const { workflows } = loadWorkflowsFromDir(workflowsDir);
|
|
360
|
-
const story = {
|
|
361
|
-
id: '38-99',
|
|
362
|
-
// No tags - should use default
|
|
363
|
-
};
|
|
364
|
-
const result = routeStoryToWorkflow(story, workflows);
|
|
365
|
-
assert.ok(result, 'Should still route to a workflow');
|
|
366
|
-
assert.strictEqual(result.workflow.name, 'tdd', 'Should fall back to tdd (default)');
|
|
367
|
-
assert.ok(result.reason.includes('default'), 'Reason should mention default fallback');
|
|
368
|
-
});
|
|
369
|
-
it('should fall back to tdd for story with unknown workflow tag', async () => {
|
|
370
|
-
if (!workflowsDir) {
|
|
371
|
-
console.log('Skipping: workflows directory not found');
|
|
372
|
-
return;
|
|
373
|
-
}
|
|
374
|
-
const { workflows } = loadWorkflowsFromDir(workflowsDir);
|
|
375
|
-
const story = {
|
|
376
|
-
id: '38-99',
|
|
377
|
-
tags: ['workflow:nonexistent-workflow']
|
|
378
|
-
};
|
|
379
|
-
const result = routeStoryToWorkflow(story, workflows);
|
|
380
|
-
// Unknown workflow tag should be ignored, fall back to default
|
|
381
|
-
assert.ok(result, 'Should still route to a workflow');
|
|
382
|
-
assert.strictEqual(result.workflow.name, 'tdd', 'Should fall back to tdd for unknown workflow');
|
|
383
|
-
});
|
|
384
|
-
it('should use type-based routing when no explicit workflow tag', async () => {
|
|
385
|
-
if (!workflowsDir) {
|
|
386
|
-
console.log('Skipping: workflows directory not found');
|
|
387
|
-
return;
|
|
388
|
-
}
|
|
389
|
-
const { workflows } = loadWorkflowsFromDir(workflowsDir);
|
|
390
|
-
const story = {
|
|
391
|
-
id: '38-99',
|
|
392
|
-
type: 'feature',
|
|
393
|
-
points: 5
|
|
394
|
-
// No workflow tag - should match based on type/points
|
|
395
|
-
};
|
|
396
|
-
const result = routeStoryToWorkflow(story, workflows);
|
|
397
|
-
assert.ok(result, 'Should route to a workflow');
|
|
398
|
-
// Feature type should match tdd workflow triggers
|
|
399
|
-
assert.strictEqual(result.workflow.name, 'tdd');
|
|
400
|
-
});
|
|
401
|
-
it('should use points-based routing for low-point stories without tag', async () => {
|
|
402
|
-
if (!workflowsDir) {
|
|
403
|
-
console.log('Skipping: workflows directory not found');
|
|
404
|
-
return;
|
|
405
|
-
}
|
|
406
|
-
const { workflows } = loadWorkflowsFromDir(workflowsDir);
|
|
407
|
-
const story = {
|
|
408
|
-
id: '38-99',
|
|
409
|
-
type: 'chore',
|
|
410
|
-
points: 1
|
|
411
|
-
// No workflow tag - should match trivial based on type + points
|
|
412
|
-
};
|
|
413
|
-
const result = routeStoryToWorkflow(story, workflows);
|
|
414
|
-
assert.ok(result, 'Should route to a workflow');
|
|
415
|
-
// Chore type + 1 point should match trivial workflow triggers
|
|
416
|
-
assert.strictEqual(result.workflow.name, 'trivial', 'Low-point chore should route to trivial workflow');
|
|
417
|
-
});
|
|
418
|
-
});
|
|
419
|
-
// =============================================================================
|
|
420
|
-
// AC5: Session file records which workflow is active
|
|
421
|
-
// =============================================================================
|
|
422
|
-
describe('AC5: Session file records active workflow', () => {
|
|
423
|
-
beforeEach(() => {
|
|
424
|
-
if (existsSync(TEST_DIR)) {
|
|
425
|
-
rmSync(TEST_DIR, { recursive: true });
|
|
426
|
-
}
|
|
427
|
-
mkdirSync(TEST_DIR, { recursive: true });
|
|
428
|
-
});
|
|
429
|
-
afterEach(() => {
|
|
430
|
-
if (existsSync(TEST_DIR)) {
|
|
431
|
-
rmSync(TEST_DIR, { recursive: true });
|
|
432
|
-
}
|
|
433
|
-
});
|
|
434
|
-
it('should include **Workflow:** field in session file', () => {
|
|
435
|
-
// This test verifies the session file format includes workflow tracking
|
|
436
|
-
const sessionContent = `# Story 38-9: SM workflow routing
|
|
437
|
-
|
|
438
|
-
## Story Details
|
|
439
|
-
|
|
440
|
-
| Field | Value |
|
|
441
|
-
|-------|-------|
|
|
442
|
-
| Story | 38-9 |
|
|
443
|
-
|
|
444
|
-
## Workflow Tracking
|
|
445
|
-
|
|
446
|
-
**Workflow:** tdd
|
|
447
|
-
**Phase:** setup
|
|
448
|
-
**Status:** in_progress
|
|
449
|
-
`;
|
|
450
|
-
const sessionPath = join(TEST_DIR, '38-9-session.md');
|
|
451
|
-
writeFileSync(sessionPath, sessionContent);
|
|
452
|
-
const content = readFileSync(sessionPath, 'utf-8');
|
|
453
|
-
// Verify workflow field exists
|
|
454
|
-
assert.ok(content.includes('**Workflow:** tdd'), 'Session file should include Workflow field');
|
|
455
|
-
assert.ok(content.includes('## Workflow Tracking'), 'Session file should have Workflow Tracking section');
|
|
456
|
-
});
|
|
457
|
-
it('should record workflow matching the selected workflow tag', () => {
|
|
458
|
-
// Test with different workflow values
|
|
459
|
-
const testWorkflows = ['tdd', 'trivial', 'agent-docs'];
|
|
460
|
-
for (const workflow of testWorkflows) {
|
|
461
|
-
const sessionContent = `# Story Test
|
|
462
|
-
|
|
463
|
-
## Workflow Tracking
|
|
464
|
-
|
|
465
|
-
**Workflow:** ${workflow}
|
|
466
|
-
**Phase:** setup
|
|
467
|
-
`;
|
|
468
|
-
const sessionPath = join(TEST_DIR, `test-${workflow}-session.md`);
|
|
469
|
-
writeFileSync(sessionPath, sessionContent);
|
|
470
|
-
const content = readFileSync(sessionPath, 'utf-8');
|
|
471
|
-
assert.ok(content.includes(`**Workflow:** ${workflow}`), `Session should record workflow: ${workflow}`);
|
|
472
|
-
}
|
|
473
|
-
});
|
|
474
|
-
it('should extract workflow from existing session file', () => {
|
|
475
|
-
const sessionContent = `# Story 38-3
|
|
476
|
-
|
|
477
|
-
## Workflow Tracking
|
|
478
|
-
|
|
479
|
-
**Workflow:** agent-docs
|
|
480
|
-
**Phase:** analyze
|
|
481
|
-
**Agent:** orchestrator
|
|
482
|
-
`;
|
|
483
|
-
const sessionPath = join(TEST_DIR, '38-3-session.md');
|
|
484
|
-
writeFileSync(sessionPath, sessionContent);
|
|
485
|
-
const content = readFileSync(sessionPath, 'utf-8');
|
|
486
|
-
// Extract workflow using regex (same as workflow-status-check does)
|
|
487
|
-
const workflowMatch = content.match(/\*\*Workflow:\*\*\s*(\S+)/);
|
|
488
|
-
assert.ok(workflowMatch, 'Should be able to extract workflow from session');
|
|
489
|
-
assert.strictEqual(workflowMatch[1], 'agent-docs', 'Extracted workflow should match');
|
|
490
|
-
});
|
|
491
|
-
});
|
|
492
|
-
// =============================================================================
|
|
493
|
-
// Integration: End-to-end workflow routing from sprint YAML
|
|
494
|
-
// =============================================================================
|
|
495
|
-
describe('Integration: Sprint YAML → Workflow Routing', () => {
|
|
496
|
-
function findMonorepoRoot(startDir) {
|
|
497
|
-
let dir = startDir;
|
|
498
|
-
for (let i = 0; i < 10; i++) {
|
|
499
|
-
if (existsSync(join(dir, 'pennyfarthing-dist'))) {
|
|
500
|
-
return dir;
|
|
501
|
-
}
|
|
502
|
-
const parent = dirname(dir);
|
|
503
|
-
if (parent === dir)
|
|
504
|
-
break;
|
|
505
|
-
dir = parent;
|
|
506
|
-
}
|
|
507
|
-
return null;
|
|
508
|
-
}
|
|
509
|
-
const monorepoRoot = findMonorepoRoot(__dirname);
|
|
510
|
-
const workflowsDir = monorepoRoot
|
|
511
|
-
? join(monorepoRoot, 'pennyfarthing-dist', 'workflows')
|
|
512
|
-
: null;
|
|
513
|
-
it('should route sprint story with workflow tag to correct workflow and agent', async () => {
|
|
514
|
-
if (!workflowsDir) {
|
|
515
|
-
console.log('Skipping: workflows directory not found');
|
|
516
|
-
return;
|
|
517
|
-
}
|
|
518
|
-
// Simulate sprint YAML with different workflow tags
|
|
519
|
-
const sprintYaml = `
|
|
520
|
-
sprint:
|
|
521
|
-
number: 11
|
|
522
|
-
goal: "Test workflow routing"
|
|
523
|
-
epics:
|
|
524
|
-
- id: epic-38
|
|
525
|
-
title: "Agent File Modernization"
|
|
526
|
-
stories:
|
|
527
|
-
- id: "38-9"
|
|
528
|
-
title: "SM workflow routing from story tags"
|
|
529
|
-
points: 3
|
|
530
|
-
workflow: tdd
|
|
531
|
-
- id: "38-3"
|
|
532
|
-
title: "Modernize PM agent"
|
|
533
|
-
points: 2
|
|
534
|
-
workflow: agent-docs
|
|
535
|
-
- id: "38-1"
|
|
536
|
-
title: "Fix stale references"
|
|
537
|
-
points: 1
|
|
538
|
-
workflow: trivial
|
|
539
|
-
`;
|
|
540
|
-
const { workflows } = loadWorkflowsFromDir(workflowsDir);
|
|
541
|
-
// Test each story
|
|
542
|
-
const expectedRoutes = [
|
|
543
|
-
{ storyId: '38-9', workflow: 'tdd', agent: 'tea' },
|
|
544
|
-
{ storyId: '38-3', workflow: 'agent-docs', agent: 'orchestrator' },
|
|
545
|
-
{ storyId: '38-1', workflow: 'trivial', agent: 'dev' }
|
|
546
|
-
];
|
|
547
|
-
for (const expected of expectedRoutes) {
|
|
548
|
-
const story = getStoryFromSprintYaml(sprintYaml, expected.storyId);
|
|
549
|
-
assert.ok(story, `Story ${expected.storyId} should exist`);
|
|
550
|
-
const metadata = storyToMetadata(story);
|
|
551
|
-
const result = routeStoryToWorkflow(metadata, workflows);
|
|
552
|
-
assert.ok(result, `Story ${expected.storyId} should route`);
|
|
553
|
-
assert.strictEqual(result.workflow.name, expected.workflow, `Story ${expected.storyId} should route to ${expected.workflow}`);
|
|
554
|
-
const nextAgent = getFirstAgentAfterSetup(result.workflow);
|
|
555
|
-
assert.strictEqual(nextAgent, expected.agent, `Story ${expected.storyId} should hand off to ${expected.agent}`);
|
|
556
|
-
}
|
|
557
|
-
});
|
|
558
|
-
});
|
|
559
|
-
//# sourceMappingURL=story-workflow-routing.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"story-workflow-routing.test.js","sourceRoot":"","sources":["../../src/workflow/story-workflow-routing.test.ts"],"names":[],"mappings":"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"}
|