feat(TASK-038): add hooks builtin-asset category with example scripts and roles mixin scanning
- AssetCategory::Hooks + InstallFilter::Hooks (NAMES/parse/clap), reserving
the 'hooks' bundle name via the existing AssetCategory::parse check
- HookAssets embed + install_builtin_hooks(force): installs the bundled
example scripts 0755 into paths::hooks_dir() via write_file_atomic, wired
into install_builtins() and install_assets(); warns once when
COYOTE_HOOKS_DIR diverges from the config-dir default
- assets/hooks/notify.sh: notify-send -> osascript -> terminal fallback,
with AppleScript-literal sanitization of model-influenced values
- assets/hooks/log-events.sh: appends a COYOTE_* env snapshot (secrets
excluded, 0600 log, symlink-refusing) to ${COYOTE_HOOK_LOG:-/tmp/coyote-hooks.log}
- sbx-mixin discovery now scans roles/*.sbx-mixin.yaml and
roles/hooks/*.sbx-mixin.yaml (mirroring the role-hook cwd)
- tests: install+0755+force, install_assets(Hooks) end-to-end, discover()
roles scanning, reserved bundle name, no-ARGC-BUILD embed content, script
content order + real execution (secret exclusion, tty-less fallback),
CLI parser round-trips; hooks_dir env test made #[serial]
This commit is contained in:
9 files changed
+439
-4
No files matched your search
@@ -609,6 +609,10 @@ mod tests {
|
||||
parse(&["--install-builtins", "mcp_config"]).install_builtins,
|
||||
Some(AssetCategory::McpConfig)
|
||||
);
|
||||
assert_eq!(
|
||||
parse(&["--install-builtins", "hooks"]).install_builtins,
|
||||
Some(AssetCategory::Hooks)
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -620,12 +624,14 @@ mod tests {
|
||||
assert!(category.get_name_and_aliases().any(|n| n == "mcp_config"));
|
||||
assert!(AssetCategory::NAMES.contains(&"mcp-config"));
|
||||
assert!(!AssetCategory::NAMES.contains(&"mcp_config"));
|
||||
assert!(AssetCategory::NAMES.contains(&"hooks"));
|
||||
|
||||
let filter = InstallFilter::McpConfig.to_possible_value().unwrap();
|
||||
assert_eq!(filter.get_name(), "mcp-config");
|
||||
assert!(filter.get_name_and_aliases().any(|n| n == "mcp_config"));
|
||||
assert!(InstallFilter::NAMES.contains(&"mcp-config"));
|
||||
assert!(!InstallFilter::NAMES.contains(&"mcp_config"));
|
||||
assert!(InstallFilter::NAMES.contains(&"hooks"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -685,6 +691,10 @@ mod tests {
|
||||
.filter,
|
||||
Some(InstallFilter::McpConfig)
|
||||
);
|
||||
assert_eq!(
|
||||
parse(&["--install", "https://github.com/x/y", "--filter", "hooks"]).filter,
|
||||
Some(InstallFilter::Hooks)
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in new issue
Block a user