@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,1041 @@
|
|
|
1
|
+
# Tactical Agent Behavior (Shared)
|
|
2
|
+
|
|
3
|
+
**This file defines common behavior for tactical agents (SM, TEA, Dev, Reviewer).**
|
|
4
|
+
|
|
5
|
+
Auto-loaded by `/prime --agent <name>` for tactical agents only.
|
|
6
|
+
|
|
7
|
+
Tactical agents work on story-scoped tasks within the TDD flow: SM → TEA → Dev → Reviewer
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Critical Pattern: Bash Tool with Absolute Paths
|
|
12
|
+
|
|
13
|
+
⚠️ **ALL tactical agents must follow this pattern when using the Bash tool.**
|
|
14
|
+
|
|
15
|
+
### The Problem
|
|
16
|
+
|
|
17
|
+
The Bash tool maintains a persistent working directory across calls, but relative `cd` commands fail when already in a different directory. This is the #1 source of frustration and wasted time.
|
|
18
|
+
|
|
19
|
+
**Symptoms:**
|
|
20
|
+
- `cd API && just test` fails with "no such file or directory: API"
|
|
21
|
+
- Already in `API` but trying to `cd API` again
|
|
22
|
+
- Commands fail because assuming wrong directory
|
|
23
|
+
|
|
24
|
+
### The Solution: Always Use Absolute Paths
|
|
25
|
+
|
|
26
|
+
1. **At session start, use the PROJECT_ROOT from the `<env>` block:**
|
|
27
|
+
```
|
|
28
|
+
Working directory: $CLAUDE_PROJECT_DIR
|
|
29
|
+
```
|
|
30
|
+
This is your absolute reference point!
|
|
31
|
+
|
|
32
|
+
2. **Always use absolute paths for cd:**
|
|
33
|
+
```bash
|
|
34
|
+
# WRONG - relative cd fails if you're already somewhere else
|
|
35
|
+
cd myrepo && just test
|
|
36
|
+
|
|
37
|
+
# CORRECT - absolute path always works
|
|
38
|
+
cd $CLAUDE_PROJECT_DIR && just test
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
3. **Best Practice - Explicit cd in every Bash call that needs a specific directory:**
|
|
42
|
+
```bash
|
|
43
|
+
# Single repo project
|
|
44
|
+
cd $CLAUDE_PROJECT_DIR && git push -u origin feat/branch
|
|
45
|
+
cd $CLAUDE_PROJECT_DIR && just test
|
|
46
|
+
|
|
47
|
+
# Multi-repo project (use repo-utils.sh)
|
|
48
|
+
source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
|
|
49
|
+
for repo in $(get_repo_names); do
|
|
50
|
+
cd $CLAUDE_PROJECT_DIR/$(get_repo_path "$repo") && $(get_test_command "$repo")
|
|
51
|
+
done
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Why This Works
|
|
55
|
+
|
|
56
|
+
- Absolute paths work from ANY directory
|
|
57
|
+
- No need to track where you are
|
|
58
|
+
- Explicit `cd` in every command that needs it = no confusion
|
|
59
|
+
- The `&&` ensures the command only runs if cd succeeds
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Single-Repo Projects
|
|
64
|
+
|
|
65
|
+
For projects where Pennyfarthing is installed directly in the repo (not as an orchestrator):
|
|
66
|
+
|
|
67
|
+
### Configuration
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
# .claude/project/repos.yaml
|
|
71
|
+
repos:
|
|
72
|
+
my-project:
|
|
73
|
+
path: . # "." means project root IS the repo
|
|
74
|
+
type: service # or: api, ui, cli, lib, monorepo
|
|
75
|
+
language: go # or: typescript, python, rust, etc.
|
|
76
|
+
test_command: just test
|
|
77
|
+
build_command: just build
|
|
78
|
+
lint_command: just lint
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Key Differences from Multi-Repo
|
|
82
|
+
|
|
83
|
+
| Aspect | Multi-Repo | Single-Repo |
|
|
84
|
+
|--------|------------|-------------|
|
|
85
|
+
| `path` | `api/`, `ui/` | `.` (project root) |
|
|
86
|
+
| Branches | One per repo | One branch total |
|
|
87
|
+
| PRs | Multiple PRs | Single PR |
|
|
88
|
+
| `cd` pattern | `cd $PROJECT_ROOT/$repo_path` | `cd $PROJECT_ROOT` |
|
|
89
|
+
|
|
90
|
+
### Commands Still Work
|
|
91
|
+
|
|
92
|
+
The same repo-utils functions work — they just iterate over one repo:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
|
|
96
|
+
|
|
97
|
+
# Returns single repo name
|
|
98
|
+
get_repos # → "my-project"
|
|
99
|
+
|
|
100
|
+
# Path is "." so this works:
|
|
101
|
+
cd $CLAUDE_PROJECT_DIR/$(get_repo_path "my-project")
|
|
102
|
+
# Equivalent to: cd $CLAUDE_PROJECT_DIR/.
|
|
103
|
+
|
|
104
|
+
# Test command
|
|
105
|
+
$(get_test_command "my-project") # → "just test"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Simplified Patterns
|
|
109
|
+
|
|
110
|
+
For single-repo, you can also just work directly:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
# Direct approach (single-repo only)
|
|
114
|
+
cd $CLAUDE_PROJECT_DIR && just test
|
|
115
|
+
cd $CLAUDE_PROJECT_DIR && just build
|
|
116
|
+
|
|
117
|
+
# Still works with repo-utils (recommended for consistency)
|
|
118
|
+
for repo in $(get_repos); do
|
|
119
|
+
cd $CLAUDE_PROJECT_DIR/$(get_repo_path "$repo")
|
|
120
|
+
eval "$(get_test_command "$repo")"
|
|
121
|
+
done
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Multi-Repo Operations
|
|
127
|
+
|
|
128
|
+
For projects with multiple repositories, use `repo-utils.sh` for dynamic iteration.
|
|
129
|
+
|
|
130
|
+
### Loading Repo Configuration
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
|
|
134
|
+
|
|
135
|
+
# Check configuration mode
|
|
136
|
+
if is_legacy_mode; then
|
|
137
|
+
echo "Using legacy API_REPO/UI_REPO mode"
|
|
138
|
+
else
|
|
139
|
+
echo "Using repos.yaml configuration"
|
|
140
|
+
fi
|
|
141
|
+
|
|
142
|
+
# Show current configuration
|
|
143
|
+
show_config
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Iterating Through Repos
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
|
|
150
|
+
|
|
151
|
+
# All repos
|
|
152
|
+
for repo in $(get_repos); do
|
|
153
|
+
repo_path=$(get_repo_path "$repo")
|
|
154
|
+
repo_type=$(get_repo_type "$repo")
|
|
155
|
+
|
|
156
|
+
echo "=== $repo ($repo_type) ==="
|
|
157
|
+
cd $CLAUDE_PROJECT_DIR/$repo_path
|
|
158
|
+
git status --short
|
|
159
|
+
done
|
|
160
|
+
|
|
161
|
+
# Filter by type (api, ui, adapter, service, shared, lib)
|
|
162
|
+
for repo in $(get_repos_of_type "api"); do
|
|
163
|
+
cd $CLAUDE_PROJECT_DIR/$(get_repo_path "$repo")
|
|
164
|
+
# API-specific operations
|
|
165
|
+
done
|
|
166
|
+
|
|
167
|
+
# Build order (respects dependencies)
|
|
168
|
+
for repo in $(get_build_order); do
|
|
169
|
+
cd $CLAUDE_PROJECT_DIR/$(get_repo_path "$repo")
|
|
170
|
+
eval "$(get_build_command "$repo")"
|
|
171
|
+
done
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Getting Repo Information
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
|
|
178
|
+
|
|
179
|
+
# For a specific repo
|
|
180
|
+
repo="conductor-api"
|
|
181
|
+
get_repo_path "$repo" # conductor-api
|
|
182
|
+
get_repo_type "$repo" # api
|
|
183
|
+
get_repo_language "$repo" # go
|
|
184
|
+
get_test_command "$repo" # just test
|
|
185
|
+
get_build_command "$repo" # just build
|
|
186
|
+
get_lint_command "$repo" # golangci-lint run
|
|
187
|
+
get_dependencies "$repo" # comma-separated list or empty
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Running Tests Across Repos
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
|
|
194
|
+
|
|
195
|
+
# Run tests in all repos
|
|
196
|
+
run_all_tests
|
|
197
|
+
|
|
198
|
+
# Run tests for specific type
|
|
199
|
+
run_tests_of_type "api"
|
|
200
|
+
|
|
201
|
+
# Manual iteration with custom logic
|
|
202
|
+
for repo in $(get_repos); do
|
|
203
|
+
test_cmd=$(get_test_command "$repo")
|
|
204
|
+
if [ -n "$test_cmd" ]; then
|
|
205
|
+
cd $CLAUDE_PROJECT_DIR/$(get_repo_path "$repo")
|
|
206
|
+
eval "$test_cmd" 2>&1 | tee $CLAUDE_PROJECT_DIR/.session/test-${STORY_ID}-${repo}.log
|
|
207
|
+
fi
|
|
208
|
+
done
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Filtering Repos by Session Scope
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
|
|
215
|
+
|
|
216
|
+
# Extract scope from session file
|
|
217
|
+
REPOS=$(grep "^\*\*Repos:\*\*" $SESSION_FILE | cut -d: -f2 | xargs)
|
|
218
|
+
|
|
219
|
+
# filter_repos handles: all, both, api, ui, adapter, or comma-separated names
|
|
220
|
+
for repo in $(filter_repos "$REPOS"); do
|
|
221
|
+
# Work on this repo
|
|
222
|
+
done
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Skill References for Subagents
|
|
228
|
+
|
|
229
|
+
When spawning subagents that need specialized knowledge, reference the appropriate skill file in the prompt:
|
|
230
|
+
|
|
231
|
+
### Testing
|
|
232
|
+
```
|
|
233
|
+
Read the testing skill at .claude/skills/testing/SKILL.md for test commands.
|
|
234
|
+
For troubleshooting, see .claude/skills/testing/references/troubleshooting.md
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Just Commands
|
|
238
|
+
```
|
|
239
|
+
Read the just skill at .claude/skills/just/SKILL.md for available commands.
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Code Patterns
|
|
243
|
+
```
|
|
244
|
+
Read .claude/skills/dev-patterns/SKILL.md for common patterns and fixes.
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**Why this matters:** Subagents don't automatically load skills. Including the skill reference in the prompt ensures they have access to project-specific commands and patterns.
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
### For Worktrees
|
|
252
|
+
|
|
253
|
+
Same pattern - use absolute paths:
|
|
254
|
+
```bash
|
|
255
|
+
# WRONG
|
|
256
|
+
cd worktrees/11-2/myrepo && just test
|
|
257
|
+
|
|
258
|
+
# CORRECT (single-repo)
|
|
259
|
+
cd $CLAUDE_PROJECT_DIR/worktrees/11-2 && just test
|
|
260
|
+
|
|
261
|
+
# CORRECT (multi-repo with dynamic lookup)
|
|
262
|
+
WORKTREE="$CLAUDE_PROJECT_DIR/worktrees/11-2"
|
|
263
|
+
source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
|
|
264
|
+
cd $WORKTREE/$(get_repo_path "myrepo") && just test
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## On Activation (All Tactical Agents)
|
|
270
|
+
|
|
271
|
+
Every tactical agent MUST perform these steps on activation:
|
|
272
|
+
|
|
273
|
+
### Step 1: Check for Active Work
|
|
274
|
+
|
|
275
|
+
**Session File Naming Convention:**
|
|
276
|
+
- Pattern: `.session/{story-id}-session.md`
|
|
277
|
+
- Examples: `2-1-session.md`, `5-3a-session.md`, `epic-4-session.md`
|
|
278
|
+
- Story ID matches sprint YAML (e.g., story `id: "2-1"` → `2-1-session.md`)
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
cd $CLAUDE_PROJECT_DIR
|
|
282
|
+
|
|
283
|
+
# Find ALL session files
|
|
284
|
+
SESSIONS=($(ls .session/*-session.md 2>/dev/null))
|
|
285
|
+
|
|
286
|
+
# Each session is named after its story ID
|
|
287
|
+
# e.g., 2-1-session.md, 5-3a-session.md
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Step 2: Handle Multiple Sessions
|
|
291
|
+
|
|
292
|
+
If multiple sessions exist, check which are relevant to this agent:
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
cd $CLAUDE_PROJECT_DIR
|
|
296
|
+
|
|
297
|
+
# Find sessions relevant to this agent based on Phase
|
|
298
|
+
MY_SESSIONS=()
|
|
299
|
+
for f in .session/*-session.md; do
|
|
300
|
+
PHASE=$(grep "^\*\*Phase:\*\*" "$f" | sed 's/.*\*\* //')
|
|
301
|
+
case "$AGENT_TYPE" in
|
|
302
|
+
sm) [[ "$PHASE" =~ ^(sm-setup|approved)$ ]] && MY_SESSIONS+=("$f") ;;
|
|
303
|
+
tea) [[ "$PHASE" == "tea" ]] && MY_SESSIONS+=("$f") ;;
|
|
304
|
+
dev) [[ "$PHASE" == "dev" ]] && MY_SESSIONS+=("$f") ;;
|
|
305
|
+
reviewer) [[ "$PHASE" == "review" ]] && MY_SESSIONS+=("$f") ;;
|
|
306
|
+
esac
|
|
307
|
+
done
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
**If multiple relevant sessions exist, ask:**
|
|
311
|
+
```
|
|
312
|
+
Multiple sessions need my attention:
|
|
313
|
+
- 2-1-session.md (Phase: dev) - Story 2-1: Add logging
|
|
314
|
+
- 5-3a-session.md (Phase: dev) - Story 5-3a: Fix auth bug
|
|
315
|
+
|
|
316
|
+
Which session should I work on?
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
**Detecting worktree context from session file content:**
|
|
320
|
+
```bash
|
|
321
|
+
# Read worktree info from session file (if present)
|
|
322
|
+
if grep -q "^worktree:" "$SESSION_FILE"; then
|
|
323
|
+
WORKTREE_NAME=$(grep "^worktree:" "$SESSION_FILE" | cut -d' ' -f2)
|
|
324
|
+
WORKTREE_PATH=$(grep "^path:" "$SESSION_FILE" | cut -d' ' -f2)
|
|
325
|
+
fi
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
See `pennyfarthing-dist/guides/worktree-mode.md` for complete worktree documentation.
|
|
329
|
+
|
|
330
|
+
### Step 3: Check Phase and Handoff Status
|
|
331
|
+
|
|
332
|
+
Read the selected session file and parse:
|
|
333
|
+
- **Phase:** field (sm, tea, dev, review, approved) - PRIMARY handoff indicator
|
|
334
|
+
- **Status:** field (e.g., `in-progress`, `review`)
|
|
335
|
+
- **Feature Branch:** field for branch name
|
|
336
|
+
- **Repos:** field to determine which repos are affected
|
|
337
|
+
- **Scope:** field (backend/frontend/both) - determines which test patterns to use
|
|
338
|
+
|
|
339
|
+
**Phase Values (for handoff detection):**
|
|
340
|
+
| Phase | Current Agent | Next Agent |
|
|
341
|
+
|-------|---------------|------------|
|
|
342
|
+
| `sm` | SM setting up | TEA |
|
|
343
|
+
| `tea` | TEA writing tests | Dev |
|
|
344
|
+
| `dev` | Dev implementing | Reviewer |
|
|
345
|
+
| `review` | Reviewer reviewing | SM (if approved) or Dev (if rejected) |
|
|
346
|
+
| `approved` | Ready for finish | SM |
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
# Extract scope from session file
|
|
350
|
+
SCOPE=$(grep "^\*\*Scope:\*\*" $SESSION_FILE | cut -d: -f2 | xargs | tr '[:upper:]' '[:lower:]')
|
|
351
|
+
|
|
352
|
+
# If scope not in session file, derive from repos
|
|
353
|
+
if [ -z "$SCOPE" ]; then
|
|
354
|
+
REPOS=$(grep "^\*\*Repos:\*\*" $SESSION_FILE | cut -d: -f2 | xargs | tr '[:upper:]' '[:lower:]')
|
|
355
|
+
case "$REPOS" in
|
|
356
|
+
api) SCOPE="backend" ;;
|
|
357
|
+
ui) SCOPE="frontend" ;;
|
|
358
|
+
*) SCOPE="both" ;;
|
|
359
|
+
esac
|
|
360
|
+
fi
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### Step 4: Verify Actual State (CRITICAL)
|
|
364
|
+
|
|
365
|
+
**MANDATORY:** Before offering to start work, verify the actual state matches the session file.
|
|
366
|
+
|
|
367
|
+
```bash
|
|
368
|
+
cd $CLAUDE_PROJECT_DIR
|
|
369
|
+
|
|
370
|
+
# Check for uncommitted work in affected repos
|
|
371
|
+
REPOS=$(grep "^\*\*Repos:\*\*" $SESSION_FILE | cut -d: -f2 | xargs | tr '[:upper:]' '[:lower:]')
|
|
372
|
+
|
|
373
|
+
case "$REPOS" in
|
|
374
|
+
*api*)
|
|
375
|
+
echo "=== API Status ==="
|
|
376
|
+
cd API && git status --short
|
|
377
|
+
cd ..
|
|
378
|
+
;;
|
|
379
|
+
esac
|
|
380
|
+
|
|
381
|
+
case "$REPOS" in
|
|
382
|
+
*ui*)
|
|
383
|
+
echo "=== UI Status ==="
|
|
384
|
+
cd UI && git status --short
|
|
385
|
+
cd ..
|
|
386
|
+
;;
|
|
387
|
+
esac
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
**If uncommitted changes exist:**
|
|
391
|
+
1. Report them to the user immediately
|
|
392
|
+
2. Ask: "Session file says [status] but I found uncommitted work. What should I do?"
|
|
393
|
+
3. Options: commit & continue, discard, or investigate
|
|
394
|
+
|
|
395
|
+
**If implementing (Dev agent), also verify test state:**
|
|
396
|
+
```bash
|
|
397
|
+
# Run tests to confirm actual RED/GREEN state
|
|
398
|
+
cd API && just test ./... 2>&1 | tail -5
|
|
399
|
+
cd ../UI && npm test -- --run 2>&1 | tail -10
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
**If test state differs from session file:**
|
|
403
|
+
1. Report: "Session says RED but tests are GREEN" (or vice versa)
|
|
404
|
+
2. Update session file to reflect reality
|
|
405
|
+
3. Offer appropriate next action
|
|
406
|
+
|
|
407
|
+
**Why this matters:** Session files can become stale if a previous session crashed, was interrupted, or forgot to update. Always trust `git status` and test results over documentation.
|
|
408
|
+
|
|
409
|
+
---
|
|
410
|
+
|
|
411
|
+
### Step 5: Create/Checkout Feature Branches
|
|
412
|
+
|
|
413
|
+
**MANDATORY:** All tactical agents must ensure they're on the correct branches before starting work.
|
|
414
|
+
|
|
415
|
+
```bash
|
|
416
|
+
cd $CLAUDE_PROJECT_DIR
|
|
417
|
+
|
|
418
|
+
# Extract from session file
|
|
419
|
+
BRANCH=$(grep "Feature Branch:" $SESSION_FILE | cut -d: -f2 | xargs)
|
|
420
|
+
REPOS=$(grep "Repos:" $SESSION_FILE | cut -d: -f2 | xargs | tr '[:upper:]' '[:lower:]')
|
|
421
|
+
|
|
422
|
+
# Map repo field to script parameter
|
|
423
|
+
# "API" → "api", "UI" → "ui", "Both" → "all", etc.
|
|
424
|
+
case "$REPOS" in
|
|
425
|
+
*api*ui* | *ui*api* | both) REPOS="all" ;;
|
|
426
|
+
*api*) REPOS="api" ;;
|
|
427
|
+
*ui*) REPOS="ui" ;;
|
|
428
|
+
*sim-ui*) REPOS="sim-ui" ;;
|
|
429
|
+
*sim*) REPOS="sim" ;;
|
|
430
|
+
*) REPOS="all" ;; # Default to all if unclear
|
|
431
|
+
esac
|
|
432
|
+
|
|
433
|
+
# Create or checkout branches (idempotent, includes verification)
|
|
434
|
+
./scripts/run.sh create-feature-branches.sh "$BRANCH" "$REPOS"
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
**What this does:**
|
|
438
|
+
- ✅ Creates branches if they don't exist (from develop)
|
|
439
|
+
- ✅ Checks out existing branches if they do exist
|
|
440
|
+
- ✅ Verifies branches are correct
|
|
441
|
+
- ✅ Shows sync status with remote
|
|
442
|
+
- ✅ Works in both main checkout and worktrees
|
|
443
|
+
|
|
444
|
+
**Never skip this step.** It ensures consistency across all agents in the TDD flow.
|
|
445
|
+
|
|
446
|
+
### Step 6: Offer to Start if Handed Off
|
|
447
|
+
|
|
448
|
+
If this agent is the "Next Agent", offer to start immediately:
|
|
449
|
+
|
|
450
|
+
| Agent | Match Pattern | Action |
|
|
451
|
+
|-------|---------------|--------|
|
|
452
|
+
| TEA | `Next Agent: TEA` or `Next Agent: Igor` | Offer to write tests |
|
|
453
|
+
| Dev | `Next Agent: Dev` or `Next Agent: Ponder` | Offer to implement |
|
|
454
|
+
| Reviewer | `Next Agent: Reviewer` or `Next Agent: Granny` or status=`review` | Offer to review |
|
|
455
|
+
|
|
456
|
+
**Offer format:**
|
|
457
|
+
```
|
|
458
|
+
I see [Story ID] is ready for [my task].
|
|
459
|
+
The handoff indicates I'm next.
|
|
460
|
+
|
|
461
|
+
**Story:** [title]
|
|
462
|
+
**Phase:** [current] → [next]
|
|
463
|
+
**Location:** [main checkout | worktrees/{name}]
|
|
464
|
+
|
|
465
|
+
Say 'yes' to start, or ask me something else.
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
### Step 7: If Not Handed Off
|
|
469
|
+
|
|
470
|
+
Show the agent's task menu and wait for selection.
|
|
471
|
+
|
|
472
|
+
## Session File Location
|
|
473
|
+
|
|
474
|
+
Tactical agents work with session files named after story IDs:
|
|
475
|
+
|
|
476
|
+
| Pattern | Example | Description |
|
|
477
|
+
|---------|---------|-------------|
|
|
478
|
+
| `{story-id}-session.md` | `2-1-session.md` | Story 2-1 from sprint |
|
|
479
|
+
| `{story-id}-session.md` | `5-3a-session.md` | Story 5-3a (worktree variant) |
|
|
480
|
+
| `epic-{id}-session.md` | `epic-4-session.md` | Epic-level work |
|
|
481
|
+
|
|
482
|
+
**Discovery:** `ls .session/*-session.md`
|
|
483
|
+
**Traceability:** Story ID → `sprint/current-sprint.yaml`
|
|
484
|
+
|
|
485
|
+
**For worktree sessions, check the Worktree Context section:**
|
|
486
|
+
```yaml
|
|
487
|
+
## Worktree Context
|
|
488
|
+
worktree: wt-5-3a
|
|
489
|
+
path: /path/to/worktrees/wt-5-3a
|
|
490
|
+
api_port: 8082
|
|
491
|
+
ui_port: 5175
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
**Always check the session file for:**
|
|
495
|
+
- `Phase:` field to determine whose turn it is (sm, tea, dev, review, approved)
|
|
496
|
+
- `Workflow:` field to know which workflow is active (tdd, trivial, etc.)
|
|
497
|
+
- `Phase Started:` field for when the current phase began (ISO 8601)
|
|
498
|
+
- `Repos:` field to know which subrepos to work in
|
|
499
|
+
- `Feature Branch:` field for branch names
|
|
500
|
+
- `worktree:` field if working in a worktree (use `path:` for commands)
|
|
501
|
+
|
|
502
|
+
## Workflow Tracking Section
|
|
503
|
+
|
|
504
|
+
Every session file includes a `## Workflow Tracking` section that tracks workflow state and phase history:
|
|
505
|
+
|
|
506
|
+
```markdown
|
|
507
|
+
## Workflow Tracking
|
|
508
|
+
**Workflow:** tdd
|
|
509
|
+
**Phase:** dev
|
|
510
|
+
**Phase Started:** 2026-01-13T14:30:00Z
|
|
511
|
+
|
|
512
|
+
### Phase History
|
|
513
|
+
| Phase | Started | Ended | Duration |
|
|
514
|
+
|-------|---------|-------|----------|
|
|
515
|
+
| sm | 2026-01-13T14:00:00Z | 2026-01-13T14:15:00Z | 15m |
|
|
516
|
+
| tea | 2026-01-13T14:15:00Z | 2026-01-13T14:30:00Z | 15m |
|
|
517
|
+
| dev | 2026-01-13T14:30:00Z | - | - |
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
**Field extraction (grep-friendly):**
|
|
521
|
+
```bash
|
|
522
|
+
# Extract workflow name (defaults to "tdd" if missing for backward compatibility)
|
|
523
|
+
WORKFLOW=$(grep "^\*\*Workflow:\*\*" "$SESSION_FILE" | head -1 | sed 's/\*\*Workflow:\*\* //' | xargs)
|
|
524
|
+
[ -z "$WORKFLOW" ] && WORKFLOW="tdd"
|
|
525
|
+
|
|
526
|
+
# Extract current phase
|
|
527
|
+
PHASE=$(grep "^\*\*Phase:\*\*" "$SESSION_FILE" | head -1 | sed 's/\*\*Phase:\*\* //' | xargs)
|
|
528
|
+
|
|
529
|
+
# Extract phase started timestamp
|
|
530
|
+
PHASE_STARTED=$(grep "^\*\*Phase Started:\*\*" "$SESSION_FILE" | head -1 | sed 's/\*\*Phase Started:\*\* //' | xargs)
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
**On phase transition:** Handoff subagents update this section:
|
|
534
|
+
1. Set previous phase's Ended timestamp and calculate Duration
|
|
535
|
+
2. Update `**Phase:**` to new phase name
|
|
536
|
+
3. Update `**Phase Started:**` to current timestamp
|
|
537
|
+
4. Add new row to Phase History table
|
|
538
|
+
|
|
539
|
+
## Phase Assessment Templates (MANDATORY)
|
|
540
|
+
|
|
541
|
+
Each agent MUST document their work using the structured template for their phase. This is what makes handoffs reliable.
|
|
542
|
+
|
|
543
|
+
### SM Assessment Template
|
|
544
|
+
```markdown
|
|
545
|
+
## SM Assessment
|
|
546
|
+
|
|
547
|
+
**Story:** {ID} - {title}
|
|
548
|
+
**Points:** {N} | **Priority:** {P0/P1/P2}
|
|
549
|
+
**Repos:** api | ui | both
|
|
550
|
+
**Branch:** feat/{story-id}-{description}
|
|
551
|
+
|
|
552
|
+
**Acceptance Criteria:**
|
|
553
|
+
- [ ] AC1: {criterion}
|
|
554
|
+
- [ ] AC2: {criterion}
|
|
555
|
+
|
|
556
|
+
**Technical Notes:** {any context Dev/TEA needs}
|
|
557
|
+
**Jira:** {MSSCI-XXXX} (claimed)
|
|
558
|
+
|
|
559
|
+
**Handoff:** To TEA for test writing
|
|
560
|
+
```
|
|
561
|
+
**Handoff phrase:** "TEA, Story X-Y is ready. Write failing tests for these ACs."
|
|
562
|
+
|
|
563
|
+
---
|
|
564
|
+
|
|
565
|
+
### TEA Assessment Template
|
|
566
|
+
```markdown
|
|
567
|
+
## TEA Assessment
|
|
568
|
+
|
|
569
|
+
**Tests Required:** Yes | No
|
|
570
|
+
**Reason:** {if No: documentation/config/dependency update}
|
|
571
|
+
|
|
572
|
+
**Test Files:** (if Yes)
|
|
573
|
+
- `path/to/test_file.go` - {description}
|
|
574
|
+
- `path/to/component.test.tsx` - {description}
|
|
575
|
+
|
|
576
|
+
**Tests Written:** {N} tests covering {M} ACs
|
|
577
|
+
**Status:** RED (failing - ready for Dev)
|
|
578
|
+
|
|
579
|
+
**Handoff:** To Dev for implementation
|
|
580
|
+
```
|
|
581
|
+
**Handoff phrase:** "Dev, tests are RED and ready. Make them GREEN."
|
|
582
|
+
|
|
583
|
+
---
|
|
584
|
+
|
|
585
|
+
### Dev Assessment Template
|
|
586
|
+
```markdown
|
|
587
|
+
## Dev Assessment
|
|
588
|
+
|
|
589
|
+
**Implementation Complete:** Yes
|
|
590
|
+
**Files Changed:**
|
|
591
|
+
- `path/to/file.go` - {description}
|
|
592
|
+
- `path/to/Component.tsx` - {description}
|
|
593
|
+
|
|
594
|
+
**Tests:** {N}/{N} passing (GREEN)
|
|
595
|
+
**PR:** #{number} - {title}
|
|
596
|
+
**Branch:** {branch-name} (pushed)
|
|
597
|
+
|
|
598
|
+
**Handoff:** To Reviewer for code review
|
|
599
|
+
```
|
|
600
|
+
**Handoff phrase:** "Reviewer, PR #{N} is ready. All tests GREEN."
|
|
601
|
+
|
|
602
|
+
---
|
|
603
|
+
|
|
604
|
+
### Reviewer Assessment Template
|
|
605
|
+
```markdown
|
|
606
|
+
## Reviewer Assessment
|
|
607
|
+
|
|
608
|
+
**PR:** #{number}
|
|
609
|
+
**Verdict:** APPROVED | REJECTED
|
|
610
|
+
|
|
611
|
+
**If APPROVED:**
|
|
612
|
+
**Quality:** Tests comprehensive, code follows patterns
|
|
613
|
+
**Handoff:** To SM for finish-story workflow
|
|
614
|
+
|
|
615
|
+
**If REJECTED:**
|
|
616
|
+
**Issues Found:**
|
|
617
|
+
- {severity}: {issue} → {fix required}
|
|
618
|
+
- {severity}: {issue} → {fix required}
|
|
619
|
+
|
|
620
|
+
**Handoff:** Back to Dev for fixes
|
|
621
|
+
```
|
|
622
|
+
**Handoff phrase (approved):** "SM, Story X-Y is approved and ready to be finished."
|
|
623
|
+
**Handoff phrase (rejected):** "Dev, {N} issues found. See assessment for details."
|
|
624
|
+
|
|
625
|
+
---
|
|
626
|
+
|
|
627
|
+
## Session File Update (MANDATORY Before Handoff)
|
|
628
|
+
|
|
629
|
+
> **🚨 CRITICAL: WRITE BEFORE YOU OFFER**
|
|
630
|
+
>
|
|
631
|
+
> The #1 handoff failure is offering to hand off before writing the assessment to disk.
|
|
632
|
+
> Never say "Ready for Reviewer" or "Ready for Dev" until YOU have written YOUR assessment.
|
|
633
|
+
> The subagent does NOT write the assessment - YOU do.
|
|
634
|
+
|
|
635
|
+
### The Correct Handoff Sequence
|
|
636
|
+
|
|
637
|
+
```
|
|
638
|
+
1. COMPLETE your work (tests written, code implemented, review done)
|
|
639
|
+
2. WRITE your Assessment section to the session file (using Edit tool)
|
|
640
|
+
3. VERIFY the assessment is written (read the file back or check Edit output)
|
|
641
|
+
4. SPAWN the handoff subagent (it verifies and updates status/workflow checkboxes)
|
|
642
|
+
5. WAIT for subagent to complete and report success
|
|
643
|
+
6. ONLY THEN offer the next agent handoff
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
### What YOU Write vs What SUBAGENT Writes
|
|
647
|
+
|
|
648
|
+
| Agent | YOU Write (Assessment) | SUBAGENT Updates |
|
|
649
|
+
|-------|------------------------|------------------|
|
|
650
|
+
| TEA | `## TEA Assessment` with test files, RED status | Workflow checkbox, Phase, Next Agent |
|
|
651
|
+
| Dev | `## Dev Assessment` with files changed, PR link | Workflow checkbox, Phase, Next Agent |
|
|
652
|
+
| Reviewer | `## Reviewer Assessment` with verdict, issues | Workflow checkbox, Phase, Next Agent |
|
|
653
|
+
|
|
654
|
+
### Before Spawning Handoff Subagent
|
|
655
|
+
|
|
656
|
+
**YOU must have already written:**
|
|
657
|
+
```markdown
|
|
658
|
+
## {Agent} Assessment
|
|
659
|
+
|
|
660
|
+
{All required fields from the template below}
|
|
661
|
+
|
|
662
|
+
**Handoff:** To {next agent} for {next task}
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
**Verify your assessment exists:**
|
|
666
|
+
```bash
|
|
667
|
+
grep -A 20 "## Dev Assessment" "$SESSION_FILE" # For Dev
|
|
668
|
+
grep -A 20 "## Reviewer Assessment" "$SESSION_FILE" # For Reviewer
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
If the assessment is NOT in the file, do NOT spawn the subagent yet.
|
|
672
|
+
|
|
673
|
+
### Common Mistake
|
|
674
|
+
|
|
675
|
+
```
|
|
676
|
+
❌ WRONG:
|
|
677
|
+
1. Dev: "All tests GREEN, PR created!"
|
|
678
|
+
2. Dev: [spawns handoff subagent]
|
|
679
|
+
3. Dev: "Ready for Reviewer!"
|
|
680
|
+
4. Reviewer: [activates, finds no Dev Assessment in session file]
|
|
681
|
+
|
|
682
|
+
✅ CORRECT:
|
|
683
|
+
1. Dev: "All tests GREEN, PR created!"
|
|
684
|
+
2. Dev: [uses Edit tool to write Dev Assessment to session file]
|
|
685
|
+
3. Dev: [verifies assessment was written]
|
|
686
|
+
4. Dev: [spawns handoff subagent]
|
|
687
|
+
5. Dev: [waits for subagent to report success]
|
|
688
|
+
6. Dev: "Ready for Reviewer!"
|
|
689
|
+
7. Reviewer: [activates, reads Dev Assessment, knows what to review]
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
The subagent will verify the assessment exists and update workflow checkboxes.
|
|
693
|
+
|
|
694
|
+
## Skills Usage
|
|
695
|
+
|
|
696
|
+
Tactical agents invoke skills naturally based on their task:
|
|
697
|
+
|
|
698
|
+
| Skill | When to Use |
|
|
699
|
+
|-------|-------------|
|
|
700
|
+
| `/testing` | Running tests, writing tests, TDD workflow |
|
|
701
|
+
| `/dev-patterns` | Implementation patterns, common gotchas |
|
|
702
|
+
| `/sprint-context` | Sprint status, backlog, story context |
|
|
703
|
+
|
|
704
|
+
### Scope Values
|
|
705
|
+
|
|
706
|
+
| Session Repos | Scope | Testing Skill Reference |
|
|
707
|
+
|---------------|-------|-------------------------|
|
|
708
|
+
| `api` | `backend` | `references/backend-patterns.md` |
|
|
709
|
+
| `ui` | `frontend` | `references/frontend-patterns.md` |
|
|
710
|
+
| `both` | `both` | Full skill + both pattern refs |
|
|
711
|
+
|
|
712
|
+
## Worktree Awareness
|
|
713
|
+
|
|
714
|
+
When working in a worktree, read context from the session file:
|
|
715
|
+
|
|
716
|
+
```bash
|
|
717
|
+
# Get worktree path from session file
|
|
718
|
+
WORKTREE_PATH=$(grep "^path:" "$SESSION_FILE" | cut -d' ' -f2)
|
|
719
|
+
|
|
720
|
+
# Use worktree path for all commands (single-repo)
|
|
721
|
+
cd $WORKTREE_PATH && just test
|
|
722
|
+
|
|
723
|
+
# Multi-repo: iterate with repo-utils
|
|
724
|
+
source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
|
|
725
|
+
for repo in $(get_repo_names); do
|
|
726
|
+
cd $WORKTREE_PATH/$(get_repo_path "$repo") && $(get_test_command "$repo")
|
|
727
|
+
done
|
|
728
|
+
```
|
|
729
|
+
|
|
730
|
+
**Ports are in the session file:**
|
|
731
|
+
```bash
|
|
732
|
+
API_PORT=$(grep "^api_port:" "$SESSION_FILE" | cut -d' ' -f2)
|
|
733
|
+
UI_PORT=$(grep "^ui_port:" "$SESSION_FILE" | cut -d' ' -f2)
|
|
734
|
+
```
|
|
735
|
+
|
|
736
|
+
**See `core/guides/worktree-mode.md` for complete worktree documentation.**
|
|
737
|
+
|
|
738
|
+
## Sidecar Memory (Tactical Agents)
|
|
739
|
+
|
|
740
|
+
**See `shared-agent-behavior.md` for full sidecar protocol.**
|
|
741
|
+
|
|
742
|
+
For tactical agents, key moments to check/update sidecars:
|
|
743
|
+
|
|
744
|
+
| When | Action |
|
|
745
|
+
|------|--------|
|
|
746
|
+
| **On Activation** | Load sidecar after checking handoff status (Step 7) |
|
|
747
|
+
| **Before Handoff** | Capture any learnings BEFORE spawning handoff subagent |
|
|
748
|
+
| **On Gotcha** | Immediately note it - don't wait for handoff |
|
|
749
|
+
|
|
750
|
+
### Tactical-Specific Patterns
|
|
751
|
+
|
|
752
|
+
- **TEA:** Test patterns, mocking approaches, test data gotchas
|
|
753
|
+
- **Dev:** Implementation patterns, API quirks, performance fixes
|
|
754
|
+
- **Reviewer:** Common issues found, patterns to watch for
|
|
755
|
+
- **SM:** Story breakdown patterns, estimation notes
|
|
756
|
+
|
|
757
|
+
---
|
|
758
|
+
|
|
759
|
+
## Completing Work (Automatic Handoff via Helper)
|
|
760
|
+
|
|
761
|
+
When done with your phase, send your helper to handle the bookkeeping.
|
|
762
|
+
|
|
763
|
+
**Helper prompts are in:** `.pennyfarthing/agents/`
|
|
764
|
+
|
|
765
|
+
| Agent | Helper | Prompt File | Purpose |
|
|
766
|
+
|-------|--------|-------------|---------|
|
|
767
|
+
| SM | Nobby | `sm-*.md` | Status checks, research, file summaries, story setup |
|
|
768
|
+
| TEA | Igor | `tea-handoff.md` | Update session after tests written (RED) |
|
|
769
|
+
| Dev | Hex | `dev-handoff.md` | Update session after PR created (GREEN) |
|
|
770
|
+
| Reviewer | Nanny Ogg | `reviewer-handoff-approve.md` | Mark approved, route to SM |
|
|
771
|
+
| Reviewer | Nanny Ogg | `reviewer-handoff-reject.md` | Route back to Dev with issues |
|
|
772
|
+
|
|
773
|
+
### Helper Model Selection
|
|
774
|
+
|
|
775
|
+
Helpers use Haiku for fast, mechanical bookkeeping:
|
|
776
|
+
|
|
777
|
+
```yaml
|
|
778
|
+
Task tool:
|
|
779
|
+
subagent_type: "general-purpose"
|
|
780
|
+
model: "haiku" # ← Haiku for helpers
|
|
781
|
+
description: "Hex handles handoff" # Use your helper's name
|
|
782
|
+
prompt: [loaded from subagent file with placeholders replaced]
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
**Helpers (Haiku) handle:**
|
|
786
|
+
- Workflow handoffs (updating session files, workflow checkboxes)
|
|
787
|
+
- Work teardown (completion checks, archival)
|
|
788
|
+
- Status checks and validation
|
|
789
|
+
- File updates and bookkeeping
|
|
790
|
+
|
|
791
|
+
**You (Opus) handle:**
|
|
792
|
+
- Complex code analysis or generation
|
|
793
|
+
- Architectural decisions
|
|
794
|
+
- Tasks requiring judgment
|
|
795
|
+
|
|
796
|
+
### Handoff Output
|
|
797
|
+
|
|
798
|
+
```
|
|
799
|
+
✓ Pre-flight: Tests 36/36 GREEN, git clean, PR #59 exists
|
|
800
|
+
✓ Assessment: Dev Assessment written to session file
|
|
801
|
+
✓ Workflow: [x] Dev marked complete
|
|
802
|
+
|
|
803
|
+
Handoff complete: Dev → Reviewer
|
|
804
|
+
Invoke /reviewer to continue.
|
|
805
|
+
```
|
|
806
|
+
|
|
807
|
+
### If Handoff Fails
|
|
808
|
+
|
|
809
|
+
Your helper reports what blocked:
|
|
810
|
+
|
|
811
|
+
```
|
|
812
|
+
✗ Handoff blocked
|
|
813
|
+
|
|
814
|
+
Issue: Tests failing (3 failures)
|
|
815
|
+
Fix: Run tests, fix failures, then retry handoff.
|
|
816
|
+
```
|
|
817
|
+
|
|
818
|
+
Address the issue and send your helper again.
|
|
819
|
+
|
|
820
|
+
## Auto-Invoke Next Agent (Context-Aware)
|
|
821
|
+
|
|
822
|
+
**After handoff helper succeeds**, check context usage to decide whether to auto-invoke or defer:
|
|
823
|
+
|
|
824
|
+
```bash
|
|
825
|
+
eval $(./scripts/run.sh check-context.sh)
|
|
826
|
+
# Returns: HANDOFF_MODE=auto (<60%) or HANDOFF_MODE=ask (>60%)
|
|
827
|
+
```
|
|
828
|
+
|
|
829
|
+
### If HANDOFF_MODE=auto (< 60% context)
|
|
830
|
+
|
|
831
|
+
**Use the Skill tool to invoke the next agent directly.** Do not wait for user input.
|
|
832
|
+
|
|
833
|
+
| Current Agent | Next Agent | Skill Invocation |
|
|
834
|
+
|---------------|------------|------------------|
|
|
835
|
+
| SM | TEA | `Skill(tea)` |
|
|
836
|
+
| SM (trivial) | Dev | `Skill(dev)` |
|
|
837
|
+
| TEA | Dev | `Skill(dev)` |
|
|
838
|
+
| Dev | Reviewer | `Skill(reviewer)` |
|
|
839
|
+
| Reviewer (approved) | SM | `Skill(sm)` |
|
|
840
|
+
| Reviewer (rejected) | Dev | `Skill(dev)` |
|
|
841
|
+
|
|
842
|
+
**Example flow:**
|
|
843
|
+
```
|
|
844
|
+
1. Dev completes implementation, spawns handoff helper
|
|
845
|
+
2. Helper updates session file, reports success
|
|
846
|
+
3. Dev runs: eval $(./scripts/run.sh check-context.sh)
|
|
847
|
+
4. Result: HANDOFF_MODE=auto (context at 45%)
|
|
848
|
+
5. Dev uses Skill tool: skill="reviewer"
|
|
849
|
+
6. Reviewer activates automatically, continues work
|
|
850
|
+
```
|
|
851
|
+
|
|
852
|
+
### If HANDOFF_MODE=ask (> 60% context)
|
|
853
|
+
|
|
854
|
+
**Do not auto-invoke.** Tell the user to start a fresh session:
|
|
855
|
+
|
|
856
|
+
```
|
|
857
|
+
Context is at {N}% - recommend fresh session for next agent.
|
|
858
|
+
Run `/{next-agent}` in a new conversation to continue.
|
|
859
|
+
```
|
|
860
|
+
|
|
861
|
+
### Why This Matters
|
|
862
|
+
|
|
863
|
+
- Auto-invoke keeps momentum when context allows
|
|
864
|
+
- Fresh sessions prevent context overflow and degraded performance
|
|
865
|
+
- The 70% threshold leaves buffer for the next agent's work
|
|
866
|
+
|
|
867
|
+
### Pre-flight Check Commands
|
|
868
|
+
|
|
869
|
+
**Single-repo project:**
|
|
870
|
+
```bash
|
|
871
|
+
cd $CLAUDE_PROJECT_DIR && just test
|
|
872
|
+
cd $CLAUDE_PROJECT_DIR && git status --porcelain
|
|
873
|
+
cd $CLAUDE_PROJECT_DIR && git log @{u}..HEAD --oneline
|
|
874
|
+
cd $CLAUDE_PROJECT_DIR && gh pr view --json url -q .url
|
|
875
|
+
```
|
|
876
|
+
|
|
877
|
+
**Multi-repo project (use repo-utils.sh):**
|
|
878
|
+
```bash
|
|
879
|
+
source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
|
|
880
|
+
for repo in $(get_repo_names); do
|
|
881
|
+
repo_path=$(get_repo_path "$repo")
|
|
882
|
+
cd $CLAUDE_PROJECT_DIR/$repo_path && $(get_test_command "$repo")
|
|
883
|
+
cd $CLAUDE_PROJECT_DIR/$repo_path && git status --porcelain
|
|
884
|
+
done
|
|
885
|
+
```
|
|
886
|
+
|
|
887
|
+
## Subagent Error Handling (Shared Protocol)
|
|
888
|
+
|
|
889
|
+
When spawning subagents, the **caller handles all error recovery**. Subagents just report success or structured failure.
|
|
890
|
+
|
|
891
|
+
### Subagent Return Format
|
|
892
|
+
|
|
893
|
+
Subagents return structured results:
|
|
894
|
+
|
|
895
|
+
```yaml
|
|
896
|
+
# Success
|
|
897
|
+
status: success
|
|
898
|
+
result: "Session updated, handoff complete"
|
|
899
|
+
|
|
900
|
+
# Failure
|
|
901
|
+
status: blocked
|
|
902
|
+
blocked_step: "verify_tests_green"
|
|
903
|
+
error: "3 tests failing in conductor-api"
|
|
904
|
+
diagnosis: "Implementation incomplete"
|
|
905
|
+
```
|
|
906
|
+
|
|
907
|
+
### Caller Retry Protocol
|
|
908
|
+
|
|
909
|
+
When a subagent returns `status: blocked`:
|
|
910
|
+
|
|
911
|
+
```
|
|
912
|
+
1. LOG the failure
|
|
913
|
+
- Which subagent
|
|
914
|
+
- Which step failed
|
|
915
|
+
- Error message
|
|
916
|
+
|
|
917
|
+
2. DIAGNOSE
|
|
918
|
+
- Is this fixable by the caller?
|
|
919
|
+
- Is it a transient issue (retry might work)?
|
|
920
|
+
- Does it need user intervention?
|
|
921
|
+
|
|
922
|
+
3. IF FIXABLE by caller:
|
|
923
|
+
- Fix the issue (e.g., commit forgotten files)
|
|
924
|
+
- Retry subagent (max 2 retries)
|
|
925
|
+
|
|
926
|
+
4. IF NOT FIXABLE:
|
|
927
|
+
- Escalate to user with structured format
|
|
928
|
+
```
|
|
929
|
+
|
|
930
|
+
### Common Failures and Fixes
|
|
931
|
+
|
|
932
|
+
| Subagent | Failure | Caller Action |
|
|
933
|
+
|----------|---------|---------------|
|
|
934
|
+
| `testing-runner` | Tests RED | Don't retry - report to user, this is expected state info |
|
|
935
|
+
| `testing-runner` | Container not running | Run `ensure_test_containers`, retry |
|
|
936
|
+
| `*-handoff` | Assessment missing | Write assessment first, retry |
|
|
937
|
+
| `*-handoff` | Uncommitted changes | Commit changes, retry |
|
|
938
|
+
| `*-handoff` | Not pushed | Push to remote, retry |
|
|
939
|
+
| `workflow-status-check` | Session file unreadable | Report to user for manual inspection |
|
|
940
|
+
| `sm-*` | Jira CLI failed | Check `gh auth status`, report to user |
|
|
941
|
+
|
|
942
|
+
### Escalation Format
|
|
943
|
+
|
|
944
|
+
When a subagent failure can't be recovered:
|
|
945
|
+
|
|
946
|
+
```markdown
|
|
947
|
+
## Subagent Blocked
|
|
948
|
+
|
|
949
|
+
**Subagent:** {name}
|
|
950
|
+
**Step Failed:** {step}
|
|
951
|
+
**Error:** {message}
|
|
952
|
+
**Diagnosis:** {what went wrong}
|
|
953
|
+
|
|
954
|
+
**Retries:** {N}/2 attempted
|
|
955
|
+
**Fixable by Caller:** No
|
|
956
|
+
|
|
957
|
+
**User Action Required:**
|
|
958
|
+
{specific action the user needs to take}
|
|
959
|
+
```
|
|
960
|
+
|
|
961
|
+
### Example: Caller Handling Handoff Failure
|
|
962
|
+
|
|
963
|
+
```
|
|
964
|
+
1. Dev spawns `dev-handoff` subagent
|
|
965
|
+
2. Subagent returns:
|
|
966
|
+
status: blocked
|
|
967
|
+
blocked_step: "verify_pushed"
|
|
968
|
+
error: "Branch not pushed to remote"
|
|
969
|
+
|
|
970
|
+
3. Dev (caller) handles:
|
|
971
|
+
- Diagnose: Forgot to push
|
|
972
|
+
- Fix: git push -u origin {branch}
|
|
973
|
+
- Retry: Spawn dev-handoff again
|
|
974
|
+
|
|
975
|
+
4. If still failing after 2 retries:
|
|
976
|
+
- Escalate to user with structured format
|
|
977
|
+
```
|
|
978
|
+
|
|
979
|
+
### Why Callers Handle Errors
|
|
980
|
+
|
|
981
|
+
- **Subagents stay simple** - just do the task, report result
|
|
982
|
+
- **Callers have context** - know what they were trying to do
|
|
983
|
+
- **Retry logic is consistent** - same pattern across all agents
|
|
984
|
+
- **Easier to debug** - failure handling in one place
|
|
985
|
+
|
|
986
|
+
---
|
|
987
|
+
|
|
988
|
+
## Agent Flow Reference
|
|
989
|
+
|
|
990
|
+
```
|
|
991
|
+
/new-work → SM → TEA → Dev → Reviewer → SM (finish)
|
|
992
|
+
↓ ↓ ↓ ↓
|
|
993
|
+
setup tests impl review
|
|
994
|
+
│ │ │ │
|
|
995
|
+
└──────┴─────┴─────────┘
|
|
996
|
+
helper handoffs
|
|
997
|
+
```
|
|
998
|
+
|
|
999
|
+
**Entry point:** `/new-work` only
|
|
1000
|
+
**State detection:** Agents read session file on activation
|
|
1001
|
+
**Handoffs:** Agents send helpers to update session file
|
|
1002
|
+
**Finish:** SM handles when status = `approved`
|
|
1003
|
+
|
|
1004
|
+
---
|
|
1005
|
+
|
|
1006
|
+
## Dogfooding: Known Issues When Working on Pennyfarthing
|
|
1007
|
+
|
|
1008
|
+
When working on the Pennyfarthing framework itself, be aware of these quirks:
|
|
1009
|
+
|
|
1010
|
+
### Symlink Permission Issue (Epic 26)
|
|
1011
|
+
|
|
1012
|
+
**Problem:** Claude Code's permission system doesn't follow symlinks. The `.claude/` directory contains symlinks to `pennyfarthing-dist/`:
|
|
1013
|
+
|
|
1014
|
+
```
|
|
1015
|
+
.claude/commands → pennyfarthing-dist/commands
|
|
1016
|
+
.claude/agents → pennyfarthing-dist/agents
|
|
1017
|
+
.claude/skills → pennyfarthing-dist/skills
|
|
1018
|
+
```
|
|
1019
|
+
|
|
1020
|
+
When Claude Code prompts for permission to write to `.claude/commands/foo.md`, the permission grant **fails silently** because the actual file is at `pennyfarthing-dist/commands/foo.md`.
|
|
1021
|
+
|
|
1022
|
+
**Workaround:** Write directly to `pennyfarthing-dist/` instead of `.claude/`:
|
|
1023
|
+
|
|
1024
|
+
```bash
|
|
1025
|
+
# WRONG - permission will fail
|
|
1026
|
+
Write to: .claude/commands/close-epic.md
|
|
1027
|
+
|
|
1028
|
+
# CORRECT - works because it's the real path
|
|
1029
|
+
Write to: pennyfarthing-dist/commands/close-epic.md
|
|
1030
|
+
```
|
|
1031
|
+
|
|
1032
|
+
**Status:** Tracked in Epic 26-1. Future fix may replace symlinks with copies during `pennyfarthing init`.
|
|
1033
|
+
|
|
1034
|
+
### Self-Referential Context
|
|
1035
|
+
|
|
1036
|
+
When agents work on Pennyfarthing itself:
|
|
1037
|
+
- Agent definitions you're reading are the same ones you're modifying
|
|
1038
|
+
- Changes to `tactical-agent-behavior.md` affect how you behave
|
|
1039
|
+
- Test carefully - breaking changes can break the workflow mid-session
|
|
1040
|
+
|
|
1041
|
+
**Best practice:** Complete and commit agent/guide changes before testing them in a new session.
|