Payload
{
"ref": "refs/heads/jp/refactor-the-refactor",
"before": "972e9da181d8a732aa52dc35355e626a02b66c98",
"after": "ee64b29fa21dfd1ee4411ab7d937e4d815a1a2ad",
"repository": {
"id": 1209959628,
"node_id": "R_kgDOSB6EzA",
"name": "nixmac",
"full_name": "darkmatter/nixmac",
"private": false,
"owner": {
"name": "darkmatter",
"email": "hello@dm.sh",
"login": "darkmatter",
"id": 17834193,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjE3ODM0MTkz",
"avatar_url": "https://avatars.githubusercontent.com/u/17834193?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/darkmatter",
"html_url": "https://github.com/darkmatter",
"followers_url": "https://api.github.com/users/darkmatter/followers",
"following_url": "https://api.github.com/users/darkmatter/following{/other_user}",
"gists_url": "https://api.github.com/users/darkmatter/gists{/gist_id}",
"starred_url": "https://api.github.com/users/darkmatter/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/darkmatter/subscriptions",
"organizations_url": "https://api.github.com/users/darkmatter/orgs",
"repos_url": "https://api.github.com/users/darkmatter/repos",
"events_url": "https://api.github.com/users/darkmatter/events{/privacy}",
"received_events_url": "https://api.github.com/users/darkmatter/received_events",
"type": "Organization",
"user_view_type": "public",
"site_admin": false
},
"html_url": "https://github.com/darkmatter/nixmac",
"description": "Home manager and nix-darwin that understands plain English",
"fork": false,
"url": "https://api.github.com/repos/darkmatter/nixmac",
"forks_url": "https://api.github.com/repos/darkmatter/nixmac/forks",
"keys_url": "https://api.github.com/repos/darkmatter/nixmac/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/darkmatter/nixmac/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/darkmatter/nixmac/teams",
"hooks_url": "https://api.github.com/repos/darkmatter/nixmac/hooks",
"issue_events_url": "https://api.github.com/repos/darkmatter/nixmac/issues/events{/number}",
"events_url": "https://api.github.com/repos/darkmatter/nixmac/events",
"assignees_url": "https://api.github.com/repos/darkmatter/nixmac/assignees{/user}",
"branches_url": "https://api.github.com/repos/darkmatter/nixmac/branches{/branch}",
"tags_url": "https://api.github.com/repos/darkmatter/nixmac/tags",
"blobs_url": "https://api.github.com/repos/darkmatter/nixmac/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/darkmatter/nixmac/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/darkmatter/nixmac/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/darkmatter/nixmac/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/darkmatter/nixmac/statuses/{sha}",
"languages_url": "https://api.github.com/repos/darkmatter/nixmac/languages",
"stargazers_url": "https://api.github.com/repos/darkmatter/nixmac/stargazers",
"contributors_url": "https://api.github.com/repos/darkmatter/nixmac/contributors",
"subscribers_url": "https://api.github.com/repos/darkmatter/nixmac/subscribers",
"subscription_url": "https://api.github.com/repos/darkmatter/nixmac/subscription",
"commits_url": "https://api.github.com/repos/darkmatter/nixmac/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/darkmatter/nixmac/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/darkmatter/nixmac/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/darkmatter/nixmac/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/darkmatter/nixmac/contents/{+path}",
"compare_url": "https://api.github.com/repos/darkmatter/nixmac/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/darkmatter/nixmac/merges",
"archive_url": "https://api.github.com/repos/darkmatter/nixmac/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/darkmatter/nixmac/downloads",
"issues_url": "https://api.github.com/repos/darkmatter/nixmac/issues{/number}",
"pulls_url": "https://api.github.com/repos/darkmatter/nixmac/pulls{/number}",
"milestones_url": "https://api.github.com/repos/darkmatter/nixmac/milestones{/number}",
"notifications_url": "https://api.github.com/repos/darkmatter/nixmac/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/darkmatter/nixmac/labels{/name}",
"releases_url": "https://api.github.com/repos/darkmatter/nixmac/releases{/id}",
"deployments_url": "https://api.github.com/repos/darkmatter/nixmac/deployments",
"created_at": 1776127033,
"updated_at": "2026-06-10T15:32:59Z",
"pushed_at": 1781126146,
"git_url": "git://github.com/darkmatter/nixmac.git",
"ssh_url": "git@github.com:darkmatter/nixmac.git",
"clone_url": "https://github.com/darkmatter/nixmac.git",
"svn_url": "https://github.com/darkmatter/nixmac",
"homepage": "https://nixmac.com",
"size": 681638,
"stargazers_count": 5,
"watchers_count": 5,
"language": "Rust",
"has_issues": true,
"has_projects": false,
"has_downloads": true,
"has_wiki": false,
"has_pages": false,
"has_discussions": false,
"forks_count": 1,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 85,
"license": {
"key": "mit",
"name": "MIT License",
"spdx_id": "MIT",
"url": "https://api.github.com/licenses/mit",
"node_id": "MDc6TGljZW5zZTEz"
},
"allow_forking": true,
"is_template": false,
"web_commit_signoff_required": false,
"has_pull_requests": true,
"pull_request_creation_policy": "all",
"topics": [
"home-manager",
"nix",
"nix-darwin",
"nix-flake",
"opencode"
],
"visibility": "public",
"forks": 1,
"open_issues": 85,
"watchers": 5,
"default_branch": "develop",
"stargazers": 5,
"master_branch": "develop",
"organization": "darkmatter",
"custom_properties": {}
},
"pusher": {
"name": "arximboldi",
"email": "juanpe@sinusoid.es"
},
"forced": false,
"organization": {
"login": "darkmatter",
"id": 17834193,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjE3ODM0MTkz",
"url": "https://api.github.com/orgs/darkmatter",
"repos_url": "https://api.github.com/orgs/darkmatter/repos",
"events_url": "https://api.github.com/orgs/darkmatter/events",
"hooks_url": "https://api.github.com/orgs/darkmatter/hooks",
"issues_url": "https://api.github.com/orgs/darkmatter/issues",
"members_url": "https://api.github.com/orgs/darkmatter/members{/member}",
"public_members_url": "https://api.github.com/orgs/darkmatter/public_members{/member}",
"avatar_url": "https://avatars.githubusercontent.com/u/17834193?v=4",
"description": ""
},
"enterprise": {
"id": 469843,
"slug": "darkmatter",
"name": "darkmatter",
"node_id": "E_kgDOAAcrUw",
"avatar_url": "https://avatars.githubusercontent.com/b/469843?v=4",
"description": "",
"website_url": "darkmatter.io",
"html_url": "https://github.com/enterprises/darkmatter",
"created_at": "2025-09-07T16:01:00Z",
"updated_at": "2026-06-07T16:53:26Z"
},
"sender": {
"login": "arximboldi",
"id": 4521138,
"node_id": "MDQ6VXNlcjQ1MjExMzg=",
"avatar_url": "https://avatars.githubusercontent.com/u/4521138?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/arximboldi",
"html_url": "https://github.com/arximboldi",
"followers_url": "https://api.github.com/users/arximboldi/followers",
"following_url": "https://api.github.com/users/arximboldi/following{/other_user}",
"gists_url": "https://api.github.com/users/arximboldi/gists{/gist_id}",
"starred_url": "https://api.github.com/users/arximboldi/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/arximboldi/subscriptions",
"organizations_url": "https://api.github.com/users/arximboldi/orgs",
"repos_url": "https://api.github.com/users/arximboldi/repos",
"events_url": "https://api.github.com/users/arximboldi/events{/privacy}",
"received_events_url": "https://api.github.com/users/arximboldi/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"installation": {
"id": 131074261,
"node_id": "MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMTMxMDc0MjYx"
},
"created": false,
"deleted": false,
"base_ref": null,
"compare": "https://github.com/darkmatter/nixmac/compare/972e9da181d8...ee64b29fa21d",
"commits": [
{
"id": "6c1d03d38c540e8a530f01b8144fc6e068837558",
"tree_id": "099b0aec98778d56b8997b819cf1da010820beb1",
"distinct": true,
"message": "configurable: replace SliceRegistry with compile-time inventory\n\nDrops the runtime SliceRegistry / RegisteredSliceConfig pair in favor of\ncompile-time registration via the `inventory` crate, addressing B1 from\ndocs/2026-06-03-pr-review-followups.md.\n\nThe derive now emits one `inventory::submit!{ ConfigurableMeta {...} }`\nper #[derive(Configurable)] struct, alongside the existing Wry-specialized\nshim functions. `ConfigurableMeta` lives in the `configurable` crate and\ncarries the same triple as the old RegisteredSliceConfig (name +\nschema_fn + set_field_fn). The `inventory` crate is re-exported from\n`configurable::inventory` so the derive output never needs the consuming\ncrate to add it as a direct dep.\n\n`commands/dev_configs.rs` walks `inventory::iter::<ConfigurableMeta>()`\ninstead of looking up `tauri::State<SliceRegistry>`; a new test confirms\nthe link-time submit actually lands (\"EvolutionLimits is registered via\ninventory\") so a future toolchain regression on linker sections is\ncaught before dev settings silently goes empty.\n\nDeleted:\n- apps/native/src-tauri/src/state/slice/ (whole directory)\n- evolve::config::register_slice_config\n- the app.manage(SliceRegistry::default()) line in main.rs\n- the register_slice_config(...) call in the Tauri setup hook\n- state/mod.rs stops re-exporting the `slice` submodule\n\nmain.rs no longer references EvolutionLimits or any other Configurable\nstruct directly — registration happens entirely through the derive.\n\ncargo test on src-tauri: 377 passed / 2 ignored (1 added, 1 dropped —\nthe SliceRegistry::register round-trip moves with the registry into the\nbit bucket).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"timestamp": "2026-06-10T22:32:52+02:00",
"url": "https://github.com/darkmatter/nixmac/commit/6c1d03d38c540e8a530f01b8144fc6e068837558",
"author": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-10T22:32:52+02:00",
"username": "arximboldi"
},
"committer": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-10T22:32:52+02:00",
"username": "arximboldi"
},
"added": [],
"removed": [
"apps/native/src-tauri/src/state/slice/mod.rs",
"apps/native/src-tauri/src/state/slice/registry.rs"
],
"modified": [
"Cargo.lock",
"apps/native/src-tauri/configurable-derive/src/codegen.rs",
"apps/native/src-tauri/configurable/Cargo.toml",
"apps/native/src-tauri/configurable/src/lib.rs",
"apps/native/src-tauri/src/commands/dev_configs.rs",
"apps/native/src-tauri/src/evolve/config.rs",
"apps/native/src-tauri/src/main.rs",
"apps/native/src-tauri/src/state/mod.rs"
]
},
{
"id": "ee64b29fa21dfd1ee4411ab7d937e4d815a1a2ad",
"tree_id": "f19eadf1572c145b953df8a4b4b7f8952d33da2d",
"distinct": true,
"message": "configurable: split schema from current value\n\nAddresses B3 from docs/2026-06-03-pr-review-followups.md. The schema half\nis now pure static metadata and no longer requires an AppHandle; the\ndynamic half (current store-backed values) is fetched separately and the\ntwo are joined at the IPC boundary.\n\nType changes in the configurable crate:\n - ConfigField is gone. Split into:\n * ConfigFieldSchema { key, label, help, ty, default } — static\n * ConfigFieldValue { key, current } — dynamic\n - ConfigurableSchema.fields: Vec<ConfigFieldSchema> (no `current` field)\n - New ConfigurableSnapshot { schema, values } is what dev_configs_list\n returns to the frontend.\n - ConfigurableMeta gains a `load_value_fn` pointer; `schema_fn` drops\n its AppHandle argument and now returns ConfigurableSchema directly\n (no Result, no app).\n\nDerive macro:\n - schema() generated without an `app` parameter; same value every call.\n - Adds __configurable_load_value_wry that calls Self::load(app) and\n serializes to serde_json::Value for the IPC join.\n\ncommands/dev_configs.rs:\n - dev_configs_list returns Vec<ConfigurableSnapshot>.\n - snapshot_for() joins the static schema with current values by key.\n\nspecta_gen_ts.rs registers the new types; ipc/types.ts regenerated.\n\nFrontend:\n - tauriAPI.devConfigs.list() returns ConfigurableSnapshot[].\n - AutoConfigField now takes `field: ConfigFieldSchema` and a separate\n `current: JsonValue` prop, instead of pulling `current` off the field.\n - Both auto-tuning-section.tsx and tuning-tab.tsx build a per-snapshot\n valuesByKey map and pass each field's current value in.\n - Storybook stories updated to the new snapshot shape.\n\nAcceptance per the followup doc:\n - `EvolutionLimits::schema()` is callable without an AppHandle.\n - Same value every call.\n - IPC payload joins schema and values at the command boundary.\n\ncargo test on src-tauri: 377 passed / 2 ignored.\nbun run test:unit: 119 passed.\nbun run build: passes (tsc + vite).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"timestamp": "2026-06-10T23:10:05+02:00",
"url": "https://github.com/darkmatter/nixmac/commit/ee64b29fa21dfd1ee4411ab7d937e4d815a1a2ad",
"author": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-10T23:10:05+02:00",
"username": "arximboldi"
},
"committer": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-10T23:10:05+02:00",
"username": "arximboldi"
},
"added": [],
"removed": [],
"modified": [
"apps/native/src-tauri/configurable-derive/src/codegen.rs",
"apps/native/src-tauri/configurable-derive/src/fields.rs",
"apps/native/src-tauri/configurable/src/lib.rs",
"apps/native/src-tauri/examples/specta_gen_ts.rs",
"apps/native/src-tauri/src/commands/dev_configs.rs",
"apps/native/src/components/widget/settings/auto-config-field.stories.tsx",
"apps/native/src/components/widget/settings/auto-config-field.tsx",
"apps/native/src/components/widget/settings/auto-tuning-section.stories.tsx",
"apps/native/src/components/widget/settings/auto-tuning-section.tsx",
"apps/native/src/components/widget/settings/tuning-tab.tsx",
"apps/native/src/ipc/api.ts",
"apps/native/src/ipc/types.ts"
]
}
],
"head_commit": {
"id": "ee64b29fa21dfd1ee4411ab7d937e4d815a1a2ad",
"tree_id": "f19eadf1572c145b953df8a4b4b7f8952d33da2d",
"distinct": true,
"message": "configurable: split schema from current value\n\nAddresses B3 from docs/2026-06-03-pr-review-followups.md. The schema half\nis now pure static metadata and no longer requires an AppHandle; the\ndynamic half (current store-backed values) is fetched separately and the\ntwo are joined at the IPC boundary.\n\nType changes in the configurable crate:\n - ConfigField is gone. Split into:\n * ConfigFieldSchema { key, label, help, ty, default } — static\n * ConfigFieldValue { key, current } — dynamic\n - ConfigurableSchema.fields: Vec<ConfigFieldSchema> (no `current` field)\n - New ConfigurableSnapshot { schema, values } is what dev_configs_list\n returns to the frontend.\n - ConfigurableMeta gains a `load_value_fn` pointer; `schema_fn` drops\n its AppHandle argument and now returns ConfigurableSchema directly\n (no Result, no app).\n\nDerive macro:\n - schema() generated without an `app` parameter; same value every call.\n - Adds __configurable_load_value_wry that calls Self::load(app) and\n serializes to serde_json::Value for the IPC join.\n\ncommands/dev_configs.rs:\n - dev_configs_list returns Vec<ConfigurableSnapshot>.\n - snapshot_for() joins the static schema with current values by key.\n\nspecta_gen_ts.rs registers the new types; ipc/types.ts regenerated.\n\nFrontend:\n - tauriAPI.devConfigs.list() returns ConfigurableSnapshot[].\n - AutoConfigField now takes `field: ConfigFieldSchema` and a separate\n `current: JsonValue` prop, instead of pulling `current` off the field.\n - Both auto-tuning-section.tsx and tuning-tab.tsx build a per-snapshot\n valuesByKey map and pass each field's current value in.\n - Storybook stories updated to the new snapshot shape.\n\nAcceptance per the followup doc:\n - `EvolutionLimits::schema()` is callable without an AppHandle.\n - Same value every call.\n - IPC payload joins schema and values at the command boundary.\n\ncargo test on src-tauri: 377 passed / 2 ignored.\nbun run test:unit: 119 passed.\nbun run build: passes (tsc + vite).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"timestamp": "2026-06-10T23:10:05+02:00",
"url": "https://github.com/darkmatter/nixmac/commit/ee64b29fa21dfd1ee4411ab7d937e4d815a1a2ad",
"author": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-10T23:10:05+02:00",
"username": "arximboldi"
},
"committer": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-10T23:10:05+02:00",
"username": "arximboldi"
},
"added": [],
"removed": [],
"modified": [
"apps/native/src-tauri/configurable-derive/src/codegen.rs",
"apps/native/src-tauri/configurable-derive/src/fields.rs",
"apps/native/src-tauri/configurable/src/lib.rs",
"apps/native/src-tauri/examples/specta_gen_ts.rs",
"apps/native/src-tauri/src/commands/dev_configs.rs",
"apps/native/src/components/widget/settings/auto-config-field.stories.tsx",
"apps/native/src/components/widget/settings/auto-config-field.tsx",
"apps/native/src/components/widget/settings/auto-tuning-section.stories.tsx",
"apps/native/src/components/widget/settings/auto-tuning-section.tsx",
"apps/native/src/components/widget/settings/tuning-tab.tsx",
"apps/native/src/ipc/api.ts",
"apps/native/src/ipc/types.ts"
]
}
}