@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,66 @@
|
|
|
1
|
+
#!/usr/bin/env zsh
|
|
2
|
+
# Context warning hook: Warn agent when context usage is high
|
|
3
|
+
# Called by Claude Code before tool calls (PreToolUse)
|
|
4
|
+
#
|
|
5
|
+
# Input: JSON via stdin with tool_name, tool_input
|
|
6
|
+
# Output: Warning message to stdout if context > 60%
|
|
7
|
+
# Always exits 0 (warning only, never blocks)
|
|
8
|
+
|
|
9
|
+
# Read and discard stdin (required by hook protocol)
|
|
10
|
+
cat > /dev/null
|
|
11
|
+
|
|
12
|
+
# Find project root
|
|
13
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
14
|
+
source "$SCRIPT_DIR/../utils/find-root.sh"
|
|
15
|
+
|
|
16
|
+
# Get context percentage from check-context.sh
|
|
17
|
+
CONTEXT_SCRIPT="$SCRIPT_DIR/../check-context.sh"
|
|
18
|
+
if [[ ! -x "$CONTEXT_SCRIPT" ]]; then
|
|
19
|
+
exit 0 # Can't check, allow silently
|
|
20
|
+
fi
|
|
21
|
+
|
|
22
|
+
# Run check-context.sh and parse output
|
|
23
|
+
eval "$("$CONTEXT_SCRIPT" 2>/dev/null)" 2>/dev/null
|
|
24
|
+
|
|
25
|
+
# Check if we got a valid percentage
|
|
26
|
+
if [[ -z "$CONTEXT_PERCENT" ]] || [[ "$CONTEXT_PERCENT" == "null" ]]; then
|
|
27
|
+
exit 0 # Can't determine, allow silently
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# Load thresholds from settings (defaults match check-context.sh)
|
|
31
|
+
WARNING_THRESHOLD="${WARNING_THRESHOLD:-60}"
|
|
32
|
+
CRITICAL_THRESHOLD="${CRITICAL_THRESHOLD:-85}"
|
|
33
|
+
|
|
34
|
+
# Output warning if above threshold
|
|
35
|
+
if [[ "$CONTEXT_PERCENT" -ge "$CRITICAL_THRESHOLD" ]] 2>/dev/null; then
|
|
36
|
+
cat << EOF
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
CONTEXT WARNING: ${CONTEXT_PERCENT}% (CRITICAL)
|
|
40
|
+
|
|
41
|
+
Context usage is critically high. Recommended actions:
|
|
42
|
+
1. Complete current task immediately
|
|
43
|
+
2. Commit any pending changes
|
|
44
|
+
3. Hand off to next agent or ask user to start fresh session
|
|
45
|
+
|
|
46
|
+
Do NOT start new subtasks. Wrap up and hand off.
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
EOF
|
|
50
|
+
elif [[ "$CONTEXT_PERCENT" -ge "$WARNING_THRESHOLD" ]] 2>/dev/null; then
|
|
51
|
+
cat << EOF
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
CONTEXT WARNING: ${CONTEXT_PERCENT}%
|
|
55
|
+
|
|
56
|
+
Context usage is high. Consider:
|
|
57
|
+
- Wrapping up current task soon
|
|
58
|
+
- Preparing for handoff to next agent
|
|
59
|
+
- Avoiding large file reads or complex operations
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
EOF
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
# Always allow the tool (we're warning, not blocking)
|
|
66
|
+
exit 0
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# otel-auto-config.sh - Auto-configure OTEL for Cyclist web mode (Story 20-1)
|
|
3
|
+
#
|
|
4
|
+
# This hook checks for a .cyclist-port file in the project directory.
|
|
5
|
+
# If found, it sets the OTEL environment variables to connect Claude Code
|
|
6
|
+
# telemetry to the running Cyclist server.
|
|
7
|
+
#
|
|
8
|
+
# Usage: Source this script early in Claude Code startup to enable auto-config.
|
|
9
|
+
# source /path/to/otel-auto-config.sh
|
|
10
|
+
#
|
|
11
|
+
# Prerequisites:
|
|
12
|
+
# - Cyclist must be running in web mode (writes .cyclist-port file)
|
|
13
|
+
# - CLAUDE_PROJECT_DIR must be set (standard in Claude Code environment)
|
|
14
|
+
|
|
15
|
+
# Determine project directory
|
|
16
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
|
17
|
+
PORT_FILE="$PROJECT_DIR/.cyclist-port"
|
|
18
|
+
|
|
19
|
+
# Check if port file exists
|
|
20
|
+
if [[ -f "$PORT_FILE" ]]; then
|
|
21
|
+
# Read the port number
|
|
22
|
+
PORT=$(cat "$PORT_FILE" 2>/dev/null)
|
|
23
|
+
|
|
24
|
+
# Validate port is a number
|
|
25
|
+
if [[ "$PORT" =~ ^[0-9]+$ ]]; then
|
|
26
|
+
# Set OTEL environment variables
|
|
27
|
+
export OTEL_EXPORTER_OTLP_PROTOCOL="http/json"
|
|
28
|
+
export OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:$PORT"
|
|
29
|
+
|
|
30
|
+
# Optional: Log for debugging (can be silenced by setting CYCLIST_QUIET=1)
|
|
31
|
+
if [[ -z "$CYCLIST_QUIET" ]]; then
|
|
32
|
+
echo "[otel-auto-config] Configured OTEL to http://localhost:$PORT" >&2
|
|
33
|
+
fi
|
|
34
|
+
fi
|
|
35
|
+
fi
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# post-merge.sh - Git hook for automatic sprint YAML updates after PR merge
|
|
3
|
+
# Story 8-1: Git Hook for PR Merge Detection
|
|
4
|
+
#
|
|
5
|
+
# This hook runs after git pull or git merge operations, detecting when a
|
|
6
|
+
# story branch is merged and automatically updating the sprint YAML status.
|
|
7
|
+
#
|
|
8
|
+
# Installation:
|
|
9
|
+
# Installed to .git/hooks/post-merge by pennyfarthing init or doctor --fix
|
|
10
|
+
#
|
|
11
|
+
# Dependencies:
|
|
12
|
+
# - yq (for YAML manipulation)
|
|
13
|
+
# - sprint-common.sh (for shared sprint functions)
|
|
14
|
+
|
|
15
|
+
set -uo pipefail
|
|
16
|
+
|
|
17
|
+
# Find project root by looking for .claude/ marker
|
|
18
|
+
find_project_root() {
|
|
19
|
+
local dir="$PWD"
|
|
20
|
+
while [[ ! -d "$dir/.claude" ]] && [[ "$dir" != "/" ]]; do
|
|
21
|
+
dir="$(dirname "$dir")"
|
|
22
|
+
done
|
|
23
|
+
if [[ -d "$dir/.claude" ]]; then
|
|
24
|
+
echo "$dir"
|
|
25
|
+
else
|
|
26
|
+
return 1
|
|
27
|
+
fi
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# Initialize paths
|
|
31
|
+
PROJECT_ROOT="$(find_project_root 2>/dev/null || echo "")"
|
|
32
|
+
if [[ -z "$PROJECT_ROOT" ]]; then
|
|
33
|
+
# Not in a pennyfarthing project, silently exit
|
|
34
|
+
exit 0
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
|
|
38
|
+
SESSION_DIR="$PROJECT_ROOT/.session"
|
|
39
|
+
SPRINT_FILE="$PROJECT_ROOT/sprint/current-sprint.yaml"
|
|
40
|
+
|
|
41
|
+
# Source sprint-common.sh for shared functions
|
|
42
|
+
SPRINT_COMMON="$PROJECT_ROOT/.pennyfarthing/scripts/utils/sprint-common.sh"
|
|
43
|
+
if [[ -f "$SPRINT_COMMON" ]]; then
|
|
44
|
+
# shellcheck source=/dev/null
|
|
45
|
+
source "$SPRINT_COMMON"
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
# extract_story_id BRANCH_NAME
|
|
49
|
+
# Extract story ID from branch name pattern feat/X-Y-*
|
|
50
|
+
# Returns: X-Y (e.g., "8-1" from "feat/8-1-merge-detection")
|
|
51
|
+
# Returns empty for non-matching branches
|
|
52
|
+
extract_story_id() {
|
|
53
|
+
local branch="$1"
|
|
54
|
+
|
|
55
|
+
# Match pattern: feat/EPIC-STORY-description or feat/EPIC-STORY
|
|
56
|
+
if [[ "$branch" =~ ^feat/([0-9]+-[0-9]+) ]]; then
|
|
57
|
+
echo "${BASH_REMATCH[1]}"
|
|
58
|
+
fi
|
|
59
|
+
# Returns empty string for non-matching patterns
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
# update_story_status STORY_ID NEW_STATUS
|
|
63
|
+
# Update story status in sprint YAML and add completed date
|
|
64
|
+
# Uses yq for YAML manipulation
|
|
65
|
+
update_story_status() {
|
|
66
|
+
local story_id="$1"
|
|
67
|
+
local new_status="${2:-done}"
|
|
68
|
+
local completed_date
|
|
69
|
+
completed_date=$(date +%Y-%m-%d)
|
|
70
|
+
|
|
71
|
+
if [[ ! -f "$SPRINT_FILE" ]]; then
|
|
72
|
+
return 1
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
# Check if yq is available
|
|
76
|
+
if ! command -v yq &>/dev/null; then
|
|
77
|
+
echo "Warning: yq not found, cannot update sprint YAML" >&2
|
|
78
|
+
return 1
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
# Extract epic and story numbers
|
|
82
|
+
local epic_num="${story_id%%-*}"
|
|
83
|
+
local story_num="${story_id#*-}"
|
|
84
|
+
|
|
85
|
+
# Update status and add completed date using yq
|
|
86
|
+
yq eval -i "
|
|
87
|
+
(.epics[] | select(.id == \"$epic_num\") | .stories[] | select(.id == \"$story_num\")).status = \"$new_status\" |
|
|
88
|
+
(.epics[] | select(.id == \"$epic_num\") | .stories[] | select(.id == \"$story_num\")).completed = \"$completed_date\"
|
|
89
|
+
" "$SPRINT_FILE"
|
|
90
|
+
|
|
91
|
+
return $?
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
# log_reconciliation STORY_ID MESSAGE
|
|
95
|
+
# Log reconciliation event to .session/ directory
|
|
96
|
+
log_reconciliation() {
|
|
97
|
+
local story_id="$1"
|
|
98
|
+
local message="${2:-Merge detected}"
|
|
99
|
+
local timestamp
|
|
100
|
+
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
|
|
101
|
+
|
|
102
|
+
# Ensure session directory exists
|
|
103
|
+
mkdir -p "$SESSION_DIR"
|
|
104
|
+
|
|
105
|
+
local log_file="$SESSION_DIR/reconciliation.log"
|
|
106
|
+
|
|
107
|
+
echo "[$timestamp] Story $story_id: $message" >> "$log_file"
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
# Main hook logic
|
|
111
|
+
main() {
|
|
112
|
+
# Get the current branch after merge
|
|
113
|
+
local current_branch
|
|
114
|
+
current_branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
|
|
115
|
+
|
|
116
|
+
# Only process if we're on develop or main (after a PR merge)
|
|
117
|
+
if [[ "$current_branch" != "develop" && "$current_branch" != "main" ]]; then
|
|
118
|
+
exit 0
|
|
119
|
+
fi
|
|
120
|
+
|
|
121
|
+
# Get the branches that were just merged
|
|
122
|
+
# The reflog shows what was merged: the previous HEAD and the merged commit
|
|
123
|
+
local merged_refs
|
|
124
|
+
merged_refs=$(git reflog -1 --format='%gs' 2>/dev/null)
|
|
125
|
+
|
|
126
|
+
# Check if this was a merge operation
|
|
127
|
+
if [[ ! "$merged_refs" =~ merge ]]; then
|
|
128
|
+
# Could be a pull with fast-forward - check for merged branches
|
|
129
|
+
# Look at recently merged branches by checking merge commits
|
|
130
|
+
:
|
|
131
|
+
fi
|
|
132
|
+
|
|
133
|
+
# Find recently merged feature branches by examining merge commits
|
|
134
|
+
local merge_commits
|
|
135
|
+
merge_commits=$(git log --merges --oneline -10 --since="5 minutes ago" 2>/dev/null)
|
|
136
|
+
|
|
137
|
+
# Extract branch names from merge commits
|
|
138
|
+
while IFS= read -r commit_line; do
|
|
139
|
+
# Parse "Merge pull request #X from user/feat/X-Y-description"
|
|
140
|
+
# or "Merge branch 'feat/X-Y-description'"
|
|
141
|
+
local branch_name=""
|
|
142
|
+
|
|
143
|
+
if [[ "$commit_line" =~ feat/([0-9]+-[0-9]+[a-zA-Z0-9-]*) ]]; then
|
|
144
|
+
branch_name="feat/${BASH_REMATCH[1]}"
|
|
145
|
+
fi
|
|
146
|
+
|
|
147
|
+
if [[ -n "$branch_name" ]]; then
|
|
148
|
+
local story_id
|
|
149
|
+
story_id=$(extract_story_id "$branch_name")
|
|
150
|
+
|
|
151
|
+
if [[ -n "$story_id" ]]; then
|
|
152
|
+
# Update sprint YAML
|
|
153
|
+
if update_story_status "$story_id" "done"; then
|
|
154
|
+
log_reconciliation "$story_id" "Status updated to 'done' after merge (branch: $branch_name)"
|
|
155
|
+
else
|
|
156
|
+
log_reconciliation "$story_id" "Failed to update status (branch: $branch_name)"
|
|
157
|
+
fi
|
|
158
|
+
fi
|
|
159
|
+
fi
|
|
160
|
+
done <<< "$merge_commits"
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
# Only run main when executed directly (not when sourced for testing)
|
|
164
|
+
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
165
|
+
main "$@"
|
|
166
|
+
fi
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# pre-commit.sh - Git hook to enforce branch protection
|
|
3
|
+
#
|
|
4
|
+
# Prevents direct commits to protected branches (main, develop).
|
|
5
|
+
# Exception: sprint/ folder commits allowed on develop for administrative tracking.
|
|
6
|
+
#
|
|
7
|
+
# Installation:
|
|
8
|
+
# Installed to .git/hooks/pre-commit by pennyfarthing init or doctor --fix
|
|
9
|
+
# Or symlink: ln -sf ../../pennyfarthing-dist/scripts/hooks/pre-commit.sh .git/hooks/pre-commit
|
|
10
|
+
|
|
11
|
+
set -uo pipefail
|
|
12
|
+
|
|
13
|
+
BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
|
|
14
|
+
PROTECTED_BRANCHES="^(main|develop)$"
|
|
15
|
+
|
|
16
|
+
if [[ $BRANCH =~ $PROTECTED_BRANCHES ]]; then
|
|
17
|
+
# Special case: Allow sprint/ folder commits on develop branch
|
|
18
|
+
if [[ $BRANCH == "develop" ]]; then
|
|
19
|
+
STAGED_FILES=$(git diff --cached --name-only)
|
|
20
|
+
NON_SPRINT_FILES=$(echo "$STAGED_FILES" | grep -v "^sprint/")
|
|
21
|
+
|
|
22
|
+
# If all staged files are in sprint/, allow the commit
|
|
23
|
+
if [ -z "$NON_SPRINT_FILES" ] && [ -n "$STAGED_FILES" ]; then
|
|
24
|
+
exit 0
|
|
25
|
+
fi
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
echo ""
|
|
29
|
+
echo "COMMIT BLOCKED"
|
|
30
|
+
echo ""
|
|
31
|
+
echo "You are trying to commit directly to: $BRANCH"
|
|
32
|
+
echo "This violates the git workflow rules."
|
|
33
|
+
echo ""
|
|
34
|
+
echo "Protected branches: main, develop"
|
|
35
|
+
echo ""
|
|
36
|
+
echo "What to do:"
|
|
37
|
+
echo "1. Create a feature branch:"
|
|
38
|
+
echo " git checkout -b <type>/<epic-story>-<description>"
|
|
39
|
+
echo ""
|
|
40
|
+
echo "2. Example:"
|
|
41
|
+
echo " git checkout -b feat/8-2-add-authentication"
|
|
42
|
+
echo ""
|
|
43
|
+
echo "3. Then commit your changes on the feature branch"
|
|
44
|
+
echo ""
|
|
45
|
+
echo "Exception: Sprint tracking files (sprint/*) can be committed to develop"
|
|
46
|
+
echo ""
|
|
47
|
+
exit 1
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
exit 0
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env zsh
|
|
2
|
+
# Pre-edit hook: Verify edits don't touch protected files
|
|
3
|
+
# Called by Claude Code before Edit/Write tool calls
|
|
4
|
+
#
|
|
5
|
+
# Input: JSON via stdin with tool_name, tool_input
|
|
6
|
+
# Output: Exit 0 to allow, Exit 2 to block (stderr shown to Claude)
|
|
7
|
+
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
|
|
10
|
+
# Read input from stdin
|
|
11
|
+
input=$(cat)
|
|
12
|
+
|
|
13
|
+
# Extract file path from tool input
|
|
14
|
+
file_path=$(echo "$input" | jq -r '.tool_input.file_path // .tool_input.path // ""')
|
|
15
|
+
|
|
16
|
+
# Protected patterns (files that should never be edited automatically)
|
|
17
|
+
protected_patterns=(
|
|
18
|
+
"*.env"
|
|
19
|
+
"*.pem"
|
|
20
|
+
"*.key"
|
|
21
|
+
"*credentials*"
|
|
22
|
+
"*secrets*"
|
|
23
|
+
".git/*"
|
|
24
|
+
"node_modules/*"
|
|
25
|
+
"vendor/*"
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
# Pennyfarthing managed files protection
|
|
29
|
+
# These are managed by `pennyfarthing update`, don't edit directly
|
|
30
|
+
# EXCEPTION: If we ARE in the pennyfarthing library itself, allow edits
|
|
31
|
+
is_pennyfarthing_lib=false
|
|
32
|
+
if [[ -d "${CLAUDE_PROJECT_DIR:-$PWD}/pennyfarthing-dist" ]]; then
|
|
33
|
+
is_pennyfarthing_lib=true
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
if [[ "$file_path" == *".claude/pennyfarthing/"* ]] && [[ "$is_pennyfarthing_lib" == "false" ]]; then
|
|
37
|
+
echo "BLOCKED: Cannot edit managed pennyfarthing files." >&2
|
|
38
|
+
echo "File: $file_path" >&2
|
|
39
|
+
echo "" >&2
|
|
40
|
+
echo "These files are managed by pennyfarthing and will be overwritten on update." >&2
|
|
41
|
+
echo "Instead:" >&2
|
|
42
|
+
echo " - Put project-specific customizations in .claude/project/" >&2
|
|
43
|
+
echo " - For framework changes, edit the pennyfarthing repo and run 'pennyfarthing update'" >&2
|
|
44
|
+
exit 2
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
# Check if file matches any protected pattern
|
|
48
|
+
for pattern in "${protected_patterns[@]}"; do
|
|
49
|
+
if [[ "$file_path" == $pattern ]]; then
|
|
50
|
+
echo "BLOCKED: Cannot edit protected file matching pattern: $pattern" >&2
|
|
51
|
+
echo "File: $file_path" >&2
|
|
52
|
+
exit 2
|
|
53
|
+
fi
|
|
54
|
+
done
|
|
55
|
+
|
|
56
|
+
# Additional check: warn on certain file types but allow
|
|
57
|
+
warn_patterns=(
|
|
58
|
+
"*.md"
|
|
59
|
+
"*.json"
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
# For warnings, just log to stderr but allow (exit 0)
|
|
63
|
+
for pattern in "${warn_patterns[@]}"; do
|
|
64
|
+
if [[ "$file_path" == $pattern ]]; then
|
|
65
|
+
# Could log warnings here if needed
|
|
66
|
+
:
|
|
67
|
+
fi
|
|
68
|
+
done
|
|
69
|
+
|
|
70
|
+
# Allow the edit
|
|
71
|
+
exit 0
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# pre-push.sh - Git hook to remind about Jira sync before push
|
|
3
|
+
#
|
|
4
|
+
# Checks if sprint files were modified and reminds to sync to Jira.
|
|
5
|
+
#
|
|
6
|
+
# Installation:
|
|
7
|
+
# Installed to .git/hooks/pre-push by pennyfarthing init or doctor --fix
|
|
8
|
+
# Or symlink: ln -sf ../../pennyfarthing-dist/scripts/hooks/pre-push.sh .git/hooks/pre-push
|
|
9
|
+
|
|
10
|
+
set -uo pipefail
|
|
11
|
+
|
|
12
|
+
# Find project root
|
|
13
|
+
find_project_root() {
|
|
14
|
+
local dir="$PWD"
|
|
15
|
+
while [[ ! -d "$dir/.claude" ]] && [[ "$dir" != "/" ]]; do
|
|
16
|
+
dir="$(dirname "$dir")"
|
|
17
|
+
done
|
|
18
|
+
if [[ -d "$dir/.claude" ]]; then
|
|
19
|
+
echo "$dir"
|
|
20
|
+
else
|
|
21
|
+
return 1
|
|
22
|
+
fi
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
PROJECT_ROOT="$(find_project_root 2>/dev/null || echo "")"
|
|
26
|
+
if [[ -z "$PROJECT_ROOT" ]]; then
|
|
27
|
+
exit 0
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
SPRINT_FILE="$PROJECT_ROOT/sprint/current-sprint.yaml"
|
|
31
|
+
|
|
32
|
+
# Check if there are uncommitted changes to sprint file
|
|
33
|
+
if git diff --name-only | grep -q "sprint/current-sprint.yaml"; then
|
|
34
|
+
echo "Warning: current-sprint.yaml has uncommitted changes"
|
|
35
|
+
echo " Consider committing before pushing"
|
|
36
|
+
echo ""
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
# Get the range of commits being pushed
|
|
40
|
+
REMOTE="$1"
|
|
41
|
+
URL="$2"
|
|
42
|
+
|
|
43
|
+
while read local_ref local_sha remote_ref remote_sha; do
|
|
44
|
+
if [ "$local_sha" != "0000000000000000000000000000000000000000" ]; then
|
|
45
|
+
# Check if sprint file changed in this push
|
|
46
|
+
if git diff --name-only "$remote_sha..$local_sha" 2>/dev/null | grep -q "sprint/current-sprint.yaml"; then
|
|
47
|
+
echo "Sprint changes detected in push"
|
|
48
|
+
echo " Reminder: Sync to Jira if story statuses changed"
|
|
49
|
+
echo ""
|
|
50
|
+
fi
|
|
51
|
+
fi
|
|
52
|
+
done
|
|
53
|
+
|
|
54
|
+
exit 0
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#!/usr/bin/env zsh
|
|
2
|
+
# Session start hook: Initialize environment for Claude Code session
|
|
3
|
+
# Called by Claude Code when a new session starts
|
|
4
|
+
#
|
|
5
|
+
# Uses CLAUDE_ENV_FILE to persist environment variables for the session.
|
|
6
|
+
# Projects using pennyfarthing can add their own hooks for project-specific vars.
|
|
7
|
+
#
|
|
8
|
+
# Also validates previous session checkpoint to detect cross-session state changes.
|
|
9
|
+
|
|
10
|
+
set -euo pipefail
|
|
11
|
+
|
|
12
|
+
# Find project root
|
|
13
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
14
|
+
source "$SCRIPT_DIR/../utils/find-root.sh"
|
|
15
|
+
source "$SCRIPT_DIR/../utils/checkpoint.sh"
|
|
16
|
+
|
|
17
|
+
# Read input from stdin (contains session_id, source, cwd, etc.)
|
|
18
|
+
input=$(cat)
|
|
19
|
+
session_id=$(echo "$input" | jq -r '.session_id // "unknown"')
|
|
20
|
+
source_type=$(echo "$input" | jq -r '.source // "unknown"')
|
|
21
|
+
|
|
22
|
+
# Ensure .session directory exists
|
|
23
|
+
mkdir -p "$CLAUDE_PROJECT_DIR/.session"
|
|
24
|
+
mkdir -p "$CLAUDE_PROJECT_DIR/.session/agents"
|
|
25
|
+
|
|
26
|
+
# Note: Agent cleanup is handled by agent-session.sh (7-day TTL) to preserve multi-session state
|
|
27
|
+
# DO NOT clear .session/agents/* here - it breaks parallel sessions
|
|
28
|
+
|
|
29
|
+
# Create session log entry
|
|
30
|
+
echo "$(date -Iseconds) | Session $source_type: $session_id" >> "$CLAUDE_PROJECT_DIR/.session/session-log.txt"
|
|
31
|
+
|
|
32
|
+
# Validate previous session checkpoint (cross-session continuity)
|
|
33
|
+
validate_checkpoint() {
|
|
34
|
+
local prev_state
|
|
35
|
+
prev_state=$(checkpoint_restore "session_state")
|
|
36
|
+
|
|
37
|
+
if [[ -z "$prev_state" ]]; then
|
|
38
|
+
# No previous checkpoint - fresh start
|
|
39
|
+
return 0
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
# Parse checkpoint data (format: key=value;key=value;...)
|
|
43
|
+
local prev_sha prev_agent prev_story prev_phase prev_session
|
|
44
|
+
prev_sha=$(echo "$prev_state" | tr ';' '\n' | grep '^sha=' | cut -d= -f2)
|
|
45
|
+
prev_agent=$(echo "$prev_state" | tr ';' '\n' | grep '^agent=' | cut -d= -f2)
|
|
46
|
+
prev_story=$(echo "$prev_state" | tr ';' '\n' | grep '^story=' | cut -d= -f2)
|
|
47
|
+
prev_phase=$(echo "$prev_state" | tr ';' '\n' | grep '^phase=' | cut -d= -f2)
|
|
48
|
+
prev_session=$(echo "$prev_state" | tr ';' '\n' | grep '^session=' | cut -d= -f2)
|
|
49
|
+
|
|
50
|
+
# Get current git SHA
|
|
51
|
+
local current_sha=""
|
|
52
|
+
if command -v git &>/dev/null && git rev-parse --git-dir &>/dev/null; then
|
|
53
|
+
current_sha=$(git rev-parse --short HEAD 2>/dev/null || echo "")
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
# Compare git state
|
|
57
|
+
if [[ -n "$prev_sha" && -n "$current_sha" && "$prev_sha" != "$current_sha" ]]; then
|
|
58
|
+
# Git state changed between sessions - write warning to session log
|
|
59
|
+
local warning="CROSS_SESSION_DRIFT: Git changed since last session (was: $prev_sha, now: $current_sha)"
|
|
60
|
+
if [[ -n "$prev_story" ]]; then
|
|
61
|
+
warning="$warning | Story: $prev_story"
|
|
62
|
+
fi
|
|
63
|
+
if [[ -n "$prev_agent" ]]; then
|
|
64
|
+
warning="$warning | Agent: $prev_agent"
|
|
65
|
+
fi
|
|
66
|
+
echo "$(date -Iseconds) | $warning" >> "$CLAUDE_PROJECT_DIR/.session/session-log.txt"
|
|
67
|
+
|
|
68
|
+
# Also write to a dedicated drift log for easy scanning
|
|
69
|
+
echo "$(date -Iseconds) | prev_sha=$prev_sha | current_sha=$current_sha | story=$prev_story | agent=$prev_agent | phase=$prev_phase" >> "$CLAUDE_PROJECT_DIR/.session/drift-log.txt"
|
|
70
|
+
fi
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# Run checkpoint validation (don't fail if it errors)
|
|
74
|
+
validate_checkpoint 2>/dev/null || true
|
|
75
|
+
|
|
76
|
+
# Write environment variables to CLAUDE_ENV_FILE (persists for session)
|
|
77
|
+
if [ -n "${CLAUDE_ENV_FILE:-}" ]; then
|
|
78
|
+
cat >> "$CLAUDE_ENV_FILE" << EOF
|
|
79
|
+
# Pennyfarthing core environment
|
|
80
|
+
export PROJECT_ROOT="$CLAUDE_PROJECT_DIR"
|
|
81
|
+
export SESSION_ID="$session_id"
|
|
82
|
+
EOF
|
|
83
|
+
|
|
84
|
+
# Auto-configure OTEL if Cyclist is running (Story 20-1)
|
|
85
|
+
PORT_FILE="$CLAUDE_PROJECT_DIR/.cyclist-port"
|
|
86
|
+
if [[ -f "$PORT_FILE" ]]; then
|
|
87
|
+
CYCLIST_PORT=$(cat "$PORT_FILE" 2>/dev/null)
|
|
88
|
+
if [[ "$CYCLIST_PORT" =~ ^[0-9]+$ ]]; then
|
|
89
|
+
cat >> "$CLAUDE_ENV_FILE" << EOF
|
|
90
|
+
# OTEL auto-configuration for Cyclist (Story 20-1)
|
|
91
|
+
export OTEL_EXPORTER_OTLP_PROTOCOL="http/json"
|
|
92
|
+
export OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:$CYCLIST_PORT"
|
|
93
|
+
EOF
|
|
94
|
+
fi
|
|
95
|
+
fi
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
exit 0
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env zsh
|
|
2
|
+
# Session stop hook: Save checkpoint for cross-session continuity
|
|
3
|
+
# Called by Claude Code when a session ends
|
|
4
|
+
#
|
|
5
|
+
# Writes session state to checkpoint:
|
|
6
|
+
# - Active agent (from .session/agents/)
|
|
7
|
+
# - Current story (from .session/*-session.md)
|
|
8
|
+
# - Workflow phase (from session file)
|
|
9
|
+
# - Git SHA (current HEAD)
|
|
10
|
+
# - Session ID
|
|
11
|
+
#
|
|
12
|
+
# Next session can validate this against current git state.
|
|
13
|
+
|
|
14
|
+
set -euo pipefail
|
|
15
|
+
|
|
16
|
+
# Find project root
|
|
17
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
18
|
+
source "$SCRIPT_DIR/../utils/find-root.sh"
|
|
19
|
+
source "$SCRIPT_DIR/../utils/checkpoint.sh"
|
|
20
|
+
|
|
21
|
+
# Read input from stdin (contains session_id, source, etc.)
|
|
22
|
+
input=$(cat)
|
|
23
|
+
session_id=$(echo "$input" | jq -r '.session_id // "unknown"')
|
|
24
|
+
|
|
25
|
+
# Get current agent for this session
|
|
26
|
+
agent=""
|
|
27
|
+
agent_file="$PROJECT_ROOT/.session/agents/$session_id"
|
|
28
|
+
if [[ -f "$agent_file" ]]; then
|
|
29
|
+
agent=$(cat "$agent_file")
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
# Find active story from session files
|
|
33
|
+
story=""
|
|
34
|
+
phase=""
|
|
35
|
+
session_file=$(find "$PROJECT_ROOT/.session" -maxdepth 1 -name "*-session.md" -type f 2>/dev/null | head -1)
|
|
36
|
+
if [[ -n "$session_file" && -f "$session_file" ]]; then
|
|
37
|
+
# Extract story ID from filename (e.g., 8-3-session.md -> 8-3)
|
|
38
|
+
story=$(basename "$session_file" | sed 's/-session\.md$//')
|
|
39
|
+
|
|
40
|
+
# Extract phase from session file (look for "Phase:" line)
|
|
41
|
+
phase=$(grep -i "^- Phase:" "$session_file" 2>/dev/null | head -1 | sed 's/.*Phase:[[:space:]]*//' | cut -d' ' -f1 || echo "")
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
# Get current git SHA
|
|
45
|
+
git_sha=""
|
|
46
|
+
if command -v git &>/dev/null && git rev-parse --git-dir &>/dev/null; then
|
|
47
|
+
git_sha=$(git rev-parse --short HEAD 2>/dev/null || echo "")
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
# Build checkpoint data (semicolon-separated key=value pairs)
|
|
51
|
+
checkpoint_data="agent=${agent};story=${story};phase=${phase};sha=${git_sha};session=${session_id}"
|
|
52
|
+
|
|
53
|
+
# Save checkpoint
|
|
54
|
+
checkpoint_save "session_state" "$checkpoint_data"
|
|
55
|
+
|
|
56
|
+
# Log session end
|
|
57
|
+
echo "$(date -Iseconds) | Session end: $session_id (agent=$agent, story=$story)" >> "$PROJECT_ROOT/.session/session-log.txt"
|
|
58
|
+
|
|
59
|
+
exit 0
|