Files
Codewhale/scripts/command-migration-topology.json
Paulo Aboim Pinto 593d7d7171 refactor(FEAT-028): adopt portable config shapes for the complete config group
Reconciled onto current origin/main (39f073346). The config Slash Command Group
no longer depends on App/TUI: every command parses, branches and renders in the
portable group, and the host returns typed facts and operation outcomes.

Carries upstream behavior added since the original base:
- /connect and /disconnect (now portable commands in the group inventory, 19
  registrations);
- /pet style and /pet language (new portable pet appearance controls);
- mode receipts use the localized display name and the Full Access (Work) label;
- legacy sandbox token clearing (LEGACY_SANDBOX_TOKEN_SLOT) instead of Daytona.

Contract: capability bits and facet traits for the group; unified ConfigAction
with portable payload mirrors; ConfigReply with keyed/literal ConfigMessage
(self-recursive, no Box).

Safe rendering: capabilities and required templates are validated before any
effect; prepared rendering substitutes validated templates and never re-translates
after a mutation; a missing capability, invalid replacement contract or
unprepared key fails loudly with no action; the interactive reply renderer shares
the same policy. /settings, the audit and the subagent report return structured
rows the group renders; /workbar surfaces setter errors; /import-claude plans use
the host display projection.

Guards: the migration frontier advances from [config, core] to [core], and the
live-gate expectation moves with it.

CI lane fixes: the portable proof imports, the moved test helper path, the
settings row formatting (to_string instead of a useless format!), the contributor
credit surface, and the preflight large-Err allowance.

Verification: clippy (workspace, all-targets, all-features, -D warnings with the
project's allowances) clean; config-proof PASS (35 portable tests) + 7 negative
controls; migration-manifest tests PASS; boundary guard PASS; 353 config/settings
tests pass; broad commands/app/ui/settings 2796 pass with only the pre-existing
upstream failure tui::ui::tests::persisted_queued_native_skill_is_denied_after_host_withdrawal
(reproduces on clean origin/main); cargo fmt clean.
2026-10-13 19:43:50 +02:00

285 lines
11 KiB
JSON

{
"schema_version": 1,
"topology": {
"utility": {
"kind": "group",
"scope": [
"crates/tui/src/commands/groups/utility/attachment.rs",
"crates/tui/src/commands/groups/utility/automation.rs",
"crates/tui/src/commands/groups/utility/jobs.rs",
"crates/tui/src/commands/groups/utility/mcp.rs",
"crates/tui/src/commands/groups/utility/network.rs",
"crates/tui/src/commands/groups/utility/task.rs",
"crates/tui/src/commands/groups/utility/update.rs"
],
"slices": []
},
"memory": {
"kind": "group",
"scope": [
"crates/tui/src/commands/groups/memory/memory.rs",
"crates/tui/src/commands/groups/memory/note.rs"
],
"slices": []
},
"plugins": {
"kind": "group",
"scope": [
"crates/tui/src/commands/groups/plugins/kimi_import.rs",
"crates/tui/src/commands/groups/plugins/legacy.rs",
"crates/tui/src/commands/groups/plugins/marketplace.rs",
"crates/tui/src/commands/groups/plugins/render.rs"
],
"slices": []
},
"project": {
"kind": "group",
"scope": [
"crates/tui/src/commands/groups/project/goal.rs",
"crates/tui/src/commands/groups/project/init.rs",
"crates/tui/src/commands/groups/project/lsp.rs",
"crates/tui/src/commands/groups/project/share.rs"
],
"slices": []
},
"skills": {
"kind": "group",
"scope": [
"crates/tui/src/commands/groups/skills/restore.rs",
"crates/tui/src/commands/groups/skills/review.rs",
"crates/tui/src/commands/groups/skills/skills.rs"
],
"slices": []
},
"session": {
"kind": "group",
"scope": [
"crates/tui/src/commands/groups/session/branch.rs",
"crates/tui/src/commands/groups/session/compact.rs",
"crates/tui/src/commands/groups/session/export.rs",
"crates/tui/src/commands/groups/session/fork.rs",
"crates/tui/src/commands/groups/session/load.rs",
"crates/tui/src/commands/groups/session/new.rs",
"crates/tui/src/commands/groups/session/purge.rs",
"crates/tui/src/commands/groups/session/relay.rs",
"crates/tui/src/commands/groups/session/remote_control.rs",
"crates/tui/src/commands/groups/session/remote_env.rs",
"crates/tui/src/commands/groups/session/rename.rs",
"crates/tui/src/commands/groups/session/resume.rs",
"crates/tui/src/commands/groups/session/save.rs",
"crates/tui/src/commands/groups/session/session.rs",
"crates/tui/src/commands/groups/session/sessions.rs",
"crates/tui/src/commands/groups/session/structcopy.rs",
"crates/tui/src/commands/groups/session/title.rs",
"crates/tui/src/commands/groups/session/tree.rs"
],
"slices": [
{
"name": "session::lifecycle",
"kind": "slice",
"scope": [
"crates/tui/src/commands/groups/session/branch.rs",
"crates/tui/src/commands/groups/session/compact.rs",
"crates/tui/src/commands/groups/session/fork.rs",
"crates/tui/src/commands/groups/session/load.rs",
"crates/tui/src/commands/groups/session/new.rs",
"crates/tui/src/commands/groups/session/purge.rs",
"crates/tui/src/commands/groups/session/save.rs",
"crates/tui/src/commands/groups/session/session.rs",
"crates/tui/src/commands/groups/session/sessions.rs",
"crates/tui/src/commands/groups/session/tree.rs"
]
},
{
"name": "session::control",
"kind": "slice",
"scope": [
"crates/tui/src/commands/groups/session/relay.rs",
"crates/tui/src/commands/groups/session/remote_control.rs",
"crates/tui/src/commands/groups/session/remote_env.rs",
"crates/tui/src/commands/groups/session/rename.rs",
"crates/tui/src/commands/groups/session/resume.rs",
"crates/tui/src/commands/groups/session/title.rs"
]
},
{
"name": "session::export",
"kind": "slice",
"scope": [
"crates/tui/src/commands/groups/session/export.rs"
]
},
{
"name": "session::structcopy",
"kind": "slice",
"scope": [
"crates/tui/src/commands/groups/session/structcopy.rs"
]
}
]
},
"config": {
"kind": "group",
"scope": [
"crates/tui/src/commands/groups/config/config.rs",
"crates/tui/src/commands/groups/config/permissions.rs",
"crates/tui/src/commands/groups/config/status.rs"
],
"slices": [
{
"name": "config::policy",
"kind": "slice",
"scope": [
"crates/tui/src/commands/groups/config/permissions.rs",
"crates/tui/src/commands/groups/config/status.rs"
]
},
{
"name": "config::main",
"kind": "slice",
"scope": [
"crates/tui/src/commands/groups/config/config.rs"
]
}
]
},
"debug": {
"kind": "group",
"scope": [
"crates/tui/src/commands/groups/debug/balance.rs",
"crates/tui/src/commands/groups/debug/cache.rs",
"crates/tui/src/commands/groups/debug/change.rs",
"crates/tui/src/commands/groups/debug/preview_request.rs",
"crates/tui/src/commands/groups/debug/tokens.rs",
"crates/tui/src/commands/groups/debug/tool_inspection.rs",
"crates/tui/src/commands/groups/debug/undo.rs"
],
"slices": [
{
"name": "debug::diagnostics",
"kind": "slice",
"scope": [
"crates/tui/src/commands/groups/debug/balance.rs",
"crates/tui/src/commands/groups/debug/cache.rs",
"crates/tui/src/commands/groups/debug/preview_request.rs",
"crates/tui/src/commands/groups/debug/tokens.rs",
"crates/tui/src/commands/groups/debug/tool_inspection.rs"
]
},
{
"name": "debug::mutation",
"kind": "slice",
"scope": [
"crates/tui/src/commands/groups/debug/change.rs",
"crates/tui/src/commands/groups/debug/undo.rs"
]
}
]
},
"core": {
"kind": "group",
"scope": [
"crates/tui/src/commands/groups/core/advisor.rs",
"crates/tui/src/commands/groups/core/agent.rs",
"crates/tui/src/commands/groups/core/anchor.rs",
"crates/tui/src/commands/groups/core/clear.rs",
"crates/tui/src/commands/groups/core/constitution.rs",
"crates/tui/src/commands/groups/core/core.rs",
"crates/tui/src/commands/groups/core/effort.rs",
"crates/tui/src/commands/groups/core/exit.rs",
"crates/tui/src/commands/groups/core/feedback.rs",
"crates/tui/src/commands/groups/core/fleet.rs",
"crates/tui/src/commands/groups/core/help.rs",
"crates/tui/src/commands/groups/core/hf.rs",
"crates/tui/src/commands/groups/core/home.rs",
"crates/tui/src/commands/groups/core/hooks.rs",
"crates/tui/src/commands/groups/core/hotbar.rs",
"crates/tui/src/commands/groups/core/lane.rs",
"crates/tui/src/commands/groups/core/links.rs",
"crates/tui/src/commands/groups/core/model.rs",
"crates/tui/src/commands/groups/core/modeldb.rs",
"crates/tui/src/commands/groups/core/models.rs",
"crates/tui/src/commands/groups/core/pin.rs",
"crates/tui/src/commands/groups/core/profile.rs",
"crates/tui/src/commands/groups/core/provider.rs",
"crates/tui/src/commands/groups/core/queue.rs",
"crates/tui/src/commands/groups/core/rlm.rs",
"crates/tui/src/commands/groups/core/setup.rs",
"crates/tui/src/commands/groups/core/stash.rs",
"crates/tui/src/commands/groups/core/subagents.rs",
"crates/tui/src/commands/groups/core/transcript.rs",
"crates/tui/src/commands/groups/core/translate.rs",
"crates/tui/src/commands/groups/core/turn.rs",
"crates/tui/src/commands/groups/core/util.rs",
"crates/tui/src/commands/groups/core/voice.rs",
"crates/tui/src/commands/groups/core/workflow.rs",
"crates/tui/src/commands/groups/core/workspace.rs"
],
"slices": [
{
"name": "core::navigation",
"kind": "slice",
"scope": [
"crates/tui/src/commands/groups/core/anchor.rs",
"crates/tui/src/commands/groups/core/help.rs",
"crates/tui/src/commands/groups/core/home.rs",
"crates/tui/src/commands/groups/core/hotbar.rs",
"crates/tui/src/commands/groups/core/links.rs",
"crates/tui/src/commands/groups/core/transcript.rs",
"crates/tui/src/commands/groups/core/translate.rs",
"crates/tui/src/commands/groups/core/turn.rs",
"crates/tui/src/commands/groups/core/voice.rs",
"crates/tui/src/commands/groups/core/workspace.rs"
]
},
{
"name": "core::model-and-setup",
"kind": "slice",
"scope": [
"crates/tui/src/commands/groups/core/hf.rs",
"crates/tui/src/commands/groups/core/model.rs",
"crates/tui/src/commands/groups/core/modeldb.rs",
"crates/tui/src/commands/groups/core/models.rs",
"crates/tui/src/commands/groups/core/profile.rs",
"crates/tui/src/commands/groups/core/provider.rs",
"crates/tui/src/commands/groups/core/setup.rs"
]
},
{
"name": "core::coordination",
"kind": "slice",
"scope": [
"crates/tui/src/commands/groups/core/agent.rs",
"crates/tui/src/commands/groups/core/fleet.rs",
"crates/tui/src/commands/groups/core/hooks.rs",
"crates/tui/src/commands/groups/core/lane.rs",
"crates/tui/src/commands/groups/core/queue.rs",
"crates/tui/src/commands/groups/core/rlm.rs",
"crates/tui/src/commands/groups/core/subagents.rs",
"crates/tui/src/commands/groups/core/workflow.rs"
]
},
{
"name": "core::policy",
"kind": "slice",
"scope": [
"crates/tui/src/commands/groups/core/advisor.rs",
"crates/tui/src/commands/groups/core/clear.rs",
"crates/tui/src/commands/groups/core/constitution.rs",
"crates/tui/src/commands/groups/core/core.rs",
"crates/tui/src/commands/groups/core/effort.rs",
"crates/tui/src/commands/groups/core/exit.rs",
"crates/tui/src/commands/groups/core/feedback.rs",
"crates/tui/src/commands/groups/core/pin.rs",
"crates/tui/src/commands/groups/core/stash.rs",
"crates/tui/src/commands/groups/core/util.rs"
]
}
]
}
},
"frontier": [
"core"
]
}