@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,603 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for Story 32-5: BMAD Story Exporter
|
|
3
|
-
*
|
|
4
|
-
* These tests define the contract for exporting Pennyfarthing sessions to BMAD story format.
|
|
5
|
-
* Dev will implement exportToBmadStory() to pass these tests.
|
|
6
|
-
*
|
|
7
|
-
* Input: SessionData (parsed from .session/{story-id}-session.md)
|
|
8
|
-
* Output: BMAD story markdown string
|
|
9
|
-
*
|
|
10
|
-
* Key mapping:
|
|
11
|
-
* - Pennyfarthing status → BMAD status
|
|
12
|
-
* - Dev Assessment → Dev Notes
|
|
13
|
-
* - Session Log → Dev Agent Record
|
|
14
|
-
* - AC checkboxes → preserved in Acceptance Criteria
|
|
15
|
-
* - Task checkboxes → preserved in Tasks / Subtasks
|
|
16
|
-
*
|
|
17
|
-
* Run with: npm test
|
|
18
|
-
*/
|
|
19
|
-
import { describe, it } from 'node:test';
|
|
20
|
-
import assert from 'node:assert';
|
|
21
|
-
// Import the exporter function that Dev will implement
|
|
22
|
-
import { exportToBmadStory, } from './story-exporter.js';
|
|
23
|
-
// Import parser for round-trip validation
|
|
24
|
-
import { parseBmadStory } from './story-parser.js';
|
|
25
|
-
// =============================================================================
|
|
26
|
-
// TEST DATA: Session data structures
|
|
27
|
-
// =============================================================================
|
|
28
|
-
const MINIMAL_SESSION = {
|
|
29
|
-
storyId: '32-5',
|
|
30
|
-
title: 'Session to BMAD story exporter',
|
|
31
|
-
status: 'done',
|
|
32
|
-
userStory: 'As a developer, I want to export sessions to BMAD format, so that external tools can consume our work',
|
|
33
|
-
acceptanceCriteria: [
|
|
34
|
-
{ text: 'Exports session to BMAD story format', completed: true },
|
|
35
|
-
{ text: 'Populates Dev Agent Record section', completed: true },
|
|
36
|
-
],
|
|
37
|
-
};
|
|
38
|
-
const COMPLETE_SESSION = {
|
|
39
|
-
storyId: '34-2',
|
|
40
|
-
title: 'Cyclist health check command',
|
|
41
|
-
status: 'done',
|
|
42
|
-
userStory: 'As a developer, I want a health check command, so that I can diagnose Cyclist setup issues',
|
|
43
|
-
acceptanceCriteria: [
|
|
44
|
-
{ text: 'just cyclist-doctor runs scripts/cyclist-doctor.sh', completed: true },
|
|
45
|
-
{ text: 'Checks system prereqs (Node >= 18, pnpm, Python 3, Xcode tools, just)', completed: true },
|
|
46
|
-
{ text: 'Checks build state (dist/server.js, dist/main.js exist)', completed: true },
|
|
47
|
-
{ text: 'Each failure shows specific fix command', completed: true },
|
|
48
|
-
{ text: 'Supports --fix flag to auto-run fix commands', completed: true },
|
|
49
|
-
{ text: 'Exit 0 if all pass, exit 1 if any fail', completed: true },
|
|
50
|
-
],
|
|
51
|
-
tasks: [
|
|
52
|
-
{
|
|
53
|
-
text: 'Create cyclist-doctor.sh script',
|
|
54
|
-
completed: true,
|
|
55
|
-
subtasks: [
|
|
56
|
-
{ text: 'Add system prereq checks', completed: true },
|
|
57
|
-
{ text: 'Add build state checks', completed: true },
|
|
58
|
-
{ text: 'Add node-pty checks', completed: true },
|
|
59
|
-
],
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
text: 'Add justfile recipe',
|
|
63
|
-
completed: true,
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
text: 'Write integration tests',
|
|
67
|
-
completed: true,
|
|
68
|
-
},
|
|
69
|
-
],
|
|
70
|
-
devNotes: `2026-01-13: Started implementation. Using bash script for portability.
|
|
71
|
-
2026-01-13: Hit issue with set -e and arithmetic. Fixed with || true.
|
|
72
|
-
2026-01-13: All 49 tests passing.`,
|
|
73
|
-
devAgentRecord: `Session: 34-2-dev
|
|
74
|
-
Commands executed:
|
|
75
|
-
- npm test -- Tests passing: 49/49
|
|
76
|
-
- just cyclist-doctor -- All 14 checks pass
|
|
77
|
-
Files created:
|
|
78
|
-
- packages/cyclist/scripts/cyclist-doctor.sh (429 lines)`,
|
|
79
|
-
fileList: [
|
|
80
|
-
'packages/cyclist/scripts/cyclist-doctor.sh',
|
|
81
|
-
'packages/cyclist/tests/34-2-cyclist-health-check.test.ts',
|
|
82
|
-
'justfile',
|
|
83
|
-
],
|
|
84
|
-
};
|
|
85
|
-
const SESSION_IN_REVIEW = {
|
|
86
|
-
storyId: '33-3',
|
|
87
|
-
title: 'Cyclist permission UI',
|
|
88
|
-
status: 'needs_review',
|
|
89
|
-
userStory: 'As a user, I want to see and manage permissions visually, so that I can control what Claude Code can do',
|
|
90
|
-
acceptanceCriteria: [
|
|
91
|
-
{ text: 'Modal shows current permissions', completed: true },
|
|
92
|
-
{ text: 'Can grant new permissions', completed: false },
|
|
93
|
-
{ text: 'Can revoke permissions', completed: false },
|
|
94
|
-
],
|
|
95
|
-
};
|
|
96
|
-
const SESSION_IN_PROGRESS = {
|
|
97
|
-
storyId: '31-8',
|
|
98
|
-
title: 'Eliminate redundant test runs',
|
|
99
|
-
status: 'in_progress',
|
|
100
|
-
userStory: 'As a developer, I want to skip redundant test runs, so that the TDD flow is faster',
|
|
101
|
-
acceptanceCriteria: [
|
|
102
|
-
{ text: 'Cache test results with content hash', completed: false },
|
|
103
|
-
{ text: 'Skip tests if cache is fresh', completed: false },
|
|
104
|
-
],
|
|
105
|
-
};
|
|
106
|
-
const SESSION_BACKLOG = {
|
|
107
|
-
storyId: '33-5',
|
|
108
|
-
title: 'Permission presets by workflow',
|
|
109
|
-
status: 'backlog',
|
|
110
|
-
userStory: 'As a user, I want workflow-specific permission presets, so that setup is faster',
|
|
111
|
-
acceptanceCriteria: [
|
|
112
|
-
{ text: 'Workflows declare required permissions', completed: false },
|
|
113
|
-
{ text: 'Auto-prompt for missing permissions', completed: false },
|
|
114
|
-
],
|
|
115
|
-
};
|
|
116
|
-
// =============================================================================
|
|
117
|
-
// AC1: Exports session to BMAD story format
|
|
118
|
-
// =============================================================================
|
|
119
|
-
describe('BMAD Story Exporter (32-5)', () => {
|
|
120
|
-
describe('AC1: Exports session to BMAD story format', () => {
|
|
121
|
-
it('should export minimal session to valid BMAD markdown', () => {
|
|
122
|
-
const result = exportToBmadStory(MINIMAL_SESSION);
|
|
123
|
-
assert.strictEqual(result.success, true, 'Export should succeed');
|
|
124
|
-
assert.ok(result.markdown, 'Should return markdown string');
|
|
125
|
-
assert.ok(result.markdown.length > 0, 'Markdown should not be empty');
|
|
126
|
-
});
|
|
127
|
-
it('should include story title as H1 header', () => {
|
|
128
|
-
const result = exportToBmadStory(MINIMAL_SESSION);
|
|
129
|
-
assert.strictEqual(result.success, true);
|
|
130
|
-
assert.ok(result.markdown?.includes('# Story: Session to BMAD story exporter'), 'Should include title as H1');
|
|
131
|
-
});
|
|
132
|
-
it('should include Status section', () => {
|
|
133
|
-
const result = exportToBmadStory(COMPLETE_SESSION);
|
|
134
|
-
assert.strictEqual(result.success, true);
|
|
135
|
-
assert.ok(result.markdown?.includes('## Status'), 'Should include Status section');
|
|
136
|
-
});
|
|
137
|
-
it('should include Story section with user story', () => {
|
|
138
|
-
const result = exportToBmadStory(MINIMAL_SESSION);
|
|
139
|
-
assert.strictEqual(result.success, true);
|
|
140
|
-
assert.ok(result.markdown?.includes('## Story'), 'Should include Story section');
|
|
141
|
-
assert.ok(result.markdown?.includes('As a developer, I want to export sessions'), 'Should include user story text');
|
|
142
|
-
});
|
|
143
|
-
it('should include Acceptance Criteria section', () => {
|
|
144
|
-
const result = exportToBmadStory(MINIMAL_SESSION);
|
|
145
|
-
assert.strictEqual(result.success, true);
|
|
146
|
-
assert.ok(result.markdown?.includes('## Acceptance Criteria'), 'Should include AC section');
|
|
147
|
-
});
|
|
148
|
-
it('should produce markdown that parses successfully', () => {
|
|
149
|
-
const exportResult = exportToBmadStory(COMPLETE_SESSION);
|
|
150
|
-
assert.strictEqual(exportResult.success, true);
|
|
151
|
-
// Round-trip: parse the exported markdown
|
|
152
|
-
const parseResult = parseBmadStory(exportResult.markdown);
|
|
153
|
-
assert.strictEqual(parseResult.success, true, 'Exported markdown should be parseable');
|
|
154
|
-
});
|
|
155
|
-
it('should preserve story title in round-trip', () => {
|
|
156
|
-
const exportResult = exportToBmadStory(COMPLETE_SESSION);
|
|
157
|
-
const parseResult = parseBmadStory(exportResult.markdown);
|
|
158
|
-
assert.strictEqual(parseResult.success, true);
|
|
159
|
-
assert.strictEqual(parseResult.story?.title, 'Cyclist health check command', 'Title should survive round-trip');
|
|
160
|
-
});
|
|
161
|
-
it('should preserve user story in round-trip', () => {
|
|
162
|
-
const exportResult = exportToBmadStory(MINIMAL_SESSION);
|
|
163
|
-
const parseResult = parseBmadStory(exportResult.markdown);
|
|
164
|
-
assert.strictEqual(parseResult.success, true);
|
|
165
|
-
assert.ok(parseResult.story?.userStory.includes('export sessions to BMAD format'), 'User story should survive round-trip');
|
|
166
|
-
});
|
|
167
|
-
it('should handle session without optional fields', () => {
|
|
168
|
-
const result = exportToBmadStory(MINIMAL_SESSION);
|
|
169
|
-
assert.strictEqual(result.success, true);
|
|
170
|
-
// Should still be valid BMAD format
|
|
171
|
-
const parseResult = parseBmadStory(result.markdown);
|
|
172
|
-
assert.strictEqual(parseResult.success, true);
|
|
173
|
-
});
|
|
174
|
-
it('should handle complete session with all fields', () => {
|
|
175
|
-
const result = exportToBmadStory(COMPLETE_SESSION);
|
|
176
|
-
assert.strictEqual(result.success, true);
|
|
177
|
-
// Should include all optional sections
|
|
178
|
-
assert.ok(result.markdown?.includes('## Tasks'), 'Should include Tasks section');
|
|
179
|
-
assert.ok(result.markdown?.includes('## Dev Notes'), 'Should include Dev Notes');
|
|
180
|
-
assert.ok(result.markdown?.includes('## Dev Agent Record'), 'Should include Dev Agent Record');
|
|
181
|
-
assert.ok(result.markdown?.includes('## File List'), 'Should include File List');
|
|
182
|
-
});
|
|
183
|
-
it('should return error for missing required fields', () => {
|
|
184
|
-
const invalidSession = {
|
|
185
|
-
storyId: '99-1',
|
|
186
|
-
// Missing: title, status, userStory, acceptanceCriteria
|
|
187
|
-
};
|
|
188
|
-
const result = exportToBmadStory(invalidSession);
|
|
189
|
-
assert.strictEqual(result.success, false, 'Should fail for invalid session');
|
|
190
|
-
assert.ok(result.errors && result.errors.length > 0, 'Should report errors');
|
|
191
|
-
});
|
|
192
|
-
it('should return error for empty acceptance criteria', () => {
|
|
193
|
-
const sessionNoAC = {
|
|
194
|
-
storyId: '99-2',
|
|
195
|
-
title: 'No ACs',
|
|
196
|
-
status: 'done',
|
|
197
|
-
userStory: 'As a user, I want something',
|
|
198
|
-
acceptanceCriteria: [],
|
|
199
|
-
};
|
|
200
|
-
const result = exportToBmadStory(sessionNoAC);
|
|
201
|
-
assert.strictEqual(result.success, false);
|
|
202
|
-
assert.ok(result.errors?.some(e => e.message.toLowerCase().includes('acceptance criteria')), 'Should report AC error');
|
|
203
|
-
});
|
|
204
|
-
});
|
|
205
|
-
// ===========================================================================
|
|
206
|
-
// AC2: Populates Dev Agent Record section
|
|
207
|
-
// ===========================================================================
|
|
208
|
-
describe('AC2: Populates Dev Agent Record section', () => {
|
|
209
|
-
it('should include Dev Agent Record section when devAgentRecord provided', () => {
|
|
210
|
-
const result = exportToBmadStory(COMPLETE_SESSION);
|
|
211
|
-
assert.strictEqual(result.success, true);
|
|
212
|
-
assert.ok(result.markdown?.includes('## Dev Agent Record'), 'Should include Dev Agent Record section');
|
|
213
|
-
});
|
|
214
|
-
it('should include devAgentRecord content', () => {
|
|
215
|
-
const result = exportToBmadStory(COMPLETE_SESSION);
|
|
216
|
-
assert.strictEqual(result.success, true);
|
|
217
|
-
assert.ok(result.markdown?.includes('Session: 34-2-dev'), 'Should include session ID from agent record');
|
|
218
|
-
assert.ok(result.markdown?.includes('npm test'), 'Should include commands from agent record');
|
|
219
|
-
});
|
|
220
|
-
it('should omit Dev Agent Record section when not provided', () => {
|
|
221
|
-
const result = exportToBmadStory(MINIMAL_SESSION);
|
|
222
|
-
assert.strictEqual(result.success, true);
|
|
223
|
-
// Should not include the section header if no content
|
|
224
|
-
const lines = result.markdown?.split('\n') || [];
|
|
225
|
-
const devAgentHeaders = lines.filter(l => l.trim() === '## Dev Agent Record');
|
|
226
|
-
assert.strictEqual(devAgentHeaders.length, 0, 'Should not include empty Dev Agent Record section');
|
|
227
|
-
});
|
|
228
|
-
it('should include Dev Notes section when devNotes provided', () => {
|
|
229
|
-
const result = exportToBmadStory(COMPLETE_SESSION);
|
|
230
|
-
assert.strictEqual(result.success, true);
|
|
231
|
-
assert.ok(result.markdown?.includes('## Dev Notes'), 'Should include Dev Notes section');
|
|
232
|
-
assert.ok(result.markdown?.includes('Started implementation'), 'Should include dev notes content');
|
|
233
|
-
});
|
|
234
|
-
it('should preserve timestamps in dev notes', () => {
|
|
235
|
-
const result = exportToBmadStory(COMPLETE_SESSION);
|
|
236
|
-
assert.strictEqual(result.success, true);
|
|
237
|
-
assert.ok(result.markdown?.includes('2026-01-13:'), 'Should preserve timestamp format');
|
|
238
|
-
});
|
|
239
|
-
it('should preserve multiline dev agent records', () => {
|
|
240
|
-
const result = exportToBmadStory(COMPLETE_SESSION);
|
|
241
|
-
assert.strictEqual(result.success, true);
|
|
242
|
-
assert.ok(result.markdown?.includes('Commands executed:'), 'Should preserve formatting');
|
|
243
|
-
assert.ok(result.markdown?.includes('Files created:'), 'Should preserve all lines');
|
|
244
|
-
});
|
|
245
|
-
});
|
|
246
|
-
// ===========================================================================
|
|
247
|
-
// AC3: Updates File List with changed files
|
|
248
|
-
// ===========================================================================
|
|
249
|
-
describe('AC3: Updates File List with changed files', () => {
|
|
250
|
-
it('should include File List section when fileList provided', () => {
|
|
251
|
-
const result = exportToBmadStory(COMPLETE_SESSION);
|
|
252
|
-
assert.strictEqual(result.success, true);
|
|
253
|
-
assert.ok(result.markdown?.includes('## File List'), 'Should include File List section');
|
|
254
|
-
});
|
|
255
|
-
it('should list all files from fileList', () => {
|
|
256
|
-
const result = exportToBmadStory(COMPLETE_SESSION);
|
|
257
|
-
assert.strictEqual(result.success, true);
|
|
258
|
-
assert.ok(result.markdown?.includes('packages/cyclist/scripts/cyclist-doctor.sh'), 'Should include first file');
|
|
259
|
-
assert.ok(result.markdown?.includes('packages/cyclist/tests/34-2-cyclist-health-check.test.ts'), 'Should include test file');
|
|
260
|
-
assert.ok(result.markdown?.includes('justfile'), 'Should include justfile');
|
|
261
|
-
});
|
|
262
|
-
it('should format files as bullet list', () => {
|
|
263
|
-
const result = exportToBmadStory(COMPLETE_SESSION);
|
|
264
|
-
assert.strictEqual(result.success, true);
|
|
265
|
-
// Each file should be on a line starting with "- "
|
|
266
|
-
assert.ok(result.markdown?.includes('- packages/cyclist/scripts/cyclist-doctor.sh'), 'Files should be bullet points');
|
|
267
|
-
});
|
|
268
|
-
it('should omit File List section when not provided', () => {
|
|
269
|
-
const result = exportToBmadStory(MINIMAL_SESSION);
|
|
270
|
-
assert.strictEqual(result.success, true);
|
|
271
|
-
const lines = result.markdown?.split('\n') || [];
|
|
272
|
-
const fileListHeaders = lines.filter(l => l.trim() === '## File List');
|
|
273
|
-
assert.strictEqual(fileListHeaders.length, 0, 'Should not include empty File List section');
|
|
274
|
-
});
|
|
275
|
-
it('should omit File List section when empty array', () => {
|
|
276
|
-
const sessionEmptyFiles = {
|
|
277
|
-
...MINIMAL_SESSION,
|
|
278
|
-
fileList: [],
|
|
279
|
-
};
|
|
280
|
-
const result = exportToBmadStory(sessionEmptyFiles);
|
|
281
|
-
assert.strictEqual(result.success, true);
|
|
282
|
-
const lines = result.markdown?.split('\n') || [];
|
|
283
|
-
const fileListHeaders = lines.filter(l => l.trim() === '## File List');
|
|
284
|
-
assert.strictEqual(fileListHeaders.length, 0, 'Should not include File List for empty array');
|
|
285
|
-
});
|
|
286
|
-
it('should preserve file paths with descriptions', () => {
|
|
287
|
-
const sessionWithDescriptions = {
|
|
288
|
-
...MINIMAL_SESSION,
|
|
289
|
-
fileList: [
|
|
290
|
-
'src/api/upload.ts - Created: Photo upload endpoint',
|
|
291
|
-
'src/utils/validation.ts - Modified: Added size check',
|
|
292
|
-
],
|
|
293
|
-
};
|
|
294
|
-
const result = exportToBmadStory(sessionWithDescriptions);
|
|
295
|
-
assert.strictEqual(result.success, true);
|
|
296
|
-
assert.ok(result.markdown?.includes('src/api/upload.ts - Created: Photo upload endpoint'), 'Should preserve file with description');
|
|
297
|
-
});
|
|
298
|
-
it('should handle files with special characters in path', () => {
|
|
299
|
-
const sessionSpecialPaths = {
|
|
300
|
-
...MINIMAL_SESSION,
|
|
301
|
-
fileList: [
|
|
302
|
-
'src/components/UserProfile.tsx',
|
|
303
|
-
'tests/__snapshots__/App.test.tsx.snap',
|
|
304
|
-
],
|
|
305
|
-
};
|
|
306
|
-
const result = exportToBmadStory(sessionSpecialPaths);
|
|
307
|
-
assert.strictEqual(result.success, true);
|
|
308
|
-
assert.ok(result.markdown?.includes('tests/__snapshots__/App.test.tsx.snap'), 'Should handle paths with special chars');
|
|
309
|
-
});
|
|
310
|
-
});
|
|
311
|
-
// ===========================================================================
|
|
312
|
-
// AC4: Marks completed tasks with [x]
|
|
313
|
-
// ===========================================================================
|
|
314
|
-
describe('AC4: Marks completed tasks with [x]', () => {
|
|
315
|
-
it('should include Tasks section when tasks provided', () => {
|
|
316
|
-
const result = exportToBmadStory(COMPLETE_SESSION);
|
|
317
|
-
assert.strictEqual(result.success, true);
|
|
318
|
-
assert.ok(result.markdown?.includes('## Tasks'), 'Should include Tasks section');
|
|
319
|
-
});
|
|
320
|
-
it('should mark completed tasks with [x]', () => {
|
|
321
|
-
const result = exportToBmadStory(COMPLETE_SESSION);
|
|
322
|
-
assert.strictEqual(result.success, true);
|
|
323
|
-
assert.ok(result.markdown?.includes('[x] Create cyclist-doctor.sh script'), 'Should mark completed task with [x]');
|
|
324
|
-
});
|
|
325
|
-
it('should mark incomplete tasks with [ ]', () => {
|
|
326
|
-
const sessionWithIncomplete = {
|
|
327
|
-
...MINIMAL_SESSION,
|
|
328
|
-
tasks: [
|
|
329
|
-
{ text: 'Completed task', completed: true },
|
|
330
|
-
{ text: 'Incomplete task', completed: false },
|
|
331
|
-
],
|
|
332
|
-
};
|
|
333
|
-
const result = exportToBmadStory(sessionWithIncomplete);
|
|
334
|
-
assert.strictEqual(result.success, true);
|
|
335
|
-
assert.ok(result.markdown?.includes('[x] Completed task'), 'Should mark completed with [x]');
|
|
336
|
-
assert.ok(result.markdown?.includes('[ ] Incomplete task'), 'Should mark incomplete with [ ]');
|
|
337
|
-
});
|
|
338
|
-
it('should include nested subtasks with proper indentation', () => {
|
|
339
|
-
const result = exportToBmadStory(COMPLETE_SESSION);
|
|
340
|
-
assert.strictEqual(result.success, true);
|
|
341
|
-
// Subtasks should be indented with 2 spaces
|
|
342
|
-
assert.ok(result.markdown?.includes(' - [x] Add system prereq checks'), 'Should include indented subtasks');
|
|
343
|
-
});
|
|
344
|
-
it('should preserve subtask completion state', () => {
|
|
345
|
-
const sessionMixedSubtasks = {
|
|
346
|
-
...MINIMAL_SESSION,
|
|
347
|
-
tasks: [
|
|
348
|
-
{
|
|
349
|
-
text: 'Parent task',
|
|
350
|
-
completed: false,
|
|
351
|
-
subtasks: [
|
|
352
|
-
{ text: 'Done subtask', completed: true },
|
|
353
|
-
{ text: 'Pending subtask', completed: false },
|
|
354
|
-
],
|
|
355
|
-
},
|
|
356
|
-
],
|
|
357
|
-
};
|
|
358
|
-
const result = exportToBmadStory(sessionMixedSubtasks);
|
|
359
|
-
assert.strictEqual(result.success, true);
|
|
360
|
-
assert.ok(result.markdown?.includes(' - [x] Done subtask'), 'Completed subtask should have [x]');
|
|
361
|
-
assert.ok(result.markdown?.includes(' - [ ] Pending subtask'), 'Incomplete subtask should have [ ]');
|
|
362
|
-
});
|
|
363
|
-
it('should omit Tasks section when not provided', () => {
|
|
364
|
-
const result = exportToBmadStory(MINIMAL_SESSION);
|
|
365
|
-
assert.strictEqual(result.success, true);
|
|
366
|
-
const lines = result.markdown?.split('\n') || [];
|
|
367
|
-
const taskHeaders = lines.filter(l => l.trim().startsWith('## Tasks'));
|
|
368
|
-
assert.strictEqual(taskHeaders.length, 0, 'Should not include empty Tasks section');
|
|
369
|
-
});
|
|
370
|
-
it('should omit Tasks section when empty array', () => {
|
|
371
|
-
const sessionEmptyTasks = {
|
|
372
|
-
...MINIMAL_SESSION,
|
|
373
|
-
tasks: [],
|
|
374
|
-
};
|
|
375
|
-
const result = exportToBmadStory(sessionEmptyTasks);
|
|
376
|
-
assert.strictEqual(result.success, true);
|
|
377
|
-
const lines = result.markdown?.split('\n') || [];
|
|
378
|
-
const taskHeaders = lines.filter(l => l.trim().startsWith('## Tasks'));
|
|
379
|
-
assert.strictEqual(taskHeaders.length, 0, 'Should not include Tasks for empty array');
|
|
380
|
-
});
|
|
381
|
-
it('should preserve task text with special characters', () => {
|
|
382
|
-
const sessionSpecialTasks = {
|
|
383
|
-
...MINIMAL_SESSION,
|
|
384
|
-
tasks: [
|
|
385
|
-
{ text: 'Add `--fix` flag support', completed: true },
|
|
386
|
-
{ text: 'Handle "quoted" strings', completed: false },
|
|
387
|
-
],
|
|
388
|
-
};
|
|
389
|
-
const result = exportToBmadStory(sessionSpecialTasks);
|
|
390
|
-
assert.strictEqual(result.success, true);
|
|
391
|
-
assert.ok(result.markdown?.includes('[x] Add `--fix` flag support'), 'Should preserve backticks');
|
|
392
|
-
assert.ok(result.markdown?.includes('[ ] Handle "quoted" strings'), 'Should preserve quotes');
|
|
393
|
-
});
|
|
394
|
-
it('should round-trip task completion state through parser', () => {
|
|
395
|
-
const exportResult = exportToBmadStory(COMPLETE_SESSION);
|
|
396
|
-
assert.strictEqual(exportResult.success, true);
|
|
397
|
-
const parseResult = parseBmadStory(exportResult.markdown);
|
|
398
|
-
assert.strictEqual(parseResult.success, true);
|
|
399
|
-
// First task should be completed
|
|
400
|
-
assert.strictEqual(parseResult.story?.tasks[0]?.completed, true, 'First task should be completed after round-trip');
|
|
401
|
-
// First task should have subtasks
|
|
402
|
-
assert.ok(parseResult.story?.tasks[0]?.subtasks?.length === 3, 'Should preserve subtask count');
|
|
403
|
-
});
|
|
404
|
-
});
|
|
405
|
-
// ===========================================================================
|
|
406
|
-
// AC5: Sets appropriate status (review/done)
|
|
407
|
-
// ===========================================================================
|
|
408
|
-
describe('AC5: Sets appropriate status (review/done)', () => {
|
|
409
|
-
it('should map done status to BMAD done', () => {
|
|
410
|
-
const result = exportToBmadStory(COMPLETE_SESSION);
|
|
411
|
-
assert.strictEqual(result.success, true);
|
|
412
|
-
assert.ok(result.markdown?.includes('## Status\ndone') ||
|
|
413
|
-
result.markdown?.includes('## Status\r\ndone'), 'Should output done status');
|
|
414
|
-
// Verify via parser
|
|
415
|
-
const parseResult = parseBmadStory(result.markdown);
|
|
416
|
-
assert.strictEqual(parseResult.story?.status, 'done');
|
|
417
|
-
});
|
|
418
|
-
it('should map needs_review status to BMAD review', () => {
|
|
419
|
-
const result = exportToBmadStory(SESSION_IN_REVIEW);
|
|
420
|
-
assert.strictEqual(result.success, true);
|
|
421
|
-
const parseResult = parseBmadStory(result.markdown);
|
|
422
|
-
assert.strictEqual(parseResult.story?.status, 'review', 'needs_review should map to review');
|
|
423
|
-
});
|
|
424
|
-
it('should map in_progress status to BMAD in-progress', () => {
|
|
425
|
-
const result = exportToBmadStory(SESSION_IN_PROGRESS);
|
|
426
|
-
assert.strictEqual(result.success, true);
|
|
427
|
-
const parseResult = parseBmadStory(result.markdown);
|
|
428
|
-
assert.strictEqual(parseResult.story?.status, 'in-progress', 'in_progress should map to in-progress');
|
|
429
|
-
});
|
|
430
|
-
it('should map backlog status to BMAD ready-for-dev', () => {
|
|
431
|
-
const result = exportToBmadStory(SESSION_BACKLOG);
|
|
432
|
-
assert.strictEqual(result.success, true);
|
|
433
|
-
const parseResult = parseBmadStory(result.markdown);
|
|
434
|
-
assert.strictEqual(parseResult.story?.status, 'ready-for-dev', 'backlog should map to ready-for-dev');
|
|
435
|
-
});
|
|
436
|
-
it('should handle approved status as review', () => {
|
|
437
|
-
const sessionApproved = {
|
|
438
|
-
...MINIMAL_SESSION,
|
|
439
|
-
status: 'approved',
|
|
440
|
-
};
|
|
441
|
-
const result = exportToBmadStory(sessionApproved);
|
|
442
|
-
assert.strictEqual(result.success, true);
|
|
443
|
-
const parseResult = parseBmadStory(result.markdown);
|
|
444
|
-
// approved maps to review (awaiting merge)
|
|
445
|
-
assert.strictEqual(parseResult.story?.status, 'review', 'approved should map to review');
|
|
446
|
-
});
|
|
447
|
-
it('should reject invalid status values', () => {
|
|
448
|
-
const sessionBadStatus = {
|
|
449
|
-
...MINIMAL_SESSION,
|
|
450
|
-
status: 'invalid_status',
|
|
451
|
-
};
|
|
452
|
-
const result = exportToBmadStory(sessionBadStatus);
|
|
453
|
-
assert.strictEqual(result.success, false, 'Should fail for invalid status');
|
|
454
|
-
assert.ok(result.errors?.some(e => e.field === 'status'), 'Should report status error');
|
|
455
|
-
});
|
|
456
|
-
it('should handle status case-insensitively', () => {
|
|
457
|
-
const sessionUppercase = {
|
|
458
|
-
...MINIMAL_SESSION,
|
|
459
|
-
status: 'DONE',
|
|
460
|
-
};
|
|
461
|
-
const result = exportToBmadStory(sessionUppercase);
|
|
462
|
-
// Should normalize and succeed
|
|
463
|
-
assert.strictEqual(result.success, true);
|
|
464
|
-
const parseResult = parseBmadStory(result.markdown);
|
|
465
|
-
assert.strictEqual(parseResult.story?.status, 'done');
|
|
466
|
-
});
|
|
467
|
-
});
|
|
468
|
-
// ===========================================================================
|
|
469
|
-
// Edge cases and error handling
|
|
470
|
-
// ===========================================================================
|
|
471
|
-
describe('Edge cases and error handling', () => {
|
|
472
|
-
it('should handle special characters in title', () => {
|
|
473
|
-
const sessionSpecialTitle = {
|
|
474
|
-
...MINIMAL_SESSION,
|
|
475
|
-
title: 'Feature: OAuth 2.0 (with PKCE)',
|
|
476
|
-
};
|
|
477
|
-
const result = exportToBmadStory(sessionSpecialTitle);
|
|
478
|
-
assert.strictEqual(result.success, true);
|
|
479
|
-
assert.ok(result.markdown?.includes('# Story: Feature: OAuth 2.0 (with PKCE)'), 'Should preserve special characters in title');
|
|
480
|
-
});
|
|
481
|
-
it('should handle multiline user story', () => {
|
|
482
|
-
const sessionMultiline = {
|
|
483
|
-
...MINIMAL_SESSION,
|
|
484
|
-
userStory: `As a product manager,
|
|
485
|
-
I want to track feature requests,
|
|
486
|
-
so that I can prioritize development effectively`,
|
|
487
|
-
};
|
|
488
|
-
const result = exportToBmadStory(sessionMultiline);
|
|
489
|
-
assert.strictEqual(result.success, true);
|
|
490
|
-
assert.ok(result.markdown?.includes('product manager'), 'Should include multiline user story');
|
|
491
|
-
});
|
|
492
|
-
it('should handle empty optional string fields', () => {
|
|
493
|
-
const sessionEmptyStrings = {
|
|
494
|
-
...MINIMAL_SESSION,
|
|
495
|
-
devNotes: '',
|
|
496
|
-
devAgentRecord: '',
|
|
497
|
-
};
|
|
498
|
-
const result = exportToBmadStory(sessionEmptyStrings);
|
|
499
|
-
assert.strictEqual(result.success, true);
|
|
500
|
-
// Empty strings should be treated same as undefined - omit sections
|
|
501
|
-
const lines = result.markdown?.split('\n') || [];
|
|
502
|
-
const devNotesHeaders = lines.filter(l => l.trim() === '## Dev Notes');
|
|
503
|
-
assert.strictEqual(devNotesHeaders.length, 0, 'Should not include empty Dev Notes section');
|
|
504
|
-
});
|
|
505
|
-
it('should handle acceptance criteria with BDD format', () => {
|
|
506
|
-
const sessionBDD = {
|
|
507
|
-
...MINIMAL_SESSION,
|
|
508
|
-
acceptanceCriteria: [
|
|
509
|
-
{
|
|
510
|
-
text: 'Given valid credentials, When I login, Then I see the dashboard',
|
|
511
|
-
completed: true,
|
|
512
|
-
},
|
|
513
|
-
],
|
|
514
|
-
};
|
|
515
|
-
const result = exportToBmadStory(sessionBDD);
|
|
516
|
-
assert.strictEqual(result.success, true);
|
|
517
|
-
assert.ok(result.markdown?.includes('Given valid credentials'), 'Should preserve BDD format');
|
|
518
|
-
});
|
|
519
|
-
it('should handle acceptance criteria with inline code', () => {
|
|
520
|
-
const sessionCode = {
|
|
521
|
-
...MINIMAL_SESSION,
|
|
522
|
-
acceptanceCriteria: [
|
|
523
|
-
{ text: 'Function `getUser()` returns user object', completed: true },
|
|
524
|
-
],
|
|
525
|
-
};
|
|
526
|
-
const result = exportToBmadStory(sessionCode);
|
|
527
|
-
assert.strictEqual(result.success, true);
|
|
528
|
-
assert.ok(result.markdown?.includes('`getUser()`'), 'Should preserve inline code');
|
|
529
|
-
});
|
|
530
|
-
it('should produce consistent output for same input', () => {
|
|
531
|
-
const result1 = exportToBmadStory(COMPLETE_SESSION);
|
|
532
|
-
const result2 = exportToBmadStory(COMPLETE_SESSION);
|
|
533
|
-
assert.strictEqual(result1.success, true);
|
|
534
|
-
assert.strictEqual(result2.success, true);
|
|
535
|
-
assert.strictEqual(result1.markdown, result2.markdown, 'Same input should produce identical output');
|
|
536
|
-
});
|
|
537
|
-
it('should handle very long file lists', () => {
|
|
538
|
-
const manyFiles = Array.from({ length: 50 }, (_, i) => `src/file${i}.ts`);
|
|
539
|
-
const sessionManyFiles = {
|
|
540
|
-
...MINIMAL_SESSION,
|
|
541
|
-
fileList: manyFiles,
|
|
542
|
-
};
|
|
543
|
-
const result = exportToBmadStory(sessionManyFiles);
|
|
544
|
-
assert.strictEqual(result.success, true);
|
|
545
|
-
assert.ok(result.markdown?.includes('src/file49.ts'), 'Should include all files');
|
|
546
|
-
});
|
|
547
|
-
it('should handle deeply nested subtasks', () => {
|
|
548
|
-
const sessionDeepNesting = {
|
|
549
|
-
...MINIMAL_SESSION,
|
|
550
|
-
tasks: [
|
|
551
|
-
{
|
|
552
|
-
text: 'Top level',
|
|
553
|
-
completed: false,
|
|
554
|
-
subtasks: [
|
|
555
|
-
{
|
|
556
|
-
text: 'Level 1',
|
|
557
|
-
completed: true,
|
|
558
|
-
subtasks: [
|
|
559
|
-
{ text: 'Level 2', completed: false },
|
|
560
|
-
],
|
|
561
|
-
},
|
|
562
|
-
],
|
|
563
|
-
},
|
|
564
|
-
],
|
|
565
|
-
};
|
|
566
|
-
const result = exportToBmadStory(sessionDeepNesting);
|
|
567
|
-
assert.strictEqual(result.success, true);
|
|
568
|
-
// Should at least include top level and first level subtasks
|
|
569
|
-
assert.ok(result.markdown?.includes('[ ] Top level'), 'Should include top level');
|
|
570
|
-
assert.ok(result.markdown?.includes('[x] Level 1'), 'Should include first level subtask');
|
|
571
|
-
});
|
|
572
|
-
});
|
|
573
|
-
// ===========================================================================
|
|
574
|
-
// Export options
|
|
575
|
-
// ===========================================================================
|
|
576
|
-
describe('Export options', () => {
|
|
577
|
-
it('should accept optional export options', () => {
|
|
578
|
-
const options = {
|
|
579
|
-
includeEmptySections: true,
|
|
580
|
-
};
|
|
581
|
-
const result = exportToBmadStory(MINIMAL_SESSION, options);
|
|
582
|
-
assert.strictEqual(result.success, true);
|
|
583
|
-
});
|
|
584
|
-
it('should include empty sections when includeEmptySections is true', () => {
|
|
585
|
-
const options = {
|
|
586
|
-
includeEmptySections: true,
|
|
587
|
-
};
|
|
588
|
-
const result = exportToBmadStory(MINIMAL_SESSION, options);
|
|
589
|
-
assert.strictEqual(result.success, true);
|
|
590
|
-
// Should include optional sections even when empty
|
|
591
|
-
assert.ok(result.markdown?.includes('## Dev Notes'), 'Should include empty Dev Notes with option');
|
|
592
|
-
});
|
|
593
|
-
it('should default to excluding empty sections', () => {
|
|
594
|
-
const result = exportToBmadStory(MINIMAL_SESSION);
|
|
595
|
-
assert.strictEqual(result.success, true);
|
|
596
|
-
// Default behavior: no empty sections
|
|
597
|
-
const lines = result.markdown?.split('\n') || [];
|
|
598
|
-
const devNotesHeaders = lines.filter(l => l.trim() === '## Dev Notes');
|
|
599
|
-
assert.strictEqual(devNotesHeaders.length, 0, 'Default should exclude empty sections');
|
|
600
|
-
});
|
|
601
|
-
});
|
|
602
|
-
});
|
|
603
|
-
//# sourceMappingURL=story-exporter.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"story-exporter.test.js","sourceRoot":"","sources":["../../src/bmad/story-exporter.test.ts"],"names":[],"mappings":"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"}
|