@polderlabs/bizar-omp 0.7.0 → 0.7.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 +6 -4
- package/dist/cli/agents-ink.d.ts.map +1 -1
- package/dist/cli/agents-ink.js +5 -3
- package/dist/cli/agents-ink.js.map +1 -1
- package/dist/cli/agents.d.ts.map +1 -1
- package/dist/cli/agents.js +26 -8
- package/dist/cli/agents.js.map +1 -1
- package/dist/cli/doctor.d.ts +4 -4
- package/dist/cli/main.js +0 -0
- package/dist/cli/omb.js +0 -0
- package/dist/core/recovery.d.ts.map +1 -1
- package/dist/core/recovery.js +10 -5
- package/dist/core/recovery.js.map +1 -1
- package/dist/core/transitions.d.ts +4 -0
- package/dist/core/transitions.d.ts.map +1 -1
- package/dist/core/transitions.js +12 -2
- package/dist/core/transitions.js.map +1 -1
- package/dist/core/types.d.ts +46 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/extension.d.ts +2 -0
- package/dist/extension.d.ts.map +1 -1
- package/dist/extension.js +174 -16
- package/dist/extension.js.map +1 -1
- package/dist/omp/compatibility.d.ts +5 -5
- package/dist/omp/compatibility.d.ts.map +1 -1
- package/dist/omp/compatibility.js +2 -2
- package/dist/omp/compatibility.js.map +1 -1
- package/dist/omp/daemon-service.d.ts.map +1 -1
- package/dist/omp/daemon-service.js +53 -20
- package/dist/omp/daemon-service.js.map +1 -1
- package/dist/omp/daemon.d.ts.map +1 -1
- package/dist/omp/daemon.js +57 -17
- package/dist/omp/daemon.js.map +1 -1
- package/dist/omp/dashboard-html.js +5 -5
- package/dist/omp/dispatch-admission.js +1 -1
- package/dist/omp/dispatch-admission.js.map +1 -1
- package/dist/omp/model-role-assignment.d.ts +4 -0
- package/dist/omp/model-role-assignment.d.ts.map +1 -1
- package/dist/omp/model-role-assignment.js +84 -8
- package/dist/omp/model-role-assignment.js.map +1 -1
- package/dist/omp/omb-sessions.d.ts +22 -7
- package/dist/omp/omb-sessions.d.ts.map +1 -1
- package/dist/omp/omb-sessions.js +83 -11
- package/dist/omp/omb-sessions.js.map +1 -1
- package/dist/omp/omb-settings.d.ts +15 -1
- package/dist/omp/omb-settings.d.ts.map +1 -1
- package/dist/omp/omb-settings.js +107 -31
- package/dist/omp/omb-settings.js.map +1 -1
- package/dist/omp/rpc.d.ts +8 -0
- package/dist/omp/rpc.d.ts.map +1 -1
- package/dist/omp/session-activity.d.ts +5 -0
- package/dist/omp/session-activity.d.ts.map +1 -1
- package/dist/omp/session-activity.js +17 -0
- package/dist/omp/session-activity.js.map +1 -1
- package/dist/omp/tmux.d.ts.map +1 -1
- package/dist/omp/tmux.js +110 -14
- package/dist/omp/tmux.js.map +1 -1
- package/dist/services/candidate-verify.d.ts.map +1 -1
- package/dist/services/candidate-verify.js +44 -1
- package/dist/services/candidate-verify.js.map +1 -1
- package/dist/services/inspector.d.ts +5 -1
- package/dist/services/inspector.d.ts.map +1 -1
- package/dist/services/inspector.js +11 -2
- package/dist/services/inspector.js.map +1 -1
- package/dist/services/native-review-ingest.d.ts +35 -0
- package/dist/services/native-review-ingest.d.ts.map +1 -0
- package/dist/services/native-review-ingest.js +14 -0
- package/dist/services/native-review-ingest.js.map +1 -0
- package/dist/tools/integrate.d.ts.map +1 -1
- package/dist/tools/integrate.js +13 -0
- package/dist/tools/integrate.js.map +1 -1
- package/dist/tools/workflow.d.ts +9 -0
- package/dist/tools/workflow.d.ts.map +1 -1
- package/dist/tools/workflow.js +25 -2
- package/dist/tools/workflow.js.map +1 -1
- package/docs/compatibility/baseline.json +8 -7
- package/docs/compatibility/supported-surfaces.json +2 -1
- package/docs/development/ci-release-implementation-guide.md +1259 -0
- package/docs/development/contributing-and-releasing.md +117 -0
- package/docs/development/omp-compatibility-update-guide.md +117 -0
- package/docs/releases/0.7.1.md +15 -0
- package/docs/releases/native-stable.md +11 -1
- package/docs/releases/npm-publishing.md +23 -4
- package/docs/releases/support-matrix.md +1 -1
- package/package.json +2 -1
- package/rules/oflow-gitlab.md +6 -0
- package/skills/oflow-gitlab-context/SKILL.md +49 -0
- package/skills/omp-native-development/SKILL.md +1 -1
- package/skills/omp-native-development/references/accuracy-and-versioning.md +1 -1
- package/skills/omp-native-development/references/source-manifest.json +3 -3
- package/dist/src/cli/agents-ink.d.ts +0 -25
- package/dist/src/cli/agents-ink.js +0 -517
- package/dist/src/cli/agents-ink.js.map +0 -1
- package/dist/src/cli/agents.d.ts +0 -14
- package/dist/src/cli/agents.js +0 -197
- package/dist/src/cli/agents.js.map +0 -1
- package/dist/src/cli/directory-selector.d.ts +0 -60
- package/dist/src/cli/directory-selector.js +0 -208
- package/dist/src/cli/directory-selector.js.map +0 -1
- package/dist/src/cli/doctor.d.ts +0 -41
- package/dist/src/cli/doctor.js +0 -31
- package/dist/src/cli/doctor.js.map +0 -1
- package/dist/src/cli/install.d.ts +0 -129
- package/dist/src/cli/install.js +0 -164
- package/dist/src/cli/install.js.map +0 -1
- package/dist/src/cli/main.d.ts +0 -2
- package/dist/src/cli/main.js +0 -117
- package/dist/src/cli/main.js.map +0 -1
- package/dist/src/cli/migrate.d.ts +0 -18
- package/dist/src/cli/migrate.js +0 -14
- package/dist/src/cli/migrate.js.map +0 -1
- package/dist/src/cli/omb-commands.d.ts +0 -29
- package/dist/src/cli/omb-commands.js +0 -107
- package/dist/src/cli/omb-commands.js.map +0 -1
- package/dist/src/cli/omb-daemon.d.ts +0 -2
- package/dist/src/cli/omb-daemon.js +0 -135
- package/dist/src/cli/omb-daemon.js.map +0 -1
- package/dist/src/cli/omb-dashboard.d.ts +0 -12
- package/dist/src/cli/omb-dashboard.js +0 -113
- package/dist/src/cli/omb-dashboard.js.map +0 -1
- package/dist/src/cli/omb-invocation.d.ts +0 -8
- package/dist/src/cli/omb-invocation.js +0 -41
- package/dist/src/cli/omb-invocation.js.map +0 -1
- package/dist/src/cli/omb-runtime.d.ts +0 -41
- package/dist/src/cli/omb-runtime.js +0 -371
- package/dist/src/cli/omb-runtime.js.map +0 -1
- package/dist/src/cli/omb-tray.d.ts +0 -2
- package/dist/src/cli/omb-tray.js +0 -38
- package/dist/src/cli/omb-tray.js.map +0 -1
- package/dist/src/cli/omb.d.ts +0 -2
- package/dist/src/cli/omb.js +0 -31
- package/dist/src/cli/omb.js.map +0 -1
- package/dist/src/cli/omp-theme.d.ts +0 -17
- package/dist/src/cli/omp-theme.js +0 -22
- package/dist/src/cli/omp-theme.js.map +0 -1
- package/dist/src/cli/process.d.ts +0 -6
- package/dist/src/cli/process.js +0 -54
- package/dist/src/cli/process.js.map +0 -1
- package/dist/src/cli/run.d.ts +0 -2
- package/dist/src/cli/run.js +0 -5
- package/dist/src/cli/run.js.map +0 -1
- package/dist/src/cli/setup-ui.d.ts +0 -37
- package/dist/src/cli/setup-ui.js +0 -90
- package/dist/src/cli/setup-ui.js.map +0 -1
- package/dist/src/core/acceptance.d.ts +0 -32
- package/dist/src/core/acceptance.js +0 -87
- package/dist/src/core/acceptance.js.map +0 -1
- package/dist/src/core/errors.d.ts +0 -20
- package/dist/src/core/errors.js +0 -30
- package/dist/src/core/errors.js.map +0 -1
- package/dist/src/core/evidence.d.ts +0 -10
- package/dist/src/core/evidence.js +0 -35
- package/dist/src/core/evidence.js.map +0 -1
- package/dist/src/core/policies.d.ts +0 -10
- package/dist/src/core/policies.js +0 -60
- package/dist/src/core/policies.js.map +0 -1
- package/dist/src/core/recovery.d.ts +0 -6
- package/dist/src/core/recovery.js +0 -56
- package/dist/src/core/recovery.js.map +0 -1
- package/dist/src/core/transitions.d.ts +0 -13
- package/dist/src/core/transitions.js +0 -59
- package/dist/src/core/transitions.js.map +0 -1
- package/dist/src/core/types.d.ts +0 -256
- package/dist/src/core/types.js +0 -2
- package/dist/src/core/types.js.map +0 -1
- package/dist/src/extension.d.ts +0 -60
- package/dist/src/extension.js +0 -538
- package/dist/src/extension.js.map +0 -1
- package/dist/src/index.d.ts +0 -29
- package/dist/src/index.js +0 -30
- package/dist/src/index.js.map +0 -1
- package/dist/src/omp/autonomous-settings.d.ts +0 -14
- package/dist/src/omp/autonomous-settings.js +0 -65
- package/dist/src/omp/autonomous-settings.js.map +0 -1
- package/dist/src/omp/capabilities.d.ts +0 -23
- package/dist/src/omp/capabilities.js +0 -6
- package/dist/src/omp/capabilities.js.map +0 -1
- package/dist/src/omp/compatibility.d.ts +0 -30
- package/dist/src/omp/compatibility.js +0 -34
- package/dist/src/omp/compatibility.js.map +0 -1
- package/dist/src/omp/completion.d.ts +0 -7
- package/dist/src/omp/completion.js +0 -10
- package/dist/src/omp/completion.js.map +0 -1
- package/dist/src/omp/config.d.ts +0 -10
- package/dist/src/omp/config.js +0 -14
- package/dist/src/omp/config.js.map +0 -1
- package/dist/src/omp/context.d.ts +0 -15
- package/dist/src/omp/context.js +0 -3
- package/dist/src/omp/context.js.map +0 -1
- package/dist/src/omp/daemon-service.d.ts +0 -25
- package/dist/src/omp/daemon-service.js +0 -483
- package/dist/src/omp/daemon-service.js.map +0 -1
- package/dist/src/omp/daemon.d.ts +0 -48
- package/dist/src/omp/daemon.js +0 -194
- package/dist/src/omp/daemon.js.map +0 -1
- package/dist/src/omp/dashboard-html.d.ts +0 -3
- package/dist/src/omp/dashboard-html.js +0 -419
- package/dist/src/omp/dashboard-html.js.map +0 -1
- package/dist/src/omp/dispatch-admission.d.ts +0 -2
- package/dist/src/omp/dispatch-admission.js +0 -12
- package/dist/src/omp/dispatch-admission.js.map +0 -1
- package/dist/src/omp/integration-recovery.d.ts +0 -10
- package/dist/src/omp/integration-recovery.js +0 -18
- package/dist/src/omp/integration-recovery.js.map +0 -1
- package/dist/src/omp/isolation-policy.d.ts +0 -14
- package/dist/src/omp/isolation-policy.js +0 -9
- package/dist/src/omp/isolation-policy.js.map +0 -1
- package/dist/src/omp/lifecycle.d.ts +0 -14
- package/dist/src/omp/lifecycle.js +0 -14
- package/dist/src/omp/lifecycle.js.map +0 -1
- package/dist/src/omp/memory.d.ts +0 -16
- package/dist/src/omp/memory.js +0 -4
- package/dist/src/omp/memory.js.map +0 -1
- package/dist/src/omp/model-role-assignment.d.ts +0 -296
- package/dist/src/omp/model-role-assignment.js +0 -559
- package/dist/src/omp/model-role-assignment.js.map +0 -1
- package/dist/src/omp/model-roles.d.ts +0 -19
- package/dist/src/omp/model-roles.js +0 -6
- package/dist/src/omp/model-roles.js.map +0 -1
- package/dist/src/omp/omb-sessions.d.ts +0 -122
- package/dist/src/omp/omb-sessions.js +0 -512
- package/dist/src/omp/omb-sessions.js.map +0 -1
- package/dist/src/omp/omb-settings.d.ts +0 -35
- package/dist/src/omp/omb-settings.js +0 -104
- package/dist/src/omp/omb-settings.js.map +0 -1
- package/dist/src/omp/result-reconciliation.d.ts +0 -2
- package/dist/src/omp/result-reconciliation.js +0 -9
- package/dist/src/omp/result-reconciliation.js.map +0 -1
- package/dist/src/omp/rpc.d.ts +0 -67
- package/dist/src/omp/rpc.js +0 -4
- package/dist/src/omp/rpc.js.map +0 -1
- package/dist/src/omp/run-log.d.ts +0 -25
- package/dist/src/omp/run-log.js +0 -24
- package/dist/src/omp/run-log.js.map +0 -1
- package/dist/src/omp/session-activity.d.ts +0 -70
- package/dist/src/omp/session-activity.js +0 -361
- package/dist/src/omp/session-activity.js.map +0 -1
- package/dist/src/omp/session-controls.d.ts +0 -17
- package/dist/src/omp/session-controls.js +0 -14
- package/dist/src/omp/session-controls.js.map +0 -1
- package/dist/src/omp/tmux.d.ts +0 -89
- package/dist/src/omp/tmux.js +0 -445
- package/dist/src/omp/tmux.js.map +0 -1
- package/dist/src/omp/tray-icons.d.ts +0 -5
- package/dist/src/omp/tray-icons.js +0 -78
- package/dist/src/omp/tray-icons.js.map +0 -1
- package/dist/src/omp/tray.d.ts +0 -23
- package/dist/src/omp/tray.js +0 -167
- package/dist/src/omp/tray.js.map +0 -1
- package/dist/src/services/budget.d.ts +0 -19
- package/dist/src/services/budget.js +0 -10
- package/dist/src/services/budget.js.map +0 -1
- package/dist/src/services/candidate-local.d.ts +0 -13
- package/dist/src/services/candidate-local.js +0 -15
- package/dist/src/services/candidate-local.js.map +0 -1
- package/dist/src/services/candidates.d.ts +0 -20
- package/dist/src/services/candidates.js +0 -100
- package/dist/src/services/candidates.js.map +0 -1
- package/dist/src/services/evidence-bundle.d.ts +0 -17
- package/dist/src/services/evidence-bundle.js +0 -21
- package/dist/src/services/evidence-bundle.js.map +0 -1
- package/dist/src/services/inspector.d.ts +0 -11
- package/dist/src/services/inspector.js +0 -6
- package/dist/src/services/inspector.js.map +0 -1
- package/dist/src/services/lessons.d.ts +0 -13
- package/dist/src/services/lessons.js +0 -11
- package/dist/src/services/lessons.js.map +0 -1
- package/dist/src/services/projection.d.ts +0 -21
- package/dist/src/services/projection.js +0 -10
- package/dist/src/services/projection.js.map +0 -1
- package/dist/src/services/readiness.d.ts +0 -4
- package/dist/src/services/readiness.js +0 -35
- package/dist/src/services/readiness.js.map +0 -1
- package/dist/src/services/recipes.d.ts +0 -15
- package/dist/src/services/recipes.js +0 -42
- package/dist/src/services/recipes.js.map +0 -1
- package/dist/src/services/recovery.d.ts +0 -19
- package/dist/src/services/recovery.js +0 -9
- package/dist/src/services/recovery.js.map +0 -1
- package/dist/src/services/review.d.ts +0 -15
- package/dist/src/services/review.js +0 -9
- package/dist/src/services/review.js.map +0 -1
- package/dist/src/storage/journal-recovery.d.ts +0 -10
- package/dist/src/storage/journal-recovery.js +0 -33
- package/dist/src/storage/journal-recovery.js.map +0 -1
- package/dist/src/storage/journal.d.ts +0 -12
- package/dist/src/storage/journal.js +0 -82
- package/dist/src/storage/journal.js.map +0 -1
- package/dist/src/storage/migrations.d.ts +0 -22
- package/dist/src/storage/migrations.js +0 -107
- package/dist/src/storage/migrations.js.map +0 -1
- package/dist/src/storage/repository-identity.d.ts +0 -11
- package/dist/src/storage/repository-identity.js +0 -67
- package/dist/src/storage/repository-identity.js.map +0 -1
- package/dist/src/storage/resources.d.ts +0 -66
- package/dist/src/storage/resources.js +0 -148
- package/dist/src/storage/resources.js.map +0 -1
- package/dist/src/tools/evidence.d.ts +0 -8
- package/dist/src/tools/evidence.js +0 -9
- package/dist/src/tools/evidence.js.map +0 -1
- package/dist/src/tools/integrate.d.ts +0 -13
- package/dist/src/tools/integrate.js +0 -90
- package/dist/src/tools/integrate.js.map +0 -1
- package/dist/src/tools/result.d.ts +0 -9
- package/dist/src/tools/result.js +0 -2
- package/dist/src/tools/result.js.map +0 -1
- package/dist/src/tools/verify.d.ts +0 -13
- package/dist/src/tools/verify.js +0 -61
- package/dist/src/tools/verify.js.map +0 -1
- package/dist/src/tools/workflow.d.ts +0 -8
- package/dist/src/tools/workflow.js +0 -65
- package/dist/src/tools/workflow.js.map +0 -1
- package/dist/src/workflows/direct.d.ts +0 -9
- package/dist/src/workflows/direct.js +0 -2
- package/dist/src/workflows/direct.js.map +0 -1
- package/dist/src/workflows/implement.d.ts +0 -2
- package/dist/src/workflows/implement.js +0 -4
- package/dist/src/workflows/implement.js.map +0 -1
- package/dist/src/workflows/plan.d.ts +0 -17
- package/dist/src/workflows/plan.js +0 -6
- package/dist/src/workflows/plan.js.map +0 -1
- package/dist/src/workflows/research.d.ts +0 -15
- package/dist/src/workflows/research.js +0 -2
- package/dist/src/workflows/research.js.map +0 -1
- package/dist/src/workflows/review.d.ts +0 -15
- package/dist/src/workflows/review.js +0 -2
- package/dist/src/workflows/review.js.map +0 -1
- package/dist/src/workflows/verify.d.ts +0 -9
- package/dist/src/workflows/verify.js +0 -2
- package/dist/src/workflows/verify.js.map +0 -1
- package/dist/tests/acceptance.test.d.ts +0 -1
- package/dist/tests/acceptance.test.js +0 -27
- package/dist/tests/acceptance.test.js.map +0 -1
- package/dist/tests/agents.test.d.ts +0 -1
- package/dist/tests/agents.test.js +0 -369
- package/dist/tests/agents.test.js.map +0 -1
- package/dist/tests/candidates.test.d.ts +0 -1
- package/dist/tests/candidates.test.js +0 -60
- package/dist/tests/candidates.test.js.map +0 -1
- package/dist/tests/core.test.d.ts +0 -1
- package/dist/tests/core.test.js +0 -39
- package/dist/tests/core.test.js.map +0 -1
- package/dist/tests/daemon.test.d.ts +0 -1
- package/dist/tests/daemon.test.js +0 -157
- package/dist/tests/daemon.test.js.map +0 -1
- package/dist/tests/dashboard.test.d.ts +0 -1
- package/dist/tests/dashboard.test.js +0 -414
- package/dist/tests/dashboard.test.js.map +0 -1
- package/dist/tests/directory-selector.test.d.ts +0 -1
- package/dist/tests/directory-selector.test.js +0 -93
- package/dist/tests/directory-selector.test.js.map +0 -1
- package/dist/tests/doctor.test.d.ts +0 -1
- package/dist/tests/doctor.test.js +0 -32
- package/dist/tests/doctor.test.js.map +0 -1
- package/dist/tests/install.test.d.ts +0 -1
- package/dist/tests/install.test.js +0 -101
- package/dist/tests/install.test.js.map +0 -1
- package/dist/tests/integration.test.d.ts +0 -1
- package/dist/tests/integration.test.js +0 -49
- package/dist/tests/integration.test.js.map +0 -1
- package/dist/tests/journal.test.d.ts +0 -1
- package/dist/tests/journal.test.js +0 -50
- package/dist/tests/journal.test.js.map +0 -1
- package/dist/tests/model-role-assignment.test.d.ts +0 -1
- package/dist/tests/model-role-assignment.test.js +0 -294
- package/dist/tests/model-role-assignment.test.js.map +0 -1
- package/dist/tests/omb-runtime.test.d.ts +0 -1
- package/dist/tests/omb-runtime.test.js +0 -554
- package/dist/tests/omb-runtime.test.js.map +0 -1
- package/dist/tests/omb-session-actions.test.d.ts +0 -1
- package/dist/tests/omb-session-actions.test.js +0 -191
- package/dist/tests/omb-session-actions.test.js.map +0 -1
- package/dist/tests/omb-settings.test.d.ts +0 -1
- package/dist/tests/omb-settings.test.js +0 -82
- package/dist/tests/omb-settings.test.js.map +0 -1
- package/dist/tests/omp-contract.test.d.ts +0 -1
- package/dist/tests/omp-contract.test.js +0 -362
- package/dist/tests/omp-contract.test.js.map +0 -1
- package/dist/tests/process.test.d.ts +0 -1
- package/dist/tests/process.test.js +0 -12
- package/dist/tests/process.test.js.map +0 -1
- package/dist/tests/psmux-windows.test.d.ts +0 -1
- package/dist/tests/psmux-windows.test.js +0 -105
- package/dist/tests/psmux-windows.test.js.map +0 -1
- package/dist/tests/recovery.test.d.ts +0 -1
- package/dist/tests/recovery.test.js +0 -9
- package/dist/tests/recovery.test.js.map +0 -1
- package/dist/tests/resources.test.d.ts +0 -1
- package/dist/tests/resources.test.js +0 -55
- package/dist/tests/resources.test.js.map +0 -1
- package/dist/tests/session-activity.test.d.ts +0 -1
- package/dist/tests/session-activity.test.js +0 -159
- package/dist/tests/session-activity.test.js.map +0 -1
- package/dist/tests/setup-ui.test.d.ts +0 -1
- package/dist/tests/setup-ui.test.js +0 -37
- package/dist/tests/setup-ui.test.js.map +0 -1
- package/dist/tests/storage-integrity.test.d.ts +0 -1
- package/dist/tests/storage-integrity.test.js +0 -88
- package/dist/tests/storage-integrity.test.js.map +0 -1
- package/dist/tests/tmux.test.d.ts +0 -1
- package/dist/tests/tmux.test.js +0 -239
- package/dist/tests/tmux.test.js.map +0 -1
- package/dist/tests/tray.test.d.ts +0 -1
- package/dist/tests/tray.test.js +0 -37
- package/dist/tests/tray.test.js.map +0 -1
- package/dist/tests/verification.test.d.ts +0 -1
- package/dist/tests/verification.test.js +0 -61
- package/dist/tests/verification.test.js.map +0 -1
- package/dist/tests/workflow-features.test.d.ts +0 -1
- package/dist/tests/workflow-features.test.js +0 -82
- package/dist/tests/workflow-features.test.js.map +0 -1
- package/dist/tests/workflow-safety.test.d.ts +0 -1
- package/dist/tests/workflow-safety.test.js +0 -57
- package/dist/tests/workflow-safety.test.js.map +0 -1
|
@@ -0,0 +1,1259 @@
|
|
|
1
|
+
# BizarHarness-OMP CI, Contribution, and Release Architecture
|
|
2
|
+
|
|
3
|
+
> **Current implementation (2026-09-23):** `.github/workflows/ci.yml` is a
|
|
4
|
+
> phased pipeline with generated runtime matrices, one validated package
|
|
5
|
+
> artifact, native OMP qualification, a stable required-check fan-in, and
|
|
6
|
+
> separate npm Trusted Publishing and GitHub Packages publish jobs. Runtime
|
|
7
|
+
> policy is in `.github/ci-policy.json`; package and OMP values come from
|
|
8
|
+
> `package.json` and `src/omp/compatibility.ts`. The historical migration
|
|
9
|
+
> analysis below records earlier source observations; where it describes a
|
|
10
|
+
> prior workflow shape, the current workflow and `CONTRIBUTING.md` take
|
|
11
|
+
> precedence.
|
|
12
|
+
|
|
13
|
+
Target repository: `PolderLabs/BizarHarness-OMP`
|
|
14
|
+
Inspected main commit: `064578c3ea60d5b9ec891610ee08b09d92c908fc`
|
|
15
|
+
Package at inspected HEAD: `@polderlabs/bizar-omp` with `package.json` version `0.7.0`
|
|
16
|
+
Upstream reference: `can1357/oh-my-pi` at `0f9139f546e1dcb0e63ce35f1236509c4cca66c1`
|
|
17
|
+
Research date: 2026-09-22
|
|
18
|
+
|
|
19
|
+
# Migration status
|
|
20
|
+
|
|
21
|
+
> **Status (2026-09-22):** This plan has been implemented in PR #78 (`ci+release: unified pipeline, local orchestrator, contract tests`). `.github/workflows/immutable-tag.yml` and `.github/workflows/release.yml` are removed. `.github/workflows/ci.yml` is the unified pipeline (verify / package-contract / bun-compatibility / release). The local orchestrator is `scripts/release.mjs` (with `scripts/release-lib.mjs`). Preflight is `scripts/verify-release-state.mjs --strict-network`. The release-receipt generator is `scripts/create-release-receipt.mjs`. The OMP compatibility updater (`scripts/update-omp-compatibility.mjs`) no longer mutates the Bizar package version. The contributor runbook lives in `docs/development/contributing-and-releasing.md`. The remainder of this document is kept as the source of truth for the architecture; if implementation diverges, the implementation wins and this document is updated in a follow-up.
|
|
22
|
+
## Verification status of this plan
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
Evidence labels follow the OMP native-development guidance:
|
|
26
|
+
|
|
27
|
+
- **SOURCE-OBSERVED:** BizarHarness-OMP repository state at `064578c3ea60d5b9ec891610ee08b09d92c908fc`, including package metadata, release workflows, compatibility automation, and release scripts.
|
|
28
|
+
- **SOURCE-OBSERVED:** current oh-my-pi main at `0f9139f546e1dcb0e63ce35f1236509c4cca66c1`. The release-control files used by this design (`.github/workflows/ci.yml`, `scripts/release.ts`, `CONTRIBUTING.md`, and `.github/PULL_REQUEST_TEMPLATE.md`) are unchanged in substance from the previously inspected `6cb51f9...` snapshot.
|
|
29
|
+
- **DOCUMENTED:** npm Trusted Publishing currently requires npm CLI `>=11.5.1`, Node `>=22.14.0`, a supported cloud-hosted runner, and `id-token: write`; private source repositories can use OIDC publishing but do not receive npm provenance attestations. Existing Trusted Publisher connections cannot be edited in place.
|
|
30
|
+
- **DOCUMENTED:** GitHub Actions workflow-level `concurrency.cancel-in-progress` may be an expression; this supports the release-safe per-SHA pattern used by OMP.
|
|
31
|
+
- **UNKNOWN:** whether `@polderlabs/bizar-omp@0.7.0` is already published. Registry access was unavailable in the audit environment, so Phase 0 must query npm before changing the current version state.
|
|
32
|
+
- **PROPOSED:** the Bizar-specific unified workflow graph, qualification matrix, release receipt, and agent authority rules below.
|
|
33
|
+
|
|
34
|
+
No unexecuted release or CI path is labeled TESTED in this document. The migration is complete only after the acceptance cases in section 25 are actually executed.
|
|
35
|
+
|
|
36
|
+
## 1. Goal
|
|
37
|
+
|
|
38
|
+
BizarHarness-OMP should adopt the release architecture used by oh-my-pi without copying OMP's platform-binary complexity.
|
|
39
|
+
|
|
40
|
+
The target model is:
|
|
41
|
+
|
|
42
|
+
1. Contributor PRs change code, tests, docs, and the `[Unreleased]` changelog only.
|
|
43
|
+
2. PR CI validates the contribution. A PR never publishes and never bumps the package version.
|
|
44
|
+
3. Merged changes accumulate on `main`, which remains releasable.
|
|
45
|
+
4. A maintainer manually decides when to release and which SemVer impact applies.
|
|
46
|
+
5. A local release script prepares one version-bump commit and one matching `vX.Y.Z` tag.
|
|
47
|
+
6. The release script pushes `main` and the tag atomically.
|
|
48
|
+
7. The ordinary `CI` workflow detects that its `main` HEAD is tagged and turns the same CI run into the release run.
|
|
49
|
+
8. Validation and release-artifact preparation run in parallel where useful.
|
|
50
|
+
9. Publication is held behind one release validation gate.
|
|
51
|
+
10. CI publishes the exact validated npm artifact through npm trusted publishing, verifies the registry artifact, and then creates the GitHub Release with checksums and a release receipt.
|
|
52
|
+
|
|
53
|
+
The key rule is:
|
|
54
|
+
|
|
55
|
+
> A merged PR is not a release. A release is an explicit maintainer action against a green, releasable `main`.
|
|
56
|
+
|
|
57
|
+
## 2. What exists now
|
|
58
|
+
|
|
59
|
+
The repository already has useful pieces and should preserve them:
|
|
60
|
+
|
|
61
|
+
- `.github/workflows/ci.yml`
|
|
62
|
+
- Node 22/24 matrix.
|
|
63
|
+
- package/security/document verification.
|
|
64
|
+
- Bun compatibility.
|
|
65
|
+
- packed installation verification against OMP 18.2.8.
|
|
66
|
+
- `.github/workflows/release.yml`
|
|
67
|
+
- npm trusted publishing via GitHub OIDC.
|
|
68
|
+
- tag/version verification.
|
|
69
|
+
- native OMP installation verification.
|
|
70
|
+
- registry visibility wait.
|
|
71
|
+
- registry plugin-install verification.
|
|
72
|
+
- GitHub Release creation.
|
|
73
|
+
- `.github/workflows/immutable-tag.yml`
|
|
74
|
+
- verifies that a tag points at a commit with a successful `CI` run.
|
|
75
|
+
- `.github/workflows/omp-compatibility.yml`
|
|
76
|
+
- daily OMP release detection.
|
|
77
|
+
- immutable OMP tag resolution.
|
|
78
|
+
- npm integrity capture.
|
|
79
|
+
- packed OMP qualification.
|
|
80
|
+
- automated compatibility PR creation.
|
|
81
|
+
- `scripts/publish-release.mjs`
|
|
82
|
+
- idempotent registry lookup.
|
|
83
|
+
- local-vs-registry content comparison.
|
|
84
|
+
- safe handling when a version already exists.
|
|
85
|
+
- `scripts/verify-release.mjs`
|
|
86
|
+
- tag/package version check.
|
|
87
|
+
- `scripts/verify-omp-install.mjs`
|
|
88
|
+
- packed plugin installation and native discovery qualification.
|
|
89
|
+
- `scripts/verify-omp-plugin-install.mjs`
|
|
90
|
+
- post-publication registry install and OMP doctor qualification.
|
|
91
|
+
- `scripts/check-secrets.mjs`
|
|
92
|
+
- repository secret canaries.
|
|
93
|
+
- `docs/compatibility/baseline.json`
|
|
94
|
+
- explicit Bizar/OMP qualification fingerprint.
|
|
95
|
+
- `docs/releases/`
|
|
96
|
+
- release notes and release policy.
|
|
97
|
+
- `CONTRIBUTING.md`
|
|
98
|
+
- branch naming and local verification guidance.
|
|
99
|
+
|
|
100
|
+
These are good building blocks. The migration should consolidate them rather than replacing them with a generic release framework such as semantic-release or Changesets.
|
|
101
|
+
|
|
102
|
+
## 3. Current problems to correct first
|
|
103
|
+
|
|
104
|
+
### 3.1 Version metadata is currently inconsistent
|
|
105
|
+
|
|
106
|
+
At inspected HEAD:
|
|
107
|
+
|
|
108
|
+
- `package.json`: `0.7.0`.
|
|
109
|
+
- `package-lock.json` root: `0.6.8`.
|
|
110
|
+
- `package-lock.json` `packages[""]`: `0.6.8`.
|
|
111
|
+
- `docs/compatibility/baseline.json` package version: `0.6.8`.
|
|
112
|
+
|
|
113
|
+
`package.json` was bumped in commit `064578c3...`, but the other release metadata was not updated.
|
|
114
|
+
|
|
115
|
+
This already conflicts with `verify:docs`, which requires the baseline package version to match `package.json`.
|
|
116
|
+
|
|
117
|
+
Before introducing the new release system, reconcile this state. If `0.7.0` has not actually been published, restore the repository to the last published version and let the new release script create `0.7.0` later. If `0.7.0` has been published, synchronize every release metadata file to the exact published version and artifact.
|
|
118
|
+
|
|
119
|
+
Do not guess publication state from `package.json` alone.
|
|
120
|
+
|
|
121
|
+
### 3.2 The lockfile has evidence of unsafe version editing
|
|
122
|
+
|
|
123
|
+
The current lockfile contains transitive entries whose `version` field is `0.6.7` while their `resolved` URL names a completely different dependency version. That is not a valid release-management strategy.
|
|
124
|
+
|
|
125
|
+
The new release code MUST NOT regex-replace arbitrary `"version"` fields in `package-lock.json`.
|
|
126
|
+
|
|
127
|
+
Required rule:
|
|
128
|
+
|
|
129
|
+
1. Never regex-rewrite `package-lock.json`.
|
|
130
|
+
2. For normal version bumps, use npm itself:
|
|
131
|
+
`npm version <target> --no-git-tag-version --ignore-scripts`.
|
|
132
|
+
npm documents that `npm version` updates both `package.json` and `package-lock.json`; disabling Git tagging leaves commit/tag ownership with `scripts/release.mjs`.
|
|
133
|
+
3. Verify both root lockfile version fields match `package.json`.
|
|
134
|
+
4. Run `npm ci` from the updated lock before release.
|
|
135
|
+
|
|
136
|
+
The currently corrupted lockfile is a separate migration repair. Rebuild it with npm in an isolated branch/worktree, inspect every dependency-tree change, and do not accept accidental dependency upgrades as release bookkeeping. If a clean regeneration changes resolved dependency versions, treat those as dependency changes requiring normal review and validation.
|
|
137
|
+
|
|
138
|
+
### 3.3 Bizar has no `[Unreleased]` contribution buffer
|
|
139
|
+
|
|
140
|
+
Current `CHANGELOG.md` starts directly with released version sections. This forces release metadata to be created during feature/release commits rather than allowing normal PRs to accumulate releasable change descriptions.
|
|
141
|
+
|
|
142
|
+
Add at the top:
|
|
143
|
+
|
|
144
|
+
```md
|
|
145
|
+
# Changelog
|
|
146
|
+
|
|
147
|
+
## [Unreleased]
|
|
148
|
+
|
|
149
|
+
### Added
|
|
150
|
+
|
|
151
|
+
### Changed
|
|
152
|
+
|
|
153
|
+
### Fixed
|
|
154
|
+
|
|
155
|
+
### Security
|
|
156
|
+
|
|
157
|
+
### Compatibility
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Empty subsections may be omitted. The release script promotes non-empty `[Unreleased]` content into the version being released and recreates an empty `[Unreleased]` section.
|
|
161
|
+
|
|
162
|
+
### 3.4 Release state is split across three workflows
|
|
163
|
+
|
|
164
|
+
Today:
|
|
165
|
+
|
|
166
|
+
```text
|
|
167
|
+
CI
|
|
168
|
+
-> tag pushed
|
|
169
|
+
-> immutable-tag.yml
|
|
170
|
+
-> release.yml
|
|
171
|
+
-> npm/GitHub release
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
The desired OMP model is:
|
|
175
|
+
|
|
176
|
+
```text
|
|
177
|
+
one main push CI run
|
|
178
|
+
-> detect release tag on HEAD
|
|
179
|
+
-> run normal validation
|
|
180
|
+
-> prepare release artifact in parallel
|
|
181
|
+
-> release_gate
|
|
182
|
+
-> npm publish
|
|
183
|
+
-> registry verification
|
|
184
|
+
-> GitHub Release
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Once the new workflow is proven, remove `.github/workflows/immutable-tag.yml` and `.github/workflows/release.yml`. Their responsibilities move into `.github/workflows/ci.yml`.
|
|
188
|
+
|
|
189
|
+
### 3.5 `make verify` and documentation disagree
|
|
190
|
+
|
|
191
|
+
`CONTRIBUTING.md` says the local gate includes packed-artifact checks. Current `Makefile` `verify` does not execute `pack:check` or native OMP qualification.
|
|
192
|
+
|
|
193
|
+
Create one canonical command and make every document call the same command.
|
|
194
|
+
|
|
195
|
+
Recommended:
|
|
196
|
+
|
|
197
|
+
```json
|
|
198
|
+
{
|
|
199
|
+
"scripts": {
|
|
200
|
+
"check": "npm run typecheck && npm test && npm run verify:package && npm run verify:docs && npm run verify:security && npm run pack:check",
|
|
201
|
+
"check:full": "npm run check && npm run verify:omp"
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Then:
|
|
207
|
+
|
|
208
|
+
```make
|
|
209
|
+
verify:
|
|
210
|
+
\tnpm run check
|
|
211
|
+
|
|
212
|
+
verify-full:
|
|
213
|
+
\tnpm run check:full
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
`check` is the normal contributor gate. `check:full` is the OMP-sensitive/release qualification gate when a compatible OMP host is available.
|
|
217
|
+
|
|
218
|
+
## 4. Proposed repository structure
|
|
219
|
+
|
|
220
|
+
Add or change these files:
|
|
221
|
+
|
|
222
|
+
```text
|
|
223
|
+
BizarHarness-OMP/
|
|
224
|
+
├── AGENTS.md NEW - coding-agent authority guide
|
|
225
|
+
├── CONTRIBUTING.md UPDATE - human contribution/release policy
|
|
226
|
+
├── CHANGELOG.md UPDATE - [Unreleased] workflow
|
|
227
|
+
├── Makefile UPDATE - canonical check commands
|
|
228
|
+
├── package.json UPDATE - check/release scripts
|
|
229
|
+
├── package-lock.json REGENERATE, never regex-edit
|
|
230
|
+
│
|
|
231
|
+
├── .github/
|
|
232
|
+
│ ├── PULL_REQUEST_TEMPLATE.md NEW
|
|
233
|
+
│ ├── dependabot.yml KEEP
|
|
234
|
+
│ └── workflows/
|
|
235
|
+
│ ├── ci.yml REWRITE/EXPAND; CI + release
|
|
236
|
+
│ ├── omp-compatibility.yml KEEP, MODIFY behavior
|
|
237
|
+
│ ├── immutable-tag.yml REMOVE after migration
|
|
238
|
+
│ └── release.yml REMOVE after migration
|
|
239
|
+
│
|
|
240
|
+
├── scripts/
|
|
241
|
+
│ ├── release.mjs NEW - local maintainer orchestrator
|
|
242
|
+
│ ├── release-lib.mjs NEW - pure/testable release helpers
|
|
243
|
+
│ ├── verify-release-state.mjs NEW - metadata/tag consistency gate
|
|
244
|
+
│ ├── create-release-receipt.mjs NEW - immutable release receipt
|
|
245
|
+
│ ├── publish-release.mjs KEEP, adapt to CI artifact path/channel
|
|
246
|
+
│ ├── verify-release.mjs REPLACE or fold into release-state verifier
|
|
247
|
+
│ ├── verify-package.mjs KEEP
|
|
248
|
+
│ ├── verify-omp-install.mjs KEEP
|
|
249
|
+
│ ├── verify-omp-plugin-install.mjs KEEP
|
|
250
|
+
│ ├── update-omp-compatibility.mjs MODIFY - never bump Bizar version
|
|
251
|
+
│ └── check-secrets.mjs KEEP
|
|
252
|
+
│
|
|
253
|
+
├── tests/
|
|
254
|
+
│ ├── release.test.ts NEW
|
|
255
|
+
│ ├── workflow-contract.test.ts NEW
|
|
256
|
+
│ └── ... EXISTING
|
|
257
|
+
│
|
|
258
|
+
└── docs/
|
|
259
|
+
├── development/
|
|
260
|
+
│ └── contributing-and-releasing.md NEW - detailed policy/runbook
|
|
261
|
+
├── compatibility/
|
|
262
|
+
│ └── baseline.json KEEP; release script owns package.version
|
|
263
|
+
└── releases/
|
|
264
|
+
├── native-stable.md KEEP; release script updates stable pointer
|
|
265
|
+
└── X.Y.Z.md GENERATED/FINALIZED by release process
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## 5. Contribution model
|
|
269
|
+
|
|
270
|
+
### 5.1 Normal contributor PR
|
|
271
|
+
|
|
272
|
+
A normal PR MUST NOT:
|
|
273
|
+
|
|
274
|
+
- change `package.json` version;
|
|
275
|
+
- change package-lock root version manually;
|
|
276
|
+
- create a `v*` tag;
|
|
277
|
+
- call `npm publish`;
|
|
278
|
+
- create a GitHub Release;
|
|
279
|
+
- finalize a release date/version in `CHANGELOG.md`;
|
|
280
|
+
- change `docs/releases/native-stable.md` to a not-yet-released version.
|
|
281
|
+
|
|
282
|
+
A normal PR SHOULD:
|
|
283
|
+
|
|
284
|
+
- contain one logical change;
|
|
285
|
+
- include tests for changed behavior;
|
|
286
|
+
- include direct/manual verification for user-visible behavior;
|
|
287
|
+
- update documentation where behavior changed;
|
|
288
|
+
- add a concise entry under `CHANGELOG.md -> [Unreleased]` when user-facing;
|
|
289
|
+
- identify release impact in the PR as `patch`, `minor`, `breaking`, or `none` without changing the actual version.
|
|
290
|
+
|
|
291
|
+
For external contributions, use OMP's useful attribution convention after a PR number exists:
|
|
292
|
+
|
|
293
|
+
```md
|
|
294
|
+
- Fix session reconnect after a detached host exits (#123 by @contributor).
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
For internal work linked to an issue:
|
|
298
|
+
|
|
299
|
+
```md
|
|
300
|
+
- Fix session reconnect after a detached host exits (#123).
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### 5.2 Major changes
|
|
304
|
+
|
|
305
|
+
Adopt the same conceptual split as upstream OMP:
|
|
306
|
+
|
|
307
|
+
- Small bug fixes, docs, narrow improvements: PR directly.
|
|
308
|
+
- New subsystems, broad architecture changes, security model changes, cross-cutting OMP contract changes, new runtime dependencies, or major UI redesign: discuss/approve scope before implementation.
|
|
309
|
+
|
|
310
|
+
The Bizar-specific agent guide should make this a hard instruction for coding agents: do not expand a narrowly scoped task into architecture work merely because the agent sees an opportunity.
|
|
311
|
+
|
|
312
|
+
### 5.3 Merge does not publish
|
|
313
|
+
|
|
314
|
+
Merging a PR only updates `main` and `[Unreleased]`.
|
|
315
|
+
|
|
316
|
+
```text
|
|
317
|
+
PR #101 fix -> merge
|
|
318
|
+
PR #102 feature -> merge
|
|
319
|
+
PR #103 docs -> merge
|
|
320
|
+
PR #104 OMP compatibility -> merge
|
|
321
|
+
|
|
322
|
+
main remains at the currently released package version
|
|
323
|
+
[Unreleased] accumulates the changes
|
|
324
|
+
|
|
325
|
+
maintainer later chooses release boundary
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
This is a major change from the current habit of mixing version changes with feature/release PRs.
|
|
329
|
+
|
|
330
|
+
## 6. Release decision policy
|
|
331
|
+
|
|
332
|
+
The maintainer decides when to release. CI does not infer a release from Conventional Commits and does not auto-publish after merges.
|
|
333
|
+
|
|
334
|
+
A stable release is appropriate when:
|
|
335
|
+
|
|
336
|
+
1. `main` contains a coherent set of changes worth shipping.
|
|
337
|
+
2. `[Unreleased]` accurately describes user-visible changes.
|
|
338
|
+
3. Required docs and compatibility metadata are current.
|
|
339
|
+
4. The normal CI state is green or the maintainer has intentionally authorized a documented emergency path.
|
|
340
|
+
5. No known release-blocking audit finding remains open.
|
|
341
|
+
6. The qualified OMP target still matches the package's claims.
|
|
342
|
+
|
|
343
|
+
Recommended Bizar SemVer policy while version is `<1.0.0`:
|
|
344
|
+
|
|
345
|
+
- `patch`: fixes, docs, compatibility qualification, and backward-compatible refinements.
|
|
346
|
+
- `minor`: substantial backward-compatible features OR intentionally breaking pre-1.0 changes.
|
|
347
|
+
- `major`: `1.0.0` and later major compatibility boundaries.
|
|
348
|
+
|
|
349
|
+
After `1.0.0`, use standard SemVer:
|
|
350
|
+
|
|
351
|
+
- patch = backward-compatible fixes;
|
|
352
|
+
- minor = backward-compatible features;
|
|
353
|
+
- major = breaking public contract.
|
|
354
|
+
|
|
355
|
+
Agents may recommend release impact in a PR, but the maintainer owns the final version decision.
|
|
356
|
+
|
|
357
|
+
## 7. Local release orchestrator
|
|
358
|
+
|
|
359
|
+
Create `scripts/release.mjs`, with pure helpers in `scripts/release-lib.mjs` so version/changelog logic is unit tested.
|
|
360
|
+
|
|
361
|
+
Required stable commands:
|
|
362
|
+
|
|
363
|
+
```sh
|
|
364
|
+
npm run release -- patch
|
|
365
|
+
npm run release -- minor
|
|
366
|
+
npm run release -- major
|
|
367
|
+
npm run release -- 0.8.0
|
|
368
|
+
npm run release -- watch
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
Do not advertise `canary` until it is implemented and tested end to end. If canary support is added later, it must use a prerelease version, publish with npm dist-tag `canary`, mark the GitHub Release as a prerelease, and MUST NOT promote `[Unreleased]` or update the stable-release pointer.
|
|
372
|
+
|
|
373
|
+
### 7.1 Preflight
|
|
374
|
+
|
|
375
|
+
The script MUST fail before making changes unless all are true:
|
|
376
|
+
|
|
377
|
+
- current branch is `main`;
|
|
378
|
+
- working tree is clean;
|
|
379
|
+
- local `main` equals `origin/main` after `git fetch origin main --tags`;
|
|
380
|
+
- repository contains no conflicting local release tag;
|
|
381
|
+
- package metadata is coherent before bump;
|
|
382
|
+
- current package version equals the last stable released version expected by repository policy;
|
|
383
|
+
- `[Unreleased]` exists;
|
|
384
|
+
- the selected next version is greater than the previous stable tag;
|
|
385
|
+
- `gh` is authenticated if CI watching is requested.
|
|
386
|
+
|
|
387
|
+
Never print npm/GitHub credentials.
|
|
388
|
+
|
|
389
|
+
### 7.2 Version mutation
|
|
390
|
+
|
|
391
|
+
The release script owns these version-dependent files:
|
|
392
|
+
|
|
393
|
+
- `package.json` version.
|
|
394
|
+
- `package-lock.json` root version, via npm regeneration only.
|
|
395
|
+
- `docs/compatibility/baseline.json -> package.version`.
|
|
396
|
+
- README current package pin if that pin remains in README.
|
|
397
|
+
- `CHANGELOG.md` promotion of `[Unreleased]`.
|
|
398
|
+
- `docs/releases/<version>.md`.
|
|
399
|
+
- `docs/releases/native-stable.md` for stable releases.
|
|
400
|
+
|
|
401
|
+
Do NOT let contributor PRs edit these fields as release bookkeeping.
|
|
402
|
+
|
|
403
|
+
Recommended mutation order:
|
|
404
|
+
|
|
405
|
+
1. Run `npm version <target> --no-git-tag-version --ignore-scripts` so npm updates `package.json` and the root lockfile version metadata together without creating a commit or tag.
|
|
406
|
+
2. Assert that the dependency graph in `package-lock.json` did not change except where separately authorized; a release bump must not smuggle dependency upgrades.
|
|
407
|
+
3. Update baseline `package.version`.
|
|
408
|
+
4. Promote changelog:
|
|
409
|
+
|
|
410
|
+
Before:
|
|
411
|
+
|
|
412
|
+
```md
|
|
413
|
+
## [Unreleased]
|
|
414
|
+
|
|
415
|
+
### Fixed
|
|
416
|
+
- Fix X.
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
After:
|
|
420
|
+
|
|
421
|
+
```md
|
|
422
|
+
## [Unreleased]
|
|
423
|
+
|
|
424
|
+
## [0.7.1] - 2026-09-22
|
|
425
|
+
|
|
426
|
+
### Fixed
|
|
427
|
+
- Fix X.
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
5. Generate/finalize `docs/releases/0.7.1.md` from the promoted changelog and release metadata.
|
|
431
|
+
6. Update the stable release pointer.
|
|
432
|
+
7. Run release-state verification.
|
|
433
|
+
|
|
434
|
+
### 7.3 Local checks
|
|
435
|
+
|
|
436
|
+
Before the release commit/tag exists:
|
|
437
|
+
|
|
438
|
+
```sh
|
|
439
|
+
npm ci
|
|
440
|
+
npm run check
|
|
441
|
+
npm run verify:release-state
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
When an OMP runtime is locally available, also run:
|
|
445
|
+
|
|
446
|
+
```sh
|
|
447
|
+
npm run verify:omp
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
The final authoritative OMP matrix still runs in GitHub Actions. A missing local OMP runtime is not a pass; report it as not run.
|
|
451
|
+
|
|
452
|
+
### 7.4 Release commit and tag
|
|
453
|
+
|
|
454
|
+
Use one exact commit-subject convention because CI concurrency uses it to protect release runs from cancellation:
|
|
455
|
+
|
|
456
|
+
```text
|
|
457
|
+
chore: bump version to 0.7.1
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
Create:
|
|
461
|
+
|
|
462
|
+
```text
|
|
463
|
+
v0.7.1
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
Push branch and tag atomically, using the release commit SHA as the tag source:
|
|
467
|
+
|
|
468
|
+
```sh
|
|
469
|
+
git push --atomic origin \
|
|
470
|
+
refs/heads/main:refs/heads/main \
|
|
471
|
+
<release-sha>:refs/tags/v0.7.1
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
Do not make `ci.yml` trigger on tags. The authoritative release run is the `main` push run. That run discovers the tag on its HEAD.
|
|
475
|
+
|
|
476
|
+
This follows upstream OMP's current architecture and avoids two independent branch/tag CI runs racing each other.
|
|
477
|
+
|
|
478
|
+
### 7.5 Watch CI
|
|
479
|
+
|
|
480
|
+
Port the useful behavior from OMP's `scripts/release.ts`:
|
|
481
|
+
|
|
482
|
+
- query `gh run list --commit <sha>`;
|
|
483
|
+
- wait for the `CI` run to appear;
|
|
484
|
+
- inspect in-progress jobs;
|
|
485
|
+
- fail early when a job fails;
|
|
486
|
+
- show a short tail from failed job logs;
|
|
487
|
+
- exit success only when the authoritative release CI run passes.
|
|
488
|
+
|
|
489
|
+
The release script MUST NOT call `npm publish` or `gh release create` locally during a normal release.
|
|
490
|
+
|
|
491
|
+
## 8. Unified `.github/workflows/ci.yml`
|
|
492
|
+
|
|
493
|
+
The workflow should handle three modes:
|
|
494
|
+
|
|
495
|
+
```text
|
|
496
|
+
PR -> validate only
|
|
497
|
+
ordinary main -> validate only
|
|
498
|
+
release main HEAD -> validate + publish
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
### 8.1 Triggers
|
|
502
|
+
|
|
503
|
+
Recommended:
|
|
504
|
+
|
|
505
|
+
```yaml
|
|
506
|
+
name: CI
|
|
507
|
+
|
|
508
|
+
on:
|
|
509
|
+
push:
|
|
510
|
+
branches: [main]
|
|
511
|
+
pull_request:
|
|
512
|
+
branches: [main]
|
|
513
|
+
workflow_dispatch:
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
Do not add `push.tags`. The release script pushes tag + main atomically and the main run detects the tag.
|
|
517
|
+
|
|
518
|
+
Avoid narrow path filters unless every release-sensitive path is comprehensively included. OMP explicitly learned that omitted lockfile/root paths can allow untested releases. Bizar is small enough that always running CI is safer and simpler.
|
|
519
|
+
|
|
520
|
+
### 8.2 Concurrency
|
|
521
|
+
|
|
522
|
+
Use OMP's release-safe pattern.
|
|
523
|
+
|
|
524
|
+
Conceptually:
|
|
525
|
+
|
|
526
|
+
```yaml
|
|
527
|
+
concurrency:
|
|
528
|
+
group: >-
|
|
529
|
+
${{ github.workflow }}-${{
|
|
530
|
+
(startsWith(github.event.head_commit.message, 'chore: bump version to ')
|
|
531
|
+
|| startsWith(github.ref, 'refs/tags/v')
|
|
532
|
+
|| github.event_name == 'workflow_dispatch')
|
|
533
|
+
&& format('release-{0}', github.sha)
|
|
534
|
+
|| github.ref
|
|
535
|
+
}}
|
|
536
|
+
cancel-in-progress: >-
|
|
537
|
+
${{ !(startsWith(github.event.head_commit.message, 'chore: bump version to ')
|
|
538
|
+
|| startsWith(github.ref, 'refs/tags/v')
|
|
539
|
+
|| github.event_name == 'workflow_dispatch') }}
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
Reason:
|
|
543
|
+
|
|
544
|
+
- normal PR/main churn cancels stale work;
|
|
545
|
+
- a later main push can never cancel an in-progress release publication;
|
|
546
|
+
- release runs are isolated by SHA.
|
|
547
|
+
|
|
548
|
+
### 8.3 Global permissions
|
|
549
|
+
|
|
550
|
+
Keep the workflow default minimal:
|
|
551
|
+
|
|
552
|
+
```yaml
|
|
553
|
+
permissions:
|
|
554
|
+
contents: read
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
Only the npm publication job receives `id-token: write`.
|
|
558
|
+
Only the GitHub Release job receives `contents: write`.
|
|
559
|
+
|
|
560
|
+
Do not grant publishing permissions globally or to PR jobs.
|
|
561
|
+
|
|
562
|
+
## 9. Release metadata job
|
|
563
|
+
|
|
564
|
+
Add first job:
|
|
565
|
+
|
|
566
|
+
```text
|
|
567
|
+
release_metadata
|
|
568
|
+
name: Resolve release metadata
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
Responsibilities:
|
|
572
|
+
|
|
573
|
+
1. checkout with tags available when running on `main`;
|
|
574
|
+
2. find `v*` tag pointing at HEAD;
|
|
575
|
+
3. reject multiple release tags on HEAD;
|
|
576
|
+
4. validate tag version against `package.json`;
|
|
577
|
+
5. determine release channel (stable initially; canary only after optional canary support is implemented);
|
|
578
|
+
6. output:
|
|
579
|
+
- `is-release`;
|
|
580
|
+
- `release-tag`;
|
|
581
|
+
- `version`;
|
|
582
|
+
- `channel`.
|
|
583
|
+
|
|
584
|
+
The job should use `scripts/verify-release-state.mjs` rather than duplicating all rules in shell.
|
|
585
|
+
|
|
586
|
+
A normal PR/main run returns `is-release=false` and continues as normal CI.
|
|
587
|
+
|
|
588
|
+
## 10. Validation job graph
|
|
589
|
+
|
|
590
|
+
Bizar does not need OMP's Rust/native binary fanout. A targeted graph is:
|
|
591
|
+
|
|
592
|
+
```text
|
|
593
|
+
release_metadata
|
|
594
|
+
|
|
|
595
|
+
+-------------------+--------------------+
|
|
596
|
+
| | |
|
|
597
|
+
node_matrix package_contract bun_compat
|
|
598
|
+
| | |
|
|
599
|
+
+-------------------+--------------------+
|
|
600
|
+
|
|
|
601
|
+
omp_qualification
|
|
602
|
+
|
|
|
603
|
+
release_gate
|
|
604
|
+
|
|
|
605
|
+
publish_npm
|
|
606
|
+
|
|
|
607
|
+
verify_registry
|
|
608
|
+
|
|
|
609
|
+
github_release
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
Release artifact preparation can start as soon as `package_contract` passes and run in parallel with OMP qualification:
|
|
613
|
+
|
|
614
|
+
```text
|
|
615
|
+
package_contract -> release_artifact -----+
|
|
616
|
+
|
|
|
617
|
+
omp_qualification + other CI -> release_gate
|
|
618
|
+
|
|
|
619
|
+
publish exact artifact
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
### 10.1 `node_matrix`
|
|
623
|
+
|
|
624
|
+
Keep Node 22 and 24 because the package claims Node >=22.
|
|
625
|
+
|
|
626
|
+
Recommended matrix work:
|
|
627
|
+
|
|
628
|
+
```sh
|
|
629
|
+
npm ci
|
|
630
|
+
npm test
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
Run typecheck/build once in package-contract to avoid unnecessary duplicate work, unless Node-specific type/build differences are intentionally being tested.
|
|
634
|
+
|
|
635
|
+
### 10.2 `package_contract`
|
|
636
|
+
|
|
637
|
+
Run on Node 24:
|
|
638
|
+
|
|
639
|
+
```sh
|
|
640
|
+
npm ci
|
|
641
|
+
npm run typecheck
|
|
642
|
+
npm run build
|
|
643
|
+
npm run verify:package
|
|
644
|
+
npm run verify:docs
|
|
645
|
+
npm run verify:security
|
|
646
|
+
npm run pack:check
|
|
647
|
+
npm run verify:release-state
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
This is the main deterministic package gate.
|
|
651
|
+
|
|
652
|
+
### 10.3 `bun_compatibility`
|
|
653
|
+
|
|
654
|
+
Keep Bun 1.3.14 qualification because the package explicitly supports it:
|
|
655
|
+
|
|
656
|
+
```sh
|
|
657
|
+
npm ci
|
|
658
|
+
bun run typecheck
|
|
659
|
+
bun run test
|
|
660
|
+
```
|
|
661
|
+
|
|
662
|
+
This should not be responsible for installing OMP. Keep runtime compatibility and OMP qualification separate so failures are diagnosable.
|
|
663
|
+
|
|
664
|
+
### 10.4 `omp_qualification`
|
|
665
|
+
|
|
666
|
+
This is Bizar's most important product-specific gate.
|
|
667
|
+
|
|
668
|
+
At minimum on every PR/main run, qualify:
|
|
669
|
+
|
|
670
|
+
- current supported OMP, presently 18.2.8;
|
|
671
|
+
- previous supported OMP, presently 18.2.7, if the repository continues to claim it as regression-qualified.
|
|
672
|
+
|
|
673
|
+
For a stable release, run the complete set that the package claims is qualified, or narrow the public claim to the versions actually tested.
|
|
674
|
+
|
|
675
|
+
Current code claims:
|
|
676
|
+
|
|
677
|
+
```text
|
|
678
|
+
18.2.4
|
|
679
|
+
18.2.5
|
|
680
|
+
18.2.6
|
|
681
|
+
18.2.7
|
|
682
|
+
18.2.8
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
If all five remain in `QUALIFIED_OMP_VERSIONS`, a stable release should have an auditable qualification policy for all five. A practical compromise is:
|
|
686
|
+
|
|
687
|
+
- PR/main: latest + N-1;
|
|
688
|
+
- release: full qualified matrix;
|
|
689
|
+
- scheduled compatibility watch: prospective next OMP version.
|
|
690
|
+
|
|
691
|
+
Do not hard-code that matrix in workflow YAML. Add a small script such as `scripts/print-omp-matrix.mjs` that derives the selected matrix from the canonical compatibility source (`src/omp/compatibility.ts` or a single structured compatibility manifest). An `omp_matrix` job emits JSON and `omp_qualification` consumes it with `fromJSON`. This prevents routine OMP-compatibility PRs from modifying security-sensitive workflow files.
|
|
692
|
+
|
|
693
|
+
Run packed installation against each selected version:
|
|
694
|
+
|
|
695
|
+
```sh
|
|
696
|
+
bun install --cwd "$RUNNER_TEMP/omp-host" "@oh-my-pi/pi-coding-agent@$OMP_VERSION"
|
|
697
|
+
BIZAR_OMP_PACKAGE_ROOT=... BIZAR_OMP_BIN=... npm run verify:omp
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
Do not claim a compatibility version solely because it remains in an array.
|
|
701
|
+
|
|
702
|
+
### 10.5 `release_artifact`
|
|
703
|
+
|
|
704
|
+
Run only when `release_metadata.is-release == true`.
|
|
705
|
+
|
|
706
|
+
Build and pack exactly once:
|
|
707
|
+
|
|
708
|
+
```sh
|
|
709
|
+
npm ci
|
|
710
|
+
npm run build
|
|
711
|
+
node scripts/verify-package.mjs
|
|
712
|
+
npm pack --ignore-scripts --json
|
|
713
|
+
```
|
|
714
|
+
|
|
715
|
+
Generate:
|
|
716
|
+
|
|
717
|
+
- `polderlabs-bizar-omp-X.Y.Z.tgz`;
|
|
718
|
+
- a tarball SHA-256 record;
|
|
719
|
+
- `release-receipt.partial.json` with commit/tree/version/toolchain/OMP target.
|
|
720
|
+
|
|
721
|
+
Upload these as a short-retention Actions artifact.
|
|
722
|
+
|
|
723
|
+
The publish job must download this exact tarball. Do not rebuild/repack after the release gate. Final `release-receipt.json` and `SHA256SUMS.txt` are produced only after registry verification so the receipt can contain the observed npm integrity and post-publish verification result.
|
|
724
|
+
|
|
725
|
+
## 11. Release validation gate
|
|
726
|
+
|
|
727
|
+
Add:
|
|
728
|
+
|
|
729
|
+
```text
|
|
730
|
+
release_gate
|
|
731
|
+
name: Release validation gate
|
|
732
|
+
```
|
|
733
|
+
|
|
734
|
+
It only runs for release HEADs and only succeeds when every required validation job succeeded.
|
|
735
|
+
|
|
736
|
+
For Bizar, require at least:
|
|
737
|
+
|
|
738
|
+
- Node matrix success;
|
|
739
|
+
- package contract success;
|
|
740
|
+
- Bun compatibility success;
|
|
741
|
+
- release OMP qualification matrix success;
|
|
742
|
+
- release artifact success;
|
|
743
|
+
- workflow contract/security checks success.
|
|
744
|
+
|
|
745
|
+
The gate itself should be trivial after dependencies are green, for example:
|
|
746
|
+
|
|
747
|
+
```sh
|
|
748
|
+
npm run verify:release-state
|
|
749
|
+
```
|
|
750
|
+
|
|
751
|
+
followed by a clear `release validation green` message.
|
|
752
|
+
|
|
753
|
+
This is the single publish admission point. Do not make downstream publish jobs each reinvent their own definition of green CI.
|
|
754
|
+
|
|
755
|
+
## 12. npm publication
|
|
756
|
+
|
|
757
|
+
Keep npm trusted publishing. It is better than a long-lived `NPM_TOKEN`.
|
|
758
|
+
|
|
759
|
+
Current npm documentation requires npm CLI `>=11.5.1`, Node `>=22.14.0`, a supported cloud-hosted runner, and `id-token: write`. Use GitHub-hosted Ubuntu with Node 24 and pin npm to an explicitly supported 11.x version used by the workflow.
|
|
760
|
+
|
|
761
|
+
Because BizarHarness-OMP is a private GitHub repository, npm provenance attestations are not available even though OIDC trusted publishing works. Keep this distinction explicit and set `NPM_CONFIG_PROVENANCE=false` in the publish job.
|
|
762
|
+
|
|
763
|
+
### Critical migration action
|
|
764
|
+
|
|
765
|
+
The existing npm trusted publisher is documented as pointing at `release.yml`.
|
|
766
|
+
|
|
767
|
+
After publication moves into `ci.yml`, update npm package settings:
|
|
768
|
+
|
|
769
|
+
```text
|
|
770
|
+
Provider: GitHub Actions
|
|
771
|
+
Organization: PolderLabs
|
|
772
|
+
Repository: BizarHarness-OMP
|
|
773
|
+
Workflow filename: ci.yml
|
|
774
|
+
Allowed action: npm publish
|
|
775
|
+
```
|
|
776
|
+
|
|
777
|
+
npm's current trusted-publisher configuration cannot be edited in place; delete/recreate the publisher entry if necessary.
|
|
778
|
+
|
|
779
|
+
Do this before removing `release.yml` or the first new release will fail OIDC authorization.
|
|
780
|
+
|
|
781
|
+
### Publish job
|
|
782
|
+
|
|
783
|
+
```text
|
|
784
|
+
publish_npm
|
|
785
|
+
needs: [release_metadata, release_gate, release_artifact]
|
|
786
|
+
```
|
|
787
|
+
|
|
788
|
+
Permissions:
|
|
789
|
+
|
|
790
|
+
```yaml
|
|
791
|
+
permissions:
|
|
792
|
+
contents: read
|
|
793
|
+
id-token: write
|
|
794
|
+
```
|
|
795
|
+
|
|
796
|
+
Steps:
|
|
797
|
+
|
|
798
|
+
1. download the exact tarball artifact;
|
|
799
|
+
2. install Node 24 and an explicitly pinned npm 11.x version `>=11.5.1`; disable package-manager caching for this publication job;
|
|
800
|
+
3. verify the downloaded tarball SHA-256 against the release-artifact metadata;
|
|
801
|
+
4. run `scripts/publish-release.mjs --tarball <path> --tag latest` (adapt the script to accept an explicit artifact path and dist-tag rather than relying on cwd/implicit `latest`);
|
|
802
|
+
5. keep the `npm publish` command directly in `ci.yml` rather than hiding it behind a reusable workflow unless the npm Trusted Publisher is intentionally configured for that calling workflow;
|
|
803
|
+
6. if optional canary support is later added, use `--tag canary`.
|
|
804
|
+
|
|
805
|
+
Prefer removing `NPM_TOKEN` fallback from the normal path once trusted publishing is confirmed. A long-lived token should not silently mask an OIDC configuration error.
|
|
806
|
+
|
|
807
|
+
## 13. Verify the published registry artifact
|
|
808
|
+
|
|
809
|
+
Preserve and strengthen the existing post-publish behavior.
|
|
810
|
+
|
|
811
|
+
`verify_registry` should:
|
|
812
|
+
|
|
813
|
+
1. wait for `@polderlabs/bizar-omp@X.Y.Z` to become visible;
|
|
814
|
+
2. retrieve its registry integrity;
|
|
815
|
+
3. compare unpacked published file contents/modes with the CI tarball, reusing `publish-release.mjs` logic where practical;
|
|
816
|
+
4. create a fresh OMP host;
|
|
817
|
+
5. run `npm run verify:omp:registry` against the exact published version;
|
|
818
|
+
6. fail the release chain if plugin install/discovery/doctor fails.
|
|
819
|
+
|
|
820
|
+
This is the Bizar equivalent of OMP downloading and smoke-testing an actual published binary.
|
|
821
|
+
|
|
822
|
+
## 14. GitHub Release
|
|
823
|
+
|
|
824
|
+
For Bizar, create the GitHub Release after npm registry verification. This is intentionally slightly different from OMP because Bizar's primary deliverable is the npm package, not standalone platform binaries.
|
|
825
|
+
|
|
826
|
+
Before creating the GitHub Release:
|
|
827
|
+
|
|
828
|
+
1. finalize `release-receipt.json` with observed registry integrity, registry verification result, qualification matrix outcomes, and CI run identity;
|
|
829
|
+
2. generate the final `SHA256SUMS.txt` over the exact npm `.tgz` and `release-receipt.json`;
|
|
830
|
+
3. verify those digests locally in the release job.
|
|
831
|
+
|
|
832
|
+
Attach:
|
|
833
|
+
|
|
834
|
+
- the exact npm `.tgz` artifact;
|
|
835
|
+
- `release-receipt.json`;
|
|
836
|
+
- the final `SHA256SUMS.txt`.
|
|
837
|
+
|
|
838
|
+
Generate release text from:
|
|
839
|
+
|
|
840
|
+
1. the promoted changelog section;
|
|
841
|
+
2. `docs/releases/X.Y.Z.md`;
|
|
842
|
+
3. GitHub's generated PR/contributor notes as supplemental information.
|
|
843
|
+
|
|
844
|
+
Do not let GitHub-generated notes become the only release description; Bizar's compatibility/qualification boundary is important and should be explicit.
|
|
845
|
+
|
|
846
|
+
## 15. Release receipt
|
|
847
|
+
|
|
848
|
+
Create `scripts/create-release-receipt.mjs` and make every release produce a machine-readable receipt such as:
|
|
849
|
+
|
|
850
|
+
```json
|
|
851
|
+
{
|
|
852
|
+
"schemaVersion": 1,
|
|
853
|
+
"package": {
|
|
854
|
+
"name": "@polderlabs/bizar-omp",
|
|
855
|
+
"version": "0.7.1"
|
|
856
|
+
},
|
|
857
|
+
"git": {
|
|
858
|
+
"commit": "...",
|
|
859
|
+
"tree": "...",
|
|
860
|
+
"tag": "v0.7.1"
|
|
861
|
+
},
|
|
862
|
+
"artifact": {
|
|
863
|
+
"filename": "polderlabs-bizar-omp-0.7.1.tgz",
|
|
864
|
+
"sha256": "...",
|
|
865
|
+
"npmIntegrity": "sha512-..."
|
|
866
|
+
},
|
|
867
|
+
"omp": {
|
|
868
|
+
"supported": "18.2.8",
|
|
869
|
+
"commit": "5e0fc867...",
|
|
870
|
+
"qualification": [
|
|
871
|
+
{"version": "18.2.7", "status": "passed", "job": "..."},
|
|
872
|
+
{"version": "18.2.8", "status": "passed", "job": "..."}
|
|
873
|
+
]
|
|
874
|
+
},
|
|
875
|
+
"runtime": {
|
|
876
|
+
"node": "24.x",
|
|
877
|
+
"npm": "11.x",
|
|
878
|
+
"bun": "1.3.14"
|
|
879
|
+
},
|
|
880
|
+
"ci": {
|
|
881
|
+
"repository": "PolderLabs/BizarHarness-OMP",
|
|
882
|
+
"runId": "...",
|
|
883
|
+
"runAttempt": 1
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
```
|
|
887
|
+
|
|
888
|
+
This directly addresses the repository's earlier audit concern around durable qualification evidence.
|
|
889
|
+
|
|
890
|
+
## 16. `omp-compatibility.yml` after migration
|
|
891
|
+
|
|
892
|
+
Keep this workflow separate. It is maintenance automation, not release automation.
|
|
893
|
+
|
|
894
|
+
The current workflow is conceptually good:
|
|
895
|
+
|
|
896
|
+
```text
|
|
897
|
+
schedule/manual
|
|
898
|
+
-> read currently supported OMP
|
|
899
|
+
-> read latest npm OMP
|
|
900
|
+
-> resolve immutable Git tag
|
|
901
|
+
-> obtain npm integrity
|
|
902
|
+
-> qualify packed Bizar against candidate
|
|
903
|
+
-> open normal PR
|
|
904
|
+
```
|
|
905
|
+
|
|
906
|
+
Change one critical behavior: `scripts/update-omp-compatibility.mjs` MUST stop bumping the Bizar package version.
|
|
907
|
+
|
|
908
|
+
It currently calculates a next Bizar patch version and updates package/release metadata. Under the new model that is wrong.
|
|
909
|
+
|
|
910
|
+
The compatibility updater should modify only compatibility-relevant development state:
|
|
911
|
+
|
|
912
|
+
- `src/omp/compatibility.ts`;
|
|
913
|
+
- OMP version/integrity/commit fields in compatibility docs;
|
|
914
|
+
- support matrix;
|
|
915
|
+
- OMP-specific skill fingerprint/reference files;
|
|
916
|
+
- README OMP requirements if necessary;
|
|
917
|
+
- `CHANGELOG.md [Unreleased] -> Compatibility` entry.
|
|
918
|
+
|
|
919
|
+
It MUST NOT modify:
|
|
920
|
+
|
|
921
|
+
- `package.json` version;
|
|
922
|
+
- package-lock root version;
|
|
923
|
+
- baseline `package.version`;
|
|
924
|
+
- stable release note pointer;
|
|
925
|
+
- create `docs/releases/X.Y.Z.md`;
|
|
926
|
+
- `.github/workflows/ci.yml` merely to change an OMP version literal.
|
|
927
|
+
|
|
928
|
+
Also remove broad `replaceAll(currentVersion, targetVersion)` behavior from compatibility maintenance. Historical references and release evidence must not be rewritten accidentally. Update exact structured fields/markers only, and test the resulting diff.
|
|
929
|
+
|
|
930
|
+
The automated OMP PR then behaves exactly like any other contributor PR. A maintainer later decides whether it ships in a patch/minor release.
|
|
931
|
+
|
|
932
|
+
## 17. Pull request template
|
|
933
|
+
|
|
934
|
+
Add `.github/PULL_REQUEST_TEMPLATE.md` adapted from upstream OMP but Bizar-specific:
|
|
935
|
+
|
|
936
|
+
```md
|
|
937
|
+
## What
|
|
938
|
+
|
|
939
|
+
<!-- Explain what changed. Human contributors should include at least one sentence in their own words. -->
|
|
940
|
+
|
|
941
|
+
## Why
|
|
942
|
+
|
|
943
|
+
<!-- Motivation, issue, audit finding, or approved scope. -->
|
|
944
|
+
|
|
945
|
+
## Verification
|
|
946
|
+
|
|
947
|
+
<!-- Exact checks AND the behavior exercised manually/end-to-end. -->
|
|
948
|
+
|
|
949
|
+
## Release impact
|
|
950
|
+
|
|
951
|
+
- [ ] none
|
|
952
|
+
- [ ] patch
|
|
953
|
+
- [ ] minor
|
|
954
|
+
- [ ] breaking
|
|
955
|
+
|
|
956
|
+
## Checklist
|
|
957
|
+
|
|
958
|
+
- [ ] `npm run check` passes
|
|
959
|
+
- [ ] Changed behavior was exercised directly, not only unit-tested
|
|
960
|
+
- [ ] OMP-sensitive changes ran the required native qualification
|
|
961
|
+
- [ ] `[Unreleased]` changelog updated if user-facing
|
|
962
|
+
- [ ] No package version, release tag, or published-release metadata was changed
|
|
963
|
+
- [ ] No credentials or private runtime state were added
|
|
964
|
+
```
|
|
965
|
+
|
|
966
|
+
For automated/internal PRs, the "human-written sentence" requirement can be adapted to your organization policy, but the verification and release-impact fields should remain.
|
|
967
|
+
|
|
968
|
+
## 18. Root `AGENTS.md`
|
|
969
|
+
|
|
970
|
+
Add the audited root `AGENTS.md` committed alongside this implementation guide. Treat it as the coding-agent authority contract for future work.
|
|
971
|
+
|
|
972
|
+
The root guide should be short enough that every coding agent can load it, but explicit enough to prevent the recurring failure mode where an agent treats "feature complete" as permission to bump/publish a release.
|
|
973
|
+
|
|
974
|
+
It must establish:
|
|
975
|
+
|
|
976
|
+
- normal agents work on branches/PRs;
|
|
977
|
+
- package versions are maintainer/release-script owned;
|
|
978
|
+
- all user-facing work goes to `[Unreleased]`;
|
|
979
|
+
- an agent may recommend release impact but not choose/publish a version autonomously;
|
|
980
|
+
- only an explicit release task may run `scripts/release.mjs`;
|
|
981
|
+
- never call `npm publish`, create/move release tags, or create GitHub Releases manually during ordinary coding work;
|
|
982
|
+
- exact local verification requirements;
|
|
983
|
+
- OMP contract change qualification requirements;
|
|
984
|
+
- release failure recovery rules;
|
|
985
|
+
- no hidden fallback from OIDC to long-lived tokens in the normal release path.
|
|
986
|
+
|
|
987
|
+
## 19. Workflow contract tests
|
|
988
|
+
|
|
989
|
+
The repository already learned that workflow names, mutable third-party action tags, and release documentation can drift. Add static tests.
|
|
990
|
+
|
|
991
|
+
`tests/workflow-contract.test.ts` should assert at minimum:
|
|
992
|
+
|
|
993
|
+
1. all third-party GitHub Actions are pinned to full commit SHAs, except explicitly allowlisted first-party/local cases if you choose that policy;
|
|
994
|
+
2. `ci.yml` contains `Release validation gate`;
|
|
995
|
+
3. `ci.yml` has no direct tag push trigger;
|
|
996
|
+
4. npm publish job has `id-token: write`;
|
|
997
|
+
5. PR validation jobs do not have `id-token: write` or `contents: write`;
|
|
998
|
+
6. release publication needs the release gate;
|
|
999
|
+
7. no active `release.yml`/`immutable-tag.yml` remains after migration;
|
|
1000
|
+
8. OMP compatibility workflow does not mutate package release version;
|
|
1001
|
+
9. package version metadata consistency script passes;
|
|
1002
|
+
10. documented workflow filename for npm trusted publishing is `ci.yml`.
|
|
1003
|
+
|
|
1004
|
+
This should be part of `npm run check`.
|
|
1005
|
+
|
|
1006
|
+
## 20. GitHub repository settings
|
|
1007
|
+
|
|
1008
|
+
When repository plan/capabilities permit, configure a ruleset for `main`:
|
|
1009
|
+
|
|
1010
|
+
- require pull request for ordinary contributors;
|
|
1011
|
+
- require current CI checks;
|
|
1012
|
+
- require conversation resolution;
|
|
1013
|
+
- block force pushes and deletion;
|
|
1014
|
+
- allow a small maintainer/release role to bypass specifically for the release script's atomic main+tag push.
|
|
1015
|
+
Current repository documentation says branch protection/rulesets are unavailable on the active private-repository plan. Until that changes, describe PR/release discipline as required process, not technically enforced policy.
|
|
1016
|
+
|
|
1017
|
+
Do not claim CI blocks direct pushes if GitHub settings do not actually enforce it.
|
|
1018
|
+
|
|
1019
|
+
## 21. npm settings migration
|
|
1020
|
+
|
|
1021
|
+
Before first release from unified `ci.yml`:
|
|
1022
|
+
|
|
1023
|
+
1. Confirm `@polderlabs/bizar-omp` Trusted Publisher currently points at `release.yml`.
|
|
1024
|
+
2. Delete/recreate the publisher for `ci.yml` if necessary.
|
|
1025
|
+
3. Allow direct `npm publish` for that publisher.
|
|
1026
|
+
4. Keep the publishing job on a GitHub-hosted runner.
|
|
1027
|
+
5. Do not rely on `npm whoami` to test OIDC; trusted publishing token exchange happens at publish time.
|
|
1028
|
+
6. Keep `NPM_CONFIG_PROVENANCE=false` while the source repository is private.
|
|
1029
|
+
7. Remove/disable long-lived publish token fallback from the normal CI path once OIDC is proven.
|
|
1030
|
+
|
|
1031
|
+
## 22. Failure and recovery policy
|
|
1032
|
+
|
|
1033
|
+
Release recovery must distinguish pre-publication from post-publication failure.
|
|
1034
|
+
|
|
1035
|
+
### Before npm publication succeeded
|
|
1036
|
+
|
|
1037
|
+
If the release CI fails before npm contains the version:
|
|
1038
|
+
|
|
1039
|
+
1. fix the defect on the release commit/version;
|
|
1040
|
+
2. preserve the exact release commit subject convention;
|
|
1041
|
+
3. move/recreate the release tag to the corrected commit only while the version is still unpublished;
|
|
1042
|
+
4. push corrected main+tag atomically;
|
|
1043
|
+
5. watch CI again.
|
|
1044
|
+
|
|
1045
|
+
The release script may provide a `retry`/`watch` mode, but must check the registry first.
|
|
1046
|
+
|
|
1047
|
+
### After npm publication succeeded
|
|
1048
|
+
|
|
1049
|
+
npm versions are immutable. Never move the same version tag to different contents after npm has published that version.
|
|
1050
|
+
|
|
1051
|
+
If a defect is found after publication:
|
|
1052
|
+
|
|
1053
|
+
1. leave the published tag/version immutable;
|
|
1054
|
+
2. fix on `main`;
|
|
1055
|
+
3. add the fix to `[Unreleased]`;
|
|
1056
|
+
4. cut a new patch/minor version.
|
|
1057
|
+
|
|
1058
|
+
If GitHub Release creation fails after npm publication, rerunning CI may recreate the GitHub Release only if it verifies that the exact npm artifact matches the CI tarball.
|
|
1059
|
+
|
|
1060
|
+
## 23. Emergency/manual release path
|
|
1061
|
+
|
|
1062
|
+
Keep an emergency path, but make it explicitly exceptional.
|
|
1063
|
+
|
|
1064
|
+
A coding agent must never select this path on its own.
|
|
1065
|
+
|
|
1066
|
+
An authorized maintainer must explicitly state that GitHub Actions is unavailable and authorize the override.
|
|
1067
|
+
|
|
1068
|
+
The manual path must generate the same release receipt and record:
|
|
1069
|
+
|
|
1070
|
+
- commit/tree/tag;
|
|
1071
|
+
- package tarball SHA-256 and npm integrity;
|
|
1072
|
+
- OMP version/commit/integrity;
|
|
1073
|
+
- Node/npm/Bun versions;
|
|
1074
|
+
- exact verification commands and results;
|
|
1075
|
+
- operator identity/authorization;
|
|
1076
|
+
- reason CI was unavailable.
|
|
1077
|
+
|
|
1078
|
+
Do not describe such a release as CI-green.
|
|
1079
|
+
|
|
1080
|
+
## 24. Recommended implementation sequence
|
|
1081
|
+
|
|
1082
|
+
### Phase 0 - normalize current state
|
|
1083
|
+
|
|
1084
|
+
1. Determine whether `0.7.0` is actually published.
|
|
1085
|
+
2. Reconcile `package.json`, package-lock root metadata, and baseline package version.
|
|
1086
|
+
3. Regenerate `package-lock.json` with npm and review the transitive-version corrections.
|
|
1087
|
+
4. Run `npm ci`, tests, package/docs/security verification.
|
|
1088
|
+
5. Commit this as a dedicated metadata/lockfile repair if needed.
|
|
1089
|
+
|
|
1090
|
+
Do not build the new release automation on top of incoherent version state.
|
|
1091
|
+
|
|
1092
|
+
### Phase 1 - contribution contract
|
|
1093
|
+
|
|
1094
|
+
1. Add `[Unreleased]` to `CHANGELOG.md`.
|
|
1095
|
+
2. Add root `AGENTS.md` from the provided draft.
|
|
1096
|
+
3. Rewrite `CONTRIBUTING.md` around contributor-vs-maintainer responsibilities.
|
|
1097
|
+
4. Add `.github/PULL_REQUEST_TEMPLATE.md`.
|
|
1098
|
+
5. Add `npm run check` and `check:full`.
|
|
1099
|
+
6. Make `Makefile` call the canonical commands.
|
|
1100
|
+
|
|
1101
|
+
### Phase 2 - release script
|
|
1102
|
+
|
|
1103
|
+
1. Add `release-lib.mjs` pure functions.
|
|
1104
|
+
2. Add unit tests.
|
|
1105
|
+
3. Add `verify-release-state.mjs`.
|
|
1106
|
+
4. Add `release.mjs` preflight/version/changelog/commit/tag/atomic-push/watch flow.
|
|
1107
|
+
5. Ensure package-lock is regenerated by npm.
|
|
1108
|
+
6. Add release receipt generator.
|
|
1109
|
+
|
|
1110
|
+
Do not publish yet. Test the script in dry-run mode and disposable branches/repos first.
|
|
1111
|
+
|
|
1112
|
+
### Phase 3 - unified CI
|
|
1113
|
+
|
|
1114
|
+
1. Add release_metadata to `ci.yml`.
|
|
1115
|
+
2. Separate Node/package/Bun/OMP jobs cleanly.
|
|
1116
|
+
3. Add release artifact preparation.
|
|
1117
|
+
4. Add release validation gate.
|
|
1118
|
+
5. Add npm publish job.
|
|
1119
|
+
6. Add registry verification.
|
|
1120
|
+
7. Add GitHub Release creation.
|
|
1121
|
+
8. Add workflow contract tests.
|
|
1122
|
+
9. Keep old release workflows temporarily disabled or on a test branch until the new workflow is proven.
|
|
1123
|
+
|
|
1124
|
+
### Phase 4 - OMP compatibility automation
|
|
1125
|
+
|
|
1126
|
+
1. Remove Bizar version bumping from `update-omp-compatibility.mjs`.
|
|
1127
|
+
2. Remove workflow-YAML version rewriting and broad version-string replacement; update exact compatibility fields only.
|
|
1128
|
+
3. Make it write an `[Unreleased]` compatibility entry.
|
|
1129
|
+
4. Keep immutable OMP tag+integrity verification.
|
|
1130
|
+
5. Keep automated qualification PRs.
|
|
1131
|
+
6. Ensure those PRs pass the same contributor CI as all others.
|
|
1132
|
+
|
|
1133
|
+
### Phase 5 - credential/settings cutover
|
|
1134
|
+
|
|
1135
|
+
1. Change npm Trusted Publisher from `release.yml` to `ci.yml`.
|
|
1136
|
+
2. Confirm OIDC with a controlled release (or a canary only after canary semantics are explicitly implemented).
|
|
1137
|
+
3. Remove normal-path `NPM_TOKEN` fallback.
|
|
1138
|
+
4. Delete/retire `release.yml` and `immutable-tag.yml` only after the unified path succeeds.
|
|
1139
|
+
|
|
1140
|
+
### Phase 6 - GitHub governance
|
|
1141
|
+
|
|
1142
|
+
1. Configure main ruleset if available.
|
|
1143
|
+
2. Mark the stable CI jobs as required.
|
|
1144
|
+
3. Give only maintainers/release role bypass for atomic releases.
|
|
1145
|
+
4. Keep workflow/security files under maintainer review, optionally via CODEOWNERS once the correct GitHub team/user names are known.
|
|
1146
|
+
|
|
1147
|
+
## 25. Acceptance criteria for the migration
|
|
1148
|
+
|
|
1149
|
+
Do not call the migration complete until all of the following are demonstrated.
|
|
1150
|
+
|
|
1151
|
+
### Contributor path
|
|
1152
|
+
|
|
1153
|
+
- A normal PR cannot publish anything.
|
|
1154
|
+
- A normal PR leaves package version unchanged.
|
|
1155
|
+
- A user-facing PR adds to `[Unreleased]`.
|
|
1156
|
+
- Node 22/24, Bun, package/security/docs checks run.
|
|
1157
|
+
- OMP-sensitive code is qualified against the declared PR matrix.
|
|
1158
|
+
|
|
1159
|
+
### Ordinary main path
|
|
1160
|
+
|
|
1161
|
+
- Merge to main runs CI only.
|
|
1162
|
+
- No release/tag/npm/GitHub Release is created.
|
|
1163
|
+
- Another main push can cancel an obsolete normal main run if desired.
|
|
1164
|
+
|
|
1165
|
+
### Release path
|
|
1166
|
+
|
|
1167
|
+
- `npm run release -- patch` from clean main creates exactly one version commit and matching tag.
|
|
1168
|
+
- main+tag are pushed atomically.
|
|
1169
|
+
- only one authoritative CI run handles the release.
|
|
1170
|
+
- a later normal main push does not cancel the release run.
|
|
1171
|
+
- release artifact builds before/alongside qualification but cannot publish before `release_gate`.
|
|
1172
|
+
- npm publication uses OIDC trusted publishing from a GitHub-hosted runner with npm `>=11.5.1` and Node `>=22.14.0`.
|
|
1173
|
+
- exact published npm contents match the CI tarball.
|
|
1174
|
+
- registry plugin install + OMP doctor pass for the published version.
|
|
1175
|
+
- GitHub Release contains the same tarball, checksums, and receipt.
|
|
1176
|
+
- rerunning the same release is idempotent when published contents match.
|
|
1177
|
+
- a same-version content mismatch fails closed.
|
|
1178
|
+
|
|
1179
|
+
### Governance/documentation
|
|
1180
|
+
|
|
1181
|
+
- `AGENTS.md`, `CONTRIBUTING.md`, PR template, `docs/releases/npm-publishing.md`, and workflow behavior agree.
|
|
1182
|
+
- version metadata cannot drift without CI failing.
|
|
1183
|
+
- workflow action pins cannot drift to mutable tags without CI failing.
|
|
1184
|
+
- compatibility claims match versions actually tested.
|
|
1185
|
+
|
|
1186
|
+
## 26. Important deliberate deviations from upstream OMP
|
|
1187
|
+
|
|
1188
|
+
Do not copy these upstream elements into Bizar unless Bizar actually needs them:
|
|
1189
|
+
|
|
1190
|
+
- Rust validation.
|
|
1191
|
+
- Bazel native addon builds.
|
|
1192
|
+
- Linux/macOS/Windows binary build matrices.
|
|
1193
|
+
- native leaf npm packages.
|
|
1194
|
+
- Homebrew publication.
|
|
1195
|
+
- macOS signing/notarization.
|
|
1196
|
+
|
|
1197
|
+
Bizar should copy OMP's control architecture, not its product-specific build graph:
|
|
1198
|
+
|
|
1199
|
+
```text
|
|
1200
|
+
release detection
|
|
1201
|
+
+ release-safe concurrency
|
|
1202
|
+
+ one authoritative CI run
|
|
1203
|
+
+ build/qualification overlap
|
|
1204
|
+
+ one release gate
|
|
1205
|
+
+ OIDC publication
|
|
1206
|
+
+ verification of the actually published artifact
|
|
1207
|
+
+ atomic version commit/tag push
|
|
1208
|
+
+ maintainer-owned release decision
|
|
1209
|
+
```
|
|
1210
|
+
|
|
1211
|
+
That is the part that fits BizarHarness-OMP directly.
|
|
1212
|
+
|
|
1213
|
+
## 27. Source references used for this design
|
|
1214
|
+
|
|
1215
|
+
BizarHarness-OMP current state:
|
|
1216
|
+
|
|
1217
|
+
- `package.json` at `064578c3ea60d5b9ec891610ee08b09d92c908fc`
|
|
1218
|
+
- `package-lock.json` at the same commit
|
|
1219
|
+
- `.github/workflows/ci.yml`
|
|
1220
|
+
- `.github/workflows/release.yml`
|
|
1221
|
+
- `.github/workflows/immutable-tag.yml`
|
|
1222
|
+
- `.github/workflows/omp-compatibility.yml`
|
|
1223
|
+
- `scripts/publish-release.mjs`
|
|
1224
|
+
- `scripts/verify-release.mjs`
|
|
1225
|
+
- `scripts/update-omp-compatibility.mjs`
|
|
1226
|
+
- `scripts/verify-omp-install.mjs`
|
|
1227
|
+
- `scripts/verify-omp-plugin-install.mjs`
|
|
1228
|
+
- `CONTRIBUTING.md`
|
|
1229
|
+
- `CHANGELOG.md`
|
|
1230
|
+
- `docs/compatibility/baseline.json`
|
|
1231
|
+
- `docs/releases/npm-publishing.md`
|
|
1232
|
+
- full-repository audit and closure PR #75
|
|
1233
|
+
|
|
1234
|
+
Upstream oh-my-pi reference:
|
|
1235
|
+
|
|
1236
|
+
- `can1357/oh-my-pi` `0f9139f546e1dcb0e63ce35f1236509c4cca66c1`
|
|
1237
|
+
- `.github/workflows/ci.yml`
|
|
1238
|
+
- `scripts/release.ts`
|
|
1239
|
+
- `CONTRIBUTING.md`
|
|
1240
|
+
- `.github/PULL_REQUEST_TEMPLATE.md`
|
|
1241
|
+
- `.omp/commands/release.md`
|
|
1242
|
+
|
|
1243
|
+
Upstream OMP's current key mechanics verified in source:
|
|
1244
|
+
|
|
1245
|
+
- main-only push CI with tag-on-HEAD release detection;
|
|
1246
|
+
- atomic main+tag release push;
|
|
1247
|
+
- release-safe per-SHA concurrency;
|
|
1248
|
+
- validation fanout plus one `release_gate`;
|
|
1249
|
+
- build work overlapping validation;
|
|
1250
|
+
- publish jobs gated on release validation;
|
|
1251
|
+
- npm OIDC publishing with job-scoped `id-token: write`;
|
|
1252
|
+
- post-publication artifact verification;
|
|
1253
|
+
- contributor changelog requirements and explicit manual release decision.
|
|
1254
|
+
|
|
1255
|
+
Current external documentation checked during the final audit:
|
|
1256
|
+
|
|
1257
|
+
- npm Trusted Publishing documentation: workflow filename binding, GitHub-hosted runner requirement, npm `>=11.5.1`, Node `>=22.14.0`, private-repository provenance limitation, and immutable publisher configuration.
|
|
1258
|
+
- npm `version` documentation: `npm version` updates `package.json` and `package-lock.json`, while `--no-git-tag-version` suppresses npm-created commits/tags.
|
|
1259
|
+
- GitHub Actions workflow syntax: expression-based `concurrency.cancel-in-progress` is supported.
|