Adds a one-time, idempotent startup migration that moves every user Rule
out of the `PromptStore` LMDB database into the new Skills + AGENTS.md
world, in a single pass:
- **Non-Default Rules → global Skills.** Each one becomes
`~/.agents/skills/<slug>/SKILL.md` with `disable-model-invocation:
true`, preserving the original behavior that non-Default Rules were only
ever invoked when the user named them. They're now invokable via
`/skill-name` (and still `@`-mentions).
- **Default Rules → global AGENTS.md.** Each one is appended to
`paths::agents_file()` (e.g. `~/.config/zed/AGENTS.md` on macOS/Linux,
`%APPDATA%\Zed\AGENTS.md` on Windows) under an `## H2` heading
containing the rule's title. Default Rules used to be auto-included in
every conversation; the global AGENTS.md is loaded into the system
prompt of every conversation, so the behavior is preserved.
- **Customized built-in prompts → global AGENTS.md** (currently just the
commit-message prompt). If the user has edited a built-in away from
Zed's shipped `default_content()`, the edited body is appended at the
top of the AGENTS.md block. Uncustomized built-ins (still on the shipped
default) are skipped so we don't pollute AGENTS.md with text the user
never wrote.
The migration is gated on the `skills` feature flag — users without the
flag never have their Rules touched in any way. A single global KVP flag
(`rules_to_skills_migration_done`) short-circuits the migration on
subsequent launches, so it runs at most once per machine even across
release channels. A process-lifetime `AtomicBool` guard additionally
prevents racing duplicate spawns when the underlying `cx.on_flags_ready`
callback fires multiple times at startup.
Migration is intentionally non-destructive: rule rows in the LMDB
database stay in place. Users can still see and edit them through the
existing UI, and a downgrade to a Zed build without skills support won't
lose anything.
Slug generation (`agent_skills::slugify_skill_name`) lowercases ASCII
letters, turns spaces into dashes, and drops every other
non-alphanumeric character entirely — so `foo!bar` becomes `foobar`, not
`foo-bar`. `&` is special-cased to become `and` (so `rock&roll` →
`rock-and-roll`). Slug collisions and pre-existing skill directories are
handled by appending `-2`, `-3`, etc.
A title-bar onboarding banner ("Skills have replaced Rules") surfaces
for every user on the `skills` feature flag. Clicking it opens a small
`AlertModal`-based explainer that summarizes the two destinations and
points users at the new `/skill-name` slash command (and notes that
`@`-mentions still work).
Closes AI-227
Closes AI-232
Release Notes:
- N/A
148 lines
4.3 KiB
TOML
148 lines
4.3 KiB
TOML
[package]
|
|
name = "agent_ui"
|
|
version = "0.1.0"
|
|
edition.workspace = true
|
|
publish.workspace = true
|
|
license = "GPL-3.0-or-later"
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[lib]
|
|
path = "src/agent_ui.rs"
|
|
doctest = false
|
|
|
|
[features]
|
|
test-support = [
|
|
"acp_thread/test-support",
|
|
"eval_utils",
|
|
"gpui/test-support",
|
|
"language/test-support",
|
|
"reqwest_client",
|
|
"workspace/test-support",
|
|
"agent/test-support",
|
|
]
|
|
audio = ["dep:audio"]
|
|
unit-eval = []
|
|
|
|
[dependencies]
|
|
acp_thread.workspace = true
|
|
action_log.workspace = true
|
|
agent-client-protocol.workspace = true
|
|
agent.workspace = true
|
|
agent_skills.workspace = true
|
|
async-channel.workspace = true
|
|
agent_servers.workspace = true
|
|
agent_settings.workspace = true
|
|
ai_onboarding.workspace = true
|
|
anyhow.workspace = true
|
|
heapless.workspace = true
|
|
audio = { workspace = true, optional = true }
|
|
base64.workspace = true
|
|
buffer_diff.workspace = true
|
|
chrono.workspace = true
|
|
client.workspace = true
|
|
cloud_api_types.workspace = true
|
|
collections.workspace = true
|
|
command_palette_hooks.workspace = true
|
|
component.workspace = true
|
|
context_server.workspace = true
|
|
db.workspace = true
|
|
editor.workspace = true
|
|
eval_utils = { workspace = true, optional = true }
|
|
extension.workspace = true
|
|
extension_host.workspace = true
|
|
feature_flags.workspace = true
|
|
file_icons.workspace = true
|
|
fs.workspace = true
|
|
futures.workspace = true
|
|
git.workspace = true
|
|
fuzzy.workspace = true
|
|
gpui.workspace = true
|
|
gpui_tokio.workspace = true
|
|
html_to_markdown.workspace = true
|
|
http_client.workspace = true
|
|
indoc.workspace = true
|
|
itertools.workspace = true
|
|
jsonschema.workspace = true
|
|
language.workspace = true
|
|
language_model.workspace = true
|
|
language_models.workspace = true
|
|
log.workspace = true
|
|
lsp.workspace = true
|
|
markdown.workspace = true
|
|
menu.workspace = true
|
|
multi_buffer.workspace = true
|
|
notifications.workspace = true
|
|
ordered-float.workspace = true
|
|
parking_lot.workspace = true
|
|
paths.workspace = true
|
|
picker.workspace = true
|
|
platform_title_bar.workspace = true
|
|
postage.workspace = true
|
|
project.workspace = true
|
|
prompt_store.workspace = true
|
|
proto.workspace = true
|
|
rand.workspace = true
|
|
release_channel.workspace = true
|
|
remote.workspace = true
|
|
remote_connection.workspace = true
|
|
rope.workspace = true
|
|
rules_library.workspace = true
|
|
schemars.workspace = true
|
|
serde.workspace = true
|
|
serde_json.workspace = true
|
|
serde_json_lenient.workspace = true
|
|
settings.workspace = true
|
|
streaming_diff.workspace = true
|
|
task.workspace = true
|
|
telemetry.workspace = true
|
|
terminal.workspace = true
|
|
terminal_view.workspace = true
|
|
text.workspace = true
|
|
theme.workspace = true
|
|
theme_settings.workspace = true
|
|
time.workspace = true
|
|
ui.workspace = true
|
|
ui_input.workspace = true
|
|
url.workspace = true
|
|
util.workspace = true
|
|
uuid.workspace = true
|
|
watch.workspace = true
|
|
workspace.workspace = true
|
|
zed_actions.workspace = true
|
|
image.workspace = true
|
|
reqwest_client = { workspace = true, optional = true }
|
|
|
|
[dev-dependencies]
|
|
acp_thread = { workspace = true, features = ["test-support"] }
|
|
agent = { workspace = true, features = ["test-support"] }
|
|
agent_servers = { workspace = true, features = ["test-support"] }
|
|
buffer_diff = { workspace = true, features = ["test-support"] }
|
|
client = { workspace = true, features = ["test-support"] }
|
|
clock = { workspace = true, features = ["test-support"] }
|
|
db = { workspace = true, features = ["test-support"] }
|
|
editor = { workspace = true, features = ["test-support"] }
|
|
eval_utils.workspace = true
|
|
git_ui.workspace = true
|
|
gpui = { workspace = true, "features" = ["test-support"] }
|
|
http_client = { workspace = true, features = ["test-support"] }
|
|
indoc.workspace = true
|
|
language = { workspace = true, "features" = ["test-support"] }
|
|
languages = { workspace = true, features = ["test-support"] }
|
|
language_model = { workspace = true, "features" = ["test-support"] }
|
|
node_runtime = { workspace = true, features = ["test-support"] }
|
|
pretty_assertions.workspace = true
|
|
project = { workspace = true, features = ["test-support"] }
|
|
remote = { workspace = true, features = ["test-support"] }
|
|
remote_connection = { workspace = true, features = ["test-support"] }
|
|
remote_server = { workspace = true, features = ["test-support"] }
|
|
|
|
search = { workspace = true, features = ["test-support"] }
|
|
semver.workspace = true
|
|
reqwest_client.workspace = true
|
|
tempfile.workspace = true
|
|
vim.workspace = true
|
|
tree-sitter-md.workspace = true
|
|
unindent.workspace = true
|