1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//! Release strategy for Patina projects
//!
//! Decouples spec lifecycle from version management. Specs are universal —
//! every patina project has them. Versioning is a plugin, dispatched via
//! `ReleaseStrategy`.
//!
//! Follows [[dependable-rust]]: mod.rs (interface) + internal.rs (implementation).
//! Follows [[compiler-enforced-safety]]: enums over strings, typestate over docs.
//!
//! # Example
//!
//! ```ignore
//! use patina::release::{BumpType, ReleaseStrategy};
//!
//! let strategy = ReleaseStrategy::from_project(project_path);
//! let bump = BumpType::from_spec_type("feat");
//! if let Some(bump) = bump {
//! let prepared = strategy.preflight(bump, "layer/surface/build/feat/my-feature/SPEC.md")?;
//! prepared.execute("my feature", "layer/surface/build/feat/my-feature/SPEC.md", None)?;
//! }
//! ```
use Result;
use Path;
// ============================================================================
// Core Types
// ============================================================================
/// Version bump types — exhaustive enum, not stringly-typed.
///
/// Per [[compiler-enforced-safety]]: the compiler enforces that every
/// call site handles all variants.
/// Release strategy — enum today, trait/WIT when plugin infra lands.
///
/// Three user profiles:
/// - `Cargo`: Patina-native — Patina owns Cargo.toml (safeguards → bump → commit → tag)
/// - `External`: BYO-version — print reminder, don't touch files
/// - `None`: Spec-only — silent no-op
///
/// Evolution path: enum → trait → WIT (same shape as Mother's children).
/// Prepared release — typestate token from preflight.
///
/// Per [[compiler-enforced-safety]]: `preflight()` returns this token,
/// `execute()` consumes it. Can't release without preflight — the
/// compiler enforces the protocol.
// ============================================================================
// Public Interface
// ============================================================================