@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,151 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Story 11-2: pnpm Workspace Structure Tests
|
|
3
|
-
*
|
|
4
|
-
* These tests verify the monorepo workspace structure is correctly configured.
|
|
5
|
-
* Tests are designed to FAIL until the workspace conversion is complete.
|
|
6
|
-
*/
|
|
7
|
-
import { describe, it } from 'node:test';
|
|
8
|
-
import assert from 'node:assert';
|
|
9
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
10
|
-
import { join, dirname } from 'node:path';
|
|
11
|
-
import { fileURLToPath } from 'node:url';
|
|
12
|
-
import { parse as parseYaml } from 'yaml';
|
|
13
|
-
import { execSync } from 'node:child_process';
|
|
14
|
-
import { findMonorepoRoot } from './utils/files.js';
|
|
15
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
-
const __dirname = dirname(__filename);
|
|
17
|
-
// Use shared utility to find monorepo root
|
|
18
|
-
const PROJECT_ROOT = findMonorepoRoot(__dirname);
|
|
19
|
-
describe('Story 11-2: pnpm Workspace Structure', () => {
|
|
20
|
-
describe('AC1: packages/core/src/ contains former src/', () => {
|
|
21
|
-
it('should have packages/core directory', () => {
|
|
22
|
-
const coreDir = join(PROJECT_ROOT, 'packages', 'core');
|
|
23
|
-
assert.ok(existsSync(coreDir), 'packages/core/ directory must exist');
|
|
24
|
-
});
|
|
25
|
-
it('should have packages/core/src directory', () => {
|
|
26
|
-
const coreSrcDir = join(PROJECT_ROOT, 'packages', 'core', 'src');
|
|
27
|
-
assert.ok(existsSync(coreSrcDir), 'packages/core/src/ directory must exist');
|
|
28
|
-
});
|
|
29
|
-
it('should have CLI commands in packages/core/src/cli', () => {
|
|
30
|
-
const cliDir = join(PROJECT_ROOT, 'packages', 'core', 'src', 'cli');
|
|
31
|
-
assert.ok(existsSync(cliDir), 'packages/core/src/cli/ directory must exist');
|
|
32
|
-
});
|
|
33
|
-
it('should have packages/core/bin/pennyfarthing.js', () => {
|
|
34
|
-
const binFile = join(PROJECT_ROOT, 'packages', 'core', 'bin', 'pennyfarthing.js');
|
|
35
|
-
assert.ok(existsSync(binFile), 'packages/core/bin/pennyfarthing.js must exist');
|
|
36
|
-
});
|
|
37
|
-
it('should have packages/core/package.json', () => {
|
|
38
|
-
const packageJson = join(PROJECT_ROOT, 'packages', 'core', 'package.json');
|
|
39
|
-
assert.ok(existsSync(packageJson), 'packages/core/package.json must exist');
|
|
40
|
-
});
|
|
41
|
-
it('should have @pennyfarthing/core as package name', () => {
|
|
42
|
-
const packageJsonPath = join(PROJECT_ROOT, 'packages', 'core', 'package.json');
|
|
43
|
-
if (!existsSync(packageJsonPath)) {
|
|
44
|
-
assert.fail('packages/core/package.json must exist first');
|
|
45
|
-
}
|
|
46
|
-
const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
47
|
-
assert.strictEqual(pkg.name, '@pennyfarthing/core', 'Package name must be @pennyfarthing/core');
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
describe('AC2: pnpm-workspace.yaml defines packages/*', () => {
|
|
51
|
-
it('should have pnpm-workspace.yaml at project root', () => {
|
|
52
|
-
const workspaceYaml = join(PROJECT_ROOT, 'pnpm-workspace.yaml');
|
|
53
|
-
assert.ok(existsSync(workspaceYaml), 'pnpm-workspace.yaml must exist at project root');
|
|
54
|
-
});
|
|
55
|
-
it('should define packages/* in workspace', () => {
|
|
56
|
-
const workspaceYamlPath = join(PROJECT_ROOT, 'pnpm-workspace.yaml');
|
|
57
|
-
if (!existsSync(workspaceYamlPath)) {
|
|
58
|
-
assert.fail('pnpm-workspace.yaml must exist first');
|
|
59
|
-
}
|
|
60
|
-
const content = readFileSync(workspaceYamlPath, 'utf-8');
|
|
61
|
-
const workspace = parseYaml(content);
|
|
62
|
-
assert.ok(workspace.packages, 'workspace.packages must be defined');
|
|
63
|
-
assert.ok(workspace.packages.some((p) => p.includes('packages')), 'workspace.packages must include packages/* or similar');
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
describe('AC3: pnpm install works from root', () => {
|
|
67
|
-
it('should have pnpm-lock.yaml after install', () => {
|
|
68
|
-
// This test assumes pnpm install has been run
|
|
69
|
-
// The presence of pnpm-lock.yaml indicates pnpm is the package manager
|
|
70
|
-
const lockFile = join(PROJECT_ROOT, 'pnpm-lock.yaml');
|
|
71
|
-
assert.ok(existsSync(lockFile), 'pnpm-lock.yaml must exist (run pnpm install first)');
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
describe('AC4: pnpm build compiles all packages', () => {
|
|
75
|
-
it('should have tsconfig.base.json for shared config', () => {
|
|
76
|
-
const tsconfigBase = join(PROJECT_ROOT, 'tsconfig.base.json');
|
|
77
|
-
assert.ok(existsSync(tsconfigBase), 'tsconfig.base.json must exist at project root');
|
|
78
|
-
});
|
|
79
|
-
it('should have packages/core/tsconfig.json', () => {
|
|
80
|
-
const tsconfig = join(PROJECT_ROOT, 'packages', 'core', 'tsconfig.json');
|
|
81
|
-
assert.ok(existsSync(tsconfig), 'packages/core/tsconfig.json must exist');
|
|
82
|
-
});
|
|
83
|
-
it('should have packages/core/dist after build', () => {
|
|
84
|
-
// This test assumes build has been run
|
|
85
|
-
const distDir = join(PROJECT_ROOT, 'packages', 'core', 'dist');
|
|
86
|
-
assert.ok(existsSync(distDir), 'packages/core/dist/ must exist (run pnpm build first)');
|
|
87
|
-
});
|
|
88
|
-
it('should have packages/shared/dist after build', () => {
|
|
89
|
-
// packages/shared already exists from Story 11-1
|
|
90
|
-
const distDir = join(PROJECT_ROOT, 'packages', 'shared', 'dist');
|
|
91
|
-
assert.ok(existsSync(distDir), 'packages/shared/dist/ must exist (run pnpm build first)');
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
describe('AC5: pennyfarthing CLI still functional', () => {
|
|
95
|
-
it('should have bin entry in packages/core/package.json', () => {
|
|
96
|
-
const packageJsonPath = join(PROJECT_ROOT, 'packages', 'core', 'package.json');
|
|
97
|
-
if (!existsSync(packageJsonPath)) {
|
|
98
|
-
assert.fail('packages/core/package.json must exist first');
|
|
99
|
-
}
|
|
100
|
-
const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
101
|
-
assert.ok(pkg.bin, 'packages/core/package.json must have bin field');
|
|
102
|
-
assert.ok(pkg.bin.pennyfarthing || pkg.bin === './bin/pennyfarthing.js', 'bin must include pennyfarthing entry');
|
|
103
|
-
});
|
|
104
|
-
it('should execute pennyfarthing --version without error', () => {
|
|
105
|
-
// This test runs the actual CLI
|
|
106
|
-
// After workspace conversion, we need to test from packages/core
|
|
107
|
-
try {
|
|
108
|
-
const binPath = join(PROJECT_ROOT, 'packages', 'core', 'bin', 'pennyfarthing.js');
|
|
109
|
-
if (!existsSync(binPath)) {
|
|
110
|
-
assert.fail('packages/core/bin/pennyfarthing.js must exist first');
|
|
111
|
-
}
|
|
112
|
-
const result = execSync(`node "${binPath}" --version`, {
|
|
113
|
-
encoding: 'utf-8',
|
|
114
|
-
timeout: 10000,
|
|
115
|
-
});
|
|
116
|
-
assert.ok(result.includes('.'), 'Version output should contain a version number');
|
|
117
|
-
}
|
|
118
|
-
catch (error) {
|
|
119
|
-
assert.fail(`CLI execution failed: ${error.message}`);
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
describe('AC6: Existing tests pass', () => {
|
|
124
|
-
it('should have test files in packages/core/src', () => {
|
|
125
|
-
// After move, test files should be in packages/core/src
|
|
126
|
-
const testPattern = join(PROJECT_ROOT, 'packages', 'core', 'src');
|
|
127
|
-
assert.ok(existsSync(testPattern), 'packages/core/src/ must exist for tests to be found');
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
describe('Workspace Dependencies', () => {
|
|
131
|
-
it('should have @pennyfarthing/shared in packages/core dependencies', () => {
|
|
132
|
-
const packageJsonPath = join(PROJECT_ROOT, 'packages', 'core', 'package.json');
|
|
133
|
-
if (!existsSync(packageJsonPath)) {
|
|
134
|
-
assert.fail('packages/core/package.json must exist first');
|
|
135
|
-
}
|
|
136
|
-
const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
137
|
-
const deps = pkg.dependencies || {};
|
|
138
|
-
assert.ok(deps['@pennyfarthing/shared'], 'packages/core should depend on @pennyfarthing/shared');
|
|
139
|
-
assert.ok(deps['@pennyfarthing/shared'].includes('workspace'), 'Dependency should use workspace protocol (workspace:*)');
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
describe('Root package.json', () => {
|
|
143
|
-
it('should be a workspace root (has workspaces config or pnpm-workspace.yaml)', () => {
|
|
144
|
-
// In pnpm workspaces, root can have dependencies for npm publishing
|
|
145
|
-
// The key indicator is pnpm-workspace.yaml existence, not package.json structure
|
|
146
|
-
const workspaceYamlPath = join(PROJECT_ROOT, 'pnpm-workspace.yaml');
|
|
147
|
-
assert.ok(existsSync(workspaceYamlPath), 'Root should have pnpm-workspace.yaml (workspace root indicator)');
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
//# sourceMappingURL=workspace.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.test.js","sourceRoot":"","sources":["../../src/cli/workspace.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,KAAK,QAAQ,EACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,yBAAyB,EACzB,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,SAAS,EACd,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,EAC1B,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,cAAc,GACpB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAEL,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAE7B,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EAExB,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,aAAa,EAElB,wBAAwB,EACxB,KAAK,6BAA6B,GACnC,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,4CAA4C;AAE5C,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,mBAAmB,EAEpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAE9B,2CAA2C;AAC3C,OAAO,EACL,yBAAyB,EACzB,WAAW,EAMX,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAEhC,uCAAuC;AACvC,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,GAY3B,MAAM,kCAAkC,CAAC;AAE1C,0DAA0D;AAC1D,OAAO;AACL,oBAAoB;AACpB,gBAAgB;AAOhB,mBAAmB;AACnB,gBAAgB,EAChB,oBAAoB;AAGpB,4BAA4B;AAC5B,oBAAoB;AAGpB,0CAA0C;AAC1C,wBAAwB,GAEzB,MAAM,qBAAqB,CAAC"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* jira-epic-creation.ts - Jira Epic Auto-Creation for Story 47-1
|
|
3
|
-
*
|
|
4
|
-
* This module provides functions to automatically create Jira epics
|
|
5
|
-
* when SM setup detects an epic without a jira field in sprint YAML.
|
|
6
|
-
*
|
|
7
|
-
* Acceptance Criteria:
|
|
8
|
-
* 1. SM setup detects new epic without jira field
|
|
9
|
-
* 2. Automatically creates Jira epic with matching title/description
|
|
10
|
-
* 3. Updates sprint YAML with new Jira key
|
|
11
|
-
* 4. Epic number derived from Jira ticket number
|
|
12
|
-
*
|
|
13
|
-
* NOTE: This is a stub implementation. Dev will fill in the actual logic.
|
|
14
|
-
*/
|
|
15
|
-
export interface CreateEpicParams {
|
|
16
|
-
title: string;
|
|
17
|
-
description?: string;
|
|
18
|
-
epicNumber?: number;
|
|
19
|
-
labels?: string[];
|
|
20
|
-
dryRun?: boolean;
|
|
21
|
-
_mockResponse?: {
|
|
22
|
-
key: string;
|
|
23
|
-
url?: string;
|
|
24
|
-
};
|
|
25
|
-
_mockError?: string;
|
|
26
|
-
}
|
|
27
|
-
export interface CreateEpicResult {
|
|
28
|
-
success: boolean;
|
|
29
|
-
jiraKey?: string;
|
|
30
|
-
url?: string;
|
|
31
|
-
formattedTitle?: string;
|
|
32
|
-
labels?: string[];
|
|
33
|
-
error?: string;
|
|
34
|
-
dryRun?: boolean;
|
|
35
|
-
}
|
|
36
|
-
export interface EnsureEpicParams {
|
|
37
|
-
epic: {
|
|
38
|
-
id: string;
|
|
39
|
-
title: string;
|
|
40
|
-
description?: string;
|
|
41
|
-
jira?: string | null;
|
|
42
|
-
};
|
|
43
|
-
_mockResponse?: {
|
|
44
|
-
key: string;
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
export interface EnsureEpicResult {
|
|
48
|
-
success: boolean;
|
|
49
|
-
jiraKey?: string;
|
|
50
|
-
created: boolean;
|
|
51
|
-
formattedTitle?: string;
|
|
52
|
-
description?: string;
|
|
53
|
-
error?: string;
|
|
54
|
-
}
|
|
55
|
-
export interface UpdateYamlParams {
|
|
56
|
-
sprintPath: string;
|
|
57
|
-
epicId: string;
|
|
58
|
-
jiraKey: string;
|
|
59
|
-
force?: boolean;
|
|
60
|
-
}
|
|
61
|
-
export interface UpdateYamlResult {
|
|
62
|
-
success: boolean;
|
|
63
|
-
error?: string;
|
|
64
|
-
}
|
|
65
|
-
export interface CheckEpicJiraParams {
|
|
66
|
-
storyId: string;
|
|
67
|
-
sprintPath: string;
|
|
68
|
-
}
|
|
69
|
-
export interface CheckEpicJiraResult {
|
|
70
|
-
epicNeedsJira: boolean;
|
|
71
|
-
epicId?: string;
|
|
72
|
-
epicTitle?: string;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Create an epic in Jira with the given title and description.
|
|
76
|
-
*
|
|
77
|
-
* @param params - Epic creation parameters
|
|
78
|
-
* @returns Result with Jira key on success
|
|
79
|
-
*/
|
|
80
|
-
export declare function createEpicInJira(params: CreateEpicParams): Promise<CreateEpicResult>;
|
|
81
|
-
/**
|
|
82
|
-
* Ensure an epic has a Jira key, creating one if missing.
|
|
83
|
-
*
|
|
84
|
-
* @param params - Epic to check/create
|
|
85
|
-
* @returns Result with Jira key (existing or newly created)
|
|
86
|
-
*/
|
|
87
|
-
export declare function ensureEpicHasJiraKey(params: EnsureEpicParams): Promise<EnsureEpicResult>;
|
|
88
|
-
/**
|
|
89
|
-
* Extract the numeric portion from a Jira key.
|
|
90
|
-
*
|
|
91
|
-
* @param jiraKey - Jira key like "MSSCI-11796"
|
|
92
|
-
* @returns Numeric portion (11796) or null if invalid
|
|
93
|
-
*/
|
|
94
|
-
export declare function extractEpicNumberFromJiraKey(jiraKey: string): number | null;
|
|
95
|
-
/**
|
|
96
|
-
* Update sprint YAML to add/update the jira field for an epic.
|
|
97
|
-
*
|
|
98
|
-
* @param params - Update parameters
|
|
99
|
-
* @returns Success/failure result
|
|
100
|
-
*/
|
|
101
|
-
export declare function updateSprintYamlWithJiraKey(params: UpdateYamlParams): Promise<UpdateYamlResult>;
|
|
102
|
-
/**
|
|
103
|
-
* Check if an epic needs a Jira key during story setup.
|
|
104
|
-
*
|
|
105
|
-
* @param params - Story and sprint path
|
|
106
|
-
* @returns Whether epic needs Jira key and epic details
|
|
107
|
-
*/
|
|
108
|
-
export declare function checkEpicJiraRequired(params: CheckEpicJiraParams): Promise<CheckEpicJiraResult>;
|
|
109
|
-
//# sourceMappingURL=jira-epic-creation.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jira-epic-creation.d.ts","sourceRoot":"","sources":["../../src/jira/jira-epic-creation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,aAAa,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACtB,CAAC;IACF,aAAa,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAyF1F;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2C9F;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe3E;AAED;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwDrG;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAmCrG"}
|
|
@@ -1,253 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* jira-epic-creation.ts - Jira Epic Auto-Creation for Story 47-1
|
|
3
|
-
*
|
|
4
|
-
* This module provides functions to automatically create Jira epics
|
|
5
|
-
* when SM setup detects an epic without a jira field in sprint YAML.
|
|
6
|
-
*
|
|
7
|
-
* Acceptance Criteria:
|
|
8
|
-
* 1. SM setup detects new epic without jira field
|
|
9
|
-
* 2. Automatically creates Jira epic with matching title/description
|
|
10
|
-
* 3. Updates sprint YAML with new Jira key
|
|
11
|
-
* 4. Epic number derived from Jira ticket number
|
|
12
|
-
*
|
|
13
|
-
* NOTE: This is a stub implementation. Dev will fill in the actual logic.
|
|
14
|
-
*/
|
|
15
|
-
/**
|
|
16
|
-
* Create an epic in Jira with the given title and description.
|
|
17
|
-
*
|
|
18
|
-
* @param params - Epic creation parameters
|
|
19
|
-
* @returns Result with Jira key on success
|
|
20
|
-
*/
|
|
21
|
-
export async function createEpicInJira(params) {
|
|
22
|
-
const { title, description, epicNumber, labels = ['pennyfarthing'], dryRun, _mockResponse, _mockError } = params;
|
|
23
|
-
// Format title with epic number if provided
|
|
24
|
-
const formattedTitle = epicNumber ? `Epic ${epicNumber}: ${title}` : title;
|
|
25
|
-
// Ensure pennyfarthing label is always included
|
|
26
|
-
const finalLabels = labels.includes('pennyfarthing') ? labels : ['pennyfarthing', ...labels];
|
|
27
|
-
// Handle mock error for testing
|
|
28
|
-
if (_mockError) {
|
|
29
|
-
return {
|
|
30
|
-
success: false,
|
|
31
|
-
error: _mockError,
|
|
32
|
-
formattedTitle,
|
|
33
|
-
labels: finalLabels
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
// Handle dry-run mode
|
|
37
|
-
if (dryRun) {
|
|
38
|
-
return {
|
|
39
|
-
success: true,
|
|
40
|
-
dryRun: true,
|
|
41
|
-
formattedTitle,
|
|
42
|
-
labels: finalLabels
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
// Handle mock response for testing
|
|
46
|
-
if (_mockResponse) {
|
|
47
|
-
return {
|
|
48
|
-
success: true,
|
|
49
|
-
jiraKey: _mockResponse.key,
|
|
50
|
-
url: _mockResponse.url,
|
|
51
|
-
formattedTitle,
|
|
52
|
-
labels: finalLabels
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
// Real Jira CLI invocation
|
|
56
|
-
try {
|
|
57
|
-
const { execFileSync } = await import('node:child_process');
|
|
58
|
-
// Build the jira CLI args as array to prevent command injection
|
|
59
|
-
const args = [
|
|
60
|
-
'issue', 'create',
|
|
61
|
-
'--project', 'MSSCI',
|
|
62
|
-
'--type', 'Epic',
|
|
63
|
-
'-s', formattedTitle,
|
|
64
|
-
'-b', description || '',
|
|
65
|
-
'-y', 'Medium',
|
|
66
|
-
'--no-input'
|
|
67
|
-
];
|
|
68
|
-
// Add label args (each -l with its value as separate args)
|
|
69
|
-
for (const label of finalLabels) {
|
|
70
|
-
args.push('-l', label);
|
|
71
|
-
}
|
|
72
|
-
const output = execFileSync('jira', args, { encoding: 'utf-8' });
|
|
73
|
-
// Parse the Jira key from output (format: "OK Issue MSSCI-12345 created")
|
|
74
|
-
const keyMatch = output.match(/([A-Z]+-\d+)/);
|
|
75
|
-
if (!keyMatch) {
|
|
76
|
-
return {
|
|
77
|
-
success: false,
|
|
78
|
-
error: `Could not parse Jira key from output: ${output}`,
|
|
79
|
-
formattedTitle,
|
|
80
|
-
labels: finalLabels
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
const jiraKey = keyMatch[1];
|
|
84
|
-
return {
|
|
85
|
-
success: true,
|
|
86
|
-
jiraKey,
|
|
87
|
-
url: `https://1898andco.atlassian.net/browse/${jiraKey}`,
|
|
88
|
-
formattedTitle,
|
|
89
|
-
labels: finalLabels
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
catch (error) {
|
|
93
|
-
return {
|
|
94
|
-
success: false,
|
|
95
|
-
error: error instanceof Error ? error.message : String(error),
|
|
96
|
-
formattedTitle,
|
|
97
|
-
labels: finalLabels
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Ensure an epic has a Jira key, creating one if missing.
|
|
103
|
-
*
|
|
104
|
-
* @param params - Epic to check/create
|
|
105
|
-
* @returns Result with Jira key (existing or newly created)
|
|
106
|
-
*/
|
|
107
|
-
export async function ensureEpicHasJiraKey(params) {
|
|
108
|
-
const { epic, _mockResponse } = params;
|
|
109
|
-
// Check if epic already has a valid jira key
|
|
110
|
-
if (epic.jira && epic.jira.trim() !== '') {
|
|
111
|
-
return {
|
|
112
|
-
success: true,
|
|
113
|
-
jiraKey: epic.jira,
|
|
114
|
-
created: false
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
// Extract epic number from ID (e.g., "epic-47" -> 47)
|
|
118
|
-
const epicNumberMatch = epic.id.match(/(\d+)/);
|
|
119
|
-
const epicNumber = epicNumberMatch ? parseInt(epicNumberMatch[1], 10) : undefined;
|
|
120
|
-
// Format the title with epic number
|
|
121
|
-
const formattedTitle = epicNumber ? `Epic ${epicNumber}: ${epic.title}` : epic.title;
|
|
122
|
-
// Create epic in Jira
|
|
123
|
-
const createResult = await createEpicInJira({
|
|
124
|
-
title: epic.title,
|
|
125
|
-
description: epic.description,
|
|
126
|
-
epicNumber,
|
|
127
|
-
labels: ['pennyfarthing'],
|
|
128
|
-
_mockResponse
|
|
129
|
-
});
|
|
130
|
-
if (!createResult.success) {
|
|
131
|
-
return {
|
|
132
|
-
success: false,
|
|
133
|
-
created: false,
|
|
134
|
-
error: createResult.error
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
return {
|
|
138
|
-
success: true,
|
|
139
|
-
jiraKey: createResult.jiraKey,
|
|
140
|
-
created: true,
|
|
141
|
-
formattedTitle,
|
|
142
|
-
description: epic.description
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Extract the numeric portion from a Jira key.
|
|
147
|
-
*
|
|
148
|
-
* @param jiraKey - Jira key like "MSSCI-11796"
|
|
149
|
-
* @returns Numeric portion (11796) or null if invalid
|
|
150
|
-
*/
|
|
151
|
-
export function extractEpicNumberFromJiraKey(jiraKey) {
|
|
152
|
-
if (!jiraKey || typeof jiraKey !== 'string') {
|
|
153
|
-
return null;
|
|
154
|
-
}
|
|
155
|
-
// Trim whitespace before matching to handle trailing newlines etc.
|
|
156
|
-
const trimmed = jiraKey.trim();
|
|
157
|
-
// Match pattern: PROJECT-NUMBER (e.g., MSSCI-11796, TEST-123)
|
|
158
|
-
const match = trimmed.match(/^[A-Z]+-(\d+)$/);
|
|
159
|
-
if (!match) {
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
return parseInt(match[1], 10);
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Update sprint YAML to add/update the jira field for an epic.
|
|
166
|
-
*
|
|
167
|
-
* @param params - Update parameters
|
|
168
|
-
* @returns Success/failure result
|
|
169
|
-
*/
|
|
170
|
-
export async function updateSprintYamlWithJiraKey(params) {
|
|
171
|
-
const { sprintPath, epicId, jiraKey, force } = params;
|
|
172
|
-
const { readFileSync, writeFileSync, renameSync } = await import('node:fs');
|
|
173
|
-
const { parse, stringify } = await import('yaml');
|
|
174
|
-
const { join, dirname } = await import('node:path');
|
|
175
|
-
try {
|
|
176
|
-
const content = readFileSync(sprintPath, 'utf-8');
|
|
177
|
-
const sprint = parse(content);
|
|
178
|
-
// Normalize epic ID for comparison (handle both "epic-47" and "47")
|
|
179
|
-
const normalizedEpicId = epicId.replace('epic-', '');
|
|
180
|
-
// Find the epic
|
|
181
|
-
let epicFound = false;
|
|
182
|
-
for (const epic of sprint.epics || []) {
|
|
183
|
-
const currentEpicId = String(epic.id).replace('epic-', '');
|
|
184
|
-
if (currentEpicId === normalizedEpicId) {
|
|
185
|
-
epicFound = true;
|
|
186
|
-
// Check if epic already has jira key
|
|
187
|
-
if (epic.jira && !force) {
|
|
188
|
-
return {
|
|
189
|
-
success: false,
|
|
190
|
-
error: `Epic ${epicId} already has jira key: ${epic.jira}`
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
// Add/update the jira field
|
|
194
|
-
epic.jira = jiraKey;
|
|
195
|
-
break;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
if (!epicFound) {
|
|
199
|
-
return {
|
|
200
|
-
success: false,
|
|
201
|
-
error: `Epic ${epicId} not found in sprint YAML`
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
// Atomic write: write to temp file, then rename
|
|
205
|
-
const updatedContent = stringify(sprint, { lineWidth: 0 });
|
|
206
|
-
const tempPath = join(dirname(sprintPath), `.sprint-yaml-${Date.now()}.tmp`);
|
|
207
|
-
writeFileSync(tempPath, updatedContent);
|
|
208
|
-
renameSync(tempPath, sprintPath);
|
|
209
|
-
return { success: true };
|
|
210
|
-
}
|
|
211
|
-
catch (error) {
|
|
212
|
-
return {
|
|
213
|
-
success: false,
|
|
214
|
-
error: error instanceof Error ? error.message : String(error)
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Check if an epic needs a Jira key during story setup.
|
|
220
|
-
*
|
|
221
|
-
* @param params - Story and sprint path
|
|
222
|
-
* @returns Whether epic needs Jira key and epic details
|
|
223
|
-
*/
|
|
224
|
-
export async function checkEpicJiraRequired(params) {
|
|
225
|
-
const { storyId, sprintPath } = params;
|
|
226
|
-
// Read and parse sprint YAML
|
|
227
|
-
const { readFileSync } = await import('node:fs');
|
|
228
|
-
const { parse } = await import('yaml');
|
|
229
|
-
const content = readFileSync(sprintPath, 'utf-8');
|
|
230
|
-
const sprint = parse(content);
|
|
231
|
-
// Extract epic number from story ID (e.g., "48-1" -> "48")
|
|
232
|
-
const epicNumber = storyId.split('-')[0];
|
|
233
|
-
// Find the epic containing this story
|
|
234
|
-
for (const epic of sprint.epics || []) {
|
|
235
|
-
const epicId = String(epic.id);
|
|
236
|
-
// Match "epic-48" or "48"
|
|
237
|
-
const epicNum = epicId.replace('epic-', '');
|
|
238
|
-
if (epicNum === epicNumber) {
|
|
239
|
-
// Check if epic has jira field
|
|
240
|
-
const hasJira = epic.jira && epic.jira.trim() !== '';
|
|
241
|
-
return {
|
|
242
|
-
epicNeedsJira: !hasJira,
|
|
243
|
-
epicId: epicId,
|
|
244
|
-
epicTitle: epic.title
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
// Epic not found - shouldn't happen but return safe default
|
|
249
|
-
return {
|
|
250
|
-
epicNeedsJira: false
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
//# sourceMappingURL=jira-epic-creation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jira-epic-creation.js","sourceRoot":"","sources":["../../src/jira/jira-epic-creation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for Story 47-1: Auto-create Jira epic on local epic creation
|
|
3
|
-
*
|
|
4
|
-
* These tests define the contract for automatically creating Jira epics
|
|
5
|
-
* when SM setup detects an epic without a jira field in sprint YAML.
|
|
6
|
-
*
|
|
7
|
-
* Acceptance Criteria:
|
|
8
|
-
* 1. SM setup detects new epic without jira field
|
|
9
|
-
* 2. Automatically creates Jira epic with matching title/description
|
|
10
|
-
* 3. Updates sprint YAML with new Jira key
|
|
11
|
-
* 4. Epic number derived from Jira ticket number
|
|
12
|
-
*
|
|
13
|
-
* Run with: npm test
|
|
14
|
-
*/
|
|
15
|
-
export {};
|
|
16
|
-
//# sourceMappingURL=jira-epic-creation.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jira-epic-creation.test.d.ts","sourceRoot":"","sources":["../../src/jira/jira-epic-creation.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|