@pennyfarthing/core 11.2.0 → 11.2.2
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 +100 -40
- package/package.json +2 -1
- package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/doctor.js +474 -66
- package/packages/core/dist/cli/commands/doctor.js.map +1 -1
- package/packages/core/dist/cli/commands/init.js +4 -4
- package/packages/core/dist/cli/commands/init.js.map +1 -1
- package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/update.js +4 -5
- package/packages/core/dist/cli/commands/update.js.map +1 -1
- package/packages/core/dist/cli/utils/constants.d.ts +3 -8
- package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/constants.js +3 -4
- package/packages/core/dist/cli/utils/constants.js.map +1 -1
- package/packages/core/dist/cli/utils/settings.d.ts +7 -0
- package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/settings.js +70 -29
- package/packages/core/dist/cli/utils/settings.js.map +1 -1
- package/packages/core/dist/cli/utils/symlinks.js +16 -16
- package/packages/core/dist/cli/utils/symlinks.js.map +1 -1
- package/packages/core/dist/consultation/dialogue-manager.d.ts +1 -1
- package/packages/core/dist/consultation/dialogue-manager.d.ts.map +1 -1
- package/packages/core/dist/consultation/dialogue-manager.js +1 -1
- package/packages/core/dist/consultation/dialogue-manager.js.map +1 -1
- package/packages/core/dist/consultation/dialogue-manager.test.js.map +1 -1
- package/packages/core/dist/consultation/tandem-metrics.d.ts +91 -0
- package/packages/core/dist/consultation/tandem-metrics.d.ts.map +1 -0
- package/packages/core/dist/consultation/tandem-metrics.js +131 -0
- package/packages/core/dist/consultation/tandem-metrics.js.map +1 -0
- package/packages/core/dist/consultation/tandem-metrics.test.d.ts +18 -0
- package/packages/core/dist/consultation/tandem-metrics.test.d.ts.map +1 -0
- package/packages/core/dist/consultation/tandem-metrics.test.js +457 -0
- package/packages/core/dist/consultation/tandem-metrics.test.js.map +1 -0
- package/packages/core/dist/public/css/react.css +1 -1
- package/packages/core/dist/public/js/react/react.js +14 -14
- package/packages/core/dist/server/api/agent-load.js +1 -1
- package/packages/core/dist/server/api/agent-load.js.map +1 -1
- package/packages/core/dist/server/api/git.d.ts.map +1 -1
- package/packages/core/dist/server/api/git.js +0 -1
- package/packages/core/dist/server/api/git.js.map +1 -1
- package/packages/core/dist/server/api/index.d.ts +2 -0
- package/packages/core/dist/server/api/index.d.ts.map +1 -1
- package/packages/core/dist/server/api/index.js +2 -0
- package/packages/core/dist/server/api/index.js.map +1 -1
- package/packages/core/dist/server/api/project-info.d.ts +11 -0
- package/packages/core/dist/server/api/project-info.d.ts.map +1 -0
- package/packages/core/dist/server/api/project-info.js +18 -0
- package/packages/core/dist/server/api/project-info.js.map +1 -0
- package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
- package/packages/core/dist/server/otlp-receiver.js +18 -1
- package/packages/core/dist/server/otlp-receiver.js.map +1 -1
- package/packages/core/dist/server/otlp-receiver.test.js +1 -1
- package/packages/core/dist/server/otlp-receiver.test.js.map +1 -1
- package/packages/core/dist/server/server.d.ts +0 -3
- package/packages/core/dist/server/server.d.ts.map +1 -1
- package/packages/core/dist/server/server.js +5 -38
- package/packages/core/dist/server/server.js.map +1 -1
- package/packages/core/dist/server/server.test.d.ts +1 -1
- package/packages/core/dist/server/server.test.js +12 -23
- package/packages/core/dist/server/server.test.js.map +1 -1
- package/packages/core/dist/server/settings.d.ts +1 -0
- package/packages/core/dist/server/settings.d.ts.map +1 -1
- package/packages/core/dist/server/settings.js +13 -0
- package/packages/core/dist/server/settings.js.map +1 -1
- package/packages/core/dist/shared/capabilities.d.ts +88 -0
- package/packages/core/dist/shared/capabilities.d.ts.map +1 -0
- package/packages/core/dist/shared/capabilities.js +133 -0
- package/packages/core/dist/shared/capabilities.js.map +1 -0
- package/packages/core/dist/shared/capabilities.test.d.ts +2 -0
- package/packages/core/dist/shared/capabilities.test.d.ts.map +1 -0
- package/packages/core/dist/shared/capabilities.test.js +217 -0
- package/packages/core/dist/shared/capabilities.test.js.map +1 -0
- package/packages/core/dist/shared/spawn-prompt.d.ts +47 -0
- package/packages/core/dist/shared/spawn-prompt.d.ts.map +1 -0
- package/packages/core/dist/shared/spawn-prompt.js +82 -0
- package/packages/core/dist/shared/spawn-prompt.js.map +1 -0
- package/packages/core/dist/shared/spawn-prompt.test.d.ts +2 -0
- package/packages/core/dist/shared/spawn-prompt.test.d.ts.map +1 -0
- package/packages/core/dist/shared/spawn-prompt.test.js +251 -0
- package/packages/core/dist/shared/spawn-prompt.test.js.map +1 -0
- package/packages/core/dist/workflow/tandem-workflow-templates.test.d.ts +18 -0
- package/packages/core/dist/workflow/tandem-workflow-templates.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/tandem-workflow-templates.test.js +434 -0
- package/packages/core/dist/workflow/tandem-workflow-templates.test.js.map +1 -0
- package/packages/core/dist/workflow/team-lifecycle.d.ts +169 -0
- package/packages/core/dist/workflow/team-lifecycle.d.ts.map +1 -0
- package/packages/core/dist/workflow/team-lifecycle.js +217 -0
- package/packages/core/dist/workflow/team-lifecycle.js.map +1 -0
- package/packages/core/dist/workflow/team-lifecycle.test.d.ts +20 -0
- package/packages/core/dist/workflow/team-lifecycle.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/team-lifecycle.test.js +966 -0
- package/packages/core/dist/workflow/team-lifecycle.test.js.map +1 -0
- package/packages/core/dist/workflow/workflow-schema.d.ts +32 -0
- package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.js +120 -0
- package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.test.d.ts.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.test.js +570 -1
- package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -1
- package/packages/core/dist/workflow/workflow-team-templates.test.d.ts +17 -0
- package/packages/core/dist/workflow/workflow-team-templates.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-team-templates.test.js +275 -0
- package/packages/core/dist/workflow/workflow-team-templates.test.js.map +1 -0
- package/pennyfarthing-dist/agents/dev.md +21 -12
- package/pennyfarthing-dist/agents/reviewer.md +23 -4
- package/pennyfarthing-dist/agents/sm-finish.md +19 -2
- package/pennyfarthing-dist/agents/sm-setup.md +7 -7
- package/pennyfarthing-dist/agents/sm.md +12 -12
- package/pennyfarthing-dist/agents/tea.md +2 -2
- package/pennyfarthing-dist/agents/testing-runner.md +1 -1
- package/pennyfarthing-dist/commands/pf-architect.md +1 -1
- package/pennyfarthing-dist/commands/pf-ba.md +1 -1
- package/pennyfarthing-dist/commands/pf-chore.md +2 -2
- package/pennyfarthing-dist/commands/pf-dev.md +1 -1
- package/pennyfarthing-dist/commands/pf-devops.md +1 -1
- package/pennyfarthing-dist/commands/pf-epic.md +6 -6
- package/pennyfarthing-dist/commands/pf-git.md +12 -10
- package/pennyfarthing-dist/commands/pf-health-check.md +1 -1
- package/pennyfarthing-dist/commands/pf-help.md +12 -12
- package/pennyfarthing-dist/commands/pf-orchestrator.md +1 -1
- package/pennyfarthing-dist/commands/pf-pm.md +1 -1
- package/pennyfarthing-dist/commands/pf-prime.md +8 -8
- package/pennyfarthing-dist/commands/pf-reviewer.md +1 -1
- package/pennyfarthing-dist/commands/pf-session.md +7 -7
- package/pennyfarthing-dist/commands/pf-sm.md +1 -1
- package/pennyfarthing-dist/commands/pf-sprint.md +7 -7
- package/pennyfarthing-dist/commands/pf-tea.md +1 -1
- package/pennyfarthing-dist/commands/pf-tech-writer.md +1 -1
- package/pennyfarthing-dist/commands/pf-theme.md +9 -9
- package/pennyfarthing-dist/commands/pf-ux-designer.md +1 -1
- package/pennyfarthing-dist/commands/pf-work.md +1 -1
- package/pennyfarthing-dist/gates/approval.md +63 -0
- package/pennyfarthing-dist/gates/confidence-sm.md +71 -0
- package/pennyfarthing-dist/gates/context-ok.md +56 -0
- package/pennyfarthing-dist/gates/evaluations/confidence-sm.md +54 -0
- package/pennyfarthing-dist/gates/quality-pass.md +67 -0
- package/pennyfarthing-dist/gates/tests-fail.md +84 -0
- package/pennyfarthing-dist/gates/tests-pass.md +79 -0
- package/pennyfarthing-dist/guides/agent-behavior.md +84 -29
- package/pennyfarthing-dist/guides/agent-coordination.md +10 -10
- package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +6 -6
- package/pennyfarthing-dist/guides/agent-template-tactical.md +1 -1
- package/pennyfarthing-dist/guides/bell-mode.md +1 -1
- package/pennyfarthing-dist/guides/bikerack.md +10 -10
- package/pennyfarthing-dist/guides/brownfield-tools.md +24 -24
- package/pennyfarthing-dist/guides/command-tag-taxonomy.md +1 -1
- package/pennyfarthing-dist/guides/gate-schema.md +2 -2
- package/pennyfarthing-dist/guides/gates.md +3 -3
- package/pennyfarthing-dist/guides/handoff-cli.md +8 -8
- package/pennyfarthing-dist/guides/hooks.md +29 -29
- package/pennyfarthing-dist/guides/prime.md +2 -2
- package/pennyfarthing-dist/guides/reflector.md +1 -1
- package/pennyfarthing-dist/guides/skill-schema.md +6 -6
- package/pennyfarthing-dist/guides/tandem-protocol.md +3 -3
- package/pennyfarthing-dist/guides/workflow-schema.md +1 -1
- package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
- package/pennyfarthing-dist/guides/xml-tags.md +8 -8
- package/pennyfarthing-dist/scripts/README.md +4 -4
- package/pennyfarthing-dist/scripts/core/agent-session.sh +2 -5
- package/pennyfarthing-dist/scripts/core/check-context.sh +3 -1
- package/pennyfarthing-dist/scripts/core/pf.sh +5 -0
- package/pennyfarthing-dist/scripts/core/phase-check-start.sh +4 -89
- package/pennyfarthing-dist/scripts/core/prime.sh +2 -25
- package/pennyfarthing-dist/scripts/git/README.md +14 -14
- package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +2 -3
- package/pennyfarthing-dist/scripts/git/git-status-all.sh +2 -3
- package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +2 -3
- package/pennyfarthing-dist/scripts/git/worktree-manager.sh +2 -4
- package/pennyfarthing-dist/scripts/hooks/README.md +6 -6
- package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +4 -183
- package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +4 -95
- package/pennyfarthing-dist/scripts/hooks/context-warning.sh +4 -65
- package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +3 -31
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +5 -4
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +29 -34
- package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +4 -71
- package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +3 -19
- package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +4 -30
- package/pennyfarthing-dist/scripts/hooks/session-start.sh +3 -32
- package/pennyfarthing-dist/scripts/hooks/session-stop.sh +4 -65
- package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +4 -78
- package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +3 -93
- package/pennyfarthing-dist/scripts/lib/env.sh +34 -0
- package/pennyfarthing-dist/scripts/lib/run-pf.sh +39 -0
- package/pennyfarthing-dist/scripts/misc/README.md +1 -1
- package/pennyfarthing-dist/scripts/misc/statusline.sh +4 -301
- package/pennyfarthing-dist/scripts/sprint/README.md +21 -21
- package/pennyfarthing-dist/scripts/workflow/README.md +2 -2
- package/pennyfarthing-dist/scripts/workflow/finish-story.sh +2 -16
- package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +3 -3
- package/pennyfarthing-dist/skills/pf-bc/examples.md +23 -23
- package/pennyfarthing-dist/skills/pf-bc/skill.md +17 -17
- package/pennyfarthing-dist/skills/pf-bc/usage.md +8 -8
- package/pennyfarthing-dist/skills/pf-jira/SKILL.md +15 -15
- package/pennyfarthing-dist/skills/pf-jira/examples.md +48 -48
- package/pennyfarthing-dist/skills/pf-jira/usage.md +15 -15
- package/pennyfarthing-dist/skills/pf-sprint/examples.md +80 -80
- package/pennyfarthing-dist/skills/pf-sprint/skill.md +35 -35
- package/pennyfarthing-dist/skills/pf-sprint/usage.md +30 -30
- package/pennyfarthing-dist/skills/pf-theme/examples.md +15 -15
- package/pennyfarthing-dist/skills/pf-theme/skill.md +6 -6
- package/pennyfarthing-dist/skills/pf-theme/usage.md +5 -5
- package/pennyfarthing-dist/skills/pf-workflow/examples.md +27 -27
- package/pennyfarthing-dist/skills/pf-workflow/skill.md +11 -11
- package/pennyfarthing-dist/skills/pf-workflow/usage.md +11 -11
- package/pennyfarthing-dist/skills/skill-registry.yaml +19 -19
- package/pennyfarthing-dist/templates/settings.local.json.template +19 -10
- package/pennyfarthing-dist/workflows/bdd-team.yaml +89 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +1 -1
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +1 -1
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +1 -1
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
- package/pennyfarthing-dist/workflows/project-setup/steps/step-01-discover.md +47 -0
- package/pennyfarthing-dist/workflows/tdd-team.yaml +80 -0
- package/pennyfarthing-dist/workflows/tdd.yaml +11 -2
- package/pennyfarthing_scripts/CLAUDE.md +19 -10
- package/pennyfarthing_scripts/__init__.py +1 -1
- package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/context.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/split.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/cli.py +2 -2
- package/pennyfarthing_scripts/bellmode_hook.py +9 -296
- package/pennyfarthing_scripts/bikerack/__pycache__/audit_log_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/context_meter_footer.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/events.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_screen.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/audit_log_panel.py +161 -0
- package/pennyfarthing_scripts/bikerack/base_panel.py +27 -4
- package/pennyfarthing_scripts/bikerack/changed_panel.py +96 -4
- package/pennyfarthing_scripts/bikerack/context_meter_footer.py +88 -0
- package/pennyfarthing_scripts/bikerack/debug_panel.py +1 -1
- package/pennyfarthing_scripts/bikerack/diffs_panel.py +30 -0
- package/pennyfarthing_scripts/bikerack/events.py +28 -0
- package/pennyfarthing_scripts/bikerack/launcher.py +6 -6
- package/pennyfarthing_scripts/bikerack/portrait_resolver.py +139 -0
- package/pennyfarthing_scripts/bikerack/progress_panel.py +0 -1
- package/pennyfarthing_scripts/bikerack/sprint_panel.py +373 -142
- package/pennyfarthing_scripts/bikerack/story_detail_data.py +247 -0
- package/pennyfarthing_scripts/bikerack/story_detail_screen.py +177 -0
- package/pennyfarthing_scripts/bikerack/tui.py +304 -62
- package/pennyfarthing_scripts/bikerack/ws_client.py +2 -2
- package/pennyfarthing_scripts/cli.py +5 -0
- package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/config.py +29 -2
- package/pennyfarthing_scripts/common/pr_config.py +38 -0
- package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/consultation/cli.py +3 -3
- package/pennyfarthing_scripts/context.py +3 -3
- package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/repos.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/hooks_installer.py +2 -3
- package/pennyfarthing_scripts/git/status_all.py +1 -1
- package/pennyfarthing_scripts/git/worktree.py +2 -2
- package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/phase_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/cli.py +33 -1
- package/pennyfarthing_scripts/handoff/complete_phase.py +28 -0
- package/pennyfarthing_scripts/handoff/marker.py +15 -15
- package/pennyfarthing_scripts/handoff/phase_check.py +96 -0
- package/pennyfarthing_scripts/handoff/resolve_gate.py +13 -1
- package/pennyfarthing_scripts/hooks/__init__.py +442 -0
- package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/bell_mode.py +214 -0
- package/pennyfarthing_scripts/hooks/cli.py +96 -0
- package/pennyfarthing_scripts/hooks/context_breaker.py +104 -0
- package/pennyfarthing_scripts/hooks/context_warning.py +66 -0
- package/pennyfarthing_scripts/hooks/cyclist_pretooluse.py +129 -0
- package/pennyfarthing_scripts/hooks/pre_edit_check.py +77 -0
- package/pennyfarthing_scripts/hooks/reflector_check.py +270 -0
- package/pennyfarthing_scripts/hooks/schema_validation.py +202 -0
- package/pennyfarthing_scripts/hooks/session_start.py +294 -0
- package/pennyfarthing_scripts/hooks/session_stop.py +111 -0
- package/pennyfarthing_scripts/hooks/sprint_yaml_validation.py +97 -0
- package/pennyfarthing_scripts/hooks/statusline.py +429 -0
- package/pennyfarthing_scripts/hooks.py +27 -432
- package/pennyfarthing_scripts/pretooluse_hook.py +3 -185
- package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/heatmap.py +3 -15
- package/pennyfarthing_scripts/prime/workflow.py +2 -1
- package/pennyfarthing_scripts/schema_validation_hook.py +3 -298
- package/pennyfarthing_scripts/session_start_hook.py +4 -186
- package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/cli.py +121 -0
- package/pennyfarthing_scripts/sprint/loader.py +154 -3
- package/pennyfarthing_scripts/sprint/story_update.py +26 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_workflow_list_team.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/test_bikerack.py +26 -26
- package/pennyfarthing_scripts/tests/test_dialogue_manager.py +0 -1
- package/pennyfarthing_scripts/tests/test_sprint_panel.py +344 -265
- package/pennyfarthing_scripts/tests/test_workflow_list_team.py +147 -0
- package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/tandem_awareness.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/team_mode.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/team_mode.py +323 -0
- package/pennyfarthing_scripts/validate/adapters/workflow.py +19 -0
- package/pennyfarthing_scripts/welcome_hook.py +3 -149
- package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/team_lifecycle.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/cli.py +22 -20
- package/pennyfarthing_scripts/workflow/state.py +0 -1
- package/pennyfarthing_scripts/workflow/team_lifecycle.py +256 -0
- package/packages/core/dist/cli/cyclist-migration.test.d.ts +0 -16
- package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +0 -1
- package/packages/core/dist/cli/cyclist-migration.test.js +0 -229
- package/packages/core/dist/cli/cyclist-migration.test.js.map +0 -1
- package/packages/core/dist/scripts/theme-detail.test.d.ts +0 -10
- package/packages/core/dist/scripts/theme-detail.test.d.ts.map +0 -1
- package/packages/core/dist/scripts/theme-detail.test.js +0 -199
- package/packages/core/dist/scripts/theme-detail.test.js.map +0 -1
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase-scoped Team Lifecycle for Story 86-10
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle of native Agent Teams within workflow phases.
|
|
5
|
+
* When a workflow phase has a `team:` config block, the lead agent creates
|
|
6
|
+
* a team at phase start, spawns teammates, and cleans up before handoff.
|
|
7
|
+
*
|
|
8
|
+
* Follows the same ProcessAdapter injection pattern as tandem-lifecycle.ts.
|
|
9
|
+
*/
|
|
10
|
+
import type { WorkflowPhase, TeamConfig } from './workflow-schema.js';
|
|
11
|
+
/** Handle to an active team for a workflow phase */
|
|
12
|
+
export interface TeamHandle {
|
|
13
|
+
/** Team name (format: {storyId}-{phase}) */
|
|
14
|
+
teamName: string;
|
|
15
|
+
/** Story ID this team belongs to */
|
|
16
|
+
storyId: string;
|
|
17
|
+
/** Workflow phase name */
|
|
18
|
+
phase: string;
|
|
19
|
+
/** Active teammate handles */
|
|
20
|
+
teammates: TeammateHandle[];
|
|
21
|
+
/** ISO timestamp when team was created */
|
|
22
|
+
createdAt: string;
|
|
23
|
+
}
|
|
24
|
+
/** Handle to an individual teammate within a team */
|
|
25
|
+
export interface TeammateHandle {
|
|
26
|
+
/** Agent name (e.g., 'architect', 'tea') */
|
|
27
|
+
agent: string;
|
|
28
|
+
/** Task description from workflow YAML */
|
|
29
|
+
task?: string;
|
|
30
|
+
/** Current teammate status */
|
|
31
|
+
status: 'spawned' | 'active' | 'idle' | 'crashed' | 'shutdown';
|
|
32
|
+
}
|
|
33
|
+
/** Parameters for creating a phase-scoped team */
|
|
34
|
+
export interface CreateTeamParams {
|
|
35
|
+
/** Phase config (must have team block to create) */
|
|
36
|
+
phase: WorkflowPhase;
|
|
37
|
+
/** Current story ID */
|
|
38
|
+
storyId: string;
|
|
39
|
+
/** Path to .session directory */
|
|
40
|
+
sessionDir: string;
|
|
41
|
+
/** Process adapter for real team operations. Omit for in-memory (tests). */
|
|
42
|
+
adapter?: TeamProcessAdapter;
|
|
43
|
+
}
|
|
44
|
+
/** Result of a gate check (TaskCompleted or TeammateIdle hook) */
|
|
45
|
+
export interface GateCheckResult {
|
|
46
|
+
/** Whether the gate passed */
|
|
47
|
+
passed: boolean;
|
|
48
|
+
/** Gate type that was checked */
|
|
49
|
+
gate: string;
|
|
50
|
+
/** Reason for pass/fail */
|
|
51
|
+
reason?: string;
|
|
52
|
+
}
|
|
53
|
+
/** Team activity summary for session file audit trail */
|
|
54
|
+
export interface TeamActivitySummary {
|
|
55
|
+
/** Team name */
|
|
56
|
+
teamName: string;
|
|
57
|
+
/** Story ID */
|
|
58
|
+
storyId: string;
|
|
59
|
+
/** Phase name */
|
|
60
|
+
phase: string;
|
|
61
|
+
/** Member details */
|
|
62
|
+
members: Array<{
|
|
63
|
+
agent: string;
|
|
64
|
+
status: string;
|
|
65
|
+
task?: string;
|
|
66
|
+
}>;
|
|
67
|
+
/** Whether all teammates were cleaned up properly */
|
|
68
|
+
cleanShutdown: boolean;
|
|
69
|
+
}
|
|
70
|
+
/** Sidecar lock handle */
|
|
71
|
+
export interface SidecarLock {
|
|
72
|
+
/** Path to the lock file */
|
|
73
|
+
lockPath: string;
|
|
74
|
+
/** Story ID that owns the lock */
|
|
75
|
+
storyId: string;
|
|
76
|
+
/** Timestamp when lock was acquired */
|
|
77
|
+
acquiredAt: string;
|
|
78
|
+
}
|
|
79
|
+
/** Standard result object per framework pattern */
|
|
80
|
+
export interface TeamResult<T = unknown> {
|
|
81
|
+
success: boolean;
|
|
82
|
+
data?: T;
|
|
83
|
+
error?: string;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Adapter for real team operations.
|
|
87
|
+
*
|
|
88
|
+
* The library module cannot call Claude Code's TeamCreate/SendMessage tools
|
|
89
|
+
* directly — callers inject the real implementation.
|
|
90
|
+
* Tests use the default no-op adapter.
|
|
91
|
+
*/
|
|
92
|
+
export interface TeamProcessAdapter {
|
|
93
|
+
/** Create a team. Returns team name. */
|
|
94
|
+
createTeam(params: {
|
|
95
|
+
teamName: string;
|
|
96
|
+
description?: string;
|
|
97
|
+
}): Promise<{
|
|
98
|
+
teamName: string;
|
|
99
|
+
}>;
|
|
100
|
+
/** Delete a team. */
|
|
101
|
+
deleteTeam(teamName: string): Promise<void>;
|
|
102
|
+
/** Spawn a teammate within a team. */
|
|
103
|
+
spawnTeammate(params: {
|
|
104
|
+
teamName: string;
|
|
105
|
+
agent: string;
|
|
106
|
+
prompt: string;
|
|
107
|
+
model?: string;
|
|
108
|
+
}): Promise<{
|
|
109
|
+
agentId: string;
|
|
110
|
+
}>;
|
|
111
|
+
/** Send shutdown request to a teammate. */
|
|
112
|
+
shutdownTeammate(params: {
|
|
113
|
+
teamName: string;
|
|
114
|
+
agent: string;
|
|
115
|
+
}): Promise<void>;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Reset all in-memory state. For testing only.
|
|
119
|
+
*/
|
|
120
|
+
export declare function _resetForTesting(): void;
|
|
121
|
+
/**
|
|
122
|
+
* Create a phase-scoped team.
|
|
123
|
+
*
|
|
124
|
+
* If phase has no team config, returns success with no handle (no-op).
|
|
125
|
+
* If phase has team config, creates team and returns handle.
|
|
126
|
+
*/
|
|
127
|
+
export declare function createTeam(params: CreateTeamParams): Promise<TeamResult<TeamHandle>>;
|
|
128
|
+
/**
|
|
129
|
+
* Spawn all teammates for a team based on workflow YAML config.
|
|
130
|
+
*/
|
|
131
|
+
export declare function spawnTeammates(handle: TeamHandle, config: TeamConfig, storyId: string, phase: string, adapter?: TeamProcessAdapter): Promise<TeamResult<TeammateHandle[]>>;
|
|
132
|
+
/**
|
|
133
|
+
* Shut down all active teammates in a team.
|
|
134
|
+
*/
|
|
135
|
+
export declare function shutdownAllTeammates(handle: TeamHandle, adapter?: TeamProcessAdapter): Promise<TeamResult<{
|
|
136
|
+
shutdownCount: number;
|
|
137
|
+
}>>;
|
|
138
|
+
/**
|
|
139
|
+
* Clean up a team entirely (TeamDelete).
|
|
140
|
+
* Must run before pf handoff.
|
|
141
|
+
*/
|
|
142
|
+
export declare function cleanupTeam(handle: TeamHandle, adapter?: TeamProcessAdapter): Promise<TeamResult<{
|
|
143
|
+
cleaned: boolean;
|
|
144
|
+
}>>;
|
|
145
|
+
/**
|
|
146
|
+
* Check gate condition when a TaskCompleted event fires.
|
|
147
|
+
*/
|
|
148
|
+
export declare function checkGateOnTaskCompleted(handle: TeamHandle, phase: WorkflowPhase): GateCheckResult;
|
|
149
|
+
/**
|
|
150
|
+
* Check gate condition when a TeammateIdle event fires.
|
|
151
|
+
*/
|
|
152
|
+
export declare function checkGateOnTeammateIdle(_handle: TeamHandle, teammate: TeammateHandle, phase: WorkflowPhase): GateCheckResult;
|
|
153
|
+
/**
|
|
154
|
+
* Generate a team activity summary for the session file audit trail.
|
|
155
|
+
*/
|
|
156
|
+
export declare function generateTeamSummary(handle: TeamHandle): TeamActivitySummary;
|
|
157
|
+
/**
|
|
158
|
+
* Acquire an exclusive lock for sidecar file writing.
|
|
159
|
+
*/
|
|
160
|
+
export declare function acquireSidecarLock(filePath: string, storyId: string, _timeout?: number): Promise<TeamResult<SidecarLock>>;
|
|
161
|
+
/**
|
|
162
|
+
* Release a sidecar file lock.
|
|
163
|
+
*/
|
|
164
|
+
export declare function releaseSidecarLock(lock: SidecarLock): TeamResult<void>;
|
|
165
|
+
/**
|
|
166
|
+
* Get the active team for a story, if any.
|
|
167
|
+
*/
|
|
168
|
+
export declare function getActiveTeam(storyId: string): TeamHandle | null;
|
|
169
|
+
//# sourceMappingURL=team-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-lifecycle.d.ts","sourceRoot":"","sources":["../../src/workflow/team-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase-scoped Team Lifecycle for Story 86-10
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle of native Agent Teams within workflow phases.
|
|
5
|
+
* When a workflow phase has a `team:` config block, the lead agent creates
|
|
6
|
+
* a team at phase start, spawns teammates, and cleans up before handoff.
|
|
7
|
+
*
|
|
8
|
+
* Follows the same ProcessAdapter injection pattern as tandem-lifecycle.ts.
|
|
9
|
+
*/
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// In-memory registries
|
|
12
|
+
// =============================================================================
|
|
13
|
+
/** Active teams keyed by storyId */
|
|
14
|
+
const activeTeams = new Map();
|
|
15
|
+
/** Sidecar locks keyed by file path */
|
|
16
|
+
const sidecarLocks = new Map();
|
|
17
|
+
/**
|
|
18
|
+
* Reset all in-memory state. For testing only.
|
|
19
|
+
*/
|
|
20
|
+
export function _resetForTesting() {
|
|
21
|
+
activeTeams.clear();
|
|
22
|
+
sidecarLocks.clear();
|
|
23
|
+
}
|
|
24
|
+
// =============================================================================
|
|
25
|
+
// Implementations
|
|
26
|
+
// =============================================================================
|
|
27
|
+
/**
|
|
28
|
+
* Create a phase-scoped team.
|
|
29
|
+
*
|
|
30
|
+
* If phase has no team config, returns success with no handle (no-op).
|
|
31
|
+
* If phase has team config, creates team and returns handle.
|
|
32
|
+
*/
|
|
33
|
+
export async function createTeam(params) {
|
|
34
|
+
const { phase, storyId, adapter } = params;
|
|
35
|
+
if (!phase.team) {
|
|
36
|
+
return { success: true };
|
|
37
|
+
}
|
|
38
|
+
const teamName = `${storyId}-${phase.name}`;
|
|
39
|
+
// Clean up existing team for same story
|
|
40
|
+
const existing = activeTeams.get(storyId);
|
|
41
|
+
if (existing && adapter) {
|
|
42
|
+
try {
|
|
43
|
+
await adapter.deleteTeam(existing.teamName);
|
|
44
|
+
}
|
|
45
|
+
catch { /* swallow */ }
|
|
46
|
+
activeTeams.delete(storyId);
|
|
47
|
+
}
|
|
48
|
+
const handle = {
|
|
49
|
+
teamName,
|
|
50
|
+
storyId,
|
|
51
|
+
phase: phase.name,
|
|
52
|
+
teammates: [],
|
|
53
|
+
createdAt: new Date().toISOString(),
|
|
54
|
+
};
|
|
55
|
+
if (adapter) {
|
|
56
|
+
try {
|
|
57
|
+
await adapter.createTeam({ teamName });
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
return { success: false, error: err.message };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
activeTeams.set(storyId, handle);
|
|
64
|
+
return { success: true, data: handle };
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Spawn all teammates for a team based on workflow YAML config.
|
|
68
|
+
*/
|
|
69
|
+
export async function spawnTeammates(handle, config, storyId, phase, adapter) {
|
|
70
|
+
const teammates = [];
|
|
71
|
+
for (const member of config.teammates) {
|
|
72
|
+
const teammate = {
|
|
73
|
+
agent: member.agent,
|
|
74
|
+
task: member.task,
|
|
75
|
+
status: 'spawned',
|
|
76
|
+
};
|
|
77
|
+
if (adapter) {
|
|
78
|
+
try {
|
|
79
|
+
await adapter.spawnTeammate({
|
|
80
|
+
teamName: handle.teamName,
|
|
81
|
+
agent: member.agent,
|
|
82
|
+
prompt: `pf agent start "${member.agent}"`,
|
|
83
|
+
model: config.model,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
teammate.status = 'crashed';
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
teammates.push(teammate);
|
|
91
|
+
}
|
|
92
|
+
handle.teammates = teammates;
|
|
93
|
+
// Update registry
|
|
94
|
+
if (activeTeams.has(handle.storyId)) {
|
|
95
|
+
activeTeams.set(handle.storyId, handle);
|
|
96
|
+
}
|
|
97
|
+
return { success: true, data: teammates };
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Shut down all active teammates in a team.
|
|
101
|
+
*/
|
|
102
|
+
export async function shutdownAllTeammates(handle, adapter) {
|
|
103
|
+
let shutdownCount = 0;
|
|
104
|
+
for (const teammate of handle.teammates) {
|
|
105
|
+
if (teammate.status === 'shutdown' || teammate.status === 'crashed') {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (adapter) {
|
|
109
|
+
try {
|
|
110
|
+
await adapter.shutdownTeammate({
|
|
111
|
+
teamName: handle.teamName,
|
|
112
|
+
agent: teammate.agent,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
catch { /* swallow — graceful degradation */ }
|
|
116
|
+
}
|
|
117
|
+
teammate.status = 'shutdown';
|
|
118
|
+
shutdownCount++;
|
|
119
|
+
}
|
|
120
|
+
return { success: true, data: { shutdownCount } };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Clean up a team entirely (TeamDelete).
|
|
124
|
+
* Must run before pf handoff.
|
|
125
|
+
*/
|
|
126
|
+
export async function cleanupTeam(handle, adapter) {
|
|
127
|
+
if (adapter) {
|
|
128
|
+
try {
|
|
129
|
+
await adapter.deleteTeam(handle.teamName);
|
|
130
|
+
}
|
|
131
|
+
catch { /* swallow */ }
|
|
132
|
+
}
|
|
133
|
+
activeTeams.delete(handle.storyId);
|
|
134
|
+
return { success: true, data: { cleaned: true } };
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Check gate condition when a TaskCompleted event fires.
|
|
138
|
+
*/
|
|
139
|
+
export function checkGateOnTaskCompleted(handle, phase) {
|
|
140
|
+
if (!phase.gate) {
|
|
141
|
+
return { passed: true, gate: 'none' };
|
|
142
|
+
}
|
|
143
|
+
const gateType = phase.gate.type ?? 'unknown';
|
|
144
|
+
const hasActive = handle.teammates.some((t) => t.status === 'active');
|
|
145
|
+
if (hasActive) {
|
|
146
|
+
return { passed: false, gate: gateType, reason: 'Teammates still active' };
|
|
147
|
+
}
|
|
148
|
+
return { passed: true, gate: gateType };
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Check gate condition when a TeammateIdle event fires.
|
|
152
|
+
*/
|
|
153
|
+
export function checkGateOnTeammateIdle(_handle, teammate, phase) {
|
|
154
|
+
if (!phase.gate) {
|
|
155
|
+
return { passed: true, gate: 'none' };
|
|
156
|
+
}
|
|
157
|
+
const gateType = phase.gate.type ?? 'unknown';
|
|
158
|
+
if (teammate.status === 'crashed') {
|
|
159
|
+
return { passed: false, gate: gateType, reason: 'Teammate crashed' };
|
|
160
|
+
}
|
|
161
|
+
return { passed: true, gate: gateType };
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Generate a team activity summary for the session file audit trail.
|
|
165
|
+
*/
|
|
166
|
+
export function generateTeamSummary(handle) {
|
|
167
|
+
return {
|
|
168
|
+
teamName: handle.teamName,
|
|
169
|
+
storyId: handle.storyId,
|
|
170
|
+
phase: handle.phase,
|
|
171
|
+
members: handle.teammates.map((t) => ({
|
|
172
|
+
agent: t.agent,
|
|
173
|
+
status: t.status,
|
|
174
|
+
task: t.task,
|
|
175
|
+
})),
|
|
176
|
+
cleanShutdown: handle.teammates.every((t) => t.status === 'shutdown'),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Acquire an exclusive lock for sidecar file writing.
|
|
181
|
+
*/
|
|
182
|
+
export async function acquireSidecarLock(filePath, storyId, _timeout) {
|
|
183
|
+
const existing = sidecarLocks.get(filePath);
|
|
184
|
+
if (existing) {
|
|
185
|
+
if (existing.storyId === storyId) {
|
|
186
|
+
return { success: true, data: existing };
|
|
187
|
+
}
|
|
188
|
+
return { success: false, error: `Lock held by story ${existing.storyId}` };
|
|
189
|
+
}
|
|
190
|
+
const lock = {
|
|
191
|
+
lockPath: `${filePath}.lock`,
|
|
192
|
+
storyId,
|
|
193
|
+
acquiredAt: new Date().toISOString(),
|
|
194
|
+
};
|
|
195
|
+
sidecarLocks.set(filePath, lock);
|
|
196
|
+
return { success: true, data: lock };
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Release a sidecar file lock.
|
|
200
|
+
*/
|
|
201
|
+
export function releaseSidecarLock(lock) {
|
|
202
|
+
// Find and remove by lockPath
|
|
203
|
+
for (const [path, held] of sidecarLocks) {
|
|
204
|
+
if (held.lockPath === lock.lockPath) {
|
|
205
|
+
sidecarLocks.delete(path);
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return { success: true };
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Get the active team for a story, if any.
|
|
213
|
+
*/
|
|
214
|
+
export function getActiveTeam(storyId) {
|
|
215
|
+
return activeTeams.get(storyId) ?? null;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=team-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-lifecycle.js","sourceRoot":"","sources":["../../src/workflow/team-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Story 86-10: Phase-scoped team lifecycle + gate hooks
|
|
3
|
+
*
|
|
4
|
+
* RED state tests for native Agent Teams lifecycle in phased workflows.
|
|
5
|
+
* These tests cover all 9 acceptance criteria:
|
|
6
|
+
*
|
|
7
|
+
* AC1: Lead creates team on phase entry when workflow has team block
|
|
8
|
+
* AC2: Lead spawns teammates per workflow YAML teammates config
|
|
9
|
+
* AC3: TaskCompleted hook enforces gate checks
|
|
10
|
+
* AC4: TeammateIdle hook validates teammate work
|
|
11
|
+
* AC5: Lead shuts down all teammates before exit protocol
|
|
12
|
+
* AC6: TeamDelete runs before pf handoff (full cleanup before marker)
|
|
13
|
+
* AC7: Session file updated with teammate activity summary
|
|
14
|
+
* AC8: Sidecar file locking for concurrent teammate writes
|
|
15
|
+
* AC9: Graceful degradation when teammate crashes
|
|
16
|
+
*
|
|
17
|
+
* Run with: pnpm build && pnpm test
|
|
18
|
+
*/
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=team-lifecycle.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-lifecycle.test.d.ts","sourceRoot":"","sources":["../../src/workflow/team-lifecycle.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}
|