refactor: remove workflow machinery
This commit is contained in:
@@ -49,9 +49,8 @@ pub fn ticket_config_scaffold() -> String {
|
||||
);
|
||||
for role in TicketRole::ALL {
|
||||
out.push_str(&format!(
|
||||
"\n[ticket.roles.{role}]\nprofile = \"{}\"\nworkflow = \"{}\"\n",
|
||||
"\n[ticket.roles.{role}]\nprofile = \"{}\"\n",
|
||||
role.default_profile(),
|
||||
role.default_workflow()
|
||||
));
|
||||
}
|
||||
out
|
||||
@@ -349,10 +348,6 @@ impl TicketConfig {
|
||||
pub fn launch_prompt_for(&self, role: TicketRole) -> Option<&PromptRef> {
|
||||
self.role(role).launch_prompt.as_ref()
|
||||
}
|
||||
|
||||
pub fn workflow_for(&self, role: TicketRole) -> &WorkflowRef {
|
||||
&self.role(role).workflow
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
@@ -437,14 +432,6 @@ impl TicketRole {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn default_workflow(self) -> &'static str {
|
||||
match self {
|
||||
Self::Intake => "ticket-intake-workflow",
|
||||
Self::Orchestrator => "ticket-orchestrator-routing",
|
||||
Self::Coder | Self::Reviewer => "multi-agent-workflow",
|
||||
}
|
||||
}
|
||||
|
||||
pub fn default_profile(self) -> &'static str {
|
||||
match self {
|
||||
Self::Intake => "builtin:intake",
|
||||
@@ -576,15 +563,13 @@ pub enum TicketRoleLaunchConfigError {
|
||||
pub struct TicketRoleConfig {
|
||||
pub profile: ProfileSelectorRef,
|
||||
pub launch_prompt: Option<PromptRef>,
|
||||
pub workflow: WorkflowRef,
|
||||
}
|
||||
|
||||
impl TicketRoleConfig {
|
||||
pub fn default_for_role(role: TicketRole) -> Self {
|
||||
pub fn default_for_role(_role: TicketRole) -> Self {
|
||||
Self {
|
||||
profile: ProfileSelectorRef::inherit(),
|
||||
launch_prompt: None,
|
||||
workflow: WorkflowRef::from_static(role.default_workflow()),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -685,45 +670,6 @@ impl AsRef<str> for PromptRef {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]
|
||||
pub struct WorkflowRef(String);
|
||||
|
||||
impl WorkflowRef {
|
||||
pub fn new(value: impl Into<String>) -> Result<Self, String> {
|
||||
normalized_non_empty(value, "workflow ref").map(Self)
|
||||
}
|
||||
|
||||
pub fn from_static(value: &'static str) -> Self {
|
||||
Self(value.to_string())
|
||||
}
|
||||
|
||||
pub fn as_str(&self) -> &str {
|
||||
self.0.as_str()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'de> Deserialize<'de> for WorkflowRef {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: serde::Deserializer<'de>,
|
||||
{
|
||||
let value = String::deserialize(deserializer)?;
|
||||
Self::new(value).map_err(serde::de::Error::custom)
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for WorkflowRef {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.write_str(self.as_str())
|
||||
}
|
||||
}
|
||||
|
||||
impl AsRef<str> for WorkflowRef {
|
||||
fn as_ref(&self) -> &str {
|
||||
self.as_str()
|
||||
}
|
||||
}
|
||||
|
||||
fn normalized_non_empty(value: impl Into<String>, label: &str) -> Result<String, String> {
|
||||
let value = value.into();
|
||||
let trimmed = value.trim();
|
||||
@@ -930,18 +876,13 @@ struct RawTicketRoleConfig {
|
||||
profile: Option<ProfileSelectorRef>,
|
||||
#[serde(default)]
|
||||
launch_prompt: Option<PromptRef>,
|
||||
#[serde(default)]
|
||||
workflow: Option<WorkflowRef>,
|
||||
}
|
||||
|
||||
impl RawTicketRoleConfig {
|
||||
fn resolve(self, role: TicketRole) -> TicketRoleConfig {
|
||||
fn resolve(self, _role: TicketRole) -> TicketRoleConfig {
|
||||
TicketRoleConfig {
|
||||
profile: self.profile.unwrap_or_else(ProfileSelectorRef::inherit),
|
||||
launch_prompt: self.launch_prompt,
|
||||
workflow: self
|
||||
.workflow
|
||||
.unwrap_or_else(|| WorkflowRef::from_static(role.default_workflow())),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -999,7 +940,6 @@ mod tests {
|
||||
let role_config = config.role(role);
|
||||
assert_eq!(role_config.profile.as_str(), "inherit");
|
||||
assert!(role_config.launch_prompt.is_none());
|
||||
assert_eq!(role_config.workflow.as_str(), role.default_workflow());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1108,22 +1048,18 @@ worktree_name = "custom-orchestrator"
|
||||
[ticket.roles.intake]
|
||||
profile = "project:intake"
|
||||
launch_prompt = "$workspace/ticket/intake/launch"
|
||||
workflow = "ticket-intake-workflow"
|
||||
|
||||
[ticket.roles.orchestrator]
|
||||
profile = "project:orchestrator"
|
||||
launch_prompt = "$workspace/ticket/orchestrator/launch"
|
||||
workflow = "ticket-orchestrator-routing"
|
||||
|
||||
[ticket.roles.coder]
|
||||
profile = "inherit"
|
||||
launch_prompt = "$workspace/ticket/coder/launch"
|
||||
workflow = "multi-agent-workflow"
|
||||
|
||||
[ticket.roles.reviewer]
|
||||
profile = "project:reviewer"
|
||||
launch_prompt = "$workspace/ticket/reviewer/launch"
|
||||
workflow = "multi-agent-workflow"
|
||||
"#,
|
||||
);
|
||||
|
||||
@@ -1161,10 +1097,6 @@ workflow = "multi-agent-workflow"
|
||||
.as_str(),
|
||||
"$workspace/ticket/reviewer/launch"
|
||||
);
|
||||
assert_eq!(
|
||||
config.workflow_for(TicketRole::Reviewer).as_str(),
|
||||
"multi-agent-workflow"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -1184,8 +1116,7 @@ workflow = "multi-agent-workflow"
|
||||
assert!(scaffold.contains(&format!("[ticket.roles.{role}]")));
|
||||
assert!(scaffold.contains(&format!(
|
||||
"[ticket.roles.{role}]\nprofile = \"{}\"\nworkflow = \"{}\"",
|
||||
role.default_profile(),
|
||||
role.default_workflow()
|
||||
role.default_profile()
|
||||
)));
|
||||
}
|
||||
assert!(!scaffold.contains("[ticket.roles.investigator]"));
|
||||
@@ -1211,7 +1142,6 @@ workflow = "multi-agent-workflow"
|
||||
for role in TicketRole::ALL {
|
||||
let role_config = config.role_launch_config(role).unwrap();
|
||||
assert_eq!(role_config.profile.as_str(), role.default_profile());
|
||||
assert_eq!(role_config.workflow.as_str(), role.default_workflow());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1230,7 +1160,6 @@ profile = "project:coder"
|
||||
let coder = config.role(TicketRole::Coder);
|
||||
assert_eq!(coder.profile.as_str(), "project:coder");
|
||||
assert!(coder.launch_prompt.is_none());
|
||||
assert_eq!(coder.workflow.as_str(), "multi-agent-workflow");
|
||||
assert_eq!(config.profile_for(TicketRole::Reviewer).as_str(), "inherit");
|
||||
}
|
||||
|
||||
@@ -1319,7 +1248,6 @@ branch = "orchestration/panel:bad"
|
||||
temp.path(),
|
||||
r#"
|
||||
[roles.orchestrator]
|
||||
workflow = "ticket-orchestrator-routing"
|
||||
"#,
|
||||
);
|
||||
|
||||
@@ -1386,7 +1314,6 @@ profile = "inherit"
|
||||
r#"
|
||||
[roles.investigator]
|
||||
profile = "builtin:default"
|
||||
workflow = "ticket-orchestrator-routing"
|
||||
"#,
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user