huskies: merge 509_bug_create_story_silently_drops_description_and_any_other_unknown_parameters_with_no_error

This commit is contained in:
dave
2026-04-10 10:16:49 +00:00
parent 5377eeae5b
commit c6b6be872b
3 changed files with 44 additions and 1 deletions
+4
View File
@@ -334,6 +334,10 @@ fn handle_tools_list(id: Option<Value>) -> JsonRpcResponse {
"type": "string",
"description": "Optional user story text (As a..., I want..., so that...)"
},
"description": {
"type": "string",
"description": "Optional description / background context for the story"
},
"acceptance_criteria": {
"type": "array",
"items": { "type": "string" },
+30
View File
@@ -20,6 +20,7 @@ pub(super) fn tool_create_story(args: &Value, ctx: &AppContext) -> Result<String
.and_then(|v| v.as_str())
.ok_or("Missing required argument: name")?;
let user_story = args.get("user_story").and_then(|v| v.as_str());
let description = args.get("description").and_then(|v| v.as_str());
let acceptance_criteria: Option<Vec<String>> = args
.get("acceptance_criteria")
.and_then(|v| serde_json::from_value(v.clone()).ok());
@@ -35,6 +36,7 @@ pub(super) fn tool_create_story(args: &Value, ctx: &AppContext) -> Result<String
&root,
name,
user_story,
description,
acceptance_criteria.as_deref(),
depends_on.as_deref(),
commit,
@@ -798,6 +800,34 @@ mod tests {
assert!(result.unwrap_err().contains("Missing required argument"));
}
// Regression test for bug 509: description was silently dropped.
#[test]
fn tool_create_story_description_is_written_to_file() {
let tmp = tempfile::tempdir().unwrap();
let ctx = test_ctx(tmp.path());
let result = tool_create_story(
&json!({
"name": "Story With Description",
"description": "This is the background context."
}),
&ctx,
)
.unwrap();
assert!(result.contains("Created story:"));
let story_id = result.trim_start_matches("Created story: ").trim().to_string();
let content = crate::db::read_content(&story_id).expect("story content should exist");
assert!(
content.contains("## Description"),
"Description section missing from story: {content}"
);
assert!(
content.contains("This is the background context."),
"Description text missing from story: {content}"
);
}
#[test]
fn tool_get_pipeline_status_returns_structured_response() {
let tmp = tempfile::tempdir().unwrap();
+10 -1
View File
@@ -13,6 +13,7 @@ pub fn create_story_file(
root: &std::path::Path,
name: &str,
user_story: Option<&str>,
description: Option<&str>,
acceptance_criteria: Option<&[String]>,
depends_on: Option<&[u32]>,
_commit: bool,
@@ -45,6 +46,13 @@ pub fn create_story_file(
}
content.push('\n');
if let Some(desc) = description {
content.push_str("## Description\n\n");
content.push_str(desc);
content.push('\n');
content.push('\n');
}
content.push_str("## Acceptance Criteria\n\n");
if let Some(criteria) = acceptance_criteria {
for criterion in criteria {
@@ -350,7 +358,7 @@ mod tests {
fn create_story_with_colon_in_name_produces_valid_yaml() {
let tmp = tempfile::tempdir().unwrap();
let name = "Server-owned agent completion: remove report_completion dependency";
let result = create_story_file(tmp.path(), name, None, None, None, false);
let result = create_story_file(tmp.path(), name, None, None, None, None, false);
assert!(result.is_ok(), "create_story_file failed: {result:?}");
let story_id = result.unwrap();
@@ -622,6 +630,7 @@ mod tests {
"Dependent Story",
None,
None,
None,
Some(&[489]),
false,
)