@pennyfarthing/core 6.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/README.md +293 -0
- package/package.json +58 -0
- package/packages/core/bin/pennyfarthing.js +14 -0
- 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 +191 -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 +243 -0
- package/packages/core/dist/cli/commands/cyclist.test.js.map +1 -0
- package/packages/core/dist/cli/commands/doctor.d.ts +9 -0
- package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/doctor.js +652 -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 +524 -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 +545 -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 +224 -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 +60 -0
- package/packages/core/dist/cli/utils/constants.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/constants.js +52 -0
- package/packages/core/dist/cli/utils/constants.js.map +1 -0
- package/packages/core/dist/cli/utils/files.d.ts +71 -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/packages/core/dist/cli/utils/manifest.d.ts +47 -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 +22 -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 +29 -0
- package/packages/core/dist/cli/utils/symlinks.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/symlinks.js +181 -0
- package/packages/core/dist/cli/utils/symlinks.js.map +1 -0
- package/packages/core/dist/cli/utils/themes.d.ts +104 -0
- package/packages/core/dist/cli/utils/themes.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/themes.js +393 -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 +144 -0
- package/packages/core/dist/cli/utils/themes.test.js.map +1 -0
- package/packages/core/dist/cli/utils/version.d.ts +10 -0
- package/packages/core/dist/cli/utils/version.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/version.js +63 -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 +154 -0
- package/packages/core/dist/cli/workspace.test.js.map +1 -0
- package/packages/core/dist/index.d.ts +6 -0
- package/packages/core/dist/index.d.ts.map +1 -0
- package/packages/core/dist/index.js +10 -0
- package/packages/core/dist/index.js.map +1 -0
- package/packages/core/dist/permissions/index.d.ts +9 -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/packages/core/dist/permissions/permission-schema.d.ts +89 -0
- package/packages/core/dist/permissions/permission-schema.d.ts.map +1 -0
- package/packages/core/dist/permissions/permission-schema.js +120 -0
- 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-faces.d.ts +10 -0
- package/packages/core/dist/scripts/generate-all-faces.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-all-faces.js +256 -0
- package/packages/core/dist/scripts/generate-all-faces.js.map +1 -0
- package/packages/core/dist/scripts/generate-all-faces.test.d.ts +17 -0
- package/packages/core/dist/scripts/generate-all-faces.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-all-faces.test.js +372 -0
- package/packages/core/dist/scripts/generate-all-faces.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-ascii-face.d.ts +52 -0
- package/packages/core/dist/scripts/generate-ascii-face.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-ascii-face.js +155 -0
- package/packages/core/dist/scripts/generate-ascii-face.js.map +1 -0
- package/packages/core/dist/scripts/generate-face.d.ts +52 -0
- package/packages/core/dist/scripts/generate-face.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-face.js +199 -0
- package/packages/core/dist/scripts/generate-face.js.map +1 -0
- package/packages/core/dist/scripts/generate-face.test.d.ts +13 -0
- package/packages/core/dist/scripts/generate-face.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-face.test.js +301 -0
- package/packages/core/dist/scripts/generate-face.test.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 +37 -0
- package/packages/core/dist/scripts/generate-spider.d.ts.map +1 -0
- package/packages/core/dist/scripts/generate-spider.js +315 -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 +269 -0
- package/packages/core/dist/scripts/generate-spider.test.js.map +1 -0
- package/packages/core/dist/scripts/job-fair-aggregator.d.ts +150 -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/generic-handoff.d.ts +235 -0
- package/packages/core/dist/workflow/generic-handoff.d.ts.map +1 -0
- package/packages/core/dist/workflow/generic-handoff.js +358 -0
- package/packages/core/dist/workflow/generic-handoff.js.map +1 -0
- package/packages/core/dist/workflow/generic-handoff.test.d.ts +21 -0
- package/packages/core/dist/workflow/generic-handoff.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/generic-handoff.test.js +499 -0
- package/packages/core/dist/workflow/generic-handoff.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/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/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/workflow-loader.d.ts +76 -0
- package/packages/core/dist/workflow/workflow-loader.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-loader.js +133 -0
- 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 +372 -0
- package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -0
- package/packages/core/dist/workflow/workflow-router.d.ts +55 -0
- package/packages/core/dist/workflow/workflow-router.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-router.js +245 -0
- 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/packages/core/dist/workflow/workflow-schema.d.ts +98 -0
- package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-schema.js +230 -0
- 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/pennyfarthing-dist/agents/README.md +397 -0
- package/pennyfarthing-dist/agents/architect.md +171 -0
- package/pennyfarthing-dist/agents/dev.md +225 -0
- package/pennyfarthing-dist/agents/devops.md +183 -0
- package/pennyfarthing-dist/agents/generic-handoff.md +451 -0
- package/pennyfarthing-dist/agents/generic-sm-finish.md +261 -0
- package/pennyfarthing-dist/agents/generic-sm-setup.md +214 -0
- package/pennyfarthing-dist/agents/orchestrator.md +316 -0
- package/pennyfarthing-dist/agents/pm.md +153 -0
- package/pennyfarthing-dist/agents/reviewer-preflight.md +224 -0
- package/pennyfarthing-dist/agents/reviewer.md +315 -0
- package/pennyfarthing-dist/agents/sm-file-summary.md +109 -0
- package/pennyfarthing-dist/agents/sm-handoff.md +97 -0
- package/pennyfarthing-dist/agents/sm.md +480 -0
- package/pennyfarthing-dist/agents/tea.md +191 -0
- package/pennyfarthing-dist/agents/tech-writer.md +148 -0
- package/pennyfarthing-dist/agents/testing-runner.md +420 -0
- package/pennyfarthing-dist/agents/ux-designer.md +158 -0
- package/pennyfarthing-dist/agents/workflow-status-check.md +332 -0
- package/pennyfarthing-dist/commands/architect.md +62 -0
- package/pennyfarthing-dist/commands/benchmark-control.md +69 -0
- package/pennyfarthing-dist/commands/benchmark.md +467 -0
- package/pennyfarthing-dist/commands/brainstorm.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 +136 -0
- package/pennyfarthing-dist/commands/continue-session.md +184 -0
- package/pennyfarthing-dist/commands/create-branches-from-story.md +374 -0
- package/pennyfarthing-dist/commands/create-theme.md +29 -0
- package/pennyfarthing-dist/commands/dev.md +60 -0
- package/pennyfarthing-dist/commands/devops.md +59 -0
- package/pennyfarthing-dist/commands/git-cleanup.md +340 -0
- package/pennyfarthing-dist/commands/health-check.md +108 -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 +17 -0
- package/pennyfarthing-dist/commands/new-work.md +127 -0
- package/pennyfarthing-dist/commands/orchestrator.md +56 -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 +60 -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 +64 -0
- package/pennyfarthing-dist/commands/run-ci.md +116 -0
- package/pennyfarthing-dist/commands/set-theme.md +52 -0
- package/pennyfarthing-dist/commands/show-theme.md +21 -0
- package/pennyfarthing-dist/commands/sm.md +70 -0
- package/pennyfarthing-dist/commands/solo.md +411 -0
- package/pennyfarthing-dist/commands/sprint-planning.md +109 -0
- package/pennyfarthing-dist/commands/start-epic.md +156 -0
- package/pennyfarthing-dist/commands/sync-epic-to-jira.md +184 -0
- package/pennyfarthing-dist/commands/sync-work-with-sprint.md +376 -0
- package/pennyfarthing-dist/commands/tea.md +63 -0
- package/pennyfarthing-dist/commands/tech-writer.md +53 -0
- package/pennyfarthing-dist/commands/theme-maker.md +671 -0
- package/pennyfarthing-dist/commands/update-domain-docs.md +83 -0
- package/pennyfarthing-dist/commands/ux-designer.md +62 -0
- package/pennyfarthing-dist/commands/work.md +111 -0
- package/pennyfarthing-dist/guides/AGENT-COORDINATION.md +480 -0
- package/pennyfarthing-dist/guides/AGENT-SCOPES.md +201 -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/agent-template-strategic.md +148 -0
- package/pennyfarthing-dist/guides/agent-template-tactical.md +162 -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/persona-system.md +294 -0
- package/pennyfarthing-dist/guides/shared-agent-behavior.md +388 -0
- package/pennyfarthing-dist/guides/shared-context.md +147 -0
- package/pennyfarthing-dist/guides/strategic-agent-behavior.md +348 -0
- package/pennyfarthing-dist/guides/tactical-agent-behavior.md +1041 -0
- package/pennyfarthing-dist/guides/workflow-schema.md +195 -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 +207 -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 +243 -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 +219 -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 +334 -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 +242 -0
- package/pennyfarthing-dist/personas/themes/peaky-blinders.yaml +298 -0
- package/pennyfarthing-dist/personas/themes/princess-bride.yaml +220 -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 +230 -0
- package/pennyfarthing-dist/personas/themes/star-trek-tos.yaml +210 -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 +208 -0
- package/pennyfarthing-dist/personas/themes/ted-lasso.yaml +236 -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 +213 -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/add-short-names.mjs +264 -0
- package/pennyfarthing-dist/scripts/agent-session.sh +367 -0
- package/pennyfarthing-dist/scripts/check-context.sh +187 -0
- package/pennyfarthing-dist/scripts/check.sh +497 -0
- package/pennyfarthing-dist/scripts/deploy.sh +284 -0
- package/pennyfarthing-dist/scripts/doctor-dogfood.sh +360 -0
- package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +61 -0
- package/pennyfarthing-dist/scripts/hooks/context-warning.sh +66 -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 +98 -0
- package/pennyfarthing-dist/scripts/hooks/session-stop.sh +59 -0
- package/pennyfarthing-dist/scripts/install-git-hooks.sh +91 -0
- package/pennyfarthing-dist/scripts/prime.sh +161 -0
- package/pennyfarthing-dist/scripts/release.sh +198 -0
- package/pennyfarthing-dist/scripts/repo-utils.sh +778 -0
- package/pennyfarthing-dist/scripts/run-ci.sh +219 -0
- package/pennyfarthing-dist/scripts/run.sh +65 -0
- package/pennyfarthing-dist/scripts/statusline.sh +264 -0
- package/pennyfarthing-dist/scripts/tests/check.test.sh +582 -0
- package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +107 -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/uninstall.sh +271 -0
- package/pennyfarthing-dist/scripts/utils/background-tasks.sh +177 -0
- package/pennyfarthing-dist/scripts/utils/check-status.sh +251 -0
- package/pennyfarthing-dist/scripts/utils/checkpoint.sh +136 -0
- package/pennyfarthing-dist/scripts/utils/common.sh +157 -0
- package/pennyfarthing-dist/scripts/utils/create-feature-branches.sh +230 -0
- package/pennyfarthing-dist/scripts/utils/file-lock.sh +269 -0
- package/pennyfarthing-dist/scripts/utils/find-related-work.sh +231 -0
- package/pennyfarthing-dist/scripts/utils/find-root.sh +33 -0
- package/pennyfarthing-dist/scripts/utils/generate-skill-docs.sh +110 -0
- package/pennyfarthing-dist/scripts/utils/git-status-all.sh +127 -0
- package/pennyfarthing-dist/scripts/utils/ground-truth-judge.py +289 -0
- package/pennyfarthing-dist/scripts/utils/jira/jira-lib.mjs +443 -0
- package/pennyfarthing-dist/scripts/utils/jira/jira-sync-story.mjs +208 -0
- package/pennyfarthing-dist/scripts/utils/jira/jira-sync.mjs +198 -0
- package/pennyfarthing-dist/scripts/utils/jira-claim-story.sh +162 -0
- package/pennyfarthing-dist/scripts/utils/jira-lib.sh +463 -0
- package/pennyfarthing-dist/scripts/utils/jira-sync-story.sh +8 -0
- package/pennyfarthing-dist/scripts/utils/jira-sync.sh +8 -0
- package/pennyfarthing-dist/scripts/utils/log-skill-usage.sh +74 -0
- package/pennyfarthing-dist/scripts/utils/logging.sh +186 -0
- package/pennyfarthing-dist/scripts/utils/repo-scan.sh +141 -0
- package/pennyfarthing-dist/scripts/utils/retry.sh +76 -0
- package/pennyfarthing-dist/scripts/utils/run-timestamp.sh +7 -0
- package/pennyfarthing-dist/scripts/utils/session-cleanup.sh +319 -0
- package/pennyfarthing-dist/scripts/utils/skill-usage-report.sh +193 -0
- package/pennyfarthing-dist/scripts/utils/sprint-common.sh +286 -0
- package/pennyfarthing-dist/scripts/utils/sprint-metrics.sh +241 -0
- package/pennyfarthing-dist/scripts/utils/swebench-judge.py +400 -0
- package/pennyfarthing-dist/scripts/utils/sync-epic-to-jira.sh +16 -0
- package/pennyfarthing-dist/scripts/utils/test-setup.sh +337 -0
- package/pennyfarthing-dist/scripts/utils/validate-subagent-frontmatter.sh +160 -0
- package/pennyfarthing-dist/scripts/worktree-manager.sh +498 -0
- package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +236 -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 +268 -0
- package/pennyfarthing-dist/skills/cyclist/SKILL.md +117 -0
- package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +421 -0
- package/pennyfarthing-dist/skills/finalize-run/SKILL.md +258 -0
- package/pennyfarthing-dist/skills/jira/SKILL.md +281 -0
- package/pennyfarthing-dist/skills/judge/SKILL.md +524 -0
- package/pennyfarthing-dist/skills/just/SKILL.md +160 -0
- package/pennyfarthing-dist/skills/mermaid/SKILL.md +240 -0
- package/pennyfarthing-dist/skills/otel/skill.md +222 -0
- package/pennyfarthing-dist/skills/permissions/skill.md +172 -0
- package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +173 -0
- package/pennyfarthing-dist/skills/skill-registry.schema.json +102 -0
- package/pennyfarthing-dist/skills/skill-registry.yaml +335 -0
- package/pennyfarthing-dist/skills/sprint-context/SKILL.md +120 -0
- package/pennyfarthing-dist/skills/story-management/SKILL.md +208 -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 +169 -0
- package/pennyfarthing-dist/skills/workflow/SKILL.md +160 -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/bdd.yaml +58 -0
- package/pennyfarthing-dist/workflows/tdd.yaml +50 -0
- package/pennyfarthing-dist/workflows/trivial.yaml +40 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic SM Finish - Combines finish-bookkeeping + finish-execution
|
|
3
|
+
*
|
|
4
|
+
* Provides two phases:
|
|
5
|
+
* 1. Preflight: PR check, lint fix, Jira status → JSON report
|
|
6
|
+
* 2. Execute: Archive, Jira transition, cleanup → completion flags
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync, existsSync, writeFileSync, unlinkSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
/**
|
|
11
|
+
* Parse acceptance criteria from session file content
|
|
12
|
+
*/
|
|
13
|
+
function parseAcceptanceCriteria(content) {
|
|
14
|
+
const lines = content.split('\n');
|
|
15
|
+
let total = 0;
|
|
16
|
+
let checked = 0;
|
|
17
|
+
let inACSection = false;
|
|
18
|
+
for (const line of lines) {
|
|
19
|
+
if (line.includes('## Acceptance Criteria')) {
|
|
20
|
+
inACSection = true;
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (inACSection && line.startsWith('## ')) {
|
|
24
|
+
// Reached another section
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
if (inACSection) {
|
|
28
|
+
// Match checkbox patterns: - [x] or - [ ]
|
|
29
|
+
const checkboxMatch = line.match(/^[-*]\s*\[([ xX])\]/);
|
|
30
|
+
if (checkboxMatch) {
|
|
31
|
+
total++;
|
|
32
|
+
if (checkboxMatch[1].toLowerCase() === 'x') {
|
|
33
|
+
checked++;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
total,
|
|
40
|
+
checked,
|
|
41
|
+
complete: total > 0 && checked === total
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Run preflight checks before finishing a story
|
|
46
|
+
*
|
|
47
|
+
* Checks PR status, lint status, Jira readiness, and acceptance criteria.
|
|
48
|
+
* Returns a JSON report for SM to evaluate.
|
|
49
|
+
*
|
|
50
|
+
* @param params - Preflight parameters
|
|
51
|
+
* @returns Preflight result with status and issues
|
|
52
|
+
*/
|
|
53
|
+
export async function preflightCheck(params) {
|
|
54
|
+
const { storyId, repos, jiraKey, projectRoot, _mockPrStatus } = params;
|
|
55
|
+
const issues = [];
|
|
56
|
+
const warnings = [];
|
|
57
|
+
// Initialize PR status based on repos
|
|
58
|
+
const prStatus = {};
|
|
59
|
+
const repoList = repos.split(',').map(r => r.trim());
|
|
60
|
+
for (const repo of repoList) {
|
|
61
|
+
// Use mock status if provided (for testing), otherwise default to NO_PR
|
|
62
|
+
prStatus[repo] = _mockPrStatus || 'NO_PR';
|
|
63
|
+
}
|
|
64
|
+
// Check for open PR warning
|
|
65
|
+
for (const repo of repoList) {
|
|
66
|
+
if (prStatus[repo] === 'open') {
|
|
67
|
+
warnings.push(`PR for ${repo} is still open - not merged yet`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Initialize lint status (default to clean for testing)
|
|
71
|
+
const lintStatus = {};
|
|
72
|
+
for (const repo of repoList) {
|
|
73
|
+
lintStatus[repo] = 'clean';
|
|
74
|
+
}
|
|
75
|
+
// Check acceptance criteria from session file
|
|
76
|
+
let acceptanceCriteria = { total: 0, checked: 0, complete: true };
|
|
77
|
+
const sessionPath = join(projectRoot, '.session', `${storyId}-session.md`);
|
|
78
|
+
if (existsSync(sessionPath)) {
|
|
79
|
+
const content = readFileSync(sessionPath, 'utf-8');
|
|
80
|
+
acceptanceCriteria = parseAcceptanceCriteria(content);
|
|
81
|
+
}
|
|
82
|
+
// Determine readiness
|
|
83
|
+
const allMerged = Object.values(prStatus).every(s => s === 'merged');
|
|
84
|
+
const noIssues = issues.length === 0;
|
|
85
|
+
const readyToFinish = allMerged && acceptanceCriteria.complete && noIssues;
|
|
86
|
+
return {
|
|
87
|
+
prStatus,
|
|
88
|
+
lintStatus,
|
|
89
|
+
jiraStatus: jiraKey ? 'ready' : undefined,
|
|
90
|
+
acceptanceCriteria,
|
|
91
|
+
readyToFinish,
|
|
92
|
+
issues,
|
|
93
|
+
warnings: warnings.length > 0 ? warnings : undefined
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Format date as YYYYMMDD
|
|
98
|
+
*/
|
|
99
|
+
function formatDateForFilename() {
|
|
100
|
+
const now = new Date();
|
|
101
|
+
const year = now.getFullYear();
|
|
102
|
+
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
103
|
+
const day = String(now.getDate()).padStart(2, '0');
|
|
104
|
+
return `${year}${month}${day}`;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Execute finish steps after SM approval
|
|
108
|
+
*
|
|
109
|
+
* Archives session file, writes summary, cleans up.
|
|
110
|
+
* Returns completion flags.
|
|
111
|
+
*
|
|
112
|
+
* @param params - Execute parameters
|
|
113
|
+
* @returns Execute result with completion flags
|
|
114
|
+
*/
|
|
115
|
+
export async function executeFinish(params) {
|
|
116
|
+
const { storyId, sessionDir, archiveDir, contextDir, summaryContent } = params;
|
|
117
|
+
const sessionPath = join(sessionDir, `${storyId}-session.md`);
|
|
118
|
+
const dateStr = formatDateForFilename();
|
|
119
|
+
const archivePath = join(archiveDir, `story-${storyId}-${dateStr}.md`);
|
|
120
|
+
let archived = false;
|
|
121
|
+
let sessionCleared = false;
|
|
122
|
+
let summaryPath;
|
|
123
|
+
try {
|
|
124
|
+
// Archive session file
|
|
125
|
+
if (existsSync(sessionPath)) {
|
|
126
|
+
const content = readFileSync(sessionPath, 'utf-8');
|
|
127
|
+
writeFileSync(archivePath, content);
|
|
128
|
+
archived = true;
|
|
129
|
+
// Remove session file
|
|
130
|
+
unlinkSync(sessionPath);
|
|
131
|
+
sessionCleared = true;
|
|
132
|
+
}
|
|
133
|
+
// Write summary file if contextDir provided
|
|
134
|
+
if (contextDir) {
|
|
135
|
+
summaryPath = join(contextDir, `story-${storyId}-summary.md`);
|
|
136
|
+
writeFileSync(summaryPath, summaryContent);
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
success: true,
|
|
140
|
+
archived,
|
|
141
|
+
sessionCleared,
|
|
142
|
+
archivePath,
|
|
143
|
+
summaryPath
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
return {
|
|
148
|
+
success: false,
|
|
149
|
+
archived,
|
|
150
|
+
sessionCleared,
|
|
151
|
+
archivePath: archived ? archivePath : undefined,
|
|
152
|
+
summaryPath,
|
|
153
|
+
error: `Failed to execute finish: ${error}`
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=generic-sm-finish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic-sm-finish.js","sourceRoot":"","sources":["../../src/workflow/generic-sm-finish.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic SM Setup - Combines story-setup + work-research
|
|
3
|
+
*
|
|
4
|
+
* Provides two modes:
|
|
5
|
+
* 1. Research mode: Scan backlog, batch Jira query, recommend stories
|
|
6
|
+
* 2. Setup mode: Claim Jira, create branches, write session file
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Story info from sprint YAML
|
|
10
|
+
*/
|
|
11
|
+
export interface StoryInfo {
|
|
12
|
+
id: string;
|
|
13
|
+
title: string;
|
|
14
|
+
status: string;
|
|
15
|
+
points?: number;
|
|
16
|
+
priority?: string;
|
|
17
|
+
epic?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Research result - available stories and sprint metadata
|
|
21
|
+
*/
|
|
22
|
+
export interface ResearchResult {
|
|
23
|
+
success: boolean;
|
|
24
|
+
availableStories: StoryInfo[];
|
|
25
|
+
sprintNumber?: number;
|
|
26
|
+
sprintGoal?: string;
|
|
27
|
+
completedPoints?: number;
|
|
28
|
+
totalPoints?: number;
|
|
29
|
+
error?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Setup result - session file and branch info
|
|
33
|
+
*/
|
|
34
|
+
export interface SetupResult {
|
|
35
|
+
success: boolean;
|
|
36
|
+
sessionFile?: string;
|
|
37
|
+
branchName?: string;
|
|
38
|
+
error?: string;
|
|
39
|
+
warnings?: string[];
|
|
40
|
+
}
|
|
41
|
+
export type GenericSmSetupResult = ResearchResult | SetupResult;
|
|
42
|
+
/**
|
|
43
|
+
* Research mode parameters
|
|
44
|
+
*/
|
|
45
|
+
export interface ResearchParams {
|
|
46
|
+
sprintPath: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Setup mode parameters
|
|
50
|
+
*/
|
|
51
|
+
export interface SetupParams {
|
|
52
|
+
storyId: string;
|
|
53
|
+
title: string;
|
|
54
|
+
points: number;
|
|
55
|
+
epic: number;
|
|
56
|
+
repos: string;
|
|
57
|
+
sessionDir: string;
|
|
58
|
+
workflow: string;
|
|
59
|
+
assignee?: string;
|
|
60
|
+
jiraKey?: string;
|
|
61
|
+
acceptanceCriteria?: string[];
|
|
62
|
+
checkEpicContext?: boolean;
|
|
63
|
+
contextDir?: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Epic context check parameters
|
|
67
|
+
*/
|
|
68
|
+
export interface CheckEpicContextParams {
|
|
69
|
+
epicId: number;
|
|
70
|
+
contextDir: string;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Epic context check result
|
|
74
|
+
*/
|
|
75
|
+
export interface CheckEpicContextResult {
|
|
76
|
+
exists: boolean;
|
|
77
|
+
path?: string;
|
|
78
|
+
message?: string;
|
|
79
|
+
expectedPath?: string;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Epic context creation parameters
|
|
83
|
+
*/
|
|
84
|
+
export interface CreateEpicContextParams {
|
|
85
|
+
epicId: number;
|
|
86
|
+
epicTitle: string;
|
|
87
|
+
contextDir: string;
|
|
88
|
+
content?: string;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Epic context creation result
|
|
92
|
+
*/
|
|
93
|
+
export interface CreateEpicContextResult {
|
|
94
|
+
success: boolean;
|
|
95
|
+
path?: string;
|
|
96
|
+
error?: string;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Research backlog for available stories
|
|
100
|
+
*
|
|
101
|
+
* Scans sprint YAML and returns available (unassigned, backlog) stories
|
|
102
|
+
* sorted by priority then points.
|
|
103
|
+
*
|
|
104
|
+
* @param params - Research parameters
|
|
105
|
+
* @returns Research result with available stories
|
|
106
|
+
*/
|
|
107
|
+
export declare function researchBacklog(params: ResearchParams): Promise<ResearchResult>;
|
|
108
|
+
/**
|
|
109
|
+
* Setup a story for development
|
|
110
|
+
*
|
|
111
|
+
* Creates session file with story context, calculates branch name,
|
|
112
|
+
* initializes workflow tracking with Phase History table.
|
|
113
|
+
*
|
|
114
|
+
* @param params - Setup parameters
|
|
115
|
+
* @returns Setup result with session file path and branch name
|
|
116
|
+
*/
|
|
117
|
+
export declare function setupStory(params: SetupParams): Promise<SetupResult>;
|
|
118
|
+
/**
|
|
119
|
+
* Check if epic context file exists
|
|
120
|
+
*
|
|
121
|
+
* Validates that sprint/context/context-epic-{N}.md exists before story setup.
|
|
122
|
+
* This ensures stories don't start without understanding their epic's technical landscape.
|
|
123
|
+
*
|
|
124
|
+
* @param params - Check parameters with epicId and contextDir
|
|
125
|
+
* @returns Result indicating if context exists, with path or message
|
|
126
|
+
*/
|
|
127
|
+
export declare function checkEpicContext(params: CheckEpicContextParams): Promise<CheckEpicContextResult>;
|
|
128
|
+
/**
|
|
129
|
+
* Create epic context file from template
|
|
130
|
+
*
|
|
131
|
+
* Creates a new epic context file with standard sections.
|
|
132
|
+
* Will not overwrite existing files to preserve valuable context.
|
|
133
|
+
*
|
|
134
|
+
* @param params - Creation parameters with epicId, title, contextDir, and optional content
|
|
135
|
+
* @returns Result with success status and file path
|
|
136
|
+
*/
|
|
137
|
+
export declare function createEpicContext(params: CreateEpicContextParams): Promise<CreateEpicContextResult>;
|
|
138
|
+
//# sourceMappingURL=generic-sm-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic-sm-setup.d.ts","sourceRoot":"","sources":["../../src/workflow/generic-sm-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic SM Setup - Combines story-setup + work-research
|
|
3
|
+
*
|
|
4
|
+
* Provides two modes:
|
|
5
|
+
* 1. Research mode: Scan backlog, batch Jira query, recommend stories
|
|
6
|
+
* 2. Setup mode: Claim Jira, create branches, write session file
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync, existsSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
/**
|
|
11
|
+
* Parse YAML manually (simple parser for sprint YAML structure)
|
|
12
|
+
* This avoids external dependencies like js-yaml
|
|
13
|
+
*/
|
|
14
|
+
function parseSprintYaml(content) {
|
|
15
|
+
const lines = content.split('\n');
|
|
16
|
+
// Extract sprint section
|
|
17
|
+
let sprintNumber;
|
|
18
|
+
let sprintGoal;
|
|
19
|
+
let completedPoints;
|
|
20
|
+
let totalPoints;
|
|
21
|
+
const stories = [];
|
|
22
|
+
let currentEpicId;
|
|
23
|
+
let inStoriesSection = false;
|
|
24
|
+
let currentStory = null;
|
|
25
|
+
let storyIndent = 0;
|
|
26
|
+
for (let i = 0; i < lines.length; i++) {
|
|
27
|
+
const line = lines[i];
|
|
28
|
+
const trimmed = line.trim();
|
|
29
|
+
const indent = line.length - line.trimStart().length;
|
|
30
|
+
// Sprint metadata (any indent)
|
|
31
|
+
if (trimmed.startsWith('number:') && !inStoriesSection) {
|
|
32
|
+
sprintNumber = parseInt(trimmed.replace('number:', '').trim(), 10);
|
|
33
|
+
}
|
|
34
|
+
else if (trimmed.startsWith('goal:') && !inStoriesSection) {
|
|
35
|
+
sprintGoal = trimmed.replace('goal:', '').trim().replace(/^["']|["']$/g, '');
|
|
36
|
+
}
|
|
37
|
+
else if (trimmed.startsWith('completed_points:')) {
|
|
38
|
+
completedPoints = parseInt(trimmed.replace('completed_points:', '').trim(), 10);
|
|
39
|
+
}
|
|
40
|
+
else if (trimmed.startsWith('total_points:')) {
|
|
41
|
+
totalPoints = parseInt(trimmed.replace('total_points:', '').trim(), 10);
|
|
42
|
+
}
|
|
43
|
+
// Epic detection: " - id: 31" at indent 2
|
|
44
|
+
else if (trimmed.startsWith('- id:') && indent === 2) {
|
|
45
|
+
const epicId = parseInt(trimmed.replace('- id:', '').trim(), 10);
|
|
46
|
+
if (!isNaN(epicId)) {
|
|
47
|
+
currentEpicId = epicId;
|
|
48
|
+
inStoriesSection = false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Stories section marker
|
|
52
|
+
else if (trimmed === 'stories:') {
|
|
53
|
+
inStoriesSection = true;
|
|
54
|
+
}
|
|
55
|
+
// Story item: " - id: ..." at indent 6 or more (after stories:)
|
|
56
|
+
else if (inStoriesSection && trimmed.startsWith('- id:')) {
|
|
57
|
+
// Save previous story
|
|
58
|
+
if (currentStory && currentStory.id) {
|
|
59
|
+
stories.push({
|
|
60
|
+
id: currentStory.id,
|
|
61
|
+
title: currentStory.title || '',
|
|
62
|
+
status: currentStory.status || 'backlog',
|
|
63
|
+
points: currentStory.points,
|
|
64
|
+
priority: currentStory.priority,
|
|
65
|
+
epic: currentEpicId,
|
|
66
|
+
assigned_to: currentStory.assigned_to
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// Start new story
|
|
70
|
+
storyIndent = indent;
|
|
71
|
+
const storyId = trimmed.replace('- id:', '').trim().replace(/^["']|["']$/g, '');
|
|
72
|
+
currentStory = { id: storyId, epic: currentEpicId };
|
|
73
|
+
}
|
|
74
|
+
// Story properties (must be indented more than story item)
|
|
75
|
+
else if (currentStory && indent > storyIndent) {
|
|
76
|
+
if (trimmed.startsWith('title:')) {
|
|
77
|
+
currentStory.title = trimmed.replace('title:', '').trim().replace(/^["']|["']$/g, '');
|
|
78
|
+
}
|
|
79
|
+
else if (trimmed.startsWith('status:')) {
|
|
80
|
+
currentStory.status = trimmed.replace('status:', '').trim();
|
|
81
|
+
}
|
|
82
|
+
else if (trimmed.startsWith('points:')) {
|
|
83
|
+
currentStory.points = parseInt(trimmed.replace('points:', '').trim(), 10);
|
|
84
|
+
}
|
|
85
|
+
else if (trimmed.startsWith('priority:')) {
|
|
86
|
+
currentStory.priority = trimmed.replace('priority:', '').trim();
|
|
87
|
+
}
|
|
88
|
+
else if (trimmed.startsWith('assigned_to:')) {
|
|
89
|
+
currentStory.assigned_to = trimmed.replace('assigned_to:', '').trim().replace(/^["']|["']$/g, '');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Exit stories section when we hit something at lower indent
|
|
93
|
+
else if (inStoriesSection && trimmed && indent <= 2 && !trimmed.startsWith('-')) {
|
|
94
|
+
// Save last story before exiting
|
|
95
|
+
if (currentStory && currentStory.id) {
|
|
96
|
+
stories.push({
|
|
97
|
+
id: currentStory.id,
|
|
98
|
+
title: currentStory.title || '',
|
|
99
|
+
status: currentStory.status || 'backlog',
|
|
100
|
+
points: currentStory.points,
|
|
101
|
+
priority: currentStory.priority,
|
|
102
|
+
epic: currentEpicId,
|
|
103
|
+
assigned_to: currentStory.assigned_to
|
|
104
|
+
});
|
|
105
|
+
currentStory = null;
|
|
106
|
+
}
|
|
107
|
+
inStoriesSection = false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Don't forget the last story
|
|
111
|
+
if (currentStory && currentStory.id) {
|
|
112
|
+
stories.push({
|
|
113
|
+
id: currentStory.id,
|
|
114
|
+
title: currentStory.title || '',
|
|
115
|
+
status: currentStory.status || 'backlog',
|
|
116
|
+
points: currentStory.points,
|
|
117
|
+
priority: currentStory.priority,
|
|
118
|
+
epic: currentEpicId,
|
|
119
|
+
assigned_to: currentStory.assigned_to
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
sprint: { number: sprintNumber, goal: sprintGoal },
|
|
124
|
+
summary: { completed_points: completedPoints, total_points: totalPoints },
|
|
125
|
+
stories
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Research backlog for available stories
|
|
130
|
+
*
|
|
131
|
+
* Scans sprint YAML and returns available (unassigned, backlog) stories
|
|
132
|
+
* sorted by priority then points.
|
|
133
|
+
*
|
|
134
|
+
* @param params - Research parameters
|
|
135
|
+
* @returns Research result with available stories
|
|
136
|
+
*/
|
|
137
|
+
export async function researchBacklog(params) {
|
|
138
|
+
const { sprintPath } = params;
|
|
139
|
+
// Check if file exists
|
|
140
|
+
if (!existsSync(sprintPath)) {
|
|
141
|
+
return {
|
|
142
|
+
success: false,
|
|
143
|
+
availableStories: [],
|
|
144
|
+
error: `Sprint file not found: ${sprintPath}`
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
const content = readFileSync(sprintPath, 'utf-8');
|
|
149
|
+
const parsed = parseSprintYaml(content);
|
|
150
|
+
const sprint = parsed.sprint;
|
|
151
|
+
const summary = parsed.summary;
|
|
152
|
+
const allStories = parsed.stories || [];
|
|
153
|
+
// Filter: only backlog stories without assigned_to
|
|
154
|
+
const availableStories = allStories.filter(story => {
|
|
155
|
+
const hasAssignee = 'assigned_to' in story && story.assigned_to;
|
|
156
|
+
const isBacklog = story.status === 'backlog';
|
|
157
|
+
return isBacklog && !hasAssignee;
|
|
158
|
+
});
|
|
159
|
+
// Sort by priority (P1 < P2 < undefined) then by points ascending
|
|
160
|
+
const priorityOrder = { 'P1': 1, 'P2': 2, 'P3': 3 };
|
|
161
|
+
availableStories.sort((a, b) => {
|
|
162
|
+
const aPriority = priorityOrder[a.priority || ''] || 99;
|
|
163
|
+
const bPriority = priorityOrder[b.priority || ''] || 99;
|
|
164
|
+
if (aPriority !== bPriority) {
|
|
165
|
+
return aPriority - bPriority;
|
|
166
|
+
}
|
|
167
|
+
return (a.points || 0) - (b.points || 0);
|
|
168
|
+
});
|
|
169
|
+
return {
|
|
170
|
+
success: true,
|
|
171
|
+
availableStories,
|
|
172
|
+
sprintNumber: sprint?.number,
|
|
173
|
+
sprintGoal: sprint?.goal,
|
|
174
|
+
completedPoints: summary?.completed_points,
|
|
175
|
+
totalPoints: summary?.total_points
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
return {
|
|
180
|
+
success: false,
|
|
181
|
+
availableStories: [],
|
|
182
|
+
error: `Failed to parse sprint YAML: ${error}`
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Convert title to kebab-case slug for branch naming
|
|
188
|
+
*/
|
|
189
|
+
function slugify(title) {
|
|
190
|
+
return title
|
|
191
|
+
.toLowerCase()
|
|
192
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
193
|
+
.replace(/^-|-$/g, '');
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Setup a story for development
|
|
197
|
+
*
|
|
198
|
+
* Creates session file with story context, calculates branch name,
|
|
199
|
+
* initializes workflow tracking with Phase History table.
|
|
200
|
+
*
|
|
201
|
+
* @param params - Setup parameters
|
|
202
|
+
* @returns Setup result with session file path and branch name
|
|
203
|
+
*/
|
|
204
|
+
export async function setupStory(params) {
|
|
205
|
+
const { storyId, title, points, epic, repos, sessionDir, workflow, assignee, jiraKey, acceptanceCriteria, checkEpicContext: shouldCheckContext, contextDir } = params;
|
|
206
|
+
// Collect warnings for non-blocking issues
|
|
207
|
+
const warnings = [];
|
|
208
|
+
// Check epic context if gate is enabled
|
|
209
|
+
if (shouldCheckContext && contextDir) {
|
|
210
|
+
const contextCheck = await checkEpicContext({ epicId: epic, contextDir });
|
|
211
|
+
if (!contextCheck.exists) {
|
|
212
|
+
// Warn but don't block (soft gate initially)
|
|
213
|
+
warnings.push(`Missing epic context: ${contextCheck.message}`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Calculate branch name
|
|
217
|
+
const slug = slugify(title);
|
|
218
|
+
const branchName = `feat/${storyId}-${slug}`;
|
|
219
|
+
// Session file path
|
|
220
|
+
const sessionPath = join(sessionDir, `${storyId}-session.md`);
|
|
221
|
+
// Check if session file already exists
|
|
222
|
+
if (existsSync(sessionPath)) {
|
|
223
|
+
return {
|
|
224
|
+
success: false,
|
|
225
|
+
error: `Session file already exists: ${sessionPath}`
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
// Generate ISO timestamp
|
|
229
|
+
const now = new Date().toISOString();
|
|
230
|
+
// Build session file content
|
|
231
|
+
const lines = [
|
|
232
|
+
`# Story ${storyId} Session`,
|
|
233
|
+
'',
|
|
234
|
+
`**Story ID:** ${storyId}`,
|
|
235
|
+
`**Title:** ${title}`,
|
|
236
|
+
`**Points:** ${points}`,
|
|
237
|
+
`**Epic:** ${epic}`,
|
|
238
|
+
`**Repos:** ${repos}`,
|
|
239
|
+
`**Status:** in_progress`
|
|
240
|
+
];
|
|
241
|
+
if (assignee) {
|
|
242
|
+
lines.push(`**Assignee:** ${assignee}`);
|
|
243
|
+
}
|
|
244
|
+
if (jiraKey) {
|
|
245
|
+
lines.push(`**Jira:** ${jiraKey}`);
|
|
246
|
+
}
|
|
247
|
+
// Acceptance criteria section
|
|
248
|
+
if (acceptanceCriteria && acceptanceCriteria.length > 0) {
|
|
249
|
+
lines.push('');
|
|
250
|
+
lines.push('## Acceptance Criteria');
|
|
251
|
+
lines.push('');
|
|
252
|
+
for (const ac of acceptanceCriteria) {
|
|
253
|
+
lines.push(`- [ ] ${ac}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Workflow tracking section
|
|
257
|
+
lines.push('');
|
|
258
|
+
lines.push('## Workflow Tracking');
|
|
259
|
+
lines.push('');
|
|
260
|
+
lines.push(`**Workflow:** ${workflow}`);
|
|
261
|
+
lines.push(`**Phase:** setup`);
|
|
262
|
+
lines.push(`**Phase Started:** ${now}`);
|
|
263
|
+
lines.push('');
|
|
264
|
+
lines.push('### Phase History');
|
|
265
|
+
lines.push('| Phase | Started | Ended | Duration |');
|
|
266
|
+
lines.push('|-------|---------|-------|----------|');
|
|
267
|
+
lines.push(`| setup | ${now} | - | - |`);
|
|
268
|
+
lines.push('');
|
|
269
|
+
// Write file
|
|
270
|
+
try {
|
|
271
|
+
writeFileSync(sessionPath, lines.join('\n'));
|
|
272
|
+
return {
|
|
273
|
+
success: true,
|
|
274
|
+
sessionFile: sessionPath,
|
|
275
|
+
branchName,
|
|
276
|
+
warnings
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
return {
|
|
281
|
+
success: false,
|
|
282
|
+
error: `Failed to write session file: ${error}`
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Check if epic context file exists
|
|
288
|
+
*
|
|
289
|
+
* Validates that sprint/context/context-epic-{N}.md exists before story setup.
|
|
290
|
+
* This ensures stories don't start without understanding their epic's technical landscape.
|
|
291
|
+
*
|
|
292
|
+
* @param params - Check parameters with epicId and contextDir
|
|
293
|
+
* @returns Result indicating if context exists, with path or message
|
|
294
|
+
*/
|
|
295
|
+
export async function checkEpicContext(params) {
|
|
296
|
+
const { epicId, contextDir } = params;
|
|
297
|
+
const filename = `context-epic-${epicId}.md`;
|
|
298
|
+
const expectedPath = join(contextDir, filename);
|
|
299
|
+
if (existsSync(expectedPath)) {
|
|
300
|
+
return {
|
|
301
|
+
exists: true,
|
|
302
|
+
path: expectedPath
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
return {
|
|
306
|
+
exists: false,
|
|
307
|
+
message: `Epic ${epicId} is missing technical context. Create ${filename} before starting stories.`,
|
|
308
|
+
expectedPath
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Create epic context file from template
|
|
313
|
+
*
|
|
314
|
+
* Creates a new epic context file with standard sections.
|
|
315
|
+
* Will not overwrite existing files to preserve valuable context.
|
|
316
|
+
*
|
|
317
|
+
* @param params - Creation parameters with epicId, title, contextDir, and optional content
|
|
318
|
+
* @returns Result with success status and file path
|
|
319
|
+
*/
|
|
320
|
+
export async function createEpicContext(params) {
|
|
321
|
+
const { epicId, epicTitle, contextDir, content } = params;
|
|
322
|
+
const filename = `context-epic-${epicId}.md`;
|
|
323
|
+
const filePath = join(contextDir, filename);
|
|
324
|
+
// Don't overwrite existing context
|
|
325
|
+
if (existsSync(filePath)) {
|
|
326
|
+
return {
|
|
327
|
+
success: false,
|
|
328
|
+
error: `Epic context file already exists: ${filePath}`
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
// Build content from template or provided content
|
|
332
|
+
let fileContent;
|
|
333
|
+
if (content) {
|
|
334
|
+
// Use provided content with header
|
|
335
|
+
fileContent = `# Epic ${epicId}: ${epicTitle} - Technical Context\n\n${content}`;
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
// Use standard template
|
|
339
|
+
fileContent = `# Epic ${epicId}: ${epicTitle} - Technical Context
|
|
340
|
+
|
|
341
|
+
## Epic Overview
|
|
342
|
+
- Goal: [One sentence describing the epic goal]
|
|
343
|
+
- Stories: [count] totaling [points] pts
|
|
344
|
+
- Status: in_progress
|
|
345
|
+
|
|
346
|
+
## Technical Landscape
|
|
347
|
+
[2-3 paragraphs describing the technical domain, key challenges, and approach]
|
|
348
|
+
|
|
349
|
+
## Key Files
|
|
350
|
+
| File | Purpose |
|
|
351
|
+
|------|---------|
|
|
352
|
+
| path/to/file | Description |
|
|
353
|
+
|
|
354
|
+
## Patterns & Conventions
|
|
355
|
+
- Pattern 1: Description
|
|
356
|
+
- Pattern 2: Description
|
|
357
|
+
|
|
358
|
+
## Dependencies & Risks
|
|
359
|
+
- Dependency: Description
|
|
360
|
+
- Risk: Mitigation
|
|
361
|
+
|
|
362
|
+
## Story Sequence
|
|
363
|
+
| Story | Title | Depends On |
|
|
364
|
+
|-------|-------|------------|
|
|
365
|
+
| ${epicId}-1 | First story | None |
|
|
366
|
+
`;
|
|
367
|
+
}
|
|
368
|
+
try {
|
|
369
|
+
writeFileSync(filePath, fileContent);
|
|
370
|
+
return {
|
|
371
|
+
success: true,
|
|
372
|
+
path: filePath
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
catch (error) {
|
|
376
|
+
return {
|
|
377
|
+
success: false,
|
|
378
|
+
error: `Failed to create epic context: ${error}`
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
//# sourceMappingURL=generic-sm-setup.js.map
|