@cleocode/cleo 2026.3.37 → 2026.3.39
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/LICENSE +21 -0
- package/README.md +565 -0
- package/bin/postinstall.js +0 -0
- package/completions/bash-completion.sh +0 -0
- package/completions/zsh-completion.zsh +0 -0
- package/dist/cli/index.js +3507 -3631
- package/dist/cli/index.js.map +4 -4
- package/dist/mcp/index.js +3311 -3215
- package/dist/mcp/index.js.map +4 -4
- package/migrations/drizzle-brain/20260318205549_initial/migration.sql +0 -0
- package/migrations/drizzle-brain/20260318205549_initial/snapshot.json +0 -0
- package/migrations/drizzle-nexus/20260318205558_initial/migration.sql +0 -0
- package/migrations/drizzle-nexus/20260318205558_initial/snapshot.json +0 -0
- package/migrations/drizzle-tasks/20260318205539_initial/migration.sql +0 -0
- package/migrations/drizzle-tasks/20260318205539_initial/snapshot.json +0 -0
- package/package.json +17 -12
- package/dist/cli/commander-shim.d.ts +0 -108
- package/dist/cli/commander-shim.d.ts.map +0 -1
- package/dist/cli/commander-shim.js +0 -229
- package/dist/cli/commander-shim.js.map +0 -1
- package/dist/cli/commands/add.d.ts +0 -12
- package/dist/cli/commands/add.d.ts.map +0 -1
- package/dist/cli/commands/add.js +0 -91
- package/dist/cli/commands/add.js.map +0 -1
- package/dist/cli/commands/adr.d.ts +0 -27
- package/dist/cli/commands/adr.d.ts.map +0 -1
- package/dist/cli/commands/adr.js +0 -79
- package/dist/cli/commands/adr.js.map +0 -1
- package/dist/cli/commands/analyze.d.ts +0 -12
- package/dist/cli/commands/analyze.d.ts.map +0 -1
- package/dist/cli/commands/analyze.js +0 -20
- package/dist/cli/commands/analyze.js.map +0 -1
- package/dist/cli/commands/archive-stats.d.ts +0 -18
- package/dist/cli/commands/archive-stats.d.ts.map +0 -1
- package/dist/cli/commands/archive-stats.js +0 -49
- package/dist/cli/commands/archive-stats.js.map +0 -1
- package/dist/cli/commands/archive.d.ts +0 -12
- package/dist/cli/commands/archive.d.ts.map +0 -1
- package/dist/cli/commands/archive.js +0 -32
- package/dist/cli/commands/archive.js.map +0 -1
- package/dist/cli/commands/backup.d.ts +0 -8
- package/dist/cli/commands/backup.d.ts.map +0 -1
- package/dist/cli/commands/backup.js +0 -35
- package/dist/cli/commands/backup.js.map +0 -1
- package/dist/cli/commands/blockers.d.ts +0 -7
- package/dist/cli/commands/blockers.d.ts.map +0 -1
- package/dist/cli/commands/blockers.js +0 -16
- package/dist/cli/commands/blockers.js.map +0 -1
- package/dist/cli/commands/briefing.d.ts +0 -22
- package/dist/cli/commands/briefing.d.ts.map +0 -1
- package/dist/cli/commands/briefing.js +0 -45
- package/dist/cli/commands/briefing.js.map +0 -1
- package/dist/cli/commands/bug.d.ts +0 -12
- package/dist/cli/commands/bug.d.ts.map +0 -1
- package/dist/cli/commands/bug.js +0 -81
- package/dist/cli/commands/bug.js.map +0 -1
- package/dist/cli/commands/checkpoint.d.ts +0 -15
- package/dist/cli/commands/checkpoint.d.ts.map +0 -1
- package/dist/cli/commands/checkpoint.js +0 -92
- package/dist/cli/commands/checkpoint.js.map +0 -1
- package/dist/cli/commands/commands.d.ts +0 -13
- package/dist/cli/commands/commands.d.ts.map +0 -1
- package/dist/cli/commands/commands.js +0 -30
- package/dist/cli/commands/commands.js.map +0 -1
- package/dist/cli/commands/complete.d.ts +0 -12
- package/dist/cli/commands/complete.d.ts.map +0 -1
- package/dist/cli/commands/complete.js +0 -43
- package/dist/cli/commands/complete.js.map +0 -1
- package/dist/cli/commands/compliance.d.ts +0 -8
- package/dist/cli/commands/compliance.d.ts.map +0 -1
- package/dist/cli/commands/compliance.js +0 -85
- package/dist/cli/commands/compliance.js.map +0 -1
- package/dist/cli/commands/config.d.ts +0 -9
- package/dist/cli/commands/config.d.ts.map +0 -1
- package/dist/cli/commands/config.js +0 -43
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/consensus.d.ts +0 -13
- package/dist/cli/commands/consensus.d.ts.map +0 -1
- package/dist/cli/commands/consensus.js +0 -45
- package/dist/cli/commands/consensus.js.map +0 -1
- package/dist/cli/commands/context.d.ts +0 -8
- package/dist/cli/commands/context.d.ts.map +0 -1
- package/dist/cli/commands/context.js +0 -40
- package/dist/cli/commands/context.js.map +0 -1
- package/dist/cli/commands/contribution.d.ts +0 -13
- package/dist/cli/commands/contribution.d.ts.map +0 -1
- package/dist/cli/commands/contribution.js +0 -41
- package/dist/cli/commands/contribution.js.map +0 -1
- package/dist/cli/commands/current.d.ts +0 -13
- package/dist/cli/commands/current.d.ts.map +0 -1
- package/dist/cli/commands/current.js +0 -20
- package/dist/cli/commands/current.js.map +0 -1
- package/dist/cli/commands/dash.d.ts +0 -12
- package/dist/cli/commands/dash.d.ts.map +0 -1
- package/dist/cli/commands/dash.js +0 -24
- package/dist/cli/commands/dash.js.map +0 -1
- package/dist/cli/commands/decomposition.d.ts +0 -13
- package/dist/cli/commands/decomposition.d.ts.map +0 -1
- package/dist/cli/commands/decomposition.js +0 -45
- package/dist/cli/commands/decomposition.js.map +0 -1
- package/dist/cli/commands/delete.d.ts +0 -12
- package/dist/cli/commands/delete.d.ts.map +0 -1
- package/dist/cli/commands/delete.js +0 -37
- package/dist/cli/commands/delete.js.map +0 -1
- package/dist/cli/commands/deps.d.ts +0 -9
- package/dist/cli/commands/deps.d.ts.map +0 -1
- package/dist/cli/commands/deps.js +0 -73
- package/dist/cli/commands/deps.js.map +0 -1
- package/dist/cli/commands/detect-drift.d.ts +0 -15
- package/dist/cli/commands/detect-drift.d.ts.map +0 -1
- package/dist/cli/commands/detect-drift.js +0 -385
- package/dist/cli/commands/detect-drift.js.map +0 -1
- package/dist/cli/commands/docs.d.ts +0 -13
- package/dist/cli/commands/docs.d.ts.map +0 -1
- package/dist/cli/commands/docs.js +0 -170
- package/dist/cli/commands/docs.js.map +0 -1
- package/dist/cli/commands/doctor.d.ts +0 -11
- package/dist/cli/commands/doctor.d.ts.map +0 -1
- package/dist/cli/commands/doctor.js +0 -54
- package/dist/cli/commands/doctor.js.map +0 -1
- package/dist/cli/commands/dynamic.d.ts +0 -24
- package/dist/cli/commands/dynamic.d.ts.map +0 -1
- package/dist/cli/commands/dynamic.js +0 -27
- package/dist/cli/commands/dynamic.js.map +0 -1
- package/dist/cli/commands/env.d.ts +0 -12
- package/dist/cli/commands/env.d.ts.map +0 -1
- package/dist/cli/commands/env.js +0 -44
- package/dist/cli/commands/env.js.map +0 -1
- package/dist/cli/commands/exists.d.ts +0 -7
- package/dist/cli/commands/exists.d.ts.map +0 -1
- package/dist/cli/commands/exists.js +0 -33
- package/dist/cli/commands/exists.js.map +0 -1
- package/dist/cli/commands/export-tasks.d.ts +0 -10
- package/dist/cli/commands/export-tasks.d.ts.map +0 -1
- package/dist/cli/commands/export-tasks.js +0 -47
- package/dist/cli/commands/export-tasks.js.map +0 -1
- package/dist/cli/commands/export.d.ts +0 -9
- package/dist/cli/commands/export.d.ts.map +0 -1
- package/dist/cli/commands/export.js +0 -46
- package/dist/cli/commands/export.js.map +0 -1
- package/dist/cli/commands/extract.d.ts +0 -16
- package/dist/cli/commands/extract.d.ts.map +0 -1
- package/dist/cli/commands/extract.js +0 -43
- package/dist/cli/commands/extract.js.map +0 -1
- package/dist/cli/commands/find.d.ts +0 -14
- package/dist/cli/commands/find.d.ts.map +0 -1
- package/dist/cli/commands/find.js +0 -70
- package/dist/cli/commands/find.js.map +0 -1
- package/dist/cli/commands/generate-changelog.d.ts +0 -14
- package/dist/cli/commands/generate-changelog.d.ts.map +0 -1
- package/dist/cli/commands/generate-changelog.js +0 -252
- package/dist/cli/commands/generate-changelog.js.map +0 -1
- package/dist/cli/commands/grade.d.ts +0 -13
- package/dist/cli/commands/grade.d.ts.map +0 -1
- package/dist/cli/commands/grade.js +0 -16
- package/dist/cli/commands/grade.js.map +0 -1
- package/dist/cli/commands/history.d.ts +0 -9
- package/dist/cli/commands/history.d.ts.map +0 -1
- package/dist/cli/commands/history.js +0 -30
- package/dist/cli/commands/history.js.map +0 -1
- package/dist/cli/commands/implementation.d.ts +0 -13
- package/dist/cli/commands/implementation.d.ts.map +0 -1
- package/dist/cli/commands/implementation.js +0 -41
- package/dist/cli/commands/implementation.js.map +0 -1
- package/dist/cli/commands/import-tasks.d.ts +0 -10
- package/dist/cli/commands/import-tasks.d.ts.map +0 -1
- package/dist/cli/commands/import-tasks.js +0 -38
- package/dist/cli/commands/import-tasks.js.map +0 -1
- package/dist/cli/commands/import.d.ts +0 -9
- package/dist/cli/commands/import.d.ts.map +0 -1
- package/dist/cli/commands/import.js +0 -28
- package/dist/cli/commands/import.js.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -34
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js +0 -94
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/inject.d.ts +0 -8
- package/dist/cli/commands/inject.d.ts.map +0 -1
- package/dist/cli/commands/inject.js +0 -28
- package/dist/cli/commands/inject.js.map +0 -1
- package/dist/cli/commands/install-global.d.ts +0 -19
- package/dist/cli/commands/install-global.d.ts.map +0 -1
- package/dist/cli/commands/install-global.js +0 -54
- package/dist/cli/commands/install-global.js.map +0 -1
- package/dist/cli/commands/issue.d.ts +0 -14
- package/dist/cli/commands/issue.d.ts.map +0 -1
- package/dist/cli/commands/issue.js +0 -105
- package/dist/cli/commands/issue.js.map +0 -1
- package/dist/cli/commands/labels.d.ts +0 -13
- package/dist/cli/commands/labels.d.ts.map +0 -1
- package/dist/cli/commands/labels.js +0 -44
- package/dist/cli/commands/labels.js.map +0 -1
- package/dist/cli/commands/lifecycle.d.ts +0 -8
- package/dist/cli/commands/lifecycle.d.ts.map +0 -1
- package/dist/cli/commands/lifecycle.js +0 -72
- package/dist/cli/commands/lifecycle.js.map +0 -1
- package/dist/cli/commands/list.d.ts +0 -14
- package/dist/cli/commands/list.d.ts.map +0 -1
- package/dist/cli/commands/list.js +0 -71
- package/dist/cli/commands/list.js.map +0 -1
- package/dist/cli/commands/log.d.ts +0 -12
- package/dist/cli/commands/log.d.ts.map +0 -1
- package/dist/cli/commands/log.js +0 -30
- package/dist/cli/commands/log.js.map +0 -1
- package/dist/cli/commands/map.d.ts +0 -10
- package/dist/cli/commands/map.d.ts.map +0 -1
- package/dist/cli/commands/map.js +0 -23
- package/dist/cli/commands/map.js.map +0 -1
- package/dist/cli/commands/mcp-install.d.ts +0 -17
- package/dist/cli/commands/mcp-install.d.ts.map +0 -1
- package/dist/cli/commands/mcp-install.js +0 -128
- package/dist/cli/commands/mcp-install.js.map +0 -1
- package/dist/cli/commands/memory-brain.d.ts +0 -14
- package/dist/cli/commands/memory-brain.d.ts.map +0 -1
- package/dist/cli/commands/memory-brain.js +0 -151
- package/dist/cli/commands/memory-brain.js.map +0 -1
- package/dist/cli/commands/migrate-claude-mem.d.ts +0 -18
- package/dist/cli/commands/migrate-claude-mem.d.ts.map +0 -1
- package/dist/cli/commands/migrate-claude-mem.js +0 -60
- package/dist/cli/commands/migrate-claude-mem.js.map +0 -1
- package/dist/cli/commands/next.d.ts +0 -9
- package/dist/cli/commands/next.d.ts.map +0 -1
- package/dist/cli/commands/next.js +0 -20
- package/dist/cli/commands/next.js.map +0 -1
- package/dist/cli/commands/nexus.d.ts +0 -16
- package/dist/cli/commands/nexus.d.ts.map +0 -1
- package/dist/cli/commands/nexus.js +0 -155
- package/dist/cli/commands/nexus.js.map +0 -1
- package/dist/cli/commands/observe.d.ts +0 -9
- package/dist/cli/commands/observe.d.ts.map +0 -1
- package/dist/cli/commands/observe.js +0 -39
- package/dist/cli/commands/observe.js.map +0 -1
- package/dist/cli/commands/ops.d.ts +0 -10
- package/dist/cli/commands/ops.d.ts.map +0 -1
- package/dist/cli/commands/ops.js +0 -19
- package/dist/cli/commands/ops.js.map +0 -1
- package/dist/cli/commands/orchestrate.d.ts +0 -8
- package/dist/cli/commands/orchestrate.d.ts.map +0 -1
- package/dist/cli/commands/orchestrate.js +0 -58
- package/dist/cli/commands/orchestrate.js.map +0 -1
- package/dist/cli/commands/otel.d.ts +0 -12
- package/dist/cli/commands/otel.d.ts.map +0 -1
- package/dist/cli/commands/otel.js +0 -128
- package/dist/cli/commands/otel.js.map +0 -1
- package/dist/cli/commands/phase.d.ts +0 -12
- package/dist/cli/commands/phase.d.ts.map +0 -1
- package/dist/cli/commands/phase.js +0 -88
- package/dist/cli/commands/phase.js.map +0 -1
- package/dist/cli/commands/phases.d.ts +0 -12
- package/dist/cli/commands/phases.d.ts.map +0 -1
- package/dist/cli/commands/phases.js +0 -37
- package/dist/cli/commands/phases.js.map +0 -1
- package/dist/cli/commands/plan.d.ts +0 -8
- package/dist/cli/commands/plan.d.ts.map +0 -1
- package/dist/cli/commands/plan.js +0 -15
- package/dist/cli/commands/plan.js.map +0 -1
- package/dist/cli/commands/promote.d.ts +0 -7
- package/dist/cli/commands/promote.d.ts.map +0 -1
- package/dist/cli/commands/promote.js +0 -15
- package/dist/cli/commands/promote.js.map +0 -1
- package/dist/cli/commands/refresh-memory.d.ts +0 -9
- package/dist/cli/commands/refresh-memory.d.ts.map +0 -1
- package/dist/cli/commands/refresh-memory.js +0 -24
- package/dist/cli/commands/refresh-memory.js.map +0 -1
- package/dist/cli/commands/relates.d.ts +0 -12
- package/dist/cli/commands/relates.d.ts.map +0 -1
- package/dist/cli/commands/relates.js +0 -53
- package/dist/cli/commands/relates.js.map +0 -1
- package/dist/cli/commands/release.d.ts +0 -8
- package/dist/cli/commands/release.d.ts.map +0 -1
- package/dist/cli/commands/release.js +0 -72
- package/dist/cli/commands/release.js.map +0 -1
- package/dist/cli/commands/remote.d.ts +0 -12
- package/dist/cli/commands/remote.d.ts.map +0 -1
- package/dist/cli/commands/remote.js +0 -207
- package/dist/cli/commands/remote.js.map +0 -1
- package/dist/cli/commands/reorder.d.ts +0 -7
- package/dist/cli/commands/reorder.d.ts.map +0 -1
- package/dist/cli/commands/reorder.js +0 -20
- package/dist/cli/commands/reorder.js.map +0 -1
- package/dist/cli/commands/reparent.d.ts +0 -10
- package/dist/cli/commands/reparent.d.ts.map +0 -1
- package/dist/cli/commands/reparent.js +0 -19
- package/dist/cli/commands/reparent.js.map +0 -1
- package/dist/cli/commands/research.d.ts +0 -8
- package/dist/cli/commands/research.d.ts.map +0 -1
- package/dist/cli/commands/research.js +0 -129
- package/dist/cli/commands/research.js.map +0 -1
- package/dist/cli/commands/restore.d.ts +0 -11
- package/dist/cli/commands/restore.d.ts.map +0 -1
- package/dist/cli/commands/restore.js +0 -225
- package/dist/cli/commands/restore.js.map +0 -1
- package/dist/cli/commands/roadmap.d.ts +0 -8
- package/dist/cli/commands/roadmap.d.ts.map +0 -1
- package/dist/cli/commands/roadmap.js +0 -21
- package/dist/cli/commands/roadmap.js.map +0 -1
- package/dist/cli/commands/safestop.d.ts +0 -14
- package/dist/cli/commands/safestop.d.ts.map +0 -1
- package/dist/cli/commands/safestop.js +0 -32
- package/dist/cli/commands/safestop.js.map +0 -1
- package/dist/cli/commands/self-update.d.ts +0 -15
- package/dist/cli/commands/self-update.d.ts.map +0 -1
- package/dist/cli/commands/self-update.js +0 -332
- package/dist/cli/commands/self-update.js.map +0 -1
- package/dist/cli/commands/sequence.d.ts +0 -8
- package/dist/cli/commands/sequence.d.ts.map +0 -1
- package/dist/cli/commands/sequence.js +0 -30
- package/dist/cli/commands/sequence.js.map +0 -1
- package/dist/cli/commands/session.d.ts +0 -12
- package/dist/cli/commands/session.d.ts.map +0 -1
- package/dist/cli/commands/session.js +0 -160
- package/dist/cli/commands/session.js.map +0 -1
- package/dist/cli/commands/show.d.ts +0 -13
- package/dist/cli/commands/show.d.ts.map +0 -1
- package/dist/cli/commands/show.js +0 -20
- package/dist/cli/commands/show.js.map +0 -1
- package/dist/cli/commands/skills.d.ts +0 -13
- package/dist/cli/commands/skills.d.ts.map +0 -1
- package/dist/cli/commands/skills.js +0 -131
- package/dist/cli/commands/skills.js.map +0 -1
- package/dist/cli/commands/snapshot.d.ts +0 -9
- package/dist/cli/commands/snapshot.d.ts.map +0 -1
- package/dist/cli/commands/snapshot.js +0 -50
- package/dist/cli/commands/snapshot.js.map +0 -1
- package/dist/cli/commands/specification.d.ts +0 -13
- package/dist/cli/commands/specification.d.ts.map +0 -1
- package/dist/cli/commands/specification.js +0 -45
- package/dist/cli/commands/specification.js.map +0 -1
- package/dist/cli/commands/start.d.ts +0 -13
- package/dist/cli/commands/start.d.ts.map +0 -1
- package/dist/cli/commands/start.js +0 -20
- package/dist/cli/commands/start.js.map +0 -1
- package/dist/cli/commands/stats.d.ts +0 -12
- package/dist/cli/commands/stats.d.ts.map +0 -1
- package/dist/cli/commands/stats.js +0 -23
- package/dist/cli/commands/stats.js.map +0 -1
- package/dist/cli/commands/sticky.d.ts +0 -16
- package/dist/cli/commands/sticky.d.ts.map +0 -1
- package/dist/cli/commands/sticky.js +0 -211
- package/dist/cli/commands/sticky.js.map +0 -1
- package/dist/cli/commands/stop.d.ts +0 -13
- package/dist/cli/commands/stop.d.ts.map +0 -1
- package/dist/cli/commands/stop.js +0 -20
- package/dist/cli/commands/stop.js.map +0 -1
- package/dist/cli/commands/sync.d.ts +0 -13
- package/dist/cli/commands/sync.d.ts.map +0 -1
- package/dist/cli/commands/sync.js +0 -48
- package/dist/cli/commands/sync.js.map +0 -1
- package/dist/cli/commands/testing.d.ts +0 -13
- package/dist/cli/commands/testing.d.ts.map +0 -1
- package/dist/cli/commands/testing.js +0 -64
- package/dist/cli/commands/testing.js.map +0 -1
- package/dist/cli/commands/token.d.ts +0 -10
- package/dist/cli/commands/token.d.ts.map +0 -1
- package/dist/cli/commands/token.js +0 -135
- package/dist/cli/commands/token.js.map +0 -1
- package/dist/cli/commands/update.d.ts +0 -12
- package/dist/cli/commands/update.d.ts.map +0 -1
- package/dist/cli/commands/update.js +0 -77
- package/dist/cli/commands/update.js.map +0 -1
- package/dist/cli/commands/upgrade.d.ts +0 -16
- package/dist/cli/commands/upgrade.d.ts.map +0 -1
- package/dist/cli/commands/upgrade.js +0 -74
- package/dist/cli/commands/upgrade.js.map +0 -1
- package/dist/cli/commands/validate.d.ts +0 -12
- package/dist/cli/commands/validate.d.ts.map +0 -1
- package/dist/cli/commands/validate.js +0 -23
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/commands/verify.d.ts +0 -8
- package/dist/cli/commands/verify.d.ts.map +0 -1
- package/dist/cli/commands/verify.js +0 -28
- package/dist/cli/commands/verify.js.map +0 -1
- package/dist/cli/commands/web.d.ts +0 -13
- package/dist/cli/commands/web.d.ts.map +0 -1
- package/dist/cli/commands/web.js +0 -264
- package/dist/cli/commands/web.js.map +0 -1
- package/dist/cli/field-context.d.ts +0 -32
- package/dist/cli/field-context.d.ts.map +0 -1
- package/dist/cli/field-context.js +0 -47
- package/dist/cli/field-context.js.map +0 -1
- package/dist/cli/format-context.d.ts +0 -32
- package/dist/cli/format-context.d.ts.map +0 -1
- package/dist/cli/format-context.js +0 -50
- package/dist/cli/format-context.js.map +0 -1
- package/dist/cli/index.d.ts +0 -12
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/logger-bootstrap.d.ts +0 -6
- package/dist/cli/logger-bootstrap.d.ts.map +0 -1
- package/dist/cli/logger-bootstrap.js +0 -10
- package/dist/cli/logger-bootstrap.js.map +0 -1
- package/dist/cli/middleware/output-format.d.ts +0 -30
- package/dist/cli/middleware/output-format.d.ts.map +0 -1
- package/dist/cli/middleware/output-format.js +0 -35
- package/dist/cli/middleware/output-format.js.map +0 -1
- package/dist/cli/progress.d.ts +0 -84
- package/dist/cli/progress.d.ts.map +0 -1
- package/dist/cli/progress.js +0 -169
- package/dist/cli/progress.js.map +0 -1
- package/dist/cli/renderers/colors.d.ts +0 -32
- package/dist/cli/renderers/colors.d.ts.map +0 -1
- package/dist/cli/renderers/colors.js +0 -141
- package/dist/cli/renderers/colors.js.map +0 -1
- package/dist/cli/renderers/error.d.ts +0 -13
- package/dist/cli/renderers/error.d.ts.map +0 -1
- package/dist/cli/renderers/error.js +0 -42
- package/dist/cli/renderers/error.js.map +0 -1
- package/dist/cli/renderers/index.d.ts +0 -59
- package/dist/cli/renderers/index.d.ts.map +0 -1
- package/dist/cli/renderers/index.js +0 -184
- package/dist/cli/renderers/index.js.map +0 -1
- package/dist/cli/renderers/normalizer.d.ts +0 -21
- package/dist/cli/renderers/normalizer.d.ts.map +0 -1
- package/dist/cli/renderers/normalizer.js +0 -106
- package/dist/cli/renderers/normalizer.js.map +0 -1
- package/dist/cli/renderers/system.d.ts +0 -25
- package/dist/cli/renderers/system.d.ts.map +0 -1
- package/dist/cli/renderers/system.js +0 -416
- package/dist/cli/renderers/system.js.map +0 -1
- package/dist/cli/renderers/tasks.d.ts +0 -28
- package/dist/cli/renderers/tasks.d.ts.map +0 -1
- package/dist/cli/renderers/tasks.js +0 -308
- package/dist/cli/renderers/tasks.js.map +0 -1
- package/dist/dispatch/adapters/cli.d.ts +0 -67
- package/dist/dispatch/adapters/cli.d.ts.map +0 -1
- package/dist/dispatch/adapters/cli.js +0 -205
- package/dist/dispatch/adapters/cli.js.map +0 -1
- package/dist/dispatch/adapters/mcp.d.ts +0 -37
- package/dist/dispatch/adapters/mcp.d.ts.map +0 -1
- package/dist/dispatch/adapters/mcp.js +0 -122
- package/dist/dispatch/adapters/mcp.js.map +0 -1
- package/dist/dispatch/context/session-context.d.ts +0 -54
- package/dist/dispatch/context/session-context.d.ts.map +0 -1
- package/dist/dispatch/context/session-context.js +0 -61
- package/dist/dispatch/context/session-context.js.map +0 -1
- package/dist/dispatch/dispatcher.d.ts +0 -23
- package/dist/dispatch/dispatcher.d.ts.map +0 -1
- package/dist/dispatch/dispatcher.js +0 -84
- package/dist/dispatch/dispatcher.js.map +0 -1
- package/dist/dispatch/domains/_base.d.ts +0 -59
- package/dist/dispatch/domains/_base.d.ts.map +0 -1
- package/dist/dispatch/domains/_base.js +0 -77
- package/dist/dispatch/domains/_base.js.map +0 -1
- package/dist/dispatch/domains/_meta.d.ts +0 -23
- package/dist/dispatch/domains/_meta.d.ts.map +0 -1
- package/dist/dispatch/domains/_meta.js +0 -25
- package/dist/dispatch/domains/_meta.js.map +0 -1
- package/dist/dispatch/domains/_routing.d.ts +0 -8
- package/dist/dispatch/domains/_routing.d.ts.map +0 -1
- package/dist/dispatch/domains/_routing.js +0 -20
- package/dist/dispatch/domains/_routing.js.map +0 -1
- package/dist/dispatch/domains/admin.d.ts +0 -27
- package/dist/dispatch/domains/admin.d.ts.map +0 -1
- package/dist/dispatch/domains/admin.js +0 -672
- package/dist/dispatch/domains/admin.js.map +0 -1
- package/dist/dispatch/domains/check.d.ts +0 -24
- package/dist/dispatch/domains/check.d.ts.map +0 -1
- package/dist/dispatch/domains/check.js +0 -281
- package/dist/dispatch/domains/check.js.map +0 -1
- package/dist/dispatch/domains/index.d.ts +0 -26
- package/dist/dispatch/domains/index.d.ts.map +0 -1
- package/dist/dispatch/domains/index.js +0 -38
- package/dist/dispatch/domains/index.js.map +0 -1
- package/dist/dispatch/domains/memory.d.ts +0 -24
- package/dist/dispatch/domains/memory.d.ts.map +0 -1
- package/dist/dispatch/domains/memory.js +0 -305
- package/dist/dispatch/domains/memory.js.map +0 -1
- package/dist/dispatch/domains/nexus.d.ts +0 -24
- package/dist/dispatch/domains/nexus.d.ts.map +0 -1
- package/dist/dispatch/domains/nexus.js +0 -252
- package/dist/dispatch/domains/nexus.js.map +0 -1
- package/dist/dispatch/domains/orchestrate.d.ts +0 -21
- package/dist/dispatch/domains/orchestrate.d.ts.map +0 -1
- package/dist/dispatch/domains/orchestrate.js +0 -261
- package/dist/dispatch/domains/orchestrate.js.map +0 -1
- package/dist/dispatch/domains/pipeline.d.ts +0 -36
- package/dist/dispatch/domains/pipeline.d.ts.map +0 -1
- package/dist/dispatch/domains/pipeline.js +0 -554
- package/dist/dispatch/domains/pipeline.js.map +0 -1
- package/dist/dispatch/domains/session.d.ts +0 -24
- package/dist/dispatch/domains/session.d.ts.map +0 -1
- package/dist/dispatch/domains/session.js +0 -257
- package/dist/dispatch/domains/session.js.map +0 -1
- package/dist/dispatch/domains/sticky.d.ts +0 -22
- package/dist/dispatch/domains/sticky.d.ts.map +0 -1
- package/dist/dispatch/domains/sticky.js +0 -166
- package/dist/dispatch/domains/sticky.js.map +0 -1
- package/dist/dispatch/domains/tasks.d.ts +0 -26
- package/dist/dispatch/domains/tasks.d.ts.map +0 -1
- package/dist/dispatch/domains/tasks.js +0 -352
- package/dist/dispatch/domains/tasks.js.map +0 -1
- package/dist/dispatch/domains/tools.d.ts +0 -40
- package/dist/dispatch/domains/tools.d.ts.map +0 -1
- package/dist/dispatch/domains/tools.js +0 -497
- package/dist/dispatch/domains/tools.js.map +0 -1
- package/dist/dispatch/engines/_error.d.ts +0 -42
- package/dist/dispatch/engines/_error.d.ts.map +0 -1
- package/dist/dispatch/engines/_error.js +0 -201
- package/dist/dispatch/engines/_error.js.map +0 -1
- package/dist/dispatch/engines/codebase-map-engine.d.ts +0 -17
- package/dist/dispatch/engines/codebase-map-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/codebase-map-engine.js +0 -29
- package/dist/dispatch/engines/codebase-map-engine.js.map +0 -1
- package/dist/dispatch/engines/config-engine.d.ts +0 -21
- package/dist/dispatch/engines/config-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/config-engine.js +0 -45
- package/dist/dispatch/engines/config-engine.js.map +0 -1
- package/dist/dispatch/engines/hooks-engine.d.ts +0 -47
- package/dist/dispatch/engines/hooks-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/hooks-engine.js +0 -57
- package/dist/dispatch/engines/hooks-engine.js.map +0 -1
- package/dist/dispatch/engines/init-engine.d.ts +0 -43
- package/dist/dispatch/engines/init-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/init-engine.js +0 -73
- package/dist/dispatch/engines/init-engine.js.map +0 -1
- package/dist/dispatch/engines/lifecycle-engine.d.ts +0 -66
- package/dist/dispatch/engines/lifecycle-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/lifecycle-engine.js +0 -213
- package/dist/dispatch/engines/lifecycle-engine.js.map +0 -1
- package/dist/dispatch/engines/memory-engine.d.ts +0 -10
- package/dist/dispatch/engines/memory-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/memory-engine.js +0 -10
- package/dist/dispatch/engines/memory-engine.js.map +0 -1
- package/dist/dispatch/engines/nexus-engine.d.ts +0 -159
- package/dist/dispatch/engines/nexus-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/nexus-engine.js +0 -329
- package/dist/dispatch/engines/nexus-engine.js.map +0 -1
- package/dist/dispatch/engines/orchestrate-engine.d.ts +0 -133
- package/dist/dispatch/engines/orchestrate-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/orchestrate-engine.js +0 -770
- package/dist/dispatch/engines/orchestrate-engine.js.map +0 -1
- package/dist/dispatch/engines/pipeline-engine.d.ts +0 -51
- package/dist/dispatch/engines/pipeline-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/pipeline-engine.js +0 -192
- package/dist/dispatch/engines/pipeline-engine.js.map +0 -1
- package/dist/dispatch/engines/release-engine.d.ts +0 -94
- package/dist/dispatch/engines/release-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/release-engine.js +0 -670
- package/dist/dispatch/engines/release-engine.js.map +0 -1
- package/dist/dispatch/engines/session-engine.d.ts +0 -326
- package/dist/dispatch/engines/session-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/session-engine.js +0 -869
- package/dist/dispatch/engines/session-engine.js.map +0 -1
- package/dist/dispatch/engines/sticky-engine.d.ts +0 -100
- package/dist/dispatch/engines/sticky-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/sticky-engine.js +0 -181
- package/dist/dispatch/engines/sticky-engine.js.map +0 -1
- package/dist/dispatch/engines/system-engine.d.ts +0 -377
- package/dist/dispatch/engines/system-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/system-engine.js +0 -980
- package/dist/dispatch/engines/system-engine.js.map +0 -1
- package/dist/dispatch/engines/task-engine.d.ts +0 -584
- package/dist/dispatch/engines/task-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/task-engine.js +0 -881
- package/dist/dispatch/engines/task-engine.js.map +0 -1
- package/dist/dispatch/engines/template-parser.d.ts +0 -34
- package/dist/dispatch/engines/template-parser.d.ts.map +0 -1
- package/dist/dispatch/engines/template-parser.js +0 -57
- package/dist/dispatch/engines/template-parser.js.map +0 -1
- package/dist/dispatch/engines/tools-engine.d.ts +0 -285
- package/dist/dispatch/engines/tools-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/tools-engine.js +0 -676
- package/dist/dispatch/engines/tools-engine.js.map +0 -1
- package/dist/dispatch/engines/validate-engine.d.ts +0 -154
- package/dist/dispatch/engines/validate-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/validate-engine.js +0 -527
- package/dist/dispatch/engines/validate-engine.js.map +0 -1
- package/dist/dispatch/index.d.ts +0 -20
- package/dist/dispatch/index.d.ts.map +0 -1
- package/dist/dispatch/index.js +0 -19
- package/dist/dispatch/index.js.map +0 -1
- package/dist/dispatch/lib/capability-matrix.d.ts +0 -11
- package/dist/dispatch/lib/capability-matrix.d.ts.map +0 -1
- package/dist/dispatch/lib/capability-matrix.js +0 -10
- package/dist/dispatch/lib/capability-matrix.js.map +0 -1
- package/dist/dispatch/lib/config.d.ts +0 -16
- package/dist/dispatch/lib/config.d.ts.map +0 -1
- package/dist/dispatch/lib/config.js +0 -15
- package/dist/dispatch/lib/config.js.map +0 -1
- package/dist/dispatch/lib/engine.d.ts +0 -25
- package/dist/dispatch/lib/engine.d.ts.map +0 -1
- package/dist/dispatch/lib/engine.js +0 -44
- package/dist/dispatch/lib/engine.js.map +0 -1
- package/dist/dispatch/lib/meta.d.ts +0 -26
- package/dist/dispatch/lib/meta.d.ts.map +0 -1
- package/dist/dispatch/lib/meta.js +0 -37
- package/dist/dispatch/lib/meta.js.map +0 -1
- package/dist/dispatch/lib/param-utils.d.ts +0 -11
- package/dist/dispatch/lib/param-utils.d.ts.map +0 -1
- package/dist/dispatch/lib/param-utils.js +0 -10
- package/dist/dispatch/lib/param-utils.js.map +0 -1
- package/dist/dispatch/lib/projections.d.ts +0 -23
- package/dist/dispatch/lib/projections.d.ts.map +0 -1
- package/dist/dispatch/lib/projections.js +0 -48
- package/dist/dispatch/lib/projections.js.map +0 -1
- package/dist/dispatch/lib/schema-utils.d.ts +0 -42
- package/dist/dispatch/lib/schema-utils.d.ts.map +0 -1
- package/dist/dispatch/lib/schema-utils.js +0 -93
- package/dist/dispatch/lib/schema-utils.js.map +0 -1
- package/dist/dispatch/lib/security.d.ts +0 -12
- package/dist/dispatch/lib/security.d.ts.map +0 -1
- package/dist/dispatch/lib/security.js +0 -10
- package/dist/dispatch/lib/security.js.map +0 -1
- package/dist/dispatch/middleware/audit.d.ts +0 -23
- package/dist/dispatch/middleware/audit.d.ts.map +0 -1
- package/dist/dispatch/middleware/audit.js +0 -169
- package/dist/dispatch/middleware/audit.js.map +0 -1
- package/dist/dispatch/middleware/field-filter.d.ts +0 -24
- package/dist/dispatch/middleware/field-filter.d.ts.map +0 -1
- package/dist/dispatch/middleware/field-filter.js +0 -65
- package/dist/dispatch/middleware/field-filter.js.map +0 -1
- package/dist/dispatch/middleware/pipeline.d.ts +0 -20
- package/dist/dispatch/middleware/pipeline.d.ts.map +0 -1
- package/dist/dispatch/middleware/pipeline.js +0 -47
- package/dist/dispatch/middleware/pipeline.js.map +0 -1
- package/dist/dispatch/middleware/projection.d.ts +0 -35
- package/dist/dispatch/middleware/projection.d.ts.map +0 -1
- package/dist/dispatch/middleware/projection.js +0 -145
- package/dist/dispatch/middleware/projection.js.map +0 -1
- package/dist/dispatch/middleware/protocol-enforcement.d.ts +0 -12
- package/dist/dispatch/middleware/protocol-enforcement.d.ts.map +0 -1
- package/dist/dispatch/middleware/protocol-enforcement.js +0 -30
- package/dist/dispatch/middleware/protocol-enforcement.js.map +0 -1
- package/dist/dispatch/middleware/rate-limiter.d.ts +0 -30
- package/dist/dispatch/middleware/rate-limiter.d.ts.map +0 -1
- package/dist/dispatch/middleware/rate-limiter.js +0 -101
- package/dist/dispatch/middleware/rate-limiter.js.map +0 -1
- package/dist/dispatch/middleware/sanitizer.d.ts +0 -10
- package/dist/dispatch/middleware/sanitizer.d.ts.map +0 -1
- package/dist/dispatch/middleware/sanitizer.js +0 -42
- package/dist/dispatch/middleware/sanitizer.js.map +0 -1
- package/dist/dispatch/middleware/session-resolver.d.ts +0 -26
- package/dist/dispatch/middleware/session-resolver.d.ts.map +0 -1
- package/dist/dispatch/middleware/session-resolver.js +0 -65
- package/dist/dispatch/middleware/session-resolver.js.map +0 -1
- package/dist/dispatch/middleware/verification-gates.d.ts +0 -3
- package/dist/dispatch/middleware/verification-gates.d.ts.map +0 -1
- package/dist/dispatch/middleware/verification-gates.js +0 -40
- package/dist/dispatch/middleware/verification-gates.js.map +0 -1
- package/dist/dispatch/registry.d.ts +0 -91
- package/dist/dispatch/registry.d.ts.map +0 -1
- package/dist/dispatch/registry.js +0 -2693
- package/dist/dispatch/registry.js.map +0 -1
- package/dist/dispatch/types.d.ts +0 -218
- package/dist/dispatch/types.d.ts.map +0 -1
- package/dist/dispatch/types.js +0 -25
- package/dist/dispatch/types.js.map +0 -1
- package/dist/mcp/gateways/mutate.d.ts +0 -146
- package/dist/mcp/gateways/mutate.d.ts.map +0 -1
- package/dist/mcp/gateways/mutate.js +0 -1016
- package/dist/mcp/gateways/mutate.js.map +0 -1
- package/dist/mcp/gateways/query.d.ts +0 -138
- package/dist/mcp/gateways/query.d.ts.map +0 -1
- package/dist/mcp/gateways/query.js +0 -186
- package/dist/mcp/gateways/query.js.map +0 -1
- package/dist/mcp/index.d.ts +0 -16
- package/dist/mcp/index.d.ts.map +0 -1
- package/dist/mcp/lib/background-jobs.d.ts +0 -86
- package/dist/mcp/lib/background-jobs.d.ts.map +0 -1
- package/dist/mcp/lib/background-jobs.js +0 -183
- package/dist/mcp/lib/background-jobs.js.map +0 -1
- package/dist/mcp/lib/budget.d.ts +0 -35
- package/dist/mcp/lib/budget.d.ts.map +0 -1
- package/dist/mcp/lib/budget.js +0 -102
- package/dist/mcp/lib/budget.js.map +0 -1
- package/dist/mcp/lib/cache.d.ts +0 -78
- package/dist/mcp/lib/cache.d.ts.map +0 -1
- package/dist/mcp/lib/cache.js +0 -207
- package/dist/mcp/lib/cache.js.map +0 -1
- package/dist/mcp/lib/config.d.ts +0 -42
- package/dist/mcp/lib/config.d.ts.map +0 -1
- package/dist/mcp/lib/config.js +0 -241
- package/dist/mcp/lib/config.js.map +0 -1
- package/dist/mcp/lib/defaults.d.ts +0 -115
- package/dist/mcp/lib/defaults.d.ts.map +0 -1
- package/dist/mcp/lib/defaults.js +0 -61
- package/dist/mcp/lib/defaults.js.map +0 -1
- package/dist/mcp/lib/exit-codes.d.ts +0 -197
- package/dist/mcp/lib/exit-codes.d.ts.map +0 -1
- package/dist/mcp/lib/exit-codes.js +0 -1016
- package/dist/mcp/lib/exit-codes.js.map +0 -1
- package/dist/mcp/lib/gate-validators.d.ts +0 -13
- package/dist/mcp/lib/gate-validators.d.ts.map +0 -1
- package/dist/mcp/lib/gate-validators.js +0 -13
- package/dist/mcp/lib/gate-validators.js.map +0 -1
- package/dist/mcp/lib/gateway-meta.d.ts +0 -37
- package/dist/mcp/lib/gateway-meta.d.ts.map +0 -1
- package/dist/mcp/lib/gateway-meta.js +0 -50
- package/dist/mcp/lib/gateway-meta.js.map +0 -1
- package/dist/mcp/lib/job-manager-accessor.d.ts +0 -10
- package/dist/mcp/lib/job-manager-accessor.d.ts.map +0 -1
- package/dist/mcp/lib/job-manager-accessor.js +0 -14
- package/dist/mcp/lib/job-manager-accessor.js.map +0 -1
- package/dist/mcp/lib/protocol-enforcement.d.ts +0 -12
- package/dist/mcp/lib/protocol-enforcement.d.ts.map +0 -1
- package/dist/mcp/lib/protocol-enforcement.js +0 -12
- package/dist/mcp/lib/protocol-enforcement.js.map +0 -1
- package/dist/mcp/lib/protocol-rules.d.ts +0 -12
- package/dist/mcp/lib/protocol-rules.d.ts.map +0 -1
- package/dist/mcp/lib/protocol-rules.js +0 -12
- package/dist/mcp/lib/protocol-rules.js.map +0 -1
- package/dist/mcp/lib/rate-limiter.d.ts +0 -110
- package/dist/mcp/lib/rate-limiter.d.ts.map +0 -1
- package/dist/mcp/lib/rate-limiter.js +0 -208
- package/dist/mcp/lib/rate-limiter.js.map +0 -1
- package/dist/mcp/lib/router.d.ts +0 -58
- package/dist/mcp/lib/router.d.ts.map +0 -1
- package/dist/mcp/lib/router.js +0 -12
- package/dist/mcp/lib/router.js.map +0 -1
- package/dist/mcp/lib/security.d.ts +0 -161
- package/dist/mcp/lib/security.d.ts.map +0 -1
- package/dist/mcp/lib/security.js +0 -361
- package/dist/mcp/lib/security.js.map +0 -1
- package/dist/mcp/lib/verification-gates.d.ts +0 -13
- package/dist/mcp/lib/verification-gates.d.ts.map +0 -1
- package/dist/mcp/lib/verification-gates.js +0 -12
- package/dist/mcp/lib/verification-gates.js.map +0 -1
- package/dist/mcp/resources/budget.d.ts +0 -22
- package/dist/mcp/resources/budget.d.ts.map +0 -1
- package/dist/mcp/resources/budget.js +0 -46
- package/dist/mcp/resources/budget.js.map +0 -1
- package/dist/mcp/resources/index.d.ts +0 -53
- package/dist/mcp/resources/index.d.ts.map +0 -1
- package/dist/mcp/resources/index.js +0 -278
- package/dist/mcp/resources/index.js.map +0 -1
|
@@ -1,670 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Release Engine
|
|
3
|
-
*
|
|
4
|
-
* Thin wrapper around core release manifest operations.
|
|
5
|
-
* Business logic lives in src/core/release/release-manifest.ts.
|
|
6
|
-
*
|
|
7
|
-
* Note: Some operations (push, rollback) inherently require git CLI.
|
|
8
|
-
* Those are handled as hybrid operations - native for data, CLI for git.
|
|
9
|
-
*
|
|
10
|
-
* @task T4788
|
|
11
|
-
*/
|
|
12
|
-
import { execFileSync } from 'node:child_process';
|
|
13
|
-
import { readFileSync } from 'node:fs';
|
|
14
|
-
import { buildPRBody, bumpVersionFromConfig, cancelRelease, channelToDistTag, checkDoubleListing, checkEpicCompleteness, commitRelease, createPullRequest, generateReleaseChangelog, getGitFlowConfig, getPushMode, getVersionBumpConfig, isGhCliAvailable, listManifestReleases, loadReleaseConfig, markReleasePushed, prepareRelease, pushRelease, resolveChannelFromBranch, resolveProjectRoot, rollbackRelease, runReleaseGates, showManifestRelease, tagRelease, } from '@cleocode/core/internal';
|
|
15
|
-
import { getAccessor } from '@cleocode/core/internal';
|
|
16
|
-
import { engineError } from './_error.js';
|
|
17
|
-
/**
|
|
18
|
-
* Detect whether the current execution context is an AI agent.
|
|
19
|
-
* Checks for CLEO_SESSION_ID or CLAUDE_AGENT_TYPE environment variables.
|
|
20
|
-
* @task T4279
|
|
21
|
-
*/
|
|
22
|
-
function isAgentContext() {
|
|
23
|
-
return !!(process.env['CLEO_SESSION_ID'] || process.env['CLAUDE_AGENT_TYPE']);
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Verify that a release manifest entry exists for the given version.
|
|
27
|
-
* Used as a protocol guard to ensure agents go through the proper
|
|
28
|
-
* release.ship workflow rather than calling release.push directly.
|
|
29
|
-
* @task T4279
|
|
30
|
-
*/
|
|
31
|
-
async function hasManifestEntry(version, projectRoot) {
|
|
32
|
-
try {
|
|
33
|
-
await showManifestRelease(version, projectRoot);
|
|
34
|
-
return true;
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
return false;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Load tasks via DataAccessor (SQLite).
|
|
42
|
-
*/
|
|
43
|
-
async function loadTasks(projectRoot) {
|
|
44
|
-
const root = projectRoot ?? resolveProjectRoot();
|
|
45
|
-
try {
|
|
46
|
-
const accessor = await getAccessor(root);
|
|
47
|
-
const result = await accessor.queryTasks({});
|
|
48
|
-
return result?.tasks ?? [];
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
throw new Error(`Failed to load task data: ${error.message}`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* release.prepare - Prepare a release
|
|
56
|
-
* @task T4788
|
|
57
|
-
*/
|
|
58
|
-
export async function releasePrepare(version, tasks, notes, projectRoot) {
|
|
59
|
-
try {
|
|
60
|
-
const data = await prepareRelease(version, tasks, notes, () => loadTasks(projectRoot), projectRoot);
|
|
61
|
-
return { success: true, data };
|
|
62
|
-
}
|
|
63
|
-
catch (err) {
|
|
64
|
-
const message = err.message;
|
|
65
|
-
let code = 'E_RELEASE_PREPARE_FAILED';
|
|
66
|
-
if (message.includes('required'))
|
|
67
|
-
code = 'E_INVALID_INPUT';
|
|
68
|
-
else if (message.includes('Invalid version'))
|
|
69
|
-
code = 'E_INVALID_VERSION';
|
|
70
|
-
else if (message.includes('already exists'))
|
|
71
|
-
code = 'E_VERSION_EXISTS';
|
|
72
|
-
return engineError(code, message);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* release.changelog - Generate changelog
|
|
77
|
-
* @task T4788
|
|
78
|
-
*/
|
|
79
|
-
export async function releaseChangelog(version, projectRoot) {
|
|
80
|
-
try {
|
|
81
|
-
const data = await generateReleaseChangelog(version, () => loadTasks(projectRoot), projectRoot);
|
|
82
|
-
return { success: true, data };
|
|
83
|
-
}
|
|
84
|
-
catch (err) {
|
|
85
|
-
const message = err.message;
|
|
86
|
-
let code = 'E_CHANGELOG_FAILED';
|
|
87
|
-
if (message.includes('required'))
|
|
88
|
-
code = 'E_INVALID_INPUT';
|
|
89
|
-
else if (message.includes('not found'))
|
|
90
|
-
code = 'E_NOT_FOUND';
|
|
91
|
-
return engineError(code, message);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* release.list - List all releases (query operation via data read)
|
|
96
|
-
* @task T4788
|
|
97
|
-
*/
|
|
98
|
-
export async function releaseList(optionsOrProjectRoot, projectRoot) {
|
|
99
|
-
try {
|
|
100
|
-
const options = typeof optionsOrProjectRoot === 'string' || optionsOrProjectRoot === undefined
|
|
101
|
-
? {}
|
|
102
|
-
: optionsOrProjectRoot;
|
|
103
|
-
const effectiveProjectRoot = typeof optionsOrProjectRoot === 'string' ? optionsOrProjectRoot : projectRoot;
|
|
104
|
-
const data = await listManifestReleases(options, effectiveProjectRoot);
|
|
105
|
-
return {
|
|
106
|
-
success: true,
|
|
107
|
-
data: {
|
|
108
|
-
releases: data.releases,
|
|
109
|
-
total: data.total,
|
|
110
|
-
filtered: data.filtered,
|
|
111
|
-
latest: data.latest,
|
|
112
|
-
},
|
|
113
|
-
page: data.page,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
catch (err) {
|
|
117
|
-
return engineError('E_LIST_FAILED', err.message);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* release.show - Show release details (query operation via data read)
|
|
122
|
-
* @task T4788
|
|
123
|
-
*/
|
|
124
|
-
export async function releaseShow(version, projectRoot) {
|
|
125
|
-
try {
|
|
126
|
-
const data = await showManifestRelease(version, projectRoot);
|
|
127
|
-
return { success: true, data };
|
|
128
|
-
}
|
|
129
|
-
catch (err) {
|
|
130
|
-
const message = err.message;
|
|
131
|
-
const code = message.includes('not found') ? 'E_NOT_FOUND' : 'E_SHOW_FAILED';
|
|
132
|
-
return engineError(code, message);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* release.commit - Mark release as committed (metadata only)
|
|
137
|
-
* @task T4788
|
|
138
|
-
*/
|
|
139
|
-
export async function releaseCommit(version, projectRoot) {
|
|
140
|
-
try {
|
|
141
|
-
const data = await commitRelease(version, projectRoot);
|
|
142
|
-
return { success: true, data };
|
|
143
|
-
}
|
|
144
|
-
catch (err) {
|
|
145
|
-
const message = err.message;
|
|
146
|
-
let code = 'E_COMMIT_FAILED';
|
|
147
|
-
if (message.includes('not found'))
|
|
148
|
-
code = 'E_NOT_FOUND';
|
|
149
|
-
else if (message.includes('expected'))
|
|
150
|
-
code = 'E_INVALID_STATE';
|
|
151
|
-
return engineError(code, message);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* release.tag - Mark release as tagged (metadata only)
|
|
156
|
-
* @task T4788
|
|
157
|
-
*/
|
|
158
|
-
export async function releaseTag(version, projectRoot) {
|
|
159
|
-
try {
|
|
160
|
-
const data = await tagRelease(version, projectRoot);
|
|
161
|
-
return { success: true, data };
|
|
162
|
-
}
|
|
163
|
-
catch (err) {
|
|
164
|
-
const message = err.message;
|
|
165
|
-
const code = message.includes('not found') ? 'E_NOT_FOUND' : 'E_TAG_FAILED';
|
|
166
|
-
return engineError(code, message);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* release.gates.run - Run release gates (validation checks)
|
|
171
|
-
* @task T4788
|
|
172
|
-
*/
|
|
173
|
-
export async function releaseGatesRun(version, projectRoot) {
|
|
174
|
-
try {
|
|
175
|
-
const data = await runReleaseGates(version, () => loadTasks(projectRoot), projectRoot);
|
|
176
|
-
return { success: true, data };
|
|
177
|
-
}
|
|
178
|
-
catch (err) {
|
|
179
|
-
const message = err.message;
|
|
180
|
-
const code = message.includes('not found') ? 'E_NOT_FOUND' : 'E_GATES_FAILED';
|
|
181
|
-
return engineError(code, message);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* release.rollback - Rollback a release
|
|
186
|
-
* @task T4788
|
|
187
|
-
*/
|
|
188
|
-
export async function releaseRollback(version, reason, projectRoot) {
|
|
189
|
-
try {
|
|
190
|
-
const data = await rollbackRelease(version, reason, projectRoot);
|
|
191
|
-
return { success: true, data };
|
|
192
|
-
}
|
|
193
|
-
catch (err) {
|
|
194
|
-
const message = err.message;
|
|
195
|
-
const code = message.includes('not found') ? 'E_NOT_FOUND' : 'E_ROLLBACK_FAILED';
|
|
196
|
-
return engineError(code, message);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* release.cancel - Cancel and remove a release in draft or prepared state
|
|
201
|
-
* @task T5602
|
|
202
|
-
*/
|
|
203
|
-
export async function releaseCancel(version, projectRoot) {
|
|
204
|
-
if (!version) {
|
|
205
|
-
return engineError('E_INVALID_INPUT', 'version is required');
|
|
206
|
-
}
|
|
207
|
-
try {
|
|
208
|
-
const result = await cancelRelease(version, projectRoot);
|
|
209
|
-
if (!result.success) {
|
|
210
|
-
const code = result.message.includes('not found') ? 'E_NOT_FOUND' : 'E_INVALID_STATE';
|
|
211
|
-
return engineError(code, result.message);
|
|
212
|
-
}
|
|
213
|
-
return { success: true, data: result };
|
|
214
|
-
}
|
|
215
|
-
catch (err) {
|
|
216
|
-
const message = err.message;
|
|
217
|
-
const code = message.includes('not found') ? 'E_NOT_FOUND' : 'E_CANCEL_FAILED';
|
|
218
|
-
return engineError(code, message);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* release.push - Push release to remote via git
|
|
223
|
-
* Uses execFileSync (no shell) for safety.
|
|
224
|
-
* Respects config.release.push policy.
|
|
225
|
-
*
|
|
226
|
-
* Agent protocol guard (T4279): When running in agent context
|
|
227
|
-
* (detected via CLEO_SESSION_ID or CLAUDE_AGENT_TYPE env vars),
|
|
228
|
-
* requires a release manifest entry for the version. This ensures
|
|
229
|
-
* agents go through the proper release.ship workflow rather than
|
|
230
|
-
* calling release.push directly, maintaining provenance tracking.
|
|
231
|
-
*
|
|
232
|
-
* @task T4788
|
|
233
|
-
* @task T4276
|
|
234
|
-
* @task T4279
|
|
235
|
-
*/
|
|
236
|
-
export async function releasePush(version, remote, projectRoot, opts) {
|
|
237
|
-
// Agent protocol guard: require manifest entry when in agent context
|
|
238
|
-
if (isAgentContext()) {
|
|
239
|
-
const hasEntry = await hasManifestEntry(version, projectRoot);
|
|
240
|
-
if (!hasEntry) {
|
|
241
|
-
return engineError('E_PROTOCOL_RELEASE', `Agent protocol violation: no release manifest entry for '${version}'. ` +
|
|
242
|
-
'Use the full release.ship workflow to ensure provenance tracking. ' +
|
|
243
|
-
'Direct release.push is not allowed in agent context without a manifest entry.', {
|
|
244
|
-
fix: `ct release ship ${version} --epic T####`,
|
|
245
|
-
alternatives: [
|
|
246
|
-
{
|
|
247
|
-
action: 'Use full ship workflow',
|
|
248
|
-
command: `ct release ship ${version} --epic T####`,
|
|
249
|
-
},
|
|
250
|
-
],
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
try {
|
|
255
|
-
const result = await pushRelease(version, remote, projectRoot, opts);
|
|
256
|
-
// Capture commit SHA for provenance and update the manifest
|
|
257
|
-
let commitSha;
|
|
258
|
-
try {
|
|
259
|
-
commitSha = execFileSync('git', ['rev-parse', 'HEAD'], {
|
|
260
|
-
cwd: projectRoot ?? process.cwd(),
|
|
261
|
-
encoding: 'utf-8',
|
|
262
|
-
stdio: 'pipe',
|
|
263
|
-
})
|
|
264
|
-
.toString()
|
|
265
|
-
.trim();
|
|
266
|
-
}
|
|
267
|
-
catch {
|
|
268
|
-
// Non-fatal: provenance capture is best-effort
|
|
269
|
-
}
|
|
270
|
-
const gitTag = `v${result.version.replace(/^v/, '')}`;
|
|
271
|
-
await markReleasePushed(result.version, result.pushedAt, projectRoot, { commitSha, gitTag });
|
|
272
|
-
return { success: true, data: result };
|
|
273
|
-
}
|
|
274
|
-
catch (err) {
|
|
275
|
-
const execError = err;
|
|
276
|
-
const message = (execError.stderr ?? execError.message ?? '').slice(0, 500);
|
|
277
|
-
// Distinguish config policy errors from git errors
|
|
278
|
-
if (execError.message?.includes('disabled by config') ||
|
|
279
|
-
execError.message?.includes('not in allowed branches') ||
|
|
280
|
-
execError.message?.includes('not clean')) {
|
|
281
|
-
return engineError('E_VALIDATION', message);
|
|
282
|
-
}
|
|
283
|
-
return engineError('E_GENERAL', `Git push failed: ${message}`, {
|
|
284
|
-
details: { exitCode: execError.status },
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* release.ship - Composite release operation
|
|
290
|
-
*
|
|
291
|
-
* Sequence: validate gates → epic completeness → double-listing check →
|
|
292
|
-
* write CHANGELOG → git commit/tag/push (or PR) → record provenance
|
|
293
|
-
*
|
|
294
|
-
* @task T5582
|
|
295
|
-
* @task T5586
|
|
296
|
-
* @epic T5576
|
|
297
|
-
*/
|
|
298
|
-
export async function releaseShip(params, projectRoot) {
|
|
299
|
-
const { version, epicId, remote, dryRun = false, bump = true } = params;
|
|
300
|
-
if (!version) {
|
|
301
|
-
return engineError('E_INVALID_INPUT', 'version is required');
|
|
302
|
-
}
|
|
303
|
-
if (!epicId) {
|
|
304
|
-
return engineError('E_INVALID_INPUT', 'epicId is required');
|
|
305
|
-
}
|
|
306
|
-
const cwd = projectRoot ?? resolveProjectRoot();
|
|
307
|
-
/** Collected step log messages, included in every return value for MCP visibility. */
|
|
308
|
-
const steps = [];
|
|
309
|
-
/** Emit a step line for each release stage. Pushes to steps[] and console.log for CLI. */
|
|
310
|
-
const logStep = (n, total, label, done, error) => {
|
|
311
|
-
let msg;
|
|
312
|
-
if (done === undefined) {
|
|
313
|
-
msg = `[Step ${n}/${total}] ${label}...`;
|
|
314
|
-
}
|
|
315
|
-
else if (done) {
|
|
316
|
-
msg = ` ✓ ${label}`;
|
|
317
|
-
}
|
|
318
|
-
else {
|
|
319
|
-
msg = ` ✗ ${label}: ${error ?? 'failed'}`;
|
|
320
|
-
}
|
|
321
|
-
steps.push(msg);
|
|
322
|
-
console.log(msg);
|
|
323
|
-
};
|
|
324
|
-
const bumpTargets = getVersionBumpConfig(cwd);
|
|
325
|
-
const shouldBump = bump && bumpTargets.length > 0;
|
|
326
|
-
try {
|
|
327
|
-
// Step 0: Bump version files (if configured and bump not disabled)
|
|
328
|
-
if (shouldBump) {
|
|
329
|
-
logStep(0, 8, 'Bump version files');
|
|
330
|
-
if (!dryRun) {
|
|
331
|
-
const bumpResults = bumpVersionFromConfig(version, { dryRun: false }, cwd);
|
|
332
|
-
if (!bumpResults.allSuccess) {
|
|
333
|
-
const failed = bumpResults.results.filter((r) => !r.success).map((r) => r.file);
|
|
334
|
-
steps.push(` ! Version bump partial: failed for ${failed.join(', ')}`);
|
|
335
|
-
}
|
|
336
|
-
else {
|
|
337
|
-
logStep(0, 8, 'Bump version files', true);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
logStep(0, 8, 'Bump version files', true);
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
// Step 0.5: Ensure release record exists (auto-prepare if needed)
|
|
345
|
-
// Since T5615 removed release.add/plan, ship must be self-contained
|
|
346
|
-
try {
|
|
347
|
-
await showManifestRelease(version, cwd);
|
|
348
|
-
}
|
|
349
|
-
catch {
|
|
350
|
-
// Release record doesn't exist yet — create it
|
|
351
|
-
logStep(0, 8, 'Auto-prepare release record');
|
|
352
|
-
if (!dryRun) {
|
|
353
|
-
await prepareRelease(version, undefined, `Auto-prepared by release.ship (${epicId})`, () => loadTasks(projectRoot), cwd);
|
|
354
|
-
// Set epicId on the newly created record (prepareRelease doesn't accept it)
|
|
355
|
-
const { getDb } = await import('@cleocode/core/internal');
|
|
356
|
-
const { releaseManifests } = await import('@cleocode/core/internal');
|
|
357
|
-
const { eq } = await import('drizzle-orm');
|
|
358
|
-
const normalizedVer = version.startsWith('v') ? version : `v${version}`;
|
|
359
|
-
const db = await getDb(cwd);
|
|
360
|
-
await db
|
|
361
|
-
.update(releaseManifests)
|
|
362
|
-
.set({ epicId })
|
|
363
|
-
.where(eq(releaseManifests.version, normalizedVer))
|
|
364
|
-
.run();
|
|
365
|
-
// Pre-generate changelog so has_changelog gate passes
|
|
366
|
-
await generateReleaseChangelog(version, () => loadTasks(projectRoot), cwd);
|
|
367
|
-
}
|
|
368
|
-
logStep(0, 8, 'Auto-prepare release record', true);
|
|
369
|
-
}
|
|
370
|
-
// Step 1: Run release gates
|
|
371
|
-
logStep(1, 8, 'Validate release gates');
|
|
372
|
-
const gatesResult = await runReleaseGates(version, () => loadTasks(projectRoot), projectRoot, {
|
|
373
|
-
dryRun,
|
|
374
|
-
});
|
|
375
|
-
if (gatesResult && !gatesResult.allPassed) {
|
|
376
|
-
const failedGates = gatesResult.gates.filter((g) => g.status === 'failed');
|
|
377
|
-
logStep(1, 8, 'Validate release gates', false, failedGates.map((g) => g.name).join(', '));
|
|
378
|
-
return engineError('E_LIFECYCLE_GATE_FAILED', `Release gates failed for ${version}: ${failedGates.map((g) => g.name).join(', ')}`, {
|
|
379
|
-
details: { gates: gatesResult.gates, failedCount: gatesResult.failedCount },
|
|
380
|
-
});
|
|
381
|
-
}
|
|
382
|
-
logStep(1, 8, 'Validate release gates', true);
|
|
383
|
-
// Resolve release channel from current branch (after gates, which read the branch)
|
|
384
|
-
let resolvedChannel = 'latest';
|
|
385
|
-
let currentBranchForPR = 'HEAD';
|
|
386
|
-
try {
|
|
387
|
-
const branchName = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
|
|
388
|
-
cwd,
|
|
389
|
-
encoding: 'utf-8',
|
|
390
|
-
stdio: 'pipe',
|
|
391
|
-
}).trim();
|
|
392
|
-
currentBranchForPR = branchName;
|
|
393
|
-
const channelEnum = resolveChannelFromBranch(branchName);
|
|
394
|
-
resolvedChannel = channelToDistTag(channelEnum);
|
|
395
|
-
}
|
|
396
|
-
catch {
|
|
397
|
-
// git unavailable — keep default
|
|
398
|
-
}
|
|
399
|
-
// Prefer metadata from gates result if available (B4 populates this)
|
|
400
|
-
const gateMetadata = gatesResult.metadata;
|
|
401
|
-
const requiresPRFromGates = gateMetadata?.requiresPR ?? false;
|
|
402
|
-
const targetBranchFromGates = gateMetadata?.targetBranch;
|
|
403
|
-
if (gateMetadata?.currentBranch) {
|
|
404
|
-
currentBranchForPR = gateMetadata.currentBranch;
|
|
405
|
-
}
|
|
406
|
-
// Step 2: Check epic completeness — load release tasks from manifest
|
|
407
|
-
logStep(2, 8, 'Check epic completeness');
|
|
408
|
-
let releaseTaskIds = [];
|
|
409
|
-
try {
|
|
410
|
-
const manifest = await showManifestRelease(version, projectRoot);
|
|
411
|
-
releaseTaskIds = manifest.tasks ?? [];
|
|
412
|
-
}
|
|
413
|
-
catch {
|
|
414
|
-
// Manifest may not exist yet if prepare hasn't been called; proceed
|
|
415
|
-
}
|
|
416
|
-
const epicAccessor = await getAccessor(cwd);
|
|
417
|
-
const epicCheck = await checkEpicCompleteness(releaseTaskIds, projectRoot, epicAccessor);
|
|
418
|
-
if (epicCheck.hasIncomplete) {
|
|
419
|
-
const incomplete = epicCheck.epics
|
|
420
|
-
.filter((e) => e.missingChildren.length > 0)
|
|
421
|
-
.map((e) => `${e.epicId}: missing ${e.missingChildren.map((c) => c.id).join(', ')}`)
|
|
422
|
-
.join('; ');
|
|
423
|
-
logStep(2, 8, 'Check epic completeness', false, incomplete);
|
|
424
|
-
return engineError('E_LIFECYCLE_GATE_FAILED', `Epic completeness check failed: ${incomplete}`, {
|
|
425
|
-
details: { epics: epicCheck.epics },
|
|
426
|
-
});
|
|
427
|
-
}
|
|
428
|
-
logStep(2, 8, 'Check epic completeness', true);
|
|
429
|
-
// Step 3: Check for double-listing
|
|
430
|
-
logStep(3, 8, 'Check task double-listing');
|
|
431
|
-
const allReleases = await listManifestReleases(projectRoot);
|
|
432
|
-
const existingReleases = (allReleases.releases ?? []).filter((r) => r.version !== version);
|
|
433
|
-
const doubleCheck = checkDoubleListing(releaseTaskIds, existingReleases.map((r) => ({ version: r.version, tasks: r.tasks ?? [] })));
|
|
434
|
-
if (doubleCheck.hasDoubleListing) {
|
|
435
|
-
const dupes = doubleCheck.duplicates
|
|
436
|
-
.map((d) => `${d.taskId} (in ${d.releases.join(', ')})`)
|
|
437
|
-
.join('; ');
|
|
438
|
-
logStep(3, 8, 'Check task double-listing', false, dupes);
|
|
439
|
-
return engineError('E_VALIDATION', `Double-listing detected: ${dupes}`, {
|
|
440
|
-
details: { duplicates: doubleCheck.duplicates },
|
|
441
|
-
});
|
|
442
|
-
}
|
|
443
|
-
logStep(3, 8, 'Check task double-listing', true);
|
|
444
|
-
// Resolve push mode for dry-run and PR logic
|
|
445
|
-
const loadedConfig = loadReleaseConfig(cwd);
|
|
446
|
-
const pushMode = getPushMode(loadedConfig);
|
|
447
|
-
const gitflowCfg = getGitFlowConfig(loadedConfig);
|
|
448
|
-
const targetBranch = targetBranchFromGates ?? gitflowCfg.branches.main;
|
|
449
|
-
if (dryRun) {
|
|
450
|
-
// Step 4 (dry-run): Preview CHANGELOG generation without writing to disk
|
|
451
|
-
logStep(4, 8, 'Generate CHANGELOG');
|
|
452
|
-
logStep(4, 8, 'Generate CHANGELOG', true);
|
|
453
|
-
const wouldCreatePR = requiresPRFromGates || pushMode === 'pr';
|
|
454
|
-
const filesToStagePreview = [
|
|
455
|
-
'CHANGELOG.md',
|
|
456
|
-
...(shouldBump ? bumpTargets.map((t) => t.file) : []),
|
|
457
|
-
];
|
|
458
|
-
const wouldDo = [];
|
|
459
|
-
if (shouldBump) {
|
|
460
|
-
wouldDo.push(`bump version files: ${bumpTargets.map((t) => t.file).join(', ')} → ${version}`);
|
|
461
|
-
}
|
|
462
|
-
wouldDo.push(`write CHANGELOG.md: ## [${version}] - ${new Date().toISOString().split('T')[0]} (preview only, not written in dry-run)`, `git add ${filesToStagePreview.join(' ')}`, `git commit -m "release: ship v${version} (${epicId})"`, `git tag -a v${version} -m "Release v${version}"`);
|
|
463
|
-
const dryRunOutput = {
|
|
464
|
-
version,
|
|
465
|
-
epicId,
|
|
466
|
-
dryRun: true,
|
|
467
|
-
channel: resolvedChannel,
|
|
468
|
-
pushMode,
|
|
469
|
-
wouldDo,
|
|
470
|
-
};
|
|
471
|
-
if (wouldCreatePR) {
|
|
472
|
-
const ghAvailable = isGhCliAvailable();
|
|
473
|
-
dryRunOutput['wouldDo'].push(ghAvailable
|
|
474
|
-
? `gh pr create --base ${targetBranch} --head ${currentBranchForPR} --title "release: ship v${version}"`
|
|
475
|
-
: `manual PR: ${currentBranchForPR} → ${targetBranch} (gh CLI not available)`);
|
|
476
|
-
dryRunOutput['wouldCreatePR'] = true;
|
|
477
|
-
dryRunOutput['prTitle'] = `release: ship v${version}`;
|
|
478
|
-
dryRunOutput['prTargetBranch'] = targetBranch;
|
|
479
|
-
}
|
|
480
|
-
else {
|
|
481
|
-
dryRunOutput['wouldDo'].push(`git push ${remote ?? 'origin'} --follow-tags`);
|
|
482
|
-
dryRunOutput['wouldCreatePR'] = false;
|
|
483
|
-
}
|
|
484
|
-
dryRunOutput['wouldDo'].push('markReleasePushed(...)');
|
|
485
|
-
return { success: true, data: { ...dryRunOutput, steps } };
|
|
486
|
-
}
|
|
487
|
-
// Step 4: Write CHANGELOG section (non-dry-run only)
|
|
488
|
-
logStep(4, 8, 'Generate CHANGELOG');
|
|
489
|
-
await generateReleaseChangelog(version, () => loadTasks(projectRoot), projectRoot);
|
|
490
|
-
const changelogPath = `${cwd}/CHANGELOG.md`;
|
|
491
|
-
// Verify CHANGELOG.md actually contains ## [VERSION] — CI will reject without it
|
|
492
|
-
const cleanVersion = version.replace(/^v/, '');
|
|
493
|
-
try {
|
|
494
|
-
const changelogContent = readFileSync(changelogPath, 'utf8');
|
|
495
|
-
if (!changelogContent.includes(`## [${cleanVersion}]`)) {
|
|
496
|
-
logStep(4, 8, 'Generate CHANGELOG', false, `CHANGELOG.md missing ## [${cleanVersion}] section`);
|
|
497
|
-
return engineError('E_VALIDATION', `CHANGELOG.md does not contain ## [${cleanVersion}] after generation. ` +
|
|
498
|
-
`This will cause the release workflow to fail.`);
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
catch (err) {
|
|
502
|
-
const msg = err.message ?? String(err);
|
|
503
|
-
logStep(4, 8, 'Generate CHANGELOG', false, `Cannot read CHANGELOG.md: ${msg}`);
|
|
504
|
-
return engineError('E_GENERAL', `Cannot read CHANGELOG.md: ${msg}`);
|
|
505
|
-
}
|
|
506
|
-
logStep(4, 8, 'Generate CHANGELOG', true);
|
|
507
|
-
// Step 4.5: Lint check — catch biome errors before committing
|
|
508
|
-
try {
|
|
509
|
-
execFileSync('npx', ['biome', 'check', '--no-errors-on-unmatched', cwd], {
|
|
510
|
-
cwd,
|
|
511
|
-
encoding: 'utf-8',
|
|
512
|
-
stdio: 'pipe',
|
|
513
|
-
timeout: 30_000,
|
|
514
|
-
});
|
|
515
|
-
}
|
|
516
|
-
catch (err) {
|
|
517
|
-
const execErr = err;
|
|
518
|
-
if (execErr.status && execErr.status > 0) {
|
|
519
|
-
const output = (execErr.stdout ?? execErr.stderr ?? '').slice(0, 1000);
|
|
520
|
-
const errorMatch = output.match(/Found (\d+) error/);
|
|
521
|
-
const errorCount = errorMatch ? errorMatch[1] : 'unknown';
|
|
522
|
-
logStep(4, 8, 'Lint check', false, `${errorCount} biome error(s)`);
|
|
523
|
-
return engineError('E_VALIDATION', `Biome lint check found ${errorCount} error(s). Fix them before releasing.\n${output}`);
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
// Step 5: Git commit
|
|
527
|
-
logStep(5, 8, 'Commit release');
|
|
528
|
-
const gitCwd = { cwd, encoding: 'utf-8', stdio: 'pipe' };
|
|
529
|
-
const filesToStage = ['CHANGELOG.md', ...(shouldBump ? bumpTargets.map((t) => t.file) : [])];
|
|
530
|
-
try {
|
|
531
|
-
execFileSync('git', ['add', ...filesToStage], gitCwd);
|
|
532
|
-
}
|
|
533
|
-
catch (err) {
|
|
534
|
-
const msg = err.message ?? String(err);
|
|
535
|
-
logStep(5, 8, 'Commit release', false, `git add failed: ${msg}`);
|
|
536
|
-
return engineError('E_GENERAL', `git add failed: ${msg}`);
|
|
537
|
-
}
|
|
538
|
-
try {
|
|
539
|
-
execFileSync('git', ['commit', '-m', `release: ship v${version} (${epicId})`], gitCwd);
|
|
540
|
-
}
|
|
541
|
-
catch (err) {
|
|
542
|
-
const msg = err.stderr ??
|
|
543
|
-
err.message ??
|
|
544
|
-
String(err);
|
|
545
|
-
logStep(5, 8, 'Commit release', false, `git commit failed: ${msg}`);
|
|
546
|
-
return engineError('E_GENERAL', `git commit failed: ${msg}`);
|
|
547
|
-
}
|
|
548
|
-
logStep(5, 8, 'Commit release', true);
|
|
549
|
-
let commitSha;
|
|
550
|
-
try {
|
|
551
|
-
commitSha = execFileSync('git', ['rev-parse', 'HEAD'], gitCwd).toString().trim();
|
|
552
|
-
}
|
|
553
|
-
catch {
|
|
554
|
-
// Non-fatal
|
|
555
|
-
}
|
|
556
|
-
// Step 6: Tag release
|
|
557
|
-
logStep(6, 8, 'Tag release');
|
|
558
|
-
const gitTag = `v${version.replace(/^v/, '')}`;
|
|
559
|
-
try {
|
|
560
|
-
execFileSync('git', ['tag', '-a', gitTag, '-m', `Release ${gitTag}`], gitCwd);
|
|
561
|
-
}
|
|
562
|
-
catch (err) {
|
|
563
|
-
const msg = err.stderr ??
|
|
564
|
-
err.message ??
|
|
565
|
-
String(err);
|
|
566
|
-
logStep(6, 8, 'Tag release', false, `git tag failed: ${msg}`);
|
|
567
|
-
return engineError('E_GENERAL', `git tag failed: ${msg}`);
|
|
568
|
-
}
|
|
569
|
-
logStep(6, 8, 'Tag release', true);
|
|
570
|
-
// Step 7: Push or create PR
|
|
571
|
-
logStep(7, 8, 'Push / create PR');
|
|
572
|
-
let prResult = null;
|
|
573
|
-
// First attempt the core pushRelease (which may signal requiresPR)
|
|
574
|
-
const pushResult = await pushRelease(version, remote, projectRoot, {
|
|
575
|
-
explicitPush: true,
|
|
576
|
-
mode: pushMode,
|
|
577
|
-
});
|
|
578
|
-
if (pushResult.requiresPR || requiresPRFromGates) {
|
|
579
|
-
// Branch is protected — create PR instead of direct push
|
|
580
|
-
const prBody = buildPRBody({
|
|
581
|
-
base: targetBranch,
|
|
582
|
-
head: currentBranchForPR,
|
|
583
|
-
title: `release: ship v${version}`,
|
|
584
|
-
body: '',
|
|
585
|
-
version,
|
|
586
|
-
epicId,
|
|
587
|
-
projectRoot: cwd,
|
|
588
|
-
});
|
|
589
|
-
prResult = await createPullRequest({
|
|
590
|
-
base: targetBranch,
|
|
591
|
-
head: currentBranchForPR,
|
|
592
|
-
title: `release: ship v${version}`,
|
|
593
|
-
body: prBody,
|
|
594
|
-
labels: ['release', resolvedChannel],
|
|
595
|
-
version,
|
|
596
|
-
epicId,
|
|
597
|
-
projectRoot: cwd,
|
|
598
|
-
});
|
|
599
|
-
if (prResult.mode === 'created') {
|
|
600
|
-
const m1 = ` ✓ Push / create PR`;
|
|
601
|
-
const m2 = ` PR created: ${prResult.prUrl}`;
|
|
602
|
-
const m3 = ` → Next: merge the PR, then CI will publish to npm @${resolvedChannel}`;
|
|
603
|
-
steps.push(m1, m2, m3);
|
|
604
|
-
console.log(m1);
|
|
605
|
-
console.log(m2);
|
|
606
|
-
console.log(m3);
|
|
607
|
-
}
|
|
608
|
-
else if (prResult.mode === 'skipped') {
|
|
609
|
-
const m1 = ` ✓ Push / create PR`;
|
|
610
|
-
const m2 = ` PR already exists: ${prResult.prUrl}`;
|
|
611
|
-
steps.push(m1, m2);
|
|
612
|
-
console.log(m1);
|
|
613
|
-
console.log(m2);
|
|
614
|
-
}
|
|
615
|
-
else {
|
|
616
|
-
const m1 = ` ! Push / create PR — manual PR required:`;
|
|
617
|
-
const m2 = prResult.instructions ?? '';
|
|
618
|
-
steps.push(m1, m2);
|
|
619
|
-
console.log(m1);
|
|
620
|
-
console.log(m2);
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
else {
|
|
624
|
-
// Direct push path (pushRelease already ran, but it skips the actual push
|
|
625
|
-
// when requiresPR is false — so we do the git push here directly)
|
|
626
|
-
try {
|
|
627
|
-
execFileSync('git', ['push', remote ?? 'origin', '--follow-tags'], gitCwd);
|
|
628
|
-
logStep(7, 8, 'Push / create PR', true);
|
|
629
|
-
}
|
|
630
|
-
catch (err) {
|
|
631
|
-
const execError = err;
|
|
632
|
-
const msg = (execError.stderr ?? execError.message ?? '').slice(0, 500);
|
|
633
|
-
logStep(7, 8, 'Push / create PR', false, `git push failed: ${msg}`);
|
|
634
|
-
return engineError('E_GENERAL', `git push failed: ${msg}`, {
|
|
635
|
-
details: { exitCode: execError.status },
|
|
636
|
-
});
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
// Step 8 (internal): Record provenance
|
|
640
|
-
const pushedAt = new Date().toISOString();
|
|
641
|
-
await markReleasePushed(version, pushedAt, projectRoot, { commitSha, gitTag });
|
|
642
|
-
return {
|
|
643
|
-
success: true,
|
|
644
|
-
data: {
|
|
645
|
-
version,
|
|
646
|
-
epicId,
|
|
647
|
-
commitSha,
|
|
648
|
-
gitTag,
|
|
649
|
-
pushedAt,
|
|
650
|
-
changelog: changelogPath,
|
|
651
|
-
channel: resolvedChannel,
|
|
652
|
-
steps,
|
|
653
|
-
...(prResult
|
|
654
|
-
? {
|
|
655
|
-
pr: {
|
|
656
|
-
mode: prResult.mode,
|
|
657
|
-
prUrl: prResult.prUrl,
|
|
658
|
-
prNumber: prResult.prNumber,
|
|
659
|
-
instructions: prResult.instructions,
|
|
660
|
-
},
|
|
661
|
-
}
|
|
662
|
-
: {}),
|
|
663
|
-
},
|
|
664
|
-
};
|
|
665
|
-
}
|
|
666
|
-
catch (err) {
|
|
667
|
-
return engineError('E_GENERAL', err.message ?? String(err));
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
//# sourceMappingURL=release-engine.js.map
|