@pennyfarthing/core 11.2.1 → 11.3.1
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 +102 -42
- package/package.json +1 -1
- package/packages/core/dist/cli/commands/doctor-legacy.test.js +2 -2
- package/packages/core/dist/cli/commands/doctor-legacy.test.js.map +1 -1
- package/packages/core/dist/cli/commands/doctor.d.ts +55 -0
- package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/doctor.js +324 -50
- package/packages/core/dist/cli/commands/doctor.js.map +1 -1
- package/packages/core/dist/cli/commands/init.d.ts +12 -0
- package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/init.js +45 -0
- package/packages/core/dist/cli/commands/init.js.map +1 -1
- package/packages/core/dist/cli/commands/pyproject-install.test.d.ts +19 -0
- package/packages/core/dist/cli/commands/pyproject-install.test.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/pyproject-install.test.js +261 -0
- package/packages/core/dist/cli/commands/pyproject-install.test.js.map +1 -0
- package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.d.ts +17 -0
- package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.js +470 -0
- package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.js.map +1 -0
- package/packages/core/dist/cli/commands/update-consolidation.test.js +14 -6
- package/packages/core/dist/cli/commands/update-consolidation.test.js.map +1 -1
- package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/update.js +31 -2
- package/packages/core/dist/cli/commands/update.js.map +1 -1
- package/packages/core/dist/cli/index.js +2 -0
- package/packages/core/dist/cli/index.js.map +1 -1
- package/packages/core/dist/cli/utils/python.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/python.js +11 -0
- package/packages/core/dist/cli/utils/python.js.map +1 -1
- package/packages/core/dist/cli/utils/settings-hook-migration.test.d.ts +17 -0
- package/packages/core/dist/cli/utils/settings-hook-migration.test.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/settings-hook-migration.test.js +382 -0
- package/packages/core/dist/cli/utils/settings-hook-migration.test.js.map +1 -0
- package/packages/core/dist/cli/utils/settings.d.ts +0 -4
- package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/settings.js +45 -27
- package/packages/core/dist/cli/utils/settings.js.map +1 -1
- package/packages/core/dist/cli/utils/stale-artifacts.d.ts +59 -0
- package/packages/core/dist/cli/utils/stale-artifacts.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/stale-artifacts.js +163 -0
- package/packages/core/dist/cli/utils/stale-artifacts.js.map +1 -0
- 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.test.js.map +1 -1
- package/packages/core/dist/public/css/react.css +1 -1
- package/packages/core/dist/public/js/react/react.js +9 -9
- 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.map +1 -1
- package/packages/core/dist/server/server.js +3 -2
- 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 +8 -8
- 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 +18 -0
- package/packages/core/dist/server/settings.js.map +1 -1
- package/packages/core/dist/workflow/tandem-workflow-templates.test.js +7 -5
- package/packages/core/dist/workflow/tandem-workflow-templates.test.js.map +1 -1
- package/packages/core/dist/workflow/workflow-migration.test.js +6 -5
- package/packages/core/dist/workflow/workflow-migration.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 +19 -4
- package/pennyfarthing-dist/agents/devops.md +2 -10
- package/pennyfarthing-dist/agents/reviewer-preflight.md +4 -5
- package/pennyfarthing-dist/agents/reviewer.md +17 -4
- package/pennyfarthing-dist/agents/sm-finish.md +1 -1
- package/pennyfarthing-dist/agents/sm-setup.md +7 -7
- package/pennyfarthing-dist/agents/sm.md +16 -29
- 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 +10 -10
- package/pennyfarthing-dist/commands/pf-health-check.md +31 -12
- 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/{confidence-sm.md → confidence.md} +16 -17
- package/pennyfarthing-dist/gates/dev-exit.md +75 -0
- package/pennyfarthing-dist/gates/merge-ready.md +49 -0
- package/pennyfarthing-dist/gates/release-ready.md +95 -0
- package/pennyfarthing-dist/gates/reviewer-preflight-check.md +90 -0
- package/pennyfarthing-dist/gates/sm-setup-exit.md +82 -0
- package/pennyfarthing-dist/guides/agent-behavior.md +129 -20
- 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 +10 -5
- package/pennyfarthing-dist/guides/handoff-cli.md +8 -8
- package/pennyfarthing-dist/guides/hooks.md +27 -27
- 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 +1 -1
- package/pennyfarthing-dist/scripts/core/pf.sh +5 -0
- package/pennyfarthing-dist/scripts/core/phase-check-start.sh +2 -5
- 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 +3 -3
- package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/context-warning.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +5 -4
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +2 -1
- package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/session-start.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/session-stop.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +3 -4
- package/pennyfarthing-dist/scripts/lib/env.sh +34 -0
- package/pennyfarthing-dist/scripts/lib/find-root.sh +5 -0
- package/pennyfarthing-dist/scripts/lib/run-pf.sh +43 -0
- package/pennyfarthing-dist/scripts/misc/README.md +1 -1
- package/pennyfarthing-dist/scripts/misc/statusline.sh +3 -3
- 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-settings/skill.md +42 -0
- 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 +34 -19
- package/pennyfarthing-dist/templates/pyproject.toml +27 -0
- package/pennyfarthing-dist/templates/settings.local.json.template +11 -11
- package/pennyfarthing-dist/workflows/bdd-tandem.yaml +7 -3
- package/pennyfarthing-dist/workflows/bdd-team.yaml +89 -0
- package/pennyfarthing-dist/workflows/bdd.yaml +7 -3
- 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/installation-check/steps/step-01-foundation.md +77 -0
- package/pennyfarthing-dist/workflows/installation-check/steps/step-02-commands.md +82 -0
- package/pennyfarthing-dist/workflows/installation-check/steps/step-03-hooks.md +121 -0
- package/pennyfarthing-dist/workflows/installation-check/steps/step-04-scripts.md +83 -0
- package/pennyfarthing-dist/workflows/installation-check/steps/step-05-layout.md +81 -0
- package/pennyfarthing-dist/workflows/installation-check/steps/step-06-legacy.md +94 -0
- package/pennyfarthing-dist/workflows/installation-check/steps/step-07-tools.md +80 -0
- package/pennyfarthing-dist/workflows/installation-check/steps/step-08-summary.md +99 -0
- package/pennyfarthing-dist/workflows/installation-check/workflow.yaml +47 -0
- package/pennyfarthing-dist/workflows/project-setup/steps/step-01-discover.md +47 -0
- package/pennyfarthing-dist/workflows/tdd-tandem.yaml +7 -3
- package/pennyfarthing-dist/workflows/tdd-team.yaml +80 -0
- package/pennyfarthing-dist/workflows/tdd.yaml +7 -3
- package/pennyfarthing-dist/workflows/trivial.yaml +7 -3
- package/pennyfarthing_scripts/__init__.py +1 -1
- package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/context.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/context.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-311.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 +23 -2
- package/pennyfarthing_scripts/bc/focus.py +1 -0
- package/pennyfarthing_scripts/bc/split.py +52 -0
- package/pennyfarthing_scripts/bellmode_hook.py +2 -5
- package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-311.pyc +0 -0
- 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__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/cli.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-311.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 +48 -6
- package/pennyfarthing_scripts/bikerack/context_meter_footer.py +53 -3
- package/pennyfarthing_scripts/bikerack/launcher.py +6 -6
- package/pennyfarthing_scripts/bikerack/progress_panel.py +0 -1
- package/pennyfarthing_scripts/bikerack/sprint_panel.py +1 -1
- package/pennyfarthing_scripts/bikerack/story_detail_data.py +4 -1
- package/pennyfarthing_scripts/bikerack/story_detail_screen.py +2 -1
- package/pennyfarthing_scripts/bikerack/tui.py +214 -10
- package/pennyfarthing_scripts/bikerack/ws_client.py +2 -2
- package/pennyfarthing_scripts/cli.py +5 -0
- package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/config.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/output.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/pr_config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/config.py +29 -2
- package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-311.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/deadcode/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/epic/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/epic/__pycache__/cli.cpython-311.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__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-311.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/healthscore/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__init__.py +8 -3
- package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-311.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-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/statusline.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/bell_mode.py +0 -1
- package/pennyfarthing_scripts/hooks/pre_edit_check.py +0 -1
- package/pennyfarthing_scripts/hooks/reflector_check.py +1 -2
- package/pennyfarthing_scripts/hooks/schema_validation.py +0 -1
- package/pennyfarthing_scripts/hooks/session_start.py +6 -8
- package/pennyfarthing_scripts/hooks/statusline.py +10 -1
- package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/client.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/create.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/story.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/heatmap.py +3 -15
- package/pennyfarthing_scripts/session/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/session/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/settings/__init__.py +0 -0
- package/pennyfarthing_scripts/settings/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/settings/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/settings/__pycache__/settings.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/settings/cli.py +55 -0
- package/pennyfarthing_scripts/settings/settings.py +98 -0
- package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-311.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 +7 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.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/test_bikerack.py +26 -26
- package/pennyfarthing_scripts/tests/test_confidence_sm_gate.py +17 -16
- package/pennyfarthing_scripts/tests/test_dialogue_manager.py +0 -1
- package/pennyfarthing_scripts/tests/test_resolve_gate_file_field.py +45 -47
- package/pennyfarthing_scripts/tests/test_workflow_list_team.py +143 -0
- package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/team_mode.py +323 -0
- package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-311.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-311.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/cli.py +15 -14
- package/pennyfarthing_scripts/workflow/state.py +0 -1
- package/pennyfarthing_scripts/workflow/team_lifecycle.py +3 -4
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Story 117-3: Postinstall cleanup of stale pre-11.x artifacts
|
|
3
|
+
*
|
|
4
|
+
* AC1: Detects and removes stale artifacts from v8-10.x installations:
|
|
5
|
+
* - .claude/manifest.json (v8-era manifest)
|
|
6
|
+
* - .claude/personas/ directory
|
|
7
|
+
* - Non-prefixed commands (from old naming scheme)
|
|
8
|
+
* - Non-prefixed skills (from old naming scheme)
|
|
9
|
+
* AC2: Preserves user-created artifacts, only removes framework-created ones
|
|
10
|
+
* AC3: Cleanup runs during postinstall or via explicit update command
|
|
11
|
+
* AC4: Tests verify detection and removal logic
|
|
12
|
+
* AC5: No false positives on v11.x-native installations
|
|
13
|
+
*
|
|
14
|
+
* Run with: cd packages/core && npm run build && npm test
|
|
15
|
+
*/
|
|
16
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
17
|
+
import assert from 'node:assert';
|
|
18
|
+
import { existsSync, mkdirSync, writeFileSync, rmSync, symlinkSync, } from 'fs';
|
|
19
|
+
import { join } from 'path';
|
|
20
|
+
import { tmpdir } from 'os';
|
|
21
|
+
import { detectStaleArtifacts, cleanupStaleArtifacts, STALE_COMMAND_NAMES, STALE_SKILL_NAMES, } from '../utils/stale-artifacts.js';
|
|
22
|
+
// ─── Helpers ─────────────────────────────────────────────────────
|
|
23
|
+
function createTestDir() {
|
|
24
|
+
const dir = join(tmpdir(), `pf-stale-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
25
|
+
mkdirSync(dir, { recursive: true });
|
|
26
|
+
return dir;
|
|
27
|
+
}
|
|
28
|
+
/** Create a clean v11.x installation layout (no stale artifacts) */
|
|
29
|
+
function createCleanV11Layout(testDir) {
|
|
30
|
+
// .pennyfarthing/ with manifest
|
|
31
|
+
mkdirSync(join(testDir, '.pennyfarthing'), { recursive: true });
|
|
32
|
+
writeFileSync(join(testDir, '.pennyfarthing/manifest.json'), JSON.stringify({
|
|
33
|
+
version: '11.2.1',
|
|
34
|
+
installedAt: new Date().toISOString(),
|
|
35
|
+
projectName: 'test-project',
|
|
36
|
+
installationType: 'symlink',
|
|
37
|
+
}));
|
|
38
|
+
// .claude/commands with only pf-* prefixed files
|
|
39
|
+
mkdirSync(join(testDir, '.claude/commands'), { recursive: true });
|
|
40
|
+
writeFileSync(join(testDir, '.claude/commands/pf-sm.md'), '# SM command');
|
|
41
|
+
writeFileSync(join(testDir, '.claude/commands/pf-dev.md'), '# Dev command');
|
|
42
|
+
writeFileSync(join(testDir, '.claude/commands/pf-tea.md'), '# TEA command');
|
|
43
|
+
// .claude/skills with only pf-* prefixed directories
|
|
44
|
+
mkdirSync(join(testDir, '.claude/skills/pf-testing'), { recursive: true });
|
|
45
|
+
writeFileSync(join(testDir, '.claude/skills/pf-testing/index.md'), '# Testing');
|
|
46
|
+
mkdirSync(join(testDir, '.claude/skills/pf-sprint'), { recursive: true });
|
|
47
|
+
writeFileSync(join(testDir, '.claude/skills/pf-sprint/index.md'), '# Sprint');
|
|
48
|
+
}
|
|
49
|
+
/** Create a v8-era installation layout with stale artifacts */
|
|
50
|
+
function createStaleV8Layout(testDir) {
|
|
51
|
+
// First create the v11 canonical manifest
|
|
52
|
+
mkdirSync(join(testDir, '.pennyfarthing'), { recursive: true });
|
|
53
|
+
writeFileSync(join(testDir, '.pennyfarthing/manifest.json'), JSON.stringify({
|
|
54
|
+
version: '11.2.1',
|
|
55
|
+
installedAt: new Date().toISOString(),
|
|
56
|
+
projectName: 'test-project',
|
|
57
|
+
installationType: 'symlink',
|
|
58
|
+
}));
|
|
59
|
+
// Stale: .claude/manifest.json (v8-era, now redundant)
|
|
60
|
+
mkdirSync(join(testDir, '.claude'), { recursive: true });
|
|
61
|
+
writeFileSync(join(testDir, '.claude/manifest.json'), JSON.stringify({
|
|
62
|
+
version: '8.5.0',
|
|
63
|
+
installedAt: '2025-01-01T00:00:00.000Z',
|
|
64
|
+
projectName: 'test-project',
|
|
65
|
+
installationType: 'copy',
|
|
66
|
+
fileHashes: {},
|
|
67
|
+
managedPaths: ['.claude/commands', '.claude/skills'],
|
|
68
|
+
}));
|
|
69
|
+
// Stale: .claude/personas/ directory
|
|
70
|
+
mkdirSync(join(testDir, '.claude/personas'), { recursive: true });
|
|
71
|
+
writeFileSync(join(testDir, '.claude/personas/blade-runner.yaml'), 'theme: blade-runner\nagents:\n sm: Deckard\n');
|
|
72
|
+
writeFileSync(join(testDir, '.claude/personas/star-wars.yaml'), 'theme: star-wars\nagents:\n sm: Yoda\n');
|
|
73
|
+
// Stale: Non-prefixed commands (real files, not symlinks)
|
|
74
|
+
mkdirSync(join(testDir, '.claude/commands'), { recursive: true });
|
|
75
|
+
// Add some stale commands
|
|
76
|
+
writeFileSync(join(testDir, '.claude/commands/sm.md'), '# Old SM command');
|
|
77
|
+
writeFileSync(join(testDir, '.claude/commands/dev.md'), '# Old Dev command');
|
|
78
|
+
writeFileSync(join(testDir, '.claude/commands/tea.md'), '# Old TEA command');
|
|
79
|
+
writeFileSync(join(testDir, '.claude/commands/sprint.md'), '# Old Sprint command');
|
|
80
|
+
writeFileSync(join(testDir, '.claude/commands/reviewer.md'), '# Old Reviewer');
|
|
81
|
+
writeFileSync(join(testDir, '.claude/commands/architect.md'), '# Old Architect');
|
|
82
|
+
// Also add current pf-* commands (should be preserved)
|
|
83
|
+
writeFileSync(join(testDir, '.claude/commands/pf-sm.md'), '# New SM command');
|
|
84
|
+
writeFileSync(join(testDir, '.claude/commands/pf-dev.md'), '# New Dev command');
|
|
85
|
+
// Stale: Non-prefixed skills (real directories, not symlinks)
|
|
86
|
+
mkdirSync(join(testDir, '.claude/skills'), { recursive: true });
|
|
87
|
+
// Add some stale skill directories
|
|
88
|
+
mkdirSync(join(testDir, '.claude/skills/testing'), { recursive: true });
|
|
89
|
+
writeFileSync(join(testDir, '.claude/skills/testing/index.md'), '# Old Testing');
|
|
90
|
+
mkdirSync(join(testDir, '.claude/skills/sprint'), { recursive: true });
|
|
91
|
+
writeFileSync(join(testDir, '.claude/skills/sprint/index.md'), '# Old Sprint');
|
|
92
|
+
mkdirSync(join(testDir, '.claude/skills/workflow'), { recursive: true });
|
|
93
|
+
writeFileSync(join(testDir, '.claude/skills/workflow/index.md'), '# Old Workflow');
|
|
94
|
+
mkdirSync(join(testDir, '.claude/skills/jira'), { recursive: true });
|
|
95
|
+
writeFileSync(join(testDir, '.claude/skills/jira/index.md'), '# Old Jira');
|
|
96
|
+
// Also add current pf-* skills (should be preserved)
|
|
97
|
+
mkdirSync(join(testDir, '.claude/skills/pf-testing'), { recursive: true });
|
|
98
|
+
writeFileSync(join(testDir, '.claude/skills/pf-testing/index.md'), '# New Testing');
|
|
99
|
+
}
|
|
100
|
+
// ─── Test Suites ─────────────────────────────────────────────────
|
|
101
|
+
describe('Story 117-3: Stale artifact detection', () => {
|
|
102
|
+
let testDir;
|
|
103
|
+
beforeEach(() => {
|
|
104
|
+
testDir = createTestDir();
|
|
105
|
+
});
|
|
106
|
+
afterEach(() => {
|
|
107
|
+
if (existsSync(testDir)) {
|
|
108
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
// ─── AC5: No false positives on clean v11 install ─────────────
|
|
112
|
+
describe('AC5: No false positives on v11.x-native installations', () => {
|
|
113
|
+
it('should detect NO stale artifacts on clean v11.x install', () => {
|
|
114
|
+
createCleanV11Layout(testDir);
|
|
115
|
+
const stale = detectStaleArtifacts(testDir);
|
|
116
|
+
assert.strictEqual(stale.length, 0, `Should detect 0 stale artifacts on clean v11 install, got ${stale.length}: ${JSON.stringify(stale)}`);
|
|
117
|
+
});
|
|
118
|
+
it('should not flag pf-* prefixed commands as stale', () => {
|
|
119
|
+
createCleanV11Layout(testDir);
|
|
120
|
+
const stale = detectStaleArtifacts(testDir);
|
|
121
|
+
const commandStale = stale.filter(s => s.category === 'command');
|
|
122
|
+
assert.strictEqual(commandStale.length, 0, 'pf-* prefixed commands should not be flagged as stale');
|
|
123
|
+
});
|
|
124
|
+
it('should not flag pf-* prefixed skills as stale', () => {
|
|
125
|
+
createCleanV11Layout(testDir);
|
|
126
|
+
const stale = detectStaleArtifacts(testDir);
|
|
127
|
+
const skillStale = stale.filter(s => s.category === 'skill');
|
|
128
|
+
assert.strictEqual(skillStale.length, 0, 'pf-* prefixed skills should not be flagged as stale');
|
|
129
|
+
});
|
|
130
|
+
it('should not flag .pennyfarthing/manifest.json as stale', () => {
|
|
131
|
+
createCleanV11Layout(testDir);
|
|
132
|
+
const stale = detectStaleArtifacts(testDir);
|
|
133
|
+
const manifestStale = stale.filter(s => s.category === 'manifest');
|
|
134
|
+
assert.strictEqual(manifestStale.length, 0, '.pennyfarthing/manifest.json should NOT be flagged');
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
// ─── AC1: Detect stale manifest ─────────────────────────────
|
|
138
|
+
describe('AC1: Detect .claude/manifest.json', () => {
|
|
139
|
+
it('should detect .claude/manifest.json when .pennyfarthing/manifest.json exists', () => {
|
|
140
|
+
createStaleV8Layout(testDir);
|
|
141
|
+
const stale = detectStaleArtifacts(testDir);
|
|
142
|
+
const manifestStale = stale.filter(s => s.category === 'manifest');
|
|
143
|
+
assert.strictEqual(manifestStale.length, 1, 'Should detect 1 stale manifest');
|
|
144
|
+
assert.strictEqual(manifestStale[0].path, '.claude/manifest.json');
|
|
145
|
+
assert.strictEqual(manifestStale[0].type, 'file');
|
|
146
|
+
});
|
|
147
|
+
it('should NOT detect .claude/manifest.json if .pennyfarthing/manifest.json is missing', () => {
|
|
148
|
+
// Only legacy manifest exists — might be an older install, don't remove it
|
|
149
|
+
mkdirSync(join(testDir, '.claude'), { recursive: true });
|
|
150
|
+
writeFileSync(join(testDir, '.claude/manifest.json'), JSON.stringify({ version: '8.5.0' }));
|
|
151
|
+
const stale = detectStaleArtifacts(testDir);
|
|
152
|
+
const manifestStale = stale.filter(s => s.category === 'manifest');
|
|
153
|
+
assert.strictEqual(manifestStale.length, 0, 'Should NOT flag .claude/manifest.json if no .pennyfarthing/manifest.json exists');
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
// ─── AC1: Detect stale personas ──────────────────────────────
|
|
157
|
+
describe('AC1: Detect .claude/personas/ directory', () => {
|
|
158
|
+
it('should detect .claude/personas/ directory', () => {
|
|
159
|
+
createStaleV8Layout(testDir);
|
|
160
|
+
const stale = detectStaleArtifacts(testDir);
|
|
161
|
+
const personasStale = stale.filter(s => s.category === 'personas');
|
|
162
|
+
assert.strictEqual(personasStale.length, 1, 'Should detect 1 stale personas directory');
|
|
163
|
+
assert.strictEqual(personasStale[0].path, '.claude/personas');
|
|
164
|
+
assert.strictEqual(personasStale[0].type, 'directory');
|
|
165
|
+
});
|
|
166
|
+
it('should NOT detect .claude/personas if it does not exist', () => {
|
|
167
|
+
createCleanV11Layout(testDir);
|
|
168
|
+
const stale = detectStaleArtifacts(testDir);
|
|
169
|
+
const personasStale = stale.filter(s => s.category === 'personas');
|
|
170
|
+
assert.strictEqual(personasStale.length, 0, 'Should not detect personas on clean install');
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
// ─── AC1: Detect stale commands ─────────────────────────────
|
|
174
|
+
describe('AC1: Detect non-prefixed stale commands', () => {
|
|
175
|
+
it('should detect non-prefixed command files matching known stale names', () => {
|
|
176
|
+
createStaleV8Layout(testDir);
|
|
177
|
+
const stale = detectStaleArtifacts(testDir);
|
|
178
|
+
const commandStale = stale.filter(s => s.category === 'command');
|
|
179
|
+
// We added 6 stale commands in the layout
|
|
180
|
+
assert.ok(commandStale.length >= 6, `Should detect at least 6 stale commands, got ${commandStale.length}`);
|
|
181
|
+
// Verify specific known stale names
|
|
182
|
+
const staleNames = commandStale.map(s => s.path);
|
|
183
|
+
assert.ok(staleNames.some(n => n.includes('sm.md')), 'Should detect stale sm.md');
|
|
184
|
+
assert.ok(staleNames.some(n => n.includes('dev.md')), 'Should detect stale dev.md');
|
|
185
|
+
assert.ok(staleNames.some(n => n.includes('tea.md')), 'Should detect stale tea.md');
|
|
186
|
+
assert.ok(staleNames.some(n => n.includes('sprint.md')), 'Should detect stale sprint.md');
|
|
187
|
+
});
|
|
188
|
+
it('should identify all commands as file type', () => {
|
|
189
|
+
createStaleV8Layout(testDir);
|
|
190
|
+
const stale = detectStaleArtifacts(testDir);
|
|
191
|
+
const commandStale = stale.filter(s => s.category === 'command');
|
|
192
|
+
for (const item of commandStale) {
|
|
193
|
+
assert.strictEqual(item.type, 'file', `Command ${item.path} should be type 'file'`);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
it('should NOT flag symlinks to pf-* as stale (migration 007 backward-compat)', () => {
|
|
197
|
+
createCleanV11Layout(testDir);
|
|
198
|
+
// Create a backward-compat symlink (like migration 007 would)
|
|
199
|
+
const symlinkPath = join(testDir, '.claude/commands/sm.md');
|
|
200
|
+
const targetPath = 'pf-sm.md'; // relative symlink
|
|
201
|
+
try {
|
|
202
|
+
symlinkSync(targetPath, symlinkPath);
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// Skip test if symlinks not supported
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const stale = detectStaleArtifacts(testDir);
|
|
209
|
+
const smStale = stale.filter(s => s.path.includes('sm.md'));
|
|
210
|
+
assert.strictEqual(smStale.length, 0, 'Backward-compat symlinks should NOT be flagged as stale (handled by migration 009)');
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
// ─── AC1: Detect stale skills ──────────────────────────────
|
|
214
|
+
describe('AC1: Detect non-prefixed stale skills', () => {
|
|
215
|
+
it('should detect non-prefixed skill directories matching known stale names', () => {
|
|
216
|
+
createStaleV8Layout(testDir);
|
|
217
|
+
const stale = detectStaleArtifacts(testDir);
|
|
218
|
+
const skillStale = stale.filter(s => s.category === 'skill');
|
|
219
|
+
// We added 4 stale skills in the layout
|
|
220
|
+
assert.ok(skillStale.length >= 4, `Should detect at least 4 stale skills, got ${skillStale.length}`);
|
|
221
|
+
const staleNames = skillStale.map(s => s.path);
|
|
222
|
+
assert.ok(staleNames.some(n => n.includes('testing')), 'Should detect stale testing/');
|
|
223
|
+
assert.ok(staleNames.some(n => n.includes('sprint')), 'Should detect stale sprint/');
|
|
224
|
+
assert.ok(staleNames.some(n => n.includes('workflow')), 'Should detect stale workflow/');
|
|
225
|
+
assert.ok(staleNames.some(n => n.includes('jira')), 'Should detect stale jira/');
|
|
226
|
+
});
|
|
227
|
+
it('should identify all skills as directory type', () => {
|
|
228
|
+
createStaleV8Layout(testDir);
|
|
229
|
+
const stale = detectStaleArtifacts(testDir);
|
|
230
|
+
const skillStale = stale.filter(s => s.category === 'skill');
|
|
231
|
+
for (const item of skillStale) {
|
|
232
|
+
assert.strictEqual(item.type, 'directory', `Skill ${item.path} should be type 'directory'`);
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
it('should NOT flag symlinks to pf-* as stale skills', () => {
|
|
236
|
+
createCleanV11Layout(testDir);
|
|
237
|
+
// Create a backward-compat symlink for a skill
|
|
238
|
+
const symlinkPath = join(testDir, '.claude/skills/testing');
|
|
239
|
+
const targetPath = 'pf-testing';
|
|
240
|
+
try {
|
|
241
|
+
symlinkSync(targetPath, symlinkPath);
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const stale = detectStaleArtifacts(testDir);
|
|
247
|
+
const testingStale = stale.filter(s => s.path.includes('testing') && s.category === 'skill');
|
|
248
|
+
assert.strictEqual(testingStale.length, 0, 'Backward-compat symlinks should NOT be flagged as stale skills');
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
// ─── AC2: Preserve user-created artifacts ───────────────────
|
|
252
|
+
describe('AC2: Preserves user-created artifacts', () => {
|
|
253
|
+
it('should NOT flag user-created commands (non-matching names)', () => {
|
|
254
|
+
createCleanV11Layout(testDir);
|
|
255
|
+
// Add user-created commands that don't match stale names
|
|
256
|
+
writeFileSync(join(testDir, '.claude/commands/my-custom-tool.md'), '# My tool');
|
|
257
|
+
writeFileSync(join(testDir, '.claude/commands/deploy-helper.md'), '# Deploy');
|
|
258
|
+
const stale = detectStaleArtifacts(testDir);
|
|
259
|
+
const commandStale = stale.filter(s => s.category === 'command');
|
|
260
|
+
assert.strictEqual(commandStale.length, 0, 'User-created commands with non-matching names should NOT be flagged');
|
|
261
|
+
});
|
|
262
|
+
it('should NOT flag user-created skill directories (non-matching names)', () => {
|
|
263
|
+
createCleanV11Layout(testDir);
|
|
264
|
+
// Add user-created skills
|
|
265
|
+
mkdirSync(join(testDir, '.claude/skills/my-custom-skill'), { recursive: true });
|
|
266
|
+
writeFileSync(join(testDir, '.claude/skills/my-custom-skill/index.md'), '# Custom');
|
|
267
|
+
const stale = detectStaleArtifacts(testDir);
|
|
268
|
+
const skillStale = stale.filter(s => s.category === 'skill');
|
|
269
|
+
assert.strictEqual(skillStale.length, 0, 'User-created skills with non-matching names should NOT be flagged');
|
|
270
|
+
});
|
|
271
|
+
it('should preserve user commands when cleaning stale commands', () => {
|
|
272
|
+
createStaleV8Layout(testDir);
|
|
273
|
+
// Add a user-created command alongside stale ones
|
|
274
|
+
writeFileSync(join(testDir, '.claude/commands/my-deploy.md'), '# Deploy');
|
|
275
|
+
cleanupStaleArtifacts(testDir);
|
|
276
|
+
// User command should still exist
|
|
277
|
+
assert.ok(existsSync(join(testDir, '.claude/commands/my-deploy.md')), 'User-created command should be preserved after cleanup');
|
|
278
|
+
// Stale commands should be removed
|
|
279
|
+
assert.ok(!existsSync(join(testDir, '.claude/commands/sm.md')), 'Stale sm.md should be removed');
|
|
280
|
+
// pf-* commands should be preserved
|
|
281
|
+
assert.ok(existsSync(join(testDir, '.claude/commands/pf-sm.md')), 'pf-sm.md should be preserved');
|
|
282
|
+
});
|
|
283
|
+
it('should preserve user skills when cleaning stale skills', () => {
|
|
284
|
+
createStaleV8Layout(testDir);
|
|
285
|
+
// Add a user-created skill alongside stale ones
|
|
286
|
+
mkdirSync(join(testDir, '.claude/skills/my-skill'), { recursive: true });
|
|
287
|
+
writeFileSync(join(testDir, '.claude/skills/my-skill/index.md'), '# Mine');
|
|
288
|
+
cleanupStaleArtifacts(testDir);
|
|
289
|
+
// User skill should still exist
|
|
290
|
+
assert.ok(existsSync(join(testDir, '.claude/skills/my-skill')), 'User-created skill should be preserved after cleanup');
|
|
291
|
+
// Stale skills should be removed
|
|
292
|
+
assert.ok(!existsSync(join(testDir, '.claude/skills/testing')), 'Stale testing/ should be removed');
|
|
293
|
+
// pf-* skills should be preserved
|
|
294
|
+
assert.ok(existsSync(join(testDir, '.claude/skills/pf-testing')), 'pf-testing/ should be preserved');
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
describe('Story 117-3: Stale artifact cleanup', () => {
|
|
299
|
+
let testDir;
|
|
300
|
+
beforeEach(() => {
|
|
301
|
+
testDir = createTestDir();
|
|
302
|
+
});
|
|
303
|
+
afterEach(() => {
|
|
304
|
+
if (existsSync(testDir)) {
|
|
305
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
// ─── Cleanup execution ───────────────────────────────────────
|
|
309
|
+
describe('cleanupStaleArtifacts() removes stale items', () => {
|
|
310
|
+
it('should remove .claude/manifest.json', () => {
|
|
311
|
+
createStaleV8Layout(testDir);
|
|
312
|
+
const result = cleanupStaleArtifacts(testDir);
|
|
313
|
+
assert.ok(!existsSync(join(testDir, '.claude/manifest.json')), '.claude/manifest.json should be removed after cleanup');
|
|
314
|
+
const removedPaths = result.removed.map(r => r.path);
|
|
315
|
+
assert.ok(removedPaths.includes('.claude/manifest.json'), 'Removed list should include .claude/manifest.json');
|
|
316
|
+
});
|
|
317
|
+
it('should remove .claude/personas/ directory', () => {
|
|
318
|
+
createStaleV8Layout(testDir);
|
|
319
|
+
const result = cleanupStaleArtifacts(testDir);
|
|
320
|
+
assert.ok(!existsSync(join(testDir, '.claude/personas')), '.claude/personas/ should be removed after cleanup');
|
|
321
|
+
const removedPaths = result.removed.map(r => r.path);
|
|
322
|
+
assert.ok(removedPaths.includes('.claude/personas'), 'Removed list should include .claude/personas');
|
|
323
|
+
});
|
|
324
|
+
it('should remove all detected stale commands', () => {
|
|
325
|
+
createStaleV8Layout(testDir);
|
|
326
|
+
cleanupStaleArtifacts(testDir);
|
|
327
|
+
// Check that known stale commands are gone
|
|
328
|
+
const staleCommandsInLayout = ['sm.md', 'dev.md', 'tea.md', 'sprint.md', 'reviewer.md', 'architect.md'];
|
|
329
|
+
for (const cmd of staleCommandsInLayout) {
|
|
330
|
+
assert.ok(!existsSync(join(testDir, '.claude/commands', cmd)), `Stale command ${cmd} should be removed`);
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
it('should remove all detected stale skills', () => {
|
|
334
|
+
createStaleV8Layout(testDir);
|
|
335
|
+
cleanupStaleArtifacts(testDir);
|
|
336
|
+
// Check that known stale skills are gone
|
|
337
|
+
const staleSkillsInLayout = ['testing', 'sprint', 'workflow', 'jira'];
|
|
338
|
+
for (const skill of staleSkillsInLayout) {
|
|
339
|
+
assert.ok(!existsSync(join(testDir, '.claude/skills', skill)), `Stale skill ${skill}/ should be removed`);
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
it('should return accurate removed count', () => {
|
|
343
|
+
createStaleV8Layout(testDir);
|
|
344
|
+
const result = cleanupStaleArtifacts(testDir);
|
|
345
|
+
// manifest (1) + personas (1) + 6 commands + 4 skills = 12
|
|
346
|
+
assert.ok(result.removed.length >= 12, `Should remove at least 12 items, got ${result.removed.length}`);
|
|
347
|
+
});
|
|
348
|
+
it('should preserve .pennyfarthing/manifest.json', () => {
|
|
349
|
+
createStaleV8Layout(testDir);
|
|
350
|
+
cleanupStaleArtifacts(testDir);
|
|
351
|
+
assert.ok(existsSync(join(testDir, '.pennyfarthing/manifest.json')), '.pennyfarthing/manifest.json should be preserved');
|
|
352
|
+
});
|
|
353
|
+
it('should preserve pf-* commands and skills', () => {
|
|
354
|
+
createStaleV8Layout(testDir);
|
|
355
|
+
cleanupStaleArtifacts(testDir);
|
|
356
|
+
assert.ok(existsSync(join(testDir, '.claude/commands/pf-sm.md')), 'pf-sm.md should be preserved');
|
|
357
|
+
assert.ok(existsSync(join(testDir, '.claude/commands/pf-dev.md')), 'pf-dev.md should be preserved');
|
|
358
|
+
assert.ok(existsSync(join(testDir, '.claude/skills/pf-testing')), 'pf-testing/ should be preserved');
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
// ─── Dry run mode ────────────────────────────────────────────
|
|
362
|
+
describe('Dry run mode', () => {
|
|
363
|
+
it('should NOT remove anything in dry-run mode', () => {
|
|
364
|
+
createStaleV8Layout(testDir);
|
|
365
|
+
const result = cleanupStaleArtifacts(testDir, { dryRun: true });
|
|
366
|
+
// Everything should still exist
|
|
367
|
+
assert.ok(existsSync(join(testDir, '.claude/manifest.json')), '.claude/manifest.json should still exist in dry-run');
|
|
368
|
+
assert.ok(existsSync(join(testDir, '.claude/personas')), '.claude/personas/ should still exist in dry-run');
|
|
369
|
+
assert.ok(existsSync(join(testDir, '.claude/commands/sm.md')), 'Stale sm.md should still exist in dry-run');
|
|
370
|
+
assert.ok(existsSync(join(testDir, '.claude/skills/testing')), 'Stale testing/ should still exist in dry-run');
|
|
371
|
+
assert.strictEqual(result.dryRun, true, 'Result should indicate dry-run');
|
|
372
|
+
});
|
|
373
|
+
it('should still report what WOULD be removed in dry-run', () => {
|
|
374
|
+
createStaleV8Layout(testDir);
|
|
375
|
+
const result = cleanupStaleArtifacts(testDir, { dryRun: true });
|
|
376
|
+
assert.ok(result.removed.length >= 12, `Dry-run should report at least 12 items that WOULD be removed, got ${result.removed.length}`);
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
// ─── Edge cases ──────────────────────────────────────────────
|
|
380
|
+
describe('Edge cases', () => {
|
|
381
|
+
it('should handle missing .claude/ directory gracefully', () => {
|
|
382
|
+
mkdirSync(join(testDir, '.pennyfarthing'), { recursive: true });
|
|
383
|
+
writeFileSync(join(testDir, '.pennyfarthing/manifest.json'), JSON.stringify({ version: '11.2.1' }));
|
|
384
|
+
// No .claude/ directory at all
|
|
385
|
+
const stale = detectStaleArtifacts(testDir);
|
|
386
|
+
assert.strictEqual(stale.length, 0, 'Should handle missing .claude/ gracefully');
|
|
387
|
+
const result = cleanupStaleArtifacts(testDir);
|
|
388
|
+
assert.strictEqual(result.removed.length, 0, 'Should remove nothing when .claude/ is missing');
|
|
389
|
+
});
|
|
390
|
+
it('should handle missing .claude/commands/ directory gracefully', () => {
|
|
391
|
+
mkdirSync(join(testDir, '.claude'), { recursive: true });
|
|
392
|
+
mkdirSync(join(testDir, '.pennyfarthing'), { recursive: true });
|
|
393
|
+
writeFileSync(join(testDir, '.pennyfarthing/manifest.json'), JSON.stringify({ version: '11.2.1' }));
|
|
394
|
+
// No .claude/commands/ directory
|
|
395
|
+
const stale = detectStaleArtifacts(testDir);
|
|
396
|
+
const commandStale = stale.filter(s => s.category === 'command');
|
|
397
|
+
assert.strictEqual(commandStale.length, 0, 'Should handle missing commands/ gracefully');
|
|
398
|
+
});
|
|
399
|
+
it('should handle missing .claude/skills/ directory gracefully', () => {
|
|
400
|
+
mkdirSync(join(testDir, '.claude'), { recursive: true });
|
|
401
|
+
mkdirSync(join(testDir, '.pennyfarthing'), { recursive: true });
|
|
402
|
+
writeFileSync(join(testDir, '.pennyfarthing/manifest.json'), JSON.stringify({ version: '11.2.1' }));
|
|
403
|
+
// No .claude/skills/ directory
|
|
404
|
+
const stale = detectStaleArtifacts(testDir);
|
|
405
|
+
const skillStale = stale.filter(s => s.category === 'skill');
|
|
406
|
+
assert.strictEqual(skillStale.length, 0, 'Should handle missing skills/ gracefully');
|
|
407
|
+
});
|
|
408
|
+
it('should handle empty .claude/commands/ directory', () => {
|
|
409
|
+
mkdirSync(join(testDir, '.claude/commands'), { recursive: true });
|
|
410
|
+
mkdirSync(join(testDir, '.pennyfarthing'), { recursive: true });
|
|
411
|
+
const stale = detectStaleArtifacts(testDir);
|
|
412
|
+
const commandStale = stale.filter(s => s.category === 'command');
|
|
413
|
+
assert.strictEqual(commandStale.length, 0, 'Empty commands/ should produce no detections');
|
|
414
|
+
});
|
|
415
|
+
it('should handle empty .claude/skills/ directory', () => {
|
|
416
|
+
mkdirSync(join(testDir, '.claude/skills'), { recursive: true });
|
|
417
|
+
mkdirSync(join(testDir, '.pennyfarthing'), { recursive: true });
|
|
418
|
+
const stale = detectStaleArtifacts(testDir);
|
|
419
|
+
const skillStale = stale.filter(s => s.category === 'skill');
|
|
420
|
+
assert.strictEqual(skillStale.length, 0, 'Empty skills/ should produce no detections');
|
|
421
|
+
});
|
|
422
|
+
it('should handle cleanup on already-clean installation (idempotent)', () => {
|
|
423
|
+
createCleanV11Layout(testDir);
|
|
424
|
+
const result = cleanupStaleArtifacts(testDir);
|
|
425
|
+
assert.strictEqual(result.removed.length, 0, 'Should remove nothing on a clean installation');
|
|
426
|
+
// Verify nothing was damaged
|
|
427
|
+
assert.ok(existsSync(join(testDir, '.claude/commands/pf-sm.md')), 'pf-sm.md should still exist');
|
|
428
|
+
assert.ok(existsSync(join(testDir, '.claude/skills/pf-testing')), 'pf-testing/ should still exist');
|
|
429
|
+
});
|
|
430
|
+
it('should handle running cleanup twice (idempotent)', () => {
|
|
431
|
+
createStaleV8Layout(testDir);
|
|
432
|
+
const result1 = cleanupStaleArtifacts(testDir);
|
|
433
|
+
assert.ok(result1.removed.length > 0, 'First cleanup should remove items');
|
|
434
|
+
const result2 = cleanupStaleArtifacts(testDir);
|
|
435
|
+
assert.strictEqual(result2.removed.length, 0, 'Second cleanup should remove nothing (already clean)');
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
// ─── Constants validation ──────────────────────────────────
|
|
439
|
+
describe('Stale name constants', () => {
|
|
440
|
+
it('should have comprehensive stale command names list', () => {
|
|
441
|
+
// The story mentions "41 extras" — verify we have the known list
|
|
442
|
+
assert.ok(STALE_COMMAND_NAMES.length >= 40, `Should have at least 40 stale command names, got ${STALE_COMMAND_NAMES.length}`);
|
|
443
|
+
// Verify some known names are in the list
|
|
444
|
+
assert.ok(STALE_COMMAND_NAMES.includes('sm.md'), 'Should include sm.md');
|
|
445
|
+
assert.ok(STALE_COMMAND_NAMES.includes('dev.md'), 'Should include dev.md');
|
|
446
|
+
assert.ok(STALE_COMMAND_NAMES.includes('tea.md'), 'Should include tea.md');
|
|
447
|
+
assert.ok(STALE_COMMAND_NAMES.includes('sprint.md'), 'Should include sprint.md');
|
|
448
|
+
assert.ok(STALE_COMMAND_NAMES.includes('reviewer.md'), 'Should include reviewer.md');
|
|
449
|
+
assert.ok(STALE_COMMAND_NAMES.includes('workflow.md'), 'Should include workflow.md');
|
|
450
|
+
});
|
|
451
|
+
it('should have comprehensive stale skill names list', () => {
|
|
452
|
+
// The story mentions "22 extras" — we have the 20 known renamed skills
|
|
453
|
+
assert.ok(STALE_SKILL_NAMES.length >= 20, `Should have at least 20 stale skill names, got ${STALE_SKILL_NAMES.length}`);
|
|
454
|
+
// Verify some known names
|
|
455
|
+
assert.ok(STALE_SKILL_NAMES.includes('testing'), 'Should include testing');
|
|
456
|
+
assert.ok(STALE_SKILL_NAMES.includes('sprint'), 'Should include sprint');
|
|
457
|
+
assert.ok(STALE_SKILL_NAMES.includes('workflow'), 'Should include workflow');
|
|
458
|
+
assert.ok(STALE_SKILL_NAMES.includes('jira'), 'Should include jira');
|
|
459
|
+
});
|
|
460
|
+
it('should NOT include pf-* prefixed names in stale lists', () => {
|
|
461
|
+
for (const name of STALE_COMMAND_NAMES) {
|
|
462
|
+
assert.ok(!name.startsWith('pf-'), `Stale command list should not include pf-prefixed: ${name}`);
|
|
463
|
+
}
|
|
464
|
+
for (const name of STALE_SKILL_NAMES) {
|
|
465
|
+
assert.ok(!name.startsWith('pf-'), `Stale skill list should not include pf-prefixed: ${name}`);
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
});
|
|
469
|
+
});
|
|
470
|
+
//# sourceMappingURL=stale-artifacts-cleanup.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stale-artifacts-cleanup.test.js","sourceRoot":"","sources":["../../../src/cli/commands/stale-artifacts-cleanup.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,11 +57,15 @@ function createLegacyLayout(dir) {
|
|
|
57
57
|
'.claude/scripts',
|
|
58
58
|
],
|
|
59
59
|
});
|
|
60
|
-
// Legacy directories in .claude/ (
|
|
60
|
+
// Legacy directories in .claude/ as symlinks (realistic — old installs used symlinks)
|
|
61
|
+
// Create targets first, then symlink from .claude/
|
|
62
|
+
const legacyTargetDir = join(dir, '.legacy-targets');
|
|
63
|
+
mkdirSync(legacyTargetDir, { recursive: true });
|
|
61
64
|
for (const name of ['agents', 'guides', 'personas', 'scripts']) {
|
|
62
|
-
const
|
|
63
|
-
mkdirSync(
|
|
64
|
-
writeFileSync(join(
|
|
65
|
+
const targetDir = join(legacyTargetDir, name);
|
|
66
|
+
mkdirSync(targetDir, { recursive: true });
|
|
67
|
+
writeFileSync(join(targetDir, 'placeholder.md'), `# ${name}\n`);
|
|
68
|
+
symlinkSync(targetDir, join(dir, '.claude', name));
|
|
65
69
|
}
|
|
66
70
|
// Legacy template files in .claude/project/
|
|
67
71
|
mkdirSync(join(dir, '.claude/project/docs'), { recursive: true });
|
|
@@ -163,10 +167,14 @@ describe('MSSCI-14371: Update command file migration', () => {
|
|
|
163
167
|
// Simulate old state: .pennyfarthing/agents is a copied directory
|
|
164
168
|
mkdirSync(join(testDir, '.pennyfarthing/agents'), { recursive: true });
|
|
165
169
|
writeFileSync(join(testDir, '.pennyfarthing/agents/dev.md'), '# old copy\n');
|
|
166
|
-
//
|
|
170
|
+
// Real update flow clears the copied dir before symlinking.
|
|
171
|
+
// removeSymlinkOrDirectory refuses non-empty dirs (safety check),
|
|
172
|
+
// so the update command removes contents first.
|
|
173
|
+
const destPath = join(testDir, '.pennyfarthing/agents');
|
|
174
|
+
rmSync(destPath, { recursive: true, force: true });
|
|
175
|
+
// createDirectorySymlink creates symlink at now-cleared path
|
|
167
176
|
const { createDirectorySymlink } = await import('../utils/symlinks.js');
|
|
168
177
|
const sourcePath = join(nodeModulesPath, 'agents');
|
|
169
|
-
const destPath = join(testDir, '.pennyfarthing/agents');
|
|
170
178
|
const result = createDirectorySymlink(sourcePath, destPath);
|
|
171
179
|
assert.ok(result, 'createDirectorySymlink should succeed');
|
|
172
180
|
assert.ok(lstatSync(destPath).isSymbolicLink(), '.pennyfarthing/agents should be a symlink after replacement');
|