@pennyfarthing/core 7.5.0 → 7.6.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/LICENSE +14 -0
- package/README.md +301 -0
- package/package.json +31 -36
- package/packages/core/dist/bmad/context-reader.d.ts +71 -0
- package/packages/core/dist/bmad/context-reader.d.ts.map +1 -0
- package/packages/core/dist/bmad/context-reader.js +369 -0
- package/packages/core/dist/bmad/context-reader.js.map +1 -0
- package/packages/core/dist/bmad/context-reader.test.d.ts +71 -0
- package/packages/core/dist/bmad/context-reader.test.d.ts.map +1 -0
- package/packages/core/dist/bmad/context-reader.test.js +878 -0
- package/packages/core/dist/bmad/context-reader.test.js.map +1 -0
- package/packages/core/dist/bmad/epics-parser.d.ts +61 -0
- package/packages/core/dist/bmad/epics-parser.d.ts.map +1 -0
- package/packages/core/dist/bmad/epics-parser.js +331 -0
- package/packages/core/dist/bmad/epics-parser.js.map +1 -0
- package/packages/core/dist/bmad/epics-parser.test.d.ts +7 -0
- package/packages/core/dist/bmad/epics-parser.test.d.ts.map +1 -0
- package/packages/core/dist/bmad/epics-parser.test.js +449 -0
- package/packages/core/dist/bmad/epics-parser.test.js.map +1 -0
- package/packages/core/dist/bmad/index.d.ts +11 -0
- package/packages/core/dist/bmad/index.d.ts.map +1 -0
- package/packages/core/dist/bmad/index.js +24 -0
- package/packages/core/dist/bmad/index.js.map +1 -0
- package/packages/core/dist/bmad/status-sync.d.ts +173 -0
- package/packages/core/dist/bmad/status-sync.d.ts.map +1 -0
- package/packages/core/dist/bmad/status-sync.js +463 -0
- package/packages/core/dist/bmad/status-sync.js.map +1 -0
- package/packages/core/dist/bmad/status-sync.test.d.ts +7 -0
- package/packages/core/dist/bmad/status-sync.test.d.ts.map +1 -0
- package/packages/core/dist/bmad/status-sync.test.js +702 -0
- package/packages/core/dist/bmad/status-sync.test.js.map +1 -0
- package/packages/core/dist/bmad/story-exporter.d.ts +55 -0
- package/packages/core/dist/bmad/story-exporter.d.ts.map +1 -0
- package/packages/core/dist/bmad/story-exporter.js +170 -0
- package/packages/core/dist/bmad/story-exporter.js.map +1 -0
- package/packages/core/dist/bmad/story-exporter.test.d.ts +51 -0
- package/packages/core/dist/bmad/story-exporter.test.d.ts.map +1 -0
- package/packages/core/dist/bmad/story-exporter.test.js +603 -0
- package/packages/core/dist/bmad/story-exporter.test.js.map +1 -0
- package/packages/core/dist/bmad/story-parser.d.ts +44 -0
- package/packages/core/dist/bmad/story-parser.d.ts.map +1 -0
- package/packages/core/dist/bmad/story-parser.js +307 -0
- package/packages/core/dist/bmad/story-parser.js.map +1 -0
- package/packages/core/dist/bmad/story-parser.test.d.ts +44 -0
- package/packages/core/dist/bmad/story-parser.test.d.ts.map +1 -0
- package/packages/core/dist/bmad/story-parser.test.js +693 -0
- package/packages/core/dist/bmad/story-parser.test.js.map +1 -0
- package/packages/core/dist/cli/commands/command.d.ts +28 -0
- package/packages/core/dist/cli/commands/command.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/command.js +399 -0
- package/packages/core/dist/cli/commands/command.js.map +1 -0
- package/packages/core/dist/cli/commands/cyclist.d.ts +46 -0
- package/packages/core/dist/cli/commands/cyclist.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/cyclist.js +196 -0
- package/packages/core/dist/cli/commands/cyclist.js.map +1 -0
- package/packages/core/dist/cli/commands/cyclist.test.d.ts +13 -0
- package/packages/core/dist/cli/commands/cyclist.test.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/cyclist.test.js +245 -0
- package/packages/core/dist/cli/commands/cyclist.test.js.map +1 -0
- package/packages/core/dist/cli/commands/doctor-legacy.test.d.ts +13 -0
- package/packages/core/dist/cli/commands/doctor-legacy.test.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/doctor-legacy.test.js +207 -0
- package/packages/core/dist/cli/commands/doctor-legacy.test.js.map +1 -0
- package/packages/core/dist/cli/commands/doctor.d.ts +25 -0
- package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/doctor.js +780 -0
- package/packages/core/dist/cli/commands/doctor.js.map +1 -0
- package/packages/core/dist/cli/commands/init.d.ts +8 -0
- package/packages/core/dist/cli/commands/init.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/init.js +515 -0
- package/packages/core/dist/cli/commands/init.js.map +1 -0
- package/packages/core/dist/cli/commands/skill.d.ts +28 -0
- package/packages/core/dist/cli/commands/skill.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/skill.js +416 -0
- package/packages/core/dist/cli/commands/skill.js.map +1 -0
- package/packages/core/dist/cli/commands/theme.d.ts +21 -0
- package/packages/core/dist/cli/commands/theme.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/theme.js +201 -0
- package/packages/core/dist/cli/commands/theme.js.map +1 -0
- package/packages/core/dist/cli/commands/uninstall.d.ts +8 -0
- package/packages/core/dist/cli/commands/uninstall.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/uninstall.js +237 -0
- package/packages/core/dist/cli/commands/uninstall.js.map +1 -0
- package/packages/core/dist/cli/commands/update.d.ts +9 -0
- package/packages/core/dist/cli/commands/update.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/update.js +390 -0
- package/packages/core/dist/cli/commands/update.js.map +1 -0
- package/packages/core/dist/cli/commands/version.d.ts +2 -0
- package/packages/core/dist/cli/commands/version.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/version.js +28 -0
- package/packages/core/dist/cli/commands/version.js.map +1 -0
- package/packages/core/dist/cli/customization.test.d.ts +12 -0
- package/packages/core/dist/cli/customization.test.d.ts.map +1 -0
- package/packages/core/dist/cli/customization.test.js +84 -0
- package/packages/core/dist/cli/customization.test.js.map +1 -0
- package/packages/core/dist/cli/cyclist-migration.test.d.ts +16 -0
- package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +1 -0
- package/packages/core/dist/cli/cyclist-migration.test.js +225 -0
- package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -0
- package/packages/core/dist/cli/index.d.ts +3 -0
- package/packages/core/dist/cli/index.d.ts.map +1 -0
- package/packages/core/dist/cli/index.js +174 -0
- package/packages/core/dist/cli/index.js.map +1 -0
- package/packages/core/dist/cli/ocean-profiles.test.d.ts +13 -0
- package/packages/core/dist/cli/ocean-profiles.test.d.ts.map +1 -0
- package/packages/core/dist/cli/ocean-profiles.test.js +134 -0
- package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -0
- package/packages/core/dist/cli/theme-maker.test.d.ts +11 -0
- package/packages/core/dist/cli/theme-maker.test.d.ts.map +1 -0
- package/packages/core/dist/cli/theme-maker.test.js +356 -0
- package/packages/core/dist/cli/theme-maker.test.js.map +1 -0
- package/packages/core/dist/cli/utils/constants.d.ts +66 -0
- package/packages/core/dist/cli/utils/constants.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/constants.js +54 -0
- package/packages/core/dist/cli/utils/constants.js.map +1 -0
- package/{dist → packages/core/dist}/cli/utils/files.d.ts +1 -0
- package/packages/core/dist/cli/utils/files.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/files.js +162 -0
- package/packages/core/dist/cli/utils/files.js.map +1 -0
- package/packages/core/dist/cli/utils/logger.d.ts +26 -0
- package/packages/core/dist/cli/utils/logger.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/logger.js +88 -0
- package/packages/core/dist/cli/utils/logger.js.map +1 -0
- package/{dist → packages/core/dist}/cli/utils/manifest.d.ts +1 -0
- package/packages/core/dist/cli/utils/manifest.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/manifest.js +90 -0
- package/packages/core/dist/cli/utils/manifest.js.map +1 -0
- package/packages/core/dist/cli/utils/node-modules.d.ts +6 -0
- package/packages/core/dist/cli/utils/node-modules.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/node-modules.js +32 -0
- package/packages/core/dist/cli/utils/node-modules.js.map +1 -0
- package/packages/core/dist/cli/utils/prompts.d.ts +34 -0
- package/packages/core/dist/cli/utils/prompts.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/prompts.js +93 -0
- package/packages/core/dist/cli/utils/prompts.js.map +1 -0
- package/packages/core/dist/cli/utils/symlinks.d.ts +44 -0
- package/packages/core/dist/cli/utils/symlinks.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/symlinks.js +327 -0
- package/packages/core/dist/cli/utils/symlinks.js.map +1 -0
- package/packages/core/dist/cli/utils/themes.d.ts +101 -0
- package/packages/core/dist/cli/utils/themes.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/themes.js +382 -0
- package/packages/core/dist/cli/utils/themes.js.map +1 -0
- package/packages/core/dist/cli/utils/themes.test.d.ts +12 -0
- package/packages/core/dist/cli/utils/themes.test.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/themes.test.js +147 -0
- package/packages/core/dist/cli/utils/themes.test.js.map +1 -0
- package/{dist → packages/core/dist}/cli/utils/version.d.ts +1 -0
- package/packages/core/dist/cli/utils/version.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/version.js +64 -0
- package/packages/core/dist/cli/utils/version.js.map +1 -0
- package/packages/core/dist/cli/workspace.test.d.ts +8 -0
- package/packages/core/dist/cli/workspace.test.d.ts.map +1 -0
- package/packages/core/dist/cli/workspace.test.js +156 -0
- package/packages/core/dist/cli/workspace.test.js.map +1 -0
- package/{dist → packages/core/dist}/index.d.ts +1 -0
- package/packages/core/dist/index.d.ts.map +1 -0
- package/packages/core/dist/index.js +20 -0
- package/packages/core/dist/index.js.map +1 -0
- package/packages/core/dist/jira/jira-epic-creation.d.ts +109 -0
- package/packages/core/dist/jira/jira-epic-creation.d.ts.map +1 -0
- package/packages/core/dist/jira/jira-epic-creation.js +253 -0
- package/packages/core/dist/jira/jira-epic-creation.js.map +1 -0
- package/packages/core/dist/jira/jira-epic-creation.test.d.ts +16 -0
- package/packages/core/dist/jira/jira-epic-creation.test.d.ts.map +1 -0
- package/packages/core/dist/jira/jira-epic-creation.test.js +387 -0
- package/packages/core/dist/jira/jira-epic-creation.test.js.map +1 -0
- package/packages/core/dist/jira/jira-sprint-sync.d.ts +247 -0
- package/packages/core/dist/jira/jira-sprint-sync.d.ts.map +1 -0
- package/packages/core/dist/jira/jira-sprint-sync.js +670 -0
- package/packages/core/dist/jira/jira-sprint-sync.js.map +1 -0
- package/packages/core/dist/jira/jira-sprint-sync.test.d.ts +16 -0
- package/packages/core/dist/jira/jira-sprint-sync.test.d.ts.map +1 -0
- package/packages/core/dist/jira/jira-sprint-sync.test.js +845 -0
- package/packages/core/dist/jira/jira-sprint-sync.test.js.map +1 -0
- package/{dist → packages/core/dist}/permissions/index.d.ts +1 -0
- package/packages/core/dist/permissions/index.d.ts.map +1 -0
- package/packages/core/dist/permissions/index.js +13 -0
- package/packages/core/dist/permissions/index.js.map +1 -0
- package/{dist → packages/core/dist}/permissions/permission-schema.d.ts +1 -0
- package/packages/core/dist/permissions/permission-schema.d.ts.map +1 -0
- package/{dist → packages/core/dist}/permissions/permission-schema.js +9 -13
- package/packages/core/dist/permissions/permission-schema.js.map +1 -0
- package/packages/core/dist/permissions/permission-schema.test.d.ts +40 -0
- package/packages/core/dist/permissions/permission-schema.test.d.ts.map +1 -0
- package/packages/core/dist/permissions/permission-schema.test.js +367 -0
- package/packages/core/dist/permissions/permission-schema.test.js.map +1 -0
- package/packages/core/dist/scripts/add-ocean-profiles.d.ts +9 -0
- package/packages/core/dist/scripts/add-ocean-profiles.d.ts.map +1 -0
- package/packages/core/dist/scripts/add-ocean-profiles.js +695 -0
- package/packages/core/dist/scripts/add-ocean-profiles.js.map +1 -0
- package/packages/core/dist/scripts/benchmark-integration.d.ts +182 -0
- package/packages/core/dist/scripts/benchmark-integration.d.ts.map +1 -0
- package/packages/core/dist/scripts/benchmark-integration.js +691 -0
- package/packages/core/dist/scripts/benchmark-integration.js.map +1 -0
- package/packages/core/dist/scripts/benchmark-integration.test.d.ts +13 -0
- package/packages/core/dist/scripts/benchmark-integration.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/benchmark-integration.test.js +680 -0
- package/packages/core/dist/scripts/benchmark-integration.test.js.map +1 -0
- package/packages/core/dist/scripts/debugging-scenarios.test.d.ts +18 -0
- package/packages/core/dist/scripts/debugging-scenarios.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/debugging-scenarios.test.js +317 -0
- package/packages/core/dist/scripts/debugging-scenarios.test.js.map +1 -0
- package/packages/core/dist/scripts/generate-all-spiders.d.ts +10 -0
- package/packages/core/dist/scripts/generate-all-spiders.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-all-spiders.js +306 -0
- package/packages/core/dist/scripts/generate-all-spiders.js.map +1 -0
- package/packages/core/dist/scripts/generate-report.d.ts +65 -0
- package/packages/core/dist/scripts/generate-report.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-report.js +378 -0
- package/packages/core/dist/scripts/generate-report.js.map +1 -0
- package/packages/core/dist/scripts/generate-report.test.d.ts +13 -0
- package/packages/core/dist/scripts/generate-report.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-report.test.js +363 -0
- package/packages/core/dist/scripts/generate-report.test.js.map +1 -0
- package/packages/core/dist/scripts/generate-spider-report.d.ts +65 -0
- package/packages/core/dist/scripts/generate-spider-report.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-spider-report.js +366 -0
- package/packages/core/dist/scripts/generate-spider-report.js.map +1 -0
- package/packages/core/dist/scripts/generate-spider-report.test.d.ts +13 -0
- package/packages/core/dist/scripts/generate-spider-report.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-spider-report.test.js +367 -0
- package/packages/core/dist/scripts/generate-spider-report.test.js.map +1 -0
- package/packages/core/dist/scripts/generate-spider.d.ts +47 -0
- package/packages/core/dist/scripts/generate-spider.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-spider.js +338 -0
- package/packages/core/dist/scripts/generate-spider.js.map +1 -0
- package/packages/core/dist/scripts/generate-spider.test.d.ts +14 -0
- package/packages/core/dist/scripts/generate-spider.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-spider.test.js +271 -0
- package/packages/core/dist/scripts/generate-spider.test.js.map +1 -0
- package/{dist → packages/core/dist}/scripts/job-fair-aggregator.d.ts +1 -0
- package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +1 -0
- package/packages/core/dist/scripts/job-fair-aggregator.js +547 -0
- package/packages/core/dist/scripts/job-fair-aggregator.js.map +1 -0
- package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts +14 -0
- package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/job-fair-aggregator.test.js +616 -0
- package/packages/core/dist/scripts/job-fair-aggregator.test.js.map +1 -0
- package/packages/core/dist/scripts/run-ci.test.d.ts +20 -0
- package/packages/core/dist/scripts/run-ci.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/run-ci.test.js +127 -0
- package/packages/core/dist/scripts/run-ci.test.js.map +1 -0
- package/packages/core/dist/scripts/theme-detail.test.d.ts +10 -0
- package/packages/core/dist/scripts/theme-detail.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/theme-detail.test.js +199 -0
- package/packages/core/dist/scripts/theme-detail.test.js.map +1 -0
- package/packages/core/dist/scripts/validate-ocean-profiles.d.ts +9 -0
- package/packages/core/dist/scripts/validate-ocean-profiles.d.ts.map +1 -0
- package/packages/core/dist/scripts/validate-ocean-profiles.js +130 -0
- package/packages/core/dist/scripts/validate-ocean-profiles.js.map +1 -0
- package/packages/core/dist/workflow/gate-handler.d.ts +94 -0
- package/packages/core/dist/workflow/gate-handler.d.ts.map +1 -0
- package/packages/core/dist/workflow/gate-handler.js +189 -0
- package/packages/core/dist/workflow/gate-handler.js.map +1 -0
- package/packages/core/dist/workflow/gate-handler.test.d.ts +14 -0
- package/packages/core/dist/workflow/gate-handler.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/gate-handler.test.js +543 -0
- package/packages/core/dist/workflow/gate-handler.test.js.map +1 -0
- package/packages/core/dist/workflow/generic-sm-finish.d.ts +89 -0
- package/packages/core/dist/workflow/generic-sm-finish.d.ts.map +1 -0
- package/packages/core/dist/workflow/generic-sm-finish.js +157 -0
- package/packages/core/dist/workflow/generic-sm-finish.js.map +1 -0
- package/packages/core/dist/workflow/generic-sm-setup.d.ts +138 -0
- package/packages/core/dist/workflow/generic-sm-setup.d.ts.map +1 -0
- package/packages/core/dist/workflow/generic-sm-setup.js +382 -0
- package/packages/core/dist/workflow/generic-sm-setup.js.map +1 -0
- package/packages/core/dist/workflow/handoff.d.ts +281 -0
- package/packages/core/dist/workflow/handoff.d.ts.map +1 -0
- package/packages/core/dist/workflow/handoff.js +411 -0
- package/packages/core/dist/workflow/handoff.js.map +1 -0
- package/packages/core/dist/workflow/handoff.test.d.ts +21 -0
- package/packages/core/dist/workflow/handoff.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/handoff.test.js +499 -0
- package/packages/core/dist/workflow/handoff.test.js.map +1 -0
- package/{dist → packages/core/dist}/workflow/index.d.ts +1 -0
- package/packages/core/dist/workflow/index.d.ts.map +1 -0
- package/packages/core/dist/workflow/index.js +24 -0
- package/packages/core/dist/workflow/index.js.map +1 -0
- package/packages/core/dist/workflow/session-state.d.ts +92 -0
- package/packages/core/dist/workflow/session-state.d.ts.map +1 -0
- package/packages/core/dist/workflow/session-state.js +198 -0
- package/packages/core/dist/workflow/session-state.js.map +1 -0
- package/packages/core/dist/workflow/session-state.test.d.ts +8 -0
- package/packages/core/dist/workflow/session-state.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/session-state.test.js +551 -0
- package/packages/core/dist/workflow/session-state.test.js.map +1 -0
- package/packages/core/dist/workflow/sm-subagents.test.d.ts +23 -0
- package/packages/core/dist/workflow/sm-subagents.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/sm-subagents.test.js +727 -0
- package/packages/core/dist/workflow/sm-subagents.test.js.map +1 -0
- package/packages/core/dist/workflow/step-parser.d.ts +45 -0
- package/packages/core/dist/workflow/step-parser.d.ts.map +1 -0
- package/packages/core/dist/workflow/step-parser.js +147 -0
- package/packages/core/dist/workflow/step-parser.js.map +1 -0
- package/packages/core/dist/workflow/step-parser.test.d.ts +14 -0
- package/packages/core/dist/workflow/step-parser.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/step-parser.test.js +470 -0
- package/packages/core/dist/workflow/step-parser.test.js.map +1 -0
- package/packages/core/dist/workflow/story-workflow-routing.test.d.ts +17 -0
- package/packages/core/dist/workflow/story-workflow-routing.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/story-workflow-routing.test.js +559 -0
- package/packages/core/dist/workflow/story-workflow-routing.test.js.map +1 -0
- package/packages/core/dist/workflow/test-cache.d.ts +131 -0
- package/packages/core/dist/workflow/test-cache.d.ts.map +1 -0
- package/packages/core/dist/workflow/test-cache.js +226 -0
- package/packages/core/dist/workflow/test-cache.js.map +1 -0
- package/packages/core/dist/workflow/test-cache.test.d.ts +17 -0
- package/packages/core/dist/workflow/test-cache.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/test-cache.test.js +438 -0
- package/packages/core/dist/workflow/test-cache.test.js.map +1 -0
- package/packages/core/dist/workflow/trimodal.d.ts +86 -0
- package/packages/core/dist/workflow/trimodal.d.ts.map +1 -0
- package/packages/core/dist/workflow/trimodal.js +118 -0
- package/packages/core/dist/workflow/trimodal.js.map +1 -0
- package/packages/core/dist/workflow/trimodal.test.d.ts +11 -0
- package/packages/core/dist/workflow/trimodal.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/trimodal.test.js +395 -0
- package/packages/core/dist/workflow/trimodal.test.js.map +1 -0
- package/packages/core/dist/workflow/variable-resolver.d.ts +67 -0
- package/packages/core/dist/workflow/variable-resolver.d.ts.map +1 -0
- package/packages/core/dist/workflow/variable-resolver.js +156 -0
- package/packages/core/dist/workflow/variable-resolver.js.map +1 -0
- package/packages/core/dist/workflow/variable-resolver.test.d.ts +14 -0
- package/packages/core/dist/workflow/variable-resolver.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/variable-resolver.test.js +400 -0
- package/packages/core/dist/workflow/variable-resolver.test.js.map +1 -0
- package/packages/core/dist/workflow/workflow-executor.d.ts +163 -0
- package/packages/core/dist/workflow/workflow-executor.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-executor.js +197 -0
- package/packages/core/dist/workflow/workflow-executor.js.map +1 -0
- package/packages/core/dist/workflow/workflow-executor.test.d.ts +8 -0
- package/packages/core/dist/workflow/workflow-executor.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-executor.test.js +444 -0
- package/packages/core/dist/workflow/workflow-executor.test.js.map +1 -0
- package/{dist → packages/core/dist}/workflow/workflow-loader.d.ts +1 -0
- package/packages/core/dist/workflow/workflow-loader.d.ts.map +1 -0
- package/{dist → packages/core/dist}/workflow/workflow-loader.js +34 -40
- package/packages/core/dist/workflow/workflow-loader.js.map +1 -0
- package/packages/core/dist/workflow/workflow-loader.test.d.ts +15 -0
- package/packages/core/dist/workflow/workflow-loader.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-loader.test.js +354 -0
- package/packages/core/dist/workflow/workflow-loader.test.js.map +1 -0
- package/packages/core/dist/workflow/workflow-migration.test.d.ts +17 -0
- package/packages/core/dist/workflow/workflow-migration.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-migration.test.js +371 -0
- package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -0
- package/{dist → packages/core/dist}/workflow/workflow-permissions.d.ts +1 -0
- package/packages/core/dist/workflow/workflow-permissions.d.ts.map +1 -0
- package/{dist → packages/core/dist}/workflow/workflow-permissions.js +8 -14
- package/packages/core/dist/workflow/workflow-permissions.js.map +1 -0
- package/packages/core/dist/workflow/workflow-permissions.test.d.ts +15 -0
- package/packages/core/dist/workflow/workflow-permissions.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-permissions.test.js +301 -0
- package/packages/core/dist/workflow/workflow-permissions.test.js.map +1 -0
- package/{dist → packages/core/dist}/workflow/workflow-router.d.ts +1 -0
- package/packages/core/dist/workflow/workflow-router.d.ts.map +1 -0
- package/{dist → packages/core/dist}/workflow/workflow-router.js +51 -70
- package/packages/core/dist/workflow/workflow-router.js.map +1 -0
- package/packages/core/dist/workflow/workflow-router.test.d.ts +20 -0
- package/packages/core/dist/workflow/workflow-router.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-router.test.js +607 -0
- package/packages/core/dist/workflow/workflow-router.test.js.map +1 -0
- package/{dist → packages/core/dist}/workflow/workflow-schema.d.ts +1 -0
- package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -0
- package/{dist → packages/core/dist}/workflow/workflow-schema.js +59 -62
- package/packages/core/dist/workflow/workflow-schema.js.map +1 -0
- package/packages/core/dist/workflow/workflow-schema.test.d.ts +45 -0
- package/packages/core/dist/workflow/workflow-schema.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-schema.test.js +512 -0
- package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -0
- package/packages/core/dist/workflow/workflow-stepped-schema.test.d.ts +18 -0
- package/packages/core/dist/workflow/workflow-stepped-schema.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-stepped-schema.test.js +608 -0
- package/packages/core/dist/workflow/workflow-stepped-schema.test.js.map +1 -0
- package/pennyfarthing-dist/agents/README.md +340 -0
- package/pennyfarthing-dist/agents/architect.md +193 -0
- package/pennyfarthing-dist/agents/dev.md +259 -0
- package/pennyfarthing-dist/agents/devops.md +206 -0
- package/pennyfarthing-dist/agents/handoff.md +212 -0
- package/pennyfarthing-dist/agents/orchestrator.md +355 -0
- package/pennyfarthing-dist/agents/pm.md +169 -0
- package/pennyfarthing-dist/agents/reviewer-preflight.md +96 -0
- package/pennyfarthing-dist/agents/reviewer.md +377 -0
- package/pennyfarthing-dist/agents/sm-file-summary.md +58 -0
- package/pennyfarthing-dist/agents/sm-finish.md +61 -0
- package/pennyfarthing-dist/agents/sm-handoff.md +122 -0
- package/pennyfarthing-dist/agents/sm-setup.md +174 -0
- package/pennyfarthing-dist/agents/sm.md +649 -0
- package/pennyfarthing-dist/agents/tea.md +230 -0
- package/pennyfarthing-dist/agents/tech-writer.md +216 -0
- package/pennyfarthing-dist/agents/testing-runner.md +141 -0
- package/pennyfarthing-dist/agents/ux-designer.md +231 -0
- package/pennyfarthing-dist/agents/workflow-status-check.md +68 -0
- package/pennyfarthing-dist/commands/architect.md +7 -0
- package/pennyfarthing-dist/commands/benchmark-control.md +69 -0
- package/pennyfarthing-dist/commands/benchmark.md +467 -0
- package/pennyfarthing-dist/commands/brainstorming.md +91 -0
- package/pennyfarthing-dist/commands/check.md +156 -0
- package/pennyfarthing-dist/commands/chore.md +178 -0
- package/pennyfarthing-dist/commands/close-epic.md +139 -0
- package/pennyfarthing-dist/commands/continue-session.md +184 -0
- package/pennyfarthing-dist/commands/create-branches-from-story.md +358 -0
- package/pennyfarthing-dist/commands/create-theme.md +29 -0
- package/pennyfarthing-dist/commands/dev.md +7 -0
- package/pennyfarthing-dist/commands/devops.md +7 -0
- package/pennyfarthing-dist/commands/git-cleanup.md +340 -0
- package/pennyfarthing-dist/commands/health-check.md +141 -0
- package/pennyfarthing-dist/commands/help.md +264 -0
- package/pennyfarthing-dist/commands/job-fair.md +102 -0
- package/pennyfarthing-dist/commands/list-themes.md +21 -0
- package/pennyfarthing-dist/commands/orchestrator.md +7 -0
- package/pennyfarthing-dist/commands/parallel-work.md +71 -0
- package/pennyfarthing-dist/commands/party-mode.md +67 -0
- package/pennyfarthing-dist/commands/permissions.md +193 -0
- package/pennyfarthing-dist/commands/pm.md +7 -0
- package/pennyfarthing-dist/commands/prime.md +140 -0
- package/pennyfarthing-dist/commands/release.md +58 -0
- package/pennyfarthing-dist/commands/repo-status.md +49 -0
- package/pennyfarthing-dist/commands/retro.md +200 -0
- package/pennyfarthing-dist/commands/reviewer.md +7 -0
- package/pennyfarthing-dist/commands/run-ci.md +116 -0
- package/pennyfarthing-dist/commands/set-theme.md +56 -0
- package/pennyfarthing-dist/commands/show-theme.md +21 -0
- package/pennyfarthing-dist/commands/sm.md +7 -0
- package/pennyfarthing-dist/commands/solo.md +411 -0
- package/pennyfarthing-dist/commands/sprint-planning.md +109 -0
- package/pennyfarthing-dist/commands/sprint.md +133 -0
- package/pennyfarthing-dist/commands/standalone.md +194 -0
- package/pennyfarthing-dist/commands/start-epic.md +168 -0
- package/pennyfarthing-dist/commands/sync-epic-to-jira.md +184 -0
- package/pennyfarthing-dist/commands/sync-work-with-sprint.md +373 -0
- package/pennyfarthing-dist/commands/tea.md +7 -0
- package/pennyfarthing-dist/commands/tech-writer.md +7 -0
- package/pennyfarthing-dist/commands/theme-maker.md +676 -0
- package/pennyfarthing-dist/commands/update-domain-docs.md +83 -0
- package/pennyfarthing-dist/commands/ux-designer.md +7 -0
- package/pennyfarthing-dist/commands/work.md +122 -0
- package/pennyfarthing-dist/commands/workflow.md +21 -0
- package/pennyfarthing-dist/guides/AGENT-COORDINATION.md +480 -0
- package/pennyfarthing-dist/guides/HOOKS.md +230 -0
- package/pennyfarthing-dist/guides/PROMPT-PATTERNS.md +338 -0
- package/pennyfarthing-dist/guides/SESSION-ARTIFACTS.md +193 -0
- package/pennyfarthing-dist/guides/XML-TAGS.md +156 -0
- package/pennyfarthing-dist/guides/agent-behavior.md +264 -0
- package/pennyfarthing-dist/guides/agent-template-strategic.md +148 -0
- package/pennyfarthing-dist/guides/agent-template-tactical.md +162 -0
- package/pennyfarthing-dist/guides/measurement-framework.md +210 -0
- package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +746 -0
- package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +574 -0
- package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +488 -0
- package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +402 -0
- package/pennyfarthing-dist/guides/permission-protocol.md +188 -0
- package/pennyfarthing-dist/guides/persona-loading.md +46 -0
- package/pennyfarthing-dist/guides/workflow-schema.md +257 -0
- package/pennyfarthing-dist/guides/worktree-mode.md +113 -0
- package/pennyfarthing-dist/output-styles/teaching.md +33 -0
- package/pennyfarthing-dist/output-styles/terse.md +20 -0
- package/pennyfarthing-dist/output-styles/verbose.md +28 -0
- package/pennyfarthing-dist/personas/themes/1984.yaml +312 -0
- package/pennyfarthing-dist/personas/themes/a-team.yaml +337 -0
- package/pennyfarthing-dist/personas/themes/agatha-christie.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +330 -0
- package/pennyfarthing-dist/personas/themes/all-stars.yaml +332 -0
- package/pennyfarthing-dist/personas/themes/ancient-philosophers.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/ancient-strategists.yaml +306 -0
- package/pennyfarthing-dist/personas/themes/arcane.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/arthurian-mythos.yaml +331 -0
- package/pennyfarthing-dist/personas/themes/avatar-the-last-airbender.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/babylon-5.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/better-call-saul.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/big-lebowski.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/black-sails.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/blade-runner.yaml +295 -0
- package/pennyfarthing-dist/personas/themes/bobiverse.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/breaking-bad.yaml +327 -0
- package/pennyfarthing-dist/personas/themes/catch-22.yaml +316 -0
- package/pennyfarthing-dist/personas/themes/classical-composers.yaml +310 -0
- package/pennyfarthing-dist/personas/themes/control.yaml +197 -0
- package/pennyfarthing-dist/personas/themes/count-of-monte-cristo.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +323 -0
- package/pennyfarthing-dist/personas/themes/deadwood.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/dickens.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/discworld.yaml +332 -0
- package/pennyfarthing-dist/personas/themes/doctor-who.yaml +290 -0
- package/pennyfarthing-dist/personas/themes/don-quixote.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/dune.yaml +307 -0
- package/pennyfarthing-dist/personas/themes/enlightenment-thinkers.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/expeditionary-force.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/fargo.yaml +330 -0
- package/pennyfarthing-dist/personas/themes/film-auteurs.yaml +312 -0
- package/pennyfarthing-dist/personas/themes/firefly.yaml +328 -0
- package/pennyfarthing-dist/personas/themes/foundation.yaml +290 -0
- package/pennyfarthing-dist/personas/themes/futurama.yaml +321 -0
- package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +290 -0
- package/pennyfarthing-dist/personas/themes/gilligans-island.yaml +373 -0
- package/pennyfarthing-dist/personas/themes/gothic-literature.yaml +308 -0
- package/pennyfarthing-dist/personas/themes/great-gatsby.yaml +308 -0
- package/pennyfarthing-dist/personas/themes/greek-mythology.yaml +330 -0
- package/pennyfarthing-dist/personas/themes/hannibal.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/harry-potter.yaml +324 -0
- package/pennyfarthing-dist/personas/themes/his-dark-materials.yaml +291 -0
- package/pennyfarthing-dist/personas/themes/historical-figures.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +331 -0
- package/pennyfarthing-dist/personas/themes/house-md.yaml +321 -0
- package/pennyfarthing-dist/personas/themes/imperial-radch.yaml +289 -0
- package/pennyfarthing-dist/personas/themes/inspector-morse.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/jane-austen.yaml +287 -0
- package/pennyfarthing-dist/personas/themes/jazz-legends.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/justified.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/legion-of-doom.yaml +349 -0
- package/pennyfarthing-dist/personas/themes/les-miserables.yaml +299 -0
- package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +334 -0
- package/pennyfarthing-dist/personas/themes/lovecraft-mythos.yaml +334 -0
- package/pennyfarthing-dist/personas/themes/mad-max.yaml +355 -0
- package/pennyfarthing-dist/personas/themes/mad-men.yaml +289 -0
- package/pennyfarthing-dist/personas/themes/marvel-mcu.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/mash.yaml +337 -0
- package/pennyfarthing-dist/personas/themes/mass-effect.yaml +289 -0
- package/pennyfarthing-dist/personas/themes/military-commanders.yaml +306 -0
- package/pennyfarthing-dist/personas/themes/moby-dick.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/monty-python.yaml +303 -0
- package/pennyfarthing-dist/personas/themes/neuromancer.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/norse-mythology.yaml +329 -0
- package/pennyfarthing-dist/personas/themes/parks-and-rec.yaml +372 -0
- package/pennyfarthing-dist/personas/themes/peaky-blinders.yaml +298 -0
- package/pennyfarthing-dist/personas/themes/princess-bride.yaml +350 -0
- package/pennyfarthing-dist/personas/themes/renaissance-masters.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/rome.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/russian-masters.yaml +318 -0
- package/pennyfarthing-dist/personas/themes/sandman.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/scientific-revolutionaries.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/shakespeare.yaml +301 -0
- package/pennyfarthing-dist/personas/themes/sherlock-holmes.yaml +289 -0
- package/pennyfarthing-dist/personas/themes/snow-crash.yaml +288 -0
- package/pennyfarthing-dist/personas/themes/software-pioneers.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +366 -0
- package/pennyfarthing-dist/personas/themes/star-trek-tos.yaml +334 -0
- package/pennyfarthing-dist/personas/themes/star-wars.yaml +303 -0
- package/pennyfarthing-dist/personas/themes/succession.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/superfriends.yaml +338 -0
- package/pennyfarthing-dist/personas/themes/ted-lasso.yaml +366 -0
- package/pennyfarthing-dist/personas/themes/the-americans.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/the-crown.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/the-expanse.yaml +343 -0
- package/pennyfarthing-dist/personas/themes/the-good-place.yaml +322 -0
- package/pennyfarthing-dist/personas/themes/the-matrix.yaml +353 -0
- package/pennyfarthing-dist/personas/themes/the-odyssey.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/the-office.yaml +330 -0
- package/pennyfarthing-dist/personas/themes/the-simpsons.yaml +308 -0
- package/pennyfarthing-dist/personas/themes/the-sopranos.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/the-wire.yaml +311 -0
- package/pennyfarthing-dist/personas/themes/the-witcher.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/twin-peaks.yaml +302 -0
- package/pennyfarthing-dist/personas/themes/vorkosigan-saga.yaml +300 -0
- package/pennyfarthing-dist/personas/themes/watchmen.yaml +291 -0
- package/pennyfarthing-dist/personas/themes/west-wing.yaml +291 -0
- package/pennyfarthing-dist/personas/themes/world-explorers.yaml +320 -0
- package/pennyfarthing-dist/personas/themes/wwii-leaders.yaml +307 -0
- package/pennyfarthing-dist/personas/themes/x-files.yaml +302 -0
- package/pennyfarthing-dist/scripts/README.md +68 -0
- package/pennyfarthing-dist/scripts/core/README.md +26 -0
- package/pennyfarthing-dist/scripts/core/agent-session.sh +378 -0
- package/pennyfarthing-dist/scripts/core/check-context.sh +260 -0
- package/pennyfarthing-dist/scripts/core/handoff-marker.sh +90 -0
- package/pennyfarthing-dist/scripts/core/phase-check-start.sh +95 -0
- package/pennyfarthing-dist/scripts/core/prime.sh +136 -0
- package/pennyfarthing-dist/scripts/core/run.sh +75 -0
- package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +21 -0
- package/pennyfarthing-dist/scripts/git/README.md +25 -0
- package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +226 -0
- package/pennyfarthing-dist/scripts/git/git-status-all.sh +127 -0
- package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +91 -0
- package/pennyfarthing-dist/scripts/git/release.sh +199 -0
- package/pennyfarthing-dist/scripts/git/worktree-manager.sh +494 -0
- package/pennyfarthing-dist/scripts/health/drift-detection.sh +162 -0
- package/pennyfarthing-dist/scripts/hooks/README.md +32 -0
- package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +87 -0
- package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +60 -0
- package/pennyfarthing-dist/scripts/hooks/context-warning.sh +65 -0
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +35 -0
- package/pennyfarthing-dist/scripts/hooks/post-merge.sh +166 -0
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +50 -0
- package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +71 -0
- package/pennyfarthing-dist/scripts/hooks/pre-push.sh +54 -0
- package/pennyfarthing-dist/scripts/hooks/session-start.sh +97 -0
- package/pennyfarthing-dist/scripts/hooks/session-stop.sh +58 -0
- package/pennyfarthing-dist/scripts/jira/README.md +33 -0
- package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +101 -0
- package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +97 -0
- package/pennyfarthing-dist/scripts/jira/jira-bidirectional-sync.mjs +327 -0
- package/pennyfarthing-dist/scripts/jira/jira-bidirectional-sync.test.mjs +503 -0
- package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +164 -0
- package/pennyfarthing-dist/scripts/jira/jira-lib.mjs +443 -0
- package/pennyfarthing-dist/scripts/jira/jira-lib.sh +464 -0
- package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +266 -0
- package/pennyfarthing-dist/scripts/jira/jira-sync-story.mjs +208 -0
- package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +8 -0
- package/pennyfarthing-dist/scripts/jira/jira-sync.mjs +198 -0
- package/pennyfarthing-dist/scripts/jira/jira-sync.sh +8 -0
- package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +104 -0
- package/pennyfarthing-dist/scripts/jira/sync-epic-to-jira.sh +16 -0
- package/pennyfarthing-dist/scripts/lib/README.md +29 -0
- package/pennyfarthing-dist/scripts/lib/background-tasks.sh +177 -0
- package/pennyfarthing-dist/scripts/lib/checkpoint.sh +136 -0
- package/pennyfarthing-dist/scripts/lib/common.sh +157 -0
- package/pennyfarthing-dist/scripts/lib/file-lock.sh +269 -0
- package/pennyfarthing-dist/scripts/lib/find-root.sh +35 -0
- package/pennyfarthing-dist/scripts/lib/logging.sh +186 -0
- package/pennyfarthing-dist/scripts/lib/retry.sh +76 -0
- package/pennyfarthing-dist/scripts/misc/README.md +44 -0
- package/pennyfarthing-dist/scripts/misc/add-short-names.mjs +264 -0
- package/pennyfarthing-dist/scripts/misc/backlog.sh +91 -0
- package/pennyfarthing-dist/scripts/misc/check-status.sh +247 -0
- package/pennyfarthing-dist/scripts/misc/deploy.sh +284 -0
- package/pennyfarthing-dist/scripts/misc/doctor-dogfood.sh +392 -0
- package/pennyfarthing-dist/scripts/misc/find-related-work.sh +231 -0
- package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +110 -0
- package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +74 -0
- package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.mjs +474 -0
- package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +9 -0
- package/pennyfarthing-dist/scripts/misc/repo-scan.sh +141 -0
- package/pennyfarthing-dist/scripts/misc/repo-utils.sh +778 -0
- package/pennyfarthing-dist/scripts/misc/run-ci.sh +219 -0
- package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +7 -0
- package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +319 -0
- package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +193 -0
- package/pennyfarthing-dist/scripts/misc/statusline.sh +252 -0
- package/pennyfarthing-dist/scripts/misc/uninstall.sh +270 -0
- package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +160 -0
- package/pennyfarthing-dist/scripts/sprint/README.md +29 -0
- package/pennyfarthing-dist/scripts/sprint/archive-story.sh +135 -0
- package/pennyfarthing-dist/scripts/sprint/available-stories.sh +97 -0
- package/pennyfarthing-dist/scripts/sprint/check-story.sh +164 -0
- package/pennyfarthing-dist/scripts/sprint/get-epic-field.sh +58 -0
- package/pennyfarthing-dist/scripts/sprint/get-story-field.sh +69 -0
- package/pennyfarthing-dist/scripts/sprint/import-epic-to-future.mjs +377 -0
- package/pennyfarthing-dist/scripts/sprint/import-epic-to-future.sh +9 -0
- package/pennyfarthing-dist/scripts/sprint/list-future.sh +151 -0
- package/pennyfarthing-dist/scripts/sprint/new-sprint.sh +116 -0
- package/pennyfarthing-dist/scripts/sprint/promote-epic.sh +164 -0
- package/pennyfarthing-dist/scripts/sprint/sprint-common.sh +421 -0
- package/pennyfarthing-dist/scripts/sprint/sprint-info.sh +39 -0
- package/pennyfarthing-dist/scripts/sprint/sprint-metrics.sh +241 -0
- package/pennyfarthing-dist/scripts/sprint/sprint-status.sh +134 -0
- package/pennyfarthing-dist/scripts/story/README.md +23 -0
- package/pennyfarthing-dist/scripts/story/create-story.sh +159 -0
- package/pennyfarthing-dist/scripts/story/size-story.sh +198 -0
- package/pennyfarthing-dist/scripts/story/story-template.sh +162 -0
- package/pennyfarthing-dist/scripts/test/README.md +23 -0
- package/pennyfarthing-dist/scripts/test/ground-truth-judge.py +289 -0
- package/pennyfarthing-dist/scripts/test/swebench-judge.py +400 -0
- package/pennyfarthing-dist/scripts/test/test-cache.sh +165 -0
- package/pennyfarthing-dist/scripts/test/test-setup.sh +337 -0
- package/pennyfarthing-dist/scripts/tests/check.test.sh +582 -0
- package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +515 -0
- package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +599 -0
- package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +332 -0
- package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +573 -0
- package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +859 -0
- package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +662 -0
- package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +589 -0
- package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +105 -0
- package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +597 -0
- package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +514 -0
- package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +517 -0
- package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +331 -0
- package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +647 -0
- package/pennyfarthing-dist/scripts/theme/README.md +22 -0
- package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.js +492 -0
- package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +11 -0
- package/pennyfarthing-dist/scripts/theme/list-themes.sh +73 -0
- package/pennyfarthing-dist/scripts/theme/update-theme-tiers.sh +97 -0
- package/pennyfarthing-dist/scripts/workflow/README.md +28 -0
- package/pennyfarthing-dist/scripts/workflow/check.sh +497 -0
- package/pennyfarthing-dist/scripts/workflow/finish-story.sh +159 -0
- package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +228 -0
- package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +124 -0
- package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +40 -0
- package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +163 -0
- package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +138 -0
- package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +256 -0
- package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +167 -0
- package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +242 -0
- package/pennyfarthing-dist/skills/changelog/SKILL.md +367 -0
- package/pennyfarthing-dist/skills/code-review/SKILL.md +168 -0
- package/pennyfarthing-dist/skills/context-engineering/SKILL.md +274 -0
- package/pennyfarthing-dist/skills/cyclist/SKILL.md +88 -0
- package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +437 -0
- package/pennyfarthing-dist/skills/finalize-run/SKILL.md +258 -0
- package/pennyfarthing-dist/skills/jira/SKILL.md +484 -0
- package/pennyfarthing-dist/skills/judge/SKILL.md +579 -0
- package/pennyfarthing-dist/skills/just/SKILL.md +403 -0
- package/pennyfarthing-dist/skills/mermaid/SKILL.md +240 -0
- package/pennyfarthing-dist/skills/otel/skill.md +223 -0
- package/pennyfarthing-dist/skills/permissions/skill.md +172 -0
- package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +178 -0
- package/pennyfarthing-dist/skills/skill-registry.schema.json +107 -0
- package/pennyfarthing-dist/skills/skill-registry.yaml +357 -0
- package/pennyfarthing-dist/skills/sprint/scripts/archive-story.sh +101 -0
- package/pennyfarthing-dist/skills/sprint/scripts/available-stories.sh +97 -0
- package/pennyfarthing-dist/skills/sprint/scripts/check-story.sh +164 -0
- package/pennyfarthing-dist/skills/sprint/scripts/create-jira-epic.sh +101 -0
- package/pennyfarthing-dist/skills/sprint/scripts/new-sprint.sh +116 -0
- package/pennyfarthing-dist/skills/sprint/scripts/promote-epic.sh +164 -0
- package/pennyfarthing-dist/skills/sprint/scripts/sprint-info.sh +39 -0
- package/pennyfarthing-dist/skills/sprint/scripts/sprint-status.sh +147 -0
- package/pennyfarthing-dist/skills/sprint/scripts/sync-epic-jira.sh +104 -0
- package/pennyfarthing-dist/skills/sprint/skill.md +465 -0
- package/pennyfarthing-dist/skills/story/scripts/create-story.sh +159 -0
- package/pennyfarthing-dist/skills/story/scripts/size-story.sh +198 -0
- package/pennyfarthing-dist/skills/story/scripts/story-template.sh +162 -0
- package/pennyfarthing-dist/skills/story/skill.md +219 -0
- package/pennyfarthing-dist/skills/systematic-debugging/SKILL.md +390 -0
- package/pennyfarthing-dist/skills/testing/SKILL.md +99 -0
- package/pennyfarthing-dist/skills/testing/references/troubleshooting.md +124 -0
- package/pennyfarthing-dist/skills/theme/skill.md +129 -0
- package/pennyfarthing-dist/skills/theme-creation/SKILL.md +174 -0
- package/pennyfarthing-dist/skills/workflow/scripts/list-workflows.sh +91 -0
- package/pennyfarthing-dist/skills/workflow/scripts/resume-workflow.sh +163 -0
- package/pennyfarthing-dist/skills/workflow/scripts/show-workflow.sh +138 -0
- package/pennyfarthing-dist/skills/workflow/scripts/start-workflow.sh +273 -0
- package/pennyfarthing-dist/skills/workflow/scripts/workflow-status.sh +167 -0
- package/pennyfarthing-dist/skills/workflow/skill.md +337 -0
- package/pennyfarthing-dist/skills/yq/SKILL.md +264 -0
- package/pennyfarthing-dist/templates/LEADERBOARD.schema.yaml +187 -0
- package/pennyfarthing-dist/templates/LEADERBOARD.template.md +59 -0
- package/pennyfarthing-dist/templates/agent-scopes.yaml.template +276 -0
- package/pennyfarthing-dist/templates/pennyfarthing-settings.yaml.template +61 -0
- package/pennyfarthing-dist/templates/persona-config.yaml.template +22 -0
- package/pennyfarthing-dist/templates/preferences.yaml.template +15 -0
- package/pennyfarthing-dist/templates/settings.local.json.template +90 -0
- package/pennyfarthing-dist/templates/setup-env.sh.template +18 -0
- package/pennyfarthing-dist/templates/shared-context.md.template +70 -0
- package/pennyfarthing-dist/templates/sidecar/decisions.md.template +40 -0
- package/pennyfarthing-dist/templates/sidecar/gotchas.md.template +37 -0
- package/pennyfarthing-dist/templates/sidecar/patterns.md.template +34 -0
- package/pennyfarthing-dist/workflows/agent-docs.yaml +70 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-01-initialize.md +101 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-01b-continue.md +93 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-02-context.md +115 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-03-patterns.md +133 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-04-components.md +138 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-05-interfaces.md +133 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-06-risks.md +142 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-07-document.md +160 -0
- package/pennyfarthing-dist/workflows/architecture/templates/architecture-decision.md +102 -0
- package/pennyfarthing-dist/workflows/architecture.yaml +65 -0
- package/pennyfarthing-dist/workflows/bdd.yaml +60 -0
- package/pennyfarthing-dist/workflows/brainstorming/brain-methods.csv +62 -0
- package/pennyfarthing-dist/workflows/brainstorming/checklist.md +44 -0
- package/pennyfarthing-dist/workflows/brainstorming/instructions.md +736 -0
- package/pennyfarthing-dist/workflows/brainstorming/workflow.yaml +49 -0
- package/pennyfarthing-dist/workflows/code-review/checklist.md +23 -0
- package/pennyfarthing-dist/workflows/code-review/instructions.md +234 -0
- package/pennyfarthing-dist/workflows/code-review/workflow.yaml +51 -0
- package/pennyfarthing-dist/workflows/dev-story/checklist.md +80 -0
- package/pennyfarthing-dist/workflows/dev-story/instructions.xml +410 -0
- package/pennyfarthing-dist/workflows/dev-story/workflow.yaml +50 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-01-validate-prerequisites.md +256 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-02-design-epics.md +233 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-03-create-stories.md +272 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-04-final-validation.md +153 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +122 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/templates/epics-template.md +57 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/workflow.yaml +28 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-01-document-discovery.md +190 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-02-prd-analysis.md +178 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-03-epic-coverage-validation.md +179 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-04-ux-alignment.md +139 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-05-epic-quality-review.md +252 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-06-final-assessment.md +133 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/templates/readiness-report-template.md +4 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/workflow.yaml +40 -0
- package/pennyfarthing-dist/workflows/prd/data/domain-complexity.csv +13 -0
- package/pennyfarthing-dist/workflows/prd/data/prd-purpose.md +197 -0
- package/pennyfarthing-dist/workflows/prd/data/project-types.csv +11 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-01-init.md +191 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-01b-continue.md +153 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-02-discovery.md +224 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-03-success.md +226 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-04-journeys.md +213 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-05-domain.md +207 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-06-innovation.md +226 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-07-project-type.md +237 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-08-scoping.md +228 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-09-functional.md +231 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-10-nonfunctional.md +242 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-11-polish.md +217 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-12-complete.md +180 -0
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01-discovery.md +247 -0
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-02-review.md +249 -0
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-03-edit.md +253 -0
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-04-complete.md +168 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-01-discovery.md +218 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02-format-detection.md +191 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02b-parity-check.md +209 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-03-density-validation.md +174 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-05-measurability-validation.md +228 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-06-traceability-validation.md +217 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-09-project-type-validation.md +263 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-10-smart-validation.md +209 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-12-completeness-validation.md +242 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-13-report-complete.md +232 -0
- package/pennyfarthing-dist/workflows/prd/templates/prd-template.md +10 -0
- package/pennyfarthing-dist/workflows/prd/workflow.yaml +42 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-01-init.md +177 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-01b-continue.md +161 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-02-vision.md +199 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-03-users.md +202 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-04-metrics.md +205 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-05-scope.md +219 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-06-complete.md +194 -0
- package/pennyfarthing-dist/workflows/product-brief/templates/product-brief.template.md +10 -0
- package/pennyfarthing-dist/workflows/product-brief/workflow.yaml +31 -0
- package/pennyfarthing-dist/workflows/project-context/project-context-template.md +21 -0
- package/pennyfarthing-dist/workflows/project-context/steps/step-01-discover.md +184 -0
- package/pennyfarthing-dist/workflows/project-context/steps/step-02-generate.md +318 -0
- package/pennyfarthing-dist/workflows/project-context/steps/step-03-complete.md +278 -0
- package/pennyfarthing-dist/workflows/project-context/workflow.yaml +27 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-01-mode-detection.md +156 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-02-context-gathering.md +120 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-03-execute.md +113 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-04-self-check.md +113 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-05-adversarial-review.md +106 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-06-resolve-findings.md +140 -0
- package/pennyfarthing-dist/workflows/quick-dev/workflow.yaml +27 -0
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +189 -0
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +144 -0
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +128 -0
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +191 -0
- package/pennyfarthing-dist/workflows/quick-spec/tech-spec-template.md +74 -0
- package/pennyfarthing-dist/workflows/quick-spec/workflow.yaml +27 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-01-init.md +137 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-02-domain-analysis.md +229 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-03-competitive-landscape.md +238 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-04-regulatory-focus.md +206 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-05-technical-trends.md +234 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-06-research-synthesis.md +443 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-01-init.md +182 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-behavior.md +237 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-insights.md +200 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-03-customer-pain-points.md +249 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-04-customer-decisions.md +259 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-05-competitive-analysis.md +177 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-06-research-completion.md +475 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-01-init.md +137 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-02-technical-overview.md +239 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-03-integration-patterns.md +248 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-04-architectural-patterns.md +202 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-05-implementation-research.md +239 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-06-research-synthesis.md +486 -0
- package/pennyfarthing-dist/workflows/research/templates/research.template.md +29 -0
- package/pennyfarthing-dist/workflows/research/workflow.yaml +45 -0
- package/pennyfarthing-dist/workflows/retrospective/checklist.md +31 -0
- package/pennyfarthing-dist/workflows/retrospective/instructions.md +1443 -0
- package/pennyfarthing-dist/workflows/retrospective/workflow.yaml +50 -0
- package/pennyfarthing-dist/workflows/sprint-planning/checklist.md +33 -0
- package/pennyfarthing-dist/workflows/sprint-planning/sprint-status-template.yaml +55 -0
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-01-parse-epic-files.md +54 -0
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-02-build-sprint-status.md +44 -0
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-03-status-detection.md +64 -0
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-04-generate-status-file.md +73 -0
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-05-validate-and-report.md +56 -0
- package/pennyfarthing-dist/workflows/sprint-planning/workflow.yaml +34 -0
- package/pennyfarthing-dist/workflows/tdd.yaml +50 -0
- package/pennyfarthing-dist/workflows/trivial.yaml +40 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-01-init.md +135 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-01b-continue.md +127 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-02-discovery.md +190 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-03-core-experience.md +216 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-04-emotional-response.md +219 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-05-inspiration.md +234 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-06-design-system.md +252 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-07-defining-experience.md +254 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-08-visual-foundation.md +224 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-09-design-directions.md +224 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-10-user-journeys.md +241 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-11-component-strategy.md +248 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-12-ux-patterns.md +237 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-13-responsive-accessibility.md +264 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-14-complete.md +228 -0
- package/pennyfarthing-dist/workflows/ux-design/ux-design-template.md +13 -0
- package/pennyfarthing-dist/workflows/ux-design/workflow.yaml +41 -0
- package/dist/cli/utils/files.js +0 -179
- package/dist/cli/utils/manifest.js +0 -93
- package/dist/cli/utils/version.js +0 -70
- package/dist/index.js +0 -48
- package/dist/permissions/index.js +0 -16
- package/dist/scripts/job-fair-aggregator.js +0 -690
- package/dist/workflow/index.js +0 -31
- /package/{bin → packages/core/bin}/pennyfarthing.js +0 -0
|
@@ -0,0 +1,878 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Story 32-4: BMAD Project Context Reader
|
|
3
|
+
*
|
|
4
|
+
* These tests define the contract for parsing BMAD project-context.md files.
|
|
5
|
+
* Dev will implement parseBmadContext() to pass these tests.
|
|
6
|
+
*
|
|
7
|
+
* BMAD project-context format:
|
|
8
|
+
* - Required: ## Overview, ## Technology Stack, ## Critical Implementation Rules
|
|
9
|
+
* - Optional: ## Project Structure, ## Coding Standards, ## AI Agent Guidance,
|
|
10
|
+
* ## External Dependencies, ## Environment Setup
|
|
11
|
+
*
|
|
12
|
+
* Run with: npm test
|
|
13
|
+
*/
|
|
14
|
+
import { describe, it } from 'node:test';
|
|
15
|
+
import assert from 'node:assert';
|
|
16
|
+
// Import the parser function that Dev will implement
|
|
17
|
+
// This import will fail until the module is implemented
|
|
18
|
+
import { parseBmadContext, } from './context-reader.js';
|
|
19
|
+
// =============================================================================
|
|
20
|
+
// TEST DATA: Valid BMAD project-context examples
|
|
21
|
+
// =============================================================================
|
|
22
|
+
const MINIMAL_VALID_CONTEXT = `# Project Context
|
|
23
|
+
|
|
24
|
+
## Overview
|
|
25
|
+
A simple test project for validating the context parser.
|
|
26
|
+
|
|
27
|
+
## Technology Stack
|
|
28
|
+
|
|
29
|
+
### Frontend
|
|
30
|
+
- **Framework:** React
|
|
31
|
+
- **Language:** TypeScript
|
|
32
|
+
|
|
33
|
+
### Backend
|
|
34
|
+
- **Language:** Node.js
|
|
35
|
+
- **Framework:** Express
|
|
36
|
+
|
|
37
|
+
## Critical Implementation Rules
|
|
38
|
+
|
|
39
|
+
1. **Test First:** Always write tests before implementation.
|
|
40
|
+
`;
|
|
41
|
+
const COMPLETE_CONTEXT = `# Project Context
|
|
42
|
+
|
|
43
|
+
## Overview
|
|
44
|
+
TaskFlow is a collaborative task management application designed for small teams.
|
|
45
|
+
It enables real-time task tracking, team collaboration, and progress visualization.
|
|
46
|
+
The application serves 5,000+ daily active users and processes 50,000+ task updates per day.
|
|
47
|
+
|
|
48
|
+
## Technology Stack
|
|
49
|
+
|
|
50
|
+
### Frontend
|
|
51
|
+
- **Framework:** React 18 with hooks
|
|
52
|
+
- **Language:** TypeScript 5.0+
|
|
53
|
+
- **State Management:** Zustand for global state, React Query for server state
|
|
54
|
+
- **Styling:** Tailwind CSS with custom design tokens
|
|
55
|
+
- **Build Tool:** Vite 5
|
|
56
|
+
|
|
57
|
+
### Backend
|
|
58
|
+
- **Language:** Go 1.21+
|
|
59
|
+
- **Framework:** Gin with custom middleware
|
|
60
|
+
- **Database:** PostgreSQL 15 with pgx driver
|
|
61
|
+
- **Cache:** Redis 7 for sessions and real-time updates
|
|
62
|
+
- **API Style:** REST with OpenAPI 3.0 documentation
|
|
63
|
+
|
|
64
|
+
### Infrastructure
|
|
65
|
+
- **Cloud Provider:** AWS (us-east-1 primary, us-west-2 DR)
|
|
66
|
+
- **Container Runtime:** Docker with multi-stage builds
|
|
67
|
+
- **Orchestration:** ECS Fargate
|
|
68
|
+
- **CI/CD:** GitHub Actions with environment-based deployments
|
|
69
|
+
|
|
70
|
+
## Project Structure
|
|
71
|
+
|
|
72
|
+
\`\`\`
|
|
73
|
+
taskflow/
|
|
74
|
+
├── api/ # Go backend
|
|
75
|
+
│ ├── cmd/server/ # Application entrypoint
|
|
76
|
+
│ └── internal/ # Internal packages
|
|
77
|
+
├── web/ # React frontend
|
|
78
|
+
└── docs/ # Documentation
|
|
79
|
+
\`\`\`
|
|
80
|
+
|
|
81
|
+
## Critical Implementation Rules
|
|
82
|
+
|
|
83
|
+
1. **No Raw SQL:** Always use parameterized queries via repository layer. SQL injection is a critical vulnerability.
|
|
84
|
+
|
|
85
|
+
2. **Auth Required by Default:** All API endpoints require authentication unless explicitly marked public. Use the \`@public\` decorator for exceptions.
|
|
86
|
+
|
|
87
|
+
3. **Soft Deletes Only:** Never hard-delete user data. Use \`deleted_at\` timestamp for all deletions. Required for audit compliance.
|
|
88
|
+
|
|
89
|
+
4. **Rate Limiting:** All public endpoints must have rate limiting. Default: 100 req/min per IP.
|
|
90
|
+
|
|
91
|
+
5. **Error Codes:** All API errors must use standard error codes from \`pkg/errors/codes.go\`. Never expose internal error messages to clients.
|
|
92
|
+
|
|
93
|
+
## Coding Standards
|
|
94
|
+
|
|
95
|
+
### Naming Conventions
|
|
96
|
+
- Go: Follow effective Go (MixedCaps for exports, mixedCaps for internal)
|
|
97
|
+
- React: PascalCase for components, camelCase for hooks (useXxx)
|
|
98
|
+
- Database: snake_case for all columns and tables
|
|
99
|
+
- API: camelCase for JSON fields
|
|
100
|
+
|
|
101
|
+
### Error Handling
|
|
102
|
+
- Go: Wrap errors with context using \`fmt.Errorf("operation: %w", err)\`
|
|
103
|
+
- React: Use error boundaries for component failures
|
|
104
|
+
- API: Return structured error responses with code, message, and details
|
|
105
|
+
|
|
106
|
+
### Testing Requirements
|
|
107
|
+
- Unit test coverage: minimum 80% for services layer
|
|
108
|
+
- Integration tests required for all API endpoints
|
|
109
|
+
- E2E tests for critical user journeys (login, task CRUD)
|
|
110
|
+
|
|
111
|
+
## AI Agent Guidance
|
|
112
|
+
|
|
113
|
+
### Do
|
|
114
|
+
- Read existing code patterns before implementing new features
|
|
115
|
+
- Follow the existing project structure - don't create new top-level directories
|
|
116
|
+
- Use existing utilities from \`pkg/\` before creating new ones
|
|
117
|
+
- Write tests alongside implementation, not after
|
|
118
|
+
- Check \`docs/adr/\` for architectural decision records before major changes
|
|
119
|
+
|
|
120
|
+
### Don't
|
|
121
|
+
- Don't add new dependencies without checking for existing alternatives
|
|
122
|
+
- Don't modify database schema without creating a migration
|
|
123
|
+
- Don't bypass the repository layer for database access
|
|
124
|
+
- Don't use \`any\` type in TypeScript - always define proper types
|
|
125
|
+
|
|
126
|
+
### Context Loading
|
|
127
|
+
For additional context, check:
|
|
128
|
+
- \`docs/adr/\` - Architectural decisions
|
|
129
|
+
- \`docs/api/\` - API specifications
|
|
130
|
+
- \`.github/CONTRIBUTING.md\` - Contribution guidelines
|
|
131
|
+
|
|
132
|
+
## External Dependencies
|
|
133
|
+
|
|
134
|
+
| Dependency | Purpose | Documentation |
|
|
135
|
+
|------------|---------|---------------|
|
|
136
|
+
| Zustand | Frontend state management | https://zustand-demo.pmnd.rs/ |
|
|
137
|
+
| React Query | Server state & caching | https://tanstack.com/query |
|
|
138
|
+
| Gin | HTTP router & middleware | https://gin-gonic.com/docs/ |
|
|
139
|
+
| pgx | PostgreSQL driver | https://github.com/jackc/pgx |
|
|
140
|
+
| Zap | Structured logging | https://pkg.go.dev/go.uber.org/zap |
|
|
141
|
+
|
|
142
|
+
## Environment Setup
|
|
143
|
+
|
|
144
|
+
1. Install dependencies:
|
|
145
|
+
\`\`\`bash
|
|
146
|
+
cd api && go mod download
|
|
147
|
+
cd web && npm install
|
|
148
|
+
\`\`\`
|
|
149
|
+
|
|
150
|
+
2. Set up local database:
|
|
151
|
+
\`\`\`bash
|
|
152
|
+
docker-compose up -d postgres redis
|
|
153
|
+
make migrate
|
|
154
|
+
\`\`\`
|
|
155
|
+
`;
|
|
156
|
+
const CONTEXT_WITHOUT_INFRASTRUCTURE = `# Project Context
|
|
157
|
+
|
|
158
|
+
## Overview
|
|
159
|
+
A frontend-only project with no backend.
|
|
160
|
+
|
|
161
|
+
## Technology Stack
|
|
162
|
+
|
|
163
|
+
### Frontend
|
|
164
|
+
- **Framework:** Vue 3
|
|
165
|
+
- **Language:** TypeScript
|
|
166
|
+
- **Build Tool:** Vite
|
|
167
|
+
|
|
168
|
+
## Critical Implementation Rules
|
|
169
|
+
|
|
170
|
+
1. **Component Isolation:** Each component should be self-contained.
|
|
171
|
+
`;
|
|
172
|
+
const CONTEXT_WITH_MULTILINE_RULES = `# Project Context
|
|
173
|
+
|
|
174
|
+
## Overview
|
|
175
|
+
Project with multi-line rule descriptions.
|
|
176
|
+
|
|
177
|
+
## Technology Stack
|
|
178
|
+
|
|
179
|
+
### Backend
|
|
180
|
+
- **Language:** Python
|
|
181
|
+
- **Framework:** FastAPI
|
|
182
|
+
|
|
183
|
+
## Critical Implementation Rules
|
|
184
|
+
|
|
185
|
+
1. **Database Access:** All database queries must go through the ORM layer.
|
|
186
|
+
Never write raw SQL. This ensures we maintain proper query logging
|
|
187
|
+
and can easily switch databases if needed.
|
|
188
|
+
|
|
189
|
+
2. **Error Handling:** Always catch exceptions at the controller layer.
|
|
190
|
+
Log the full stack trace but return sanitized error messages to clients.
|
|
191
|
+
Use error codes from the errors module.
|
|
192
|
+
|
|
193
|
+
3. **Simple Rule:** Keep it simple.
|
|
194
|
+
`;
|
|
195
|
+
// =============================================================================
|
|
196
|
+
// AC1: Detects project-context.md in project
|
|
197
|
+
// =============================================================================
|
|
198
|
+
describe('BMAD Context Reader (32-4)', () => {
|
|
199
|
+
describe('AC1: File detection and basic parsing', () => {
|
|
200
|
+
it('should parse a minimal valid context file', () => {
|
|
201
|
+
const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
|
|
202
|
+
assert.strictEqual(result.success, true, 'Should successfully parse minimal context');
|
|
203
|
+
assert.ok(result.context, 'Should return context object');
|
|
204
|
+
});
|
|
205
|
+
it('should parse a complete context file with all sections', () => {
|
|
206
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
207
|
+
assert.strictEqual(result.success, true, 'Should successfully parse complete context');
|
|
208
|
+
assert.ok(result.context, 'Should return context object');
|
|
209
|
+
});
|
|
210
|
+
it('should extract overview section', () => {
|
|
211
|
+
const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
|
|
212
|
+
assert.strictEqual(result.success, true);
|
|
213
|
+
assert.ok(result.context?.overview);
|
|
214
|
+
assert.ok(result.context?.overview.includes('simple test project'));
|
|
215
|
+
});
|
|
216
|
+
it('should preserve multi-line overview content', () => {
|
|
217
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
218
|
+
assert.strictEqual(result.success, true);
|
|
219
|
+
assert.ok(result.context?.overview.includes('TaskFlow'));
|
|
220
|
+
assert.ok(result.context?.overview.includes('5,000+ daily active users'));
|
|
221
|
+
});
|
|
222
|
+
it('should return errors for empty content', () => {
|
|
223
|
+
const result = parseBmadContext('');
|
|
224
|
+
assert.strictEqual(result.success, false);
|
|
225
|
+
assert.ok(result.errors && result.errors.length > 0);
|
|
226
|
+
});
|
|
227
|
+
it('should return errors for whitespace-only content', () => {
|
|
228
|
+
const result = parseBmadContext(' \n\n \t ');
|
|
229
|
+
assert.strictEqual(result.success, false);
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
// ===========================================================================
|
|
233
|
+
// AC2: Parses technology stack section
|
|
234
|
+
// ===========================================================================
|
|
235
|
+
describe('AC2: Technology Stack parsing', () => {
|
|
236
|
+
describe('Frontend subsection', () => {
|
|
237
|
+
it('should extract frontend framework', () => {
|
|
238
|
+
const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
|
|
239
|
+
assert.strictEqual(result.success, true);
|
|
240
|
+
assert.strictEqual(result.context?.technologyStack.frontend?.framework, 'React');
|
|
241
|
+
});
|
|
242
|
+
it('should extract frontend language', () => {
|
|
243
|
+
const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
|
|
244
|
+
assert.strictEqual(result.success, true);
|
|
245
|
+
assert.strictEqual(result.context?.technologyStack.frontend?.language, 'TypeScript');
|
|
246
|
+
});
|
|
247
|
+
it('should extract all frontend fields when present', () => {
|
|
248
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
249
|
+
assert.strictEqual(result.success, true);
|
|
250
|
+
const frontend = result.context?.technologyStack.frontend;
|
|
251
|
+
assert.strictEqual(frontend?.framework, 'React 18 with hooks');
|
|
252
|
+
assert.strictEqual(frontend?.language, 'TypeScript 5.0+');
|
|
253
|
+
assert.strictEqual(frontend?.stateManagement, 'Zustand for global state, React Query for server state');
|
|
254
|
+
assert.strictEqual(frontend?.styling, 'Tailwind CSS with custom design tokens');
|
|
255
|
+
assert.strictEqual(frontend?.buildTool, 'Vite 5');
|
|
256
|
+
});
|
|
257
|
+
it('should return undefined for missing frontend section', () => {
|
|
258
|
+
const context = `# Project Context
|
|
259
|
+
|
|
260
|
+
## Overview
|
|
261
|
+
Backend only project.
|
|
262
|
+
|
|
263
|
+
## Technology Stack
|
|
264
|
+
|
|
265
|
+
### Backend
|
|
266
|
+
- **Language:** Go
|
|
267
|
+
- **Framework:** Gin
|
|
268
|
+
|
|
269
|
+
## Critical Implementation Rules
|
|
270
|
+
|
|
271
|
+
1. **Rule:** Description.
|
|
272
|
+
`;
|
|
273
|
+
const result = parseBmadContext(context);
|
|
274
|
+
assert.strictEqual(result.success, true);
|
|
275
|
+
assert.strictEqual(result.context?.technologyStack.frontend, undefined);
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
describe('Backend subsection', () => {
|
|
279
|
+
it('should extract backend language', () => {
|
|
280
|
+
const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
|
|
281
|
+
assert.strictEqual(result.success, true);
|
|
282
|
+
assert.strictEqual(result.context?.technologyStack.backend?.language, 'Node.js');
|
|
283
|
+
});
|
|
284
|
+
it('should extract backend framework', () => {
|
|
285
|
+
const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
|
|
286
|
+
assert.strictEqual(result.success, true);
|
|
287
|
+
assert.strictEqual(result.context?.technologyStack.backend?.framework, 'Express');
|
|
288
|
+
});
|
|
289
|
+
it('should extract all backend fields when present', () => {
|
|
290
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
291
|
+
assert.strictEqual(result.success, true);
|
|
292
|
+
const backend = result.context?.technologyStack.backend;
|
|
293
|
+
assert.strictEqual(backend?.language, 'Go 1.21+');
|
|
294
|
+
assert.strictEqual(backend?.framework, 'Gin with custom middleware');
|
|
295
|
+
assert.strictEqual(backend?.database, 'PostgreSQL 15 with pgx driver');
|
|
296
|
+
assert.strictEqual(backend?.cache, 'Redis 7 for sessions and real-time updates');
|
|
297
|
+
assert.strictEqual(backend?.apiStyle, 'REST with OpenAPI 3.0 documentation');
|
|
298
|
+
});
|
|
299
|
+
it('should return undefined for missing backend section', () => {
|
|
300
|
+
const result = parseBmadContext(CONTEXT_WITHOUT_INFRASTRUCTURE);
|
|
301
|
+
assert.strictEqual(result.success, true);
|
|
302
|
+
assert.strictEqual(result.context?.technologyStack.backend, undefined);
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
describe('Infrastructure subsection', () => {
|
|
306
|
+
it('should extract all infrastructure fields when present', () => {
|
|
307
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
308
|
+
assert.strictEqual(result.success, true);
|
|
309
|
+
const infra = result.context?.technologyStack.infrastructure;
|
|
310
|
+
assert.strictEqual(infra?.cloudProvider, 'AWS (us-east-1 primary, us-west-2 DR)');
|
|
311
|
+
assert.strictEqual(infra?.containerRuntime, 'Docker with multi-stage builds');
|
|
312
|
+
assert.strictEqual(infra?.orchestration, 'ECS Fargate');
|
|
313
|
+
assert.strictEqual(infra?.ciCd, 'GitHub Actions with environment-based deployments');
|
|
314
|
+
});
|
|
315
|
+
it('should return undefined for missing infrastructure section', () => {
|
|
316
|
+
const result = parseBmadContext(CONTEXT_WITHOUT_INFRASTRUCTURE);
|
|
317
|
+
assert.strictEqual(result.success, true);
|
|
318
|
+
assert.strictEqual(result.context?.technologyStack.infrastructure, undefined);
|
|
319
|
+
});
|
|
320
|
+
});
|
|
321
|
+
describe('Technology Stack edge cases', () => {
|
|
322
|
+
it('should handle technology stack with only one subsection', () => {
|
|
323
|
+
const context = `# Project Context
|
|
324
|
+
|
|
325
|
+
## Overview
|
|
326
|
+
Minimal stack project.
|
|
327
|
+
|
|
328
|
+
## Technology Stack
|
|
329
|
+
|
|
330
|
+
### Backend
|
|
331
|
+
- **Language:** Rust
|
|
332
|
+
|
|
333
|
+
## Critical Implementation Rules
|
|
334
|
+
|
|
335
|
+
1. **Rule:** Description.
|
|
336
|
+
`;
|
|
337
|
+
const result = parseBmadContext(context);
|
|
338
|
+
assert.strictEqual(result.success, true);
|
|
339
|
+
assert.strictEqual(result.context?.technologyStack.backend?.language, 'Rust');
|
|
340
|
+
assert.strictEqual(result.context?.technologyStack.frontend, undefined);
|
|
341
|
+
assert.strictEqual(result.context?.technologyStack.infrastructure, undefined);
|
|
342
|
+
});
|
|
343
|
+
it('should handle fields with extra whitespace', () => {
|
|
344
|
+
const context = `# Project Context
|
|
345
|
+
|
|
346
|
+
## Overview
|
|
347
|
+
Test project.
|
|
348
|
+
|
|
349
|
+
## Technology Stack
|
|
350
|
+
|
|
351
|
+
### Frontend
|
|
352
|
+
- **Framework:** React
|
|
353
|
+
- **Language:** TypeScript
|
|
354
|
+
|
|
355
|
+
## Critical Implementation Rules
|
|
356
|
+
|
|
357
|
+
1. **Rule:** Description.
|
|
358
|
+
`;
|
|
359
|
+
const result = parseBmadContext(context);
|
|
360
|
+
assert.strictEqual(result.success, true);
|
|
361
|
+
assert.strictEqual(result.context?.technologyStack.frontend?.framework, 'React');
|
|
362
|
+
assert.strictEqual(result.context?.technologyStack.frontend?.language, 'TypeScript');
|
|
363
|
+
});
|
|
364
|
+
it('should handle fields without bold markers', () => {
|
|
365
|
+
const context = `# Project Context
|
|
366
|
+
|
|
367
|
+
## Overview
|
|
368
|
+
Test project without bold.
|
|
369
|
+
|
|
370
|
+
## Technology Stack
|
|
371
|
+
|
|
372
|
+
### Frontend
|
|
373
|
+
- Framework: React
|
|
374
|
+
- Language: TypeScript
|
|
375
|
+
|
|
376
|
+
## Critical Implementation Rules
|
|
377
|
+
|
|
378
|
+
1. **Rule:** Description.
|
|
379
|
+
`;
|
|
380
|
+
const result = parseBmadContext(context);
|
|
381
|
+
assert.strictEqual(result.success, true);
|
|
382
|
+
// Should still parse even without bold markers
|
|
383
|
+
assert.strictEqual(result.context?.technologyStack.frontend?.framework, 'React');
|
|
384
|
+
assert.strictEqual(result.context?.technologyStack.frontend?.language, 'TypeScript');
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
// ===========================================================================
|
|
389
|
+
// AC3: Extracts implementation rules
|
|
390
|
+
// ===========================================================================
|
|
391
|
+
describe('AC3: Critical Implementation Rules parsing', () => {
|
|
392
|
+
it('should extract single rule', () => {
|
|
393
|
+
const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
|
|
394
|
+
assert.strictEqual(result.success, true);
|
|
395
|
+
assert.strictEqual(result.context?.implementationRules.length, 1);
|
|
396
|
+
const rule = result.context?.implementationRules[0];
|
|
397
|
+
assert.strictEqual(rule?.number, 1);
|
|
398
|
+
assert.strictEqual(rule?.title, 'Test First');
|
|
399
|
+
assert.strictEqual(rule?.description, 'Always write tests before implementation.');
|
|
400
|
+
});
|
|
401
|
+
it('should extract multiple rules', () => {
|
|
402
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
403
|
+
assert.strictEqual(result.success, true);
|
|
404
|
+
assert.strictEqual(result.context?.implementationRules.length, 5);
|
|
405
|
+
});
|
|
406
|
+
it('should extract rule numbers correctly', () => {
|
|
407
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
408
|
+
assert.strictEqual(result.success, true);
|
|
409
|
+
assert.strictEqual(result.context?.implementationRules[0]?.number, 1);
|
|
410
|
+
assert.strictEqual(result.context?.implementationRules[1]?.number, 2);
|
|
411
|
+
assert.strictEqual(result.context?.implementationRules[4]?.number, 5);
|
|
412
|
+
});
|
|
413
|
+
it('should extract rule titles correctly', () => {
|
|
414
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
415
|
+
assert.strictEqual(result.success, true);
|
|
416
|
+
assert.strictEqual(result.context?.implementationRules[0]?.title, 'No Raw SQL');
|
|
417
|
+
assert.strictEqual(result.context?.implementationRules[1]?.title, 'Auth Required by Default');
|
|
418
|
+
assert.strictEqual(result.context?.implementationRules[2]?.title, 'Soft Deletes Only');
|
|
419
|
+
});
|
|
420
|
+
it('should extract rule descriptions correctly', () => {
|
|
421
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
422
|
+
assert.strictEqual(result.success, true);
|
|
423
|
+
const rule = result.context?.implementationRules[0];
|
|
424
|
+
assert.ok(rule?.description.includes('parameterized queries'));
|
|
425
|
+
assert.ok(rule?.description.includes('SQL injection'));
|
|
426
|
+
});
|
|
427
|
+
it('should handle multi-line rule descriptions', () => {
|
|
428
|
+
const result = parseBmadContext(CONTEXT_WITH_MULTILINE_RULES);
|
|
429
|
+
assert.strictEqual(result.success, true);
|
|
430
|
+
assert.strictEqual(result.context?.implementationRules.length, 3);
|
|
431
|
+
const rule1 = result.context?.implementationRules[0];
|
|
432
|
+
assert.strictEqual(rule1?.title, 'Database Access');
|
|
433
|
+
assert.ok(rule1?.description.includes('ORM layer'));
|
|
434
|
+
assert.ok(rule1?.description.includes('easily switch databases'));
|
|
435
|
+
const rule2 = result.context?.implementationRules[1];
|
|
436
|
+
assert.strictEqual(rule2?.title, 'Error Handling');
|
|
437
|
+
assert.ok(rule2?.description.includes('controller layer'));
|
|
438
|
+
assert.ok(rule2?.description.includes('sanitized error messages'));
|
|
439
|
+
});
|
|
440
|
+
it('should preserve inline code in rule descriptions', () => {
|
|
441
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
442
|
+
assert.strictEqual(result.success, true);
|
|
443
|
+
const rule2 = result.context?.implementationRules[1];
|
|
444
|
+
assert.ok(rule2?.description.includes('`@public`'));
|
|
445
|
+
});
|
|
446
|
+
it('should return empty array when rules section is missing', () => {
|
|
447
|
+
const context = `# Project Context
|
|
448
|
+
|
|
449
|
+
## Overview
|
|
450
|
+
No rules project.
|
|
451
|
+
|
|
452
|
+
## Technology Stack
|
|
453
|
+
|
|
454
|
+
### Frontend
|
|
455
|
+
- **Framework:** React
|
|
456
|
+
`;
|
|
457
|
+
const result = parseBmadContext(context);
|
|
458
|
+
// Missing Critical Implementation Rules should cause error (it's required)
|
|
459
|
+
assert.strictEqual(result.success, false);
|
|
460
|
+
assert.ok(result.errors?.some((e) => e.section === 'Critical Implementation Rules'));
|
|
461
|
+
});
|
|
462
|
+
it('should handle rules with special characters in title', () => {
|
|
463
|
+
const context = `# Project Context
|
|
464
|
+
|
|
465
|
+
## Overview
|
|
466
|
+
Test project.
|
|
467
|
+
|
|
468
|
+
## Technology Stack
|
|
469
|
+
|
|
470
|
+
### Frontend
|
|
471
|
+
- **Framework:** React
|
|
472
|
+
|
|
473
|
+
## Critical Implementation Rules
|
|
474
|
+
|
|
475
|
+
1. **API Versioning (v1/v2):** Support multiple API versions.
|
|
476
|
+
`;
|
|
477
|
+
const result = parseBmadContext(context);
|
|
478
|
+
assert.strictEqual(result.success, true);
|
|
479
|
+
assert.strictEqual(result.context?.implementationRules[0]?.title, 'API Versioning (v1/v2)');
|
|
480
|
+
});
|
|
481
|
+
});
|
|
482
|
+
// ===========================================================================
|
|
483
|
+
// AC4: Integrates with agent context loading - proper types and structure
|
|
484
|
+
// ===========================================================================
|
|
485
|
+
describe('AC4: Type structure and integration', () => {
|
|
486
|
+
it('should return success: true for valid context', () => {
|
|
487
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
488
|
+
assert.strictEqual(result.success, true);
|
|
489
|
+
assert.ok(result.context);
|
|
490
|
+
assert.strictEqual(result.errors, undefined);
|
|
491
|
+
});
|
|
492
|
+
it('should return success: false with errors for invalid context', () => {
|
|
493
|
+
const context = `# Project Context
|
|
494
|
+
|
|
495
|
+
## Overview
|
|
496
|
+
Missing required sections.
|
|
497
|
+
`;
|
|
498
|
+
const result = parseBmadContext(context);
|
|
499
|
+
assert.strictEqual(result.success, false);
|
|
500
|
+
assert.strictEqual(result.context, undefined);
|
|
501
|
+
assert.ok(result.errors && result.errors.length > 0);
|
|
502
|
+
});
|
|
503
|
+
it('should populate all BmadProjectContext fields', () => {
|
|
504
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
505
|
+
assert.strictEqual(result.success, true);
|
|
506
|
+
const context = result.context;
|
|
507
|
+
// Required fields
|
|
508
|
+
assert.strictEqual(typeof context.overview, 'string');
|
|
509
|
+
assert.ok(typeof context.technologyStack === 'object');
|
|
510
|
+
assert.ok(Array.isArray(context.implementationRules));
|
|
511
|
+
// Optional fields should be present when in content
|
|
512
|
+
assert.ok(context.projectStructure === undefined || typeof context.projectStructure === 'string');
|
|
513
|
+
assert.ok(context.codingStandards === undefined || typeof context.codingStandards === 'string');
|
|
514
|
+
assert.ok(context.aiAgentGuidance === undefined || typeof context.aiAgentGuidance === 'object');
|
|
515
|
+
});
|
|
516
|
+
it('should have correct TechnologyStack structure', () => {
|
|
517
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
518
|
+
assert.strictEqual(result.success, true);
|
|
519
|
+
const stack = result.context?.technologyStack;
|
|
520
|
+
// Frontend fields
|
|
521
|
+
if (stack.frontend) {
|
|
522
|
+
assert.ok(stack.frontend.framework === undefined || typeof stack.frontend.framework === 'string');
|
|
523
|
+
assert.ok(stack.frontend.language === undefined || typeof stack.frontend.language === 'string');
|
|
524
|
+
assert.ok(stack.frontend.stateManagement === undefined || typeof stack.frontend.stateManagement === 'string');
|
|
525
|
+
assert.ok(stack.frontend.styling === undefined || typeof stack.frontend.styling === 'string');
|
|
526
|
+
assert.ok(stack.frontend.buildTool === undefined || typeof stack.frontend.buildTool === 'string');
|
|
527
|
+
}
|
|
528
|
+
// Backend fields
|
|
529
|
+
if (stack.backend) {
|
|
530
|
+
assert.ok(stack.backend.language === undefined || typeof stack.backend.language === 'string');
|
|
531
|
+
assert.ok(stack.backend.framework === undefined || typeof stack.backend.framework === 'string');
|
|
532
|
+
assert.ok(stack.backend.database === undefined || typeof stack.backend.database === 'string');
|
|
533
|
+
assert.ok(stack.backend.cache === undefined || typeof stack.backend.cache === 'string');
|
|
534
|
+
assert.ok(stack.backend.apiStyle === undefined || typeof stack.backend.apiStyle === 'string');
|
|
535
|
+
}
|
|
536
|
+
// Infrastructure fields
|
|
537
|
+
if (stack.infrastructure) {
|
|
538
|
+
assert.ok(stack.infrastructure.cloudProvider === undefined || typeof stack.infrastructure.cloudProvider === 'string');
|
|
539
|
+
assert.ok(stack.infrastructure.containerRuntime === undefined || typeof stack.infrastructure.containerRuntime === 'string');
|
|
540
|
+
assert.ok(stack.infrastructure.orchestration === undefined || typeof stack.infrastructure.orchestration === 'string');
|
|
541
|
+
assert.ok(stack.infrastructure.ciCd === undefined || typeof stack.infrastructure.ciCd === 'string');
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
it('should have correct ImplementationRule structure', () => {
|
|
545
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
546
|
+
assert.strictEqual(result.success, true);
|
|
547
|
+
const rule = result.context?.implementationRules[0];
|
|
548
|
+
assert.strictEqual(typeof rule.number, 'number');
|
|
549
|
+
assert.strictEqual(typeof rule.title, 'string');
|
|
550
|
+
assert.strictEqual(typeof rule.description, 'string');
|
|
551
|
+
});
|
|
552
|
+
it('should include error details with section name', () => {
|
|
553
|
+
const context = `# Project Context
|
|
554
|
+
|
|
555
|
+
## Overview
|
|
556
|
+
Missing tech stack and rules.
|
|
557
|
+
`;
|
|
558
|
+
const result = parseBmadContext(context);
|
|
559
|
+
assert.strictEqual(result.success, false);
|
|
560
|
+
assert.ok(result.errors?.some((e) => e.section === 'Technology Stack'));
|
|
561
|
+
assert.ok(result.errors?.some((e) => e.section === 'Critical Implementation Rules'));
|
|
562
|
+
});
|
|
563
|
+
it('should accumulate multiple errors', () => {
|
|
564
|
+
const context = `# Project Context
|
|
565
|
+
`;
|
|
566
|
+
// Missing: Overview, Technology Stack, Critical Implementation Rules
|
|
567
|
+
const result = parseBmadContext(context);
|
|
568
|
+
assert.strictEqual(result.success, false);
|
|
569
|
+
assert.ok(result.errors && result.errors.length >= 3, 'Should report multiple errors');
|
|
570
|
+
});
|
|
571
|
+
});
|
|
572
|
+
// ===========================================================================
|
|
573
|
+
// AC5: Works alongside CLAUDE.md - optional sections and compatibility
|
|
574
|
+
// ===========================================================================
|
|
575
|
+
describe('AC5: Optional sections and CLAUDE.md compatibility', () => {
|
|
576
|
+
describe('Project Structure section', () => {
|
|
577
|
+
it('should extract project structure when present', () => {
|
|
578
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
579
|
+
assert.strictEqual(result.success, true);
|
|
580
|
+
assert.ok(result.context?.projectStructure);
|
|
581
|
+
assert.ok(result.context?.projectStructure?.includes('taskflow/'));
|
|
582
|
+
assert.ok(result.context?.projectStructure?.includes('api/'));
|
|
583
|
+
});
|
|
584
|
+
it('should return undefined when project structure missing', () => {
|
|
585
|
+
const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
|
|
586
|
+
assert.strictEqual(result.success, true);
|
|
587
|
+
assert.strictEqual(result.context?.projectStructure, undefined);
|
|
588
|
+
});
|
|
589
|
+
});
|
|
590
|
+
describe('Coding Standards section', () => {
|
|
591
|
+
it('should extract coding standards when present', () => {
|
|
592
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
593
|
+
assert.strictEqual(result.success, true);
|
|
594
|
+
assert.ok(result.context?.codingStandards);
|
|
595
|
+
assert.ok(result.context?.codingStandards?.includes('Naming Conventions'));
|
|
596
|
+
assert.ok(result.context?.codingStandards?.includes('Error Handling'));
|
|
597
|
+
});
|
|
598
|
+
it('should return undefined when coding standards missing', () => {
|
|
599
|
+
const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
|
|
600
|
+
assert.strictEqual(result.success, true);
|
|
601
|
+
assert.strictEqual(result.context?.codingStandards, undefined);
|
|
602
|
+
});
|
|
603
|
+
});
|
|
604
|
+
describe('AI Agent Guidance section', () => {
|
|
605
|
+
it('should extract AI agent guidance when present', () => {
|
|
606
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
607
|
+
assert.strictEqual(result.success, true);
|
|
608
|
+
assert.ok(result.context?.aiAgentGuidance);
|
|
609
|
+
});
|
|
610
|
+
it('should parse Do subsection', () => {
|
|
611
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
612
|
+
assert.strictEqual(result.success, true);
|
|
613
|
+
const guidance = result.context?.aiAgentGuidance;
|
|
614
|
+
assert.ok(guidance?.do);
|
|
615
|
+
assert.ok(Array.isArray(guidance?.do));
|
|
616
|
+
assert.ok(guidance?.do?.some((item) => item.includes('existing code patterns')));
|
|
617
|
+
});
|
|
618
|
+
it('should parse Don\'t subsection', () => {
|
|
619
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
620
|
+
assert.strictEqual(result.success, true);
|
|
621
|
+
const guidance = result.context?.aiAgentGuidance;
|
|
622
|
+
assert.ok(guidance?.dont);
|
|
623
|
+
assert.ok(Array.isArray(guidance?.dont));
|
|
624
|
+
assert.ok(guidance?.dont?.some((item) => item.includes('new dependencies')));
|
|
625
|
+
});
|
|
626
|
+
it('should parse Context Loading subsection', () => {
|
|
627
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
628
|
+
assert.strictEqual(result.success, true);
|
|
629
|
+
const guidance = result.context?.aiAgentGuidance;
|
|
630
|
+
assert.ok(guidance?.contextLoading);
|
|
631
|
+
assert.ok(guidance?.contextLoading?.includes('docs/adr/'));
|
|
632
|
+
});
|
|
633
|
+
it('should return undefined when AI guidance missing', () => {
|
|
634
|
+
const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
|
|
635
|
+
assert.strictEqual(result.success, true);
|
|
636
|
+
assert.strictEqual(result.context?.aiAgentGuidance, undefined);
|
|
637
|
+
});
|
|
638
|
+
});
|
|
639
|
+
describe('External Dependencies section', () => {
|
|
640
|
+
it('should extract external dependencies when present', () => {
|
|
641
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
642
|
+
assert.strictEqual(result.success, true);
|
|
643
|
+
assert.ok(result.context?.externalDependencies);
|
|
644
|
+
assert.ok(Array.isArray(result.context?.externalDependencies));
|
|
645
|
+
});
|
|
646
|
+
it('should parse dependency table rows', () => {
|
|
647
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
648
|
+
assert.strictEqual(result.success, true);
|
|
649
|
+
const deps = result.context?.externalDependencies;
|
|
650
|
+
assert.ok(deps && deps.length >= 5);
|
|
651
|
+
const zustand = deps?.find((d) => d.name === 'Zustand');
|
|
652
|
+
assert.ok(zustand);
|
|
653
|
+
assert.strictEqual(zustand?.purpose, 'Frontend state management');
|
|
654
|
+
assert.strictEqual(zustand?.documentation, 'https://zustand-demo.pmnd.rs/');
|
|
655
|
+
});
|
|
656
|
+
it('should return undefined when dependencies missing', () => {
|
|
657
|
+
const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
|
|
658
|
+
assert.strictEqual(result.success, true);
|
|
659
|
+
assert.strictEqual(result.context?.externalDependencies, undefined);
|
|
660
|
+
});
|
|
661
|
+
});
|
|
662
|
+
describe('Environment Setup section', () => {
|
|
663
|
+
it('should extract environment setup when present', () => {
|
|
664
|
+
const result = parseBmadContext(COMPLETE_CONTEXT);
|
|
665
|
+
assert.strictEqual(result.success, true);
|
|
666
|
+
assert.ok(result.context?.environmentSetup);
|
|
667
|
+
assert.ok(result.context?.environmentSetup?.includes('Install dependencies'));
|
|
668
|
+
assert.ok(result.context?.environmentSetup?.includes('docker-compose'));
|
|
669
|
+
});
|
|
670
|
+
it('should return undefined when environment setup missing', () => {
|
|
671
|
+
const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
|
|
672
|
+
assert.strictEqual(result.success, true);
|
|
673
|
+
assert.strictEqual(result.context?.environmentSetup, undefined);
|
|
674
|
+
});
|
|
675
|
+
});
|
|
676
|
+
describe('CLAUDE.md compatibility', () => {
|
|
677
|
+
it('should not conflict with CLAUDE.md section names', () => {
|
|
678
|
+
// CLAUDE.md uses sections like "## Build Commands", "## Architecture"
|
|
679
|
+
// Our context reader should ignore these and focus on BMAD sections
|
|
680
|
+
const context = `# Project Context
|
|
681
|
+
|
|
682
|
+
## Overview
|
|
683
|
+
Test project.
|
|
684
|
+
|
|
685
|
+
## Build Commands
|
|
686
|
+
This section should be ignored - it's CLAUDE.md format.
|
|
687
|
+
|
|
688
|
+
## Technology Stack
|
|
689
|
+
|
|
690
|
+
### Frontend
|
|
691
|
+
- **Framework:** React
|
|
692
|
+
|
|
693
|
+
## Critical Implementation Rules
|
|
694
|
+
|
|
695
|
+
1. **Rule:** Description.
|
|
696
|
+
`;
|
|
697
|
+
const result = parseBmadContext(context);
|
|
698
|
+
assert.strictEqual(result.success, true);
|
|
699
|
+
// Should not have "Build Commands" as a recognized section
|
|
700
|
+
assert.ok(result.context);
|
|
701
|
+
});
|
|
702
|
+
it('should parse context independently of CLAUDE.md', () => {
|
|
703
|
+
// The parser should work on project-context.md content alone
|
|
704
|
+
// without requiring CLAUDE.md to be present
|
|
705
|
+
const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
|
|
706
|
+
assert.strictEqual(result.success, true);
|
|
707
|
+
assert.ok(result.context);
|
|
708
|
+
});
|
|
709
|
+
});
|
|
710
|
+
});
|
|
711
|
+
// ===========================================================================
|
|
712
|
+
// Edge cases and error handling
|
|
713
|
+
// ===========================================================================
|
|
714
|
+
describe('Edge cases and error handling', () => {
|
|
715
|
+
it('should handle Windows line endings (CRLF)', () => {
|
|
716
|
+
const context = '# Project Context\r\n\r\n## Overview\r\nTest project.\r\n\r\n## Technology Stack\r\n\r\n### Frontend\r\n- **Framework:** React\r\n\r\n## Critical Implementation Rules\r\n\r\n1. **Rule:** Description.\r\n';
|
|
717
|
+
const result = parseBmadContext(context);
|
|
718
|
+
assert.strictEqual(result.success, true);
|
|
719
|
+
assert.strictEqual(result.context?.technologyStack.frontend?.framework, 'React');
|
|
720
|
+
});
|
|
721
|
+
it('should handle extra blank lines between sections', () => {
|
|
722
|
+
const context = `# Project Context
|
|
723
|
+
|
|
724
|
+
|
|
725
|
+
|
|
726
|
+
## Overview
|
|
727
|
+
|
|
728
|
+
Test project.
|
|
729
|
+
|
|
730
|
+
|
|
731
|
+
|
|
732
|
+
## Technology Stack
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
### Frontend
|
|
736
|
+
- **Framework:** React
|
|
737
|
+
|
|
738
|
+
|
|
739
|
+
|
|
740
|
+
## Critical Implementation Rules
|
|
741
|
+
|
|
742
|
+
|
|
743
|
+
1. **Rule:** Description.
|
|
744
|
+
|
|
745
|
+
`;
|
|
746
|
+
const result = parseBmadContext(context);
|
|
747
|
+
assert.strictEqual(result.success, true);
|
|
748
|
+
});
|
|
749
|
+
it('should handle section headers with extra spaces', () => {
|
|
750
|
+
const context = `# Project Context
|
|
751
|
+
|
|
752
|
+
## Overview
|
|
753
|
+
Test project.
|
|
754
|
+
|
|
755
|
+
## Technology Stack
|
|
756
|
+
|
|
757
|
+
### Frontend
|
|
758
|
+
- **Framework:** React
|
|
759
|
+
|
|
760
|
+
## Critical Implementation Rules
|
|
761
|
+
|
|
762
|
+
1. **Rule:** Description.
|
|
763
|
+
`;
|
|
764
|
+
const result = parseBmadContext(context);
|
|
765
|
+
assert.strictEqual(result.success, true);
|
|
766
|
+
});
|
|
767
|
+
it('should handle missing H1 header gracefully', () => {
|
|
768
|
+
const context = `## Overview
|
|
769
|
+
Test project without H1.
|
|
770
|
+
|
|
771
|
+
## Technology Stack
|
|
772
|
+
|
|
773
|
+
### Frontend
|
|
774
|
+
- **Framework:** React
|
|
775
|
+
|
|
776
|
+
## Critical Implementation Rules
|
|
777
|
+
|
|
778
|
+
1. **Rule:** Description.
|
|
779
|
+
`;
|
|
780
|
+
const result = parseBmadContext(context);
|
|
781
|
+
// Should still parse - H1 is just a title
|
|
782
|
+
assert.strictEqual(result.success, true);
|
|
783
|
+
});
|
|
784
|
+
it('should handle technology fields with colons in values', () => {
|
|
785
|
+
const context = `# Project Context
|
|
786
|
+
|
|
787
|
+
## Overview
|
|
788
|
+
Test project.
|
|
789
|
+
|
|
790
|
+
## Technology Stack
|
|
791
|
+
|
|
792
|
+
### Frontend
|
|
793
|
+
- **Framework:** React: The Modern Way
|
|
794
|
+
- **Language:** TypeScript: Strict Mode
|
|
795
|
+
|
|
796
|
+
## Critical Implementation Rules
|
|
797
|
+
|
|
798
|
+
1. **Rule:** Description.
|
|
799
|
+
`;
|
|
800
|
+
const result = parseBmadContext(context);
|
|
801
|
+
assert.strictEqual(result.success, true);
|
|
802
|
+
assert.strictEqual(result.context?.technologyStack.frontend?.framework, 'React: The Modern Way');
|
|
803
|
+
});
|
|
804
|
+
it('should handle empty Technology Stack section', () => {
|
|
805
|
+
const context = `# Project Context
|
|
806
|
+
|
|
807
|
+
## Overview
|
|
808
|
+
Test project.
|
|
809
|
+
|
|
810
|
+
## Technology Stack
|
|
811
|
+
|
|
812
|
+
## Critical Implementation Rules
|
|
813
|
+
|
|
814
|
+
1. **Rule:** Description.
|
|
815
|
+
`;
|
|
816
|
+
const result = parseBmadContext(context);
|
|
817
|
+
// Empty Technology Stack should result in empty object, not error
|
|
818
|
+
assert.strictEqual(result.success, true);
|
|
819
|
+
assert.ok(result.context?.technologyStack);
|
|
820
|
+
});
|
|
821
|
+
it('should handle rules without bold title format', () => {
|
|
822
|
+
const context = `# Project Context
|
|
823
|
+
|
|
824
|
+
## Overview
|
|
825
|
+
Test project.
|
|
826
|
+
|
|
827
|
+
## Technology Stack
|
|
828
|
+
|
|
829
|
+
### Frontend
|
|
830
|
+
- **Framework:** React
|
|
831
|
+
|
|
832
|
+
## Critical Implementation Rules
|
|
833
|
+
|
|
834
|
+
1. Simple Rule: This rule has no bold formatting.
|
|
835
|
+
2. Another Rule: Also without bold.
|
|
836
|
+
`;
|
|
837
|
+
const result = parseBmadContext(context);
|
|
838
|
+
assert.strictEqual(result.success, true);
|
|
839
|
+
// Should still parse rules even without bold
|
|
840
|
+
assert.ok(result.context && result.context.implementationRules.length >= 2);
|
|
841
|
+
});
|
|
842
|
+
it('should handle markdown code blocks in content', () => {
|
|
843
|
+
const context = `# Project Context
|
|
844
|
+
|
|
845
|
+
## Overview
|
|
846
|
+
Test project with code.
|
|
847
|
+
|
|
848
|
+
## Technology Stack
|
|
849
|
+
|
|
850
|
+
### Frontend
|
|
851
|
+
- **Framework:** React
|
|
852
|
+
|
|
853
|
+
## Critical Implementation Rules
|
|
854
|
+
|
|
855
|
+
1. **Code Rule:** Use this pattern:
|
|
856
|
+
\`\`\`typescript
|
|
857
|
+
const x = 1;
|
|
858
|
+
\`\`\`
|
|
859
|
+
`;
|
|
860
|
+
const result = parseBmadContext(context);
|
|
861
|
+
assert.strictEqual(result.success, true);
|
|
862
|
+
assert.ok(result.context?.implementationRules[0]?.description.includes('pattern'));
|
|
863
|
+
});
|
|
864
|
+
it('should handle content with no matching sections', () => {
|
|
865
|
+
const context = `# Random Document
|
|
866
|
+
|
|
867
|
+
This is not a BMAD project context file.
|
|
868
|
+
|
|
869
|
+
## Some Random Section
|
|
870
|
+
Content here.
|
|
871
|
+
`;
|
|
872
|
+
const result = parseBmadContext(context);
|
|
873
|
+
assert.strictEqual(result.success, false);
|
|
874
|
+
assert.ok(result.errors && result.errors.length > 0);
|
|
875
|
+
});
|
|
876
|
+
});
|
|
877
|
+
});
|
|
878
|
+
//# sourceMappingURL=context-reader.test.js.map
|