fix(module_host): grant Landlock access to IPC socket path
All checks were successful
dev release / build (push) Successful in 1m2s
All checks were successful
dev release / build (push) Successful in 1m2s
Out-of-process modules timed out with "did not report ready within 45s" because apply_sandbox never allowed the child to reach breadd's Unix socket. Path-based AF_UNIX connect is mediated as filesystem access, so without a rule for the socket (and its parent) UnixStream::connect failed with EACCES and the hello handshake never completed. Pass socket_path into apply_sandbox and add baseline ReadDir/ReadFile rules for the socket directory and path, matching the existing module- directory grant. Update unit-test call sites accordingly.
This commit is contained in:
parent
81fbc46e4f
commit
da889d6f6a
12 changed files with 31458 additions and 30915 deletions
|
|
@ -262,6 +262,7 @@ pub fn spawn_module_host(
|
||||||
let sandbox_bin_path = bin_path.clone();
|
let sandbox_bin_path = bin_path.clone();
|
||||||
let sandbox_module_name = module_name.to_string();
|
let sandbox_module_name = module_name.to_string();
|
||||||
let sandbox_entry_path = entry_path.to_path_buf();
|
let sandbox_entry_path = entry_path.to_path_buf();
|
||||||
|
let sandbox_socket_path = socket_path.to_path_buf();
|
||||||
// SAFETY: the closure runs in the forked child between fork() and
|
// SAFETY: the closure runs in the forked child between fork() and
|
||||||
// execve() (that's what pre_exec is for). It only touches its own
|
// execve() (that's what pre_exec is for). It only touches its own
|
||||||
// captured, already-allocated data plus filesystem/landlock syscalls —
|
// captured, already-allocated data plus filesystem/landlock syscalls —
|
||||||
|
|
@ -270,11 +271,17 @@ pub fn spawn_module_host(
|
||||||
// restricting a spawned child.
|
// restricting a spawned child.
|
||||||
unsafe {
|
unsafe {
|
||||||
cmd.pre_exec(move || {
|
cmd.pre_exec(move || {
|
||||||
apply_sandbox(&sandbox_bin_path, &sandbox_entry_path, &sandbox_permissions).map_err(|e| {
|
apply_sandbox(
|
||||||
std::io::Error::other(format!(
|
&sandbox_bin_path,
|
||||||
"landlock sandbox setup failed for module '{sandbox_module_name}': {e}"
|
&sandbox_entry_path,
|
||||||
))
|
&sandbox_socket_path,
|
||||||
})
|
&sandbox_permissions,
|
||||||
|
)
|
||||||
|
.map_err(|e| {
|
||||||
|
std::io::Error::other(format!(
|
||||||
|
"landlock sandbox setup failed for module '{sandbox_module_name}': {e}"
|
||||||
|
))
|
||||||
|
})
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -451,6 +458,7 @@ pub fn resolve_module_host_binary() -> PathBuf {
|
||||||
fn apply_sandbox(
|
fn apply_sandbox(
|
||||||
module_host_bin: &Path,
|
module_host_bin: &Path,
|
||||||
entry_path: &Path,
|
entry_path: &Path,
|
||||||
|
socket_path: &Path,
|
||||||
permissions: &[ModulePermission],
|
permissions: &[ModulePermission],
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let abi = ABI::V1;
|
let abi = ABI::V1;
|
||||||
|
|
@ -509,6 +517,36 @@ fn apply_sandbox(
|
||||||
})?;
|
})?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// The module-host must connect back to breadd over this Unix socket
|
||||||
|
// (BREAD_MODULE_SOCKET). Path-based AF_UNIX connect is mediated by
|
||||||
|
// Landlock as filesystem access — without a rule for the socket path
|
||||||
|
// (and walk access on its parent), UnixStream::connect fails with
|
||||||
|
// EACCES, the hello handshake never completes, and every
|
||||||
|
// out-of-process module times out with "did not report ready".
|
||||||
|
if let Some(socket_dir) = socket_path.parent() {
|
||||||
|
if let Ok(fd) = PathFd::new(socket_dir) {
|
||||||
|
ruleset = ruleset
|
||||||
|
.add_rule(PathBeneath::new(fd, read_only))
|
||||||
|
.map_err(|e| {
|
||||||
|
anyhow!(
|
||||||
|
"landlock rule for socket directory {}: {e}",
|
||||||
|
socket_dir.display()
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if socket_path.exists() {
|
||||||
|
if let Ok(fd) = PathFd::new(socket_path) {
|
||||||
|
ruleset = ruleset
|
||||||
|
.add_rule(PathBeneath::new(fd, read_file_only))
|
||||||
|
.map_err(|e| {
|
||||||
|
anyhow!(
|
||||||
|
"landlock rule for socket {}: {e}",
|
||||||
|
socket_path.display()
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for perm in permissions {
|
for perm in permissions {
|
||||||
match perm.kind {
|
match perm.kind {
|
||||||
|
|
@ -652,7 +690,12 @@ mod tests {
|
||||||
let sandbox_bin = sh_bin.clone();
|
let sandbox_bin = sh_bin.clone();
|
||||||
unsafe {
|
unsafe {
|
||||||
cmd.pre_exec(move || {
|
cmd.pre_exec(move || {
|
||||||
apply_sandbox(&sandbox_bin, Path::new("/nonexistent/dummy/entry.lua"), &permissions)
|
apply_sandbox(
|
||||||
|
&sandbox_bin,
|
||||||
|
Path::new("/nonexistent/dummy/entry.lua"),
|
||||||
|
Path::new("/nonexistent/dummy/breadd.sock"),
|
||||||
|
&permissions,
|
||||||
|
)
|
||||||
.map_err(|e| std::io::Error::other(e.to_string()))
|
.map_err(|e| std::io::Error::other(e.to_string()))
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -690,7 +733,7 @@ mod tests {
|
||||||
&script_path,
|
&script_path,
|
||||||
std::os::unix::fs::PermissionsExt::from_mode(0o755),
|
std::os::unix::fs::PermissionsExt::from_mode(0o755),
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
// No permissions granted at all: the sandboxed process should not
|
// No permissions granted at all: the sandboxed process should not
|
||||||
// be able to execute ANYTHING, including a script sitting right
|
// be able to execute ANYTHING, including a script sitting right
|
||||||
|
|
@ -707,7 +750,12 @@ mod tests {
|
||||||
let sandbox_bin = sh_bin.clone();
|
let sandbox_bin = sh_bin.clone();
|
||||||
unsafe {
|
unsafe {
|
||||||
cmd.pre_exec(move || {
|
cmd.pre_exec(move || {
|
||||||
apply_sandbox(&sandbox_bin, Path::new("/nonexistent/dummy/entry.lua"), &permissions)
|
apply_sandbox(
|
||||||
|
&sandbox_bin,
|
||||||
|
Path::new("/nonexistent/dummy/entry.lua"),
|
||||||
|
Path::new("/nonexistent/dummy/breadd.sock"),
|
||||||
|
&permissions,
|
||||||
|
)
|
||||||
.map_err(|e| std::io::Error::other(e.to_string()))
|
.map_err(|e| std::io::Error::other(e.to_string()))
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1 +0,0 @@
|
||||||
{"files": {"code": ["/home/breadway/Projects/bread/bread-cli/src/hooks_git.rs", "/home/breadway/Projects/bread/bread-cli/src/hooks_shell.rs", "/home/breadway/Projects/bread/bread-cli/src/lib.rs", "/home/breadway/Projects/bread/bread-cli/src/main.rs", "/home/breadway/Projects/bread/bread-cli/src/modules_mgmt.rs", "/home/breadway/Projects/bread/bread-cli/tests/modules.rs", "/home/breadway/Projects/bread/bread-emit/src/main.rs", "/home/breadway/Projects/bread/bread-shared/src/apps.rs", "/home/breadway/Projects/bread/bread-shared/src/glob.rs", "/home/breadway/Projects/bread/bread-shared/src/lib.rs", "/home/breadway/Projects/bread/bread-shared/src/widget.rs", "/home/breadway/Projects/bread/breadd/src/adapters/bluetooth.rs", "/home/breadway/Projects/bread/breadd/src/adapters/filesystem.rs", "/home/breadway/Projects/bread/breadd/src/adapters/git.rs", "/home/breadway/Projects/bread/breadd/src/adapters/hyprland.rs", "/home/breadway/Projects/bread/breadd/src/adapters/mod.rs", "/home/breadway/Projects/bread/breadd/src/adapters/network.rs", "/home/breadway/Projects/bread/breadd/src/adapters/network_rtnetlink.rs", "/home/breadway/Projects/bread/breadd/src/adapters/podman.rs", "/home/breadway/Projects/bread/breadd/src/adapters/power.rs", "/home/breadway/Projects/bread/breadd/src/adapters/power_upower.rs", "/home/breadway/Projects/bread/breadd/src/adapters/systemd.rs", "/home/breadway/Projects/bread/breadd/src/adapters/udev.rs", "/home/breadway/Projects/bread/breadd/src/core/config.rs", "/home/breadway/Projects/bread/breadd/src/core/mod.rs", "/home/breadway/Projects/bread/breadd/src/core/normalizer.rs", "/home/breadway/Projects/bread/breadd/src/core/state_engine.rs", "/home/breadway/Projects/bread/breadd/src/core/subscriptions.rs", "/home/breadway/Projects/bread/breadd/src/core/supervisor.rs", "/home/breadway/Projects/bread/breadd/src/core/types.rs", "/home/breadway/Projects/bread/breadd/src/ipc/mod.rs", "/home/breadway/Projects/bread/breadd/src/lua/mod.rs", "/home/breadway/Projects/bread/breadd/src/main.rs", "/home/breadway/Projects/bread/breadd/tests/ipc_integration.rs", "/home/breadway/Projects/bread/examples/modules/active-window-widget.lua", "/home/breadway/Projects/bread/examples/modules/bluetooth-toggle-widget.lua", "/home/breadway/Projects/bread/examples/modules/cpu-temp-widget.lua", "/home/breadway/Projects/bread/examples/modules/dock-monitors.lua", "/home/breadway/Projects/bread/examples/modules/dock-workflow.lua", "/home/breadway/Projects/bread/examples/modules/focus-mode-widget.lua", "/home/breadway/Projects/bread/examples/modules/git-branch-widget.lua", "/home/breadway/Projects/bread/examples/modules/low-battery-warning.lua", "/home/breadway/Projects/bread/examples/modules/pause-media-on-headphone-unplug.lua", "/home/breadway/Projects/bread/examples/modules/workflow-status-widget.lua", "/home/breadway/Projects/bread/scripts/install.sh"], "document": ["/home/breadway/Projects/bread/.forgejo/workflows/dev-release.yml", "/home/breadway/Projects/bread/.forgejo/workflows/rc-release.yml", "/home/breadway/Projects/bread/.forgejo/workflows/release.yml", "/home/breadway/Projects/bread/CONTRIBUTING.md", "/home/breadway/Projects/bread/Documentation.md", "/home/breadway/Projects/bread/Examples.md", "/home/breadway/Projects/bread/README.md", "/home/breadway/Projects/bread/examples/modules/README.md", "/home/breadway/Projects/bread/packaging/README.md"], "paper": [], "image": [], "video": []}, "total_files": 54, "total_words": 53979, "needs_graph": true, "warning": null, "skipped_sensitive": [], "unclassified": ["/home/breadway/Projects/bread/.gitignore", "/home/breadway/Projects/bread/Cargo.toml", "/home/breadway/Projects/bread/LICENSE", "/home/breadway/Projects/bread/bakery.toml", "/home/breadway/Projects/bread/bread-cli/Cargo.toml", "/home/breadway/Projects/bread/bread-emit/Cargo.toml", "/home/breadway/Projects/bread/bread-shared/Cargo.toml", "/home/breadway/Projects/bread/breadd/Cargo.toml", "/home/breadway/Projects/bread/packaging/systemd/breadd.service"], "walk_errors": [], "ignored": ["/home/breadway/Projects/bread/.claude/", "/home/breadway/Projects/bread/CLAUDE.md", "/home/breadway/Projects/bread/Overview.md"], "pruned_noise_dirs": ["/home/breadway/Projects/bread/.git/", "/home/breadway/Projects/bread/.idea/", "/home/breadway/Projects/bread/graphify-out/", "/home/breadway/Projects/bread/target/"], "graphifyignore_patterns": 26, "scan_root": "/home/breadway/Projects/bread"}
|
|
||||||
1
graphify-out/.graphify_labels.json
Normal file
1
graphify-out/.graphify_labels.json
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"0": "Lua Runtime Core", "1": "Adapter Framework", "2": "Adapter Configuration", "3": "App Classification", "4": "Widget Spec & Placement", "5": "Adapter Implementations", "6": "Filesystem Adapter", "7": "Git State Tracking", "8": "Integration Tests", "9": "State Engine", "10": "Module Management", "11": "Systemd Adapter", "12": "Git Hooks", "13": "CLI Core", "14": "Type Definitions", "15": "Podman Adapter", "16": "Event Routing", "17": "Udev Adapter", "18": "Shell Hooks", "19": "Bluetooth Adapter", "20": "Subscription System", "21": "Glob Pattern Matching", "22": "Event Dispatch", "23": "Network RTNetlink", "24": "Network Adapter", "25": "Power Management", "26": "Hyprland Integration", "27": "UPower Integration", "28": "CI/CD Workflows", "29": "Git Widget", "30": "Emit CLI Tool", "31": "Shared Library Init", "32": "Active Window Widget", "33": "CPU Temp Widget", "34": "Focus Mode Widget", "35": "Workflow Status Widget", "36": "Widget API Documentation", "37": "Bluetooth Widget", "38": "Media Pause Widget", "39": "Module Patterns", "40": "Monitor Dock", "41": "Workflow Dock", "42": "Battery Warning", "43": "Install Script", "44": "Filesystem Adapter Spec", "45": "Git Adapter Spec", "46": "Podman Adapter Spec", "47": "Systemd Adapter Spec", "48": "Lua Timer API (after)", "49": "Lua Bluetooth API", "50": "Lua Timer API (every)", "51": "Lua Exec API", "52": "Lua Hyprland API", "53": "Lua Notify API", "54": "Lua State Watch API", "55": "Emit Binary Build", "56": "Adapters Module", "57": "System Startup Event", "58": "Monitor Layout Config", "59": "Binds Module", "60": "Bakery Package Manager", "61": "GUI Control Center Roadmap", "62": "Cross-Device Mesh Roadmap", "63": "Version Computation"}
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
/home/breadway/Projects/bread/.forgejo/workflows/dev-release.yml
|
|
||||||
/home/breadway/Projects/bread/.forgejo/workflows/rc-release.yml
|
|
||||||
/home/breadway/Projects/bread/.forgejo/workflows/release.yml
|
|
||||||
/home/breadway/Projects/bread/CONTRIBUTING.md
|
|
||||||
/home/breadway/Projects/bread/Documentation.md
|
|
||||||
/home/breadway/Projects/bread/Examples.md
|
|
||||||
/home/breadway/Projects/bread/README.md
|
|
||||||
/home/breadway/Projects/bread/examples/modules/README.md
|
|
||||||
/home/breadway/Projects/bread/packaging/README.md
|
|
||||||
275
graphify-out/GRAPH_REPORT.md
Normal file
275
graphify-out/GRAPH_REPORT.md
Normal file
|
|
@ -0,0 +1,275 @@
|
||||||
|
# Graph Report - . (2026-08-04)
|
||||||
|
|
||||||
|
## Corpus Check
|
||||||
|
- 55 files · ~54,650 words
|
||||||
|
- Verdict: corpus is large enough that graph structure adds value.
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
- 978 nodes · 2283 edges · 64 communities (41 shown, 23 thin omitted)
|
||||||
|
- Extraction: 99% EXTRACTED · 1% INFERRED · 0% AMBIGUOUS · INFERRED: 33 edges (avg confidence: 0.77)
|
||||||
|
- Token cost: 72,759 input · 0 output
|
||||||
|
|
||||||
|
## Community Hubs (Navigation)
|
||||||
|
- Lua Runtime Core
|
||||||
|
- Adapter Framework
|
||||||
|
- Adapter Configuration
|
||||||
|
- App Classification
|
||||||
|
- Widget Spec & Placement
|
||||||
|
- Adapter Implementations
|
||||||
|
- Filesystem Adapter
|
||||||
|
- Git State Tracking
|
||||||
|
- Integration Tests
|
||||||
|
- State Engine
|
||||||
|
- Module Management
|
||||||
|
- Systemd Adapter
|
||||||
|
- Git Hooks
|
||||||
|
- CLI Core
|
||||||
|
- Type Definitions
|
||||||
|
- Podman Adapter
|
||||||
|
- Event Routing
|
||||||
|
- Udev Adapter
|
||||||
|
- Shell Hooks
|
||||||
|
- Bluetooth Adapter
|
||||||
|
- Subscription System
|
||||||
|
- Glob Pattern Matching
|
||||||
|
- Event Dispatch
|
||||||
|
- Network RTNetlink
|
||||||
|
- Network Adapter
|
||||||
|
- Power Management
|
||||||
|
- Hyprland Integration
|
||||||
|
- UPower Integration
|
||||||
|
- CI/CD Workflows
|
||||||
|
- Git Widget
|
||||||
|
- Emit CLI Tool
|
||||||
|
- Shared Library Init
|
||||||
|
- Active Window Widget
|
||||||
|
- CPU Temp Widget
|
||||||
|
- Focus Mode Widget
|
||||||
|
- Workflow Status Widget
|
||||||
|
- Widget API Documentation
|
||||||
|
- Bluetooth Widget
|
||||||
|
- Media Pause Widget
|
||||||
|
- Module Patterns
|
||||||
|
- Install Script
|
||||||
|
- Filesystem Adapter Spec
|
||||||
|
- Git Adapter Spec
|
||||||
|
- Podman Adapter Spec
|
||||||
|
- Systemd Adapter Spec
|
||||||
|
- Lua Timer API (after)
|
||||||
|
- Lua Bluetooth API
|
||||||
|
- Lua Timer API (every)
|
||||||
|
- Lua Exec API
|
||||||
|
- Lua Hyprland API
|
||||||
|
- Lua Notify API
|
||||||
|
- Lua State Watch API
|
||||||
|
- System Startup Event
|
||||||
|
- Monitor Layout Config
|
||||||
|
- Binds Module
|
||||||
|
- Bakery Package Manager
|
||||||
|
- GUI Control Center Roadmap
|
||||||
|
- Cross-Device Mesh Roadmap
|
||||||
|
- Version Computation
|
||||||
|
|
||||||
|
## God Nodes (most connected - your core abstractions)
|
||||||
|
1. `LuaEngine` - 52 edges
|
||||||
|
2. `RawEvent` - 47 edges
|
||||||
|
3. `RuntimeState` - 34 edges
|
||||||
|
4. `BreadEvent` - 30 edges
|
||||||
|
5. `raw()` - 30 edges
|
||||||
|
6. `StateHandle` - 27 edges
|
||||||
|
7. `now_unix_ms()` - 25 edges
|
||||||
|
8. `Adapter` - 25 edges
|
||||||
|
9. `SubscriptionId` - 25 edges
|
||||||
|
10. `Server` - 22 edges
|
||||||
|
|
||||||
|
## Surprising Connections (you probably didn't know these)
|
||||||
|
- `parse_bluetooth_message()` --calls--> `now_unix_ms()` [INFERRED]
|
||||||
|
breadd/src/adapters/bluetooth.rs → bread-shared/src/lib.rs
|
||||||
|
- `try_enumerate()` --calls--> `now_unix_ms()` [INFERRED]
|
||||||
|
breadd/src/adapters/bluetooth.rs → bread-shared/src/lib.rs
|
||||||
|
- `classify()` --calls--> `now_unix_ms()` [INFERRED]
|
||||||
|
breadd/src/adapters/filesystem.rs → bread-shared/src/lib.rs
|
||||||
|
- `network_raw_event()` --calls--> `now_unix_ms()` [INFERRED]
|
||||||
|
breadd/src/adapters/network.rs → bread-shared/src/lib.rs
|
||||||
|
- `power_raw_event()` --calls--> `now_unix_ms()` [INFERRED]
|
||||||
|
breadd/src/adapters/power.rs → bread-shared/src/lib.rs
|
||||||
|
|
||||||
|
## Import Cycles
|
||||||
|
- 2-file cycle: `breadd/src/core/state_engine.rs -> breadd/src/lua/mod.rs -> breadd/src/core/state_engine.rs`
|
||||||
|
|
||||||
|
## Hyperedges (group relationships)
|
||||||
|
- **** — ci_dev_release, workflow_version_compute, release_track_dev, distribution_dl_breadway_dev, package_bakery [INFERRED]
|
||||||
|
- **** — adapter_udev, adapter_hyprland, adapter_power, sys_bread_daemon, api_bread_on, sys_lua_runtime [INFERRED]
|
||||||
|
- **** — config_init_lua, config_modules_dir, pattern_module_skeleton, api_bread_on, sys_lua_runtime [INFERRED]
|
||||||
|
- **** — api_bread_workflow, api_bread_spawn, api_bread_wait, example_dock_workflow, api_bread_notify [INFERRED]
|
||||||
|
- **** — api_bread_widget, api_bread_every, example_widget_cpu_temp, api_bread_state_watch [INFERRED]
|
||||||
|
- **** — branch_main, ci_dev_release, ci_rc_release, ci_stable_release, release_track_dev, release_track_beta, release_track_stable [INFERRED]
|
||||||
|
|
||||||
|
## Communities (64 total, 23 thin omitted)
|
||||||
|
|
||||||
|
### Community 0 - "Lua Runtime Core"
|
||||||
|
Cohesion: 0.06
|
||||||
|
Nodes (80): now_unix_ms(), WidgetPlacement, WidgetSpec, RuntimeState, bluetooth_connect(), bluetooth_disconnect(), bluetooth_find_adapter(), bluetooth_get_powered() (+72 more)
|
||||||
|
|
||||||
|
### Community 1 - "Adapter Framework"
|
||||||
|
Cohesion: 0.07
|
||||||
|
Nodes (52): adapter_source_is_hashable_and_eq(), AdapterSource, bread_event_new_accepts_owned_and_borrowed_names(), bread_event_new_sets_current_timestamp(), BreadEvent, DaemonSection, expand_path(), now_unix_ms_is_monotonically_non_decreasing_across_calls() (+44 more)
|
||||||
|
|
||||||
|
### Community 2 - "Adapter Configuration"
|
||||||
|
Cohesion: 0.07
|
||||||
|
Nodes (45): AdaptersConfig, AdapterToggle, Config, config_path(), config_path_falls_back_to_home_when_no_xdg(), config_path_respects_xdg_config_home(), DaemonConfig, default_config_uses_documented_defaults() (+37 more)
|
||||||
|
|
||||||
|
### Community 3 - "App Classification"
|
||||||
|
Cohesion: 0.06
|
||||||
|
Nodes (36): A, is_known_app(), validate_app_namespace(), AdapterStatus, Manager, Arc, HashMap, Receiver (+28 more)
|
||||||
|
|
||||||
|
### Community 4 - "Widget Spec & Placement"
|
||||||
|
Cohesion: 0.07
|
||||||
|
Nodes (31): accepts_node_count_at_max(), accepts_tree_at_max_depth(), Align, Background, box_of(), default_orientation(), FontWeight, is_valid_class() (+23 more)
|
||||||
|
|
||||||
|
### Community 5 - "Adapter Implementations"
|
||||||
|
Cohesion: 0.06
|
||||||
|
Nodes (39): Bluetooth Adapter, Hyprland Adapter, Network Adapter, Power Adapter, udev Adapter, bread.on(pattern, fn), bread.spawn(fn), bread.wait(pattern, opts) (+31 more)
|
||||||
|
|
||||||
|
### Community 6 - "Filesystem Adapter"
|
||||||
|
Cohesion: 0.12
|
||||||
|
Nodes (28): classify(), classify_build_artifact_created_in_target(), classify_debounces_rapid_repeat_events_for_same_path(), classify_file_changed_for_ordinary_source_file(), classify_silent_for_modify_in_target_not_create(), classify_silent_under_git(), classify_silent_under_node_modules(), detect_markers() (+20 more)
|
||||||
|
|
||||||
|
### Community 7 - "Git State Tracking"
|
||||||
|
Cohesion: 0.12
|
||||||
|
Nodes (22): check_ahead_behind(), check_dirty(), discover_repos(), expand_roots(), expand_roots_globs_single_trailing_star(), expand_roots_skips_unreadable_glob_parent_without_panicking(), expand_roots_uses_literal_path_without_trailing_star(), GitAdapter (+14 more)
|
||||||
|
|
||||||
|
### Community 8 - "Integration Tests"
|
||||||
|
Cohesion: 0.24
|
||||||
|
Nodes (30): daemon_survives_repeated_reloads_and_pipeline_resumes(), emit_with_app_source_rejects_wrong_namespace(), emit_with_internal_source_is_rejected(), emit_with_known_app_source_routes_through_normalizer(), emit_with_unregistered_app_source_is_rejected(), emit_without_event_errors(), event_stream_filter_excludes_non_matching_events(), events_replay_returns_buffered_events() (+22 more)
|
||||||
|
|
||||||
|
### Community 9 - "State Engine"
|
||||||
|
Cohesion: 0.12
|
||||||
|
Nodes (19): apply_device_change(), apply_event_to_state(), device_connect_adds_device_with_all_fields(), device_connect_is_idempotent_for_same_id(), device_disconnect_of_unknown_id_is_noop(), device_disconnect_removes_matching_id(), ev(), monitor_connect_adds_new_monitor() (+11 more)
|
||||||
|
|
||||||
|
### Community 10 - "Module Management"
|
||||||
|
Cohesion: 0.14
|
||||||
|
Nodes (24): copy_dir(), install_from_local(), list_modules(), ModuleManifest, modules_dir(), parse_source(), read_manifest_file(), read_module_manifest() (+16 more)
|
||||||
|
|
||||||
|
### Community 11 - "Systemd Adapter"
|
||||||
|
Cohesion: 0.12
|
||||||
|
Nodes (17): active_state_to_kind(), failure_result(), get_unit_path(), handle_message(), is_failed_transition(), query_active_state(), Connection, HashMap (+9 more)
|
||||||
|
|
||||||
|
### Community 12 - "Git Hooks"
|
||||||
|
Cohesion: 0.15
|
||||||
|
Nodes (24): all_hook_scripts_exit_0_unconditionally(), all_hook_scripts_start_with_shebang_and_marker(), branch_changed_emit_line(), commit_created_emit_line(), emit_line_for(), git_dir(), hook_script(), hook_script_rejects_unknown_name() (+16 more)
|
||||||
|
|
||||||
|
### Community 13 - "CLI Core"
|
||||||
|
Cohesion: 0.22
|
||||||
|
Nodes (27): Cli, Commands, config_directory(), daemon_socket_path(), format_timestamp(), handle_modules_cmd(), HooksCommand, install_module() (+19 more)
|
||||||
|
|
||||||
|
### Community 14 - "Type Definitions"
|
||||||
|
Cohesion: 0.15
|
||||||
|
Nodes (23): Device, DeviceRule, DeviceTopology, InterfaceState, MatchCondition, ModuleStatus, Monitor, NetworkState (+15 more)
|
||||||
|
|
||||||
|
### Community 15 - "Podman Adapter"
|
||||||
|
Cohesion: 0.15
|
||||||
|
Nodes (17): container_event(), ignores_remove_event(), ignores_stop_event_to_avoid_double_emit_with_died(), ignores_unknown_action(), map_podman_event(), maps_died_event(), maps_health_status_event(), maps_start_event() (+9 more)
|
||||||
|
|
||||||
|
### Community 16 - "Event Routing"
|
||||||
|
Cohesion: 0.13
|
||||||
|
Nodes (10): condition_matches(), resolve_device(), Option, Result, String, Value, Vec, StateHandle (+2 more)
|
||||||
|
|
||||||
|
### Community 17 - "Udev Adapter"
|
||||||
|
Cohesion: 0.23
|
||||||
|
Nodes (14): build_event(), enumerate_with_udev(), prop_bool(), prop_str(), Option, Result, Self, Sender (+6 more)
|
||||||
|
|
||||||
|
### Community 18 - "Shell Hooks"
|
||||||
|
Cohesion: 0.18
|
||||||
|
Nodes (11): hook_scripts_background_every_emit_call(), hooks_dir(), install_shell(), join_line_continuations(), Option, PathBuf, Result, String (+3 more)
|
||||||
|
|
||||||
|
### Community 19 - "Bluetooth Adapter"
|
||||||
|
Cohesion: 0.15
|
||||||
|
Nodes (10): address_from_path(), BluetoothAdapter, parse_bluetooth_message(), Message, Option, Result, Self, Sender (+2 more)
|
||||||
|
|
||||||
|
### Community 20 - "Subscription System"
|
||||||
|
Cohesion: 0.29
|
||||||
|
Nodes (13): HashMap, String, Vec, Subscription, SubscriptionId, SubscriptionTable, table_add_assigns_provided_id_and_finds_match(), table_clear_removes_all() (+5 more)
|
||||||
|
|
||||||
|
### Community 22 - "Event Dispatch"
|
||||||
|
Cohesion: 0.27
|
||||||
|
Nodes (12): dispatch_event(), handle_command(), Arc, AtomicU64, Receiver, RwLock, Self, Sender (+4 more)
|
||||||
|
|
||||||
|
### Community 23 - "Network RTNetlink"
|
||||||
|
Cohesion: 0.19
|
||||||
|
Nodes (9): Adapter, ip_from_bytes(), Option, Result, Self, Sender, String, RtnetlinkAdapter (+1 more)
|
||||||
|
|
||||||
|
### Community 24 - "Network Adapter"
|
||||||
|
Cohesion: 0.27
|
||||||
|
Nodes (9): has_default_route(), network_raw_event(), NetworkAdapter, NetworkSnapshot, read_network_state(), BTreeMap, Result, Sender (+1 more)
|
||||||
|
|
||||||
|
### Community 25 - "Power Management"
|
||||||
|
Cohesion: 0.26
|
||||||
|
Nodes (8): power_raw_event(), PowerAdapter, PowerSnapshot, read_power_state(), Option, Result, Self, Sender
|
||||||
|
|
||||||
|
### Community 26 - "Hyprland Integration"
|
||||||
|
Cohesion: 0.29
|
||||||
|
Nodes (7): hyprland_event_socket(), HyprlandAdapter, parse_hyprland_line(), PathBuf, Result, Sender, String
|
||||||
|
|
||||||
|
### Community 27 - "UPower Integration"
|
||||||
|
Cohesion: 0.27
|
||||||
|
Nodes (6): parse_upower_message(), Message, Result, Self, Sender, UPowerAdapter
|
||||||
|
|
||||||
|
### Community 28 - "CI/CD Workflows"
|
||||||
|
Cohesion: 0.25
|
||||||
|
Nodes (8): main Branch, dev-release.yml Workflow, rc-release.yml Workflow, release.yml Workflow, dl.breadway.dev Distribution, beta Release Track, dev Release Track, stable Release Track
|
||||||
|
|
||||||
|
### Community 29 - "Git Widget"
|
||||||
|
Cohesion: 0.62
|
||||||
|
Nodes (6): focused_tab_cwd(), git_info(), M.on_load(), shell_quote(), update(), widget_root()
|
||||||
|
|
||||||
|
### Community 30 - "Emit CLI Tool"
|
||||||
|
Cohesion: 0.40
|
||||||
|
Nodes (5): main(), parse_args(), Option, String, UnixStream
|
||||||
|
|
||||||
|
### Community 31 - "Shared Library Init"
|
||||||
|
Cohesion: 0.50
|
||||||
|
Nodes (3): main(), Result, Sync
|
||||||
|
|
||||||
|
### Community 32 - "Active Window Widget"
|
||||||
|
Cohesion: 0.83
|
||||||
|
Nodes (3): label_for(), M.on_load(), widget_root()
|
||||||
|
|
||||||
|
### Community 33 - "CPU Temp Widget"
|
||||||
|
Cohesion: 0.83
|
||||||
|
Nodes (3): M.on_load(), read_temp_c(), widget_root()
|
||||||
|
|
||||||
|
### Community 34 - "Focus Mode Widget"
|
||||||
|
Cohesion: 1.00
|
||||||
|
Nodes (3): is_focused(), M.on_load(), widget_root()
|
||||||
|
|
||||||
|
### Community 35 - "Workflow Status Widget"
|
||||||
|
Cohesion: 0.83
|
||||||
|
Nodes (3): M.on_load(), most_relevant(), widget_update()
|
||||||
|
|
||||||
|
### Community 36 - "Widget API Documentation"
|
||||||
|
Cohesion: 0.67
|
||||||
|
Nodes (3): bread.widget API, CPU Temperature Widget Example, Live Widget Update Pattern
|
||||||
|
|
||||||
|
## Knowledge Gaps
|
||||||
|
- **44 isolated node(s):** `install.sh script`, `Git Adapter`, `Filesystem Adapter`, `Systemd Adapter`, `Podman Adapter` (+39 more)
|
||||||
|
These have ≤1 connection - possible missing edges or undocumented components.
|
||||||
|
- **23 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
|
||||||
|
|
||||||
|
## Suggested Questions
|
||||||
|
_Questions this graph is uniquely positioned to answer:_
|
||||||
|
|
||||||
|
- **Why does `Adapter` connect `Network RTNetlink` to `App Classification`, `Filesystem Adapter`, `Git State Tracking`, `Systemd Adapter`, `Podman Adapter`, `Udev Adapter`, `Bluetooth Adapter`, `Network Adapter`, `Power Management`, `Hyprland Integration`, `UPower Integration`, `Shared Library Init`?**
|
||||||
|
_High betweenness centrality (0.137) - this node is a cross-community bridge._
|
||||||
|
- **Why does `RawEvent` connect `Adapter Framework` to `App Classification`, `Filesystem Adapter`, `Git State Tracking`, `Systemd Adapter`, `Podman Adapter`, `Udev Adapter`, `Bluetooth Adapter`, `Network RTNetlink`, `Network Adapter`, `Power Management`, `Hyprland Integration`, `UPower Integration`?**
|
||||||
|
_High betweenness centrality (0.122) - this node is a cross-community bridge._
|
||||||
|
- **Why does `Config` connect `Adapter Configuration` to `Lua Runtime Core`, `App Classification`?**
|
||||||
|
_High betweenness centrality (0.076) - this node is a cross-community bridge._
|
||||||
|
- **What connects `install.sh script`, `Git Adapter`, `Filesystem Adapter` to the rest of the system?**
|
||||||
|
_44 weakly-connected nodes found - possible documentation gaps or missing edges._
|
||||||
|
- **Should `Lua Runtime Core` be split into smaller, more focused modules?**
|
||||||
|
_Cohesion score 0.061946902654867256 - nodes in this community are weakly interconnected._
|
||||||
|
- **Should `Adapter Framework` be split into smaller, more focused modules?**
|
||||||
|
_Cohesion score 0.0727036676403765 - nodes in this community are weakly interconnected._
|
||||||
|
- **Should `Adapter Configuration` be split into smaller, more focused modules?**
|
||||||
|
_Cohesion score 0.0741745816372682 - nodes in this community are weakly interconnected._
|
||||||
1
graphify-out/cache/last_query_stamp
vendored
Normal file
1
graphify-out/cache/last_query_stamp
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
1785892770.494006
|
||||||
2
graphify-out/cache/stat-index.json
vendored
2
graphify-out/cache/stat-index.json
vendored
File diff suppressed because one or more lines are too long
18
graphify-out/cost.json
Normal file
18
graphify-out/cost.json
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"runs": [
|
||||||
|
{
|
||||||
|
"date": "2026-08-04T09:09:09.071813+00:00",
|
||||||
|
"input_tokens": 0,
|
||||||
|
"output_tokens": 0,
|
||||||
|
"files": 55
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-08-04T09:28:29.057021+00:00",
|
||||||
|
"input_tokens": 72759,
|
||||||
|
"output_tokens": 0,
|
||||||
|
"files": 55
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"total_input_tokens": 72759,
|
||||||
|
"total_output_tokens": 0
|
||||||
|
}
|
||||||
320
graphify-out/graph.html
Normal file
320
graphify-out/graph.html
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load diff
252
graphify-out/manifest.json
Normal file
252
graphify-out/manifest.json
Normal file
|
|
@ -0,0 +1,252 @@
|
||||||
|
{
|
||||||
|
"bread-cli/src/hooks_git.rs": {
|
||||||
|
"mtime": 1784781158.0572724,
|
||||||
|
"ast_hash": "7a29b5d5d90170f0aef9cececc7d8656",
|
||||||
|
"semantic_hash": "7a29b5d5d90170f0aef9cececc7d8656"
|
||||||
|
},
|
||||||
|
"bread-cli/src/hooks_shell.rs": {
|
||||||
|
"mtime": 1784781158.0582726,
|
||||||
|
"ast_hash": "c5d5b8922fcff79954ddb00496721603",
|
||||||
|
"semantic_hash": "c5d5b8922fcff79954ddb00496721603"
|
||||||
|
},
|
||||||
|
"bread-cli/src/lib.rs": {
|
||||||
|
"mtime": 1778512393.4941568,
|
||||||
|
"ast_hash": "d1bf6e1c239498521c42418f672bc400",
|
||||||
|
"semantic_hash": "d1bf6e1c239498521c42418f672bc400"
|
||||||
|
},
|
||||||
|
"bread-cli/src/main.rs": {
|
||||||
|
"mtime": 1784781158.0592725,
|
||||||
|
"ast_hash": "db407455fee59858b369f8b8955de3d7",
|
||||||
|
"semantic_hash": "db407455fee59858b369f8b8955de3d7"
|
||||||
|
},
|
||||||
|
"bread-cli/src/modules_mgmt.rs": {
|
||||||
|
"mtime": 1784781158.0592725,
|
||||||
|
"ast_hash": "ecef9a05ab9c0396ed7a27404b46334d",
|
||||||
|
"semantic_hash": "ecef9a05ab9c0396ed7a27404b46334d"
|
||||||
|
},
|
||||||
|
"bread-cli/tests/modules.rs": {
|
||||||
|
"mtime": 1784781158.0602725,
|
||||||
|
"ast_hash": "84fca8f87dc915b1cb523f8199e78521",
|
||||||
|
"semantic_hash": "84fca8f87dc915b1cb523f8199e78521"
|
||||||
|
},
|
||||||
|
"bread-emit/src/main.rs": {
|
||||||
|
"mtime": 1784781158.0616376,
|
||||||
|
"ast_hash": "350cefbf697cfd93f7df7b7bcc45a101",
|
||||||
|
"semantic_hash": "350cefbf697cfd93f7df7b7bcc45a101"
|
||||||
|
},
|
||||||
|
"bread-shared/src/apps.rs": {
|
||||||
|
"mtime": 1785479966.7981513,
|
||||||
|
"ast_hash": "78da874557a45d9b06a9d0622c72dc5a",
|
||||||
|
"semantic_hash": "78da874557a45d9b06a9d0622c72dc5a"
|
||||||
|
},
|
||||||
|
"bread-shared/src/glob.rs": {
|
||||||
|
"mtime": 1784781158.0616376,
|
||||||
|
"ast_hash": "0594a313cb1909d1cca5fd5b8f241b68",
|
||||||
|
"semantic_hash": "0594a313cb1909d1cca5fd5b8f241b68"
|
||||||
|
},
|
||||||
|
"bread-shared/src/lib.rs": {
|
||||||
|
"mtime": 1784781173.9236407,
|
||||||
|
"ast_hash": "8fabca4623d00ddfc131dea8d8c207c1",
|
||||||
|
"semantic_hash": "8fabca4623d00ddfc131dea8d8c207c1"
|
||||||
|
},
|
||||||
|
"bread-shared/src/widget.rs": {
|
||||||
|
"mtime": 1784781173.9236407,
|
||||||
|
"ast_hash": "33272eb38c7fffbfa180cef7c5a286fc",
|
||||||
|
"semantic_hash": "33272eb38c7fffbfa180cef7c5a286fc"
|
||||||
|
},
|
||||||
|
"breadd/src/adapters/bluetooth.rs": {
|
||||||
|
"mtime": 1778843727.5135255,
|
||||||
|
"ast_hash": "4d1df67347d5b7c9cdbcb12921a6ae28",
|
||||||
|
"semantic_hash": "4d1df67347d5b7c9cdbcb12921a6ae28"
|
||||||
|
},
|
||||||
|
"breadd/src/adapters/filesystem.rs": {
|
||||||
|
"mtime": 1784781158.0616376,
|
||||||
|
"ast_hash": "8ec9dcd8de13f30922cfbe9b4a3fff56",
|
||||||
|
"semantic_hash": "8ec9dcd8de13f30922cfbe9b4a3fff56"
|
||||||
|
},
|
||||||
|
"breadd/src/adapters/git.rs": {
|
||||||
|
"mtime": 1784781158.0616376,
|
||||||
|
"ast_hash": "6e6ff6ca318e28cd94690c30d41b520b",
|
||||||
|
"semantic_hash": "6e6ff6ca318e28cd94690c30d41b520b"
|
||||||
|
},
|
||||||
|
"breadd/src/adapters/hyprland.rs": {
|
||||||
|
"mtime": 1784774788.7034824,
|
||||||
|
"ast_hash": "71537dbd86b413d94476f8022054f1f4",
|
||||||
|
"semantic_hash": "71537dbd86b413d94476f8022054f1f4"
|
||||||
|
},
|
||||||
|
"breadd/src/adapters/mod.rs": {
|
||||||
|
"mtime": 1784781158.0616376,
|
||||||
|
"ast_hash": "63885887c2fc3ea2314d7fe095e5df61",
|
||||||
|
"semantic_hash": "63885887c2fc3ea2314d7fe095e5df61"
|
||||||
|
},
|
||||||
|
"breadd/src/adapters/network.rs": {
|
||||||
|
"mtime": 1778470615.8460202,
|
||||||
|
"ast_hash": "8706dc546b7e08d5aa084ca58c48559c",
|
||||||
|
"semantic_hash": "8706dc546b7e08d5aa084ca58c48559c"
|
||||||
|
},
|
||||||
|
"breadd/src/adapters/network_rtnetlink.rs": {
|
||||||
|
"mtime": 1784781158.0616376,
|
||||||
|
"ast_hash": "0c9d0bb2693bc46b11807f6b8ebb7c4c",
|
||||||
|
"semantic_hash": "0c9d0bb2693bc46b11807f6b8ebb7c4c"
|
||||||
|
},
|
||||||
|
"breadd/src/adapters/podman.rs": {
|
||||||
|
"mtime": 1784781158.0622723,
|
||||||
|
"ast_hash": "97c08551c0fe53b0a5888d98730d35db",
|
||||||
|
"semantic_hash": "97c08551c0fe53b0a5888d98730d35db"
|
||||||
|
},
|
||||||
|
"breadd/src/adapters/power.rs": {
|
||||||
|
"mtime": 1778470615.838569,
|
||||||
|
"ast_hash": "987d202ec0d30ec26b1d747a6e320ed7",
|
||||||
|
"semantic_hash": "987d202ec0d30ec26b1d747a6e320ed7"
|
||||||
|
},
|
||||||
|
"breadd/src/adapters/power_upower.rs": {
|
||||||
|
"mtime": 1784781158.0622723,
|
||||||
|
"ast_hash": "fc0a36ca76d340c8be77644f63e462bf",
|
||||||
|
"semantic_hash": "fc0a36ca76d340c8be77644f63e462bf"
|
||||||
|
},
|
||||||
|
"breadd/src/adapters/systemd.rs": {
|
||||||
|
"mtime": 1784781158.0622723,
|
||||||
|
"ast_hash": "b3884dbecd39acc38abdf67589a8b954",
|
||||||
|
"semantic_hash": "b3884dbecd39acc38abdf67589a8b954"
|
||||||
|
},
|
||||||
|
"breadd/src/adapters/udev.rs": {
|
||||||
|
"mtime": 1778680581.3648126,
|
||||||
|
"ast_hash": "653a424baee8c436b2adb608c92c9fd2",
|
||||||
|
"semantic_hash": "653a424baee8c436b2adb608c92c9fd2"
|
||||||
|
},
|
||||||
|
"breadd/src/core/config.rs": {
|
||||||
|
"mtime": 1784781158.0632722,
|
||||||
|
"ast_hash": "0bc6dd90a2398b22f5fdbf1d647b4c7d",
|
||||||
|
"semantic_hash": "0bc6dd90a2398b22f5fdbf1d647b4c7d"
|
||||||
|
},
|
||||||
|
"breadd/src/core/mod.rs": {
|
||||||
|
"mtime": 1778471738.0735896,
|
||||||
|
"ast_hash": "3df83a958dd6ee5d09712b7cc03e15c9",
|
||||||
|
"semantic_hash": "3df83a958dd6ee5d09712b7cc03e15c9"
|
||||||
|
},
|
||||||
|
"breadd/src/core/normalizer.rs": {
|
||||||
|
"mtime": 1784781158.0632722,
|
||||||
|
"ast_hash": "5e918ed12395767b6d0c315d804f1215",
|
||||||
|
"semantic_hash": "5e918ed12395767b6d0c315d804f1215"
|
||||||
|
},
|
||||||
|
"breadd/src/core/state_engine.rs": {
|
||||||
|
"mtime": 1784781173.9246407,
|
||||||
|
"ast_hash": "162df9607c8a733a7060bb732fdcf783",
|
||||||
|
"semantic_hash": "162df9607c8a733a7060bb732fdcf783"
|
||||||
|
},
|
||||||
|
"breadd/src/core/subscriptions.rs": {
|
||||||
|
"mtime": 1784781158.0632722,
|
||||||
|
"ast_hash": "8735d4717b74523c787dab9ea2b0bbd8",
|
||||||
|
"semantic_hash": "8735d4717b74523c787dab9ea2b0bbd8"
|
||||||
|
},
|
||||||
|
"breadd/src/core/supervisor.rs": {
|
||||||
|
"mtime": 1778680581.3778126,
|
||||||
|
"ast_hash": "403f7ba1807c71f9b89d81bfeff2681a",
|
||||||
|
"semantic_hash": "403f7ba1807c71f9b89d81bfeff2681a"
|
||||||
|
},
|
||||||
|
"breadd/src/core/types.rs": {
|
||||||
|
"mtime": 1784781173.9246407,
|
||||||
|
"ast_hash": "830da3a3b75e0cad06f07f971950bbbb",
|
||||||
|
"semantic_hash": "830da3a3b75e0cad06f07f971950bbbb"
|
||||||
|
},
|
||||||
|
"breadd/src/ipc/mod.rs": {
|
||||||
|
"mtime": 1784781173.9246407,
|
||||||
|
"ast_hash": "c26947d0a253ab5bec356049bb63d7e5",
|
||||||
|
"semantic_hash": "c26947d0a253ab5bec356049bb63d7e5"
|
||||||
|
},
|
||||||
|
"breadd/src/lua/mod.rs": {
|
||||||
|
"mtime": 1784781173.9246407,
|
||||||
|
"ast_hash": "6816dd3c14657467a4e537328d6edb59",
|
||||||
|
"semantic_hash": "6816dd3c14657467a4e537328d6edb59"
|
||||||
|
},
|
||||||
|
"breadd/src/main.rs": {
|
||||||
|
"mtime": 1784781158.0642722,
|
||||||
|
"ast_hash": "b59d4e025c652b074a87638d99823418",
|
||||||
|
"semantic_hash": "b59d4e025c652b074a87638d99823418"
|
||||||
|
},
|
||||||
|
"breadd/tests/ipc_integration.rs": {
|
||||||
|
"mtime": 1784781158.0642722,
|
||||||
|
"ast_hash": "116f390ea369b67ddefa95b8519de3b7",
|
||||||
|
"semantic_hash": "116f390ea369b67ddefa95b8519de3b7"
|
||||||
|
},
|
||||||
|
"examples/modules/active-window-widget.lua": {
|
||||||
|
"mtime": 1784781173.9256406,
|
||||||
|
"ast_hash": "a5f6fb2c54775a49ddaf29674f86571d",
|
||||||
|
"semantic_hash": "a5f6fb2c54775a49ddaf29674f86571d"
|
||||||
|
},
|
||||||
|
"examples/modules/bluetooth-toggle-widget.lua": {
|
||||||
|
"mtime": 1784781173.9256406,
|
||||||
|
"ast_hash": "c8529dc45862adf4f63db48674a28277",
|
||||||
|
"semantic_hash": "c8529dc45862adf4f63db48674a28277"
|
||||||
|
},
|
||||||
|
"examples/modules/cpu-temp-widget.lua": {
|
||||||
|
"mtime": 1784781173.9256406,
|
||||||
|
"ast_hash": "c214e573fa1338b9e5e56ce38a1a36e3",
|
||||||
|
"semantic_hash": "c214e573fa1338b9e5e56ce38a1a36e3"
|
||||||
|
},
|
||||||
|
"examples/modules/dock-monitors.lua": {
|
||||||
|
"mtime": 1784781158.0663679,
|
||||||
|
"ast_hash": "4abe51f19614d2bf117ac35e95324801",
|
||||||
|
"semantic_hash": "4abe51f19614d2bf117ac35e95324801"
|
||||||
|
},
|
||||||
|
"examples/modules/dock-workflow.lua": {
|
||||||
|
"mtime": 1784781158.0663679,
|
||||||
|
"ast_hash": "7ea9293195fdcb839acaa52bc0d040b3",
|
||||||
|
"semantic_hash": "7ea9293195fdcb839acaa52bc0d040b3"
|
||||||
|
},
|
||||||
|
"examples/modules/focus-mode-widget.lua": {
|
||||||
|
"mtime": 1784781173.9256406,
|
||||||
|
"ast_hash": "f62c366c2c85cfbe59eef663fc607230",
|
||||||
|
"semantic_hash": "f62c366c2c85cfbe59eef663fc607230"
|
||||||
|
},
|
||||||
|
"examples/modules/git-branch-widget.lua": {
|
||||||
|
"mtime": 1784781173.9256406,
|
||||||
|
"ast_hash": "25ae6c6190547d7ca7ad649bc288eac1",
|
||||||
|
"semantic_hash": "25ae6c6190547d7ca7ad649bc288eac1"
|
||||||
|
},
|
||||||
|
"examples/modules/low-battery-warning.lua": {
|
||||||
|
"mtime": 1784781158.0663679,
|
||||||
|
"ast_hash": "e0ba79860562fc36fa8cb183bc576fb7",
|
||||||
|
"semantic_hash": "e0ba79860562fc36fa8cb183bc576fb7"
|
||||||
|
},
|
||||||
|
"examples/modules/pause-media-on-headphone-unplug.lua": {
|
||||||
|
"mtime": 1784781158.0663679,
|
||||||
|
"ast_hash": "6c4cf82b6963eb93df224bed60d06c2d",
|
||||||
|
"semantic_hash": "6c4cf82b6963eb93df224bed60d06c2d"
|
||||||
|
},
|
||||||
|
"examples/modules/workflow-status-widget.lua": {
|
||||||
|
"mtime": 1784781173.9256406,
|
||||||
|
"ast_hash": "9f913a66a0f8654dadc1c5d6c2be0938",
|
||||||
|
"semantic_hash": "9f913a66a0f8654dadc1c5d6c2be0938"
|
||||||
|
},
|
||||||
|
"scripts/install.sh": {
|
||||||
|
"mtime": 1778679456.2324038,
|
||||||
|
"ast_hash": "c471884651bedb94c2cbceda02dee99c",
|
||||||
|
"semantic_hash": "c471884651bedb94c2cbceda02dee99c"
|
||||||
|
},
|
||||||
|
"CONTRIBUTING.md": {
|
||||||
|
"mtime": 1785467202.8123527,
|
||||||
|
"ast_hash": "83fdc4753fadb0a6caba7d9fa5126055",
|
||||||
|
"semantic_hash": "83fdc4753fadb0a6caba7d9fa5126055"
|
||||||
|
},
|
||||||
|
"Documentation.md": {
|
||||||
|
"mtime": 1784781173.9236407,
|
||||||
|
"ast_hash": "5cbefc87f14fa998b29d8720a2c35ead",
|
||||||
|
"semantic_hash": "5cbefc87f14fa998b29d8720a2c35ead"
|
||||||
|
},
|
||||||
|
"Examples.md": {
|
||||||
|
"mtime": 1784781173.9236407,
|
||||||
|
"ast_hash": "6bcd7a14be53a9f67ef6912b160da8bc",
|
||||||
|
"semantic_hash": "6bcd7a14be53a9f67ef6912b160da8bc"
|
||||||
|
},
|
||||||
|
"README.md": {
|
||||||
|
"mtime": 1784781158.0562725,
|
||||||
|
"ast_hash": "4fb428200bf6ef1aef21552842249237",
|
||||||
|
"semantic_hash": "4fb428200bf6ef1aef21552842249237"
|
||||||
|
},
|
||||||
|
"upgrade.md": {
|
||||||
|
"mtime": 1785826079.9260893,
|
||||||
|
"ast_hash": "d298b8982ab58c0155e8f22b96dd5666",
|
||||||
|
"semantic_hash": "d298b8982ab58c0155e8f22b96dd5666"
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue