@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,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OCEAN Spider Chart Generator
|
|
3
|
+
*
|
|
4
|
+
* Story 11-10: Build OCEAN spider chart generator (complement to Chernoff faces)
|
|
5
|
+
*
|
|
6
|
+
* Generates pentagon-shaped spider charts showing OCEAN personality profiles.
|
|
7
|
+
* Charts are unfilled (stroke only) to enable clean stacking for comparisons.
|
|
8
|
+
*/
|
|
9
|
+
import { loadThemeOcean } from './generate-face.js';
|
|
10
|
+
// Chart configuration
|
|
11
|
+
const VIEW_SIZE = 200;
|
|
12
|
+
const CENTER_X = VIEW_SIZE / 2;
|
|
13
|
+
const CENTER_Y = VIEW_SIZE / 2 + 8; // Shifted down to balance top/bottom margins
|
|
14
|
+
const OUTER_RADIUS = 70; // Leaves room for labels
|
|
15
|
+
const LABEL_RADIUS = OUTER_RADIUS + 18;
|
|
16
|
+
// OCEAN dimension order (clockwise from top)
|
|
17
|
+
const DIMENSIONS = ['O', 'C', 'E', 'A', 'N'];
|
|
18
|
+
const DIMENSION_LABELS = {
|
|
19
|
+
O: 'O',
|
|
20
|
+
C: 'C',
|
|
21
|
+
E: 'E',
|
|
22
|
+
A: 'A',
|
|
23
|
+
N: 'N',
|
|
24
|
+
};
|
|
25
|
+
// Role-specific colors (consistent across all charts for visual training)
|
|
26
|
+
export const ROLE_COLORS = {
|
|
27
|
+
orchestrator: '#f59e0b', // Amber
|
|
28
|
+
sm: '#10b981', // Emerald
|
|
29
|
+
tea: '#ef4444', // Red
|
|
30
|
+
dev: '#3b82f6', // Blue
|
|
31
|
+
reviewer: '#8b5cf6', // Purple
|
|
32
|
+
architect: '#06b6d4', // Cyan
|
|
33
|
+
pm: '#ec4899', // Pink
|
|
34
|
+
'tech-writer': '#84cc16', // Lime
|
|
35
|
+
'ux-designer': '#f97316', // Orange
|
|
36
|
+
devops: '#6366f1', // Indigo
|
|
37
|
+
};
|
|
38
|
+
// Legacy overlay colors (for arbitrary comparisons)
|
|
39
|
+
const OVERLAY_COLORS = [
|
|
40
|
+
'#2563eb', // Blue
|
|
41
|
+
'#dc2626', // Red
|
|
42
|
+
'#16a34a', // Green
|
|
43
|
+
'#9333ea', // Purple
|
|
44
|
+
'#ea580c', // Orange
|
|
45
|
+
];
|
|
46
|
+
// Background and styling (dark theme for consistent rendering)
|
|
47
|
+
const BACKGROUND_COLOR = '#000000';
|
|
48
|
+
const GRID_COLOR = '#374151';
|
|
49
|
+
const AXIS_COLOR = '#4b5563';
|
|
50
|
+
const LABEL_COLOR = '#e5e7eb';
|
|
51
|
+
const DATA_STROKE_WIDTH = 2;
|
|
52
|
+
const GRID_STROKE_WIDTH = 1;
|
|
53
|
+
/**
|
|
54
|
+
* Calculate point on pentagon for given dimension and score
|
|
55
|
+
* @param dimensionIndex - Index 0-4 for O, C, E, A, N
|
|
56
|
+
* @param score - Score 1-5
|
|
57
|
+
* @param radius - Base radius to use
|
|
58
|
+
*/
|
|
59
|
+
function getPoint(dimensionIndex, score, radius) {
|
|
60
|
+
// Start from top (-90°), go clockwise
|
|
61
|
+
// Each vertex is 72° apart (360° / 5)
|
|
62
|
+
const angle = ((dimensionIndex * 72 - 90) * Math.PI) / 180;
|
|
63
|
+
// Map score 1-5 to 20%-100% of radius
|
|
64
|
+
const normalizedScore = 0.2 + ((score - 1) / 4) * 0.8;
|
|
65
|
+
const r = radius * normalizedScore;
|
|
66
|
+
return {
|
|
67
|
+
x: CENTER_X + r * Math.cos(angle),
|
|
68
|
+
y: CENTER_Y + r * Math.sin(angle),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get vertex position (at full radius) for a dimension
|
|
73
|
+
*/
|
|
74
|
+
function getVertex(dimensionIndex) {
|
|
75
|
+
const angle = ((dimensionIndex * 72 - 90) * Math.PI) / 180;
|
|
76
|
+
return {
|
|
77
|
+
x: CENTER_X + OUTER_RADIUS * Math.cos(angle),
|
|
78
|
+
y: CENTER_Y + OUTER_RADIUS * Math.sin(angle),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get label position (outside the pentagon)
|
|
83
|
+
*/
|
|
84
|
+
function getLabelPosition(dimensionIndex) {
|
|
85
|
+
const angle = ((dimensionIndex * 72 - 90) * Math.PI) / 180;
|
|
86
|
+
const x = CENTER_X + LABEL_RADIUS * Math.cos(angle);
|
|
87
|
+
const y = CENTER_Y + LABEL_RADIUS * Math.sin(angle);
|
|
88
|
+
// Text anchor depends on position
|
|
89
|
+
let anchor = 'middle';
|
|
90
|
+
if (dimensionIndex === 1 || dimensionIndex === 2)
|
|
91
|
+
anchor = 'start'; // Right side
|
|
92
|
+
if (dimensionIndex === 3 || dimensionIndex === 4)
|
|
93
|
+
anchor = 'end'; // Left side
|
|
94
|
+
return { x, y, anchor };
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Generate grid pentagon at a specific scale
|
|
98
|
+
*/
|
|
99
|
+
function generateGridPolygon(scale) {
|
|
100
|
+
const points = DIMENSIONS.map((_, i) => {
|
|
101
|
+
const angle = ((i * 72 - 90) * Math.PI) / 180;
|
|
102
|
+
const r = OUTER_RADIUS * scale;
|
|
103
|
+
const x = CENTER_X + r * Math.cos(angle);
|
|
104
|
+
const y = CENTER_Y + r * Math.sin(angle);
|
|
105
|
+
return `${x.toFixed(1)},${y.toFixed(1)}`;
|
|
106
|
+
}).join(' ');
|
|
107
|
+
return `<polygon points="${points}" fill="none" stroke="${GRID_COLOR}" stroke-width="${GRID_STROKE_WIDTH}" />`;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Generate axis line from center to vertex
|
|
111
|
+
*/
|
|
112
|
+
function generateAxisLine(dimensionIndex) {
|
|
113
|
+
const vertex = getVertex(dimensionIndex);
|
|
114
|
+
return `<line x1="${CENTER_X}" y1="${CENTER_Y}" x2="${vertex.x.toFixed(1)}" y2="${vertex.y.toFixed(1)}" stroke="${AXIS_COLOR}" stroke-width="${GRID_STROKE_WIDTH}" />`;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Generate dimension label
|
|
118
|
+
*/
|
|
119
|
+
function generateLabel(dimensionIndex) {
|
|
120
|
+
const pos = getLabelPosition(dimensionIndex);
|
|
121
|
+
const label = DIMENSION_LABELS[DIMENSIONS[dimensionIndex]];
|
|
122
|
+
// Adjust y for vertical centering
|
|
123
|
+
const yOffset = dimensionIndex === 0 ? -4 : dimensionIndex === 2 || dimensionIndex === 3 ? 4 : 0;
|
|
124
|
+
return `<text x="${pos.x.toFixed(1)}" y="${(pos.y + yOffset).toFixed(1)}" text-anchor="${pos.anchor}" font-family="sans-serif" font-size="12" font-weight="bold" fill="${LABEL_COLOR}">${label}</text>`;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Generate data polygon from OCEAN scores
|
|
128
|
+
*/
|
|
129
|
+
function generateDataPolygon(ocean, color = '#2563eb', strokeWidth = DATA_STROKE_WIDTH) {
|
|
130
|
+
const points = DIMENSIONS.map((dim, i) => {
|
|
131
|
+
const point = getPoint(i, ocean[dim], OUTER_RADIUS);
|
|
132
|
+
return `${point.x.toFixed(1)},${point.y.toFixed(1)}`;
|
|
133
|
+
}).join(' ');
|
|
134
|
+
return `<polygon points="${points}" fill="none" stroke="${color}" stroke-width="${strokeWidth}" stroke-linejoin="round" />`;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Generate SVG spider chart from OCEAN scores
|
|
138
|
+
*/
|
|
139
|
+
export function generateSpiderFromOcean(ocean, color = '#2563eb') {
|
|
140
|
+
// Grid pentagons at 20%, 40%, 60%, 80%, 100%
|
|
141
|
+
const gridPolygons = [0.2, 0.4, 0.6, 0.8, 1.0]
|
|
142
|
+
.map((scale) => generateGridPolygon(scale))
|
|
143
|
+
.join('\n ');
|
|
144
|
+
// Axis lines
|
|
145
|
+
const axisLines = DIMENSIONS.map((_, i) => generateAxisLine(i)).join('\n ');
|
|
146
|
+
// Dimension labels
|
|
147
|
+
const labels = DIMENSIONS.map((_, i) => generateLabel(i)).join('\n ');
|
|
148
|
+
// Data polygon
|
|
149
|
+
const dataPolygon = generateDataPolygon(ocean, color);
|
|
150
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${VIEW_SIZE} ${VIEW_SIZE}">
|
|
151
|
+
<!-- Background -->
|
|
152
|
+
<rect width="${VIEW_SIZE}" height="${VIEW_SIZE}" fill="${BACKGROUND_COLOR}" />
|
|
153
|
+
|
|
154
|
+
<!-- Grid -->
|
|
155
|
+
${gridPolygons}
|
|
156
|
+
|
|
157
|
+
<!-- Axes -->
|
|
158
|
+
${axisLines}
|
|
159
|
+
|
|
160
|
+
<!-- Data -->
|
|
161
|
+
${dataPolygon}
|
|
162
|
+
|
|
163
|
+
<!-- Labels -->
|
|
164
|
+
${labels}
|
|
165
|
+
</svg>`;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Generate SVG spider chart from theme and agent
|
|
169
|
+
* Uses role-specific color for consistent visual training
|
|
170
|
+
*/
|
|
171
|
+
export function generateSpider(theme, agent) {
|
|
172
|
+
const ocean = loadThemeOcean(theme, agent);
|
|
173
|
+
const color = ROLE_COLORS[agent] || '#2563eb';
|
|
174
|
+
return generateSpiderFromOcean(ocean, color);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Format theme name for display
|
|
178
|
+
*/
|
|
179
|
+
function formatThemeName(theme) {
|
|
180
|
+
return theme
|
|
181
|
+
.split('-')
|
|
182
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
183
|
+
.join(' ');
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Generate legend item
|
|
187
|
+
*/
|
|
188
|
+
function generateLegendItem(index, label, color, yOffset) {
|
|
189
|
+
const x = 10;
|
|
190
|
+
const y = VIEW_SIZE - 10 - yOffset;
|
|
191
|
+
return `<rect x="${x}" y="${y - 8}" width="12" height="12" fill="none" stroke="${color}" stroke-width="2" />
|
|
192
|
+
<text x="${x + 16}" y="${y}" font-family="sans-serif" font-size="10" fill="${LABEL_COLOR}">${label}</text>`;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Generate overlay spider chart comparing multiple characters
|
|
196
|
+
*/
|
|
197
|
+
export function generateOverlaySpider(characters) {
|
|
198
|
+
// Grid pentagons
|
|
199
|
+
const gridPolygons = [0.2, 0.4, 0.6, 0.8, 1.0]
|
|
200
|
+
.map((scale) => generateGridPolygon(scale))
|
|
201
|
+
.join('\n ');
|
|
202
|
+
// Axis lines
|
|
203
|
+
const axisLines = DIMENSIONS.map((_, i) => generateAxisLine(i)).join('\n ');
|
|
204
|
+
// Dimension labels
|
|
205
|
+
const labels = DIMENSIONS.map((_, i) => generateLabel(i)).join('\n ');
|
|
206
|
+
// Data polygons for each character
|
|
207
|
+
const dataPolygons = characters
|
|
208
|
+
.map((char, index) => {
|
|
209
|
+
const ocean = loadThemeOcean(char.theme, char.agent);
|
|
210
|
+
const color = OVERLAY_COLORS[index % OVERLAY_COLORS.length];
|
|
211
|
+
return generateDataPolygon(ocean, color);
|
|
212
|
+
})
|
|
213
|
+
.join('\n ');
|
|
214
|
+
// Legend items
|
|
215
|
+
const legendItems = characters
|
|
216
|
+
.map((char, index) => {
|
|
217
|
+
const color = OVERLAY_COLORS[index % OVERLAY_COLORS.length];
|
|
218
|
+
const label = char.label || `${formatThemeName(char.theme)} (${char.agent})`;
|
|
219
|
+
const yOffset = (characters.length - 1 - index) * 16;
|
|
220
|
+
return generateLegendItem(index, label, color, yOffset);
|
|
221
|
+
})
|
|
222
|
+
.join('\n ');
|
|
223
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${VIEW_SIZE} ${VIEW_SIZE}">
|
|
224
|
+
<!-- Background -->
|
|
225
|
+
<rect width="${VIEW_SIZE}" height="${VIEW_SIZE}" fill="${BACKGROUND_COLOR}" />
|
|
226
|
+
|
|
227
|
+
<!-- Grid -->
|
|
228
|
+
${gridPolygons}
|
|
229
|
+
|
|
230
|
+
<!-- Axes -->
|
|
231
|
+
${axisLines}
|
|
232
|
+
|
|
233
|
+
<!-- Data -->
|
|
234
|
+
${dataPolygons}
|
|
235
|
+
|
|
236
|
+
<!-- Labels -->
|
|
237
|
+
${labels}
|
|
238
|
+
|
|
239
|
+
<!-- Legend -->
|
|
240
|
+
${legendItems}
|
|
241
|
+
</svg>`;
|
|
242
|
+
}
|
|
243
|
+
// Agent order for team overlay (matches AGENTS in generate-all-spiders.ts)
|
|
244
|
+
const TEAM_AGENTS = [
|
|
245
|
+
'orchestrator',
|
|
246
|
+
'sm',
|
|
247
|
+
'tea',
|
|
248
|
+
'dev',
|
|
249
|
+
'reviewer',
|
|
250
|
+
'architect',
|
|
251
|
+
'pm',
|
|
252
|
+
'tech-writer',
|
|
253
|
+
'ux-designer',
|
|
254
|
+
'devops',
|
|
255
|
+
];
|
|
256
|
+
// Human-readable agent names for legend (reserved for future use)
|
|
257
|
+
const _AGENT_DISPLAY_NAMES = {
|
|
258
|
+
orchestrator: 'Orch',
|
|
259
|
+
sm: 'SM',
|
|
260
|
+
tea: 'TEA',
|
|
261
|
+
dev: 'Dev',
|
|
262
|
+
reviewer: 'Rev',
|
|
263
|
+
architect: 'Arch',
|
|
264
|
+
pm: 'PM',
|
|
265
|
+
'tech-writer': 'TW',
|
|
266
|
+
'ux-designer': 'UX',
|
|
267
|
+
devops: 'Ops',
|
|
268
|
+
};
|
|
269
|
+
// Tactical agents get emphasized (thicker stroke) in team overlays
|
|
270
|
+
const TACTICAL_AGENTS = new Set(['sm', 'tea', 'dev', 'reviewer']);
|
|
271
|
+
const TACTICAL_STROKE_WIDTH = 2.5;
|
|
272
|
+
const STRATEGIC_STROKE_WIDTH = 1;
|
|
273
|
+
/**
|
|
274
|
+
* Generate team overlay spider chart showing all 10 agents for a theme
|
|
275
|
+
* Uses role-specific colors for consistent visual training
|
|
276
|
+
*/
|
|
277
|
+
export function generateTeamOverlay(theme) {
|
|
278
|
+
// Grid pentagons
|
|
279
|
+
const gridPolygons = [0.2, 0.4, 0.6, 0.8, 1.0]
|
|
280
|
+
.map((scale) => generateGridPolygon(scale))
|
|
281
|
+
.join('\n ');
|
|
282
|
+
// Axis lines
|
|
283
|
+
const axisLines = TEAM_AGENTS.slice(0, 5)
|
|
284
|
+
.map((_, i) => generateAxisLine(i))
|
|
285
|
+
.join('\n ');
|
|
286
|
+
// Dimension labels
|
|
287
|
+
const labels = DIMENSIONS.map((_, i) => generateLabel(i)).join('\n ');
|
|
288
|
+
// Data polygons for each agent (using role colors)
|
|
289
|
+
// Tactical agents (sm, tea, dev, reviewer) emphasized with thicker strokes
|
|
290
|
+
// Strategic/support agents de-emphasized with thinner strokes
|
|
291
|
+
const dataPolygons = TEAM_AGENTS.map((agent) => {
|
|
292
|
+
const ocean = loadThemeOcean(theme, agent);
|
|
293
|
+
const color = ROLE_COLORS[agent];
|
|
294
|
+
const strokeWidth = TACTICAL_AGENTS.has(agent) ? TACTICAL_STROKE_WIDTH : STRATEGIC_STROKE_WIDTH;
|
|
295
|
+
return generateDataPolygon(ocean, color, strokeWidth);
|
|
296
|
+
}).join('\n ');
|
|
297
|
+
// Legend removed - color key is in markdown header
|
|
298
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${VIEW_SIZE} ${VIEW_SIZE}">
|
|
299
|
+
<!-- Background -->
|
|
300
|
+
<rect width="${VIEW_SIZE}" height="${VIEW_SIZE}" fill="${BACKGROUND_COLOR}" />
|
|
301
|
+
|
|
302
|
+
<!-- Grid -->
|
|
303
|
+
${gridPolygons}
|
|
304
|
+
|
|
305
|
+
<!-- Axes -->
|
|
306
|
+
${axisLines}
|
|
307
|
+
|
|
308
|
+
<!-- Data -->
|
|
309
|
+
${dataPolygons}
|
|
310
|
+
|
|
311
|
+
<!-- Labels -->
|
|
312
|
+
${labels}
|
|
313
|
+
</svg>`;
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=generate-spider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-spider.js","sourceRoot":"","sources":["../../src/scripts/generate-spider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Story 11-10: Build OCEAN Spider Chart Generator
|
|
3
|
+
*
|
|
4
|
+
* These tests verify:
|
|
5
|
+
* AC1: scripts/generate-spider.ts functional (module exists and exports work)
|
|
6
|
+
* AC2: Takes theme + agent as input, outputs SVG
|
|
7
|
+
* AC3: Spider charts clearly show all 5 OCEAN dimensions
|
|
8
|
+
* AC4: Overlay mode compares 2-3 characters on same chart
|
|
9
|
+
* AC5: SVGs render correctly in browsers and markdown (valid SVG structure)
|
|
10
|
+
*
|
|
11
|
+
* Run with: npm test
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=generate-spider.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-spider.test.d.ts","sourceRoot":"","sources":["../../src/scripts/generate-spider.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Story 11-10: Build OCEAN Spider Chart Generator
|
|
3
|
+
*
|
|
4
|
+
* These tests verify:
|
|
5
|
+
* AC1: scripts/generate-spider.ts functional (module exists and exports work)
|
|
6
|
+
* AC2: Takes theme + agent as input, outputs SVG
|
|
7
|
+
* AC3: Spider charts clearly show all 5 OCEAN dimensions
|
|
8
|
+
* AC4: Overlay mode compares 2-3 characters on same chart
|
|
9
|
+
* AC5: SVGs render correctly in browsers and markdown (valid SVG structure)
|
|
10
|
+
*
|
|
11
|
+
* Run with: npm test
|
|
12
|
+
*/
|
|
13
|
+
import { describe, it } from 'node:test';
|
|
14
|
+
import assert from 'node:assert';
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// AC1: scripts/generate-spider.ts functional
|
|
17
|
+
// ============================================================================
|
|
18
|
+
describe('AC1: Spider Chart Module Exists and Exports', () => {
|
|
19
|
+
it('should export generateSpider function', async () => {
|
|
20
|
+
const module = await import('./generate-spider.js');
|
|
21
|
+
assert.ok(typeof module.generateSpider === 'function', 'generateSpider should be a function');
|
|
22
|
+
});
|
|
23
|
+
it('should export generateSpiderFromOcean function for direct OCEAN input', async () => {
|
|
24
|
+
const module = await import('./generate-spider.js');
|
|
25
|
+
assert.ok(typeof module.generateSpiderFromOcean === 'function', 'generateSpiderFromOcean should be a function');
|
|
26
|
+
});
|
|
27
|
+
it('should export generateOverlaySpider function for comparison mode', async () => {
|
|
28
|
+
const module = await import('./generate-spider.js');
|
|
29
|
+
assert.ok(typeof module.generateOverlaySpider === 'function', 'generateOverlaySpider should be a function');
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// AC2: Takes theme + agent as input, outputs SVG
|
|
34
|
+
// ============================================================================
|
|
35
|
+
describe('AC2: Theme + Agent Input -> SVG Output', () => {
|
|
36
|
+
it('should generate SVG string from theme and agent', async () => {
|
|
37
|
+
const { generateSpider } = await import('./generate-spider.js');
|
|
38
|
+
const svg = generateSpider('deadwood', 'sm');
|
|
39
|
+
assert.ok(typeof svg === 'string', 'Should return string');
|
|
40
|
+
assert.ok(svg.includes('<svg'), 'Should contain SVG opening tag');
|
|
41
|
+
assert.ok(svg.includes('</svg>'), 'Should contain SVG closing tag');
|
|
42
|
+
});
|
|
43
|
+
it('should work for all 10 agent roles', async () => {
|
|
44
|
+
const { generateSpider } = await import('./generate-spider.js');
|
|
45
|
+
const roles = [
|
|
46
|
+
'orchestrator',
|
|
47
|
+
'sm',
|
|
48
|
+
'tea',
|
|
49
|
+
'dev',
|
|
50
|
+
'reviewer',
|
|
51
|
+
'architect',
|
|
52
|
+
'pm',
|
|
53
|
+
'tech-writer',
|
|
54
|
+
'ux-designer',
|
|
55
|
+
'devops',
|
|
56
|
+
];
|
|
57
|
+
for (const role of roles) {
|
|
58
|
+
const svg = generateSpider('deadwood', role);
|
|
59
|
+
assert.ok(svg.includes('<svg'), `Should generate SVG for ${role}`);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
it('should throw error for non-existent theme', async () => {
|
|
63
|
+
const { generateSpider } = await import('./generate-spider.js');
|
|
64
|
+
assert.throws(() => generateSpider('nonexistent-theme', 'sm'), /theme.*not found/i, 'Should throw error for missing theme');
|
|
65
|
+
});
|
|
66
|
+
it('should throw error for non-existent agent', async () => {
|
|
67
|
+
const { generateSpider } = await import('./generate-spider.js');
|
|
68
|
+
assert.throws(() => generateSpider('deadwood', 'nonexistent-agent'), /agent.*not found/i, 'Should throw error for missing agent');
|
|
69
|
+
});
|
|
70
|
+
it('should accept OCEAN scores directly via generateSpiderFromOcean', async () => {
|
|
71
|
+
const { generateSpiderFromOcean } = await import('./generate-spider.js');
|
|
72
|
+
const svg = generateSpiderFromOcean({ O: 3, C: 4, E: 2, A: 5, N: 1 });
|
|
73
|
+
assert.ok(typeof svg === 'string', 'Should return string');
|
|
74
|
+
assert.ok(svg.includes('<svg'), 'Should contain SVG opening tag');
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
// ============================================================================
|
|
78
|
+
// AC3: Spider charts clearly show all 5 OCEAN dimensions
|
|
79
|
+
// ============================================================================
|
|
80
|
+
describe('AC3: Pentagon Structure with 5 OCEAN Dimensions', () => {
|
|
81
|
+
it('should generate a polygon element for the data', async () => {
|
|
82
|
+
const { generateSpider } = await import('./generate-spider.js');
|
|
83
|
+
const svg = generateSpider('deadwood', 'sm');
|
|
84
|
+
assert.ok(svg.includes('<polygon') || svg.includes('<path'), 'Should contain polygon or path element for data shape');
|
|
85
|
+
});
|
|
86
|
+
it('should label all 5 OCEAN dimensions', async () => {
|
|
87
|
+
const { generateSpider } = await import('./generate-spider.js');
|
|
88
|
+
const svg = generateSpider('deadwood', 'sm');
|
|
89
|
+
// Check for dimension labels (as text elements or in comments)
|
|
90
|
+
const hasO = svg.includes('>O<') || svg.includes('"O"') || svg.includes('Openness');
|
|
91
|
+
const hasC = svg.includes('>C<') || svg.includes('"C"') || svg.includes('Conscientiousness');
|
|
92
|
+
const hasE = svg.includes('>E<') || svg.includes('"E"') || svg.includes('Extraversion');
|
|
93
|
+
const hasA = svg.includes('>A<') || svg.includes('"A"') || svg.includes('Agreeableness');
|
|
94
|
+
const hasN = svg.includes('>N<') || svg.includes('"N"') || svg.includes('Neuroticism');
|
|
95
|
+
assert.ok(hasO, 'Should label Openness dimension');
|
|
96
|
+
assert.ok(hasC, 'Should label Conscientiousness dimension');
|
|
97
|
+
assert.ok(hasE, 'Should label Extraversion dimension');
|
|
98
|
+
assert.ok(hasA, 'Should label Agreeableness dimension');
|
|
99
|
+
assert.ok(hasN, 'Should label Neuroticism dimension');
|
|
100
|
+
});
|
|
101
|
+
it('should include grid lines for reference (5 levels)', async () => {
|
|
102
|
+
const { generateSpider } = await import('./generate-spider.js');
|
|
103
|
+
const svg = generateSpider('deadwood', 'sm');
|
|
104
|
+
// Grid lines create concentric pentagons
|
|
105
|
+
// Count polygon/path elements - should have at least 5 for grid + 1 for data
|
|
106
|
+
const polygonCount = (svg.match(/<polygon/g) || []).length;
|
|
107
|
+
const pathCount = (svg.match(/<path/g) || []).length;
|
|
108
|
+
// Grid could be polygons or paths - at minimum should have grid structure
|
|
109
|
+
assert.ok(polygonCount >= 1 || pathCount >= 5, 'Should have grid lines (pentagons or paths for 5 levels)');
|
|
110
|
+
});
|
|
111
|
+
it('should have 5 axis lines from center to vertices', async () => {
|
|
112
|
+
const { generateSpider } = await import('./generate-spider.js');
|
|
113
|
+
const svg = generateSpider('deadwood', 'sm');
|
|
114
|
+
// Axis lines are typically <line> elements
|
|
115
|
+
const lineCount = (svg.match(/<line/g) || []).length;
|
|
116
|
+
assert.ok(lineCount >= 5, `Should have at least 5 axis lines, found ${lineCount}`);
|
|
117
|
+
});
|
|
118
|
+
it('should use unfilled polygon (stroke only, no fill)', async () => {
|
|
119
|
+
const { generateSpider } = await import('./generate-spider.js');
|
|
120
|
+
const svg = generateSpider('deadwood', 'sm');
|
|
121
|
+
// The data polygon should have fill="none" or no fill
|
|
122
|
+
// Looking for the data polygon specifically (not grid lines)
|
|
123
|
+
assert.ok(svg.includes('fill="none"') || !svg.includes('fill="'), 'Data polygon should be unfilled (stroke only)');
|
|
124
|
+
});
|
|
125
|
+
it('should map score 1 to 20% radius and score 5 to 100% radius', async () => {
|
|
126
|
+
const { generateSpiderFromOcean } = await import('./generate-spider.js');
|
|
127
|
+
// Generate with all 1s - polygon should be small (inner)
|
|
128
|
+
const small = generateSpiderFromOcean({ O: 1, C: 1, E: 1, A: 1, N: 1 });
|
|
129
|
+
// Generate with all 5s - polygon should be large (outer)
|
|
130
|
+
const large = generateSpiderFromOcean({ O: 5, C: 5, E: 5, A: 5, N: 5 });
|
|
131
|
+
// SVGs should be different (different polygon sizes)
|
|
132
|
+
assert.notStrictEqual(small, large, 'Score 1-1-1-1-1 and 5-5-5-5-5 should produce different polygons');
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
// ============================================================================
|
|
136
|
+
// AC4: Overlay mode compares 2-3 characters on same chart
|
|
137
|
+
// ============================================================================
|
|
138
|
+
describe('AC4: Overlay Mode for Character Comparison', () => {
|
|
139
|
+
it('should accept array of theme+agent pairs for overlay', async () => {
|
|
140
|
+
const { generateOverlaySpider } = await import('./generate-spider.js');
|
|
141
|
+
const svg = generateOverlaySpider([
|
|
142
|
+
{ theme: 'deadwood', agent: 'sm' },
|
|
143
|
+
{ theme: 'firefly', agent: 'sm' },
|
|
144
|
+
]);
|
|
145
|
+
assert.ok(typeof svg === 'string', 'Should return string');
|
|
146
|
+
assert.ok(svg.includes('<svg'), 'Should contain SVG');
|
|
147
|
+
});
|
|
148
|
+
it('should render 2 distinct polygons for 2 characters', async () => {
|
|
149
|
+
const { generateOverlaySpider } = await import('./generate-spider.js');
|
|
150
|
+
const svg = generateOverlaySpider([
|
|
151
|
+
{ theme: 'deadwood', agent: 'sm' },
|
|
152
|
+
{ theme: 'firefly', agent: 'sm' },
|
|
153
|
+
]);
|
|
154
|
+
// Count data polygons (excluding grid)
|
|
155
|
+
// Grid lines typically have a specific class or lighter stroke
|
|
156
|
+
const polygonMatches = svg.match(/<polygon[^>]*>/g) || [];
|
|
157
|
+
const pathMatches = svg.match(/<path[^>]*d="M[^"]*"[^>]*>/g) || [];
|
|
158
|
+
// Should have at least 2 data shapes
|
|
159
|
+
assert.ok(polygonMatches.length >= 2 || pathMatches.length >= 2, 'Should have at least 2 data polygons for comparison');
|
|
160
|
+
});
|
|
161
|
+
it('should render 3 distinct polygons for 3 characters', async () => {
|
|
162
|
+
const { generateOverlaySpider } = await import('./generate-spider.js');
|
|
163
|
+
const svg = generateOverlaySpider([
|
|
164
|
+
{ theme: 'deadwood', agent: 'sm' },
|
|
165
|
+
{ theme: 'firefly', agent: 'sm' },
|
|
166
|
+
{ theme: 'star-trek-tng', agent: 'sm' },
|
|
167
|
+
]);
|
|
168
|
+
// Should have at least 3 data shapes
|
|
169
|
+
const polygonMatches = svg.match(/<polygon[^>]*>/g) || [];
|
|
170
|
+
const pathMatches = svg.match(/<path[^>]*d="M[^"]*"[^>]*>/g) || [];
|
|
171
|
+
assert.ok(polygonMatches.length >= 3 || pathMatches.length >= 3, 'Should have at least 3 data polygons for comparison');
|
|
172
|
+
});
|
|
173
|
+
it('should use different stroke colors for each character', async () => {
|
|
174
|
+
const { generateOverlaySpider } = await import('./generate-spider.js');
|
|
175
|
+
const svg = generateOverlaySpider([
|
|
176
|
+
{ theme: 'deadwood', agent: 'sm' },
|
|
177
|
+
{ theme: 'firefly', agent: 'sm' },
|
|
178
|
+
]);
|
|
179
|
+
// Extract stroke colors - should find at least 2 different colors
|
|
180
|
+
const strokeColors = svg.match(/stroke="([^"]+)"/g) || [];
|
|
181
|
+
const uniqueColors = new Set(strokeColors);
|
|
182
|
+
assert.ok(uniqueColors.size >= 2, 'Should use different stroke colors for different characters');
|
|
183
|
+
});
|
|
184
|
+
it('should include legend identifying each character', async () => {
|
|
185
|
+
const { generateOverlaySpider } = await import('./generate-spider.js');
|
|
186
|
+
const svg = generateOverlaySpider([
|
|
187
|
+
{ theme: 'deadwood', agent: 'sm' },
|
|
188
|
+
{ theme: 'firefly', agent: 'sm' },
|
|
189
|
+
]);
|
|
190
|
+
// Legend should include theme or character names
|
|
191
|
+
assert.ok(svg.includes('deadwood') || svg.includes('Deadwood') ||
|
|
192
|
+
svg.includes('firefly') || svg.includes('Firefly'), 'Should include legend with theme/character names');
|
|
193
|
+
});
|
|
194
|
+
it('should accept optional labels for overlay characters', async () => {
|
|
195
|
+
const { generateOverlaySpider } = await import('./generate-spider.js');
|
|
196
|
+
const svg = generateOverlaySpider([
|
|
197
|
+
{ theme: 'deadwood', agent: 'sm', label: 'Al Swearengen' },
|
|
198
|
+
{ theme: 'firefly', agent: 'sm', label: 'Mal Reynolds' },
|
|
199
|
+
]);
|
|
200
|
+
assert.ok(svg.includes('Al Swearengen') || svg.includes('Mal Reynolds'), 'Should display custom labels when provided');
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
// ============================================================================
|
|
204
|
+
// AC5: SVGs render correctly in browsers and markdown
|
|
205
|
+
// ============================================================================
|
|
206
|
+
describe('AC5: Valid SVG Structure', () => {
|
|
207
|
+
it('should include viewBox attribute for scaling', async () => {
|
|
208
|
+
const { generateSpider } = await import('./generate-spider.js');
|
|
209
|
+
const svg = generateSpider('deadwood', 'sm');
|
|
210
|
+
assert.ok(svg.includes('viewBox='), 'Should have viewBox attribute for proper scaling');
|
|
211
|
+
});
|
|
212
|
+
it('should include xmlns attribute for browser compatibility', async () => {
|
|
213
|
+
const { generateSpider } = await import('./generate-spider.js');
|
|
214
|
+
const svg = generateSpider('deadwood', 'sm');
|
|
215
|
+
assert.ok(svg.includes('xmlns="http://www.w3.org/2000/svg"'), 'Should have SVG xmlns for browser rendering');
|
|
216
|
+
});
|
|
217
|
+
it('should be well-formed XML', async () => {
|
|
218
|
+
const { generateSpider } = await import('./generate-spider.js');
|
|
219
|
+
const svg = generateSpider('deadwood', 'sm');
|
|
220
|
+
assert.ok(svg.startsWith('<svg'), 'Should start with <svg');
|
|
221
|
+
assert.ok(svg.endsWith('</svg>'), 'Should end with </svg>');
|
|
222
|
+
});
|
|
223
|
+
it('should use text elements for dimension labels', async () => {
|
|
224
|
+
const { generateSpider } = await import('./generate-spider.js');
|
|
225
|
+
const svg = generateSpider('deadwood', 'sm');
|
|
226
|
+
const textCount = (svg.match(/<text/g) || []).length;
|
|
227
|
+
assert.ok(textCount >= 5, `Should have at least 5 text elements for labels, found ${textCount}`);
|
|
228
|
+
});
|
|
229
|
+
it('should have consistent stroke styling', async () => {
|
|
230
|
+
const { generateSpider } = await import('./generate-spider.js');
|
|
231
|
+
const svg = generateSpider('deadwood', 'sm');
|
|
232
|
+
assert.ok(svg.includes('stroke='), 'Should use stroke for lines');
|
|
233
|
+
assert.ok(svg.includes('stroke-width'), 'Should specify stroke-width');
|
|
234
|
+
});
|
|
235
|
+
it('should use 200x200 viewBox like face generator', async () => {
|
|
236
|
+
const { generateSpider } = await import('./generate-spider.js');
|
|
237
|
+
const svg = generateSpider('deadwood', 'sm');
|
|
238
|
+
assert.ok(svg.includes('viewBox="0 0 200 200"'), 'Should use 200x200 viewBox for consistency with face generator');
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
// ============================================================================
|
|
242
|
+
// Integration: Full Pipeline Test
|
|
243
|
+
// ============================================================================
|
|
244
|
+
describe('Integration: Spider Chart Generation Pipeline', () => {
|
|
245
|
+
it('should generate valid SVG for multiple themes', async () => {
|
|
246
|
+
const { generateSpider } = await import('./generate-spider.js');
|
|
247
|
+
const themes = ['deadwood', 'firefly', 'star-trek-tng', 'discworld'];
|
|
248
|
+
for (const theme of themes) {
|
|
249
|
+
const svg = generateSpider(theme, 'sm');
|
|
250
|
+
assert.ok(svg.includes('<svg') && svg.includes('</svg>'), `Should generate valid SVG for ${theme}`);
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
it('should produce visually different charts for different OCEAN profiles', async () => {
|
|
254
|
+
const { generateSpiderFromOcean } = await import('./generate-spider.js');
|
|
255
|
+
const introvert = generateSpiderFromOcean({ O: 4, C: 3, E: 1, A: 3, N: 2 });
|
|
256
|
+
const extravert = generateSpiderFromOcean({ O: 4, C: 3, E: 5, A: 3, N: 2 });
|
|
257
|
+
assert.notStrictEqual(introvert, extravert, 'Different E scores should produce different charts');
|
|
258
|
+
});
|
|
259
|
+
it('should work with overlay of same agent across themes', async () => {
|
|
260
|
+
const { generateOverlaySpider } = await import('./generate-spider.js');
|
|
261
|
+
const svg = generateOverlaySpider([
|
|
262
|
+
{ theme: 'deadwood', agent: 'reviewer' },
|
|
263
|
+
{ theme: 'firefly', agent: 'reviewer' },
|
|
264
|
+
{ theme: 'star-trek-tng', agent: 'reviewer' },
|
|
265
|
+
]);
|
|
266
|
+
assert.ok(svg.includes('<svg') && svg.includes('</svg>'), 'Should generate valid overlay SVG');
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
//# sourceMappingURL=generate-spider.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-spider.test.js","sourceRoot":"","sources":["../../src/scripts/generate-spider.test.ts"],"names":[],"mappings":"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"}
|