feat: release Dever 0.1.4 with enforceable project guidance

This commit is contained in:
Antigravity committed 2026-10-09 05:33:57 +00:00
1 parent 201bdee372
commit 89629c2197
86 files changed
+2798 -338

No files matched your search

+53 -25
View File
@@ -22,6 +22,10 @@ static NEXT_TEMPORARY: AtomicU64 = AtomicU64::new(0);
#[path = "shared_toolchain_extensions.rs"]
mod extensions;
#[cfg(target_os = "linux")]
#[path = "project_skill.rs"]
mod project_skill;
struct TemporaryDirectory(PathBuf);
impl TemporaryDirectory {
@@ -306,30 +310,16 @@ fn signed_versions_install_select_dispatch_update_and_rollback_atomically() {
fs::read_to_string(skill_path(&layout).join("SKILL.md")).unwrap(),
"skill 1.0.0\n"
);
let skill_entry = temporary.path().join("dever-language");
execute_in(
&layout,
&[
"skill".into(),
"install".into(),
skill_entry.as_os_str().into(),
],
)
.unwrap();
let loader = fs::read(skill_entry.join("SKILL.md")).unwrap();
assert!(String::from_utf8_lossy(&loader).contains("skill path"));
assert!(
execute_in(
&layout,
&[
"skill".into(),
"install".into(),
skill_entry.as_os_str().into()
]
)
.is_err()
);
assert_eq!(fs::read(skill_entry.join("SKILL.md")).unwrap(), loader);
fs::copy(env!("CARGO_BIN_EXE_dever-launcher"), layout.bin().join("dever")).unwrap();
let active_project = temporary.path().join("active-project");
fs::create_dir_all(active_project.join("module")).unwrap();
fs::create_dir(active_project.join("config")).unwrap();
fs::write(active_project.join("config/setting.json"), "{}").unwrap();
install_project_skill(&layout, &active_project);
let rules = fs::read(active_project.join("AGENTS.md")).unwrap();
assert_eq!(rules, project_rules("1.0.0").as_bytes());
install_project_skill(&layout, &active_project);
assert_eq!(fs::read(active_project.join("AGENTS.md")).unwrap(), rules);
let new_project = temporary.path().join("not-created-yet");
let CommandResult::Exited(code) = execute_in(
@@ -351,6 +341,7 @@ fn signed_versions_install_select_dispatch_update_and_rollback_atomically() {
let project = temporary.path().join("project");
fs::create_dir_all(project.join("config")).unwrap();
fs::create_dir(project.join("module")).unwrap();
fs::write(
project.join("config/setting.json"),
r#"{"dever":{"version":"2.0.0"}}"#,
@@ -368,6 +359,11 @@ fn signed_versions_install_select_dispatch_update_and_rollback_atomically() {
Path::new(&pinned_skill),
layout.versions().join("2.0.0/skills/dever-language")
);
install_project_skill(&layout, &project);
assert_eq!(
fs::read_to_string(project.join("AGENTS.md")).unwrap(),
project_rules("2.0.0")
);
let CommandResult::Exited(code) = execute_in(&layout, &arguments).unwrap() else {
panic!("project command must dispatch")
};
@@ -393,7 +389,12 @@ fn signed_versions_install_select_dispatch_update_and_rollback_atomically() {
fs::read_to_string(skill_path(&layout).join("SKILL.md")).unwrap(),
"skill 2.0.0\n"
);
assert_eq!(fs::read(skill_entry.join("SKILL.md")).unwrap(), loader);
assert_eq!(fs::read(active_project.join("AGENTS.md")).unwrap(), rules);
install_project_skill(&layout, &active_project);
assert_eq!(
fs::read_to_string(active_project.join("AGENTS.md")).unwrap(),
project_rules("2.0.0")
);
fs::write(layout.downloads().join("latest"), "1.0.0\n").unwrap();
assert!(
manager
@@ -1342,12 +1343,16 @@ fn write_release(
let skill = root.join("skills/dever-language/SKILL.md");
fs::create_dir_all(skill.parent().unwrap()).unwrap();
fs::write(&skill, format!("skill {version}\n")).unwrap();
let rules = root.join("skills/dever-language/assets/template/AGENTS.md");
fs::create_dir_all(rules.parent().unwrap()).unwrap();
fs::write(&rules, project_rules(version)).unwrap();
let manifest = ReleaseManifest::new(
Version::parse(version).unwrap(),
vec![
artifact(&core, "dever-core"),
artifact(&runtime, "runtime.pack"),
artifact(&skill, "skills/dever-language/SKILL.md"),
artifact(&rules, "skills/dever-language/assets/template/AGENTS.md"),
],
);
let bytes = serde_json::to_vec(&manifest).unwrap();
@@ -1359,6 +1364,29 @@ fn write_release(
fs::write(root.join("manifest.sig"), format!("{}\n", hex(&signature))).unwrap();
}
#[cfg(unix)]
fn project_rules(version: &str) -> String {
include_str!("../../skills/assets/template/AGENTS.md").replace(
"<!-- dever-language:end -->",
&format!("<!-- fixture version {version} -->\n<!-- dever-language:end -->"),
)
}
#[cfg(unix)]
fn install_project_skill(layout: &Layout, project: &Path) {
let output = Command::new(layout.bin().join("dever"))
.args(["skill", "install"])
.current_dir(project)
.env_clear()
.output()
.unwrap();
assert!(
output.status.success(),
"{}",
String::from_utf8_lossy(&output.stderr)
);
}
fn artifact(path: &Path, relative: &str) -> Artifact {
let bytes = fs::read(path).unwrap();
Artifact {