@pennyfarthing/core 10.3.0 → 10.4.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 +3 -3
- package/package.json +14 -16
- package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/init.js +3 -0
- package/packages/core/dist/cli/commands/init.js.map +1 -1
- package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/update.js +62 -122
- package/packages/core/dist/cli/commands/update.js.map +1 -1
- package/packages/core/dist/cli/commands/version-sentinel.test.d.ts +18 -0
- package/packages/core/dist/cli/commands/version-sentinel.test.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/version-sentinel.test.js +120 -0
- package/packages/core/dist/cli/commands/version-sentinel.test.js.map +1 -0
- package/packages/core/dist/cli/utils/manifest.d.ts +1 -0
- package/packages/core/dist/cli/utils/manifest.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/manifest.js.map +1 -1
- package/packages/core/dist/cli/utils/migrations.d.ts +88 -0
- package/packages/core/dist/cli/utils/migrations.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/migrations.js +105 -0
- package/packages/core/dist/cli/utils/migrations.js.map +1 -0
- package/packages/core/dist/cli/utils/migrations.test.d.ts +23 -0
- package/packages/core/dist/cli/utils/migrations.test.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/migrations.test.js +319 -0
- package/packages/core/dist/cli/utils/migrations.test.js.map +1 -0
- package/packages/core/dist/cli/utils/version-sentinel.d.ts +32 -0
- package/packages/core/dist/cli/utils/version-sentinel.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/version-sentinel.js +49 -0
- package/packages/core/dist/cli/utils/version-sentinel.js.map +1 -0
- package/packages/core/dist/scripts/generate-spider-report.d.ts.map +1 -1
- package/packages/core/dist/scripts/generate-spider-report.js +2 -0
- package/packages/core/dist/scripts/generate-spider-report.js.map +1 -1
- package/packages/core/dist/scripts/generate-spider.d.ts.map +1 -1
- package/packages/core/dist/scripts/generate-spider.js +1 -0
- package/packages/core/dist/scripts/generate-spider.js.map +1 -1
- package/packages/core/dist/workflow/context-watch.d.ts +81 -0
- package/packages/core/dist/workflow/context-watch.d.ts.map +1 -0
- package/packages/core/dist/workflow/context-watch.js +236 -0
- package/packages/core/dist/workflow/context-watch.js.map +1 -0
- package/packages/core/dist/workflow/context-watch.test.d.ts +2 -0
- package/packages/core/dist/workflow/context-watch.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/context-watch.test.js +747 -0
- package/packages/core/dist/workflow/context-watch.test.js.map +1 -0
- package/pennyfarthing-dist/agents/dev.md +47 -0
- package/pennyfarthing-dist/personas/themes/fifth-element.yaml +0 -1
- 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/handoff-marker.sh +0 -0
- package/pennyfarthing-dist/scripts/core/phase-check-start.sh +0 -0
- 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/otel-auto-config.sh +0 -0
- 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 +2 -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.sh +0 -0
- 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/story/scripts/create-story.sh +0 -0
- package/pennyfarthing-dist/skills/story/scripts/size-story.sh +0 -0
- package/pennyfarthing-dist/skills/story/scripts/story-template.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/list-workflows.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/resume-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/show-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/start-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/workflow-status.sh +0 -0
- package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/create.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/version_sentinel.py +104 -0
- package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
- 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__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/status.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__/validator.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/archive_epic.py +9 -1
- package/pennyfarthing_scripts/tests/__pycache__/conftest.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/test_version_sentinel.py +126 -0
- package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
- package/scripts/README.md +0 -41
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-sentinel.test.js","sourceRoot":"","sources":["../../../src/cli/commands/version-sentinel.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/manifest.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,SAAS,GAAG,MAAM,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAKD;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAmBjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,IAAI,CAaN;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IACP,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA,QAAQ,CAyBV;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,QAAQ,CAQV;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGtE"}
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/manifest.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,SAAS,GAAG,MAAM,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAKD;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAmBjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,IAAI,CAaN;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IACP,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA,QAAQ,CAyBV;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,QAAQ,CAQV;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGtE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/cli/utils/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,OAAO,MAAM,UAAU,CAAC;AAE/B,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/cli/utils/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Versioned migration runner for MSSCI-14699.
|
|
3
|
+
*
|
|
4
|
+
* Manages numbered migration files in pennyfarthing-dist/migrations/.
|
|
5
|
+
* Each migration exports {id, description, up(), down?(), check()}.
|
|
6
|
+
* The runner scans for pending migrations, executes in order, and
|
|
7
|
+
* tracks applied IDs in manifest.migrationsRun.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Context provided to each migration's up/down/check functions.
|
|
11
|
+
*/
|
|
12
|
+
export interface MigrationContext {
|
|
13
|
+
projectRoot: string;
|
|
14
|
+
logger: {
|
|
15
|
+
info(message: string): void;
|
|
16
|
+
warning(message: string): void;
|
|
17
|
+
success(message: string): void;
|
|
18
|
+
};
|
|
19
|
+
dryRun: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Result returned by a migration's up() or down() function.
|
|
23
|
+
*/
|
|
24
|
+
export interface MigrationResult {
|
|
25
|
+
success: boolean;
|
|
26
|
+
error?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A single migration definition.
|
|
30
|
+
*/
|
|
31
|
+
export interface Migration {
|
|
32
|
+
id: string;
|
|
33
|
+
description: string;
|
|
34
|
+
up(ctx: MigrationContext): Promise<MigrationResult>;
|
|
35
|
+
down?(ctx: MigrationContext): Promise<MigrationResult>;
|
|
36
|
+
check(ctx: MigrationContext): Promise<boolean>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Result of running all pending migrations.
|
|
40
|
+
*/
|
|
41
|
+
export interface RunMigrationsResult {
|
|
42
|
+
success: boolean;
|
|
43
|
+
applied: string[];
|
|
44
|
+
skipped: string[];
|
|
45
|
+
failed?: {
|
|
46
|
+
id: string;
|
|
47
|
+
error: string;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* List migration files from a directory, sorted by numeric prefix.
|
|
52
|
+
*
|
|
53
|
+
* Only includes .js files matching the pattern NNN-name.js.
|
|
54
|
+
*
|
|
55
|
+
* @param migrationsDir - Directory containing migration files
|
|
56
|
+
* @returns Sorted list of migration file paths
|
|
57
|
+
*/
|
|
58
|
+
export declare function listMigrationFiles(migrationsDir: string): string[];
|
|
59
|
+
/**
|
|
60
|
+
* Filter migrations to only those not yet applied.
|
|
61
|
+
*
|
|
62
|
+
* @param migrations - All discovered migrations
|
|
63
|
+
* @param appliedIds - IDs already recorded in manifest.migrationsRun
|
|
64
|
+
* @returns Migrations that haven't been applied yet
|
|
65
|
+
*/
|
|
66
|
+
export declare function getPendingMigrations(migrations: Migration[], appliedIds: string[]): Migration[];
|
|
67
|
+
/**
|
|
68
|
+
* Run pending migrations in order, updating the applied set.
|
|
69
|
+
*
|
|
70
|
+
* For each pending migration:
|
|
71
|
+
* 1. Call check() — if true, skip (already applied via other means)
|
|
72
|
+
* 2. Call up(ctx) — execute the migration
|
|
73
|
+
* 3. On success, add ID to applied set
|
|
74
|
+
* 4. On failure, stop and report
|
|
75
|
+
*
|
|
76
|
+
* In dry-run mode, log what would run without executing.
|
|
77
|
+
*
|
|
78
|
+
* @param migrations - Pending migrations to run (already filtered and sorted)
|
|
79
|
+
* @param projectRoot - Project root directory
|
|
80
|
+
* @param appliedIds - Already-applied migration IDs (mutated on success)
|
|
81
|
+
* @param options - Options including dryRun and logger
|
|
82
|
+
* @returns Result with applied/skipped IDs
|
|
83
|
+
*/
|
|
84
|
+
export declare function runMigrations(migrations: Migration[], projectRoot: string, appliedIds: string[], options?: {
|
|
85
|
+
dryRun?: boolean;
|
|
86
|
+
logger?: MigrationContext['logger'];
|
|
87
|
+
}): Promise<RunMigrationsResult>;
|
|
88
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACN,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC/B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KAChC,CAAC;IACF,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACpD,IAAI,CAAC,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACvD,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACxC;AAID;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAUlE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,SAAS,EAAE,EACvB,UAAU,EAAE,MAAM,EAAE,GACnB,SAAS,EAAE,CAGb;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,SAAS,EAAE,EACvB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;CACrC,GACA,OAAO,CAAC,mBAAmB,CAAC,CAsD9B"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Versioned migration runner for MSSCI-14699.
|
|
3
|
+
*
|
|
4
|
+
* Manages numbered migration files in pennyfarthing-dist/migrations/.
|
|
5
|
+
* Each migration exports {id, description, up(), down?(), check()}.
|
|
6
|
+
* The runner scans for pending migrations, executes in order, and
|
|
7
|
+
* tracks applied IDs in manifest.migrationsRun.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readdirSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
// ─── Functions ─────────────────────────────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* List migration files from a directory, sorted by numeric prefix.
|
|
14
|
+
*
|
|
15
|
+
* Only includes .js files matching the pattern NNN-name.js.
|
|
16
|
+
*
|
|
17
|
+
* @param migrationsDir - Directory containing migration files
|
|
18
|
+
* @returns Sorted list of migration file paths
|
|
19
|
+
*/
|
|
20
|
+
export function listMigrationFiles(migrationsDir) {
|
|
21
|
+
if (!existsSync(migrationsDir)) {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
const files = readdirSync(migrationsDir)
|
|
25
|
+
.filter((f) => /^\d{3,}-.*\.js$/.test(f))
|
|
26
|
+
.sort();
|
|
27
|
+
return files.map((f) => join(migrationsDir, f));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Filter migrations to only those not yet applied.
|
|
31
|
+
*
|
|
32
|
+
* @param migrations - All discovered migrations
|
|
33
|
+
* @param appliedIds - IDs already recorded in manifest.migrationsRun
|
|
34
|
+
* @returns Migrations that haven't been applied yet
|
|
35
|
+
*/
|
|
36
|
+
export function getPendingMigrations(migrations, appliedIds) {
|
|
37
|
+
const applied = new Set(appliedIds);
|
|
38
|
+
return migrations.filter((m) => !applied.has(m.id));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Run pending migrations in order, updating the applied set.
|
|
42
|
+
*
|
|
43
|
+
* For each pending migration:
|
|
44
|
+
* 1. Call check() — if true, skip (already applied via other means)
|
|
45
|
+
* 2. Call up(ctx) — execute the migration
|
|
46
|
+
* 3. On success, add ID to applied set
|
|
47
|
+
* 4. On failure, stop and report
|
|
48
|
+
*
|
|
49
|
+
* In dry-run mode, log what would run without executing.
|
|
50
|
+
*
|
|
51
|
+
* @param migrations - Pending migrations to run (already filtered and sorted)
|
|
52
|
+
* @param projectRoot - Project root directory
|
|
53
|
+
* @param appliedIds - Already-applied migration IDs (mutated on success)
|
|
54
|
+
* @param options - Options including dryRun and logger
|
|
55
|
+
* @returns Result with applied/skipped IDs
|
|
56
|
+
*/
|
|
57
|
+
export async function runMigrations(migrations, projectRoot, appliedIds, options) {
|
|
58
|
+
const dryRun = options?.dryRun ?? false;
|
|
59
|
+
const logger = options?.logger ?? {
|
|
60
|
+
info() { },
|
|
61
|
+
warning() { },
|
|
62
|
+
success() { },
|
|
63
|
+
};
|
|
64
|
+
// Sort by numeric prefix for deterministic order
|
|
65
|
+
const sorted = [...migrations].sort((a, b) => a.id.localeCompare(b.id));
|
|
66
|
+
const applied = [];
|
|
67
|
+
const skipped = [];
|
|
68
|
+
const ctx = { projectRoot, logger, dryRun };
|
|
69
|
+
for (const migration of sorted) {
|
|
70
|
+
try {
|
|
71
|
+
// Idempotency check
|
|
72
|
+
const alreadyApplied = await migration.check(ctx);
|
|
73
|
+
if (alreadyApplied) {
|
|
74
|
+
skipped.push(migration.id);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
// Dry-run: log but don't execute
|
|
78
|
+
if (dryRun) {
|
|
79
|
+
logger.info(`[dry-run] Would run migration: ${migration.id} — ${migration.description}`);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
// Execute migration
|
|
83
|
+
const result = await migration.up(ctx);
|
|
84
|
+
if (!result.success) {
|
|
85
|
+
return {
|
|
86
|
+
success: false,
|
|
87
|
+
applied,
|
|
88
|
+
skipped,
|
|
89
|
+
failed: { id: migration.id, error: result.error ?? 'Unknown error' },
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
applied.push(migration.id);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return {
|
|
96
|
+
success: false,
|
|
97
|
+
applied,
|
|
98
|
+
skipped,
|
|
99
|
+
failed: { id: migration.id, error: `Migration threw: ${err}` },
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return { success: true, applied, skipped };
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/cli/utils/migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AA8C5B,sEAAsE;AAEtE;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,aAAqB;IACtD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,CAAC;SACrC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACxC,IAAI,EAAE,CAAC;IAEV,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAuB,EACvB,UAAoB;IAEpB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACpC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAuB,EACvB,WAAmB,EACnB,UAAoB,EACpB,OAGC;IAED,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,KAAK,CAAC;IACxC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI;QAChC,IAAI,KAAI,CAAC;QACT,OAAO,KAAI,CAAC;QACZ,OAAO,KAAI,CAAC;KACb,CAAC;IAEF,iDAAiD;IACjD,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAExE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,GAAG,GAAqB,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAE9D,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,oBAAoB;YACpB,MAAM,cAAc,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClD,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBAC3B,SAAS;YACX,CAAC;YAED,iCAAiC;YACjC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,CAAC,kCAAkC,SAAS,CAAC,EAAE,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;gBACzF,SAAS;YACX,CAAC;YAED,oBAAoB;YACpB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO;oBACP,OAAO;oBACP,MAAM,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,eAAe,EAAE;iBACrE,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO;gBACP,OAAO;gBACP,MAAM,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,oBAAoB,GAAG,EAAE,EAAE;aAC/D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for MSSCI-14699: Versioned migration runner infrastructure
|
|
3
|
+
*
|
|
4
|
+
* Story 98-2: Create pennyfarthing-dist/migrations/ with numbered migration
|
|
5
|
+
* files. Each exports {id, description, up(), down?(), check()}. Runner scans
|
|
6
|
+
* for pending, executes in order, tracks in manifest.migrationsRun.
|
|
7
|
+
*
|
|
8
|
+
* Acceptance Criteria:
|
|
9
|
+
* - AC1: pennyfarthing-dist/migrations/ directory with migration file convention
|
|
10
|
+
* - AC2: Migration file exports: {id, description, up(ctx), down?(ctx), check(ctx)}
|
|
11
|
+
* - AC3: Runner scans for pending migrations (not in manifest.migrationsRun)
|
|
12
|
+
* - AC4: Runner executes pending migrations in numeric order
|
|
13
|
+
* - AC5: manifest.json updated with migrationsRun: string[]
|
|
14
|
+
* - AC6: check() verifies if migration already applied (idempotency)
|
|
15
|
+
* - AC7: Migration context provides projectRoot, logger, dryRun
|
|
16
|
+
* - AC8: At least one example migration file
|
|
17
|
+
* - AC9: pennyfarthing update calls migration runner after content update
|
|
18
|
+
* - AC10: Dry-run mode skips execution but logs what would run
|
|
19
|
+
*
|
|
20
|
+
* Run with: cd packages/core && pnpm build && pnpm test
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=migrations.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.test.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/migrations.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for MSSCI-14699: Versioned migration runner infrastructure
|
|
3
|
+
*
|
|
4
|
+
* Story 98-2: Create pennyfarthing-dist/migrations/ with numbered migration
|
|
5
|
+
* files. Each exports {id, description, up(), down?(), check()}. Runner scans
|
|
6
|
+
* for pending, executes in order, tracks in manifest.migrationsRun.
|
|
7
|
+
*
|
|
8
|
+
* Acceptance Criteria:
|
|
9
|
+
* - AC1: pennyfarthing-dist/migrations/ directory with migration file convention
|
|
10
|
+
* - AC2: Migration file exports: {id, description, up(ctx), down?(ctx), check(ctx)}
|
|
11
|
+
* - AC3: Runner scans for pending migrations (not in manifest.migrationsRun)
|
|
12
|
+
* - AC4: Runner executes pending migrations in numeric order
|
|
13
|
+
* - AC5: manifest.json updated with migrationsRun: string[]
|
|
14
|
+
* - AC6: check() verifies if migration already applied (idempotency)
|
|
15
|
+
* - AC7: Migration context provides projectRoot, logger, dryRun
|
|
16
|
+
* - AC8: At least one example migration file
|
|
17
|
+
* - AC9: pennyfarthing update calls migration runner after content update
|
|
18
|
+
* - AC10: Dry-run mode skips execution but logs what would run
|
|
19
|
+
*
|
|
20
|
+
* Run with: cd packages/core && pnpm build && pnpm test
|
|
21
|
+
*/
|
|
22
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
23
|
+
import assert from 'node:assert';
|
|
24
|
+
import { existsSync, mkdirSync, rmSync, writeFileSync, } from 'fs';
|
|
25
|
+
import { join } from 'path';
|
|
26
|
+
import { tmpdir } from 'os';
|
|
27
|
+
import { listMigrationFiles, getPendingMigrations, runMigrations, } from './migrations.js';
|
|
28
|
+
// ─── Helpers ───────────────────────────────────────────────────────
|
|
29
|
+
function createTestDir() {
|
|
30
|
+
const dir = join(tmpdir(), `pf-migrations-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
31
|
+
mkdirSync(dir, { recursive: true });
|
|
32
|
+
return dir;
|
|
33
|
+
}
|
|
34
|
+
/** Create a mock migration object for testing */
|
|
35
|
+
function createMockMigration(id, overrides) {
|
|
36
|
+
return {
|
|
37
|
+
id,
|
|
38
|
+
description: overrides?.description ?? `Migration ${id}`,
|
|
39
|
+
async up(ctx) {
|
|
40
|
+
overrides?.onUp?.(ctx);
|
|
41
|
+
return overrides?.upResult ?? { success: true };
|
|
42
|
+
},
|
|
43
|
+
async check(ctx) {
|
|
44
|
+
overrides?.onCheck?.(ctx);
|
|
45
|
+
return overrides?.checkResult ?? false;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Create a mock logger that captures messages */
|
|
50
|
+
function createMockLogger() {
|
|
51
|
+
const messages = [];
|
|
52
|
+
return {
|
|
53
|
+
logger: {
|
|
54
|
+
info(message) { messages.push({ level: 'info', message }); },
|
|
55
|
+
warning(message) { messages.push({ level: 'warning', message }); },
|
|
56
|
+
success(message) { messages.push({ level: 'success', message }); },
|
|
57
|
+
},
|
|
58
|
+
messages,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// ─── Tests ─────────────────────────────────────────────────────────
|
|
62
|
+
describe('MSSCI-14699: Versioned migration runner', () => {
|
|
63
|
+
let testDir;
|
|
64
|
+
beforeEach(() => {
|
|
65
|
+
testDir = createTestDir();
|
|
66
|
+
});
|
|
67
|
+
afterEach(() => {
|
|
68
|
+
if (existsSync(testDir)) {
|
|
69
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
// ─── AC1: Migration file convention ────────────────────────────
|
|
73
|
+
describe('listMigrationFiles (AC1)', () => {
|
|
74
|
+
it('should list .js files from migrations directory sorted by numeric prefix', () => {
|
|
75
|
+
const migrationsDir = join(testDir, 'migrations');
|
|
76
|
+
mkdirSync(migrationsDir, { recursive: true });
|
|
77
|
+
// Create migration files out of order
|
|
78
|
+
writeFileSync(join(migrationsDir, '003-third.js'), 'export default {}');
|
|
79
|
+
writeFileSync(join(migrationsDir, '001-first.js'), 'export default {}');
|
|
80
|
+
writeFileSync(join(migrationsDir, '002-second.js'), 'export default {}');
|
|
81
|
+
const files = listMigrationFiles(migrationsDir);
|
|
82
|
+
assert.strictEqual(files.length, 3);
|
|
83
|
+
assert.ok(files[0].endsWith('001-first.js'), 'First file should be 001');
|
|
84
|
+
assert.ok(files[1].endsWith('002-second.js'), 'Second file should be 002');
|
|
85
|
+
assert.ok(files[2].endsWith('003-third.js'), 'Third file should be 003');
|
|
86
|
+
});
|
|
87
|
+
it('should ignore non-JS files in migrations directory', () => {
|
|
88
|
+
const migrationsDir = join(testDir, 'migrations');
|
|
89
|
+
mkdirSync(migrationsDir, { recursive: true });
|
|
90
|
+
writeFileSync(join(migrationsDir, '001-first.js'), 'export default {}');
|
|
91
|
+
writeFileSync(join(migrationsDir, 'README.md'), '# Migrations');
|
|
92
|
+
writeFileSync(join(migrationsDir, '.gitkeep'), '');
|
|
93
|
+
writeFileSync(join(migrationsDir, '002-second.ts'), 'export default {}');
|
|
94
|
+
const files = listMigrationFiles(migrationsDir);
|
|
95
|
+
assert.strictEqual(files.length, 1, 'Should only list .js files');
|
|
96
|
+
assert.ok(files[0].endsWith('001-first.js'));
|
|
97
|
+
});
|
|
98
|
+
it('should return empty array for non-existent directory', () => {
|
|
99
|
+
const files = listMigrationFiles(join(testDir, 'no-such-dir'));
|
|
100
|
+
assert.deepStrictEqual(files, []);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
// ─── AC2: Migration file exports ──────────────────────────────
|
|
104
|
+
describe('Migration type contract (AC2)', () => {
|
|
105
|
+
it('should accept migration with required fields: id, description, up, check', () => {
|
|
106
|
+
const migration = createMockMigration('001-test');
|
|
107
|
+
assert.strictEqual(typeof migration.id, 'string');
|
|
108
|
+
assert.strictEqual(typeof migration.description, 'string');
|
|
109
|
+
assert.strictEqual(typeof migration.up, 'function');
|
|
110
|
+
assert.strictEqual(typeof migration.check, 'function');
|
|
111
|
+
});
|
|
112
|
+
it('should accept migration with optional down()', () => {
|
|
113
|
+
const migration = {
|
|
114
|
+
...createMockMigration('001-test'),
|
|
115
|
+
async down(_ctx) {
|
|
116
|
+
return { success: true };
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
assert.strictEqual(typeof migration.down, 'function');
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
// ─── AC3: Scan for pending migrations ─────────────────────────
|
|
123
|
+
describe('getPendingMigrations (AC3)', () => {
|
|
124
|
+
it('should return migrations not in appliedIds', () => {
|
|
125
|
+
const migrations = [
|
|
126
|
+
createMockMigration('001-first'),
|
|
127
|
+
createMockMigration('002-second'),
|
|
128
|
+
createMockMigration('003-third'),
|
|
129
|
+
];
|
|
130
|
+
const appliedIds = ['001-first'];
|
|
131
|
+
const pending = getPendingMigrations(migrations, appliedIds);
|
|
132
|
+
assert.strictEqual(pending.length, 2);
|
|
133
|
+
assert.strictEqual(pending[0].id, '002-second');
|
|
134
|
+
assert.strictEqual(pending[1].id, '003-third');
|
|
135
|
+
});
|
|
136
|
+
it('should return empty array when all migrations applied', () => {
|
|
137
|
+
const migrations = [
|
|
138
|
+
createMockMigration('001-first'),
|
|
139
|
+
createMockMigration('002-second'),
|
|
140
|
+
];
|
|
141
|
+
const appliedIds = ['001-first', '002-second'];
|
|
142
|
+
const pending = getPendingMigrations(migrations, appliedIds);
|
|
143
|
+
assert.strictEqual(pending.length, 0);
|
|
144
|
+
});
|
|
145
|
+
it('should return all migrations when appliedIds is empty', () => {
|
|
146
|
+
const migrations = [
|
|
147
|
+
createMockMigration('001-first'),
|
|
148
|
+
createMockMigration('002-second'),
|
|
149
|
+
];
|
|
150
|
+
const pending = getPendingMigrations(migrations, []);
|
|
151
|
+
assert.strictEqual(pending.length, 2);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
// ─── AC4: Numeric order execution ─────────────────────────────
|
|
155
|
+
describe('Migration ordering (AC4)', () => {
|
|
156
|
+
it('should execute migrations in numeric prefix order', async () => {
|
|
157
|
+
const executionOrder = [];
|
|
158
|
+
const migrations = [
|
|
159
|
+
createMockMigration('003-third', {
|
|
160
|
+
onUp: () => executionOrder.push('003'),
|
|
161
|
+
}),
|
|
162
|
+
createMockMigration('001-first', {
|
|
163
|
+
onUp: () => executionOrder.push('001'),
|
|
164
|
+
}),
|
|
165
|
+
createMockMigration('002-second', {
|
|
166
|
+
onUp: () => executionOrder.push('002'),
|
|
167
|
+
}),
|
|
168
|
+
];
|
|
169
|
+
// getPendingMigrations should maintain order, but runMigrations
|
|
170
|
+
// should sort by numeric prefix regardless of input order
|
|
171
|
+
const { logger } = createMockLogger();
|
|
172
|
+
await runMigrations(migrations, testDir, [], { logger });
|
|
173
|
+
assert.deepStrictEqual(executionOrder, ['001', '002', '003'], 'Migrations should execute in numeric order');
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
// ─── AC5: Manifest tracking ───────────────────────────────────
|
|
177
|
+
describe('Manifest migrationsRun tracking (AC5)', () => {
|
|
178
|
+
it('should return applied migration IDs after execution', async () => {
|
|
179
|
+
const migrations = [
|
|
180
|
+
createMockMigration('001-first'),
|
|
181
|
+
createMockMigration('002-second'),
|
|
182
|
+
];
|
|
183
|
+
const { logger } = createMockLogger();
|
|
184
|
+
const result = await runMigrations(migrations, testDir, [], { logger });
|
|
185
|
+
assert.ok(result.success);
|
|
186
|
+
assert.deepStrictEqual(result.applied, ['001-first', '002-second']);
|
|
187
|
+
});
|
|
188
|
+
it('should preserve previously applied IDs in returned set', async () => {
|
|
189
|
+
const migrations = [
|
|
190
|
+
createMockMigration('003-third'),
|
|
191
|
+
];
|
|
192
|
+
const existing = ['001-first', '002-second'];
|
|
193
|
+
const { logger } = createMockLogger();
|
|
194
|
+
const result = await runMigrations(migrations, testDir, existing, { logger });
|
|
195
|
+
assert.ok(result.success);
|
|
196
|
+
assert.deepStrictEqual(result.applied, ['003-third']);
|
|
197
|
+
// The caller is responsible for merging with existing appliedIds
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
// ─── AC6: Idempotency via check() ─────────────────────────────
|
|
201
|
+
describe('Idempotency check (AC6)', () => {
|
|
202
|
+
it('should skip migration when check() returns true', async () => {
|
|
203
|
+
let upCalled = false;
|
|
204
|
+
const migration = createMockMigration('001-already-done', {
|
|
205
|
+
checkResult: true, // already applied
|
|
206
|
+
onUp: () => { upCalled = true; },
|
|
207
|
+
});
|
|
208
|
+
const { logger } = createMockLogger();
|
|
209
|
+
const result = await runMigrations([migration], testDir, [], { logger });
|
|
210
|
+
assert.ok(result.success);
|
|
211
|
+
assert.strictEqual(upCalled, false, 'up() should NOT be called when check() is true');
|
|
212
|
+
assert.ok(result.skipped.includes('001-already-done'), 'Should be in skipped list');
|
|
213
|
+
});
|
|
214
|
+
it('should run migration when check() returns false', async () => {
|
|
215
|
+
let upCalled = false;
|
|
216
|
+
const migration = createMockMigration('001-needs-run', {
|
|
217
|
+
checkResult: false,
|
|
218
|
+
onUp: () => { upCalled = true; },
|
|
219
|
+
});
|
|
220
|
+
const { logger } = createMockLogger();
|
|
221
|
+
const result = await runMigrations([migration], testDir, [], { logger });
|
|
222
|
+
assert.ok(result.success);
|
|
223
|
+
assert.strictEqual(upCalled, true, 'up() should be called when check() is false');
|
|
224
|
+
assert.ok(result.applied.includes('001-needs-run'));
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
// ─── AC7: Migration context ───────────────────────────────────
|
|
228
|
+
describe('Migration context (AC7)', () => {
|
|
229
|
+
it('should provide projectRoot in context', async () => {
|
|
230
|
+
let receivedCtx;
|
|
231
|
+
const migration = createMockMigration('001-test', {
|
|
232
|
+
onUp: (ctx) => { receivedCtx = ctx; },
|
|
233
|
+
});
|
|
234
|
+
const { logger } = createMockLogger();
|
|
235
|
+
await runMigrations([migration], testDir, [], { logger });
|
|
236
|
+
assert.ok(receivedCtx, 'Context should be provided');
|
|
237
|
+
assert.strictEqual(receivedCtx.projectRoot, testDir);
|
|
238
|
+
});
|
|
239
|
+
it('should provide dryRun flag in context', async () => {
|
|
240
|
+
let receivedCtx;
|
|
241
|
+
const migration = createMockMigration('001-test', {
|
|
242
|
+
checkResult: false,
|
|
243
|
+
onCheck: (ctx) => { receivedCtx = ctx; },
|
|
244
|
+
});
|
|
245
|
+
const { logger } = createMockLogger();
|
|
246
|
+
// Even in dry-run, check() should still be called to report status
|
|
247
|
+
await runMigrations([migration], testDir, [], { dryRun: true, logger });
|
|
248
|
+
assert.ok(receivedCtx, 'Context should be provided to check()');
|
|
249
|
+
assert.strictEqual(receivedCtx.dryRun, true);
|
|
250
|
+
});
|
|
251
|
+
it('should provide logger in context', async () => {
|
|
252
|
+
let receivedCtx;
|
|
253
|
+
const migration = createMockMigration('001-test', {
|
|
254
|
+
onUp: (ctx) => { receivedCtx = ctx; },
|
|
255
|
+
});
|
|
256
|
+
const { logger } = createMockLogger();
|
|
257
|
+
await runMigrations([migration], testDir, [], { logger });
|
|
258
|
+
assert.ok(receivedCtx, 'Context should be provided');
|
|
259
|
+
assert.strictEqual(typeof receivedCtx.logger.info, 'function');
|
|
260
|
+
assert.strictEqual(typeof receivedCtx.logger.warning, 'function');
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
// ─── AC10: Dry-run mode ───────────────────────────────────────
|
|
264
|
+
describe('Dry-run mode (AC10)', () => {
|
|
265
|
+
it('should not call up() in dry-run mode', async () => {
|
|
266
|
+
let upCalled = false;
|
|
267
|
+
const migration = createMockMigration('001-test', {
|
|
268
|
+
onUp: () => { upCalled = true; },
|
|
269
|
+
});
|
|
270
|
+
const { logger } = createMockLogger();
|
|
271
|
+
const result = await runMigrations([migration], testDir, [], {
|
|
272
|
+
dryRun: true,
|
|
273
|
+
logger,
|
|
274
|
+
});
|
|
275
|
+
assert.strictEqual(upCalled, false, 'up() should NOT be called in dry-run');
|
|
276
|
+
assert.ok(result.success);
|
|
277
|
+
});
|
|
278
|
+
it('should report what would run in dry-run mode', async () => {
|
|
279
|
+
const migrations = [
|
|
280
|
+
createMockMigration('001-first'),
|
|
281
|
+
createMockMigration('002-second'),
|
|
282
|
+
];
|
|
283
|
+
const { logger, messages } = createMockLogger();
|
|
284
|
+
await runMigrations(migrations, testDir, [], { dryRun: true, logger });
|
|
285
|
+
const infoMessages = messages
|
|
286
|
+
.filter((m) => m.level === 'info')
|
|
287
|
+
.map((m) => m.message);
|
|
288
|
+
assert.ok(infoMessages.some((m) => m.includes('001-first')), 'Should log migration 001-first in dry-run');
|
|
289
|
+
assert.ok(infoMessages.some((m) => m.includes('002-second')), 'Should log migration 002-second in dry-run');
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
// ─── Failure handling ─────────────────────────────────────────
|
|
293
|
+
describe('Failure handling', () => {
|
|
294
|
+
it('should stop on first migration failure', async () => {
|
|
295
|
+
const executionOrder = [];
|
|
296
|
+
const migrations = [
|
|
297
|
+
createMockMigration('001-ok', {
|
|
298
|
+
onUp: () => executionOrder.push('001'),
|
|
299
|
+
}),
|
|
300
|
+
createMockMigration('002-fail', {
|
|
301
|
+
upResult: { success: false, error: 'Database unavailable' },
|
|
302
|
+
onUp: () => executionOrder.push('002'),
|
|
303
|
+
}),
|
|
304
|
+
createMockMigration('003-never', {
|
|
305
|
+
onUp: () => executionOrder.push('003'),
|
|
306
|
+
}),
|
|
307
|
+
];
|
|
308
|
+
const { logger } = createMockLogger();
|
|
309
|
+
const result = await runMigrations(migrations, testDir, [], { logger });
|
|
310
|
+
assert.strictEqual(result.success, false);
|
|
311
|
+
assert.ok(result.failed, 'Should report failed migration');
|
|
312
|
+
assert.strictEqual(result.failed.id, '002-fail');
|
|
313
|
+
assert.strictEqual(result.failed.error, 'Database unavailable');
|
|
314
|
+
assert.deepStrictEqual(result.applied, ['001-ok']);
|
|
315
|
+
assert.ok(!executionOrder.includes('003'), 'Should not execute migrations after failure');
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
//# sourceMappingURL=migrations.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.test.js","sourceRoot":"","sources":["../../../src/cli/utils/migrations.test.ts"],"names":[],"mappings":"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"}
|