dev: enable default ticket tools and workdir helpers

This commit is contained in:
2026-07-18 17:32:46 +09:00
parent 60410f29a1
commit 5e91f98ae0
18 changed files with 713 additions and 11 deletions
+7 -1
View File
@@ -981,7 +981,7 @@ fn builtin_default_profile_artifact() -> serde_json::Value {
"memory": { "enabled": true },
"web": { "enabled": true },
"workers": { "enabled": true },
"ticket": { "enabled": false, "access": "lifecycle" },
"ticket": { "enabled": true, "access": "lifecycle" },
"ticket_orchestration": { "enabled": false }
},
"memory": {
@@ -1761,6 +1761,12 @@ worker_context_max_tokens = 68000
assert!(resolved.manifest.scope.allow.is_empty());
assert!(resolved.manifest.delegation_scope.allow.is_empty());
assert!(resolved.manifest.session.record_event_trace);
assert!(resolved.manifest.feature.ticket.enabled);
assert_eq!(
resolved.manifest.feature.ticket.access,
crate::TicketFeatureAccessConfig::Lifecycle
);
assert!(!resolved.manifest.feature.ticket_orchestration.enabled);
assert_eq!(
resolved.profile.as_ref().unwrap().name.as_deref(),
Some("default")
+3 -1
View File
@@ -237,7 +237,7 @@ enabled = true
enabled = false
[feature.ticket]
enabled = false
enabled = true
access = "lifecycle"
[feature.ticket_orchestration]
@@ -298,6 +298,8 @@ mod tests {
assert!(profile.contains("slug = \"default\""));
assert!(profile.contains("ref = \"codex-oauth/gpt-5.5\""));
assert!(profile.contains("scope = \"workspace_write\""));
assert!(profile.contains("[feature.ticket]\nenabled = true\naccess = \"lifecycle\""));
assert!(profile.contains("[feature.ticket_orchestration]\nenabled = false"));
}
#[test]
+33 -8
View File
@@ -320,20 +320,21 @@ impl LocalGitWorktreeMaterializer {
)
})?;
let status = git_stdout(&source_root, ["status", "--porcelain"])?;
if !status.trim().is_empty() {
return Err(WorkingDirectoryDiagnostic::new(
"working_directory_dirty_source_rejected",
"working directory materialization rejects dirty source repository state",
));
}
let selector = request
.repository
.selector
.as_deref()
.unwrap_or("HEAD")
.to_string();
if selector == "HEAD" {
let status = git_stdout(&source_root, ["status", "--porcelain"])?;
if !status.trim().is_empty() {
return Err(WorkingDirectoryDiagnostic::new(
"working_directory_dirty_source_rejected",
"working directory materialization rejects dirty source repository state",
));
}
}
let commit_spec = format!("{selector}^{{commit}}");
let resolved_commit = git_stdout(&source_root, ["rev-parse", commit_spec.as_str()])?
.trim()
@@ -851,6 +852,30 @@ mod tests {
assert!(error.message.contains("dirty source"));
}
#[test]
fn branch_selector_allows_dirty_source_materialization() {
let repo = create_clean_repo();
git(repo.path(), &["branch", "pinned"]);
fs::write(repo.path().join("dirty.txt"), "dirty\n").unwrap();
let runtime_root = tempfile::tempdir().unwrap();
let materializer = LocalGitWorktreeMaterializer::new(runtime_root.path());
let mut request = request(repo.path());
request.repository.selector = Some(RepositorySelector::from("pinned"));
let binding = materializer.materialize(&worker_ref(1), &request).unwrap();
assert_eq!(
binding
.working_directory
.evidence
.requested_selector
.as_deref(),
Some("pinned")
);
assert!(binding.root.join("README.md").exists());
assert!(!binding.root.join("dirty.txt").exists());
}
#[test]
fn unsupported_remote_and_non_git_provider_return_typed_diagnostics() {
let runtime_root = tempfile::tempdir().unwrap();