@pennyfarthing/core 11.0.0-alpha.0 → 11.1.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 +84 -26
- package/package.json +14 -16
- package/packages/core/dist/cli/cyclist-migration.test.js +2 -1
- package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -1
- package/packages/core/dist/cli/ocean-profiles.test.js +5 -4
- package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -1
- package/packages/core/dist/cli/theme-maker.test.js +5 -4
- package/packages/core/dist/cli/theme-maker.test.js.map +1 -1
- package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.d.ts +20 -0
- package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.js +278 -0
- package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.js.map +1 -0
- package/packages/core/dist/cli/utils/constants.d.ts +7 -1
- package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/constants.js +2 -0
- package/packages/core/dist/cli/utils/constants.js.map +1 -1
- package/packages/core/dist/cli/utils/constants.test.d.ts +10 -0
- package/packages/core/dist/cli/utils/constants.test.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/constants.test.js +38 -0
- package/packages/core/dist/cli/utils/constants.test.js.map +1 -0
- package/packages/core/dist/consultation/consultation-protocol.d.ts +139 -0
- package/packages/core/dist/consultation/consultation-protocol.d.ts.map +1 -0
- package/packages/core/dist/consultation/consultation-protocol.js +178 -0
- package/packages/core/dist/consultation/consultation-protocol.js.map +1 -0
- package/packages/core/dist/consultation/consultation-protocol.test.d.ts +20 -0
- package/packages/core/dist/consultation/consultation-protocol.test.d.ts.map +1 -0
- package/packages/core/dist/consultation/consultation-protocol.test.js +474 -0
- package/packages/core/dist/consultation/consultation-protocol.test.js.map +1 -0
- package/packages/core/dist/public/js/react/react.js +30 -30
- package/packages/core/dist/scripts/generate-report.test.js +2 -2
- package/packages/core/dist/scripts/generate-spider-report.test.js +2 -2
- package/packages/core/dist/scripts/generate-spider.test.js +2 -1
- package/packages/core/dist/scripts/generate-spider.test.js.map +1 -1
- package/packages/core/dist/server/api/file-browser.d.ts.map +1 -1
- package/packages/core/dist/server/api/file-browser.js +19 -1
- package/packages/core/dist/server/api/file-browser.js.map +1 -1
- package/packages/core/dist/server/api/git-fetch-cooldown.test.d.ts +10 -0
- package/packages/core/dist/server/api/git-fetch-cooldown.test.d.ts.map +1 -0
- package/packages/core/dist/server/api/git-fetch-cooldown.test.js +30 -0
- package/packages/core/dist/server/api/git-fetch-cooldown.test.js.map +1 -0
- package/packages/core/dist/server/api/git.d.ts +8 -0
- package/packages/core/dist/server/api/git.d.ts.map +1 -1
- package/packages/core/dist/server/api/git.js +37 -10
- package/packages/core/dist/server/api/git.js.map +1 -1
- package/packages/core/dist/server/api/health-score.d.ts.map +1 -1
- package/packages/core/dist/server/api/health-score.js +25 -1
- package/packages/core/dist/server/api/health-score.js.map +1 -1
- package/packages/core/dist/server/api/index.d.ts +1 -1
- package/packages/core/dist/server/api/index.d.ts.map +1 -1
- package/packages/core/dist/server/api/index.js +1 -1
- package/packages/core/dist/server/api/index.js.map +1 -1
- package/packages/core/dist/server/api/settings.d.ts.map +1 -1
- package/packages/core/dist/server/api/settings.js +73 -2
- package/packages/core/dist/server/api/settings.js.map +1 -1
- package/packages/core/dist/server/api/theme-agents.d.ts.map +1 -1
- package/packages/core/dist/server/api/theme-agents.js +61 -0
- package/packages/core/dist/server/api/theme-agents.js.map +1 -1
- package/packages/core/dist/server/otlp-receiver.d.ts +35 -13
- package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
- package/packages/core/dist/server/otlp-receiver.js +76 -16
- package/packages/core/dist/server/otlp-receiver.js.map +1 -1
- package/packages/core/dist/server/paths.d.ts.map +1 -1
- package/packages/core/dist/server/paths.js +11 -1
- package/packages/core/dist/server/paths.js.map +1 -1
- package/packages/core/dist/server/server.d.ts +3 -1
- package/packages/core/dist/server/server.d.ts.map +1 -1
- package/packages/core/dist/server/server.js +23 -16
- package/packages/core/dist/server/server.js.map +1 -1
- package/packages/core/dist/server/server.test.js.map +1 -1
- package/packages/core/dist/workflow/gate-file-validation.d.ts +49 -0
- package/packages/core/dist/workflow/gate-file-validation.d.ts.map +1 -0
- package/packages/core/dist/workflow/gate-file-validation.js +157 -0
- package/packages/core/dist/workflow/gate-file-validation.js.map +1 -0
- package/packages/core/dist/workflow/gate-file-validation.test.d.ts +19 -0
- package/packages/core/dist/workflow/gate-file-validation.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/gate-file-validation.test.js +536 -0
- package/packages/core/dist/workflow/gate-file-validation.test.js.map +1 -0
- package/packages/core/dist/workflow/gate-schema-validation.test.d.ts +14 -0
- package/packages/core/dist/workflow/gate-schema-validation.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/gate-schema-validation.test.js +339 -0
- package/packages/core/dist/workflow/gate-schema-validation.test.js.map +1 -0
- package/packages/core/dist/workflow/handoff.js +2 -2
- package/packages/core/dist/workflow/handoff.js.map +1 -1
- package/packages/core/dist/workflow/handoff.test.js +16 -0
- package/packages/core/dist/workflow/handoff.test.js.map +1 -1
- package/packages/core/dist/workflow/variable-resolver.test.js +1 -1
- package/packages/core/dist/workflow/variable-resolver.test.js.map +1 -1
- package/packages/core/dist/workflow/workflow-migration.test.js +4 -3
- package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.d.ts +4 -2
- package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.js +43 -8
- package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
- package/pennyfarthing-dist/agents/README.md +6 -14
- package/pennyfarthing-dist/agents/architect.md +43 -30
- package/pennyfarthing-dist/agents/ba.md +30 -29
- package/pennyfarthing-dist/agents/dev.md +76 -41
- package/pennyfarthing-dist/agents/devops.md +57 -21
- package/pennyfarthing-dist/agents/orchestrator.md +3 -11
- package/pennyfarthing-dist/agents/pm.md +45 -31
- package/pennyfarthing-dist/agents/reviewer.md +20 -66
- package/pennyfarthing-dist/agents/sm-setup.md +2 -2
- package/pennyfarthing-dist/agents/sm.md +8 -30
- package/pennyfarthing-dist/agents/tea.md +25 -41
- package/pennyfarthing-dist/agents/tech-writer.md +33 -90
- package/pennyfarthing-dist/agents/ux-designer.md +39 -40
- package/pennyfarthing-dist/commands/benchmark-control.md +8 -64
- package/pennyfarthing-dist/commands/benchmark.md +8 -480
- package/pennyfarthing-dist/commands/job-fair.md +8 -97
- package/pennyfarthing-dist/commands/pf-benchmark-control.md +70 -0
- package/pennyfarthing-dist/commands/pf-benchmark.md +486 -0
- package/pennyfarthing-dist/commands/pf-chore.md +4 -4
- package/pennyfarthing-dist/commands/pf-ci.md +40 -0
- package/pennyfarthing-dist/commands/pf-close-epic.md +9 -27
- package/pennyfarthing-dist/commands/pf-continue-session.md +9 -213
- package/pennyfarthing-dist/commands/pf-create-branches-from-story.md +11 -353
- package/pennyfarthing-dist/commands/pf-docs.md +28 -0
- package/pennyfarthing-dist/commands/pf-epic.md +67 -0
- package/pennyfarthing-dist/commands/pf-git-cleanup.md +11 -52
- package/pennyfarthing-dist/commands/pf-git.md +75 -0
- package/pennyfarthing-dist/commands/pf-help.md +110 -128
- package/pennyfarthing-dist/commands/pf-job-fair.md +102 -0
- package/pennyfarthing-dist/commands/pf-new-work.md +9 -18
- package/pennyfarthing-dist/commands/pf-parallel-work.md +6 -66
- package/pennyfarthing-dist/commands/pf-release.md +11 -76
- package/pennyfarthing-dist/commands/pf-repo-status.md +11 -44
- package/pennyfarthing-dist/commands/pf-run-ci.md +8 -111
- package/pennyfarthing-dist/commands/pf-session.md +51 -0
- package/pennyfarthing-dist/commands/pf-solo.md +447 -0
- package/pennyfarthing-dist/commands/pf-sprint-planning.md +8 -104
- package/pennyfarthing-dist/commands/pf-standalone.md +1 -1
- package/pennyfarthing-dist/commands/pf-start-epic.md +9 -163
- package/pennyfarthing-dist/commands/pf-sync-epic-to-jira.md +8 -179
- package/pennyfarthing-dist/commands/pf-sync-work-with-sprint.md +8 -368
- package/pennyfarthing-dist/commands/pf-update-domain-docs.md +8 -78
- package/pennyfarthing-dist/commands/solo.md +8 -442
- package/pennyfarthing-dist/guides/agent-behavior.md +14 -14
- package/pennyfarthing-dist/guides/agent-coordination.md +7 -7
- package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +6 -6
- package/pennyfarthing-dist/guides/bikerack.md +128 -0
- package/pennyfarthing-dist/guides/brownfield-tools.md +133 -0
- package/pennyfarthing-dist/guides/command-tag-taxonomy.md +2 -2
- package/pennyfarthing-dist/guides/gate-schema.md +227 -0
- package/pennyfarthing-dist/guides/gates.md +120 -0
- package/pennyfarthing-dist/guides/handoff-cli.md +116 -0
- package/pennyfarthing-dist/guides/hooks.md +86 -4
- package/pennyfarthing-dist/guides/output-styles.md +65 -0
- package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +5 -5
- package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +4 -4
- package/pennyfarthing-dist/guides/prompt-patterns.md +5 -5
- package/pennyfarthing-dist/guides/reflector.md +4 -4
- package/pennyfarthing-dist/guides/session-artifacts.md +1 -1
- package/pennyfarthing-dist/guides/skill-schema.md +1 -1
- package/pennyfarthing-dist/guides/tandem-protocol.md +13 -1
- package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
- package/pennyfarthing-dist/guides/xml-tags.md +5 -4
- package/pennyfarthing-dist/personas/themes/hogans-heroes.yaml +11 -22
- package/pennyfarthing-dist/personas/themes/stephen-king.yaml +13 -24
- package/pennyfarthing-dist/scripts/core/agent-session.sh +0 -0
- package/pennyfarthing-dist/scripts/core/check-context.sh +0 -0
- package/pennyfarthing-dist/scripts/core/phase-check-start.sh +1 -1
- package/pennyfarthing-dist/scripts/core/prime.sh +0 -0
- package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -0
- package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +0 -0
- package/pennyfarthing-dist/scripts/git/git-status-all.sh +0 -0
- package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +0 -0
- package/pennyfarthing-dist/scripts/git/release.sh +0 -0
- package/pennyfarthing-dist/scripts/git/worktree-manager.sh +0 -0
- package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/dispatcher-template.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +19 -14
- package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -0
- package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/common.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/logging.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/retry.sh +0 -0
- package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -0
- package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -0
- package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -0
- package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/statusline.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +0 -0
- package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +191 -57
- package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +26 -10
- package/pennyfarthing-dist/scripts/story/create-story.sh +0 -0
- package/pennyfarthing-dist/scripts/story/size-story.sh +0 -0
- package/pennyfarthing-dist/scripts/story/story-template.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -0
- package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/check.py +0 -0
- package/pennyfarthing-dist/scripts/workflow/check.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/complete-step.py +0 -0
- package/pennyfarthing-dist/scripts/workflow/finish-story.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -0
- package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +0 -0
- package/pennyfarthing-dist/skills/pf-changelog/SKILL.md +4 -4
- package/pennyfarthing-dist/skills/pf-sprint/skill.md +1 -1
- package/pennyfarthing-dist/skills/pf-story/scripts/create-story.sh +0 -0
- package/pennyfarthing-dist/skills/pf-story/scripts/size-story.sh +0 -0
- package/pennyfarthing-dist/skills/pf-story/scripts/story-template.sh +0 -0
- package/pennyfarthing-dist/skills/pf-systematic-debugging/SKILL.md +0 -1
- package/pennyfarthing-dist/skills/pf-workflow/scripts/list-workflows.sh +0 -0
- package/pennyfarthing-dist/skills/pf-workflow/scripts/resume-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/pf-workflow/scripts/show-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/pf-workflow/scripts/start-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/pf-workflow/scripts/workflow-status.sh +0 -0
- package/pennyfarthing-dist/skills/skill-registry.schema.json +4 -0
- package/pennyfarthing-dist/skills/skill-registry.yaml +8 -21
- package/pennyfarthing-dist/workflows/2party-tdd.yaml +11 -0
- package/pennyfarthing-dist/workflows/agent-docs.yaml +2 -0
- package/pennyfarthing-dist/workflows/bdd-tandem.yaml +4 -0
- package/pennyfarthing-dist/workflows/bdd.yaml +4 -0
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
- package/pennyfarthing-dist/workflows/tdd-tandem.yaml +3 -0
- package/pennyfarthing-dist/workflows/tdd.yaml +3 -0
- package/pennyfarthing-dist/workflows/trivial.yaml +2 -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__/session_start_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/__init__.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/bikerack/__pycache__/__init__.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__/cli.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__/git_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.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/changed_panel.py +105 -0
- package/pennyfarthing_scripts/bikerack/debug_panel.py +218 -0
- package/pennyfarthing_scripts/bikerack/diffs_panel.py +203 -27
- package/pennyfarthing_scripts/cli.py +114 -0
- package/pennyfarthing_scripts/epic/__init__.py +0 -0
- package/pennyfarthing_scripts/epic/cli.py +64 -0
- package/pennyfarthing_scripts/gate/__init__.py +1 -0
- package/pennyfarthing_scripts/gate/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/gate/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/gate/__pycache__/validate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/gate/cli.py +56 -0
- package/pennyfarthing_scripts/gate/validate.py +266 -0
- package/pennyfarthing_scripts/git_group/__init__.py +0 -0
- package/pennyfarthing_scripts/git_group/cli.py +100 -0
- package/pennyfarthing_scripts/handoff/__init__.py +1 -0
- package/pennyfarthing_scripts/handoff/__pycache__/__init__.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__/gate_file.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/cli.py +120 -0
- package/pennyfarthing_scripts/handoff/complete_phase.py +155 -0
- package/pennyfarthing_scripts/handoff/gate_file.py +105 -0
- package/pennyfarthing_scripts/handoff/gate_runner.py +152 -0
- package/pennyfarthing_scripts/handoff/marker.py +109 -0
- package/pennyfarthing_scripts/handoff/resolve_gate.py +152 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/workflow.py +39 -0
- package/pennyfarthing_scripts/session/__init__.py +0 -0
- package/pennyfarthing_scripts/session/cli.py +87 -0
- package/pennyfarthing_scripts/session_start_hook.py +4 -4
- package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_add.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/__pycache__/validate_cmd.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/archive_epic.py +8 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_108_2_remove_handoff_fallback.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_gate_file_resolution.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_gate_runner.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_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_resolve_gate_file_field.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/test_108_1_gate_migration.py +540 -0
- package/pennyfarthing_scripts/tests/test_108_2_remove_handoff_fallback.py +339 -0
- package/pennyfarthing_scripts/tests/test_archive_epic.py +1 -2
- package/pennyfarthing_scripts/tests/test_confidence_sm_evaluation.py +253 -0
- package/pennyfarthing_scripts/tests/test_confidence_sm_gate.py +315 -0
- package/pennyfarthing_scripts/tests/test_gate_file_resolution.py +341 -0
- package/pennyfarthing_scripts/tests/test_gate_runner.py +620 -0
- package/pennyfarthing_scripts/tests/test_handoff_cli.py +929 -0
- package/pennyfarthing_scripts/tests/test_handoff_e2e.py +454 -0
- package/pennyfarthing_scripts/tests/test_resolve_gate_file_field.py +464 -0
- package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/skill_command.py +200 -0
- package/pennyfarthing_scripts/validate/adapters/workflow.py +64 -0
- package/pennyfarthing_scripts/validate/cli.py +15 -4
- package/packages/core/dist/benchmark/package-exports.test.d.ts.map +0 -1
- package/packages/core/dist/benchmark/package-exports.test.js.map +0 -1
- package/packages/core/dist/scripts/benchmark-integration.d.ts +0 -182
- package/packages/core/dist/scripts/benchmark-integration.d.ts.map +0 -1
- package/packages/core/dist/scripts/benchmark-integration.js +0 -691
- package/packages/core/dist/scripts/benchmark-integration.js.map +0 -1
- package/packages/core/dist/scripts/benchmark-integration.test.d.ts +0 -13
- package/packages/core/dist/scripts/benchmark-integration.test.d.ts.map +0 -1
- package/packages/core/dist/scripts/benchmark-integration.test.js +0 -680
- package/packages/core/dist/scripts/benchmark-integration.test.js.map +0 -1
- package/packages/core/dist/scripts/debugging-scenarios.test.d.ts +0 -18
- package/packages/core/dist/scripts/debugging-scenarios.test.d.ts.map +0 -1
- package/packages/core/dist/scripts/debugging-scenarios.test.js +0 -317
- package/packages/core/dist/scripts/debugging-scenarios.test.js.map +0 -1
- package/packages/core/dist/scripts/job-fair-aggregator.d.ts +0 -150
- package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +0 -1
- package/packages/core/dist/scripts/job-fair-aggregator.js +0 -547
- package/packages/core/dist/scripts/job-fair-aggregator.js.map +0 -1
- package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts +0 -14
- package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts.map +0 -1
- package/packages/core/dist/scripts/job-fair-aggregator.test.js +0 -616
- package/packages/core/dist/scripts/job-fair-aggregator.test.js.map +0 -1
- package/pennyfarthing-dist/agents/handoff.md +0 -250
- package/pennyfarthing-dist/agents/sm-handoff.md +0 -152
- package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -112
- package/pennyfarthing-dist/skills/pf-dev-patterns/SKILL.md +0 -461
- package/scripts/README.md +0 -41
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for MSSCI-15080: v11 migration automation — detect and remove old multi-package installs
|
|
3
|
+
*
|
|
4
|
+
* Story 98-22: Create migration 010 to detect and remove old multi-package
|
|
5
|
+
* installs (@pennyfarthing/shared, @pennyfarthing/cyclist, @pennyfarthing/benchmark)
|
|
6
|
+
* that were absorbed into @pennyfarthing/core in v11.
|
|
7
|
+
*
|
|
8
|
+
* Acceptance Criteria:
|
|
9
|
+
* - AC1: Migration file exists with correct exports (id, description, up, check)
|
|
10
|
+
* - AC2: check() detects old packages in node_modules/ — false if found, true if clean
|
|
11
|
+
* - AC3: up() removes old package directories from node_modules/@pennyfarthing/
|
|
12
|
+
* - AC4: up() respects ctx.dryRun — logs without deleting
|
|
13
|
+
* - AC5: up() logs removal actions via ctx.logger
|
|
14
|
+
* - AC6: check()/up() handle missing node_modules/ gracefully
|
|
15
|
+
* - AC7: Migration integrates with existing runner (auto-discovered by listMigrationFiles)
|
|
16
|
+
*
|
|
17
|
+
* Run with: cd packages/core && pnpm build && node --test dist/cli/utils/010-detect-remove-old-packages.test.js
|
|
18
|
+
*/
|
|
19
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
20
|
+
import assert from 'node:assert';
|
|
21
|
+
import { existsSync, mkdirSync, rmSync, writeFileSync, } from 'fs';
|
|
22
|
+
import { join, dirname } from 'path';
|
|
23
|
+
import { tmpdir } from 'os';
|
|
24
|
+
import { fileURLToPath } from 'url';
|
|
25
|
+
import { listMigrationFiles } from './migrations.js';
|
|
26
|
+
// Import the migration under test
|
|
27
|
+
// Migration is a plain JS file — we import its named exports
|
|
28
|
+
import { id, description, up, check, } from '../../../../../pennyfarthing-dist/migrations/010-detect-remove-old-packages.js';
|
|
29
|
+
// ─── Helpers ───────────────────────────────────────────────────────
|
|
30
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
31
|
+
const __dirname = dirname(__filename);
|
|
32
|
+
function createTestDir() {
|
|
33
|
+
const dir = join(tmpdir(), `pf-010-migration-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
34
|
+
mkdirSync(dir, { recursive: true });
|
|
35
|
+
return dir;
|
|
36
|
+
}
|
|
37
|
+
/** Create a mock logger that captures messages */
|
|
38
|
+
function createMockLogger() {
|
|
39
|
+
const messages = [];
|
|
40
|
+
return {
|
|
41
|
+
logger: {
|
|
42
|
+
info(message) { messages.push({ level: 'info', message }); },
|
|
43
|
+
warning(message) { messages.push({ level: 'warning', message }); },
|
|
44
|
+
success(message) { messages.push({ level: 'success', message }); },
|
|
45
|
+
},
|
|
46
|
+
messages,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** The three old packages that should be detected and removed */
|
|
50
|
+
const OLD_PACKAGES = [
|
|
51
|
+
'@pennyfarthing/shared',
|
|
52
|
+
'@pennyfarthing/cyclist',
|
|
53
|
+
'@pennyfarthing/benchmark',
|
|
54
|
+
];
|
|
55
|
+
/**
|
|
56
|
+
* Create fake old package directories in node_modules
|
|
57
|
+
*/
|
|
58
|
+
function createOldPackageDirs(projectRoot, packages) {
|
|
59
|
+
for (const pkg of packages) {
|
|
60
|
+
const pkgDir = join(projectRoot, 'node_modules', pkg);
|
|
61
|
+
mkdirSync(pkgDir, { recursive: true });
|
|
62
|
+
writeFileSync(join(pkgDir, 'package.json'), JSON.stringify({
|
|
63
|
+
name: pkg,
|
|
64
|
+
version: '10.0.0',
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// ─── Tests ─────────────────────────────────────────────────────────
|
|
69
|
+
describe('MSSCI-15080: v11 migration — detect and remove old multi-package installs', () => {
|
|
70
|
+
let testDir;
|
|
71
|
+
beforeEach(() => {
|
|
72
|
+
testDir = createTestDir();
|
|
73
|
+
});
|
|
74
|
+
afterEach(() => {
|
|
75
|
+
if (existsSync(testDir)) {
|
|
76
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// ─── AC1: Migration file exists with correct exports ──────────
|
|
80
|
+
describe('Migration file contract (AC1)', () => {
|
|
81
|
+
it('should export id as a string matching 010-* pattern', () => {
|
|
82
|
+
assert.strictEqual(typeof id, 'string');
|
|
83
|
+
assert.ok(id.startsWith('010-'), `Migration id should start with "010-", got "${id}"`);
|
|
84
|
+
});
|
|
85
|
+
it('should export description as a non-empty string', () => {
|
|
86
|
+
assert.strictEqual(typeof description, 'string');
|
|
87
|
+
assert.ok(description.length > 0, 'Description should not be empty');
|
|
88
|
+
});
|
|
89
|
+
it('should export up as a function', () => {
|
|
90
|
+
assert.strictEqual(typeof up, 'function');
|
|
91
|
+
});
|
|
92
|
+
it('should export check as a function', () => {
|
|
93
|
+
assert.strictEqual(typeof check, 'function');
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
// ─── AC2: check() detects old packages ─────────────────────────
|
|
97
|
+
describe('check() detection (AC2)', () => {
|
|
98
|
+
it('should return false when @pennyfarthing/shared exists in node_modules', async () => {
|
|
99
|
+
createOldPackageDirs(testDir, ['@pennyfarthing/shared']);
|
|
100
|
+
const { logger } = createMockLogger();
|
|
101
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
102
|
+
const result = await check(ctx);
|
|
103
|
+
assert.strictEqual(result, false, 'check() should return false when old packages exist');
|
|
104
|
+
});
|
|
105
|
+
it('should return false when @pennyfarthing/cyclist exists in node_modules', async () => {
|
|
106
|
+
createOldPackageDirs(testDir, ['@pennyfarthing/cyclist']);
|
|
107
|
+
const { logger } = createMockLogger();
|
|
108
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
109
|
+
const result = await check(ctx);
|
|
110
|
+
assert.strictEqual(result, false, 'check() should return false when old packages exist');
|
|
111
|
+
});
|
|
112
|
+
it('should return false when @pennyfarthing/benchmark exists in node_modules', async () => {
|
|
113
|
+
createOldPackageDirs(testDir, ['@pennyfarthing/benchmark']);
|
|
114
|
+
const { logger } = createMockLogger();
|
|
115
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
116
|
+
const result = await check(ctx);
|
|
117
|
+
assert.strictEqual(result, false, 'check() should return false when old packages exist');
|
|
118
|
+
});
|
|
119
|
+
it('should return false when multiple old packages exist', async () => {
|
|
120
|
+
createOldPackageDirs(testDir, OLD_PACKAGES);
|
|
121
|
+
const { logger } = createMockLogger();
|
|
122
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
123
|
+
const result = await check(ctx);
|
|
124
|
+
assert.strictEqual(result, false, 'check() should return false when any old packages exist');
|
|
125
|
+
});
|
|
126
|
+
it('should return true when no old packages exist in node_modules', async () => {
|
|
127
|
+
// Create node_modules with only @pennyfarthing/core (the valid package)
|
|
128
|
+
const coreDir = join(testDir, 'node_modules', '@pennyfarthing', 'core');
|
|
129
|
+
mkdirSync(coreDir, { recursive: true });
|
|
130
|
+
writeFileSync(join(coreDir, 'package.json'), '{"name":"@pennyfarthing/core"}');
|
|
131
|
+
const { logger } = createMockLogger();
|
|
132
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
133
|
+
const result = await check(ctx);
|
|
134
|
+
assert.strictEqual(result, true, 'check() should return true when no old packages exist');
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
// ─── AC3: up() removes old package directories ─────────────────
|
|
138
|
+
describe('up() removal (AC3)', () => {
|
|
139
|
+
it('should remove @pennyfarthing/shared from node_modules', async () => {
|
|
140
|
+
createOldPackageDirs(testDir, ['@pennyfarthing/shared']);
|
|
141
|
+
const { logger } = createMockLogger();
|
|
142
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
143
|
+
const result = await up(ctx);
|
|
144
|
+
assert.ok(result.success, 'up() should return success');
|
|
145
|
+
assert.strictEqual(existsSync(join(testDir, 'node_modules', '@pennyfarthing', 'shared')), false, '@pennyfarthing/shared should be removed');
|
|
146
|
+
});
|
|
147
|
+
it('should remove @pennyfarthing/cyclist from node_modules', async () => {
|
|
148
|
+
createOldPackageDirs(testDir, ['@pennyfarthing/cyclist']);
|
|
149
|
+
const { logger } = createMockLogger();
|
|
150
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
151
|
+
const result = await up(ctx);
|
|
152
|
+
assert.ok(result.success, 'up() should return success');
|
|
153
|
+
assert.strictEqual(existsSync(join(testDir, 'node_modules', '@pennyfarthing', 'cyclist')), false, '@pennyfarthing/cyclist should be removed');
|
|
154
|
+
});
|
|
155
|
+
it('should remove @pennyfarthing/benchmark from node_modules', async () => {
|
|
156
|
+
createOldPackageDirs(testDir, ['@pennyfarthing/benchmark']);
|
|
157
|
+
const { logger } = createMockLogger();
|
|
158
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
159
|
+
const result = await up(ctx);
|
|
160
|
+
assert.ok(result.success, 'up() should return success');
|
|
161
|
+
assert.strictEqual(existsSync(join(testDir, 'node_modules', '@pennyfarthing', 'benchmark')), false, '@pennyfarthing/benchmark should be removed');
|
|
162
|
+
});
|
|
163
|
+
it('should remove all three old packages when all present', async () => {
|
|
164
|
+
createOldPackageDirs(testDir, OLD_PACKAGES);
|
|
165
|
+
const { logger } = createMockLogger();
|
|
166
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
167
|
+
const result = await up(ctx);
|
|
168
|
+
assert.ok(result.success, 'up() should return success');
|
|
169
|
+
for (const pkg of OLD_PACKAGES) {
|
|
170
|
+
const pkgName = pkg.split('/')[1];
|
|
171
|
+
assert.strictEqual(existsSync(join(testDir, 'node_modules', '@pennyfarthing', pkgName)), false, `${pkg} should be removed`);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
it('should NOT remove @pennyfarthing/core', async () => {
|
|
175
|
+
// Create core alongside old packages
|
|
176
|
+
createOldPackageDirs(testDir, [...OLD_PACKAGES, '@pennyfarthing/core']);
|
|
177
|
+
const { logger } = createMockLogger();
|
|
178
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
179
|
+
await up(ctx);
|
|
180
|
+
assert.ok(existsSync(join(testDir, 'node_modules', '@pennyfarthing', 'core')), '@pennyfarthing/core should NOT be removed');
|
|
181
|
+
});
|
|
182
|
+
it('should return {success: true} result object', async () => {
|
|
183
|
+
createOldPackageDirs(testDir, OLD_PACKAGES);
|
|
184
|
+
const { logger } = createMockLogger();
|
|
185
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
186
|
+
const result = await up(ctx);
|
|
187
|
+
assert.strictEqual(typeof result, 'object');
|
|
188
|
+
assert.strictEqual(result.success, true);
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
// ─── AC4: Dry-run mode ─────────────────────────────────────────
|
|
192
|
+
describe('Dry-run mode (AC4)', () => {
|
|
193
|
+
it('should NOT delete packages in dry-run mode', async () => {
|
|
194
|
+
createOldPackageDirs(testDir, OLD_PACKAGES);
|
|
195
|
+
const { logger } = createMockLogger();
|
|
196
|
+
const ctx = { projectRoot: testDir, logger, dryRun: true };
|
|
197
|
+
const result = await up(ctx);
|
|
198
|
+
assert.ok(result.success, 'up() should still return success in dry-run');
|
|
199
|
+
for (const pkg of OLD_PACKAGES) {
|
|
200
|
+
const pkgName = pkg.split('/')[1];
|
|
201
|
+
assert.ok(existsSync(join(testDir, 'node_modules', '@pennyfarthing', pkgName)), `${pkg} should still exist in dry-run mode`);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
it('should log what would be removed in dry-run mode', async () => {
|
|
205
|
+
createOldPackageDirs(testDir, ['@pennyfarthing/shared']);
|
|
206
|
+
const { logger, messages } = createMockLogger();
|
|
207
|
+
const ctx = { projectRoot: testDir, logger, dryRun: true };
|
|
208
|
+
await up(ctx);
|
|
209
|
+
const allMessages = messages.map(m => m.message).join(' ');
|
|
210
|
+
assert.ok(allMessages.includes('shared'), 'Should log about @pennyfarthing/shared in dry-run');
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
// ─── AC5: Logging ──────────────────────────────────────────────
|
|
214
|
+
describe('Logging (AC5)', () => {
|
|
215
|
+
it('should log each package being removed', async () => {
|
|
216
|
+
createOldPackageDirs(testDir, OLD_PACKAGES);
|
|
217
|
+
const { logger, messages } = createMockLogger();
|
|
218
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
219
|
+
await up(ctx);
|
|
220
|
+
const allMessages = messages.map(m => m.message).join(' ');
|
|
221
|
+
assert.ok(allMessages.includes('shared'), 'Should log about shared');
|
|
222
|
+
assert.ok(allMessages.includes('cyclist'), 'Should log about cyclist');
|
|
223
|
+
assert.ok(allMessages.includes('benchmark'), 'Should log about benchmark');
|
|
224
|
+
});
|
|
225
|
+
it('should log when no old packages are found', async () => {
|
|
226
|
+
// Empty node_modules — nothing to remove
|
|
227
|
+
mkdirSync(join(testDir, 'node_modules', '@pennyfarthing'), { recursive: true });
|
|
228
|
+
const { logger, messages } = createMockLogger();
|
|
229
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
230
|
+
await up(ctx);
|
|
231
|
+
assert.ok(messages.length > 0, 'Should log something even when nothing to remove');
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
// ─── AC6: Missing node_modules graceful handling ───────────────
|
|
235
|
+
describe('Missing node_modules (AC6)', () => {
|
|
236
|
+
it('check() should return true when node_modules does not exist', async () => {
|
|
237
|
+
// testDir has no node_modules at all
|
|
238
|
+
const { logger } = createMockLogger();
|
|
239
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
240
|
+
const result = await check(ctx);
|
|
241
|
+
assert.strictEqual(result, true, 'check() should return true when no node_modules exists');
|
|
242
|
+
});
|
|
243
|
+
it('check() should return true when @pennyfarthing scope dir does not exist', async () => {
|
|
244
|
+
// node_modules exists but no @pennyfarthing scope
|
|
245
|
+
mkdirSync(join(testDir, 'node_modules'), { recursive: true });
|
|
246
|
+
const { logger } = createMockLogger();
|
|
247
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
248
|
+
const result = await check(ctx);
|
|
249
|
+
assert.strictEqual(result, true, 'check() should return true when no @pennyfarthing scope');
|
|
250
|
+
});
|
|
251
|
+
it('up() should return success when node_modules does not exist', async () => {
|
|
252
|
+
const { logger } = createMockLogger();
|
|
253
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
254
|
+
const result = await up(ctx);
|
|
255
|
+
assert.ok(result.success, 'up() should succeed gracefully with no node_modules');
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
// ─── AC7: Runner integration ───────────────────────────────────
|
|
259
|
+
describe('Runner integration (AC7)', () => {
|
|
260
|
+
it('should be discovered by listMigrationFiles()', () => {
|
|
261
|
+
// Point at the real migrations directory
|
|
262
|
+
const migrationsDir = join(__dirname, '..', '..', '..', '..', '..', 'pennyfarthing-dist', 'migrations');
|
|
263
|
+
const files = listMigrationFiles(migrationsDir);
|
|
264
|
+
const migration010 = files.find(f => f.includes('010-'));
|
|
265
|
+
assert.ok(migration010, 'Migration 010 should be discoverable in pennyfarthing-dist/migrations/');
|
|
266
|
+
});
|
|
267
|
+
it('should sort after 009 in migration order', () => {
|
|
268
|
+
const migrationsDir = join(__dirname, '..', '..', '..', '..', '..', 'pennyfarthing-dist', 'migrations');
|
|
269
|
+
const files = listMigrationFiles(migrationsDir);
|
|
270
|
+
const idx009 = files.findIndex(f => f.includes('009-'));
|
|
271
|
+
const idx010 = files.findIndex(f => f.includes('010-'));
|
|
272
|
+
assert.ok(idx009 >= 0, 'Migration 009 should exist');
|
|
273
|
+
assert.ok(idx010 >= 0, 'Migration 010 should exist');
|
|
274
|
+
assert.ok(idx010 > idx009, 'Migration 010 should sort after 009');
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
//# sourceMappingURL=010-detect-remove-old-packages.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"010-detect-remove-old-packages.test.js","sourceRoot":"","sources":["../../../src/cli/utils/010-detect-remove-old-packages.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,9 @@ export type CoreAgent = typeof CORE_AGENTS[number];
|
|
|
15
15
|
export declare const DIRECTORY_SYMLINKS: readonly [{
|
|
16
16
|
readonly name: "agents";
|
|
17
17
|
readonly link: ".pennyfarthing/agents";
|
|
18
|
+
}, {
|
|
19
|
+
readonly name: "gates";
|
|
20
|
+
readonly link: ".pennyfarthing/gates";
|
|
18
21
|
}, {
|
|
19
22
|
readonly name: "guides";
|
|
20
23
|
readonly link: ".pennyfarthing/guides";
|
|
@@ -38,6 +41,9 @@ export declare const DIRECTORY_SYMLINKS: readonly [{
|
|
|
38
41
|
export declare const ALL_SYMLINKS: readonly [{
|
|
39
42
|
readonly name: "agents";
|
|
40
43
|
readonly link: ".pennyfarthing/agents";
|
|
44
|
+
}, {
|
|
45
|
+
readonly name: "gates";
|
|
46
|
+
readonly link: ".pennyfarthing/gates";
|
|
41
47
|
}, {
|
|
42
48
|
readonly name: "guides";
|
|
43
49
|
readonly link: ".pennyfarthing/guides";
|
|
@@ -64,7 +70,7 @@ export declare const ALL_SYMLINKS: readonly [{
|
|
|
64
70
|
* Paths managed by Pennyfarthing (used in manifest)
|
|
65
71
|
* Commands and skills in .claude/ (for discovery), rest in .pennyfarthing/
|
|
66
72
|
*/
|
|
67
|
-
export declare const MANAGED_PATHS: readonly [".claude/commands", ".claude/skills", ".pennyfarthing/agents", ".pennyfarthing/guides", ".pennyfarthing/output-styles", ".pennyfarthing/personas", ".pennyfarthing/scripts", ".pennyfarthing/workflows"];
|
|
73
|
+
export declare const MANAGED_PATHS: readonly [".claude/commands", ".claude/skills", ".pennyfarthing/agents", ".pennyfarthing/gates", ".pennyfarthing/guides", ".pennyfarthing/output-styles", ".pennyfarthing/personas", ".pennyfarthing/scripts", ".pennyfarthing/workflows"];
|
|
68
74
|
export type SymlinkDefinition = {
|
|
69
75
|
readonly name: string;
|
|
70
76
|
readonly link: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,sHAWd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,sHAWd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAQrB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIf,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,aAAa,4OAUhB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC"}
|
|
@@ -24,6 +24,7 @@ export const CORE_AGENTS = [
|
|
|
24
24
|
*/
|
|
25
25
|
export const DIRECTORY_SYMLINKS = [
|
|
26
26
|
{ name: 'agents', link: '.pennyfarthing/agents' },
|
|
27
|
+
{ name: 'gates', link: '.pennyfarthing/gates' },
|
|
27
28
|
{ name: 'guides', link: '.pennyfarthing/guides' },
|
|
28
29
|
{ name: 'output-styles', link: '.pennyfarthing/output-styles' },
|
|
29
30
|
{ name: 'personas', link: '.pennyfarthing/personas' },
|
|
@@ -47,6 +48,7 @@ export const MANAGED_PATHS = [
|
|
|
47
48
|
'.claude/commands',
|
|
48
49
|
'.claude/skills',
|
|
49
50
|
'.pennyfarthing/agents',
|
|
51
|
+
'.pennyfarthing/gates',
|
|
50
52
|
'.pennyfarthing/guides',
|
|
51
53
|
'.pennyfarthing/output-styles',
|
|
52
54
|
'.pennyfarthing/personas',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK;IACL,KAAK;IACL,IAAI;IACJ,UAAU;IACV,WAAW;IACX,IAAI;IACJ,aAAa;IACb,aAAa;IACb,QAAQ;IACR,cAAc;CACN,CAAC;AAIX;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,8BAA8B,EAAE;IAC/D,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,yBAAyB,EAAE;IACrD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACnD,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,0BAA0B,EAAE;CAC/C,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,GAAG,kBAAkB;IACrB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE;IAC9C,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE;CAClC,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kBAAkB;IAClB,gBAAgB;IAChB,uBAAuB;IACvB,uBAAuB;IACvB,8BAA8B;IAC9B,yBAAyB;IACzB,wBAAwB;IACxB,0BAA0B;CAClB,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK;IACL,KAAK;IACL,IAAI;IACJ,UAAU;IACV,WAAW;IACX,IAAI;IACJ,aAAa;IACb,aAAa;IACb,QAAQ;IACR,cAAc;CACN,CAAC;AAIX;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE;IAC/C,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,8BAA8B,EAAE;IAC/D,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,yBAAyB,EAAE;IACrD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACnD,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,0BAA0B,EAAE;CAC/C,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,GAAG,kBAAkB;IACrB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE;IAC9C,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE;CAClC,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kBAAkB;IAClB,gBAAgB;IAChB,uBAAuB;IACvB,sBAAsB;IACtB,uBAAuB;IACvB,8BAA8B;IAC9B,yBAAyB;IACzB,wBAAwB;IACxB,0BAA0B;CAClB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 106-4: Gate file discovery — constants include gates/ symlink
|
|
3
|
+
*
|
|
4
|
+
* Verifies that DIRECTORY_SYMLINKS and MANAGED_PATHS include the gates/
|
|
5
|
+
* directory entry, ensuring init/update will create the symlink.
|
|
6
|
+
*
|
|
7
|
+
* RED phase — these tests should fail until Dev adds gates to the constants.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=constants.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.test.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/constants.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 106-4: Gate file discovery — constants include gates/ symlink
|
|
3
|
+
*
|
|
4
|
+
* Verifies that DIRECTORY_SYMLINKS and MANAGED_PATHS include the gates/
|
|
5
|
+
* directory entry, ensuring init/update will create the symlink.
|
|
6
|
+
*
|
|
7
|
+
* RED phase — these tests should fail until Dev adds gates to the constants.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it } from 'node:test';
|
|
10
|
+
import assert from 'node:assert/strict';
|
|
11
|
+
import { DIRECTORY_SYMLINKS, ALL_SYMLINKS, MANAGED_PATHS, } from './constants.js';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// AC4: gates/ symlink added to init/update following existing pattern
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
describe('106-4: DIRECTORY_SYMLINKS includes gates', () => {
|
|
16
|
+
it('has a gates entry in DIRECTORY_SYMLINKS', () => {
|
|
17
|
+
const gatesEntry = DIRECTORY_SYMLINKS.find((s) => s.name === 'gates');
|
|
18
|
+
assert.ok(gatesEntry, 'gates entry missing from DIRECTORY_SYMLINKS');
|
|
19
|
+
});
|
|
20
|
+
it('gates symlink points to .pennyfarthing/gates', () => {
|
|
21
|
+
const gatesEntry = DIRECTORY_SYMLINKS.find((s) => s.name === 'gates');
|
|
22
|
+
assert.equal(gatesEntry?.link, '.pennyfarthing/gates');
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe('106-4: ALL_SYMLINKS includes gates', () => {
|
|
26
|
+
it('has a gates entry in ALL_SYMLINKS', () => {
|
|
27
|
+
const gatesEntry = ALL_SYMLINKS.find((s) => s.name === 'gates');
|
|
28
|
+
assert.ok(gatesEntry, 'gates entry missing from ALL_SYMLINKS');
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe('106-4: MANAGED_PATHS includes gates', () => {
|
|
32
|
+
it('has .pennyfarthing/gates in MANAGED_PATHS', () => {
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
34
|
+
const found = MANAGED_PATHS.includes('.pennyfarthing/gates');
|
|
35
|
+
assert.ok(found, '.pennyfarthing/gates missing from MANAGED_PATHS');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=constants.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.test.js","sourceRoot":"","sources":["../../../src/cli/utils/constants.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,aAAa,GACd,MAAM,gBAAgB,CAAC;AAExB,8EAA8E;AAC9E,sEAAsE;AACtE,8EAA8E;AAE9E,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CACxC,CAAC,CAAiC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAC1D,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,6CAA6C,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CACxC,CAAC,CAAiC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAC1D,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,sBAAsB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAClC,CAAC,CAAiC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAC1D,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,uCAAuC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,8DAA8D;QAC9D,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,sBAA6B,CAAC,CAAC;QACpE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,iDAAiD,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consultation Protocol for Story 86-2
|
|
3
|
+
*
|
|
4
|
+
* Active request/response mechanism for tandem agent consultation.
|
|
5
|
+
* Unlike passive backseat observation (95-2), consultation is leader-initiated:
|
|
6
|
+
* the primary agent spawns a partner agent with a focused question and receives
|
|
7
|
+
* a structured recommendation.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Consultation request from leader to partner.
|
|
11
|
+
*/
|
|
12
|
+
export interface ConsultationRequest {
|
|
13
|
+
/** Leader agent name (e.g., 'dev') */
|
|
14
|
+
leader: string;
|
|
15
|
+
/** Leader character name from persona (e.g., 'Jack Torrance') */
|
|
16
|
+
leaderCharacter: string;
|
|
17
|
+
/** Partner agent name (e.g., 'architect') */
|
|
18
|
+
partner: string;
|
|
19
|
+
/** Brief background context for the question */
|
|
20
|
+
context: string;
|
|
21
|
+
/** The specific decision point / question */
|
|
22
|
+
question: string;
|
|
23
|
+
/** Alternatives the leader has already considered */
|
|
24
|
+
alternativesConsidered: string[];
|
|
25
|
+
/** Relevant code snippets or file references */
|
|
26
|
+
relevantCode: string;
|
|
27
|
+
/** Token budget from workflow tandem config */
|
|
28
|
+
tokenBudget: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Parsed consultation response from partner.
|
|
32
|
+
*/
|
|
33
|
+
export interface ConsultationResponse {
|
|
34
|
+
/** Partner's recommended approach */
|
|
35
|
+
recommendation: string;
|
|
36
|
+
/** Reasoning behind the recommendation */
|
|
37
|
+
rationale: string;
|
|
38
|
+
/** Pitfalls or edge cases to watch for */
|
|
39
|
+
watchOutFor: string;
|
|
40
|
+
/** Partner's confidence level */
|
|
41
|
+
confidence: 'high' | 'medium' | 'low';
|
|
42
|
+
/** Actual token count of the response (self-reported) */
|
|
43
|
+
tokenCount: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Validation result for request/response completeness.
|
|
47
|
+
*/
|
|
48
|
+
export interface ValidationResult {
|
|
49
|
+
valid: boolean;
|
|
50
|
+
errors: string[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Parameters for building the partner spawn prompt.
|
|
54
|
+
*/
|
|
55
|
+
export interface PartnerPromptParams {
|
|
56
|
+
/** Agent definition markdown content */
|
|
57
|
+
agentDefinition: string;
|
|
58
|
+
/** Persona block for the partner */
|
|
59
|
+
personaBlock: string;
|
|
60
|
+
/** Formatted consultation request */
|
|
61
|
+
formattedRequest: string;
|
|
62
|
+
/** Token budget instruction */
|
|
63
|
+
tokenBudget: number;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parameters for executing a full consultation.
|
|
67
|
+
*/
|
|
68
|
+
export interface ExecuteConsultationParams {
|
|
69
|
+
/** Consultation request */
|
|
70
|
+
request: ConsultationRequest;
|
|
71
|
+
/** Agent definition content for the partner */
|
|
72
|
+
agentDefinition: string;
|
|
73
|
+
/** Persona block for the partner */
|
|
74
|
+
personaBlock: string;
|
|
75
|
+
/** Adapter for spawning the partner */
|
|
76
|
+
adapter: ConsultationAdapter;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Adapter for spawning consultation partner (like ProcessAdapter for backseat).
|
|
80
|
+
* Callers inject the real Task tool implementation; tests use mocks.
|
|
81
|
+
*/
|
|
82
|
+
export interface ConsultationAdapter {
|
|
83
|
+
/** Spawn partner and return their response text */
|
|
84
|
+
spawn(params: {
|
|
85
|
+
prompt: string;
|
|
86
|
+
model: string;
|
|
87
|
+
}): Promise<{
|
|
88
|
+
responseText: string;
|
|
89
|
+
}>;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Result of a consultation execution.
|
|
93
|
+
*/
|
|
94
|
+
export interface ConsultationResult {
|
|
95
|
+
success: boolean;
|
|
96
|
+
data?: {
|
|
97
|
+
response: ConsultationResponse;
|
|
98
|
+
overBudget: boolean;
|
|
99
|
+
};
|
|
100
|
+
error?: string;
|
|
101
|
+
/** True if consultation failed and leader should continue solo */
|
|
102
|
+
degraded?: boolean;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Format a consultation request as structured markdown.
|
|
106
|
+
*/
|
|
107
|
+
export declare function formatConsultationRequest(request: ConsultationRequest): string;
|
|
108
|
+
/**
|
|
109
|
+
* Parse a consultation response from partner's markdown output.
|
|
110
|
+
* Returns null if the response cannot be parsed.
|
|
111
|
+
*/
|
|
112
|
+
export declare function parseConsultationResponse(markdown: string): ConsultationResponse | null;
|
|
113
|
+
/**
|
|
114
|
+
* Validate a consultation request has all required fields.
|
|
115
|
+
*/
|
|
116
|
+
export declare function validateConsultationRequest(request: ConsultationRequest): ValidationResult;
|
|
117
|
+
/**
|
|
118
|
+
* Validate a consultation response has all required fields.
|
|
119
|
+
*/
|
|
120
|
+
export declare function validateConsultationResponse(response: ConsultationResponse): ValidationResult;
|
|
121
|
+
/**
|
|
122
|
+
* Build the full prompt for spawning the consultation partner.
|
|
123
|
+
* Includes: agent definition, persona, formatted request, token budget instruction.
|
|
124
|
+
*/
|
|
125
|
+
export declare function buildPartnerPrompt(params: PartnerPromptParams): string;
|
|
126
|
+
/**
|
|
127
|
+
* Build spawn parameters for the consultation partner.
|
|
128
|
+
* Returns model: 'sonnet' per ADR-0012 (advisors use Sonnet, not Haiku).
|
|
129
|
+
*/
|
|
130
|
+
export declare function buildConsultationSpawnParams(request: ConsultationRequest): {
|
|
131
|
+
model: string;
|
|
132
|
+
partner: string;
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Execute a full consultation: format request → build prompt → spawn partner → parse response.
|
|
136
|
+
* On failure, returns degraded result so leader can continue solo.
|
|
137
|
+
*/
|
|
138
|
+
export declare function executeConsultation(params: ExecuteConsultationParams): Promise<ConsultationResult>;
|
|
139
|
+
//# sourceMappingURL=consultation-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consultation-protocol.d.ts","sourceRoot":"","sources":["../../src/consultation/consultation-protocol.ts"],"names":[],"mappings":"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"}
|